Tizen 2.0 Release
authorHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:17:33 +0000 (00:17 +0900)
committerHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:17:33 +0000 (00:17 +0900)
456 files changed:
AUTHORS
COPYING
ChangeLog
INSTALL
Makefile.am
NEWS
README [new file with mode: 0644]
autogen.sh
configure.ac [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat
debian/control [changed mode: 0644->0755]
debian/copyright
debian/jobs [new file with mode: 0644]
debian/libecore-bin.install
debian/libecore-con-svn-01.install [new file with mode: 0644]
debian/libecore-con-svn-01.shlibs [new file with mode: 0644]
debian/libecore-con.install [new file with mode: 0644]
debian/libecore-config-svn-01.install [new file with mode: 0644]
debian/libecore-config-svn-01.shlibs [new file with mode: 0644]
debian/libecore-config.install [new file with mode: 0644]
debian/libecore-dev.install [changed mode: 0644->0755]
debian/libecore-doc.doc-base [new file with mode: 0644]
debian/libecore-evas-svn-01.install [new file with mode: 0644]
debian/libecore-evas-svn-01.shlibs [new file with mode: 0644]
debian/libecore-evas.install [new file with mode: 0644]
debian/libecore-fb-svn-01.install [new file with mode: 0644]
debian/libecore-fb-svn-01.shlibs [new file with mode: 0644]
debian/libecore-fb.install [new file with mode: 0644]
debian/libecore-file-svn-01.install [new file with mode: 0644]
debian/libecore-file-svn-01.shlibs [new file with mode: 0644]
debian/libecore-file.install [new file with mode: 0644]
debian/libecore-imf-svn-01.install [new file with mode: 0644]
debian/libecore-imf-svn-01.shlibs [new file with mode: 0644]
debian/libecore-imf.install [new file with mode: 0644]
debian/libecore-input-svn-01.install [new file with mode: 0644]
debian/libecore-input-svn-01.shlibs [new file with mode: 0644]
debian/libecore-input.install [new file with mode: 0644]
debian/libecore-ipc-svn-01.install [new file with mode: 0644]
debian/libecore-ipc-svn-01.shlibs [new file with mode: 0644]
debian/libecore-ipc.install [new file with mode: 0644]
debian/libecore-svn-01.install [new file with mode: 0644]
debian/libecore-svn-01.shlibs [new file with mode: 0644]
debian/libecore-x-svn-01.install [new file with mode: 0644]
debian/libecore-x-svn-01.shlibs [new file with mode: 0644]
debian/libecore-x.install [new file with mode: 0644]
debian/libecore.install [new file with mode: 0644]
debian/rules [changed mode: 0644->0755]
doc/Doxyfile.in [new file with mode: 0644]
doc/Makefile.am [new file with mode: 0644]
doc/e.css
doc/ecore.dox.in [new file with mode: 0644]
doc/examples.dox [new file with mode: 0644]
doc/foot.html
doc/head.html
doc/img/e.png [new file with mode: 0644]
doc/img/ecore-pos-map.eps [new file with mode: 0644]
doc/img/ecore-pos-map.png [new file with mode: 0644]
doc/img/ecore_con-client-server-example.eps [new file with mode: 0644]
doc/img/ecore_con-client-server-example.png [new file with mode: 0644]
doc/img/ecore_con-client-server-example2.eps [new file with mode: 0644]
doc/img/ecore_con-client-server-example2.png [new file with mode: 0644]
doc/img/ecore_con-client-server.eps [new file with mode: 0644]
doc/img/ecore_con-client-server.png [new file with mode: 0644]
doc/img/ecore_thread.eps [new file with mode: 0644]
doc/img/ecore_thread.png [new file with mode: 0644]
doc/img/ecore_thread_feedback.eps [new file with mode: 0644]
doc/img/ecore_thread_feedback.png [new file with mode: 0644]
doc/img/edoxy.css [new file with mode: 0644]
doc/img/foot_bg.png [new file with mode: 0644]
doc/img/head_bg.png [new file with mode: 0644]
doc/img/header_menu_background.png [new file with mode: 0644]
doc/img/header_menu_background_last.png [new file with mode: 0644]
doc/img/header_menu_current_background.png [new file with mode: 0644]
doc/img/header_menu_unselected_background.png [new file with mode: 0644]
doc/img/logo.png [new file with mode: 0644]
doc/img/prog_flow.eps [new file with mode: 0644]
doc/img/prog_flow.png
ecore-cocoa.pc.in [new file with mode: 0644]
ecore-con.manifest [new file with mode: 0644]
ecore-con.pc.in
ecore-config.pc.in
ecore-directfb.pc.in
ecore-evas.manifest [new file with mode: 0644]
ecore-evas.pc.in
ecore-fb.manifest [new file with mode: 0644]
ecore-fb.pc.in
ecore-file.manifest [new file with mode: 0644]
ecore-file.pc.in
ecore-imf-evas.manifest [new file with mode: 0644]
ecore-imf-evas.pc.in
ecore-imf.manifest [new file with mode: 0644]
ecore-imf.pc.in
ecore-input-evas.manifest [new file with mode: 0644]
ecore-input-evas.pc.in [new file with mode: 0644]
ecore-input.manifest [new file with mode: 0644]
ecore-input.pc.in [new file with mode: 0644]
ecore-ipc.manifest [new file with mode: 0644]
ecore-ipc.pc.in
ecore-psl1ght.pc.in [new file with mode: 0644]
ecore-sdl.pc.in
ecore-wayland.pc.in [new file with mode: 0644]
ecore-win32.pc.in
ecore-wince.pc.in
ecore-x.manifest [new file with mode: 0644]
ecore-x.pc.in
ecore.pc.in
ecore.spec.in
m4/ac_attribute.m4
m4/ac_path_generic.m4 [new file with mode: 0644]
m4/check_x_extension.m4
m4/ecore_check_module.m4
m4/ecore_check_options.m4 [new file with mode: 0644]
m4/efl_compiler.m4 [new file with mode: 0644]
m4/efl_compiler_flag.m4 [new file with mode: 0644]
m4/efl_coverage.m4 [new file with mode: 0644]
m4/efl_doxygen.m4 [new file with mode: 0644]
m4/efl_examples.m4 [new file with mode: 0644]
m4/efl_gettimeofday.m4 [new file with mode: 0644]
m4/efl_path_max.m4 [new file with mode: 0644]
m4/efl_shm_open.m4 [new file with mode: 0644]
m4/efl_tests.m4 [new file with mode: 0644]
m4/efl_threads.m4 [new file with mode: 0644]
packaging/ecore.changes [new file with mode: 0644]
packaging/ecore.spec [new file with mode: 0644]
po/ChangeLog [new file with mode: 0644]
po/LINGUAS [new file with mode: 0644]
po/Makevars [new file with mode: 0644]
po/POTFILES.in [new file with mode: 0644]
po/cs.po [new file with mode: 0644]
po/de.po [new file with mode: 0644]
po/el.po [new file with mode: 0644]
po/fr.po [new file with mode: 0644]
po/it.po [new file with mode: 0644]
po/ko.po [new file with mode: 0644]
po/nl.po [new file with mode: 0644]
po/pt.po [new file with mode: 0644]
po/sl.po [new file with mode: 0644]
src/Makefile.am
src/bin/Makefile.am
src/bin/ecore_config.c
src/bin/ecore_test.c [new file with mode: 0644]
src/examples/Makefile.am [new file with mode: 0644]
src/examples/ecore_animator_example.c [new file with mode: 0644]
src/examples/ecore_client_bench.c [new file with mode: 0644]
src/examples/ecore_con_client_example.c [new file with mode: 0644]
src/examples/ecore_con_client_simple_example.c [new file with mode: 0644]
src/examples/ecore_con_lookup_example.c [new file with mode: 0644]
src/examples/ecore_con_server_example.c [new file with mode: 0644]
src/examples/ecore_con_server_http_example.c [new file with mode: 0644]
src/examples/ecore_con_server_simple_example.c [new file with mode: 0644]
src/examples/ecore_con_url_cookies_example.c [new file with mode: 0644]
src/examples/ecore_con_url_download_example.c [new file with mode: 0644]
src/examples/ecore_con_url_headers_example.c [new file with mode: 0644]
src/examples/ecore_evas_basics_example.c [new file with mode: 0644]
src/examples/ecore_evas_buffer_example_01.c [new file with mode: 0644]
src/examples/ecore_evas_buffer_example_02.c [new file with mode: 0644]
src/examples/ecore_evas_callbacks.c [new file with mode: 0644]
src/examples/ecore_evas_ews_example.c [new file with mode: 0644]
src/examples/ecore_evas_object_example.c [new file with mode: 0644]
src/examples/ecore_evas_window_sizes_example.c [new file with mode: 0644]
src/examples/ecore_event_example_01.c [new file with mode: 0644]
src/examples/ecore_event_example_02.c [new file with mode: 0644]
src/examples/ecore_exe_example.c [new file with mode: 0644]
src/examples/ecore_exe_example_child.c [new file with mode: 0644]
src/examples/ecore_fd_handler_example.c [new file with mode: 0644]
src/examples/ecore_fd_handler_gnutls_example.c [new file with mode: 0644]
src/examples/ecore_file_download_example.c [new file with mode: 0644]
src/examples/ecore_idler_example.c [new file with mode: 0644]
src/examples/ecore_imf_example.c [new file with mode: 0644]
src/examples/ecore_job_example.c [new file with mode: 0644]
src/examples/ecore_pipe_gstreamer_example.c [new file with mode: 0644]
src/examples/ecore_pipe_simple_example.c [new file with mode: 0644]
src/examples/ecore_poller_example.c [new file with mode: 0644]
src/examples/ecore_server_bench.c [new file with mode: 0644]
src/examples/ecore_thread_example.c [new file with mode: 0644]
src/examples/ecore_time_functions_example.c [new file with mode: 0644]
src/examples/ecore_timer_example.c [new file with mode: 0644]
src/examples/red.png [new file with mode: 0644]
src/lib/Makefile.am
src/lib/ecore/Ecore.h
src/lib/ecore/Ecore_Getopt.h [new file with mode: 0644]
src/lib/ecore/Makefile.am
src/lib/ecore/ecore.c
src/lib/ecore/ecore_alloc.c [new file with mode: 0644]
src/lib/ecore/ecore_anim.c
src/lib/ecore/ecore_app.c
src/lib/ecore/ecore_events.c
src/lib/ecore/ecore_exe.c
src/lib/ecore/ecore_exe_ps3.c [new file with mode: 0644]
src/lib/ecore/ecore_exe_win32.c [new file with mode: 0644]
src/lib/ecore/ecore_exe_wince.c [new file with mode: 0644]
src/lib/ecore/ecore_getopt.c [new file with mode: 0644]
src/lib/ecore/ecore_glib.c [new file with mode: 0644]
src/lib/ecore/ecore_idle_enterer.c
src/lib/ecore/ecore_idle_exiter.c
src/lib/ecore/ecore_idler.c
src/lib/ecore/ecore_job.c [new file with mode: 0644]
src/lib/ecore/ecore_main.c
src/lib/ecore/ecore_pipe.c [new file with mode: 0644]
src/lib/ecore/ecore_poll.c
src/lib/ecore/ecore_private.h
src/lib/ecore/ecore_signal.c
src/lib/ecore/ecore_thread.c [new file with mode: 0644]
src/lib/ecore/ecore_throttle.c [new file with mode: 0644]
src/lib/ecore/ecore_time.c
src/lib/ecore/ecore_timer.c
src/lib/ecore_cocoa/Ecore_Cocoa.h [new file with mode: 0644]
src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h [new file with mode: 0644]
src/lib/ecore_cocoa/Makefile.am [new file with mode: 0644]
src/lib/ecore_cocoa/ecore_cocoa.m [new file with mode: 0644]
src/lib/ecore_cocoa/ecore_cocoa_private.h [new file with mode: 0644]
src/lib/ecore_cocoa/ecore_cocoa_window.m [new file with mode: 0644]
src/lib/ecore_con/Ecore_Con.h
src/lib/ecore_con/Ecore_Con_Eet.h [new file with mode: 0644]
src/lib/ecore_con/Makefile.am
src/lib/ecore_con/dns.c [new file with mode: 0644]
src/lib/ecore_con/dns.h [new file with mode: 0644]
src/lib/ecore_con/ecore_con.c
src/lib/ecore_con/ecore_con_alloc.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_ares.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_dns.c
src/lib/ecore_con/ecore_con_eet.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_info.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_local.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_local_win32.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_private.h
src/lib/ecore_con/ecore_con_socks.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_ssl.c [new file with mode: 0644]
src/lib/ecore_con/ecore_con_url.c
src/lib/ecore_config/Makefile.am
src/lib/ecore_config/ecore_config.c
src/lib/ecore_config/ecore_config_db.c
src/lib/ecore_config/ecore_config_extra.c
src/lib/ecore_config/ecore_config_ipc_ecore.c
src/lib/ecore_config/ecore_config_ipc_main.c
src/lib/ecore_config/ecore_config_private.h
src/lib/ecore_config/ecore_config_storage.c
src/lib/ecore_config/ecore_config_util.c
src/lib/ecore_directfb/Ecore_DirectFB.h
src/lib/ecore_directfb/Makefile.am
src/lib/ecore_directfb/ecore_directfb.c
src/lib/ecore_directfb/ecore_directfb_keys.h
src/lib/ecore_directfb/ecore_directfb_private.h
src/lib/ecore_evas/Ecore_Evas.h
src/lib/ecore_evas/Makefile.am
src/lib/ecore_evas/ecore_evas.c
src/lib/ecore_evas/ecore_evas_buffer.c
src/lib/ecore_evas/ecore_evas_cocoa.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_directfb.c
src/lib/ecore_evas/ecore_evas_ews.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_extn.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_fb.c
src/lib/ecore_evas/ecore_evas_private.h
src/lib/ecore_evas/ecore_evas_psl1ght.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_sdl.c
src/lib/ecore_evas/ecore_evas_util.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_wayland_common.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_wayland_egl.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_wayland_shm.c [new file with mode: 0644]
src/lib/ecore_evas/ecore_evas_win32.c
src/lib/ecore_evas/ecore_evas_wince.c
src/lib/ecore_evas/ecore_evas_x.c
src/lib/ecore_fb/Ecore_Fb.h
src/lib/ecore_fb/Makefile.am
src/lib/ecore_fb/ecore_fb.c
src/lib/ecore_fb/ecore_fb_kbd.c
src/lib/ecore_fb/ecore_fb_keytable.h
src/lib/ecore_fb/ecore_fb_li.c
src/lib/ecore_fb/ecore_fb_private.h
src/lib/ecore_fb/ecore_fb_ps2.c
src/lib/ecore_fb/ecore_fb_ts.c
src/lib/ecore_fb/ecore_fb_vt.c
src/lib/ecore_file/Ecore_File.h
src/lib/ecore_file/Makefile.am
src/lib/ecore_file/ecore_file.c
src/lib/ecore_file/ecore_file_download.c
src/lib/ecore_file/ecore_file_monitor.c
src/lib/ecore_file/ecore_file_monitor_inotify.c
src/lib/ecore_file/ecore_file_monitor_poll.c
src/lib/ecore_file/ecore_file_monitor_win32.c [new file with mode: 0644]
src/lib/ecore_file/ecore_file_path.c
src/lib/ecore_file/ecore_file_private.h
src/lib/ecore_imf/Ecore_IMF.h
src/lib/ecore_imf/Makefile.am
src/lib/ecore_imf/ecore_imf.c
src/lib/ecore_imf/ecore_imf_context.c
src/lib/ecore_imf/ecore_imf_module.c
src/lib/ecore_imf/ecore_imf_private.h
src/lib/ecore_imf_evas/Ecore_IMF_Evas.h
src/lib/ecore_imf_evas/Makefile.am
src/lib/ecore_imf_evas/ecore_imf_evas.c
src/lib/ecore_input/Ecore_Input.h [new file with mode: 0644]
src/lib/ecore_input/Makefile.am [new file with mode: 0644]
src/lib/ecore_input/ecore_input.c [new file with mode: 0644]
src/lib/ecore_input/ecore_input_compose.c [new file with mode: 0644]
src/lib/ecore_input/ecore_input_compose.h [new file with mode: 0644]
src/lib/ecore_input/ecore_input_private.h [new file with mode: 0644]
src/lib/ecore_input_evas/Ecore_Input_Evas.h [new file with mode: 0644]
src/lib/ecore_input_evas/Makefile.am [new file with mode: 0644]
src/lib/ecore_input_evas/ecore_input_evas.c [new file with mode: 0644]
src/lib/ecore_input_evas/ecore_input_evas_private.h [new file with mode: 0644]
src/lib/ecore_ipc/Ecore_Ipc.h
src/lib/ecore_ipc/Makefile.am
src/lib/ecore_ipc/ecore_ipc.c
src/lib/ecore_ipc/ecore_ipc_private.h
src/lib/ecore_psl1ght/Ecore_Psl1ght.h [new file with mode: 0644]
src/lib/ecore_psl1ght/Ecore_Psl1ght_Keys.h [new file with mode: 0644]
src/lib/ecore_psl1ght/Makefile.am [new file with mode: 0644]
src/lib/ecore_psl1ght/ecore_psl1ght.c [new file with mode: 0644]
src/lib/ecore_psl1ght/ecore_psl1ght_private.h [new file with mode: 0644]
src/lib/ecore_psl1ght/gemutil.c [new file with mode: 0644]
src/lib/ecore_psl1ght/gemutil.h [new file with mode: 0644]
src/lib/ecore_psl1ght/moveutil.c [new file with mode: 0644]
src/lib/ecore_psl1ght/moveutil.h [new file with mode: 0644]
src/lib/ecore_psl1ght/spursutil.c [new file with mode: 0644]
src/lib/ecore_psl1ght/spursutil.h [new file with mode: 0644]
src/lib/ecore_sdl/Ecore_Sdl.h
src/lib/ecore_sdl/Ecore_Sdl_Keys.h
src/lib/ecore_sdl/Makefile.am
src/lib/ecore_sdl/ecore_sdl.c
src/lib/ecore_sdl/ecore_sdl_private.h [new file with mode: 0644]
src/lib/ecore_wayland/Ecore_Wayland.h [new file with mode: 0644]
src/lib/ecore_wayland/Makefile.am [new file with mode: 0644]
src/lib/ecore_wayland/ecore_wl.c [new file with mode: 0644]
src/lib/ecore_wayland/ecore_wl_dnd.c [new file with mode: 0644]
src/lib/ecore_wayland/ecore_wl_input.c [new file with mode: 0644]
src/lib/ecore_wayland/ecore_wl_output.c [new file with mode: 0644]
src/lib/ecore_wayland/ecore_wl_private.h [new file with mode: 0644]
src/lib/ecore_wayland/ecore_wl_window.c [new file with mode: 0644]
src/lib/ecore_win32/Ecore_Win32.h
src/lib/ecore_win32/Makefile.am
src/lib/ecore_win32/ecore_win32.c
src/lib/ecore_win32/ecore_win32_cursor.c
src/lib/ecore_win32/ecore_win32_dnd.c [new file with mode: 0755]
src/lib/ecore_win32/ecore_win32_dnd_data_object.cpp [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_dnd_data_object.h [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_dnd_drop_source.cpp [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_dnd_drop_source.h [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_dnd_drop_target.cpp [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_dnd_drop_target.h [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.cpp [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.h [new file with mode: 0644]
src/lib/ecore_win32/ecore_win32_event.c
src/lib/ecore_win32/ecore_win32_private.h
src/lib/ecore_win32/ecore_win32_window.c
src/lib/ecore_wince/Ecore_WinCE.h
src/lib/ecore_wince/Makefile.am
src/lib/ecore_wince/ecore_wince.c
src/lib/ecore_wince/ecore_wince_event.c
src/lib/ecore_wince/ecore_wince_private.h
src/lib/ecore_wince/ecore_wince_window.c
src/lib/ecore_x/Ecore_X.h
src/lib/ecore_x/Ecore_X_Atoms.h
src/lib/ecore_x/Ecore_X_Cursor.h
src/lib/ecore_x/Makefile.am
src/lib/ecore_x/ecore_x_atoms_decl.h
src/lib/ecore_x/xcb/Makefile.am
src/lib/ecore_x/xcb/ecore_xcb.c
src/lib/ecore_x/xcb/ecore_xcb_atoms.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_composite.c
src/lib/ecore_x/xcb/ecore_xcb_cursor.c
src/lib/ecore_x/xcb/ecore_xcb_damage.c
src/lib/ecore_x/xcb/ecore_xcb_dnd.c
src/lib/ecore_x/xcb/ecore_xcb_dpms.c
src/lib/ecore_x/xcb/ecore_xcb_drawable.c
src/lib/ecore_x/xcb/ecore_xcb_e.c
src/lib/ecore_x/xcb/ecore_xcb_error.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_events.c
src/lib/ecore_x/xcb/ecore_xcb_extensions.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_gc.c
src/lib/ecore_x/xcb/ecore_xcb_gesture.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_icccm.c
src/lib/ecore_x/xcb/ecore_xcb_image.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_input.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_keymap.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_mwm.c
src/lib/ecore_x/xcb/ecore_xcb_netwm.c
src/lib/ecore_x/xcb/ecore_xcb_pixmap.c
src/lib/ecore_x/xcb/ecore_xcb_private.h
src/lib/ecore_x/xcb/ecore_xcb_randr.c
src/lib/ecore_x/xcb/ecore_xcb_region.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_render.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_screensaver.c
src/lib/ecore_x/xcb/ecore_xcb_selection.c
src/lib/ecore_x/xcb/ecore_xcb_shape.c
src/lib/ecore_x/xcb/ecore_xcb_sync.c
src/lib/ecore_x/xcb/ecore_xcb_textlist.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_vsync.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_window.c
src/lib/ecore_x/xcb/ecore_xcb_window_prop.c
src/lib/ecore_x/xcb/ecore_xcb_window_shadow.c
src/lib/ecore_x/xcb/ecore_xcb_window_shape.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_xfixes.c [new file with mode: 0644]
src/lib/ecore_x/xcb/ecore_xcb_xinerama.c
src/lib/ecore_x/xcb/ecore_xcb_xtest.c [new file with mode: 0644]
src/lib/ecore_x/xlib/Makefile.am
src/lib/ecore_x/xlib/ecore_x.c
src/lib/ecore_x/xlib/ecore_x_atoms.c
src/lib/ecore_x/xlib/ecore_x_composite.c
src/lib/ecore_x/xlib/ecore_x_cursor.c
src/lib/ecore_x/xlib/ecore_x_damage.c
src/lib/ecore_x/xlib/ecore_x_dnd.c
src/lib/ecore_x/xlib/ecore_x_dpms.c
src/lib/ecore_x/xlib/ecore_x_drawable.c
src/lib/ecore_x/xlib/ecore_x_e.c
src/lib/ecore_x/xlib/ecore_x_error.c
src/lib/ecore_x/xlib/ecore_x_events.c
src/lib/ecore_x/xlib/ecore_x_fixes.c
src/lib/ecore_x/xlib/ecore_x_gc.c
src/lib/ecore_x/xlib/ecore_x_gesture.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_icccm.c
src/lib/ecore_x/xlib/ecore_x_image.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_mwm.c
src/lib/ecore_x/xlib/ecore_x_netwm.c
src/lib/ecore_x/xlib/ecore_x_pixmap.c
src/lib/ecore_x/xlib/ecore_x_private.h
src/lib/ecore_x/xlib/ecore_x_randr.c
src/lib/ecore_x/xlib/ecore_x_randr.h [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_randr_11.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_randr_12.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_randr_13.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_region.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_screensaver.c
src/lib/ecore_x/xlib/ecore_x_selection.c
src/lib/ecore_x/xlib/ecore_x_sync.c
src/lib/ecore_x/xlib/ecore_x_test.c
src/lib/ecore_x/xlib/ecore_x_vsync.c [new file with mode: 0644]
src/lib/ecore_x/xlib/ecore_x_window.c
src/lib/ecore_x/xlib/ecore_x_window_prop.c
src/lib/ecore_x/xlib/ecore_x_window_shape.c
src/lib/ecore_x/xlib/ecore_x_xi2.c [new file with mode: 0755]
src/lib/ecore_x/xlib/ecore_x_xinerama.c
src/modules/Makefile.am [new file with mode: 0644]
src/modules/immodules/Makefile.am [new file with mode: 0644]
src/modules/immodules/ibus/Makefile.am [new file with mode: 0644]
src/modules/immodules/ibus/ibus_imcontext.c [new file with mode: 0644]
src/modules/immodules/ibus/ibus_imcontext.h [new file with mode: 0644]
src/modules/immodules/ibus/ibus_module.c [new file with mode: 0644]
src/modules/immodules/scim/Makefile.am [new file with mode: 0644]
src/modules/immodules/scim/scim_imcontext.cpp [new file with mode: 0644]
src/modules/immodules/scim/scim_imcontext.h [new file with mode: 0644]
src/modules/immodules/scim/scim_module.cpp [new file with mode: 0644]
src/modules/immodules/xim/Makefile.am [new file with mode: 0644]
src/modules/immodules/xim/ecore_imf_xim.c [new file with mode: 0644]
src/tests/Makefile.am [new file with mode: 0644]
src/tests/ecore_suite.c [new file with mode: 0644]
src/tests/ecore_suite.h [new file with mode: 0644]
src/tests/ecore_test_ecore.c [new file with mode: 0644]
src/tests/ecore_test_ecore_con.c [new file with mode: 0644]
src/tests/ecore_test_ecore_x.c [new file with mode: 0644]
src/util/Makefile.am [new file with mode: 0644]
src/util/makekeys.c [new file with mode: 0644]
src/util/mkks.sh [new file with mode: 0755]

diff --git a/AUTHORS b/AUTHORS
index 4968fd8..ff9f752 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,3 +1,4 @@
+Myoungwoon Roy Kim(roy_kim) <myoungwoon.kim@samsung.com> <myoungwoon@gmail.com>
 The Rasterman <raster@rasterman.com>
 Tom Gilbert <tom@linuxbrit.co.uk>
 Burra <burra@colorado.edu>
@@ -11,7 +12,7 @@ Howell Tam <pigeon@pigeond.net>
 Nathan Ingersoll <rbdpngn@users.sourceforge.net>
 Andrew Elcock <andy@elcock.org>
 Kim Woelders <kim@woelders.dk>
-Sebastian Dransfeld <sebastid@tango.flipp.net>
+Sebastian Dransfeld <sd@tango.flipp.net>
 Simon Poole <simon.armlinux@themalago.net>
 Jorge Luis Zapata Muga <jorgeluis.zapata@gmail.com>
 dan sinclair <zero@everburning.com>
@@ -19,3 +20,38 @@ Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
 David 'onefang' Seikel <onefang@gmail.com>
 Hisham 'CodeWarrior' Mardam Bey <hisham@hisham.cc>
 Brian 'rephorm' Mattern <rephorm@rephorm.com>
+Tim Horton <hortont424@gmail.com>
+Arnaud de Turckheim 'quarium' <quarium@gmail.com>
+Matt Barclay <mbarclay@gmail.com>
+Peter Wehrfritz <peter.wehrfritz@web.de>
+Albin "Lutin" Tonnerre <albin.tonnerre@gmail.com>
+Vincent Torri <vincent.torri@gmail.com>
+Lars Munch <lars@segv.dk>
+Andre Dieb <andre.dieb@gmail.com>
+Mathieu Taillefumier <mathieu.taillefumier@free.fr>
+Rui Miguel Silva Seabra <rms@1407.org>
+Samsung Electronics <tbd>
+Samsung SAIT <tbd>
+Nicolas Aguirre <aguirre.nicolas@gmail.com>
+Brett Nash <nash@nash.id.au>
+Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
+Leif Middelschulte <leif.middelschulte@gmail.com>
+Mike McCormack <mikem@ring3k.org>
+Sangho Park <gouache95@gmail.com>
+Jihoon Kim <jihoon48.kim@samsung.com> <imfine98@gmail.com>
+PnB <Poor.NewBie@gmail.com>
+Daniel Juyung Seo <seojuyung2@gmail.com> <juyung.seo@samsung.com>
+Christopher 'devilhorns' Michael <cpmichael1@comcast.net>
+ChunEon Park (Hermet) <hermet@hermet.pe.kr>
+xlopez@igalia.com
+Rafael Antognolli <antognolli@profusion.mobi>
+Kim Yunhan <spbear@gmail.com>
+Youness Alaoui <kakaroto@kakaroto.homelinux.net>
+Bluezery <ohpowel@gmail.com>
+Doyoun Kang <wayofmine@gmail.com> <doyoun.kang@samsung.com>
+Haifeng Deng <haifeng.deng@samsung.com>
+Jérémy Zurcher <jeremy@asynk.ch>
+Vikram Narayanan <vikram186@gmail.com>
+Seong-ho Cho (DarkCircle) <darkcircle.0426@gmail.com>
+Patryk Kaczmarek <patryk.k@samsung.com>
+Daniel Willmann <d.willmann@samsung.com>
diff --git a/COPYING b/COPYING
index dee3047..fb8c49d 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -1,20 +1,25 @@
-Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS)
+Copyright notice for Ecore:
 
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-  
-The above copyright notice and this permission notice shall be included in
-all copies of the Software, its documentation and marketing & publicity 
-materials, and acknowledgment shall be given in the documentation, materials
-and software packages that this Software was used.
-   
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+Copyright (C) 2000-2011 Carsten Haitzler and various contributors (see AUTHORS)
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above copyright 
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
index ee16b53..d9f5d9b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,997 @@
-Wed Jun  8 16:56:30 2005                        Michael Jennings (mej)
+2011-01-29  Carsten Haitzler (The Rasterman)
 
-Fix spec file.
-----------------------------------------------------------------------
+        1.0.0 release
+
+2011-01-29  Mike McCormack
+
+        * Convert fd list to inlist to save allocs
+
+2011-01-29  Rui Miguel Silva Seabra
+
+        * make https not fail (that's curl's responsibility, really).
+
+2011-01-31  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore-evas CAN send "render done" messages even if not
+        waiting for sync counter when using gl engine. new semi-sync
+        mode to account for that.
+
+2011-02-01 Mike McCormack
+
+        * Remove SIGRT from ecore's signals since it's unused and broken
+
+2011-02-09  Mathieu Taillefumier
+
+       * Add xrandr backlight support to ecore_x
+
+2011-02-10 Mike Blumenkrantz
+
+        * Added some more possibly useless safety checks to ecore_con_ares
+
+        * Implement event-driven error message api for all non-curl ecore_con
+        +ECORE_CON_EVENT_CLIENT_ERROR, ECORE_CON_EVENT_SERVER_ERROR events
+        +Ecore_Con_Event_Server_Error, Ecore_Con_Event_Client_Error types
+
+        * Unify event handler code
+        * Always increment server event count for client events
+
+2011-02-11 Mike Blumenkrantz
+
+        * Added ecore_con_client_port_get
+
+2011-02-16 Sangho Park
+
+       * Added ecore_file_download_full API.
+
+2011-02-20 Vincent Torri
+
+       * Ecore_Win32: improve resize of windows and fix key up event for
+       the 'space' key.
+       * Ecore_WinCE: do not erase a window background
+
+2011-02-21 Jihoon Kim
+
+       * Add get calls in ecore_imf for ecore_imf_context_canvas_get() and
+        ecore_imf_context_window_get().
+
+2011-02-21 Raoul Hecky
+
+       * Remove 300 second timeout so large downloads work in ecore_con.
+
+2011-02-22  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore-file inotify fd would be duplicated in children
+        on fork. Have it detecti this on next monitor add and re-init the
+        inotify fd and fd handler.
+
+2011-02-24 Vincent Torri
+
+       * Ecore_File: fix compilation when ecore_con and curl are not
+       available
+
+2011-02-27 Jihoon Kim
+
+        * Add ecore_imf_context_preedit_string_with_attributes_get API.
+
+2011-03-01 Raoul Hecky
+
+       * Add ecore_con_url_ssl_verify_peer_set API.
+
+2011-03-01 Guillaume Friloux
+
+       * Fix detection of complete file write in ecore_file inotify.
+
+2011-03-16 Cedric Bail
+
+       * Add ecore_thread_reschedule.
+
+2011-03-19 Mike Blumenkrantz
+
+        * Fix crash in ecore_con_ssl related to attempted connections on a dead socket
+
+2011-03-23  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore-evas interceptor didn't handle override-redirect
+        windows correctly, expecting a feed-back event from x, which it didn't
+        get.
+
+2011-03-23  Elixirious
+
+       * Fix ecore_con_url_ftp_upload upload the file until the end.
+
+2011-03-29  PnB
+
+       * Add ecore_con_url_ssl_ca_set to manually set a certificate authority.
+
+2011-03-30  Carsten Haitzler (The Rasterman)
+
+        * Ecore_X gains some more x sync counter controls and Ecore_Evas
+        now uses the netwm sync protocol to get wm's to only configure
+        as fast as it can keep drawing.
+
+2011-04-01  Leif Middelschulte
+
+       * Add ecore_x_randr_edid_* data extraction and validation functions
+       for EDID structures.
+
+2011-04-01  Cedric Bail
+
+       * Add ecore_con_url_pipeline_set and ecore_con_url_pipeline_get for
+       HTTP 1.1 pipelining support.
+
+2011-04-05  Cedric Bail
+
+       * Remove Ecore_Evas Cocoa backend that use depreacted Evas Quartz
+       backend.
+
+2011-04-11  Hannes Janetzek
+
+       * Fix removal of windows from ignore_list with ecore_x_window_ignore_set
+
+2011-04-13  Doyun Kang
+
+       * Ecore_X + Ecore_Evas: Add more support for shape input setting
+
+2011-04-15  Carsten Haitzler (The Rasterman)
+
+        * Fix bug in Ecore_Evas setting modifiers for
+        sub-buffer-canvas. They never got set. Now they do.
+
+2011-04-19 Mike Blumenkrantz
+
+        * Add ecore_exe_data_set
+
+2011-04-20  Carsten Haitzler (The Rasterman)
+
+        * Added ecore animator timeline, where animator runs for a
+        specified time (in seconds) and then stops, but it also passes
+        the position in the timeline (as a 0.0 to 1.0 value) to the
+        callback which it can then use the new pos map call to map to
+        some ease in/out, bounce, spring or whatever position.
+
+2011-04-28  Eduardo Felipe Castegnaro
+
+        * Add a monotonic clock implementation for Mac OS X to fix warning.
+        Mac OS X does not provide an implementation of clock_gettime()
+        even though it's POSIX, but it does provide a fast high-resolution
+        monotonic clock through mach specific APIs that are perfectly suited
+        for usage in ecore_timer.
+
+2011-04-20  Jihoon Kim
+
+        * Ecore_IMF: Added support for auto-capitalization and prediction
+        control API's
+
+2011-05-03  Carsten Haitzler (The Rasterman)
+
+        * Fixed null pointer dereference in selection notification
+        handling in Ecore_X.
+
+2011-05-12  Carsten Haitzler (The Rasterman)
+
+        * Add a custom Ecore Animator source and tick ability to be able
+        to plug in external animator tick sources like vblank interrupts
+        and so on.
+
+2011-05-14  Cedric Bail
+
+       * Sync GNUTLS threads activation with Eina.
+
+2011-05-14  Vincent Torri
+
+       * Make ecore_con work on Windows (only the local connections
+       need a port)
+       * Make ecore_ipc compile on Windows
+
+2011-05-17  Cedric Bail
+
+       * Add ecore_timer_dump.
+
+2011-05-19  Carsten Haitzler (The Rasterman)
+
+        * Fix Ecore_X shadow tree search handling to respect shape and
+        shape input of windows.
+
+2011-05-20  Daniel Juyung Seo (SeoZ)
+
+        * Ecore ecore_main.c: Fixed ecore_main_loop
+        (_ecore_main_loop_iterate_internal). This fixes fd handler pending
+        issue when ecore_idler callback adds ecore_job/event.
+        * Ecore ecore_main.c: Refactoring _ecore_main_loop_iterate_internal().
+
+2011-05-27  Gustavo Sverzut Barbieri (k-s)
+
+       * Ecore_X: introduce ecore_x_screen_size_get()
+       * Ecore_Evas: be safer when returning Ecore_Evas* from
+         ecore_evas_ecore_evas_get()
+       * Ecore_Evas: introduce ecore_evas_screen_geometry_get()
+
+2011-05-30  Cedric Bail
+
+       * Add ecore_pipe_freeze/thaw to suspend and restart watching the pipe
+       inside the main loop.
+
+2011-06-09  Cedric Bail
+
+       * Add ecore_pipe_wait (should only called from outside of the main loop).
+
+2011-06-15  Mike Blumenkrantz
+
+        * Add ecore_con_ssl_client/server_upgrade to begin asynchronously upgrading an
+        existing connection to SSL/TLS, emitting ECORE_CON_CLIENT/SERVER_UPGRADE event
+        upon completion.
+
+2011-06-16  Cedric Bail
+
+       * Fix ecore_x_selection_convert not taking selection length into account.
+
+2011-06-17  Mike Blumenkrantz
+
+        * ecore_con_server_timeout_get/set now applies to client-type servers
+
+2011-06-20  Ulrich Eckhardt
+
+        * Removed support for evas xrender engine from ecore-evas as
+        it is not a deprecated engine in evas and no longer needs support.
+
+2011-06-20  Jihoon Kim
+
+        * Ecore_IMF: Added ecore_imf_context_input_panel_enabled_set/get API
+
+2011-06-25  Mike Blumenkrantz
+
+        * Fix security hole in openssl certificate verification
+        * Fix gnutls server-client certificate verification
+        * New function: ecore_con_ssl_server_verify_basic for only verifying
+            certificates against a server's Common Name (CN) or its
+            Subject Alternative Name (if available)
+
+2011-06-28  Carsten Haitzler (The Rasterman)
+
+        * Add ecore_throttle mechanism to voluntarily do powersaving to
+        avoid wakeups and excess animation etc. when in the background
+        or another "powersave" state.
+
+2011-07-01  Carsten Haitzler (The Rasterman)
+
+        * Fix epoll delete fd handling in child process - #796
+
+2011-07-07  Jihoon Kim
+
+        * Ecore_IMF: Added ecore_imf_context_cursor_location_set API
+
+2011-07-22  Mike Blumenkrantz
+
+        * Added ecore_con_url_url_get
+
+2011-07-26  Carsten Haitzler (The Rasterman)
+
+        * Fix timer precision handling for grouping timer ticks so
+        they actually do tick off together
+
+2011-07-28  Cedric Bail
+
+       * Add ecore_main_loop_thread_safe_call_async.
+
+2011-07-26  Carsten Haitzler (The Rasterman)
+
+        * Make ecore-evas give more errors on stderr when engines are
+        not found.
+
+2011-08-16  Cedric Bail
+
+       * Add ecore_main_loop_thread_safe_call_sync.
+
+2011-08-17  Cedric Bail
+
+       * Add ecore_thread_main_loop_begin and ecore_thread_main_loop_end.
+       Usefull to protect EFL call from another thread.
+
+2011-09-12  Mike Blumenkrantz
+
+        * Add ecore_con_server_fd_get, ecore_con_client_fd_get for manipulating
+          server file descriptors.
+
+2011-09-13  Mike Blumenkrantz
+
+        * Add ECORE_CON_EVENT_CLIENT_WRITE, ECORE_CON_EVENT_SERVER_WRITE for
+          obtaining progress of socket writes
+
+2011-09-18  Carsten Haitzler (The Rasterman)
+
+        * Fix bug in Ecore_X generic event handling for extended event
+          sizes when freeing (and allocating) the data.
+
+2011-09-29  Youness Alaoui (KaKaRoTo)
+
+        * Port ecore-con to work on systems without IPv6 support
+        * Use inet_ntop instead of getnameinfo for ecore_con_client_get_ip
+        * Added ecore-con unit test
+
+2011-10-28  Jiyoun Park
+
+        * Fix bug in Ecore_X using geometry value instead of
+          recently requested geometry value
+
+2011-10-28 Rafael Antognolli
+
+        * Make the framebuffer engine input use ecore_input_evas instead
+        of feeding evas input events directly.
+
+2011-11-02 Nicolas Aguirre
+
+       * Add support ecore_cocoa_evas engine.
+       * Fix ecore_cocoa code to correctly handle cocoa window.
+
+2011-11-02 Bluezery
+
+       * Fix return error handling in ecore_file_download when
+        ecore_con_url_get() fails.
+
+2011-11-20 Vincent Torri
+
+       * Ecore_Win32, Ecore_WinCE: fix Shift, Control and Alt keys
+       detection
+       * Ecore_Win32: fix "mouse-down inside and mouse-up outside" issue
+
+2011-11-2  Carsten Haitzler (The Rasterman)
+
+        * Fix bug ecore-evas for fb, buffer, sdl back-ends to ensure
+        mouse is in on init (as events wont always give this) and focus
+        is set on show if appropriate if no focus in/out events come
+        from the back-end later
+        * Fix setting override state to only hide if it should be
+        visible at that point in x back end support
+
+2011-11-24 Rafael Antognolli
+
+        * Add ecore_fb_input_device_window_set().
+
+2011-11-27 Vincent Torri
+
+        * Fix and improve key management on Windows XP
+
+2011-11-29 Vincent Torri
+
+        * Discard left Ctrl when AltGr is pressed (Windows XP)
+       * Fix the string value for the Delete key (Windows XP)
+       * Fix the key release values for non keystroke keys (Windows XP)
+
+2011-11-29 Mike McCormack
+
+       * Allow quitting before entering the glib version of the main loop
+
+2011-12-02 Carsten Haitzler (The Rasterman)
+
+        1.1.0 release
+
+2011-12-02 Mike Blumenkrantz
+
+        * Use mempools for allocations
+
+2011-12-02 Term <term@twistedpath.org>
+
+        * added ecore_x_randr_output_backlight_available()
+
+2011-12-03 Vincent Torri
+
+       * Fix the modifiers value (Windows XP)
+
+2011-12-04 Mike Blumenkrantz
+
+        * added ecore_timer_reset()
+
+2011-12-05 Mike Blumenkrantz
+
+        * added ecore_con_socks api
+
+2011-12-07 Mike Blumenkrantz
+
+        * Allow SSL certificates to be loaded for STARTTLS
+        * Added functions to set/get the hostname used for SSL certificate verification
+        * ecore_con_ssl_server_cafile_add() now accepts directories
+
+2011-12-10 Mike Blumenkrantz
+
+        * Fix case where SSL certificates would not be used
+        * Added ECORE_CON_REMOTE_CORK for applying TCP_CORK to sends
+
+2011-12-12 Carsten Haitzler (The Rasterman)
+
+        * Fix bug where an animator that just keeps adding another
+        animator keeps the animator handler in an infinite loop. Do
+        the same as timers and mark them as "just added" to skip in
+        this run of animators
+
+2011-12-13  Doyun Kang
+
+       * Add ability to get resource id of last x error in ecore_x.
+
+2011-12-16 Carsten Haitzler (The Rasterman)
+
+        * Clean up some ecore-evas-buffer code
+        * Add Ecore-evas extn (external) plug and socket canvas wrappers
+        allowing for any ecore-evas to contain an image object that is
+        a "socket" for other processes to plug into with "plugs" and
+        thus provide image content via a canvas remotely (from another
+        process) as well as the socket process passing in events to the
+        plug process to it can see key, mouse, multi etc. events.
+
+
+2011-12-16 Mike Blumenkrantz
+
+        * Fix possible 0 byte allocation in ecore-x
+
+2011-12-20 Carsten Haitzler (The Rasterman)
+
+        * Fix probable leak for g_static_mutex's on some architectures
+
+2011-12-20 Jihoon Kim
+
+       * Add XIM attribute support to Ecore_IMF
+
+2011-12-21 Tae-Hwan Kim (Bluezery)
+
+       * Add proxy set and timeout set functions in ecore_con.
+
+2011-12-26 Tae-Hwan Kim (Bluezery)
+
+       * Add proxy username/password set functions in ecore_con.
+
+2011-12-26  Christopher Michael (devilhorns)
+
+        * Add Ecore_Wayland (backend to support Wayland).
+        * Add Shm and Egl engines for ecore_evas to draw in Wayland.
+
+2011-12-27 Carsten Haitzler (The Rasterman)
+
+        * Fix mouse down grab counts going bad by missing events.
+
+2011-12-29 Carsten Haitzler (The Rasterman)
+
+        * Fix massive post data problem in ecore-con that would cause
+        post data to be corrupted (as it was never copied into the
+        ecore con url struct) or could cause crashes if the memory
+        pointed to became invalid.
+
+2012-01-04 Carsten Haitzler (The Rasterman)
+
+        * Add HEX, TERMINAL and PASSWORD layouts to ecore-imf
+
+2011-01-05 Jiyoun Park (Jypark)
+
+        * Fix Ecore-evas extn (external) for multi client model.
+        "Socket" creates canvas and other process can show that canvas 
+        using "Plug" image object. Before only one to one communication 
+        is possible, but now many "plug"s can show socket's canvas.
+
+2011-12-26  Christopher Michael (devilhorns)
+
+        * Add Ecore_X function to return the keycode from a given keyname.
+
+2012-02-06  Jihoon Kim (jihoon)
+
+        * Set ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL as default layout in ecore_imf_context_add.
+        * Add Ecore_IMF function to set or get the input panel-specific data.
+
+2012-02-07  Jihoon Kim (jihoon)
+
+        * Support ecore_imf_context_input_panel_show/hide in XIM and SCIM module.
+
+2012-02-08 Carsten Haitzler (The Rasterman)
+
+        * Add ecore_con_url_http_version_set() to set url request version
+
+2012-02-09  Jihoon Kim (jihoon)
+
+        * Provide compose, string in key down/up event in case of scim-input-pad.
+
+2012-02-10  Christopher Michael (devilhorns)
+
+        * Add Ecore_Evas function to allow setting a mouse pointer from efl/elm wayland clients.
+
+2012-02-15  Jihoon Kim (jihoon)
+
+        * Add ecore_imf APIs to set return key type, disable return key.
+
+2012-02-16  Leif Middelschulte (T_UNIX)
+
+        * Add ecore_x_randr_mode_add to add a mode to a display
+        * Add ecore_x_randr_mode_del to remove a mode from the display
+        * Add ecore_x_randr_output_mode_add to add a mode to an output
+        * Add ecore_x_randr_output_mode_del to remove a mode from an output
+
+2012-02-10  Jérémy Zurcher
+
+        * Improve callbacks in ecore_evas to use typedefs for readability.
+
+2012-02-20  Cedric Bail
+
+       * Rewrite internal of Ecore_Thread to use Eina_Lock and ecore_main_loop_thread_safe_call_async.
+
+2012-02-23  Cedric Bail
+
+       * Move to Evas buffer engine for Ecore_Evas SDL software backend.
+
+2012-02-23  Leif Middelschulte (T_UNIX)
+
+        * Add ecore_x_randr_window_crtcs_get to get the crtcs that display a
+               window.
+        * Deprecate ecore_x_randr_current_output_get. Use
+               ecore_x_randr_window_crtcs_get instead.
+
+2012-02-24  Doyun Kang
+
+       * Add indicator controls to ecore_x
+
+2012-02-26 Carsten Haitzler (The Rasterman)
+
+        * Fix ecore_file_download to not limit downloads to 30sec.
+
+2012-02-28 Carsten Haitzler (The Rasterman)
+
+        * Add ecore_x_netwm_icons_set()
+        * Add ecore_evas_window_group_set() ecore_evas_window_group_get()
+          ecore_evas_aspect_set() ecore_evas_aspect_get()
+          ecore_evas_urgent_set() ecore_evas_urgent_get()
+          ecore_evas_modal_set() ecore_evas_modal_get()
+          ecore_evas_demand_attention_set()
+          ecore_evas_demand_attention_get()
+          ecore_evas_focus_skip_set() ecore_evas_focus_skip_get()
+          ecore_evas_callback_state_change_set()
+
+2012-02-28 Christopher Michael (devilhorns)
+
+        * Refactor Ecore_Wayland code to improve running EFL
+          applications as Wayland Clients.
+        * Refactor Ecore_Evas Wayland code to match changes in 
+          Ecore_Wayland
+
+2012-02-29  Jihoon Kim (jihoon)
+
+        * Add ecore_imf_context_input_panel_caps_lock_mode_set/get to set the caps lock mode on the input panel
+
+2012-03-07  ChunEon Park (Hermet)
+
+        * Add ecore_x_illume_clipboard_state_set()
+              ecore_x_illume_clipboard_state_get()
+              ecore_x_illume_clipboard_geometry_set()
+              ecore_x_illume_clipboard_geometry_get()
+
+2012-03-07  Carsten Haitzler (The Rasterman)
+
+        * Add atoms and api for rotation and indicator transparency in
+          ecore_x/ecore_evas
+
+2012-03-07  Mike Blumenkrantz (discomfitor/zmike)
+
+        * Add ecore_con_url_status_code_get() to check return code at any time
+
+2012-03-09  Carsten Haitzler (The Rasterman)
+
+       * Fix ecore_thread_feedback_run to work as the documentation and logic tell us.
+
+2012-03-10  Cedric Bail
+
+       * Fix double free at end of execution of Ecore_Thread with feedback.
+
+2012-03-13  Leif Middelschulte (T_UNIX)
+
+        * Fix ecore_x_randr_modes_info_get to not cut off the trailing '\0'
+               anymore
+
+2012-03-20  Vincent Torri
+
+        * Rename ecore_win32_window_focus_set() to ecore_win32_window_focus()
+       to match ecore_x API.
+       * Add ecore_wince_window_focus(), ecore_wince_window_focus_get()
+       and ecore_win32_window_focus_get().
+
+2012-03-26  Shinwoo Kim
+
+        * Do not autorepeat Ctrl, Shift, Alt and Win keys on Windows
+
+2012-03-26 Christopher Michael (devilhorns)
+
+       Ecore_Wayland:
+       * Add ecore_wl_dpi_get
+       * Implement functions for input grab/ungrab
+       * Implement setting surface input & opaque regions
+       * Implement popup windows
+       * Implement ecore_wl_window_transparent_set function
+       * Implement function to allow setting Ecore_Wl_Window type.
+
+2012-03-26  Jihoon Kim (jihoon)
+
+        * scim-immodule: fix bug candidate window covers the preedit string when preedit string appears in 2 line.
+
+2012-03-29 Carsten Haitzler (The Rasterman)
+
+        * Fix range of issues with ecore_fb and even ecore_evas where
+        it didn't work right on the fb. (timestamps wrong, focus
+        handling etc.). This makes it work fully again.
+
+2012-04-13 Gustavo Sverzut Barbieri (k-s)
+
+       * remove EAPI from _ecore_event_signal_user_new(). It should never
+       be exported outside of libecore.so
+       * stop leaking every system signal event.
+
+2012-04-16  Shinwoo Kim
+
+       * Check control charater and convert into printing character on Windows
+
+2012-04-20  Vincent Torri
+
+       * Add override_set() support in ecore_evas_win32.
+
+2012-04-26 Carsten Haitzler (The Rasterman)
+
+        1.2.0 release
+
+2012-05-08  Cedric Bail
+
+       * Don't over allocate Ecore_Pipe during ecore_init/ecore_shutdown.
+
+2012-05-10  Cedric Bail
+
+       * Reduce rounding error in ecore_animator_pos_map.
+
+2012-05-10  Jiyoun Park
+
+       * Send mouse move event before mouse down event in ecore_extn
+
+2012-05-13  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore-x randr issues with memory access when building
+        output arrays which are memory segv bugs waiting to crash.
+
+2012-05-17  Vincent Torri
+
+        * Add transparent support in ecore_evas on Windows (GDI engine only)
+
+2012-05-22  Cedric Bail
+
+       * Reduce race condition on Ecore_Thread shutdown.
+
+2012-05-22  Carsten Haitzler (The Rasterman)
+
+        * Add ecore_x_mouse_in_send() and ecore_x_mouse_out_send()
+        * Add ecore_x illume access control/action atoms+api's
+
+2012-05-24  Doyoun Kang
+
+        * Add Ecore_X_Error_Code enumeration in ecore_x
+
+2012-05-24  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore-thread scheduling issue where re-scheduled threads
+        will hold a loop busy and not allow feedback workers to run,
+        so now have fairer scheduling.
+        * Allow 16 * cpu num for worker threads (default still cpu num)
+
+2012-05-25  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore mainloop issue if you begin the mainloop, keep a
+        timer around, quit mainloop, then start it again expecting the timer
+        to keep ticking off. also happens to be an issue with
+        iterating the mainloop.
+
+2012-05-25  Rob Bradford
+
+        * Make ecore_{software_x11, software_x11_8, software_x11_16, wayland,
+        directfb}_window_get return 0 if the Ecore_Evas was not created with
+        the appropriate constructor.
+
+2012-05-29 Rob Bradford
+
+        * Initial cursor support for Wayland:
+        * Add api to the ecore_wl_input_ namespace to allow setting the buffer
+        to use for the pointer and for loading a named cursor from a cursor
+        theme. Under the Wayland protocol the cursor is associated with the
+        input device.
+        * Add helper functions to ecore_wl_window to set the cursor based on
+        the active pointer input device for the window.
+        * Load the cursor theme when the SHM interface is ready and provide an
+        API call to provide a wl_cursor for a given name.
+        * Add API to restore to the default cursor and then use that when the
+        pointer enters the surface to ensure compliance with the Wayland
+        protocol.
+
+2012-05-30  Cedric Bail
+
+       * Force cancel of all running Ecore_Thread on shutdown.
+       * Make Ecore_Thread work reliabily when main loop isn't running.
+
+2012-05-30  Mariusz Grzegorczyk
+
+       * Small fix to ecore-evas buffer engine on resize to make the
+        right kind of buffer cavas (ARGB32 vs RGB32).
+
+2012-05-30 Leif Middelschulte (T_UNIX)
+
+        * Add ECORE_X_RANDR_OUTPUT_POLICY_ASK
+
+2012-06-04 Mike Blumenkrantz
+
+        * ECORE_{CON,IPC}_NO_PROXY now available for disabling proxying on certain connections
+        * Added new resolver method: dns.c -- This is used by default now when ipv6 is enabled
+          and c-ares support is disabled.
+
+2012-06-06 Rob Bradford
+
+        * Ecore_Wayland: Enhance the keyboard input handling
+        * Associate the keymap with the input device rather than the display
+        since you could could have different keymaps associated with different
+        devices.
+        * Increase the size of character arrays used for the string
+        representations of the keyname, keysym and for the string
+        representing the key.
+        * Re-enable the code that converts the keysym to a printable definition
+        - this is required where the keysym is not the same as the printable
+        definition
+
+2012-06-06 Rob Bradford
+
+       * Ecore_Wayland: Update to protocol change - axis events are now fixed point numbers
+
+2012-06-11 Rob Bradford
+
+       * Ecore_Wayland: Add missing null pointer checks on input device
+       deletion (ticket #1031). Not all devices are keyboards.
+
+2012-06-11  Jihoon Kim (jihoon)
+
+        * ibus-immodule: Add immodule for supporting ibus.
+
+2012-06-12  Mike Blumenkrantz
+
+        * Fixed bug in ecore-file monitoring with inotify where watching a file
+          that was deleted broke the world.
+
+2012-06-15 Rob Bradford
+
+       * Ecore_Wayland: Port to latest Wayland protocol. The cursor for a
+       pointer is now a surface rather than a buffer.
+
+2012-06-15 Rob Bradford
+
+       * Ecore_Wayland: Drop unused timestamp from configure event. Rationale:
+       - timestamp isn't used by the handler for this event
+       - configure event we receive from the compositor doesn't have a timestamp
+       - ecore_wl_window_maximized_set and ecore_wl_window_fullscreen_set had
+         an implicit requirement that the window had keyboard focus to retrieve
+         a timestamp that wasn't used. This removes that requirement and fixes
+         ticket #1030.
+
+2012-06-22 Vincent Torri
+
+       * ecore_exe: fix compilation on fedora 18.
+
+2012-06-23  Carsten Haitzler (The Rasterman)
+
+        * Fix small problem with xim module and if xim input context is
+        destroyed. causes crashes next focus. track ic and set to NULL.
+
+2012-06-27 Sebastian Dransfeld
+
+       * Fix xim module to pass of Windows key as Mod4, not Mod5
+       * Add support for AltGr key in X
+
+2012-06-28  Carsten Haitzler (The Rasterman)
+
+        * Add compose sequence handling to ecore_input to be able to
+        query a sequence of keysyms for a final compose string (utf8)
+        that you free if you get it.
+
+2012-07-02  Mike Blumenkrantz
+
+        * Fix crash which occurred in ecore-con when dns resolution failed
+          immediately due to lack of connectivity
+
+2012-07-03  Cedric Bail
+
+       * Fix unitialized use of Ecore_X_Atom.
+
+2012-07-03 Christopher Michael
+
+       * Merge Tizen EFL changes to upsteam.
+       * Add ecore_evas functions to get/set profiles
+       * Fix GL buffer. some GL drivers are doing buffer copy in a separate thread.
+               we need to check whether GL driver sends SYNC_DRAW_DONE msg afger copying
+               that are required in order to exactly render. - added by gl77.lee
+       * Add Ecore_X atoms for Illume Rotate Window
+       * Add event callbacks for Ecore_Imf Input Panel
+       * Add functions to retrieve input panel geometry & state from Ecore_Imf.
+
+2012-07-05  Carsten Haitzler (The Rasterman)
+
+        * Add ecore_evas_screen_dpi_get()
+        * Fix ecore_evas_screen_geometry_get(0 for x11 to return zone
+          pos/size as it should.
+        * Fix ecore-fb to use key repeat like x so apps dont break in fb
+        * Fix ecore-fb string lookup table to include ctrl+keys
+        * Fix ecore-fb to trap sigint (ctrl+c) so it doesnt exit your fb app
+        * Fix ecore-fb mouse to swap button 2 and 3 ro work right.
+
+2012-07-13  Jiyoun Park
+
+        * Fix bug in Ecore_extn to call pre/post render function
+
+2012-07-16  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore-x selection handling to fall back to getting
+          selection directly if getting targets fails. This fixes e17 to
+          elm cnp.
+
+2012-08-01  Mike Blumenkrantz
+
+        * Add ecore_main_fd_handler_file_add() for integrating file descriptors
+          from regular files into the main loop
+
+2012-08-01  Rob Bradford
+
+       * Support setting fullscreen on Ecore_Evas's under the Wayland engine
+       before they are visible. The fullscreening will then be applied when
+       they become visible.
+
+2012-08-01  Rob Bradford
+
+       * Use libxkbcommon function to map keysym to unicode characters in the
+       Wayland backend. Removing the need to have our own function to do this
+       and increasing the range of supported keysms. Fixes #1105.
+
+2012-08-03  Rob Bradford
+
+       * In the Wayland backend handle the case that events can be received
+       for surfaces that have been since destroyed - the client side
+       marshaller changes the pointer to NULL to when the object is destroyed
+       on the client side. Fixes #1258.
+
+2012-08-09  Cedric Bail
+
+       * Correctly shutdown Ecore_Thread.
+       * Add a way to reset Ecore_Thread internal pipe after a fork via ecore_fork_reset.
+
+2012-08-13  Carsten Haitzler (The Rasterman)
+
+        * Fix ecore fork reset function to allow for callbacks to be
+          attached so ecore-evas can reset evas async fd on fork.
+
+2012-08-13  Vincent Torri
+
+        * Fix segmentation fault when fd_set pointers are NULL on Windows
+
+2012-08-18  Carsten Haitzler (The Rasterman)
+
+        * Add xkb change events patch from trac.
+
+2012-08-27  Carsten Haitzler (The Rasterman)
+
+        * Add ecore_x custom blanker screensaver enable/disable - cant
+          do e17 properly without so add in even in freeze.
+
+2012-08-27  Vincent Torri
+
+        * Fix segmentation fault in ecore_thread on Windows as PHS
+         was returning a wrong value.
+
+2012-08-29  Cedric Bail
+
+       * Always call evas_render_update_free to prevent leak in Ecore_Evas X backend.
+
+2012-08-29  Mike Blumenkrantz
+
+        * Fix leak in ecore_ipc servers
+
+2012-08-29  Christopher Michael
+
+        * Add Copy-N-Paste support for Ecore_Wayland.
+
+2012-08-30  Carsten Haitzler (The Rasterman)
+
+        1.7.0 release
+
+2012-08-31  Cedric Bail
+
+       * Add Ecore_Con_Eet API to help using Eet_Data with Ecore_Con
+
+2012-09-03  Shinwoo Kim (kimcinoo)
+
+       * Add ecore_x illume access messages:
+         ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP
+         ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN
+
+2012-09-04  Jihoon Kim (jihoon)
+
+       * Add ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SIGNIN
+
+2012-09-05  Mike Blumenkrantz
+
+       * Fix crash that could occur in ecore_con_ssl with privkeys and certificates on failure
+
+2012-09-06  Mike Blumenkrantz
+
+       * Fix race condition in ecore-con where events could sometimes be sent for freed clients
+       * Fix ssl servers using openssl
+       * Fix ssl connections overall
+
+2012-09-07  Christopher Michael
+
+       * Fix ecore_x_randr to actually return outputs properly.
+
+2012-09-08  Vincent Torri
+
+       * Fix readlink usage in ecore_file.
+
+2012-09-12  Jihoon Kim (jihoon)
+
+       * Add ECORE_IMF_PREEDIT_TYPE_SUB4~7 style.
+
+2012-09-10  Christopher Michael
+
+       * Fix ecore_x_randr to actually return crtcs properly.
+
+2012-09-11  Christopher Michael
+
+       * Fix ecore_x_randr to actually return crtcs possible outputs properly.
+       * Fix ecore_x_randr to actually return crtcs outputs properly.
+
+2012-09-13  Mike Blumenkrantz
+
+       * Return -1 for ecore_con_server_fd_get() in the case that the server has already been deleted
+
+2012-09-13  Carsten Haitzler (The Rasterman)
+
+       * Fix ecore-evas rotation handling for canvases that shows up
+       only on some drivers and GL implementations.
+
+2012-09-14  Doyoun Kang
+
+       * Add string to atom_items for ECORE_X_ATOM_E_ILLUME_WINDOW_STATE, 
+       ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL, ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING
+
+2012-09-18  Patryk Kaczmarek
+
+       * Fix escaping in ecore_file_escape_name() to handle tab and
+       newline right.
+
+2012-09-21  Carsten Haitzler (The Rasterman)
+
+       * Fix ecore_x_image_is_argb32_get() to return correctly on
+       endianess.
+
+2012-09-21  Christopher Michael
+
+       * Fix ecore_x_randr to properly return output modes from
+       ecore_x_randr_output_modes_get().
+
+2012-09-27  Carsten Haitzler (The Rasterman)
+
+       * Fix ecore_imf buf in the ibus module where it may segv
+       accessing a wrong context handle.
+
+2012-10-02  Daniel Willmann
+
+       * Fix memory allocation size in ecore_thread_feedback()
+
+2012-10-03  Daniel Wilmann
+       * Fix memory allocation size in ecore_x xcb randr function
+
+2012-10-04  Cedric Bail
+
+       * Add ecore_x_input_raw_select and ECORE_X_RAW_*.
+
+2012-10-04  Sebastian Dransfeld
+
+       * Expose ecore_x_selection_converter_text
+
+2012-10-05  Cedric Bail
+
+       * Properly reschedule call to curl.
+
+2012-10-05  Eduardo Lima (Etrunko)
+
+       * Wayland SHM now features a mechanism to synchronize rendering with
+       the compositor, removing tearing effect in animations when using that
+       engine.
diff --git a/INSTALL b/INSTALL
index 3a3ad7e..23e5f25 100644 (file)
--- a/INSTALL
+++ b/INSTALL
-COMPILING and INSTALLING:
+Installation Instructions
+*************************
 
-If you got a official release tar archive do:
-    ./configure
-    
-( otherwise if you got this from enlightenment cvs do: ./autogen.sh )
-    
-Then to compile:
-    make
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
 
-To install (run this as root, or the user who handles installs):
-    make install
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about.  Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).  Here is a another example:
+
+     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
 
-NOTE: You MUST make install Eet for it to run properly.
index f373799..9f16aeb 100644 (file)
 
 ACLOCAL_AMFLAGS = -I m4
 
-SUBDIRS = src
-
-MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
-                       config.h.in config.sub configure install-sh \
-                      ltconfig ltmain.sh missing mkinstalldirs \
-                      stamp-h.in  build-stamp configure-stamp depcomp \
-                      ecore_docs.tar.gz ecore.c \
-                      README \
-                      ecore.spec \
-                      ecore-con.pc \
-                      ecore-config.pc \
-                      ecore-desktop.pc \
-                      ecore-directfb.pc\
-                      ecore-evas.pc \
-                      ecore-fb.pc \
-                      ecore-file.pc \
-                      ecore-imf.pc \
-                      ecore-imf-evas.pc \
-                      ecore-ipc.pc \
-                      ecore-job.pc \
-                      ecore-txt.pc \
-                      ecore-x.pc \
-                      ecore-win32.pc \
-                      ecore-sdl.pc \
-                      ecore-wince.pc \
-                      ecore.pc
+SUBDIRS = doc src
+
+if HAVE_PO
+
+SUBDIRS += po
+
+endif
+
+MAINTAINERCLEANFILES = \
+ABOUT-NLS \
+Makefile.in \
+aclocal.m4 \
+config.guess \
+config.h.in \
+config.h.in~ \
+config.rpath \
+config.sub \
+configure \
+depcomp \
+install-sh \
+ltmain.sh \
+missing \
+mkinstalldirs \
+$(PACKAGE_TARNAME)-$(PACKAGE_VERSION).tar.gz \
+$(PACKAGE_TARNAME)-$(PACKAGE_VERSION).tar.bz2 \
+$(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-doc.tar.bz2 \
+m4/libtool.m4 \
+m4/lt~obsolete.m4 \
+m4/ltoptions.m4 \
+m4/ltsugar.m4 \
+m4/ltversion.m4 \
+m4/codeset.m4 \
+m4/gettext.m4* \
+m4/glibc2*.m4 \
+m4/iconv.m4 \
+m4/intdiv0.m4 \
+m4/intldir.m4 \
+m4/intl.m4 \
+m4/intlmacosx.m4 \
+m4/intmax.m4* \
+m4/inttypes_h.m4 \
+m4/inttypes.m4 \
+m4/inttypes-pri.m4 \
+m4/isc-posix.m4 \
+m4/lcmessage.m4 \
+m4/lib-ld.m4* \
+m4/lib-link.m4 \
+m4/lib-prefix.m4* \
+m4/lock.m4 \
+m4/longdouble.m4* \
+m4/longlong.m4* \
+m4/nls.m4 \
+m4/po.m4* \
+m4/printf-posix.m4* \
+m4/progtest.m4 \
+m4/signed.m4 \
+m4/size_max.m4* \
+m4/stdint_h.m4 \
+m4/uintmax_t.m4 \
+m4/ulonglong.m4* \
+m4/visibility.m4 \
+m4/wchar_t.m4 \
+m4/wint_t.m4* \
+m4/xsize.m4*
+
+if HAVE_PO
+
+MAINTAINERCLEANFILES += \
+po/boldquot.sed \
+po/en@boldquot.header \
+po/en@quot.header \
+po/insert-header.sin \
+po/Makefile.in.in* \
+po/Makevars.template \
+po/quot.sed \
+po/remove-potcdate.sin \
+po/Rules-quot*
+
+endif
 
 bin_SCRIPTS = 
 
-EXTRA_DIST = AUTHORS COPYING COPYING-PLAIN \
-            autogen.sh ecore.c.in gendoc ecore.supp \
-             Doxyfile \
-            ecore.pc.in \
-            ecore-con.pc.in \
-            ecore-config.pc.in \
-            ecore-desktop.pc.in \
-            ecore-directfb.pc.in\
-            ecore-evas.pc.in \
-            ecore-fb.pc.in \
-            ecore-file.pc.in \
-            ecore-imf.pc.in \
-            ecore-imf-evas.pc.in \
-            ecore-ipc.pc.in \
-            ecore-job.pc.in \
-            ecore-txt.pc.in \
-            ecore-x.pc.in \
-            ecore-win32.pc.in \
-            ecore-sdl.pc.in \
-            ecore-wince.pc.in \
-            ecore.spec.in ecore.spec \
-            doc gendoc
+EXTRA_DIST = \
+AUTHORS \
+COPYING \
+autogen.sh \
+ecore.supp \
+ecore.pc.in \
+ecore-con.pc.in \
+ecore-config.pc.in \
+ecore-directfb.pc.in\
+ecore-evas.pc.in \
+ecore-fb.pc.in \
+ecore-file.pc.in \
+ecore-imf.pc.in \
+ecore-imf-evas.pc.in \
+ecore-ipc.pc.in \
+ecore-x.pc.in \
+ecore-win32.pc.in \
+ecore-sdl.pc.in \
+ecore-cocoa.pc.in \
+ecore-psl1ght.pc.in \
+ecore-input.pc.in \
+ecore-wince.pc.in \
+ecore-wayland.pc.in \
+ecore.spec.in \
+ecore.spec \
+m4/ac_abstract_socket.m4 \
+m4/ac_attribute.m4 \
+m4/check_x_extension.m4 \
+m4/ecore_check_module.m4 \
+m4/ecore_check_options.m4 \
+m4/efl_doxygen.m4 \
+m4/efl_path_max.m4 \
+m4/efl_shm_open.m4 \
+m4/efl_coverage.m4 \
+m4/efl_tests.m4 \
+m4/efl_threads.m4
+
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = ecore.pc
 
 if BUILD_ECORE_CON
-pcon = ecore-con.pc
+pkgconfig_DATA += ecore-con.pc
 endif
 
 if BUILD_ECORE_CONFIG
-pconfig = ecore-config.pc
+pkgconfig_DATA += ecore-config.pc
 endif
 
 if BUILD_ECORE_DIRECTFB
-pdfb = ecore-directfb.pc
+pkgconfig_DATA += ecore-directfb.pc
 endif
 
 if BUILD_ECORE_EVAS
-pevas = ecore-evas.pc
+pkgconfig_DATA += ecore-evas.pc
 endif
 
 if BUILD_ECORE_FB
-pfb = ecore-fb.pc
+pkgconfig_DATA += ecore-fb.pc
 endif
 
 if BUILD_ECORE_FILE
-pfile = ecore-file.pc
-endif
-
-if BUILD_ECORE_DESKTOP
-pdesktop = ecore-desktop.pc
+pkgconfig_DATA += ecore-file.pc
 endif
 
 if BUILD_ECORE_IMF
-pimf = ecore-imf.pc
+pkgconfig_DATA += ecore-imf.pc
 endif
 
 if BUILD_ECORE_IMF_EVAS
-pimfevas = ecore-imf-evas.pc
+pkgconfig_DATA += ecore-imf-evas.pc
 endif
 
-if BUILD_ECORE_IPC
-pipc = ecore-ipc.pc
+if BUILD_ECORE_INPUT
+pkgconfig_DATA += ecore-input.pc
 endif
 
-if BUILD_ECORE_JOB
-pjob = ecore-job.pc
+if BUILD_ECORE_INPUT_EVAS
+pkgconfig_DATA += ecore-input-evas.pc
 endif
 
-if BUILD_ECORE_TXT
-ptxt = ecore-txt.pc
+if BUILD_ECORE_IPC
+pkgconfig_DATA += ecore-ipc.pc
 endif
 
 if BUILD_ECORE_X
-p= ecore-x.pc
+pkgconfig_DATA += ecore-x.pc
 endif
 
 if BUILD_ECORE_WIN32
-pwin32 = ecore-win32.pc
+pkgconfig_DATA += ecore-win32.pc
 endif
 
 if BUILD_ECORE_WINCE
-pwince = ecore-wince.pc
+pkgconfig_DATA += ecore-wince.pc
 endif
 
-
 if BUILD_ECORE_SDL
-psdl = ecore-sdl.pc
+pkgconfig_DATA += ecore-sdl.pc
 endif
 
-if BUILD_ECORE_X_XCB
-px = ecore-x.pc
+if BUILD_ECORE_COCOA
+pkgconfig_DATA += ecore-cocoa.pc
 endif
 
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = \
-       ecore.pc $(pcon) $(pconfig) $(pdfb) $(pevas) \
-       $(pfb) $(pfile) $(pdesktop) $(pimf) $(pimfevas) $(pipc) $(pjob) $(ptxt) \
-       $(px) $(pwin32) $(pwince) $(psdl)
+if BUILD_ECORE_PSL1GHT
+pkgconfig_DATA += ecore-psl1ght.pc
+endif
+
+if BUILD_ECORE_WAYLAND
+pkgconfig_DATA += ecore-wayland.pc
+endif
+
+.PHONY: doc coverage
+
+# Documentation
+
+doc:
+       @echo "entering doc/"
+       make -C doc doc
+
+# Unit tests
+
+if EFL_ENABLE_TESTS
+
+check-local:
+       @./src/tests/ecore_suite
+
+else
+
+check-local:
+       @echo "reconfigure with --enable-tests"
+
+endif
+
+# Coverage report
+
+if EFL_ENABLE_COVERAGE
+lcov-reset:
+       @rm -rf $(top_builddir)/coverage
+       @find $(top_builddir) -name "*.gcda" -delete
+       @lcov --zerocounters --directory $(top_builddir)
+
+lcov-report:
+       @mkdir $(top_builddir)/coverage
+       lcov --capture --compat-libtool --output-file $(top_builddir)/coverage/coverage.info --directory $(top_builddir)
+       lcov --remove $(top_builddir)/coverage/coverage.info '*.h' --output-file $(top_builddir)/coverage/coverage.cleaned.info
+       genhtml -t "$(PACKAGE_STRING)" -o $(top_builddir)/coverage/html $(top_builddir)/coverage/coverage.cleaned.info
+       @echo "Coverage Report at $(top_builddir)/coverage/html"
+
+coverage:
+       @$(MAKE) lcov-reset
+       @$(MAKE) check
+       @$(MAKE) lcov-report
+else
+lcov-reset:
+       @echo "reconfigure with --enable-coverage"
+
+lcov-report:
+       @echo "reconfigure with --enable-coverage"
+
+coverage:
+       @echo "reconfigure with --enable-tests --enable-coverage"
+endif
diff --git a/NEWS b/NEWS
index e69de29..f08395d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -0,0 +1,326 @@
+Ecore 1.8.0
+
+Changes since Ecore 1.7.0:
+--------------------------
+
+Additions:
+    * ecore_con:
+     - Add Ecore_Con_Eet API to help using Eet_Data with Ecore_Con.
+    * ecore_x:
+     - ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP.
+     - ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN.
+     - ecore_x_input_raw_select.
+     - +ecore_x_selection_converter_text.
+     - ECORE_X_RAW_MOTION, ECORE_X_RAW_BUTTON_PRESS and ECORE_X_RAW_BUTTON_RELEASE.
+    * ecore_imf:
+     - ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SIGNIN.
+     - ECORE_IMF_PREEDIT_TYPE_SUB4~7 style.
+    * ecore_evas:
+     - Wayland SHM engine now features a mechanism to synchronize rendering with
+       the compositor, removing the tearing effect in animations when using that
+       engine.
+
+Fixes:
+    * ecore_con_url:
+     - Timeouts are handled correctly now (passing HTTP status 408 to
+       completion callback).
+     - properly reschedule call to curl.
+    * ecore_evas rotation handling on some driver implementations
+    * ecore_file_escape_name() escape taba nd newline right.
+    * ecore_imf ibus module potential segv fixed.
+    * ecore_thread_feedback() memory allocation and corruption fixed.
+    * ecore_x:
+     - ecore_x_image_is_argb32_get() returns correctly given endianness.
+     - ecore_x_randr to actually return outputs properly.
+     - ecore_x_randr to actually return crtcs properly.
+     - ecore_x_randr to actually return crtcs possible outputs properly.
+     - ecore_x_randr to actually return crtcs outputs properly.
+
+Improvements:
+
+Ecore 1.7.0
+
+Changes since Ecore 1.2.0:
+--------------------------
+
+Additions:
+    * ecore:
+     - Add ecore_main_fd_handler_file_add()
+     - Add ecore_fork_reset()
+    * ecore_evas:
+     - Add transparency support on Windows (GDI engine only)
+     - Add API functions to get/set an Ecore_Evas's profile.
+    * ecore_x:
+     - Add Ecore_X_Error_Code enumeration
+     - ECORE_X_RANDR_OUTPUT_POLICY_ASK
+     - Add API functions to get/set an Ecore_X window's profile
+    * ecore_con:
+     - ECORE_{CON,IPC}_NO_PROXY now available for disabling proxying on certain connections
+     - New dns.c resolver backend for faster dns lookups
+    * immodule:
+     - Add immodule for supporing ibus
+
+Fixes:
+    * ecore
+     - Prevent running out of fd when cycling ecore_init/ecore_shutdown.
+     - Reduce rounding error in ecore_animator_pos_map.
+     - Send mouse move event before mouse down event in ecore_extn
+     - Reduce race condition on shutdown of Ecore_Thread.
+     - Force cancel of all running Ecore_Thread on shutdown.
+     - Make Ecore_Thread work reliably when called without a running main loop.
+     - Correctly shutdown Ecore_Thread.
+     - Fix usage of FD_SET and al. when fd_set pointers are NULL (Windows)
+     - Fix ecore_thread seg fault on Windows where PHS() was returning a wrong value
+     - Always call evas_render_update_free to prevent leak in Ecore_Evas X bakcend.
+
+    * ecore_x
+     - Fix unitialized Ecore_X_Atom use.
+
+
+Ecore 1.2.0
+
+Changes since Ecore 1.1.0:
+--------------------------
+
+Additions:
+    * ecore
+     - ecore_timer_reset()
+    * ecore_con
+     - ecore_con_socks api
+     - ecore_con_ssl_server_verify_name_set/get
+     - ecore_con_ssl_server_cafile_add() now accepts directories
+     - ECORE_CON_REMOTE_CORK
+     - ecore_con_url_proxy_set()
+     - ecore_con_url_timeout_set()
+     - ecore_con_url_proxy_username_set()
+     - ecore_con_url_proxy_password_set()
+     - ecore_con_url_http_version_set()
+     - ecore_con_url_status_code_get()
+    * ecore_x:
+     - ecore_x_randr_output_backlight_available()
+     - ecore_x_randr_window_crtcs_get()
+     - Add ability to get resource id of last x error
+     - get keycode from keyname
+     - ecore_x_randr_mode_add()
+     - ecore_x_randr_mode_del()
+     - ecore_x_randr_output_mode_add()
+     - ecore_x_randr_output_mode_del()
+     - Add indicator controls
+     - ecore_x_netwm_icons_set()
+     - ecore_x_illume_clipboard_state_set()
+     - ecore_x_illume_clipboard_state_get()
+     - ecore_x_illume_clipboard_geometry_set()
+     - ecore_x_illume_clipboard_geometry_get()
+     - Add indicator rotation and transparency controls
+    * ecore_evas:
+     - Add Shm and Egl engines for ecore_evas to draw in Wayland.
+     - Add Socket and Plug to draw other process area.
+     - Ability to set pointer for wayland support
+     - Add override_set support on Windows XP
+     - ecore_evas_window_group_set()
+     - ecore_evas_window_group_get()
+     - ecore_evas_aspect_set()
+     - ecore_evas_aspect_get()
+     - ecore_evas_urgent_set()
+     - ecore_evas_urgent_get()
+     - ecore_evas_modal_set()
+     - ecore_evas_modal_get()
+     - ecore_evas_demand_attention_set()
+     - ecore_evas_demand_attention_get()
+     - ecore_evas_focus_skip_set()
+     - ecore_evas_focus_skip_get()
+     - ecore_evas_callback_state_change_set()
+    * ecore_wayland
+     - Add Ecore_Wayland (backend to support Wayland).
+    * ecore_imf
+     - ecore_imf_context_event_callback_add()
+     - ecore_imf_context_event_callback_del()
+     - ecore_imf_context_event_callback_call()
+     - ecore_imf_context_input_panel_imdata_set()
+     - ecore_imf_context_input_panel_imdata_get()
+     - ecore_imf_context_input_panel_return_key_type_set()
+     - ecore_imf_context_input_panel_return_key_type_get()
+     - ecore_imf_context_input_panel_return_key_disabled_set()
+     - ecore_imf_context_input_panel_return_key_disabled_get()
+     - ecore_imf_context_input_panel_caps_lock_mode_set()
+     - ecore_imf_context_input_panel_caps_lock_mode_get()
+     - add XIM attribute support
+     - add HEX, TERMINAL and PASSWORD layouts
+     - panel-specific data set/get
+     - panel show/hide
+     - set return key type or disable return on panel
+    * ecore_win32:
+     - ecore_win32_focus()
+     - ecore_win32_focus_get()
+     - ecore_win32_window_focus()
+     - ecore_win32_window_focus_get()
+    * ecore_wince:
+     - ecore_wince_focus()
+     - ecore_wince_focus_get()
+     - ecore_wince_window_focus()
+     - ecore_wince_window_focus_get()
+    * ecore_wayland:
+     - Add wayland support to ecore
+
+Fixes:
+    * ecore:
+     - animator adding another animator that adds another animator ... loop.
+     - possible leak related to g_static_mutex's on some architectures.
+     - stop leaking signal events
+    * ecore_thread:
+     - ecore_thread_feedback_run now handle try_no_queue the way it logically should.
+     - prevent double free that could cause crash when an Ecore_Thread stop.
+    * ecore_x:
+     - ecore_x_randr_modes_info_get does not cut off the trailing '\0' anymore.
+     - possible 0 byte allocation.
+    * ecore_win32/wince:
+     - do not autorepeat Ctrl, Shift, Alt and Win keys.
+     - Check control charater and convert into printing character
+    * ecore_con:
+     - fix case where SSL certificates not being used.
+     - post data corruption due to it not being copied to the con struct.
+    * ecore_evas:
+     - mouse down count handling when grabs happen.
+     - ecore_evas_fb support works again now with keyboard input
+    * ecore_file:
+     - do not limit downloads to 30sec with ecore_file_download().
+    * ecore_fb:
+     - bring ecore_fb back to a working state
+
+Improvements:
+    * ecore:
+     - most allocations moved to mempools
+     - ecore_thread rewrite to use eina_lock and other ecore infra
+    * ecore_con:
+     - certificates can now be added for STARTTTLS
+    * ecore_win32:
+     - fix modifiers value on Windows XP
+    * ecore_thread:
+     - use eina_lock
+     - use Ecore thread safe async call
+    * ecore_evas:
+     - use Evas buffer backend for SDL software engine
+     - clean up ecore-evas-buffer code somewhat
+
+Deprecations:
+    * ecore_x:
+     - ecore_x_randr_crtc_current_get()
+
+Removal:
+    * ecore_win32:
+     - ecore_win32_focus_set()
+
+Ecore 1.1.0
+
+Changes since Ecore 1.0.0:
+--------------------------
+
+Additions:
+
+    * ecore:
+     - ecore_thread_reschedule()
+     - ecore_exe_data_set()
+     - ecore_animator_timeline_add()
+     - ecore_timer_dump()
+     - custom ecore animator tick mode and support
+     - ecore_pipe_freeze/thaw()
+     - ecore_pipe_wait()
+     - ecore_throttle()
+     - ecore_main_loop_thread_safe_call_async()
+     - ecore_main_loop_thread_safe_call_sync()
+     - ecore_thread_main_loop_begin()
+     - ecore_thread_main_loop_end()
+
+    * ecore_con:
+     - ECORE_CON_EVENT_CLIENT_ERROR, ECORE_CON_EVENT_SERVER_ERROR events
+     - Ecore_Con_Event_Server_Error, Ecore_Con_Event_Client_Error types
+     - ecore_con_client_port_get()
+     - ecore_con_url_ssl_verify_peer_set()
+     - ecore_con_url_ssl_ca_set()
+     - ecore_con_url_pipeline_set()
+     - ecore_con_url_pipeline_get()
+     - ecore_con_ssl_client/server_upgrade()
+     - ECORE_CON_CLIENT/SERVER_UPGRADE events
+     - ecore_con_server_timeout_get/set()
+     - ecore_con_ssl_server_verify_basic()
+     - ecore_con_url_url_get()
+     - ecore_con_server_fd_get()
+     - ecore_con_client_fd_get()
+     - ECORE_CON_EVENT_CLIENT_WRITE, ECORE_CON_EVENT_SERVER_WRITE events
+
+    * ecore_evas:
+     - ecore_evas_screen_geometry_get()
+     - ecore_cocoa_evas support
+
+    * ecore_file:
+     - ecore_file_download_full()
+
+    * ecore_imf:
+     - ecore_imf_context_canvas_get()
+     - ecore_imf_context_window_get()
+     - ecore_imf_context_preedit_string_with_attributes_get()
+     - added controls for auto-capitalization and prediction controls
+     - ecore_imf_context_input_panel_enabled_set/get()
+     - ecore_imf_context_cursor_location_set()
+
+    * ecore_x:
+     - ecore_x_randr_edid_*()
+     - ecore_x_randr_screen_backlight_*()
+     - more ecore_x_sync api controls to support ecore_evas
+     - shape input setting support added
+     - ecore_x_screen_size_get()
+
+Fixes:
+
+    * https failing via curl
+    * removed SIGRT handling as it was broken anyway and unused
+    * space key handling in ecore_wince/ecore_win32 support
+    * wince background erasing
+    * 300 second timeout to handle slow or large downloads in ecore_con
+    * ecore_file inotify fd's to not be inherited by forked children
+    * ecore_file compilation if ecore_con and curl disabled
+    * crash in ecore_con_ssl when attempting connections on dead socket
+    * ecore-evas interceptor not handling override-redirect
+    * ecore_con_url_ftp_upload to complete uploads always
+    * window removal from ignore_list in ecore_x
+    * bug in ecore_evas when setting modifiers for sub buffer canvases
+    * NULL pointer dereference in ecore_x selection notification code
+    * sync GNUTLS thread activation with eina changes
+    * ecore_ipc compilation on Windows
+    * fix Shift, Control, Alt and AltGr keys detection on Windows XP
+    * "mouse-down inside and mouse-up outside" issue on Windows
+    * ecore_x shadow tree search fixed to respect shape input of windows
+    * fd handlers fixed when idler callbacks add jobs or events
+    * ecore_x_selection_convert takes length into account
+    * security issue in openssl certificate verification
+    * gnutls server client certificate verification
+    * epoll delete of fd handling in forked child
+    * grouping of timers that go off very close to each other go off together
+    * generic event buffer handling in ecore_x fixed
+    * use current size not requested size when getting geom in ecore-evas
+    * ecore_cocoa now handles windows correctly
+    * ecore_file_download error handling when ecore_con_url_get fails
+    * focus and mouse-in initial state on some ecore-evas back-ends
+
+Improvements:
+
+    * reduced memory needed for list of fd's in ecore by using inlist
+    * ecore_evas now is able to send render-done even if not syncing to comp
+    * more safety checks in ecore_con are support
+    * ecore timer monotonic clock now supported on OSX
+    * make ecore_con work on Windows
+    * improve resize/move on Windows
+    * improve keyboard management on Windows XP
+    * refactored _ecore_main_loop_iterate_internal
+    * better safety with ecore_evas_ecore_evas_get
+    * ecore-evas produces more errors on stderr when errors happen now
+    * ecore-con works on IPv6 now
+    * inet_ntop instead of getnameinfo for ecore_con_client_get_ip
+    * ecore-con unit tests added
+    * ecore-evas fb uses ecore_input_evas now instead of going direct
+    * fix ecore-evas x changing of override support if window not shown yet
+
+Removals:
+
+    * xrender evas engine support removed from ecore_evas (api still there)
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..e9cedf3
--- /dev/null
+++ b/README
@@ -0,0 +1,98 @@
+Ecore 1.7.99
+
+******************************************************************************
+
+ FOR ANY ISSUES PLEASE EMAIL:
+ enlightenment-devel@lists.sourceforge.net
+  
+******************************************************************************
+  
+Requirements:
+-------------
+
+Must:
+  libc
+  eina (1.1.0 or better)
+  (For windows you also need: evil)
+  
+Recommended:
+  libX11
+  libXext
+  libXcursor
+  libXprint
+  libXinerama
+  libXrandr
+  libXss
+  libXrender
+  libXcomposite
+  libXfixes
+  libXdamage
+  libXdpms
+  libXtest
+  GNUTLS or OpenSSL
+  CURL
+  evas (1.1.0 or better)
+
+Optional:
+  XCB (fully working)
+  SDL
+  DirectFB
+  glib
+  tslib
+
+Ecore is a clean and tiny event loop library with many modules to do
+lots of convenient things for a programmer, to save time and effort.
+
+It's small and lean, designed to work on embedded systems all the way
+to large and powerful multi-cpu workstations. It serialises all system
+signals, events etc. into a single event queue, that is easily
+processed without needing to worry about concurrency. A properly
+written, event-driven program using this kind of programming doesn't
+need threads, nor has to worry about concurrency. It turns a program
+into a state machine, and makes it very robust and easy to follow.
+
+Ecore gives you other handy primitives, such as timers to tick over
+for you and call specified functions at particular times so the
+programmer can use this to do things, like animate, or time out on
+connections or tasks that take too long etc.
+
+Idle handlers are provided too, as well as calls on entering an idle
+state (often a very good time to update the state of the program). All
+events that enter the system are passed to specific callback functions
+that the program sets up to handle those events. Handling them is
+simple and other Ecore modules produce more events on the queue,
+coming from other sources such as file descriptors etc.
+
+Ecore also help you work in a multi threaded environment and setup a
+thread pool that help you use the EFL on multi-cpu system. It help split
+the part that can't be called outside of the ecore main loop from the
+computation heavy function that could run on another CPU. Be aware that
+Evas and most of Ecore API is not thread safe and should only be called
+in the main loop. Eina and Eet could be used, if done carefully, in any
+heavy function on another cpu.
+
+Ecore also lets you have functions called when file descriptors become
+active for reading or writing, allowing for streamlined, non-blocking
+IO.
+
+------------------------------------------------------------------------------
+COMPILING AND INSTALLING:
+
+  ./configure
+  make
+(as root unless you are installing in your users directories):
+  make install
+      
+------------------------------------------------------------------------------
+NOTE:
+
+You can experience main loop lock (and more likely see UI lock) if libcurl
+doesn't use an asynchronous dns resolver. Since Curl 7.21.0, you can use the
+native dns resolver asynchronously by turning  --enable-threaded-resolver
+on during configure time. For older version, C-Ares is the way to solve that
+issue (see: http://c-ares.haxx.se/ ).
+
+Also the wayland support (ecore_wayland) is considered experimental as
+wayland itself is still unstable and liable to change core protocol.
+If you use this api, it is possible it will break in future, until this
+notice is removed.
index 995ff2f..81e1956 100755 (executable)
@@ -3,14 +3,38 @@
 rm -rf autom4te.cache
 rm -f aclocal.m4 ltmain.sh
 
-touch README
+touch ABOUT-NLS
 
+echo "Running autopoint..." ; autopoint -f || :
 echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1
 echo "Running autoheader..." ; autoheader || exit 1
 echo "Running autoconf..." ; autoconf || exit 1
 echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1
 echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1
 
+W=0
+
+rm -f config.cache-env.tmp
+echo "OLD_PARM=\"$@\"" >> config.cache-env.tmp
+echo "OLD_CFLAGS=\"$CFLAGS\"" >> config.cache-env.tmp
+echo "OLD_PATH=\"$PATH\"" >> config.cache-env.tmp
+echo "OLD_PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\"" >> config.cache-env.tmp
+echo "OLD_LDFLAGS=\"$LDFLAGS\"" >> config.cache-env.tmp
+echo "OLD_CXXFLAGS=\"$CXXFLAGS\"" >> config.cache-env.tmp
+
+cmp config.cache-env.tmp config.cache-env >> /dev/null
+if [ $? -ne 0 ]; then
+       W=1;
+fi
+
+if [ $W -ne 0 ]; then
+       echo "Cleaning configure cache...";
+       rm -f config.cache config.cache-env
+       mv config.cache-env.tmp config.cache-env
+else
+       rm -f config.cache-env.tmp
+fi
+
 if [ -z "$NOCONFIGURE" ]; then
-       ./configure "$@"
+       ./configure -C "$@"
 fi
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..2a6c8d7
--- /dev/null
@@ -0,0 +1,2271 @@
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+m4_define([v_maj], [1])
+m4_define([v_min], [7])
+m4_define([v_mic], [99])
+m4_define([v_rev], m4_esyscmd([(svnversion "${SVN_REPO_PATH:-.}" | grep -v '\(export\|Unversioned directory\)' || echo 0) | awk -F : '{printf("%s\n", $1);}' | tr -d ' :MSP\n' | sed 's/Unversioneddirectory/0/' | tr -d '\n']))
+m4_if(v_rev, [0], [m4_define([v_rev], m4_esyscmd([git log 2> /dev/null | (grep -m1 git-svn-id || echo 0) | sed -e 's/.*@\([0-9]*\).*/\1/' | tr -d '\n']))])
+##--   When released, remove the dnl on the below line
+dnl m4_undefine([v_rev])
+##--   When doing snapshots - change soname. remove dnl on below line
+dnl m4_define([relname], [ver-pre-svn-07])
+dnl m4_define([v_rel], [-release relname])
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+m4_ifdef([v_rev], [m4_define([v_ver], [v_maj.v_min.v_mic.v_rev])], [m4_define([v_ver], [v_maj.v_min.v_mic])])
+m4_define([lt_cur], m4_eval(v_maj + v_min))
+m4_define([lt_rev], v_mic)
+m4_define([lt_age], v_min)
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+
+AC_INIT([ecore], [v_ver], [enlightenment-devel@lists.sourceforge.net])
+AC_PREREQ([2.52])
+AC_CONFIG_SRCDIR([configure.ac])
+AC_CONFIG_MACRO_DIR([m4])
+
+AC_CONFIG_HEADERS([config.h])
+AH_TOP([
+#ifndef EFL_CONFIG_H__
+#define EFL_CONFIG_H__
+])
+AH_BOTTOM([
+#endif /* EFL_CONFIG_H__ */
+])
+
+AM_INIT_AUTOMAKE([1.6 dist-bzip2])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+AC_GNU_SOURCE
+
+AC_LIBTOOL_WIN32_DLL
+define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl
+AC_PROG_LIBTOOL
+
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+m4_ifdef([v_rev], , [m4_define([v_rev], [0])])
+m4_ifdef([v_rel], , [m4_define([v_rel], [])])
+AC_DEFINE_UNQUOTED(VERS_MAJ, [v_maj], [Major version])
+AC_DEFINE_UNQUOTED(VERS_MIN, [v_min], [Minor version])
+AC_DEFINE_UNQUOTED(VERS_MIC, [v_mic], [Micro version])
+AC_DEFINE_UNQUOTED(VERS_REV, [v_rev], [Revison])
+version_info="lt_cur:lt_rev:lt_age"
+release_info="v_rel"
+AC_SUBST(version_info)
+AC_SUBST(release_info)
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
+VMAJ=v_maj
+AC_SUBST(VMAJ)
+
+AM_GNU_GETTEXT_VERSION(0.17)
+
+m4_ifdef([AM_GNU_GETTEXT], [
+AM_GNU_GETTEXT([external])
+po_makefile_in=po/Makefile.in
+have_po="yes"
+],[
+have_po="no"
+])
+AC_SUBST(LTLIBINTL)
+
+if test "x${POSUB}" = "x" ; then
+   have_po="no"
+fi
+
+AM_CONDITIONAL([HAVE_PO], [test "x${have_po}" = "xyes"])
+
+with_max_log_level="<unset>"
+AC_ARG_WITH(internal-maximum-log-level,
+   [AC_HELP_STRING([--with-internal-maximum-log-level=NUMBER],
+                   [limit ecore internal log level to the given number, any call to EINA_LOG() with values greater than this will be compiled out, ignoring runtime settings, but saving function calls.])],
+   [
+    if test "x${withval}" != "xno"; then
+       if echo "${withval}" | grep -E '^[[0-9]]+$' >/dev/null 2>/dev/null; then
+          AC_MSG_NOTICE([ignoring any EINA_LOG() with level greater than ${withval}])
+          AC_DEFINE_UNQUOTED(EINA_LOG_LEVEL_MAXIMUM, ${withval}, [if set, logging is limited to this amount.])
+          with_max_log_level="${withval}"
+       else
+          AC_MSG_ERROR([--with-internal-maximum-log-level takes a decimal number, got "${withval}" instead.])
+       fi
+    fi
+    ], [:])
+
+
+### Default options with respect to host
+
+AC_CANONICAL_BUILD
+AC_CANONICAL_HOST
+
+# dependencies and options
+want_curl="no"
+want_local_sockets="yes"
+want_abstract_sockets="no"
+want_gnutls="no"
+want_openssl="no"
+want_cares="no"
+want_cipher="no"
+want_signature="no"
+want_poll="yes"
+want_inotify="no"
+want_notify_win32="no"
+want_tslib="no"
+want_glib="no"
+
+# core modules
+want_ecore_con="yes"
+want_ecore_con_eet="yes"
+want_ecore_ipc="yes"
+want_ecore_file="yes"
+#want_ecore_config="no"
+want_ecore_imf="no"
+want_ecore_input="yes"
+
+# graphic system modules
+want_evas_simple_x11="no"
+want_ecore_x_xcb="no"
+want_ecore_x="no"
+want_ecore_win32="no"
+want_ecore_cocoa="no"
+want_ecore_sdl="no"
+want_ecore_psl1ght="no"
+want_ecore_fb="no"
+want_ecore_directfb="no"
+want_ecore_wince="no"
+want_ecore_wayland="no"
+
+# ecore_x options (both xlib and xcb)
+want_ecore_x_composite="yes"
+want_ecore_x_damage="yes"
+want_ecore_x_dpms="yes"
+want_ecore_x_randr="yes"
+want_ecore_x_render="yes"
+want_ecore_x_screensaver="yes"
+want_ecore_x_shape="yes"
+want_ecore_x_gesture="no"
+want_ecore_x_sync="yes"
+want_ecore_x_xfixes="yes"
+want_ecore_x_xinerama="yes"
+want_ecore_x_xprint="yes"
+want_ecore_x_xtest="yes"
+want_ecore_x_cursor="yes"
+want_ecore_x_input="yes"
+want_ecore_x_dri="yes"
+
+# ecore_evas modules
+want_ecore_evas="yes"
+want_ecore_evas_software_buffer="yes"
+want_ecore_evas_software_x11="no"
+want_ecore_evas_opengl_x11="no"
+want_ecore_evas_software_16_x11="no"
+want_ecore_evas_software_8_x11="no"
+want_ecore_evas_software_xcb="no"
+want_ecore_evas_software_gdi="no"
+want_ecore_evas_software_ddraw="no"
+want_ecore_evas_direct3d="no"
+want_ecore_evas_opengl_glew="no"
+want_ecore_evas_software_16_ddraw="no"
+want_ecore_evas_software_sdl="no"
+want_ecore_evas_gl_sdl="no"
+want_ecore_evas_gl_cocoa="no"
+want_ecore_evas_psl1ght="no"
+want_ecore_evas_directfb="no"
+want_ecore_evas_fb="no"
+want_ecore_evas_software_16_wince="no"
+want_ecore_evas_ews="yes"
+want_ecore_evas_extn="yes"
+want_ecore_evas_wayland_shm="no"
+want_ecore_evas_wayland_egl="no"
+
+# ecore_imf modules
+want_ecore_imf_xim="no"
+want_ecore_imf_scim="no"
+want_ecore_imf_ibus="no"
+
+case "$host_os" in
+   mingw32ce*)
+      want_ecore_con="no"
+      want_ecore_con_eet="no"
+      want_ecore_ipc="no"
+      want_ecore_wince="yes"
+      want_ecore_evas_software_16_wince="yes"
+      want_ecore_evas_extn="no"
+      ;;
+   mingw*)
+      want_notify_win32="yes"
+      want_curl="yes"
+      want_glib="auto"
+      want_gnutls="auto"
+      want_openssl="auto"
+      want_ecore_imf="yes"
+      want_ecore_win32="yes"
+      want_ecore_evas_software_gdi="yes"
+      want_ecore_evas_software_ddraw="yes"
+      want_ecore_evas_direct3d="yes"
+      want_ecore_evas_opengl_glew="yes"
+      want_ecore_evas_software_16_ddraw="auto"
+      want_ecore_evas_software_sdl="yes"
+      want_ecore_evas_gl_sdl="yes"
+      ;;
+   darwin*)
+      want_curl="yes"
+      want_glib="auto"
+      want_gnutls="auto"
+      want_openssl="auto"
+      want_ecore_imf="yes"
+      want_ecore_cocoa="yes"
+      want_ecore_evas_software_sdl="yes"
+      want_ecore_evas_gl_sdl="yes"
+      want_ecore_evas_gl_cocoa="yes"
+      ;;
+   *)
+      want_curl="yes"
+      want_glib="auto"
+      want_abstract_sockets="yes"
+      want_gnutls="auto"
+      want_openssl="auto"
+      want_cipher="yes"
+      want_signature="yes"
+      want_inotify="yes"
+      want_tslib="yes"
+      want_ecore_fb="yes"
+      want_ecore_imf="yes"
+      want_ecore_x="yes"
+      want_ecore_wayland="yes"
+      want_ecore_evas_software_x11="yes"
+      want_ecore_evas_opengl_x11="yes"
+      want_ecore_evas_software_16_x11="yes"
+      want_ecore_evas_software_8_x11="yes"
+      want_ecore_evas_software_xcb="no"
+      want_ecore_evas_software_sdl="yes"
+      want_ecore_evas_gl_sdl="yes"
+      want_ecore_evas_gl_cocoa="no"
+      want_ecore_evas_directfb="yes"
+      want_ecore_evas_fb="yes"
+      want_ecore_evas_wayland_shm="yes"
+      want_ecore_evas_wayland_egl="yes"
+      want_ecore_imf_xim="yes"
+      want_ecore_imf_scim="yes"
+      want_ecore_imf_ibus="yes"
+      ;;
+esac
+
+case "$host_vendor" in
+  ps3*)
+      want_local_sockets="no"
+      ;;
+esac
+requirements_ecore=""
+requirements_ecore_con=""
+#requirements_ecore_config=""
+requirements_ecore_directfb=""
+requirements_ecore_evas=""
+requirements_ecore_fb=""
+requirements_ecore_file=""
+requirements_ecore_imf=""
+requirements_ecore_imf_evas=""
+requirements_ecore_input=""
+requirements_ecore_input_evas=""
+requirements_ecore_ipc=""
+requirements_ecore_cocoa=""
+requirements_ecore_sdl=""
+requirements_ecore_psl1ght=""
+requirements_ecore_x=""
+requirements_ecore_win32=""
+requirements_ecore_wince=""
+requirements_ecore_imf_xim=""
+requirements_ecore_imf_scim=""
+requirements_ecore_imf_ibus=""
+requirements_ecore_wayland=""
+
+### Additional options to configure
+
+want_glib_integration_always=no
+AC_ARG_ENABLE(glib-integration-always,
+  AC_HELP_STRING([--enable-glib-integration-always], [enable glib integration when ecore_init() is called always]),
+  [want_glib_integration_always=$enableval])
+
+if test "x${want_glib_integration_always}" = "xyes" ; then
+  AC_DEFINE([GLIB_INTEGRATION_ALWAYS], [1], [Always integrate glib if support compiled])
+  want_glib=yes
+fi
+
+want_g_main_loop=no
+AC_ARG_ENABLE(g-main-loop,
+  AC_HELP_STRING([--enable-g-main-loop], [ecore_main_loop based on g_main_loop]),
+  [want_g_main_loop=$enableval])
+
+if test "x${want_g_main_loop}" = "xyes" ; then
+  AC_DEFINE([USE_G_MAIN_LOOP], [1], [Use g_main_loop in ecore])
+  want_glib=yes
+fi
+
+if test "x${want_glib_integration_always}" = "xyes" -a "x${want_g_main_loop}" = "xyes"; then
+  AC_MSG_ERROR([--enable-glib-integration-always and --enable-glib-main-loop are mutually exclusive])
+fi
+
+# local sockets (ecore_con.c)
+AC_ARG_ENABLE([local-sockets],
+   [AC_HELP_STRING([--disable-local-sockets], [disable local sockets.])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_ecore_con_local_sockets="yes"
+    else
+       want_ecore_con_local_sockets="no"
+    fi
+   ],
+   [want_ecore_con_local_sockets=${want_local_sockets}])
+
+if test "x${want_ecore_con_local_sockets}" = "xyes" ; then
+   AC_DEFINE([HAVE_LOCAL_SOCKETS], [1], [Have local sockets support])
+fi
+
+# abstract sockets (ecore_con.c)
+AC_ARG_ENABLE([abstract-sockets],
+   [AC_HELP_STRING([--disable-abstract-sockets], [disable abstract sockets.])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_ecore_con_abstract_sockets="yes"
+    else
+       want_ecore_con_abstract_sockets="no"
+    fi
+   ],
+   [want_ecore_con_abstract_sockets=${want_abstract_sockets}])
+
+if test "x${want_ecore_con_abstract_sockets}" = "xyes" ; then
+   AC_DEFINE([HAVE_ABSTRACT_SOCKETS], [1], [Have abstract sockets namespace])
+fi
+
+# Simple X11 build/link
+
+AC_ARG_ENABLE(simple-x11,
+  AC_HELP_STRING([--enable-simple-x11], [enable simple x11 linking]),
+  [want_evas_simple_x11=$enableval])
+
+# XIM
+AC_ARG_ENABLE([xim],
+   [AC_HELP_STRING([--disable-xim], [disable X Input Method.])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_xim="yes"
+    else
+       want_xim="no"
+    fi
+   ],
+   [want_xim="yes"])
+
+if test "x${want_xim}" = "xyes" ; then
+   AC_DEFINE([ENABLE_XIM], [1], [Enable X Input Method])
+fi
+
+### Checks for programs
+
+m4_ifdef([AC_PROG_OBJC],
+   [
+    AC_PROG_OBJC
+    _AM_DEPENDENCIES(OBJC)
+   ],
+   [
+    AC_CHECK_TOOL([OBJC], [gcc])
+    AC_SUBST([OBJC])
+    AC_SUBST([OBJCFLAGS])
+   ])
+m4_ifndef([am__fastdepOBJC], [
+    AM_CONDITIONAL([am__fastdepOBJC], [false])
+])
+
+AC_PROG_CXX
+AC_PROG_CC_C99
+if test "x${ac_cv_prog_cc_c99}" = "xno" ; then
+   AC_MSG_ERROR([ecore requires a c99-capable compiler])
+fi
+
+have_gnu_objc=${ac_cv_objc_compiler_gnu}
+
+# doxygen program for documentation building
+
+EFL_CHECK_DOXYGEN([build_doc="yes"], [build_doc="no"])
+
+m4_ifdef([v_mic],
+   [
+    EFL_COMPILER_FLAG([-Wall])
+    EFL_COMPILER_FLAG([-W])
+   ])
+
+# The first call to PKG_CHECK_MODULES is done conditionally,
+# so we should include this here:
+PKG_PROG_PKG_CONFIG
+
+# Check whether pkg-config supports Requires.private
+if $PKG_CONFIG --atleast-pkgconfig-version 0.22; then
+   pkgconfig_requires_private="Requires.private"
+else
+   pkgconfig_requires_private="Requires"
+fi
+AC_SUBST(pkgconfig_requires_private)
+
+### Checks for some build time option
+have_backtrace="no"
+AC_CHECK_FUNCS([backtrace], [have_backtrace="yes"], [])
+
+want_ecore_timer_dump="no"
+
+AC_ARG_ENABLE([ecore-timer-dump],
+   [AC_HELP_STRING([--disable-ecore-timer-dump], [disable tracking of timer allocation. @<:@default=enable@:>@])],
+   [want_ecore_timer_dump=$enableval], [])
+
+if test "x$want_ecore_timer_dump" = "xyes" -a "x$have_backtrace" = "xyes"; then
+   AC_DEFINE(WANT_ECORE_TIMER_DUMP, [1], [Want Ecore_Timer dump infrastructure])
+fi
+
+### Checks for libraries
+
+# Evil library for compilation on Windows
+
+case "$host_os" in
+   mingw*)
+      PKG_CHECK_MODULES([EVIL], [evil >= 1.6.99])
+      AC_DEFINE(HAVE_EVIL, 1, [Set to 1 if Evil library is installed])
+      requirements_ecore="evil ${requirements_ecore}"
+      requirements_ecore_evas="evil ${requirements_ecore_evas}"
+      requirements_ecore_file="evil ${requirements_ecore_file}"
+      requirements_ecore_imf="evil ${requirements_ecore_imf}"
+      requirements_ecore_imf_evas="evil ${requirements_ecore_imf_evas}"
+      EFL_ECORE_BUILD="-DEFL_ECORE_BUILD"
+      EFL_ECORE_CON_BUILD="-DEFL_ECORE_CON_BUILD"
+      EFL_ECORE_EVAS_BUILD="-DEFL_ECORE_EVAS_BUILD"
+      EFL_ECORE_FILE_BUILD="-DEFL_ECORE_FILE_BUILD"
+      EFL_ECORE_IMF_BUILD="-DEFL_ECORE_IMF_BUILD"
+      EFL_ECORE_IMF_EVAS_BUILD="-DEFL_ECORE_IMF_EVAS_BUILD"
+      EFL_ECORE_INPUT_BUILD="-DEFL_ECORE_INPUT_BUILD"
+      EFL_ECORE_INPUT_EVAS_BUILD="-DEFL_ECORE_INPUT_EVAS_BUILD"
+      EFL_ECORE_IPC_BUILD="-DEFL_ECORE_IPC_BUILD"
+      ;;
+esac
+
+have_win32=""
+have_wince=""
+case "$host_os" in
+   mingw32ce* | cegcc*)
+      EFL_ECORE_WINCE_BUILD="-DEFL_ECORE_WINCE_BUILD"
+      requirements_ecore_wince="evil ${requirements_ecore_wince}"
+      have_wince="yes"
+      ;;
+   mingw*)
+      EFL_ECORE_WIN32_BUILD="-DEFL_ECORE_WIN32_BUILD"
+      EFL_ECORE_SDL_BUILD="-DEFL_ECORE_SDL_BUILD"
+      requirements_ecore_win32="evil ${requirements_ecore_win32}"
+      requirements_ecore_sdl="evil ${requirements_ecore_sdl}"
+      have_win32="yes"
+      ;;
+esac
+
+have_ps3=""
+case "$host_vendor" in
+  ps3*)
+      have_ps3="yes"
+      PKG_CHECK_MODULES([ESCAPE], [escape])
+      CFLAGS="$CFLAGS $ESCAPE_CFLAGS"
+      AC_DEFINE(HAVE_ESCAPE, 1, [Set to 1 if Escape library is installed])
+      EFL_ECORE_PSL1GHT_BUILD="-DEFL_ECORE_PSL1GHT_BUILD"
+      requirements_ecore="escape ${requirements_ecore}"
+      requirements_ecore_evas="escape ${requirements_ecore_evas}"
+      requirements_ecore_file="escape ${requirements_ecore_file}"
+      requirements_ecore_imf="escape ${requirements_ecore_imf}"
+      requirements_ecore_imf_evas="escape ${requirements_ecore_imf_evas}"
+      requirements_ecore_sdl="escape ${requirements_ecore_sdl}"
+      want_ecore_psl1ght="yes"
+      want_ecore_evas_psl1ght="yes"
+      ;;
+esac
+
+
+### Checks for portability layer
+
+PKG_CHECK_MODULES([EXOTIC],
+   [exotic],
+   [enable_exotic="yes"],
+   [enable_exotic="no"])
+
+if test "x${enable_exotic}" = "xyes"; then
+    requirements_ecore="exotic ${requirements_ecore}"
+
+    AC_DEFINE([HAVE_EXOTIC], [1], [Define to 1 if you have Exotic.])
+fi
+AM_CONDITIONAL([ECORE_HAVE_EXOTIC], [test "x${enable_exotic}" = "xyes"])
+
+AC_SUBST(EFL_ECORE_BUILD)
+AC_SUBST(EFL_ECORE_CON_BUILD)
+AC_SUBST(EFL_ECORE_EVAS_BUILD)
+AC_SUBST(EFL_ECORE_FILE_BUILD)
+AC_SUBST(EFL_ECORE_IMF_BUILD)
+AC_SUBST(EFL_ECORE_IMF_EVAS_BUILD)
+AC_SUBST(EFL_ECORE_INPUT_BUILD)
+AC_SUBST(EFL_ECORE_INPUT_EVAS_BUILD)
+AC_SUBST(EFL_ECORE_IPC_BUILD)
+AC_SUBST(EFL_ECORE_WINCE_BUILD)
+AC_SUBST(EFL_ECORE_WIN32_BUILD)
+AC_SUBST(EFL_ECORE_SDL_BUILD)
+AC_SUBST(EFL_ECORE_PSL1GHT_BUILD)
+
+AM_CONDITIONAL(ECORE_HAVE_WINCE, test "x${have_wince}" = "xyes")
+AM_CONDITIONAL(ECORE_HAVE_WIN32, test "x${have_win32}" = "xyes")
+AM_CONDITIONAL(ECORE_HAVE_PS3, test "x${have_ps3}" = "xyes")
+
+WIN32_LIBS=""
+case "$host_os" in
+   mingw32ce* | cegcc*)
+      WIN32_LIBS="-lws2"
+      dlopen_libs="-ldl"
+      ;;
+   mingw*)
+      WIN32_LIBS="-lws2_32"
+      dlopen_libs="-ldl"
+      ;;
+   *)
+      AC_CHECK_LIB([c], [dlopen],
+         [],
+         [AC_CHECK_LIB([dl], [dlopen],
+             [dlopen_libs=-ldl])
+         ])
+      AC_CHECK_LIB([c], [clock_gettime],
+         [AC_DEFINE(HAVE_CLOCK_GETTIME, [1], [Have clock_gettime()])],
+         [AC_CHECK_LIB([rt], [clock_gettime],
+             [
+              rt_libs=-lrt
+              AC_DEFINE(HAVE_CLOCK_GETTIME, [1], [Have clock_gettime()])
+             ])
+         ])
+      ;;
+esac
+AC_SUBST(WIN32_LIBS)
+AC_SUBST(dlopen_libs)
+AC_SUBST(rt_libs)
+
+# Eina library
+
+PKG_CHECK_MODULES(EINA, [eina >= 1.6.99])
+#FIXME check all the requirements when the eina move will be finished
+requirements_ecore="eina >= 1.6.99 ${requirements_ecore}"
+requirements_ecore_con="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_con}"
+#requirements_ecore_config="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_config}"
+requirements_ecore_directfb="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_directfb}"
+requirements_ecore_evas="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_evas}"
+requirements_ecore_fb="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_fb}"
+requirements_ecore_file="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_file}"
+requirements_ecore_imf="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_imf}"
+requirements_ecore_imf_evas="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_imf_evas}"
+requirements_ecore_input="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_input}"
+requirements_ecore_input_evas="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_input_evas}"
+requirements_ecore_ipc="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_ipc}"
+requirements_ecore_cocoa="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_cocoa}"
+requirements_ecore_sdl="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_sdl}"
+requirements_ecore_psl1ght="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_sdl}"
+requirements_ecore_win32="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_win32}"
+requirements_ecore_wince="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_wince}"
+requirements_ecore_x="ecore >= 1.6.99 eina >= 1.6.99 ${requirements_ecore_x}"
+
+
+# glib support (main loop integration)
+AC_ARG_ENABLE([glib],
+   [AC_HELP_STRING([--disable-glib], [disable glib support. @<:@default=detect@:>@])],
+   [want_glib=$enableval], [])
+
+if test "x$want_glib" != "xno"; then
+   PKG_CHECK_MODULES([GLIB], [glib-2.0], [have_glib="yes"], [have_glib="no"])
+else
+   have_glib="no"
+fi
+if test "x$want_glib" = "xyes" -a "x$have_glib" = "xno"; then
+   AC_MSG_ERROR([GLib support requested, but no GLib found by pkg-config.])
+elif test "x$have_glib" = "xyes"; then
+   AC_DEFINE(HAVE_GLIB, [1], [Have GLib])
+   requirements_ecore="glib-2.0 ${requirements_ecore}"
+fi
+
+
+# SDL library (ecore_sdl)
+
+have_sdl="no"
+PKG_CHECK_MODULES([SDL], [sdl >= 1.2.0], [have_sdl="yes"], [have_sdl="no"])
+if test "x${have_sdl}" != "xyes" ; then
+   SDL_CONFIG="sdl-config"
+   AC_ARG_WITH([sdl-config],
+      [AC_HELP_STRING([--with-sdl-config=PATH], [use sdl-config specified])],
+      [
+       SDL_CONFIG=$withval
+       AC_MSG_NOTICE([using ${SDL_CONFIG} for sdl-config])
+      ])
+
+   AC_PATH_PROG([SDL_CONFIG], ["sdl-config"], [""], [$PATH])
+
+   if test -n "$SDL_CONFIG" ; then
+      SDL_CFLAGS=`$SDL_CONFIG --cflags`
+      SDL_LIBS=`$SDL_CONFIG --libs`
+      AC_SUBST(SDL_CFLAGS)
+      AC_SUBST(SDL_LIBS)
+      have_sdl="yes"
+   fi
+fi
+
+if test "x${have_sdl}" = "xyes" ; then
+   PKG_CHECK_EXISTS([sdl >= 1.3.0],
+      [AC_DEFINE(BUILD_ECORE_EVAS_SDL_130, 1, [Support for SVN SDL])])
+fi
+
+
+# DirectFB library (ecore_directfb)
+
+PKG_CHECK_MODULES([DIRECTFB],
+   [directfb >= 0.9.16],
+   [have_directfb="yes"],
+   [have_directfb="no"])
+
+
+# Eet library (ecore_config)
+
+PKG_CHECK_MODULES([EET],
+   [eet >= 1.6.99],
+   [have_eet="yes"],
+   [have_eet="no"])
+
+# Xlib and XCB (ecore_x)
+
+AC_CHECK_DECL([MAXHOSTNAMELEN], [FOUND_MAXHOSTNAMELEN=yes])
+
+if test "x${FOUND_MAXHOSTNAMELEN}" != "xyes" ; then
+   AC_MSG_CHECKING([for header that defines MAXHOSTNAMELEN])
+   FOUND_MAXHOSTNAMELEN="not found"
+
+   AC_COMPILE_IFELSE(
+      [
+       AC_LANG_PROGRAM(
+          [[
+#include <sys/param.h>
+          ]],
+          [[
+int h = MAXHOSTNAMELEN;
+          ]])
+      ],
+      [
+       FOUND_MAXHOSTNAMELEN="sys/param.h"
+       AC_DEFINE([NEED_SYS_PARAM_H], [1], [Define to 1 if you need <sys/param.h> to define MAXHOSTNAMELEN])
+      ])
+
+   AC_COMPILE_IFELSE(
+      [
+       AC_LANG_PROGRAM(
+          [[
+#include <netdb.h>
+          ]],
+          [[
+int h = MAXHOSTNAMELEN;
+          ]])
+      ],
+      [
+       FOUND_MAXHOSTNAMELEN="netdb.h"
+       AC_DEFINE([NEED_NETDB_H], [1], [Define to 1 if you need <netdb.h> to define MAXHOSTNAMELEN])
+      ])
+
+   AC_MSG_RESULT([$FOUND_MAXHOSTNAMELEN])
+fi
+
+have_x="no"
+have_ecore_x="no"
+have_ecore_x_xlib="no"
+have_ecore_x_xcb="no"
+
+x_dir="";
+x_includes="";
+x_cflags="";
+x_libs="";
+
+ecore_x_libs_private=""
+
+AC_ARG_ENABLE(ecore-x-composite,
+   [AC_HELP_STRING([--disable-ecore-x-composite],
+       [disable the ecore_x support for Xcomposite extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_composite=$enableval])
+
+AC_ARG_ENABLE(ecore-x-damage,
+   [AC_HELP_STRING([--disable-ecore-x-damage],
+       [disable the ecore_x support for Xdamage extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_damage=$enableval])
+
+AC_ARG_ENABLE(ecore-x-dpms,
+   [AC_HELP_STRING([--disable-ecore-x-dpms],
+       [disable the ecore_x support for Xdpms extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_dpms=$enableval])
+
+AC_ARG_ENABLE(ecore-x-randr,
+   [AC_HELP_STRING([--disable-ecore-x-randr],
+       [disable the ecore_x support for Xrandr extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_randr=$enableval])
+
+AC_ARG_ENABLE(ecore-x-render,
+   [AC_HELP_STRING([--disable-ecore-x-render],
+       [disable the ecore_x support for Xrender extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_render=$enableval])
+
+AC_ARG_ENABLE(ecore-x-screensaver,
+   [AC_HELP_STRING([--disable-ecore-x-screensaver],
+       [disable the ecore_x support for Xscreensaver extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_screensaver=$enableval])
+
+AC_ARG_ENABLE(ecore-x-shape,
+   [AC_HELP_STRING([--disable-ecore-x-shape],
+       [disable the ecore_x support for Xshape extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_shape=$enableval])
+
+AC_ARG_ENABLE(ecore-x-gesture,
+   [AC_HELP_STRING([--enable-ecore-x-gesture],
+       [enable the ecore_x support for Xgesture extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_gesture=$enableval])
+
+AC_ARG_ENABLE(ecore-x-sync,
+   [AC_HELP_STRING([--disable-ecore-x-sync],
+       [disable the ecore_x support for Xsync extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_sync=$enableval])
+
+AC_ARG_ENABLE(ecore-x-xfixes,
+   [AC_HELP_STRING([--disable-ecore-x-xfixes],
+       [disable the ecore_x support for Xfixes extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_xfixes=$enableval])
+
+AC_ARG_ENABLE(ecore-x-xinerama,
+   [AC_HELP_STRING([--disable-ecore-x-xinerama],
+       [disable the ecore_x support for Xinerama extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_xinerama=$enableval])
+
+AC_ARG_ENABLE(ecore-x-xprint,
+   [AC_HELP_STRING([--disable-ecore-x-xprint],
+       [disable the ecore_x support for Xprint extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_xprint=$enableval])
+
+AC_ARG_ENABLE(ecore-x-xtest,
+   [AC_HELP_STRING([--disable-ecore-x-xtest],
+       [disable the ecore_x support for Xtest extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_xtest=$enableval])
+
+AC_ARG_ENABLE(ecore-x-cursor,
+   [AC_HELP_STRING([--disable-ecore-x-cursor],
+       [disable the ecore_x support for Xcursor extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_cursor=$enableval])
+
+AC_ARG_ENABLE(ecore-x-input,
+   [AC_HELP_STRING([--disable-ecore-x-input],
+       [disable the ecore_x support for Xinput/Xinput2 extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_input=$enableval])
+
+AC_ARG_ENABLE(ecore-x-dri,
+   [AC_HELP_STRING([--disable-ecore-x-dri],
+       [disable the ecore_x support for DRI extension.
+        @<:@default=detect@:>@])],
+   [want_ecore_x_dri=$enableval])
+
+AC_ARG_ENABLE(ecore-x-xcb,
+   [AC_HELP_STRING([--enable-ecore-x-xcb],
+       [enable the ecore_x module with XCB backend. @<:@default=disabled@:>@])],
+   [want_ecore_x_xcb=$enableval])
+
+AC_MSG_CHECKING(whether ecore_x with XCB backend is to be built)
+AC_MSG_RESULT($want_ecore_x_xcb)
+
+if test "x$want_ecore_x_xcb" = "xyes" ; then
+
+  AC_MSG_CHECKING([keysym definitions])
+  KEYSYMDEFDIR=`$PKG_CONFIG --variable=includedir xproto`/X11
+  FILES="keysymdef.h XF86keysym.h Sunkeysym.h DECkeysym.h HPkeysym.h"
+  for i in $FILES; do
+      if test -f "$KEYSYMDEFDIR/$i"; then
+        KEYSYMDEFS="$KEYSYMDEFS $KEYSYMDEFDIR/$i"
+      elif test "x$i" = "xkeysymdef.h"; then
+        AC_MSG_ERROR([Cannot find keysymdef.h])
+      fi
+  done
+  AC_MSG_RESULT([$KEYSYMDEFS])
+  AC_SUBST(KEYSYMDEFS)
+
+  have_iconv="no"
+  AC_ARG_WITH([iconv-link],
+    AC_HELP_STRING([--with-iconv-link=ICONV_LINK], [explicitly specify an iconv link option]),
+      [
+        LIBS="$withval $LIBS"
+        have_iconv="yes"
+      ])
+
+  AC_MSG_CHECKING(for explicit iconv link options)
+  if test "x${iconv_libs}" = "x" ; then
+    AC_MSG_RESULT([no explicit iconv link option])
+  else
+    AC_MSG_RESULT([$iconv_libs])
+  fi
+
+  if test "x${have_iconv}" = "xno" ; then
+    AC_CHECK_HEADERS([iconv.h], [have_iconv="yes"])
+
+    if test "x${have_iconv}" = "xyes" ; then
+      AC_MSG_CHECKING([whether iconv() is in libc])
+
+      AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+        [[
+          #include <stdlib.h>
+          #include <iconv.h>
+        ]],
+        [[
+          iconv_t ic;
+          size_t count = iconv(ic, NULL, NULL, NULL, NULL);
+        ]])],
+        [have_iconv="yes"],
+        [have_iconv="no"])
+
+      AC_MSG_RESULT([${have_iconv}])
+    fi
+
+    if test "x${have_iconv}" = "xno" ; then
+      AC_MSG_CHECKING([whether iconv() is in libiconv.a])
+
+      LIBS_save="${LIBS}"
+      LIBS="-liconv $LIBS"
+      AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+        [[
+          #include <stdlib.h>
+          #include <iconv.h>
+        ]],
+        [[
+          iconv_t ic;
+          size_t count;
+          count = iconv(ic, NULL, NULL, NULL, NULL);
+        ]])],
+        [have_iconv="yes"],
+        [
+          have_iconv="no"
+          LIBS=${LIBS_save}
+        ])
+
+      AC_MSG_RESULT([${have_iconv}])
+    fi
+
+    if test "x${have_iconv}" = "xno" ; then
+      AC_MSG_CHECKING([whether iconv() is in libiconv_plug.a])
+
+      LIBS_save="${LIBS}"
+      LIBS="-liconv_plug $LIBS"
+      AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+      [[
+        #include <stdlib.h>
+        #include <iconv.h>
+      ]],
+      [[
+        iconv_t ic;
+        size_t count = iconv(ic, NULL, NULL, NULL, NULL);
+      ]])],
+      [have_iconv="yes"],
+      [
+        have_iconv="no"
+        LIBS=${LIBS_save}
+      ])
+
+      AC_MSG_RESULT([${have_iconv}])
+    fi
+
+    if test "x${have_iconv}" = "xyes" ; then
+      AC_DEFINE([HAVE_ICONV], [1], [Set to 1 if iconv library is installed])
+    fi
+  fi
+
+  PKG_CHECK_MODULES(ECORE_XCB, x11-xcb xcb xcb-shm xcb-event xcb-icccm >= 0.3.8 xcb-util >= 0.3.8 xcb-image xcb-keysyms >= 0.3.8,
+    [ have_ecore_x_xcb="yes"
+      requirements_ecore_x="x11-xcb xcb xcb-shm xcb-event xcb-icccm xcb-util xcb-image xcb-keysyms ${requirements_ecore_x}"
+    ],
+    [ 
+       PKG_CHECK_MODULES(ECORE_XCB, x11-xcb xcb xcb-event xcb-shm xcb-icccm xcb-image xcb-keysyms, 
+         [ have_ecore_x_xcb="yes"
+           AC_DEFINE(OLD_XCB_VERSION, 1, [xcb version])
+           requirements_ecore_x="x11-xcb xcb xcb-event xcb-shm xcb-icccm xcb-image xcb-keysyms ${requirements_ecore_x}" ],
+         [ have_ecore_x_xcb="no" ])
+    ], 
+    [have_ecore_x_xcb="no" ])
+
+  if test "x$have_ecore_x_xcb" = "xyes" ; then
+
+   PKG_CHECK_MODULES([PIXMAN],
+      [pixman-1],
+      [
+       have_pixman="yes"
+       AC_DEFINE(HAVE_PIXMAN, 1, [have pixman for rendering])
+       requirements_ecore_x="pixman-1 ${requirements_ecore_x}"
+      ],
+      [
+       if test "x${want_pixman}" = "xyes" -a "x${use_strict}" = "xyes" ; then
+          AC_MSG_ERROR([Pixman not found (strict dependencies checking)])
+       fi
+      ])
+
+    if test "x$want_ecore_x_composite" != "xno"; then
+      PKG_CHECK_MODULES(XCB_COMPOSITE, xcb-composite,
+        [ have_ecore_x_xcb_composite="yes"
+          requirements_ecore_x="xcb-composite ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_COMPOSITE, 1, [Build support for XCB composite]) ],
+        [ have_ecore_x_xcb_composite="no" ])
+    else
+      have_ecore_x_xcb_composite="no"
+      AC_MSG_NOTICE("composite extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_damage" != "xno"; then
+      PKG_CHECK_MODULES(XCB_DAMAGE, xcb-damage,
+        [ have_ecore_x_xcb_damage="yes"
+          requirements_ecore_x="xcb-damage ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_DAMAGE, 1, [Build support for XCB damage]) ],
+        [ have_ecore_x_xcb_damage="no" ])
+    else
+      have_ecore_x_xcb_damage="no"
+      AC_MSG_NOTICE("damage extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_dpms" != "xno"; then
+      PKG_CHECK_MODULES(XCB_DPMS, xcb-dpms,
+        [ have_ecore_x_xcb_dpms="yes"
+          requirements_ecore_x="xcb-dpms ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_DPMS, 1, [Build support for XCB dpms]) ],
+        [ have_ecore_x_xcb_dpms="no" ])
+    else
+      have_ecore_x_xcb_dpms="no"
+      AC_MSG_NOTICE("dpms extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_randr" != "xno"; then
+      PKG_CHECK_MODULES(XCB_RANDR, xcb-randr,
+        [ have_ecore_x_xcb_randr="yes"
+          requirements_ecore_x="xcb-randr ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_RANDR, 1, [Build support for XCB randr]) ],
+        [ have_ecore_x_xcb_randr="no" ])
+    else
+      have_ecore_x_xcb_randr="no"
+      AC_MSG_NOTICE("randr extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_render" != "xno"; then
+      PKG_CHECK_MODULES(XCB_RENDER, xcb-render xcb-renderutil,
+        [ have_ecore_x_xcb_render="yes"
+          requirements_ecore_x="xcb-render xcb-renderutil ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_RENDER, 1, [Build support for XCB render]) ],
+        [ have_ecore_x_xcb_render="no" ])
+    else
+      have_ecore_x_xcb_render="no"
+      AC_MSG_NOTICE("render extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_screensaver" != "xno"; then
+      PKG_CHECK_MODULES(XCB_SCREENSAVER, xcb-screensaver,
+        [ have_ecore_x_xcb_screensaver="yes"
+          requirements_ecore_x="xcb-screensaver ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_SCREENSAVER, 1, [Build support for XCB screensaver]) ],
+        [ have_ecore_x_xcb_screensaver="no" ])
+    else
+      have_ecore_x_xcb_screensaver="no"
+      AC_MSG_NOTICE("screensaver extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_shape" != "xno"; then
+      PKG_CHECK_MODULES(XCB_SHAPE, xcb-shape,
+        [ have_ecore_x_xcb_shape="yes"
+          requirements_ecore_x="xcb-shape ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_SHAPE, 1, [Build support for XCB shape]) ],
+        [ have_ecore_x_xcb_shape="no" ])
+    else
+      have_ecore_x_xcb_shape="no"
+      AC_MSG_NOTICE("shape extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_gesture" != "xno"; then
+      PKG_CHECK_MODULES(XCB_XGESTURE, xcb-gesture,
+        [ have_ecore_x_xcb_gesture="yes"
+          requirements_ecore_x="xcb-gesture ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_XGESTURE, 1, [Build support for XCB gesture]) ],
+        [ have_ecore_x_xcb_gesture="no" ])
+    else
+      have_ecore_x_xcb_gesture="no"
+      AC_MSG_NOTICE("gesture extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_sync" != "xno"; then
+      PKG_CHECK_MODULES(XCB_SYNC, xcb-sync,
+        [ have_ecore_x_xcb_sync="yes"
+          requirements_ecore_x="xcb-sync ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_SYNC, 1, [Build support for XCB sync]) ],
+        [ have_ecore_x_xcb_sync="no" ])
+    else
+      have_ecore_x_xcb_sync="no"
+      AC_MSG_NOTICE("sync extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_xfixes" != "xno"; then
+      PKG_CHECK_MODULES(XCB_XFIXES, xcb-xfixes,
+        [ have_ecore_x_xcb_xfixes="yes"
+          requirements_ecore_x="xcb-xfixes ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_XFIXES, 1, [Build support for XCB xfixes]) ],
+        [ have_ecore_x_xcb_xfixes="no" ])
+    else
+      have_ecore_x_xcb_xfixes="no"
+      AC_MSG_NOTICE("xfixes extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_xinerama" != "xno"; then
+      PKG_CHECK_MODULES(XCB_XINERAMA, xcb-xinerama,
+        [ have_ecore_x_xcb_xinerama="yes"
+          requirements_ecore_x="xcb-xinerama ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_XINERAMA, 1, [Build support for XCB xinerama]) ],
+        [ have_ecore_x_xcb_xinerama="no" ])
+    else
+      have_ecore_x_xcb_xinerama="no"
+      AC_MSG_NOTICE("xinerama extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_xprint" != "xno"; then
+      PKG_CHECK_MODULES(XCB_XPRINT, xcb-xprint,
+        [ have_ecore_x_xcb_xprint="yes"
+          requirements_ecore_x="xcb-xprint ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_XPRINT, 1, [Build support for XCB xprint]) ],
+        [ have_ecore_x_xcb_xprint="no" ])
+    else
+      have_ecore_x_xcb_xprint="no"
+      AC_MSG_NOTICE("xprint extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_xtest" != "xno"; then
+      PKG_CHECK_MODULES(XCB_XTEST, xcb-xtest,
+        [ have_ecore_x_xcb_xtest="yes"
+          requirements_ecore_x="xcb-xtest ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_XTEST, 1, [Build support for XCB xtest]) ],
+        [ have_ecore_x_xcb_xtest="no" ])
+    else
+      have_ecore_x_xcb_xtest="no"
+      AC_MSG_NOTICE("xtest extension explicitly disabled")
+    fi
+
+# input extension disabled currently in xcb as xcb-input has some issues
+    want_ecore_x_input="no"
+    if test "x$want_ecore_x_input" != "xno"; then
+      PKG_CHECK_MODULES(XCB_XINPUT, xcb-xinput,
+        [ have_ecore_x_xcb_xinput="yes"
+          requirements_ecore_x="xcb-xinput ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_XINPUT, 1, [Build support for XCB xinput]) ],
+        [ have_ecore_x_xcb_xinput="no" ])
+    else
+      have_ecore_x_xcb_xinput="no"
+      AC_MSG_NOTICE("xinput extension explicitly disabled")
+    fi
+
+    if test "x$want_ecore_x_cursor" != "xno"; then
+      PKG_CHECK_MODULES(XCB_CURSOR, xcb-render xcb-renderutil,
+        [ have_ecore_x_xcb_cursor="yes"
+          requirements_ecore_x="xcb-render xcb-renderutil ${requirements_ecore_x}"
+          AC_DEFINE(ECORE_XCB_CURSOR, 1, [Build support for XCB cursor]) ],
+        [ have_ecore_x_xcb_cursor="no" ])
+    else
+      have_ecore_x_xcb_cursor="no"
+      AC_MSG_NOTICE("cursor extension explicitly disabled")
+    fi
+
+#    if test "x$want_ecore_x_dri" != "xno"; then
+#      PKG_CHECK_MODULES(XCB_DRI, xcb-dri2,
+#        [ have_ecore_x_xcb_dri="yes"
+#          requirements_ecore_x="xcb-dri2 ${requirements_ecore_x}"
+#          AC_DEFINE(ECORE_XCB_DRI, 1, [Build support for XCB dri/dri2]) ],
+#        [ have_ecore_x_xcb_dri="no" ])
+#    else
+#      have_ecore_x_xcb_dri="no"
+#      AC_MSG_NOTICE("dri extension explicitly disabled")
+#    fi
+
+    AC_DEFINE(HAVE_ECORE_X_XCB, 1, [Defined to 1 if XCB is enabled.])
+
+    x_cflags=$ECORE_XCB_CFLAGS
+    x_libs=$ECORE_XCB_LIBS
+    have_x="yes"
+
+    have_ecore_x_xcb_define="-DHAVE_ECORE_X_XCB"
+    AC_SUBST(have_ecore_x_xcb_define)
+  fi
+fi
+
+if ! test "x$have_ecore_x_xcb" = "xyes" ; then
+  AC_PATH_XTRA
+  AC_CHECK_HEADER(X11/X.h,
+    [
+     if test "x$want_evas_simple_x11" = "xyes"; then
+       x_libs="${x_libs} -lX11 -lXext"
+     else
+       x_dir=${x_dir:-/usr/X11R6}
+       x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}}
+       x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext"
+     fi
+     have_ecore_x_xlib="yes"
+    ]
+  )
+
+  if test "x$have_ecore_x_xlib" = "xyes"; then
+    Xcursor_libs=""
+    Xcursor_cflags=""
+    use_Xcursor="no"
+    PCFLAGS=$CFLAGS
+    CFLAGS="$x_cflags $x_includes"
+
+    if test "x$want_ecore_x_cursor" = "xyes"; then
+      AC_CHECK_HEADER(X11/Xcursor/Xcursor.h,
+        [
+          AC_CHECK_LIB(Xcursor, XcursorImageLoadCursor,
+            [
+              AC_DEFINE(ECORE_XCURSOR, 1, [Build support for Xcursor])
+              Xcursor_cflags=""
+              Xcursor_libs="-lXcursor"
+              use_Xcursor="yes"
+            ], [
+              Xcursor_cflags=""
+              Xcursor_libs=""
+              use_Xcursor="no"
+            ], [
+              $x_libs -lXrender
+            ]
+          )
+        ], [
+          Xcursor_cflags=""
+          Xcursor_libs=""
+          use_Xcursor="no"
+        ], [
+          #include <X11/Xlib.h>
+        ]
+      )
+      CFLAGS=$PCFLAGS
+    else
+      Xcursor_cflags=""
+      Xcursor_libs=""
+      use_Xcursor="no"
+      AC_MSG_NOTICE("Xcursor explicitly disabled")
+    fi
+
+    AC_SUBST(Xcursor_cflags)
+    AC_SUBST(Xcursor_libs)
+
+    ECORE_CHECK_X_EXTENSION([Xkb], [XKB.h], [X11], [XkbSetDetectableAutoRepeat], [$want_ecore_x_xkb])
+    ECORE_CHECK_X_EXTENSION([Xcomposite], [Xcomposite.h], [Xcomposite], [XCompositeQueryExtension], [$want_ecore_x_composite])
+    ECORE_CHECK_X_EXTENSION([Xdamage], [Xdamage.h], [Xdamage], [XDamageSubtract], [$want_ecore_x_damage])
+    ECORE_CHECK_X_EXTENSION([Xdpms], [dpms.h], [Xdpms], [DPMSQueryExtension], [$want_ecore_x_dpms])
+    if test "x$use_xdpms" = "xno" ; then
+      ECORE_CHECK_X_EXTENSION([Xdpms], [dpms.h], [Xext], [DPMSQueryExtension], [$want_ecore_x_dpms])
+    fi
+    ECORE_CHECK_X_EXTENSION([Xfixes], [Xfixes.h], [Xfixes], [XFixesExpandRegion], [$want_ecore_x_xfixes])
+    ECORE_CHECK_X_EXTENSION([Xinerama], [Xinerama.h], [Xinerama], [XineramaQueryScreens], [$want_ecore_x_xinerama])
+    ECORE_CHECK_X_EXTENSION([Xprint], [Print.h], [Xp], [XpQueryScreens], [$want_ecore_x_xprint])
+    ECORE_CHECK_X_EXTENSION([Xrandr], [Xrandr.h], [Xrandr], [XRRGetScreenResourcesCurrent], [$want_ecore_x_randr])
+    ECORE_CHECK_X_EXTENSION([Xgesture], [gesture.h], [Xgesture], [XGestureQueryExtension], [$want_ecore_x_gesture])
+    ECORE_CHECK_X_EXTENSION([Xrender], [Xrender.h], [Xrender], [XRenderFindVisualFormat], [$want_ecore_x_render])
+    ECORE_CHECK_X_EXTENSION([Xtest], [XTest.h], [Xtst], [XTestFakeKeyEvent], [$want_ecore_x_xtest])
+    ECORE_CHECK_X_EXTENSION([Xss], [scrnsaver.h], [Xss], [XScreenSaverSelectInput], [$want_ecore_x_screensaver])
+    ECORE_CHECK_X_EXTENSION([Xi2], [XInput2.h], [Xi], [XIQueryDevice], [$want_ecore_x_input])
+    ECORE_CHECK_X_EXTENSION([Xi2_2], [XInput2.h], [Xi], [XIGrabTouchBegin], [$want_ecore_x_input])
+
+    ecore_x_libs_private="${Xcursor_libs} ${XKB_LIBS} ${XCOMPOSITE_LIBS} ${XGESTURE_LIBS} ${XDAMAGE_LIBS} ${XDPMS_LIBS} ${XFIXES_LIBS} ${XINERAMA_LIBS} ${XPRINT_LIBS} ${XRANDR_LIBS} ${XRENDER_LIBS} ${XTEST_LIBS} ${XSS_LIBS} ${XI2_LIBS}"
+
+    AC_DEFINE(HAVE_ECORE_X_XLIB, 1, [Defined to 1 if Xlib is enabled.])
+    have_x="yes"
+
+    have_ecore_x_xlib="yes"
+  fi
+fi
+
+AC_SUBST(x_cflags)
+AC_SUBST(x_includes)
+AC_SUBST(x_libs)
+AC_SUBST(ecore_x_libs_private)
+
+AM_CONDITIONAL(BUILD_ECORE_X_XLIB, test $have_ecore_x_xlib = yes)
+AM_CONDITIONAL(BUILD_ECORE_X_XCB, test $have_ecore_x_xcb = yes)
+
+
+# Evas library (ecore_config, ecore_input_evas, ecore_imf_evas and ecore_evas)
+
+PKG_CHECK_MODULES([EVAS], [evas >= 1.6.99],
+   [have_evas="yes"],
+   [have_evas="no"])
+
+
+### Checks for header files
+
+AC_CHECK_HEADERS([sys/select.h sys/prctl.h])
+
+EFL_CHECK_PATH_MAX
+
+AC_HEADER_SYS_WAIT
+AC_SYS_LARGEFILE
+
+have_addrinfo="no"
+case "$host_os" in
+   mingw* | cegcc*)
+      AC_DEFINE(HAVE_DLFCN_H, 1, [Define to 1 if you have the <dlfcn.h> header file.])
+      AC_DEFINE(HAVE_SYS_MMAN_H, 1, [Define to 1 if you have the <sys/mman.h> header file.])
+      AC_DEFINE(HAVE_SYS_TIME_H, 1, [Define to 1 if you have the <sys/time.h> header file.])
+      have_addrinfo="yes"
+      ;;
+   *)
+      AC_CHECK_HEADERS([dlfcn.h features.h langinfo.h locale.h sys/time.h sys/mman.h signal.h sys/resource.h])
+      ;;
+esac
+
+# ecore_con
+
+AC_CHECK_HEADERS([sys/socket.h])
+AC_CHECK_HEADERS([net/if.h], [], [],
+[
+#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+])
+AC_CHECK_HEADERS([sys/un.h], [], [],
+[
+#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+])
+AC_CHECK_HEADERS([arpa/inet.h arpa/nameser.h netinet/tcp.h netinet/in.h ws2tcpip.h netdb.h errno.h])
+
+if test "x${ac_cv_header_netdb_h}" = "xyes" ; then
+   have_addrinfo="yes"
+fi
+
+# Framebuffer (ecore_fb)
+have_fb="no"
+AC_CHECK_HEADER([linux/fb.h],
+   [AC_CHECK_HEADER([linux/input.h], [have_fb="yes"])])
+
+# Cocoa header files (ecore_cocoa)
+
+if test "x${want_ecore_cocoa}" = "xyes" ; then
+   cocoa_ldflags=""
+   have_cocoa="no"
+   m4_ifdef([AC_PROG_OBJC],
+      [
+       if test "x${have_gnu_objc}" = "xyes" ; then
+          AC_LANG_PUSH([Objective C])
+          LIBS_save="$LIBS"
+          LIBS="$LIBS -framework Cocoa"
+          AC_LINK_IFELSE(
+             [AC_LANG_PROGRAM(
+                 [[
+#include <Cocoa/Cocoa.h>
+                 ]],
+                 [[
+NSWindow *window;
+window = [[NSWindow alloc]
+           initWithContentRect:NSMakeRect(0, 0, 1, 1)
+           styleMask:(NSTitledWindowMask)
+           backing:NSBackingStoreBuffered
+           defer:NO
+           screen:nil
+         ];
+                 ]])],
+             [
+              have_cocoa="yes"
+              cocoa_ldflags="-framework Cocoa"
+             ],
+             [have_cocoa="no"])
+          LIBS="$LIBS_save"
+          AC_MSG_CHECKING([whether Cocoa framework is supported])
+          AC_MSG_RESULT([${have_cocoa}])
+          AC_LANG_POP([Objective C])
+       fi
+   ])
+fi
+AC_SUBST(cocoa_ldflags)
+
+want_epoll=yes
+AC_ARG_ENABLE(epoll,
+  AC_HELP_STRING([--enable-epoll], [enable or disable epoll support]),
+  [want_epoll=$enableval])
+
+if test "x${want_epoll}" = "xyes" ; then
+  # check for epoll support
+  AC_CHECK_HEADERS([sys/epoll.h])
+fi
+
+# timerfd_create
+AC_CHECK_HEADERS([sys/timerfd.h])
+AC_CHECK_FUNCS(timerfd_create)
+
+# thread support
+
+EFL_CHECK_THREADS(
+   [
+    if test "x${_efl_have_posix_threads}" = "xyes" ; then
+       have_threads="POSIX"
+    else
+       if test "x${_efl_have_win32_threads}" = "xyes" ; then
+          have_threads="Win32"
+       else
+          have_threads="no"
+       fi
+    fi
+   ],
+   [have_threads="no"])
+
+### enable thread safety if we have threads, unless specifically asked not to
+if test "x${have_threads}" = "xno"
+then
+  want_thread_safety="no"
+else
+  want_thread_safety="no"  # to be changed to yes when ready
+  AC_ARG_ENABLE(thread-safety,
+    AC_HELP_STRING([--enable-thread-safety], [enable or disable thread safety]),
+    [want_thread_safety=$enableval])
+fi
+
+if test "x${want_thread_safety}" = "xyes"
+then
+   AC_DEFINE([HAVE_THREAD_SAFETY], [1], [Define to enable thread safety])
+fi
+
+### Checks for types
+AC_CHECK_SIZEOF(int, 4)
+AC_CHECK_SIZEOF(long, 4)
+
+
+### Checks for structures
+
+
+### Checks for compiler characteristics
+AC_PROG_CC_STDC
+AC_C_CONST
+AC_C_BIGENDIAN
+AC_HEADER_STDC
+AC_C___ATTRIBUTE__
+
+WIN32_CPPFLAGS=""
+WIN32_CFLAGS=""
+case "$host_os" in
+   mingw32ce*)
+      WIN32_CPPFLAGS="-D_WIN32_WCE=0x0420"
+      ;;
+   cegcc*)
+      WIN32_CPPFLAGS="-D_WIN32_WCE=0x0420"
+      WIN32_CFLAGS="-mwin32"
+      ;;
+   mingw*)
+      WIN32_CPPFLAGS="-D_WIN32_WINNT=0x0501"
+      ;;
+esac
+AC_SUBST(WIN32_CPPFLAGS)
+AC_SUBST(WIN32_CFLAGS)
+
+
+### Checks for linker characteristics
+
+# use --enable-auto-import on Windows
+
+lt_enable_auto_import=""
+case "$host_os" in
+   mingw* | cegcc*)
+      lt_enable_auto_import="-Wl,--enable-auto-import"
+      ;;
+esac
+AC_SUBST(lt_enable_auto_import)
+
+### Checks for library functions
+AC_ISC_POSIX
+AC_FUNC_ALLOCA
+AC_CHECK_FUNCS([gettimeofday strlcpy execvp])
+
+AC_COMPILE_IFELSE(
+   [AC_LANG_PROGRAM(
+       [[
+#include <math.h>
+       ]],
+       [[
+int i = isfinite(0);
+       ]])],
+   [
+    AC_DEFINE(HAVE_ISFINITE, 1, [Define to 1 if you have `isfinite', as a function or macro.])
+    have_isfinite="yes"
+   ],
+   [have_isfinite="no"])
+
+AC_MSG_CHECKING([for isfinite])
+AC_MSG_RESULT([${have_isfinite}])
+
+have_atfile_source=auto
+AC_ARG_ENABLE([atfile-source],
+   [AC_HELP_STRING([--disable-atfile-source],
+       [disable use of atfile source functions as openat and mkdirat @<:@default=detect@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       have_atfile_source="yes"
+    else
+       have_atfile_source="no"
+    fi],
+   [have_atfile_source=auto])
+
+if ! test "x${have_atfile_source}" = "xno" ; then
+   AC_CHECK_FUNCS(mkdirat,
+      [
+       have_atfile_source="yes"
+       AC_DEFINE(HAVE_ATFILE_SOURCE, 1, [mkdirat exists])
+      ],
+      [
+       if test "x${have_atfile_source}" = "xyes" ; then
+          AC_MSG_ERROR([required atfile-source but no mkdirat()])
+       fi
+       have_atfile_source="no"
+      ])
+fi
+
+# shm_open
+EFL_CHECK_SHM_OPEN([have_shm_open="yes"], [have_shm_open="no"])
+
+### Checks for optionnal feature
+AC_CHECK_FUNC([mallinfo],
+   [
+    have_mallinfo="yes"
+    AC_DEFINE(HAVE_MALLINFO, 1, [Gather memory statistic])
+   ],
+   [have_mallinfo="no"])
+
+### Ecore modules
+
+## Core modules
+
+# ecore_con
+ECORE_CHECK_MODULE([con], [${want_ecore_con}], [Con], [${have_addrinfo}])
+
+have_curl="no"
+have_gnutls="no"
+have_openssl="no"
+have_cares="no"
+want_ipv6="yes"
+have_ipv6="no"
+have_ecore_con_eet="no"
+
+AC_ARG_ENABLE([ipv6],
+   [AC_HELP_STRING([--disable-ipv6],
+       [disable ipv6 functionality @<:@default=detect@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_ipv6="yes"
+    else
+       want_ipv6="no"
+    fi],
+   [want_ipv6="auto"])
+
+if test "x${have_ecore_con}" = "xyes" ; then
+
+   # Verify IPV6 availability in headers
+   if test "x${want_ipv6}" != "xno" ; then
+      AC_CHECK_TYPES([struct ipv6_mreq],
+         [have_ipv6="yes"],
+         [have_ipv6="no"],
+         [[
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+         ]])
+   fi
+
+   if test "x${have_ipv6}" = "xyes" ; then
+      AC_DEFINE(HAVE_IPV6, 1, [Define if IPV6 is supported])
+   fi
+
+   if test "x${have_eet}" = "xyes" ; then
+      requirements_ecore_con="eet > 1.7 ${requirements_ecore_con}"
+      have_ecore_con_eet="yes"
+      AC_DEFINE(ECORE_HAVE_EET, 1, [Define if Ecore_Con Eet_Connection helper is supported])
+   fi
+
+   ECORE_CHECK_CURL([${want_curl}],
+      [
+       have_curl="yes"
+       requirements_ecore_con="libcurl ${requirements_ecore_con}"
+      ],
+      [have_curl="no"])
+
+   ECORE_CHECK_GNUTLS([${want_gnutls}],
+      [have_gnutls="yes"],
+      [have_gnutls="no"])
+
+   ECORE_CHECK_OPENSSL([${want_openssl}],
+      [have_openssl="yes"],
+      [have_openssl="no"])
+
+   if test "x${have_gnutls}" = "xyes" ; then
+      requirements_ecore_con="gnutls ${requirements_ecore_con}"
+      # no need to add it to req_ecore_ipc, since they
+      # depends on ecore_con anyway.
+   else
+      if test "x${have_openssl}" = "xyes" ; then
+         requirements_ecore_con="openssl ${requirements_ecore_con}"
+         # no need to add it to req_ecore_ipc, since they
+         # depends on ecore_con anyway.
+      fi
+   fi
+
+   ECORE_CHECK_CARES([${want_cares}],
+      [
+       have_cares="yes"
+       requirements_ecore_con="libcares ${requirements_ecore_con}"
+      ],
+      [have_cares="no"])
+
+fi
+AM_CONDITIONAL([HAVE_IPV6], [test "x${have_ipv6}" = "xyes"])
+AM_CONDITIONAL([ECORE_HAVE_EET], [test "x${have_ecore_con_eet}" = "xyes"])
+
+EFL_CHECK_COMPILER_FLAGS([ECORE_CON], [-Wno-override-init -Wno-initializer-overrides])
+
+AM_CONDITIONAL([HAVE_CARES], [test "x${have_cares}" = "xyes"])
+
+# ecore_ipc
+ECORE_CHECK_MODULE([ipc], [${want_ecore_ipc}], [Ipc], [${have_ecore_con}],
+   [
+     requirements_ecore_ipc="ecore-con >= 1.6.99 ${requirements_ecore_ipc}"
+     requirements_ecore_evas="ecore-ipc >= 1.6.99 ${requirements_ecore_evas}"
+   ])
+
+# ecore_file
+ECORE_CHECK_MODULE([file], [${want_ecore_file}], [File])
+
+have_poll="no"
+have_inotify="no"
+have_notify_win32="no"
+if test "x${have_ecore_file}" = "xyes" ; then
+   ECORE_CHECK_POLL([${want_poll}], [have_poll="yes"], [have_poll="no"])
+   ECORE_CHECK_INOTIFY([${want_inotify}], [have_inotify="yes"], [have_inotify="no"])
+   ECORE_CHECK_NOTIFY_WIN32([${want_notify_win32}], [have_notify_win32="yes"], [have_notify_win32="no"])
+
+   if test "x${have_ecore_con}" = "xyes" ; then
+      requirements_ecore_file="ecore-con >= 1.6.99 ${requirements_ecore_file}"
+   else
+      ECORE_CHECK_CURL([${want_curl}],
+         [
+          have_curl="yes"
+          requirements_ecore_file="libcurl ${requirements_ecore_file}"
+         ],
+         [have_curl="no"])
+   fi
+
+fi
+
+# ecore_config
+#ecore_config_deps="no"
+#if test "x${have_eet}" = "xyes" -a "x${have_evas}"  -a "x${have_ecore_ipc}" ; then
+#   ecore_config_deps="yes"
+#fi
+
+#ECORE_CHECK_MODULE([config], [${want_ecore_config}], [Config], [${ecore_config_deps}],
+#   [requirements_ecore_config="ecore-ipc >= 1.6.99 evas >= 1.6.99 eet >= 1.6.99 ${requirements_ecore_config}"])
+
+AM_CONDITIONAL(BUILD_ECORE_CONFIG, false)
+
+# ecore_imf
+
+ECORE_CHECK_MODULE([imf], [${want_ecore_imf}], [Imf])
+
+# ecore_imf_evas
+
+ecore_imf_evas_deps="no"
+if test "x${have_ecore_imf}" = "xyes" -a "x${have_evas}" = "xyes" ; then
+   ecore_imf_evas_deps="yes"
+fi
+
+ECORE_CHECK_MODULE([imf-evas], [${want_ecore_imf}], [Imf_Evas], [${ecore_imf_evas_deps}],
+   [requirements_ecore_imf_evas="ecore-imf >= 1.6.99 evas >= 1.6.99 ${requirements_ecore_imf_evas}"])
+
+# ecore_input{_evas}
+ECORE_CHECK_MODULE([input], [${want_ecore_input}], [Input])
+ECORE_CHECK_MODULE([input-evas], [${want_ecore_input}], [Input_Evas], [${have_evas}],
+   [requirements_ecore_input_evas="ecore-input >= 1.6.99 evas >= 1.6.99 ${requirements_ecore_input}"])
+
+# ecore_imf_xim
+AM_CONDITIONAL(BUILD_ECORE_IMF_XIM, false)
+ecore_imf_xim_deps="no"
+echo "have_ecore_x_xlib: ${have_ecore_x_xlib}"
+if test    "x${have_ecore_imf}" = "xyes" \
+        -a "x${have_ecore_x_xlib}" = "xyes" \
+        -a "x${have_ecore_input}" = "xyes" ; then
+   ecore_imf_xim_deps="yes"
+   AC_DEFINE(BUILD_ECORE_IMF_XIM, 1, [Ecore Imf XIM Support])
+fi
+
+ECORE_CHECK_MODULE([imf-xim], [${want_ecore_imf}], [Imf_XIM], [${ecore_imf_xim_deps}],
+   [requirements_ecore_imf_xim="ecore-imf >= 1.6.99 ecore-x >= 1.6.99 ecore-input >= 1.6.99 ${requirements_ecore_imf_xim}"])
+
+# ecore_imf_scim
+PKG_CHECK_MODULES([SCIM], [scim], [have_scim="yes"], [have_scim="no"])
+
+AM_CONDITIONAL(BUILD_ECORE_IMF_SCIM, false)
+ecore_imf_scim_deps="no"
+echo "have_ecore_x_xlib: ${have_ecore_x_xlib}"
+if test    "x${have_ecore_imf}" = "xyes" \
+        -a "x${have_scim}" =  "xyes" \
+        -a "x${have_ecore_input}" = "xyes" ; then
+   ecore_imf_scim_deps="yes"
+   AC_DEFINE(BUILD_ECORE_IMF_SCIM, 1, [Ecore Imf SCIM Support])
+fi
+
+ECORE_CHECK_MODULE([imf-scim], [${want_ecore_imf}], [Imf_SCIM], [${ecore_imf_scim_deps}],
+   [requirements_ecore_imf_scim="ecore-imf >= 1.6.99 ecore-x >= 1.6.99 ecore-input >= 1.6.99 ${requirements_ecore_imf_scim}"])
+
+# ecore_imf_ibus
+PKG_CHECK_MODULES([IBUS], [ibus-1.0 >= 1.4], [have_ibus="yes"], [have_ibus="no"])
+
+AM_CONDITIONAL(BUILD_ECORE_IMF_IBUS, false)
+ecore_imf_ibus_deps="no"
+echo "have_ecore_x_xlib: ${have_ecore_x_xlib}"
+if test    "x${have_ecore_imf}" = "xyes" \
+        -a "x${have_glib}" =  "xyes" \
+        -a "x${have_ibus}" =  "xyes" \
+        -a "x${have_ecore_input}" = "xyes" ; then
+   ecore_imf_ibus_deps="yes"
+   AC_DEFINE(BUILD_ECORE_IMF_IBUS, 1, [Ecore Imf IBUS Support])
+fi
+
+ECORE_CHECK_MODULE([imf-ibus], [${want_ecore_imf}], [Imf_IBUS], [${ecore_imf_ibus_deps}],
+   [requirements_ecore_imf_ibus="ecore-imf >= 1.6.99 ecore-x >= 1.6.99 ecore-input >= 1.6.99 ${requirements_ecore_imf_ibus}"])
+
+## Graphic systems
+
+# ecore_x{cb}
+
+ecore_x_deps="no"
+if test "x${have_x}" = "xyes" -a \
+        "x${have_ecore_input}" = "xyes" ; then
+   ecore_x_deps="yes"
+fi
+
+ECORE_CHECK_MODULE([x], [${want_ecore_x}], [X], [${ecore_x_deps}],
+  [
+   ecore_x_libs="$ecore_x_libs $x_libs"
+   requirements_ecore_x="ecore-input >= 1.6.99 ${requirements_ecore_x}"
+  ])
+
+# ecore_win32
+
+ECORE_CHECK_MODULE([win32], [${want_ecore_win32}], [Win32], [${have_ecore_input}],
+   [
+    ecore_win32_libs="-lole32 -lgdi32"
+    requirements_ecore_win32="ecore-input >= 1.6.99 ${requirements_ecore_win32}"
+   ])
+AC_SUBST(ecore_win32_libs)
+
+# ecore_cocoa
+
+ecore_cocoa_deps="no"
+if test "x${have_ecore_input}" = "xyes" -a "x${have_cocoa}" = "xyes" ; then
+   ecore_cocoa_deps="yes"
+fi
+
+ECORE_CHECK_MODULE([cocoa], [${want_ecore_cocoa}], [Cocoa], [${ecore_cocoa_deps}],
+   [requirements_ecore_cocoa="ecore-input >= 1.6.99 ${requirements_ecore_cocoa}"])
+
+# ecore_sdl
+
+ecore_sdl_deps="no"
+if test "x${have_sdl}" = "xyes" -a "x${have_ecore_input}" = "xyes" ; then
+   ecore_sdl_deps="yes"
+fi
+
+ECORE_CHECK_MODULE([sdl], [${want_ecore_sdl}], [Sdl], [${ecore_sdl_deps}],
+   [requirements_ecore_sdl="ecore-input >= 1.6.99 ${requirements_ecore_sdl}"])
+
+ECORE_CHECK_MODULE([psl1ght], [${want_ecore_psl1ght}], [psl1ght], [${ecore_psl1ght_deps}],
+   [requirements_ecore_psl1ght="ecore-input >= 1.6.99 ${requirements_ecore_psl1ght}"])
+
+# ecore_fb
+ECORE_CHECK_MODULE([fb], [${want_ecore_fb}], [FB], [$have_fb])
+
+if test "x${have_ecore_fb}" = "xyes" ; then
+   ECORE_CHECK_TSLIB([${want_tslib}],
+      [
+       have_tslib="yes"
+       requirements_ecore_fb="${_tslib_requirement} ${requirements_ecore_fb}"
+      ],
+      [have_tslib="no"])
+fi
+
+# ecore_directfb
+
+ECORE_CHECK_MODULE([directfb], [${want_ecore_directfb}], [DirectFB], [${have_directfb}],
+   [requirements_ecore_directfb="directfb ${requirements_ecore_directfb}"])
+
+# ecore_wince
+
+ECORE_CHECK_MODULE([wince], [${want_ecore_wince}], [WinCE], [${have_ecore_input}],
+   [requirements_ecore_win32="ecore-input >= 1.6.99 ${requirements_ecore_win32}"])
+
+## Ecore Evas
+
+# ecore_evas
+
+ecore_evas_deps="no"
+if test "x${have_evas}" = "xyes" && test "x${have_ecore_input}" = "xyes" && test "x${have_ecore_input_evas}" = "xyes" ; then
+   ecore_evas_deps="yes"
+fi
+
+ECORE_CHECK_MODULE([evas], [${want_ecore_evas}], [Evas], [${ecore_evas_deps}],
+  [requirements_ecore_evas="ecore-input >= 1.6.99 ecore-input-evas >= 1.6.99 evas >= 1.6.99 ${requirements_ecore_evas}"])
+
+# ecore_evas_buffer
+
+ECORE_EVAS_CHECK_MODULE([software-buffer],
+   [${want_ecore_evas_software_buffer}],
+   [Software Buffer],
+   [yes])
+
+# ecore_evas_x11
+
+# ecore_evas_software_x11
+
+ECORE_EVAS_CHECK_MODULE([software-x11],
+   [${want_ecore_evas_software_x11}],
+   [Software X11],
+   [${have_ecore_x}])
+
+have_ecore_evas_software_xlib="no"
+have_ecore_evas_software_xcb="no"
+if test "x$have_ecore_evas_software_x11" = "xyes" ; then
+   have_ecore_evas_software_xlib=`${PKG_CONFIG} --variable=Xlib evas-software-x11`
+   if test "x${have_ecore_evas_software_xlib}" = "xstatic"; then
+      have_ecore_evas_software_xlib="yes"
+   fi
+   if test "x${have_ecore_evas_software_xlib}" = "xyes" -a "x${have_ecore_x_xlib}" = "xyes" ; then
+      AC_DEFINE(BUILD_ECORE_EVAS_SOFTWARE_XLIB, 1, [Evas Software Xlib Engine Support])
+   fi
+   have_ecore_evas_software_xcb=`${PKG_CONFIG} --variable=XCB evas-software-x11`
+   if test "x$have_ecore_evas_software_xcb" = "xstatic"; then
+      have_ecore_evas_software_xcb="yes"
+   fi
+   if test "x$have_ecore_evas_software_xcb" = "xyes" -a "x${have_ecore_x_xcb}" = "xyes" ; then
+      AC_DEFINE(BUILD_ECORE_EVAS_SOFTWARE_XCB, 1, [Evas Software XCB Engine Support])
+   fi
+fi
+
+# ecore_evas_opengl_x11
+
+ECORE_EVAS_CHECK_MODULE([opengl-x11],
+   [${want_ecore_evas_opengl_x11}],
+   [OpenGL Xlib],
+   [${have_ecore_x}])
+
+have_ecore_evas_opengl_xlib="no"
+have_ecore_evas_opengl_xcb="no"
+if test "x${have_ecore_evas_opengl_x11}" = "xyes" -o "x${have_ecore_evas_opengl_x11}" = "xstatic" ; then
+   have_ecore_evas_opengl_xlib=`${PKG_CONFIG} --variable=Xlib evas-opengl-x11`
+   if test "x${have_ecore_evas_opengl_xlib}" = "xyes" ; then
+      AC_DEFINE(BUILD_ECORE_EVAS_OPENGL_XLIB, 1, [OpenGL Xlib rendering backend])
+   fi
+
+# opengl does not work with xcb (yet)
+   have_ecore_evas_opengl_xcb=`${PKG_CONFIG} --variable=XCB evas-opengl-x11`
+   if test "x${have_ecore_evas_opengl_xcb}" = "xstatic"; then
+      have_ecore_evas_opengl_xcb="yes"
+   fi
+   if test "x${have_ecore_evas_opengl_xcb}" = "xyes" -a "x${have_ecore_x_xcb}" = "xyes" ; then
+      PKG_CHECK_MODULES(XCB_X11, x11-xcb,
+        [ have_ecore_x_opengl_xcb="yes"
+          requirements_ecore_x="x11-xcb ${requirements_ecore_x}"
+          AC_DEFINE(BUILD_ECORE_X_OPENGL_XCB, 1, [Build support for XCB-based OpenGL])
+          AC_DEFINE(BUILD_ECORE_EVAS_OPENGL_XCB, 1, [OpenGL XCB rendering backend])
+        ],
+        [ have_ecore_x_opengl_xcb="no" ])
+    else
+      have_ecore_x_opengl_xcb="no"
+      AC_MSG_NOTICE("XCB-based OpenGL explicitly disabled")
+    fi
+fi
+
+# ecore_evas_software_x11 16 bits
+
+ECORE_EVAS_CHECK_MODULE([software-16-x11],
+   [${want_ecore_evas_software_16_x11}],
+   [Software Xlib 16 bits],
+   [${have_ecore_x_xlib}])
+
+ECORE_EVAS_CHECK_MODULE([software-8-x11],
+    [$want_ecore_evas_software_8_x11],
+    [Software 8bit X11],
+    $have_ecore_x_xcb)
+
+
+if test "x$have_ecore_evas_software_x11" = "xyes" -o \
+        "x$have_ecore_evas_opengl_x11" = "xyes" -o \
+        "x$have_ecore_evas_software_8_x11" = "xyes" -o \
+        "x$have_ecore_evas_software_16_x11" = "xyes" -o \
+        "x$have_ecore_evas_software_xcb" = "xyes"; then
+   AC_DEFINE(BUILD_ECORE_EVAS_X11, 1, [Support for X Window Engines in Ecore_Evas])
+   requirements_ecore_evas="ecore-x >= 1.6.99 ${requirements_ecore_evas}"
+fi
+
+# ecore_evas_win32
+
+ECORE_EVAS_CHECK_MODULE([software-gdi],
+   [${want_ecore_evas_software_gdi}],
+   [Software GDI],
+   [${have_ecore_win32}])
+
+ECORE_EVAS_CHECK_MODULE([software-ddraw],
+   [${want_ecore_evas_software_ddraw}],
+   [Software DirectDraw],
+   [${have_ecore_win32}])
+
+ECORE_EVAS_CHECK_MODULE([direct3d],
+   [${want_ecore_evas_direct3d}],
+   [Direct3d],
+   [${have_ecore_win32}])
+
+ECORE_EVAS_CHECK_MODULE([opengl-glew],
+   [${want_ecore_evas_opengl_glew}],
+   [Glew OpenGL],
+   [${have_ecore_win32}])
+
+ECORE_EVAS_CHECK_MODULE([software-16-ddraw],
+   [${want_ecore_evas_software_16_ddraw}],
+   [16 bpp Software DirectDraw],
+   [${have_ecore_win32}])
+
+if test "x${have_ecore_evas_software_gdi}" = "xyes" -o \
+        "x${have_ecore_evas_software_ddraw}" = "xyes" -o \
+        "x${have_ecore_evas_direct3d}" = "xyes" -o \
+        "x${have_ecore_evas_opengl_glew}" = "xyes" -o \
+        "x${have_ecore_evas_software_16_ddraw}" = "xyes" ; then
+   AC_DEFINE(BUILD_ECORE_EVAS_WIN32, 1, [Support for Win32 Engine in Ecore_Evas])
+   requirements_ecore_evas="ecore-win32 >= 1.6.99 ${requirements_ecore_evas}"
+fi
+
+# ecore_evas_software_sdl
+
+have_ecore_evas_software_sdl="no"
+if test "x${have_ecore_sdl}" = "xyes"; then
+   requirements_ecore_evas="ecore-sdl >= 1.6.99 ${requirements_ecore_evas}"
+   have_ecore_evas_software_sdl="yes"
+   AC_DEFINE(BUILD_ECORE_EVAS_SOFTWARE_SDL, 1, [Support for Software SDL Engine in Ecore_Evas])
+   requirements_ecore_evas="ecore-sdl >= 1.6.99 ${requirements_ecore_evas}"
+fi
+
+# ecore_evas_gl_sdl
+
+ECORE_EVAS_CHECK_MODULE([opengl-sdl],
+   [${want_ecore_evas_gl_sdl}],
+   [OpenGL SDL],
+   [${have_ecore_sdl}],
+   [requirements_ecore_evas="ecore-sdl >= 1.6.99 ${requirements_ecore_evas}"])
+
+# ecore_evas_cocoa
+
+ECORE_EVAS_CHECK_MODULE([opengl-cocoa],
+   [${want_ecore_evas_gl_cocoa}],
+   [OpenGL Cocoa],
+   [${have_ecore_cocoa}],
+   [requirements_ecore_evas="ecore-cocoa >= 1.6.99 ${requirements_ecore_evas}"])
+
+# ecore_evas_directfb
+
+ECORE_EVAS_CHECK_MODULE([directfb],
+   [${want_ecore_evas_directfb}],
+   [DirectFB],
+   [${have_ecore_directfb}],
+   [requirements_ecore_evas="ecore-directfb >= 1.6.99 ${requirements_ecore_evas}"])
+
+# ecore_evas_fb
+
+ECORE_EVAS_CHECK_MODULE([fb],
+   [${want_ecore_evas_fb}],
+   [Linux Framebuffer],
+   [${have_ecore_fb}],
+   [requirements_ecore_evas="ecore-fb >= 1.6.99 ${requirements_ecore_evas}"])
+
+# ecore_evas_wince
+
+ECORE_EVAS_CHECK_MODULE([software-16-wince],
+   [${want_ecore_evas_software_16_wince}],
+   [16 bpp Software Windows CE],
+   [${have_ecore_wince}],
+   [requirements_ecore_evas="ecore-wince >= 1.6.99 ${requirements_ecore_evas}"])
+
+# ecore_evas_ews
+
+ECORE_EVAS_CHECK_MODULE_FULL([ews], [software-buffer],
+   [${want_ecore_evas_ews}],
+   [Ecore Evas Single Process Windowing System],
+   [yes], [])
+
+# ecore_evas_extn
+
+have_extn="yes"
+if test "x${have_ecore_ipc}" = "xno" || \
+   test "x${have_ecore_evas_software_buffer}" = "xno" || \
+   test "x${have_shm_open}" = "xno" ; then
+   have_extn="no"
+fi
+
+dnl THIS IS SPECIAL - dont use normal ECORE_EVAS_CHECK_MODULE
+have_ecore_evas_extn="no"
+if test "x${want_ecore_evas_extn}" = "xyes" && \
+   test "x${have_extn}" = "xyes" && \
+   test "x${have_ecore_evas}" = "xyes"; then
+   AC_DEFINE([BUILD_ECORE_EVAS_EXTN], [1], [Support for Extn Engine in Ecore_Evas])
+   have_ecore_evas_extn="yes"
+fi
+
+# ecore_evas_psl1ght
+
+ECORE_EVAS_CHECK_MODULE([psl1ght],
+   [${want_ecore_evas_psl1ght}],
+   [PSL1GHT],
+   [${have_ecore_psl1ght}],
+   [requirements_ecore_evas="ecore-psl1ght >= 1.6.99 ${requirements_ecore_evas}"])
+
+### WAYLAND
+
+ecore_wayland_deps="no"
+have_wayland="no"
+if test "x${want_ecore_wayland}" = "xyes" ; then
+  PKG_CHECK_MODULES([WAYLAND], [wayland-client wayland-cursor xkbcommon], [have_wayland="yes"], [have_wayland="no"])
+fi
+if test "x${have_ecore_input}" = "xyes" -a "x${have_wayland}" = "xyes" ; then
+  ecore_wayland_deps="yes"
+fi
+
+ECORE_CHECK_MODULE([wayland], [${want_ecore_wayland}], [Wayland], [${ecore_wayland_deps}])
+if test "x${have_ecore_wayland}" = "xyes" ; then
+  requirements_ecore_wayland="ecore-input >= 1.6.99 wayland-client wayland-cursor xkbcommon ${requirements_ecore_wayland}"
+fi
+
+ECORE_EVAS_CHECK_MODULE_FULL([wayland-shm], [wayland-shm], 
+   [${want_ecore_evas_wayland_shm}],
+   [Wayland Shm],
+   [${have_ecore_wayland}],
+   [requirements_ecore_evas="${requirements_ecore_wayland} ${requirements_ecore_evas}"])
+
+ECORE_EVAS_CHECK_MODULE_FULL([wayland-egl], [wayland-egl egl >= 7.10], 
+   [${want_ecore_evas_wayland_egl}],
+   [Wayland Egl],
+   [${have_ecore_wayland}],
+   [
+      PKG_CHECK_MODULES([WAYLAND_EGL], [wayland-egl], [have_wayland_egl="yes"], [have_wayland_egl="no"])
+      if test "x${have_wayland_egl}" = "xyes" ; then
+         requirements_ecore_evas="wayland-egl egl >= 7.10 ${requirements_ecore_wayland} ${requirements_ecore_evas}"
+      fi
+   ])
+
+### Unit tests and coverage
+
+EFL_CHECK_TESTS([enable_tests="yes"], [enable_tests="no"])
+
+EFL_CHECK_COVERAGE([${enable_tests}], [enable_coverage="yes"], [enable_coverage="no"])
+CFLAGS="${CFLAGS} ${EFL_COVERAGE_CFLAGS}"
+ECORE_LIBS="${ECORE_LIBS} ${EFL_COVERAGE_LIBS}"
+if test "x$enable_coverage" = "xyes" ; then
+   CFLAGS="${CFLAGS} ${EFL_DEBUG_CFLAGS}"
+fi
+
+### install and build examples
+
+EFL_CHECK_BUILD_EXAMPLES([enable_build_examples="yes"], [enable_build_examples="no"])
+EFL_CHECK_INSTALL_EXAMPLES([enable_install_examples="yes"], [enable_install_examples="no"])
+
+### requirements
+
+AC_SUBST(requirements_ecore)
+AC_SUBST(requirements_ecore_con)
+#AC_SUBST(requirements_ecore_config)
+AC_SUBST(requirements_ecore_directfb)
+AC_SUBST(requirements_ecore_evas)
+AC_SUBST(requirements_ecore_fb)
+AC_SUBST(requirements_ecore_file)
+AC_SUBST(requirements_ecore_imf)
+AC_SUBST(requirements_ecore_imf_evas)
+AC_SUBST(requirements_ecore_input)
+AC_SUBST(requirements_ecore_input_evas)
+AC_SUBST(requirements_ecore_ipc)
+AC_SUBST(requirements_ecore_cocoa)
+AC_SUBST(requirements_ecore_sdl)
+AC_SUBST(requirements_ecore_psl1ght)
+AC_SUBST(requirements_ecore_x)
+AC_SUBST(requirements_ecore_win32)
+AC_SUBST(requirements_ecore_wince)
+AC_SUBST(requirements_ecore_imf_xim)
+AC_SUBST(requirements_ecore_imf_scim)
+AC_SUBST(requirements_ecore_imf_ibus)
+AC_SUBST(requirements_ecore_wayland)
+
+AC_CONFIG_FILES([
+Makefile
+ecore-con.pc
+ecore-config.pc
+ecore-directfb.pc
+ecore-evas.pc
+ecore-fb.pc
+ecore-file.pc
+ecore-imf.pc
+ecore-imf-evas.pc
+ecore-ipc.pc
+ecore-x.pc
+ecore-input.pc
+ecore-input-evas.pc
+ecore-win32.pc
+ecore-sdl.pc
+ecore-cocoa.pc
+ecore-psl1ght.pc
+ecore-wince.pc
+ecore-wayland.pc
+ecore.pc
+doc/ecore.dox
+doc/Makefile
+doc/Doxyfile
+src/Makefile
+src/util/Makefile
+src/bin/Makefile
+src/lib/Makefile
+src/lib/ecore/Makefile
+src/lib/ecore_con/Makefile
+src/lib/ecore_config/Makefile
+src/lib/ecore_directfb/Makefile
+src/lib/ecore_evas/Makefile
+src/lib/ecore_fb/Makefile
+src/lib/ecore_file/Makefile
+src/lib/ecore_cocoa/Makefile
+src/lib/ecore_sdl/Makefile
+src/lib/ecore_psl1ght/Makefile
+src/lib/ecore_imf/Makefile
+src/lib/ecore_imf_evas/Makefile
+src/lib/ecore_input/Makefile
+src/lib/ecore_input_evas/Makefile
+src/lib/ecore_ipc/Makefile
+src/lib/ecore_win32/Makefile
+src/lib/ecore_wince/Makefile
+src/lib/ecore_x/Makefile
+src/lib/ecore_x/xlib/Makefile
+src/lib/ecore_x/xcb/Makefile
+src/lib/ecore_wayland/Makefile
+src/examples/Makefile
+src/tests/Makefile
+src/modules/Makefile
+src/modules/immodules/Makefile
+src/modules/immodules/xim/Makefile
+src/modules/immodules/scim/Makefile
+src/modules/immodules/ibus/Makefile
+ecore.spec
+$po_makefile_in
+])
+
+AC_OUTPUT
+
+echo
+echo "$PACKAGE $VERSION"
+echo
+echo "Optional Modules:"
+echo
+echo " Core:"
+echo
+echo "  Ecore........................: always"
+echo "    Thread support.............: $have_threads"
+echo "    Thread safety..............: $want_thread_safety"
+echo "    GLib support...............: $have_glib"
+echo "    Always integrate GLib......: $want_glib_integration_always"
+echo "    Use g_main_loop............: $want_g_main_loop"
+echo "    Gathering memory statistic.: $have_mallinfo"
+echo "    Gathering timer allocation.: $want_ecore_timer_dump"
+echo "  Ecore_Con....................: $have_ecore_con"
+if test "x$have_ecore_con" = "xyes" ; then
+  echo $ECHO_N "    OpenSSL....................: $have_openssl $ECHO_C"
+if test "x$have_gnutls" = "xyes" ; then
+  echo " (disabled)"
+else
+  echo
+fi
+  echo "    IPv6.......................: $have_ipv6"
+  echo "    GnuTLS.....................: $have_gnutls"
+  echo "    CURL.......................: $have_curl"
+  echo "    Eet........................: $have_ecore_con_eet"
+  echo "    Local Sockets..............: $want_ecore_con_local_sockets"
+if test "x$want_ecore_con_local_sockets" = "xyes" ; then
+  echo "      Abstract Sockets.........: $want_ecore_con_abstract_sockets"
+fi
+if test "x$have_cares" = "xyes" ; then
+  echo "    Resolver...................: c-ares"
+elif test "x$have_ipv6" = "xyes" ; then
+  echo "    Resolver...................: dns.c"
+else
+  echo "    Resolver...................: fork"
+fi
+fi
+echo "  Ecore_Ipc....................: $have_ecore_ipc"
+if test "x$have_ecore_ipc" = "xyes" ; then
+  echo $ECHO_N "    OpenSSL....................: $have_openssl $ECHO_C"
+if test "x$have_gnutls" = "xyes" ; then
+  echo " (disabled)"
+else
+  echo
+fi
+  echo "    GnuTLS.....................: $have_gnutls"
+fi
+echo "  Ecore_File...................: $have_ecore_file"
+if test "x$have_ecore_file" = "xyes" ; then
+  echo "    Inotify....................: $have_inotify"
+  echo "    Windows notification.......: $have_notify_win32"
+  echo "    Poll.......................: $have_poll"
+  echo "    CURL.......................: $have_curl"
+fi
+#echo "  Ecore_Config.................: $have_ecore_config (deprecated)"
+echo "  Ecore_IMF....................: $have_ecore_imf"
+echo "    XIM........................: $have_ecore_imf_xim"
+echo "    SCIM.......................: $have_ecore_imf_scim"
+echo "    IBUS.......................: $have_ecore_imf_ibus"
+echo "  Ecore_IMF_Evas...............: $have_ecore_imf_evas"
+echo "  Ecore_Input..................: $have_ecore_input"
+echo "  Ecore_Input_Evas.............: $have_ecore_input_evas"
+
+echo
+echo " Graphic systems:"
+echo
+
+if test "x$have_ecore_x" = "xyes" ; then
+  if test "x$have_ecore_x_xcb" = "xyes" ; then
+    echo "  Ecore_X (XCB backend)........: $have_ecore_x_xcb"
+    echo "    Xprint.....................: $have_ecore_x_xcb_xprint"
+    echo "    Xinerama...................: $have_ecore_x_xcb_xinerama"
+    echo "    Xrandr.....................: $have_ecore_x_xcb_randr"
+    echo "    Xscreensaver...............: $have_ecore_x_xcb_screensaver"
+    echo "    Xshape.....................: $have_ecore_x_xcb_shape"
+    echo "    Xgesture...................: $have_ecore_x_xcb_gesture"
+    echo "    Xsync......................: $have_ecore_x_xcb_sync"
+    echo "    Xrender....................: $have_ecore_x_xcb_render"
+    echo "    Xcomposite.................: $have_ecore_x_xcb_composite"
+    echo "    Xfixes.....................: $have_ecore_x_xcb_xfixes"
+    echo "    Xdamage....................: $have_ecore_x_xcb_damage"
+    echo "    Xdpms......................: $have_ecore_x_xcb_dpms"
+    echo "    Xtest......................: $have_ecore_x_xcb_xtest"
+  else
+    echo "  Ecore_X (Xlib backend).......: $have_ecore_x"
+    echo "    Xcursor....................: $use_Xcursor"
+    echo "    Xkb........................: $use_xkb"
+    echo "    Xprint.....................: $use_xprint"
+    echo "    Xinerama...................: $use_xinerama"
+    echo "    Xrandr.....................: $use_xrandr"
+    echo "    Xgesture...................: $use_xgesture"
+    echo "    Xscreensaver...............: $use_xss"
+    echo "    Xrender....................: $use_xrender"
+    echo "    Xcomposite.................: $use_xcomposite"
+    echo "    Xfixes.....................: $use_xfixes"
+    echo "    Xdamage....................: $use_xdamage"
+    echo "    Xdpms......................: $use_xdpms"
+    echo "    Xtest......................: $use_xtest"
+    echo "    XIM........................: $want_xim"
+    echo "    Xi2........................: $use_xi2"
+    echo "    Xi2.2......................: $use_xi2_2"
+  fi
+else
+  echo "  Ecore_X......................: $have_ecore_x"
+fi
+echo "  Ecore_Win32..................: $have_ecore_win32"
+echo "  Ecore_Cocoa..................: $have_ecore_cocoa"
+echo "  Ecore_SDL....................: $have_ecore_sdl"
+echo "  Ecore_FB.....................: $have_ecore_fb"
+if test "x${have_ecore_fb}" = "xyes" ; then
+  echo "    Touchscreen................: $have_tslib"
+fi
+echo "  Ecore_DirectFB...............: $have_ecore_directfb"
+echo "  Ecore_WinCE..................: $have_ecore_wince"
+echo "  Ecore_PSL1GHT................: $have_ecore_psl1ght"
+echo "  Ecore_Wayland................: $have_ecore_wayland"
+
+echo
+echo " Ecore Evas:"
+echo
+
+echo "  Ecore_Evas...................: $have_ecore_evas"
+if test "x${have_ecore_evas}" = "xyes" ; then
+  echo "    Software Memory Buffer.....: $have_ecore_evas_software_buffer"
+  if test "x${have_ecore_evas_software_x11}" = "xyes" ; then
+    echo "    Software X11...............: $have_ecore_evas_software_x11 (Xlib=${have_ecore_evas_software_xlib}) (XCB=${have_ecore_evas_software_xcb})"
+  else
+    echo "    Software X11...............: $have_ecore_evas_software_x11"
+  fi
+  if test "x${have_ecore_evas_opengl_x11}" = "xyes" ; then
+    echo "    OpenGL X11.................: $have_ecore_evas_opengl_x11 (Xlib=${have_ecore_evas_opengl_xlib}) (XCB=${have_ecore_evas_opengl_xcb})"
+  else
+    echo "    OpenGL X11.................: $have_ecore_evas_opengl_x11"
+  fi
+  echo "    Software GDI...............: $have_ecore_evas_software_gdi"
+  echo "    Software DirectDraw........: $have_ecore_evas_software_ddraw"
+  echo "    Direct3D...................: $have_ecore_evas_direct3d"
+  echo "    OpenGL Glew................: $have_ecore_evas_opengl_glew"
+  echo "    Software SDL...............: $have_ecore_evas_software_sdl"
+  echo "    OpenGL SDL.................: $have_ecore_evas_opengl_sdl"
+  echo "    OpenGL Cocoa...............: $have_ecore_evas_opengl_cocoa"
+  echo "    DirectFB...................: $have_ecore_evas_directfb"
+  echo "    PSL1GHT....................: $have_ecore_evas_psl1ght"
+  echo "    Software Framebuffer.......: $have_ecore_evas_fb"
+  echo "    Software 8bit grayscale XCB: $have_ecore_evas_software_8_x11"
+  echo "    Software 16bit X11.........: $have_ecore_evas_software_16_x11"
+  echo "    Software 16bit DirectDraw..: $have_ecore_evas_software_16_ddraw"
+  echo "    Software 16bit WinCE.......: $have_ecore_evas_software_16_wince"
+  echo "    Sing.Proc. Windowing System: $have_ecore_evas_ews"
+  echo "    Wayland Shm................: $have_ecore_evas_wayland_shm"
+  echo "    Wayland Egl................: $have_ecore_evas_wayland_egl"
+  echo "    Extn (Plug/socket Extn)....: $have_ecore_evas_extn"
+fi
+echo
+echo "  Tests................: ${enable_tests}"
+echo "  Coverage.............: ${enable_coverage}"
+echo "  Maximum log level....: ${with_max_log_level}"
+echo "Documentation..........: ${build_doc}"
+echo "Examples...............: ${enable_build_examples}"
+echo "Examples installed.....: ${enable_install_examples}"
+echo
+echo "Compilation............: make (or gmake)"
+echo "  CPPFLAGS.............: $CPPFLAGS"
+echo "  CFLAGS...............: $CFLAGS"
+echo "  CXXFLAGS.............: $CXXFLAGS"
+echo "  LDFLAGS..............: $LDFLAGS"
+echo
+echo "Installation...........: make install (as root if needed, with 'su' or 'sudo')"
+echo "  prefix...............: $prefix"
+echo
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..e01452c
--- /dev/null
@@ -0,0 +1,1346 @@
+ecore (1.2.0+svn.72988slp2+build02) unstable; urgency=low
+
+  * [ecore_x] Add missing features in Ecore_X.h
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.72988slp2+build02
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Thu, 05 Jul 2012 16:22:21 +0900
+
+ecore (1.2.0+svn.72988slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.72988slp2+build01
+
+ -- Jiyoun Park <jy0703.park@samsung.com>  Wed, 04 Jul 2012 18:31:50 +0900
+
+ecore (1.2.0+svn.70444slp2+build06) unstable; urgency=low
+
+  * Added per-window profile feature to support multi-head display.
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70444slp2+build06
+
+ -- Gwanglim Lee <gl77.lee@samsung.com>  Tue, 19 Jun 2012 18:34:11 +0900
+
+ecore (1.2.0+svn.70444slp2+build05) unstable; urgency=low
+
+  * Add feature - floating mode (app-in-app)
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70444slp2+build05
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Tue, 05 Jun 2012 15:17:17 +0900
+
+ecore (1.2.0+svn.70444slp2+build04) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70444slp2+build04
+
+ -- Jiyoun Park <jy0703.park@samsung.com>  Tue, 29 May 2012 17:07:07 +0900
+
+ecore (1.2.0+svn.70444slp2+build03) unstable; urgency=low
+
+  * add disable-ecore-imf-xim option
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70444slp2+build03
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 22 May 2012 16:05:56 +0900
+
+ecore (1.2.0+svn.70444slp2+build02) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70444slp2+build02
+
+ -- Myungjae Lee <mjae.lee@samsung.com>  Wed, 25 Apr 2012 17:28:30 +0900
+
+ecore (1.2.0+svn.70444slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70444slp2+build01
+
+ -- Myungjae Lee <mjae.lee@samsung.com>  Wed, 25 Apr 2012 15:13:33 +0900
+
+ecore (1.2.0+svn.70302slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70302slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Mon, 23 Apr 2012 15:28:49 +0900
+
+ecore (1.2.0+svn.70251slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70251slp2+build01
+
+ -- Hyoyoung Chang <hyoyoung.chang@samsung.com>  Wed, 18 Apr 2012 18:03:09 +0900
+
+ecore (1.2.0+svn.70159slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.70159slp2+build01
+
+ -- Jiyoun Park <jy0703.park@samsung.com>  Fri, 13 Apr 2012 18:31:50 +0900
+
+ecore (1.2.0+svn.69928slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.2.0+svn.69928slp2+build01
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Fri, 06 Apr 2012 18:14:52 +0900
+
+ecore (1.1.0+svn.69655slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69655slp2+build01
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Wed, 28 Mar 2012 14:28:49 +0900
+
+ecore (1.1.0+svn.69424slp2+build03) unstable; urgency=low
+
+  * [ECORE_X] remove feature - illume window state for app-in-app
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69424slp2+build03
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Mon, 26 Mar 2012 13:56:33 +0900
+
+ecore (1.1.0+svn.69424slp2+build02) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69424slp2+build02
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Sun, 18 Mar 2012 14:02:16 +0900
+
+ecore (1.1.0+svn.69424slp2+build01) unstable; urgency=low
+
+  * EFL migration
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69424slp2+build01
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Fri, 16 Mar 2012 21:50:01 +0900
+
+ecore (1.1.0+svn.69115slp2+build04) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69115slp2+build04
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Thu, 15 Mar 2012 21:23:10 +0900
+
+ecore (1.1.0+svn.69115slp2+build03) unstable; urgency=low
+
+  * [Ecore_X] Remove unused APIs, unused Atoms and duplicated Atoms
+    - ecore_x_e_comp_dri_buff_flip_supported_set
+    - ecore_x_e_comp_dri_buff_flip_supported_get
+    - ECORE_X_ATOM_E_USER_CREATED_WINDOW
+    - ECORE_X_ATOM_E_PARENT_BORDER_WINDOW
+    - ECORE_X_ATOM_E_COMP_DRI_BUFF_FLIP_SUPPORTED
+    - ECORE_X_ATOM_E_ILLUME_ROTATE_OPERATOR
+    - ECORE_X_ATOM_USER_CREATED_WINDOW
+    - ECORE_X_ATOM_PARENT_BORDER_WINDOW
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69115slp2+build03
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Wed, 14 Mar 2012 09:01:03 +0900
+
+ecore (1.1.0+svn.69115slp2+build02) unstable; urgency=low
+
+  * Change parameter of ecore_imf_context_input_panel_language_locale_get
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69115slp2+build02
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Mon, 12 Mar 2012 14:43:53 +0900
+
+ecore (1.1.0+svn.69115slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.69115slp2+build01
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Sat, 10 Mar 2012 13:51:23 +0900
+
+ecore (1.1.0+svn.68762slp2+build02) unstable; urgency=low
+
+  * 69115
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.68762slp2+build02
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Sat, 10 Mar 2012 13:20:45 +0900
+
+ecore (1.1.0+svn.68762slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.68762slp2+build01
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Wed, 07 Mar 2012 16:44:23 +0900
+
+ecore (1.1.0+svn.68529slp2+build01) unstable; urgency=low
+
+  * Package upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.68529slp2+build01
+
+ -- Jeonghyun Yun <jh0506.yun@samsung.com>  Fri, 02 Mar 2012 06:32:15 -0500
+
+ecore (1.1.0+svn.67695slp2+build06) unstable; urgency=low
+
+  * [ecore_imf] add language_locale_get, candidate_panel_geometry_get API
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.67695slp2+build06
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Fri, 02 Mar 2012 11:44:15 +0900
+
+ecore (1.1.0+svn.67695slp2+build05) unstable; urgency=low
+
+  * [ecore_imf] add ecore_imf_context_input_panel_caps_lock_mode_set/get
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.67695slp2+build05
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Wed, 29 Feb 2012 14:21:16 +0900
+
+ecore (1.1.0+svn.67695slp2+build04) unstable; urgency=low
+
+  * [ecore_imf] cleanup code
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.67695slp2+build04
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Thu, 23 Feb 2012 17:36:50 +0900
+
+ecore (1.1.0+svn.67695slp2+build03) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.67695slp2+build03
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Mon, 20 Feb 2012 20:15:54 +0900
+
+ecore (1.1.0+svn.67695slp2+build02) unstable; urgency=low
+
+  * Add APIs related to input panel control
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.67695slp2+build02
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Mon, 20 Feb 2012 09:23:47 +0900
+
+ecore (1.1.0+svn.67695slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.67695slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Wed, 15 Feb 2012 19:01:02 +0900
+
+ecore (1.1.0+svn.66972slp2+build03) unstable; urgency=low
+
+  * [ECORE_X] Add feature - illume window state for app-in-app
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.66972slp2+build03
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Thu, 02 Feb 2012 15:04:12 +0900
+
+ecore (1.1.0+svn.66972slp2+build02) unstable; urgency=low
+
+  * Use synchronous ecore_imf callback API
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.66972slp2+build02
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 31 Jan 2012 13:21:06 +0900
+
+ecore (1.1.0+svn.66972slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.66972slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Mon, 16 Jan 2012 18:29:42 +0900
+
+ecore (1.1.0+svn.65878slp2+build05) unstable; urgency=low
+
+  * jpeg7 -> jpeg8
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65878slp2+build05
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Mon, 16 Jan 2012 11:14:18 +0900
+
+ecore (1.1.0+svn.65878slp2+build04) unstable; urgency=low
+
+  * Repackaging
+  * Git: slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65878slp2+build04
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Fri, 30 Dec 2011 15:07:27 +0900
+
+ecore (1.1.0+svn.65878slp2+build03) unstable; urgency=low
+
+  * Just Bumped up version
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65878slp2+build03
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com>  Mon, 26 Dec 2011 15:20:31 +0900
+
+ecore (1.1.0+svn.65878slp2+build02) unstable; urgency=low
+
+  * Upstream sync related ecore_con  (r66414, 66462, sync after r65934)
+  * ecore_timer_dump is disabled as default
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65878slp2+build02
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com>  Fri, 23 Dec 2011 18:07:06 +0900
+
+ecore (1.1.0+svn.65878slp2+build01) unstable; urgency=low
+
+  * Package Upload for migration
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65878slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Thu, 08 Dec 2011 13:51:03 +0900
+
+ecore (1.1.0+svn.65618slp2+build02) unstable; urgency=low
+
+  * [Bug Fix] CQ H0100136744 - curl fd handler refactoring
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65618slp2+build02
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com>  Tue, 29 Nov 2011 17:43:36 +0900
+
+ecore (1.1.0+svn.65618slp2+build01) unstable; urgency=low
+
+  * Package Upload
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65618slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Tue, 29 Nov 2011 14:11:22 +0900
+
+ecore (1.1.0+svn.65303slp2+build04) unstable; urgency=low
+
+  * Add a configure option to enable ecore x gesture extension support 
+  * Add libxgesture-dev on Build-Depends section in debian/control 
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore 
+  * Tag: ecore_1.1.0+svn.65303slp2+build04
+
+ -- Sung-Jin Park <sj76.park@samsung.com>  Fri, 18 Nov 2011 11:11:27 +0900
+
+ecore (1.1.0+svn.65303slp2+build03) unstable; urgency=low
+
+  * Package Upload : because of build error
+  * Important Changes
+        Rollback about dependency with cares - Caused some app's build error about no Elementary.h
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.1.0+svn.65303slp2+build03
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Thu, 17 Nov 2011 19:10:33 +0900
+
+ecore (1.1.0+svn.65303slp2+build02) unstable; urgency=low
+
+  * Enable c-ARES based aync DNS resolution
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Thu, 17 Nov 2011 17:46:57 +0900
+
+ecore (1.1.0+svn.65303slp2+build01) unstable; urgency=low
+
+  * Merge with upstream @65303
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Thu, 17 Nov 2011 09:05:24 +0900
+
+ecore (1.0.0.001+svn.64964slp2+build02) unstable; urgency=low
+
+  * [ecore_imf] remove unused interfaces
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.64964slp2+build02
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Mon, 14 Nov 2011 15:19:52 +0900
+
+ecore (1.0.0.001+svn.64964slp2+build01) unstable; urgency=low
+
+  * Merge with upstream @64964
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Thu, 10 Nov 2011 12:12:11 +0900
+
+ecore (1.0.0.001+svn.64661slp2+build04) unstable; urgency=low
+
+  * [ecore_imf] remove depecated APIs
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.64661slp2+build04
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Thu, 10 Nov 2011 09:28:41 +0900
+
+ecore (1.0.0.001+svn.64661slp2+build03) unstable; urgency=low
+
+  * Ecore, Ecore_con, Ecore_file: merge upstream r64851 
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.64661slp2+build03
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com>  Tue, 08 Nov 2011 14:17:28 +0900
+
+ecore (1.0.0.001+svn.64661slp2+build02) unstable; urgency=low
+
+  * [ecore evas] fix rotation lockup problem
+                 when application's window is unmapped
+  * [ecore evas] fix sync counter lockup problem with application
+                 which rapidly maps and unmaps a window
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.64661slp2+build02
+
+ -- Gwanglim Lee <gl77.lee@samsung.com>  Fri, 04 Nov 2011 13:45:05 +0900
+
+ecore (1.0.0.001+svn.64661slp2+build01) unstable; urgency=low
+
+  * Merge with upstream @64661
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Thu, 03 Nov 2011 11:19:25 +0900
+
+ecore (1.0.0.001+svn.63888slp2+build07) unstable; urgency=low
+
+  * [ecore con url] Change HTTP persistent --> normal 
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63888slp2+build07
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com>  Wed, 02 Nov 2011 17:56:11 +0900
+
+ecore (1.0.0.001+svn.63888slp2+build06) unstable; urgency=low
+
+  * Deprecated some Ecore_IMF APIs
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63888slp2+build06
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Wed, 02 Nov 2011 12:41:49 +0900
+
+ecore (1.0.0.001+svn.63888slp2+build05) unstable; urgency=low
+
+  * Upload package
+  * Important Changes
+        Add new api related with get last recently requested geometry value
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63888slp2+build05
+
+ -- Jiyoun Park <jy0703.park@samsung.com>  Mon, 31 Oct 2011 15:23:33 +0900
+
+ecore (1.0.0.001+svn.63888slp2+build04) unstable; urgency=low
+
+  * Package Upload
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63888slp2+build04
+
+ -- Tae-Hwan Kim <the81.kim@samsung.com>  Mon, 31 Oct 2011 10:25:07 +0900
+
+ecore (1.0.0.001+svn.63888slp2+build03) unstable; urgency=low
+
+  * Upload package
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63888slp2+build03
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 25 Oct 2011 20:51:15 +0900
+
+ecore (1.0.0.001+svn.63888slp2+build02) unstable; urgency=low
+
+  * Upload Package
+  * Important Changes
+        ecore evas util can send resize request even though X relpy
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63888slp2+build02
+
+ -- Jiyoun Park <jy0703.park@samsung.com>  Tue, 25 Oct 2011 18:08:02 +0900
+
+ecore (1.0.0.001+svn.63888slp2+build01) unstable; urgency=low
+
+  * Merge with upstream
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63888slp2+build01
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Fri, 07 Oct 2011 11:41:21 +0900
+
+ecore (1.0.0.001+svn.63811slp2+build01) unstable; urgency=low
+
+  * merge with upstream
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.63811slp2+build01
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Wed, 05 Oct 2011 15:34:39 +0900
+
+ecore (1.0.0.001+svn.62653slp2+build02) unstable; urgency=low
+
+  * [SVN patch] ecore in SLP is merged with SVN r63475 patch only.
+    - fix bug in generic event handling on xlib side of ecore_x
+  * Ecore_IMF: remove unused enum ECORE_IMF_Autocorrection
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.62653slp2+build02
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Mon, 26 Sep 2011 20:01:42 +0900
+
+ecore (1.0.0.001+svn.62653slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r62653
+  * Important Changes
+       [Migration upstream r62653] Merge branch 'svn_merge'
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.62653slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Fri, 02 Sep 2011 18:43:09 +0900
+
+ecore (1.0.0.001+svn.61784slp2+build02) unstable; urgency=low
+
+  * [ecore_x] fixed multi-touch double clicked
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.61784slp2+build02
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Wed, 31 Aug 2011 19:42:43 +0900
+
+ecore (1.0.0.001+svn.61784slp2+build01) unstable; urgency=low
+
+  * Merge with upstream ecore svn @61784
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Wed, 27 Jul 2011 14:43:58 +0900
+
+ecore (1.0.0.001+svn.61150slp2+build03) unstable; urgency=low
+
+  * [ecore_imf] set autocapital type
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.61150slp2+build03
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Mon, 25 Jul 2011 14:30:29 +0900
+
+ecore (1.0.0.001+svn.61150slp2+build02) unstable; urgency=low
+
+  * [ecore_imf] add ecore_imf_context_cursor_location_set API
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.61150slp2+build02
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Mon, 11 Jul 2011 16:13:56 +0900
+
+ecore (1.0.0.001+svn.61150slp2+build01) unstable; urgency=low
+
+  * Merge with SVN revision 61150
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Thu, 07 Jul 2011 15:10:51 +0900
+
+ecore (1.0.0.001+svn.60286slp2+build02) unstable; urgency=low
+
+  * [ecore_imf] add ecore_imf_context_input_panel_enalbed_set, get API
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.60286slp2+build02
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Sat, 25 Jun 2011 15:11:35 +0900
+
+ecore (1.0.0.001+svn.60286slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r60286
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.60286slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Fri, 24 Jun 2011 18:10:02 +0900
+
+ecore (1.0.0.001+svn.58224slp2+build04) unstable; urgency=low
+
+  * Fixed _ecore_main_loop_iterate_internal. Upstream merge.
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.58224slp2+build04
+
+ -- Daniel Juyung Seo <juyung.seo@samsung.com>  Mon, 23 May 2011 14:20:58 +0900
+
+ecore (1.0.0.001+svn.58224slp2+build03) unstable; urgency=low
+
+  * Package upload
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.58224slp2+build03
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Tue, 03 May 2011 20:48:31 +0900
+
+ecore (1.0.0.001+svn.58224slp2+build02) unstable; urgency=low
+
+  * Add shape input mask feature (upstream svn rev.58621)
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.58224slp2+build02
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Mon, 11 Apr 2011 12:52:50 +0900
+
+ecore (1.0.0.001+svn.58224slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r58224
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.58224slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Tue, 05 Apr 2011 15:55:04 +0900
+
+ecore (1.0.0.001+svn.58047slp2+build02) unstable; urgency=low
+
+  * Rollback
+  * Git: slp-scm.sec.samsung.net:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.58047slp2+build02
+
+ -- Shinwoo Kim <cinoo.kim@samsung.com>  Tue, 29 Mar 2011 23:52:57 +0900
+
+ecore (1.0.0.001+svn.58047slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r58047
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.58047slp2+build01
+
+ -- Shinwoo Kim <cinoo.kim@samsung.com>  Tue, 29 Mar 2011 18:55:29 +0900
+
+ecore (1.0.0.001+svn.57453slp2+build05) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r57453
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.57453slp2+build05
+
+ -- Myungjae Lee <mjae.lee@samsung.com>  Wed, 09 Mar 2011 11:29:41 +0900
+
+ecore (1.0.0.001+svn.57453slp2+build04) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r57453
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.57453slp2+build04
+
+ -- Myungjae Lee <mjae.lee@samsung.com>  Wed, 09 Mar 2011 11:14:55 +0900
+
+ecore (1.0.0.001+svn.57453slp2+build03) unstable; urgency=low
+
+  * Package Uplaod : Rollback
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.57453slp2+build03
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Tue, 08 Mar 2011 12:38:42 +0900
+
+ecore (1.0.0.001+svn.57453slp2+build02) unstable; urgency=low
+
+  * Package Upload : rollback
+  * Git: 165.213.180.234:/slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.57453slp2+build02
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Tue, 08 Mar 2011 11:10:05 +0900
+
+ecore (1.0.0.001+svn.57453slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r57453
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.57453slp2+build01
+
+ -- Myungjae Lee <mjae.lee@samsung.com>  Mon, 07 Mar 2011 17:28:10 +0900
+
+ecore (1.0.0.001+svn.56239slp2+build06) unstable; urgency=low
+
+  * [SVN r56251] Bug fix - dont call pipe handler if its deleted.
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56239slp2+build06  
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Fri, 11 Feb 2011 17:52:58 +0900
+
+ecore (1.0.0.001+svn.56239slp2+build05) unstable; urgency=low
+
+  * [SVN r56251] Bug fix - dont call pipe handler if its deleted.
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56239slp2+build05 
+
+ -- Myoungwoon Kim <myoungwoon.kim@samsung.com>  Tue, 08 Feb 2011 15:21:18 +0900
+
+ecore (1.0.0.001+svn.56239slp2+build04) unstable; urgency=low
+
+  * [ecore_evas_x.c] apply ECORE_EVAS_GL_SYNC_DRAW_DONE env.
+     + check whether GL driver sends SYNC_DRAW_DONE msg after buffer copy.
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56239slp2+build04
+
+ -- Gwanglim Lee <gl77.lee@samsung.com>  Sat, 05 Feb 2011 17:29:55 +0900
+
+ecore (1.0.0.001+svn.56239slp2+build03) unstable; urgency=low
+
+  * ee->no_comp_sync = 0 
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56239slp2+build03  
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Mon, 31 Jan 2011 18:26:53 +0900
+
+ecore (1.0.0.001+svn.56239slp2+build02) unstable; urgency=low
+
+  * ee->no_comp_sync = 0 
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56239slp2+build02 
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Mon, 31 Jan 2011 17:12:38 +0900
+
+ecore (1.0.0.001+svn.56239slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r56239
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56239slp2+build01
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Thu, 27 Jan 2011 12:21:58 +0900
+
+ecore (1.0.0.001+svn.56091slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r56091
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56091slp2+build01
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.56091slp2+build01
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Wed, 19 Jan 2011 16:16:45 +0900
+
+ecore (1.0.0.001+svn.55755slp2+build02) unstable; urgency=low
+
+  * [ecore_imf] bug fix : hide keyboard in ecore_imf_context_del
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.55755slp2+build02
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Wed, 05 Jan 2011 08:44:58 +0900
+
+ecore (1.0.0.001+svn.55755slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r55755
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.55755slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Mon, 03 Jan 2011 21:19:00 +0900
+
+ecore (1.0.0.001+svn.55594slp2+build02) unstable; urgency=low
+
+  * Bug patch - ecore_x_xregion_is_empty()
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.55594slp2+build02
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Mon, 03 Jan 2011 12:56:39 +0900
+
+ecore (1.0.0.001+svn.55594slp2+build01) unstable; urgency=low
+
+  * [SVN EFL Migration] ecore in SLP is merged with SVN r55594
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.55594slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Wed, 22 Dec 2010 20:01:47 +0900
+
+ecore (1.0.0.001+svn.55371slp2+build02) unstable; urgency=low
+
+  * epoll disabled.
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.55371slp2+build02
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Wed, 15 Dec 2010 16:37:29 +0900
+
+ecore (1.0.0.001+svn.55371slp2+build01) unstable; urgency=low
+
+  * [SVN's EFL Migration] ecore in SLP is merged with SVN r55371.
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.55371slp2+build01
+
+ -- Juyung Seo <juyung.seo@samsung.com>  Tue, 14 Dec 2010 17:50:20 +0900
+
+ecore (1.0.0.001+svn.55079slp2+build03) unstable; urgency=low
+
+  * [SVN's EFL Migration] ecore in SLP is merged with SVN r55371.
+  * Git: 165.213.180.234:slp/pkgs/e/ecore
+  * Tag: ecore_1.0.0.001+svn.55079slp2+build03
+
+ -- Juyung Seo <juyung.seo@samsung.com>  Tue, 14 Dec 2010 14:54:04 +0900
+
+ecore (1.0.0.001+svn.55079slp2+build02) unstable; urgency=low
+
+  * remove epoll
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.55079slp2+build02
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Thu, 02 Dec 2010 17:28:23 +0900
+
+ecore (1.0.0.001+svn.55079slp2+build01) unstable; urgency=low
+
+  * [SVN 55079 Merge]
+  * Update to SVN Revision 55079.
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.55079slp2+build01
+
+ -- Myoungwoon Kim <myoungwoon.kim@samsung.com>  Thu, 02 Dec 2010 09:18:09 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build28) unstable; urgency=low
+
+  * [ecore_evas] Patch code for rotation.
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build28
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Mon, 29 Nov 2010 10:14:56 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build27) unstable; urgency=low
+
+  * [ecore_evas.c] change FPS rate print it every 0.1 sec
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build27
+
+ -- Seokjae Jeong <seok.j.jeong@samsung.com>  Sat, 27 Nov 2010 15:06:21 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build26) unstable; urgency=low
+
+  * [ecore_imf] remove unused typedefs
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build26
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Fri, 26 Nov 2010 17:56:05 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build25) unstable; urgency=low
+
+  * [SVN 54830 Merge]
+  * Update to SVN Revision 54830.
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build25
+
+ -- Juyung Seo <juyung.seo@samsung.com>  Fri, 26 Nov 2010 15:31:53 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build19) unstable; urgency=low
+
+  * libcurl-dev -> libcurl4-openssl-dev
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build19
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Thu, 18 Nov 2010 21:26:21 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build18) unstable; urgency=low
+
+  * [ecore_x] Add feature for sliding window
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build18
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Thu, 11 Nov 2010 10:53:35 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build17) unstable; urgency=low
+
+  * [ecore_imf] ecore_imf_context_input_panel_language_set
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build17
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 09 Nov 2010 15:08:12 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build16) unstable; urgency=low
+
+  * fix documentation of ecore_imf 
+  * [src/lib/ecore_evas/Ecore_Evas.h] svn merge v51740.
+  * [svn merge] r51678~r51707
+  * [svn merge] Changeset 51650 - Revert and reapply badnull patch
+  * [ecore_evas] svn 51618 : Add UNUSED where missing.
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build16
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Wed, 13 Oct 2010 16:54:37 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build15) unstable; urgency=low
+
+  * fixed epoll 
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build15
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Tue, 05 Oct 2010 10:39:49 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build14) unstable; urgency=low
+
+  * [ecore_x_events.c] fixed double / triple click
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build14
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Mon, 04 Oct 2010 21:38:13 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build13) unstable; urgency=low
+
+  * [ecore_evas] add EFL window rotation effect
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build13
+
+ -- Gwanglim Lee <gl77.lee@samsung.com>  Sat, 02 Oct 2010 03:37:56 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build12) unstable; urgency=low
+
+  * [ecore_imf] svn merge 52773
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build12 
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Wed, 30 Sep 2010 09:56:30 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build10) unstable; urgency=low
+
+  * update x_selection from upstream
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build10
+
+ -- Hyoyoung Chang <hyoyoung.chang@samsung.com>  Mon, 27 Sep 2010 17:27:38 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build09) unstable; urgency=low
+
+  * repackaging
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build09
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Mon, 20 Sep 2010 21:42:20 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build08) unstable; urgency=low
+
+  * Add ecore_imf_context_input_panel_caps_mode_set
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build08
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Fri, 17 Sep 2010 15:48:17 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build07) unstable; urgency=low
+
+  * Repackage for epoll disable
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build07
+
+ -- Hyoyoung Chang <hyoyoung.chang@samsung.com>  Fri, 17 Sep 2010 12:03:07 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build06) unstable; urgency=low
+
+  * Repackage for epoll disable
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build06
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Wed, 15 Sep 2010 18:15:43 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build05) unstable; urgency=low
+
+  * Repackage for epoll disable
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build05
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Wed, 15 Sep 2010 11:39:28 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build04) unstable; urgency=low
+
+  * add as-needed
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build04
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Wed, 15 Sep 2010 10:00:16 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build03) unstable; urgency=low
+
+  * repackage for stopping EPOLL fucntionality
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build03
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Tue, 14 Sep 2010 16:05:25 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build02) unstable; urgency=low
+
+  * repackage
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build02
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Fri, 10 Sep 2010 22:38:46 +0900
+
+ecore (1.0.0.001+svn.51480slp2+build01) unstable; urgency=low
+
+  * [ecore] Merge slp with SVN
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_1.0.0.001+svn.51480slp2+build01
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Wed, 01 Sep 2010 10:31:12 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build15) unstable; urgency=low
+
+  * [rules] add disable-xim (from Wonkuk Jung)
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build15
+
+ -- Juyung Seo  <juyung.seo@samsung.com>  Wed, 01 Sep 2010 21:52:08 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build14) unstable; urgency=low
+
+  * [ecore_x] fix sync issue in 1 special event re-order case. ( Changeset r51609 ) 
+  * Reference : http://trac.enlightenment.org/e/changeset/51609
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build14
+
+ -- Gwan-gyeong Mun <kk.moon@samsung.com>  Mon, 30 Aug 2010 08:46:33 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build13) unstable; urgency=low
+
+  * [ecore_imf] add MONTH, NUMBERONLY Layout
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build13
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Fri, 20 Aug 2010 11:23:12 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build12) unstable; urgency=low
+
+  * [ecore_imf] change parameter type of event_callback_add
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build12
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Fri, 30 Jul 2010 14:57:28 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build11) unstable; urgency=low
+
+  * [ecore_imf] fix memory leak when private key or disable key func is used
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build11
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Fri, 30 Jul 2010 14:32:07 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build10) unstable; urgency=low
+
+  * Remove deprecated Ecore_IMF APIs.
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build10
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 20 Jul 2010 18:17:00 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build09) unstable; urgency=low
+
+  * Repackage for beat release.
+  * Git: 165.213.180.234:/git/slp/pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build09
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Mon, 19 Jul 2010 10:47:44 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build08) unstable; urgency=low
+
+  * add the ECORE_X_ATOM_PARENT_BORDER_WINDOW atom.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build08
+
+ -- Gwanglim Lee <gl77.lee@samsung.com>  Wed, 14 Jul 2010 15:41:35 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build07) unstable; urgency=low
+
+  * Ecore_IMF API is revised.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build07
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Thu, 08 Jul 2010 17:14:29 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build06) unstable; urgency=low
+
+  * add ecore_evas_gl_x11_no_swap_set for supporting lock/unlock feature.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build06
+
+ -- ChunEon Park <chuneon.park@samsung.com>  Wed, 07 Jul 2010 20:03:15 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build05) unstable; urgency=low
+
+  * add ecore_evas_gl_x11_no_swap_set for supporting lock/unlock feature.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build05
+
+ -- Gwanglim Lee <gl77.lee@samsung.com>  Tue, 29 Jun 2010 18:58:38 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build04) unstable; urgency=low
+
+  * Packaging.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build04
+
+ -- Daniel Juyung Seo <juyung.seo@samsung.com>  Thu, 10 Jun 2010 21:09:25 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build03) unstable; urgency=low
+
+  * Packaging.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build03
+
+ -- Daniel Juyung Seo <juyung.seo@samsung.com>  Thu, 10 Jun 2010 21:04:09 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3build02) unstable; urgency=low
+
+  * Packaging.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3build02
+
+ -- Daniel Juyung Seo <juyung.seo@samsung.com>  목, 10  6월 2010 21:00:51 +0900
+
+ecore (0.9.9.060+svn.49540slp2+3) unstable; urgency=low
+
+  * Packaging.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+3
+
+ -- Daniel Juyung Seo <juyung.seo@samsung.com>  Thu, 10 Jun 2010 20:46:54 +0900
+
+ecore (0.9.9.060+svn.49540slp2+2) unstable; urgency=low
+
+  * Packaging.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+2
+
+ -- Daniel Juyung Seo <juyung.seo@samsung.net>  Thu, 10 Jun 2010 20:46:08 +0900
+
+ecore (0.9.9.060+svn.49540slp2+1) unstable; urgency=low
+
+  * Packaging.
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL-pkgs/ecore
+  * Tag: ecore_0.9.9.060+svn.49540slp2+1
+
+ -- Daniel Juyung Seo <juyung.seo@smasung.net>  Thu, 10 Jun 2010 20:45:22 +0900
+
+ecore (0.9.9.060+svn.49540slp2+0) unstable; urgency=low
+
+  * Update opensource EFL from SVN
+  * SVN revision: 49540 (Total EFL revision: 49550)
+  * Tag: 0.9.9.060+svn.49540slp2+0
+
+ -- Daniel Juyung Seo <juyung.seo@smasung.net>  Thu, 10 Jun 2010 15:50:38 +0900
+
+ecore (0.9.9.060+svn20100304slp2+4) unstable; urgency=low
+
+  * Enable curl
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL
+  * Tag: ecore_0.9.9.060+svn20100304slp2+4
+
+ -- Sangjin Lee <lsj119@samsung.com>  Wed, 14 Apr 2010 17:54:37 +0900
+
+ecore (0.9.9.060+svn20100304slp2+3) unstable; urgency=low
+
+  * change control - add libeina-svn-04 dependency to libecore-svn-01
+  * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/EFL
+  * Tag: 9.9.060+svn20100304slp2+3
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Thu, 01 Apr 2010 16:50:07 +0900
+
+ecore (0.9.9.060+svn20100304slp2+2) unstable; urgency=low
+
+  * add document in ecore_imf and cleanup
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 30 Mar 2010 16:55:51 +0900
+
+ecore (0.9.9.060+svn20100304slp2+1) unstable; urgency=low
+
+  * change package version
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Thu, 25 Mar 2010 15:05:10 +0900
+
+ecore (0.9.9.060+svn20100304-5) unstable; urgency=low
+
+  * Upgrade ecore to 47360 
+
+ -- Sangjin Lee <lsj119@samsung.com>  Mon, 22 Mar 2010 20:52:51 +0900
+
+ecore (0.9.9.060+svn20100304-4) unstable; urgency=low
+
+  * Modifed keydefs.h for resolving macro name conflicts
+
+ -- Ji-hoon Lee <dalton.lee@samsung.com>  Mon, 22 Mar 2010 16:03:48 +0900
+
+ecore (0.9.9.060+svn20100304-3) unstable; urgency=low
+
+    * Added keydefs.h for identifying key index
+
+ -- Ji-hoon Lee <dalton.lee@samsung.com>  Fri, 19 Mar 2010 20:20:43 +0900
+
+ecore (0.9.9.060+svn20100304-2) unstable; urgency=low
+
+  * Fix debian/libecore-dev.install not to omit symbolic links for shared objects
+
+ -- Sung-Jin Park <sj76.park@samsung.com>  Tue, 16 Mar 2010 21:26:16 +0900
+
+ecore (0.9.9.060+svn20100304-1) unstable; urgency=low
+
+  * EFL_update_revision_46864
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Thu, 11 Mar 2010 10:50:35 +0900
+
+ecore (0.9.9.060+svn20100203-16) unstable; urgency=low
+
+  * Modify shape input mask
+
+ -- Sangjin Lee <lsj119@samsung.com>  Thu, 11 Mar 2010 10:42:52 +0900
+
+ecore (0.9.9.060+svn20100203-15) unstable; urgency=low
+
+  * Modify ecore_x_window_hide().
+   + In order to avoid ISE lockup problem, we ensure that root window
+     receives UnmapNotify event.
+
+ -- Gwanglim Lee <gl77.lee@samsung.com>  Wed, 10 Mar 2010 17:07:18 +0900
+
+ecore (0.9.9.060+svn20100203-14) unstable; urgency=low
+
+  * Merge source (based on SVN rev.46421).
+  * Add ecore_data library.
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Thu, 04 Mar 2010 20:17:30 +0900
+
+ecore (0.9.9.060+svn20100203-13) unstable; urgency=low
+
+  * Rollback to source (0.9.9.060+svn20100203-10)
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Thu, 04 Mar 2010 14:26:58 +0900
+
+ecore (0.9.9.060+svn20100203-12) unstable; urgency=low
+
+  * Merge the latest ecore_imf
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Thu, 04 Mar 2010 13:21:57 +0900
+
+ecore (0.9.9.060+svn20100203-11) unstable; urgency=low
+
+  * Merge source (based on SVN rev.46421)
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Thu, 04 Mar 2010 12:17:19 +0900
+
+ecore (0.9.9.060+svn20100203-10) unstable; urgency=low
+
+  * Add ecore_imf_context_ise_event_callback_set API. ise_state_add_listener, remove_listener, change_listener will be deprecated.
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 02 Mar 2010 17:52:58 +0900
+
+ecore (0.9.9.060+svn20100203-9) unstable; urgency=low
+
+  * Patch for ecore_evas_x_alpha_set
+
+ -- Sangjin Lee <lsj119@samsung.com>  Sat, 27 Feb 2010 20:44:34 +0900
+
+ecore (0.9.9.060+svn20100203-8) unstable; urgency=low
+
+  * add more ISE_EVENT types
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Thu, 25 Feb 2010 17:09:28 +0900
+
+ecore (0.9.9.060+svn20100203-7) unstable; urgency=low
+
+  * add ecore_imf_context_ise_get_window_rect API
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 23 Feb 2010 20:42:39 +0900
+
+ecore (0.9.9.060+svn20100203-6) unstable; urgency=low
+
+  * revision update to 46263. (partial merge)
+  * add atoms for rotation.
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Thu, 18 Feb 2010 19:37:45 +0900
+
+ecore (0.9.9.060+svn20100203-5) unstable; urgency=low
+
+  * elm_win_transparent apply
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Thu, 11 Feb 2010 15:12:01 +0900
+
+ecore (0.9.9.060+svn20100203-4) unstable; urgency=low
+
+  * Add rotate with resize.
+
+ -- Doyoun Kang <doyoun.kang@samsung.com>  Mon, 08 Feb 2010 14:14:00 +0900
+
+ecore (0.9.9.060+svn20100203-3) unstable; urgency=low
+
+  * repack
+
+ -- sangho park <sangho.g.park@samsung.com>  Thu, 04 Feb 2010 22:04:12 +0900
+
+ecore (0.9.9.060+svn20100203-2) unstable; urgency=low
+
+  * repack
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Thu, 04 Feb 2010 20:27:43 +0900
+
+ecore (0.9.9.060+svn20100203-1) unstable; urgency=low
+
+  * EFL_update_revision_45828
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Wed, 03 Feb 2010 16:39:21 +0900
+
+ecore (0.9.9.060+svn20100119-2) unstable; urgency=low
+
+  * updated ISF files
+
+ -- sehwan <sehwan@samsung.com>  Thu, 21 Jan 2010 23:23:29 +0900
+
+ecore (0.9.9.060+svn20100119-1) unstable; urgency=low
+
+  * EFL_update_revision_45322
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 19 Jan 2010 20:44:48 +0900
+
+ecore (0.9.9.060+svn20100111-4) unstable; urgency=low
+
+  * changed ecore-imf for isf
+
+ -- sehwan <sehwan@samsung.com>  Fri, 15 Jan 2010 15:06:31 +0900
+
+ecore (0.9.9.060+svn20100111-3) unstable; urgency=low
+
+  * reupload EFL i686
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Tue, 12 Jan 2010 17:35:33 +0900
+
+ecore (0.9.9.060+svn20100111-2) unstable; urgency=low
+
+  * reupload EFL
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Mon, 11 Jan 2010 22:16:49 +0900
+
+ecore (0.9.9.060+svn20100111-1) unstable; urgency=low
+
+  * update EFL revision 45026
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Mon, 11 Jan 2010 13:28:04 +0900
+
+ecore (0.9.9.060+svn20091229-3) unstable; urgency=low
+
+  * To solve version mismatch between i386 and armel.
+  * No source code changed.
+
+ -- Jongwoo Chae <jongwoo.chae@samsung.com>  Thu, 07 Jan 2010 21:47:34 +0900
+
+ecore (0.9.9.060+svn20091229-2) unstable; urgency=low
+
+  * Changed ecore_imf for isf package
+
+ -- Ji-hoon Lee <dalton.lee@samsung.com>  Wed, 06 Jan 2010 13:55:00 +0900
+
+ecore (0.9.9.060+svn20091229-1) unstable; urgency=low
+
+  * update EFL
+
+ -- Jaehwan Kim <jae.hwan.kim@samsung.com>  Tue, 29 Dec 2009 14:27:03 +0900
+
+ecore (0.9.9.060+svn20091112-6) unstable; urgency=low
+
+  * modified debian/control to link libcurl
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 29 Dec 2009 19:31:19 +0900
+
+
+ecore (0.9.9.060+svn20091112-5) unstable; urgency=low
+
+  * modified debian/control : changed Architecture all to any (by Juyung Seo)
+
+ -- Sangho Park <sangho.g.park@samsung.com>  Fri, 27 Nov 2009 15:59:07 +0900
+
+ecore (0.9.9.060+svn20091112-4) unstable; urgency=low
+
+  * svn stable version
+
+ -- Sangho Park <sangho.g.park@samsung.com>  Thu, 19 Nov 2009 18:50:08 +0900
+
+ecore (0.9.9.060+svn20091112-3) unstable; urgency=low
+
+  * add build dependency glib
+
+ -- Sangho Park <sangho.g.park@samsung.com>  Tue, 17 Nov 2009 21:37:23 +0900
+
+ecore (0.9.9.060+svn20091112-2) unstable; urgency=low
+
+  * add glib dependency
+
+ -- Sangho Park <sangho.g.park@samsung.com>  Tue, 17 Nov 2009 16:27:18 +0900
+
+ecore (0.9.9.060+svn20091112-1) unstable; urgency=low
+
+  * New version
+
+ -- Sangho Park <sangho.g.park@samsung.com>  Thu, 12 Nov 2009 23:44:06 +0900
+
+ecore (0.9.9.060+svnYYYYMMDD-1) unstable; urgency=low
+
+  * New version
+
+ -- quaker <quaker66@gmail.com>  Thu, 22 Apr 2009 18:12:06 +0100
+
+ecore (0.9.9.050+svnYYYYMMDD-1) unstable; urgency=low
+
+  * Clean up changelog
+
+ -- quaker <quaker66@gmail.com>  Tue, 21 Apr 2009 19:14:37 +0100
index 1e8b314..7ed6ff8 100644 (file)
@@ -1 +1 @@
-6
+5
old mode 100644 (file)
new mode 100755 (executable)
index d1e0b78..7e8abae
@@ -1,27 +1,62 @@
 Source: ecore
 Section: libs
 Priority: optional
-Maintainer: Falko Schmidt <falko@alphagemini.org>
-Build-Depends: debhelper (>= 6), cdbs, libeet-dev, libevas-dev, libssl-dev, libcurl4-openssl-dev, libxcursor-dev, libxss-dev, libxrender-dev, libxinerama-dev, libxrandr-dev, libxext-dev, libxp-dev, libxcomposite-dev, libjpeg62-dev, libxdamage-dev, doxygen
-Standards-Version: 3.7.3
-Homepage: http://www.enlightenment.org
+Maintainer: Jaehwan Kim <jae.hwan.kim@samsung.com>,
+ Jihoon Kim <jihoon48.kim@samsung.com>,
+ Sangjin Lee <lsj119@samsung.com>,
+ Doyoun Kang <doyoun.kang@samsung.com>,
+ Sung-Jin Park <sj76.park@samsung.com>,
+ Juyung Seo <juyung.seo@samsung.com>,
+ Seokjae Jeong <seok.j.jeong@samsung.com>,
+ ChunEon Park <chuneon.park@samsung.com>,
+ WooHyun Jung <wh0705.jung@samsung.com>,
+ Gwanglim Lee <gl77.lee@samsung.com>,
+ Ji-hoon Lee <dalton.lee@samsung.com>,
+ Gwan-gyeong Mun <kk.moon@samsung.com>,
+ Hyoyoung Chang <hyoyoung.chang@samsung.com>,
+ Myoungwoon Kim <myoungwoon.kim@samsung.com>,
+ Seokjae Jeong <seok.j.jeong@samsung.com>,
+ Mike McCormack <mj.mccormack@samsung.com>,
+ Jeonghyun Yun <jh0506.yun@samsung.com>
+Uploaders: Tae-Hwan Kim <the81.kim@samsung.com>
+Build-Depends: dpkg-dev,
+ debhelper (>= 6),
+ cdbs,
+ libeina-dev (>= 0.0.2.060+svn20100304),
+ libeet-dev (>= 1.0.0),
+ libxgesture-dev,
+ libevas-dev ,
+ libglib2.0-dev,
+ libxcursor-dev,
+ libxrender-dev,
+ libxinerama-dev,
+ libxrandr-dev,
+ libxext-dev,
+ libxcomposite-dev,
+ libjpeg8-dev,
+ libxdamage-dev,
+ x11proto-xext-dev,
+ libxtst-dev,
+ doxygen,
+ pkg-config,
+ libtool,
+ libcurl-dev,
+Standards-Version: 3.8.1
+Homepage: http://enlightenment.org
 
-Package: libecore0
+Package: libecore
 Architecture: any
-Provides: libecore
-Depends: ${shlibs:Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}, libeina
 Description: Core abstraction layer for enlightenment DR 0.17
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
  handlers fast, optimized, and convenient. It's a separate library so anyone
  can make use of the work put into Ecore to make this job easy for
  applications.
-Package: libecore-con0
+
+Package: libecore-con
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-con
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Ecore Connection Library
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -30,12 +65,10 @@ Description: Ecore Connection Library
  applications.
  .
  This package contains the Ecore Connection Library.
-Package: libecore-config0
+
+Package: libecore-config
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-config
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Ecore Enlightened Property Library
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -44,12 +77,10 @@ Description: Ecore Enlightened Property Library
  applications.
  .
  This package contains the Enlightened Property Library.
-Package: libecore-evas0
+
+Package: libecore-evas
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-evas
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Ecore Evas Wrapper Library
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -58,12 +89,10 @@ Description: Ecore Evas Wrapper Library
  applications.
  .
  This package contains the Ecore Evas wrapper functions.
-Package: libecore-fb0
+
+Package: libecore-fb
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-fb
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Ecore frame buffer system functions
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -72,12 +101,10 @@ Description: Ecore frame buffer system functions
  applications.
  .
  This package contains the Ecore frame buffer system functions.
-Package: libecore-file0
+
+Package: libecore-file
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-file
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Ecore File Library
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -86,41 +113,35 @@ Description: Ecore File Library
  applications.
  .
  This package contains the Ecore File Library.
-Package: libecore-imf0
+
+Package: libecore-imf
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}, libecore-imf-evas0
-Provides: libecore-imf
-Description: Ecore Input Method Framework module 
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Description: Ecore Input Method Framework module
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
  handlers fast, optimized, and convenient. It's a separate library so anyone
  can make use of the work put into Ecore to make this job easy for
  applications.
  .
- This package contains the Ecore Input Method Framework module.
-Package: libecore-imf-evas0
+ This package contains the Ecore Input Method Framework module, and the Evas
+ helper functions for it.
+
+Package: libecore-input
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-imf-evas
-Description: Evas helpers for the Ecore Input Method Framework
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Description: Ecore input functions
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
  handlers fast, optimized, and convenient. It's a separate library so anyone
  can make use of the work put into Ecore to make this job easy for
  applications.
  .
- This package contains the Evas helper functions for the Ecore Input Method
- Framework module.
-Package: libecore-ipc0
+ This package contains the Ecore Input Library.
+
+Package: libecore-ipc
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-ipc
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Ecore inter-process communication functions
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -129,40 +150,15 @@ Description: Ecore inter-process communication functions
  applications.
  .
  This package contains the Ecore inter-process communication functions.
-Package: libecore-job0
-Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-job
-Description: Ecore job dealing functions
- This is the core event abstraction layer and X abstraction layer that makes
- doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
- handlers fast, optimized, and convenient. It's a separate library so anyone
- can make use of the work put into Ecore to make this job easy for
- applications.
- .
- This package contains functions for dealing with Ecore jobs.
-Package: libecore-txt0
+
+Package: libecore-data
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-txt
-Description: Ecore text encoding conversion functions
- This is the core event abstraction layer and X abstraction layer that makes
- doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
- handlers fast, optimized, and convenient. It's a separate library so anyone
- can make use of the work put into Ecore to make this job easy for
- applications.
- .
- This package contains the Ecore text encoding conversion functions.
-Package: libecore-x0
+Depends: ${misc:Depends}
+Description: Ecore data functions
+
+Package: libecore-x
 Architecture: any
-Section: libs
-Depends: ${shlibs:Depends}
-Provides: libecore-x
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Ecore functions for dealing with the X Windows System
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -172,40 +168,26 @@ Description: Ecore functions for dealing with the X Windows System
  .
  This package contains the Ecore wrapper and convenience functions for using
  the X Windows System.
-Package: libecore0-all
-Architecture: any
-Section: libdevel
-Depends: libecore0 (= ${Source-Version}), libecore-config0, libecore-con0, libecore-evas0, libecore-fb0, libecore-file0, libecore-imf0, libecore-ipc0, libecore-job0, libecore-txt0, libecore-x0
-Provides: libecore-all
-Description: Virtual package providing all available Ecore modules.
- This is the core event abstraction layer and X abstraction layer that makes
- doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
- handlers fast, optimized, and convenient. It's a separate library so anyone
- can make use of the work put into Ecore to make this job easy for
- applications.
- .
- This virtual package provides all available Ecore modules.
 
 Package: libecore-dev
 Architecture: any
 Section: libdevel
 Suggests: libecore-doc
-Depends: libecore0 (= ${binary:Version}),
-         libecore-con0 (= ${binary:Version}),
-         libecore-config0 (= ${binary:Version}),
-         libecore-evas0 (= ${binary:Version}),
-         libecore-fb0 (= ${binary:Version}),
-         libecore-file0 (= ${binary:Version}),
-         libecore-imf0 (= ${binary:Version}),
-         libecore-ipc0 (= ${binary:Version}),
-         libecore-job0 (= ${binary:Version}),
-         libecore-txt0 (= ${binary:Version}),
-         libecore-x0 (= ${binary:Version}),
-         libeet-dev, libevas-dev, pkg-config,
-         libssl-dev, libcurl4-openssl-dev, libxcursor-dev, libxss-dev,
-         libxrender-dev, libxinerama-dev, libxrandr-dev, libxext-dev,
-         libxp-dev, libxcomposite-dev, libxdamage-dev
+Depends: ${misc:Depends}, libecore (= ${binary:Version}),
+         libecore-con (= ${binary:Version}),
+         libecore-config (= ${binary:Version}),
+         libecore-evas (= ${binary:Version}),
+         libecore-fb (= ${binary:Version}),
+         libecore-file (= ${binary:Version}),
+         libecore-imf (= ${binary:Version}),
+         libecore-input (= ${binary:Version}),
+         libecore-ipc (= ${binary:Version}),
+         libecore-x (= ${binary:Version}),
+         libecore-data (= ${binary:Version}),
+         libxgesture-dev,
+         libeet-dev, libevas-dev (>= 0.9.9.060), libeina-dev, pkg-config, libcurl-dev,
+         libxcursor-dev, libxrender-dev, libxinerama-dev, libxrandr-dev, libxext-dev,
+         libxcomposite-dev, libxdamage-dev, x11proto-xext-dev, libxtst-dev, libglib2.0-dev
 Description: Ecore headers and static libraries
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -216,8 +198,9 @@ Description: Ecore headers and static libraries
  This package contains headers and static libraries for the Ecore library.
 
 Package: libecore-doc
-Architecture: all
+Architecture: any
 Section: doc
+Depends: ${misc:Depends}
 Enhances: libecore-dev
 Description: Ecore API Documentation
  This is the core event abstraction layer and X abstraction layer that makes
@@ -232,7 +215,7 @@ Description: Ecore API Documentation
 Package: libecore-bin
 Architecture: any
 Section: utils
-Depends: ${shlibs:Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}
 Description: Tools that support Ecore
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
@@ -247,8 +230,8 @@ Package: libecore-dbg
 Architecture: any
 Section: libdevel
 Priority: extra
-Depends: libecore0 (= ${binary:Version})
-Description:  Core abstraction layer for enlightenment DR 0.17
+Depends: ${misc:Depends}, libecore (= ${binary:Version})
+Description: Debugging symbols for libecore
  This is the core event abstraction layer and X abstraction layer that makes
  doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
  handlers fast, optimized, and convenient. It's a separate library so anyone
index d086d3b..57d5703 100644 (file)
@@ -1,18 +1,24 @@
-This package was debianized by Falko Schmidt <falko@alphagemini.org> on
-Fri,  4 Apr 2008 15:13:56 +0000.
+This package was debianized by Debian Pkg-e Team <pkg-e-devel@lists.alioth.debian.org> 
+Sat, 07 Jul 2007 09:29:10 +0000.
 
-The source code is from the e17/libs/ecore module of the enlightenment CVS
-tree. For more information, see:
+It was downloaded from http://download.enlightenment.org/
 
- http://www.enlightenment.org
 Upstream Authors:
-       
+
        Enlightenment team <enlightenment-devel@lists.sourceforge.net>
 
 Copyright:
 
-       Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS)
+       Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS)
+
+    Additional Copyright:
+    src/lib/ecore/ecore_str.c: Copyright (c) 1998 Todd C. Miller
+        <Todd.Miller@courtesan.com>
+    src/lib/ecore/ecore_value.c: Copyright (C) 2001
+        Christopher Rosendahl <smugg@fatelabs.com>
+        Nathan Ingersoll      <ningerso@d.umn.edu>
+    src/lib/ecore_fb/ecore_fb_li.c: Copyright (C) 1999-2002 Brad Hards
+
 License:
 
   Permission is hereby granted, free of charge, to any person obtaining a
@@ -36,7 +42,3 @@ License:
 
 On Debian systems, the complete text of the BSD License can be found
 in `/usr/share/common-licenses/BSD'.
-
-The Debian packaging is:
-  (C) 2006 2007,Debian Pkg-e Team <pkg-e-devel@lists.alioth.debian.org>
-  and is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
diff --git a/debian/jobs b/debian/jobs
new file mode 100644 (file)
index 0000000..e69de29
index 088dd41..24d1f12 100644 (file)
@@ -1 +1 @@
-debian/tmp/usr/bin/ecore_config
+#debian/tmp/usr/bin/ecore_config
diff --git a/debian/libecore-con-svn-01.install b/debian/libecore-con-svn-01.install
new file mode 100644 (file)
index 0000000..4e6f99e
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_con-*.so.*
diff --git a/debian/libecore-con-svn-01.shlibs b/debian/libecore-con-svn-01.shlibs
new file mode 100644 (file)
index 0000000..d5353f3
--- /dev/null
@@ -0,0 +1 @@
+libecore_con-ver-pre-svn-01 0 libecore-con-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-con.install b/debian/libecore-con.install
new file mode 100644 (file)
index 0000000..1c47c56
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_con.so.*
diff --git a/debian/libecore-config-svn-01.install b/debian/libecore-config-svn-01.install
new file mode 100644 (file)
index 0000000..d497998
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_config-*.so.*
diff --git a/debian/libecore-config-svn-01.shlibs b/debian/libecore-config-svn-01.shlibs
new file mode 100644 (file)
index 0000000..ec0e971
--- /dev/null
@@ -0,0 +1 @@
+libecore_config-ver-pre-svn-01 0 libecore-config-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-config.install b/debian/libecore-config.install
new file mode 100644 (file)
index 0000000..8f31d99
--- /dev/null
@@ -0,0 +1 @@
+#debian/tmp/usr/lib/libecore_config.so.*
old mode 100644 (file)
new mode 100755 (executable)
index 497be28..e6def58
@@ -1,4 +1,14 @@
-debian/tmp/usr/include/*.h
+debian/tmp/usr/include/ecore-1/Ecore*.h
 debian/tmp/usr/lib/libecore*.a
+debian/tmp/usr/lib/libecore*.la
 debian/tmp/usr/lib/libecore*.so
-debian/tmp/usr/lib/pkgconfig/*
+#debian/tmp/usr/lib/libecore_config*.so
+debian/tmp/usr/lib/libecore_con*.so
+debian/tmp/usr/lib/libecore_evas*.so
+debian/tmp/usr/lib/libecore_file*.so
+debian/tmp/usr/lib/libecore_imf_evas*.so
+debian/tmp/usr/lib/libecore_imf*.so
+debian/tmp/usr/lib/libecore_input*.so
+debian/tmp/usr/lib/libecore_ipc*.so
+debian/tmp/usr/lib/libecore_x*.so
+debian/tmp/usr/lib/pkgconfig/ecore*.pc
diff --git a/debian/libecore-doc.doc-base b/debian/libecore-doc.doc-base
new file mode 100644 (file)
index 0000000..9ab7e32
--- /dev/null
@@ -0,0 +1,10 @@
+Document: ecore
+Title: Ecore Guide
+Author: Carsten Haitzler
+Abstract: This document describes Ecore API
+ and provides sample C code.
+Section: Programming/C
+
+Format: HTML
+Index: /usr/share/doc/libecore-doc/html/index.html
+Files: /usr/share/doc/libecore-doc/html/*.html
diff --git a/debian/libecore-evas-svn-01.install b/debian/libecore-evas-svn-01.install
new file mode 100644 (file)
index 0000000..ceb9f01
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_evas-*.so.*
diff --git a/debian/libecore-evas-svn-01.shlibs b/debian/libecore-evas-svn-01.shlibs
new file mode 100644 (file)
index 0000000..92c2b6d
--- /dev/null
@@ -0,0 +1 @@
+libecore_evas-ver-pre-svn-01 0 libecore-evas-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-evas.install b/debian/libecore-evas.install
new file mode 100644 (file)
index 0000000..12d49fb
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_evas*.so.*
diff --git a/debian/libecore-fb-svn-01.install b/debian/libecore-fb-svn-01.install
new file mode 100644 (file)
index 0000000..72ceee2
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_fb-*.so.*
diff --git a/debian/libecore-fb-svn-01.shlibs b/debian/libecore-fb-svn-01.shlibs
new file mode 100644 (file)
index 0000000..2593f16
--- /dev/null
@@ -0,0 +1 @@
+libecore_fb-ver-pre-svn-01 0 libecore-fb-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-fb.install b/debian/libecore-fb.install
new file mode 100644 (file)
index 0000000..f228623
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_fb*.so.*
diff --git a/debian/libecore-file-svn-01.install b/debian/libecore-file-svn-01.install
new file mode 100644 (file)
index 0000000..a115a75
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_file-*.so.*
diff --git a/debian/libecore-file-svn-01.shlibs b/debian/libecore-file-svn-01.shlibs
new file mode 100644 (file)
index 0000000..868a4f6
--- /dev/null
@@ -0,0 +1 @@
+libecore_file-ver-pre-svn-01 0 libecore-file-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-file.install b/debian/libecore-file.install
new file mode 100644 (file)
index 0000000..74419ea
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_file*.so.*
diff --git a/debian/libecore-imf-svn-01.install b/debian/libecore-imf-svn-01.install
new file mode 100644 (file)
index 0000000..8da8885
--- /dev/null
@@ -0,0 +1,2 @@
+debian/tmp/usr/lib/libecore_imf-*.so.*
+debian/tmp/usr/lib/libecore_imf_evas-*.so.*
diff --git a/debian/libecore-imf-svn-01.shlibs b/debian/libecore-imf-svn-01.shlibs
new file mode 100644 (file)
index 0000000..15aeb84
--- /dev/null
@@ -0,0 +1,2 @@
+libecore_imf-ver-pre-svn-01 0 libecore-imf-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
+libecore_imf_evas-ver-pre-svn-01 0 libecore-imf-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-imf.install b/debian/libecore-imf.install
new file mode 100644 (file)
index 0000000..88f91c5
--- /dev/null
@@ -0,0 +1,2 @@
+debian/tmp/usr/lib/libecore_imf*.so.*
+debian/tmp/usr/lib/libecore_imf_evas*.so.*
diff --git a/debian/libecore-input-svn-01.install b/debian/libecore-input-svn-01.install
new file mode 100644 (file)
index 0000000..34d8efb
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_input-*.so.*
diff --git a/debian/libecore-input-svn-01.shlibs b/debian/libecore-input-svn-01.shlibs
new file mode 100644 (file)
index 0000000..b95c6bb
--- /dev/null
@@ -0,0 +1 @@
+libecore_input-ver-pre-svn-01 0 libecore-input-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-input.install b/debian/libecore-input.install
new file mode 100644 (file)
index 0000000..4509237
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_input*.so.*
diff --git a/debian/libecore-ipc-svn-01.install b/debian/libecore-ipc-svn-01.install
new file mode 100644 (file)
index 0000000..e118708
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_ipc-*.so.*
diff --git a/debian/libecore-ipc-svn-01.shlibs b/debian/libecore-ipc-svn-01.shlibs
new file mode 100644 (file)
index 0000000..6a9ae5a
--- /dev/null
@@ -0,0 +1 @@
+libecore_ipc-ver-pre-svn-01 0 libecore-ipc-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-ipc.install b/debian/libecore-ipc.install
new file mode 100644 (file)
index 0000000..f0421a3
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_ipc*.so.*
diff --git a/debian/libecore-svn-01.install b/debian/libecore-svn-01.install
new file mode 100644 (file)
index 0000000..22c55a3
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore-*.so.*
diff --git a/debian/libecore-svn-01.shlibs b/debian/libecore-svn-01.shlibs
new file mode 100644 (file)
index 0000000..43565e1
--- /dev/null
@@ -0,0 +1 @@
+libecore-ver-pre-svn-01 0 libecore-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-x-svn-01.install b/debian/libecore-x-svn-01.install
new file mode 100644 (file)
index 0000000..8c8007e
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_x-*.so.*
diff --git a/debian/libecore-x-svn-01.shlibs b/debian/libecore-x-svn-01.shlibs
new file mode 100644 (file)
index 0000000..b5a9660
--- /dev/null
@@ -0,0 +1 @@
+libecore_x-ver-pre-svn-01 0 libecore-x-svn-01 (>= 0.9.9.060+svnYYYYMMDD)
diff --git a/debian/libecore-x.install b/debian/libecore-x.install
new file mode 100644 (file)
index 0000000..e098222
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore_x*.so.*
diff --git a/debian/libecore.install b/debian/libecore.install
new file mode 100644 (file)
index 0000000..7eef82a
--- /dev/null
@@ -0,0 +1 @@
+debian/tmp/usr/lib/libecore.so.*
old mode 100644 (file)
new mode 100755 (executable)
index 3d51bbb..494fe33
@@ -3,26 +3,41 @@
 include /usr/share/cdbs/1/class/autotools.mk
 include /usr/share/cdbs/1/rules/debhelper.mk
 
-#DEB_INSTALL_MANPAGES_libecore-doc := $(DEB_SRCDIR)/doc/man/man3/*.3
-DEB_INSTALL_MANPAGES_libecore-bin := debian/ecore_config.1
+DEB_CONFIGURE_SCRIPT := ./autogen.sh
+#DEB_INSTALL_MANPAGES_libecore-bin := debian/ecore_config.1
 DEB_DH_STRIP_ARGS := --dbg-package=libecore-dbg
-DEB_CONFIGURE_EXTRA_FLAGS := --enable-ecore-fb --disable-ecore-directfb \
-       --disable-ecore-evas-dfb --enable-ecore-evas-fb --disable-rpath \
-       --enable-openssl
-DEB_MAKE_CLEAN_TARGET := clean
+DEB_CONFIGURE_EXTRA_FLAGS := --enable-ecore-fb \
+        --enable-dependency-tracking \
+       --disable-ecore-directfb \
+       --enable-ecore-evas-fb \
+       --disable-rpath \
+       --disable-openssl \
+       --disable-gnutls \
+       --disable-tslib \
+       --disable-doc \
+       --enable-simple-x11 \
+       --enable-ecore-evas-opengl-x11 \
+       --disable-ecore-evas-xrender-x11 \
+       --enable-curl \
+       --disable-openssl \
+       --enable-glib-integration-always \
+       --enable-ecore-x-gesture \
+       --disable-xim \
+       --disable-ecore-imf-xim \
+       --disable-ecore-imf-scim
+DEB_MAKE_EXTRA_ARGS := V=0
 
-build/libecore-doc::
-       cd $(DEB_SRCDIR) && doxygen
+DEB_MAKE_CLEAN_TARGET := distclean
+CFLAGS += -fvisibility=hidden -fPIC
+LDFLAGS += -fvisibility=hidden -Wl,--hash-style=both -Wl,--as-needed
 
-install/libecore-doc::
-       mkdir -p debian/libecore-doc/usr/share/doc/libecore-doc/
-       cp -R $(DEB_SRCDIR)/doc/html debian/libecore-doc/usr/share/doc/libecore-doc/
-       cd $(DEB_SRCDIR)/doc/man/man3 && ls -1 | grep -vi ecore | xargs rm
+#build/libecore-doc::
+#      cd $(DEB_SRCDIR)/doc && make doc
 
-clean::
-       rm -rf $(DEB_SRCDIR)/doc/html $(DEB_SRCDIR)/doc/latex $(DEB_SRCDIR)/doc/man
-       mkdir -p $(DEB_SRCDIR)/doc/html
-       cp $(DEB_SRCDIR)/doc/img/*.png $(DEB_SRCDIR)/doc/html/
-       cp $(DEB_SRCDIR)/doc/img/*.gif $(DEB_SRCDIR)/doc/html/
-       ./autogen.sh --prefix=/usr $(DEB_CONFIGURE_EXTRA_FLAGS) 
+#install/libecore-doc::
+#      mkdir -p debian/libecore-doc/usr/share/doc/libecore-doc
+#      cp -R $(DEB_SRCDIR)/doc/html debian/libecore-doc/usr/share/doc/libecore-doc/
 
+clean::
+       [ ! -f Makefile ] || make distclean
+       rm -f ecore-*.tar.bz2 ecore-*.tar.bz2.cdbs-config_list
diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in
new file mode 100644 (file)
index 0000000..43e73c1
--- /dev/null
@@ -0,0 +1,221 @@
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = Ecore
+PROJECT_NUMBER         =
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = YES
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 2
+ALIASES                =
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = NO
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = NO
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = NO
+SHOW_DIRECTORIES       = NO
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           =
+INPUT                  = @builddir@/ecore.dox \
+                         @top_srcdir@/src/lib \
+                         @srcdir@/examples.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          =
+RECURSIVE              = YES
+EXCLUDE                = @top_srcdir@/src/lib/ecore_config/* @top_srcdir@/src/lib/ecore_x/xcb/*.c
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = ecore_config* Ecore_Config*
+EXCLUDE_SYMBOLS        = Ecore_Config*
+EXAMPLE_PATH           = @top_srcdir@/src/examples/
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = YES
+IMAGE_PATH             = @srcdir@/img
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 2
+IGNORE_PREFIX          = ecore_ _ecore_ Ecore_ _Ecore_ ECORE_ _ECORE_
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = @srcdir@/head.html
+HTML_FOOTER            = @srcdir@/foot.html
+HTML_STYLESHEET        = @srcdir@/e.css
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_ALIGN_MEMBERS     = YES
+HTML_DYNAMIC_SECTIONS  = NO
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = YES
+ENUM_VALUES_PER_LINE   = 1
+GENERATE_TREEVIEW      = NO
+USE_INLINE_TREES       = NO
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+SEARCHENGINE           = NO
+SERVER_BASED_SEARCH    = NO
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         =
+LATEX_HEADER           =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+GENERATE_MAN           = YES
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = YES
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+GENERATE_AUTOGEN_DEF   = NO
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = NO
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             = __UNUSED__=
+EXPAND_AS_DEFINED      =
+SKIP_FUNCTION_MACROS   = YES
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = FreeSans.ttf
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = NO
+COLLABORATION_GRAPH    = NO
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = NO
+INCLUDED_BY_GRAPH      = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               =
+DOTFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644 (file)
index 0000000..8bffa14
--- /dev/null
@@ -0,0 +1,33 @@
+MAINTAINERCLEANFILES = Makefile.in ecore.dox
+
+.PHONY: doc
+
+PACKAGE_DOCNAME = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-doc
+
+if EFL_BUILD_DOC
+
+doc-clean:
+       rm -rf html/ latex/ man/ xml/ $(top_builddir)/$(PACKAGE_DOCNAME).tar*
+
+doc: all doc-clean
+       $(efl_doxygen)
+       cp $(srcdir)/img/* html/
+       cp $(srcdir)/img/* latex/
+       rm -rf $(PACKAGE_DOCNAME).tar*
+       mkdir -p $(PACKAGE_DOCNAME)/doc
+       cp -R html/ latex/ man/ $(PACKAGE_DOCNAME)/doc
+       tar cf $(PACKAGE_DOCNAME).tar $(PACKAGE_DOCNAME)/
+       bzip2 -9 $(PACKAGE_DOCNAME).tar
+       rm -rf $(PACKAGE_DOCNAME)/
+       mv $(PACKAGE_DOCNAME).tar.bz2 $(top_builddir)
+
+clean-local: doc-clean
+
+else
+
+doc:
+       @echo "Documentation not built. Run ./configure --help"
+
+endif
+
+EXTRA_DIST = Doxyfile.in $(wildcard img/*.*) e.css head.html foot.html ecore.dox.in examples.dox
index 604ee7f..2dd6b44 100644 (file)
--- a/doc/e.css
+++ b/doc/e.css
+/*
+    Author:
+        Andres Blanc <andresblanc@gmail.com>
+       DaveMDS Andreoli <dave@gurumeditation.it>
+
+    Supported Browsers:
+        ie7, opera9, konqueror4 and firefox3
+
+        Please use a different file for ie6, ie5, etc. hacks.
+*/
+
+
+/* Necessary to place the footer at the bottom of the page */
+html, body {
+       height: 100%;
+       margin: 0px;
+       padding: 0px;
+}
+
+#container {
+       min-height: 100%;
+       height: auto !important;
+       height: 100%;
+       margin: 0 auto -53px;
+}
+
+#footer, #push {
+       height: 53px;
+}
+
+
+* html #container {
+       height: 100%;
+}
+
+/* Prevent floating elements overflowing containers */
+.clear {
+       clear: both;
+       width: 0px;
+       height: 0px;
+}
+
+/* Flexible & centered layout from 750 to 960 pixels */
+.layout {
+       max-width: 960px;
+       min-width: 760px;
+       margin-left: auto;
+       margin-right: auto;
+}
+
 body {
-    background: url("b.png");
-    background-repeat: repeat-x;
-    background-position: top left;
-    background-color: #f4f4f4;
-    text-align: center;
-    font-family: sans-serif;
-    padding: 0;
-    margin: 0;
-}
-
-div.main {
-    margin: 1em auto;
-    vertical-align: top;
-    font-family: "Bitstream Vera", "Vera", "Trebuchet MS", Trebuchet, Tahoma, sans-serif;
-    color: #444444;
-    font-size: 0.8em;
-    text-align: justify;
-    width: 80%;
-}
-
-td.t { background-image:url("t.gif"); }
-td.t[class] { background-image:url("t.png"); }
-td.tl { background-image:url("tl.gif"); }
-td.tl[class] { background-image:url("tl.png"); }
-
-td.nav, td.lnav,  td.rnav {
-   align: middle;
-   text-align: center;
-   vertical-align: middle;
-   width: 100px;
-   height: 25px;
-   font-family: "Bitstream Vera", "Vera", "Trebuchet MS", Trebuchet, Tahoma, sans-serif;
-   color: #000000;
-   font-size: 9px;
-   font-weight: bold;
-   white-space: no-wrap;
-}  
-
-td.lnav[class] { background-image:url("n.png"); }
-td.lnav[class] { background-image:url("n.png"); }
-td.rnav { background-image:url("n.gif"); }
-td.rnav[class] { background-image:url("n.png"); }
-
-hr {
-    width: 200px;
-    height: 1px;
-    background: #dddddd;
-    border: 0;
-}
-
-p { color: #444444 ;}
-p.tiny, small {
-    color: #888888;
-    font-size: 0.5em;
-}
-
-h1 { 
-    text-align: center;
-    font-size: 1.3em; 
-}
-
-h2 { font-size: 1.1em; }
-h3 { font-size: 0.9em; }
-
-span.keyword { color: #008000; }
-span.keywordtype { color: #604020; }
-span.keywordflow { color: #e08000; }
-span.comment { color: #800000; }
-span.preprocessor { color: #806020; }
-span.stringliteral { color: #002080; }
-span.charliteral { color: #008080; }
-
-a:link {
-    color: #445566;
-    text-decoration: underline;
-}  
-   
-a:visited {
-    color: #667788;
-    text-decoration: underline;
-}  
-
-a:active {                
-    color: #88cccc;
-    text-decoration: none;
-}
-
-a:hover {
-    color: #112266;
-    text-decoration: underline;
-}  
-
-a.nav {
-    text-decoration: none;
-    display: block;
-}
-a.nav:link, a.nav:visited { color: #888888; }
-a.nav:active { color: #000000; }
-a.nav:hover { color: #444444; }
-a.code:link, a.code:visited { text-decoration: none; }
-
-div.fragment {
-    font-size: 1em;
-    border: 1px dotted #cccccc;
-    background-color: #ffffff;
-    text-align: left;
-    vertical-align: middle;
-    padding: 2px;
-    margin-left: 25px;
-    margin-right: 25px;
-    overflow: auto;
-}
-
-td.indexkey {
-    font-weight: bold;
-    padding-left: 10px;
-    padding-right: 0;
-    padding-top: 2px;
-    padding-bottom: 0px;
-    margin: 0;
-    margin-top: 2px;
-    margin-bottom: 2px;
-    border: 1px dotted #cccccc;
-    border-right: 0px dotted #cccccc;
-}
-
-td.indexvalue {
-    font-style: italic;
-    padding-right: 10px;
-    padding-left: 0;
-    padding-top: 2px;
-    padding-bottom: 2px;
-    margin: 0;
-    margin-top: 2px;
-    margin-bottom: 2px;
-    border: 1px dotted #cccccc;
-    border-left: 0px dotted #cccccc;
-}
-
-.mdescRight { font-style: italic; }
-.memitem {
-    padding-left: 2px;
-    padding-right: 2px;
-    border: 1px dotted #cccccc;
-    background-color: #ffffff;
-}
-.memname {
-    white-space: nowrap;
-    font-weight: bold;
-}
-.paramname { font-weight: normal; }
-
-div.ah {
-    border: thin solid #888888;
-    font-weight: bold;
-    margin-bottom: 3px;
-    margin-top: 3px;
+       /*font-family: Lucida Grande, Helvetica, sans-serif;*/
+       font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif
+}
+
+/* Prevent design overflowing the viewport in small resolutions */
+#container {
+       padding-right: 17px;
+       padding-left: 17px;
+       background-image: url(head_bg.png);
+       background-repeat: repeat-x;
+}
+
+/****************************/
+/* Top main menu            */
+/****************************/
+#header_logo {
+   background-image        : url(logo.png);
+   width                   : 61px;
+}
+
+#header_logo a {
+   position                : absolute;
+   border                  : 0px;
+   background-color        : transparent;
+   top                     : 0px;
+   width                   : 60px;
+   height                  : 60px;
+}
+
+#header_menu {
+   background-image        : url(header_menu_background.png);
+   font                    : normal 10pt verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
+   text-align              : right;
+}
+
+#header_last {
+   background-image        : url(header_menu_background_last.png);
+   width                   : 15px;
+}
+
+td.nav_passive {
+   background              : url(header_menu_unselected_background.png) 0 0 no-repeat;
+   height                  : 63px;
+   font-family             : "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+   font-size               : 11px;
+   padding                 : 20px 10px 20px 10px;
+   vertical-align          : middle;
+}
+
+td.nav_active {
+   background              : url(header_menu_current_background.png) 0 0 no-repeat;
+   height                  : 63px;
+   color                   : #646464;
+   font-family             : "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+   font-size               : 11px;
+   font-weight             : bold;
+   padding                 : 20px 10px 20px 10px;
+   vertical-align          : middle;
+}
+
+#header_menu a {
+   display                 : block;
+   text-decoration         : none;
+   cursor                  : pointer;
+   color                   : #cdcdcd;
+}
+
+
+
+#header {
+       width: 100%;
+       height: 102px;
+}
+
+#header h1 {
+       width: 63px;
+       height: 63px;
+       position: absolute;
+       margin: 0px;
+}
+
+#header h1 span {
+       display: none;
+}
+
+#header h2 {
+       display: none;
+}
+
+/* .menu-container is used to set properties common to .menu and .submenu */
+#header .menu-container {
+}
+
+#header .menu-container ul {
+       list-style-type: none;
+       list-style-position: inside;
+       margin: 0;
+}
+
+#header .menu-container li {
+       display: block;
+       float: right;
+}
+
+#header .menu {
+       height: 63px;
+       display: block;
+       background-image: url(menu_bg.png);
+       background-repeat: repeat-x;
+}
+
+#header .menu ul {
+       height: 100%;
+       display: block;
+       background-image: url(menu_bg_last.png);
+       background-repeat: no-repeat;
+       background-position: top right;
+       padding-right: 17px;
+}
+
+#header .menu li {
+       height: 100%;
+       text-align: center;
+       background-image: url(menu_bg_unsel.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu a {
+       height: 100%;
+       display: block;
+       color: #cdcdcd;
+       text-decoration: none;
+       font-size: 10pt;
+       line-height: 59px;
+       text-align: center;
+       padding: 0px 15px 0px 15px;
+}
+
+#header .menu li:hover {
+       background-image: url(menu_bg_hover.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu li:hover a {
+       color: #FFFFFF;
+}
+
+#header .menu li.current {
+       background-image: url(menu_bg_current.png);
+       background-repeat: no-repeat;
+}
+
+#header .menu li.current a {
+       color: #646464;
+}
+
+
+/* Hide all the submenus but the current */
+#header .submenu ul {
+       display: none;
+}
+
+#header .submenu .current {
+       display: block;
+}
+
+#header .submenu {
+       font: bold 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
+       margin-top: 10px;
+}
+
+#header .submenu a {
+       color: #888888;
+       text-decoration: none;
+       font-size: 0.9em;
+       line-height: 15px;
+       padding:0px 5px 0px 5px;
+}
+
+#header .submenu a:hover {
+       color: #444444;
+}
+
+#header .submenu li {
+       border-left: 1px solid #DDDDDD;
+}
+
+#header .submenu li:last-child {
+       border-left: 0;
+}
+
+#header .doxytitle {
+       position: absolute;
+       font-size: 1.8em;
+       font-weight: bold;
+       color: #444444;
+       line-height: 35px;
+}
+
+#header small {
+       font-size: 0.4em;
+}
+
+#footer {
+       background-image: url(foot_bg.png);
+       width: 100%;
+}
+
+#footer table {
+       width: 100%;
+       text-align: center;
+       white-space: nowrap;
+       padding: 5px 30px 5px 30px;
+       font-size: 0.8em;
+       font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+       color: #888888;
+}
+
+#footer td.copyright {
+       width: 100%;
 }
 
diff --git a/doc/ecore.dox.in b/doc/ecore.dox.in
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/examples.dox b/doc/examples.dox
new file mode 100644 (file)
index 0000000..cc7ec9d
--- /dev/null
@@ -0,0 +1,1692 @@
+/**
+ * @page Examples Examples
+ *
+ * Here is a page with some Ecore examples explained:
+ *
+ * @li @ref ecore_time_functions_example_c
+ * @li @ref ecore_timer_example_c
+ * @li @ref ecore_idler_example_c
+ * @li @ref ecore_job_example_c
+ * @li @ref ecore_event_example_01_c
+ * @li @ref ecore_event_example_02_c
+ * @li @ref ecore_fd_handler_example_c
+ * @li @ref ecore_poller_example_c
+ * @li @ref ecore_con_lookup_example_c
+ * @li @ref ecore_con_url_download_example_c
+ * @li @ref ecore_con_server_simple_example_c
+ * @li @ref ecore_con_client_simple_example_c
+ * @li @ref ecore_evas_callbacks_example_c
+ * @li @ref ecore_evas_object_example_c
+ * @li @ref ecore_evas_basics_example_c
+ * @li @ref Ecore_Evas_Window_Sizes_Example_c
+ * @li @ref Ecore_Evas_Buffer_Example_01_c
+ * @li @ref Ecore_Evas_Buffer_Example_02_c
+ * @li @ref Ecore_exe_simple_example_c
+ * @li @ref ecore_imf_example_c
+ */
+
+/**
+ * @page ecore_time_functions_example_c ecore_time - Differences between time functions
+ *
+ * This example shows the difference between calling ecore_time_get(),
+ * ecore_loop_time_get() and ecore_time_unix_get().
+ *
+ * It initializes ecore, then sets a timer with a callback that, when called,
+ * will retrieve the system time using these 3 different functions. After
+ * displaying the time, it sleeps for 1 second, then call display the time
+ * again using the 3 functions.
+ *
+ * Since everything occurs inside the same main loop iteration, the internal
+ * ecore time variable will not be updated, and calling ecore_loop_time_get()
+ * before and after the sleep() call will return the same result.
+ *
+ * The two other functions will return a difference of 1 second, as expected.
+ * But ecore_time_unix_get() returns the number of seconds since 00:00:00 1st
+ * January 1970, while ecore_time_get() will return the time since a
+ * unspecified point, but that never goes back in time, even when the timezone
+ * of the machine changes.
+ *
+ * @note The usage of ecore_loop_time_get() should be preferred against the
+ * two other functions, for most time calculations, since it won't produce a
+ * system call to get the current time. Use ecore_time_unix_get() when you need
+ * to know the current time and date, and ecore_time_get() when you need a
+ * monotonic and more precise time than ecore_loop_time_get().
+ *
+ * @include ecore_time_functions_example.c
+ */
+
+/**
+ * @page ecore_timer_example_c ecore timers - Scheduled events
+ * @dontinclude ecore_timer_example.c
+ *
+ * This example shows how to setup timer callbacks. It starts a timer that will
+ * tick (expire) every 1 second, and then setup other timers that will expire
+ * only once, but each of them will affect the first timer still executing with
+ * a different API, to demonstrate its usage. To see the full code for this
+ * example, click @ref ecore_timer_example.c "here".
+ *
+ * To demonstrate this, let's define some constants that will determine at which
+ * time each timer will expire:
+ *
+ * @until INTERVAL1
+ *
+ * These constants should tell by themselves what will be the behavior of the
+ * program, but I'll explain it anyway. The first timer is set to tick every 1
+ * second, but all the other timers until the 6th one will be started
+ * concurrently at the beginning of the program. Each of them will expire at the
+ * specified time in these constants:
+ *
+ * @li The timer2, after 3 seconds of the program being executed, will add a delay
+ * of 3 seconds to timer1;
+ * @li The timer3 will pause timer1 at 8.2 seconds;
+ * @li timer4 will resume timer1 at 11.0 seconds;
+ * @li timer5 will will change the interval of timer1 to 2 seconds;
+ * @li timer6 will stop timer1 and start timer7 and timer8, with 1.1 and 1.2
+ * seconds of interval, respectively; it also sets the precision to 0.2 seconds;
+ * @li timer7 and timer8 will just print their expiration time.
+ *
+ * @until ecore_time_get
+ * @until }
+ *
+ * As almost all the other examples, we create a context structure to pass to
+ * our callbacks, so they can have access to the other timers. We also store the
+ * time of the program start in @c _initial_time, and use the function
+ * @c _get_current_time to retrieve the current time relative to that time. This
+ * will help demonstrate what is going on.
+ *
+ * Now, the behavior and relationship between the timers that was described
+ * above is dictated by the following timer callbacks:
+ *
+ * @until _timer6_cb
+ * @until }
+ *
+ * It's possible to see the same behavior as other Ecore callbacks here,
+ * returning @ref ECORE_CALLBACK_RENEW when the timer needs to continue ticking,
+ * and @ref ECORE_CALLBACK_CANCEL when it needs to stop its execution. Also
+ * notice that later on our program we are checking for the timers pointers in
+ * the context to see if they are still executing before deleting them, so we
+ * need to set these timer pointers to @c NULL when we are returning @ref
+ * ECORE_CALLBACK_CANCEL. Otherwise the pointer would still be not @c NULL, but
+ * pointing to something that is invalid, since the timer would have already
+ * expired without renewing.
+ *
+ * Now the main code, which will start the timers:
+ *
+ * @until ecore_shutdown
+ * @until }
+ *
+ * This code is very simple. Just after starting the library, it will save the
+ * current time to @c _initial_time, start all timers from 1 to 6, and begin the
+ * main loop. Everything should be running right now, displaying the time which
+ * each timer is expiring, and what it is doing to affect the other timers.
+ *
+ * After returning from the main loop, every timer is checked to see if it's
+ * still alive and, in that case, deleted, before finalizing the library. This
+ * is not really necessary, since ecore_shutdown() will already delete them for
+ * you, but it's good practice if you have other things going on after this
+ * point that could restart the main loop.
+ *
+ */
+
+/**
+ * @page ecore_idler_example_c ecore idle state - Idlers, enterers and exiters
+ *
+ * This example demonstrates how to manage the idle state of the main loop. Once
+ * a program knows that the main loop is going to enter in idle state, it could
+ * start doing some processing until getting out of this state.
+ *
+ * To exemplify this, we also add events and a timer to this program, so we can
+ * see the idle exiter callback being called before processing the event and/or
+ * timer, the event/timer callback being called (processed), then the idle
+ * enterer being called before entering in idle state again. Once in idle, the
+ * main loop keeps calling the idler callback continuously until a new event or
+ * timer is received.
+ *
+ * First, we declare a struct that will be used as context to be passed to
+ * every callback. It's not useful everywhere, since this example is very
+ * simple and doesn't do anything other than printing messages, but using this
+ * context will make it a little bit more real. Our context will be used to
+ * delete the timer, idler, idle enterer and exiter, and the event handler, and
+ * also to count how many times the idler was called.
+ *
+ * Then we start declaring callbacks for the idle enterer, idle exiter and the
+ * idler itself. Idle enterer and exiter callbacks just print a message saying
+ * that they were called, while the idler, in addition to printing a message
+ * too, also sends an event every 10 times that it is called, incrementing the
+ * context count variable. This event will be used to make the main loop exit
+ * the idle state and call the event callback.
+ *
+ * These callbacks return @ref ECORE_CALLBACK_RENEW, since we want them to keep
+ * being called every time the main loop changes to/from idle state. Otherwise,
+ * if we didn't want them to be called again, they should return @ref
+ * ECORE_CALLBACK_CANCEL.
+ *
+ * The next function declared is the event callback @c _event_handler_cb. It
+ * will check if the idler was called more than 100 times already @c
+ * (ctxt->count > 100), and will delete the idler, idle enterer and exiter, the
+ * timer (if it still exists), and request that the main loop stop running. Then
+ * it returns @ref ECORE_CALLBACK_DONE to indicate that the event shouldn't be
+ * handled by any other callback.
+ *
+ * Finally, we add a callback to the timer, that will just print a message when
+ * it is called, and this will happen only once (@ref ECORE_CALLBACK_CANCEL is
+ * being returned). This timer callback is just here to show that the main loop
+ * gets out of idle state when processing timers too.
+ *
+ * The @b main function is simple, just creates a new type of event that we will
+ * use to demonstrate the event handling together with the idle state, adds the
+ * callbacks that we declared so far, fill the context struct, and starts
+ * running the main loop.
+ *
+ * @note We use timer and event callbacks to demonstrate the idle state
+ * changing, but it also happens for file descriptor handlers, pipe handlers,
+ * etc.
+ *
+ * @include ecore_idler_example.c
+ */
+
+/**
+ * @page ecore_job_example_c ecore_job - Queuing tasks
+ *
+ * This example shows how an @ref Ecore_Job can be added, how it can be
+ * deleted, and that they always execute in the added order.
+ *
+ * First, 2 callback functions are declared, one that prints strings passed to
+ * it in the @c data pointer, and another one that quits the main loop. In the
+ * @c main function, 3 jobs are added using the first callback, and another one
+ * is added using the second one.
+ *
+ * Then the second added job is deleted just to demonstrate the usage of
+ * ecore_job_del(), and the main loop is finally started. Run this example to
+ * see that @c job1, @c job3 and @c job_quit are ran, in this order.
+ *
+ * @include ecore_job_example.c
+ */
+
+/**
+ * @page ecore_event_example_01_c Handling events example
+ * This example shows the simplest possible way to register a handler for an
+ * ecore event, this way we can focus on the important aspects. The example will
+ * start the main loop and quit it when it receives the ECORE_EVENT_SIGNAL_EXIT
+ * event. This event is triggered by a SIGTERM(pressing ctrl+c).
+ *
+ * So let's start with the function we want called when we receive the event,
+ * instead of just stopping the main loop we'll also print a message, that's
+ * just so it's clear that it got called:
+ * @dontinclude ecore_event_example_01.c
+ * @skip static
+ * @until }
+ * @note We return ECORE_CALLBACK_DONE because we don't want any other handlers
+ * for this event to be called, the program is quitting after all.
+ *
+ * We then have our main function and the obligatory initialization of ecore:
+ * @until ecore_init
+ *
+ * We then get to the one line of our example that makes everything work, the
+ * registering of the callback:
+ * @until handler_add
+ * @note The @c NULL there is because there is no need to pass data to the
+ * callback.
+ *
+ * And the all that is left to do is start the main loop:
+ * @until }
+ *
+ * Full source code for this example: @ref ecore_event_example_01.c.
+ */
+
+/**
+ * @page ecore_event_example_02_c ecore events and handlers - Setup and use
+ * This example shows how to create a new type of event, setup some event
+ * handlers to it, fire the event and have the callbacks called. After
+ * finishing, we delete the event handlers so no memory will leak.
+ *
+ * See the full source code for this example @ref ecore_event_example_02.c
+ * "here".
+ *
+ * Let's start the example from the beginning:
+ *
+ * @dontinclude ecore_event_example_02.c
+ * @until _event_type
+ *
+ * First thing is to declare a struct that will be passed as context to the
+ * event handlers. In this structure we will store the event handler pointers,
+ * and two strings that will be used by the first event handler. We also will
+ * use a global integer to store the event type used for our event. It is
+ * initialized with 0 in the beginning because the event wasn't created yet.
+ * Later, in the main function we will use ecore_event_type_new() to associate
+ * another value to it. Now the event handler callbacks:
+ *
+ * @until }
+ *
+ * This is the first event handler callback. It prints the event data received
+ * by the event, and the data passed to this handler when it was added.  Notice
+ * that this callback already knows that the event data is an integer pointer,
+ * and that the handler data is a string. It knows about the first one because
+ * this is based on the type of event that is going to be handled, and the
+ * second because it was passed to the ecore_event_handler_add() function when
+ * registering the event handler.
+ *
+ * Another interesting point about this callback is that it returns @ref
+ * ECORE_CALLBACK_DONE (0) if the event data is even, swallowing the event and
+ * don't allowing any other callback to be called after this one for this event.
+ * Otherwise it returns @ref ECORE_CALLBACK_PASS_ON, allowing the event to be
+ * handled by other event handlers registered for this event. This makes the
+ * second event handler be called just for "odd" events.
+ *
+ * @until ECORE_CALLBACK_DONE
+ * @until }
+ *
+ * The second event handler will check if the event data is equal to 5, and if
+ * that's the case, it will change the event handler data of the first event
+ * handler to another string. Then it checks if the event data is higher than
+ * 10, and if so, it will request the main loop to quit.
+ *
+ * An interesting point of this example is that although the second event
+ * handler requests the main loop to finish after the 11th event being received,
+ * it will process all the events that were already fired, and call their
+ * respective event handlers, before the main loop stops. If we didn't want
+ * these event handlers to be called after the 11th event, we would need to
+ * unregister them with ecore_event_handler_del() at this point.
+ *
+ * Now some basic initialization of the context, and the Ecore library itself:
+ *
+ * @until type_new
+ *
+ * This last line is interesting. It creates a new type of event and returns a
+ * unique ID for this event inside Ecore. This ID can be used anywhere else in
+ * your program to reference this specific type of event, and to add callbacks
+ * to it.
+ *
+ * It's common if you are implementing a library that declares new types of
+ * events to export their respective types as extern in the header files. This
+ * way, when the library is initialized and the new type is created, it will be
+ * available through the header file to an application using it add some
+ * callbacks to it. Since our example is self-contained, we are just putting it
+ * as a global variable.
+ *
+ * Now we add some callbacks:
+ *
+ * @until ctxt);
+ *
+ * This is very simple. Just need to call ecore_event_handler_add() with the
+ * respective event type, the callback function to be called, and a data pointer
+ * that will be passed to the callback when it is called by the event.
+ *
+ * Then we start firing events:
+ *
+ * @until }
+ *
+ * This @c for will fire 16 events of this type. Notice that the events will be
+ * fired consecutively, but any callback will be called yet. They are just
+ * called by the main loop, and since it wasn't even started, nothing happens
+ * yet. For each event fired, we allocate an integer that will hold the number
+ * of the event (we are arbitrarily creating these numbers just for
+ * demonstration purposes). It's up to the event creator to decide which type of
+ * information it wants to give to the event handler, and the event handler must
+ * know what is the event info structure for that type of event.
+ *
+ * Since we are not allocating any complex structure, just a simple integer, we
+ * don't need to pass any special free function to ecore_event_add(), and it
+ * will use a simple @c free on our data. That's the default behavior.
+ *
+ * Now finishing our example:
+ *
+ * @until }
+ *
+ * We just start the main loop and watch things happen, waiting to shutdown
+ * Ecore when the main loop exits and return.
+ */
+
+/**
+ * @page ecore_fd_handler_example_c ecore fd handlers - Monitoring file descriptors
+ * @dontinclude ecore_fd_handler_example.c
+ *
+ * This is a very simple example where we will start monitoring the stdin of the
+ * program and, whenever there's something to be read, we call our callback that
+ * will read it.
+ *
+ * Check the full code for this example @ref ecore_fd_handler_example.c "here".
+ *
+ * This seems to be stupid, since a similar result could be achieved by the
+ * following code:
+ *
+ * @code
+ * while (nbytes = read(STDIN_FILENO, buf, sizeof(buf)))
+ *   {
+ *      buf[nbytes - 1] = '\0';
+ *      printf("Read %zd bytes from input: \"%s\"\n", nbytes - 1, buf);
+ *   }
+ * @endcode
+ *
+ * However, the above code is blocking, and won't allow you to do anything else
+ * other than reading the input. Of course there are other methods to do a
+ * non-blocking reading, like setting the file descriptor to non-blocking and
+ * keep looping always checking if there's something to be read, and do other
+ * things otherwise. Or use a @c select call to watch for more than one file
+ * descriptor at the same time.
+ *
+ * The advantage of using an @ref Ecore_Fd_Handler is that you can monitor a
+ * file descriptor, while still iterating on the Ecore main loop. It will allow
+ * you to have timers working and expiring, events still being processed when
+ * received, idlers doing its work when there's nothing happening, and whenever
+ * there's something to be read from the file descriptor, your callback will be
+ * called. And it's everything monitored in the same main loop, no threads are
+ * needed, thus reducing the complexity of the program and any overhead caused
+ * by the use of threads.
+ *
+ * Now let's start our program. First we just declare a context structure that
+ * will be passed to our callback, with pointers to our handler and to a timer
+ * that will be used later:
+ *
+ * @until };
+ *
+ * Then we will declare a prepare_callback that is called before any fd_handler
+ * set in the program, and before the main loop select function is called. Just
+ * use one if you really know that you need it. We are just putting it here to
+ * exemplify its usage:
+ *
+ * @until }
+ *
+ * Now, our fd handler. In its arguments, the @c data pointer will have any data
+ * passed to it when it was registered, and the @c handler pointer will contain
+ * the fd handler returned by the ecore_main_fd_handler_add() call. It can be
+ * used, for example, to retrieve which file descriptor triggered this callback,
+ * since it could be added to more than one file descriptor, or to check what
+ * type of activity there's in the file descriptor.
+ *
+ * The code is very simple: we first check if the type of activity was an error.
+ * It probably won't happen with the default input, but could be the case of a
+ * network socket detecting a disconnection. Next, we get the file descriptor
+ * from this handler (as said before, the callback could be added to more than
+ * one file descriptor), and read it since we know that it shouldn't block,
+ * because our fd handler told us that there's some activity on it. If the
+ * result of the read was 0 bytes, we know that it's an end of file (EOF), so we
+ * can finish reading the input. Otherwise we just print the content read from
+ * it:
+ *
+ * @until }
+ *
+ * Also notice that this callback returns @ref ECORE_CALLBACK_RENEW to keep
+ * being called, as almost all other Ecore callbacks, otherwise if it returns
+ * @ref ECORE_CALLBACK_CANCEL then the file handler would be deleted.
+ *
+ * Just to demonstrate that our program isn't blocking in the input read but
+ * still can process other Ecore events, we are going to setup an @ref
+ * Ecore_Timer. This is its callback:
+ *
+ * @until }
+ *
+ * Now in the main code we are going to initialize the library, and setup
+ * callbacks for the file descriptor, the prepare callback, and the timer:
+ *
+ * @until timer_add
+ *
+ * Notice that the use of ecore_main_fd_handler_add() specifies what kind of
+ * activity we are monitoring. In this case, we want to monitor for read (since
+ * it's the standard input) and for errors. This is done by the flags @ref
+ * ECORE_FD_READ and @ref ECORE_FD_ERROR. For the three callbacks we are also
+ * giving a pointer to our context structure, which has pointers to the handlers
+ * added.
+ *
+ * Then we can start the main loop and see everything happening:
+ *
+ * @until }
+ *
+ * In the end we are just deleting the fd handler and the timer to demonstrate
+ * the API usage, since Ecore would already do it for us on its shutdown.
+ */
+
+/**
+ * @page ecore_poller_example_c ecore poller - Repetitive polling tasks
+ * @dontinclude ecore_poller_example.c
+ *
+ * This example show how to setup, and explains how an @ref Ecore_Poller is
+ * called. You can @ref ecore_poller_example.c "see the full source code here".
+ *
+ * In this example we store the initial time of the program just to use as
+ * comparison to the time when the poller callbacks are called. It will be
+ * stored in @c _initial_time :
+ *
+ * @until initial_time
+ *
+ * Then next step is to define the poller callback. This callback assumes that a
+ * @c data pointer is passed to it on creation, and is a string just used to
+ * identify the poller. The callback prints this string and the time since the
+ * program started, and returns @ref ECORE_CALLBACK_RENEW to keep being called.
+ *
+ * @until }
+ *
+ * Now in the main function we initialize Ecore, and save the initial time of
+ * the program, so we can compare it later with the time that the pollers are
+ * being called:
+ *
+ * @until initial_time
+ *
+ * Then we change the poll interval to 0.3 seconds (the default is 0.125
+ * seconds) just to show the API usage.
+ *
+ * Finally, we create two pollers, one that will be called every 4 ticks, and
+ * another one that will be called every 8 ticks. This means the the first
+ * poller interval will be around 1.2 seconds, and the second one will be
+ * around 2.4 seconds. But the most important point is: since the second poller
+ * interval is a multiple of the first one, they will be always synchronized.
+ * Ecore calls pollers that are in the "same tick" together. It doesn't go back
+ * to the main loop and check if there's another poller to execute at this
+ * time, but instead it calls all the pollers registered to this "tick" at the
+ * same time.  See the description of ecore_poller_add() for more details. This
+ * is easy to see in the time printed by both of them.
+ *
+ * If instead of two synchronized pollers, we were using two different timers,
+ * one with interval of 1.2 seconds and another one with an interval of 2.4
+ * seconds, there would be no guarantee that they would be totally in sync. Some
+ * delay in the execution of another task, or even in the task called in the
+ * callback, could make them get out of sync, forcing Ecore's main loop to wake
+ * up more than necessary.
+ *
+ * Well, this is the code that create these two pollers and set the poll
+ * interval, then starts the main loop:
+ *
+ * @until ecore_main_loop_begin
+ *
+ * If you hit CTRL-C during the execution of the program, the main loop will
+ * quit, since there are some signal handlers already set by default to do this.
+ * So after the main loop begin call, we change the second poller's interval to
+ * 16 ticks, so it will happen each 4.8 seconds (or each 4 times that the first
+ * poller is called).
+ *
+ * This means: the program is started, the first poller is called each 4 ticks
+ * and the second is called each 8 ticks. After CTRL-C is used, the second
+ * poller will be called each 16 ticks.
+ *
+ * @until }
+ *
+ * The rest of the program is just deleting the pollers and shutting down the
+ * library.
+ */
+
+/**
+ * @page ecore_con_lookup_example_c Ecore_Con - DNS lookup
+ *
+ * This is a very simple example that shows how to make a simple DNS lookup
+ * using ecore_con_lookup().
+ *
+ * It's possible to see in the beginning of the main function that we are using
+ * the arguments passed via command line. This is the address that we are going
+ * to make the DNS lookup on.
+ *
+ * The next step is to initialize the libraries, and just call
+ * ecore_con_lookup(). This function will get the string that contains the
+ * address to be resolved as first parameter, then a callback that will be
+ * called when the resolve stage is done, and finally a data pointer that will
+ * be passed to the callback.
+ *
+ * This function is asynchronous, and the callback will be called only on
+ * success. If there was an error during the resolve stage, there's no way to
+ * know about that. It's only possible to know about errors when setting up the
+ * lookup, by looking at the return code of the ecore_con_lookup() function.
+ *
+ * The callback @c _lookup_done_cb passed as argument to ecore_con_lookup() just
+ * prints the resolved canonical name, IP, address of the sockaddr structure,
+ * and the length of the socket address (in bytes).
+ *
+ * Finally, we start the main loop, and after that we finalize the libraries and
+ * exit.
+ *
+ * This is the code for this simple example:
+ *
+ * @include ecore_con_lookup_example.c
+ */
+
+/**
+ * @page ecore_con_url_download_example_c Ecore_Con_Url - downloading a file
+ *
+ * This is a simple example that shows how to download a file using @ref
+ * Ecore_Con_Url. The full source code for this example can be found at @ref
+ * ecore_con_url_download_example.c.
+ *
+ * First we are setting some callbacks for events that will be sent when data
+ * arrives in our connection (the data is the content of the file being
+ * downloaded), and when the download is completed. The @c _url_progress_cb and
+ * @c _url_complete_cb are these callbacks:
+ *
+ * @dontinclude ecore_con_url_download_example.c
+ * @skip struct
+ * @until main_loop_quit
+ * @until }
+ *
+ * Notice that we also declared a struct that will hold how many bytes were
+ * downloaded through this object. It will be set in the @c main function using
+ * ecore_con_url_data_set().
+ *
+ * In the next step, on the @c main function, we open a file where we are going
+ * to save the content being downloaded:
+ *
+ * @until open(
+ * @until }
+ *
+ * With the file successfully open, let's create our @ref Ecore_Con_Url object.
+ * For this, we initialize the libraries and create the object:
+ *
+ * @until }
+ *
+ * Then we allocate and set the data struct to the connection object, and set a
+ * file descriptor from our previously open file to it. We also add the event
+ * handlers (callbacks) to the events that will be emitted on data being
+ * received and download complete:
+ *
+ * @until complete_cb
+ *
+ * Finally we start our request, and run the main loop:
+ *
+ * @until return 0
+ * @until }
+ *
+ * The rest of this code was just freeing resources, with some labels to be used
+ * for error handling.
+ */
+
+/**
+ * @page ecore_con_url_cookies_example_c Ecore_Con_Url - Managing cookies
+ *
+ * This example shows how to use an @ref Ecore_Con_Url and enable it to
+ * receive/send cookies. These cookies can be set by the server, saved to a
+ * file, loaded later from this file and sent again to the server. The complete
+ * example can be found at @ref ecore_con_url_cookies_example.c
+ * "ecore_con_url_cookies_example.c"
+ *
+ * First we are setting some callbacks for events that will be sent when data
+ * arrives in our connection (the data is the content of the file being
+ * downloaded), and when the download is completed. The @c _url_data_cb and
+ * @c _url_complete_cb are these callbacks:
+ *
+ * @dontinclude ecore_con_url_download_example.c
+ * @skip Eina_Bool
+ * @until main_loop_quit
+ * @until }
+ *
+ * In the @c main function we parse some parameter from the command line. These
+ * parameters are the url that we are connecting to, and cookie use policy.
+ *
+ * After that we initialize the libraries and create a handler to our request
+ * using the given url:
+ *
+ * @until goto end
+ * @until }
+ *
+ * We also set the event handlers for this request and add a header to it, that
+ * will inform our custom user agent:
+ *
+ * @until User-Agent
+ *
+ * Now we start playing with cookies. First, let's call
+ * ecore_con_url_cookies_init() to inform that we want cookies enabled. We also
+ * set a file from which we are loading previously set (old) cookies, in case
+ * that we don't want to clear old cookies or old session cookies.
+ *
+ * After that we set the file where we are going to save all valid cookies in
+ * the @ref Ecore_Con_Url object. This includes previously loaded cookies (that
+ * weren't cleared) and new cookies set by the response header "Set-Cookie" that
+ * comes with the response to our request:
+ *
+ * @until jar_file_set
+ *
+ * And finally, before performing the request, we check the command passed as
+ * argument in the command line and use it to choose between clearing old
+ * cookies, clearing just old session cookies, or ignoring old session cookies.
+ *
+ * After that we just finish our code as expected:
+ *
+ * @until return
+ * @until }
+ *
+ * Notice that in this code, if we want to clear old cookies, we also don't load
+ * them from the file. This is a bit confusing and the API isn't clear, but
+ * ecore_con_url_cookies_file_add() will load cookies from the specified files
+ * just when the operation is really performed (i.e. ecore_con_url_get() is
+ * called). So if ecore_con_url_cookies_clear() is called before
+ * ecore_con_url_get(), the old cookies may not have been loaded yet, so they
+ * are not cleared. To avoid having old cookies loaded, don't add any cookie
+ * file with ecore_con_url_cookies_file_add().
+ *
+ * The function ecore_con_url_cookies_clear() is just useful to clear cookies
+ * that are already loaded/valid in the @ref Ecore_Con_Url object (from a
+ * previous request, for example).
+ */
+
+/**
+ * @page ecore_con_url_headers_example_c Ecore_Con_Url - customizing a request
+ *
+ * This is a simple example that shows how to make a custom request using @ref
+ * Ecore_Con_Url. The full source code for this example can be found at @ref
+ * ecore_con_url_headers_example.c.
+ *
+ * The first part of the example is setting the callbacks to be called when an
+ * #ECORE_CON_EVENT_URL_DATA or #ECORE_CON_EVENT_URL_COMPLETE event is received.
+ * These are the callbacks that are going to be used with this:
+ *
+ * @dontinclude ecore_con_url_headers_example.c
+ * @skip static
+ * @until main_loop_quit
+ * @until }
+ *
+ * The @c main code is as simple as the @ref Ecore_Con_Url example. It contains
+ * some checks for the arguments to see if a GET or POST request is required:
+ *
+ * @until GET
+ * @until }
+ *
+ * Then we start our required libraries and configure a global option to use
+ * pipelined requests:
+ *
+ * @until pipeline_set
+ *
+ * Now we create our request object, but using ecore_con_url_custom_new() to use
+ * a POST or GET method depending on the command line arguments. And we also add
+ * the event handlers for our callbacks:
+ *
+ * @until complete_cb
+ *
+ * In order to demonstrate our API, some options are set to this request before
+ * actually performing it:
+ *
+ * @until url_time
+ *
+ * Depending on what kind of request was asked (GET or POST), we use one of the
+ * specific functions to perform it:
+ *
+ * @until url_post
+ *
+ * After that, we just check for errors, start the main loop, free resources and
+ * finally exit:
+ *
+ * @until return
+ * @until }
+ */
+
+/**
+ * @page ecore_con_server_simple_example_c Ecore_Con - Creating a server
+ *
+ * In this example we are going to create a server that listens for connections
+ * from clients through a TCP port. You can get the full source code at @ref
+ * ecore_con_server_simple_example.c.
+ *
+ * We begin our example in the main function, to demonstrate how to setup
+ * things, and then go to the callbacks that are needed for it to run properly.
+ *
+ * In the @c main function, after initializing the libraries, we use
+ * ecore_con_server_add() to startup the server. Look at the reference
+ * documentation of this function: it supports many types of server, and we are
+ * going to use #ECORE_CON_REMOTE_TCP (a TCP based server). Other arguments to
+ * this function are the address where we are listening on, the port, and a data
+ * pointer that will associate that data with the server:
+ *
+ * @dontinclude ecore_con_server_simple_example.c
+ * @skip main(void)
+ * @until exit
+ *
+ * Notice that we are listening only on 127.0.0.1, which is the internal
+ * loopback interface. If the server needs to listening on all of its ips, use
+ * 0.0.0.0 instead.
+ *
+ * We also need to set event handlers to be called when we receive any data from
+ * the clients, when a new client connects to our server, or when a client
+ * disconnects. These callbacks are:
+ *
+ * @until CLIENT_DATA
+ *
+ * More details about what these callbacks do will be given later.
+ *
+ * Now, before running the main loop, we also want to set some limits to our
+ * server. To avoid it to be overloaded with too many connections to handle, we
+ * are going to set a maximum of 3 clients connected at the same time. This
+ * number is used just to demonstrate the API. A good number to be used here
+ * would need to be determined by tests done on the server, to check the load
+ * supported by it.
+ *
+ * Any other client trying to connect to this server, after the limit is
+ * reached, will wait until one of the connected clients disconnect and the
+ * server accepts the new connection.
+ *
+ * Another important thing to do is setting a timeout, to avoid that a client
+ * hold a connection for too long without doing anything. This timeout will
+ * disconnect the idle client, allowing that other clients that may be waiting
+ * to connect finally can do it.
+ *
+ * Then we just start the main loop:
+ *
+ * @until main_loop_begin
+ *
+ * After exiting the main loop, we print the list of connected clients, and also
+ * free the data associated with each respective client. This data was
+ * previously associated using ecore_con_client_data_set():
+ *
+ * @until }
+ *
+ * Then before exiting we show the total uptime of the server:
+ *
+ * @until uptime
+ *
+ * Now let's go back to the used callbacks.
+ *
+ * The first callback, @c _add, is registered to the event
+ * #ECORE_CON_EVENT_CLIENT_ADD, which will be called whenever a client connects
+ * to the server.
+ *
+ * This callback will associate a data structure to this client, that will be
+ * used to count how many bytes were received from it. It also prints some info
+ * about the client, and send a welcome string to it. ecore_con_client_flush()
+ * is used to ensure that the string is sent immediately, instead of being
+ * buffered.
+ *
+ * A timeout for idle specific for this client is also set, to demonstrate that
+ * it is independent of the general timeout of the server.
+ *
+ * Before exiting, the callback will display a list of all clients still
+ * connected to this server. The code for this callback follows:
+ *
+ * @dontinclude ecore_con_server_simple_example.c
+ * @skip Eina_Bool
+ * @until CALLBACK_RENEW
+ * @until }
+ *
+ * The second callback is @c _del. It is associated with
+ * #ECORE_CON_EVENT_CLIENT_DEL, and is called whenever a client disconnects from
+ * this server.
+ *
+ * It will just print some information about the client, free the associated
+ * data structure, and call ecore_con_client_del() on it before exiting the
+ * callback. Here's its code:
+ *
+ * @until CALLBACK_RENEW
+ * @until }
+ *
+ * The last callback will print any data received by this server from its
+ * clients. It also increments the "bytes received" counter, sdata, in the
+ * data structure associated with this client. The callback code follows:
+ *
+ * @until CALLBACK_RENEW
+ * @until }
+ *
+ * The important parts of this example were described above. If you need to see
+ * the full source code for it, there's a link to the code in the beginning of
+ * this page.
+ *
+ * This example will start a server and start accepting connections from clients, as
+ * demonstrated in the following diagram:
+ * @htmlonly
+ * <img src="ecore_con-client-server-example.png" style="max-width: 400px"/>
+ * <a href="ecore_con-client-server-example.png">Full size</a>
+ * @endhtmlonly
+ *
+ * @image rtf ecore_con-client-server-example.png
+ * @image latex ecore_con-client-server-example.eps width=\textwidth
+ *
+ * @note This example contains a serious security flaw: it doesn't check for the
+ * size of data being received, thus allowing to the string to be exploited in
+ * some way. However, it is left like this to make the code simpler and just
+ * demonstrate the API usage.
+ */
+
+/**
+ * @page ecore_con_client_simple_example_c Ecore_Con - Creating a client
+ *
+ * Following the same idea as the @ref ecore_con_server_simple_example_c , this
+ * example will demonstrate how to create a client that connects to a specified
+ * server through a TCP port. You can see the full source code at @ref
+ * ecore_con_client_simple_example.c.
+ *
+ * Starting from the @c main function, after reading the command line argument
+ * list and initializing the libraries, we try to connect to the server:
+ *
+ * @dontinclude ecore_con_client_simple_example.c
+ * @skip main(
+ * @until exit(2)
+ * @until }
+ *
+ * After doing this, everything else in @c main is setting up callbacks for the
+ * client events, starting the main loop and shutting down the libraries after
+ * it.
+ *
+ * Now let's go to the callbacks. These callbacks are very similar to the server
+ * callbacks (our implementation for this example is very simple). On the
+ * @c _add callback, we just set a data structure to the server, print some
+ * information about the server, and send a welcome message to it:
+ *
+ * @dontinclude ecore_con_client_simple_example.c
+ * @skip Eina_Bool
+ * @until CALLBACK_RENEW
+ * @until }
+ *
+ * The @c _del callback is as simple as the previous one. We free the data
+ * associated with the server, print the uptime of this client, and quit the
+ * main loop (since there's nothing to do once we disconnect):
+ *
+ * @until CALLBACK_RENEW
+ * @until }
+ *
+ * The @c _data callback is also similar to the server data callback. it will
+ * print any received data, and increase the data counter in the structure
+ * associated with this server:
+ *
+ * @skip Eina_Bool
+ * @until CALLBACK_RENEW
+ * @until }
+ *
+ * You can see the server counterpart functions of the ones used in this example
+ * in the @ref ecore_con_server_simple_example_c.
+ *
+ * This example will connect to the server and start comunicating with it, as
+ * demonstrated in the following diagram:
+ * @htmlonly
+ * <img src="ecore_con-client-server-example2.png" style="max-width: 400px"/>
+ * <a href="ecore_con-client-server-example2.png">Full size</a>
+ * @endhtmlonly
+ *
+ * @image rtf ecore_con-client-server-example2.png
+ * @image latex ecore_con-client-server-example2.eps width=\textwidth
+ *
+ * @note This example contains a serious security flaw: it doesn't check for the
+ * size of data being received, thus allowing to the string to be exploited in
+ * some way. However, it is left like this to make the code simpler and just
+ * demonstrate the API usage.
+ */
+
+/**
+ * @example ecore_idler_example.c
+ * This example shows when @ref Ecore_Idler, @ref Ecore_Idle_Enterer and @ref
+ * Ecore_Idle_Exiter are called. See
+ * @ref ecore_idler_example_c "the explanation here".
+ */
+
+/**
+ * @example ecore_job_example.c
+ * This example shows how to use an @ref Ecore_Job. See
+ * @ref ecore_job_example_c "the explanation here".
+ */
+
+/**
+ * @example ecore_time_functions_example.c
+ * Shows the difference between the three time functions. See @ref
+ * ecore_time_functions_example_c "the example explained".
+ */
+
+/**
+ * @example ecore_timer_example.c
+ * This example show how to use timers to have timed events inside ecore.
+ * See @ref ecore_timer_example_c "the example explained".
+ */
+
+/**
+ * @example ecore_exe_example_child.c
+ * This is a child process used to receive messages and send it back
+ * to its father.
+ * Check the @ref Ecore_exe_simple_example_c "Full tutorial"
+ */
+
+/**
+ * @example ecore_exe_example.c
+ * This is a process that will send messages to a child and it will stop
+ * when it receives "quit".
+ * Check the @ref Ecore_exe_simple_example_c "Full tutorial"
+ */
+
+/**
+ * @example ecore_fd_handler_example.c
+ * This example shows how to setup and use an fd_handler. See
+ * @ref ecore_fd_handler_example_c "the explanation here".
+ */
+
+/**
+ * @example ecore_poller_example.c
+ * This example shows how to setup and use a poller. See
+ * @ref ecore_poller_example_c "the explanation here".
+ */
+
+/**
+ * @example ecore_event_example_01.c
+ * This example shows how to create an event handler. Explanation: @ref
+ * ecore_event_example_01_c
+ */
+
+/**
+ * @example ecore_event_example_02.c
+ * This example shows how to setup, change, and delete event handlers. See
+ * @ref ecore_event_example_02_c "the explanation here".
+ */
+
+/**
+ * @example ecore_fd_handler_gnutls_example.c
+ * Shows how to use fd handlers.
+ */
+
+/**
+ * @example ecore_con_lookup_example.c
+ * Shows how to make a simple DNS lookup. See the complete example description
+ * at @ref ecore_con_lookup_example_c
+ */
+
+/**
+ * @example ecore_con_url_download_example.c
+ * Shows how to download a file using an @ref Ecore_Con_Url object. See the
+ * complete example description at @ref ecore_con_url_download_example_c
+ */
+
+/**
+ * @example ecore_con_url_cookies_example.c
+ * Shows how to manage cookies on a @ref Ecore_Con_Url object. See the complete
+ * example description at @ref ecore_con_url_cookies_example_c.
+ */
+
+/**
+ * @example ecore_con_server_simple_example.c
+ * Shows how to setup a simple server that accepts client connections and sends
+ * a "hello" string to them. See the complete example description at @ref
+ * ecore_con_server_simple_example_c
+ */
+
+/**
+ * @example ecore_con_client_simple_example.c
+ * Shows how to setup a simple client that connects to a server and sends a
+ * "hello" string to it. See the complete example description at @ref
+ * ecore_con_client_simple_example_c
+ */
+
+/**
+ * @example ecore_con_url_headers_example.c
+ * Shows how to make GET or POST requests using an @ref Ecore_Con_Url object,
+ * and make use of most of its API.  See the complete example description at
+ * @ref ecore_con_url_headers_example_c
+ */
+
+/**
+ * @page tutorial_ecore_pipe_gstreamer_example
+ *
+ * Here is an example that uses the pipe wrapper with a Gstreamer
+ * pipeline. For each decoded frame in the Gstreamer thread, a handle
+ * is called in the ecore thread.
+ *
+ * @include ecore_pipe_gstreamer_example.c
+ * @example ecore_pipe_gstreamer_example.c
+ */
+
+/**
+ * @page tutorial_ecore_pipe_simple_example
+ * @dontinclude ecore_pipe_simple_example.c
+ *
+ * This example shows some simple usage of ecore_pipe. We are going to create a
+ * pipe, fork our process, and then the child is going to communicate to the
+ * parent the result of its processing through the pipe.
+ *
+ * As always we start with our includes, nothing special:
+ * @skip #include
+ * @until Ecore.h
+ *
+ * The first thing we are going to define in our example is the function we are
+ * going to run on the child process, which, as mentioned, will do some
+ * processing and then will write the result to the pipe:
+ * @until }
+ * @until }
+ * @note The sleep was added so the parent process would think the child process
+ * was doing something interesting...
+ *
+ * Next up is our function for handling data arriving in the pipe. It copies the
+ * data to another buffer, adds a terminating NULL and prints it. Also if it
+ * receives a certain string it stops the main loop(effectively ending the
+ * program):
+ * @until }
+ * @until }
+ *
+ * And now on to our main function, we start by declaring some variables and
+ * initializing ecore:
+ * @until ecore_init
+ *
+ * And since we are talking about pipes let's create one:
+ * @until pipe_add
+ *
+ * Now we are going to fork:
+ * @until fork
+ * @note duh...
+ *
+ * The child process is going to do the our fancy processing:
+ * @until }
+ * @note It's very important to call ecore_pipe_read_close() here so that the
+ * child process won't read what it is writing to the pipe itself.
+ *
+ * And the parent is going to run ecore's main loop waiting for some data:
+ * @until }
+ * @note Calling ecore_pipe_write_close() here isn't important but since we
+ * aren't going to write in the pipe it is good practice.
+ *
+ * And finally when done processing(the child) or done receiving(the parent) we
+ * delete the pipe and shutdown ecore:
+ * @until }
+ *
+ * @example ecore_pipe_simple_example.c
+ */
+
+/**
+ * @page tutorial_ecore_animator Ecore animator example
+ * @dontinclude ecore_animator_example.c
+ *
+ * For this example we are going to animate a rectangle growing, moving and
+ * changing color, and then move it back to it's initial state with a
+ * different animation. We are also going to have a second rectangle moving
+ * along the bottom of the screen. To do this we are going to use ecore_evas,
+ * but since that is not the focus here we won't going into detail about it.
+ *
+ * @skip #include
+ * @until evas_object_show
+ * @until evas_object_show
+ * All of this is just setup, not what we're interested in right now.
+ *
+ * Now we are going to set the frametime for our animation to one fiftieth of
+ * a second, this will make our program consume more resources but should make
+ * our animation extra smooth:
+ * @until frametime
+ *
+ * And now we get right to the business of creating our ecore_animator:
+ * @until timeline
+ * @note We are telling our animation to last 10 second and to call
+ * _advance_frame with rect as data.
+ *
+ * So far we setup the first and second animations, the third one however is a
+ * bit different, this time we won't use a timeline animation, that's because we
+ * don't want our animation to stop:
+ * @until animator_add
+ *
+ * Next we set a few timers to execute _start_second_anim, _freeze_third_anim
+ * and _thaw_thir_anim in 10, 5 and 10 seconds respectively:
+ * @until thaw
+ *
+ * And now we tell ecore to begin the main loop and free some resources once
+ * it leaves the main loop:
+ * @until }
+ *
+ * Here we have the callback function for our first animation, which first
+ * takes @p pos(where in the timeline we are), maps it to a SPRING curve that
+ * which will wobble 15 times and will decay by a factor of 1.2:
+ * @until pos_map
+ *
+ * Now that we have the frame we can adjust the rectangle to its appropriate
+ * state:
+ * @until }
+ *
+ * And now the callback that will run 10 seconds after the program starts(5
+ * seconds after the first animation finishes) and starts our second
+ * animation:
+ * @until }
+ * @note For this animation we made the frametime much larger which means our
+ * animation might get "jerky".
+ *
+ * The callback for our second animation, our savvy reader no doubt noted that
+ * it's very similar to the callback for the first animation. What we change for
+ * this one is the type of animation to BOUNCE and the number of times it will
+ * bounce to 50:
+ * @until }
+ *
+ * And for our last animation callback something simpler, we just move our
+ * rectangle right by one pixel until it reaches the end of the screen and then
+ * start at the beginning again:
+ * @until }
+ *
+ * Our next two functions respectively freezes and thaw our third animation, so
+ * that it won't happen for the 5 seconds after the first animation ends and the
+ * second animation begins:
+ * @until }
+ * @until }
+ *
+ * @example ecore_animator_example.c
+ */
+
+/**
+ * @page ecore_thread_example_c Ecore_Thread - API overview
+ *
+ * Working with threads is hard. Ecore helps to do so a bit easier, but as
+ * the example in @ref ecore_thread_example.c "ecore_thread_example.c" shows,
+ * there's a lot to consider even when doing the most simple things.
+ *
+ * We'll be going through this thorough example now, showing how the differents
+ * aspects of @ref Ecore_Thread are used, but users are encourage to avoid
+ * threads unless it's really the only option, as they always add more
+ * complexity than the program usually requires.
+ *
+ * Ecore Threads come in two flavors, short jobs and feedback jobs. Short jobs
+ * just run the given function and are more commonly used for small tasks
+ * where the main loop does not need to know how the work is going in between.
+ * The short job in our example is so short we had to artificially enlarge it
+ * with @c sleep(). Other than that, it also uses threads local data to keep
+ * the data we are working with persistent across different jobs ran by the
+ * same system thread. This data will be freed when the no more jobs are
+ * pending and the thread is terminated. If the data doesn't exist in the
+ * thread's storage, we create it and save it there for future jobs to find
+ * it. If creation fails, we cancel ourselves, so the main loop knows that
+ * we didn't just exit normally, meaning the job could not be done. The main
+ * part of the function checks in each iteration if it was canceled by the
+ * main loop, and if it was, it stops processing and clears the data from the
+ * storage (we assume @c cancel means no one else will need this, but this is
+ * really application dependent).
+ * @dontinclude ecore_thread_example.c
+ * @skip static void
+ * @until sleep(1)
+ * @until }
+ * @until }
+ *
+ * Feedback jobs, on the other hand, run tasks that will inform back to the
+ * main loop its progress, send partial data as is processed, just ping saying
+ * it's still alive and processing, or anything that needs the thread to talk
+ * back to the main loop.
+ * @skip static void
+ * @until the_end
+ * @until }
+ *
+ * Finally, one more feedback job, but this one will be running outside of
+ * Ecore's pool, so we can use the pool for real work and keep this very
+ * light function unchecked. All it does is check if some condition is met
+ * and send a message to the main loop telling it it's time to close.
+ * @skip static void
+ * @until }
+ * @until }
+ * @until }
+ *
+ * Every now and then the program prints its status, counting threads running
+ * and pending jobs.
+ * @skip static void
+ * @until }
+ *
+ * In our main loop, we'll be receiving messages from our feedback jobs using
+ * the same callback for both of them.
+ * @skip static void
+ * @until char *str
+ *
+ * The light job running out of the pool will let us know when we can exit our
+ * program.
+ * @until }
+ *
+ * Next comes the handling of data sent from the actual worker threads, always
+ * remembering that the data belongs to us now, and not the thread, so it's
+ * our responsibility to free it.
+ * @until }
+ * @until }
+ *
+ * Last, the condition to exit is given by how many messages we want to handle,
+ * so we need to count them and inform the condition checking thread that the
+ * value changed.
+ * @until }
+ *
+ * When a thread finishes its job or gets canceled, the main loop is notified
+ * through the callbacks set when creating the task. In this case, we just
+ * print what happen and keep track of one of them used to exemplify canceling.
+ * Here we are pretending one of our short jobs has a timeout, so if it doesn't
+ * finish before a timer is triggered, it will be canceled.
+ * @skip static void
+ * @until _cancel_timer_cb
+ * @until }
+ *
+ * The main function does some setup that includes reading parameters from
+ * the command line to change its behaviour and test different results.
+ * These are:
+ * @li -t \<some_num\> maximum number of threads to run at the same time.
+ * @li -p \<some_path\> adds @c some_path to the list used by the feedback jobs.
+ * This parameter can be used multiple times.
+ * @li -m \<some_num\> the number of messages to process before the program is
+ * signalled to exit.
+ *
+ * Skipping some bits, we init Ecore and our application data.
+ * @skip ecore_init
+ * @until appdata.max_msgs
+ *
+ * If any paths for the feedback jobs were given, we use them, otherwise we
+ * fallback to some defaults. Always initializing the proper mutexes used by the
+ * threaded job.
+ * @skip path_list
+ * @until EINA_LIST_FREE
+ * @until }
+ * @until }
+ *
+ * Initialize the mutex needed for the condition checking thread
+ * @skip appdata.mutex
+ * @until appdata.condition
+ *
+ * And start our tasks.
+ * @until appdata.thread_3
+ * @until EINA_FALSE
+ *
+ * To finalize, set a timer to cancel one of the tasks if it doesn't end
+ * before the timeout, one more timer for status report and get into the main
+ * loop. Once we are out, destroy our mutexes and finish the program.
+ * @until _status_timer_cb
+ * @until }
+ *
+ * @example ecore_thread_example.c
+ */
+
+/**
+ * @page ecore_evas_callbacks_example_c Ecore Evas Callbacks
+ * @dontinclude ecore_evas_callbacks.c
+ *
+ * Our example is remarkably simple, all it does is create an Ecore_Evas and
+ * register a callback for a bunch of events. What's interesting here is
+ * knowing when each of these callbacks will be called, however since that
+ * depends on the underlying windowing system there are no guarantees that all
+ * of the callbacks will be called for your windowing system. To know which
+ * callbacks will be called for your windowing system run the example and
+ * redirect the output to a file, and take a look at it.
+ *
+ * @note Make sure you minimize, resize, give and remove focus to see more
+ * callbacks called.
+ *
+ * The example is constituted of two main parts, first is the implementation of
+ * callbacks that will be called for each event(all our callbacks do is print
+ * their own name) and the second is the main function where we register the
+ * event callbacks and run the main loop:
+ * @include ecore_evas_callbacks.c
+ * @example ecore_evas_callbacks.c
+ */
+
+/**
+ * @page Ecore_Evas_Window_Sizes_Example_c Ecore_Evas window size hints
+ *
+ * On this example, we show you how to deal with @c Ecore_Evas window
+ * size hints, which are implemented <b>per Evas engine</b>.
+ *
+ * We start by defining an initial size for our window and, after
+ * creating it, adding a background white rectangle and a text object
+ * to it, to be used to display the current window's sizes, at any
+ * given time:
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip define WIDTH
+ * @until define
+ * @until define
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip evas_init
+ * @until show(bg)
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip text =
+ * @until main_loop_begin
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip to inform
+ * @until }
+ *
+ * The program has a command line interface, responding to the
+ * following keys:
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip commands
+ * @until ;
+ *
+ * Use the @c 'm' key to impose a minimum size of half the initial
+ * ones on our window. Test it by trying to resize it to smaller sizes
+ * than that:
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip keyname, "m"
+ * @until }
+ * @until }
+ * @until }
+ *
+ * The @c 'x' key will, in turn, set a maximum size on our window --
+ * to two times our initial size. Test it by trying to resize the
+ * window to bigger sizes than that:
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip keyname, "x"
+ * @until }
+ * @until }
+ * @until }
+ *
+ * Window base sizes will override any minimum sizes set, so try it
+ * with the @c 'b' key. It will set a base size of two times the
+ * initial one:
+ * @dontinclude ecore_evas_window_sizes_example.c
+ * @skip keyname, "b"
+ * @until }
+ * @until }
+ * @until }
+ *
+ * Finally, there's a key to impose a "step size" on our window, of 40
+ * pixels.  With than on (@c 's' key), you'll see the window will
+ * always be bound to @b multiples of that size, for dimensions on
+ * both axis:
+ * @skip keyname, "s"
+ * @until }
+ * @until }
+ * @until }
+ *
+ * The full example follows.
+ *
+ * @include ecore_evas_window_sizes_example.c
+ * @example ecore_evas_window_sizes_example.c
+ */
+
+/**
+ * @page ecore_evas_object_example_c Ecore Evas Object example
+ * @dontinclude ecore_evas_object_example.c
+ *
+ * This example creates an Ecore_Evas(a window) and associates a background and
+ * a custom cursor for it.
+ *
+ * We'll start looking at the association, which is quite simple. We choose to
+ * associate using ECORE_EVAS_OBJECT_ASSOCIATE_BASE to have it be resized with
+ * the window, since for a background that is what's most useful:
+ * @skipline ecore_evas_object_associate
+ * @note If we didn't associate the background we'd need to listen to resize of
+ * Ecore_Evas and manually resize the background or have artifacts on our
+ * window.
+ *
+ * We then check that the association worked:
+ * @until printf
+ *
+ * Next we are going to set a custom cursor, for our cursor we are going to use
+ * a small green rectangle. Our cursor is going to be on layer 0(any lower and
+ * it would be below the background and thus invisible) and clicks will be
+ * computed as happening on pixel 1, 1 of the image:
+ * @until cursor_set
+ *
+ * We then check every one of those parameters:
+ * @until printf
+ *
+ * Here you have the full-source of the code:
+ * @include ecore_evas_object_example.c
+ * @example ecore_evas_object_example.c
+ */
+
+/**
+ * @page ecore_evas_basics_example_c Ecore Evas basics example
+ * @dontinclude ecore_evas_basics_example.c
+ *
+ * This example will illustrates the usage of some basic Ecore_Evas functions.
+ * This example will list the available evas engines, check which one we used to
+ * create our window and set some data on our Ecore_Evas. It also allows you to
+ * hide/show all windows in this process(we only have one, but if there were
+ * more they would be hidden), to hide the windows type 'h' and hit return, to
+ * show them, type 's' and hit return.
+ *
+ * The very first thing we'll do is initialize ecore_evas:
+ * @skipline evas_init
+ * @until return 1
+ *
+ * Once inited we query which engines are available:
+ * @until ecore_evas_engines_free
+ *
+ * We then create an Ecore_Evas(window) with the first available engine, on
+ * position 0,0 with size 200,200 and no especial flags, set it's title and show
+ * it:
+ * @until evas_show
+ *
+ * We now add some important data to our Ecore_Evas:
+ * @until data_set
+ *
+ * And since our data is dynamically allocated we'll need to free it when the
+ * Ecore_Evas dies:
+ * @until delete_request
+ * @dontinclude ecore_evas_basics_example.c
+ * @skip static void
+ * @until }
+ * @skip printf("Using
+ *
+ * We now print which Evas engine is being used for our example:
+ * @until printf
+ *
+ * We are going to add a background to our window but before we can do that
+ * we'll need to get the canvas(Evas) on which to draw it:
+ * @until canvas
+ *
+ * We then do a sanity check, verifying if the Ecore_Evas of the Evas is the
+ * Ecore_Evas from which we got the Evas:
+ * @until printf
+ *
+ * Now we can actually add the background:
+ * @until ecore_evas_object_associate
+ *
+ * To hide and show the windows of this process when the user presses 'h' and
+ * 's' respectively we need to know when the user types something, so we
+ * register a callback for when we can read something from @c stdin:
+ * @until )
+ *
+ * The callback that actually does the hiding and showing is pretty simple, it
+ * does a @c scanf(which we know won't block since there is something to read on
+ * @c stdin) and if the character is an 'h' we iterate over all windows calling
+ * @c ecore_evas_hide on them, if the character is an 's' we call @c
+ * ecore_evas_show instead:
+ * @dontinclude ecore_evas_basics_example.c
+ * @skip static Eina_Bool
+ * @until }
+ * @skip ecore_main_loop_begin
+ *
+ * Once all is done we run our main loop, and when that is done(application is
+ * exiting) we free our Ecore_Evas and shutdown the ecore_evas subsystem:
+ * @until shutdown
+ *
+ * Here you have the full-source of the code:
+ * @include ecore_evas_basics_example.c
+ * @example ecore_evas_basics_example.c
+ */
+
+/**
+ * @page Ecore_Evas_Buffer_Example_01_c Ecore_Evas buffer example
+ *
+ * Between the Evas examples, there is one in which one creates a
+ * canvas bound to the Evas @b buffer engine and uses its pixel
+ * contents to create an PPM image on disk. There, one does that by
+ * creating the canvas "by hand", with @c evas_new(), @c
+ * evas_engine_info_set(), etc.
+ *
+ * On this example, we accomplish the very same task, but by using the
+ * @c Ecore_Evas helper wrapper functions on a buffer engine
+ * canvas. If you compare both codes, you'll see how much code one is
+ * saved from by using the @c Ecore_Evas wrapper functions.
+ *
+ * The code is simple as it can be. After instantianting our canvas
+ * window, with ecore_evas_buffer_new(), we grab its canvas pointer
+ * and create the desired objects scene on it, which in this case is
+ * formed by 3 rectangles over the top left corner of a white
+ * background:
+ * @dontinclude ecore_evas_buffer_example_01.c
+ * @skip main(void)
+ * @until show(r3)
+ *
+ * Since it's a buffer canvas and we're using it to only save its
+ * contents on a file, we even needn't ecore_evas_show() it. We make
+ * it render itself, forcefully, without the aid of Ecore's main loop,
+ * with ecore_evas_manual_render():
+ * @dontinclude ecore_evas_buffer_example_01.c
+ * @skip manual_render
+ * @until manual_render
+ *
+ * And we're ready to save the window's shiny rendered contents as a
+ * simple PPM image. We do so by grabbing the pixels of the @c
+ * Ecore_Evas' internal canvas, with ecore_evas_buffer_pixels_get():
+ * @dontinclude ecore_evas_buffer_example_01.c
+ * @skip _scene_save
+ * @until }
+ * @dontinclude ecore_evas_buffer_example_01.c
+ * @skip support function
+ * @until }
+ * @until }
+ * @until }
+ *
+ * Check that destination file for the result. The full example
+ * follows.
+ *
+ * @include ecore_evas_buffer_example_01.c
+ * @example ecore_evas_buffer_example_01.c
+ */
+
+/**
+ * @page Ecore_Evas_Buffer_Example_02_c Ecore_Evas (image) buffer example
+ *
+ * In this example, we'll demonstrate the use of
+ * ecore_evas_object_image_new().  The idea is to have the same scene
+ * created for @ref Ecore_Evas_Buffer_Example_01_c as the contents of
+ * an image object.
+ *
+ * The canvas receiving this image object will have a white
+ * background, a red border image to delimit this image's boundaries
+ * and the image itself.  After we create the special image, we set
+ * its "fill" property, place and resize it as we want. We have also
+ * to resize its underlying @c Ecore_Evas too, to the same dimensions:
+ * @dontinclude ecore_evas_buffer_example_02.c
+ * @skip object_image_new
+ * @until resize(sub_ee
+ *
+ * Now, we re-create the scene we cited, using the sub-canvas of our
+ * image to parent the objects in question. Because image objects are
+ * created with the alpha channel enabled, by default, we'll be seeing
+ * our white rectangle beneath the scene:
+ * @dontinclude ecore_evas_buffer_example_02.c
+ * @skip rectangle_add(sub_canvas
+ * @until loop_begin
+ *
+ * And that's all. The contents of our image could be updated as one
+ * wished, and they would always be mirrored in the image's area.
+ *
+ * Check that destination file for the result. The full example
+ * follows.
+ *
+ * @include ecore_evas_buffer_example_02.c
+ * @example ecore_evas_buffer_example_02.c
+ */
+
+/**
+ * @page Ecore_exe_simple_example_c Ecore_exe
+ * Creating a processes and IPC (Inter process communication)
+ *
+ * In this example we will show how to create a new process and communicate
+ * with it in a portable way using the Ecore_exe module.
+ *
+ * In this example we will have two process and both will communicate with each
+ * other using messages. A father process will start a child process and it will
+ * keep sending messages to the child until it receives a message to quit.
+ * To see the full source use the links:
+ * @li @ref ecore_exe_example.c "Father"
+ * @li @ref ecore_exe_example_child.c "Child"
+ *
+ * Let's start the tutorial. The implementation of the child it's pretty simple.
+ * We just read strings from stdin and write a message in the stdout. But you
+ * should be asking yourself right know. "If I'm receiving data from an other
+ * process why I'm reading and writing in stdin/stdout?". That's because, when
+ * you spawn a process using the Ecore_Exe module it will create a pipe between
+ * the father and the child process and the stdin/stdout of the child process
+ * will be redirected to the pipe. So when the child wants to receive or send
+ * data to the father, just use the stdin/stdout.
+ * However the steps to send data from the father to the child is quite
+ * different, but we will get there.
+ *
+ * The child will register a fd handler to monitor the stdin.
+ * So we start registering the ecore FD handler:
+ * @dontinclude ecore_exe_example_child.c
+ * @skip ecore_main_fd_handler_add
+ * @until ;
+ *
+ * If you don't remenber the parameters of @ref ecore_main_fd_handler_add,
+ * please check its documentation.
+ *
+ * Now that we have our handler registered we will start the ecore's main loop:
+ * @skipline ecore_main_loop_begin
+ *
+ * Now let's take a look in the callback function. Its a simple function
+ * that will read from stdin 3 times and at the third time will say
+ * to the father: "quit".
+ * @dontinclude ecore_exe_example_child.c
+ * @skip static Eina_Bool
+ * @until }
+ * @until }
+ * @until }
+ * @until }
+ *
+ * You may notice that we are sending the messages to stdout, and our father
+ * will receive it. Also our string must have a "\n" because the string will
+ * be buffered in the pipe until it finds EOF or a "newline" in our case we
+ * won't have a EOF unless we close the pipe, so we use the "\n" char.
+ *
+ * One more thing, we use fflush(stdout) because probably our message won't
+ * fill our entire buffer and the father would never receive the message. So we
+ * use this function to flush the buffer and the father can receive as fast as
+ * possible.
+ *
+ * Now that we have our child ready, let's start our work in the father's source
+ * code.
+ *
+ * We start creating the child process like this:
+ * @dontinclude ecore_exe_example.c
+ * @skip childHandle = ecore_exe_pipe_run
+ * @until ;
+ *
+ * With the command above we are creating our child process, the first
+ * parameter is the command to be executed, the second are the pipe flags and
+ * in our case we will write and read in the pipe so we must say what we are
+ * doing in the pipe. You may notice the flag ECORE_EXE_PIPE_READ_LINE_BUFFERED,
+ * this means that reads are buffered until I find a newline. And the third
+ * parameter is data that we would like to send to the process in its creating.
+ * This case we are sending nothing, so just use NULL.
+ *
+ * Then we check if the process was created:
+ * @skip if
+ * @until }
+ *
+ * After this we get the PID of the child process and just print it in the screen.
+ * The PID stands for Process identification. This is just an internal
+ * identifier of your process:
+ *
+ * @skip childPid
+ * @until fprintf
+ * @until fprintf
+ *
+ * The way that Ecore_exe works is: when we want to read data sent from
+ * our child we must use an ecore event.
+ * So let's start register our event listener:
+ * @skipline ecore_event_handler_add
+ *
+ * Now to send messages to our child we will use a timer, so every 1 second we
+ * will send a message to the child.
+ * @skipline ecore_timer_add
+ *
+ * After all this we start the main loop. Now let's pass to the callback
+ * functions.
+ *
+ * Now we will see how we actually send the data and receive it.
+ * Let's start with _sendMessage:
+ * @dontinclude ecore_exe_example.c
+ * @skip _sendMessage(void *data)
+ * @until }
+ *
+ * We use ecore_exe_send to send data to the child process, it's pretty simple.
+ * To know what the parameters stands for, check the docs.
+ *
+ * @note The function @b ecore_exe_send will never block your program, also
+ * there is no partial send of the data. This means either the function will
+ * send all the data or it will fail.
+ *
+ * Now let's take a look in our event callback and see how we retrieve the
+ * messages.
+ * @dontinclude ecore_exe_example.c
+ * @skip static Eina_Bool
+ * @until }
+ * @until }
+ *
+ * It's just like an normal event, we get a reference to Ecore_Exe_Event_Data,
+ * extract the data and then show it in the screen.
+ *
+ * And that's it, after all it's not complicated to create a process and
+ * communicate with it.
+ *
+ */
+
+/**
+ * @page ecore_imf_example_c ecore_imf - How to handle preedit and commit string from Input Method Framework
+ *
+ * This example demonstrates how to connect input method framework and handle preedit and commit string from input method framework.
+ *
+ * To input Chinese, Japanese, Korean and other complex languages, the editor should be connected with input method framework.
+ * 
+ * How to initialize and shutdown ecore imf module
+ * @li ecore_imf_init() should be called to initialize and load immodule.
+ * @li ecore_imf_shutdown() is used for shutdowning and unloading immodule.
+ *
+ * How to create input context and register pre-edit and commit event handler
+ *
+ * Each entry should have each input context to connect with input service framework. 
+ * Key event is processed by input method engine. 
+ * The result is notified to application through ECORE_IMF_CALLBACK_PREEDIT_CHANGED and ECORE_IMF_CALLBACK_COMMIT event.
+ *
+ * The full example follows. 
+ *
+ * @include ecore_imf_example.c
+ */
index 0d3303d..a915831 100644 (file)
@@ -1,6 +1,19 @@
+ <div id="push"></div>
+ </div> <!-- #content -->
+  </div> <!-- .layout -->
+ </div> <!-- #container -->
+  <div id="footer">
+    <table><tr>
+      <td>Samsung Electronics is supporting the EFL Documentation Project</td>
+      <td class="copyright">Copyright &copy;$year Enlightenment</td>
+      <td class="generated">Docs generated $datetime</td>
+    </tr></table>
   </div>
-  <hr />
-  <p class="tiny">Copyright &copy; Enlightenment.org</p>
-  <p class="tiny">$projectname Documentation Generated: $datetime</p>
- </body>
+
+
+</body>
 </html>
index a68f72a..2c61795 100644 (file)
@@ -1,46 +1,69 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
 <html>
- <head>
-  <title>$title</title>
-  <link href="e.css" rel="stylesheet" type="text/css" />
- </head>
+<head>
+    <title>$title</title>
+    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
+    <meta name="author" content="Andres Blanc" >
+    
+    <link rel="icon" href="img/favicon.png" type="image/x-icon">
+    <link rel="shortcut icon" href="img/favicon.png" type="image/x-icon">
+    <link rel="icon" href="img/favicon.png" type="image/ico">
+    <link rel="shortcut icon" href="img/favicon.png" type="image/ico">
+
+    <link rel="stylesheet" type="text/css" href="e.css">
+    <link rel="stylesheet" type="text/css" href="edoxy.css">
+</head>
 
 <body>
- <table width="100%" border="0" cellpadding="0" cellspacing="0">
-  <tr>
-   <td class="t" width="50%" valign="top" align="left">
-     <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=index">Home</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=news">News</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=about">About</a></td></tr>
-     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=download">Download</a></td></tr>
-    </table>
-   </td>
-   <td class="tl" width="612" height="250" valign="bottom" align="center">
-    <img src="_.gif" width="612" height="1" />
-    <table border="0" cellpadding="0" cellspacing="4px">
-     <tr>
-      <td class='nav'><a class='nav' href="index.html">Main&nbsp;Page</a></td>
-      <td class='nav'><a class='nav' href="modules.html">Modules</a></td>
-      <td class="nav"><a class="nav" href="files.html">Files</a></td>
-      <td class='nav'><a class='nav' href="annotated.html">Data Structures</a></td>
-      <td class="nav"><a class="nav" href="globals.html">Globals</a></td>
-      <td class="nav"><a class="nav" href="pages.html">Related Pages</a></td>
-     </tr>
-    </table>
-    <hr />
-   </td>
-   <td class="t" width="50%" valign="top" align="right">
-    <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
-     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=support">Support</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contribute">Contribute</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contact">Contact</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://trac.enlightenment.org/e">Tracker</a></td></tr>
-    </table>
-   </td>
-  </tr>
- </table>
-
- <div class="main">
+
+<div id="container">
+
+<div id="header">
+<div class="layout">
+    
+    <h1><span>Enlightenment</span></h1>
+    <h2><span>Beauty at your fingertips</span></h2>
+
+    <table cellspacing="0" cellpadding="0" width="100%"><tr>
+      <td id="header_logo">
+        <a href="http://www.enlightenment.org"></a>
+      </td>
+      <td id="header_menu">
+        <table cellspacing="0" cellpadding="0" align="right"><tr>
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=home">Home</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=news">News</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=about">About</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=download">Download</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=support">Support</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=contribute">Contribute</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=contact">Contact</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://trac.enlightenment.org/e">Tracker</a></td>
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=docs">Docs</a></td> 
+        </tr></table>          
+      </td>
+      <td id="header_last"></td>
+    </tr></table>
+
+    <div class="doxytitle">
+        $projectname Documentation <small>at $date</small>
+    </div>
+
+    <div class="menu-container">
+        <div class="submenu">
+            <ul class="current">
+                <li><a href="files.html">Files</a></li>
+                <li><a href="annotated.html">Data Structures</a></li>
+                <li><a href="globals.html">Globals</a></li>
+                <li><a href="modules.html">Modules</a></li>
+                <li><a href="pages.html">Related Pages</a></li>
+               <li class="current"><a  href="index.html">Main Page</a></li>
+            </ul>
+        </div>
+    </div>
+
+
+    <div class="clear"></div>
+</div>
+</div>
+
+<div id="content">
+<div class="layout">
diff --git a/doc/img/e.png b/doc/img/e.png
new file mode 100644 (file)
index 0000000..d42aeb4
Binary files /dev/null and b/doc/img/e.png differ
diff --git a/doc/img/ecore-pos-map.eps b/doc/img/ecore-pos-map.eps
new file mode 100644 (file)
index 0000000..bdc98db
--- /dev/null
@@ -0,0 +1,5750 @@
+%!PS-Adobe-3.1 EPSF-3.0
+%ADO_DSC_Encoding: MacOS Roman
+%%Title: diagramas_01-18.eps
+%%Creator: Adobe Illustrator(R) 14.0
+%%For: Marina Proni
+%%CreationDate: 7/7/11
+%%BoundingBox: 0 0 622 652
+%%HiResBoundingBox: 0 0 621.7319 651.9883
+%%CropBox: 0 0 621.7319 651.9883
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%ADOBeginClientInjection: DocumentHeader "AI11EPS"
+%%AI8_CreatorVersion: 14.0.0\r%AI9_PrintingDataBegin\r%ADO_BuildNumber: Adobe Illustrator(R) 14.0.0 x367 R agm 4.4890 ct 5.1541\r%ADO_ContainsXMP: MainFirst\r
+%ADOEndClientInjection: DocumentHeader "AI11EPS"
+%%Pages: 1
+%%DocumentNeededResources: 
+%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0
+%%+ procset Adobe_CoolType_Utility_T42 1.0 0
+%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
+%%+ procset Adobe_CoolType_Core 2.31 0
+%%+ procset Adobe_AGM_Core 2.0 0
+%%+ procset Adobe_AGM_Utils 1.0 0
+%%DocumentFonts: 
+%%DocumentNeededFonts: 
+%%DocumentNeededFeatures: 
+%%DocumentSuppliedFeatures: 
+%%DocumentProcessColors:  Cyan Magenta Yellow Black
+%%DocumentCustomColors: 
+%%CMYKCustomColor: 
+%%RGBCustomColor: 
+%%EndComments
+                                                                                                                                                                                                                              
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+%%BeginDefaults
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset Adobe_AGM_Utils 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{currentpacking        true setpacking}if
+userdict/Adobe_AGM_Utils 75 dict dup begin put
+/bdf
+{bind def}bind def
+/nd{null def}bdf
+/xdf
+{exch def}bdf
+/ldf 
+{load def}bdf
+/ddf
+{put}bdf       
+/xddf
+{3 -1 roll put}bdf     
+/xpt
+{exch put}bdf
+/ndf
+{
+       exch dup where{
+               pop pop pop
+       }{
+               xdf
+       }ifelse
+}def
+/cdndf
+{
+       exch dup currentdict exch known{
+               pop pop
+       }{
+               exch def
+       }ifelse
+}def
+/gx
+{get exec}bdf
+/ps_level
+       /languagelevel where{
+               pop systemdict/languagelevel gx
+       }{
+               1
+       }ifelse
+def
+/level2 
+       ps_level 2 ge
+def
+/level3 
+       ps_level 3 ge
+def
+/ps_version
+       {version cvr}stopped{-1}if
+def
+/set_gvm
+{currentglobal exch setglobal}bdf
+/reset_gvm
+{setglobal}bdf
+/makereadonlyarray
+{
+       /packedarray where{pop packedarray
+       }{
+               array astore readonly}ifelse
+}bdf
+/map_reserved_ink_name
+{
+       dup type/stringtype eq{
+               dup/Red eq{
+                       pop(_Red_)
+               }{
+                       dup/Green eq{
+                               pop(_Green_)
+                       }{
+                               dup/Blue eq{
+                                       pop(_Blue_)
+                               }{
+                                       dup()cvn eq{
+                                               pop(Process)
+                                       }if
+                               }ifelse
+                       }ifelse
+               }ifelse
+       }if
+}bdf
+/AGMUTIL_GSTATE 22 dict def
+/get_gstate
+{
+       AGMUTIL_GSTATE begin
+       /AGMUTIL_GSTATE_clr_spc currentcolorspace def
+       /AGMUTIL_GSTATE_clr_indx 0 def
+       /AGMUTIL_GSTATE_clr_comps 12 array def
+       mark currentcolor counttomark
+               {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
+               /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop
+       /AGMUTIL_GSTATE_fnt rootfont def
+       /AGMUTIL_GSTATE_lw currentlinewidth def
+       /AGMUTIL_GSTATE_lc currentlinecap def
+       /AGMUTIL_GSTATE_lj currentlinejoin def
+       /AGMUTIL_GSTATE_ml currentmiterlimit def
+       currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf
+       /AGMUTIL_GSTATE_sa currentstrokeadjust def
+       /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
+       /AGMUTIL_GSTATE_op currentoverprint def
+       /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
+       /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
+       currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf
+               cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf
+       /AGMUTIL_GSTATE_ht currenthalftone def
+       /AGMUTIL_GSTATE_flt currentflat def
+       end
+}def
+/set_gstate
+{
+       AGMUTIL_GSTATE begin
+       AGMUTIL_GSTATE_clr_spc setcolorspace
+       AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
+       /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor
+       AGMUTIL_GSTATE_fnt setfont
+       AGMUTIL_GSTATE_lw setlinewidth
+       AGMUTIL_GSTATE_lc setlinecap
+       AGMUTIL_GSTATE_lj setlinejoin
+       AGMUTIL_GSTATE_ml setmiterlimit
+       AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
+       AGMUTIL_GSTATE_sa setstrokeadjust
+       AGMUTIL_GSTATE_clr_rnd setcolorrendering
+       AGMUTIL_GSTATE_op setoverprint
+       AGMUTIL_GSTATE_bg cvx setblackgeneration
+       AGMUTIL_GSTATE_ucr cvx setundercolorremoval
+       AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
+               AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
+       AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or
+               {
+               currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne
+                       {
+                        mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark
+                       }if
+               }{
+               AGMUTIL_GSTATE_ht sethalftone
+               }ifelse
+       AGMUTIL_GSTATE_flt setflat
+       end
+}def
+/get_gstate_and_matrix
+{
+       AGMUTIL_GSTATE begin
+       /AGMUTIL_GSTATE_ctm matrix currentmatrix def
+       end
+       get_gstate
+}def
+/set_gstate_and_matrix
+{
+       set_gstate
+       AGMUTIL_GSTATE begin
+       AGMUTIL_GSTATE_ctm setmatrix
+       end
+}def
+/AGMUTIL_str256 256 string def
+/AGMUTIL_src256 256 string def
+/AGMUTIL_dst64 64 string def
+/AGMUTIL_srcLen nd
+/AGMUTIL_ndx nd
+/AGMUTIL_cpd nd
+/capture_cpd{
+       //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf
+}def
+/thold_halftone
+{
+       level3
+               {sethalftone currenthalftone}
+               {
+                       dup/HalftoneType get 3 eq
+                       {
+                               sethalftone currenthalftone
+                       }{
+                               begin
+                               Width Height mul{
+                                       Thresholds read{pop}if
+                               }repeat
+                               end
+                               currenthalftone
+                       }ifelse
+               }ifelse
+}def 
+/rdcmntline
+{
+       currentfile AGMUTIL_str256 readline pop
+       (%)anchorsearch{pop}if
+}bdf
+/filter_cmyk
+{      
+       dup type/filetype ne{
+               exch()/SubFileDecode filter
+       }{
+               exch pop
+       }
+       ifelse
+       [
+       exch
+       {
+               AGMUTIL_src256 readstring pop
+               dup length/AGMUTIL_srcLen exch def
+               /AGMUTIL_ndx 0 def
+               AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
+                       1 index exch get
+                       AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
+                       /AGMUTIL_ndx AGMUTIL_ndx 1 add def
+               }for
+               pop
+               AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
+       }
+       bind
+       /exec cvx
+       ]cvx
+}bdf
+/filter_indexed_devn
+{
+       cvi Names length mul names_index add Lookup exch get
+}bdf
+/filter_devn
+{      
+       4 dict begin
+       /srcStr xdf
+       /dstStr xdf
+       dup type/filetype ne{
+               0()/SubFileDecode filter
+       }if
+       [
+       exch
+               [
+                       /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx
+                       currentdict/srcStr get/readstring cvx/pop cvx
+                       /dup cvx/length cvx 0/gt cvx[
+                               Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx
+                               names_index Names length currentdict/srcStr get length 1 sub{
+                                       1/index cvx/exch cvx/get cvx
+                                       currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx
+                                       Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx
+                               }for
+                               currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx
+                       ]cvx/if cvx
+                       /end cvx
+               ]cvx
+               bind
+               /exec cvx
+       ]cvx
+       end
+}bdf
+/AGMUTIL_imagefile nd
+/read_image_file
+{
+       AGMUTIL_imagefile 0 setfileposition
+       10 dict begin
+       /imageDict xdf
+       /imbufLen Width BitsPerComponent mul 7 add 8 idiv def
+       /imbufIdx 0 def
+       /origDataSource imageDict/DataSource get def
+       /origMultipleDataSources imageDict/MultipleDataSources get def
+       /origDecode imageDict/Decode get def
+       /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def
+       imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+       {
+               /imbufCnt imageDict/DataSource get length def
+               /imbufs imbufCnt array def
+               0 1 imbufCnt 1 sub{
+                       /imbufIdx xdf
+                       imbufs imbufIdx imbufLen string put
+                       imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put
+               }for
+               DeviceN_PS2{
+                       imageDict begin
+                       /DataSource[DataSource/devn_sep_datasource cvx]cvx def
+                       /MultipleDataSources false def
+                       /Decode[0 1]def
+                       end
+               }if
+       }{
+               /imbuf imbufLen string def
+               Indexed_DeviceN level3 not and DeviceN_NoneName or{
+                       /srcDataStrs[imageDict begin
+                               currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
+                               {
+                                       Width Decode length 2 div mul cvi string
+                               }repeat
+                               end]def         
+                       imageDict begin
+                       /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def
+                       /Decode[0 1]def
+                       end
+               }{
+                       imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put
+                       imageDict/Decode[0 1]put
+               }ifelse
+       }ifelse
+       imageDict exch
+       load exec
+       imageDict/DataSource origDataSource put
+       imageDict/MultipleDataSources origMultipleDataSources put
+       imageDict/Decode origDecode put 
+       end
+}bdf
+/write_image_file
+{
+       begin
+       {(AGMUTIL_imagefile)(w+)file}stopped{
+               false
+       }{
+               Adobe_AGM_Utils/AGMUTIL_imagefile xddf 
+               2 dict begin
+               /imbufLen Width BitsPerComponent mul 7 add 8 idiv def
+               MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{
+                       /imbuf imbufLen string def
+               }if
+               1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{
+                       pop
+                       MultipleDataSources{
+                               0 1 DataSource length 1 sub{
+                                       DataSource type dup
+                                       /arraytype eq{
+                                               pop DataSource exch gx
+                                       }{
+                                               /filetype eq{
+                                                       DataSource exch get imbuf readstring pop
+                                               }{
+                                                       DataSource exch get
+                                               }ifelse
+                                       }ifelse
+                                       AGMUTIL_imagefile exch writestring
+                               }for
+                       }{
+                               DataSource type dup
+                               /arraytype eq{
+                                       pop DataSource exec
+                               }{
+                                       /filetype eq{
+                                               DataSource imbuf readstring pop
+                                       }{
+                                               DataSource
+                                       }ifelse
+                               }ifelse
+                               AGMUTIL_imagefile exch writestring
+                       }ifelse
+               }for
+               end
+               true
+       }ifelse
+       end
+}bdf
+/close_image_file
+{
+       AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile
+}def
+statusdict/product known userdict/AGMP_current_show known not and{
+       /pstr statusdict/product get def
+       pstr(HP LaserJet 2200)eq        
+       pstr(HP LaserJet 4000 Series)eq or
+       pstr(HP LaserJet 4050 Series )eq or
+       pstr(HP LaserJet 8000 Series)eq or
+       pstr(HP LaserJet 8100 Series)eq or
+       pstr(HP LaserJet 8150 Series)eq or
+       pstr(HP LaserJet 5000 Series)eq or
+       pstr(HP LaserJet 5100 Series)eq or
+       pstr(HP Color LaserJet 4500)eq or
+       pstr(HP Color LaserJet 4600)eq or
+       pstr(HP LaserJet 5Si)eq or
+       pstr(HP LaserJet 1200 Series)eq or
+       pstr(HP LaserJet 1300 Series)eq or
+       pstr(HP LaserJet 4100 Series)eq or 
+       {
+               userdict/AGMP_current_show/show load put
+               userdict/show{
+                currentcolorspace 0 get
+                /Pattern eq
+                {false charpath f}
+                {AGMP_current_show}ifelse
+               }put
+       }if
+       currentdict/pstr undef
+}if
+/consumeimagedata
+{
+       begin
+       AGMIMG_init_common
+       currentdict/MultipleDataSources known not
+               {/MultipleDataSources false def}if
+       MultipleDataSources
+               {
+               DataSource 0 get type
+               dup/filetype eq
+                       {
+                       1 dict begin
+                       /flushbuffer Width cvi string def
+                       1 1 Height cvi
+                               {
+                               pop
+                               0 1 DataSource length 1 sub
+                                       {
+                                       DataSource exch get
+                                       flushbuffer readstring pop pop
+                                       }for
+                               }for
+                       end
+                       }if
+               dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and
+                       {
+                       Width Height mul cvi
+                               {
+                               0 1 DataSource length 1 sub
+                                       {dup DataSource exch gx length exch 0 ne{pop}if}for
+                               dup 0 eq
+                                       {pop exit}if
+                               sub dup 0 le
+                                       {exit}if
+                               }loop
+                       pop
+                       }if             
+               }
+               {
+               /DataSource load type 
+               dup/filetype eq
+                       {
+                       1 dict begin
+                       /flushbuffer Width Decode length 2 idiv mul cvi string def
+                       1 1 Height{pop DataSource flushbuffer readstring pop pop}for
+                       end
+                       }if
+               dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and
+                       {
+                               Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul
+                                       {
+                                       DataSource length dup 0 eq
+                                               {pop exit}if
+                                       sub dup 0 le
+                                               {exit}if
+                                       }loop
+                               pop
+                       }if
+               }ifelse
+       end
+}bdf
+/addprocs
+{
+        2{/exec load}repeat
+        3 1 roll
+        [5 1 roll]bind cvx
+}def
+/modify_halftone_xfer
+{
+       currenthalftone dup length dict copy begin
+        currentdict 2 index known{
+               1 index load dup length dict copy begin
+               currentdict/TransferFunction known{
+                       /TransferFunction load
+               }{
+                       currenttransfer
+               }ifelse
+                addprocs/TransferFunction xdf 
+                currentdict end def
+               currentdict end sethalftone
+       }{
+               currentdict/TransferFunction known{
+                       /TransferFunction load 
+               }{
+                       currenttransfer
+               }ifelse
+               addprocs/TransferFunction xdf
+               currentdict end sethalftone             
+               pop
+       }ifelse
+}def
+/clonearray
+{
+       dup xcheck exch
+       dup length array exch
+       Adobe_AGM_Core/AGMCORE_tmp -1 ddf 
+       {
+       Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf 
+       dup type/dicttype eq
+               {
+                       Adobe_AGM_Core/AGMCORE_tmp get
+                       exch
+                       clonedict
+                       Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
+               }if
+       dup type/arraytype eq
+               {
+                       Adobe_AGM_Core/AGMCORE_tmp get exch
+                       clonearray
+                       Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
+               }if
+       exch dup
+       Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put
+       }forall
+       exch{cvx}if
+}bdf
+/clonedict
+{
+       dup length dict
+       begin
+       {
+               dup type/dicttype eq
+                       {clonedict}if
+               dup type/arraytype eq
+                       {clonearray}if
+               def
+       }forall
+       currentdict
+       end
+}bdf
+/DeviceN_PS2
+{
+       /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and
+}bdf
+/Indexed_DeviceN
+{
+       /indexed_colorspace_dict AGMCORE_gget dup null ne{
+               dup/CSDBase known{
+                       /CSDBase get/CSD get_res/Names known 
+               }{
+                       pop false
+               }ifelse
+       }{
+               pop false
+       }ifelse
+}bdf
+/DeviceN_NoneName
+{      
+       /Names where{
+               pop
+               false Names
+               {
+                       (None)eq or
+               }forall
+       }{
+               false
+       }ifelse
+}bdf
+/DeviceN_PS2_inRip_seps
+{
+       /AGMCORE_in_rip_sep where
+       {
+               pop dup type dup/arraytype eq exch/packedarraytype eq or
+               {
+                       dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and
+                       {
+                               /currentcolorspace exch AGMCORE_gput
+                               false
+                       }{
+                               true
+                       }ifelse
+               }{
+                       true
+               }ifelse
+       }{
+               true
+       }ifelse
+}bdf
+/base_colorspace_type
+{
+       dup type/arraytype eq{0 get}if
+}bdf
+/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
+{
+       /pdfmark_5{cleartomark}bind def
+}{
+       /pdfmark_5{pdfmark}bind def
+}ifelse
+/ReadBypdfmark_5
+{
+       currentfile exch 0 exch/SubFileDecode filter
+       /currentdistillerparams where 
+       {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
+       {flushfile cleartomark}
+       {/PUT pdfmark}ifelse    
+}bdf
+/ReadBypdfmark_5_string
+{
+       2 dict begin
+       /makerString exch def string/tmpString exch def
+       {
+               currentfile tmpString readline not{pop exit}if
+               makerString anchorsearch
+               {
+                       pop pop cleartomark exit
+               }{
+                       3 copy/PUT pdfmark_5 pop 2 copy(\n)/PUT pdfmark_5
+               }ifelse
+       }loop
+       end
+}bdf
+/xpdfm
+{
+       {
+               dup 0 get/Label eq
+               {
+                       aload length[exch 1 add 1 roll/PAGELABEL
+               }{
+                       aload pop
+                       [{ThisPage}<<5 -2 roll>>/PUT
+               }ifelse
+               pdfmark_5
+       }forall
+}bdf
+/lmt{
+       dup 2 index le{exch}if pop dup 2 index ge{exch}if pop
+}bdf
+/int{
+       dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul exch pop add exch pop
+}bdf
+/ds{
+       Adobe_AGM_Utils begin
+}bdf
+/dt{
+       currentdict Adobe_AGM_Utils eq{
+               end
+       }if
+}bdf
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+%%BeginResource: procset Adobe_AGM_Core 2.0 0
+%%Version: 2.0 0
+%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{
+       currentpacking
+       true setpacking
+}if
+userdict/Adobe_AGM_Core 209 dict dup begin put
+/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def
+/AGMCORE_str256 256 string def
+/AGMCORE_save nd
+/AGMCORE_graphicsave nd
+/AGMCORE_c 0 def
+/AGMCORE_m 0 def
+/AGMCORE_y 0 def
+/AGMCORE_k 0 def
+/AGMCORE_cmykbuf 4 array def
+/AGMCORE_screen[currentscreen]cvx def
+/AGMCORE_tmp 0 def
+/AGMCORE_&setgray nd
+/AGMCORE_&setcolor nd
+/AGMCORE_&setcolorspace nd
+/AGMCORE_&setcmykcolor nd
+/AGMCORE_cyan_plate nd
+/AGMCORE_magenta_plate nd
+/AGMCORE_yellow_plate nd
+/AGMCORE_black_plate nd
+/AGMCORE_plate_ndx nd
+/AGMCORE_get_ink_data nd
+/AGMCORE_is_cmyk_sep nd
+/AGMCORE_host_sep nd
+/AGMCORE_avoid_L2_sep_space nd
+/AGMCORE_distilling nd
+/AGMCORE_composite_job nd
+/AGMCORE_producing_seps nd
+/AGMCORE_ps_level -1 def
+/AGMCORE_ps_version -1 def
+/AGMCORE_environ_ok nd
+/AGMCORE_CSD_cache 0 dict def
+/AGMCORE_currentoverprint false def
+/AGMCORE_deltaX nd
+/AGMCORE_deltaY nd
+/AGMCORE_name nd
+/AGMCORE_sep_special nd
+/AGMCORE_err_strings 4 dict def
+/AGMCORE_cur_err nd
+/AGMCORE_current_spot_alias false def
+/AGMCORE_inverting false def
+/AGMCORE_feature_dictCount nd
+/AGMCORE_feature_opCount nd
+/AGMCORE_feature_ctm nd
+/AGMCORE_ConvertToProcess false def
+/AGMCORE_Default_CTM matrix def
+/AGMCORE_Default_PageSize nd
+/AGMCORE_Default_flatness nd
+/AGMCORE_currentbg nd
+/AGMCORE_currentucr nd
+/AGMCORE_pattern_paint_type 0 def
+/knockout_unitsq nd
+currentglobal true setglobal
+[/CSA/Gradient/Procedure]
+{
+       /Generic/Category findresource dup length dict copy/Category defineresource pop
+}forall
+setglobal
+/AGMCORE_key_known
+{
+       where{
+               /Adobe_AGM_Core_Id known
+       }{
+               false
+       }ifelse
+}ndf
+/flushinput
+{
+       save
+       2 dict begin
+       /CompareBuffer 3 -1 roll def
+       /readbuffer 256 string def
+       mark
+       {
+       currentfile readbuffer{readline}stopped
+               {cleartomark mark}
+               {
+               not
+                       {pop exit}
+               if
+               CompareBuffer eq
+                       {exit}
+               if
+               }ifelse
+       }loop
+       cleartomark
+       end
+       restore
+}bdf
+/getspotfunction
+{
+       AGMCORE_screen exch pop exch pop
+       dup type/dicttype eq{
+               dup/HalftoneType get 1 eq{
+                       /SpotFunction get
+               }{
+                       dup/HalftoneType get 2 eq{
+                               /GraySpotFunction get
+                       }{
+                               pop
+                               {
+                                       abs exch abs 2 copy add 1 gt{
+                                               1 sub dup mul exch 1 sub dup mul add 1 sub
+                                       }{
+                                               dup mul exch dup mul add 1 exch sub
+                                       }ifelse
+                               }bind
+                       }ifelse
+               }ifelse
+       }if
+}def
+/np
+{newpath}bdf
+/clp_npth
+{clip np}def
+/eoclp_npth
+{eoclip np}def
+/npth_clp
+{np clip}def
+/graphic_setup
+{
+       /AGMCORE_graphicsave save store
+       concat
+       0 setgray
+       0 setlinecap
+       0 setlinejoin
+       1 setlinewidth
+       []0 setdash
+       10 setmiterlimit
+       np
+       false setoverprint
+       false setstrokeadjust
+       //Adobe_AGM_Core/spot_alias gx
+       /Adobe_AGM_Image where{
+               pop
+               Adobe_AGM_Image/spot_alias 2 copy known{
+                       gx
+               }{
+                       pop pop
+               }ifelse
+       }if
+       /sep_colorspace_dict null AGMCORE_gput
+       100 dict begin
+       /dictstackcount countdictstack def
+       /showpage{}def
+       mark
+}def
+/graphic_cleanup
+{
+       cleartomark
+       dictstackcount 1 countdictstack 1 sub{end}for
+       end
+       AGMCORE_graphicsave restore
+}def
+/compose_error_msg
+{
+       grestoreall initgraphics        
+       /Helvetica findfont 10 scalefont setfont
+       /AGMCORE_deltaY 100 def
+       /AGMCORE_deltaX 310 def
+       clippath pathbbox np pop pop 36 add exch 36 add exch moveto
+       0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
+       0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
+       0 AGMCORE_&setgray
+       gsave 1 AGMCORE_&setgray fill grestore 
+       1 setlinewidth gsave stroke grestore
+       currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
+       /AGMCORE_deltaY 12 def
+       /AGMCORE_tmp 0 def
+       AGMCORE_err_strings exch get
+               {
+               dup 32 eq
+                       {
+                       pop
+                       AGMCORE_str256 0 AGMCORE_tmp getinterval
+                       stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
+                               {
+                               currentpoint AGMCORE_deltaY sub exch pop
+                               clippath pathbbox pop pop pop 44 add exch moveto
+                               }if
+                       AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show
+                       0 1 AGMCORE_str256 length 1 sub
+                               {
+                               AGMCORE_str256 exch 0 put
+                               }for
+                       /AGMCORE_tmp 0 def
+                       }{
+                               AGMCORE_str256 exch AGMCORE_tmp xpt
+                               /AGMCORE_tmp AGMCORE_tmp 1 add def
+                       }ifelse
+               }forall
+}bdf
+/AGMCORE_CMYKDeviceNColorspaces[
+       [/Separation/None/DeviceCMYK{0 0 0}]
+       [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind]
+       [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind]
+       [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind]
+       [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind]
+       [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind]
+       [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind]
+       [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind]
+       [/Separation(Cyan)/DeviceCMYK{0 0 0}]
+       [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind]
+       [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind]
+       [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind]
+       [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}]
+       [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind]
+       [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}]
+       [/DeviceCMYK]
+]def
+/ds{
+       Adobe_AGM_Core begin
+       /currentdistillerparams where
+               {
+               pop currentdistillerparams/CoreDistVersion get 5000 lt
+                       {<</DetectBlends false>>setdistillerparams}if
+               }if     
+       /AGMCORE_ps_version xdf
+       /AGMCORE_ps_level xdf
+       errordict/AGM_handleerror known not{
+               errordict/AGM_handleerror errordict/handleerror get put
+               errordict/handleerror{
+                       Adobe_AGM_Core begin
+                       $error/newerror get AGMCORE_cur_err null ne and{
+                               $error/newerror false put
+                               AGMCORE_cur_err compose_error_msg
+                       }if
+                       $error/newerror true put
+                       end
+                       errordict/AGM_handleerror get exec
+                       }bind put
+               }if
+       /AGMCORE_environ_ok 
+               ps_level AGMCORE_ps_level ge
+               ps_version AGMCORE_ps_version ge and 
+               AGMCORE_ps_level -1 eq or
+       def
+       AGMCORE_environ_ok not
+               {/AGMCORE_cur_err/AGMCORE_bad_environ def}if
+       /AGMCORE_&setgray systemdict/setgray get def
+       level2{
+               /AGMCORE_&setcolor systemdict/setcolor get def
+               /AGMCORE_&setcolorspace systemdict/setcolorspace get def
+       }if
+       /AGMCORE_currentbg currentblackgeneration def
+       /AGMCORE_currentucr currentundercolorremoval def
+       /AGMCORE_Default_flatness currentflat def
+       /AGMCORE_distilling
+               /product where{
+                       pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and
+               }{
+                       false
+               }ifelse
+       def
+       /AGMCORE_GSTATE AGMCORE_key_known not{
+               /AGMCORE_GSTATE 21 dict def
+               /AGMCORE_tmpmatrix matrix def
+               /AGMCORE_gstack 32 array def
+               /AGMCORE_gstackptr 0 def
+               /AGMCORE_gstacksaveptr 0 def
+               /AGMCORE_gstackframekeys 14 def
+               /AGMCORE_&gsave/gsave ldf
+               /AGMCORE_&grestore/grestore ldf
+               /AGMCORE_&grestoreall/grestoreall ldf
+               /AGMCORE_&save/save ldf
+               /AGMCORE_&setoverprint/setoverprint ldf
+               /AGMCORE_gdictcopy{
+                       begin
+                       {def}forall
+                       end
+               }def
+               /AGMCORE_gput{
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       3 1 roll
+                       put
+               }def
+               /AGMCORE_gget{
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       exch
+                       get
+               }def
+               /gsave{
+                       AGMCORE_&gsave
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gstackptr 1 add
+                       dup 32 ge{limitcheck}if
+                       /AGMCORE_gstackptr exch store
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gdictcopy
+               }def
+               /grestore{
+                       AGMCORE_&grestore
+                       AGMCORE_gstackptr 1 sub
+                       dup AGMCORE_gstacksaveptr lt{1 add}if
+                       dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known
+                               {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse
+                       /AGMCORE_gstackptr exch store
+               }def
+               /grestoreall{
+                       AGMCORE_&grestoreall
+                       /AGMCORE_gstackptr AGMCORE_gstacksaveptr store 
+               }def
+               /save{
+                       AGMCORE_&save
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gstackptr 1 add
+                       dup 32 ge{limitcheck}if
+                       /AGMCORE_gstackptr exch store
+                       /AGMCORE_gstacksaveptr AGMCORE_gstackptr store
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gdictcopy
+               }def
+               /setoverprint{
+                       dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint
+               }def    
+               0 1 AGMCORE_gstack length 1 sub{
+                               AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
+               }for
+       }if
+       level3/AGMCORE_&sysshfill AGMCORE_key_known not and
+       {
+               /AGMCORE_&sysshfill systemdict/shfill get def
+               /AGMCORE_&sysmakepattern systemdict/makepattern get def
+               /AGMCORE_&usrmakepattern/makepattern load def
+       }if
+       /currentcmykcolor[0 0 0 0]AGMCORE_gput
+       /currentstrokeadjust false AGMCORE_gput
+       /currentcolorspace[/DeviceGray]AGMCORE_gput
+       /sep_tint 0 AGMCORE_gput
+       /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput
+       /sep_colorspace_dict null AGMCORE_gput
+       /devicen_colorspace_dict null AGMCORE_gput
+       /indexed_colorspace_dict null AGMCORE_gput
+       /currentcolor_intent()AGMCORE_gput
+       /customcolor_tint 1 AGMCORE_gput
+       /absolute_colorimetric_crd null AGMCORE_gput
+       /relative_colorimetric_crd null AGMCORE_gput
+       /saturation_crd null AGMCORE_gput
+       /perceptual_crd null AGMCORE_gput
+       currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf
+                cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf
+       <<
+       /MaxPatternItem currentsystemparams/MaxPatternCache get
+       >>
+       setuserparams
+       end
+}def
+/ps
+{
+       /setcmykcolor where{
+               pop
+               Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put
+       }if
+       Adobe_AGM_Core begin
+       /setcmykcolor
+       {
+               4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput
+               1 sub 4 1 roll
+               3{
+                       3 index add neg dup 0 lt{
+                               pop 0
+                       }if
+                       3 1 roll
+               }repeat
+               setrgbcolor pop
+       }ndf
+       /currentcmykcolor
+       {
+               /currentcmykcolor AGMCORE_gget aload pop
+       }ndf
+       /setoverprint
+       {pop}ndf
+       /currentoverprint
+       {false}ndf
+       /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
+       /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
+       /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
+       /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
+       /AGMCORE_plate_ndx 
+               AGMCORE_cyan_plate{
+                       0
+               }{
+                       AGMCORE_magenta_plate{
+                               1
+                       }{
+                               AGMCORE_yellow_plate{
+                                       2
+                               }{
+                                       AGMCORE_black_plate{
+                                               3
+                                       }{
+                                               4
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+               def
+       /AGMCORE_have_reported_unsupported_color_space false def
+       /AGMCORE_report_unsupported_color_space
+       {
+               AGMCORE_have_reported_unsupported_color_space false eq
+               {
+                       (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)==
+                       Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf
+               }if
+       }def
+       /AGMCORE_composite_job
+               AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
+       /AGMCORE_in_rip_sep
+               /AGMCORE_in_rip_sep where{
+                       pop AGMCORE_in_rip_sep
+               }{
+                       AGMCORE_distilling 
+                       {
+                               false
+                       }{
+                               userdict/Adobe_AGM_OnHost_Seps known{
+                                       false
+                               }{
+                                       level2{
+                                               currentpagedevice/Separations 2 copy known{
+                                                       get
+                                               }{
+                                                       pop pop false
+                                               }ifelse
+                                       }{
+                                               false
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+       def
+       /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
+       /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
+       /AGM_preserve_spots 
+               /AGM_preserve_spots where{
+                       pop AGM_preserve_spots
+               }{
+                       AGMCORE_distilling AGMCORE_producing_seps or
+               }ifelse
+       def
+       /AGM_is_distiller_preserving_spotimages
+       {
+               currentdistillerparams/PreserveOverprintSettings known
+               {
+                       currentdistillerparams/PreserveOverprintSettings get
+                               {
+                                       currentdistillerparams/ColorConversionStrategy known
+                                       {
+                                               currentdistillerparams/ColorConversionStrategy get
+                                               /sRGB ne
+                                       }{
+                                               true
+                                       }ifelse
+                               }{
+                                       false
+                               }ifelse
+               }{
+                       false
+               }ifelse
+       }def
+       /convert_spot_to_process where{pop}{
+               /convert_spot_to_process
+               {
+                       //Adobe_AGM_Core begin
+                       dup map_alias{
+                               /Name get exch pop
+                       }if
+                       dup dup(None)eq exch(All)eq or
+                               {
+                               pop false
+                               }{
+                               AGMCORE_host_sep
+                               {
+                                       gsave
+                                       1 0 0 0 setcmykcolor currentgray 1 exch sub
+                                       0 1 0 0 setcmykcolor currentgray 1 exch sub
+                                       0 0 1 0 setcmykcolor currentgray 1 exch sub
+                                       0 0 0 1 setcmykcolor currentgray 1 exch sub
+                                       add add add 0 eq
+                                       {
+                                               pop false
+                                       }{
+                                               false setoverprint
+                                               current_spot_alias false set_spot_alias
+                                               1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
+                                               set_spot_alias
+                                               currentgray 1 ne
+                                       }ifelse
+                                       grestore
+                               }{
+                                       AGMCORE_distilling
+                                       {
+                                               pop AGM_is_distiller_preserving_spotimages not
+                                       }{
+                                               //Adobe_AGM_Core/AGMCORE_name xddf
+                                               false
+                                               //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq
+                                               AGMUTIL_cpd/OverrideSeparations known and
+                                               {
+                                                       AGMUTIL_cpd/OverrideSeparations get
+                                                       {
+                                                               /HqnSpots/ProcSet resourcestatus
+                                                               {
+                                                                       pop pop pop true
+                                                               }if
+                                                       }if
+                                               }if                                     
+                                               {
+                                                       AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not
+                                               }{
+                                                       gsave
+                                                       [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace
+                                                       false
+                                                       AGMUTIL_cpd/SeparationColorNames 2 copy known
+                                                       {
+                                                               get
+                                                               {AGMCORE_name eq or}forall
+                                                               not
+                                                       }{
+                                                               pop pop pop true
+                                                       }ifelse
+                                                       grestore
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+                       end
+               }def
+       }ifelse
+       /convert_to_process where{pop}{
+               /convert_to_process
+               {
+                       dup length 0 eq
+                               {
+                               pop false
+                               }{
+                               AGMCORE_host_sep
+                               {
+                               dup true exch
+                                       {
+                                       dup(Cyan)eq exch
+                                       dup(Magenta)eq 3 -1 roll or exch
+                                       dup(Yellow)eq 3 -1 roll or exch
+                                       dup(Black)eq 3 -1 roll or
+                                               {pop}
+                                               {convert_spot_to_process and}ifelse
+                                       }
+                               forall
+                                       {
+                                       true exch
+                                               {
+                                               dup(Cyan)eq exch
+                                               dup(Magenta)eq 3 -1 roll or exch
+                                               dup(Yellow)eq 3 -1 roll or exch
+                                               (Black)eq or and
+                                               }forall
+                                               not
+                                       }{pop false}ifelse
+                               }{
+                               false exch
+                                       {
+                                       /PhotoshopDuotoneList where{pop false}{true}ifelse
+                                               {
+                                               dup(Cyan)eq exch
+                                               dup(Magenta)eq 3 -1 roll or exch
+                                               dup(Yellow)eq 3 -1 roll or exch
+                                               dup(Black)eq 3 -1 roll or
+                                               {pop}
+                                               {convert_spot_to_process or}ifelse
+                                               }
+                                               {
+                                               convert_spot_to_process or
+                                               }
+                                       ifelse
+                                       }
+                               forall
+                               }ifelse
+                       }ifelse
+               }def
+       }ifelse 
+       /AGMCORE_avoid_L2_sep_space 
+               version cvr 2012 lt 
+               level2 and 
+               AGMCORE_producing_seps not and
+       def
+       /AGMCORE_is_cmyk_sep
+               AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
+       def
+       /AGM_avoid_0_cmyk where{
+               pop AGM_avoid_0_cmyk
+       }{
+               AGM_preserve_spots 
+               userdict/Adobe_AGM_OnHost_Seps known 
+               userdict/Adobe_AGM_InRip_Seps known or
+               not and
+       }ifelse
+       {
+               /setcmykcolor[
+                       {
+                               4 copy add add add 0 eq currentoverprint and{
+                                       pop 0.0005
+                               }if
+                       }/exec cvx
+                       /AGMCORE_&setcmykcolor load dup type/operatortype ne{
+                               /exec cvx
+                       }if
+               ]cvx def
+       }if
+       /AGMCORE_IsSeparationAProcessColor
+               {
+               dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or
+               }def
+       AGMCORE_host_sep{
+               /setcolortransfer
+               {
+                       AGMCORE_cyan_plate{
+                               pop pop pop
+                       }{
+                               AGMCORE_magenta_plate{
+                                       4 3 roll pop pop pop
+                               }{
+                                       AGMCORE_yellow_plate{
+                                               4 2 roll pop pop pop
+                                       }{
+                                               4 1 roll pop pop pop
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+                       settransfer 
+               }       
+               def
+               /AGMCORE_get_ink_data
+                       AGMCORE_cyan_plate{
+                               {pop pop pop}
+                       }{
+                               AGMCORE_magenta_plate{
+                                       {4 3 roll pop pop pop}
+                               }{
+                                       AGMCORE_yellow_plate{
+                                               {4 2 roll pop pop pop}
+                                       }{
+                                               {4 1 roll pop pop pop}
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               def
+               /AGMCORE_RemoveProcessColorNames
+                       {
+                       1 dict begin
+                       /filtername
+                               {
+                               dup/Cyan eq 1 index(Cyan)eq or
+                                       {pop(_cyan_)}if
+                               dup/Magenta eq 1 index(Magenta)eq or
+                                       {pop(_magenta_)}if
+                               dup/Yellow eq 1 index(Yellow)eq or
+                                       {pop(_yellow_)}if
+                               dup/Black eq 1 index(Black)eq or
+                                       {pop(_black_)}if
+                               }def
+                       dup type/arraytype eq
+                               {[exch{filtername}forall]}
+                               {filtername}ifelse
+                       end
+                       }def
+               level3{
+                       /AGMCORE_IsCurrentColor
+                               {
+                               dup AGMCORE_IsSeparationAProcessColor
+                                       {
+                                       AGMCORE_plate_ndx 0 eq
+                                               {dup(Cyan)eq exch/Cyan eq or}if
+                                       AGMCORE_plate_ndx 1 eq
+                                               {dup(Magenta)eq exch/Magenta eq or}if
+                                       AGMCORE_plate_ndx 2 eq
+                                               {dup(Yellow)eq exch/Yellow eq or}if
+                                       AGMCORE_plate_ndx 3 eq
+                                               {dup(Black)eq exch/Black eq or}if
+                                       AGMCORE_plate_ndx 4 eq
+                                               {pop false}if
+                                       }{
+                                       gsave
+                                       false setoverprint
+                                       current_spot_alias false set_spot_alias
+                                       1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
+                                       set_spot_alias
+                                       currentgray 1 ne
+                                       grestore
+                                       }ifelse
+                               }def
+                       /AGMCORE_filter_functiondatasource
+                               {       
+                               5 dict begin
+                               /data_in xdf
+                               data_in type/stringtype eq
+                                       {
+                                       /ncomp xdf
+                                       /comp xdf
+                                       /string_out data_in length ncomp idiv string def
+                                       0 ncomp data_in length 1 sub
+                                               {
+                                               string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put
+                                               }for
+                                       string_out
+                                       }{
+                                       string/string_in xdf
+                                       /string_out 1 string def
+                                       /component xdf
+                                       [
+                                       data_in string_in/readstring cvx
+                                               [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx
+                                               [/pop cvx()]cvx/ifelse cvx
+                                       ]cvx/ReusableStreamDecode filter
+                               }ifelse
+                               end
+                               }def
+                       /AGMCORE_separateShadingFunction
+                               {
+                               2 dict begin
+                               /paint? xdf
+                               /channel xdf
+                               dup type/dicttype eq
+                                       {
+                                       begin
+                                       FunctionType 0 eq
+                                               {
+                                               /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def
+                                               currentdict/Decode known
+                                                       {/Decode Decode channel 2 mul 2 getinterval def}if
+                                               paint? not
+                                                       {/Decode[1 1]def}if
+                                               }if
+                                       FunctionType 2 eq
+                                               {
+                                               paint?
+                                                       {
+                                                       /C0[C0 channel get 1 exch sub]def
+                                                       /C1[C1 channel get 1 exch sub]def
+                                                       }{
+                                                       /C0[1]def
+                                                       /C1[1]def
+                                                       }ifelse                 
+                                               }if
+                                       FunctionType 3 eq
+                                               {
+                                               /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def                  
+                                               }if
+                                       currentdict/Range known
+                                               {/Range[0 1]def}if
+                                       currentdict
+                                       end}{
+                                       channel get 0 paint? AGMCORE_separateShadingFunction
+                                       }ifelse
+                               end
+                               }def
+                       /AGMCORE_separateShading
+                               {
+                               3 -1 roll begin
+                               currentdict/Function known
+                                       {
+                                       currentdict/Background known
+                                               {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if
+                                       Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf
+                                       /ColorSpace[/DeviceGray]def
+                                       }{
+                                       ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq
+                                               {
+                                               /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
+                                               }{
+                                               ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put
+                                               }ifelse
+                                       ColorSpace 0 get/Separation eq
+                                               {
+                                                       {
+                                                               [1/exch cvx/sub cvx]cvx
+                                                       }{
+                                                               [/pop cvx 1]cvx
+                                                       }ifelse
+                                                       ColorSpace 3 3 -1 roll put
+                                                       pop
+                                               }{
+                                                       {
+                                                               [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx
+                                                       }{
+                                                               pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx
+                                                       }ifelse
+                                                       ColorSpace 3 3 -1 roll bind put
+                                               }ifelse
+                                       ColorSpace 2/DeviceGray put                                                                                                                                             
+                                       }ifelse
+                               end
+                               }def
+                       /AGMCORE_separateShadingDict
+                               {
+                               dup/ColorSpace get
+                               dup type/arraytype ne
+                                       {[exch]}if
+                               dup 0 get/DeviceCMYK eq
+                                       {
+                                       exch begin 
+                                       currentdict
+                                       AGMCORE_cyan_plate
+                                               {0 true}if
+                                       AGMCORE_magenta_plate
+                                               {1 true}if
+                                       AGMCORE_yellow_plate
+                                               {2 true}if
+                                       AGMCORE_black_plate
+                                               {3 true}if
+                                       AGMCORE_plate_ndx 4 eq
+                                               {0 false}if             
+                                       dup not currentoverprint and
+                                               {/AGMCORE_ignoreshade true def}if
+                                       AGMCORE_separateShading
+                                       currentdict
+                                       end exch
+                                       }if
+                               dup 0 get/Separation eq
+                                       {
+                                       exch begin
+                                       ColorSpace 1 get dup/None ne exch/All ne and
+                                               {
+                                               ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and
+                                                       {
+                                                       ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
+                                                               {
+                                                               /ColorSpace
+                                                                       [
+                                                                       /Separation
+                                                                       ColorSpace 1 get
+                                                                       /DeviceGray
+                                                                               [
+                                                                               ColorSpace 3 get/exec cvx
+                                                                               4 AGMCORE_plate_ndx sub -1/roll cvx
+                                                                               4 1/roll cvx
+                                                                               3[/pop cvx]cvx/repeat cvx
+                                                                               1/exch cvx/sub cvx
+                                                                               ]cvx                                                                    
+                                                                       ]def
+                                                               }{
+                                                               AGMCORE_report_unsupported_color_space
+                                                               AGMCORE_black_plate not
+                                                                       {
+                                                                       currentdict 0 false AGMCORE_separateShading
+                                                                       }if
+                                                               }ifelse
+                                                       }{
+                                                       currentdict ColorSpace 1 get AGMCORE_IsCurrentColor
+                                                       0 exch 
+                                                       dup not currentoverprint and
+                                                               {/AGMCORE_ignoreshade true def}if
+                                                       AGMCORE_separateShading
+                                                       }ifelse 
+                                               }if                     
+                                       currentdict
+                                       end exch
+                                       }if
+                               dup 0 get/DeviceN eq
+                                       {
+                                       exch begin
+                                       ColorSpace 1 get convert_to_process
+                                               {
+                                               ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
+                                                       {
+                                                       /ColorSpace
+                                                               [
+                                                               /DeviceN
+                                                               ColorSpace 1 get
+                                                               /DeviceGray
+                                                                       [
+                                                                       ColorSpace 3 get/exec cvx
+                                                                       4 AGMCORE_plate_ndx sub -1/roll cvx
+                                                                       4 1/roll cvx
+                                                                       3[/pop cvx]cvx/repeat cvx
+                                                                       1/exch cvx/sub cvx
+                                                                       ]cvx                                                                    
+                                                               ]def
+                                                       }{
+                                                       AGMCORE_report_unsupported_color_space
+                                                       AGMCORE_black_plate not
+                                                               {
+                                                               currentdict 0 false AGMCORE_separateShading
+                                                               /ColorSpace[/DeviceGray]def
+                                                               }if
+                                                       }ifelse
+                                               }{
+                                               currentdict
+                                               false -1 ColorSpace 1 get
+                                                       {
+                                                       AGMCORE_IsCurrentColor
+                                                               {
+                                                               1 add
+                                                               exch pop true exch exit
+                                                               }if
+                                                       1 add
+                                                       }forall
+                                               exch 
+                                               dup not currentoverprint and
+                                                       {/AGMCORE_ignoreshade true def}if
+                                               AGMCORE_separateShading
+                                               }ifelse
+                                       currentdict
+                                       end exch
+                                       }if
+                               dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not
+                                       {
+                                       exch begin
+                                       ColorSpace dup type/arraytype eq
+                                               {0 get}if
+                                       /DeviceGray ne
+                                               {
+                                               AGMCORE_report_unsupported_color_space
+                                               AGMCORE_black_plate not
+                                                       {
+                                                       ColorSpace 0 get/CIEBasedA eq
+                                                               {
+                                                               /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def
+                                                               }if
+                                                       ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or
+                                                               {
+                                                               /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def
+                                                               }if
+                                                       ColorSpace 0 get/CIEBasedDEFG eq
+                                                               {
+                                                               /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
+                                                               }if
+                                                       currentdict 0 false AGMCORE_separateShading
+                                                       }if
+                                               }if
+                                       currentdict
+                                       end exch
+                                       }if
+                               pop
+                               dup/AGMCORE_ignoreshade known
+                                       {
+                                       begin
+                                       /ColorSpace[/Separation(None)/DeviceGray{}]def
+                                       currentdict end
+                                       }if
+                               }def
+                       /shfill
+                               {
+                               AGMCORE_separateShadingDict 
+                               dup/AGMCORE_ignoreshade known
+                                       {pop}
+                                       {AGMCORE_&sysshfill}ifelse
+                               }def
+                       /makepattern
+                               {
+                               exch
+                               dup/PatternType get 2 eq
+                                       {
+                                       clonedict
+                                       begin
+                                       /Shading Shading AGMCORE_separateShadingDict def
+                                       Shading/AGMCORE_ignoreshade known
+                                       currentdict end exch
+                                       {pop<</PatternType 1/PaintProc{pop}/BBox[0 0 1 1]/XStep 1/YStep 1/PaintType 1/TilingType 3>>}if
+                                       exch AGMCORE_&sysmakepattern
+                                       }{
+                                       exch AGMCORE_&usrmakepattern
+                                       }ifelse
+                               }def
+               }if
+       }if
+       AGMCORE_in_rip_sep{
+               /setcustomcolor
+               {
+                       exch aload pop
+                       dup 7 1 roll inRip_spot_has_ink not     {
+                               4{4 index mul 4 1 roll}
+                               repeat
+                               /DeviceCMYK setcolorspace
+                               6 -2 roll pop pop
+                       }{
+                               //Adobe_AGM_Core begin
+                                       /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf
+                               end
+                               [/Separation 4 -1 roll/DeviceCMYK
+                               {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
+                               ]
+                               setcolorspace
+                       }ifelse
+                       setcolor
+               }ndf
+               /setseparationgray
+               {
+                       [/Separation(All)/DeviceGray{}]setcolorspace_opt
+                       1 exch sub setcolor
+               }ndf
+       }{
+               /setseparationgray
+               {
+                       AGMCORE_&setgray
+               }ndf
+       }ifelse
+       /findcmykcustomcolor
+       {
+               5 makereadonlyarray
+       }ndf
+       /setcustomcolor
+       {
+               exch aload pop pop
+               4{4 index mul 4 1 roll}repeat
+               setcmykcolor pop
+       }ndf
+       /has_color
+               /colorimage where{
+                       AGMCORE_producing_seps{
+                               pop true
+                       }{
+                               systemdict eq
+                       }ifelse
+               }{
+                       false
+               }ifelse
+       def
+       /map_index
+       {
+               1 index mul exch getinterval{255 div}forall
+       }bdf
+       /map_indexed_devn
+       {
+               Lookup Names length 3 -1 roll cvi map_index
+       }bdf
+       /n_color_components
+       {
+               base_colorspace_type
+               dup/DeviceGray eq{
+                       pop 1
+               }{
+                       /DeviceCMYK eq{
+                               4
+                       }{
+                               3
+                       }ifelse
+               }ifelse
+       }bdf
+       level2{
+               /mo/moveto ldf
+               /li/lineto ldf
+               /cv/curveto ldf
+               /knockout_unitsq
+               {
+                       1 setgray
+                       0 0 1 1 rectfill
+               }def
+               level2/setcolorspace AGMCORE_key_known not and{
+                       /AGMCORE_&&&setcolorspace/setcolorspace ldf
+                       /AGMCORE_ReplaceMappedColor
+                       {
+                               dup type dup/arraytype eq exch/packedarraytype eq or
+                               {
+                                       /AGMCORE_SpotAliasAry2 where{
+                                               begin
+                                               dup 0 get dup/Separation eq
+                                               {
+                                                       pop
+                                                       dup length array copy
+                                                       dup dup 1 get
+                                                       current_spot_alias
+                                                       {
+                                                               dup map_alias
+                                                               {
+                                                                       false set_spot_alias
+                                                                       dup 1 exch setsepcolorspace
+                                                                       true set_spot_alias
+                                                                       begin
+                                                                       /sep_colorspace_dict currentdict AGMCORE_gput
+                                                                       pop pop pop
+                                                                       [
+                                                                               /Separation Name 
+                                                                               CSA map_csa
+                                                                               MappedCSA 
+                                                                               /sep_colorspace_proc load
+                                                                       ]
+                                                                       dup Name
+                                                                       end
+                                                               }if
+                                                       }if
+                                                       map_reserved_ink_name 1 xpt
+                                               }{
+                                                       /DeviceN eq 
+                                                       {
+                                                               dup length array copy
+                                                               dup dup 1 get[
+                                                                       exch{
+                                                                               current_spot_alias{
+                                                                                       dup map_alias{
+                                                                                               /Name get exch pop
+                                                                                       }if
+                                                                               }if
+                                                                               map_reserved_ink_name
+                                                                       }forall 
+                                                               ]1 xpt
+                                                       }if
+                                               }ifelse
+                                               end
+                                       }if
+                               }if
+                       }def
+                       /setcolorspace
+                       {
+                               dup type dup/arraytype eq exch/packedarraytype eq or
+                               {
+                                       dup 0 get/Indexed eq
+                                       {
+                                               AGMCORE_distilling
+                                               {
+                                                       /PhotoshopDuotoneList where
+                                                       {
+                                                               pop false
+                                                       }{
+                                                               true
+                                                       }ifelse
+                                               }{
+                                                       true
+                                               }ifelse
+                                               {
+                                                       aload pop 3 -1 roll
+                                                       AGMCORE_ReplaceMappedColor
+                                                       3 1 roll 4 array astore
+                                               }if
+                                       }{
+                                               AGMCORE_ReplaceMappedColor
+                                       }ifelse
+                               }if
+                               DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if
+                       }def
+               }if     
+       }{
+               /adj
+               {
+                       currentstrokeadjust{
+                               transform
+                               0.25 sub round 0.25 add exch
+                               0.25 sub round 0.25 add exch
+                               itransform
+                       }if
+               }def
+               /mo{
+                       adj moveto
+               }def
+               /li{
+                       adj lineto
+               }def
+               /cv{
+                       6 2 roll adj
+                       6 2 roll adj
+                       6 2 roll adj curveto
+               }def
+               /knockout_unitsq
+               {
+                       1 setgray
+                       8 8 1[8 0 0 8 0 0]{<ffffffffffffffff>}image
+               }def
+               /currentstrokeadjust{
+                       /currentstrokeadjust AGMCORE_gget
+               }def
+               /setstrokeadjust{
+                       /currentstrokeadjust exch AGMCORE_gput
+               }def
+               /setcolorspace
+               {
+                       /currentcolorspace exch AGMCORE_gput
+               }def
+               /currentcolorspace
+               {
+                       /currentcolorspace AGMCORE_gget
+               }def
+               /setcolor_devicecolor
+               {
+                       base_colorspace_type
+                       dup/DeviceGray eq{
+                               pop setgray
+                       }{
+                               /DeviceCMYK eq{
+                                       setcmykcolor
+                               }{
+                                       setrgbcolor
+                               }ifelse
+                       }ifelse
+               }def
+               /setcolor
+               {
+                       currentcolorspace 0 get
+                       dup/DeviceGray ne{
+                               dup/DeviceCMYK ne{
+                                       dup/DeviceRGB ne{
+                                               dup/Separation eq{
+                                                       pop
+                                                       currentcolorspace 3 gx
+                                                       currentcolorspace 2 get
+                                               }{
+                                                       dup/Indexed eq{
+                                                               pop
+                                                               currentcolorspace 3 get dup type/stringtype eq{
+                                                                       currentcolorspace 1 get n_color_components
+                                                                       3 -1 roll map_index
+                                                               }{
+                                                                       exec
+                                                               }ifelse
+                                                               currentcolorspace 1 get
+                                                       }{
+                                                               /AGMCORE_cur_err/AGMCORE_invalid_color_space def
+                                                               AGMCORE_invalid_color_space
+                                                       }ifelse
+                                               }ifelse
+                                       }if
+                               }if
+                       }if
+                       setcolor_devicecolor
+               }def
+       }ifelse
+       /sop/setoverprint ldf
+       /lw/setlinewidth ldf
+       /lc/setlinecap ldf
+       /lj/setlinejoin ldf
+       /ml/setmiterlimit ldf
+       /dsh/setdash ldf
+       /sadj/setstrokeadjust ldf
+       /gry/setgray ldf
+       /rgb/setrgbcolor ldf
+       /cmyk[
+               /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx
+               /setcmykcolor load dup type/operatortype ne{/exec cvx}if
+       ]cvx bdf
+       level3 AGMCORE_host_sep not and{
+               /nzopmsc{
+                       6 dict begin
+                       /kk exch def
+                       /yy exch def
+                       /mm exch def
+                       /cc exch def
+                       /sum 0 def
+                       cc 0 ne{/sum sum 2#1000 or def cc}if
+                       mm 0 ne{/sum sum 2#0100 or def mm}if
+                       yy 0 ne{/sum sum 2#0010 or def yy}if
+                       kk 0 ne{/sum sum 2#0001 or def kk}if
+                       AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace
+                       sum 0 eq{0}if
+                       end
+                       setcolor
+               }bdf
+       }{
+               /nzopmsc/cmyk ldf
+       }ifelse
+       /sep/setsepcolor ldf
+       /devn/setdevicencolor ldf
+       /idx/setindexedcolor ldf
+       /colr/setcolor ldf
+       /csacrd/set_csa_crd ldf
+       /sepcs/setsepcolorspace ldf
+       /devncs/setdevicencolorspace ldf
+       /idxcs/setindexedcolorspace ldf
+       /cp/closepath ldf
+       /clp/clp_npth ldf
+       /eclp/eoclp_npth ldf
+       /f/fill ldf
+       /ef/eofill ldf
+       /@/stroke ldf
+       /nclp/npth_clp ldf
+       /gset/graphic_setup ldf
+       /gcln/graphic_cleanup ldf
+       /ct/concat ldf
+       /cf/currentfile ldf
+       /fl/filter ldf
+       /rs/readstring ldf
+       /AGMCORE_def_ht currenthalftone def
+       /clonedict Adobe_AGM_Utils begin/clonedict load end def
+       /clonearray Adobe_AGM_Utils begin/clonearray load end def
+       currentdict{
+               dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
+                       bind
+               }if
+               def
+       }forall
+       /getrampcolor
+       {
+               /indx exch def
+               0 1 NumComp 1 sub
+               {
+                       dup
+                       Samples exch get
+                       dup type/stringtype eq{indx get}if
+                       exch
+                       Scaling exch get aload pop
+                       3 1 roll
+                       mul add
+               }for
+               ColorSpaceFamily/Separation eq 
+               {sep}
+               {
+                       ColorSpaceFamily/DeviceN eq
+                       {devn}{setcolor}ifelse
+               }ifelse
+       }bdf
+       /sssetbackground{
+               aload pop 
+               ColorSpaceFamily/Separation eq 
+               {sep}
+               {
+                       ColorSpaceFamily/DeviceN eq
+                       {devn}{setcolor}ifelse
+               }ifelse 
+       }bdf
+       /RadialShade
+       {
+               40 dict begin
+               /ColorSpaceFamily xdf
+               /background xdf
+               /ext1 xdf
+               /ext0 xdf
+               /BBox xdf
+               /r2 xdf
+               /c2y xdf
+               /c2x xdf
+               /r1 xdf
+               /c1y xdf
+               /c1x xdf
+               /rampdict xdf
+               /setinkoverprint where{pop/setinkoverprint{pop}def}if
+               gsave
+               BBox length 0 gt
+               {
+                       np
+                       BBox 0 get BBox 1 get moveto
+                       BBox 2 get BBox 0 get sub 0 rlineto
+                       0 BBox 3 get BBox 1 get sub rlineto
+                       BBox 2 get BBox 0 get sub neg 0 rlineto
+                       closepath
+                       clip
+                       np
+               }if
+               c1x c2x eq
+               {
+                       c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse
+               }{
+                       /slope c2y c1y sub c2x c1x sub div def
+                       /theta slope 1 atan def
+                       c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if
+                       c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if
+               }ifelse
+               gsave
+               clippath
+               c1x c1y translate
+               theta rotate
+               -90 rotate
+               {pathbbox}stopped
+               {0 0 0 0}if
+               /yMax xdf
+               /xMax xdf
+               /yMin xdf
+               /xMin xdf
+               grestore
+               xMax xMin eq yMax yMin eq or
+               {
+                       grestore
+                       end
+               }{
+                       /max{2 copy gt{pop}{exch pop}ifelse}bdf
+                       /min{2 copy lt{pop}{exch pop}ifelse}bdf
+                       rampdict begin
+                       40 dict begin
+                       background length 0 gt{background sssetbackground gsave clippath fill grestore}if
+                       gsave
+                       c1x c1y translate
+                       theta rotate
+                       -90 rotate
+                       /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def
+                       /c1y 0 def
+                       /c1x 0 def
+                       /c2x 0 def
+                       ext0
+                       {
+                               0 getrampcolor
+                               c2y r2 add r1 sub 0.0001 lt
+                               {
+                                       c1x c1y r1 360 0 arcn
+                                       pathbbox
+                                       /aymax exch def
+                                       /axmax exch def
+                                       /aymin exch def
+                                       /axmin exch def
+                                       /bxMin xMin axmin min def
+                                       /byMin yMin aymin min def
+                                       /bxMax xMax axmax max def
+                                       /byMax yMax aymax max def
+                                       bxMin byMin moveto
+                                       bxMax byMin lineto
+                                       bxMax byMax lineto
+                                       bxMin byMax lineto
+                                       bxMin byMin lineto
+                                       eofill
+                               }{
+                                       c2y r1 add r2 le
+                                       {
+                                               c1x c1y r1 0 360 arc
+                                               fill
+                                       }
+                                       {
+                                               c2x c2y r2 0 360 arc fill
+                                               r1 r2 eq
+                                               {
+                                                       /p1x r1 neg def
+                                                       /p1y c1y def
+                                                       /p2x r1 def
+                                                       /p2y c1y def
+                                                       p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto
+                                                       fill
+                                               }{
+                                                       /AA r2 r1 sub c2y div def
+                                                       AA -1 eq
+                                                       {/theta 89.99 def}
+                                                       {/theta AA 1 AA dup mul sub sqrt div 1 atan def}
+                                                       ifelse
+                                                       /SS1 90 theta add dup sin exch cos div def
+                                                       /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
+                                                       /p1y p1x SS1 div neg def
+                                                       /SS2 90 theta sub dup sin exch cos div def
+                                                       /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
+                                                       /p2y p2x SS2 div neg def
+                                                       r1 r2 gt
+                                                       {
+                                                               /L1maxX p1x yMin p1y sub SS1 div add def
+                                                               /L2maxX p2x yMin p2y sub SS2 div add def
+                                                       }{
+                                                               /L1maxX 0 def
+                                                               /L2maxX 0 def
+                                                       }ifelse
+                                                       p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
+                                                       L1maxX L1maxX p1x sub SS1 mul p1y add lineto
+                                                       fill
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }if
+               c1x c2x sub dup mul
+               c1y c2y sub dup mul
+               add 0.5 exp
+               0 dtransform
+               dup mul exch dup mul add 0.5 exp 72 div
+               0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+               72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+               1 index 1 index lt{exch}if pop
+               /hires xdf
+               hires mul
+               /numpix xdf
+               /numsteps NumSamples def
+               /rampIndxInc 1 def
+               /subsampling false def
+               numpix 0 ne
+               {
+                       NumSamples numpix div 0.5 gt
+                       {
+                               /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
+                               /rampIndxInc NumSamples 1 sub numsteps div def
+                               /subsampling true def
+                       }if
+               }if
+               /xInc c2x c1x sub numsteps div def
+               /yInc c2y c1y sub numsteps div def
+               /rInc r2 r1 sub numsteps div def
+               /cx c1x def
+               /cy c1y def
+               /radius r1 def
+               np
+               xInc 0 eq yInc 0 eq rInc 0 eq and and
+               {
+                       0 getrampcolor
+                       cx cy radius 0 360 arc
+                       stroke
+                       NumSamples 1 sub getrampcolor
+                       cx cy radius 72 hires div add 0 360 arc
+                       0 setlinewidth
+                       stroke
+               }{
+                       0
+                       numsteps
+                       {
+                               dup
+                               subsampling{round cvi}if
+                               getrampcolor
+                               cx cy radius 0 360 arc
+                               /cx cx xInc add def
+                               /cy cy yInc add def
+                               /radius radius rInc add def
+                               cx cy radius 360 0 arcn
+                               eofill
+                               rampIndxInc add
+                       }repeat
+                       pop
+               }ifelse
+               ext1
+               {
+                       c2y r2 add r1 lt
+                       {
+                               c2x c2y r2 0 360 arc
+                               fill
+                       }{
+                               c2y r1 add r2 sub 0.0001 le
+                               {
+                                       c2x c2y r2 360 0 arcn
+                                       pathbbox
+                                       /aymax exch def
+                                       /axmax exch def
+                                       /aymin exch def
+                                       /axmin exch def
+                                       /bxMin xMin axmin min def
+                                       /byMin yMin aymin min def
+                                       /bxMax xMax axmax max def
+                                       /byMax yMax aymax max def
+                                       bxMin byMin moveto
+                                       bxMax byMin lineto
+                                       bxMax byMax lineto
+                                       bxMin byMax lineto
+                                       bxMin byMin lineto
+                                       eofill
+                               }{
+                                       c2x c2y r2 0 360 arc fill
+                                       r1 r2 eq
+                                       {
+                                               /p1x r2 neg def
+                                               /p1y c2y def
+                                               /p2x r2 def
+                                               /p2y c2y def
+                                               p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto
+                                               fill
+                                       }{
+                                               /AA r2 r1 sub c2y div def
+                                               AA -1 eq
+                                               {/theta 89.99 def}
+                                               {/theta AA 1 AA dup mul sub sqrt div 1 atan def}
+                                               ifelse
+                                               /SS1 90 theta add dup sin exch cos div def
+                                               /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
+                                               /p1y c2y p1x SS1 div sub def
+                                               /SS2 90 theta sub dup sin exch cos div def
+                                               /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
+                                               /p2y c2y p2x SS2 div sub def
+                                               r1 r2 lt
+                                               {
+                                                       /L1maxX p1x yMax p1y sub SS1 div add def
+                                                       /L2maxX p2x yMax p2y sub SS2 div add def
+                                               }{
+                                                       /L1maxX 0 def
+                                                       /L2maxX 0 def
+                                               }ifelse
+                                               p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
+                                               L1maxX L1maxX p1x sub SS1 mul p1y add lineto
+                                               fill
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }if
+               grestore
+               grestore
+               end
+               end
+               end
+               }ifelse
+       }bdf
+       /GenStrips
+       {
+               40 dict begin
+               /ColorSpaceFamily xdf
+               /background xdf
+               /ext1 xdf
+               /ext0 xdf
+               /BBox xdf
+               /y2 xdf
+               /x2 xdf
+               /y1 xdf
+               /x1 xdf
+               /rampdict xdf
+               /setinkoverprint where{pop/setinkoverprint{pop}def}if
+               gsave
+               BBox length 0 gt
+               {
+                       np
+                       BBox 0 get BBox 1 get moveto
+                       BBox 2 get BBox 0 get sub 0 rlineto
+                       0 BBox 3 get BBox 1 get sub rlineto
+                       BBox 2 get BBox 0 get sub neg 0 rlineto
+                       closepath
+                       clip
+                       np
+               }if
+               x1 x2 eq
+               {
+                       y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse
+               }{
+                       /slope y2 y1 sub x2 x1 sub div def
+                       /theta slope 1 atan def
+                       x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if
+                       x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if
+               }
+               ifelse
+               gsave
+               clippath
+               x1 y1 translate
+               theta rotate
+               {pathbbox}stopped
+               {0 0 0 0}if
+               /yMax exch def
+               /xMax exch def
+               /yMin exch def
+               /xMin exch def
+               grestore
+               xMax xMin eq yMax yMin eq or
+               {
+                       grestore
+                       end
+               }{
+                       rampdict begin
+                       20 dict begin
+                       background length 0 gt{background sssetbackground gsave clippath fill grestore}if
+                       gsave
+                       x1 y1 translate
+                       theta rotate
+                       /xStart 0 def
+                       /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def
+                       /ySpan yMax yMin sub def
+                       /numsteps NumSamples def
+                       /rampIndxInc 1 def
+                       /subsampling false def
+                       xStart 0 transform
+                       xEnd 0 transform
+                       3 -1 roll
+                       sub dup mul
+                       3 1 roll
+                       sub dup mul
+                       add 0.5 exp 72 div
+                       0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+                       72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+                       1 index 1 index lt{exch}if pop
+                       mul
+                       /numpix xdf
+                       numpix 0 ne
+                       {
+                               NumSamples numpix div 0.5 gt
+                               {
+                                       /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
+                                       /rampIndxInc NumSamples 1 sub numsteps div def
+                                       /subsampling true def
+                               }if
+                       }if
+                       ext0
+                       {
+                               0 getrampcolor
+                               xMin xStart lt
+                               {
+                                       xMin yMin xMin neg ySpan rectfill
+                               }if
+                       }if
+                       /xInc xEnd xStart sub numsteps div def
+                       /x xStart def
+                       0
+                       numsteps
+                       {
+                               dup
+                               subsampling{round cvi}if
+                               getrampcolor
+                               x yMin xInc ySpan rectfill
+                               /x x xInc add def
+                               rampIndxInc add
+                       }repeat
+                       pop
+                       ext1{
+                               xMax xEnd gt
+                               {
+                                       xEnd yMin xMax xEnd sub ySpan rectfill
+                               }if
+                       }if
+                       grestore
+                       grestore
+                       end
+                       end
+                       end
+               }ifelse
+       }bdf
+}def
+/pt
+{
+       end
+}def
+/dt{
+}def
+/pgsv{
+       //Adobe_AGM_Core/AGMCORE_save save put
+}def
+/pgrs{
+       //Adobe_AGM_Core/AGMCORE_save get restore
+}def
+systemdict/findcolorrendering known{
+       /findcolorrendering systemdict/findcolorrendering get def
+}if
+systemdict/setcolorrendering known{
+       /setcolorrendering systemdict/setcolorrendering get def
+}if
+/test_cmyk_color_plate
+{
+       gsave
+       setcmykcolor currentgray 1 ne
+       grestore
+}def
+/inRip_spot_has_ink
+{
+       dup//Adobe_AGM_Core/AGMCORE_name xddf
+       convert_spot_to_process not
+}def
+/map255_to_range
+{
+       1 index sub
+       3 -1 roll 255 div mul add
+}def
+/set_csa_crd
+{
+       /sep_colorspace_dict null AGMCORE_gput
+       begin
+               CSA get_csa_by_name setcolorspace_opt
+               set_crd
+       end
+}
+def
+/map_csa
+{
+       currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse
+       {pop}{get_csa_by_name/MappedCSA xdf}ifelse
+}def
+/setsepcolor
+{
+       /sep_colorspace_dict AGMCORE_gget begin
+               dup/sep_tint exch AGMCORE_gput
+               TintProc
+       end
+}def
+/setdevicencolor
+{
+       /devicen_colorspace_dict AGMCORE_gget begin
+               Names length copy
+               Names length 1 sub -1 0
+               {
+                       /devicen_tints AGMCORE_gget 3 1 roll xpt
+               }for
+               TintProc
+       end
+}def
+/sep_colorspace_proc
+{
+       /AGMCORE_tmp exch store
+       /sep_colorspace_dict AGMCORE_gget begin
+       currentdict/Components known{
+               Components aload pop 
+               TintMethod/Lab eq{
+                       2{AGMCORE_tmp mul NComponents 1 roll}repeat
+                       LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
+               }{
+                       TintMethod/Subtractive eq{
+                               NComponents{
+                                       AGMCORE_tmp mul NComponents 1 roll
+                               }repeat
+                       }{
+                               NComponents{
+                                       1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
+                               }repeat
+                       }ifelse
+               }ifelse
+       }{
+               ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
+               aload pop
+       }ifelse
+       end
+}def
+/sep_colorspace_gray_proc
+{
+       /AGMCORE_tmp exch store
+       /sep_colorspace_dict AGMCORE_gget begin
+       GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
+       end
+}def
+/sep_proc_name
+{
+       dup 0 get 
+       dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{
+               pop[/DeviceGray]
+               /sep_colorspace_gray_proc
+       }{
+               /sep_colorspace_proc
+       }ifelse
+}def
+/setsepcolorspace
+{
+       current_spot_alias{
+               dup begin
+                       Name map_alias{
+                               exch pop
+                       }if
+               end
+       }if
+       dup/sep_colorspace_dict exch AGMCORE_gput
+       begin
+       CSA map_csa
+       /AGMCORE_sep_special Name dup()eq exch(All)eq or store
+       AGMCORE_avoid_L2_sep_space{
+               [/Indexed MappedCSA sep_proc_name 255 exch 
+                       {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx 
+               ]setcolorspace_opt
+               /TintProc{
+                       255 mul round cvi setcolor
+               }bdf
+       }{
+               MappedCSA 0 get/DeviceCMYK eq 
+               currentdict/Components known and 
+               AGMCORE_sep_special not and{
+                       /TintProc[
+                               Components aload pop Name findcmykcustomcolor 
+                               /exch cvx/setcustomcolor cvx
+                       ]cvx bdf
+               }{
+                       AGMCORE_host_sep Name(All)eq and{
+                               /TintProc{
+                                       1 exch sub setseparationgray 
+                               }bdf
+                       }{
+                               AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and 
+                               AGMCORE_host_sep or
+                               Name()eq and{
+                                       /TintProc[
+                                               MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{
+                                                       cvx/setcmykcolor cvx
+                                               }{
+                                                       cvx/setgray cvx
+                                               }ifelse
+                                       ]cvx bdf
+                               }{
+                                       AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{
+                                               /TintProc[
+                                                       /dup cvx
+                                                       MappedCSA sep_proc_name cvx exch
+                                                       0 get/DeviceGray eq{
+                                                               1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx
+                                                       }if
+                                                       /Name cvx/findcmykcustomcolor cvx/exch cvx
+                                                       AGMCORE_host_sep{
+                                                               AGMCORE_is_cmyk_sep
+                                                               /Name cvx 
+                                                               /AGMCORE_IsSeparationAProcessColor load/exec cvx
+                                                               /not cvx/and cvx 
+                                                       }{
+                                                               Name inRip_spot_has_ink not
+                                                       }ifelse
+                                                       [
+                                                               /pop cvx 1
+                                                       ]cvx/if cvx
+                                                       /setcustomcolor cvx
+                                               ]cvx bdf
+                                       }{
+                                               /TintProc{setcolor}bdf
+                                               [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+       }ifelse
+       set_crd
+       setsepcolor
+       end
+}def
+/additive_blend
+{
+       3 dict begin
+       /numarrays xdf
+       /numcolors xdf
+       0 1 numcolors 1 sub
+               {
+               /c1 xdf
+               1
+               0 1 numarrays 1 sub
+                       {
+                       1 exch add/index cvx
+                       c1/get cvx/mul cvx
+                       }for
+               numarrays 1 add 1/roll cvx 
+               }for
+       numarrays[/pop cvx]cvx/repeat cvx
+       end
+}def
+/subtractive_blend
+{
+       3 dict begin
+       /numarrays xdf
+       /numcolors xdf
+       0 1 numcolors 1 sub
+               {
+               /c1 xdf
+               1 1
+               0 1 numarrays 1 sub
+                       {
+                       1 3 3 -1 roll add/index cvx 
+                       c1/get cvx/sub cvx/mul cvx
+                       }for
+               /sub cvx
+               numarrays 1 add 1/roll cvx
+               }for
+       numarrays[/pop cvx]cvx/repeat cvx
+       end
+}def
+/exec_tint_transform
+{
+       /TintProc[
+               /TintTransform cvx/setcolor cvx
+       ]cvx bdf
+       MappedCSA setcolorspace_opt
+}bdf
+/devn_makecustomcolor
+{
+       2 dict begin
+       /names_index xdf
+       /Names xdf
+       1 1 1 1 Names names_index get findcmykcustomcolor
+       /devicen_tints AGMCORE_gget names_index get setcustomcolor
+       Names length{pop}repeat
+       end
+}bdf
+/setdevicencolorspace
+{
+       dup/AliasedColorants known{false}{true}ifelse 
+       current_spot_alias and{
+               7 dict begin
+               /names_index 0 def
+               dup/names_len exch/Names get length def
+               /new_names names_len array def
+               /new_LookupTables names_len array def
+               /alias_cnt 0 def
+               dup/Names get
+               {
+                       dup map_alias{
+                               exch pop
+                               dup/ColorLookup known{
+                                       dup begin
+                                       new_LookupTables names_index ColorLookup put
+                                       end
+                               }{
+                                       dup/Components known{
+                                               dup begin
+                                               new_LookupTables names_index Components put
+                                               end
+                                       }{
+                                               dup begin
+                                               new_LookupTables names_index[null null null null]put
+                                               end
+                                       }ifelse
+                               }ifelse
+                               new_names names_index 3 -1 roll/Name get put
+                               /alias_cnt alias_cnt 1 add def 
+                       }{
+                               /name xdf                               
+                               new_names names_index name put
+                               dup/LookupTables known{
+                                       dup begin
+                                       new_LookupTables names_index LookupTables names_index get put
+                                       end
+                               }{
+                                       dup begin
+                                       new_LookupTables names_index[null null null null]put
+                                       end
+                               }ifelse
+                       }ifelse
+                       /names_index names_index 1 add def 
+               }forall
+               alias_cnt 0 gt{
+                       /AliasedColorants true def
+                       /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def
+                       0 1 names_len 1 sub{
+                               /names_index xdf
+                               new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{
+                                       /AliasedColorants false def
+                                       exit
+                               }{
+                                       new_LookupTables names_index get 0 get null eq{
+                                               dup/Names get names_index get/name xdf
+                                               name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq
+                                               or or or not{
+                                                       /AliasedColorants false def
+                                                       exit
+                                               }if
+                                       }if
+                               }ifelse
+                       }for
+                       lut_entry_len 1 eq{
+                               /AliasedColorants false def
+                       }if
+                       AliasedColorants{
+                               dup begin
+                               /Names new_names def
+                               /LookupTables new_LookupTables def
+                               /AliasedColorants true def
+                               /NComponents lut_entry_len def
+                               /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def
+                               /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def
+                               currentdict/TTTablesIdx known not{
+                                       /TTTablesIdx -1 def
+                               }if
+                               end
+                       }if
+               }if
+               end
+       }if
+       dup/devicen_colorspace_dict exch AGMCORE_gput
+       begin
+       currentdict/AliasedColorants known{
+               AliasedColorants
+       }{
+               false
+       }ifelse
+       dup not{
+               CSA map_csa
+       }if
+       /TintTransform load type/nulltype eq or{
+               /TintTransform[
+                       0 1 Names length 1 sub
+                               {
+                               /TTTablesIdx TTTablesIdx 1 add def
+                               dup LookupTables exch get dup 0 get null eq
+                                       {
+                                       1 index
+                                       Names exch get
+                                       dup(Cyan)eq
+                                               {
+                                               pop exch
+                                               LookupTables length exch sub
+                                               /index cvx
+                                               0 0 0
+                                               }
+                                               {
+                                               dup(Magenta)eq
+                                                       {
+                                                       pop exch
+                                                       LookupTables length exch sub
+                                                       /index cvx
+                                                       0/exch cvx 0 0
+                                                       }{
+                                                       (Yellow)eq
+                                                               {
+                                                               exch
+                                                               LookupTables length exch sub
+                                                               /index cvx
+                                                               0 0 3 -1/roll cvx 0
+                                                               }{
+                                                               exch
+                                                               LookupTables length exch sub
+                                                               /index cvx
+                                                               0 0 0 4 -1/roll cvx
+                                                               }ifelse
+                                                       }ifelse
+                                               }ifelse
+                                       5 -1/roll cvx/astore cvx
+                                       }{
+                                       dup length 1 sub
+                                       LookupTables length 4 -1 roll sub 1 add
+                                       /index cvx/mul cvx/round cvx/cvi cvx/get cvx
+                                       }ifelse
+                                       Names length TTTablesIdx add 1 add 1/roll cvx
+                               }for
+                       Names length[/pop cvx]cvx/repeat cvx
+                       NComponents Names length
+                       TintMethod/Subtractive eq
+                               {
+                               subtractive_blend
+                               }{
+                               additive_blend
+                               }ifelse
+               ]cvx bdf
+       }if
+       AGMCORE_host_sep{
+               Names convert_to_process{
+                       exec_tint_transform
+               }
+               {       
+                       currentdict/AliasedColorants known{
+                               AliasedColorants not
+                       }{
+                               false
+                       }ifelse
+                       5 dict begin
+                       /AvoidAliasedColorants xdf
+                       /painted? false def
+                       /names_index 0 def
+                       /names_len Names length def
+                       AvoidAliasedColorants{
+                               /currentspotalias current_spot_alias def
+                               false set_spot_alias
+                       }if
+                       Names{
+                               AGMCORE_is_cmyk_sep{
+                                       dup(Cyan)eq AGMCORE_cyan_plate and exch
+                                       dup(Magenta)eq AGMCORE_magenta_plate and exch
+                                       dup(Yellow)eq AGMCORE_yellow_plate and exch
+                                       (Black)eq AGMCORE_black_plate and or or or{
+                                               /devicen_colorspace_dict AGMCORE_gget/TintProc[
+                                                       Names names_index/devn_makecustomcolor cvx
+                                               ]cvx ddf
+                                               /painted? true def
+                                       }if
+                                       painted?{exit}if
+                               }{
+                                       0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{
+                                       /devicen_colorspace_dict AGMCORE_gget/TintProc[
+                                               Names names_index/devn_makecustomcolor cvx
+                                       ]cvx ddf
+                                       /painted? true def
+                                       exit
+                                       }if
+                               }ifelse
+                               /names_index names_index 1 add def
+                       }forall
+                       AvoidAliasedColorants{
+                               currentspotalias set_spot_alias
+                       }if
+                       painted?{
+                               /devicen_colorspace_dict AGMCORE_gget/names_index names_index put
+                       }{
+                               /devicen_colorspace_dict AGMCORE_gget/TintProc[
+                                       names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx
+                                       0 0 0 0/setcmykcolor cvx
+                               ]cvx ddf
+                       }ifelse
+                       end
+               }ifelse
+       }
+       {
+               AGMCORE_in_rip_sep{
+                       Names convert_to_process not
+               }{
+                       level3
+               }ifelse
+               {
+                       [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt
+                       /TintProc level3 not AGMCORE_in_rip_sep and{
+                               [
+                                       Names/length cvx[/pop cvx]cvx/repeat cvx
+                               ]cvx bdf
+                       }{
+                               {setcolor}bdf
+                       }ifelse
+               }{
+                       exec_tint_transform
+               }ifelse
+       }ifelse
+       set_crd
+       /AliasedColorants false def
+       end
+}def
+/setindexedcolorspace
+{
+       dup/indexed_colorspace_dict exch AGMCORE_gput
+       begin
+               currentdict/CSDBase known{
+                       CSDBase/CSD get_res begin
+                       currentdict/Names known{
+                               currentdict devncs
+                       }{
+                               1 currentdict sepcs
+                       }ifelse
+                       AGMCORE_host_sep{
+                               4 dict begin
+                               /compCnt/Names where{pop Names length}{1}ifelse def
+                               /NewLookup HiVal 1 add string def
+                               0 1 HiVal{
+                                       /tableIndex xdf
+                                       Lookup dup type/stringtype eq{
+                                               compCnt tableIndex map_index
+                                       }{
+                                               exec
+                                       }ifelse
+                                       /Names where{
+                                               pop setdevicencolor
+                                       }{
+                                               setsepcolor
+                                       }ifelse
+                                       currentgray
+                                       tableIndex exch
+                                       255 mul cvi 
+                                       NewLookup 3 1 roll put
+                               }for
+                               [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt
+                               end
+                       }{
+                               level3
+                               {
+                                       currentdict/Names known{
+                                               [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt
+                                       }{
+                                               [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt
+                                       }ifelse
+                               }{
+                               [/Indexed MappedCSA HiVal
+                                       [
+                                       currentdict/Names known{
+                                               Lookup dup type/stringtype eq
+                                                       {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx}
+                                                       {/exec cvx}ifelse
+                                                       /TintTransform load/exec cvx
+                                       }{
+                                               Lookup dup type/stringtype eq
+                                                       {/exch cvx/get cvx 255/div cvx}
+                                                       {/exec cvx}ifelse
+                                                       CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx
+                                       }ifelse
+                                       ]cvx
+                               ]setcolorspace_opt
+                               }ifelse
+                       }ifelse
+                       end
+                       set_crd
+               }
+               {
+                       CSA map_csa
+                       AGMCORE_host_sep level2 not and{
+                               0 0 0 0 setcmykcolor
+                       }{
+                               [/Indexed MappedCSA 
+                               level2 not has_color not and{
+                                       dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{
+                                               pop[/DeviceGray]
+                                       }if
+                                       HiVal GrayLookup
+                               }{
+                                       HiVal 
+                                       currentdict/RangeArray known{
+                                               {
+                                                       /indexed_colorspace_dict AGMCORE_gget begin
+                                                       Lookup exch 
+                                                       dup HiVal gt{
+                                                               pop HiVal
+                                                       }if
+                                                       NComponents mul NComponents getinterval{}forall
+                                                       NComponents 1 sub -1 0{
+                                                               RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
+                                                               NComponents 1 roll
+                                                       }for
+                                                       end
+                                               }bind
+                                       }{
+                                               Lookup
+                                       }ifelse
+                               }ifelse
+                               ]setcolorspace_opt
+                               set_crd
+                       }ifelse
+               }ifelse
+       end
+}def
+/setindexedcolor
+{
+       AGMCORE_host_sep{
+               /indexed_colorspace_dict AGMCORE_gget
+               begin
+               currentdict/CSDBase known{
+                       CSDBase/CSD get_res begin
+                       currentdict/Names known{
+                               map_indexed_devn
+                               devn
+                       }
+                       {
+                               Lookup 1 3 -1 roll map_index
+                               sep
+                       }ifelse
+                       end
+               }{
+                       Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll
+                       map_index
+                       MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse
+               }ifelse
+               end
+       }{
+               level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{
+                       /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin
+                       map_indexed_devn
+                       devn
+                       end
+               }
+               {
+                       setcolor
+               }ifelse
+       }ifelse
+}def
+/ignoreimagedata
+{
+       currentoverprint not{
+               gsave
+               dup clonedict begin
+               1 setgray
+               /Decode[0 1]def
+               /DataSource<FF>def
+               /MultipleDataSources false def
+               /BitsPerComponent 8 def
+               currentdict end
+               systemdict/image gx
+               grestore
+               }if
+       consumeimagedata
+}def
+/add_res
+{
+       dup/CSD eq{
+               pop 
+               //Adobe_AGM_Core begin
+               /AGMCORE_CSD_cache load 3 1 roll put
+               end
+       }{
+               defineresource pop
+       }ifelse
+}def
+/del_res
+{
+       {
+               aload pop exch
+               dup/CSD eq{
+                       pop 
+                       {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall
+               }{
+                       exch
+                       {1 index undefineresource}forall
+                       pop
+               }ifelse
+       }forall
+}def
+/get_res
+{
+       dup/CSD eq{
+               pop
+               dup type dup/nametype eq exch/stringtype eq or{
+                       AGMCORE_CSD_cache exch get
+               }if
+       }{
+               findresource
+       }ifelse
+}def
+/get_csa_by_name
+{
+       dup type dup/nametype eq exch/stringtype eq or{
+               /CSA get_res
+       }if
+}def
+/paintproc_buf_init
+{
+       /count get 0 0 put
+}def
+/paintproc_buf_next
+{
+       dup/count get dup 0 get
+       dup 3 1 roll
+       1 add 0 xpt
+       get                             
+}def
+/cachepaintproc_compress
+{
+       5 dict begin
+       currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
+       /ppdict 20 dict def
+       /string_size 16000 def
+       /readbuffer string_size string def
+       currentglobal true setglobal 
+       ppdict 1 array dup 0 1 put/count xpt
+       setglobal
+       /LZWFilter 
+       {
+               exch
+               dup length 0 eq{
+                       pop
+               }{
+                       ppdict dup length 1 sub 3 -1 roll put
+               }ifelse
+               {string_size}{0}ifelse string
+       }/LZWEncode filter def
+       {               
+               ReadFilter readbuffer readstring
+               exch LZWFilter exch writestring
+               not{exit}if
+       }loop
+       LZWFilter closefile
+       ppdict                          
+       end
+}def
+/cachepaintproc
+{
+       2 dict begin
+       currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
+       /ppdict 20 dict def
+       currentglobal true setglobal 
+       ppdict 1 array dup 0 1 put/count xpt
+       setglobal
+       {
+               ReadFilter 16000 string readstring exch
+               ppdict dup length 1 sub 3 -1 roll put
+               not{exit}if
+       }loop
+       ppdict dup dup length 1 sub()put                                        
+       end     
+}def
+/make_pattern
+{
+       exch clonedict exch
+       dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
+       exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub
+       exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub
+       matrix translate exch matrix concatmatrix
+                        1 index begin
+               BBox 0 get XStep div cvi XStep mul/xshift exch neg def
+               BBox 1 get YStep div cvi YStep mul/yshift exch neg def
+               BBox 0 get xshift add
+               BBox 1 get yshift add
+               BBox 2 get xshift add
+               BBox 3 get yshift add
+               4 array astore
+               /BBox exch def
+               [xshift yshift/translate load null/exec load]dup
+               3/PaintProc load put cvx/PaintProc exch def
+               end
+       gsave 0 setgray
+       makepattern
+       grestore
+}def
+/set_pattern
+{
+       dup/PatternType get 1 eq{
+               dup/PaintType get 1 eq{
+                       currentoverprint sop[/DeviceGray]setcolorspace 0 setgray
+               }if
+       }if
+       setpattern
+}def
+/setcolorspace_opt
+{
+       dup currentcolorspace eq{pop}{setcolorspace}ifelse
+}def
+/updatecolorrendering
+{
+       currentcolorrendering/RenderingIntent known{
+               currentcolorrendering/RenderingIntent get
+       }
+       {
+               Intent/AbsoluteColorimetric eq 
+               {
+                       /absolute_colorimetric_crd AGMCORE_gget dup null eq
+               }
+               {
+                       Intent/RelativeColorimetric eq
+                       {
+                               /relative_colorimetric_crd AGMCORE_gget dup null eq
+                       }
+                       {
+                               Intent/Saturation eq
+                               {
+                                       /saturation_crd AGMCORE_gget dup null eq
+                               }
+                               {
+                                       /perceptual_crd AGMCORE_gget dup null eq
+                               }ifelse
+                       }ifelse
+               }ifelse
+               {
+                       pop null        
+               }
+               {
+                       /RenderingIntent known{null}{Intent}ifelse
+               }ifelse
+       }ifelse
+       Intent ne{
+               Intent/ColorRendering{findresource}stopped
+               {
+                       pop pop systemdict/findcolorrendering known
+                       {
+                               Intent findcolorrendering
+                               {
+                                       /ColorRendering findresource true exch
+                               }
+                               {
+                                       /ColorRendering findresource
+                                       product(Xerox Phaser 5400)ne
+                                       exch
+                               }ifelse
+                               dup Intent/AbsoluteColorimetric eq 
+                               {
+                                       /absolute_colorimetric_crd exch AGMCORE_gput
+                               }
+                               {
+                                       Intent/RelativeColorimetric eq
+                                       {
+                                               /relative_colorimetric_crd exch AGMCORE_gput
+                                       }
+                                       {
+                                               Intent/Saturation eq
+                                               {
+                                                       /saturation_crd exch AGMCORE_gput
+                                               }
+                                               {
+                                                       Intent/Perceptual eq
+                                                       {
+                                                               /perceptual_crd exch AGMCORE_gput
+                                                       }
+                                                       {
+                                                               pop
+                                                       }ifelse
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                               1 index{exch}{pop}ifelse
+                       }
+                       {false}ifelse
+               }
+               {true}ifelse
+               {
+                       dup begin
+                       currentdict/TransformPQR known{
+                               currentdict/TransformPQR get aload pop
+                               3{{}eq 3 1 roll}repeat or or
+                       }
+                       {true}ifelse
+                       currentdict/MatrixPQR known{
+                               currentdict/MatrixPQR get aload pop
+                               1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll
+                               0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll
+                               0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq
+                               and and and and and and and and
+                       }
+                       {true}ifelse
+                       end
+                       or
+                       {
+                               clonedict begin
+                               /TransformPQR[
+                                       {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div
+                                       3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind
+                                       {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div
+                                       3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind
+                                       {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div
+                                       3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind
+                               ]def
+                               /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def
+                               /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def
+                               currentdict end
+                       }if
+                       setcolorrendering_opt
+               }if             
+       }if
+}def
+/set_crd
+{
+       AGMCORE_host_sep not level2 and{
+               currentdict/ColorRendering known{
+                       ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if
+               }{
+                       currentdict/Intent known{
+                               updatecolorrendering
+                       }if
+               }ifelse
+               currentcolorspace dup type/arraytype eq
+                       {0 get}if
+               /DeviceRGB eq
+                       {
+                       currentdict/UCR known
+                               {/UCR}{/AGMCORE_currentucr}ifelse
+                       load setundercolorremoval
+                       currentdict/BG known 
+                               {/BG}{/AGMCORE_currentbg}ifelse
+                       load setblackgeneration
+                       }if
+       }if
+}def
+/set_ucrbg
+{
+       dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration
+       dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval
+}def
+/setcolorrendering_opt
+{
+       dup currentcolorrendering eq{
+               pop
+       }{
+               product(HP Color LaserJet 2605)anchorsearch{
+                       pop pop pop
+               }{
+                       pop
+                       clonedict
+                       begin
+                               /Intent Intent def
+                               currentdict
+                       end
+                       setcolorrendering
+               }ifelse
+       }ifelse
+}def
+/cpaint_gcomp
+{
+       convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
+       //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
+       {
+               (%end_cpaint_gcomp)flushinput
+       }if
+}def
+/cpaint_gsep
+{
+       //Adobe_AGM_Core/AGMCORE_ConvertToProcess get
+       {       
+               (%end_cpaint_gsep)flushinput
+       }if
+}def
+/cpaint_gend
+{np}def
+/T1_path
+{
+       currentfile token pop currentfile token pop mo
+       {
+               currentfile token pop dup type/stringtype eq
+                       {pop exit}if 
+               0 exch rlineto 
+               currentfile token pop dup type/stringtype eq
+                       {pop exit}if 
+               0 rlineto
+       }loop
+}def
+/T1_gsave
+       level3
+       {/clipsave}
+       {/gsave}ifelse
+       load def
+/T1_grestore
+       level3
+       {/cliprestore}
+       {/grestore}ifelse 
+       load def
+/set_spot_alias_ary
+{
+       dup inherit_aliases
+       //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
+}def
+/set_spot_normalization_ary
+{
+       dup inherit_aliases
+       dup length
+       /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if
+       array
+       //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf
+       /AGMCORE_SpotAliasAry where{
+               pop
+               AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval
+               AGMCORE_SpotAliasAry length
+       }{0}ifelse
+       AGMCORE_SpotAliasAry2 3 1 roll exch putinterval
+       true set_spot_alias
+}def
+/inherit_aliases
+{
+       {dup/Name get map_alias{/CSD put}{pop}ifelse}forall
+}def
+/set_spot_alias
+{
+       /AGMCORE_SpotAliasAry2 where{
+               /AGMCORE_current_spot_alias 3 -1 roll put
+       }{
+               pop
+       }ifelse
+}def
+/current_spot_alias
+{
+       /AGMCORE_SpotAliasAry2 where{
+               /AGMCORE_current_spot_alias get
+       }{
+               false
+       }ifelse
+}def
+/map_alias
+{
+       /AGMCORE_SpotAliasAry2 where{
+               begin
+                       /AGMCORE_name xdf
+                       false   
+                       AGMCORE_SpotAliasAry2{
+                               dup/Name get AGMCORE_name eq{
+                                       /CSD get/CSD get_res
+                                       exch pop true
+                                       exit
+                               }{
+                                       pop
+                               }ifelse
+                       }forall
+               end
+       }{
+               pop false
+       }ifelse
+}bdf
+/spot_alias
+{
+       true set_spot_alias
+       /AGMCORE_&setcustomcolor AGMCORE_key_known not{
+               //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put
+       }if
+       /customcolor_tint 1 AGMCORE_gput
+       //Adobe_AGM_Core begin
+       /setcustomcolor
+       {
+               //Adobe_AGM_Core begin
+               dup/customcolor_tint exch AGMCORE_gput
+               1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not
+               current_spot_alias and{1 index 4 get map_alias}{false}ifelse
+               {
+                       false set_spot_alias
+                       /sep_colorspace_dict AGMCORE_gget null ne
+                       {/sep_colorspace_dict AGMCORE_gget/ForeignContent known not}{false}ifelse
+                       3 1 roll 2 index{
+                               exch pop/sep_tint AGMCORE_gget exch
+                       }if
+                       mark 3 1 roll
+                       setsepcolorspace
+                       counttomark 0 ne{
+                               setsepcolor
+                       }if
+                       pop
+                       not{/sep_tint 1.0 AGMCORE_gput/sep_colorspace_dict AGMCORE_gget/ForeignContent true put}if
+                       pop
+                       true set_spot_alias
+               }{
+                       AGMCORE_&setcustomcolor
+               }ifelse
+               end
+       }bdf
+       end
+}def
+/begin_feature
+{
+       Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
+       count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
+       {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
+}def
+/end_feature
+{
+       2 dict begin
+       /spd/setpagedevice load def
+       /setpagedevice{get_gstate spd set_gstate}def
+       stopped{$error/newerror false put}if
+       end
+       count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
+       countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
+       {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
+}def
+/set_negative
+{
+       //Adobe_AGM_Core begin
+       /AGMCORE_inverting exch def
+       level2{
+               currentpagedevice/NegativePrint known AGMCORE_distilling not and{
+                       currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{
+                               true begin_feature true{
+                                               <</NegativePrint//Adobe_AGM_Core/AGMCORE_inverting get>>setpagedevice
+                               }end_feature
+                       }if
+                       /AGMCORE_inverting false def
+               }if
+       }if
+       AGMCORE_inverting{
+               [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
+               AGMCORE_distilling{
+                       erasepage
+               }{
+                       gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse
+                       /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore
+               }ifelse
+       }if
+       end
+}def
+/lw_save_restore_override{
+       /md where{
+               pop
+               md begin
+               initializepage
+               /initializepage{}def
+               /pmSVsetup{}def
+               /endp{}def
+               /pse{}def
+               /psb{}def
+               /orig_showpage where
+                       {pop}
+                       {/orig_showpage/showpage load def}
+               ifelse
+               /showpage{orig_showpage gR}def
+               end
+       }if
+}def
+/pscript_showpage_override{
+       /NTPSOct95 where
+       {
+               begin
+               showpage
+               save
+               /showpage/restore load def
+               /restore{exch pop}def
+               end
+       }if
+}def
+/driver_media_override
+{
+       /md where{
+               pop
+               md/initializepage known{
+                       md/initializepage{}put
+               }if
+               md/rC known{
+                       md/rC{4{pop}repeat}put
+               }if
+       }if
+       /mysetup where{
+               /mysetup[1 0 0 1 0 0]put
+       }if
+       Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put
+       level2
+               {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if
+}def
+/capture_mysetup
+{
+       /Pscript_Win_Data where{
+               pop
+               Pscript_Win_Data/mysetup known{
+                       Adobe_AGM_Core/save_mysetup Pscript_Win_Data/mysetup get put
+               }if
+       }if
+}def
+/restore_mysetup
+{
+       /Pscript_Win_Data where{
+               pop
+               Pscript_Win_Data/mysetup known{
+                       Adobe_AGM_Core/save_mysetup known{
+                               Pscript_Win_Data/mysetup Adobe_AGM_Core/save_mysetup get put
+                               Adobe_AGM_Core/save_mysetup undef
+                       }if
+               }if
+       }if
+}def
+/driver_check_media_override
+{
+       /PrepsDict where
+               {pop}
+               {
+               Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne
+               Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq
+                       {
+                       Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and
+                       Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and
+                       }if
+                       {
+                       Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix
+                       }if
+               }ifelse
+}def
+AGMCORE_err_strings begin
+       /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def
+       /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def
+       /AGMCORE_invalid_color_space(This job contains an invalid color space. )def
+end
+/set_def_ht
+{AGMCORE_def_ht sethalftone}def
+/set_def_flat
+{AGMCORE_Default_flatness setflat}def
+end
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Core 2.31 0\r%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved.\r%%Version: 2.31 0\r10 dict begin\r/Adobe_CoolType_Passthru currentdict def\r/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def\rAdobe_CoolType_Core_Defined\r        {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def}\rif\ruserdict/Adobe_CoolType_Core 70 dict dup begin put\r/Adobe_CoolType_Version 2.31 def\r/Level2?\r    systemdict/languagelevel known dup\r             {pop systemdict/languagelevel get 2 ge}\r        if def\rLevel2? not\r     {\r      /currentglobal false def\r       /setglobal/pop load def\r        /gcheck{pop false}bind def\r     /currentpacking false def\r      /setpacking/pop load def\r       /SharedFontDirectory 0 dict def\r        }\rif\rcurrentpacking\rtrue setpacking\rcurrentglobal false setglobal\ruserdict/Adobe_CoolType_Data 2 copy known not\r        {2 copy 10 dict put}\rif\rget\r     begin\r /@opStackCountByLevel 32 dict def\r      /@opStackLevel 0 def\r   /@dictStackCountByLevel 32 dict def\r    /@dictStackLevel 0 def\r  end\rsetglobal\rcurrentglobal true setglobal\ruserdict/Adobe_CoolType_GVMFonts known not\r {userdict/Adobe_CoolType_GVMFonts 10 dict put}\rif\rsetglobal\rcurrentglobal false setglobal\ruserdict/Adobe_CoolType_LVMFonts known not\r   {userdict/Adobe_CoolType_LVMFonts 10 dict put}\rif\rsetglobal\r/ct_VMDictPut\r      {\r      dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse\r     3 1 roll put\r   }bind def\r/ct_VMDictUndef\r      {\r      dup Adobe_CoolType_GVMFonts exch known\r         {Adobe_CoolType_GVMFonts exch undef}\r           {\r                      dup Adobe_CoolType_LVMFonts exch known\r                 {Adobe_CoolType_LVMFonts exch undef}\r                   {pop}\r                  ifelse\r         }ifelse\r        }bind def\r/ct_str1 1 string def\r/ct_xshow\r{\r    /_ct_na exch def\r       /_ct_i 0 def\r   currentpoint\r   /_ct_y exch def\r        /_ct_x exch def\r        {\r              pop pop\r                ct_str1 exch 0 exch put\r                ct_str1 show\r           {_ct_na _ct_i get}stopped \r             {pop pop}\r              {\r                      _ct_x _ct_y moveto\r                     0\r                      rmoveto\r                }\r              ifelse\r         /_ct_i _ct_i 1 add def\r         currentpoint\r           /_ct_y exch def\r                /_ct_x exch def\r        }\r      exch\r   @cshow\r}bind def\r/ct_yshow\r{\r   /_ct_na exch def\r       /_ct_i 0 def\r   currentpoint\r   /_ct_y exch def\r        /_ct_x exch def\r        {\r              pop pop\r                ct_str1 exch 0 exch put\r                ct_str1 show\r           {_ct_na _ct_i get}stopped \r             {pop pop}\r              {\r                      _ct_x _ct_y moveto\r                     0 exch\r                 rmoveto\r                }\r              ifelse\r         /_ct_i _ct_i 1 add def\r         currentpoint\r           /_ct_y exch def\r                /_ct_x exch def\r        }\r      exch\r   @cshow\r}bind def\r/ct_xyshow\r{\r  /_ct_na exch def\r       /_ct_i 0 def\r   currentpoint\r   /_ct_y exch def\r        /_ct_x exch def\r        {\r              pop pop\r                ct_str1 exch 0 exch put\r                ct_str1 show\r           {_ct_na _ct_i get}stopped \r             {pop pop}\r              {\r                      {_ct_na _ct_i 1 add get}stopped \r                       {pop pop pop}\r                  {\r                              _ct_x _ct_y moveto\r                             rmoveto\r                        }\r                      ifelse\r         }\r              ifelse\r         /_ct_i _ct_i 2 add def\r         currentpoint\r           /_ct_y exch def\r                /_ct_x exch def\r        }\r      exch\r   @cshow\r}bind def\r/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def\r/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def\r/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def\rcurrentglobal true setglobal\r/ct_T3Defs\r{\r/BuildChar\r{\r     1 index/Encoding get exch get\r  1 index/BuildGlyph get exec\r}bind def\r/BuildGlyph\r{\r    exch begin\r     GlyphProcs exch get exec\r       end\r}bind def\r}bind def\rsetglobal\r/@_SaveStackLevels\r   {\r      Adobe_CoolType_Data\r            begin\r          /@vmState currentglobal def false setglobal\r            @opStackCountByLevel\r           @opStackLevel\r          2 copy known not\r                       {\r                      2 copy\r                 3 dict dup/args\r                        7 index\r                        5 add array put\r                        put get\r                        }\r                      {\r                      get dup/args get dup length 3 index lt\r                         {\r                              dup length 5 add array exch\r                            1 index exch 0 exch putinterval\r                                1 index exch/args exch put\r                             }\r                              {pop}\r                  ifelse\r                 }\r              ifelse\r                 begin\r                  count 1 sub\r                    1 index lt\r                             {pop count}\r                    if\r                     dup/argCount exch def\r                  dup 0 gt\r                               {\r                              args exch 0 exch getinterval \r                  astore pop\r                             }\r                              {pop}\r                  ifelse\r                 count\r                  /restCount exch def\r                    end\r            /@opStackLevel @opStackLevel 1 add def\r         countdictstack 1 sub\r           @dictStackCountByLevel exch @dictStackLevel exch put\r           /@dictStackLevel @dictStackLevel 1 add def\r             @vmState setglobal\r             end\r    }bind def\r/@_RestoreStackLevels\r        {\r      Adobe_CoolType_Data\r            begin\r          /@opStackLevel @opStackLevel 1 sub def\r         @opStackCountByLevel @opStackLevel get\r                 begin\r                  count restCount sub dup 0 gt\r                           {{pop}repeat}\r                          {pop}\r                  ifelse\r                 args 0 argCount getinterval{}forall\r                    end\r            /@dictStackLevel @dictStackLevel 1 sub def\r             @dictStackCountByLevel @dictStackLevel get\r             end\r    countdictstack exch sub dup 0 gt\r               {{end}repeat}\r          {pop}\r  ifelse\r }bind def\r/@_PopStackLevels\r    {\r      Adobe_CoolType_Data\r            begin\r          /@opStackLevel @opStackLevel 1 sub def\r         /@dictStackLevel @dictStackLevel 1 sub def\r             end\r    }bind def\r/@Raise\r      {\r      exch cvx exch errordict exch get exec\r  stop\r   }bind def\r/@ReRaise\r    {\r      cvx $error/errorname get errordict exch get exec\r       stop\r   }bind def\r/@Stopped\r    {\r      0 @#Stopped\r    }bind def\r/@#Stopped\r   {\r      @_SaveStackLevels\r      stopped\r                {@_RestoreStackLevels true}\r            {@_PopStackLevels false}\r       ifelse\r }bind def\r/@Arg\r        {\r      Adobe_CoolType_Data\r            begin\r          @opStackCountByLevel @opStackLevel 1 sub get\r           begin\r          args exch\r              argCount 1 sub exch sub get\r            end\r            end\r    }bind def\rcurrentglobal true setglobal\r/CTHasResourceForAllBug\r Level2?\r                {\r              1 dict dup\r                             /@shouldNotDisappearDictValue true def\r                         Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put\r                              begin\r                          count @_SaveStackLevels\r                                        {(*){pop stop}128 string/Category resourceforall}\r                              stopped pop\r                            @_RestoreStackLevels\r                           currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll\r                                       {\r                                               /@shouldNotDisappearDictValue known\r                                                           {\r                                                                               {\r                                                                                             end\r                                                                                            currentdict 1 index eq\r                                                                                                 {pop exit}\r                                                                                             if\r                                                                              }\r                                                                      loop\r                                                          }\r                                               if\r                                    }\r                                      {\r                                               pop\r                                            end\r                                   }\r                              ifelse\r         }\r              {false}\r        ifelse\r def\rtrue setglobal\r/CTHasResourceStatusBug\r     Level2?\r                {\r              mark\r                   {/steveamerige/Category resourcestatus}\r                stopped\r                        {cleartomark true}\r                     {cleartomark currentglobal not}\r                ifelse\r         }\r              {false}\r        ifelse\r def\rsetglobal\r/CTResourceStatus\r                {\r              mark 3 1 roll\r          /Category findresource\r                 begin\r                  ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec\r                             {cleartomark false}\r                            {{3 2 roll pop true}{cleartomark false}ifelse}\r                 ifelse\r                 end\r            }bind def\r/CTWorkAroundBugs\r    {\r      Level2?\r                {\r              /cid_PreLoad/ProcSet resourcestatus\r                    {\r                      pop pop\r                        currentglobal\r                  mark\r                           {\r                              (*)\r                                    {\r                                      dup/CMap CTHasResourceStatusBug\r                                                {CTResourceStatus}\r                                             {resourcestatus}\r                                       ifelse\r                                         {\r                                              pop dup 0 eq exch 1 eq or\r                                                      {\r                                                      dup/CMap findresource gcheck setglobal\r                                                 /CMap undefineresource\r                                                 }\r                                                      {\r                                                      pop CTHasResourceForAllBug\r                                                             {exit}\r                                                         {stop}\r                                                 ifelse\r                                                 }\r                                              ifelse\r                                         }\r                                              {pop}\r                                  ifelse\r                                 }\r                              128 string/CMap resourceforall\r                         }\r                      stopped\r                                {cleartomark}\r                  stopped pop\r                    setglobal\r                      }\r              if\r             }\r      if\r     }bind def\r/ds\r  {\r      Adobe_CoolType_Core\r            begin\r          CTWorkAroundBugs\r               /mo/moveto load def\r            /nf/newencodedfont load def\r            /msf{makefont setfont}bind def\r         /uf{dup undefinefont ct_VMDictUndef}bind def\r           /ur/undefineresource load def\r          /chp/charpath load def\r         /awsh/awidthshow load def\r              /wsh/widthshow load def\r                /ash/ashow load def\r            /@xshow/xshow load def\r         /@yshow/yshow load def\r         /@xyshow/xyshow load def\r               /@cshow/cshow load def\r         /sh/show load def\r              /rp/repeat load def\r            /.n/.notdef def\r                end\r            currentglobal false setglobal\r   userdict/Adobe_CoolType_Data 2 copy known not\r          {2 copy 10 dict put}\r          if\r             get\r            begin\r          /AddWidths? false def\r          /CC 0 def\r              /charcode 2 string def\r         /@opStackCountByLevel 32 dict def\r              /@opStackLevel 0 def\r           /@dictStackCountByLevel 32 dict def\r            /@dictStackLevel 0 def\r         /InVMFontsByCMap 10 dict def\r           /InVMDeepCopiedFonts 10 dict def\r               end\r            setglobal\r      }bind def\r/dt\r  {\r      currentdict Adobe_CoolType_Core eq\r             {end}\r  if\r     }bind def\r/ps\r  {\r      Adobe_CoolType_Core begin\r      Adobe_CoolType_GVMFonts begin\r  Adobe_CoolType_LVMFonts begin\r  SharedFontDirectory begin\r      }bind def\r/pt\r  {\r      end\r    end\r    end\r    end\r    }bind def\r/unload\r      {\r      systemdict/languagelevel known\r         {\r              systemdict/languagelevel get 2 ge\r                      {\r                      userdict/Adobe_CoolType_Core 2 copy known\r                              {undef}\r                                {pop pop}\r                      ifelse\r                 }\r              if\r             }\r      if\r     }bind def\r/ndf\r {\r      1 index where\r          {pop pop pop}\r          {dup xcheck{bind}if def}\r       ifelse\r }def\r/findfont systemdict\r      begin\r  userdict\r               begin\r          /globaldict where{/globaldict get begin}if\r                     dup where pop exch get\r         /globaldict where{pop end}if\r           end\r    end\rAdobe_CoolType_Core_Defined\r        {/systemfindfont exch def}\r     {\r      /findfont 1 index def\r  /systemfindfont exch def\r       }\rifelse\r/undefinefont\r {pop}ndf\r/copyfont\r     {\r      currentglobal 3 1 roll\r 1 index gcheck setglobal\r       dup null eq{0}{dup length}ifelse\r       2 index length add 1 add dict\r          begin\r          exch\r                   {\r                      1 index/FID eq\r                         {pop pop}\r                              {def}\r                  ifelse\r                 }\r              forall\r         dup null eq\r                    {pop}\r                  {{def}forall}\r          ifelse\r         currentdict\r            end\r    exch setglobal\r }bind def\r/copyarray\r   {\r      currentglobal exch\r     dup gcheck setglobal\r   dup length array copy\r  exch setglobal\r }bind def\r/newencodedfont\r      {\r      currentglobal\r          {\r              SharedFontDirectory 3 index known\r                      {SharedFontDirectory 3 index get/FontReferenced known}\r                 {false}\r                ifelse\r         }\r              {\r              FontDirectory 3 index known\r                    {FontDirectory 3 index get/FontReferenced known}\r                       {\r                      SharedFontDirectory 3 index known\r                              {SharedFontDirectory 3 index get/FontReferenced known}\r                         {false}\r                        ifelse\r                 }\r              ifelse\r         }\r      ifelse\r dup\r            {\r              3 index findfont/FontReferenced get\r            2 index dup type/nametype eq\r                   {findfont}\r             if ne\r                  {pop false}\r            if\r             }\r      if\r     dup\r            {\r              1 index dup type/nametype eq\r                   {findfont}\r              if\r            dup/CharStrings known\r                  {\r                      /CharStrings get length\r                        4 index findfont/CharStrings get length\r                        ne\r                             {\r                              pop false\r                              }\r                      if \r                    }\r                      {pop}\r                  ifelse\r         }\r      if\r             {\r              pop\r            1 index findfont\r               /Encoding get exch\r             0 1 255\r                        {2 copy get 3 index 3 1 roll put}\r              for\r            pop pop pop\r            }\r              {\r              currentglobal\r   4 1 roll\r              dup type/nametype eq\r            {findfont}\r     if\r     dup gcheck setglobal\r          dup dup maxlength 2 add dict\r                   begin\r                  exch\r                           {\r                              1 index/FID ne\r                         2 index/Encoding ne and\r                                        {def}\r                                  {pop pop}\r                              ifelse\r                         }\r                      forall\r                 /FontReferenced exch def\r                       /Encoding exch dup length array copy def\r                       /FontName 1 index dup type/stringtype eq{cvn}if def dup\r                        currentdict\r                    end\r            definefont ct_VMDictPut\r                setglobal\r              }\r      ifelse\r }bind def\r/SetSubstituteStrategy\r       {\r      $SubstituteFont\r                begin\r          dup type/dicttype ne\r                   {0 dict}\r               if\r             currentdict/$Strategies known\r                  {\r                      exch $Strategies exch \r                 2 copy known\r                           {\r                              get\r                            2 copy maxlength exch maxlength add dict\r                                       begin\r                                  {def}forall\r                                    {def}forall\r                                    currentdict\r                                    dup/$Init known\r                                                {dup/$Init get exec}\r                                   if\r                                     end\r                            /$Strategy exch def\r                            }\r                              {pop pop pop}\r                  ifelse\r                 }\r                      {pop pop}\r              ifelse\r         end\r    }bind def\r/scff\r        {\r      $SubstituteFont\r                begin\r          dup type/stringtype eq\r                 {dup length exch}\r                      {null}\r         ifelse\r         /$sname exch def\r               /$slen exch def\r                /$inVMIndex\r                    $sname null eq\r                         {\r                              1 index $str cvs\r                               dup length $slen sub $slen getinterval cvn\r                             }\r                              {$sname}\r                       ifelse def\r             end\r            {findfont}\r     @Stopped\r               {\r              dup length 8 add string exch\r           1 index 0(BadFont:)putinterval\r         1 index exch 8 exch dup length string cvs putinterval cvn\r                      {findfont}\r             @Stopped\r                       {pop/Courier findfont}\r         if\r             }\r      if\r     $SubstituteFont\r                begin\r          /$sname null def\r               /$slen 0 def\r           /$inVMIndex null def\r           end\r    }bind def\r/isWidthsOnlyFont\r    {\r      dup/WidthsOnly known\r           {pop pop true}\r         {\r              dup/FDepVector known\r                   {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}\r                  {\r                      dup/FDArray known\r                              {/FDArray get{isWidthsOnlyFont dup{exit}if}forall}\r                             {pop}\r                  ifelse\r                 }\r              ifelse\r         }\r      ifelse\r }bind def\r/ct_StyleDicts 4 dict dup begin\r               /Adobe-Japan1 4 dict dup begin\r                                         Level2?\r                                                               {\r                                                              /Serif\r                                                         /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus\r                                                          {pop pop/HeiseiMin-W3}\r                                                         {\r                                                      /CIDFont/Category resourcestatus\r                                                       {\r                                                              pop pop\r                                                                /HeiseiMin-W3/CIDFont resourcestatus\r                                                           {pop pop/HeiseiMin-W3}\r                                                         {/Ryumin-Light}\r                                                                ifelse\r                                                 }\r                                                      {/Ryumin-Light}\r                                                        ifelse\r                                                         }\r                                                              ifelse\r                                                         def\r                                                            /SansSerif\r                                                             /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus\r                                                               {pop pop/HeiseiKakuGo-W5}\r                                                              {\r                                                      /CIDFont/Category resourcestatus\r                                                       {\r                                                              pop pop\r                                                                /HeiseiKakuGo-W5/CIDFont resourcestatus\r                                                                {pop pop/HeiseiKakuGo-W5}\r                                                              {/GothicBBB-Medium}\r                                                            ifelse\r                                                 }\r                                                      {/GothicBBB-Medium}\r                                                    ifelse\r                                                         }\r                                                              ifelse\r                                                         def\r                                                            /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus\r                                                               {pop pop/HeiseiMaruGo-W4}\r                                                              {\r                                                      /CIDFont/Category resourcestatus\r                                                       {\r                                                              pop pop\r                                                                /HeiseiMaruGo-W4/CIDFont resourcestatus\r                                                                {pop pop/HeiseiMaruGo-W4}\r                                                              {\r                                                                      /Jun101-Light-RKSJ-H/Font resourcestatus\r                                                                       {pop pop/Jun101-Light}\r                                                                 {SansSerif}\r                                                                    ifelse\r                                                         }\r                                                              ifelse\r                                                 }\r                                                      {\r                                                              /Jun101-Light-RKSJ-H/Font resourcestatus\r                                                               {pop pop/Jun101-Light}\r                                                         {SansSerif}\r                                                            ifelse\r                                                 }\r                                                      ifelse\r                                                         }\r                                                              ifelse\r                                                         /RoundSansSerif exch def\r                                                               /Default Serif def\r                                                             }\r                                                              {\r                                                              /Serif/Ryumin-Light def\r                                                                /SansSerif/GothicBBB-Medium def\r                                                                {\r                                                              (fonts/Jun101-Light-83pv-RKSJ-H)status\r                                                         }stopped\r                                                               {pop}{\r                                                                          {pop pop pop pop/Jun101-Light}\r                                                                                 {SansSerif}\r                                                                            ifelse\r                                                                                 /RoundSansSerif exch def\r                                                              }ifelse\r                                                                /Default Serif def\r                                                             }\r                                       ifelse\r                 end\r            def\r            /Adobe-Korea1 4 dict dup begin\r                                        /Serif/HYSMyeongJo-Medium def\r                                  /SansSerif/HYGoThic-Medium def\r                                 /RoundSansSerif SansSerif def\r                                  /Default Serif def\r              end\r            def\r            /Adobe-GB1 4 dict dup begin\r                                   /Serif/STSong-Light def\r                                        /SansSerif/STHeiti-Regular def\r                                 /RoundSansSerif SansSerif def\r                                  /Default Serif def\r              end\r            def\r            /Adobe-CNS1 4 dict dup begin\r                                  /Serif/MKai-Medium def\r                                 /SansSerif/MHei-Medium def\r                                     /RoundSansSerif SansSerif def\r                                  /Default Serif def\r              end\r            def\rend\rdef\rLevel2?{currentglobal true setglobal}if\r/ct_BoldRomanWidthProc \r   {\r      stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth\r     0 0\r    }bind def\r/ct_Type0WidthProc \r  {\r       dup stringwidth 0 0 moveto \r    2 index true charpath pathbbox\r         0 -1 \r  7 index 2 div .88 \r     setcachedevice2\r        pop\r   0 0\r    }bind def\r/ct_Type0WMode1WidthProc \r    {\r       dup stringwidth \r       pop 2 div neg -0.88\r   2 copy\r moveto \r        0 -1\r    5 -1 roll true charpath pathbbox\r       setcachedevice\r        }bind def\r/cHexEncoding\r[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12\r/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25\r/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38\r/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B\r/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E\r/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71\r/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84\r/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97\r/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA\r/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD\r/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0\r/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3\r/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6\r/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def\r/ct_BoldBaseFont \r    11 dict begin\r         /FontType 3 def\r                /FontMatrix[1 0 0 1 0 0]def\r            /FontBBox[0 0 1 1]def\r          /Encoding cHexEncoding def \r            /_setwidthProc/ct_BoldRomanWidthProc load def\r          /_bcstr1 1 string def\r          /BuildChar\r             {\r                      exch begin\r                             _basefont setfont\r                              _bcstr1 dup 0 4 -1 roll put\r                            dup \r                           _setwidthProc\r                          3 copy \r                                moveto                          \r                               show\r                           _basefonto setfont\r                             moveto\r                         show\r                   end\r            }bind def\r               currentdict\r    end \rdef\rsystemdict/composefont known\r{\r/ct_DefineIdentity-H\r{\r        /Identity-H/CMap resourcestatus\r        {\r              pop pop\r        }\r      {\r              /CIDInit/ProcSet findresource begin\r             12 dict begin\r          begincmap\r              /CIDSystemInfo 3 dict dup begin\r                        /Registry(Adobe)def\r                    /Ordering(Identity)def\r                         /Supplement 0 def\r              end def\r                /CMapName/Identity-H def\r               /CMapVersion 1.000 def\r                 /CMapType 1 def\r                1 begincodespacerange\r          <0000><FFFF>\r           endcodespacerange\r              1 begincidrange\r                <0000><FFFF>0\r          endcidrange\r            endcmap\r                CMapName currentdict/CMap defineresource pop\r           end\r            end\r    }\r      ifelse\r}\rdef\r/ct_BoldBaseCIDFont \r      11 dict begin\r         /CIDFontType 1 def\r             /CIDFontName/ct_BoldBaseCIDFont def\r            /FontMatrix[1 0 0 1 0 0]def\r            /FontBBox[0 0 1 1]def\r          /_setwidthProc/ct_Type0WidthProc load def\r              /_bcstr2 2 string def\r          /BuildGlyph\r            {\r                      exch begin               \r                              _basefont setfont\r                              _bcstr2 1 2 index 256 mod put\r                          _bcstr2 0 3 -1 roll 256 idiv put\r                               _bcstr2 dup _setwidthProc                \r                              3 copy \r                                moveto\r                         show\r                           _basefonto setfont\r                             moveto\r                         show\r                   end\r            }bind def\r               currentdict\r    end \rdef\r}if\rLevel2?{setglobal}if\r/ct_CopyFont{\r       {\r              1 index/FID ne 2 index/UniqueID ne and\r         {def}{pop pop}ifelse\r   }forall\r}bind def\r/ct_Type0CopyFont \r{\r exch\r   dup length dict\r        begin\r  ct_CopyFont\r    [\r      exch\r   FDepVector \r    {\r               dup/FontType get 0 eq\r         {       \r               1 index ct_Type0CopyFont \r              /_ctType0 exch definefont\r              }\r              {\r              /_ctBaseFont exch\r              2 index exec\r           }\r               ifelse \r                exch\r  }\r      forall \r        pop\r    ]                               \r       /FDepVector exch def\r   currentdict\r    end\r}bind def\r/ct_MakeBoldFont\r{\r        dup/ct_SyntheticBold known\r    {\r              dup length 3 add dict begin \r           ct_CopyFont \r           /ct_StrokeWidth .03 0 FontMatrix idtransform pop def \r          /ct_SyntheticBold true def\r             currentdict \r           end \r           definefont\r     }\r      {\r              dup dup length 3 add dict\r              begin\r                  ct_CopyFont\r                    /PaintType 2 def\r                       /StrokeWidth .03 0 FontMatrix idtransform pop def\r                      /dummybold currentdict\r         end\r            definefont\r             dup/FontType get dup 9 ge exch 11 le and \r              {\r                      ct_BoldBaseCIDFont\r                     dup length 3 add dict copy begin\r                       dup/CIDSystemInfo get/CIDSystemInfo exch def\r                   ct_DefineIdentity-H\r                    /_Type0Identity/Identity-H 3 -1 roll[exch]composefont\r                  /_basefont exch def\r                    /_Type0Identity/Identity-H 3 -1 roll[exch]composefont\r                  /_basefonto exch def\r                   currentdict\r                    end\r                    /CIDFont defineresource\r                }\r              {\r                      ct_BoldBaseFont\r                        dup length 3 add dict copy begin\r                       /_basefont exch def\r                    /_basefonto exch def\r                   currentdict\r                    end\r                    definefont\r             }\r              ifelse\r }\r      ifelse\r}bind def\r/ct_MakeBold{\r 1 index \r       1 index\r        findfont\r       currentglobal 5 1 roll\r dup gcheck setglobal\r           dup\r             /FontType get 0 eq\r                    {\r                              dup/WMode known{dup/WMode get 1 eq}{false}ifelse\r                               version length 4 ge\r                            and\r                                    {version 0 4 getinterval cvi 2015 ge}\r                                  {true}\r                         ifelse \r                                        {/ct_Type0WidthProc}\r                                   {/ct_Type0WMode1WidthProc}\r                             ifelse\r                         ct_BoldBaseFont/_setwidthProc 3 -1 roll load put\r                                               {ct_MakeBoldFont}ct_Type0CopyFont definefont\r                   }\r                      {\r                              dup/_fauxfont known not 1 index/SubstMaster known not and\r                              {\r                                       ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put\r                                  ct_MakeBoldFont \r                              }\r                              {\r                              2 index 2 index eq\r                                     {exch pop       }\r                                      {\r                                              dup length dict begin\r                                          ct_CopyFont\r                                            currentdict\r                                            end\r                                            definefont \r                                    }\r                              ifelse\r                         }\r                      ifelse\r                 }\r               ifelse\r                 pop pop pop\r            setglobal\r}bind def\r/?str1 256 string def\r/?set\r       {\r      $SubstituteFont\r                begin\r          /$substituteFound false def\r            /$fontname 1 index def\r         /$doSmartSub false def\r         end\r    dup\r     findfont\r      $SubstituteFont\r                begin\r          $substituteFound\r                       {false}\r                        {\r                      dup/FontName known\r                             {\r                              dup/FontName get $fontname eq\r                          1 index/DistillerFauxFont known not and\r                                /currentdistillerparams where\r                                  {pop false 2 index isWidthsOnlyFont not and}\r                           if\r                             }\r                              {false}\r                        ifelse\r                 }\r              ifelse\r         exch pop\r               /$doSmartSub true def\r          end\r            {\r              5 1 roll pop pop pop pop\r               findfont\r               }\r              {\r              1 index\r                findfont\r               dup/FontType get 3 eq\r          {\r                      6 1 roll pop pop pop pop pop false\r             }\r              {pop true}\r             ifelse\r         {\r              $SubstituteFont\r                begin\r          pop pop\r                /$styleArray 1 index def\r               /$regOrdering 2 index def\r              pop pop\r                0 1 $styleArray length 1 sub\r           {\r                      $styleArray exch get\r                   ct_StyleDicts $regOrdering\r                     2 copy known\r                   {\r                              get\r                            exch 2 copy known not\r                          {pop/Default}\r                          if\r                             get\r                            dup type/nametype eq\r                           {\r                              ?str1 cvs length dup 1 add exch\r                                ?str1 exch(-)putinterval\r                               exch dup length exch ?str1 exch 3 index exch putinterval\r                               add ?str1 exch 0 exch getinterval cvn\r                          }\r                              {\r                              pop pop/Unknown\r                                }\r                              ifelse\r                 }\r                      {\r                              pop pop pop pop/Unknown\r                        }\r                      ifelse\r         }\r              for\r            end\r            findfont \r              }if\r            }\r      ifelse\r currentglobal false setglobal 3 1 roll\r null copyfont definefont pop\r   setglobal\r      }bind def\rsetpacking\ruserdict/$SubstituteFont 25 dict put\r1 dict\r       begin\r  /SubstituteFont\r                dup $error exch 2 copy known\r                   {get}\r                  {pop pop{pop/Courier}bind}\r             ifelse def\r     /currentdistillerparams where dup\r              {\r              pop pop\r                currentdistillerparams/CannotEmbedFontPolicy 2 copy known\r                      {get/Error eq}\r                 {pop pop false}\r                ifelse\r         }\r      if not\r         {\r              countdictstack array dictstack 0 get\r                   begin\r                  userdict\r                               begin\r                          $SubstituteFont\r                                        begin\r                                  /$str 128 string def\r                                   /$fontpat 128 string def\r                                       /$slen 0 def\r                                   /$sname null def\r                                       /$match false def\r                                      /$fontname null def\r                                    /$substituteFound false def\r                                    /$inVMIndex null def\r                                   /$doSmartSub true def\r                                  /$depth 0 def\r                                  /$fontname null def\r                                    /$italicangle 26.5 def\r                                 /$dstack null def\r                                      /$Strategies 10 dict dup\r                                               begin\r                                          /$Type3Underprint\r                                                      {\r                                                      currentglobal exch false setglobal\r                                                     11 dict\r                                                                begin\r                                                          /UseFont exch\r                                                                  $WMode 0 ne\r                                                                            {\r                                                                              dup length dict copy\r                                                                           dup/WMode $WMode put\r                                                                           /UseFont exch definefont\r                                                                               }\r                                                                      if def\r                                                         /FontName $fontname dup type/stringtype eq{cvn}if def\r                                                          /FontType 3 def\r                                                                /FontMatrix[.001 0 0 .001 0 0]def\r                                                              /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def\r                                                           /FontBBox[0 0 0 0]def\r                                                          /CCInfo 7 dict dup\r                                                                     begin\r                                                                  /cc null def\r                                                                   /x 0 def\r                                                                       /y 0 def\r                                                                       end def\r                                                                /BuildChar\r                                                                     {\r                                                                      exch\r                                                                           begin\r                                                                          CCInfo\r                                                                                 begin\r                                                                                  1 string dup 0 3 index put exch pop\r                                                                                    /cc exch def\r                                                                                   UseFont 1000 scalefont setfont\r                                                                                 cc stringwidth/y exch def/x exch def\r                                                                                   x y setcharwidth\r                                                                                       $SubstituteFont/$Strategy get/$Underprint get exec\r                                                                                     0 0 moveto cc show\r                                                                                     x y moveto\r                                                                                     end\r                                                                            end\r                                                                    }bind def\r                                                              currentdict\r                                                            end\r                                                    exch setglobal\r                                                 }bind def\r                                              /$GetaTint\r                                                     2 dict dup\r                                                             begin\r                                                          /$BuildFont\r                                                                    {\r                                                                      dup/WMode known\r                                                                                {dup/WMode get}\r                                                                                {0}\r                                                                    ifelse\r                                                                 /$WMode exch def\r                                                                       $fontname exch\r                                                                 dup/FontName known\r                                                                             {\r                                                                              dup/FontName get\r                                                                               dup type/stringtype eq{cvn}if\r                                                                          }\r                                                                              {/unnamedfont}\r                                                                 ifelse\r                                                                 exch\r                                                                   Adobe_CoolType_Data/InVMDeepCopiedFonts get\r                                                                    1 index/FontName get known\r                                                                             {\r                                                                              pop\r                                                                            Adobe_CoolType_Data/InVMDeepCopiedFonts get\r                                                                            1 index get\r                                                                            null copyfont\r                                                                          }\r                                                                              {$deepcopyfont}\r                                                                        ifelse\r                                                                 exch 1 index exch/FontBasedOn exch put\r                                                                 dup/FontName $fontname dup type/stringtype eq{cvn}if put\r                                                                       definefont\r                                                                     Adobe_CoolType_Data/InVMDeepCopiedFonts get\r                                                                            begin\r                                                                          dup/FontBasedOn get 1 index def\r                                                                                end\r                                                                    }bind def\r                                                              /$Underprint\r                                                                   {\r                                                                      gsave\r                                                                  x abs y abs gt\r                                                                         {/y 1000 def}\r                                                                          {/x -1000 def 500 120 translate}\r                                                                       ifelse\r                                                                 Level2?\r                                                                                {\r                                                                              [/Separation(All)/DeviceCMYK{0 0 0 1 pop}]\r                                                                             setcolorspace\r                                                                          }\r                                                                              {0 setgray}\r                                                                    ifelse\r                                                                 10 setlinewidth\r                                                                        x .8 mul\r                                                                       [7 3]\r                                                                          {\r                                                                              y mul 8 div 120 sub x 10 div exch moveto\r                                                                               0 y 4 div neg rlineto\r                                                                          dup 0 rlineto\r                                                                          0 y 4 div rlineto\r                                                                              closepath\r                                                                              gsave\r                                                                          Level2?\r                                                                                        {.2 setcolor}\r                                                                                  {.8 setgray}\r                                                                           ifelse\r                                                                         fill grestore\r                                                                          stroke\r                                                                         }\r                                                                      forall\r                                                                 pop\r                                                                    grestore\r                                                                       }bind def\r                                                              end def\r                                                /$Oblique\r                                                      1 dict dup\r                                                             begin\r                                                          /$BuildFont\r                                                                    {\r                                                                      currentglobal exch dup gcheck setglobal\r                                                                        null copyfont\r                                                                          begin\r                                                                          /FontBasedOn\r                                                                           currentdict/FontName known\r                                                                                     {\r                                                                                      FontName\r                                                                                       dup type/stringtype eq{cvn}if\r                                                                                  }\r                                                                                      {/unnamedfont}\r                                                                         ifelse\r                                                                         def\r                                                                            /FontName $fontname dup type/stringtype eq{cvn}if def\r                                                                          /currentdistillerparams where\r                                                                                  {pop}\r                                                                                  {\r                                                                                      /FontInfo currentdict/FontInfo known\r                                                                                           {FontInfo null copyfont}\r                                                                                               {2 dict}\r                                                                                       ifelse\r                                                                                 dup\r                                                                                            begin\r                                                                                          /ItalicAngle $italicangle def\r                                                                                          /FontMatrix FontMatrix\r                                                                                         [1 0 ItalicAngle dup sin exch cos div 1 0 0]\r                                                                                           matrix concatmatrix readonly\r                                                                                           end\r                                                                                    4 2 roll def\r                                                                                   def\r                                                                                    }\r                                                                              ifelse\r                                                                         FontName currentdict\r                                                                           end\r                                                                    definefont\r                                                                     exch setglobal\r                                                                 }bind def\r                                                              end def\r                                                /$None\r                                                 1 dict dup\r                                                             begin\r                                                          /$BuildFont{}bind def\r                                                          end def\r                                                end def\r                                        /$Oblique SetSubstituteStrategy\r                                        /$findfontByEnum\r                                               {\r                                              dup type/stringtype eq{cvn}if\r                                          dup/$fontname exch def\r                                         $sname null eq\r                                                 {$str cvs dup length $slen sub $slen getinterval}\r                                                      {pop $sname}\r                                           ifelse\r                                         $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval\r                                             /$match false def\r                                              $SubstituteFont/$dstack countdictstack array dictstack put\r                                             mark\r                                                   {\r                                                      $fontpat 0 $slen 7 add getinterval\r                                                             {/$match exch def exit}\r                                                        $str filenameforall\r                                                    }\r                                              stopped\r                                                        {\r                                                      cleardictstack\r                                                 currentdict\r                                                    true\r                                                   $SubstituteFont/$dstack get\r                                                            {\r                                                              exch\r                                                                   {\r                                                                      1 index eq\r                                                                             {pop false}\r                                                                            {true}\r                                                                 ifelse\r                                                                 }\r                                                                      {begin false}\r                                                          ifelse\r                                                         }\r                                                      forall\r                                                 pop\r                                                    }\r                                              if\r                                             cleartomark\r                                            /$slen 0 def\r                                           $match false ne\r                                                        {$match(fonts/)anchorsearch pop pop cvn}\r                                                       {/Courier}\r                                             ifelse\r                                         }bind def\r                                      /$ROS 1 dict dup\r                                               begin\r                                          /Adobe 4 dict dup\r                                                      begin\r                                                  /Japan1 [/Ryumin-Light/HeiseiMin-W3\r                                                                             /GothicBBB-Medium/HeiseiKakuGo-W5\r                                                                              /HeiseiMaruGo-W4/Jun101-Light]def\r                                                     /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def\r                                                       /GB1     [/STSong-Light/STHeiti-Regular]def\r                                                    /CNS1   [/MKai-Medium/MHei-Medium]def\r                                                  end def\r                                                end def\r                                        /$cmapname null def\r                                    /$deepcopyfont\r                                         {\r                                              dup/FontType get 0 eq\r                                                  {\r                                                      1 dict dup/FontName/copied put copyfont\r                                                                begin\r                                                          /FDepVector FDepVector copyarray\r                                                               0 1 2 index length 1 sub\r                                                                       {\r                                                                      2 copy get $deepcopyfont\r                                                                       dup/FontName/copied put\r                                                                        /copied exch definefont\r                                                                        3 copy put pop pop\r                                                                     }\r                                                              for\r                                                            def\r                                                            currentdict\r                                                            end\r                                                    }\r                                                      {$Strategies/$Type3Underprint get exec}\r                                                ifelse\r                                         }bind def\r                                      /$buildfontname\r                                                {\r                                              dup/CIDFont findresource/CIDSystemInfo get\r                                                     begin\r                                                  Registry length Ordering length Supplement 8 string cvs\r                                                        3 copy length 2 add add add string\r                                                     dup 5 1 roll dup 0 Registry putinterval\r                                                        dup 4 index(-)putinterval\r                                                      dup 4 index 1 add Ordering putinterval\r                                                 4 2 roll add 1 add 2 copy(-)putinterval\r                                                        end\r                                            1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch\r                                            anchorsearch\r                                                   {pop pop 3 2 roll putinterval cvn/$cmapname exch def}\r                                                  {pop pop pop pop pop}\r                                          ifelse\r                                         length\r                                         $str 1 index(-)putinterval 1 add\r                                               $str 1 index $cmapname $fontpat cvs putinterval\r                                                $cmapname length add\r                                           $str exch 0 exch getinterval cvn\r                                               }bind def\r                                      /$findfontByROS\r                                                {\r                                              /$fontname exch def\r                                            $ROS Registry 2 copy known\r                                                     {\r                                                      get Ordering 2 copy known\r                                                              {get}\r                                                          {pop pop[]}\r                                                    ifelse\r                                                 }\r                                                      {pop pop[]}\r                                            ifelse\r                                         false exch\r                                                     {\r                                                      dup/CIDFont resourcestatus\r                                                             {\r                                                              pop pop\r                                                                save\r                                                           1 index/CIDFont findresource\r                                                           dup/WidthsOnly known\r                                                                   {dup/WidthsOnly get}\r                                                                   {false}\r                                                                ifelse\r                                                         exch pop\r                                                               exch restore\r                                                                   {pop}\r                                                                  {exch pop true exit}\r                                                           ifelse\r                                                         }\r                                                              {pop}\r                                                  ifelse\r                                                 }\r                                              forall\r                                                 {$str cvs $buildfontname}\r                                                      {\r                                                      false(*)\r                                                               {\r                                                              save exch\r                                                              dup/CIDFont findresource\r                                                               dup/WidthsOnly known\r                                                                   {dup/WidthsOnly get not}\r                                                                       {true}\r                                                         ifelse\r                                                         exch/CIDSystemInfo get\r                                                         dup/Registry get Registry eq\r                                                           exch/Ordering get Ordering eq and and\r                                                                  {exch restore exch pop true exit}\r                                                                      {pop restore}\r                                                          ifelse\r                                                         }\r                                                      $str/CIDFont resourceforall\r                                                            {$buildfontname}\r                                                               {$fontname $findfontByEnum}\r                                                    ifelse\r                                                 }\r                                              ifelse\r                                         }bind def\r                                      end\r                            end\r                            currentdict/$error known currentdict/languagelevel known and dup\r                                       {pop $error/SubstituteFont known}\r                              if\r                             dup\r                                    {$error}\r                                       {Adobe_CoolType_Core}\r                          ifelse\r                         begin\r                                  {\r                                      /SubstituteFont\r                                        /CMap/Category resourcestatus\r                                          {\r                                              pop pop\r                                                {\r                                              $SubstituteFont\r                                                        begin\r                                                  /$substituteFound true def\r                                                     dup length $slen gt\r                                                    $sname null ne or\r                                                      $slen 0 gt and\r                                                         {\r                                                              $sname null eq\r                                                                 {dup $str cvs dup length $slen sub $slen getinterval cvn}\r                                                                      {$sname}\r                                                               ifelse\r                                                         Adobe_CoolType_Data/InVMFontsByCMap get\r                                                                1 index 2 copy known\r                                                                   {\r                                                                      get\r                                                                    false exch\r                                                                             {\r                                                                              pop\r                                                                            currentglobal\r                                                                                  {\r                                                                                      GlobalFontDirectory 1 index known\r                                                                                              {exch pop true exit}\r                                                                                           {pop}\r                                                                                  ifelse\r                                                                                 }\r                                                                                      {\r                                                                                      FontDirectory 1 index known\r                                                                                            {exch pop true exit}\r                                                                                           {\r                                                                                              GlobalFontDirectory 1 index known\r                                                                                                      {exch pop true exit}\r                                                                                                   {pop}\r                                                                                          ifelse\r                                                                                         }\r                                                                                      ifelse\r                                                                                 }\r                                                                              ifelse\r                                                                         }\r                                                                      forall\r                                                                 }\r                                                                      {pop pop false}\r                                                                ifelse\r                                                                 {\r                                                                      exch pop exch pop\r                                                                      }\r                                                                      {\r                                                                      dup/CMap resourcestatus\r                                                                                {\r                                                                              pop pop\r                                                                                dup/$cmapname exch def\r                                                                         /CMap findresource/CIDSystemInfo get{def}forall\r                                                                                $findfontByROS\r                                                                         }\r                                                                              {\r                                                                              128 string cvs\r                                                                         dup(-)search\r                                                                                   {\r                                                                                      3 1 roll search\r                                                                                                {\r                                                                                              3 1 roll pop\r                                                                                                   {dup cvi}\r                                                                                              stopped\r                                                                                                        {pop pop pop pop pop $findfontByEnum}\r                                                                                                  {\r                                                                                                      4 2 roll pop pop\r                                                                                                       exch length\r                                                                                                    exch\r                                                                                                   2 index length\r                                                                                                 2 index\r                                                                                                        sub\r                                                                                                    exch 1 sub -1 0\r                                                                                                                {\r                                                                                                              $str cvs dup length\r                                                                                                            4 index\r                                                                                                                0\r                                                                                                              4 index\r                                                                                                                4 3 roll add\r                                                                                                           getinterval\r                                                                                                            exch 1 index exch 3 index exch\r                                                                                                         putinterval\r                                                                                                            dup/CMap resourcestatus\r                                                                                                                        {\r                                                                                                                      pop pop\r                                                                                                                        4 1 roll pop pop pop\r                                                                                                                   dup/$cmapname exch def\r                                                                                                                 /CMap findresource/CIDSystemInfo get{def}forall\r                                                                                                                        $findfontByROS\r                                                                                                                 true exit\r                                                                                                                      }\r                                                                                                                      {pop}\r                                                                                                          ifelse\r                                                                                                         }\r                                                                                                      for\r                                                                                                    dup type/booleantype eq\r                                                                                                                {pop}\r                                                                                                          {pop pop pop $findfontByEnum}\r                                                                                                  ifelse\r                                                                                                 }\r                                                                                              ifelse\r                                                                                         }\r                                                                                              {pop pop pop $findfontByEnum}\r                                                                                  ifelse\r                                                                                 }\r                                                                                      {pop pop $findfontByEnum}\r                                                                              ifelse\r                                                                         }\r                                                                      ifelse\r                                                                 }\r                                                              ifelse\r                                                         }\r                                                              {//SubstituteFont exec}\r                                                        ifelse\r                                                 /$slen 0 def\r                                                   end\r                                            }\r                                              }\r                                              {\r                                              {\r                                              $SubstituteFont\r                                                        begin\r                                                  /$substituteFound true def\r                                                     dup length $slen gt\r                                                    $sname null ne or\r                                                      $slen 0 gt and\r                                                         {$findfontByEnum}\r                                                              {//SubstituteFont exec}\r                                                        ifelse\r                                                 end\r                                            }\r                                              }\r                                      ifelse\r                                 bind readonly def\r                                      Adobe_CoolType_Core/scfindfont/systemfindfont load put\r                                 }\r                                      {\r                                      /scfindfont\r                                            {\r                                              $SubstituteFont\r                                                        begin\r                                                  dup systemfindfont\r                                                     dup/FontName known\r                                                             {dup/FontName get dup 3 index ne}\r                                                              {/noname true}\r                                                 ifelse\r                                                 dup\r                                                            {\r                                                              /$origfontnamefound 2 index def\r                                                                /$origfontname 4 index def/$substituteFound true def\r                                                           }\r                                                      if\r                                                     exch pop\r                                                               {\r                                                              $slen 0 gt\r                                                             $sname null ne\r                                                         3 index length $slen gt or and\r                                                                 {\r                                                                      pop dup $findfontByEnum findfont\r                                                                       dup maxlength 1 add dict\r                                                                               begin\r                                                                                  {1 index/FID eq{pop pop}{def}ifelse}\r                                                                           forall\r                                                                         currentdict\r                                                                            end\r                                                                    definefont\r                                                                     dup/FontName known{dup/FontName get}{null}ifelse\r                                                                       $origfontnamefound ne\r                                                                          {\r                                                                              $origfontname $str cvs print\r                                                                           ( substitution revised, using )print\r                                                                           dup/FontName known\r                                                                                     {dup/FontName get}{(unspecified font)}\r                                                                         ifelse\r                                                                         $str cvs print(.\n)print\r                                                                               }\r                                                                      if\r                                                                     }\r                                                                      {exch pop}\r                                                             ifelse\r                                                         }\r                                                              {exch pop}\r                                                     ifelse\r                                                 end\r                                            }bind def\r                                      }\r                              ifelse\r                         end\r                    end\r            Adobe_CoolType_Core_Defined not\r                        {\r                      Adobe_CoolType_Core/findfont\r                           {\r                              $SubstituteFont\r                                        begin\r                                  $depth 0 eq\r                                            {\r                                              /$fontname 1 index dup type/stringtype ne{$str cvs}if def\r                                              /$substituteFound false def\r                                            }\r                                      if\r                                     /$depth $depth 1 add def\r                                       end\r                            scfindfont\r                             $SubstituteFont\r                                        begin\r                                  /$depth $depth 1 sub def\r                                       $substituteFound $depth 0 eq and\r                                               {\r                                              $inVMIndex null ne\r                                                     {dup $inVMIndex $AddInVMFont}\r                                          if\r                                             $doSmartSub\r                                                    {\r                                                      currentdict/$Strategy known\r                                                            {$Strategy/$BuildFont get exec}\r                                                        if\r                                                     }\r                                              if\r                                             }\r                                      if\r                                     end\r                            }bind put\r                      }\r              if\r             }\r      if\r     end\r/$AddInVMFont\r      {\r      exch/FontName 2 copy known\r             {\r              get\r            1 dict dup begin exch 1 index gcheck def end exch\r              Adobe_CoolType_Data/InVMFontsByCMap get exch\r           $DictAdd\r               }\r              {pop pop pop}\r  ifelse\r }bind def\r/$DictAdd\r    {\r      2 copy known not\r               {2 copy 4 index length dict put}\r       if\r     Level2? not\r            {\r              2 copy get dup maxlength exch length 4 index length add lt\r             2 copy get dup length 4 index length add exch maxlength 1 index lt\r                     {\r                      2 mul dict\r                             begin\r                          2 copy get{forall}def\r                          2 copy currentdict put\r                         end\r                    }\r                      {pop}\r          ifelse\r         }\r      if\r     get\r            begin\r                  {def}\r          forall\r         end\r    }bind def\rend\rend\r%%EndResource\rcurrentglobal true setglobal\r%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0\r%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated.\r%%Version: 1.23 0\rsystemdict/languagelevel known dup\r  {currentglobal false setglobal}\r        {false}\rifelse\rexch\ruserdict/Adobe_CoolType_Utility 2 copy known\r       {2 copy get dup maxlength 27 add dict copy}\r    {27 dict}\rifelse put\rAdobe_CoolType_Utility\r    begin\r  /@eexecStartData\r                <BAB431EA07F209EB8C4348311481D9D3F76E3D15246555577D87BC510ED54E\r                118C39697FA9F6DB58128E60EB8A12FA24D7CDD2FA94D221FA9EC8DA3E5E6A1C\r               4ACECC8C2D39C54E7C946031DD156C3A6B4A09AD29E1867A>def\r  /@recognizeCIDFont null def\r    /ct_Level2? exch def\r   /ct_Clone? 1183615869 internaldict dup\r                 /CCRun known not\r                       exch/eCCRun known not\r                  ct_Level2? and or def\rct_Level2?\r       {globaldict begin currentglobal true setglobal}\rif\r     /ct_AddStdCIDMap\r               ct_Level2?\r                     {{\r                             mark\r                           Adobe_CoolType_Utility/@recognizeCIDFont currentdict put\r                                       {\r                                      ((Hex)57 StartData\r                                      0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0\r                                        7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60\r                                        d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8\r                                        cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec\r                                      }\r                              stopped\r                                        {\r                                       cleartomark\r                                    Adobe_CoolType_Utility/@recognizeCIDFont get\r                                   countdictstack dup array dictstack\r                                     exch 1 sub -1 0\r                                                {\r                                              2 copy get 3 index eq\r                                                         {1 index length exch sub 1 sub{end}repeat exit}\r                                                                {pop}\r                                           ifelse\r                                                 }\r                                      for\r                                    pop pop\r                                        Adobe_CoolType_Utility/@eexecStartData get eexec\r                                      }\r                                      {cleartomark}\r                          ifelse\r                 }}\r                     {{\r                             Adobe_CoolType_Utility/@eexecStartData get eexec\r                       }}\r             ifelse bind def\ruserdict/cid_extensions known\rdup{cid_extensions/cid_UpdateDB known and}if\r     {\r       cid_extensions\r         begin\r /cid_GetCIDSystemInfo\r          {\r               1 index type/stringtype eq\r                    {exch cvn exch}\r                 if\r             cid_extensions\r                         begin\r                  dup load 2 index known\r                                {\r                               2 copy\r                                 cid_GetStatusInfo\r                              dup null ne\r                                   {\r                                       1 index load\r                                   3 index get\r                                    dup null eq\r                                            {pop pop cid_UpdateDB}\r                                                 {\r                                              exch\r                                           1 index/Created get eq\r                                                         {exch pop exch pop}\r                                                    {pop cid_UpdateDB}\r                                             ifelse\r                                                 }\r                                      ifelse\r                                        }\r                                      {pop cid_UpdateDB}\r                              ifelse\r                                }\r                              {cid_UpdateDB}\r                  ifelse\r                         end\r           }bind def\r       end\r   }\rif\rct_Level2?\r        {end setglobal}\rif\r     /ct_UseNativeCapability? systemdict/composefont known def\r      /ct_MakeOCF 35 dict def\r        /ct_Vars 25 dict def\r   /ct_GlyphDirProcs 6 dict def\r   /ct_BuildCharDict 15 dict dup\r          begin\r          /charcode 2 string def\r         /dst_string 1500 string def\r            /nullstring()def\r               /usewidths? true def\r           end def\r        ct_Level2?{setglobal}{pop}ifelse\r       ct_GlyphDirProcs\r               begin\r          /GetGlyphDirectory\r                     {\r                      systemdict/languagelevel known\r                         {pop/CIDFont findresource/GlyphDirectory get}\r                          {\r                              1 index/CIDFont findresource/GlyphDirectory\r                            get dup type/dicttype eq\r                                       {\r                                      dup dup maxlength exch length sub 2 index lt\r                                           {\r                                              dup length 2 index add dict copy 2 index\r                                               /CIDFont findresource/GlyphDirectory 2 index put\r                                               }\r                                      if\r                                     }\r                              if\r                             exch pop exch pop\r                              }\r                      ifelse\r                 +\r                      }def\r           /+\r                     {\r                      systemdict/languagelevel known\r                         {\r                              currentglobal false setglobal\r                          3 dict begin\r                                   /vm exch def\r                           }\r                              {1 dict begin}\r                 ifelse\r                 /$ exch def\r                    systemdict/languagelevel known\r                         {\r                              vm setglobal\r                           /gvm currentglobal def\r                         $ gcheck setglobal\r                             }\r                      if\r                     ?{$ begin}if\r                   }def\r           /?{$ type/dicttype eq}def\r              /|{\r                    userdict/Adobe_CoolType_Data known\r                             {\r                      Adobe_CoolType_Data/AddWidths? known\r                           {\r                               currentdict Adobe_CoolType_Data\r                                       begin\r                                   begin\r                                         AddWidths?\r                                                             {\r                                                              Adobe_CoolType_Data/CC 3 index put\r                                                             ?{def}{$ 3 1 roll put}ifelse\r                                                           CC charcode exch 1 index 0 2 index 256 idiv put\r                                                                1 index exch 1 exch 256 mod put\r                                                                stringwidth 2 array astore\r                                                             currentfont/Widths get exch CC exch put\r                                                                }\r                                                              {?{def}{$ 3 1 roll put}ifelse}\r                                                 ifelse\r                                 end\r                            end\r                            }\r                              {?{def}{$ 3 1 roll put}ifelse}  ifelse\r                         }\r                              {?{def}{$ 3 1 roll put}ifelse}\r                 ifelse\r                 }def\r           /!\r                     {\r                      ?{end}if\r                       systemdict/languagelevel known\r                         {gvm setglobal}\r                        if\r                     end\r                    }def\r           /:{string currentfile exch readstring pop}executeonly def\r              end\r    ct_MakeOCF\r             begin\r          /ct_cHexEncoding\r               [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12\r          /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25\r           /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38\r           /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B\r           /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E\r           /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71\r           /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84\r           /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97\r           /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA\r           /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD\r           /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0\r           /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3\r           /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6\r           /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def\r               /ct_CID_STR_SIZE 8000 def\r              /ct_mkocfStr100 100 string def\r         /ct_defaultFontMtx[.001 0 0 .001 0 0]def\r               /ct_1000Mtx[1000 0 0 1000 0 0]def\r              /ct_raise{exch cvx exch errordict exch get exec stop}bind def\r          /ct_reraise\r                    {cvx $error/errorname get(Error: )print dup(                                             )cvs print\r                                    errordict exch get exec stop\r                   }bind def\r              /ct_cvnsi\r                      {\r                      1 index add 1 sub 1 exch 0 4 1 roll\r                            {\r                              2 index exch get\r                               exch 8 bitshift\r                                add\r                            }\r                      for\r                    exch pop\r                       }bind def\r              /ct_GetInterval\r                        {\r                      Adobe_CoolType_Utility/ct_BuildCharDict get\r                            begin\r                          /dst_index 0 def\r                               dup dst_string length gt\r                                       {dup string/dst_string exch def}\r                               if\r                             1 index ct_CID_STR_SIZE idiv\r                           /arrayIndex exch def\r                           2 index arrayIndex get\r                         2 index\r                                arrayIndex ct_CID_STR_SIZE mul\r                         sub\r                                    {\r                                      dup 3 index add 2 index length le\r                                              {\r                                              2 index getinterval\r                                            dst_string dst_index 2 index putinterval\r                                               length dst_index add/dst_index exch def\r                                                exit\r                                           }\r                                              {\r                                              1 index length 1 index sub\r                                             dup 4 1 roll\r                                           getinterval\r                                            dst_string dst_index 2 index putinterval\r                                               pop dup dst_index add/dst_index exch def\r                                               sub\r                                            /arrayIndex arrayIndex 1 add def\r                                               2 index dup length arrayIndex gt\r                                                        {arrayIndex get}\r                                                       {\r                                                      pop\r                                                    exit\r                                                   }\r                                             ifelse\r                                         0\r                                              }\r                                      ifelse\r                                 }\r                              loop\r                           pop pop pop\r                            dst_string 0 dst_index getinterval\r                             end\r                    }bind def\r              ct_Level2?\r                     {\r                      /ct_resourcestatus\r                     currentglobal mark true setglobal\r                              {/unknowninstancename/Category resourcestatus}\r                 stopped\r                                {cleartomark setglobal true}\r                           {cleartomark currentglobal not exch setglobal}\r                 ifelse\r                         {\r                                      {\r                                      mark 3 1 roll/Category findresource\r                                            begin\r                                          ct_Vars/vm currentglobal put\r                                           ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec\r                                                     {cleartomark false}\r                                                    {{3 2 roll pop true}{cleartomark false}ifelse}\r                                         ifelse\r                                         ct_Vars/vm get setglobal\r                                               end\r                                    }\r                              }\r                              {{resourcestatus}}\r                     ifelse bind def\r                        /CIDFont/Category ct_resourcestatus\r                            {pop pop}\r                              {\r                              currentglobal true setglobal\r                           /Generic/Category findresource\r                         dup length dict copy\r                           dup/InstanceType/dicttype put\r                          /CIDFont exch/Category defineresource pop\r                              setglobal\r                              }\r                      ifelse\r                 ct_UseNativeCapability?\r                                {\r                              /CIDInit/ProcSet findresource begin\r                            12 dict begin\r                          begincmap\r                              /CIDSystemInfo 3 dict dup begin\r                                 /Registry(Adobe)def\r                            /Ordering(Identity)def\r                                 /Supplement 0 def\r                             end def\r                                /CMapName/Identity-H def\r                               /CMapVersion 1.000 def\r                         /CMapType 1 def\r                                1 begincodespacerange\r                          <0000><FFFF>\r                           endcodespacerange\r                              1 begincidrange\r                                <0000><FFFF>0\r                          endcidrange\r                            endcmap\r                                CMapName currentdict/CMap defineresource pop\r                           end\r                            end\r                            }\r                      if\r                     }\r                      {\r                      /ct_Category 2 dict begin\r                      /CIDFont 10 dict def\r                   /ProcSet        2 dict def\r                     currentdict\r                    end\r                    def\r                    /defineresource\r                                {\r                              ct_Category 1 index 2 copy known\r                                       {\r                                      get\r                                    dup dup maxlength exch length eq\r                                               {\r                                              dup length 10 add dict copy\r                                            ct_Category 2 index 2 index put\r                                                }\r                                      if\r                                     3 index 3 index put\r                                    pop exch pop\r                                   }\r                                      {pop pop/defineresource/undefined ct_raise}\r                            ifelse\r                         }bind def\r                      /findresource\r                          {\r                              ct_Category 1 index 2 copy known\r                                       {\r                                      get\r                                    2 index 2 copy known\r                                           {get 3 1 roll pop pop}\r                                         {pop pop/findresource/undefinedresource ct_raise}\r                                      ifelse\r                                 }\r                                      {pop pop/findresource/undefined ct_raise}\r                              ifelse\r                         }bind def\r                      /resourcestatus\r                                {\r                              ct_Category 1 index 2 copy known\r                                       {\r                                      get\r                                    2 index known\r                                  exch pop exch pop\r                                              {\r                                              0 -1 true\r                                              }\r                                              {\r                                              false\r                                          }\r                                      ifelse\r                                 }\r                                      {pop pop/findresource/undefined ct_raise}\r                              ifelse\r                         }bind def\r                      /ct_resourcestatus/resourcestatus load def\r                     }\r              ifelse\r         /ct_CIDInit 2 dict\r                     begin\r                  /ct_cidfont_stream_init\r                                {\r                                      {\r                                      dup(Binary)eq\r                                          {\r                                              pop\r                                            null\r                                           currentfile\r                                            ct_Level2?\r                                                     {\r                                                              {cid_BYTE_COUNT()/SubFileDecode filter}\r                                                        stopped\r                                                                {pop pop pop}\r                                                  if\r                                                     }\r                                              if\r                                             /readstring load\r                                               exit\r                                           }\r                                      if\r                                     dup(Hex)eq\r                                             {\r                                              pop\r                                            currentfile\r                                            ct_Level2?\r                                                     {\r                                                              {null exch/ASCIIHexDecode filter/readstring}\r                                                   stopped\r                                                                {pop exch pop(>)exch/readhexstring}\r                                                    if\r                                                     }\r                                                      {(>)exch/readhexstring}\r                                                ifelse\r                                         load\r                                           exit\r                                           }\r                                      if\r                                     /StartData/typecheck ct_raise\r                                  }\r                              loop\r                           cid_BYTE_COUNT ct_CID_STR_SIZE le\r                                      {\r                                      2 copy cid_BYTE_COUNT string exch exec\r                                 pop\r                                    1 array dup\r                                    3 -1 roll\r                                      0 exch put\r                                     }\r                                      {\r                                      cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi\r                                 dup array exch 2 sub 0 exch 1 exch\r                                             {\r                                              2 copy\r                                         5 index\r                                                ct_CID_STR_SIZE\r                                                string\r                                         6 index exec\r                                           pop\r                                            put\r                                            pop\r                                            }\r                                      for\r                                    2 index\r                                        cid_BYTE_COUNT ct_CID_STR_SIZE mod string\r                                      3 index exec\r                                   pop\r                                    1 index exch\r                                   1 index length 1 sub\r                                   exch put\r                                       }\r                              ifelse\r                         cid_CIDFONT exch/GlyphData exch put\r                            2 index null eq\r                                        {\r                                      pop pop pop\r                                    }\r                                      {\r                                      pop/readstring load\r                                    1 string exch\r                                          {\r                                              3 copy exec\r                                            pop\r                                            dup length 0 eq\r                                                        {\r                                                      pop pop pop pop pop\r                                                    true exit\r                                                      }\r                                              if\r                                             4 index\r                                                eq\r                                                     {\r                                                      pop pop pop pop\r                                                        false exit\r                                                     }\r                                              if\r                                             }\r                                      loop\r                                   pop\r                                    }\r                              ifelse\r                         }bind def\r                      /StartData\r                             {\r                              mark\r                                   {\r                                      currentdict\r                                    dup/FDArray get 0 get/FontMatrix get\r                                   0 get 0.001 eq\r                                         {\r                                              dup/CDevProc known not\r                                                 {\r                                                      /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known\r                                                             {get}\r                                                          {\r                                                              pop pop\r                                                                {pop pop pop pop pop 0 -1000 7 index 2 div 880}\r                                                                }\r                                                      ifelse\r                                                 def\r                                                    }\r                                              if\r                                             }\r                                              {\r                                              /CDevProc\r                                                      {\r                                                       pop pop pop pop pop\r                                                    0\r                                                      1 cid_temp/cid_CIDFONT get\r                                                    /FDArray get 0 get\r                                                     /FontMatrix get 0 get div\r                                                       7 index 2 div\r                                                  1 index 0.88 mul\r                                                      }def\r                                           }\r                                      ifelse\r                                 /cid_temp 15 dict def\r                                  cid_temp\r                                               begin\r                                          /cid_CIDFONT exch def\r                                          3 copy pop\r                                             dup/cid_BYTE_COUNT exch def 0 gt\r                                                       {\r                                                      ct_cidfont_stream_init\r                                                 FDArray\r                                                                {\r                                                              /Private get\r                                                           dup/SubrMapOffset known\r                                                                        {\r                                                                      begin\r                                                                  /Subrs SubrCount array def\r                                                                     Subrs\r                                                                  SubrMapOffset\r                                                                  SubrCount\r                                                                      SDBytes\r                                                                        ct_Level2?\r                                                                             {\r                                                                              currentdict dup/SubrMapOffset undef\r                                                                            dup/SubrCount undef\r                                                                            /SDBytes undef\r                                                                         }\r                                                                      if\r                                                                     end\r                                                                    /cid_SD_BYTES exch def\r                                                                 /cid_SUBR_COUNT exch def\r                                                                       /cid_SUBR_MAP_OFFSET exch def\r                                                                  /cid_SUBRS exch def\r                                                                    cid_SUBR_COUNT 0 gt\r                                                                            {\r                                                                              GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval\r                                                                              0 cid_SD_BYTES ct_cvnsi\r                                                                                0 1 cid_SUBR_COUNT 1 sub\r                                                                                       {\r                                                                                      exch 1 index\r                                                                                   1 add\r                                                                                  cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add\r                                                                                       GlyphData exch cid_SD_BYTES ct_GetInterval\r                                                                                     0 cid_SD_BYTES ct_cvnsi\r                                                                                        cid_SUBRS 4 2 roll\r                                                                                     GlyphData exch\r                                                                                 4 index\r                                                                                        1 index\r                                                                                        sub\r                                                                                    ct_GetInterval\r                                                                                 dup length string copy put\r                                                                                     }\r                                                                              for\r                                                                            pop\r                                                                            }\r                                                                      if\r                                                                     }\r                                                                      {pop}\r                                                          ifelse\r                                                         }\r                                                      forall\r                                                 }\r                                              if\r                                             cleartomark pop pop\r                                            end\r                                    CIDFontName currentdict/CIDFont defineresource pop\r                                     end end\r                                        }\r                              stopped\r                                        {cleartomark/StartData ct_reraise}\r                             if\r                             }bind def\r                      currentdict\r                    end def\r                /ct_saveCIDInit\r                        {\r                      /CIDInit/ProcSet ct_resourcestatus\r                             {true}\r                         {/CIDInitC/ProcSet ct_resourcestatus}\r                  ifelse\r                         {\r                              pop pop\r                                /CIDInit/ProcSet findresource\r                          ct_UseNativeCapability?\r                                        {pop null}\r                                     {/CIDInit ct_CIDInit/ProcSet defineresource pop}\r                               ifelse\r                         }\r                              {/CIDInit ct_CIDInit/ProcSet defineresource pop null}\r                  ifelse\r                 ct_Vars exch/ct_oldCIDInit exch put\r                    }bind def\r              /ct_restoreCIDInit\r                     {\r                      ct_Vars/ct_oldCIDInit get dup null ne\r                          {/CIDInit exch/ProcSet defineresource pop}\r                             {pop}\r                  ifelse\r                 }bind def\r              /ct_BuildCharSetUp\r                     {\r                      1 index\r                                begin\r                          CIDFont\r                                        begin\r                                  Adobe_CoolType_Utility/ct_BuildCharDict get\r                                            begin\r                                          /ct_dfCharCode exch def\r                                                /ct_dfDict exch def\r                                            CIDFirstByte ct_dfCharCode add\r                                         dup CIDCount ge\r                                                        {pop 0}\r                                                if\r                                             /cid exch def\r                                                  {\r                                                      GlyphDirectory cid 2 copy known\r                                                                {get}\r                                                          {pop pop nullstring}\r                                                   ifelse\r                                                 dup length FDBytes sub 0 gt\r                                                            {\r                                                              dup\r                                                            FDBytes 0 ne\r                                                                   {0 FDBytes ct_cvnsi}\r                                                                   {pop 0}\r                                                                ifelse\r                                                         /fdIndex exch def\r                                                              dup length FDBytes sub FDBytes exch getinterval\r                                                                /charstring exch def\r                                                           exit\r                                                           }\r                                                              {\r                                                              pop\r                                                            cid 0 eq\r                                                                       {/charstring nullstring def exit}\r                                                              if\r                                                             /cid 0 def\r                                                             }\r                                                      ifelse\r                                                 }\r                                              loop\r                   }def\r           /ct_SetCacheDevice\r                     {\r                      0 0 moveto\r                     dup stringwidth\r                        3 -1 roll\r                      true charpath\r                  pathbbox\r                       0 -1000\r                        7 index 2 div 880\r                      setcachedevice2\r                        0 0 moveto\r                     }def\r           /ct_CloneSetCacheProc\r                  {\r                      1 eq\r                           {\r                              stringwidth\r                            pop -2 div -880\r                                0 -1000 setcharwidth\r                           moveto\r                         }\r                              {\r                              usewidths?\r                                     {\r                                      currentfont/Widths get cid\r                                     2 copy known\r                                           {get exch pop aload pop}\r                                               {pop pop stringwidth}\r                                  ifelse\r                                 }\r                                      {stringwidth}\r                          ifelse\r                         setcharwidth\r                           0 0 moveto\r                             }\r                      ifelse\r                 }def\r           /ct_Type3ShowCharString\r                        {\r                      ct_FDDict fdIndex 2 copy known\r                         {get}\r                          {\r                              currentglobal 3 1 roll\r                         1 index gcheck setglobal\r                               ct_Type1FontTemplate dup maxlength dict copy\r                                   begin\r                                  FDArray fdIndex get\r                                    dup/FontMatrix 2 copy known\r                                            {get}\r                                          {pop pop ct_defaultFontMtx}\r                                    ifelse\r                                 /FontMatrix exch dup length array copy def\r                                     /Private get\r                                   /Private exch def\r                                      /Widths rootfont/Widths get def\r                                        /CharStrings 1 dict dup/.notdef\r                                                <d841272cf18f54fc13>dup length string copy put def\r                                     currentdict\r                                    end\r                            /ct_Type1Font exch definefont\r                          dup 5 1 roll put\r                               setglobal\r                              }\r                      ifelse\r                 dup/CharStrings get 1 index/Encoding get\r                       ct_dfCharCode get charstring put\r                       rootfont/WMode 2 copy known\r                            {get}\r                          {pop pop 0}\r                    ifelse\r                 exch\r                   1000 scalefont setfont\r                 ct_str1 0 ct_dfCharCode put\r                    ct_str1 exch ct_dfSetCacheProc\r                 ct_SyntheticBold\r                               {\r                              currentpoint\r                           ct_str1 show\r                           newpath\r                                moveto\r                         ct_str1 true charpath\r                          ct_StrokeWidth setlinewidth\r                            stroke\r                         }\r                              {ct_str1 show}\r                 ifelse\r                 }def\r           /ct_Type4ShowCharString\r                        {\r                      ct_dfDict ct_dfCharCode charstring\r                     FDArray fdIndex get\r                    dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not\r                               {ct_1000Mtx matrix concatmatrix concat}\r                                {pop}\r                  ifelse\r                 /Private get\r                   Adobe_CoolType_Utility/ct_Level2? get not\r                              {\r                              ct_dfDict/Private\r                              3 -1 roll\r                                      {put}\r                          1183615869 internaldict/superexec get exec\r                             }\r                      if\r                     1183615869 internaldict\r                        Adobe_CoolType_Utility/ct_Level2? get\r                          {1 index}\r                              {3 index/Private get mark 6 1 roll}\r                    ifelse\r                 dup/RunInt known\r                               {/RunInt get}\r                          {pop/CCRun}\r                    ifelse\r                 get exec\r                       Adobe_CoolType_Utility/ct_Level2? get not\r                              {cleartomark}\r                  if\r                     }bind def\r              /ct_BuildCharIncremental\r                       {\r                              {\r                              Adobe_CoolType_Utility/ct_MakeOCF get begin\r                            ct_BuildCharSetUp\r                              ct_ShowCharString\r                              }\r                      stopped\r                                {stop}\r                 if\r                     end\r                    end\r                    end\r                    end\r                    }bind def\r              /BaseFontNameStr(BF00)def\r              /ct_Type1FontTemplate 14 dict\r                  begin\r                  /FontType 1 def\r                        /FontMatrix [0.001 0 0 0.001 0 0]def\r                   /FontBBox [-250 -250 1250 1250]def\r                     /Encoding ct_cHexEncoding def\r                  /PaintType 0 def\r                       currentdict\r                    end def\r                /BaseFontTemplate 11 dict\r                      begin\r                  /FontMatrix [0.001 0 0 0.001 0 0]def\r                   /FontBBox [-250 -250 1250 1250]def\r                     /Encoding ct_cHexEncoding def\r                  /BuildChar/ct_BuildCharIncremental load def\r                    ct_Clone?\r                              {\r                              /FontType 3 def\r                                /ct_ShowCharString/ct_Type3ShowCharString load def\r                             /ct_dfSetCacheProc/ct_CloneSetCacheProc load def\r                               /ct_SyntheticBold false def\r                            /ct_StrokeWidth 1 def\r                          }\r                              {\r                              /FontType 4 def\r                                /Private 1 dict dup/lenIV 4 put def\r                            /CharStrings 1 dict dup/.notdef<d841272cf18f54fc13>put def\r                             /PaintType 0 def\r                               /ct_ShowCharString/ct_Type4ShowCharString load def\r                             }\r                      ifelse\r                 /ct_str1 1 string def\r                  currentdict\r                    end def\r                /BaseFontDictSize BaseFontTemplate length 5 add def\r            /ct_matrixeq\r                   {\r                      true 0 1 5\r                             {\r                              dup 4 index exch get exch 3 index exch get eq and\r                              dup not\r                                        {exit}\r                         if\r                             }\r                      for\r                    exch pop exch pop\r                      }bind def\r              /ct_makeocf\r                    {\r                      15 dict\r                                begin\r                          exch/WMode exch def\r                            exch/FontName exch def\r                         /FontType 0 def\r                                /FMapType 2 def\r                        dup/FontMatrix known\r                           {dup/FontMatrix get/FontMatrix exch def}\r                               {/FontMatrix matrix def}\r                       ifelse\r                         /bfCount 1 index/CIDCount get 256 idiv 1 add\r                                   dup 256 gt{pop 256}if def\r                              /Encoding\r                                      256 array 0 1 bfCount 1 sub{2 copy dup put pop}for\r                                     bfCount 1 255{2 copy bfCount put pop}for\r                                       def\r                            /FDepVector bfCount dup 256 lt{1 add}if array def\r                              BaseFontTemplate BaseFontDictSize dict copy\r                                    begin\r                                  /CIDFont exch def\r                                      CIDFont/FontBBox known\r                                         {CIDFont/FontBBox get/FontBBox exch def}\r                                       if\r                                     CIDFont/CDevProc known\r                                         {CIDFont/CDevProc get/CDevProc exch def}\r                                       if\r                                     currentdict\r                                    end\r                            BaseFontNameStr 3(0)putinterval\r                                0 1 bfCount dup 256 eq{1 sub}if\r                                        {\r                                      FDepVector exch\r                                        2 index BaseFontDictSize dict copy\r                                             begin\r                                          dup/CIDFirstByte exch 256 mul def\r                                              FontType 3 eq\r                                                  {/ct_FDDict 2 dict def}\r                                                if\r                                             currentdict\r                                            end\r                                    1 index 16\r                                     BaseFontNameStr 2 2 getinterval cvrs pop\r                                       BaseFontNameStr exch definefont\r                                        put\r                                    }\r                              for\r                            ct_Clone?\r                                      {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}\r                               if\r                             FontName\r                               currentdict\r                            end\r                    definefont\r                     ct_Clone?\r                              {\r                              gsave\r                          dup 1000 scalefont setfont\r                             ct_BuildCharDict\r                                       begin\r                                  /usewidths? false def\r                                  currentfont/Widths get\r                                         begin\r                                          exch/CIDFont get/GlyphDirectory get\r                                                    {\r                                                      pop\r                                                    dup charcode exch 1 index 0 2 index 256 idiv put\r                                                       1 index exch 1 exch 256 mod put\r                                                        stringwidth 2 array astore def\r                                                 }\r                                              forall\r                                         end\r                                    /usewidths? true def\r                                   end\r                            grestore\r                               }\r                              {exch pop}\r                     ifelse\r                 }bind def\r              currentglobal true setglobal\r           /ct_ComposeFont\r                        {\r                      ct_UseNativeCapability?\r                                {                               \r                               2 index/CMap ct_resourcestatus\r                                 {pop pop exch pop}\r                                     {\r                                      /CIDInit/ProcSet findresource\r                                          begin\r                                          12 dict\r                                                        begin\r                                                  begincmap\r                                                      /CMapName 3 index def\r                                                  /CMapVersion 1.000 def\r                                                 /CMapType 1 def\r                                                        exch/WMode exch def\r                                                    /CIDSystemInfo 3 dict dup\r                                                              begin\r                                                          /Registry(Adobe)def\r                                                            /Ordering\r                                                              CMapName ct_mkocfStr100 cvs\r                                                            (Adobe-)search\r                                                                 {\r                                                                      pop pop\r                                                                        (-)search\r                                                                              {\r                                                                              dup length string copy\r                                                                         exch pop exch pop\r                                                                              }\r                                                                              {pop(Identity)}\r                                                                        ifelse\r                                                                 }\r                                                                      {pop (Identity)}\r                                                               ifelse\r                                                         def\r                                                            /Supplement 0 def\r                                                              end def\r                                                        1 begincodespacerange\r                                                  <0000><FFFF>\r                                                   endcodespacerange\r                                                      1 begincidrange\r                                                        <0000><FFFF>0\r                                                  endcidrange\r                                                    endcmap\r                                                        CMapName currentdict/CMap defineresource pop\r                                                   end\r                                            end\r                                    }\r                              ifelse\r                         composefont\r                            }\r                              {\r                              3 2 roll pop\r                           0 get/CIDFont findresource\r                             ct_makeocf\r                             }\r                      ifelse\r                 }bind def\r                      setglobal\r              /ct_MakeIdentity\r                       {\r                      ct_UseNativeCapability?\r                                {\r                              1 index/CMap ct_resourcestatus\r                                 {pop pop}\r                                      {\r                                      /CIDInit/ProcSet findresource begin\r                                    12 dict begin\r                                  begincmap\r                                      /CMapName 2 index def\r                                  /CMapVersion 1.000 def\r                                 /CMapType 1 def\r                                        /CIDSystemInfo 3 dict dup\r                                              begin\r                                          /Registry(Adobe)def\r                                            /Ordering\r                                              CMapName ct_mkocfStr100 cvs\r                                            (Adobe-)search\r                                                 {\r                                                      pop pop\r                                                        (-)search\r                                                              {dup length string copy exch pop exch pop}\r                                                             {pop(Identity)}\r                                                        ifelse\r                                                 }\r                                                      {pop(Identity)}\r                                                ifelse\r                                         def\r                                            /Supplement 0 def\r                                              end def\r                                        1 begincodespacerange\r                                  <0000><FFFF>\r                                   endcodespacerange\r                                      1 begincidrange\r                                        <0000><FFFF>0\r                                  endcidrange\r                                    endcmap\r                                        CMapName currentdict/CMap defineresource pop\r                                   end\r                                    end\r                                    }\r                              ifelse\r                         composefont\r                            }\r                              {\r                              exch pop\r                               0 get/CIDFont findresource\r                             ct_makeocf\r                             }\r                      ifelse\r                 }bind def\r              currentdict readonly pop\r               end\r    end\r%%EndResource\rsetglobal\r%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0\r%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated.\r%%Version: 1.0 0\ruserdict/ct_T42Dict 15 dict put\rct_T42Dict begin\r/Is2015?\r{\r version\r cvi\r 2015\r ge\r}bind def\r/AllocGlyphStorage\r{\r Is2015?\r {      \r       pop\r }\r {\r      {string}forall\r }ifelse\r}bind def\r/Type42DictBegin\r{\r25 dict begin\r /FontName exch def\r /CharStrings 256 dict \rbegin\r    /.notdef 0 def\r         currentdict \rend def\r /Encoding exch def\r /PaintType 0 def\r /FontType 42 def\r /FontMatrix[1 0 0 1 0 0]def\r 4 array astore cvx/FontBBox exch def\r /sfnts\r}bind def\r/Type42DictEnd \r{\r currentdict dup/FontName get exch definefont end\rct_T42Dict exch\rdup/FontName get exch put\r}bind def\r/RD{string currentfile exch readstring pop}executeonly def\r/PrepFor2015\r{\rIs2015?\r{           \r      /GlyphDirectory \r        16\r     dict def\r       sfnts 0 get\r    dup\r    2 index\r       (glyx)\r  putinterval\r    2 index \r      (locx)\r  putinterval\r    pop\r    pop\r}\r{\r        pop\r    pop\r}ifelse                    \r}bind def\r/AddT42Char\r{\rIs2015?\r{\r     /GlyphDirectory get \r   begin\r  def\r    end\r    pop\r    pop\r}\r{\r        /sfnts get\r     4 index\r        get\r    3 index\r 2 index\r       putinterval\r    pop\r    pop\r    pop\r    pop\r}ifelse\r}bind def\r/T0AddT42Mtx2\r{\r/CIDFont findresource/Metrics2 get begin def end\r}bind def\rend\r%%EndResource\rcurrentglobal true setglobal\r%%BeginFile: MMFauxFont.prc\r%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. \r%%All Rights Reserved.\ruserdict /ct_EuroDict 10 dict put\rct_EuroDict begin\r/ct_CopyFont \r{\r    { 1 index /FID ne {def} {pop pop} ifelse} forall\r} def\r/ct_GetGlyphOutline\r{\r   gsave\r   initmatrix newpath\r   exch findfont dup \r   length 1 add dict \r   begin \r             ct_CopyFont \r           /Encoding Encoding dup length array copy \r              dup\r            4 -1 roll\r              0 exch put   \r          def\r            currentdict\r   end\r   /ct_EuroFont exch definefont\r   1000 scalefont setfont\r   0 0 moveto\r   [\r       <00> stringwidth \r       <00> false charpath\r       pathbbox\r       [\r       {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall\r   grestore\r   counttomark 8 add\r}\rdef\r/ct_MakeGlyphProc\r{\r   ] cvx\r   /ct_PSBuildGlyph cvx\r   ] cvx\r} def\r/ct_PSBuildGlyph \r\r    gsave \r 8 -1 roll pop \r 7 1 roll \r        6 -2 roll ct_FontMatrix transform 6 2 roll\r        4 -2 roll ct_FontMatrix transform 4 2 roll\r        ct_FontMatrix transform \r       currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse  \r dup  9 1 roll \r {  \r            currentdict /StrokeWidth 2 copy known  \r                {   \r                   get 2 div   \r                   0 ct_FontMatrix dtransform pop\r                 5 1 roll  \r                     4 -1 roll 4 index sub   \r                       4 1 roll   \r                    3 -1 roll 4 index sub  \r                        3 1 roll   \r                    exch 4 index add exch  \r                        4 index add  \r                  5 -1 roll pop  \r                }  \r            {        \r                      pop pop \r               }  \r            ifelse  \r       }       \r    if  \r      setcachedevice  \r        ct_FontMatrix concat\r        ct_PSPathOps begin \r              exec \r  end \r   {  \r            currentdict /StrokeWidth 2 copy known  \r                        { get }  \r                      { pop pop 0 }  \r            ifelse  \r           setlinewidth stroke  \r  }  \r    {   \r       fill  \r     }  \r    ifelse  \r    grestore\r} def \r/ct_PSPathOps 4 dict dup begin \r   /m {moveto} def \r       /l {lineto} def \r       /c {curveto} def \r      /cp {closepath} def \rend \rdef \r/ct_matrix1000 [1000 0 0 1000 0 0] def\r/ct_AddGlyphProc  \r{\r   2 index findfont dup length 4 add dict \r   begin \r        ct_CopyFont \r   /CharStrings CharStrings dup length 1 add dict copy\r      begin\r         3 1 roll def  \r         currentdict \r      end \r      def\r      /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def\r      /ct_PSBuildGlyph /ct_PSBuildGlyph load def\r      /ct_PSPathOps /ct_PSPathOps load def\r      currentdict\r   end\r   definefont pop\r}\rdef\rsystemdict /languagelevel known\r{\r        /ct_AddGlyphToPrinterFont {\r            2 copy\r         ct_GetGlyphOutline 3 add -1 roll restore \r              ct_MakeGlyphProc \r              ct_AddGlyphProc\r        } def\r}\r{\r      /ct_AddGlyphToPrinterFont {\r        pop pop restore\r            Adobe_CTFauxDict /$$$FONTNAME get\r              /Euro\r          Adobe_CTFauxDict /$$$SUBSTITUTEBASE get\r                ct_EuroDict exch get\r           ct_AddGlyphProc\r        } def\r} ifelse\r/AdobeSansMM \r\r556 0 24 -19 541 703 \r  { \r     541 628 m \r     510 669 442 703 354 703 c \r     201 703 117 607 101 444 c \r     50 444 l \r      25 372 l \r      97 372 l \r      97 301 l \r      49 301 l \r      24 229 l \r      103 229 l \r     124 67 209 -19 350 -19 c \r      435 -19 501 25 509 32 c \r       509 131 l \r     492 105 417 60 343 60 c \r       267 60 204 127 197 229 c \r      406 229 l \r     430 301 l \r     191 301 l \r     191 372 l \r     455 372 l \r     479 444 l \r     194 444 l \r     201 531 245 624 348 624 c \r     433 624 484 583 509 534 c \r     cp \r    556 0 m \r       }\rct_PSBuildGlyph\r} def\r/AdobeSerifMM \r\r500 0 10 -12 484 692 \r        { \r     347 298 m \r     171 298 l \r     170 310 170 322 170 335 c \r     170 362 l \r     362 362 l \r     374 403 l \r     172 403 l \r     184 580 244 642 308 642 c \r     380 642 434 574 457 457 c \r     481 462 l \r     474 691 l \r     449 691 l \r     433 670 429 657 410 657 c \r     394 657 360 692 299 692 c \r     204 692 94 604 73 403 c \r       22 403 l \r      10 362 l \r      70 362 l \r      69 352 69 341 69 330 c \r        69 319 69 308 70 298 c \r        22 298 l \r      10 257 l \r      73 257 l \r      97 57 216 -12 295 -12 c \r       364 -12 427 25 484 123 c \r      458 142 l \r     425 101 384 37 316 37 c \r       256 37 189 84 173 257 c \r       335 257 l \r     cp \r    500 0 m \r       } \rct_PSBuildGlyph \r} def \rend          \r%%EndFile\rsetglobal\rAdobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end\r%%BeginResource: procset Adobe_AGM_Image 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{
+       currentpacking
+       true setpacking
+}if
+userdict/Adobe_AGM_Image 71 dict dup begin put
+/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def
+/nd{
+       null def
+}bind def
+/AGMIMG_&image nd
+/AGMIMG_&colorimage nd
+/AGMIMG_&imagemask nd
+/AGMIMG_mbuf()def
+/AGMIMG_ybuf()def
+/AGMIMG_kbuf()def
+/AGMIMG_c 0 def
+/AGMIMG_m 0 def
+/AGMIMG_y 0 def
+/AGMIMG_k 0 def
+/AGMIMG_tmp nd
+/AGMIMG_imagestring0 nd
+/AGMIMG_imagestring1 nd
+/AGMIMG_imagestring2 nd
+/AGMIMG_imagestring3 nd
+/AGMIMG_imagestring4 nd
+/AGMIMG_imagestring5 nd
+/AGMIMG_cnt nd
+/AGMIMG_fsave nd
+/AGMIMG_colorAry nd
+/AGMIMG_override nd
+/AGMIMG_name nd
+/AGMIMG_maskSource nd
+/AGMIMG_flushfilters nd
+/invert_image_samples nd
+/knockout_image_samples        nd
+/img nd
+/sepimg nd
+/devnimg nd
+/idximg nd
+/ds
+{
+       Adobe_AGM_Core begin
+       Adobe_AGM_Image begin
+       /AGMIMG_&image systemdict/image get def
+       /AGMIMG_&imagemask systemdict/imagemask get def
+       /colorimage where{
+               pop
+               /AGMIMG_&colorimage/colorimage ldf
+       }if
+       end
+       end
+}def
+/ps
+{
+       Adobe_AGM_Image begin
+       /AGMIMG_ccimage_exists{/customcolorimage where 
+               {
+                       pop
+                       /Adobe_AGM_OnHost_Seps where
+                       {
+                       pop false
+                       }{
+                       /Adobe_AGM_InRip_Seps where
+                               {
+                               pop false
+                               }{
+                                       true
+                               }ifelse
+                       }ifelse
+                       }{
+                       false
+               }ifelse 
+       }bdf
+       level2{
+               /invert_image_samples
+               {
+                       Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
+                       /Decode[Decode 1 get Decode 0 get]def
+               }def
+               /knockout_image_samples
+               {
+                       Operator/imagemask ne{
+                               /Decode[1 1]def
+                       }if
+               }def
+       }{      
+               /invert_image_samples
+               {
+                       {1 exch sub}currenttransfer addprocs settransfer
+               }def
+               /knockout_image_samples
+               {
+                       {pop 1}currenttransfer addprocs settransfer
+               }def
+       }ifelse
+       /img/imageormask ldf
+       /sepimg/sep_imageormask ldf
+       /devnimg/devn_imageormask ldf
+       /idximg/indexed_imageormask ldf
+       /_ctype 7 def
+       currentdict{
+               dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
+                       bind
+               }if
+               def
+       }forall
+}def
+/pt
+{
+       end
+}def
+/dt
+{
+}def
+/AGMIMG_flushfilters
+{
+       dup type/arraytype ne
+               {1 array astore}if
+       dup 0 get currentfile ne
+               {dup 0 get flushfile}if
+               {
+               dup type/filetype eq
+                       {
+                       dup status 1 index currentfile ne and
+                               {closefile}
+                               {pop}
+                       ifelse
+                       }{pop}ifelse
+               }forall
+}def
+/AGMIMG_init_common
+{
+       currentdict/T known{/ImageType/T ldf currentdict/T undef}if
+       currentdict/W known{/Width/W ldf currentdict/W undef}if
+       currentdict/H known{/Height/H ldf currentdict/H undef}if
+       currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if
+       currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if
+       currentdict/D known{/Decode/D ldf currentdict/D undef}if
+       currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if
+       currentdict/O known{
+               /Operator/O load 1 eq{
+                       /imagemask
+               }{
+                       /O load 2 eq{
+                               /image 
+                       }{
+                               /colorimage
+                       }ifelse
+               }ifelse
+               def
+               currentdict/O undef
+       }if
+       currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if
+       currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if
+       currentdict/I known{/Interpolate/I ldf currentdict/I undef}if
+       currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if
+       /DataSource load xcheck not{
+               DataSource type/arraytype eq{
+                       DataSource 0 get type/filetype eq{
+                               /_Filters DataSource def
+                               currentdict/MultipleDataSources known not{
+                                       /DataSource DataSource dup length 1 sub get def 
+                               }if
+                       }if
+               }if
+               currentdict/MultipleDataSources known not{
+                       /MultipleDataSources DataSource type/arraytype eq{
+                               DataSource length 1 gt
+                       }
+                       {false}ifelse def
+               }if
+       }if
+       /NComponents Decode length 2 div def
+       currentdict/SkipImageProc known not{/SkipImageProc{false}def}if
+}bdf
+/imageormask_sys
+{
+       begin
+               AGMIMG_init_common
+               save mark
+               level2{
+                       currentdict
+                       Operator/imagemask eq{
+                               AGMIMG_&imagemask
+                       }{
+                               use_mask{
+                                       process_mask AGMIMG_&image
+                               }{
+                                       AGMIMG_&image
+                               }ifelse
+                       }ifelse
+               }{
+                       Width Height
+                       Operator/imagemask eq{
+                               Decode 0 get 1 eq Decode 1 get 0 eq     and
+                               ImageMatrix/DataSource load
+                               AGMIMG_&imagemask
+                       }{
+                               BitsPerComponent ImageMatrix/DataSource load
+                               AGMIMG_&image
+                       }ifelse
+               }ifelse
+               currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+               cleartomark restore
+       end
+}def
+/overprint_plate
+{
+       currentoverprint{
+               0 get dup type/nametype eq{
+                       dup/DeviceGray eq{
+                               pop AGMCORE_black_plate not
+                       }{
+                               /DeviceCMYK eq{
+                                       AGMCORE_is_cmyk_sep not
+                               }if
+                       }ifelse
+               }{
+                       false exch
+                       {
+                                AGMOHS_sepink eq or
+                       }forall
+                       not
+               }ifelse
+       }{
+               pop false
+       }ifelse
+}def
+/process_mask
+{
+       level3{
+               dup begin
+               /ImageType 1 def
+               end
+               4 dict begin
+                       /DataDict exch def
+                       /ImageType 3 def
+                       /InterleaveType 3 def
+                       /MaskDict 9 dict begin
+                               /ImageType 1 def
+                               /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def
+                               /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def
+                               /ImageMatrix[Width 0 0 Height neg 0 Height]def
+                               /NComponents 1 def
+                               /BitsPerComponent 1 def
+                               /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def
+                               /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def
+                       currentdict end def
+               currentdict end
+       }if
+}def
+/use_mask
+{
+       dup/Mask known  {dup/Mask get}{false}ifelse
+}def
+/imageormask
+{
+       begin
+               AGMIMG_init_common
+               SkipImageProc{
+                       currentdict consumeimagedata
+               }
+               {
+                       save mark
+                       level2 AGMCORE_host_sep not and{
+                               currentdict
+                               Operator/imagemask eq DeviceN_PS2 not and{
+                                       imagemask
+                               }{
+                                       AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{
+                                               [/Separation/Black/DeviceGray{}]setcolorspace
+                                               /Decode[Decode 1 get Decode 0 get]def
+                                       }if
+                                       use_mask{
+                                               process_mask image
+                                       }{
+                                               DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and 
+                                               {
+                                                       Names convert_to_process not{
+                                                               2 dict begin
+                                                               /imageDict xdf
+                                                               /names_index 0 def
+                                                               gsave
+                                                               imageDict write_image_file{
+                                                                       Names{
+                                                                               dup(None)ne{
+                                                                                       [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace
+                                                                                       Operator imageDict read_image_file
+                                                                                       names_index 0 eq{true setoverprint}if
+                                                                                       /names_index names_index 1 add def
+                                                                               }{
+                                                                                       pop
+                                                                               }ifelse
+                                                                       }forall
+                                                                       close_image_file
+                                                               }if
+                                                               grestore
+                                                               end
+                                                       }{
+                                                               Operator/imagemask eq{
+                                                                       imagemask
+                                                               }{
+                                                                       image
+                                                               }ifelse
+                                                       }ifelse
+                                               }{
+                                                       Operator/imagemask eq{
+                                                               imagemask
+                                                       }{
+                                                               image
+                                                       }ifelse
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }{
+                               Width Height
+                               Operator/imagemask eq{
+                                       Decode 0 get 1 eq Decode 1 get 0 eq     and
+                                       ImageMatrix/DataSource load
+                                       /Adobe_AGM_OnHost_Seps where{
+                                               pop imagemask
+                                       }{
+                                               currentgray 1 ne{
+                                                       currentdict imageormask_sys
+                                               }{
+                                                       currentoverprint not{
+                                                               1 AGMCORE_&setgray
+                                                               currentdict imageormask_sys
+                                                       }{
+                                                               currentdict ignoreimagedata
+                                                       }ifelse                                         
+                                               }ifelse
+                                       }ifelse
+                               }{
+                                       BitsPerComponent ImageMatrix 
+                                       MultipleDataSources{
+                                               0 1 NComponents 1 sub{
+                                                       DataSource exch get
+                                               }for
+                                       }{
+                                               /DataSource load
+                                       }ifelse
+                                       Operator/colorimage eq{
+                                               AGMCORE_host_sep{
+                                                       MultipleDataSources level2 or NComponents 4 eq and{
+                                                               AGMCORE_is_cmyk_sep{
+                                                                       MultipleDataSources{
+                                                                               /DataSource DataSource 0 get xcheck
+                                                                                       {
+                                                                                       [
+                                                                                       DataSource 0 get/exec cvx
+                                                                                       DataSource 1 get/exec cvx
+                                                                                       DataSource 2 get/exec cvx
+                                                                                       DataSource 3 get/exec cvx
+                                                                                       /AGMCORE_get_ink_data cvx
+                                                                                       ]cvx
+                                                                                       }{
+                                                                                       DataSource aload pop AGMCORE_get_ink_data
+                                                                                       }ifelse def
+                                                                       }{
+                                                                               /DataSource 
+                                                                               Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
+                                                                               /DataSource load
+                                                                               filter_cmyk 0()/SubFileDecode filter def
+                                                                       }ifelse
+                                                                       /Decode[Decode 0 get Decode 1 get]def
+                                                                       /MultipleDataSources false def
+                                                                       /NComponents 1 def
+                                                                       /Operator/image def
+                                                                       invert_image_samples
+                                                                       1 AGMCORE_&setgray
+                                                                       currentdict imageormask_sys
+                                                               }{
+                                                                       currentoverprint not Operator/imagemask eq and{
+                                                                               1 AGMCORE_&setgray
+                                                                               currentdict imageormask_sys
+                                                                       }{
+                                                                               currentdict ignoreimagedata
+                                                                       }ifelse
+                                                               }ifelse
+                                                       }{      
+                                                               MultipleDataSources NComponents AGMIMG_&colorimage                                              
+                                                       }ifelse
+                                               }{
+                                                       true NComponents colorimage
+                                               }ifelse
+                                       }{
+                                               Operator/image eq{
+                                                       AGMCORE_host_sep{
+                                                               /DoImage true def
+                                                               currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse
+                                                               {
+                                                                       AGMCORE_black_plate not Operator/imagemask ne and{
+                                                                               /DoImage false def
+                                                                               currentdict ignoreimagedata
+                                                                       }if
+                                                               }if
+                                                               1 AGMCORE_&setgray
+                                                               DoImage
+                                                                       {currentdict imageormask_sys}if
+                                                       }{
+                                                               use_mask{
+                                                                       process_mask image
+                                                               }{
+                                                                       image
+                                                               }ifelse
+                                                       }ifelse
+                                               }{
+                                                       Operator/knockout eq{
+                                                               pop pop pop pop pop
+                                                               currentcolorspace overprint_plate not{
+                                                                       knockout_unitsq
+                                                               }if
+                                                       }if
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+                       cleartomark restore
+               }ifelse
+               currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+}def
+/sep_imageormask
+{
+       /sep_colorspace_dict AGMCORE_gget begin
+       CSA map_csa
+       begin
+       AGMIMG_init_common
+       SkipImageProc{
+               currentdict consumeimagedata
+       }{
+               save mark 
+               AGMCORE_avoid_L2_sep_space{
+                       /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
+               }if
+               AGMIMG_ccimage_exists 
+               MappedCSA 0 get/DeviceCMYK eq and
+               currentdict/Components known and 
+               Name()ne and 
+               Name(All)ne and 
+               Operator/image eq and
+               AGMCORE_producing_seps not and
+               level2 not and
+               {
+                       Width Height BitsPerComponent ImageMatrix 
+                       [
+                       /DataSource load/exec cvx
+                       {
+                               0 1 2 index length 1 sub{
+                                       1 index exch
+                                       2 copy get 255 xor put
+                               }for
+                       }/exec cvx
+                       ]cvx bind
+                       MappedCSA 0 get/DeviceCMYK eq{
+                               Components aload pop
+                       }{
+                               0 0 0 Components aload pop 1 exch sub
+                       }ifelse
+                       Name findcmykcustomcolor
+                       customcolorimage
+               }{
+                       AGMCORE_producing_seps not{
+                               level2{
+                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{
+                                               [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt
+                                               /sep_tint AGMCORE_gget setcolor
+                                       }if
+                                       currentdict imageormask
+                               }{
+                                       currentdict
+                                       Operator/imagemask eq{
+                                               imageormask
+                                       }{
+                                               sep_imageormask_lev1
+                                       }ifelse
+                               }ifelse
+                       }{
+                               AGMCORE_host_sep{
+                                       Operator/knockout eq{
+                                               currentdict/ImageMatrix get concat
+                                               knockout_unitsq
+                                       }{
+                                               currentgray 1 ne{
+                                                       AGMCORE_is_cmyk_sep Name(All)ne and{
+                                                               level2{
+                                                                       Name AGMCORE_IsSeparationAProcessColor 
+                                                                       {
+                                                                               Operator/imagemask eq{
+                                                                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+                                                                                               /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor
+                                                                                       }if
+                                                                               }{
+                                                                                       invert_image_samples
+                                                                               }ifelse
+                                                                       }{
+                                                                               //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+                                                                                       [/Separation Name[/DeviceGray]
+                                                                                       {
+                                                                                               sep_colorspace_proc AGMCORE_get_ink_data
+                                                                                               1 exch sub
+                                                                                       }bind
+                                                                                       ]AGMCORE_&setcolorspace
+                                                                                       /sep_tint AGMCORE_gget AGMCORE_&setcolor
+                                                                               }if
+                                                                       }ifelse
+                                                                       currentdict imageormask_sys
+                                                               }{
+                                                                       currentdict
+                                                                       Operator/imagemask eq{
+                                                                               imageormask_sys
+                                                                       }{
+                                                                               sep_image_lev1_sep
+                                                                       }ifelse
+                                                               }ifelse
+                                                       }{
+                                                               Operator/imagemask ne{
+                                                                       invert_image_samples
+                                                               }if
+                                                               currentdict imageormask_sys
+                                                       }ifelse
+                                               }{
+                                                       currentoverprint not Name(All)eq or Operator/imagemask eq and{
+                                                               currentdict imageormask_sys 
+                                                               }{
+                                                               currentoverprint not
+                                                                       {
+                                                                       gsave 
+                                                                       knockout_unitsq
+                                                                       grestore
+                                                                       }if
+                                                               currentdict consumeimagedata 
+                                                       }ifelse
+                                               }ifelse
+                                       }ifelse
+                               }{
+                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+                                               currentcolorspace 0 get/Separation ne{
+                                                       [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt
+                                                       /sep_tint AGMCORE_gget setcolor
+                                               }if
+                                       }if
+                                       currentoverprint 
+                                       MappedCSA 0 get/DeviceCMYK eq and 
+                                       Name AGMCORE_IsSeparationAProcessColor not and
+                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse 
+                                       Name(All)ne and{
+                                               imageormask_l2_overprint
+                                       }{
+                                               currentdict imageormask
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+               cleartomark restore
+       }ifelse
+       currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+       end
+}def
+/colorSpaceElemCnt
+{
+       mark currentcolor counttomark dup 2 add 1 roll cleartomark
+}bdf
+/devn_sep_datasource
+{
+       1 dict begin
+       /dataSource xdf
+       [
+               0 1 dataSource length 1 sub{
+                       dup currentdict/dataSource get/exch cvx/get cvx/exec cvx
+                       /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx
+               }for
+       ]cvx bind
+       end
+}bdf           
+/devn_alt_datasource
+{
+       11 dict begin
+       /convProc xdf
+       /origcolorSpaceElemCnt xdf
+       /origMultipleDataSources xdf
+       /origBitsPerComponent xdf
+       /origDecode xdf
+       /origDataSource xdf
+       /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def
+       /DataSource origMultipleDataSources
+               {
+                       [
+                       BitsPerComponent 8 idiv origDecode length 2 idiv mul string
+                       0 1 origDecode length 2 idiv 1 sub
+                               {
+                               dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch
+                               origDataSource exch get 0()/SubFileDecode filter
+                               BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx
+                               }for 
+                       ]bind cvx
+               }{origDataSource}ifelse 0()/SubFileDecode filter def            
+       [
+               origcolorSpaceElemCnt string
+               0 2 origDecode length 2 sub
+                       {
+                       dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div
+                       1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx
+                       }for
+               /convProc load/exec cvx
+               origcolorSpaceElemCnt 1 sub -1 0
+                       {
+                       /dup cvx 2/add cvx/index cvx
+                       3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx
+                       }for
+       ]bind cvx 0()/SubFileDecode filter
+       end
+}bdf
+/devn_imageormask
+{
+       /devicen_colorspace_dict AGMCORE_gget begin
+       CSA map_csa
+       2 dict begin
+       dup
+       /srcDataStrs[3 -1 roll begin
+               AGMIMG_init_common
+               currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
+               {
+                       Width Decode length 2 div mul cvi
+                       {
+                               dup 65535 gt{1 add 2 div cvi}{exit}ifelse
+                       }loop
+                       string
+               }repeat
+               end]def
+       /dstDataStr srcDataStrs 0 get length string def
+       begin
+       AGMIMG_init_common
+       SkipImageProc{
+               currentdict consumeimagedata
+       }{
+               save mark 
+               AGMCORE_producing_seps not{
+                       level3 not{
+                               Operator/imagemask ne{
+                                       /DataSource[[
+                                               DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+                                               colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
+                                               devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def                              
+                                       /MultipleDataSources true def
+                                       /Decode colorSpaceElemCnt[exch{0 1}repeat]def
+                               }if
+                       }if
+                       currentdict imageormask
+               }{
+                       AGMCORE_host_sep{
+                               Names convert_to_process{
+                                       CSA get_csa_by_name 0 get/DeviceCMYK eq{
+                                               /DataSource
+                                                       Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
+                                                       DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+                                                       4/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
+                                                       devn_alt_datasource
+                                               filter_cmyk 0()/SubFileDecode filter def
+                                               /MultipleDataSources false def
+                                               /Decode[1 0]def
+                                               /DeviceGray setcolorspace
+                                               currentdict imageormask_sys
+                                       }{
+                                               AGMCORE_report_unsupported_color_space
+                                               AGMCORE_black_plate{
+                                                       /DataSource
+                                                               DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+                                                               CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get
+                                                               devn_alt_datasource
+                                                       /MultipleDataSources false def
+                                                       /Decode colorSpaceElemCnt[exch{0 1}repeat]def
+                                                       currentdict imageormask_sys
+                                               }{
+                                                       gsave 
+                                                       knockout_unitsq
+                                                       grestore
+                                                       currentdict consumeimagedata 
+                                               }ifelse
+                                       }ifelse
+                               }
+                               {       
+                                       /devicen_colorspace_dict AGMCORE_gget/names_index known{
+                                               Operator/imagemask ne{
+                                                       MultipleDataSources{
+                                                               /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def
+                                                               /MultipleDataSources false def
+                                                       }{
+                                                               /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def
+                                                       }ifelse
+                                                       invert_image_samples
+                                               }if
+                                               currentdict imageormask_sys
+                                       }{
+                                               currentoverprint not Operator/imagemask eq and{
+                                                       currentdict imageormask_sys 
+                                                       }{
+                                                       currentoverprint not
+                                                               {
+                                                               gsave 
+                                                               knockout_unitsq
+                                                               grestore
+                                                               }if
+                                                       currentdict consumeimagedata 
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }{
+                               currentdict imageormask
+                       }ifelse
+               }ifelse
+               cleartomark restore
+       }ifelse
+       currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+       end
+       end
+}def
+/imageormask_l2_overprint
+{
+       currentdict
+       currentcmykcolor add add add 0 eq{
+               currentdict consumeimagedata
+       }{
+               level3{                 
+                       currentcmykcolor 
+                       /AGMIMG_k xdf 
+                       /AGMIMG_y xdf 
+                       /AGMIMG_m xdf 
+                       /AGMIMG_c xdf
+                       Operator/imagemask eq{
+                               [/DeviceN[
+                               AGMIMG_c 0 ne{/Cyan}if
+                               AGMIMG_m 0 ne{/Magenta}if
+                               AGMIMG_y 0 ne{/Yellow}if
+                               AGMIMG_k 0 ne{/Black}if
+                               ]/DeviceCMYK{}]setcolorspace
+                               AGMIMG_c 0 ne{AGMIMG_c}if
+                               AGMIMG_m 0 ne{AGMIMG_m}if
+                               AGMIMG_y 0 ne{AGMIMG_y}if
+                               AGMIMG_k 0 ne{AGMIMG_k}if
+                               setcolor                        
+                       }{      
+                               /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
+                               [/Indexed                               
+                                       [
+                                               /DeviceN[
+                                                       AGMIMG_c 0 ne{/Cyan}if
+                                                       AGMIMG_m 0 ne{/Magenta}if
+                                                       AGMIMG_y 0 ne{/Yellow}if
+                                                       AGMIMG_k 0 ne{/Black}if
+                                               ]
+                                               /DeviceCMYK{
+                                                       AGMIMG_k 0 eq{0}if
+                                                       AGMIMG_y 0 eq{0 exch}if
+                                                       AGMIMG_m 0 eq{0 3 1 roll}if
+                                                       AGMIMG_c 0 eq{0 4 1 roll}if                                             
+                                               }
+                                       ]
+                                       255
+                                       {
+                                               255 div 
+                                               mark exch
+                                               dup     dup dup
+                                               AGMIMG_k 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop              
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               AGMIMG_y 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop              
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               AGMIMG_m 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop              
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               AGMIMG_c 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop               
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               counttomark 1 add -1 roll pop
+                                       }
+                               ]setcolorspace
+                       }ifelse
+                       imageormask_sys
+               }{
+       write_image_file{
+               currentcmykcolor
+               0 ne{
+                       [/Separation/Black/DeviceGray{}]setcolorspace
+                       gsave
+                       /Black
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+               0 ne{
+                       [/Separation/Yellow/DeviceGray{}]setcolorspace
+                       gsave
+                       /Yellow
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+               0 ne{
+                       [/Separation/Magenta/DeviceGray{}]setcolorspace
+                       gsave
+                       /Magenta
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+               0 ne{
+                       [/Separation/Cyan/DeviceGray{}]setcolorspace
+                       gsave
+                       /Cyan 
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+                               close_image_file
+                       }{
+                               imageormask
+                       }ifelse
+               }ifelse
+       }ifelse
+}def
+/indexed_imageormask
+{
+       begin
+               AGMIMG_init_common
+               save mark 
+               currentdict
+               AGMCORE_host_sep{
+                       Operator/knockout eq{
+                               /indexed_colorspace_dict AGMCORE_gget dup/CSA known{
+                                       /CSA get get_csa_by_name
+                               }{
+                                       /Names get
+                               }ifelse
+                               overprint_plate not{
+                                       knockout_unitsq
+                               }if
+                       }{
+                               Indexed_DeviceN{
+                                       /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{
+                                               indexed_image_lev2_sep
+                                       }{
+                                               currentoverprint not{
+                                                       knockout_unitsq
+                                               }if
+                                               currentdict consumeimagedata
+                                       }ifelse
+                               }{
+                                       AGMCORE_is_cmyk_sep{
+                                               Operator/imagemask eq{
+                                                       imageormask_sys
+                                               }{
+                                                       level2{
+                                                               indexed_image_lev2_sep
+                                                       }{
+                                                               indexed_image_lev1_sep
+                                                       }ifelse
+                                               }ifelse
+                                       }{
+                                               currentoverprint not{
+                                                       knockout_unitsq
+                                               }if
+                                               currentdict consumeimagedata
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }{
+                       level2{
+                               Indexed_DeviceN{
+                                       /indexed_colorspace_dict AGMCORE_gget begin
+                               }{
+                                       /indexed_colorspace_dict AGMCORE_gget dup null ne
+                                       {
+                                               begin
+                                               currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse
+                                               get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and
+                                               AGMCORE_in_rip_sep and{
+                                                       [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup]
+                                                       setcolorspace
+                                               }if
+                                               end
+                                       }
+                                       {pop}ifelse
+                               }ifelse
+                               imageormask
+                               Indexed_DeviceN{
+                                       end
+                               }if
+                       }{
+                               Operator/imagemask eq{
+                                       imageormask
+                               }{
+                                       indexed_imageormask_lev1
+                               }ifelse
+                       }ifelse
+               }ifelse
+               cleartomark restore
+       currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+}def
+/indexed_image_lev2_sep
+{
+       /indexed_colorspace_dict AGMCORE_gget begin
+       begin
+               Indexed_DeviceN not{
+                       currentcolorspace 
+                       dup 1/DeviceGray put
+                       dup 3
+                       currentcolorspace 2 get 1 add string
+                       0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub
+                       {
+                       dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put
+                       }for 
+                       put     setcolorspace
+               }if
+               currentdict 
+               Operator/imagemask eq{
+                       AGMIMG_&imagemask
+               }{
+                       use_mask{
+                               process_mask AGMIMG_&image
+                       }{
+                               AGMIMG_&image
+                       }ifelse
+               }ifelse
+       end end
+}def
+ /OPIimage
+ {
+       dup type/dicttype ne{
+               10 dict begin
+                       /DataSource xdf
+                       /ImageMatrix xdf
+                       /BitsPerComponent xdf
+                       /Height xdf
+                       /Width xdf
+                       /ImageType 1 def
+                       /Decode[0 1 def]
+                       currentdict
+               end
+       }if
+       dup begin
+               /NComponents 1 cdndf
+               /MultipleDataSources false cdndf
+               /SkipImageProc{false}cdndf
+               /Decode[
+                               0 
+                               currentcolorspace 0 get/Indexed eq{
+                                       2 BitsPerComponent exp 1 sub
+                               }{
+                                       1
+                               }ifelse
+               ]cdndf
+               /Operator/image cdndf
+       end
+       /sep_colorspace_dict AGMCORE_gget null eq{
+               imageormask
+       }{
+               gsave
+               dup begin invert_image_samples end
+               sep_imageormask
+               grestore
+       }ifelse
+ }def
+/cachemask_level2
+{
+       3 dict begin
+       /LZWEncode filter/WriteFilter xdf
+       /readBuffer 256 string def
+       /ReadFilter
+               currentfile
+               0(%EndMask)/SubFileDecode filter
+               /ASCII85Decode filter
+               /RunLengthDecode filter
+       def
+       {
+               ReadFilter readBuffer readstring exch
+               WriteFilter exch writestring
+               not{exit}if
+       }loop
+       WriteFilter closefile
+       end
+}def
+/spot_alias
+{
+       /mapto_sep_imageormask 
+       {
+               dup type/dicttype ne{
+                       12 dict begin
+                               /ImageType 1 def
+                               /DataSource xdf
+                               /ImageMatrix xdf
+                               /BitsPerComponent xdf
+                               /Height xdf
+                               /Width xdf
+                               /MultipleDataSources false def
+               }{
+                       begin
+               }ifelse
+                               /Decode[/customcolor_tint AGMCORE_gget 0]def
+                               /Operator/image def
+                               /SkipImageProc{false}def
+                               currentdict 
+                       end
+               sep_imageormask
+       }bdf
+       /customcolorimage
+       {
+               Adobe_AGM_Image/AGMIMG_colorAry xddf
+               /customcolor_tint AGMCORE_gget
+               <<
+                       /Name AGMIMG_colorAry 4 get
+                       /CSA[/DeviceCMYK]
+                       /TintMethod/Subtractive
+                       /TintProc null
+                       /MappedCSA null
+                       /NComponents 4 
+                       /Components[AGMIMG_colorAry aload pop pop]
+               >>
+               setsepcolorspace
+               mapto_sep_imageormask
+       }ndf
+       Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put
+       /customcolorimage
+       {
+               Adobe_AGM_Image/AGMIMG_override false put
+               current_spot_alias{dup 4 get map_alias}{false}ifelse
+               {
+                       false set_spot_alias
+                       /customcolor_tint AGMCORE_gget exch setsepcolorspace
+                       pop
+                       mapto_sep_imageormask
+                       true set_spot_alias
+               }{
+                       //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec
+               }ifelse                 
+       }bdf
+}def
+/snap_to_device
+{
+       6 dict begin
+       matrix currentmatrix
+       dup 0 get 0 eq 1 index 3 get 0 eq and
+       1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop
+       {
+               1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def
+               0 0 transform
+               AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
+               AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
+               itransform/AGMIMG_llY exch def/AGMIMG_llX exch def
+               1 1 transform
+               AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
+               AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
+               itransform/AGMIMG_urY exch def/AGMIMG_urX exch def                      
+               [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat
+       }{
+       }ifelse
+       end
+}def
+level2 not{
+       /colorbuf
+       {
+               0 1 2 index length 1 sub{
+                       dup 2 index exch get 
+                       255 exch sub 
+                       2 index 
+                       3 1 roll 
+                       put
+               }for
+       }def
+       /tint_image_to_color
+       {
+               begin
+                       Width Height BitsPerComponent ImageMatrix 
+                       /DataSource load
+               end
+               Adobe_AGM_Image begin
+                       /AGMIMG_mbuf 0 string def
+                       /AGMIMG_ybuf 0 string def
+                       /AGMIMG_kbuf 0 string def
+                       {
+                               colorbuf dup length AGMIMG_mbuf length ne
+                                       {
+                                       dup length dup dup
+                                       /AGMIMG_mbuf exch string def
+                                       /AGMIMG_ybuf exch string def
+                                       /AGMIMG_kbuf exch string def
+                                       }if
+                               dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
+                       }
+                       addprocs
+                       {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage        
+               end
+       }def                    
+       /sep_imageormask_lev1
+       {
+               begin
+                       MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
+                               {
+                                       255 mul round cvi GrayLookup exch get
+                               }currenttransfer addprocs settransfer
+                               currentdict imageormask
+                       }{
+                               /sep_colorspace_dict AGMCORE_gget/Components known{
+                                       MappedCSA 0 get/DeviceCMYK eq{
+                                               Components aload pop
+                                       }{
+                                               0 0 0 Components aload pop 1 exch sub
+                                       }ifelse
+                                       Adobe_AGM_Image/AGMIMG_k xddf 
+                                       Adobe_AGM_Image/AGMIMG_y xddf 
+                                       Adobe_AGM_Image/AGMIMG_m xddf 
+                                       Adobe_AGM_Image/AGMIMG_c xddf 
+                                       AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
+                                               {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer
+                                               currentdict imageormask
+                                       }{
+                                               currentcolortransfer
+                                               {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll
+                                               {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll
+                                               {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll
+                                               {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll
+                                               setcolortransfer
+                                               currentdict tint_image_to_color
+                                       }ifelse
+                               }{
+                                       MappedCSA 0 get/DeviceGray eq{
+                                               {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer
+                                               currentdict imageormask
+                                       }{
+                                               MappedCSA 0 get/DeviceCMYK eq{
+                                                       currentcolortransfer
+                                                       {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll
+                                                       setcolortransfer 
+                                                       currentdict tint_image_to_color
+                                               }{
+                                                       currentcolortransfer
+                                                       {pop 1}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll
+                                                       setcolortransfer 
+                                                       currentdict tint_image_to_color
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               end
+       }def
+       /sep_image_lev1_sep
+       {
+               begin
+                       /sep_colorspace_dict AGMCORE_gget/Components known{
+                               Components aload pop
+                               Adobe_AGM_Image/AGMIMG_k xddf 
+                               Adobe_AGM_Image/AGMIMG_y xddf 
+                               Adobe_AGM_Image/AGMIMG_m xddf 
+                               Adobe_AGM_Image/AGMIMG_c xddf 
+                               {AGMIMG_c mul 1 exch sub}
+                               {AGMIMG_m mul 1 exch sub}
+                               {AGMIMG_y mul 1 exch sub}
+                               {AGMIMG_k mul 1 exch sub}
+                       }{
+                               {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
+                               {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
+                               {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
+                               {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
+                       }ifelse
+                       AGMCORE_get_ink_data currenttransfer addprocs settransfer
+                       currentdict imageormask_sys
+               end
+       }def
+       /indexed_imageormask_lev1
+       {
+               /indexed_colorspace_dict AGMCORE_gget begin
+               begin
+                       currentdict
+                       MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
+                               {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer
+                               imageormask
+                       }{
+                               MappedCSA 0 get/DeviceGray eq{
+                                       {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer
+                                       imageormask
+                               }{
+                                       MappedCSA 0 get/DeviceCMYK eq{
+                                               currentcolortransfer
+                                               {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               {4 mul HiVal mul round cvi               Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               setcolortransfer 
+                                               tint_image_to_color
+                                       }{
+                                               currentcolortransfer
+                                               {pop 1}exch addprocs 4 1 roll
+                                               {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll
+                                               {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll
+                                               {3 mul HiVal mul round cvi              Lookup exch get HiVal div}exch addprocs 4 1 roll
+                                               setcolortransfer 
+                                               tint_image_to_color
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               end end
+       }def
+       /indexed_image_lev1_sep
+       {
+               /indexed_colorspace_dict AGMCORE_gget begin
+               begin
+                       {4 mul HiVal mul round cvi               Lookup exch get HiVal div 1 exch sub}
+                       {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
+                       {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
+                       {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
+                       AGMCORE_get_ink_data currenttransfer addprocs settransfer
+                       currentdict imageormask_sys
+               end end
+       }def
+}if
+end
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndProlog
+%%BeginSetup
+Adobe_AGM_Utils begin
+2 2010 Adobe_AGM_Core/ds gx
+Adobe_CoolType_Core/ds get exec\rAdobe_AGM_Image/ds gx
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndSetup
+%%Page: 18 1
+%%EndPageComments
+%%BeginPageSetup
+%ADOBeginClientInjection: PageSetup Start "AI11EPS"
+%AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0\r
+%ADOEndClientInjection: PageSetup Start "AI11EPS"
+Adobe_AGM_Utils begin
+Adobe_AGM_Core/ps gx
+Adobe_AGM_Utils/capture_cpd gx
+Adobe_CoolType_Core/ps get exec\rAdobe_AGM_Image/ps gx
+%ADOBeginClientInjection: PageSetup End "AI11EPS"
+/currentdistillerparams where\r{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse\r{ userdict /AI11_PDFMark5 /cleartomark load put\ruserdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put}\r{ userdict /AI11_PDFMark5 /pdfmark load put\ruserdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse\r[/NamespacePush AI11_PDFMark5\r[/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5\r[{ai_metadata_stream_123}\rcurrentfile 0 (%  &&end XMP packet marker&&)\r/SubFileDecode filter AI11_ReadMetadata_PDFMark5\r<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41        ">
+   <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/postscript</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">diagramas_01</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:CreatorTool>Adobe Illustrator CS4</xmp:CreatorTool>
+         <xmp:CreateDate>2011-07-07T15:53:09-03:00</xmp:CreateDate>
+         <xmp:ModifyDate>2011-07-07T15:53:09-03:00</xmp:ModifyDate>
+         <xmp:MetadataDate>2011-07-07T15:53:09-03:00</xmp:MetadataDate>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>156</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAnAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9Jy6VpkUKOLFpy1AVjIB&#xA;G1eR5ugp9OAsoi+rVjYaPeQmUWTQ0d04SmjVQ8WPws37W2FiluqeXNN1S5NrFZW4NoVLSXaO6uJR&#xA;yBiMcqNtxPLkN/oxVU0bQ7WzEem3lpAXpJJFLaq0UAjD0CFZJpJC45Dk3Qk9umKo+fTtIhngiNmW&#xA;E7MvqqRxQqpf46uG3ANKA4qiBo+mxMkkcAV0ZSrVOxqPfFVC503To7c3H1JrmQ8SyRkczzYAt8bo&#xA;tBXkd+mAllCNmrpbZ2Gk3Pqg2LQNE/psspFSeIbbg79m74WKXa15b0rULhLKKxgaWFRMZ7hXeIBm&#xA;KhAUljcMzJ4UoMVU9G8saZpE7Wr6fbf6U7MklmjRIiIASZvVmdmYs5NVHffxKqbXem6RbLGTZmQP&#xA;IkZ4MPh9Q8QzcnXau22/tiqs2i6UqF1gWoFVILfR3xV0+maeyy3D2pmkqzFVJ5MQTsKlRXFIFlC2&#xA;VnpNzLLE2nvbvGFakpX4g/KhXhI/8h64qRugtf8ALel3j29pDZ25uDWVZ7mNpoljjZRMtElhcMwY&#xA;AHpXrihDad5P0jS7xZZtMtWuLqRYkayVoyvwtyd/VmNfhX9kVoO+Kp1e6fo9rbNObMzUKhY4z8Tc&#xA;mCinJlXq3jiquND0k9Ldfvb+uKu/RWnzkyTQh3ooqSegUeBxVQOnaOL0Wpsz8UZlWao4HiwUr9rl&#xA;yHIfs098VS3zD5Z0OYRomnwvfT1ht7mZDLFGwUyfvVEsLlaAn4TiqAPkfSLN3nv9LtLuJ5F9KGzj&#xA;eKQMSgSvrXHDiTsVFOo674qyK60zRbW0luDahkhRnKIdyEBJAqyjoPHFVlrp+nTyMraZJAFB+OUr&#xA;SoPT4ZGP4YLZcO12ijpljOIxLCH9OJFSpOwFdtjhYoefTtHhuIITZkicsvqgjghVC9GqwO4BpQHF&#xA;UNrug6E1iUm09bjk6pGv2gjyHgjkF4zTk3Zq4qkUfkHTLOOO51HTdLuYLdDI6WlvJC5kZW9WRDLc&#xA;Mi7tXc1413xVlUej6S0KubTgSoJiY/EpIrxNGK17dcVQljb6Xeemy6XNHFKodZZCnEBl5CvGVm39&#xA;hgtkI7XacWsMUMIiiXjGpbivh8ROFiq4qx7XPLNxqOjzWdrfSxC4BLxysJY2ZmVhUyLI6qnH4QhX&#xA;FWG2vkkjUJ4tVvI9MiiEjqyNFHJIZS8ZcbFSjKgJrRvlirrHyt5auLpoV8y2wMMqAm39BZJPTiUj&#xA;i3NxtyZTUNtX54qrN5G0dZ4rVdch9No3/elYvUCJIrBOYcHkeda+IrTtiqjceRVm1K4trC+huI5y&#xA;DDcMUkdHmgYOXou3+85pxPSgxVneleXbTTYYPRMiOiossazStCz0VWbgxoTt4Yqs1by/LfaXeW1v&#xA;fT27X0bpIGYSxkPGycOMok4JVqnhQ4qwaDyTMdTtW1C4XTIZC1xJITFHM5ESii7UqPrDI3L3p2OK&#xA;SKWR+V/LL3cloPM1odlHrKIQ59SVz6auJNnRlU996VXcDFCMuPJOkG89JNdhYTLPKssqxO6luCMC&#xA;wdPtBj044qoXHkmGK8hh0/Uo71GWNjJKY5JFljZIVeirQCso6b9etcVZjoflO10uxhBdxdRp++aG&#xA;aZYpCCSKoWoQK7AjFUxl0t5JZLiC9ubaZ2oeDh4wqncCKUPGOVOoWv44q82tvIV5Dc2kF7NHY26o&#xA;rNdt6cbP6P7pVSoryA+McxSlB40UkUlx0bRLq7vNNt9as6xG4j9a5ZVdVlkC8WIUbsZyvUb79KYA&#xA;bZTgY82Q3fkrSlu4nj16OQzOo5zrBIyPHHI/qEhkH2vYYWCDv/I9pC9lDZ6nFfLMwt5IpDG3EySF&#xA;xwQBqIp8ST7nuqzHy75Oh06FXuZGa/8AUZ5JreWaNGBINCgYClRUinX54qmc2mm5cTR3dxazKqqj&#xA;Qv8ACNgamJw8TGhIqyn7wMVef6j5Ev4L6KKWeJbW4LK9+/BAq8mlCFqK3NiKii8a/diq3UfKnliG&#xA;7eAeY7YS3LO9JfQkkhVrc8pD8anifR/yRTbtiq3XvKWlwQpeRaxb3NrEirKJ2jkNHkRaoqq/wog2&#xA;6/1BLKMSTQQlx5aSPRLS6jvlurmWWV7q0Jj4oJi5IWNlDdWNamlTt8O4bUxINM08veRlsEmN3M3r&#xA;uy+nJaSywUjQcQpCFB026eGFin1zp4u/TIuJ7eSJAY3gkKbnoWXdHoRUBgR7UrirA/MXknVEu2uR&#xA;OlxHcTEPdzCMGITcUZ5Sqx/a6fux4dOuKqN75T8t2ssBfzBAbib6tGsEzQyuXSThzSpU0UTdl9z1&#xA;xVu48laCdIjmi8wRXIt4mehELxSARtsi8iVqxqfibFVmpeS7Oz06eaz1iO6uPWikS2UxRx8UCJ9g&#xA;eoS3FF6EbDp4qp15V8jCFReXUnFJoE+qi2d4JIwxEhr6ZVa1PbxPXFWaW0YjhWNSxCVUFiWYgGm7&#xA;NUk+5xVUxVbF/dp8h+rFULLq1jFcfV3dhNyVAgjkJJalCKKfh3FW6Cor1GC2RiQAe9K9XsLOyKXF&#xA;voVpcpED+84gOhc8TxRIZWNe5GFiq2VhZ3GnJdaro9pbyoBN6MS/WQtEDVUmGJywJIpwriqYWVtp&#xA;bJHdWlvHHzFUcRCNqH2KqwxVEyfZHzX9YxV0X92nyH6sVU1vIWWZhz425IkrG43UVPGq/H/sa4pA&#xA;s0kd2mlT3Sx2GkWl9cmtzP6qeiUeuzMxiceoeR2Yhu+KkUaVIbS0mk+q6rotrC0p/cCJDco3End3&#xA;9GNYzQA7+OKExe20m0eKT6oiOzhI2ig5EM3T7CkqP8o7Yqi5f7t/kf1Yq6P7J+bfrOKrY7mKSeWF&#xA;eXOHj6lUZV+IVHFiAre/EmnfFUg1B9LvRHLYaVbalfXLxySJdIbdgkZU85GeGRldAFKK4BO3Qb4A&#xA;bZTgYmiqC0tnZYNU0S1jgmKqhjX6yC5IorhYVCj/ACiaYWKYT2mjWUX1h7SJViKlTHBzYNyAXiqK&#xA;zVrToMVR+KqcH2fu/wCIjFXfWYvrP1b4vV4ep9huPGvH7dOFa9q1xVLdcttNcD1tOgvry5X6vGk0&#xA;dQ6V+JHl9OTitGY77Yqg2QROP0joVrFZOrB5Ya3L8uir6SQVIYVqa7beOyqMii8t/V5HhtITb2y1&#xA;LJb1XiAf7uifGNv2K4LZGJAvvTWN1dFda8WAYVBBod9waEYWKyLt/qL/ABxV0lzFHPFA3L1JuXCi&#xA;My/AKnkwBVf9kRXFUHrCaeIVuLq0jupo6pbB4/UId+i8gkhQMVFWpTFUsS2e0WFZPL9lDYR0SRoW&#xA;9Vo4wtF4RJb1feg4im2/bdVGWVv5akHpWllDxRS5AtuKjepFSgHKp3X7Ve2C2XCatMbOa3mtY5Lc&#xA;FYCv7sFGjoo2HwMFI+7CxVI/sn5t+s4quxVDTwTzWqJBcvav8J9VFRjQdRSRWG/yxVhHmSDzempx&#xA;q81vcrO0L26crmBPUidVHGNLpBtJIhNSa9f2cVWTeWPOy6f611qaSx/V5heWk0t1xAqrAKYZkLni&#xA;pWrN0+ZxVu90Lz/aWpvG1JJ/SklkltIpLrh6Jjk3DvPFJt8NF57HeuKozypofmQo0tzey2VqsMA0&#xA;xbeR5Iyv7wtziunuSPhdR1GwG22KsyCskKIzmRl4BpGoCxBG54gDf2GKpRq1h5gk0u8TTb8Ce4jc&#xA;QrMgHpgxsFETxGJlbmR8bFqYqxCDSvOs+s/VY7pLJnmaW/nikuWpwhC0KSXUqtVZkpQdhv8ADTFV&#xA;G10zz5cTzRwzoLkARS3qz3PqBFuJQpo1yUbg8bCnp0IqB1rikikxn8tedheemNRt7iYrcPbXMkl9&#xA;G6o3BGFI5Qi/aHEcWpSuKELeaN53s7iG2mvF1ISejMssslyiCWJkUKEjuY9vVdT8QNTvtQYqynRN&#xA;H1i3sIZL7Ubj6zwJurdnSaMkE0Cs6s4FPBqnxxVMJbXVvVkmtb5VVmotvPErxKAfiIKGOTkabVan&#xA;t4KvP7XSvPjahBYtcLDfmKFry5Wa5dxFGCgLcrl0b42JKhRXc7E4q6fSfPTXM9nDcLc38C3UMN2Z&#xA;7mOTg5Vq1+tBA3CaMj92QKDwxTSpeWPnGLWlskvYdSuYzHLCXluYikhjkJPBLqPitKqepod+oqLT&#xA;wGrrZq+0TzzbQ2kd1efXI7oiIxyS3AEcrS84xyiuImcgLTmfuG+Fiyny9o2vpCLjU7+eG7aRmktU&#xA;kWaDgSDxX1hK4H+yqBtiqZzWupu4ls70QFVUCCSJZYiaCrNQpJ0PZx29wVWB3dj53XUobQzR/Xpx&#xA;IkM6zXHqrF6nqO9DcmNa8F24b/Z6CuKta7pvnHTDLLPepPEJWNleTz3KcXe2oaKlzHxpxdV+Bjv3&#xA;5YkpjEk0Ba/UtJ85g2am9F/FPGklGluFCv6sSpRobmJWKFlblXc7jFSCGtR0jz3baSbm9u1njkeY&#xA;Xlk0lwY44pWZVXklwkjj95sKmi7bkbqGQ+X9E80gTSalqE1pLyRYY4ZPXjKKvEmlybhgW2r8R33x&#xA;VPbm2vZvTa0uzatGgJXgkiOf2Q4YcuII34sp9++KsG16086Q3685YZnnuHWwYS3MR5yp6dURboKg&#xA;VWO5U0/2WKq9z5a85RKkk+qRXUTm1+C5ku1KTiUgUWCaNacnUkkmpHsMVQur6F54tdOgFxqC3wkW&#xA;Rbq29S59PisLOV5iaF35UP2j0FDU9VVSXRvzDt7G5vZLwAxSqy2IlnZTDHGvNvUNzz34fZ5/aJNa&#xA;HZVHeVtF8zsqvc3b2NmtugsRbSPIhBPIco7p7kigNOo2psKYqzS2VkhVGcyMtQ0jUBYg9TxAG/sM&#xA;VVMVWxf3afIfqxVjPmnTrbUL6KKfTtRnAiZfrNoYPRoSBxYSODy+I0+Htv2xVGW3lTy+9nGrWLKr&#xA;IOUUzuXoRuHo7Cvjiq+LynoEa+kLZiFFeTyysdyepLE4qqHU5bMC1h0i9kihpFGyegVKKQgYF5ga&#xA;U333piqYLIZII5CjRl+DGN6BlqQaNQkVHzxVfF/dp8h+rFVOexsrhla4t45mQEI0iKxAalaVBpXi&#xA;K4qxm/8AJmh28guvqt3eAzeoLWF0op3YUqY2CA9g3t0OKoi18u6HqAlM2k3Fk0LcEaaQqzAhWJRo&#xA;pX+GuxrTp4UxVMoPLmjW8yzw2/GVejc3PRg1N26clB+jFUwl/u3+R/Viro/sn5t+s4qsns7S44+v&#xA;BHNx+z6ihqV8KjFWM635R0eM3GorZ3d40jRu2n2jRCpiKMPTEjRBOTRKDxcfQK4qrWvlzy/fiX1N&#xA;IuLMgqfUlcxux6fC0crNsNsU2mMfljQ45YpUtqSQsskbepISGU1B3bFCaYqpwfZ+7/iIxV09rbXC&#xA;hZ4UmVTUCRQwB6V3+eKsf13ydot0ZbtreZqw+i9na+mqup5DkEei8wHJBqD4bgYpBpR03SNH1FTD&#xA;P5fvNPQKCDdOlKhVbYw3E1GUtT5qadiVCZjynoAQJ9WJAAFTJKTt7lq1xVN8VU4u3+ov8cVbmggn&#xA;QxzRrLGaVRwGGxqNj7jFUn1TyrpN1JDdLE8UtoGZIrb00EleLcXVxwbdBTl+rFUq0jR9GkWPT38u&#xA;39tbonpCe7eIoyrzX4vTuJG+IJX7P7Q71AVTiPyjoCR8PqxYb/bllY777kscVTWGGOGGOGMcY41C&#xA;IKk0VRQbnfFW4/sn5t+s4quxVivmi61IaP8AHpkchjkjaOVpYDCsayortK1wqrHyjZv2Xp86YCGU&#xA;ZEcurHdFv/N9sgtrWCJIFW5lmNlJaTqZRIOquYDGooy1qw6UFBhYt+XL7zhd6px9S1tjezH67cwz&#xA;W106PFbsOMkQCH7Sp9ilNzT4q4qzlLrXOKs9hF6hNJEW4JogrRgTGKk7/D+PgqwDVL3WbbU3uLWw&#xA;tbN4HmliSa4sre4XlCwjqAstNgxPqMQadqA4AKZSmZcyzrS21wRQC9MdykypK9yCsZjZgP3QjUOG&#xA;AP7XPv7blip6tqOuW2l3bW1gZJhG62UkMkbHl6bMskizekiqGA7tirDrPVPOEerNDbpAv164aWYW&#xA;k9pdSgCLieaN6AJqY2qCvfbeuKqob8x/0hLdjTwLz0Fi9QzWzSrH6zslY+ITi1CCFevQ8jTFUFLP&#xA;5ht9UAhs7WO6tfXMYeaxt51RlUIfSUSqCCa/G5rvTjgAplKRkbKvf6p5wke1hv44Wfnb3UaXU9na&#xA;kGOhYRcfWqS5orFum3E74WLLNDl8yvYwz3zR3IuUrKpKIYOJI2aIOsxYGv7I296BVMZb3UoZZKWB&#xA;ntQ1EeGVTKxY7/u3EagKevx4q89stY86LqCyCOBby+SA3QhuLOW4ZYkIZmhoiFi7UWjDwqwGKou6&#xA;b8ymuUuI7IPdxQ3aWzvLbJMVZ6K4iCvEKfuzxLnv8QqcVQd5J5gg1NAtjbLIs6XYW4lsrWZpHEsj&#xA;Hgvrb7txd2py341wAUylMy5m29U1fzlPaQWV8ISLwfCt3NZ26SNHOGUrwaQyKVC/yivjUDCxZd5e&#xA;ufNVxELu7MUkckjIbRnjrGlQQ4ngVlk47rTiK7dMVTKe71KBgbex+t24VS5SVVlrQAhUcBTtvu4x&#xA;VgVxrXm0aqLhY7db4o9rGDdWfrgmUSlWiApxVQPhLV3ry3piq3Wr3zXLeGG4jguWtZHe2ju5rO3m&#xA;Ilt6oPRAnUCvP+8YhiOgoMVV9Qt/O0+n2ttDp6SWXwMVn+qwxLL6ihAixmZnDMSakrUHcHABTKUj&#xA;I2ebtY1TzwmlyRalAIUuGnimS5ms4YljbkI6TqSX2dQSETpWowsU88t3fm+WKSSZLdkgMcSWYliK&#xA;U4UZknhU0UEAhSlaGmKp/dXGoQiM2lot0OAMoMvpMKCoCgqwYn3IxVg2u6x5oGqJcm2ig+rTSraL&#xA;PdWcU6maMRoqJSUd6sGY1/yaA4qpavf+bpWhtr5YZI3+rXAju5bW1o6yFXEYUzs458PjNBQ0INTi&#xA;rpE86yeX/Sg09Pq8yub2Mm0igACE8lkiLs52A+FEoR26YAGUpE80TJqXn6wsZPrVqLeOFo0SPnZr&#xA;biEIvOkx3A+BqL6JNDTtXCxRHlC482GBIFFsLW0gQxwRzQzxzVaopLH8aVQ7lg1SK13xVnFsZDCp&#xA;lUJIal0U8gGruA1Fr86YqqYqg7+1e70y4sqtEbiB4fVAVipdCvKhNDSuKpNpPlfU9PDINavPSKgJ&#xA;FGkAUHkzM1JhPSvP9mn04qmuj6fLYW8iSyyXM00rTSzMI1qz06BOIHTFUaC3MngaEAdu1ffFWPa7&#xA;5Um1a9ec3ssMUiLG8CqKFQGVhyV0NCrsKGo3OKp+qhY0jjj4InEKooAFUjYAHwxVfF/dp8h+rFUP&#xA;Np0b3H1iJ2t5iGDvEEq/IKPi5q9do1xVjV7o93YXou7jzBfL6snINFA0remhLCNgiyQj7Z6x/IbA&#xA;hVFW9i99NJcWGs3qXcQEbyT2sCfCxBpR7aLl9j6MU2mS6JIbiOa41G6ufTpxSQW6rs6Sf7rhjP2o&#xA;174oTGX+7f5H9WKuj+yfm36ziqhPp8UlwLmNjBc8fTM8YTkyVrxPNWBFcVY9quh3sV6b+XXryOOS&#xA;SNIVjiMjR/FGzKoiHCj+lT44yu+9cVdDGuo3bpY6zfi/hRJRLPZxonE81X4ntYlfZ3+ENUVrTpim&#xA;0Z/hGB9Qi1C4vri4uonjkDOtsKmPoPghVgCNjQ/wwULtl4kuHhvZPsLBTg+z93/ERiqCXQNLikWW&#xA;1hW1uFJYXESr6m4IIJYNUUPQ4AAGc8kpczaU695fummfUW1q5gjSERBUjLsrkSIkii39NiV9fYUP&#xA;vthYW6Nk1CRbKLW9Sacr60ZktIo0rCykFna0Rft0+Hlvv74qjpfL91c2voXmr3cysB6qhLVFJFDU&#xA;Ug5DcV64qnOKqcXb/UX+OKqd5YW136ZlUerCweCYAF42BBqpYGnTFUo1rQbm4kgvG1aeOGyDPLHw&#xA;Dc1DJJT9wIn2MQ6fRitoG1MUsFvpkmu6pNJOn1cu1oqhiIzyLO9oeNQOrv8ASScVTYaJqMlu0V1r&#xA;V1LzDLKFjtEUq1RT+4LDb3xVM7WBbe2it1YssKLGrNTkQopU0AFdvDFV0f2T82/WcVXYq7FXYq7F&#xA;XYq7FXYqkup+YDp+m3Uxs7gSQRsLb900qTSLGzino+oyr8O7PxxVi1p56vodQkijj+tC7uC0UUgu&#xA;KiP0iDxCLcMgEirsqN9o7gDFVJfP19+kHugpeUxCGOwKzKpdZmJAQFjzdBs3EttQL1xVffeeb39I&#xA;JLIptntvXAtaThG+FfSLqxgL/Ef2kXjXviqjc+brp7iOWeOawkaSCYJzvSDFXnKfTl+rim3Dh6dO&#xA;vx4KZGVhluka3qt7ZQzXWn0iuUrFPbuGAFSC0qPw4DoV4s9d/DcsUdLqyW0skc9tcrCjUFykRljZ&#xA;mOwAi5yd+pWnv0qqwaz8/wB/9cFx6fqPerADZss/FCkbNLwVfWZDvT4UblQGgxVu78/6ktyLkxel&#xA;Jbx3UZsys4RpA9IqhvTLfYA5FVI5H4emKqupeerpr2ATIbOOCWOYqq3K84yrk8uYtmcAANwKAbda&#xA;VxVCah5x1C4iUyRS2cs4DK8cl4iu0UgUiOoiRVZBX4OYNftd8FMjLamTad5wnkhhuryCJdPuZ/q1&#xA;pdrKsbO7sBHWKUhQG5U+GVjy2pvsk0sYGXIWms+sRWcywy287qyCQzQp6oAHFfsIWlO5X7KHr86F&#xA;iwi/85XM176h9WNxG0S2afWYqyGb4VKo4PMIp+LjUnbgcUg0bXah531COeP1ENqLB2PpqblxIn1c&#xA;NHzaQW7Scmap5KtKdW3qqTZX65521KWKCBoDaGTjIHjN1GW4OoZfUKQEBiStFDDuGrihde+f7+fS&#xA;3Ah+rx3DTwxX0aXCnbn6bCqqiEgKfhkk3rttiqc+X/NGp3sLOth9atYSkZkhciXmVoy8JTRuLjdj&#xA;IDTemKp5c35tPTJtp542QGR4FD+mF3JZahzt0Cgk+FaYqwrXfOUj3wFZbaK2eYCPjcQM6mMLH6g5&#xA;wk8nYHfiV261xVTu/OGoiKC0kjks1Q28yyBrp5GUyP6gd5UgbqvHhQih+14ABlKVm12pefdSn0eO&#xA;sH1YXaEC7jFypB4FwwYoiJQUNVkk8DhYqsP5g3q2Tf6KDBA8ULXXG5YgMiBuVRxYhiw5GYNsDx3x&#xA;VFeVvNGrXEC26W/6QS1hU3UvNhPy5dufISMykMK8O4GKsytnLwq7I0ZapMbU5KSa0PEkVHscVVMV&#xA;dirsVdiqGuLVp5driWEKo2iYAGpPWoOKpA01jNfcU8xXVuI4kmlhf00X02CsG5yxClQ69/xxVZZa&#xA;pcXGtW8MU0y2TNJwklLP9YETceUTRp6XDau77gjvirJh6bQ+nIpZSvF1KkggihB2xVLP0FZQagL6&#xA;wiht7g8+bNAz1LqiVWjJw+GOm2Kpd9T87pqMl0l5aOruqek0cip6CMxHwhGflRz/ALs8N+xVRc6+&#xA;a/WS4jWyeSNGjCH11BDshJrxbpwxVRm0K6v9ThvNSgtHMS8OUaSFqerHJuHU1/uuP04qnwWGOAxQ&#xA;x8EAIVFQgCvgAMVXqwAIINansfE+2KpU+gacl+l/aQQwXKp6VWgLrxDBlKqCnFge4xVAXdl50bVG&#xA;uoL21MMdEtojG8Y4O8TS+oOErHaNqcXHXtiqJul81v6UiLZNJA/NEPrqCSrIani3Zz2xVD3uiajq&#xA;d7ZXGow2bfVJFaqLKW48gzL8SkH7OKU/jgs4goigVAlSgWOlK9aUHfFbKklnaG5W6khrcooVJCpJ&#xA;A49vDqcFDmyGSQHDeyAn8saQ13HeQwRpdRO7hniLofVqXqgKCtW69e3TCwQ2r2Xm+e8SWzvLZYYI&#xA;2eFDE8ZNwUkQcyy3HwfGpNN9sVV7lPNM0AQ/UiyskgoJwC0bhwOhoCVxVD6lpmtatZfVtQhsSrgV&#xA;KrMzIagngzL4r4Yqn8ENpbgiCFYg27BI+IJ96DFW4zxpUH7C9j74qleoeW9IvJ/rLQL9aEqzrI0Z&#xA;ZS6gD41HHkOK0oT8t8VUNVsfMk72kdnd28VpG6vcIsLRuRG6OgQsLhR9kjpirvS83Tab9WumsjNJ&#xA;D6c0iLP9ploxHwj9Q+WKtXNt5iv7Nre+gsGSQMrJSZ6VBWqll60PhiqZ6Xp9pYWkMMUKJJHEkbvH&#xA;HTlxUDrSp+nFUZH9nw3PXbucVXYq7FXYq7FUJeLqLOPqUkMZ29QzI0m29KBXjxVjvlqHRp9VaeGb&#xA;1ruSxSG8t2VuPwLGjUDChHwgYqmEHlv6pq0d5FL6tuGkYRzVLQ+q1eFvwKIqb7hlJ98VTuQkRsQa&#xA;GhofoxVKb2G4s7Zp5dRl4gqigJyJeRgiLRQx+J2A6Yqktj5iikhWS+1NrRpTJ9XCh5VkSJgjMH9N&#xA;B1Ybe++KoWy12Z9Una51mSKw5elAOPKrsvqIaegjJVFfZ26g9euKpjq2p3Fm8cdtfNcyu0aFTyQV&#xA;m/uwrLFIGJFTx60xVG6dcR6gjy2WrSTrDQyDhxod9jyA8CMVR8ljeSyO630kaljRABQAGmKseh8w&#xA;2z3MiyapJHahYHgueDfH66lgGQxgx7Cor1BFMVUp/MdsZgkOsSfVGhllkvVVuSemnIlYzG3P4fir&#xA;02NcVbTWBELeKHWpdQklnWKSVo/T4B+VKcIqM3wUCDc18MVX3fmO0SzknstWe7ljUOYuLRgKXCVd&#xA;ijcNzT4up2xVMbG5hvriS1t9Xka5h5erCYyrLxIVqh1XoSMVTGS0u525pePEKKOCgEV4g1xVjv8A&#xA;iCNb2aOXUnjsooxILsq9SC/pklPTHFQ+3KvH3xVfJr1uJ4Fh1SWa3kMwmnVG+AwJzbioQ+pT9rif&#xA;h74qpXfmOERBtO1N75/VjhYUaNQ0u6/H6bgnj8VBvTpiq678y2SWs0lpq73M8UZlEJR4wVVlQ8nM&#xA;bBDybj8XfbFVaTW7ROcX6WlN6lF+q+k4b1GVWVfsV3DrvToa4qg9M1uL0TPfeYJVkmVZVtfTD8FZ&#xA;nUBHSJDJvGRsDQimKolNftUWY3urPa+nLNGlVY1EJHItWNeLUNSm5AxVpdehF1Mk2pSQ2qCL0rgo&#xA;9WaZC6qyGMcCQPhqfi7Yqs/xFbm4jK6nK2nPbm4N7wcUHP0wfT9OvAk/brTFV0vmG29WEW+qSzxP&#xA;I8c8nB1KenGJGKr6Z9SgIqB0qMVTfTJUvFFzaao11DHIquOIAJPFqGoB+ywxVOcVdirsVdirsVSH&#xA;zPB5mlMA0O5+rEV9dgsbV/lH7xJR49BirHI9D/MKGUyW+ocW4lKmO1rQUoAfq/woKfZHfw7qpjoM&#xA;Pn0amjavcs9iN3jKwb1rQVijRvhIG9fv7KsvkBMbAdSDiqR6n5U0S+tDa+gYoS/qNCnrJDI3NH/e&#xA;xxNGJP7sfaxVI7PyDb2149wtnbxK0bw8LOW8syVZ2+2UMnKqca++KoHQfLFzpeqW17H5Xhiki5+m&#xA;8MxUxgxelRmMjCTkCeqd+1N1Vd/J66hfpNcaMsUYAQteSS3bLxYCqlZlKj0+XEDvT6FWV2uh6ZbW&#xA;Vpbi3WQ2KsLVijngWNTx5lyNwO+Kqk+kadPK8zxNHcuQGuIS8cpVWqBzjo1NvHFWIR/l1c297btF&#xA;depZ26rxQmaGQsAVNHXmVop+EjeuKoLU/JmryaldPFZTPazOpZVuvUMvqNGrn1JgjLxjD1qrfTiq&#xA;M1DytczzfWU0++DkASgXwkZgqsF4tMH3qR1NNsVWXXk6+uZLRILaayjjokskk5uPgZuTUXkiqKmv&#xA;FAB/BVlWkeXLCxsI7SYfXPSmNwkkkZqJD+1TffFURc6Rp90xkuImW44oi3EReOVVWjUWSMq671rQ&#xA;4qxKf8ueN0v1cWzW4+NpWgMdyxJfmpmVXfcOPirX8MVQeseUNTe9meDRoriIsGMrvHcTOGADUnuU&#xA;WVSDvvX22OKo2byn6pV20V5JB6Y/0maG7CqhoQhuI5CvwfDQUHTbFWpPKKm1ihXRpH+rRvHbJcTw&#xA;zxIXC7iGWN41/ux9hR38cVXDylCIXhGizCGSVZ2gFxH6HNaU/wBH4eh2/wB91xVTt/Kn1eB4Rokw&#xA;N0kcdz9XuIoIiYwfiaKNY0YEnoytiq+38pJExf8AQrxufUWttNFakq7GgJt44mPwHjuaYqth8nok&#xA;ok/QjK8Ugkhlikt4ZgVQLUzRRJJXlVqhsVWyeTIXda6IxQbs7SW7T8g4dCJzEZfhoRXlX3xVuTyR&#xA;Lf6hK1zaJFb3AIlkuo476YARLGOM0hMgpw27bnFWYw6XYxm1laFZLy1jSGO5KEMFXY0J6dTiqYYq&#xA;7FXYq7FXYq7FUi8zSaMkYXUrx7UygLAkU4t5HPMD4CWToWFd+nXbFWB2L2Wo+rDb6hqbAF0RVluH&#xA;nYLUrQRTitU3LgAA7dcVZf5asorNpLeO9nuhEroTOLsvVKxkmS4Z6/Eh779cVSXzfqflqGBVj1C5&#xA;eaJ4jW2umA+KT4ldIpoZGIETbeOx6kYqraDoclzdtd21/eOWSRVM73MloAknAqn79o2bklQ+5odj&#xA;TFWRXcCRJbpPDc3PBSry252XiTVmUvy+QHI4qxHU/NljHfQ2llbykyyshlnNwvFUYo5aMojVU0Yg&#xA;VPHtXbFUg1zzHNFCl5FbXjTTtCq2qyXcR9ObkqyKvqLH1Tj9r7R79cVR175rk0zTLmWG1mufqqSN&#xA;Dz+tUn9Jwr8JXLbLzqS1KD32xVkmi6nHqlol1HpN6VJVJkjnVmjd41k4sJDD9nnQkbfMYqm+uT6L&#xA;bQxrf3bQM8SRQxLOsLuGbhVS7JuC4qa7YqwbSZLPUvUFle6k4jed1jSW5mkZFkAAIFy/QSruKCoI&#xA;HTjir0Gx0ee1V457gyq6CNCpkDAVAJJd5DX3xVX/AEFa/wC/Z/8AkYcVSbUpreziYC3vfrJkWOCO&#xA;QylHDSKhf1LdLmg+Ku4r7YqxuykW6aPhbalMs4Z43t7++dRw4FhVoI1oC/HYncfLFUZpcmuRPJBc&#xA;WFzJFCaKQ9yZCW+IcnkDePviqFXzXeNqItRod2YDbfXPrP1icD0+PL7DW6t1+Hkfhr+1TfFWYwxR&#xA;RWEj3/qWEZIM/rTqQgXlQ+oDShxVjOr3Ogm+UWtxqFyJI5HleGe+SNPSqBwMUUkZ5COQ1rvx2riq&#xA;M8r2dtLaPNp8tzdwGWs091eXLyK3BSeKTxIeNOirRa+G+Ko7XrqKxivr2WyvpY7VJJpJonjWHiiM&#xA;5O7hqLxoaKT4A4qwG2/NLS9R1Kay0qRJJFYiBZJZ4xIqBy7CSVYUAHp1+Pj17nFVjfmRdjUmtVsn&#xA;a1WD1jfBpzFz9EzCLYGpNOPIbd+m+KpJrPnez0zUbWwubi5jubiYfWpI9RvZVtkdYgkvwl45FKS1&#xA;4JXcdOVMVTHU/wAyLvQtDW5ltnuWX0PRVp5TJLFcRPKkxelACsdd6Hce4CqN1j8xpNLsJ72eH9yk&#xA;jwWx5zAzTxlOUQH2lIWQGrDj74qjvJvnQ+Zo7eeEpFGziK6h5XTTRysszKgCoVPw25blXjT32xV6&#xA;viqV3PmG1tY1kuYZoI2IVXkCICxFQAWcb7YqhLjzXPDIyDQdVlINFaOGEq29BQmUUr7098VRFt5o&#xA;0+6laG2V55VBLRxmN2ABoSQrk9TiqreTRTxqJLW4cOASEUBlKtUbhgVYMtdjiqRWuoaVZXLDTdK1&#xA;G6PN3keApNGs1OL8uc1Fkoe4rTFUX/i+EcDeabqFlC/Sa7SCFAWVqCpkry+E7Uriq+90rRdTmM17&#xA;ps7SIoYOw4V9ImRQOLCrciSMVUtO8z+W4IVtLGX93GGZYkkgYirVY/bJ+02KqGs63p8TQXpj1KUl&#xA;TEsFpNHGrLI4JlZTLErcOJ3r4gDFVHTbry5PNPOdNuvVVS8jXXoy1Xqz7yyjbu2Ko+XVfLkxUy2y&#xA;yFVCKXS3air0UVPQYqmkNhpl5ZxVtUMFG9KKSKIhQx3oKEDl12xVE29lb2ylLdFhRjyZY1RQTSlS&#xA;AB4YqsvdMtL2AwXK+pEQoK9PsMGU1G4+IA7YqhdN8taPpkxmsYfRkYOCwYttI4kf7VftOKnFUVfz&#xA;La2c107qFgQuWmdY4wF+Il3pRV23btirEvMPnHzHawodNt9PeR0dqfWWn+JeNFYIkfGtT3xVKUHn&#xA;65sA17YrMsPo+tbubsesXkofgLPvGtGPHYH22CqB0Cy/MC3tpSdJtrW6T6zOzQ/W4eUYcOsQqzci&#xA;5rQDelNwQaqoyzm/My81KS3uLNLe39elpMsuoR/uxGz1ldpGX+VfsUr2xVALYedW1mG4bQ7VLRYW&#xA;BpHeNL6jcSfi5qKh1qPau/fFXpum2F1awtDdXJvm5cvUYEHgQRxPJnrTFWJXn5V2lzqc+oG7dJJ2&#xA;nYqIxsZ3LA19QH4VYr4HwxVltpomlWSKLOxSFkXjGwC1Hw8epJPTFVK4OqXMd5ZzaZG9nIXhHO4p&#xA;6sTrueKo3GvIila4qlI8i6SgW5stOhsdSjnSaOXk06DgQDsWT7SAqfn9OKqV3+XXl97iWSPSYnWa&#xA;3EBrM8fE1Ysyr+9FTyFK9KYqgL78tRe3L3k5eS+d2mMzywEGRkKVZRarUBT0xVFWX5fWUcHG9sEv&#xA;5zwBuJbllYLEqokaCONAqKE2GKqN1+XFvPHNbrC0FhK7yCxjni9NHkRUkZGe2eQcuAP2uvSmKovQ&#xA;/JJ0iaFrZX9KJuXptNEwJWKSJSeNvGzELK37WKsxxVJ9IVbfThbRD1ZWnunRW3oGuZGLMfAV+nFV&#xA;XUrP/R7ZjIxeO7glZv52MgSh8BRumKq0cMVzdSsygw27BI0/ZZwAzOexoTQeBBxVQvYYjqGn3Dtx&#xA;9CaTcmi0aGapPbamKouNWncSkFIAeUcfQsf53/gPpPsql9tAkWlG2WkjyXs4i5gOQzXcj8gGqCYx&#xA;VhXwxVMfq8MEXGJaAkliSSWPEirMakn3OKpb5dtb1LHSjMsax29isIKOzMxZYqGhRaf3fjiqirzx&#xA;m8aFpEf1I6tCgkcIb6YPReMn7BNfh2xVbO87remSSWRFtrsQtPGIm4enAfs8I6jly3piqZDUbqnq&#xA;m3jFv65g5CUl/wC+9ENx4U6705YqoWs1zBo1nJHJBFFHb855JyQqqqg15AgAAVqTiqX6frmozXZi&#xA;fWdFuPUJFvBblvU7UBPrPyPXooxVH3mrS2hAub2wtSdqXDmMkjqV5MNsVSu68wa0xeTTtT0a4gjA&#xA;5opeSRSzKi14zKtCzdTSmKoQax5vubuKzml0g290rxlWQycm4M55BbpvhCI37Jr7YquutQ8yxFH/&#xA;AEp5cjioeZlSUfFyFAD64H2eX008N1Udp+s3EgZJ9U0WaYGoW3Y7Lt1BkY9cVTIXU31Uy+tZEBgP&#xA;WFfSCmvU161xVCz3OsTIE0250p7o7qkgdwwANfsOD9O+KscTzB52+pGdrjRGHps6yrCQCCAyN6f1&#xA;0sKCtVqSfEdMVZHa3ms20Qi1K90oXq09X0g8K9K/YeR2Hj1xVHNeXYtBMZ7VRX4piW9LiaBaHl1q&#xA;3jiqHa81i4Ux2F5pz3NOSg85BxBoSVRwae+KpMNa81SXghh1ry64PECECYylvi59J/8AVpt4+Oyq&#xA;c/pDUIgI7m905Z1AEoqy/F3+FnJGKpnZyvLbJI7I7MCecW6EV2K1J2piqtirsVdirsVdirH7eAS2&#xA;/wBZ0y0c+rLMLhZrue3IeOVkJCp6oozBiOm2KqrxWCWbWtytyfXuokmC3E8hSdgki8Ji6usanj9m&#xA;g9t8VUILSR5xatazRwwsDztL+4PEg/Zfl6K0ofiAYn2xVHagljNdWdrdRyuZJmaBo2dFR40kNXZG&#xA;TbjWg337bVCrcljAhjlma4QxzoIlS6nYPVwqc1LAEb1ZTUfPFUJ6WnvGdQt4pg73EsTJJcXEZBWV&#xA;klMUaGT7TIW4qo5d8VTCytkjicKtxH6sjMRcytM26U+Hk8vFf8mo+WKoaXyto8lxHP8AV0Ro+PGO&#xA;PkkfwmorGrBD9IxVWu9B026tzA8ESKRxDRJ6bqOXL4WUgj4iTirVn5f020jkjjgjcSh0kaVfUYpJ&#xA;TlGSxJ4Gg+HpiqFXyX5dW/N8LGH1i3qceH7vmQatwrxqa16dd+uKqvmKJIvLWpRoAqJYXIVVFAB6&#xA;ZoAB0AxVV8w/7wRf8xlj/wBRkOKqEB/52mQf8uh/5PYqgfMNP01Fvvxsf+6lDiqK82f3Nl/xln/6&#xA;gLnFUzvP96LH/jO3/JiXFXSf8dS3/wCME+/+zixVJdbMQhvDNx9H9JWAk5048TJbg8q7UpiqrcHR&#xA;v0po/wBRNsJTdPyEHDkV+qT9eHatMVUR/wCS2/7c3/YriqJi/SP6S1Tj9Z9L6ynpej9V48fq0Nf7&#xA;3468q4qgJmI8v1vqAfpNRL63D7B1RAOfH4Ps9e2Ko6A6T/iW0Fgbev1K79QQcK/3ttSvDFUFB/yi&#xA;1n3/AN6tv+eNxiqMsP0l6c1frdPrV1x9L6pw4/WJONPU+L7PjiqM8tev/h7TfXr6/wBWi9WvGvPg&#xA;OVePw9fDbFUyxV2KuxV2KuxVI7XV47aJrYQztOJZSW9CX0gHlZlbmFowof2K4qsvLuJ9Gk+pmZpU&#xA;uoUlkaCVZOZnjMkqxsgZ1UNyqo47U7Yqjf0zpdrFGgE6pUIgW3uG3PStEP3nFVuo3UVtJazyCRo0&#xA;nJb0o5JmAMcy14xK7UqRvTFVNdXtZbqB50miBfhbRNBMTzYcecjBCq7VA3oBufZVT068iimuWuUl&#xA;DJPOluBDKw9NpS3IEKR8RPXwAxVMrXULa8JMHP8AdyFGEkckRqF7CRULDfqNsVRWKuxV2KuxVB6j&#xA;Z3N0oiRrc20iPHdwXMJmWRHAHGnNBSlQQQa4qleleStGsZIbg2tu15FuJFiIXkCCHVXd+LCmxriq&#xA;tq3l838pZ0sZFKhQ1zaGaRakl+L+olAR022O+/TFW4/KukxWoigs7SGYrGrzJbr8XpOsgDb8mXmg&#xA;NC304qhv0JY2NzFdXT2qgSNItIGB5NG8ZClpJOK8ZDsBirWoXHkiG1efUf0fHaRfE8txEixpX4QS&#xA;z7DrTFVmnw+SI4lls0sXUhgJ1iVywLVYc9ydx44qjLk6c9iRbSWkcHqLzWSAvESKmnBWT4u4Ptiq&#xA;EtLzQdNUz3t3YpIZCYpxEYePIH4QXdz9nbY4qllivlO+t2Wx1LTrq2WIWzNBEZAEZBT7MpjDlCDX&#xA;j3rirIJYNCvS924hkMLB5ZQhFTTiOf8ANsKb4qpXdzpklusEE9osfPk8U0BkjI+0KIGSjBwGrv8A&#xA;LviqhZXugaVH611eWUcpZkW5EZi+FqHhWR3P7PTlTbptiqhYDyBLdyXtibCWaM+m7QorqjcVanFa&#xA;qrcSD40PviqOn/w1PMs0hgMisWJCEci3UvT7X04qm1ibc2sf1bj6ABEYQcVABpQDsB0xVXxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpfrqTPpl0IZ3t5BBIwljoHFACaEg0r4jc&#xA;YqkepRa6fLZun1UkSwxl0WFFNJeINH6g/FscVRv+LtIglktmQQyQyPEYvWswfgcrUKJ6gNTkK0IH&#xA;2gDUYqr+Y55f0BqFxZXBhlW0klt7mPi1CsbsrLUMp6Yqw06b57k8lLrDebXIOni99A2NsTT0PVCe&#xA;rTlyHTn174qj/Lfn1WsrGK6syZXhi+s3ELB2ZjErFyiqvjUiu2Ksxgu4bkO8TBgrBGAZWoVcjfiW&#xA;HvirFfLOgtq2kx6je6nqRuZZ7iQL9aZRHSaSMKipsvFdsVRNrqNpoHl3VLrVp7m/s9PvJV9SUNdT&#xA;8GkUIgCjk/H1KDatMVRX+LIUhP1fR9S5UqiGzmQE02Bopp92KtXfniytLaW5uNN1RIIVLyv9Rnai&#xA;jcmignbFU9tJknto546+nKOaVFDRtxtiqrirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVQupWk11ayQxSmBpFKmQAEgEiooQeoFP1YqlUugavLZCyfUgbYKqCP0VGyU4io37eOKp0Y&#xA;VZuRijLeJ6/qxVC6vp73+nXNl6htxdRNAZYwHZQ6spIDCn7WKsJXyJ5yVG04eZnGlG1Wx3tLfn9X&#xA;VCvAD0uXRuNede+KstsPLmi2tjbWrWsc7W8McJnkhHN/SQIGbbqQuKpmQKkqKCqdqftYqwuGO304&#xA;zWunecILe1SaVltpXtJGjd3LSIWZaikhOx6Yq5rXydf6Bc6VeeYY5J55nluL/wBa3WZZndZH9Hmn&#xA;DhtxHwEUxVMJJJpraW5sPN6ta2an67cSfUZEjovKsjpEiptua9t8VQc91pV3p11a3/ndfRmiIllh&#xA;fT4lELghvieKRegNd9hirLdPSFLKFIH9SFVAieobko2U1GxqMVRGKuxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZMoaMqSQGIBIJB3I6EYqw2x8uatodibaOysN&#xA;QX1ppFlEJ9YrJIXBlLt8TDlQtXfFVYprgFf0DaHelBEnX/g8VSnXdNvLLy15omvrG3todRVJJfRj&#xA;iSFYoo0jb1/3rF2YKRy40AoCNqlVU1Ffy5/wTdKRo/P9GyDj/ota+gdsVZnoQQaLYiOnD0I+HHpT&#xA;iKUpiqOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtPx4/&#xA;F026V8dumKrP3f8Al/8AD4q793/l/wDD4qoX/wCjfqU/6Q4/UeDfWfrFfS9Onxc+fw8ada4qlUv+&#xA;BPqT+r+j/qPpHny9L0vS471r8PDj9FMVTy29D0E+r09Gn7vj0p7e2KqmKuxV2KuxV//Z</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:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+         <xmpMM:DocumentID>xmp.did:01801174072068118DBB9C4385CA24A4</xmpMM:DocumentID>
+         <xmpMM:InstanceID>xmp.iid:01801174072068118DBB9C4385CA24A4</xmpMM:InstanceID>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:D47F11740720681191099C3B601C4548</stEvt:instanceID>
+                  <stEvt:when>2008-04-17T14:19:21+05:30</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FD7F11740720681197C1BF14D1759E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T17:01:20-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F117407206811BC18AC99CBA78E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-19T18:10:15-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FB7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+                  <stEvt:when>2008-05-22T14:26:44-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:08C3BD25102DDD1181B594070CEB88D9</stEvt:instanceID>
+                  <stEvt:when>2008-05-28T16:51:46-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F11740720681192B0DFFC927805D7</stEvt:instanceID>
+                  <stEvt:when>2008-05-30T21:26:38-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F11740720681192B0DFFC927805D7</stEvt:instanceID>
+                  <stEvt:when>2008-05-30T21:27-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F97F1174072068119098B097FDA39BEF</stEvt:instanceID>
+                  <stEvt:when>2008-06-02T13:26:10-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F1174072068118DBB9A084B3843B2</stEvt:instanceID>
+                  <stEvt:when>2011-06-09T11:06:05-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F1174072068118DBB9A084B3843B2</stEvt:instanceID>
+                  <stEvt:when>2011-06-09T15:15:58-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:7FF2245A3B2068118DBB9A084B3843B2</stEvt:instanceID>
+                  <stEvt:when>2011-06-09T17:21:50-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:01801174072068118DBB9C4385CA24A4</stEvt:instanceID>
+                  <stEvt:when>2011-07-07T15:53:09-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>uuid:190090dd-b95e-a142-9c53-7c955168a3d0</stRef:instanceID>
+            <stRef:documentID>xmp.did:7FF2245A3B2068118DBB9A084B3843B2</stRef:documentID>
+            <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+         <illustrator:StartupProfile>Web</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:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>549.002930</stDim:w>
+            <stDim:h>356.940430</stDim:h>
+            <stDim:unit>Pixels</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:Fonts>
+            <rdf:Bag>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>Arial-BoldMT</stFnt:fontName>
+                  <stFnt:fontFamily>Arial</stFnt:fontFamily>
+                  <stFnt:fontFace>Bold</stFnt:fontFace>
+                  <stFnt:fontType>Open Type</stFnt:fontType>
+                  <stFnt:versionString>Version 5.01.2x</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Arial Bold.ttf</stFnt:fontFileName>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>ArialMT</stFnt:fontName>
+                  <stFnt:fontFamily>Arial</stFnt:fontFamily>
+                  <stFnt:fontFace>Regular</stFnt:fontFace>
+                  <stFnt:fontType>Open Type</stFnt:fontType>
+                  <stFnt:versionString>Version 5.01.2x</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Arial.ttf</stFnt:fontFileName>
+               </rdf:li>
+            </rdf:Bag>
+         </xmpTPg:Fonts>
+         <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>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Black</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Red</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Green</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>193</xmpG:red>
+                           <xmpG:green>39</xmpG:green>
+                           <xmpG:blue>45</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>237</xmpG:red>
+                           <xmpG:green>28</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>241</xmpG:red>
+                           <xmpG:green>90</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>247</xmpG:red>
+                           <xmpG:green>147</xmpG:green>
+                           <xmpG:blue>30</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>251</xmpG:red>
+                           <xmpG:green>176</xmpG:green>
+                           <xmpG:blue>59</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>252</xmpG:red>
+                           <xmpG:green>238</xmpG:green>
+                           <xmpG:blue>33</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>217</xmpG:red>
+                           <xmpG:green>224</xmpG:green>
+                           <xmpG:blue>33</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>140</xmpG:red>
+                           <xmpG:green>198</xmpG:green>
+                           <xmpG:blue>63</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>57</xmpG:red>
+                           <xmpG:green>181</xmpG:green>
+                           <xmpG:blue>74</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>146</xmpG:green>
+                           <xmpG:blue>69</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>104</xmpG:green>
+                           <xmpG:blue>55</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>34</xmpG:red>
+                           <xmpG:green>181</xmpG:green>
+                           <xmpG:blue>115</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>169</xmpG:green>
+                           <xmpG:blue>157</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>41</xmpG:red>
+                           <xmpG:green>171</xmpG:green>
+                           <xmpG:blue>226</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>113</xmpG:green>
+                           <xmpG:blue>188</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>46</xmpG:red>
+                           <xmpG:green>49</xmpG:green>
+                           <xmpG:blue>146</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>27</xmpG:red>
+                           <xmpG:green>20</xmpG:green>
+                           <xmpG:blue>100</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>102</xmpG:red>
+                           <xmpG:green>45</xmpG:green>
+                           <xmpG:blue>145</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>147</xmpG:red>
+                           <xmpG:green>39</xmpG:green>
+                           <xmpG:blue>143</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>158</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>93</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>212</xmpG:red>
+                           <xmpG:green>20</xmpG:green>
+                           <xmpG:blue>90</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>237</xmpG:red>
+                           <xmpG:green>30</xmpG:green>
+                           <xmpG:blue>121</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>199</xmpG:red>
+                           <xmpG:green>178</xmpG:green>
+                           <xmpG:blue>153</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>153</xmpG:red>
+                           <xmpG:green>134</xmpG:green>
+                           <xmpG:blue>117</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>115</xmpG:red>
+                           <xmpG:green>99</xmpG:green>
+                           <xmpG:blue>87</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>83</xmpG:red>
+                           <xmpG:green>71</xmpG:green>
+                           <xmpG:blue>65</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>198</xmpG:red>
+                           <xmpG:green>156</xmpG:green>
+                           <xmpG:blue>109</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>166</xmpG:red>
+                           <xmpG:green>124</xmpG:green>
+                           <xmpG:blue>82</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>140</xmpG:red>
+                           <xmpG:green>98</xmpG:green>
+                           <xmpG:blue>57</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>117</xmpG:red>
+                           <xmpG:green>76</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>96</xmpG:red>
+                           <xmpG:green>56</xmpG:green>
+                           <xmpG:blue>19</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>66</xmpG:red>
+                           <xmpG:green>33</xmpG:green>
+                           <xmpG:blue>11</xmpG:blue>
+                        </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>R=0 G=0 B=0</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>26</xmpG:red>
+                           <xmpG:green>26</xmpG:green>
+                           <xmpG:blue>26</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>51</xmpG:red>
+                           <xmpG:green>51</xmpG:green>
+                           <xmpG:blue>51</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>77</xmpG:red>
+                           <xmpG:green>77</xmpG:green>
+                           <xmpG:blue>77</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>102</xmpG:red>
+                           <xmpG:green>102</xmpG:green>
+                           <xmpG:blue>102</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>128</xmpG:red>
+                           <xmpG:green>128</xmpG:green>
+                           <xmpG:blue>128</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>153</xmpG:red>
+                           <xmpG:green>153</xmpG:green>
+                           <xmpG:blue>153</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>179</xmpG:red>
+                           <xmpG:green>179</xmpG:green>
+                           <xmpG:blue>179</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>204</xmpG:red>
+                           <xmpG:green>204</xmpG:green>
+                           <xmpG:blue>204</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>230</xmpG:red>
+                           <xmpG:green>230</xmpG:green>
+                           <xmpG:blue>230</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>242</xmpG:red>
+                           <xmpG:green>242</xmpG:green>
+                           <xmpG:blue>242</xmpG:blue>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Web Color Group</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>63</xmpG:red>
+                           <xmpG:green>169</xmpG:green>
+                           <xmpG:blue>245</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>122</xmpG:red>
+                           <xmpG:green>201</xmpG:green>
+                           <xmpG:blue>67</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>147</xmpG:green>
+                           <xmpG:blue>30</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>29</xmpG:green>
+                           <xmpG:blue>37</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>123</xmpG:green>
+                           <xmpG:blue>172</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>189</xmpG:red>
+                           <xmpG:green>204</xmpG:green>
+                           <xmpG:blue>212</xmpG:blue>
+                        </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.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>\r%  &&end XMP packet marker&&\r[{ai_metadata_stream_123}\r<</Type /Metadata /Subtype /XML>>\r/PUT AI11_PDFMark5\r[/Document\r1 dict begin /Metadata {ai_metadata_stream_123} def\rcurrentdict end /BDC AI11_PDFMark5\r
+%ADOEndClientInjection: PageSetup End "AI11EPS"
+%%EndPageSetup
+1 -1 scale 0 -651.988 translate
+pgsv
+[1 0 0 1 0 0 ]ct
+gsave
+np
+gsave
+0 0 mo
+0 651.988 li
+621.732 651.988 li
+621.732 0 li
+cp
+clp
+[1 0 0 1 0 0 ]ct
+608.04 639.988 mo
+10.7832 639.988 li
+10.7832 41.3672 li
+608.04 41.3672 li
+608.04 639.988 li
+cp
+false sop
+/0 
+[/DeviceCMYK] /CSA add_res
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+1 lw
+0 lc
+0 lj
+4 ml
+[] 0 dsh
+true sadj
+608.04 639.988 mo
+10.7832 639.988 li
+10.7832 41.3672 li
+608.04 41.3672 li
+608.04 639.988 li
+cp
+.193668 .150057 .155337 3.0518e-05 cmyk
+@
+608.036 41.7031 mo
+10.7832 41.7031 li
+10.7832 12.5586 li
+608.036 12.5586 li
+608.036 41.7031 li
+cp
+f
+608.036 41.7031 mo
+10.7832 41.7031 li
+10.7832 12.5586 li
+608.036 12.5586 li
+608.036 41.7031 li
+cp
+@
+.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT Initial
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\r12 dict dup begin\r/FontType 1 def\r/FontName /ArialMT def\r/FontInfo 5 dict dup begin\r/ItalicAngle 0 def\r/FSType 8 def\rend def\r/PaintType 0 def\r/FontMatrix [0.001 0 0 0.001 0 0] def\r/Encoding 256 array\r0 1 255 {1 index exch /.notdef put} for\rdup 65 /A put\rdup 67 /C put\rdup 69 /E put\rdup 77 /M put\rdup 79 /O put\rdup 80 /P put\rdup 82 /R put\rdup 83 /S put\rdup 95 /underscore put\rdef\r/FontBBox {-665 -325 2000 1006} def\rend\rsystemdict begin\rdup /Private\r7 dict dup begin\r/|- {def} def\r/| {put} def\r/BlueValues [0 0] def\r/password 5839 def\r/MinFeature {16 16} def\r/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869\rsystemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup\r/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def\r/Subrs 5 array\rdup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> |\rdup 1 <1C60D8A8C9C3D06D9E> |\rdup 2 <1C60D8A8C9C202D79A> |\rdup 3 <1C60D8A849> |\rdup 4 <1C60D8A8CC3674F41144B13B77> |\rdef\rput\rdup /CharStrings\r10 dict dup begin\r/.notdef <1C60D8A8C9B6E3FA5101D97F0BCF44F7161DEB1E2A84766DD477E7\rC8A936AA182F5809A9> |-\r/A <1C60D8A8C9B64EDFED26B9E21A4F64848088903AC9891CF791BDBC4AB29A\rCC8B3E8D13924A7DDE35F09AC5F4A8229C87124C732743268600EF8D4582208B\rD16D82> |-\r/C <1C60D8A8C9B6079F6D1C46AC2732DFBDC9143C94793529C1940296210AAD\r6EE09C39CFC4DAB7C5F3BA33C9E10838E0BC6FC9318A4E57F309EE20438B434C\r69AE73A499211EBA75E22A57C1581D93869428818DC700A28C027571D7047CDF\rA8B017AACDE96DE4B2579EFD2C826A30F6EBDDC52701A22CDD669ADC60B66F32\r261A1F55EDEF9802FD4511E0EF130772EDFD708A4113A1EDB1E717E0FA7D3148\r51DE59> |-\r/E <1C60D8A8C9B64EDFFB83C6241DB110BEE5AB2FAD9D94B39ED5E81E7411B6\r6E9361DDE78FC667AB91EF9824> |-\r/M <1C60D8A8C9B6B41CBB4B6664BFFC865F56E6FEAFA79E7B90883C1C68AFB3\r79AC174B0F8DCC9294E2C26BD06BBA9FD3867F8768651EF4BA798B4F538FCE8F\r80AF5A83421F8F> |-\r/O <1C60D8A8C9B6FF86E621E1FAD9CC02A23AF5AAF7451327A9277DAE8170AA\rC8E603A02E3EEFF561DDADE9FD6F6F16B77EE709DD797791A73F1C532C58482F\r9C51E1EAE7EA6E4D820E6AA1026E7BE345B1C97C5D9EBBEF4840C4188F96B538\r0E7625249BBAD172254404F6F1CB17CABA1F131B17AAAB56C5D3B94E3AC2C2E9\rF0A0D079C435D0249DF6C47E18FCF00E7FFE3C519BB35DF797EF47286BDCA762\r289BE1> |-\r/P <1C60D8A8C9B64EDFF4950CC53012D47AE97D5586315BA2F5162B63CEC117\rC5379A1B3DB174CB2C739C68916A1E99A346AFF71DBF25658867D9AEF1BF3C47\rCE1BA73978E8D0D40E52B85A56E08A1369D85E15B0A0C517291916FF6E61D0EF\rBF59B4862165C7DEA15B42BE3811C2CAA25C54> |-\r/R <1C60D8A8C9B6079F62E89B521DCDBE3DC5497B8DD99916239C0DFA5ED4F6\r32B33575F4260343AF5DB7D477D12055F49C5E99C0AC176EAD42723223937F2B\rA15ECAD7751CB6A136B700EE485E38E7CDB87D9465C90BB8E29B04FDDA42609F\rBC3833B9FB5105619F4CC434003085F449D9FD5022725306B331FB97B31D2952\r57B180DE1FD5465D256CCA19301DA97326882845130A5257BF61307ABA64C3F0\rB222> |-\r/S <1C60D8A8C9B64EDFE3D078722A65C31955939D63AA5C8A4945719B5E558E\r3B73A676CC12D1E18D93A8DC67C074D6E352D426981DE76F8EC4CFE5DAE051BE\r47753A7C234C4B8D7D9F50292A61882B5500CC701F878FE626CDC6D4C322BB39\r1537921D673F5AEE3EC19E36E7EFEC0F06A0EA4EAAB6BBA94DDCD11A6A564B13\rB510F8C915848233B82F046D854DCD4F1639F149305DC73D3C68DF8AEB47A96A\r30E55CF8BAD07FA2825BCE0D675F1CC2EBE61B07B772130E23119250F1EBF8FE\r12A2098D9F09F3F21BDC41666CA4A0BB70D5F0A750B44BB93A5FBFDD2BF8DE45\r0B277265536F77D5BD6F44FB72FF2E708C60107653AE44BFFB26AFF8> |-\r/underscore <1C60D8A8C9B7EF3224BB0E94C1F3EA8D5F87D58A9CCE> |-\rend put\rend\rdup /FontName get exch definefont pop\rend\r%ADOEndSubsetFont
+/RQJJJK+ArialMT /ArialMT findfont ct_VMDictPut\r/RQJJJK+ArialMT*1 \r[65{/.notdef}rp /A /.notdef /C /.notdef /E 7{/.notdef}rp /M \r/.notdef /O /P /.notdef /R /S 11{/.notdef}rp /underscore \r160{/.notdef}rp]\rRQJJJK+ArialMT nf\rRQJJJK+ArialMT*1 [16 0 0 -16 0 0 ]msf\r237.976 34.6689 mo\r(ECORE_POS_MAP)sh\r.597284 .512352 .507713 .201328 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rRQJJJK+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/e <1C60D8A8C9B7EF322472FA01213C7AD90A23B536C2309DD40D370E2449B0\rD0FEF85A6BE8067F30686F143E75903EB6FA56935472EF47CE3F33433C2F0C8B\r6FA51573AE54B2C516F6F024F8775AD6639544E339FC2A328548BCBFD58B0EEA\r03B7DC3AB069F44477958BFBFAAC7196D411DF9BE0B78A86C4BC33EC5D7C3729\r5284C077711C162623860AACA404F650F8D516970257> |-\r/i <1C60D8A8C9B88C087228DFC7C7ABCC71B868F57EDB285655227000619B17\r1C8A80AB> |-\r/m <1C60D8A8C9B6B41CBB5F87BE20C872DF59FABCB36542419CBFA3D5519AD5\rBA8076F32ECFD724B055F72CAC37BC47239ACC8B0FB48B8ACFF099B97085BD99\rC333951D0338D27FF6AB9B3F3C69320476BA0CD4F9573B79AD358A91B0176AFB\r9AEF169308783E9C6287F18E6E658AF5AA6C9688B500806DA169A1B21069D55C\r54A2FF607A6A38976171B08665C3ACCAA84DFB970D01180645CE5CBC48DFE37B> |-\r/t <1C60D8A8C9B854D0F45CF665C7276F8075B54A4ECD6470F395A458CA2D06\r5152075036EEECA213894C1EA0DACFBD370590F4B831924E5BDA5281442349CF\rAD2545E0750C3004A129C25B1EAA8DEF5DA8BF1998E80AE266F591E64CB5127F\r5C42C88FB43C> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rRQJJJK+ArialMT /Encoding get\rdup 101 /e put\rdup 105 /i put\rdup 109 /m put\rdup 116 /t put\rpop\r%ADOEndSubsetFont
+/RQJJJK+ArialMT*1 \r[65{/.notdef}rp /A /.notdef /C /.notdef /E 7{/.notdef}rp /M \r/.notdef /O /P /.notdef /R /S 11{/.notdef}rp /underscore \r5{/.notdef}rp /e 3{/.notdef}rp /i 3{/.notdef}rp /m 6{/.notdef}rp /t \r139{/.notdef}rp]\rRQJJJK+ArialMT nf\rRQJJJK+ArialMT*1 [16 0 0 -16 0 0 ]msf\r232.568 326.033 mo\r(time)sh\r%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rRQJJJK+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/a <1C60D8A8C9B7EF32244AC11AA6BAAA29EE8C78E0E7206F4A2776A2D1EA7D\rC8D9A28C62ADE3B609CF5E2EE23C64D0B75055BD249ADFEC7B4224D040D883CA\r6747571955349CF8AD17E94E6FE5D0259F4D55623D4DC5C3CB4AC64A7A87DBBA\r48B7420D7990F3C261DB9838C5B90BF72B82C8238A1A58FE8E6137AAFE2405FD\r710F7ADB95B4F576668A6DB104942C88ED8D01E4E58188F5E32A24B5B964D5CE\rC10C08F76C0F472E84A0FB6EB5E37AAEE233DE54C212B0A012D3E20F864B2D53\r463E221F81B784B6F7BE81FBFCAE6785C2430454DD81C436E0A516BF8C8307B2\r879FF86378629C5EA7E586D83C83550D2E732930F7FE3BAD07B86C81E024D177\rB5D88A> |-\r/f <1C60D8A8C9B854D0F47057B2F13303E258FCAEE9E8BBA6E28AE872907C56\r63BFD2A0F535ED0EB011F2C2A875E053FAF73E8AA16B1F99510A6812F90D61CF\r3F1DA5EF558899A9AE12AAF6AF4568E0F6003B0A2FF6F33293> |-\r/r <1C60D8A8C9B81F2C3A9694980E415F1DEF5C498473095A24D1BE11285789\r4FEA85DB28AD762FB8D2F4CAC5BF8B9C18D8A2DFCF155E0751AF58898A6619AD\rD420F549AB7C795751D32E8EE6> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rRQJJJK+ArialMT /Encoding get\rdup 97 /a put\rdup 102 /f put\rdup 114 /r put\rpop\r%ADOEndSubsetFont
+/RQJJJK+ArialMT*1 \r[65{/.notdef}rp /A /.notdef /C /.notdef /E 7{/.notdef}rp /M \r/.notdef /O /P /.notdef /R /S 11{/.notdef}rp /underscore \r/.notdef /a 3{/.notdef}rp /e /f 2{/.notdef}rp /i 3{/.notdef}rp \r/m 4{/.notdef}rp /r /.notdef /t 139{/.notdef}rp]\rRQJJJK+ArialMT nf\rRQJJJK+ArialMT*1 [0 -16 -16 0 0 0 ]msf\r47.4312 142.669 mo\r(frame)\r[-4.44531 -5.32813 -8.89844 -13.3281 0 ]ysh\r.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rRQJJJK+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/l <1C60D8A8C9B88C08722AD20D19A90F9064193C8D82> |-\r/n <1C60D8A8C9B7EF322B3BE19FB964E04D2DB06D4930CA5D8F41D2EF3A285C\r0BD536CD2C57668EB9E30311BF9A2872DFB44F2BF2A4683B5D66FA01BB1CCDAD\rE9C8A9EE2CB010715D3D6DFF0E843CF77C87A07D1DBD0482675E3CA1DAA2A520\r3A8015DD09B7CE> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rRQJJJK+ArialMT /Encoding get\rdup 108 /l put\rdup 110 /n put\rpop\r%ADOEndSubsetFont
+/RQJJJK+ArialMT*1 \r[65{/.notdef}rp /A /.notdef /C /.notdef /E 7{/.notdef}rp /M \r/.notdef /O /P /.notdef /R /S 11{/.notdef}rp /underscore \r/.notdef /a 3{/.notdef}rp /e /f 2{/.notdef}rp /i 2{/.notdef}rp \r/l /m /n 3{/.notdef}rp /r /.notdef /t 139{/.notdef}rp]\rRQJJJK+ArialMT nf\rRQJJJK+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r135.66 73.1016 mo\r(linear)sh\r55.3784 99.7695 mo
+52.4956 93.0059 li
+49.6128 99.7695 li
+55.3784 99.7695 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+f
+.5 lw
+52.4937 310.07 mo
+52.4937 99.2422 li
+@
+262.795 307.188 mo
+269.559 310.072 li
+262.795 312.955 li
+262.795 307.188 li
+cp
+f
+52.4937 310.074 mo
+263.322 310.074 li
+@
+269.559 93.0059 mo
+52.4956 310.068 li
+@
+.597284 .512352 .507713 .201328 cmyk
+RQJJJK+ArialMT*1 [16 0 0 -16 0 0 ]msf\r232.568 627.504 mo\r(time)sh\rRQJJJK+ArialMT*1 [0 -16 -16 0 0 0 ]msf\r47.4312 444.14 mo\r(frame)\r[-4.44531 -5.32813 -8.89844 -13.3281 0 ]ysh\r.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rRQJJJK+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/c <1C60D8A8C9B7A73DB9D8FD6AA4FBAF8D65C36EA1D4AADBD389F972C0EDCE\r9E7F36285FA93A80D3647871D2CE5AAAA6A6A370DC54E1595FB6AAB3E389C9F7\rBBBB85F787D6C418B35B940450E5E243895ECFD2205F51B2D154CFFECF34148C\r344C1EF806F9AAF539FB961E3EFAF6353381E833DF7C0542FFF27122A28D3654\r8FE63FC8465B1B685766E782F0> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rRQJJJK+ArialMT /Encoding get\rdup 99 /c put\rpop\r%ADOEndSubsetFont
+/RQJJJK+ArialMT*1 \r[65{/.notdef}rp /A /.notdef /C /.notdef /E 7{/.notdef}rp /M \r/.notdef /O /P /.notdef /R /S 11{/.notdef}rp /underscore \r/.notdef /a /.notdef /c /.notdef /e /f 2{/.notdef}rp \r/i 2{/.notdef}rp /l /m /n 3{/.notdef}rp /r /.notdef \r/t 139{/.notdef}rp]\rRQJJJK+ArialMT nf\rRQJJJK+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r113.303 374.572 mo\r(accelerate)sh\r55.3784 401.24 mo
+52.4956 394.477 li
+49.6128 401.24 li
+55.3784 401.24 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+f
+52.4937 611.541 mo
+52.4937 400.713 li
+@
+262.795 608.658 mo
+269.559 611.543 li
+262.795 614.426 li
+262.795 608.658 li
+cp
+f
+52.4937 611.545 mo
+263.322 611.545 li
+@
+269.559 394.477 mo
+218.307 611.539 52.4956 611.539 52.4956 611.539 cv
+@
+561.039 93.0063 mo
+561.039 93.0063 475.529 100.881 452.263 200.488 cv
+428.997 300.096 343.487 310.069 343.487 310.069 cv
+@
+.597284 .512352 .507713 .201328 cmyk
+RQJJJK+ArialMT*1 [16 0 0 -16 0 0 ]msf\r523.562 326.033 mo\r(time)sh\rRQJJJK+ArialMT*1 [0 -16 -16 0 0 0 ]msf\r338.425 142.669 mo\r(frame)\r[-4.44531 -5.32813 -8.89844 -13.3281 0 ]ysh\r.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rRQJJJK+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/d <1C60D8A8C9B7EF322407C6655A1B3652DB8522EB511BE6B0855A72D96214\r58876CAD1FA22A00635F436A34E23EAFC09C394044ECC1389CD99E4AF1C1F6DD\r52305C78619784840FC37A805B0805EF290BC9E049CF068290816CB7E74DB612\r941355BCE71CBDD11DD0F9CA29531036ED13EFB9CAB613E9F630FBBC9408EF13\rCE4683D92968530F64760C3DF85C7C7EA06EBA8BF859> |-\r/o <1C60D8A8C9B7EF32334FFE7884F6C3B903D000D9FD76C2EAE8EDCCA90A98\r7875625CA0393015EF6761BE1C3B6D9E9DA4BABE1DD313B783BCBF8F620C846C\r7F6361946173FB7A4A6BF94EAA0CB4947DD1974AF371F3C211E584576DE9AD79\rF9DA988E9E531810E3876F3029BB1D2ED366525F30E48DD7CE3C9B66C5CC099F\r518C54BB58C51D6FB6D0C8> |-\r/s <1C60D8A8C9B7A73DA057E90C9BFBE0FE301E99CB771FA2F05368A6342B5F\r80456D91458EA2F3CAD55CDF89BFF34EEB39D7DD325B057E2BF0E9B878C214E2\rBD1BD70DCABE10E0DC8EBCF7B100B55EBE94FB0F17084E21EBD279B324AEABD9\r6538911D053BE9D7ECBF43F934B1033C9E405BBE31E7EDB643609C8D779046E1\rB250C3CF05E6FA4787649137D90F47F85972A6603BA900DD7CB710E02662DB32\r87CB26D7B7AE794611498865FC85A28083D2F6C2DEC302D47619A4A577C5B843\r5558FCFE71A1BB6783AFD5F58B6D2C03593B3F2297A66A7E6D13C1E321C57F41\r72D53C8FCAF4D28F2B78D3A4BF03> |-\r/u <1C60D8A8C9B7EF32240889FE90FF09F794E92023A18223CCBE3629AB7F51\r7D090BF7D55C0A5A8EADD9BE381137FE8504E8B2DB3D16839889E327241ACA8F\r992A2BB9AD2BCE57ADB306CE2789439E67A64C32BE8669C197F5851EE3879399\r0906DA8D7F8ACFF6D70790F06B02> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rRQJJJK+ArialMT /Encoding get\rdup 100 /d put\rdup 111 /o put\rdup 115 /s put\rdup 117 /u put\rpop\r%ADOEndSubsetFont
+/RQJJJK+ArialMT*1 \r[65{/.notdef}rp /A /.notdef /C /.notdef /E 7{/.notdef}rp /M \r/.notdef /O /P /.notdef /R /S 11{/.notdef}rp /underscore \r/.notdef /a /.notdef /c /d /e /f 2{/.notdef}rp \r/i 2{/.notdef}rp /l /m /n /o 2{/.notdef}rp /r \r/s /t /u 138{/.notdef}rp]\rRQJJJK+ArialMT nf\rRQJJJK+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r406.014 73.1016 mo\r(sinusoidal)sh\r346.372 99.7695 mo
+343.489 93.0059 li
+340.606 99.7695 li
+346.372 99.7695 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+f
+343.487 310.07 mo
+343.487 99.2422 li
+@
+553.789 307.188 mo
+560.552 310.072 li
+553.789 312.955 li
+553.789 307.188 li
+cp
+f
+343.487 310.074 mo
+554.316 310.074 li
+@
+343.488 611.539 mo
+394.74 394.477 560.551 394.477 560.551 394.477 cv
+@
+.597284 .512352 .507713 .201328 cmyk
+RQJJJK+ArialMT*1 [16 0 0 -16 0 0 ]msf\r523.562 627.504 mo\r(time)sh\rRQJJJK+ArialMT*1 [0 -16 -16 0 0 0 ]msf\r338.425 444.14 mo\r(frame)\r[-4.44531 -5.32813 -8.89844 -13.3281 0 ]ysh\r.69482 .6318 .621515 .583612 cmyk
+RQJJJK+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r403.717 374.572 mo\r(decelerate)sh\r346.372 401.24 mo
+343.489 394.477 li
+340.606 401.24 li
+346.372 401.24 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+f
+343.487 611.541 mo
+343.487 400.713 li
+@
+553.789 608.658 mo
+560.552 611.543 li
+553.789 614.426 li
+553.789 608.658 li
+cp
+f
+343.487 611.545 mo
+554.316 611.545 li
+@
+%ADOBeginClientInjection: EndPageContent "AI11EPS"
+userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse\r
+%ADOEndClientInjection: EndPageContent "AI11EPS"
+grestore
+grestore
+pgrs
+%%PageTrailer
+%ADOBeginClientInjection: PageTrailer Start "AI11EPS"
+[/EMC AI11_PDFMark5\r[/NamespacePop AI11_PDFMark5\r
+%ADOEndClientInjection: PageTrailer Start "AI11EPS"
+[
+[/CSA [/0 ]]
+] del_res
+/RQJJJK+ArialMT*1 uf\r/RQJJJK+ArialMT uf\r/ArialMT uf\rAdobe_AGM_Image/pt gx
+Adobe_CoolType_Core/pt get exec\rAdobe_AGM_Core/pt gx
+currentdict Adobe_AGM_Utils eq {end} if
+%%Trailer
+Adobe_AGM_Image/dt get exec
+Adobe_CoolType_Core/dt get exec\rAdobe_AGM_Core/dt get exec
+%%EOF
+%AI9_PrintingDataEnd\r\ruserdict /AI9_read_buffer 256 string put\ruserdict begin\r/ai9_skip_data\r{\r        mark\r   {\r              currentfile AI9_read_buffer { readline } stopped\r               {\r              }\r              {\r                      not\r                    {\r                              exit\r                   } if\r                   (%AI9_PrivateDataEnd) eq\r                       {\r                              exit\r                   } if\r           } ifelse\r       } loop\r cleartomark\r} def\rend\ruserdict /ai9_skip_data get exec\r%AI9_PrivateDataBegin\r%!PS-Adobe-3.0 EPSF-3.0\r%%Creator: Adobe Illustrator(R) 11.0\r%%AI8_CreatorVersion: 14.0.0\r%%For: (Marina Proni) ()\r%%Title: (diagramas_01-18.eps)\r%%CreationDate: 7/7/11 3:53 PM\r%%Canvassize: 16383\r%AI9_DataStream\r%Gb"-6CNCN<N?J'*l9Fcr,ODpAAEC-II4&pN3TT/#GND?)m2=5mCin#:]3DlkV:!2PhHtd&:/oc;T#WY\%(i5[$Htg[O[paJ6m@-O\r%PPqQVpWm4%J%pL+Da-I5P07rJC,ua1S:qg&n<9LB[hlfmICjAsc_hJGDjo#,4==flp$16-]A*4,^NoG9g$RP'Q`j`0HLpjnB9tj>\r%gn4Q9k'QmJc.Tke^3obA05(0K2p_K4Hfb+SrB"](Hh67ZjY))g^\GS=k9p..0:rnC>CQ2Cp$7qtDP)FNNSQ81\(<9>hHmsCF*I6D\r%CcWXMQG+ZNIfC2I!RgIM#63]^fus-9DgqkBh*1kX*W5acraP_iIfAL'h)f!GHn`@6/q<[Ms20'Ok@`iN<5od5mlIj;-i.810u=H<\r%$oO[UoT-c#rVjdjGAhBU]m+]"5CY#u]Qs2HmcMdoIes`6@b]erhS"A`oBqo7,33bc;p8nG4J-8"F9ElX!>G7!P/I*#CHO+g4Dug,\r%ZWP6=OOALl6H]MkGPY.mrqXP#?[`LFp[#lt]2rp#@/g,e`A?ZGm`i@^?MkmQAW;8?Y9b%5jkJ\,IsLqRp\-=[X=Af?,P^B$kI3+$\r%RtBbujUJM>UaPe!\\[`PhL'hM%`InfbP0)mT:aB'r9@APn"/D6Gl-X*?u+[!qXs7Smp>r+dJ]ll$B0Y3$0NGi^t*`G`XElZ$%HjW\r%/AaXEHh9NI7PoohYtm(E^B%L4opZcT^UX;hLikhL`kkXEO)J>emm8eKZ^Lid5+Kses/,fPZ-_r`mr%TJp^k3Rr+3o)Np"1T#!RCD\r%It%4Y%L3,ingAbqUjJ3<Q`n-dhq??J)gM>[lf!mlC)?pHrmeX8[t*f+m9-J+hnQ_to.=ok^=YSuEVfrhoC`54c2IAQQQYoR?G=(_\r%38?WCs6fU?=79J.I"$G4CMbt7r8-;?i?gL:m/lA.%EQ\905pmXihj3DpMU?51IZacD[mSmr9CD2p"!Gt_<>6FRhr6P$YsfZk_G't\r%h"DJlIHB1sZF6s(PkWu*4Z@fHRgp8'XmP_Ln%ZVcF7C4U]Y2"'#5l2[qsO1&9C0XPgLhp[(Opc2o&]8NMq9n+O9;\9\:?O+DXO.s\r%kp:<5%F&n.pAEq'X4KRfV#9`M!p9FP>Fadk9S7c]r;P6YkI9>SljaiHIf&]um14i#?GCmfp?oouqqamDrpf^]ipQa`4D`a9hlkm!\r%s6^Y!]sthrTC6[S5(!;Bs.Km>!%qXYfCuamZ'3L@rT4%<p>;IT]XadZ6+UAb]6O]9fN[7L,^saJ-0+ms0\!RUYMQt*rU*tk(NTYB\r%s,5L]o=(nhc!Ka]0QnXVo%2j[(!=VrF!0`,p5]+r5mA)<;Z-j\UjmMH"/!@'o*Z6DA")rc?gO]ZhV@UV*o=YW7?l4o0tQUVKPn<p\r%mKI]7_um`$nJ].5l8]1WNHLk+J%BoPCBW'MT]s'1?G1gr+u3EiS;86AcT@GOK+W<8f)1-Y^[U7Z$Z#ABDY.^^oP94Xqu(;JnU#0D\r%H]R=`r2]!?;K(I,\8ZBX5ht0XH\:l!9)pi]Gt&I!V_l``iSoXepYXl@H%5SZk5@B/LTg,as7aL=)gH;rh1='hq=!5?mObLd5<o#[\r%r/t+t;H&AJB<T[dq"`UPZA@7Erl5BM?0JJ:?237U`s=rnl0DusHh771G<`gUrOf=jRBX%9oXj\_MabfbT\tm)##QFS@7h=i#e0j1\r%roPO)UL(UCrsgC7]-#kY7`J@/d*/sX-qa8q+j9t"3,"\'nGVN'^AI="qK,5^_o:q#YF`LY#5[Kd@!m`u'[Y1nin&C`hqsq5Tp6!^\r%2`P$f6CTTF?Gd0N-<.AJip-4`=CGT>a:s3)rI8_R^V>IkE5]aL@FBQ#c&['uHM-j`$iYM#o>9kl(>/L'O9AgdL0qX6hot!Wk2gsb\r%eN^cnp&=V;m_=*+r,h]2eXp`14_Qp)J+i1mr@_!@5<JbA!;]LK]RTJ>pAF'll^rS:&M02cDU8*En1sr@s8MfJ=1@(<-.lR;ki)Ne\r%[kD+%G%_<d'DCdbDr//+3,1,cmr.'Q&_o')I0"-NDf1(q*I!9e!n*Q^5Cf:5HLS&qjF8fP1$mrq^3PHf`ga=5S+giN3;_O4="b$M\r%nlLQO^]_XMIiI;?%D?`\l[*6jp.NhAr?\[&s5q#sXWRNDr:4bDqrJ8<k%"M+G]rEU7t,A`ino0E@$)d^nb0-/PCrc;2<D02\)7)h\r%[b'>jYTYqj%6k(`,c/thI<G9&4l*G_I^jZO9/ti-E(qq!0n]_\^/o_YSpWdN`cSZ(GJF/JeB>(Jrqu,\qj6bic[H9%"Kec`T+/iW\r%i'IF<k?u[:__C)"!M29J0uHrJWT,h\@tSDQm`3N@C-7I,j#&Y$i'F6%6\0AoJlSY$?.d&9)6Uh">fUi?i#8<4(e^rMMK<TR(\dGT\r%?GU]=f4do%6%bD":*nFIV)brj9D`h!Y2D=9CS2p5QrD;@%(X52jZ0f_bPQ[TYOWiDkA)1sPZUi*V3F%=^Y5+CIpqkGYWo\QqBu<(\r%Cu@P:)2KZa(]KUYUjj/*Wr6(WG87VHd8(GS1_Vh,c[l()`o@$>?N"pUcP8/20O@%X`cIq7L&StS%+j+_L[2#,bNo-"m^g4j?Vf;H\r%\c=P7FhA49j5KiR3*[IV&,X94cjoYU3n-MWj?kuH6NG@"qUOQilK[qTJ$g5ug=:R.?.GurQ%AVu.KBM$Q\WbbbKJ*-jmKE[cBm!k\r%]e#NG10qoCE&m?ipP8^trc5d2n+LT_n#(TiQ[R_gI2kKd`ng=UYe/Upme49KY3kB-[&^gEbIb->])_fDVQm_HVX@iIY,G:O/aV-8\r%3euO\W/K;"lt3,t@V;sXcs_;5al+pMc`ur*e:6NZnt6R:O;#\Cj@1;Q+A\(La;94nistVbrYpAZa<k:/4H4SC'>KW=a>;m\m[`&1\r%GPK,>CAeQFORVI4T)J@#NW=:X#<J'pIe)n*%J6W!GU@`KGT&[uN+Gcq8-JW.=:+"c8aL5k0]QrC-c=.&hc/dmkh-C["Jp](!V6d\\r%UbFk34`O(-b]*DZSYg+UVno^/p(N6(0H>`GkKk2\:agCR1K$'F*u3PUoA!ph[!=lC_?f+>?T4Eb/[X/."4[G5,8nk4[C0lJ#-s4u\r%8cj#BEtB$'l]<WB5d9<X0tS3d_>fMc-`B-'.FJ<u%7=t(GG_8HTIWlD<mm?Kr&MZe5T'F4UVHQmpSDQN9@BV;iLg_H,1*A6@d"?;\r%&I8(3PU!-R695mili_g`Uh^q6>L^00d^Z5s&"q@ROX/;aXEbImh?'.TK'o0Oco*igH28)EOC'^!JTj36+S$,bW1mAoG<pl!Qa&Us\r%c<D-:.i=1;(m,gsKb9aX(p"'3QJn#uC]M_)NO'8;pC]q6oE8Ql@JhXs!Qmc]NWme)f/R\7C+_f$Ftee0LfLQg!#`s&CCsZ1JfGgs\r%*\Tf;G<jSMEa)s`aO&BA6SO,[35BpTKJd9F!\qS/C+ca/,iE87"j_K$k;5?D*b"+ENJraM9K(9WQ_Z/bq7f'U4*oV2N4U?I>`pr(\r%%(N)>"A1P8@R\fc8\O+>P*3L*7>n2>MUX4->l8M!OPXiMHVs[7riMuK;%%$b`!M3K:GRXI$I.r?WT>X.c)@.04emUHXMKp1K-O1h\r%e7Vn]F8i7R3q`tP_=\J6Z@0<eqkK#Hf`uua-_?UnHtm?srtSl>B)'KW?hX'i/UTF,ibKCB*=F:3EYLm#+McWAL'^!$5!YT-Qu.Xr\r%3_q?'ZW,4S.@m'ZU*WEI$5dN<Tn-d!'Of57=:emENKg\B!t/efLbP?O)Tuc$G]b3+L(WY(?^WXN<pjr`q>07LmFf*QBE.l3Rd.fU\r%h_6UD%:c1XVU/F#@a7JC,`pJa.+@_lUi7bbM!%J%*:5/h^AJ$%OMEEXFrGHZUgJsn.VGZSMi`A45lTf5gY7)Dl)Xl8Y,[O-.^:Km\r%Y7SB&A:#%C<jl/aC.5`L/6>sb@3ln,)/QY_<a#R2/:Y>-?'.U1-#oe.[Xb-:@$8>M%#aWj./H(LCp4+=Y^kb#%P'VCZNmc;G%;h.\r%1*f=C44#9=B*"g/OrG%)5I:.R6^HpPs*"kp)Q`:WJ-)UO&u>h>(WE4bjS;J[)A_k21:^C^Sm]mQ/'!"HlKc;:AW-1g(24n<P\nfc\r%NN,.Q>8X,ENXfZ\W]aOPp*b@>CeD&_-YH4]R3`_:AhoHJ6&oQ=W?'(3,tQcJ/B.^$0S)V-+CKd)]]"1NLZSIA(AhlLqu[c;$-[u&\r%e4j=-nG5iX.+skr_Qa]./p&F!]!0kYLitW?aJj(<=RX>AhNNS?.8KTeJDO'GB1i)*2H\).7%E*KTWW6HB'IZ;3d""0`;q>#FY;#d\r%j6s6k7!:3:[M0fc":(@u"uIm8#RS;iBSMtJ*mH@aMa.H$.WuT-TO:2r#pEf@c,GS.%,$PT0a897CQb&8P+KA>NaP#ub9(h88J*NG\r%J8#$*0B>0T^eB&^,$e#:*u#SOrXVM_7i(s`ftIffm#5/mY9$)/T(tXo_#c&FW#7-l$DgE39&X.bLJnZq9SjHW.H:-IgSqT"o^W"[\r%e6+ZPXMPi$EsfsB-Bq7S`&cS)g6%$.0&D.b]RbGmp@?;F,G0Nm]U9`GFRn)/'1Yi'4`iiShsB]d]/PPdf>ql=]D9m&5I+"-,Wk5i\r%dEIS,H^@O:V[Tp`PRiJ;^A,H=5oA\/A`RSH]Ae)K#LU'VB3E3Vng\\1s/[uXWbCm)i`D-"=&!9Gs2f72S9^IppSGAj#?_ZTI^Jmp\r%i].P=%sFDlD-"]FS7d2K4d15)H2(b-;\';r3QUbe@71ZT(41l[>3rJNTQ='7`*<G8f*mpZOD%`<5bq8I1PmiDn/csYn6eh&'1j]I\r%l(4^BR[+<1$ACeW."j-t]M,+%A<#1I<i^RIVnbl)U01P(=sU7]OU/<bAF^mhOdJEJ_\t:\pPIbj26\)aejQ*GV3oe,cJK\ue>oVP\r%L6H:I,3XkW+gHlOIJ>]CJH';eic#nekZ5e[6S4@*0>@C-p;DI5r:r",0RWYXop.rgHOG49a>6IK,Y.pr+@-MJ(2LFi8o,_D9S7u;\r%LVX$04,I<<&j;QU0q%4"KTNfcmLAb;lS,HZ"#%Y2;\n-cl:@/>Y+en=37WSGP"StZG(YLLAls+6?A/ul9GS@5XTE6)MEZ"GlA?@]\r%]gT)JA1>e<a-rkdO9o&@TTpq('e-@%-<@GmU,Y]*l\YaLr((@rmd+WiLJumW\)=`RII@uWDiK/=fXF>aHgH+/f_7YID[q84m(5d&\r%Rmk)=r4BI0fcic&dBULka,YhmNl8oFOg.>kCuFEoKu\RkbQZ,PBeE/XYqh<)Z.,&TJnF9mZ5?%I5a*</5DsL5@IXo,#5JYIk;,%o\r%C`DK0?'Jd2OWmiig(%EbUB_+FE[Xs7S)UXS$$@qA^+qul._m=?8OK`qN4lN)XG144[]]pK?uO<USV1Tf$I)VW1bh+^aRTc#-!j63\r%p51,'5>\_Qj0^Z\YEbij(q7b+7$GN?joRW3kgH\cZWsdIl/;!^0OJX<CdZaiTjmVbXUH;RhV1_:2K^@#60@g*:Yc]+`2Ff@CEL/h\r%(-2's`1=-oNj32"0SLC]bW#k9p?%He1GXb>;ToLl%g7+,aLesF.)he%iC:)0R5Pp474bb%1&sIjn^V_%8/%[$C8>j8qi7UUGWhI3\r%-.2*LSgQQld_M'"VMS%\h.NPJ+d7PV#-J8*^C4`Wc39^C1^aN8niXiQ\2:9BUc>#0PUPpnRq_eF_h$oR7L[=QO9$#=&`d(@R7HLV\r%[F'Ne-]UmIEEP'D*$MU7h-O12]riS!?-B?&%SC\BU'qa(R*>0Lh(IOL)TC06cc/'@D;j+h,\Ab@k1=5P>u]7K1[3L3l.eod:H=<K\r%EK!GpY8aKXWj^+,_"K7:4K]-.ZAu;>Yi1J:.kWO+bh&6u+Z<g(XC/;?4*gOOOT2pJ`.XY^<o)I;njN?hIkD9&:&V5DH]kMg=Va?$\r%@ODQEr^soEqo5pt*dC+R3u]9re!#R[<0jH',F3j2gCl0tpsA46@\iT?/"lV,@%TXTs(mmeG;4qmjq;OZ.[EX@j;Kn4!F1K]cXA\S\r%O#WY!>J'1p?]37&,_.e0YHQr6D5*Rm[&]%kmbWO\F-,d_0\`itgG78*0e!L>V85UUe=4$+Iqf[Y.Zr9/7CAOk?2=^l[Xs-Jph'%m\r%fa$?\DD(D9?;o&T'4Nrdjl8?q2JFi)e\E=^fqXN>f[I'"&+&X.KL]0#(:0cL*GPMIWA9)0G[-%pEb7/TPA$%8gp>kr?c>nJM>;*=\r%eH]#c$`No`WXGh!&?(A8.(20-BQ\@SeK,=ND>u,W!u)a_mYRYXPK6TB85!^9Lpa)!NAPh.7!n>iL[&rkG\!Z^oZ'9mlc@59nn<&[\r%NoG(3L5CPkPF1YN`?@43M5Qk;\A?U\GeWEY]6(A28cTh+D4q4D7^u!B`Zd#?=[$rli7Xr""t^Xs<,dq8,+d`"U:%g3.@F"b/-ia#\r%"J&>s#5$$UdqPfYQ[4.:!=DlT#?/^BLcJ/&>'Hh-9rG!@<>A-KF"kjQZ=7g4]r=Gu#Us[?>UOmpQ7uHY"9#JAGOqueYF6cDWgZ-u\r%Ss8><?!6HSqTkA%%&H71Xjg91/DTIW85J4TW@QeqBh]$JO(U/%HKe=C._mqO@$LfOG.hSHC[`9M$Q&\b3f$Q;l0`_\Lb-c3JUMDC\r%,-'P&T(f(-ht/bgJ5>0X=..dq>]Fahe0>L16n']D5_\1>SkFG(Mhf">h*?IO>O?JCQK\K7"&6,K1_WT(dDR20Vjmm&E-Z/a[V"hD\r%hHZ(EpXU]J",b9('An3lpH?(j[\.eu9,TfNO8d<"qX3*rIm8`Pe*NLiko?eu'_gZ5#r<^_d65</@t.NnCPTlM[=!_Pm=5#XZ[:VE\r%gP9T8)X\h1P*R9e5_A&%;^;V<>X%T6Y?h(f/sH,+K>k6?Wp+\*?=[@78CgO@rQ.s?ZFR4o7>;?JYsfZ3kT#'?b-FCaSUPTkLEl\2\r%m*kg%20G3A2bQ;=*s.NH^`]6:6"Gneh7\*H9`bA9'%!i_qnU05iS9%g_fAB`'/SRqj0V?Q!.r'3'.$FqVB<U6Lm1CC3>3^1`H[F:\r%bVD3=F=8S(@iBngR$e&r``+XC#S;PY88!HO/n;d%RK?t2nZ.3q;NaOCk7P_IPBI"4S-K260d<2$L2rk'c^:S].3CR'W>7Oo/A7"p\r%2bn`]X78<'!4WH1YK''gdB</TbT$[5>`8fAh&I#F,K+\E2P-agNXO?>b*WCp837haU@@IO,M2N"63Y1*B&n1dH!@'*U`c'(Fb(]p\r%WD!\#2"FK4LFJN_-]^dY"nmC+#Lo-O'q.c*3[)qt8J6@Gir56=;-B43)U^FUCcb7M66&2qnaI]XbC0]ug]MNi#0V&>I43FXp?S'W\r%Q-N/:a#jjW05%K$Dca574tX5%r>,<.GC4B/pspZspuE-$nkQa,jm&43N+pW]djiS;JL:'>2;$D0i3Zj%P8lESA>#m57cC+</s/t0\r%&Qbcc4ZA:SYKtLc4e'T//Z8]G(7A^P06\b\,3_MAG8s=:EItGU+#>n0(dDt+VOroP-?f0k%MFskO2i6*PT\i]15)tBiiL!VKDG$&\r%%"0cjP=s^#dE8\L<g*JG*)5(qG2^T?,Y]U[4]c-UUHb,>"XdB?S>!5g`LNQ%'"2k%-I8nN'X*hKVi/F++-R<ln/>c0,6k%k]HHj6\r%cnRgGQJWq-UkU+GY`@d]@sRBRSdN>)6m5_T:N^qF4a;Cg&;R=l21,m0(Pm55NXA3q)*C*AX[7"bQrG&+)*IGf?kat0>st3U$r0ul\r%&gK1'pR\SHp\9.d?!<cpgSE:-8!MbSeQW6r:nP!(+"3]ul)[IAKauQAAX2;7*6uU8Q4R/p9H4bmCCn]X$X0<e(FIua$?e;N('>Gl\r%kghT"!@.u(>)C+!%AX*D=HPpPN?VF@[DI1="N#d?1^ENr0R3l_;N8Q*\6EpF:fP:pJ3rf*k*'@]U.j)o>CR@U9+Kr5SBTrVa7.Hh\r%*'Sf[mmB*ok"sdGn^+b)h;KA;]&O=hpgZCT6Tb7bc>_jcc=\3NOkn8Fm;1(#bI3EAjBL6-EK0.]5SIKreod`MZ3oU9\^r"?FQ0*.\r%:2+TdW3c+Ilpjot'ST%SGSGjk.(Ct[a/ZXh.?s3cT?hm\:@rr13OCG&^\4)YFM<%nh)hdaGP4fc^;%F28&qcm6$lT5l273F+11Wl\r%FFG(k&MAQFo?S;=3hM$ZRa7jQ%[M#1r6\Xli4.Vk^7;F9hO)UNq0Yf>IK%jM#X7S??S@M5/0r!F^V@=kI=Cn'JBhPoJWq,XP8Hp1\r%7Lhjl4lA"7opj!@5+;L*D!O\qW9$Aq&@;1*4m55HddY'uLgXlKI<LZEK5_(J-/:7<O9VD8&7q!GZhKkMm)!`/Mgg7#/f]K9s1[\c\r%ECDMPQp;ZsSI;T?d0j1Fh15QcP?c3qJ:el@k<nn,1<2[Y.MA^c:&U^.O.Pasr6@oqoHWtZ(1H0t$W-*j*L#Xgne:9b*M#:?,P%2.\r%)I/L$N,hI\cW+!,=K`OHG,1/uh)QD?\=4Lc)sip=rA#8.]2+aJ!-D>O7t)M>1t"`5H1ALW#OqQpID$<iHWW,]rg^&obO^(noXTDA\r%;ckU-?l;^JZ$:n43/,?2%@5tr/Jd3$oNBu8*:@qR\'*Z8<%`0%985ml[]<T;aOhPN;mWB:mh`M?RZ1,KQ]U-'&f+%F]ir6iPF&N!\r%9V@P'gDU5;8Pe:BIl=j([7lUG*8&gL.'!gU^87HVeZQX@g#)/`CYJa;d1(QXiZHqsJ)BAFmdp1Drl&3YbLMsL*gXG:DSQ5@Z2OZu\r%AI>Kj4RoQ_a<;LL0eG:p5hjkP9$G;@"0M7+SWl&Kj9]eqp>QL\T?74oXek'ua<SpqJD4p@Iup52Xj(l)FC/\'`;->\"(6&iE;#0Z\r%Qe"]ts0nSpmO.](WTq.Ec_eY4Tt]UqOk`hK([G+DVgr"\;)cLV3o(E1d#l%5M`$7nl)a>',fhud'G;C!H**5R[nVpi6[E3tGr*YS\r%k]-GPVNbNYmb0FOQ^MAIDg5o_\lTftUSsb2j&-NC5ZtRdCTI8@Qog$_A!)gE9:"4`;.k/V!U6l!_^[NmHZoBEb!9gE57O5`o]`&A\r%:TQOj0ICcb,XKWNnFc+ZPbO9T;qK7,48tqO*:/W:*;AZ0*1E-u:o?Mem.["4YJ.bts6BW""@-Gs)?lcn^oCR3MP2VFhPV5C%du*(\r%IOhA]0Y\f^/Q&uppX`dbLHf2^'_pKH(0"QKbb&H('rgKXMPuI:3a,bK"PCF`=f.t*1+c-7(AH=>51>.F,RpdASKE0D;d/a)qiP2l\r%qk5C5qm-u<P!#3LPoh8oQ?T-Om>"CS])OnWPU"/+2?qE=4N#SKg-.>DQ^75U(sZJ,kZ_TQ5H^$-X5i7*q"M'TJu([bN9sMIoU0Ha\r%X%'M0i0Tu0[94Nb"q.Vp?bX7O!<8RePH<;llTaQiSW>GW3A''V[?>p]XaA9oHd&U=bcUcP-p6YC4m(=DrdU!>FcX(UO'+;hhcVds\r%U@9Q<O.u+l$4l:MiTg<^H#!G/iV%ssDt<J^-;_*j52p"Z01hndGJDQhDo^]*[WKiB*le?tR9(0MLMWVi7IUSg2=u-O%J!p2hGu89\r%i%/RMB.I8U[?Sp>g:>'?b6"Bneald$G/L=@BThYRCrpJCRq/?]fno#,JF%#jOEj#\F\oHcg"G9Q2?Hqa-0&/Yg8KG$j.h*YUCbaZ\r%T;]+jnk+Prr#G_m/KjoDqALW'("0=r"_eSSDN_**AqaaRs&BX*6T<G0DjL1^FV2Lnf0Xl-?HIB^,B=5ms+JX,#pNV4o4&BkcWk(:\r%#@bPW]Z:Klj[3l$)9tkN:u.=K)+Y"sp]i:@0GB10)20Ta2VQ_F8W+4Uf9TamPDa&7:pms1&!df50-INmeief1SgAktCt%rK2.rnI\r%kOX?3Ostr.PhM..;1C_aM%S>V.3k\+$;']aWKstXUh@t/*K%>qm]dW!$*\j6,#jTCL]Ioi:6.-h`u+>VN;,+sr"pZ-N"J:oL`^-F\r%O"oY7B[C6sn50l@7H%)X^+MnQ%thieeB:[lj4Jblrlte_28\5gZ+)I(h\EE+-,SIHiK#be_b?!K9LD%je>kdEC9,(sC;8,khso'3\r%*>H'J=-u[>g5hjO*QR5NH-Ita#"s];MksBtR93(7gck5sSVUPe]HfTf$[b1u+Hk)__+=a^ATF?rnl^;]$g5GGTRG$rZ!$C5jK]W8\r%=tOq]Je(r+?&[m\KB\->m\OnJWjCO3o/q>U10m)MSG5.PbH!`&oNrYPgh;5S/iYgSfLH[,bl=FV?oY:j(.qstoJZKb/tEtM"KI-P\r%2107f#:p5J+l56:UR)8\DG#+Z\jKt;5KMbeZ/eWijK"7?BX-XcbsZeb`Su3</d,>ng##HP`F+%HMb`aspnFo%MSeHB-Lk_Q\'%&T\r%<\)%b$H)egE\N:R5]Q;1n;n^\RQu"H/dqPP(BnFO*)#G^pQYGq+'8CL/,i'IarUb1U8pl&mWtOQ8K-DV''VTCbLYl0Op#9@J?d$#\r%8FZJ<OY.\hFQl>JhH\N4$+t)Mi'em+HFdNqTY"Tnfmtak\Kj'XP?GF?HWdTt>D]>t;V%dma"4Eq`5U[YA\):.6W^e#cUKHDqu5ku\r%oNqu7hdZ243+`tN5(#'Tgd=[dZ8d4c[.lmoE>;P[>g>'Og$Kc;B_3L?3.0Y%NX'Iaq!d[[_[!?Z?/EZ]0#7G4rO7F7_BD2H3Qi&s\r%G*mS4;@n/UJ.A[EV1s(o"YWU1o.#,kA\nEaSQ!?<.YiI/iM.e`MSc,:4Gn`I_O&gFC09f5I:3>A]_hN4^$9j6;la8mm%eQLDRS#\\r%'oVqBc/j8a^-\ATVc;.JHTMb`];oAJa5c?SmdTl'ZB*8D9=lH2BW7s'(@b`!5jC/p=LkBt*\hNj$uV9=[7/as[l:t4!3U1]7U=3^\r%mP%!5g\oZnhrV#Em.DF'1Z]:4Nn'`l\%AP<VGYbc8&"h^m[3Wp'0Xe"CJctd;l`g\cH:#92rRY,<3[7=7B3NX[d&tbn8a@8h,d9j\r%<AjWIPn*N)+:i!ZcVg9J0DC"aXYeQ/r>9Qm,?a&)Sr0OHA\)#aU<T0q2K3j')lpIi(:Sobb%0PgBi*O(MH"HeS(?q5QDduQJP'1C\r%Wa#;56$=L6#=ERKe5PjLoI2jqJ#nQ8Pu[ElJ*RrX!;N1^lBVBuE\HN!+"42IqeB9%feBq)<q0i]A.VPqZ,5&C`e8aK@/.*rnF?'O\r%?Z=,lX,h?_oL`8PYI;1)G^I9s\1*eV-*r?Ve].Ps@p_-0;)i>k3bqk\CH$(pB.YWI-&Y!KRj)%Z10RRHCN,QGl6>r7\F&TaD68lL\r%f6XC8<q1kj(7CF0WjUrgD&ogh"d1PZ.D"&JeiI,]X&n.=;L<1]Pi)$8\;oCSj_A`T]la^SiCGCMJ,,DOhVWcjXso&ifAFN.9/pf\\r%##8_4@kUFmiEUCBj0<'f-UIKLL>uO")NFgsbZeKc+7fLT:1R7E4\pBnf+r[=gI$dE'$1^rFbL$!p8/>?a7`4l\nh/A)mCF?JpdpP\r%a7aO4W)f)h*H@7GGt^$=#Zr58U;4]@pR5!'Xp?$)T!Xd?P@48lXkC@T'Cfc8DG5tF@PNCLWFP8kVlr932-')d?"^%?7hQk67J4d$\r%4r'@6;TV4I<sEtN]N@SuT`gNKQY@<h'V`F**Y,`.+N\YfYWEiJY[l&Ko(laoAN?2of`md%f/GFFhhS^:YnW7?R7ZTU993FJhRu_0\r%/sWRMP#&US4UX]bFQMA)QV+dP3-B[PA/$*..9pBsC@WgG"T$Ik]o?bXTt?B2^/e@i97<X-.<-#HoUHO1nZG5CpN&omnDY1q'4&>!\r%7GQ&$T,BhA7E9a1eHj'F4kFeS#ESL6(k;_@C(WkB!rI-CM;^<oK8H=,5.$#p/IlQ5Jm(9WT4PWagiOW%BY1a/GOHS.gkUr%Eu\!<\r%T['+:CNqB'_d,@`R!cPn_oIs@NcgCQmPFgEO*,F:>efT7h&AO((MDL99qX>&*!`"=";2b,_9,<U(rA,J,:B7TT4""O8B4W`7??aI\r%oHuoE2_nF<,jCoB((8Y_ar$\ep*"&cSMLV)E^A?:R&G#E_G6T.p_:f`DLjti"'q7\eUYYpcI];Bl&S^:o/1t]UC85-5,!<@gRS`p\r%:ZYl@<J%^.km_3"Z-W=)>.Ul(I$PE9C6ir"phlW!/k(W;Be6DYe<kQk[_9SurpHZs3`k")^QKGoJPRtB.[@k%@Dk_i\7Z-ba-rs:\r%I?<)i1.lZtJC`%)l9?X6EZ.]@$L*Ot:SXi9e*/=S[!HJjrQ.]^p<lgOT\EE5Bd`1-L!%@\N@QJ[FRG3[Q_^+_\&TfhQ>SH^fZB.G\r%Y&9'a1]u98E>JPSr.sl*N?E5NWtQi,[A;r"Cpj,+/"S1X4ZnkQNqMtA&D^BfT*3nMWQu9>WDA%np@YXQ'[VI5NHP@Uh5MXQ$pLCL\r%NuUpM4WHP.p^kq1DW&DFU<EkS1LmaUm4%mrDf6F'^F?l,M<s##][_;?i`0.:T2:pr8aQ:AAbI46<W4H)rp6g!a->TWqb,HPj#eWZ\r%TVWsG*ZX>&\<rqQhAe`Dp!"#mpX>f4Jk^6tOh8Obh%Z3b^J</r%A]e2XisR4IHJK2:We%`V"E?2o=dDY0_pPSR%K,YDl%kS\d$b*\r%rfjd\^L_LN.Z#X<QFq4='E:n]L$3Np,&?'3#>PmlT*%'./i7i/Pb11Z<eUcBo?FJ->5;hg59C?s02;4QC%&H$YIi/qi4PAHT8#c\\r%q.;P"\,H7_=9f/u+64=k]`a60CHUD3&e0*ae3jDQ%')@+Ahn:52P3Gl`6q;`Xp3X^]!g@ufE_fW2ub8)"]FVGb>ZX0i'6PCIu06)\r%J+dN`^Lt`%BT$N4GkU('Ll9fU98Z8Fb&c[96dLM67ktkDDf;gAPdGXR2HmT9HFhu09_`L-<"\]p=mO$O`3n,pTk<K'\WTd2[=m8,\r%V:m4Q&!MW*2/#L"`@F"<bpdq,%j^h$.)qWZ/YTl/&fOiZK_BF4!U&9YefErIBZ?Uh[r^5GQtnWOZ5k"6eSsTIjOl\p*!]Os*qa#`\r%qGB-2:+F4iZ(?@,^TAH(HkT1*A&"r(mF+LlJALZAdh'?%f&!6o*1WSd/S1'**r[#3-%sI3c4=Q1qAKu0V%WuE=Cu\>:j%H_3P4Ko\r%+rLUWY=3]G'\.ja#=Wqe=KeIJ-nKk0G]ae,fiu\3+6DA<V%n*:)oL6O9a+f]T]`i\&GI6#*04tR&;16#E.H>+b;I`h!BAe'8,D]Q\r%[/XJNiO8O7H3'4@CfmfM4uI)#PK(7<_KOu9p-s92>J9meeX*?3Ol_J`QA"2G^$1kI\;M>-'u?1R-d,0sT4*n;7;g3kUL]W]ipU\f\r%-B9Vi7YX@/aRXegAR`_)+_6]@ZH3%_QAH]rrC*u`Aa0l>BUXII.7d#G_U&sY#0B<FQ;j5%Q]ZB()kB,DM1\=Aj<RJrOqaa$OenkA\r%8jOb3ELq?!RW`tB(,X.nU$VgWLU'^ApMi;hYoMjY*p:@N>(6E@_cRGA<^6$TA%`fJiJ[F.4ttj2-h$t]FMq6ElT?!WgsEHfA"e.K\r%KP<otFU>PgG;OC'9A]Z[acnelDAB4S53.EHm=4O(jtRgJVg33!-[tP&2B[K<ejj(S]^Z!=&&!#MH%<b-C&VO.l"J&iNtn/7QTj>c\r%XQqpt`MnN]*'Lh&"r3V+"5$Pop0ZL%R`S90hKeMV]=*=q_)utVoU9%S_>J2anQK13Egus"!kn>3%Mm-RQq"&6Hh1OG:pV-<`K6LS\r%aQqsbe-hjUTt@6A3A]mEcs[gcK?:55.A2d`bRD$?m+fhGi&"'l\[2u`#;kkE=rt7:M3c+1V:(gg]Y=,1C?kK=Y@&_R#^rBrjjLYf\r%hPD6q3KW>1/D`i,dZH[.[Y:pL=@c5dS7I0DFQ12TWslG?Z-s,W,=O#)DNc&cRZ*_oUOHI$o#RYGmZ8M41HK]p:MUV&amm7GXuN=F\r%4[LYoHu1KE^Z9?\`??R4/[%)AS;T>Y+hetBM0st0*/Q*a42'6U$5RFu<WNARGRrg@4keU7$'uaEC$sI<S9s`P]&=mcd2folmR,=o\r%lFIL3=n`4=faUHO.=Xs<jThF:_#hh&H`#iLnB`g0.,[eFdVVt7C@@EO7A6lXqLl\nlI?]XEs/+\j8-Z;Y+n?CI*/#GT76,&AJpN`\r%\pf6Xf>$h;ol[eYAGblD@Q2!SM:F\5F:eI.3Jd!SPZ0.OpTSBYg@#3b`-H@pUt%TT`c"]b!:*JEl1e86-U@EMj%.[pgK=M>Ei\3?\r%?%c#OY?O4=Wp'$LY0KDCp<rB\SG[._(0r?U]#df_h$mLi0669l?dDES$WS9>hJV<>ODX65Bt5>VZ)RoDAi#+L6b;qW4!M+GXEKQZ\r%U<>VCDJs(Dm1I'n3KisSUdj!clY60bP(,("rGcg2K=N`L?T?h:HUS%:0oGgKnQ*q8T.0W_N4O1Z!.<^6iXC!6F6NN)EJkL`o0CMd\r%G3s!\]:qrK7p5rh&n8S(GUM)Q?dmGl8@)B$Jp.pV4NMtKiJS`=s4WqE]OH?VAr@2W"hq\.qoFoD&)VVOjLD(:L'N_$L]4o3i/stH\r%SFiW6J'RlQ:K^pen"@KE/?QhSZLHuFZW-?:XXD*daK'GPh8Dj/\?$WnaOg6_D@PZDn&b$9jFq+D\;/d.mNqW!fX92`?+G3+^cku+\r%rUC6_qm%37^O2K\Ydo4/i#2n4Uq>angg[mg[H1!.D@YSN)jH$%[r+=<Y^Zg3Yq5%*%a_YO7^PD6PXdoj0SVhW1pp$H)J6Q4K^[bW\r%B(:73ZELQ"VILsoo_D(`O*>b0hV%FDB?0&'*KPDf4Pnb2+uB#O"6$LjUW5GX*q/Ij0-BA(]Vsdd'HT^%;&'"EpH!dnp!@i0JBrN0\r%mq+AK*Bg%K<p*Co=0CB2`2rCkftZjILj>OY1Fs/Qr3).2J_*ki<FX5(*U%,kqMC/H16abZ@\t]6bDh(k"^K,6)T]_GbR(u'\JH$c\r%7!c-$2sCrg_\6US%<bcc-!3!r_pal[qAc;Cb@WEYNS$15g&[hip#D>U$N8HVT*`t/KhD10\d?-<P7M^-i?O`u+3@4O=;&J/dGRq9\r%%T[iWXLZ)B6Q]1PUn3@FYFd7$Imi>!P9a/sWTI.8VqUT[&Z;_-!n4@Z;dO;R-WM+gn#TVr@C"Q,N>/Wjo2mJ2q5+qN,3$Zk?L9LS\r%p_A@?DiT902HGS^L:4UtGa`Uuo4e_r@0mVF!@sPU\lFbtKB;Dujj?[KD-706'"-'sqr%9o#q7u=S6ZZq$qI$af+/R,s*.+Ya^9sh\r%ZGePo->?\-WVkY[GMT;77p.%;0)TP59aiWp/@1:&QpnGs27\[(\K)s3/5U(Ti^4,SG&(6uo>)^/Hq^9j-ej1,9=EN)14')aqIIbJ\r%@9!g4E<GJK]=#:QX68+$FRN+GJ!E2[<Y"&D7f3C;poq:iI,&&YgY_b+K/(PY]BaLLa)[sclOttqP.U>Nge1u79<C"I<eY`&GK-Ib\r%*\G(K4(ik&<a4sbX`r1Fgh)2Nn"[/@m<6n^h+EkO68l[W`E@#5YBSHUmAI3t/iC:Rb5:Pk'\hiWVm]bs=t=$$OZVd"e.u%4Fc324\r%2:XfZct-FHrUm\1YgupR``=djYgQ^>a0<Y6JZciKF69Ja7,1Ht[^)G.h1q:1!.=[E=80IToA]c*Mu2t84E2m2s2FK.fD(iR^\Q.!\r%]6C`&mU6Fuk$R$']X`H;[_)S=jm@+kI9(m)&C,?gB)+NZeU$*Ahu%\MDSF/oifZjY++C#8rce/-If]$lBDLn\B7KiOj4SL*s5CHV\r%f,EhCK*gD@VZ9qLCB;n.T,th(Y^?6%YA"hW!Kj4)*3%2>X-])B`Ho>\86"5XA7<9B^/BP7EV@p)DX\&'eM`c#EXk9PAqC3)J($@@\r%\*XGh?@09&KV7els#=N-"'FYtOQC2N0.8BZo?cX0Gl8IQhgKeRT72RP"'-0#-n%jeNl#Nj:MhS>pQ*/_h5<d4l$&@=IG]*^MW_NE\r%5oA+kYoNrB0<_YF=6R%qrNI]k%0F:e"QIF/Kh4Koh3tX`HfmYcZc[u30J<l.D#+a<#,FZ-oZk;JQ*tr9(sL1@)W--NX"dJ=*rp`h\r%(sJ&V)P;H`lZ%SG'+U7IRcmG0(-dJGN>%Z'Od$!J,`!q>I\7!+T)Frc>YX-WP8XZ7@GqmP&*+[+S-1G66LFp#k-I;=33[Gs(GDan\r%<fRXDZ,q)ucE=ApkYJ;N9-+n`6\G&Q8U0Aib32k;R4s<\ePOTDnoa]Ba=h/c$Kd10-Eg*X9sbOa_TVI/B4WB0DAVM+TUmT<aJe<c\r%A$VlB3X52%@u[Zj$@^5nFXZ9L;Cd.m/qP(*f;RpYKcMl^)Ho]KRbQ*F@lb=NPa/6`OIN=A<;rLb,k#Lhm)=$tOitTPe"K9>INBQZ\r%kpIHn,X6jslsmcVY=E],K&jVC)b_Usm?RD>$\BJS@p8J[E^$dp0SNoYf!MAI<+,d([")fnf3-cU.9B1kNh<*)cG=`HjK79E_*%C+\r%HqN_YL@BA?a!lbc&Wk%XbTam,r-gW0FU@3/fTolTT$I8'rL<P"Io&6C%uK>mL@K'bs8V%2_g?VD7d"cTP75_aZ'P2*e9?cV$eP[A\r%_@o',GE-qQ%fCDT%L"1P:'=T+a'el=qZ0DdP_P#&^k%[bq1jXk'UtbLUk.*sEoq7s#V*m_F6stG/g@gf)-iJ*nVcpbN:7;Y_`9]#\r%M9/:%?j'kRkL0^[:oE[u+ojWp_CQsB6Wfb,f&dqNLch%T+:Y_;"KQk)nB]_ujCJZQ0>7pf%^*`C3^$]D:RAtnD4!S?'-ZRAOknqr\r%/h,.%Gd\k4^no?JZ<Q&Va(>9t>K872qr_D(f1pr;JPPTYW%NkoL>NO/m&*'0qnkY9:F+LF%i.M10j,mf)1^&m6KgX:jD.>[H01@:\r%>%e(&+Hh%QEZ-Ebk.jboi.+]e'A+OT!,P2$-2WA/_CC8l'<VA(-nbp!)&=oDQKO>I#es)H9?Nph4ARA;$r5S@6oc#sM`s'%!t*H'\r%O5k`lLGCL@PI/Uq0NIV[3C_=,SBp5__\iM#$RN:$dbY7'kOUM;B)&,5BfIh:$ihuk`1UsGQB.:cSoMZ0BBa=TJT-(Q^m[7.9E:#A\r%U:/Nr#W6YWR2M;VHGMcoar:n+7K>cGZ4IsjXXk%a#&:%>GB*mBM6jFq9Ha]rKqQ@n"u#"*E)MGL6I*@`8&:Y7WX.ThQ02i))M0`t\r%!1,*NVkt/=nCe&uE+3n33V3+O6i!K872J7?SI$,K?m(hL9#*DU6]e$_&Zi*k3E&alC(lVg/JF"\T&V43#*p!D]R]uSg9CrqTCDt"\r%]?VYSOs4SM-kM,5JP?I:*K/k7W8tE:EZ[RE65;K^<Qdp!32-`b-nKYYJ7M`T'i\D%VD0Ms'+2Id0>[l\e_/eTV%aZtT^ULPn&)&4\r%/-9Y/GQpoa&-N^q]HEU(M.@ZX\adaOR,hrsi10*Y]UiUj"<`gf"JD8qA3_Y@8NrK9TU=*s9\N_0p&r62K\A9.MKcp[6"]^JNu`/0\r%8"kN,9em9Dd"LA#@N\cD,q&iAKS"Ef>5H[V!0^LRcHsrioZ#<k6'6.\(e%#[!,G1fb@<<7Fnmma$aXq-feJJ;a]'DIC]VO)#Q_$o\r%(^u=RO?83-$41S!!=hPo"t[UG7l!_e/"U5"JH4LkD(CE*]V*-_]r`tm0IA0\XYLG&k<N#Z6P#'*;]1k\W8%P9:HHOr6dUuGRQ3)'\r%0[t*.VDHM6#"$r6924S5K#9!XT;%&K"NI8I!q_ZZ(rg"jLd[gq1TS8_k"\`5?tE[Ql^Z7;7Sn%<FhhN"6"&9C4/7^J/VSc_1m0"Q\r%aVLBR?j>1;:!-Q?;Lk#]0G\%A0&"8&!='`d;qVnMW&a1<3sV%F>$9>mCL\dp@+UU<&fFg+XN\]'8.cQ/9A?ak=1#VV[>Cu_THuRM\r%<VW"49*R##;3`6k(1/NmrD_q@&j[hDYY58e]%[uH!2ik?-7;hK!,R(tM!h;t\^T=R9oNK"aKeRd^e6'WUWs\2Ou`CUBfj/"Y:GUj\r%KddhE$1'2s:rk]T:t+pC@'Kk%W+bSsK$7>u51Qj0;[np6BOfIN&!I7Q:?^J&1M#/!!FV?Cq,Bs1!Y\k*f2TNS[jEes>$S<DJ42!s\r%;2'r/*7EP__P!W9+IVRY>[sl;bi<12;?Sl&dbBp(>Hmb1<WiT:]^dfL;8g<YL3GD2-0XDT]KntefD@"c(#@+Z!!\N,234!0(gJba\r%(<`sTgM+m/+,%%0Iq9A*B[[pS[PY&3eXE<d\1(E\_hK6WLh_cT(4[NXIq2d6ngpi^KXu;(E%Qr6D.Q]GCq!-;)0ML,)!t/4D9=UO\r%;]2!_8>D&j%]oIQ*<._Y\f-jC\8"aW&]VU8.r1"N)!KUlf&\DUZb6m5=?/0;ID7H&+\/AD9"'9DYplUTFl!,icNFMh]-8(,)!B"k\r%[2=KJiY$EG0O:Vejqu"u(m8AQ")HC0ca[(->)InbLBcI-C)XlAB)uUHIaj_lZQZ85ogBDH!e;j+!EPSL"K\gUkt6[**eFB6H5Nt4\r%@%E=n(oib<CC1'^=\TsCitVT^lbW]\Ere6J2<Q=R_K6j*nf,M@=UX0)4FdHh12fE\2c]MsM4-[=*q`IRk08Rj;S\ru\I5`J/(C@!\r%@*,FtC)h@1^d+B2YphJE?u.?2>W-@/JO*oM?Ee#IaACj`@]3L]kQ<VAi/n"*/Lq!t?k#Cp7HHf$dA`O2%;k9+";k@gb#pSs!1[Yl\r%Gf4n/-Cl;[$p;J^FGA;H"uq.lB0eeR!T6($APIU]"1uYW.tf;m"H.8NZ^(;K#E1eN*nl\aR&6gt-lbLN/XWgI_r.%aF3l\^^aZ;t\r%dT@e>XQo\5?I;5`)2f%:MjA+[RFN@k4#RhHail%2LKTT:Op)&UeqEn)ZFD,5l85)+D^%oQ@uY`+-r`VXVDnQc;+l4)-W[4%#(f+R\r%IRI#>pK<Fo6=@ZBV@e>ocp:MH"CN]Z,s]r^[^7oKXBS+I7odVDRb^aSS9T(IAehtgXA,8o$liiuP\u=%'Qm-B7gps,d>21dO"i$=\r%@q)7E#"+Ks^s*YfRUqn"n0Co%GYjaEOIVW.;/%Fbij6jTi=.E4-JB)A5i@m/\%5P`ii?!*8Dta(oQ]f@3DKY*)(1Tc#dX7o.,:m2\r%B#'\$l:CHP!17WC9p;#ZF)aBSPCNu?n\/*'fYe3%m':^RaTsBPd3.B"->>Q13N$p.?pQ)YNp=RBqb<EAMRnOnd3d^4MV)"eb`Y7g\r%KoY)k6&mtH*!;7p,d4ft8.da_W,1I%KV7S0Lf7N.+mUO'G#T$?ZmBrJfasrob:9^]!7R#SN(,DSK,I`_?.3bXi:gk\48QZ0[")O6\r%\t[O_0sKWJ04,([4s$R8.n':<!9U4FP>,.j,h.Q>2'N029G;JNk,EmI"4bqSQeE<XPa#-VdoZ_i/GMT90NnkclAF##SH<3.D9*W,\r%?kI#f#QVK&&Mu&LRd5QU#3n-;&ah&u.KHK\mMAIu2sY@N'Z"<<9GM1Pj4i++B@(4iTrLj[(WJ?:CK55')6QG[g8B#=n17EJ9^"JJ\r%JQTraXUT9e&K$a54:#^.VGUo*K,t$2gKKqR9-JVh>"_kRX2+ikX)XE1:`F[-O-SlBRK,4.;:'EBL7jRKVHm%%2(,4c!YGDX:KbUY\r%.1\[l2d'-`=$.4:(;!M>)@VS2L;YF!e.^3QBj*P4D`1+\aPofeXU\)TCroOnC.qCb(]hV[basj#]oabNZCZ>$ZV4.1E@T&h<\p\C\r%O2#Q/<5Bp+'Mi<`DMtIX=qklmF]Y90Dl7iljf&UidSSJnQmC23Z3rY?P,npu;W]gCP_9*BYF;t57"J(Rgu$.N]M$G5FI(Y6CAK,(\r%>B+:s5\R.JJAO.hr%5;LZ7ToKjoCp8)EpSk)ZigDg9:qf^g+1RjfKX.VO49@0VUIsrB(gr9uFeA$iq!li$Xp9#\.(1B]0tOdEBeU\r%MQ3b)>RnQGBhVaOX-c25QoInD5>J!,Id#>GqpcIE2U+iZ[8iUF7eoq[KA9/hf#)Y+h"H(+C1\OO)$BUjf8-!Bc?Ci+@07-0r>:[,\r%<1pI)gH&$2*<S/S=?+gJ#V+&k/6YC=Fo_5D5XUB=i7u>P_Q>^FJnl1ketce=Np%`#S4hoV'.21<!kOiQR:Fa^&qP1N-';'3]#b.a\r%[Mml\D)Cd@!2r0joP9[n1_<.DR&F1jo8>40U`?pRN94uE3S8;+>4mp"KA"+ah6dEZ\fbHElg)ds'ZSa:+o9%VF9YX3k/n<'Yh1>=\r%/>W>s;<N/=B\\eT`mJW!_Y]7u;[_M4(q1Ff#Kmt:BI@3MTIg4f(CXRQZ)A89/!.[rWFaUfaM\K4i+149oQL%Q=;]M#9,LgG"K^n+\r%B&<#D?jmsqd)e^QMr;]Zqki!phS1,Zf/3M=&n;Wl3R/i;^hiFS137aBm-_149F*!&=VtA$[Z+.71!]orSM)$ch#jFL[T5;0(_K=0\r%eE7SLVe2V><RD(!le]AK<1luA3-PhJ\EhU\K?!gYTR+kNAc]d.1b%!*Z^\b:2AO2f^bhK<%5fUh#J\D0Jl8)tjY[d(W_/.d*Q&;/\r%N2;MB7Y'5Ek1o)Ar=VEh'*3YAlC<o<KVMYn@YIj"DtkqH'kOHnSOMT/#h56FfOp-CZe!X=auYQhmD0MI7PiEa(2!t!!3g]*86AR6\r%Z\G_C*ANR1@G>BTU.dB;$o\EDigm(V(a,dB>UBqE+Y\VO$>GA)%&p7\3(A7eJrF/B9Tq:b-*)Rf^(LJpoXoJ\'S2^PK`cFK5b^;n\r%h*D7.<@<YoHtEG<V;8[!7bb,ak\h)9mssi`,F!f1_XFA*djQk1J3\*S7/.H^T=M=:4Vb2=:V'-OGaj]c**`8-CXCGC7IKD]9fHQ.\r%X&qPeD0o$#)X]0`Lj,'Ior<?j1C!h3++,)C9koDocFop+UH,fo;apRDg]Oi?\>uLQfSN!=-,MDk=Kd=YWC<QLfX.)\Wjq#CU=kjB\r%j/V!T(0%@Z)2L-D#Y?WM9M$\@7?InDbdh<XO);q5Z\uLH"En(4eV$5-X_Qajd1E5^b"`PV$UL\&dM:`7fC>)lI#<.#&ZGS&`K(#/\r%Ro,HX(u;D'_YQ+p7k4[unH>Z7.3jYWkui,gK!<Ot82u,i#TO4>7hDPpX(%7F'sU5[.2%%NN"mY3b<Rm/#]qb=h@Qp;DYAer=HXTY\r%dFNF?:DWX0*)D0sAm7U`>[C3r2pqkn?`.;0C(/5a5cE,,;ZJsd?0Gkg%"ZM($(IX<*/gPZB*`;teV1I8$'\GpKW6fdd*Y'0ZrT0E\r%cbPoJ)JIXm_l]oo;0i2mIoq;.#jQRumE3VeSs"O/'V^P>6r\u>W7!g$Ohc*E2*IslVZQ6d]'OkgYf`8&;+I4.p+>$`+`Peu`ei_Z\r%"O,"(<B]"nj\_pOc/,'_oi#I,/H\$c3d.NeK<3NWnfpd[RNFhHkVF[E<i`A2:$nfS371"$.*G'<7"^3LK6V7@$a])^K$%,ljHu+;\r%L%SFB>E(=/YEYWXJHFb$;Y^[s<=Gt&06fon)BUAU[t;tq"&Q;h=SGK7-I:RA.k<9GCKV,!Pcj;q1s%aC@%)5bH#&<W-5jnihiCe7\r%2/u/.JN;uC,+]Mm[1I7W%gJ\4k[\apO>\s/C$1/#`KYrfE'ReT,On>.G4Sj78kYOr0:ocoCT"uDluc?G"!2A<k8*(q:URU,fW"+i\r%Qn`T>f0#mRiXDs/O[ND[T^AP;o#O*?"=D==9:V#u^mlt9TSrSu&PCUL2(A[?aB:u62)]^-U!.p%q>JuU6>j_RBAuapQ%9iT>DPr`\r%Pnu>G)-DeH"EXqQW1.3DVm.(j5%G@kP`HQMj\6OSbbA%tCLIiF@%(hp`;n->8Vbp[prkf&bo@*[0W1T0:9a0;*p)KO5U%^_i'DR/\r%WGTo'0EJQj)J>B23IT&Eq?1=3blq#n?)!f]O.P"m6s.g?=R/ibi6eX8'U7K,<=>_/kD`gul8bUHde@gepKMO`ZtD-Pe[0#?S)'aL\r%'aWC_T>J4`!mJ63ES:`:<6a-'*ha%Sd(9#VN^ZrB>qsL#?qlV4*8qMEZA2+`'h@"_P=0co;B.8?QTRm[#gbQr!ht,Y@Vk=bMMZpk\r%O]m32F#NQ2jb^.uq"`R4eKWnBFnqf"V3)JB)UoILUdtPoP)C_ZRlNP$h"qd;R%S2`4uQQ*LA'L:8DBIn"#SmT_&CZLR\,JQ3U1pd\r%1B;ta="H34<ZUW'@TAH)_Xk(e1U'Wse>gnP!f+M\'^c%BNf8b",+Ycp?Sj8nil9K\dd]'%c''[j/aTN3$dAQcZQU0TL:jR?INhhk\r%/f$_>5hf\N%2%Sn)/Y"70#fO"rt.%+@<7We>mhf]ZR(0DIM#F7CJ7Z4'`dMK/a"If#AONJl5(W-.1?jg6X\IZL9?5>@*UJdNB1B/\r%:JA&o$6;miGtCR6Mu^kuf^A^^.LUen4_o0^,'m)J(M\gA[`tKp@@[+N^h132-HKTH(M0\MAcV5A1jM=pF><ZLf92NVWm`2cGX<q5\r%DFe8I3hiZ`9ACL$5nAee$]-$Y=liJgUo:EVBQ\e^9(F50;'dZC^7/=dBn`LVgIdaOjJ(S.[#K[3Z)^^oI>p-g8cSmEDY)=X0>B/s\r%eBJ4]@^<AggbfKd4D+mu"Q0?K*:gr_]B>h9La<h[c]Pn-I\0kS21Kk+UVt;rF^\5M0NZM`k](89p\ecBLaVIu)YLS;XSFKD/u9.I\r%J!Q-H!=+"el82H^**_-=8S4G^DaBP<iY?'G2H:*Yi$O[ob=@l_4i*Yq]kED\@FJr=1i5Ca6&dH0BUffQ:L+GkJs3<Af`cU3Cl))c\r%lKF'`rKo,jafo@-m-hKam1V4(>B>1mCf!OT@F;D?Pa'HYh/\hRECMY:=XTp:WIT?X)4be;@,nU_DTb3i^iD=H\nf3<4665qN$gb'\r%E0ip!S/BmVP2ufX!p=A[oUO0Z5T!eo=uN(n"@-O$d\Jo,LS?/[MF9?'=R7<#C/hRUo[(UZ#L!IUj\AB.0!_>ZeKi*LJb,\88LSpg\r%&ZDSH1up*ffP"nPLfDJg8:4T0&SQV%oKY:nCqE$$"t&]RN#+Wf7p`H\Y9mL$%FlR%Z2c0\/dnlfCY2g?hbKB^k(Q>rR=kQ&odW5_\r%G>Bi?"Q2=TFuu+n,)efda>7I8Z%VC&`R:l`))kI9k%"A6QlJViaY<"!3stHcP^Z<s.M/QAb7Yn`&=k"4TI6#/@2Nd'U;]A76(t8u\r%E^/fETP#u1A!Pd%)+!h-"^#p(;AQ/Y.G7e?Q=cQc<AE`WlO&TbY8m_d>u;A#2]+,U7f#&62mc?a*$q"3Fe.`I-J]:rARN!8MCl]E\r%CV">mq$S;sOUUS'%k_*J(!5!TWb\9gZ:8n"BjoPu)]D3M?nfPc>B=Q#3'QD:VQ6*aOVKDL92j\F(8G&cV<MtK8amnl,8c$`II4#Z\r%8uqAFTr2$ms2CERELkHVe_+V\B9j;S*Y"5'%.;'EhMSeg4Pa3D@-=\o65Wje<B0P@(_'S\Qos%[*/6aiY6I$7()@rO(RlYTh.@fO\r%aTRKgC"Y$O6\gj3bXj&oqO1M06qP1eOIi6P$4f"g(@>Up(d]sn;3.X&p<40[.MgQuG&2^sUIk!1=lZ>4VaQOjX-`ssTk_>!nVKTH\r%'(q)EFHu24>(j/Q1gWkd'S9=D/TFQO%$/JY-3D$BbG?[%Rr.plpcEM*X)/?(m2FYUk=s.Q1/;A4rsA.U9%m*P!IdB4Y"^ec,'c8]\r%R6$5e&imIq]=dEd7a8iG%H0;pAO9A'TQCpN`QiEu\L8P6lh(SO5'N\t9+Ucr8"CjW2Fb]&R7fMFGp+68*<h81'oBQn[0j[[=s%<j\r%1L5t\A5"of8jMZ5&C=8M8i[0GYFt&n,V/hmJ>qk_?eN=ei%0-'00m0E.Hl+RQnomT?*qRf$uXp$h%UBC81jNE%Y2Pj"\_)$EO7E;\r%ctGP=Vp'/e2KHO3VR"RmA@-BK!e=3K!WiVJ&Qn.f,P[MPQjc7t'nPNH;rUME.UJ8\1n.td3=19LbiYDQp6XjOou*IKJh`a:BmMi%\r%(oc$6-GY790j@dNOg<g\6+')E6+&iWqnaQ*_-(b=n"QYI-/6"jC*-iLBWTp?+LuY4:XFApkF5[?,SE*rj/IR8S@f?#!.Ys*)D@+U\r%*eAl&=$^4sN0op$<(lHV`4;3mLu_-!>4^BG[X60pCl<AqiXH;!%ACoIG;,Ub\i'hnacIPS6ZCMr&L;oEJ=>%*H$'q]1eg#HmIX)u\r%6][`Uon9X*21jRo'9hi1XWatpap9K\*M#!no>a,#:QeJ`8Mg2>4=ZZrL3SX9V1$oBFDO4g0La:YA7/-Ci*-YC)$>c&5p\a&2P!9q\r%Kn*W:[fBBS%M(beJ^`8tW['dr_!K3a!\&Ao/4k%,h6bLO/4^9qa*s=_ZlQZt)^P9oSqiA/)kh!#(psThY1+JCMEOL]i%!,Sm$Ma-\r%Zm11463]T-eAn5SD8l*IZ5F8Ol(l]^Iq(^GK6\lFG\O(F&5:?S\tX"Zd`JYd/$NW4:X+c]`,e"MO&4M$&9ECu3VH1"aLc=ckgZ/L\r%5Z)BH"DT-oS+V#(F4/`-C$8@fbcbiA#<(G1d.qA2!=\BA(*5T)F&;WIMZsq8O;u,F\WO9AAIa+/K+JadO/40gZm1hA*0l:6B!&)+\r%LO18<YZ:mH1_hAA3guVMMO)=U%BF5W[@@Q*"HA&rTjk9^VP9n9qZrFFZJZ4!?lb/^(]0kPZWK%OZU9>@m$D1ZW.IYV0?#Kt?j@)O\r%-p_2rU'SSOb1+upX:ZYZI,JDN;[$fW(^'5V-od5J%T]>,P7!T3M3AtmW4N;.)q7t&Ki6\3/7o<VKpcH%F]jm5Yr%L%D?Y7.,$3M6\r%MsRH-U"VOGQjOah`B$,g7k)+$73tG3&O\_RS-'\e_OO2t"1_T.U*Bq0C:7Ve*r;#!6iTR9Lp0WOFMWSHV+B%UV@'dSWs0kRee@8C\r%J#$Z(64c:W#/N0qRpW9q;OjLALbb`d:r&?Zd%,"'18@^'hC5teM33)5R&jI>QnBli"O%q9`0eq1=V3qq`7D/7O5KY!/d,3L-6+U+\r%,PL`oV$E_C*C[<SRsN2W*ba0"\Ih@MeLhX,Ut[Un7!/5:OV>rQ+!>=D5oOmdIZ*s"HuO2/TZH2bJ1""QSVh=,9LVm8kQDP$>DcF3\r%73d5Ufl]a0@.BhKDI7+LgQm@_UJ.5aU@g_gXB(9k6"1hLdWs:eiRO'ka#6[FZ</_r9^+HfCguD5Aka-m[KX,9^(?#j#.#ZKdKnVW\r%3%/4aW&Y&:l].r^m\(^U=cB^tWZHZIaY_%]ihIQSF*k3i.',V9FSU$D,",j1B[TW5d6.Cd)Gl$#Qpal!7^?oR@!'2I<JkB:@9ZAO\r%:m\qho#Ck^g\+uP`F?l##;s@l3pobYV:e]Q1cY,p?n\WI&V?q$OU1Z[>%+VY2Un:J<OMRBS61Q^EmV1(6FF%o573<^X)9JL@T#u#\r%d&LpF*?d\*][c/ieWF9hVr20p,OheO;[(Jc\YGdg*_5dcC'&ii,sVU*eM"*1.,#b%&[5&=%3gk5"$^(CViekH:[S*4Uq_4OoO%\b\r%]I\bTI*S^OM<_^M8>U7pQ@_Lnf%Yuu%[cf\<>NuDV<_*Z![-3>23=Ld8Ug?'fQAd-18AlfAADb>j>@/]F0&ineaqqIrqJ9(1?M8Z\r%leHTbTT&rRXK4r,'1)BLE%b8:m6'-(?fW'$(<T9KP5q(Q)o4:P=lVqSLS[C;H(oeRY&P`CJnJkq,Z;I>OmPIM/u<q0DQf7E`'`g7\r%U4a*-$'2h5?R@eg6'ZdVnR[Th%urn8o7Z4@>3Jt4;JbYR8!@.Ljl'!ULjPit`\ZYOC0*pGl^>t=4;:7`&l7FqG/g)'dnK21JtK3]\r%Oe!>_3Uiu,m,,*s4;ZGn$=ln`oSmB5\[EB>(.b/?<X0<Ge;+27H!V0H^juljnRtO(`_:[H)nHTXir^fE?F4gEkpX%-'"rtUMR.8m\r%i^^r-JgXgFbb'4G(UX,[""W-@/3/D_m&%e6opO#P0MdN7EWeqQ?#!CC3s::<ULr95ZL_B;_c`0m-)26eWH^h+ME.h.-a6..N)$d%\r%f0C/a4tCPf,]RIP<r?[;Wg6cHYY_]Lb.:<*,n_TN0Va4j9mVPZ.X=p#GP\sI[!YTC*OF(U7\cV"/c=lE83neC)^O?7-q87$VGWD[\r%;5),lbPY3fIlh1#-f,BmD"h,QDG66b+M!,K.kp,+Eci9MUI`=2jJ^\jb?QMaJNTa'(2.c+.iun]n&AdY5bW]?FR[Afc375u?B\G)\r%-rBT);!Zm0IW__r*[$Mmo'OEac+C"mcec?[Fas#Fa0VB?kbnI@B4i%<]R080rqj$oIe1J%leDB]>H0U[_s`&%IJ^@Wru2pE+)LS-\r%.rOqX_#Lp!^;cEF`%bano"!7B[D]m\7ZS2rl0'HLX#;$,RWk&DWo1`]!DCchjN-2[^m_cbI^^eaC-a0(?*('`$)jUHGpBJ/V9hJ5\r%+E]C6^(-`d8%/..8>kT#8dYS+jM<W]IG<VZNciMG*'CUN1$9GRY4G1K,Z$3p#T+66WD%cX[2sf$ZR/Rai64X<NOP'@2p761h$P\:\r%9UK-h^Te2<Z4`TLYZ2f2AaYpW$+dP[PP-EYjKL\<:r!>tGdLp1*@hn%b'@/gTKqVA;!Zm0IW__r*XHu=Lc)3;]Q.n39djn;o9Bts\r%)iS#t?`k)81)--0b;8R<aX`b##e4)i0sYO;,H2B8Tj8/('e2M43p`8&X>$8Sd1Y(XGoI6i"3Tel[0dCKHu4FVC)fWJHs_HI=s;G*\r%m@A9"2[g8KJg3N\WPMYqFL<2/@l%DR:_MYVR-YRn]Fb1t?bG>idA]^uVPr81TS_JOVAHmLS^^h<'pIKqF$O;SXCGGBV--NaNPk%3\r%9L.2Z%$fOH$`&uVcX%0U5\7)0leD,N3NR!+0Q/IF_k]MJp%1T[ZlOu.&SG@`.BOGn^+fVJFl,[4X9J'cZPK&\6(IGSlJ2f;F:X^1\r%$!/krAuUI#?)r?H<e9$`4QWS`Df*mUMeRmQ",-ds*!Jt=YU.k_1Y%d*#Z-qie@N*%?OlCV#K#;U_/nUD.5Tk<0ibrJ,%7D^f.D3s\r%=CnmUN!1;'O@IHS]3Bi_-8q&;F[f6jV"=d.SDpOS:`5b#'NT(?<q#W^4&@=ZW>BO3pu;u;7Z'kc.0TcP`[\C!D=<h/]&<ZG(+c;E\r%*EF":@PMPNBjP'&Q<?i9N?=?iQQcfPV.f<k%YHBG*iudu7d0Fpr`t\eGQj!uWD>iGAZn)Y^+Es:W39]54ch'g":E-]HRcI]FL7SP\r%7t:T)]1T/?gUl!uDE&c_`AO8?G6.635f!_!?<T*CMCt8M?pM1afr[9/Q\p6p=]'VQNg_bb^km\lF0sXYk[t$iHNI1@U[j6ch\LE\\r%a*EBH",-dq*<Sr@LW:<TMqJ]X0]fFbg0=Ef)TiKkOLKf.gY="Lmit76,2_o(YdT3tYhhk!DpdR+N%qhS`K,3\hQ<I7jbug(gf]/K\r%BN3ZM5eOnV\J#Lk\!5Ve4N\/pYNtKp.U*T.B,A5[FbV>`Ptj!,]pjash=n*p:3N8lSGZ^QH9pS;nCR9*b(V&.:DRSI6k>p:DXN`G\r%\3uA;h$RD'j-JtHZIM*Pm].kZW'K?dhuEFf-V_GH=?A2sO4Jja-XJF0,(Z7`jsX%K,;<k<>M$'=Fiskb<F>2I@QD<L]TGV#]+m;q\r%([2a'=%+YlW=_$e0(S@Zg+US3pMEcek2oNaLjY]LmbkqgU^NDPg,ugTr4E)R@"hS;[eIjOh=U\GXs2u4N7'Z=NkASI"3.IMX<uke\r%FY$!4lku_N*)KdBk7Ug47m/-dZ$)d:T\NOdYI*Gr<]qnt.1dUHkg[2P]jD98L'OVs'e*6qnJU/2oO+aO&XBtro:IFb-)osYS30WY\r%$hCT@MfGFk<`hF[-rB=]fN%;)=GrJjne;@+\Z=5k[_6#Xl\5Wlo+ku<Z.1gcU9`OI;Ri*F4kMm9U>2#cWX;_n[\U3ED1`m'n5qc6\r%$./D]g+/=JUd]2uncT4pRB+9;[_5lTl^@pRneN\4&C_92RY5l8E3RtS(&V(@XA(ILU0]+A5jfP&q2Ab4(/mt+=CLS^Tg5$Hi+0eB\r%*S,&K9o]8U14i9'CYSaJY\n])!cJZ85Ktrm;j%Op&!h$:#,\%Y8m:=o8\AA\b1Ii:dBsE3^L;i(",-efXFd]2b,AmO'l17J)Fo>Y\r%Q*Er`CYSaJY\n])12dbI%&^7:C^Te-moJA^3@rsHQ;m4VA1->O;'h`_b2*iPD;2<h@=qR26@fHWJ?b?oXCJ53nZ5Jj;]n=oT[^Q]\r%]jD98L'K*t(GR8e1k\687IE'A]h3q:=-GZe]lTj1-3r&GjeUqsg@jo-LU@5@!ZN3`CY#?"R^=oBVa,ci5cJ%rmJV'-=$/IEbD<IB\r%LJMR)r4h!:?#BCFTaC@XKb[VDlq*repl_RHhf=T/DGYL!I9th"?o_0EOY.u2IU@W&TIa>WD1/;jl\5Gd3</$r@:/=fN[).jIhgkG\r%"l"b$^7td'nbFP;,b!%N\LfF-^1bXWOV-'I-7idWq6mWdcJl*PT_BHI3:pD3*U@B?0KBICa9Xi7Y&3W/n.ilC4:jmM/)8-6QOdf)\r%">2<N.kmRaY?I&m%RA7g=-r=`bgl5`$:Xd!'6!4jZ$)d:^^)t\82d#/3bmrO-U<4)<[H>)mG7%u2]OfBlUZ<^<FYl*#3B_+c4oq[\r%C)bb0_IF*si.DO5cQ:.j.p-%3YM*%%)0SP49YR\tUYqa:m#[6n]&X,.TX%UTF_uK/*7bQ(:?=H5^3*DaXbpcOTQh2Ck(?$X'4+8q\r%XE&L8;eZS<hTB,P^+J1iUqARd*LM-sNe=q'9HEBM$UJt<"NUj0Z*%s4QG^;r^ra5Y9H*)1'=nr*FQP&4gR06KT#suX2Wi0H5QrWY\r%jV4q;>P(%9a4c)2JKdp0n>4eQCTskH*!HCCmOGWID=<h/]&CK)*(N&\Ou99@F*d:U@*Da9cjub0(QUk'm'*"r\,^R,0Y(RdX1#Ba\r%bq#k9-kr'8O34!DoNR20n@$l1JDbV"*3lY`moDriiP5cT7T;ub/prt[6?ar!ni&PLXf*XhEj1GeFT_qK[`VH4h\J"rQ*#eK",-eF\r%d(rbe]OSp_(=(QR'F7P2WmnVg^:T,B_h4/`NAu"UIatBD\.5%qIT\^&dR9>a<e;]>:fClB"B=g12'K[cX?0G8CKNYp-r:$eXN?e=\r%/#K#[]V7ZAb$LofdC+8NY\n])1:OM[2C:L(-G1C7-ZP?IA0P`eW#Csp<u%Z^Rj>+Gd8h_[/[9J,R6,=J<:=G_33aZ_!VQ<keG#6Z\r%7GH\"q$='hi1@_e6ukq!B=+,(i5&:B=Y)BC_Ih:j*k`thfYfL_g<-739<9/DSCRn1>"qYk;i;Rr&>lXT>'nHL.>Mr_!-T,Bk0!W;\r%]Jr*HYOZ(-S-QZXmn#%Cc.-Q^NDsJu3T)\[J@.Y?[VC`b#AVGm1@bco?CV7iL#oS"I#$O@!Wb'.:9A<dqrP&"Gjs6i*9*J9NT4F>\r%TXtrg>ucF\(3J0KY0'">G>8XHC`R#'X0u+O+N,#G%V,X*WsT;V8"7P5WQbA=!p');XfcO0<CaXgs+su?]':L'?mVnNFghG,*MZRI\r%UGS*BXVF752!!<j\S"pG/bX$/>G)teafV%#JIYC]bc#L4''lLDCeoT^Q+'AfCYSaJY\n])+t&E=#N=_)PcN>n\I-=SKd=<j3U8DO\r%^id[fWb[h=:jK+MQ"u;G!P7m"83;bpDn8?0d;&\@S3cVYoA:@WE`QmsD0r0#eoh!gjhfD^.S[sB$G>5t^mU+"0YJq"DOfM.Ljc$2\r%/fgn'%9u?S\#k&3G)<U/K`X]9i7MsXku`RD+5eOYTQ4,5F_uK?*7bQ0:?98hV41H64V_1G$)R3r9Pt?O9.pHdl'ds%3fH.$oGjrJ\r%=Y1$$U%H-?N)&ZEg+JSS)H**AY@.5&i)d-XWGC8cjKPf!s7Pe!X*PdP3XU/A!r'Ul<2`?OD^?tPHNj-$jFGBQ3fUF_g\<>7a4c)2\r%JKj;c]a)Ja%9="p;'8-cX&A9;qX,9Q%1c4q^<s"g3fXm1)KrRk-TaUXb+6uaeFKmi*`J]+""JMFW3C#@b[>QqbJK,gXcJNorR;Xb\r%Ja;nY.1i/W=/]E3mG0Y$)]kNlI3TrG<Xfu(/U$B$i,R2GUSQ6\\iP5&3*cb(2'bLRm9H-&Mr37:?!M)tFTGJ)FpZa:Q4'd8^\t02\r%0P?k>Sm'aSpWHuNn_dA1*0i$i3c\f']C^8#Pqa"][GAAWoTL,dEOhBcA[lS-(Jc]hFs'Xi#Ri9'k8-\PWG]G20R^Qsl<7A`3lY1o\r%s5Q5OJG!jDm(A[s'f^8[`@"nB;#48$*Y$XM[*:Tm'1d6W9:Jt!Rlb5!=?FlVE"4EFd["!*0)N,R5_+fd;sW02IQ=JK*dkX+LH"29\r%5lrIf8t%_YenooJ==*YtZrui.Og5f2jBbPa)9TG-_R*fZ@I6=R5R0cp>%ku%%@o#?JC)W\HX_WjTQ[@\h/M:O:0d!EKS`Ldh6"KG\r%e\Y"^MXQY7i!.18`n:BX[;q)\\"31/ZpWPUW?2oJi7RMDkX^>3i9(@WTWtqBg@ei5X;_Y>b([`bT!bO*;iJ$iPcKG)g0ALdf.P.d\r%H#+LuN0X85XsFhrNbak"80:pA.^5CC%OL7H9>QejFTEsrPu-)@GKF9!FoGq>>G1;'_uui%HZpuZk2N73Y1.fgqi(r-EDQtX!L9uh\r%R``+9b)C1k[0)*a7A+%hqrs2OQ!Pt6Wrr])H)nlp[_5lcl%T;<Eo-:l/'B^nKljd)o*.6QC[Q5KeH<b9_73j>4JI3!g2bWBX;sb@\r%F%W`jUQohC3!8%n\bs)?NN]J(<SQLGm0r<Xq^:miW*HR'q9EJ'51Ip<'tLCJ0C[u%DFrVQj_C/LG!KVSjl1Kum=_l6dL'ap$3eT)\r%%b>B+%Vt8eVKE54YO^VNF_uPN%I8`R-hH1]&)fsk8G-j(`kYhX1=WY4G-TXYLX9JPg2,H*^#]s*28TifO6cZ`9XgiNO]m$*s*Xnt\r%B@X,mQG/uGF49rK\SX=9>dP,@O5k&(Fl:BA>L>/g*o7n'K".\$]q*Cm=gIs'CKn>!o+L?j30(<gk[:F.[`2KDM]3!/BZr>K?/+3h\r%_n+gCakSeU&si/454.aoD8:>D?#aY1)u@:@9gJ)N9:GkDgX\9"Y]c[V3\S<q^[D6)l,s#(el?RbeCsR:3IImaIu;hnrb<mHGRZpk\r%3,SrE<ojjObumC#]TVql;&D]KLis`,[A/Ub*>AJ%4)#+[]i\^`JTo@ne]/NH?gC\aQ:ebV\E`*g%bDlXC2"0"9CpsHS2FN0.-2A/\r%kSE6VpIJ8tpK3"%/%fUmG;-+8j4];^X;r]'kTD;+p@:At@(4EB$3Y$i'l%%/iXR=TedW-bje"u3.6;9:O4&8,jrqm<-s5+NBq^E#\r%f6l(U20#pVDXg>_;-dXHg[mf]O0o(D!p-S:A&$Hl@h!_bW?Zq%b$1^M\*TZ+-oVPoQ$\6EJlk1F.&X+/'R'RJ]hq2X<rLHf]IP9i\r%ORb8i]&.!Ln^@+[Y&JPlEc\cYj5O+-;4TGQf@bX[5fVC.P'FBGmukT!met6I["t-kC4fDQNOoY0l$\:d0E%dD>kRY90O'tJ.Vl"q\r%`NnlIMn-ajJQD'RK-OaPZc!c.@GFV/!0t/gX_Z\gjfiWIE%2Y50=S2B;3^U![fIEWIEUCu*La3;7<Ce'c)TI@APPBL&#'T(^c.7P\r%'_.8:V,(mRp9+hMpaHog[_4$uiMP3SnBCCm\#@hm`i>W`!pir?\P@L;X2h#?6%(^C.7pR^dnM$%4(BSM2-(55$C%Fqme3*eC,\Y-\r%$3[;d<GGgohCjY,_h4.uB"34`8Q/c)1CQ<(okW62@&_22/A2-=QpMP=J]citNjPAQVGN>]",-eFd)#_D/&@,-brMpT&>6;;DVFsT\r%)V,?.:?J431=A-:V&S3l^o9!R=ANolmNe&<Wb0e4arOU:gSSh%>%PdC((-!Q%q5PTn(AkDSB\Ph5_.!_-.]Ks]iCjI%\3/Bh/\l;\r%)=q_JD0ecg[A25r#tE?CU^%\AW;Hs=Si1G4<>NL;JTL,Sm80g9]0s5lkoO+QTJ>(CC/.ZR[g_Sk"(-JBmM!dJI)lotrP)]>Q3:Zd\r%kKV+0#O_7`;R-2G?>1^ZY%KQ8=(Or(DphokAVnYHmng(qkYKbiE3Gn^Z+<OXSUs:1Q;4Q#g\^*:DKp,pW[s"PSuH:><EU;D8uO#J\r%0I*[!Z9Z08o6jK$-".@5eT0*\d>"kmHqb@]maY5MTrYKI5J=#:d`M,uHZ'nL:!ZUXX=iH@39gkFMC]7mCT!ta=4KrQWE*.nGkIsM\r%''U-6;ULE4IG:cg;L5DbkUWquE3GhlYkBOsNWNRM`DPsTp3o$')]kO7?lb2FM0>uE.^D$QYFUh1s$R7jC6b'Ko\S+e7@&V$Z"iOt\r%L^[o$qKa^7DeNkH'Z8TSXLPJ2C+PBCf=(FqiS=)*AEW4j7_1HE`i?:'BWmngd#shTo3!QE,eS5p2@!4,CA+H=>ICiLa4c*I)N07A\r%\g\,'YH[!lnC:V\Z*%s4QG^;r^o7go,s&?8<eOI_ESt.^"[ka2%WW:b;RWU"^)BY]b>M@mMlX*q3.8`Hf4%<8Au8R,$tlcHikFh2\r%YrG?]gYO<5F4:.&*3$j%O6ZE48h:J-CSiAgqcU;0<`_lG;Q5'j('(CRin>0^4Dp"`"+;I2#OXHJ*7eG%`DPPDYrHK(gYOT=Fi/iq\r%*N?qFTY"l<M8b$m)$gq<X?ri8<</u\ML?e:KP*2E/W6ZXCcI?VPAGAD*4T'D0q>q_MYjug_VutdD3OQr%HjVg-Tb(YZrn:$?A2qk\r%ep8bF/1LFI.fu610?p5^X-T^Pg=EgB%Fu$U<EL#EXdA%Op<"kF!agZ#;7gMrqrP&bG];@d/?)_t='pYm!S3D_.I17EZdi)BOUA[B\r%@9$F6IrX;IQWeM;40[=E=b*n`MP49K-iLKW^uEF?:6W6GmSV.3pg9ct$Z8kp*:A9M"8>tJ0jEo4?<&:@'1cJ]"n2%$F'5p\9lECB\r%=<5ccM%8<VV)YQiWf!Re=($$t]!fSW@Df\8_:Mar_0n2Tn72/,=<+j&9#6G<m7mngWY2(:@'@@42m@!j9l19N!i%V(Yr\P]^uE.1\r%/B&e"<E1">^&j3;f!Xo$l:<iR30gN]1&4cn$bZV""'`$pLq?]O,Tpl&'tRg,6jMeE;-iX5>Ek[mKs\aF"Vq@2[8J!m?<+rVi%)#k\r%@U7aF.u/8bJQ"RdZ1tA"oN\eVp0&ni>@L1<fEugs/qdP1?i`0!EAuJbkY/R_@oth><FBgn?7Wu<m8[.+!PSVn,M'9ih/ZWL*&s@a\r%(t%-j9p]1;`IWB<'YI$nf2Vti]EPV)H-'BD-/s&?+g9T(]cl6Bm6G$0`IWB<'Sj(t<H/`J$7q3@f=(Fs@GUG2<6c[qc>p[UYJB/5\r%]iGKs'Im`XHW?>eR?M&XJL*eW'jOtU6rp/6Y]c\C^uE.1/B&e"<E1">^&j3;f!Xo$l:<iR3.\\t8nkR<K3!QBJU=M`LqZ.e%Vf"/\r%M"NW;?YW$_$?Uu%>J.f-2D>k]#PncY$aA2SEEIQf'h<hY^uD;8D1-U;l\5WlEu/h8Xk[]q^uE0.E^0VVr)rO>Uc+3Y[76UUe2Ab!\r%n(Qe#Lusg<edh<e=;G;KHaIX2eb3KU;'8,8Y>VuGgUh6'2`s'fbD8QFk%:"MH>"g+F[Cr,b$cf3d-'1mg9VK8Qb9ed8Ysh.lp*)9\r%Z@Kqk<(7V#ej&Y2B:-E9FS_<:6Or4`mjG0MK#C-jdDDoe/APF:"Zp-fU/k705,;4"cpXaE#,c5u'g&GMZ$,&G8fLl*V(AiC9pGk_\r%<deOFCN%lfj\W)sn/lgs0B4LSXCj#o#Nrm'-O!N_YQNG)OGYN\0(HY]%jYbGc-A';[Nf,7VfnS>F[5E33H2I1**0,=i[Jis=$3mn\r%D=:QH]&gc[HZ44M9s2G#eQ4l_lD+ubU[IX8m>fPm+pZ.oop$ND?IXB`D%!Gnq`d/C#OKuB4Og7C_q?]+FPh;m=$3UfD=:Ip]'fTt\r%gp_gCUaKH:[/,Xb>FcHn".%sqVQEfs_4K1f2p'`J?PqVU[^H?be&A:rF[0#V`Ik9fMT9HH<BLGfqMM3%[I*p5=>r?%Plh8YVl4_`\r%[/,Z8C7u?;<qB7lU'gU19"O=ueQ7h?C01):31$`i\fc."?@Bd[X\OboBbaYGpKdG,:TJ9c46<]LqgUBq/`6f@C*6XO'b@`6.7iol\r%e``9U.bH\nn]b'@5sDZO@q0@a4uGJJAQV%@<F>9(X-;PJ>"'0%JZHNEWHE')^Dtf6%o26#!G8I;e#TZ'Ti*?DaX(f\H;,.@=j-)V\r%B_<*nd_<Yoj_3="%]'E!%IB`g-cP*SIKe3H#JYk58mU3.-\lj#r=c\YV!9fBd&O9oYgl<29$=$h!kjgQi3^pQ5urDf<gKZb$YtZE\r%3SN#=MR<Olop$h*Nno#_<`-h7i2Wu*C0b'$?,O84_9#q@S2F<Q"g.XD&e)IDV'!DI^>oYH0M'U%e8pO^Op9_I[C3mhXG/S`XOttt\r%p_[-2>)+q<Cs`h+>o_9)]4fs2V+<Nb318f],90_\=R?h6`]I]X<OR5"'LkI#p*9W(_e05(^4jrIm'SDtba(l&=?Fm[?<MmE<6#Ve\r%m)r>*+>0!9V0:7pGLp8/n_dq!*7?`\G-BG&=b<JB$3IVC@dL-_Zm+LL\WWc>[V^@'.u1M7XnKmMb`u(l87rn5rdCo^Z6Ziem!\.9\r%=5En;oA<$]RF/D)m_:cd<Ct:Wc=3o3.J6[234`reX1a\MCrWE]9l0qIe@NH\J^/c:@&oIMZ!':*:P#R[ii.';HbU!T&KZ>5s#*?I\r%IICpSGd(1>5t\%1=s=j)(nas@1_4-*1qZJ0fbW6RJefUFX<-S?YB[:;8b#>=k=R,;eR%da#1#U&Q6JK/JQ'*uA)A5I[9#ImbG68g\r%[GU)^oi//.-+Drcb$%oOl_5u:$^sg3WJA%</,qh\Dq\1DE@d"HK)Q:.EJ/c"J863d4pbcsqE@#pA`)g0(G?JYVBrA_qU2`fSR;CH\r%V]+.CYST.6hIp%8$^+[NB'#Oc4h+NakrZ$?<;HoC[9*4HG&?!6C9MDri2IDM"cpUE"21EKGJIB1"_Z!g8#`Eg$S+k.%43#EDtZdr\r%fW5e*ZcQMH^fl)]#?J[@n$:MCkst2WYOiLqg9r:bEG`;^-WAk9fL=oHMHYA'#M1FS0O=.dj2:Oh?to#m^fl'g[QtsgYAF;RS;K\;\r%4g;!#dY"Ai9&F?bVp\A6X1cqW[VOW`-(V3lJYuE%'\`:M.$N@8,FDd"8pAF`XkY/O#Lr$[]*aq'9mo[Q3=[m2*_0<YP!-<U8a6,R\r%oi1eH]@ne69Y7`M8R8MMbC9TL%<s88<706&l+sc"$;OSo7;-rK=b-`+ogMnl>?dCH[mb[;osHjG[0Ll_=%4lF8a1T(oi1c*FL>3H\r%flh60jjma>p>F&72q8=]?1!mh*'*/l!3MS8_ucb\io78R$A,',+ouf5YI(]'Vb+'TYSLX2_.]d4%RQ/h'U>A]JaLsFDRNj*[]Zdb\r%Ps'@Im1%@nM.0U\Yk6j/N?lGC6ufGa>+'<0`J6_3S<PPQQ+"JMX7F9$2HX%2AH[?#lM]'%Xmm+uA-*1(c#%bof=!9>p:@O3:Stb?\r%,b1+)Xp%os0IOsd:cCTV\Ub-m\[-&P('H_@\a/!"dCm+t)mI$P0n?fd^t<E4/*#e^Dqds$]=+H:^WGbJ[fD?2c.^V1D`q2pVq;EE\r%CFH>p;m'i][0V[bWUQ%D=GonYL8NPi3`rSpFl;O=mCSTT/,e,&-;-SFg+rC<-0]GmiD5YD#9@#t0rM(qdXu<='prjc=[Zho=t@*:\r%:>51%ZG7MP.Xotb')Y2NP?p=Y=-o`gf*X!UYI2qR5D-*k90_1^[Tci!F`e4d89]]XS#*[HAa.%=JdTf47\Ohm1p"q*WHqM/ZG8X<\r%TuKm^`Zj!TR7XS&YcGsqK52'a^/q;BdSHOdAa/A]>BYp>?*8(\'<,lro2ljkEWW@#<+*.De#Lr!?t#%,eB0>H#9c^B?u6iaX1e/@\r%<gfe>eg`.tVmYAR5Cosq90_+\[TceuF_(fL8qDUTA1+qN[5Q26jshi?hc=ik*.tK(:fGt\D&1cZ'W%gDD4<S[7!]l([5LYgY#SHt\r%?>I6>IKj(pQ@?9ED7?\!lfoNROU;=VVj\o3CU8uX3euiok9MQ_=VbPL$!@7G9WPUU!kBMne_Ou5>+h\sf6SopT=+5^5CQ\1V4VO=\r%gT@IJ]"7kofAWB$.4EYFBc4`-+#?*?<E`d5;DbMVdK3ei-WO=]j5AW"]ahh]V54DuTs!jl<aP$'crFfEBA;-`lY=,9m_MidE%%Y5\r%0lkbn/NpVp;o&cU$(^-2&6N1XndIshdXph^L/)o/j[JsqCBs4+[#ABFLX>d!/$JS$kc2#^ZYaQ7j[u_WHgjuq*0I'9,Ul_sH>p!a\r%!^P"ZmTOl>(7/h+A?F:3G;[L;;I*LnUmt77BI##R<9#8o0GRRO40=cLq?_7D>5H@L[_ljje(#I`dTjESR&*Eu#j$@^39Oo8U<5!r\r%^1m\I<E]s5Wpn`M/`Qe4qdfnfMfaVm4dEb1!N/"(M!d*UQ4Mh\C0R"r]!;EB=f%rf^\cGXT/uul]R(nR*9,u>"RO3U:k0U)C6Y/#\r%S-e7t%0pDdC=Akq8Zh@32L6e)@E)V8+OB!0*J#0m5k+:Hga^!j,.O,\Sjn/gA=OJ<EFQX9i[bb,[LS3!Vm4h`fM?=+a,UPQ^sl3P\r%JNlOkab?(e';WoCGR1ZQ?sH5nP*AhZer[qU!"Hn5PqEDN,+s]HES)r@j#ISlJBJS5M!.AFUIB6OI"^%4iS?k@(;ltS5UiRiE,[aO\r%/L1\%nF11<PRp;WQ9kiNdGp,-r2_/s]->cE>QKY75l(d(4;LJ>ViF@+E\9q+R*8Y#LcaNb$/g*onephR")fn8*%:S%<ECNEK*5)G\r%XUp"KU73?ne>/@@GtYDYK%P)G6nf2!*[E4%%9mTr@5jW-F#-5S0h56GCulYi[1o;#&+0,VR3*"rPdMBl>GA"]P"T+#4'!OB0;s=h\r%Bre6(AAjgX*H/M59do#MOKu=[KSf1(M5(.W<Mp$Knk"S)-L$si$erHW-Qj7G:gI5--Y"C6*ZE+^=)cQVa<t+m25>Y(]MFt,bs=1c\r%TX+u-O-&_mjU@$bPR(p?$LBpo(=t+Od&pn;:(#0V.\#@3TqAVeH6<L_-l>ouU@2!.*RkM7V8cO?TE't6"7VgS$/;ZFIN]=DXZrms\r%A-9@TjBm<5qt/]_Y218WI/`bJ+m-7H2cg"O!;u8Gf2mGS'`YTQrV_-G+.iFMIb"JWh&eku?aQOlIJ^d.pY5:td`oC2f,kBeq=WYF\r%E;[cBpLj!U^jb_L_cM3"r:f<l<Vb*mRF]XYpRcBM4oqE-*:2fudc0o>o8E?%B34SHZhNeC?er0*_>i=H+8_m8l5(HcleD@/jPhsQ\r%qXNqMLECI'BQeN=M64qaddB?/EY\U8It.@Uk!a6q(LP(=(&YFap-3EWbl>A%k5TmaR=G24n%QO2puBJ?HK,@Xheug&[!D1!>^ud'\r%c;&9gY<QC-0694f^2'e(;Ec38qV0QrmAJ3E)B/Y=N&>DZA\7ngoDRhrP+S=_g^s<odnWH[YHX%H/%@V:o_Dr#KpHm8:Ep@6hmeR4\r%:Hk?Jp?(`AIP.NVK@Wbc^\F8A`W]Xr^AQIEmE%T=AmD^Wm>EXZlMB8io@qa+fOJ.5-Z&M.o8>V%)B-qq*Ht1_h_Xqb`9uuqRg;<L\r%nNHc`NOSobl7Ne;R1_?&EJ42^qX_trg$`fR55oeU3b'=Sf's*j\8u+rmaiQ,DGG)QD`4el[=#BoE--O(nbU`1m@:6H*"tSG@cQ+U\r%roWRbhH,WPZm\V+_R--HP?S`u\#(j-\2c#/kJ\OHcTa!2doND@S#m;bVD2qb)N2VBBM=?(ZtN-k`q4F2-MJiDVE(^0EfFejm&nVj\r%C[TrX2'&:eoBbJk+&Ca#s6E7I9tR0,&:[(7EHetJpD9Ij,/u^?=_nkk5Ma'Rk3S`'-SU`E;JY1deQDM5:-O1(FFJ7QGkW@uUYr`Z\r%1u?QOC[YV_Yg&R3%!M4@2>G:pS%Q.Nkk`2P:M702+SqF$UK>%@J&4)1d)EZu;%u@5:9Q=RDuT'05MiLgoT]$HM]%g:DRNf.#L37s\r%a0X5ZID-)EG)/M(Ng9D3q<#T:l.NPD-aV06B`/;+VTnEU8,)i=jQ8E$rcij6FuA<!<kinTFj47DdIl%fgQRCDX*q6G;Z=Cbm"Cp0\r%1B!`bDlK%*1up['s6n4=s6j$R!rdRqIW^!"b8Bk6#.LpWq#VTnHf$!'jC(+CesaJ=ZLL?n=fhE0]A!k$k&8G>hCN48_f"=YB_1dI\r%m*/JDbCn5<h/2?)mlHhbl?XtWdXTI`rVtMfb.k@.l]([Z0@"M9Hua\6_QlNkm,[=,p;b@_gDQpZoAaDoUKKdrj>m6<^!b=,iU#]^\r%1YB;[&jp7EKK$=9cSpD$T&d09c.e%%d;L/!ABmb_Xf671e@3rSp\"!i41`/?34q75qsVc>V^2h&a5ZU]_</\aS!3U0T4_tl[!O)N\r%BZHlrAk[VW0A#?cDnY$$rqtbdL-pBeFLFD=hgG@lqVq@,c!578,l]ehOER!"bt)X&<\j:Od]aKBZmB6rJ!Zo>GF86nE,DBgF'ld/\r%T54&U:-S3</$QG5GI-YE^"7I_gpuh3K:3rGmoUA"k2=`8MgNS*Ib]M0(!4mp`6=&#<sj)A6Z9FmG[[L1h.GHq?;@tTmT\$%^>?AQ\r%T8n@_\[ji6q"F(6lu\Pr]_]U*0C(9\h*_c[f'4'T`[/>Zs7Gj@jRhg0m-=9T-QdPg<Eu,[Xu8A$[T^"6Hh,M>b)^lDET9+MV]!@.\r%[+e%g\%TFcL[1MUR/>/G6&m):ndkJ#r,&6/F0K:m0n6O<\%S0DH1"li<R"&hI-+TAgN&39b_p]@E.2d].lubN2>I,U%(\5!_5e_8\r%N'PnZjo)+os#Tsio.%n2\NRKkGHn+*(7MLGY@e-$f<6q%bm3`e7L^&H["Tdm_p.l9N'!!#?GU5u[@%AmS=Y2Dr-XRg\6DJ\p>n)J\r%2KOps<ANtaEV:=f2E$'T[G@@HC:eaon)'bpT)WlWMJC=98BA>&45$/$E-cPEqM4ASZ0bi?<ta[lY0J]`>``TU_V`a];>Y&6K6W*L\r%TC-Y8`/M7qN!3SqK6T7`jd[j*[F]VX_]WR8II#,pDt3e0)-*f)5_p]tic,4/=j#Li5_qE7GC'E8G+.%ME$3)X\SjX7>65t65_tah\r%Qo>lgU#0`1`#SWd[Cg(+"!M:#I:pbH],:l/#CElpo63/*@`I34?E/>M5_uQ96L7Gea./&ERg?[TWU4-qY;q_MbJ$4>^-?2jJK<D:\r%kF97;%DM]Se%Yh[GMcdCKC>D[1:0+_B80,pgWPqrOfG]OqdLHOJ\%I=KqBZBg:Z^)5V3+R+],@6TRLr\!/gibd&0sA:M533$[Gps\r%dsCSlLeeD(>0,/ZT!jYAokofYT$iD,4&fs?Fa^eDF)OVI=l,7bX'T\bchN7mq>B,_(Os.Yq<>L3cGb+_="dl@04!u@blN,Ia1oiT\r%dHd7h&g=kI]=bj6STlS`nPYDA2cH_CcT$l#0)2ZK^G9P"qssc%YPe8tq76FtX7D%Zh2g_^^NtD'iV`!/QPb'Sqfm:)qotY+lC,FR\r%2V;4`ENtAX/G1U'Tt\LDO&4eEj'(;MI>_s)>Md<!?/NtS,'I2`K3>P<qI&\ZPMa)i4l<fS[9:'3Y4f::VGhcEHd3#n>CXW\gu]XM\r%o/t-9l<BSgo8gLM2nI7h2D8uTfKAi=*%(X6h0)QlY(Pu:Y$XO0h`UQL`;^p_62M`NRr0ecHOpkC$!-a>`Pl0;;L!83qr?ekm0r7C\r%kJu%pa6`dZXB`'6Akc\'=?_GZEehia/KW*SA%?h8(Q[[1<jLa,9-ao'ZS^sJGpHkh;D):u`Cmb5[CdY9jj1IEs0fuuMjO"bFb7S*\r%\S`RKQh'>*gj=PMiPXgr(&k]99$^eYf&,bbc7U`Ps0Zhe(["$\G[(0]IgW"d2m6lJILCQ_I"Y#A=%2MgRW1eI+)Ko1#`l]j=6t<J\r%r:4%OAq'=Hk!P8bB<Gi_]pP!!F4.s,n:o.Y]D^_4Z)"RP\2cX_qPqUsB4%3:]g)PUqQ#+;?XK>ZIW]`*ri>@SPH-dY/W606YqnP2\r%"_3;BZP]/IA(+n'6I(cQg\t"Jqu$$Vm9OWXosc7V?Q>?Jk#IpWP[EPj3kD2lB'&gM*-IQW+D7km+Rop*:WH.,G6k<pgXu)]j4S/*\r%T/U[4OLb^IDpVVVgq)tjY(r/12uikZ"NEIaQdm`q_,!:B?1Z<5X'[EdMoBl0YSA^tM_22>Ybcqf(Mq/X'?4Ln=DSe3m:*>+/@LIV\r%VV@m,]b0#<`B>^M%QN#Ue&ugViEOkfG0osR7PYi'@Y@l88P;\T_sd@QVW?&o%UW-)T3ft!4S<Pcae,j(gR=9i46CO0RFiIX]74gL\r%qra174)M;c`5@m?r9`HS96lr%]Za;!bdR)JLM8PKbKjcVJurZs93I[lc-(:N+ZphkQ]a,1-LaW[^PS+/hu7lkrq^!F$Q+)jBi7`=\r%GKA"S-`q[[)>E9.9hSsbbFQZ8LXY,;776q8R=DsQ,0cMOk%=k&c$%t)XeeD:+$P'5]*1U;3I<uOVEUM"^!\e;'<^`c+aZH5*8ctl\r%^+JO;>^#ZY3.aR0g,_Af>P3o68GM5uXSA%6mcCRIDT41*FoHhbF;?f^nMTZK^Ng8E7%DkjE+[@CL1L)uJn;7k/<sc_9>EGXi,?LG\r%&/IpS(.k36G:`hOVS6.6[R>aQ/-/tr'GjEXG+?HZ$$_12/=(f>d"?43k!W<&>0r:D5p'u>:2`o\rciiT,K,t`g9_[EpC"1coI2"T\r%?@)$$CgWPapT7L^e\UCj,N#,@3rA<hg&M"uG',i5M3p,LH+W8%#hQ-'Q[^KOs.=A4"nZY=HnAFOhqjs^T&+%PmEGd\m'#RgF-\X>\r%hBeWh(2Bb[S]W2B?uq&!gZo_noD01K^Y;aek)es@2qOBPD?71lKj<'&'Zu0L]P8m[3BVejKX+QDGn.I&r(8B`@PR]EkF:p)?PL01\r%4gWhe(O_[G%W8<sqf=BNYZMFfCSG_kNbH]f[QKR``X9.2MJ1#R[l9&?Z-r+/b2hC[45XL5?b\8'RfoQ.Z(JophL[%T]fB$Zk,=Tb\r%P5?q+m\2GL0o]l_nQL%37;#eGVJTPVU,+A^e%IfkApJ:AR<D8:H94toDaeHqS3t&$9%2o+/P=Kd1bD>KU,4Godp#\<r0pNOk,`%8\r%Q)8uC]5#fr\Sn\2oY7T5hu@Y:14qV?>18LG9lHhdqRfMRD+2aZO`A-=4'FE-\*5`X2WK7c^%\NEpUa'gQ\kfJ7"@I+'WI5Oqu!Yd\r%02>:Bn^S\3Y!8MJT&9P>?ZQX/T5K.Iou8sKHhj>g=g+62m<tB]rLLJC^BO8`Tc<R$_AHKmq3uXG[[$T8_P1j:]7$A[KE3\`fb_!:\r%D@<;pD6\9XCNnNZXlh<ElgODZI[lUf3pX'GDE62>05k1SXK^+Z*aN.3"3`R.fBENE\0s\=Dbj0kM!.4d(LPDKGb7d(Da'\]T$:Nb\r%fQrkm^=mJ]Md:U3IYTH/K]R(HB:/j"boM18I^^W)2t\$b)\l8BRg!\:/LnTZhu*B3p!q_8WGD0b/JPg-P4OCLeLq\pj`Mi77:97$\r%Q@9>$o$,rUM<0^"X?Q"HkXGJS%)+q2KC=bsm-cDcd;;(SH25+:bu;C#n(^^pD5HUnO1UkQ;qKd7lSDYY5@/sEb]XM50,&[W;4R2`\r%qsO'[PFM0u+"tt&Pdb"Eg$;SeKpTKme@1^0bs7Y5j^etOB"""tc"7(d.pH-/CU18%Z(`kSE,EWU49K<PJ_bgi$1-$d^RY]XDrR>B\r%NFa;WLe5@t$C/eE6Q=jm9=:&**m!G7l"Y8Lpf8&:]r1XtF[&mI`^Sl_1XJkMD)7mB>%[B<o'*'!!c)s5h$S47rc$a`g;]W^-:F30\r%Q/T%`%bRWdZG4;B"84ZH_-:,)i0d7p0>*0,/LgJLF-Rhe(gH>@QnLdCmHjnC1E=GBhaE1M,uEq#YP<`(C+&Gg)gM3`cZhg#&SW',\r%n\?+7pCCmq^HK>W*>?;uSE9.[pG:*7Wss8bDmO-sQheC.>3:RZY?-29o@<)4G).W\!DGP1HYW#OimR92>^B7PdVkI'*PPR1!icrr\r%8c%&.PH.J$Ae[Vi*h7[m;#/Z\%NZlWD7'L;8+K>/i*nkEfi\h>K'MZ[Mk@CHn\C'j`8s-^>i'N1rh(&tIe!+"[JK;M=7>Iu,6797\r%q<j<q=+;i.@*+FW!["$4E.6@;iS>S?EZb(SDh#@rrqbX10+Uk8s)>EEp\+@\I"(aL?bKBb?^H9Bri^O<b<Kb1:[_JW`nu7q^\lFK\r%_uD0YJ*je[5OA?`s.A"l&+0DfDEiBH%W]jA=\!UBr8&a:b^jfg=!3%[JPt>*809f-/-E5<!&FjG=hf0<?b:rdZ)'Shff3g4%tZS<\r%JF4Nu*>'+uK%5^.3L/Icqf%Wj_RBG/fqbli/5r;5$SZhG5SHNQJCHkGd.Ma"RLb?MT#M,/k3pIXU<`s!U!*kYGIk5j#:W*3X>=E8\r%*&#JcS<POnic8cfqV3.ER.@UqE*9mbc82\H??[l&rk@`\=$0KX%!;P3A9k-tB7iI!;#XW`nNa_%gL#J+e*uV;V.@,JYTAiTQU(_j\r%K$6$MK4+!:94u8]n4=_Si+]!/i3eCEoSHtP-Q`U.1Onf82i8Lh,gl]`ntn5l'1!c"PIJoa!6CJr[!Zaa90D><cI#$tCOCeP:;0D)\r%C[':\0GKI$I!,[0S;0g1WF0Pq0q)(K*o#fZCU/&T["TB.<Rr$^lQBZO\Lb]i=(`I\Xk<\ld1Y5cbn2i`gCF+n5:GnDJTD;X=IGq:\r%Xj6#JI3(\*5HFk#Fo&34eZG^.S'(\NTl-FFYoJ_2I]m+<;2T7!^[cF-"YEEJ7n:0jE:+i:Q1t.R1oac>m(H7;qR:SOFA>;jRr)'[\r%lVH$/Z31j.E;BQ.J:t6&KI97NEX2;aHid.?S*MfTk]24hIp>hbT]HCEosbF7?sO]?^0k7B.Hc"q8dcJ@QSTs>`OciSqf6P]NH4>!\r%XAV-IL9%dA-]PeDRPJ5]Ua1ZR_:$bNm>Xlj;TK')#QQsPKga!e$S^apl3N>4(])Xj'LE!X?$9["H8m:Aq!]ba"E<$!S>oC`=;,.I\r%:NS+K^)$i6ZkZK!^nC9ap0f5CCBqX!F<IfE7(88E(tko'.bAZjP.KH2S:p/0LGCP:UWT]Y`+"7\!D#"1$+j[QIVB.$+l:gOVHg3]\r%=PrdOJ1A(nYU7L.[2GEb!M5agV3jT]686l"(U+D&NE]qD8f0^/V?+uAicO3T5prf5UobeDdN9g;c=f!spp.cHJg=oadEuO*fMm=B\r%0%pWgQ(N\(.kSqMdt5_!-0QA:bQR<ALKpEU&_s(Qa3.G2N*3<SkHc[(T2^mk>$K]gP?_[p)7lJB+mIH[&"Q-r.>4VfD./sA;FSeD\r%J>FdZ-U\2'b/jp7U7o_jAYDf(i"uH[JAWb.GeEhBZV`=\E?nDXr"pH&%V.D.kqh8V+itJ!K65O&+jV4O1JBJ6c"r%QkD(H?&:Nc8\r%1`I;8:)6:.Ng6PFA3:lcmDo<m3BDr.[:<&f7qBJrPr0-5D$*b'Lj]FgZ;)Ck<&X&ih)Z6&#F:=Ld:QqG\FP`YN#m0Lq0sb+i-qDb\r%LZ3r%HV^pSL`1=(n=0am@L:.jogDB%Z!fWi;:qjmd_m?JVeATj#r0b#"KdQVSOA4R*%%C!+?g2o&bGLP!5%PB6G-"EZkFJUg5SF2\r%]qE%u>-Ds"\DjnD.CBt4JHg?67Y)Ci#u.g!c9QM7+QsqX,CT,kBF0@9l\X8S7*k+sL_'.*lVSTd6AgA5V`,Gn=!fC$&a5(36)7c8\r%&QW-dfcQKLas).c89bGXQ$,=B+WX2`d2*!UlBnIQ0H]Vf[SaRs>,1R-^H;AmS]((@r`GEF?iKF"'\W5-5MVdA5<gZeZ?H%FHV!f:\r%gFiNN:0Uqk(DMh:m"4Y'!tKg*kAX',rjjbtciFkAh%M-4Z86i_Qg[,&_%.'7hYJ<_FZiR#>l.XCJBM-#?PT)h7I_onW:E/W`[G1@\r%+LIt$m6cI`+ISL/r;EEu+)l;KB?Sm=6t:hr<p?oH`8GLKESbG/qBc\ZON,Y%PuFq3Qg'U!_)',0SlpN)'J2&kEaPPW[K-i^Ycng!\r%$(uf2d4ohQBao8Vi":&)EhfOL$S!E:>;/P:m")6R90a#`l\O5@Lmd"paHn@mr:2C*)V<Vgk[6othLc9dQAu-QZ6Pd!&-)",@?H3'\r%qcIfjAN^arQqhnLRo5WD(7&<L46H"n<q,i+6.2cL'.(fpB9FoAV:((C`CrU"&UOOYNgRYh-jRCidA6nI+cm+;0J!j9!&C$_WPC5R\r%&j'Pd&MjdFaN_EfM4uISYjAW-11)Z9->j=SjbVRma[3f&5sXOt)<DfFn\Ibg7K*h9ifSQ1p^4tejU*XeBqW8S+_GUA<WGKCe7lbi\r%!p/sq@[tTZiE8DJ)8m_u/.=]j0+:$jeC$-l2T=^o$sdnlbf`hF\N*Jli8t8`>p_9)Z2t@BLdV`P2qEY)&_cQlRJB$Q6.reZM=V[r\r%K#6LTq8pS7Kh&r$RDG4o)!],+qj3_eCSK4dS&hpG+dTQR4BXE@Bo+Tm3MaIgh$2Om4ABAT/8s'[#@J,SFPV2Y&`Dd4&dX,N)=9E)\r%o3E(_'64cEqS5(NhGl+<`h*Z4k(q?"G4B-q(&,hc!r^`o#PTKZipg#0`#FttanlY)E;PaA(\,)n?Fm,Od3;4tEi">.i<&-77qQ%0\r%f?4D`+p^hBUd$(q&Rb73>eXMb,ZEA)/V0K.gnise)]=b23M)GXnibDmBq$kP'e*m.dD]k;.\sd,b9>7(h'#B23j?tQbGIgo8BO9q\r%Y?4Ob/pHrj1(%RjNqk\V'AO18#/11%5$%<Z4:6<q?GW4u!W-3^n\X9C?-9=4.9AGHkpnhrUfi5eEANY[FRC97=eZ:-FRqgZ-7^Nk\r%HpOAe?#ftd1=iru?l^qQ8@"A1q6k.O/_a]nS$[l"*:e?=%cho@CA,^9FOsPi`"`oZ<#T^iYhrK_".P4VIbM(uM%`:#n7UdY8FKfW\r%4(c,IBF#5r=Y:>SN.MYp\mDrl0pSeR`X<->.&HKZQ!GLeHZJLZ"K(BP'&cq++,C4?dWBS0_W*MYjafsJ_tKLiSGBICM.eH%^*k"P\r%/tPQ_l,>hRjO?i#Su2pkf;:T[S.Wr,9G;n,^`m[]Oe.3Q17BZV#7IHM45Q>m).//$\VV+AY&PoukE.:Q4U?aF\<J55AO,t2ln%H7\r%-6kIb!=/pW@rK.Kai;\egiM4fQGAoZ=E/%8*=J3fO3G?+;(id9h<[Rd](71aKJl"ud82T<Z?:D^,f7&RS3.*>2V4L4.io$e>)]tE\r%:V@$6EGlQ#.\?@.=iG%eifkCdIh_\#9sLJoTQ%tR%IOo:\$d/UiVk8\.92KDn#D3,,+dej*lZcXrC;^ROp[A4g!_3'V%]U/4)PeC\r%/"Ps0!^V`>A9`-F<8ojZqit"O\j7XA]bW=>Egt'G8bLG2LjH8F+9RF;Wq.@>&G%NT8'"Uu*=B<;c$$+(+fE2ZmPH_1BO]%gZ/`^2\r%^Fb?/2l$4^=S]:r6[F@2<2-g1rtbT5Q3p,N(0g6Kj^flQ1$#>_X=RPp"hhL6$ku_hb"$4TVs-XDN,*AU\qWh5m$!_\W;nIp7R\]6\r%<eD262boNp9[s;iIfT-c7B6i3ftUUKdM"C$r@CX??:JLsTmJ.2I(A5hORcM<ET9_=&W,s>RK86bP\]<9oY^hTLP9b'2#mY&EM(<b\r%a>sW.,,$=em0liZ6+]Hm8`2%N;mTTU@#YXPT^Za:U96FR-'LAF=pMmn/;,i8$O#_<m.H8c-[?gC5h6BL&Tp.&3:.;sgVWR2?GDs0\r%'WnA&4Rd;k87+M@j=r%cjE>VOk(9=]Q_TbN#:[S;jX]bT6u.X*oEYUcZUP3U]aX#of[;[Q'@=o;+c_,=MF8C2D<3gPd4<u1jrk/s\r%XpC^uH^<lT&0/4&oY$]L^+;#UNKL?#MM5n7-f4Lt(-*[L#All5hOu0hRiKNL7e@$j7;!8"=)=s/>mP&U!fZCg9UdoN:>Km!\0.eG\r%>-]e"cS13U<k,]3Sp)?o3m(D*2`(mc!u;V_d5bj;(g!Y%XsdLsqSL0$apK2R%d^&P?Z*Ap-k<`P!Lc"uE:"Et#V`f.?joQ2ggA>N\r%ROGHaZs2<nc-3tR7M!)e)WAJoX5CN%)4=u)Np9MuCrKi57,^h1[]^BCLgf,^So!Dp)`K(Jon\DD><+W'bare6_0\<knq\PTNsl&o\r%.E$dY%0!lkgBVR8>9YO92mTR25hWJ'\fu=G<pil+2s[jj=_tdG4Zfh@=Eo#0e-@3V!05rbGkW;0HhTJ+@fQE*]<M%Q?g[gjJ$/o%\r%3pIZCO<W+i1(q;FjL_.;PJ#gV'1/L9=qU"#&0&IB-6'='TJ[?JP-fIe6*SU)V2Cjr@McEu92;Q<?"#H+"FS^I<;$s@U=i>"@.l_c\r%ct515.@sIhq8iQ5/Gn[.\Y;)U`'][.MGiA'FYTbbVkn*nHXjk].\;oW3/MO5=4N!m,*W/&PHQmSSJVQ[!CFeHYr#oW\ROP-"JDZ^\r%UIf0-+JH;Sb!O"8Z71%h7=g<3#B&i/.3R`JX;,ehb*L;K=ZP5!Z=$^$"i_LUj65f%/;@-`W".I7=tURM]8l1NRc@C?f<Wuk1rlY!\r%MI@qiFkX-0(\M3V.'pttHBG>TkK#5r2KHbM`s@3Z6\XeA6Oes<RZo<E#U,:%;os8.__Z$\*d4sfiskh+_>FqBK7pKq+K;uIr!GRm\r%=_)i`HC"/HaINlW3HbEW4gI[*qH&fl24_/Cn^dd:-JuM?Aue6q>`K4\;hn0`EZ$R87RV3g7G"tEcR<Xi<<>j_</?/!@+.(MLJ9H2\r%Nn0%/c"YFsGX5"Y-C2Uh$!q:h^jnq>`GQ)A+GphIpdYa'!OA/2o5JK>ORrT+rJ*sCMF?Adf`5)qn>Ma![ucCik'2a$@IH5?:R:)5\r%[\P*.OkFta5,`&4\T+Z8o\qm=9h!a[\`j,s?nX!)g1HXsn5t*u,pH4l.%k>YW7,;#U%"$U,_4<gL.+OsG6d\k'kDAPh2=hH&Q\"7\r%ieSEW-#<'P<$<(<ape?mf4%DVhNf9M=#*[a=*4:H']=cl\:P>r!-X'\l?/p*E)B^u?>Cp.BM8I@8Rb*'X#uLoYlq[t9+3A!6-LP#\r%)mQF\heY7R0#T5<,TF\<&Ouu0k+$*_`'K1^$3Dobl%s!58OQV$h-]soP2IV"jc7sSEfMU:NEi_r8'5OajIg(]jnrj5+H\P^F!P&=\r%SROkU@h.%UiuNhEFD>#qk,W!llOO%:lssdAhP];Q?K]"^^Y7EI;j%<*4/`;p!^HTh3Kis<SU.II/eqPo:<eBgV/X;"#T0o[iW->_\r%-_\8/mPA,7EqB<[q$pl9O>]G\>lqZApLRdQ*2a)54-816e&MrE3-W^ng(neni)28EPVLk_rjR*dq!Qa@hqS]u&AS!8EKE:NTC8=;\r%lH/4ipNrN]4Sa61GDWU)s&iNR<W7DZ`b=t#&GDs6hpDQ*/b:ABcCQ6@mu3Yf]<_1/S!0lpcFtuI*WeI2AUD.(;j.<?/?tP\`=1-/\r%9_lgYUkL*F:uDeYRhg[a70PkePDc:L*_2[<0cQnrA+_,5-&?G%(.16=_;q>sKd:%;EWY.!YouYR3:k]Qaq09,i7*NB!!,DB`].BL\r%\&d.?eU[c(T,eGHJJ"-d0Y$Nig/c$76=:50/DLeaON6]I_t?\AQHjIBgo]RR2/6Psk$Y`BU&TikRYMbrMl/73*X&+S]Wr@3Ybek`\r%@HW0L#'9ph(>"<$=k%?0PJ]DRfjm)*3b(L6dbVFI!JBZL&@t:pffI!p_COpnlVL+R\=AT2,4Va:+Hmo`87e->JKUI"6)%A+#.RtO\r%;'t?<j9G+h?nd]?6F'gm99Jk_\kjMd("akU0aD!+?g.#F's5nm%$6BTfe7hS&.O:+8t^'@$kVG4)JUoo-=fscaJ0Aq@Ta9($5AS4\r%$\L@m)VI!!Mn#Ys719T,ca#6+6]o&)V)4\f2@<na.e6C>)]#7Z3LAjc`G=DQB7;DcKX#?LLdga1?u8J\!bPIpYsn@FXQBN#X!j?8\r%in2YKlD4NX<Ja`]nT)[O_A2$j9df-HOk,)8gH[6=kTdVCfhcX!=D;G^c_oS;g@K:sE,0F=a!mdtX5s>#JW?]SmWmOsdY&WXHJ:R.\r%#-"m]rDl"k@Xq[HErcLrmeM*b!6./DNuTc_OBGZ_J.%d1OS"E)E6iL2%JM:+%ts-,.[Vn)6RuRmL[0l1IEX$9M?9Q-%8'AIlI@i1\r%MapH^J2hZqdu"]gB3Z=)+nQY=#:Tj&S.0gB^bM9?h7:BT,k`GqDA,!mVDL;t!`$S8*2*IW41a[-(VZ`O[8Z\tGrXn#AFcCiTUU<o\r%4V4TpdSiR,ins!gV_ma;^[&>C.!60_[DFBY1qeQbJ`E#tgG*%(\p5M\W*;CtO*WKJC?ejC0bRpcdk`@$(+0AS,Z!Q(d:jkfLj[oN\r%a_A`DOn]DcqRCV*+l'C#cBB%X^I8O@a;5[\JFgqF:=hq=Tu<,M<)/>F?Mfb#K<%!<'b.H3je/n(r@QA5Ei`fDLL\:@&NGc+_D_=D\r%Ii+tZHh<a9Fm)aGLBlVCEgCjNE.<W^M$q4g&6mISFoebLnuA5jm28C?e9N_SWC.&*Li(M7,;KGJOEu#Jd5suE:]9cd$^J`B$GD)%\r%2$t\r(T%8YE3]l2d%BZmRYY#2#9ENPp,JWX%PN%(*c%>4L]aq:65YiDl7O3&!B,m`2WCIhlf=Dc<pAHf?"bDc63akf.uL&dCNM5&\r%a,i<I`Q>u&(=JgT-hp!'#B?S>86^t^p7\n@:c(?BM8="#"?-Y:Oti=Z1DC)<#7<MdYS7SI./TM_:Ia#$:C!h-A8ime!<d'?C?i`4\r%5iJ8M]kC^R#gjnQ"9O@]a9."mkiP^54?<W=Pb<VaTgBK=4=)kH]`eh1+srtR)!R`pJif>i'q%!(L+&sW)VL;$8Q.[-Y^Qo5YdCS:\r%2A.;<5oSjR0UUp<Ut:TI'[H/0.ku:]"9j.1@M'>pU#?jp/Hn9T!q(rMdLOcbXJ`a8euC&q.*'OTbenh!Uns$NF..8rZ5;Frc8Cu^\r%m[T3B]9@XI#IqoJ:;o,q@cZb!&@'fUl%rI]-i=76$NUGaj3l*3.7c%he6TG'ckPj74s&U"?o#iU8-B-oJd\Q*Km(,Ws$S(eE'qDh\r%%%E5Z*mT<AV#4U?m%!k/b0e,85Ro't`SW?+Q+oD_!e(a/#.s;%O:j*^7M3^h/o:CRo[0ETc5j</0fiL[8lmG1?t4M9NTb?tShdpk\r%hqafn>s2Ir"PqTs&AG/t?pWL\ijoDL>"5sOF.c#[A;`\6X!fONd^]pmN`s:(K%;e-,"U8tMJ-JP:D?Y:@CTKWprWiEXH8uV%E^r/\r%)"r)+e$e0aQO/m",e2(J+R<VWf<m'S'$<rOERJkeJrLB\f0W(0-?a[Y^R2Ch/3YbBEZPnHlCC>B'_Pf!qQL]pj"<<l'280nF="*n\r%-Ln]UI[9V@%s3mZ.-G=G"Z!Jq&tBFE=6N!3p]qB7P#E]7RY&Wp&JH?77Hid!#o>#($#K!kPOLgh'<a%O]0Z4/NY9qmq0E4N3;M(1\r%f,93R0n)lVl:'`qbQH-(L-5=nUbY9:VY]AmYDfph;^RXjNM+cjX"8T/;@(A2F!$XI0bYTQ1rQ?qhl"E'Q0@2eaXU8,+U_4K>JH)I\r%'e=AQT<]:B42s#YA\@h(Si3A^3P,mS$6q5IP&km7%"^/"ADEo8>1;7=1<80g4fnp!(Q8Uc(QJM?P3Z6E#\.Tq,Z](%jV`$4p,e=,\r%]&<IN$.(,09J'WAHCi4O3*EJW4h@4M%[*qA4FtkC'V$-`H\B1]`EP"*#;GY;S\FEp'VM%'T,!n+)D99bq$'"MEc?7r.)XiI-q:^B\r%;%g(GM=p.J<^]m"po'3D2Rfk5M^]JQ#E]oTEq(l&>jGEeKnoj9^2QJ.V'[&Q@O/Ug78X9BINhUPQ9r^?nS>8&'1g$nM6<+/p;&_R\r%PZ!`]?B#"T+E\ePH>"h9*.^\O[&eF9/.G,`Vsf:-(s1q'>E6p\e*W[2;Ct29lPZjWN"7Is:%=D5$AB'_SHZi;[5LA:MBe?IPD=mS\r%I>X2"f:e&^CRpCn.BOSch<&DQ7<f7LK(pJSVJCrp!"(l'gLQi<#i0q>iCRnTNS++)V@X!d_IBXC&B,4Qo^F$'3(Y7r5nnG,9<KLL\r%e.>ncEKB+`bd=3HhMgY,E?>lC4.ne*Kt"rOJ]JE0gHZ*20ZpAhMq<h2\9^NaO%eDp+EuL2qH,cU1qiW#'e`^Qa=$^Zj^M#/7nfjj\r%b*;=E-.leNZK+jS6G^/W$dpe*!+_]Wd63RsYlgYX+c(c@72&4hf1sI5BI31t.&J][eZCr#dHRu6kp1#AVH_KrF.,dkOFHt2jZIPi\r%-"ks''6)J@PGc%u$kpq*JPDCIC)"NGG1L''3W]Ce\eB8Lc+lSa>j$dlMR\4YN+V.oYSrN#SrSH`_D2&"BD/i*a>6[G#SIOaXHMQK\r%QM;<b]W]aQGB?,t.?9Lqe3QnS\5A![B0XO#'i0//LbMFV,'iLb>gFg:<Aa(h1IPns\lB=PESj0Hp>k0$SqoHn,X]4?b)J/e]m>=@\r%.@7CX9^?9X"B`>2')('j?)/'q:FU<=&eh5T^]O->9O(#',Z&c"LkJGO-A_#K6r+HWWgJk>d>(RD5XHq($Uf1U6D9m?5m05Eg*.gZ\r%TU#R12CnK9:1XsL8lQZ7.8N5:-4nWL7E`jKbb%ERj6AS?a*QQYU>ucWV#m1I'[;J.!7&Al.u4Oa+:A@EaooaHXcQq`":I:[jd1D@\r%*AV;FLHR',\De85d6Q&+e8A)Ood7.]1(X\fi2crnTk4lNBn5a\+[IQEe^=_cFkXkO5Eas\`tgn>1&$_\IO%5RO"Gf+dE`eF4fs.N\r%r40"Z,fL>q-DB$%WI7`)8n-X!?i*A\`ueO_kXbLGj(][d8D2&65!!-_n`\[s@M=34mA&COqV"Gs)>W*rO,fU>5IgELUb"X6p5s1I\r%UMCt%P_[<15*?dG](SuqpNTC!,=tm\D!`IX301+g,e*J5[?#&gT:0`ikh8N>U&C),8'K#Yp<f#,GA_b?nY<6:_GL/$;Ee9h"9]eS\r%f-_[#_eUG:^$@]!K52YO$.jZC9r,fF]KHn>mNW+r*f4%oYm#',`30!YK""6Zf6po?>7&o18AX%C]ap/WGUjXbO"GU',_k,F'tffF\r%m7.r)4_!1(UC5p"Z#0!5K"#Wnn#HV1CBonPG^IAPh$4b/4aK$e*a8&6[dMNHDel"/7HcnIi2t5]d04H"miPR!p?5eCU(8o%/,/1g\r%"`NMR5.][SOGuaG]KHn6mNW+r*f4%oOTfZa`2`^eK""8=KLJ#+i9cYoFWXlXG,^_1<(^7B,qP;oQ:_H.DCh%cQ:_HVV1cH1,m<c^\r%@906W!Y38J2D@[P:?n9Zn(@UcfuK2jkq!dr5h)%&L;I7cY%P_uCFY-4;E]t-5V)L4d)L%IS;6o]Ol'/0;H6$BZn5:2UQI7H!lG,8\r%Dbke#8iMD?\ffuoeZ/n-mQtYTP"]3l.C%;%#>p*-P+uJ0/O0VlYLNk$d@;['A8pO":f8KO%IQ\n#s<a]Ob&WF6ioGKJJE\fe(Kob\r%6%V8G'h%O>iN+o6a[rE_jN<!2IEF=XFb,afI>Upg:^]m*3X;q(B%4lRbu85F=ooWs89H$9o$#2]Od%F!@a93#ShfcY.[ir`ElQ+#\r%oT-r;+Mg7JTg**5Tachc0-]&R%D$N.A>LmZUBNF&fYL<cC*e)IfFkZVJ.e[`A4Eg6J->sL=bPsQ'em;M`H2@Xp3VTk-[o<6?]@aA\r%7"8-`l&]Mq2C:$?qiK^%R%Gle"BXM14)^4@%;cR(j!4Rold\6eM6>eD[X-X_QXsiO20,hr72]IogO96`UV\CrAf4YpQJ8i7\Ik%t\r%oE:+!oC:Ja0V@S>eS),:!U&>u5]nmq8``.ToQ)QA@$M@n:6pS@'M#21frqb_N9aep&l`bm@<qs)&sKp.^fn6D87!!'?Y`u3n"#]V\r%b#'CI5T6530X.`oGq?T84AcU@:)It#e!J:NTbKF5_5-AX(.h,+i[0tqmb/<>lO*J\X[/nhlXWT39?]4)kQFs)`T"J'rrrrd6%8$D\r%@.b.21/m)]POt9Bclg;teDe&=BMeS`]c:@q!EOm:2G:`(WRdZZ9S8T7Q)U*?;l,hpdNFGkG?#QWH`KRJWK!Qc+U4e8I>nsO-+!Yf\r%+k?^W6&G`RH4a^?PPU0BCokV>c+$2E[8@p;ZC.Y2=?#&\W!6u,Zn5N$6#\hZLG!.%FpQM4Wf>Ou(e#thGcRpa8Vnl$'8Qc:*5brA\r%BuW>T7,]O;^g$u:a*'#NWT:KI,oSqiW`ZFQ=6jj-g9Wukj@M2S<!LiE,bs!%\q6W,8rDb7>kF7t`Rl@FKh0rElq3RUTo<+1eAr;)\r%Rc_]jd2G\Nc@Va'.Mc,4f`I@_:>+\Veq;75]!c:QTrOcR$G=sac#bO#n!_UUARi:9P$eDnQpm6k'!kG,FV-u<3gB;9$\@NW25=p:\r%%S(`F't?D<CG@ocqI6s_eQe[:#kOE;FS]kV$n@-'K>U-N\eSR#aLS)"aq-gLC1UldoK7>jF:CQSiiQVHWm#fsJJ#lk*Rj*D7.(a]\r%IYZhj4flmn^',d*KLg6+-4L'ejUtadYiXj.bUsFpm'>Y>dUc/$=Hf0H-W]%)f>OC.^T;a[<!m."'jSOOh@QX5I?@.!NRGQKP%^.+\r%M7`s:nr#[4ekj1XS[ihNg,VTibu+$*ikc2DZH.G:0a7'X5YP*E">,noQ'p_;>*JY_@f)lf\;dORH8m*./6tMR;0][6Suuj]>uQcE\r%FmuKSUoj$QPs_%qj5JfWerB(.h1uH-1J4,dK#dp`FBPsl;-Pl@KjMNF;JKHBWRlg=?(iis6?MrG7LP"7n4b$\'TfCU#YuWWd&;J&\r%cXhk48<pt5$mAG)4!i:t86?$7L'Kk`DN?[M4;)FdJY*KsD6&EA4Xi-M5,)dH\6M\><Rq3hdnU=p;W8%6Pi)fc*]n'i]ochFh$8(e\r%IZm1qW(749)#=oalG>UYl5;d;[RH(r7&1.p>c+NjR\cuL>pKpW*1KRO/[d-r2m^9:]D?;fd<3#4SZ?=P.LC>k]<.LV.CQl+Yr@2m\r%:0c4VRK--!'/YfE;IQ/K%32eVVN%Ahk\Cq=R@:@7A.mdkf:522RCldA$t'e5RebHZ-=%#;\+-`/(=pX3"Xf0";cS5t<dbSoVuj_K\r%ElOP_rQU#Qq*nL^WK3\$mr\oqmM7;[A[Xt!0,%thD,Hn\kLnqYeReo0BcE=bc8D\r(.:hRAS4-?8"d-l(Nkjn&>:4D>kZ1[X!ZNH\r%i;e9q7F/+nL7!S>[tV+oZTC@`]42Bi;po1%)\F#@4qo7Uk^e7WM7!U'.hX@b7TZaT+t&>ONf&^em9>,h=M-3iF!mW[iTakp<`@,g\r%R+h;plP?4Bhuke?)T`V3ZC+u;+]VT_cAGm?\jkG=[O*GCK6S"o*>a:%BG$PP<k%!a\.QN]J;43JdE7E;@q]q6bTT2TBc9+ABPe>9\r%B(^IpB<Q/n\mFhl$:qo`eE-K>E'O<]lupI^rK#:gD8tX@#kEP6B6]Ig!1lR%"dl-EJuplYEs88[&'35m;#Ur9bE/Z=kTtk(7#WbQ\r%07-`A!Yb(S"\2_^9W1e0Y!<RHM"+HKPanE#P'n.(22krt0Jq6O;_g)m\*ta)3!]a0%pVT"Ckb_9i0Dh5iuroirX^VBM^SQT_;tf7\r%ahGW$KH_CX22qmc0?H0*.Ec`+.bE%qY3XM27MjYn6R+R9@]RtnhuHWSS@;@N$AmIHZP$X\NbAHAgT[j40V-&-g<G5/go'X.');>u\r%m%A47?uAS7:.di(+hJtgaX2U>eG?GD>M#X>$ncuQL(8R_^tibk8DU_]3=T3FVVekBlT1$S#op)'.c*KG[l]j%>M)6rJo*Ws;YqnC\r%bIZeYh%!nV9L!7Uf(J5RK8WNqTu.X(E4=OZ<4=Mt<l6!0q=dVD\k_:-!_7%8MRO-`\]b`o)mCn1l9`$pL4')lPaS8=$h3j`)B8N1\r%*Vsbd@Ij>J<PNkqg9%[je*T\sd'._2l@%-gVU%(:rFk"&YqM:N0E`m0gO52L#luj6DaF7eXV:i59N]4$l2^$Oo*`]JZOKc^T_GoF\r%%NQCN"O9K&?I=;C8UWQ#dQYKq-IM]K8N)<DjAEpRKiJE06LVbf(s#ALG:q,\,a$Ksktr(EUC%[T%:[:[=8N/P;X.)3rcbn@j9VgE\r%HAUig_ec:N&"N_i04ZSFS(2"/,%McrFNIhtY2_[H+)LJCRU?Y(e^Gut"\iKhcV1TnPibBfMUdqB10N24E9P[1>-Pd/LQdfJg,&`Y\r%[=63L-6%Hi+SBDO^]!s;X+q^(&W%(:O\Aije6o&`j:19O6ni0VW<!1aI^"2]J/)-rL'f50&>0*4"@u/j7kDh3nq_i5%B:-_ZX&R!\r%c!WP!-1?6hcqn3*fR]k34Y99Z1<(P!"f)-bU7t-h^7VbL;li@$C_*n;qc^a!)KlAR?+*<3)<G&U?Ph]q4]EO-&TGbfb4Zl6@B/Z@\r%(;%F.D'9B#:5O+;/"$$o]_8p#-sJu+gJ=fZM5ZA9OX4KO58!Pn6qMEblIZh"INll>lIpQe=?lF-^rc?\gs&fE*EKPQqGR\8=fWG(\r%YijFU:io5I#:#57A7,9-?d;D!rbun)F8kXV%LYDR5G-`fT&!Z5D_KC3cb;P*\N%A#iHI6Dn,K#dT;^&ADUkDVnR%/_n`fc0"@i@U\r%:ER+iFQrhpqYFZ7q4"FKmk;t8p\FacfdCNG<kJ7R^HZ&^gpW4aXP/'9\2_+VgYY(T3W7"5:2\oaWXCu"^(Ak.JY^h"k07#8Rj2aA\r%67>EHNBtSp,1i012-SO&<VWVmNqtrUrQ*CBnd@OOj]B!c3)jZ(alR$)!`:h:NMgmRrS#N,p0$"tIQ8>@@=Ib*4UB&+OSN6A*%Tm7\r%Po<jLX*Q\:a=hcaa[C[*7m:Y/@GWtUBM`?+*2f;-8Y/I0Lt(<n'2uZ">l,CGj6_3Ar9?hK+1oc2_$7$hY.!t?m"mQcMED"+N3fQJ\r%8`21oc%%X!]hV9aKV_]V;JASMkZ@P5EQP[sP[okt45_!1r*Jc`+NRm,Pr90J78UHNUQW,Q:q0^eKb,Xueo!Ou!Dc\GF4;l26*YM2\r%+nX[tl@Rl_L0'^eNuFZ,E7J2>74b:'EQ78.cXiL1)?\^=#lk>#8hcV(%+[16btLarC,J+P-7Q`?`ac0rd(\Y0c=)qE9.ee[="([d\r%!Gt95G>eTVlF(f9\TEBC?e/T"b/iFhO;0b$Xs5SOWh8A-fW#0'Nn'G+)\.dD4]Y[u.h$+cV#kI]b,+gUWI?V0dBUGFXTCZ1RTm\0\r%qVLF[_*B;ZI#mg'a?*!u/3fL:;D8WX-738C+!bS)'8+GU$/U-aLMDAXM?i'Hp]g7S.!E-"rN^lU)M#g9&"h_U.?kJMK@SrFUIRIp\r%n>KFj,j*r#])L"3=,p)sST20EpYAk#Gg-a6g]!M5!9_J%.$ZBdc!1K*Z/aMX=r8.QD9&d>G6sVbPU5*B"!8V?bdJ!]m`+?M3S_Yp\r%c?L/IH^=B:e_f]Y"tq4PrWesGbW9tiiXV2/pd0fAH3%#$LVqlAfGuZIG*iKt!cQ&roj9sT.Fe(U&8^JGLNCMOHs/bef"_,?P<?cc\r%GA+LI;,m,/Ng/_2SD=3C4?cC)nd5Tm%Ou\C/)T5U09!lVK.oMq#tETE#`Z?`@";);@AA\aLuD_.:R#V>drZ9H4ZQ'[S,lj_s4Hhq\r%8gD`.i5g\7(`?]>JDKSu#=sNil<H"D,6*io=%.Wf9Dfr&XYWsa!E*.?a&[;YaGPNP6W6o'TV`Aj;-j`?1sgMn+Jn#"mnRihpRULO\r%n#Gn""3!'%1*3Oj,&('n8j_/:\:/oTpca,qQhqUC(3B9$hQO[Gb2:_[HbV[*r;-'XoAs>^Dc)GY0#9[EdfV\F93'dgh=@'$J#ubR\r%rFXG.?UV6-=M^ulEXrIn=C0*X3G3Tud"\p)KN!W\0e)(G--7inR1#!,*8A0*R>[O0oP17""u?i7?:Jaj>f(t?[SEXLog7u%bUU<>\r%JBYTcO*Es$Vb!pB6M/4P;Cb5f")b:W.H+]8SYjgF6n@-e#s>El!AL;(3bsttfqVr3&ua1VFHYr1nnN,9P5V+C?f3/`Ta)YM?piI"\r%]6B@$\I1HA!RWSbXE:P^&d#qAD=8*3-FZPjN_(%m:t0=rLc'L/mhCTJAWVL(Pa4>PQ-RLun?tgW'6+joq7nWNs"n-JQpDF8fU.F)\r%*YWT9c1?b-&_!0t:H1s8I=^A[U*d5pYUWU0BV7jO7OYp^98Vg6\4;B\hfStu-u-BBfQ1r\":U\E)o-n;>ZZ0_G29k(c7:)9TtW;?\r%CK;m:=!u[U`OBmZb%/*F(SsXY^a\PKMCW!))nQFtB<_Ye^LG!'VOgaAGYk<MY8I32qW89[e"RkqN-;H#SJHoeb8#WJn'h@R^XM1d\r%>5V-RheDUBc13q^70"g4+^V$=dB/#GSK"7\*;rX5hnPuY$*%M=.^$,7q#j$Kg%6k\UOX7k&+D`a%Xe'@JY1?_A8>&ZdIgK"fTfs3\r%H@*=]CA%K'Q/3eZ]EZtd"cnZjGSFh&bfTU'Jf!%fF)./`B-2"-f@/`*=u=Jmdp--RMsG'^>Ye1hQSN0`AqO)g:^5g*#;u7#!(5HF\r%qO`d:#`9e\"#eCFdIja[$Lcb;jo"/(R6@[q8OH\)*`VM/-dCSdnM4bb<.8BM38pLIL/3FGS,VVmHH;b7%j'5."kdqZT0`BToV)DI\r%JN8(D'<i[Ib4,JO6F]22XT?=l.n7lu/_H`RBA1B3c1aQprU;6Mr)mt[Jnk'3,,<lG2'3>Dh];a%-u<'A08F"P&Xd:`$VqV^Dkt%W\r%(Z!jhH]6Rh%_AshDZ/]nAp,Qs?=i%TFFg'P.e&er++@I:JOLAWFFcjs=EK*_(YAao^qujB=?_V]o,7aM]UK2o*OM11].VZd8"B_V\r%#<r50VV_oq^rjl-9HS5Zbk:f4rn22a1h`oC5$K+2)0?dK[X$6_e-@,l?4O=+"6ei[qHDcqPdVNU&Bu0$(ZPP@<hSqo<>:[&#9>X^\r%f#7cnmK65fl]j@%qLFMYl2r':n&cMK'CGirGK$cA.u"O["dI&>%3eIa:@s)pi'e`4?@CaM*uAKr;$IeI?r7+DARJ@>G!Hpa/bC'!\r%+C>W*%+"%s=CmgaKpR*6e8:A%'F+fs6qFRhWbAf[R&=E^!R!<[f1tc0;Gt/1c1,2hg]S_MA>H"1?UER.'CX%6fehc)6HY$+jXn\h\r%ciq!:`jb$/.UZ_]_p"eqAtTr"VVk!fg@#-U2.1\$cZC!iNtJOM%UJ_R2BF3"X?\MjKsEao`m]))l9P*QQAu"Q-JGOPV]U$jFN?OX\r%qf`9ikQA+i<em0im4RV9l2ZLPl68nbV)n+=5'L*L\@oSi.R[p!mnYki=$N3<5r)&/>X/p)6P`iGi)'QV@g<3Gi:e8]JP;^`"#*Z!\r%nHP[RN*&*TFbm4p)Q\\N#-U9Clf^,f6/TJu#VJe2`&)Spg2fStYQg=PFc\NSemZ&/2L#BHXl$$<fg_[C,Z'$E.9(jbH%-@^fS=\3\r%5ZHOZo',X!./s`l?c"=CYs)[!Q(NjJjVB1fs(Km5aDJgO_XaC1+$O:QI$D%_@*2'"E>G;#TrbH:#Yc>@8g:oMi#=p`*3bY53fh*!\r%J@Q4=kn"%@DrMa=38`r(32V34'1,,)kL0EpB3IAf_&&.CV7,fbriKBn(C!X^`AH6MD?7J5f678i`R\fn@s'Js;1l6$\*gg2G*bgO\r%8*foJZ(:F)eI<MeB2)#-pirmG*>j=3cHd6TG9a=DUI*l>N/3P-Zjm+,A6Xd-=*Ji#T64f*E-0<Dke_lZ_l$TAl[\Z4>t'T2p"!Q\\r%a>Nk%9!EQ4*fr/,5P45m40Y#&HpKd=W#XlPCGsMhG$s+3g%u@b^V5n(A]%\IZIuW6nBuqmaW2g[9i.Z67!]Rm]%G2`c9$:s*Zp.X\r%oH(WR%rXk2.X1p%nEMkn&ln/5K*OMd`.2M$#2+,cOM8L?j+8ki:s@!g_P5M;/#QJ'PrSsW]O(QJ];!-hhlr1n4NDKq6h/D&0[%mU\r%n8#7>r;&&0p;_I)lh6IXQ$HQlWc/A>Di^qG=*`dKM@$)cM"5(V#HT,75R]hu@I.=XQbaJCg1]t;d\WV40XEZ3L8*,6p^N<K.G\5j\r%DSRS_<CiTkl\j?B7YBTZ<n>#_?7L%&?L8GPa[YC/I47UH1C'c6_9D+p8YapHA77pKKm1k_4>mu`d.rYC7tXUo:(iO-2Y,g:7YW:?\r%`#eQhdSbi8qS5$eacLaBc`+MP8eGHcVai3UYihR^@KmU(msB[epaL*b-%<W>FpXg06]W&SQ[nq0h@La$"*S^=WAfL.gNo&`oligq\r%4Jr#'e(jBjn4jG%XID)\X\LR#UcKN@?/F68fOeD4.7fTnef29j1sVO4j/`PfKck\UJA26O>E5TkciNG]ei/69FB`[hWp+u6d$Oob\r%Vr6%Oc\ABBr]pK+\oo#&D\9ho]pEkHHpLiLZiu3,i&<>]o44U#fic^DdX\n#iW34qEc1ZB,9*/T2&!(S#8O+;iUkskNH)L8"iD/"\r%iNoQ?e/<H%DMjk_*A9hXIZ!GDY?Zq5G9`nY)hB7ufC]/<-Pa[m!/2X_/cU:K!kc#+PT.&Tbm?ZCpDQdik!,$=>EDO@#KE(44\JHl\r%E]k+f(0H^ajRF1n"/Ec,"3N>t#eg`+,%5ARROP3aiqQnP)nH+@q][*tou`>4_0nh&Z`_aaCa`+'h%XX[rF/gZIC+Gbk1@TQ%n;:`\r%;NT*.<baHQUhj)aW$s4.PD<l6(W&jH+#6"Qfpn:6/fM4dNg/UQakIi<(n,m-DI9m-dL57JfZ7*I,^B;Hjh8Aq2"7\d2Zo*Xc!7(-\r%(gGb3o0^JQl*UP'n-\FC=?GkNZb#_&NlUcofX<(khC$!5PA3Sk[G-e2Srdg)2Da)>!2&NB3s<c2ZRrW?QEl3*U=ZM_$a9T[c'DZT\r%Yb"GON_\_=47$%T](2Wh)fdl5R;1$idAsX.Ns"AJJe_8P,$S5<I'Br_Nn*Tj,(gdTP(_G#*N5b,^g#niFk#pQ5a@<O[nW*"?_g)7\r%.-gem@jn(FNiY?-E5]XaN(>UpWb9D@"uTMS(Zne@03P>UPCp6-=Y"g/oQ^?/UE4:;+#DP$0*a1QV1KG=b,pW5o)5-;mFS3+djib[\r%4o+:6c2$a+GQ*Y0pj8#;.)@gAkS5@l@?4ZMnA[4eM$+7&6Kg"a(BC2c)N1m\Kn0_1&cuf`8@/smLg7`e4G3P'U_LKI&$AO/T+I*V\r%#tkCg;V%M4WXg(*[,=0\"_4E2VT!n:p<,d'kk-^U7;N#.5IaPMY`)SGVVi;Oi\m&sl&?i-)nuijRj7dui'RcUl'DK>Uk$7hE.%X:\r%a#MnNU<n46]sHTm=+j(g/p>ln0WJbr?NS.Ui)(n`06DDT_+PkI7Q10`>IP[cq%2gQTdIna;-hZAA!q;)SG`ed*-H6hooDotTct(L\r%C*;t8XrY=d>\rn`+@lXO9CDT''0N9$.MOI0M?l,TEZ$6,.h1TC;k'b89@kI*,*.$i\o"/AknKfK,XoRlD'MLX&.D5i"O!7#@mfCV\r%rB,=J1e6j\H.X$mV,=<j35B1b!6EKpj"oE]/aJCi$_f]/No$Zaq^c_li?11-:E#g-:EtV3qnh9Y3oZ&JDA$WOkoojfAML\nRi#7G\r%=D3gtU"r2.k:o=k8sA@M9s5iR$eLDfS8=@C$:\IZ:'arWAo^AAW-#Bf_sV[]XS5S=:s\X]YOZ&4kMUC?j'TeDP31Zcj'ViHm,I't\r%<TE9(.0Xj1PUdf64Hg$t4]I<DS<[_rJ6l)t4(1pf4MK]Bf=K&Hm>pAm/4RX%*I%qoj>I^$)+(mHW##Wa]83+9%.=AXAcK.jEkdUB\r%54qM-kQ"#$aJ[79+/?l4]YJH#elD2]lUnc!lCRW8\a8QaFH``/Ie#!NH:j5qJs3'&KR4OoM*KBg6hhFCk9I2kU)3=_#!KmG>+)J-\r%'saJ8P/[P^5oq+$PgYLRGYh%Ul:.Q)<r=-iRMd\?IpR\>BF2u9%Lc63:L2A&b@'h(UHH=uB1/&.7L`S^+/or*s042dn"FXE3*HnL\r%RG<!BX2'/nX1N^^T5B:k2Ze=;ap/QXLX07fla-M"[62,r7=Kf)"^.H1/h91JLdM-07s/["(/s2(K!C1TR"m2,`Ol@-YL@+;U5E+I\r%@69i5mBCi&6iXrLe<*IPegbt,(V$a0k<Y)BTi%bePG:'8GUU9s*$XnaM'4H9<D+In_jn(fYUt,qjj9GK+QR`cgBcfJ4GOj.h9J8H\r%F/Zoco%;M-_+H"K`5h&g8ZG?Ef5OPF"sV\bP+^5s@-FD]8ND$!!="F@5^9\?aYe"pZH#/M=D6k?ji-_1fi`u8:_UYp93VDb[/^jm\r%P7IN7X;/C#,0_9e!2g4p-$G8$>LM\p6rpZZ3ofH1b.0LP_CJ+O&s-I=c_-&*)'<0INL\ko4c9n`#Y/b)!>E'P!\7"\/I$0VGU-;'\r%ONV%u3j9+\?aYWL/(U&E29E\AYP=V=:(&MBCc=S_%PQq043XFnEfT2GYS\Wk3oemGM\l5SV9`-,E+9sg53;&Xc*+&qIQY-e</5IW\r%E*P:KhX<d16HFP])!+"JP:Xb;..+nTkib.*!s-H.AW_j$a)N7\PK:L29UNQ3gUE%;KS:r/Qtn[c:;M-^(646<=:->m?kArl9uR4[\r%9Lp#h3:n$g8ZIHcUC3/A(@#k6jf`H(:<Vf3LJAe)(qp*]RC5lf-*8`u'WpEi^$8d3\i9SRli4K/4I_4LqDlMT#=OC(7HMsLhrg0!\r%]G(EIX+ae!06o5Q#(#Op3J2>gmK^X*n-F2qN$Z"g*]/<"K<p6o@2*L,i"BMqVr`84:s>_=<aY_Q3-:.2G=A<Cl_-Z^kcd?UY8_E)\r%(*3.7G\d<s5Ik;*U*q5"6'"NL8du,'Z/5fRHgnVLE?,b"+'&%P3HY?H;Msg$CGR#9Y:Sa`3uu8?'e*W'r/-T!$u$VKPJd]m6-O_o\r%Qh4'4hns6Q(SAaKWqX7,L_j&Ui:_`L_6Ph)C0X^C[`"L+0n#th3Q)3R7!ut*@AXh\jGuS`otH1kaJ4lR?bo/O-peW96Y_AgdQpc(\r%<Kc6r$e@nWB&3)`LMN3%3l?S_mB=$NL<Msh@3P+Nj;UDl<!u_iOGJh="W?8fS3-Z->nO^`Lt(Y.Mm.YV._aaFRR=X-c&]=LbCA@J\r%^A$qX?JkbDm.C/:I@2;=lC&T)$NUE"(,!I+,+%Nc*ZTV,qqpoFs8(^Nk*#_^aB2:3rUonthgPJ#r*>`;\$nS-S:0"d1"a2tfLEkT\r%1n-CCl@gZ[+8nZb`KRq\4LQFE`#o3l16f*4TR]OuatKMXJE2.Z_P?Un71d`N(g)F=,\BTF#%ZtUE;Z2u>KXBmi\D'>X,!8bE#>tb\r%G;H=Kp1kOHI'g0aZ^f>b;'`-hc@N;-<%LZQ1q99:XouFjQra2V==_-?^W_`(d%eCkOs6B#iLLPG"F=71PaqutNtt'6rau\9)X;hf\r%ff%H(,MGo<WR4PO$R;5o7m*&BF..7h:`GB0%9RiLkhQ5.WR0>3^.[*CCW7C7hoSiU$$p<%<Y34t5q;-'!W0\P\=70t<S#VNpo$tB\r%!aro`'@HPl8&Aso,_V."Q#)JEW8KGi^]j@GLZ#F._[c2)8!TOS0Jr)$BBuc(NnZ5FI\O5O?B$N/W*f;c^hdV(P"f/X1a*T&&XUX[\r%kc_]?_28*kUoLpi.9TANEpOfb5[eVcMS$-qG?"?Jkd:G&#,goZE7*%-PO*AU'bnC#(;;h^$5CI:B%sf^QJ6^kh1I_h::n-[Zps'W\r%&dJ20VV0N<qSugu>gdRDV0.A<;Ue%8EpY_b!@s*3g.0VSf#G"X$#Fh_jBeOCGmk@%WmNh%RO41#L-?Q8LHg2GK"H4OC8]ce@o==S\r%?t*C%WV0'@R^u6qf)MRZ!d8#<4N@g!0/D"f;L7YfO(Fr)+!'*=d/7rF!HXPDXfg3#8JF_um\6F`q$nf7M%65Q/U4I`:1LIJ0R!`"\r%#0n,B>lEO+/(g:G3Lne3"=Rn+`F$3bF^9F!.spc^BAn_'!r3^5?%RR*;jDogpPh]cF$eDmSo"S@C54Tai>nPi''j)$SE^:m94fkt\r%Cg%*2:>1\uG!HsPb_Q[].[;QDf051f7g+V+"XqB3Snd.`f$sFS=o=U-JVSU^a3RE#00E%*9H0q.;PTUni/K\9XrW>-]:;,LAUfe1\r%8ZBKY:E+c)WW3-i<\%!AUhl9d[*A4mb1LJ3dKJil<bQCTk"]CuGt>d:-GVmOWQA\_[f'ZNYL=Ne@`D8a0KNV_r/8eKBGnmO(B^Zf\r%3(k%5,&jb\W'N#3JF*SfL4MHQKaB%4Lp3:F8K3`s"9b"#8QuF#^bk;`"7cSnK*DO'c]5ooCQPL5IKg2p8!qN/CKm.U3aLEh04u%)\r%b=F@oTO5]qnjrL/EJT]"apXL`?'GCK(Z\2M%>CPCUK8Nf16?=:4\=Z&KSK.?:l#=%o7sc_#1@_/<a_K7l+7N9Urr,uSUr\Y"k<AT\r%<8d#QI^386I^RVgRN;1_)Zn;:k2Q=10M`MjhUQE)Jh$=0g4_u5W&=Xs1o*hlqO3oZ'_i(k9u\U'^Ju9;<5^dKG`6ME$J@]#aV*6I\r%d3,qK*3o^P)^OPr8FE8N<bD'4[IJe'P=8Hs>coJH,oCk?LH>[&5[bq03g)#2KkHRPIPD'9Sp\NN+D;DX$7\uI%i>kQ'+rWD@)s*V\r%nST,07Fr^`>r%Fk3^pK%g)q,aMQgJE=dZuf9%'5hPa@0R%[,VT7rWceC6b\^<L'>>Gk0s,^au$">bid,el!,oOT,<b#`Sl?Cr"^*\r%TQ_m8!g9ak)GT.q1mejTrh!/u!<#1\+IkXRn9IN\W=[D@Hm7A`IgQc!AG'.1)\0-I3><K8KhQV"iU%[C\Wn8,JfKS,_a70M)"j)j\r%6r4%>ZZTWL],Qq^+gjNHD43IpN)Od7CE6h7\$<<c##j9)LZ/\R^g5ZHTKNN-qXbO^Gh=mnEX$Dn>cQH=ef!Q:7DJ^NFMJOE89Z1#\r%OW:'GPT>V+;dOP-'rHoX;[F>i[_PnDfq/aM4H](ZPGe&/qm?aJp&M0rAon[#:k1G29PFjpaV5M7b(PiSl#84+?#_Ef@S&;lI#rc:\r%p9;2[nsc[8;^@8mjJ&QJK&_lbrAGr;!/q&`!&82]'")akaODjDSP)GNOVSr`@&,.OPLS#I)FJ\a('.KJ5r;)GftkcB4HAhpWb9D/\r%gh"=s?W=`^AA%9:!D?b0r+1Y++Z<RU(<@"s_'[COLLMI(.0Pglp4>nKZ=,aUCW0pfnCSl^#t5d6'fnXl98X;JR,"/!27UYHFF1I#\r%ZSG<QV1Ac#L(AhfqrMKR";/ou)@21TLX-(L+FJ&XXSoLGJg>=Q1B/@Y@+K->$"Q*Aaa>NPg2KIA9#8CXJ?;uiS:H5dcU*RI4p;SD\r%CD3I&)ZS`A7B*!GC:3)r!li$TWYfL\p4`k',IpF1ggqQQA5F`'"uqdS&/3<V)-jVP^p#R<#(%U*61I4l/AI"gjF3`dit.<4+S!/_\r%.ZLkKM4,n%Lp[^ad+[&QO2NdZBCPt3Fn?OtQ--/2[3??OkOfIR<Wk>))$DB\91;7Io9VG*f5_]L!*/#T7[+@CfO8Vs@&k]e\O<qq\r%_A.,Ln#W+sUT'@\LG#5Z"I&nse&['1.G#+4Q"d+Wf&CBB?j6VO3TuilA,u!??n?l+"]=)t84CQi'P_2MdO^VRUN*$L:8LOE0B%>n\r%]]O"i$RQINf+*Hg"-J2s;T$UZ\<.Y.HnbNF)7U4kLj=^hRsdgF"YR(VSH7/k6m%#G*0RLno;1sCLc$PX_F2p-VEjkr90m]>!WaI)\r%&\'rZoZodQ1tYWiT(gD+ZdGD1;X7;i"2Z(!&.K&D&k.L;8^\`Xa;WR.F<FkCmoZABMR'l]*88q9Ud=5`RYW,LACZ:SOgtNB@0;*S\r%PPE`;#"/km__;p%+]/eNcXN68EhE4G0W6[M$JdWu=O(n[-"TQ%Rj3gT*:-26rdcJ,:aW0D?6X+l=Asl;P_GgD70HM128h41ISh&9\r%^*L3#b68.P-@H9>51tVOV"P:UF.+<2<Y")n3`r[9i7%SCr*P3T,]=Rf3t0)^KGY8R]ETD2TgF>a_!XPn]GN=;^h\r7p2]jV;(5KV\r%KF/_K9/dDAl3lSC@/a=-g'/+/0c_QP6Wjd>#(_]@W+)TMaEH%u5$^*$Wa\fR)7#4[lntI!RSReVl9`%o+ouH8PUS^CHY/-FSB>3=\r%MVWJ7*Zc3'78b\+OsArAo12,)J3DmL.1l%-5^>+]p)V#g,_"$sBTp@UVc@8]`n;d9Fa.o1ni#cFeIS_`gK1aX'*%!jJ0cHYGV-`>\r%Ql^pr(*6[j'7S[:A.uE*W5(.=<;42M>JF'h5EdNeii*="U&&Efj7Mh)"^7iuY&A'%-%lgl%na]0$TKD';a]mr@.p&DU4nB,ZOdk/\r%p*Z;!Afj9Knm`q9.$cj@PYeD<&FAGqQo-mT7ghEhBF:%7"(O@dp<)n>,&3!#@>LZH#7Jh)%Fu)rr.*mT%p!+3B*NZ4B3VM\edpTW\r%m&#lD!]VIc>,!s0%=kNV\hPg)_4[O+XF0@9-I\;N7Fj+o'3u0e&%K"?+J($tWtf\F7:H?ri.V.2d4'm\mR&\gBqeM:luo8S\?i&*\r%:;fEsfRd1-V(\0YmQ;-r5aDW80;eg7B%B,+Y#Xmq&TR3=au[IYV&DqD9$O)7"jCmR7L7G_4uu<!Vps0d@_b1X^Vu+Ki0r;#'10@N\r%$6T?2`!qbBOpHfVEah=:>Eg(aI2EZ7E\3SmR^ba@KNT1Y=3rtFqA*CNSA(>s#u&<3;U(;O@h-Y&:m+kR.[agEj<?bkBX8%'on883\r%!6/CV!X>HmJYW5O7Yq*N"DR"S]i)uV8rbCMc<OSgO=pr-1$ApI\,VMTCm<Ns^KZb8'C#uAJH-D",)/Cc:f%lMI*fY`TGu3FKgMX\\r%.^0Ft%@YpffaEhG.)M<nP_gAQLP?KnOOuh3cIO>j,1h8ad3f2C]F"/n0Rj/(-:%)B%H8\$GYn(#2g->`&G$Y\K*Q6UY`7s5"h?\c\r%.ugG(SJ8/no>Y_gA`tk'JskjrM9^hh9#3f-7DG0_;1UI@q\c=B<imgVh0'Z\YTs_8U$*qgi0&p&Z=mc,pdVAjG`35oja:2o!4dWS\r%MBeN<,g4n3bVG&T<1RHfjr!=<:mO!Jfj'+G2i-C25Y2j.&04?6ie47NOg:sK&=*B$,/a[WE#?<^V)`<<EiNa2JdA$ZF/g6o8kCM!\r%L[+k<M@r$Ci3W>B"#+@56J7PD^5q+f'dKV4Tnk$!&MR5fa%B$F'kN$'"e>Pb.gPQW@4-EK*'h]bZ6ToP[QoY!erXGFdMR;J$P!Ba\r%*h4>/Pln6uJC@>9Y0`jB3s1$T&DTSE%mcp?8&,^u((rl_%##,O8'96S"P4t8'"@_BZ06H:^!RaCklNa^X?/+#N=I<(MBjlo=J-jG\r%Ke&MkAZetJcugF^1?kTV$^_eBk=uh93iQ6_,h'^c(O5@2(DEH8.u^EJ!W`_B36u'kJ]n-X[i54OOIqt>0mU#m;p6(k'hKZ\#<&+;\r%BX"3@L#([&AG]Zg$2@f#9!ZD%81P3Uc\9*>%`H8BU;L@iZGFA3dNp.uU"`ICSG@BN@AN.1XkG89mT*D:kG=4RkJ3?L%:tA^@Q<Ht\r%=E*%2*=I`d'\_L\\7lBu9m!d&0kLdp+i&qhM%nbJ(e%4o5.PRf[4me6:U76%V:XPpFj/qo6VT8\6H8'+5()SH8ZZE^>ZcAVs#-;Z\r%=/)@[\0;LG&?Vq1X'R!.#TX4qAJ(WVs!b:1Yf"^g6m2u`Q7Sc$c6?F)Lq;IcR6Y:h/qN4ZhUl$FLmA1<-Vbf4lP#*Hli\O2l3TlT\r%!=;/?>lrEX#>^LJV"ja[q*h/q[#?ghM9,<l4I6`NQpdb%,n]q_<g/>S3:'Qj&K,jfE_%DF*NUP!l#fQcB%lLlqO]$iaRHa]06O-f\r%QUMV?AJ)nh=[ZSub9E\9]h&tO!EZR_.+2_O,,/DA=[[7X(/]Iu/0`!:i:;e"Pu=cV-]NooFX<#\de$,ZLo..;FniG27c`0u&c$Q`\r%6ueRALuQ!&,$F8o7b$nBPGAe1l(*7u7:p;I%.nRS7)k1&0f:A_9-_UFdtmS+1a4/5e@%Dt-u36-oSZC"k\d2o9I$9EN-?P,Lu,I_\r%K5!_'cV>^bM1%2.Ln`i*N&2`]Cc8($V0-K?r#59-V\-2#p.<_h6K0q4[l99p;IU*S^tb8GjD.YR=naMG&]OXrLsiqEmn4lD^:ZCa\r%BZ#dq1nlQm,Ecm:\!9FY^,1fTQ'@\N6uGR@>1/4m1nm'gdJPgF!`.7#4K%oFBgaFl^<e-b8:=nb&Yd)eNC\P5)Ne3i7\nV5&Q+\I\r%3GCm,I2\6tN8==eU0,m#&nfeR]=6ltHn@(H-go5S,T8k5<2-`XPmG;=9I0b+0l(UI-.7rLK_Ypi^;P,f1d@OEni8$2`BDKoH@cFW\r%-(jCmHm1#3qS`1t?Chkuo8,<5*V,'(Qf\t#[J<3[Xii)Llgfnn-0.W];-oSbPTGo^UhAj(onW%rq*ZQ&5#JmQXU!`H^pK]_k7cf5\r%S=FYE3Y<46.@nQPksWl[U_B^eF53'V'KDZ)XA=DaVfpSDFJ94#k%pd57FmfAU6j"L,3-^#T-uiFT?+4Z-h?ToM;7rTU:;hJa?C`=\r%aM1h@&J$]GS]GVQ3g$:U+t)&3DC)KA,+p*_8*;%bW+P4oI`f2hjhNmCLhR=\&sWQo>bX(tXrF_/&m<L+EpGp->U"Lc&orh<*--o(\r%RHubo#crtX-IGb(&s;kG75B_l\kJhHhf$dcdd&ZFqu\^211pZ*;^Tnrs0&%dUh`_bQ+))uB+i%#Y5A'HR7&"7^,qNljjRA#7!Hn&\r%aWu2k9VSaTP:3NU,gu9?M:@tf,0rhJO3T!XYFJ2F^GM-&L_7;C,T70N`A<?E/jtdVM)_?P96O$=;=<j?U9Y,$bu&f[@n@pqX6)gE\r%TPGa6b+)#`k)ER9Lc"9,XnrO5M"$@(P)/OuW[&1q]d8MK>Eak&5\EFs;&ie'71p2R_$rt(G&4Q3&cFhTM#Qu4\*J*jT',3:B?Anh\r%*5e&"aEg2UlPc5oc`B1JZ8>%Q&S6+<`XYPlmlA_%Djo7!g&ZI#ig(0qVC,aJ:6Ss>^&UTAi44#J]2c76=*FY)IQ`Peq]CjupA8b8\r%H2cpiq9<UsO64&]m<s[!;(80+jc:GT,I[Y9HVd_%9=@/;XOUOk`sal;:*nEa,*fJ#G=&nl.H-\I>TtV'&njpbOU_+&fs[f_BF%-N\r%MBsQnKi<%M)giL_kZn^RLl_m>>K7B?UMJ'mks,e]P/rth`,A/p>$^RDqHZ(Xf+RUB7_>rhOF0Fc7`4q50`I^^"C]7H^*MoZNo#^H\r%+rgAYaJkL7#M!R.'$Kh_%.PhZ)0d\eQoZpt`WoOYC*lf&EiLQ8X7JJX^Pq3"?9Nt8m2g3J&1-;M&DDeF:GI99oSp7scVA@QIiPEA\r%B?i&T0(Ke9U1'$N0U0Pp#SnO45I$VU9Fq4E]MtO1OIn>Zb4.G@\`69ATSli'V59ZYkWQil^4-=6-)OtUbRl3fn&Q1I>_nod);Gph\r%1hjd`T\2i:$5K=b$Oq(+nPc-KS]JT?%rc:3-)^q:A-!5LdM"XKo`i:FeWK%\jlKhLCF0L^]b^rIoKFk:HjI`qae,`nh$_0uH[+W4\r%:VZ\m1]IhB!6XtN/1;_4qX]t:I)-,!([KA6rpW@SN*WMHBDTL^SMYMpm]>X`?Z=_Clo+JEbjo[sJp=Z;poYY*,7bM_E>ZD%*LR91\r%:bgHshI+3[4m$#P]io.0OWJ91*S2V/]?7r)Q=7H(@<INUs6p$qX=W[U+CTbJFa^Z!1q^aVaaZE#*A`4EA4R.DiurkenUQ9.q@Vop\r%CBPQkpO*HRVHU;1U6&%L''D#\S4@LSZ^;+0DkkG_fnh1eOM-7i%69$Jd9"U01C5E?E5LHI_`i*#%<:@b$>]r/iokFDX^b98Ei/#S\r%bObi^BU^9PJDeHNo<6eZ/Z0E*)JK;a4b;BOn@1S"BT9Yo%c2FHjmhtj@'\eq(jqp'+(NkH;@hPa8'9EJ)0D:@h&dA[EQOr/,CNA<\r%IOkVb3)3"5)1ugJ'Fu/:OH*H413AbBM5%C',nt[Fb)3UtCc&ll9M];JhAibVZi.a=\J&.Nb#G]?d<"!JjiM1b'&3VpIR>M(eMg/.\r%:$-P.QHgYU3S`+)Y-,a.];ACmOl$7rO;nU!J:N4;3FE5QSK>%k&g]S4!5X?!I5J$=8%MkL1]0F?kVs7ti\*Vecbq\&+F;oL8UT&+\r%T=*:-CsmE<3(]fK.HD)JK)/*DJE77$QAB*8Ab/NPiN-,.ib1K`h#B&]6l=[QU749oln[P7lNL,r2JWDur*$=#'n2Jm.2/G^i-"b&\r%/;`5Th!FFsrU/h/VhmA_3Qr#,c'B5g\ZMSh(DIT="80=eG<GtY4,3=E0oKW\%#EM<\Z0YK`#6YIkp2=+PGJLXOK?#qWH6Ot;e#7a\r%]@?2YT*u6%n^^Cs3im$j>luKj:hX]SQjS]X'Tre1&_NP(cX><Cc$A6f:W*V7q.Cm1+U3s&<+3kijI-9*'bsQ?_5^0J\1:#he"`kX\r%TO#UM$sD!IAj%RA^pp*h#i/K=J5d_38R-9uHg-hTd0JO3!i7i!$BIkW.p=hn)M(47.W'EBo.i"iOLm(T).08^BW`(u;q9)nn1O"[\r%R-bG6Ml8tLL1S-`0tpYZ!ADqcdNP;?[lZK=qNfI0#"+!52Cp&R-_j#c.tl)]ahDUj!#:cN9)A?MndW>cfItP1RuD[)'u7qcRI6Q(\r%Qj,b-ir\m7:X<N1\)U&>#"U0s;MN*ke)a5R0iTtaH0cP\D.j*smk?TZQnL(!#"U_\WS^]EDC2nNXd!a@Vt78[9'#9XKLcoifPPND\r%)V.2dQ=8u+(^W_)4sh6]qSY&_4;A]`EO$E,,ff8m/Y3%*KcIGea]Vr3lfZCcA:R`XU,T"5&\gi2$3=SF,I,!r<5gV;WW^ut'IZRF\r%=s*fclf?#99aMi\/;P!33tnK!K5R"q\UTZCJM'neY;D2SE#ZD@Qm1Y?qal>&?I=r5)*?4=0LHJsjG$7ql6[V1@tP"UDK<[N?h\&\\r%LcgK#M$c)Z$'?d+'T,Gd[pOkD$(MG7XOE98;^cn_A@mRM^+,GC\Gu<HG8NJtV8G)KKu3[^@C)r;HVsdhO`bpFkYVlRNXDA_.'I&i\r%LqW8:m;#-*eO0DFGC"]5nbVk-qn5ciSpWZT]=`UM9*+c+lbBh$]0rW(Oa,Fk-i<g@nkT0nJ]H(NGZNN]=Q%U'M^9E=c:`s"La\!G\r%"0]+"*@Kma8f]:3:Kg@f&H7A?YD=\Qo6q%;bk!YkS5s0kR/L2s-gJ+f:'H-0\._;YfIZFbB9@AmK;9ML:A6K[:0oU@jE9IB;(G0-\r%5^=_@>2HM?jdl0[H,i+2]X(AG;,8@lkSFtPm!S=-19_iEie43@EQhSu7m3>t"*POp2Y'4(*!jJM@Dg?QE-.:_*\lm;bX(-ZJFd`"\r%j8ANkB-;3ljm;pZL`6@mjZ%7s5ts5\%V=if\U,S.dr@'KKh3.3!J%*#F%OF+)9.YXod0E8b42j'37g$>Qoo6*c72LWli<?S)o6?d\r%`",R,&Wj:6J7^7/O@==Zp]Wh;YZ*#KH-BZtlp5"ci)]@&Z5pBMhn,ZJB$M$0[)NJjZ3+MC!q'&3OsK5S%%'8id/e!@alDIQb<?]l\r%Mh)lX=?^<8Zr<7q`gY=k8r;QEZ;)C;6T-$]I/mt/J?XY47;1E>V&]gpDFH'][\a+?TBi1"ZtBb;o:EGKXjhg:atafP%]Kooat`#m\r%pr&+`otW9U*&kE!RD'^Zn_!t4K//u6Hhm_%*1*02+K#RGDh9T8`q.Ds-lF:$_nUD2C`V&skVm9\nC"+Yd/l"KK^8qiS/O0IUTM;?\r%;(^&8RNtc0oPq!i83\0#5\D[f^Q@Cb&6eUh`c)\_IcBAf%.Z!%NUOXke1h4_25#dH:_">58p&Z/1H@RAY%a[XXaq.mb*"4LP(0[&\r%1@@[.d?:l\Q(n&oUOHht@*@e&SV7?`+q]J:6?L"RLuR8],;c4M.TF4AP##j'6?QFMr;mFm?V"H&op7gtO[P'uc!KQHLeHYX:,Zcb\r%l!+4.!eSUdeaS1qq`=YSX;bUf(AbMe^Geme+S*Hj?3E[@?1pON"27L;O)^e[Eph-(9#@$[PZ.^TZH>UJTWTH6Io(S<M#=D&^LDFt\r%!BM^r7Ghl0:^c4h0o6hi$c6>MK&mmE#m$3L_Stu>&X9/Uc,;hhYb#eI+G&X4G2.^BWmP6`i"79h!_5!#=:(s,RY4KS(H?XEj.,so\r%Kh`R+)><p@OE)Iu"d9Z,K_pJ9.7he4(`p(/)-V7B+E_NCC\*-6ha=qt9o><:9YpNBc"oM,6_PXn!*'5sP[&gg02U59c)3j)*b`!L\r%b=HQq4EAZ`R:COoh3YX+?61S?g`JMi7LpCdi$DU18Cqbocj(ukSEV"JFE\gZfJkXeW16t&MMMlNknr0@\@Md*irFJM`@9GT$C3u^\r%iOW9S.o1,T>Z9lei;,Q<I/Ht1IkbqsS]!s4TScuJ>e:P?rTnS;$nD/^bDHpl<6i`k#((.=-rId;"(n46A]p'b>\,-g8hgZ/';qr[\r%g/qds5[kug-Di3X%)'Xp^.3<rON3&+ooQM_oJ:RLF2i;YRLN4re'&=[f\2#M.H6o6&4<j^Ar;m`5%tq-UroqJL3P9Na36hcKtn%(\r%_306@Yg;b347+mXT\hp^fH&>k;OIPTXd.^E\\bo`0EIfP"i!5V;@Gg@=.VN"4'(;mA?P]a[0\"q$_IO;RL]WpK7@U[V\#An10-MW\r%RRgkt:QHOhE9=)qXsg<cH&#L`UqalpXL1+P*j=P-;N6qD:]X8;C'8Wp9@ZuGPCRJ=`qq,@+'LoG(:4dD=*%Dp!+0&W=97<;EN5N0\r%#fpQ_i1odpM^fq)$HDIc!F1o5%E5`J\>=ljrB9)qP.(V"H>'JmL8qmonH8r93UVI[)IHL8IKmVq*g9K-3(Qk*"gX+/1"tTVd4>Dp\r%b!S5H#5t&/[X(,FbY51><gI_N:ppJKX]"KF,n];M%'^!k`#C*5!ub.36DRFh;aI;F8r<9R0K9Z=J.3?*6/p@4]:_D8lPmudeKQd+\r%(D]SAWCYd*\-^\b+MDgOV]_9SE\E#12kWGQMUlPkoMg:4r7eWS6Id0sV=1\Wo\n"kOeANh;%?gej30X/mmHKNIm*VAm->[Q=?XT=\r%l`e67IHls\;)h+,c]0e50eqj9"D^_39E:G>lPZEUWNr,uObXkg%$;2W8l<G$cG*F=*/g#(htnC/b;rH)PY#;e3JbG*=)bfq?$E#_\r%-8a9bRTqa#K=N*pbeTY[\XMS]kQH4[2:`DCek_/Wc*C#N;e>C2j]B=.i6;8aYi/fb?!=V%0tHk+iuUC3>U+/P2C/9\]DV]8pYLhM\r%j3%DkHNW%*]f4\RdmNSW)H'.93h_<!m+M?tGO;RZ=,^ui_K0npHuo!t(9fn>c&AO@qT(tbn^EVk5hQOcihPNGX2dG7_L$dL3.l6:\r%>p(M;C_H)qa:!jkL]*W<.L<<_g=@X5J=>WSnstVdj;:7+8b0eLjDF".@1Jgm9KCa\);$Z1*W$HF7+q9"l:D-(RNU)>Z/n@,BC@*J\r%eK#V.-(UndmM*?_#!UYc*q#FT-liP>P'rZ.Wcsc1_$NTLWE]!F4Dl*,(1c4E67FsIn&0qd=W8PQ2M<l!2iI*Z(;R?=3thLJGRC[q\r%FJ62/EQhK[L3)KS143F_HufPrY2f$=J0:4/Qk0\BO@-MnK0b<q6nP,^L,Rs$\Cc`o<"d"Cp<:4$+EM5(aH"!]F8GI!+iG[GHsHNQ\r%dVu"RV8Ud?,5VXe-a'_h,%[ECW,*Y3$C/gZlU#7<PJ!7ZpD=qN1Wc;:)6s8rZd9p*QKcPA,a;6$B!,jEkW#lp=]<.-k!7m8,DF=p\r%"FS^>k&/&^lj#O/dgNc_J#R4.[LM$REd$3T=41%FHKf-72E`@*g!IsE91_H+/ea\AL=4FBMHU@\RDSVETp]UD$-d!O0,L'3g%7+s\r%2*LWJa6b#YD+eD7#/MEo69.M^!c[6RLg1[b<s3eb!rViP)>)]MntN``E$HHRp23\Pqq6Sa)h"X!dPoBid2>W@4B81FZ&;%h(W$=L\r%M?Wq%i@oRt<X;bT&S@*I+G25B&#7c5"=/h8OMZ9kMNUd;,P<GKWlXgO>kh$.H@[=(MY=rFmUoF5cFL5$M14NQi_0l.>%%\'>0+?o\r%M'"A8Ma9I5JnO3+GfHcc[u?G8hDU353a550X[6+V8'W\/j.6O=F/'k`>2iTcE/-#bp25,H*4sStNP<kKl5Q>;!M@J_mi_e]'.-q(\r%L#bn0OBfmBOt4(6E=jL]>_KVh:i[.g,o>$2;KD;&q7,Jmad-20^]*!dqPhcC?ZI067&G\^6X!)7`B2D4>j".J0"I57r'JNu`U"iU\r%^V8O,=,lT`[@aQJ*Y7iub#uY!FLN36-,a&&/.UTV^&Kf*lugOGC\m\sYaaonoST6![NN=&Nj]GjCO5,PL0cEC5l$o6Cr!LGXOdh%\r%aHJN/YJ1!o#+n\\!riTuLt`/7gWMEB,k;=hJ$qLkg:-"Ce)RlmKZjmidLE*kR=Sb^dlW(Hl`16'T,s-?9^1qP/IW9!66p*1G"2Mb\r%la*p)1E^XZU)cXRhMemN-FW['om?lZo.i?37WP<p.pJ$c@"<reK`]"U.Dc&]rQN%?)nYi9NS?+//smaG)Me?SH?:2bdk18t\g8Uh\r%-GVk$J49KC]jF7YE&OA,KDH_RKYtR:;dRJJ;[ddSr1T]iKT,kaIOU,8.6VgQOKUYHjQ7`GMjrse7A$.ZPY<%C>`\dSgcnV55!9Mp\r%8FQ=]q,PfkE7?o=&/)]r^H=TmN>[k&;\B[1*pQ=J06l8,Ls-DZk(ii`+KF9/O^lK4_+F`JmFTMR`E!O^Y&MFFmW?1cCAl0[I/u'l\r%3Ksb4Jp$:*[pUb5\'ETs/N8S"f7Z/ZLC=D!>)qE[:4f8B3[KS^@eO%6s'BY@%t!*2Y<`8fohh::QQ;(%Iq>%d_Z:@5.?JiQigKFM\r%=HH"$[K&@=2Z[]cXn59hk#WnSo<D$FE]:E#oO*.49cA=Me%=9ug^UW'eQ["bGu<J)D#k6Vo58tM1KGQCm0Z+(*@#a@:2^r2JKU;X\r%*qbCie"F0sRB`P(UX`1hoW!kFqiCQmcgiYA/DRDDY6sT`okJ`=m1n7hhfoU,6Zmi`:-9*aDE#`:)Qi;B+WN0kP&G-,-h>$MoDe5,\r%cHH3];<WD<s,7-eaMN5k)#Woa5MkqN48sKF+7CW<*Q`duJkMYC'#&Ds!LnZX%c9$pStj0O48n[9;t((uHDNLrn*f9moFktg6Hr<)\r%q$AoCTgm$`rX7:T#jS<kd-ebTQ\XF^B"_V;T)Zk&s*4PC!RFP<kDG4J7fH.ZkN\"U7"kCc14G+>T2>+mC48LoWHSaTW#tL'iuNW^\r%j,\E^nW#B]1%`dfE.`^_lU:c3C*=Gds+Hi5;"G?8IR;:TW&aC.<$:\6nDY.-/gUEpp^I0jS"FBc'5`2mbtk],oo>::T3p6$T^h'Z\r%IpDc0$ib5*5;$3\45rK]n]*`jGfLoppu<Bkh@]L;YVQS<7_kA:_8B#e$Dk8+&-7jTom?X*O:$c1F";]XM@8)7ET02Xr5XZo3:S(<\r%0'=73J,Cc"@.NJ;JKG^-j2-:Npl>fLo8^Y:6QU^T:#Ze^1'[lSK:DM$ol`4HmMom__C]SndUI4KmC2_:^%KgC%:G)S]*G\^Ymf>4\r%FF9Y4IW<pT"4u?Id9ruko*Q!iV)e4Fkjq"Y8@3a(ruK/VJ&OKHjM)hRUr]/2o,m04r^FrK:P/D+@/fW+n8eouhnC1L];>PW(Y@Ep\r%?gH5`,[`9K$D,ZAiqOn2p&AG2rKFe6PTZMK^"SItgZ:B:%hT7fV$AZ:4a/9#`$q]QpoE?4E4qe?Ka&@Eqat7"fiNr?B"aUlNgoG@\r%oO:djXdGa>n[E=SK.[kq)Pc\-[+`EU'OUVdf>$7?4\&->[EJLe@!g_R<fQd2+X$85)D=R4r<)=_dUA^g!0J96hQHVFIe;1mjVGP`\r%a^*&L-JOYnA8EWSEoZGBa+[);#ork+OmMOm!<jU[Q.WP]fYdL7@tI1!ds^0@fKKGTn36JJ%)(_DIrs\``h6.3J^Rh2=KMNfB=e+2\r%JtGU'hi7hk$(cg%lup'V:[-j7%kg)0Nre7P[06SiFfgl+T,SY&^f1cW;hDgW.Nb%-^6#/\EgmIQa@YAB48m,*BuTP;Jt,>:Ds.6"\r%NW5]e3;aliXGtnJY"t+-N>DQc$_tPq\1i4l&_4q^h.R>FL7`o^5Y"e\M21)'`H\j.c^^'HI`(;ACaQQW/N(h:s+Y#HngGc?;$;3W\r%'7j'r.J>0_ljJBe&/KpE3`uDDmcA@m;S[d;]23&:s(7#TDcm_%T'!=:b[e>iVP:QZF;MY9N.ebbi*3VIlSZ@8'g-a^*6N`F4qAJH\r%Q9Y<?f:VmX]pjMha5oh,]0Vj"bY.^LX/5+]s)i>\\i0F!L&U4[#g:KnRY&%9mJ3U<i*U?\RSm:cP5-Q3Ifeice&U?JOFAcZ_@g/#\r%=n^t=qpFfb4Kschn6d@I+/=K[Qop-*N*tSQq:F`5@gdAhm_q`BWDD.#^Q@%`rUt$67?J_6#OinMS[1taN.O"\D!MY74UcMgJbZi\\r%nP=bB5XYMMJ'+$?K4!l\@c'9=bjD-MdmE'gj/>YH_ISJ%`'E#_+4c/E(`D7dHc^!Co'<OD<G&el0ZCfJm-NKR)Y@LGhiEkcD"KS@\r%CO^5Q]2:$\AD2)I[6=GaPQ%_#$nda2rI-f^O4a=d$BBif#i_&T[r@]?LI1j4DR^WhKs\QO)KN<K=;Yn/&agrt=<M_0TQ')SBE8nS\r%R@?dXM^<aUFE;PamQuj!lqKd)$58Z67gon@iUHBN(k6Jd:R\mQ'I$*Crb=)TL+uS,XGf3m>LSK4-W$<AL])1^+Wrs5+fbn=XYkD+\r%nhZ`J)^E6c:/EoL-qqIh_`3>T+=ho($D7o/OCT=X(<#/nHMKMs+d-gr9]uk(,-4S\"$p7#i)UKT$Obkn7%_9*(\*4^kRo-F)9;[6\r%O<:pI!Z7TSP/Vu#$ZS93a:b;u$n-'"JW,<l;4O@7`f'sb5MCf_nD#(I"[<a]@D@IH&3kKfNa=%CLkL@jOOP?i:C%d@Cr<s:&49@R\r%a[0l"n/'IE$Zp@sOs:%%5R<M\;&J7&*mo[=#dtn-rJ+f#SA5E'$'oH?Z4#>]a+If\DBL@?e<lpr?m2mi5XZEk&YVkeJ&iIh]K*P_\r%PV.O*95ql^$@uV@</<5^W8PUV8VL:*L+"s+*`L%>c@Ec#<.fXm@)a26^n=R"M9sX<!HB"10Z=>7a:l95P-qNE*sr%_j>ftUA>oQc\r%"cm7f3)'-.)2-BY2n4>=)@+5a(sWDT+WEg!$XnQ8(#UD_8VD\(AE#m/6tYEl5RLpZ"+g$R'EYKDr")4$E>O-T+upBhiLjmR&-3.*\r%i<Y2eA6CnV-\LWJYOLZ25`"ng%*gO]0gCn1OIJrYR%cmO)ZbQroCYX/(oLtpXNWe7L_9`;W#3O<%0ZgS6&,=]`+'o\"bWm_E/J(e\r%,iQp.iJ/'n8N>h:+N=0#0SO*pYk96s$7q?Z^l6Hl_Ll`eK`*S]",s'D*c[^>RNX.O+LqYq1([E(N8?f"c5ATd![oHFAeH=2PG&Pc\r%QS=eWN8k0JQl/6o_?!,j@/?YmQ3,rqlj&0H#c@g5Z[@pdD?,YZ^p(r!#Fkp\'i!UO&4[Eh3(tT+DRL)b7<Z,4aT=U;k4eIJ*Q/O'\r%^]S$3>RWDXNT20q!s-+!c)O(L/$[RA&*GcG(?CEQEZc>1+s+P@_e9\qS:tdL!#%/9jO-#S).Z^c9g=MVn5t41I__dGEbJ8`mRJUU\r%q*Q"iR_W6$5C/7!(MJm#F(U%.6\#dhEL?J\(pH>M<BH-qXt`><9hlj`obW5T)#cL-K6-SkqbQbc$3gX3%"CMtGD*KD3,m5![u/Id\r%*<KpYa1)tELZ"[+ZT`o75QRU*i$c(-31D("A:jdM@g4-3Fr`o5Kbkj#qZ/NH!GR-?E%j7>P777aYTT?@OhV2f9B$[!KFo"F!baVn\r%]UrbUN?AcOasDQFQmi?s?l6ia4u@;rJImT+i#,p9KR+-u7&_;m7?RQLg.4m=Q%T]#&GK$[7IVpleIp/PF,"?6ZAKtd)<@Vc;N,Z*\r%&RhI8&qjW3SRKl:M;eLAq*Wus+sk'%!!EiYdG3]./qF2Dkc%)qN.i+`:Op6:CapD3qiOo]#m;*k"1\YIpcq3`\W*<X'uDu:,Yg%W\r%JdV8bfhfHp5,/*F@S#0Wr$&XacA!B[r'KA#pQbs'o8pQ)!:]\1ee2@7:rpe38-l<B@FSb'$9M9)ZrE8-n<j^3&V9?RZl.8CM85p.\r%5UaGk8k/RmbKa!>^BDr=T`c4KEcMUc']U>c&Bm[WAl9J7X!F)%8;oOK/&ogd5N@qFW^s8qElH7m9)!IW2V1`#iVHu04l5L%b-19Z\r%-7`3637nH+MheT^YbV<54?X\KpM2ojH`0k(DCa(q?.2cK,&JpYOkZ"n84M$0<`h'Sf;!at$a!rNDh5jomEYmJ*UWKueRS]\V^!D0\r%5L1O24oOO(Q:i_i-8\(+bD/5Ca@pZ<,a$gcV-4^G*%RtCQs^9F'pJI/qJBnS34)mRGIS%h!>@eeJHV[M$?D`1$ka835nMb(i\(SJ\r%'QSPN<Q#`jnK\"J&>d`)KlmF844QuJq!u6Are2tco1^>t#Tsooh+fpXrns]+ClZ<9-2kUl`fVoCKbjI,c$:<(A2ML1'k/./Latb<\r%5(hXD@cJ+NNc[rs$51CA%b-W^jl2pE,anQ9kk_5[TfC>n+'?Ao'1,P#6?-lL`#fVsLr$``66CftE<.-?s(/=N+$_ggFR\3AQSjEt\r%5u`1+JOYdPJK14)O"2cA1[,,sD=F<H$5tcS'S%=T@]E?haM`2Z"&G9n*QS3AW_/N8"JF2Z?d9u9HNrn"J03=)r!0ZV&nUN?EC*/.\r%I/8lpM'<38rZg*I%%3M:r%A('_Ga_=J2?gX94AMh'^R8_7L$k,+KYa>Ob@7^7A6Xi#%`^-Sj,^3@AnYQQlsKI.3om,>QuncEB%ps\r%KY\%?>R:8daP\LB4ZIBu6"H<A"bdAQ+XutA?"=!sCRjC9*t*c+$cNsONASE6a0"_8X*ru=5i(g^=YN6F\0]&XCpt36KrSuWje"^W\r%mAN)%s/?>=3*EUV*1U<DPSjeiB.gUl>kZbW8ETs$fo,/BLsl"VBX%U<8^k<I#Vcg`mpPF2iVXMM$:]&_X5/M)%LXC:]gptK9r<:-\r%&)$Ut/+NB!BRFq#DBo.H#.__qoQDY^/\g/J5Lm5kn@cQ4<tj5/HOl8?dJ*9A^PD!Fao$mOJ*YJ[j$rNnUD?NnbRu$8rbsVZ2aDf]\r%59/Lpr'Z(-f]>`@gh\Yd62o5_.E<tnK0LBXgju?@;HMEjCMhbti33>2Pbn,]cLU,X^?[$-S*48]r;KNnhQDVYfo&_@rBJKE$=*;O\r%qu(]h5O=e$kFa86FoMm`=.h3]242Z)__$s5C;]EBi3'p]q`d"ak,R7Kg:dHZ\%AS+%j-l78KTni775leD;jqFKm"tmaYmWhfc>M<\r%QV(nu?B$cIB!DOU51CboY,2$a*ERa!)?NA_%:]L[d2q[nd3-_q:Ybe=lMm_,0NC\X)ZPca01K+Rs/]9$9bT\\9Cl,<:&eg`L;OrM\r%G5Lt'n+C5+cOM0])EpiL0b6r4XlfE5k69f*+2l>%_CXN&s7cghj1fjXlkZqD^YK\>,T_P5m0IS;NRD44,?.'EcnX/Cn+FPjfFFGm\r%e/u"?g=gjr9PhV]G=\;*jp_O!F+a<fbCKTigBU(MM6fSFO!^LiG7TDb`hkSOrYj:u93>`V[kgi:C)PRd4o^&JO$$`qIFo$!Bt-+o\r%Diaf=55j:g/4Y&5#SNj"ne(jJ+/U3nnt<t57#fU=caD/>G$+$6UYU69?oPsmA5X]^e+3qd+LO4Go_AYQ)??q#27=`c&eGC%1)M9g\r%ltB:nYb'_>qeLL>e.:,goi@.<q`NL.(15Ppa-;%e!k%:hYh)[Zlbc3"kmT7>mmhoj#h>'=;MEAmOFu8#2q>D$h0u`%rIst:M+5YC\r%&]=cr8==0s5=''Ug=gGT\si+1nPMO;2dfVMSDYU6kTGTh%?+ie-fAAjeF2%2(Gp(SM#",A7"[SUQ6.)iU_.,AgKu1RBCqh04u]#!\r%l2GKRg],BrO!T'd93$9q3REtP^9QO6lBZa8K&9A:Tnc!l8LtGdl0,&$B"aQ/6n`/RYG=,q%lZ9to+Q>B";p6dT-gP#5'>M]H%hem\r%D-4QH2dd9bB$8)D(6ln@4hV\lL<tp(Kt3'iMYANC@G>b<b0[1roWBe.6I\FB`=#Nja-Y0dYi=3YH6^#@Dm:oGepVkl)JotB*C$in\r%h"<)`Zq$#u]a$(jk""0(G)*6C74>l]FZlB6d!LT'MApYF5m;TueeF>il\2!uC*%&%D>G^aL.6%i$[DVV^W;V`;l0D#Z/A%(*GscN\r%^su@*j4B?;(C+3m@^[3>pV=.3D-u(=YaB9X.UdJt+#$V?J3%=a_PB6(@uG0Ho4nJi"jmEte#S$VZ&mbHiMP?*f4_dIX3s*&)`[h@\r%#VX%2?p;uhFbsS(455g0L\7^Ud'nJ466fh*d$=cNnH@Hr\YTp+`$7Qb1Jk:n<j4/%_4mgND"VogM5H=Z.ZOm1C[N(%SmDlZ5Tt-g\r%7o#Sb$#Y(9VmafDaPf^/dLoH!NODk*0TD?OE8%bGlF\_"\QDm+1X3dGRU7Nrk-"=83b*Phi-[lJle>+!F77/\^PB<9Fp<;5hL1qO\r%*KJ-9,beaCKeB]`2kDT(O,5-+dVo:4f5*<NT4t_KTaB"$7A6AMDg)h$IF>>1SbIFmp+G8*4KXV;l](&8>G7A7d$cCefK;L*q3'U[\r%GK3s(BZtP"Trj,d%B[TS@nJf@a*?6r5kmTQF/Q+[nS7M5/iMJSRWm&_lJ?f[lNB"nVf!830CTFtTs$^[d6p'1q4EXj]9Q&B1m-m'\r%:8BHVg'uU`LuLH&Ik'iQ0V_<]45B8:THNJP7&f7HQ;B@iM!]B.4V*ib/gLpmJ'O<@(,]>QfQ1UOJ9n+p.kZf\BuRRh<W8;W!b2>M\r%S[\":hiIWLOb:M^W.2(]n*>rLL]/+XORE=W]bXib0&Hni`M8htd]j`5?rt)1CcGVqC28onO*XF3X;C@o1LLS\+m>`"h0oAf.AVs_\r%^Ub7jCUTX-JZ:Q_%&'U8/'TV]L?E5*lJW])qm"Ds4'Mb^Ib'eT%0_N?iT`!`mYD4BBe+?rZ4%.LgHX6pRX_Kn<7:,$O<AcL61/?K\r%'n'898fJs3p=XR122\=U^$F#<97!A77DA"i4j(Wb$nX(!C9Z@]IL+GR.]gLQHktI,YWHIpP\f[Qd(A/Oguh?:LCHP@Z/MpkW1];j\r%Ki7'^P4>>L^uL%'Gc)J7rAp-K*-klD<krh&q)$`YSUtKeJLKJTZ%):b"$:I.+B'6Eqg[n;gY"6%9SdMb#&Y-&L!#&\=AYD<USDYg\r%<+iEI>*;a(3RD#l=HYO(+Wr3!F#uCcF3oZl\*+MuBe+;t,Y.0:3u.X$)Jp7B5?4EuC,8uZe0G@Slt6]T]hZsUG8qH'V%$&AcDB%F\r%[>H>@ZF(pBaL9bBqV8"T\XmseHLRsG$@,m+#)aJO-EGOIL.>U@aW#fk>cG28?nf3g3L8bA%s,oC4WJ</6Ad)Dl8\a<jLcDP!Mq:`\r%Z?bG=[S^WV1g"Z#.eOKjYYuE#C+qb`Wl-4XWR"fr,sA=6U*W.5p'K>:;Hu;sYZQ&4Z6pu:O32^4,p'E-+^=.,Q!/>*'`L`?2[\5g\r%AS-k^q8c;a(@&#Fo@X>$hN^^]%\%=O[+aq;OM.d)DRjo?Z`]a4-lS6](GJ4R\M^O"h3ZaldV?E1BjRT,7KX8lqA!(J2![\mce3'I\r%f^/^?LQuW5_RA2.[c?c<nVBf<\K:0f4Z6f1ff&eE<!-!I[TSPea$QZ%Y[9M-+;B6P!sc'Z$gZBXoSa_cWgtT(6GY2ie.<[!@0t`=\r%Xj=0&IG>U7+5CGE>5+hVgVRtLRB-hY]YSHoAS/;nB.!))3RSU5hA$[2^eLX$@]LfaLB3[diO+aN$Ns.Ps"=22S[eX\AG"F<9ZGkW\r%?#j#_I6("V=uC-,7cf&E;J]BtZ,!</RDfhlXOh6WS9.aO5(`d4Cu,euSdPA]7kYm-o!hWAF`dqBZCe]@V!3ue#0ci+O+lt-B??24\r%jh<9#1DLs0h<+<%WfusrPrf_iMtE1;H+oW(m(>tmenmG.m=jM$B0jDW^VA;0fl?JP8hZ?cLWDG<h.NV7'6YX]GADAP<Bl\P)r!MC\r%#I(ka]M;ebi03gi>8ie9Bi!s1S8*CE.u&faH?de>_B3sQ+?'Qam?q\H/K.8b#cfJ(l[F%(1UaoCAoqu=\n0>I3Z-4bphAm5NN6!T\r%B?]h>WU7q-*gs^-LZsNS`obsc?4NrLg\M6PG9isF.A=)0d;CV*=q,:@=1f=A;9P=$N1t^30p10"8sjB8_0CiiCjFV9@\[`alCRJU\r%,I<>i#5Z;REP'7S8h[-_Or;)GeWS.@@]'$m3um#V]p,*[;hE/n?X9r)n2Z*p9g(m&Z*Jl\,tOp?WoTS\-^uV7VaPk!+?cf?G)''^\r%ehbj^5!!<#)dH0CfF&!=]HSi(M9b,L)bU5(fp0Y!fMAdL>_Qm`ETc0r@e_0S!iGkQG9mk^2kI^N`*#.qnQ9o.EVkVMaYO@he^Hgm\r%(XOR9jr*@h$t/dR$T8n,cu23;3r=Y"SK7*8!ot$j0h?Gm+0Ot_=8C(f[*>*fqfg:e1&I8-Ff'e>WaQsu;B;8-g.tSZ7h`CFplp,M\r%^H(d-@]]:E9OHraZ-^A"/TM2F>\D+Eg^qR@OJNu#KIM5nBF%Me=`SGJX.'S]Pk3#aG'Xs\eF%7:L-i`0Q3>?O\m=QCpf/fdj+3-M\r%cH1o?/0q'u6s]>84eH"fBn&,[!IkIU)+,c;p=IE"B5^Idb59)U-mb;radlB._q"g;lMs0Cl(+ZHE]USEUV,EoEFbqWlRCH[a.1i1\r%G3ej_)Y#6%#U9gc(tCt<Xc+E=Mg=1NE2H[Kg!U*o1NT0cBW1m?XJG-bkup8,/r0@,V*E1:L<E*J4CrV282&'Z]g/(B=6!*@@`K1L\r%n=[)f/k5MM@;Zs6Y*q*/@0llmEkag"<n_Ek5.UEANNjQ8]:sj\M+")7h0PTZm:IX9QCd7DmP'o`_Pj3(Lij#9Em"L.X6,;+T?:E:\r%P8E/t#]S<lFVa[h_e#kH?I&CZEI49#0X__<<2[0r,eKT[S^3"Y%m!A-jj1X0in3>IlWZJi,pNpckD+"o0`SM#*M<_ETGbddIC<.,\r%H]6]WXi8:/DV(\B_#;pf<,:dkVCIYoQ-LRoiS=+8A;@JA1Y'e]Fqc^%f'GA-HTd5eXaL,m@@3ct!2$kAJLM?#9<PSSLY(]ZO[aH%\r%'*Q_"3p5o>i]rCGHSD]HbcX@(,gb(@gRVS\B!^V2%a>!CFL%0(d?BXQJdul;Nb.3T1!MefUa<]&qn5g-cbfUU68p]5+PH/ZW(+&C\r%_YUH[.DfgRkAZ4P21lW!eKk'W!%*`FrM+i&#'8NT2uIS#S`TVfVBu'JISE2-QpE[*Y@P8&2rW:H\sr.2"+Ns"Uf&pCSdKeL/c>!M\r%PClS=^aI%^n:rRP<>md,($I?b_#B?c,^JMcr#JYa"EMsV/0Q(M=9+m+_[7A11LS9<PYMJ_(.H/p?4[FBL`jl]SYE<h`$!%mYqXQg\r%;0Wfbj$jS+dhjj\89$MD2L,nAOZ`GG@\U+5b"J\5<jNtqC=$*/MI>k'_@gOW@3@QNM^+6O-%&.Wpmqip%m%n=/e`7PVlCAaAb:g$\r%("9/OQ*E&H_pDd,Y]5pMQ!c(>Rq9U6.',Ba;D`GSEQ!Pc_o?gZTh8pscGGJn/f>uhPK5J8Rq$=k_S,05Uf1;I_RpObb`Pp>K%6U8\r%:_G4FW=n;QD",`&0iDU7GpGmJ<i`/f4K-sA&in<&PTrsc+m/jQd.jScR2I3&0G9<6*?ZD-A-d8+d3hE]r(&9BlQ$'4r^!c.0:Z4B\r%>2r0XUm74),[dE/h9%4>`3?et;QpklJ4tQ<;O!XjR[.(TD;T=[U]-"aQ0UUJ\PVECMp_o/<ZnN-`9i($_nppq?U+m?M+TQT$jr:m\r%R^@Xqcge)=9i9<9C-G)1c"0iZ*"U,E$3ZnGZnD6TSB!c&A1KU2!HBdW[o'05C>YlAqpI7_Wqu)&<u:[CfWsInMO$UX^6fC&c^iB]\r%4d0d!*/;_@Q:HN-'e%;CN^kQk2Q5itY*G_fb,oK*l[5$DO9ubMV,ZQj$1_VmZTH@CYcEhnD!G(Jdi`JAGkp(0X'Rld<t6pri+`Kf\r%N2#`dUIo^bgpMR:`\U/TF.X<sh^3=&Z[+@%=:4:DiaPH_:cL;/_L>&+o@]3%\'42koL6enb66n8:(52hnP2r`i>OK7&b7/)NGU=p\r%!\%O!/@#5Ob(=a+lN)k/`8e@93bT._GEAcRD4.Bh1#n`LiXo3ma)X5@7HVDP]m6:_#(B7IK16H0+*:,Bi8R%fZ$Fn[7>rW0("NLt\r%kJ@@8'GmFJ&G#k]lsI\EGWr-<^jq0Br;0\BS1Qj$@o/3KE'IY7e>-WE#02Xt87?<ca*%:9b`;-s"lQ<M=kkaU0f'A@W\=X1)9;Cg\r%Zd+iu'pX:93DK>)lL9g<_TNLkrKu@+HO`o*C,t*d,f*S(Qa^d^IsA>rR^_[%53j&+(Be5T>Q*(Lcu8][Q2X7OOelh'psU5H,r9s(\r%6sPScgDad.4YP0T\!!?7>TgFmN.j82JL`=UkrBeD#T*8i!.SOh>kh_=\V8I\&lq(Z`@'./[<lL@V-EK>h0>ElRkFZ]FjQhFdE83r\r%P`Jb\1$s:e>o8"j]u7C)o$.e93^=U>gCO&bRbS`c!.O9H\iV#\LRZ)YJmMbt5bbU.]kt!&14!U)MAF>'i5-<O*uZ6#c5lih3f#?b\r%q3N?-\1)`Kmjqb[crn5Dr-GGT0c8fR_p)LB0o`N+&?dL^cX/n3VQAI"@+7A%HUWn/ffK5#S9He*d<mkIKY%kX4m+7_%9:,uCfN<=\r%e((oVOseULJh/"LhU^&;N8/m+q%2("NVQS/>oEjckLk6cB3F+Z1s*kg2Y'R4YO>;Z4-mED2U6Wqqfi[,Gs&dA-U8A-8j$tnl2#sU\r%!hsT"E\8_"(.Bdjm[u"kB%(B@)7fd;7E<CH,T1mKMb,WES#P5]I@UO1m$R[4/0`fBfZgksgHhCE*ru7&7C/a`]o(5EdSp[Ci,<kK\r%d]"+<m]#WKg&Zcm`ghDIYBnlA-Tfm^Epe);O:!=5cac>OiK0j.m)nD-1'\:HCnu6ggMX#i9u:T]p7*l[ZR<5Rn0-=qq0J1VCM4,5\r%Id[Dc&Z%E[3/[T``DiBN6$^#a^I>%aBr?48Es\'n0dJu%"s`(.eC>]Wl>J"UXOq[%^B#(%I&piWo]5E*YX<F;lW6`h5_>'#OQB\B\r%HEm+'J\B:"a@)j'R#Gq"f]gc8G#0ib,o(0tSViD'PK7^qs#b/hjN789:UYX_7*\`%/<-JB+]HIC]0BrM8A2Q!$57]P'.ZDq-fTc6\r%B/"&*[8a2jr&h@rdk3G7f658,hEmDbj?k)3S*Af!fceJW(Fh<^4D.<><[/Wpa7gs=Il/*/nF/C.p@:p8>^XZ^fd)qbU)+YMKoB'V\r%WH!)jl34--`g["nd**r#6<PBU2BJuod65MiB$2.#mT?X\HeKHPh@+%jNn)q1^R;0?0L")]me('S5\lIZngs-KrNt%VZUAO\i]5QR\r%=:Id?E`:u><nUJ&eh!h['B[$C-l>M&Pg?.O+@Sti*e5?U\iW3,c&gmB4AY'".4X,AKEL]-,oC1HYLis^!ZI@s%aW;RiR9SZKlssc\r%o40DW\HfB[Z1;+18;tu<gV00f4<![GnX"c#dn&.KmtckWqZ;,4QYo+bO^!b,*LU0MBNU")SRArn_?<JaVm&E1JqXWBH,jE)T;k"_\r%6W'cOb3^lE>__(oB,6"R47Mh6q*a_eN"]O4:P5C0b!3RI*3SUNrK/+UbDU2o3O=C>n(Ur.[9+<oEi?o_JG.rs]Z=s0pQDXX@Ql,=\r%_jbL=5)5-bq+.Msj:loY#G/]j,NJT!,#)6!_/+s7=AJe?U>Z*Xl*[0;ok#^#@g72$is?E@*u^49UjrCKFM@&'%8Jhd9%Z4M:Da<m\r%LNj'Qn0TD)9/u;KVRWE_e1::[.VUnlqSijcR^\WLWUTQAes+K=C@/ZF'*->>IPaV/l)0%c(YLVNHkI&CoF*BA[8!&'ppZWLH+XX?\r%?=5!n!A5/&J4;QYFH2dOWIR-[Qa?/W4m5EjWNc:^pCksTR(/_X`Eq9K2!u3)A4^1;ndq,2Q.1+`GD[mu[@)orSu_Wc%A.!TIn!37\r%TW[c8h(H>S/;7C9fZX18C:pb4HU.I"1J1*_1J4#^PK@"Z>G&o'<gt5flb(^*-:&OaY^fUq\NgZEUSI=Ob<CM&bBMs.MO,H'n9i`&\r%'FOUK)\\"oc#B2^<siB@P*)k)?VKt+,1Z+"`_<drPK$1?BafEG18SN$o?#6L+hjUUmYMcT7@Ws>WdVCp:BO4.Rk64)3tSjK9>KM<\r%beMa\@H@oj*f7:T`+m2i8RC4X:([i:I=kdS?1aY$f<O3,EqF_#QsRA*U&`HkQmhjA\U=IHSr'&n98JGeh8r2r5T.<;,o3&D+QY63\r%EY02"c]>3q+`BM[7d7]3%4WApBo?_He7<8(!>"J?/^b^_NF]ISD!nW@]0-ZHK9hnf7]?R)7&a%$D_2j:T$%A#NLqQ$<OiO(9k1Z0\r%+ga=TWp+m5&TY+o`9t-_f_\=fKpZC7Y[[\?b+KEYII/-In#uL!g).Xj9Rd\E;LF]E\UQTb)*(gso4JUS*phRbF^lWiQ$kdp[da-R\r%HC;IX-U8V4-P^oL[Gg^"QW,Vk@mtp$+@)h+2VU9Oh,f!':gphggBKo0=/$e"43)t.>:K;1Z_Q0R;,A+Pq;28s7#s:BID#?r8AB&m\r%H8iJq%#V)p1&n]NH1FP]W,qkjN^OP7nM"3VciBb"l'[8kJ*oY^.F`XbofK/Mlm-888\>l.\2^,"7qot=Yq!j=?0Ej'&S,MM*;dsX\r%)Tb^L[QCROQNg%P'+;:TK+'oh3bQ/-'dIaogs`ctj-M,jP;\fum6$>%F=QAA)W=jj!P'd-Z,RI-Gq]$bfg?*0Q>D/3_rf)'=/d*o\r%T,gFJ*fYHt"@YXs!ZYJBcl!002]-JS&oAQ95tBc:r7E]dSVXp)HbEouV9I*M0%F-,hoWg7@kKC%To@I/=>f:0V*Vdji_*^"('tAe\r%hNo+A=Q7e4cLr>L/MPol`PUZijrO7gIekH`SlZE6:)F3Gglj[ZgLfs[Ucp`Q79;\%La?q]'Q;_"d%4_-?"<(#1\K%a[pXAU2`Ft/\r%CtUN9MatQ>hI'mgF.>Q?+`F>X&IE<g0sIpqokC_SNn6E1=uqgP^Lgc"3WrN>4,&<2o9u[A3C8>ki>)DtDK%;DL?_4%'.2MrB`?94\r%NC_(+e*5rEP-B@.k<1Vhk&'UeGNaioT"p(3Ut2/"+5G[Lch:t3-LoQ"_#ZsHFLNTUs/:loK)E*D[hUIiifYsQ5_4#qp1DK#;c)9@\r%@W0O$qX,N^7<"=FYeMfM<iGdPR'4Jh<k<WW1A^8rUcKCY%9/lc:gs5`FD@?bjTXc`.YKr"9h'JRBkgZ5@+jD4LP'of]h%uZ@_c>-\r%L1(#*@UQuAWG!o&/Q=[GFsO9-)X`c!Gr?g-T#W3@BCM^Fe('O<LF;h#^hXPAUsiFXApCb8q;QE)5-o^EB8+3Ld#`6VTI*bZ6+VQt\r%0>NiO$V('/"M^l&GUm#7SJHdbVD9e2CLm#fq@fS@f1[tL?<0`c!9fs++_Z?@^#r6GH7P4l!0AaR$uQ^]9YY-]:_=`qb+&\`"a.uT\r%dH#2IX]Oi)FLtk>K_m:+e`jUNa#@cr6U@heGhQe"!8XoiE>>i'G9c]?bWOfD[GCkfhTjS_J:h$%fF%B3YepYIqC8TO5_jm?`d0?Y\r%I#6;^\,/=]8L5SN#We),)NIlg/J.Tig9Z1-_oT>o\T8unKC-6Gn#Q)Q,7aL+j)TLj`Hi57VZbCGWW)a\L+\VA.[bg5V\4oSp3N--\r%=p!JII@_Gi<GLl('Ed7iLp0@F+]-O%4QH-4P8D;3YQYKeY'^jK5]s0T$C(dB_.J.VTQ!@'j($E(,q^)t`0!WhSd6,cF\WhbR^pX1\r%W]V1sNELtW-Y?NtY+beB$@/k\RPV^s-$)78'Wg3n1-fCgHG^^I1E3;9q)CBV[e+1L@u=8hDBJ^Odd,Gt"neYmZf:E2:NAJAa5(Wd\r%?i_8[`!HsS9f4oJ60lqGnLj)?1G(d55d;bRr>j9O6Ke$X@hmWff9l^=keZ*OrH+iJ@=NSG5H(<Irf?;WV;K\8i"Vtgkge)kGT2un\r%5^V#04*XIjGdnEW]Qt\P8/M3[U"bUKrjb5V2o$!t?n.-QRm9Y$1ahdP['LLY:&IV![iTY7hnK5MK.f7dF9Wug%%UKelPDChm8%uP\r%'JLI[<L=*)3t/!JgX7R0OKej=VI-2Z?mQ&nnTla*1Y_.)X#YP>VcVOt+o;7m#M[p$A%i$--G:LDVMA`47F)`aa$La`CI\j*-K517\r%'b+I802ucqpkelF^H3D5Tp6@4W)KD6bcr#j#<FeRA7LfAkH3.-#*42ZQm9\KVFi4pE&VsKZR+turX>0YpO+1"Q2'B,/rJcEEa?4A\r%W/mG\C20dV+Hj"%>?1$[i9\j*!)Q-*rd6eMmtd3JiZ?F5>l#:/Y;JBX%_5CX2u@dN5II=$m6(p$afPa\jm7aajl;;sJDeDeX=<WM\r%5al/C/`G)`i(#+?b4(Z<lgV0@#:GQ^:g)FPlNf;EM@`E4(@;_#KKjK`"U8Qm(ikCNURZch4=1\/elOMZUNtS!NMkOkR]/nID[hHg\r%^#*3,'O/[M4h2*Lo!Oh!6M8C:'\2o,rUlMni-<Qd$r3;>@'GuW3_Ll'c.2h,rWda(i5oiBKRjZr/c=<o;8('QI'>HD+(M72:6#[;\r%+6sVI%jnp%:C$Z&Z_=S5pHbbe^IHW&1_GW%^oqmXET_$IJR8ZGCF[gZ2W05D#\h=WTuP+iHud0af8e-SY^'/bnC\*e)-[9fr0@>T\r%gpce@>\:G1pu#5lBJAahH$8+u#=DSaRF1^AI_CA@4h:=*V]C5Z_4P[#NDKFUoG*?3$ofJa9At1\1[`6^,+ls$1tV3kNVQ]MORa%7\r%)^gdAGoE[-kK]7:V4BT-[CqpmRj68CR:E[G+C:2OO>%!N0F!4!8sp)d4Bj"EGh2d4n\9:QemEo02s+uJA<CGkE,ka$=l<Y_@]6rO\r%0rmG"r/(5HFOe#-U+mOZS6^'s7rUE^\I=4,X1X%Vk;09C0`na]IfibE/V.+5=\H?Z^'PB)[pH.tIXGn,>/M:p3p/:&+?t&<jR^oe\r%:!DWXlh\G#8AC8Tl$6h':4>CPdNVU&W7HNj6+WfL&$9o_]3o[#a7?&f8QH$,o2gm\Ej[A$pInDd>W%"(''@*iYJ5JVElHs/m'd\<\r%$rr=l8<(`1YHq'KQ\6/=(o)+Ij*Vb.JFHRYXoPkW`pP,-e=rdFZ(C:Yh1ntkd52&rr,AJqiT;p!qq9n[jlD"a07oMh&^W/cK@@`j\r%/;'OplW!ahR(C^+HsB3N>7\[Mosppa(F#?OeIkcF1:mAkg$i>QP6:Cn9YS?k?lTqH%#4+s!8-Wr@kc]&pQ//qX"/t3B/DSc+$L.Z\r%8D&c8*9e3F?tZRS#JZ\tp3"IV(O>IP\<8qo,QocGTPYXL#,ARB0ppbL>D!f;oaMZD9O2GH*X&oiMtdYaqp"-Ri5i=X#%o7I27T*p\r%[)(RHm2A)?\IX>%mr91lP?H]!?T+>WCe'HnKP>?_&;N?q&@BI"#1@@72,Mr[edtI)#X^Qn-lO:RL0$`a0E<"H`3&cu+d"2)%6*,<\r%`/n54/jh\ZbSi7_VDglf\htGtNR+DoB\C$89(e1c;"5N'L+7%c1Ygis*/935//aoTeBH8leH1Ies21D$Hh]95*nKbLiTVpX"hhQ2\r%geigXk2OALh?gb&rGJZQ(d;c[L@Hrp2,)WohCuG8MhYg(n^F_FHOGSS_>U9?n&C8T6]!uD9q-7LBMFtt7f2i:cKNF+pl1l9jk].(\r%d8;->eWr7S1&)>0)ah(m].k4,]bhD@3bD''+$YaQBrc*p^K(EU;QmG]<aU`,@sqGe(gDp\b':DaG)VK25j'H$0H/j&L,WUl$$mX_\r%9=Stb#7)kTS"=WK#aIY.HeTQT1:FZ(P;R;82*#:IH]t@%(/5Y9(bu8sKZb'5dQ:Co4ZYJI>9?Y<lts:N.^o;$;tYS\2`4p1!E8/+\r%mP-kn*&^_K]J5l=#/)mR-LIYo"0[+9/>cDt1H"R$WJT;1^DWMXm``W9H7_h8rb1E2*&QG&c/G"u:NN890pjb"b[rI?.?D%%\dt66\r%mTnUqmu8%*0>;>A9Lhe&k&ILY2:(0(#P2P7n6-7J6X49/=<DF](>$Cr@_lsHQ%e"k>aF$E2.9)Ra)+IXg72>]Q+4`[VS#LDUN-<A\r%H!SWY/]3VeC&*"#DcepX_:!'8dK-Cc5&=E9f&amiTSu``Uk([5PI$KZB<`5nDT,e+R'3S3X#k3IC)6YHg-5sI-_oV+Fd9Z7=q;[p\r%^!4.#pXhSQhh*N-m<NQrB(X'.Y,h`6;S>6#2-pnS[elJ@@s^@4CUPtnkcue@V)R.XT"G+'c^'A+m+uaW_+oa,Lct_Lg=p]Ek_$PQ\r%]V<*GC0U'Y0D*%D/8qQ^7G:PkpZ[R_@7uXc%U[6+E)>)"_K#1Yo/[5Nfq"nsSIZ_OjikEuI;PoBAr.#]`UUJE"eCtGVp">45+A'Q\r%0Dk"H.0eq[,%2NQS(9IaHsD_=Sc&`jige>@cd)LcmFgT?9R8<R[!m'bMoNI]qsGQ<DVa!"lb<(sFj\4"`V!(9H!Pc,Mpbb`p,>q(\r%NTWsDm[.Ycm*>"h1O"8O1V"TS%Dk8Q-Z\WdIt$i@Xu^Wba-(CeW/)h_8_njPHRasDg=$MF&>&W_qjM0cD,!0KackWJ8jCq?Up[u,\r%-Dqg0Mmq-Bhg;ucR+Y,6mY]jiH+!,Zb='S;BsmfOd*NL!AIc[\?Tk\BHr"tJ=!'-7T^T5Wg@s@hWL0<f1X5kW5s"Hfmi*U'GETZ6\r%pR=Rt^B4@CQBJq]ZXDFf_hZ4cN[\#'rAEqZ:#T1rbH.sKZ-gNBT<f5la)*FkZ-Frj9'5dYIrK]Api+`[nB\,V7Q@^@'gW$DmmJMt\r%IRc5nFID?Hbt6oi3XGtKpN=6r'(G9EY!>*==TdbUQSJ!f2"(OA8+S@;,L!cmC[Ts__tTBM=NG#(_)l#[&KH$Brns^/8Wcb\qM#De\r%mmT"(p9i";X8PN](\S%.)1JqjcBeN&KcNMdb::/**iNrXT2WYpg.C[d0XfKrpRt]o\-Z.jks4G]&\SXu.`maUWLh&Gpo)UHVlecL\r%\=&i+_XA^*R.$`945ubn2C"?sd/\RF9d0'eRVj=U:->S`7*V"93Z?'Ro$M:)[Yo=7]kVY6?a`Dt[/W>P\!quSAEIA;CJ4u0(`dpB\r%`'24;mr?[u@j[dd%NY(DH9-ksFj63HVApiomQtKSLhHUu`,3Ir9"[=;JG'YGfuA?unRUc@M;)n9VS9#fDWn_pHaDPTiM<Y`n0M!I\r%@8"&r(.3,PS8V;[fA8VYd*K$tDYQ1_h,!IZW=Kq2:"s.KO*%mW=JdSfs#0hE/st(VmD,R)AA#BH,*TmEM+i9205&<'68r\/3"3,m\r%rH=MZf=g$Wms^_JDVf0rSBmXkjjG<M,Brlk8EFI/j^[.js09a;IFE07Fu6tWpZq]^_%:V)$UISP[8:o!JmJdIbFho2F?-cuJ%1Xj\r%AfKKMnR7kZ'UR+aUu^rC&uCi1nPQlE*b7kbiPN%i38h:-`5q!h[l`&FH.j8b.e``1XqH51m8cK_('abY[]eCPgW+(,%8Z:@e[@'k\r%XA6CR+#O:8kggBQFJdX"S)Lc9FOY9qU*e@D'Ua<^]apQLDjR_qCu&==8*ei05@/gt*o-G7gt^JrVmNF#\p6:mhY+/MVP,q41dh)H\r%YuqUl/NQOGllmH%]<C13h%1Z-WuLWc[$J1FjgK)<]k\F3Xa^/TmauUi`YV](e@CEY)A.>01YIidGKrM+FI.HZ7.-Z#al_Ef':j?"\r%YApXJRjMn+Yr28qmmsni3m2qd1;:AM$<`>^gMnG35Se\g%s=4%qCn>h#*5p21\I.&h=Vk:cZnZq5gRGGO_OLNWT0#?T9_K-obe_;\r%SBhpZo(kIrm3c3[nU]XFA!oKn]_".>StY>Tl7BX4D5?($CUU:WF_="R#&)HW=uSR'?Y>Vpm`g*&Q[:791$WWF0Qk&j!i<e]AqeLe\r%?_@&pg0EpXco9)74oLU][-9rWdHjA-NCLZElo+]EB>6;0h<qm9bFlPdSd4RRM&qiJaiCVGn8F**m^$C;./SXl7f4\u>%FA00i@ig\r%N9g3KL[fb^,UNXhPU?(3okcJAXUS4'\Va-$^1DN"QuBI?^l'EuCYhLOB<0c:a?Di0`h;tOIW6r(2Nq$d*k!\Uo56HTc$(6KH4e=X\r%6]8te2Hh"@QAK0.em9t9nU,UnZ\NCuS.0gJ%=J0Mg.ckelZ/,t?VgQUfEV*%9q+WLm<u<a)9P"`BBVJjr4F]1`iXg]Nj_MtYIf4(\r%;MC[Z1(GBhVWCV;@9:iFcY<b;+IkPGf2PkA&>/DC3V-lNYGC>KV+Q%b^`;_L:P%3&q(ojt6N,uMDNoY$jRMO@iPGTd>!dIg%!PF$\r%((A-ra;3S;R`Fg1)3"0I-D!hYVI/_AS,.I5Ja9&*Lh2:S,3Vf$]m?pE%Ba?Yj>Y[b\*nrFs+@:O-f7Kb2Eckt=[)($kR[ha%.k@l\r%_*)W.e>badZ1l&IjH]V4Ba_Rh5Bi_@[?A8;1[?QgSC-\%^>2Dlf5Z/]iqps(k91NJ<Z$peY++[I5`Dqg,'?r#a@Q*>m=>P'?39Ns\r%W-XB#gRo_MBEiYTY(h,%ZEh([j9)Z!j=[(B[cXZ\rp6?]&@/'JqN,dKWqY1=aj:O*%[gKa)n[o'3iUXM]VCUJG+&Z>D\jti/E-=u\r%+jMjIS&?Ma7P1-Yb2,ge2d".jFtBc_%*65j\`\/Qc,q<GYt/E"/ePI_ksCf6gmd&=Z4c"?6H.Tj2nseKFE?3'-U1GV@j`?o`<R#n\r%csF^TOk;X&)[$eqi9'f]epBsEV5T`i8+LYP2=f>\_h.8oOKrK=)[D+:F4/qq%urf2,,n@JgMJ&pK3Kc`3_QboCR^aSR(krM*IB<-\r%F8'R#C!qt[=ZZ$;jE;KuFTBJMOrs:C6q"ma[ka^a.)561YNr`aClY#<W8]j;:<+)fOe;^/pADOiQ`,XYecm#ZG=+W6TgBmo)>sPB\r%*=bpG5A#s<IG+=/02;7;$e/rG;L8#1:3@=D\(b!UD,mi>E`OVkj?&>=m+WOmfueH;Zg:!flm6&X,>PeSmVM<[8"nDie5"a>F7Pk+\r%*&"H35%-q'C0reu:d,(WGFM$$Y#Bg6>tHMf8t*u)XWoIM.F?6rnG):pO)NdY!]Cf&0e6:Rlc=6Q.,l79n`!?$c9(;*Uu9Nt5Bj3Z\r%qsDQM;2(Q1:UOqe,b>g>"*EgJ96JshqU98Y%@^)U'U098gL,!r[R&`lFS`H59ii?h:6RM+jis0/Vlr&J/^u6Ar(#S[:5``$*ds1>\r%1hPt=9[cj3^=-]6On^adX--4D0<eY^F:h*cN>7kEoB%K)QgZd#pup%ZrO9)')Y4Wbgfi][i5]BJlHf3NH%f!bP@_J.AX#6Pr<;qB\r%=4/OR0<?Vu;mqgZHB]06hW2CZ4+6bR-/uVK%E)E>k$I3GUJ@Fjr[R$G+:?`l&N^kGEO7&sZj-i,qE<8h<hH!tKhb2Q2':sf-(TWo\r%\8JYPR^3frn$M^)8UbJo>I'g.UGbHDe&nU`piR@+Ys*O4m5Ket^=,\oFSl!sYfh4D[B1d=:/NZ\\*[o$]s#q"_;DA2@e-'j$-QU<\r%)2l[^\q(A)'Z\pU.iA"QS_!c62jLIlVmSq\mBtX5$(Z\=>NiLsT9g6RrHJ_\o*V&&K`&O>_B[t&m0AH4bBc-9aH#qqjB3pT]!\nN\r%#),eon,0`LZ7L*TcLp3<`3%'n8G5/+cmdq=:7B'>ou;1/-QJ:@j*7TP:=L_19A#0C,DBd5]fRGffPNr1<^?B=PB6Sr:YP&ND2klm\r%mVc?nOW%QiB*Zn"q@P6o-mj+kmd9Ep@=Xmq:VBZJ_i6L-8NMQ@<[?/Y%9E!i*21[;h?7_a=@8H#REBNIk3\K&Y@+8Bkt&:_d@.E!\r%1a*=h_2ej@Bl5+h0@7nIJ;rmBH\[HX,PmB^Au^)gI9f>WY<FkLAQS:LMIOE$^\D\,.,@#iXuC,r\-d=cF_04<B(RgP,Zi)!p=@W2\r%f6?hJo_N<;Hr.IJ2+iuI`N(0;fm4I;8gFVD:[(rMinZ'=qD;$]>'6rbE4N#?@c2RI5)q,L>rN8i7>7e9U9tiMgG)dM[a22=hE0=?\r%qS>a>N#<kglhtjNV0KD;Fj7CQ=77_hT0]u5,-h$3Ca?0.pUfOP1+Q]0fJb]W\Z;gMk$:+*<4mQ<cR3%aXo`#gUHul"ANZ'!:mRJ[\r%Yj/]u8lr,!C[&g;GVthfogd.;Z^1,#,GoR,b(,s%&V[:%U-BH<Eat-^UXE:JFEO%a)tnTt)jB(5GqV-Uii<*(M_0'[ELH>V1[mY`\r%?=kt[^eGWEGTpBLIg@ncW5V":*)S-]Fq;^_po^1QF=d1-8O3>]+@g@B/["_lGC/u:P7;dt"DL<M$pMAB%.7rt?>"i8n(J!?gTY1l\r%5<BAE;Zdlq4Cdk[hL_[W4=U[[-`JH?%KX:"/l81CkNEK#R)b%&\@Ss^b.m=Nk[\df)%j#;BAj&-?)H3+=(%mP_M0Q:'_SgU:lPXK\r%lSuoX@LKn:'K+jMKiU+/;cl/7>0H(Fgbp&Mka-=<:GVC.`VU-EM-#UOh.9o2GScrG[G>m[49Xjh\&B;Cm)YT)>cYPVDTt2l.5;'B\r%0nD?P>:Ql_W\TVZHNJ8]4sTCYbd"M&]HX(gBA%WZeKR(O]`f_+kq'.,'ai\cT"Rg4rH[Rf;4'`#WIK[Vi"D!5'In8oQ+.G]UKmsV\r%:]T>-.[#BrXg6[GBcr-[U2t\c*hOaS5VKF]HH"H\@W,HFJjn.6M$4qj)Mi6SPHmc4`#`-OLk0C04C:g>/]+hq(i(+F5tfZ>*HAlC\r%("lMR_2-Fm(.G]P\Y\F-6.UC.IqXPSd9php0"_@bB(Z1q5JbbS#="C4C=>qtB);h?Jsg[?LYbuN]=A0]*S;YpCgpPCmS*-TT^=\8\r%g'beVT*r&SHsM"ZpiIhQLFjGnlr\g=cK7"%,c/<"-Sb?9k2u\+"(D_&?.<:a<]@mS%s=t^>+tOSds`kH1-m>D41DEu*I6Q1qB22b\r%X:lQMDupPa0JT_^/>L^f)bPbkG7BXn=tTa5gVJ`6MnFNt,,3/uAD;q?L)!ZZdLfmL@?r!$g,C$`/c;4V)?F%XYp2Nbeq/mfYaR%l\r%-LQ.CEt`74k:*FLGOQG_$i@tM6c7Q]("goc/iV5&p7d]7/?349SKFh&<EIC8FV\Sj2tgKFDQG31Kn!2neA;R:faJMU?kiKm,!ZH6\r%e%hJKUEZF-NE0N*D)_G,**#RTGT^OF%2.ml3=@@.m\R3f<pU`GVEaWJ@W6K(aX<I5=m^%ef^TLNje0SEr]lfqJ'NiXNuLO"K:1/A\r%F)6i`Am=dLk&_@rp>.Ek(5g>0ePYWN:HsQVhiOCf$QJf%$UYCtB9Bd0ge1*di8DTkDLBEW4hA,hgfJO5JoOt^R<.pq$X)S,N\OhE\r%*)&8I*-=FOVMH2i@40=a,<B_(?%]"?U-J9;((R:aXsqJt8!p':W]GLNT2ELAAI=T!o>q<1!U,6,Hl;b%=/]6S+=]IeX@kGG0lkl[\r%OZ]`9muRF`ALp-ncSFV4^m#V#5f*7E@7dgiG*/<ml:HSW[(l4;Fp2IpF#!fRdDgT#<eH5qJ#?m]oqmgonF!e;*[rL[72]nFSc8%L\r%o^T?QlkQZo7@iS7S`_hDkU;tbUlT7.RF&s/_n!>JG-HO4X!WduTV*eRG^d;L86<1B%JY]i%m;M,AZgd0.?%K=QE!Vt"_^n;Sg(>f\r%"BZ0Z8!0@kiq0T&Q_(LSE?7/4:ALR-j=m$$*n[t&-'hU=g?tJ8oS:c5aru&N4V-q`R?&)UY_qUaMBhiEQj[]Pa%XiHIHQG)<C\O=\r%&jY7(TSPClkG]XNbjg.@A^>`E7Bk"X`0YBj,.(p5UJcE4j)PfM@2UJpHP.LI%i=l44=porZNZaTB81HM@0*NG5?uHr6X*.YM;l]M\r%L3JIS:Rmi3!#\G\k#Y=<R8s@ZR1d,VHPFg"M,0sm<g8GR$5Ei&B0(rsJV9pCL=1=DRZbj+$6Y5&+/[JVnT$[@b1q6UIaK-B-cOQu\r%.UO;(d?WU5+j8a!EeQeC)QgSdd!9jtit$5I8TcOJdIrEfIqYTuRL?*)BsUqaP.++GXDFD!R=8#9NWiG2QUIWX`esu<ccT/uS^pnU\r%CJBLF\-OCX_/i-Ta`d=O.8PjXp6\!3]c+P.Dq@ctVGqPfNe\7=N$.50PV,li)?I2;k%"T@@C]&h<_CeTV0UVGI4A$>,Rg7*<#c5q\r%;BWq4I5*6[pVKMBHH"u$5g$*Ph,7@;P1e.'lBJgCG%u%YKtF$2f4q"a]R8O5ENIhV>2K+aaYA']8UYkW@FD)/V^8sb5^&S3[re(l\r%qnh>.cQ(ucA<s]J'4H/ZZFE>j_je!?Xl`XL)m"'X4+(U&@p'#h`VJUIX[sXDNkcs<dm::OeC9hojOh(XE=9d7q4LfT=nr!5iYGAM\r%VuP8aHqj1sMd&6c,tnnXA4a'.&"&M_hYN\2Jc\SM?)bW(8U`Bd_H4bSXNm1#1aJYs-@&Eo-3<fa/bPs@4_L@(*0"?)_/d4piVSpG\r%JVAC6S;+CNJP\"^VG3iQLn?=Lpur--9[tYpNY49pEJLu&EebC?&V]!QWpt2)i!TqR'i`MO<#4am.C,ae$p)Q89YGh&Oeni'*lsS#\r%5bKh:Y6Z#Uc>pb=S9$\Mga?g"X500`-3G[MV('u^T-/]$9qisK`P,_AOKZH&20"=/(Qh]imt\>Fg8s51("27)[6?:qX#rk',>F'D\r%*-N.j(M3ta$**kt_]X)7]EtCo3),\l*1pVK%P84$c=R&AM))CRpouIZCE0TDBmgW3Y?WM=RQqKI9p%+##9,DoM+`t<5?/b!'\]V2\r%ZVdNHq0WnE-W#<6VE);/g)jL<X\TSK'GVT6U?C!q.4J/ZWC:.&MLn;1l`O#b/C*N^@Ilbh81]$49CAr91'-6p'hr'pQ[N[oOU3^E\r%+$\>2`[CQE7OhPJpi:bEh2.ofPB7R?YB2/di8X=tEAi":bi0$'"B;,]FLR4N`hR?&'UDO;Om'Y0mtft[Ro-#\fj!mo]]J29ngUZQ\r%K.$gSPba3g?S^ugbuIg[TFK",-^UsS1mBG.UlWq];8n[_/F$_.>pT?j'LmDrZubAW@aS2G_K+rrkB)"F'UIY4!U7,U-LhnL0\ee^\r%Kp>u@o`ZTqq*tWE'"arI).Q.&d_j'5DueG7bGuo-K&u+c8p+_-4$.HCG,[X[J%K*NN)XH#:;I!$3\i4GoQXI#RAocJWO6,r6p%[:\r%B;Z)KoR+8YiPrq+7/?OO8>*omb74BUV";Ga/Qe%BX/,-aH&;7CYS3&k0G96jMhINJb"Z<#ZTs^6@Ws=t@R09T>LZW>_NIOhD6#jW\r%IFGSSI_*C?1^j[Rk]8&^TYEuo0t<.6MeN^j&UWH1%%YS^PeoLYa]s*dCN8H+BFZ_(XYKhQdMQMtla^tO>Yu*r2TTnS&+_M%S!Qr6\r%o)M&!XHX0I)6ZPU%](7R<O],g'rF()o,iYVDpKTKX995;1RCbt:k-ORLq$KCSFHdukE'@YVre[rDEEl5kERM!^<R^-f3r4akBphN\r%olkFtkkLRbq7%TAW,W<Hbt;RX$.rb#g<'#9K4SdTn>oR)`M"Vk$n!E/,sIY<MQu>GeYe*iQ[[,HL50"tCeh_,4,HEZl.arJq9BHB\r%L^p]45366[n=)Y78UC]19\NQf\_qghZX1e_b8ZsgO,Lj)nY]G+SDGW$ao:,.2*8m<9^m#$"rqbEn&,lapg\)a:+rQ3K:hj0\DC$o\r%SrNBD#b:"=O"nPY-J3;oda3O1F[ZQ.)K0+gpeE[MfWim<1T\p_H64stVmG`Kq4URtm'r6s$LB2q8")"%=cJ_$#@lj%HgfZra.BMk\r%3TFVBQ?sNt%]'O0,S)QFF(><$.D^K=E=KkE.8%pDUc;"2]OTg)`.5"RpWh#$^5R>@8kN_V,t=?];+n**M(R$a&g"dJlh8XsbZHQ_\r%)Ml59R&9$l[L:nL+#FNb]U6dPF.0bDF>ZVu*WslRR4;h$0#jZJbn:\/A=eNK\_E4T<4h\nYZtJf+)1S!brsR1gOR4!h&)[!ZZQJb\r%Mb_;tI^6d1U]<Q-Z?2G.l!Tlubi>F9OLLPt*meiBmQiHi)HtrO@<^\XhSP&,qI5nT,Y0ZonN)WQmY@[^g1%t2f!*C0Ks1+D=Mq`G\r%2OIUR!j<"[52$'8>AF:_*hbrg?G92$A8?qd#(<%2dh_n:p$`-i8Tq'RJU^HRB7,!#)UTNC`HHE7,e'sQ)^tMm'ih$:amN!MC'8Qj\r%A^7&^h=;CJoG%Z%E?u[pgWsb7HHr*dOZCsk3Z_E3Hp_%QK#`IC''ll-.R*1GIH"j6.fs;(*`m_/Ie_X\@JOP`f1$;:1iBPq*dUrL\r%PB5@/?n(gY"BH:FKBccp*bK#\,#_Q0%th,lAV6g?HC1[o2*>sX(4)?N+-Y]>:XE/"6kAUjL6;CX2Fbij-hdqL401:jVrZ7ZRelG<\r%Z%*#AKTa4CM@(#g=D=HWZZG2;W47ak=R6efZ2,ZG&V1kN0b!&_'srN'TD+[>#"<P3KY?tIFD,4qeM$m-3'Ko)<$(9p(=aYXIZ%R?\r%d\7"i0V:`BkB>\&Xh\:],m*dW=AX\1Hk!)*ZNC.IE&6:[VBplF4=rBUrD&oO'#G-QI8<n^^Lt[EP?h2G'As227g>0%M#bja$e/(4\r%ae8^`&!&/n3djn*_uO,8NDGG#'ZQ85MIQIP',6(&[@ma`bjN$);%E.SfQD_^3[o1GHba(+X"%\b787E)nYq>mct'QbA7Z;`)X(io\r%$L<M*gqF/UR,RYln9]\mebdL2:9n50.QU]`[$].8Q)aD]UuGH*eT8g+Y#)"tM+Os@p8jQ9:6$f(A]Uq2FEbdWM5d+<_IDB0')VDJ\r%Kscs5"@FJ^U5h-@ftI7(-8Il_W0kDMPV."WW[M,ZVtW;E=>Em@ETtpcfHM$!FB>APZ"Z0b5S+l5]dcCa[H.qA@b\+Nq5CUq/j<BG\r%\a3l,(h&FA2=GH`6)n?.o4adIZ_jTSbq!S^"K8q?&n;ZYfYt2,f;i`I/PB-M^Q*cS_9*"bqu:d$R6$bB?eWheR(C<:h6L:sYI$Ms\r%D2X]&XGa;TZMXGn(IEG&WUb/E\[.f/Lt2LK!YBF@Y(Yfa!)D-,>q<d64b"fSL?TUjg=;T)SZ&<pNk23;B=`t@refL+VlrF5O/M;F\r%Yrn;0VQ1Un!AS_VkupAm?[fk@A\(4,Z-7<Ta7:XqARrS3)jQ1G&0V@\oCG'3ZrH3"]6WrUqFd_F^j=E"`AoH<-UWE!7,)<G/Ph0D\r%g;rlXT_cD)ihG=pOa,;;MW^\>?^\EEqo0f)pm]=JMGV<3dH6sYBu<e0gt2(^86B5j]a>B6IiQKtLN2N/kYQ]X>qhgfT6qg8e(\27\r%nT\0G?K9PBVtYk=+pJua<6AuO:7tL\.'kt^!4>EQXsE3miN\nfgt21#:)4cG7Eii,csXs>p*n/H.a[+KOZ!X"3$CZo)Cucj"\>dh\r%TY]nnd^>aa&n(5'c5Ti<"tQc&?OdNG4d906R7R'W>mVE#a`V]klTg*QEuj6()h^_]ANQ?'"`u@3L@"=<XVFIjgA><o8AC;QYSeuV\r%<ir<to4["HX=>@!d$X-h4];NXGqV2,9'&_]\=H':hH_<VR4!huX]659Z\Fa\PBWmo&&GWXE2+,!mhL&d*5=3u@gJrk/WCKrqIs+E\r%A9gUO5I2;$le-EL6839C935$*GRhj=k=(:;asXV@#k"*c?7Q#B4]UM\+W/(-'nH6<De2gj"V@e`nOeF]or@eUKhDL0n[T!IY?CX<\r%#_iBTT_=<T@4Ar1JpG="TE'opZ5-iF_Ws?1'MmSD+OU2M'JHE2"OqtMp32<Krbd.-*0DIhAW5]h7n,UGo#;Z'\8]Z^=8edYER(c]\r%F;udiN/pe\'9);B%1d*&s-hdr,O>li=kMQ(&1slg`XW*SL9*Z+Np^\UJu/+BN3)KkS:gemAA&m2pe/^)Mc%=UaSK\GK&n]&ha,i:\r%UOqU_X]AuGG#[sVAA(#Rq",_n*%G&#'+Ff+$7^:i9GPZEq'&eB*$uNpEb/4S*%"eTD80FF"Y7=SpSt0"3D?ZogO?ng$C8R4K<\Z!\r%'eG+cKmL9^.Td/oXKu.N'eG,ZeQK&7$9fuFX.Y(+0YrVZq_BX'?=MMU"j>^+ZAU6.K&pl[OS.3n"j:>+Fd?g<K$PS+Y(R-GT9!7[\r%'eG(YC3jO8QVbM=Ubq+p1o#X[if_$4$C3FPQTM$djnDWgEhpY:o3V_;/@WA`iQ[PC5R#=c-bg/_*E;Oi4!DB5@U\LraD7N%ji#0P\r%*W*IIi+'#`=,P;9NNo=k,c_eeXKiL;PD6GQM`&0kpY2aRiY@XF]UN#`3<<?cZWu\L`8>oRELdbDd@$(tGW2lg[TN6>gFp4/=Ig`A\r%DgClbM,arTSGX>Z^9`86LFm+#bbabT^(aeQ^*>u)b;[aVMa_u>1o#s^`tkGXnI*a`l4i=qbp@_p25,rCn]&l_d)D>]MpK.@ne1/m\r%[^/%PZZdS$=QR4&MWeMUqjOe/m(7$d65O!h/cHel<%GEPp`8/Dd)?e%T4I\XBL*GAN\/hDo3^u6@3ql;(G5GLCb`P:I1a'cHY@N'\r%ki0dj`JX?&$G-"QCb\&]k>HEljk+#k>4;p'-.[SuQL%NHb%lhk@#N@$G9Mksjt0Cc[eMEA<<ca1SC/g$s)N4d4?%$%_UEg<OcH:T\r%S'+_jH9\])FReJF@Pn:t>3^GP[eSW^RG\1MPNR3-f=Rcb4qUE_g)/p]>S;fi^,AG`jm8!X@[&abZi4/GjjUV$Lf1rF7eo))nT,OY\r%SOFkFWISj#L/D!eM-h-qHpsR8$:\1oKTKtYP^t-]]OH/^iTqi#5UX0.q);`Q`D<Ra+4aS?*TiemkG+<ChhH9>e7-0!lR^-UdWZ+*\r%Jos8`HgjX0B*%8pI3b.7elcC;hjs`cYg,R],*LU/Z-G*bb\t9X$Z]Y3>l8rQcKF(iHk!0`0O<5da7h`uZS4SMg@Lf<c7Ti2g@_\q\r%C+.Bn@@`,:qXlc`+7l<m>u,Ze?4Z@Lrm]V:@%Art&+<T)c@W4;n)Cu<elb9<Hl&'FL3:5o);gdcc>re6YE*h?cJ,VM@@afPbO8l1\r%'dRs6XL!G!<o2U&IB<$;XScp;B5QB&0%O1u<5>PCSQ4_LeZd>&h^eOdXRf#KoNSQFf>/`(_`DQsl0)>RB1\B\S$:3$F3A?,S[G0>\r%/q+88i^tSRiqsg!B*%6*hobT'Yg0mGkX%N-]<KSdVk%'5lR_*Xl=\n#&*kd*'V[R:(Y8EJWsY2$S^6\Y\IR1n5WYO?-sdGM/1fHp\r%^Us3N=Qe^M"MY?1r.Wt8?be]Qil/'XFV^(a>2I0o<NPeYhd$)u7>B:_0!9tP('="$9)S!WB:4r2Ifn8)^3Z'`3e&^aoCVN.:O0[8\r%FVY%_p^Odc`]=L=@O1YoYg*;5#06IbYg,R`VKf8\'sQ!(&c$WZS^1rQf>'G*F8k'PFdCcNE.+goJ96NA'7LbK=]4_g-EOOG]miJP\r%ZaellI9>Ygc]PDaFV]_4Zi!"go9k$e=2I!+`cpiVcelQ"$iAsl2Qi'_54pTZ=Q^XI,)9n;FlcVBc0D6>oHr->i0r1nc/LPI^4U3%\r%7l@'PIg')`3i\Tr([&8Ic0EMmDohl0Y#udq/GFnSYMbl";9e:].BF!1XH%&X-2(&<ZT>*hrggomj-nLqc0*tgXUWm`NbX=;'YXdS\r%=WQ$D_BXO<f;t!IAhr$-j-nLqc2U"T=5&tKejY&h5D%$?js19hB7qrE8u3"s5X5m93rf5(mfSFk6NT:?p3lM.c`OZIP*8&4^"+r6\r%'f13]bI<p)lB_tSRQh%lmp"%XG7rN[CGpnehK5rHH(X3!$M4+@c-*Sb(Sa%9m56Q33"m7dVNddgri5E:bj4XR0AgMNJa,)^[Op6K\r%robeJ\C\CKXqoR/B(qa\D`*SkjN[FfQZ"a2m96^.f0%O")*bA:+QcR4fC+04@FYZCUo_Ml(e&Va0.Rs1]WXSDA^<^#T]bVc]/4;c\r%?#]O-F^\?Z'j@%Pa=b^mA/?l/>D2@k/44U.Mm<E;V&;OA)<qr2cYkg!KZ4fqFmdHpfWo55A_oaaf4Eh&JA]ar,@#HI+;0#b(i*`I\r%$h!]"Mr(*;N5#l5Cf;+oH-O%WrPoe<lVEpH@EsC=PBG'8'q(4ED_la^Eob@Gdp_P4%+*H?=#29Bb;):Pkp:QMRO]uGHi:HG6[+u$\r%]K7rI?oN9@X&IT;MkaRf`Kt4JDoKN2NUN]O0Q/hRL&>KcERO7-^au(D0Dh7*-fZ!5E\NFI2u3>U@?Uq01kR[b!5AX*4MGa69P,@(\r%2c.R>5;h<%CT_]aYM#fk2uE,iFTYCiE5e^oXh%SNUm`c8k+Bh4DQY>PGAa>hh]hhcB;qBJ9s#hHge37B1US:5!("QHB0SNE/Y@Gs\r%[U%mek#AOBIub2YL"2(/juC3n?d6&ZH7n*olJH*irrhK8Q!]$%&N5?^Eljr$KRDM128<M/B^kY_I9F)W5H/!:en0^KClRiG2773o\r%DF`0c^UAm'dHeZu?XL]rcC6V64*lN".hg[bX7n-2BfI&[D"%>`oe`0T"T!&kd0h`V6Q46>\"g^<R@)ND2Yu'<=9;023#g\62Sf[1\r%p3(P[iE20SbXl>cV"Cr@OXVl;6^hN4/?K4jSu4"(RjD@/dj[,@]\]!RT/Ng9\)9,sM^)OYOH<:i).)'fC$g=IPb(7mZ3IgBE$_)>\r%M3k=%ZsS]hKM,JXJi'jTLDR?YhKuPf^8f4`!a(3/(&L1C1P^=HB<K@of1"h*VWPIsVe"Rfb>tUb$Fp@DM-VmQV"\!"&=s.DQh4FS\r%PF+uaq$lpDY#(A>`*>NJW8b+q;+7NcQh8g5kMT_W^C5"Td(#@qkgl-e4*Lp7=aW#ml<L:LiB83,3S\\LQFOPA%FgPieN>Il2:l5[\r%(ZS7T<NcUZ/8d85THIB?=l?tg)1=HS;p';-Y%3&;K'^O3jopKT<lL$#1g@jb6<BU7B,Z5+B`@s@NN+Pt1,#ujYOQ0]NZ4UXGqtOc\r%f%G?7##C.MDn=,..<>4Kk%Zp2Z!$-A'YsWOE:/V@\6-WYJ"oklb_<fOhLg7e0%I3'ojHT^7q8r]SaeSi'b=fk4DB&J1*BR*\tdT8\r%b>5&9m9VAIXi*;l_`tSq,AA]!$(0E_K@aQq)Mu!Cgd-j!.g&[!@X,e.otstijK'AM@KeTm1"9=I"?@QOnF[fkS*c_//m0^p4rIJC\r%gR1nn>F=fJ4`5:@?Zt>6hmM-lb5)PNggtr\F]L<-(dRo4SM&629IR,\^ONH1GVugiMCZqPF;;e'boaLA7d:E)64&8^X#%V8o5!IY\r%Q#WrGgh&Gu+#UX9##B'(lV*r'Htm(GX-KjrEuitiq>Fi0#X4[.?W`5C@R,AZTG''*dB.3n*h(pF40^1:_k#'gc\m-BX&kaL"8.uO\r%_n^%r$'Wh?K0*mH#ep4V0K57TY@^*CeuB9D'/7J8^G#e_X;QV&!q7R*pI>L,5;*>Z8Y6%XBG:UZ?Y/2.-hT1_)j^UWc#.^5T+,d-\r%);jdSqM]Nc*Cc@tP^*TK7Q3El+B7<SXk`82r<U;$s3f.eGUo-W#\+.jRGV\(Zh+'skT%es%dUuiHL/0/g0-f-iG]aTfAfr#:mdlh\r%T9'sBieLATh\>2^rl.Aj=c"!Z+r`.Ri;l,jf1akJ.IkVqFEJGDY*@!sIGgOX)dJun838Qr"i4Q&6s&Kl?ehE=4,kk:\*1k5rl047\r%48d&j='i78G<Rf`T#[ic*`7=fUWk[J7P_R%>c7MVMim^mV8Mk<Fs/5'XjF'>1N`I9ec0a7Ed7W[nE\'@HN16mTa\,cg[a0cP^1%:\r%'49UG`(T)gY*YY"`2=@?EQf<Xg8BFjT(e;db[A/a[VK>*RcpbQ2l-cDpt1!]hc8q9TYIO54u]BKA04#t+!5NdloV7if@fD(qVRh%\r%W:qDY<"d&\-G:[Skrf[.@=8sd0D48niT7DprB'4_H6K@M]e03:)9LZ)_,U+W&PT+fB>NWUm/s8#2c3>^#q*92q+0W<&#0J53(ek7\r%9!R+4.eeQ==1c)U"qU=s5Y,k7`R-?AnT$eNIW;Q8gojc@NB7IHno<idL7c*Arhsh=f'.^#f7d;/,Fj(jc@PHJq>"0O5/7#E83O_M\r%5JNfIgAAT#Dqss.n[\Qn[<QtdIX^EdiJE7YID)LZ'*IdV`VIjun@27)?2LT_fmWY%;"@lK\psWK7'"%m]:QXES++q=2lCCOOP"D/\r%l]YWIm#r4/lrTYr\N%*bp\_;ZnX__s.D5qc>Fii`is,:M:+Xj[IsG&?o26m,OYXUG:'bb$19\b#G2^HmF-i+-4QYWV4N4cWY*3c!\r%T:`1Ci2T;SlTYiU"g?#/jg*+l#MAG&$FT0tb>'S=`Oe`75Bhig\q97uYC:9GGf=a1+3uBIq(@+1*:FqAH$K9If2Wo!iZgah5DYZq\r%J'7TN+K)Z^-:-j264in_rj-6EiO/XZ-_J]YaZ$QI4M'^C7I$*&ai;X#oppp97]sF2^8.opmQ]UqAXWoY@qCICPF`#.=$)P:IYlJ(\r%J/V,JG,)@_lQZ8nTHk!ca&P]lFfN9r?7)"7\E\M(U9m;>k:7$dr)`[66,%EuM,4%Xq=Z\<ehS'%s,ugLr.(u^BOgON`>brWAM!`2\r%X9R4:q^q9cMadKKrSuf+M1"XBIhbls-aq!"hRn.j\eL@+^6-;bLJt0_^?oj)'8Q!SKg'qu)@j+C0,$OOHTXoQf1gTj='f-j5.P>n\r%I+bJia6J(DI!d)mpd]O5Me-B7EA:Vf?)]-B&'Jt=..8[-&1c;jh.9O!<HW2L1D3Hrcn7E!+4@FB]RgqS&Pr_kArYY?bS<n^'"a_(\r%7513\]8N9e>X*CXq/d&.pM`4nCF9(W/(`&&g[o-?O-N9nReJse#lS?,/E%)e4*`]*Z'TBAV+YrME>"W,`&e!<K@W%XqKnAM7D7!I\r%HfmNiNTn;cp.Xd9k[E`Fr8@WnUQB``lK#jsHSM'Qh3F!nD[EOiqilW(GOQkApEC[Vh61!HRD"r2p\srq/shGgpCEN*G]kHae,ab7\r%.9ufE-'bO'LQ1!E_S)non79l89ieF6c0rF,e?)u2Mg]t?Vn_q^5"bV4HSRb_A6"(oWl:^rRJn`pjNh^T^%(8W)-o]<hTOYV)",0=\r%A,;6qkHUMR<$)O@eNq^8ep9Ee\W<rgkI%5FaaClG$H@7PVa%Rq-lp;h#en&[<?AkRr^0%1r>=Wr3-g[*&*d$V..I+:\__0Re>CcI\r%I'QNi\sOt<<Uq's&*09)T9ik*a7$BR76usjN;lM)nHZR)A`qMOQ-TgKoWRc&kf&%a(_A`t8)j,EhQ+eaZX96\r3;<Y-7XGa;M4k2\r%90.*b%H05)-+26JnViHc%pe#51%F<2Y55fJOb^8)0m.L4.b.',Z3tt@H):Oc1d8SB5E`W[iibZ."<s>E+s3?j\G+#uJFfi!s31Mo\r%.p#VCOjDNtdJ<+_rtoc&qVGe2iD9d=r`Q'@k$(oi1U*BW<?41aB?+=D8H&2%_t0X1WPR=4RVV`n_u_+LT])C>$N((-I*5%<R$:eO\r%gR%V>E%Z1uYck%Re"c^5ej"WXraUb6!H[p?_bKR1i;qg7k4mPmPh(7CXWUnSS1$_d3(s,M@sda[>d^B"@93i^3TuA!aL@5g/_Po'\r%%)3`T2l?P8*Zd+%jkcW=f(]YGEpk9GHhe+P[ZfQ6K,!EUn#e,6*rLd1:_"ZD5or&ZBYTRra7+QOcaE@n.5WdKkkVR&9nNMfhu.Y4\r%TnL0,VRU!9+;1P"UJ*R;STR!KaZiUgP.hnEY2HF1I@E4!Da!_ag.]8S\(C0!01G;h042o`95.JDo*Pf&b;BbbK7!?pR/6W)#YF%>\r%EUWSIF]Gq2h]LiB)8RU>EpsD79t>_RT8:V0Q@J6qpq,-@okO+q=,+U/kL<_WGOFL$3;pJHM.BH[FfKrhoV17rr4W2uWU5,>1&1T(\r%V=L#?K!T>'jLbA]r==DI"5gnOR(CV<7;Erh?1V_"h4D5Ls%5HSI7Ho*b$j"5j7la+"2CaYVFH(1j.om.qU)!gH'M`/o"iH)iRHJ.\r%qB)!lq72k6]o=c)oV$<W40Kn%.T$-GpVQNGLZ<$*s$*cX\j)L!alsoDEhY'T_6%"]iFfi*I*n,HRRZ'h]T<)=F'CYX(neP$Q>.38\r%>#-1BKdN\4Abs!dCttB%r#VD$T<D,\H6?%'hAPM!O[gi%^+JLLq^d?^O5-8dPsLgg8bq.K+"rj25Mr%XiRV$/n1]KI`7H7"bBNoo\r%=62L*4.LB5h0K$EVOj/U'6sAslA>7?ki`8)QA/%+4kuY]9SaI]6Ps0r-U`<nC&"lR8W:AGk%Iek^0Mf2js<FQd\6EU$anX^!KTT3\r%s/,J71XGi&efh](T>A"U7sN*DRdec$"SG@H`$s4u%F=r6/Js9Q5+%jtPLE%mQXd#74W[/7d\$&*@rM*.GESGGM2sHZO$!d+pg"sE\r%Pc(+[+*r=%\,q%$n_`^]*hic$kNh/t<'L'Fdi?Tjrq+\9TA/7,f+Vi`RGYm'3!l`Nq0R/Lc0IajG?l5rIba3Mog/ddo^<ISpNapY\r%8iJqY0Fut"=1oX%>iuZ=O&2(VJS1s;8aoo&1u*Ykd9D4oII`2nnsN:Rh`V/j.8<GBj&_4RJAuX&**uA0#JMM]aJ2[8#KP7-5-,\s\r%p`S:EIQ`aor9>u-T(MjlLS",</A<upeF:Md*)<N:3O$XFj[O^RUX,;k407h1-I]3nOViCJO1_BFJ)`Kfc?F`.A\_XOF>#_>bj@:b\r%1p%rcbi^V9Bcjoq-b%VIgpl^8N_/8'hEC&Yi$9BGn"JJ$dk3:t?6SPO5#0F]<l<k9TH:h$e$sKqIu6H`F*l_`%Y$&2^R9D%U:B>Z\r%guWmt;caG.8FAY>Gb/G%1$OI@?2`H?8#:h?9S-f_P^_OMU:?h/`^mchWN4E>/cOkS/j/-5"<M^<)8:dPH\h-9kQ1*ipm.9'R\q%\\r%)h01"a8YDp>PVHOc/dW'OZ1M8@an`(4bqu<jR/+>medU+U)tCOd_)jHj>bBL,4_k>rWgp)Ncb3"iKLeD;&S8m7kJgFLha'8gG:Z=\r%5Ffoj1/i`ulS$?"(0=o4SVD6jOa<%[*'F4R`%]o6e5/<MUCJ@DAF.WTIQ!m3o%`Qan2()!j#d,%RP]d,__rrC.QR:!$('iLo7@\G\r%('W%J,0=U$9ok;ApjXBL1&*-j1'tSAFe\j6).3.nLO7,J04#"X?9T+UJo`k*:(1h:4)AMYK,G`F:!8Ib4Wit0a7.N!7Ja<>W+A]D\r%^`>YA`C-GY691E+WL;u6YTaApob+_W:\[9=W;fHr^>A1UZ\Nr*m7/8Tpi[9J"8<@D5>>WNc&GSi"1.%6=mtebr%_[cil4Cor_(:j\r%q,d%Nq&[e[S+Cam/2d.7+,SAW#Pip$2VtReq2UXPH*um:_-^Hf\3]FMJpdRbB/'2uNJ!Q/F54R_jRD&lUSFBm/pL:=IA7m:F8>CC\r%2SIft%EOI/(9Bn2n$u$M;SGj;hg8E$Wr]X#l\ufCarb$]OeZd-YDBLkE]=2?65=Ad+K3j2`69s/]eDF%R:Dn7)!_]AjqoGt*ifg'\r%rkXk+qs`C3Yqj:&?DVr)E%$oV4WVQsntlnL(CtdcouAGj29j-JNd'M:d>+W6jG$Rlr\?-QeJ%1[chiIISM'C03dScpTS(QhVeIs+\r%.#(]idc(LcC%(G!(,=PMNFd!c-hp[Ng,i?=:'3UQP'AQa/jr3VFd[1*<T!n$`I1W\E9CNJ20O'1KAE=GV<&nGTUdJ;hMOn@;n^7'\r%r8@.,]r,jWHK2a_@E>86D3WG/T7R:TGc!&0His=VlF;9CLK!dZNa'BW32h<IQ4';0k^_mb5Qt&JT)pI'U.dnf;f7QY[JV.ZNoBTJ\r%C7Tu2('sD([N^=I*5p&U?oGaX61=nfmJm_@]*ek;,R!Am,W0WO+"1f<%q=Z<-AVr.&&M".?N2-[NWJ]*1C!qmfI03Zg!`%i[Gj;m\r%odYOuX]A(O%o/Bqh9+>_OAN,eNqVC8o"VAH56m8?flK@8m@;Pk.<^4OTNob.?kT_;T4e)R?)9eZNl:<bBg=oVH*f_YatkZ>]R.u_\r%HILjC3+et2H=M%4PDHm4K9PP(7A!?'4sf$?-+T/>.ad/+I#`Y4Csu4@%\=^/`6EAu;SGqMrSMoMpfHs:Z08.@P_bp3mg5-m0#5*X\r%'hgV7m(ch6&^0QMJfW\",*m]e@\k@dZ.pD7@7Rl/gL_KZWZfb]33S'lH/;npPFFrGW;'I7`69s;m9r\:%,sI/KD;=0"ia]/_(%5Y\r%"B@j8<?J)0U",3-(okVpZK2<Go/u9,D#HZD*5h,$LIDG&[0L%*eTgqN`H9sD%%)*1VAp7](CUej\;.=C<'/m$*JBf1Ho`LI4`K1!\r%=jN7;;_Lpc(CPl'Kq\>^k%](,Ce:QpgY]Bj>90^amY/K'7B"KINd3&3DW&a20+q)H1in%7W7K#IE5's'o^7bjE>Qo03bn<FVZ4V7\r%`f8kk0cb>`mV`C]m+RNjLh\\1n+Pl4r^2\*A!+7ja$*MRT98gTg.`>@S(=n^ZcshPHXXPNHa?;\K=DWSqecO&H7nN&&GjfFjH\F$\r%:90d0YOCYk2L2,@U\g<-P?2K0i00L0`)2>/lbb:$,I)YfS1ZU&WE[I^3/Eu4J9,.=&2V?,[a3qUAj-F(P/T`2*5`SpZs8KL6TKo<\r%V*q$nL2&\r[`L&m+S[9>9j[))+G46p]F(6P6Gf;3`tt;5:V.T+WMTgtl.GQ]T>So5H)8h#mY,NK)P#Ir[-Ad0C,lg5-kro3'GT@$\r%E"VF7C6_NVFa=JV\BcjSV9b>pA<t=f4U*t/g!h2KLs9ZjTM]90r)nUc)SWQB,iWT-2EQgN3f.h""&g,072V!bk[E&772VR`+JRWO\r%/0`#tPKaLuq0NfJkj?2j;HLn39OIDBC"DQgZccRN=Xt]a=QQ[Nou>T*P/=o6b$.dV_;2^>\O#?)>i%NL&I64dFdaqrA)Q%;9B.'E\r%S%Nm4/q)pLb.^''kif6X7:-as.B1oMW#Z<<f'+pI]s,X`(KBB0kH33CT^8OoESSQ+_cMPUkbM27h_/%h3Ja)5R(UOA+2n$)KFKs]\r%1l>Fc&Fd_#\>+R17s^mp:]FK]j#c0Da'4ge@`0T*!dba'@`0T*JjjVUH\?or=V"'p4[SKId]N.7]O)*6c5ZrRp/leU1WM1^le2&!\r%>T/;"^qCQf"t[S(^b]+7W\G^$HP!/^-l\ZfWXkVH,h*<;gjlc=Gr_)ElXSZ7j3^AC'aW>K'[IKRY$R#8"-*]@[$W2DoGGRbG_X?+\r%\*4hnKV-/qoH8r4SKs)ESFF_W5j;p,J&G>,F7bi>9^jVb%V"Q;csE)+/XLX`/;%-S'6&?*M"\M\i_"p7N9+;,HMnD;Gg1_`\I$.!\r%iFWM+UfI)nS=`AkS.3s\s6tZMlkO*&/,P'4LgiQ!=2Q\:U5R_VU<0!-1S%R1?<eme"'jg`7hpSe(VBR?qq*Q(=A$dO&e6ja;Skh]\r%Cu(3&iO5bNkh^k*7%>1VD7pp:harBP85ZXie_?ZrG6\[+MU$erC$!:W6-L=d\C56h6%!14Ao\G=a+1VEi#lWl@Jn'&*Q7d!*h>Q8\r%K6ABGr#k??29T_,fe[0CJTMb2fQ#Wp6.jY$/#UqNmR)qOlh:S2I<+^l;G,.I&p.X)qGLe"OK]cj[WM4XD(5"_OGL^:qs2P?i6eQ[\r%(7#RhK`oZs==sta(6MZ/k[kNMX=>MeW-&2C:_0N&`QKi!X(5%!fQ^$kV1dT+Jg^+-(SkF:]pV4(c=",L_2\ZT2nZ=ZPjSq&_h?iu\r%A_VhHO^<8\$;sm-R0jUh.9VVjQkq(rH@-JP3B"10NB0he[9aUs\C,.EaUOCd"i6IKjjsnSp;YJ!)agD_*,9Fiq)%M?cNX^q7Beoh\r%6+5O+6A7!*GkJ3_nESE7bRH$T2Mtnc."_&]4Y5ne?5"rsGl"F5K?NQsa3&N_MI:3JJgaD%Xj`Nm8S`=eSsigWY?[>>:B(<O^i8:D\r%ain4*ij9#L+=`K"j1Pe,HCk^[&'k>cV""j1UtD,-SDN961C3>HSUi'iG,(IZ\\uTuWl"I,F?W`L$Iq6d_:s?lmg)E6&gtbb=HF';\r%,YjQu@Q!tsg@hgDi^E=Yb:7<k!YtFmlr54CQpQ$L/Sdb8-YbOLG2#"/ZNgOHG$cL<?Tg.X.+Se?@tkOQR#YmJTNZ&g0HH)<KiK@`\r%cB=oT]=L_VH,%E8Q3Rbd[>?2FPE5A$jcUa5mX@o5RnsG7_3L;\KnUQ;kqUP@bbuaMI@b7)^=da*n&;Sb#[Mcl^>2T::qeM=4bdqd\r%A,/F7*5amM8a@$;M^lFUM%f8+XF1Xbl1Ipg499Cp9Au4\&!go?2FJZZEf++ioG&;Mq\O7Vd/^\M9:>Mj>m.m&;u(rBY>$inC`Mg8\r%E3S!V:nWWnKQ7fJfhNeRb1:+p#@XA52JP.(#fXWk$54,iiU^At'\Z8uHk8*S5V#%a%q7[4ZXL3)Ma"FX>sF?ed?%[f/)leR6`\Fg\r%i2Q-J<l-k/Ei*guL10Ya5-E4Rc3->aW[^>jQU*-gW,=`1)_P:_S6Vk(ZO*3?>KY@>9&Jt`8$0'5"3i/2Ok52+'\]]&:?aNcLMn;m\r%i)I[f<G``B[W/NaUGtH$'Id:6@u.eQ-_UlH(3TnooaE`08=^a=Km5k\JRZkX0i;Pf)U:&N-Kr!B&*GW_030\:3PK\tL+ab8`P!aY\r%\<E=G@IoLsNHZ)NE<q,)-R/*J\,(tI@A=+\Ta8qiaO"6`jM5^NfsFEU$6)EA.>f7hGLD='hpJgZ9UN&2YZpS4[W9Hp=<X"q%et`d\r%_Ih)+ba]2N++n4s5dFYZk"jWCR'<"M/SEATSm=a021/?`rOp[&iKlH[^]G4diH#ut03mZ<9l:,0haS2371nI:./[0YUh==f9jE[K\r%_/>dZ*o<Tt9jL2)'iZet;+fJG"@`m\@2C^G&`UZc0N1Np37r*-@!S>FqlU"hY6u()S5B@E%3h"mH#pFSAE.(NiaBI4-<+taGC5&a\r%-fk6tb(A.-AH!#Xlrr[pCU;>A`PE=]!apq5H%fk7E%YjioHN.A,D47;p_;snRMt'D).Wo31JkmYNJnG]R^;pU^NfFj+9l.aN;d>R\r%p>A/J[Od*sm/cQ%VS*>J_A`CRS0r#aPkrg?D;)#0d,6$CMiP(\&NAq#o2?YjofcZg1SsJN8qj#?>`t6bA5=Spqnk?1Y3bK;Bi\VS\r%9&%RSr#r4bL<+:RW`#^Ykk.;4jo)Gpe'=2dRONN,<J8lC'*q7lo#KE)<V%?,lgP5nM>p2Fo`)6P";Q#OMiL,]K'D#2>Zi0Ie%N:G\r%@JBULkk,[:&]*;tQ3:!p$A$&Ob`G0GH*GDFYMJMKX4QNqP!YqH5i.qh$tajX?+:4f`V\Qh?$g'pRl^#"0&>RES5uN]d`(a!4t4SM\r%Dn1?`kC(0^%rX4-fdH*.hN;RR(JF'SSBZ&pCaPA6P7u5q>s0nO'+Tci"9X!R)CD+Lg/LlMW?AuoqM@?L1Q].F6.*cMbH"FV"Q[\K\r%lA=b.]MCuLXpo5U0.+O=pgg`(6kI)H>/G'R#ICn7.-+5s7I[ZkH4.UnHjd9,@N$R9lXNskXD9KT@f;t*0GGpQ14n"93>,RgG7(Ms\r%c';URp5F`_abCgGlDCgdZDf41gP[pk5DOU"VXj%are#c0O+`a$RObGtFXO"n05RUqBp_."1fGmV"nog-)s`l+.O0)";rXskq%,s\\r%Qq@_'Rt<MV6"lNWQahk5C5bgQL#EX\>_ElKQ&p4^?7SC9Ghtk%bS5544'#ki_"4n/Ju*Ch_p+PUQA,^U(Q7U90lL)QjXNQ`n0+$h\r%R&/NEUTCS(\kVkG8XS./'Y\YXQkVX`QO7H.W(k1J/AEL#h4[F5b)Qh[$@=KE-GV"424o\fDP`rbrC%4]M:bI]KRBmW0:sUao>60u\r%c'X69L'beY>-!Q>D_=cIQ'U^0bmP0p\%t<Ai(Dg!EX]A"^:k2`fnO7++3!2N9Ee),"D"`QWF-1ibN?E(@/C=u9FJa="q(\TYG&0N\r%2"PMVs1hsn/of9K^eQQ3,qf$K7,0M&iqg%(ohjALdVr'd@PE/l8Oc4*726P3Y;T.G^r*CAj5QD=5ZjO9NRb;ea`5-O\5!d[0"S/X\r%)(ac5LlOfIOU6/oS\Zq2Qsn$,-b[)r_2]0p>)k_:b:n0Qog-eA"3p[EdL[u'0UAmOdE29_(4fQIGP*1?-:4+2m9k[7_sY@Hn%nG^\r%#ia3M3.q^^6Rm-TO782/5N+1uVoW?`cp%#$KtFq,qIResffSYlm_!nWdTPU?RIMiRX5Ud)ZSlZi[0bAV6c3>`'H0[Xo%'@VoQoGZ\r%\?aG/DIJd<[@^Ks94/:.+u`'dF`<?D\Hfa33k2&)K@nmR>Le00O_12Ja9hFOOQB*D8s\)!Z>OGBD-Qo%n0CC<#"UBghLjlHVEsc&\r%=6@b]Cu/$d]VBq-I3t(,*S0dXcFkAD3@SH.Hng005G\6'8=GVb]k4?>!n%*8E-7<o-Qh=A]^6jc'p6$^\`EO/h^Lua+X1A'/N*,S\r%`*+,V@$dS\P6Wl*"?cLDc69]:M1`1GW.<3G.biO'g8ai[pqs<=jigQ;&REQ)@/i\#]?e=&"E/&oQ4j)-^Rif^;R`JR*"(B3UMP0F\r%pGiN07>Y+C_Ck;<4%2+F4lVXX&N8$HGXnYf,A^Q+Ci!s\al0\f+B%F+OpD@)_a1e/:pudmE..2O7ZZM4:PhZgoT?sFD>8O((o@a,\r%31':h!j7*Tn7kgV02GpSMppsNQ6]/!44]9#7]4d`8A,s-rN5-5l/c5>^*?VC7U^`f)g4p,L7f0O?d9Nb:CSSIW:[dqK9j=N5&bp+\r%jkT6:002.qWP&8D^/%);@ZFOU:<CL[DB!M>p`+p!P0(Qk+RbM#lm5:k:Z6m_3KoH31sW3?JCbtu@1Tee.H17A[U56/9h;T+7L8K;\r%Cm.rs4=Na^Ab&HSiI-l&j["u#RTJt>ncUdg=Nk0&XKqa#5<l8&)kbs$F'49hUX!hfq?Jrm6Whq"ksJFDMf>NIV@g[)RgIkR-Lair\r%$H5>lRQc>4rsl:P'oc:A206'Ep/KNC-?.D"TPbOf]R5#EK6JP;1b\351P&cG"Q$^eOm4nn6JS1=P\r2^dcPSeAd@$:3tM^(F7bXd\r%gn9eb6]Icd=0d)crs"PD*Bm)YjSa32)b]oc_39o$[\!9FfmuIe_,F(o:d!bV7,0*YmIM.ASr.DmNA6B&AYL=95?,I2rQ49eXBuU9\r%lc0b(qu=Z8e/J?s(e(Z+ij</ElJp%/b7$?U\V>r>MA/Uf"@\9RCJRC.3u(10):CA'2:BY_pT_3;chiV$_9QGtS\[4QOMQ*E1,hc#\r%"C,3M,jN?@>"+neglRgr(^[.Gd1HrRDDd27^Je@[B'WVY@FB4&8eA?[)2*L[USGM5R_lgV/Xn>-fj)5Ae"k`5+F#6#`hsj?#39AS\r%?JAXAm'UYM59W]_(<4N<#35B+AM`HJLYm,m&D<e04*(7fn_3-7Zp`(a"_Sl,6NN=*=VIuUI`o.o/YbTEW\i-Le,h`,)R6E$f/CC?\r%_/3L-SQ<8K@6P'sJ,/.!rkaJ.o34!3[m]ZKg:VY>[a16VL`XIsbnP>qiqOiV,mL*a0_WU-*lQ3GrJBopTr@`3+u9uLa&pHJ(l61I\r%4;X3VM7EA+%='^5W$RGTM!8IX[5;_Rlc3e2=fgnEo=-H?ga$3%eDqK7#op%'JW/6>78SS3."\W8:IdI*f[duV6p\0ELeknkjC?Cp\r%i_/Wl8L)gV*[hqfPu%#YQ?:'Ca+.E0X?,@ikD;2`X,cu<%LKb-q"P]/#JoboKkB-JgM"5hgLo%KTB0!\dh/4llUc8.)3eO5$Vr%8\r%R>KO705Qu/hGMX9Q\@!!QY#\*qtuoq5XZ4;<*13F_'_&)Lk"4t@au("aBf:qCYJ)1=^e*!SBC`H08e/%m;TDtLeknkA4f;m`J,'m\r%%_&DJXr/SE>`8fCG.87"IYc0Pl*MD#/?8=EL*[`;o#;4C^-4I?m]/:$c5pr>]r!$D?Z`Slh0Q'%)(*][Xi6+B$PScZel%I:_>(m?\r%&aPgE:-$O&;l!LH^dZ"%'-mdC)1Xd$r0EX,@XYnXHd'o0@ZE2IA`,&tl&@FWo>1XK(Uh\$@`8h\Z2Pj-0G`7R]'E4E90-(/Su_;n\r%4mjjF(9S[Y0GYRq`#$E[6e9u7U+e=<>Af8$Gp^1BfZKnTEXYS+FFj(Qe]O,8_qo[rda!3(5\]%F,!AX&=,D*_o.mdoQ,pdF\<M^S\r%Y^NssV<cjY)I\6CpC.<60s#DJ`k;eIeA_]<\0-$fT1&iji\MZ-4%(XjNAC`](q5ikgJ/7Q'$AVB)^oa<VZfK,Jq(?JMR\5@Qk'l"\r%-F3l!9[8>4"2XV>FI.ap"2Qff35,TSd2l1O+<n5togIU>012KfPCS%Es0&ae4^K7O\<GD#,sOC"k'.EqeSm;m8Cc`=o%<5Zm"'so\r%3iciMR7P!\IscOAZJ2MT#Ph+UTor_-TEhebZ6.%bZ8NBkp6i_p,h.,S8Z;2^jQ4iTaLQY)7(KGP1aL<3<\je_N]4N$?jEdm+tsoJ\r%Yd,ri4,=ea#P)$3j$*];=U:n?7j]!ecU!Q7$p--P$+Q>?$9PK+]rW"_Y]"6KG3HZZ8FTZBq"DCk5kZt$.im441f$"@&uPG77Pk6)\r%,WOS<Ba>.$M\RfjMG]l[.!WW+@sns'?3Wd^hX*V%W%"P>8CjH.[^Bp0d'E3%VL&@7Yo=Q@7]G[=$@dIY/5j&59Y_<O]>V[?YA^tb\r%YT$a:Ib/-Hn)^WJi!/$c%Q.7dO>a"ZX'89-q8dZ7MnZlL02._BBUHS!^XYt^\"bW8=sXf-Eq6lXM=2:b(7bdGXsTXqEXA4B#a_^#\r%>j8Y!5fkef'A^h5I/T+))CD*iB=l+TQ&C1WaEhoS0bPhs,]Sfi+on$/AtN-nB:ck_Gs_A+;d?J@7-B71#O<Zg)CD\0`H6rPD0muZ\r%-H<&'`WAU(4qDfj/>/ke&oq-QL8DTrP0:&m%TXfils$cq-d:;fVCa.!Qc4NMkMP=S7;n<A)YXdk_N-_*D)Fb&l14,:_?A@Abj(%!\r%Qp:cdX*S6_]i[A%G0JGL*8g0IB##QITsD0m.LB"N;u7qgIK*(Om6'e]\'Jt<]R\^()mbXPOjKk4NaL)_(tu4oa8>`gP`@^QT]R$O\r%,)A4$pr!PQCCG&[A#L1[i0"TI)HXNG'?*^0B!A2=XYI2"NM5cEP#oOQ;=J7FSFh[Y)TYM+B%,HpRhd+-4'GBFeHf_Q6b4(0Ohu(H\r%\NER<Cg%U\C&*$KW#"=8>quVA"HEt'dX<+\/aO7-$(FY)F#L.lgIX\C"k;6u=k!ClYU7Vm@:K1@dC&@q"_mr@7mn0mH"eq!j@Zn`\r%E<jkUrnmV6SZU8#<P-f)_o0&L`h]2^5ZQX_@Fg>1!X8<^SYSTg9i_CS28]R!/6GNWDn'"g-;;d5Z)XCGF=EmiSj582!`FlENeqR)\r%Jh;$UoHI^'o<UKF74cP6m/PaD"O+C^\g)b?83Y5+S&ilZ:Zo9>E[*6h<jB1@(iU)V@>N@g!`pkirG+<#*NXf4oGHHF52/Qn;YE,o\r%qL?s8m/2Z&Ddm?C?IKrH94/!af5N?YJK8gb)VOHeNI)Ijpr6L#]6^Sji1ddh_;,o"&1DQ7OZ;$!":!n/GM(5M=]`Pupfflc"a@N`\r%LJuf@/qWJ2&Te7T\>3RD<FZ3h08:3-l5\hrrJ+jZbseiO/cn4iQR"r2:+?Xp3h)%8$X<g`Gj$e9$2nlb#e<DM7=qu`C^2:&X5EiQ\r%\-T1nX_+e!A;lG>gM1HMlN\W]h'#asbAsGc]P)?uCn$?U\!)E%b):j!+:&qH$#D5Gosk?Q\-af=$Q_Se=cFf5\HpF;#s'F]"h^0V\r%!q8(e%SpJR&M3DN't".R,XitA]b[Af!]mTT+:;p;Jus#)+T;nQTS0VJM0X=IRu:ZI>Qd/$AC&X(.\mdfi!KBu>QbIYX-\7=bE.Xt\r%:\71/cZcBZ2;BQG:+%d@X2V<*IA4L%7:<r`p%ptN4kS*\S0dW;Zs%.adF$oaOW,\\\:EbJb,bJCadS;F[RrI1JZ0PFG"4d_;4A3%\r%T)Xk>WatOnh/kd`3UCjH#0H*%J:JZ\PRC]*BWE%=*r%4e!+.e:Gkn]eKm2F>#Q$"nr?G7gFbi!?<-0_3%]31P6732.j@b)->S?J)\r%>?%i+OlY'ail+6ZJ69oO(fR2[8pmI<PW/:sBU/2hH(CY#p^c52Ip@^mZm.8UCIG`l-.7]r2k'JW99%?9^q2;e>$m1VX.`,t;GGAS\r%hO8F&G-QM$/F_B$Qsm1>Q\7+^.!)6>8r1*jX[>-KBW=ul14*)E>J$V9&lNZP815:j8+6OceV>X=4upgXN+/jh_(Z^%Z9H8>-2K?b\r%NO+9d;59MWAf.=NO7Bqm,L(G\-YYCF0fh@2.XXb"q'U9b2lVb6+%'tgW\QJk[.bb(9GF:"Y7?>/'W.oZ>hR^af0K:-8:)Za)WM4+\r%b'<hcGiNl//OMqcrOl,JU@Y2MpgTWLq_,6ibfM'L=Wa-UGj9DkmL=g=&Vh-fRl!U(\dfmWY>.Ym^NFnU/R!QFm[,V1D4iLo@X\M&\r%`]Qh.W7"N$NOV'(F#f8D!\)9DkP;udmr*QeYD]qHWqdBTN?:IkTNl)RJ'hsIVJ>^`=iW`BJiKhTr2X(sAcX9DJN-ZN"O1#k@$PP\\r%0f9;K"ggsTA)YJ4'":PdA"caZ^6h>7;3"sI6kVlukBX6&H7<k:;O<Bko%E@=<c)&0&YZ3L)Jkdl<4go+P0d.;Y^E(ZI*eas,aN4a\r%oQfGcb]N63*eVADiB]:13PGARXV0iIr?.fR9b+EDASc!h`HQH/9>a2@k&.5(P<pFmPLX@ageG"(Kn=ZVat36GjAT,On#3K!p5jf0\r%Q8E`R]j^6n%1f`--nAo&LiMlNST?55lu(SU@i"TqiB%l>pj"B;5*DIA&?:P4Q4Gs9;CGbH_.c09kdH4VH1pk>&&Y3.0q#a1(*&ue\r%T4Lkcc[m@PQa4H$!_W4W*`BG2RZ!19)gSTf`"u5'k&n=V`lD&1QaZVO42t0MG=<%n8p'.\oZ`$cLDjF?UPA/s+KpMQi=cgd7`qph\r%R_CMBi;Jt&=]A2@nP8k>mH@uSV^r,%o5U9>,b$gN2nUT%?88q!l!a%p1""tYjatFmFb>lGDrt,#n2qfYgd$#%R#hO1-5TV-n><l_\r%'4GA*J[_Wi5"OO$i/RkaEquKD2pIq1p'-9<%J-p(YMNtZp1.r[CdjiR_`r]rqNKmm799MtZke"ds&<q7s$qj2]6ZWbEe@_M!^*1i\r%:PTW0j?#4])P-Bj0cl=7-WUWZbRDH,CZ>!i3BW453k4sI688rjY!EL0*GbgQ?^hGZ0[T1eX(3_g7_9])/K$)_c?tT50\.m#^;ks"\r%%dc6(Y\LP;_d(krPIT',9c7B)&W#Fh7IXt\Z`$pr]dLbl0VsG,*tMlX&0\clV1bU?Dp63m9h!L,kY)rb^PsH4^XD8saa$_^231EL\r%&@@0D(&O;m`J.%'``mod:CFha`U7tZ*@H&SDg^<QEUZaGhC1(%3dR4d7+YZTZAl>(M7;9f&-4^@E+RQ7K2c$:i0"ch\$Bg^@s6)9\r%17ak/8r<;D(/"&I*"K>KRre`!b/11$@\B[I;76Z6Ik][43/+Xg$a[+T1"T"5<@"69#fQ?QGikI9!f*7"i.etZFS`uiE:[Kk('/=8\r%j#jiPgEq66;>.B6X*Q*bH?E2FfLog"]5k(uL1tG#XM%$uKBQc26b;_ID$OO"Ch6!'5GX^QX<!*\H$rYbd<;0_ROQYL:/XE=@o8?^\r%"W?0LI%#!2HOG".Z0f]nYepe85$'"UKT!\@SWq1K:3L3Rm7ja)3]G4Q!G=Etr#fU3_,gN@<;!G6a$URBma9KDMOQY_R:Cbg@E-_S\r%4U/-=Ah8?\4'*2qZ&Z!md>L@1qbeVl-`=2j6.im@NL%7I&B,b]3+]8Bbm,D3(,Xg`:2_\uB]I+W+dGCq_'9'sDK$/;<9pV!V7hf=\r%XFY6G9mTSF2e0B42YJo8pZ-9t;G)3/Fu(]@l9/2]>`%&X.?K96aI^!p/L982Ym&p1Cd'TXgfS,@#22gk0'bjN.ef4l.(#I3q8EoK\r%*o6#<<Ctp_m.N6f%Yk4qapgltaph;d=O=`f2mE9@K8*jBr^]*r/EKdRfZT"d-Yb;m"%<cKf8[^mWoYF*('KC,U3T`j)`PJ[DVRkl\r%f3T3f&rqWM_hYO=EJ/QVVek-J1Yhbq0]?u7:pMB;7pSMp?9cGq#DtCV`+1ZX0uUsR^:k=jK'F\eW$`)$_f/3;U`c4md43BD$@DBl\r%b0@tgTBP7S*4C3TB#95GDn/ks9/#Q6V0Kbr<U_+4aDFttNRZ7t0mmY"0Vp]LT0>WQ'RC2JF($J`6BArknfUQ\H3OGXVW2:^/d^Cc\r%o9ACWhL+,Hjs.MI06oPKGa;G")?R+=jl4okR>KN*eoE2r?;Jk#E?fXp]i`ndqrkkFmJuhQ9O_8kX:c["d`R^!PB3&Xa],noDqQh/\r%9;1mEo#%\r9:99CX9^r.ROJ@oi]1<s$Ms<YZ"BAR8t<"gaoX[6$Rih:]3kXcn-GV9$us,V;M<L081DhtTWg?sXknG)>mJd)@8eHq\r%mS@d?-K+OL6H1DCKe[,n>'j]$$J:8e($)]?jsU$6_h?8AaIX-n+$mH%Wo.l;-)4o.^VeF4H2l3\]r]ug6R:a8H3+raZOdpnL]#-7\r%Fe!JSoDX3lE<"8(-X24!L;^'p6D18JJk*N07AbYDh[um]IfuCVQ4S_cO3nqZD$:6ppuK:_+PfX99mUe,+ea'EUFTXi'*<%TT7"2&\r%8'u).7ei;)YN#^cKReL]2s_+1j1eB'\7J&1\ASgdS4;S0Ct1`XR8fEoI.V^rcf'a_O;+jg1A\9-<gg4;om=Bu<kN`!Q8A-c'1=QJ\r%?oE7$&d_R"ltJsZZDU`Hb,K3P419n3^a>_36b>H-Y8fEXKgmf=Ph6]cn+.@(70S+nl`na(m6+0%Kaeh5;CABXj0+03#D6;2HMnBh\r%"\Cj_+k:@H5$G$Ei=S1"-T^_"bD8?o$:Ajca?VYMbM0`#D>2$\cO&0E7BfC45?c=?A.hKmPYF-&mG@VA^%"oqn>&&NbT^:1LMbqQ\r%J[tHq7T^V!(!q=\gUPWS35hMr^b*S,dUqVEflL#sRVJ?2"kX2eaLDC)B1@OIHf*8W&hhCm\eu*Cf=RYWi!&&+6j^=_mUI1B#9(Zp\r%a8$RA8]C=9>Il8rcmZmnfF?*"EaOccZGckLm>0[,\27)soKUI/cXodcONNd0K&+l8Qd$4V991oCUJG33l&g'<r;p%]mD?D=HQfFY\r%)=']nD24U#;*hl/g^Dl2@Qf'@.qh$"#&ETKmrt<pPVP.CE8f"!DL;qfr20`'g7QlDfb>1.Ui<g](DV\lATOY&f`"3;7p9086'QWi\r%oOeG6K5%88eko>O2]k!5Hp#&,I5PAhmq=bN71tI7lOrGGP)Uk7^lP`#nBVrj]"#J^2he@:nBVrj\-FNN;3<@pB&iFP*C5dLpdqi4\r%j'0N_T7e>#f<_8S$k%%NVPAk@=@$r2N0mSAO,`G;1La7M)?mejX3:X(i_fjHFAh3R?@I[-Z,/udC`@MLAl0\F84($_BOS";aq;Gs\r%4AKacV(afUg/s1f'um+?61N'/;1XlG'1oAK/!>DsobiQ#W;=PV)3l*Des/pq;<c-*2pQL_Fg@3EOL9W.D>cp>UpRqlQ,VX^/C5p\\r%'&Pm&<,(O5Xt9PrV[AfFDqGkgep#HC/H/seiPBBIoWc],+F$hkYUbXH<EU"s0gQ/bb&@DP.D)n\S!A[4kB03+,(5GUrf@2)AapQe\r%MZKVM7An:P!]fU6&M\SpE6!6RGh9)L[Tls3(qCcKNiV1mPeZY16,cpOr?ITHB'<fr,FeKOj2qGNb7.VD35&S(\l1+F$<7e"_DFLJ\r%0ig+iFEHS_1T%];3"rb&nNi9eF,*7/d`]>b"HSYnK@ueF0&^@emcq1l2*]fL2jr?B`H8JH<lo*g@b$F`C;bnfbA`s#ZdI0'6fHe5\r%HjDL,S?h[J0Js2mRkYJ3)T@#I9=)\2JPKh]KVC!6FCl[ggn=4?hUj@p)T<P3aUe_hP)E]]`!=OpXTq2ODJD1XrSU>a2=*hPcQ^rd\r%$D%7,7d%[&d"\W_RBG'%g`>Nt=bk`u&l[XG]Mo%`XmJL&Nb9JqaQ3++hs/j!2r!K+3=+\koj4e0M&/KX\OI)RBQN!GQg:O8CM*A8\r%IB4^TNrSH4@FrZkSWiZ@c#p?uXrA!O)Q8G<f-qmQW]NN*asleQ.7uE%l_8uC:EQ)!XGVnc>\]R9:ENc1M\3:AKQ$1)'eX6c>r-hJ\r%\/?(te0pu=@9Z]m\Jj6s@-!>nLfkdAmjco0UXJK8c\3eOr*!%Hos1K8GE`gGr&\4#,;T*C:!ciPC>E)HO%PH6r>8IYeBN>gL==dH\r%'XR-K-nm?CiAH)*_q0YihVXPJE%e@n\\`5UpcZ?q>nXSjs(,?#^b*jVQ@ru@8H_tjJk+QE7hDnmk":EJa>?T7n60&2,WnrI@_<t&\r%_>]A?0S.[Uo8=@*Q3_'qXuu,8Bu3FJ^9gi%0AbcqNT]1KSj,J,O7t-m^JF%?/9j.Jh(/jA1D_t7B"N;:87QFL>VIYca='RdX]*VJ\r%1AX(Wrpp[&$nCbkM0QBGb%G]W12T96fLF\!Nor'<.k.Wk*(nkJ%9m+;fVfb,/_N2o%S7P<]Lu3ZWeTdG>Z<&Z0PoK+n8*@-r>[bp\r%[-/p/#44*Zbq&9eBF3H-B=]?^F4nlCSEt:LDnQN*\a5]s@Ju<#-+l5hVC*Zr56*UBZuRslo/;Nh(0ECR,[6SE;F/fG0$C_^hTBkY\r%H&%k\M)SoYLf@eZib__QYLs5(\;a9^Y?prG0ST8F2kW?H8PBG/:g&s\4K>[3PpO!-#@$4DYUfoo7?!84[0"`cQ+$Kn(,B"#i_hV"\r%7A%e'>\\8VfCE1tYn/H*+l-0NafDrke^d:IY"%^8J5A-!GHbm@<'bi;A5;V6$nj2c(XO$A958q!<6JA;4ck/P_.(AbW,*%2I=6o]\r%mbGWCJ\"tcPsr.$%B4dc5\7&ch0at"*rLE>K>1aT_+#'LG%Ir7b$p*6QFj`1jeJS60o%F'-hUjdcbBWG5O*[IP(H1p=3sM^3VfF:\r%HEP:N-%*.6(>G?^prO>bC`4M=]oXUqepZ4:_"_XtXNCp0Q)s\fkOr:$Q5AK"QALF9OW-Ifm`Op(kbN%^g+@!icHsf'iC,2IoR+$.\r%A?(9iA-+Uq2Ofb#fmoKU(O.Sh1p_m.#-)Q0+benC7M@%Oq9-GA=&i0ip[P'_pEH7/$ps<837W*+k=IqQakQ0ZgLE/O"V@_kN)6bd\r%7.+QLf++ZSl^@AKS)&1Um&#k-p#YE$Cfj-:c7"@&o)_\\`+_R8%6)QXU&CqbQjt`,eJU*-d#J^<k05*oCJHJmomScX<Hf36Wa_E8\r%pKcQ:UMqp*VG3$O-W[=QBq+@GQlfRl]5U6?DA9>=/'&"XjiT$M9"IC"Y19dd#!L$5fh_'j;4TZEQpI:*%?^TgB>bqEm*DSXS7<8C\r%1'sCBU$Tp2e&l-SCGs8!DO^F,SB?"dZ1Z9!/(a.1BOO)*fX_AY@g/htXN9B*"F#!0jl*ARFju+<MR[j"bN^ZZLR[fNaU0)6K,n.*\r%(Q4E-?fA>1<o"PV-FE6T%%"H&Mje#g(_[K5^qj2J6o7c.g2OY""[3;H.`&1EIZB("A/r-#DT9lSTCsfQ/oR6C_/;<DTLb>*c/KCa\r%f#O&@(E%[F.bfhsgK.o1gsp6sKk$n[%PHNBB%@PH\:R$Y+u3A+.-dP`]00s8(FDu*)rsj+[n4Hi[E=DI+,8b>$[#;VeuLGn\-FT8\r%00WAO$OLI`)j_Aqep:q2?@;4W1Y-mO69&atGl^d$ffoAA]WbMMG56S5]CLP_BW8[=:pfT3$QGqN)Pn3gSlb\^qY6/`.(YbpOr0N%\r%2E0+ea8rfLdu5DL[Fe/u@<4eQQQ(hVMk%qjFeOJEAj9Ajh8iEGh^C9R@J9]D(A;+P#Ul%u8A]XU?GM951_OQZ/9XlKlg.YSB+L#N\r%8IXl=62'(Oi?e>:021T@-9dhP?'k*7lc+47_eg5_4%S3n*gLU+#/nmU=d%=AU_tR4mr'P7J"lki-mQ(#_/5SEpFMOe^oMmM.X4^7\r%)drqfcE=R\=ph&o1_`8j2fM[g/88V<i+F0L(_YP2%d,Knq7m]^U\V"bSVMkMEL4WbOp*HFCu5lL+Q#1.Q]X5o!*tg"C5eSa5O89B\r%0$<-b/2?]1V8cJjgPQK_C)>uNDr@DsE_U3\n\X=Z8H6g;SE8EEql+H79;pR3eXReBg1Ca:VQsC\jY>:-r"ZBO)\L0t*ki5;\"j0.\r%,?-tT-N7<g0VB1k`m$UT(uUUGEAOeV:1#r\Kl\uq+)ElA3B6Vc?Z8T5!7BW-!n"tTKt9cYB4S&(,@BrIa2'#&VK,r+[N;\r7^fET\r%nc_es8!3s1C2*u0r&D.1#]#un&8p'K_UBS'1;%OM;^;OCC$U^o<G,jjO*ZV_UmET$0^BsM8p%FA<&'VA?L6>PL<E%',h0=tj&0!)\r%dZ8FVP&O]f)YWud`GV0Afd`<MYB7-c^EB'mo"6<6X4)M3:(s!1HQTR>VT#,A*>4#'-q&0\Vc;QUe8\bI//SX0p0JBT]d,#4USG_-\r%Om(bO`)OO>[21`G[;ju7=R;IAODHbj5\-2f;!g)MQjO\=rei*!0/K9T\KSj[%rMn@p^'o8D2hu!#L*n1ik<!'e$?#/D"OBOJPmVa\r%n7lhhUN.;RQ<YqNQjOZgHhMiS<!3pEAZf"2kVE7Weu[c;B)PeSg-l%[f&bS>/e8$/.l^@g8>m.0(^Lrgemb7.@)0I[(&M6[^N,;P\r%"/"4LaBC"/"U4meCGljFesRpuOgTX_&%i8,WLfTSW-,<k1oC@aU1RjXZIUS9X`ZM@a&M[mZ5+gj"@Ip"h@"42e4KZZMP',gY4:$#\r%%dkh)>e8oY`4LIaa>J-^nCQJAPYZ<3hYs&o$/UP2_,J%g)#Y<5[f-+iQAV;r2'(rNG!+pOe6A$7!][TDX(7t1[u;@jk'8i^L`#o<\r%o!fW%)!iH?Gu1lqKA/j+7Keb`J5GVC+J`$J_R[%ZR.WUL/CkuL3UR`'h!prBY$o\s!#>0*!DjDT8sJ^Gd^Ed[[r8n+d:$<+]pKER\r%ZUnH9[`St$s#,3^/,&=/'HN><:+@UKnmiZUKIE#O0R.1P9\>5pegZ%l8!1)Q6J(&rKUM99mbS>9hJLl9NDeL`8r^Ho/`q#`>!P1=\r%PJZfX!rm@GjLmRVBVX(cLJlkOn1EJ=Bia_F7QCh4N/kKO!\WnD7%A,?/<%h)i66s#Jd#plgBB<a%Ce6*=PJZ)d:PLCYIa<70/Z$V\r%.EA1g(NC=E[P*Z<q:fLDfIGn^P!!@9<,;^7Z2kRV%V9O>4I'N;i_u_mVPom753&AH6WBtOQ3ZjIY1*"knXWXO+K.3APm[?bni^GA\r%IC;QJ%GJ>h`jDZeAp(3+&)(tU.qbl2Gk/[-'\k)/@!3n6JQG8PWD^+N>^!tIaH#V;k-AK'"bpOmL)<7Ya^lh_fU8Ul+FB]\gu,uE\r%e$.)@"9E9)Y-NXgcpgB*NeY^Hfb>^8&@O_,6h!mn5*jk\Ou4c.\<Y(@W3F"f\("_$()7Irdh-*mp=BC/jA3T#ZDs`)O2#jHpVs\p\r%)\3=J1frU-LIlJ(-BRc57%gc2ith=-2&12c/2I'Wk(O,R2nkj>pff-a*M$K%\UbA")@.""Dk'sKI$YO<0b%dP9:?A)G&Q0IhKTSj\r%\.ro.k/qJj'6\<LRbg$m08=%E4aI][M!Ea)T!1*<f5(M3T/jj]LPg?[!/7PX-`1=(U=:%1';fbt)^<?H<\bLiE!T?rZ7]E'LP[`Y\r%1Ri]")C?GA`lm+Qlt((%J66O1O@##kFGL>!3f[#]:uF?T,il#hCi61gF$lMelpaLu]#&[d(.U]N7u8aeA[;>ncH,+9a@ilVo,mmQ\r%I)&KiA:G-f;dJD;I;UuIh5QZY$VWBBYA*%:/]NeI"mNR&k":Ct("1_a#Ob+dOTc28Be7aeCtmr+N?)qV1MhuQdcI_fNIB,\5IJJ*\r%4e;3hc4[S)3SkkDB*D(]gPEQ#<\RcG_(b'8it*X0$5=3^2P+pr#sC<!NNkB?n+<;a`&*H21OWIlN?)r60u;R_Ug%O^\E?:',$4MR\r%1;"W0B#!Z=fc3E7i?/JI"6DAWGH+.Z#SVLa]21M^8%9E$=#+WNdkL;PK4VLoBpH@_%hiG"n?pm1YI[=5c<O?,X'E94f9Gn!+Dc5M\r%mBW2gP*VD*@JEqmMA7Q+_C[I'POmjUHhaI@cQmM!TPbU)-Q)$VgE^cZ\5s)rr,k<arGH6cW=*t-h[`BLV0B]ROj-D^';oF*6+38D\r%k97RA&&C+dO##*tW*YFCcA"d%UY^+EN7Sc9bXf]^)R%20IPrYkMp[/XW`VsTosf5)i<J\"b57ZS'k)V)`5[\EXZ[UOC^k9Z)Vj,u\r%XdG'-6:hdTrUp\OpEV:5=aWYWV90ORM,b\1@+uI+J0VpE\)Y.oZA_msh!GY8SPC*9;a-*RVeN`))IZQ?9YD*.7'LKc>J;Q!fK7L'\r%@^EL&Up8#YhpG2J,.`CoS`,Iad>j6'FN9]p*P%C[JfQ+:XK$oc->;mUXaC!g;.SE4/=X$`QATKcd?s(6K[%h])*e-(O#][>IKYNc\r%_ZX`,0bn2n@04%J9Z>X"gPb0-XCDh`Zcr%.U:3I8`SBTL"ZBS[=YqIr,`_D^SCR;NoGF7\@nY)HF]XeB2*X5.A3%!k+>d^KXR;l_\r%V8kh.X]'5p+1"KLDdg;M9WT(0"0TI\[RRp$9WL+h4,q9KTj=(d)t@Z-!#MQ?E`:qYDnS=]G_2"53)a8E:$oo%]H6YnR4dk""^VXF\r%Ad-l:8K)8(frT_J=9/N"(EP%OjNFH8]S:4Sc'$F-A)ic^Mbj&APYMDa`C1LP,)e:%$@KOq7cIt=P;gE-Esb5g.>\Cm7#acEc/#<V\r%5'ad8jMJG-hr=(;.(jl0A"]bC"^Nm="o"jIrBHd`@o\oc$'H')q=]6JK&2?ZmhgU@nJ&FESsXgOXHBWa-`k?m/n<J&kFET1X6PNp\r%"IWMoO@d6SSr?g".70;r\C;m4CPLhHeg[o,9Oj3C@)MfY3uTmaU#TJ#;^r<I]49%>*P%E'"A;`_g5Y3sDJOOmX-c7hiPi->>J$2T\r%G&<%:cX.B\]>OJcZWLlTn+df)L^3'P%#,HP+2_D,K-A3m;1'eS/E=i/C)1u2S4.Ao.k(!K!WaiWk#Kf\'[#j'RtYD4]tAtQ+bpG<\r%H%.rLgRF7.hL&!c+Dm.:clMZ?SMWHq4Y_jkrl(&lp?&.CRu[U,Y<OLA3T[?9G7mGtjIs@6I=Z\lG[bJ4j.F^>N+I&]YSRDuM/I@9\r%VmPTe.9+PpOKK\A/@l9BH9La`_0L+pCW7bd1*re,nhDMfjn+KIZ"TR6g('=fV_>PR58o>M\jL^8QHJ@BXFQ73!=qbR'V7;N6`&U,\r%(VMj9q+`r>'l^ddJ.SfOE)DCWAXmN@\^G=.YMjS/.USY[E.*_q@k`hSUr$oaE=*TYZ_UeSVYPDmA_8R#b/0%YJl6/h>ra(O$lFs>\r%G%G*-AW_t)(%h)cO2p6n'`7N/@Kio.JdfKUG%EBu^W?BI+puc^]K?\X^"eN.jXdVdMlftpp]W_95(=1?MjN<EY,oE)Pe*d`^VZtU\r%DD&PmSqYj&eeG#SC6o'APPa,XGsc.a143;UP^#'0^OjVGhFP&%,P;F6'6;cD9B+_#??9'ep."?0)l[1!RbUn%0B6D<Ro"Bhp\1fF\r%WL2k>k\c!K3u+g`Kb_K_h0o0PdBpE^YW#J)+?i!a1>uO@;UimmW3A3Y<s3B3_aPd^^0ZiIU4S[F?nZ>S$@="?*cO,_O4>7p0X%FJ\r%hJ%^mNY/P=(_+HgW3F'DN-Zl,Ip$8ddDn&(9>(;-73H8F1^MfTOW.8CkK`R54?kVas&Yk*)AeBB)@<fhN9%9hqQ0CCVn"A8b@3l.\r%<P%acfm)T`2pGnW<\C*)kEF<Z_6*hcShIkg80a%g^01'o.[\&Xg9-e]"nfur[O[;YY,m<539Ep)_A[S]1g8o/ranLYrV,EG#"VGT\r%b/2lT6J<g'>9u5mbT7!XeE>%#eiI\M(0dml530p8Q%_)-@943`EbA.,!]Pfb1CIF/aIl\CqZ7bUJ[\10JeT-@*3](tK./k.hA"hp\r%VQ_.kVijjH*T?30-F>t>m&N^*kG1&'/oZ47$s+u,3kUDQ/CpH`R8.G9:X%HX?I':?CC'?<@2Hes76WcT2@<!=[UL7qQ5b_+]'u*C\r%Pi7LR\NRZd&mFX-(e/;<I1R`93/Gk"`L^61>o$.6R"n2mbAjB5H=Y:ANS]i_nhuK_n;abZhO]cLA<P;#VQdE/GbnT+'Sa4c8>klu\r%r2WS7QajSj%TF4f3)-;'b$%Q*ja0R83)/9j"#G&i5*7btP?u0X$_GX8d6_Ss)\$AI9(Uun#<<2.i=ZiO\US(@gNmssg%*"[%;o^D\r%9ghL,/bl>QpH7M6VjZcAK:!lH=1gO_g+s]n;&A>51EIdcj\N=4N'pqceP'*bRg,]W3R;oV1@:E\Q(0,j]I&lDp'19"2n6WlBgUlu\r%C!k=2^VH+@?I'B*KtY=I@Y9"3ZKXl%,8"'\%$qe(#.I#?ggCmhPZu>D=5BLDL&"hZDfBX#_9K#NpK=Y@QrfSD$_&)m0fRTd.#AVo\r%GEHsAdDG%#ZG+VZC`a9KBFEj&!E%'_ZnNRP*,Z//_X`[cF0WU@[a$FsZIk")I/C#eYq(aI=]p,`f!Hrc^K=X3deQl*go`4-An<]L\r%gU&Jh^W6ja3#=d+CE=Jm6rG-B7IX:L20sj4lg,t"ZU>TiRJ6Fh'tQ@uH::,N5NLP<(k8R,`Y+q6`QkSud@Bqc4I<J:c:s.dK=@Xs\r%k@u`a8'M*2-m_EZ:>3Qcq06)f!20&IZ-dVqqfs,,4/KKao`-jophgZg\'>F$aY95X^j/i?gJ+k\<u0Pm/@l@##SZ-V/q6F>)6n7<\r%S"5GUoGBc-$F@oeXf00>#Ao6Cm=X'=^"h.T5!,P*4O5`B=N_"La+R\V9]^rZAdC+5YK,H?A$5&?Z4A8<Mi'(UJl+O:H44;,+GS(o\r%'AI04]PSWO\8gNhE%`*,^5?(-;sg5qJf`n*H=)@Z*G+UHG.SVC2c(VFaP>&iB!B[.&s7?UHlKchmNCFQB!eeb6qQ$3r\><6W]S<*\r%(kAL<b$TX"q((2?"aO)V'N)IdK&Fj0EqW#i:#YJW$BpQl,N3gC:)t"OlGF%f^<[hPg9k/9Y,**/h9)Q\6J('Wo?'+D?2;[n0(AF+\r%?t=1Xot`7Jjf]cIgK<M@aZbT<ke,jALQUF<\AfB?7X&[!me?fC;`[]@aVMN7a+&8F\f>kt]<r&jV];@3lYq]Tq"]r3"&JUN<,LFc\r%G&cR0k5ZTC-GXNYc91JR@9pFFk@EVm=lIAq#7i'r*URE;>Y>M3;CAC4*PU't@D^u8%.*bhr5B#q62_>Ek$SM^TOEFIGh2q=5eIRH\r%QZ-pGPDEmsH0`fE_(tAn<^V/>Ln]\*V]bH3Vt4.Rjf7heDfU,KR$alJXJb3Y@=m>D958o3nRY'c&'?rF3)Fkp:*<dAZ]O2O,b8eT\r%)eN>6R)\7qV!o(sJ`lM*Xm,k:LLIfR9"i]`5K7X[op`Y!@on5&3Hur=%@K@ZiOaU7i&qB>]Y>ms"BVU.YpPHYk949'`gTa)=[.ld\r%B,:t1*URLC+H82m/Ye33^Ru$L@2]N^caGEC8--Yt1j4gWYmf+O:m@a,&%a9bkN[#%_FY'JZig&3+Dbs9ZlNsRLM!-dFkfg:Ji7YI\r%DckiSoJALpf.@7A+,gFue(F1P`iq$Y@FJ]@(8plaE17g]m>2B$](\YI(8ld/"(NPM(:J("g33=K0<EmeB(>d<[%/3)eW$IL>Z<&n\r%%4[D?Q5<]R@8#X@Ol9TX$)8!j1tKL)iPmRChkDt$;[3+ZN=G\5i#)]d.SOgdVF@r1'I/=2SLQ"sqa-!iSe=Wde"XV$WBuA(&<SQ4\r%(+oP'm_2gY/R$eR,!Ae"nQt4[1%-u$U+@Aa>g[:_J]#`C87?eIcUb-&"VC!T'O5a%G,i>ZL%hOOp/nqM?#=F_@;5nN#X(1:Y,pCm\r%k6]GgpuH;OP;NDUF8A^pdK1LRq"^A1d,@l"ZZG$,/@Jhem"d+o-;c)F7hU>s<n/@bkp<o+@r'\6;7j:8m(pOk_Zu^PaCKT:L1Aq3\r%K97MSD!fsDC=e&?j@'@)[1^b\3N>0UM<_a5]%I4/_u&K8$CFShn4)bca<i'^]B\.LRk:CQDP+f\di6T]aoVSJ1=7=!bBN@?b$n@^\r%6)(.BYXGBYgf:giTTqrDj@Z?+?Zp"cc,tWU[;^aVggK%"n]YZ6g6KW8.gmo<%i[RXG5.D>6e^8%/@B9JcYb!p6`#n0Z)Li6cR]pW\r%/92?NXjeZ5UL%st>*t?cp<:CJR=u\R'VNC.X5ap&?1dD-j?$XK1=bN<?]t^YH>o"b+U(GX"7fqjZnNRPOQhQISP"7N%PN`4S<_qI\r%L#*rknc@Ujn?HY.(4Wg!d(pD+P8Vech2bS!+c7/eS[\.e(?>4k4#I;oKn`?K7h(F4M@0/r/PBMK1q.!%K_gShB.>_1<EkQMbS9bY\r%f61&@Y#G\H\O#ekYY\*ISlol>AcWFUT)Mh)p2ag&ND'\=)eD#jd%4CEQs!7o`WE?p@u'4.K`;ErN==/S%-<//Z8M&`&`,H_.IZg5\r%CWd%=1Q+t?(4KR![q(p`=Y4"h:Q4[u`S-edCGShl>Hr^6+/+tp+IPS8XtVp<>C0:nonnId7'6gdIZO'8#B6!YGH()\*^dd`S#p\H\r%!^4I/8=U7bJP)K3M:^)X8NgqD4RcS:JcA#^Xqq]%nOa2NKYObnZ5[&]pVtkr/iM?T16KpEgnpX,RtQ0W`&e6;Q(5)'6,]"?#c]mB\r%gm:Pb&rqtCVuir4E&cs4c(_aS(/8U7l&\EG1D<VP?`O;e:B`nNBFYYdDfBX+_<p2=-W_FEer[4-:>"F]??:`<gE0QXLrU7qOIIN&\r%'4hs!K+!SmV%p6:OXb/aTeq?n7QTGpj[0m(=Qt6.]bC&mN:aic:s:YXd*d9GBEnj5+."`ABEr!G8U.6[lu9;#+AKPuB/C;a5#&'p\r%&!hPiN0Tm7dc^CcE)]?A\d7bK[?C$24DH^2[O[:'<YjV^*_!:8D'."h``uOV4DB4elXafF%Q@m$-u'H`NAIDb>)2WUc(OHC)l)QQ\r%*Rh1<StLAZq<<j!&M4\S$AY**/X/OZ?n8H'i;"1Y`VBu&%8Ol"otI:P'NcZf$.:YaEk'feIB@&+[M[lipmOV464gb9nfJ%E?!7(o\r%DQ&,B5YY,:b"34tK_?Ii0jE+`mLh1S8SGqHQn?iAj!%lncqaGZN0`bp0a2=[EYV?!]oZYP?pN;`G)Tr4&%p;?nXfDV3C`;tq%"ar\r%3+/DgA1AsClR'iZ\iGG0j3jqCT,01$DT9ZP7qKNDfX#>dC*6n\(<uO1JtZ^-3pN<:fTKMP0Kr;l$oid8!Fn5`AA\G\q<ZX:LXoms\r%"1WdYR"dE,3P_IkT@&0tUXY[(e;se\-chm;6X*La05Cn:G(f)CY`]Top'mbGL3Z=1.lnYAdP-<BNDd)rZb@Y('a<jtjH0'?D,'!(\r%V((2Kp<a:,TL'uJIQVdOmG9'7<n5Ifn[:2Gb4'/a$->Y!(<;4NLahg+MZk"5i#O<iOIeO1L?BQii;8+/62K,-+L7^m8=aK)blXO3\r%mQRJiLKJQe'=+$!%H4B;dN(6>$GI9*N;$\Z49Z,PAj)39-&_L!/qNQN@Vh;Ki\m?2&YeT*RFb@2);\`]']`BEaQ8K?E>0RXn6Q[J\r%P4M3(]Pi%uOH=KsjFd%f[P4$gmtu"mqQe_GFBp@Y,#uE'd<P>dfpP;8e/)UEAb!$.Dn>P63F`\'3boGo`=)89`?E3AJX(m$GenAj\r%LJHbj%oeUPa+6]joeKtTKD;^3d0P<s@TppKUZLEFd*`gN0#s5Wmf>)6-VFD*#"om=n4+i8JPLibg2/='?sN)`8a&aEdWZU%fY.]Q\r%Mq^V\%e)M@8tMAFT+X-@%hJ:$]&+=N`MNC=IZrqVWI>2U,V0=$<BafmRh/!,=q+A^=pPiW6qCfX5Q@#*pnse#\*jD3L'.rCRs)Pm\r%rk40Of;]Pf+2^]uc3N%r`kOqHCZ9r*k;O=r:lfN-)5?^HK/IWL]HmrSfep,?f2tG0+dn%2Z+)"gKj-]3\uhI]1dGOTbMXLTNe(dY\r%/Eqr@_SND,B;5@0N=NhC%D^Nu:I(sSe]f8M%<DK'G-0FA%6_r3eK%TU>4@K+8>QV-FA*!^K=4_<rUiEq@CkN=1Su7gkn7mc18Q'r\r%O,7>JSB9_J<)%S2&P/(FWe/9ZUHC%-;i=+P.goAe5MR&b8j?j<M.4rP$$)EP-1tDZQP;tXK%"XTZjhlI*DD;aWJ_[5eh\R0?,]3?\r%@J9?M[@TFYK$mPlUU*#2F9er3bi76COdl(@=LMRNj<!V31MjhO76t/7I\f>Wh!OV=*j&W(8r)pVAMUK92q@%51>73E6j)5;6Mk9l\r%^0ICj?R4-7b+r*7QYd5,m;`c/%62kiJKcH#h1L7:`X/ge^'?%YI$_0"LpkDk7!.$j*icj.$jjP'1goB!?kdR-GA1t&Dfntqgtm0=\r%,GAY_5Q_5<h-lO!9N5gjs0hIqSIgA;cC'H'32W>M+!e3KQpp1_0rVnE'P=^$I.fg%6pq\N6@-s?E7s(^[W#.^S^[\i(sO8.Seo;6\r%!13(IiCu7bIAGV4VKfN4eP+rKQ3WB=<go;c0(T,Kh&3J>f4?i6+KHE5G-/#$'g9\1R^7=QnZL'JJ:VOP9Vj9kmu8u3BkAc)EAi]9\r%i,(T9Pss(N=LdZP046cp9SRlZGlE\<%.'!X44GL/`hOFmmH%@)YNNq,"05L=G?o#J$Y)$u2u)K7TuK&42l1*fL<Vck7Fp-e1k_UX\r%.c1PsP;B932XB^Q=_H^jYZ9Pnc]ar,_a_^]"plYtV!!Ug"tkP;A@>buF\rW-]BtJup\<=aC9_Qfg.@QXXXql[h@`FF#>)+eK7De.\r%<aaDC%;tJj\2tiT4!,C*'k:_d*9>&[_oiV:s!oM*s.9bgZO:$Z4"U`$Q4T@;%"!Vr2)eLe*NL>SV2S;6*hsmrhVbhkK,[=_jh0Ms\r%IVV1QM`P_;6\`:jD:,RF`/SsJ1hTLO"q3PB=XRb4)r-o>64P+2ppN@S0_7k^?GNd(\@8o_9m!j`'HLa"$,4Qi]6lWehV`"X_<lrX\r%[L+1QWor?(8cb^1OoM!NQckAT,O#EA_%3]`*4^BJ)eofBNmAq:$G#2>??#YV.d7FqL8c21"[bos%"1M[Es9WmLFOmh+fbd]flK==\r%kpp.*O$Ws]K@5+d.)7<8PhrH$mMH@s*7Omp&-X?N@pjA$kEmmQVFZO8"a_n:RsR^do<.)dFRSgQo^!:%X4pgLZ?Pj<hPlc%0f1)\\r%/G:XDH=$!5&-Hj!Z0*@*-SGV$HVUC^%(qqfUOk6/L#j4]Rm_.aN%cjW2X??ll41\E=GNush2;?)^l+5lSd-_Q+\rH_QdU,qbHTWg\r%ke/`(p8mYC/F<p.gm]+,C:K\ob%/R`%t;6i&2g;I?<i<d)uF*qpVs<P.'9m1<`!Nd:;&NdmXg%d<HZ`*lD92[PeA`iCgS`P(R;s^\r%4Ttd,LZ+VDdpSu.4W?PoAb9Bo.1D7-n?TorQ$=./WUg/t<A$`3jTX.CbU.[8UVOCcC9fesfV1L]g@E*8@hp%CB_69N-MBlp47:p<\r%-cWuAZ8[cuCig>&5P?C!AqjC)HT<%aOdil]`ST!+<T^_nQQ'^NVT%CQ4Rd,r86?XS_nHDCPaC<76AjM^UWdT$P.!;BRYB7OFh&qf\r%p!g2KYrtacAsW'!WguCiIm.F8[o,o[)ZIH69A8qfBa.O`eZE?A4t.ZkiKl]#g?L5'(0&JB\h/bWhg8G7./4RdX('RI^&)?KF;-(q\r%.lYPE*:B(eWjdm&V3'P2K*/I$6P1Bn:#fRi[qY54Ou9Qk0FOce=)h*r04'*_T]1<\_)@af4\ON./1JB8k:[GNlh&$'f^j3,SJrt/\r%ET9.gH**JMHYiC,k'd`u520O"Qp#iRVqHbsiB%("(45rJf3!SSPFt@[6$no.0QNM.QT6=&Y#01Vb`m"7e9#9<Pq#l%=jm"U8Vf26\r%`:AMmh^d%FU[2.3hj>_cL,VZ^Wp_P+8(k5EXiuqpfA8Vp;PPp8R]l-Lfs;r)Z_S-U]qS0Z"p`G+Bh-<Z5K`+0[$H(.!>?gj,5hC:\r%)P'h7SCB\]WFFN$AC'BZ[$#bie..h>UU-8DP2+\HY@paYa$jlBg&8Tr<kDB"_=`&?%F[7'gg<J-b^b%:N]pE5iQ5<"k[ptsa<Uma\r%oji..(Rocuj9R!OCJIX%F_)*JC9'mT[juK#Y76C:HSuOkd6-^9"[8n^bgQ_(hHq'5A8"ba&':ZkX0^hMGi.Lk<p[(VgFb/egeG"b\r%ZM03n\]U&mD+9s4Kfr)_l7Aobo`Sg5jG0Ar#WW&^`Mq/CO;c.UL9uRTW#MV@K,\cPRZ/&Gg$;gdg2CT.cmU#hAO-VX@h]T)0ud$I\r%j30*E,d^N(BmI&kPbZi_+#1Li5E.9SMhOXZ?qisRNT,SkP:9IJBh-RV'P`M'qaTNA:>`,X8:_Ir7#u<QdN0Nt)QPo;C(ucI0WXfB\r%+8_qRaoi^GG`NWB+VZZaMTQAHaY4DmEdj4)YYf0$k->XC/_*LOLEW-]kLnt&2G.gXd/FBJ/b=A%kcLMh>VVT?(R-5Jn%l.AZn5+?\r%S7/>W2*k/4W:d)b>NO`t,pp/R.SDOn\$MkC2\rd@]VB8,Gh<DI5VCfSd4E-GZtkQW8aH9FN5EE"hMrKXDK@M.[p-HW2]jQio6mBG\r%;1i,>8:p"bYQm$T+G\U1S,mf'R2I*A>aF4S9=]@)PrMFUc\YfCH%2%,VpWA/XKZ=Q(?d&m6.*u9(,gO5[b.p=a8r#tOE)fgL_b/F\r%_/B:LnVCKAdl_kJ=5o)bh,Z,LX1917#m^c!5?"O,3i9p>JuM]^SSq=#A!YN0G6AV`/od`B(*BZ5l:"6\LIK-bX#F;lOb30OWjWQ+\r%&l)U?R@E^R@g>r-5\1^3fX.in4KPc$hf5kOY\@%2TNLN&!48BVZdk-]/n^AlY[2aO7KKF5G4fG&IBbX`rqOF_!RQQp`<mOnALSN)\r%bQ9Mf76sNRT;%&8=CLOdCoY\MM3&M;BS5oNKtUX(S^%#K4%s]aR6m5L6joK\R3>5pOj77g2XJTGY?)KHOL*J67>bD9,fT;e[-c"F\r%Mj;6i'5`t8ojJ'=?E<uKQ%_eG/C#b)!7`j-/AN9[q[0P#'/?<+:1?jA-HMdjX?EoBo#r<E(3Ic.9,)l.S:V$"3]/*uB[862SQUW?\r%Lt:'HpY(I;c#a)L#ta6>P4m+/gG=cR5]t4;$\*<A?l#k"fCrVNO1d2P93kc5^&fng,r>Zi&uG%06Jj;lkS!+_Yug#c^KE@D5YOLJ\r%cT1I7+.osM&sCJA7ZC9?$4"l9:H==5m7r@.CX.P)UVgT'6*Th7,2("fZdA'I3T/7eEKQ%4Z7uVfZRcT$-mN<Y,a:\`Rt4UH>SQZY\r%Q7\#I)Tn-J/IY2h+eE7B>SIE#e6f2KG"lX3B*_b*8W$a.ancVj3"+J#$P1,.SJ!er:7?:5qgM05>W6r69Um(P\GlXGga%-/(MGau\r%3Y++9'A:a,IDM$*:\+4p=o9^]i<=RKoIYc7#OS0=Vuretn<u%B&9Zn^N4AtAeReuU(6Ko"QA%7*k)S,6p%eRK^fgRYB*!pb=Uiuq\r%F0o/gB`WLX!H_FGg>bDEi%283c`YS$'_U]S/In;)koMsZb:GZ16LOi/3KZBRri8&;s$LP"rfBSTHN[_h&CPMu*0>l&C+-"kc67jD\r%DBjt(omo>N*!)%2o[%73O8Fm#lH^cH,pt)%<eqiaTp%+npV/`\))9lYACl,c)l1.<?7K2#?^UE!3V9C3f!E((HMSa%Eg!PpP(CP.\r%7ulcYN.j.,)o$C)Cn]p*hJLAto?NQ.fKs#A%ut73ZT?$7H;=qIB*DJ(p=_iMgpCn*Ku/b"B6^O&O3jV76.b-8[au5>$M5m8\>?0s\r%'b7imTe,@$eBSC\`CuIcOZ2b0rb*dQ'aN@Ds+'F:L9omt3r;FMZNk%2+%-lUK'n:-R66*r"N`ptP6k=fl&:(b_#[]+6l(=bbr"Z?\r%jbl6Re0+'IVo8g#/Uf=(ru9$'<J.GK(G,7K>*"C[a13$ib"kZP[W_oWMR*H1Ut?$#ho?ngs,p%%mcJq$f>l6afmM.YA<CV^(4dH`\r%!I&cXcFM<NlniWhK6018$W1jO;4e<k^Cp-F)`\9JHMP6"3\Z.#^<Ro.Ws!k1e5\YN(4XM1N)s[O,]d?b:.I[2Xri?oFf;Bs7;NL[\r%4/ej;:@?6''-,/5b%*M17pApo;M:GZ>5R+"!,k`ugp`8/'"=f6T+N"Z,e`IQZ`/!/rFBT*+p6njTp]])J/uc]hd)bIHuHDc\N&m4\r%3bte^/EICDgLQNW>^9Kqmh^"Cmd!I1d)#4T3uEuj1^_onH,/>#kf=kZ.&ri4d3t5:*uMk@Z+8M=a-AQ74\Ze_CSG"Kh=UH(&T3+8\r%%SMiFIM>n0lO<](N@H42-MjK@^rWqkeF8"i=u]^iC<B]`.g9Zl.Q.4HTS=mR&%u"Z\60b31*R!1]Tk-DZPU-tLn1@qpqSSlo,Gu:\r%f\"]*o##bk,ICSof<]F,GYp`LQ=sm_X]pT9KP9/,IZfG/IM3P#2"7sGPFNW5Yu_iHHLaJNH9ir(JR4HT%F3/9l%)M(;_DdIUHs)X\r%0@B3C-&n#]>8c0iTP(OTE8mNgdtTT]-T:h8?i`2/7]3ePV;9&TXV0V\rQ?;5^JH0oWTO]WVWe.%(hdk4;`%k<b-D6VO8&%h%#P:E\r%K<S--W(#$N-,pM-Q>9,dI@jFKjZ/*6BmurF^c:s(Z+SE(jO=K]W!en02EnU1$sa+XTkD%b4mRN,Bg,=VV$CWNB?oV!N'kqf5O)BI\r%L!UHW0$m9AaD!UhF<)3RT(Vr)N)tm\U<!>,(Cnb(2sJ]<7kRG0>gYpbqS2B"&"3#d%Z9qZ\9o%fN8/!l-gh<N%<h`+T(Q.XXJZ,1\r%T\`=?g]`]9U=.CF]gA%UG9QIfYa+(_ERY1qf\4?l.^cC)*6#P:(l$o-cRH4UX>:DI"]66sb(gbq'omH9]n*[^m8e2\<=+;a4a,8#\r%juIG+E>4F@okG$ZJ*I>tX11-nbP"juf-#Y4la)*Xj?Ys(Qg-l.hF#bDS<e+675NQc,#t:Oc%G&m?TT=a*^dKpB,115PT1PG0==%<\r%;B$-mBf%'[;BQ!#<BN&9H[F>u8+4PT,F6f*pqYgM\.9GE!l[ldH19%$PEQ?E7mGWnc[&`+`6OtI'ZeNL3#ZF64S0[U4aCep]J\eY\r%/pC^=5%ZhIrh[8\S_orJ;i<"T6qWb4mo^JZa930JER%+RH/,F:Za;5C>Fb'j4mQ,-W%d<@%M88m`oEc4j\HNC/`b%%=#bBe=oZN*\r%lR+\2]ouTN6YBKg2#R-s.\`+gQ]mW&YKqWDD%CUJb"f0r:N$/"[LqlbPM;ce,;gW>:s>/=2K7),4A2>Y0l\d<l@&<O\(D)^n.l1C\r%hc?tZ4%!KTj@7J$GEWBNN$tIil[^F#b"_]gkT[NLCDQqger*gA&"hWZ3G^(qe!;/^,\cZh'[H-'+5IVKVbWc6BmaHAgDu&E&DD[0\r%+!GWN_&bcod&OGhm&@qF<`^\0G/2rSqANru:`)h7_C1jgQA$md<OZsE&,r8K0EeHIR]TBsG9/0flNY`jSYa[WNLsFB2!8or2B$5o\r%<"YLSUMt<`K5pU0E0CV\`]]&-ot3JEqS$l@A=u-/R9gX6/kP63TE&MDk`cG+iT*I<1!HrMEjCEhhi>Q:aiWqSVf5FP!*eRlWHrSH\r%#h+KSka!\%o_MJdp:erTp))RQm,1;%a%d>4BWqtQO'03*pi2hed!rJZMX]W@-/$9a8S"=oR/O@)iSGR0Zi?OgP/oU9^G=^TP+pdX\r%XM1Rr#;4+\QR%]55)q;3U`kj&pRJ8dQh7alP!m;-Y)W_qp$h+KaL%Ae^tU7W[(O[N<GcNLE:AJ]]"814V3L\k-5D:OHWaUUA@4`2\r%XVZ?#SgALpg>XM?.kLsP'A&D$Uj4#J_h;h$,n&`g^16O4HNu/p0hpDlZ3Y>l>!1GY&'O)(/3i&EZlOhE?uNM,a]8dd/(D$)[jVJi\r%Jmpl3JQ%IM"7pV2*F9_U.-u)N_!FKE4<s=e_2EpZKcNo&Hl!E9r4/U4_Ma$[Kge`Nj$>>PcL.G1`P(t3VW#M1M8FoZKpQCL=UsdW\r%/(hMU6?mLK9@A$):]/l(0V(N\e3hsq0+M6M#'b-M68P@cb(Uq0+5PQmUg=<Y!mt7t<^6IoMt[7$(7V>B1fpJV<.KOl`N$pX[(F[6\r%,BtqYi@;*Oc25_JV;=!p(@%oirt\]-OTkneoILb<V]tnOT;sse+NO([L3f68%33oQX"SaQnkHHU6bfG3m[#bZ"[-]ZJPV(uo=W&8\r%>KZ-M5`_-]A3KQXZE7JsO5f$Uq/D=7Q!fe:KDP!Em61gu\>6n&P!1:_R"id,j%R7o@+CU_TbFJDSQI2pW*ruTim<P4dS?mU$;M8X\r%im<P4[&\KN3K%@DGTB"Aob?4I0h"hCcb\00Y?fC;U'P;EPu/B&%tkiC'gR%5m\!JTF-YH)JDNjM6^@r*:oJZ008,p/d3@u?7U&;8\r%#KMJ3E'0eJKk:oZBe(;dTRb@h!sn?D/dbG/gM1Y^(Br_h>OCedBbcRIg((uMGdA9taJ2s3kGWuN1t$>VA!]";+eE4A3!`_2ScL*S\r%5*k:F6lJ0I8[MFPjKr)d8/;AtagP1oM2T5:fN4'>(Pu?9b;uHBJh3%0#/Q4U+BfQ"9^(^cRL7C3Vl!p+#@Xr(%5/'`Q&gZ^\30mN\r%]I;.5^p63Km5toI%pHkbEH'749q^X>O3guc4:(EA5:mA8Klt[a4/u"I4=^o_im3a@T\JO-Rn@>4!Eo=(Z9ZTBRL7Y+-^9>8.-dMc\r%WKWN<2Qk,>3s]$tOX0i_7,p0>,+7b%Cf#e;`^QB9+P9@mPf'nV1l/T;!_3G!T4P-`l6[RY_<4'o<#pX?4pQE!`N1I2Fq@iI2k,AG\r%:;:H85n.C"?QMmB:_2#_&\K1&jET$D:gE^^4/ekP=:I,L`G2?ZA.uqfQ-c6iY>@USH#-n?HZ3]U:KLLgB9@/@SS*MT^lAXI0"ArX\r%jUQ%bU-MSJ]l\rW%jHG,XFm`l=mT=0m[b0+CQj`0H17Q\<C>FSb?BS;pRDtc7lI\)U/<\-^FOlWUL3PmfZM%afE=[bOP&=k`]+U_\r%F&kPJTs&C%4%bN18/H`&ae,5;;.gHY9B>jsTX6*Yij2\lKbjoM`pFL-)*m1N6R_FEeZ%+fgJrNj7UKNLh!!`^m+GraK651pC@g2e\r%`Ns@#DmRja-33p3B\*-N3I#`G\S'M7XI#Q#Zp'-*i*sa";uFXK2kGY7QXL1V$*,iYS48uI\*_K]Z[NTe%5P<fqd)8nFf;XNV9WPJ\r%O$,VKPESGY@SjDW'):D<V8[:mHVkdZ^\i6S(L/-ZiD0hoKu0SBCIN)Vp:70/YdN/^fabPRc3b9'kUq+R*o<E4oHV=Zfmuj0<-@qe\r%#L;=i3K)]/p?;CB,r1Q!C"AFhgjlMJ"5['o6J'c7@QZ&9^.?+kroV"!R,KT>eXECtS1Ti!hNU0B(4XP2X<RFB2HH=A;&5_^hC.``\r%<n7[$3");UdY$`t$d@cb2#CenSAjB+(;!bp`k=SGBoj%rp9bC#`?0.:]3<I@i`U9Z/8XK#G1;sac\_g;@0^Eg;/;cg5:[5b_D5Z,\r%UXn3`/Iok]O4@(]C<c)o\dKo&Y)i3tpQWjJTJpHfGpLLY=R;c]Xras=4HaA8iE=`H9eu5!!NnMN1//f]dXg'>_PVdFibPln,FaF0\r%+BnY#O@MB<ddOkP4>)J,\GH,P@p^e1G;6G/`53Q@0"X3=f[?3$M]Jp3!,Ya=ZrrO7d_U)"5N+Z8AZpBOa?kpq#5oop.p3RA%Yclc\r%0\fZDqPbW4ZX<p+41NT8[Hjoi5rq%YoUcj._WKip]I4bC(N4(TiYKM=>961iC/'cM[*X;'+=(iCnMX\fd$;`(ib\iEDF^"?KD9W?\r%RZ2YL(ODM^;9B\;PF`QdcO.%?fiu+k<qC2:'">&hS(DE7:3jKU1IV$kS67W*]uV7@U]6*qUXr&O5<L1R*:.1Ae%Ap)kl3hW;+'7l\r%bY\OVm?5'\nOCU8@$L@tP>i0\H3$e%lWJsc4&8I&o1mj9I.r[Tm&W_]lRgI2B<,]Ung2Yo43RW,jC%_pF:GDni\?WMh1.#K(Wt\S\r%1@R]`[D)9cGDGkG^BZ`<pNI:qM,'Nkr8RhmGIqCa@<:!`G^'(fG=R,qU`M#2.OI_1&+afBV-T@FI>OeQGDALa6r$MA,$G.U'GL-F\r%$7]-pOCVu'8%^o?"ZHq.lDVc6muIBqORg[_L3u/+KHJ5L1ghD9!prpO/N2h-f"8i8!=cV[CSN)a"TZ&1AI5"01k3EZqe#e0?Rujo\r%SEJ<72e`_Cm6psls((^uOk_&M0oVApOk_J-SL3i!%n+e(X/"nYF^Vb&'8eBDNJ_7R\T2M#Ab9n5&$n@DO3,bCPg;X.AnffZ+_tq5\r%f%Q#lPa`ZhdT..>dM7b%Q903Xgr4&aXS#q5XkVacQ`5PbF5^9]\VP,P=2MnU<iXh][kSGkRQ$K\Fr:DLYN3!j:=6?*R74DA5_Z7'\r%'f6)kBH:VU[qK$hcNTcJRMnm+*P*pDlb_ut5Q4XAP`KdKBNP+iL0flG,$a"PXJq/2r\*t:@BAoPV"QOA(:6dC'-ud&\ts'[X);/s\r%aqoHK:g>;K[&*4EMI>h:_J&Q`Z_B3m]j"YdKaEmO'biZb7Udd+qW-!qN9277?+sRu/F1<fV4CL$6VcRZU*k=hR`eg+NQK;:ja)7[\r%]+^bcEAI%F.3<eUrH1o=r\nXuM$t<*AN2g<]qM:Un)8`>ZMN*=:G2NjEhV^]+rRPGT/CY2e-Mi:ELK@$k3LQk-eD`"jQ`p^aub*r\r%UVj*j:()aC6AtB@'!<j:qYpXXV>jIW\^nr5=T[#!9Jb;j'(&F/9T_MoSm7"rEm7.^/8fJVE,KOs;&4m_LRqaSc\c]m's<j[$t_tl\r%,[(dgE+iu8q`L6cGsHGp2GYGg>W$W54Rc*9<^FARiMo5a.?=KN3"2UVrA($IMlRlbl1V/(!N"7F_dEPgFLU.(#SQ2I0VEt"e3--G\r%ok=S!L_^d1E(P4u!c?PHg?/cQ'b],epOLoEn?QGQP`BE:[/[aaEga766o3LW;VGq_Y5U@O4]G16[(F\D6S+.5WDq*:;_4i#+8o"0\r%jKapjQ0S54iCASA/58h&#0"9\."3RL=(ipL(W_`^;mtgZfW[K((VkIUe''LM7_?fc(VYTDP8"hGo@$C>gHotZ=/K+Z3np\5<Z6rN\r%6]$<,muKstSD<h!7c0(3+,)u6F,fbH?Gsr`mt*tOgI_(";u5gM;L974GEP5Gh[--1O`M*-\\X,D+$GO!DK,KC>-2Dt*/(a8&I<nG\r%5`mVZmu$rZ\c;<Is*q!eUPJD?:)GeuC,H9QcHIt_rs<=J6e%QZO$PYDmgn.;C`LM\=.p'($AcDliYF:iL7F8!SJ_?kM$.+pV=3Q&\r%X&X(nH*[1Q/36QZK0-i8bqXZ-O0XlJGlo^sb.`t4#s-$Do7I!VE4_MCq>B54'&kC+lW*SH/hblRmDfZ>Y.6ic:-Q58Z>Z>r'$Zb&\r%gM23jEo3pN)t!";47k'E5BQoS]:RDocd78kq[=8<-]qQ-?[K!<'!;(QiHFc/rr,ZJi(oB"k[HC^]m3CR]U1p3&UAE.cTd;V.G&4e\r%gr3.<f5L[CXaDgT,M:-N]P?U+Rp$"ll$>HChY6L-qt>rGCYJZS>bFYNGNQW,j'42OQqm0`FrFPUQ]Jm*Ws7:UD@kYX9EM19rl3d_\r%CSU?fV1`,UiLSoInE4*1K)1Zl#cIQcW[^3umPc6VIF=/i\L3(l$gFueNh$==ipa9(4_[FPP<.sNh&BNNi?e6CFLbWJ^sdR!nnuS/\r%9o1u:Scpb9fp/5MTg^S:I2S<2:Pi_moeTe2F)(Z3E=L_uc]q.P]_08$3f)kP8N[e9r?9.o<^Ufl>:XcTQ=^Y6okhA"DgA;:pE\]M\r%17bm#qtf^eU0Y5k,>3[<5]X;J57>5SI6U%'B(l=LEH:pmk[T^*Q[CLVI@Hj8>rRq-KD(Kn'=drIdjJHDr*ic=mRS^OdRG5Dk`$G7\r%#TE,=q6;oTR.KBK_YjggHkV7ER7lC$TQ>#hr8?mI$O)%OUW^nGRO:f+m;cOW:G24qhe0ZQ0\fWVO_4QSeHLAlIu74&ghbP*L\LUd\r%P.Nmq-(<fE#BWUiJ`O;sZ0UCVV#P^!5\FZk,l*KakCQe1Ie_$QI-idMo5<lki!_"`h9s!r/NF(G2s'XCn*]^?l+/0oI*YI\Q6764\r%g_@/:WkPD%rTV^N:W%MlD[BnPrARaOQRU+m-Z-<q?3E<,9$8fGN_1&./O:FI(qd\Vq*_$K6fk#bhbFE6[tJ4XjJ:=f]."Fh[Aupk\r%8`),9=fLGYP])Dll.6W)%aAMto81b8]O'](b3$H&n1F2+jR&GJ?]OGQD[""X1cV+@=8\ng@>Z9\B$%V_^El]u_bF^S5><s":ApL*\r%Zflj65\9c\AJHRIJ'h<1I%.a:of>/r9Ifj]&Z3^Q'j(6g50?T/KX'5Q7;k%Iii4AiAMTdH3RQM[3<!4na]%`NO12:SXlA9r#K#Pu\r%r[6dHiNbn,S)CK8IOTd"b35]^R"\R&QVA^O(hn_mbFdcYfe:T<Hn0)X?_([Kpktp'$/=>E*N6d6.iZT9J"]ZqO+b\/h_0J/BnG,F\r%p-pgK%UsMYA75$W11,>PNkWs+o=B[@gle`7:QF,7CFUiP;)7<mA`p;Co*'I7#*gPNI&UXS8OdneqQc:lIAro3osBlUWU4><da?X(\r%ntc+oqfce=l80na.`poFUTZMRL-r@?Q(o'AeRiq!.4%'>Dq-3MN:2\KUrk.+#Q1pp48Eto.`pmlECnms6D-gu:9*lEo-742S5de?\r%jdfU2V06Hk2Y$@@19!arQMdOnIlLI%.;jEfoj\d(<9j>pXI&<G2-6;IbG.t'<LZtdGD2GGH,-F!V99XHPrCt<m(LiMH7ufW6:i*i\r%<AV7e&7$^PX/\u_o<*tB`OZU@4KG*Fat8-$IZZXl/Ng&BoDC]IlDsIgd(cVR7UK_6<S^X[lFSO;adVp'1V5.9QL0*#F]'*239uuK\r%$r;t9\j)j8<8W,Qj#%H.0WA)s/R:k(g675=p$"tX?_um*j1FSjE,5)g9r^]hnK3'eQL%SNq\6s6PUrG+k413:WTWs?!YtL)BO#?V\r%(&c0kHr6h6<&gu0-5@S/`CY1fP"[=hkhdeZWY=Jcp!*>J.f0pf,'gh>q4s274f$D53N1RJIDncXG3)%/Ft3<9$FU@OoSr3:kT#bX\r%<8Y!:TC=E*JI9%ciR+!_<6Fa'/l3]QP7<*N7QpQU.W\TR9/lEj`P^$d\U(iOcWlUm!HDRp;G!b8AgSIe<9)"P%1s=7*9s+phjG%T\r%19%565Vf/IXqW55Ci&(+P"_kBdFU1R=HuSRmsXJ&%b<I7Q.r2V"??dcAHR(-86$.t_W^;PWoGaHqEmV<Klp"V@O`rA'aU"thhuG8\r%hoOV6"Z#?jlfVQCDO@"Wq3JYX<^s_kLnB<^g_Y#lXQ$^:"b2]ODir4hVmi@?p?eDmIuT3BIti_[I@,q`UC@BN;]NAI,C]$(MaL9W\r%;AbD=j(lO+3lVnU+5O=-@dAXJGK8T3k3J"^]$>X5(VL.s22];+4":g!T?M#343tJX7.,,!GmBAD^#@0i?%0UiVQ'#nWXrG9F]KsR\r%=dk@nh4=g)fNhhOOIY)/-%ErKdHTh6V(`DAedA/4X;pL\XmfsjjR#nFE$SWJ?3;'m;hE5jp6.*m]S;re6m:5qilPAc.\&n!]_7!C\r%G^lsE92r*fAcMGF7\V];i+DjsAM#A-,.BBjn3JneHVXhF,!9BgO-b<%j$gtX9g#C_nXVHPh1)$531Preho7h^e<57=4AT`a8cQr<\r%QCrMO$a0&h^Lj57rSt<Li&1dMjSeL.8TL(fqJ,cn0Y&-4/d!aZck>/P]t:'==^t+Z;akUKFNr(_E>EGlJTYDbK=UaS@W=QVFY@3j\r%7F!jZ;@hk8aV2D[GIE9^Bd77uj)+Mss*+8<M1'VeA&&F)n>+MkjnMV6/'bT*Y=DOV$i;@/S2&jbcP752E3jLJ"#qD4s8'U>1)]SY\r%dl:tUECJooGal4bA#0;!p/,1kCYp,*_=8&HWn1IK]^r`Dro7*sd<m?TVZ656o<J/?c6[86+'r):H@0d?K[Vr<>qmECVtIGgkH52e\r%Ok[:Bkr)QZLMjlSK]E>G13C0&q0U5%oGF/@)T6^cq+keqaN]?Dn:iE?rJSTtXh-Wa59jh!@G4.7-FZbE=XE/$G[23"O)pB*m+ID,\r%m(O(/WVTE\+`N\X"CVfkO$=<9?:0XGp=<>s].(<]?H?6Y\g]GCS+*],=LQ9aAmF!0"^@W*QtdY`FoBKq!<K_D'4h:#Jq\J_J6#G7\r%Q"(bNYAbM+EgTKO<_%0<::s<bOo"B5YL0YRMTNp,n7!tG4'iZ41Y4M]r9?9CG.!%tpA$jB0$s##Frp/lR:c-*?fV8!.A$LqH=NrE\r%D;]+[lN,Db`Iur-[4#e5;?bs6`=E9\6RQ'&dl6D?r*3ORDO!`H3.uhMYE`bt0Ze[)\#?S=mJiR;$@!#;2$t,D9)/&E&+!*2/dV:4\r%BQBDWPE57U<UTbIm%0\p*_j,>,+6N#1m]0bd2CR7QfPWeAj/$O`S&SW;[)lhooKkb7.Pb`j^_T'!h18SK:B,_0)hGE%&tPLg\;2Y\r%Q!M*Wp6>U]me>80jBd+MW&QGcm%"!#@:-b.DIJ3%:DF]U3Ybb:j.a#PV)T"]m=CIj@UC%i+$jI_4fQiQYh9)g+K3f8@Y-@r=.so"\r%+?/^/;Xil9Y..93fb3^-F]Fg!Q^pS&arNd;q7g\Z6u\4_Vpip%a#6`h,9]'o,@5E4bF^[3N'3ePF+<@-5Kaa\^Eg=7OJ'G`EJAZ4\r%Zj068<1e]s\e/8bkij.^cd'o8/G7^YZ;<JniBW,LgfZ?*^ca`"7n)l:LW#YD8A@nXR(+g7gur!h`<,l&iW>mY.mZ'39T7pb54\C@\r%.gErBAa]*Cq7oB'c;T+f?tIr2JGJ+-Jej@r?b+j2?c9^-;]@lEk0#boih;^2D)LkG#=M2^I@XH&j4kIJi5V3r>l/]9`7"p]We&EH\r%gt?Z:ZIkTbRr*M#0!^t;^Vk'KYt/V_?E`64\cW*gR*3qM=c>_8bOOa(96)70=/uBqXqRDW#C2btI6alTlcVL]:KDG0f4[3Xhr%:J\r%6]9Bc#3GM$adDX8JrW]Vpa3e/'2RF4?:,DCI&g-UGB?5e27<6bTCR<FWsLBTDP%GlW:Q@:Jq$A(Kq0m@h$_**r$_ukI0gAt)#=(c\r%]/l#.7Sh%nK'o;XH]iocnn.=Q!lV,&/QZgt(T?mk@SuOd5b?gf4kFe_oqa?ne>?%?&fnc#i-/%8k6&TpZ!OJc<bhY,EM^O_c`bm<\r%%t72ligX/;46)*.np'"a;%L.Z49>NkP%NP%/HI'2_:0n[d/cse=&9$Z<bakgKd*&N-]I[Rs8%e6&"V^:01KD"40RnfLP)gk+eL;b\r%6eoC4dAoHRo9Vn=UWVI=9g,'`#PYrm\64Gr\I!,S$_XY\PN<dTVgNE&Ncl`H.@U(829<n=ZNqn.1rZ"HCZ)8_`l>6e)1@EYJ_&hV\r%C?CDClb.>Hqm)92+`BPt%Ye)j%mKIdC?R4u6$T"Er@^Sl>V/rB<.SYT%.,l?]=Cc?^#QRAHF&M;MS5!NdBmi*0sSjf1Ch!RmRg;8\r%$[E1@1L:E+^_iE&])V1>d*_FTK-km'+8U*I.K=M`n1N3R^^k\'1::;jNCp^s^>;RJ"XuZP[p)$t-sh24hWup)"C!Zgp5EJ6'R(Jg\r%4>O1Wk6HlkfRA;E_Eipbs&fWG:Y`HHTJ0(Cco+fScdk04!\p/V8*ErjbXm!U<$^bV7$?q_M;j0VXsT\9X.fiQ.[^[W.RT1JR@jnd\r%aX&2Ml<E$#:VBlNItID:E,@p'&F:B4#[C<;kQ(K*2GrAp<cuX360Np0o8aDSC=h'URlBIsJbWLd2^O#gAqFC+3kEC#68u15"RR_1\r%G-8s1[D29N*qjEh$?6:C>$NcuZhZO=4+/0C_kVY@cQ&haYS3dgk)'AP+.$tS$\*aD+a0BiDek/Pr0d705aL[oXCAuOo)]d_)P!0:\r%rT?>\@^IXgWuF9cDggttK8*NS:?@Y2j:NAC=>aFs6T1mKiV2NX-qne#hLbd,GE'(NQu.gn3HrKK0;6T>Q`N9`Kt5#96VSU[!oOY#\r%8n))#P$3?L'J8S"cS8L2$`E4D+0RlsiO_1*EAr9(GLKCKK8cNlmu9VqGL^?B\IU27Z00p*+*%sB75pAjehi1E!@q1^.?7d\"BA0a\r%n;KK(n=^o+,tN!.O1<Q*/YujVWd'F+q%"Ccp=263![YMW<]*[N],Bi-H-m#$V>bka_tOAr#`,0rG'/_[q"Z?K=Z?)"bJ$.U:@cl2\r%qdFo[89RA-K7Z0/FHjL[7A*3?1:.mZMI^FMG"teab:FP+MH>N1E!'5++8T1>MK7=d\\=UbP&n)CLB0_n"&0!ap-5-u1:6q*fRiKT\r%%2OOEoMV=)fMr](j_9H];HX9>*h?t*(DdRUPZdWF.([!\Cp7Rb=0esk6-?eG78o[l5W/;H,fcA]*VVT;J4!O=eUp1VfI_)o9g-o:\r%[LYQWj^,#="%RS%$WgYQ1WM.AY3^R$k)hXF5!1S:+6a)5p"`l=Lf3o)Y;r+ub$jH'ebKX\Y8C5ZdG_'L^?cs5$B3.K=,\I6)i;-C\r%C3GNlf[PaYjlp59]%G[>Q^@#&WdN_F#h5QU>Vb*8Ycn"I6VQDD?b3RfbPZrd1eDS9F+%S2WsE<!oY\6)EY(sKM^,so&98n@OuI>;\r%-ocja@*e)s@QsR,Mge(OiQ&G!.*ili#r_"fV^#&H0JeJ?,]BG%'?j7?[VO=L,?*Pdq/I,rUY"\"N*FrRS.0B%4+B1rjh>c9'SN`o\r%h99,gq=s7N`)H$ZSa2k&O+j5_35V@-C]tp)gW+\AA6*n5C%$q*ABS9D27,o8@k\G)BM\V4ir+(,@97C=-[`IO4S^YV_MO+,?"l11\r%<n'BD9ikLmi]X5'Z)0O`<quDeF:\WiCXTTDbjuQN9WRD_060"O+g$KnEFXh_m:eFmSp(_M'5JNWA)^_Rop2\0o=d7oq5cp'k@C(M\r%C*.WLG$u$RA[[N,VT2R,%*6FSf46Fc:DLi>a?^)IK<J4eRB9sB>V4W3;80Y/64Dc4JiB^f/6(Q?Y#0o6>FP+__KjPQ@,8HGfZe2(\r%h[&JN%,V3gd(t^.c^I#:)I94aS8RR%mM*!i%eY3[>>+r`8;LhAeo+d6R>JsHSB,FuI60/u4L9TEc*_(*Q,/f+Pc\ql*9uP^0!)us\r%Ei;VrijqTZ&TT<%/iY@5K3W3-Q2"J!K&R((0E^3qrch#HS),7pQO7V]KS%Z^9p.-IlgWB#O1&Q\o)/;pIHLN+#(FmW?YA<m?/BYp\r%/gR^Hc0h@o<,/BOjL`S]BfFS#.\eRP^?>JH'dKYcj"p,LoZ(<Pi.:pr#<jU1B"B/gSu9A)>-/hSF2d*<T0\$,Dr]3Y8cK'L."CB,\r%Oi"Yb:,*"VY#Ji^JFWjK%$1iu#g%bFBk"BdXqIYbTtT.5oGg%^n1)LU-dLIaGj6.]P[KmL($2TR^.#]//.@_Yld6i1_R"P,RorS*\r%P@+m3*#.>3@ZXG;d*-\m.`*kJ_B<o2.h'=X+BI7N$,\G&EtJ4W=C-+9!-,kuXQt1Z(Lk)D)kR=4!5C76=od^WC&IdBF:n?E]H(k;\r%G8_%F3[QDe6gTa*@^b#sY!dU-Mc#;ck]9q_j%83&=NRU5&8b<8eG"0q&hI;NrHGg!:T*667o"A8ek];5EoajuO.Wh.kl5q>kdO^%\r%Z7-RVA'Cb?I=_AG<%c0r7js0Fp:H`!pN#Eg:JQ8^PPI/K%fJ(O+,oj^#P5%snP)c?U)<ZW6IiFcAZqm2*'m;V.Ps[Gd-)D]<Es?9\r%##*kt3!3;h*_XDcnqBZIMiCZ(U:-uSgGim=ps3a]n'r/7UoEhO1N'ImI5t%on1\/kph7VG_I=fN?eX*QMRs.cKuq.cJKWftXI*X$\r%,CYL@BlTu7MMC1L5J7Q"pXE>0r'"S<eQ=1?/"ro&l/_<k`EYlYksU-(/r'`I^*HuXq`'%Zj\P'Cj/Etn4u?"4hkYUeMXol@gLu^n\r%F"*l6:!e2gVT@"/FGuVUb(h\l^V&.n:NVZTkB/\M9I:l@IOdIYLtD`=P?S;DIPqVkb7+sM&(CG>3#M*#:_;U[TR.N:5I]59[M-Qa\r%%me.3NqK,mUWM3Tf;c3XZ88B4-*FLg#Zn'4p/+YLG+oqL5#Pt[+bqL2fWfnrO7)'R!gKZS[.`P%\mL&1&Q#(%8oaQ\>[r_NV>/9/\r%is`dFjlC$;og2R0a]uJWaj"qh*t<I*jV.kVjWQ;P,kfaDkEOjJ`%*5k8\!g_3o3*sW6"eH,J6*.^DG/XK',:"g"9u&9log94]<%T\r%GSD"_%6sYIHasI8^T]GZ5P+1&q]r1rL9!QZ<a_/80<SgKTPo!@Mt+Fg%,"I0J,nIfY2b_Vq6p1F)?BjCcY/?l.j2VaJqMF-5gA4_\r%Mk]a%VJ$rR\;;k@2""NhAVHmail8Sqf^JJT54.?*YsimF]ofQN.nUp03G)+Brm!:"k*T@\MU9`s$B`F[Cr=:lg_+H/%-XM\1&T!R\r%;kEq,A9B>i+Rp/WR+*"\`\[CR)gGk,M<7*0nGlkuVDJgPB"UM&S2Wg+R7?2d1NH`=ET*=09(-LqGU3Ik(n`-hSu+X7(PLjM'L=O7\r%!CCuob!ipjXXJK(Nq?tJ+X^MLKHOUJM>m9)+TOcB&4_QF$cRTp`l!;#N(-aU!7d"&$W&4$pj=eTpli\57lp_&3JJVG;Db?U)DscL\r%cm\IXEO665EnO<Q%"(LD5_"?J+e;&7A`OiE,$,qp#Xjkeciq+R>b="ZiDN)V18<T&%Q#*:U-)s;="k77ZM9EBPD_u'$p6MMBFM%7\r%"?u;$4"/V<e<#[m\Er=pO3`kH@1kgE:@ad5gUd(*-6^&sGbQi;?L`c-:GHr8iC#9oZj.6ICR[[F2h^c9(5TmIEQb-HkOYjoB:&C!\r%i&@h^A?Kma-MUq7KU]WV(R\qqs2pM*f/o)KkPa>[a+Zu32eKK0@^pje6p"akoKES81r8Bj/'i-a]@4pXJKDfjGGg_:'A!.@G6]+F\r%Vk3H>h<F(Mks)n]3rPnYVULTV)PFl(0RFN^$:1kc_1./3B/&Bq_uI>jSfV0E8a&<2<^>Ni<dJ]OUM)<o-`RERVYAkA>Jgbo[tCoQ\r%hS\Cqg0s?EpFoin&2r!aCQAb5ke/lss-'C!Brt+WHQX*KW2o'gY8>.seY&@$(th*!n)60k'%f-IkWR$lKSgpWl+Lr9[=.Zg^/qSW\r%PRP5aV<NF#hF[GsZoH>I+^BngPMj)E#4c[Y8M#X?98g'4**:/S'UH%9<c_iH$<efZO=9hQp%j3%XAJ8aj9cIR#%XtDE8rdsBYL&W\r%Rsa#_=+QE^2T8Jop1(]5?*uc20+sPH)2Td7n<SsSN@Ce2%<=j]+mnKj:#Q!%i[5fPAKmtC6K#Qq@Y=38'2P'V'(QN2H"[Um<cWLY\r%[)6"?W)TDZ%NC]%U@-i'fVa*eiPJe/\oMt5%^m;2->;pbI87f/#N+s"`VW,SP5?F*iV+GrKt\cSX5XuU_$P-W]+V%*oV%Fcg3rX[\r%6p'*5r+Ef:1WbP'qJ86FHZB:MiV+dYm2r#tqhUN-1/kY7PG@PICe^uI]D=h0:TUuBQSLF7%Vl?.d7m<mJK$[soUL\'=Nls>/_[lN\r%mTr0S/l$F$GN$cJ9r[5sRF(tF=>$<i_\@]-ffIj-aY^u%e*#]T90GQM:WcDEX^gXX%$231&!"*Lq`A2Wk<*c_]fE1X505&%GE`Ec\r%8H8LhgY46Rf-$f3&>j%2)FX4j[P]M/h\OV7[D-$t#U%(-oNgN=5h*Sh)BB86,nSZ[]`55"iAs4Uod)S8K.@Z[*`]s+"9UG5RYKuO\r%Z&?Seg-E'E4BtFc+M&Crh)sW$EfuErSEo2&ZnchlA\ECE\`m"4.E<f?9Q%G+HrKd><_UfjX-u;\k`+s_-9#4&m]_NA<+eAiIc>C\\r%B7$[a">.?^fWPEAfO6!mnHaj5Qb<iZe]*.nbhk&c\74+5Z_DT`gngG5nRs=g*u9`^H-S`:+(.f$JB*pa5+j./FkC8R0-JPb6L4(2\r%=IK"3CQ84#TlCfOT6An,n\c5'Ko/ju`VV!(9&j/7-5RrN.lhr.c&9,XmbcSWJ]a]oItnhAI$s).?&i5AmY&(DS_@gJ6EP9(5Yqen\r%&;8m[$j(t@r$a2<,l9n/9=YC,PUGKCo/k/U*$g5c*8aa^+9XE'mI>"VT9+rs3;`<LAU+.7]I\KB;A$Gg-[ao!G+gVE3_'atni-(.\r%nlpaN54n?Z"P<M/!1a</n=XlKMVRf4,S2bga%reif[eo]CQ.b_N-eDe\4FFBkt+'b,&Kk^h!H/Hs%oNWh99&;Q%)t;Y4IQn-6X&b\r%I@gJG?&tiZg[R)s)EWr[Xpc=(j6-G[?b+T\hjo7SOFG#4kd0Gq#+hEu]L:YJDFL*;?aY_paD;.\X3JK85U!ApLI[Gf#(jc#:UtC=\r%0n-M!4^MA<CcLqC6ZfA1L.L`Ea]_LCh_$\1:r09P\*mYIN%9IP*8^$g=->*T2sUX'XckENXT#HqEi5L%dHrF[P@9tq%IS"Z5Z"Fj\r%><)'5pB)+LV!o=C&=\@2/c1^4;1_+:9&R2$q8Ieif8D#J*QKm.AN@Ci;,R%(qonk!pCVl-Sc*fdD^:>B[-lE.+5?%GA_Zr>#g!=j\r%+i0fgcV#.S%q;p84ca)o^"f>AN8NNN]eC]SNB^c$(\%i9\2?fu&5"WnM+%Cg8E4?90`$?h>/"bN+I([p-T)V:]1K)Up1L=t1Oa64\r%k#M&o@VrOHXGVJV$,(.sAQ9/L+M`;#O>0ic@T[8i%*7XT\0)'iR)B6GDm9ZOe0P%e5qnKqOE3]!Z98Ckr-DTZGUJBM/kpkF70*%4\r%hss'HUU)enKPTEVBqYn9-rea&6.Y+K2QLkB"<Ut`8Mk\.ZEai>==e74f*I7O`Jfe&,q\M%VM`_G%_N(-YmNNf]2**d;tjIgh2Q[m\r%AhnXu6$GETW(OQW?Vu,4@,k\)PZH4U4/'W=4V(Q6FEmN;6ikiF<embYCgBVZ=26mY2H%?d*/T>Q,2e2:4rYd&&cjqO@',c79*F$4\r%S"Mb'(:!D>B>);W>+SF>\hO^CTgdlj$3%7WN;$=WC96*ZGpKQZ;BrNZ4WCl;40;_o6]4s(kq.51?#I>IgTj8K3uqJ37ADl?-Xgq4\r%MdC&!e43?Y(9Ltf+ET6ePuQA?7Cu--9n;*o!:.ZN>AASNLAZ3``tl@:7Cha#cG-oa]\1-p(6,cq6'c\Dh_o&SkVI$u5WqeHiW%6)\r%Cs6hFYZi#&44(6$j/ho_ZqfPH'@e"G(6,'Bo)O8qWo?]S000Fd%@0S[o0oKP14=)#1C]6;2);/)`oYMa3N8O5ofLXD@kk$TBr%3S\r%rUO,E!#n[ni[-7r>"MIu*ep7t^O;IN#NdJ8R>5WtJ$</.V\ub`E&[(o!Eu/-/i-H`&)5o:IpW^kB]QA,AKN7fL[FO(B4QiM-A8DA\r%[<WU6m75:6K81+U.WO%n!o?kHp#Q"-Rccia=\nAmVMk1RO1?>'0QDkFeV9GJ&&WbbFp0rbV!0@34q1$3bLgqPYr`5DAaH_Nq5c5;\r%d`cjCV4tNK?d#TpM\^M0%CPPW[qOu3C.R]cCQ&06WIW@&7H9n9mRrnaU])h`a2tqtlGEp38ASk?ArD\E)"dr`,^$lq/K.n*I>bNa\r%C=o7*1bn[aq&5"D/K2=-+E>9H9Hh[f6,!e41j&W&6(0"NU/B-Q:7@nkMhYD4rURY8>I:3OJ7krIGGpj?(g[%:4[8%7>O;/#!jf;W\r%dCHc8n79g[Z#bKQ_ZDnpT9Sd@m]5epl6d&_@81C=)K.V<gdT=&AE\SsOK0\3\ru"O&)BZI=1u.j[5lNn=\s%>?>[F(O.!(.=0FOF\r%]??VG2cm1@LRLW=HLpXdkTQ[Ys-@00!K5o/ku.E'9YJ!B0cAcDK<V60>eSj]Y8:-<2kS+92:S+r=.=hk9X3H%pFWDrS,63dc(W;"\r%ML'>dXqT=Lk3L9?kPNZm.MN=V[WC-kb_q&TFGe\sM-VZbqr`TGq)c<5n05*2hVA*FNr>(fY(*^LhHW2^F]_eaTic.aqHM[<)T0o1\r%I!Von2cm1@k;dPRp#bPiju[_Fl[&/ord&X.ie#K+W-dl<K=t7+$ul:tBYBZ8qM>T8Ap"+@?8P<^gDR!WFkH^o;ZP$t:fS&_;[L/m\r%&%e($26]8IW7se*DNpuFXuE<6p5s"n9li:VL#>t)N2C#HbBqs0HLi]4``=\A>(NgAiL4s2=-Tlk#M^'8V((;:RNbE#<a81T\X@NE\r%SF]]gLZoUrn5V=,S\N](/f0JFF3j\s%0rT!He(u.5bt3BH^:?_o&<t#B-%7[39+`lXla'XMBQ!s0I,^gR>]&[lY&J@"dWZ*_^&;>\r%C)!@)GIPu(F&MifW#FmtmoKsKRmPV`KGiCTmLq>@Pq_)knDjM?m$3<jp2UFTB-7U,YVgI2I,E52=Gjn;DA,Ls/d*N\YAKW4*<_[c\r%QptI-rk^f@,REc-h&6DCiibSFiC1p`6Og4S!fQCI"06K>h2l=B__lHKVB2U0#+aR\%aOLI2$cmgF^>5g%g#]&L9_5=rKfN>RmLL,\r%rW6^d.hEP#,(".9qD+]X[;a+ZnEf,0Z<)1O"bCs8ei$/rat3tOg.CMm,6uF`WIAr!$N_!('>cCH!^k:sYsmKLk]'\=UmVm/St+lI\r%$#?'Hm?EV;Z)&EA'5%`uL9;,ab^\4AR?rc&Aes4F0Bq-aAI2nm3B9.3U7gZGL[q8@S`Al'0Fo?E]q0[T^l+lgA,T:QiSk1>&JSk#\r%c<O4<ORK"p0"WB[p1T0rR>VEZ$6[a@cg"nm&+c;!UTLrEKWF.LY:?$D3W8i$^a!X,U0PeumCo`CjFhJlk[cnR!-#!gYh?+pVN4Ok\r%Guqsh5#cKrjbpi&SYd:mB&M9XaQ;;ta!I\5bntJ8Yi>eLABL#"VQ3!g`cmcu]^>*(HCWPe3jMj]T-9QNNltf+9L?sm($e'Z8hR6a\r%NR<>T[.?Z,W)t_\C>4]t"f(CrV7d&-)eR%>Jl0@,ehl)Ya'*Gr=Fmn[YZA>XmNA%fd6+E6D#sT8I1IpTr`s5\fM\g2A"A=1J+@*r\r%"`*:!a%NL5WKF_jf$i\U6_hFl14=>=(EY#/%_a48$e4DHI*lhEge.&^JR3B)e^g4*JPO<rqd14^/YQD"p9ILKf>91`YITs\=X?_5\r%M$SuBhcMX)Ub5IH]4iNu?gjNb1+p[Jn!n7N\:)&3,b0Q_]lSY5Bk`ePMI;7)(EICFC)Bmj_AOHG:npZOW1c"LT^J/-!K`G9#S@QL\r%F]`8Ycrk'Q]2FLB&A"7^d&p>'I>$>>:ufH_+=DB4Z7QN-em2m2-be+?FO7%XH&F\gP_U;4jQ[_9Y=2Y!GHK0HqH^?!<7o<Ym#Zeo\r%4A3;#\q#&SaubB9RT)9O]4E5Z1lJ4[hrFudW+cGF"'Yfh8XH?V=L+_%MZ!-jR4ZIVA;<UGq+0ZKPu6`KhPHo?>(^:&h@ngeS>DYB\r%:(&j^jLF%sP2l@C>-apECuI<b;cT[8CcQ=5WY@rCS]E-MG-jRc^>#i':h:29iGh]r<O^g!8.=g]"br+mdq`"^>@7`WP+'/tC3]JF\r%$r%*<!K$91(b,h#0-re%MY>"c-Z5?'Z(cZOK<W_<=:ne(2b(t!N"s/DjN#I^(gh"X="qZO_5g38][?tde9lTu0Cb8+Na=WI"'.d!\r%;O'2<mTn$a/%2gp&8H)CrTqH7%K]A.nuWHFrg_ecZd5DG(g'p.>W=RY4Y7-%54;@T<Eb6a<pQ^d<LO`h[FOKr0@fBu"(!#Y@u=kn\r%4;HS`\52;qr#s[i_mIFVAIU\_D'T_FEVKKl&lKs#eR;WkckM&_^h]7h(pp@VQ!KhPCCGf-#GK>J#(._!rM14I0LjgLe3!00WUSq@\r%r^7d$4017m<[>)3XiaoOj7/cGY[F&$PSIZHh9cbjd,t>j-j:&l5SD$pKmd?<Om$MAlZWHM6EKc,e\^k>Vg#^=BAr.^++AU2Pp[NR\r%XDR[7I^&*La):Z\lH175&nGu0S8bl1-:-88L(nkP75K3'lO9(96MY^`Zl"9N_R4d`IO@Q$-qUQHQ!=NrR.?Q!A(nmiitieN3rd+/\r%n8lr!1>uss+,!;i!iVNV3nP7@Tl1gsh(!`=_]!Ju-o1,E'mSMfq6e7\\&$;k60N[Sh?kHMGeZX@gkj"-'#?-(:B<r)+W^K2(]97(\r%p5'^hTD6P)!#(WL-la:`7\Yb_Y2HUA_kh!T?2=S)L"qs6q[Y)e[$s26\9M?H2DY;f[[H\6'TrVm5JFsck<j2dDZ?(s,_T8-Vl9ct\r%)%!"0;R8k[\/NBUoCnMO%^!n6a$r#6L>4YHXaM9'B2,P8jnRR)rd!'e_C->A_Ko(`MNp,X"gNuKHr!VPk9(K)Ft=o'ppq_\nibBO\r%FItjtK902gC,ZD]6^(QG6)_";7>oMEK@#T/Do_kNGc75DEY(in78j"`a=j,0+g+_R?L^+gNlfn7q".0roKVOF3Ylq,9au#hCSL4:\r%@YlGuI<D4k64"++lB>s?g-ji(heLWS%NsM,S%=S;a8Wbpi\hK<D(<)tD8'^Kq^*Q,qouk.6"!!tO:BGn,uQi1@8$2d8MQH^Ybh/m\r%A5"$;1uFNgnJoLHk*tLkThqP\(U[M2rg/"q/Cf(JXkSfP7arVk(3!qGKN`&5+]8Wu]Q_Ms"`<P2(]l<]O3idu)JE#r^W^,,RXta4\r%Uh*H:p7'^Xk*Hnq>.,\"]u/99B98:,"_q0'Petsj4\o^;d=`2`lq6dj6XoVDZJAFdoR38=,j'AcKaAK;44ks8-;Y1K,'im_@*?&K\r%"nj(ej<J3TU&oWKC@`%cBi0H$>jS$`j0J*F@UJkoIJCdMmO<`\!#%V+@536/;#d`80DZVnTQ)^;psQ@Dd08`A[5>T+Fa#>u;@%<m\r%+1;";Y<UM$/$X"qn`t\J*(:/br2Vl*.B!3nQfthFTi#ekNrkCQoGF$NDbor1oMZ]p-HAbA'\6@n*=goN(9On^:4NX>*[]Ea/fDBD\r%q6<^a48"Tq=G[o+?,2"#,B"qOfAGJRoU*hu0@<h`S_f*Vf?4_rU>0f@Pnc$EW2r^QB!XuK+RkkU5StZo`BG*IqM\D4*kV7DI-KGR\r%n#/-(^c.TdHCl,<3?KV-PV6W?720@7J$UT(4YQJP]YpAU[.M")USFYlf@?'NqSq$3,Y0@brN-Q[Z*Fag.;H$0+L&tO+rC<Ga"@Ll\r%WuIf;,`IA[%tTT4$eT4+&D4GkR!f66`*_GqCDR&Yd&C$/*<l4Bg4d=1r$C\`1'jtr+YH5NngFD+P'/dt6&:BR>Og+PhKg?nc[6Sa\r%pJ"le9@jYQHR@*ZefB(*SY`$OeYf#lL!_heNQ=?Ff4Na/QsH!3_(13dRMR-*`'n(#r8W>BTBq&p'Z#9NbWtP,0,]K_.s#PW9Bu(1\r%nFo\/6[O!Js(rHIX+hDW8d:dn@iDHspaaKm%snhe>uBHU3t%<IXW0[2`0nPi!rXWU?TSDu`Y7hm2HWaGjEY]Fg0d&eOlo#HBuG=l\r%Ue@;7X#Tj]4j`VqXamXaS\\"M4JCE1n+9CN0BD2>g3]T1FT@Yik<U0/=pI;QGolG/A#0:#S3.=A^)his6$XO&.;9U^@<l1(QG6#e\r%osDFH*N4'<^XLJE4hnt0qJ!o+Zo>`]qr^8dJd^jYICH1JgX3^&Z_#g['Q/=(dC>n4GO"*R6?JohClIZ-7<Ds5I'q<sFm1$[6JW[N\r%%SL%SjJ55WX+lnB'6<UR3$.F1S]E-f/q\jR64@A1F:;XpKZ3:0I+#*L1fa=(%sJ7eF5`=YbD]/L:Uo`tSX&ma52e5M8BKH"Vd8`@\r%o"q<a:c)>\k2"V*-To<Wo]S)\,lIGd$X)+W:,7U/"-rQHj<Sm^YUWua'F9AC]ch+V)mXVrflC6!P(eDa-isdpMKXKA,^#OP3KuW1\r%VBn)L.g1_$ZNS8'dH<420UsSEklo;CE";i`"6)ugEs1dA/7s.M'fB>)SQ?N/-W4(YokhdOLYL,hj`>hcn7SCg;3i]Y[3j1jdDY+*\r%62u5"#+8gIZoGfKK$ugB"noK!XD?_cpe'aoQ%7!k]tP-U>pVDZkgD0r]/3Dg>.-:*I=>]'7:o[nASl/pJ!4$N00T,35G!AkYV@T3\r%jic_O5sB(dLXFqh?'cTCB,+A[H!>t;pHOM76'Lo"cdgb3gj51U=s'G>e!B*9L?7CQ:&%sM/4VG01!=V5k1nf[5RsClUTY3%ls<@Q\r%F)K6F8Nek-4OE\(JP\Th2GqC?>2P].692eYa![%;h_7C%\-oVd?ZKC+"MT+6mn5GB73/![/4(cMp]PBkX>62B`$Z*D>CfW#nVL(H\r%D-9ANH$gfm/I`p=FaPC=4Si&,gA4)AF%fL_+`jcY,\pa'6E-$R[XrN2ef^2Rj5(k(-[17om>AX`,tuKOfk%E/jDHIr$WcB7pbg?i\r%:8W\SFcjqdhm*Dao$m0_R76WQO[N:tE't/7_&5tK.[1f0EesPei:XXT%TlQOs2gq<`:I1^8!f,>1>Zu[,"PIU#Q63&!u?MjPh"VR\r%gsI,8],:&&]3Xf0![5Df#7DgU].Q[Q%3FD>`,`X;JLeBVe8i@1"';'EU>Ad(?nn=f_m-'2J40N@ph3n8/EL,M3DJXJ]gARJbpI=d\r%ERtekK`7br.3?f<=9MnDV0EJ]0qO(s4?Shh`H^+4GfM$<$k^Ef`]56F$kZOq#oo(U((P;@)0EsK@GuasA7[uGXVMBuhP+l#RTcAU\r%Ru2iNCO$?cLhhNL(kcb3$7[`'Eh`j2GRd&GOf)';QeC/MX<%n!WU8F_<:tLNSlE_M!I'kDibeR?*;!sJN;>N,<I*;E.dscr2Ws+n\r%?>!]3O+W(h\K)IrdpZ&'66qq^&FL`^]6kUFcG.,F\nN5k+`"3pele?#_n%d^C.4+r+,B6kYKOreG%[uY!ODJ"ed(?t#7/!>9K5t!\r%gQZ'OBXbp27kX_d=C3G"#Lhh(/,f6]H0NSVGDXPuaW_Q;Y!P(DL>4\nh7;0)G=[Q^*pguqD=Y-t9/]q1;Ss2QVEF+`YR%0dMS&%^\r%%(<415O88N6>re.Rf2V5DAksU+-pUD=FMG2T3:6NQcGVkB^m3&GUUoB%cO7/$(!)48rc/LQf81')qY6U+B0p6FC.njhuW#*Yf/s0\r%%+"P'nhrZ.L%Cb>#5Z_uF-36i)a*UEruR('dfp>U)rGH$@+sO)d.R_`U$'HHrU&,mFRB;SGeLe;oloh0f-Vp<mL;2TR?ou2nXP[X\r%Q0Y_)kA(_>(mXEm.E<HMN#7iGZ71PL`fO'.]FgTaX+Z*ZBN4EOj!oV'ra3APg@]bqeTrR4.+55r'i#J?om0flHD%c(Y1M.&em%/N\r%@sU;?C-;f1Oq!mS25p2thq1-+SlW7ji6Q<L)n,(/AeuC5E++/sQ1hIk,!]735M<l-=eP-0'o6=#5b$C[0fX=.aG,OU-M.t\M[^?+\r%`99UtN=AhVm]_c^PH92MH9JBF]rh-'@r0fF=h$p2Ep2-_\Q-=)lsdl6d9CLn@Affs%h`<0n9]DX[S>\sGSN&WfjQ)7,;0m4=ON=U\r%>I"LICjpA3b%>c%0;Vbb=Z_PI<cnb4]lP0!(qHA'#H$GPa*1pPe'(C`M73(Ca>=,Ka+/$4es:;`EX\=fYa,BTQg@"[@@."I(hIRZ\r%I2i)36j=(e0G\_;EXWeG`3&+9j;9S+jW'X-",>)nM`EIOOp-i'*B*$m#0]Bc@Uh$!^]9;G?t1ft^k<]/KcHK8i1O#m@Lc)gLW!p;\r%9TB/.IUcPE.5m&cc(5VsG<%060KB=GXV]a)bdVA5m-lb`8S\8aXJcS7k!j-3oQciDo,lHIAc=pC;cj^K>r,mX`pE7O(E"n3@@rms\r%32X47KM>e8+p/%[$YqaV3<m\n=NuC7kk/bB"-^WY^qEppJ]TWS^a<1,J]TWSd/D!g%SVl`"$MUN*1.]J#-R+>EaWnrR%PY-O9:\V\r%^]5Z`bCRbi?k1%g%SVl`F'-_=aY@05@`*a#SGpf2)H_hX#a,#0!**hrrMt1g$mgWmL+=D5Ur4r1"tn0/;IZ")KD_*&9!!.1Y14st\r%?DV8A;kSc)o*VkY.1j./IsV?&m1]gfb\s[M*DV.ugha:6PQXtL1MiE;Q\IQ:s%i/o_n"%)fWQZ&ZjYsJ"BiW-$ge#'p4"f,(H@rR\r%YNE(+/eCc4"iES5[=6KegRtsE%XJ,7^3*DH,&DI*6fm^?$\V8E$AO*Ig'*'uKS!X*Km&#&kg]mTG(/i%)?qZ1[\IQ#d:Lr?4S"MD\r%]7.Y@RQ63`__po;\`,Llh-oY)CkpCsDJ$.bfZqM)RhSqD(?GtZ_,H'Vi_*]ZFq.jG,XQ&[&+0(u@RB/n!bp02GB7Y`0U"I;giQPe\r%":)=2`.dmbf5p&_O'oGJ:f&bR6m!jtrPM5B=XQM1=-W:g"IB+$ZQ<;WD]!M8H^BsV$.A81DM*,]Ko5(>W8C+,cRRT"kSO+%@eVlE\r%)uX5*c?$0nP#P!X.VnlV5n=7/%TM$OT7X6-1**=-Z[%&/R@\"fFBn4;_^9M/N31)p*c6jj4]a93nTL\X##A&,D*HTRA9iW<l9:V7\r%oG4bc1fZ$ol_BD_;oN_R6?E_P>QJ7MBaFin&IRt&$juERl0!&_0Fm4pgINpof`4k_s8N(A7>or:+LB<qk\ktt1+4*ZCLt,;4V=ba\r%FrLoXhJctD$uLO`A&UR:)Y&`M2b$khm0&=W7=u)aa,j/V%dNhaHqk@<5FrlNm[$4pYUUA>3eVkX5-M</A242]P?Y;YQI=]YX;BX)\r%QtAUlj`dC$aHAKoYb!=<':2?(U.:70dlsj]%O(A\+AADPI1YgJn=Gk;<_EnWc_@qd$&,*0E)GD:-_UHH\f]=(bcYF-YQ]S-bE#eG\r%=C6@Ofd,b:m#dc",*gs-eGX:oKp?O4T?%C(IuPW<QL@D>F1S.2Kp^l#'3=\fmeE;gdp;@Y)::'1,/3G@lum[p2;A(",=I'WAY4P[\r%o4"8[fig[pFc4VaNb1YpW+sJg/?uMgcN_](qUk)]4NFA=>?n5o%t(MHEp46)dLE@dJ_:^S<!QhHZ_rP%d2N`104#Ehq>(85[bg2N\r%!\Xmq'/t1F3J:+ol2#ULZ%PNS.-?G=hq+JTIS3+PjYQDOY=>kf$Y^uI2rW*_>5T'OX%;KQ&@cY5fO-i'`7&=^Oh'ND51r@$7i+l(\r%R9m4r@\qpM&nGk`M^hVadU]4Ujj*Y'g`\H2/Z.WC1).X-M6[-n5f`2.=WDP4U0P)&l7Itqrk$WQhlJ]p6O-%ih6-bIZoGSiFi;mh\r%+ASgN=r`_4Zr,sp;R:K5G$+gEGNh')&[IA*MK;\'jGL-GmCqps?c\]I4M,l,LL=u<6'),QcMbb)SHaE35>cG69LheNc,)(ilV\JP\r%qI]9F38Za>T"\>]igYg)>KJVPa)!.8PE9:%%X),#G38Z,jB*$n@fB?$pgT[)_]ONfkiO:uPQjAFF[(fA@Pk(?S/FQa%:`t;;G^-]\r%[o:+[h"fsZl!?!kMQ/nJ?;u&s;P-64#=i?Z+6\p_U6aVn)<gr*N0Pr/O]q5l5V40lJ_FjKW$Tn7J#T3/]l.]tC>!TB<(&;^AjN>^\r%D5]n8?_84cJrV.\Inurn4DGHQ+U;EtC([3c??'TgC(W1Yi!O-*C>&(4?j19W0oL[g&%.2u\V%*s[>8>(eSDs@e08?;n;#DK>.iY"\r%6#e!VcP])%J_j\(G$d2_J(Ooi?/0(#<UPh'bH%9+:#f5qclGsjik??GomuN_b&^-T2u5rj6uB'mOp*BaWCgjO^FKXRc7Zd!9nNWA\r%5bBo&^`n=[fF-Es($,G=".5dgj<X$EC1[Vjh)o(Z[R,o#>nt%k3bMlr?OU#/Mj^],IPG(.]qs80ANf0">X?cID/)6HQ"]LWCJ<!^\r%dINtijpZu,9kWrNe$91Ya<;9'TbXWd+CAEgV^UC8n;B0p4[nntRMRdGBVFj,JTcK8*%f`j(AAL?=sPCod"U/-U+-JZEY,6><@L("\r%<PT/Ghk:A,Q)(2_]V5$6<UC\na=I#7FaG&BJb3El9/NV_,Qb-?-822LdFN'E],XMi<G>HEB:I#)7pG+e+)Q]c0?;R4Wm!WeE52Hh\r%kU6Do:-KHkMprsb:Y,K-2hGB$FB+4)7jRO.MgZD-iglbfIsP-4IG]@LJoAT1"Vb`H_cccF\jfWqS'muZJ7`gPch;WQW<BP"\f#:b\r%Vin*XqFeSC1\F_t^#H!dK7gD>Sk?/Sl@/oNBQFl0&6@C]ah_tP((sJG4dB80'q^,dXIdR=7'U"rVBAa>!4!1./,`1hTbD5<(ZFdN\r%!jY'WBof$:fk&g)H7HI?.U4j8>u(V:F]OiB:P30gIuCUGmfFN(A/p$hjbXkW.QFo)1pbQ5rPA<8Vg6oVKr0Pg^"&ZIPhkk\0blaD\r%h2Q[mC8_dE9KuYMYM0OO0X4._Hka,?2c)'D3fd0eR8W\djiN6-b4SXf]q#-LXh-[^Ln,jJSJ40g<P(\Vf>H-7Ot4[T9W9tW.[8<6\r%\?!uZ`+`K)bR2rpTflP&`K^@J.EM2HXdIOD089+1N>5COQtmN"Xg^0C7'M%j\#l&6jafm@Y:NI8PkUSRb)u.q"t?.Thmc*Q4RB&A\r%+NC`aM?i=&Jf)h@'Mf,Vq0bqDmjn?74R?ps^\:`B!rWmq1BqWi5h2i7*G)`=MHi=@2mlM78klQOC'1Y%jN-F3l`H-Z%-lD@+-uMa\r%?@&4^Z#<"t@f3(>9C<`34U>XoQ[Li(5!c$BOb-QQ*NG,7-lU_$=eX`X!Z_F>Rc$B-e[%T'@tiDL&_C(,(IhP0(?I5CZY1hH'"VZQ\r%/rZ7CpVfH[b+a!%r\@Fg"a,2N!#A9=LRK'@s!!4cSho0bE+hsK'QsbE08pOeU:)b:Hs'G=?"h'Tcq=@eMrmmmm^l',)EQPc%]_p"\r%63^abC8n6bWkXD_7m]WkMZ;,mVDee<E`[3uq0];sNJ3b$iE:cHDq`omBm8I'4_?ijO[dfmg`dd4=LH4ai;(Fkg._DXF/s>.r1LXE\r%T>^T2.D6+RH(GAH%4Hdb,)gY9A'[Dm`Y<)dmT<DP<3)W4^c*H4]>*f=Qmb9[2_*2B<&sZqCUH+GOHVc7K#7cRl6i?.<2tC.8JORM\r%5c#*bj\O27'"CS5^:Q^a@W1*:A3&r!Ocs%MK6]1l>jiELnU)DWs1J2"*:jMrb8jZC-4>4^@`@3D!LjYg<S5oP\tQfAeiM-JBTh-P\r%?>g&8+KZl[l/#1c/0!e2b<Zu3q[5U9a1MNCPT=Gme=FEXE8Wk$1IjEVcR"mj-XGS@il=:h]*Jq4lk@YjL`lC/TU'7:4\tAm!5%Z*\r%>BG\ACo*7JM$-r)=rPLP`SDS-860^X7gd?gmWJY]Z\lAcMcm$hPM1EaV\F?YmNYpNGJC$Ms*_j,jh&2K%uRuOipQ7LG@F<sgm6Kb\r%Ca)YJ'R(b[K\+Z_IIKaa]?Eq7o</mQYXm/GXO+*LEQ+J.I\kX-jh%1$FLF]f6C?pR'm::8cXU'1Q5'T17M%6CMPMe:gGp?Es4L<6\r%Bm.Koh!-L8NW+.3oA/V;?=tWl%j;=o=-V=i4oXMOe1fEebCH-!T\#Sr9=l"CN"k[sd+Kk@"F+F&EIrY(J5.iT3'fc$f[drR`<igu\r%_=MsJTdY!Bh6]i^h)*4."GU!1:RrAi3p:3b;WtPbk196NG'-Es&W/V5_3J9fKPh]=DRd0K3MDoTVP0OJem/\oRN7\aUO0Lgn*p%2\r%G1;o+9tZjfbfrG@'=skDUd=-t1Q(=JDX'!dnDd1@KQd^LJolt0SFr'Q4sV&.NZ"AI+S9^WqJjflJm/QGi7D_TEKe)Men\FkSRNrD\r%hYtkd=T^K:hcEbb1]o;+adh0dj!Ht9^Sc5'VR_PN=XW=#Rr#=Mm[+?O\DG4i,-H4pirApe4%)!`+'D\*VY%QtE>,Msgs`jV>iV[l\r%D['rGL>BFp*R"0L'\6Y3D@l!H=daAaA_M!"=m_O>^TYk+Jto8_*FNsRe-d-2N&Uq_/l$o^a4MRr+bDSA'p@k&5X#23oiJ>o#fQs3\r%oB=O!B>968pdI1ZYA4;"pu\7DPMGPr`*%IPJfXW)H(-F+S)A@!ZQ6QnSsHm\\.)XN$g56QH(-F+)d`D"H-V9+2LN4UOgjQf\&l5b\r%BTT^f'"821MhOoIEoK!a.ZMR)FG\aK$tHQkS=I(uX#mDlrg&Ap*/#YagJ.0rb+@Kdr#2]P-/ph3<>pt.kn:I>@sMVGD7[Z&%`4mO\r%9p`@afZ,hkgQLMu09OXh5_NVGh%Co9$A`(:gY._q#<[UuZulhG$LgriNGn;8AeTeBXa[R25nYD%J`X.j5nZHjoL?<J5n`u<@!V*J\r%O@9'RO1n<sP)+0!KRF8l(mh"GbVfYsjGt:6I12:[++`QHQd]3RQlsGAdum.Jh^iN`Ui09$0M).h0>[abS/R%PG)*j<Z(`-(-B@8V\r%9am37=$]8>AqWJHFZo@KAf)dN\QhegO.]P'1kW0e=O'37mF39Ae)2?B3AlV&Y%fL8ERE:RN[m(Ha<@X-51q]hL:G\s3UJk[%+Pmq\r%XED9'l^SmS#V:A;=R+BY7pob9@B!1X*.d2oCm!@A#V63h[8V\tJ]2t(=R"<X7pn=_X.:0i#V9[k=n>AtEgOY<DlHZf*.bMo\$X5U\r%6&rat(#/kE78C.RXD+R:3LGNlQBjQhaMBG,I'L7\6jg7Y3@.BbX,KgAITtX-6-cCE6!3O(T\R`1*n7LM,Lotq#!&:[i5BIaI)>W3\r%er.LB%<=WA%`2tY#.^8-K<X(/6-cAoWZ<tce0*r'+K,PsFD=XUZ)V0hZ5[%jo4JD1q=[GC3Z!]!\;_Jnm2EVflJ],l7r_`^.VI?U\r%0l%?kQ6tu;Q>*WEAa="_rJJac.q$#nbH>:2($2TRc[>u/L<"J%Tp\4jWo'sF_Ij0;ZIO+-&jC*S+iI!b"ppp0;%QlGfAP9?6=Y-K\r%-."&T[;3jZa2D,El[U("LQ)ka,7T>HGbM3="QBZUm`V2RZ;'V'?&(%EC$'h+)@A10m=+(/92%$(A_O:YA)0pc!(]>W_IW<8N+0L"\r%B&LQZk%o!@hh#)7OBSJg584K.cZ4m)99f8IlM9$2n(sW$Shc@\TJJREb$c:U#!SE`O85fsXR:!$/th;Yobq#0a"c51]4)`4he\.]\r%UY`s*,B;8,e;>le]ZV2M`tl8=?;OnrcN!og^EiI)EP\Z(8\5eFZ<rc:!r[oN-"T]d;tU@'>*Qq)%;_k:HB."0KM/Sn9]r@qq7@la\r%O[d)%c0']A4]rAk/*=PC="uoZ,Ptr!*k5No'OY;C7DjG&f4o4+>DM<8%<=WAlHWd<26c2UD67npOF-(eO#q\,fPW4Olt^"P7nQfC\r%29:dA]!n>T:(;6:+)7j93&Ot:Q(/cRHlAZ1Tm<PjJt$q5cT5Uq+6/WUp:i\pmI/i3h[9tOQuOa.Ri2"kT2WYiXG%e;93B&?M>`SA\r%G8``3#"Z/d8\YG.i'\>(cs*$8*i>N\$o?C$QmYrX-]rfK(GDRlbTQ0[Z,`DY`?CZhpNJ<Lk'Y7]n)hdCcsf,[3s]jhpX;%L<Xut^\r%K5h37L#%8R)N8=_St\8_Kk@V'.;pAHjcKM-=bC^N]f9O;CbQ]mcrO!7DM,d8KXLqp@iGir-+&rT7V;u=S\f8YK>G'N[R+oV%YJa-\r%D<2mV0c68(<^MPZB%flL;R;RqEY,YrN([h7^)jhs9j;adN7G;#RM+%0g<)t2Ljn%ber*:O@$u2W?S6HJ<`%%LK>G'<"D]6!V;&3"\r%&8h*4o]riP[T[J)mA6qhVnMa-itC'<<c)V4D2$t[3t0+Tdg,S$)[s_4O:"'G=`5uHh]^TdK5k*4X*o0LqACeX#3.`].h`-I#KH'/\r%*+P7TV@(pk^KLKEqDn98WPAT7`<Ls7s)%uUf"bL.0J9??JmJO;(lV*;YdQM!.h0KE'j04UNtrXm9.I0SF0HDuN(YY)*/#mJj,sbN\r%NO$`2K5hq2r$Dil,o'OTK=/p2S7;BV<dh2c0<Y,1kqa0CfS`D'Cb.=Y=8!`BdU6<h0+P$\0Go;HO1'(2;B<-*[c1Qom*XK(l=FIW\r%[XrG&_-gN"(EA)[#3-?M$G:7m0Gp.8WP]d0nN@V1()`'(BWJ7Q-Dh6l]`K>P4bk/PCmhDZ@e#_/kEar`X._3EpsTUBSAbZFV;Nqs\r%]Lr5W3Cdb@nX;2BOSHldSQQZ>`Cp1u\E4gQ&QgMXi%bENcLr*iU5ZQ@<,usa;PeHO-`!#4Q?\>23K#-SC9b7XS?k24qCM=UQh(Ug\r%A7;UL\=@3)K?sn29R-h'#cI^RRrS]N\o*M:\=BlbH5>o)ifI`j?9V]Q!f_=$H:J*_)p>(0jni=?Q/jEYoG.'phtfts",nt$JJZob\r%2(7CcUHV$5[o6ar,6`ao6J("O*G7<.F;]KXpRY_CY/e*@71=s(?0\,r,R$U>-m<s8f"6tk\W$X0=QhFI!P`XLbd/Kkh>7!*HHYkk\r%h50(;?gLuIF%uqPkqj:AO[5,KJul@<s$/@k(ANsXo0gpg@BjA!!sOHIS(m#(=)qH_@_oUY:jut!Mrc'<p]j]%-_E<7@_oTnQck*(\r%@UU"&9eI5kr.FTNk$9U>^iIp>@p.dG\%,6$SrPfHYulM.b=7\ad0qH$XmE?g9eMH7jNF_8ZWQldSn;ISD5hhXjKWT"*''s[JU(Ga\r%^7q7=U)kf0)U/\[;1TUY\DUSVHFT^p[^=.FhkF)!AKcu.+feH.^uM;:Dbsr_=.iF?VO98>I&4D(G=IZ6%pDeW2:)(S57<Wdh:Jc9\r%<0m":LFQ-l1j/h>PS0rH?Cbt5.CbG]R^t6[\-0XuS1g1CP=[UQ=)CK)`DJIU8(#Ui8H\X=:t#-F&[(5jpF9.nqMK=F"'7bL/':am\r%kNERn#,/MR&?%,qiNAY2`Kenbe<'*!dAn8<aO/B;MTgBj"e,8TZij[,IQKi$<0l2"?)O6d/h.6AHZ[sJlDLq<YPc)GamEs(>(Sjo\r%87cX!Id4<Se7BsT.#@NM$0n7j0G6<R-`DsGK)CuZ4$d.O(2+Ekfa6r<Z9Y<uaA,PJQ,T@K#4)K#R0e0fo"Niuj%.:JSY.Sb$UklO\r%li_H.=l9U#aA,PJPm,sD+ZhtqAqI7JH+r:H\6Ohcl6'o*$ee]oUC=JPr0*E5"?g,WZE-3$JpaHIne*+&R3;3Z0OcE.b=p8ke4rgV\r%1)0RfQpVI4OWj?51Lqlsf4-.`qnEuQ'@^S?#V%^\I)oVM5s9VWNh)gq1I3j]NS+X'1(sf(V'.od?24"-.r'u:4+7qiG(R<L"P5O"\r%]'TWCR0c4QP9E"R?"S]8<S!8&TWY:G'IOj+'@^$IjWFuc$0nP5i[_MJfEpisgDkl44$d.P=TT@;XiibFq?%72TG]f9!*-[r(^k)W\r%cb_:8Q?L92l\jjIXR;#n=.]Xubdu)%fgP"&Y!,Ljk"9E%/@kU.aS!YUBFP1Pj]>RVl*qOH_M],05`_!9\\>i5?&#s_%;M/X>#h^o\r%:aAn^/3_C0g9/KErU'BJI>o8f0]*U0s*+?tNig#WrtHXTlP=;"[kmOGgi^3<kdT%>r0D<5!t4=\df7s%CL#h0c.BTed&cs=n0\ts\r%COjt[Gl%ktJafibhrD[53empR_?:lD>A\nU"t+jX%,USkhaf3Hm_pBjM4;]*,`i?gXa+P%@>FTfSa<Xof+NOsS+Qj$<[o?,XT#Hq\r%Ei5L%dHrF[P@9tq%IS#t>1#qggVS^eDq]ed[++e2!GTPHZ:5-3*O*?qcC$A("D<*-9T,%'KQ,P:h40-pqP9j=E36RV=$jDs>A^-g\r%cp?U6o3+HdYLS`HTK9dJ0OL]R!Q8A7[fu2Ol6$9BT,$dGlL^C<b/Pp;%LKfpG/lN(/uVN`nbFoa"IDE#CBl*QVah0D>Ol*k]#qDD\r%D"jj+:2^/&[_c<H/CGa@08Wf@k']<-[i(]5['Y12*50=`aQD:^-0%L8;\t)E6]S(R*/#lZQ!"9NEU-l:Xo1Z7G*V\r_rNWXs-_=(\r%Mnsbo9=YQoHdus]o3I("Ud51t(MO!_UPW9".`%%fAe2%#Ode]'7@inqI760)$Zen,mg>ju$YRA<06bo!^8k'\KWCq_>/GJtA\32!\r%`:D>.$/5V$&fXHP,]"9C@kqPs]lZp%<X5C<SF=nKG4FUe^iuWI]&>u]:!$7<\qht8WL9g@l=_<OIUOs8qIZEafbi7.(B1u][1Zah\r%PA!tHQ5n;+?-Y"'g6*\l@.a+h?,8>^[b^kZKBV<$dCIT`0#=,M:Xtd"67^H[_%gqP@`J7V60:eZaA=XCbkB;u?"FIA?0mk[cu.C"\r%ju9.I\N9"U>B56%(g_!Y[cAVULZMN?CV]U+'cB$eBu52&5umhlRG$NUi"l\)U4clIRLMk[:tqC++er_/fq>.N_*Q^_2Q5]4B<Bj[\r%Uh5NtX>Emn?2O;^%8(BDK]ka@eQ1jdG(5!cd<8dfBpeT(I1tM208@c$(-BaV;Zr*@Zj(VGC1e+JRk:IU$XrUZ8^d)ZQ8f@l\uj07\r%.L-$-Do!EDS3$*)]5(gU=nK$7!eoMlm?SU(Y6R5$Zs6I/7i4Oj]?ZL(_F+?@8mEe(?IehOd&JqWQ<46l!k-fn>@J&O8l-*:D+hMZ\r%F*1aL+AB6jepsfMGn6@n&[k$]D=RQ7`Ot4pI9hoGku>0a`-E3#)AF^=/BB3>!3MPEMF-eQ[B)[!,0X57PhqC`l"mP0[noqXa2MkI\r%iqBd8i\#gqMT5(r>r$P)]DM7<]/p:T[6*VZVP7&(4!rIZh/sUI3s\8jpYEZJ>.a*`r],ejMeTVCh[AD+2r[`u2'`C-h/sUI$PhI3\r%XPI64<h#i7c!a$e2fj-Ac@D`ijFuM#L3E2QVoAm-jS@=4bK&'PT9F-'X*k6hgP&5;[iK&9:62/0:./4.?E8'N#qU>#WJ!PS_KKg/\r%lS&UraE:OJY?Y&i&@N:,fLsJh#0#<P)pC,e[[Ke;W@.mdNt&5*XEMn@UaX1WACD!FaTQ/>0?M)G9O0r,_t-ZBWMfuX1bl\&(XfnW\r%a'fHWBN,[4mK/JM2UVLYh4RkI;2Ds*%S<[Rb=2;qaop]Yc.=;ME+0k5#9`Qo+=F>U3C;no4E]X7a*,#8B@.]OHFV3g^j@bqRqL.:\r%LLgl7M#Lm>n<lMq@_h9F0F)CnWm@@6etZc'b8Y6MqA1Ski;sN=FPi^uogG:&M^RRUE-oWkk+eT49;IM[\!(FAeTNH5h>\$@.:jbO\r%%TT\\G<P0,r;2AWG4-&TpbkK/7F4+KZF%5hSc$`oh4dh!QafU.oC5bg52&P=[S96.jICI#B9Iq&54E7s0$"jOh1n0Q5MKR8@%!X[\r%*^k'q><RehaBaSY558DbTopLUK#D2E1jN:Y1=:"=PpKM8GKf0QR`Ch;/i622naZ_Dal)go=:*4'gT_mc;]G>4Mi!Y^]?#,FW*sho\r%:8[6#J9I%JOZ7=mH::ak\@i8*mVCdB2Pl25IB]o;F9gS?qO/.QlXTZ%+cB`9k!^HEGmUU$3(D::\s9nd(LJH^"`FI[YUc@i1-#8%\r%OR'P_l6PO+oeoue>Z<":f!NhV[1=K1dn%[!2HgZQ.5]JYU5bI8g9[c_qqXfd_DYS"4Xf2YbAUZ*/I,\ng60EYK9$g-``d%&CHu+!\r%,;+d&\b*AYP#`!Z6<h'U<`6#Q+sk-?CU_M]%;Xq:#o90cH*#PFqH;-T9@/t=C[E$lD"@KNd?Y(l2'$@'4Z^N^;BB\;JO/qX9`:8+\r%QSZnZ>9_YPG+u4PIS5Vrq0m_be8L2[1?cdFWo"Gof%LAcNqt=>CH2[tlF4\d`OTuXlF00_[5W;<U4,bR>.h>H4nW#gop0(uH";mV\r%+[k@6eSg;p>F9oFWI@LAhGUE90jDC=<a,kK79f&d`9OIa_k@P4>@R9VRX;H;IS7UdBO#ASh\&F!XaSsh\&>rh15^8*Di*"K%RRmY\r%lcf)6D,i6n?bI/Drp8q'N&)V>MjcSu:1lnIb,Mc^`Lbd4Z5,:GgBpH!L23^\<_`sD:^FgP<-)*j6(M$$SK;.G.FpfT)TAc%!mssP\r%,qm&l>q69O@.a-NM4KQ=']=fT+r(AO]+Xq.)$-=]Yf(<$]28XP$LkF80m*NRPm.9G<kfo,Ct#62*;8$^@f[WoCg1^In.+9'&)D^%\r%me47mK-W+cX*d`te9q^"qi:Ji^EU4-$>[_tZ./WJ+,Lp'pA7XP!7.*O^MF0E](IPtHoiR&erf>93Fm;5mZ9dM(]:A^D!X#*+c!M>\r%e&/N38IS;k;J;m^&V$)jYfC+(-<:jR64`<)LVQ]BV[D:\C@k=F"Un$b4<mAWms:]p5$T*EdmE6ShrG>.[7][,_cN'KLC1"U#nUJC\r%LA=OSKp"8IFlq%TFIp\'6b:>^SF&$t&*Y9nKMHghkoh).cs'N:po0GudR=Z)gpdrB8/F937'IVVkfL;;p0,#Rni:!7+$[E0Ua"&*\r%e"Ss?Wh8u^1q7V3,"]*[?lQ"WT[%""8Y_EB\O6[7'UEO(Od$LWd_co?!;1V0X^8_SI[O(XJUN_4-Mg_7Zjg<*iad<ZEYoTeQ3t5?\r%dqM3&EBDirJWO8?j$r+&LsXOG=5$EY1cS3EnAeIQA*OPL;LGA,O67Y0394e59E-)\B>2tWNcsA3n3mJ!+=&,89n4dV4WtBfJtdd-\r%%83rA`H)!N?J1?T8%'^:Wp,qTromea9U-cED!U;tk;etB+YTFJf8$?"Xm";h/.ahC@-*OiBVT#9L=mVN+E@eV)ZtoOjn$Y?2:+;l\r%G039$WI]4e0tTe&WI]Neo8sr'b"l;l&34tN6DT?%`u#9V<j]-Qb#ArTOXIak"/L[<q)7U<Dh`kbE?=pn"[/Z%;cpWHGhWQ6C[&gM\r%_oJL9!iQRS6j0UllJ-+hNcrXjBl+NQ)#s^++=V<7Cj,!N[um+9er"[:\OE9CG[C]hY_+A)JH@7j9hp.*C&q:Kmf7'aRfU_f04X_6\r%:>).5SK*1*/"%2,WO@(TgY9^8NB)4_Jcnsr^Ec\WAaf>/-n^$:B+-8_<"qT7O9-j-\stMi5V[0'Cr,.?1Je)5W[+tU:eiN>[Uuo;\r%i3dBsZD3,&[T;WUEO#)/8U6\sRZs(=$a!hEPV>,hA'l7Cr&%0!&ghj)8ulA-X]3_jL/Okh8u75@qVu'C\l&i42K>QcHdiIaDk.k(\r%'kYe0YaQb-1H79=+Mu0]P/6\MP*kFLN\B8!1,tJ1/:&pb_Gb!6$A2XMjE"b2ldD`]5l=khpf&(u0On-"b]@2!\t9VZKs=C,nP'Q@\r%?+a%fK9@.FaFXoaqNB0YYtg#31R<8<N&?4i$1=`+NgpN<]c%DWiQ0.!i$V4b>Zfh7p^kR*5T:sJ>hJ"a`Cb(;mBW1(Re31T.<Bpu\r%qL,1JkWeO*`mrR'"_YYQh&Q9g_LA"Wou#;u>Sj29XRt(l'eOlBD:sCeb+Ts9+6lN0L[sQNbb2I?d26)ALYZAX]rDmkCdFR2qCGZg\r%^=YA#?T5Bc`orq?FGk@6e.PuJ&dHP,%gDT[d9Fph?QPJdD3e"^"m<g8fdrgD$f!D`CmIn]"n.GoZ<9LgQ3lQ%Ls6RVi-\hD*]M];\r%T$^>j:>s:9i4se^<!l,j#"OSCiQ0.!fR4Oo.3(>c*+sC;C@K/PE;i5C"7p'tZ>Ad%cWOl>6$rkaJp?2ac3P$nU/O$l1-#;2i^)BW\r%Vj.l*K!i8k%u:JSQFo!Q&eFsS&,m:5J?NTR@YVde_>1FUK<Q&M6K/#J]#+kk74uZd7N%@o'!MW!]m;'\#T=6]=,et]rh/;)`,ErJ\r%)ko0!?9Aa8fKj3K``^4+!]]!*RnhpND&%K>hC;0LYRL:[&TO5cpeCMqBubj,VN:e<'>NdE/&fcDo<(X^#!FQU!]UhQ2t2J,$/e@5\r%hq38le,YNIp^Kn`L5$)4`Ga*@$Obn2a)<k<h&u?sAFtLBg`Vt+A+P=$DU9Q-)\eItT_LesDNLa%qEZ<COJ]A\5mc?ioB`fh+cR*7\r%#?*qq."2,>:]d5;r`2VtW6]U-s6h?:AnGWuqj.rbQP/ec-in<][V.Tj^eNa+KB,o3l>rNj5>DO+h;>]"S!D%=s)L^3\UMlRY]m@W\r%46Tj(Q)k_^#;)[6SsdHh)jk[G?:*PrKjQV3?I:iD1K(HY(OlA+<f7n=T2s=NR89)0`d4DomI\*g-H*b)$hFu/`s_9]I;1"cg-0=N\r%bc8@n6`Et'cien3]DoWoYN2.Y$Pm@FjJfQZ0Bdb"-*2F3EWs.qe5j9BYE[LrXfgq((VSfCXH]_dhdS?k.q$MV$f_SuA!N_P'um$#\r%?gY=N>k@:\Oo=?j,P$*-+\V9`\a2n7Q0\]B:>g?dj"fH$hRV:YO+Qn$kCBXGN83/\%rtK`>f$V*MN]nkn>8?`D`(;;eaFU)a'!'-\r%R&\rUNF1qdVHJ-gqlC?FBd[eeomP4Ydk&rEPce/\VV.X+V_u_npC!g5<cZ[UKu\UO.6cag/fa^7LDc#2&lKPD\Kmm%Zj>puabbcg\r%+.Z]Q(Onq#^Eh67adukfFGYWmTgDA8&jMH#0A4Z+Q3<Dm^48p??qE&/jHmlFLtDio8:F,sre2N1KY'437c(ZG9<_j\+o*EsL4g_d\r%,`lBeK?::4bU-N?DjHZI^f#O9_\5]ff+2KP+Mj:fZ!,.\^E*F;mX1Rkc.7s5X6<,dc<0?"0<;1A33iXI?ENq/SBW%]#=m5Zc2Hg4\r%X%4!8]A\`0o?H,^,cuF@kSon\SQSKd'DR5aX)4]j8"2WJDYo6sj.W(XGsj-DiSnsVDIsgY>r[DY!?;4<%aEO_lgoIUerVCt;NNda\r%kdW`PPCi9B&YsQEHTu+?cjg(:i@HNT`eFV;1^d*$;o;abi@@M/jPl#.JJM`+B6=iTEQf*PK%_!D/sp<s@G8-uWN:_c=_m>O^0DGg\r%XEEC@fYRt$>D]X$XnonfXX%$W_Sn=)RXi;r.VkRj1H#a#fa+4;Q'I-lMtOKIJ(fnI`mZPh\C_O4@F#3R=(32%EEGcVcHXkCE<qPr\r%9\*VVcT2g_(B=2*>ZgnC/q8?lp&k'p^PM^Jm.Nh70c7=U[nn?)6TRgh=+`kj+\3%6;rXJf,"N-Ko6f3;F9X-_66lc'(U`!jA"X[U\r%8.8)er%U_NGFq)&MQn<U.7L*=3KY0YK'>Q=P4F[>#8KnSnMck9;KDD)#-Or=]&8btT&s?1.E=57Tro:'OekWAFGI7*8.>,2;^s6j\r%dDsL4J_4Si`'?&1kBoES=4/B@\UKq&i,I0Jm!&TN_!OlNn5r0G[f/%3R`lq+#P=`N>;$IQ>BS2KPE/^RICV4W[$\=$f2"\T)K=*S\r%O(m/+4X.",([mI<Xh'GSmjpE"B",B7dAi]$p<a11*B8m7hG.@G$cgl!bMT:WB<=0uFnn+Ad2A]aoB94\rb!1AKB6q"jmU^,Y=huu\r%mNCDs4%uc>C>IJ&p@NMYo?_m+nhC!g),"#4)p@aB(@,E>8WmgoY$t\h]1>o'9.SRFhEKdKdo7-bq;ploRd.c]A't5GE'#f&59(XT\r%1gk8m0f^t:F_<^"9IIJpS#F4m9HSVOkUh4SnTn7;;;D3F)PF%(n(=#&c9#r)IDs>RAD"N`Mm'oLb*FnP)HlnfkND/X+DV0\%>g'?\r%';)Xb<hkotc`FO(Q+]-,lXUO/n7-Y;rF,T.48W2%3,>_[lh[6J2o&'5:(c-a(21KY(?F[<51TG87_=]m93=^Y/1<3BJ/H#-N4`KO\r%-aiCDD4iVa""%jr_Bh]uT92f"_BmfUI`)8:4O/CW$B:Z5#[C(7PINFD=ZcV#]SrJt).u`!pNpFH6o\!%_N2Lrk0i_lb:G!@]5G#Y\r%nGR/^qO01ek'^0.brKkjX^o+4J?er3o\MgSZq=O<]\Z9E!V^2"JMb=VTe>#M):&f*A0Xt:kW.d\WQRQ+GE'JWnU22X)GBLGZ4n3i\r%FPojAjYZ@&;!Q5)F+.g:lOHW"2t\jnIJpI_J@&E2"];;2Xi5+;0=/!$>YXU8n9TK3>S;?o6pfG)BVj&[q095*iSeWlUN;ZLCuWu6\r%a(.SdYT/dK4P\(I_5^_qNd5?(qc<Z7\`.i'!!KU7A`W::$s));]al?oF-l%J_/i:fk:Y#se&$>O57Rsl:`)t6oDGkD6=Du"\h<N'\r%6@3.24di@InkEo@hZBY=hOSP@/PqqWmle%XHpEV!p(=)(4`$/m,Sot:B7AZ:m0lIbhu/$7P<Ds8hf;LKj)%4TT1p=Nd=623hrB,:\r%UpUOp"MJSVf>gPOFb(s2h\krRiU$;f!]2*&'FrG;7\C@h4YW<,#!!&o*nXY0GRjF!RGr;3*Z3-&K-uU_%ufY$6"c'[%ufY$ffl\e\r%%h.=424=UOoDEVl0U`)%6)%2-Khme&97V^<-gZ#*Y%'/u&hL[Bh#jE4@#jh2d0$-q7,_E#f)qe=E_(/motY5j=4:`-?o/)s'&:pT\r%.RUD=-?H7D<+Jd&BLG!;RKI.`muk[?iT&LH[nlDe5K:;)3aeC/ENBd[5NDTf#99uF#0B:pj;+p(2@e0+I88>R&/AWF5M?4OR9;=%\r%Vth*>*jH-J$*A?q5HIF&j)r."f1"VR1ot-eE%.j4i^U\RLO%'nFL)H8d)irU7+1_%'U44>*Z3-&EuK*FH=/Q7%+[+Q4YW<,VWmFg\r%(u)A+b4HGN%bR/L+O("`3FI*+)a(@4RpWR,m[ohd\$WQfAU6(5?5)\tGggFe@!XP0?M8LR1;+MU0:3bk1VG,9Nt<%9*':L7(j!>@\r%6+@?UMAhb_(d?67N3*@Lng%L\P-$^D'F4YK5FL2^f^/aBj\FQ.k_c\!MQX7@3g_m2&QVMG32]HY,$srIq-E[;8ie,"O_D!j^IsZj\r%#`K$h,^Zh]7b:'Makj\cH7RC/6SR,iMI]N(-#AcNU238TBgK1.=m72YJ\K`(Cdl^9W^uh/p#+;.P"GA#I%ffi8G:^k\HL_AU$ND;\r%Cdmt3@q:pnRJ_?Nm(AS7q/'GngnKI4cZ`IefHj>>=X4##\']E_gHl1VjQ[r$p7.]U)WMG?Y1_9V/B!^iJAp"b=t--koO5MEn`.1t\r%i/?N!.Pil%^J<aGK^_U\&S];'^0&SkBn40DoC?R9'-27q439#;mNSKN=?"h&]bSaA_=n<NYsa7H![J+2@YkAo"EkL4La=6q7D)OX\r%iA)_%F9RgV,+5TprD5"[h#7u#@4c/(@AZ3Db`ZXN+XJ1AB$%BbFp$>b6H^1ib&YQT1c(&%AJO[f5AL*0Kc5*2:tA%nj%C\`c96::\r%].u?E.!q["50NB\X<^,gs%kHW+hRae6HK&apm^Vu0b$:pYH\tkD>6:(SQ/HMQ)5+/`Ys+b:8h]jd-'s*:&.0d';E+e5>E%8-EN[e\r%]'qBsdZqu/GKDN^R=o\%$'bo49'AoWd">NG8XH1W24`,F'H/=*^WE'e_T6.P66eGQ_h@';NrPQZSLH[&e]3ogc(Q)U2"(U?:Yngk\r%%Xb?#jVfIN4``]-&!,Ms%.o/+Wie8r>HOg?g)!m,3K&mMdD]4`?"$IAEhEqXmLNSeNW/bg[XQI%4+23S9-CFJ^@j8.SOd(,<=cl$\r%g%[%"/bJE::NET)*rcl;0Lft8!_nL90YRPXB&-'`(6&U7<VUjK]P;%J5:R=7pe`i$VkKUrA+:dA4,i?,>B![C>&=uBAq-:9"TJ)K\r%C#(\J-BS(o*QASoN?=D$eR:S3:Z_glE+(LaN,Ic$5u1OGhI52dFWNO,>R-;q_JG:?+i2M;60DtH)%t/!gh`eW\!nWA+i-u\"hHJR\r%O<A@=ZKWj.V^,tI0N;*s`@#RpO>Zn^Q'Y9g'imm=Z<GYe$<.X6<\+-]2ItE>MuV#\?Eis*ad(E9,qm+L!S\_=;-*V+9%0QM5W!&k\r%YH.#^_P=4#Y5*3?i/C)TX.Vc!XK+0`32XZfX0CFsMePn=['"l_6Wt.[+o[jpA1CtX9T)2<_+tZ%BdK2iq\QZ-EU#%GXqZk01$C)h\r%oCFF^IU/cr:fdM*$N/$`A_"C$-nBaP"XtBCAT]q5131:5L/gI.>*./'cJ[m=+7c-#m!e=jmn2L1HSl-@e'"f2]CX%jR&';jScA$-\r%i*'t_6HR="Ws,;+XRsJ%fd"4cq-jS$?^p8)IqVaXQ`Z?Sc:pM[Ml"B[.(l.$&4-su<"'`WHni&SdYWiYbRI2e]en,dSugr9_#SUF\r%5#Do`QE%N_8JV]br'K5_jI/kd09^#fjBn)<)T?hPLH&=4\sFr3f9K_)mdfHKBjQO""]aC%6kS(P$T6b`Uj:X2@TCmj9U_=8M/G3,\r%b=&G+X.R%Oq&;@LbGtaq:IE:b>7WOXK%=lM/LM&%4CK]=1'\!bg[M%cD,cGNBC)&&h:ha0^Nj.X!QfSsoJ6I4kl#pHot")JIRC1+\r%:4;QmUj.1W;6XeIqB"Od7*1SG).kpID&m#rhG+JP2s+>*]s2V1JD]jhI=M9ZZ?JQMi^$g(2Jg_c7Ue?4ErD?a8*:mDoT*>Uk2R9_\r%o\Pb>V?LR*43o7"o(sb'VpQ`1ETX4mpcLX!FD$*$2`J62K1WUTFD4ZPcIV-tlS3jKO`TNB\*&4OkXl\&gE1\r,=cggbb!L(r2u)q\r%AnSJLQd$c)FOi:78/<_t%Qo4V$f3OQBrl:iWs:#[aAm-_1bGO-bS,?`8u)h1/p?A_@0*^(I8c&#N)\fb$CL@>TY$gIAOnLsN!9RT\r%dY7ll7g.Z)2e<0:GY8:NRA_ZEVU?B:L'0k&)*fK>)\Q\l/&d8Hs$-s5a@IBok]9ppjU;HMNX,\07,!`1k_S0S(1uE$ZcNtp'r>Nt\r%/^3@tD//L90M9U(*B`*VQC2YtV(rQW+/t[R8gTbeI_/.qeXm<G,H%NOV7WJ!g])cco(F:cQbON:k%CU=^X\r?paa`Yamn#gP#[>S\r%8rb".`FMrBKp(I>B>MQI5JDC&QYV$[8VgafODFaW4*q>'I0apDNcUo?!eDti37mf+ooc/<5%j]O>],U&TR/`t66q_+,\*)WEIfmt\r%k8)IKC$SAKq5s!C]k-Yo7.CW]Hh5)VL,O04bQnTH`P`L%ci=\_67+f_L42aB$!DWZfblp'L7qa+S/AiP.c+Jb<ifo8L#,q"l%5%G\r%C/h;,p=ZGcS0%%7aCoW1i$q:8[X$W4q.U_J!C+\"a:MAVp;IZn10Bse[O]KeN9?G0!T#dd0qMs61lR].CZHTi"+M)CqM^+=;_QuF\r%VlRgNk,l\cL.,ZBjgegdXVj;]lj;Cd4pL/g9l7k!,sB=9j8*"6(fsYn=3q?Aoa>NVQB=eFs+euYP&C*G7J*4m-1q6#51%t;d(c,F\r%:W$OE^jjBASX_=-s!'UBB%D;TF*@5&d?]4H9>b?9cXjJ4s8?[3NNq/k^<)6![e&t8;iQmlDjd#_-/^3&kJ!65r<A?Po9P)rqsutH\r%Yti[_m;U?;&*ocdXP[j3QgA;[V]*YhBu^>M/aS;c\]4$M_U#iJ-D"s'DH:D]kh)@lUfG,JclUe-dcG!E^HZ+\X(eXoMMjH&a#Vbm\r%5Ll\YQttcTC4u6sk?ML5T2.'h4m\2LFD`A"dZ8GbM3o88Q2[o6>[MeAkcK5<Vm7!\#:luR$q%5_,"rJI+pY@$P;>4$M&`*.h?6L^\r%<[*<_8RuISoLCTI1;+H?[fs3BSG?^KG+7*"1VRbsHApBlZ^\^Anaq"3h%h^!d$%gjh%h^!5ZoM>gB(t+lmXBfg\b[<.XiUlp6@L-\r%J,B8u-p8KfXgit21W@VU_fThQ8lneA7*56U7ZaC(m%t(Hg;l5+'rd1[S=%qp9`0Q@`6/\b,DZ/ajH5:;$Z^R8UXrL\h5Nm*a4pdn\r%,!GsY-hkeK=!!5_g:X[gDu%nRGf4'T>gm\*$7EKV9H'=<&'atUiog\1(-=B8k.lHs5JF$jYn(PeD@n/?q9JXR?<_">n9IN^&cB9C\r%pj?im<o_IBTV66>"&bXQr4HS8]QXjoKH&0TT38+UZgmVXc#6XkDH>4knM,7FEcTR`Nttna-7iBcpTkl4fZQ2dIL*L95_+e?[(),e\r%MiWjS#I`!ZFUJ_j_4Z&)?76!;A*_=;L,!GmpA!ZXYh(6NZl!?)QjtCoZQ(R'T`'Xpc"4o85`>F>A4kikR_BW`R$SF-K,G:nN;8;)\r%R&5s":Z>mXN1q614BZ\lj/4BH4Gf-P[!<fK7lEOpL7X\T<F:^T1%ZLX#KW.J`tEIO\`.+Dk)'mZT/]$3l%3<'k7N>^(4F25`Q.J]\r%0=Bo"[f4[M[sUnnI/X&#@mnCpO4!.2AB2aK$):,#YYTGaRDICKM"%qL)"@C_[X?K^@qaC?$Kba+VJu23_&TPZ-l86q8ULrtaWb+&\r%[eL]OpF9X>-,(n?ia_[-UaJF),X-t6r"EXJo&F5)Fcka@>k'O1qrS3H.>a,E\Vh_E?<m"Ti/K*6oAYXg_<SlR+B&mpMl4f-`lB!O\r%O..VF_V?/T#JGb9jePtLR6k8uCir;>A9-+/[P&Df-_mT]G1/*LBeh7e:F7G`L7OH_4BYYR/isQ*0Y6@U4%Q]EVT\5tMJi+h/LI7I\r%/%XEWEHlc?]ln5S3=g/ea&In3e<\5E#lLDrQ]'b]nt%R*QYR&4,_eZ=O3;F*Ap(X24t1!;%,ET-$GJhAJL7_]Mq!)Von1S/d;D;1\r%JhMk(9*kc/U#T>uEkZe7=6SXkgs%";i%*:W:eRC%7i('B8LsQCXhYfqi+3UMKjI^1]9$(_'frW+HP`pj?gr0/',ar[o.MhlZG=PU\r%0fgn(=R">`efQ/h1.99XM_eKaY[6]A/Q-Ad,Md?D%#L5)?Y8VFT-'.d4D?@?DuX]8>;t`Z5`;`gq=2"K*auT.&UNHh#\aAGhOQ[%\r%2Le/=(dkO.B&kH=3KE7*`(-U\IsEQ6.Eu5SG?a8QHTT^ikl7j2?Z7fN+&@)+:ReV$bqu-$)/Iese(qCaB/u4t/KCSW9lis:<"(Dq\r%YtF#7MI?P%)AR=c@qqcJ3.>B+?*Hc:JosQ5RH@i@pmse&3k8>Tn'&!%LCdA)O%2-4E-QGon\kIYI"%Uf9f'Ya"cG'/="M7n#XeHB\r%9nq2CA6<G+C?XN>_A16&;TW&hMc;5`(i.K`-<ROs:p>n*X4\tgF6E;YD>:U991ndl5,iNP,p`gcr2XVE@Y>rV]:(A,"8d#rO<d-@\r%KE%Y[TnmoLJI\IiTnj^'HYo_nTnj^CGZlRc-t3Dio(u#kMLr2KT$S>'>q(A%`"&0<KinRG;9Z:S74@0UTr4_jKHbTT?p[jB6IBM2\r%=,]to%[`Ft;27s^nb:]KMS94H15$kFY0[hO/OC%R?EgK''VU=7YON8q'gaXP+]f:C&Pq_,\mg=:^@a1`:F/=>B=cI=;Ct3iSo6&0\r%dtKuD>(g@8Fe]59La<cq,;):pXimo[8hs\68t-g$Pb%'ugZ_G$kor27%#BqebI@^m8>Zbscu,jV?)HrF`k)f(FD8=Lg9Q5ae9"_\\r%V+@IVdn-Qt/(<U"TBNh@_(Y:4G0nD.)X\EX9Mc5#ZRoZDZb-;4:_l-,`Qa;1&%S0;Dk%K'R39tTkp4fU0%2]?^e_/[(ETaJ#=e`@\r%+YVU4[Il^PJP+1/Bn7dJTuYL[*P!n7qFsU9SRZb^>"3htVZYt82mje$*+s%UB=ai-KWmtShZ/p@hlf]R$L*s2Q6Xh<#Q+EUGX`s>\r%EP4*=;;Bf@ZmPU/oLtV=mn87FKP%g^7&hMW7VJZW--+&rkmDjI5q:.VFPF*5b"nM41L93n#qH/eB"G9p;hJ%uUO86I2_?&;M'oCh\r%Y44W5gtH?.QXTJ&R_MhO/dKg12BtP3mIF+^'a[Zb"guO).79p+)!;;rV@:kaP/lKi[(!%9HOK`f[Q-_C.7;G#d<%!nMdgTF1"]^u\r%C7GZk=Kh'CE7nHac=LrLgKT,_#(4Ie@Pi\G$5Qn1hH,9U#RE&1p#T[?!eSTgU2VF1h6-*dQXjF[^Il73Wa1X#A<S@\^!;q@/#cea\r%3*YF'<4]P-(=7@'m]R(b5MMI`N0(<9jrA]ZY%54UBuuVD=1W2I-JI,SerAJ=AVoep%/TSSdsf'IUBTJ=n8JtO=d$b)H't+<!Io6Y\r%'FsmX.h!8MR6iE@*gWoG[)TEY)Yode$-sA6*$u)7'fKR%R!h?S5*]Zd2@;\;VUgWo7^b.QP/:<>$'.VU?(*tI*;Aa$-/e,iXn9Np\r%)lrD$W@l&=='<KN;p_OH)WZe1p\q$Xh*k7JE:9i:Bb8gKS%^=&NSeZp0MJu0Vhu@o`g*ecLt4n:V)">@d9>`oVMq?;[$JCtXG3Q;\r%Zkea-<3\7c8H\\_<3\7c8HY1K'X9KN*[7[\PuZ$:1PugFR%6Vp02(?lN/Kqs4(Ii^R":g2MPWW<TrDL8oQOZ`\ddFR<@eTR[IDt*\r%,*iF9QQqckN28hIep+AoBbdt1&ndg]"T"W<Q3NbaJN5#V/.HVo*Q=qdMAc<gMHCcbCZ3eI5>*65<4r/l/?gUI9r?tY'jNls8mcuH\r%k`-!dc<?ndKLeo]0-dHhIt@4j5%"7U/^,01`JW>/[7ZTO#lVdWDIJ!pR@0JP0)cf>>F>HJ[kKa^D_ne-H2;"FDeWYBj^poA&H6NT\r%rnG<f[tQhf$Zf;S(1,HWeYL+q6?SlRf?Xfs/AbW*Y4tKm0lbnTL0$,sLd$_Pre,ct`"=Xq3'mmR;3#m(6;`QqPrpqU#tG9g\VmKI\r%&ONkiK-<S#,D;FHR@n,\DhJZda1Pf),pS*B?%qNh](#</E>A'C)2TSkBFPUu5%T]bNpfU/'f=;SD6@@>+MpSRc&5H&"Juqqa'Y\b\r%D.V\l_Eu7u_nt:p<GH-DIQqO/c#7LX?%p*5Phf,Y*/@t],EGAW*n$<^Aet5)FfbN[`Q^Dk0ebqMriJ;9a*Nf_aoYXDDZ:Ksb(AEL\r%h#8moQ)3`-rEGFS#dG/?RopB+/G)lXbUeTOecaT.#o4TUP`uXfioPch9-,(K>$7Ho7Esb`8%hgF/;[Dn4Ujh;ZQr^W^`Wt=ZQr^W\r%2G#Q!mkKT_"b]8:H,QLZ(@_/ebcF35f&\p:b(BOT8"FZe.uQlhPE1F<]@Paf+C6Q+2rp"DXPN?K9!Ig$aY)h1K35IQc_>T%&8N&K\r%:fTP9W%Q+L@:di,I.FQ3)@I6HfZN4=iD"-"dI)GY=Eo%>9Zl:$W0R&52*DdnAJ+Sr@:i*<Z:GoZSVJB/ao_5cGXM`d$QS"O*ekXb\r%bO/(1k@)H:Z8=_5LEX^\K'O&g_iSA>;&h(i7!MGHAlbh$/T(.SWqRak#^C/s_'C9B!^72*"'l_N#^C/s_%$bZ!aa*n_XGVQ*_%n8\r%CZ"L>:U<LMHs0$llYH_;WQhUsHfr<?Lr)&(cn"=jI<1W7)G;4Qb:g3,Z<(AspR6Hr;nUWdc;pdJnSq^J=q!PIG,NNAptJhq^:m0_\r%:3sqcg%&VGh+3%FQHf#.:MCp&n8-?\LlUWO%j*Z=]JhW`M^r0Gg38*@"NA.9HYM-T=0!&YJtCWc.`ruFTt_9&473c[+0=4GG[)^@\r%F`[1d^LT<A+-/cYBjlJi1qP]3D]e&`YV\MU3JKTd%_Cefo:e*,QN='B_"SCd'_JkBJ+F$]1OH+VIa<()lo('i_6;r6/B@:thd[]:\r%5(;>\/r(!gled.<`"'@k9J(E!DdpToM,N]u`5J2PG-H3M>[.P?$/*ell[_!Ana?=[Bse:ThaD,Gp9O^84]ZPq9tSFq.BB%qC+chZ\r%)W)61p[79g*k\0?++JM%7Er"7UQ+XZk98VCaSJKsQ%7p&+WqH;F1mK+@%bmA)9Ck+g4X!+0/e3\f.d'g+5O3Y+"q_hXNK__RmURR\r%bGB+ECqJ':QYVrmN4q2[D05&ZjZKZXM1FIcfQX583<oE<Dtba$p"N4@%qZFl_!cYpV<81tf8e2>>`POeH%iO/r;L_O/$*@G7i=RG\r%.;X)L`<Y[HBrZB^f:1*f(nJprhlTIHq7T-Q7rQ:^HhE&%?g,0WE$N<1$bc/<bT8d&UcfPB+=?u<IISe:J$<R`E.`=%g@7!_nqbV_\r%c*R(:lcJql$\+`-l]QH!5OYn#/,_0.7d?-[!J(WGT6FV1/#/:u*,+f;#Pg$15$dbBM$[hKHuAk8_5(.F5mRF?dgOnUs1jqH!M957\r%$]OGMDmc047rMr69b`tESuE%>V7U`/UXiRMT"W+t5Y*Q9Nn]mrSSt`4No'Zh>^>0AG%g!#HU4^ZofLcMgMOu9F%3aQVUM,S&^N?W\r%hjp&#:@ruJ^,mk$SMe/XkIY@El0^5cS=K&n8pAm?q!P5*GBbG^kI\(Kh-ggP3T$ABIppZ_-fqtHdbSc#@T'p%/,k.?\.c_d;!IDX\r%9g1;hSX&W'emec/G?4WqVHYjAp8/J^+?>#63@:@X8<t*]0$UAO^gFmK;TuZ/qgku0V7-9CFg4JHL_K1$j^LgF(h+&1EK/Ce^)Jaf\r%RL&<+j^L6rA:CmIQ]'t<pQLs(1:^L^q[YpFS]f!Xk:I@?h7:>hBUtY%mER"@iOtihmETkQnEag$ZoaV>V8XAm+]]?hfH%ZEP+g^B\r%X=S#QJfjC*AS&E/<,T')Q^%^lX$gWF/h:_-)W4&rF$8:9l6ep1F'2Z+Ui9;HZ#I8D7!iW7dX-(,$XJ00V"\P8$a#YhOPZbUNW8%f\r%K6"2K=EW;7[7&h>/N:[*=44@+_/a$ZdUP5G&saJtBd`89/j[$&cqU@qhFUU\r/2t4%oUT1D2Mq!]s2OeZ(8'lBG<1f)l(_7=`<)L\r%qf=R9N8lHJeoVD`R(1og.6`$C;5dn+=j[Ab"O:s(X\i9G!Mp*-]K[05D_,.2N#<4Iou=l1`kd*Y(5a,^\M:2^@dB#-bDjnFiHDd,\r%bDeB5ST<euBKEoO`F!MAZrh^hZ#I6.$O=Bt>]'rg3O[dH\D.q9pZ(OuL!,IH*KoW4A)VH<f,'@H2\n#)*maLJeJem_)l'lEI(ce(\r%\M<H11YZ7Y\#Hp-_C.;=G*#L2k*oGObeqm76`(7bq-sGZJsickNpQSH(dOd6V@->IirFeT10ltO>LcmL*FW6j;]L4!s,BiN&^Ii`\r%DM%'tDZ'-u<cT/=J#hFtn,CP6ogc5L3PEGZ^I:M&T^S9/r[f$L_g0+<_DC!#_U&Z&(bd3\4WXcMFg8m(,E0->,(EH*"\/,#A4:&Y\r%YZ`G*_q+o4U;-i&'`.o@rFJdZW_m/7@H>etPpe>l`l?=Z>ClJ*P&3]=YcHdNojYmTeli0_I$lT(fr%:CLs2pImYn#>JJ%k"138^[\r%JJ%ha]*bPP(cg^)?)pSK&cFStF!XV5&cDn0Kr2Z,e/2JB*KRmnH%p+70dhNg"ZDtCi=[%BpHGJV]=OA@Qnl$o9!T/`HN($LgpldS\r%"WfJh9NJ"*M#Mu4+up!Hr-^lRWG#P/hm\aI69c?H9ZU6>k7"Q@*I.PZ$.W8'893O6JK_:OSoVl0fsU#-'L*#_h7!fKYOS_d'44f:\r%nu-KfITtPt%t6*5q@.7Ec!(reL`c!"-:?Z_DquW=FM5"qAnLJ_h9Q^#d's2gIM3aqZ3JMED'YD?#K==.hhK[o4;jg0md5QO[TM<A\r%%cP9sGA-4nB5Tisf/q\QGMkdq:H4MEchZ\TL(6((iRf=*csa/8Q$M_XCZl=XPO5WmrpG[W9+2bKpcGA$&fX'U67fCu6%*_">[P(t\r%cB_+A]8a[?CY1&J?&n:9\uX#lR7?l$b7=f<!3Ign$chiTO$e>cM/g)8joW-LopNhSa5GJW,>=J%3<-j37pU.TfkI'I5*qh-;4=Y(\r%Ui.EArqKU7erifTnMXS<d8EjCh'#Cb5^/SCc4gT_"",h65[p[r_@q=,nPe]]+&$V&?.7VTcpK.bppf:3dGbIuYZfdq[uTiAK:#I"\r%7\qr4.kHr>.[>5oN[lT5M$O$ae9Rf+\KFKUQ.#HE;@08\I.'[=;fN+IAJ7J.n68Sdm\3.H6<flA@B"oW.;,fECI`MV5P:k]/3X=)\r%[3=lUamDB'SQ?32pHueq=_^nCg'dn!O&]WSfA_\<.SoM;1Zd6$_mNN#a;5]RZb(&7%J#YMbOI>I,F`:WoV2gTE=]e243.ZJ^K$%\\r%Z#pS!MQ'CXCYl7`B:i,1m+QHnn,A='7<<$S)6K<e%s#AOb2-ucAf'\Y>[8=="K55Q:t7XD)7d6M8s$B'3M5aXGs/p%_bQZg,OL0g\r%W&Th$5Frmf!aY%":n:hTL[@g2J,d#B#o5Wg.d?_J#Fe^%%MJ;m4AQgY%MJ;m?k6;'K1)k%?7CS5F&<1!4RY+4SV'?.,NkO9)5(/.\r%jilSjci=fu]%#Sf(CF"7j&8sH@tW'oMFsj!-!;m.]!rG<LT(Mq=g8--_G!,i]#5:N"dsZXrPF:<GF=QJTQ2YY3I)ijK$(VXjl;1'\r%1$bYJ>m4di4uN7#)Eh:g5;-/g5C!tXgm+LI^L[e=M(F]#_%Mh[i9r1UnR/m/Ng0[^')6A>*32<>JX7ig!ceIN3[<huEnClO[O`L>\r%5R,t/dut%Q?FBr>.>bVgE0I$&33[Scg9QsQ0#VfC\gr3\YQ%i]1],`MNU6]qa`^r2YL2pqS?^N"?WIKh5n;WMSM<1]U#$"uI*:l(\r%SQ:Es%_*Z@kn3/rLYL.pMKr@ZgEgY@BZl:-4!\E"pgE'L0%,-j$4F=UiB4VhO4d./6Kl*D?_DMD_[6cqo>o%BDs=LqXWO*5IO0J=\r%#0VN+Q+ZpYFg0)X+JRo5P9UP=$$DT2-5ge7!$$NlA4%>mGT2`jNWg2SiX0YBP["D4m80B'BLrUl)?C=2P9i$CBEU;]6fMOi\_f]6\r%K.UhRBR70*nkWnTb[r0C<qFXL7Ek?.VR+:K=g9C8^J.1IRuHDc)6poim7)`Le.t]@&XeV4iAE@YbI%:f2]9lX^@\igb-)T[S"#AX\r%'jO/MiN!D<h-FC]O4\`IN%U/hX,a;j<muPsa_5a5VhLGg+$Bs<D&rL,A$Sa8%3F)2'R<+#nQ]NB]ud2Wm77%Ji8UjA--,k&WaUi)\r%[Co/ROf6C#.Qe=IDmA@K2V*9^Ur<I-CoeU7kIhsL,S\W%qe:lcnQ8@r,[_Pl>TObP!_i0fKlYgRc(CNE`l__B>rZOR,ugZ_odWb7\r%KSgIc^Gn"1nf6JnK2u#FWDLD0cu^E5A2^d!9e-qcfH9=gfEMW,Si"]NS5Q&rpDdd9'U/sDF`PSQ'adnIBt@]Od+N9C.Dg&D,a]eN\r%jc85`.SUMf(=6$M,3Ta=r/)_O,qKc<a9PF@;CWBB%kq_$TN!>D2uMROk`1SufSj_4V*]atCeSNOkHd_rB:_;ZD,4?+mIH1PM4B9<\r%MP<+dDPWQ!2au"m.R^oCjd-;XB"71b9_'X8ZRL\VS2\f1X,mf+Kp-giFGbu7_j1#"oNf56"XI0/RZT,7(25R0p&kuoF>oPjgk".\\r%'fjN*"NH2I0U"K)'$NTuM];V<INha0eQV+SBaR1V(T$%\<!\GbKNAs]N_"((\sZ\g&guRW?u.G_!3Z<&TklULCYS'XIU8D;&gV?1\r%b)TnH0R'4j=bm352-jLo&4rJ/l67F!_Y@q/g;uf2:WC#t$CZYSN"%pY6ud#O0K+908-m8U!+XKrEGQ%;2ST(s(!$#$b.e5BfGIj>\r%cshSd2MT//1SZ@M@q0JH@(J]:a2[&Z34%0[3&UsXS+hlH_>qg*a^C+ODPD598*=Q5B9BTBaDUhicd>.=(emng-BOrVEp%?f=j'+R\r%7[4%MpEdp^?su.dEYTG=?Xj_&!X0>qF!VEDBBq4f)jdbDa;W#m5c@Of'/N]^'H#5)Qp/Q`^a^u]Ss,W[Mg(_>Sl=5h4<37&6&(U@\r%4=?-AFV=57i0hgR)Nn+f16Mu;S$r"W"7(4q-hMCopp3p9O:9=/@,.cBhI?FpB3m0rZ]*a>q]E]HC2d8J^V*+!ZD2\XgZU3M+.H6d\r%fiX^=o9IFY8<mds]UPeI!,lhj[uB,@Rit:j@5=3L;DrB_W9LTZffj-Dj1n%2$D3Rk=R@.`,i*2Wr,NiPjekg..EBp3RXA!CVJXA[\r%Eqt^c"]Q+OVe.t?]5fGWr7>nr>20ak7FTW1H_6FU-:1);,RPk>)A<QspLr.Em,o/eKrVLDnVBffkX*hZjc<lmC@'3i"U\6e4hOZ-\r%>>(W28>Rfl9CaJ+r;djm2U=,<(8*TGeNOD\5(ocPL)`b8TW78So5g*)Wo&:p2lO_/%q6GV-U-epMj+Z3XbmRa#V@B#c9SgAmR.sf\r%c8[DDM@Ckgh+nW'L3,YZ1mGdM8?h@$.;.jtG1gnjh"t?2;WX<>cG6T*U*2S4S=,/ok;K-W%GG:rn+.nEU>qCmGRYlS"A-<\9/u?W\r%N0^U-J=LU?;XoI]q?<B&E0X$Oke_g>$f`m=#K1`/R]/tT,ucZ!aY"+jMQUJ@rFWcV>lUBE:$@W*?6:b+b+#cn4^';^D5P6AUa[2&\r%nlR9/B'6PR6g&!R*)JC[p1\.[rMS1"qM4ffpcir'qY,UoY2kS>.gDMP]U=OhY6Jr8e8#-$)5#"RZO0;*B@paHDt9^Ke3;V8%(kuk\r%Q#esg')F.G,sQ@F5;tf.HPb"^<27mDmP`In236<597:H4L3#qhG!OY23ZTgQElQuk.FQ093SRZu!0eA-TVZ%aNN_+'(s<nL1*cHQ\r%JRu7l5I5SC2\O<X>Y"'h%eCBtEn-<+/H?(a8\++Wd:Z#T1Ga'h\&E%2&kb?C;(]V@d5VdDhj(KTAt]T^/T*a@aFli,2(lcsd=af0\r%V:mX`eJTmWc4kONN2Cn0%Vli)="55C__5[t(MP0i68dqE-"SrBJ=`lb$k<fa_)"+1(u2rJc&L/lFcpLuL8g[t3'"+H5?H2eIFpHi\r%eX(#Q-gAEi'-QtSU@YjWZ?DB8S<6,E/b57[b\h1/bgdjT3X1A##KhYmL`p8IZh<=TJTMs0P8'QBJQC2jYD#^___#Io%']dubXB5B\r%^`IHoNd_tM*6c(.3_P:(+.3-&h0+)=_!gC*hcK\JT5Q)YhYm6uX2CN.EAoi.G73=Agqg_l7VCcP,MfEnNO^e4")EO[cL$#R\+?ct\r%g<-0pGfiG?c'r(J>4/#LEjrE`Sb9m]\b[fi_iJe]XTs?g419_1j+#rn0J`^1K,"[f^ida(rg[7JZheo0k[*Ek".*q?a+9+d>Hk.i\r%_#G?AH^9#LkM-tYeM:eQRSlGtABA#/VGt?$(9q#fVtJWacIkgnh>FhcYO't?%N^#TeL@^-46pd]en<5u1hJT#8:T-TC"<]Z1#r1d\r%n"jGC?`d?kSj[\+?CZ(%-jRPA;oLa>5)n=pV1NbRHlBNhYu@uUnXEPMn1,Q)n+198I`3PHB8!.,-k3_\R]!9#'@P7G]*2>HpqXD'\r%42jXP&&ItfE#tGR%1U"5eJ=M2ofLO_fk;!B1c/$VCcjNdI'Y4qM[eS1SV1O*=X9`8TmNDoLF,>TZh#hm1Qt&lR%9T7qB)6:PhcCu\r%hNaZ_q"0N@nGD<*qX/`8#\a=Q]#_$;Vl+M*$nDdH0Se\5BHa>:9`Q[cp59kSY)<=b11lk5/Me*JEYtgEl%h/q1YaVs4LB2$nn<(X\r%*HnDDM/)JH(*9UhTs^i._Wo8$1jTuL9q!F3Dm;l87^a])9G)qbF"+&"a%]BhCA)]+,7+ag<-E1p'f,6U&AU70Eq=H(qc.Mf9UC#A\r%h:26U3PYgNKaU1!8-CQT'+kr>Jf&I#s6\?0dXqd9Xo3<TGg"CBZiA%jE>[Q8:3&l"Ur(oskHpBT*rOd4h:)5c5LqdcEL0bS6>j:2\r%5M5aFU'1i!*=plupE(hKELE9<,5]IoL(d3YV_=PR7*M?CEanPr&K_CW/jN;oMRt!%?+@KeT<Tg46?;@CpQLX1$X/U;`1V%64kHX_\r%MeD`n[W0rEkZsM#cGjY'Ps:S9s*i%NXFL#\_NrQelr/m>.lV1&`gO`e67Q]0`gP:tfq^XbN)_X]gja.CDi\V8O,Ghbj325]UcHHb\r%pDonpmE*S2/AOE5o`b&Qo>\=3F,07]=gKE)@mM]=!nk)`mp[]4D^HR_+DBHe3R3>`E7-k=\[h91O2cV.LYo2qI!H\0Pg-b*OrP#p\r%_n>*KV`iokr[NbA10hKXjSP\98/Rk6S"2jF(D,$'m'E&'?RGV2-]Ja"7;GB$DQ_5NdV$N]qp_\15LE-f1@q7Tl9i+nP0&Q$&g1Tg\r%\oTAb5D,O.1QR0=m(pX)K<<#.>%8:4'#oUoTd/d<O%;>R5%F!mW<g)bp9=%jqkFI_WRZOEZdS:I>?9JC%OQ=i(I<hJaT/#m8'of+\r%8am19UYXbE::oCFphj&j3>[Y`D`0Q.KCm@4E,!XD?J,,UhAppgr]JIGXO"RTgQ?>;+$5pOm;6AA_[a,[>KuGa3=ZnZ7)3[t`</1>\r%5FNA_4YW<,#!!'?&$5b2Bs',&+7rUJY#F$K!mo<I*_?O.]:R,QR3!3i!HWWCM&mMY!HYd%&j7q;!sT'LVKok_KJEso0`!Dllj5mN\r%O-3q9#sW#>k-^L3SX*<>>m<];8P-$A(A%ZMf#PWD\Bt[aU\iA9O,Q](B/1Non8&u\:=8'tju>Tp:Gh#@lRun&8;RD3PH9gD?poKQ\r%5(>hKSR'B8@*(0)]F'V]0A)%WV8+9e'I>655;K"tYo"]t'SR8=d9kr00gXB72!NbeZ:W@<NYWP%/r0+jNJo<[lQV&Um>EF$B$j>a\r%]F+>MG"g"LE!s"dULQo>,#t0+9t>]q,I:ApBAD.!T6/YnbuL-LI^9knhq:QK2kD.$@sr:^)J(0rc?<=3gk><ZY!.j<Sa_FYV!fq_\r%:3(tQnZKQ%&n-2Yb:L7/5Y,QCaK2XZO^)QSe.?o&4.+t6r&$n#o#):U$,[K_2hAaZZ6s_$<5*&U8J.)(%2$6[@Z-%/C5?7O*=k6X\r%AKK3`DBBIh*IbUYCAINY/?(b2Zta5->5dmhP8J&DdeoDXRR(;=P7s#PRQ=d1JcOFd?7m?D<B0:![BAiUV=Zel3bUR6kodSie]1Qd\r%#.i9*N4Mpr]!E8BF,E8-n/RqOopgJ#clI2?MOt$C,[NpnIT=Cgn/4N9AV,0WrMic8?,B2[FB?JK.L@c)_qRgIV+TO.9"fbO0]'G2\r%/;W^Ir*=fLeXW6P=QtUI9#Bt:FB<KNJ!0Mm_L/YJah?p2-B1>:^BMcPk27(EAP0/B9`a,\3+Ma<0n/c+0<5lb.V17V5h*7b_CJ9e\r%/"a/5g\4Jb%RTo;nIE4<lPmFu$TEDuPc<ZK9(6-I7gUGX(aYae4CLiX^Ui)//+)[<'g$'rOPn!"4OX^k*NakB`FX.bV^8Os[0Ie_\r%<kNiqca+NqRco\^PL7?j=8K(lEIGQ"0s9F%)rX7f4Yua;N'"DX0[Dq\C>$#TI"/5=0:FCab6u#/nNj>0?.lh!.Yd_G:[S#>q^5RG\r%XDHn&B[9q;1V>HY)i/U:7dg2lR`*.,Jb`Q#HsM?E"(f;r`7eI'T=/@#bN8\0kj//-*fE9JfKcA*EYDWE-kQ%*K7g;OI4gQpoKq9<\r%M"#C?.\#Kj9_R#-`gC7Wb$NH25O>l3Hh[AE5)k4kH/<t#&Nti6_q0SmZEI7<WLCZHV8k<]bF@aJ4]jYnV(U5NF%Ht(Q5i,Ic5RSB\r%FF@G\calX6W?9sjo;V2\bO+Oq9qSU@D1=<c>9_@YVT4$fYVeB@pZ=_f=+C"ODlP/^CrLTZ3B.m4iRam!+@9ohHW#RF.!f)O^Rj<N\r%Z=,/;ctPYf2m5_A5oalY'q/%JoT4\Oeg`t^;QoF=BY&#^6;oB/\jU:u6_bu5rsJaSLfUeGLVogUqH*StjB$^5elG$?'@eSrp=Y:+\r%p"WoIDmEoU6;oAm47GhL$>iN0-hbQ@cl,AZ@kD>BT1c63P`!0'.oWLqhWD&ROK2Ap8k"rH<G4u.'AL0'`Mt#-p-c7p9rUO%iJ.66\r%4KT@e.Q<+':`e:iOJPs%mRl@O1cm',CIYITfT$fkleegPBUtDH&'M3*?QCr4%3Q^>%87XMLptW*Eh2#@"At/hA[LSa.8Qmpg3U5Q\r%BDbl,OljO%&AdDCmO6g%l"#U62peh-lN$Z`oLg@CI93F>$8!pIP<V(>N\r+opEh.sf<M3K1gPc?#KrblL6ND=oCHT[GuIVteMq=X\r%/Un;59@)b?DKEdkn4JPDM3^@AKcA])RqVV-;48Q2`?3MrbMP[fl248_r&qCs)iC\QQG82Ue+oJHq0Qe_R$qDd'.n\EXj^f+;MN-:\r%6`VMHU?,0=@@)a[U:q,&i$crXR1-pPKqmR$F!SV"OSNE6*!NDM^I@H@Rd*4T(s0?>]H^FRmLl'3ACFiaU?OsPh*k7JRP%fgd8ZI0\r%bLTrUeV.%PP'%Sc+`b*D&p784lR%HY`9InfmZ9sK6VVfQ>TOKX6Ne:`j;no66Nm!7aZUhKLBt*[&pm$J%ZsDW9'-_j3^g4;9C<Cs\r%3^i"g+[PN<kFRjTbS+uP^p@Fn4>g$EmSW:p]D(Xgk;8MY'UTu+RX$*6-_.;>P^+I0-h-n1AY)HPagkcCA=gki,C1Rbb<5_rWTK$m\r%:F,JkURFj$4H\A'p+B<USk.iIFqnP!StK2\]c#T.FJqpV1/B1cA1*,]A=gm=a.D]qPBeA<+1NigbgYZZS.EZ0H/e(l9V-MRR`4u-\r%e>O.W=Zl/$l'Wo>b2K7saug9`?o*VgA=c?OaciimSp;O3<)]00,'QuThNsXU,)I[AcUuACc(Rq%?&dm[-Udqg!<:t=-A_Tkd]/?]\r%1WA+p_a5L4jDSV0SlUA7>0>F@k+"ut.1g[.S%h;L:Ao"*\2ecijc;J,_G3)2Qi)X_EMj;0<3$JkDmW;K7SuV0.1gYhl;^:..1gZS\r%H%#p:Va/l@P_F_!;]tEpT=C*6,tl*MR\#tK5G+`,[B3BkP$LZ(h%Y=81@N!L_HjIce-]nF@\it-RTaV&/K*r:e^T2m@6WCPYi:jX\r%&l@%GBRfQ9JGWq+IgVa-N0JGs`]ErIN0JGs`k'@Z'<&ZW&6E`kT0W?,6htS<Fu2M`/H\u.cAY0AhsN[maL5#6Y+P*=L6DKfUGWgf\r%_Qs&GP%lQIfq'H-CTOaXd*)--2`e^'IoX.p?E@8R=plHKdfgune>QL6mB]eQ<YhdV'uZXES*!n=m30`s_Wtb.EMn>7d$Tef&M"6m\r%@3ima-;.Z]oh)?3&[o!dd`6VXqq(&[7gNr]@*m+IhHjL33^[[<aQda;j1b+Mb'n+A2m.LC$,q3'O,op7*^_mZ$E\V$=#@)+n(UB(\r%TqC\N"S7f,d<koiob1/EbNRW&o7\(J36QBUQsG'1:.Z%)D/sD)HOC`W>W^)#?QSm"gi$si>G(drZLf*'\t6A^ZWfND"%T,)V75ln\r%kg?uJME0qpB*gm#?(.+Zfd8cDAIYW7Mc4C1BrCnqnS\'0@5T]6#3`:<H_<&/Mjq^0>kmnckQkVH06adWm_=Gk0^[U&V28PTmKfN(\r%:fTVELiX>@osY@k\$41C;1HbfSCddO.)2=C*osK=V3TprF(h]/.o0L\EVV2tpI4Cd)9Qm6isW!(h+bZ:O2>MCIFHuB)/XZ="jp7]\r%VE;A8Ie6J`cuiJR58j=sh#/%rAi.5:n>7KnJ=&R+h#-jB0]W.NBBdFP6M%XT:Z\e8Pq[RQb.]K**f>p3'tQ#LC5[eIN`6XP_3NC(\r%de%4]\fA#ej&WK)>RBdLT1Xu"\.[M"fR%0g\.[M"*`f2Zi%d*`+&1_l(.iGTW<#lI6o8TZ:C\lXBA;Z&=MZ?-DkWA0ZIW3QpV+Dp\r%lHf5Y8ntIj.j[c/Bpr4Ikm`eG*s67T'/^AiC9@!^Kt#],8ZgN&A*"J1.B0]f-0MVb>/@o@/%/>RCP@3E9ml'b<gR5=XXU1!MM]Y4\r%>\b(e.t(LgHB`uJ;?NlT\WC!q`tM-ILCR[YLmXX*eQP95PHWV2XO_.#NdGpg`Q^DkOhf)d>mYarkSJ"L2i`+9m'Tk;8#..9'+V^p\r%<g6dgMrO,&V.Oo9p[(NjqrW@diVIO7RX;0`\<b$aQ4qmXeQV\7W2.40W7HR$c_.]LCTUu_>ZtMc1p3\>M#pm'YGq?NWL$Rr^8_,O\r%HE8fZm_?ETb*PE1'+qMO>G6$gGZm]ICk]m:THRB??n4(:Ac"-D!aD?7a2qH*$#G=8[:%Eh>$rj;Y(bcS8h-npDoPZ\Xni+ZKM$t*\r%T`m\qL"2RBVmO;J)dPGt)Idj.dkY$.)>o\[8[s4/a/;hH@,WkY16RsWU)@8#NN?sqOVhBf/LEKc75MN,S\jBc/ZDu70!8R:h?ACD\r%MjE%JmO(F<<X7gl2<^Ks`f(eq,tZg$Yab1t<`n<UA5M9q'fhME1!7_-R?N'_&,oj0aRt0C$r:W=4+@A:^$>cB[r#:IN"qr&`l8ZL\r%@hk0\8p8-(-*r<Y*OuN'Am63FD7pW1;Hp-nFfSXqG+dr4,pCmdgPmg5[7/8TiTHTXe.sXBj\4E$9Pr04>FI0+[7/8T5uK[qm+3c6\r%9HCJqcNe[283abu&<C_J+T:YphFOSPl+=1-"B.6W#Pk;h5M=jgFJN8cpCkLoU*KUHUQL"m&&YIrr!-^Ras5_<@8O_LDGD&5LVCn#\r%:qpfTdVjAK7&)'tq]uPRK)S>/ck>R--\G&?R^id@-+M;7OEsBo2-NsRN8"kM>"2i%mGlk8Z0kemJ[']%G:hS+\?Lmfl1'dh\.g2/\r%WK/i[+lJsMUR1N1+QI:3jaN9[I]L(O./X?q5YJlH0=.5ie9La1S.Y4O$E:ebdt^oh2<`_2Q3W=^^Vte+e[JE1S3sd.9%N;Tn1%<-\r%=WB#>P%g2i/D,Y,R>pL$0a/a25DHbf)Kp8FnCjE54$9ej4m8KnWie8r>HOg?g)&Ga`J#]'3As)`\eo@3>iA-0b(2aT\N^eA-6p8j\r%Krq]JZ8"E-DHJ^Vf0&FT1\l]\I`sKjAbLn,-pG7MHdTIRGQ"rc@7f<7en5mo^<U8e@B*\PZZ>3i;6'%`lXk09k,!@;.#6r?kE?tm\r%TfbP5hm;t&>LVs*c^L%;L\5!Dp@CcZ,9oNhIf?L$j@?#pr(a@hnSSh?!%9tEMU=?e*OnC9-RI,2Y#5!lS[Q#1%u+.q;O)HXZ"VqY\r%cgEUB8q[.QYM;lbEOUnUgiAfSgGUt&'!Ya&GX.oQ`Z>[p`1QJNNsAl;LK)]p2*YpJP""&Eojl]j/g%Hm>K5:d.?'q-nJ\Q/\>lC1\r%Z.c/<O"MQPFmge2a-`8?3'(,GdmJo\.&2$G:V!6k^aNOA`*K<j8Ml;0N<[Z^hTsEtBBl:6dee=F52.Io40?d%.6NnD4HtVCAc,Y:\r%oM?S2mf=e7ker5_8osQ`gQ3[^,k6H2He:KM75o::Od7?rmklRl`0r&'?N)@=6M!V?RiIP=MTHM4k*lC-([<8@0Z0Y+(A>CC'JVbr\r%@>X\Zco3tq_fBT%%196]E(ank15@1N8Yc5!i$g+j2$DL,RMoGKfO)2/Z1r"<Z)m(5]PB+8@>X\ZW3\Y8S!24J;Mr@9^`njU,m)+Z\r%L;OYkYLmV-EJGk:Rc9lE#nBV80\(7tLF"+'*'I_n4"ST4E_YC-B8"$_m&oEGOi&+uMFT9r^I7S4jj;'roLm%G7aoGXqSg>sQU<"<\r%X1fk>D-Xtq\?eB@GT.HY>gj@H[rDkdBh?A"\;&bb9$-1WQW)Sb_Ef[/1q+`^)t7;YYEP0/[rDkdBr\uYGdu#d)FuR=`\lQ6P4Z9)\r%gL>rmc:7T9i4`Ah=4^PIqJ+EAT<5B,`m\%Z)3aX*4*RO4``cgg3PLlD``f,#_AM*L>G0@A_JC)1hA6jRaO(o\_(lY"Oe[,s4NiPO\r%3%\SWiKHm_Lj6'uQ=Ua[$_T"ERUm2E2')$V'!dH_fB$=>Viou%_Wen0@0F1LdO_0?<&<)YdCEko-8i1&d?c[1(91[3m,Jl.XJL2\\r%qEO66ie1_C:Wm_#W-??p)2/tu^`-poN:,h#7W*J$5caFS"g5lS4NF7#7UgQf^4PeGHSl-@e'"f2]CX%*%sWmXf5/?<"9"Z/,?q>e\r%;@k-(4)VH6mF+co>%XJ;f^8*IdqX'<bOF9G&C<K3[R^Z;7ki=:3NOGK\NYhKIA.\l4Y>]T(a?=N<fQe6f$NBFIh(aUf@o$"PB)sQ\r%H>0,R4M`pQ*u_"Kq`T`M*@E\$(i1CCT3oYf@^(^YRQmKC7':g*9a$[\<Qk[<J%.<(.[UZ/QU_q"JXAeYgS9YZ5_om0-]A+=!u\-a\r%/2d7I"u95Wl0=WFjOSrBZ79Gg)9"s=94c<O@W^9Z,\i\UhRcZ+Z[iZ,LgMU'fg(?&^kF#WL3d?0,-uiJ;Y5W>`bZd`%(f_?%C:Ve\r%rok)r&^5uU@tBou5_ol<Y)_1#IWa<+="7L[E!bt(b@ELB>7RcCeHVYclp4Xq#"!.Q'J^U5YsA`K3eZ/t[<EdTfg(?&R]_\(5g<D&\r%B/Yi5'il-NQjpmD;@Ts`&0'Eh%Md1l6<JbP>?/lOE]d&ta(ulqQMZ,._/(6k(9jK30cPqJL&3D80cS3?%DH>PQjq!`_G^T]-+h],\r%^+d0ib(!XMiA.f[!^[L*JXBW0Y)_1#9J,0PW+%Xr;iA=D8&Wo/2fc"%-#@>4%Xb@[-#@=)s!>tA&iR/YE#%A+/Tf!qTcgj=/Xna?\r%@r&?=>3@Qg*#+LM"\X"V9J*nA-<@Fq?u!NBRUF5iK;jPhbLkB4Vc?:u._'8r-3j\fh6FDSYcPf,M&bUAABN9b,c]$RO]dAD>>*Vu\r%dTC<;@8fhZ0gu_E>'<q'`mtb\[9QaFUohUEC1W`N?d^$+6@+CnOkuFVCER/5QtV4G3Q!%i(4M9h*A+Y84[og?N;dCbhrh%\r%(1a\r%#ot!jXI,PWX!H\;NM$-jNu0o;BP(l5](g2oieqiajS2mO]2E),$2[l^1qMK#PLn-4lbX?`'(WBKD83*&:Y="AFR3\KcN_^dme_:k\r%>Ya''i+G@HOXoi&%p\OK>>8`Y\.u0Ueb$e"-`>ge`>>gYC!t1>"25?%Q*di#3i(a'`#[aRh=/D[4)lWpiXVO/^Ctg@-gpt/h#4EN\r%gmp$uTG@>#JT3QTOnkW:\9hC14<-S')l*>r@bAWT^oAJ/Y%?q]MZ-*nm`\H*Xc"6XZ^.,<4503--LOY#/J'!kQq&tJ:Y[Zjh)(Z'\r%l]rCQju.)0.Z"q>oQ7DG6f#P)NQ&J+Tl0>lSO2M8pNh]4S_(p5dBK-!cLsJhZ4sS`TkVKNh*f>%\5V$l]>:n^Ha<1"?lqOdC@<Fj\r%$>mOY^k@7hPRm]&DK^KnDJAe6HI0@N2[0al_m+!7Dd1J=k,\HqK(ZG)lTF@]aSM30[1LTWkn5-KTnioiLu="EE7DgdH['go@_$5_\r%d;uC;E38^J`=f8)o,GE1L95j2>4H^1#%t+:(M<t(h4'(mCApSCgCK?<"\:ceNkXj-5DSOt:Y/Tr7(:11GGUP\f]^mgG`M0O9]=j\\r%W7KVdO'k=mWV,nq1)$qpg7.AMZ3OJ+dCT8TYl34FIB=!L_3O0KHK`(RE!7`t++RE#A[N;HS_1OEgN\GL)kUmBUrKJk*I;KA]iEG&\r%#ebRD$P1_"FXp`\]bp2c-iE(/#.0E;RU:%@/%_.d1a2OqnrdJE%'a'TP6^1@P0Hm+lu]/P,&$BF8YtU"i+uK<5?AoQ1YF!sN0S_4\r%a*s[_fR(sQoEtK30,SW]6-J*M4]1(G(DX=XpKH.g2P[`8Z]$nVS)6i!:\aldIXFq^iqYhY1/)jVc?HG[i/aD=/+h]K\B,$4[B&QZ\r%\NDEBe"1DVGK');1mBS[O#&^Viu`U:Dq"RrLYi0.Dt&G%A.$?Qo$X\grTDp%f^RWMdQG()Q%#+"URSX*N#jV?;s8/l$OfF?d/0##\r%mD)%.c\7&d[0*2@??h')1?\*"X(XY^:6h.mnS]R=mJ%pSNec6a'27f8kI?io!L9oa,PN.jUDSjANl)fDC<Ir=gX@0/VRC<8p=L7>\r%]&pjtD>[)!?u!k3C-sn1=a]TQ)hlVhYYfYW*76$5kX$!YajMH$&#S_/>aX7j96,^n0&4Dp96,a?7.*Hr'Zh(>\27Kcj9cW,Z:K:D\r%E_.D<0h<q>`N]R_bUQ.S#MG7j<,dC\8ebs58Zkn+j\-0-O^.*Co2)4h0'?Lh6ZN>pWCLpTk$\lq/k.U`T]?Fp>j0;uQ!EO[$:q<r\r%_558<>bQ`WI27*k.o^KH%'M5('e6`CUsajHMk3O6.(MYJ=)b'=890Dj;b`T,\O$H9FaB-BEZGh8'e6`OY*:9Dcj-bP$U=(q=,XPK\r%[i+b(Ja%8BXCThOC4F=^n4%T8q"%s=V>'hS5aSMg\]T@2LGq&<$q[g97CGF#1$Y%*R>S8(j%%`8GMU!(NOH6@Y_Iq.g]W;^2]7Z4\r%XE=;shbVUWomXa6+7"u+_ir[CD0N^BZ^ngLcXKSJB;=t#4'4:#URd[,<0*N?79ACC[#W(cB\]LA(tmQ?eJE@P?GHk%TrUtI1!QW=\r%6[5^,-=]o^.J,La4nR>I%L_K44rK?H-f3Q)&:!6uE"-t*MT9N%T\Qc<FRF/um2G$S,-2](cL6SZYiE:'S`/"go2)[a5(+^_dngV*\r%?CuS8[L$2.lf,@`s(cc,fuX*df%9d<GYqZ4gs)u<S)9f9n$$2,_$a+Lr6qf/\`.d-HiVd[[*r6^G4!M\i3R:DROLI<2QFa660n>k\r%Fc0lJcCK`iC`AoM35'+k)6u&0`t?"PcAsRLCTcjJf5#lYmBV;)LgAi)?$iTKZ?oN&<.:TiP0,^88;5h-;cE)G'OK<K.NaF1)6h?A\r%<&aMXgqQt(%''@X"a%W(>L*.3QZi)#qi-+T$1,=NAKK3PD]ef-%Zl0SeFMp<I\Bd/$q@;TrI5Hd*EJWdE_eK$:okn_VN-e?5Io21\r%n`g.3Wr`nKXm>h.$+paS;QfQDIX!i`DB/#Hi5r,(o4%[9:5HbPi1^*/SfB-4)7,uGgog,f?6ShROBsWsTg3u/UmIr/&RPS'ALCB0\r%`#$'&Q_Vsj4Gfd2[o\W6i.4)E*HpDY0(=eu-X2uKDo`kq74V<p/;@;6UmXZc![A't^OD<G^ki!,:?#PFM#nq%ckIr`U;*E/mBZ"Z\r%d:Z=R^smTEiKfh^Z]M<)a;W%S[8s'<]PYFK'H"6uMG&L@_O"koQ#H)4er)H-I^>L7j__BcIOWC,*DOC08#nh!%C/N<S8Fad6)k_$\r%Gdp]^40XcfQ[*T!.%sSHAn:5ig+8oA=.H-7F7.5abkrmZ:BKP4lG+t/O+Tu;G&F/>B@&GBk&E((U^jhp/8D7)\`0YUKG;WZq8A\.\r%RO'p;9q#e!3(n*!Odu<r1e&jjeUTK_ddIEF<ncgK&kXt#I3[`FM)<[.<f/B&)4jd4`E=/+$S/3B"c]V!#Rf9mp3ndQ#_QmF7cECA\r%egPps*_!)?n^WuiL=$<P0VKE(^lq\KMpo'G$p6Q#ZI&:qQY/ghQ?@?b'j&S=Q%dY$=iTkW_.m+IQ\ABUhLose=_E'"Wb$VF%V=1r\r%]Ub,*;G0dU&YE*HeZrB&0/"]\K^T_B@rPN^_!\.!U]NaAcK[`9[4KO].n(pqI0(lIC$?gg[B.AM9e'0q)jjW%<%X"G6rK*RB?O:2\r%USmrF:3[t'$[6>W_HlE<I_1MlT6F3ko5a0!7[.SJX+76^=07n5_QlP6gU]$E=#7Z\KWf&G)jXkeY(sn5&d,%caWfAiNT/dLrJ$Lo\r%R]L,<*CCJHVM%GJaY1njQZW,8ZT:)S=K%T'lYfMi^C:s3X(?-c%gt0uKWnkQ-aPMEZNA[_KW:`O=r+4m(n'>,KEZ_!o\E_'qpF.`\r%Jn;ZK_;X46;)9fJ=ocO^9+U3hQ3Ch32+/f>[=met&q$55C0B8\P5K&t:$9YA-*3Eon6Z<uAXtt1`RV8_DX1kbC0>XjYIi34Z8$EK\r%P,`*@>m]VuMQ:;k4!2GAASpGC:iWloIZ#M+!AITuU=Fs.L,EgJl_`([<m/KYG0-\KKo$):%@'u;U,0g&$cua-9:>-E:bD!Ri71lO\r%qT(81Wb%1Ve"CQ:)F^\!U4bF#YEfp5.g+>-0Cs$*YKm_neZs@6q6XEZ]Co5sRpGX"L/opl\e=rS>qMPH=o++8`4nZYfW9-Me$PPS\r%GAEn_,LH>ejAEC03CK$@F>.F=Ci=q>hIUSi*?WF!Eqp6S#O]i3ca^^8Z2hE7[`\S&[)s.l(2es-nQ>TG[*$6)C[H&@XRoQHbB*;b\r%*OO2N/^IjoejBo7]3-KlG]\,o^\Rf454biRo4r;5Qui6Ss'+`/GNQ>`G&mQ6H=!"G_+8H<0:2YuH1(;hO43Kg91IL(]UXC39W)nq\r%*tM7*S`TTFH?Ej\24N:OLAUSoGd-W5ph&ALhrNHdHT)>LMN0=m1<Z4b[80$d*VYWA$i3!GeJM."LSh[shfD,SNZ_nSkq8Fi6>)8&\r%cV(@OBWB7Il"/FOA,.4L]4bPaD_<J:G6L3FW:$CZ/ss/4X1N&g+de%IX1Mb6par_%"!oR$GL=u^RP%fgr;io&S!tNdGKD&91HBJ>\r%eV3[S<8BuA?/YpdUq2JmC=f9I/t2'W?+;<="]Gj^0&8rp?'ku?XLn2aj49*s:[NG1a%Y\,8RgL%E*)mXQZ7Gf;_bH4mMe"=jXcNM\r%;kG1U<m@tsW>^/M=Mt:Di.7!@BRg?_Nnqp\R2KDSfu:("';g`>$LLh<GQ)#*"!/l2K6B8@,>nOQ,nO/&i^U\RVg2&$<*jG\=&Tn]\r%9kQ^R#Ql.;W\4kP+:NLFWum7E&>nb>fi-n&CR`[[%$PN?J;6UoeidagDte^/s-tF"BeVok1";M.U^c06'16WK=ij?#pl<<;*eXP)\r%s",Mc[=;Pa/-e>.c49m/.]]^PG%RH=[oHIPX6e%sp2@"uhcADpeLF5ed+>nZNSh;D_iC.aIh\`db.;7pkCsq^b5_3?A_hO&"kib\\r%Sr%>7h*DP*6.>f-Gn:?Q)*NPtEBHX6%o_rY/6b&+1Zl[JE5eh!AuDC3A_h56YsR,I#H=$>L,60k5$^SYWOmiedVFPQ:YB';AR#`V\r%_*#:^7MX'$*KbBTBBU),'Zt=cZ^'P4gj'_5=m5Rjl<<H+q?dX9mhC6-Aa;T)>Vl532f$FsZo,Y"R8?*UmX:pcZAsB2>UYLHb78Aq\r%7\OY:A'H/lP6[TD6<WYfJP'B$PV&f=UP4>"^1hKTqcTM&8Mu4-ptLH@E`Emt@Qt6K(:Ak%^A0KpKsEla=]qH"D]VANTe*@17A!"c\r%Tkr0L;hE:A[e,bsB9U"#e)A?Ade$IcB@Hlkq?`_D^ZhZ2l)-b3IZdh^bE.19:adiaIU_b^P*^X/Rk#AeiDnpQ4oIdOhlBV!QsO)N\r%hOQTk,$JQOQcR8!X+_7*D>HW%ZF@Hh9rlt7/k]uF9m4I:<nWO6@stmF`9,_0<nY6iZKmLea%`s]GM!r.%dK=C??p,iI1<O5Tq%9K\r%9c":'fpb^\I/BeO4#>U]-nP"rS`u0;Sf`NVlN-,_B:=bA-UZd``#@sB#-0Gp(;aImjlWc(LDfi94%hLB(7M_gHn'X-/qG$R"FBY9\r%Tb2+^M!:tUE"j-O%id,Xp[:5!g4UN%hrI@7+6-7"iST*n??Xo(><TI,$@?]:M;g$.]ehm?pf`Rk?[h6nRuA?<_u[@B$4m]b/#1IT\r%5Mh5(JF<2f#rOk>fM/"Ua"A1Ca5tO\F1GPoiu7qA0uJ[5Sh.f;$([%G\F=^$e)fRj"BkknMp(.4qf=Q^4st-5O>[CoJ!^f3(UYD=\r%f,7F)ipsA[eV1O&Et``UP_Q^;\;e1?WA)7ZB`V$Aic=I8Xq2C3S`fc2/pp`@\m-;;CNNb8YgTMIXm!fa-=.e5:`]d%=+^*B85f,C\r%(9+^mOm]_2d`S?C?.m!-bgtr@56.FeKYIDsAPC>N/[gPta6+(]K]T(!d,oG9)RW,9CNV`$V,csDN0Sn8YQbbi2&jY4R52_<jN0F"\r%`(-Ut)<RqaU=a=lMAo>MM\C/dgNQlc++$)ZBieifd$a3`;^<)=AN8PUPYi\@3b8S0m.'d2Y6W(8l%2q_\K2U4!Rl.J#F5J!q'r1V\r%:19!,SB@85m8We[gdi:PZM2?b=^n':08Dohc4\%0d^UT%`"JP)2$[iEE:ou][:IY^`dF-[SmRsqp5jFfd$[g):&osh6Sj-44a@;^\r%c=d8eeEgV.DAMl`!hpm9>Ui4XCde_ZY+-<r'TP_1ETFdX7\O\5b["qFj\cba1m%;9\d<-H)Z7h<,WROAIC#,DB;7EqR2g(H`@;lG\r%BQO)M<0g0cS`=FM</<GfT;&\tb!ToD=>#;-(JI.F/XM>rYL:e[_0]Mug>&8p%o7Mn6(:4c21``hRI`aH5;MIL#ArnQO"!PfCLQpn\r%<4'3,j9kTUa[VaelC%9>WC!)<rFD1,F!.qg8oQ&Nc-[HLf/of5D%;MB<?8h"!+pF?6q4tLc0kJ^ohP7[@@]>uBT7gfJR!pIH<Q&+\r%AeI[dYib,NgF_8g>qBuX0.&l@'(Q4?qNu\nKO_hdYui!11gPcEiTH[8jNJqG<bcqGcm4]/T!*QuS/J5@pgRF`?^*k%i6T7MY2GBt\r%^V5gb5I([[m:m8MC>+(B1c7QW@Buq*G#Qk7minJ"_:I+hkP?O:R^2Usc9$N?.Ps[RZ"kp(V$`c]6V:TiP`!X#9,sf)&,B\;>)`0o\r%329HH5q4"c`C-[BpKM!>bMn_I?B`6,2a5k[oJ@LH,BBMXkd_<ejp+[!hk6UC0u%(R.or]5]l2/[?h4p.8d6"@1Q&n458ds[jSNu1\r%%)0i\VOO"$O0VQHHH5rV-?g1V^\'8<""jg<(9A2XG;UH(2Sc?V0Ht"lgAV;?d4HU;em8[B!\`a.4X7/n\"/JC:FCg,XOrP(3?C=n\r%Kk/TKp866PIpAnmU@#h8n`()g5T&c>\W\Mb3#8UpP22@hP[hPp055aV24*;U\J_G%C>^2Z=B/;q_X)Fqs(uW9DoV'\`p.K^l>O\b\r%bub_L.Wa-:M?VHH$ftKp;CoJoU?X*'q".5-#s\&%6]]):=LpTZ-N(4Rq&b&3,ML,YVI\Iu[9?6cSl:ePl5MeCk>)JcRdbrthS>.$\r%iC_I@<0,)aR<d2nMi2f8kSo:2^iXJJ'7Ssi3WC4kpYP)%nDh@h8nuH'GG,Q)k%1>J\`6]bnHZ*Y=n*sTI4_b*!=jsIcsAX=;kUS!\r%0\9Bg9aX9a(toDU`Q9(WQ/9)I?'?qQjKm_Gd3Uh&&D2V,O%:Q#_NK#G@WkMK&kQhP\sq78p<gQn3e08oE\RG<8d[u\MrYa>R_lr1\r%IAo#M1f>Im.5=:(a($^N-F-nunIF=[S#H<e6.][rl2@9ano^MG-EFo+`fgH]S[&/pL_PZ1`<7\f2CU>_a%?gj:i_Us#Up=^4-IqU\r%YtjV!HGmIf1f>Im/919-&kIRuLLfs`P"C4rS@DCQ.QTqN'AVOqWk*KL=kV_'Z3N-a5\sALA.K+6M,V]eWTGBqp4o7KK6hdj509`E\r%f:ZFuInV?LgjY/1guA')!>CFW8Pe!DpkR7LH<S`o4kcR#8+H?ZojI()r^4A##;_LfD2O<[H:-d@gdC\+pKdV]nqj``5s:SYnW)lT\r%O&u0ZNo,QAJ#hi$\NJ4Cd[oO1]@_?N>;`jAH^qY")?8'9Gl9DRRN3%`%$@Xq\1UWp%lpH$Ye/=Z$J[%@X%(CEZ2?rAAc^n<",?B4\r%Oi$s,+i./Q#GP,[NQ`'%)UE$g,NnSL+N[TkddLg1fI#$g5E*q/rs?L9kjs&8,LVU-<"eSSj,#ne4PkIf>Bn3u#0"4J67Kts>[L5`\r%N)?@Y2p!,R7F1&YM**fiGeOXnb!_hkGs(S'U*fHJY5&(#bA!l`>j^5qQcNeY4Hh.bDNnd<#;&^^#Hd1LeLbrfKtGY?b[I:<!%3"#\r%4[XCiCocC(=nAnPIaRgNqKhP`.t-bFfMc&.[APKBV$<ps7en<pDd$O)g^I+[mH,*hc8R3pLHhJHJtpMEr'f7P\I?[UPQCnPdoYCH\r%jp/K)ZTm:7"RNd1PCG4VJ1c6Ha9Sb*=_ZCVlXtYu<p^;bX5El*%`9bsRbr-]^`d^,$QUfWFc7%5ac1b1f+1DT'ok>!Xm>h.D7tu/\r%@cOlpn8NL*37qTS9>gr(@f=2>]6X_qj0btda_3Gms)0$ePQ'M3Bta2FF10M42nuN^44Vn=mL?'ggiED>@6'=bBQX?H_aaKt[S6!,\r%k%YlZI`(p.Ya)Cm.ptE1@)p[NK+4SNYkDMQ/LWOlkPc0@i[aM6@XCbs\I>Wop6J&L,R0Ug)=>pbA(nVU"r!VO&gE\S+ZQ(YPT/Hc\r%+9\I:TdUI<lqtYl/TT)OU,*QF>ps?od,u`(_mK$5dZVfii[Fs&$Eo,C*3<S3B$o7D$XL`<(t6be>6t-(;:C5>AddEaBsj=O:p9*Y\r%bR+qU3*U&\/cF.P!s!9^CuOVF3O=EQ29tT0nS^1uC_(["n=LWI@]+(i*Mp!n_K@PJQ8$:p8t1TI(c>R7>0OX\h>de[@q"teYQkir\r%?QPS#aFN4\&eLa&V"pF%nb.%6atmEr%6!1%]9jg,dg$:+E`\%[7pYf3Mc"DLP2o579?[BUL\W[@>%.\l4+:?[W[3ChREu,4fn,YV\r%V@/R*AtDa6*']l?FMVX=k41)ml%4.g*1DjRpO4lf+BLH.;OiS_Jm9uq69F/E$$*ib6_"_qZU0=IU$8Z&MQ?f_iX`M0`A/r3L_YEo\r%Z38me)J8<fQiQ&bHXJZ8%&T`ZH=4)`,]7+Vl@I>&0[_>oi.4%tG[N?5%)%cLHXJ[]@*ak5l1jrGo#UL>BFYkQgWK3)BI[*4AU@fA\r%#>ES[H=1!^MJ0^MM[.6'X$Am<Z3Nj?^bf?*#8TlmRBEFq5OT@h5pp4BS(k6i'neTp\VcBgoALfT*Z-;[''QJUN3-L'"kq'40b<XE\r%WDYN6p&"HYP1eVU8nNU<3:(gj";qiG*a&=PBu^<e61r%YGe1+Vgmlh0KA!L)<-\b1oc>WI_UeT>4YW<,7TqTYH!iH6ban'`idleI\r%gPEU_5M]^SjCqQ2"/@kak^Ht6^eX$,i-Y]&02CMK6IUk/nd5r^PF,YbQ5=qh"AQ)Hq'eXIBC-NKUUJ'QRH1g"VRHB-$%d0"E,%I\\r%N`!=R!n;C.S."K"P-?e<i`r_!@.hs2a16#P>#N*c=ID$MheCHm/km.b-"_sS9sE-3`4<NB^$=T^j/L=pTBic[[D[&;/RB_qLiYR5\r%@)[+<Y*l?/aq3A^P.a[qSBL?+=]$1%K"\ldJ1N<\]>dO0'*5O;h"s_'>V`:/Hgl#jBYiPsru[p9)V=.6($#/X^(Ed;9ZG>52RSW=\r%)CKprRBE$I2)B<BDrF#45=N6o7!,fe3WH<s>]u:pnluu^,>p=';!>RG/8k+7H1Y6k>^#F@".dZZ:#g!RU*RTe-^cS7pSrni:,6+Z\r%L/Gp$pZD5r_Z)sMJ)`A@%/=1CV@2jPA,'E2eidagDte^/s+Kb[WL5A`>5BLrP"_3j?1NP2.6H"4mMA@PTLbs'emdUeKlSqS=GoaY\r%YXeRnRa/iZ(X-u\hj#`$p;DEGm9,*(>&sNlg].uGBZ]eNE#tFD)/B[%qm2pAcZ39^aCZuC57?,PK(sJCohSs#?6n!BG8%_MSfGMj\r%i+KTa?#"/P]Gu0=R4ai\,Cj-fc;[C#B0j+0&AQMPkp"BkeD,\P9UDW?<0t0iQh,k:FgU6)=UqbgmL(l-RWC.r;I!(m;QS6cT,'L%\r%8lu5:Q^Qk#k@#MXc;d$0^t<]W>;r$m`6*[B$?,YRH^q./XV<_WcFYu]O;bmnN,uO"U`BtERR<)P''JO&8[[8krWZSs$hO5S!:.L&\r%QGru.(UgVW[jMrq/o5*5H>$D\@[tV54po9>d'E(!PoVICLK[i>r%UJfCYSuA+1Q@_>K"[9HXBd%M_#fqNRI>3`!NOso&OG`+>2NY\r%J(2ge0$g5hmR%FA).oFfO/'$[s1#4E!s;nYAI/(]S`NiIH#76@oWfXuZ+QOjj?3cnk;V0\68+r%N0f"],=]O_nTdN3d4O7L8G=fa\r%_D&D/ZT2Q<,!9%gLK.SN,Jl\&Nk`]"'j!-tXrN9Z:=u95K/t3hcfJ"nKL^7JQjHP7_QSA^I7:>n-<:JkQ^3ccC\r>cj(MtG]spJ5\r%BY%XYKn%X>]RQ1iB(cIt.P+ob%"?E\^Deid7rQCMdc>k<E:1PjT+ug:OI"Ak\FdE31@('-rW'hq^-F(P#!K[S#1*+KWM<g`PO36r\r%9<U2@/9>F,\g$4WPDgHR.[c:]RkY'f++D(KM)KB5EdF('ba.)+-8W%eOkI=h6G='XM2\Fp#h97JN_(<cNf->,Xg!Bt%KT@C=?_`2\r%Ku%88]E<e9T<E98=?.naaU5)<^3f9;`SS8t/+7o9KlI&slCU$&8uR6"qrZQW'KmX(*dY>dSUt=ca8UrZeJSHa[.Ma='E.+9l6PN]\r%,hK!mW(u)epOhGTGkKu0VKbR-Is)pN,Th%^MeA3CH(W8Rg4"Uh%LGm%3KY;+GE"Q0QTj;%p[%'orKVH#(L"`OLRIX(M/7Pm=&4Ra\r%k41h8\Rg.OT0aHqNH`K+Kr\Aq.hK']5IuC,kIp2l]`h'P+>j_Ck&Ip_rl5p`_/e\Dpet>b9b,9V[Ef''SaQB#jd`BXMO)D:*I-Pg\r%.X9bJcVadrDU?<iKNKI;L`>Ef`L%KlhTdSd@QKV^TTN4de&f!!IpWpFSIF.:@nuS,4#=3%A-#:jS2"G]3r)B^\iO:]+0dCH0cb/F\r%!Tp4KB1Bgql-\<_ZA@apWr'nD[75@)aU2BHkSRdUIdj^D78,'r./(rO)Ibb<VRXN=&M`*gn#I\1P6!b3$CGYJcF=p%D-6&jqJrr"\r%dF=--"f+_q]@(p%?m4C8>%e(1_kuGp47'^]BC-;CerNTu,BeV=44%Gf&NcA66VI;"i$qE/CcXa$SqZ2h+s!.jG4KQW,HoEs!O79,\r%MHjsY74$mB32]O0<s]po"4-\]J!/[8q7:l8DQYWUn,HVU%C!YI95fneDqIR(i+\JXU5*S\BJ<BmdDH5Q9udf.oDI3=RMhiT9c/sO\r%$kU)Y@[hju]`YTT2c9nh>tq6)o*Ri.i6,MOD^sX.n<^t^m[,'P*5cH*#@6rDH-r(QbJ41+JF=ZR.-PTclfJR6S+T[irLW2B^^aH;\r%i7IN+2XR_3i0c2:I/JS^REHaA\#upl83=$ADVb\,9Hl\sAS-Vbo:dub@Ji7JqHT(f<ebhiC'eKcpuelSl!"le:W]Ui6D)qjdVAQ&\r%7%^0FU5Y^7k]uZH8\iXscH,Z2Q(KuN,l!g[8eU+G&TNMC,i:YNgeE$iUkkXuId"qDgLN.BTDdd[/DU5VS[.9fEGa`I*!Bs.MiC3r\r%@`oK\NDn3F8"KWlp;Hd#;-tDl#JNA[/f%uM)a&4@L#<0JC;og*(LHMd?D6D(]JOGD4]YY2&RWhhFgEo7?9Aa"XSQ@KR`rW#:%^.4\r%HLmO>UU.N,]+nGPj3Mb\6`6bDPm7nS]Z<Z"h^/q]n,(Ji@>$b',PmI6oC64bj<`kUO3[,,IbnXeZ8f0K0o?dda+Fe=E^Cft+&C?S\r%#^NM!4F"Vo?$#]HhRLUpVL'D$$7^;*Qg;kWW2nkLjBiU%nDYgkj6s%Li5NIZ\6Dd0"g?+]:g:bomlHsP='<@$DI?OL_2F-Z\0Y'b\r%"Y\F2BQ^#WK%EWs=)9;DXoU7hK:2PHBh'+7EG%t*T`dHj8h5-6]HhWSP,;IVK?nIn%4/+N<*&MJod4VmPZI:bn,<9\oM`,j1ep7a\r%23cH*;d7*(mTc`ni:Yt(M@Cm,N[_*g<PX7rK9JZ#=D7s-fLo+G_&MM_afXL?a$ZnI[2$?S]Hht108;@BDF'O&]\mIrX09$b(GAp1\r%a,nFN?LO]'U'fbb`X$omGTJ4%N#SgAL!EfqN12Zp3:)^:mZfj%b"d!Q@0#OTg"mIT0"s0.)Xe#68sGF/AFBjgq8_og3W3a,AEfr:\r%=kNsTRSMWgZBe"1qmn;u]>B?o\-ZGThGs(2K2tU_]i+$!\b']WY8m#2Iuoe`+pr;IK:c.AMFd.4R%#:WSf\>5&]%'#+ckYBZD.%u\r%nuG,e86,O>=_5Gf;q8TT3">R#=^ggA;<$lpGI(dSK;P\bh^*hckSI1J^.U40TmC&qH/+ug,i4P"ni.q*28)1hoZplpEjh,+0CF95\r%o'0k]nBh3_#-Xj=(+$gQ/B)"$&U&JfD7)I[MmBHg6[/fYNU-JC2$#t0H0iEjfs0cN(7T0[F@;R7"lHSA@]'SYGCG7Ad_jJPUi!NR\r%$"^b$];h7G[Xu1#_."brgWIe2WO8k`,Zj1eQXX1Xq(]W+YJ@RJ^$g[eUMQulgXLUdnMZZ;q@BRLI.IcPo=n5g`V&tiITq2Rs5Q8-\r%c!=jXRJ5V-WVP5H)u-m)?K0]B.R'2WhrB<85K)Z89u8cVbJipi6*d*6jl6$EZq6U"pYtpS/bUR"=;\^pE$9lQT@,YT;[[Y;QuZ(:\r%VUi][`=,9jE(-$%%V"[Vq^W0a8eDQtRgIf*m+NgLpS@&2CS.-__M6/o4%HLKj5!7=l`,2V]i_P.[2(SU:)AlU;kmfu\'J)4d9iKe\r%fg9>1-S1NZl=ro2W48?Lkd-Au<#*)_p<LN0JMIiu>;2tn&XH&QC^Km%*6o>d_=DP+Gap?1f@I9XIX2R][CqHC=Zb:q])OVMA0W:,\r%\jM_aoD8?u(%,#JC<dWBkZLkl$3fS.4EM14#Ktf.;0ps?j;/9tGCQ+8[H$$]qEO-/Im[#GRkJ9YG?DlZrectHHi!Yl7.([KA%O&Z\r%LVBYD58X-@&<iNSdj*3,.#kc]#qf9-a;Mlj[QaGnAEc$,5VR+Zk/GG4#>$_`_52f;ljf1j1\^5/!2Z<t8(*"2O%:Sb=Y2%lg8PnW\r%c5UGf>hlDID=>a3&=ook#)nf@d*Fd\a6s9VN&?Uf7WD:Y\;*/"`Tj38LjS?EM:P1N&be=mdLeRk4Ln2[LT0EOX4P3:LesR7e(IS0\r%a_`e',L\tc&oBCNT:[%mP%^$[gGU><,uL,)eO<T]9;471f-N!/-.+&,B.PUp-.+(2k/I6'PA-5k*Hkjp9o`,X-R$C8)Z!Y(jb/m;\r%E"sS(RO"@2<dh6_4aBak;7O;ARqs_o]pR5i`Ba%p/k,tr9no'A.Y6`0'<4AW)9F*R!h,1^30aQiYt\i."r%-`h4:T<TXf06%"!BL\r%5kAmI9#'9NM24"Flru6-(6K@)MR:]Gah6ECgHkDqW>Lfi3^4(E49Xi<A+n9:Da!e<MP=G"*V89&2OL#O/Ml5M_F(<M2+C7+8J<QV\r%@h,A:Vg/*L^G(MsC\<XKT&1fL4\ZH@lp^r#i/f+iFa_e`bd]'V%%T,&ZqH6C#&e$ZZqH6C7eXlmBU9?e%![2oM,e7")<A_adB<7P\r%="]coRp$!"oI5H2N`.sE\"1ZjPoHDW00B%XdfZ@*@!8`P9Fm*EJDhA7W?0]F"4mMG)I+Z5A8)UCKf(Wld/&J\md_jO^pe<)'PhWO\r%c%AaE*5t;Q1t21/l\;N%b3nEB`t.;qf%qhI*Etaq^1-"*15<JcCcmAXCVg";\Cq;fRM0@UFBnlaXr)#9-bD!$<rHts9NWAO?QQV-\r%GMt[I0a8hh0_%#<A`=^mj%=\n:c-'F?Te\C/cMS]r2"0+.B8,"0tXj@2l$Q,L/b1-h5'pG>F%V++O->LL3!`/s!UkL]o5OHO[D*0\r%a#A44pVPLb!Up^3[]GnfC];*$(F.h)IqhM<T=+b[;&VBbro9VE>_i7*;RSd`q-g,E__V'a"20K7C>->%hUDPJB*D6PqBdR_KGADI\r%DnedN0;c15kSO6G1e&jj<?SZXGKT&qlJqsD(<r#-StB^ANAXt[_hMiEr\?;lNVl\mn=oB-[,YSl4nXWWPi9T&pcI[s2tK#EdL>u"\r%4'(tO?l;PBK1#:+Y'T6LW!?m6pN:-VhQcA'&%;!)-%`]O8"/,3^2W@l*,0"H,N7.3$#,-3B5[Qk%QAm.D],=<jZK)L3.<[jd*HS/\r%71Ik1X<O2N!$tl;@X1!!<=.9==C.*J<Q-g@=Ls!W(?=En'$EpHa>G5B6VUY&2'adh1pF%?)A:4de(&FIM<+msMFto&d8KOQl#4J(\r%r.ZYB>2rXUZ'H2[GT`@_UKLps]VWhg(i:FrM47f[Q<1_3+[_uVQR"L/7^Ka4pJ"sPN+R@O>q%]O7MFID/it"AlgTV/0/jh>lgTTU\r%9_&s+<Yu.M0ILf/A`Zh,),&iGbM(q@[[/=VnR_+W79WBX`L"!M<tf?=AXt6fB.S%\0C)$"-Ih%u3`-028]b1a=W_GQ]OfM,?e,]o\r%HsK'BI'[Ta<Udd.WVf6],aE:O!1pe?L6h[jWW]]oP?7&8INou=i2cJR^J\77DePt#]IRQYqX.$nk.@Hk0(FIsp*sM8'jC3-CThoB\r%B$JVMIZ[u]d8X0i^FuIrXN',P*)1S7DfT;6#>KEY`n>C*f@P1j'BQ_"hd/GIWVFkd#9EQdCYsLZ_^kbH-p$.L`NJG,^F1W%&@XDh\r%FD-L2%uoB'Rh\32_g>`/<'GOBa3okk\>>(dG[d-NnJ.-lU`n>7^+<^_(&6>X)(TF\.j2O@j\[/7!n%I)a&IkuXE\q@^VpI?]aD\Z\r%5^I]:;lH`2o4!g8[$m?9b9<pN_(W-!455<HT"WKdMQ*p5i[ZtEGK+n#XNrh^F#]^*XJknTKJ1SR..n.BZ*5E(!UAW&X#XPD7Z7&.\r%d[8gaWoKGqBPG'ENaM@*Z!&YjgLb)[l=iO7PJ@^Vj2sc>kG1sAVeF=?12LeCp_,1?fr&.Fs#Kgb?=nYN(rBT#G'[9Glc2;e1lM'o\r%[ZDnPX<K6^/%uo&LFGocYoJmL4P[hIM0hZ1C@;C3<ncgK-LEY$1p^*_0l\jTBkHf_`PfHCV4$XP9Zll`Sogf+&L5/!`/+/A]l51G\r%NdI=U+&*-j<(-_i(H<Xu<5bu`nl]J/Hs^T[D<r<$$D4`Hq:a9jV`f$DFa5sqW;_,=61YA<-QZB5H2ceX)4i=HCVO6')=(%IUs<R6\r%'<q,<joRT%obmC%)8*PaZJ7*T`Y(@1eK:kVe9J/MOV>_!6YX,].^5m__@PK"QUbs%k1A)ZS_/T;]aOVVf.JF1c$'k]DGREulBT$d\r%<[@k:Q`)fM+XPTUrE^Xane#`S$.8/#3C-mF]5)l;K7*$b!K$#`fN"RTo(?K/7-s,\>Ob8i>Qgq`4Ll`*J;\sCK(lt\^dUM2TkCY<\r%^dS6A&^,llJo2+Eon<Au6JgmV\%.X5?S0X-.Agi*=TmK0$[YG6e67`Q95ngW/AMFR,P5Xn#0:1LD87@ZFsHl@BH*^9Z(stMker;p\r%9V.2V!u;Y,B'0>dN/YD55E$..rOWf?A4gPa"KnFGHDQXU%5?U2QMuC#SbHIN]%VkA^_[Tu+X%/K*?`$s+S=N;0>gWSs3iJ[DNSMP\r%P%X7TmJ5rCB$Xlo`(`m?^!HOXf&c+^O4Ed`H'@R?BtlFKqsu1@c)\>L&cNY1g-G,`cF!/EVu+'Qp,gJ^?%8s;<]c#APV:Cs=1oRs\r%X`Ca0.:(NV0pE7JV?Q0M46`I=@r&t'WIgO^pJ;Ud?sB:V2YuI-.^uSWn$Zf$(!mlf:fU=s=`HQ^rjHD:D9Me1QM%^=lX/80KjH0G\r%3k^S6ckd'DO4a;bXcB)ONPqoVC5snc66l$=8:s\[1$i,=O-Q<@RE1;FhV)Z-;r+m=8T[CoKWT=TEaiD[)ef]j0?J&D3,M5>3p`]A\r%_6G>,=UUjh.;WX9.?.mi^00cnV"nIls1Z<bR'FZR*dU;PQ@=&7AfY3@Rmc3P,I!AR)L7.SC..'<2B#KreB4W"1qH[&kFA%E?<(k*\r%@#pN30r@CQ=o$FA5`k!G:s\!C)/H>QjZ#KE1c^8]@fiu8k2b$?C'hr9I'4^^[%OpI6kWb1R#k@bEh7r*2g0OKcjKLQ/Nf3]:Hnb<\r%=-:<#]H,Ya$I4Q2?;V'/4>Wnl3\#LUf6oc/mtWnI)-c(Kk@HE)o'4J($iS%aD6eZW38H,-<i1lLhsT^N8oZinO#cSnI2tP*mCi&M\r%=hL',<_A_#\.Kj6G9GI!VNc\jK-d=Z^->B$N9>b3an[IhERr.dp'+j\nYk=plul^ig<]'kbQN(X/pTC&<K6$L>I0bY\,c!_@D#HM\r%WZ0YPGKr[O2%4=_MW_66R>hQN!fG8m2,]>_ME9Ci4PW=0"N9!o^FOqfJ:b+)j*,'F5X=[,@AZ2!3_I\6'^T$n$3\;5/S9)p#mA0a\r%4bF(*592%_2@B0SBIQ))ZV`^29::g'1E5GC(lAM'LhEK%Y0V;Ql=No=C_WuIB[]h!AttG'M\ZSSf7`:V7;*edI&OmO4PVJ*,nLXf\r%ke9VZWP)G(mNOt?+;T[NHt@sr^^2JuFM1gLe3H8=c\'bmUd.1-)hfYoU'(PWI282rVG0S&R>ms/.SR<ad7mfC!G>W#_B!3mFH'Yu\r%[rpBMM;FNC1C-"Y<(0Gq[s?,H'N@BC[<D,.8`:PK;H/A_.7,4/E'S/:.j8&>L23p<1RWN]aaZRuF[X[JJ9MSb,%V3Soq3^K3HsAK\r%?fW,e6E?#`culK**_rVgJZa'jnBdHE!F63t+9g)%VTDW-!@^HK(m.Gd%S.laYK*nYFmUG4dk)>FM;.Blh2u7f<*X.9d*<En>t!5*\r%ANO*;/J\p?&?RP/BogNJka3&T^I6Y8A`%9b+c33Db>qp43C]R",3gf#N\(&a=SbIb,A[-2Wq>61p#7X2E4]@S&;iq447/CL-CS(h\r%F&:0>e0O9I#GH+`k9>RUi1Ca6@Qm*d51Ui,X1F0I3SXDLl_ooW]5AD3X87!iF!Y:4^\h-`5Mc%V<1h*BAI1*ZR&qni#t^6gi`6iC\r%Q%!>26n8XG(E@'FUm2,MoDh%jAS%-68MWq9UP2Og,FOfH6eCqrn!&LG%%G9R>%e)_X:fh(,8!biF4A]cXK6S&[?$Wk8+/ZGmrWD$\r%<PO"_es"#NU-;dCq52a[O!j5qlAO'EJefNZX(]o:DZb?jip)]\.;:`a1OWZ/*uo)l[Rp9,!:pF7k_+-U8/qM6aN'q(=7j]/ob@a*\r%Q>t%[l(t5.IXtPk^mq@b>M[2<P7]NGVt2^H6>?<5HA%ihoH-k)0&>+:VcdH1])&U(5?X>PE7L4`qT6M=l;(/>IF`=d<NGB5[o.-a\r%D*8Uro40MY+EJiYk%W:j&E<H22C@WKW"[?no(!i5"m72lq)X-h;1$#`mTjIob>&5,qcJK)RdkTpV@(*[Hqi5[XOttql?B@[nX>Fp\r%bIu&1$bb:NH>d\8@".;L'EgI*1`PO0M;hl2U*+_dOG/lk!$lhp!SPj3"@/-jAPt@]M6HOc.7XY*=)u4q/Oub<':L%q*+9]__Oi'[\r%[Fc7da4<R4f`-p16<>q".Yki8=#/tXPJU_*c^OCJ-&#uZ(b6nP#!8BkY,H@Xm.>?;0UK`%@&J@=KR9>L_>[@10[jjFAn'6N&ah!c\r%c,=o`F5GHZDl'-tSJqLA9EH>nrs)W2*!2d]ra&on-NC_`#D"Q>PS/*,k@Z9F,?O9_eO?M;)P7)5[Y+eXH]0Sa(h=DPrKkqf%CNp]\r%PC4A9%<<tSf/_0Y(7oll]t\[9](<Q?*0CM1f.RY8=4'=#J>5(YYgqLP5$dV7Zsfh=j;Q\A*S8.ZBNYFA^>iCi?_e-I9h=U?)-9do\r%"'`M">)LOT/`1P"oWC"U[a9FW2`p[J9?srpO98_$VA=Vaar8q'274-d"'`L:QBAV@1pH)Rj;r(k.0EeWENRE*oGC_KUOQL"#*A0,\r%V^gJGZ^&/UV+oU:3-!i'Vs)6pYgT!::Zq7\q7n=X\9$[PMr1![GD!6^lf[tWEOprr\.l?XG^B:F?<0SdcJt(R1-F+?O1dMpY3j5@\r%\qSI4]XC[nbpHNCiVrad.CjlmAmRi+o'EhgFKmhJ2ea,%[Dl,I`lF-i`pEm#r]*b8gRW"*#KMoDY&dfM:aW6)n2]:gh5%*>f#GVY\r%3<M1g1CAk#1%I$N7,sP'hj#p/_:!R^/rO*2+iAsC/]NBG%iH]^=0_hnO*)l\;pXE:J!1pT1.GFWiO`"=^m=Gh<`(.QCf1(lV%%8:\r%XuDoil0-j3U>_2Y4YB:'9,lOS[(b1`05`B(D1+G!'Qu,!dKfVTNPuEmls:H+G`?UDd)0<h-9Np%O@U>Cnf?>6?;\^nXnCpFENDem\r%gP*Zh++K06Vs90(Y&l7%2fhM%4=k9#oD-%+eQ"ikf[D=LqTUkJ>)VOEW5PYe!YV7:Nn%B`7IN.kZJ_^jZVU6]Uje'+"`p$q/P"l(\r%pe5P$bG=/!=!@'h`2Tlqg]7\_iA,`7Y2ph*=91:eC!:D$k,O'hIH!l>cjj`#EaUsS9Poo([`jITM,RWSR4YbY<8uCCBk@`3j\7kn\r%A2d\O=_^j3[[PmQgIh'dYIE<ED3U+YV3rcS&Z.&A)N/ir$eE>4iVc(binB@+#o?hq;%IY,)l=s;\0d)B!QOlPCnlsh`A:h6>O4YB\r%=6RH5:JSn=/T80(J,7uMgScc?ksVWXF0?Go.g++VKVi=bZ8*-EO-WXUTOh6,N*2'/k^_LDX:4`Xd:aC=(r"oRQ\UDM/A=52VLt[g\r%d-n^6I@'C_N?4i&1C*=1f@`1OC21!#:Fn`#J`$'Z:4-m#h#CW)5Jk`)G7/K(H@;<4*-^$QL<T@Nom/hnoTNL*X80AIdm>^Kl^i(K\r%0ML0pe.#&%)uc$q7P'cj5=XT]#bVd#;$^)&Cm76uD;`aJ%dP'rUoqZZMBHVEO.If#`8NN0A[?Ra)a;85@h]i@T.H3n&Ot^^F4cgW\r%.)IB3Qmm_5N'ajb_PS$adlG6PF`A:)!OJL0mH,\'P)mYLejLQ8pq29b]"!\OIh'-?l=s9&"oYa\*pU)>]:;eh4,g=t9AD<3[.P_e\r%m;J:E?9KCFpo:$oh`gsE_MJTu(+`q]b^s`-\(L[=>0%CZ+fSr""nTF1I[MhuYZ,WNT.8Jf<@qM5::&CVa2^Q)O7S1'W+!8hr^@&]\r%.rQ4NFQ<5r)K6DB\)=sPe\0,qDKg<,qiK+%BTX-U!4c@c@<pCP7,*hOF.<,!T>Jc7F4CLshC#lqk2Q>7]/2HqZe9W%Kf/MH]!?M^\r%8j<.D(d7SoN[I,5e'7jE`$oXq$X3k<h8dDN6h)0M4e/5od-q/2r\K2qjS>"uVI1Rh:bYU_^dS-L2ImtjWY*MY,9[F0koL\`!J?W*\r%>RueSJ3ci*>RueSJDnUrW?)nu!AflgU)mDJZHtI9)2/L:,"tj$64:>cKeSo-$<kN)/@9_JH(fpsa?mD"6U;*jOG+1IJcf0^^%8Z%\r%I[(%.]JX-\S'.'_M$K:[,t-)+?U7q4?Nh4d/9"MHNMK0'$I%(.7]12^$HuhWj4nlI$I%(.MAgIlZ4nW2)^X?[Gm"kLceO.9p#+b6\r%bR#dR#J1(:iiUlV_)X\K8j'2pOTL.ZPI>D_PqXMUeA=?%7^#[kKYI''S8d'[2ST=*#'fJfho?g4$583ehK?.afpW!7!9+rDFp_XH\r%(!p7J<;e4$(n5%6McOhs0]2=?mABcoimurH>a!uj>G#cnQ9?/0TnrVsJ0Y>]#70OgZ)C/<*=q<-N$FKB(7hDV)k_Q<A2ukQShGAG\r%MJe.0S.k);=KDi;EYm[l(9>;=lS5EZZHp)&3#B5i>n=A7`jt#qI/+Li+6RBTkF1)mp8FDX\@bBfNcU1A\0J#X1<6r07UFo2Gao-T\r%Vj@`&O)si28A^C.R2Nu"a14aI$1c-I'U9&t&TXDba<ubI]"#bjE0F-9BHbteQdPaWQ_fi>ree-_fOp_tDT[lXS4c_sY(1c:\SulA\r%$&46&i/I#B/qm:J$B9*UWc2X45njA0R$2/!658FgR!bPQ.hbhG37kYr-/*>k(37.a31&O906`oo.<06l/&:1;-YgFsQtZ_do4<u(\r%Tp68"bJeT&Y&BIo9cQ'"VC@M2UEl2lq:Me*](i9Lm4^CD1<tT&(\_kZH(8ZQJYc!q\!g,0][^6.bW/Ss7iNK+EA"=Dgt[k87jO(8\r%?0(E[b#ND*)\8L]EN[jZm*kY!&<n)?rt]==CY\n&m5UHk]Z][!,)pYHM24^C\L_A=dW$laF^pnDV-*"pIQ*R,l"^p6/=a56g:p(^\r%ZGo]>BZIYk,#rO\(2:l"GtY^H>9k^,Xct+*Diq+P7?u]D7C'5C]2E,<(<Mp]o9A>/Diq+PP6EPCIu@iKNLs^>rEFTOo%)p3ZCIO(\r%^%,:Dao]U5<95j$Q"BA2o2d"1=]m7Oa1C<YK:p.M<??3a=ca[5<I)f"AU12GU;=9`\33_]p4%T!l*@U".0?*`@kK9)nZ_&1HbR?t\r%QJugp8[Pd2(QMOA/B>oM3@4CAA"04<[D-+YbK9&,'"BGTrEGhA=hF[C*RO_c`"-fe95*->.)>:<F0t$'=\-;4*.QMG@A,gcS7$oa\r%IgYhS-B8>BP3%K`Ib*=eTp9QhH3LmP"`92T7n\l7L%kEfapd!Qf!mL^>\9)JcU+Z?*htopT/Apb+9;g0r2f!Ro6r>nlQ5fX:V)P8\r%ohkU,I<lp9/s9#4-WYjMUqNV'>R"8#Hco7FI(VdpHcqdJ,T9pZq&YY(+o!]&?o0tW%EsEiO4!G^1sfMG"\-B3d=>gE3_!V`oBs8\\r%6Lj(*fd@6saib9j+*5Y&NOG4tn1,q?(MmF+bE!N'0$'+L'B@oH,Wm_$m['kS)MH*MO^]s8Ta&%6dBPNED#eM8W)stp`*G2N%=<()\r%.>"L#)W%WJBNQ028],:!M1DF2D\W@q3%C5K:"$gqjG6nV2G"!0)0q)/D^ifI>f!b@dlf;[FS*r/HhtWhaN"]M0:X+X(gajA-cXnB\r%$t(0C<XmmDR`TX?io/LkU;L$oOVUU1o'rWG``S-VP5:,7giYK^r?Y,n`%MN0AAas<#T/k28"W]A\O@L'nptToa2?_/S4=hl2JBF/\r%Qk6R1VPP@u[)puT=ca)?=%6>PN$0/(N@_+Kq/FrpZ-0bWjQPrN9U1b[]9[r7&#Rdu._W+1\K2u<FpU$LV(Z^f@[XjY)b#`\F]q^G\r%AMhS;H]ME"!7sHY?2@Rt)?_N;k.LJOf"]olh:]hgI/odO$lDS^T?uT"F5S6U*$_GE)4nD3=f&`X;qndr:9b*D`R[f\A]EG)2"fPO\r%&JG&_\*=(Pf0X4&HdKHE?T5'_p(72/k'Q:Ul/9.`]3W@(a"DH_(srHp[=J5m82(2"/H63[7de!3==)'C/A_hg)PIQqqo'mmf\t@)\r%V[QchSMg8+#r2pI0XJ/l,0c2pPmk+'9U[-hnhKs^&o!(GQ6GH.,0fWD;Et%2Y6Y4fnA<7WgX:!T]RY1h6.`[_.RnGk`a2bgYDI.r\r%db1$'1+N:.<[OSE12(b*$VN+!F5!k:N">UIHAc4%$WApW"DX<]04LT/70APaW*q"r,6hnmW#F'DF5_>><"Fqp95M8[A9qW/#>A!+\r%HXJ*(%%^sL4YW$$L;&RV&'WY-QKj#UhN`[6(s)f22A<VBR##7kmX^L\#J:GT*Z3!"6YBc3#=`aL?q4(s#=`aL'NMRH(>@X^T':hX\r%>Z_LF]uS`?[uG8M[Be>s>h=2r`LlH5ao!pf`[0;F^?1cV9!l?\bqG!T+iF<M28:j2Ai(^^F\/+kZJE!H\h8ig>ums]WbQ)CGk2-.\r%-'qD+h]gUl%+AK/HdI1]_L`1&LGGa=^ub*clf+<"WZ9H8051?JiI'%$06iKdNmf.#nn\a1b+[GIMl%q+EYcs@p[VkRr1#G8:]pF<\r%]aKVNCA)AQ5Kq.uOQVtd-M9$i!j]VKWE.i"Jid/WV1UtP1.-i+,OCKChJF=;E-bI-nmUMaXfPl*n_Ra>Z1s!DaUY@E.lQ*6)()]o\r%]OC75paQZ;VHqq8R>6,@jhd(6De)LD-IbfTq(m2GBA\ZuW3)E32m2W.9?qA2b@kH"GJ<:-%p[6*m3GloWCnG\(O`oH1g;QF.6.i:\r%F7TemB\0#=8q?N`rAc<X<[espm.)9"#C'Y\rF[GE$SMX+#<TY=e[d8lgTPh7\^'Sgr*oSt5+Lfj`Ns-OG=Prb1_iatXKOqcF#2_-\r%^F`7*;d"\Jr-/-jiJ=;iTiI_57-u.h`7j')&o]?lChjPE_R4FPrZ'PH]>hlDhI?05b0b6FEdZ*aPRMCUj0%J,RZc(3Dfm?rf9GWl\r%'Fm=i?GDEk;$T0aiVbB0[gUIh\).q(X^?+nGl\p6'XWrck65(CFaMEW4>6WZ6EW=%K*rIs>"G7Vg74][jUEf^MAKI;PrEg0=7STa\r%\`UQo6u!QPTmP'XO2X%QMS=.<k]buta&D062G%srYbN&TNcH3m-u'%U)f+*QErg:)Go>D/&C<blS6,,bgJ18nO6jP[rX8\Gpg^/`\r%hEj[@j\a;&<VhEk"UPu&FEXKPZU*977/sK"aJbfl)`CC*qQL!s8fG7o`j.:Mc`%Or<aFLm]/7*!(?]`4(N[b:par3k-t1$8W+#(P\r%Tsi.u]:]m_1"UTNrCW<^S!3.;H9\^sMDhi6`I&V148&j;lJs_;J"&sCU_)MPp5id/MbT#-$SD=-Uf'=ImpQNUFNIN9+0Q04n?cHD\r%52I)jHLg20,g^BKSV[!FFu=o<qEC&L\iE(uOXR3kg?;oAW\nklZbO<u4@0#@Upl*#q=!5VShuB?,)@_EA,#iRots/B,H=(&.Utu2\r%=]C*><4F*<>uUu#W\-k@_7h3i<&o>Jo);Mdh0e/!dp6<P`R9eu*[+K^*$U>$6>4a.(F+qO>-!QP,D:s>aRDV6+]MEJ?Vk3bn=Q94\r%H@@B`i]l6V3>'-d8M1km66LkL:l+JKI-f.C-mOBLiR"b>q<(V8Q"B>1b:Q-U=BPZa3KgJFnYC-V6KH;K1kVsJqoM\FEDa8cdY>:2\r%%'^9-.[Y^BFGS+%aVE&3Q_fjU%<;40.]ZX86WrsF.\LGG.P#sRKmo@:$B[K_MNUc\Y2(H@[Ii[_R;_Fdc&3.lNVtTrKucr3V4.ao\r%AY5h-2=Ot=X;of"b#O81!qT&'HE:[f5V"C2lB#EZ?@!dc6p)!OQB$KePOn&Kk`KMck^btiGXs+mN_#\jU?3'ZlHNN@rTA0;16$OK\r%L,DX-KufiW/ObYp&38jDe,h7-"GOpgB,f:?9Y3caKufiHA474^7.)s2M^sF^b/4\%rtocK1)c8=rPu-sJMS_.J5#DrL.$]R#%XA*\r%@rq$NFUYs4=-:uLh6C`rj'QUBq+\LZlu.q*.uu>shfnRfQ2?nVm52S[G;CVGO@4=^N@$G@rG/oV'B.?(b`E^\)@LeD+c5]Kq0es\\r%+Ire!hNacjKBu!NS@aS*1PdXk[)s@=^1]9ScJK?)^djV,oF_\/aUHlfX6j#O15"e#(!$f@p/nS2#6.+T<l17j>8a10I^I)H3&,*q\r%kN$7[?&fY0ArpZOf38ODTkL`Bc>6pe_n@tk>+q.RHjl4"I$qgG'S2OCW6o/\+Ybs7<=.m3o;39DVA%jdkh_@M1MEDq76EG8%\L;*\r%PE*k[6,T(*mH!LT6!lilgbIl12[7cni!!L89)88Ff`o9@Ek23[pBdtAWK%bo&P7G;@Q@WB?M5h]]UZV&bV.\1QJlHc$aHRPe#[G@\r%oX"$7-7^A*lXqY%6\<%$(7s[XSoa%U+R??C?--&999,WucV"f`6eK]d,p!?2&GEH77Lk#Z#l@aYr=fOV&GEHsrF?6L6eK^_<!Fb*\r%Yb.bj$r@@@57;Y;!hgIJI[7>-QaMU9hp5c.c&;C#7[lsL'Z7u;qKu]DZ[=tlG+lktZXC4F:hVSbIhZmr7Id_Vlr;?g\3q_gHB(Ql\r%$Bk<<1CG"QC2s#On4].;'I<KWMY*\eaj2`2-"SD,8UJ1/.Q]*#eW:_2.7j$9cmQi)'FaAA5mfY`;NSfBOuALpos;NjQ2H(H?GTMZ\r%/NJ9GLHW`>5OnVR5R$43,/9b(^'iK=qN%oe.=RSQ'QfG/784<XUE'q2X,rh84Y=BSm3,b<524.B(33=U/_@$eA5]9%pNrpIn@_qa\r%^O=rTLR$o?b0OqR=Rq,5`@ItT/n>SF".kg!]9#Uc$s4m4Ve'Q+fgcfW4OPl[N,EnF\'QK<`TWV#E!mS\,8f8-$uWlpL-3&T7<5q$\r%-\=3LB[7uMk,J'F5kEc4pCgf<YC>[.lNhYT5IgVI,=1C3`V`Z*>kut27jlGSY/u%.3NG"\$XAm!0`*2,<f8S>d-i/i<\%`UC;G\:\r%&CA<V7*C*CHE3PeXWkHcVWCj=$K^&Xq.!,ec9SC.Yl'kScBp],dKZ>bg]W6m(a24#@OKQ+I>lLd=SX\RqUf%K.k7bV2MhU2QA$JE\r%klWQ!9gHY+Opbh;g;nA9+/=0IT_oWiSV7`20IP/@^t.iMZ@:J2+)+eT/'1$:n1l<t619S*@#p3GKkM<$_9_>nY0U*57AWUq-/ZY=\r%ojhZ#6i[!A>3R-*5LBFq0`HaTaR,%3PH!Zkhp#6L]BfE":Cd8[8D'G[ZU3^B*1n<2*h@OZ'N)o@qn@OLeh.!e@i`[mm:@-<ddleb\r%rD6.ZIs"%6J]G7"mBpsbfB6G.FCRP0kBL+=@BP2\]&huJ<M\MiQ\L$M0BD.hlRMt-?U<RaZ%:3:"&b\V`te4m1!k`a>/&NM4JrQG\r%@gsY3MWcSG>ht"+;++dM"tM"'F?B$5`eSZW0L(t>k"EW9""#8q7UtI(-Xr+P-cSW7%lD=7DpcTF;j`F3,3G8TJn?1GqjCqu%-AD*\r%=#OO#LcG\*0fELRLcG\<aDAe>+toP8*(/=[E,es@3HgWYd.J7en%s3$/p#6a_YBO/h?ta-3MraV`-=LQr.Ti;o]O0ujcaOj4Fn=;\r%rCq]cnS!']8<!Q^X\9;c#gJ:B!4qE*CU3<PAD\_7WL_0#IYi0V%_p9/)OW<>))=,7F@@L9e9Mh[Y]IcQN#1HlL[GnBar?\rR>bd'\r%R>CAk04*t8esfpWGdtcGM",r,pk.q^dITDTO0%e]YGb\BI`TM]+nDFG399ajjdD771c&E7/_s8[+O6i1FE.D!hV:B/S*uuA-+BBa\r%'#7KUiQ#_b,Un&WIFmX$FY0AS[O8t@Nc`;Kl$2-EE?=YX]6ZA/[U6DZ?hh&gBclGJFKb([od@))_fa&o>[Iru7ai`0+0QW%Xl@Uq\r%1Z#n7a-SSH"?WmVfH7Hoh=]C^A*7jjiZ1gZ@-6rn*.PaHbthcMQaO7:m:G-Xqt9%4_pht2[9:)AEjtpl?p.RpYjZsX/]t*Lq82J=\r%]#MOu8$DLW;<RMH])uiYO']CSB?7X?D)mRs/h=j:nak?TZr>71!:fpNW)0Y(pC\qa:9<I+ElsseduMo:b@A$=dZ87%k>>1/A-tV9\r%Ta+s8*II=iF5)-!BJ8eK\)uuHe=sXi@k;\-qchh=F*N:fT!PuDfhm.so2GZYGAd@j23qt@CBj6Z)-%Ld<!XHV)QF@o?q!'Ok@>0\\r%oO6.t%:6qk_(<HR.24Y&+J1%$Vl7%8j?'q";C@D6L"=A;K8KFoUq&!C,9QQiYBo)K2,=2D]*gD"mH<*S3V9?_2Yr9lLGO1Q^8#`a\r%RkhfU/+5uQA&[(bZ*(@sol9hJlm[BJUF6*>p5QJ/3_8n,>C*@G]5c;/cm=0gXS?nZYLfFde9EkYn%_l!UZ=BQ,aOmP7D<F5j%eG"\r%^_D'+UG*WZ!]PaLb:*J@;%0lQ_e^$Y7]/pMadJ.ZmZ)UkUZBWgiC5`JFHi<K-q0t.8'.0YJorhg3iXpTTM'N32c2F=;t!?A)$HQ-\r%eOi$^)]!fQ,64[onhXjZjuXN9h_0Aa^S'8Ye\jr3Zhd27JmjteG;b=t7+1V`8nOdq<EK+[;t+UfU@Q\1.Te(fWs$nTSBqQqV.F#)\r%^onBpp)boX^onAYmZgQqjAiSD/=o+CBe,Kphn4kYFrK\Oo\/7PQ9(VnN2?4H3df%\/=gU#iD4,M#(O6*b7lbqn/#<ujhk2Hs*P]E\r%F!M"OLRr!bh@=@k#(lbl+sP1G-`h_125I^6*[r*KW?4r1AN,*Y<`<uQ;dm@h"%i.L3dM$I_+`kY>j&ip\-\W+>pE#2U[>,G]skW8\r%aMPJ("9=\M5fiO;Y2nC;9F=]G2QNJC60l0<"%r!%l##k?_<5IEG27#2G0jDTEI44f4Ijs0Zeb:iCqJDQbk>_N=82H5L@nr)0[_K?\r%f(9W%KNTd="b+JIcGRP$bcM`;)CkRL\fjdC3pA\L1%"p5)#'Hl@O;p7'/7Hs`(YE)d!os0l0OA:&=AV$V&MN1pBrMX*']GKC;Ub1\r%iN`24s'@ZP5NpV!]`OA'=B68nE]+aMbJkpqfYY[S]T's<DH0>@!n`,m:ZaibJ,\6G\$J:\>QHs/p;=$)\H7#k)imh*RL<t'WlX\*\r%rW%^!0S"q&Y+-*:8-4%u)MW;pPh./a@[eHU>@%<UR"0-Dn:C^d7mBrM!BbTRLPM^!A3roP!qp5Pq:_@HFQ^*+pL<Lj>5c4sS0MkF\r%6[c*Od6Ds^7X+f$7j;RFXbJI3QP+,e:MFmP9c`JOb&"f"G.rbh<\"31>uet1+j$">qUTtjqZU5:L&Q0n6@Y>mL19+(aGZF7=h1Z/\r%-f7Q7lSG>Dd$Nqc&`JY*kZh//pg6Z5\N2rr&?(E]c#(&(e5l6e#PP`T8.h]hFS06YHG^heXPUUIc`,g%kQ*BlceVmqod$is%=3Y#\r%[KVM(JNbg1C^Wn@p[U,*eWIDC^u%N'i0\jpLhU1Y?Onl@$SgK[j6RrOD]u"I`e>e@m("U@ZTai".XS<*p+:P;X8#nT^&;Eg`?&n?\r%<`K&>@f@-Pj1K=d"kCT\=frNLGe`bA&G*@BO%Di(4iI7M`5Xnp?Onl@$aHF\@g_A.d-\cbMgujXIWRYh@uM%C@IYtE5[E:Y2/iel\r%N@Dpu6\&nmSghbGRW6g>6Fg_."13>cf?BTu$d05pFj89sT=]lGh_hb(%3.OLr2uI`Ic9Q8k',(i*N?\F6,",o@%rYif.7%<1<n]C\r%N4Y]AH\hK%LlK$0YD8L[Kc$C8!_6d;+\&(@G7QEXAJSIc7OuB\#W(1aABQZF$Sf6e\U0/.>DS]TQr%@[U;g)FoUB?#%f:A#LQbu7\r%2.k[cS#7H);rQnA7%Tn8\,k]Mh/bX`=e:?8QRH6o3,bal'=F9phU@Q!Ns'F\_-=^6<<Rg[&)P1!2t1o&+0^'//6"n/_1K7Tl'#;j\r%%_Og&eL5@\ru62!\\"2WMUY?oD^L4:-"Am=pG`$]n1O3clIi[+e8$nZ_22Ki8;Mn,-L4)=[*0;98;Mot?BS"ATZnFoCRBp6KD)#X\r%>%V@R))@KCqanu?j(FjuQF-e,"KdUu3]B-(n$J?F[n8AdY'VY!,<63:OR<As%W:2'ESe[grHoc4G?qAH(#F<"J!bFgT>-p#U`E?%\r%GR,n4['YHF3!;GN$o<;9dY#Z$K'B<"79,cqp9A@2/C7Z__6HO4@HOqV*j-kOGg#L@;uI7VR:0qu^T7olGU!Si]*5PM3p@M._%_bq\r%\dC5oToMYH&>IKl9hUh^C[g#AJK\A$iO4UAb%sL>]bCfWHM!j2J.Om>Y<UTYX.9=Y,tJ"I@U0k?A&1dB!66QOa+AK[SH)!$mo(^D\r%ll?5oU[DM770O5,CGA*T@:R"%?UT,"jneUqkA2G+l@#7jcfsOp+fi$/Bus5TKstdlX0p;YN2Ko2A@30umT@W>]Y"&geQTuXK"5-E\r%Z!(oJI4U)@5$Qe.i8>jB?-&'jH@h38)AmnH/Ek-Dl_b`M7mhj,g0FNcO$A#%IuH,YkWV!Hj(!Y#Q'Cengb^a"Vb/!P;cM'CRG[dA\r%#;+T3HQgGMb^C=ClI!4R_*:-Ga=2sU/UZ1&nDoph[J5"Q?7EuR_E9a/rtZi2^(@[h&TWjbcf.polGZ<6a"W!:^(KM\)b0;=.#]j@\r%NFF;"ksh&\"uDl*ZAgQ!%;)JTA/esK3u-%i"@a7&>oCcjo@RI'(R&cjH#,0)H;LINjuFLL>=N"RH#,0Z_F.dbH#,0'NPl+ofO3pU\r%6t(aoCbRXU,MNLq82#&9>.,"Y9?\B(fSg23BTIsi@;>tXcTa_+J1]G8k5+"[P)%q$\UPV^oU?B9;hql7WPXLq_^WLO<s*)^\p9VN\r%qlC^Z1ZRqQRZHAWHl3Fpiu)!7+[n6SbX4.jJcf8^#gs0DJeP0`@DF$kSje'KG*[^EcHgT6<.:i/5LUXdO[Vtt#0TY:KhX3)b=b^g\r%lhaD*e'$).g2u_DLmhY7b@bX:U%9ICH8/N.n6KkZladbHoO>&;i0d9O<S1#!#0SNs/=bJco#\cERpP;GV(4orjb6a>U8A_;j6g9M\r%?NM?k^6Y+[$Cb?1EZ?pAT]sF'Gpsr7(NU/tr[qZW(IQ;F87ga:]`Kdhg)1HE"ALNRb7!G_D92VH4Bd46cAhg2]:?F:2EUSLN`LnL\r%`/W<WCIW9I'h?TE#$RUa'=uM_g%hTJJfAL?McOhs0]2=?mABcoimupr&$H^[7k]qT/,USFG_G*/<8^@8J"m0>ERjpUL.IYq]'($!\r%?\MB2h,@RTGNWHd#&##lX'fl$;-[\I]@)=n7s#cTRM`!PH._:5PdZ(8ZZV/=X!OQ6YPNQcGt+:el'eYrZsb+6_V`Mjr,oK\]@MC$\r%B@Po4I,(uG^hXHNJ*![n0Pc`:Qn7GGIEG[5_>h<kqh\)G>T?>*dbK($g/^rVCZp%nAT):J@,I+QOiE<TB6?<EP+-@WcR)Cq^Z1up\r%qfk)1(hUf]&#Vqu%6jhqQl19!c_$/-3dt.4B,j_#OO(JU&MLYWI>5B[Nd)FW9B)&"`"=XuK#ft5-#plHbO/JmUc]%5K0DY/&kBUY\r%?+=:e.Q$.]W4kW*&kBTb5NXc_`Ace!]QmH$/YAoS8L%R:]h]^?OuVG)pO4N<+kMNO!7b?&L_j=<5!rX"7_BXc3_#98G/%-mTuE*F\r%1trm9KGK3a6LRNDTuA.\nF&,Mdu*I<\O]O</0#:BPR#ViOf9+#Z_2)m_tF@onj"Zr3aSD;4=MB6iCc);ZXWS>&`mGG(2q_)_`:`\\r%B,*#I8*?Fj]D-0j]TK9L&!(d'\G(8F*f]aQ\!^iDS=P[WWOlN!OuR4<l76e5Pu??BdPQ"]CLcLRo)r<MKC7YZF_lNU+;RX<)shEC\r%E[uc;cQfcd]Q)X%$b"92.p5\^9q8tjGZIHbqN-KCb@*V#;9aoq6YJWQ6Ps_[o/Ap''QME;N;%RXnO)*ZQ0^g0Tbk\:#NP6*Y#BbD\r%mdX?h[]0NQf18af)#$is,XL3'k/Fd[cmSj!!1r?$K^m%dE?ELP;DIUV&9iB9"Cg/?+moPab^%LenViEf\s*%)m(l/ABCrtW'f?Ud\r%UBf'M[)NC@N#jsRU.0`IoY;>1nO5JgL'P\*l8\o.UIWO2msWm-%MtZ*?^"=qK4jhl)7_M[m!)"GF`,VGA`FXk@Lf`ojPq+@E5qFt\r%1F&L=n\F5m.QYY71@^;E3$V\M&`=O0#_ul6`g-OP4K'?)%\E3/5P!]\jSrmXE[X&FfY!S>mo9F\d;sHBR#pn.N#jr'>fdT9)*Mq.\r%S@=`DBCs+c'f?UdUZZm3"%#2Cd0"#LpO3g$7Sb#P\Ak9%K%P'6aBD)aBCn0-G_T9`Srl#>.>2=jS\*V9/tP;F>\g;PBVbG[aBZiX\r%5U4OGTs^`X#rL*.RBbB,((g!fOU3kmr0^V2o1u#rleTcVMXJnY8#d\hOhmk].j[ZW:;iuM[[>b!RPdm[JmtOfFSJZB:9V13o=KBl\r%["]/]0f$7\@isCgdj9HRa!']h@9IS@X#D3M3$b;nGSqVX-(j:>l!U&56dsEt*P<mI"_uugXc_u_f5u+'LKhqJBKE`!ZT@FU2'#uM\r%NP/Cj9h/9,B[nJ!e'So$%oJ*de'SmN4CMV0&a[u'\9-SUQj0XU>PZirA)WJ+9lLG$hb+r98JArnYMSEml.ooS](A/3.]KKUDPF'j\r%l.VA_8]F8D8\Z*+oX)!6SXG9P`YuPGCAFm1T7*b2nTi$,ABG/S&O"1PN"8$$lCrZ2]N'<hqn8%#k(:+LPsm:tdck3kD_bNg@=/o;\r%(`(8L#ic#2UGGb26l7$@RI#:GSWjX7j!,]$XZ.C_<6Bt%ir^!&+Q]BqF7k"3)D8^@LEq5*3JorAMP@00r"4&$q#/()XS?oQG-!Zg\r%<D`GZUoo=9.'Kr9f2Y<&MGICFlRMg<_WN!qikDsg8C2LEYoY]d'lJO+o8Gp6BK%Q-F;7P:LT,4SdT);IXIlfh?9fYFpPLGlJ#j/5\r%([-[%,H4"jo261phVXQR\4?:O)fd#,ia,L8rK-N)He^3/5$#[<k`B<c.\C&diZ?Dj94_7hf%if*%WaLLaN6D1%;D_p<j)q^clpLP\r%#"=`d)EMC`[$_tGXbI<g$k6`$Nb[d>`R)EfiM_M),C:]_Djm^)_>-^OQl0j6j='&`b@L&/HS8%?<Tm]p^CiYjb-:hS=CP/V*fa!/\r%\<70#cms`J3ObG:n'O4e=`#ZK0B%rTdg=i!,-BGgfN+A__UJoE@Ttin8eKcXTZ*_dm-Sl^TQn8:%1Qsro2t>T;EPYJkbB!6""b@N\r%J8'Kh^E#m$dFJMZb*G_S#;0pMdEX%An&bp!M0:N!nG%BpM)uk(p)\lMV3-`Z@\::$**1H'QP/MMqc&9&nLP^`2*)jTgd,HE4K&2-\r%H2Lf/Y_.Sr/[USXn'.94_:eAOF8N@)?,UuKdc0N]CNo8r'Lun89;1s/YIE2G]m)+,pq.Q8knZHmn\_EHfPGS>*O<c$/.o@0"ddi0\r%Q-ns-Z-7bJ<ATjF1<[08%+0TT_X.HhIJZ!"3r>&!s5.ii?:o;4SV-ZKpmE':M8FBhUj3GoH8k)'VR>ruFj>.,O=hVDN?jbPM'Tr3\r%+t]$mAHkNK'CA>bUABQV]se>54jdjh_Z!Z5K26_dW2P=?7/0SO0AEkA/A1`5!>lhrb00VUdofgm>MMf=0[k[%'enYiADEXcG%up=\r%ojG$d7"C=,U<os[63'qX;4'q&3s2P7WWuj17Pd[V]dm$J^oS@i_plZ%lBP"AV7590ehU<Y#'5,<1,NG]T?I3fVpa@9o[(7:]@-,0\r%Z&>V8^AR8m^@H8b><g_&_g3D/:\4J9.0i[ggDFc_+$BcQ#qG3e?5's%7hBE"/X7>Km6[:,DXG^(?9,`6n?0WA)nhuQ')Km8F!=fr\r%B%)E$IQ`$VT$-MKf1jZVZ60TbB?UD@fr9@Hm@aS!`%hYa!E7<.=:\c;LHaJ6/Q8;``ue;E3V1WS_V/B2Tkhl(E4GV=4@YGTe78'*\r%UuUE=*uXD'L3gX!s$BlWT&^\8IBhW/h&@`bkf#Si,!eB=1YE<)+VF!JkEI<t*YP.fkaCdmp$b--r(mpC6]MTf%:f_K_A$Y(BHRQ0\r%_erppDf4]mHJis,cK8_fW!?!*n2<5s6Tl-K^U]aSl@C=;31HE5TcR647;cAW',F!n-&T4*a4);Ri.^0B,cCslN/5LXK:j8N#`0ZV\r%kV9JQSZGoPOjFbYW/"kY8NK#^?4L+`QjDo4p<O*16&)o-`Rggie0FNZ@B<G$lT'R,TLU%QdDQ2Onds[!&]=i9ndsA+&]=i9@6sNk\r%39,U!TH8%u$UZ'=TcP2r63-:Ze)mLH"[-9[fHKe$H:6GN-]t!6T0K];n\]ZDKR/Th"pe<AM,4_YP%YC:8Pfrm/j<AJM,4_)n,$NV\r%,XOZPY4TPV8;)9hH-ur`+VF!J;U.g8%uF*noSNBP4a`nD?e>5LQF"2h_;G[Rd1#2l_r(l9Do"7kLVZEe[l/[%/QVNof$TGU)XIZ0\r%8:/NTG;'n>rq9CjVn;),Do$Yf(gOQg$mZY*i!Qd!>f/h8]uA.'Ud4#Zln'>Wn8e$om4GF7fF9I5]li_cgp!ZJfF0AsHcu;UHL*4:\r%=!>B;qI:1+@I1,$PA#EHFK`YFhp#tU1$BDhPkr-f^T\S\+mgk+=3=6#P3ab%'p*$HKs\<s(J\p;SDftfHj3YCHY]p>Rqcnfln(1%\r%%0h1&U,K7o>Z?&c2uAglUD<:;o7@Zs$ZA%m5m[gq#7E-hZQl,>nPa,ame8M+q]m*H60EpP0[jBj!PNHtB9?AbWA+*L"%naF2fJjS\r%l[0JHUejQ,[P7T`mu8)pUtW3;NgBYbe%$g4rdVC2PNT7R>*t`42cBZl$ZkKIq6c-0([,2N+,igHdEjmX\N!<KQF<rcg$cIhqf;)6\r%MuId8&&[W-V<RH>ehI-6e[jF;n+R;Qo;DObXEW>90!,Z3s(j9^s4L]J3+T6g%KtYs4(OEnSH.PcaEGX4Y:gH70C4cLWWTU^>T,L"\r%p5?3MMj8P``KCuhEBck+Qj:e^#1Tm&o6:='=t"BB*XIJFQoZaudb2+V)6YV4Q-L+hX-CX8gi74\+nrW)^A!9?b-3k]kd6D0QV?oI\r%o)G>^Oh5s+.iY(C0q;*gCI_Vbk489k.iC-U7NsH&1ToePS39s11;#AS/fD!Zp/.-7.I)/O'4o:Q+,<7%aV]16>HsF*?>%^Qf6HF`\r%Pf<JPm2+NieBekBYErHfW4Hbj%tCO1.f@1qUhLUkl:EY/i;OP?J#9*:gnSBuAef_$8;J!S<.nN66*(P*d#3uoN'[..&nWWq]qV$3\r%,h4!\UbJ@J[>-5Z8JQ_0H>p!On<`4dTB.A_`].*?Xf12Jc5b=r@N9E?FQAB6/lqY'iU^G.!86@nShL<+Gegm6*g%:pF@S*W+uJ2;\r%?Qrd$)]PO5_Sr6>K]:McV<(BG*7E)aN@GDESiEk6bhI,l(*FF+At6Gc'<4?k+qmlhhMa8#4Y2P?5;R1=(/M?amIk3kG;NuD\a@cn\r%6?ff2b&37eF[lOf7W*R[e#,4K,b/Y!M<^+sm1`R/\g(oNQl)!emQfMY`8]*]H!B$_=6&l*UHP?n1W^rm*kg\+Os[c8%GjOPp?;#M\r%jCsZ%F[s?_0=O*umZ*#<CYL0VaV&b,=k>``l.Zgdcg\4bn3[9H(#`^?$NP\C^.fg@7kb7U+ifQ%G7qf\EW7S::p([kf#c;`8?cti\r%HP8_@S$AE%YiZH\D8p>1nasPL2rcRs54l4Mf8T$desdp@%X+tl:Rb5+\:a.sdITD0fWnJk;OSJY=+*h*::;%<?S'N^n0HV*NIjgI\r%]r/*)j6nUim'4D0C]6'/\b6S`]N2bs4Y4/fmq(n_I&!iUeC+%9/&McUighTDbVA`%8Kl+^/R;\#iZ.;dIhE5H>gGT>?Obp_djK)Z\r%Cu&[r*YgdhUZsJ<6]T1ACGajYp)1@%OZAX@^TPEkP)-]mCgDb`8k4).#uD\TYtRetUWY/?EJ8V>_T46td:3nmf(9WZ]]'Q*n:'>Z\r%="_VtX132Y13(Dd/od_d+lsH*\3dci=^GAsPXAVek$?(RYMAUQ-?8.ko[44-+g8DoQ(-.g\U\AaMG%36T4?+9l=m-9n!^dccnp%0\r%L/.^qqSboLPR$Cg)-KH6%Z,k?,@+Q"'jieu9M];LkcCQW5&l%9LPl<fOEHdAo.H!m:aBTml/E&PPH"+F%a"ltE&5\<D=m.k.U$#f\r%c-,W`V3[&phNdMlYsG:K1rdT'JB%1Or'9K_fOTVdd4aW.HH>5o5i:nt=%sVLg*<i[$GQEI%\C_ZnQ6)@5!4n<blZ=0]j?98o9^fd\r%7q#eVY+-b`a>U9H%(qAZ+e.YG<YnV4I0FU)`N$Z;bP/DB@fNTQ\c),!l4m@G;Pf)cDfk^5T=qGpYjqEn]%j942V)YBai_s.h.O-a\r%DV\?BDO^MP!q_*qctF[J6U3lGO<8(M3C!.g/'s+/qr+1i>.UJp=]H?%C+`eW)&u'gdu-MW@Ib\9l%K5!735H`k?fQ0Y:X3&R/99j\r%&Ja\&"+0+qij[qpc$a_!@4qn#Z.lH,GQiNb#9uqQai"o=9nnYVK8_PoC*C!HN":%!1Jg7tT;!F=hA9FXhCnHHotK,[qHp%llVmHW\r%*+2Z"UAModY$XStJOQ]3>LflsO?7/fT@-nA:]B-UM[19.0.FIUXpCCEILM$^D;LG0UuDF,UXb&\FM0?d=]$K>l[=a*7?r\3pBB0$\r%01J7Zn,$9o&SeRFoI5!QHEVY!cF)c/8E\S426a]&N!DCA&cFmN`n6'6.RXp,J'cp?Ao"T+/u;/]]q);jd#$s=T]7$jJj5rAhbb<*\r%T$+*%!tLJ6p(rj/^.)K#)P;U@=TSKaaZ&$5)t3IIi?7W=Tf%hoMgFCATp**83RNEUY`=1]mH*.%lu,%rZIuF38ihH86+V"94c/o:\r%\WuLP/o?b'k_Q%p)7^.7,[3GRbI@/&\%+E@^(p5/VtCf'Ed`?^eO]UKo<#PLoX*AU(?#]'@]rf7^[=3QQt(cTcTB7g5KAN8qqRBO\r%r,Z[La,2RmG!P'Fo2G-eVjEa&cVMAIhh@PPcVMA9)qcFNKK(FU0O;lF_<8jl!'?a<K?m?0LE7sP%R**(`8HaHEU`cY+Wbr^!%-e&\r%XlPBH0fk'a3;ECcI"Co4#6d>j?&j@7Z!p&>:J5DhOE6=Bl$,M)I5*HMLd)&m]QXr>-3WbZ&1Dg!9F+OD/e1)A=EhN(A7Irj#a:+R\r%FbY_X&LA*-KaCGoW03"OIUtp7&5]Q-,nk.]bX`:6P>&@0WJa(V)(*:j'b-d/A?a@066e@U8>P1=VkrI&$5*La4!U78I!uF:W@YP=\r%q#%:_U@NBpq->esP@*7(5nn]V/r>XAcgR<RIc9DHo=JTgQc.(`kBG1$6c.$_kBG1&#pD'/1RoN)*;n33pUL6Dh!X:dGFR:Sl3[`H\r%W4D9n=8R#dHG,aF3\1u#eV!\Cfh-F@_'5l,ddWu<R]2kNGO+]:kYKHE;B7SUYt_#(>#CiEd+B5)/;+eAK2u(]TnVg*'bu/YoVEQY\r%Q2!AmT9AF`8+J[nT+]@N7.iR6YDZa^FE3'dF^kuhq!<p(\hT"Dn6Z;kh&%Wt@(/Y1e1F58*hE9c-6L8=.B%k=]^1&#4qHFK!6K$6\r%*%:[%\<ESW+-`H\)nH4tXVlYPB?eY\qR1#EG%[:?'sdF+-Y>F"*,I'%lm@MtkqQ9IMYN:)?])2qg\"]#3FF]cWhb/\^/.ZoQ5":<\r%'H"H$dL5h4cIW"bLE0Sf!T*&M;c:D2;4skX,;#Y>=dS`6D`Ll!0s'_oMLt@^5=8".IB`N*`c:>c(s**VM60d4c%U?<-!UDSVejT%\r%pXu#DHk^(>rsE*k`EdVs3_$h+2(]?qUG-'H+p$-=o9FjbDs5<,r3Cg&[/RBKa.*m?pb4b*I['gt&l5Qg+Y([-,(k7)G<oli-;fjU\r%8.'E+^H=J[eh>W.GC0Yi4C``"*VEBK]*A"kE,@/hj-Q*4&Klt*)G$*;CppLC';HHmcH+:p6:rgZASg[AHsWTuj4rJ@`L^^Y&&%_4\r%(u4_Am?pb!5#`<1S%5gONo"O05&pV(M4Gb]C3I*_p?!ZT%E18,SXt7'fX3K+;Ao+4,,gds4qdBB7s)/Hjui=(6m6iM>"e=T2"L27\r%E5fdoo00LaY<U$<19DiB++^]f!i]DDr6okaP%s4R=oI=s4]'OU<p`%G72=MKKQFk')p("1__@L1T>Z)cFoAUlYQ^"HANb=.Bq\&c\r%*d3GWd7(]2cu*I0F@u.`kK3-Q*cS817jJUV],W>G^RY&inb'#IhTPAjUR+?MX7n)^2/VjPf$JbDB`&9!Pg)(K4mmdY*m3U`a]?nF\r%6eRt+mj(T40-j[t-"<$OS1?%UA/fgL]\i$,G8mOI,D0tEggd^C4modKWRB5[A\4jI%XXfqeVikAe_NFG'1MrtA[?U-bb*qX:m7]F\r%H9AIsb1W9EHB(0k!6rJ[[>EV5AGk:#fk3t8piaibr[q[91A3>id5#5"Ze^$gMkgW7n=H&B1.4BppWOUSIFj6hmIj)d:i3g'BT*j)\r%>f*J=Ji0&3B:kF`5gM1"C)CZAO'bZpmuNmOWH1;W;[js+nY)o02I7eg%nBui[i/kKq"XLrYTMJqkS<a,4@,%EKDR]m6?<5X9bY1m\r%Ho%`GBC+:&o2`e7DoQTWS/8_7oV?<;4nm*jcKEO9/'R7*(uK0SQ%*'/d7`[jNdnc\1X,<o/@sBudr^'>&HH'qOoRJj#SPmY^:QB@\r%IuGVC:X/#D_C&CUKKW]qM)V!O&b[nC)^W@H'`3cC:McQnOHoFiq4.cO&hNeO(\N^F#B8YKE^,1WqM37?pU4Au&?#RW%/l]W"tLPh\r%rcJY\:?2AlM>o_%!aot&#(H\@E7X7>eD#bfkZsU;=&-m<%pj;VlQlp)>]IQ8)gX$.p[j4j,h?bp?rPsnqpC!jn"kS2N2;s)C>\lD\r%Nn^a]]t)GUHMh7MV#<9**NgQK8dDul#DqUdN8N(3g0kcq+(soDDu!%C^lUiB[rQTC2")tD0""7qq="4^lOc_/6_B`CL&)?Vilg#6\r%8u"Hqhcepn!%RUphi?#@n48(YE>!ndJG0Zh?e%?gC``cS<a*3p=5"L`fXk74A$c1lW'BZ\d:;84`fX&?b#R*8Zeb^_CQZ,9e@CX@\r%dc9@h-Yt21[)=rJ%<"rkf=!D;6;L8GJRn,:9_?,iL,Ts;_o2GZ0rM"Y0CE#u^M5^`Q/poL5TQraqm4ec8(t5Uo,@LZak\/tnA?/A\r%;6`ac"&&CUH^6[-Ed,2n7%a"Q?2MHRkXmpREaV'-FKQKuHI`54p\AF.)p^quO;b1udSrS&U8`Hj7+9<0i-"5SY5dhOpGu':[*ik/\r%Roj92rIo]eT"YSL26h#j\(PUSJ[5'YKt_q\fU]`L)u>PY5[hp0i#,i-aU3?s6BRM6T][eX'jpP-hl6Ar[u&fW&SP?'Oqi(uLsE_f\r%AAuk/4]_Ye"nlKGZZ!.$Su])"AUTaWmN9q+=[CA6)#KW9abi2d2]?`Q!m5NBINdrF>DkpL.I'Vn7oLjoFeccQ\44Z7UWl=Z72`a>\r%=dUd0NOVm9RRW@F;H3WP3b/%_"I5^af(-m37B%.;BpGDpDSt0`SDAqNgR>>%jtYV`"X!lYc1BU:C*[tla(uDsF?<3Q"`<aKgHitk\r%N_%e@1PZpkat+sORTUf?q)N"Y7=];^*lON2An_05RV/c5iV3Vci:Mqs^2BBZac/D`R/3Y.?H-?R?i4^ViHSqD`m!!QUQbsagOQHV\r%N/ehKYD_&UPJ^2qRA*E-e#HbYTBPZ\[>C%b:!n6Slnf/u6t2o?,jM$IQ/$L\K=eFW>O?ei#WJ43Fg?ZlE;CQanJ2e1"K0LqT:\,k\r%0qh0XqA_KY8f<iNoJpkHTdi/2:7hWD7"gLjE;CP6T!OM4#u7)p7r(aHPMl)s4A6)P+RqPq&)WZC-([Wb_(Jsq'$hflXLhAL&tC"]\r%L]&qFPMl)fa4l^pFqU>5$6%fUD\Ci7*'7"De2_J8nVL%ndp57]?6lR50"Pb1F_?0%Y(dim8#grm1A\p7X#n_9D>9C!YsT^6h2taQ\r%TkAV\+Nj21a]3O1D$Tkk\a%I9^W9E!,]*cJ]eUqNl.-t\_ap0uO44hUoESfA.:X!\4pV&lq8j6r_<H%!K)B.p')XCIq(Fu.Z[VeP\r%>"tX'Q$S@(lR<@t3!9k^/%5ebnVQ>dAh"XSbQUChCFg/4R1"i;m&ZgmhtVW2`7+OgBD`-(Q`?buF[+.n@(PV8Y4d:!s&?Njhg>RN\r%iN1nlc7J%`o4\s(Y-VTPe,$U1Ci^i#4MLKQ$3(sdhUg'?62JCF61,I_Ei$9G.Lu<WXj.6ua=Q`/b2r'6f4EXfQJ%c\/`6d"ip68S\r%]R/EuK%]G;6L%K6hRk<#Q;:H:0';_-I=+-6TI]i=W`dpP1jYn^8PDQ2DN"%L)#=P'(J!jdV,F`2U[_*_ccOjj2"`Fbb1Lb`\1:hc\r%9YpL8G*ca63VP-CCp]9N)H'/8NRgWQWZ_\jF?VIU#`,$HYXJK(Pp<J+\!"#iH@4f[2Q\la2bQ_TqWdj!]'s?W8iZ/LaAXj+MRO)a\r%a"&8@9]#Wn0>#O<e?piI^fXH$NYlgH(^#+=e;/*dIO,@aQRE3#k2HZ)9E")-Ca6r)"3*sc&S&1af#i<BHF!^hi"9u$Y+']@d4a@V\r%"h7pXp*lkZpS7=T^0UZEC#2D<:KkIQ5M34/-M/8c2e'up@/Nq#(h_cZ*AeB.bd"4qd$'mhY24RW%Ab=qg#i'3iQ05eV<\Q(]HVXo\r%H+As<SXk%J'qMIpd6F`#Sh!6c/7'0(j.##I&qcgq82boG/Q7DM@]MSP1.6`Un2c=?g)D>d/p=l8F*!7aHOAoSAfc\On-c5n[uoNa\r%AsOj_B7WPu*REYIPD7E/oui!<<HQli*ps,!R]"_*+6@A@k1hl$:Y0q&D4'Q([DC]e"+Alf)u7MQmM]g3CqL-'AbaJnoZVF6jU@dW\r%Nh0Z$fl-Z03p5jXT]B`)>[sA'gIZk9GHa&;+"1=1:`D]!Y!13)/<cW1O(EM")dIfaSpgTp7Sl*nTG&n5SjlO:IA"C?V)<kIklYM[\r%O,5^>\9`B+NM(<\B3_DT66iG!5#C%&6>6Rfdg'V$gA0mdq"d7,$5a,;bZ.&@A?>s6B\<2I5Nhm=5#Ak&-J7GjhZmoWPPlFdjcH!!\r%oSeGG3T7Sjg^"f%eC[DPN\IDFmTW.#<!:KHUekS!Oe_e">,X.k%0iph6DuWq>D1OOUekQ&%Q<%6il&M`)et>6/7X/\6E"nf<`sl%\r%bNO54&8I/Rf!0O\$u1`<%5ZfP*Rr`X+,^\FN3+XEAVq1:N1Z1s3/ePdN3+WWC8`kqZ=(p!.FaaO=NQ:9@k.qW&YCgTX^,33Q;[sE\r%n,6pU*KDUGh#&J7q4damMCQ[BU/uo?B<kk^W'ip`m>s^ca<jt)i<>X!'rWiu6S&>)=9ZjBP/::O:>RW)=%oPB:j?.N.^7]Vq.#P)\r%FQ%Y80NJuk'e%MOIV#/bX$Cs-3PnjK_V$#9/d<no"KOd&RCEi99`oI?dVpGFX&5X#8eQ$[pENa=L,H!8S`lSm'#oq+_FBK4)!Q97\r%cT*l7ajd"/nL@AUX=+m&KWb^s4u!@!/>*>,`,8A,.SqRCARH6$IZ'?35^fXt:I"WT5Y\,(BG)t&'dubNF&[@<X9&RN(%$ftW^)-0\r%ku.d9YmT"O`HXng\-BaqHU#^[(hXR3SkBDH!ld(tk"pGQ,@K@/YXIMGKk3&dPbcX?iD3[_[,0\sAQnr!U2nq#+\afO_,>,,#iOAo\r%>"B;9Hnc*M/Yn58[E<f3[)'JS%AVX&>T2G':Y6Qb@cIa7e''g9pMaEU#*2H(PP2ZqIp0C4):hRSgNkf"P4D<tib,P-X[c]$&\[q@\r%]](oQGZi1iMr1kbBgn!Y!%6#MXf/1YCn=iRjmKihMHjY"^,cb-`a*5G8'0/$SGcrd/#A>"N`F-99$,CPCOO46,VP/78]1Q,KU:g]\r%-,Pe`5Gg!eTgc-*,(->I%$=!1"LgWH$=.0:ZnY15/E/%9KN8euq1i"!;Hcr]6<OUoq(a.PMCPM=L#*RFm[K/9'RD-aPL(r1MF*@T\r%)Jpg%/'@jpOKBr':)%r58K0eb^#BnXRS9h3oW-_@STVE9>fL@\\?CP5MS_j8LX$T"0ZU[FAcJ+#.T?6q8B(fYq6kHFL^j"MiU6gS\r%be\hkE;F&9,Pm!PI'=Ue')GZ-/eV^F,460\"*6/p1,I60!p3leAak?b!co@L0rQk$SL\;P2We0NJ2ns\*#H(7Z-;%hNK*%MW<#:=\r%#6U:0<#-Zc%L+HhS:*[W#6U8:LoVYrdh7"!@UP3q0UBWG.ttbY4FI.t?k*AlLD#\('iAB4TuQuO!alKB/;GDZk$YuF^baXMjuCiE\r%8(tm3M@/KR^iI6E;@q'gJE;Ti-dde4nEig>#BQF*6Pj/7.gY9Fa>,e=$^i<%*]`7-*(iQE:&'1QLP`BM^eAnXK/jdSN$a$J"O+[n\r%q>kbp+IId)bD;a"U0nIc/0e?7MLmi*9Jk'`l=_.%&Lpsf]?O!M@tg>h87e1cY&p4#FP6<0g@`K<OhE^a1nrUG`TsIUhUdA]4j[k)\r%PJuc+qShu+9cFl%,HQ;UnO#uak,38sN^u2PDD\"T)XfQlXaI2$/(!N#oK]1f\Itf]ci]8P1.;88K-"\/er:)!#Q<?<-0L&[F%@Y@\r%f<2UYl1X>#CosLDdHrmQD]ZL'\I1@iW?S(kUMJ*5gS`!Rp@0_AO3:.pEO]9O*nT%=i,Q=&4YAf\(5BrI9&r8+(BGk<2Zu+l]'b]:\r%*&_Z*h2-.oN.o?HW,,-;mfgW7[YK!GGUA30aAL(!I"R;mT3+odEH[XcDn/Ht]M&gd"gg%iHKJXVYhE=68Ha[HH^Ni+Ej48%M@bu(\r%e_Up76a<^J'ifq/_5[_\Sb4a'NB[%OUcZFL3EYZ#FH$UW@C)M'L!SZaBlCQNI4ciO/0b'Ee%PjJnn:2"hH1n+p>0RYMQ])bY!ea+\r%>iI6:hWED\n_UM.f#ZnDT[hhfVUps8Q'%VZ4l2Hn48P.HdP$=c4euDn1R!EedEAYXYIaS`[p!>7Y)MBAH][uX7.9F#XkLtSmsT;b\r%hWb#k>G%T>=\HGM\sVLiSTfdYG?Iaf?ge?(`aqHtm;kJ=s,:SZ-Q8XhpHMU>`<?(1)sap2+taa#pC"?giDq[q"u3^+;H+6f`N$.)\r%=tFcJ(gUPf1V?\H<B1c=&]2gnG`>-g=?G_V.6pPeAuC!j]*41Fa)d?RWBG,#.Ar)B.R2ic'tj]m[i?&bmR8!aWX`9?n'+IBJ&Y;j\r%S(5j]TQT+YJKCk;olB;6mao;<B>&KED5;@%6SEG+S@^nRe[;a>eLQ$Fg,>@IA&EZ`cELF[.;7"UWS1VS\Slok37"ermWKWm^1)i9\r%9^\KqT:F"-0fkoQ3;_chaib8GC;-r3)EC>'h,h;Y9'B$FLZcOu62UJ#G##Z<)Jo$Zb7A6Y2Vui\ND5fS!\<_0pke/46ssLYrFet7\r%JfNFWZ'I<RM10J<D`*#'DCW2^YOAbfNY%eJ1a\"P2g$o:=G\#BD&Jea_&C:Frg3+J%ZAEUK+BgSYiZ`7=q!.oh_/G*Md]2[84ln0\r%f:1uJM:Qq3Se_a,,?2U8('>Uogb2-I+%epC>'h'Ln3`$m6F-d2/$p5Vc#8I&6P^#'6Q>B/UIXI>dgPu=;,lL_0_)d'Kg,EkB=2iU\r%%nh\iS.GJciS5::1)#@RKFf&upYT_K,(tsHef'BuBMR4E^"CnBp1[\\UBbA:kTLc-kcNXh#,AX.#78e'4P\5tHpf.b&Ug6`b=L$?\r%\s"DXXYoa]Ii$IU\]N?e(g)S<,XeudJ:WD&6:/U^'da]j57,_$kC+[Ed[h'rkEU[QkbH*&/4:Nl@P3u"Bl!kY@=Zu%i)iE/`._1m\r%gb1iY>S+WJ$P.79&MCFgMKXd`T<OuQRa"/5!H4?Pis[J,+7R;3H1ksVgnmOHNQM%U4+>q"_nrM#`CFHmEPP=f-l`I&N5O;W%*_;,\r%e&fScjr?K:(7pT.3n'q(Cik^/X9aP%YEYu_QOF9cUn@lc0*]T-I2>c0$fBP16hO_@R2JGD'bA\d%)KfAne/V0gKI(KDJQqlYCSCA\r%cV/LNLUn<])+it1s,W95=W!AZ33ctU>M^?Vm\KZa9)lWA/"?(K@J8%m^6X4lhI[e4%\I%d1qJdof<h$86H6]nZ1j(a]l^\3]UrUc\r%LX=b\GM5Z^>G[^-0&sjh7ZWbnnZ#$k=o$FA+E(sTmld/'3fXdF0."nc)82aloF!(ZG/$krh7Xg%o_.6XMZ5CEMU0W$pVhS_\e_[M\r%L$[ju6;tMqd.2,jXl`[-g1e]`j]FG)LuWC7]SiO%k^h:39#"@Zlu12nNEj03bf?cbl`<rNSF1?M%FKm<W[BUKI=gS^:r_@tFu=EI\r%W295`HKbC]g7\7Nkpjo>[)!Q*W"lsslnUKRc,VJubMZj'L\:>\>&L`H3:f]ZRKk&X$6<^1"*4BaAn=lrh8Rakh1$?mTD#R]a27A+\r%[E7_CB>QU8_UDM#XCT9U22q]*EQ*6C_)=VK98mM/+=M01s#*>>>NURVGlIQ8U%!7!0_%>DXOacP`Ed9V=7$2)GKIanJN?oLC"uV\\r%IWh)omC^G&!N0#;+\;LHCb7B!h8-u-EI4\S0FpD=J3M6^T#G6dZ@9%u>KsW0f*ae&>g'n+a&2)4Q!p3+CbglmS-sMBAb7P&a13<]\r%+JWS;50a=MA/RPRoPlMT]L4m-"m8<DcSALY'g[]"kZOdDF"+,ZSn7aXQdmN)kr>#nFVERj(OD*5kujmEF4n55p,L[M]DW5H[L5Tc\r%I=o=@RWZ-/7cP*T=PVp^HE5>I<()0^,5T6PJ>IU[Ld7KmV';cTPsLSIK(Gon4Coa;G6KA+AE^0\aG'5a/gJaq;g4@'QZ!+QB\c*T\r%?'^fk>'I6IF2kj#WG(n81m%:jbc19gX.I:dOJ]W\WXGjQWOe"`\gD#XOmYi7"o[YbR;_Fdc&9%>K'E]u+lV!X6$K.E:9S6$V@,8c\r%JsKYT98Dq=!U!+n_=W-QiiD.04='W&q.1(T#;hkmAQ0##.%C;>`p=jkphJf5E50c+LU>a=]R'2#6N;=9UF-QqG9N;b84jpi>F&N_\r%+Xq\maY!/OTmb36ZA5O-2Su$u8+r$%H&,])34"CrT<%^]eo9l=H)AdG?#V)"g%0r;rkSJ&pHEf\O?[Z^KLd'ejpf">7jC/6RU!q&\r%2mf-o0]YS#>n$I$QgoM:mo_P\\u'rd(\>nR7)Cb/AN*>:+W("#FEq&UiAi6[B:1s4Kh2skHC!eO?&C,0BA##g<?H$'4YdDK`l3TH\r%K?Q(`G="WS6"[s5:Jb^Za=M:Th*ML!X?l?$c_,H!'eO\,_gK+;Eq(N_E+J`+H<3QDTb-GHj].%F*j!"2.VWd\dZ>sk5&Y5A$+.!+\r%pq3)>id4]0iUabt)F!rod9$hLYKTKI\n>gKogB!b`,Tm*m.Jc9iTA5tCkau89&=GfhfLg@St0aHbf[$W2.Z&&7H<^f;+%_UPL?d"\r%0p?g'REXK8mq)#_(\fZDW@iOp$Q_iMO<9C[L>GP\D4n/Lh,rq&CV+`%hB&joS5OoKCD]irgXnK'^Y\YG3k+GFMt+^Qi?G`d8<n7s\r%M0#H0)#\\\]mRIR/5F+bp293Mbt37b]:,-.g4=Nkp@I2;"7[UN&+LpBYa?J_Yt8!`!XHFGqd]EYFA?Rsnt`aL,hIA\M6C#[]4k<T\r%Ya#BeJ:6h]i?9#cb(;cY+#?QaQ)48F=V@hfj*kD[`f#obr>dCqh%dfLJfZGcb_e&)B5B,m6l/KnIBeGh/f&7)o"%qrOaXHe&m['\\r%K^lqm\o!6T&JrW,b9C@$-+[2DeaUBf8p%>bGO`Q`RP*1_><*Hp5P<Z7/3M#Xe-sO>;QQL1!_YN3@NB"m+^HY#/)<CTlX4a</=<c2\r%]RXP)=Ki=rK-bWO=EbrAQD)6rng_1%lseonXFtIE\ip.++f!dBeYo9mrh]r#V?d-'HB<'C=-ebu8`17GefRNq2UDDJH>pRSD!0R:\r%_u:aMjKdmti'*oC*o-,DB?CP:GnM-]>UO1c13ee(FHrTk.kCB4H?<GhV9@'GLYM\]dXd;@dQp7maK0T3kXUZ`I?g'f=*]fs3Ze'*\r%KHlYF<I5!q>77Z+7B`l*Bm^AtS&0!.UoT#+/1i.2X/k`MU9'HLYHEJ##'OS.UPAu#FVS0';)N@HX#b?(MM)+2a,+O^e&ma8iX3Bn\r%,r=FMi^t*3.uoH8rcoq]NMNT,1G8o513$bQil#.#Vn4:M<Ci2XFROR9#%#N,^Lpt@-K)$@`([ZM,pHk$oSXi(+rE)_J^q_`GssVB\r%h30(ja^A"Tl(6M4U'C(4L4H,to#?)dks)AgVN67;`F8U.lQ<6M=H;X@Yf)KRKp:Qb7u/;(lUf`]A]#gOQp0O\froHV>gRs&=FXQK\r%3OR;D>\DSI75YVM:s(X*';!c'AGV[P#i#'0_";@!R?@B#>41hS/h%s^lQb"D9M"3qr,#a7F(0@Tq"t0_@&<q6qa;;RhRCu-E5'Bg\r%d4]D6Mb(EmFf8PC\XX`d"&C"Q+Zho40BK4jD*2nekEf4NO>^4DkO-NM"\``/<%##g8"jlBd;_9AT>58p6_Q>U5d(JobmWBbW4?#E\r%UgLd"7f5VIi4Vl6P_r1Z&8+(tQ05I;N;1gAjKKZ+^/m3rGt>Arn`71D%[C-C41cQWm*ms>(A-V"$OY_+^RuD0"'2j_p#Pk@431hl\r%^ok(MXV/R'Q_RPc9',EZm!L?"T@PZMp"RqjZa0/-M;tL'OaoQS"+#u1,_ocf6]$TYOMhGa(b46`:3&eDEIbDJbLDRia2&l>pfp)4\r%3"G!3R(JoU_Jr-5c1>ur?rqmo?65]uTVrL^jdb^&@N5XFTa&ag7,l-%XVks*7H'dSpb#HCA&JgjbdNM::)L$?oG3YG^I<0PE9eTW\r%U.C:X""RIhhQN:p<!"D(j>\luX$E.&Ou#mehNcTIU<.\Te.U&\adGa/""tJPo6Zq"7O'1%p9_L$-kTY?*YhA%_rk:D,dn"gb_&BA\r%n>^E#XERJ2M[Z@F/>GUdj.Z>rpkV,/6m#Dl3V1XfXPfWd-%`S_81SrT)pf^&7p*Tc7u?`#*"lc,5"^KR9(F_!e/hp^N-Vmp>$Mq]\r%<??$?UI=<O.1]bQ4%]Wo0qVkuM5*J!XL1%#gintg?chA;,)N'_MAct2c8S>u\h^K48pHRk;144V,`WKdWp_X(`).`BYmN%<&fr>S\r%-QqUV;8T(rE*!sq6jFU_bQb)f-]Qee0/;sDAOO`HHVI&"Yk(Gui=@f9Wrt7eT4&q#Y*+un&=ojYfuXt_X+]n5;9VFaS5M2HP+qd_\r%'1j/i_V%d0=+Y"J#^/c6oL'Nt$!K-4L5@1e9%L/^FF2S**,)W`-/\MjWNMED3J365Vm*'FauN7^gaHiWXdsj>Ti^4^XqKeJJoYd\\r%o0f'O#mn5M%H$ClCR0`-pVq/?ddb-1-VkHLZ;9`HjkP8sISk?]BX50N2"sI3]c!EObhO-dou>u:MU)s0CJ8d:NKe`VpBtd)/^\fA\r%_-oV'9_r3JQIbppYtPNnI5,dQ7b;o:[5G@Pr\H_.\6[AqB%\_Vg[.>"R)eYN>)Qpqb\ah)m#+<K1:Q'lTJb_'r5%F>?S09r`Jul1\r%96k[MHhPd!Z/#:a\Lrf4k;prQ]>uLco)+l`jTQn:C%-.Mb7"%jND6UgQbAmp]\M-0o"SOB$8S\6U4haX=%^2YCcBBfaC'4V7X'q=\r%aQsE)-j:K,5B8_LL40pfgcr@m1FK^W(1`fg6(pB]&S1+;;!AI1";u)3j#;5X"PKB@!hHi6oG<ob(j]WQ/*\Hf41j'@UD:H.E#e%-\r%Rm1fXc.lW*mRk)]`eoCf`P_RA>!7K+'lPJ3jR_tjrQ<0NIPH3hB^+D/h,fMKfB9/o1rf8&:AF)0T9B=ugfBLn/#iePDu?NE5$NB5\r%6LH&frFPmqqsa;L]OhLW+ouPqm\d&5-HjGV#:i?'F_[:ea(UYSa$XL3qhRY0bYoJE[)qqqT!:=pk$+I]NPB>FQ;)OIiiCoM3I=[*\r%l><UQ,=.f'1l-V`eN=6Nia5/4(ZI`V#W.A;hc+[U)(Q2sH$CA5M$=P$e_GNIr,Yj/ZR_i'^BYD7Y.U<1hVV>Yg_Dq[A<<j?&jka9\r%'i6_9)'Qc*/,Z(NenGNLLC;0'2:2An5e<_Q9^;H)h!B&FrcD0Vr8Ga@3Fg(OrhuUVb/J1$=T^(dHpDd[U)asf]*[9ZGc-:Lc>,rC\r%ZaHqR^T-#O?(&9W]o,9f@-#.^9@YPZ!_[IDgO>J0,7cRd)p@`*fQ*#I3u9@O83o/jYb;156`+[g'4\&PJo(3gZ^:9@(qSST7f),f\r%Y?hPflco*7Y'W(0jdk96Im7*(_?<Cc3^H6(8fJd]T8oMpTqXCp`uuD"TIC\k"G[E>)9@t%Y?rj,N/Z8VY:<2k50i7/H`:_j\/OQ+\r%"6A!0AjC,$2*6#]^kM+G%J3r5N*=r,[%@2!HioF#3hC=;P?N@uKSfBge+M5kDDQ^X\XVsT-$%q3>C9R8I*JPWO=e2JF'_u=q+Z0<\r%kF?tGbMG:ihR"ANE/e"a?If;'g>^::k63CojqcjXm8uL$53F$X143UUdu0p6(]Q*sVAFmH2(!k^QsQT]]4]'?Kki8(ie8cHa?s8H\r%8%aB'(g,?>>h+a]Qf,/U`Xslu9&;SfARqqH,S8F\Qbs[I:i.C$?BD])mru<3]H.i9h(Boa&_?FA\Q'tG]\H4N5%VFE,@8%^9=PQe\r%Z\'3HXB_T!>U*Q@N!MEg?@S+M&Y_*3`A?Lb&e:a0D`7:2>T1R=ie>t*iC]lT7_FtiV,8H/#56In0%_5B2MET>ie$Pde<T0ImD8'S\r%,0SaH[KiFl'=YG@_X.ZIp:qCP`9dlKp7R1"g_"g>H]#srgCo>/)64/0(irL:&C/!hN&_KYLDrM>A'@)N8mr97JrRFX5E6F8QF`LA\r%NeD!3c,'Xjbf(KG]ou^KGZTbpAXQ2+jAj^n=Q[&9KdXAT@[Z!-'fn!9QFYd??;*8SZHQl:nlf0Uf>1uVniB?gd<Se__iu7dr9R&A\r%S\F`M]dlOJ;Zl-+=5p7gQ3FXid]%dKhGs$O^..k"E"B/:?:F$_q=jI$oWB_HQ!AR&a1G7!L^2?TVpZd\Y)N"GiEet9?/akKl!?gA\r%>q)f.p5$`#Z5O05oD;Wcl*IeB[VYDi55R7l7^"5BKYI''S4KC$ADOJcBE]$&j;ogq,Hl!.?Wm6[-=gN9TqQ+so's,C$G,4UbD$<X\r%[aQj4`MEY"b3mYp]&,#Uh0Htk2)pP$ZEI@)SSB!6Z]3c2Qu0J8h5m[l=04t5&Q++^0agn<$4_BfGP3@lH9a\=l$0`*f5nlF@\?KZ\r%B3L#;2Hmh*:/tXJa-arq)k_Q<A/T+4q3!\LGdk9mDSeb%US8K2gp'B8o)6_3p-T[T)#T=LP=S4?Pd+R*rrXA3-b;4ui^iU(k29S#\r%^d8C*T+!0&<l3JA.m(aSnlZ+Th<8LP_D=.,gn.<26DjLM[JP2.@tY>QQQAoL'5%"?$d9$*-@[DhT+!peV\t-5H(f8"GYm1dH$_KZ\r%Kb"ZWoZ*CZ4a95<XHfB,?YqHEIiMfu-5scqf6GMJ\=&%"S&G"`%+VP'="_8IrTZX@FIoY@=;,([`^]]?Y4p[u1An4bcr4RLs86\\\r%PZu&%ceX'?k;m5-,?L4Y1X4(G[mQ3-J1$;j0Q?s-,@>:A@CU]lk0[hnQpDX1q&M\;c1W4rC;jh3gT@B>5p#2PNYS(NN9BL82-#";\r%?LD*3R`eH=/,'(8O1VN<j);c3.eL?Vl+4Rd?2@n+Y4XGSZSA8k.\!P<AMp7Wk*A[c'-u]7d>Lbe+'cX,NZDLLLM$s3chJ<j?D-oE\r%6R/'j\D$Ztr_qqHI.K'm+5FYlicH2(J%&h_j*7_J?[LQ2>IeP9M>Fa"<V5k:h1EWdb@Ye0ra8F#"'Cl`AgOoNPJWMgS(5j]TQT+Y\r%!PN`goJZI0i:F9]]C%RT4(tI^\38,C*mX')g$\\o%dmd4B/1[tUi5qkrr13)!/C/`;@7(,:6HnB<o@WGm6!LY`S:lB@T2iBeJACU\r%h4E;OUe4TkG+6X7<o[%sfdkca02XY!ac:5RL"u:BppL^iI=]Au7]1ZF"N@@Tl+"@VU%hk/>5@-*G\h98IkR<8.6)HcmpA`?JS3bE\r%hI'G!Nn(1?*K<;KNQ3)fX=<F<Fs=nTJ,\6G\$J:\id9]:o0aWma@XpDe%d5ufZ#NN@<E/JTpTI@NZm)0c/#FUn`nc\5^r^g1I`ED\r%e\_lg9/;\LXkf4G;PC"ba4B6Bdu^mmPNNX-jH(u"^?&TMFPdD$i"iZNreIb0%+MOgqJ8=LcBP=`I*l%X/LMl!j/)NZipn"#VrQUS\r%]3gF&09i54Y.jI=XcM0?Z`BM+=;rcujp;=bKC7YZF_lNUTO!6UqORLpmJ>jdn41+=pe.AA)L9XAi:;i0ReaspQM2hfH93iXKrscO\r%$)C^_IgjMn"F0b#[%nfR;;p6#R`P0t,mD1+Od$Nt^"!-WNfEDcIB&Ej5KumUD3IOW;GIcORW=UDUmrPg09VNNUmrR=pH@\E1attA\r%[_WkODGlR\'3%r'UnC[24PoH;M[M9OiR,7mMR]<,/-p;g;70KYbB[#h7+,CQLBS.-8pXah',JM-?\l37*t]RN@Uga4F@:A#/h+ka\r%&g>-HBj5dd:bE>$r@VO=K%dP\>gT5gm0R[%\0*F:*^,^^L^Wd^1'nQOd>*UG6]cn[+>2mRdF#WL79n1aCX)%0m'r^$]a6gR#i^H-\r%25h-^>gO-"1jXDC`s"V75qdX=)Bugmmmfm$8"UWF>VIuH*hLL4ids9\GU<,7P!F]`V?;Mr_W+crP6i<O&`/rm$ZM$BM"''%@R"<m\r%,!:&+9I>./7!M.[(j1Bq([/#dJ@Z"1_@*97R>C?]]F."L][e^[ASi8HqSY)<4^&]81!MGAJAH0Dh^$(sd<Pa4I)I^`_m-KuNhjj4\r%PQi6e'6b#j#aL6'DA3(;oXb*Td"&rR!=1FA!X>qI!/-YJ20M`rn=)BGhEI0Dp3Y4qnD;@/JAK.WEdTl8#D6)WN.W4ii/b4,^u4V:\r%"RkgU?XOD=&+qT&n1T.X07,B6p>>tcpRNVJOhflieQ"B;22=$.kH8tc[??a[+N.eEq/J^H-#QVLh#P;<F=qK5_/QCMBriq5,?OH3\r%U`_*638TA\99%X%8*$K(>G__,A;!.;Y3qT.Y[>+@c*u`*9iA.?0.Ftc6rHcV;$fh1,q\dFC2"Q.2F!nbk'DG$c$#(b77moMEe5?!\r%LkMQH.48faq_F@eUn"+B,l4*RrhLYc-YUjGA0qIO3C.?YOdd%1XZR=uG#FEd'?'MIWC]BR:=/Va,UN[d3C1OrQ^JO5jTOQ@+u^rA\r%apFM>"c5f:;GId$ST9pGUmrP8LP.<08@j4s>TSHl+=S\:W03<qf,n1-]]1i2'4`;?E$YZZ3C00fQ'rD_X=bbF"\C^?o]4%a61hFZ\r%jWk"$X+*Qa;NTrDrP@/GWC]C,^/mT,l_-7.8.(N#K'8UR3@W&4nV'[EOqb9mFX&+[8BM75VkrIMi;XbQ`R.h?PS<]Y/gM\G8NFWW\r%m\mdo+=S[OSem5T5uLGhcQl+W$BfF]\E@.4;NR+V`#X#!PCfU#+?D0=PCfU#?iZl`6rK,2'3%q%$I1r^<W`D.>?9A,RW)lc:(1Ts\r%,RZ?j$Q'kePbQ5-g5/+_IH/EX2Tf7qXI2A$@1O6pW%ruroNn,%T*EJU]M>=8guU4Di0d7`\2tQFcYqoI4T3dikI4Yo2Eh7f+p5`2\r%EYoW10Os4b!d#MXKRr*YRNHdq&98U)(=V,qi(d`h(bn5r#)9C`i(n<is/)k+$qLlW#jr:#%#H\m4QZ[$"mmSFb@+eO:Q-OJ(08@A\r%d3q/G.3g]BbP0uN]f[9h";_.B4u!tl>lk+<FP]mEI(T/hPI(W)?Z_65&*KusqOs2i@:4W_G4DQs(X')6I-Ygd?kD,*RC<q0iZu8a\r%LOimX=niZcEC_e@f_t5r0JF3+Ti0(O^sGt4j^N*bn[?O8Qr0Rf%W^HlY4JQ8DeE6E5W"t0qY-2>DoWAH]HE10:O3qj[*"c3pUu5$\r%=-ZqeZ>s0's/`O&?$*P+hq6gl1[dr1hpndaXD-qiFq"br65_UU"^UX_S$6c\)ntb=`QSCn;o@tNouC6R[8T'VFh8dJ(\WY1/k3DZ\r%&+Fc1mc?hAQ-df?eIP16]6&fcFGSdg0=N\be?l9UMa]52GLF[D5.<H6IM]'>"Z%C^r@V-[$bn2Zqd&i8DS'3*"GEu9KcYCGO1O+]\r%=e#/.]9osmYM[=]G!/3";YI`-)Ue(`Fh8?Q_scSYo@YGnHGXni%CpVu=Ik%9$CU&:8ELem.!%DQOj%TY,naJ5^uk9QS^!&qg8Cm`\r%#EoG\1\\p6LA%%!.9+-(Oe4(H<^i[0MFnU7P+[6CCk?cFik+=h&hFjG::fi)oJ,Nk,DPp>gTk?UqikasMs#ZOjBY.Ym@-c[7KMno\r%'<.,ub@G5(i5-)j<YD*Sk)Nohcp$)(RhREZTm]BCOtKkF[-Q,i8j;)N(.(2s'K$N>_K/ei-_8\\]oG[1pEfQb53_;B230r;DF/#j\r%&k).Lag?&6%d1mFq70>_^@;e,a$\a<E^V[n&$;'[HK71pXO54nC.Q=U97kCu]+>=g)EM=E3PqnJ@REWo,=e&(*Id4.@H7\EER(8Q\r%`d4c%fY1U_?LODdA4O>ZoCBFTK1).n;H2=*8>HP;Ge_=j5pB#G_-E/Y)'i:*WcI;M[RHimlu.s^/6Glp%f0Q?20^Ehpd9']2boCT\r%$&7Lr$i9DUqC0-W+k>fjPB2H=N'8XiRqk7_GscV;6`1P5`9E\&RM:o@T)?No*(*7Lhq/m-(d`9,]_KJ,,_b=+_n*"L^+hY,OIZ9=\r%>3*drEI*d-<rjJT1$?[qVh[H:qR/@V8.PKZ_YinN+Z[bE'8%Y0M-XmD\Yc<797&S-B"l5.`p"AAEFMUZ1.\.)@InaL;#)>FOMihP\r%hPpb*3Al1=hN4#9@u=WuY'kb^=u7QK!XHtp6?8(Vk-l]`LG^hI-7:;h\$oWD`Ad#Q,0&k-PJcs2HK4T%T@cq%X/-JX=?>7!crG1r\r%QCk.XNa*a<LNCA>!K./h"+&EAopL2Ts/j;&R:GRAD3VN\.%.WuemA&a=t??QAJ;YB2G3gNm!'?F1p'1e]p3rS"6+0J1N#aD^Q%l'\r%1UBKClNJ>lF?KREhK/=GSh4_lD1qeZ1o.!`h0eO0\"NKX[areQs':/Ljs>*a4Z'qjg;%mNJ%:?d53M9S4n>Ane\c15a8]f`mro(q\r%U3??rEh3DrX>4)m?-f<(7U3q@4c-PIS/f,3MqAeJ))'QMUo^(c\t1E2/m--Z:Y.tK$\>K/S#uu0&E,^A=Qt.9UDR*#,tuoHp631;\r%^$p-WLHLErkNLh>/E<SSoo'@d04.L5?-f6'79[]hIi"TXpQ1H3N)s>L&WNpu$)4A3$MO$(2]6VF'&i&#I#RKtFM0Cr2;0flKuhl0\r%:"Kd,]9#D3,:+MDb'9?<H<,rlPVV+'qo%K=Q=jr=6Jdm+/]uon&\BRLD,D2a+,(VhO!X-d@f8%_f`SXYV&GV8/0DY%.L@?nYk(VE\r%loC/PGFO:e^=DNa66c-Yk9^$<I1Ua42/QH/O)TF7GC]nMPDIjIZ9:UsSj^MgUA@4M,U2pr<Q+?8Fh9WqOou>Cn?0,AH\Ig*8-3cj\r%X2#-o0ZH`[Mk[F_.0b<1^ctq]'b(.oehG]=LGcnR'Es];JcH&\r.C^N"!AGN/T>t:!"c24.4P=L_:^U![pX,)^*VcTGrU\aK/!EM\r%(n<0Hoj0o=!!idAbM"&5=%.P%CEh%>XSQVef#4['b1XW\!\jZXhjQb\!5^:EqC'YpYR#m^&.Hi"^0fq/(6;]tU^38/B++YjP5Bn1\r%VJKcs%-c''+qB-2(m-_#X[N4$%/9fqmtV-50K<;![,;&e!\uNi!!idA$bf9<[rjjf6S%g%`kqb>>[LgNc)p$!U-"lZpf%G;/RA4E\r%-V5f3;!$]&T6.&qC.Z/W54l4h[[jZ,&:.D=Z?#'-Y($)H()a[E`$:G*LYK+d7FbVMQb2/Pk\.ZYr<3_3:J8BC]%I#QPuP!608!J(\r%QW0(1QGG/N9.J"gY_Xe+S;35+csnAS>>CMaBQXoI>@,CqoUZh*YP+""B,fOE6>gP2ja,I<>cO%gISZ4E'?/t8Er9&8\XR:_l<p[f\r%FGp--oqp4h**cL(=0KC&M*q9TTs8[XQT4'P)_*!DL\uEb4T33e3/g(J7S#e04E1rCNIUQd$TEabHZ/hZnU@E(\0("g5D29"DSL&<\r%(N]>A_eKP:&9r[U8j!6b_%`.@%rlj%(lSE9fD+kI<_<f`7iqp.892994YBjS,]>Who=;MCh6?GmkN7h>F06]*Y;4QIF<6+#!":qq\r%A\-E@j&M[H;(,h.n,4YG(fiE]IM%iR2od:kHGE?So;u=?]k^B/<mgTRVWCj=$>$RspfN_)_u?!+R@"&1A#afb1(6f/-#+<P7@:>T\r%N_kI)VJ`,i@FcAX;Aj*7.SS!hQ_0@.;SGV%&E>CT[e%,$ICakEl'M6l5%I\/?-/TG>6\m%[q/1X1"cF3/$"+BGP>!QC;]l&P.qdE\r%5$&mZSgpT%2t:TFR9@n`eb0s.N#\ZYd/TA5`.-4iLUTKefHop"l=_>@J";TCeT/5$s6gd#]DWp7`:Oasm2"VQ()_W8-;>ujTUpV2\r%SP_/"q=ZS,@@^T9*M9Is<\#uie%As,JY^_%\HM9k\_-1ZWf`gs,5q5cdY?$%![XTYGXU!Mr%j4s8/ZX:82T2+U`,)^-)?Z3icZrH\r%f.Tm.9m#4Y[Iq^q=?UkP]i!7B1Cljj>Q,.G']CJ`4=Z(-W9CCCG#SmN4M5mSY4H[)0BN#31[47JU361E`D3=8B7JV!][iL+SLuZ5\r%7^:86g$)qH1F@:VY]V:PSURopWCP'*B<]\\5I/bca!s7gp6V?LQ_",BSaONnkHN7-Z.#]'RJ.VXVYjM;nr_0X;cKZ?2Z&l-;>E:^\r%SU&\:bZ5OHFU#Psmh,At1\=t)bqieo%-n_/Gsmg<L>L"Wnq\"G9MX/"85^nD@5,O?hc:XI,Q">%MijaVp:s3/)!kN2H=4Ud:l=Ng\r%D'TH-A*TI6'tANCX*;$/$iD<^kR#.al9!k8.Hd!m;r@L!]&S!GA>h\>.'um0(=i0JnWGMdk4p&dkTreep#-e05IaH(6hQ"l>c2H5\r%5$[%!KIB]Gpd^+s,uR_"R*Zm+WXk"77?&/7-[@2d#M"SqIE"'G-<m!ngVjJ!WGHPe=^7*7(+56`Oa`-&eV>e"r*:_L559i4\\"3R\r%S/`_d7$0[u?0OD&g@b7GPZ0eBf]%nOe@1"o48YW?U;YG:((I;4G,DDiJZ]4[8[&`c7":PDGFP.lQ9P>kZbjXD7jK)coF(2F6r`%f\r%i$_bo0$2a"E>'Xi?QX#A1EUJ?3nK&uLQku<W':.*E'dPOW\4fWO>ZZ7'f(7;Mff(!Zi5k7(:^0W6t_As5bCOr^coNg#$D_uKt%LW\r%Op^^>%j`"$U]S.%_heOLWF/I/nr!Z(WPGme:L?@C8-O+MKG+^o;ISoG(fCB8(SSbKQW,[9q"Vf0QW1c`-00BA>q4c#pS:nVMocQ:\r%/9"/a71C[]\>00S5.N*pP#QsRH76&6,o&u,:J>5K9.I^eHml88,o)sL^.:0f>q.P>4G#FYZm6ns/9"/aoXfbi$X?Tg:ZO+"^.gP;\r%?S$.f"iUitA/,JW;Sh.Biti).;Sh9pLCahu;?;us_h\IKWF/Jt7D_'hV#ku6LD(&#;IOsf7):mfV1PG-j6sroV-`-O2EG22;;&ni\r%XKoaK]M4Y*a_Zr"=_#[g;eKkk1_@KMT8htb_Xd[Z&eEbF8!%uR3g`V#JQMC@F2S0f%.]Hr0jN!i`.JA5s'Hli0WZl+&eFsS&#>3=\r%9E8rXM$JJdDc%9,)pLGOik\:Xj%g=!oOR*sX*<Gn_iTosZl\9$NVHZ5!I(Au`r>Ot6EBY"F`d$;bknWWY:``GfD$%$TX!J3VA:E8\r%]34(Jop=)^%Gne0K@\\%"8H.3YB(c;2Vp.)_^6AmDY&[[j-aemh[t_7DZ0-6FVPp?WAb.PmVTgK9LBb2qF)@[Xf/u/DMa!##'H4k\r%)C'5U7T"S(@jlsaei@ArG:P.i;aGYQ\%Qu?Ja_`PG;j!qA@!5EknZ4:na]@(^Bo_X,PX?r.q>R1r&4K?:+WOAGMmC8i@?jG01t'E\r%YJ]8b`A5F)"anF</@3f-O/:G<8$US6m!3EIe!e-c7^N#Bm%*m"g</-'Y<WnTNNb-FOCUC1`H5VFitaRm$1@Kc^Ni=TW6ApEqs8C<\r%r3LlEFs;S(/?SS/lg*bq>=8^Z?(T3Vndffn?K*3uYX_=SC&+h&e6`!([,%/h*W`E$$^>unGpgs8^>FX=&]nBI!Nf5fEKsEt`MH-'\r%*qXhgk]%n`ECDsSA!9c9l:KLVhnk*?P3.e=N:%en?fmJ%/<4UDTjOm!Cnj?u\]cKQb=PfS&+I!aW"+1/TYQ$GH.S%PpUbAT3Rd`E\r%1tOj;/"U/^"h#a/-Hk?5mCmp1qEYYdhXQKN.VjHMN%FVq^nB[(m]RjP;::@Kh"II"$ceDAo7-NC,+jOU^ZbiJR)"AWi!\W?$`/,S\r%n"XOWnR8FM-R;rjCjp,<G^7Z-rV[dNb):"Lhu&PN*Y'FaHi135]_igECLdg.&bnKjGrY/.Z;s<Oj6b4:mlA\=:*3!SFRMbD*)lc6\r%./a3hEMXTEp%YVG0/KRTSIFTQD6*$fpLsDW,ol(:HXQ>kjWA@qqT#(`_r(]Gi<!J3[b0srM=$)2P.9o^95X7hcqJ;H*p:n]rF19%\r%lB/+R5Uoa[);k4NYKe$ioW)8#r?#+eUCp`SpPRl0/H@Cl_7tRFOGZnY<.a:kS6\r(nkf^n?jl,3QC$1K^MuOPjqHrY8\Hl_8')qr\r%WX!_pO.IhFhmdGe7n`1W2jO'R%=IC/P"*,k//'-q;+.D>>PiQo.MNt*@97Zt?0(!%D+PU"f>^\pI?!>Tm_6!aaph,coi/V.Wo;'a\r%8kE_<+'4^qCh79b=k?ub["'a>D%HRZD2\!l;nXY^V9.r6KD*Uh#5U8OSa:0:Y^n^E>`bi[or^,WNHJW!kG:lMX)B%]LXW&rTn6`f\r%7P[Me<1V/>C-;t&#Hmhto^lE\F>mFc(&bP60qJ'O[Z.35DTm;IAIl?e`^2hGqB@W&f_Dk]r#8rOU&3K7PINZ:F&mP\NG`_6GL1W'\r%hKSO2L<Ff5%L>i9"hJ'2:mNFKHmn4*Q1r'l(q[O]1@KW299[^9R8S6W*>6F;LQKm[`OO&7=F4GObAqWXNrCBdPH@%")3X$Jre2@V\r%:i-`?lbDe9&%br?k!AhmDEKU18AW1-g,:pI&,;:EW-#>c^kQSulGa1FO8`SJF`TH&ShprO9/q6>#cJ:,BjeccbuaK&H;`d&P$TgZ\r%SW+PcEYQ3tEI=^)Q5-JO2i\D+%Xs9W2bqsSpbV=[ULh5Pd[FE^W4Ul^-+C]4^!24*J_;qN0_j\'`;NISWkfd%2pNquGAVU5AKUgn\r%DuT<%o/XRb6e85>\7j<<.>CFQ0S;UdN0UhUrIl8'Ra:o]6A0&:;qmGIk@^FT8'f?!dX:10LM(0tBg,JM\MSeU9CnS*%alA8Bg*1A\r%i3)KCE>&iSi2gm/6*"]`gFPGVi")DL%^5<I0rP`orhrs'5&%``ln#p)"h8]tZ%I"E/<YiKX2)WD.I7\n*;?UdPSdo%RrO%MR(?1t\r%8nq"ihh+`)-<_TDCNlan>$:(CGFDYbX_m\Zef20sV%4H7cKFM6o";;gABJ[V6C/N;).a0p:I'ZuJhYIF=BT<aE$g@nU77Ej-)D\)\r%l:OB?<%A?Ip,=!<;<oJ"MLJZW#R#`C,QNa#n*"p^R\$tmdS5+gcc=1[j$HCaUUROZW'a4'o4,Gta4r;H"Q(P0)S1fuU^Bd+Z<:=;\r%YHa@hKbm%6-!-NZ<>-s4%k[3?V/2m&n"J:qVGp9soKBQ@"&IT<9A`)E3@3B+>)s`Ylc\Xr2e]aY.st.T&*7tj.s1/K!TeK\.nlT,\r%PuiIG$?TMV[64.9=+Ml'!D`!`^KcK->_TptL&WU)_BF4n%?SkL`9%"2Y(AM;kqsru0ho[LjOl_-#!^91&6GR3EX\YSrW#$#:9Hnq\r%*Jd0@2k4-9Eu"%GFP@l7'\=qJ%83NJk`2bRAb<XZcAbH8qL,2CbNU94G-1nSJV>tee\[3^^k0dqc,0$1YfpSepu^Vb@Jo4EebO@9\r%LURIZc[2-(&e'BS[OT^?q=3KW^[V2NG%2pa^Src>(./o8DAKV%4X?>JmG[_>U0HqTbD$7_kH]9bG:T3pmIp%USO'`V"o7br&Z^&7\r%>GpNLgTU(bPS[@>'+[ERdZS(IeXhoZ<4G\,;QMe#mt^A-rU6T/Ku[r/dnaC"Zi]Es`fh+\B*fd8K\#WM4'VTqK\ldW@^Y1YF3?!.\r%b\+ak>5/CUdePG9>Snfp8ER8TKi(2K=XLLHkHi\4a\68:WSmS'6"HD1,+['.B_1'o>%kB;bZJ_l>;DKf&^4nHXu*RB,_G]di2[<4\r%@C97+_dpn$c8!<o,_GhCp!1l_L.$RB<c]'NAOlr+D=h+9bE*"lZ_G_n_HW.""Xn"RdV?]d7<IoQoH4aW==RB<.\f':g<TZIb!>@F\r%YmtE[>bpY*5)p;1:kl>Jmq8V&3/Z[rQ!,-+QLtG]HP`4?PO8%-`I1WGL:eM.0O&YjZ_01NpMcB:p/712f(,Zdd=U>YSa<!G<*`)>\r%iYs'>/4&@Q>3+gY@E$9p[E-V=6>Ms-_c]sJ2,Hm"6@teXQ6:J_B2rH0lk7N@D<rtR=nlipO/'\7cU*N8f?rU<B0igRj:E,]T4LTn\r%\N3oAr%-C'Rc5>d.a>t7rJfRhRuQ_&BbuEjeMeRVr-Iu@3^9uGA_A,Ri*Fl28(CC$7#U!",P8>6bPCUtbIdHM>%$Cf7;6DtHj'H5\r%%8?C7UAmp5@YqLD*)#XgQf5T@/J:g8Xd.iIDkifgkdu2,r`.?LXfm2:n>t,meh9r[i6PO'ofVMRY<O]AAhM);2c"f^B5Ld2,!_cC\r%%ZGK:%%YMV9L1WuIsO>sf"H&YCnb.r_'ur1_HAm]heN,`<<KE8i#;IK]Lu5m3iQ9LY$%of^e(p%'=:t^IsU5-!]kl>8eR[tqd8J5\r%6`]b3[Ed%[fi%8+q]oeWk)G^XEn.\dK3ObN`MBlEG!9AVbi_lT=0`op3VQP)?8@9'alC>/'Z`YRSS97X@<i*+G.Ul;1[-+efG3o"\r%.0lp\<CsTBEj)[@nW)K'_)iC8A`6peLI-QIEBcPN_;cP#pI?kg.3mF;n[&BuO:>Lm+hSRbTkkR([q/RXgm,;Yp&5B#U=J[A]^'tp\r%\8_JBL0TluAfTZ4't8YX48ATi=SF)K#?1J/MUsQYX5rW(6W+X_2IDbRCHnqkrcjoBEX<q,gIE*@N5k/$T>J&3\V'X&q%`3&4fi"9\r%Q@r58gARJ,)qB.H!K93i)sWf/>'055HQBD0(@K9cKsO'fZhLF#]"3s."KrRH1;+[/X>"^CB$q?N7Z`RdR2!$k"G]n<pLt52PtCL9\r%8UR[?H'B/6i&RpX#iFpo[BGo,_5_FU,.Gm`r-[Ufp"^<jM32@rJk3:<pCa7-pR7V2^N\3%A%!#FU*<?>RZJRicISa@0u=YpqK-Rb\r%,t8_/Lp"lK@"Ss=+>ap)>%3.LQh:eM8(_50rhqVdf2Im^7eSouN^!;^Ib6Z`msKK9>0Nk0+;2-%#&sV?WIO-qpCA(D4f>(MbXQ#P\r%iA2M93ZE59h'c,hn_f6t2<iUR.`;tKdM@*BDs]Kp-`c/41Q:Mb#<?t-O&g7uce5_KNn(k/8"IoX@j0SJ%$#heRl(B@E]`LKo?Q1n\r%Mh#?Fl0VW1=#RNSB(*)AXRBhd@kWS@K[=r%d^;\;dpdn%D(2T'VWd`")30W`Y]*>n9BjWhotS/R^Uu`k?6A9F2(PlV+Cl<,72tdT\r%TAoP:G$dRN'fVt`Eo7&,$?NHG5G#A@E?ip(4P,_M085u.Z"!P+$V1qB%8;=-&h6nU/R]8\54/rE8<I=+2E`c-l9qX*p*!e--DR,H\r%mdB<f(D7sDY'ojmdUFJJJ)Zqq+5K\Bf6:1Cq1Br[;g>;q(''M*:>nL92\77nT>Je-h-:ur4%(]\ddoCZArMC5'.Y<Acfl!l1D86^\r%PN`Xp4/JlfT'V<GW+MVpLId5?k/h_$J?-IBo0hXN_)p<=*YGA=,`!um&ZJ-n4^UO%7.bOl@6>`3LI_tZ4<d[Y8>D_X4JM_r0:C<7\r%,'A_28h%,;7-Y=Pg&>JB7"4MfSfSL1<<!]'_]cnG:SBoq;MPNVRmMHi@GD!3O,-a`Wf:g,"paf9/;$G\l4=j0-'UnfqC35^qA;==\r%;MPOTT#5nCU^du;8YJ9k;MSp<UIaJYOhP^`cBJUQQU?)Xr)dWnLt!Tbr8c3G&ZJ,#'6`=t,#X1eS[/Uf&Wo+B0Td:1,9h8dFSuit\r%,PmIDf=Khim+o(V*`5>][CuM$olTT*J!cH5hr"1(SQ,%Q0ocFG3.HnTQIN$9oUSrJLfUOk:9+4F#>Z@!9Mr5rdIYj^p$17'[?%$,\r%3U(Q]Cq]1?Pe*@/T:<jtQSd(kZBf\S2s7<@G$fTDgBm63o7^-+Y1+rQ$hEH=7!'!m"d+\YY'n=9r2>m[<\"s`\7<>:ik$s&/tX0>\r%.XQ=XFtUnF0lMCHd^F7m<6c/u(!5kDZE&oiY"88tSB*^@m!(D5&]sJ=VYSfl7jY=P[rbbhm4EG7WP]Z;5?duTN?:5TYLS1^V9jVW\r%;lqk6\K>i/!?P9-$U[q2*h]Q3?VGt-?*3PGJ-E&5c!8TN0;A[lHJ39<0Y+A4WomI`K`C%l_*_!QcD1Z=oH97snh3TG>"6Y^dY%<X\r%U:Gp$`K1#&l7AT>fCB?PVk8HK3c4[gBpQ*h.]HBc@FBh.`@S@GLY_(?D%&QP<bE22SorHOFeJc"m].[hr/`;GC7KZ`7Y[s\`O8GN\r%nh@ak-`Q5orp^:Z?cnG%Z#aa\WV8dOFj&mlj<"<C\ZQ4L2qkA=?*ijRnT"i"`<gWkbXI[Y?p-:LS#Xb0PIEWn%m:?4Af'c)oYk`q\r%8h7/Gr5Y0SKt'0L)p-<&!Dp`;GpTn!(*!<DFfGaT)bRHJ&%qSW#LZnk%+8G7`K8@\3r1aQCLCD*B<C@/cH>;:3,te`b(m%QQ?:WB\r%qSh7`r++4+(l=XQ]$rfF<ZI;lpkc)5mjd5;1%Q0Cp.6MaZpY!mis$&3V*[-/duuu>\<\/1<-#VNJ::ImZSOg<FVdF.@X$DXQlTbc\r%'n%ttegOQM#M<b+[FT692'\;A<7c9hROOp\H?^?/V.HtpaJ,_Y7YO"mcCho,Z7ZA*G@<$.nXOiRq/oP_)(r>"m[F#kldPP]H#h7F\r%HUH"c.C\cnIVBica$'N%:r:5Aq:<a6buC>4jtRsnEB.r]Mq*hKZH_D6f*9PFG;NtrT<<*rX"F9]E+LT.B<Z_Ad#DRK5rIK#TUN'$\r%oJ-4\bT#G@?aO;^6HsR_I^c5[V,8f^9<@U;e&0TSW-"E/NW>C55c',1(',uBJP(]1AS>3B&SW63F(U(7QL9P2$=Y9bF@V!\&Au<3\r%Bd8:_W"CBC&OKAtH@<>f-D:0;f).]YP^R'61d>d-JH#qoOsj;-35`S\Y:g>j)3?777m@\=h>'eDBmt$g7fZ2[T1r^eq8#i)RdBj6\r%_*Z&f*?Q<"#Pl9c*>q#I;MpFd@'2V#![7\J\mmTI6j$)+BLKNSRklVO6+hdU]*Mg/^*IZ8Y]PXgKpd,l=?9\sD0hWmXC4H5deD[X\r%pEA$cp:niXSFX&dp/\](dV`tt#B;"L`YWt3<f!.q"C5/)r?/L*bTbl.rd[]$RKMgk(?p&5e(VZ?U*.$6rN=FeRn+-N\!;2L[;<=7\r%b36LMCe3%M95`TUE_#sLPn\P&DFhP/RX?tplG<0DVJ@N7RVu5B_2m;35c^<R][MXG%26V&4)HJ_I@(Rm(6kq#!D#H8R%$W2@tNGK\r%l:5iHo0iG#9g@<A(`UnAI=co?Y#F/A;iqMQBbNkMK26hC<goXQ3qDG/nY,bm:8/]R&)DB"\pS1?3"b,eoA`40dqJ?E4?l"d5=+r"\r%q/+qq".G22f7)<'l)i"/)pJo*$(a8oV!Xl_:\2I[<jn"@H%%;$5P+Np)0]CL5<^ngBU\GKq*?Ch-6J\K]'=A-r8oUH7[bF3\Vad:\r%b;$Lqe<0#fo7NUF7R6ROk$d%iIXGgX7c#mME!(Q&iB7t(r0F;j"YmUa/UK^&<:a>VoTgWjRc!\R?>31i:S&XMR\-0KN+.5dAP@$A\r%N!Oi\lSSS*i;'4Zd/9Oec%G2WLpsq"P3DOrI+fI4*9-P[p[(<CIWX7DR\-onSjEgUm(ZlSh5R[A)'RMu0LQMibDpLoYTTd67SP.?\r%QP;sJ%i>m/8jc>hd4qRA'e=qL6LQM;D%Fp&J'>i(V?&Gg"G0R\/%(Pq?B+XJA`b'XK[^GUAqD-l#]G#,0bX[%6MqnE+#@=Ho?\(9\r%A!/@j#U,eAVSl/q&].QrG<V9)+-SR3R0E%e,K6P?AUkmY$S;FJ"_VjTfQ;`r@'ZH#_PV*Jo8'[9=CsjNLc[LXQBTX<Y:$3kd]u#5\r%@FIliphJ7+*GjAMD.B.m$b?O/#qb`O,*5rp&/#F1*Be5N^[g+5Sk-*MNc1pFmNTQGlcJ+!Z0Bs]GV>aJK&)l'`hnN^I\O`Wru7i-\r%G[]&'f#c\u3$biW)CAX(3gNp#(bmoh+&bkYNtRqBAJSIeE5\X*V;[c1bS%i"Z0?eDak^#>]:@Rm!fT=VSO's>0.jhO-U(%or:H;p\r%X\@Pn5Bco#3QToMBa$XWjD4R39o54OAL^VOHQp()*(mlT2=bXb\iO24b3d$n;!XCP>>SCR=BFq?0%AQ&aMS/7>#\^J1US>iB",16\r%+)[Qgo!UYF$s)-Jk-gT%g[mKm1C[>gN\3g-G>":='$`L(B6JA68WF?q-[Lq0\f;l"o4poaf,S5qcXT2*Y)^lN]sf[*R3OQFN`uE*\r%99'S/K6]k=+;/2.mI;eY7"mgi`Yi9HX$BD7KHP:<:)LKt>V,F?@_ke&a+Y9gYt$M>A557$>_P^\Sk)aoln_H"`"P*THtJt5eIBRC\r%P<&/DR=+'Zo45#m5ef]EoAhZ2*Pos`3Uqb9G;/Uk]@C7kc#KCWHDITT+e!Bu8!(t[4iiQ@6.l1S#f:O=jRVrubQT>BVo4)?aYE,b\r%GtZmjguPhf4N5]c:4,7oUBTf/53XfPkb]um1*V\>op!Dg_]#&Lb;S2pV%SLZ=9RYZNaX;W-F8ap"eImZ:QgU54ons2LgiajA%Da:\r%\d]rl=ib=?#1<mV5/DHdQeuI"P>B9OmDg-Hl>rr9>YT0Gp^JcmH<hkghCk,UFWK)k*ocum,R,<Y;Hc-'.a@#!<d*%U8#KU#Z\6'4\r%8]1*.>iqRGG6u#QQUrR$3Bl4as5KsfZZ#NlE49&j\\;/Z.DFCHdXg5;Phs&e_iKtFk"9n(6ft<oS_WiD\m@?l3k=Jg[EF<fUm'Q'\r%'/1U3'ai4!D9GYG)"0&e9ffiL'1%SRT%A-p8Gm[@WG,ss\`_(oi<S$W^-,80$pUk$N+:1t)oE1l0-i\Vht7Zk_bUi=&4fQN+'sqJ\r%m<N`9<3T-[g[jLGn:O[f;:!]7:Nj<tA%WY-Yj-;"5`@j%D@Ab*pk!jaUib]H_ntnAH$t-):X2TZ%)Yl5:#OXpjL4nT5D;bV'Af^[\r%YAUbiHB(-aDDO8gDr>mpr;P)fj1OE(Nn((L153F)ac58WG!GN`H(n*7n7)0dB-l`4-T?dPqL6Ybk@no,:UANVgMa+r[''9gP\q7k\r%aa],GU413emTDdA=g(GeM>/6H:``9YbkdbEaD[`'r.(?@Ld-Ln2MY7$2dNKP>c7"6IH].Z)qu<_bHnh<<1<3<&krV68#IunU>,Cg\r%R7uG:$_s_g9!btUOa9N)?%PgW6)8GLV=2of$p8C-/q'WMAp%"[l8juOE2Tk)*2[hkBfgGH^QJ[R>lnL30UD]\3H2Jo^f$rh9$k19\r%80uOV61CVlO"3LlQ,$"^Ot/goQ%3tflU%+Wc'6eF'r#;tL+7c+A!C4)HE%+rqh^N+Hu(5l*)fj9;,JY+N,IDHhNKHUKJp;V8eC6t\r%&meNDkNQJS-$53/[Ah<@.Y7$03`k<5W?7*h+e,M0W=mRF1]LbZ\J"O6$+^6OiHfg1.Ui1p,[:Y_;\-VRkc#2H8C*Qo(Ba]OmO+1J\r%pqM\L8CUm<99g&VHEIDLd'Y"%9n\X+-(MYe6s+gdW^Q16FAib8\J"O6$#'4d\.T&1$a4dMN'!.7%XDL3NN:LQQ'bhE5l,]5lTOZh\r%mS>Pk1+Pu0,,kQbIsVPfO\#ta^+[RR?dA:0Mja%7m,1#;OC,d=h6mP+GRp%2Vg_Rp>JD"j8CL%FO!&scan(]5>TrJdUUui9i!O1:\r%$)4W>e`RU]K/JSmb)^$4&'p)r)dFNgGXg\QLZJ"7huU0BX<i`MJEP4/kNsq%hWko_>N?mA"8u\ei'e9o;uQZcLnWk;F"B*13-r<k\r%,C#^[GT498Bet9phnrP@G``-u@.M\\_2BRha%?F\$fKu52JWFk%H-4$atJ;>QT+o12t"p0k7bWUk)D/#nG[c[j7B/ZXHXp55oftg\r%I(//k,30]Y'1>=n09Q;VqCY17EOGigAjJKm$NC)I<_:jJ?6fP6Ps6$-C)lOQ4ZaQ"C)e=8b7$&/6D4qJJb'p3C)lOQIHK?b-n>gH\r%]=C](E^a;^]np;Vn_9Dcp$kC!f@d+#s!8=Gmc8B2o-K&[7-Y>_HRu6gAA$pZ6$K%p`tO7VLqH:gDO^p`@h)DSmdZIqhTr8X2a3Y1\r%2=u:Te+e%\p69MQ5+-gpK'7#u>%u,N%*,,]I*18n4dFf=,19U8]2@)TogVBho:qlOISd%TSiQla[U7Y>Y%ns>G+4:i=8LstkH>[@\r%X?dCB_)8G1%nLXK%TigD'f9/_46V=F2EpXX[KVXUWR(NV'UYl7e2'*'"_R1CpaK&h0_=(e4-Lm,JV%dUq,Ib1QuAZ%k.'W[8f>:X\r%q"YE>ij09O(Md`lo"<bDVX`Xqgp'fIgTB737J]`O^eF]\e*19UfF_5.FTS%'I1+)+'U^kA1`;;(j^^)EE/5NZcQ<T+dV9GhUX*Zh\r%@@P>#?^/KFg]Ml=0X^F6PE;4mhU,M<X^&Nq!TrC`kQH25np(!O$'"Op.D>@d"o[,H&q3kZ8Mcn@4hjhN1jHOuoS/BH4Hu`+r?4Y`\r%+mgLSPud-^([e;'crE7)>1oqXCB8cRPP=J"en4Frj[jB`fqN>1mdu5jdUN1LJ_Y-RE1F"pSSamUjE?$$%7uE:IVq,*DeU3*U[sMo\r%r7p$M5a#>4;nSgbbXcbn'*=lg.97]S>VA!E#:t[k8b77S>#2/kgY29blMTKU\Y\tL3h(C4U@VS<d-('mdsB`;?JiEPWZ%JO1mLoh\r%/U,7?e9$t9j.Q.(7V3lR'1ia&fLQsph%rQdY($PVbBF9CJa;3D.u7*gWOV#gDtp7MFH3mgg/@Us\eZaJGH)c@K'*oQ$"f,_W[-cT\r%s3Gs^ab[VUa'OG%1u>c%\!O)rpY;6Bl:n$4\Fh9S/rcCi2^M]nrK#1;\-CehEXR(r[R5AWC7JMhc-uSGP^!?/#rD&TB/6s;RqLYR\r%SU^0d]NJJ@pW2*oiV1Eba&H=nOfX3fms!_WPBt[!5^ucTA=iS+DcDk.gtg6*Osf-+rKIT'Eu`r>a_GU2Bs$'Kc!FUig41KG\['YI\r%PD(Xr+$Wm#Bh-NJ>:X'O2.3.l=2m.]glW[nEpMeuJ9,Y5SY@M)gPu"\GS-TE%`2FC>OWOZ<Qa-Yer&)cK&j-Xh1:$5DUoG<rUZ^E\r%=KJ@`+MN\]<..GY/c@?Ok;LS+eLX]-W)O,<eU`%sDg%_K9$EPmWY5%V<GH%_Xm>AHm:K_I5,?'g.cK_B-fF`:ap[sGod0,/IXC(g\r%FZL'9n6=FC^:d.Sm>9=^_Y7qU%W_`$HfDceH7UoB)tthA/\l:#gc(a5m(i)VTms6Y9FMO!0&+BZHBhHYZ;3=(E<:j[<>%]#i-,VO\r%/aNDL9#/"E&,`$2<'5-WgAHCF%T3SX<<riOn;k/r*?D8anc=2d)B8fSi-3<OPQ6oagjn:R0@KBd0\=TU[q2nJ\X4-,mC@$kSTbRZ\r%Dbo.I^++C/^ZjIX_?.J89g\d7Or!i+nPjh4l;^/d94m++DmNZ1dT<]IkA=i!%MK.DO6N[O*P^']ALUoqkor"XP]Pcs@2`EEoA(O_\r%--&`a!sbpF;gG%:=')WD9!+;JjbrHqol4f#)=)fpAb[jg@3)MdBr\uHbEb/r"H(M-m(a5!!,o#&^^_?h%P$;a($lJMl_#>@dj>^G\r%5bj,;f"jgo#\OhTgI,TqktP6q.$D%aJ`pNn!:?VF6M.X1Z%sQLG[[Q:8oJq=WP$(LdF2=DU4qf>KH<g.6jh>ZG7-]q(o!q5dt8fi\r%#:pEL-bJDh^u,Q0DkYWM&0lqniLh5UPPq5%pR@4!$UbN/-_\H'';F[&<5LomE4uN>pS3H+g%&V]&3[[)r>2j9\K<+c0A(d5!R]rW\r%@n!][KG8O(&3VS]S5(8PL`T%L)7'WH61bR;(+DW^,P:K[d3p/a(nl_fauP8apR3<p&#VZ8&`F8J]3iiVl-W3mW?3^nnmHT0!RV:d\r%.W%]F<Q`T&MsCqn.sOAPL/?GNV<ZTI9M&K;Ptb0b*LC/<bJVi@mJ0f9Y+[.7Z)KQASK`1-3XUd]DlF#CCb8k5gRbfKgp'<B.bh;5\r%FfA_aNK@'8.,+QdMMaBABqjLV3W#66'A6Q$)bH;Hr"NA'D'W,i)Y(ToZOO"A230bCQ*&2+FPbhu=4sUA?;$\<I?eY((U$'aT5PdR\r%lf21/\U(^Wl`HOY4?oqH4HrkRj4;DM+BB,Yq:B@E2gd&u8t?.XgVg1VGe(=VQ'La+p0%.X"TO?e@rn,+>:K6G([.kMV14e+X7b#n\r%_iWFfJ[)*"k6SY@4fpRCA'LJ1#\gCQ(i+*RpU/S8c^1cKMN;$4Q"Ulh&g#<?c5(R6Xo=a2lgm7NCs]oZFPPHb9B2iP3,-\0"UR:W\r%N'uYc"J42dA`]^@T1dB@cQVfE*(>9?H59D4Ug]qZ98)u:3Xl0sPr+1o"q<p,>)N:>Jc$h%Ea-s$]]m,@NA\&K[+(2$5IZhIX<'n'\r%(M,(X<)CIRUK+/_"'M#G'3^\#1O^Y75SiK1;RTIX2+qhlB&QET.DrR%@VQ"BIUqGh/G2a+.1F%:U*KECj^:T*8to8JWSocg*<G:D\r%$e%m?qC9BC04m#iSeG+Gl_u"(G4eu2dWo,[nk*ZWo^t^Lp:CJRD!oY&H2:"Fc)aM#s(8OAG[??Nm@X!%'!EjiV)G3m\=D=n'r9.D\r%h(8EiiWB&8,1=P1*rfS]E[e.X&+9RQ,n%5Z(Hq=9mrEGp!^GeG!$b6sTZ-KMc,(oYDi+J.e1Zc<8<DYmd(fBZOH]4b*,N'851IV3\r%riLS<]hgG48f%C`qOs+N0DKAoIAF]WV^n^j-4p!)kS`P2=4;G?q;JS1V>i+.@5_eX`9$t@GJEbnX&ijoG@,XQJdJOlH6+%`F2Q+2\r%gJ>!KCsd*H\0"l.U8qO9mq5fr67E=/i$pFV2jCMdj'esZ>_KVfdRO-%8o];>qtQQ$,$:5iD-Y-%i4Yt(J1QlR1%]ju&!/fka']@#\r%6T[Iik6_:DQlGJLdhN#R.&AS!M5>M?RpZ]V8Zb;%Zlko"88Ja8D=S)dN?_?T\sXNbkH34^eceq4Xl"Oc8uYA7l.r+$/28_n0sT3`\r%_i#H#cHp#o6Xr#rSr;O4cqRZQL&p7%+LQO6(KnY60]oG.n26,:'&DT+9]8G;2q98u>iLY]_i*k6%nV!XP/H_X`=D7cP&CnH9?N($\r%[bQ^V*M?]F>`dC#2s]gEW3Eg$V"Zm];f:G+pm#8'icM`MBU-([B)RuSYM:>U@kPkllVm`>6U@VJGn7$AG/nLR*cn2/W%3jj@Y_.q\r%e)QtHr4LZ0d*fW<026>h^>/_c4"h@q?E=EBiT8k.oXO$>0;^#U,EP@5%6Pbfa2buIMhTA,id#'?U"#Dj>FpOJ!>AT!7_,KD54A7.\r%-a7DccU0<hFNH,K?O3C`aB?9IrGsVmT^$<1jGYFpW:@l!$`QJT(+l*]8Kh*Tg`ii?N+5Va:oNf!8>"fS!Iqn=6_=YD]L)GJ$],_m\r%6s8^V>qUq!:V`Va0?+;QkQr*U)KQ0qd;I#<.RB"](-,!c0_$9aL5NNp8e;<)PZgD=ph=Z1$`Shc;$@Bn5&t$?Q.8"M?!<usZd@*D\r%FgPs(@kOI\,U&^+OBFri>XG92f)+#pkp9:FGD>sf/"qQ?A0SUXo:&Xo3'b03_Jq95q2'&1*\\)VWUgf_:p5F-<6QXfK#kgi+<@g5\r%Uc1!12ugSZ)gr#-?B'_PEfcS`#nF_n[>'R,9dc%P:be;5_-E-FPCo)Pk\k#=+r+B;43MPcV0)Mp7<R<'PE4[V(4j[Rk4>'SA0nbV\r%(NQ1LDl0<C`6cD0]1ZG%No-,Q2YmjJ%F+"&lZA"K63i7N7GdQMgS3Hr@$8]]Mlss*;Yo@GXs=^X1LFS@+$qB\&(n^m@h]>m7jI<o\r%2'nO!:6)43f9B6L%kkmUQuU>a9HQ-c)GS8Uq*4B)P%bbL%8p@mJ#arI&])TS&R`kRhZu4I7QL\Wlf@PV@&\Z*Yg^h%p7@m&'hFc"\r%K]skI<8dF\G1IV>;M=_W%UB6:S.Sk&%UB6$,IGUN;HKQEA"Bl69+'rSg.bXG[U\(B`ZD+^!rW`t]rt<$H`cK-U8[g/HrG1<a1^?]\r%TrWi[l@%J,EkUdeY62[E7(Oin$^ssp)8/.[l[9c]9HfjN?\bf$jN/eT"YEM)me+:(>pW;qX3p%+dOMrtHKhFc9NFXk_tC+kR&[3F\r%YgdSk<uG[^[O`C5lOZn;%>V(fH:%i.^4rdO#!697*ISr1+3b/s#J#On=V9pKPIdC*>jM!9PlA`=m>''r4M7iRf$GG>ps-d^6;Q.'\r%YIkdHO1/7n>1j<<:3OeN9'kmUrV0u2l8P#TEq6ZB8g1RSIMlQP\rU@?YXMW5KoUV.F/P->52D7']L%OBosW<H4=l)sg<%VekC&HK\r%8BDkq):g;9lmVO6LYMj$*@p`Ko0]fFJF*:ra6J"#1Rid1Zd\N8CoXRa]VN\cb9-Mg)b1\lQh9nZo0#;kh;tNFlr4E8]$!fj6":BH\r%h.?%OZErL!`gsk)aN0*;pR$RC%up%sFYHiTq61@&K3NgNL1_OHEq7oOFIMc0*=AN444IDgl84f?Zt@[h%MpL1#S)+*+%@A5b+;l8\r%MF2Cu*?UO$e3[>tYP9$Jc"C1^r=BWG^=S9S5"hF_Ml*]1>S@,],c\RfF$9t-%%.c4M3gb8LI-Z^5r16o5PLrB%o&aRcEYGGKB=ck\r%>o?XScoa8Bc=HpU6gVQAXAWA>7J:pA$W`gRfCF78'%QoNnK'#^Ae=A\":,L4[@@ZB&VT(eX&PbNY,0([Y8L9pTK@W_#u?95d(25.\r%6dpJi%eG'.X^l(&N=?_Z.V!U]NkX(lB!Ja%d0Graik9R1/Ytt:*;\49-i2H^2<3"`W?@#lHLZ$id%U+QGOhf0l5ZO&C[H(BM-!a$\r%TT\Yq<$('p`*7>"%hCb<>AO,GP@+>j9q%"F2'ij8Qfe1SI+TG(':GE:iQpYj3U[Au%Y$BlesBpN)*"@/1\U8D`4Ai`$J[Q:N-VlM\r%".t(Wce-o_]_$Yt)I'r#rf/:?gCLRNqX[]<q>&Eo/Y=CDi6P_>ak9VH;l#QJn?Rs/NB\2`3<fm97S%!]8=P"kI=-\_?6Mb+qX/sF\r%_@*gYd8q4ohPJ69V-ifQ><f<Iq<oV\]_'CDdb(>eC\$S;cU6/LkgHY];C3U(p#7CuZ@C6:dP"l$V+qHh/cF,R5')#X.1:Ur>If*&\r%7Cb,bc'^t?.O%"h1&OY#L5BTHPVaj6/<%&dNNa@hKW-BE>&++*a]U(ce>OdPn\t>h_X$eo2d!a_=o*j&%JhO$Q@?B@3r,+kiH)p&\r%9]fCPASl&LNu0VW%"nBR=.eg[6\@eC;#5n6.iEj34Ba-(*TF(D72tR69Bug5s2A0cSD*uFcHf594FSb%`o;OMUgaf3bn"pp9`BE3\r%e$JWYdNtVsJ2#PRrkpY"Y3<*ImiVQRA(BPG_#HNTN9/VnH0ACAX<_Ob4o+ADkl\4GCS<k,r8]eU%^s!#GsjnB!WqBX]$bDe>h\$t\r%>)S@<\*17`R,h/SW)X_iMN$X0;@N(R]QTM*=:7]7AO!YdE')kO9;8X,)5@T:r-t&$d>GotV'Q!%OEBL*\6DF$?`ZtLTfkk)o>NKT\r%V*;jhB"hq*^(0=0AP$OK==1c/R7oU3`A6t[G7&C`-@2=@@#r^N1Ph6Oht<5EqA2Q.A>3pNSeGI!Y,M@,6su%KUX)/mq"BXfU8*kH\r%mL[YuY/s)p2oWrIE2t38@.nIni`X'U<A&Suc6X-4[iTu?0IIP6[P7_u@4#_tjs%mf>F8Or)6Xff\TMr(krJ9f^.SUN`*I%/mR[<,\r%>_,\s4+T+K6cVWDq.H5mbVOV.nWWgg=BA(!?W73L@C2adRalg/(J[/icL5*D2.rd6-Eil76?0Ef5!;S`4/KVPZThR*..$8;6*r?(\r%I+9"\4A0fGrLo25a/cWQg"GEuPOi?E5/$q0ZOuKo;X.u0#q=&tA,8hn`_SMSCSeK%i5p>e/8\<>QfPT[gItgcf'7n`6*d0'A[fBb\r%R-*>]\Er_iSo`qt?!?tS*-briMh&rb0Nm/-q*im47;.0rRU=ELB\6\Vm?8-4\qdQ?`m^"o=p+2YN'`FfAm(]Y&Y_,c0fn<e.C1.j\r%)AR6'b:G*U%.@W#oT>AXd,B8ViULoUUVl\8_a=Z^Pn("kJH`N6faghS)jocEHRY[6;Wl51_WeT=;oI4Q4)*Pg@$$'MKZ292i[a3S\r%Rn")jr-Y9HIh^<+:!),)+:$*-q=7lb$_3_?VsadNeJ*_A)P<@M]\C6'*CE4.8tjtS"HeDNcKL4+D?FBGioFra-@O1n#KF:`/.Her\r%D6>8HhO((X"YY%%bS)S'BT'/RQdMX-8niPmTX1o3JZ6s3B-5cR)q\i@dKZR/]Tc:3$`T)fm\9ut_FdH([i'aprT.aB;-oNrj0tK]\r%?q=46:Nq[UMWb[@*'g69*Ni"[q+&/F*WZLPWj,)IMr;2ABl08i$bC-oP3Y6ZOsZOa*Lm;?kPE>7aTfu)j\'k_fB7$iiU*>(;OB&I\r%l7U0R4s7,^fd]'mN1e.)j'M0AH[c-g1#%RA(hkq=6J>Z-Wh_AZ6J>Z-\Bl't!MFSqQp^8iETo1VnnP77N_bfhK<B1mY*L.oDY=Iq\r%mq4T!BUVA/"_f]uVV'-[2X_]]8&P&iqCBsqoqZ0:9#jA.470YFcA2+lqUs/e433$Oq:WhG>1_Ln^p`V\fnWO;F^/#u\1f,hlF;"9\r%%!>h+gdQ=->ZbF7j;.JN/f[,5=l1>^BY(:+e:.K*:&KC,cY-M:^_U\q*G\u*pfH"XbM>C^NSZK$IsJqKp.Kfm:,i,?5PkU)gs5/f\r%-!@f=*)BI=dpM^Q?Y]?+&gdXic$nV/N9Bh7p<XC0$lLo:7-DQL[W<=aO8?:4!#En>MT7l:Y-@\iPhm*)Nj)s5W1cD=(iZH.U>k-g\r%bcQ97',=<oR,`aTn%qgo&^5],)a?ol^Z]=Frr)\II.g2E6NS+(bW$b^r>F/P(XPljVnYd/2J1B,H\tt42Ja%T[TY&+_*(LkOL]rE\r%<2TAs^tCB+VPR(<4dFn&_hK>0L+pm2&N3&7\m(<F=0Wq?D$E*11<^t90ph3+BfgpE(X#?:hK5Fp.q`_H`]ERn>!gi\b>#".PiIYr\r%1FTbmGX5)]*cCaP*r+,AC)nQ'MsKs,EGPaS8*Fi)_?b"p!(+3Sg_S_S#Brfr\039.$<SrcoBogq-i<'j<EBg>pkAlgM!5lBWf.^2\r%LndYZm"uKpLe#SjOW87P*-:Bb+ZfJI_@:LF&8)]p_@<V-_Sj<;`m`rlA4/,+$/t*'!m";c>X4nh"d#YP\:3*f1(?L?b2^o0,c!%o\r%a=s;!(*HBf-H$&Cn4d/@@6uq+dT2)9k0Ugk1JA(b^/+fTo)p6C'-bC3%NnP7g:0QFZ.>mb$"@i`'E6FkCdJ3aWPX=3&k,ce6Vr.2\r%!;YqRLcXq/KF+FI?iF@-Kh%M,bDf#N3OI!T7u01TSIoUe4B7b&>`0J:R#kQU:k]2r:!!1\F/52@4d?@V6OWQRT#Y]frCqp5:U\1J\r%,7,%#h%C_o3E`koTbHI^KpB!DRoQ#WG%jrT0X!O]JuKKKQe$ZJ;]E?HDuN+/.46@W.qrU]2kIFKmlDtg\)YDlrfKM!Hk..+qoVR`\r%-!%OFSb70QC)gEdk,"(-$;pV"NiBJN[QRa14=$*bo[;<rC0%#4*(@6Y^Npq9S_:mRD7g?i__+5DGI5BFlrt`K%GW`@VdH65%?3>1\r%O4JOnl;p_5hCM=ckCqs'\:rNg?8fN#H6>4AI%9VT^LWkLnA_>Z7-,I\J5]q!V4WJISP8m/\PXC0Hg&%m3u5CjTN0mmgZV:g&`J((\r%U%&/1!rH9<^l[3a3.kZm?@U$\h`P/qa0ip.ok`sG>;<U3ITZPo.'43'Xd@4'i\ga>XlkElj\De]:eLb0VWbLc#=2UE]3>6NruZ)e\r%s&<5B\+`,tm'R10GJO<)o3[ngrn08NE+D;c@1?__W]T=]W-eL/FM7K2\[g;:U><bGqU2C3ft;1i`i%Q,dK[:@a#hb>k=;"*bJf#F\r%E-X@IrCm\gr2ILQ2JuT:`TGpq;,[G#MaZTE[<^BG`%j:J\ifqGNkiP.\+t)oU+UijLGI/lX\VQ.g^[%NiOfhfS?cfdN=?V.knhoe\r%T_K]_rPG!4GScL.IUQ6RC#m&3&X5WSkJa3C1="A]!YHm&*nHCO*IWr"?Z%&^SJH=0BqMj=ooWOUiK_h2NS_Acs'PP1UYP?LZL%%<\r%.F!lN#Hm`F@1,CO;Jp__XQ6f>n(W>?Z%'Nkr9K:>kC'VaX*9jXU1Y#LSs>mE`5>P;4$.lCJgG]&"g87#>6Ir5NgC>]@ubKX=$Cj&\r%<7sMa:jM!$e2AY;G5s!+^cs=L7rT%?*I6m]iDbDE+8p\g?PjN?Lq>12KCcDl-f_6f*R+'DNINHcHnSGQ[KCt/+mlau(4k?b?e2u>\r%qYGh/QfU#^1:];bF8S(9U=8p/G-R1<4VY`o07O]b-i<B"h!ji6c>?SAi4gOU[mi(--HVf\Y,sP$r>j*RJsZ7,WSbe!q71EJgR*D]\r%W\=Ad'_)sq]r`[ij<'01=aIG(-_E&mO<0qY+?:6fk\EAXWrVeI=K[9O_kX)V/RMPKRkh5BO<BG1Gf'n[G]OV!nV1m>\1.fD2fqu+\r%&V,&iXI8,2.faSCeg^\l"^j"`Gs,Fp6u0kE-Tc_J%lls4$Y.C8397TI\NDDt7tQgIXC)oUNntpLh5;r)C()geJrh4Sc*PA/#ssY;\r%3Fe".H6DXZ/KmWD&Af'$oF!\%8(Q`T9?bf=QtOJPShK&3NlDAn&9:0SIb'm]B?2edr;*R`e605IUMIrur_<&7)[8;m+Q`fM3Cb4S\r%<5,2EbRo"K8^*;>jJ^I$=QCHQQrA&B9QH.YbaBA0[%&?PF5A?'Sqq_ZA<q9>@SRK&jW&i=_n8/k3Cb4Sd&N.,c<8-ApVqtmaAM=u\r%@>['kL)f.rD+RZGBdiIrCD:/FU/`:NbV:g4ple)AV5#%!;0[!Aht/4).M^==o)>d&rF1f[??Wce$1Z3",1pFKoJ*hpGkMMn^BT"E\r%ACf=:qN8I][_$Hcem;_8i)0Rui_CQu.CsPa1:m-*m^GdZNM+8'2`=.?C1IOA#M5Jn&Xl!@36-9*')`'W9Ri[oPit>&#2(&gfA[Vn\r%o,/gKL_AW313?=c)C=E'87oLT2+PbH#5@4SEI*C7[S#Oj2D&;)UP6q<rU741>tQXa`g\KfeU$ZK]9nMK]iWOg-=?(om1_UfA(.$=\r%.T8E-3";L*W\S[O0m$Q?WXMc.gkO-;<LHJ0YiE@k[m";6Qe)%-f(sbK`F"shp7Y3W;=Qj6Bchptchjrq5.&h7rBN=P""Ql]p[643\r%L/D2/^)rR>mt"LU_17SCG`Q(^`-\F=mf@s"q-/Dge!PP:WZ?7pf3!,h@n+L8aJCdtdhkglBO,,VVQgLh82U>,TcmKP)6Dn2G*\F4\r%Eq8C:iqV`Q:1pZF+p\k!8gt;ecQ":]oh,SBKn;hsM7Y0Q=&nP&qd_prM]HGO#Fhp5oVG>rTi!gQSfsNtr#9;HbC<-jS;$,LQ0KsV\r%Q"JGZfr8Jajl8U?-Ed_6?UW(V[B18RU(`$Q%2;MYXc6k)rp^:RV3E&dA*6siWXDf_[s5G>\VIrj$[O[7DD4Mh.O3)#m]%f'7&Mj?\r%T@%,[dl\n3-4_=TBhGgDBq]ordGBGcZ"[ZEDZ?5Z^\.mPZIa#/\p&hp[NZ?*Im/tNDrf;a_-MC_/AQ0Y*aaXbp6/gIPPoA?gc*m<\r%ids"t'NZ:b=t'F;r7(:Tgsn\h'$%-!gt)%-BATPDG76TDc3]q`.4E*k-!Q!UCfPAF.sX4f?:Os@Vl$LVV^(B)mbC!r+;u>?R%<?j\r%X%4A1'MfZ"Uko:W-/\E02\QY`Pdn.lj4/k$6po9:L)_M=M5F'iKZd5URV7;?J%dp'?U&AoFXe1hV'dP^Nc1#V/,\@nM$1lA<HN3)\r%7%/ED*N7%7Ob.8D,0;U&M`:Z&=sM<\ij[KT=F>]o,UBrm-eZ@L+q80Q=)EKn,"s<rE_:XLFB"[L`LFE[a%.tJRU>;D]#L7sKK\HR\r%]!fL('8bJKa_eDH.k8&i;:oPG-CS9g;WWn=WQ=9YO[7-A:F7ii;j^K1&q(RNVJ&j@9b@-C@s8S\?ttS]d`]OFiGUi@a_\>G-CX)1\r%c8S06]Q24alEbCp:!oHro$pBY$]1)).JaoQFGG\ScfhkD#3ebG)=sE!+^*0/K&k!u$+Gqle@o:`*I9Z"72dG_q`=uGB&TDUrNF".\r%2M*\>/4b/%NC`,h46XTVpE4pXfZV148Fsb(cu#&?P;r!ug9o_mHYK8DdVlL9S=6TZ4$J0;@gfBN]L10,P%[?S[-rc;lS0j]1t\&@\r%Qc0#E"_R$Q3;QK$0N3H%m=^N%6eASUN)B'Id]tAW;e?>b<"VS'eirE6Sp*gl'D4O)-)_EF3fr_!b:rMWb&fs@A=uD/>0tMG6T:P(\r%*Zn3'%^"^M_?t&54^Pu-Wh(N`pntWg:iIt:#/0J&"3j^FXaS(4r2>m[<\&c8BgDAR3'2*B\.'<5`9BS2`qV!eoRZZu$u%4K9..*K\r%q9.1n]mH&&P6XRuIUqtk"&J)7>fS)%-Gk!+=Mj[A@L9hdSc&X>27/Mo8?&SsUl0AMG&!+]Q7_7eFrPRGo^A-oU@1./gWIeW]BB9%\r%4hkHdfJu.,lL;+R/4\7,9k0`^[!<jcIn4]7YieC\X>=fb!mNM&lV,#2`3tomosj3tSRH(aGQWEn%Oe\I2FDSkQ8V;3X)P2;0U*LC\r%0b(0)2Ps)USY>5\DOq^YTmNO@13D'L-cX=I=;*&5lQ^hs0f/FJl8&&iH+RSad)08[Fg76#X78eL^>=;l0]-L#DAh\(Rb(PR4b>\i\r%2HGQ_d/_8bb7He/K!U4`+Wlu#LVMfi_hY:UJr"=R.!SaR("uPT<46bpQq=J_*NP@9r9uI,._&J*-fTJhd;=6_8IQa$kN/cD@o#i0\r%if\qM04-6#Ng/CJ*($Je`KQ'10G3hH@uLI&&YCo"LlQq'OO62Qj=s+C%j*pJn3hZP(aHUu(l7s_4FG5f6oc`oo'k&_1>5S[/@2_%\r%*VWDc460V8YDd?u%*L2l;2fNp$mu88.08Bt`S>b6Jf*%:Qka&52].8j'dM_sLWLr*.Ik5:Hr(RjN/C3kV*@D4LG+J=8&\_Xpi[-=\r%"J]FlUe6<8@QIH,Q&*3I-\2+\3\"b/IYr#B%')!HN-J=GFPif4'k:V^dcsqVoV3EA_]BWJA'p<oiF=?n&W_eQ[pr?rMYZf3d;b"P\r%<6W1rB:h^@TiMM0Un_B;%j,D/_@uH2H2*an':O_Qb/;7a,r?4+@U>"ELem;KTmJOFR"N3#ZF'Rb"`k7M=eLnp'CeY>plHR*:W+XB\r%i?Q<#:W-UmH(6dG]$=fRVS!@j3-D`NrBYXupI-!OY`Jf%YWLbbHKkWIC\sj\g&>""IH5\a?&RrId#5(38U(?8Zgh6aLT[Z65PH4@\r%NGN22iS_rY9rtG=?ZiaLC+H`/iFbl]B<-OUe+a#42dbi?;@dr]Gn#0#roP\DYq#GOi+7VDXq.eIe0_EXW7dj0o.@C7"(5<<Mgbef\r%C&eZ$j]u4;JNmg:QQnoMIL%,]D2qH[H?R^O;hRPda2.9c$<*-oJOFn?`_7R?.1[M477kXtfj]Z>*Xb]\^Ja'Vbq4NL+ZfInM"o86\r%lHdAgXVmghpnSNf?m=S8oC/r6f"I.5QD'01/Gb'jM#Zqj0D`;/J,R7-LD-&2pnU$"GhWn'Lel12=$'?:qbX-]_g7V4H&60&X[I;i\r%NJ<;b2ErJ"ZCiE$_ZHq,2A,(9%gGd<GTsjG:1(U'[F-Q"he!!dH!5\=Ics6'oCsKNZ.)0VH#'5-JfjG@fGqDb$`U6rEX)f`^<nu0\r%hH3Yg='oM[P?a.NPLMW^b=1YIA%a@AZ>3?6g1a*+Z/FtJ7L.pl87c]_?$UQ6YKP$W]T6>G8)Z88#o@o*G*H3acuW-cqc6"0H"Ds.\r%mC4kMn_@RJ.2imaSeMY:_l#i[,J>0/L@9W%*>(X-?[RU<dU\@2a#j846K8MH<"VI]@fO(02a,524fAn(r0u,eJYj2do1*$VN(kmG\r%kF])g[Vf"(2:!a_"3IXqA(T2ZnmpH%pA!-"j%ZL0@.#nuNme6q/0_3A`ho'@XYt$uWm^ffgZ2<)N1U+TH.):^iP@a;R]EZV,+3oN\r%)Vs\o:6eCF/bIhZ[cSHWF>]a1+jM,^2;uh&.F&um6;29R&nc.5@aX0$Z)NF[cr&fh[AR-F3.#IV$&n+F1/eR`I;E]8e9;TaceeMp\r%%V>s/,ie_>T8?"l`>MihL"=<lV*tu7F(6NDknia;EL,N*FOk(2e.bfaJRj_J^;jL/<'e7`5BN^.[%Ec($HDA%gfEM@mZn[H@`\ol\r%F<P.UDUE<JK'4he?>?%drR(KhL)\j?N$TqG[+Uc"ND/;L^R4=Aru^SDCYU"S#&(P/3Gi<A@nlTrr316Ihtd6fU^'mH"o^,q9jNEG\r%MJH*:L$*[=b+oS:PtH&jh'eCH6hJ*S+IZTX9MNVMI#2W/%kglIerDU64$VPSp/lRVK_+DS)F<;?6s>S/8%>qV724:nQG$rg)FTHs\r%kJZ]oaPQ1*/oSVFj6MTkEah\aLq0tLM/=9+a5h8,8mgGVs!>&P-+),6g(-@]F=NPaTRD%NVGPX&oOK)RDd-coK_E%">"NESh@;Ds\r%EdF6SR\(Dns!XSS\,50>Q4QIH_C^?q?AKMtJu+;Hnh*="+$S5:YK(9UBmQB:aR,;qh"g>-cjFDmrr0d0:$;lVMJ+.cMt2#`[K[sC\r%;Q;A4j.npH/^NmFPVAV1QZ4D9NA>]bfgcD8Zr'WLX8*sfNB>\Gh:#428:%P+@<Qhj3!*FF[?ht']Z'^6eW@(UN]YdlEY\PBo8\3H\r%I(t73bu+eKZ3M=^ZfnjSq\.kOqWN[.e;l(*.2)rlOM81eWU5"dK_)^;A(XB7ol2'tEXY#9U>*1VmdB6&Lba\IGH93("g'_qr6lbE\r%.6O8obieJ#;L%k:>4-:K;U`hoI/m(1'=UC!QihSXV=+]JW@7mA">>o<*irdd&\P=K]T&i[MIuo"[khu2Ykn[pZrU=A#.m*N>nFP#\r%fZX6sG$m^?)=0q)k384HG2U\Kr:N2;3Ul)&7K.icf2#[V;X#h2`YQ>98[Tifosut\+,HV3IEiKS&BX>?ZD/d&0-pFSA0T\I5^(S!\r%#%&Xfo2:,c`5c30>^=/ccWkha-"F&s@X&55N-7;36IH3N5.b)OL7F&9k+YlTS---Q.gN>fYeo*U\^sp6)PMTJ#Ob^n2&o$Dqq5*_\r%!dO/KoP>S^[*SoO[Z;4[rm<EN4WHr,2ojNCPR']/']D2>=ZVJ[as*G=+^?q;k8U)q`$uM^GTgQN7p_.n9i?<lV*Ci%P!EC:A5=1#\r%X73CiZ=JM[^oLGu8Rt.mZ*qj/S>\M?,NMq-F#&1F98?8r8R[NT4\P&Q-ndNZn'V7_'CjeOA%m38?gi*?8WeIRa@CGc\*o[TGWNnT\r%km,nh-u^YZU`YAmdWYOpV<i"qWlrMjrM#/@_`u*Aoc&L2;FNoFr.]r=Kh(Lt[V)UApXgKiZrAO'FO7#4gH*ng;1G(V3%j1!k\_')\r%IB?/+bF:-0hSJiJeL2n6:pZ"-HaZ[a'G8tcppdOG70GN2FW-fhp?oA%g-fmb(l]^@S&iTFN\#N)Lh70;qlG-gOt%96%TDKef3YA`\r%S@WBE^K9.QcaL"2B:CR;\P@9KVU+IWpDO'Y_NE6PbeEU8:H1+UQM3(,k_\*n;.\dk(*h7:\QIk]jWDu]42trpPOKBC&`G^t"N+'o\r%=HWDpp('d4T.knDY_(t=<P7q8i"jfuYC/>.`;K:;'kHV$V%g0W$aim,(1d3P@-n>RCq7.jM'*I&5!6.o6[ObJ2(sJo+/'gPF*YV0\r%14ARJ>!^/`3R!]7*F=i<OXI+2=lh^[N;8)tiD?130?dc)/[Wo?*#@8jM1i)2-nR1Or_M)AS1HBfVqTtU8KHW5$G5N,Zn)<'e.k=?\r%IL_=O"a"h=/XWBRT[-6o&N-P&2VE)OJqR>c!WLbUC8:MCF7[Q$;iDX0Y/IAF,B#DHHOrR=d`]Z@cJDuTKNjg$JV9_s3`=KOO?Cm?\r%/mEGP*r7=,>BE47VSSuECe3#TSE=nV_+kL]NUm03#-2=EL1@U2#Wn&L]J<"iOEDPLG\)Itg2RPeLPq84$:o<&0e6A=1>HM.`2mqJ\r%b*Ffha[\HT4l9U<Q'IDs<-`?V"93Q)ki1[OoZqUl"Z=/Kb!3f<YqQFk.fTq'=bK(C;#+aUBXJ"i^Y\=]l.Y9l_W[":+/f-sSPp3?\r%?'.`6kXgH7T73H?eDn1nC$'<l=2Xp5rq^Qp!.E\_3`rt_rldXc>=LY[Knl^:`_%8TMWNp*h<?c8H+Zar46dGcS1rQ)RGnS"#$Ke1\r%F0*EfIn]?p,,rV'KGP(EUa<a"Z0c8#Kf%0YXqu7@q`hkrd!LcN\I)Y^FuZa@R";J>MKHL'CQsj(]F$<:<$+-;nL>Mb`:(a@*3[6B\r%L,&]@eT_f=0Bu6Pd,S,(7IJ[&#?'aZ`lN:^!g!_Uhg_U?3K.%-^^RknZ`t#XHE/L3MmrlKf,MbB/2n5:eWoi?X@`X3l7F;gIa'RQ\r%:rlP*eBM*5RbO9_[[f.NQ0`=lYotKm-Y3C$rS)4aD5%OJQ,^MLDfhUdJ/5bKNi_rCnRjV3$*#G^&3)s[<RS'05Be\bKep:>51!r1\r%lr]1k+hG58%X0f'@gAd@O("lcDVINC-$Y?Nr`VfP*_OoQrm1h4;3N?%5tsqhl6SA!49r<KS%GQ[qKT:tgtXdbg^iYQSK&Lpli?Iq\r%kO!/lg/6IJp-oD9Q"6F"7O,l15c(p9iq7!3H9PWl-4j]_hF4J#QJ+-.3ncj2D.c/J;cu[P?eadsp+stQ`P/@QYgoFBn>)Z-G0l68\r%WT2&Tr[5+@>FP)s9oFGO;kuB=.fW1b775u9WVePGS0i:'=SstB(F)R/ZM8(4(,NAI+[6ifBY,`#du6[t7`XbgB,N9qhZ7F\Q7O9S\r%/;uE\FIqME_bt7HO2n(PQY'd5c<rM)eaF0o3]!ZnK@5^IFbY&h]lbZXUhN:6lV.&kK@>c1eeoKF5-/o#T;0Ypcl2/M1P%O1aC:_1\r%cGI+rBCN'b/Bo$g3ZHk)7ZLH&c$?K`L971mn)rl-FL*Ypnr[@39RABIb^*:CNo5[$,>r#cRTX"h.OZ?g>Z5:V#l*eUO%^h0^?\-.\r%IX>mL"=J@kBspf0%b`tT>P\ufh>-Ge>BJU@qC-jrpIh>c>O"bmUTZ9X^E"a2L.5WMIQQ?*_D`*ko%Tl<`P7Pf39CYIG2ELIDNeRD\r%O&<Js?i.)rWc^lj1^7bE7\N7YH!t_$S'W@@=lAa)$8(R)q)#GE-F6B)+j-H%cG6am/HV>OS)n&u)Cp*U/G*61L";DqH6#lg(&-Ko\r%(<h_j&R+mf"j&=RNfj`$`sG-g1^8.s7\OD9XPEdJ;UJ3N=_:)?LW5jNb5[6U,2TGO1Q$Z<MLRF>d:F"2QNT':Vjm5p)B3TO>"T1i\r%C<$f^$&?oMA=3m0#"=_#%^L;NOfshD7l[)r%jK@>SFOPh,L<S;Fk!X*Tf/ILT'n]jS%%FrQ#8ZJ>Y42&T]%&"qWO6UZ.[N.XrPm/\r%#h^`cat_`oVOE:tU@aO<iW9,PaBoVRgNKXd:hkSqd;%/,='qC3QeM&bmk0>iipNnW0g!Nqr[FF5NB&.tGr+M#N=(Q3!E=]NJbLg3\r%K&&pVN!]I^"GVA*>1Pk^/fQO2Grqe<Sp%S>cSh!>EHBu_CA7DQ2h53%0>B.!p7I7[[,/O.C[Ss>:YWeJa[&_h%5HJGgqH;UV0VPM\r%qh06h&l(c^pL!r1DH^2iA*%-2R9#V"7I+i&F^MPg:*SM;Za,/hm6%I$61d"?3*KIHl"(!=&1B(G/]QG%jef84T1ko_(p,?ZkiUTX\r%jef84'#6I87\Hum(1n=9#D&-dLkH\)aia2K`HYNgY_M[%ZT),kJk-+.\7DnN</9($A+?e/oI_'e0F*0G_E:pY0Sb\M\.%_NAH?i`\r%.'-hQ*"OQX'6u?@WMu"-UC0BIjeoH,-j5oi5[e(f3uaQ>5[g?L`X:iN:fqtfJdopiTWhBIk%\LJ['J1qoKY)8UQpO6YcM4BhASD]\r%Q,P%4(hdJHif:m%$>F)1(?Q0>`,o%G+GMElVR!LXE>PX6R**Rg=mIbQ`)Kd'7Q@1s,GqcPD!VY#11HTdXs.P]/[lL)[-!E-3/FsX\r%\rY+:X_RGMh0@bGc&O02_u5b0[$@ik?YZ3e"e-P9]$mVFi4]e)I>+Q,X*9"?[p>i=hf#+9;I$0fg*E##TC5Zu39ESF=5PGE'1LSA\r%DS8s!9qeVN?a#\DKO%t#pfSJ3YET?o5X36OQ'0mKS*M&@V9Ek8emiUTPr#XM&>SQV17-7?_b8Q2"ZpjlC@DOj4UGT9K2;Nu21K:S\r%]-'R*puI\^j#d%3]0)5K8t""En<0O2Q""!Xdo"kl9'E:6Y#ib.IDC=eHDT&bUJ3ZtLfp:dH7[DM@Q&hfX3u.oGL=7UFP#cW#H-R$\r%U+2DGYEsAS%`\G>M1[bTV,3c+"!<6&;B,Ju':cS-;(.!"FPECe`S;0M<GlStVo9Xa_tlcN^3D.B*l\V;,-09gO*&O#hO%/#n?1=N\r%7q2b<*VGdT9%LH.@`antD/<Xe\U`pcNQTl#+#h'(cam^!hSAIW0R)p"'Gup`]VG,,oU_A`>#4O^5IrcYO#R!*A2uY;O+bbfoVkUq\r%g';/k)RW9=_G90m[Kk:S?hV7Feu4P"8k<tb`JjqDNSM!^]!`'l`!>'_hPbP%a6icTUi*8Kqf%>LX&]/Z%9$/NH$rsj+%[?1PWmQ`\r%J_>\^_J]oo#5Tk'_Je;LFRqUB-L$4,VL)oF\J!@c@g8*%/E+(_Rk0+F"#Gd2&_"u<%G##d&^r3#@k>V.hPieV90U@Sqd_i3@X@;]\r%CG&YSIR25tHpjD7+YhdeC$</s7SGb#)5C>TZ'L,!rG?6e04s"WD^pk-@[Gr=R7h_V:]\gPFK(L&g-g(+CD>3a;0/th&CX?`#4DC?\r%iO?d88SNW[O0pY/ELWA7BAc9RkAXGTNo+_,4.A>@Uu(45ieDbUaXoa]Q`@$El/DcsIsF5rFHbngmuuq%%MbhNU($.,r?XNqFMKPg\r%??.&[;]m>H<!4r:(>XfW/&tk7-e9B4g[2FY&fooo"#7L";X5KGGp?gr")jn9cLjUo9K.e<Jf#L_h;kEMe:8&aSabKZ]T_n<ed]pA\r%KdWa-?92uP'u\s8ojK>QNSAfaN8JCc`9m[9'Pt\Xcc1fo,Ic_L^0<XP_$D[2p#bT$k1Xq7e@.TcbiWb`2a6'+UtsDH2;XbX4?qPA\r%'fms_QY1UH].NFD;hJX_goeGMc*rb/V#G!CM8nLho<+:6AT%,tDu._nbno9$4o9Wo(.NPQ*[j3rbt8MtgR$Z_o2JJr>Qj;6;<i$W\r%Ir93^'f1Z]/+lN&U*n@[k3[0bfW]\gmn&_\dU'K6lSeJqcf$5n!,&L`*e%Bre@W]f@X1].oB2_n[u'f]p[g.>?;#^hMf8R,db%c1\r%[OJbF%@s%M?/D*"eKcA'];XFS&;*ob!rZ8Y52g.'"DaB>[/u*IR;"I&))i<N3gBs2lAY4Bl=m/WSq0D0KA=#>*.4/%6XatVHWjOQ\r%'\hi=="\R:b&S-=MugYId&itM%JJ?`%W?N#l2@brO2/*&H2(E&_nmCW>OF`GP?.WmK<Mc]me$i"D/Ubj(fKCjgrM5]([0G1@I6$P\r%f431XM=e45V8C1#6[Cs(qnTHjK^2()l@i[3_+kGAd%X#b\rU"Y]Xb02CpD_r'%QS(k/LTrUKb=XllTPt.4/>'=#.$2,NV*7Q*je=\r%P^0:b?Q#kM;De:XCYpY7g1;8n2Ku@8l7qN4SHZC[>+Qm;pA>lE;(V_rc#OS2-'dad2Jf;8`uEim?^!`dalIBF]r\FbmUWiY<ku&G\r%KVu]`LFE<sISbLkN1FJ=9t_KLF0LumPC*'tVl=&:3^!]gEoZ"%o[XYd8;leaOcrmb1N6TTUOh]sr%LnC("TG6H3Eh9'3pgNd]Ht^\r%OJ[;VY72e?gaOF1EM-^\\RX>a&Aua3R0JH4Zk5iqZBG!qfYQF(+PPWjgKU\nGpBdM\nqrt/!hj!cPtCqfi`VTaPCd;k+-*a^DL`W\r%dme3#D;#8t/f<`18>hH_XU[R66oo/fo>p"a7U]"C\0m'(2^1,e+K<5.c:_O#%V(p=Xf9(7"Z'21[MH3K-'6b_bbc/%+pZk+bbg]Z\r%@HV-90q2@LlI@hD='k;g%VIYTS1\N0"325@p=uX\2aI@nU^CUFO!(_5X7:/&4Y9^EIuMr4QUr^+HbQ(S0E\1(r/)gXhTf`R3*N5A\r%I\Cb8rEW8rF?/Q5DX_Z_FSSn8+,rbTgE,[m5g*^\p^.5/.#fR@hk&`TTJmkA(+li<[b-0:7IEK:+uPB!k`RE&>SsZ<9E1Al!E67S\r%T#L%(.k>ZqXmTqH[iTu?paq:CY3a7B=_Y#i%@"ftU1/RnE()!*>TB_&@no-a*4Xq)%8#-?7*6(U<JY<(buBF24\"EL6GCt_nhaB1\r%qST=eSs?9jY\e]$ZCk0qh3bb\?SCYlH`h9p8a44S3s0^slrdh$f(I0?;MOi\X@`mM[,O'Bpnrcu/:qZ^^-[$$/b)UC,^.t.%o:`B\r%Y&aO+XcrTZ'&)+=>l-hui3!!q"r:0\[+$@hG3^TK"!+<imc$+/D1)Q[(Ve-.M`ZA6Xe%D2ijUk4*uacd@C2(q#s.pU96f6(I.Sd7\r%5$R,J,_]0i/2k*TC%?`-F6#(+Q\d\A=-q<Ek3@4k7aLC,&K!Yo6NCFM982A?[s`RimWM3LG>>iEYE\2HK]JtUDW'=oKhHUd`RY;d\r%Q]IkRj-/0j"<A&f*E(BkFDHuTXl[&[$?lgnRnC$9.FNE2q):jDEu+*_;Z7,'lJs1:LQm:@PXa#B*-:>,4Y@bp?XC-"cLFJhjkb_j\r%SI6t0a,c_g_Y<r\NA9ihTX".`_#<(?N9T-8/+-hmGl<okep>cMOU'`?O3:;qDPcruh&q0T1[*u-+Fejkh^cs#iUa9XqO,9"e/c;9\r%__6Ir7F^jC5"S_5*)4JW\`ST>Dto@M\KR&qhZ^LN]]FRI_Zr/!s,H3WQM&9Oef<u*]^#!i"L38s\bdb^d@8"/mG`kM<E.&6.%k9O\r%<(6%?;+n3:EB'Pc#`GG8M6&EPQLO2cs/N"?ZdE8h8eC57VWd3>i8"S(`"`0_'X0VcfDAV-D<1u<]Tc4Kd_FY*C0jLDkpN@&nLU1D\r%;cN?dYZ%k/m[NO\'`G\/7W4qY>c=BA5bI'@r:XB6_V6-cM(*a^..F/I$_3P=Bd_sT;tTZZiMN2\kA?`8T4DDghR$7]J92H'o^bt*\r%%7<-1AXSmjW"Ql"bT*7I%m&#k0,=2\ZlQp1Me/[dDAnTH<8?W4E(]NZ4B5175;6hO-CC0pT9hn-f_i[PO(B#Wk^^)HN/0/lFJ"oj\r%ElanPR!)qrT'0SCPfW@T+c-[oCnne0#8%u8@r<YT#]t=^O@0?0)'Qq^;\L1OYtT<IC#iCY?t1PsI\%u"0KhKAI\-B0e7W>Lr&g17\r%LYE]Zpj(0<PL*<+QM)Egr&f$k$g3`uioc^s>(RS35L1=t6?a9t0eEIe$1nVcQkk6SVPQ?uiTHUr>4?^bF%g@k9/<A50Vem<0ubq"\r%Jg%7Gb-PIpdm?-]?q:ZsqbcnT!dh".=$`g5QtZ8?VD:QcrQ&(ZVC3/R\:t#O>!do?4EHV#R,j-TT4cUD^eKWBT4\XJ@4EDSQkmN"\r%(@]@,q0D_66LO:=.*MO;_8u<QS4.7C(=&!:3*IFX?mJ<A][1pk'qL+k<oS1sl8G8gomZ*2Xnhdo/?J^!.WYDkadZV!+R3j,o`^W0\r%/TRK1Eo3VGp;!l=D:*Jmlg!iM-7@jB*VC_Hh&KA3kt;]gp2#06*7O&VFFH![c<[pT/9l6T[rXLi17n^k?hapZht\hHD%59RJEd<1\r%#qaU$/52QD4eY;*TB6$CT4C:3-/muIT7r-NTdR3<kHg,(e5-f^V"7aa/R7KG/^jGG+G#<?cm#%,ZK1jK9PBR6B;qG_@4/EQkHiZ<\r%?e>Z:dePHRjt@gG/9j>dnhB#M[/B'mmak-r+$V8C:M>m9BAo(YkQrih-&0hI'%3p*S'P!_X36/3g9&1)>,:ampjFo!YJi)I#7T/P\r%'3]5=%akZcIg`kU[0qW>*W?^U.Dkm39V2\UTg_#7"jN4h-aZG-ZNC'IJ-dgUq(01e$pC:Q3hOC1'dY)XKV$O7S^5`IO<H!Y8E[>+\r%<QQqg767%El`opm>,:amfWbcHTg_#7ATl[[RF!.Kc[n5Pp^&P#q(+DV'd7`3cY('-3E#3O$Ke\Q\@>4G-.^,g**k+Z"jPW*lgJ<I\r%c9#gjY.okuk874JmdAL9]o*&^.iqEsr[sKZ7KONN\6+>"$#It>)V!?[1pFf%H5B6;_9NQfm;d<R[$c.4'8W-9V(2rEVVRLM]o-Gp\r%63b40SX0\oMZjN`#[i9qCORTH$ggoKTqWmF\\eUl+'i_ljpi>PX>f+96i\0Ja;+Bm'mJ;<5Sbu@(+@sFaWEG)Ghi`Z1H_+LK<fHD\r%RWeX8/6F>)^]rCDQsD7VQDB'@DSIc)d)ruOV`O4!B]=X3m;d;g_7K9&f6Hgl;ct'OVf/H.JpHG(-+e#D8L:2T*pQ?a;*+1\S!-+l\r%fg#4",\!Vu'iO7L\OF!pJO]@eU.<<Xq@%<.NSOK\L[:7)PP=[[MC3Kh['Q%a&kFL']k!Hp;SbFsb*(R=]qc9/k)s!O8Ym_hR%P7p\r%2#?'C\N>hJ[nfJu9IY&I^gBp`mt\hgT_m@]eK#].I.8$J.7QmOVoN-MU9XV[-De<&j"COtT'B(sF@U[/MR]<HAdKXeXgM9jnO3a5\r%Zj:3.ZQ](1:L)8O.BJ]B`<GRm]i@"ZA]]u'N!h[W(AnkFB`6)=q8<FW1/"*`SboRKEC#B(K%5)KEC#B(njqP]$SA_al'^u'q%?,$\r%d.,MWSKWTpTOYYq2jqN10'JC"Jf%'acloa"A&UYbk`ApKMpNY[\uR7]f!o*!e(pkrMaq%!-F<Da+U])P>gRKe^sml\0">*/h+]@<\r%9"b(j@DC&(%PF>Ii)R6*FB.%Ti5&T?[[8P\D(+jBF]\0S84o,/J<8gDe,o.8HE&Ta6mZjG<H^b9iS?p.aSYk#?\C+="%5s9GP?23\r%@j!jDX\C'fXl$s7!;(toXV!nVSQg3j*kE`2Csa9o?CPh*l,rud`kn4,GBeIAPu:DsU6H]^88a6-TP-)Ih?bBZK#e@G-\r>n<[L_c\r%]6VVW,D>?a%c/Wh6J`"mK]oFHJ@sLSleQsSHFu5o]GP6NS^5L%V-B=K3"<h@-:Fmu9:Tr[nIeE\:uI1WpC%_0-Z]6kHGTp]mMR@Y\r%dcLjUmg!OH'\<B2Zq1VF:j_&UnJItX(n!6IPg=Nn^Jff1$q#T&dRri19+&_T=Z@C/ZQC0a3apd?!0.*VKh%[fLAuP90iZ+.@@]*,\r%A&'o+i%`0B5r<`$pmVVbo=K%G'9:(^EJ7oHq(LTL%(&r#e-TVEL;58*k-&LCoO*n.:sMgEmWHA`Ne-hOZus5f;S]qIUijNkNWJmZ\r%&9YkPU3^>13^DQI]F<o&QWc+W/r@Y$)-q-S"m2<*WGAY_ltQXKMa^Vn>d*LCj*Mo[p7n`'`i"ldL8mn[U]"qFf\>a\@e4oQQLh-j\r%`lAT:m*$^LPK6A\jXr))mW)>cD5e1t\-1?f-sp%oCZn<t9:@!pCDV_HN/!WqYO$-'ZjXqJNf[G/.ZibF0&W;+]Fm:f`8.iG]SrH)\r%*I*k"_d8P>r:#=1<!*FeDd%n9(>ZESC%IWB]$W8cdJgcq882ef`n">]DKidRK\Kp4m]>blUHSW_Pbsjk81QmR6(dNmoj<L/-7]11\r%7`*V086Hf[HS@!&K9VW%7mEB,@30JO/]3X7@D14-h9tn,GHMYXBc3_J$pb:jbP8Z,XgH[I@S*CTK6#u[+EN%N'&CIoR!=sEN?peR\r%(LkM35rH)uS"0m1r2#lbEq],/s%,_tf)XMr<67NaQO#$lW03!L/eMBS7*3BZ0,D*1cARf\J'lSk!>CW>qMTgr9:lslTDfJphb1oT\r%>UrN/M)Cb_qka-uo8%Y3JRFXQM0gi+`uh6gqj?ZrO0FWP:EZ@+mlp14>inu*L"B"cVrS]h9&)KJAS+Ose(TtP&eAp=K>u_1.Im.)\r%]_o/*98UF*h+cI>(MBj-5gT&@XH\$G<0Y>r@\%]pY96<T!q`&@k;N!BMFW&LiQr_0mqi>(4sVR'*j%&B3UnONP^']Er&F52'%V[J\r%O.MWNS9PYc1memdn&KNF4ALRVisQ1c)73t#i![q440#!^ok^GRNttc!CbdS&bYim0RWW,`P<MS%J=[:IWOPjqSG86oQQj(C9U/Nq\r%e&7uNbcFD"hgV6KrFu*K^P,lu_nVLA-au<\Ec4oRiYD.4^8.6P?R;g63O?GSIX@MZD*37H:ectLc[FEdRm1q"8]3@nBmMu"6U1B=\r%<YDb/:qe!3LT1,*>3B2ahtp;@>Z0X`gK59(DsQ]hC:po"8$'dWW\)r5V]k53@]6s>VBb9c4?<\A%_DV"9;!iUkhk_;E9]/:4Dg=I\r%k'1eI(!BKm90-hML6Ke=!HR$`c]/Ps%rQu7r=E&k4F"'<RK9o!SC=LM+;1CkP-PX%8;Q!Rd[,ZTMe*C`q[b^PKiDgP"9]#=O[Z5e\r%KYp%j,)]>Tk4\s\Lb'f>5pU"bZHSD=nt\97G(#dLo`hO_?bmP[C\k70?*;[10$+6;AV.uXnE;l6"saOnJOf`p.Ajm*#oulM-Sok$\r%&^6LH,0.Ko/aaJ%RrLsKZeuOBoV<]=,0.K/<,KC'F(Ok'au/Z*cdN+?4l_R>gui8c)Y7r=oNe2i.OH>%LCHBFVo\\&=q2ZPcikIR\r%j,Rf6nI%I"E2s9HO.Kf$X^HDX*e!7.0IP-tn7[_AY*F'P:F@/.=+7%M%_6<u5!Qftj8AHE<QtHQ?Y]qA1jPE%YJB/uh,8DH)C.&J\r%UUWT&^%..%L%T>)U\JVSjV/a6>j_Mo8^t2gN`mjj+u",5D':(ufQH_j5QDf6d!%eH.SlLZKJAgZP^Z^f3pjBAfMYpF>b>$Y1Q"HJ\r%0O)>760>L.[%0Cl&aX.bo3S*9e="<#i)@)N3H^'X9"`<44f?Tp:Z5-Y/7/iq>>"L5>]cGr_tgRRRs%.K5A`i@npn24_/j7&l'q;5\r%=UoV#Gk<QaO-p<EHC"NMbg^i//3V1'"Cl%/cfWW]lk18FN1$Y5;"gJls-@5(G;/Y?-[se(\7aL0AQ^8@CZ.bPbsM%RT4XDf>F'gP\r%6)oo\)ftX&qd2OSg>jjKS0sD2ca&&DZ66IH/Dm3C4mDaN/-ijgnEjA%IT'&B$o\uDkZR&3\-qS)p@ln_*o7KMca(;00Y;,RHC"O.\r%1N,4'.5'gdP3YdVet-H&9eM6t%N:Zo5/s1*J,]rE0ePW4e?3J`Sn3CO%9#0l4j+CUC,gO*rEGTH*+S;;50hGK+33:?AN`h960)f$\r%]>G8DIc5iN<6tt15#MFH0%QGV]9(I1@Kt&_71Q/$d*ZZj0u=jK;UX+\_oHPEiDc75AmFb?8/\\F:JptbD%EoZPZr5]rK>To!P6jB\r%^:NohOT$*P\&h>T/i5SOdP%@?2:Bo+*+MD"(oPe8j-[Fq?$=qL"JoK%)u-@(^K(@";$X9*S]S\@3/D.7nof-J?dS`cBfm"-4Z.Eq\r%@6>-+??cq>B6qfg$Gt;BWDj=Ui'_e4$dN9(C<Kt"_4+b,[Is;mM'^TV%Y<@)f37ZBK%61ci4,a<$GrKb@oR3dT,$?V6AANFr`Vs9\r%hu)#j6/_K<>Q1NVY\nj<QBQe319Cgr>97P&?Yc@-_F8=X;!3l%\dd-N3N+MVs5i.f>YN0$k+K0\(S^Lr@MENF$\=1,D-=943?+c0\r%/N!oKWi\)D?GObY/9>"BI)i<C,0]S:8CEB1EnIA"Pks?_QV),jCFusecX1PV9<"g].CZ__Oq2i-JTlNaA!CC_^jN=XgC]\)\++'J\r%\D([VL'"LL6l71bs.!/P55?h(RoOS;c]ne\r'=%_9^B"RW`^ec=1dkK_fW@dg:MFs!PP!T4B^e.CoN7QIq2#;Q2gS[n[3X(aus\,\r%fH-R)`*:_(LCS[SLChnelK!]5ijspBk*n?+cPrmc::e@eIGPNu_mG7fcXU:_:/?mCL[g^4/Za#@P/OgjBOVF`ft#r(^o1Nj5CVDS\r%(V\eQD@@uX._+9A(qTEbZQNQA@;oc0*aX=B]!\-:Co!^Y`FGfo\'k*!mM8%A)0@60O?YrKZ!->#FZSs)rVBhoBq<+"f15@#p$Ljo\r%JcLVFJH!ki4l$uS-0Q#AdX)X5LA?/.nbtCjeSi<>9*[Z/qfY2>!8aO2&7f`b160,)r@HmE4AH*O8Z"5H$F8Ia2REahIg5JDfPNjN\r%2p=^0iHsm;]mKFBNAW2Vl>Eq5h9*g0Q%C@'_:$e>II1q;)+BV#W+5bZJk!d%WW0hJ_TquY(2FEGd(Jf9YGuf5]73]t]d`H'(H;7@\r%*a0YXr@J7uM?iu1)TQ>ZQ7`ZfP8$$r6`jX#_QS^l.3?LAQtHjCe#8YB.K/H4a+FoA_g2(Y`<.s&j`H<7ih<M_<K;i,nOQX*)n[U@\r%C9+GVV8A5OU$9]JC7d$k&""()_F])P4O?igW$i]@=g)m/U8)tk\YLVcn<T=PNDp<Rn\@=DgL(tO:c,$Q6PQ_d;`p"NQKDU*'ZG^g\r%NNb=_`CtieH><5,Zf01IHJ^,!*cN3J._S>--"``4phjf:&i6PF=#n!4nBY>0WWY-7.bID1mWPE^\c\Yn=BYq\!0<J)<*deijf@QA\r%M88?'qd0E+Y,Cj+LY/k0CVs[_6VC_>D(0^6"]TR1I2/I+'spE=mA]s$e`oIN.TJe2qpGq.^Q\V;T;jDu=aYk;kVC`2&J.#tUJ'&h\r%OUsTJUC4iKn?TWaA'R-a"m8u9X,G-a_CcA(eQ%[,PDs`:hCe2oY!](cm"4hO$@d4?90Fg&n7N!+%>OlK2uL?0nAX<=V5C;'psZ!?\r%VNeem3V]"p\d$&JSLlj1q#@=P,.s"LUM<ILn,G_S#/F!#rYt]rh8=Z$SSF?OHK'ripnXh[KFH$lWaB^amc`+312o05T0hW)JgV^o\r%FC*2+&D=<)k<(,WGX0<jpa9,&@6>o'1gHpb]FdBt>G\u>.*_((+$D-8&(0Yd+^q/U_+STq`,K1oRfkH,(8/5;K57(\NtKfXZ8YBG\r%(%-]G/da^18@rU8*UMTmXe`<:DhhZf?u[`7,Ye#nAC`s7X&$7<;@WGJHre3&RadNr#'0UL<Mm6pCeC3Igc)bX=%Hm5\ggkQK`l&d\r%ImL55KZ`tZP1Y6!6U#p#h`"IQVoLfoq0B5`3_b4)n`AhH6GAa=/*NLAI)oB%N<5&?am/m+0nbk6]cq\r$UAW,n?:o2Dm<a_%SQ"=\r%B,?ecHrSN6/,eAB8nn8%)nT0$<C>dkp<%oE&EW6<fEV0o+*mKX\bkO=_V@"mOiu8*QBVu&D7L>73^@%^\WFG,m'csl;,>`CV&FLs\r%Q0.UV<Ct,0L;n@YXh@SRn[?;PdEU?rX0O3VOZ5GkTY5E]Jc<nl#O0mW#28Ea6(75n]@(dY#%N/?GpsF,lC3QpeCh.u@!T(89P4`/\r%f1*^,0V'dYTo/7S-^;4.i'W(Rk8qQ3`bquDbW?oJ/YcchR&Wdj#pP,J!Q2ZO%GH?k^Qtl3,%-5)Ck<jcbQ1)uWam47ndQE;UH<k4\r%(MU\3ec?@f7i!jf.#8!<_r-((/^i))4jSX%M+71\k9:3LJpNDUm,?K`F-8&BEA!b'_n3<8Nc(BQYN#G[pd1coVuh];MU+&tc5JAF\r%Xn\grL6/kQN#4;T$mTb:k5pC>=!_"b&8C4`L`piT:huBhNu0VW$r&XE:W/>T?jQ@5JIt93J0E]",F)\^@;*0F;9:M/I\.`la;cl:\r%?S!m?a;clj<deSuE9$Yo<_NIA.<k@;@s_*-CqrjY#pP,J!CQ/uQY46u3FE+K]R^Y^k("VPBEgm6f`Ho?a69Ofg\[Br'0dQFHsSrg\r%Ph$a1HlfG=)h),jN1]oC.oWQN/?Y/n_:\kDr7:I%f82P!=hr>Fm'2X@_WU\aI4R\;*^P$JFf\j.M]nWL2kNeU6TK#4<@SctqAtC2\r%BleaP4BdPAiZ?;/]nL>cFa+!K=EI1fIa5roSYas'5[/Ch?i(h^JDg/W*$-Lo@R()a*Z0F=&%n[fSSH(d_6%muN;[:FkV:bhkO+\_\r%F1</'hLkPGSp9p(oN6fE1/YGhgB2+1mF[p:VVN-G*6["()[S#ThotfXl^H*cUN3Y&6OW8Dhj>3[r_o9I/@7aC<,^HsQoi\g&H/#'\r%#172ki];GQ.5_d*Lr4Bb)ttt$MDWjGa?Mk&c^44_BC$TC0\-&o.@Ml5-MJ>e@P%7lZs+'PB%I^VjU=!1-7l:!qMJcp`g*qaS).lM\r%FpJ%Lh5p32JJS,5BFXqpOF!7o)1pV%&>A:,E)g)&T7UrI"17/Z>dc.r.u&M!G$`1P>^nT%HoTTuMd1JWHG8^HCu10c='-d-rV1=\\r%?QX3'adlP-1QO$(m+;2je?A=Bk,PnLXM",+*4p%uf#]aQPTCH/XQ['f($<i^[LU[!39oU[-^1'Q<[dV[91(fpen@qN$L)8Yk$'fc\r%?D7*cd#1p1)OZmmk^1NZBnb8^T8H]@:FieHee@T]M.hSj2j0R3"D'lg"f+oqC2#(G?=A_[<X<a^[(J_O>+nEUVW&?=dgGWWECsO\\r%4fqQJj5W_XE3m"VOe,WFDf5sR3RL)u+[)r(kDaO-BXlIt"muL&2gYoo<Yg='b"U0$ZaYIb6-CdS\$o>U(JWeR\L&"YC4aITT:k.T\r%DlIYFGnMsh(:4i)OaGuP\^\!58UUELXRGt[lh`G+U&/(-T=uu-hU9gmOn='iZpHnT&lIPQ8Lk5,!^L76U$k=m/#9Y`*;YAF=86,[\r%aVDTAe7aQ2e1)oLd*2*Fo*X_rKrRb>it^"k$:4.0nd=VqKof5jFGNSZJ;AH+9.(cWo*X_p;dmomkn"X@'>h)=BS_SGQj^uCA<]EH\r%#bdeP(fc5#;JKa,_LMocD_W&*k))/cLq<kI."s4k>\J7g[@SQlk0grpBT'D(A'l<.0pe>+$mk'bMRhY_3K`2C.d"<Gb$/%*N!t)%\r%`E^E0r^_sXGVnOc(N\P/0@2K0MRh)Oj\sA,lS6*VF#TQo^[5GcM?n#B_:'gl=j6P7FE%7D-KsCM:s=X]a\^4sEA<e&L+d]o0BOHl\r%!T6euL$gWkbnY4Q(Nt(QV]mbUd^o^X/`m,JJ%sQj\<mZdq"@ca,;/,qrQ%K]Ll8h5ZdM!=aK_+*IA7XrlCp&F+EnF?lCp&F]\B]:\r%(3;d28LUWtb32/^T@E-uJ%T8D`]cQ]6Dr1`o=I-?/r1=rgb*::%e"V(\m998L%i4WQK2)UbKO4Fn[h?J0"$lnXPZJ3G+%g=)905&\r%m93*la.@/bI]HlN].gT'L`IYm\SNdEe*Z/A>YO(!6%`SO9h.4h"hBQ\I[=Q795^:m"#m^42O,&,SBL_&s*q77cu)!,h2Ps8947>&\r%8DPn8C*;MU/pLEOpU`uP/j\P=JooJM>-hbXj';)N2n\$:l?3@$`qcu_W<B6*IMXud/HWCSc&RPO],]j93p,m=`GlBAGsap8EjVl"\r%Q#jpE]1aI.<CWlTC42+)Bpn$[d2UgN<E4Ed@DcSpV.E2&jjho7HVI8Th`I4iRN$\dl>fB\Ec!FcXn8p*r-gSK0.i]k>kf0tD*IS-\r%h%Wm*4G'tugcee)T4PT9na5tFI_5^Y[aRUq`q_lV='!LBH?<+V3h\cGB#>ST5C>u1*.qH^1o"9PTZ2UgOQe&.h4hE]\Zt)s@crZ'\r%%1d;Yp%M(b?hcbMQ@:0c'UR3!T.Cu&d4NDs(=)RC+5LrGDAaF=^8"nm_(E%*i'+_0c\<6(2`a'>2S:0DdG]AWi?8Lf:P\,XL0("g\r%mMk3,L=[lCFuha(2S;>H[F*r3%Q8_+1Y-/H_o#)\Sds)9%?K#>$QYft)]j;pk3;@Yf^NRPjuq>%qK(OhLZcp:a4C\(\&_q($=)A\\r%TW'!?*BV+L,W4U74<%UGV8Mn:_s:82=,8Uj2S>/MZ`VW#Zf/<hD[.;S2]J@LX[4%VlY].[]\iELhIZnQhUg:qoh,[rg1elZ<SH[9\r%V\dNI#M_/#qN7Ru!TMF*B<0]L.>'I8iG>2WD$o*Q*!D)dA7t/C!*V0:=7`4QG@*VJ\ja*qiO#`](-MZf88p)9c\ifA5Wj./na/Yd\r%b8.++Hp#$&h6M`*MhU@]V?OmG,4@-p2hbh?TpWEQX0G?A$(1-"4)W_<@cB4C[LaI-,@-+"R#hcurn0Vh;Zj=T[LbBJpnS;nA.*s0\r%7G!';0uZ5O<18fMqAZoY2]L<+'>3,TqGpsP\E!qgW<#QS7@#/L$_j%7%*fG3%CPke.RscF$`AEi5=Z!>Pol!W:Q?"7:jS9Y\f;kU\r%`I>eW%$NoE*22Jb;Cf<u+]nN1B9(>.TC^>?rZ?L=\WFD.[]^eiJJnXl+c1<&?H"NTQG"m:9C`"rGpba#@4%DqjZE@c5'rjfMNBT=\r%T6V>9WF9n%\m(89FIkiiW%*Q?"\s<fRfWUK%'Lli`%\l5o^19VKOI[t+XDX)aGNeaBY&1/G9*@XKbc#Ed.&7iYdp*+ZVK`#q9$K6\r%6:dctQ%]'WKJ<'^-?>N0ff75pJ&/ti#:VkaTH`?oI(>K$<\_Rd"]"Ft_P,KTFdCW)KO8M+)@>B2[drIFXS,[h?<,?B\aSeGmLIKs\r%dRVG,m[I^ECg<*FHO=g_i-R?6,'UR?jUobtTuH,&!f8F'HB6TcE_I)6hAWC9DN5\u:Y&1:j^iT63uZolH5J54`7Q)Y&mt<#fW5NC\r%?cCKa2CVqPUZu.s]E9nJd=;pM:'Qg&bs!NPl?],[EbG^]:41nnK!di*(3mQ@53b&s8$1C?o^b+X**s.[Ge^n^^8XNjmR4aO3k5;P\r%eW[`!okCtrL4e6+bqgl0U/[]E:6OTP(?'pLf&5ho$X7Q#6i_6L<,?3ceh)<847&c+O"iIGB7&iVK(ffX+(iZUU$]tPs1k&<gt"3A\r%&">NpY&uIDD0N]H9:+YX:4")$B`$&EfNf\\;:?99k$Qo#*f`D1JQ(D`K#b+LGe^r&[UAA"[p5)M(G`-daOXaK?:YVVR3=`(cOWgq\r%5nil[AnQ/T]N/nfGC`I`T$RU"n^&V\es#/*9lTYK/!H/E1su!o9MA3QcpS-M:'dL!hR@lqfU/0kTo$S5jQ$VA5R5JjF#0MH[a39f\r%[^)[(^EC-5]ZJ8/RK0W!#u1OL*)_>$!bd2"$TjQ9-T"-T=Ep%Y`HhPZk[-j.c-e<6S)1qRCrbJ5ZsCG5%3mB5_gtTKh4^=.PhL@l\r%1Js>DU(Y09/lEi,Iscj?I<U>g[o8n>Zm`(,<-Z7hT*Snn,FSnWMGGRu-@h-h\qk2@itF^hK2C_#M,j3Q=p;@G2`K9V905L3h4#?A\r%&4G*\\$*"#n"U:0`ar)Z#1!Z5ad]3d%=G@#P.1C?OuH1Q)siS?PIu0m'L=QaMU_IpdL?:W4@'<f'U_PL49]Yr:h:u!o)pu8N+pXN\r%l\7asVM7*edTZ7QCJ*GG"`Fm9>28hucq<.W%u%_*43<u`p+Z\g34jg.jNUWm#5cNRjA!A"lW1nohE1s[K'<34"HpEC$Jm2ek_/!*\r%;t/q0pH9g@E)P;9G>)9GDh?&,o&bcK+@DE^jGck](J0^rX5H_6Or-dI49]YbTZ^%"jsbNg=A%F473V.9@jZKm'YL,bN1K%S?1<$'\r%I+S<M9I+PJ[h!.CFNL!rhIh"rBW%J8c,=j>Fg>Oe5h0SXKftGK+VA./m'r#*Ni9WuT4iYQDid:*URT.9jBQkU8XQ$4GSrBo!Qgd.\r%QfE@5"eaF<&.(T3eIgU[%QsUuORnd<4$\f,E=-`54jq@])AU1fZd`5F%T<uE<Z$lk08:a2Q?),-bup/_JnWoSiC(P5QNqFOqiNR1\r%1]NV4KWl(4r'HCEk]%?mA$j=7*`kW?"YI$c%*!(BgC=7e1:'$`OVL$^!gH*2XQXX=]#OkN7c_'Ol[GQp<]2WGh'^!<Jk1WtC^6`T\r%<PV^^+Y1SB'Z*HF]03OBb)36+8"0XkasW%_hb#a"W;,=$bj\LS.mBE&:f\c"WTaR<R>e48Y$'*s%7O7+$?iR3#1$uc-Hn.e$\Q?/\r%&MUO(iOs5'A4;Q[[%(Gp\NMOI!ZmaF=jc7ZXA5ZZ<p1IKj!m1/:a.EJQ0<BJDCCL8g4oWEn(^oNftM6N6M,^5)_Z+27F,pn^b<[[\r%3XaeXde8>n.a+$>YPM$8.4H:5k#n9Z-aQgaC!.;KYs8Yq*63-].ek"2SMtkqF>Ap;cPAnWDE&aR6>rta%_iZF(;/$=8>RWq;^pJb\r%+Vh(4[)t:fC[M;(_JnMqONOEsBq_iW+&Xum\^prUO/&DJCP2Rr>%JYdY"dFqbq%OV;8eAu,LsADm&f&[>C8bN!a+^Bh7Pr+Epq@t\r%fsj-dfmXFCKRPE7l@6/oblU5%OI'm5r#*QJs6h.85?_tfFAe7NNNSO=I\7ALo[@[T9MX,'Z2TlEB):e0!D`G&>09(E0l-6tN&XHt\r%/$7^>d0"ZRQMNO`cQ%dnkj%K%Ji3-%bZhBsk77K.q"W:@r_a6RM9/gB,,jT0Y$b[%5r6`.I=g<XB0UEg8a!6\j"@nqN&u7>)L'SQ\r%@GJEZ7Q4KG8iE6PDN28S<[YN)?+7gZor7TNgjPEd3d9BuGL_-sQCYX*NOti`@,&6XS(JLVF8&Q*7u$;N_6S.6%1N$@bQNrqj,a@=\r%2N>'1giYuk![Fkpm+c`!gbk=%bW9t(_Kt_\_mFL:X`7E2(+_Okh&:J\eXUL>Y$9rSiq0eCAg73N,DIP]g-?"Tbh1[T=`j(05F'eM\r%R$HF*8Q32nI7p0&]<Hca!32raW6):dZZ-e'isRqm@F@AS%8N4m)@*Gfc1LYpZtJVG>b(!XGI!XP&D999TW)8:-jelHb#",1#7G8a\r%!Qj/XHlYF'P4nApc05-\o.ZY)(aZ$*a4i]samFP"6b`!TFQN;PcL-(I\8.Iaj^<.bg:?(_4I2QM9%)(W4Z5GkC7\XAT%X4]1,[B0\r%1[f6\%ur8HkgFqHH)V%pNTFjPmo0hK`_uQk4Ef)S`=d6N'h8S(iC`,[+[g*$j4$1MU<@L?0loCd&RB(($0?9_4'@j'#H<]AFL`q\\r%hf^X[h,`S!7]d(qja!lW]!NE'!%%J<&Ut#NIohdS"'OT48U>cIoV0g"c@8E3N0En\8^74#V"\5ZhHuPDB,:M`N]`Kse5?+FP%Pmf\r%eAi^7=/n,W-bKEYPOtG!Wt=/Dr0Jeq)$=_-0$BY7l)?28223Pqhj5W\ms0Lm=<iPt)7l",:T>\R;B)KpB(N.)TJoF.@mfObB6&p"\r%K?fsi%in1C^>FcR\H+)spuIR?Vdhdt,nZn6kp[OkZ1qK-%sGqg!(CR_H>923'$mam*PGCQaY=6]F!erSRN*mPJL^9m]o`E+igoG!\r%P%3(VEJEOVD5Z+42Qq=jG?Pg#oE\m1YQ5:<1`9UO(C*3YUri7W97nYQ6Bcu_b!qWKL@asb)k%0P?ME_:Q8BImHaj9K@h=AKZ9&If\r%D91me424,"0FYhFG?G'dlk_%2]*iD$jq#HAL+0P#BI&D(@@6#WoMm&XjJQ$lG8E;M?8)e;=#TJ!#+[1G84IGM%&ZE[-[!=6K8B80\r%H,;95dG[j_$H%fD?EPsjK.qCQpqe_;:#HAr0F6.U:&2UZr3?L&4]`J4jMPqj@G7l9'8G%0HSa7@Xp)sV"N/4ajijs\l7grZi<-t5\r%4I*?*p_-@pa]K?KLPLfn%"#R=1>6=8\pRic:K%;@gPQV,I`(qL:H/lMDdFs]DgUW96UjISJ"3)_9-l9\'qEgckcNWk31q<%!coCn\r%r>)[`H;J()Mh.+W7W"J=iGE\nB6aaka[(*]K<aHuDm$[CeV&!mq;u?31D7t8jI;Xjgc++1kDq2um,jVFM3=XV2kS-"4S$`O0;^%c\r%o?0)5PEM5Nc7e&p-ad[qkPXnq<B\)u1)d3@F$VVrcM?RkUQs`NbJ>L^>S,/5F+3rI=r&r/Lg\"(6%&@I6NdK\#f7OK,"++mKHPa4\r%)^0gf/*9kXbC"C'<76F*#)j,C2"7U4=</!*OI],Y,)B#EI=r_h,L_;O#)j*MdMfZRqrW!K>k6,CO^SfW-W%`T@XpdU\d1TQ/jqCd\r%?%R4VX*]Mm9+D8`Humq=U'M>>(a0117l*Pp=2+LfPcDPGh]-'8_Yh2;LjX9jOHAQ/L<2B0<`q@'(u'FZr)<moJWURNE/t1sJWURN\r%"I\rlU,C:\(;^;G8p$au.>/4jPhq!TV;ONk;L1uW$4$3SOj[HI[1)!r,B\Rrk9[>CN0N1NNhPAp0N&](nGC%M@&,D/FBq6.^dqa=\r%(+q%d%uf!AL?>`P4tokNQlq.RJLttph.;QU]APk,;AU0ned(o"Oh/>qj=2^&J`18!dg(&_>r:H%\\N0"3VuX/K\ZfdT)B3a0N+/$\r%P;Z4TL\ueQk4a_\jun-#Ub4>EPRi`&"\-1L@Io&4]"m79"S[J0]"eG'N"9aP1TS.'">PiGN'>]SL_#Ho"buM>#Tjn_$Oj-k+ad[n\r%/hl4HK)<>SAW5od18k_Be-2`B]a"+[Oh/@#[bkIV0N&^SO`qDY#=dt[_u%Q,I:/j'0M%]\p47XX&/P.(l5"hd,70gS6X+#(YUFc5\r%(YE'2mK1;T7CXak!Z)\ei'TuU'=bi6qiO5L*XZB?.!Yln+fK7'F_$mZ.tU=AO[U77kjJ4$P/'EbUr?5!i/rY"3]a5`0YAR(j=QCq\r%7eshWn.>:F6Uo0235.4#(+)YF@'U"/)DXpV5\au23l1EA:2?:ki#tZqA,*jW^UbRIE0NJ9eBj?]*^679'AKNi2kcu,$)E<;D&Y6&\r%Sr$s57Go=YY9BY$aW+ZV+sK^F]N&_!lB\7#chj;DRB^?lYi^7+W?L'='OjG(lZ[LaPEM]13l4m[Jsf8Roi:G.+uXh<W2*LiI9L0V\r%/]:6=^)1XfdRd5uK0eY)[@TgZG#FUcPKpVl4FJj`<JR`sB[Xc%#_FJ:dd>L^`h=ukB6OJBU)V=f!n^RRU0e]R=iB>5HH'h`9!m#"\r%J=p=0rVJ<H"7tt.6@nm#dbU]Z^`uQ=D'<ebnPL+.d1ue4nP^6YdM<a&>S-kaKn7i6S$l-qTIscM/O]&"9jRNWN\%RV96b]bQbLMT\r%4,I\:Q/%"&q.lC6n%?B9!tH#/PO`qhV7l_0o,hF-"t'.UnL8bf[8(P^eiC;n;Z-tbROYcOGL^2FokcpM\ZJ3Y0_r#++Puq)"a;Ph\r%+nU5400\>8>(iTt-get:D9\HBqrk66hcnRoa_h"?TR]IA8+K[[>@3SFhA`L'pO)r,T'a+Z(B@r=.7-\Q$Yg<nZR8YYr;([OYn'7j\r%-5L72^\ql\m;?O`\oCn>5?s/@j`XgYB5JC?aEZn.jC2SJjQmg&nk\TGceu`p5^$SRB6L_mo$G!.^O:"6(7#>1AQ[1U3e'ROW3[mc\r%89.T0hZAqjcZ(e)r;D!W=_['6,14l/CaAl+hM.s!_k>;8NCS44h7p!Hp"]c*17FC7kUlI):rsXO#CakB_$PGR>fJK5D(-mAkk4XM\r%=%s,Ck/jTuIs14Xm9mKddck3'/m1b'G+\I]W?*/%m:/dJL"i="3)5?sRj%AdS2Hr8qkJI+fc-Y-\Lod`0/'c`ok,tWmGc`e9%9Tc\r%X("4:i(&5FDoipS=-8$P5]t\7,3TZ+YRjfPSk4!T%*N-Vd.E;VnTD*4l'MFFK',i9dq5)DA*?,&>c>hZI9]:'<:SrLcW8CL!@m'C\r%C?@`%02?ln``/8G?Do5T4fP>lH_*=GTM\+\B_tG.<Z5bS"8#'s.'[L2r>-ce03"I@.KW)5N!t$5M5m1Vj2#3tZREEXQW4^4.hgMW\r%Sa39PLkT*q`^XMc&+#Bni4e#/?Q#m3>.^)TL3(#\6tmPTZfdGUQAn'BO3Z6l75QHAF;!J'e8V3qg(ue.>!L">6F[4WFi`1#T)9k/\r%Pf5d*G*$Ab`Lh%L5<.3%kC+.=(5D0J>!Hqa=71"N?]'8Zr\r3f0Km[h\ra1gpbsQ?RUWC^B.^A3.r7j;9*a?lO:"rG1kmUS3plc0\r%Woc59%+T[dEV5B/!['d.+V8t<2O.rDg%#AJ"@mPqSfeYr.Ok2cKKt`qFQO`HIgG>U5/_!m4WtPd^T]M1GsWu<F-r(ub7ddieL(>s\r%`\e82WB^h]!NH2f.St:C1Mh?j[CdHU!Z8?Y??Rp1qTK@PSou\1<J-!6/)fU!626/)@E[-&"e@*d$sT<H/Q:9A^p)p7f0\)CSRK_!\r%A&ZTpQ12(pOn+c*L+Q35Q67q>Cg$./=.+YSf>9X*/&R[N>mjVHbR@^IZa7)-_T&hAC"Isl;)cB.3j&%//Pj"0r6-73n=Ne@kt)TU\r%db'ER`I]#:riU])1A"1OfLgDA[Eoe$B@udfVXR&eB%ZYWci/n.P_Lbc],%V5bR@^IG-/M'+(dR_;?>Gf[QNq\YX?:OYiTTNd[DK8\r%(q)Qo>*seJA_?R\CI.Y:1W.e6e5EbkWTnSk?-$nNTUsoUXp`q-Y%9dMXLaMLlrnXcA_Mk)B%Kqg$5UN[0Dfm?[rKn^MDmW]iA6`i\r%cr2,:M#:G=9o5P.9B+EXCe=gR4.TP#W,MPH8&YR&imip&8d*[M3'OIcVF48R-4l%;,8p<)n(LtkkU@)X`'>M4GtaJnLbQ,q8C2Oa\r%&:&s#>m$*+Le/Y]p022uJsFQto0]*!O&0VU-Pd"L*u2(D6HF`@eV\1hlsek0gkCq1>L6^!4;Qe:ElPa,ff^X3FXsaXDsDZc4?,9@\r%"pJUl="CR*&]A=@;_,/akGrb7nS(EMYGjRDnS(EM-%bpjZ</A3g\_^3NtCq;Zm%e\8=S%u\4R_K0<c,sH:e>)Sk?Ucn0`i"_9'FO\r%,-&CW9oUYNILt'KVW#+VV'9T`R`rVR&8od.6T72%;fnd3XG.;/EiU]L:]KMC8>_3W?QHgO;B$QrClu==lO(JgH:`s"?WUM/Od.+o\r%HD?PU`;2ar_/+n\62st]%<-;B1eQMB+QGL8Cr=+kT4]/\[UEm`#smmeRchX5JIP6`rL%q,?Co;o25_K(=3"=e[1^H<]m-9=><U-1\r%7;c!_*((;5V8&M22L+]^8q/e1/'&mmQ2YZu;lG''p49qs_R_!1?'gZ;mg!67:&&jO7AnN,b+TC"&VP^I9-Xd2C)1SF\TN!E&f2bL\r%/@ACnEqorK#bkN;L9a]lD6XDa^k]4kC9T3VG2>DrL#Gpclj1JT-Wj"U`nktrF<Rq7#fG&!k5;B@JhUI"$T#PW*e`Le"7HtX!@O-Z\r%#XcjfB3pD\punAMiD>?sO<q^\j%tQuT]!'6NdW'+0bP!sM!PDa_#7a$$B\&G_BT>]qi59;Q$%s2\&&=uQlF:*4DS^Z)e(.I0J,\9\r%"C\6UYeLg0$]uI=O1&6GU+g?(o^BhsZJ7VcAD!hkU$J,!>gW5EZsLS]P^(<:0Mc?5Hs2+U^g3r_R!&92!!N-U^#)%P1@q)Xcs*`H\r%9L3X^AB3HOTADo,lb4O_mu(=-PdJo+g\6sr/Ra5^O3hl7\)S@N`<6=qA?@#a#HL4+Xg,"\6"('#[m:I*_lT>\&7$*lRI>#+6HHZH\r%S,)J!+iH/F@HP2/2$t`T`*EJ0^+=R:+`8tBRebg!XL&@T0["i6P4;_n;b*eSo.po+GN]=?ZkLfsD"?$e@P#M_pt[-SWl7"j$V"_G\r%r9hoDC:ahSKAR\16:'ZFr!kd)9I0K4VWnFQS^&DRh(JXF45<W*FG+."*MKY(#T3IL2\:P#&9LMaK&99CTp1cO;L6dpj5>.%2q<"u\r%XFoCN'8I\_RMf8l#kdP+YMaVP>!qT]d6,DnptYs[!/kh&IV6FA:Vb$PpWD%'LG=H)EX@2=kQj%_&*r0J`Q3X`NY(&Vb_+eC[gjFP\r%WpX79r,1$s?6o*G6ZR3fTRHL;bDb%r")o%<gD>@aC$&F1nQ?%iisGET&V5s^:MF&s(VRb?>Nj;6Ij!AT9.)Xlc9C<)q(bI?-rfXi\r%0?EfK=9,n7#-0m5>1k@L"/LBI])@"lA$@c8-$_g0_BZVm0)S1^5d!cg%^rL@Ph(a&aG%X:/uTP_'e2WqplW*V^`/-'>U/17pV,NB\r%B;I!j7*ZD6GRk&QqA)Q9k;+WrVsN`odrfN*;L^9jD]O>g1WtuWo$:6C/[s2V].?D.Zg[!ZB)#En'KSlIAbH%sr:AS<r?!]4N#.C9\r%L5sZ#KP8/lbTTHn&Y`^e+^l7`i<[gB7-63B/p]m<pZF.s-pY6(Q3\#hVsm+,h#65'bs5@&8T'94C'J8`Y-4XjV-,HFDMEXU#'?a;\r%AJ;@@-7!f4KLmM\b>Int*MO?g_EXGbBlk']P*tC>?ilEF_m=_>ZW6kW(;`S-'0mPiKk"/9lj7Y7Q8QaTU-mIpaJ]<20_$8r%C2nq\r%&:EJgA;=-Y6f=-[,hr-O%WPtgWuC%ZdG`s"2higg^[SAc_WOC(b<i+QBbS?>2Po0+7$;\)N5\rGS.2gf_cXt7%6<;Flmbl/5P3MJ\r%DVj6!b43*mSD65Tal-925VcL7r]$,2J!Kl@;'*lE$_V'9_X=>p$q)/&cscsun/pbMfb4/AfiJ=U.%q`t!g5.c1VVpMUQE[&GM?b#\r%a_n#\rr=E6IGLh\NEt/5F["eB&dYCl?SKM4NXKY)\5Y4fjV;kqn$bbOmn$DAp";k8@8]nNilc%,:hrW#H=d9Z.bnRq(<dB_LosoN\r%5t'oh;b&Kpg)s7NrT"[_*hnnM'Eqp[eTQ8-lumB4Eou>([u*r=;d\>dTuf@F;eJH#EtE;*3(G].0F%WV#'Vh+#<83m@(P7rnJhN>\r%m]h%nf08Y8qlT)Na):iqI'c7Jp#Wu*kduMOq?!Va)se&uP-8Ze@TFCF\[L9U>EB35d^=31F)ta69msifg3jrCg:ek19Y2#@GqhkX\r%fEVsp832WYN,goEK$[?tA/(t(_U)/b9::<hnk5H"Un\4:./^`^MRDs/,o4AH;2`Mo(sZ%NKagXa#JE!m]l@Cn7TX@2q!;&GGIPuM\r%B9HrecU.lp/EfI#@HD.f%<EKO6Y?uBnPEt4=85/kIi_4Q?q&G&p6=e7PN)QW5<Ht8NN\7mJ38Rod3-,Npd^HE@W<KLXG:TT.7qRE\r%kh#-OZ;TNt"cS)P4;9hd+daZU`1uIT#%41(LeJt>Qj#d?"\mUaeJEW.6s[O`3A7.Ar1G;]V/b+-D`Bm\E\\h_b&:9[$^XBLq!;4A\r%?@<X-`*.C`:c@IL<gLqWm:aq1Y>62_e8MaI#1^P%k-5WDTb%0.QTN@/!P/A?2Peh0Ca/-$^m0L,Nea#jas4KrrjL/UOD2n/aOVLq\r%2mF>`b!?[mi:S#b<S<nb]]Z-Je#/.Re_1R$)+W-2rqP3>KVG360_`^>f#!W&!`(#8=:62X9(6BEC"B^]'U3N&4)M'Q".p]8dM\]$\r%p\#$?QK_PJJc7eom$uRKB*fmc(QN_J]PC4]E"TGg(up%W=20.-RbKQb*C1+Vm6&VX"]CorP4Qe_)CnV4*TnWo]>>=4:BUH($ras]\r%jNH&sT2]j&7VeBsA!L?#c&dWfalhqFbVrTD6R5>7k%QAn+>c3?[HZG4WH"Fs3h?No5e+g$GiuqtN/+pR>'5c@fZdhJ%@f(7.=$2;\r%rG,SJ6VmaU*\1PgAC/6;.iH2Dk]#6<Vdp'sU+s<TXHOeYn6p7U4UkNY8Z)[$IGZT10->MMh'`OQ6J*AMg='XQGXEiGQkTuh\NEHP\r%hVMI%^uBkp-;%_S=<)Ot+E@K61gL3,^iDBUFQE."Y3,mh0KtW>7<JKSq8DEVN/%<%I0COdU2:2;Rd:A]Mm'B9<bV4cNmF3*r6m\b\r%.\"%,Q.toj)4DBM>Hl_WSQgScO@MQH\"%_g)/&*:J[kfJm(",I@kju.<an43=]oJ"M[*pC8c98<JZIZY/O>WtBL,L1j&3]"YLo[?\r%T^+pCgD_gu!q4$gfCjNf7DKj_m-.^EC<Ek7G)MZtKru^h&](PCb&Ar/,Dj&*)Z6?`M"!VjBH_^?Tmo^P&gX1"qj/E7Qm)i"TRTNE\r%l''KYrCa`1B0d/Vn*iJ6DM60I30PT(k!g>bYFD`4rRo%*ICSa2;bE\(&0WSo<9:`7j2M[V0LY;09dJ><mTP\U@7oGJ%9kB<=V*2f\r%m,jpl`NG31%;o:lFr(*:YaC[QCh4Ai1$2>]pnP_Eiu6H\<=j-SA@Q?*B2fro=L$kGB2fs:^%gmaMs?KuEi3r5AkT,pCNJR:RVShX\r%L@Wl!,p+%e5n_0#ZDBAc++)]d2k*DFT:P=("CqeQ/5XTbQZ6\(#1Ea@Qg(7Q;tfC9b/ko^MbYF;1/VW:CNg2u?[`a=e)Wt=FM;dA\r%g:Q._Cm?7jRmV<R%5e!:n/7[ZY$OVDKIl[_%*7Lir)?\lV%DWFl^7\LE3*^,\r,Ah4$2\@G1;c25Eh8[C[Do![E/.UqM^Cb6:>$&\r%V,9glEU98:H[6XQm<U8Fek'GK!X:i_S+u@`Ui1,BX;+78P7"(\C)\>#UHIc,ckuX.Q0%f?W$(cQ:GqberTl#Aj.l!l7DJW*Me>\S\r%7DDt$"s'[JMLNsjCf3p!LER;F-/jU7QL7fE.<fOK=I<?l-(F(gEFQLN/I<UJQPt)Fe(o=rQKg='9)=B%Tetr<=\L72,mY15:$<mZ\r%r"@IQm2]A=\0\#AfN-8(kED9Nk,&*aYh2^$`,nq[7tno1'@T[gAGBIk,c7'?%qnIY-)R/`7R8:o9UAX-K0!"AqAahCP*g,jQ_9n#\r%.h'<_O<Ci^@HaLZ$WK'4@+]tAf`*-K7bNqBQ59Yh&jh!$'%7/4Z&jh,AmROb-^,jR9=L8"3$;Vt05P/D85,q..W+=SgUjs.rVAPV\r%&(8$H(Be6_kAgUQ=2.GEL$m*(7a4[=&%Tn(D3GDb5&28&YtDb?=UZOjJ[2$Nb03/BO)&]G_tn8kKAT"9`-F7Wo-[[,-b<9@;W=]3\r%hfmW8AVMk%!D]*Y00B,^,<J%gDdIA^Ccej:]Z$8[pH5\r,_WBe>Q._4mP,Jjb9(L+U1K""]&*TMS_UH8+L4:;r`BPTX;IT^J#n@L\r%(_a:<O0orFh<C\bBPSZ)=V$58)]55"fA"?]>1d3(!,_OA/bE7@[+/sk.0N%Cr`Dh6Q$e3.&5(qij)JN["'6,0/TanNr]q-6=::@!\r%/C9^_":'@&Cct>G9h)dJ+p=#;g@E9fOP.SSD>@ZnJJ$W,a'.F8%S;6rk'VRCK-FV/kc&*F[f!CrAV[(9^3-n1-*JN2rDX3\JlHEA\r%jJfN\;dI>;AEa;%TO'ApB^>%4;2`UJMYK!K8SdP/iSRCaSk>/pWgD_\0@liF6!u'IQ*3t-S*71RWcEL8fg[(T]`e#I28K*a8^!r.\r%b/nL_*msA"C2\]N8_%cU.R@"L(?W'P1Nq5EU6U0.U02Jf6qrM5=#SmOdN-PtrdJ8qQL8.hE"Y/-Y]L,VKq2ITgm2s)WPd.)CE)&=\r%*5^,EU-m_]5V,"PN$RNQ:*_\J?@h?Q2j-.]<?fQPPE*EA&G4(LA(0rg+c)Xue$8+5Fej&89fGIq7c,_S\ggM'+hWp>aUY;+0$l(e\r%!+-5`+duhkaUY:<LFfd\]g[_QHTuIK+-Gau>o14PI3:S`_0US'CN>9s;pV0aI?%*&+3%[5,RW[2IJC.C8VmS$NL&/Z&X\Eie6N6<\r%;10:262DSQW'4j#+.oJq9g?WXWXn,C@'$k-ojRc0agn.0*E%_(@G`g_!i$;IC7Qg?&XZ:7#`^(2;10@LPhuD<QBg[Uc5&IkN>Ru^\r%Fj*kkOW@>V%Pa<GappAYe%OQa_uc19A;<Nckq+2rEpO#r71K38QH,pt^:NWBJ^LI-0jl^,#Eg,(M@TC-#G,aCL<o<DQ3a5R@M&oi\r%C-AD5ZG/aL47kY0g[S[_+I*u8<!GUi%5B]GM[oL?=*6<[XnAcbkjX)/a3$"rU_4[lA._LY80p;bh^([b"f^\sVjt">_AkD"l:kY]\r%KK3^"F=6Z&_Al/tqeXB5#]n@#C,ZB=,4)MP@N#\FMT%!#0S`D"De3BCK_^E6YmNNO&On007+[+t&S@lU`j([LEZr:>hc*#[*+>3d\r%'p'@CZZ8W$0Ph_5OI/cc3eZ%H.h'<<$nG>&_D!lNC.+d`60&HlN)h:.0FTVYlH7F#1#9L>WWo%j@_.CSn88bH(cF$.`;#$L&`sWF\r%@^\=Rm#Xh]B\Vo_7t`n*+.TT$Z9p+hTs6[O.m'O>*C=@>+P@p'kR`pL!m(qO7#.)hHofq(Q0?T$0kZX8O@jVNO[Ti7+dM7&hCjFj\r%LK(!8Fg_]$4/<K0icU1\g@E9flMDkig@E9f>'js3['a"X\:@.]AFU:#2JC8UCC)1([,m@Vi#W8e[MF]0d<>mD4/<K0io_VDm#Xh]\r%Lp1!+Zurocp;^?Mjq!*Q#XsLeIL2"Br.cDG&_cfr>+gY]>Yg)D>Q,;+^^+fQA$&R%7`;#gi:gBI/Usj5A)BV<$Me*^FN0]@/UsjU\r%T1T<$bQ"$jFc6@To#Fp[#<0'WO@jVNVS:DjCU*)BDM8CQ[f!BG]7)J!d31>r"d0m(M%7oN$RRs2&fkH]IaB;PM[jaE<"R_+'se&n\r%BWcn)R+YA]8D",]b_lr70qdlp8p!UiWY%#P0F8&@qb'qZG/u?&cuc-]aptC=L\a&$/N]a@*J1"IOR/'$FJu75WF^iaU-hIe$m[p1\r%,.^bRIK8%EQ0;$M.QaF=*GU#^oWgh6d@jcf#Q(Si_#&[nLK+5f>$hoUm#Xh]BV`po5[[Xj_@M2h]r-i(T&i56`X@?C-\V!23Xif_\r%"L*;g3Jq&QR/'$ih)GoJB&YJb;<3GHbS`h\"3M+Qk'(qQ5(N!]8p"b-?-p_(s-gBto_(c_:$q[:qZP*$^_)-OjXZ>V="BW&b[]m!\r%VqiI/-"hf[%1:3Q'tcJ3?:RgZr)*"->%94@e**JfX3(X3iB::AIAV.#=Tt?\8I0Ts<;5cN(?Y1"HFeA_P2#s#L4%gf*_Aq;cpBCn\r%X/qO*:HD,.COat+HF%a7KfGf"K2u@I-p,,dE-BSto2tVV:EEnI)2*]j0P+;GX8Z`ro-iEc5cFA)e(`49bZ66DOU0O2KmcO6*EoN`\r%ZindY6]5*"f'/;c%l8atGgc$Bb8k`VZOpG4h,rW"JtCKbWI-RZCakA0S\.[]pjK+@aP[.PM&4ph9(?I#%BneXoC]2r9p9Op[sOEa\r%V"V1pq(6HXe$cla/lD#3psY5q#H-caIrD*CfhXKr(C*U%o<FGqQbV&@V8V]>/mts056d&)_Pr#F(7Whe[f0;!d-O9JT#`_![D0%K\r%3:LTR2Lk\Gb8dd#Cl.)"CV7A7Tm?Lo:4$:SL$?l_J+NY@X'Qj]m,:H5AZ!/4Z2F.kj9VWNo?R110KCLC:G74X>7-A2X(,h,N!Ws:\r%[X7hsIS.RkGUo\r]/pmYIECA*OlY'k&c0Q(GpKsUO<`0/8J1APfn/g[a@6b*nodKb8$hV`o!kJI*`kRGK*Ke'BD%8.a\i'4FjtK^\r%o%IaU,C8gF'dNSrN3]J9;,iM%X4Idp]W0U]<,C^h&loaVmNmIb@L"t)47Io'`H.)t:K=ZpW#0J"LT4g=*s5esk#KCaUb8+#@%S.H\r%JpX`nqH:s4^!U%_8r8f8gnth49VT(6\F^L@agDUG"jD+aF3+coF:9nm.lQ.>EO-pg^1)%H`7!,J"3;[rlgII6%L@]b$I9sOp8&pS\r%rAqQ&V,)^;'q9'ZO:8RjYBY$X2l+^%kB)"+0`E_#Rl@P.*uVYlG,2`LFi+c-SL3];o*F$AWV'VMaHQt"eV7rW0/Ei^Ig!6(6YWo'\r%$_`D2a74+LB.+tj;JB*24&U"ph=XJ!!+(Td&a#b&[!R`h&a#b&&/GXLKGiCs.t%L_q`KZgZKC/.6s'oH2muG^"Z&BtQ7k1u"j[Pa\r%[,m@V^raR(ji\*K$1hirV79!U[f!BG]O+d6/Usi*GtKX7Q9Wq56oJ`%+)>#aQiW9Yfd1JTC5N9TBZoT46!-bkfq9pHXJO5?G-pof\r%e"\LEXC]G;c:<R.D>@Zn,C;*ig@E9fi-l#`[[q%0\]o]5E+Tmg[,m@Vi4H3Y>Q.Ql2CYmH?9,6UWp/VY8CMi=->:RECDlq%+jlT?\r%ej<:W'=?k^[1)G98@7K>[I?q0pR4h0Z7"4lgEB.,5K:"?5jqd+9ur'T2BNiSO[#,>/,1`nVoqt4Nh7ES^!P=A]"?+AROlaWfh8T7\r%165>$G5(k.XF[7VZ0[q2\*_"Qh"U`6Xn2f9>"U+*DU9goS5Y%'&.:J2;l4Yhn;(u&KBGZfU+<]qFoG[3DD,q>:io`Y=N)!Em]D'>\r%G[?rMMHQ?!1li5h>@EmNfM<jS[_a_&\0o[rgG5rmEL)?#D)8D`lV:?f/.FC,"/hVdAneV)L?VRIQH0R%kuhRGDX=b)dDXhqDs#"+\r%P++cF9mp=Z_=ACdU5*4h:.G58VU<j%:_4YbIiZA3=Db_.hHXjj_-Zb.&64'm,LsADm&f&[>EBSGaf]aRDI/qSq27&Hi.ir1`o[$;\r%p2_'PrD[1u>1%ifI%t$%H-&!/rf#n">O3P;5?_tfFAe7NNB[1c5L<P\qWTne-E!k=X+)D0VPhu!!hB'2;s$"lABQ%Ko#CK[)e')2\r%<_L0cL0/!m.;)o'%C+&P;lT9o2q0I?OZXL2:r@UUh(2m:2]aMHj'l%-P$5NF1sRaNUS$i&n03PYQ5fr`m,&NFA?LJ%QMk?SJJt!K\r%d9C(9:91]r3M=/A!.G4s0`7F1$`cOP"fb<eJK!6HN,tWr()RB&^Ka.tRc7!U::Z)naF_Ro<K"9"galc`a>$L93M(%2^i`gnPhWNP\r%Va8Yr@32@U?GDgU]O1*X<sIk7o.-qWZH?ArH_AB\C@R2$GOs6dA!k=4)L-$g#JIaeQ;Tm"`2?KT<35RTcagnGPhsFM3I3hNX^gqG\r%3/ctEf8%XTl[C4-V*C5@=.-2CDCr3FH61:c"E*TMN$q[kUR0"EJWP%a`WR4K1M*GR"?`F?Gg]MINkis)'6"_p%8l"DWslg)f$$7:\r%96k/"@f(#EJahEi2P5j$&4(6Cm^0G`*N*,VoB1>;0VNh,oV\Jtdj_&'R-W$UiHZ>njR!^X?jj,P<+k7ML+Q%Qm1YM?`tiX%43Hr+\r%Qq"db/DYo]2j<As]<C\i^u3_']e?G@i_oC5TlKR!]k\/=Vh[F?2oOYW`V/>,5LVT>NI4#G6NIE%R-tRWMPJkQj-m;R']Q4>3DCZ4\r%73P\uc=mVg.gjh_*_)joSfF*^H=dj@n&]PeHN#Ulnd?1d$dot2.11(K4=/0>cZ-d>Tk1du3A0)n9$),$.gd)(7'KN&C0Zo4bJceF\r%#d.fDQ><)PHJ@rP\-UMW)(5h$B0?FA7F,r[!E^t#NXK#Gd:oFd\`c%++.X$373OAR*/^a:PNT]`le.'RZ?/5CZX!,B(Z\fKZ<[#A\r%Q[>J.CIOqb6UK(=d45RO3YjVGSj6.4^VWf;aV/VuiLWY>73Tt@S^S:Y<YUu@Gdl=M<f4c`)FY9-+e&3o1jY96$Lp<0i'o@t73TDA\r%JK)9n'ntk_KP:!%<>8VXXnbD$5S*=rVNA3[&:C[or*(N!!j+=5s-AML+Gk[MD1tq'$6h_7QAN"W:$1Qp19hU6(;0QL-CVfQ-jeT7\r%V'sja/NjT`8l5k4jEXHCCIOp>P+f#(C`#U7WZLe">:^JBYg^e=^L[m@kdReeDgc4\k;GWekMJ&"em^OgKqe&ih<4ecFZft1'S=M_\r%Q[aomFi-gKLu+EPr*(N!;Ko9Kck]PKU"Yd?&8d,#'F&<:VH+B`H7ISr$B<nWS#2:TU(Gs91'M&&7H#GM+r`ro6:ieu6Iq#\UE;Km\r%=pCt#&A?&7Uh*@P$K4aWgIVaH.(&2H%`>YpjYP)DUJc0.n<VD%S:?hWFpfter2&GmlN9Z^.p\,5*$g-4a<q6LjC(eiPTgW/-<t&I\r%Q8Tg=7@l>'*o'O4.IusNQ.U>m5h!maJXQ9@SM>!fbf!j*n%0dJ!Y#382,o<#<ZN>k?sV=IE?XiB&_LdIqt8",*MnUPpK&'Sh(LhI\r%Z<VfA-8(:_Z9k_A,fSKUL!LrHP?lHYSthc.InD44A(U]X\",Li_4lPZf6$2dZhduLBL8B3Hf$"C_2+/-C(/s#`e\<m9X0(Np"UT,\r%A+^r95p*iSRsT@Y7AJ7+2NQuBWL;G&DDLe5IA?lq1J+Pua+*Mqs,'cs%BsLoq#.^rA"(K(+^l5m"LoHFq->ZuqCYHhBDr`F6a--n\r%9t[67SmHL;d1KDl#u+a2.Df`$^XT_p\bNcjbucZc<2^r?Z(3Rko<*ZaW@*[pOC9_f#]@6B(_irPcs,J;/Z_=$%+!XrD,u_t_4?Vf\r%A>>"$@J9L#?M'#lkHDr0lRc,F`$DlHGAeSnpo/#1)_/b"_(Z"\Pd7fSQ!^t)1!l`r.[DX+\WYOi)rm4\)`5PTSJ`G"c9!*(0:&q#\r%3ek2Y.eWdO$4I"u+UQs$`(Xh/%\I_k"g"H9)A9Qo='q]`Nd6ja.nUMhI1^Xa'T\ig)mj.Gr@H(\Q$#[`r7YJ4^qXG@T%]8,F(ata\r%V7Z\G%d3Mu-r`?9hSmSRV"gd$-sQT5hiI)_bi@t13O;^l6-I1Eed-]D_kIcL>Nqi*gjLtUM_D!iX8[<1lIRg25,fI/j.WMLEC;_q\r%ll,iSeHS&7%$RrgS0Hgn%a\&e7IF-XO3j'IlCg#b4s/iA&%B/NFFp.]lKS?+:";KbK0M2F%_Fu,<[qeF`J]G(Am7.SVG^""J!YX+\r%Hb[sN.;mA8V<E:"*FUhe0)KtdHrK6qGOA,OQ`E8-+AED7<.,@21c7^cH.A5`Uqn*'D:KFNIQ+5kRNQV_,s";[VX!4^F,5#S#t9^$\r%h=X>2q`@RadU7\"J8(SkJf^`@1Eq.[Ifae?q1CNV+*63lIhsbm?67>m?XCs*(5%/p61fhE$pbdk+$F!M,tNBB(Hh5>OZt`7dhmZn\r%!acQBO=#dA#'q%-bttA0$3pmaaqPPc_)1Q\dhmZnF,$*8Bad:rR\T'RdhmZnbphu`e%jqi@0=s%4]q`2IWU0:Fgi])n*K-"6!?PG\r%8dWo]GM"o@>3iMOd+3C__2u?p(J$VR6gjD-Qp64qgV>Db0Acc^cp3's?]jCGUFZDR1r<no5PU:9c^_iOQ-(E8m20SH=.3drZ4^.u\r%>q+HqoUmWnX[K'K6b$/a=DhpDSQe^.B;YaQ/b!6".]<q4<SsimpN"%o-B.A(Z[!F;bE&/`_!\b,Ft[2sPTBC?%L.Fh-)Fb'm\81F\r%1'2?2"2,MjNQgncZ;&]ZCc3r9Go,hZQd+Z(]Q;&kHeH@%]'C5n9,IS1LgbC`YRa*eKc!:gLsW1m(1LJ5!8DlRL"7j88L^0&N1^7]\r%H4kM6`(\u2paZHX`$f_cmX7[.!?"Wj^:m9:H\3[AgVk"Um\U_D%T]u-oAj@ih_;=ES'+$uh`l`,Z_GYBLA9!<p/W6]b^XV]qqQQN\r%//L!6.qX:%^UAKqZY8ZK:.hJ)`7<1R1m7e8Hk]^tkJ%"^jWghri=>4RTTs9lq[2dA(gA]KkY>HTWD=_>)_)U:d=!4Z[DtTsrV//i\r%S=nj(12a5*o"-lQ+O.c^&;M%`Q:n-2S\&DYe_#<(^I/&Nobo[9hQD\D=9!tT9.0cJ<<"h(-E[==amJW#s)NQeXM;T<gLWj4@FoS_\r%6=!LTj8--0?+d[$"@iVRBbA5ArGAbq0,g@p0d&7W-hTlC-agF9=%gkBn*.u499>FY)JlWQ01qq94q_9E?'c=QmrOH!cuj2=*TIMV\r%nHTZC6V7D-*k_4j[)S9a@Vgj;SXc=iVemV;Qad6N?;KAq/*&0=2F*QjY_R?0/AoKMb3hON\(nHi/Qb:YRZFmmDt#"7kiHco,pf1`\r%C&0t&4S;k?H](Z@Si1q:<7&-Jh"mp)>%hOEkTmm-W:nZ_ZnM&NNV-eo(BcHl9mV2aX.Tc51cmnULTaq(4M8&Pr0J;!%[NpbNZOer\r%HR`ma:V+6p/P3FD:N]1GMQ0>!3k9"qV&?Xj<TT.l;M>QI-EkuU!u#HYT7n"s+j@9u.E<g8VFunL&^:ZbWg(0o<p"2)gp%VYSfe4u\r%iZ-[(^QF4H%tpX&Xd#S<%$Zjrd1DkmlRg^81.&A0O0s'e<*6NhO1!>W@=kp-f,R>IPJY_igH47u`Y7]Qgp+FfX_jK.P-ePCrc<.B\r%Rsgmc(bD3]="S1d64`s")R.@/Re?6hp@.o?g9("CQkAnA.C%_&_cl5a[QOJ(VpNku,_(6m%Pm_LX>rU[/H'jBpRap;KgnoCA<uf=\r%5JM4q^icaX%A0d[/,Qb[6*I%jX6?Bdc>0bmrnQI^.mI;,rD%1sSZL!$K@E@[\m-#?Dn?g>DQE;KK>V_KK-;r#QA<ePH6[9t]sd?)\r%Os^GNZB%$9@:?oQk]IjAXU3jdKOD_rHh`"p;K:aREY5E-R$#Y-hVLcWkM<J>6uaIA,t5R!H)84sMqRm5MbX.i^-d,8G==7gI?mm#\r%"WWp+;!:5qoEi:<kY?#mb2j7PKUfYO@eP_d$O#$D4`,n%bP]2.Q7^Df/>eKpBoT=[9m0l)r&00^F3C?U1O.p6h8ida18Cqii\8Od\r%n4J@?9>,1edJ`!?Jo2iZd']AU&Df@+54[n+SbmZoJ,HV1S&+j>A+t9P9]KnLCT`VNLgsuK(KboDn%a!,Js68C!&YC3qlX`\Mh9$2\r%%5Xo3G[<_A@HaL>Ot<L%pg%%+AKG@F-$10LCo+&Qh7aLR:TbO,(-V>V9I5Uc^QJsDAo_=3aH$e*CWHr<=VOuD@@e?FOE+t#*SlG*\r%iVfus=;$@XD<Ypa^CJRn!qs[AC$-:J2U(7!FHiT-@;!TiJ"nSYkaAPBG@E!ToL(8<,(8I<RU.dMk]IZUh_flI;.<tj`H!Q!rr'?(\r%bre*Q`5=,^E*\:eF6]+iA)-cn@@p0X'pR+*(+VtudQu<nD#*A!RoNK]dO("9E%kLJ8BPf&RB>=tr54;V;FPKTSm#=SKfuVYR%E^T\r%2WaYgDS_`Bka?p65GHp&5X"=O6mD`[Q@E#S7^IDQ.jf-no+0Fs`=XZd?+9`!d#[uK+L9*RKIf!q"@P0DLX95mQ[n:Bc0=d0E=2bX\r%V_W]"Tchd-.\$6hM2Kf-#F]'68S-srA?"*]_NTA\oKE1jDU#6;lb[aXb?rIuHR5P%*S@%SR?YJ6j]qb$A9Hn&f+7t9[9+g@8M/on\r%ll\/i<7DOM8Ii/#8M(Md70GH0+O1Qf)hT[V;<1=_f`Tt`Y+/9jB,oP6^*FK:4o`<@Hm`,CgURHq6[D,eXsRMBn!gocP^Qq$Gi%iF\r%Pt,4Do7gN%_"P<n>d(s:!M!+8?sn?V[!@f`)O/-EiuqOnNVfq^<i*rGV<[^EYD!:!LNUfVg!1nJ*Om@QJ_tp-mC%BZ&hFqLYT5n(\r%p;hD0JaFrDY<gH"6gEi5*A0W17dH[pR:.)f%_?ZO$Jra5.J\=-#i;7tO21J<F.CpFW6*-eADu(cRWT#W^%Do^#XMa78J!)%At^fK\r%#XOu:Ieu.L4LWhI%RbhMT%,1aga>2TR)$m1j`a,%irOVVNp()J_@c8Co:.Xmo+5R?P^.o+bjbF6SqC!#q\5L>_A]?Ylr3DV$u)@Y\r%YYUs8bhkZs??:-9hV9TYATuA#EsQP;PiAAm7U&M*5`4`j36`qWh3?oMpFTo-0nC$7#[^4u+N6_B=P-ed!k`'NrjfV8=@r%)ojBJ4\r%74Q9_,_?Y;XC+pgFH;-5[31[m&`N]8;EX1$p(68<OQ'!rk*]`d?c'>$?&Zg#MPmGHh8FOHV0MdH"LOV]9CZsFW)JY1:@%/t*^_@t\r%o8Gb4&>SeLY$sMJ+9ifQ!CGosq(/,NeYX&,YIBsk'Mlu`Eu!^iPiA[`JkjHW0?"#ul'9E;:5Xh@$^3sdIjpu).+,n=MMIc>-A`N;\r%;EVc%T1q$]6ReUmFQ=dg@jo;ppL.=GGRUEn.V%Qi`a^F9e$KJ[N)+[21g=NO)4r`UWi$\pTbJ$H0Y<85(eX=WpWL2dO.d9VIm&X?\r%?AaM"L>9am%&J3Q&*"hQ@jo;pYD]FuO.d6uSp_,(*^_BJJWd[5-mhhS'tq29nJFmg"OU/,k:=NP;G$C`pL.#U*^_@t9]K[ZJRPF*\r%JN,lU>)HB=aZ.WqHAM).9(D-@QQT0g8!Y&Dki/7"bUuZa)=rctT3)=s=HU+CIUF!ASfeX[G(u=B)=uLn(lt@):OBi-c4:=0`RFZj\r%gr+FGV0E'Hj"H?*O8>ga,fLEb:GEnX.A#e.,Eg=UPi?+!(W?u=8b(:MGZQU@6ReU7J9f9m@O`fJ@,sRa`)KVsmCc;&7SG,Io6*>M\r%-mN%p7?"+`ZUj(nr;`nfi2N6uiNZGBiOurc*M.]f^oE=9.Uqos]$d\ooXW9VL?6'EYGD"2G$J$b&+6I<p7L(>PdL$[BH/@+<fES9\r%%=p+%+WPu\00\?G!MQJL64qJsRPFF-d9irh\#.W<g\T;`5qS[^geCdr:jRG+NjX>sKag`=L&UYS32HVXlJHhE&M%*&)eLrl!5'`Z\r%TQ>=g!S#%BSt1l(XpY4&#N;]-D!&!F>4EuJ5RA;j@=j`n&k"+L'n+mXOUDCQI]Z4$9C7s.WMM)UK-j9RP$3GS-=MLje:MBsGesS4\r%WFbG6fP)pClaJ!FJs=dUmh]2m0L8<G_$Ui<@=j`n>*,BCR4p@$37(i#/bQe!1gu!#e5BrYTEu:JZ3Y+W-:j7B\h8r*j`tr2PEB$&\r%_ZWc&co->_h)_"t:-2c$^Lo6]BdnIGTh,hhIN0]B/889r&gg.@/_IN@ShNH&C:UUDUBC.GP)AH^+0Mm%?Wbrh8)9-c-?@VBeE37*\r%A9;$$Wg4'/-_D]_Q^$_-;]4E]HR4/*9AP:0&2#]XB:XNQjS6l18!R63>GiHI;6>%7Dk6G+Qgd)2g[WK/.p#1JjAm3G\NNfqo<hkp\r%*dT^k!sD<LMpC$/4.i?]5mI[^T]3<9>o>%qJr7ke`.6eZ5((rZZ3EolgVRPTC]<9*<.#I_a`QJSK2heh*3$Bm]C1r,/TH-g]\ZfJ\r%Bu['1W@,B5q%j6<'E7V>ba'fc-N**[cs3isRd^ejIs?F`>Gq!FI9?JX6CgUnMHUNA-5;j-/iPL.3$1L)[Ksj*3*##.SXG=Mq8TP$\r%)#O*FeIp2Vb^#4A&/b[IG]I&.`a7,*2LuM_*7sb@D,6!/pi:<MAIZBOnV^2U?Pl4?BUocuU/5cq@LTsjcqE:!^)YMCF:Bo-?Tu1L\r%L>^5U^!Lj5!.<0D$6eqiKd+cK;2G,EfRkibkQ/AU@t0,plY_k'.a^e)qu;S<X&eZMjm,OFO)W3.`l#pkFIfALB&<m4e8kW-M?oKd\r%I[''HG82]PZQ*/cP"Uas-sAV/h&Df*PYPGs<f0%V/q\NgX#.$^gf6e>m7;<ulpl.ZSfi>!d1)Njb90T6h22#g3N:u_j#6bSr[u."\r%b7:KpjBJq2rUYeVGj8e#qr\L7J?>[[)oCW_9Q0816m;_K87S"?`CZ5umUb`7!r[6U8N#RG:Lf`K`(<kX_\g!boSThoeN[V.N3NcI\r%Q"2?0@>nLl5V2'H:$c55"_irI\qs^]M:7U;fLc=6?@a#PW:gQBs+]u-KH6Q;,Q<Alj4@/SdJ2dq>9#F`?9.Fc/9iWRL1(Xj/+&c"\r%`B65dE+9CTWa]`Kf%X&%n)In_<UBLX)D@tId!taFmW7]C4OW#A%aRC9Yh-G/`N:>ZoD@YI?e!4$C5R_I9PSglrop2l3K6i-rXV2p\r%rf`N#=mM`iGn4<8B.8V?fNV9HM3S0*aCq/5IehluD@]J%HpdP-8U@)oOi?9$fYblTJ_qR2$6gY=?,;/P+[g`7L7>^H>"\e)_rc&h\r%bXnFqd2?,?@I?qWD:P@DZtaFZQ?6<6WTN09\uIXmjWOr<7r-]<,ki!I&t"(gDe?HnGdCuCHMLKC!dokAToLQ7eCh"m[6F#>:[lf-\r%V?(V%qt5q\o-M*GA'RT5i+DZMb1P%N_..<?8/tV$?^dV^h`g;la&j+Sn^1&O:$YI<r6!nNB>Kf7F1Zm_FS,MaV5MN4C?G&lT!MFb\r%@@!rqJSR+G`#p55QAtt5.U$Mk;(C&_?6>dsd'P]s?%O3-[7L\>Bsh#Xnu@;-lhd:Q(uCr0;>NgdcQ\HE%t",,dcbfDo-BMWL^92<\r%3#A_^E%3k7*76ki>%'$1TO3,qdMm:/mCOk@o?EE['!niXMKnmH5^to"cEhWUaa33Y]W;To8#%"j7\`7K_nZ3s^?R5R&ll9<d,/0K\r%,Fp_F?,r`*jqbT8EMA.&P6$K\co1'!T9F\G;,@F0BG(GtjnpZc,t!sIFn\7GZ]rd+h+%CBp"GXZ?7/R^gHqN@D7Q4OWC/JTY#eLK\r%=.mHWdZNLdjbi*\@^g.@?9oQMD1elb;*c2+JCrKtnYdS55E7gXmSU*.hCUA1TR_:I8)2a2mt7'G^R5bI9*Fr&f]Uk+K&nZR6k@<Z\r%@)8h')o2VZD7nc_>am[)\dR%Z[I+u\.sK`oWk%h(RB:T!DI/rP&jpbp2D3<G[\(IJ)*\iQ^eFS$"pbh4NK6<a\GlM67-dA/N<chN\r%V';lXIJuriTTf3Ddr#"V:0$[^s%%T5:TLr.3;l?\FoM<Y/$TtUVf1ab:[Q(hV=co/HD&AW<<(83R?r0)B)_XP*32J-%K'=T(5Ir(\r%rTZ&t&=o29'snf0ZlJOe,5?PfoiV1+#;J/Soc<I_<`;;:`R2C''Z%QerK[6#"*Ug_gg9IBEoqTmJN[@eQ*8G=j0H)p'$BOqgY0]i\r%f@OX-[TuNGU*VI9J"F27q+`FTl0BBTW@#5h51XD!]m5!Q:r=>R)d9QGWc;FkkH8h$L[Z1B>#.rO&URiVho4!b02lj\7=Wu#[^^Z$\r%;U*<=%+.^p2"JjE9_]qO!ftPL_[n14.cSdIlBYh6Sp_q'L<a^P:GA;3"Upc,8?TN1P@<[I?jI1ESm_o&FZj,eiEqcOmLNb0O\LS(\r%5DVVWKh7#m5?3KL,fWP`o+!f]EtpmVcp,>XG<[h'0_E,W!i$/kIs<,mF'AZE)2>!$R5Xj;nQspe:MAn6s7QIh,'0IFS?^8P.?Dd,\r%Q'H[DTI$d1q?;YZ9A<=nXBfmH<roGeM.J-h'%9h<b5o9V^Sle[kE[drZE"&/1m/K2.*]tTDmq?+bf#)hZ,2q=`T2h%pp*.<=N/*Z\r%Dlhu"hFu3\;0>fom[TO)=gLQTb5o<Go>2Pr3M;_IgVXqWfq?s[QDs9p#%-MpRrSa@`ZeqY0D)pH!+-6"V69_3n5Y@[(I!_Ir:N39\r%jRNFYE$kmD>]BZ.ONS;VR@,N5+I=J6&k#pEj\,ub5VC@he_2Jl)KL*)0$&fV#.Zhs(Ol'l+I='rnq:8>J4g.P\a1,FU#&UWGSek+\r%O[:Zr^h*.?H,[)95V>jJAb@;]6EYWHG^>jW$B<XV%1"-/>Q>49BKSV/ll_WBi:;&g"Fs_]i#9I(N@eiA$jsO-!LH7.'cqC@!\W,V\r%BC;gi"'f^]WpHj%\Gq6tjRNFYpl)J0>[^VkA<>"+R]>rr,KSsQ\FBB,+lq@).=;an/l09Z.TEAi=&"^Q0&(FDXk<X]).!BD+l-(2\r%]7)E:#m;`\GPjefDls_BYL+Zg7_\3Wk("G0G_X0N8&]D\'F/MQn_3u0gkfhfU+(HEK@Mg=aK30LD)o?$e0g<7[iH!-(Q'HK7E&WV\r%f-ad,kchVCHpC27%tQ6=hkY_$4!4<-$]>N9'sBVqrPRV^8&\uXC/J+2JuEqcRX6IjiOp=P4,H:$.(K;TOG^n;7)a)4MF(^P(5Be`\r%<YWFBiXlq:=0PAeB]5RrU$[np::0N:ZbTlgdR9#//h&W<&br0=VGgTonPBM1+.qaH[BKqUIqjc;0bt&6+.np'C,Ss<)W0@]=DP;U\r%M_V3=nk.>?>AFDbi?/D;!%6;YaP)2@n?)fpK]8%gk1DUF[8u4gjc_K;`@&IlnFCK0AjS8R[=W`V4@1d!EOU:4mr6++(D5@pA$q-Q\r%#>UW]q.+\'XL0gP^-a(YIsg7eX+4ufctK&Cm]eK6WI''P&IR>mBtJtDki,%G^5gQ5k%rkRW3d\3k?FJLVaQU'Wh/tgqd10_'PmBk\r%hEaMCZqo)*hjRO+pnY6Umc<NpHcb\%<M\Bs\1?B!4_5Co=j8&9m<An>fT,/uB%9<-iu@1X8a$JmkpXqO^AnON)q#n!Er0L$N]k,6\r%PjTmCJTS6(g,JO.W1Z]ob/,?-cg3f#V\HQFf+L@/P.cW4+M.$q%2;OF_\D'UB((;/P9>;Bl@'RA4`&r"G2W5C226]2A-]8ep7BC@\r%OJhQpBCAt9Vhrmskd1!h;Dfl-MAoGZDe//*4o4M.oL9=]!jNTukW1#YoKE';4T^CEO@gtBj'u$CZ)a+0AFF59Ks6h?ci2UE7#fXe\r%Pu<Y;#DC$@<(a^h-SqrjEl:0JU39]hdeDt3pB9@a+1P4k!?VH,?S=%F1F5RE]6VQd3[JC';LY2LG*Pscp]nLIOsYU<5'p)_]:_aQ\r%USf07>&/kX;NC*,^m,<XV%1l(9pDKMFK`2+1X8`J7[6l36E.1bV=",QS#-RY;YN=E!1tCf,5BN#k3@(g6uVEu5"qf;,E,@G.!e;N\r%q,i!B!r1:2'&n]g!IT&<'3^TP7IX0N4Fdp-6`$"lj[%g'.HLinK<Bbj&U[OYHli2YfLdS_!1tB_IFUMSNIL<]W*B&-KmajDPu8*B\r%J>We78u]KlYf&\pTZb&Ib)s2Hm#A?RP]@I1BtF^G/#@Q9i4*(L1o5,()Wr8mF%G2]LNe=,ki[L`r2'Z\XQ"XF;u27Cq:U\`*7U/*\r%1;dApk.#hi:#I.CF&5MAf<_+,W,[4B#X^0E(?6NdF&5Ms'5&tIo@AtV&\ee5Urj'#]9nN6*7WC\?Ao?$[(r*HB\p\>4e-QGbo,$&\r%$HPp=k+J"C*oaXhC.ZHTVEfe>[:JWag1GHXe<7hdYSOu6W$O#ka^=sX`?g)$)+!=-I\ZUpRD\@D78/cEO;&4?l"uT^`PiqWA;V_A\r%V![i[(;C_T:a\D#%L/"%fNQVt;aH)dP'TO*j+.ukkD8QUdVqu3.abGX>o.6i2uWV.;,a4<PtdHG6GLK70!Q#'3M^S>Q5X9'Rm[%,\r%YS[o@Rq$:K6iuB']!_d"dkffU4QH'U75s*`4j[J:`G^.`oE<'\`%t.!emq8l)M^:8grYhE3618t5!I83H@gqTof1"V_0"Ys:tWhQ\r%0hF60(oN-(&Vk"hj7EoBMneqCSE'5]aci7SoU'Y7SoK)MS1F%f]m_\0S=[1<b;i<n&/c8BL.\0G+/ej7-W0AldmNRr"'P/PdgN70\r%V2E_(eI?M]6/X^cX^R*.S/t@PO0L8!35,.#$Qa;6\5cS3Pi<OXB./SG`p)H86Q9UT,>Jb^gY+D'Gf8j?44tq/+i-.c!W+D'UQl]D\r%3bWgVc>e/^BNs:P`T[Di1nX#?:NZ@Ps-^"gC*L$uhrs6\2f"]6cA[Y66>J@:2CX(;2-d:NiT-W%X3_,>'`$-ETBl'obL[tFP:9EC\r%X;M<E+6S??`t"nsB$9+7jk($C\02Sj?!g=[8eFI@4-0fp+CZ>hIGZ\<O:(2[fO5NX2q=%Jl$d([rTuj"J^^t(UV@g?`Upe^=9Y8H\r%d*^a2O"N-,.W.c\]odS.Il#^rVe<9aF<DXTaB#+221MlkrcTD!*V"hVBY)jf^SZTR2X?eQj[KYA.YWQ+9#!'$9k?c2@[5b28+a7m\r%WIUk46hIk;?XFaC2bV%J?=q(A.ZeU\n0L@0`=f5=fC(DG-Ga[TZR$o*#9HLK10Z'hQQ<-6jQi"#%>*8*M40r?!@_=r/MgrUSb2Rc\r%Wd"ZkQ0.-8d#2A?La-(U[D9qQGD$jTmJXM/B)$DQAVM'f/t@DV!ppTUiXn$H`ScOZB]Y#Qi=&90ha5)XhNI`CK+`SpK#T,?jG6>E\r%,)jJBF$uf4&Pejf^ZIA<9*Fbjkj!r*>U!R3[-Q_j&X=T?o]f0sFh#!J=h-r9&D;(=JlOE80LX8=)7":>J0=uQ*3sUAJ0>QDd$76,\r%%$;ZeY$</YLnJ<+AE=F)6Nh_&OHiHA$k_::+Y/lb(aA<p$Wjl,^_!2^/.Cr5DjjB%L<)$uS?R$jJ0BM--+:>,D&dTAQJlhM'6V,_\r%?.Aj@O1X1Z3J8n#j"<:?`B.(0mpDt6>f72Ql9U`Gb7/UQ*o:k$9*EjGbuG$L\O=4EWQ[o3as@+D8=a0Ui3#I#o.V,]rU1o-^QPGV\r%BgE@8XljCT.S7aeUj/%iJqtc/Zb.d-Mghdn_ZYF8P!esA0d(Olfo;0MSg[_k1<5k(K&bgKDTX38#(BpMIobY*b%F5&qmMVSJf(A%\r%M3K!sb$e>%hk&m?Ubsn7r:V:h"=DXm,'(cVrBqV"m2>XML^XC#4la8IM/Apf^HLVk"dX_sT!T2,#[nJCm7Bt8h1A=V.F5MB]dJqt\r%kK0O*^gY87nCobe)g?:BniW=q6B`$@c]dSq;E\'.4AVj7$,)J7"2B&0jk.N9l-3R_j7Ha2R[<3ZF?G]I>^6R'n,?K:Lsr\QF)[&d\r%1X]%.`p)G<`l[g_3hF.+aij9d:X\:bGqpC9OJ'cJnCr$1=)0L#'DUr4pPicXG(JNWY;e\l.IlskRC<^*#FPaEHTnEZ??pgf(-IjJ\r%"2@"Z^<mg.mWk7^qaRV4]>/@2\8PJ$R0A%d`dOV[P+1XVjKi54kN-tEq(+hmkBSi72N7B5"b(gh=kG5CeFSo`,kdS)&?RhkY2Lpp\r%Pe0#>`)!Z+TXRlX'VG;APMX/PV3TtjmFP(`(+<+*_:&I><_ISe^3B@t&:?L2Qg,Ds%_`q0$h@^cJ1h0"6J$nrpi8VQ7n1Gf%6GZ]\r%Y0,Ca.&k[a53LA]_;OBEI3hd-?u5^g9J,$qTSrOP)"*1Pa_&3Cl`Fa+FG]`")")&/M;-<#_a&:%^\#2IDLpqp0S0Us*eAHpUJr8C\r%i2u,[BKi&b`Zrj#?cq&,joiD^Gm9^QqD$9HjqrU4D_W:=bc\P9KtpC[jj(Op$oH$"$]kO<):MMi<(,?.68cIT0n:[',6Ur&mjU/,\r%.(&OuQ5G>l(g<ECD0O4-8p\'-B`[+_ob&,8+f-fXW5WB+8lQiJd2s\,*gXuHq7:r\!NVH:;u\Q2$^^aWH$Fctp4Hs=i8C3pSMm:U\r%o1@U9V3L2t8h9Ke)c\>[g!7\+GW7p5_%BtH)>js9RTk%YbX8_31&=m/?2<cgS&<S]p+CT40q$AsH`K/L0q$AsYEm#9R*``ElB8IB\r%qZ3.(8R55?&d8Xe9Q`r"Z9N[jLHu:@PF7.)GoEL:\h(3Zd2JhAYlb>a6BrE*nq9>A_pe`A'ZqQ[T;8AfUr!-OHRk;:4HA'FQm5+u\r%$Dg_J8#SAI,of675n#0lUCujkDe-IKC9,Q>bQ5Jt]Y5o&0F*4JTp=n?$2&87$E[8<:+DN*&#V;hOm7Wkc_cfh"eLsWUj?!,4gepU\r%&`iKc>UGXO+9J-:W+U9p:eLDZ?K@L8=_*X%D34<THu-\?Ye"=`o@N#hMc^J+!;^B"91T"hi0S:,4ZtlD9$,;(At_L?JHd;Y)9G"$\r%T/1__d]^ISYbb<[2R-:kSCC%;X8:%baZ-k_9R4I"oC\f`f"0aq?Ko'/:jZ01Znmc>S!F?bd%.8SJZ\>3FE>e0`EdqQWA,)!b"Ohc\r%5GHp&?qn'O;0n,>EVd@L[A0nb'gP!YVUW4_hf(;RFY]$4X#oq*k95HFl0]8!pG]#1FR+/Mr6?-hXZ-j>d>e-ZMUA+XKYjHfHuWPf\r%M!Fk)Y[:=p@X8n'oPCVKT3rHF[!B9YgqL4EW2m(h@"'nG^9me61'>soIdDJc[8RY15ma8i,F%XS-glVMY6L+@V/a24GNen17OV@L\r%5."n"pp(XG%gjHfQUWBd5,cE^9,Y785pS<=SjuZf"ahip,I_tIE7^85qn_Tl+A'mW&-_O*q1>Qloh\b7Z)AcpF?PkWfJ^Jr:7GJU\r%T3@7<,Lj9cHRGk7q]N;/OY3!>k1f;mU"a>[go+#KMI^N6*54'%,DRnnC[:sFH"*!tfjBaF?L8O:]l%>p21ZE^#RIN]*e%I_<8$`s\r%EcD3)7^K;-pX/\[pZs;*gdlgdFY*ApaXd&_=NopI]%GM*#ju0(l$#QO<g.)O6HX;,]@7'RIu0mqplujW;rr$+=Pn0UVa:qheJN*g\r%jZQhB.%uf`1IT!3SWM1f0hoCsUh=b&@@ED'k*YGp\RauNF0F9ZbFd4?a!eC2e86RnDX^8gs-i@<G?3VE"&49oGjd_M!^%j:Y:`^1\r%kDPo(lFB&77dWFM3@_<0Ra*Q)Q^l;GR4[&3?1.EOBR+V5m_eq,*9asfl!<ib^%83ATaglO\.O-**\i0Tgo/K>Uh$$Q*&5EISmHJn\r%<e$BWQKk<qfG%c&f3dfIXBb[/Qt@nZ9.JG[[cXMW;i:%&Z7C_=$d9B)AQWBu3]q0ag\e4"hZ@bNM8iutq$"NDMU,Xl#q">)BpcFK\r%F1HYpW-*'sD6lf;'c!r$$JmGeWi/:]Yu]Z%CrP8:%"nFc%lTMdMMa#DE_!=I7.ZF)5iZ<DD@[ps#:4%4MLo/>q<GVa7Ajft6<J&F\r%'`oE`OBk^aCS\,nVcd6A<+%r@l&dVU;gB;&K6:gA!(teBJ1Dp4B]dS;T\naY6s"'a5tl""eCW*V&lgsp[o<eGS8j*lfO\OrB3_)I\r%-r_"Kot!Dp(:IG9*E)kG;Q=M?hb%UpG=\8D9@LIVLQk"Q;c@AHG=[.1eIFA-oW1'QVa%BRltk#t3:"-'8=2f^)F[/O<#?Oqh9JE@\r%.td$OiMfVLOcJR<,Z^:%&Ecp8qKJf8?/<Ra/8b<H@N&gSpcIl"Bu!q9O(u=t0Y;j#mce]rqCV:D@jd8bD?cm3lZFOumRr>mk,$<S\r%O7(?Pa_@M#=Lu^)CU#k_YQjljY*XpWD1GSM=PDGf,S.JP1BPSM`mI<U*1%r2]Y;E>9@rOgqr=r.4o.Gt_Ui>D<%&ThJWV7YA0F@u\r%JZ\L*l4`&Cpa$RG^%"J+RD5n]eHT]#i=%cHMr>)5PjEpT$_6b*@SG_hs89-O<iUFi3$UB`9fP,]IqjRE.H=g$F:Cenp*!!V0pQ=E\r%MVFBUDm^Sa3S4XS_*7nhrH/Cr,70N!l^3]Dc4'BrNOJ,Fa0ciAM5A"g+190io]!oj8PH+ieQMg!fD)14M1oXkbFNnSpICsJ)1Knp\r%Ip(C0qBc.YGPkXsgekk]^HXV[dTWEZDL<T2%IC3WPpfN^8^HQ:aZqP)79M&k/\+=:@EfNS9@?!*".Ri<eG47"OVsbP$e"G('@nYW\r%[F5W6e$F$Io=4Y[e@$Hsp"cVTjA)Q/QK)GMLTu`$GUZW(*50S?AakYNlf_*(.fH&a-=!g5qo?Sr%N`NJI!tQhTDrl]j9O=7,ftK@\r%f/\a&W-hc]M)o:/LY[BJAFp2<17oH4$dYb^B82/Z,CuP[rk:&;+30p<pS_+RmhSujNnUm/GsiCfTK7f/">VNc@mFsC1QDKArEt0b\r%<,i=[jUW-Ji.57tg`.FVRo3ZLp$Y"i_Cu@aA3[%C^Y^u#HPQPI:\/FI1Fjb]eLG+^UdF8$\[4/GlUKTMbItg<`NJ#fX+l)K_PIk,\r%hDohh?!(M:!?X8;"i6;L_p2PnP%s>Im9a<h'X(fB[O8$2Lbt:rSAN*@)8(<0UXPKgRE5G32o/E1gbKc0BIbnG$6kgg,du/]@JCjV\r%86cOcp+$QhmjOTdJDk^%,;[2!F<&e_*"%iKME:bXGZNdIk_q7DeG1W[J:D"$WUj3@5uoA.Ju$ha-NI&VCdLE10*!8kJJQM>*Vh-7\r%Yi(J^;?=[$+C?lVY;FgN>Mr'U4CS$>9ou,9')AMY%U38[RQ>\3eBhF$#H;t=MON:JZZP^(+$ZoPVC]MP(4V-EF&K<&7[b+2pYBaQ\r%OBiN.OjfHJmT7dXGBP[`PBq+s;+X5UdA3No^@ldL_XSB^dHu0^G.MHK?:X7ej_L^F;ek??$.?o<5l^0O5cVWqhNj=#T+V,LoFAD0\r%gs0`DneVV!BKU?SS2)(F.N/il]E\b`UPd(/4,TWgGSU?6JBlGF(LccaQd3lUfkK/;@\$eFqfEND'iLB9_E(Kh6Yi&u,HS5nlJO_h\r%nHb4lbq&hK#?N\)s#/?@s"/Z&qZO9#3;c*8gZ\AK2/tuPgOS!9&96`'gCtX7%JG_`+`=5l)c&AC;MXC1gY`Q'#!+Sjg'/oE3f0=-\r%]ai;Z[LpH.`!mGuK@XQ[3])>fKq:m`3])>f`A-hu6JM:r>u9e4r+R,!1$&<L2oD"G2H[T[>./T2\J;Opfc$e>_pc&+bC*^8h0:kP\r%;<cFCE&[!lY_OirFYqX/>&pP=QIGeAI%^rIP2NKS$=1mAVk?mJe!KLf29<1c4cS3:]_7n96C7#%aJR`TSX"2NJX[=/e-CXA&ZYK%\r%\%i=B0WQ#NlcT2J-="oQ]BL`k9#!&U\D2!pGE_/S\li2'gNMNq:8!,-FS>gdH8$d2DD^JKc_MiZ>*Gs+T6.NhH$V,8BEd-II[),5\r%NlGAhp?="n0/h8nWhI%^r0,s`Cq1tKc&Cu'h/c:b0lA)ZA2in$$/JVBS*[R1L_2J\SOF08lN^BsJI3m"mh-$["Ns\ag8Ys?"Y-I$\r%G=W"T!g\M-@,^sF$7Z<*-!7,6Y",5DhcUkrJ5p?8#nZ)Q!J<sKQmWFl9gJ)l-HQo,P9tgo9@1Q+[jJA>`U$-l.K6#8'0u"&^;W=F\r%p)bp+5B'Nj2EWB3\/,+S:ZJO7Is=cLHUQ=B_Z2WHGOZ2U5(HAc>5VlPUKbZ!fe(f74/fJNRjBk15\M>t$%=XDPmi?T'#5ps"LL\/\r%+9D+6dWb]W/6C4m.-?7rf4rAAL9PID5=bdfOf>)u1689X*Z?3:;Yh1r%h@1YbaDOqbHRU9_@>kHZNrWL@UZKnItds;/t0%5^>A+]\r%Q)IUH'8X%I;CsPsMKq<AELQf]mc(FP",%Zb2*%6YAJ&rB5UTPm!%li3?L"FPZ$u%cHE(.Kg8Sun;q;X/Qr1gA3='(*lnGILWD]Dn\r%gMPtg(R\s;^ou"#5__SR.QBBl.Y]*DOd\osIL[$V;YS/4j]$SbnV_t<+jf-\\&L[7!da%mB2D<?Kl7k])iC9C8okI:bH9FD%+&QA\r%7l4W?:o1u<DUPM4GL*nV4HfuCr?3eKl3JRiIu#n%c9a=#G;;O8L`=S=\iuBmLf`7(6el>Zh#?@3Xt8u.Gg(`:P,mEpP1W7f%m_R#\r%(sN'L(Tqq*;g6(,mQTOHb/<YMGM2I#F_U)]SF,`h+:prdG'@bGa*ob7G'AnGcu7lXG<`S'^b[p+Gj387CMU/\>_b9!3bsG6-hkb_\r%+XK+NTWErnT*Y.-5F).Fa3_W.-f^ptcdXZ_0AmS"8a;["DTMAF>gF]@C^9,N&(#g@4"ZSmNqj^Cm<E;=p.HF\!pZ`m2@t-dFmT%<\r%-XTqi>Fqg(-=3o)m?sl4RDsD@cKCHRAfBD-O^ID+5@+d6Lu@3lL=/H/!/WLi)=n7S'1@R0A+4Pps%$cpk-9%9@pUn@\NQB^^oOkH\r%ITXk^_*^#`LQha)6U]-XQ1@`:pWqd99O&?$Hb@I5G.+mNd(;9PI;Zb7Q4"OH'sk[#?e`9I=g[i`-RI9SD=qriKrUrDa@\Po"iO(u\r%&q/R=V=N;p@J2q*ET_(#b]^Z^>+K@6om?"%cu,sX2bWP&p)L"2!e84B'/[d8`iZ'gIS)W%U82O8ZBHZEK6`n`nC9sO15.0rGm!$"\r%)M4Cr>rrt!W5_k:1OV1:0c%=&XrIpK<9*dKnHL5Pf_Q)7D;p-`7HQqm=g!hOe*_AKikj>F/^TuDiMd6imgefc79/U0(gIq2)`1Em\r%Vcl0a54TThhT+GokT:J.2C^5:[FKg@SR.OIpUl]O#0td9Zh$W?[H>p6@Les%+/@T%%g!7^fheb:^`C(Sa]I0s,'^LH,t>o0UVEn!\r%kZsUd#6(<oZK$XDji.M-Op>T7NL$='m[B,XlY+j2m<EK;Sf,DG2?.GALl8G$eX'q]O^Uns9asK'j6b6"CZ^#dfp@api`h7SU4Q)9\r%6Eg/h5K6A*1_DSCUW($h(G]7>*\DPc?;ON3rT;!T?dCgG9a66;!OZe6N+X(aA#aV,AME1Hc!#J=B47KGC3"V,YZMdi<XDjT,f1>E\r%!6_,V_^i4Za0U);=P0nrkc`8r.rp%!Z_LPL%qgN`gekM'>R^GAoJCoF^lGdDQEV>!/Lu=,,?A8:EEQFYjGO7VHqF:RT`F#2hC-M5\r%M3:<b"eEjiJm>p9#`".UgZbDE@krRLT;%PiNGAeIoEXYSp>P4K]D[sf5n-<5,4)OZF\5m#&r],8QJS9/F(b',l8+0E^^:!,pVpAN\r%@@lJI?F"/E.5V@gVJj[_Y37SC2C#FnP'@c8S>:+4!1m$fJk-pe5d@CN_SZM=&71%t&&ULb`.ukfQ-MtmCo@/M4BkS5j243=LV[22\r%@=6^TGaQ(]KWk$!*DHtC*\36P;"_Dq*'^F^WTs*BTQ?U&&$/d)REoa&!a#CdOK.ESmFUEr3UZ$A>I/)=l89SJpoD'Z.$h>?33Nk$\r%3q,_M,Ur2i(,a<7"?@EJj*jkN6%YVRG=hSg:##u2)(V=K:c<`pK';(tWqCp857\(kg)SWeZ\hb`QGu_h7Sk2-#40V,?H/T?GX7nr\r%I2jk517VXVe4>Pu<479B,W>W\IXee"j$/grhjBZ+N;ms[$>gM+FJO5IJTBg&FqY!1koNit"$!8!$eRCN)(<BP:p^1UQ&FK.dFsf#\r%=QJ,GJO8Qm>6kU(K0m1_KTS9/XpPkTIZH82OB%rS;*1]]rFPAi6dO-C"$IlRpq`#]5,3lX/a'0"+lC_C$l&Zg_P`\7>eBd-mmfQh\r%^^K8*OkC_g)=p^(bo<ZqY-rJK<hB@G5ABk(M0"*sHJo;9>9]h?5X#R]#QblVW;%o0>dTJu29o`Td"m^W3ic;"3k!DA[gN>FZ7GLr\r%l_pK+`ee8CW^5O]bM(8boPCYXL/]mTO'sc3h3;C'S$JM]]ZNG2,J"m+\!VF_dB2d,.PpE;8g'Yi\9Mt9e%Zt<3)O>;o\cD"UAB1\\r%Q$qYl:Z,QiQ@4Kags*HR#S_IkgcAu*TAeQdhm5ji'#07@Y9.X,/+#Y]'!H,d7q/mX]?':#d>]8<@e],6pjZB$'R=NeGb?/M;rlX)\r%Gais4$#bnecrTu4[J-KVAi"<6Y+!@3>(70[Xl=O6c!tV0(<lJP;7FNps6llb)]TpVl:4b@"$\;u_oq)'44&>A\V3RQ77cJ4dNB^]\r%$'-F]"1atk,TKfFC+GK`R1@+a*D"V"/^r*VVkrfqD^eAFNe,1I0*DI>RKm*@:YaYskO'-Cp$p4n2Ka[6QXgCRR!iLIlNgLLlo^>H\r%gf>8(MfY>Q`b[6jZ`nCQ2J2:J(8TR:^<G/&k2CKYUbjRj7Rlk7jg:7sWL&k5c:+"V*QGorErn(nCOig2gWF>H9Hn9:j1K"M<1Y*J\r%ZNZ@g12\TNZNZ:&)7L?8fb2/%e.ON@^fc32k]*u7c3AL'Te:Fm>]?$W]p@qo*_Xgb2I8J>*>34ID0>)KHW%cPqb,L%VK\.k3$D<*\r%1o]-%-S/`D*eJ!*8n.DcI>4nH?,d.D\k?$<oP[V6rJ+UI3K3qN_D3cim3bud1F?-1LXa[T'7V0Q`nWo5j8qmFL2oDaZ'!]h6PIcD\r%ed+r77C9'qRQ=&E:4n(r+nb/h%8Wc(47EU,RGL+<+_E<c:t3c%U=Y.`=(O><Y<#Lj/c"Zq!mF]QW\iG-QQBt1qhIO@9`93C8*E1>\r%7gAQ,O$T%kW_fNj*7F-^+WZA>ETgc+,@C@*[iE6:L:<TR)s6"E_jV%`X)pN;hJ`%-?UrqhcY\=m)eO,!K#iu^1V#3`nSr$U9J4Q:\r%/'=(c1V#1r.</k89J-`c93uG%ab:$F5;paH_U*Mc`eKo.%/,m1Z!le^,Dc9M0Tulse^B3^_cDI`5W6jI_U'1\`eKmd(k*]N@`-E0\r%$$bNMCtK:\,^lTJ5$"\&@`&iY[TitKpWo;"dER:Q1GPB7OUX+W0J0>h$QE\Q/"dmE`J0dcR)"gn1V#2QA)tU`RAapf^K:qnlY];*\r%rOhTQ=_;WJ1c\eMLs!B&9%t(C]80&#d7kY>Q/Y5h9sCl1E(:LnM@gM6TmM_7-.YX`PCl0`Z*g1BghV.,b]6+\j'c8QL(`7)!)d+h\r%P#>b6Uk.3^.j]p7TrLoN8;UbA$r9JX.5AKDWN&^RPaI=%6Nu*g,DlAq.emj-OD&SK8]ok[8E-OL2]4=9Y%>b,\M7Le].i?^g__a#\r%Q,]$jF(<"mVECEu3.)7]J[mLCQ;g+q%Ld)Oo2X/Q[iF>L!PNG6"+0P!J6qHN=MU7CIA-^KC5dlqXYl`_%e/S1?L$C$DbH<j%NfCb\r%O9Hr8lX-25Z[t9,bjuRhnRZ;CR\$_7Hcp/<<]#JKHteEuhN^_W&6NCM:EliY\6Wt:$]Ml%J&hI!R#/T-S1?c/bl$]"^!@"9Km))\\r%+YXRZJZ=nM!]0j"E("(\rk`r/Tb3Yp$a_p7Ro,ib*Z*&5<UrgU=S3_Zr4o9H7jko49O_Z<B&YJMlhU$59Hp*Y*hPOcT&0G`^fZ!f\r%:B'ueB_.n^H4HRgkJ%5$B?[DIl;o8ph4(c:WgEAcg$"'<.@7!PB&A]d=@@Y'$96R?^+S;EJ3$S9;I\SjKBBaT:M9rk<Ff`q54WDT\r%\iZOK*O-APFD[k>H'jSko<B';ctr]+kdQWod1)OM_V[V^\Wu?oI#>tl)#^J(Y'bBDblQgFjFV?$AnkME"e9R`An\U]Pq?mQT$",k\r%MGeS[4%Y<6Gcl%^C='GnSa7\:)Id"C`YWg:dPo+]S4qZL9A^;=nI&nu/:BmemS0A=Lo#$G`Og)R*O55s*.f"][#h:2(46n)*O0\S\r%KnV7:Jk4c29A^:2M"D^mo[/HF*(A;9=F/VThoM$&Z1R+ENl;cqA"uFP$onN)N4'ss^*+7)FkGiP]?O%5\$3tGD]c&0Sg1H^ZHc$c\r%;q,MUX:00uh1e1G%2<-a&\ur[KdKOLiCl<>T9J]/P-/DpZcl!bRo/h5*h&*kqM&+R\YAGHV/M/i^"%3FZ1RjIRKI$Hfs,\<rgWjq\r%cAl$'L04?hU[3f5Dho,rqMn\SL04(RJfTuR+]]0=4(@Fn@^5BeZ6P[L+VrKFBKK\f)e*f>+_<,II3t[R5bj%YDdO6t8Es:>_DB%,\r%n*l5=c#6,(`AbW(9dh0&AI8j#\91">b&;LkIW@*!%?]PN\,LY!\?k.\>Z8m=MINQ4=.g][.#ORDAAe2FeEOiZ.$d/J46FJ6'ZGgJ\r%\>(I0S]br,PI`FUR^OW1.Z$G&\HMP%:J*14eSkaP/'-g4S-r*!78MhRjL8q&5(-9Z<IVQBdd3+Sc6g:Hi>:ASG;f9aHCommK)8o5\r%?YV;PDk;,[>:0@L"2Dotm-2&*,teJ7:]-B$gg2KZdAu^S3q=Woe@fRN'pg1)c\k0:CdC@?cdS2`mP@"ZQB*su2ukIB;7[d=2UUMe\r%bKkeACV$/r>B'RdJk1&QpN/\i]MG4o;dY[MYYPGFV:KDFWLJ_JoXm0Q<3UI1s(juk4NS^Ocp(_GY'u1K60"F2B+(HCR)Mj4;VLPf\r%WcMY^>5.Yf\Ufu*r"@^ZjlWEA2M&!&b0<WaD@X+(.Q9:$ggb1!<,QS'>:U@#5F!>MA*9b1F&QKp(JdUE(A+:V`n4)Kk,*1[.PU?j\r%\K)$*(WLnR2o5j4"e#4dg^#.s>7AX[MEZokrD[ZfO[kEU'/a.TAk=I0hkJ&':Gj5a<<"cUf5*`tn+0HKrM00)8i<6?j[3rsDJDAm\r%3LQ;(cd_Llbl(LYNWXNaZ1V&+\Z+`&Sf+R(9K/4Znk6N49a#%gVkS!l%\7Y!Hn&:qWSD_A]`EeWT8Lqm'\#q?G!%XmKr(Ea9sSE1\r%4.,iCga%6Ncd10<jX/ZuGb:t-MT..bgeX2SEDthE(h,^0*Xl#'O]4^)VP8`/"4+'uf;+)XqNXcI#efu#1fa@t][13-XOPk.Vb1pq\r%SRUD9"`NJthC7I8.Di_&FN0[j'RtL^mkG"P`?1_Nb-(4>`I^l,^0_3WI"L4?9G!(G5&m4jkn+9!dQSd?n]*#gs2@ASkd8@o&W/e:\r%RH#j8ckW/I6kJ#o'RtKCT^Oa'E1lLTAOIA]iY0Wb<_A&)O&*-ALsQDRI&9%56Li)D?Cb?.#fRmX5Qa(UKOWpSGY$4b*%8G]18F8u\r%n^2BGp]R]Q9G#?o$K#W&NZTZR(n[J%muC59D`-Y1nQV7YU%mX]oNd7a9!&?ca\B>E1F^`74i"5.';5OlU,tPaR+2S+78V[p$]S!\\r%nHnfG]3Z'IQmI41>sHngf5@3oZMjO^a!-B$<>Y:;l.)=ql>Uh=T:d9IJ;&KTIS>fJ2"b@(.]<>n(ilkM*C8V1,8*/+LZD:jFGAX]\r%C4(5UMV;2biM`^J]O+VqP[EFYm9frX1"r.67ukla+`prib[UZ'C0tn=q48k75YhHZW2Oif;h>j)^&NdX7BP`</$Q+RFi8MlFN?)#\r%IA$&GY+h5()@onHqq"X(2H>b"1sS>eB7:CD<J+"7X_3SO])(bCC-?(>@Hne;DT_LY>0c0Q55LN(q94qOiXQo:1688-D2Z.EqiIV<\r%R*)^+n-8l'EBA%/oW703:@$e3MlmG)47*WKSd#Y#dA^^1X=sd=Grek3,E+^5!WPKL_2dZCV^=eAjNK7[1JCGU*8b*NllcPr7*c4M\r%4pdHZ[K<:EY*W:.k_:)(Une/"C`T2=4("33\Irin#O%J;%[rK*STdd(E]`rRVY2l9nI$VH*Y50p&KfCXO?gP:!Nh_elXSuu-!j1Y\r%a9`*5db.8hHO"[Ze?K+-"Au![`)ao$JHUGC!T'*+fV.bg*W2%P@,<dZf2r#_(&3+hgX6Z:8k8(ecQuB6+Ga8Hg)QbOn$*3#)[I:8\r%KtGo0(^;jE0GJ=G!"B5(KnTs=TYX/ZF23NsiYj7^=9KPhTe%%KTp=J[1]34]B=H=6d]CJDjimO+s#8Y]DO,T1^?n-#d"'l#_SM!,\r%g40+2gOBuj#&%TT#oa.8K9kB0YP8?T#+Q%1f*ha##XALM(Fs;]`;QL9=.NsU1V@+L+b:(ZS\eF[O>Xe7(MnU2j@2lR1[E+X"oLJr\r%<)5!mL8^mP3e:eod(ijUhe`nMoR5'Xah,(D/*QVCPe`;\FIV^#C+(jUYWm_[Su-*]3Qi57gWQMg]FdsXUo.kc*b\_QnHA/i47W2m\r%rVC8)Nf0%Ir.f>HnPT$44_oGfoU7$a7FF<A6`s!9*d2bn`rqsd<X5oF]AU$b+;u*F$j\/i&IliHT4a;)h>0EJWRY+fSq;:QHi0@J\r%7Pk&_RP#6%bdCLgB@c$>."!B'n)d8ios`eT"A^t:<K+npmD3T(`"il,?Dpq'r<rP+ZktsKmD3*$f`%'o*ism2a30A1hTuZS94o3u\r%OP'8[=0HqLP<N\F2K*AcGc$P\$?30g!/gr^i9,eW?u\`3@"58#>!YAZN1m4h=ofN!Wb0@6\X;$WJ9GQ?04r-HUS8Au5mt#)7RbO[\r%:dCPib_YXo/=@+5%J7+a,BpegOT5sU?dF\drPslpa,Kr(bfKghGFiT0,?ktu!aUH[)4[oW!QI-4P;@*N%;mp1k5N-LV(@toP,^?O\r%^2s.s4?YK[YSBcWeR&,Y5'$T]eB+j*Vp+N?24K4fl*0@koXn!M*P9TW`3KCAk+ani:_ji%7=5rt5%ibh0"cBGh%kj1_]#G1(gIhX\r%jReTJh3f%_=(+>>BtSo&P3J+Kld]X_/)OT\(?O2kB1k+Qp1M&G"HMm_F@dkY[!C:n6=]7(iBCRd4!+%hW/jIjYK&[o%6-eS&cti&\r%\l*aK$>6ft5u5M!-\qc;c:Q.:8O]W7G'fpAf;k)a?QkK^"1RIfq$PSq]lD;&a6U.T']*i+oDKL)EM\GYC3io&<n!\Miri&t@lb2$\r%\5L@l]eM5u2dW[gb^@Fr"Yl7O;TF%\4Qe2QnTpu]RGpj5cW9/i@;7#3>q_+,G?o'p)mu;"S0Y2\@\H:&h8uH`?mL)+)j@VhRA#9"\r%'i(jFI?<4OZtfo+&LPf=aF1eUs1ZaYoYCFeg]dt8Dnb((d'MWBCgS/0EZ9ig.Jd>o.b00Z2&dV(WiSG1@rs)J(F:<lGZel.!PhC2\r%2tafcoEi8jL\4W?ON6uG5pR)fC_nH!QJ"E&P[@m[IEL\pL>FSrM.S$)RBD^S7'dtlKkNs8R<]DU!YN[J4>UHl41E(6kF&%<9+[g8\r%3iNM\ltnD"28,5%d>ZSB!Io,lWl;%uiJd:QRZVi,kdPLXRZYT""R\Z6'$j5_Gn\Fn4>Y%riCc!Pn]\3Mk=RQUn]Xu3fL:B6d>Z""\r%doK+'d4>V<&>anF1Xc7("aeTDd;8>OBd9(?)f71q9f.KAQVE:W60J#5(0)`IQ;k6CD^_IB1>_m5s-W)jYnD^+%oHT_?QWJA`ah#S\r%URsuB%sc85j^r)XE.lNPSK&aDdnfkSZJ6GgD9mp](o/![VOUL'O`W^NEi'jSRRUdh]ka_O'rbQVnuA,rXGImVe/n7[g^k7op3al?\r%[AsG$7(oebfi9L?46q=&UsmM`W4q9rYJGgtVDg;=T2=FsJNWJ]eq(7\W1+j*%'rrc(eN4_HXBh4Z@9f*XHS^Z#%r<lQecA8$c's"\r%qH91Jl$IBHr)/'hdU"3LcWs"<2$GDBPG)c=bNQ^f27N^r[if6O]dI4bF^]nQ@!`9mDa#(E_:i+H1_Y=S1K/VaH[VF'QfEYGB14h=\r%08K0dlW>"`b9=PUR[,1KL!@\Oc_^kn!:9FK!1_<q`4Z*Fl2:2>O#V)NmCkHHK>Gq==p6$FpKmhIG+1Ej/4<loRPc.\Ka768(*@;%\r%_D'r)$HadfjJS3B01gmjpbolCWZif0YRg>JM/JehI)B&<ND2aM@,.uEpL`obZui5n#3*\@3/b#Xb[p]m;II='n9u+>=W"-iKi3JM\r%D>7":VZ$YSGZY<sr93Fg+-$CY.m5%D"_R$QoWATsJXQ@-&AqFSVZ%4Hn._7h^[N:\8.*SKpW?Ke@8mQg1f,WTC[&b"#-BS6V,+)0\r%F1\C7I\WJ;U7DD7d^$`roGPS]D!BF;(aLr@G0u3jd^J3u3r3-T]B#I)lDD^gY/o^)aMHO6<cS6>le7DI)`uq6Ighl&K%l@3lY"=0\r%+\=I_*iS@UFsM\-+B_Yq8]f2g6n-Bn'1R0KdJ\khC$$G7qK9HG7$Ug!+jKLo&)$No;47edE>FEg$S[ps^t8u$cEqZ`0c\L2>^@i'\r%,HMe4[a+.S]Bt[.fs8;`F`)2AL;TE;gL*R1KuTN=gL)]m&/Jp4XJ3PY*>W:V6&YQs9UfiaD8n%>cEp02``6A:S7tK&:.UmhPN!pF\r%iGk_hMApZo_r=@Z'K=)OR$PmgE2JJ_7.-RZZc3bKQ7AAiiWd#6$TZ[T;U[022^UEs28p#fN5FRJ4'eE9E2H?RUm<hL?L/>+\_nY;\r%M_f3Jgb<S/,gJ7D9VOb/Rq3Y/4(m9C\='lir&N4Q`=:/a%.fR-\'E`<le8K'ci^U)kVXUs%cP$Y]6g$YHP.@>"YkFZ0an(+%,+CL\r%Do?`27\HbbAFi.C)Yu&o&_$`>8-6;8GHusjmNhA=?"ia4\7rWXhM>kN?s:_ij,KFLN-!qbQ9Sj4Z)kdCBF'E.#Q@$$/oCZF!Zu.s\r%FKB^1VFu0g$1A!Xe.ejWf?R@'Lgl@;^44LPEVrO*:$')>W8_PAH91clVu!=f<E/-GeGo5@r=.S9DtP>haXg>mL'kt=@iZ7c!B[_t\r%qcQtc?S!Yp1FYo-?s[>1C;8pSE\V]9nq-'dl*(%ZI/=J!2rFi-j5bGu)?$i=qN$t'iG(Jtn0bRif3[@$@/jYo:X&P+e*]r>4SdO+\r%(A]]]3"f?$!4sQS;?Wg_K&K;[bBHct3jQ?*;PXao`Og(R0gfWFR^)sD`pDsUYiBE_GRY3mPO`t\R(Ir33<3;nq&A-h"0#J*XR<)M\r%O+%B%*i!2)<gU!Z(O/IP[CW_7fAW`'dHH1qnNa4Zq*tV^CB#8a86$GLM''Y[p"a<]!qtLE>N;iQFd)]CZCGL'&id99\b-#nG)M),\r%YbX<>J(1N4I%h.#n4?oMR0#&%DYg=7YBTp$+26:%PZU&d4s&El,Mf73@,Asp&h,M7q"B\<j$$;W"G2!t&qpB'W6(cr3U@f7?GTPR\r%7N;!EW-`"-M^eI7N,'9DMj6JM8?/dVNOMn\hoj`mH:H5=$CW^WB.05q,)aUn60tt(>Oh:bqg+`OCP<f89-U<?]_^cN!q3Ql\Q\cm\r%Q=/>S01.=4VaYN=[;U2sgW>kpoUoi?VpMP`eE\dPnrHoqC&XROnVp_i@'+U-V>9hifIQ7%1ct9BJ^QW@M65">lsp.*_O4mK%dbm9\r%f@i-CB1PM2(lUINfWZ*=UgI<?0!]5X:\6/Dn-2qs`)`ORbR1NBSsZhO9f_C5bb8RanPD+2qhSp*\Jg$AFfNTK`<0b)W/0KC)Ysu2\r%V>1.sb@EJ[?<C7o^Z4:D0b\F^B4ds=po6!a8lXWZ6pJ;@CH8.f\rB-Y#nQJiXEcWO"Z?g"5CI>@3BC!g"8.t$.0?b-aP?[<(,"S!\r%Y@Wb6YBB*mF]:H6m5ON8Gr'kMN8fhRC,'jS".cm"5(TT1)m=%K=fLMYdV.qt.1S36Qt'P4[&eC^FX/(?^uff+Q'#h3?1RK`PtF6C\r%To+-%K:XE7%jCIOYq)knUoio(3"NNuFUDE01)0)i@mAjhB?a%Xo2uXb`N@r6WL:`1PpM6hbq.UC=7QHAKBZ1Dp+na2VuOBLnn\*$\r%FMA:Bq&$5gTAOnTRh)'P:Xl@Ve"TfXr8&>Ucndr:T@gbpF%9:#Y?,o^8+XmN]^arVrPt7Bl'HFDT&a\oVKlskqEh1eT!C0E\M!op\r%Hp.>i$T6='?.p*'m^<&L[]h+@(!87b6LiVSK'75/T*iOVnnmL]Yp^<)I=eY\Va@A[[[=1A^kZo0-oRa/[mKW9-V,P';(1;t7,PCa\r%;CLb)0$6lHUJSVr$1.9T:ak2.XM?W6d8ce=6T*A<<+!$Z%Fi:$TBIn@<eY"qaA$GTb']==m[O#%=%u^sqoiqHbhA4a`UONi?#+5c\r%;VFlZ_[(t40K;&>6_C$LE_`>#meeRLDgep)=!>7u[D&1L8CJn;Fb97]@U7*@3oT\0ZsCM=/L4)e3r2/R)='_u1kO"+Q-)Z^Y<))h\r%?AF[frq'`<LP/O*9Y4Ve^%;L;8[O$P4c.@T/F#c/S.F^n\$R=9.c%O\1Q$Cm&@d^Qeu5Fp^(0kL[0f)Al$+nEl?,M#<Z,HeEpU$_\r%e"D-d;?;`&qs^ZW8.(Bgk\[Q8!D3Ntp@k1@kT1["Z<&$R$;%36\Y@ld$;%4i'de`;0sCDC<Zs&6K'9eabqF$KHPBZ&P=36a<P#U!\r%k=W"M>J:u4)nX>s)!s>^Di*j-4?7>CN>KEg/O-`a4Z[TI@lRn=6[/l086<O_hq`%V^jboMD1^A;NCdu:A\;O;r1KDC8o&hKqJ7*p\r%6J#f/qJp9HHar\=;hW;/`RsG*#,AK3O$>!HrMQine`6>V6RrmCh<CbS@&ZP5G(h'(nBR<m!IRP:#-I:<ipI*"Fsi)<;3"EMb:BX'\r%>%kOs41sP+mW_GjH/%cVSP5&>j_28YpO6[YQ'0bP;L#W3JjVBugE!4<Y"]7tm1/SiOlKC'Cj4LaomjJ4G5Xa;]DHg:(H1"gk.q6K\r%YL=De^n^+']I]`C%b<A$pf&p$SQS4ELI?WLaq].OB(7_^QPrNlVE&XH+#r#n9Q4PTb]X4i2D4O!*,TmLIBJ0C5>\c%;WHC;24mig\r%U9qAYEskdOc]$Y?A!ojO]F'i_8JfMAI#4bnPj$A9;-D!o/Q$c]9NJ&q"Oa%6<"HE)/9P7EoIopF$j\rN_:<m&F[X+:?K$/Q`M\$t\r%/.RfTHL=*E8=>s_Eq/!H3Ul!Pn"@8=h07h'mhYaOrLhYGf/@J$`MBAaik5F\4&u&R(AJPq8?+$*q"NX]1^CMZ-.h?,/Vu>!QFU/i\r%U,*Q'b?QE_b<Oo*jVGSkas@9_"<EocaX&;C#.a"4C*cV2)!%\m]UW9A#D6:S$(N_fK0^h4_P'cLH]5jMOK1R5X8,m&K3\)+QMSX7\r%0Z[7d_#$Q%-u`AA=9aC_WuciT@$%EQ&O_Y36*C%e>o.sB6*:B')!m9.I6qCe"<ItleL*mhnf%uElKe%#)!%\me/^tQK0c[:7&/#u\r%)%6R2'.W@t:]$&tI2mU-VETPmR>4,6?GCo1l(VNla64gjZ&YB15bN-m#<gs[$K^o^"RtsfF$qN`rC,1$5cd&K.CJ=6[\$\DMa"CP\r%(PX/t,$JoHcIo6CnGsX\hU=cdLfTm6V;p(1;!J1-!fSFOJ4tK-^MDENBX6ksWO'10=E9aaPe't:k9CUtf-Z*j-[3ZO98=mK3TMf<\r%A*GQC(T,t6D_.GC?cc*EOHbW"NAG;afIeY)jYfOGdm<::l_"a,R#W<#%I00l#BaEJB@U\>=AHRjVM!/2l_"a,R#\1QR0Id^`cSRH\r%Ed0K%m*1,f"nt<Rgbp5u*R#fa%dHlLl*/UCkaZ05+bX9#-at3C$Cft(F;1_a%Y&RkbR)f(a%gQGb2rG#d2U_SE4W=\f*7!n,/u00\r%=>i-TJl?sT+kklD^'FKeXFiPJ@lbYOX7Yh#G$Cqoh<o#bS_\-%RLRR&WO,sIrCm(PIbKuHfB\;'/81I&Be,G^WK8NhQ^9Bl_(htm\r%.mK)/*IGkD?E(o/^>,g&V6OA:F5[N4*8WAqbI#VDbNA%/E-"Mp*D[5<7jL.R>4JqMgkp3#BYiM%ljgNVqGkKE&smgJl$tSgDs0q+\r%blMJRh]OX$/-h^0IffofO(fX'[11b/@6*7>ru7sj6?Br1od77&TfM%)ru7o4YT.VZrsb,;_fEP\>mGuh(tPpQmXbqn!GD8dn2t`)\r%i&TWn#+<>:3T/,>A"Vfh!Bc/797e!9GRjJ7cufX24I:=Uad3/cAFQ,N]cSGCcC$4$%X8J5<d7\l3T/i&14eVUG-1`9QXDEp<9Z`3\r%.Enj-,`!UrkHK!RhI>Gpk:B$JE#`iZ2-'N_iAfb3HPbXmkO?22hLc7N4GWlRGlB!7#Fl1ZP-Y89]RFh>_K*FHe)u,TeUVlUQ35Ed\r%50)=WpQn&[Hu4M61+WYM217(d%_*\Ya)h7;5bE['fCE;F>R9u4g["K1VcQAQSQeHSmo'gi]2^G:qWqs-J,&A=ddiI.D\)(K(?aOh\r%XM9[aHeuJ"Xo"t%/VmXeSU9('4?PuLTBd?N#dI2Igb''cCC(V=r:Zc4c-,5Hq,(pt/>d0/dt;H)`\?a_;j6T$\!rF+8^V"hb^B.t\r%okF/.==l$"IIpTYF1&^IX+@hpom2ldr1XimFe\r=@n#]DJV]2M_Ec\.n=U%<l=O:Z+qYKPcu&;67QPG<EGc"bKG;Bh%"=B4h<+Vg\r%mr+(6:OK^0bV$thaBY];CA"D!e@s15>o@e9Jo21@q%j=3=N#sj`jn\g)bN9@E)HiOjRKBS$Z:9#[u\U&/\]q;U/+j9>&0XDXsd#r\r%L"[FM>jG4_$Z4lNLL_f!jO<kq-N!nF'5Ij*KWlkE@k1]k@FS.;S[aCA9h2T-Ci:'WCq30[6bBn4B,2HMN#A$.[#$#ciUb?1$Lc,_\r%KUF.=$(a&%7V[J!V7(SVaZMmIdmkqYX[KR`?D`"EX/,Degr4k^`O`7?-+Lts"YCTH9*as/Ml=X5`*J]Ik6_k4Jr\fhZs>o\rd$4N\r%h1&2#UmNI8-K>`L&mLgH/U:N_Y@^GH7/8%Wd5t_&S(dR:G.l_E3)6ndgBS87=<JhZ*PH)mn*l68eNU%!9Ma[t(%3eOB@T=uHXNAa\r%/h#GZ*#ka>ErGo3f%r@.Th;"UP*4GSb'`*foOfF2k4)E1*:/L#[>qbuXOOPd6WCt!IYmP-!(\cn1AsrmA[]]GnYt`/j$#Ml[fc7H\r%\Cks^hB%]<GFHuk9'e167kOEORn1d7ba$gSFhn5%,^j%@9<),$rW+DA$bZi+d<;:VMsK,OAn]W4%U,=h9P84fV%U^9TP"j,@H.#S\r%B"<6!](QN?K[=K)qg:h$7U0h*J"^GNq[$87W\]Q=5H.XEm_^Wjk%:'FiDXd=;rX"<[(ni'DhbTo.?u8OM&2)l?Z3L+k0@ig1^'?l\r%HKQaI8Q2q!#`*auI+"65F4_^5M,0QQGi6:+PkZNYiZ'J0Cg0*F[clE=bdQVsCb(=ufsZQlZNn*!'49QCe_<GP=KCua]TkrYkNk^p\r%C:(I)I5T6=*(@CqaWGr#NR"ZfiT('3pguT#cX1=Lpf\)@q&Wk!ctfVe"#%5-]M6b5,S/Xq1BO_<g@7],;VebK@SL7X2ne[@a7em3\r%gmUIN)09@G[KD;NI=[*]o.KD&AHtS>^UY#7H;(UJ&%)S@L.eUb(l:9EZ*s:u[W#+\Aj<iEg2[V0"V,pYdKP+3JR,i`1d1?b"]s;#\r%W?!/OC`U*Ag)@?oq,gj]Tsi;_Fc!Nf(i$*$$Y$1ha&$!09%%3d08srO:0W%k1L#b)Y,/r$'t$#NoSV\NCltbMK8\AmchO>O?d/*G\r%>40B>a'FQ1+b[j>)'i,%o;T*'5m8i,4`ocMMJSX'C>0([)j&@66i,m<[d#(?QS\&V$)f9P^"70NV;j=K%dJE-<\N7fi>lBNXaGIR\r%!0>u;Mj.M*0r0S)WEVC,dq74#7jK)c41\^X8C"@Y*2/ual"'YRpDHJj9^5Y[qaeq2l[Q6Vkm"S$f/>pjN9oCu<cThqmt!&l_50kI\r%YRG=oMGig^g'j`I.O.GT1L"g(peG[gB!u*]dPA3640K'pV92sl8STj);ZU$)9A%j/D(a)BQ52?8.,%)Q]+>oM)neu"7Zi%ea=uPO\r%c7YkGhE9n3^p>'hS[$.i#AO@teL]T*)=XjC?\EZ32W2D^]j\_rXGMX-%!^u]+amG;#!>0[,:CNG^iNpO\Jjta8PT%?i!CS2idnXt\r%ep$&i7F:S])^fj7:^+HJn\D59_5X^On\AtV'5.pfbQb^K>\cM-4B05netW-PGa1-/Jl3^4Qjn9U63p%Ce>-t?e`(G]K;ri5idod5\r%V`pBS.l`R2;Y#%EO7&R6FYE$((9$-4#VZW9B[&To7/,m@#K_i.o3smk%o<WC(82f;5Ppkh`qlR3#dC?CXE1/e3r7WE]09VEj<KhJ\r%L[&D/1S,W\J2GST]g"0$G'DD2j^'srIt!_iXa#s$9+-(PDT,Ou'T$EaN`J9PqCZABi\_6Y`Im?mFe.Q)`IkjD(GhY\'e^Fr*%[@S\r%eWRS5>XX`qHT.,_a]1pX4O)JJiQYkPk.s)JkKRLVjpBPo4;R_qHV0j(pV/!CIk:tSq2Pu.!fU];.RCma(r7I6Vj<J*@p88FHHf6"\r%cjOO5KDf?*TJo_Knr8405qelo:M"`0cK"qZ(6aoRNQb`]p/d1NeRG62^sT2"c<(A9$-0Tmdt1$jdmjoSC<*PGrLW$$0(m@Z@mEgL\r%Q4^5LC:du)("5tUUB^4+2Vl^n?1aRfha.M=ls#=h-TUh&&pb)3KrBB'Qk[s"BI]lt:Rr10lJ)J>l)BFpMsLr$#<o<lMr8VTE(DE(\r%)II2h*bN;&]en3!83.eqPJ)uIP%N>8'Bh<_o%]_$B#c:_=5C:GRrNeuP\._CTUV-SO_0nq_$+mX/CFs_acpjEegW'?3<'em1,XRL\r%hCiX"Xk1I?9.CU"cMj[rES"ZTkY4-231P?P^-1;O_WoqJp?`0\I/WRJV0;98[!=[bIs3mH]R>-Qs+T"6kO%#Vr"gF"4`B4!bU)du\r%mWn^'i-C`=AXT*9hS).N7kpr`ceGq,-@g')gMucN_7h4LEt;%2JkF/.\#6QMq!kjc^-+dCj4s5Y6j6?24`B4!HG=E=mWkj<n;d'Y\r%mWn^'coU=D\`X2e4M]P_W(hi6HYWVAXoJ`&L1`*0rr#]28tFqhH%L`an*]!&p?ej?(3\lt@^k`FI1:VV6n(5<`I.(mG9"S*]8H6=\r%$9Z)5N?NReOuA0l%auIM89ri7g-h+)[Uu!%-nK`Ab4!rhGE_98')BaZmCG_OM;+32:F9Z"@O=d=CteK)7*G*/b9#/CVJ.\iCo3iI\r%V5j5FG'80j)lZHiC@P]'S\E1NB9HF#S+\6]Hf.Y32!n.Bp<Za[C>,Fbef\=YNj?sI=N@!`0?SV3B$ua9*X6*i`k"&_'[X$Rb?,RZ\r%.I.9E`k(G5US4cq0\3omLA9jriJ\pM,1OAf6t'Us;3E=5),brU']G-%-:T*B08Y9"M.32Wc3Abi'Rr[grt(%(bR#IhCL7o>.*dB3\r%@4?XZM8E;ertgkI%aim&'VqN];>spd.*V"4DONJF-mfs)31-7)+f!Z5c0I'=QF0K]T-@-;I[?.(W=Lk(`2m%&>KU>tIY18WUn9OU\r%gORqg89g7FJf^%FU=_^qOf^(?<\"P'$;;.%^I@Fj<$C;(eNkR-e:S6>%_SeVV0:V\r?Y>9-W0Y@g]!B^MTR",^gFP-8'OZcr^&Ua\r%k+^;SiG:$\R7RFeV+iKlAl@tAHo!2SdA0Zna/"6%%\65Nc(n/c-c9@X-A@TX#X8t@P<tr1D6\2kcojkOgQEMrpL6B7KsAt=Yd['2\r%37OKN4hK;2@-gPodg9/:&!';5=%fRM(,TIN"*V+(l.DT@/a#(cf@`J/RBj<@fg!KnUk"Z?cj:R*PCf)'c6d".&!gFYQtp=B4BGr;\r%EA;#f#O#u,;eEmV;@'#?-88LJ"eOW'W"e2F.I^l*HZ/4"_1bG]CGK16Mkr:gSpc>-?eVC.iY6"B(g;d8dR\q*m<ah;4^XT*?(0^*\r%s&qb3U@kRNjs.UEX\Ks6[Rr4'X"\2([R0lP9r.Lo$VE7=gS2Xe3fXGXN;A>unRZ(HX_Cp11p5?(jI`P[<*N\R`,4?J5_o!K]F4_u\r%b9=Ql^X"=Bb\M*R08K1Ofn9njJ8Xd@IcB\V2L!]s/^KG\BD%2=g>MT.4o=(r=*u!A\G,9NF/;n@ShRk^Z3LS2/:Pd80KoisUZRO1\r%'g@(8%!j-s)Y>eokF'SF?p-e4%=5r^;+2D!]Gj9RD'I>9o*=m;..V0fSSEMUb`*g(2A+C7?B(\+"!598&I"@Ij@7NGD52o]9uK6?\r%6*l&V0SfchMXD8rL=7+2__=!+.,%(@aP82<OGBq*5oQ'A^WJ_'h'f"2'<,b&;ko0.D3!G)CrgW(@(F(5/>m.pi='U>UBmMq/ROJ]\r%MDgT@dPl%XXeTP&:W0qD7.I)LngKY?71;tgm0_"\b$A9kpYn=KZ<X#&H.8aajQhE[b_q<BRE(NS%-SKL#!Fnl?JjM/V^dUA3Aq``\r%#lk6eOe(T!=d:G(H8hY[#pRV+M+kU-Z'BcAc8Uu$CbP,8?//[KQfVGJ^.70gKZ)@B(4d!K?9ik/Q<@"!cuZh]$g`/c(%ic*nmUfD\r%oa;F3cdeTlj@LGI@mGC4+SmkW"gmGY^X@m'0;(I(&:GGg!o!6&%QpjZ0;(H=4dCI)H3*DYK':CN(XSa$LqX:D!UY0j;WFUch!KCe\r%3/M+g7sDM-.&[T$!UY0`3H76oMkmq+D@^;X'SYs!W@jQak,Z*b[@HN8jJfa^opm5rem0QO"Y=?$\r3Aqk-tcB\r3Aq">R.KnmPs8\r%9eN<Lk6:+/pp]Dm,&c:+\p_rsil@].d%9F36P<LF\NQ3A%!hsAH*D)O_k7gmSd4j?4q)`<m<Q4QTJu'<[-)/lQ[h4Cg('6?U'T<p\r%U?rM+HCrc](XSadfi+V"kQS?V!O7VF.dDAHbq+p9oC\+(e(3!OEb;pf(lSheO6)-`-2hn;rmZG7s4>XZ6J!NBk)lE]KY@hfH,LXl\r%@:jS6M5.<%kC3H]@ME#4)mi_AYn;h9UKp&?Fus!u\"f;.L&j.+GXRUa^ZT0`oKap0?LS^<6$sQulN,=$l'_47`L#U9W\]Le0n9`Q\r%N=aT1j,F'b:NO$U!#JD(FO<`cWCZ'sec=O^4&Vr*Oj.MCq9L)QUT9UOgbF<h#U!0Or%W_^)H6tI"6`R>XNH-u'@J64ciF/HpQI$\\r%J0G\TW>:<hI3JmB&4hgsWqs^;5Rb#O#er'0<BI0OW(m_@`W6#;EBjNS1WCF;BRp0OQ4M0+hCu&$`W1<F<;Br&FU4X`^OUh#qtHs3\r%:?%8WA,]VN,uMagDB&4^)O5+l^]+9f0<8&I'$J]_<Dq29UjSnaJ,b@S[ONMEo7BBarVK9KXfQ/cEJON?$/Y(\h%&%A^FR?mG$Ol7\r%RHGURn]=qERC[9&#IjnB=MUUPp+h]0IjFf-"8VZWGUH@F/Z3$P]d@m&R10ZjT[MX^Kmfqqe8CicR6b6bc58C\^tb;EHE,C\lZdhN\r%^6qASI$I;rXa,B_,1eqA>V<H<,ob;sIN+qAGp&[-1B%+9Agis//D'C6+/YkFb;Hd^_(C)'a-6E9"hG_f.tb![51&]g1KF^m4UAWI\r%,PEXNGhj3+;Z5BnU6ol6R.NBhZ98n041NaVaEBYL]uU2733dT=3@c;:*ccQ@M2FhrY*DUWnjH(n_)XQb3UZ7`<?u3rq\&jneJ!$?\r%2qKs#He/el*h0%XB%Uq0]sfp=IXT>qGL52/7fO<46IsY4,l7IFK$,QHaQcB.,H!G['mVcSh]u"h&9MoRl/'4[N(-#rf(=m>c0(AQ\r%`'i4pc=+o4puUKrEi_UN`AK$)ZoJL\0(&p6\fOTIE6KHXj1ficp&4t-!NqV(EcF#R'd3+[U\o1Qc&Za95),/WCY!^nN.mRUCJGuQ\r%i@q?<>k9$=pDG7)";5D/Y]=_XQOD*F#UpSAS3V[P/?E)]ZR(:i0ms7?Pi/'iCYh7ZX$FnJXi,e/es;JepG`tK**+\pk>Q*.K".Z5\r%Odd"q__i5ho=,IkQ>_3^F/\BWcQt(3jpH;'ED"=>/V*4+@8<VOgqb%82bS!!<Emsj5*'re_&c;&\K0):c0(3qeXW]tV>KSBb27kW\r%nhpI99?<+2ME;oB=M-P3L$dif5Kn(Om,^$jO<M.09J7JMqdI&29J`!^Y7.+WAEkJ^9(UFr1A0)hp=&G([ljK:5fNO,\/PW.FYCRY\r%oFBm8VmVSHoqAtG]+RqM/QQ!<aQhIdWg$UBQ6+L73mO>2%Qdko(W6/f(Ph&nA*PPs&%2>kDEJCSHmc,cWZDO#:-f.Mqs"%Nl]4MJ\r%[XiK4O"Scm&'8JYnjft>]W#B9!Gg)anIR97TP(P):s0T.$-,%l-[#"/ajl_'6Q:EBT*s20PE"/LfB"JU5eM72`l_ui+QS+tWYXL;\r%Gir<m<23_Q^<cdQ"jrWJ%9;VaK+,<!5);Ym]@$T]/?&HJnQ*jpo6iW%cMg0^!dLCihW`!"UkA8/IA[mRl@U1+;S>#ek?,=5\%7e:\r%Mheg(d8p6CBQ0i);,`mmK+o:L7L4lqG3sjC3adQ\]*II]s$D>p>f#0uL*hC+[U`lO?'G1B`lTe.9.bRPqaWn3dlU*)Ii<7+()]St\r%=Rd!-Ej`Ya=jSuNbZ(=j)L>Ak'39.(9jYUF$+4@918aeh2W\]4;d'7+,@6%,VI%]?fBleKT`e,UY]?SagBYDBGF,YjW'%iNe\6>8\r%%4,j%2UmJEPR#L!H3O%!823eb;Wi@3EQaV^6d)Ei.$'^]J7QE/1&MJZR3pR>C:0h/'A8M"Uq5'!oF1O[P4iWbhA"@H4mBJbLD&^@\r%A00u$V(XbXDeTGS6)-BOAQh'?=:h#o"k+D&m"g\^TbZ^)"E^;6CT8;HYWo?,59%\G8@Jh0+N6g388$>R.X!S.CNo>36/jY&c(>f<\r%eS4X8iLM\<OF0oN8mg:tS;ONH8o2N">d!(L:+MZK@o67W_i#(]3GDMGki*Eu4^58=d=JkW5R!/sRWGm0g?++r#W)?6>IYZ]CY@af\r%CL-d^*C4@:,6:*(c1G9rMR<^>f["H.&=r+b/?LY%0o'&;3E:G@`S)YpbjeOEiDD9`ZnO\DQMau:[WBVN_gnZjc.0oK+%>/>e)/4T\r%nPL!<4hT7e(*>sW*ec\4D"1@:iDFhoArH5V#kHMn8h<iR'LBIkK4U#4-!qYEV<PX_R+WGf3DZ(3jqfkuOQ;jX?biQ!-V7[7)%b<F\r%<+kU\X5(.+>aNj$\Zp0UIst[_96X%"^%PWJH3KJl*F7;'>%'5l;ucdtY@I9I!d=4sDf*J5MVrGi']!D;mFZtpX8])WX4$sE<7'NV\r%qKCddk.-O;2<@"1%#O=.l5/a?_#'T6b^8R=o<[m;b-0l9hfC[DTk>J%pX!VKqG6XXc1'iAJ"asQr<EWP]^1"F<5+`XH-_U+`b++L\r%2=I4rR3BP9p6l=^.DEVXMSAG(0AE+&\R2oDV=.&@I)$-OU6[8&hi*,A3a++Tbu)a@m-$6-eIaVIcC1;,i_oZMMl$Y.Yb@JMD^Htl\r%::/"@YW^8\bkL."k#"1C69?N.8nK:i=i9W4K)85@U,UsuAL5*u`5.?*P3_@3%:WFX]Rm&DWgU\l\Dccn`DY=\9`JS*5nVYJ>o/5?\r%P+m8@1(Q&6+qeclr"B]<B!F28%["DMm_\aa1=paY*n?2I0T3eoRA5(J$M1!rhB5\/kaIuA4EOlab]lG)[ZRjaZJn_Yc'b\YK)#!b\r%c]XF/_,:U%<CY>U\;2Elp22/GPH3tK4e!lr&1MF@Su0.U*[8Sc$O=kfnG(_*@Qu019@AM0>c>3JM-8uOmg?)3RYjh$I219UGP/`L\r%<.@7[iEQ7Ol@mR7:at(7XQ'GFXTGqE_<uuX<f.aXI\02'g(e]t(NkbpI3nX5AIS)@?Ol=SlS8Cub9=RGHTqr/jcEfqh[_3NQLAK+\r%?+/O'[fIs'G:BK,:n-Di$rGb?g8-@E5W&QfhuM<&1#K?GHqFqP%T(j)ie$\L5n$P?q<Pcu<FDj+)BYKj$YF[O'U\^Dn`41N$I#UD\r%TM>tiJXQ?Bp63Bl@*X/)E"n\=^Jpq&3"!m2;7(OY-jn22VU.sC97`N-9-ptB)5'$:G77;FFM$&UKYR[h4!2.n&q)gtnK+;8R/1*q\r%h(Cnib$W-[e,H9H:%q@[[nGb@",:57;-BB:.oH*fL]1<%8V2Xf&UfY9_?)pQ35+&(o^fu"LGXqU%add1YJCcO_',V=BRHY=H'f%6\r%,\`"*(W)\Ai$4D\fekI>i[a4]\+8=DpFmY\TO2inQ>ae1Gu(4HBr:Y!%<3/@1rK<'X#LJURc2qQUNbRS0Lm&jfGu+l_AmDH\B!_N\r%@Akm:lurpHdkMs,3Vk@%NA,$V0#gqbmh/)7bg?V^pK/8lYlB@l42_9X;$*XiKpOZn3['Pt1$r`,eFgjTPT&!\oK[XNPPo\=dnZAi\r%Aad2]R.E)E4B0S*TQ=Fon&")h@\<6)7.3]#QT;8%VQW!5F^iF?dVF<WbP=kHk.I?*pR:a61Zp&8R.L_LkCl[r_FfZ'eeF5<Hq8oY\r%YW4@=a*80k]F.TCO%c/;ia\*MR484T-e*3DK'5A^`FmIhYX8<0'+jR*bi;F1[kN*]j-gn/@_'"'lH$jM\Be]1g>W=RleG]V;p9N$\r%mhaSI04W;n,/Gtr-&CEA?7p;*oi:XGAkSQ4l`*@XbQnTq4HDKUhbU*AqJDZp6s"mBVND7:OucLFmc))umuXEYd+,V1eT4@TlO!a?\r%-1p`q>"Z0Sh4CrgT1mDUGZ=-'G:T_":KG)R4DeD`qM=R@p11A):NqdjEbs7ZOmD3!H)[9m<7)R&=,R;c\k2Y6PI>QtSS!+BGF<Oq\r%l[0N;kq:?(oCH8%Vn:/g:7Ub#hYW>`c-P+pUmUSU9al`qC58^-I_L`_<TIZ$$[,&'kIYt7GC^QJI_La7FI./V]OBR=dp7%jaJ&)(\r%@BY`JI,W3Q'L\/9*ZhB<7b%d(eS^pN$BN^IeTb16=_>.dm."6U?&"g/KF?;lP$GaP+'*a0r>1IDmbNA4B=0rjkBW,SeZQX\_o]tT\r%5It%iLQdj3esg9J`'5Ki</0VJKU.a39?RYo,KjW*6Ogr'OgU;$%eZ471CfJr0!J(=;6no`8M3\P&!,7YXHq.j/?Z'tnF_L#Olc:9\r%L;dm4\#k]RhgheOJWQ_OT@FFS)p8g\@^QS+iIA#o5Ck3[cP?D6Y5Vo*+#BtRU;_p['RX$M31#CfT!*?N$[t_S89RL995!"bk4s>$\r%q4`1o9:i>2RP3a8o#UFqDA/`,KhJ#@GFC1t?[1Z-HDgQG,+gu)DeGXaL6jE%U<Nk([oQXr>g,92auUmk?ETOg=i$fC8?4lJdOHN=\r%K):fVj[tq5"g.]rj\#(")dh+6;RtB;j@Yh478%5!-!/5g.V:RD>Fr$BRP.j.\`ER4Vtn1n9F/1,N\k+n5nm(sPc7XO$H"%5f=P,H\r%fN$ju.qN$OaKFWekNgqI_Wr%o4C@P6?ecOXOQYr#jpQic*dPKVBtg7Yq%<[!*?pk@k">\"FbhmK+EO-X2s1lU(qp,<;MPOTT)J;;\r%&dM&m5aGbH;DgmrNVaf!(8+eq68p&=(8,q/#\&$05dOOFoLi:;^pAMN45C\\cm/XlA?\m4J-D,>W:.TW_#cGH%]=uZ1Rh@l=F__)\r%&A9THWk82F\i1#D,QYbF()@9SDN9V/HFGpL(81Vq)Esu/=Fb"C/VM1HZqYVOZN/BeARPV.+!&$F6Xp.c2E..c*[]7h+<H3T!]7s.\r%^tBGP:]mb'MLGK>/3n7n$E_FDYlN$a.Z!&g!)8SMO_E[2"aE!MbsnBA-8ZJ\%D.6aHo\!hQ<_X<I&YQ[2R6LfU:XM(2O9f<;)CKG\r%-)FXgRu-_8bo^<d4Im*=?\f6*`Ku"RasNC<H9_B*EN,HG8;U%lQ&nUA/A?KPOT]#M\CRHuga^%HT\31-8oB#E+herEbOd0''jhI8\r%"g#u\`0Wi;Tf(NbRPTdRL\/H29E*qo+hb+TS)0eSd%9Fios%%?%ssn`;f]DU0%C'MKO:X]k97gb:NEuQ0$sKH!doFLo?_4i.)=H,\r%4V&3KkRDh=m<RQZ6k;\s072R2m$m_Y'[WF!Loa=S8#:5]*.#*,(A3eQRpOV<4@*LqH;W2@!diCS_O_"EUW9\cQDPHe/VdD#[\aj0\r%bNg7k(Se%N3CIsl]5QZUm4mj]Xm&:%nj7!5O$PFl4V(J[km_q>"gpgjp!r^*DpO&_N3VV9@F'"t0^QB/Uq.D78g!ahQ#oE2cjOO5\r%6dLZ4K3gfi*onUN4X.R&:CqploE*b<@"6CU5qelo&&2K8%=/'BH0Da41$AeJk>>(W9nQaPHeqg];FIo=Gk9W2V_cs:4BOqNaiR/_\r%nF:\iUE*k?YmZ^[&4A&]ZDX[uSbDGG1oma@T/H6XDH9f"<:%<aX0+JcMQcZG>uL>\,:a8T+'b-Hrd,CjM'f5pchG-(IB)#-;?8SG\r%4#!A2r\kttA_YJ]AD+&0]o@T3Y&q&UcJbS^Xaq2+5VJ-AV)?V7%.&q:n<_<.oH/<J\\\;Nd=:@3jpqETINB-onA"t7VR9H*]+4HT\r%qCW3;F^"2oV?6uKYL@OD"jq>mq'N;oEn?<MM]6qigtf$BP1M.k?uS78I`p[1F^"2o?MV/*>27q1N8229T&`WE6goFUgco]u!o1m[\r%\:=PSIK&ChUm?ci]&cbC![mDC_NXhoAIC87s)dOu#c1h,"i8%P2D&N]rsUX#J_P%-52,G'X[Whk*plDpZgdemOOn3WlO-gcYV.bb\r%#UF,TAUhNtnlOaW@CN$p4)j1f?co)8#9?=*g0_O/foYN<=#`bgACe1e3Ctb`OR),B"G<k(+kMWHUfpAj]iR$?U".T03S66glnF2T\r%kdp'l8]OaW;B87Q6eD4+6p<D/]5A55'mo3&O,8b^9XN8&?ME='RN)aImYgCDR<eN3?2)>26cpSiFI`oPXt=GQlJ!+5o!1.a?2'%X\r%LQ'_Jcui^:F^K#7.s0S`EZIB06(mPXOR$L^Q;?_U0BB]6"SE:2pP&EAF*IdPf6ngoZ/XfD]1Aq0?'esGF^N44[9jdO]']s:Y5X`[\r%Zp.aT\e$cQ_X,!>\m/1EINeB/%sA7g5j5d4jLUr'a'!dMUmHjcE>;i$m.,+Hpi8nYFBu`p?]L1bbnoCg^)U^q1LZ0)pi8nYHma\+\r%Me9)!6P3Z8l(u/6!fJ]]j>uZ!#D0,U6E]YQ9$ZG>+h]^)Z[_2M03b,B2[oampI2[CEYJ@<f6qL$=YmU96.^N.fCAhW>Pj<[\IORS\r%5gXX\aE@,S#(s)U6E](6OMUOm]VQKjXa/u9GtTs+=pE0fnpt%9\hY+Eh%t*;hbj"T?2'UIN1TuUcui]'$CDU)9-7cf*]E2DI6uP6\r%+kL!\,Cd,R^IsK)k^ej+Kt[rX*Z1jYL-*%QHXNWZ)#>hM*a#7?@IA]/3acWTiS4Oq0UWP-He9HndIt@*]o<!P.sN:o.`6)JY0^]]\r%.%Vrp4&VV?%8hit9ZU%AR%DA7Xpi2lN,s0E9C`gD=,&6CE!K'4@-?,D,MbOs*MZ:MB#u+fg?l/C&$nKc2!Mn/fu)0`AT*5R8d^<d\r%$bGt=QL&%&,*aL'QmI)]J%or?KK6CTmdfjcKK6CTFqJ\0KTXkE>CYNdI@)=-(hZ*12o<q2T_pR$Uh]I\YHVG38N]%@NkQ<7^OeID\r%L#2]8$ro<&??F3((ohV8<!h=dk+i#,F]T_?_48rK#Et32'T0@`_=ncOL#T41TXNpT:b;I=></cFoEfhFE`"7AqLi,Fo?QJ%`uP\E\r%iiQ"LL9W6CFBW84ft7A6L#T41oY__ML#T41?m_"k6LiVSGT@0%I`nTae@ld36LiVSR]k&(9@(@CO+sCnFQrVqkd`!hq,Jj"q?6%T\r%/dfRt:PL6qYYRLNF35;o_63!C8R)tPh"BDlQS/.-Fc9W^(Jn>!Xa8=fRR0#_/"q=V4lWS?]_.+FA$s[`f*=*?9rU"r[p=u9Y!tRq\r%Z^A)a"[!u3T+'<ElB')1o%j"Xeaq<#JkCk3!'uan"LNG-!!JpA-@nKAYiRYe0%Wo'$fJ]A$NPb[s.FNK('>[e4?5B@ce3dS-_EsA\r%H#".X;R*d+=LF#:E=XJBFNcl`iZ>+a]U4%WPI\_#g_7WFbWYjB$0%#P34nM^Rq(mVb'rnnm]d>tE7O-ngj:Ph)(T2niZ?BqE+/1f\r%0cDU]4\X8!@d\6o>#R-L4G\@JUb8Z!Bpj<!Hifh&8&a7n+moY!2lBqS5B(_"g.(X%#bcfc\.eTF8,#@4*Xcrup;cBaHS!)u]E_*K\r%gg_Mq_7S.;ghYg<[`0oa=J^5EQ8UK#ko*_Bl"IkD#((]E1ol42j#io*gD/LH:]LEUMGc5$SoM*Voe8U*otn,tl*cQ`0hc/I@(iN_\r%WGs*qMYA->:[O4=]i^IW7C6/m3r3>GcEuW[8'6,nJ'p#-<N9X,SONr^EMeiK/>!I7B",,jh^ZUVHo$YeO]K([`QuZ)V:<3hp7*aR\r%[j.&r#Mr=E,GGq8C'5-l;mia$+t=oiAL*^BFU]b(0,:/QZ4F]"Vps_F?*pP;VZA2s(AdpSS]mah]i$:la_LgfYcR!)*"VLs6JP0^\r%bXb\&<F:SW-dLg'0'KZ_kr,EqLA3W^HR)'5&!.]gf#uY2F*+)CQ)In\/sRQ6AsnsQCuKEeY%<Y5YBB*mFTfF^#56Y*ds&d07KQ(+\r%qq2FCU/QL78aD.V?1UJp3-/p=-Y-<h34fr9F27a7rHuAN2(OO.kBLu^(Ys-'$jbC#b>*WXAjE"(7]/Kk"LOidg]$c#WrYqk1c&:]\r%-k'd(2S,pmXiACV-A_7aL!Oo;kN2#lbt_m<c<-@N0u#H7@u!Se6s_W[<_9fY'_P5`,Z@r:$?-\Z1jCXr/5oeB$Du,&^M=*_E:g<o\r%-W=8=MFQ!hOt#Uj"pBPd,"J'\75a6U;qQFg9ORAi82#foVRVKtoNh76'N^Cu4'13JMQ996mh^F.AR;2)mVr,bY"NFA4Qc#ULq68_\r%haTA4$LQ?<31gMKKcMZr'0OjDdOnJ,5c3&Y(OF04=NA]?Q-)Z^Dt*$;7JuDl(5b(;WB`Cn7]T4pSm#\-p5[lu&]EdVA^P@)AJ+CR\r%=#4ic;QD?.,3a>UU,6#RN%ti&G$++);gGr_f.)'F,E99TZb!a,cmg<;!r!O=X[5o8kh5.#<Cf^cX!CcK@U=,%X[9W1_kpF)8d3P"\r%cqisaJ*u/HC>H#D6gkjpLI4Vo.WCH2<Ni#LX+S+oQY@K/=WMI\nX.ntT%,QfQS>8!]$F0@eiAtaWDOia>q_-/\%Sj0G,+bPVrIPQ\r%e`%?i7``8sY%[=c>;Q"SMLHAJo(C$rPa$NQ^WV#q/[i:m[a%R\eNW$Fk-1F,'_5Z!]JLq$S+15(S8/d2\fAm]blVFm!d_;1`=C]4\r%Ebgh&qDN8HXl\O&!oT;;FNsF/)(!!4"63BWF5*G.TX+`4]H7R\BLe5@D9FqjG?=2,,C>9:L_sK96#lY559ARg6g28_`3SOdWaTif\r%!p`=*lk_HXG+jR/CAsGm,jP2"2sW,HngjK3Wii^1>R*phB&`Rq2r_/N:V4rTeb;C+F0F*M]<%FnZrSQ!:G&RV<?6Es-5iBQ_5CI"\r%XUD-Q-]'`;83\]8]1TFa](m^UC*&UVoN`k*gFV(0n(r:CGo4gPQd]\?G'.8[Lj=Ts\jq6)[?aY.[J#9Lg$:<XI`VKEI`bd2Q*ahr\r%S"+Ftmk^G4#-@05/+6/dV_)e:H-]cbBQHp=NHSd_Vhs-Tk48t0^Z;!$+sUn:<7aKYcfKKArXmV0ou9Gt:0W%k1L#b)Y,.d8NoK=0\r%Sk>rBF?JuTWS1=.IM&(9)8Gfgd5/C>?UN^-;<$ZFV7+3K':eL!j_9@Z\;b&@Ag_<A-`Kk<W#dnqKj[3hC[nlSD9Z/WP,f,:d]mga\r%^@e/8flj>7(,K1eP.C,g5GCg=XTa.Y?9#QpY+(DMV/`nf0^kuF'Y`WH]nGVZ]Y^"?UR0=FitoGjlFg-"$VgC/MtbLl4:',WL[J^>\r%^0@YN?:JDCSP^Yp]NL,n:"$d$Z*1?U,^0&=Nl3_h;u"f`pj8Wq[I2Y;qEJ"FO7sl7UY'c9p@NA5s5T&KhXdKnJu:QD$H(-&kA&jP\r%1[@'SpKYsi:aa:1#BRDX5Zi$XGps!KS..":$5L#]g;?3+@%`)oE^2,,H=04slG,u`;fu5.<<dS8c9&1crcrM^TG/&3B]\F$:bX8]\r%?n/Ua,oZ8b.$2a6s%5Uq90"LTC4m<,3#/5!43L0jh,hEM5O%)dgV4'*IhQjN-01Lm8Kp+1N%#r'$+]1de-!?o2WNB9Q@C;+\,&CR\r%AqK4XB7-OY0b2qe7GqAD[^&#5-'.:QkZ<),2Y"n*_TLj@@]4S^4K.<rVK@Trd/EhMG]-_]+Lsmc]Y#ML;l'ruZ->]4-b52c>nn.$\r%9a1LWqbQugpqN_@fMt3:+"<G-"TL]Gs$*:u.EY7hgsUY_gK)\+J'7-WorS:<#E_^o[.&:ehi%*J:q+RJ,it#06%:BJ:V2&NG'CEf\r%W3#r68;W[L<GqLE5\EIb_GD_U)Q)(J^U?-mXP$GLO/O/HRLFoA/C\L7S0C]`4)umaU&ZZN(]DQd0Cu^M7n-['>!r&D$;=#CVkIY'\r%8_n,nK2r081DXR*033WjfFbdkMIUDMgbh$sU%fm#_=QZO%E0\49&6muabHf8Aub)uI993nhMt115[$r+\=nMd!c=MoO(9[.O*P;(\r%nO\H:WeOS5'VAnab<3'p&a)g(!TOZJ\G`a6\TsRri6uRb1tr.qV;8"J&(]<&m5@J@9q?f:7Ra9r_fCc5]?Ni01./Zj6+<:]]?S`>\r%K,kT5G+20?[lKmohT<`fgMMri%DQ9F\(cLWXSfN]m*.G6EK4%lFrNqt2LVMU;LG04]_S3WF)b[siO%@\lp9Lq2TMsWA.7`"ddg*c\r%1/M_p]31JKl.uY)fCf2<ET!mOMVaWim5EF/KN"$H[c*c"kX.4[RsVclU$/SA>_+_;"dQNW)^Ra_a'=rKq[0Y`J3%(#'Z3j`]mc'<\r%]U"nIq89#M(Ge-j)V#gHg7&'g04XtaT:VP*EJ(f'6I3ma49l"G?<M0+pU98#F1.[0Gs$1S!ZmKZF!Gc"1o`S4F)D9,H@)7=(V&X?\r%C+Zj%%&`9#C9;sjmt,RsK?/S0_-c&QV-sS/DP06A@ku"`5`[DnK?2#rQD^na7""mY`LMd-V=jpR?KU=DMM&j-6hI;1lh_=+05n&m\r%F!GYEC5s9"k!kU/eg&T2n!kJ;6jh*PQkl2>8+>Y1i;SX]bD6fj!q.V_OX#*l,BQ-Yj[b\$O;4+1%:g@*Joi5?!P&f(rY)pX79`1g\r%9V!T8JZQ@tp7^EDoJ)LDE$3?h\F\U7qTh4jS:)fkj,Q&W!oM+N4&NA5./ZOEgkhaGaF`6>O,X?Kp]6MBGLQM..(.N\2o0Kbk_EpN\r%k"A)IS(8`e7tSL4lJHWWV3S;JO:fih=jVi]J;f"=5.YGZ4\\MjAfbQ2-"!u\?7QFKA-CE[5,RR"O87*3HE00Joe5rAP%30=h_J\q\r%Bm,codL8AQ-2D;aKF,4+WD8%&1eD#UA9tD,+X$'CQ^o*0,9<j:U]_;K@.)4^]D8&!8lY'KeXOlRX'@0_ibAQ%l=W51eU[J%4SgYS\r%bMJNe==PW#moiW[:Sd)9J`ZR`p<eXWXQk2GkGfY.5G%nf,W`U]Lb+ElO^?BUoaL2H'0=p6[1<SW[SiTB38/s$/5S5G8cJOuLa:"+\r%LD5%8-6PXZfK&R*Sk0?l)!34!aa-5a=VLt??9iE`#/rj.(QdWd:^j^W5th%a)<$+H$\"m3(PDmjP<"ih89t;cMa]@rPY_o$7WNLI\r%#R=1R@I1V\on(q7[C]m=.K0nhK#jE<7k-q1OZ.!7<1_=])aZhMT[f2]Bo\u*TH<,dRNq&#JW2KVW>Eq3B/MhLk_9%+HGf/k.5,h_\r%XhJnde;sRCVDi1GiT2SdIj+IBO;%fLanuYaJQ$,WMo5/sOG8XqjkJTl'33ePY,c49#E]PM5]K3?nY#.l[5]@__t<E<CdjA$jYs#2\r%it.b\l*)eJIN<!rDKW>hU11&Z31?i8Q4f0-MJIi3odRG[3"#X@GXr-'#1\*%l2/fbd;Bl.WGA<3!l)lpd/,GT#**O)R!U,:)Tj^e\r%8E+$V(J4:@QdB]%;KNPYlX9'aEDdD00c^Wb46W=I`L)ZH`Q9s8"+P78HV?s&p+Qs@:jBY2N&_)b6L]5nQ(JF^_;!uR)%^te!e\N$\r%g@&29Bu286Hu\cr?@O`,F7`3H0BCSHk4kU`=sb^,R[moc$)#Dk-:n3:D_ZEmSb"E3cYsVnS"U\4rc/bQ*F57d*ERfed>Na[^i&dR\r%k:3";9iG([DDZ3`P`/KOpMn$,$RbG\WML7rB`H6:/]YDaeh:ed/!E%ooc7BVmp+1#IX%[<iji>o425Y'l+U"_CMBP*`oJA*i>qN=\r%;<ln;]5k4oBk%\kUbM+C[PficUS#)uDPC'/QB2q5Y:@rPhDXl[$7ap#2Klh!9suk4"%GFCUn!ttHOD*p-W\S4Yk$S=pM1f<TPD,C\r%!d;),dsl$n@+7[l3P]U&M*iEQ%b"5Nk;AWK.QF_7Q0?ii%anI]ShC>97QR:5J?_)Ln=<87!Fp,"&SJ0`60<%.+Q%HYVG`j9NMU>P\r%P^+3@MV4Tu]Znc>m])g^);[<UVU8s^GWX[dZ#[!liU*:/Y`HE3Up-JBQhlEco?Stle<W3%?5uj6TG_)C-u:ZJkF#$qCt&U]"lh,9\r%_T'G:E,1MB&YnV`p0J,`5[\I4!#%+9iVRZ-q08(0L.>ghqm6.+HSDN:Q2NoC/%<(ChY#DaVeGdMPs,%K;iugu,u_`!97pYtM:SbZ\r%XBfO2o#*p$m;pgPc,\.tKN<iZ#NI_LJ4oPDDG!,;0%BM;,6,j`S)W6pD4dFs_n\$s\Pecpl:LZJN?8$KA,CE's!Bm*!<X#OYf\UK\r%/AAAo_.<dRa.TY5:UPLPcS,"*C8'mO4d8`3V9pb$X^:,hOXqIG^eq3.aH<5].jZjVk^T4sI^UTq*hT3%k*GcK?k,`Seadd@W^5Nc\r%X.qO4E=;/kNnR+_hC@C8-<$(_An7o2eFEPg2dbWDE`u(^?W08_<WD'Vbs(1'i9N1qKY7-Od7Sd:;6BK81p?Ofe+HYP<ru0"iuci*\r%kZ3*lXNA`TBDTA2^I[Ce[l180Y:H4@V=V3V_h++ViG]alr<4(0XS%X)6)g5f]H24('O65f5n"1f;Wi@S_]]6F=SK-FNI/fU?49MV\r%n8D/o0Df"78.8*Z:ZW]`C1\OYGD,c.:biiB/\q:Kk1#V+)jha_7PNANPQ->c])!@B;X`<L2>dPO0^REh6J%lt2V\Sm7e_/*r]1sI\r%RXf!o!`]\QCEJP[qBDOi'#*@?2Fi9UP"q#j%uH9\@hHQ^1sG/qZ_1/4d*R,hhL_&H2Gtuer;Aa0%amck.CXLGM4\$Q7m9^tULiS/\r%g"4_=rm:4gXu65ahG,ALT$$+TLp)$_h,VIq+g0Qn."Io*rV5*7[]@mB0+3IQ/s?AZTO@kAhj*?aEDs-i]"a,;[ANr4TB^@IV#T#V\r%f'7s%0uV=RMd&N,W2ak"&0niAAh^gZ6Auhico2<mRl:#`!e$h/^4EW6)u>:rU>k]_@ljRKfQh+QD#3^nX,i8j@EPol8AbgSG=(_B\r%I8G5-VPaE5P@7D^<8P*Sq%:&!17J]An%D%(_"]a<kU=F@e+`:,[M$nEY0[DZR[@u]J8Q!:maY+6@#r1]V4Lhbco/CQHb]I9Yt0/+\r%93m>E47d^q>Z9qPT-NeWLVQ+#:,0qd^\:*R(W+]N\h<XJW/#Ecer;rFi1V.(>BQaE-uQ<H:%]09m*IrrBrS?^qr2l'G>#<P?0sU[\r%l7Q20o5e.r[OUC@\0.]mHB3>*Sk[mn+#tR'`6YC(I(l!GgAY(=1D"9K8m^n^l`",DJo;T<1M3Gh8WMXVAoN_'5,5#NT>BblPj$RN\r%N$lB<4LkfM4E]M@3gesfiMj0>0>EB8Q&HX>,hp7H*@hM1E,/NXaffV/.VlA/n58<J+.u4^q6ht+U9DsDHk#7Pf7c&Q"%J2I%r(1^\r%VhqT61(U^"#n&1JFGM`Y2"P]TOu.e+`[]9H)cJ-J=5C7b_Q`,pR\>%d32=AmR\;grV,HA'c.'Gs?)nr8O#*Dm,]bk7&Aq.41,G)P\r%WFrE!UjVf_q]j_8hG4!XOmk`5m95:.P%8/M)0t3bUa2?G8`hijs-0=o>3oUi`U"BGHI/4LP><.f+CL_e@S7ed]pX6-e4@(Q4Dkdk\r%>7gW"\E2B<]VbQUk%NP7q8cl)mQ&Lb9nqUG%>Y7_b-1kE2?@>*51,H>Nb-l<gj@m?W!p#aa^N:Fr.^!i,ubb:7@53P/Aps+=%Pn*\r%atQ`)*.Ji\T+&C\*h!Knf]f*P0W[/t=Tjst0AE+fFf]WV9*_X`I)$-OU6[8&h[HCl;FtWJ;9dn_kZtU]#YN"@AnRF>e:-YVrbk5c\r%V66;.o.ASU[+jUo.S8Ob@?4#9YM[N=!XXP7?'rW72e-Q1:W\LR^.FPrUJ$,ahib1Wh]i.@@Fi$e-.gU'10JH'N_l!hd`M.-mkYGj\r%KWPAJk=iL`7[QPYl1DOE7jKt/Y3"EE_#PKt99!6Z/t>@I!>4;iU`sq[m<Q(/Iia3E[ICmVs$iACCC+GuNA,b)br-EM/n$TR*,RBP\r%k+-iDbg?V.6th5g,,t5"DBs@(h@&!3o'Uk(eHL*Y$a*ineG8\'HYGM/bagEU^6]s?FhS^?ES*^qN.T.NZD$<]`qZoWDa3XGFN]kT\r%%Ij#`?hSJ;1g1(6UTT0o/FWqD/mNC;)ng?(F`!u=#9FJp@C59sNF/T\Ekq-9rjXtDBQ0+_38s!>L.25kO9][K0f^P9<3oMA$55N'\r%CGGgu3<qYJoR7(U3NlR,-JTS%WJdY$H/n$,Y.4L5`9@HuVRG6s)`QrY6(P/R::N:h49?iOq;^V-Yt'NaUC06m(jgqmQ%"=G!YQd.\r%:1?3,3O@J:HEJ%W],hVi35RQ2rW6U>"L9'E1*$_OR7AAQnl#$H;J_c<Q:=pte[H?nm"gK_9(XW?0J/.F:A13<nsYQ,FS'W57b+4)\r%Og6T^5A@(m2Y(m0UhlcP%,GY87brc_Uj5;^n>)f.DS&[8]^$/$`rl1.b7TTT\XUdg,#W!E/Tm8Y5O2>1Q87+3"0m_CI]K/l]e#je\r%.lc=eSU$Hc0%:ALZC4!2/?AI$naOhk?*IeW1X]6MeJDY2B,uGE("[J0V0!Z7Wd@&$#/lB(ImWo^0_]?RWNFk:kWiDae6C4p#fKX[\r%jq`3ME&hadZH%sV](GSTJhBe#n!>u^GJtu[r.cZAC,'jS"/B(!ICDku2dY++\t?A7b[Kd!\%qqn2'p_bUIESVCB!#%?duYkYD9:Z\r%/=M!9p3mc&Z$LQ"q"1oNNU53CimZ5ZC1L44MbcQ1?hrM=>5!Er+d2MnKRZBYR$1bl;'B:r]L70AEnr<);cm`/7o\[jfe\G?3JL)n\r%,uHRR"3(nG1U]9!LbXW4\m]`*\-<O"`t7M4QC^B1$!'++ilMlUF:+5eiYk3!h,mY"/u2F];ouN#65l,pcAYR.9*J;%!XEMk@SsWp\r%qhYQK!bX\p2%3XO'RK5u1Pj,J;j_.&$_=$jY,S(-EaW3P_`@'>`l?MM1-B>l>D4-2?ca!LUt(d)7a'B70KVEp$@-F'g>@*2ZT,=t\r%oF+I<ke<$bd3u1m:RZ=*nsqN4<;6js#P?F)]im1IL^?KJ:*L5H4LJ%>529F:M&*_Xo/OET=W3@d4\/sf=m`e4&G\PbH9=9\ceKTm\r%2B`dCWr5V$<0Cadedc6Yk+urR;O,8PiW8J*8b^,d[WFa)B)]jB?3:bXBpU]IrKM,QN!@5P`?g-bGr+\T;@eC7Erls;(EPta&e!&3\r%!<V^6//FmM!egBl^aq`tKB$tk4EF:^r+#TL4M.KQ>(6F_E:"Q>>m^K5SDL`gnn.$hEF)%_4h$/Hh5;H=O&l]"X'>Jjd#@<CjBlTJ\r%?SbHRr6tH>dlT?;IJ1pmcct/Bb(Cg[XtK18l`]'dgUO_Xg\c3ig?d$9U.?q0$2&1?rB,qRnDJ:sV4%8`%XL#GI4Yu'bPYd>\5T.K\r%]i-Kk=(dt3HQQ@\d)&sdKpMQTW3QGR`ksV)ijk(Pa-=5?N$\aj2M]m/h8l(Y6$dp[,RWuZaOfXA@rP);Rg'kgH8HtLS>0<\I"'Dh\r%/a#&M#oY(<#!Dd1#o]U&Amo\W_C%XecHgaR[4G(nk"="YalrG2^dE$Nc3+SSQNJ'mHjL]:q&jW(BTPV*ls'$,BTW!,.d)[MHlbf(\r%ZViVsXUpbj@B7b->3#*ORLb"iC2(HN:!b$Q1\@8`+G.TVqRVN8Pa!MPpG,+Z\m]Ac"a_^>XfOuR0AV+Q3gQXnSY#pT*#O/aYJV>`\r%fK.\^ifgV4`YtKqhctVsOC5$uO`^D_F``OX)cYC+Oj/uMlo:#\ZriD7(=tV,ZEdBOjpk5tPPQT*c*<'&Ce^n:>$4@:%!UT4*HZm'\r%4d^K;3SSB]a2^9dBeh!/+u!d%_q;&Vq16'hS%LPZTY$;PYX`[rMZ3])p^=b@j&%(LEcKq-DJlJLEqhhHB5VGF>Ui&+r-9(N%<1fB\r%<)6TII_gI<>"sI<YG`D%QWqpGBUS+66C!u(b[T1"Wr!3Kh\KR?#NcO1FPT3351VW1bb)/4lkf:aKDGBo&#\1<_V#X*A!_iFmmM&'\r%[[E2jDn]j?/'<,.p$VVcrVt\F55K<+Y?KKEDGO<5Ko`]al7RVWA+7-Y]Nr#SLcP(]B+7#"S!=^6,^]"V5,#R^K^XO\]AVt*Jl_$h\r%K5fXENk_PcY0uoiYB?J;p8fmabi]K&NN<'g4G2=1o/0Z/.q20q'L\-Pk_hcpGoU^dBH;dB&if&n.BB3ThoTr26Jd_h61bm_A].GW\r%rAY-c@96kiOQq@P?ajAJ=5?<5.bf69q4H4.m[E+j*l8r8f0Y;EA8;&=gRo,)63oB[2#)4J=nLP,6McBN^J5pV"HaS:DJO10$DaeE\r%3skgt'?G)i4Yr2f1@i[8;G05#V5bO4RG>+s)0fI)n`pl]#54;VjaGP$nq7aG'k#025^U[8N?/YG:9b<\LqXd4!S^foD\#Qp.q!]3\r%q^ju#l[Y.:qA3KKl"*e@$cU^H3n;c4;CbeVI/+'<hDg#T'l55E/tO/]8JNgDh]8]hCHlAfK3H='cHpq%I>7B:FTZq]9,F'gJL/(Y\r%T2)j/jk&UMFFT;<f@I.>UAjI<<J'fkDZj$S5b5<h1sfIuQcF371>"s?WJsZqcR>D''ED>l)%9p^/Z2!pR?j'MF6JS$QIE(U?B_tN\r%b_@6dYVZD%OYkmJ=3Kj1e4k?LjOedSQ`."aCan?H2V[5K,.EH=-g@Q+k<@6_1?`JCe2%""l_Z>3Au3e9Zl1$_L>D)8>)eS@e(8.%\r%RaYaV22a7A&,X<0/n:db<_FK*]AD"BJk/Yjh2)#]N3)nIo''f_?d]aC?!At`+C<)J,jfp@lluDFFhI#53rRRmeK%@2&j9H71BhJJ\r%D=f_2X0MZ,UWI&7Huufb1aWBFg!(iW)+#L=\3_V9/e>Y-c?:m+_T&6-\/>>g5^qT%$Jh8u%&%?ppF<<WM?Fqu`=kSsN#n@A:fumf\r%_Lk\/On:tk:gaD03:4b5RID=5"skBk#R,,'6-g`S#_eCE*\)hpZ`DPJ2k$npO<>5u&N!_uKfa4C-\T@.p$<&Q0e<9tKi$\N!E:MQ\r%67AX?^/rWC2X[UF@%oL"\&\,?g90?3f/fqYMesRk,Y\PuO^+ufRe'1KEg!UO.YYeOYQ/6'r9;>1),ad>;U_d?4!DpAU$<`MW3PWF\r%%+T)UrDYs&b0=g<6bZQ(k^W65qRAm<,u6u^V=o&98",TmDDgGda\u(^V((:q1*?p"0hZ@j.KFEs++@3r9"aLjjkJTq4=AZJdcGNt\r%1MC=&&e%]:lAQJ&S.s/2'RD5XkG8#N8PQhZPS@@=*o&tulJJ=B&hWk(HV-mAn`3;"rB2T/+&?(Rp2MC.g!6]NU"_7u(^@nY3ejN)\r%l=3MOU)9?9ai404J<$<PZmH"qS!ntD]3>&9Wc?=M5&BEr6n,ZI.`%opl<i%6dc_BVp0LXfP"suoJ%JKO;=XK&&\L5SI<2(P?nr.K\r%0UPFBOC>VP8_mU*iNEHG]0J,f0$)ZQ;$"9l/s$F#L^J^5j2$>GBZ52eMjRdt&/FCM$YDNmeZ==YTs1DVb\@i='KIR3-Jg^06j<E>\r%DNG3cL^M@*nPuDjmJGe`J?/.!oWG<i7qFbjXl':).^\8G&u<AJ;3??$fE\?'`i%1+@2kkS8a3.2BhN?cdnNn,DpR@=F1$=:K%2OM\r%a*:MBGR['+;Xb0iH,!mT>'t+Y>2!d1B?sa.Qe#r7VaY^[_Kqq#-R27UBr.QXr$jFH"bM30kWO(`bp=sbK'+IPZXa*%1_",Y9fD-e\r%eF"qM9<%(moP%ikO:jqtKLOfDP,+Kgat9I?7%,a[60^=s[nF%OSF7II3W51EU_u4'_%7BrU`%rtJIiU2U`&U7=X'E9a/^UEbooC3\r%"['KWN`RN7\-hPgq=1IQq5"(R=hRA+T=]cZ'%G$e@DK%/1&#GY6.W3er3V_d.A>05]P/l@l!#3P)5aOudsl1B_eKO/2[=jrC`(Hb\r%9AHb$XG&1S_VFBe_ckuK@TTK3jAmoB.&Ose3-9[brNl8NI=rBj_pK6DaC*/F%[f%!=F=6NTRs$##LZ`S>4MG)anfXAa'S*7p9sr\\r%,N^Q.5>oK4)r"ilbQn`f"j-Urh6s3V0>4clbZi/s+>n*@mVE8ooafn4I+]8CBoQBM(5r-W][Wa`$VAY&ARSf)XFGi6q2_gRf`OI_\r%JbM#:6pIOH3]q6c*42N^/5\F_LoKLMfG5iRe!0mkjPhC`=m'raK=/25s,uGP,T<h/j^p0op.R+<OjVK[<]ADT.SE=)Pug85D9H!:\r%Z(Oj'h8[`!BtItH4\"e3=NY^uq8,4RC'X"'C.V$0hU-P86_opf(Xtrs*Y6=.;"O#>$Z4YC4+HS^GXmT?Xkl/PhLg1V];(*F1,SP*\r%^6;hP7=O;*,421WrMHBQ/<>?5YIJau,5'AdRb#/BZ2tMH5m9n9P#[JU>A*Veh=enRCcUI$jN="!Yl#WeaOP`k0QLaHX]C4[65d>^\r%hNd6M<PX`t\HnjXLDK37!N<V8rjS_88O!^l5A=7M_0m%3If?3UKq"BNHPU>o:!;OfQA&*"f&*j9^M-jN<*C(9bQ4';/9;^M5B8Yq\r%_LHQ/QGG[j-f%/`RDc=uA)9ToIrrb+Uc,"g>(=mrluQ7*8+GsRBroPo+CAq8Q'9-AT:d`V;OB.1jb`H4&VKHF54Tg2FK>NcOVF$K\r%U_P*HWq-Sld_?k;&8o0ZG4GtXK!K>h(/,'j)O,r279!T#Ld>0gO:'O[r'mYj#H?oLM@;dRG`YN/U$6]qVI_&#g[EAX<2@6p+S),%\r%8e@l!e6F&3(VM"%;U"`3UhM=/e]Dm(MDS$RLqMoM8CLNVKuV.qeb5F*4;I+VCAT^V1<"Dj<`"GlR`2nEP&Cd()#5-q78(guT;T9e\r%PpqZ>*ZdagRH".ADY$gQOTH":^@P;LOeS[-EL`qYPF?Y/4S[Um3`!`7k[nhRBf'4Xo2HutU@+$4S>YAu8Yg(?=[e3r&!k6u'ks+/\r%&:)T#O[KO[a#MCDO[KPVPJ(O"7I#C"R\q?d'Qj$Haco9,J0*KThq'XD55?%;Sr2d3[*;Oo4qdF']\AXRAkTF>Sn`/3.[FCqC4'Yt\r%5VM.<<:tF+144=ppm3Vood*BY44m:e5IHa#9&mg,@GVpcc0GaX6s!^P7L<=L=bdY%G^Z\p6V@>am:'FpF7ALFQ.KYTF$I<$YP+']\r%k"s.3^<&mMR/HV(Lq2+!cE@3@OK[dXm)&s@&,BrM@2AqL,+j(##^^lM["j#dLN$TO8:/FE;%MO\JZO13N-a1tT7<o50;BT4-?r\d\r%puG4b,X'`^.R*Z,Q;f2?!Yq@*.D2G>RQr/8puG5MEu+0M<.+87">LTU++\FP"R)&+J3J`Y&&0WC](GpD!_Wkc32gip5r?:$)pmd;\r%kc#GCg];h`MHL5CdduqT'6jTT>WmDk;Y05&oC('/?CtSkSpufm:,R5gT]2/""Z='l!*(t<C@Gq5l<LNj=I'i7/rTm3$r<_m$7]^$\r%l=j?*_>k="2Sa-pPO%DH[hIlnnrb5N8e<F\W!Kg_mguL7q=\VYOB[i![0_Ie9@GqWVb[i(;R^\6VmYMEN^u2PYgWnK[)Z#-<kQ6\\r%qO*OBVLO&eEEMb,DKW@J`*B]FZJsh'^-sbUbZ6ir@(7V>MV3jlIf>$U<%K1lG\ofoT5m\aAP*:Lh/m^9j=.(O[3Du7(5t[6-A1h*\r%M\=eMUH"9&Tf;Q%(b4YZ.atH&LflGc>j7([pl.tdXC*2P@'9VHZ\!m5JZ_0_Z\!a1EFdh9d.V1n1YOac=,,/oGJ!B)OO1C;h*pcK\r%bbq:=fH(&pXqO[ZGn5QqpG!8&>h!hqIH/\R-DL-NWkJ/?E>?^%MT+$aPh!MrX?rhTH/L04Mp/C4[#Tj+P%9RhJU]4MksFDOUtP,7\r%GI[rmU;!"&'e80]!Nq"l<h[baq7<U*@255LI%dM."fl=olK/#e).%X=4kQ;l\%7._BtF4P)JQR9@s*0/oZHT@dpW&TlkT2#RN6\2\r%53\W=-/cWLV!BL6kL.b--j;m7RST>QrPiJs.NMgB*Mf#dU`p6FA8IDH9>""3Xq`Y_CKlXQ>_iHi@bV\O:iM'-9felU5]@'rC70OK\r%Od_(&($eC)7bZ;Hd`j-,)F67K!XoK^6kY[bfMEnKE3`B-A#!"/Mm]k!a`:!*?JIumqK:LVP<tnF,QIo[r0S2F9lL+;Eb&&RU<>F?\r%XDl)]l>q=U?m%sETJ?1%%h-BnL1Va:g$]mpVILB*+QgQ*5KLbJK^7g@#8A_B_!q,L=MJO&^d*94k>$H1nU#'Hi$dbO=_d6Jls7,8\r%er':hd;*4SWnlAhh:D=Zbbn3m_Lu4pnYKIdV&[Y&e0r.q5@HIX"HeC&+^]`36n+R.C3?e_VZ"C(PCNQ778o,9&])oF;J4mck,B2d\r%>(T;mf(*Qj-&WI3/TeuJ\$_Tm>$@X$DtHFOH37)E.p9gJKg0n#n^.fG3FDE3UT)5J+7i?JC9C=gkQs`g.SsnJQDTs+/'8eoiRmo_\r%4''qf.Gh%&"MJ^oSDf\nV/d8uTdKmu[@!qDoi:XGAkSQ4l`0UWR0mUJHnmI9mCCJ".\Or_Mq<t'XL9*c/`roGn<E(h=uRR0E_>ui\r%C<rD%1+%oq]2Xg4,'$WJ7V/J&3?k`-'ed#D:WZoro@R1&1^Bu_;&uLuAg:;i>V.#@O&C67->8lPW`L>l@=kqe"n.f9KF-A0(>eBK\r%BP[EHgR>9>/V,*DMAlKWg=0#uT7YMjBU`1W82p,CX01?J-ZbUohNa+]!4S@DF5dN"PSVJ*@0pJ6H1D%oa3>do*qU8/S+?_=:Z:FI\r%\2sc"LO:t7FF&T.p5lK?&0ZgqY!(jH3<[W9s6ZN$QK"r*7,mf:[>0,eLOe4m(<bK&2%PIRN_ZUbd0rf^==eMKI?$804DakaZT1FN\r%cgbG3o:_]%2i#WF)h40a\Ub+"4WbUP\F9U[#h2TC]:m_L-SgVDLM@g8f"0<k,R`SB4dgaK2d0B&)mh6,p4^9ikI38.^Fpjg5!)+R\r%;E",#gFLCHV5$#2'o'SS9%b#4RbpVJ..`i+m%Ci1@pK%#^Ekn+c1IQg]Lm!S#2Ppb$qT?*(`q^4nnKK"1WQ%+_bS!I5VG2Z-:U$u\r%=\+C9HkERgR<`B6>ZILj\$+Y9Xt74hEOCoHjI^FD<!.GTGt@nGltncF:o37G>t[fhM6u%oUqAnH5'HP^Lkb(Bb_ql2cTe4V:+ll^\r%Qo6qk;:"/gl1rn(AaMiOYH?;$T?LG(%"_*5BBq6]5D%&L,-i];UQOcsjh8D&5P^:RL<jF\/@@jg&%Vhmk.1ka9KO:gY/B>M]1Ot^\r%1_eZI>TW?B3Mqa3l.;?'o3u;n#%/3fIh0jBjh<8/fl&?PgBQO3eZU/JCtmZnrMfdNMXk!M;!KMI>e211q1EgJiX88fi*WZ^5kr;U\r%jOV]Kpf)qB]2`\rnEan#kET.]qc(Vl!lRH6^dDfh)i9Ta#C&IY&`UVIn=Y3H__Y9g>fUgX<,8$bFX:96&gTSiC!D)T1VF)pj-9@6\r%DF3X4OTF$\4@tDGG@]jJ5=<c?[!OL.(7"h^qFe<.g>;MQ5[A>T]uhC^>\\Hp]q(&3ErotAQbl#=-Ii)j@)4CQCXM;)B1tY$`TqHp\r%;pnQ]XY'[uQGLGm)*c/2U<5.;2mms%n[mQ(19qXOYf2j;;G4I`8bK'2S%H6e8sO8^U;T5O_Ls(_*A3\1(@!XAZ1u=E)06a'4k4LT\r%jneel^6^[GhUmZUZ;QTJ;#JdBrZA,Z<It9u^Mmd5OLe$cQbDZQ>p\#1'dD!Ef;dP/N(QtL$cR]#0m665pN@R6\\p'6p)S;1BmZn*\r%LO1dgC.@d@:4_W69L;CoBupE$&O^6B1k+$B,:d:7$'jJs"EgL)l(aO=<he:u0@RS^E=M63=Q1`oj&t-4K<&fm-Qej3*LrnZQ7>fm\r%1`MsNpBj'<(9$/]]+*&B"93hl+k`(WK+?<+U7g#(PE.>d3qSTkdJ)iqPWHFpZ-N)[Abr_S;K!r/36T<%iBubWd2nEh]N=U?b]E(9\r%laUf)8SRkG:Wn`X*#kNr%nO5:+K1Og3-?d:3o-L@QrD$lWRLLRq_^;lFUKX@*\$%d-,<c?pkUSYoRcg$Q2!s=;UZ3Uj#QQX\QfM>\r%9/6mej>(%AAV]2Ag$,"PQ`K%r%PJX?jk2/Y+\ks//m#lCh_2VfQ`K&Me<Xp6bEJo\mpoafbAhN(;jhG,UBo*:E'emDY/ldL<H%sV\r%N0iUOZLBsCK$2g0B9QTGDs@m=:6lf^jDku?:)5[MjDku?Yh,dEY,@!8gEOc$._#VQP06jEBtHMOUG[GD]Eb<4+I0mua@?kJC0hN#\r%alP"^TXs&.\Ql>;^f,9a$80j2+&m:&X/5d+G9@P7>d-<4/!/uq^2>[snC!+SQ5OclLE"<fDgOe2*QTM^?gm*Qqp0!,KI(AUZ>6Y#\r%:T$bq]mEK1o0!Y'>EY0$hhj?pcZ3;.N^s<==iQk[Uur_23prc,Grm,X1^+$JBe%4ml\,Dk!tW$RXiD$TB3oTMY2kbXj:0ZR7!E4]\r%&$1PeEBrhiHE$2i8YjkKCql%"Q,NVirH<C1[iTmr4XF2jHVc)r`@r;X(3B2Bo,^4,PCp2sc<.:fVR\BZYAT]'k3"2-*7>3N+o.$L\r%L\)4t:rJ\fHE"Wmi8VqB^Zkk\8)K"-M77lQip_ScT/(<Y5<5&Uk<bb5Eh#RZQBsY%&<6g5es>8C0LL>`C)l1(]:gW,o:t?759pDE\r%l7Yt*Tu%7Y=WrU[.5:`a$h'CJhQmJTJXJA&3b+j40_:`BAlhM1Ci5EZQNDf+nX;,Z3P(EB".@0(9OEWG[WXXl^',gR_le-$<k[UD\r%W>%Brq6jDo,";BjEKJJj<2SnsU9Z]SL0WLcFSG7eE"K/b^%j9(3A]DV93BWaiM.Dq!nt:[4=X3s[?O]*8Xs#jA&I\#WX,o/-meJ?\r%8V`C*h<AJ8H*ANVU`')rT4@u`*"::i2Wgggmc+fRa2&h:Ws=l$31[m<HHo$LiE9"gl8]r#VTlikj*]"S&a!bZ_/<$SNA*jA9G$"u\r%@G+1LDBD;F20m5l,L"O>_u+&R7MoCpJi<m0,uH2niA"j3"H`b=Q_;:TAKDfR7?XNfm.7Q0pg2-2P,;)TbiV'93*I)"$]@??4L/Mr\r%l^&_sZKAOr-=g4]Z=ZW@&9ShqA6\W35nVQ+8I/bKOu;.Fpj!/p9@b0mROt<AS^`W&<-(eX9uM]6mNG<c)(XPe9gEJ&.nc261Vt`>\r%8L8qCP9k"Y__n>a-s<kDSIqGrZ=^EPpQ@kcOu5Uqn9[C(FFf2]S].2+kIo*`l'G45RY!_g[d2Oj:!9e/AUpe(8T=mU@c;nPEhDf_\r%30@:,kil:Xh.,mcNe+LgW/'fG3NHHi.Jh)E]%m3$jd?3^naYPj%rt'YT^9Rt\rC7X_7g$!J?s#O#Kk?<.]NDXSob(_XAVl8M`]aF\r%U^`i"*]CS1.QoC.M=LG9K5CT\S1i]K`&8/p1>RI6Z5`NhXO-B3OPL+fOIK8o.2>-Ze1+E<)i#%:BgPB&^%DiB](,.>f[>6)%!0X9\r%3C0GpbV@l6FI/Go@?0"nL\"h0_jhlA\5+N((0bI>A%'RsH_5Wo51cm`H`qPYRO9f\m.kSN^^RE-G"obaNS50V-fm3JRMNG:""=5$\r%igbBRCXDr)!#+1,ZUPLS[;2kg)RG#A2et#Scs*"t?gQoJ[$3ba=_$KQWJ/#.#!fKk[``Bq$/UCsB"OSt[i?H`=-Ss@7:i,lJY4QG\r%;]08XHj%hDO5FMj@jFYVc"_CDalt*7LNYmXl]fl59/%iJHuo*dP[c59/Ti_F5O2>1Q87*8^c/Mk:$JIG2@nQ17qq5)]cBIc`;/F.\r%f*%3Q6JLDQaNMhjZ3dG7SUN'WFf"Lu(!^WrK:\'":KbfCkG72.UnZ@V]05V+N1TW9)+#:H*M`$M;hr^(Cr`J'bjO)QhC7WqXJo,V\r%QA*RFKJoK%%]qEA+gdNP9Jnu6&$+s@gTc6DS07Y8Tab[p;l;US6YHR*j0T/Z2M<tr">('__\,9T0S3>HW7$FI#,HC:45!C8D86E\\r%\<D>ocj$:gA,70n#]2h1GG't]Dc[q(7]-cjolS/a?!VHWP?_q2DBOT-#b_]0,3%EU5FmElZu.J_=$<[ZdCL-8'mS*:s&#p#D$XuD\r%=uSS^N.ohG2e<X0XW+ii5!iob7aMMA6>-HjcoPeP_kD3gUa+S)=ta'',moWg&f>k&Nb&FlP_.ORIF5XrIPQ<WmGdF:6?t/d>.uNt\r%,"Dp@Ho#YY,2"*(@;Q\Rd(0DP0dMJ"hII[6njU)lREcH]ie)^VBtm`8S)_2!mg*+g\cb5ARFYZ[ii8FbXGImJkQmkNJ'&4/=`9Kj\r%BEQ\o<L#rm65u$;NR!o`&DD[5/G6SNLX66aT[a?JPTdC7qcW,X<]aJDPC=eM0GoR3lP;lq+g_:I=`@YoK[9qiB*k<9&DD[5/8\:P\r%2M<tr57@*Ih\d\;57="!_>S\er@F->(`37hJHX8rT1/2=p]<]WoWqpXM%0M/?d80?JGh#nMm37)./I*)*oo5.jOt5u)(T%R7o-8k\r%XgpC9@Jn3ST4R(0KkcFMOXO>PO'M!FF16qBplT>$.a6"$p5Io)I[6T$aCY:jFlV)J`J>Nd55d$OWHiWnq"1nO/C*/R#`=(sk(HtJ\r%J2fAaK`!JZT_B<)&/=np`D<>4,Dg<-2?4jH*Nu=UHHk6X%Wgi^h9"ZR(4IK`M&M_!0#(%M^N?gTTn[?UDF1ll[D#;0j5Gig7;XVc\r%;sRjV>>o:=<gKJZ"UV^IgKMfq/KhJV![&n[>(Xg(J=pRjW?!L=h0T)q/O<nO5j1qEkO&-5Y'eaUrje(LRTeX$p.Kf&hpfO=aHj7M\r%XLe>i?Qjuk<\t#AJ&Nps2#qePrcMY:.n+MM&=LF@?)([)3psL;mN,XGFakEUJK8rq!<I=m*HuuRGCLWWs'j%)5'fmY?"mQGj>d_%\r%i?qV:q'ZrW*%T2I[#@_i.[4%D<PC%YML\$d!S"rW'!jomT`76<hYODO"FV)9$>&0.8]Sa!"W:/b-!mlg\J=AkQu.'$qo)j7'J>1.\r%>5#Jr>*j\E8%#,HIKP#$pi80==,c.17CALD]7CFWWW$BG"TZ<TNAknKVMOYn8OpO<1Fol'<#TVE-,fm;,2A@4bd:`6R"o5-55:(Z\r%B(acXdK+Fr/uUK-HDB]&PtF6CTfZ_iK5PL-1=5W,M.5$tmp"=,E$hf*33A`>$Y?7qJ&d#Php.[U`9)-R\@"Eimsm3j!d8eWEPQij\r%"dPhH.2LtXP$%3"'k$2SOB?Ic$:eb=bX.->ILWDr`s4TcPal+elC\/Zke10@S?Adl@__\<maSBi/'tB.h0P!/S:,gN9D@Yu*MG61\r%D/u&T4o8KNIpTi1n]bqt*Y_P^m13G_^f9QN>2cKI[q,)1,H]LggQk%CI&H5]4#.O!!VBC*rF#7_2:JDa-:DI2"ES*'T!5PUV?VoO\r%D/FViVID0JpI"$[RHjRE/s3+;JP$GI%4*cPIb-W>aAeNt7An\Joth]:lB0*-0esJ+MMqN@MRdPe$ce1!&9>XPLEJBO!4:,&:a/h(\r%n(U0-%4b84r$kcV`E2qpbYbfaWkQG7UM+CXkY^#.=>='s4''qne:kH4]fTT3WG!:s,cCL_9ta`f7ePoNkrPNuZS*(J2jNd0ZsCG;\r%/]\L*HaD5I09s[O5&W89,XqXqaVI`.9P'[[gXD'!.W/!l_Kc$>UMeV_enN`0QQ'SkETn]Z?1r`q3:427.fHk>c]%:ds"TCTjf=fZ\r%m0&W@>@2>3V"\#Q85)jn).a_,m',-k;OQks[QIH!UTWCRY&;IIfIiB<r-;^Rh-3#`hAJD9<ngnLRYn<FEibOBWZPgfM;l?F$_"hi\r%7FfX"GT5X-+8%F!"12K=h3rbP%b-b0<N=%C`^,"L[.a$p5#b*&YfCL\a7s<_o9u.@"g/5u<hWdVcLse$"Y*Wg>(rbO[(Z!EqKl,=\r%5+]--mGgh<ZCP3&6FUBt0GHHhRg7kM3iHtRm3U3=Ja8W'q.##4lD(*f(DsL-q)!c&Z;c1c^Ur%aM#HP,$>?E8)O&nSb':si*/*1Y\r%/$8=^n6g+a0dJ2,XtPR=^PT:LIYpsZRDriT1!A-3rg^q!s)o-Z*j=0:>,b'X:9T:-jb24G+DmE)7'F(j9][[#!tk[haTPI5Y*DUm\r%d?%8\gJ>F?h=BW."5QC!qtN`_]8pij*4dDj@pAQCrXMIPIqp)ooZ:-0i!m6*3SV/pBMMKA1H^K#]sfp=IXT>qGMljk7fO<47\Uj8\r%FC]N2V$qZH`c=iQ\k6KXVg:]FGrTTs,Z"$c>&s4ednDU?AT@>#c^6kD*HiE;__.DO<!bf,hJld?F!B.EGfN*(pYW7'-QhO%S`>A%\r%#J"gC3\?'-Kq%8@P@^,tL'gq8c"jR<A=2.MlC79K6Bu!SU['Jpct!tGpRpXZ<JHpERkSE@Q.bhkoYj.]@CSdXeFHFI(qukdog>!Q\r%-:uOM%*QC3-ms6P`r$<#<1,(X>#P4]@bLnUj5rSWYI%'oR.ED<;W9FIP>uAfXb#3/YeeH3q&PGT$t$N#%U3%*=tCNlhH<9)RAn!3\r%fNo?,V[gHD!opMgcToKmNo%IFR5ZpJ(S.DPF,e+s(.<p;@m2).R_^VH(F0sFpPtK.IS)0>%%T,b3"&0D_*)BDB;%jP4C*;_9FIm/\r%38+I](Hu5L!CqL@I\DPI"WZpG47MmH\q$P=GfGU^<Yo_^#Nkc/_!1u]pA@imbSR?5i+NX#9&*7uY+n->R=u\_(XP.N\7<Kf[)^>W\r%i03P#1=!^H9!E,5>n>@#kK%@?]LR>@r5p^VKq'$[Td1#^8PK]-.j_?n4c[&uY/s#-70g#++XIMaKrCHX)c!]#q*@tMG<!]2VK!)O\r%rQp^]9]I+9&CF_F=?.XKf"$=N3IT&)?a_K,3/=)l5hW=>:j#)aNA-,W'L]]qYTTl*61b>]$g=!WT7$pN*#5I`p0i?al2m^F"OS$e\r%0&T]ib.HRGlfpO]K:Y\aZ*(6.4a8_.YToNYWe[,=au%Z?K8PoIpu$>J5-B!:fWBqdQ#'m3'Q-)'.0]J3/aPK7Sm"44!W@>ODEX@W\r%%dqrDFmB>XMdMOrXf#29Y("%tDnhl.9#+"`^YT%Z;d!l^/[K@]rHbhg4kLotpZiPQ^&<8aDEW5N#_"qs]2CJC.,%)AD&XgJ9]qEk\r%22]aPV.^N.g+Qs2Ln]ECiUemEe**?.*-5*'=WY"@&VYlQfGd6nD'FPE;+/eY13uO.)atHX,1miIC_TaRM9pIO2N!7`^AN;aDEX%c\r%;=)n%Q"dLa<k3>E+!M[[&@EtbQ93dldkWEEd(Qboj7QgudOF/f>P[tD;FZ03!n@?mGnj<%VJ4]s6q5Y^F)QV@YIP_-!LDGY,0a?Y\r%"s#.<PM3j-3H*B<j+sMk!MeE8Lb>R<<*cJA^[>cF6[$Z0rU:fkq+`AIp4^l"cYD1/kR2)^5Ds6:U+_1kQQW.go9rU;(C;:lC!TS<\r%;/ju*[d5lSHEYTEf6.)mfK7Ee`f]ZS?\'iHJ.0FU[NpfQc2e>11oZ<Y1nfIIh#CTjPiXC*8h/)Rs*;qWH$X'@@4RT9WkJ+E?'%0p\r%f),o2997u*LNKB1V$H=)'Q@i")K7+72-OE>V='"@pLbrQfD2f]8Z>8O]N4jPBGKY+N^Kk+?4DM?b3FMQ<2cciJ[NYuTp@oo6R"q!\r%\GJ*(V4r0Z6u!I";Lt9Df.,gD(p-,&.^6d7^2$9Ai]ekC8un&<MEs44djjBU5YIRlMq0@7pRkWj&p`Uae^>edU:#lON`?'P)u;1<\r%ZjQDdE)ObfMS10_#OdQ*\hbY]<%=Ok`G--S;X%Iio.OR\$L.7=-imGNB^q.E"6FiCPk_FQs*7'@jlC,GRAHsRf&lV0>H81?qVc#q\r%acqCY`@jH6$q!IFB!O[qfYd28Kp$oRU.''%S*sJs3RLB#5_I#0Z_/h5Kh!C/&$IZtK`^gTK&(=9(6'Zer\W$;SlY#Y1h;#dh_.r_\r%&ib]fe(ZQ>MLpJ*k%H-)"S$__)mI0jR:Yi`k$[N8JAa#!Dem.')%K$<Rj8.,G[boV\!ZA%*`!1T])#8,nM'a&"9e7>PR9N+L/t:I\r%V/QsTmAK:;qs*Y+p@$8LNrK$b,WbeH01XTmA6(YA$->V2#bl3Ef@m!<YR*QY3+tN=I)aqd.t0Umjlarbs7u/Tfa[$VQBV:6I)'.:\r%B<Qa\GleHIGE*Xnru3B)(m!X.%6DKB:J>O4@m!j<\onf*a*?_f'r_-PDDp++<dK!2S4^(a[!ce_GOF@TDXD0do\87%LZDfp:Dmnd\r%h([u1#iQF[rB5arR__0.8B3&=FU"G(/0L%C=tB4CK7>5fbIJgO`.X_=dFU*=!eR%0-'T-Wp;DSehH4fY\j/4p^0Emi-eS!34T4[4\r%qk(LkE>qEm(nj%9K;@6U<q6M=VjrUqp@0*=;o.>W3pN!68Pbt/[67gs7A9/:_5D7o=o@2JcK.7tlBO\FmN%iQCla@beSaZ"-dt[(\r%.kuG+=Bah1(tj0e]Gj:`rVW#H[D%!?(Wo<*>9!OGlD'Y/4l"+bDW<l)nADUPB4*e`lL_iSVoCAqF9C'a,isa'N$LsZ)b^.pd]7BB\r%LOCXXfC.dJ%Ft4)%A[\Pbpco&bgKW$J'Qtt8]]dmZZB@Sj&mqk[#T3.kIEQ/\**0;H5Gb$4m0Hp.`Emnb[YBIbhfffEp1uD<Ro#j\r%(E+F"-+E\N;f3q;4lthb+mY/P)j-/9Sb@G$I-HU9#Dq$<Er:Z1B0F^V[&Xn'r&p\39HWn[?$E]$APdp5X=879muql2GH*+j_qUV8\r%4)5:F8V=27oM;eI4+4t7?nX];IhQ!g29/=jN1[kh3ue-7j#7ZoYIIiS<?J60huprUn.uA&N4!A4%h*9`?I!0ONh(Jg-.mkXkMEN=\r%=#q;reN<E9^r?eGX0%TZeT9mY9EVqO;oNmm$e2jAV3'gW%IQq<Y6f9H??;rco=HAGntgBmE(u&e_6N[iGHGbQCKp6&GGj%l:[Pk-\r%PCLf(<-GS2fX]W-D<GKab5L,m6L2clcJCV0%J)6d]mXuD*cX?KhEO5]s+DQhf@]rbd[sWN]nr>/diNZ/)_F)=b8blhV1$CF;$@#g\r%Xe=s#fWFFAoGFG`5UsKOX)8Z!B<fM7,H8i[0Du,]*nuVV\1XAf#?bbC<#%X`W9ie_/t0XI7<eIks6[Gg)tr_booGnUl!b<+O+[-1\r%aKRE0NJ&ka<A+ccY.VlR'tBIt-1`&]dJ!q?@OD\fm4I?GedMA8DM#L0AUFL6Xm&iheoQWHe9lOI6;mRC,4jG/[Z\"#*SoHp4G_$6\r%X!>a)Bq<emBSV">#@$%-oTV87j.8pV(<#7t!R5aV,/IM'4U]Y'4J#[rW%Q0?3_u%Y$BMa;ai37lGW`;n5#)iDQtqF-)u?qe'3Ii(\r%%%(hsmLUJY_nbIOO1C!$(-rLmB3%MuaV5f7_`;?Q#'5cq8jPa*PDcm#._P/32Lb<]Mc8t_;Gn%U9PDYX@o+&hlG0&UACqcpp*,-6\r%4L7(N-&E/ln]^8p-gW/bkS5uAWen`Q)L@g6j@FlI(-e(e/#XfC(EKpTV`8YJLccnD[96s-9q:WiTlTmGOYj9ESh%WC4Pf\*0d*9I\r%kZQZkYe*Sl/UnWZY\@]>2](11GCVHS6T?:SGi4;I*g&:bP:E7@>8sR*I@6M0kJ[W-X]`bhLeKrKfKiS'MBEtd^^f`(71dDtBkg4[\r%,XFPa[EW*Z&DC<cQ@j6'FAiP[%"ecSlt79*YL]M3H,#gD2mpHU'1!1jB3*'8oh9:>Kl1YAR_5l,'tUB@H[6L8[6cg[n/HXM>:Wk2\r%4^(iIqruA,Ej71)r_1WG]ls#E>)slY>=Ptn@>GGWjNmooeG(/gZ+%/r$$bYT@gEX_6468Bli81RiohUGBr0#7&o<5kg29+#`Gp,m\r%l%hA)5b5M7dqq<5D.SgS3Vpba+nS`S?lj_7AuO]c]=4UYTD&'4f(.nq"J5>tFPbVB(KkU'/HN9W&?eOd`RNe"=5>gl.-SWJq`Vt[\r%!H1Bti%9G90cF.+37Q4BoBj892>LR4QV>4f@<QMo:)l=t$ZG2KG`F/kDKA#XVg_PN;^c^cp+3=B.dF^D?71#;N>L+Ba5bHDGP/@+\r%1hNJOY60M?6P;,S%kj0d1bIN/q84t'rPb[<5HP;sE8Glqlo=UHg`'qso%@U,b^,SXM\@msT)E?!b9ErH;qp>>6oEk3U71+:#eNL5\r%\!#"IVRt>+*NqW#HMZ_>VZ.?[(ETokD\)-o6G;In?_K/J;c4Gc4I(KNAfL6@-!etLjN]&E%WBe4`;M)JIDjEMb>2IUD3]2t]t)1t\r%Td51`-cu@0\r^a>H9CfrI^=pGbMCWQiZChj-.D+3Yj#-BI9S3NWR?6Q7&SL,jNC[ZVlc0tFI'[Ah.ph%Hqd+JXa3g]X[.#`h<@Ec\r%B<1Ql[_MY0'YRZl2W24@XiKq<olAYiDr:!$0?piuE1+Cd/le!rH,*W]$<f$^*@+_snu,A(O"ud._j];I9aaSnn=^>dBo99"rTD#*\r%_kEcPBh)TlW#nf\LaTEWa)!E(o8\9sNkKt&m!)7]<;Pur;-f6R*h^KRR6uHR:1.5niAR+8p@&=/YXTPVls1%UL:tWVmI;l_*p1q>\r%<Lu/qWf^h&Xi(q^L,ICP3jW(KRpmFFKOn`>jGs>qa4fC<::BkT77#i*0IfA&XqnrVTY]@JZ;(s3>*jHXrO;'n1J/Yekf`o:/kV%m\r%qpe!@q;Wdp!<mfN(SZ'pc5I/=Y;iPHk-)=7"<ERPMU1==&TmfZ%+8Yhh<"#PQG+<a66k^@>KllY-kUR:*)7$i,=^#\lR(/,N>OrO\r%+\iD7cq-!Icp`ndP@TEV<bMW,jW9?p60I027>RV3PJBU2kg7lC:2dNPF@u;ZF-!#oKs!U`H7OJD$_De'o[ZRqpVS0<cq1?Vqi`Er\r%+m;Ibp#6R*k`$RT!Q&&Z68f'eH7Q`cPerL20i"S8VRQ+T[=T[.o/F)4H9Wk^*Hi!6VRQ+T[@i959lG.skXN*n=\1'ORf>,f"n9h.\r%2mn6#Q*0H9oL)S:FPn2s@[N$6qE##o*UJl4dT]L3X3)RBRW)i?d[OEZ4@p$)6je_;DE$J&Rb_l<1P(8W@[u\br(Sciq[;.^Tpo6L\r%\d4_Sno&9:Q!_V6Q@DhK;(>Km%c'W"<p:[5:3Innp\+2oftXX(\u@!t@V3%GRp*B>0)Vf:IoFPONeX+Tno&8Oc]s#`/cSBoIH:u(\r%X7[PY;7Is\]Q6Y1B=7XV:T/j[199No.l4f3@;!"G-aiFH"Dq2?I+D\reaf?^d]:+OZWd?l>5q.>@`m3,n<qfVT..JXXZi_<hT/#q\r%[JVD[aLTi1nr)j\';$u[ZWd@N:m(u#*i[:Y&i?ZN5H+fS*>,V]rmM:q>:fEJQN*bH,`A)@nt4FKF<CUj>5j^ho_D,3(R^L1g2J;/\r%rW528_:+]PqcT(Uk\/WtPFMq48&q<^Bq6K:Q!49W<RC#da^rn^(9IEWa0aVh<?7l=WXXU8@uaN^eM?oe(@d3Viup"o18`StQEoPY\r%M_8^;Md]-aC7()m=q!c%YR;7f9T*=M$a+s"0eJ,kbtJ*D0rDoDU]o&H!+T2>lWfQE^A4%S*t6cI!Z(mlS.p6@lDpLeR$.$nJbRA[\r%"e(UsTA`"#6EW0n`=is/'b`+>cl(Pn`BQSF4@-5dY*`=DSo+-E%`I>u*/DE(Qn\0ApLZ+!HJfg'!<)<$l+q:XTYHDSOl5lY3_$jR\r%L#Va7*CPHtH8Nn^*N)uojN$MYG@_KPDpLq?j@IYT*ecIAdYe7+LK;SHd,0GdDgXN-.3/3]pY0:!0)V+3?G@J-[^G8D>BIjfN&qIi\r%>$>/o<8d5A:aOc^)Rc_sLnluBrXY+_G*]0TAKYoNri_OXPZ%4hoFA!rO0n_:d"@P'B1I$,:>`$^fR53bSk9JaQf]3=!=s:KbCW5<\r%i!k&CGSfYq::I";[JBkR![[YIWdm@Ug?U*0MW0om&/G%]D(sC&)9%-HE^\@GT^$T$n;PmZ2Vps8,[XUd>:&3,m%]cEm'i5IY9/%$\r%crf\9#rsok%="H9-^$:ORRT0mkqheRL76;9=(]tmrlRP$O=\9gH,Qa(XIFt"SN/K,JR>hAIl*")Xo<>Z92r@G@`d-];Jb_Yo/i95\r%pfNTZ%6gq)M6"6kD"[a72n!mqpl$L?T<I1&*)SSJPq0umg_s"!?p>'#)=U[0(u-%V1C's,7rW5tceL/"J.8\Zpgt#DQ"0QO">k1u\r%XW5#--E*>"DWRhe#CMR9M*UV@5h^?fL+1XM_5EE[<*Lt0R,jX+(Z,bGd^t&N`SfPk>48<qnJ5EBGCrta^tfr-n&BDaXn`d<CiSuJ\r%S?+/1cki/f6crf3ZB-YE).P<h$T:KGft3_C!PMEMqq)#>q<68^k73P"R$U,nO"?SK:6Is-N@^GK:6IqWjc:#a@RqYa-OXOEPGAaN\r%@tNCnUh^<p:Fo_?h[.E$LoTo8_FP:\8:p.?bt(`$f&U%POM1[^/kEi.PGB-(?'hbqL]pPaP]D>>Kbj-#\,H._fB<Rt]RD<9e$D0D\r%4c7A8Cj?=3ajDX(,_qYKEq>Ali/YmO^O5V_Xt`XT.EPfhs%9Sc)"]ZWe%\o]s)X5Z&Th$nhE<&Em^.4T[0H#eIF*))(4Y*W+`4T=\r%'Z&LI7Vf0)gIg`T^P*H^BiRm/4:Lk#:XN0D#)NDsiVRSM/Tad=`>Qc<0]O<fPq,kMMO2MHPs^LpkYO("Hp:jO'VBF$7ITJnJpM\]\r%"#F8k$GaQ;UppgZ>kQ@<.#H5GK'Hf/74D&fdb,4TYfY(EE/Z\8gqDdrVV\@nn&J?IImp8:(Z@4l;:-[cf.+%I;k$<ukg:^]OZ#]l\r%+HJF7B`pR8f-OQB0TXon_S!TOXe=%#+E[8m[t:\N:bH-#aDc:u[t=O4;OA@gXKt%J)F9OVA5$#2dg.`)abu@JE$Ip<s%V\P)aUDt\r%AkZ54PH+h>_r0g8<VrGi+%#o;[1AeW75SCeZ;R&ZOHD(3;#RV5+8.`U9I%VdG=6)P_Z_P9(Q4poqJ.2>JIei2=;sPhbg6\(>rG>,\r%Xe=%#+Qt%'$rmYj#_GIQKrlIB;X$otBCER3&<Qm$?,R'p3;up@fn?E6Vgid&DLS;:$F(1B:Fppn?1jnkSpr=ln8&YbM[>paRR>r*\r%<un4b3S*BYfhd#\>-kNgcAkOn.Ob!KH;p,lg,U2=ZTRY<V2OZBP56-`ddpf(j3^'G0)BPa%F_[rHoN?"0*kdP",5Z,Q_UOu5UZcq\r%;:"5b'qE/-g/Y,U]d`0QQ-P5kNa^rb4I)GfYmdXqSgW_D:F0&U2_k8dRIKUipP*h#L'JC.T,aBjc-#dH64pq7q;1<e(56/da;*0<\r%+,o^6MF&H5JCt7dXF+qX%R^#'73S=N/-Oq$'nm3lb7al0JF9ZRKPq2)@<RE$oM*q,+lL(:@)=iQ$Gjff$V:'l-Y>j#;$]qVZjB+8\r%V_pCFLdLUV<emioM'rL+O$temiYbaH*VeQGDcRR(24##.*R^79cq=^@pgur<i$lseKPso*[j*OT!9'E4mgWTWi.Q#L'E\+`+UHs^\r%'Z(o=h+ID/\\2l[(D/TNE-hgQ07k-*p@V@%/uF.cG\Fm-8L&TrjA%tFA%817jNclS$M6O1/H]89jDbu5V9l@h<Ur`BHXh4(!JV0X\r%LdVqD%^QG@c0VCd:<sNd[=]&PPuhHL'BVi=DcRR(\SE4EnBHhWYV^AC_D`tP!RcFL'>FFs2Oj.E]@N+aem]>FomW<a+UCIZ892YR\r%[9-MpZdfZ-em]<p:hV&4XYlt9,*&eEmQ')2(L_,3G0fDoiXs2]@MFD>7iY`k57"9QUQ)CpO,quUM(H*dlm),Vl+2`;()I;Yp+@PK\r%XgN>T,)r_4.OFVi[=($6g&a0saOj\odIFkOPd.Vueq12`1q*,X7eRK#$3?d(-t@%t\IJ"e7i>Osd/+Epemd5;I_S8g>Dl>ai9fKa\r%XlVtp87<1MQr"'m"4%JO%Z3RQH8Yq]+:s5,/i=,\5sQ+cFKE>)f!:t\^^CrY@]bVVOQ>U<C[H*gV"Z*,XL4BPE2l<k=R5.($^Fi+\r%RJ<U;(Qu7]=53ae1V1Oei+thi]IW.cE3S4L%#'6+P9Y+`faT6(8^*=%J`C+b4gq"HZoQ?aNdl1Nj)0RF*f>NViBoWoA<F+)eql/h\r%X*.%VM\O`sone=JmSkTk]h)K<X:=KZGqJ1XY+]9@=J%h[H_dmSUc%`b8>2]?RUq#W@=84SA!+X^rr)gNG$#^7-]l@b.BIB+D(,P;\r%L@kl8.>:eN8kJDNAj9\sGX?_=94kfu:W7+g$j(4N2eVX_B6Fj'-;6"E[:+IbcTYAX?a[Y2^tS"a$?a-'Qdr-Z<,;k\HEo7Koqd+[\r%l.*<2_`j?g.l`G;fmDgpkS*XC^IPIC2&4U"M.n$ELW_0Y2)jAS8d50Z!*[>[_l$ns`^j6+HJ/2G^FG9=6$KUTnrq^eos1?rMnse^\r%%pc5\O%;;Q]Z'#n8Cf7Ed%_q*\,,]a7Q]@ma.&t]qCB[X2q&%s$I["I[0fL)^gt,\X[5o8P0C(/!hgG"!f&/ha\//[Nt1QjK6f)A\r%<`)(gA*^0gIq"9-VX3cb"$aO2!^MkA%_]h(4U62JU\!@,'[;7"?_d2K)&(d;9-jXX49FslpgF6G.k^92]IO*+.k^:]F-8%7miAVo\r%32D!gmiAKq$\O7%Gjk(.Pu;sF<(d-U7%q;<qW-[g+JR6>4#'[[MnF91e2&\4#Yo1*GsA\10#IFNJ!YTrk.UB4IM1bUdq<qA%WR3p\r%hFT7a7%q;<ppUD"DR"NVR$:$QmiB![('bG*nD51Y(Y#Ysh1We*)DPIt-ij^.LdHIWi4Gd<3bmhRESr(PAr.6[EOro]Sq$_knpBha\r%4E8YDU\1Ceg5QPrkZQZkgeKjL)MGp1%]:;XqNh#=ke6"?,0>0:22pt;99mkmXc6<P^<FfHmp^p#euWCDlM6cOi:l*mo.LK'LdHIW\r%FF*Y4+JR6>40maA[.b'5^?N@ic?lHr(NL)72l]lHZb<D2n"AN5XB2iR^&f5Bn7p(07^Ufu#M!hZXnh/IiOd_>5!.=G`kd6&!f<Q"\r%RfY.%#H5Res28^:Hj_1nds6gW^+-):TA6[e^A:SXr64edf&3R_^OBKVg.2eMe*-dV;#R6h5c\fEL*Lo3fZaVB;rKRCpC6fmq;^=T\r%ZPhRX+Z-\r.LI?7/<B[99IL%P,hDfq2\cONJ95?..^g"EnG]Re;$cm&?k=eGq4#[)&A[$6!=1:t9._7n!NHM96U7Q7T8LmN6BDt1\r%GVLTLr4Igj_0O1*r8&5#Jg6J=7>'M\"f=I:-6*0O5p66;LB'\,0C*Id[ZXFM6#_,ZHG7RK9r/$boO]JN\V;/j65!qKCFeN:KM..g\r%RRp<eguO3TLB&C7OD&H_LN't):ci<T&R+9OER-BBN4Y0bC^(r4J>^h<rO2<ca5obqm[R!ef]&5l4Qol)C:/U0>!mf<"P!QgD,lL4\r%5NFZsH`/t^bp8kIoWEY71f8sJW"QZ]gE*F4m(hppYG\)i5gH[KFlb4B>l25kRqcR\[Z/kZ>@i7%BA?QdQg&AZiI5Zj'nLGo<QGc/\r%G_F8HFA%co1&\CP(dBK!2j<9&G1<]Bk9UZeaph\o1<`H8b0A"T,f/8hU"l5op4Q^pV--ctB3RkTH&VK%l,X[<<UOOXHcrOXXX\Rt\r%:N,>.k0B(ad/<+);tk&u4QlRCkA>GqI338daHHB-C9-k@c@_ftIR6&"K5ST"I6N&CF?_BM(\6]`B+IP]H`\m1\('.2pj-E*!d=Lo\r%:Ai/+,;[<pfMMUBU@`[D.d!AmIja_&<h$9Of2mtji8WZm_aP,VE%13piB(1=E%-5+#2Fj)ajgbHDrA5%a,lIl$6Q]nDIt.,C`C*P\r%IG-PfY\h11in#Z0f=/8oD3j1>'\fM:@j8;fWJ'b^h1W\SX`#fN-]?!QTr1em<[$!]\t`K:B@*\Yrr!_6m+=4dO"=82OHA"s58Fl8\r%c(<&l#$T9eDSu)N#-AMuh58N2#LFr(r8Zgf28j.TY(@L6)s:/a\phsrTq"74@.n^)pD[!^rQ3Km>H&%=qVc#qSk?C5C[oTo@Mjf.\r%<i`]XP!6,b+4_+ipF]V`=/!s&#%$nC!#Y()3S`?LYc]je#",RQ^oL8Tj69KVbX\HY'G)?"F:gTLG4[YnX'KSTK3L1$4T!UW\^jdU\r%9/rQ:Qb?Id:A>Q]Ir>Ge0YCosrn[j*p)V%njR1$EFT\`NltoiGGRh$p**8g4?>9tY4q;mmn!b/nXhhRR)m6;ohT4J_!Ih0Om#U\"\r%"o,V0i3X<$<CfaD^F#9PW>i!F*eLt3isJ=45?WN/.f^X0Y]Dma\H9!V-$F0]1pmF$EqrL$i7nh,RlY_="jQE;-FIm=m?"m_Qta=&\r%/5Z>0A"D?t:$mHE;XE0K8NoE.<UAKN8No\^kB9D!2hQ2d$$4Cph]XREm+`(bC<&VV@jVTQEs7.B)=_\M%!K4t\K);a^gI^"`Qde3\r%VKQ?B]\N\Lfkpa2,d`>ugEBier*A4fSt*!XqYn'W</mX"n,d7EH:%UcFI48`a'N8WDuk$`NuK_P"#euZ@qn!IhR>Farbqo1?.eWJ\r%bXWqp"i,!@_$fTZ73mE0VuCoA0":n]PJrOJ:^;.h=l@@2F^R_;2?gl(E33uUL'`SNi.;=R>"m/]NrRtGW0&+c^lHfj'913/%.'AH\r%<A6&[1U)N"j=#!#Sq.p;h\V?s-I*qDa(9T%Fpri*BO%uY?q5_?L#]I%K#H@^(Q6K1%."f>e^,O&lM4Lq6ljo7]5N:@fq*a8gRTr2\r%Q^nONS7]fQHNnY4rX57Ic^R(K\89J]Q_M<-HNnX=3F_6)KaXiT#]SIg;\"JB#]SH<jkt<)$H$G%#'TJEYBX<\kF,TC9!PmBT=kV`\r%\89L,%OaML,<OD+*A;>9&2)]nYS6`0FBq,r^lBZJ*8.#D3/jhL0dAd0JK=^##TDBi%dZH9=4kS(F^PI)0N$c64TdcD1q7?t;[\bI\r%,/@c:RT^?1j9jAcP2q[bqL5l8q.`VBRJ3a"WN?oHWJ.A\Y%aFL9eG.G(QZc51psD[U0([/Vl9jf%ahfQh4muXZ_-*u.Mp9Kld,49\r%!<&8HpGHL>hACS^Ned*"XS(?d(qXb0puJ9"H^$Rs`/qUT8W4"'`Bq>kghWOuFnl&tY#8p)GuZUkHFqA>:$f@5^"hD_4/]cUK4JsX\r%q4Y_k.s\8%\$kE+GWi6u&+^4cae':OH^iuG/aG/"#*&81_Y/tachNWl[*n&V#rY+FD)WR(i_3dIk#N&F]%_[]g<(P7F7cTLLH#^<\r%gV2LQQS5an>Pdl(O,n-0:MrtdM=:(Gl_TN@[_A&X>(29/,4o((Do7M$)fHD^@]B<tj,ALI!h>?jq,@(>"0;eKqI]NuG2Kp#I%ti^\r%jDE(H)6N;AM.9nC@39(dT&ba5hqX:3I0eu6\jDZpBn]G\mk+2nab+BAT]SH[GFlCHYN6q!H&"G]q)X>7qM-\aD*<Ieb+e0.[n-M&\r%XBL,DM:PJf_Xpadoj5u$YG%<0<@g5W4>-@4>.f6+)+M3qSr9$4(n#K^+%_X78/M<'#HBAn7`MaGe-*2inJ6e+HLXH[\8KT(he$HK\r%?##Uaf,ddXrUL?AGIdL\n<e>XpQS"XjUtq-S4$$I\EB%AAG+n#$jKEBmK'O'QZ_o7,_Q%;USF%H]Ln"*A[;+Vp[jF%0?'iMfGST&\r%)&&tZQ#nao\];E-X5(HJQ6,\B<oZ8WC%,BH*>8Kd`URWNaRtk88`FoNJ#V6?o=]^@lg`3fqormLmcc@oO(E>d0sc.s9'>sRLrQic\r%Ot,jsglbfY>NmI)jfFft<_<][a5<m<-jjm'h+'IG[C,9c%6"O:4a*_JD/gW\C$Xl`]AC9XM-jGsWL);Mk>DICMY2bu4R-cGauo)%\r%CMIK?/^0pFa@WK0&P:$\N,HBT.M)%PQLG*;=Ee6+YnO@(*O!SS?F&C5X>kc"]k;ERi4J2`]=Sok&UTT;g>cTG4jKr]X$CZ^<02@U\r%8dmn[P8Z!:,JBa+bGD]tjl&(!<n;f!U]Zfh]?o9gR813aN($%iq4L]=fEa<9HX2C)q/'jN/Bj!sVne28JAqKc\^c\J[VZ,0B\Y"K\r%%u79RPNk'lN00=$<SC;2O)T\dBFU@^km_Ro[a!tnqOiHt]"Rh1Ekdc"/:ZS96aEGn<b&*s@kX.<D)@HA;X`:VDrDUh]tkGf]nQDp\r%`&u[Eo1,hNg4"E3\nN/N([sW`!T\:eNIR=63n2csq<=9=T)E]N(#=rn3TT47!Ij$bC56p/H>A7-TB3mf<!2ISYJQq2,(3D5.B0^i\r%("*K<q4E"H#;1;\[R+Vm5Oi;O^Ld'LCuT6@YNa#3k91<&6*/$4e*5NgHBZsceE-&uqT%q:^tB[3puc9)/u.]NrFrO]UAf[VlK#!i\r%RJL&A-N>]lW&>J!p8Qi2A<L!0BX3.lKle_uInYr)61oT`aJ2]gGuCSA+Xn-^1W?=n?IUZ4Kqq[irttF@#1+hFV*\_I$L1UC8d.?H\r%!ON1pW=,^IQVu40b=-.\L1t`1>(ooh75ZI\<[r?D9W2"NbC0eu<Cf^cGM\$g("1hVl7oPIKqq[a@[edJ6;f;EZM5_BX,rR'Z!+`G\r%8o$<UR-M*/`1WG3Yfu<K.)B(unPe\bJmc8@23:/Hk,;H0Hb[7#J8$69-Tr9N*tR@['FuDhh8t4\OT(4:)$suagoRMW4.&4pAK"OZ\r%*?Yp#d2RG-8>7AkAru@(P)]co(R-/-B95kQ;;q.'[Va523I=M4FH2PB2::&+G^<+Gh3<6jM3F'0pli6:$2f_boMfj/''sDZc:EKR\r%)_WLgT95eu0RT)f%jRe>IJnK?*,N=T;],m8Xr@ltJY/'4\-V^WLqUmSFSiMW]/&,aGjj"kCSa,)IX+78m)3WPU?f+1EB8+<4m]lZ\r%Y/'mD^Qpd/7BlBRDnc059UPkQ4Pi'MB\mm\Z1PHg\KXu6fU-]I"':ct2cYm'.AqON=fHH=B\bdDg-$Y2%ZqI*8&Wat;D6mud8S0B\r%,J%4HV""_Th'6Cr&:(2%6Kp+;LWK*;"P-jP*?oHFMUc#(Wp<#0qI0MK([7Dmh)AcRMkmph;`6sa(TAB@n!?JSl[quWO]5E#M4]Of\r%dTL</F]VNun,G#'Sk.[+;I*nTMG\RHIH@\u*Bdc.']%;d25XR:WNgkG/a"gcm]obO<I!*G?'Kk"eHJo;Z+>kC+Yme*J\$c4\q$gN\r%q^ks1DX_@h^+tS^-Tq)*BC+\/OhLWQbh1Ah*m"Qn;@03VF32#I>f5qPY3(g;#NBJ/q.5l'&38lLOcdFSD\$h0;*UYa3@%bp+huCU\r%5sEjrArXsir"KlEEsSDC+RL>Tk)^:a4iGkj6:s@BH\cH?drTdqr9YZ1jq,6ZjRuD$=aMdAP']j>=F*q/NMW*_Zl*a/G/>_E^+-/Z\r%66rZ/jJubJc!'*=?2!t(,YC/ZeS,&`jh\L^Kid[NB@WXB^UFO/WmL[+H=!j]jb?uXl""iS"RZ@E*#bYkjp9h/Xdcn%rshBfWMV^G\r%N8Vo9]*UfS'3&TcWqdOGH"!4gT"XZ5\r5jt_fml"2igs_JS?=sR=iqcT)qFtomaW[B#R*Z%#:_OHr*khT&ESBP4errp')I>hS\$!\r%pV%_`Dnbu2bLps/78%qef]aU!QUc@Ucn?C449nO((16mailgr@,rlV.jcNl:6m5laH))7fa.a,PMgH56YTs_C"a$CC`0Wu?=\P+=\r%9eV6e(ZW/q?djq,j^hDq@E$hAgb^nR0GHQX&`ac,d$j:>*E9uWa]VosW:Gl5@45XR23Rk]X]7@<;*2Zt:Qg.sMnW3`1T-3P3^kpF\r%!.uYr"dnp2UOQSH<j*.V3<fJUK<%7QIiTX+9!\mW^:o3MJ<d%k]Pm7H)i::Y'kspPp/POCm]daoF?Ff_OIU[&SOqs`pUI3H:=%'(\r%kFNIh37ugA>'Dru85#7\\d(F3F3e3^g$&q(S9t7`bj8KVbOIKfSVRS1!bW>(S5bk).Hl]rKE"eA/Tb::_>gIt^U`U,0^q<lPSA5s\r%KYd\e;c<Wu/J\Wk7n*G<GN#8`RnL%Pp`C7Lk@-i4L&Y#tJ"VsX_>gIt5?KLk_>i$1b@-$Vre#Ek0_c_)rAVd-$3U='f%;>:6jW^O\r%MZ1MAA/"rt:9,!3r^R\/P">?i(&]N%!o\XY653]AEUZ1B]+(-5U4'$4.T`g<"Mt,:kWbG((C'mIR_m8Rs.bHf.oBIQr/Za71Pc9F\r%i."_u+0<RnHXNWZR$I=qX9V3]s$8S0)#TGPre%7)%/racs#I8UB_WYar<Ll,0_c_)rJ03*U>UN#oH2A`&dA<1UAlKA+T.:XraR<Q\r%0Ym^ekWe^B1uNjj.Hl=_!QT?fmB;^U9'u#aP2F5J5Sg"U.V6n-KjXquW)Sbp!jkOLkT5Y@"_a)"@?)u`$ZKuZTC+feF5]OMfh/P3\r%dC(VrI!MM(H7FQ)0/`_o'ji$H"`#kB".*/</RL;E9u5@mb/O%\4Sd"2o^3YmfQfYo&0N*Eq+5U/+Q+8<G@,bJ&<M`ekmIWaD]D^6\r%lUHb7,RVaJN944F!Yq*)^L/+.2U+^c^dQEnZ)0IrPYG*abgp.j7ZL)l7H%)9lSI6)<UgF?Y#/SNe5<'p@AgL>YtEEAHN$n7iA8$1\r%SD2BbO`NBU6?#K*'Gu-6Es5=4l6:U8mb8;1l3!E0InbjBi!pM^"UnBsiOHWPRE+-i2ON`LY&<CQ$;@36O])?!J_E`If=jGV\9_6[\r%Ad*JkX6$j;<PGTN\<@\i'Snmt:2V&]7"4u'1]JfNqFWhrpGJprRS<Qm8`?r[3[..aiBHgaY1b&q<S'AVIr*APl.DdLOS#:,ZJ0LG\r%m.NidA[eM(,TG_O4jMGdjl1D6n/N;2'H$0a;s(mLkG-6h9NEdU3ePb0Z"E+7GDR$aLOTB_A)^=5PcWZNIJubU8d<t9WM("g/!jDR\r%KZ_HVCGHPN4\Sm/bTho5n?'?9)7";]qI8HiEq/a1Uub(4Q0V/3&tbEs-Pa@R?Pt+9/(^;:B7t+,1rR3OCfJkSp)Z9!#=YSn:n81a\r%=h0nf@AN!SQ^*L#Oc?a'kd#6l3[9btjm'OTKW-.>b0#F'5E'\EaB-m0^,FR-LJ&T9AS,8`7$3`Rpo/@@^Yaah@r9YKXLg5:.p)IK\r%6X"BA)I6ArkfPn`78?E<kA,Si0+,hDbt2rk,Eb&%\#]2g=SXaN>K;6bG#g5#I5<H6\u]/#6m2[`::89=pPZpC(KFN(>aHgK<phZt\r%\3GpP4/]dD1K8YVS@#GBQI0hh,p&P:>lHa4pREL!7iAf9St>Zp%;"=<ce7!ZF4+W;$=uEMM)EZeqN\lQSQHPr0]sp)VA!a>'7),q\r%A3-tB3oPL9hb5CnP:]U[0#%1X?43Y@nt2*9E_(kY`\BqLp\+B7,dbo8$)h7r+GmXh'e.dl+k?t@q&tB]\=?iUK:Qt_'53Mbs3+$D\r%?mg[a*QZ6_2FUjW;dh[u%!?SY`5*Q2/<eY\`&cj73F&d%K;i5(Xpl-4`%VL-kfPTq:(4C&HB6Akli]!%2$PEKX,i8eKc+ULZg:5@\r%a0rDYmK#k!(ag?)O)D39d^irRjaLOLWjDt$!o.>rBQJG]EV\f>Y&FIJ`gO9^]t[dio1P7J6iC3/?X%1M9.f[D-N'cFE8D7MX?;>8\r%>.:85BuN:"Z]^fC=+QZ/7;&MO:40@.#?8J=7jKEFQ-iC7!J#.$ks5EgDqV\Y7fV,1@aLa_`$[Y8$!mMN&teO'-ZiY4,sF=MGA`&(\r%jD2#1CgNljaZj(_S4OE2Yqlf3Ru(L&QFN(<=R,F'R3+&tKpIg2G.9s0G[!<+=AOed6W>K;3Jg&@&A,/tG9p<mmH-+C05RFEBgXeR\r%WJ=nMN/+"l3nWF`+P&Oq[#VOhP[V@!+P&Oqdg>8'$'Z;!C8=EDei=l:=nk_nH+k`PLZ\%l6`[$p+.@\#!Dd\Bn=dZiV:UQ9:1@<I\r%R_K6ts&*K?d2\8))%e.)W5Z;\h?DSd-407:q7k"qm+S[-2#ljm;LBX9B`9V@K5*U56i3n^rQ"S(W\eO'n(ZHRrtbQ2]D:++ig!+H\r%4BEthIQ9S\Kmfq\`(okB>\GT6O6bI=@66L\"+Tl$;G$Fr>#,6l,DBo=oKS(7H8gPC4AIpY3/8:kOke>EdlQdUD75KH^7Um4m8HoG\r%cdN)].p'6Q1B;a06iBD@*nPVo^CA(X<9/&s<#Y+C?LkUSbniCc*8P@AcPaLXbcP6hP/ln1go.thI[GC#BBUqem5a3NS:Q<+hK($4\r%4RSjED+7#:\%;rQFL4U0\?>W%k(!0Jj"SG$,+[;WJ;7*e`?()#4>+`bdV8[%j,trEn]?PKDPf-XOn`HGN8UZldV5!1aQ(2Y?K'u8\r%-mn9CiHM*>H?qWSZ:Gj2i-2C1)cbnH^UO4U#(D?!b/b3fk]Lo&jDda$R/"Tg*lg(LTb<u"aQ)Kn7$dUYPK33(8jnM3KLBOEpp?Qp\r%B(%AkMWdeaPmAi^n]C`/3j0Z&r/tV;V;,fLq!l9ZYH0[4BR%s\Te?QIrNPOn(>+-E$V/_N#o?@WO"WU>l$,&)SM/$7)aF?%#NJQ)\r%IN70Ro;e@"r4%NVl'"j]#!_N3bomW_Y%J/'!9B:#a3i&u#*;?,+4iS!60F50Vi<BYDXkA:8GkHI@3UVXZLQuM\h"P&@I`C'XCo1_\r%'+'+mJ+!X0GHp/J_/m#'GU_G3P,oB<X!N1=.5ZMOs0M'i[mE=`p:osls(+CuaF4JP*tOh=`.oFq-MtoC+#e6R/HC&Api/n!!6?DL\r%p$,>L"$dn6IN6([$U>a>IN7f[F7m>#i5afg/B!6t`fGc3F!!+Dr4"$LB1%N<AoM&RZD#3-1P=+Lc%Zj`+.#)?UXuIr#!WSZ]g:h\\r%f^\#$F5iq`j-#o@4$^b=4p;FjO98GjjG/5M((5s@L\qrQ#+cZ8K[JnT1@W6?a/tdpd-MGsIN3Z*!r?[?9S\]](s$mA@QM1"hQPrC\r%#A7u\YoRlDa3D7BDVH>$kth`31gi$Y_Y]%!4%,uH&H"-\4$<TAcIj#oZ5ms#U5".K:_F8Mkn&#.".#i).bA3TE8(l59S\eTAigEV\r%*s["95^YEoIN6ll_/+m;dielZY3/pjYT7cCa//97T##M^&4*(Li5PJ2a@gOSa<SN^lTA8nN*7?Qgm<".$pSXR^%up&_W/]:.iEQ^\r%23.f'%Q04&FHi0G-qPa]8#]i5BS9+,5FtLIj,JuUNI1J25,28@lmKO+/?[AO4SA&.WY!(I!2dFOWBq#k!aO*$Ul%U2$J37j[_*UJ\r%%_nm-lX3r?V;iZR=fRX&:*90^3-2/!0S"^Oj4Gi^Y@@T1j7eS!ObOdp[kkVlJPbC`DsEC^J>\P3W=XlaO;;b&LI5&!STB9nQRG6*\r%T&emAamm\M8TL'D`ACm%H'1*0R(kp7"\8p]7oYk>Ns&"-5XYcpi;Jfd`?6XL)C$+t+V7M%F0*HE$50'7Ji-`]\6WjY$hR*MIb,Wg\r%h+ID/\\7FGbXd=t)u[BS_4F9Noi#`\VB?s&)UrX@:,6#L;S23]<B^@cWWXT);h8p&'#iu"8e$WNFN^?93G57I5_5j`WJaQ3R7%(r\r%PN4u!,`sK13TuAYZ_Mt29d!;H#:"=GYK"`XdUhir,`2be5[;-GVX!_2[>Z,NY#J^#VH+pBkoR6-G*%/uqt[Ydhq%WoW.<`(h>`+,\r%5VYNFXB;_P66spJf[S>Nr_UF+$r&<Fk"jOhDee7V#\U.iIoC-3/kI$UA%jH3"\ZaNC8!RA4]V5u(lG.u2mr:XO"XM"^Sqr#c%NL(\r%AbTO5Yr'g!oe1"OVA;jE8&`o\5J#quMh%Y/+T4f8]kJl^8WJh-@>dH$6C*A^e<4?N/.J52?fN`XQ)`$be,j8!DlPF>;bJKintkXB\r%2mqjT;:l\QPYg&7CkUYP0G6VdhF6B-]-Q'R1_7NV;FKg]3Y&!YFe5\8\J=f.AQ$n?LWO+*57:M@N^2F>rN$K,/_,S1BOu@ZJ3_'c\r%W69-Jdd\TN.8[LG/7lk;(YsW?/>uu:!d+V=ZZJqqF.dEdIMQ1:N^2ENr@D'k3!+4)p9S/LL7e1;I]^L!f-ls!)peL0P?`E/@W:$C\r%/*kMo#@9ec$'Qr[U9mYl_i!sHhV!I<(?*Q%a=Mi#WB4'VXr]pT``heGH?%P^5h.?5oEs(3f`YTlcYL%40SDAHQ"9(eD8bG+T/emS\r%W^@A4Z-B"\Wn#V@=77p;ZXeT&0#,k9(p.9j%=c7mc^.5\1\bJ@]N`(*",8'K`Z-AHTl<.ANaV:c)9cM;#Lf8)abbKa$8_+oEN&lo\r%Ca"sM.(#"sDg\0&-iP)5fRXPiT#6iR"MP88,UYRNr&IO9?-/Yu`8A)/&jJC>SG;4)>hX*53tbP%U"(o%j'\hR)deVh'HkN>6,rd"\r%[b6BC5:4+r0*e+dXnhQ(SM:.d1kUQ!0]4XF+b_D^G1YXcQutDK\iJ^@8^7U>iAE6f-(-:%.:@gmUeeL2G*Yci,rPMIp()-M#[j@.\r%0U*-H^_tpp'UcWf^%YA1q3EeN:d1d(o%DFg#ZPP!)A7b;LIE2,;Ql,#rTrb6@Xo2EP'el^5TjT/,RRN7a0i`Ss(&KV-\`k/N^k<k\r%`5Y"sO3>Y&R[>*?c-tN>-WSi<.G\>qo#dW1g/er.CnctPFjcmQcE(eb:_H3"YSZ`.52t*&ekJO"cC>cQ^opoPFqhpd+@n<p<5T8m\r%&5Epm%.9q[0X,L@M,f4Z!3Z\4"<iUi5u9iYqVHH6'Z?-SjTD'28$5E9rF__#r@Z-oTB@+&XJ*BYbTgarrjMf"CH3]K<is4c;S#\L\r%gpnESDL]&5jjEZPVISoI;]=`F?hV:A+%Z/,h`MQV?!Aa6a<'^4eV2=!QgjOW3-2A1B@\jH+8<V(AWOQcq$<U=Bl>5<J1\G._bqWR\r%Iog^jZ3TR^#,a_2^F;VF=OhYl!O`tQ\.A\Ln4#mF2<"U?.:f@gS*]r@qI7'1IBh/$,tSRpI(3\tS?Y>rLJ.?Var_a\rd:'5G1PQ9\r%KE+u@ZJJhRO%LS[`+ANEF4j5%0(lQ#b8"Cm)6(I&&$'UI5N@GrY@=P'^$`ZViT#Vrqt^GP>LZ\MTr/9joZAkSXR0?n'b\qOG0GgV\r%@=7K4MMofR[76SApIhp\=@qZQGn7?a1\_R(-pHfD%P,;Xpojorc*A+7SGf)n+8C*lBH7Hgj(%"1TJI?!`^d`)2Mt;F/hA\?7a)<F\r%KSn)cO7ZVCaqRNsH)-dp?CL`fIM,<!2YJB;B9Hg)Sddo2&$CgEa[HqLP0>>b]RpqEa[N=.%:(DPEnQ$pHf%#i,cq@ugoV>QK1).n\r%6GJ4_"tBOLS$5CT@94G!c`IL!angsjAroR>+KU`Zc6/6k*9=kjSO"Go+9<R=D$J+&Xt?#,,5"0[#s3\o8>HP;kTc"V5pDR]*_LL`\r%)'kT1R$*[W\h8SIO@WhGcP70TK+oorOKBF^'%9%J`1r.12*"aT@rcFe)QHhgeN()PHt&5[f0abN0S^Lp/!,SW%$D!b/M\[)9$.f*\r%K1).nZ9@[bAru^\-eXQ'r_=.'/c9cXmS;4T&r"MJoW"Y?,$FRM3ujfg\scdMinFuT#feOM_acb1<m^Whh!i_UHUUZ1]Q[49L/#R\\r%Y@/H.U%-DjX&SCt*cq4lm(K]HP,+-\R7AMC&'sfCO%:6TK%]qDP1hqFEc<LTRE+$'TF=j>E+Z_1oOOI$O[S#UcK&CSWJ&+7fH1b_\r%IRG2?dYXWK`fI(97sK_"21@q65!ml?]s.;cCB9iL()\[IpecH(gW4cM-B67HeLX9/5-fCj"cOO#LQ>9.A<%br;u;\2omd;tD#B)M\r%Hj%d0Yjit'n<%5BB,a&B`&G.2\l"/S@D98tgP#1^pu\N,NAb#K7n\EiO#1+afXlr!>REto_&N42,8XXq'`OsV4$?cS\^'W!0O+s7\r%<q)*TKM/#&)?ObnY5H\Abmc=2`+X4KWJMH-D2qZ?BZ$[Z=jI\Sc-\Sl*A5<l2FlXNGdnGDg)N7/d=t<QBITl3,7U!V[gu5FWlHp1\r%ml.;/:6C?CIt<hm-T#'8?U*Ht)-7B&nleUVQ1e-o@YZ159"gbfEmWL>@E:HE5KhEp6,TPeSkBg+;h(2'5-9l9RE+,l:$p0%KmDN7\r%2-c%/LnoJ8FK<(qXZDbLNU1mahXhB'd@Z:0=Oqh(r@HSuN&4e^FqI+[/nO;a+lQ>uCE&l&pZZ@Jl"@h+io4pV[DBmd/9,h,2jX76\r%gPDufAnLP148<`\n>F</UANu5g?gZA=Km5jCUX]#[#DAkkd%)$Etu@F`L8Z<[+P1UC%Q>m@Y+=:3`SNY$Glms5Van!Tmf45>o=O8\r%Ca]SF>:;#fXf%bcWC=<.m`R;<8h%:<b2,oPWsnAIVWYqmK<gR\i7X.mBV%b5Q>Q0pp*U4ORX<=(/jq!gi$]>JlnBdQ`/ISk*JHc/\r%+H9:4s&h$cO5:U]]Tq3&Z"bQ%DAq`(hnJL<\,AP<J!j@nkduWiV4oFWK53&NP`"`S"@flQ%OfFr#Wo`:7]E>H6C/I_N)J?hr!M+S\r%BXKN0B%JZJWidDb*P>p'lV;IcE/l-/UTjB)M_C.`_KgOg`>:S_4%O/DY;N$-:.nGCGO5fViSr%p?Sl=ps/Z;=DJ*TMDfsTJmf"]B\r%FELOHrn>nc[?otlqU;mAXN_A.C1;)_JQ'*QZ?Gg8NW0a,[SF.'s4U'Scb9SU*k'Vjn(*l[(XqAW5uhOm=<B=CrbcK@a.8@_XhJj6\r%V6<RTSr/"Se4Wcj!t(b0K_>dg?d(\Xl$/lrkXQok`RFsh.,VYiqtBn6#i$Hm'Do]6rT[`YCLo]<d@ouj?:ZV[T^lnKK1:"t'A<P8\r%%p>0d'ZtdDWmm\njn'TTY5/+o@fJ]#%'F^;%BZ*1hnA1Hfs0t<)B>]S#-Zkti,*G[W2/97Z(GD9GjXUndf-p;\`;)&qThi2BTfZ=\r%s8%#<4#eG.F^0iK`hWFo61pT<6ZdeaeX"Jje&H%/>@$(/hCWSnZhB`mQ/_7kIt(%QW<p-;qb,d@U>B;kh-Yc%`;'n,kl-a-ro<5s\r%Tm+q5>$ugdmc=0RPN`"o5EO'@asDdI*bp2h50_eg_J:ne4BGp?M6q%MhA&PRBa'rrpK(p<ns<b"Kh%4riKLM`qFeW3VM+,Qp6Q2@\r%6^B!;nGLJ!U86oCJmghi]\VYCVC);l[r_kI8YW^%Q-%##>12;;Noj4bXX1lWm*[iK"BaO'g!Sta8rU>i=CD?2)pjl<k+I8@l"jI/\r%897*^*-f)n;qt3tig68PD5FVH7#bt;cBnUE?#4E\H3)A#5<#pDPC,[,\Tm<L*I#EFj2k^OFM]cg_q2"!3^@WIZ[sAHZ\(^M7JM6m\r%XgtSDZfCUKIf@6UVU2)E?Im;rK?5uE5Su9W:5OaTWVg3XAj/sN<ZdkuD$oL&F$/gM^@gP-F%5Z*hu@H)CfU5&RrH6'Q8;V%+5M&(\r%ILXgb\NX3c?rd.hfQ96r-G<ign[J>SC4s"4:Y9?aiNfeX6?QA5\9p<!2g7<0d$<7!D99I;Sf4_cIgg]sn:Ngm+,:OaRs1rG![5tA\r%k3L:bQ,+&#Y@&BNfhAknS%C2WD+?>oH;1KVeA1b#PH.WG?"n1_S5*=='5&P<=5\pBEHcNqc*tHC$1kp&`u>7&c+@jSQG,8T;,V>r\r%foJJ(GiX`NckS'5oM'C"Y"5iI=RoIrE45qHe,&fV^o7r#SQ:_7YkDtmGp.<KGggC*1#@$G+C@13^O-(qKnshSIuH<[56Yuf./eqG\r%$3S<&QTWBP:@!u2Q=M`7[/OX<_uM>r8Z/Co]]#Z`(\#J4dqJo+7KTC7r^T$p7NK.71D5/Lat^XQ5+S!J#@9YVXZsh[kjQ-&%CHM)\r%Ml/Y4r`&Id3X>F6F%XKs0Yrg?$SN&fa5Ynr!U6uj(iPpR(-J-G[8tO>nkO6<I81mpP+#)aoVlq<^RJ@MH`nDJ_#0I<1-SC:K;hT3\r%E[RO4620"Oc.gR@Q:PAiON*Zrk?Vh%Q?U"Im_L#9,dY-tVE@ES>Mahkn`FNc1Jc_pc&XHIet;&`G8(4Ve,$D`_5e]1aQLn?Q51&-\r%R+A]%D9JR5]oWiBQqg:aH'`%*bj(36a3m1ee'R?drn4Y4O1[0;(?5i$dqSceBoVbWd-7q:-uiA07&8<.UVn1kktpWOd'T>%dmBeu\r%R42aa3..eA50-A@F8.4Iq!j"PRe2e3iBo,S+,A1%+UF#K-d`mOiQ'3ta)H2*jRBEPpqUZ>jmZQYCl,uh6TmosnBF*GiUGn,H*<t3\r%j19Fk.#/>*<!E[OSf.mYiFDQ);96b/n`+.hRqV^ZE34g_4Ah@e6ZTF3r4!Gu_oM&16dIrkCG(QY%_ABNY.66X3V6UIY.<C((Pe':\r%_?V)3apjTg^/&WXn%K8fU%]?K3Ac\UTq;hf(^95VTcR57P\/U)Nm01W^B-nFU&+HcPoU2,>Dn!4QQ9\L8NPUWNV"RKqhHXe/8Uf&\r%G^gIg"eE6+TFZ(t2p^:g<JS_$g:>^1W!ec)EYk5b<&Ss:M`+ad7+1VPDfHj2/M?4!d%u-:A]eK+KI5%E1ss(0<p(V>7TTmClcm/l\r%_QK'8Z[TKCX#ZqQ\k9p6]c_P%@`;g_.HidCOM]l%g%X(Lqq7RT,3ZKUV$P!J/UIjf?Tt%QRe_U092#)03J/qZ)t0,;1=qdNhOA1X\r%dRTWb$i7]pm5"<nh_i`_1lG!!D!NJqO"nq;@9LLYec'/g!W=R>O6k?CU@kjA-b_hF*-LPggs^R\CZgW:J7E/4LNC8a>R8!o(WHKR\r%*\oR:I!=M&23`&,QgK=P)bNiPUHRhM)""#@)".40B5J1LN:n7$nr^lp,^K"gHM4*>8FksX]Y]I8894!Z_`sS]4:iKojS>[=()%XK\r%jO#@#/C*IVH;(>!?(mq?)O_<\fK[A5eap!6NsV9?JXSeQY+_c%'H`Ftd3iN12etZV0MXUDfu9[^3'#s!l(p[DP&,Q@mj^_hP%<d?\r%o8NhJ/S!n9'9HM?g*)+)dATs+m-=o%Y$]pf8=V([oS)_=UfJ%k_l$]:YZ+6G<E/!`^.]58rZ8'bX[5o8qE7<s.LuW2XTFO*SpG[o\r%Y(Erm+_>XU;*0EqVL#'Jd/Q(0+/n@012mt+LM'npq6;mOf.*jloGeAl'n'E4V,bgHD)JS*)&a!p?)7s(T3_4l,pWZ?#&:'@\d;OD\r%XnOdCgY$R.Ink%"fh05O0I92hOH^)QY<oW(8ZBLo9Y]`6>%PMO-TV(OOa6DW&mqS;#,V*1iN:bW?ekqYhO//brI^fVGB!KdhE/&J\r%%IUjl]QZ7A3hg%+bB"E_YRl9KYi>6_$]4W7JHn@u3J#_-#CS=VGpU=SB0?&W8TTjI4*q4()3,NKHRHq05RK"\-*$^"EV:u[pC:JW\r%X/q?,HcMJ8)Us*=?A7Y45+L27FP]([o.U+rrPC=D'$>PKQuGUdhK]B^&UEhaB-`j/Ku86bZ$EfFHLG+]+u8U-=tM?#>o<#N(pl>=\r%k>-(_>%W^B:=6aOO7t:);sClBcS%j8.^!q;96J,f>YpDA,hM^#ZM"o<K$F*C!0"t:GjijjFRl@BKYI-jqq9Be:"J?h_]]D$OaS'#\r%GjgUW'&n]mmiB]`*M\7)Fg:ZN]5DF1??[4-X2DM(8GD8.GTj_DfV*&in"TF1@1Ks/^5L9`LTV"p)K$D\SWf]cSbEWL:n*;KZ/j*j\r%"<qh=P*Jr6=gS2?f4-GMg0t.*Cqj#\0QG+h\CGd_$knP0rId*D$.Nb[=<ot`2SrGHNEH,MZPl#-G)qGGE'rM":^DNV4Ka<j66YRL\r%*_QRrIepsj"/6>PR1$HoXI[S@r$V]<.a&1Rp3oqP'EVr&%bPs?6I\X-@=rF'Tb,RB?+:"*#MT_j70=cd"1B3]Kj^f6M/irdb#fn_\r%/NU3Y/hhE?1V_V'%tt":6Oqal5h*4fF2>:PUbHl*[KH(3,^D+\q^`VNLEO^O]XR_uFE;e$.f6g&]$*^=G]-/C*WjYdl+DI)8Zf1>\r%DRE1gC--dW]j=Mg^\<YL%+.P`A6mH^AFC&$Z9i#2LE>Y;H<r_dmIAmE8V!SeL]GPgU33fr;\SiD(,L%ONX*l<pCYM%ZBZ"YI7Doe\r%p.!=PJ0Z#'gQde>F)b:u(aJ?4\`nNQiA%VZPT/s;MMdP(YIPI\/VT3!@"E2Kcn@[pA;q/RmGgqm>tC_O3Kb4^%osY<oIc/d>r\tH\r%5H?$N@]";GB6E.to1nW@:YqbFc_a]/:#6`a0QaE@"PZDi(_VjGZNu>K@b^B_$=0\<M?U;k3?lGN/YE4Pg,(a[QOm>S,o4S>+GpHZ\r%VKW\AC6]&qi/H;H8J\F.K(:P2A(r8k>/_PQn@ZY)^$:*HpM*C=`)C/cA7H@G[<8F4*)dafZ.kqd:C.4<aDM*X]t[T.H.i9kF!f*d\r%A*k`OdjdIUV=P%3.Q<RWOV[Bqo'R&pB.VE[;61,05ZK(-b&NJ+6-:C56<P!1K_.Y?8VPK^dBc([n%,R=.tb]$E:(*2bg'BZja%*\\r%c$g#=ECA7FJ2g7_,$go/mPf\e%ClOQ<AedIh,[b#Y9dbAO#</)UU#[J#s-+^4lthb+cH""W\/N28t!H'JR+h:A-'I%L-8dcZYT:n\r%d$ecp2lmt>T.Ie8gVC0cB!OZVQCMe3`6qA&S#`[Mh1K8^$h/3@,ak8U^s<aG8M4>T!'aQ#7;NX3<Cf^cdi19g!rQ:([rXNJ-Y@q@\r%6/RBc/ATRHYaLT#F$"bS!FQH/Op1Wk!g&ioE,Ojt_1!UhVKR(EY_]h15HXup#@:LN%uo'g2N>bKg<j2sk1gG-XeFp$!p>FF9]PpZ\r%k)'LAj0;B?XCG,(n_!NHd=$ouNQ2f";M8aHp,/*N>h(NB4T=\hY.5Q"Y(2cd/7re_IP%In-J&^/I^lcT%h[NtW?$@6Mj`>)YMZCD\r%H!JWrZhG8q/M(,"k+B[%TF]aRP4`iB"r+Njlc9QY?jHQ](?,McG4S7#FLugJ(]Y:'i4^h[O%=g0HrcB6Bhe6lT0,>EJ."!&'A<VL\r%lqf2u8JX:k6\Pn=`b5W:?@WD9^u6Bq_.@rtG'($pTTL8[^lH-4$6%Tk%d]S775-@K1U)K]fI1^lSoW]9@Ua?1Sq.p7kDoV0m2=PB\r%)EA.0[V&u<IpRfgZ9@rmOnC7DQgJKkl-q'=\89L,Nj5A#N6@f`T!]DSfq-q9p66c:AU=W)i(f:4Qd%je%Yr4s-WTcF_=0K4*gc9i\r%k]"Nc^h%jB:J$QLQgJKM@+(0^>dgOZJA+Yj\Ep#<@)ni0/e"*60t$&0GO`1ZcbKbsgEOFEHNnYTZA8RKm2=PB='sb(%eWDYU;:CG\r%I4AAhG,PL)ORk)@A;<4M"2nn^,<OD+*V<RSNU0IHG!N`1JBRWplpu.B\84r>99LO9AUBkLGii9o/pj9./gN&2K,1KM$2V\@a_kj%\r%Di]-J[RV+kpBttEV\TK'm:g<DAK`+]m:g;Q^'i>uCemu&P(Vf#Y:e0g12NYV/ZteDpTXcqh.lb'F__dS88%Xk#G%"Tp_R-0f.?oS\r%qVD/L4Zp$hOIOu"T)75I\a,l[hE82P$HiV.kUP_DS\CaueO^bF7O>&2/Q^g?j0@,&VZTMNX`X+UZ$:D[O0'`u47IX3=TP]jXiG]+\r%h8u^)qKiR\DhcVRWX7^jd!LZF'CHs9\'IJEDhDGc,q\=@ia!I">jJNRdd`Cd/6,8#V[n+j>R"*@L=p:7F+9R?TtbLTOC^XH?`f+"\r%hP=#rG":aL>nrjXMt=2[B+9Xh.=T\/A.Q&-<U=e$HR#-*@hjK+>nL3("u@HlE?o!+$G%s(2qgm'4n]M9*("E!m>RZI/,T:3Z-uAE\r%Y.41IfEtpW1`3'qkPBea3,C_NY);E*<g?\Se/A+#:D@4ti6sTbJ"q`A4;ORA\S%D>oM_laeDg)6?OQ;\'#35L5L+5RKaJmrp!o`O\r%IloB@m^h$m*ILJA8f'$`n?+W])C>EJ'[gH!,@_VF&S=XIJCYl[5rb+=[?Wj<3^&2Cg-YISnd9\%I=j_M05OXk?-^.5^0>soBfV#^\r%m7bf*5K.+u_!HBGB#9sE00a!&q&bBr\u&KKHP]AHbIccMM>l@%2:Gbgq5M>m='i=VDQ9LlT*B]R2ATMC\Sj#_q6R/'Q?TUsau(=B\r%)g/+=E4!\>Q&X8TiQCPqj-LBr+':*82pc(G^2PBFpY9*Ta"k3B0s_0^V<\I<2]'r+EqB:Wn47.sio(N\Slkhe]BVa`4o\]c,\ndl\r%^1B"2C_jJM)njP=6)rNgm+poAZI=ru:';m)JQ?Y`Iss8tUVbZGRsK@l;H"6Al'B^SEe</*fEL*6.]J>%D'&@>8Rh?U,3a?f*n66Q\r%=mO8Sg.F/.gda4qqNhUTP66*\b`;PeoK:gp@"_;:eQB@g]$,FkH$9JugRX+!=ro55`,i/CR0AI@UmB$o8rRD.n3UiRF=6@:DH;@=\r%_!1e_YJKmVYMC\2S"#-*4ON:Lp*j;%4!-maL:Jg#C^#-J]?//!<5P.CYbiXSnMTLOJG$'^]!o_l]"ubR7e,a3p&<OoqrtMbq#";u\r%Y5a%op"^$)Q$X@A(dW?4eRuNrkppQ#[LI+d9fmRbh7prBp:["d9@&dtnVq:K??,f,8,&s)ZI9fnr-i3jDp_K=Kb<Qmj3Zc`)Lkb6\r%QS4b/UXUma2N-[:>4&J2oo6/hLL+$$.YpihHb\>c&^C:F^V@3J7C?W?^`sp3oq.p-8*@'_Y'=QWm!BiS$/"JY]>)bf3a,NFqrpgo\r%/\JH/O&AK6]Ps2IM,@]b=QoLJHgNV*'SkgJWAFC`.d:,QGIb5?4-R4AS(i2N[!)RVlf)OI,C=R'c"W0N[5F<>n%<6r+>\+XHr^qD\r%qZj1iZ7]FUAYe3sT"-(M?IY6[g,[7i8uobDlpH&_$@;DuCR(M;X[5o8d'44a<SU4.)QRpN(9LS-hpc]%$.C@LV'65t.\m[YXd4E>\r%jVmE_.@4'Y.2?cMAU(=D;C^nB#hCJfb_\,M8c;T@:SP6(8Z>7t[0fL)Gl*cb[0fL)i85_XX2&U<f:u<\d4JD"\<Y3#qRRVj1?EFJ\r%Mln5gfi8T[<Ck^Pk4e2n/S-hF+4@PhXaa]no1&#1H;TDTFq2RkYVHi]/83`GOprTZcQFBB;,@q8j2lZ^AdA6D?V%r)j`@9<9M&?6\r%7+1U5!eNOeeBL*.QeGV*1!P%i=t`[DC.Q+HVQ>`0H,[7[P/,C7cs6d%PQZG)Jg6b;HHj-fKHrK$_4Ii@V^1af'$r\Z9M,$VIKIto\r%qtuBU\*Jd.P/,",^eWsu`$;k=m3ADWS[e%86DK\bS>-Hhq640ajj%gGrTX<.fR$\5r^]2U=Kf#=2n?YF^U80h\IJPY#J??H;3ZXW\r%qgIe-DL&Ah>Z<``/Uj0<V`uh#WH,(63BbF*99m]W[uW$J4X/GeO^mJ`cm*RQLuL(q$+3,'^W"YHgAJ@Y>VC6J$p>fc%Zrc@&?JC?\r%g*-#YQt#7kZ$(r=5pT'Hc'7Y"k8m3;Z-Vt9lE1:2,-U/Z]^?u/6XG4^Ghked?'9$g/i]u@mEiEp_Sjb(*?p,[&M[IACZbS&7+*<Z\r%0#AT88DQ^4?'&DbdTpY%#-.?V]/8>d@c80T)6TsGTPeth-*ZfX;$*,%B6]RiYjPuf&EuSZ;7c(2="0<lM?;%(ndI_8Y"k+3:F`q-\r%P#]QpLu&kh[YNAVOqur(-j,U7jPM$<C(Aq2EC,#n0=0/^aRKZRbr(:KPs<2!M9R2^6n>'C4/SsfIIq?G%CMJL7aX;aj_bTK22>RX\r%4A^B\X#VF/D%CVDLOaWbclV1Kek"%/M&A,.Bb,2@LObt%+/U"OLTtUW[.emtW@)UZ>$!f/40?G2o.fL!Yf`E<l>dGU-`eXhi!mEi\r%qegC2"LY<KXA7N*#8\lWq4"t.W]o5I]/Suod-90*^2F+89E/qg^!$.20<(CGrRtO,i:c[6WNp_DGBkfRT&+f/"Iu,GoAJ;7oB(aH\r%k!<(5>Bb'Ko-@pdhOO$!s*/+GK5tW[)@^W\RYs3m;KOh1_6)ra+#G6U&(2?n8:,fU]uM^*c5s[nlH9>)SAdoK02ShaLbF5U&k%-#\r%dL4h$r;/-u`L#b__c%G(q!ps/ZmJ;_2701r<3Qsj09>agU(Lb(Z5Jlq"QIU'UZh0h:e`TtC[.K-$e4fXBR/R\H?Sf^0B4qh@4;%Q\r%#0nl"AnTeZ(6<<Lqb*HiXL(NQTtk^a2SZ1smcW-$8o$[$N5`NFLT=s6mHYFBR)YEu#%.63#Xqa1*Ijd780YGU"qcmK[X'I"N<(AJ\r%C"ChG*VE#Tp9ja*^?#"@<M4P9;,X7h'Zmh>n)ScW?Jm&kUfj_!]*Dbgic]Cg\[QXpNW-1A"dFf-n(dN$AgT`&XE2]pRTZG]ONp"=\r%Ba/5:l0]oPr/Ynk$>-Am_>gH4;KuMA'`="Q,mC?G0_c`48db:gKYd\e;c8c0&H;DGeRI\t_eCb.r^TEWTpf=.r/Za7"'m>ar^Uhs\r%R]3SZi.'7sa%e6&!<8ggs/\V&0)4>Ck9^N77n*G\WNm`+Ird1D'E&/="2`uGe/DO($3*XZd!t8T/uk-;_Z-P9!NB.?n38E!:S2qK\r%"TP54U(2(%+G'fs35p*Ipb=T9q@?J8Ku*efGUurKKu*d)V(dgYs&%0nqYN\mr/Za7e#RISn3?3%.LGQp$$[ruiI=i!+$>h*i."_u\r%T@HLI!WSphs!1_ir/Za7"0.)0p`C7LB0*VX_#L@s5GXF\_>fZToUl->(Bjcu+AmfBs4QVN7cs<NgpfT8%XSHRdOAA?MCV?`2GBDa\r%U03!lXod(V'Gh-2BorC$>"gUXcmAeY?3O[Oi7snfJ"A7Q,7!raqWHPcdL1GN&Vr*$oRc@;OnbsHLbDX-Y+EGS,/0q#ocG`#b0#1-\r%Zol;M.aT'&s.CQeJArI:"p1O.:Q6G%kk6G$!<M@&a%QiaemCZKLe<6OKb7KsKIX3MD%R(ZZi]9Z9+%(DlfGp?<+*06_Pr"s.BkK9\r%<H\OXlS%Jk7\midW7*Tk,n[-kIB)IX=+l?'.7%gMDa-24d%aK03nl#*'pu,<?r!5p^e0*>63='X\mQ#gm39Aeo$@PP6V^/V\(JJF\r%2]mc'*&k&Yf=/c2!KS"V$X^Ap%U.^[f%!_nT<YDk[obkeX=)L4IGF(5C&_*3.Brj4e_VGmES49%^F%D>3_S_8-F(Z\OCjXqk(lE>\r%7d-hF1M1d[i-]GnWJ>\/^8i#ERR,I?'pmaBAoPbCF4lTb4B#Y7YmNZ"`]=8Man3lF\?&q,L:#_B:<SVL.i3UM^,`D_q,=LE7uHTL\r%JeC<F6(1VTRRWH/Vb*!h9(6-Kd\MP/jj*+W8@!7j3T!KJ(S6m"\NDDa^ACTkXB^0Wd+?/_+=l&ah)&IDd1,`@Vp\F@KZ_G+-^@^8\r%J`G$LbDe,)fAse;CP\28J5VMF%itE="fO#Mc3U3!$C[4f/2]482]5b!Y.Y'U^W"0)jW]\#V<(15Q"tWH*?,hmAE=_.!t1quAHPr?\r%PIB0ss4QC=B&MrE.U<m`9':rAL.^^s5aaLp-/YfZ)Ar.iG#g5/Ys;>Qk,d@MY=8Q(4I*TcC:5^$<\>ASF?ECZ^.0Gi.dHuVn,(@q\r%gA*o_0kBC?kJ^':N@l^tmUTa.EGAOWCPjpRXBbD1"N$%o@`c<[.L_N2603A)9<#Uq=Rs)V+M$Z;-gSZ=k5lSP.a#9gSs(@oN8'X@\r%W5e"t:ma&0=;.65Y:k-t'5O<Up*p3jFCIsdP2n<b:99:I\Aq*SZ7RiZq-)uESX(mS.Y[(/;D6D:8=5s1aACn6,D#HL9T[3cdT8XG\r%Hlo1p`=qUV&F1$iZca<R7!<bL"?WH\)nqc#)!_<OI3F66(s6rfif(5nJi0MQF#6<fl=AoD'iKFA&I3_7=PdG`jPj8h.=A?56`^s6\r%.mjM&0uQ,tG=B&pSJK1*Ti\L)N<aIOZ23[S^":L%gT[j"*tMahpbaXB%fh&OE$l[@'@OU)IT;I\3bs?NaB?mP?Z%7I!2'U%Gaq?`\r%X+s.9YDS2//)OC#_4fPD$#lmIa%SIi=pTs\C,`RW5p,m3#tk-fXR'BWC%:k]2UX^O.S&K^ECA7FTO[))6t5-hquh>jXZR'Ud=;IW\r%kZ;'aeB;!5b=2T.h\')OPF_HD1V0>QI'TRd,dQqf5+0)GWl<94]Tt\)aL#=GqIn#dZ1Il(8JYd?qjmN]>5d!tIIF>@=13:dP&@W0\r%E-_W&-+M;7:lfn\&jE2$KpFXiO<fN&R73J[U.QTaj]N^\R\>EEW\2B@k']VqIf?hf-Z%!ZN^;1"PfJ>7&TcmAP=&"Fc-69;eWZdh\r%+R$QCT*/Vo"+oE>:BDP#WEbWPo8aT2%`mp:HG1o5&'a!ck".?@Kf\h8d(nJRj[2B_e\=j)\^8\B=bmU5hhCcBm#3Vekn!ua,R]iA\r%_Kcr(+.BqP9bQMSo66mb@B%r10A2$pY\,]R6h>Am%BodFqW3*A$RSFLBV!>bs"!`b[[)2$3Gp:Flt_oa?eWlNWN52haZT9jq3/jM\r%%`I5O)(b"8N([fSm!\-0m1BH1s"`HV4P#6mE)YqfalB`QP)cI;a,D6@aQ&qB-7u'DZ*EO>O*C<sFL1_rX#p=AEHkfW3]`tUj640p\r%Z,`UaNs"Ff>`KV-o:Y/a;R]glGoV%b3B_$%4;u2eGN0RAj35I^Nf6)\Sk=o(*Z]MGpQ5pYG]`"dI?oY,reH""#O5j7q&_?PEO1iG\r%2P&Ek4HB0#BFI"3jDda,P>:F.pg^Q76Di6.PK.+>'VG/BiusK$4XN#UM+A\C2f_lS:LY[:g#7-945HB$/"/TGeUIl6^\a)b?QpVR\r%>ApbPjLD=*rT[p5n2j-iT9AspJirIlIYrkB%fLefM,4-3EDJ?J^r3-]=\1'OVGeeP`$[Y8#sBqn';+XWLMiP%ACKDP'W2m8m_Y$[\r%f?E@"Uo7)cKYWWf]5UI.[!lBbJ,D9[E>SD+AGeE!gel0)U@@4C?&ZB<l*S+uEQCccO\Y5'+1L)[<]Y(3pi1BS-!64a'gJk%,R8i^\r%')]8e)$pt?bCC[)=$OX9;3GqQ#kn+"!:i\Mj*IkA3:XBn5AjH\2Lmn&r4'kY$Z)nSl?6#Bh*UYlR&[E)G_m"s^-NcF@eTGK_N4`+\r%Aj7lKk5L_GoY9`?J_<h.n`,P5T>][._du';il@&Q^'u3G"@!AKBX,bn&q8V.`ti=!,iH]hf`N@X"@#XW@MO_A#:?5S5TU5\*7@Jc\r%!:i\Mj,WDVQjk?2RQ:-s`,$hVdL9Aq1o$p-r4"#!!9B:#a,QL2hg)6kpi1^W4Oa?G"+K$uB87@t@Mk^m.01RrW#3Sdrt-hpYTH9n\r%a5ON&1%<-.+u$LH#p>9357UAPTZns0e"N>Lbg]u-L`_DJ]KinmVs3^0;tDpgimff?m>q]?DL(2cD22A%%Z0!P'EW_2anW76gCCbf\r%LHb'HJabbJqnW_VXG&(R00sE0>c'k[%VRrb;Rpsc3N)8+bB+"IIo&Nd]4k"&_></l"lRGKG6q_?jM[+3lR%_\O:+9:^VWBi*tS*F\r%ZJrp0;oK%cNs%[BA_[U2O%XM\,I6=L0lPhR+HHXirdU;T2hrJFFgCIXPSj>.fr\T-&dsO<7nPmtlMY%/q=9$JEDaAg07PMQVZL*^\r%JVLLo4IccN>C9!W@Q5+6hi^a7&AtK_Eu$s8$M)1+bM4DO]_&7#5$7Nbo)Wp$893O8Sj9pPS_7N<DOa&Vh2).HNZ,s2EO.%\NuGcY\r%=3:P@j4:B@+)9U.9nOT=d//M$W=W21j4Q@HUk0+SJPKrpJ[:7?W=Xla^s>Z<d`%V))R8f>GMY=nK)$@-P0D:I$]V*Hk`?.&L^H8*\r%9SQLPm$:br@NJDj&5cjanMs.ZF5`ZSDO9)E@d3C5+k.a??J_hA""lBm/21s#kYp_tN82Vi8-0bi?mI0iMVCSG`mZB"&#p$nX.l_\\r%QBj5LcYu2T-Al$C3$O2g]oJpc"+?O+RQNMjPt58hZD3UtS"2rU*g(P,oLAO9,)J^-RD!r"<RaeBJM\jbT6\(p)M#?Gr^W[g%LJA1\r%r`!2&VO$ThAl$r'1ptK2FCoYCQMsaNr]@'/XJrf2Ah%2a5]ckhn^Kf8TK-(PbNL4+$$KckC*=nKSZ9ljeC*T&I&X^T9eGSALLt6O\r%Cha",1b+fGh:.&UbJg)e=;pllQ/q.2)Vf$R+e)[)<3g$qr<^9fYa\gn$T\W\L>CA--b5s[C"QF_'Hp,e<ecbW*D=:NL1l9tN29rA\r%[EuOK4&qW^W<I^Tn4f$69eA!dB],a'FP`d%BfN`!RI0n4<qbtI0GE:AK#_[*p_CnY(Hdt-ZthEG5oc[i%Fdi>m0NnSakp;"A%g+:\r%c]T&f2^nX+;/W_9G0[H76h^oO(PY1\Sg0Ep=iT<Pg!P,LW/6f6Y.dIs#h0=9ca%^af`H9up9UE)_%EUbYb*5`>_0HeQSl;L*.b[%\r%qcVJq(T!m,hl2'JRY.`'K3mO6-C4SU:NGi#)bT%s%8Qe1/Z!UIGYm+dFk\"^2j?Q<N_a!8[n!DBG`*Fa9C@!q@T:u1(Ab`,?Mb-Y\r%D*YS/e/<[@Q1TiMGIb5?04"#-ju2'Vm@>4Bd=:u9G,q[5ft4**Dd*b:"KIo)Wh$9"+$V95"gV:^<f4XJ\4<@P<9?7IIE%?'Um3R!\r%99-h1:FDlZU'r%`'##V=lG9DZ:+gPpqk05KAlp_qKs!U`OqV>cP@GF:pKfkDS/)T%H,"&'qtW79SG7/q/@TK30I4(H-ZDJ8PFONH\r%Q2;O]:2VX1W,XON=bJ7NmNa0/H"\Nu"m?qFcjBkVj$L@rUa.>e*%,u;(+)&@Q\1&/J>KTj2g]u?9gO(bSYMM3P0DAmWi:h>odtS%\r%l>lCIes\gAY8HPFj0u7I37/q?:6WC(:1t[.$#sF4E#L"<YL\@MR&lAaL+U86-\4(/33f:*rdNU</*kH/f(q^YW*sH.Y&foN(kK8S\r%MF>iQ/WP4uS^rkA8nr4XXe($aL$\"K?VkVm*]aFA`%^e-EnJ^pYPp[[qN**,+-Asc8<oiC?=.QJM>^$I,S6t\h@ucA:59sC"p;:)\r%-Ta(S'GoA,-1s4J%8NW/l@jR%"Rs92[nUa6m*;!!J;SU`,T;=rq^.=.0i*FhU,pss6"icP@U(qNs4Rf.+K4i3Wc:c70hp(m&6'3o\r%,R["+:dGY[U</(?d-?CMM::SXpX^2<,hJah1Xpl?o@GWs4Bt7#kR[]mI!;jm)q?u>X(l93]pVkQQ=]]kr%gJho\.RYCRpKbpJ5Lb\r%92#&!aW=R)('pPnLD'WgjONt?NU1B_q8aVJ!Fa(kli"[II,#Nn=n\KqQ6:S1#7DV]CF;f@O/!)e2&tFg_Ip:p0Yg_Pfn>F\S+6a8\r%8od2U':'"B._lgje:e3-;$GUheINpQ\7CZQ^)0T<\GBZs@G4E_9sar0W4E6]I$eH*a^gLgboAALGREu)H_G4fW07\5q?B'!8Ja!`\r%<.HRa8g!_Im]V(A[1B@\XQh1CDZ875iTc7f7N(9rG*VL!*ud$ig^/_*C[oH1\flED5F*Q4rCfEh7KV6E#b/b'!f5hUG4HO#S@\Eu\r%?e45Aimp5aJ\lbQ*tQX6o+?g555-Ppj?72HFfgK7cdiT+/O=5n&Kgdn&!@nN`lGlA!8i#l(nZ6$W@0sZe'!`]JOO7)._]Sq9EN17\r%,?F%M[8(mkDa2"&:!](aa[HqL<f`<oZf.-R<5A`V0k$6'._*]kT0?An+h=P'$gF!SP,geLS&03j5:b@,X;<jK7%-A-ho.=&UjV&G\r%fk6Cg=55:NlLrQHeb:[ac6/5ZAR9e)1J";J,Y8b7K1).ndL#<d)5Pqng'BKe7%-B(AC32(U^8<adi3:#Xq.A^-RO$k<OcLYd2<T[\r%K1)a$+Ibab%$DIE@??j]9[OP8K1&VE^q(+>K1).n1>RS6B96r1g<D6i*uMNK0P=8_bR0_'Z8okuJTJZ56Z`r$@WJ_8?0D\0l1Vro\r%V/$:WFHUKo5tuYd:$ASKm59ab1g0EZ:;]p=($\C'X[))0%WeC4ErA!gOt4!CSYh!>5>3]inK[>g&J1kXNuq@_8@;D9L2"/G<`KfG\r%h/0QBr*$t5;K-^sXAVd'R2kpbRtld#htYTn,Ee(blPK-edAWZgA]JR&>s*Rh*j=n4(9\,Ri-:i*IbuLr9R3J3oFGkUb3Z2e`7591\r%prKJ!7>r<cLQ>,9T9/RflL5CWiY48!6s\C%*cioL`j-qWW<]a9m,LSRZq<JWcp+*o>YI:Sdh4NeA.KbJ6a1/5*uW1-@`FJ-_aiYL\r%'fLM/*BmqUG(jDjR3]JVnKX`TF0>s4)SS6.0#V_.0RRrn`PIjDn0pdE/sQjglXL9g_U28KGT\bHC1^Ta*StZ)>o?eTP`[d7EOZ]8\r%&Rc]<1gCAH/gT*j/qm'dn]@qI[(/,(.N5\)mY?WQ>RK)PkdNr!/eqsKZY.47P4^@CD/LVL7#X$JOn0ebRp5@(W5>BMZkQ1u#n<6T\r%K<JM$hEA@"`FRUUKhLAXl--@>4bI9P5NV$:$K4kn%F"-glroV*i=)&F/:FL'oqACWIk=YepTofBntL*&gQ`Zi6g9nfX`O'QMnfh+\r%.]J>%NS;^14XEn6<6uj&qcP%=X%h4il*o,_"EWs<KMLXZ=LhbLb_>It6#&lbiDOijGa./bpkkPD"3f_%JbiLZ`>;7YPkBL14'K&<\r%YC(Nhm%Dk^9Kd8Vri0N;KCX7frk>SlQ0Xk,9D#.0,Q>G_fKHp"AHqT,`9s>^Ka57,&A*]I=<?tg_C;JGhjsl_a8A9S(MV5L5,l+`\r%0uBSjO]q*-(/M@tA+;j4&5nFK&UU)W5peer]n&`t9sp6aHQ:C0k^?dGrU1S(n`>m>OrRMM?$h`_8\)Qnq#%kcbB"H`4YCh^\@Z#D\r%4YA0KQ]&W!--8cZ/LUM/>["J75u>hW(u=$&$J>5KkRI*sc._3@6<W/IHX*f,(DTZ\Y!K0r;Xc(c#.:sC=bmnrZPhTc>qZ*t(Z+Q<\r%luMXj\;8::6'mMEa(6P8E-/XR[JoX`J"18f;qnLL00X)b/&g-4Ig+C#G>=??fA#!UdZ`h=BJrG.HJtA2oK]$\:so"7ql_b:4j2l_\r%QSM382=r8mPcW]r]VD*:W(>`,kL%&YI]80hNN@VNbh.VZC6#!'m`1;`o4fY$d=GK7$G-=#8.Y(u@4VcOb/2n8]fJ4,7VZs("7n`O\r%A^JM9qD?7"_04u8>ICXl0;$D?EHq`$^2Ct)0Obf[HE@_*.c/lGZ7Z>HM/!c;X?+B<'Z&r'n[)=OZ&@HW%jV$i0NJ[Qg!S&5LEtKA\r%qoJjJL^\;541`<I&/jOIWqh&H>PA'#F<8"R2U<D'U,`DaL7E(o!6m5r@ZJOFWH.T#Wptt<rPusRS&W9n!>fb]n@[tF!J_Rr'ImXL\r%+fZ7)4]d6RO@'A+DpO_9:lh_Yo-A#p:tS<Z/=q4Sq8_\[L!B-hP/#+L9Vdj*9EL\Wkh2lAR05F9:t<UbFMd5][)*r^F,<Zb:"Nb:\r%KP<1Z:.T,OY*^OLo?;Q[-BhO"HP:M'-52p!ga$9k8W#3)a;,6KN(&Zf`_o)82aHi\A:ja%W$iI*EJeL(5*B<H-Bj2s0peP+gP@^H\r%%cka2#qA12fhkWQj%_%sReXS"s#g`[6.4QX>8S64+o4j1L*:Z+"S\803ei'$?j-AAbdbQ4&QFb1e\dpUKj<[L#NK\-YjJQ'>qO*j\r%a]/$_(jDqd-IT^A.=AXRFLN^r/Pm4.O6mF6L<hK"QZZ$od42E7$"sl0`6Z\YZj;%,lb!LqO#LaRp=4g9S(Jh/r,?kbeo\CqfWRFZ\r%Al-$f3jVFC7n4%jI?c[*0e;kMknqWdP0=Y<CHUtE#1&\<)u3M"29OUi@I*$N]$6G*A6)d.*Mr?5F8iT@n$D8A^>%UoN^(##B,IG6\r%q=B$JQG_?dFN/:QR64cU`6q@s&mK*0Qgc7oU\&j,S#]#"rE/d9Sn+0u2k;P`RB7pNVps&DF(b/).UP)Fit[NpRVRaM,T>E-Y!1*E\r%Ti"AlcJ?B0AT2k;W^#<h'6e0u89m>$=RQ]O)mOLj\ID*E#J>@?9&7]gkIu(;\+\>W=Km&2MBk\9=HWenT*W9mmbNCuWIgHtNEP,$\r%/23fab4:9ZM2CA#j'd5:>00>@Nk$E$&[g-cgi.InM5[8n-aFKq(f<q;GlpX!257O-OU]D&2Q7T],&4).DjZ%d(/[^V@o8dJ/ts,R\r%<0AAVr@q^m[F>Xp8JW.?9AMFjA;6P?256C?#QJ"@XFd[hToU`UU=K^T15QHSR!^/fDtRM5oA.b&;-`qt:Iu'PBs+."V3#dS#(l-m\r%3L2V*QGOh\WN@/mK4U%@4^ZpeNg1!n(s9es+XSJ.R1o"fF9U'.DZJ:hU85)u=Vp;>8*h)WfO?%>.:OZg_n*/-Ufc.s/bSZceg"AK\r%-p[5@l$2De?@5.]7'3(;:M[+7G0lt4Oho=*@&c3!H/Tr^WBbAb=&`!a/J[K/.p,X\[8\OrhG]kIh>Gj4UM5l1kj?r1+X:_`hq,%Z\r%c,%uS^;h[X<Z#fg[8a%Dpr>L'3Oj[W,&4)P3GX<\&Q)2Db1S='!>2_=T"(@H`#hjgYBJ?,8IXWh5k2\)AOmX[",[UhI2KtJnb*r8\r%L@JP&FjcWh_9*muZO"E&aBaSd674K5N/r/Z3)G""M]`.]0=_q=#>_0+j1@neK^gdips;/^s'>G.HjhDe]E9fpNlE0[B2LKg@!l%T\r%70P7H`<X#M+^oa,hu^Sr*=Bg,+D^-\7%r%%.EW2bQ%F(K=BK;=@!iA25"Q4ij24GJ3!Y5e;!P_4ZiBRF(pfo&_>%iVJ-sWV\gqgA\r%&>mg"%gh:f7IcooD+8^t(`rj;&#b">MS-?O^2("mao2?eP)GsRk>1dO$B=G!4Ln)B'I]#NcF1p4E`<*f9b%K3k*cr^rd-\@CXn%U\r%Y-uTt`1?m;mGSd@rQUt4kcO]c!?\.VS\*A%b?]>*ICg0-1mbcWkQT$#'JL^nn-+_gUjZrIr($B#:O.cVUl"X3K@)0q2p(u"'8(\6\r%U!+F?]m4dT:KIkr@B<$R=')A1mAuB@C<ioFioXPYoG#KkRb>mb1P@'MVN\,F@m*)d*+&Fi6tQkU)Q^V)lW`:>lgh3hs&P\57Z$.I\r%ICVSZD:`7[*hAY[O-eK(:tuE1SnIM7R5?M1CHdF;En9L:b?^ZQ'l7$jI:UC8f(!jh`:UD&a[^AA$^^5%MUG[[%`9\t.J9:Cn.8p3\r%Ys:E>`R@Z3F%'4PE!HC_9(iaBPRSp1N\'I<,8U=WXQ&@RbZ4s`%lrE_I_eLb52hm6i_E'SSpq'3P%<kl_kAP0-#*+K9[Y<.C)KT8\r%P-%MN28?)S,eM"8P^nQfP&,Puh1M"[J^Z)$-&LA@((qD^chkaNV^0Xqm:'"W(=e^[;NbjE,-g(C6c6beH*K\-Knb9pR49DUP-@-$\r%Vc%&);B9JVqosj#?O%(88>D>%^(.:C!i(q&l_eLgm(K77[i\6;,,4N]h[4,!=%BMV.X?2;*:TE15CCVZC))n06&O!i>6bPC$;@t.\r%M-HV[,@po#S;u1u363>00]#)^H&2Igm'q_5`BtY,0iO%*`_$Ec0nNF4GXTn."Jmln#ud$/f]6#-<Mi3-4a),Oc*Nqo3W8<F=-`Va\r%GJL=Dr0aLS7XC!C!G<ntSZ*f2X,rR'3VP!uWt:N<5a(rN$KD2sXfW;0a&o=VY(BcX6;f;Q3bE/m=JE,"(/(_fDZtIUTJJo07U>Ao\r%K;FpZH`&r\Fn]0`hE0XF6oll`1b!'hLP6"3#ptC#pK_mt4+(>$j],.G*NWaGGnl>5%PrlC-\2>Gn$'+e).!s9]ec\s"2i:F]fWmZ\r%i:>`eB&CORn%a!U]'lBbhFTn*MGW.kFAhM.>B&BBDr-BFhJplVr/:1T,NVV'pFZl(N88hnf?$O4U@[5%nreD!.H.p`7Qoo)DMe,E\r%l0fGEI2AIKcCd%8JeXOB"]V"!m202XiA)Vak_1Y_hJk`EY3WQdbrjiF%$gh2L.:dko`14QL@6m%?G_rske),T:,bY%8m6:A)l]D)\r%T?Ni"%VIBka`c&ZbEpkoGL#5?1=m+phE)"S<P,NP&D.5VgO#7lmp.#ZhlbLT/tPo.SKutX]BHnO8A>Fd`*MH;e)1%EB<`<B*A&En\r%SG2GqiqmeH#H-R):M3CD?+=9b!=a:X2nfi(a-DYFm5gbePsu7C/1;HoP`0/>.WEDTo"*L"RFTWL]fOI$[)UtV)Lo,ql0@oJL[;mf\r%^=H#47Nn/*4RRjt'=W6`#\Np/B]pB;$3=8"FQhK0",XP4O$Z*5T)qA>'So)kI*5@;%@0=[P50sh/eeAWe:kPPSB\lAgubf7%7W`2\r%"?$(/=BWr^DNGs>OrUa[DVfBR8DN>t+m<\s+*!dB[gead]YnZ9hR4,K\BW>e^lCJm&`NZZVW1J-k3!o_qt_Xdb0B"KV8Y;d%C=8$\r%/]LN?k3!o7Sk:q]HZk_BW)o8SfMV-`Gh]Y*I0#Y4(_@C=g.Fr9T`=_Q`T1m;pVURaWor9AYn)-W/D\1][[1jZ4:\suY1l2]/21_Y\r%_@]A[PN7Ef,dOm<e]pX#)_L0\b+&I3N-f;K(i.dA8&0h:.SJ>^\Ub\LW[q9ljTb2P@-harRPU&7EQ1gC=gDT:&hZhcr`!QA^?X`b\r%iVOsfF@F%fF0VAuZXiGK=mR:%ABBSb>*ETATXk[hXlDXHK3&oIBcReL2j-k_.Uj`CCo&>te4k=AfJ[]JM:*kqCn%u-*%eT.-o;.$\r%qGQd67"K4(?(LV0+>MM,-RBlrC`CK=j+D3do*kQL2OLc^X&V^`O!KY7.\rNSmC8&]gBKiDZ!)j<G7b.i9p,To'mjnOr!krr-=PIO\r%3ODh,f\^[,OD@=<4I6`k]?T7]$e-Z%gBWN>%]sb7dc0(K?8T9R\uQs<h$-ZOlO#,@aW[\a169$gb.&r@W4]-C"1=0(=L*K_1F'V*\r%1&_L`Ur!8:V&aZQI1>LW<u^V\#%65md"-!2b[YP*Qb?Id:Abiart.iC1K\C&Kp$oR.VX/Cnq>EkW1FK`_+FgfaPB$@]k9\Xlo'`?\r%NpB4R%Ydr26=P&K'FKCB^u*ms2_m$h_!5dh_fZ<s[pe,Wpl'3U"o*E`Y]!)X$e1BN;1GeI0FQ^f!5E+/%%`/X!LQFmS&%JO$D=kq\r%@')bqIU*hj6F7(kWCSd/=b*+pJ=[QpZ2hYNO^rpH!'aQ#:,$3+$h/3@*:ki-A-%.^!2RdASD-'7g0j"LkaX0k\K+GJ!3F:OkB9DP\r%!_N1BNghQgs4BEZ[Dn?2$X\H;_LN'72RXlI*-'7N2OPoTcnnJ,s0$T;<cXI1,ur4So:>\5ccgJUCk^;D[F]lZ8oeNY7]<j<P'fMp\r%TA[7#P'jLc0aZg5NgBt"X"<D'h`WB.DMM3+/#qgDSKu&$N]gI6A-%-VBR>(ca9)9E!H=t.Op1Wk!]X%<jP3LO&Nuq*ea36[?2MYJ\r%mFL&&Bkf$N;sD#F3HV#Bb?@NMor%=>DunUH8SkLPQ2eb;*4I=@4&i]i>0$PcJShN&`';PUpg=)D\,\Q2Hl)2q;FYgjRA\PBOM,S7\r%jEtnI<5XC,$ZNocb^;-2,<OD+*H61Y)VLh%"Ti9KH.KDADulDW/0Z_$2mB'U;K1='JK7EC'fE9a*S=6Mi3Ib54(e4]3%d;W*S@Vu\r%9<l!ChnT^K:Q!2(qZ_3X<=1A52m@q[Qjd6.Y6RJ\N!R41qq>'d$!];>gGc>=2*ZM"k;41lQgGaEJI\jd>deQY-Rs\)PrKe(AEPci\r%CtZ]ZG<BL]*gc9[HoS_FP,&J7?U4aL"C/BR?jHFh`8e.O9`[]Da:<?#8!/GIp20`]e60&dCu<#<VIth-Abu[T/<qJ!QgGaE#tXsT\r%+5*>OWA).?!LM('</)CGTapFVS6j%Am&>OVbT[TUZ9oYb6!?t;a:<?##EleIi3Ib54,PKkQgJR'_1&Zm>deQf6g@YU0&,"-6IeL-\r%>]q@b^/4&0k:aik9s%Q4nf`#+^8;[EV![q1dC="";[Y$<)7XM?:Ar,[.i=W?CMEn9L'a4F".bge.ejrdBG'*PNKB@cep[42]Ci[[\r%d5Kn;p7k^'gNu)j`@Rf@]W-<?/huE=FJ+QBJt)&-?HsTCR'!OYb/\h3EF)iLj`m3n[J]pkj(#cKh6&&RTS7:Jp*>!1pmEidHMde.\r%T0Sp<"M?dVF62]drm#VSRGBepBW9^+o=8Y/rZQ[+^"1*=B?VWf\D2J'MrXJj_EL]_AcJ=+I2gO]b'pc`TM:.DfBqb+8SWYiK&Su\\r%[U8^1B7+M:/X`XIW)@@o^Fh-S=*)'WmaC%P$q/,T]!S_&$`#h243$TRpRHam,5#WOfN8aPhUjLP_kh6[7rQoWe8D;>];pk&PE\#Z\r%&7!ID%jt7ip?`9KV6*eifXr_Khpd&B+.BU8b?3u=dEjYt5Hu!RYLTuQrVPBP1DnA5B.,Pc7E4VB/%GG2G9t%@Z#e6&f#">2l`g\m\r%FYU*(f=,)TVi0J)HH^$jc^u.G1\:R_q<6bGPgsnr=9I1^.9!gfoF#"E-3'3/<0nMmo?_fAc.!5J'B8:cEdI,TjQA`JZ`_t^O'9&;\r%@s,$pHV)8eBBoGY:OH#\&gt*YqUjp&F)ogUZ(PHh2;^8KR?2g?A[hIW^LB@T.[7US(?47fpYFUsL75**3nqk8e&=ofh__c63jlP$\r%084VNgom:I`;>^B&,,EM]MOV-g%F;WHU=B><ZLf!`Q#h-=?hM:_-stMPru=#kq).8%EF`$K&Q)`iucM+'$\XDXrj1=l^L<9?9<bG\r%V+/TZRBa\W/f2m@nU,okKWZ6`MpI9c:n!kp3a_]nm_qqF3Dn/WUX>^rZle[DbG*?['1&sZI^d`g5>1@QF&SE@fG[i;NgA0p5Nj\]\r%5&Y%ga'1,#oEMX?-L-SV`6*Epqfo=3d9/]]I*mt'>8l12Phj$;.S.-6Zj:3S>pQVFqqqW7VHA,I>JD)1S!.Kt:#1d>dbd6FCAI^2\r%/$V!Yq8,UHo[EJ'.-]TiEXD^GV\`Zm5@O%/A+P*Up@cd$oC_b<h(b5S8e;sS;mg!8C7KWMgf2JdbZ5p#^eRd>I+Ol9".!A4K;\:i\r%aFaZk&]la*`)1p+OpaG>=`j#c>O/`r]%,"FTU4&>0UHi=D63&$I-p@gU,2=m/!B#Nfl?rJj'st:'/EsF`6t'mbujPFn.r=CAbTQa\r%)I,sMYf-hC<W1JU>&!S>b7+WE!kMO-iVBA:Cg+/?Rr=Hs)l5^pjlM39:@.b,Tr<,]+Q-mu$bI,7kkt;702keKp:ZOeXmu6G#G^,<\r%8;%MBfX1^'o(V(hOV_=SoR$"AHf;,OG&mQ:HnEPYE:^#qqg%aiQN,u)dUHD.lqK+Hn&Jq;a61.g6@8)%H:>Bs@UchRG<AW/[X<Q0\r%p&hUOmZ,7>F6/1+Q6fgeP$m-['CXba<[f#OP`!Kfaf\W+#P2[FP#?k&"e/OYl[<QeTN+NT"jWJ`X\qG2`aX_!<#e5O1p,d;VI$*n\r%W1p[,WIt84U0+Na;CZom_:0r?33E"t>(orU.)NA!8Z=,<BWVnm:-A05P`4t,Br+/U^dlj',c0MF8/7gu8CpfQY#S"b`QAi)X&Wog\r%nC+:884pkCi"i"dHED'&4h-cNDj^pDX2*-pFd*6ga^VXb\ob]NqW2aITV$YWkuao5lEjSP3\bCHV&Ci*1\8E8/jh-WG:3bhDFO^"\r%OutNkpm23/+J!m\[F@KY_jVE_2do<^nmuZ4]@lS<I8(QB4%bo,$?a94@04QPqGpImZ<Gd32`K?c\k\ek91qE#p5*'+7Ri!K*os%@\r%n1t^(4iU2fi+F<;De/%"1Je_Z)$u2C:J'JW,_/sI6qO>t.\4K>nRhOi_:O(_91e&S,_3@ZQ]a&I82.`upe("$]lsR_;Bd]I?iP@.\r%2%='Z\tjb(e+DKsT<AKjlZ@P_DP>n\1OG+`m/$u\8soVhAC2;FD,]b\k6a$,d+&XuQ1Jk_#;YDb2f`$#*%OqtT)IM?$NBl_IufDn\r%6NgJ_^IP)Jhr,Ug>DHne#+bM=T8V?GbhjXSm1<"ACUbDtCPQSt?c)Jl=?Ap<di5;WFC/3$ZZ_.<F*qde,1[6d?!@Zb?)2L3&[&`N\r%*?oT';n.F36oM<]92smu5E@in2aQNKqd2e?A*X[TWbC3W;I'Y)X&Koi:Nlfi[S>7Wp0:83Wnj1mSCHp9>QR-1*_J]]e6Jf\cl%bg\r%,@^$O!O"/PmM_-Z^;-HKo9BmmTBr,L#_PosgKG2k5A5<rVahN+3Zc-1lRZ2fEso2Ss#MbTfoV`eC(G;ALTG6<7V8V)P2dQ4U,Ie^\r%`rdM6q[m-$+]i_5.&(i7o6?n/@;aE.qUAd$bk;TLF3*X\n[F:`RR8dJ)6,j<eJuGD>MjT:ca(RA*)ak-1qPmbclCKK;R,<.>SW\8\r%V_F*NXJiCghVF,:^Pd76KN6TN<LA8E:KUoC^`,CslP!@]qq'\W.?khh*aC%-&(^\<Z+MQ8ekcCu2EZH%O,=8)1B66Ur=Po#50].!\r%?MNbKQ.)SH4![+?WqG502cei>eX6ZU,[nIpW\Y1a(;[S?Uq4@<`obO(ilj47K<o^Pr)JtA-u4%V*idr"&ThH\'-p#%^<>"2(!d#<\r%h9d@nT$>s#EikY_S@qM'RRZ!USAc'54S2oiLp%]m-'J&O;N$T/1\raK`KsAHiH7i,q!s^7hX6jen`>s@YhLBgI/1osQktr/^3n?:\r%Pdgkdj_K-m+!tIGMkO^6.F$8/?48D=?p[c1(O?sW)283U*b0ZH`pZ2&("IYm9DOn9)MV-hH20nS)X(hfcQ6`r=[?6XZj"#d7iR3J\r%"#)@"X=\jK@PBe6`DG6>+Vacaq6g?Q,9parbLc[7hEBa:9QGB7cFqlm(k(J?L3@WY>5%dYN;2s1.sq"JXqH,*6tljHI%cTlP%NnH\r%'Bh<_n2tZ;H^FqrSU5_\kZ;&4oo#;WT&7'p/Bsir']IgTQ=d#K2S*tU/^;Y[m$j/)cO8d'<0Si28MZ28p`FWN$L&@Hn3?3&Pf^<K\r%"TP5l8R]B1./4m,9$3[d&-W%1kHl'<rJ,,)EUZ1Bq@?jJEUZ1Bq@DdT_VfoCGG$rD/dVGHD6/"1\K\ojW9?IPB+YFL4#:!tIoQ%^\r%BOkQ@5:ZL?G--J7s/7e5eB-+sJ*<]RXH\CSs/5u"Li(#eIoQ2u+qjlF/OXU0ZVZ5XWAmnFFY8<hV5""V3`uU`O,CsZ0:X`k*u4`e\r%cFsU:s&%0nTO3Ags/>-G]QYM+r^VB7_5AQe#KH^Ao"tF*kW_KN#lgZos.ERJ%/racs*<io&`J4=oH2T\_VfoCoUd<?r^TEW5rC8'\r%r^U8K'NH:RDal3T2#(EurM9p^YX'g'/=sYi'O]U3a3LUtbZ;nr!BMR<ab1[S==PL&crO6P\GEL5J.;m)7V>+cSh9^i_KugLH+$#o\r%FaFX"XSD?X0D&P_i[\ODDD69?;+]aTp<V;XAPMiH]QmIS3!1AHId$ZrMCKJLLiIr_G.JUufXfVP!!2UJ1u9>G!Wf2;a'f^MUVH$,\r%5%13L-;Q)'!n1f4EmpF*iY>Sb>`pK=k#?ZjN(HrUNrHn5>=f0\fqB<UJN<Q7PJIAM0NV@.TglkOp;([7le)=qcV@FCk%m4k.p`iI\r%:XBucg*bkpR%qDmbs,'5qf(;k9*q*ic4r>ZpP7-u/oG8k9>>LV1:UnMj%ab3"2f,<B&RQ)D\$=5J8j:^*W<oJ4ble[\qXbJqBDlD\r%Jq!EiQI117Tc-D89H<k2JY>Vc7se3LL:c!s2Nus-g;lCYf;i()qkd(FRE3h#IltqNAih26RK`H855$mn\Bu1]]$f>5'/.W"Y(@oO\r%]-GQ72(Fs+L#&rK;d_TR2=qk*lP,_Wbn4\#N1-$d]\M"d3*EeZC`Ia2N-,JD1,D7g!u$rbCX2BA7.oLS'YO0CRo&'$%92@se"fMD\r%,u[t59Xu^nB'$VZ[S;$M\ZjO5f#(!un2\rn/e?hC3k&HZJQ]O4]e:``(V"Ds5RP6,>j1Y]e.hPV>aTcjABi7ShdU2$Y.Ui@r)?:W\r%7WPjOSuq-U>J++Lkdh$s>JXK9@4&uaai[%bbYH?HQ^%qaSk3+g]W>?a)R,ef/(_p<^hL@MZ>rO99]L!^OCnCD9taR?@pK7L+]Z)b\r%SkAGd]K^m8(N3\tc,e$2UL%n?/lWW,<kVX=\[UeK8(t-iqPA\mS7Gi%kFF=XQZ>LBnXu603[-:/2[=/WFT@jH6Y>F01Ir6iZ>ssJ\r%4ZZVk7TQ\O*i"scQ)ghlL:MWmo<qo=hsUubHaV9n\%",IWg[ID#%`2%AA',.\AK/=,Z\'4EQ:5?aInJfc(LH14CL%:=;.7@5nlN3\r%M)EZeeWpe&SQHPr^n2T1djZuuajjiVSWG!gFOXV)8Hlp_>SnJ<eI)f(8Dm0M=fClfek3na/]FL)#p$(&_+t#lZYO`cPKiD<"Zq]^\r%225KdL0,gAH>0<c-\b_NGeZddMHHF3aMCU[_cHlL4MldBcU3EoG#kg\6`cKG7LjTNLilVFaMCU[Ytb^5d94:\Slho=09VAk;56,8\r%B):^P>3>)ET`am>qEn"C]/XI7!8Ya/S90^<\2BYZ=jE(%&R\AHSJldGP7G<E"Wb%aP-!oI(bcS;kUk@i6RkZ70R\+GF1\&DaFmPt\r%11;M7F"P>KV_T`9>+jnn=+-l,kTt(`U9g)5DI>";A)\1#Lns(i\YR$Z-_o/A09'EOoD6+5^^?V!%5%8BY)s?hS@g5JqICm9\NRXs\r%&t^.Xk-,)iM,1;2*OE`1f=V;O^Y`L52QpQ]n7<<^@coQ"@7!&R`@b<@RZ"HCcd#\!;X1tMTI&Br)_SW'%pG]Z]l<>82K'JF`u8m^\r%,YJIU6W>M1W'2p]-EPcGC_RV[bt9Pdq,r[q<kC_h")8lm"3#Q_7M7HN@+71ZFN-XC!pTT`F$Mtq$9nhRCCY%TUL_[rL7\SURKIS[\r%;i<RUfnU?UNN!3ST`s%PG_^t76\Ek1kX,`$TnVfkYb2'sWm1m:%kZFf#4r*+Y`:EM$O.\VYR=/;j?j;uTnQmR&Ue?//i4?_a5TIm\r%?"bVc!W>o#6M9J<#CK.iGDZ>1qF+JY'DL;0;Pi1`<PN)52jOg_PuKPfB\_ZgM`aStkVQ(m_gmcmWR99MDR2L%Q4I$0@\BZ*O,o`C\r%nZ8j$0`_.gQQ2Z@F?#:O,*/M!cdU9E2:UA;\hs'`I7jH;3c-+U>h]=p?@e"sm]'[N*?DuWECc@cYfGjfa/<VBc8?D/*ljILS=VNc\r%a-l0k$1sb$QQ#i#a.D<Oj*."f\8XR%1Oeo)RE&sGa5rH(/T2/3O38c/.k:Ss&-)9_U:TN;A<FnI2-N$m)gNF0dk1:'4S&9+'P9Yl\r%EAM;QH9,msGoS9Ia=X1Gk>s+"4HA:q6IKS#iHJ>ZX-CQ#&<ldLi-4Zp5/37Y&t`;&0-\Nus$Zm@XW!8goi'@C^+^.Veu=kP-U'QH\r%+T,2n6hGE7n*iA-^u'tpO"75tFP:7JGoTh4+qgM?g@b>[O1NP/XY9eiT:EQl85H)FqAl1[BrUW&h5K^VL(?KY>QkL#I[[>ae8M,0\r%4t<:Rln'Oq5>G_D"bI2nn`/!V$[kDMIXIUE!5*:^J6WG1r4eS<2iSn\e=#R.!q>6YhN+%!)iPk?<$-Wq$@WsjEJEim1#p;%l^/,(\r%Q\$:a)R'H3Ss4dJLTY=cGp?Af3*Kb'!-0O`EHA%E6[XU)O"5YZ\J4tOjlp>5eqN5BR9kT,@-_Idd3[0:1P_;&UJ$s;WP%Z'N\6GW\r%]qY&WrsuE-mQOtjs(4LoS,N!*ANpLGgmt#7,U.;RWhmh*r=g;;Nh/irJ6WG1geRt^I:<9Jj49Y=hK6km+32$62h5-?IXI<<D?ItV\r%i5]9oeX$^k!C)V00a\db,^pa1`WNN?`(2\j1IBEB&q_9-<:5%3&GU6-R3HaEMDS%=^+3L\<)W5Gi9C_25fJ9rG=\j0#H3fla/9V/\r%$N&e#d:+Hu!M7FV#+cY5T%OpT1[r?0+sp)3NI`G]57[S49[0S.pi1A<Mg>I3_N-2sVsWsj<Qs7nEU4lW[2k"AO"4s9gEBXb_sY;/\r%g("3YLN$.(<_="oj#/uif655H3eYGA:pr`o6<$fLg((Y=3fmQ4fabPdLR,!)hfd(p+,=,*-:Dbtr4(_kOA!EN/*^s*@<DFWU@R"J\r%_r/QMfb(mP:M"eK3:'pq!9@&Ij!Nf("ti"nIN85:fo?mM5Ai4D4C,Ap?,dlmIN6d0Aqhg(`fCe>T-E:8:R3I1*WMHb/s&$[kDtJY\r%<8]e,0Z.$uS-h5c6)4iBj'7]=*(6e<_l9k`Xb/59BBCi2:sM8Kr+EK]5LRp/=PP_68eEb-c3'(mj(KHsM]-dOV`h!Kn[\6LN/egs\r%m4Ca9po_IF'dT66Yj1+8<5@oMFX*?8W&W+B+Y"V\Jc_n_LoA*N]eZDl(+teVCVe"@?\?Yro^X:2o/Gm'8M2>4@Rrn@Z_KJ`W=Xla\r%J:q/7Ud?2uK!om>+tD4W("dZX]bD-h9C6msFa,\]B61-,O`k&$lWbbhAs38GQK$nIR@[$s(#2nW6<U>h7lsB0G<m,$aIDS!NrDkJ\r%o#,CN0agk6!QL6m'U]rJM&P&UYE^Gr.#^bs^Gq3q[B$ir*#j_Yi/"2hbp6.kgb,ZQH'N8Nn3>6tR*f$=CuQ8I^Ee\MO?ij"L@bjt\r%W\/d"$bUGkWOhKcX1.+Y5QA=lG>J;f9s+G).c=9)$Rb#X"IeAJ(?R)cVX!_2[7L*HSA@r/9eAfq:Y"QFC;DqHJYg38e=(Ur6Oo)1\r%2RQqQ:Gb`)pe:9:[7oJ330jcZWTBQ_(=(>69J[:#dVtXY:<&AGdn-$/&FhZd'UAX7LMponihn>nL/W#bVc"F+,F[eQ^SqAu=0bpH\r%:/f?`@dL)*r(Scu:#J^qj_nn]]q\g`N>YGBFBuhk1n%)$RjP2]4_/jR6Jb/TK3^1KlP](&2V</?aPM@4B5g'C]Ps[,<r'**hWGjk\r%>)fB"r@E$OT,FT^99ulYV=RI'IMTNkrf1$h,?"A@D'[Q0Fk@eR5Jn88)mZ(>STg)Zh2qRdKeH7]A3\7b?C5GV+o>DYP?^u^=YQ!'\r%FL4p^m9&pkAM9?ekSo#h,Suu712B76fX"t_rNS8Fi#^pUrCpJ,:.&_)YNN%.n%k\RYiNGgct\t$4MBpl[MS@XB.)<Wc.Bg[!I'HZ\r%\Xt7QmG?H7*/Q=#BjSBip\d(1j6af$g2!=cGd=^qMs#P5_'T!5[eUrrQJ.=EH+`o`]:cW7igH^>YG<%+CYi$&%?<[5mNGcScP,`_\r%+5aT^="R"gEDfc](67QcX>s$N?4ss;jM)T-LS9f!k"]q@ju@L4^3$?l:b5d$GSnU'9h@??5]#ITEoMRU.k8SaNg8\DTAtSd]_Jk:\r%Dm1QKn`Mk\1[*P%fFDRh(@6>m.4hF;H'=cnBn_Mr\BsX_>ETYLNY=.,EEuB<WoY[Jp@5bd=N_2bq?l:u*;:2RpSE'AaA?+;X_DK,\r%SI8Se>8/",&199NWHiU@ieh[VFui-L'-Y5,:J8E$X*=n>bR,"EI5XCr2bp"45;Zf=.IVX-W*rk!j5BXZBaL3MU(>XGH1</;YM([l\r%6kLC:a?7]p.sg4;W.Yl$0"U/Oh'Q<*J#rIU&UHP;M8[H?@0D`A66D=Lm\F22NdBC;f6JGG+ET)+'hDb>3X:U5B,aF8h>2dmnVmIl\r%kRUCm(P5$ufF-:Aj+XgXRk1i=Cp*n>*X#%aR%>gZ4GX^g#\$Y8NlU-`-g5gf-m5JZ_3^9F/KdaT!#l8s$A*g+(L\]t.L6+4a932F\r%XgGFoEVYh8)EY4a#M)I!lR.u+]=?U,G"0.C/r)jbqdkY#BFk(#Iqu^2c(R)\jZ.Y<##4`r`?eIi5#l"SDp`$(*hJpkF*n,uj>'!q\r%E60.ioa7=P=M25Q(5q&a7_us^/UQWgeR7(j,p!1pS1"EHTO0ed',P&'kfJ,d6@fE.4_F7$;>@X*1SY0,i`u`&n2Y"j5$YDVTA[R,\r%m'@s1dK=;uekqb"_-XW*_M:eX9KMW_")K4S`AhChSbscKe#n?=5$YAuE^iA%+"efm4>2m8H7eedbsW&GFYVHeJ1^7::i/5/AP3H9\r%Klq4+IZ3";='&"E/c%&NH]rrQ([bZGVIqq4GD^Jq*/:!8o^tY?5q4#1o288b+/f+2!t7@5!JGQ+8-srUYo<_VLFMDjS'R1O&6bl:\r%p7H\2iklK!_:P'B4s!nJ-q>Q"pq3?C_g='u"/N>.4\KR9GRlb7,T;W&JbS*+qEi!m(jHS<Xl^cj37lr?n]aJlBdHTZ%%&!@#]Y\S\r%h]J5L>Z&F@3L7rADT:*hf!hT0MdZis5X(C2?L_c/N@_W=JkJrE8hMlGn"mOqVue7]<H)Bca""XFDX`MAccT6e.?RO%"B#D!+G&j5\r%Ba-"pK?k(<ZZ:P?\tVN'O@U$U<gQ>7$kd7U#q*"bSO&^95l.lLg$KA1K1,R5ef:=CQs<&p<"K5QjA%,J!Ad9]<[5ZGU)HL?(PLj*\r%F*rBk@rc2n%L'i464G/_#)T-h'ijl7&nqEhlrgR<+?<I[NBDi(F30+IgDg^n*TV%tQJK(;n=;tMR,"YI,dXon3J0.GJTRO.6c.@)\r%IRZ//dWZ3^STf+X.>h;Plpc6/B3^&1A]&"qF@iVYWc*sMbYD+7A%>8R5GAW0=^D9'nKY"/<_Ic9eB#Icf$-=ZDtUO;69Xc^Q"m;g\r%ILRb+^6L6@*BsmN7+1SPV#,=Tnm9]W$h#+"Q\o<W%EYZu-?_KjlHQL:qTk?TN$%^J:V#;!p0O3j0;j0pLcTnd4'0;=O/Trd80s*3\r%5GAW05u0W8p_!,'L/jD8nK[>g&_tKmnY8P\Q29=rr5CWN;\,k'ki51fnR'++4m6#S)a?sCL6&Q'=k*3YFngdZlk7Rm;cJNk/rsq2\r%c</_<.1X'P4>.AbGppE&XDfV9T.?r&E2b*!Y:j_%'TSKbf!2I<;YU'bp#'d<Hoj^\T@@g//&b2&\C=KpPT7%j3iSMb?8t5aF),]!\r%1>3^QC/VsGE4lRi$<"d<`+;*X*:Ydu-PF=nn=HhoT=cWkD%77Sh[GDGZoR"+QPhE0USZ>.*$nhsm-cXfh[l#\(H,MJdSoD@Ib-Lb\r%,QWpU?-u2'`"#GW5*lZ0#Q&n#"GEpESo;SM.*^!C%%"j0/9HqIFgPmc%+V\Z-$@bY)qPbfF!MK][osdMXBHG2?GdbF*%lC.;QAsJ\r%g4R/4Kla=b]:#S_k<?s;,;R**eBbG,3+[e:iI2PQ%7gqp_Yl#s7Rp*F5Dr(\'5&Zir/*(s-I*;_QFOT>N\.UG\QGT3nJ5?/^#$[C\r%htO9_9=L<npj\3a%>K*J$f18\c'j5H^@;(Renu;RQ6H-2]t:J_;2Y`I5u9iY_!^,J6*,HG44V;MXaAQeA*'11QFd\2R=g)6:Jpp?\r%"@[MhB0SOU)dFQ@>A,%PgbFD2k4jnnWfN;@Yl1iH%lD=6%?ajrfFP^&aQY++W__7q'ibZ-k?Z^g'tAT4?jC5cf8P@9dd8Krb2-F-\r%QAe;0$/$Qp)(kY^0,a<)Zg'd'Iu0t3>T#mQPRODe!So\CUJt2[(t('XRYW"T+nf,t)PrmC'Mc[D'd"L6oFtb6K&+:GNnbjV>[7uk\r%;s7Xu$ZZp_*@PTm$42O='n5]7P@!Hui=TGnj`7qr]e;Nm\KE*g%.6[GbI7[Z<"2S&7.2[nH+[K6"ua&=BLTNeOA^H&_Mj;^DUeBD\r%o@cpMC-X%`$2r9E48o>qH1\Css/)Ai=NTR;a03udc]pG7kjBt"0;]ON0+F%u>$]C5apT4QEB>)VW)OA2Wg2_"r%Oaoag$TOY@gq]\r%lU'!6`b5J8dh!_01.M1UF/WG`D@Y'tb,qFG[;.YD/oG0l&Z\p!2*4S8\=ohG)[hY5ipL`,M18uaEq%-HfL(.m&f^U0*Z$C0X^d=f\r%o4.u-"OQ>apubL$^<H=E90`;kNm-[qHujC3fN\.DAsmoSNtT9%+i?VP\I!bgG4T)0-Wd`_A,o%llF-\8#*d=p'PbPZnFABlXn8tH\r%He#rLYUsg;/U.1r&,,`e)D1)mqSu*C2d=UU295C6qrNg:0s3/'([C,>^Q(8Z$eCA):]0sj@ir89_(89JjPCh+khO](cj_aTRp>2\\r%5Whk7@WS,3.L:236gLDYjAb7o=k!/GMi`0F9@IG?k#T5gR`;GKrMmk>-pD6jRO1X='@b-%nTL*i0"H3g/9.aOED^tmmFP@$`.:!Q\r%.c/H>24'-._rVc5S'&\(iJ&4^7+c`G33@f&G'<kC<4j7&$a+]M*5!<C$fJFYMRTqIl&tR[\1Y15Y%6MY*)\;T"3!II4`cBD@;&A;\r%?j`uQgn4[kX-u'G-AQF#=Dnmp+BSd"Y*/jk>rb"Er(78u@<gh$n-VMmCuU:e66H4$C(!W*p58g&$riq03nQV)8po&gP1N^&jAqI1\r%&NaK!$r&k:PoUpL't!;uL\CA'Bacama8<R:rSjHEUt^KmlFF3lqg,0g8,?GLoc12gNHO`Rm6"JU,2$l1_]c^3IlsL2C^`SDXA+1,\r%-MsCT]U,1m+"T&CKLau4V?J'&(<dTD8cIZr=p=ckcq@"*^(TU)AetII+<cm"4L9sRll]C`7%qu3>Nc@b3Sn.I"q08*$PstRQGGn#\r%ehA7@FBfSBF,DbO0J.p2DFUdB=Ma!\/*Q8R&#NpHd,Fee0IAh5$QWFH_jT_u/9L%P9*c1OQPQ!jakS4(/di\GmtW^HEEVMLPSqM0\r%=4&Z[hV/Gc3\Cf2U4tMPEEVKN;OUl,\c>>Ybs^0;PFCO;d(qhb-kdVfKatEp_O0Ps\n:poNt=G+<9"9\5X^6-6qAqB&X)Jr\r#U-\r%gI0(n1BDeh-kdVfKb!<fThKQ5(-5R<6CI&I/9H'p-a/Aeb<h!]a9)2tbYKOWM2k6q=DK\,M2obG#JHp0-9<ae*VqAH9QXMT3i"<;\r%5TtLj3k33U5TtLj3bNr$dmV5fTpo^M_,(E0KatD[,sWW$S&SKXV._91%ger.;P4RbPFNg%$K4?=^kA6]."i*;@HY@]KgPQr&/H'W\r%1_df^KY[Ipih6oI,Qu?*8Us/&4EK:WF#GG"%gcZ)m6s>b;L]H`I7OXB`[*knHq4P4^e92Eq"@WREts;#&3_?B9FZ6?&9(et6Qph!\r%>nQDcU3(#^<=0GW=)TRg'I^o$>Z"qi<GkGR4oH`@'Z,WYQtS4j:^Gr9<E+^Raq'3q2,C/RC!iRb4sU8U80gGDHq4P@XqVD#n0&t1\r%j@Oo!#TjZ\1Esb)+acfd4T-NH$K4?=GZT?&:^A-U!bjA,:^A-U_PCiPLI+[s_5'=>Hq4O^lC8-76MUC[do:B3:^CDmbFIJ1*NdB#\r%pZJ`tFtK,/?EW?J^EPbt*<2Mq<T%u7m;OqI83I?/?Z\XA^%WaF!dP_W%;Kt*b-U#E%o&K[mjn8/bK#$MF(iFuVRM=-DRZ8qSlsFO\r%8brrrLf*B8*aC,tj=[\eP[Jn@MN;,<4M5H7coSM"`1^"ThinRR#:`;u64)3jMBIU.V,,H0SMg)aY>EmM@o3r_J&4G4f-b,/R-<C,\r%PhM9@>3ANTNMKAPogoMQ`'*Y]P]6H)m3o!`;G!JIfu=YN<!l3@%jA$fbL.atCOe^E%'G0s9!CLq/i@O#EjeleNjK%iAUc6=TZsfb\r%aC`?,3M/pip"RP4EM>><(V7df)F6k@7W#n>Ju;L:<R/SL=>SIqJK@sp5XVC:;^t_g!Z[J2rSi!'#A):Nb2R*9\,4]UrR0o)5<)s:\r%lXsR>!=>mWNm[XSfa>aNiT!4*PkTuEX`BkIl&"6=^iI5-CLq2UCr<G+iRt]h^>?"GY(B\?li$MR7X!9b3t&#f84j&tTS7+qP#?i`\r%O!(Ra>k9D@U<o5d[KZ)<Mnsb<"SIQpHLFJr\&.TCBC57j;'Q20(qb&HRh-"4K.@ehH`'7:fJ,oC]^j5c(;`s`iZJj\Q&+;/$$A--\r%^lC]c.;ECD*J=(rf.bSPFq!4h7?%_[A+8?CY0KQ<3sP-o:h[oM]8G"GG]&E/hG&0r+opsH]Q^U//"oPnoA8G@4=n:N$RaJ4nD8`.\r%,9joUo_cniUgMcfGD[k(8;c]G;hPR!c19_B,9e>INkp'T1%(b9lkmBZMAd@?a5FW5E_AfN*J=*HT(cCjMcO&#s!m^e0/I:L'[0B]\r%IO[K^nDuNa7)e77N:X5L,hLR8Er@jZ#@$eF;Bd\R@o38Mj@%_YIP3cF]$=c_**Oq2Y8e$>dM!!!I<P)8oFX[8K@Q+k@#$OP8*I2Q\r%cF!<U&o"QDCK`sY/WdVhkc'dcaFq6N:lS*WAA[%q;'Q20(qb&`]ugdp_VRB@lO*s%>>>$S-!s`oZ1P8FSue0f07QJA'5YEa)F%-m\r%\(9$WiH9Qe[pX@m@-bX6*^SWLRk*]E$Y/'a_1H_-aXMUGIXahRbP[c@.cA/9l_b?YI1-6EDe*f"_S?+brn:Q%JIB$rh<_MaLa,@]\r%qUnnYn^#N2aj3FtZRso-A^@JS4=C?"I=oE3m&Mu8_%=KK$.#;='E[VL;IBbMj%$Y4?k`Z]'uKS!P)LdlG`-E'L#p"QTb)5LmQRoe\r%L*.%]+IGA_5p?"/+`8-K#DI\'C'56fA1C:l"raNT7?mpMo50Tdh,*(RfUu7\\-Sn!m;RU_h.dFcGt8VN>/t;1KHqRl?miOK8!XCp\r%Ta'=><T`sLe;RB$2XLi6CIq>$W*>+QkCl9]Eq']9P;WpPCAo>"6;e("!Uf%Eg+mbk]36]][O_T'8E.OsM$RR8#d-oHcE6O!m9@J.\r%n2WhRHoCCOQ4*Q.pMLRC4kmqd:!YCVaD0:X#+,k2X^TDOm]C!PLC5K2P2(Hq'%dTTeCkGo8b;VXZeW.JN*f9(kJK`3['YN4^gV:T\r%R)[g2mkS8;!bj8OV$ZM%2ri(@A3D.$GY!\O,8("`bEX5-I>6GPek44PIal);BPZ5_qmC,=1kfsk;4IJ;2h<A9ds"*2\Ht[7U%\p(\r%k2sA>"1Tt]mI"/gA+$hsXE*gs:T\\/CDU>Iol>5*d!S!ZDQnK?-5MoqVUg3Je%:XkP-$aWe%;7CKMm;;TF]aPUYBS9PTRCT`k@+/\r%C?)659,H%>Z+3nF0!"FlIFUu_qi@</;u2d8Vr[Zilm7XB#4J(SMs/\o?8DcQHV4<+=*!hNEXT\J4.4X8BoE+jFb47K9J%$.=snPq\r%a6LE1Nal'g*j%bt]^]bP'"/7LM[3L?&_f4Sa5g^a'NMM@!PXr[;_$_9&uemPfJ]bY?7<5kdt!-e'p;I7q32k8Rh8)iOQmo@YtZ"B\r%%4IZS[0fL)TVk\l<Zrn,M7a4_;@28e#fO1)MN@<DGEJWA>,D+.9u=hI,O./*'+c_&Y%)t5iFuNin;M"&c004?,2$fmohVMeZ'<E$\r%o-Wso1O,=E\uWWdDGsNN>/e%$X4m7AC1tOIIE8_a!6/;J7DCsD<K2]q<^ed?*"Q'u_>4<'.%8\$DmhuH,-gXj`HhT6\>tW%YOi4O\r%\@((6mH1c9d&n-\h$j,_4BH'I''>!,I0(m4Haa#Dl2jj3Vc>m"g=aiB7rK]U^D<kc2tb<'<[d/_mru2*LPIDsC`9LpAu9NME]=T0\r%/SB2bSDh'FD.7G$^3urn%0Ee/GW=#N;,LiFS!CZh\tO%1No-P=28DMr9,?IK$CFR'61I$9XoR<Y&?8`$9#XL$'rb2(>QJg"n<*tM\r%eW$<oP6L`l!iY8E-4B<a"i/s19,?IK$FmaDK'%5I;`jbL%OMRZo3?>udnN0-0)3Nir*08u`<=NSOLbTrmkrhS%Q^T*Ae1Dr-Zj6]\r%1pmGN<UAKN8NnQ>kB=oQ\al,/resg=F$$1s*LdZaC2SedJ.!gM]OV%lXoPWF36;7">QOIrEg$\%\H8-a'MK9Eb%[jF<SaV@c`R+4\r%K_F)?4.K*Ck6eq;RA]kgCA.Y>Su2b^i%u?(=Y",o5]J;8"$>_XKHAg7#oC,+?:/J%dfD$9%PL(1,3a>i:G3Yni3S;o9ll7=cCZsp\r%\:@.f&i?m]*S>r#,&CeF3j<,e/GS`:8KPBlW@L?o"h<IlVOq5Ba:<?#LLkBd">8FfY[]EU`/O%Z#BjL(?NMk7[pSRtp'ANHqZ_5F\r%M':9VCnFGNgq+,XbOuD3i"\^D0&(SiVPe6`i3Ib545_'EJBRWqm(i3:!LKAL%dYSnjEWRMj0F*jeFhZ7M9?ArT]4"'#8!d87Wo8Z\r%FY6q-Dd^Ujq1[k7I02R@QR#M@q"9P9>deQYa/Ua[j0F*U!N%k&i3Ib546F[=*1-%3fHIR_,3,sXHP_9RftN"XCC`<P(mjX'I;1+*\r%=jY5"FcujP,E'TRqlV$b=:#r"TapE_kWhI(G,PL)\1]1DA;<4M",WYe7Wt^44/darJ]m`rlmSkJ>dgi87EDVHJ]mbhD4m";i3Ic*\r%/ZUN?f[e3<V<VWNrpa5#g!hd*Y_$iIYj&_oC2-oN1"!LI?W5/9]Sja?qjL\EZ8`"*nA(s_C27+HUP37*6pFs^6;-cG"eN?Fo%dc(\r%)`gNfhM:PI>5=M$0rof5*kqr8NYHNV*43SY$W$6%YO.%UhV$$DF7Zdn?bieH@d`F$.sb>=a,tDlP,@,WnU3VC90GK-`>70C+0g'5\r%CFuu^(iI4^q:cC(4g6$j%<NsN!eUcnVkEp!$*ArRYT=2Do]+9-H\gNBk6\d5ic=Y</e6a7&]M0'c^0Z@FDb!AFCXWFkF?90[AVE?\r%;;<OQpAKG4FcDGn5DNUjL]5T/?88l3hX%Q#fK)59R4HZm:tnlIr2MP3$ICh7EM!p67_FsU3r[^-,&jNNRmnBSR"PZ&brn,8f,am7\r%T`(jXp0mHS4P=R(r=&\&\FOap$K4I,hQ'XRK2jsZAhL(UrVBIeZ?UP)f3*eUFb[YD&Qo!a;gT;(p(R>s*30i=d?k#s:MXhfe:N%W\r%^oqtSO&MQbJ^+2s,Q;dc@\>_3Oh35%U^LLT'NMG\_86@T&kgt(+>T8!H-#2IMhiY!5$2#N^a=_-M;)7VUVi9/pp<ap:F@fhHdae<\r%"bh?catmOlg@`l,#5"G(M>AACX.S=d+>*7_c*1MQRS3&-6Zq)^E<rUX>(s/$kt0(0/++FImsS.krU(pqNO\Z0bI5_D.V[uEGHkO[\r%Z"]O$f$^mJRPi7Q2YLC$jo`Uj:jf5(E#A^1[$?iprke&fl^,o&Y)[_alW1<80<O>c/<e7dAimJMe>L`9rNtn^Xcdl+r_T4ZQnfs/\r%/s0q+\M(Xk5?.<^YIR8GrA`W>I?YP-6@NdJgHOIeFZY;J423!l0Fu[g[>(g"K<KTH=;]^A?696Af(Hsq\nUhsgo.\+WYAW:/Tq&,\r%9S;3#8Z\VH=BXpgo>X+,Xgj:(R.O/hINf$VWf\=q>%u3gKDpdeCpu>k-hDAS?-Q[9r2dQC]tKF!6Ro53k?$XqH]3_0;&VGF0qRL3\r%<0C80*U@dD=UG'.-hmeW#aaT-<jT:ufe.C/M,lR^_K=lr;i?l4&0$1ldJKc(*3VURlqW*HSH5diU_MICCE![FXq[N.>j^[ghG::j\r%`>;4?oDAW8fXEZ0<UO:O@b;`.I`B!bT!i0Jg>H#_<r6dFo>b#U^,OJRl'Xp5fZ,qN<P$0FY90=Qk4*%nFR]5URRh(+1$/\,P6RNV\r%)LYVt(U'6/^!nKL2i?]o>44$*He'"j6*DbR%GYhq<doD9gfPu47dg6G5<na%T#c?O-bR#&\tZWRFFSi:MJnBp\bkp3Q1*#-+47PY\r%>h%N?kuD[S]XD\g;hqfoE"rj0kA",O.2I6c`_Ph6)o\Lr<,)q.02&/XgR^($ine56p%gT'53X-W-&\hGO6kt*2J:N`QBjY9^U*UT\r%j)K_>NR*JoXtY+oDr-^2cn[@p1uIAV,;3fc-r&5AUm$[-'GR\/4W(5#+Xn.A9suSIK?.5MUf:TPG#k_cCXi'uA#`R<RXGRn.fO?Y\r%dOHN=K!(#>X[4K\*+GBcX^[jN4g\\O<KF7gKkV9"rSpSHMpa)NRL"(,`G-.=3Upcd7;2B.':aHE<8`^leLIB(\\6<B9WQNPho'7E\r%P#?iOP*oJWL7gW0>(rbOJ?$Gb<HcdA>sZg'T:!I+bQRAaK[D8HT1[H&e(_:2VKOat*r*+"9<##emL+9n#eY-QGo7OR3?7e25Y4MP\r%0bPH;&^2P`Arr+[.-QNBd<N5/ZO-W9Y9I.4(Y2_,$/gFFG=9R^;CD&m?YUJK`7CC+F2A'[7S^]XH!X#;V7FQ18`45,\1/e:8ch4%\r%!VXNY.1(Qa"Qu5c(^UjNDaYAb$q:;VIdp>L3#N$PhN,qGVd1oI!^@pGSDRtS,[`:r;W8!gl.2QKHZrAd=47%'F<N+Up?SU2*o'^*\r%nDA<3]jb5iU%'B#Z=(Gi#+agqr]WPjN(!3XXnmS";C%/U83f#8CUWE++3]sJe3L%(J)f9RQ"+CJ.;BQsS<#+c]l+ok80&m1]ejPd\r%Lp]U'Xp_X-'RsC1#PX&0*MV)VMqZ]d4&+uOiOku54X/Ge&Q5eEH:4hT,"36K]1AsFA44dk6oKIS=a-!-(TLjfoS?U27'gJ=`.V_P\r%C/j#3mf:/%*?q"]-rbE\-%:U!>s-pGOYcHU'hOHZGEGjkl%0\J]9^$N<9kQII&[R<oM"(`CsTL?$V]ZhngqG<JEXS&Uq3Wql&\%P\r%ed`;k/O?u6DHeWs"r>IRYEUs?']A6K%R0.@[RaG)dj%&u<RWaF7XX6i$q.Z>WAt+[b#%K!JEG3(Zd_PtKiugF=HNiOj3'!EC(F1&\r%83.f`Z18otfH(BYB^PH=ZZ/#[(.p)Gs&9ajLX;J0Y!'_R*!5;BW:gd(EsSniiS$Xmc(W7bVYDi(LSSL@e/mUa%`.!jW:nTY7r=?j\r%hs\Ucm??tmBtK\D5&O\Ec>PTS:Q;9J2db+S*Xn18b*oMk>m.lp<>0V00DqtS?4B.O)a5&Z>c+msn!W18qKtHi>c6ligXh5ZHJ/$%\r%!-/P<rr_`G>.=I!>'K7=Y!1AMEB8I@I('k/3'h]Lq03^W^^3bK*r7L@FVdVl+hc4cc&:T*;cL6olMYr@2?u*hjZK^@[tpeSpcdhn\r%ZNn^W+OZhucCUbV8:)GZ;OHB%1M,i67M]>pl",$-KSqLUoV1Ue](gU0\*(S,RKW0BqrfX[Ue(%;/(;1<3+:gi-bUK4KhO=rU.Q#)\r%53XquRmq(;0snTThN-C_@VC&GpPX:djca"A]qUk`P*GkgkM5!\h`VIGh4/)47Qd!o&3((%>"htG&^`c**bVO=HY`IhV:cB:N.&30\r%es=$6Obg""-XcG?Dh(Y`p#aY'*\Cg"3SaOac:G>9<t"%]kgHPBFP<CNN+1,3mB;ef5._0oXt!VT[$tNDmQ!c_*D]OF*g%_m;J#@o\r%_=#8/l;Stpk5>M\a3GHn4ETrEK9]esF"^Xa_$%4Qk?bALK0@j`c96E>%p5a*X@+u?):22Y;B@;q<;7OMrF\0I"Mt,:;c5S^9GIDc\r%3[JA/PXN=eP-cYeEbFGdd:-Y]*u4_Zfc7leIoQ%^dUM4oIoQ%^Q.HfVr^TEWi<2MFn38E!cVt[3i."<:q@@aq:&&'hNsu&`UAs.H\r%('af6UAn%!,7a]C7K8dfE/a;$Ql]K];:0lTPU?n=7hl;Sp.Z8!O'7>h,2n#NoH-'[`=b!u.Mk6$io#;coH3o^io#;coO"s>Afpr3\r%MZ*_3M(n]H(&\Bd*5^W`eD&$tLCjXgUS@crmm:h$N;QW^K`=osIkIljFSHpmrJ.bI3;=R1rJ+Gk;=M=G%K/5N@hf1H7n*G,W^->$\r%(&b%dK`=p$2GDL4"ok?ls#dguJagF#k4?#d^YeJg\pLj58[l2`LMjt>H-@rlV5WreJBk)-d'I;g!$)]Fj&$N8!hAP7K_?Im3Y*Bf\r%H)C>_ag5On?U!_.pFbOf9!(2'CGPq,Rt3XgI+`g[$Wm?\qHTh$>[PCtB0V(DIV8hXq*BXaJ/ANIP_E?bTV6fFWm5?.*XLu"7;MTk\r%M?7kkQ_MW$@*WE(l#M=^m/9ijWPBMP-$LtUU;*5*/Fa(kq1g.kJN<Sm+*=GR;IGOaZMJ$h$HrgW9p6<Z3Rr2ZSW'/^jk5$!/>5S1\r%OE<EW_K/8X'NjU$dMk/W0d5Y4j.[4Cd==Z)r6PIV6VbeN,:S7LHoNam?PF7CQo1YDS0+/b5$BouI,,,jCj@=0do.ugLoR/X=Doco\r%9BZcG\C9!`mO*i*#dhTc<aYnVYkR008=G[19Yc?<gJ"+#/>\sX:7KAUA0O[Qi3npJGgJtS*0DYoBO*LN;hMEiTqrge[HX9O--[-(\r%*gb]FAr8(!bO.nWaKB+5Z6/I&ai[W5.!&dt;dcOB%m($)EAV:Pb(Z9Kr#?R>'GtqmV5!fukt6M0\S/DC2PHp'Peblu.SYelPq,JA\r%"D?g?A\eC@$(I1flp7lt5&XJ>hO`d@les(:;iB+_drOP]jXMH>$8]#/?("q^#[+_6=_/.K<\@p'nUGf?XBbB5P;\E]ca%!47?8((\r%'s0:/b):IW-NRs4E`T@&9$<KdPm^B!kc@eHXBbNQZc$2BXB\2Z.U=MSW2^lI@$[_g.ka]0i$T7&qm*#UF8ZO6*7"8cRsM1NR$G8n\r%<kWOpXBb\9poSkKZ?#EJl37-lZEqfECl=O3SX)pmb2kf2.4\K)8JSX>k4*o.WOKW<9;8b5nJQD1.cb.%.Ok[(4EOUV46%rN>n5E,\r%'>n')QJ@n/_DoXde=O^cPht5T-,5B2aO.PC^/>STgi:X@ZV)'Fgi:Yk8d["QVP[2RM,%U@1i&s%CSI#e7`fa]9lpHb;><h_,\*P^\r%4T"(nSYjG>a;2>eN?$Sdn`uiU($'#_dH@<g&MOj]]cRtHDGqhF(l;DVr'5Ye<6'k3l\#Qfd=RoW3kOUl:(4C&W4IdL/``Z04#)ua\r%9(ZL=L0,hUK9b.)@BPfh%psSpVBT$E6!Da:?pb/\0uQ+=6>j_L-\cDol`k->:(1$EdM:jOG![ilXq4n.o7qP<=['FSK,T'EpL%5#\r%/PT+^b#G^4a%=>:UPnJlFRGKf'dS]4>9Ere2RN9-emGAeQoO@,J47Q>JL2VEmhaB$C*qG+^F\8CTZ(>mA<:;Q/nM2>SG9HO7N_H)\r%U"u6/Q@8R&7XTKTKbVkCl6GEdp\KW,O6@iQ3I+DFMY#dHIKmLL(7kc[BY_<0oW,.+qSc/fc^":dj?7dY_h&PoS2q7\k->Vl*,2:K\r%e%IhTM]H=!qJZhGA)](`5(amB.?Q3*O,<>/`Ljj!p\*$U-,98@oYMoack9H=Kn2ljUEosmD'jr`d+"r]7uk'4:80EsjHW%@8(cHt\r%9MejYqhkCOno=+32Wua4(KNW^j*3*:]jMG)httWP1%2s2E=Ct\:XCB6="R"7"Cdo(_Hsb!P<d\=d)3&'n/N!g^P&0]Reilq(ReXI\r%7.d/VDduOD(ZBaT_(IQ,oDU6ZfnU?S1W&6@q[5G0gJ".M<lmcnjbbN]Ej>-e,5KT;?"i0a&E,taa\q0kTs=;B\9qtBX++HjS1Wi2\r%Nhh_:\P2r$Kmq]/1/Gq\9eDWYbL6&V$^s(5rTl&FL4*apaQ%0q"hCBa.\4#SpSFqAZksWsA=h?W*LPqk$RUor4n8#3Ul`V_qi%"J\r%msJ[]kb]EoUUPGrFgC`\Mjjdij-XS!Z,bsga3bd2g#I\+j,Q97?sXX5cPaLXCr.1SnXT,2c6b++eA^f/QG+<o80O$E._k/*T0*V8\r%A\oLT7ik`2LHR8N4RSXT@\3VY-]_cHXakNI?ihDG/I^mN;9@jUr>DB,dk[^Q$V70)eoAKY'Tl-09HFFr-<&+O/dcmZRMq!P:)aVV\r%K-$Yd`2=ktZ9AnHr/OAjG8LqO';$7!nDDfH@B7De-U*6eP=*4UJD)7pn]=->LL%D47'@Hu32kF8HX%V;I'V??24ZXm4DrQRfFjg>\r%AM'b71+,7G:F]u38P4BiGq(uDG]_\^+eA>8(PEl#YF1=#ERC<KJ\D\E,7@&?%Dn0U<fqj)JIOs)a2stWPAqC`6jeB*JE&>;*s[k$\r%#=/:'aLL9IO$a'iPcGo25Anak7o-#l`fEntC>jJ,X;rM;)kYM&&qD'ZI=;]W>RGp":N3oHjAPL-UpOM!pi/*&6t5MHQ2F&b?\7h.\r%:a]2\QSA=sH<3iZlbqi(m1e]UiMFVj9=Vl4*FAT5'8%B^*I-T5P#2)OInfVMYVJ-:c$oLJqro3FI\Pc@?.i#*13Z=bECG-7/lVJ-\r%'`>J8#+ci$pi1[efM>13r4#(!"\%FkdFIsmaJIh8TsgJJ$]g5g7k0AeLgff5^eXV(aJIh8J^5F&%4+K4_6-+$2O#'V34K3Mo2J'H\r%j*'lkfK9lT5Ahh/7N.q/(nUkM9@*[()#Q?)66Zn90oSn:U/#Cq_`t3@B&Ud=D`ii,-\`Cf[+I2;:H3eC153gY4H]DY?OD<C)<SJX\r%i(abn46/.;RL(+c[_k>KP!Jq)G!pRlLD'+:5gC/]nj>8T>$3c][R5F?=\X[E`Br5f\HKc+4'`&>gf39APAjVuLSu+%B051;kXnt3\r%+d_F)h9"VlLKsUoS-%UQOA!EN_mAe4OA!EN4%\<FJ6WG1*:>PEm8,?_h"6Y!N8Q!HPu@,3\<H+\OA!EN6XOXV/j(n<*.6e<,>,e5\r%s"?.qU>a/+>)X<$+CI)74M=&0;,mI<,DGF]DK5[8?f&:@hY8pW/AuKCf4^IG^!7J?$HoE!ClTW9Kc!R=j\k+Yk@3RQ=;T$G,t5u3\r%oe?'ETC!/VdR8]Qp@B-T:%'(4eNk$;3bfXe`dpE$%5f1kpslZ2mo!!B^2H'k=q`"n!YH/>jIme66j6c7BTNQ\XfGnB'gQQqA]\p`\r%(L4eE1bFR4A^VBi5q3"@,gdJ;gW\VA<(q=W"13[\7)`.!;m_Nk$DIU&=6?P%(/Zf-mt)'InPXTZFh8>f@,.p"gQbsBY3?b3$Op[%\r%+;M6)?u^P3`9i_kht7GYP`Q/1Wl%A*MULs>5!]6:=$^M"N.o^8*/Q'bbS)q79giM3R7+;b_d]R9*A+7krlM--qRi4:*cJH28/.bX\r%81.8>AFEhs'tmn"+H;9GAtH/tq]N)$In:=aM8I!hm#XL+VA@Z8]W&L?9eAf1[C+/^FCoMKQN"/'of#\J)4F`Y4Va'RWF[LdGsHH+\r%e:K:`DlPF>;bL!*"Zu63[4i>W1KBdVWC<[A#,gbW2mpG:c't`Vhpb!M,qM^Ld3u:Y[@GH2*gR"K;[]_LdT@F:r\59A%=D&dOn9j(\r%1n9VeSpb<(NG.Q@r:ME'NQYdFY^!=FZS\2L(3\M)@VIe@^P^1+Wls;LEpJ/)<*fL#(/-p_VX!_2[;\$M30qR417u8Wg<VJ>0.=0q\r%+p!=%Gjcj#BV%*62'/),%+:gBZVZ's]E[iIK_fQ(5F0J$J\!$%=m4O_qG5#aC.W?9)EFtq>C&NW4s'Lq30$PoB>%C=`56lAga"-:\r%Z[eRl&Z?YST;AJkJ\!$%=m2jG$.KF;cU(\t>$*a_5Kc43`D?B+p9SM'e^&E6TE!R0(;?t^J&N\bG/T,u`VOZ#^IW/hJ`DbaqqITX\r%."NEZ*P]%#%o\8W^lnFtOr+sXMM5BGZ-tbQ3?-<q.\V0)pj$!t+27.<i[VZe\_$0%Gl+:`]U)%dk;1kl0!8gTk#T5[MWel)@]I+E\r%C-?uG1`Kp\D_)SE1Uoe/EMuXh3p8AKjMoGd\Qj07rqLdOc!tV+TAp'Rjb+D0k?rZ?F&L<jHPMA#8!1\cpj$:CEXFl:j_1pW,U`UN\r%ji_XA<;n-jrk3gN.e"cF-%g6.EhpP`l$_tF-iV*h>^bHS-iV43]K7Ueoggk`6-hltEDU9Ac'RIdW;K4^X>s&P7K9%f=QqBUWDZss\r%XW]itc3`_cTK?:Pr2SjQ'#d<>ZXks'DD*7,rJ2%\Q:<3S31V<$+\j1*SBRDqfca,h,l#n.0EdRSZGNi%36hf-fbrS\M1#67g<u9+\r%]r_0dekl>%lF840X:_CP=X8me8T@9K;08*78)T)*g26(e?YU`G4C0OOfB3Z]!]OSMGrjgNAa^H8*$sk0:?[M0it4ishBNZRSOtTH\r%>1XG"Pl_46<4VqXO<Q_'J,nm/p%GTUclu>W?Zk;=r/#R5N]RR@_EINYE5J`H-9$MpL<uQ\X9(FI%t[3%JBX5h4G^+uK7Ycea2PQ3\r%[el>fap/-V0tVt/ap5F/VV=K=$A&V:5hAFE$A&D40P^LFZ-.92LcZ>69s9!:-`GiR08X/Pio:q<@t4:2b'3%'O/UVi>h%N?l.)kY\r%5-HkoD4MEQXiC+#ai60LV\I4K&m"eOPWd,!/cJmUdp%1N.OMVY#p5?4@1+/0fn61^a($h)[baB^A<3I>'L!0b:d/?M4m''mSH9BO\r%HZXVS8kso=ohA_<?XePf3%eHtluBOSFQ'"@WhX1K*]u#&5#fTNHa!`]-;oDs0.%s[(>!'DAnr5oO80P!+age1c\0Zj/:<hH^fru`\r%Utr08$p\qPlRVJ+,sAbS1/fL+qOqVq1S=BWPJX$D&!Q_WhT>fJ?FX/_Ohm!gr3k2Pq.#-@Kfd;9F%E"*=i+hK@h/H*0>e^V2!OJX\r%,S7D@d3Xn#3UEV!kW+(U@CL'kA&URu^T\:l(lq5I4X_c\`ogXJh8BOC^2,Wfi^*#]:g:$6#P?l6$KGXS4d`QoO^NPF]EcWT8A4-o\r%0YUr=%>NZ*HP\('1:/5pI/0S)U,%S/HE>OTC`[M<Iij'_o65!t47GQ^f4;"O&mRutM3D1D_.C;e,"jQg#`2W%R;Q4pP)Cg"@-.,S\r%Y20W?'^"!NB'!2HJ$^(=mJALRR$A$f,1d6dl&&]`C#'qFO@U$UGfiM>$khgpU%lYPbTN#pO=#i<ndJEkI8l^&7nl]#9lf+0boi,q\r%OJ!sRFp<e&%S\818r:YY.mKUk6Dl[k0.'a45(c8oRJhbk6_Q;,Uf20Z:.3AMOVBB@fSQ.b,#'2R20m?Bmo\,C[u(!t2O@YSZ-D5=\r%j%%CIbDsq@'JY5.RR!<84\))0RQ/Di8GA4TpF6G+3Rqi\ZO%6;5hpOX*%KFF,$KKC;-_[A,e/A@CeCj;B1R()(808Y0P^L,H2d=Y\r%lL5Bh@E@J!Pr;Mle[f<1DOji$`+`jOD]ZTW]VJFm],pEb[HiU'/9U^n>\]snkT<#ELQ@2'A19TD3q)"c,P5q@0?K#Oq?:h#De1!Y\r%P7XY)YcdZmDqDCde)gX31T]V,eDVY9<sfm2U(/95>"m<<&U!jSe]G/;O*HsJb4(OKfd2QULMBJh9"g225FtO=R!OY43dq2`_=`m`\r%4fe0,B)IHGHo,gR$5l(&%NhCu;V_$ZQ#@0#%]SDbQuA!@KnI7=K^d7F[n$sp_X@XsV&i<(\.jeO-U(cB7n[!6R)![?#M7,>*A04;\r%I$>R&jdI*L(bULMJ+Qr5KM+H^Gi<1f9A'e!WSp_rqOCft\XPu1Y7J[Foc+-PNb:caLJ(A1q82cf4+Ka0g>(-RP0rE(<gpsG.@5f8\r%3*^2'^2>6DpX34\P@5h&>\`t2l+)E"p%]AV90LdQ`"%"$<+>8gn)t9^rTn=&iq0Qrg97l&WS<,L,_aZ@bYACZSXVQE"F>;m9:^PN\r%bl'*iLns'>&ifQ?`,I.:WRV39>cmW4_;*Z^U/Q=td]V^bE_\jB8mmu%/qs1*Ndj`#\.n@Di=%f9iDOo;!tIn!7nZN?bBD]0$("g;\r%5EqV;NV@HFHi-`3I9s)mqW6+!q>5X>Y$B.t?_D03qgS<nr_i$<!PB3]];MT4i4Y6)]h'7e,BtjeG0`jG&"JiPIuG$4C[Ldd%f6,S\r%[+K"BSntOKir+*dOqokJa(AY683lbuA"hBj\\+]b8#`H]$`oX,`0X8G3P5`dppuHJlq>Lo26Vr<49g#?pj67b`alX"S/rKlioKHH\r%i?"?B8R*.L4YEMW0d*>?%oWSRN=?=*r[%1@H/FGSiJB]MP6`XnVVossY5B(W]u\meK&#XI;-46A;2OSmAEn0&aXhgF0)j+'7HNuY\r%nb9PXLpg0h*g`(!p\=]J;p@8Q[nqd-&DKHW-klW15rF/9+n>JhhQWpRS2[4rCh;QIe#jdU)Lt"JanG;g92Fo5F'@bii'Y+J<t1q5\r%YE`MaiqiKlrH)=8qW;>urT>-rRgU`L;9^h;`LYj9M1i%8knj<]L6bjV%G2-B7#GZ%!+Sks<u,+tqW79]$P\_c*GPCA3F/8d8_aT,\r%6kT9O,]88I2`b4reN3'u,sDEZZ):<<Ls8ZdNrRDT%/&br#>S'f3Q;%r;6>FWi]J*0)e%l3n<))n\Ij_A:I8]`rAm!Impnud7Eb@<\r%]=V,3R'n')c.ZTr:i+_=2lj,$:UTNMm/E[RH<f:1SWF6koZ=7`BiAe3_=5`23c/)Bjq?h5r;#,5+1%S/,%fF@fbR3iQcR:+eslhQ\r%g+ZYYF^IO\aRIaC"SBOe@\rT><I\dI4WRk\pN?qSQJ7%S3R]nE&gU40mSnU]OVJI"&)hr[d#&)WWE!mcUk<B*Yh-o-ioHrlXi04k\r%T2c*L*Su?+H$>0)>C=cag_0^G5gKhgB."0'@;9=&5!]`.6;]`jVI$tGrcoqT?cb>`'cIbe*_"qB.=Qo8\SKGK0f<`Q$;Tk[/t<&@\r%"OOK#-`6\91r(1H*03Oen,Da..DC'V7HL//ih)Q(PnNi0<4M?8n&,q?]Tf/9SsYC1MbmBuM5g=)Eoun@[8-DaEGK)nZj<8$dXD(9\r%W2H+SI,gp]\VMlN>t_ppN7B%$=19#jg&(a2XH8*?a4l$jI(ehs[r+.b(M3iORpJ*O%!pnK"tQQ9h+23q&($s**0mBdh6n?[pbE=N\r%a2?egj+uDV4FrufW/b%]-[a>L>.3&'>nB*/T1e$)q<YpC=/@gD-Bm?+d,!?&lE*;<B@&G_Ear0"m^=)l[I!"b@[CmuEt3XS@ifjB\r%jksuXes<D`L^b!*,hX+!GH@(Gm.HMHkfpYnrmKQ6=c[:AMn@!sn*1@D_%K7&H>7AS#>9sAqo+#mn`)M#!CJdLh#;?&`b&TL!D09K\r%N`F_ocjaKYpbMDSQ%32(5cnL5k(?3]V=-l4Z+3nF%X&P1QG2X\ci$?d-^*Z5ZBmC->Rlhg^cotQ\>ShfdQc-e>^W's!jM=VSXlUq\r%'=uVo6VjK@Ujuufs3*PD<Gi=bWX%Cq[gKH(RkFr@H!V8&DhKu:20Z^E!DGf.;H#5k15G8ok&nr*f^H.=-0r,F]9=F3-+GQ?RRb*C\r%&[9_11lm$d,=ooK)YrBrlXTYN&K[4+CSuSM5+dh\mNm]Io(`clW)AS%In_T\l-=2>8EqK-1@k6WI,pi)0bZ[0NA&ol7lBkR8M.[C\r%#$&'K)kZr_(N/=*I<:Z@+l(0%.ls4n8bCqs>96uE735:CQ2Dr`aQKo"5n+L\aQN2=aB"X;W5gGioQ"IeT50o3g\C.7K+]a:R:bOO\r%g%\sa7tQlLGPdKS*TLGtKp-("V;3%6QC6b8HacMHOY?4'oYJIM>qkj*p3^@gDBn$qRkI>5;o#c55U.?sI?mFPo?t3a7_YNX>Mntt\r%oAVqXdE!+@\(g/@dsF-[fR.#\\S^A*j;@]?2EjQiOj@\#S#$&i2Y-[p2O>2#X_uG<p7J,^Y)aY3rUSo7q.+UGR4PLij\#'PgtQ"U\r%_77V#?9MYh5M`t(`Et7+n]in]I$BI+a4!8:F_ht$Z',kl$3]WF#Iks'[_h`B:AQ-eqseDYnkbTiU^H[T,7RX-,s$Sj145r4CQAk1\r%)")EE[r@[LN@323\]9E[[dFM89m?9u^.=b$R,nVu<A8AAVXBf8#UbuTj9T`4);t^/j*JGT)WDGX_?lc%GA`!p1n\4l!N"3*@hDOA\r%>p"c'S*&Tgo^^=Bc0S!5b(=9$Oa0Q5FZo8CHYoY\84<V1WoT;<l+&'RBL&qb7:;jr2S+F;':t'+g?;F6r`0hrB4Zb".JbY@?jA_T\r%CWi:T+S&4#E&?K:2!s"!PlPr-K(pNa5)p0#WNMSI7`?Rg7i#IGdk]$m'J-tGdS"T'kBlU)Ng?BbT%<_JSb=cg-H(eB6d(]qX068>\r%F2p;:^f$fgh[\"2pGsDFY0YMOgA*`cbl>=I=3[^$I?bNk(p)6FXne0FY%o=%J;W&IHDuftb4fU!4";nVL#R84#4u?OLf^l&/Zff9\r%3D%G-@#r!pp$:;]J95)Cn^)L=3$JZJEN/W[mk$]-&fW*39Ab"^]nNSsA])kVQ-4SHf,\=%B05Fg(^_=p13Z9V+bCl&)Q]5E&A]79\r%S<g;sQ.s3BY,dZa-mIRn'hdu=<M<3.$?bnoeB*#\1R@qkf)Oi;LuDY3I_9sLcO`ZIGV4h%Mi*fg[@`s]U0=V7hI4UD$DQDj'eIFV\r%'f>*mK"utar#lp`(A(u<9kgJ>bK]4QK,)>r0+;7)q5Yob=&Tc"VYgufGD3cSe-?^!]n"4hl#%B4=8%1$4tk`R]eZY"#_ZOZc=2U?\r%/+d,#cio%pE^^^1(PG4s!,3cJ\,]bM&TkisiuDCG"OI=)-Zg&&=DosfS;3XcWU7B<>e!UO=5Y)65o6&o;7$t9qJLbTLO";A8XV<L\r%'Yc,5@[Q)2C(6ot8']"F&3+lfSejFn&A=%Ab[!5C^U&Q:Ih.&J[g*tQ[ksF%([9)(-\c:%b.g;1>Y$u$bg-XEhkr'AmcA-U`'-#+\r%njmGAI6pt<&RG>=<44&fH9&-8Q>\8r1^l[um-a];+HS`'gDluLI+6M\:/8tr6QhOW$a&dOf=3kY#Ge[26Q_F9c-G8qctdOXH/Q1S\r%_)Z?.+8:jVgV2t<(H:1JPb[f!Q9C$FAm_n\H<qH*[3csL1c^lR?C5E2]SnXI&S$+6R[c\J<4=i:1&dM`+c(@$jbWr;`Vq>=('&XC\r%TB$=]H"Uf]Tp7hljIH>ADKi,`+R_1<,upn*G:)u$)=l('^VK_V11cif1D3Q>orI<p4[+]X/BPcs&;._oABQYX_Oqg6.`8njXKlB(\r%m3%QA_lsD6MGLA`_]m=-q.7Z%/AeJoKd`%,#/n-=aYa1kSm&,qRUDg4BX`c9bK1j.2<1ZXLMO#!h^#N%g//k97uA(aFTNZkeVIR[\r%<fm<LS&6W^<*]bQ]i-oZ2/E>q6cWq5?1j7c-.:u$m-o8#`N$A:,Ee&l*g2$uP"G+d0;XQ_Y!',tZY$hr#j[-+d;ZH.,^tVI>JXLd\r%jGl]2>JXK9;8nXRK/rCX8m:&lCYPhNB5N=trkMsB6mKAMF5A9-nYi"^i4^#ooSVj["o#\E6(P4;^)*lm,"V1=S9I)(-\1h1bSISC\r%Q!t!:I,eXm.YdR:b^"t($OHoE^@<o8oL]r3o<l6XSLe89bh)F&jHc]jdBLGi9RAJr@_Olj;5F\W"j^;u#K6%C@LiN"n+7m#8-<>8\r%nM#()j@U5X73H#(b\*qDGI!/.0qWJOH=+[BQu>(qG=;[shLdiWd!ZQnH4T/N]CmjF%Z'r#_u<5g@W^&qhr.EH6[FfZ>g,fd&*CNG\r%,Sr6XOZBs3"R5l74h3PrJCo?GEcGqT>L.[Sa7[[Rj\>;1T3P&0!;e^c=?posp>Mb&hG(1c[I\[Oq.o;tcttYSY=qKI\HbH2h.WSD\r%f@K=tlHkh`Asn;>A?4'K$k#/96Ef.rBq8_R5.%mnmG[5>a]+;To>O_b8^4qTho=Cuh;c1ZEAdQc`BPkg7X\o`aYR@K[Q\u(Dt'=q\r%=j_&Icb(^6TYY2'())<+qMZN,EALlQQS@WaLd(H9*#JG_]u@MY:Yp`/(_"f\bb'd:NBRKk'a9'-Ma%'[:sk'Bq_3Tb6iT+<c\)%*\r%X?o^9$20F666G4O>&tl=1TLZq*dssmRKs:m#@kgl&qE09m(l/^#Rd4/KARjeqp.aW%lk4;4:`3a%*"5i<*7OnOjJl44q-%2fQ!&d\r%IAj)9)Z5[9I2E4]@20c$M1:INj$k-Mr@p)*0I6K+h.TG-/QLM!3Ki'sP?h.3nA=;&;7MW*>XGBE4]c6QMgOZ^'F+5iL;53Bf@r5g\r%Kja2>LSG^WLh,eE]1iJCG2C6nEi_6TA\BUUH>'<(5PIu2oamZK!r#Lsoro6eclRmepl?'A@D6Lg9+Qq.Z#ml[U"f'r$&E'cLZ%J+\r%+s7*[&)h,.iubk>(m0=sL4>"/f\*KRn#lU45QB(t25e:M,GX8GZOa;8@.Zp!n-6TZb]rqWCiO0_bR`P1#*Bk<dDVYsmGN-Bo2-le\r%0$^Q7/uY!93`4adc$sn@pEL,QNQ"V5dugnXL)$>YGucH_X9=_Hpc0>`7cl":k_VTOQ&EOgVTQ3.3;hYJf:[V:ZK0/S-P:-3`eVUu\r%]:d,c]5s03\1=_Gg\J7,L2huU/[L0`Y^:?Pk^HtX_^Bcn)kYV_Zps]AmdsBH"'r)(;I8[KIl4X@>1pk@bs0R)#pj$p<CV/"^\qTi\r%kG6+IiB(1O'6+%k+2b75V94;@S&u&<`_$->_+pQC9.b5GEt@F5[!jU<A/K0n!EMjZnV4C;.#)!MV<0N-1mZL`;FnBIBOU#A8HKE(\r%RI:s*?@LMgT`'Y4ToPn7-N1%%gF+j`\EXGmdh5#MFlk4M$2j.\/Ofr,V`0GH_.(lLDo*M\m;,LO\F9b?4I(4QY,)p=\`EV\`?-8_\r%CZL[cMWtj^?717n.N-JS;SdG?fo_TEYp/B$nN\C?+-A+g]W8PHHKB\d[aZlJnY_iunrWGiD-jaInjtKZ,E!1Ac8G>@kEQpa)Ieg"\r%DDISujEu"HV2Y)6U=oq_b2M*[5R$<60D%`r<+,4`i[)shC+2f,3Vj+Emn=())AV2pHneU\!]j])I4n#ck:=(2"hm/4SZgtcQd(4o\r%l[6OGj;PeV&."%Z+JOXe&p:'E;5kX:N!u3Bo^^,.oXi,(6hKaq"9T874IZ;(jKDW:q/>iU^WBj_-@a-2rn<.^Aj$KZ*[mHsAj`d@\r%r\,86`Qda_kuWmFO=?;=)Hd63Mqc,saH4b.gXOu1=I1Y]T]N"WSCDVi-bc`,6+4L@`"Q>YrTm0/S#lJ0`)4hQKB%'^%5[qlFCt8i\r%_UR!</]DmO7UM*FYHZ[p)k!VsH<!ULh_aK0=QgtBV3qS=1"@'riZELd&8s]+[kHl7ZPFm,iWTS#pP$*gK0>%a4VlG!)!jQ,HV,,R\r%s7s'gSNkp\2-3^Pq59kNfg<G9\g`-dYMYU\RI:OUDo3t#Vu6/r8=3lHDa^:;po#)3r/E,s%7OjiDp5"qbWeuEAo(e`W!tP]/j`!]\r%E<V(Wr3<I>@@sfLZF(U/pZ$\e4;e!^fb7d.lJWt'F3I5!U,U-$m-q*\e3hjZZ4VK)7%kZr2fcD?0UPkOAfUlHq^lGW&%uUq#&Ze*\r%WPAso\.+.cnrACX!5@lYU'>AR^<u-]2=9N_5=0SgL6`i$YEdHRjF)Z]h1Vq[38)*tDN^O2Aeh5[M/8o*)[`3V%r(s[\rmKW&;])F\r%hNaUIB&4R?A9.Kb%8LdOIcNWM;B^$!f[WOtDC!?R_oH]p%N2@ie(d<&lJ^n%mQ14(j$k`q:l2P,1"D)X:_2Nu+)2P_gb4^K6bQcC\r%Aa`:<L3&\@^;L<_51/gcjde\+gWSV!&05OUD*L#k89tC:RoW.a?XLPMa^3Sg7k\WnfR@6TMuTAi6kZ012uQ-3FJ*D5\M%m,h.>tt\r%g3r+uoejFR5&Wfj?3PuC-B_??",KV$i;\dE?L2WLK7d1]hoIqZY4dgo`H0^.Wc).n#&"`ijrn@?4Gq[hd:aVmj(G!K.MhgLMMZ1%\r%eTr($DhH`=H>B][o$EcI2_K)`baoIqZ0M'VB3^6&l=pV!=Emk0/#aRcV27N\:g4:2-4<1_:]VSo.M0un"a#8V>o9;g$L%!/r)"%H\r%<'U]To*[p-:^*8Z71]dQ5m;@t]01`W*E5:Z3QEKQd6RqX5VG\GU4]Jl-E.kL&07FiDRHOUYF\O^:#;.%&04_8#AG)>1noW5[Z#n'\r%TE70UcA7JDJCE6,%#O2@MB,,2U4Xq=/8(:d6jH`YT\gq'd6VXA6-V'+cAc?GSZiBQ+?HHO%WdY+&>Ff'9biqolOo0?i,tuQ6Zc/:\r%B$a$`L?P933hlCWft1kY)d*`HK*pgmX8uac%P",]UA0Ba3iIQ=E81aeFAMuYYh(62d6Z;dMCK1b6.K.r843[tcs`dN88aIHeP[*U\r%KA%;tpPY$ppdVY`[lFE\UN>'MhJA,\^>Hj?k`J>pg&kj#A5)i/"Am+f*]o-_ct=-4SOC;;_.i5-O$sTuHBGm'b3#YR5Q&1<1B70f\r%O'SMDg*k3Ro/#4eZa>Va@)6$#Uf?,,^UJeZphP1I7W!W;QInk$J(%em+RJ`XeLI@-64pA#]Li?ue@i%-R!0]QX,uTg9P>6B<Cf^c\r%.1<sqKqq\pC+7&ba?skOV,_3"&[>MnUf:$VQ:S,E\u&e[K*\SGmNZde'ptuan2pQp$56aHm%U\qJtCX[0dCq2@GOq>k3rcQ<-h';\r%g9muYFu*5A:`Y#S7df).d^&N:1*fTTd$ge[BCGSeZU.-aL,4)k86HXG+(s;][g<`.?U_>H0!'-`/j^VA4E=HdA=hpV/MKAk:%Kti\r%:7g("IVE]ulg&UtoDdFTMe#7l]U=&bl)YpB4_Q^@)@/'2`R1S\VE-TBV+sW>8fdh>Cn7#_I@:-e3mN53cuiJ3j;>,beijMG%5)k?\r%'f]du?YK@"cbUe6-VYqB*9?"qGU>1bb5*\bj:ju>'Ju3/\H8\+W#@GnVgRBd0lRJG8[9=TDD.M*#MabW1S_Mm*]W7*:()9]3>rLB\r%E3^I&_(99iJQ'ptQK<X<r,;@h8TMU,JQ%Y:aq2].0lY::`]\lA&d#!#cIGSn>]$J=&LDD=,j2c`VjIO``qp4I^R";l/i*hV*$o.R\r%']2jR\UHID>t[=5&&Hc'64'/C3\bCHCF.2\8B%6fYG!i>+G]C3Q/BF'2ATX=We<i:oFuW?:PDSEL=#H-B(&qS\Z+ele&<[1gkV@=\r%d8Q;R0NGt0OW6MA>1u<#kHHu=#p=IBQT)bE2H\98TAOb<6,,C*$L:<P6,,C*$GFC]#5pU7h!8`S!hF2&U8MVgQY=cFT6IQ:gWU,&\r%s1Ig6`Y-ISX'"BGjYN2rSc=Nm0(3[e9=:*^0$>3an-6Kf_CTV)_jb9k.B;KhC3W\,0UB3)`<THG0VO(UIn!rMn?)i)H)F5bS9.ZH\r%aP=6=a[mj;N*q@-h(nP.Lkoc[o64XDID0;-?7l,"$m-=W!K.H<3!1#r2-ur-d@"\rJRETW=UYs1jdI)!e2JR#!lu/keMhg$Rn(NR\r%_-D\LX6e[8C<:-gRKIA_f9.f[&jWe'O[H'`hM'I1T%S!0&U\7>SO$64Lt";NSf*C=2^3C(i%6:aDe+!MS;A@A45K-?*G6FCf@sJI\r%4LZ<`+f4k=r?`qNQZM!L)gNc3_?p`Mf>p]=TC*Y0mn6;&0p04I>I#\3^&;`WT,mX:?%+aZEEZ1`jKEdAP,c<f4/R3'TT<,B:RpdS\r%fltQc`5C0,^lNWcc)52>Xt=>cKmFe?(X8_qJi.,hn)f]S]7^-rqZAWF;"O!E;-l5ldO,(S^rGL@q?Ej-d[ZDJ=XgdNF$]n63$[;E\r%GL0dE%`+g8,JgoNe1Wa>LSuQD<DcnAeV0'kMAG]`Wh*=;k[Ugt\Y1kUE'S:aN%q<hT5C^6)T1gEW%\Z,f/1(WL6=m!p^%'lK_*'+\r%<l*]On3?2lqkuXolC"j0W*B&2N[;6rWi0?+[W@flXpV<g4+tG_0&F$l5Q>>M"C_p-IeI.T$"O@8+?<pe<$T@Gl0#fgik]ZTFK&Dp\r%k%_&Y5&tE52G;?b`p*>sdR$aq"CE\FWJisA'0N>U]#RnnE0$f/S`!WkJ+kP]Zqdig6.\Po"-.p:*(e77qIXm:'h3cWcM?\fN(J*+\r%Kqi@9=#)ZG<.Y4t;)4"YcN32W))u-3*,s1b*4p*UhVqCs%(u<^>"5*HJbQm7BcZ/k],g9bHo6RLGO</6ET^RkBTBKZB'*g^LW&]+\r%lBE+TX:Ef7?dYcoJnK5MpO6JaJ?bQdQn_'QGoPRQ?\970#,BFW5cE)R4QUaK][5f$PO$^X?-i%+nM),J33<:BMt`6t<Yo2Y-]Je3\r%qH2pSs6TC)krhJc\?Sk6.Df5j)3)i=+QToT>5;^aD63-4?CT[ClY5D"jfjG&fCF;NF&e'$9"\J%+'sJ\H'nN&eO,`O$/YA&[r-A_\r%;:MVDq88FX_F4SZd9m9lDqhl]mA@XpOV82j)[JL@c.@>c#DgjLb\.(Q"*6^&7jjk=?UFKTY(pn2=>\Crl,:#5O(Q-*#L3I<%0qmk\r%G^1=]S+Y"gD7P,1h\gP1C8I,3EFB>W29GFAR@QXi98)OIf%Cr4/]L,=Mo(NBlPLj4/dahg^X%DK+1]>*O2DiYd3=no!gb5qM@h&!\r%(]p$<eJl'+c6'U8&@gfpO3qY-Y,GS(TNdB9<`Ce7-l<k`.Tdjc\mS%!1L'8?eA9#HkG\i4e4mIYVpORB\P'c<9BNQ6-\'Z<?*a03\r%_rNH#e%&l2k2^YM"Y1d@.C`(O]BS!BFg>icFBiS.EgNM"YjAnn_5U)k:)9#)'V)b1W+'e6JlA#/l4];l'V)afeE^Ykj]@U"ml&:Y\r%G"X'gc$-P=e+#d1KL%6]*e9MYc]r^tT6<lSqsHOXc"JZk8#?FYb]LDEDUI(<TYm's**XG0MtPY_9%"M&o.O0d]:[J&G*!8$7E<4^\r%qbEE-0`Xi6G'/ZYYdoV9;YmqTjc5rLi9^-I@<>GgK:8G"M!-HP4,(<6_(9W3jQ[SQ[XMp)He=5>`?S@?Ci=!dLNa1EGCDfo8ZH)X\r%.aOSgaa<%u]>S[7;e<?Aol[Q.458F9Mn%]OMQ+ceI$/+CG6bRh=bShS#Abbnrp0N)a':8k@8;[A`1+o7oO[d+3C*"tAl)]X`#5a8\r%45-HA0fb^b-K@ir(=N]4SY.M\-]&/]ac`rsS8O.Wb0+77P*g&UKS1m'-]&-cLF$Ld3H0ZpO(-Ti-HB>gW:I6]S7WI].]$]23Cuo+\r%PU@u>a_=S>S6e3Y9[:[HX/30S-7=XA;44_Wf$\jC/1/[gQaA:j-]&-C%jY^@d3rXiZC$+(W?j72?Y!_&3R]sd*g;o/j:m0&.S'mO\r%Nl,6@Zm7LhQ1laSMoeP"!\^(F/1.8a0b^DFA2-)u4fZMuAMH2:9G=_:N%?<R9BGZ-`+Le.1KB*_j+a6/Eb-sc8PD[39?UdbL^e=C\r%A7[JUa+Nh).uVN;VSZRA8Qe`I_9V00OVj8iNc&!&9THq!I2?U#9[!gROg:?$#.k^UP7+@.j/cM/-E^3gr08eOhf<XNf`gC_pNlL[\r%<Toc.DbKVeMsVns4Bs>G/U64_GWYV:(>_a?or>:uUmEtK_`./if.HCeS#.[95$ng]fBN.I4WBZ7hgg=(r-pE`[+9*/VUh;M##NTW\r%K(,]U4G[:B1&rU%pg[1Jh`d\93b&q'ip6l!iSZUta<hg)8fV\)X,0m5>)C3_5M'#,B\9:NCnpA/<LNSJ6r(h:qi[5+lb?s/Es]Ab\r%k:+LZ\Xp/&5E_-*PY04raN];988Dg-g/Sn>qMi]t8uq97n([/X'6=-D*oC=jOR&<-,4?Orhm2tmb6'`SUZ`#p9=BgNLSo"B1Hk>*\r%-00ZpD#_E@_#s(NHrSQ.VtpA\KNsl@o3V=EaptVe<IM-0^92aJi2Ib6M;f;mm;$+/6131$f(h<okMnPpWEmah'U%dco.fY/*8Rg^\r%%h/%oiU=T:e1/5`d%gb<8+MU?Ig-?LNKAP!INCgg/)qXU>"@:Z\"pK/NLVd5"`m8,EN#jFW(Nt?7-a_?ZF9Cr2q2($FtXehhPjcZ\r%!4lJSRiR*9TbMhn.cB>1WLrTimp#7]e$E4O9f.*QEO=+[2UTnC_UCs^fgGoIOepB"(trZ!V3#+/1tdLuei$^Q-5q>kdFr7]9,2-3\r%7IQZG&N$G)`n!#".iecD_qub6";2MQcb.:BkTDu6jT4ZZ1sL,b_/0YRC76,6dpOOKd2JBa[0@7IKAL=4Admhr.=nh<O[B/J#BO?&\r%Ce>>@`3K.lXK<j.M=XC38K9keb2.H5-#rjl^#]QrjhJ%1!i=5Xi%6cd:S?`GZX&.G['I7E=Zq?&q3=Xk3u#AYWc921S7'%'W)6fN\r%XI_]+SLu-,fBimOC7(*c5ZU\=Ub>2["[;olD8CoJ&IDDQrQgeW34RLmoIThL9d?h0C[h'rW#f_s/4amXff(6Fi'b\/0,[)g-bDNb\r%b\X):fo=nC>5%B"$Zs1FAJ$F$:WTWD_?_i;B(&C]89.tm02K=/US]EiZ503>@Yg/siLLQie3P`L4e]lA\-JfU?V6UMB^%W@[:J\i\r%f8[;f+.>,1PluPR1b+Ecm&9QXKB9:j*Yf.+SWc@r#<UI6k>rZUodA;s0`62[*)_0UO11*4hJRan(&*/>I\tttZ\,uMLu(l[=>.2Z\r%0V4T=orr(c'2c06h\pfXJHqbuYuMtI;)GT7f30`%GCLaKTPn3dJB<P'"L)COf)^Y[!jI<T],^0W$Zrnh.Sm)`(GgM.*Bq?^/@3?W\r%O9e(N,QfLN_$k4'-So;*`a@?<_%^cGK7!:SU'XW");MBOTcb<Y0*ojI.!NF(TInE!$iUkS6YKV$b;(H"I,C3S_B$kY%\:D\\@]H9\r%GXt.u\C!lB"]f%a"uj1F78ULH\)nE*%#%nXW[u?M\-qs`@1bo(E!Q-('L<H$?j8RFA'la\jP4lJ)^q^JG<OYVQ%pK:+1TG2ZkBJR\r%[OL"R5R+^NZ!'Z4[dYo(!Cn?L&]si+GY$4b*#MmHQC2TFg`hUVa7<2U)/ubs4gAd]N7u!X:jO50f@F?V_(VSs52ThFYoqu@EX`5d\r%'F+Z`N9+4ro6A%(eD&lY-1k>9X*Wd4Z[q?MD^@&[`mCm/qd&Uci?9/YhBj>,F?EOoH]CX/Dr5un$i4FGB,g.>oRpLmN-M1+!0sdB\r%IT<[3;$j_tg<F>QTNs.BU>AoWON,AB'DPQ/^;i3U!e4PXk?#5uXE+.E:3(@$GYY!=nJfj,[itVU2X+o;4:Z^F@<rj42.\RR*[f)e\r%Np4/`RE&ad.O:jBq-ub!$;%4a*NKaM">5be_uh*i+2S4S!8;fK<!#EO`9E"MSp_LT&De\`E;^?G)ZmY&@eq84:Ru7r1A<B^oL#.K\r%#PS")og;'0NOem/:,g*`rkbR5F?d_>LE`uFicIQWo-1.Uifnmg_92%u32bQs=\.e43$M'ojn2!2DMU)[_bNe]B-\lK-jfg1"CDAB\r%pnik<0I<MDZ8o[#0H)%"S(8DM/2NC]/%$gXDgML\V<@\lB/<?8%g/qX^1'(N<;<r4\_!L1b/s=Gq)P\T$(895m3sM"L&gFhP0mAi\r%L3gK*.l2lG^`,bXZ5nlI#Y#uif-U>,adnRU_i`f4o`o0@h10jr"%*(\7&>[WjcqG0Kja>.Mf`s$4C"iM'C=^&;<m)N0QH@pf=&T!\r%,_8j+mD1PLY4.Z:7E'oCV>+9RGHnJtH0^"F"CgVC\Y=O]0TDo]lc5!]6e@"rVA"c^!tGV@9IGq#D=7%R%Mehk:<ORJOgeP.$/RCN\r%o-__`qs*3"7"MbjG;ghqX+JKN]cEFVns2;O3G?6'oi<_Y%i1<FKs4kY5keBaEF)iLj`m3n[J]pkj(#cKh6&&RTVZPjp*>!1pmEid\r%HMde.T2)`8H'i#%nBPi0QuiO*AuXL)o==1]!Y40Fm^4)W5%EGeMP0s398SiC-D\BZ9LqM%7<!__Xd70[YH='^aSq@9%hk?$)R[>5\r%cBtu'=1T>#@`iJ%,sB-J00J@Hkq=dY>"A!6Z)!dUmk;NS797R3dpI^`X/qOeVnWAHUU!d(Sb,::hj9W!l=>PtWk=QtVnW@[ij=qO\r%EW%2DN1iZ9]T#PS@fO2*A&oN'IsFa`j<HPDp$)VLkci:Rj8P3%rt5o+(YiATNIF,Uf%]Y)LI]s!?P4mW#N:d\p2!fP7+1TV(.$jj\r%8c>K,rUOn1C+J20"snd-m<ZOEp!_^u"sr3j7;0+[.G5I1pk37kP*0,@6u&Z:=6H$!ZX$/EXqld\@(%RWE-\fm,R<+>ib'h<\iL&X\r%gj-2'lFo5,Y'=\HV@=#N"8q"'k."G9[$LE6XX-E$CkKV4&lLL<.,7[Ug/`uqegSCf1Y&ElD6.*A@0$/W=(s(;SrF9Bg)]RfSt>PA\r%p0_k7D8&+lUqTn1jUQZPW9?tlS;0^/6a`f=h0GqP:['9QW2)7L+)Tm7>slul8/)&u;ajfgc%H,u4',iM!9mXLb/7i/$rs!C2MN5s\r%8`?DLp;XdO/3I>gPg2`J0GWPg2A-/nWc>:c2A2Jgh.)'$Ca:nX23TOISW-#<0Jg47PL@8"1j6oeD&F8&>p+8AM[@^=i$_%sB+pk/\r%pD(X"ANd_TCTLFMg"H7^jaqsO]j!m)cZV$GdrPoMqu,]Z2&g-#k-iXKZ=R#0f!4S2Cob/E*456qJV.GW^t:9FUSTOf!=kSdCGNl(\r%#tA-4h5kcCKJh)3A+Le)F?K3.OH)lMYq9%3d.A3m#$&qrWR.&=BPZ5_q_]"F%I_/&_m(r3fK`S-`3D%!nP!O2lc@A%hhm1j3M8<e\r%-"W:AG`!DnPb"mhc,Ed7;;[3VDcRc?e`(8.8NeCf[5aTYG"5!#Q34-1Nn$E0bn0&1q\?8;*6k4Vnl1OB=kmOAA"hBjM,>k]6ZpbE\r%/5!;a%Xk@rd4>rcWXRG;BGU)A>,l.&ZtaTp.=,<t^T/L-+ubF$RU&CO8#E>Q'e\%rBGR81b#0h*jC1]\,n,]^?a]g0=TfpKMkaDh\r%<M!rF1^i1+PGDA%blUQR=fMZ)b"l9f_d8rdeO&30cSlXr:T851:\;8%d?20r(US/3iht*_<tO^JV)m$Sfj(ar1#a"Ai88cFW[4?f\r%lPHa7btu.[3m$!.pVsb6D81fk^:)68=tNgV_#%;V>\HZ2Qp.lLVk"k%W\#`5PU5CGHplEQ'U?YjG&d)0$E&O/L6^6Qp9g153DQaC\r%M0cm$osJ3MXJh4&WisZVg5?:5U&*Keg2aX.c+2u\q5Z,T)^McZ3nsFXD:%/NQbVgC?Ce-ral;U.-e7/['s*)P<M./<k/8XVK>?\N\r%T>M+?C(d7B4U#s'a>6uFm;ZWY\DaEoclP,HLE"P$#jlVAEk#g*\%(]2m;ZWY\D`mkHmFZEi&R%hE.]0oL^XH^[Qbf<45Ab>&^*un\r%3S_C^EV3EFaA="-;ci]f&4;"J@k2;Y.\"uI#1FQu4`9JZ-<M,m,_qlBI1s_!+?A4"a[dsMJ`LcKKJO<5%QCoo@MoN8);Rsp"d6dJ\r%>ku9`gfPS70ZP!dj2UA'1NO0t1)*Eu<@_p93=\!SQR%`f&<8pj8ppGP+7riLLbEZMRtIeTD:$^tA,QHlC\?\_StC+_QG,Y>(!qi0\r%S;5ZuRUN-#eRPr(fD?smI!N3$geu7Ma,D>X4'Qj'`Ql3I!i,O"3?m^4MFnRi^3/3_^@XNKa5*U)h`NHr%Mdqp8\Fih8M<Mt,//HQ\r%9;.1qkF./<?U!_.mP,U=b9t!MH_4/_[Eec4^$Ap=*,""ri.D<nO@iuOO:(4]6LQVXd/-Ybs3i3:`HEM2Rb_o>q6S]@c<q8$q71XW\r%iCg*GH!WLD2\eX$))oXu&2^s+Ee$YlW5tBG.F=?Jg<D0<SLN/Ge,D=Zs"_m1&dM]kDXi,br!NsU=a`*shWEr*"AqQ!HN6j<ckpGD\r%X^H?PBFH_H`Tlo?IPK2FH*>j&a#tb'p;!HJ6pU*).*WKJliI)<Fq"#lPXqp<Ym2Ni',,]m%3S!:(Q>C[D(@FI)P;&?TIVc%g2K:_\r%Ne')&GCFIM]6Qm9hEWsYfI3o%2!(aKU?-:OD,Eha1W'./=jUdh,q],l\Yi]WX=!rhB0k;(ms-Y^Gl4q"HYIG)&`=J=YfIE'0LXi0\r%&Re&7,Qh'r7ufaJhDa0lmnF<9q"2s&MrMART,.912@%B4Xt^gO4PHuSc-*qb^aJR9')m^DjNqVL"lNmD]f\OjI1PX?BX=DQ*m!Bn\r%-Ml&PAb\psggacjQbQI2NdVL3&3b[+QH$agiYQEH*&dO4NokElEjBfeX8Pj7I"2GLg]($?5P?#iNF2MmqF,DY6/6Y:-QXFQjfhP6\r%Vk"@^?1rP[oj+DAb<Do2#U5R_IT2bgV,,/S/,`_ndLkb,.EXb!H$Z%E<][J1PG69"B+lK>GuBlPg+CO]Y_j5p_7OYKZ-%q?0r+1d\r%E=X-6cja[IK()KJFQ4QW^mcGhI"3>O0[%?uI"8_ToGr2Ei<'3;KAEq!i<*jf3c+Qk6-SQ)UYN`l#\""jC8'$bR$aR?Sb3N&<mmSu\r%!sC=\l4*jR"2m^=1*VC+>N7NZ5C@u(AgCMMp].S&/r9lV+G^n,jq^,l&8l?t`<:s#K@1h1Ph9qjfS:%M5!TZ8^qTVt&"mjsX!lRA\r%2uPt.E#9nVg@M:c?,>R-"Iee_)F<?5YGYJ6#AoZ9YAe9!`jgd7Uh\`@@qI\WI57_Di3MkZUS\F.SiEIrnR/bp321W,p$.i@7KE4"\r%P<I\>4d@5.#DhREf]O%^5!VLH?p?FHn,[!8"89te]&1',Z%`c#d0!K8(:J[i)U%:*2e(IrPt`n:&+/4u1^B*/h_DF0EN(ZnC(m8?\r%HM>k&fAWtdH%YE<nb4`5.Y$!rd+-NKd^[Vl^*]2*s818iJGo?urBogN3iF\g:"^;^CZ3/(L!mD`HD"@*\T@IuSrN8s$(7_DacT:f\r%IYlc9gN$h"I6ja*UkQ5e67-I%=e3i3D;Nd*hCD2)Y!Z,\n?/;*eE01Oa`@VUf)V5<c'qnb1Pa(GD;Nd*'Vkii7P3ShhMFpCK3CU>\r%Pn18:L)4?tQN$,"!hRmSi;JJ+4UPp1-QPptL=)tHZmL-1C@e<g^aU7hR\6RE-rL++:ePJUn]95B74m>lQh%WCq`.5i\08SAE2pq<\r%[k;0pltk)C&hZ@Z]+,&'70U;>'[<?U#ZbY>l2E^rl9Hm!RAu!PQ!d\01KrJPFL54RXJh[gXh_jUTr[Wt3XU(!03/D(r"g_&2)RDg\r%d5?#a!a$b<hrgh_o2<8qhniOj7_p?JleYa0[Ji+`DYWMR]MrgRF6-gkb'i)FS^+"@)0?OhX.td0g1G@5-Q1]?r7/u7AG9+pEukM^\r%Nj+B`ZL_c'l>Mm6^UM<u;]kp#iZIA^2;IOlrq>TbBZ#S$fuh][GFYXDS"'0,k?`"5YbsmCl%fkm`c5F:,qo-mrq>Vdac#0\h)GrB\r%&TJTdB68RTS*XKfhd9[H+4KoQX>?Ttol6odMQH-E]V_SSf>4TkNt_jU"/;jW*fod%C0/)%fFS98KCLlE&N1o9mbhtNK&3&p2;O5o\r%2C(O'*_%FIKkonVeV/*Nc,>.GWM?q)^M%`$-9$kH4gjlMS%NU`A"HXjJ+kP!kGX8-RPqt%S&L6VL5cXaNj;GT/@Cs<Dt&<ioLJOG\r%K>>#)m\V52gJKW3EZ]KM\apqYE5'qhbl*=6e8qE9m0-[V0Jmi^gki6\)4\[A-0](rA<`X'oF9B4nVXW1fIDd`j4.9*G&@/d<VF2`\r%.\"1g+4\_F0.5-!nQ5nIH+nSd^U+03kL:N!rsR(<$0tQj5OF5uiM!@V,^832$K#'/\,EXsl_i<,Bsr\g=h4%fjJC?*5*!)oQB\b*\r%\'9Eha((NmVnL_fVt_-f05hV9nWsu82]oeYm^Bk_nCE00AZn%mUNsXap`0lidEicVFL&o-TX0^S1[Z6WH0dYMG>0%u.mLlSY8]Am\r%V)).\Gq'.<L*%N'H(h+d:.h(hrJ^*Q)=h.8hlZdlp8Cj;[T:d_\L]Zucd127eT*XNDk`L=??Q*&!d](@SEC#a=J)X0WhE&h6(C<t\r%2f?VsG99B[h%l('(*7S3TNn$m;qYDL@p>_UYMa>V#A?UW+OOa&RA]j:>u/i"DkMlcI!0,h>*ku)Ua2@:b!+IM8oQnAiRg;?CDrgY\r%bU)5sRTU#ePjU3[C)NQ$4%.!2=bQo"80JmIR3E@Sk$;r%!Zja<jeitbUBLn6RuAQ^UV8/.h2_uV'+Q1c2;FQPWtp"_VCqs`o^rZu\r%dSfJT't]gcE@VQTprP5\PX>3fBWnDs9+'ZTnC(uBIFoE4B;Q#fO*eqDI]HXsIda/K[(%i4ju[4Q89!Mfo3DoOeC)BcA*GG6k-_5%\r%Ku9He6,00pfGjijXuQ,r/sM'Rk5O/\Q/e3+9:d-j5bM:\aXB*:f.s*Kl#G;,:,$'QT1X\;ZaGu4S"OgoqDKFM71]G"_0]`6GHDit\r%q\D*&BU4sA$bajU?Dc=+D;UN(f7EoB6U=\`4urCU<*)_.er")cgC9%BOkMkm>pMrf=,mAK1>+^K9]'hq+rmkRkf^<d>dIPh5r24.\r%QYZm%'q8C5gVlI-4_SDIY\MuX3l.^],9"qrrjpq?>OU?[ZHsF%GBgK#$I-_^]b9)V&kJY4,MfUcUMm?R5MuZoU).5fhJ9UC.5Sub\r%%L,G`n9+0AQMm+t-:'1"H:%(eDL/Yi6EpBh3):?dC7).VELne>>&bCudfh@n7]b0(C`RHdh@I>5dipn[Ge,ROJiHPm,SPZ+Lo8FD\r%^PKt'YWZ8]PEC\!$&>Dd*"YFEA[/.+Dj[9@XGGm#dSi"+(<U(l:36mNnoRI/i'LSjG+"/)8tkVLmrB+<(LStkKsGrQ)IYA*KsE!(\r%'!Y8VrjVnmCVKOs(!>NsNh7,MKsE'*nu"<G+q%uP$nBBk,XlrRQR&;%G/D^>@PL[9"#j#B[6*ZBd<U)M%"G+`6<X4ZC!mpc=ITQ,\r%P(f"p$]o9EMX"Xp\cT:j:'"DsNTj%QXZu#/5'F(bgr]aR9@):tq(,)Qe0UTaFV&.fDI=IbUh]\WY?:-rN[&ij%qg*2*mr$RePB9;\r%CPhX8PFW)feUkACD*+)UGT`kVf!]Ya?;WF_ZM(SY)[sF)WZ:D2G_HaZ-2[_QQ&4jjrL[e8>2I3"9LV7L9Y@uJKsWU0FNOMlX\@d9\r%U>T'!6!^erk#NfgWIJ-?rjFT\D.O@3b+pu<romH1r`ui0F=S$N/m5eX(=XA!\n(3j=6N-ieKnuQ&$<sj\n(1T=jZhulB8Q3BS7pi\r%Fii?3Z8apO:m\8saoRPSW_:nYi*j;FA!_!_1&/D=V<2F)@`csR&$`Z?W=V_Rf&'qnqTCiVs06b_9AJTGi;_&33!4%.T9'D?E5m>V\r%-UK9_cE-MlW.96=-_u?(7"mH8;UL!hiSE":hYS@"9e9"54(qVW:$7f5=W&BaZVn!_r415t>^`LN4b'-ioQUG&[H!VIc!fb]'%+8I\r%$d$rIG.H,k27M><poOj-;Pg_rF]m*L]j%i)7;UO*]Nj?eBtSN845RmJ@/96]r1_V$lHcs_hV!cX!fn#^a01q@/M=Bn##UR$L?["l\r%!Q2"^!:L``6:>R"RXO\JUk%XI-h*X4lSigu3+/+no``5e%)Uq]NT2m90FXRB=1YB'/2+:W:QkNW?bAgQHE+t!=WVm+h*#HE^$jcB\r%;;P=Pp3O!<2/B<;H9om>Pk9$lU;](:Q6kt5*A:823b)Wu(O)$KFFQg]DF?!>(ZZEl)fYrcMtnog-kGbr9U"R,(?P@)gp)^IJjjsd\r%hDZ3I*l7rC*8V/mB8gm5TKg=ufAa2c9249ENOT+NP,H8\X#!?LTGQ@<Sk@$DdiU7**`j6h[<")Spn^p]d,;ZjL5hPp$m:d'Faj-Q\r%9<T=J^6G[d"#N*Sbf14J5f5t`f;aT*;j)-\3kB+W76X%%\E7E,aTVL_2CYF22@taLX?ffo.DJoSlf)]651FHfiND`:)=Q'FGeo+4\r%ntn0Uj;.nh-M)JDDom5l09YQtakYdKo=k7T9@jhA9:C519'he>J^a*"[+=]*Q53iBYG0Xdk-CGG]-$5>*^>eo:J(YeJUC!882q#M\r%%AYA>d(&/+B>LJJ@TngkTWX>!dD@E[U@WI!G2+&g]qF6q1;\Vl^]I<9e!cdN=6E1a,:o2`/<'#NBnEUGJBU[m&IZ\LhRLmt#X:R$\r%aV^2/J1UYu`4p%Up&+bK:(>:K?OA',2BXe>iFcTKb#YPX8Tpbh+R)uRRZ(5$Fh,n1cJ&T]aV+r>2a0$&B`paiMps+MRLHCt"@==T\r%Q0:&-K\;N>-DO*lo:sFcUf,WOGZ&PpAO:&c092)X9d[66a.gZqrdB>PLD#SO1,;Q.4mt"t/0msP^e9+dmbXEVes^(1US5frd78n'\r%/O_K6Kh^L'TueS5,0Gqpdt9/;dUY''HNmQY''Qs)Qh`m&\djOpcjUU#ro*418K<BH7bA3*%$mXqBT3Da]%Thsil1amGVMFZ*9P5q\r%JNlQp\K<I?UqJ"6#Ir2CU(8mm+:T;)@h!#)W,5<;"94^5Ys(6&7P&=]]U323lhlCJ=L,C7*_WB!2mgC8hTgH(_%b7ci/4BC&ko!7\r%7iftk6@pY.a3Z&`q(.Jb&9\and1eo6!mt4G5WChC&r<[uX7hW,SDDc4M@=-1d_SE=rKUnZiU!JMU>>^)4c(B#g%!FGehOGgm!(oT\r%>gMEHfr]]XYAeZ,=uk^I:?q[Dj9(j`Qrn@#,RY)pa/9n4,(t]WA'b3oA>.uK3$/^&Z)Q^KdIRAj`>qZ4Hg#iBaQaHXcAn[QJOpOf\r%cFu#;/8<ATb74BgH#u;Fhd:oP2RE4G>OSbDrO2:-a6WUG@-$n_bp=l_Ea[7V<DBZUB4nHrl;&\4B.@(@V6-bgqJ0smZk&X#?h7PC\r%^dj(Oq'NJ(5,(h>HT-)WVKQI%+^/j:20THO`%KX;#gltX9JM'I'AC@,D24VFIlO/#+o1^ms/TN%fh/&T9,ldQW9G"XfbN!s4?]6E\r%Rt=JR8k@i5FEO2dT`f#P)`4i69"SaW.kX1K;3Qf^coI!q"hp0t%j)2Ech$=*g*>n!8CO"9HdGWJXJB#q4i/r87M^>'ADmtqW:S%'\r%-t%oc8AR<DIPBlqSn<R'^*!U9qb^bDE*fq\MD%L$T1);<6@@7T"t@(&"N6[_8HNOc0mA3`FAh)0#`(2_5.\j<EK2b$5`4IU33R(-\r%*MiU_8tq\"LX_M9\AssM064-8j<%l,>Z7O=MIVUUQ]I16V@9YU@>Z^/dCfkF4/C.79+[LL5c\-BreK9\INTs/;sClBlNiq!+18lf\r%QM1G0\jis,?67,OlIgBmLh"Y]*E+N%OL):Ma"^RSmH!^c=)AItdlIOK__-Vn'e0&YGYS`u6m#`KP^D1([/f;?@_WVo0+Q%Pp1lU:\r%[m%P=m$M8FL!ZC7bRCcJ69)60OVsV5$OmAJ#i3U",KhP6;Nf8L%'fCjOrR,e,\jT#;]CFL/>qE[d!)0rL>ZW#)-K_N$\8LG@UqJ&\r%04aDs7u8dpi.Z8*.8j\:"YU"g11GYG"YXD^!_0/MU>U`u\X8X"@crH(X3\]mZ1C<O7V64dfQeW3VQ9*D/Q+hdhqK#E8rUt*4"g^t\r%-#Sg&b5W(`EhS[Xc,mp0EqobhK7Dh^\O(KKKf"VtJ.&MD2orrce"4R1jpANt=)rpu^46S=:\'*B^&ttmF+df4J4nLSZ8"`5]TAho\r%T*i,@(@u=aGp=/Hq*(ckL>`BJpb[K&0B=22Q'sAe_N=m"+-mJhWlC_uWoQc0B46NsRX64?Dn-09,lMn0K#c8R/bS*[el/_`/dc^n\r%:rX*\NX(DX5tCQVL=D-N\J6uIRV`oSkY>H_%(spk>1Cl>2D9`t$SsTWc3kL=RS:p:4"l9D@a*%-4"j!6WmEFem(AE*ZSOt?:8`EL\r%YhJ!;hN,?t:+jL+(T3I`cO$^-S=ND]4su3!e&dN6_C9,&SPELuP`lpD(d10$AXNG;S>.G;T+bDK3'3\DHqrn:E-=9fq4'^H`n0JI\r%cR)LO^DDSN;*[=(i'9P_:L%9MT[bnbj)dU82-_7Hp,VsAo'f?&5#`+,(E3Y$^a)AT"T2mnKuF/r@\8iWEQ?&_jQ1FaeI>l`PF'T%\r%4YNN2!?F?OSUD.g#`*C@4S?,Ed:6?bcJP0O']+Ck^7I`qJUmOl6'IFr>Ac<)"k]B=JiD68eM,^O-+/]b1:5kO9.=ZHca1l(EtYDV\r%C$eZ;7jO-#U_`<#:XE;$ggaqU1h-O'fUW:G$`6)gFshmk$M(i"YWEGmQC^.\h<m,=`Q?6ioXBVMD\)<o*o=Xp]_m)#n'Lt'])/sl\r%QZEZjSCYR@D\)<o*o=Xp]RP9Qs7Ys]mG\#u_u&?[iN3WsNP#/AEp'7mG1rpnYE)nS)m^KcjC@d9c)$_-Os:m;W+pT(R4.24;TfG?\r%'j!+C74iHWp?B$L;FjgNRbP+-HXFKSTD9MVWpqmEdZ+i>B]m"&kDh[(<f/7'\)tlg%(ZM,kO@j4LFqB@Mh#.'(1RPUo?#OB@.<92\r%?8GgLg"00R6\)B>mMg$(\g&H:2g#!JZD%n)9&?9-mLL3jdLX]?.&mYIR]<__Q_Tt&.<PNG!eK&"$R^N56=;'f&VIkAErD,p@ji5s\r%ZTgKo57'Yap8!JpA:Y>MFBJaZ;@#:Y"Afrsbhd(H#gAl;oQMUM;F]hdX]9])ns`NPY[C/Hgb7jCkBEF_j.,$JSdLFl>bt"8A>9uk\r%_/.4+\rL+:$2/sWr)ACW?.TI1a/A`5/KS,"&*?P3:3tXP>edM2.Pm+^V-`O6!)[M@&>Hk_411bo9<[c4\kL]hhd6Z-1mZ>eXMg/8\r%^\Cu%E9;KR/Rb'8.)mm@<71N'2GP.aLLshogJKW3EZZYr\CGsa&.[9U9P#S-RI]:[;_l-k`$9RoZV2*>rS+G45hqjJ#s%(dh)bDQ\r%p*Q5Y3[uS6A:\>^UU1KUKKq>_))8pp&828\m-44o[D:DF`ib7_l[,af$.np'?S#0-DjmN:=-=p<I+<0-<a0iUMe/CC\lX)/Hdrk4\r%QE8oUG1@=4kpci?ARI59c75<8Z8dbuc75$0o#<N[5/0WT$%<85C-2bJ7rsou!\P[GE?-V1ebK?u*s+/U?cR[;4t*QKqCY\]J;4D=\r%X$,(J3;_1j/C#9ESmLPXk_o0oH\p_[)/O]7TkbC41#?QDDoY<SNQuZNpD@*+1Ckhl"lIVNfG_")'><J8g2-\iO6]E8r*;52bGMjZ\r%1&nUqhIAAkRP:LR[Tge`Fu8u`@]bK>b&Y1ldHrtS_(uM$<8WUHS\'rN)d?Rb;27"TEI*g\VSH<Q0q@5:^%j@8P<,h4B4-BKS^,,:\r%pqp#/mej&`[;nLDJ#653h-Qm-LdVBl3VUl0^K>$R'oj0jWJ'V);r7$*lJ=Y>f"geI];rOS[cF2A(8DbA]]NPSNE%H]6-AL6/qLo/\r%L(3Hb(I7SXk?H^cGXB8s#;b@s[)S/sMg#FY`-gft5k60i&PN)kDWYa[f?0Cp0mq_X)]5Km2T^%)K,qO2hu\5JE6omeg.*rKmW".o\r%R?9m)Q`s8^lhYIl9,IX+gd<`_irqg;"T:_(F?r^Bdksh'5H:g(%pkUM4n]YtKmZNL]o-_a)O2!nXo<34NnX5shE=-Mj^DQk'5k_D\r%g1fQD-;k'2g@oU1i;C0Ybi9Ss:Fo$.l@-V3^Fc5XBgVL%$2\4Vl+.X[S6ME.&[HUFq8h[UN.jiS@$AcB/KC5s3.tP^_=BudJH1p2\r%NMX*sL9^)[q#o+g^n6+O7mc.(/,l4RKR+,O'a01V&F):6?Nc$K&F):9?0R(rS%A.G1"W*\R0A?4lT\h&]NE_K6=<P,BspKe&oGRI\r%s/gTo^@d!lZbq'rZ]e\m=10kuNU9+X8kgpd.hb4S&L'9uoEI8+&e5.lTcj5B)Cbe3aUiVJ"Q2o0A;HdW,t]p\g<,*LmAO)A_usQb\r%aftF#P[-J=,q?g\bA:`.B)B[bnQqisAVoH7mU4oT<\m0<BW![<8TNlG$Vh@OFMj:&DcpO./GUVm!>9Tg<Gc2o0rj3Op1c7rZ^/T\\r%!]s@H:c4H)%qAe/p>NG_TiKOglKEi1f?pbP9U.Q`&H#^fZ3S2+jI/onEDT!UGDt*&SSb<r@BAY]f\;hP3bgr/#RHq%3^kPk\ur3[\r%K8HS'Sped^par/F]1a9"%23s)#9<,V3LO\1nbudOVkChKmV+WuVmcnNHAuKl\kjdVqM=1JG@<M+B0]g?!s8=ZR`bEd[#+t^m!(^I\r%3qq2;(5lta+n'qF_T?>(XgnZ.&PaZp?$HME3LDlZYp0BpO>uVRZ(iPI@:<@/P1UAFbj;Fo/@#*MCrC)E_q+?In,;/`o3sg=Fhrqr\r%R)]7bF^)5A\mRrIkUh'nl@Kan\GKu,;`Cu%rboS]rG`&@nd6:#[c,Ur8[\#Q+1@iO\qA<2RULRNW,"g#H'IrBoMdmCcbFL(:&2=o\r%HfUgrUn=j))=5i-r4o%r<oF_[[I<S!@X-MCJW[ju;&!Q*/+J-3$mTX3n0UQ!UF=23:de"*;<ZQ::na_\.**h.]cVfcU*-4!B68'h\r%Bem8JkpSNjl+fm45t4-JF$r'H![(/n)@/pH,J,r2=ZW'`'_LraUn]>7Xq[FeU*-4M?=,NMMLpeMjN)EW"W8UTK\8#l%gk)7b(p=!\r%7o>@FT%[&7.n7nNUFbmHOA^1>F,5bTKrT@\#:.kLA[MH0j*3@WY@e,L($<<R<7:(/kuh@7b#!;8A>7klOam6ZDIF$k6j<59H5mIo\r%Q=)$hW,?gCQA7f-,n1N!q'X[Y`WJnUDoSRUs+&Q+Dno_Q>g$9tZF4a^*EJQVnV<[fju3E$@CWkS6p\6+6?2u?a+kjtgcB=[5'M09\r%61iRLPZ)lD@/$O]6"">JE!PX\3\8eN9u&Wa=3=5gCSm$=P@ZC05O_OmTedI_Q1IhpAUsb`#0k[I0OMl*N8!$BV16Vs?f;uYZed.%\r%$RqTuX)D[d=7ABfhARZt<V>dVJ$05$m8uQ^9G;mdK<+QE*K=DHc&V7FAE1[B9m8\_s7`G]!9D"`rh8rl?Z)SuEmS+m5ZYi^&D2tC\r%ob#U9,(f,>l'!:^a1+Y4iLi@jWKjkYWpP_V]H0&G;j\s#RQt.nr#Xlj>285e3]2c+]MKEi;'\7[OU?.9Y*3L)hh8CmLljsSAU9G+\r%j;81Jn\E"2Sj<ud@jEsPg52:TjoN1_2h!N5YA*bX!.8XEo!I>5J6l.7%o:*g^re;eC7OpSnH<2%o[:DZgqad]2P].R!dkU,$[-h`\r%J1jMXs/XQ/%-mI5i60u$`XeSt2t?,Ni!6ti_rU5)7L?:(b9J#j3#g[MW92[gLG2ct60ld"Q?R,I]g!8a*IXBsb&tc&WZ`p:g'1e[\r%n4Q7n5T[cTFu!cOFh`n7;^ps>l'Kqi)H_#:,$tE-al*jZ*/55)B]e<@!/hEt;eiJ+^\o3*:\%/-cn(Qh6H921K(fkjTNNs7[uZ!g\r%<DU:FpQc(G%DQ8;7=qVf9V;/$i(OD5K6>BAcDEl`oJj2/l0?L)^t<a!='DEPoO\;e:VH>c`Q0PfSNaA18o-Nu9t-;Wd0iW=Cq<!/\r%-nmR81CO%4(AenV0s2L`(BXjZ&UZSm0*ViV(VUlV(B]EK@d)@kilH[rI8^BV&-KhOA7M;eCa+AQhi`[gWYQ5%3ECT[0FWRf5Sc[p\r%(i=Fd1`5BI<XY4mK!%lt%)X2]?hjlB0Q("rJM7M-%:]p757DTf@&E7X*s^rIJ>(LKP?9G(3Di^[2r!D2:S9!ajRn^IisK+RPPI<%\r%#[4^+)6Yk'Y[j:AL9-<:)F@gf1UMlflk^%$K[kF2O4VIV-0.Jr)l^sGGq6XU]W'@\R,OTr[MY%gKscGVG8"Doc]ssQWS`'1$h*-t\r%YFc"1#cLJ=+bR!734K,'@0G0P=$oD#_?d6>ZTM*AY\@mB,SQj`66[W_D,1-D[[?srm]YqYk4**X?]prihQKN1$2Z5%WMf32ROLJI\r%Su9iO!tk?SApU&+k%*1&4N?04`F6U._?8Tt>oFcPL$(&;;tmsj$?_9[])TUD$hZc!:C0s'a3$)HD?QIaDD4N$bWcfT5`1tR&K.GW\r%hp`*5-Jlg@@#?U.0f/4-^_C.;,0A-kM"ufo'UU*"b7i)78MWf'_T+GF3]@,;$f3=\P9@iFQR=U`nHC@BV@!j$id4BGShS,"V!)ZS\r%iF0n'b&7W\T&J_i"&kFXA_>/_[BCLe1?2%ji)h-sJ.tYMaoeN.+Q[Z1Mq;],)l+VS1'(=6::0kHV4Ohkdm(V`WLE`@<24]5?l)R^\r%8)4[W$[!7Cq'M$V)N?b"Z;.lera<7CMGqI,l?"0mA>2mZlk-qsFAFd@>$p(Gqrm!#=EFf1<L!.IAja8e\6PU6b[[a'`Qnp?Tl.q4\r%?%#M*\kk=bSaQGAP1c6HG$YI!A'E..4"mD5r+sRg4"g_\1+P0A?i^3/^*GMldE[ORk#[)<$I>q)nZUSsqX])T*mCh'F`B)d#G3.W\r%Q=,/qL.R=FH0=\f6t08Mq%^6^+u46Xf8"KUI`6,iMor7,o.*S]63qZf'1'T((OVr#ZO8Q?ojLsr>P,Ql:6Bbi]Ej3D(q<,B@-Af/\r%\_)[E+e">b6PoZ2TJbC)]&`<0+!<B11d%D)nZ:OM@'^n3]*!eDL\JcrP%p<@j\a:$a^T]VUqK<^,EjVle-`c>O\s<prI.bg[.jNu\r%'t+i(Ct`0:NT,haI'#%^^/-u_XsdF5>HiAdA%)^(=9T8DX^Hl08fkHC,;$-<':lMn>-g-EcEC6>0X>Ae]+"f4cH1$^=>H/cq,LM<\r%r/OJcr]-*5VM;:t@Kdrtb"BF^K,tb=VhH1Hh'-8]63.%dX2S#+k-&4bqeuhU>fHsM[I]ho2-Q0u+-4)]aTF158sN5/iMKD/(U-6V\r%6k%)Q?<HgS'"Jj,[C,/5NCjeY5Tg<@:+8es6N*n5]%g,+H_mA#=P=dj!5;M85mg#=!nNDE5ml"=>[A=$GZXH9EHu9.#`S+HEUBD(\r%j>>+/*);YOcLVBu;pX?nj4*%,3!gOu$1)Uj]?\I<;kdr(NRFXQag>ob;7]_$r^Emp#'Stt2V#E0Zpm7RKU?0*H(f"PNRFX1)A;H=\r%bnEf82Np\^jYM#do5=,MF<K-e+8.$'glKZ:?.s)@Q=Thh4+*AEerPNAX^cB(+S<h3jhos9KCD'GQOeH#+P/6k]O.!TRF"\b$+"iT\r%)NE/b1Z5o`+7LKo)/rgD1!L5nEMHk9@la%P1Z82&9(s(54+BR5Dl@LcWTMJYeRWeDHX3;PVaf(1$B8kDD5mVBW]0.ff9Flehr[l0\r%>q"H,BohJ#4?Qno[](%,oQ,"@mD]?Agnl!d9@YQ+@2_mK7gV)?7#r!4P[MO4.,MUg,DROrj+N_"J=S24a%>IWlKu)A=F/YWbUYrr\r%<-ZH?bprqo:!a:^_/Vg-2aM@:c</&$qXs/J$'/*!OGY;FZ&2?PFZO:020rT+LL3P@2j3N]Di!muhrnkMk5-L0(H7jD$f1U(AG\;d\r%r[B\I5M0<=r0\AV?:o[q.B1q'-3rX=o<As";ePSJWRl)eJ[U-BnY"ZQ5,m/,[g\B(`gD'hX^aHnK^X@MmS*u.^#kN)rMOZNJoe-E\r%>Z.amFE=PRbj86dBhMTRlA/oVpJ&=*Vf5K#[6+'XfG_?)N26bBZchlu6l*-fEQ<H;#/!-/=qu*MQ+0Tc*@Gb`X^AXum09"r-."SF\r%0E5\=IuZ1Gq:kB:S/\g"HjK^<YT-[89ZTQ3Xu6s+q%1kWlek1;611ugHUTnVNCYntcF%g8ccEMk5,)\mF^TaSTGVHpMmH:8SrA@"\r%hp&R#;E4kuZ,ntThN^H_B>ihk,$#2E,\g^Eq:dXBZ"&T&4fX3u,M&WAh/F5U2m]@/j2T&GjlTV`:#jQ(=B(,O-_TXpe48f?i<S,8\r%HS-<!%X6%>Ic6b'IBNBoFBo61_Y<3gD<F*Ppr6LIdcT]VkjqaO6>pC*p4HhTnHi<-Ej>GYg^;gWW^G:5`>6Ynj/f5Tn(pLqTOJ0k\r%04=W8N;\cS>5S\b#;;i9Ngtl80XFG#ki,"Q=5.j\PmI56p"FV*$G%/I)u<k_-cSbt]aue4EhXhk?3n5@\n+(u6?p,obYn'0Y/\ia\r%HTU[Z8oH(eXc<,@0eB8-h=4Ck3FJE5bSK`)LorpSk("HLoa\S_b^lqZgHN2)<CQ[^Du\aZ)Q_Pr?ga!cKO<<*f9VSbCHHd&M=TW=\r%8.Q5L!]SX"B3YPI8.IG4,%Clu=Ti0D4+Ic]\7j\"iNJQd2JLAmRGVLFTZVYpS$06T&Kro6qV?UkGMoWC>&q`j[%(u%d;@mhi%jIP\r%'Bi:BV;4=nYghW'dS)YOW/^(t1'=$c?A,numM$S:F;h-&Bo`)gUXd!j%s$uK1Q2&djW#i@\Tm1H#-X=k_[`D1X%b^AXt.#r!4o-J\r%FQ_``U=EY1D(b'UC0gMHjQ2TABj+1^68l=3l'$\FmH#Yr8F<MGC&nRKmVAf0e;MdX:Uuq).!Ra`4FAoU8+\h`Uc2+0AT$X2&A6/o\r%%%bW+P:::l<,D^hlK:07T+&C,l'sNn#X0-A06BsW-pAO8iT7(do30o(DF(uCC,V[f];)&4eCnQ9\P`+m]Q-c`B1]D=">s8,"/SpC\r%MGM6A#G-%[Ua,O+^t!WepkVKc6YeHT2BJcoT>W+c?S!*^$-"?=W^_)`&r]Uo]&8-9]^&@K91<oWKF:*Q`[?"*k($9[nVP0jT`bl9\r%Q@FAsU#=BlMbo#qM0fIk4@0@o-TDE;:n+D)Dk%>)$-"?T>Q`L06FckS&5"W?615UNKL2e5n[bT\b_f6`8rQu!<tnQXhNmX_1K4W+\r%(n[H97R[$XJPYus2)Vq>XW]5rhk+'0*WGEc(ucP7m(.WV,tQBg)7A"4osO)Eo:-'iIGNm<67=-"4]Z0=nf*Tg-A3!W/9AF59OX@:\r%rT&l5fT56M:\8pKMNU_ua0/50T-qgGauh.$5HHOKKT_sE*6]dZ!B#2Ugj;#LdkSqcdf$BC6ZMSrJRdC4GOkZ/Y>E&"2I1DQa^/hZ\r%Ola!(7E/fnku,;`>%B<7N_M8jq*sea2/;290#q\O?)&'LJsT'KD3<LH1O"iDf7e#[jkVeOn31Kdi\g[<=Z>-?MXBY04$2+a/:E`#\r%Lu/L&)mH&Yi]"!ESOcR]HZ3()&2X*TY^3AGMVj6egs#-E/:Jh>Dg:H&^\EeM^1$q+.=QW3?)/4M&[sPA:(%WJ&^iU0(*\3sXriQG\r%IY3hFFgg?XINq$;>^ZY42ZdE>G#X"eN>VV%Dd4]M'K5!37f5_Hhjir.*5uhu,GJKQ@r#aIgF,\"O%NsX%a<$A2"tiWF%!R.-?/Ec\r%g9mIn>5Ui\hi&m_hVpI\qW:W09c(Rpj10rW`FUH/8MVkR(.Jd"<m__D;EgAkSSg,t,q;NaZBMO,CC(.aOU!"K:B^1."+VASTIAi#\r%K^smKC1k1^RYW`m;o!Yu&#!'^,C1luJs)U%Z18/9oq#5#1fjjNXabt^4&H>E>Q:REF,3]/fkVO;g/"khJSQ3h:d)!Z.,aGV+L,$:\r%"l.7A'j=+_Z0Z6$"LN-@9tD36Eld0M-:&Ws;jnc?*)R7pf`i[PJiGPHJ!/:5S1%2B+/joK14Sd^5VG*,!l,V#Y!Nil76iNqM$JSb\r%GV9gWB.X+d1`L&[PLq9G:&&3j1+hf+Klb[@21er.SWk$q'aM<i?e3>I(7>c%NP?U>:D<m%BJYL"^sq:F:/@>qK>;=$"cS]p"NHeg\r%Rk>2f]@MQFR'VcL*!3J:Qds5(!.ifZ$7JnB+YXjbl0:Ph#gC:q^fX;RY^O#u<]C:9kd+jY4[7ZNR]5i^)S08`+mDYh<jS?a0S'V[\r%PfO:1N^5qjCd[Ru@m)"Gg_%$r\4aLpBb\o#>#E^jF_+m;-T=[(=e'o`<V/Kg5O)hNW":7Wg*EGRp'>=Ya^eLX:oEJ;JjkZ1OSL>i\r%cqHYFqC_,)oRpgB'rI(ko=;?5`O5,QZ;u_s1t/YB".T[KAh`hg^f^eRf#Er^mXT9*@(IQ!LBt6Hd(P:?'5M#[#gS>!pEf@NMHdW:\r%YLPDC?7!/;/Z`m[-Gg$,9Tl:e@9`(d(dWf=X!Ms6N1e#ZmTT$HfO$0V(lO(n_?ddWBdWt<0S19"3Bk_V(dWd?a,iLt(1.D?KFp&.\r%Y(>b2KFp%CeBBOk/h%DA6RR!`,![7ZG'\kZ0`9<=b$d"Y/20;V)[sV,%%Jb5@2RV1Uu2Xe8Mgjn+O&\<('MN/#h+&RJM7MM-h&>g\r%+MnC&/24VGG*'j0?Jc9YrqSmHbAIht,)d\qgq84W>(hW"[>c7?#'clD[Z2D$l':f*$pfLhPU(bb4'+'Gf@CM1=jhpFn7lZI,HREl\r%BdeW1:5'I#&P)ISSg8Y(d2Qr)m@p6+n)mc5Y4DeM;?i-Vebn]5UZI3;cu^F_#U?R>bDjf.#U?Phk[=T*@Dpk(I&-feN1e!PW=jaf\r%6Z_:-/3R=l$0JqJUr4nn_O(#&RO38I62:"Wk`*e>$A-.<_]]B(2[BK"Of>&tnosJr)Z%Y=7/)#rYm.eoq<IAFdM=r%Vs_"N?YFaV\r%=Jo&)8*]YW0c#7A)6n:Z@QtSQmb&V[n/9V$gc7bYb^%VSVG3<&5*o2C/r=)R3"[g(n;E*QE?\^/o(iIlN19@sO7rq2??[dIl!+;0\r%M/R-?&b$5HBBspR)_g]FdHql,N_aG!`#^U-`/@!$Jq/Ak,$s&>A)nR_:<]2jR"0/X)<+p*rW2$mrd>pjj$^Pi,UQoh\>K&1n.-?`\r%CioH]n.-?`fIh9,M$Os-fWH7eJl9`NI;V":+7NCGWPFJNr'9.UEA]\M`RjRZk`4Q#:h5K2-&]Z%`fr'(nki>LF!"]$QAm0sgb2ko\r%e.L.Nal9m4@1h*/WLZti&33tM.p3j)&";22f$:i]boNi@GZ)EYJ.qj;mYt0c+eE_s/C(SQ'UjZXF'&&e=13lLS9/;&J_6.b,b&#r\r%]Sp-.O-Ok4Kc%EIRD&QTS^2mO$SOuM&Z^$b>K7\rpOhqfaF"cip9:tIZ1D+]*6`*diNpn](E5^"BIt#;6@nq`bZO*Q'J!kqh1k<X\r%P>qEsq-g?&Y^"RCURS>*<V2bf%]rZ$*ErPGT-:]gA8DG9NY9/C4:5C$]O:I(E%ZAEi>2l!n4M3B6F14$Jlai*Eo-@=GU:/#?TrtX\r%Jle]'eOn?M>O]edOW([d("^(78_*;]$bOsk$=8RM:,_6R.X6rET?OXbL26+>jV?l]n4M3B@^RffJle]'<H8Vqf3=h8N"um1R7HIS\r%aE==gj%%BPTnhb\?[<g@O"@<mea@YcI<)i`fD]G_JOJ5r0"hQRW%:d"16RcCmR[G37^W/fjhVNuJmmJ6[=jS7HA5g.!DS"-`QP3U\r%eb@P!2V#2le%=9#V33,.c.g!;P@3A+#era1fF@eMWbW<@b<o5-I_3rg5>,lUrKU;:_qglbY/G:7+Cir.4Gi)a\gdRi]in`p,M+kq\r%%sR8!mc0d@R0[)JfmIY&`[=Q,rp.OYfcLa<jbdO[<n<kWn`D.ofu=-<Ec8snK`5EHNl!mI(LWi)'uXYOVm!R9:<+H"rgM^UfS&5G\r%cJ&/uFV]l+[lA+-g)8nPj7_SUB,<JL5J!8'8l,0HhGc69m]6odb`+4qh#pu(V02a`P=NSa[C)Wg6%lT,gKVq.X;.<K3k_D:@V>Xb\r%JLek>O3hs>8&m6p[;S)ZS#sQDp,?/QAdW]$NkV.`dbEVEkM[#6,,tRpEVoeGm)`UBinBB'F7U?UoM+T;?fg>u2pnfIZki]I<O)H.\r%[L#o]1;goq3hKE2e)odDl3cTX\?_9uF3X+)nNH7L]^ZZ7dZ.+8T^h=W"jmI#[-iD@Dp=WX)70`WT'%0l_j3m-d$$i4nC#`PMo.kt\r%5.S7UkohNsBP'oW;EW,Sk`"8;_j&Rm/PMkZLi=AnTDM3LX0gIur@cQ,MD%N*EoDCR$<iJ='j@!a$W>=ho7JLe]/%2:?]]m6qRC.Q\r%H%?[f.jMnF32u/XJS0L;bB^o<?]Y>51,kT[44$S^@>Z^/6.\PA3Nd_;j8i2,6&P))hult`$-t+HqeZggYh&\V(KA*!VBeH*<VP.+\r%",!k!H"Ned'OQq'S@BN8e<SRfO>+WiUeK2.U04q\X.fj.[Mi_F!L1O)Hn!!4l+2K(mqMGM2&N?+h_V:+?,FGG%]j\mK()@.N^iTp\r%XN:jPURAUkR"q^aMB3t_+oFu]aWWo@-XY%hjrh*mDP`BY%cFKTP$V!'mgQ4[!SkEMd)>GcZCj7QBCY=4)H@Q>e]Wr3i^DXJ\(aq=\r%&+]nE/Z_Y,NRQ<C9]QcQ9aF)s0p+i#3^$a9T7+t:aW\$OM6K'9__6E(:5%:lB6h#ASVZMOVEP$(-\<=iHVAtGM'.R!=btmj+GV4F\r%Lu!nA4%WoJ:5%:,4d@5X:5%<BEX_KG3t[7"Vc&'$M(h$-S1MJD7$sMjfkGXK-^XY]SHuQcJ&5V>]2MZ4&M4%A1->:mLA^C5E)NUg\r%SHuP8YbD3c:;fXmcb9[s'<r?*9dl.6fUW;SPDR83KsTfrg$%MVD0JUabtbj*Qb2(10KVQmJ,m1p@<R784oogS_X)rJIK"Df^oU:K\r%Fshkb$I4D5D0PPt.f%eh#d]_t*T_0_,0WX2@E79n6lZ^mm02.5#dY1X'F!-[#dY2K#m0HgK\8q[L"Mr0&p9r'SHuQca]:pVrVP3V\r%T6M+0raY@D4n[.?=muN#"SC."aP=TJn\@_*^_[$bFItO:n3u7]E2<'Gr<lC!"+MVXgqVds5=hC,gP5$Zq?KS^NL7Sf%G*-':Nns[\r%6!uVME[ZaR,;B#$JeF4JJN\K4lj1hT?[kC,G,V-ZV(`$aK,mN+!jhD5RP'7:0MfuG3s)bY(W%iB&=AHl+uDnf7:8%Q6I1Q<"Qi8R\r%ZQ!q[jo/,!%<0De$O3K*DEM\%?a,Scifs<VSGEK3Jk,69E9\O-6kMKS00&V8(b6Z<J&/+6s1:i:rjdNpWIL;=jA1F@It2[Gr/!+Z\r%#/b=Er^7ShKB_)2mR.mXK7Oq5!"h]I,CcuN^D2Y5+i4L'9Tk)@@0@$ocBnk]bXmFMIho0A;8,GcJ&7lr(kr8,8JV`P#VO4@L)$K!\r%0QZ=l$c=Y(ZW`_b_(ZZ@'*c?.#lBem<Ilh4K.o*.:`'VYf@4h)MLo7RD-.*DI#0P/"uFb*]SS=o"p=in!"g!ZgV\pT,H`+T(*\R=\r%1tc.bKErf9.pY<ZSHpIE(?f-0&7G^m!k^1:#U?PhG^'B'@0G.Jcb9Z/N*+i-]2enD7aPOF%2DEe3B8c2r&3I!IOWX'oB!cHS&*'o\r%+dBp5"7p!;i*FH_"$7b0h!Fr'4,JPj!as_,rsuieA-/Ee8LuNIFZ*GR4`4L5<c3Aod;]'n4+V2)\h)K_%(B03KBE(._FTHi#MZ/'\r%/l4qmIY+I*hd5N1c0qFn;FhM92pZD(pY!JD`fR%Ac-t)'VttN>N%<8XitJYAj^Rh<\LQARW[%L0M_17b@h#D3lKGj(OZBAU^=ROW\r%DujnX5q]Bg3DMg<N5^F9;4jM-Jh@NK/s!:#4\ShIqd?a;^%U9NK!*,kL;"Vk7bZ4$6:n<0/)(FT9<UV8_i=XnP=r)>0Cm<6.3+?H\r%,/5Ru6%<h9nY*$`5^Trr:<$HVn^V,O>dq<)V5/1l3k:Y1Z;2I5m:"<'Jlg,0*2*2A[ZBj\[E%\Og]#$e2;"R1^?EBMNBPphf9VSb\r%CHHd:M8gi="k<LO\0N!m91Ys!G!PO,e<id0o\qEnk-1&d_W7nd]-:r_318Z6m/JtNC:PS+kI'rorAnk<@77$_dlG#%>;L.:P]_;i\r%Rdic*YNW@5fbVOaQ)7edQdMn&5`\Mdm;rca_$g3Il.ub,8[\ul)YfF&C8:X!bWn?9?A,mJ?8@A?SJuY>h`oVW*q[[Z<sO^RKMuqB\r%5M0-,kc@91a8G_LZB&:"+&-HF*nJPB>!.e9h8.G&3'hgYD45ED?)a0qq3DfRJ31V:H'paOH3.L6qb)jJqdnt2/u@lK26LKQL5#9B\r%eut,_h8?bI6m'A!!l5ZbQ0Nrn>&-"iE&Y+d?W5AV0;8j#Q4rZ'@?9X.4_uMiX``D*^6Tn_V5hKVa1IHAY)FBGhVa<B?KQ,9BCP#;\r%?;Ag.:[ge<0:7t,J1gtM)(WHXFT(3223tp])fpt:E&pp"+W#Rf3pqIV"hB!]QR%=p?"]%"#?<-1aQ4AONi0TFU$KQn2-cj@9TeYD\r%<"5/?FXFdFApD4HXtr4)7aD?ekW2Z'])Gp$6J$/&bk0\#MHlM/OJ1uSQH42j?,D;u1X4Bl(,TObH=5epSCEhs?oEQcFI`^HfZGhd\r%cul5<$:njnD6BY'`qfM\,WTC?2H/\JR;'te\t3Mj>fS:+@7&S6VKS@'6A;Sk!,?0$Dn+/:-E/0T.PQX\Y85Pd-)97/[*+EH*Hsr#\r%.UCX:U-gEQouBck.!H]FAhICZkl$+if_m"dBFWkSFWJ.6;&FppCS\D!IMWlBdY"8OXQ'>e#bSbI7V`^->-ls8qW=qREg5X-g1Upe\r%Nfq%M)m'/<A)WX'BlhnR>:`,33j#.'RP">(C]'hsV)dDH*;0$jrFDq:["81@6L0<0X:Q`2JG=8SN\g.KfD#07?M!@P8=pb)Hg48l\r%EV[0KbMsW^YWfej$9FS[=#_=F8i8HnO)F3EU](pra*s,TDZ>$a\6D2`Fk7-rk-g6bf)sh#Ip9U5*\@?>G1$.j>_[GfP;^V>:,8/H\r%\h*H6"nh'So.Eb0AZjKMZBArcorMl_R0mU<`qs)d&3DNJcO5$&C!7,O09k[4n2"P3(FEaMSJQkl)II)i(sDNU7D\TT`=/0leVb;S\r%kCrn7q[YbEjQ)$A8Yt@!gcLC8bRjXcD6#`8j_[](OIk5?1;f3B(P6N7*Z9^K"/Zca).Mc_U_(`]4"l8YI:d)ISJSU(0FZ/:4"l8N\r%NGW9@FA9R[Z1C<?8G0NEEpI?G-+.et>=GSt/fnSldJ82?+_l[V..=(^FTpBT\]7i0k+R-7d3Yj30Vi'ne:W'm(gB:Uq0:;+7'5>_\r%2#1d_]!s#)6A=tr4UoX@Eh)TpPkV9NHm1tOFr"P[*per*P_ln5D6:!P0!ag,iuK\6@=._)S&Z,SNX&.X5t==Yc.OPe4n&%hE#f"N\r%Am8H>oWi@".X,(Tp#l[4_Z"T0c5&go^6($mP%dmUWjB:9@;g7!D1+HJ[CgN5^R/fB4h%!+A'p>\W4>Ue2^Ehqi_XW)k1>`L,mHhK\r%r9:Z(5j1Jd7kKBQH0q<,=?RPpR`2u692#)+3Gn1jY.!j'LRsjf<@s6qP=@-NGQE0SpEmm8,/f,:H%)o!<gHOJ%Q!YohJ`'jjWp7F\r%s#u,-eGjF"/1kcB?#`PHHue6`FgToJB'p9;4r='tkB2#(rTl*s,ej+*C8p_Bc32-?#;?Xk?rICNG71JMmHXXP?JOa\"7*2I>*=4g\r%fYQP3IgJgIG5U8fI!=HqqO?P#7dpsA,@(%fI<B6/f'BT>c#!9S\MZ<PfCrm9\'"GMGC9)Sj<B3&F]ggk)7fb'rD2Htj/3+AQ_VAn\r%Vi6MXpYYj>o;BpoNP1&.D)WEW?CCD'BY9"!b=N3PGJ&T-B8mEeM3iD8:A-NhA:_%Np-L?-BH90aIu[H3TPtc%PX[B1TJ4,6-k"D1\r%5XCF)W%:42AcVRhW%:3g!X6on93`3JJbgH^U4AI(2i6O4'#bqcU2Z2OhFa'iRo'A(c`BQ2U9NC,<-Ztlf&l=]04-0V!X7k2;-AGC\r%m=V=Nei\7PMp(q.o7lhV=AeK%W!)J\=FF$^hrX"q*#9qnSL>tek,tTInL.C^`bZO<!d+OjV6%X#cSdonR2e8"^g]\TPIC^QqM=5&\r%5_TI?QD>"of$-?iL;WppH_E^u:CW2dL,*Yr[O:sM!`XCuongfmZrM?q:)9&tBWLXpIcT]qJAH"?erMgl[uM"-'_oWqZ2dZ52/kcS\r%$30V9"r8!7A:3s.rj1J&U5VlMKr8]#,9*8PW:24@4#j2.0IJL$puH=#O(NcCnMNL=gCs3(o.iMsqU/U1Zd3$,g1@1k*#[QuR=[&F\r%+$7.^ah3R.fdBSU'E6Lg5/+hf5N8/-dT\>ZSI"7SW$LkOoG2$OJ`&km<J^1%._R"2n`c+42[D6(iDXX$rJEBpR0ls!`[<lb=S^(5\r%N)/S!-J%tQ[<KGtI-P"cdT_$h;KUqtDZ+B`0u'TU2n\@V;#X(!HAf[>l)(p*&5ZDB&8@K?kq,!G?737;fZ&PpQJ,@-916F"-rTB.\r%Dg-5IdTY!9]\L`7p=n7l;QJAH02?"?j_EqP&56hAf-U>,]h,>q\J57MZ7S`$kG5N.=u0155g0"LDR)#J1o[=X#ubN>aJ9T?qPM_F\r%Th);T^.i@YFdYj;74,FD1bB'U'qWp<A=_<J\U$>T%[LFE]P+FgUm<`@"OgP:8M,$iVUJ_28M/T^Tof@F,IOaSQsKt6P15)J!4l^U\r%.&7WM/uI$"O\%,THZ3`*?PHCR8m<(/Jh'Vte2,c2$E41jn.`un0=-?\Um@%[BTi=gOBPaL8<rNXL"$0h)I9Z+<)O*p<53DY'L[&b\r%ISiWf8Z#5UMaD/M1'OcpH/:B%HT4Y?M&B8:@3KK91D?`6agB0=;+N8XMZqI2O\%.GKpt\M74,DN#<,)W?PHBGe:TU"I]WbLVWm3(\r%q[8S2/tcc/(7(gu6e`B>j3)!4p3T"?^h6YC/'r^)?5%'0@ImW89kM\9T]`ZXkt6CVEScC.1(4-CcY&Y9oK&RJd65TbH14rW"O`ST\r%AuYtKT7q\bN4BSfI$PHj=+[!hK#@c2>_s#>Q6`f@ojRYI_p-#^/&BMD;=3sFk-M/M8\EuIS*3o_g'\I/?H&*PN#eo^eRDJ-FZuiC\r%a>bS.5TfO*A&n<ZI[Q'0NLre-G'rqCp9/sqSk+NAK=u7<rB,T(RP/S8ke=\l%q^RKGp,b&1.06S$aKKY=!<qKEq;V#$=4!$0?hWO\r%4"o[K<T%P<Eo.:Upk0QX0JDKtXB^m4?Te4Y0OMrC%'fCj&JRVA]TCOZ)TMQ*:+@hK"Db;>j-*jDTRc96=$m9N5%.b'BAA>#5#F<*\r%3>eAB08/b(5/sLUpVf$qpbbQp_tU)g1(k*_o?c'W#<+,f<40Pj$Y%Pg$8$nm[WWJEZ`p>Qb4B.B6FuH:RM6*#$0h=@/lLn=.AG4=\r%'3rAc.6\;kq?dnmo4.qPFN3+3;#[Wgd78,?]9N,F*Y^J7bcac01F-VIJI#F[cb=%,_8-QV)2f3RTG&q`oVtiREib=aKp$nfe,X1C\r%]o^336]5`4<?4O(Q9@*@oBlHZj[fV6W!u-s7I?TR+\3d6:ckTHOS84KUh%cS\k;+/XK/\%hL&/Ha4nI6k$%\&DIqhF]kkD@9B23`\r%4>-<d_sEG`\T6)2.uqT-9+IL;HSAD)\FHfd4ZSpVia"i'X_^;L<-^`YUn65_&?Xgq(83iOa+_"r:$6)o<B*7ElIp3S?pD[9o3Qn1\r%D==hbT-%M5r@HJ`4,tDUZ1GRGbN@qG@bKS&9lmZ@joN^6+1!L%5s+k^nEq_$6/S9,$2U<dn"l28"itk3Z_$SrS-jm-Xb^:02"(&*\r%+b9t5/StDTBjEqsr67NFYIRg8WhUrUUUbW<c^LG.V>n<&`WJns?i!:@=$?ag!5Ad>/-K34o3aQ\(7b,1_\JR7&'r8j`,HF*&J.Hq\r%_hm8c/.a08o2oVt%H?R]3/ZT!LuWO.nIrYLO,oj'buO[25TKE%_M[6.W<+ZiYu:_6MVe\qK@XQFi]#H^T1IWFkbLuFM+8/m&K`#V\r%q]`ss`'e1<A%]d!"N5l)4osY%!oca[`,>ds!VT6<ps%:\Cg2B'Dh3_00ZI[!Q=2u$G1Eq&gC/C-$7TIpFT/9Z"m;O7-:7W"i#Gj_\r%6]0dhdS#tEi0+_h+bC3m>qgk0B*@%(;ushJk2Ol1Wjbu!FMN<P8bkl7J#95nFDkKc2ht!7VS5J%6r(/,AAFZRQal)3r5'H?j$@tn\r%_\'S)D^QVa2*(EY`BQYafkL$P[0^Opg<&nrSfQE:#>+'[Hh1.KTr4'[m`eDtk,ITV=k9Og*1X0E5.W\S6`S)^9(1kZnaZmbhXI&Z\r%<VPXPH3;\,?eq3<l4)0mq!-_K<,[fpA59]p0@_#Q/eN5EG5,>^]g&uW/j2e6n!5'(g(0)X*W.$OZMj89T_rhDRCI"uJU+tLH"aX.\r%#3L?q[$hoJ:PT>%ZVLKLI)<SjrV]e+DgiNSca8T4Ci98us+=UM2OR!qs6=u`Oq+1fS$->S:A`r^'QFC]2_Spl[<F?`QH[=Y_q*;[\r%HqLr<l#68._tu5T)fOrg`b#WJ`9Q)3?H;[I+U`GDY"pe`-7/sOYVUH5W?!=3a_eH=pg"uFBWYOJB<I3U<nq0`C":-udr/k)2;W/Y\r%N_L71i-3_,:.OlblUF7bbi$EA:qmgm3d2Z%2thc5O,1SSLiU1r6)hu`0II+*;K0-)j>e/ncM1@W4q-AF('F<t#PQ=]>+"8[I<Y\?\r%6pLIQ)th*qb-H,sXVfPsc^Wjr%"VSqFA\';E\fkJ17gV(0N*cHR=TQ(Y3sQ`CC*b-IWtIqAkP=&@k>'*S4ociQZe.2<s[UC*&ce,\r%48>*)nr0Z/I(1H8Y4T,&N(US(jR5S$D66fah_H64;r]N"9^I#gIHZ7rR$kORZ]/3?>HYs79k+c$VcJ,]F6URZpZlJ,9]b!q41nCM\r%S,&?"="C#SV,&(jr5H78(u@4UC!g@es.)>.I];Z,6,."%#-+`Gm!2+g]TreMp)!(u!NtFk.8Qf+$9l4t61shi"5Q&N$Vm`>L9OJ(\r%&pcI=/g-p$#0,IF"KgQj[Q\SCVK]<$9-m4<lm](8DG>jdh](,goVUHk?`f]n>'V_2brrntL#2W.En`d9^4igoX3`EUU'--kmK\rX\r%71KXu.`E"5N[Ms:,JJ9Nc3DDAZZ>\uDs-?o\QcVbli"CMaS&4>[8/-M":dMW=.7,Y=Zbs79B-%B\i4,(Jq(T#L"G698D_Wpqh0:'\r%Mn[rPhKh1&J(QQeh^$j-$0TU6@]=JcMY"<%0*m-+eoCTX\[)[W/K`eB3Mg5tmS,#!$<M_"E+eJ/oUP<!CC\!K:EC6$e^f19#2/to\r%`S(O.E0I>l?,b$Cc][?s7a$k=.`]utKtUTsWNK1h=h\cqK@/\rB>N+/@^Pq"=]Qo:&#7+!cSAcaIZ,$a50KLf507L.iNjdiZ=o;N\r%c[tT=+@_8"T-[Vl!MMr/'RZ4!Y7)r8UYrI(3O3>ELX2F<Cd&5)!@*Kq./5@#N^X]M;=I_CE]AqiO+P\EB?ZjmRaX6N3A;dWK]KJd\r%GN!2fnXVTJSPg0L*X+;%>p#-YX^F=#*((<,HPCjn.nS&WZko:ZZFk*4@0!"s/Dr((.//>h/3r2WP^AUA<hc6t7TU&$^-AqHM)NuE\r%-P_l-4Ht1VfC)GM8V$$6gmpBiHtb2)5s%]M?HpHrpr-;p,cN*3'XX0YKF2BE$D='=4Q]:PKfc"FW<G?8T\:beCIKSXlpO\HN,j)>\r%$T.@S)<L4\(@:ZgV6qM2>-O$lAsBWc>(HBM1WnBB/Ze>JbU@*O[;a_R@n&I?WJ0h7Qqf"u;Tj/HL$NiT%<K>^QAc^ClsUC8n!,K"\r%S3>*4:_,<mPd?-*=:REIN,nVG#=hrBF[eB<R"HZjB9];q`lSilR"Ls*8"WZ(*p*G9/8I^8B?h\nQiil.WU(S]0F)e7"^OSXH^Fo:\r%@j8R!mWnF(6&ub'R"M!+a-KTJ*p19#H4CnV@,ZNgN,nVG#NPd"PYo^Ijrhe4)<L2kj\gnnEqY0,k,6XQrMUCPd65L>;9kcsJG8ma\r%-AkSp-tge\n4@_hP#)X&-`e3Im"l4\Mj$?"gj]t/96<GN-%\LBet6NdpET;`cm1[I-g=&mF@b!6hdac-o*-R'^f/@D;9kcs!'?);\r%)<J*f:1f`s-^77ZHU^#B6FfI[7\*E%SkopKKf,Wq4eWkha!06ER$/r^1<S8`b5Wecn4KEgjHoim;=I>T5UZ5C'#i`RMEdIr&X_Q.\r%aau$fZ0Y/I"]t13-n2GrMh9ILAjpb[Zc/(V[Y(b)^$/a;"g@Z!l+2INq:t$'rD;aN05,eL]KNC2Y>it$j&moV/9m:\Yg:Y5X(>1*\r%R>TQhBrc!HrgL1b`*kkJ-]2CHl8@HfT<).g/)Kq_U=\q^RS8i@hG##BH>kQ+$gtUg:+.b^6?teFQafqA'?X$,'^+I]K%)Q]3dDP1\r%&u6;u@m%D-_.suN@j6eS#uV.o^dECTg1RIs;>9[pE_\o88[=H;?%UQmX6'*0pN#`^,o8p.W4I]&`O.8.FdMsEmPb2j3e;uBT2Vg5\r%B[UNl6LO/(j"#_'rqb:d&I=0n]RCg:^VSGbhg.hsoZ%j+SgW:_K[s\io;)<>VWg6>\dE?sn')^)S4Nj/i=jrn/lHkJc57@N&r]Uo\r%]&8-9Ht7FUe^5uc*MEVr'5MMkW9fP"*bN"M%]@SK#"ca45-hdSbq/4e4.JXT2(@8fT1GI`8h`F8aR7t7]<cP:KZ``0qh5NR7$?@t\r%Ed67Q^$Lb'D4ZCH%]qG_!qRaLGC.;tRbZ<A&/GB,h&jeH(FctC-pd^bb,DFcX05Mfg"d5%p>pC%/]f/IGD7/n7<Va/da,lIJ,j.a\r%OdtC7o98!a32.3QdH<5t;4=]Of9Fle+gO13@2oP!5MJ/b:](9CoWYn#E&=J&OHZO<?gWX.hug&Tg&?3dr)'r)i#eG[<[c)/lM0SI\r%Zo@aUAdf9,7nJJoBPq^/#hWhFR0`7,V9u2DYJ4Omf"-9-jeq!;3sZOk>iENNC1O+2)kiVp<Xt'LGG'^omAsWC`I##,P->pa(`R:7\r%DH#BK`k15C4c<5qB@P8RqG+beqehB3\W=ogesN,0@=PFWI=FCh+;,YYFr\:E9Vf=L1`+NLX3WXe^4pRgl]")+!RJ6d<^C,h!iD:1\r%F^\+=mA20S'r[@-P3cB]'Vm!Ypr[fIk83a!1Q+I38htfbEE8PZ5NFN;+[em+3Jq63%+peT3jS8$?/VJ'"*M1N0bC1ECl(JML<`mt\r%4=)@$)9+>d`BYE.A.i1W:,F9Mde',!*_J3&A7N>G1@\T^<TYtO3_!S24!Bl"^qBOY"*%;'5m'2a*\JgQrJI%kXY8YJBdJ"27M1d!\r%hY:V/&8r-u\h5%p5]e3UDA!k=Wqk2KmgPNt-DH=?b"uX`O]dh5SH\<eBm*Ui.hpt,"J1r%'dJI%2HQ<7nVTbk*/`\8?dNK$4bD+Q\r%QI>_SYaAc\/s_afoD?hoP,Sn3O2q.rr8%;>,M1LJVXKf)D<T#rjDP"QDGU45d"__o"Q>^F>'6u-q=3+dk5t,Sem*nu%((6[S6XX_\r%m]GIeIHV")&U4J-:6(P>f=9T(%XWQqb"8d!;jXbEJRB>AqaFU*SBWb'C.W@QfQ>Fa%F2E,=INOsBlLLt#4n+)L8u@%JM%eL8@#`^\r%3;\[Cb_W2S3%nn)o7hf6Th9sDZeu*ol+T->dbpXN6JmK()Osjc+,q6sR?[r2n\1YQ3'.KXr>%I(Y1Yh8F%h4m^F=%WR/F*ldbmI\\r%oJ38Zf`S?6>u7E7Tp(qC9nTdYi$;H1)Vi7f/gLnOSrG%aJUCj!K<qoB5hdM5%F1PF@Cd#8#%qSb8HRB!lmt-KlP#Nf(Q\aF0b$m5\r%3;(GF[j6l)K<oJ<fMgeWZQ'BsFAF*MB8.Gni*II1)cKT0b-8"F@Y9i7VF>`Ae;KO1'#I+Bj`Fd&quH(4U%LN2X(:?71;9!0B4Hso\r%W9[qFO>:fC*2`oIXd8LEf#k16D)TnMDn/7`l3]MFfC@4+#o7XqlaTmCV'6>EoNGFGj07f!lG<N,nrncb\r<UaYc%q&](Den5Z*kr\r%c,5@Kn/@,W/jtT.0_E6.4sTi;B$bMM/'hO\BTie9H[0jm]$RJb07T&r^^Y>[!\T<WjRVDii/PqiEqobhBU[i`\U4FEpM:][Er!^n\r%9/9#Yja1tm3H>*Y7JsU]h[^aC9bG,LqoRV9QNana9'3drC]c;[&Aefqq8R@=q>?a*QP_YB$+YEa(]#bJOD>-"Fb(QRq#W1*r7mF:\r%oNm&@P/[5oCqta'c$;T-?bkckT?M.]2??luar)Gbnc`:^N:DO*^=Q>I3C5?*^kLUP4<R^5r&2,=r#h=H^C;gGU3^f8f/0B5IKa)m\r%:TB7%,6Vrj>efTE14Q2A2=t/>N)'HJdg7+nakX;$$/eS/Z$rd:?VAIu6sMY2THe8p]\3"9ho<FM,ChlJ&\[250@1TKIBM)L:Aqmi\r%)8NqoKAb;/!#0.9DZD^br&.`BUBY[9`,F\,hIlrF'_0p3NCOE8VMO,!l^6<k=WG29Aq%"=ZM;Ho1Es,$(,M0LGnF1-MrV:Og/_aX\r%XJ`@^H_E!Nhq%Oc"W#8?U]UHnMCb"2`ZNie'3ZgMS_(oo:_l8Z(lO5%Pat?`TQL;bj3p;J.B-]18WRqd/G9,/m;`79AK?sIpHi#1\r%;Q%'s3>TcsNt/jA647?.15Y))l+PihRuG7/ZH,@8liVht';:,cfEVP[V9hP3-f,Y@.#TZ;qYN]hTe,m<)*@?I$=t[W/iXQf1:(nm\r%$>"4J/9"0I$Y?I,6(s"<pitHi,dL5^>C^[:XiNh3;pd2*:_rY*HK)<I6<Ut&JZ;X^Tr_TR>XU<?=7S7_H\<0W@QmHBk8.5KMtno0\r%cS)M!p0[-7,."amPIIAZg"Wl_.7oP_]hP!/4f,i69(k.pkG2J`Yh@d<IOSC>_Imf9qPA-9K]SSIR4U1*Dq"QZCpe,Iltoq@'Q[nM\r%/R@?+90(EqkT!N?;ORJ]nD4\J]hL"p6dL47lttmLAo:m-s0>ZPlKi@k^D(kEK[/GO9rHP5a22G,djB!gjX\eRVCDH0LX+bR2,1W*\r%'j.fOBm#*FX=,_BTkAO0FnR_1ni"37TsM4BPIIe013E4JD=Y+\8'0Vb:#6)@:&+'lg>m+!h_K$A2Jr#n_7kWIhPOT50GY%e]hP!/\r%%1S%Cg"VqfUJ<@Eb+@Y[D;+&fO'Wl^m-SN/g](\7M.;:J(GDRG\_*8m2_VO4Oluef/fk9E(n[2i=B'qdN)(^e%mk9qPNSP>JPUg&\r%i.4^VnVQ_YcSa)N-a[q[.)G\sZ-R>4'KE4b'-5jlnaHf1(nX(6&.aF,N).=d?W_"m6T6WL[W::>5iOm;8h`GKG^(GVP[JljHP/=]\r%P[JlJkkZJJP[JljXpZ&!ikd)9<:9;OBgWbNQZID>1&&``3M!hPM'R.c3n`,'&^AU&X'3.t-q^cu6;]BHA'<S279PZ+%>9/5F9lG0\r%Z.VHOiN(#U%:nbD$%rr^Ld(TE<Td\Xi+FW15q'SE`7V][W-e,6]qO,"RdSFtI]p4CF`5juK6;*=W]0raT!5f88_)SISKu7=h;+,o\r%ne/X[&uWjj=Q1YdN[6o>hnoE*J:Dp!^[fGK,mYVZ[/WOF&g/[n.IiPQC4&@6pujg/e29E2lDmXd4LE^l_l]g^K5h7-L,g.M]0"eo\r%-&MrL>6Q%qK;?H#@LMJIoAsP0HKYH9I:!MJG9Ae`+_W8B:oO4UT`!VpA]4kQ#a-1pG/p"S[^g[uIEqW#9Y"Z1RuSmJ8'Zi<9%21n\r%-N=L@R8P(gFqoU&8&SR.hpB4LMY$+T/R3-%X!Cm6`QJN1U?`#r8T4H-R/U.ppK%as<sohGKr]SkiFtW%Ui,@9O0b*0&/Y0B7RsJU\r%G%:>SriYhAF5/(Mi(Y;_YA\n8Pa%\B:sb=(>Q?67#,Zb>%BeU&Q1;t1=e/p6aJ2-#rW\3^!WI-PrTD(:psUFhK[/irpCpRISH^:9\r%9-nY/h_9"Eib(iHDrugY4JccM>M2="H%2J6#<bU>\\6ifW+GCGT\m.@g^`uhal<DBK)QPf4)'<VF9=,G0QMaJ4EO;9ej`:+f5=`,\r%jUV/koC-],+fF!5N1WgUd)[jE,:E+fKQ0(3Z\)=P6/7LFm$LCl(Uql5/i]^r^>K-4]nP-(_jaGR[j22kGk4Mr7TVf._jaGR[j4I8\r%AY@SX3SsWV;Aj-]][:l\X@VqTn4$@6F@BBo"E0(aQ'3E:Msk)tKFH&ui)C/gMDQ^<F8StFqNCV'derYgpaX_)p`>:(,0`&bgeX%:\r%Vj.YI@s=^>;P\U.4m:S^X@Qj?Q2LCuQnJ.`d_,>rI.b$"d_,>rM-?#W-,CPp]s='t6R6nD"q`dKRP2UqD2c-GBYFf0>ZR5k&BCKS\r%iu)T%,^9E;%Ee2>o=54e'>/H8Q[a`KT*0*!(^e@Rk*+__YJ-[T*ucl+h_G?in4<&?hYn29FG$&Kd5jbM%3!3-K<GY_2e\Ff:e@PO\r%#)ts@R(3RQ]0W2KKBhntL,cV<c(Kf7PbK*R8i*Cko1fGXaod`9hMD5=GlWj2eiOIO:opuL!g%(&nc5okM/+;c(C,P3-!(l#CK:V8\r%I<67#?4#JM8'aB^6i\kM,V\D=7p4+Z9qW+=cgAN54BW4K%`D&hj2ZarE?I5nLarkm`IZrqI]b5X(C,P`9$W7n??lP"P/-I&cm[/3\r%:;2kq'SgH.%<s@ZDU9fVT]itCL]noI4L)4VH7ZjrAl/,(fO=kJ21t2J*hH(j?75hKI@QdU]QaVY>tNKS)MM6XlPO1lW51!cgq;6R\r%R:!/ZDIIsGQ<3QJ3o\42kSk5.E5mcN4)RpI&4dt(a?,%?OsU+!0'ZVh\fQ$uZ]1Y7(G5Zl%XY*@UJVr".E,WV-*q(,[8F/c(K/YO\r%.6Okm(K)t%h;27FlYp1tlspn]*;[MNI'9](OF2lCcds)iM$2e`8+W+O6U0+#PC+9Cs8$)Sq2jo^ric?U^]+I4lX0\8?iS:ko=q4?\r%_q5lrd5HkGqj,-D8.sb^mJ;!Js,10lYlIR()ZFe0^K+3\"d:/1hu,3\<:9;QI]2nb(UF(5r@dm;e'K9q7)s/gWA*r@2#ZX\Y1Cuf\r%.D7L.SbXN0QZMijE,?%-PbmeYRPWeQg1_sfqG(TGc.UGC')IF@bfJKj:'oSAk?!_Io0du612+n8k#]#1Xi^A';#V9&.P@nrd+X96\r%VW.0nE:k5BSD'Z4\[JVUF62RBm*>oI_8Drgm*@WI0+NbdZF9`R9;\.:;/A+CWQ(@['ZQj8A#i259f7sDELsTW_Ghc%bdJEKlYo`'\r%0'/53c!gUqP:pNjr;'!ZCLB;JbOBGb&[#:d5jQ4k,XZlgp>;2r]u#p_0TTWXXCF%jNmn"eEEYcio_&$nni(QWZc`PJlJKPE^Fl!?\r%k-B!8A7iM\2L>>IfiAf9a`c@iFW8R.H;mLNB.(oQ2fX.R[TGl6q;mA$`MY=EP390oRpTWP.UCYE.rW6oblsLUr)-=kmjhE5/c`7$\r%5ttVN1uuO<Hr-[A;Qa$-;h*%([AO5DoU>4Mo2VKb;0<pUB<8%mkfGK#;hkA.#",cQY%t0Y<NJNf+_6_M93eI47B2J[V^7b*82YGS\r%1r:opMc:qA:0WQl5t.f9CK,H.1N*HP6h9DUB;9OrHTUVdN19%B#aW;8C]GNWWGSYtW26ihb,POgMikj7?Z59\:s%X3C5Fgh=\f?s\r%+c>iW8,7`Q;+*\`8[;&)3<X?q?sHKL1\P48T0%50)K;mD#E+`Ni!)IDQ8?J_]:HS4N9gPIq6/?;f)9!'e>R(cTL$7B2`K(/f(=`>\r%337%-W2/U9Dtg:ir30DVXHV4VF\OaM@^mu<=o4&IU<_Rb;F/d\pg-H+_ufD[U6tdJiOs/OohCe@0<ahZIoH9VF\l&?i=<<'nn0uq\r%hq2iipg63HZ_iXYoZhcO5u]W6e>CbsHsmN+hY,PsZuJur_f;Bf%Z2\H9GsD\%QbE=gV@P"GZK[liJB#;Ig;RIdkdACq\+>:<_'0O\r%SE\/KP#?*5!!OMm_bj6GN<ZVhVQ\)nZmM\(@2eV#)b-[#g6KhpPM'rbOq.Gdlt35mbPV^;\04a1_,I:q\R3W:&Z]6o.ZS@Lh94hj\r%'>eK)d1im1XM6I>_Xi+5rM@JmOY,HN6[7Le%p_01\-*)?NpbLQQ6$/c[&Ucmp[;C7\^4a_X'BX\H!Da*-dDV#Rk)N4L"ck4(>g'E\r%[&mSo:0Un,e'oeh%)QJDgMp>e9%OeW`i&WmH<FHV,J%EV@0$8<&hHm7Y[Ne?*3Ftphd\j`Eh)MY]K@"TdSb(Yf/_^2oX^md>E\1=\r%Q"?Nb[+<G<RtGW9-^N='-C9Y>CeKr=rVa$>B[3-8TT!d&X#>br99Y1IhKs=sB&JJOa4#B\!fpGVo]94mY$!=E]V?GCQepeuFr"QQ\r%BIU\n-3-kZXf!M$Z%d9VF&B^Q#^mL.<8I!0X`s1h=a;^5&9hr=])5$_21&'+kI0[Cr6eVem9#q,\"Vb&E-aar$Sd@tjBfGu:77*q\r%2@Hn%NY\TE)^q&TrKCUP_+e$2!8cdbZEu^M;ET3mLU6>Lf:50bVu-5ef/[<*"0B2O0#_nk(LN@jN>1gd9eF'Lm.YDlY][V+>W__+\r%qmSEE6prUpNYUotM*`dPB#/eB6)_cB/<VOo[Fgj8^W.ZuMmAY.N*>R83F+Q@:s/koa[:6_.+D^9(2MOUKj)j6^$\?Z/N.2a'ALUs\r%)?mNBj"0tu()sR_qiLtW$V[t'@+8Xq(:Yuk:lG;"nP^kB[7&7`TL1=2U+Co;W5Zb-YX9TA[FfD=SUV6(>&;D,7<3&FUD=fT5W8p7\r%/Ke?`njY5)m:38a:=QS%^@22MC4F8\*m;dt!N9j(TbbD@dWG`D:Aq2hN/+Ck1t87#j6EIe?3PgO!EX[2n+NCE[]U(hl)`#c9BENA\r%]m6K.o=jkId]Gmk!,g`,N#'aM'ea-f?h95*7'GWZ+.pjkrL7GYGe5/nCJul]SlX?6XgLaag@4^NW,,tq[7MO+D="hlcs/:TgK*!M\r%D3E,GCh)))))D\bZAm5=V/&\=5*l/t4\OBV]k9-IlfJ5M0H[WG,W2rJdjP)7`t/$,q\*CEomAEXbUc$6DdqnSH>V1Vj>HE%$HmOU\r%1u7I<9iqU@ZB)@$$d8=pcUb?s9Pbjfs8#o2Q\i7A@ZJq=8Tmp4X^bq`.?;VpW%K@[E@T%/pO2Ef`gnZ`+;<LJi4X%3P*#o)*:5\2\r%?6A]C\]9i;FE!#Ehfu][r8Yl8f$?V1\'T_#46]:H609G*+eg(mUFu1<MCln+dMi<*A7FZ,,_mqlA?t(qZO+;22paE)Z68`aD*(Z!\r%(1cFZ#P@p`!DOd4G^\)dh`fjCH"W<9H4mc#P"ES,<7)!Me5\8hSW'cN-@`Lr.RDcR*?BJqZ"Xt\P!r_0WG%UK8U31LB$i[)`D+'b\r%`.,<g(.hQ07n5/<I+F2a1eYUr]oIlFMa3_"PAdb<K5$K\l#sFYWfE[_Dn/7cfA%X0e%m&mB(70MYe-2;bn<51^q/\#M$K7!11]B1\r%,asEkiW7CWG^l;m=G$>`#C_NJYQXPJB^,u)$Zf%Z;cI0`Ic909A+M4TNq$LZK)$/RluQT;4Sb8-ms<]EOWuS3f"lb0("g,(_m#4n\r%24.aeZR#j2`KOZ>Reat#br/`W\M,SNh\7HGEaW"$q%\`"_\11si2P%X@C_ikDpU6j_>K0S_shhNOSfH/EcGJhJk%_75<0q*&e(qi\r%]2Da[T$=I3G9n&[-(&%jI7kUi9/+,tK(jm7Q=,.FV@+FRMlmD&*?DW&p_BQn,;R0rUC%quPj=A@<T6@+:4mNLN,`9.!`WSiW>:ru\r%a#itB1p!G>QdL38Ttr3b8B&[5B>l@r[[Q!N%D@i,Jm%hBpsYBBZLGg_N(<M,.^7B;8]!(a?Tj'k;BAqOd+)=ia)q`jie:A(WK/E-\r%nNn^OAf"7Eie:>?V*.>MijHS<e`Vij]TA#"?2Rl52KRNgd]'.JO0ul&3Nen>HnV>rq>Q^TCX_Fp:2+dF"E;\$ZW#Qd[Q8G(Ro\Dg\r%NI4$UNq^NR[+V)YVK#HnD>)J3Sej">D/+Fd>5!YQ^qXj3BldW$#>IV,^',P$5GucG-^%.n'NL4HF4tH!#c7u9]er5cRY[DZ%ErN2\r%^F;_fJZ;XJ:7FCi\.bh9k-WeuOb(LDe&j\KNMZ;$Hqp/jA9?.RR%1V,,]F>UD'&TP!cm"2+CVW4$-?nfBd1o.MTTY>YGid$Vp/Re\r%a[?i6V():%oqi$:3GfJ@$67OIN>C[PR5[K\qXZiXhLs7!`#6Su>>HSeb+Q8O"l57JcK#3tV.TAN*2i+;-3bBl3dO?oBNa*dS3]Bg\r%c`r*U!d[-W)`ht^,I&WkEi2aGTTWJD:hci-`FJ!U?^_8Uk\fl)qM:_"OhQ_5PQ8@V42D^iGrCr3DtK%s#JLK-AMgX_#%%N*P/Ml(\r%)g^HnDX<AS#%%N*_J_1.i/<+lfI:WhYGY8CpK_.lQ%#lGm#]C,E*6p[*gN5/Kq"B@KLb.$DrIQ=1KSJ^Vd5RW4)--iRLWqcbf6/$\r%d,k3(3?HBUl$MFpFLdk)A9"$_1lfWlWC=W7J[-f)l\:H*LNKDT0mS./30&?ERNo,:8nnlsNl5Wl,4_5O1.:?;7,Wl7[r1T)`%W0n\r%01,m>f3?(;IX7$1h2`P1,GJb*7&U><)'Ua,+FaE`,Y,!dU0rf8N.pGNW#26sY5q3/5/l2C]gWWi!T*\iTBK?*qlTe]o=8b38&O/3\r%7nqRLnpEPZnD9e_&^;tI[A%nb5]m`l,J%(/inZn_G+"I:EC@/B&L5>/?U#rs61\IOEQ_4c7!N\9am-Om<UZ8#)(f[^[E&W-W,X!M\r%M>lA`rVZ^37R0YH6q<6KB[b@+'1<<jNsE1XqM9TG!SNO:P*P4<a\&.B+._9;Td4DpQ%^tro#%%8?tG=C-&j)?auO7]X/?>QI$791\r%5!<1N=^tcf!3YL@D4@)B]!0oGY254fj^^1W+OT:]k`'DdD&*Yj?a"e#D#:*?2)ejn(E=[/np@N$^3Y'FAN6INZ?UgRErE]KT>p?>\r%:CU>PHfka<QB:fFCqfr+:R_=X/Df#`B\mp=Z0[`9e^@qB0;RUQ<T&F.]TA#r=Ku<M<anPhVe.n#1Os?gIqj]`Aj"EL/MTUNYsrg(\r%p_E!`E^U-C<IkW@A&93J(,8`F&p8jeGjK?`k4XUMnC[2U8`hm_#8&aM?g7%;WCA4H,..A(&2X1>\A7;_DV;JIM&D7Y"Z^hoq&Sd0\r%"?C^C@`I3dVf_Df&;W8"dsElc4^AqS?:^U+_./grWpm*d>]#\]fn8'#4Cj!Q>^]HZ*n.mQRYRk\[^_jB4)ZN6TY;4Hc.0X??U)oS\r%%5nUX7S?gJN,k](JZD-QVd&Cac!:d6%kna^R$3\'S]^StJ[-'k4MtKR"b!n]Xqn2M8eZLFq_p%p>u"Tk>Ugd31dHIWa766u!M#hK\r%%N<CsL\\RU6:'kF:RBVmBc$?lhC?[@(i(P[7Vs(L%3V=Vhc$]Hn+.5J"/$io(c4Ji1P"nuW'LM"0a$XmpUTG95m%g:)t7=VlIH7Z\r%1dDX/J?`3Acp/#aNQ8<rG[VslJIZ'B=+uZr!Zd-!ck00KUSHF,KU`.5!ZfY*Lrq`^;\&H<"$PfI4n2$"o[h9Cme,FH%;<k/K./rG\r%4,#Ifno;[K5OF5uiF2V'H)9N*\V92,_Y;X:D?&t`qPj-cRP!KsKQ?&'a\/Q3I2kbM;+^(tg\f*@4I18;g5F3uMP%0Knn'TlIp%>'\r%L#[@b`uUgSa)Vp/_0Vk;Rf>9G"@2&1*Z'=NlY&q@%Wq&f5NC$4RUOL*:9+gS[0.OW>5M0AC5JpV-T&4Va\hFq%ht_eJG;IcO/T$(\r%XL./%5P!Y%Q$D#Dr2?FsFS2QP;FdUMI!IHLe.TEV\_3$kk=p&ZnZs>5cCdr*?tB.s0/CK5fY$Q@^=3cV@tEJ#I&J>%]J"e=K&':9\r%q[kWl"SZ"Tqp>n"5q-C;Rs.e\-m?O43sXX>U%T+>l[(C++5*fCp@X/jnp>]9QW4)4Y3'?'q"fCRh=Fhc+fl;WFLt7;-Qb3'3VUoY\r%<,.Ou-$27@%Wt0X<XG>>`JWA0eHuG[KR7tQ?AT>rjIplU-7+\`2_W]#\h<o&DtZ%9<,^.[kGrr>=Or'U8(N,E2r0rroet#Pme1-E\r%NEa]'f&ap<7P";eI,l].ZXuj");KDh_g)s_4-F,<cD+e)&UIb3SOX5e;fia/<p,q+Z/^0<Wl&q"kWb7\mJ,%]k^6b#Zhd/g`(=6]\r%rl4Q3rbp&J[i'8k0$eU"rF$)/0'o\&MS$MtQR#MiY5./D"pOEM:tNpWXIG8EL6i3jolo;`:D<*HoUkkBJhIW#>^8)%ZWDO39/30)\r%jF@c`C-V:N\El"@a`<rrL.J9gP`W^4(NC5j2fsHY7(2er?/K!pT28hNke)m:;aP+]0^AL$Aj:7boteg2@FSr@c[M9$Q+-4iX1Q"(\r%Aq"=aeJar]\uMWi^K<FUdPsZo+1c;!d9A/MU2O^@9fo=AJ^182O"IK_d\W*D,8.6ciqIm],>tpV<%i$h!CA*AH,>AJg5t_Ue+LZR\r%(F0rl1mS,rPn>K=r'5G]12-WPck;Y4@A:O7aKIMg>g6Vur@LTHXkQ]+[;mA@N4RIWC(QP6dpr+RPO%-Y(B'%qcn&*a5LG5!M46qp\r%Nms'#FnCa^9rot+Ce8ZYdD]7O0JnDfCJgBCGaK#Ch4E3j6Vea</(N4"6AEToc)DqHYO(1I_H"Fa130IThkQbqLpImE=AU&"]r$+-\r%jc5AH'Iq'F=p=K\fS-g.:$6)o<B*5sf!XI1_<shE\"R/TgH4fGk=<m`SY[UBIs)erq#"++b<URE`Ni3\h(*,"9$0&`@An4Tm?DH]\r%gu'2%]Q6j+Y3Oh9s'EHTQE8HC/e`^Jj0%rS]lU[7d9Hakc^I&'l2U4MnUM,Hqb-r[qQ$IJ]PQ(%m0,ai<BSIiSQr1t06;`=%lp"h\r%q3PKoZS=WqV:+DDKd710DLT"@lLhfDl\>)1d]YMfA2$![qsJ-:O'qH^Cd'RT@gN?8@[/+`@-1C%^.(omM?bf0^>TjG)VZ^r,i7#g\r%IoF_,c@cb$K11E$BkQ<RGltbXrosHa[dL5dToGABh;e4Hl#J>gEim(-#+^YVSfcl.qJP31X1-pWA*p^-Y)^rK)*uT,VV_7CbH2Z$\r%'#]4OT+"Eo2iHLmc]`WccraJWhM0T39!)9X4\\+62i\YpAOdi%0VK9OW5&E3HTU[Z[r*R'Xc<,@1$AqP]&TXJMJLi?jCYhK,aAAS\r%A&RLdkUEBG:9T(1FV_EHm``piI%n*"n4B0/.8?aF7^"Bi/(\t6+;9I"O^oqt&3`tmn$SAHV,8EOr!-)<E*G-0!P.Lak4po3R4WCb\r%$.6^;*7!M/`fd%0_JYDhhB\'s;s*ha=iu-)RtFK(W)Oat<a4<_N=ENS0E#e'c9"?9r-T$`lTp]3qAuB10en<Tc^)A?gh+p.;Fh['\r%+#H'7%p1qc[L2==]\*X,U\^\.khT$Z)=#p"6'Ld&?(0gQrh7'uTP&G]3bU(Q>0jaE++$1,"?5r4$Yq]a$BMHg4aC-s(tn\l`RE`a\r%.(=Yl-n(M2<<LM21CHn"N61S[j1muGQ#7(*Z*]]f0#]7$\GA'f7&.fjeZ64tTWYTJr+,ldCq^!pOsZXLp/PTf.2SQo>4_U6f\2kT\r%mhql4;0gJKcf.`<&[OU=VUk*WMj*9LB9!'c1>,80pCY*!LK;U_7mnlOfdZ,dmrbsq_5_o8.t_;HA9>Gp3&ODO^GaJhSh+AH%2>fP\r%<p_0]W#SfMoc\9mFCbbmS00\mgrhA58o/iI:?M(3B8fKMagf'q"g:55lMT?40ap3qLb*]?deCfH[_=0R&i?4P&5.amfur6amKiCQ\r%FQ&YFE-7$/FJ775@s-i!kq[=+bss(KVsEO2mC5/YHJ'H(?"ep(>Jc7\?*L@pKS0a&FBL,Q+[?b%l,%YMT_o+#YUR]AngEW`?*FPq\r%2/\IBW]=p.72/OaX-H8DVi,%8;h1e3&%=<bba&C@16LJeJ"W&5:?p_;VSB6,J#nolajV!<Q&3N0-+]@5pN6Au<i/p7d,kYe?a)M0\r%<iV(7kealLQ@S;r17>oUhTlAX\Z2PBUHDRo-><3+a1c+54'+XPafd#9]><V[88`G%YPdcmF@Yu/EuE*qDECo)_6i<YnM<;o>__N5\r%Yal0*r#C#mKC)q?qo/;uF0]lG_un&s-H==79)GU$Yq^q*Wj23ibV5>g/YBte9b"UeRh;d7bBijgSA<8&"WN)0a,k'(iU9B[G'=fa\r%]nF-NWk3&qo#0`8kMU[rlA":3EXmHV6/>@b6I%kU/g*f>k`X@Wmqci=Zrn<U%[9W(PZnWbs6=t5Nr/+LDn_7jL&V2K,o!5G&?H(U\r%>]@\b=Y9o=X'TtNQ>A)g(!#DsMaeJh\3LL)As]_e%3*(WK<K;dn3oSqoMg\WeA0]:i>8bM)C?45)lS<`3D<%3"#Ve)Z5'Bk!];NO\r%LO`!%igR__.A.<?J6l9k(bbBd%l_`?iU[,"T-6Uag#ocD2,iTGkd!dm('N5__4Ad]+rIUt$7f*%2Up#+ek<2o5:TheI^ht(#d4*(\r%=CkU].rjn?auk>nPT[fSMFE<cAb)eX97E;8,o-B$Zkj"mcF%n3%]obQ:I>Pd5RH)jR\+pqll"J\8$JqsXCUm?$A)1MFjLP7icK$%\r%B]ae4YN+RtAff@Bg2KBbfZ#?6\96;#`[@Za"O/jJC+=D4LMkaV6&U6\X_VpYMglIPR(SI/:*[A=5Vq2/0TicZ)k'@(=4RRoBI:i-\r%=W<%0e<ZGU9L!`C5R=I5ePjb\I:+.^k$[FpO#Hslc;^JmIYCBY=+=V-N5>9(de9N`A(8LOlBY`m1\.`c@f8%&5%[mC!4!&pk"2S$\r%\,<J\ITX8Hke\'M$p_T'jj6&R2=tqAgVuiNmp.og?#AM!h\t&C_42"[[VDEbrT8BR%T5YHQX3VZLS(1hbL`;2H?ZPk:Y_K$0+Yg<\r%>#"h'`T4CC.?e;3bm&=iXW@Y>j$c=J301PA/G=&u53#uHrr+FFn!Z5!gjQ+I8Z)0.dI:*V0J%=,'la>L>>sq"DMHi:?>"9GYk@WD\r%T7YYH:"Y4=hOhX^J=`K_CrY*E?%"fSmk4>p!L\>t_:5<5+Dth.NOFV!??07e2La8ubNOpIh_j;F:$C`TYGfG<e#N5r:M4abf<X(I\r%*UBM;n2H%%)Z:FAnqZO#X5(H!:(0;%pYo?=mUPD!hR-r>3:oV0OAkj"`Jff4?0Jm[dM22MhL+P)BjD(9PU9R0m`qGn=tB?R)njFL\r%L7Rk_m7B&Tj^.F!MYg`5e#XGcBaDBZ$jSLa0"Ul[3#D$Y>htksfG\Y!IWop;c^&t.`^%Go&8U^1h<qEQ<Z[tkAn_d(Hk3Z-m!?k(\r%pL"RQ^=Q>Il-2OQK7Y1*=&MC>aMr-Q5FDD!m!\&#gWJ7D&a1>GaC&go9>VM^gq-8iKGLTP4d>R<jr$`3Fj3H5CThZkqbOA[Psj7S\r%UZ\5\^%=Jshpkp1]:1h8b-eOOC'*9N1QgUp_0.uFJ,#JGcufZ(HUTW8p"R0cErC",\*PT#dFaU0eP+?Oa+;n\Yd5XWSOCPnI\:@T\r%`MgcDom2K,KD_K%4%CTY-RK*n[PlaLf^18ges4O*r3tcG-f#_:-M3nc1)32<Y^7u3brru!Q/;=>C6tI0ON]tZ;q=]!h>H3'U+85n\r%>`SU-)4q@9X_6bZ*T,/0;hHqf+=(qgpMcJ%6Vge.`R;G9^Ga]A-Vnsmlm7G?*tO02_s9![POV7=ga25YirMW\2e-*E?f2()Msq7%\r%XE$,!4L+["[U)_,+%1YAQio!hY>(C(mUhd_C1jBQG`27A#Um0BgR$6W?f9iAk[mH18M"`FhNTf%nVdZr-8O'oNdf6p'o/?\feo]%\r%FKqoaL$&]JNm1g7i]LKPn]b<E1J_'uOj,Iq-*k:#gO)+hTH!WX#lHej\jFpY((0YTi<1XJeKrMijm!Zqior4;-$FEfo5rrhdVs>c\r%o5oNjg2qIoo5l]u%n?87@4W0*QcR4r"mJ8apoZoJajXh$#cRR%8=hI'nsHR4ELs<Ur["/6CJZ>;&BpI.JV^e5$Z"['@NQe>\g1D]\r%GsnR@ipH!IGB-*7K&4r[]5XXJ9:Vo<WQQW+GHG`WiU?$Zh_2RA9:Vmfo>lZeMo!l-?Gjpus-C)E">@ni"sGO)4."CoF'QX;$WPKF\r%b8%j:/h&&'0WL\eIQVj]k`4k:k6_K#,^(g,Hut#eo!`ZXCpdY4(JNktOtIo$0$ml!QrQ0#\NCK7A(nI3\Z_Jpj6iR%m-WEJ-b[sF\r%gckQeolOd)gY'Qdh5.THqfd3$GJm8I23,;lh!+Ltm,I'n!k#.[B9t-CbpuDX,"Q%'@n4Y)+F,9>['9W^B\%aGYWc2dQ3KW\OrT:i\r%C+Ql1&ZZ<`gi2/%\g09UG<(n\&M.6h^R.A"(oOCdnM,%?\5fh,_/cf%>VgLm!6\BcO*\PKK]Q\+\DW;LZ!?]::rYa0%)!d'>%jR`\r%$bsU]?e=HGkqG"]>bD:U?>,$))lV`^j:\uUDs!#e$e0.h^530G^sEHK55sJu8H5u?7R:\23Mkp`ZEp)]i6-d[7[BDeUWL0ZKH?EO\r%Zo&;R>G)1T?Fl$0"+6A@e+WL<3'K"f<)U,JFd:bBnU24bHOK1^.B&paS/B96Y419NlQ&pRR`fJV?1D_=VmMi)i9OFk5q=JM\sc1j\r%G>lP#Ys.)$F[>Ki\shCNMF`5"afk]I2Zh7>RGuHEYbhW91BY,5=iroc4Ym2RTin7EZTFm$d1_uE73q0.Z3ocA;p!gE..30b%aYV`\r%C@8/4hTu]%`e4,O=eV6P?>=J2iLR"L*uLik)D+XZkHV2uN$dL;Ut.&teEc++,fto0m<BPIer.E=V.W37WqAu>gV02W)A-_t-u<7R\r%*4sefT>k?SV-^YjJUb>F,?u9qQajG0'W#,\*fF+c'fgW&*t8$X9@SeqlU=\9KiZBI>-GP2MHVZj;D2_(N`k[:;<e=@:Or5bX7%o@\r%Z91=M@AR;g'Bbi9mfa72`5aT8hJ9=NCrb[C,O=is)+mH9L!S%L\G42:?FfX<+.6?=]MJD6BR41>H;ToQ8b$T0-q_0l6:eam0+,$e\r%E":!#O-C*o=_:20">:7Djf*?@?pm0Be*X!d\Lq28,oq-]S%[03`hhG5h<\^t%"oYrpt]6W.>7J@3/<0\gFFCg0qd2-lc1u,HNhI1\r%4&Rp[GC'M6a2?a;O)D/ZAhSC1o'#cS9/qm^mF=a,]8*NKXkrsDn+j>_V[N7i6n._:noOnrBY(dnH+LdC(ob`;ajXfuF<?D3FQm`)\r%WWTs*p2j`8L#M;0kNRRt5SM7ro5s5r)JhQCm%,gm:$[F)>bXI;Ks"&W^5Im9\p@JFj>_N'Xf"hd=Qut@ELndXr(DjDbMZ`LAEEN,\r%%H+Uj@XG[o[>Ygs5Vps9W$@gHc_!>ZXgt/mL6<Me7F32F\Ar9g9B(6.oTd2XTYG_u\o]PR\gN<Ze"ueqLIS2[oQ9'FP.nd`MPk5F\r%.ANjqF.fT?Bs&]T&:4&F;-b`8PQf;%i'M+!*$78o)$3uq"TV`l>5]R,cd$1f5)V!.4'+[ZTV)$PP3p)uUY&*/Z?'G,.3p/n^7EH9\r%6m9k$Kb9qg$l!47!_99hRZ"Ckl)fFGK'cg+lmV+efsrjLBt+0P_^TP/a,,c/gIe8k8e#rf(W'X4SR#!p&FSt<NPV($h.?*Q^7APW\r%gg0-U"Ent9]=V=]\!A04RK"RZPWVBr]RIj?;=_KK(G9U@Y$X7cQA0Tn:-@=.-L]FW/.F+6mD`GCc;7Q->>IC_guZn6)AY!YkDpko\r%[*&K^_.iJ%F[M/Q>_5sZNltB5Z*7KL*#F3LhgGaMKt[pNbN6ca3HIFlo^__HE"(6PKjUb\2=(d_"FNAG"g\MOJK!)d<cN[/(jall\r%qnb>3#^PGBBK<^PM[\+NA$b%i,qr-t6SH?p)m;g)[9=!QVNOUV^.=\0IcP<JGSI-B,dT!*pd-Xo@%S5`mHN?:k^?e+6Puit6+ccT\r%2-`%ZAAPY/?0HR-D!tgGMk^+1:DI<Cdl*k^!k=jRnWXg$f)Y$'2-clW-.RV\qQ5A+_eLKs?<1sDTYf.toTq6,AR>?)/mWC/(7Z8P\r%][4s]ISVl[rSgK[oRgat8+\dt$d<+`XGu/"_uoY,Y'TBP[(#0)?1`\[O9k-sg>EFbN#$$?8WaZC1VD7(!n4AW040Djd9"Y_^Lg+P\r%F0-74$Ok;%PWl<`#)uEldelN:gR$;F&?"*;_Y.P6eVI8l7:H'[lWDqG08`Z2s'`241`!E)*0UE0od4Y'2'`SI-ri[s)A35_O9NC(\r%_e*J`k/Dk5IUrGgL'/2/C%L=l(k1/T5)`;TL1(+q.qcDIkd9Js__;lB'*?'fBj+uBSP5KQaQc;.]l.cmbcCJt.h'>q_VU>)!/=YF\r%0l\n+jRrl%2'`TtJW`!4@%!jNU3^gcd,_Rg6_hICWJ9PQ:]+HbErE/=WVi<-e,[RP_<r.32N2tu,4+Osa3-i"EYTb%\[gA4/mH>d\r%2\B*2o"@MA]Hj[AY`YBsT""9cj6_"Df!8VK(e=5B29arAQ`Fl!Ic&]gT,hd.pMu>H:BOEDC:%Y)(i/(E)F:og"D`QP=]DOI\`/dr\r%5_N";D5Z*VK*J)jE^e51,W$?a=.2NZ%LToska/2&T3O`='B7Q*"7m8OHV"9[%12L"4!2H&)No*sBZLpMCNt,bi;^$H#%JHM&6Z,@\r%6B#35m'([/)nQkaUFge%(PZ)>k@L[CCt:3^`\,-t"p>LW2KkcMk%AntB^F/iI?^PZoYHIXU7f0#q_3Ss="IhtW1\"YY(&"Q4H?ZS\r%T@Ej@E*q&lKb.a\,ZA;>`%lN#/.X]'iZl);Dm`C6(e8'PjM47m0OZ_[_->,qmG_mI11t7A;>'$%Zr&UQ)o6k$1r_/idK>2q2L?nU\r%-Y!ss4>puA&7ZMGYLG^A]C9sDBZb3G1G(DYpJ"Jo+j3eulg[lUcaUaCFl2\,nZ&ML^*-in6Tt=<X29(Sj0mqa]AOaB=fA=!dqm2]\r%@[SAS0W:6Z%:_cIS:>8@L^H@VQhu#R-Wg'T4cN_N!*@GCW8Gn3&im>t&NZ2DA+UtT-t%b//`f?QYmX?U<bkc?KWtof^<P@X`7QBX\r%^3*^$bIUq\/=s,I^6`d!^0?djmc/>VT)#^CH2"<(ib7\1pPZ)T9-9W`)S=oKo;V'8B^E$:gq!.D\J`")fse,B@r\g8?_,EG3#OlE\r%IauPSI`9F+;qU9m6qB-+pEbMa%&4GIB];k#2s"CR_!md\kM#jpjqs]b:+rkW50n#f9.?7iLNkC;0;e^q]]ah67R8\ig$;e`U`ff>\r%\c5tu_20ZZ&J0&:VMjEbqd&Z2!l:!Ho+ePdc8GeQQG/!ugNa0uj,#5]8L3gb24Ib(hj%heZ7u6EXY\X35N^jk>R@1`gmuQ[m;]T^\r%oBo:!Se498AX3ME=_-WV]SO90F7pfio?YL2A>]p*3g4\6Qa8Q;G@r\"?p.\WH$:T*D.I/A9KpJB5-H(rh\\_-Do-lbR<uGJh#IU`\r%MW6$NE:4`!GLu2\ZsH$(6<PcgRIX\(5KN>'g+.]JY_MBoS@**(41@^sD.C>8WBn1fNN\6tGgEQ?[i\_3CuL@9=JHJr9c2I2c?+E(\r%Z5PaaLgJ,S(,Oi_j?T/M3Dl6\ZJGtl7`NEgYbNVR)As>9lcgs^X-'NAM"#1taX^mt/&Z/nN-U-DBnbcK0]a%H:R8#;Cf?fWV%pS1\r%N%"6(l-]oIbLK9:`%sVf?6OZ!+aDjHo*X1"$8'R3F^?5<>+r)u@EX[D:QBY"42S>afotIh*(@=&GkT-0n;IKmG4B;5d[e63=bq&9\r%]8Xrdhp/A1NEt0!VccN"(Tb_ESR([<3D*eJT:<_G2EkS`]Hg"T=KmIuP9^JJ)h4:cVVp)oj5'JV(@0rn)DB3aTo7<[)hI]j%ZQO2\r%&]$=<dPEdF@V@mg9OTb80SRM.di-,p5Z'l.IJ5A,A)edlG):0YS^";!a3$CjmW-GL$7FFP6Hegi<QX=Zo);Ce+TR<Uh7D-:n(6UL\r%G+hJV]XTJV2la:t-qs7eDrd/mO0rrPii]4MoWISm=[;G(?fFdq/m#O/Z@8C'SILYCZ*<5jf\,bK=#@Fs.s>bG8SR<pf^cFcU$%-%\r%@E[9*V8$@gL98VE?2n>]:cZ0qHi-gcU]26.dJp9'<pI5f$hRf$a)YrQo>kJ*EjbiQZ#cW%Kt56^h9L`*AEFr:^_X-NIjGm%c&QEQ\r%(o"(WS/q&A0`4Nge*Y[REf_8c#n6KsWt:,]cK"]<B\Y[gQP\og/KA&TL3iQ!*mqu@KKLoW_08R@7A2!INmX5B8Uj0;84#j<N/%9^\r%qBm*uWIR>5>7m#H,5AW<L^*])@jRZTp2=ZiY#\W$Ve]daGAeu,d;cFMVOiiC=sP=!oPY<e"("iudJS5)!(DQ;&YuasMn=J^Mb3!u\r%h]fB3qC,Z)$mRT$8'!@m`YajY.7W@kS#J"X\t@u6YH>ZP6VV.,"pXAj7i5S29A6$Ti6#0[Mqfrr)F=ae-8'kXL]0M0ZA%R9m7n"=\r%e^2\:r:aD5eG%PB[Hk;?Ln9,.`/D:u#7HLmr,rhRp>I\&Be^I(3AVlW.[H,j!dV%DV>kPa!t;RE<8A>,<I;X]h;VcuQfh\pYk%PC\r%%IhLAHp0e$m/#L;P%$jpl8l.J,BUItdD)VF0#l.\Jkj.cP*Xn'[`ellq&JbS2jHZR^T+KZ??WNFO-cKr<i3i(+!=h)q;FHsLP@U=\r%A$Wb6r".Lq^<,qPo#"UOYt(>,h.60hT@?5!#4l"*q5,4m>_OlD=)>2Z:7Dd#H_m.T?>uGcKTQ>#`.O6\7R?MZj+2h6.*1J&#pWH7\r%3;$\`@%+rZ&'lqo[]-%jZkLnbR\k2aC]$At@+,gs!:]3i$ALNRL#LI8'aSf^,WVT9MTI\dD>oFALD<&8N,n+l0MTB*&_;_[j^joj\r%1/3&>Q5g9RQVB)h9-71g?BAXX<RWE.FY-kr5-3\Qe9LH&m_]Ai9p*^kC>2]^9tf-0I"Zm2%lIA2NuU4a`h^OJ:#tcc++=+VeX,,-\r%,qEU9^4%Nj(lDRP7H'S"=$LR;<hNgb(QL;l]f`2Q5-UVjKo&ue(#YDsgp\ElcV/#m?O182[atA)F30nO13?+uNZj3Yb#HdQ>qL]'\r%)*Zgs]%`I_(*JO0,>VV4AA>]ZE`pim'A=,3'1cel6i:8ESYUDiqY\(fdAf(J4WY^;!I#N[4fhQ6=Wd;+#*$U9RZ\<ta2de7n+hk8\r%cu`^=pF8Mh+Y[4fF#%;hK^l9n)jX7HR;I-k4JM!bTpmnW$*F,jj@!VOBTgH>B@"OsrYg3goTd1R,0@Nf=IGm$."W?+R`lhtE&RA%\r%U\RO0E2RXX0j<+#N92KV__]&)m.B&TI@*t>+-TKV@u->j#>H"`2BRr++(3rRCd(m`ch3hAa5j#%Dk8j/N[CB$9;^J+'6.4KRT7a6\r%l"BTr2#4pYp#Bao[e-j#E&@A]EpQYm@aMR/r8R?-Zb:?#XW/FZS;S2ASIapqnj-C%cfPn]jC@GW"`,mAo39R-n',P0$0cE+Y5gn1\r%noV+<_UGqUl`*'VT7hhk53>VDLWq3kcfATCR=sB]o@4R4$Vf>i\+7,M^<FCCNrY%T9g7N3V7"5J\<$PQR5X>A#PVY84t[?Z277T!\r%?,7oiCL^eVcc>13k%+&YDQHL:H<K([nRtM"WHK:68\QMnF@<=mTq;sF6m%Ug*unW>[I\HCG*YH(MMVNuWRY9P$AG&fUDA_.-a9?K\r%\<C'8!^!Rc*o::^Pm=LCSem\03KmP>H:oeBcFkQ&b>"CV=0UmrBk$.tnHp6)hIhY,M\mWsdjNV`a@-N"_eLU&=N(ZI!6`7k,8X5;\r%ASm^o_M<Aja;Gmbg).AV+``;E=pQ3:fT<&69Pbkm(qkgc6`0'8?['b46",-Hq5/m&70juE=$qi(6O4W_Z'Zm\!iNF[M8P+1O7(5H\r%ilQre2?`JQ$K=Fo$oV%-$/e/V84.<+@=/>h6]Aqc+aaQ(6X[K5Llq;`[gWS*@nAPeKoe$CaPk&>Oe`8[7"@uC7#L?+(Xs!^O2cbi\r%P%l&1'Z!Qp3b)Vi&bGib:c3PKe]qrEi#a1FS#-tNeB-Pc)L2:J,)40IV$_X0*!-k1A$qdC$pbK+ftAq]]*R_sS<7`9B8Unl>dPaP\r%1F$J<AnrV+]e=FZo1iaKd$iL47m6a8f-?$kJK(/`MT\Z1L"A&^.P<@`QdM6f)^?.R6r&o5@cS_faMI;C=,^DOk.OsCr-9l:$_(@7\r%>8gb"&32n%N]KYT,=HDs*?HD;oH_l)a@-N"6W]m+7P8/+S;o/!A)nhgaPkEjqA?c!+`ce*Z,F^P%$?`aVAQk"r"=##;jS=ii0Q"*\r%ehf+%&c!_T`u&:HD#D]h28A4e&&XT<!oGLqN1;RZ<%NL_71%S]F5rTLG--D@*te=F=hg=(kX,%j5iSkJ%.*nT'HrBcSR6trIYJ]M\r%M#7nR9VIN0M\mXN:GiZBOc.:6!NoshOc.:6iMLPi(c`PM1g!4'q#+%RT<DdXQPkX?$]`=^7=-Mdf2!X\d5OH'Qpe1*[#Q3Y&al*[\r%$]^@-a=dR`?tG_Ne]Yib@&(-447iug6$j%pq33<qjRhI5Qc+8>:OX`Ire:?j5sIRp]$<B(jNnb`1_rRec8Ac>0ldjnjE.jRFc9SD\r%&34.!).MYNL<)Be#1t.UBgUnQ*I':G\9(_b^&cJt.`mN`?;6<@_&8+lqCK2@e.Si:9APOd)4WGS7;jTK\';]p*tqMY3\7ME%7udm\r%!/9<:4g)/<2*KRFqdAAGY-^4CO?.0$a0YEJd^HZSDm>rVf,@=!)dY\1Zn8Gr-3X%P;W[r^VZ7R_73&9?`?5NQ5or#dG_7KA!@2E@\r%/+"#k\c^9KBGR<3PNUd^LE(hP*,D/uUZVU[VZ98XEWC]\%KZ#gmr>1@!M+L],5&IWOJkq^JDmeRjoEnt3hI*LY-]d`7V>=qO6bl"\r%W=4[;mQ[(%8:"NT>?k<WGc)ujaZM,8^uhn2:"$AT\/q2Son-^6>urfg/bunQ7k<0Z!e+HVhIALU_B^u3m;p5r[H\#gRSj'e]i&hB\r%YF[ATd-!UJ$>ssnosqYoLOKTd&\T,ha%P.mnJnu,D?.$INrNN>5C.WS_.1HZd5AG[<DR:hhrl!6kDF4i*6Si&k(-Dm8(pPq7b;$S\r%aGjQ$27a](][bLR8A5"faQ=8I''YnY2iLmI;A+[e#\Ln/^ED$hXt/P6<HBHg&1>TZ:^_>7C*_<gmR["?/aJ13:lE5&@lkMle=nOZ\r%gLEnRNu6A50FLXFpHpP"@P&()+db^M^cPC$q6"^6$c+CaEdMK+bGb?[!N;i#%.9\90ahYc7%kCed:[g1!`2N\c4q_Vo'aaGLlPXE\r%Ac_m"'P\e0F53'-#dk5f!mQn&:^b)jcs'4@M_b.gLg%meK78\2C?`3S(%g]j8$SBukSXtd>/JbOa;+W%:TKi*K-?JMW^3S[>Xp#a\r%DI,tRhH)rML1]<A@ijsi/:C)elV[0_p"-TWS:#0=YNYGn-G#I'Wa1B\<mo=5U,(OD<9WXFd1O'PLK/**8+`lQ>t(O2l@sVq[8h>5\r%g:H)u6ACC#N;]u`%6Z@RlVXpi%A"B0or,lH)6k6J>]U6XRm(*`X@IElQWWpZ5F84Q?>3hgh)W)Cc9%2`d;6p4rJm<\%GF['<]#.f\r%WFZ=GFfYul_D49P2h!u*Ycu>jEJF.M`p=UtoP>V;=T7k>?\mMqMW'HRG"6u4e%F\]bX7eX"s*u=B_IpD0Dg_C+`j(-IY3%aej)"6\r%D?rK(%Er<Ghj'u87U2F>eUHQ5AeGYF(+SEifl,e#k$u3cBYP]^7j<ctcs&sh=Cfja_.q)o$Ir4qAu7LTkS%F0h\]'$?3VC0p)BCq\r%HjhtSm5LV2XAj=3/G:$9pKL/.D(bu$8,EasQ<"(t\lk["RV3E6i0d.@Wm1U:+"-s1m&@?t6"RY$g/IhQkOeiP:&f)OV[[=ab2,1j\r%pFE6saTAdp$dF90Z6N_F"\=bImVumf!Yq<']b@k2!%B\uBIhQ*2J/Xc4HJ]K4EQY3cn+;-:B%DDj\]*jKmqPA?<9d++FrNCZCom6\r%+3ie<Z2jLANFn$:GVHbloSEh(D&JtaK4m(LkJRIq=n)FgN+!%T<rs:*3&Z`T<:^rh"1FoWQX>kcNfaFXr!GD^GVC\br/)ck@9A-V\r%(%oA&OeX]`pgCi6MBp5N=I_q4O'b1'$l=Z;T3o-W\cq`KKjjLNL!@?2aX+o;=G$>`M%dc>4Bi\/2Z=*m3iu$h$qi:h!dh/Gg_GKL\r%+haW?(ma*B:#a*q"G83r(71X`^_M##EaW"$q%Z%#3^1FobcaFMqjn3h0Ya>@J&Q&&XR._![D*3#"n2&(?s!J1@26lM=tU8p/2R8:\r%%U9)u(m],Hh__=nn!'_Y-rp@?=DGGbN)dNP$GOQT@[/Ynde+a/=EPdF]gOM<qE?!G+q%bZ6@D6TU]RM6%]lBETY][nG,S\KAMa(*\r%rA983YQC"2%)$"-@hgYm,0@L&MAK1<GMmaU's@d9P'LOP0;N&&kQ\K0XC)PH6inGX(7!ul,.W,BrNGF7!R?:m[(0'939IT1PW$T\\r%j-S4q0CQ&gJYnii6pOKd!DS+>7-1dqn)?0Eg60qXEQg%1g71(u`PFAC'DlAdMX1QUVMVO#PaX!]N*+>]SLIfjCIh2>To#G_MH<QB\r%o:$A]aP\S&jKt&S"4f2(3GjErP%83D%DSDko$O</6kKTcZ).X%;b>npF4u$9q75Xp&KjA[8GMAT3O+s=S2Q],dc`].TmB?IU.D?R\r%J+nP/,#G9/b\<io<=i0OM/d)h4/-SDrOnYHbRD,1<Dt*`%n*7+p=9X)CC7pa[7.l:lg!0T1ZYoSrh;ag59maZYhjE_bp`$u#(\FS\r%B!`:&XW`oc/EcI3T))bM&cO4ci%+()4_Z*ZfiZjG)u.jm_qa:"]<A*/8+)08"uhPf$NXTEk_4(Kpk(4)oR^_*G0Ti60*h-$Gt\55\r%E^2;E96,Wf,#iH?'A97oaTT/%!>h24q,M>/(2fT:r*1^1I1%uH.mJ+:-7!u&b0Biiql&f'&6YI:@R?EJg;K=$JtM%Q/usI;Q)hGj\r%2O#Gl7qr2^7-:!Z^_,60(<qI6]00T]C%4>G^kkSAM!c&YQ=q-[)\T(1Ln'$HTaVMqQ-hT9g9"R.(.T(U&>><!*2;WZR2k/W,I;AX\r%Zj`'Voq7Qnnl63@(#YKs=YXZK-l=."Nl)IV1.7;l>Fb(dD\7h7Yb[`6jmSL]%5d#a)$]rko/*R,+8:Pq4ZM(G8BDH,YCAt4i'9V"\r%A<$rS_;+&\`A/[WieV7cU1bMg\UHX(dNq+BpX)XrGf?Ua>.j.S4?--gfU8JV>4VFR#.hk3'(PPp8<(e$T3+*n_r&58f@67[UNL3>\r%NP0!=GLVuh21^#Rk]ia?Aiuf+?9emLO0>-F`QpI#rO[.lJei+(OrsD1JC_]A=4.qU0tpe#C&]/A7oNJs:KJo'CWm/C82?g=0jnW`\r%M<sVSl6RgQDZGV=-Nb^CdC)&!rp23iV&n#7Tm__\p[O1g3'feb4#jQZ3*//Yl,IZ=hcjr^\";1`jEP"HHX4Y:Q(I\3GJ(N?4h6^D\r%nTIR#gs$j_mTS68fi1&+^a`Y]"]B%/@MLPlK"Eue@MO2uL@eO<=25Di,K[dsL'HIe'/SK>XLnp_,ajRC-_s!4h9!MR4G9(fmsX+*\r%B!O:c%Nb18NS.3cK87,*NB(-tK83.Y:;506_#s+WSVY3Xm.MMN@KrAXZ-d'oZY]f#)+t2nG6\YHh^)EqK81!o\BBW[_*]PODdqjR\r%<pLWX`+^2RQI,pN1Ua_`n*E@.%N\N@"0Q96%N]Zf@/nD\%t3DY7EHr:RZNUr0=I=!JW=9OJe4_S<j"Z)q@;Fu;8q'coU<=8R?Z(q\r%\mM6bcnY>g5LXmKJI[\D(_g0f[$L\C!bG82]@qMQObXGc`Iugg4Vma;q)`0U3#rtq&:R%AnZ#6Flk;3P7"DAn`BaU>ggb2JTF;SS\r%Ykuf7UXOQNe/$1W,ll)1Xa)oD#0..>MMN*8!u*Hl\fN2!ci?MYJ0YA,F8>s/TX@L,'.g2RO9-G9Q4+9BphV4Uh8@h6<q$"]pO&F?\r%5f_Y!\,A\^"ZdFm9s;nU;P7OdNKX\i+U'p<k"8=m!D,9OPiTnGkYF#(f5$qhrE[KK5?Vm]D*7.b;qf'#_G>#P7IPd*h9PChIF[(b\r%!BCGQk!?<Deu7YZ0;NSe_G9d1eo./3(B?9uY.ZI&++A[i2Qf.7oIi&(0AW/Z0+Yg<>#kC/7K6hBT&@+np9OFQ5<nK;6:*b'!]lg?\r%)8-o$CLM3:_[[pdN;N#>qlb[D7\Q]FE(U+or?r#\'VUj@!js;qSErai#A*p[2ner;T)C(->-]XFA)!&lpO"872'[cXK"Z.t/fg0j\r%!o>,!9-Lqb-Y`sZ(N/pkhg&.`3SKN\P/'*2O*moQ@!K68O*moQ;[;X?S^*!oo#LViW?q&J7C4-k:eQmfb/JhZT1gB"93M)2&jfjZ\r%3Og.k`a6N0FU8nN\hY:B(XSPPPgK8ZNacXdcqcB@V:RL+ZjI0@[+;Y]6$f+IX+XLj+4F'lTpC[mWD\Yp.d=Lp&Wc/#.ZO;hEdkZC\r%hBf7d,SOL@/$!2Z]g8Y&?eq3<l:o<.4EYQX-?5o/6Z[:8mYtd\o<B:gG'^^_hE4bU)+dT!GNUk8cD-?PgIe8k8e!s>3'83jPS?Oj\r%#9/:Qi]ISA*LW*h>j"tgmg+(NRGo.]^Y\<GN7IX>g>k/ZlEIl\oRF2qlph`+Abu2M\*R?I<D2WKXo;\&]B@#M+70m@]#>,c_CTTk\r%ZoR+u0@Zh2%Q!#q20g:&]54FHo.k+]Bg),kES(,Rm:jH72:HL$Mdp3N+!t_AXZsjs35q`6?Cr1c3Bek)rQ(>c!qn4/r<U)3-PK[D\r%b>S]bb]5_hir9a!hg$IH5@*1HFFF1ZXtOhh6Sr'jC\EAd>p"A1S+W0SLR@mh1U^F(1fdh_k?RD0$r2PWAoW-*alpIU\'=c`4KPsu\r%S(b@Nc4)lt\]sjl%+Y7%PPCFQVFr4b_DI8bafu$gCN=MAd[r#+@]+'.,m@KVXi6#O5fdE.]X!j+07A=a8bJa0I]M\cFm<Q"V@!@S\r%)D1pL97B/32\s"fh>Rng,UFT4D<Ii(KrPkXH@qMg?>/M?^F'u7a`SHhgEh?3O6?blcJ`+Q/>f9[SqcYqM#@GJUTSq.`O*)i]-,2W\r%7MfK)Z8`p0>*ABm9QkdR$dFj?EOp=\OiM^LZ0;OdcI([Y1M<oLc!"2gB(F=D/$jp9(6fU2EkCQ#TA7N.e8?Q')>_n.B'ts'Pu469\r%?7>;P7B<Gb+'F*4Xu62:IpJ)ColoM9(n>A$WYl8cKi*?/E^+^-Cr]-##0qfQBA8]W%C?T$O(r:]2pInIl)#cq!DNn/h<EJ5':'@G\r%/KD>SX61iDgY]rZl_b):5mqi:@^5b.pE4&H^U%H\J#.GFbpK_tVOT4/N_\O2:TsS8H6gW/1cs>k&I@%!?AF`Y:V]dDc1:>=@XI<%\r%H^]\enpFb]]l'IEpY*la/%oh&Ik(D#K:.A.d<DicKDPk*/'4u0;*BDY:/V=LA!J4a@-1C%^.-L_r%(NFfh/(L]-\oDA*$4jCr<i(\r%'28"L>EF`?M@.86qHf^OOG]@)?XMl+=IYr<*!>0U6.`bsT%B9p;D@\QnM>iaK)R+0k^N"J68+JSlesWdZI>`Ik5K_t"RAsj+O22!\r%)h,KXoe%UVBL][ab`]HoD"hmXaXa(+LY79uHt&+*M.GO'/YE-U]\kTTm`tJdl2<-6-NK1qEU0U9pf87N]@P69!UithG[A%[CsZ+6\r%:"`\WXaGK1bg#Ci^\C4_-T-!DEiN@7j4r[BDkJC,V\]pG!['[AL_(k1!UmEh1@Ia;Y<c.V'=Z6M#3;f/aFGQWQ//T]mctK%Ar&&p\r%i=PHP=;+$BG[nIT\oWl%dF'7+QnNrnTYC'&rg7W+rj9n'H+i(?.1a*2f!00&Fqps'&*#VXMWE\l<-[,_B2Y?H>"tOma@>s2nFUP0\r%?V4+dM,T@/p%=E&"OFQ\n$'N>2XXoi9+Q>\2j.B<=`f\98]uKl$>pp,DN<t_5>L$Nc[P50fF9[p>!rm8E<A+%'\[+fim*+oI4FV(\r%fM"A@=,cDaQX3'i`:!TP@.+0U/u<pgeMdNup8G*1m+3q92@#Jj1V=\kB3UkArgo>)bADI6IC#3O+A=!+9KPj<97EILH^L.93=ZO^\r%Br9t<^9p?"]"!cUoD7[2W8&b!=MJU<A^LA`S6?_<1koVOX,U$s'GCpeg8OGV)0<)u[g@.$p)a+=a+G@XS56#g!Q>CD6/ae-M5rFN\r%a[dN;b],(GmO@BR_MYX0)L=Y#5>sLZ:Y']K77!95q+QBB1,N*ZRg4;_VSgjdH:u`;--jsCWTNX!NOPh/S1ST-'[tP(pZ"5qT!%Dl\r%:D`68KU/iGgOJ!%iESNOOJu^#]#8m*N*[PKq%H0#M-W$Eo-_C;?$\\a8DG9$<:eJ\ME%1[O&dS.ShBH59V.iYs%Frl[9)-)cW2CU\r%GQ#;'b&klL[eIO;VZ4%Z7;lb3o5rr%0Z2EecI;HI[5-!3?2n.[e"3P`qmFXfIfXcE8"mMgBWZ+QXu?KJhpWN1G-9Vj=WY1RVVneR\r%AL=cC2Up%F;,pO&+'i.Wi*j>dho4?!j_O#d4/1?s0RiQVN?&a7bA-3>/&\l;)0<)k4-tt7iqLFsgUUq-5,!-PlkOZ2<I*?05hANZ\r%)uEb[AfGq!M2fePn*RJ\:L>3Q0"9uP>,fR)@lhum"j18'SA<8&[4B@5%t>C6G8FL#\%di^]*h^2=Jp/rDC@[lkFbQ\lA":3EXp6#\r%;-=g59+(BVUU<\@L7IRG27J;hLE(:4$VgY2"_!&&/Tf":_`93DEsYl13A*/]0sb-/**;".>10]]$lkUR(5[o6:nWR%7Md&CiCqW-\r%!+4PH[EU[&kBOBK)5r+[(V5gL#&;dh2+.U_@-FHQ@0?dLi3Ct&@Di=a@-C&/*F(+7*D,F-9bpT_l[W<Gnd>G)\B'[)]ZcmPYr,Gc\r%]hVAp,;#<cgD!^F--8h(Je;dq,[%lllBQfq]r\XH#aa?/eSb%r;d62Z-ajT&qb+"G6m/A3"u*-36T/o6X4fW2?:.@fB$Q>41:3f-\r%oN*!Dc2=8<=6k%Z9<H^ql3G9`E*!eP?%-qs(0*ZP=&h$;]aR0*614:>@l$>e(XN#QRE#oQNi-N6fT55"bq^%+Dq_EWEO-#!XG*>#\r%d7!@12UHBOmP`HG]-+rYW(Q41[&Z&KGIIl8K;9`9ecp&+#)W\1ecp&+-HTRs)d^n8+tmM&5=\KqAc?tFoQ*ROMsLNr!WBE%Oa[e3\r%&I.8s7,+'rj4g4aIRUVll&'@nitnKXbJB/89<d(%'VCccouF1m61*f1)m*GmYT5_&et5Pi#,%Ud]D;H?1=9J.^NWKJ+WJRu"gma8\r%+l%c3eai[niW8ntKr)Z\pA&Rg*mGR)R_6AJI6'Z<gXd0"%JS7'dhA\Pbp=-l(92?2WRt*\-@orheWS3iC[0umGEM],7SE^-/pbS<\r%Uh4Tc^I`YQrf"hR09a,TCP"FP50<S1jq%'21%8.C(hTRXnVKnl>P"cm1MYajDMC&Q_L<N7+&4a-0TTM?n's_eU4MJ4G`'5i\&ld0\r%2uQjlD3cZ8[,[[LPBuiL0=Br,R3:pUHnI5VgoP\&5#2rZl]5,dFJN)I;/0\9fS?fD3)W#pdmkYLmdg7PH7C$UU&XQC^$!u&<2-dc\r%*$'['@&H(l93F\Q-TCWcMA]XX+FXDM7IZ7qQ1j/)g-*#'2lH2FhYk9g20`#>Bj2pf/L;oKp[B:=YKMY-+P:d_R!Ikfg^>/kV-%H_\r%[/MnL`eB/"b^/-`E:*cKA7e0Xf@b,,11!VA^Jes80ZT^=Oi-"/f&XU5f0tVkd)YlGUgo:kmpS\)G[+0=Ai0r.#3?WKSI3QkU]qp&\r%D)-qK0`*,,qQ:0?U[k,&!C"J\:mZt@9t%*Hl"0QT.nmJ//$djoDQ0:>-<CX5o@FN8<eP.&ace3r]K%YV##(0?R<inuVAQ_n]gdMh\r%'Em$.$,Bgm$V`P$juZrtBqf>/5kQfYD&STNIa]4=f$$Pt/_;q0o.cc0+]3O2>0gYKAt[['91UC$Ft,N3*YBJ)XY=CcTO5CQ,JNSn\r%$jfMTjQUFnrUsd>c-i.n)Wda:]KQJd:Te:b)Cn40($8hO0iqiD/id(Q,FpPA?)Ee]jqbT8Z,b!@oDg)(Bq*_g5>HFq76q`_R?Jas\r%q<bL2Q4+?uI^*oKkr"Crm?a.0o5Y1EVKNmUqjlMB22UjGURF?Y!$0Y(M$siL6`rE,([!ZRp2j08D0Udi>[?>O?#V0\XtHWMlf[R#\r%\2dZ<fo,7^P%<S;''JK\`+QZm`-Jr@4Z7A(M=YibFU[g5F@e6-Fc#^3U$$"Ll4W:EP%<S;''JM:O?FGsdq._q6K/X<HFgnQ*1?9D\r%B\>$:rPHd&0m^E=9f?9_i]LN*r(B.JQ\NO(i5L'K,&Wu)@&kNj4tq;oB'Yh7RTqnu'gGK\'UtnknT9?9eoZ%ko5mFbZAIN(ZK$@1\r%Sh=skR'&&]Sh?N>Bt1aA4^C^81@MuR/aN0eQ,!8]a9C5,.]6jZl?k"UlY:K4S=L&^M9kNimaT$sFtWB2]#T^-Ld$!bJ;?UtErdfF\r%W9t#$F%N^o+H^h"kiK(7F:#3n_->.(XNJr9je$K/cd%6k?3O49LPbArF<\h`Cf:GEiF_*"fu;"fKt^2fB:$m!"Tk&^mOi0b$0pm:\r%j6eZ>/)SW)mt`l+PWVBr4CerBN08AgamU3%Wh$ii.R@@UnVPE:+K,Zh(1F^GC[<Z*;.jTNPp(f"'%A5L[()#B6.mhrpam7,#`Mea\r%lp,ZsGN&Oo_(6Baa+\S\.9WggM:L9oai8=_VMRR(b9a3b%b/;@$VfYj"#^#G90D^O)U9Z8#h6X3*VT>_#&95H,E[NqBm8FDJ3XQ+\r%2Odia_?)S'=.6Wa%3kb7A=k;^p^SLRD9->GN>kH\!G98@'>rMgBj2JsLHl:W]s&U3++,*ED,ZA[o>2BF<:*uLoD5:@QV1OrN.3E5\r%dA;.-E3p9Ghq^`SRpZnfC9@08/[[B.oGlhS(:+ek'naZ5J5/p8_5S?\7>TW!=3nVBMVd`CR5uh%dpI"`lY(e!?0fei+K9p@R=Uh5\r%(,\"79`@b+AHo`>R@`4Hq1tWhbT2h%d&SH<nT01Y95<:V4!ZO%1dc1lO/rfIcjVEK>Zi"cTp\>UMHsVQ9]ZAO;cprS[,U0KPGf4O\r%^9q8]/hflrr2bC4RtJ,prSICsFX#(8lU>7ZZ=ZKmXS&<lIGl30GdUil[P'FX3(C%%IgCtC9>/-c+Wt)TD%Du"jOgkH'W#.*7ZLX;\r%'f12u$Ojq^&*t^aXS&;9oeJOc^fiB;o?j`<ep:3[d_O?KZdt&/eB?LPjt2&RmsC%Z/.X*c+#5;89U>DS#l&](ROmp8f.M&?mY)+E\r%kduW[#Jn<W^$D(VZFj8A]Yls9hQ-SZHP>DhH;Q@E1KRcP=tbb20*Au-WV)u>HbiLOW:_?G_i^6&B*UhP%P5IqC$3:WQEY[5WuiaY\r%UYBS8lue3TK)DB$4%CTY-RLNAB"4FBGC0-CHg-rLOK.9%)T^_$'q@UH;eVQ1]`LM:4e',MgV]f@.l]`L9\"sRm1gT_0?JUQ]n/CQ\r%P0BiYM_<sBB"(hfOj,Iq-*k:#gKpI(9.pf[R2;'b$ehm[=-kmBQP?jOMojEOCU1jB,J_c^<B#Z59:Vp'9[a'`PW2I*,SO7G3):>a\r%(JZ1jInplZ#>J9d3):>M;kikhZtpO,+r9TJ,4]$HShA3X;G3OXM_G+ikNT;B0>=#132pm[?"St+Zk#sul-`k-grUd,R]Bh,.*8jK\r%0Ffj+.h"dg8Q8J%H<8CRPrMPUjB]^u"GM-4ArR!Od4(2@?-m6#:uN/:dfi\-?$Zrqo>L#Lke>XS<#8IYV9q.S.tlK$m9E9XcZ)ee\r%>05+P$59$X3R'_:G-6A>5aV9RnmH+0J\H:[Q6U_/\W"30MNGb9G-9NdW),PlBR8LcIbo7N=gG;/3u;.MI:3e'kF*jeII(3ugt,8s\r%EHfbMp@dh6P?qs3%c)g&b(RmmV5FIkGBQDuGO6Y_M7X.$rP6]2541$[-O4g<Z+@PP]sfsl*`i9-;=YDeo"(RM1J1uq/8]4=$CZsA\r%V*RqE].kZ[m](Q+/sED\j0$@(M=NhDmde_UD?FM`>285_6oj=Y^1m.a&d8rGEsYmb3A-\-=BR6pNXNO:98)?BRU/IL/"#@;M(4K3\r%,GBZ,7OOP\5Ri*Q+g]?*Hp-Td"DZkU0"F/)k<KIb]c^$BBV7i=]Q"]j%PY385`M0u<G8$0L0j)&Kn:u#,13_;heNRGit:!hRnMsB\r%=\i8.n:FOg_(We7I$J'fIQfEp/p-JdX?NhjP']=*n#B[d^*#kk1pb5JiqEg\HP_lJFEYD5[H@&6fM#tf`D]t,?LWZLkcg>;FC!-:\r%JA%qW[oa_KRC]&8HX4n`I?B$A7=LZlV'5J4s4:Hd1^hS;gqq=Tfr(][C7mLB$Tk*7nVlfE8(Il580XSm9dOl\Tsu<[?-j#69\`bi\r%]V-4oOLVSSGXF:2,J16>*!4UI=ta6:2-C`(:W]H;L:[!>0l=$/KaZ,kH)L@eSLddWqo*1E1/_fFe9Y!E^-HlSZdt&Op'!$[0l+HN\r%9"k4Z`Vpl[bfPB$Ef6l$6c+B<HP^.3%1*+@*>#l)%IZM<#6T^`Mm-GR_LRcU'1"=raAEW[__;@KRGX-BLe]Hj(cL]_'ahk&[!Ao1\r%/@+Dq>obAspW^j2q=_PmJmfLLR7s>/(l#5n,R]?8(i<AqHar5W&dAcMDKt=_T$=D"a3&Z0X`CrtO51ia%46Ho[)-e,2'gdlF!^SM\r%Y#N6_Ph1>21ZP'\#_P*hjr/,5#!fU<a4TL=ET]oH'u5%Db`DVfX:#t]eJ:K0M&sN_(BlInL%euG6s.q`H=F"7RtVb'^=-oAa>L?!\r%XV*s)eLe/0TB@WL<\W+Ao9c1U6^J]`8?O,Hi^DBg9nZBHD26l!#"-^pYZsO^KB_h@$PCt6Hn86DV>1KWjsuhnJifA*o+fJrOZ!mP\r%\V>e3P%8RCL?.uq]0.?Y%3a9k(HO.e%D>oM9rqVeN*X$ChI>jZ1Nob>q_Z!k98?Y`[T&Ps:H`1S&n:3J1;!VgKJAEk1Uj$Lh2.&p\r%bP3N&U_e@!Xtps-4SE1d(qX/lc=ZGV@dNY]232J<b.jc>qNA?-].C*ARd>fc`\*3#Gs`C7nB07rHW6&G1j20&:IM(3_:V2<prp4m\r%h:SPhqOB9'#8Z%+<f:rCRJK$(B6CWB8'[FC&DPiKA3glE='C9^$i#/$*\Z0m/AdY-Ug7T.pd/0l@i*luBtJiGdo?<A3<K!.bkSPi\r%4e:MY%7u9Sq5Ul"Ssp,M[c/.9N3!u+]3NCV^d`dc,d63h$5-40VR#Ber9/C;m>e.720N,`#>QoJ,C1<@DP,*P[8XhY]+[3EHO*k>\r%%=h#Ljtp/^#@Cu-_7gLsQOmXC<Y&B9>saKU-Muq&f>Y"rb9p:7VQhWV$&92db>T8hn_d+2WU&PWm"4E>VlgCc?#+hH?"gY<X6\bY\r%m#q;4\i:V??l.+dY)?e010f7"l=>poacc!pS]n>u=l3(u=!u`T%TAgi(].b9-2C.A@hND3)!]lsA7Q(qRK"1R\*aL5P=AR,)54fe\r%=__iHT8iN/BK3)3itn9#9n:g"WjPM=!hc,8A(=+T!CQqOL,9f*P6f+&'O:)g"%-,ZK`t#$hTkmVSr%pq(d#FFhj$uMZ=*Wud?tuU\r%*t.:+L+SI'g<O4lg"=uHb_L?2oo'1!U``ge>X_\-Hh&@/<*?ODfq!Uj9^7_B1Ds)Zh6"f34-L-!_U4gr]/)HZ,9(3,ZJjkrB<2h0\r%aNulcd&T*6Z3t$LMPfb617q8FMV^9%mOnB8BtJu>p%^N,K%r<_K+.(F\SpE42Uo)%\SA^!SF+WZNu-(6[Gjf^F1e,rA?ba_>A*Gs\r%?VR]7=O.NVX-%rlnm[RYM>uX/+:-b!1?W!_FZ$J^&\X20cV$edE\L4r5=2:=EpQB15rCDM7[?GD,L:CWKN9>X@UsTR_lJpA290ur\r%ltM0>[!CrL6M@cQ8S6:!r;<YbjVtc!eteH*\=BG6dgCMlMurSX=jdZMYo/d3XEfNdBnZaAb*5uKSlTN:&$k72ZDSGs<"6k6GkU3C\r%R/'mkj4TXVn\-;ZG!(+]Q_$A(hq>uHZ-1_>(79dmVm-VMi.F)&@Pi81O`_8k[6^?hHlBU>;26;Q5%83<aWs>%0'GX^nICCgD#@HR\r%"ih/mDbgYt`4EHFj+6/($=3.k@5d19TKO,Yj!/2)E6X'se(=iM$U\`X`6`c$;^+5QfL"Uc]Pl*JpkXo8iga9HAFADoFTW&PWW*GU\r%Q\o[f--5DqPkQs4:9KLhYFmJ3Po;!Z,1^q2V_Yopb>PY]`#F\VO#t7Jg6li^4'3`/]C79;MKVCkCj=m#",XMK6tl_GH7r#O]["3F\r%'R.OAL5-Kj[(%W02S?14%Oph'Z*rn?/U/L]1Mlm@[BSiMD:hHD52RWOZBsa2<-@dpZ-ZW,^jj$DQKg-P`8\i:<FY2>G6@k`d4<Y,\r%\g'(5UnNG8K"%+t84*XN2:KA4NAO&pk/36;H'23@(e8-CLbDG7(r&5%2\oWnb',c[=-_W>IkDcXoB*Q!(W)jo1pq;p!,;F`f"XZD\r%]K"W\llVJ"/f@\,:>kG,orUla:,`Ub?]MJV,.a<B$T6JR7!(H$CoF<c-DF.rB2mIsPb;63<7b.Lp3O-J26/;WDjep#l/tN=95^;;\r%"E0o*;5l/pU5L?]4).,d`/M=L-"ALI,.^:im<b\*\sS:+fHKe=%OV#/hGi+s/>[6PigL&q$Sr&amkMd\Q`Y.lRcr2WPnBrIh6;$G\r%:sMqZ$4Z-g+u,ZU<i@=VCRtC%hs3:!4M32>i-7._+l9c(8rT[oMsjHn&/K%_e^V]I&`4lo45H<:fLIIGmp*GIr%k7J(0:!0r?)QF\r%=69ni!6reBo*OOT*/tKb59io&m52EUZb!a57?2q_lZbY37#o)@57>Q"f*7`.)f5/Sk/C7F5HZQq</mC;"F[4U,rEHiLK_%=>#R*$\r%fFF1e)\@RMmRrRS8ZgOfhu1jh!Fqs@aiCLq6u.b.FBGIlf9>f7riWo@MXKQ[lg5.'@dXIjQD[fPQi#fG5$Vn%Co@bQD1pdNO=&=R\r%#*&O1JSUFmVe8",Y*fTOEI4"(i>T?Zl,pZCaH_l-Zh@OTY(s:(0g23n6CAW'3<oK]87c+$<F5HZ`<dKZZ<Vt?NZ/i+J3s/.^E<j<\r%@_.Fu;!\R+cl&<=S,D[/l47_tZ*mJTaO-/E+hf3s,a6MUH.#A+8L@PJk`AOZS:coW($WBoI?@8ES:_\0DjlM-ab69YY*6=2alMch\r%p[':s-^C*1!Y#HsDW5&e#sJ/j\qu&*"(T2V7$?e!QuEn9RlHdG_OXpd\qp[d/M3qCj?:33oqck$ai`9<+H+kso&RH\VI&S(3lF>U\r%=BfS?^:>MV)`/fpCPaM8,u?t>)(+5<dO[n.^7.Ha;7_o4I=5aQo1QeJ$s.mL1)QmDpXM/glCF3n(Xg[ShsO[i,F`P-aYZH#9=-ma\r%`9ma>8.//l^K:$%j5N+O:\PmMP)8\OAO7?u*fgj.q7FV\8,bihDKUIp\=DbmC.Uu]Q`KrPdWs[a(3K&q5eptc1<otg.^5]3/05;r\r%GZo/k)ZkI;\j'Fb3X%ithH>C$E]OO^*B<A[aQ\Y=h4*>jI&O#R*ZPFbfo1a\fdJfDI\)nPruDshn8qS9g$m/1^Ne?RAAaTDVrD"^\r%X9D,u%'@p:?(q_Y-+HFr<1a>lfEGp?\P`JQVUu&Z.sr^c8?iQJY_,n?jqPFA<mPWYmW"\,VoMK9$dPu/,X!1tG*1T#9IY.f-uj?,\r%_gG&B.<`O[2L6j`Ut>h]g6+!RcfNpeSuFaSFSq<<(Z3>>rD[)@G/./M8?iQjE<9Ceg>p0^T*uG8;j.lANtXQa>Z0p?1[M@GKfR+i\r%^K=K7HeMT&+3^i`/2InD:oo/gTF<p%Vp]be*nJ`74)(bOb%nu"b\7?NfGj<ZWp:KLPiALk"_ZIRg:Wh6LW9*u%8Gl8&l\Uh?^[,>\r%GSjROWH5AAfV)/hXLsQ%muY0*#ukZ%lC=5<!qsA_iWOFhJCEZFH.Iea_JH.%[,"./'l#\reS=6mCT1Ojh"'G>FCYuTc5VgG5]>^$\r%ZS:..i,6+,%>i>Q,K+[+\<8LGnNn^M5FD\U6o*Sc=u[+A#Vk.+ZGUk'0(bklh+4h25(p-`n?*JELCc?H*-S(O&Aj1;)u9?:,_Q[O\r%hc/35LuC],)rah?n`3'YB8$YXL(?Qt22:?BY%*:5F<eoep^m2L-\;jP+:YH=@\^r<jRkquh:VReW;.!*dgc.+4A6\;VAmtW.u4nU\r%P_cKQ&kIo(;U+A0bIP[Zqk;G&?c`X0h<=Ht5Z._l5<\H:?U5,Q6UPtV`e*Jk\l#=PV^41R5HLbue+l"-duCVViMYlG2Vjn(Q\XTU\r%67?VT[m^L>([X)E6%'7`6dDnoDpo0g&\Ujs?HgLc(]$&qrVYmC3q"cY."fP!-pQF"[$XNGTSML,iptN:iS>QX.P<@`Qao3CF3Q_5\r%DX\-mTU$j4\cI5"GY:r7](qpg/N7U8>*?t0qeWHs;bIb)\RnJIkt!!9h>CK?84Sj2)A(A\7)jMn\e3JU6opJB8eT^<7)g3<(>"^;\r%3g.i-'@r=7pn\7uZ4ZjX8s`7GIL3T%\?mMU)[lZC'(%kV4FRV3(JubUdFD(@pa%-u&t`4]/P5THepR6=h>8N1\mXFtF0_a1,]_%e\r%-6jZc8cF!`4BmsS^SGqS@TnqbgoHg.,i?9CXt<4u?]nqp/P01<`H=#-?Z$`ggpYGNQk9?N8VCI1n5S,EhbJV)*]4"e8ZmZj0_MgL\r%JPsmHeo\-%i5741`Z3<"g+l407V\k#RWF1j@5d=,ho0H:_2YgTZ&3osmmc$m6ND"V+^/bBi?#>%dt&"2g<\Y.?)b)5P0u-&[I+nE\r%dum*[P0h]+X<i^F,f+U8eWN>mDoTMf&-X'$^I^0l%1fG1YJ%'`8al&RHSTFb3Qg:L@&VC]&ZV"]W$SpBj6XB?i_;!jgM\&L*2/[M\r%BHjcm-lPsI^HBXT-tjfQk%@?jW%W9L9W?V\=8Lh]qn_9f?9>Kd%ieuD:[7U($/?p&g*?9:b+<qHCh7YL?3bsYg=0n/dGu&Ii&cb[\r%G;?'M!"oIn8A4^hd'`"Bo1?VB47F6,!.9dR3#R[]-&HMXSA2*PEn`6GlF#m7jq7mVRg^gh_7A0F;QiC6*L(oq-hSDMae<,C5]Cl*\r%Ug=.e(mKC7Q$TQ;:JP+t;U\V!AO[$K^#kN)c14if;m3*sq2Tc(*KU.tYA=*KF]b@NcnV=;PTZ0lMZ3'ShDYJ)/cY\6V_ogsf/W*9\r%Sq)6XD5"T=A^`05)VodBD%Luqe)t)5j5K0TrJ7'@f;iY!-*`;mnf,OKJ3\*U*V\(50[U/$^lFV.%9WgU$.s7gYL.LOBA"H[g`aW=\r%4[33RG+AKr0`2PVMYDa8Q<n;)qj/RP%pR(Yc117p2r:Ke?ksb/M*W^GbnYQugLG5T3*>uFTb`5_d%hoq[1LP+an2N#).t1;ose9c\r%p4Mo"l@J#^eBMnTW.eUpG`,FnQI`>#P!)`eob],jJZ-Q`:"d.)oR8MLW$Uio7uiF0>"?Up_.d*N;%(2k'Fc0)\pA0qC;OG%s-6^i\r%&\EA5F<D0oKrWIN@oj20qLkOXJltd[mt"Y-\C0KfeRR!d#G[SJoQ=6^1]',)YqImmDd3ig@<j>>W($+'Y?K(j\3(0e/SZT2?E30'\r%n@'*N^R4q_^H6\_7uWY?CRdk#\i.tkFFO>4@N?hF\TMRi^^Y[Xd,MT4UXZ\SNi.)td3$alSSYjjbrs@=gKHA??$(fm?^s7/!5E3L\r%m5T+6'Y62SOX%n<;s;r.?S#fZ[/HG?lImfT=O]<E$=0,cI\Ddcp<p@FX%I.^Oo<`l939<MB7qhQ"/BAH76?Zl4ThI[0na-8#$^IF\r%/`S61_u%R4dP>0<RBK<.=!T-7PVTM/7.TYZ,?Q;T.hXZ+0h:Y^KtoHVn6#B'e&u5_(r&$cot^""@guaVZJRoR?U4+$JWKbAVL`q0\r%E/a8.a*o8TJqJUD'Q%@j;mbEVfPf,.%Cb6Qr@t>'RlL*\hkVL"&AVZd,8(g"p)?S8:J"sGYY!?H2f\1C&p<M7*;^3/`p$ZFin/1.\r%p/6e!RlL*\aL\VpE)+i1XZ(7d2mCUMd!E$_Hb;Q-imsTK/8mYVrPn<*['eb`!W&c7gj,*ugK\'?XFWDnG"lt</:&pRA=B?;;Ao_g\r%N1Oc)p#7=UQXh<@bXRI<f9;sF>!2+>#+ELjU=\q^:C0"T2pJ)=2d+&5jOBSt],`K6>XqTG\%GI,(*i."&'a*,ZKQ%-:,E@9`.Q`#\r%B1Y5D7^E@p491fRn'Cn%/(?_=+Uh!t^EUdI(`&/mfYXggGB619q'>lqOjP2=@0u'tFN,do_\11s)"2mj0_&FE7q>_,/ed!5E'l5_\r%L4paM07LmQPN+DL_>FYA@j])K,PiT</A_7Ac6YKc.m(W]bccQsKa5L.bcdC0,pgG1gH0b5'eu<X$Ks*e0J(%m+[Y0n(m]+E&\"K$\r%?Z:_eA?hDopiE-oT*rOLbcdZsR1$nFbcet(qfJhl8`mpppoD888&oI'.</cuK)$.uMIKlDYb><OHr0.GBN8Jqa!s!b_Pld!VL-K<\r%oLjTq%'-<3,rFM&S63`<WT^?W/m'FW<`=@qTf98B5jQ,jJ'K5E$TOm4n^&-]Q@rNP^3U(`/:1ci6!%hJ+#b3B`=&[/>&0^3`=&YQ\r%Y:*JRie:@Uj;*2H`G:#,^61-MnNn_@-*aklD!/$TV,L/s+)?Xq;GoO0qd)qqkPJV.8#i5P2NlJmM)qAOg9g^mA7B7/&X1[55SJB2\r%7HLn=PW&.L':.+E[eHuq(@MQ)2&DM+7P9_?pDPQ[NEg0NRKu(RObogT&T'`[_CrcHg47R!cM1!d3Gm>cC@q$&a_@O:(6"[1k&@0m\r%'1G=sU54CJ,3f[;3Geo@TP%V6:)dIOGhefI65'OjoCE=<hBboLr]+hK-B\Mo[#o,2:Sk"[2M*YsoTi02D.d03OX,k.BqrgNi7Q2/\r%OSGoDP?09tCkAde;E8;b>hd*mbHDXrp4Kc^ju?XJ1C;EQe^6b<8'BW3k8a=7r>_"?B;Qel&)p\Fjq#2mRF*pkU_XM@g8eo/6tm)t\r%-/^;k_&(9,]kATHO4h=8I3#eK0.j`923lBmoSs7`?Ol:2iV.VL0*h+Nh7*ISja^[ip$@+Oj+&cfoWk^O4Md?dHKj4#+S^7dDreXu\r%j50XYFWqZCq$s.orPGUU1[S8R$"o3$j^s#^SP/),Jam):iT?`cae#@96Nh4W#j?=.rgY5BOe1>@!*ubi3a#^a'B6j57qt%$,(1Pf\r%JKqH@N0YWmnWd)4Bi-uP`pRM.NbHEDh9;I#:PQsW(lH<FH$rUEL'VD7kSt3%X'1\HE(%&A&U$@tdi(@0a7J3lqiQ.M#Q/Z._<;jN\r%/ZqE249e;Db7N@uqH,a%>)!<m=.eJg^UL_LhLbHiqPBWfI*,&g3G@MEcf[>dJqgmiNgcttjk8g;]F,O4,?imTC!e\(Yb)o+,I0$l\r%=!K<M*>H2Q)/#g0)b3<>&96Y'aRt1k(c;9S*d9.m95rXT-jdM)lD_q#g/[T#eCN#kPuCuhe@6?Q4!/bs$c4Z9!lU>gkbtap"%P_<\r%$_QY7-,pPqncH*=>pV!SC:K?1VERX!:UcB[nEEbR.'Jl*,sU`_[TV#q\s#-eNHlh0H0-M-1%]RuZGsP]J[K3D:Y$AS2`p\S@FX2:\r%geY2F9Tk)Hp)S0/^%9XdD6s"ap[tQ<bdMGY3t'M3IDIXY/&)n3e#Sf_>D=rF0!"._'AMEVs+.&[`_R?#-aIfIe"2KBpV-q^oDb@-\r%)uD/1gMSp3]eZKhDlhrP<%J>TS?Rke;F/og'35D`AjABC6d9QqAe7QA`&I&H`f$2b?Hg='_mr%QZ4"_!_;d#l6'IHc#7hti9P'QU\r%RX%t[([1(1V=/Wi7*M<N9\9bKL`&aTN8WV[-^BCQ_&[]N*'CqA\q3WRU9\Y'`/L:d,K@Q0p%!o[n.9%5CD>ehGUs-=S!`HRJHd/3\r%HR:Q/\.0Q8qP`nb/X*V7hs<Y3"Zkl#[o_c!.F9eM9:LR3[>5mPi^Wq8]V4hOgQ5rc%N`B_dWu')kXJ3HP`0XXfn$1m'rP:#Q^b`H\r%*'W:"1OrI.e3O2Q"ZeUYTVNkuc`g>T5p,NpX!Og!Fm.h,,iTp$e<K33CPYX&"+pe?O6C^K8[]Vd5A2/q*9Q_D.g;d,52B%6Vd2i#\r%HRgV!@\TPi)qA461Ot#H5u5&*^X"uN#-e+R?I/[@bQ,6NEJ"HD@Kn)<4D5j(JW=5W,?W1$]$8g7%\EeC\1XjK!speC*[fCbPs*h&\r%*Ug[]h?>t(WO,aj#V"-:)L-%ONfX;_E!qQG3UfG?SiI&>M*J#7^Kt+/?LL*ZJX0OtR*rmY;`G<R5(oj1dsh'0*k!.LC1U25`CJm6\r%BAp:KG&mQ2H<HkIa&*/>_Om$Y:B12NM*Ri!f'g&dO+UseoC0,Z=QgG`'?Q7$@NtVGK3!]dpDK"gNW#+](&/!&NQPf%>G$(haNZlN\r%r`RauQMqlffE$KA]gFWoS>WGF8eABUamn^fFOX4T?61S2$!']:p*2mU3C9_(*ogisnthZ1NQfXrj@_)`lb^hoj@_)hSLG'Gd>]B:\r%3]=Ca`/@']QLl^0:A,piGn]%Dh!@PFaNuFDS3OCa>S9!mOY=+qqtL6[7m*^rb-p2pe.Q;kENpSh;G65cn?X3>in\M"XH%c#YN:6^\r%+U$^3]#SFM3O/;kEguq]0H\uNHM7#dJF\&5"-WeJf4XYH<`Vf:c"Y;Eq[0ptGKR0n-"H&W]M\a1FRi:/;[X[Q6`%fF.`!t00HESF\r%U,T-+:?<soPgn!X<kuA23*+/d'Bc-;o,7ZVm^fk--BVX/`iuNVeJk+U\a&%a<,\G@Z0:&!fuDi6@Y6Y$>*iIb>HQCbo.csJ%f\>T\r%Etr$d\!mm"*MKBoMt8@LGD)iO(sX@^V^^>W(b6!=h8Jis@n`.uha,ff2p:N64u=Fo9\9*A^<u@0WT3/[4Q#/uJm@W.[lJO>0$eU"\r%rF%37md`\MO?OH_G:f[]>7THMKt<4:HUskeEjR(LY5YU`ldH"62>u]j%ruY4]n)W/R_N;b0"&'S"CX@3#E=sGVl'X9[3*);Usr6i\r%+bT/PNjJM17b?gmY5LRjhu@eH!d&i!faf'EI2j2W,4#*`A\;R'B@bE.QlD="n("JN]AmM;2L:o':?^B_FZ#0V`MRpN`[T\$LZg=U\r%51-jG6an$":nTVmP)6S@08O*\$f4>uLCFPcIJf$pQ$uTDXL8<=Q/(MY%12rA(*h9+A\,VJrImL1@gugJ$)+Z$+3:V&>/)r%KOs;u\r%;msr!9,eVocJL0ZFoA":=6k%Z9<H^a25Bm;L+5T%=7t3/O7WVu9+ph.^!\$B/fY(.R0rdLD:kDh=`rglCu&s&?Zro`[ZJ0F8=qL;\r%>*ABF#Wc(]Q6Zm`+BQA^BCIn\2AVh6og;NH'[)cm_3,4Jc.K$@9\/q,)I]])X\CA1m<d:1"`\cq65UT+-<O.e3k_D:63N>`W6BXD\r%[drY7Kt$bMk@M8*pl/U]j5F7Zg5i=R7)/A;pY(t[O.[sa>OJ+(-\$VpWo#+q^\/>oVRdWmAR"U@Tukst:>*Xo%Gm/_46I+'"oHCp\r%rHnLS&Rchf(WYDiE*);)hRVD0BLIC'ptPSFl6Dets*bjskb*F?oT*N@8sc!5NU!1M!a)RVB3BK?<1OW*JtW]8QtH0G@'R$e4u)Bh\r%O'<EQg<H6J>.pMOE7qJp<;O!,;Zq`JH-@<=:)OJ39.V\I<,%!$EB;HB$L8+O#l@?K8,O6_^L&=9A(Lj!CdY^(]P^EX*AfG)aUrbI\r%H5IFOpZfDB?N0rrIn$QPg!.l59A$H.p;8?7Q.P;JFjR[4i9:96U$q\lZ?"\o5?;\g6W0>J*TmQresi:\WAUTt"E@f0PG&<@B!m!Y\r%H*XAB=0cTt=hsA-V,h2h4\\+62i/;kAPXD-DN`&2TLT.ikeF`TYO,ZOad#K*[Z[CqckGbfVe[`^bin,"^)/qs5bcu&#!GE-k4JHG\r%WO&mWFD#JcitK-'K2677UuYF_9O:pq<j(lL6&$-tQo_&LiG`n$$@&`pV@/NK$Mkm&qd4s'faPr%IlG]_J]`eaKjm$,\AU2O,oePq\r%6"VH3I@Y5-V2Q3hk3o[fT)!Uia.1r4H>tt`[<?a4>BjR_qqHR*ZmZIP%I9[oO5P@mA5Mn6!'^tT2M3'9_Qk?X6*kXNJ43&];76h$\r%)SFf3C8:?nbQ0oHb>=O]"AQV2GA3*7#D`0(K:^c@b+Q#nC-C`p5@cspJt(Wfiq1+9Q$.l%f_'Z<=>bSAnML"Fb&,ue'pQr'We"dT\r%\J="5`ncpqQNQhg^`l".Fq.36Bd_Mg@asJKqGj($*U1Ceoh$h;\>s/6aX5\g#L"Gf1p%ds`dgr:4>jM.op;qk)<1+Qk!9HQ]P"A0\r%&SS&rSRPN5G.U1%a^iY9E0<o5,]#[dhW^#?7'sh$SUu=`?8p%ESD)SL1+9RX7^K/;WC_CkKI0K%S*5?lCq*WUP>%a!<12?n_#;C*\r%9S[3`WHmT3IPFo5i[m/n_uh%:;h??]b>_BshLZOe9[#_UTa).V9\mATrGfEL0+,8nc"@[-JtZrQZM/8#@#:pWS>Qb+"\i'b3)A/M\r%1ZAeVid/1bY25g%D6W`>-a&+;!sHsD+7>^QZSfW#<J!>=GYJs<5=%D;TY'-Q5N2<X_0$'DgCofdcJ-eO1JCX#*Zn1Efudhe(jAd-\r%^S-qWI9geB'3@u]s!OpBn*=BamJg@Xrn#<2YEd5]dm[H./A;AWShAr-/Mm5feB0&VdhUZ\e64W7Gqo%0oZ!C,<*+ILopf$tFaTV"\r%hgQ[.!pj0WdkWP::"RqXOr'aE^'e^pCoEo*T.]<I9BTSi^4Hh#+8Ze<S]cFLYN&3[o8#SRXptMI)\(g`YhHW5R87a;Yaru(XVP^8\r%16dlPm9Gh@CKBP1k<dLD[,0F<6@4tcH?X7oaGrk?M/6)mY2O!PjmI^i"'V3+h;*c3=KB1E[Kc8F'45sMmc8Eb]6Ls"oZ!D<I1tM5\r%)i@G43Srp0k_A(1EfR>]TI^P(]$NJB\1;`l<,fph,l9&Wj&s$2E^97qnm@q`5]U5Fp<D2D]^e92k&e*9X!Yjj*\19WMk/m[T0cY_\r%[BD[rbJhbH)(G[u=XDCiF$*`a%+GR&0>?B11J\%c*7,'+W.Y@ii/`o$MqC9(4Joabq)J[p@-E<YMqC9(4>rtb;J`!1L0j^\N-ckR\r%,O&HrKiI%mP0Pdh.5F^%ml[=#L2NKLi0l)b%fGCSem'hETeZPS^p.JYS<"(%Je9r7AnkP>=B'(<T5CQu@A9*kI6T2b.s\Yl1jdc%\r%<#JYi"hbPXY1=@3A7HVm]IR*+W*Z?]$F]<;aRn*3INUI/f94;b#`G[]Kr6)K;P43[B[+m%,(`8\Rg9ce2O$o79gM&0^(-UJD4I`q\r%#L2lcH6!N/G6Ar6':L5U-Fq0fUS]e03NXE;[Tudt'.<\@G&8#%jQHN>QINM@7mVmOlNI,pNU3)YCP+Q&"#dud[D<fN_6/AOCEjgf\r%=lcCn/hfFcLK\+,1&]mrE#>W&pTsirD@Y5]pV##$5n1e@r/,1b_Wl55r]1"q.GY"jD>]9)qsn8erZt[J56]`\HjpN-]C9L*/@Y(+\r%*d66JWtud^\2#!*cqf*NZoGRrkk20pCXE4;`sKOeD;\CN)O:6h"Wa'!<'P0sk';@U;F<(g?C0O[5<ip&f:@6af7'X3FE<V[4T%Na\r%0s.JRggYSuR*#](%I3jq4UONrMh]An&T9qZ\Ao2/_Ys3,rDu>C26eF;X-4RVmI;B*gn(^Jfn0:AE"W<Z)!8JZ3\P6/g^G$&bl@;r\r%Wsa]bVjGA6j_Cs5h-1fST>CGUStUO@cI`sS]cH-WQi3G)9Kr&Ul;BnZ[l9k;[YIMhe?7L.SPjl>;cDB"MYT.e?W!m"Vigf-L[WZA\r%X(Ap!3n?l*q_pt4([%Op,IAcm_fhf?n)"<sL7[=MorN6/0m?!.XaOhuR/4=MhmU41CniT*Z8mo>2(XJ'I&aXt#&mHrJWl7tp#PQ=\r%WN!:G5JQ3%g!B^%nF?$FmKF,q:5<,62!Y-k)XcZ!)%M6q/p%H,21"6;M5u!poZi2\VnZMCf!?SC[5$#^!*=5+%I9D3hc4i5%t/g9\r%6ooM)j6:oX&KLS7_@.*u/4:<hr4q"V^Br!$8k9_brR1QsHrk+^mr%9(/(_q0WX4(%bTqe<#2Ag`raE87L"j:MS%\HBQob)p]s;\W\r%ERX*LYpE32/0BTc#Ng1-+Q(VaJXnB\l:FFN.Rl"%YLc^+(uud@ff:O54>B-8ZF.7"`GTTS[B=Vkj1d1L^8-+nbCn`Z>PbC##BnFi\r%Tt+f\]@&c*9C7nK(m5arF3;?;F4*_t--(i?L`XS=c=2/Z8@>%SUN_)ILPI-mk8s'>Fm/(i\QHG0mFULso]-;hJ\C+uqd[?IC`p,t\r%=c&!I7"&c3^e"33N(`XJS6gFPrW/'[DPi[H(B;Y1bN\X$0++SgeijJe(7Z^F3-R/OI^QL[>eJ%%BEXQ(a6h(5c7e\UIrmKCAR4$B\r%]d[S*iY`3n9OtZ^2S'(jY;s:o.q!53;kJJ\'B&*V:>Af##C<s2M/7'L/!9d1gLg2%6/I=[l4W:Eda>,[eIq!.1=Jtj.kSom7Fa+,\r%gXCjRP2Y[=kNN$qQg*cJkNP=jA`i7jkNRkp4\4]!Z7mNQEJa%R/kM)@G?NV%ihGSYG*.H>.!ui5VotZ#+Ni0Pb.g@9FMXE)?!Z[$\r%MXtp]+Wm;:Vb?K_j%^Xaem-0[L6>5g%HD]EoR';`%E3S'@X$MDmB5R7l#JU!#kE(/13%HUoQ6q]YVP[^V(E(kMmAL3#g6Z>_Pp9.\r%.^jCIh*8qK*G?``QRa'C>^1sjjur*:O;d>H)9?LSP2nSmoW`JJ+qfGC1IDeoft$&>Ju1QEFtNlT$+=nHZD43gLn.2%W>(+Bm9Jkd\r%jM#L]NOsi2Yd[smTCb_`F6GMU=!epC>o#;^B4k:r]5&ei9'bo69hIU??$tF5OrW91j`YjY,2+GsjO&<=DNoNfOM$`Zg=VKt=@9D]\r%Z8;jP_MF6^GL^B51]VYM@[/*MY3'p$R;nQ\#9%(ARUIp35p1#EYliAkqj)dTeB)a9F'LE:Yd.L<a#3)2BK7][VMQF]bFJ_R&?(/R\r%QQuqKe=aZ3nH(S*bH#&f!hV^eZX6CBTS?g;&`5j5d(F@I[%&C&:]j'<,8j0[TEZH&,_u.JlTM*.,-nPGLk+3Jf4R_iCG);NAN`c9\r%n0/'O@-E<i(d7XD^S[e%][3HBg"tiaH$,D-j7.O6RX5FYFK%[ahA)s#.p?kComS?)c/l@<Y'@C/;d.COJ1T4I.QVBW-!aS.$".]:\r%kUk?j<2M;3h-O0(HX@KZQS8/gY.dYboRFQ:X:7*F$dK196>%bEeF^rn[!&<c3MIlXK8;p/A+U(!K_)mVAF;YrG=Wo&1rD,..r0br\r%1c+c6NiW](d-PH'ZJ.b6"/AgtUP5]>4N9!-=Hd7GH;V2fN-D,+f'D=-PfV^AVmNj<'Xf[pN!S]P0+-I#710p>er.E=L">=p[9ik;\r%/;?g2n5IFn?JZ8H%m,Y'CV;,g]k1&OoNEmT`ts0t?pkiDYbJC<]dQLd/5>$/[9g>&=tbb200O/9<im0,W>E,uS<N'JAo-A=f>u))\r%`_!S'H?i4WnWN"I!!52kS<N'Jp=d>5b1g1a*^k/=<F@eBfe^K*=l(Z1*mPV[A9kBP)b:9k=mJLr9l]H7]NQtG;D6CY`2rX+0RKK2\r%L:u/R<]3X`bQN,T7,br@5*ZTfN+aSUMG[Ta(OF>2]M(rM@>Af'ghs=RAhT]HoM5plmIkQZHWcC7M)oXg]`KAjNFjh8k0r]4*$;BY\r%]Z9L78dEAV"+'(Vm1o!Pnn?:(eEn";l1.S/N9BG?,c]\<f'uf0rV-&6g<n$]<p%B^kq].EGF97C:D\=Y7P"(>noW.)kPS"6>Wc;R\r%%Q'Ac$M/Au%W82-Qb0.'I@$A&9:Vp'Jh2:9oQYVlbcB&C>/SP4L%%_D^5J<EdQ'K1h_dQ3o(I0.dn[i,\chRW(/J!3rt=8SRNAG%\r%ShBM8R'&&]Sh=5SOt][u&C$IJ).H#n'fM#'$t2qg27nOtdq.YiJu_P7V[Kd99NRQ?:R?:#!H1aMXCJ-.9:Vp'RG1Z4C%G@bmOpg-\r%80k2cRb$1Bi$t+Jd-*GQG-3V(ZjI0@[+;Y]6$b_^c[q2,+@_:;c4uEY#hr:^X5Ij0o!NOm*7=(s3duAE[W;V*,dQ+6Aok7S4-tM*\r%"P^I<c,BbO>]>aLR8s(:\ZktQ>1+.!kK6&ci<CtEVnd*h-SfFT/!9f[21jXiOIREBfu;"f,sa2%U#t+_`Q-d<Y-akIY'B@e1SE!U\r%"<KEmSg$]HX4(dWjF<l,>MOa7^G]qp#!lNSJP&b)L/q<<pDA#r`(,Nn3\NsVEpK\pS#&DmTZ2*\0(,I@GWFi8Q8EkC[4--f]M#Ko\r%`GqU;_T[&*F'Nr+Y!$B+\QCgDr@D,O"C_Ei0_BC/EcDW>E8d,`nF^h)71@\]+!'<4Z%3f1H9k#Rcp/%QWeQm+%1Kq/(')1)"-Ck^\r%1f+9A08mDo&q!OkM5hAqeKVQ$i3/*o^8jJ;[OaNGoRcgqO?a9I1+#1<cmmDMGK')tTf[PkI0a?U5,ah)ZE]=t]hXLB@Rei''tq4P\r%.>)qC^LR7B&JdHF""l%Ti[Kl\0"bEi=gNi5PdR<5:dVosd!Jls,h:)\9bgWPRMYc'1I!DgASKTcKP'Yr5kJ>5WI`5#mJQAGA:pZ^\r%R[J_Ucn%/1codn^h-iOB(Gt^o8VDo<"8&@kHKrJV\)n$'7*l@U?TbVPGXF8X3-8eMn:kOgL%37<n:kNjH)\4&/'nHslX^[6#ZFhI\r%DPmSP]dR,nke"e&JMf5sI-R!Z01'J^#Zo$Jp$tqu3Gi--_CuhA,20cXSK,,iMk\_eIou'pLrFE3p-_`k\V>b<_gZ,^\V>b<6e=b/\r%Xs%DmP\CogK&Ue[aZ%b4Kg6L;FE34h@JI/qa&!<UK@@CE#DRMJfCFZ)(kf^^/ej'1d9KPJ,QG=22k_o60?ear]Kd<gYGn\i'F;U8\r%4]l^7L4fTFpdJ#^U!A1"Q8Tk(r8M=^.4!NlB=EY;Xs(?)E5o&YWVi<-e,[jXYo<?f7+frpNgGOpj=3K(F)t$pY0`+hD^)9Cja3!b\r%GY)4a?m@Oo4`BFPa4kI7KQ^]HN:D^1=Nf>sd##!]kAjSieF2.0Zo-^`4^L>^5cpu1Trh_(AZ.\Dj;JZ4jf+!oP\Wgm\=#;sR0]Qk\r%gYf%ne^fE7)Hq3/!f=-$'RWX%02H0Q>XQATkrnM*RBL#T$aQHojVecg$YOShau(I)]HiEY2'f/UP&08!?Cp=$qnlH<KWtpD(V@)5\r%c.KFk)Jr=g]5Xf%=M$96JjqC*`i`^(Q^=u#bdXCj9T3fS1@nqKP?p0^PZQL$$m/sqZt%jl>saKU[&N2mN*SBX,aP%rJs8P@N*X0#\r%1p4hN@!RDl(]<h_<GDQ]KnHX'P'uFo*0"69*ph,)-,eGicBuTK5Z_WoAF;Bs9Q1^&Q#:)n`RU!.?+*^e#f\K,n&"(h&n1-YH]5AQ\r%bAQ\#Ks+]L1Nn,uGF<HR0OfuH0qM"loi&$>\&$^>hsbCN1@m-`WOZrgf@WpG^?;N/NEtanZ!4gK,M(++9hh0j>DBE+)Gs@`1lMki\r%F8i#H,:^?c>rkH8G!o,9(MGZbRe]gqSL'+4JG=(1LUKE6-hDA[>g6OgS1,P"NElh)fWAFGN*Z5W@^U@c0m97_i`FaNZ)l-["7HW.\r%@[;0(jWWUP]/=<`4t`aIHX.FXA!\J<eofZ*?2E1ndF`$X>r_/]3#]CKD->H$/rmq(LR6&9=nrd[lQ+cPe]AehPL6`*=.RR?3*DDm\r%X-<K7:.UhI(]3:^9<q(s@gWX8m+VnoPMMIQI1`2pD16MH$r;8KQWPl4kI'EJ'[6,8]Fppi;L]?dF?b#>TU3adodj_Y!hc"Zn&5rg\r%f6Vs%JHap>^Y\F*QP0Xb]`(mPauJ,cS65Ig6>u$=4gAj5b'juF!3]]#c=HG6\m(APl,RVBaip<tC:Fo)h3uR"1HF)D_CLg:M@Wu@\r%8.UWBM`Q3I?$I[cU^hf7P=\NQ[5F@rB/6]cmabq*S]NpuE4.+bmS('_,dTB(3#sTlco8ru]Jj95T$0@QX_rXj0#a[]/S:)Q[&;>u\r%"X+(]WN9XQHPt]`6dW[b5Z(Y$oG5_U`OqOjL@U,e;-Vf-Y@2Iuggdetn+kMpp&h@X/Zb);lZ;PbUYOnTYblT@gZt*SaMC!g#kF2X\r%Np'W**(Z8F-V>%Se9_[o%/\"3<[6X#.#G)r`l6$7=><i$PA<pa<[c)VH%kU!Kgs3&;dQ.RXY>1/<)$nmg;GqPOK-FDO]TVq<_1rL\r%@FLJoYE1oL&>"=$]L)>!6AK',.^+psXjC`9o2'&qB?.>+`uBl.9\Jt&amkP<SfQ.K*"TXNT[#0IqjaCc$fB&,SR$U]]AVrZFa!:h\r%liIoD0u)l*fu9ko99P]Pj!0;uUUM(5Cja1JG[%pb5\tgs/P]fBZ1<g3dmLnS9sA*#M[R;<b-MK"rK(RHWlOn&OAQt/J5'F-NK4np\r%%p1Bo'8SP'I^XGd(E4I$Z0S$'Eh1IWk/YV)..2,trsC.*k">(#?)]<Ar*/%(aYa2$Z)1a7]'B5TD/GWB\I'eR9)I+]H1FEOCK,-o\r%:mgHTed+4s\C0?lg$nW(oZDp/ME?0)<tJ*'24(@JBN[RG0kJ8g%CmY$?*U`p0j>Z!g_DmihU(s!(O+7F[X?[b8`j^=o!N66P8J&e\r%.ZWhOdn2e'qetTZG+l0)W/RX>T=`foV4RRp5lW]f/@SY9O1ociWj^g;G-4uFMGQANBGFWr]U2p9mf/PS$tmVe$Oij;g$t:._llH`\r%h-Nf$#K[!A#,BD&pCJ2<`+[pf:`$&8UW7&HBA_e_"ij(']PIe#:b"mWHM.N\B\^k<6L8P9r*hMLB2Nkk_+t[)h]cQ#X<`Z7rt]Tm\r%U$ptUUOh:bfjOiGf'I-oAU:pG7X+U(Ork\\b@p2:f^tW#>l4t"rt[mU#epZ:D\47I]qU,V>ND$DeP`%GP)`+mkMIKO/LqTpP@5;u\r%?qB*%*KjhJN%n`/Jl@WJmC.">11[9j!+3:=_Q]IN?(\UR[/DBNO"n<F_&'Xh*]19g4[j!W9.k"K4ndc"FXbr:krcg/`u;PEh`kjj\r%GI![??,(eToE9gi?KBKUr;DASoE+q+rTWpk?hi*E9qrQ9@eo45O;GN.#2,'GRT`8k@3/YL=juFN&8B%kl;fQ^&^Y9:e]Yiu/Ur,\\r%]qM;=mK\&KUCT"i3MP-qJ/@f=U*hUkNONtiKcYO\r1'LX^&gkF2rb3r^V<BEnoCr@!,rYr\chM8)]MteF*+Q0nQ6OL'M-Ki+Gs+&\r%9S(\9URSO/lQcfjAuW**k/DXb7UTjae+k(=B&U_e8rI^o;;o[MDC]!!H)`s0LtdeC^Egp%L1t.E-'A-%.^8D8=UKUlLA+'Xb2Vqa\r%%eOKi9YC0IlkX[t9YC0I4[%QA0IbI?[D\27_JXH3_o/$OJeXZ@[DWdW&pbcmXX-FaQ'Pd/2*#8#0a5>QhR++BNJj7*_8\/,)cAP<\r%nOnrP(:0</hh-?%?Z!]7++$9nd)-:+g04+B9lPL\S`sa*hh&X'"o_g4:O33q)Q/^bQ<M.D0e9d[KN`D-GN:[>Q"'adHQ.!uIP(.W\r%2rQ7q%s6iHPg80O5PjTGEjok6Ta+"\(%WYO'c)F/8j?gjWj%F[?hC?s;f\Un'mE:H\QjhVoK6G8!Eft3rW#6ZUc'(Sl9ZSoEiq:#\r%Ms^GPr1jCuCBL,.<]_\H2+LE'Ou^;B.[e&.Y*#aCh)QJEnTN97gM</_mIh&,-)!Im8OohV6ha[k-/Iorc[566oqcj9]sP'K]u*TQ\r%4G9Emoo"SR6886hKG`4`3:RRTTA^ilGju@7FB=&OCm*#SF4Z=/O_!=>]3ZH_9X#L=OHBHH4mC&&5rY#3TrN)&cb#h[YbR#XZh5P5\r%$a?C^Y6-++H@VR?Xh8g*ip-Rh`sf2ILp+_B$SMQ,Q5YXL!:cjLcq,gBA?!rZfMN(2`cT%P!:_):UF&aB3Qj_E+e[]D1&+@'#nZ!6\r%(Lo1+"Ge`0J[;%p&Kng>'U2nY#`q;!=3LZVFEi0RId]c:Y_.]FS].;2c,hV.",_NelXJqjPO$hMaf27&D627u'[<]!$#=jZY0eMr\r%/niAaY6ZM']d9$IlmUlZcopM$Yj6q@WeL6Mg>8[ApprXOqb`C;h;`VSh,m`3X1LHR*[f>-Yr4VIUBEa;OpreCUBJr(RQ*SQYMecM\r%NQ3QFWgiI6e8k0#_(1$l,q'"V&$I+tKNYPM$@Me1YW$G\DT)?f&/O;b<<=p"fWbdIhZbT2XPB?X^PsKPa,N'nNPW=8iBqEWV(b)d\r%YT]Zo'#fWfcNQOen0*-1SpUfP6P/5j`eP*`"=>ElHjH.fi4[ITLS0jRm^J<hEI8&fkd-L0Thti,.^c4(S,]!NNPF@?MT:KKqJF+J\r%q`Od7J6mqm,+'"2WM)_B,5ClJm+Y5+2.'V?R\,pN``M=Mq$PQenWS><:SmFcmc8GMfCqY/J%hZQq/(G.LaqZCFFF_/h$3anE)&'?\r%MC[=tP:::lASn5dlE<474!p).5[rJ`^5G0XYtX>i#s4m5nH,,@jhn@W9alcLg=>P=Rj.WEq?U>4W>'e#cs-'@EHu9.,al-!b=fa,\r%ojb]c/m`uGfM<8ZOQ>oc(jel^"\Ih:g\Q8r>J.TT/kC$HSg7H06'?]qAptZ>*tqJ4jRCWkHV?gnP+s(T4>0qIOrQk+ITQ(n8933)\r%iOqGS"\F`#,krtn$BcD,'"T\>$BcD,'(!FA-qJCJ9AgWH>EAuQ(J]Dc4d@2uOrXC_ah/!;fYgZTZ11J[kI30>E*<X^q'E0mB>4;,\r%,R]>Z(q>+j9rPl4T5qSJMDWsnjBti-MD<akk[gR:n1I7Pq=fRW,WYWGT=kWXr"AYlnL[:`(7bpRa\)_25!E_1$*>m*$Bib=HqBgc\r%n^e+C4Ragk]"1Ga?BQ.=Xi9FhbTu\>Ju$?[(RhW?qYAOdFl&80L=m\cB^m[L`@3X(3ngN&oIQb;0+Z*53+IfQXui!\FD082F_-[%\r%\V'<Pq'FgZahJt?0a[-((&*;*#H)8/MK1=?Emu=:&Kbop*7;Oc4'/9\DDh)7Oa^H(,dO2nH+I2I4i`l)iI;W-3)/"f<2H7R9`Mh2\r%#'[kF>+/060kG<W>4SDElj6XRKA!JGB#Br^6I-#[;7,X,G\qMnqZgGkG@_>WTF:ql"[J_&o7TA_h])a%5m?WhGo[fJrM.aE?<^\n\r%Nl^OZ^h`*l%10ZO?(XpR293LJ.<H8`'mP^5.R5J*p&./k\%ld?*I+$A;9$E;fa8sUJtqpoF(;JN&>^Wo-jV:(T?(f.J_/O1iZ3<h\r%1%6(o%t#S)3<ig-*ir/u[7B0JBf]GU2;T;HNk>k6J`c:A5ihV]Z"uFFR??\EDp6#_BMYHVn/=pDqJ,1_>P/H<7c3<FF*V')pt70k\r%\S%h)Y,d81r8#1fSqLIkLqXp6&>+1Aolt0i6%Hl(a<R^2)m,SK4Z-5XXAMAm@pNI6,C2je=%>OPN:M2[Pl_.T#euJjld!aA8%CfJ\r%W4O3L]]a.;bp5"@3d1-Qem*o_?Sb@FL(5XRYWNVcSX@gV:;rbWIYfAi6U.EIZka=C<+@kLSusn1U)&>`0M2t2=pS_[C9E!n&]EXT\r%9FtsDB<$bS/HiE<'o!=.bUPfUCO-%e2YMdBWp.p_jOl*!IOM"h8!99;b:7j5&*B$g;2b%8;V1P3Z8g?#hWoW>jERV7eM7(@^"#GG\r%MapOG!7X?4,=rZ+>5j#n,%.J96+Bf0C*@M:8J[(ba>K4cU)&>`&E4'd/Unt=(4o[7R2*-:(3>P)?;"!%H?n4U7M:M\U-4dmlN_Hq\r%EW]a8I)-W,@*A\2nHPH%(H7otC.ZN3lG^q7dH$pn8t.(HUhb;t&R?>Za4s87X(\nGh,#c6[Yc[X>.*,,O89f4oY+W\;<CEQiWf*)\r%8+b<=?(?;9_<H/Q'.mf:Q0?ro7^`XbbNYIaC94Nn,tZSNg1HOHUa0YX>oS)7a%2@']&m%!)_ga.PGDo8D;k79-qQI)fCk=&q-NuO\r%<g^bMcI-`UD<j:^n*!<%/1a.=%/QFu?ICTh_D9d,pQ:bq$d4tKR@(0K%/,n<A7?W2lHf(bSX3$o=!Ru1,S$6020XR9_>Q@e)^heq\r%+,lQb"t-e0e%p_sZ0aL6GmQ.:;5T>#+ccMUGcUcMD]IXkP5Rl%_M&]\`1E^N:C/\eTo1/=(W*IpK*uU,gM]EBNjq=SaU&$%-tD3#\r%Z_f"PX(<P:=N/;#I\ZZ,L(rL_[bmHEqnU(<f_-7UVC9*6D84J>Xum+P_^gc@)`+NN3-0B:ChZUZG.WB_FZ5K-T#JK_^Bo6:D).ST\r%/baL;e-`:hBg]+D>s8'[UN&iL,V[=aa]rKpU)3MK=V.kUQVT^=]CM4g,NpHU)T+014Vt(:7Qlb:GX)+^4uCG.pUE"nJUbel0\Y3.\r%m39KX\:mKiK_Y>i/A<A;k``R)/A<B&XMfaBK4^fL4:p*uau/\h8<u9gU`VVl'f4r&0#J=GYMa\b"2ba.#D;/28?Ii'?dZJGi\N.%\r%r!L$U\1fJMr//TC32Bf]@qEa"YkY99i(t0u8M#V8`]?)!.U$9U0J('<MQtKGB3<a;)4"ZZ`PEi\^FM1Z'$RP8D#c<dQ/DiXIthMd\r%Co4H,/*JS)Kjb;M=5^(=_6C-lLq(uG35?9kOTi.L>*JUR0J('<$CWTW0J($nEo!2rT4&&g=7Ehb"2bbqYNT0UPLp::0YcV`MLmJI\r%iGQ%(Do`Y'b7*78k/4Dkeb,o14T/r-aj'^'0NJ3?R#7jX?U:(,!5]>KjN#D/;bc)Lof\GV(;^AFo]O\u1-JZX+49D!OD.LE<RA$W\r%S+Q8qMgn_C<]U!@X-_B5fN/V2ah4m9(K(:I-"!b5KiB=c2cfHPi$=^L<q/L+]&G>?lc\_O&0*5K;#MS*,k0-pVZ-g;#JN38,c(su\r%k="F=bs9b:^Trc].Ar/ER"chc85@njV%(,W`9"@gMZ[i,FF!ZCZlOJ?7/0N;RF>1in#cfB6u_ffjg5Vg#eaTBNO>LBS2Tq4-!=JJ\r%)]:^k^Fq"5NI4d=/'X\7=psk6#Lc'F?R[7uN?B)qoa/fU@nQlaRaX`>+uI2n%6M?j!j+/nEnUdnAF8C;S^U'2.HpUrjg9<s/\1&O\r%mG/>B#h6;WEn]/d("gse]l"q=>o<5FhtfuXL>Fpi%Zq&u]hBt$aL)3GKJ!);g0:oUr<9#D-#EYlHKi"E8LiDI@3Jq2\bJf`';=_)\r%$GONri6.]0D1bGaCP76->Re1g-!d/I?PH$&3Zb5m4i*J5*OgX(2$a5dBZ\<Z03U;p]D[Kmpi8VQGkM;k0*h-thdXFR49G:u5VKu#\r%E<T\Zk_3Vt>4@g14R+2tle->daQ5L>U,OhlaQ6X9#tuPPb"Wd5HMko[4Z1,\\9U!Ommi'*KgM+U"to+bTn=u]A7\5K:o3bF,WWXU\r%WMMC=n.pr%&_RX0_@WDf/7NiBM['Kk=EKSEK-=Fm@Yejp(c+YrpeCc1Hf)Bb\.5Zg"hocm%YQ)Q[L&pp?3ta^BLD6ZU"o[q-Tc4.\r%A_E6t?@/=;B:`*-PIS]kX1,VV,'-J=b7V"nWmNuL_%Eq-7$t<"EC?Wo*"a\g`99_Ro\cD2_SHi';@c7ZLfeY^U@N7kX:,\$Y>97\\r%J.g'<7B*auVdEAHW^[Oi[#fXihQ90)Pn$UE@d`3gd6XPbbTZ:W5%1MPECB:tNYiV-8IKT%Nej2FE:gN:?"[5[c8#J8Cj_8!Pp$3`\r%2a0_GFT%N5X7>;m89P5,>dK+Q$PY2g>WBM2XTDO+26dLlONgIml%dYR$X51c(;>+/Ng_D5i+o92ATdk6Tm0'9c3r:]D$"4t3@stV\r%Gm;5U"+$8WVCQq$#hc5n^5:)Q,:/<ue?#o'4^GFt9goef24!rXD3i#@^Se#>g,A2917UPKd^H^?HMLLBi)]tdHLQMrVH2Qeo^@-d\r%qo0^ZL,3'NkO2.9/ainS^#iAkX,bc/No<QVriEs(9?I$K5E,p#rVeQ:P'Nle=G;E-E,L_5X?o6'Y0I_I=G9/e@##bjRLr*7-n67p\r%E1e-d0nWNM+DOARJW@kCr$"uo!Xj+O*I'"C*f$,6]tQ`:cYu_t6d/5I8,Wo=Ym!0j#:jKmG:%9%T,cV%K2*lu1#m,k(@0lb:XBhl\r%ig66RMZF^^ON;J33*Y[*6jJc?bU<N54O+)1q1ooI/)`/7`L[,N4O3/3Rm@QW@1gqpSA%S"%N^CmYu8l;$6:Q!3l$RW3dC'.$<h%h\r%feD^g1J9jR$oke.3I&E49$\6"drLMU`RXnB=_#DQ>[=A>&Qn;*FM4,95kmUt(Gc%AIuL$$H@ZQd)(7DZ082aoHE^SUD%49bZf4Wr\r%8!dc$DDX!N6[I+0mtde"iEV)9,6eA^%#V/AJiJ7<q9er@Y'5lu9s[)T]magmIm%+lR"9_SZ*<!+he=lsduQ<C8`U9u@#,[s<:6C[\r%L6r"o*G#^!Lf'gTY&0gTR9n^Hf/C>E*Ah'?%iQ:,IP0N<RY-ll?$_&saPOG"!Ze<t`Mq4H;P8[3Mml#C8qG85$!]sFJb/2!k`qNV\r%YcDuR-gA9e2QO8m[n]T0G4XnFA4k+fJKVfC]n]o.[=*+X3U#8cI%='J"&kuC::\mC20[b%Gj>m7&h9I"f1!Y`/[f<8bP5s*]Nh.1\r%q7(XUQS'qh5IKQRXf.l*5:81G6[,hijA+=<l1#Bog?XIdj&\s]g"]`tEi,&>BZkc5-L]*Dp<@5Ygr`Zu'c2ir@"V^E+[5c8Q!-NC\r%b1QD4G%q<rVhNfbVPp?Wfk#N>8!s6'n=*U`9Od?YJ^fi,dXDli(n*Tg!VR`tX[8t_Ge@-XC<=U?'4X66S2V1Fp7jl`850.%7P-VQ\r%)ZfZ-5\`l![NG$999ItX@o5mBNhQgV;'<9BVul?VKQss0oM*f8s(F`T<Kec64(k8=d/*.IDL1^6+pE=thtoEh(@\S$YTQpGHkb"O\r%]t"]<<It]B[g"=@<>tPZQ2LKq=Z6ru"F"mJkpYC#8ZWR"p_IWc"OgBj'A].&<lr>L$du_N<,\Fa'!$@h@1nuNDc)h.%aODRWd>ti\r%hVbu,9LimE<Nl!"\;$JmF;Z&f$+<l#O:2UW#,cl>PBDi9GsqBIR488UkL#U+L$pL#r;1-GTfUE3=8JT$DuNF<l3*Vo'4JaVk<#[<\r%5+eKLpugr0g%GLd[LVHmc>Iec-LN(O0!ndh_-KN?B48WoT=If8[**`7f4%ZS@J`oDgm,X&\h,s='Afq/(MBHcM8hsVJ%`*&QXW>f\r%r!OI@o6ntV*1+2t.`d(7>n7BR8tDq#(LTJuS]1V9FFDcIL&Z7Cs69CZ3F/8m7N`IP++L^W^TMJsDONGh51AN)M?k_3eSRE"j1u&7\r%$0LFSe^o;n("[HN[ADpGrnPb0osVMWAA<2bGPq6&d9J5@U*9NDi'890?,R\EHo<6,?-"]D)6M?OVVW1;HJ!tJW'hlYg5h8Ck."8R\r%VeAdl0PkU_8>`gfqWYIm7K9sgUL0f,$`kf3p,kg?64Wagd-StI0$^.J@.%_gS_gRU3HL0[Lu$OWdi/@])=nG3Bb2uiq]pZJ9usJ!\r%ChhSB-WOLpKTZ2fgG"d[G8R;%aAUa8ZQrsmL@8Z@QD=h"0l9Ks@uB&@1f^^i%n_1iYA_usF)[Lekm6J7[YD!dm'nQjh<X&$>,U\i\r%<^)JU1bFubra,#qI"*,Cg4Dg!<&U.L#2;-LlJ9::po$![pe(6pI;QgNO,QZ6Xj6<CpTLuFr+ookW\gK#Ib$_5c,%Qc?Ea!BPt4D?\r%fg]&80kZt1AUE1gO2AJd?&ZA=XA4_dL2cYkT)]J+9@f$I/DRZ0F>`DkAK+"Gr%S/U!@+*0h`sk;lucViCY$,GI'n@*J$8Rk?ZHI+\r%eZ.A;Q<hh27h0!2n4@hT+`tP6bfIO'MtO8>pbBC87Z\X81liI-GH28/:c@)`Ke%i-@/LB6K>FZq3%#V,C,#EacDYGA[qTS2\=!\;\r%7t[9l_g/luA[@FBpl'ReqtmRM\SL3q=9VSqY\s**pHS#8?4NPV*/6oGHhH2[SJT!&\J]"/HCa0.K@\Mpr1\?pe)0FB%.?u#H9feQ\r%4u!0,5Bp[[oQGoF?/BYNWa-WX*[\Ht&B*sBgS=/P68,aA2]I84f5'm@CeW]>P8D_hrb:F=JVUSB=`gib[9H-J.3%iV^]9?I[XFpE\r%X)H=dQ2A&,Z)&iC?9[c3IE^J+]@K)".E+MZ;lAt6#(csPaC!2_`BV]2ehin1d(jQ_%,eL-e4FB4;p47jcCUIo/,/Xn!?`fgofET(\r%g[MjHNE!]GW1l&EZRqW-lY`j!Bi+mH.U/JM>i)(T:V""@.kI9S/`@90:0cXO:9Zn:4T4Z9ZCYq+Y`43g"hC(K#_qtiT'V0Ai_pnE\r%PJC])*n[Wp_T&;-8'[Fs6tSDAR48J+I[E4C+;sHV:,d6rCq5kI[uDsP4L+[akL,,Cmak879F.`SGBff$2=kUY=*luC@AiV\AZq4\\r%hlufqg5Qa_@h1X!n+<mX95-<rI/>u$cFo*Yol8G./Mj&"OJ&lO0jsoTV3_9G?'o:Q28dh"!agdeY,?"@Wb>.Hn/f)qarjJR3&K=2\r%9^dA,\!SXZSb;Zj/JBo"Q\4s5gi!AmHR9(D6bcplSXlX$S.uQ*VJbfV1E904:-Bkd-ca%r1:_KH,PQ?>39!SDrH+-94_oiApia)*\r%[;E%)+P#]l#&ZC,gr6:1jW<j<FX-]A[l3@IHJ*U]QEH:@n.=5F%^SA&L$"gs6#CsAY_JtD!$g<h2(l]eE.[%;Ln97l>0`-_.bX+L\r%NRl:ponTA1"PI_/,hRbVk74ejG?:j7eCN]+]$PT)?!["`?'?N@#"jildtM'chpk+Q2ntd%r`\'>ior4r$g&)QR%>p!Sbefg4C+WE\r%Q'FSmaLCZaQ)+<aa3t4h0VNK5gn([1<-(?s/h9qS*k02Wl12;=amjHRIdu5Zs)Y;9_cfWL/!C67fDi9[-?N/cCM!@GQ0BB+Ab(2Z\r%#d$c54C./VBtLt;H+F&]R=omt(gEErdOSFf(NY',=u'Sb?'0pqWn.%E;fr4J!&#f5d;&m=\[:dsUS8($P+RY4LX/;2EpVZ8:cm:-\r%Y[#R;-Un-7!g;qPdHk-3&P:#1^Er*"!HtW,R\#uFkaIuON-6h;Xlf)3V;&Q=[ts7-V;&P^9RFm)0(AB7QrO=D\P202:N,TmOo)_h\r%2X^:N_qn_5Eni1kc(LO[>oc#p0(cdfr*?&Q?05ndpNPSu6%SGVE,n\M]0s9CI#U.mQVp/qYtg/(%4*@^I*skp,>5p??&Ipd?#*>)\r%cE7%"WY1Q>ie?KEmYpS!fui9WmWGCmD/S1uS?WEE#m'=?_(&u>6tNp'F'L?kc,4RET%\`H=*0JGG!6,Q.RbVRS'Sge5Re.86LbEe\r%I+?EA8`ub%OW(0L5J$[IQPcZPa)jl!Po?TPTbfC-;?Jd='<JQ+%1KqsSLgNKf/KJ_%W:g%\A"b[7?pc-l[rN*cYnE=b%k0abu@LL\r%r+oHX4W`F'or`aNi20.!V2F?&.<NRC@aUpt>[1Dj(!iH;lUX6)0in2aK';OOcs`tJ\.TUfRlYkRo`:?BF!*M3mn35DgAMXLJ+\<)\r%"[Y")@m?A2)J[t++)dGG9!o4p3ZRIV_(,<5btW;GZ;439!7B1nFOE%8T0$76BJsuqSDD#'6m=JR)VpF&@?gXYID8kb2QR8V`,1$:\r%2)s>0>3>fO_mn,[Dh4sMNVn+7GU`lc=Y<HVeqRjO#.*E5ej]dUk)u&8]>.+47<F6+[.JEK_BDuT/oJa)A8g)'*SVCs-q5n>`O(%r\r%MJdJ6\Ziq"\G?er?SQD)FCsUkJ]72(mDBk=bN/maG!+?+FIo\mcED$di]2"GB6+UW&"81fm$"FKZlaaO#EBSH]*n@1pthUSm@PG,\r%4geTgZR$%)b(W(#0:i+:;6p/)U8?,HD>n$0RE.KQ!>_0j'L*8QeZE:)q6C4nk+d.T<;,)/Z8W]PnbfllNX*41W=0qf_gDebmLarc\r%h#fKpSYbhYM5T`"Li@>r?NRM<`PF8.mF/W#c_.8`FZ\[!7c1?F_9TPf1U]g;03sg3>A'l"k%Zmrf!k.,cJ1lSn#i+#:/%)RF*1ct\r%FK$C=Zc.?i+$&#bqabGb`jiW>jsob@s!u7bfSAnC?lIc@N;crJrP7lZ#A@30LM(K.9mZfge.X\4)sED6T:XcKep^ZAh!G\+I^:<i\r%P8W+aX9am+(Nt!_S($N!2G\)`H'^E<q--X:8-<1g+/8;f[)2Xt.0.3KZJeaMd<0fmjtB#7el2Q):io>>#JgqiUkpruUDN8l\:ggS\r%E&2c>[EuN@I/uU.5AC'HXjesdd2JEYYP)p+p,tC`Z"`(t%]7#E#N5RNbTaN!aCTpXB?cppE+eQD`.6O$mn,5q^N\.67a`29o:=?e\r%6u_BLB"N$YgieTnpYn)Xq/T$G]BBX#X'/!)0a+p[.B7%kN;?NM3&!icku!DN>Go9^FoF-KS%*8$.,24niH_c:;I&L0NqP6ADJA9W\r%\hD1.#siL`QV76k21aS24[5J')?0VQ<(Ed-q^dJ4#3(kZa"-IK%<RgSR6KpK8]QIb:@j:LKt]T`bVb=?>r9H0s/;V7M;:?V]dH2>\r%G$QTp=h<A$]oC<c-EEja0Ng*#.5TEq[Bf5%`7Rq=(J8J=447ccm</1+:@BQV%5&uSm8eLPU6Tq]>K[sfdsL<bJ'7POOEV>UP+a7G\r%@`csB2L`t*quJr;>"p%Jk=c/*]Q4#W/Mi"iQnl#Hn'p#8(9O8:(1Y8OCX2A4RU4`B/EU<qnCf59dtQZU[]>>.e(%"=\d,@4c//?d\r%n(BOmVos7)\BoeO:R=*5n+s\#U-2e>lF=FdH+MeWM`ae%KjL>5:5Ysm8tU1]JPnU9em9GAFij5s6(ZNCeKrPj"UVcFit@bC?)HU6\r%0&K*,]+"@F\E[S9ct^\=GHlJ*aB8Y?4^E('QY;sCaG-.n]!/(?:@"'V:Y1g]9o>jl;KPR7ac3I6MLu?->:^,=LumkVrF,nG.+H^'\r%ktL(14n*XHnp@s")@aW2\m1j$Q7,OqV9E0?^X8?I5\%B+7dCRG$:mV5G;7(2DEHH!!a::<!*U\D^7V"Yk-IaXrK(dWU1=H`g:>uh\r%5K=?<ls,a17!OVaKd7#7F($)*jc<q6(HC_Ba*3^6>`.esl&oN=;Z%hH;X@YGC6s$R+OY3D3//+)[Z1t<]sjD#s-+JXmOm:^6g<rH\r%E-K.<i#:G-L$g[1B9sHZ(Z`K\3kHg.Y,R5ci#m;l[Yu:ScO_A*W":9T$[q!n.d[#>"_MI.W!i;O@cB"'Gu):_,h*!5ZDB?V[Dg]q\r%0.QD\ks3?+0=^ju"G%^r`BH\&,4QdL2^MSF/6?qR92VIj>[EHV_>]V6**67k"Gu67jFBu1C:Lr>ncC\CiKq'*)AmcL.Yr"`ncC]8\r%_ului)IZ?0_Djum]Q&C(cI9l],>c:E#:h6""0Vdi\%&=M8,ThS-;H"eM!VNMN!-)9H$qL:1bnpLR5.5^$SQg;!8\`U%)1*330MSq\r%9c&cU>nip_q[eMI4jYgpAP!G'RGpj'Rc\kN?$s<lT)7VF%:QN*2P?4b-_,3g%d,=/G-:qn2(Rqf_Y9CZeG%/5>[5.j`VN$rV?SM4\r%K2-n"P$`IkdS5FG3rLu@RaEnn(['NJg[F[40/Lu4R53bc+pj]H-8?bkE?G.ZbFX03h-69S?"AS"T)CCao.LrLTc&TH[36HW.I+:U\r%Ph?9WU9JeV-G5B/eTrs[^jr`sWqEBi$`!\rp&:Cdlc!9/ReXi]C:tHV]jQ&KZdt&Np4\S3DlqX+%#],UH81Y1U",=8er-6O$gYh.\r%C:tH(?SShkUVSY^pfMgG4LJK(V-]8;'XuXD=`E5PoMR?o5(D?k08<@Xn@j`RQ7'r0MXY/%:Tf)N&3_P^8sUh*"OJTS9pR0kp?Zoq\r%L:PSN6uckQb]"+p^R3)QGnS7'[B8(lH*<7TF?SQqEP>U0L22\'Q+XM2%&I:g)W7^i@PE.3/^3a"^#n^f@?&"F0Qo^#R_@]DQ!OsE\r%ekQE-H^T4Q7;]=*bJ:V<B"&SifaE*pIGJ5$e3N.CY2EnFF?K=NOcN&sp7b&&U)?Ek[hh1khV;&hn+NKra$]!nLi+klZPTGq,>tue\r%h:!+%E6.;.qYP8s87+$Dh\*9>/!?e<B0k"i]EEJjPdk:2OZZo]$NR0M9;JK/?7e=':!oOb]^i[X3TPFrcol!Q]&\.J!/WemN\!uX\r%<;)t!:R@>k&<lQlA\0;bquj_ASa,[X(f-KpLnHs^gn(ZuJq*U0cbR9uHb/.2p,<jO?.`^u\[pjI\qkc+_ED1f2-74!Oqer,+@@FX\r%)iF0-iHM-[lB:>p1>cOnhh)V=Q_HOD/pX$@=N;bk/pX%k^tbOOmR3Q=CQWsn!H`apW%L99[7A%*VW1!VR[krf@jF#$X6>T$Xp";u\r%TS0*q>#FZljNKlZW^4(#L"a'c.>5Fq6)o\*L]MZO8k:.iSP([H?'=S[MJ;:;D!.7ceE#>o?q2reX=DTB"kk"n8JbT"f.bshgJ=no\r%NdG[lSU1.tW-,@*]@fe>2BUBNGF.QA%*&[%mOgr9rEVL!6>)W%G8IoSBq8O=gg/jtoLH8WN07fZP/fYtOeUnic>o!E@4Mn5O\hCn\r%>:i$3_a.RY`DWI*G2.dOL/=Q`Su(D=/oX";Pb=W-Y,E*hT,_hD$T`u1jN/&<X"KFURZeu$>gYPa:j6"m=,E4(MU$2j.S3Yi0Mhj=\r%0:[#01Jf;-^JM]^%#.uK!];\(Jj!58JK"<YU['*_:rD&*.k=Eu6SJ)ub72t:T*nBREW\2#[odJ974T!nC.,JRrG#))"h*lgi6.=<\r%GA$H2OomT"<P1#"0FVmgiph;FMpliq?(^1J7P_6S+hC;I3'OeE0)j]1[og"Dm2,GR>&/Z>XP:CQ!JeQA?"U;;$`l+:$KW"Q@:^Fa\r%@3j16<qY&&pBk*@1,BF9L">>[oTuUMQO(k&bWrO=&lJftf2pEVQ/0Z+AmbTqUS\U^m#Jk+P+W[UFRa5NrNW]jMb#[mGCS1uBP7T@\r%Hoc%11c3)uBe!nN%aA8L;FVIiU9Z;NdF(F_ojU0t:4m!A=taiGjV$gck:uhnWC!n=9r8;Y=t^*7(T_*YN*e;V?OD:b(PD+5d)tu&\r%(Ag%!0aYCF%Kcq%S#fj^B9*/NajP2=*<lqMB\qQ$GeQ-W?b`\LH$M*fh3K>tL,j[09Y#nOU+S20_]UM?]2i>*'YKRi_D'B+.uHA#\r%h8s\GfMq=/'GuQj(nUP7_D$@3'id!t_e9,h.p4RM@DJD?H1AG"cL$7t4Q@IW_J%AIDD)@@2%81*&X7(p>X-2M"gtD;/]]f^Dto9<\r%DB^Vho*t6\X8;)T9T@TT2:;$9-,OQ^f(@H`[Ul9H]!5*ME6bJL3VtR&$11#H(u#Wo=A)Kt6l:TBX>][FIQKWF[Z%m33gCNIg?$P(\r%_&mY=KXK0t/1oK#_-/2[.OWip_-3/B:&kkq>MDi#s4DKE/d]`ZFD*@0D@`!<gW_ZthlUlCpMk1I@_V'=(OEiPbr$d;?=nh`S6SF:\r%pTemh;K<6&c\oG@6RUF28d0>")K$Y@l^ckuZ9VoditJo'>qq=E7Up(>+jejFGI#9CAHFGSg(7ra@UjY.NEp3lNh2XUg";#5Z2$qo\r%$0=$K%&CP'pL1Rj?(b0e=M(@G]-=/Aa"hhs$mKNT6Dl\/)&1u\(%+[-@I,cBaV(9T"tjL+0N5skLTq59$X<$!O0NIM%p"RmbGDe,\r%?>-YK).>T8f2SF_K,drScM1%Z;An,H?,""1VmI.JQ_L?%pNQiY]B[Mn_qjl5m*DSWb7#f2UkTiJgE,gEnV8&Ef+/Rj$PelOYp$G6\r%-bF`<cEDQu#h2+Pq+"N*(qX&P9%2MU2g4"@=)*&ZIc$`WW)t/'*k-o?HKTUT1_imH0m5S/-2nLu`i_@'))h'O$gKM2`]]_0kb$"-\r%=OqiJR2iJk>p`0a=hCIH]?hGe>.^RI]?KS-XQpL$ej\rd&oR&&G;:K`d`2a'7(-fgV&6fY26a56^t8g[Y#10aE*WP1\c`q`@(.MV\r%Y"PFmbOY4clFI*6-S&q>FgAgBACqh3W(n+1S8>TEOfFU40+L"eOE@,,Oa+[XB"thZL1KueB\/mUc_tu!':nO9qYIB?oY^jlHDSC.\r%#+b>iL)dE1ICF-YeQ_Yseo$u=l8\/m,A9e0oUDJ%\M^/8R,H0`A8#Sf=mfUF*m\WR_f""2)=?fV]kRWuQ@0U?fV\&)Z6)c("d+Gb\r%4-Q?kBt?0)\pb(&:uZ[GGH5.Ea=6#TYg-cJAR\q)1FX#<*-;K64g=f4@eO8QiK]fA,FU[cG:#\Oc?*j-kg!_[*t-Bd'%ND/hN`cF\r%AC6siYZaf2-;RaFhF44__n[*VKZ':2$r:N%oBY+5"0HUSUk%;\dI&WaVpZg5g-B?I?)q\-r*/"oA8'"#69[\V`QTq#lLuSt$YN$m\r%ZhY(6V)=aWIeInNnD6W":$t_?YSnCc7]*=ALc;?A&1gNILqF>1)O\f:TfY:4Lr=%=.SXM3(MfLR;*W64RLK+';QGrMCCh2[;QGq"\r%0f#>.@oag9f/tUd&??'\jqXa<V\ON_(gC<T?s6tpo.a>4Q"SF`^9g56_F2["N1O&USe5=9iHFdWSlZalXjGJ4Z0)ik:FjA-El>W-\r%k\5a.)Ek8XH?-Y_&X4S'5'h63=tLt3a%&pcLNWl*B:#"*0!+B6FEWLTm(s/aV6`fg@i+tn:1mY6HID;*G)9r"JojppB:#"*/k(aV\r%.E2dU-hiN&`l>nfeY7i=.r(m4pm?&I<^+8\ki,BOO.iCZc2@Y@Qrqn6^eDh*U%(a^f_Ci-n\Dm/ort]S`_Z&/YV;D@)nZ(SS6VJ9\r%eKR]?c2T:hY-k=r<;oWS"SgWn"?<r`N\R.0eubAq=.,JMf66tsE9-#]d+U*2DrbPj;VAAl1k6Q_[0^"(!SQt97jK,$jS6g8>r8!d\r%(P/Wb!JGG0%,(-6pC"C=M`Vk!dXX]C]=>3+Yp(Bn\19m_(O9kMHVBf8/'tGQ22\JiXfpKt_G0GZ1&nNQP"7/_0,(>*kH@97F7qPT\r%lMc*(/C\$M'+<KO"!?t8c:82'L-FHe;8k4rFP[B]n)>Q$ICpAl!De#ud"9bR&(DKfW!jE+<G0D%T)?>4MbV-C^3V2T)-g@!i37G1\r%J<[h'YH.mS(e/mZ80=(i/fD@sAUlEmoQm%n.]O3PjZAA9?Q#F"MF;Qs'mEmhk#A'jdP2G0FmTZp<0s*<Wib=ZXVNaU(A#":N=m-8\r%DYj,3D65KH5C=`NbLONL2h%<+#$'Y\?'0pqIUp9H()8\ReJ3r)ZMK\$W@fRu>9e%jgF7:%CMG;RUJbAm%,NSKA."5q?8F4gSL1p!\r%%=E8tMaheg^4!:Rpap<=naU1E4#u4MeoliE]D93U!Te5#Vo>RAVBj1QjM`W!gbB#c.GB+5`#&]V)6R7NI;%6c<<G:GbE*Jo$U;7T\r%hG$M`l*Zl2K\lMb.ADBA/W5Y[pKP6j;j[.-i@Re+^O#kl,"6<XA4X"SR;DQ38/eV5dHn`3^[SR=W&NXm>r2sP_<2m-Zo/D*6jrG6\r%Wh,Zk+..7h5fW_UQ8uSDj_qmEo.]!=\uraOk]Imh\^q;C56D+3^R60LSTP"U1$XNU5Xu$@H$]j=I(kXXX(Rh1f?AY9rgm[^>Z4V9\r%T&osh%g+fr#pF<?6[!Loj$jhONYU13`au9<H2FW@h";c;j^h84<0D0R[pjg3\1YF!5$aHYe]jRUo(dYp*SD2DBF5tsVoQ/u"e*<0\r%\!S":=J.)Og.W^C_L/+ACBTEnqhZVP,AIA%l*ZeRKr'ZiKo0O^#H;1":iUVn.?XQ).`N/P>0i*;[09lmQuO'?NoIs;Mg,oUQ/Reg\r%C1%j\9QYB5=@GJP-L+msGVu?RdEs9"Ctg(DUA$3n(OQCt^qd]<XPbUJNe/e`mXhVaI5P7qoM^:U!j./_oTs50\4JMuNu>'nVg`Nd\r%`&%J33[Urd/"U6A=OSg/0jt5mr#OQD"^cg50LsqBT\q?)!XI%*U'eU9lb1M$ZClfQ5SoeXT02Xpm=Xl&.kl1=_>-&S5c;1pf.T%a\r%\<6!r+&\T&SX;C))[^q5^g6i4V5LV+"0MH546qXX0#HuG!"HILJ+_=]D@um)1'V.mnTFkJTRm)'25d?q`W\Wr\b+V'gCO9bJ9-#6\r%IsKrjem3q0[L"/Cp9[NjU^t:n3@"@03J)$(K&sENh\j8<c-6kP[m6LdXr>R1iL-Mc+m!ga59_Ni;(lDYb>V?_Wq-FLJ8P?h:2ZcS\r%5;sni^dslLf%u+rS.8FhLU3"tb3:%FFJ,NE%8<Zs8N(3Wl"Z\9+L'Ve0Z=6eotj8.5`-#G="h\(SGJF?^FYEZfhqPr?*!Uh8^W?V\r%Je>7,4\di.2]/ehB<`#NV"qLn`>!ABWYGK!&)p]?0a9R;\/,N?S5g3?_+Z&:)_2KZkbm='&Y5&9X3W3Jo,K;bIBf2`&u7<7r"`4<\r%$q_8+P`$W3N?QpphT0\80)XT`(u=+s9N'#%jGZ/aFG'>-AYiWk+5Li6P$234fJ+YY^)5\JEiigM[Oh6#9?HkGJAc#q>WC?"^krIl\r%\aXeP6qY!L8Oop:L3FqNb/GQL-$s#u>5ZDZ%EN&oa&D4o\UYsS^>?CTQG(+r:KCYoq/"i'/><IMB=BupFYCt4U%9]dKOc!Uk$>&A\r%Cit^!6#/lMh//j.F1$c-e](47]Si.I$n*kPJZig!ECkVM@HV7*UKsGXfDj%+E*`)8ds2boRb!p'A5\C-kVI+65qNRYEBGK*;2YMp\r%>\o"E>(-j\'=P6@A>'cjJk,rXEA.d30(Dbr=.g>'UVjDa"grRc((IZ2R)N%)GYq,u5R_CI0T2[F67mnV89Im,_BCFEnUFIQ:<(Eu\r%PCcuN)0^*t$Tb9\qu_<+Z;?JNd@lgs(2@id,?SAbTb[m>9_+BYTG@d=R*J2^W5ZS(mcJ!+W5X%O]5t)CUDE$]g3^%::lBs/b[b2f\r%eFFtJC2kqcU;fMOXnga^VUs6pK3k-XR0c[:N/q.%SkAbM"&F0<JZqb\5XI%4Al2O6Htn-')53@\q?-"ibtrnE\qoj3f+FU-n/Ic4\r%+0gc*bN2aJL/!@le@M4KW5%&pg35p%,8?F+Lue&]j"E5KrD%1eROK3t!KL,05,*q[EdCGU2-*>u.I2B?&WkH\&0E&L4CXHW9o+j$\r%`t"07Y.:<g;q/VX#_CqHN;/*&+8;G,WLrYT5Q/IFp;19UAb0-!!m[Jfn32=I"WUlqK>.A(:2af$\:;kLM<t8a?Q=GEks*LdGA0P@\r%%m2N3rgu?9)0aqiM9NL,Y,D:/)0]IR.E]oFo6o*f%l3SB8c:=&m_=^ms"a"QB&!hKrs(=I(06B+[la@LP]:?s*fge8e;V#JIW:IJ\r%l_iWS1_/c<"P38PU0.\O,Ra$j!)fV5d`LBH/kP:3)[L*c]@pYq;5DYlDN_t[4>TQil%f?sb;f7+4`5!4Z_aWTLX+1\(EpNg9pdPd\r%d4Bho$V#N<BU1oH"a[9FBGTd"%g,B=ZY;`;c,,ifa%<Vi,g-U4dZ5As"]g'a$k&V5!EN/&_a5HF>oDI'$k&V5JMSX)@H#PrAmneD\r%1:kT=Yh"ppA7\m,r!I`pHO^gX@@?7Zgc3jN9]9Vdkkp=Wmh6P(;C%!NcEG$Slt9GuQoqP;`SjlX=u%=E+&/Vj=:@iZ<>>`,I1Zkq\r%SR4*s0fcBQWe*d/lfDK>X2*hCEVL9qO,77HkV$tX+qVPod.nDu`e6#sFFFDPr<^A^bep[3q3<(''QdaoGKUG?6S<@31T]gMHm&Y:\r%\j"qHY<Q2uh6521$4+Lj9WaD<MP?!J.Mf>:p7$Bn#40A5A?cGp7HjbY+'.%!MW]ekj.Z32l%f@B"YJJEiu[troI6k^r70CPC@u]^\r%;Sa8?Tid#%<'WGp(9<OY$<gj@@hmDnVl6>p$43[sH:*(]P">&c%)Kc#$nY"b@]iZ-+]T[OerA0M3#i2/XoVTL)us'FO`38kc?'Fd\r%N.f*A#nd_H2[?'gBg0o)naaUK6XiS'!)5+Z)%o:OP+k8\;O%K#0iT=,o(ii*&k)qlkeK\%_$\(O'Ue#R]s=sY8/%D4ZCo9i5aht+\r%8L@<A;s')[#c*;bJ'@Xm,p^FF:9S'9'nI\U\C,tcU7H=,6<jLbUo<':&Hbc"0D"XR-,`N"9"^#?OaQ/O'&q8^i?a?uBHkg@E"YSJ\r%1m(jX.6JbkpBD0-OO_HE'J[s&MCL;hOL9j&:=&u(B#$RGl5,;&"M$GLT'ula]5llq$f>;\;Vs,pkA1Hk+_fW?@3N=mIK#R.'B.K)\r%"amH$_&$8m@>u8!9[cC!CBV0TG;F"?:SeH#i/<%Pddb[%UOY#d3pm2Z/,?f2?I_S1?N4K-M4i$]!r2=P04<W_J1i#:;H,.@>)s!(\r%I*g''W?M[sq4JQ#/WmhMB&g+ZaHj,EOkOI<)d*m9nc1:ECW]BDWs7r;lqCQ]iXL7es4,Bf'R-8h8.j,FqnP89YWt(\)dQ43g*D)A\r%)KZ#<;DT&3XO%-AXN]l[pUL.aG=Zb)VmU+Ed^8"T7,EP"1IRFR/7([U.mp,24<.306WES17%h)JcOil-7/h+>1.8!k-n\$.qPqR4\r%A$J$<<ee]S/6j/lKp<llAVd)UOlLe-@()$?&]If^7cB/*EE/Nnk3*j+9)jgbj8`7[*cj)?oNX5S+GuPF(-NJYRe^H66oIDS6t_>&\r%FV,^+%ESW@:R_p[S=:p_A-?'4(a;D6&nDI'Dcs[j?]L(UG6"%:G$(!TK``=B.U\NA'<?p\3U;I`"gehCq!)9MJNhk#f1=HsV($5b\r%J$Z"XT<s@,jW'_Y!M?$c:S`d**AJrq!-53NGFK.t"uQN2X*X',]:l\Dh^[?QQtU0bNS4k3.-N5NpU%!uqg<K/S%/W.NF(f^WQkan\r%Q@cH_84d<E/83>1Z0=<ADqH"!?ZD&(GcD$+lj'oAKH'VneZEjH,JX3mbfBo843U5-0<OVsTAb@]9_!#/Hka<(kAL0pa&e@Cp/7>2\r%@I-fCr&K5joY6HMm=uE.D*ko2O8WT5oC0*leCmtJR;OZ*P(iWOgun-s]:H-Hlu]OCdl5Vo1&l+)^4D-_4W]'MZ(>;u=gs_X%cbmF\r%H[oGGB.7ZeEWLt=5Xl8b-FqMe>_MiZ^*XiN*ZUot`d]ddme/I)r4)[Vkdtt%fKhm;YrtF'jeCPc3]gV+TBP7<^4fX3dt*5(K,X*m\r%3p-X3j6,^=DRC`U<Mlhjo=C@VgjPtTFRQk)gAo?4F`\dD%k+aG0cu(f6^$8#nV@*<nIDr7a`sZffUL!T_E8#q;e*Rn*g#sWWP()j\r%'"Ee#:j4'kF!rU+oF""iB0%kF[!>PN\$tSc5lT"dSGtB%P)lN+Iq/eUf]btGoX)$WU=FX_&Ln>n$5LK^X\:L.L9_2#:3K^gg7+(c\r%QF7P1)X.X^amY_r25QSlV+4:Hg%BNO%UCaT\[egcXS+`K;&l41l)E;28cX#OJ*<k@I`+TX=c=)m3:_9YO1tEKlO30MQ;t6p/cs4e\r%ClARZpMTiN86U@Fq9J6#3HXLE-8XTMC@T4kK8\1lW#QkVr!U3/ZndSr3AE%CW&S?i7k,J(0t;-&ED^\h&BlhFU\XfL_CI/VigkCS\r%(Vp!Fhj6`Uol'\jF#W41a3ONT%@uG=$>cKQa4j%,S$q)"\po/D]h>5rGHtR]g`o1c*_l![+mg*Vn9[/[3\$HBFE)GHhjN?:0norQ\r%me9!tG*jW>,1Aa2TJ>?U;efd#59)^omZ/1%qSIh#d)s[c(`3TFnY<8^[Oi!9dp7IBiIC(H[_#?Ig>h<1'K*%lCSC`JS4M0g:(lg8\r%q$^5R4sX$uT8SQU`U.eW0u%Z<s7@-,*l9ReKu)rKq7l&Vp9kVB-`Mc4N.K;WN)6`9]NjEPasiOZ.Ul`\pLXai?Ekije`^13rCpND\r%;uWel<PDs:f^\j2`o"dKc((QQs7Xod!/8[aq2rmJA&=!\Cl"L'_8_7H5CCMYpq(k/K2)@8/H39F8N]T-[Bj"X`XqW"/bRiBT1b@p\r%1qTH5fKO0NkbW]KO?'P=Mg$R@NCl:o;SUi=BqO<h01ZDJJ;a$bU1/.)gU$!Qgj)kD\[k@UNdF9Cl1/lk;bMSiMFM)g@DP=YS?>T'\r%afcN7O'ach-8K4.:]q-0M(ct@U]b$1+>*K:q]CC-<$9_BcIcMXGqV2o_"TQ2]5Vem2E5V;J4QZ;WiKU12Sd!=M%niMA-,,L;!9"f\r%I,k;qmk9"Qn7\:L>MWZGhDb(-D:VnS'pY64C$FeM"V_fSS8&Zq'FN^)NWFk9U!Q$/T6u0d51/d@&esn`X1?#B+;?ST7g4Ged$6H7\r%A9QVuN@_ji>=6Sr9m/(.l\8ZONVQ';m_JE=+qbs6l^/V'Bpl<eOu8TX:]F*H!H6j==QZQM?Q6\e+"q]h6neIafk]Zp2^V%/SA7j?\r%d-6%XO3PeiFP'I::*&%3f?eGblD%RV1`oY!MP`ROf`7U*RAnd1\U^!;hO<$1s3LkY'WCfNBpUWj94i_`'S)pMrOW-WbO[Z1PUW><\r%n%!u76c#m&[/+C]s+R)rd/SO@XeM81"%9Q-4?D-@$j[S*3m<2TNs03f*7NRY,M?@:K4qBW?a%atp!h7_(f6BmU!qj%QVB3^_ojb7\r%`$W>[q.0o[>27lX4jIdoJ&UUHa]q()\:*!6c>CO%n-S!+8Bh8YCq^?SDbn-pcRQ#5U&Hh`XY5pH/TftgMq8cfap+8XnhdpFP8$Ak\r%-u3$8IO\k%KsISLGo0k&?YK=YPT+g2cRNSmnn)M>W/dG"MV=P.0R:;-.pYBLRJaH7TXjWW-Y%B&=.=,0QPZf2=KX8OY;#2@hlmMf\r%2#&W'@<:?(RD>$ipTL3kq6Y*9i=c-flL!9u"1mNr1\`U*b7beJ(+T[X.qdA=TA)1*Td_HY'Ul-BS&[oL2$hIM2-BhnFse*n?t"kH\r%hTS;pPp-C*R0b&7%[W$ejg[eN\%(i\/r.WW3n!D6RJ)TXF1BR%>'MMc3*`>X&<FTFBeRF8QfD7CLC;qq,&S<sl*+Q6>c_#!Ur1'u\r%\,_9lh;@3eT+bg5Qt"YoX=19iL$ikV!Z`mj3koreGs'"8/\EYBMs_cY2FL3\]85Nel!5tGU"Mu,e)=a>U$WS1H>;&62sU8r9E.hg\r%L(/=qS]hRffWO+!$,#eF]j#oe@Rpou.Ad0nblXRl>QiSZ$"l5a\N(e6;5CE]YhKR?XLP-O'8&&f=t$K-)F-\.I/&(Vn!qT(%J[0%\r%A]FUiUNnR2qEtbKlOs5RjLjWEq0IKqHQ>BVdG`tlIe5e)lWn"K'=1;cHMuR9Q.<Z"+nS^cmH*fD)%\o"cYE`GQ,&h\*I[RR\IhZO\r%5!17\c+UjM&H\j2+/U7LWfZpRb"mL?G?;LCN\>6)C6r3jL0j0"3?UcY@*a&H)-qV9HaUSr?uKF\Cp;I#?0qQuhA&6o=nE!Gkb"L?\r%O%OJtnd1jlV4XeV>"384>B:ONR_3K1=7Pjrlh0]W_&[(]#TU?,=m,7!r;3Nj=2XH+[P;l&4o(-JOOfp$%>^K_YOdo[F/E+_<ZrV$\r%SC/r&X,rE85\!Q:XKmQr_B"`F*A=ki<ZeaN^iq@09+V`>M*X(n*i.baf]WO?(=^%2pAOqk!dbS=8oCXVd$qknnotY1s6>!KNWfJJ\r%2d](jY^CD:E6Qml"*AVL4V)M&rTSHjk71Zk0Ct+Uj\10)[kPHZKu"io6i"ZZq7>6!]cH&jM"cin_/e[Hie[G[_QL7]qh9@#cqEci\r%c,SZ;Fi.l=kIZq%d_l6uS:;GO*rGH6&(o"\C:B5IVMY8U7g8$>QhJ^GUK-a>#05<9p:Yk-\bhc)EFtau^E8lk$aGEU9@sYj1-2R4\r%HjkS7*_(*H=/]?B"8n#[7E"75S%h%3C)X50cS*Z\O=hTB+$]tG#COOE3h/d#PbO&oUj.5U=PQGl,N/-AEdDRdrTS5:0?0)@U)pbJ\r%+iNBkRsSj&UJp\KT]dkKlRh8MZ1F*R1[`Wq5B$m&JPR9T'N\]!9CKdX>#tLWh9>+qY*CTj')8??8-NY+N(toZq76,@Rc"KDCTO:L\r%h5b3j+#eW9AHk,62Q1OGp%'tXenrb1<-k_*dHL_$mk5UcdqFIT\72-(<%UD@a9dl("&DH*h.(@0L]1GEl(.:91U`Z#BkZ`0gR9b'\r%^Y]Aq?Q&_-;X`s/[GrE+C>IZTAiR`ZQ.Ulor/5D\n`nsn<g5j1B'P2Jj&mhUhBTaVekZOMf!BPpNc/RZGr+1*b!tsnFGo(ifucJ5\r%V<^VAEGfX9bO`"C4X1)17PlLQ8t1%0186cHabi/qD*qBs_kY-7ciIcOI#ec<6RS\;4BgfeTR+oMJ;C(pMlrX-fApWA\`d`/Q9(Q[\r%:OjfeJ:Ls_Gledp\]=]RKmpVGJ<o'4)E`68e_BnbD(tjZGR;b^B]WU*_s$_7BObTE(.E3YI3t,X>K+O.C:&hg7IYb7n.stHSbUJS\r%7:l--nMlFL[ti44`8`D#eWS0]'[p3<lVAmEFh"o:a&uqo8b(na%!..IKK]YTe):LSMRNjH>^!)e3Yl??,jL3D53QH:n0U\[0&]O+\r%CiVQ@0cehMM%<L?f47:5dkQ[CPR)<@nQFU[Q/9!&2L^^,/?tMO?d8-;`?m<EAsO#kCYhr\U6psTmt*0iA$?b8^K:Vk;.P%$%Xd(N\r%k[:%;Mt1?,n<43+8lB0KnFa[ORk9/OpC0`R>&*1=S40LTl1[j\iNm?M_ERY<S#)D0;Qk/KQg&Wc41B[FbbWL:7WHq\NdlO;Wh\"R\r%I27CIR9N$d.,2&;Rr,9BGAWYnUsNGu11ssKe$TM8l"8\IUQ`dkH&ajET%db.0f!nijhRCog<>WSmHdf_W3HRhDAVWmjii"d?WVQc\r%\$sbqcXbSBlr)7X;K3hZah=i=/$ZFoDN/a.qMZ;L$\,tVrBr<U`FQ1..PKfK6B>D]GloWlQd3<8),GjW<:S:d=HN-M:@&Gc=`.-\\r%l5$2E=qjkmD/D(mo9\[J(,r4(?C(XqX-'?'%pDJm^%^FAZTP$!IZ&p->25p>R5Z0RCN5PAMTS2"EKaQY5B8H[`D()5LKu=1`D(*d\r%CbLc=C>nm70NsC(e5Fd53GjmM/[WC!7E]\5>-JMN8o%9pXch(E+LM4>L!j/[U__6!$)=o<8M,XMf&@p^8k(8J!AX'm7q.WbkZo(0\r%_'Teo"UZGV/hq"qK\[]SW=u'F<+3e$4JW`^(1FQc2lU@C<Y<6;U68]/]MG?2\4J8NUDQ=5EKaRdqh[XT;+RhZ\AD&RUkjtZ$OhNk\r%g$75[De>"3>(=mr!r/iqpapf#:-X4GQ]1ciHIg,MM;bd7hlFXZFWbn%0aW=Vo1r6Y/G"+Z;2fb<!'[HUY2n1NcFP8b$`@W9(bIIi\r%(@L4@kVA%@B*%lV.s'"pZb.m6@Pd1042%pTk;(BnZjI5ZM5!>nnPLL*pGN]LT5m:k"<H]jUrGd[b@G`\aGYhhoTl4,&R>9AD_^8q\r%m$),PnIWI^f.F/BY$W-C/m-04i[tl/6MQ6<GNm6H#\$-,)bAKp>>ID@X%^JQ,OV#6N*-][bdcC_m6K[b=n/:UqOdo\o,Ne64Ca=$\r%fDDsk[>_tB\NPdKQHOIfUF?Q/:6kmo=RZ\/pfc")HG>XeCk<f!7FWam#@ILcc4ls$(XCZl^5EEhjb$n7lAGmS:<jSlm=C"k5AOcg\r%P[ZCFYI,R`U<q-MS*W8t8'XJ_Lf"j1PS=25d*%fm77HrI_/p:27J/itTm@6L8D^YRFK$J*77HrI!G<">kNPbO@Bl"STTVW<7I.aV\r%X":C2dND!OeHY7SeXIKR)BC%`rC%pFo!_E(^F.ksU=_0)3JKeRVKRB8;Y?<L)Tft/G5h2^]K4ll1Bl%)eoHcqP+^JGquh>jbrlM-\r%Xg3<NkZ;'`o^hD*b#GWCHt\7I9>1B3#&&a4i;!EsaNt>YbYJ'<\=T)i+;i;L%^sf=p]n5QE,#@U6i;S2iW'6@(`,[?Sa-/roDf/O\r%p]o`qUBWuN4&X=>qkgneGJ2tP?"d-'lX!r44F)fenT@tu4!&bJ-H9=U2:r@Y>/YE7CU*^7G<[t\Dl:^shGWsRRn[EH-ZZN:4$%re\r%5J?4*ae:`<%efN2aL#<f.`"^6F21Thc1:>=@]lXn*7P3eU=?,**7T`kV6Hm^rTsJCaW/iT3Rc)Z)U*R9-=&P)1O^+ZX_bCKETP\I\r%/!(qi+PB>4;(I_frF.OFq]I1-]E5(Hn<;m(mPC:*(_oT($BXU[l_kOhOU)G8ZXe^r,_#h-5,k6>;Uc&L8,tqQ`@1KE\imP"M5qGZ\r%3f)d=\Mt<pEAG+83p0TQOFZAL<Ikj`!6K+gN*:cHM*XF`04"f[U]Mel+XD@;;PX@>dubPTJ^g,Y%r$#@Is9JjU+\<Aou1rZnX`?+\r%#<"'-X'/!)0`j`>N+?\(W%BoW),:2F]TH](+>FZTJS>H&+5&Oe;Lq4e5ROf*5sfpg$7(L%N)5$-Wm4]]8<GB*@<XQ$UfCek/*up4\r%PdF==>+KHS;UL@8&#.UdFeVC*]:CCbP1F;DlKR>_=sD]X`h\Jmp+/(mMH4[*\4Tr@F+AJ,(/g4W9",<nT^!@;na,2`.k@]EL=`K@\r%]mgP[W`&Fik'>7;3bo$5B9&9:!8-/gJY>s*jq*D`?.J>AGOU*Tq[)(]X5<9B<R=$B9;T\Ro>0/*T/IV0T0_MOrbW!mSO[U2Z1K!H\r%Cu1MuP,i./(!:+>U/]=]gWZ#Mo]&_Lr;AD=qss8.m3k+T:eYIDFpeZ!8Z-,(ReS0g2,HtY+Q+&,%6QjHj@Q>%@PS%*JhA?,E,*]\\r%<b<IX@0HIN8=>%X$&@Be^pK:C#U_KAAfu%.[+%>qR=Vji=XJ6Y;KYm2$Wgr5V20pKq@SRWMp]W],;TmZ(M[\-kJluTG+(XL`l"*!\r%(XSpT8m?H1eb*q/h?=:cLm&\^mb7G`(G"6O0tb&Ve!]=q\ouXilWc%kHBSAmoRoZ/;k?V-(#2nX5Zt.%RJ^8QM!o@A8$VbWTmM`n\r%3@`N8<GTDp$i#EdRrY;DOcN$o*aW8GWIYbMR*f0?D5(V?/2ur/,A.4L0$^->5\GHBGTMoff!oga12fPX,/baj`G!&!U!6lFI".[Q\r%i'dZ*JABHcB,5S960s5J1eG[On[R1%m^6D*g<[qKO?%//@-Zf*CIsIRd(k*L%YO!D7!J-o>53epc'_MTK@`"CeXT*ErI_*3SY+*7\r%UZPtGAbTPqC@3=S-E2Mp>)Sm"6>LU$Xi4"LiTDL,\8ma9P?^'sXi4"LU#-JXCN5PAOO,%@CN5PA:(M959L2]W/!aNn18tG@;M7@d\r%.]K6JP$5"0?C!pXR%tKC:PR;$gnY]\"-15,`?M^kjtH>5L($K?8M)YgH=<V8\T>aImR3[+c)q(*iE:P=aKE)5+gk"G63s^49kj\b\r%&kZqZP?J;D.DeMgq6ctc>)Sm";H*j(MilLm5i4E39"Kd/Q!0Ea-q7#VIik:AW:2!r^]!$8q=lL_O1?+0l:D/dcNOHYRL=?Z8.;+J\r%dD-D5/W+Bp)P;^brqJtli3W?a1Ja#TJ^G+JB:7S`_2OZs4praF;]%)@Hkpt`BoJ>p5)\Ra,*W2MjKfO8;@9I4m2@=WU[g-Y>JN/P\r%&.,M,oG4*q#R"4&H4)Ncli^B`H4/QN;$\e[7jTu7*rO*bZ8AX.NU;@D8=\P]/doU',h-BL^1b#,HLEL^eZbKl,N19%K,7[3$QUc6\r%`'el&I.:+o@BXSfe+l1@Uh2.ja+_f@b\!sJPBi^aj)Xj$UGQIT)'M?]Ktnp+!+1lY$_O.i%qcQ/.1-AB,n](Y#JK-mpS2X"6["4f\r%nAX7H.SrtJbe"#I7986SiWRA%b4$F=W%B^$n*md/\TaWb\4#%<O2P'5_K<U(^@pNo=nBTK15$I<V_W^Ki@gt:=PcG5r+gjYQR^uU\r%&h)^mk`*e*?YHf=Vji!FR-4^.(W%-e7n5dbgaJgo[&+u`[PeXW_ifKFX]EiaU*]7PF]dS$bd+OJJA'X2M@KNm.BdH#"2U_O.Zei-\r%P\CIj1N\[PM[a/<OU02ERq$E7"M2N8pGRu+d2buo`$.N(F+9-OC`!hS9sb7d@`*H;XGqZ:jLIh'20;_*+\>I1Y+_%oBYQ'qlad4b\r%FXa?'>XKmhd*c)jaYe0<%:MtsQ#$/U@^5oT`dB8tj;L)T)J0nlS6SE/eIY[_Z>pBpQ:b$9jVfoO`<;HK=hc7TY$j+NqYI?_.dOr$\r%2+b?5::(4O.])5F\e>Qbj;P2=8POt69#@>\>]%4gUG\jSrD!fr`3s%3d2Lq:Od0^L[\G^M<`s^q)X<3Sb0)YaY,R7/jQ%4?d2MfY\r%+t;-j8Mu084F4/=e?U\q3![J'<5pNUJk!2!\h8PF?$>'.>IdeYZ7\[-j:4*W/aEI>Rac;o8]%1VE'p^^`bl9SiJ.&Q?Y[*EhoR/u\r%gsBEZ"mSCYBniE76[2qUVAYQ&%+/f=36dPLAZ,a`FU9Vbo&YtClad4bFh*t3r,l9HbISfb1SCmD?s/iLPt%k@&m3`Hp/h+U\ce=A\r%JKn/sOC;OUTtLus#r:"78(pdI=dRZI(\h:TP]]Pm27L`>kc*]qAR07Q&!+/%bIYnM:1@Lq^p:+mF"1SIZ7^6)ie;hL,3UH>ErsOr\r%TZ\[TXt)*,X:'40"7!IBfFhOo=7G&MPAuYgX:+_R"7!H#Q?A<,?E:5%?s+<(rV1bA]Vj2!"U137JSmS:?=D'`0$M&WbI%J;Fi!Y^\r%:tI"tX@il&lOm=NV$,Cm#qYC/=$NXd941nh95>PACN5PAMTS2"EL1eO.Yule(,r2rIcO=/Mjr3OGMtl%/T+Go<gZ]eMjr55Wgb\G\r%Mjr5%h_/fNnM*Te7:i."\4J8@AY?H@8M,D+(^m<sm]g_7.gDu\Y,,nDWAW(/:h_M!;@E79[`!D3;Tj.k`0?9:P?R1^OD$4f>-e:R\r%]#5u\O[q&mAPJ-HJ[OF@MBb6AL(**VY+h(_TX\K)N9;@lcl!4h[CAd[jq[qL;N%Oq'irn>Y"LaV`Eh%Pd43)JMqEUgECMm6<+4"V\r%/nb7kW9Y'uecg7QNR8A;eckeM5[B_lZ7bA"%B/S*=Or1)ROO2](d?,B6No8L@e_MOGmRlc`:-o[`+b0r(d8<`n)V&4JRr+.?7_W)\r%MFha&*c(t2.jhq5GB*h<.qVp#[8g705Wn6^"7!H#M?smOkJCM@AR1MN5=/YB^p5S3EO%AtEQbpu8JFIX:-_sKja)s*Efi=6A$46d\r%&*15IlG4l"=7idNaL.<6^:<Z*>Xb@>?teu<a_OKYd4#B"'_;.q=Z60E1bGujbBM+Rc?eI-b;V?VnmNe$-'M:e:)KP#Z7^h8^4_bo\r%iAin>pkho!AbM(%`>::oFa:Z=,!$?-iJ$FDa/,hK.-nabKj<4UYcQ#Y7>Z.m!mA0jo,^`[-*XJo8d>]IM/ef'=jmPTfJ"X/Zhc4T\r%`J-+@fqc<G:tI"tX@lFPjViGcHg&"p6HZm`<-((1L(<KH,j$"+WJ5"cVjq#0s$81_4P.s%f2,Fl\V<knL<3N>aYe0B.S-1qQ"q5[\r%0?-l?"ml_G\V<P-Z7]OcA`Xgk2]@,p-06%k'AI'Z)VWRW`UHGj7'q]N;j&'$!DO65EXeR*eEX0%*3Go*bVaK=/i\PrjVg2-)Sh3Q\r%au+:DWM7PY20;)A])'iq%F]L#+h5qqEXc0o]"BPP#S)g3J8m]:&^%[9NtnXs941m=i0Su*/qIS>Y]CQJLf)=+&E8lmDMSNYF&,A:\r%\09/DJG4uOE'kU^#Wl*c_[U<T/ofj)\?&>#"7*N$Q?=XVkVPY)QJpn1.5&l,P\'&mbF20^'NEXPaWV6uecgN-J@[@aAR,S""k@`%\r%/F-3`^q).LAR0l3?aF)@bIZJX1%$1%^_fF$o2C8MD\C@M0Q(#0er9n<)%%n[6AR:nY"M*]3METklELUGlTuta^2m'5igeM@#qYE=\r%hi\>fiq\/=MccYpOU+#!oJsXk/isqe\un\6=VpT)!HhZLbITC5+P1`B/F.>O,[XiD^p:*sL0%&O([`,tc$'J=.Ku,\U$E=OY:t9*\r%Q^JB%>cngJX:+umTHadplS:ODM03*<EFiEXEC[1t&m3]glAgD+/qIS>VB[t2MNEnK1;*u;Zkdjg(R'H,S(*$Xcqmo(S(*$1`DB`r\r%S('2l!^^QPDGnYOc4?VV\4J7u>&8R[;G0lTA)fR?/[S]9dotP&(.*E-ZkbU"A\'igBIuDG.lEg*[+9>&Mjr5%di(Rej*=0I727*h\r%UQJ_TLKtInKha-WW?jPrcgDKZ9oS7d[0d;D`D((Rcs/:J6cciI'6!H'=q`G&Sf#d@C;jrhLe;D:CIbp+/ShejdotO<?*M0Ke9))Q\r%?Z9e_)57IJ"r4um$`NA(=Oo?D0+DBt`0>CIai8mjQC+s1-+L*N?s+:0@h_C*%%jAL0Nqr\/;1s@N0Y;E$e"0ON0Y;E$X]5C7S?id\r%(M)5i+Lkn/>M-^::2n1J\):O0J`)Dgf#?Dob7tSLB)\I7/qIS>5&UKEmKtN2_KRcGY"N/*Q`9;/`C*-ClbY4Rm$KD;=VpMbNQ?-o\r%Ea84)O5kidIT2U`H<HT6L_('1`$Kt):_[A-KHGRJDb?%a;i7b,7'!/k/3jGdTmKH;q!strCJ>QR^3n98]Eo4dQOeDQe/cIV78-jN\r%[niLq^:;=sX9k1/I"df-Tej\-?cZ'p($p>^=k7/0G^89V)9TN)^H^$Z?RW(Y$i2A@kUusJ>mQ>leTD0Ll[nk(5[B_lZ7[r>Mcjj5\r%':P>99$Cb^R*]Zd=V0l0"I=2hc4ij\L/+`l0I*[0L2/a:[9D_=CUm[%fM"dalN42?XB\+?eI\XJ9$0#5;@S2*PEfqY*u=`4@5/As\r%"t3%o#=`1<J?]a1JWUd'ManQ'Ja"Ea$p9AU3A;'JB"hUt_D%!Lo;KY][.8QOQnB;37<,/D)S=3?,De**QKBZg3`8g$__;M9aEb"a\r%NEqEX)!8g7Z=$dR,F`X^(Hds,3O$>/md]RkW:eK&Z9i_]+rIq^h&cQ76g+:`BFu/Wj#6%A*5I.@GK,N$#Qm1dem!n?V=`L7ljUA.\r%bM7fH'4GPM`PMC3_DEe!Bl&H:X5/LgW:*agYnjqI?F1IALh*TprX8\CINR5-_lLE\D/"XBr$Xe`DR?pSOmrtg-qS/2ZCS$=ZPpCC\r%de,=.@>nt@"Pu8E4#E>,m1E!Eq.MHNFV/&]g;\I`[Fi,(D=!_X-q7a]@+C6Eln\/aq3`lsmfa@U47a3=fEJlM*c%)VA!`qdXBe__\r%?&IpRG"FE3\_DT'B9ZllE\kA8KCKhk'K$nIG7nNSRcsV#8[#3-h:UiDLS9l;nVph9h;PV^8MPC^X%uX/nJSsEL//Uri_#Om8;a[q\r%EhtLu8]<W3_/Bnm?&6?J1J`kBc'^3(JpeJEQ"Y`g/ea)RXBe__?&BP8ILooR;Z,)u.E4"0,C?Lt;N+oF>o>*4E-&Hi6GrW<VY.p=\r%Hf"rE]@``Jch6&<g[NSr13W>`34XoT(>NDP/J`5^a4Q)-\M=np\S-ro:Am%/A]2G7YcmjTqIIPPS$?boGi0EJ4!N))eQk9;i&2FH\r%j`\Q2)S:l7m-<d&(+sar9(NdTM)TUoC?`!H8MPAh^[JFN8MPAhY)JfN(u<h5^g`hRY3O>=s.M9J*o*q]r`RF>ItGTsoO$3fX7b8o\r%3VoZ$A#6T'H/qOQ,h]oUkosl2iHFcLP3kmSSn=?:fY5]n`bt^C^&JmXZ2@o)Ya1%'ADC<`Y"fa7S?/Z?e]DuSnlI$'DD*B#KB+.e\r%EUop73Zplj5!&*UTe7"8Ds=1WPu5d#6>D8Q]q(f85=M/$6QT?,8rEP+:$$@P-%h73+@Y.6(5XL2X;UU/UmEHHMS,?#Iofdocnj_t\r%eS(]/]QS_/Z4?>@/O)9G<m]XnZ16.Ri<1?mImS5L["tlCN,iQV9HkcMhJ/@8R3Ku2F9?k^&LtG&(3h:U._K4+GaVhqhA#e?msdH"\r%A$[jqePk/)5pYsm020o8m[+4]iIjU_meG4/46$B1E1i?\q<p8H5qD3-X1*#_@_dQ>YFapZs#&CV^qVLsIsq)"s0p(/e?BGVn<h@V\r%?"j1tRi]LX/-An]M/_#50Rl%](X;'PQZ^BtBRj_);Gm.Wq9d_qa7nH^Ap++:-"*W?k]/>OT;dD`nRd3.:;X3?Okd%G-I/mL*:2?;\r%[6Z%P*)udrqJ[dFkkTK!fe)U&R-6mu8&>5qlsf'I[E@u<`[Y#L<3$G>UTo]A)/>H.GN7dL2NKDsoF%E_Q@qW.dP#iad9FgIrQ9[W\r%ClJ@<WpmBCOZL5GU_L)q$a+S/Or)<kNX?:9oV!D?D]&Q\9bb)I-WO]m1r(D3UDe;LF0(E>0FbUW9iQ3/ST[iS7%8oqj6cpdcd#GV\r%J_jI>jrlPM?A\-"U$%D2`VVY#>FDT5rp!g&C>%b#rQZ:OSt4r[0[Wq++c`;f(1l=cXWq[RLH$Fq7=%gss-r#WZqFH`95+SR6N5J>\r%RMu&4oRN0%:[PE_oT/+NJIWmJkjX:KH]D(K4OJ+GEDGuM2N8!S5PK>2l=eJ1*u`8Adg@U3_!>*-mXr&m$Bi3b,6h13dtH`p&h;5$\r%;N%!f8=E1;h18(>..;<[@!b7b,)0bS^mVn:#,Q7$r2#\4V'il!Zg1%B6P"Y9=:<^Pe8'IY5jU9*cr7p]./FDSi;IA)!^ZUB^A0_R\r%$h'OM<O2kS9M!4SKEdM3DYhOI>4Z[HF#k`c?M]YD$oC;Z!j,FQ7OlKiMJo?.ID-7tO;"t;0Nk@VNE#F/\?V<6E8Q8IX+Kqs@"rA7\r%c/1Gr?<50A#p9HW$=oELa<FPM-[<0'RV)>>]BF.]G$BJJMS;,[]p&E[)TbFcTQOZ0N$3G?Ks4\RcgPGt8LeFUBD7s22750_4Wa"b\r%!I#Mm-!alK2<L@Hnh-A9Z@CAc%l\1GpX.-U;A8*TNu(0t<t/u?68M<JRc$^__2@DapK3_t_pSiP\*YftoCZR)8Q^$h=#tZ;KPlsP\r%_OHQ\QdEQ49Ipc],RGL&qEiWXkn6#fq^)fWptuK99Sl;1Vb?6T*C]C<FLm.N9[;fs8#K#D9`B`1*M"gV_frD:FEG*I%^*O%FEG*I\r%%f$!TM]-e#3aG)8c%1qJN_Yqf0m_[o]9.[jFIr3S5S5$,<&u.s9B`IB?cifF8Ee83:&]6V3q9"bV3eG":PpVK*M#BfU(p-g3]^P5\r%L[`$>FEG*I%e,C4FEG*I%PY2EFEG*I%[<&!Gau!-K:!jo8G&549&o)Skgp@!).JHd,"^ulT1-D7FERs2A44?Kd7'5FiJ-,I,.^;X\r%3cl_W8Oo[Okchs"5WUr36>,]XEi5\]f/?FYM6tF_M=ZiVU3fH0I-kfpNdG[lh;dg51:gB/m1U;dq[8PhD`S!-Q:K&0n1/K*q$co3\r%f=[=Co,6cV$o7Foo,!2X!mXu*O>fqU=s26Jon@9Q=N6p+@!"F6r%ICJBKmgaKC7gAR^3PdAo\i:RJ4dkZQM<Ks%OLpL?P`T:<1:p\r%F$ug6cs+^eaFlV,j3TM)4,/@O(n<u;9#)04a$>eo1bVB>3l]U`MsgB55s`<-,VUX4N\Psc_am?p^76Q&F2+1(c0+i>UZ&*[>OlVu\r%4pquL-W*:lAC)"@TlVu>P(^j0m:]S]PEq=f%,G&u0X?cXDeCfn;W@)Nl]Z]d^Sn9<j)IjlamjQQ]+QYm$/fgG``ts5U&XhR:TkdM\r%q\)ZP4)^EcMG(Y.d9`^%/a_?i\HZ8AK_&U-iZe?nVmVO,aP,27mr($3QIbHp3C%dh[Y=/;QOQi"'"[lkgE:\kOnt62]sg\-qhQMT\r%#5aR(bBdeMZ%3\^)f5o`e^f(nC7&ZG$`=j'AF;>.RG:3Ra`)%+>>QY8:1gmf44fuac]46%Vl6?]lpti6n.m80g&7SCV,s8erma/F\r%*Gm^dJ,d1Opj:4c=ZNG"_(9d0$OsM:B>;,$*ORko"nH)4Tb[m>^b2-.eDajOdfCTn[:nmZ5S9E@?Qu-YcbW^PAG-t1Jm*VEMo_uq\r%<c6DrhhFN2),jTT't*hO.7lo3IUlT[`>L$#1VXnA)-1msBe;R<aqKmd&lFSYIT09lW5ZS(QD.ThLeK5o(._hYfJdLg1+O#9$>T*E\r%'W%K=Er/WXe,iEJQW6T]rd=gGAJ]dN-1oF\9c0[;`_8CVK3Ff"T(f5V>X,o#^MIW9_o8<&P'bXRk<^bn,eMFLW`DD`9)Zlhm6B]X\r%_VnaZ3R/+P5YKP6<l.=kkpX#8?j=?gB^qTs,DF%orYImo;S44e_r2AHi-fsBXgB7R]]]`Ye'F)If(9?F[Da-rBC9'HBh<?^iTt`(\r%RGi*0Q]k'O3#k'XZ<ED2?(85,lR:N926Aa.aStFqVJDIRZPY%uW,71,rGX+m]XDP`_Qo$(CKaoM-W!oWccO&Pfgm;AY9#%!9Pc/?\r%r;'S+'T&OHKhWo&6d2d+(caod>b0\J>)'HJ?npI8/rn9Dn(7;DAlt60XC:QAG(t-r[Dg\HrY$TqgAal7>$PJW':WE)R\H'D1Ifk&\r%CN"fI#n&ZlMi#]_-:%XY.Yu?R-:*0,NLs(50sJMc#_HQ14ibdN-G)9+B3:@(jLFGYBSJD/RY$D^Ckaer_&AIbfJBUie);1qU]bJW\r%<l`FgXtSiWY7A1k"d]jb&J62(RZq2#[tiSGIQAC?T=S4'ZCCAN:RA=.I@%R*`KH?Gs/MPg66%h?T4DXVQUgg\+tQ3\=cAAiIZs5)\r%^(h/-U0W`h>A3Q.(T0h:1<Eudlf0"JjFkW,)sU/K$3@V-(A(f^R\eanP)FHR\5>mRBpM#I"nouI\b7&,`D"_nl.U?a\O3Zqh]e(m\r%#p`Y#9h%H_Q9^T:c2=e5ccr]@q%Z=5_m%M`'tgU*T7g]./9H=Ep;TNT/9H=E]dndj/9H>0;4/;f[I8F1DUT+YWAmJqlSJ&N/<W^l\r%,j!72<(/0sTmM`X@C^O6qB@;L=h>#?L;j0e")[mcr/*"WLu5'O\FBmi%AI\8[t/n6kdlSVkm-c0T^!5'e)sO=M5VF\/&+'5Ic)'@\r%9Hbp8MpO;q!n4Y5Rss:R*71_lL5!?+%nV'k(`#0I17?-R]!0cE;*2?jT>[qKF^`jT%3+$Oa+k^aR=Uo8Z!MhZ\j#M-GHll$W0[Rj\r%MM5%%rA'g[4!mjVk=$q&+X%SZ/FmX@[9FT5O9G\hpJ(Ft"9DSs+Dg=fTS6l9+rRGsk&_,BT1+03&2r_jXlSLH7Olk>)d]U467Os;\r%<[^ul+VhN`@^-7HWVCO*pot/4WD)E7EFG-YqGn(f=??-IeWFi*/gn'Uh<u);pt3bb@of.PhNCc[\s;uTS]7`lSYQBBQCZ$s3lS]o\r%e$?@Wrcft*1ef@+EIk!;W`/h"fZR$"$J>t'-^:1emCb#&qi.fE<)Eb@:;%GkQmcF:M9q^X3LI;nkj"l5W1,pp>XT/+9k<KrVhq.D\r%`_$q"cpVi6q2$<iG@_nS(hfXn+L;G+]AaJm8M+c%GsW1\*\8[9`'=uu>%PYt)/mq8VhI0n-?=5mapC.K-Q_ag71;!bA9Mr*71;!b\r%k*#Lq+pOJASM=HFLk-m>n,3PiF;g>k@\AQek:/kLSAJBeQ8+G-17RkkDq=&AXDK>Oiblan_:DPaS2MduCdYecOurOAX43`@-$1q*\r%*Mr(J-35$g3dO?o7C9RPcCgfnkBtVaU"=PI$Oat+h)M:0s(!0KnK(`hWH<\E]mud(DUh9)at(]obBlY*n^)WTHpf1Ro$[JSn-.ca\r%9eGrQ]qG]g&_8Cf#@B[YjdZ*7JM/,;_F[8ai6/[nOk_o5,Due6^AiaiS35`qWRT";f@PAGT;t@&i52WR;33:>E1)+iE5nbiDBb>#\r%q!73\m>$ts/\;sMnhXK?6()e:kLWLFoW6ONHmcfrO7&SEX+-(6]otTNMbXbd3'J.#3I?6N1..DOR1B)7RF)tE+i:o!@8Y>*6-a.<\r%k2;%tK:L=n9Lr@sSKYl:gJsTPXbInXm-`tlc4R<:7,BaP/t.L2&35ao$:b4=_O/Ar_rF7!pY[I"jQ[ONoq2R$Ni>d7b7Vj0@ZBim\r%Yo,&mNlYpq+htpUEY%Vu%_CD,('UK7COL'7Poi/]R7)n@iIp"b'UL%R9ln<V/2g#:aq18snnNP416UHZ;8b4W7W2m25[9>*p%lL>\r%M6<M;)=Jg6P'c!X<=ZQ%3;$6n*eKn`p"&)G/J:'SkJ7e0K)'_A8C%YDW%\Eb$JfCQ_n+\^ei*m9b^Juq'R"j!4)O,97LuaGd;qDX\r%T7E9K9+Q0N+'gJ!c5V:1H3g3\%A9a,+ATD,:@H<OR&_d'i>gI/k/C`L5Rt>Hj)0OeOYoU#)KXcVbZSE`kT8EZ6cPZdc;Cre+$411\r%;+5,WOcm`.>rYnoBDZe8)g=Nm.VAhEAE`=!2=/6HNJe[Z)[679bXhapKE!]1f(O8lc4kV&LKumHX91.i_o6n:<:dlf9^JuhqcrGG\r%cg#RZb.1W"?$nm3r*3I>lI=:tcigq!F.C!)prXI3mH58Bk>'3Z'>R\]]Xte0lN4sUE%r1Rj;sZfb\NPdo)kWNKf4R=AKaQYB!KdG\r%ULt_`<,/+@aO.>UmC^.=Bup/HCYjl3KktD"7n?"-SqRRohPb/0d3h4`ds"V,1.rB<S5]aB!5BU5%@OCKO#7A,\rT6VjmDMk-;]Q"\r%iVZ3MfUS5]'0QdbEYe3I9M3NIn^sXuKu?.)EOYGG-nONLc5293S,(6FHmiZ>+letT@N':Z/7^9=.8h'>qVoJ_T%Z'QNV`Xu'#QK"\r%"@Gq8SX'k[8oLV=$-fs>[be.#<c'[=R.aRq5XOri4I(4a"oh4u9(e+oA+c$9B^+^>)T3)OV[%3#/)_Sga]Z^Qj$=&<KHoJ5A:GBc\r%q$fYOle:[Gaslr?%R[pYD*m6hEP+>l4=Fpb!EmJX8c`]tU[#C+ON'mA@-4#.4!H#J@-:d7;$nD1k$[:l09B'cObH=@(Pu$TDrcb4\r%CKlaTMko<`>m7J_/eV&JGHtVX6:*.S9lD;YZA+[^*=/l/?>SN$5&@\MQHqYTqpSRXT\oZfi6(<n`]%AR%A#1#pa-F*i6<irDm+S=\r%s-58?/6qhgKPj];.DcD^2>YYr+,kGh,FH*cIs!q@&G?:<ei-r+YV5V\;]Or7I6'$-cZ:nd6LnZ"H1%?uoJ41[?-`)OH4.Xf;],G[\r%1R(\Z=T&0^m0LHm]]TDURkbN*'8YiBh.un1HEbahmHDg7hthI/1qhpkFn/:B-HmU!jo!S@o%8^V6bsQ-<kEKbk0k!XWQSLo@*X6S\r%VT*\P<US`Ka4A?*]mSPEqj=p6Af^`TVPrKdn?'Ks>^)d&8VOZt^[\;[H<>rdR\B.W:.Yc[cCUIo/,/YYf(;QlU1<ruR?58c6m-kR\r%ibf>uZMRa]DTRHEG+/e2RKD=O\@eH(?<]tjoXATo/SqJCD6-[AoNKMQ1aYQ5I=D*[X8!g!JF[G9&eDaW1[`Wq5B*2GFY]<%UsaVS\r%I@)0CYd`?2S8RImflAZqD]0RqS61*>kL,,CEn=+e3*g7-n*iY(C?F,;YP*>Hj^G?Z]gi!KA&>H,:4Q/&kk)X=a4;mQ]7&sX[HtAL\r%(%(;HVCr,<gUhD;Ug1Y"LVF4%_5#H_Zs6lpT]*k/"':hRlh(D$OVuEh@2[m2D[FHlZSKukhru_i8fAVYs0d:fUrcpb]l_ZKDjPc_\r%Vl:\\3TX_PRsW?fL\\RU;?=?g=7t'7(LiK`._`2]bZO9,[&a*$4JhI$_@aK%Hg.W(%T;4UeILL,m;*#tQ&Xkf.8Co4cnfju23P@5\r%$$NY`EY!BYqBY"cAkfm$BasT'K<FXnCU8,2r.Kj@??2G3EI]7%P:'1Hc*\1"ld+HjH%:@TnGjfiRl)h7+)lPb7JI*q:X7h&/(n,X\r%)m,HjlORX+?;X;#+T+nHAt1rpK=ht%[)l.NC$*6P'l>_-D2RUbh$VI=SR,5ZG*jFb@Ko!^H$&Di>Pk;hZILH&7PCP0iCj8jSQK"<\r%'SF'jG';9$Gf19;@fQ'Kq>9b^s3@=7l?S?fGcJ]@,;ZTl/!,]KNbf/G_H=M25Uri+Z$Q/m^Gk++"rcVs#[J5gpp)#Bq5]OqY)Y6i\r%Hb9;lr,$i49[/IjhgQISY^?D(5E_RU=`0tuER8"n(fnVI"5"=7bomqab,]njZS!)sZejI\fL[(=ZT#*m5I4JG%:HW7?iU*fKjH-&\r%*H%92s4i!IRmCHVi[jiV+1BNlQP\#sqcJL6DVgOV*h8gH+$Qkh;ZCGqr!X)U.-0]>J,C^BDpR85:QM]N=tc`*&l)FW(]GDhTU42+\r%ZMh#%V9No0q2bJb,4k<2Q^I(Q582/hX^Ya'2;3`HoA,_>rO*g1%<NuDIp6e#XSRV>1b5$1Hn<LjO$D[m!IFX5V;.Lig;W$pJe$5&\r%nRk.okg9<k/Eg:Wp.<DYp4(Qk5I-r#5p`l1?P`9`=j[1[5tf@Pp?Bs'OY#]:pq!m2m;mXEs%!p4G'14si:4NIbCZmpB"gt[g?J?*\r%1`[L*i357raZ?eu\MXMEZ7Stt%%7maX'4ZPb@'h]R+I&PLd[k/!Rda4q,+nt`BG/IGb(3'@rI#qk/BAWD[jf9""kOt]eq(-N$>pD\r%L.#c*Wp&:X&udaR73EmQ9i4,>)i5K9XQdFurgkF`>25nhSh?D#1-D?JB&:F=/T+IEWA00te<84H1JMV8Sj/Iji[2&IQ!:W95\a^D\r%B,Ibi9kp)463s^49kmD/U'+YXS(+b8P\@E>HF4GgGt9O&@\L.E2lUAbcLQdQ(j;B73uU_,0p,XP`ML@iB_(#XdTYG%<g`2UN%.R7\r%@]p-.2t:dHJ.t*A%-l(WNgfp^8noe+ZkbU"28Na$>)Sm"Z?]t!Xi4"L@7<R$Xi4"LZ*9t,0/A:%HYk4or^-73>Y9BdTT30Kk=R_Z\r%%0-c>)6H-e3!"EXBtCG`k4J83EQP0JVe7#692Xr4('gJ^6'u5kJHa>dI:ME3!r4D!&P:#qha1h[VYI6A\rpE-39s&nZS5`X@C3uB\r%=f+qCR*cPaB:53h?q*ctT4R:>g"?/rHkp$s.#_1dT9W!DG@jm,@5rhHQD6i;mqjE"5NRVeD^"bqdC7"cDrL0%:2n1J[r??q42DYq\r%hGR<3mEtt,7Lr%G)39;s99as[ZmQpR(](_^<S6t[e&@!5[M=_48>lo%(DlMfPP5Z.QWXlqC5]3l*aMHQmZ2X5fBd&o!u7)Vg;7GE\r%QPN>$,b4=5_VVfd4DkePjfiYEQL"1T1(ot^@-q1pcD,&AU$U:+/LLB^!FK8OJdZl*&siU4_K8DE/P11\LTDFTFnKY9"kk#snIY*p\r%<]'UB5qfagpq`:tdCZgP?X!3Mg,M??@kpob[A!Zjjm5(h#Aukhcod0E'SZ&CRlt>thKW:)F:T*hDjf@)+2V-n#E=UZ=`1ebh.&cV\r%<:i&p4C_\6Q#k"DW?Eg9dKWrSn?bHk>Z:e2%9Q3R(V[Y'1,o&2D:3u=]r=;DJKZM<)lf<T#=:69,pbIikT_0-[Hlk:Wio[W81r2q\r%o=*W;e`h,%+D<Z]4S2k1N_"b6BCHSu2)k7dSF0;2gIK$DZDX=%pFrcBos78@Au<J+=_nogR\ACiMV)kTR\>M)+oVN1A@Hj6M5SR\\r%XeRdqCBm*Y`';l\+n5XWI.7_\0J8=\44X4D-iO-mH,TC_Ol@HVN?U(W_VC8gB%o8hmCDNl([aVR_Hcj3o&ZiR4?]tf:ip!/c]6&;\r%^P>\<:CSK;pWf0??+SgiCd&Z)msk(1PQ,fpD!W`2DnF[jp2V?)M\oGa@n-GD=DSUM(Qcl.h1LuXbjFJ3U[KBZhThJ3mA*S5HmP2"\r%iC`6U%V8spEA5Udqj=qLYbr`sRG/>J.B5=pS%6Bn;Lp@T+!Z59ra]nZ`\r%Dj<Se.1U\fdLc(U4'K.C7(V&JUE_4C.s722D8BKX^\r%n-8_AdZV-]P`+C`dZV/3>]+W73c6^^.tWddi7`Oq"G]#/YOa)^3t-uVce>*@!$QO_%oY6mS]cG7T7';Qgd)eiZ`SNFO;:phG@q@Z\r%?lKrY2i-S2W)'7V!ui!'<@t!%(uF=?="TSt9PkNP`TAfUj";=Z1P*;FUUIG=[t_`*ZNKY+A?^-<8tGtPmpl!)]jHA0g:&0Aj4;Cj\r%GHlS&R67+3`=UMJ!*2`?"NY5FZBZEL[rK307+1T:9#=*JmZT*$?q&!#Z8r:9U:J2H`C*)*DU`j,3ORTE\da"IrO']E*."!5Y@6V:\r%)Go33'bl]%8dmfI7r.VdNm*W'1+jk#Rp5A#XD/-o-cB26>MHeJ?J.'>Tfsh:["+/P//]?W]Zl$kAL"Cdc>T2an#P'2;<mXP?gWoY\r%,-0M06YE7klQu'-HF4C:@Gs^K;)'s;^ZInn/gm2rZ._'Zet]<`(lM+jDK'b[NG<olfQoP]h-c;rS!ZbsRp+te:@B*)6+1CPDo#XE\r%DUn=0#5Y!F/@rN<9bsdqhQMBs/t;M'67n=:)WSb0]/bL$ClQThrW>;%Gq)J3o7QjsTJYtd:DHt-aQR!p9$TXpD?4\ri4Z%Be0CR\\r%gBScrFc;E,G&Z`3'imE6ldanL^P<t4WVJ(94D2ju/c"ALdIILWg3Yq75fR(gLJUD)WbtVG"8%5*\+\kB_,Xu`[q&NN6C4&g:&nP0\r%Dm$i`Z#n#4+FP;:cV(cce,5W3^`4!=Y:$$qJc4B+_E[ufaD.iMAJS<J5mNN(Po_m1#AZ8Jg1Va]#*o)^[j_<#*kn2addQ>qqpO-H\r%ErOoUflNgJU/(*cj^u9s9nbdar'"XP/JPq.c>G`<fnF@W2cJGa3Z3Erl<flC[dKhRY)gu_4j557(Zs<,hU#PuRZU])@tcCYS.0oE\r%h)is\Y+YIWE$mk07hB(FI(<!:rf"hR0B9dC!hSK5d5(lu=#;i"`LIgek8.XQ%)cs>,rIAWAmh\+b7'%]R?eaNI65Kk$j;n+/N$?u\r%AmkOCSg^"X\Fn17)V?OgH%kIMJ^aCJWua,@1Jgpp6Po[2cib<$T/8;hB<IPP$Anq6F,ERc%2>!D3(_C+8.B+bpc[H1?W3g9)@p'#\r%>X4?B.ID$#$-`kegq0dg"3"dTJlacmhaM.h:1omale5JDX`Crt?=ka;?XisMHqA;1`94aGf5G.*!G/C1Ab'bbN*hBg(Q>WD'pIS@\r%lLuTrbWsOkdS^1<N'EqOb%$m?[Ij'S7#u#M!oX@I`hu`;@id?I1N3i;pB+]17WYiCM3dh@gpB^*@V2:hs'flL+4&u0c5N$%;W`sp\r%?\FeWZ5=&'0!r*3<k^dnG0ECkh"R2-"Kbo4m"BR>8cOBAo,+:Ss%o_@kNDF'W&[t*g&9NuR^8/\:7h]Df&A$a'NK5W'5<t,;kMtP\r%-5*9]W>_J;(,r4H^.UGf`D()ASk:K7`D()5>8C/7+;_!l_MS]#RoNDl>0B9JV..s!ii]XB>)Sm"!XEotXi4"L_=J:3CIKPW;Z=71\r%FBuat/T+H:;Nb@&;G0jjefk:CS("u4nab`cC9@]Z5rteW6Ef@T(,r4(p%$ID/T+HZ@A1*=8M*ABTXD:$/Oa6D[Ci<d!rAeYeO]QF\r%9!kP6QpHEAhN&L2H$#1khgY%W."#(gU]S^%!eOQLK_XbiQ5DdnmUV2lMTA#9nQF>]K3$[p,6mX?'UP2Rcgp0G:,,p]pajcqdhjYk\r%I$Vme#;]OmpagZJ7:ke[o3&M7,_4:"aChV<=2ENH9OpZT@pl`qCUc[o2%m_?PMX.o7-k%X9R9?g7W?>B[jJ)\di?N;7jWUL4AGto\r%P,5F30X#\DZcaWD"_UL[mNS>W71I1@7Up(>JJi[ja?ngp8>lodoebG-HLN,&IkJ>/,R^6S5RmWG?&:UoR^#C'Qao=M@Cab/Y=E?I\r%,&pkTXU\gNVMpUV'nrmH,6</qi>4]IV2)A`'#9hEHI6k-U(i;\s1Y_^I]U-m&&*F$ZQ]X%q4O(\UF6Is\\\K%<&_^=@%t*FSA)nA\r%.!50RQd!/5["f\7!5<j-92Q#RCEIG`2:hOhL@@Na(?Y-?UUaL`6t?.1+XUJ%\dQgY6A@?o@?)ut>,B\B]e`@SI.;onnA;RT*W<or\r%UOZ+dRYG5&g,u;B98]aAI]HK@*u9=tMpu0$6tOs.Se%8=WY_2QD,VAZ(,]-D[aV*I;e0QR*Y0*ga@@LB1RdV<&Du[-L64=(_eGI)\r%-tm4!I:f`m9P=VdIg!#"'q2OMRL?*r$`fsHjVh$f>f(LjS['k)>m/]##qYC?<-c$/cJLEZ90'P;:9(#:Q6ik>=<&*OQ$$4lZBST]\r%-XQsR1hGbe3r'](nP`>g+g(Q5*";H9`T6(u3iRj9T,`r.f\^&7LahXFpFbOf)EQ7aTHKD_CZn0%=BTBYUG^Ci9f#1Q5iR?r>f6S9\r%D85Gb)N`Gu/(`.;WZ`nEd#$=M<-c$/::,cK(6anskbK,kfhu"V@G6amJ=]/3\VADs"8ad'\V@uD\c<t5jhR7U8hUDrTWANl0aZfn\r%Ia]"^ol5[)ZBTLJC<7B3(r*-[4dC'*%<6h$H<85u2oO-67?nj1Lt=Q#qbk<@iDIq]4P71&L<O47YR_s:bqMl51/q6#BniE76ZYs;\r%R:_g5(f`+U2lWrQ?s+9H^"Uf'\?[_X3"2bO&m3]gn!AR9/qIS>DD!@bl,?KMKpDAu`,X#,/m']Z"W7q^%.CRkTBDf25:._u0^tRc\r%qQ]:r/qIS>@T(Igb.>e,4(;LIjKu(,E0k^d9EgAWf(C[e"Vb"gKq48EA.EDO*0YH(Z`He+Y3Q^&eeL3!-<=7ce(t7P=VnZi3;>,W\r%Z7bcRK'KoMDDF0\L2lu@f'<QE\:D.CJRr,ahD2UP8PE8'\h69k>lr3\0LdD@FU9Vb1*&a#\h8PF>rY3:>h::+XNOKQOm9L\Q?C$o\r%&#H\D8M0PF"OL>hb.@(H/<&0>-FEh"L!j/[U_\3V6>8#h;Tn/9%]6YD8M+Vu$`18@8M*Aj'H8-Xe:KW".':H_C+3nV9YnfG(:.A,\r%Mq#'1aE1UD6>G=0f,.%15^]94(,r4hW2tjG4J\:[6>Q+R>5-4nOS2R<AR2R)oHKE$jRd7sE>7!:$+i?j7F&Q7.q*!pB$U`U@QY1#\r%AMI5->)Sm"o&G-BXi4"LiC3pH`-<>$bK:s%dotO<>mf=l`*(Z&Zdl=U-<\L&i3rj=FU9VbEr.@)b-b]EF[8?@`$<8Ml[fk+`b:4f\r%ZR29++@]!4T*=R#NR8BVB>F]iQ*$+mBDJ*'IRZt(=dPieeo_9MlN3VT"G/-N]`l+"&I>P,o[]hM2MC#J/F,&1F$sYTprg6V*>=@C\r%8>lpT(DbfF=k7.6mMKqFm'880/Om/;nYa;eg$)FX>lr3\bVR8_EnT(n)TN"`N/?ZU.dM[J=T\A-_(V>:l_EHX9(oRtEgi.cSW[s]\r%("^4H[FpVta>1PtDeoVRU'0uIK3n?<M[*V'Z7\[1#cR&%=Or2_@R5-B!YpCp-&$k&&S56%>ssQ'N)eHJfj_s'echR4N;18GAR44e\r%$E38'=Oo@oIj'[YKp?d0.dmsPb.<*<%B/S*=Or1=96RRK9PC<%Oi2u/bIYKM/1]?!8MpotEeu72Z4[[=F^5'l\ptH\Q##TZ)PZOA\r%/_A?@21uB<=h09mZ'`;-$^a=b\V<kn#+h&)jVg2U)N$!tf?ds*6CPXlQ$#gu`PgjV3iRjq7)>+'=QCps17<>H\V<kdL:q@S2-L)V\r%j2,gGMrBk_e7]<4,*8(*kj5^hh,!U92&'%sY+`Ia<F2i%'<P\cek=+BFQ1(%?60E`L(8if&>-=76RQ'T8d(EBCZqQ4:=?L9Et,\&\r%]&;k3jhTk=Pp4A^i/K9Fg^osPE"W>$\Q6q[/ne[R'5eYhX:&!u;Srr`IKo/!8e!_tq&-Eg-T0Zj03^F+5\@O"mAq*;DFc;DJpg:s\r%BniE76Z<Kj9f#HVZ4&mq)FDj\8Qge@ljB]W&m3_=2-8kM/qIS>cmTo2f/9tr(;HqD;$6-q"I=1])a0js941m=FpjK!\ce=ARJ93I\r%OC:0u`XqWt)._ALE<d?c`YcQVIm@;+^p5R!WTJl>/jb?LUoqmJecdEYAm(Icd`h=A)(\;XZ;a)lZ7\c^&O#b2&jb\RT4;ld`@1%=\r%h^,5(941m=?O@6X=dO@$Jd#,l.I.%ZD1''UQ0kjo?;b'q^eKQ6#"(koMuBU`XQpL$eqNOsYe3:'AR3Yf*)P65YcJ590]]etJRr+c\r%NRCR-='Aj3(Ym+5F^5'l\s2-a/qIS>kT1,0[CAd[1ae(->23[pD?Wl[Xi4"L9i;"kZkbU"L">=(>)Sm"_Ttk7E9/@Q-Fn(p>)Sm"\r%6GFg=Cj\oS92QR?/T+J0`%Q*d"^+F!=FRNrU_ZWrTsPR[WDsER[B0>fE:GY!W<LD-Cl.[EU__0.OdMhEU_[S"9NnJ:2A!hT[DX?T\r%KooOIl.H,G/T?*=_R'$YOBlqH6Y`#m"d[)O*`<B5O\f5>S(+1@!!k+@nnUaJ'B=@//Oa6D[CFDk/<sD']-p-F+l$Q/UF$)c]$NSU\r%<7`G#XD=P]-SelBb.@)b+9..UAR1lI70951L<i3TI4D!<L<m^Cm1`#_%%d]pG8d5&L<lSS\\sbU.;E6rQb]mZ5Y2OnY*ehsAeNc'\r%Y*ehs\s&m#>VXF5r2m7KZS\2X/kDKBW9Y'E-8Z<A1u&hZX:(q@OR'I\Q?>2i/;T,q;:YntI0"Ir!mA1%)2l^Z9fT:AKpC\=p0cQV\r%Y39G&^`uJP?]jjdT;&P&c6`fq'G>L[&t5!Dq=gY%p-X"Y"RtN*?A]`l23e[s"alG42l+#;JRr-FZO!Mq&m3]gdfhi.MHeYcT$$iu\r%L!4+6MR\ZL8pDM*,P/nk16cq?DF&;KQb]mZ.iX@Ff-RZ&$f,;YF^5'l]"j^HkRnP0en+910oHKN6F2MLJPg5#Z`FQ5QCtfAJRr,K\r%UaI\Ecq-+%hj$s>iS)P'Xd8eS>4*.a2Ub"8\eJ.NY+_%oBPFTFj;L(YL9N#Jau0)-Mu=/oYt2keS$*OGJWUd'P=lP1JWUd'7?,9;\r%Ab8O5/eWIFDsXe'q;oGsn5OH](m]/a-A)M/.L[OM]-P0GS)ob>_e>Jh_<OR4#@8S__][06GpL6\%)N]Y1(;(PeF%XK"iFRd/!1eg\r%M#j(o<$QEkK>lX+ebr>1T.OW.m.Q5hG"$j0h:Kt<MpN"U\M:"/WrQDE/jL(]FH<g>+%ke*le*/,7$nL#3E\<8BDTT`qDpr#/)=oU\r%KP@LCL,Q"!<`lDbS`?-/>jOs+UTO2rkU6*$q9e/$hM8MG6">?Hpgq(bP#mX%Z'M+V+i8V/$Zb/O&7Ia@N6L`HY&+_po=W@Vlj?M<\r%i%oPQC)cVue7/"Ro3UocMI=0^]GKG6$tR([eJ2NZ!gFs^q4dIeeod[q/TD`Ai4=.eWt]%[pg+'`]E4'uAr<J/g*O_j"e<*Cg*O_j\r%j`r>lg*O_j"nNQYl,>o5\Jl"5Ut=U`+jejF4'+Vo97jDV4GcrDR4P7T=Me15Ym[+%<b%JeCcntG8MPB_]@(4,]A-Q9U4l[/Ym]DA\r%,2/PY9SN(n6=hW7)7uu7B#iUO`Rq#c5&6K!A!`qdXBe__?&IpRG"FE3Oa@a^S$U'H)U9uoXfp%+q^+#<OSu0N>f#g?%3LQP@oj1u\r%PH-%SK&@(NZ\:Oe9\^DQYq&a-RZ#0Vn'k]cNXZBiPHb]-Vng%/]BGFn.r<3Xne"I66Yj"%LdY`SGOY[+gL,gQg^V/:lmdUlX.R.2\r%\C:V??'G1@gY.pY@I1:?HQ6gf'OqqScZWO)U_p_VC%H.dL!blcfZb!_Y7T.ke`6>>c,sYaorO=(4[)N*QbNonjBLTFR%H1;$SRiB\r%Q_cujo;7[u4uXDh"Ya;*h@!F,$M1[Cb'_T^06#O#@(tj;(Z)]k@_VDWqis%bJB?E7CpFA`rQ/mCaf!bcli*rhf]q$c,5Ln3jMbRi\r%5)p#qab1&<f9G'?q!mSX+Vc]2ifL)to\V>%PGoIYj^l!%)W('&0>ilHF?sf*L^ZX3d:HW#<iTpqCe4CO5gugcb-,TIH2[XfdEFac\r%Zj+#EIVu=fM2!G[)2<73X8G3Uc?$+-,hgsRTSkKHj+o8nB,g":-Kgmm%S[&>s0$T;[XqLWQ)ZZRc?JEs4>YHGYSBcWe_9n+6*2ad\r%UC1'<i]nVS[4'.+(l$m:QR%Jt(jZ^>nKplW%=:)p,_6hf`-t)+f^9Z!8PC.[m/;Yc[qBfagl;$-kc+O&Mb[)&fH!X+L[91Ke1fM3\r%ZK7*llpNm*P.\6Rf#_-^&EYi68+3.`04g4e(!q5(d/nO#\-Q1H<9`;\Qdkfu#eCUhRH3)dk60?joKSSpL!qUPF!9[J)p<Ra?l@S<\r%eqdlhWjTFka.quBi%\1_qQdN3hJ@&2_h))_QgSUUI4WE>ZO_972)W,?1siud_&U'a;HL>CR%lW$9\*^;]I&[_dlsI>=M:Hl@,-B3\r%3.S+N2RD^n<un#?oDW^m[kncAD7-DR$Lg7C_)tjpCN`IUOsCYF]3N5g/0g"(?*6Ip-S(%++P0B6M<:0NAj,d[*_LHt;dq*H&Cnn^\r%`kmPo(pIk*`kpY+'=,'FP.'4>#qH[P>7;+?&6sXh(rD4?;[hJe"V`lYlI55)%:N1E&N4?%fN::#DgigiaTUG.FSnBFP=\P'V;V[M\r%kSuBkKQ=@J;9cB3**WcVcX^$pP6i]b3dr34aY]i_qssn-9VuRMiHOK8M2!+n@knp\#RZ%=^PWW^C,4$g,'X1'W,m24b>Ulo$."H,\r%nH4E49[A2hd@C[^I`"#pl[")=`9,HLjm.^k"Yt01%\?i8RY5D:.9)A9]1*Ygb[5r3,%#F7\%`(BKfUVT.:aNL[iq)Y59XKi&aV/B\r%19Ep".fHP7HE0.TVI/Oi;<*As\mq<]=cY66!\U^S?N)QVE>fUAMt,n;WQXu$d*sNTV1RdGTE?Z8Nq@>GSW\@N<rkgRS``e]2NW)!\r%XQqeeWKBtl<gVRoNUeUp4m=l?'$G%QCm[`-`?&.fWhuhmr^OI?ee7h(U^sqeHNL)_`Q!ZhGd'K.YS]irX:/)`S91Noc?RjFf\Sp*\r%dUDXp@t,3bg.LNVZ@ZeSK&N\>b6n7EN$O]*5+nHAVMte'SP:5^"#E@JismcUZ!pDYdY7i/N!>U#_LZD)MaOY?[oaK!`?A<[;eb[f\r%%2(3FrF$*4F=Dq[`Kr'm^b&V/QLd22-dM*^E#329NQjKteOfX`1-ERu]i/C0D*-u4pUdd(d(_]THYpG4(Q2DjP]@RQn"'IHBs`k#\r%Lnq1LQbO$*OA('6=m?^860Aq+bOP6WLl;-d)iHb_Us!VL4*gYR#R&pcM&Nq?9f6fN(Ad:9T5j<:'g,Q;1BZ8+ih1XWbL*R8/AG:N\r%g$ddqWp/[>e*`JM\#F&#hVFP5WPI^=UW`mR8HjQEDARd!Ad8B\XJg/j.8teghpf_<[7jHN8jhgRc<fdi>2ujWd^pr6?Hrll+7cq:\r%N5aBpi%?N:IJZ`]s'Y<83gl_7C?)\p\%Djsdkqarn@fs7\)E%?_Hu(1]cf&PDB$O>Blrb]gbiOWqNNs,G/MMbq%rQR9H!*:]1Btk\r%XdRSCmEfS1G7.!Pj:.@FI=8H$R'5B#]URCl%LKT5P_M;Ae4T#*Q6BR5^"\h^5(K7`qnS,NNeO&T;S/ahX.YpG:H/*E7?(AT[W?.b\r%]'Yb-/8S-g]$hj,3U")21NR//c@J":@oO8<`*ka/*5f#oA*,bRT,LL4Fk"],BjgX=cJ]uV]B3o_Y?q5+/b+MoJpO8Y4'o%(0_1(F\r%'5bH`m5TiuTC@;8W\<@feQ?0be<ZPWdN5DsdMF\,besDfYr?ST5k6DZ!PV%Ng$ABOE3S#@8u5AsZkBc_QKk[0l12;ljAtSXi+uTQ\r%.-XLW"[2\drW+DA)ncLj;'^N]M.s')3LmIfM&)sm;dYk2Q/G=\lPmaFnoUrq]@])HNa71?MH5r(P9o&W3QjWmTOha)"]]0Gru8_!\r%dAqH'5=Q9q86=*>q>Yr'L^C(]ReOEQUY\;M+&>l->JJt\Eo:$q2U)!*bP>ShJ^@-rQ040PdW\DZ3LN%OT"_gtf&$OFd-NU:Wd:mb\r%3[f']UHhpp6c7qsUQRcD8n&4H:A&t9hn5sB_,SlXrZgsrq"oE?G1W]@pJCr2)kU\[Nk\WEakQP7[N_t7d`jaj0&_(AcXQS@naSoK\r%X`ZCPiQiYFdX(:@)UIc(nKET,"4r6!:E8rX0b14<9`ijTh38a<"pe1Z)UG:(9Kc0[a$?OpTZ4=KDsCoSi0hM+EDB2]W,pjZ3mNSu\r%NiD4?BY\*D)#'S-d<5qT&L#_c!LG01S.h),,6a'J@Zl?,]*+%5@^9KUBdTp$:',&t4Q;luPc2ts_@Yle\mtJFn/FAYSC9==Br.bO\r%cE$9f@8:;//P2O-i2>!Ek#BF7/2fP.kH)8>r93FRXkk$ff$Ibg>r<ICRnl%=Sd\U?ZJDmqk]LPg51a2?<OK.GfgKW:=IG4Yg?:&d\r%lguP#E(?tcdm#WlA+1_Sa#]ch>H!d8ho)cpR&aVW5\9%pFOJ=7pM3@S?mghT1AuLW$?i.W-^/*/?mjqk2lD/`\o7j8;,%"O\I-j&\r%:))/AOpl6GF+!PjI*q4odG<q-?b-uI>"m0r;b8.2(/m'R*Hu\W;EP_i>"m0bal037Z\/<J6s-J.e1@iM+%3LV0f>*P/5EKc3>0e/\r%LAa`VC/Hn;U796*oEGNMdOHq.Oj0*^HrQ$aS'j0V6!%]$Wl7PD%R[Y2$@Yq"U795C"WNV>0rlP+_M"di9[,=sP='12j)Nu?S&c`J\r%.kK4[^<M35*0t=oYGn5j6;]>3B#.ddKkf;TkNO8@GMlV(b@<*$$s"!.j`Y&q:9i#6+f^jD:SmITm:S4.4,<e$L6?XY/MkXLQXm<-\r%b"/r$QIP6p;#r7)'c!;3Ps6Tb0#,cFhX)WK70UB?rjLr`K-s#^TGQaV?4#lpC<FO%?Rp5ZC$NT.n*2[BCOU.l,O-Iu<GhmP]\n=E\r%WL_k+>'Bl3G%2T0Aq?MU>OQ*_,JJ@[/dLptRr\')?UQ,bBh'VPnM,EN.<,jq(S*Rq$d?pdgRVfohH`&*Y>O0rceqj-?@NlY')Vi,\r%0\d6Vi-f-Jmk_;\B!_/ZIfEt+Q("/=no4)I4S*T_0HL(I)e!ig7^]R#=FS&$(+PJNVsTt_c9??qI!&AaKJ&P$j)XDe<Kr-VWU$[u\r%*9:mqqknc2#T+/=emSshDE"Z_=EJBjb6H_']/F]sQ^rE8`4e,jrF553A*du8NMDa\`aJ3YWL(_9G`siF]<DGa"_oSE>Z(,3W@,TQ\r%KUL7-(pO'QA!s`!N7]C&a[+Y!<ei]E2DJ[)(qbu:g;GQ&rY?r]*a5B_O;[q6LL1`CeVuP*4'8^`+ifDR_'2][VomA<6gq[g4^4uK\r%ihY1/>rll:^+Uk,^M(4q)a7Ool&I$12R6`/r2kI?ik5`5Is!*s,e85FQ?o-/BrJ0.mUr`Aj&dtKX#:oHlh=-8^-8VoG=/6u_lMJB\r%or0)(GberZ-1nof[p,cA$?k@C*T%Q4E0^\c>?tE]qAc"CMq.:]A`rT!@1;5pBt_A^ENr5WD^R!.(3'SHV<J5Wkj@OB32p%&(;[f6\r%Fe*rnH>RE!b[d>-mKPoQoXM2W&jVU#+s<,q)">JW]%FsnYVE'Sd_N`)PeVX8T&/Z=WlF]ANRtpNI5c4;5&'%3G,+fBH'#s-@'cl,\r%ljtlc062$gM6HK2C-b*+kif%+l7otH"$^h7?D>4@L\KYl4s(10UtsP^<X'PE;Dj&ES!i+m2osOaCO_<qrqb`qPXYH<#I_9?S(Y4B\r%O'*i#995-PA?RqiNFe)jW2Pa(X"&CLhT5Psot,e?8ub!iAKT[9%JFAQTJ^a;](/(N$e@5*]C-Id>-7Lk<_lkpVe*I>j@lTrQKuY=\r%,rpN2#kYb8ZWWk(7$@d%).ci+H(6d#gN05_(]D0(^Q'lU3lp%1nY!Id4!MLQd5pRc38;KnN72</^25gYS#r.uT!Ar>ZOfhHK5)IM\r%e@oY&^^@tjZ^BA""0r,+U+i'jKkh^aAhcuFT9&#-4dgXSr>!OU#ns(GT,HU0=M0Q,^#t:1@Ia%m@'<@Z_rC'e+T3M&@Ia%m,am_t\r%*/J)j+%ThFTPZa_J!^C&.##irG&$UJ'.i?5ks#sUIk9g`=O:K^TSL#V3"$Z$_Qk-';hod%s51tNhTWmmH4,.pLTICS.I/F\fC's'\r%9rUAoZrjH)[r5O_IX4Nn,[?VR!<(;j@c09m6II?D,J"mkpQD%:,\WHZ>E/)OLTXgWYFH-Q:1JS"9rUCUMHI"?VGtq6,$:nU.2D'U\r%'WY6h(-(rh'Wb<iPR;a1K56`<j70?8llFU!B>)_[>u$\d="!S(<bE6>?$9Ft\[R(k)eV7G^93.N#IgH)LP2(>B4B'j*_3#gS"Fo6\r%2s0M#Dqd+tm;[2[l$h)J#sb]KV=+<Lql;;j#@4%RX0[rUmpSi(U^B!3d`b5,T<1F>:SIUImpUV?e!JJ%_+O<mRuX:_VaYQ4d=gei\r%_*R0NFBb2$1g+I:R+p'CBMI?;N3'?Rqm#k-"4h*TJ!&JK9Zoh=25&=eQ!$<hoL>u5hd[_$AIO(2#7'XoVk8e$'[\QD:'&/!ep_TU\r%N1tTeaEAto/84Z*)i]Y3&\aJ)N$8Uu#eH_6;7(]&$tp>PfL4rg42*5O;++h+$"nFlg-g!\Bc]akm\)RtMJNqtg`N,B;N16s(r.k]\r%P&V*F3(Bi0Ca,WM.6Q6K^f8uIUPQc6Jp!%$.&*r&+BOfV.&*r&XSnFcN?YZ&<%m_<i\_91qn,B1KhXtW<M9"&#tbnT7iB0="%JjH\r%'l4?dK4.tY6j?(hfVs1Ff#T@uk"Z6K/hMDJ;afqsE`#E9jc$ZC"A'7`ip1Bt;gd8NTrh3aMak&hSq#F2Y_Xs),J"oAk^msm?]K9a\r%._aCp3leq"(>V$S:tS0$!Y6f@a-9n/b#oQq4Jqbf_ulb/19Ytb1`g]I"B'#;Bfr9b_R1]'phF.Gh`KZ_X7DOFj<>A6n4"0?\ZCAj\r%es]ai%Hr5DX;eXE)nk^b;Si=Fa>6Pc_g;uEL<,mkrqaU6UIWY+B&J0>4C%89,H5XS_Gp+\V$dngP6Y?Pdn5u"ccjSt`NjNrZomiJ\r%_/Y'sJHd)V09k$2ddOH6n2+=(#eQh*,&=%cd8n6F&Ae:&YfI_,a;I$pJpTnmYA-YknVCj!,1EkP4ef'9BQ=+O4>P4kcMpT;$_'XS\r%X/kCHftnZsX:>gsB1+..@+qMHG`/%'15br5lJ$_bCVCbs]rrk:%9UnCL"B<XIi_LL;Ne9(SG:[s(:Q>T7mp!kL/,hJ*YHdCd\>XV\r%#NcGT5$],[MPbKO+HJ1c8*"gkhGuEcVls=IICcio]*akb+j1SF&;cTNU^bkK$sKLGe&[8Y(ok5FR-mb"FjZqn%+MO=,e.Y$Peg6B\r%56kR;*S.X\c!WNWl4e8,+tl4M;B)=QfMT!@^VdY:eMal.]MSG'UP]!AX9O0NT6\QGos0Y$_C9gV)m5EYZGtZjA*CDsYf:.cL=1"4\r%FHZjYf]hbr8RU,:)emMDs!7Y\bXi`MY.k_u\TP6Tme;U&]1=]a<)-#^*8'0-G"+4ls#t(+%m<YM8Q]0RgZ.>DnSBu"^8N8ZYZiUN\r%Hd1C?3UDe9,Q",Sb+83tS$N#!ln"H'Z,Fi!hk<R)XESuP/?L86Q0;#OTO.SBMqV'@0%Zs#^3arlr)=Cn-jVKM7C4amddXml`Lu*p\r%NfZn3A]i:bp./d=dZE,sLndV&MMB@#68l@)Si#M@b;>d#"2r&C2Q5b31h:bF14$\hdu`6561eBKBuhnXjC`D6.\<tSU`m(2YqX-7\r%a<4lr#G_q*GQ5?ZS5`[N^d?':08q_u58Nhf4'YS]EIEadZZOIM3((HZZ)>L")R'0O\_73Y/7dBPB;HcXZ]OkY0lJ!$%XL[P"6I6o\r%0*b`ofFpK%"C$19Q&]7qX&jE-L>'():!Q2B<0l((b.+I[:4B5j$Q1<1KGFH+4[sq8TmWr:C)j*I*/1oIQ#IGsAlH'rKfhGkg[WY@\r%pGeld%69VNP&H%3TIZAkF[rp%:@J!T>:Qh@9\j,:,>9q)]a'A4;D9+tU8;7T1ho\"\J[,os'jfE&7m<K=]*1f/f6ZQn*a;KmV+8,\r%B`^h=Q3)5/;0=%lMp&5X9+p+#jec"M\d3HN"Y1<Yc(NE5=,V+bA,ERaCH!WM&2SWF3"-QBq!E@mXYZ=k7bcFP>AC]KhhY,gP3f;h\r%*9tQ=N8M0C.p]-=!FTnZg*7lTBj:&:)@,W9Z6-1&IX01NOP2[ck\l+,j"mO%d5Qh@D]lGL0(8h-2a`%61d6VAJI]9Njf>JKLrCYX\r%.dA1+MU5hZhh9V+";<,.Ojm^`E_^#KWHn!2E!G3FJEq66`Ye^QH0j@G-HkUQQ<?*&8/UChqtulZOTd2mV\70WYh_Ar#&sI%W96+a\r%U&(t*7,/g=?0HEo#Ih3V.t#*J]lo`,.mp)_BmpPZW\p`>!nQ;6mGulnUO,c5('<#nI&ckglEc--Htd5E@+-'.dE;8B.>(jc+M,14\r%J3G8f!eMgBcr1fi&tF+"a*<Mr!E?B^aa'\Mi/Ia."IlM-e!F'YTi""1]qDD!r;t8fV=\#?a]aF1P[_=["d#.t^`QmriN:%4>(OoW\r%7tmim@G=ZjS6>l\D!pImhsgN>o_KRga6da?H>%&YX6mMh/E(2(::J6kK:^b"F=WZ3:$a:>/nTM7jI5N8=ma1M=EHpt1d9cfrR(e_\r%B6LPfN#pD6%B5!b%f"hKAdX;?oe"<Q?n7RhrGq*k93.:A1.J=@?+='A\TEL+U:IHRlY7_\,b"#<eFn2mWu\;#U3g(8=L\&GOc,TL\r%is]3UCV;rS'CG<joQh9JM2>Rc/c'n+NJV$+_qfLDBQ[.A&%`gb.JN#-+mtl9S]Hm>58SM]pk['k1lc.S_0OJ2m:mGLGuDOgp9D;o\r%;u5nQRMnEZ!a>E+X:,Gu##`Ik>mr\kmRDspjmM@>cKmn$h1iV0rn>P(#!L1CpTsG/.MP0\iH<f:;unSW#1)bL?IDQkV<ClV_i(an\r%`25(8fWpu(BPih$]>gS<mlnrqJhuj1Rbe:ScUC!LS0_j4,%f<PT1g94ag/?t)O9[J&9`CqCRar7CV$ELhGQBfE-g-_)R@&L[rtra\r%:4>+K`uLo&c*b#g]O,XS]?[cUT#I_F,T@'.Oc_Fuk\t(b'9:%=d$8JjgEb<P&S^=B-+XN8Dp't-V),cf*SLH>(0/?9Id1ca[Tb]W\r%-563qr5.^`-HOmg>V7kUh$d0nXh4G2jrL*:COEQt?B1_WpL(2':Su#@S).HZ](/[)J,NQAcAKtip#99&3tg3=T6V`W&hLeH?G-h\\r%:L+G/m4ZmfCH3[UX48Iu8KB;F@e"$qHE]<ABVUagD$ROMlD[IQmRX.%cOXi$aR4^o(4Yg*Kg+,ZU!Dq^jaO\B*]d*]fIuZH.rK9t\r%O!*3M2NkWm+/",=T)h50'3U>IXhh]E>$BXeaD+:rQo0$YgUg3$Q&Wf0CErpg@Rb"0=\_3\N.n&$;;]cBjkY^3`IauT6Xs[n#O=_b\r%K*AC-F.on48UY:P?aHEQ8c=\Rr>uFD58J@./82d^ZnPV/QOBkI%HXVKSRD'(M$:T'!i1FJP0/5c8M"O'A".ag.Zr(U]BW<l"Am@V\r%$dFhiP67Iu1V;L^Vrs`TeWtN0*pG,_$eID]3>p$1E;pdR&`*?2`_1)<>btYZ=_3:$PdG%s\cie:d8_N(TUI-acE2)UP<o%65]2RR\r%WMRB(7HW12kpfRa*$8!od$`[<Si-iLpH<>-Tr4&o;MN6AdPFgLCb9O'$`XSA>Dq7cE_FUghgib>QpY@ubo!He[MH?OL#-:O9m[SO\r%QB_hJ['dD</^$<dg",.@[88aKDej?^>#VoaAo$KK[MH?O"kU`Ff&ATqcoi_#o%_L>K(m!_XlX#,jdAdor8.1S[CAp_a4,0$?#d2C\r%8atMf>oDX.2us^TDe1>:YodXR/Y"?VB5;LV>,WM6\$`_?/X)_H!'NVbC?^0,5.269WTE,s0",6Q]-_:ppD<`?EgcFI`'.c@=(/r!\r%om(iscT_7JAj$!mb'=kZ?ueeM2.PKl(;BVdNY]=#ePDL;)mQHHS,7k_'g*HfG<a::Li17#.`ol]l6)3iCD]8Lgs:QYDD+LQN1VuV\r%0*Fd<N1VE<hN!m=57;P74WH%.Ib'`t:NEi)r2d<88gLsZ0T;gZ95!1!J_)ULZ+%Mu$(eUnCMud\#$4':99P\O/nTHG)fO\>Wc8qB\r%69mYbi?M8%&pB;%e]qKIQ+`S^'!AhdW_7-o`aZ_[V:8d1+:)4)p1?YTJpr+rn-i,rh3n9AVd"0Qbjo]si>`rgc/XE@67e2Pc/XDE\r%?gG!DShbUskU]p3PQZlIE2cQbN^AMM+cEN*:IcRHT+YF"+aR4E4-DEbQR#=R3M[Ik0#GRpi3F5D'LNF=%dA\IEG"a;?4S8">4Z@,\r%5S.;?5N"nGX-Z%p]=^galb;rt4DRNX4lSYh-rbTQSO^2(f!%b#);T[=<"tOWUOB84-uGY5rZ`4ODUroZN-C0%H\Mm0r3JISCDAM3\r%eBTbrF5[!J;cING<<bcp%\9=O"j+!VA`tm#!^*TZK=Z!\-TNo?mZR`KBm-=A'2*!J=F(us+bchdC7T(KkeSU/7?&5<G04("W4Om-\r%*msA"cp?`56s"(<fc"F.G#"LKrRlJ8Oeo'H^CN61W7E!7B;n'_E)Ia*ZXH+5L-+eeRgfHl1T6Q%Rgn*he`$Qopu*<r.;%uJLpPd_\r%ZpFm\:lKYX<$iXd`)jK0aF>:Viu]sJ9k^,[)u]lfX+$o<*@]cfZ"MZo6b%4V^1paYl+M'"\tg?r:N%bb^"s41GNm+D#F@Ua1@Rci\r%c@0UsdAHqN86@J93q'%*Z^o<neHJ@krVNs(ruUYsMef\1DNi8'GN$EWgL5/,Oosb3I*(0@h.!S`\]EPan&?F,Wd!/%Q!mG=+Xt2A\r%?'ipZgmH9e`ciSm-Tj/nq+Z!=/0$FS=^t*6RbrJo>_-hX7HT?Rl5JX(']9ld@u*Ssr4=_=prM7Q\@3`=8*2^00&0rFOh"2&Ktd+V\r%P.=;?g"hZ=R<rObn5B@)%LQ6J2?6)5oH,D8pY&jAb7WZirKiVegj4Kd^YLE8CAdL8g^g7%epLB3ZOlGR\QqEZA#GYJ,rN8NB_=_]\r%Z]Y\JYt,u"8281!Xk>]`TmQ,^@bPAgL#2K?0+fieSW/WDXa(o(e!+VWDqZfAeZ'"h\'f6,BDA^Z]=NsiRV*4n9p(4.C^;0>A:j-A\r%gJ!o.Ncgp<cAqYUfsi$?>Aq[++.Wq;q+liaB:^3/FY3HqZo7*q]l/BWMt^kf\-VFiLZsX_U)HYZZ4\Z,DnhYPKmpW'$mj`-;(f[L\r%i:OmEn,g+DR9?_@ERrmWfm5lts0A;dTb7JD_-ASEKGs"c'fWN-4L<S`8n%MrpHp1!gcB<0]QNqqU3QOb9pH?;CL_Qn:*IT_5'WSI\r%_^QH2Y4sh0`Gs.ff%kCC*Ylh_emV7,Sb3G`[7ugDeLgOhh!$]H1UH&&)P_j)p+/7Jm^#(E]Pk9"8*FNk0jMef4j1if.D>J!pX#=Q\r%_%fP9IsDqqqYjNF1LPlqcp(j[diPsf1Knb3(0S#\*i@7XIul&jk.9R;=nEQ.<^8'^c6a%PnD4i8%Wk5kSAj02deS]2@j,(na5=h0\r%WjuF3WM?c"UY2Rahc64#VZ4D&iu'D%+8mEY-gOE"<':`F.j2_Z\75p?TN/Z^`4GLlRoYIUk(TY\9qU7_l'%m4QXjR_VXZI!iZ=e)\r%e,8kM)<F\uZ_n<4%6,X%T*n3VhHV4@5A[$c0#c2cqbi.2DRo>BSDSlLMKA[4GC`fofZZ`_-gg*=nCWslpAMEQUgJRpQ6,mhB6UP]\r%pYoWo:O8:H(ME4#AT\o.5Ne<-DS%NN*C_9QkLY@-;Q'")M:T*COlcB7(-J4=AtI`(ls\a=GOk=nFD:f1c\r,TE5(tb69kGD1[Z9Y\r%\'J(09#tLR"p21]&-SM[)9=Wf(75sfakkN4$>,sb3`R_1<]=W`,^[!DMdZhLSgt=dTGV8`D(Z>@1D"W1:3XA++p#nQ@V6M%ck/,k\r%&GhSXPqMjnO7'8\cjqIU:6I%W3c8OP;LG(c5V^JJFN3ZO^D%X%9'WCAiMFn+Ip:\@SJc*6d0[Ss2"iPXe3Gb45e+jdqd&-'mD@JW\r%Afom`$0!`#>[_k9);O%#Ni1<KrKOppm4o<8:CT7l$a%MT2/qLj`jojLjmReT)CU=XLn5E,C7rW"'WMl$2'mD<UWj<D\MF?(isU0$\r%G@mN&e/A*7`g#,l3]`Zf)m46pm**8ujuP-YT\'$>?-m6Wi?*#j^X7rn&acu1V8RJfd.FJA2pp&qCUP%D#aHO(K7DGAB)`XH3SiEO\r%D/0"O<:`STMJC>pf'-6(cdD2*dFS/,WTJb+/IPR2Chn$[>#6T)9jhut[?.O*SA=2tC;Jb\YH>c\C8&,(^TGIlC8(+UDej?^>%Vr[\r%LTSO4C=uihP-)]?C>n#H:L!/aKKj>iHt6SgMqcb0\YC=VNo@iOGM[aa/O*2"rkp1%<hJIDZ*hFokm>:*8Ab8)glrtn/jagRhTAY-\r%f=^?VC?a9YO0-B<C8!N<hq$dF[3QYpMqcb0GC"[R/T+M1`ta;VO\lu=<@^3/$_WY":k\p9KqsAN40%dY7k(/)#9ATXB3ckMC2QVV\r%INRfGZOT2-I2>[L/!usj*1?rTK$&QeqH4kL=L7$R8%4h[AbEAlVSml[/@6aN3a-"j/9kL6*%`mo(7n"iE4!RY=m5/"\FlA@(?CC!\r%3Ei#'<XNHMC>^e9_`67^,c14C,0<EUiNTf``(t-#/"jS0T1XE^/"jReAd_KS>QO4Do\Oe]oar0U--<u*)Z/aa(2C)>f;<4.`/7?h\r%mW)63kdouh98u+ikcW4CiGl83HPF_X%XQ%P/JG\Adtc@Apaj*tid_r-O(iiDP43!52ie?YDcW2t>:R*@G`o>e4>'1JRQlk-3sn>#\r%JT"KO(D$'/I\ecA'E[eI"S(U$V^.]7QunhT(Fd'<dL4sSil.7ZCt;OQKSqL=oU<M5!fJ]F7^k9rX\llhJpmWZC-dCF1A@@0")"r1\r%VLG@Ln`>j=T_QmWQj6th!ABu/\'/[f)+%JSYc04>51A;1.6]=sjlaT!;QPG21?46F]Vm#+G2<F/OsAon#8$Ei:Y'$j5?_#L/><)C\r%ME8ol,-rC[<l=&9hB1da^L6@&a?uCb[RNO4+HB/BQJ1#Ihbe6>Cl0L_#\-uH&(]p"DUQaU9'd,fWnX+kIG`6.))47?1n-SuD)MeN\r%c1%5_IC!?IBnf\^qIW*q1d_d0D-.V:oS1:AZqbXuj;O2u]$Rc*)V<?3)X?pZiG]6#WhC``6o`fF1g(+0aM1-$Z%[<dmTWdu6^+\s\r%al.4K9tl?-LW;8/WJ3*l()GNKU`(/o+r%2R8Mu1!dbl$E7<8od1:W%52/n.U86eNg`cfP0,GR,rI[(NHXb#?MTlCPA]kP5DBFXT5\r%L;l)-<N[U&a#,^$)Nl']f?g<38of/]6W7O%kO8Z^ldD\H_r2N&[h$^R&E:8(L34(A$j1iaUo0@ef-N,P$b-Q!E'rMr/KhDV_$pL#\r%Fb-h@`,u@pldFZD+i4\$<5;>hL0,<gqt`X3)re77I,n,_LA7?0cO2Vc0R-\9oI>Zn)7m']EJC#\R\:\D&FM8M1dc:cQi=YmpMKJT\r%Fhr8F`,u@plbWt=mVuM6_n+2U7Z-LE(tJj)boil">?FtbGql2#/q&IU&BI\]6'%i]`__.dM?"N?KlouX>X^f8lOk&c'o6VM*7fhY\r%b:Ke(SQ9Z9+^eCg'buflXQpt+!r>Uhn/-87&/#-B_%bJ^7\;Kr\cdb18`[B6JRMi5'H/]7?#G!*7U2:qYc\iU1m$T`)qK]m,n@\J\r%f'P4q2geDtG?>Zma%12U!lMT''@K%H941kgrON+rU3B]UT&FgQlOk&cV<928`cVRrl]Pdf>aN71/kMqE[CAp_W_"g\;[_HIKX`Xc\r%@9r_El!nLKRp$GaXi5-li>m/->Dq7cZ6Xm^D(TX(94GfY#;ii]hi\HgcXU]mhN]qMpjf6-,ZE?!gnkk?'ibElFlDN&cdnPR>&#[_\r%WFaIdA6XuHe3_[h,r)"3e:Pe43at4BWJ+*IDgJB!1&ddfl1(0F\5Hd0Tk:JeD7_sIJt*^*Xp!`,*MsUPqC%3j4JnE3Mn.SGgnkkT\r%m..Kj\4nR-;t@?(\4nPWPC7:"m]\==H]X(6_@A&[AH0=Grie"oH+Y+K0k"@\p_^lU!eth@Q/m?]+^nY'8($/?''!W@,aXjm--"8_\r%I=<h>98oKskm_HHI/lK)P._kf0k">l,D+M)$>=@o]9:"g$>=>Yl%m16$>=>q2*Z*37gpL]f?(ZV%H"BBr*+j>/iV<,ai(\AJRMiI\r%9[m>L_n(f+JP^k8k/T<USs`h9G)m"o0-2`I2_QMZ$[NKnEErW-$NE+!31ou?8P7"(:@[>e+h`\[8jYTH8b;gg3stZ15N1VF;)V)+\r%LbFPUP!k0\@T\uMFYaic,quD.B@j`8FU@C_K_IYRY"N/)QZp3@W3@nO'XPS`?)5t7)nqCqX:'Ib+g+IG=;S"5=i.QJL3;`[%Jh:R\r%$gWDYEC*os5\XhBF&4_5#*``("4,>1(bi$!G"BL0)NlGX"EFrg@9n->%uG(8;@T<@$]Ae6r]RVlL;l)mUh,7u2&*.2I)EOsHa)K!\r%2:,8>)V<?sCKNF!E3:?-q+EEnd(FdWW"Trud%hS3BAp]bm$nO:"GV%nhtpi$%F#e1G2^<t)Ob=KS7*4iCPY`c2lPJ_er\t^\;'-9\r%a3I4H>XPh/Kp=kRY+^^'J2t?J\;'-1U_((k-<e<+Gs^I.RV3.PO+kS21oZ3BVp)#*CZlXZiG]7NgB[Zm;I#R(YV%^66Bh^Eo2OF,\r%0Mu7aR,/quDWj,<L&:^u_@<K^]"kSFJ/`N`FeS+60&.$42WGN!9Xl8.B>E%.'lJiZ2ObHi")`qBL6<MbDTEUEA_A(=6o/pp)8ao?\r%9/C[")9rMC_J"[AK.;s97Yp@C(tN8"YI:qnJRMj8jC1VaQb]gX]gL=-Y"N/)Qa$Y=@sV"*FbuM&o*am$De)]f6T`<W"mNPS^;1m)\r%#VmZS;e%`%/Zq`S=;NpHS1:TJmu=s!FhqeZDi"ed@]'83$1%G[V#o)\[-8#\oL9=*jtMI2q9nGZKQTS'6&=h>(tQYmTa;dkjgTFW\r%-EIUQrSW,@D-3,MA3A4WP6!$J#55ZB_n'g<Z[5rD^p#Gi@0k7T!lMTk3fn,^Qb]gXM&b+n0WYY/I-tu[!lMV=3p%L8PnY%cATW%+\r%`H;Iql]Pcc>Dq7c6J$o*f-N,P$e@%>>Dq7cP%4o(Mqca5/i@!?Mqc`:W>Zhd(:U8sHf=m=/T+JpY!)qG5+nkYSLV@^(:U8#SU%,E\r%$3i;oB]d;/_n'6*bh(Ed2mqKQ)mlKnCaRQQf&ATq+OP_"(sc],8MmkV?rQCi;"7+1FV<_[9W]E_4a'b>Nh.g27q&MY-(-j9RA8q;\r%(_.1J>*;QPN9;q',alO#i\n1qHCo"hELU.qN):5JGt]e4\+nZ\ggOJ$)lbS7W"=,C!i%*A_n$t+J.U<Y0W]%nNDkRI"Us\u_BJji\r%K8+M7pRmkJ--"7dHt8tH--"9Jq(EeLQ5Dgo<D(JQ4hI=4\c:($d1R,D--=*8/qIG:P0@HU"gka\EXT:k(!tg+p03[h/eMMt0Y]9*\r%V;W?DKmnqfh;tNFJCEhd]0q<piS@?<h8L2]2>+oo,CG*[\hL\64g%Fc=;U=-e%&^ulVn`+%-o[uX/F.[+4^TEAg)s`+8s&*^*`$G\r%8]_`,6)=9r82$u,-16d[Re_C2c$n=4#sir!b%<^Y,cmeP:uWXS01T+\U$G0lU4e5CiJ\rS\1W=QL#DM5`L!g50(`AHnV+fs\q6iI\r%Z%R6[l)+IT_B<8mkj"Ak]%HC'@TXEn)nX.5#n6,$W^bnk;MTCg1Id8f&fB1'[3\2H@6eO];p=Hp%0M?-U$!^YXs)=@Qb]gX<*_mV\r%Mgn@T_Tc1>f?e>sPN;5CL<1=`&9HesiYn7b6TlSO*3S7M=tG%Q`])Q387<:lJ[mdK0Zt]l"*8P!VN-qN#M+ml[Wi"g?k6;>#Nk0!\r%iVg#8AXJZrc6pNV8L8!rlY]%F15rBB9?:Mm5M1#lV@:?d9Thc/@9A1S@EU>U_I-D$<#LEZfW=3G986jeB'^uQoYB6%0S?=am=D8,\r%oMnEKI$=heG'en[%;DD+>O(n9HP-X<Rk8aNm&sNd!%^Ulm<*I:4h:Wr=l(.b6IeLA7bC[UD="#9q[b`ElR-mZLGm#X'iI(g",:K"\r%j+qTn"(0:4LotJc]fFq7978)CSL8H"G;:gqLNR0imM/HuKsXsldE#F*kp\D37O)EF--;ht@;c'.<?aPCFq-LaA^2Xl(h)X=81ZEA\r%7,j'#m,iXtHEOcJ05o_UG'^(3(QOmjA["f?jEu7M?Ebb<1Pis[G$u_nFgNZ`_(IN@g)02aA["gj*MZo6%!DYKB7:aloO&JGEnNpo\r%65f,VG;?Ad7:CHbAHAZp[T%-_">me?#.oi>0(Z]01>$/[W<k@hg]tI\'W6)\M`B@c/X>2d!Y0Bn:SgntG+g]-Y&prC>k'aZGmnj^\r%k+d_hBCEYhV"`Odd/jc#@9:r>g(hb<(V(&WjBrd>,$V:f0&Tq@!uZFJ-B&G].r*^:j,G?BPYD@kgc+bU?'=:V>3-t@A9]2';WDD:\r%+LM-6BUu7S[>Es]q$_Fh'??bV#"/$aD//c!/0)IQbc]i/TfRIJ&;r6p7<q;1_(J<&N-:ne8X7\lXf\YfI@6KBm"u2U>-j[b!:-m\\r%44lDbaIS<6Keh;W4'!ZEOM@a1/kPcNk$eP,oNjL8?6T2R(D%**G_Kq.VrF@ir)>]2\GJj`<e#2Pk\'=iOBp<&F76TA\*-Vs`oZF=\r%ohNqHm#*dhQ_%gQ2YMj]@ai.H]r^@n)7kfU6)>imB';/HL$n$Bd;&&UVo::Wn^h=Z:=ctNY0k>mJs1!)/!9&A&(4q*k[_iojBYiA\r%]_sT&WIKJA=9%6G_W.A;?9CG#"[cUZGpr5i%/I5uacP+eG_8oT#n2+6=bKZ\e)pd2jSu2^*]f%gcKBDHaOg>0\Od:r<i));:i<W)\r%of1CD]VLdH)P;uWreXsk3@0;Y9+Hi,pcV\0!FB4+/a8cnDi/q*Os0;@@X\nq!<^!-j"AEW&6jZ$FE[kca?(700`TPrLT)1^kX7?Z\r%W2Ql^s&W,V/GI>_12]?\QL`L+\edGB_T^X!0mXL]ri5L7@o^'F36`TMQMNoIG#V/<]e;j>].8!<Ft_E(rBKc"2)q5nWi=L@+,6Nu\r%&\U%T4FAl#@ls:Fld_+5lV,UIfo6?Gr/EX)@,R<WBJnOEdW,YbPPASk@Y:,lTTNOQnAV7pF?:O;Ed8YPbnmuh#3i>")IJ=0PP*QR\r%YK:;,CeJH1g9'3O,-gmR%UGQ,F=e!-$LAUn>dP'&J4^8O9*PYl5c"\24p-JUH-KK>1%>?TU%i)G^r-0i?`ZR5ZfMh*jg5_ps6YM3\r%=6`$A8sGR+?U*FI3Ij1/+r.!6$@c8%gM8eq'rr&PqFf`m=WOB382T"+NC;+BFaAQ%j>Z>j07h=,M[gGaQK=#7jS"ocg!*q<m4Z:N\r%YPV/HX2TAIop9X+TH?4VgL#OqV8/WmeGdmTET`#c,l(*:^?(O:0B!rb5BJ$W^Z;h=/\X(Pc<*>'al"i:*Zom?Qa\H.>TG0=rXsN,\r%rR$1\rmI5Rs/>,:,S#8Q7pg!NWG:j5=PR)DI4TjcR.>RiO+JjpFA=$Ta9>a?7NNY6)CS)2bd]gEN%E2%!#.ahN4P]c@JJB4R4pKS\r%#7"$V(lZV*?O1D6[amPZh^!'6<$7'fH$s_5X$.8T6!1J-ELJ;WEIW<&mSTOOr(1*7_b$kc:@Dp8&d.+1m@h-dfkZ/E-l<tK-@/#G\r%UjosX-[>=Rm>_0Y!J`X<c*!ZSMF`glFln>9[:/4Z'R('O0)n(+\c;iG59>tIbC)6#7n3(lDCu#!mUX'HX:"^O&tXU36);gJG'Dj?\r%*1bc+(L<Bq`EJ<c-C?5-(fs<q@Y1"7Ju9Y3F%e8d82,-R"H!Lt$42HU5>Y$-;b/UM(?8m!8TMV6i$:rd0Q>tP`<7uN"QMR(85(^9\r%820C6#;pbi6\7$'2FpLq;b/TSF:1!ONmGk.OC5$-6lJ2U+i2+`>#>J7D`,fO&r\i.%YLZWp,.(704)DT@*qn2m]C6>K+6Ah_4M+k\r%A)S=gpll_5Ed.d!0'Aq>#h@kL;TS3VArI%.$44.&M$u,T9Hh5_=sKNQiuJbkc<(>VO#&&K]+:2W,hSJ$$3co:L'1/pJMc)J@&B#n\r%@+tmC$"aMN7b)afQsceQ@!KEhM@!l%$.ejj"2k=<mlRP2@,9oN&/38%&j/ndA<$t.C:hAH]g6+ZRG.(::PghRG]H`oCu4X;N-Ya%\r%IQUKPDuI7if=BF9H4#2DmQ+QjSO%?_ho1<6i(J15*AJ-HE&,TVdm5h<!B]a2e"J3EGh5Dtpf`ejFn58)R,m6_9LXnGAfa"'&OnAo\r%nR1Qn(Qj/lgec?qYe6gI;cqPM9d%trh:0379<C:sLYATer2/[0N8DXN^UmYC6?P4.Bl-;j:LRPbl/(U`f(.p=]NCgYWXZgR^h=h&\r%*;bku2L]"aT=fOA31[P!Vg<Q=:TO661sG7qd/"*]OdN[@qIh<l\[n\\07WhYO"S\*DLQY8?4fjYL.IauN$9tHOofIiZbRfYV`."j\r%cZ$sQHENQQ:WH/eIa%XNi^Qq0qKn8^B;bSOF5fG<jSuYQQI-R+<=L#hl>hZ)9qgU-_8;U87lOrA;(3io6i:6p*NC_SFS/dab,3@]\r%NQRTn!6u?dKXrKGF"19]G=3PpoNa-nn`YOKQRbM4F'aQ,U.ePG:Cs;JmSG8e+RrR;he"&'ZIhFC-/:S_,U?]#]fD+STtc&fC?V#/\r%Vjo)0L+7ml0f=m*Jt?$qY<ss5-aTgr<[+#HN>sJ?#tl4c-$>d8`9n$T`52)VkpVSFP/)'*o6=rN\NEBcjmJ<u4#%qUcI4@E9YYMW\r%6qW`0]?s2#]AB_;k9l>9;N:6=APq=n4rE,$b_=Oc]R[b0^=\YI5$aAsb3a!_cQ!f#r&=/E^97^D7-s:XkQTV"S*ci@,5usk?QO:m\r%NT:N7_q9\YFA`N`!h2V]TlN'V2%'ZVpQdR[56pa`)cq!Lb\]4p%@9OAI=)Kel=nrRn7B/iQtl&4bmalK(]kb_3kZAT@L.37LY&)J\r%pDfh'/mkus>'.56aHpe4</Xme9s\ZQ:bAPV_3AP8eP\L>aJ#)oYn0lmWEF=P><&Y%e1B1(>Tp-/aGo:%1fa7*6FE2L"a]-@<K"/F\r%B")**";%i<AY\1f?Ee$-CU,)5iqTBqmr5:0N/kMH</XmQ5c#0\C,%RRr[t'_g$g/-0r^K7DQ#6gMlBk+)%00H"J9rML:kG"a<@Mu\r%T>!KTWl<I=;M_?l]V\S_Wl<I=qL12TC>$>!^j+0Pm)5iga&l(SX<`PCmD=2)>\56A4OmnU(*i'JXD6G7AmTWjqq2E)WG<9:Z>iqt\r%Fg,#k3)g2.PmV2mWMo$VYP_hT<RNrQXDfodU)8.ac6TDq,d5@-n9YKP1ILQrIak[hDmpYq1W,T]-RC8H3250[%/)1p=_UATin9fH\r%pLY4XogW.'eG%)diS?u+-p(7c#q#raL4Okq9K5%3_`4eZ9,ej&:(C=J5_Cjd@l$Z6\IQod`\4"\m4OQJR4PX&^H#KTOF@ekr5P(6\r%oNP+31Bc'Ohif5qSEFLTST3c/"K/T.%WcN(2EWS45\G/9?E8k<e8+]*U!*g`*fPf!4n%o$=O>O@+"lh9HM0M4f/2"ClcEJhRsL&.\r%T?fmd8\K:p;\JaASk:[([2A2:7,&6j7D/oRd:=org!dc5]dD&PLeN9r-g$SjV?R0^p.2Jr,E7M.4ESS*\^t;hfD)=UI[.6;YOO[9\r%8PKsd]p<2ImWHsCHMtJLQ\g#?akkfgRcN("H.^8'[Vm,'AS,h6nQ][X;QmX&9&'$Nqd.[EeS5V0oot)TNDu&A"#r<ilA+JIZ<g*t\r%@*1rM[oit`bL=8n\9#,^1jPVBiHOmj8/M6@0Y`VW%O^_hDR.K0Y(@bCZrq2lMq1b/a4WX7B&Mt/D3j8;G!isr\uDsh/4>[jhs1qd\r%ZOfhHoMg^S=WH&K1g/bJ#d[Zi-B!ig)d:UMT)S=$TDX'VGO!<*CI!ZogKst5-Gj3]p/`700D;\4:stDo^OiVH&;S6Z?U6Qa&;S6Z\r%?\,,<d:#%C:J8)jEd8\LcXHA;=!ZHdWA6FahYtZ>8!2Y:fe'`p/Dg@5<(aO8/P]#XF]c<T'l^6B3%TVo>0IJ7c!T-U3GLm/5FLD;\r%n_UZ2dM]P8(2n\V^4V6>AA`;:peW,()$a)S+d';erX(!Z$ZK4\?fZNO&&6$AVt\.i/Dg@5nAfnrQJjE>:b(g8ZhB)a2j>]B?eA0$\r%/i/Y5LW/"T$/!k=REn"q;-N/k4_+j*4h=N?is?LRLNssj!k!oT;R%\Z(d%./3KS2W('F16kD=a?S!hn?2EMs,:=C;ITN/:7283-4\r%)UJJr;X#^p"(8)cQ<+6)'fVsuoI('r.W.i^h.)&EMORLpl.Q\8;&r8?3b9Nq'XdIUfH'YqlK,?YBqZ$_IVEqI&md[M2C<B[koYtD\r%4c;SqW!4%jjEOWTRaB4Gd?[fn&L3a;'/J'^<#gpu-PqOTO,@KaWaNs=W64k%6>1YbUZ-5loNhCS;=,0T2'*JSC<@]>*)'U".XIA>\r%7Ztu4'N*LNYQO?.']#]h9qHT/C_NKu7P]kjGNFiT`C1SL@DZii_IC<VBEjMf742+.[YaL#5Kn@O^R9:s9'2b5Xo=Yu$jD\^`AWjp\r%k793e'u+Qn:FXe<e6+G0W:?fXS^Hg]MX';o?\.aGq"Bh\mMguAp45"hUIFiLSA2DTOTa.AP=rre[=ZXH@5)MuM9)?'O'L,FeFX6T\r%la'&e8MkW`=EeK,l^oA)c]a8ZW\%kBSL[J*osNam'C"iuTUb9='rt<^U(OM]jN_q$7=<d&0%T%`$ejp&Y2[X0MHe&dRRcPNf@$Bt\r%`t_O!62+amil`LYV@u=K`Krr<Tf"idpbK$5eMN:3LEaGPIpf7r\AVJGEqnMUIUAADg]Z5F1.?lW+posphR?$.=DKmJETR>jruEYu\r%rd@CtFMYg_OpTQJo"ZAReitrDWu&t%mF(R@borNMV)_,b>i^E`LI23..D\0A,RI96E/8Tp+fIn!lOX(i:%sI(/*n;hX[D08_b9G1\r%d5jZHfc7h@E98O&4?T@u9#);aTP+Q(LhIeQbTR;Z&IInIjI3oiFf0<3i+-*sIV!JZLt3_9h^+@SAEM,bmdKYSqkVej3>gak$N:Fb\r%%#:5mnGr$8>f)qd19J`NU_hf2no]b72m]*Vi#WK46Y$b_YXbKX^V::!;`J5uE2Hd._)rngO3bIjDl]:me(61A7q7H+Z4`gm3*A\m\r%:bBh_<D$^KBANc)R-mb"6%I07KRK_E85F%4Peg6BDe]AG`p,f\N=P8Xo4B]Kis#3!dHu1'KlOGSdOgP&,7(,CZg5BD3b75d@54S"\r%pE*-%T4bZrXe0m\mIdcGb/,T)TA]GO;5",QpiOHoTGf.j`+Q1';#9RCDN]O$5+ULn#ult>&b5*.NPPt^(@bOW/[fQ*eGW]nEYm\P\r%-\Ks4Dd\'MgDS*Qr;3"H4nLS%-U[&EX&jf-U($t\gP&B@.gD30bS(RuiUg"ao^!/Ej=W<&E!fB/N'@.$',!ZkLf#gTbNfiS0p53B\r%'#P_%"4)mD8.9\g./E>:"&(Ip6k%)_@]m+G8.9]1%&RbBBQ[dR,=-*cB`#EK"=eW$1HX2k!#penMtr+GE(@k1);K%HE</'EQ5i><\r%g<<qb*[qAY_K8@(4?5,M@2BcE]Rq9Rlp/+"eB?^lN$Q]ko>lapp/F(n0X"g1V&O1((,]f],f:[>]X"Wq<5qqGFn/`oUFgbC/^7J,\r%H?XN8o>m3iil:=IU-a6drl0]`Z#5*(Ck]A^gr3TURi>\5^>jGtnWWp-DIG8fS<A7MXJt$sT]FH?fWFT8d0VuYC.mZRP#KK,#@"cA\r%$Fit@f[",d1d=V6?'c\g&WE$me.WX-.DX<PH@NEpFRQFJd(<1p(RLVf!<($"/hYe7kNLoGlf#.2o*'8V\LA9"[muZ`EDn?MbbnJ)\r%dU@Ygl'2c(7bpV@\%\P92r<dQP"[X$[\;l!*3do7I]+m'e6__aUc4;]qYPg%n_*Q!\nZFohZ(DNKAhaM(J!LafGWnGCL4`tC5H%4\r%.dA1+L<riFhh9V+";<,.Ojm^`E_^#KWHn!2E/*s\EF!J0(rMt1O76,/-HkUQQE-GBU`%6bA3ii_)K]2fh)d@rE;Pcrq+WTIchUl>\r%BGc<:0K:"WE"+uQ%-,?+1884>K43+u%2K?S>m,go(kKLW3f-1bJ0<!iGnr5<K+Gf@5u2(%(hiiX,ak4#^`En/ai%j0mpHu*"m[3<\r%e,(uWMeHkC>D^f3_jI9]$I;nm[\`E[-.-i!0a5Ib-I"CC>@[1h:Mh\p'hcFkG19D3!P,(SIo^nN*>[I+4,o<1B>=(hGl,]3;\iT\\r%kV4[=OA9I;!i8)0;Mf*jI'$X+:Sm^k6GcI&U84$YAf%V9<\>EOQ"]T$3$8m(\'ra$mIdng4'9BHpU!%S^$0pfn(D$>>8Bce1]IXM\r%^.MT$qf3YI^<hYIm:t&6TP3'%OHPH[jhpVWEdupainau>rX6s_h2Y"JJ&-ZAe8Ue'Cp2nB>dUBJcas0Xr[]RP6DT0sEHN'"cBPrg\r%@8FF\HHQ4/c[R[Qq%0^PH)F`BFS5WSk-YZSA+Qa*7s$Sc,@TkM1J*Vh4H!3j8bQL,Vm%^IkC,G`>eO72(Oq'1s-Zr_ZXrt*oBI'R\r%nts`=%K>`J;H@Qn,o*K2PglCi/f%g&Xp8b&M`*',hf`sC-)Qk<]-EI/4[6/BTsGr)-VYsNZhT/k.eLiK&"ucAQM]LPHK[JfA&#Mi\r%Y.2/n55P7ZIr6G*(#iThc[_[SM(H]5f&5C]/M1gCA@7(4B!dS4lKG^$SN85>Xe439!_d6=/>jS>`kp.#W:/r\o"$fN/8/Z<RP5Ma\r%B-5hlbC[H2$^Cn_fnK/"0amhim6;BYIk9g`=O?$3TT).BJ!:+b\ZhOY:p(]r_<1b*(A-_rO:&"L0ps>oTV7<]k-<92]BW=W)cD4^\r%aZb,d3P[(&Zg7R5H6+M3D5l.MOe-U*E1J6!ak3din0>MgToGDiOLRoXX7)3U;pq+kl5!RSY;0Q0"hKaG1:P9*&sQqS\M\9%Q6]D]\r%>252@&rT"+:^u9H1L"X8qg$m8jPT]"UC$SCP%IUHa4-8cCb9O'M^^A.Yc/@H@ZJFWP%\Y`DGpp+qn,XM'W.2X>tMK4\4s)>.[-d4\r%`GK@P>u?N^`GKASSWH%Df$r2!jo_&U(+i"a[CAp_<*f:R>25tjYWI5L/I#,]SQ(qr8<PE</T+JpY!1+_4J/U,.j\Wa<MXri[bDJL\r%KTa^b+-?FdCMKQCcem=52RON.bh^k02ROfu_Ud^)[9uePf@Jq>[9u`&[C'VD<XaE*A;u"e+`KcN)nqah"XViO04D]No6GWqcT_7J\r%Aj$!mb'=kZ?ueeM2.LkMBU2ssE3ocC=oDkK'OU4,bN(m5pfZg:DT>*oanpks5HBE)>-262KWh!oaki&D(dAE&^jA%E@f.e0kP'#(\r%`;!JK9kJP6"8H#^m-SK6qcR]QPt5q>@2MS>Qd3D"!j?%6gKUm/#LD.u[C>("a^B&k['u\9R_dnhBQ"bG^YSV9ei3,)!!r\r#e3X,\r%#:-h>&U'2$e]qKIQ.ScdIu@.ZjefU7fhH[)NSR]q>'JqU+Rlmsc%M6Re6Ua_f7sFH!#:1uKh:5"T:mCdb`Aal_hdAn]6RZ.SPF:;\r%[^KES:Y@l`kYZGC\a3sk\"iGbUGhY!Y6%-_+^1)I&75q37I3qcg/2P=aWYQqKChM,-!WRN*$[eCpi8nY8Yl,ZYD85LXa.6Q+ElQL\r%s*tcjNMlYu`L".(]E6D_'!td@C1D">L_=&)kr##\RYn:9\8BgLVl77@W4`!Z8,HIG;;+?Jr'udf/k+A\a:sp6)E?K\S=cN2mhi0,\r%]\HCH_ar)SpG8_G!,s7e+YJOFd@,Ytf\/*&)&<7D<e9/&`[9tFr$3YAd=$&n-I'ap^8EJ5RTMml^s_Of5$[_f'?Qt<%;\+;/mQn3\r%RTYZ+kJ\9ukUOh$>GKEcc:LsF5<H&.Z;e6qpVA3KNGIA/I%%'3BdUqqc%Z7q)=5-p1`MUR=W=,>M"h5-+`RTLR!;6tdF#;R_R)X\\r%J$;^h"Tgq#n./mfjrj\PJFO0!>Z#Kd6>lQ'W5j8c&GhD$m^q,Xl`MC93XoFR/;Ee'3-8HSNkYh#)phluf=PJc0&7B0kgIL;k+K8U\r%rRuq!:&f^)YZg75hG\3%3uKWM%[1)\@<MU6>0K7^XZ=JX-C<Ju#:l7eD0!27;^i])2^NO7>],Hhp@9O4Oh&_(=l!hD1<ab8!(A[p\r%1:PBe2L.nq1,n:aq*__J"h7=bqrC6n318O&Z!eG$/2F]Vji378+Co@LWRLsO#.5lo1ACg3N$0Z+[gCoA3PM`=gu^gHY0"4"AUpi?\r%no0c&9n:pQNa%%7A781<+EO"^$@^p1oBVq25El2OnEaZ"l`Kq.R`t0:Lo@(eh((""?fSkf1beja([?S!4I((#lnYH67^ii/I]-p\\r%EhOcpl/NcJ"aQh"4!u=rO*sJkRk2>$]ADp$i^F#siAU\Dk(*q:7L(&^dr+ER<aF@kQ%maN_hXN6eRa-[4H%.O.GWPL=gg\Jlsit[\r%:6'IS,J"m+*%U=eh`DdDK6Z]V3Ve;GBE'EcmEG03ZE?W'QIb2'](bTQB(>le(!'d]%.$E<l%t<h?*gWNb/W0hVF7,MDEL9XpM#jb\r%n..Lln/Aq>mTjGU.pp6.c$4rqfPJ6nhg\d*c%J]n#o1`1.W/u9G\4"IQ,<(omY=7u\TQW?H0agl-1UW.Rjo`Vf#I-fSGIc:^HQn4\r%C-u:fG[,<dFna[T7tku[FVr$nl5LFQRn\g/W<8Ho/betokr%!IZf.%Xh[hs9=`i`[V^/alSbMMPmKgLd2MMT"PF\\*]A@nHHg"/9\r%i//f-^H@JsI=J<4))/oskT@"iBb/tn)(dgTMbG\0nt+qJM)=P/Y./cn4bfpN&;m*dM1[[qqA5t`h@OdbWlj@Ks%2AuRVdat?0;,-\r%Q;j]Q3\%^%R]ZPX]8HDnZb3)*iu'D%+8nRk=1ZmLe`3=9!]$j/418N->1F!JX=NbFBuRSi?<B6[enq&8aQX@ThkooWM;fS-6Xp%@\r%Ll@d$YI!C%s',*nErh-RRk(<%LFr/IV&3B^?`NVN/QX!Zo/j0FEGdsfGh<"ur3;ZHW(u'mPMn5M,,Shj^>npPqqYD$k[0q;]scdU\r%Ma]bk<Q\U;]q^qEBsdi/=-C/^])6[fNMN.Q%jFZ;_KR8/gFbm[j6Kq=I/^sRRbj`a1jb`Od@IrJX1tQ?prnOZ!p<4+/G.DP5NCTT\r%HM^sdXaE7J`A)PoGt]juAtYN:0gB7mINs29"$)a"DbBc`X_0=e]r?QlR"<7n!g+BLL)J('b<s5W`-^OIe3H!qCR\e#Jbkfd3Zchn\r%%(,ND_iZR+0,?[BPhr'#De*hg`Pf;IUOUKT4,@8K6?V6U%:n2f<DlW#$nm=Sk*G5T5[0*UR2P4tG9M\Y#l]9l^WY*ng4c_7bs&eJ\r%'9\II5eg"tFN-<</rJtmgg+c`6!8Ru29:5J4hgCnj'4J7nol6*1D":<05BE-1XHu.EZ:H6PsW*[Uoo/'a3^&G#9m"IK,cW1_@2Z>\r%h^Pg_F`]*O2I,Fj.%,Y=j-rpKBA;`A8U%0ekd1-T%lhD_kXCkpp=cWH@_,iYH<7/:BOSJ0pH;,\-&C/-ZPLKCn?;Di-g=u'2.nVN\r%rb&4mNC^I(gcF9VrAj^[j>OEa:sJr4/L-b&gXb@B[@g/eC]]f)3H%eQ6mXOtR9I*:cHk)$2RVK.qq>6/VA=9RptAp,VNrM[Mi&r#\r%bg`AT(ZURGL&E`5>KbjPlJ,:Xc.]JO8@B;CWJ)eGI^U$$W?osE>(KDMcE/-H$_:S;[MH?O'niC'DJJG%R%RP,@_HJ$k&BqQKCrIU\r%_a.a199L`?/T+M1Oiud&CN5hI(;3MP[CAp_FN45q/T+Jpa=Y-7QFj+R)O1>$[6h.5+L.UI"+gkgLEnQg&u:+W6L,.c*XI5GA[8K$\r%:t;IM^Q8#g=Z8iDN1Vu0`kBEi!r5ubirS,#reL\AM_HGhqH;0.kiHK7nZrWGRHS=@n[!1,VMCom`m6u:'!kfgmUo,ZIl)5RK)&Ou\r%R-CW%_f-+G>c3`)8ZBD*89.UC:`*F<m4HCMAMCUqg06VKL"bGlBQ$WB/]e4Kgl+i*5Wm9Z$Y=&=UT[n#_6./"<*e^s#hE:!WXCf"\r%hRZ@>4u)7R*Ead@M:QIg<*a`mPX9RGhX]aj:44k6#Tl9-_doZ,4t'bnQCGnu]@M'Vf1[.Z,\+B52+,''\m4iZOK9IVkduKk^3oP\\r%VtetndX9gQOlFP-]r:dl\2t%3k4e[1qdHr]"S(S%S*bk?@H,HR]g.F0+MMYG]!W-DlUH)m5,nbe*JL8h2QAA%SS.lAg$B<%*JNGB\r%&B,H3),oH$.H#oA_+fh@r%j!aZ%GbfWUuTjZ:cL3)dc,:06GW:rUGRX<M[UZgRq2[[com^]PmiO:\eNapA4sJdNs#.QVcA0dgRBT\r%$Y!X(0p,TmomAU@IrT<`oH'Jo/@Dep^SBN\d$2.!"0+iK,J$H&f;UQJ`hl[DLZhgqp=/F*?@He[N)Q02D9:.@(f6Zplb_(d80uO-\r%_s@Zp6I/;<>XPM_/qIG:Gfn#hY"N/)QR%@,2,);oL6r>b'%bL+)M1EgMea0((39rN68_GM>XO^YJZ_XZ>XO^Y!St1mE=GX/MOaSj\r%8;>C8M[AMa->-:Fh6ZV5)HODd](E`,E4CWL=p&rM_r;T'2)`t+!k<tbs%4^kY+[9Urn!tE;A>jk:<4!o)A:Z_*%b@39U6C=2)M?K\r%R!oC#CM6TTp%eQ*\:u>6"8#5g>XO]iM"`NL\;'oi?-oJpecTE2.YWS!_.7t=E5UqePejsC!&sNWlb\#d2Rm1GYV)mM6\QK=:FLo+\r%2oPV&W5_2Y)re8"P!asC=sm8Di.esS?$[To8=H4kbL#<SMP;!"YmdO0%<43l[lc(6;oL>k941kgiUOIWf7C`A0)])?)V68hX@plc\r%G)bf#(tJj9$:8!a^p#G=-bIEA#n6.:o>mXkL.$tDACb\TeAQkGM.'[j;QD%FCMqH[GZ^;7W];N0bFW-TMsEu=_Re)cjU(84UB8ku\r%Fo?ZcJG`h]OrP&0&Wf1H1H?7.X@n_5EErX`\cPfDR)6FHHP\N5,&gZ9PbB#>n"Os:TW=7ff-PC"@6VMh`UBP7Ic0c.ijo8IFm0nY\r%,[R1CYV&n7PN'.VL3:>h3$GFt?s&aQ;;)W6,quD.VJ?KX>lqpTnGX9pRYqO=P%4o(Mqc`J]$fKeiXY903f(Fc/T+L&`k1`G[CAp_\r%][-%ZCN5hIkUkq8CN5hIH4m9>Xi5-ll$Z1Rf_BuoQ9I1a@r$(R>'Pc\-rZ5]e7+sb$YF->=/W7(j_nn9H(/!#9OV^VRp,$$Td7YL\r%Qs,YHmgK@Y[I>4g3j&D"GTKeAS"rPcC3e:77EJ`H;h]rCc_CoJHEObP/bDN0,f]GC>'`*<O0-B<C6A/&c.:l4[4K"d5/_[e;[YAH\r%I;LQc;p-PiCX*[VhHt4('uDSn(t>?_=I1aPjVHGo0WYZMA3sOf^p#H$0#<Rh'%Sr%.$>Q%0n,Fb;K?oe`;!K.`Om0B0n.\q)P+jL\r%BD8_<P?^$%`?3YWai(\AJRMh_/OjGn"gkaXV*o6@"gka\B8"jo$6%K,8X1%9dP/SMi->p8]A-AP,W"\fJ72a4DHdn4`?*Ta[2@#B\r%&f0%Ua%gi+:bcBaZ[EYpQV5$FHE8oJ>Vf0Gf&[5Qece-m+c%cerPI/`=SI"Q`-)jKqinri8nO[P&%(#.-5m.)?Ol=spPfOs?Ol=S\r%fs]nZf3Ho:0s4/W=P$6[cGt&6%-u?R4"/#`='-9e@Y+$&CggV4OGj<,GTgCW"60c'_n%+6>aN710&3Mc*nM\lX:)]l8TA#;_n%+]\r%(tU&fX:*l<%*aM-V4#9QC`"k-bLl1gKkk@"%B%lT@;lZMWZdle6<mSi>ZfU:EY\`.cie8\Hf;j")OaVmR",I#C\U\>Ypn37=+)63\r%%8FQk,_sDt1oZ6+;]-(scuc7[HS@"R+jIY:5M+7E,K;c6br'<<p=@m6\r[O8NGE4%2;h4>Med"WfEMXe,[(;@<%"X!=Xf&WepoOl\r%(>$pgCH'mu+epo:r=TUlcn%r:,h=Zs)YVC$iFiZ&s+Tb!d("h-K7_[Zd("fW=p(b"d("fWeIZ#72QgJ]YV&MW#KHF9EeSYpHd"XU\r%941j<F@%a9CBY.46GJ3^DFbSp"`m8/_@6rp9?;'>bg2C3OPtq=D8Z<^@DWI*P?\1JL9=rj\;*I#c-VG]Lu0jPBngLV6`_hldL;<l\r%/43!(P)"(2Klre'P.A(TJRMhFn\@#b941kg,ST4L"GV%j5$;W0_RcUM2_K)U!lMSpOW["8`XqlJ><mr31ClDEaH234`7.ramj^#m\r%.m0iB26;^,21PEFKlt*+2Kd8uFTLZ_&D&3^XQs4c"Ul*r"b!V+TH=7!F&\?E$t3Gj*CZ=)/qIG:0`OIqlOk&cjgoY%27U[>eqN_6\r%h;c'LL35Kr?>Ef4^eG%&pOi?KbYR>J>aN71/q$Hki>(p:FeS-\&[!E0X:+tB;I#R(YV*V]h_hQ0?s"5:7s9sZ&fB1Gai(\AJRMi1\r%YI0Fn`GK@`pV+DE`?!Okej2-*CN5hIHHkngCN5hIP"];"ELU._kJ^f<"uWfIY"in>MqcaEA0u,?5Z8'Y0je.CgXLh'94(n]gXP5O\r%(S`mr:n?rkCGD8]Ro^&SWJ+AGIp7ice=([B^;P7;;[`;-K!^QCR9ICWGM$)g=,LWV'Yr329%"rQ>"27ra>aNoZ=.Q3$_RorH`dF<\r%>5F`m%5FHpe2"Cu\#mVdC=/gWn:u.KH:R.TnN<ZadP(U.(3`jsAe>0XM\n^5GlEC<<>[Ek$g&rGEErX`]&9R[EjWc<F]hdpN[+CR\r%Fh)N,/WQ,657:bF:Ie':T*7&Z01SZoT-_V9Ng:MHMe8-1hp7JHRA6#OHf5*PKoJVa'>8u0Y<!0]MBqXl[Wn[]TGm"3(K*qN8c8?M\r%MWlb,T:Z?q\;eYihnF;)+]K7$LbFPUP2oHXQ_RC+-b0;70.$IYc`-Tm_$rh'+jPDr(12u0Dg7rtmDSTgMkk)I5%p%r/lZ*ZZassB\r%fCrBaSLR"$d:G"ffW?cek@MB0d)mODXh]P6]E`:(KY5q(k7N#%b:1gGN&p9-:g5+2:(J!DM"MQ2)i(6)bYrCNq\?9Lbh<s"jKK>c\r%WP<\!7HptS'VYXR&4+t`=T@A6D.8hWMd[H72ZL-]l2FQK)=U+bc@OZ%&:tN7"@I[94Uo;JG/*r%X-r-8Ka+V\Wl[cI^VuMl<Bi%$\r%%4qce;i0X3*_`aC3pDn\T'k%$f0?[r+4+PB9pI[m^$ANu3;$*_OY&,->"Ihp1l&53DiQc2b$ZODdT$ocmigL!h38i%,eBgrFn8>'\r%_!8g_V09'Nh+:o9eh#6!27Sj&pE%a42.LPe@.,8@;DYVMkL7$qr\@snc!:LlJN6-!V>cfnMc:O\6hK_DVK_"cY25eWfO"<^Tj;)J\r%XS[GA\N`pjNfKR-O6@h9-M-'V(LiTmZO+;2_7:cA_0MsR/l\WjDpGsi#cX8gp[#e9UF<^a&(7_T?Org?mjA`rr?t+/BBhO+F!"FF\r%!#%2YqckBV:A\$%B9):BU+;:7gpt^J)A+ak=B2)N7^SaA;g]QFZ3IgXp1-=Bc59o5(mQ.1=$MYp7u&.=%\hl!cEqmoP._U((d0:1\r%Uds!g<qT''1`L#XIo)j#V$ArD[%-NV!b>d_'kOY_P.J6,nN2SD;@oku5k3)m;GcA,*Df<n8Ida_%SK*t`ra4=1J'n2/Oh[/[f9Dr\r%[o-oV3WZ_FU`c[A:[75)[Th_Z*+$]MgoV@"<qO^hnZ:PPY%/VE59jKl-DqR-cWGu_Hi$!#=FoT/NecD)@1A90]-G7I23?mtk*>qt\r%\,eBdHeQP\"g&5p!:V[i\3^Kp6$CE1['Rp[Ftc!7>YlJKQWj!X5!XGYp]17joW6*)Ssi8D3QYsZj$=3t27]gDVe_"QqH^_3``JI\\r%O=1QP$LXG'+@e9:)/L]3UBb+@DB3O<-$M=6cbXWb]=uap!"?W!T"rYr9Hk7;<;X*+^IgpBIC4YK5$F0U5%F2S7;t?lU-'^(gb;or\r%#J-,^YPGG=LSJEdEUVaJ!TH^ENPAh7NrDNBhB(D89RKS)'4F!6hYYF'"o"aAmXt,&)P;tHR?uCSO`J3`G[oW&=eA#QM_]sVf9G^B\r%ObUK)h4>tG:M-DgY'W?,=8!S2^\=E,?GHA]GEIt.[^5;/c`6U)-Tk,+7s$g6S2%51a`s6o:S@)h;Qi;/CWbJ^q&8d;P%7`QNnQNS\r%D$:(&5Z6Ioo<au$P/:iq9njGT8)ougS2u?70E:=^elbG)#s>HcLN0FgD]8^Upe5;!Sm*4g>+.L`l:03o3tIHas6gj=fu:!_nihI:\r%8JfjF0Zr&LPIgjFE!LJ`0YB-m1qC4pM53%*[c+.a_OmHQ-b]ug\JIh"rRpGu-FMlGlK`K&e]k6:3;-r&O,)Ch,P.Dl[GpWomI'^[\r%rsuQd*M,54.[=\D6T%Use)<c,S_-V>k4h]DJ+-3b?M3ha[O,;B>&i)Mh0/":$KAP`.#I(lQ^6RiqH\afI'?fqd_:OJ.t[&kYkCMo\r%OhrZQgDjP)OWOg"Hf,-T^Eh\DbM9)h"H;]iO*\6U"2ogol#_b0Q/6Q8XF/He%s-4E_1N1#&9SsKp+=1o^$s:#CJ3Wqf+&E!UQHF3\r%U3Cd?R2AV`(@LtN?Gh/W&Ef%PP#r_<a0Y1=l:-"hA>A0HYr'>,ZKn]d-*n1)SM<aN'5\u,dXPH&:>`Ctfg]mj)ER?4`>:V,f4=KI\r%[od<c??9<TV?I.OH.AkU[^W3A3t.ah?;W5qh<;MPhAeb_C!fJG0;c'`3aF6Qbj4KBPq4"GF:+YNRtIW2`.N?GH@)U,]FHJGcEIrm\r%ju!Nd>_^.FZ:?(Pa4l(q"%'RPa]`fXBbbO<pe469Ebrk/Atg-UE%YPT@ouHp@Kr)`Mp['#q,#Sn7h4=^6$mfK?<nM9SVGI2jsAPn\r%JZk.YmPI2=BF`Um"f6RN?c$V-oP^W2g^t]*!3h]C\_gC\mmZOZ'%`!&VF'%PiSD0Jr3=Z7"gNQpHfIe8<gQBUT@@T$EC?-gHg<j=\r%S2'3``n:W$7EX<VP<3>nYN5_"Vg\U((Y@+Konpesn\Dmu^4@orGmAYB1,RiWoB'X(c]%cnTo4<H6>*B_YjPq&VcE/-rYesDWs85X\r%pA4rVJ1>B(2t4.ES7%bfQ8D8n,Y?)IYOtMj$=Bog^-Nup.[/sHm)#l9+3UoO&?!uAp$@G(dtbn-L$cL@\`<,ss6=kt\)ZF[h`)ei\r%J@3G4DCC-,\sZiR)c`S?9L6_P6]9W3UQ0e'Ym>(V<E'9!6b`sa"O%[H2?"?YA6T&89Dn)coL--52U0Wf$$VjLCHq.G,FO'FHZoWM\r%s3T<*fRFA:S$!5\hI?FV/b>,UQf75==&paI-bKd7WNV@8]%khYo\ql#X8)GNhAfk9J,Khcf;\k75E7QG+C[5-ne2N!Z0m>Oi=IRA\r%]Ba.0?gVAGQiCgo[n96*5'q.IM9*NIpNt'ZQC:#ZORoH3kk:UZ<pm]Id9kS\>+^.7h4-buA%ASqW)o8[*I,TueD4T^5>9bg_pH@O\r%_b<n"0P.3Z(ugeC_j"M`'O?Gi?!-t4p$*D1Gg/B$Icd5JG8]*\#>E]q#;Pp*nbto%Ua*.NOcZ_VnCN\5AYn[qfV?e%Rl91$rd=jV\r%kF=n@1A(t?>^Xr-N8lMk<0%@M'CbE&O9G4_GZR5q:?LaRd&XR0[hJD.Nub[ElV)*An+St8&N%bpW)o,qYW&8klk`JuPZ`[i>;PQ>\r%mmQ!g6*=W"!c]@eTED<*Il.&lo9OQX$c.^]4tm+fV"5gs*WoMcEM\nWmB*$G)Y?n7Ze\R?q/RMk/Vc4UP0Io)!^f(s%.kdU*=p_3\r%q[m+>;2;AAX#Q>QAc0D10AD[?Nd!kP;RR*/<)4C]pMS2q#rB.C9E+&$2T5_n>i(G\'&*HuGAWuVT")H!BdWfe]]GT?F@FU2Uu1tI\r%Z`[tXS@OP/IiTLs@eFpk&mIE/N5TWUmbg=u,Oq,0e:2:=;/G"d`F&KX3&kHD#C>!gi2NF-_VhF73a=PMP<Mc?`&Z-;p4VDBU$jaX\r%ifr:kIt9c0dFX/cphOG,e#%lHF^6["TR1?>6#5oZQ8)YaR#sIS^Sot.H2kptqYA+Xp_;7gMrd81?0(QV<_LBjcosS195:6-hVX""\r%[gBcMH]cfac]VuKU;)!CVf7@q*O'0bJ]A7Mr]Kml7[%EUie_;\4n)K019uFsI@#O;fNfCi>:h's\$KaC$OVU@#2mB%JCtQ\YXFlG\r%pOhpPo@#;@]Oe3JD8GSj@R`r'29K*El`s!_PPJXqNZMnV-\h`/FdQ?13&"QlWMOt$+`?g[nY("<Ku7^IEc!_(5RXnU-Z7c%g?EEs\r%1EiFR[fflER&qrah*&qN36W.m5EdF(8^Dbm&08X+=Mf>!q7bRBZj&i$7pJj5*9!!Y3L,nm"aLmYNp30IdG;'*!I9qdB70)a;%Moo\r%UB2'=T+g>S92X'L\FN--UjICZDn/P^m;-c>\[t2I6hb%[1E@Z2k4+9*-@E5'NQfT%Gm@u'`3el#"Ypq8)^F]_TgHGNm`R=m1XQO;\r%4_7?!d)`A99__ADk]T(1ot?CL7Us#\]sj#b)N@tCH>Jbrj=pYX':PeAX#E+jIB#U]CEC.u[VKW*l"Mj5>_S:m@QHos3Yk?!M!5I:\r%qG.*PLiL:5P.bLU`D$&1]N<]&?ePhDmW![P2u.BZiRK_.BG2B=;7GJBYU2=bTl+lEVgVa10#<[`4jW?%@nL]NV_,_`)/;edhCsLu\r%gOLl(e?l(9Y!=QSh'Je5p%JhuJtq?1U?M)6f7c6$OfcN>UKpucAG--rl41S^2q9?i+V*)KLi&gqelnUVnmF%1Xkq_?1n^]FVJH4$\r%Y%:7FA-X[iR]^3+/VPobMlqR4Fc5uH_N\J$nnm$6?A5F--0,YBbANC1&R/1'_ed3=H!M3j2DqVG0'J8qdESS@S)6[#G+mW1l@!cq\r%m6PNO%*0-"UgAPX8oQldOA+=K."e?#gteg8)IH).N0K@M@3$=<$R?;XO4i6>30*4N*&KoNWV<(Siqm^7qPMEgp"s0u8[j[2pf4QE\r%?`p)fs(<'U8c"jAgg3bmP4nSl$F^E#aasCC>.;\JB*\(@.,D%d\HaVbRm`K?kUe+kRm`K?qJ'^V<P@DQ/j^7P!@8KI__C5."HZTG\r%b`a,8/#eJu.p>db:f?Q0-&e6>X/*TBY:,&U;,Tuk5_L^d;X)^k[AXE\WV#%EC/G^B;W7G"H;PDR;PDg->#^cP>!PY:UBJr#Wdp6>\r%ngd/UCV<`),`AAJ)Nq,%XLONZO>A)4?L'2Bn/GL1^%NOh&ufWhIoWdb+@ua#O!<eqhNA4,]0t"].@h&GHEFZPK%U82;&)o*)2&P^\r%;,sYFWU$B#qe_Dg/VWmC]%uA/bTs3]l*Q:c$P,gOrDR`-.bK;b&675CWgQDe[-7&Y)AYU%]3$@U*rXL;<cMHMOE)4'>(%ZG5DCcl\r%W.7XZ8JeEVkY\/';riR^RS)/h!H@jRs-L>&4$76bSZsk".YjIEpIcWeWj=[VFSkP(h[b^+da)+&Pj_p9#HQseme>h^Ag?o:kVNP?\r%His>`19`gcH4MC*S#uZ-DY<:[(9^6qbOsk<s8AVd(]C2q3@^NMGL7!qHY\BAqtE?aksgi"E\ESnUAHE_4^O2FpZm14G`ii(>C,d?\r%g&Q.Zcc\q(q(X=%i].,_dUKp'O-b55Il;VUgut+j45"K4jk`=>/%U5o#eQ]uh)f&R,?V3cc-O#V)tTbcA1hXLeX"Bj2lck-mm^'E\r%*,5ST,SK@jpmFNiO75$N[`UgQF6@u6AK-hoc1fNf(n8+fIE82>o)i2)Tm\OBZhT0B@F=mU5"*H5`H&`J<tCiL<6eur>27su++8X>\r%5IYV'*M@o;UN^8p>2.=kU:3o%BY%.pU/?iMQLq..9ca3+Y#@i%A)Y"j`+QsTaP!.u5H-@+>*EQn<8r2C-I#YU_rDW(1h/LT@I];M\r%Hgo>E*Xql<_D`:2/]598nBD,L/?IT!l*pX-nM@4mY:]Y^%,@`VSrp^1#bY'&#]5uggXa@*rU6OH=`6IKY%5/NZ*Ae9?MHBK0O24g\r%s&95olNXM2U$2Jm5=@"4h;h6%!A/)^U_/EAhe[VJd!3tl[2,"fPiD4CIV5H'a/e%Nn$?Sm+&soRa]YmF<b<obri[)550E-QKM2XA\r%m%'+s\^.XRZfnkPpWg)1>uQU/pWiVZcAn1X`S.3B`&ZS-Z*\L3Ve6_!lHYqU6f0g!mmrii1sJ'ZAd#>GgmVi-Um\GGc/SXnqR0P8\r%VV0YHTp%q'8eL0.q]tL+*'@osW&7LtW-?^l,^[#FK&FjlD_44l28*?IOP7X78kPREl;'IHcLoa^49WalU"UBn9$U]GGr!TX9BF\Z\r%>5hG6$q,hslnlDKdp:T%GN]qcI8gXY9>%P=ki;ekGndu;#1cZ%B?+huDF_pEWGK'K4*n^Ps"Np2EZEIArrB9ME3,qHHQ)t%_4'in\r%5l@6pGYcVdSWKSFab3%aQH"$Kq9nZhbqHj0WVsT1k(fF6)r377q92L3gsDMAY=732[WJDXd<"uHfCPmKC9iDBJ/u?RH59TIpb@Ef\r%oBY'JEK.\*^rH#%T=8;@FHMR^""V,,$5"AX46fQ5Cl]VEiSY$e*tPs3h2gb(Kt+GKNpKSuK,q`tFg^B'=3Z;L^p=>@NTo%&8LsS"\r%l3W*@1'B"Yis@O8``\n<6hVm$n$H_S`n6n;K/T?MCld2pNM13)9;Trkj\$&oEtTGUB4"Zu9+@2-4>!M/,'XY@^"-p50dnaKEmi[/\r%p<+NUidK#0`iP-V;!n]p<uJ)Q47JcDg2TAXW;[`\Ec1kni4=?>*tPJ-6&o',p#SVZWECY:rBW<pKa^1C;Qg<I4geKWY.3tcp,:LL\r%4&B-ObE,V@^/,m]%Q6CEWO+ci>_uWr8o66XnqM."mX-[tNHr_\EnO;ti:^$.H,0"q%L$HRFmP7FP#pj*;gaFS?Y%nETC+/]eD1b-\r%SVnBRo4)s`in6h5[$G7"3q?+m/0Fs8W["ZSj!f&)aG85q`J<h@V\($=\HtqcHa'K>oG/N&Rio(@e5^n3be#RF9b\[o8't+]Y_\@1\r%Ot$t]b2([ZD^'4\S4";)C]>&u:1^(UU8fW5>/5M5p%%9E?b<!C0@+$J"eA#9r^mK_W1s8)OQE4F:9LpJNAhM8"0_97ouY+!Qsg'!\r%.$7so\n[u>XOT%T(Hps9*OTrp06u&@"=abSR/%cM#P^7hD;"-H7K3p[V649<$a*lM(mqO^q-`WU'DP*QbQn#!!J-:nf@7]cZReiY\r%OOagO`U&gaqd>*do-r)ElYCcgX0ZS]mNCb4[T`M3ipg-"BSE^YIaBp'Qcs'Q4`9[=h/?Jq.;7C@lJCF4^GZIdVi0#p13?)gYKfVG\r%^PA4+P:EY9f!j:HUV-8#B`@gS(n^g"A[HH]dX:8U,O*s^I1Y$L`VGeh4_ohJ0Tq=8;*jqYBI"=VUGD3Yqq!26(n^:Z2eo0>Q*LQ;\r%1=t(0]m/k2e:&HN^\puT<$o8?LW:(RW(cCAirlC_;e7dL%2l7!<Dn3%<3SuBcTY^Xb2&tlmL/_>#h49XB0kVHUQaul,s03_Z4B$V\r%HM0(JFQH4B])ci5JJPAX?Q4D04Rdb+8r4gK@^nDa(2%r-nBOEToKIT9nA=oK\pIjMR1m;15k"_ucFb^p7'T+4qia=4)7'HXqrp#M\r%A'4#tqP`Pd-XlMVP4)r7H<q]OZfVnRa6UZ?k<a,I,A6NqQSO>^\h@Uq9JjE5FNm#A.<*%A"]ZWH%Po49'@4?1>Jur3[73f)Tp%'s\r%Xob03UfM\ZF;94rh_pkTInZn%a7k?[=iFA+A[I!(cOVbfOu=uBW%CRXBQGB6Kk:(%X_Z#WiD1!K]XX]USo2/DZoTTZ@5Aa2?Imh9\r%N;CRgQ1:;`J)2+'GngD(P5^9_irR77pA/SV9Ct$B!Bb3nXk>^cJB[VR)F*\.+t`Xo<po9<"6I8$gjrf9RdI>Wgc[f3^%4"QlC1TE\r%ZfG[Q-iCO:qr)0p4Sme5rcZOW26T"tbL-H3EnPu[=Tc?5j+`Pj3nu8Z2j,I\%J[7\e!];LBEI"NX=P?`5ss0N,$uTZ,3b$R0kC+I\r%6[7K([&'<]P%V$(r58d:^M@L>h2u7CpJ#ac'`&p?X!9e#&,l/opjXNPKZV-JKV%&Y=a7:nb\<N&57*O/K8KEGm$WEg"X`mX::cro\r%]ciZZXP_[\S'E*cdr4U<%A%uKrME5j6%3@$8b6g.FN[7_[g(QiFKj`?Btftt#PDsDUhC0)B.R_3?p`=SY?7F:5a\e`cl2+q?@4"<\r%bjPcLEIqna>g[8*4ZX&/qgh-TD[-lFLguTeDEWjY:m2@qL\"i)Lc?^fkE.GEOEr.n!C[ulKQF"HYi#rR-(I08*C.Ot8N??JJr$pK\r%A7jTO)EUOSl)dC`@VP&:MH]_a@7UCSA+sWD(\9V4m<KTlDpJL?%fFVt@W`P[JCb9;6/A?"F&+6TC]duJOaWNLFZ?P'SW=QIZ_Q9#\r%FsUc>fnama2I*YbO/gnp?%>m3F_Mb!TLYn36D=L&-WQo!\Y8+oP)F'PornSTJZG)qW7K'm58;DKfdZ4RKM,mQL6E4./goj(7.L[/\r%'D>FrN'Jm=*AS8=3c1SmGPmhV)>:4lJ_Fg+)UKVS!M<5qbmg[aom6,XKn,SK@rBZ@Bl=r+%!G%JXpk(WP8(fS?<]sE?EH2k1KsEq\r%\#2Z5/mSrVha2#ENsTVGS83%0^P-m5OeTMqc\Z"7MAD?b)%#d1&;6iH7cK*VGp/S\HbG5'CKiat.6]JDmnSd>bQsZo%6A"X%WT>Q\r%b.Z2>>:dL)>n>N+(N$Nu^$XaU&l5/4]*FbD^@2U=rSUbmYqP<sYRZ,in7O9l]oW""@:KhOhQtH:[3FH(jS^aF')+GS2%"m`#Qa6`\r%]9%-i5b)9oT+U:u#pArI.]q@@(&0=US6"u:*u1_PrpFCSbPBt=UpUqC5Ln53GImPE\2>W-CqNj]aLRX"j9KKnqF0(H1sGC0j-0b"\r%:\=&XT2]kj*V@PQI_+6-F9e5#ri!!l^WLhu5Pf%BBt:g1CDac*?E/:G5g%37oZ_0$Z$+pm_JL8.7bC9GH;c+L]In&dqMQfqpDu75\r%+^t,:JZDhXZrKG=<RNqW<W586>-AB(FiMfTC:l'B5b&O;%npt`JiG3L=Zp2N!Q9h\8+sbOSGa-=`0l$u.i4J812M;%!-8J54;2X$\r%^Wq7]@0ERt>fN&YkdI28%i*@6YJYMRdg`liT-m5\qro"ba%DE'm5`1o,h^"p_'9uRp!]%%af%.T;G4^Nl9cbYdgaBTNsF9jonWa(\r%bjq2@:QOg&n&p`Q!ENiB8Y6IP7WK-LQJMeiYI;*O(+9PV"'anFT50C-Us&9O3Ji`XP-ZTD?t3^lo6#+mlro1bCG?R?oN`mKa[lVU\r%U8Lm/P*:]2RJ&'96#mThS1r22%*;'DEZ3FS0h>%`O;!$YEC`hKOAkVX'85El!]d/[?O2gY#ip*o?19!tM*OgGYKqg]I(X4D7Ah+r\r%Z9TZ_&]eZ[%#%RR>C`5MI7cmQ-T\50VN_0R?l+RY,aN8t8R^#H-"JrC%eP<r84(J>1W;DHZOhiO,Q]ucX,m6Xk/;AgN%PEXI]\+(\r%XP=W?S%(J94a'ThLi<fp',WeYai**tJ[':CTfO-%6i+0mo,.t#X`0l^.e4'eA@(Ym_e\>-<4;/K>Uq=;c,6CJXlYnpb[fAhGMUR_\r%mA#QLh,@4JhkZ@`N"@Z]NZBLZIPE2&bi6#=naThFI'uX>S/Z-7jb3kV)?qn`]Qb:B)5QAc7u1EE[>@(7Xc\$:ri8*W%FIfWr>$t'\r%d5L,K%S7ga^.39,Sg9LdjK=ctdo0P1C0K5c_/^RGe,YYL$?HZGo2B;.3a"k,*-(6P3`T:[MqMa$Z/R"RSP?;uICe'@[[=:3"S\;<\r%Y*%=XZ&bl<<k^+GG4)\"m_!JIE_!aVGdUetR4Zta\s2&u]6ia8]\m6EdD%f'*drO=^SsbGTpC]i[$qH5FDmCn%\LATQh7oaW7:Hb\r%dJo!`#I?@bNk:fK$l$HSl;-`JZhurQL]msAgV77g(\A&L+(P&iS2!)mG=QsuC"H:KcLAPkAH."$_Q;DF:VA@)?r'6'_SYR&-Ks)0\r%]NQKgPlV*:A*^9]X.op`#90<&Q^?aE`kbsn)]&a@d&:l.=m1]kDM\j4I)4@AfaHsp=8Cd63cu4I+kJE^;27(K>G%`/HE"YYiK7?I\r%4=oZ>^bRs[5Bdq-jVODW8pB'c--IV`n<!eH#f">#ph5&p]jp[A^5CrF&,0%ARr;d0/R"O'$qNb?_=ENGPPsotWg[gC5ODdf4[.4O\r%:(SW+2c/]-0I9q@L@!7_DsM,A4).a&STXR+DG&1@X31sb#iXIGqDNfGkp)C*$*.7U$+09<<AmfDNe7hGBU\g1'M4Y$Js3*Thq#(*\r%B1k)NSOg_KoX)+W?[.'!#F#e+TLB$1$`s/V5RAai%.jb^`3s<OpGJsZ^r74_\)Ap@C<ZlL]tRa;]ubqj(n8L"9P=u[6B5W0IXY^V\r%hS_]?8J^,nl/i]F;pPIH]a&NLZaS55o!c=`p:("*X?0VsDrh>iQbE7,OQMu@ir*T;JFHr@Qkd1>T/L+.cMb,W_'!d/3Kpf;_>VgJ\r%GN9ae:`XUeC87is]139#nnqSueV1\N;+Sl>'ReG@$**4UP\qBDSC=19o^pS))U%aKX[8UH9h?dD9p1>6#\mFhb%jYH?^7,AKV!Tc\r%q3^TF](ZVZ)F`j7O4m3@oV<%N&7A;U)2/XkM";l>Ip[#-Ll/L1/bS[9/ioO]2Ne_#[$s/C7U:5<0'FlZn..LphrnpEM"]Q);I[49\r%BMPV$ReSLVCG'%,[rN%`A%2R'<LusPA/?1TbHVG"%$-k_cR2As6["cF\j22#i!W0%FT4:Kon$DpFQ8A%Fb)&\&?!?)3A)@(I=)sh\r%8]N2up8oR[`fZ*LZRA"pG/<E,pg>HOD0M$pp:oHe^\N`[WdQ0OZbs%l[G?+!FT9XtU&H-\?b2Q7[RBuq]Yd&")bHgs>p/c&Jma@)\r%.uK2khfjS+B>7G&J^=Nn+B`@GF4[&_mA5u!bW2_=</hg(.(R1(Sh]-[EGLf^HM\F4huNat?;B-[F&1)32fQgp-/\1OKjZm0C*dai\r%n9<]/lMEdCPkojq<=TP9q`F%HeMr.-*F>dJ.No`P8Mq2,-)G.i,H6DWBgOJ4H&68AX+.e%]Mbb<(%meZd%Q"M#d1NS8AdU!#GrpQ\r%C":JKPatL'R4B9b@9[:sbePSZ_E*_SQ8pUU(l.DPL'hE`L$_Y4pkHlW;8P:$HOiKd_gFi!MeRtkjS4H6ZSoL#LF[QQNTaDu.sD3(\r%ee?3fJ2!KceVllgHpb]7WYpTWq1^0+csTK%@D3me922;5*L]har;!NEKN'/F.+h+AFjAbA:k,>2,q%2aGm'-kTAlj*fJ,$\%.D3Q\r%9fs1R3;kpl?!ojiV2W#("IVZ)0'GA0F^@r7RV?)km\es2b*FVj8&INH0%Rr]S+QZ1,+C;aJMU9Lm1ceW<$!aZF,!8?hBR&u,G^d4\r%XZ=h'qfTqW<FieW(.+iu%^00%WRo6lf7ZejHM6dG!'Vb4Cr/CcWKJ4R.lO]!k<E6i`48[R^n@OZLiZX6KP.A@.eg]9pnI;-0QH?,\r%pJ)dabu!b9*;*1lK9i\PI;O8Q8S_[.n58]iB$Fr#m?)a#qY_'1+'6FkrGmrs0@))RnBSL5*(biCV&3?fWG1kAoI[_<a9:\>Sm6N`\r%>-`qHXGL(>Z1)p;`Pu?+rqiM!c%S-^?`X=CH(N\eGZ:m8-o\P]B?-sN[)pkOYiktP9&"#J2;G@AaaH&B)0Q68D-LpU$(#Wh=7fQP\r%j!e5&K46a6H7gF_S-5]+eroa2)-JT2`ZRtE(9gT)VXh41+B8]m8uL!)=/'#pT$&Od#dcuflKU$+NYh^/.[jK$;9EK5L!'`mr3u_q\r%<?7>u0iQ#&4GCsl0WQ#Na&9u3K)AhI@lR]^1dV*Xk'XE>;c!=GP&tR[6dCrT+?X`.nP!hi)'o,W>D,IDitEi##kmC3_"FlkSW20J\r%W!_QN;3)go56ftMDtlcq3p$eaM[ZP9B&]eSSQ/)C?2L<5>K4cOQO/CRgk-IRRD@,W$:R#KE#i>tWE9`k.C']7_=&VBMPILtlLFrT\r%;8j8/Y:&6a<,,]/BO/2fH4DaeE38DafbQQL#+629Q=WtQDV[*gq1ACU)/@g)!.$G\ZU3!p6.LD5+4H/J-q3@P0r,Wc;.;`s\dBDS\r%a390Fh0l-EAHoKl'?]F*b?"T=#:G`D,KEIU%&q=1OlXg'<I9H]Ogdf(5!Z!$a,H&KGKh#p3gsTVH,;`s,RJc!^TSQjWCLmJ)cqsT\r%e>"thGuop]e>"tUm\f#Pr2(OK+gOp-oia5!6XHBgr2(OK)9f+:P=O%J=6m.\S?2Fu[;/JUY5HJ")B_,+b`0XgIBP`4rE="1M\p_4\r%[3$cc0cFg#PF5\1,Fu<iMpda5Hb#=f`A!1[PH2En@n&M?%Wg)EmNa8WX(>),k>'/prmDE%m>LeJUlL:^;deAF3+cQ.epqpbS`RAF\r%Ug$YAHW!"NP%[1^A5B5g:(!LtFmM]mge!;RGM/0=aBILYlq\iDpqp=8fE.,qM_S"[Yl@7HK3>\t"WnJL:P83J6S_3=CCF_a$2;2!\r%XCfb4:b0FZ8oQc#Ql1\4=OVOj%:=lIf'.SOX/M:_nPK7J!p=Oo$&IdLIpnq4:Z*NOQ,:83k4&@iCIRFBTo'i\+O22O1/Y3_MeL"R\r%*4pj$W+iHFm7l7KjiVW-`HDW1JE5EmL**q310$[m-O->F_.LD\d.Xo,/bNt->Ks>$[I%h1&L$'*f)+#0p8o[IkmI;G(u5O!7FZ+1\r%&0@nWN69%c9#4]&cDWkLVd/eW:17-$Xsnr\=fn][H;,!6"g(Bs7(oH'pe'):,3h$S<c`LcW/@P*'Yu51C/m^PCPqI.*<*)jU0^d:\r%?p9uP8WAUoOi(-jn1U]$.2?TTL`(G;WZp`oE/M'Q:9)2T6a_/aTh8<Q]r$VE,SbU$FgsYeO`,.P?t9^Sk!lhQDKRp1D-jcQM#'.P\r%C>GCN'[eo%5G8Q7A?Lq6N3,oT7$oj):/s]qVT?Me3qb4q,1>7]jf0Ni2+7pcor95$2+;I3+*0knRNdPoeZ+M*f+_@V8k2n3P_(F8\r%\3%F)VGpL4E.k6IH;0OH\^ei%7FZ%/TUZ;A0bo9a8'6Z"Y-i:9OX&sU0HO.9-uu,RLfbPJC,Pil(]28(`N3+:K@#(L?!4;q4]Vmm\r%7?htqD/CB=>+\?,<'YJg'LLAbNbe@XGFG9.P,"DVf_\rM/r?-p"g(Np"P$5-.uF3?Sup1m#WZ!-94G3L/Xi$EFH.s)j[<K^oIYpu\r%2E*pkOr,X(@@)tV,r&:/6aj,",r&:/,8%#K,r#IYd-kn;`11RSTIH->3B4kE4Ct5`(Mk/dJ_tcGPFB=h\9m[t-FM`DfZe9"XQB>k\r%!KQpJ@S\ii7I^o=XooO40/=_<mE1Q99cju[$)a_!F-ac@g#]*lLJO<3RY7:CfY'$a]-8F(XseKWb`<d-&V3JmS>';2h(:"W%qmG^\r%B4FYCn?@_)_!Ckd7c\(l&^jn^RuE0p<"Y8SXL-m:r03L&iOo*:<-E:T);=.YS'';db$mB?qPGueC:VVa@iP$YFDDeI4a%h4n@.u0\r%`g#^fc/LET4`SWOTPV8(B3OUMdo$[!IEo4N;l1^9P*n+Sm$-ao6HPZ)Lb]^i6Pi\L6Y8"o;%cgP2akEaQ>sEiDeSn6jVo]"[p3Pc\r%b4#kL^?P?ABq3>Q0k+=Q!RmMF+UZ*bUBXDU3?uCsC&`+fcg_+7J"Mb'`IMY+S1>$_=&d,(-OcB^]4a5W6+/V[;h*2+^bi&KDN't6\r%A\b[hXPdZ\4CD@>:mK_(WWl-e*Y0cO&2di)1dKV+5Y@ZW+9^'Mlu2Yflh3'o.dTnN42$%n7PCps"RI/76#^#Y;T_FIF[GV,_&PPg\r%GtYhZm>]pJVSeWC3@J+'<mhlke`KdVccaBG@I3r9:en*%9<(@HQ$2d7l*83&.\L6^5gXH'.BML->SY,%Z[9JdhmJ>"MB.jd#OH!W\r%'K[SR%T4%l?En!UW\a3S[%6M62q?Sh<f"!pcZPPCl>//LkhVGK0mm!/.tdXg0mm!/X-MdJ.u(7-FsZdpm1mOBBiDW!Qqu,j:g1ID\r%cHEJ]*(k!JYV*tQiN&ta&cUEK1&P7bmGuudW7nV$1$r^W[>eq/-5%>GCKF/_p3gEF_A)-2CKIId-SNlPI8it@?(J,+Vkj6#0HV`u\r%01k+QB]gS1>fVZZX/]J(47k.ieZK>C,K9.PiPBAAThk&J5d*\6iN&ta$+&$?&AqRL]7QT$S/Au?g6J&mO_NunBiqt[ns7%KiR]'m\r%;U7'!Mao3lWifVFeA1)\0<F9.!;=GIhD]>2LWAJg>6QSQ/uj'`Kjr&:HMsE:Q91,7Ua"TYB9:NSTj!KqoO0Xdq2VL(@'*d5mWsC6\r%jf^(>^d@.1NcpnoltuhSQ"IRE6b(ZI!K5/:<N1VS^48ZCr$ljYeJGIZ]Vs5o?`gl=!Z(W)[Ao&J$Wn6OW)Z:A:r.@r'bmnGBAg0K\r%?kMdJ%<OB9(U,/9G+*<gi<#=,[p1Flku,=64T@kW9:#\qZICd)=Lo3NaOsoR@Hg\*'(TP1.G=`-^f!:Yl_FRtm'0J81\M,ep`sWG\r%lH#kpAgf'8Tf1Ci#tpTdeu:C=Z2tg(`]$Llb5rHl<p^5rWiL&.'sNe!U+=nlN%PTUG\^6n69B@b7&GP;(=pG7PoR.[?l@0m,qN=/\r%=NAWT='ra@3k>$m!g\@C2&EN)046qjGp2Ho"eRT>m&0dcXRundEXIWV'X2O^HB2sTn$DRhZO#+h=>;.53Mh60k@M,m+^`$*RfL_K\r%Jj3h7E`:gN\a?3ep0A7_gihiqC/+I_;5&HFmjce#-Q.7h^!e:8Vfj@k$@Ajb0%T>f6;/la.fWM<Q`jHteLUT5<uWW%]%*qlAuU*1\r%eV($O'e6(XYH[@%]i!r^'CW[o3r9]sU[+e@1V,U?dHLS.%ZScuA^T`8=GXIq%`^ch)WAVSpj[SaL%W9,`m"kcfa;oUI*IQ0Z:5Xo\r%/fU@>^bu*BCNSFd@d?7ba0WY%gjW=E#p9F*i4`jeLFWd$Tm\M]X06qjY;4$+V_1H8*Hp$<U=50'qd31"@R6fcG,02=:-H7d<E8o)\r%B!nD;n[nua5\f!5"\Nli83Dmj)'d@o>"o_F48L)42ON)H3n<38?8ggm:f+5q.:=sS5sa6#k-OJe-;(KPU5NN3Sb!eNh49UUri)LX\r%AL:$R:?^W%"a9HJZDl$C?M\W#D7bY54Au]c%l[R>lTmCl4uAX,,IpJ?dYHRirudK2&#C%@2(JA_e)chXi2]r:d%$pZX1kjV;ELP(\r%T/8V?_US_T2H)`%1)@$t4i9q)3mWr;fhdQ[2fQ3u$46VTX-j<l@k4Oir3N81/!IbM0"aIdiP7%!2de!XfFq!S8pV^O0,U!J'e4Q?\r%-<L^iSEZ@.6@3/gnB7-dBq7*bhWfc2HW#::N#@N^$K>@N(UB`\6]pfgRU,(_WdsA(9t)69LrKm9%HS6&i7)eX]Z9HiEp[J*M6QsT\r%MZrb<2@!uU20-U?S0Li5oJ=+4TY$b)pd$+.1V8T[qQSd)9'23i:Npe3QK<M24L=7RgF,T7JfcbRk!dQgAs6X[c<Qc>Y11!K6tBQJ\r%1V99C9AgmH"BQ6/`8rh_og*3tKK^Y&loqD0gYkb'Y7H16rTRWmYZQ\f!E-PM@:UUIi39(@PA2_-'A:$?5>EM%gED,S/Fmt@cnrpd\r%hiIGI<f6/mb$>P;Z%hB1*_XC\TjAr'.,[./^dbg'(u37UK_9D^B\/0s#Iea72icjf.irM^c@oB';1+s->rM">*Peh'\kJhi&`oRK\r%%)Na7b]`@h_'n;O+Mo(,70f$QX5oRj5.e"\[$+oiVqX!nQdD?M&N4"[Y*e@!NT;o^0;eKB*gh&D@N4c]%U02gMhg,j-\TFuAaOJL\r%(Amht<%,a+Y,<s9Ei6UiR8e\tpKCCm]6;GR(?@H=bF9-kW0D>mpl*-H=I6]r5sq!CV4bHg'Rk02G*b$p=AFcG\t>pA[V8X"*auWU\r%Mb2:^g/2@#2/0P"W@3O7U>U:t)tM$]V!94sHa#92Z$=d><X_fYOL5F-rRrQ8OAMX\.A$D^)XEme#e&QpcBrGY/+`CcN:,509DI')\r%'qrAu:]7X:8I&<bAs_c9gZTG9kGZ-7L0nIf9@pA7-8/EW%Z`X*8)i/-^GEuR!3Bo\MH878#.t$B]Nk.Jb[=MO$q<<mSGL[i8)d?m\r%`SKj6iTtKH3-O)5)j^$Cm&0D=o..EHA`Xg,IC9P7e77aWH]5'%]=M5`Z35+UB)T<&,moFDXBudL7,\]a#Bs13=*%%o7@ju[4@)6>\r%%#:kE/Vtj[]2l4ILIIepP^$C#Z8j?(j?A8E^SMD4S&j'@1jO^7Of'F<ncD9]/FmnY`"Sjj>t7s/R_4aFf5YmYTue7tVi@iY7[&Tj\r%VFKY28;X7^b/QLe:IijoJ!lJ1]n)3>aW&I(7%WHbSlQ0+rA==W1l$S&i@1VFP8U@B7@oNuUC?EUSrT%[,)EF+;(D-Y,Yak49B@?n\r%8(-Jmcf.&M.ji[)QgB_G)Q+=S:=_M::W^<jVTE>-:PHm=OYh@5+$6V"WIuU::abgU,Y`_lInWid:U.j%_5r/8YDafX5iN*E5#&>.\r%LN@_B'Cs(XhQIPfLlp:XSt8s,V,Sr76rZ%.M``"/nV!o:7pJof`"Q7%2'Pgd1??DF8Nj^a"g26=Ne:E5,b>,jBZ2/k7l'.T@s=Ha\r%OLI^Z:6sCIZK-IsV^#mfg['qFBFtRgne`gT&:$="+V0B)NQBS2%/D3-5bZ9JOUQMfq(P<F)hpHt5(/2YMWe&p=g;>pkt$QAOLn=?\r%noQ-E*qkt]iVnu`O-,S4Of&p]?Cf"JH=Ra7:Id2$\(%cA^aa@q7Bb?aP9DT(AAo`g8!7L[S,]4I+]#BNb!hn^AB;s=9%,CP?S^[s\r%JlNubF<j3p^5EnlV^!)M#NkS"7m>#`"39X7H-D;K&:$="+]#>p+d"/)(2hk!AP=+RaBt>Ff<09Hn%T80m#cO]]k7Wl?%sM00UMma\r%`-Ej4qS=QkGuATM\a(-W#Dr"_c_NKPcu)c7+@D?R;o;otV19nR*(:Sd:Iijo='>aL7%TF7aW&I(7%TF7amYj`.kC14,Y]=-Z`"F\\r%g..@1)P);#%=.J@Om)d"\MlPc_'FKhg0dB"Hki(>4oGMXf!s<-:r]%F\inTQKeAV[24Z6<.H:Qo^o>gNb]XBWTS668);fb>asc:c\r%9!)=ej$c>Xpb/\O&S5549i+M$^H*"[_!3Fcrd@XI2j13[U#jn7DBr:@,$g_-er=WJApFb"&G656(sF%(XrB`PgM4Mj=D3kb3*BDK\r%h_r=?:o#V@BBo]<#RE6Q+>>sCQ&nA=VdtIsO*e3DoW_CO@a,!jJK!?H^&'LC^r/^6;JF@tp\isW."PrUqXi2F^<Ete^6$CDc4JG+\r%dpP&l\%^b1dZW#7Je>q2l:ON9op1,^3C0uP.@`,[IlDmj&9M:UfnAH#^1l`t&j'fKFDjWI)l2FM;'dcRjo#af?^[=[C!fFcY>I8Z\r%R0b*9oc@uf63AJj)3O&Oki$TPIkNU*N>F3UW1od@0bqtGc;g'j)+n#b6h\4.5D5B3bq0+_B$=Zg2r42CYKDZ>OrTYT6<*rm*FIRH\r%np!b*MK7=dFkOF%$smDREhhW^A=?Y'*,CMU=48>Tl/'Lt$2Y"Tfsm<FZY"-Ip^6*J=-f(S&MLsq5#)en'jb(t1"E#.Wpl02:L$1q\r%1%VnG'\!FIXU]ls;NiV$[8r'63I0TiWgt,4Nf(Q">tprD2=KUGE#Z0spRh3F2_B;Ig/Y'3C/Y\)Bj@3lX%`mV+181FmFJ04/YQXM\r%%g%sa(VDJ^X&FBApGK*KD.,=`h9MOaL8r,UP_3IRl!4/Y(X*Yi$goU8htju2FgE&H06W`FpY.P#:%I&`OYf:cK0=OHUE%O>2$K1t\r%/XkR[d='e$a2?e6JnrQ@fQ"5;Q,5CHI)jQR<!q6qfn'iEqmH*.r/?(LaE$6-%UtuM&++b&#?a^q0lf$>nMH[VRDsLD/4ZP(%6K9)\r%TB3!cZYa,]XdUfM0H7$+*C%_E.ErC64iblh<(ca\duer=c0t.\<-:%4LV9&amrJ=Wa$V\uKF;cpL4!unhJ!@<!2Q%Ul*$@WR7"Sh\r%S,mA,9h&QP'p:dsj2\WtFr@phP%#'k@DEbo4$TY?mKh"URMX]s\VL!1/'cZt)iVS#]c+G_V0eP?pj4n$+QeAh/X(2r]:\"D/?XR9\r%lO4C7T4<;n'C9j>Z&1qONc0.81&t<[ET;?hrt"VB3WkHM@s_4-Z273GTImS\T;h!m/.#^c8M.o'_hfS)NtP/%kU&g]HQ?Dns)2a,\r%O$;r2K`AN*d^N9E<MCi$hDIN/aQ"'9Df)MUQ9u_&!7s!g?hm.CYRdj8s4hB&K&B8A)jL`YDtXl;\G&ZY(?nEXUuZ0U;fW`P@*B6q\r%d?q=Fdrb>`o!S*4Ft\^PO@Id`r3"^#5cQ8QM,>s82+6VONoVVZ;GFl154QS!KR;S&#Pi,h;_ud[Aj:s?i<.n%p9.J,p<&Fc.8&N`\r%O=6(akuo3O\F#)A^[O-Wa/M2`q2LDm47NPV^9r!<7H%lak3\<R4go_gc)7'[mW-cuJq8Dn"t*"A7HtNsB;X)2<:;X/k,O'\+>Ni!\r%\sF'>=Sp-!KX=GeD"hP*qg>A&<]gpdipuBP:<IV#JuIu_D$tRl9T"hg_o,dLofLt]=a[9EA.J>/lSI/"KVO3mHrJ_3c<>)J>4*$>\r%dW7"+:459MV4U?@R'b7PZO3`Dp=tJS"CLM2rMT*BCYI?h\.CV8i2j`F<pr-WGAoMT[gdKW`TQ)&BD<6\@1,1%Ug&t`R@"HtFSrg-\r%X!([XEFj/i$7rYfgPe\D,36tDB=t2YgL)k:2f)C`iSpZL]molWIG"+H8t)tX5HaeUUi0U(*;@_@dW]?bT>ZYA0/-B`>5pqf0,092\r%\Aa5iQ^bnj-:$4]q1FnJ&4(Kn@]q@F+,tlUjF=t^36i2(/I$RYUL,IJU\0n\jkBCXifqC(X?3!u$&*UXD17Mtgo`7hj$mt[1>K)O\r%XMmTphY73mM6;c*OD$I$)o%8@;^V63Mdf'*QGiR$FqYcGWn;]+aRc!Hc*pY9)o7!&^L*l\g!iu//;`b=%?Z@Q\q&/Le]ib[[V)9G\r%IJp%'2h7TGF74C[o!GbSbA0=e#BSNn0b`LDg]tPYr9_C3jKXg;n7/r0-[Frf<e6Zo\3SS,DMRe>IOcH9a](k*FJWH0i3(n5;R.#4\r%8.(rCkneg^[9BDpk^P-E`3/l"`Xcmc=)2=1^2W%jH/"`tWdZtK\Y=[M4.KKaEt`tVi:t4D`72J[+9'22Ka<Gk?3Z)4+3PA]kpP(W\r%E2b-,1Q?C.LJ]0DjQA!a0OU@)PUPauhcAm:BlH`LfebhR8s3RL6='.0aKfW=@P[(8,<6hF(l9hI._#&R\ouuU[$]N+Mt[Z(B,8eJ\r%B1OO.q,spa%S_P=Ndi>M.<9ca3;L55Qno8V&/D"DUe@CN"@DnWoB_2_12b`[Ib;*8X+,:]8qN-^b$*3VK<;hc4&P1imM*Ws/lQK=\r%0_W"fBur#i"[.+D(O<eVk#6N,V<lH2r&aL6jn&1@NPDFd)<&'Kq9oaQbLdUO7\DR_?O\(5ng-[Do3!c>k,-JnbCA5B8$Qjr1uY-q\r%:\',D=0BIbjN.NmeodYX'VF%td>_ciHbg%I^/F[ecc_&Wh,Y\8&3;RUjBQK*DSg@@)`K58a<1-:d_aY\>760_m7[@he4`Mn/1pDC\r%Dim,=^DGoA+gdjgLVo/hro1fLP%5;U2t"#8i+.KBa,IX_4StBYp*#I//p1#!g9s#cPHtB#&I:d"1<*hlc$jH5O#ljcb7V?Xr[p%M\r%H5^%BR[%h>$U=58hUrrdWNX=IO3ckpN7Pp<L=Jqd'X*=e/\$c7GQ,CUB>e*%B+Q!:g&5H*YPkR%nb/(0=WC3S4lJAb)Tu-pm!YBW\r%[]nK47V;HnkNiYY:)D*<a=WeZr2U95bU4]CCf)E]*/js\o$Dn]crU>eYc?`)oFUhCkjut!rp&(SeYb2.M6\fsg>Uh3WsS=KE8"Q@\r%Y^teHnZQ'PO$0(Wn@@<c?e-_/I+V&oS*sp-mL,5G5>\b@7pI:l)$?TrHNElcS(;khX*W[(.*M^1RCp.Soc-OiB*p9OMK_;CSKE%O\r%5N^?H^Ftm(O:+TV,Y$fi<Kjob<pl/BT52fu@H-j<>/4<j3gSsEC4h.c5)36Q4Hn>GE9.Dupu-#f%9DNB]_SlfFk&"\n=h`hkVbbK\r%#gY$@^bjks#S!9s8YZ6-p+7=-06`_,.:;f_PC0?_0ku<dLHd5F:7ApqK4+>B3*n;d.Gr-dXlo5r7-VCQI/Ai+0B\%7,lKR5=9nr[\r%.QP+AbU@(=NE+V.fs1[rK\S3"UGe,>f*]$oAgpekj@OKcheqt/f`e#\HhmKP;1nV#V>h4%"5a'&lAOor]CJ*&:Hnd<15$&W/k=C8\r%O25K*HT5gMs3I58ln@4N+7oL8s5W(@PI[2*b]a#-0`6tcj1oMhs4H(=J/nE\[(XIunZP@$-K]RS%>KU'o>_Uu8"Q_*j-8uEmrr/(\r%EHO]`kmdT!#\\jM1u=NCq#6:CHDsqS=H@gk%c3E2*$P;6I9l#@T+P;[m.j82)hi6UQ;&UI^<YUXji@Z5FKaL?.45s#`4Au$&GUo1\r%S+uD\rUatQi&KnThhaeE=XpjN%a&-c,YQ(GU3UNl<k,Hn4hH\I7!sNWE>[QN>lig#br%Toosq)=A57C]@8>9)O)d,FV7tm5='7/&\r%'f>M:-U>[hRCW#+i\;8IZgX30RUqJ2o\0F`XZ?<%Y0hXa/-FJRK>MM12=YKGr7Zck^#nAW*b<pccNfA-nhF']HcsOI)8)(c:/1EZ\r%$ps3oq-,`,MR/l#?1B/.RGP:m\?+<7PGoE,aqe[BUMIFV_g*68-hEpYG$hp/?^u?'9=qt>C5/>rc3W!'6Z8H#B^($nh>H`H&B+Dm\r%jelp:n;md3pJrT7AV0_iR9R:r[t8Q;F,VV7m99"]A1;tGg_):K%3*dIb(U%qjC>,r]'YC[=pRMiehmCflDFCfj7P0!i4Xl9$jLTL\r%ggfZ5nDj(PGP*Om/1/NSR\j'ACVNK+\i4+#Nd%1:q^HCZm*Yqc*pm8-');iT1hCOl,O>,.4a^]Jc\a`Oen8GQ(tcYI[d=VAeJX/i\r%h0Ca@YmQSKqb<(l,Hrek8,KtN[$F=#e_$h5g]@lHE`L:8mV6_>"g>RS>5jJg@m1`]*9njp_,p7gQ?OO(j'M]6Sr#sQ:?d49QRVO;\r%kn*AG=e!KT\utaOb4NP'DahTIQiO:<H!_PY]l@M2dRQ@[Y6S.@EKTa2?DhbP8?RTE4h/=@oHWQnk/lRLrWui*aY#_]i%ig(P(-s%\r%$pX5?*YPTnS"4](^5sr&)+i_sotF&JPS2IBr_2)U&:T>h%`ToRi=OU2MP61s3Vo)BjZQGN)->7WLJPb(qqi4a3Bm3:I_K.g>\:Bs\r%1h<OlJa7RLDZo"Ol36Rlb?1H?WC0:=B&mst=2$=dN'(6WM/9l_n`s_Zc;ePX6?"UJ)bY#(N2Ja)dk+V&Dog=2($Y2/"]4[[54Qek\r%qfhERn6WkDYajcEn^%B)(J=u%`E1[bD9#C+)ugqerX?grgY'i=:Rak"M,P\"H[8obp.t*t2X=eVVRDcj(P&pZlNQ5=_[U56cg_ZO\r%dW"81Vl>u[FT'3gPQ='kh/Q4sC67]BU>QSm56`S"LBWr4D%2kM9A4OT,?TbD7F^<o2Los6g0C\MY$)&B2cd;r.;&T<DC^'4g6s,Q\r%\`^HeIb$g?3c'n*^0IG55nrG_"1Ul;5N`c/d$\tk;(nl!:aj"6s5[h]Y7QUN8*"GV-::<D<:BDhWMeG-Pt5[^\L`>LBjSmWOFgii\r%4`(H?<iH%`YA^WT?4lfYhhI22SKe$&R(h[b7F>F()fsb&.9LVrpIM#-8A?:Tpkt;7JOb=C)8=ZGS@`C(J1!Yt+`A.D_?X0Da#E/h\r%<!]c;JgiCfK;fqS38`OK7.Qju,dRSn/+QKQOGWi/dClMRIK9E/rL9*;R!=$0?>htO60-/X9Ajg5Zu.f_Ub29Flqcg5IPqk!G$JB]\r%r9H*9]OkU'NBSo=`987mMfP>=kp`E/h8mbcSlHi-hdU6UmQ<.M1#W%c?7I"FK0OQ^.\9p0`*I@Go=rc3d9/2o)YdT1K?Md9pUsOq\r%Be4aWBAFd$(`e\%"h(&1EI:-rkUO!o7XOsVL2A>aCegthd"\XLAWJ^-p;o.+FFVd]KO0ponh-*#`f+C:lPTT-@&e_LnJi(a!]1s<\r%s$fGoQ6j50X&/-(?l"\%I*dXuq(?&roUi0Ti^`h_k@G_^i9cper*ii"LNtM(p?rqO2:_bk=hbaUWXJ4'GM^q(l+22I-f1D[>N'%F\r%fF0"(cQIs8fd.eV$/^r!EB`L^8Qh30&)^QhkeafoCd86]:\?i6:Fu2m8<T:/rK.Uh&0hLnHRA.UKtqu(\:RK2Eh?U3ATFTXhH<)B\r%2&^tcn5/CJ@<Xk?O==<$/gT>/rt1-A*ENJ/m3'q8%shIO0pkB+QB-eB4&[[9fp9Y`,K_rH-INeYj%,d^V<jc90gof:T@D\9DHUO^\r%XWqmLI.]Nd&,Ne>.h:p>O\V3HW=OpoD<jE%51]q%cBpBV+CFPVg,AMGpgJBo9@V0Aa$u($EIYcnZ1kNB$'X1^4u#4t8Gg7Umo*it\r%1n.m%[O*,2HnmFN>/Xc7UZpBk:dPi^]j/%rmH91bb?>>]C!9/>@b$CcO>:F2VQb;c[PDHd^dFQ7269\iP92q'BX#%n<J)-6DZV?2\r%/:OF#rgsQPgpN!/;-5J91;u-uJ-Q.48-ZM\^/>`Ve(1Sg`*4YV(<juJC$B-?l.HgHFC]?O?-(:p^cs`E('"+#\[)qACFp3Qc3cQE\r%%p8f'XGV41o)2th?bbFCM>(E(0(*G1Bg_k[s$l9u4j)Dm76d*sF*+9=8;Z?\VHsj.``$hfH3+Y=e?8T=_onN7%$OeOfP92Y/W8E0\r%'#[pDLke5i8<],l3l]+rN:S:b_)3^91ll,'.ppRZ45m"dpg[itTD6hL]Q3((/71I']uF3XS?8`9kmC`Wc=T60V(6fP!Y=IiQ`f83\r%Mm\^H?FodO0nBq5o(2b&egh!tHKn.)nB,=,8IiK,ki0_if:`jWJUXJX'#T9qUZ7;]0aP$hMN-$^HZ)3C\)_IU6)kKdiV]e;5,`5b\r%$X$UI$W6lr0t)'L8ejZ>+#OD^_]ra@8SZb3G=8lJD(o=HjT'*.=Y.i&S&Z^(9Rr5clIUh96M?@$7g'GKKemg0rFL:W4roHZ&RnLp\r%kF-k#H-)/N;;c[n?9u3)CS]quIrFG2\`AJ-Ic]48B5r?=&?&t4(t#'Wr5#3j$L+&mUhZ6A6kKS[T6L,n$96:r^Smu%8E#B,ptSd:\r%6b5YOFMFEg0I]LO$ZVu]6>)IP./(J^Za#uhM,7-!5G$3)[Hc22GL5G7V:S!o`S5gh>\9\Los.2CjOXU?$+mgr)kcgnKjq\2U+45"\r%SU;@l[-cK^L,5^5;>3#Um/F^WOf8qJ2*4\#!$^A1rcT(L_OnIg_!6U=FR%i=-hf@^\NB`*j[eo!QF9nh`l&JjU%criX`4[L2n>Ao\r%1fD"V0.p>@-KQM-@JK1K_HL-F+snf[$p_6H&sI+rr;rK*I@]n+`G=:#.GFac%h5$F\IWHATFDi0Wn2I24,HJl9P<9Ll'Eenk/cR^\r%9n?!YO.D?(j9R:IJE&aPq.XZ;(NCY8P&CLPWC"5'/':PPjOd&OR><mHc]rm>PnmiZ>dTK2]ofd/CK6Cno>A"h&K1T5GJEuA"6X5c\r%+]jam\R%op/U7cl>t1V4-rg>d<O$*R*VO504b`ohGc^?YJr[Ae)f'h+JBNIulC2C"V++(.M-A4(5/Bc=0N!(]'9/4X'.%TB:GPiF\r%9U#d`;^07Eh-9E]7*cfi=K'Cs*7M^R.E>odT`AVsh6GW0g'hR&O2]sC6)s!L*=KI1Bnnj8?B_-?9q*0D7:^(5nJSF)L<!clTeL/*\r%/G?ep=;U@b`SNt5]dfp#M[S6--ZRL*)gppr):Rr=EPNDcO)ue3;l&*OfR#$"Z`hc]3$D0tE@gf)$=q/V4r4))WW\C4:=-\ZduN-_\r%Bf^T,H1tJibeiVK&6m>.ZR9isLssYmO\QkKf4s[dA$:[:iXd;"\a1uTpiFNnKfq(t.\A/%Z%pJYD+5,-D&uUD[,Fu!G:`G/$LC[?\r%lr`WQ(nMPgNlBjB@G#Lj0]*4T48?IZLJjau6?N>M+PmmL,<G#A6bKO^_0OE1ib\]YZ7Zd.EsBHcFY\p3)nb'tLJjau+r)VnGpii!\r%W3,,$;'oGCmuGWg*Vrl6N%WWCTbM%2W"IhodJ]R[LNsF"0?d@E(1A3&ne%9#V0NT(=i4aSGBXEu`u5tV]n\r8NbWMaDFYPV7UXIo\r%XB1e`n2%`S*J^(YA)`G*XWcPeY?9C:f.WH?$Afku'r6KKG_h\Dc-i2Md:EH7=$>%]pkidIAqoE=?CrMW768Lb1K"QR'[\pBBr'8I\r%I>jDNp*GSpjk+LPdRZZ+p4AKRK7aU2I)ak(XP(kIfm'/<L]km(["?GX7Y#i(5`=DpblG5q84i,t(=f.D!,`S^Gf#i&B4t792a,*b\r%#ri^V7T"`SfK:g5eZI5#*p#.Vm<sW_8=-$m@=T@[j>+C+,K:9PfZ("jF?L-h:YAm6c?rK<<=T,3e_6a83JSbgiNu#/EZZOh78q\f\r%k:kJtUOp[>qdn,EA5Or;!o.sY-X"8aEe8lZdh6fHR4*Yn2+?>A+!^*G.I*3T;1oD?ET9DT_,<;a\tmK&c4k[V8:'?)%t2Z0eusZn\r%]>!'.?`VLAU9`d"9?D3[;WYcK$[jKq>30.WHL>?M9WJM`a2t-9<!(iQ^FZ5(0rqO@/Ct&3#WsD].S(pT8k6]*JT#i!YqW$4O`D:/\r%R4c<NZ,s*V/U1g^.S-&M6E^`ZoX816FK6NULI12u;1C,TI79$jHc:;oN4f1K/H1RK,'s?qm!o=^2$ke;:=u&/<s;1$:9aT+<KL1O\r%Q]msu:/T\WTA4#o*pRp=B=dfFLX(j.3,fPugtlPGpJBe$EP3hmd\4H;Z<e7kl!oPEoVs$*LVg9</3Iac;G5EN(F-NYn-(FCPj-&2\r%s(+Rr@5_)^1Ze\s'mXQD%(\<t+A$hhOe8^J"_muV5V4KW;Vjd.c_s27WVYjJTm0[ZA'C!t'_JCJ8]b+59@BekU]k]7pBm(JS/(0t\r%CK!O)_K(,Al-,JCb<5bd\EJCebu+<4CEE0dlH9.efhhQ7M4%>Q5R(UD%)UX$prg1>c6NW42V,O".JViH`rPbs`eJg92Ubg$0aWT6\r%77&DW2%SJ)QFh)8eh$f6c/O\@3i@>2fB`i[a&qbAd/D^3nONI-/CXq,'%Z&5'dZ\mFN^GHdca9D?0DPD8G"1c(EGeq,.=U3d?DBt\r%(I+&%06m*Enf#*G9IA.3_q<KR'j\^ZYp8pl76f34Cj_2k`9$X\2%='7Fn(]%orR?<o.gN>_=*!Ifd]kp\"`2,DZ!;m`]^.o3X0pU\r%,,hMf*&n9S`H7NnINS*@M.$((#SOsghMno0+gd29cX:ZJnr3N1L-`5fc.LjC#h*YH"oklGr[d@>$r\'?6nV7/9g7a'\880]!K$JS\r%T75JGAc5',[.pX!0.PCFX-lo/TnJ-FFP=e=Cg8JBU&O0Flb_iZPg@fu3#7cA3X:0JDj;%7'7q[IQ@)Ne/(QcI29-AnYCKQN)kP^D\r%-gQ=2,[V_=Sri[^G+UY.>/F\hUF-C1L#[^T#"Kp>s)naAegYtf[_b+GL=q5k)VnlHrlpH&g"\R^mU@(\TZCZ7rJ]E.!a;=nGaaam\r%@%u04/rgBS`Or#gV#E/hg9hoc^TD&)]-Q+^:)nSK3R!lh8$QrB;mMeV;ZWkY9Z_%n\p=.\1&SY9LF'KHO;85P?ifSfDi4d=(a;II\r%^D;_pQ=%6>$fWiKAe"#pR2X@DF@H;te\[nu[$..g_.Jj%g]d7u=Z:hnF^qm*]LX_^7kCF.0@HM'hmVUV-%/ELiPdtrJ[Y&7k^?Ch\r%]*\@nZ($^VU@H(P:$j2c%#:!rp+N%F;a15YI4B[-!9^o@r*O")LQP"VjLKq&+,MdLMu!V+A]*FS?<AKo/q5s:2<9$Vc``"YQJa/p\r%`ll%%_3=gT;:3llIV8tEkslfPQt3<6H/&m29W!G]'P]rqOMmH2aq#)6NVR*jjbJ<N(t(*2^8;'^'%UZdmYt'ns4/MKgYfdNmM)4+\r%^'\`Z-bnu$-RA#b?F.us:Io(%p6]`B6F'AE`D3X5P'&h@g*3g.F=*%nK1OU7`<k]r/PB,4Hq2kfY`1-b.NGN_s5pQ72OJWLRGH8u\r%f'lf.4VTAJS\")ipFSRR#,e(3'e`i_AcdZ=)]d*:,SOk<]3M&*-@U9OJn+olAslnsK<]'%fNVmfW:/<'3tsZ@7orMQ%L">j*O!2Y\r%oOEPuEO>SJ;I?\tBWtlr-n18iNs.]/iL^nd^&.3G)'<8,Zo]%M%u%I&^;I$INK/]4B:0['*,5='mthBD8l2V"s236e-^3\tXMLt[\r%#>2U5T<_Q7ZTVLd#7&:`UnYhBf/Vb:NCK]gopAc)<?]j)n*;L#GtbA:I0`9=fUiTB>ShM54bJqZE+G8o7e)^b.)<^`98$KRDKI0k\r%BnaJ?Uh%RMfOKpFG_eWeqsVZ95Aaja[1.#S<@cOY`,#3&ZM9X)_W:b3;(+-lqa="AJ$?9g>H5"j8SO>M^J=aDWmAkFNKE56lsC#[\r%_q3ajg=;].Q1e1u78K:LdM5`Ck_ZC!StP)09Wsc0P@6P%!j$el@4g<I4>LN>LbYX*jnlZ08qPik2lIj\66C[I_9A0^$$(VK7NOTX\r%[up=4%=-+ZaV974?])6RrUg,qDZ1dE7K=/+;LfPc:]\']isaA=(Sd;p_:#$me^pid=JH?f`<drtlWL:";.bDg<A4iaWZ77FdE$^?\r%GP\Moc(EOtTlUfjUe7*Da)\JsBRa/DIu8C/U%5lf**i0$<:O(0*U+uRcp2c[c<o.^I]OK5l('q!;E[`"<krqqE>Vol^na<c^NaYc\r%aSIe$'@/8/2<rg>XKKQe;F$.Blqim"4HGuL(9fWYqJ?6+]Lhm2[]X^_Jok>k*19&ce>b/n=2CAYlu^JTD^;HS2'YQKUn\V]$I1D9\r%c,*$As/)6=T($2J:=cgbYmE(j)ob>e"s@o6>:`mZgo(e-horA4M`$6bp]u7sNko>^/C%I93+Io$-6oh<T.BkM4XWpKb*ciCAM\DW\r%.!Yj&s"<dL5OdfD?1atPMgaSgc`'&am8pn[[;qaBX<T6I%Hh.U&LkN0J?1Q\[q!+3NmW8no'tVqO\[TcWgdY+/M!X!8%+mJ6#&gF\r%a-ao>(Ctb$.nB=p@s)>7^XKGfiTB__9esDdf_t\`&H@rj$F],^f#9USpm/8,/N\q,?F=BNrf<]+]T0!d%V0-]E<:**YLWI3W]$ic\r%3j:6jM4*b=3_-,,=i&q2<Ok]9Nb!Mrm"eCV%R>gG2tXbT][)G<<#"_5Wgliohs)q$?Oj%h5)a[5!',L'8t5gbC4[M(I`p*u:=e.K\r%B5/-PYS`r(K`f9?UOPiFpjWP;iYU!+N;</3&Cm4niLsB^l\NH\R_50@q1nPo<*:6#/rmtS)GeHp%jH*[`tmmg6cfT-HNsK_G?k+d\r%FQ#%^Bf>r-='l220<:`bAb\;j3V'!sGi]!!dQr1q_`V>g?!@at3<_C*;:K#*#M>IJ4HbcCCbpO,r;8PbBWI`O73I,JIuKS6'aPqc\r%%J,ms$3VpMMcQBKY[j9AO^[U/^_K8Ui<5^bYU2qo)rY&d.A".0[ou;l>j]h[+n8gC$t(ZJLLG?7]2I-tr`i]OJ>P=l+O4gml"(!u\r%)[mr6N1>;Z@2K#Rk`L"A@0D6$<5C6r/d+S_h/_ZI6MqM'E.uaCJ,EgGQ+MNPf:'B^=At3Q7_p0_e>[!BXLIDEF-d:hh/K'81*Q^W\r%XR?-F;?>7\Mt:>)?`sKBp`GiaK8kCOD?D6LI<n%0T+V(kI,mLT*uQVlXV_c:.a:Vjr8=Jn8T72[e&u*J]:N#"ie-u6C6T]ZYRko4\r%#hpTc2#_F/aJqR)ZH"f;%Qa80TPdPq[5]-TB6:k\&Q^<YiTou&c7g..%[)WV!l(pWO@28:l_8<Z6jsa.N$pGUYj_\[4RZ<ZYB#k8\r%Qs=a\q<s]:V&;fk4/TuR3-naD@lKm?bgUp3^a.VU=/m$FCDgM-lT9]b/-B!I4VhMm@u)[X=GX(j0Pm,R(K21]hdm?DV+]MWb_=Gg\r%F8l<tT"QknQA#H)\CTj%$cY*E#N9#eJ+Z"FUtE<#?g[JMX.<!uReNbqRSG$Ng'b'@b0ub+;gE0IYA$:<XpQDUKt,0F;2*D,epnYK\r%"g3cpl"!_?Ps.0mNeF%0kJA+f&rr5[;lEOJ$_tNblT8"/^hBfOkrM^Aom&P=7UrUi\'g^t2(sDVi"m@EW(fF(c_NM#;#-aZX\p#7\r%hp`gsL<l]@]%fl)Y$Z9AX:R(Mdt$=f4?QT7(4r>gB7+MSc6&VVUNO+aX4X:JPm:"B1Ru$t?]<t4Ec-i"S+S2c)imc*M"\C_K3@Al\r%1h,,AV'@!"dR=#-<KP^7G[\W?3C!n-!5f?""I61Ae&;1_$`Z=H>lr+sl(i?n8X63sd!uQ0EO^Du%T74kKnD7u'$]XP^K$ji>33$<\r%faD_el'?+MAHF(tB)%nn(Cct,DF%P@(h*WKo=/`#kN*E59ULos*6#/6b]tP_FrKkEO$O7<(s6kZs0(?ald9WlaM2E/^KtUa9>\U?\r%F"bJ1pDf``eWC@"cG89rXjuR[9f(1>7,gsZ>Ygq(dg`bd4sqie-IM6eZ0)$:ThWk^+5eS^mu`)W9R?5nZ9Bal-0ZtO28ui?2mT9B\r%5N^O[0_W!PVP%/hb>H341r(d<B.qH9!^*uLVWVmjmE\hjW)<-k+"<bTo$8u?_^^iLa9YfOO/uXA\@Mq]?@R#3#=(F&164XA%,EGr\r%!b</$h[&od8$JcJ+GFP;EO_8_JG(EBN3<)&7'PCGg`Ae0H:G-db_1[k:^f_$A>EqkP9U6#WfoJt="I<?1`''B8otooWX,^s`j_F"\r%fO"re7j^8NC]3mBVL+k+"Eqg:%1hQpVuglh8].]+c8_q*c*_3UXY%H9CiiqghElZb%lU&8L)"C=.C_+pM692>K$Ma9(`_24?^EG^\r%<aT>G"hA_5=r;*6'XZsNAUVQ<i4*e2p;'`7:j"QhB?$:D"Nl32:[',7nLqH\)KCREX#r;k4CCg\JVT'uQ=DMK>5iKso<79-hXYkr\r%/uG,Tdq1-iF>5`d-gR'iP$T*Gr46I&eiSWYb9W3Z)a%#\_u(?-AuO+@O^ma#7nuE9r-&dSU<8N)<hgOd;o#,hF-[sh@cUdRSVlY3\r%8%JhD.Q(efbM`H2MoMiE3B'7nr^j2;4!9,eM!jH]3S"l]\uC'(&qI[CW_!!Ks(kD#FhU0S6hQ\P[o5+,[uNo0:(?*45(j9te?Lkp\r%N/lCBZ1>&L-ZCne-M]C(+4O;AWqm`h^j(rOpd)^].5cKmcQl\Q1YpF9QcVi!Lu,W@,m>bKS+(e@l-,JOa&jS^$i"A87-3<`/la&/\r%fJ.dX!_<SCXG]:?HKeobK%5]bIm>([F,O%#o6:m*OkfF7_6@QmgW@RB2O&N*dZ^Vnp:k\t^fTeejP0MJ`lU7Qq6gceJG?R5K`di8\r%-NjplR*fLm.j,4*gI.YEoHn7"B](MSiB5?Qf`5_J:_D4VSdfp:f3_U0pRfo.f+HBB5,uXC/+"Q-AS!mhk?*"%TCF1mjjMSN5Wbjr\r%Z1tAtUc>%??ST!/SHG'H?-7jt#.&b<:\#5N^87uQHFPSRiB54`@/&,)36qp.+IliNWGFj%gjA#R5:d':^XOdF\I`1'9ZTZ2%q7O&\r%p!HLq8\ODapg%ulGXn<k;sU2t?M6`KE=-BB)?jsf9S>fBL#u6KTBiJ6AcGDEXE9;1pEOZ0A(g60<Yj7!:@NA_kKQ=uA$N7CR>"FA\r%R+)^Ts*JggoGin'Mo>:Z@mt&5blhf:=t*8C]TW"_Wjt)HYWeua<ic7*[G"C'R;iHi_g<M[l_;s7r:fAVl(C&<fN2`Ma(kQLPT$tQ\r%U(&d6b25d&s,8s=8#c]*c+MP8N`G5bO[Y'rW0ULYM@G4(\?N-8'Q</BouWAT4BURSMU(a+S:6nk]$jnBrkR&S0?[9<rF5X$%]5o\\r%8/iT$DYVM.1X=VA^%f=plm,H@qeRoqL@ZL3ecJP_GLgg*2$)m7`DQeNo[`[IYt[S!=T,KZrl(GKj'gPIJ7!.1&'a;o5&[cUMrlG[\r%@Y.sO0B9n>>9HeBc6i)M7F:%Qe@dM);lXn-;*Xt;lB(LZE6#f)[^qk+_Xhi6V1rVaSn3F-JcOk[k"[oWhN@Q@n54uH/'6Dm?%5Cn\r%ItnC`l+->`o3:rFR#REG^TcG,[tuSA5>0aLX)kG,F@Y:@k0@rGEo5cuO8XY^#,pVDea)18\^k6QIZ^d91/-+8JN(%-:<;%3M)LIs\r%LYm7C2e?fV>?9E9FUN$?"5hXB\RY2f^?O`rFmh9.IUqELp+:=B<T]c_g[-JWJJbbBSa*i(DOEG1%JLfq=!eT'84JS/CN:-6R$',Z\r%at7gcro:q\_i)8hX$4IS5L#OZF$b"N^WiUe_9^<3/`=%7gog8CCug/LJB(:W.-CKp&mk2\ZA&]Mn-_@[^?>Z)=XTbdL_eI1;+gV3\r%B\9;u^b<jSeh>)L[m%f=>^1b2mH:[r`-WeVjdB(3SDc%!<.\K<+M%hUZ&t/aj;3AHs6V=%1"4ElWo'RFr+K&Xi>OY55W"Q[]u'X9\r%5CD>P3)<efQmhm=9QAZK+4kIYcU,-6Tp7\=??CfVr78U?8!!I(5PcomYk.D`HCRb(lUb2Eq]i6dKYuot51m=?g#d5-pff(*M'SV\\r%9jJcaa1247bn\p#G$F<^]%hLFNt`gcD!sa1fr^%`]P6Qe,MbtQ"E-uQ6cJd`da)'Bi7[uu"uG]>HXZ(DOdg,G9mG^#0DKW2K"u26\r%_5B<-+28[NC[!Ih?'0b-V%_\mJ?S6Ng6R)'n(r.[Xk,'*Q()b>h0Jbu^Y`NbK4SfojB^9gf%0S:gjcXnn*TJU_c;TI]<.P`_p#X!\r%3kaX"kj\s%glM>rYsta=30iu:)uEsQn60CAC(;1IAR6i>pJOQu:<?*mm!5S&f6^jSq0qD$i_6N2f*XHr0]GIEdgpi_dJqnpm=fo[\r%8E2kfC]0@q,E!**h)On#r6P&mQ!V1[]oPPh3f;'%CACDYVQ*-i=r;r(FjqX!4rlia3sOq?F/86ja3afteaIp==ZUTa5jl8KUMq>k\r%NmL/QMKdsZ/OX:+/B]&)C.+[Sa[H[$I7LGei1,SZlb_q"k.]g":&C3=\GH$:1KiP9eVEg')4u'#PBm"*E;9,J^")C`EVNS(WkYs<\r%jE@g5%V9Eu`RWkXWE<*WX`UX1NOKl`WV^Dc:B<_nb%PUh!PKP""LanFla"I08/L*>/oL+f?.O@?WkU>1\]Z%CZ`l's54.s`a&QM8\r%X;tEsD9C7Qgp6[EgiW")V6ZrP^75qRH=c*Z^A"q1%lRDCJ(aI([Z6\Cbj'=9I+s,1oChng#.,r_gG+VL)gnIblk5pTAUK@B5BN^8\r%`7"p?"ShACq>QE)WOQT4.)nEV/tT]/)8tH-;`s^JhG/8HiF`5Mdp6a_T6bt#>(rb(5=FPrph+*)AR52kD5&e8rXj&`rH]8(+QK5^\r%pYE@*9'L68iY)@UN4XVE3G+/pIW?NdYH%rL5IpO7nKQ40mb7qe`3s'.M/7g4H7"cG+-AejTZ$1%^4Ga%R?oO,!=rO>i9rc;i=u[&\r%@lb.<4"_$=7*/m_ccr@>Tl)tT=e%)8G$fc+f2?,<B1-tf,`HEOYtW^KpL6h-4eVDp@ldW$nLoGKCV^EN6i=^skRA?kHECZL"VBlP\r%P3tHdmh9WYf5KVjUi+mhGYbHF`73S@n\_!Ojm$Q_\9]CU^smbIgPc9!>gj>^LkhoJ',na#^Dd*3B"1U[PWcc8GN$0H4$Hm+hpFuU\r%O#aB_I*=LYUFe^M$YJoelA6s^82RiJHV,rgiTJU%#_6I"&CX4RRr?X6XD0(5bLMNritF>hqL1KEPl)I(Jpe#Hrq=6BhO67bV0gP'\r%N7XJc.I7dIG(mQ;oI<jG,*sJn`SHHS_rIBDm!1`W41nYHG,k$gY-2!FlPi][2/:;A;_e[!Co-qVP7A$@h>/V;Yt4JQVH2]!C3@nL\r%B:0*O_sntg?J)KHnOuK1Pk-!+C#8LshL$Q)E:;*F,0d@06:8H4XI`*8UkHjb#g&dq:\P(-?gN2h=8qp5U*OpgX+0;Ro\e\\&**`m\r%<K#luc.`KTCMBH?pWa;b21/0IDSj@^n)h*(k^$Q0\G`U5*haXcleZHBN]6!^F>r^a-inSB+Bm"8q*H9JOm4N1O8.jQE(0&^:R!N&\r%;D)d25O2I`C[3`hNY7fr8$gQR!]q:oIeY8?^WIJDp4^JtlE6uY@IiNS2CI,5IG2dRac>B,5*NsH)brq0(L"bO4o403NZ5ih`^<9V\r%biPXuK.4u(klaJAg>Q@GCZCB"%7[R:R:^Rd"ciV.DY)j$]&QTacknu?gHKBapf9!8hV05[iW=:q;.+PZ9AE4=k\h.'HN%)_+M37h\r%l/=?SR,s+\`[B'`0j\5h,7i]#e\ut-*KegeA8a#U/%aEDr^cN$b<1:HbP99b4E'ia'_1HQ\As7M]?5hRnZTlp77]6G/?WBTap1+.\r%4j(1dUpsDeGMcgV`HO_Q2-*YM==n%@/[oTpfNB.?L]12(CS"$G^V0:4#9fut%=\?SK'Yp?kH+:O0QfN&:DTIBo$:R91ioA"W%GIf\r%VF/+:Ao]5^*"2$(9(bto#']>`*c0RXYa)p-6MB1&%6l5s8kuUpeWps%+R&Rm_=lEZnI")&eg#"J15WfKdL5QNj)9Bgn_/Oq=ZsY@\r%Ls,D\H'uUtY!C9oQrES$Ms2G-gG2RXT-VV9%%+87_=uBd7Z?<.oX>Q&?O#rbSo5[8])5l^qDQ6f`X1551he*8n+'/H8[3bGG$fj#\r%QhKO4?$U'Y>a<r%R#rn2Q)c2;ne>Km<=3_[CXQLGDG4jqk=`.Hmb3:U^9LQa)o#&lhE91S4B+.dMr-cjBD8$!f&R^_:rMX;Quh6J\r%9mucN=Vss!PP.kkGpNMXl*Y#<jJJBZO#^<"]3k>r'5C-uVp^!2fY>luV$7qS8!is>No_('Tc(J''$A@KJ#R!GkK]InClW?u&a"(^\r%(3W/ch,r5$Ra;-<Y2oLe+,!S%%9GUPY7:#]$1:+S/qWo.%2RkFVgoDN<kD1N_0I%oB6?"kL[tG]b#i;E<&i&WG-`oUrV8:t]*O/5\r%\@EVKJECX;[BS?^Z?_oqEk]T143,Y"eoKB&4"M2V-E0?$PlYsl:;Tl%K;^cnh3hGA#40^>04TmP$%Kk`GRm;'2&9)l168p?E7IsH\r%Irsl4VNl@QA,X$kFR&2.S$qD5Me*V+\H?+*LFak/e6:!O*q#Y.lb3[p'0[Fd8\SFnI4PbEn/m$ERED'B.jJMG\WiK<pLds,(u<*P\r%(.#knD;hlMp_aQoRuornKO#JX07;=okBG07_4)fiPMJ/=ZTYe(PUk[rOLhR1S/MN9mgsJN7n^To9o??U]=5'W8!.'kI1,,SZ^Bsi\r%Us2>80U-8)bipMPI3CEUoP`Z(Vl^LX8*e)q8XkrHb<((A`TL@]2f+$kNkJr<HS8QnLM.SMdq13e]oA9-+qEQ3>e92u(anp57'KAV\r%'6n#n+$-u&AE7%Y7G='P[?pA;l\:s158,5CB/B03'Jj!j2K*^7h&YNYOuoG+RVfd?#Ip[9&-1<n!sG\1>AG;p$OJRJ!1h>d's'jF\r%-Z#'9MtorWn^a$Q\`EI=bSf@>De,%J?phT#`#B@E@c5'.!?XU&4j"4g3AM9&MpN]2o8.8EOPUIlZ&jgC)/mQ"0qlFr2_#M+j7([2\r%7`4"JUJQr*)RTacj0+HsJ%k=.1L\</+3=I*Y+0s2OVH''<:TenBI"Q$UN'4(>[Dj2am0Li@&-jL?P^2<KJkaK[b93DC)U\*ms;0o\r%WW1aLd@TqOK/moDE&Zl7o32U<0\Rs,X``4%(gSeu%ASdSI2acAmfB1p_3YGbM'(8sT%<\IE+hl%F0'H!dLs^ijRU+onN61d>AdXO\r%>]]*q/d8se?g+fl0"O@c!aH#[?5C*tiS*nIaj>_E'<oOLKe=XP^j]g"U!&=3Gq=&?9GB`.!aLQ(R@_cZKSVsD9Ln;5<ZI3T^<hQ6\r%(SR$c8*I7=?hAt'`(bau';<V4$RTX?ld-s,GATV^fJ12Z@t,"rm=R#Lc_Oa*dJ[m8Q=9m=ol6:`pd]7N-d,4&\W^A9";YU.qV3O^\r%nRq&0XIC^F20s<("<ub'14FM]nDcd6"rP\!rEkLjU_S9hoLs.0bB2V^\V-nFcI83@=aQ!%11=Fg*&=goc5>S#Z^.M]J-9k"?&ENW\r%:Np_p3H1Qa7OB$,O][E!'[\pkgB'_ta=N<nT1V3/:\X]i>^.k=hE=LDAQ5B3k>&3K,/%29EO;e!N3QVHS(mXLqlV>k4h/\L/'<I2\r%VgEUh'i9dlLce&dk;f&i;CE2/c^Ob"*#XokImRgdBe1Xg$IQ?k$pa#]#kJtRk>dm"OP3*O'g4HNQNg4+:cIpNep+,iQnPG08E`I.\r%J0nGDKAp/Z1gK(#cY)u0!?reH%kV`Up9?jqKIHGHqu")TP3=T=fl]MOl"+5cY*e@!NT;o^0;eL!FZ5p<\S0jk*4CZOI.=GQo`VPA\r%m?ekC0dcm2bpa;BTHj3fQHNN8EbXTO)tNfKXkOoOQC0+thFJ+?H++#UbP!TBGjIKQG)^;L(ggi"^)m%J=o@4cD<bB5pYPZ]^'R[c\r%]"u=6P`VY"(PGEF_"gpVHs,TI_=:$iQLL?lB8P(2r,nE'r]RJhqdA)th:r)5QnO8`g6\3(^VSeCnIS1"O5=r%`J26k?s]3jdSEf&\r%0cj#BWa$ZGE!+>XB#Mb)5SNsV;V-G(Zms"oLq3%Yc^+P,nGgU0^Y81[/38O'NTQ+dfb?WV*oH)rr'f]nr;D&c:H!*?*o;K\KT[`=\r%LWTRS<3BuZ9&sD</Bm$/q)tPl\\\d*D7_Hh]5%.-7:CqCi_J>[c)egNIBdk1R-Hd1o>B+_osrV.0"+5"'SrC0K)W?Oj,/M1EF$"l\r%mdt:W=l^6keV6fhKu3L7fH17B4m!EGFE'V`7-?L)%P=@tGdd)QG%K&MXr9<4\.)RF<G++=`#68Jn,>jR-Lm:^3UBk6=Bd[?6:S-W\r%_1YkDn/%05WL_CY+d*[EDYZYU*eV).)C6K2f'Gjc\G9>cB%9l<CQB+V,t<<9juGEqW=#kjO"QNdr*+7do[1$9bNOPjkh:X$e@jfP\r%<d>f1;DR1h3,F+Zp^fh0$IQ[=fYF-s*?<!%e\g#>=!(,]&oGTOQg\,]A8<X;'<60/MJWU7/qsDA5i#KTVEc5hYIF2=VV#Js*X02F\r%T;4K`0__,3Qg$2.Po.nNqdYI/`-HGYh/K.-,hf^B!VDRJMoer?@@0ug7`A+84!=HneU>Q_44nbJ!ppmr4K"ER6krGY.;(1s^fU5l\r%DZu9_HQF@nepHIu$]@.V1iA.s6be-Dp6ft#YSJt'U\I?A3M!gm+]\i93XK8ZQOq2]:U)'!q#*O+]TH"/Jj/l39'#LiqVoe.k*i0`\r%ZZOr/_0iMB?T1Xfhi\JGq%LZ^9m(gSHi@P.31^jSQ<QR/NDWD9D7P+oLDlt8ZZ4b<SPNoW@;/a8emoocQ`8,@?'>j86C=[%.E^9T\r%2C.!`YgKIm#e'N&MMNDU-pJTC?$+hRL`q[TbXthXl$M3)C9GcaQ"T]7R(H1B`NUq(5%dT[02V\%mJK5HlsW[`KVS++U`0>4!lp!/\r%)*T"MA@cS%&$PQ/!cJKc7_>,`.@0k6$1AWR]LI`"]A."SR4N,.Kb0P$ST\EJ&?o)moUA+A'H1/g<N^;aS;DkjLcu6]i:#J[*m8*I\r%;0,kA8+8'TMr:UEo)Qh]G.pYZOQbrZN:!F.\>RX42ceZ8r*9cpM`"hp-35UPH,gG'B!O3D"h?F1HY8M%O5gb&)u4p,IA),%j_pOC\r%5F18@gV-NThR%/-C`?@[dMIJdYNIs>\%Cg'EC^k`XRQ5/YMcWd4c)+%IC.ijS=sfAag6b/Z/$,cbRA*[9X@ZBAudQ0*MutVMeR>A\r%cO=Zr18`_R4>Y2cmP)nS]1b"&QB8.EJC/QWRE#P:0KHeK2O=tnfl'1nDPtTBbLKc2:P9E#`+*6h%Id"Bi6S40>4N_QFc@LkaQJ&a\r%5p>&\4V(d1\9^%"%4qE_qR5>k>WTWfo?Zb<CVH6A0qu6`W[.q1fQ_H5JAdY8T.mrn[Q]Ifa4L^*OZM%DJBbe.RNrdEiXR,I]cVN9\r%?#71nBjBuF<=S&U;qtl<CDQiHkq]GZ=R%7u:Q2Wf@Q_k8oC+-`!*ADI(5.W7/f1Q"cR/!Nn2+Q50=Yo#NHge7$PaKjh."c^!6"8*\r%jOW<b1,uL\9bT4'rSh"/nFnjW/>FXF@OrIPLs'HlaLAfS]R9rXHh+JMZS_,e4JS>\==W5&V#6[eIY;aB`in`CI$flpLZ)'d"7>`!\r%=_%O]?EZ]H02elk`^3O\'Nq3joPSKI24Rgi@Kb'A!bVr(,E!SBi69UrDah/S_\n'EO0%.dLGMg[8H^l]^_qc-]usIfB8EG-JT+^1\r%33u#V'!fjdcG1CR">m^*)-%OLBK1XXDl<(,Q,+>'8\^J5:51P/ZRj3l@lQgi%Ze8sE]A\OSddr[$_5'4apgV2$_/BkEZNNj!b^FD\r%Rt*sE3$Vt9Ijs!>#\RJ+fB8RB$>KO7B6:.fS5BH&%-AcRB2l^8?(R3#E!@2(^GX;Q_3m?Pqk:#N,9L2>BUk3gcEr$_Cm\N;\#M6b\r%=jODHRJ_h22`"UCVc7;jGB)iCCK$d$M3<n#c<rU-U&'_BlHEJfI^hFkROZ&l3=VuEYkeUj1YPf@%#R[tVc7<5rrl`piRn!;3+M`[\r%5,/RW_:kq*go\J57d/b0/Ra,YSD!7Y3JiW<!7'LA4&hi7LGP?t#?NJiGk"S.`8r1/;57Y`N%V'S?"XAF8E,"El:7qp?L_G'^+?Hm\r%+qO@HCB9"9-Y")SH,^p&TbLm!_r6r)L=9PjF=,[9M47pBp/"+,'Nd:5Rrb$i#s<>UNMKg?AP^/`#TLm#XCu);@fGH558.%]@ZM&C\r%?I@^Z3g!X,MWWef!$YJ#72[`CWO,&]nU'=t[eS)%GphG_@^LbI08:/d#cg(OlIGu$73*BUPiMh#jC7H.#M*7r!gZbh"uk*D!;2L<\r%GC)UmK/gi/E!?Whm5<r0$]>Xc$c^CoDVcTtEmohOkZ%VGBBc<tg0sa)7$_aM,Tg+K\gIW`6>l%rL)1\he>0PZL,+]cKQW=:pbn"k\r%h+%I"U_(q'"?2*A'!\l%cMX@odrY?XFZJE<;nhag[3shpp*\P=fREE['l9-<SSA)!M>!U5L,8On@P-Q?+0Bq0o.k@+Q9@$V.,DX6\r%j@CC\H=kZNb_V3q<BW/'4(\V,0QfN7l8rT36__)'7ZD8sH@+W"*-4UUD[,h%SMIO2=KbE7[BDcW"+FEVWq;if8ZYpCA3Wf?lL5iA\r%(A*k%K/rOJCUla)XeF.)\/ZFSCh@.`41IdsZ1p(X.X)8qGt<AAc^p-iakI@(_EYj9>T)qfd`?)@G[?@&mk=F@>VUI(4#K*$a6]h0\r%I;gjQCBlN2-oeoC$\WJ4@@!$DPb`d7F.-o5@UTQb&`VBc=9,KL"!ji2_/euA?.RK_.Y43/`">*^3ksp(JN;BXGBciOO'0D.0HC'(\r%*_KD`4/(K.qR0KrYPM7aaJi,J_`HuC`-^UnT2'EbB5H#]M2-@.qsY$hN6bE%Fi=H_gU8m0A#&OpMHI?S<k$>-X"ob-@".31.qjD:\r%8+uL]Xu<kW]/[53,m+L`*`M88_K\bX4s?muBRA0OLs#bAK1e8oZ8qQ?HHe+:g$cNl`G-pF`3$78QaPH$pNR%W:(Ft>Z3m&*lf?D3\r%erl&$fB(f&Tf49],u7q#ae:Zk0&!VsjNnju0g1-?/bCCVA1cJWEp-67Q!1HYjNniCcW5n[e42L8F?+L=9g*ei2.3ie9g*e9-5nH*\r%)n9R`RtZ=W8]4ap6-l>c/n,ET<EfEgX+"P18T>Q3;"XQeSQX"43[F%YAX>A90MZ76.'L!N,^`(A2;RSc.5ob!#+X)Tjd`Tf059'U\r%?OWqBcZ!2gdrn1Z+2H62JX?$R,.r"eVrpN1p$cpW^\r_Uh>#qAk@^SN$30'YBk7[Mr>qtUU!J!HJ-Xaq%X[550Z4m+$6^(qbsA$/\r%%sLD$WJ`PBA"bC;^nWLf7q^l3jVB%>Imodk9lZ6]+Mo`<[RY$J4if]p[Y:&*&$.eBia>pOl/%fs9Pt*Gh2;`%M+TWga[@LN:\)JK\r%f3a4qC!?1P8qL/A>BPRQZ*bs:V_TnnO%]>1AXU9L[)LU<L/iRtV<G%<>s7WQ)R5V!@AhJXS[Em9A$:1bK)DMi=9"6Oq7OChSM=dJ\r%Q\+)f#Z**s4Z.\dP6of9$?))Q-XjMmq>G^'o&^EKN:@'81/EW]*N&,h<44(<[9M;sjs/cdRcYS^WHtQo>KF?Q;VV$S`="tUP081)\r%R/6B>5.Y\JkGc%3=#^-Z?+=`V76BCSf)IKt1/c>%[Aub5mQc&5)^R@;Bg:<uWGPZ,PM2)5kbVO)jXn\*C"@a?\%IE==VeNO-'m.$\r%+;&jOb/W(g[fltmB3uknDJZ?2p`k,5L48a;7t*9V)m%0%s"XLT71k#C+@4Qu%rXeC=hm[qQQh0^[6p)"m#gD@Yq2)ZZl74,A"cK&\r%_k:MiAJMU7^fh?j1lA0F`@SP*PqF@PaN9rCK/2*b,r+?Zd0J=Ga2pO/bCmeIZ*l5biC'A^G=TZ#^`IN>;'7!>l#SdPEt'MV(D-n#\r%#[0/oa`f7d8f/WbW6pUT]<BQ5N&hprel!Emnm08E/W/Z(*sKT,WeSC`(JDBbJXS!?f(IZtbP/BhRR2]P=_D:"C9+&4X.W;UTbl/Y\r%(2\UHbUR9Ye[!*:'BeqbD`(G3bTldQB:S4Pmm;,n=V!h-hFpSSA#Ik5E>b0D#YS<A1IOjDq9P@]Jt.Do;4pg[U%"N*YFuL80d/Lq\r%pF2uo)F\YY:^Y6[7<'`HT_i=T""nl#_]F3;UtmAfqmQD,Z5O(b?W$6;,)\]U6_OKMJDuu]Z#C.ja6&*Ae.Yg\2BIKT?$VRH(SV8L\r%_[j4sjADhL8G?oEY#@eU!BX2eePM?+:]NSSZ%dk#Jc\effW1\gXgqmM"^0TgW=Q>h^F*\Ca=/Nn3@,+l']]rBKSl%\)@CKl$HRhM\r%<^T/*js=gl9f3XG'GQW6X0%,.*/H>:[FS09/+jaTiI2\Z.*,[dMCg[f0es_3K3;t!"Z[,=Z3N<F'U$a?1_f"1HD40<L)LF!\ggM(\r%WJ[I+ZNdee;#"8Vq0,ha[+/!7UZI]pKr,aqE\0ccbr$3r>)l-<ZDJNIE\0fB/t-N'a8m6M>-=u^K&$3Z^/@<-Kg2PPI=gI0+q4^d\r%l[_d]=@5BWjbU-&1t>EaCH:+K^M':6+P1XePn@jj'TUb";5Ks/pBtN3SCDX[nW4f=JnYkRnp-YHHFr8jFCR!H`])VE)akHGp]f@;\r%"GJgMq#'4/d^k1>0;E]m[FV`Bl$H_'HDPc_UlEs5_(;L-X[qb=h=QkeZjO1C%;%W.lU+k-k?[cEB"]h*M/Om0a+>b;UhR)c]iVHr\r%97i2`^'E1R;Lp)S%-H)%;(/F54]Nf-+H+/K8h01T;l,)tE0l!9f7+ur4_7Y)][TYl+Qd(`d(rK&d#g>B$:@_M,Ym2n]@L0O)EB(s\r%!QfbcVLL-44$r6O/<#PAoh+P]Ns<n<Tlo1sD/*A6@(=-blc5haII6k=4S#du;D$'ho]Ze?c8#5>&NF&fmgR7`q]TYMCkuG3,L:ip\r%I>sc>hqO2Ieb<#-1_>]sXOQHC@5NZoJsMi<5e:!ol/,DgL4=u?Aq-A+'P<_E!7ifUd094d1#:2!N:P9$1WE[f`;**D6<*MI2U[DE\r%AR+dpek6OSAD.e0.ClUO0*?5)(I\=m'e:HCRS@P+-mB%=$KSi>H,X'FZ`aRd'+IJIkf!nl2jGuDWJ=\i];kN'X0)NDaj$s`4b3<V\r%ksei,')uk72S,"r&0p1_?+Q/a]h!3(04;?I$:ZtpPkMO#S_R14k.L`F<jXX!+n"&!s%#m3X^8Y;pQJ.WJTOFdQs'V0W[Y;qDAEaZ\r%YA[JL%-n`D'cI\$-XQPQk7$L\#M@"1fbNa,K)bS1GcsN=Q@*TUR-d3U5YUG?!aMrk0>7ir4\^*`n"t9c+=_7??&1OZRgEj10k:>!\r%4G1%uA-(H8][@\gA%-;Mb"_k-jh?OfB$Wrue"?aAl/+eBRq%DCb'edKpQ\?;E;!GpAO,0jZ:o80IWF6I`Tla;_S0KOh/"U[*NGBA\r%2s:+=&od&DMD<A=7Bg\kOGr<+P8XS-IjBW>pUiJq`EWESq_Qlu=GP.]&T`u&?Ej-k'%Y%eklkcX>HQZ9ZEpW.EK*cO*SCZCnm4Zq\r%\Y%2F\m&EiH-FcCLG=dO5/,KWi[!nW;(,0URCGsLe6tu!nM5*[c_BRu/]qC[nMtWGcU!OPc%+'tXL2*E#!9=pN:An@fGMid0ba9`\r%)i-,rN:AoKL_%lR<BeFca<<a^WL@abnMtWGO5,C;<>78Y6[VolMrQ7"$AS?>3lbtm`.r<jP`P>pEek7*,:akrF6!lSOs*[d`okDd\r%5+CkYr"T_QnKE'Lq%t26$CV"tRa<j2&d:u1!R5"9R=_;DLl[(L'T_cEEeoc#?+@cd1^+"=<6eiKd&s7lmJBF!;+h'7/,m"Cb1Ct5\r%QBU/A<K&cFM@K.P[:#d:!]-?.3T-p7IVDLo!PFd+22@g%YFP(OG(jgBR4^RF`JqVP0B-@/72Y%ee+2tq0&se=RudIEC>,"=HaL^1\r%(Yg_+2S,NI"=D_J]Wn53\Bge4Ju`H)T5&VI$="Im)t5=b!u!g(,J^dGL"4c7rMITVB(A2!+;6*+hrt0_r":,Vf#8+"1@'fhf/O2[\r%W8['h-`>_4L6>N?h(mS(Whue*"KMstD*=gI[6$[0jJ6sl[:UQQ+r?AW"u;QAD?l@)VAhWY)4`8ueF)8]T>77$b+g3=7:aj*CV;\5\r%+1!Mb@_oh7HOI35/(%>qeeb+h_--"V?8-%l$99XXB/&X<907hno]eEAM+Ps&(2[^9&q]B>Gklqm8`&(&PX)mbRbLD-fK-!/kEUZa\r%n['SF-Hb;K;<Sp!Lm.^"GDS.8X7$&FlMoD-AjL(nAqJ1?FVmERH_\X\(CD0<m>iI=D,KND_V"R^h8*AtH?WPmh=Yid%./?rk'rk,\r%WZdYW@$^HQ1fq;IKgI>,0$Nt9WJ@L#*F,eIh0&.VdD"GTn1c!g61EVf@lI[iW0[Jgpi^X(r8MprLAp;$AtaBXoht5kdp^C]*0`$N\r%b8iS1148J[VmGn]AQr%T'lI<(-E^fER/V.q($Hu7ja/$Id(iX.6p':`*1O0k_T2g2"&c2_W0-b2L.K'd5ZNEKElEYuO*=Yo%Wrb6\r%:OLZr=,F^s*+su7]h\ZI]>nYj"&Bj>]HpWfT*ClF$@$$@eW'hT6sT!^Y3n_nUl/0PJZF-[)F5-rRY?oc\LF0ImK>W:Tp_j'TkUhE\r%k/TC%F;QIkg+5XdD:H/EY?=E?AHkugnu1M8W^[X>bkm//`G7BdhVglWUPT8;%LZ'QUPTJ&VApXPUoL*n&>*QtE;N-=/J6l[9KK"4\r%3a@)a8b`#$RY&Yu[cLl60>D*d890-H!Y.El<dRihUf5F2e"n.3LIW`HO1^NFLG(OS<^28V`_W)8Ymef9X>tp$[7hWo3m/R0b^T\'\r%d%eU)]^,[cA;(H-;p&WYq2\?G=!;p@X,kJ5'L#X@*dhnJ*hZb>Lp>QAq+^e88DF%E,CJK[Z3E>?"+m02je&>5OP<-S=,X+ug<3Z\\r%/f8t:`sP#<:Z7AJ_CN-BI3W&EnG7"7-R_fi`_5!F:8Kl^<L[$k.aMSg)n'Y&;RX-@5[[_&5`d4^lJG#W;XI)4'6!8jb3Gj`?[8m'\r%o9a#fV"&*uRGe/(]Hk2?i:^`/2Up[K?L^%:CbO[P2)qJf1.K&fck0oL$!Ht"k`DL<S4&](Lh,)tZF@cX;=S%0.)M9Tp*sdscInM8\r%/';-.ZO3``dUS3+1nTWqBL:22+a*:UcPWSWnSi>H*IM/.NQgEeQZ1DB^^X=o;o6eYLObl1]HuN[E6WI60)'bI(J67u3>C.)XRGU]\r%\!:gjiutFj92'7K-067])=%IL1dAh.)oZs1YFGoeO7e7FT+X8"ed^B70#X&$j1jq%C##F<pB,/PO,^U#oEdCdj$qe:r=OPQJQgn_\r%M-EL&*La;"jLB?N-L\2)[$L'ufQ'?d>8PELc'U`Eqp@j<)t%`u[%(%9DSscYdmM.V:8O+f9.*>TYBkKTV_(o9`%@NA=gD8];PQ^c\r%@87jb/([-W*cioO.>W05,2%rQhhGgRF$m5p\Mb/\"FPssb$BZIZQpnIdV5AOV'%"A(1pX3:5pH'kuXf;IO5uhQU-oF-Nrs>gA)Kp\r%ZBk&k6pl?60PatA;:?nq/NttX:[-5(MU/`aK?$cp3eYfbHJLl#>2uqr@Mk*o)+LjB#Yf)^-DI:fKLYk`b$$'ud;]^4W.#g0H\:F;\r%jH6mj?p8/UP1&WZRV>om7iLVOSrNDIUB@CO*PXl+h#!Jf]bsPNYpRCed9^aGX+,=8@'#Lf3ScXi(f?0;H>[9[fee%2E=e%*[qi]U\r%[N%_Kh6Ss5lZ$CChUATP-Ki)SR>e@Kn(E51V"a8p/':1<[SVOM;Z)%2SbHIUb1FY:+;]SI'EK?`8FKig\#jNu2Jh+Lp]&O-oT4`o\r%biG#_GQ'TE4^0.mA?qe0ch]gWpghc5Aj^kd(6n%Wd0OGIKoX%;0B#m62*6NH?c&L4N!k?o7DcInk':B.gDf<CiV$o')qPoOL"d^B\r%J9,u9p.ubl<XNUi%u$L*fqd!:%56aqbhAE5bjS5(rS%-=iT@B:?/)>0`CdJWL[T7DdC:jSmd'01KKlTndgO3Qf"I.=]"gIR?GTpk\r%"*E^j^Pu:U!7%t2&92Y%PE):$`7Hpi2_-P*K?dc.5-TpXo]J,+Jdg/ng(f]e3E.@RWb+]EJtnD?/[9!V^M%SC:iR1'QXkQHmPp(Y\r%I_5FRAEUO2^&QogQaU5pYQ7iHAb:$6RK*`:Hjk\4TE84$U(q,,lS]]=cJ%"U#R_)LJMg_#Nqic.E,osjSfaVD&$<CG?,s/cXSdV\\r%(,i@rj(6L:/C9h*DW;28h-f[Do^\0+Yk+$#He><,q&Hr?`j)TI^La@BEW*P3$+irYX*YHgkUg?>.?Si_@?-C'R$ODi.0Kf-;^kS'\r%7DK.jm\rUJa%&'d(W9N+M#Qg/52JVKQH.`caN%M@m`I3`I1C0=YgcicS01Ik`ES/mPcX:><7#iInkJrX!%i/L2*Ni5m1U_3q-oce\r%ZBAGY1LFjmZ(CA5NH-Ua()%rJA[GD`/W4?C\:F"F]FqE^:1nT`J$]OE`N3fC7,MTYZlce><:tHTlEC.o%'(NtUeuIkh<=d7NKdVC\r%+si8GXIJp97"`#S?Jm'>CVT!I=tM+K]/?r4eFS\[-hLJD<V],;3FLEelCJX7"=?(pVgI@t,qulC5O=$QM72AW5G4P:9ji"jIKjlG\r%"T9M2Qg^8qj6YOVjr=:,:QC^cLNbuQ6?],+Cb"K2>^E@si<cj8amWs_s(eU"rr'16domb:4o"Q291Qub/2V=,O!qc"71U:^4V(!&\r%7h5Y?b"iW?d=_:u[AaGZKi)dh$CUQ0BX*8A6=r@dqj)\gOH1H9?4n^80Xr/\l==h/@;O/h#6iN%1A_nRc3J(IGaUIa%R6b_6P!pY\r%j*jP:=TG7k"9&=)bT$T@3$j-8QtdBaGGLqqoFhV\E99P,\r\=P=^YK-c1FiD:!;/_O[a)KOQpk&G(7PF%LP="@;ubD#ub8P%F$pN\r%P^$;86aJZdGRA=apkR6g%$(?1(qTb`1aE!P!$6]+ITH@O!W3$KE?G*Kr=9tp-9NeAXI/TKb]4+`@IWT2V=X_%_P*smV8QHHUI7u0\r%N\m<&Gg)W4SuCJZnbGT`/&%'rnNZTuaI+CP1?qhBCh4gpI6jqI^S,(<N*">lQU)<8>!oMpc_,c4d//IY#<DF[gDcLcO$Bm<@D*&C\r%H?&,r40!LQB-2<"*]Fuk=XH5;(j^H\>q%M>Dj!W`U*I5i&+>N239$FNi7^%fX%d[A-s<*<]h'J4'?.BmD;Q,6oL.kRn`Un_i0m8O\r%?SK(24Lh8#Ub3KiF!"XK]Da&r>Vi8*JjW"`3:P.R&T_nCQX7Bc.Q0*YpKW%+r"F-@9';r`WfmfL#Q=8Rjll#\THtFO!"'oM9/*"=\r%`*H72Q=)rY#h=V^U&Inm.P_As@+s'BlKJHpkXp_ui*Xg;V\"@_e"3We#ZR/k%7))5]l^kCmI:d=:8[uAQJc,i[%BL9c*V]/e,KHG\r%4o.tkcLQW2!7<16RK)It!0Q.$SWMtX!*q!0+UC@&oS1n92$KWqo&`0J#s^f;c$uPS-#jZME/bJ$+,c`l"X$QL-(;fB(P"T(e0J8%\r%_<m]ib;-SU-Ll[6(g=*Z7CrB/BVDH)[UZj?m"g"u`pW7YV>fU*#H'Y;^QmQ[M`eS-X%?=gTl5"p8oZ;@@3kK`HSpl1l2/AnE1X=@\r%9!l5q88h5kgK7l5dE0\"I'^/c"Y4F)h)U+B1gYIJ.kT[#.nCu&jP3bj/(TXXM#-YC`-XU(J7H:R][BoC[*Xl;b>+9n1H!pLHIjZ/\r%W8b<fS7n/+`-[bk`"_MP?VJ+6GC#Zd]a0GgYhNYAmkH3=cFdLP]XOt6GC+5GHediiNEl?PHSY'c&F[$i^'F9/k97.fbWJ:&8oG?!\r%XZ%l+7/i'3]1:>+plPK2`4j!Q,-fF%$-)h]n0>Cr_Y<ZZ*$<cm^:f=%k4nojF*r?6FFVFn54E<?1<6<,b^[PN?O;<2X)9U_.[22P\r%E-oAG*M4NK-o4Ve#Qg3cOrPsP1B:*(D@L/@QMd!r:]ed,9RC[B"!Me(e%b?#[?IA&5,$2LM:2=odU,Gkq^4C'fg;)92j>B,N#'%7\r%'V)X)iAj+oX+Pa;.l_NVbkA`Fl_W>;"C6nX\:K[*7sUjE2`soii#Tf!.==/.KE6.;=klP#"$2NVFr>TkZXfDjJ:CL!/k5a\I[)%U\r%G6%>!M982EHPZN*?Ee63)f,[QBN'b23o1KF<HLd_k+PdVJ4^,9*;]%soVXVH^rHI+;#Ldai$GL8pNBQPrsE9T"hK+.g_GK>^T>(O\r%\][%NSK3\P<PK*Qo$HFZ_P`Zs2#FN>DS]]*3?!1Y+<"NCPc->WP.1#[Np(XKFMIUYnnsPnX-Ab+HeY02j[E>Whe1E15q.U0>Bug"\r%4EsnICZTh"o"],.ho\:o!&K6?n+Q6cj`rcT0\Mi)Q+,20AD_9cc\n.%WFtSd9R"W4)tAM8rJ28qnNu?9rK&e*Sq;d3T$1mMrkM.-\r%OuT6Dph'mMcUu26!WO\O@!-dn$-Z+W"cR106p>;dr`K<f,StfrJ:El8+S&);nBV_th,0%d!QT:/.;72+S(^`/He2V(B`e:n;@kuu\r%-rl^dJ!PWQ:F8dLBVpquH3%^HMYa4Wbe6p^!=4n+4OOB123cCr@ndUj"X&2k\HNX66.5s--oC:)!rcq,j25g<S%>*Dn8*5<ll!-1\r%2sCcfB`e;*Ie`8N8/(KbpO`g=8"+tC44$e>N+i@mo6r`!Ab!\\bIeqn/&BX:W94&7kWi)bDf5/q/hR4JN&QoF5GVX%:AcR9/!bHF\r%I.jOQ01"b!J8@n;n]*ERLRDF9'7VS)IY(*dH_I)+djKme"a14sl,4[e]V"I4Tqf<Jchi:QUSYY;o7"*6Hp'?h%D2Gh?,YX$l'Go!\r%%H"IH5I!XTb"kPgdsbRaBqWFYHYN,C2"2kSH>.k9?gRD4V3Ih0"%?QjNOrN9[YG$70g"_c0F#LUSA1$$d,RqhX2O:`3dnd^CS8BX\r%Sr1T`&)m=VG=;WpTBn-aXG?F!c34e"N!'i>0;5*lYlVdb63]\Zp&MP17h@h68JKbFJP`'Ggi=)'b6utc%i&r<jdN346:>$=Z_#'#\r%>@Of_:<*hXD2Cn$d)_oT/MYmUm3IFB[a[.>$egbjoY=pf/s#2s4&LcO2iM]"Q!<k\WlGD$N%S*^EV'7todu+0@#c9.%Z/dLq*bh0\r%oM]^H-)m%>R(/EW8d86--+bEfoRJ%s"KO4H%qtX')*STSH=3lK2M(dWo13]\%"BcrTYCbe`Xh^6HpJ;glbcUmZS1/tr'],!2rhtW\r%X0I>5YNj*!j(BjfQ0m2O2cq`s4!Z`'OEEsUjZaFL%m'6]carh(q>o=Tem];7=gUq@c)UA_]q"FrRY,B*;5_nbN%6:LT>]!SI,cpN\r%\mdeo[)'/HZck=L(SC1a]3aj":>:iS]:+;+kbDLcJ$^Pde%>J(6!gV3O'jJ'h:])UOBel,F4e0U;!qO&]/o]F:-N$'4]\0KTG?9`\r%TCs<HjT9j.*-s9f=`N:iEFO+&lBW->T9]"NEHjYV\l`iQES`i+]^#,qO$=Y5><r\9QDBa\N_(k<jquMIEp(/]pgX[&c/m@O)=2^W\r%dDN/4Puc91!s2n]G@^!8Xkkru^1XZ;,$,sXp[MMg9ZH>:d@]2SmXX:o.a(rHi9/ErpLZ6dNRpe9R'EY0<dhMh>du%@,^?M!3`+'g\r%R-Wc+::$mN/ZuSu-2?iq06Q%>UKbBCkIr<*0:gXSdQlQpDLD)ETnJ(T,@IW\<'mRd_*c,:p4Y_Er1QHlda&$7a2-urI3[/R'FmUF\r%_Ls=ue[>\W@D_<?&JNm/k4*_D)#6-.%G)'VJ-M9k;'<d01HHAhD<p@noQ)]mIuuc/Z(p'o_arfq/>+cs@L.>jVe-=f'rBGsfVoK/\r%0[AFh3,IEZUjbHe0[HP\>jU]`FE9-N?XX0aoXNV_S:Z4bFjl=@Jn6$o(Q'@os(7#_#[9]JFR8>foqkVKcK-T%B=5-M$JcK4O;Kqr\r%D9S'2H&]&%,J"m+FQJ*!>)1ah&[j7eNMfhRiUt&B_Bu%Qe3Qe=pQ/S8aPd^h=N;hEfE.);5m9n9`"m<F%?cYuL=iS^eWr`g_P["E\r%.G%,E&N0lBDUB#bh[%sN/HaPT@3jNf\'9I\4BD`9r_NjJi\6CIcG"]L%9Dq\6V>`3.;*TRFok"$9^;kXG64csBO<FNhsK_[d/!NI\r%7N^s7hq&Z`YR=GIp<bLZK<]J:nQkD5h@-E?h"6]..u=s;[C;b8aDJ<JI:$fGo::1X+u_Z<.OEAtaK7RUPY?O`#_/d*]AS9S_fhi;\r%%bdu8:g"+:_iaRF2-K@A-Z/,-RYBK%B0T@3#L1Hu,Ic',-\oZX[#uiSj#-s[3)j]!Y&?$$4A9RHc;P&dgOZ1-Ap+bo41[@%1L4/g\r%"Jm<RgrM"nn*_LcG%iJHTe"9%l#U!9-nTibUFhi&8nf6;l9A4$W_^ou9(_tX^a"9p^8Dc=j)fKNqNJ96IEte/\XiZb84df$JQE6M\r%@^cm1$[D4+]%k#%D9JuFk=mB[3j'okS,U3k94Kt8[c=@B;;rh_O.qsWcl.=17ohko!B@?@ISC]RPLu2;lW8^,[N3$#/)p?;!AhC2\r%Gm/X&DhE14*!JC<$+'\sQIT:%UX?3kZ`pIF[.GWXkmO"q9KHP"J2UXXTdr;BebYPUOiE#Ng/neHb)E00F8C0eY:^1IcAi._%1bjo\r%Y+f1cI+3#oN`p@QfT]ud(GL<f;X;ERD)mJ"CqZ?$]nTGV8Jba&MXW^jmUK@2ZD>eh(@rB/g9Fg8LdaO_eL`=J%i]rYH,'?'g_lb"\r%VA?p.C\0QH[^q/`kGE[aD2dJ.c/DC',N&,Th\YD?p?_M3Uj9;Q]Rt\1Fg#ji=0BoZnfdk?oj`)okDOY$]&%>]CnJ18j7@$>@Ip6l\r%(4g=OcqCY_rCA94r+pfg-e8)9U66Rpp&*^JOtr0`m8G_bPm#+n!l*ut]=ZCnVP!3.oP^7KC7O'<6CiRG^=3+9kpQ+sapY)=L?LXg\r%DTeTln5-ihY+[66eSU"#k`!TXaP;F\`/k4rE"`F\SY6NWfk5TI)LTD+Y!ATN*.3o=e[U%s8W(:F<\8r"2/+BfNQuLpdgC`Q7D'+1\r%hp-Mh_[;#KlKIusJ[/0u4^bgU<0![YZG*5)\">GFL=W$?*l4r$%3M(3+?GI1/iLIOE0F=)'!+qnAn5#--!54n@CTtqHYNb92ELb6\r%d*bkF7loQR.pr$8gZSu,:.d\6f0F622[^+N+6]C*L^&g:Lu?R*<C0StD2/'^>&WcLRecFH=U%Q:&brAV^.L!#2l6C,SqDV8THXej\r%DVBSa'-A"gaL#K*[>D:n@nlC4:M"4a<7&IIVWl,u7ckl=DGTa,Ub[^2/;Bd`8/p+UEbG@C#e^eVhQ/k'_5,P`'`*U.*@)oL)F,@%\r%l)h:!FmZmm%7b:?6bL8=5GF(P:hf89mA;5Dj1`s#Y1D$*Hef>,`@`>DFJ:r+9(]JNOqMP3Z4`.uDqT#&2JK&9ZV>ETMDTr9fd>!h\r%82KY'Rg)6U?PZiSn[_?&WXdhnL;`?/9EmjM"Aduf,c:4#_.Run5f>bZl5'/Nmu_kSl6EUK](?Y=:TlpTDm*Y9:L$c%MM*TLK;#m'\r%B?9'fKT6e8c]H+WW-T.LI"kTQ6cWjJ3:=k8L+FrE9K=?g)7$a\"d.;IaPnsCG9rs/OMtde]*WY\V2*BYct2uce,,TW&E`bTa26us\r%S'ITDW\,."C8=!M\G&Ye&qS@_\BFC#a1?=\hc1ogW=c$-O=C<mSsmQ6lfg3iQWRLIRQI(.Pj%Qk`9rX>UW)Bd`L--$^&h@Iq2c4\\r%POd?sM>f+p60(C*oQSY5o"gKP')c*j8;hI2-2MZq9pZb;.FGo.##Ad9X*1jL6>'f;"80@O@DU?\NW'6=6"\$iA?DOUmB^6]KCph,\r%UR^cLP7k.&:g#6e6/?t5E"&1W]6'4RhdRK.#3Fmha2B_[kC_(lWQhp)1@-&S(>E90Q8;&N5.F!V=<dJ1e)1kjNt0MCS!NR1Q]k"g\r%Hb/L`2bH*jE!NCjITOQ5OqO*cl)e9m%[(##3uB:.DKJ)CS4JA7QiZ#%hj8Q]FBej2aabZ]gLLhL)3G@A&<+[=Jh](S\_i^8A0-C?\r%OUXBRN5uD/?j=i4H6>"_IuOGr6-r1*^!DMY+R#WsZNl>K)$I_`E2bQ91C/LKYei(<1C/LKkUFN/bTHmtQr=*<OVn;;$n<@#4#2G]\r%M2%3sfT6t7^l2g5VKLa`OVn;;$r@^uaGdleC;*>;WrqV-$^lPqdsV:."p$EqWVH8Xc(/]#9+!J%@k&1=2Rtm^Xd5Y,%%,HV4ni*A\r%)$I_`Ug@2d)$I_`p4Ol_!18?#pXtWG"MbFJ/K'ZgMjBdmnclTbX.u!9.D9Y?PXYTK0YCqYj893-c3ON$?sai(CIMT@7TJi"fo[-T\r%P>h>W(d0VVS3QR=H%1kTQiZYe0f"CDLi1!:]K9jP1MXVQo4+X(iFkYXA-RUJJaOI9pn+II1&Cc0i.%=j#2T0Xa:*[.%2c+(a:*ZL\r%(@Jjg5\<,E"7$/;=)Ymnp]LQb#hi>F!6;U,`6-gV^rgn_`7CDNOgU,"(qtEUX<5u*pg41:%WTK-UZ'Q2Jf"ha_pR<rp0m`*1`Ym7\r%61f#5mAmkme//WbHOJC%@:1o3m4F]T#m$g[BQ"2d-l<C`HV:2L;.)6+Y!;1*>HfHd2Rm4+Ih>0siU#fLNYfiTBM8sd0cG(BNP<(0\r%/csH*fA&G6DJp\`'F%$Z:g(#11sh$CfH=8oakSThmO;b\0cH'U(B-o3(_)72(;s$')NKgels,6pd;ZJ%0_'ZX7`3X1'#[U#)W&(5\r%4>@b7p(gh?L`9T4KaHDg!Y9ZDN!?9q;NnGb+l'cqruYCi=kG("U<BGg=HrJ0a2YkP[2'Kp@'.qbdd>JNA0sUcWtbVG@,1Y%#*@lA\r%,!,)B'RqW?:7'>:GHX7#XX&%<Dp.\9oF$/<(.@Q1EUsUP1*6G8WtU7l7$Wp@0?Q"'L2O\PaH!Edgkhi]8n4d69:c^'528VRYZ4W$\r%)YQS&jAp#Y(ptJ0X[GR6f+0chW&/gVm+qE_-e=6Z<rM'pR)?`sVM]jc(iq[(+;2VF/ID_MMo'sBC&^o(rAU#82mGIDRnBHH8jdB<\r%K`l,2TZ-8iir=ZIX7l6snO89p[?=dXmRA"+XZV$5_YcZ[H#*CDG/q@\h(aYlD9^)g3*iks4&/\;lE@W/4aGA`]*o4bcjHPo)t!%&\r%aY7f,LrEr(mZ/rnPp;J_p"uAdm1#VWVNo0qjT1u9B"W2m=GENgjf`9?cl6$1=],#e]ua70oeS3H<j22h[qHYeGs#6u8E8bY/DKuf\r%FVkI8W%Xu0qR-'%Fi"Qd:'E/+l&QIBNsk/qHDlXWM)3d*a<UN\&V5GQ,Q0Cm2TFDWR.^QEC0C1/,(_2mXM;CG"CK8$E-:@6=-/`%\r%NehBmk^SgtiHLr*QdZ!6Le]lQH3!t#T9XJH7(9ucle%Q0?;D)9T0nu"PEa(5@Fpn1F%S6*Kjcs896g'`Pa`fLkM-PFPIl`6q>cG!\r%.CfKlOSZ*$_EW]kJfb#U&-#I.5X5b#5D4)qndj,nnKf<HlRM_13mU%_dUFh'4U1nZ+@<(+&6Wp`*[3>82c6Kt<nb);<-7lL,N;)e\r%"")R<n.2uXqjtB!B4hhGSOG>=Fl7l]CDP02eH)M7gFSfDHtmHIl01E@bbCLIWg7'0at0"7We:5lY\);,<ZPAa6CUD2[IM@oPrm,L\r%Mfp&.hbnrt"Ka_0^4\A%L."X*e3C4"B$m^K<9q;P15faF7m`$<BF[5@k:Ben'CjqPS:rYTAdU/USfQ*-R[oujeh!9CWe7+[Y\);,\r%<h6Lr&Afuefr@tL1;fMK1TsSNiaL*+c1R2dQpj+40Jt'@_1jh*B'&`^G,c,-gt<R-&g$;H8^p_mTG/&;^8":[KIc1FMotuj9goY?\r%R4]:G2Ts[mk%$nHs)4ZcH[Ho63S*Y2;5nsu2%R=0e@j`-Y/g)G.eg]Ho3);\3aLJpkeoQuOJmc=JfNkl&mCc1q>.d-YZ'U/V3ui"\r%98T^A2L;'(=\Ose0]_'+OP94Y3M5kuDI?!\$AX'*qL5d>K^`&Ufc'dR6"GM!h-4_;Ra2?MM>P@;d76n(#h8dBkT^m6SmG-($?JH[\r%q?!k_!l`1qDjK&TeW(pHaX]XcfkQAo)c"NIf5ImK<G8$ieSf;t7;0#\lV0X2b3CYiDTgk4PEL+?*$tDr@9jF]fK+,jmRPQo#YX`g\r%p)E>n"/C.ILZ*1p0>>XpY;u"5g4)T\)1U1]qcJGFe6!GVkF4-6NT4]_MX'Gih.A#2&]5]FmerD`XlnBqe/Sfo1K)Kb]?fhcDrm[:\r%H%,M9I*42+EV$8nrI+[rmS2$%XliD-Y+F@tcf8[anbdD1ZMcitXmG0odC8BH]$Z!9R<=+NfBBA*(ZI?!CopI_jVmi$[#q\kG#Gs5\r%X<VA,UOJ0D?abSa\&iI",ldZ!p7'jFC#ij4&nP*=RkJ]\lfa?&G.VOBVb<DepctlKA4^o^lth*?6&-7.&F+Ns,^fFU4RoL[#;?R/\r%0K(D@e$X(0?Z+B.C?#rFZ]kdSNP9\t'Q[pd;eO`Cb[KpuSIn.CGNLc*eq">H4ct-r>Mk!1:-W'u1mDTeG"C`pe#&c$q`%RS^S#^)\r%*Pi?#eeFm"!=._rB]OlL8Ca@!A2sDs*7<H#gBinoI'>nUXS.ZTV/\,uNJC95`51l%^f0BkrFUIRaeds*W@m*iYh.0BH5Af.oo%:P\r%.E^>q5FqS1'%Ic(FSetj&nu3Q@)W6Ff1f.p,A=?-L*J:dEO9ZH)D?&PZ9q;K)eKIY(m9WAH2[g,hEpPSABuE2_5gu%3,lp<,<o19\r%poM];@te%m)M?*_ZcesbDbCFW0]_El)<uKU320Vdf,TGccQnt+r([cN^_[*olmatLr;Wf<.gJ:+&:"pGh"V`g8T5I\6,S\S!?J4e\r%ZJOrh8*tOEqn@tm!8&QQD2%MsB)//UhYB4J[R8k,=Sn),DJN<t*o?6k+!J'2W\21RB4!a&bH99mOnd!?PpBsbgAB71fl(bch'JN2\r%V5iY/G+sc4*qDYs_Xj%]q[WUR"BOJRj5]S$`ZgYF_eGrorK`>jMk/:&"-jWn\[0$'dlpAsK*RqQ(LPo];'fNJm4.APD)S[<gY)s&\r%,roe3mVEB*RbusK4Ku:$l-dAs?BUWVS+E,X+-.)0`B0OffpXgkqYR%6=kSFYr0p#_pZcdtmahjO[9]nEV)ho0;lkosIE#o?hL$ma\r%ASj16$@7Ui))n9\J]&hD+ti!>R5C8%@SoF++5-Bl`TAV_8h'c5r=lrA&iq]D&07?W6f<gbn<?Q/Y70%$KPr$OcFNsN-2g&*8V&kq\r%CB#S&OdVSXmmYXbbIP)-)GngAkW&<a<"_b0!2GgFTL0DQ[@E+qYC#6pUjLsgHhbPA8b]kXpNU/gQ$U`>F)U)D=h,Y[3VS-8aI^J*\r%Et9-"$U`"&4&*Lh=r9TGghFVHpc6bcDpCMI@ps@CbYAgpgq!'GSmV>V6tq<lg&7`fk&qEfA*eA)i5>>tS+*c4YMiGblQhjO'`,``\r%9.=Hr"jGqZ;MnUJ$)/cC]#U;&kVteKP>[?+.XPXfNAK8UZ6u72-:+H"bH`s5/uQZ?Jp%eg08gcE%.0o=2T]ZSYF[5$5sl[I;DZf0\r%!EB4;#GA2$"uoQX;Vc/h+4hmrS&49`@?8MDN(XF]8pe)BrH<\<GsSpT&%:,YqnK/0)P2CB/.d/]"'M>Y=Nq:cJ_m:Aanj3PP%Y'*\r%!nW`;"'JH[;iG5j*68a\WfaB5"'K^+()!qoog"hS5K;5i='KHiCSc.?ni&JNit^_8%kr%M)X6P<]<OHQban+8hfe>MlYX=<<PO'B\r%r=hDriof#;r<nnc65g&W0AO*mVXhu_:+lS`:3t%W"GOt<3=moF4?t3"T@Z$ln.h4$:4Ku;>]Zi-)?q.=b/96<$Pfk+qrSHR+F4Me\r%"[&O6=Hqqg>pP>'q`QXT'pWA\=e?'9>DTE.VE%2`'`kQSY]E56XpBic!(OH@3JYF!Nakr?flnBoi]%^MSJScOW:+YMMJhP@lS+K<\r%aP/b.r;ISiZ_,Dt35#F<:=k!CF&6M0C0jQ.gG#l5D6a]4l!!YJ2U_<>I-6J!*Lm!E/jY2WJ3#\%>f%F3Tol+OBF3<7#m?Tf6;&I"\r%U;J9TOk$k)1+?I[$8$h3A=H#'(N.=kTL-P>-qbdUG7dYn.=J:B?=Q@LIgJ!L$9a[f9,<+s#\-4_OC#P+W7$^jZ]53O^:'ob3X2I=\r%?eVc4'Dj(1gZ>(H%pih22M,m#%kh=^Vcjd:h*OMh+BA^Z?Zl[D>n3II$Oq1$Fuc3Po<;HpgZ;feQ"E94QsC17f`FS`;`00rY/2C#\r%*4&pGT19A\QlnPA!f:?Gfe02o`YY,B=R:'QqIu(#NnH$4L]iGmB"OQs^[Gs*A%'RSZbP-Ha)%)@B13URk*YOV0Is`]0ZS!r6],fe\r%@IF$)p/@t%Mof"p^T#`H;l:VZY/%,$Io;m++<kI[fs^JY;lAt-$9`TjA*Od%9Ag]E\_JXjWDi#o\E$D]Dgk.'o(h.e?(=RQPZB0D\r%[/`=[D1oV]B/bAN=mjb=dij#+gh4Rd&O>o+FeN77jI>P_2So;%rUc-n]!e1iVbRP-)#N_r9:J3L-8Mt<(]&lVH[-5V>m9r\HidH$\r%<_G%TZ+l7Gm"=r:,YN1H+IO]\&1Io!'S00o7$GQ?;m:2>_%&ZYT",Fm"c2/HqXJ*=e)ma9OESm.G/^#ZX1(dl3lX3BDqQ<t>Xr]\\r%[:V;TBHG+mBDO`f@gKA\^%<a*_+01Q<''.kTPKk@h-ZelbM159fBX7%Ua,Pm%uO7O3po$IC0(97:qKKe]n0:)0rOR3Y($fX`\KM,\r%,REq,JHK@h\LZiHeuKgeZj,(Q@rVtKTO-oF?)q3OTPO$Sirm3/5n"MNdHu0^0?FB,i,g9?iuB1QGZM#A5F(%-TL:4lCp3".N+J*l\r%('nA7ALp47=>5O3Q*CbD=a37Ab]E3t&LUl=T]VkRh;X)-EDhZRmNn!:`+qH"T/I<:ha^Wi7O:lN!e,Jck6bZ@i4")--"=*Zdlfg[\r%6,Xbr7EhGhRh2`Y;0tm;iOMkY-aFoA?I,f'7*NbsC9k2o9'a`gY44efYI/Use9ZH;M:c*6IOB`uB83b@4:]BRs0hT`oH>)qY^r^u\r%9WuJ7S7W4^BcV\q)=I$?43`d*Xic/X1GptB`+d4hG+cT:kVVo&RJiQKf8bGB^EJsc_Woq^8,G09@1qM8KuO)#l^+jNhkjAWV#>>s\r%Ig;A%$Gc["9+3U\d'T9jhrC0BC,am/?+':=G>V4\:f3\/8]@_38>MjWA6L+hL@@TS@Coh>Ip,J)jBcFNOjTkoRQtSQO!XSC6u#V:\r%FgQhPTG#g]fVi+9(MP\8jX=rl]haa*['O"jh=gT/;EJ4=TYL3JH/U]fj*@1'$`3*M<()H8B.mS>rKGUc:bF9=Ep50R\q-q/+:@8X\r%Q$'$m8\1e%>a2)NQ)&2!+P`-%YE/f'_I(ub?M/=/XV?7:QIEaZX7Uf1/^dKnV8&j5JK@Col4Mj4#:djiLopbM8CO5C4'mYL.S.uN\r%5Td"Jd$-T+%s(X`^=nc\@Ut.UFQI]:VZZ\:\tTaHl$=`A!n>je8_6N1?'qJ3P,&I<!jX@_YB*Go0n\r;N<rp.@'*#4DVN[lr^]Rl\r%-F3`$B',+_?i[\$1J>gF6Vj<l0ami.`FjqjA4!13MpG(&P=#a5_Ytah`lOZ^/3Yj`e"R4)$K*^m24;[&`o8d1\CM%YAh6,%FH$kn\r%buf@*d!m3YRUqn7B'*q&,,Z<:cO=FCaIHkTG2W=iArD%Km?c%KS.SM([_U?3I"GMsbU"k3RGk\%?H</n]%l.8@NS0^pR)=M_/,]L\r%$n&$>$-Ym";dos;H2>a8%E/e#k34Z(c4r@,D,4lIVu+oP?7Z#UPDh'U%pabMe.%Yu"[4^O+##:IPQ4Hd2G]q_:n$k#:CO)o/`8hU\r%=MSaAcYWT*\B>O"ba&F=9,5R:I_joSL@,k,?oCfQ)=Ad@!jd1KbV[T[+#'1^cV+m1K%W9JbT*mI"jH]=>rtU/;q'm-T)-);RnXZ+\r%&M,c,0m@8<=2D()'<""QXB!HjH!b5?A+%Y#A/:g:%%lqr]#GMTba?!uE522@B?7Y?Mm1Y<aC(OBe+9-K0X0$)l=8lT1lN4`&kgIu\r%n3+B>C'Df+!Uqa#"ATp:hsS_[@W)d<mYk5I/DkPM@,6JY,TZd2)AeDE$m>&B24s;q7KoT<!<hZ4\E:G.qD3N11Hr`kA&jhI4+e5S\r%&E?pfL8m=fSs?CN4/qU3'"W(\]+rS12h15@ZdchlW^3K"'Y7drBC6hmof)Lo3P%$1Y1-FqdSud/\XY;BKMCLQ:(U^/B0,.')nHtO\r%5)gH<O-NdNl!a*N"qB!I[u+.LgZO2`a$(.J!BO-</(3sHc1-1$C6rQD]t=I>U*_D@\X0c:!T3tYJ4ifG!#Uu!E!-.A!!(i?X9\fA\r%<75Pji!'/mr"&kjAa1m\0!nXAGI@<,-K_D[hOYplT1:hl(l9WChB;^f&,b=[8F65#4gLBd\Ve>JgE2R1c,4lR[bb8@D^Y%HCER-C\r%![[0!qNZ%ScU4D@14QNDLgHW?eh1EEn.0LS$j$>bUlee7"RmD2ipA#h/B$-s(+K#m=*f8[4e]3CV(gb);RHkC3p(msT/p`R(4L"3\r%]k]-%'CkI(<r]1LQdrrLrI;0M1X'h9W%U`Ug'S;5:C`a4oTiT&[G;_,$2eXaQJ!EI`7%*-f&tShfR2Sib]d9Nfr`u8<EBC.hCG96\r%7/&m_]TL7AdAea'*Y!$^.B)nirN(>4[lGmNA\_H%L9a]n%GdIVA=Z,D5)[*[29k5kF1M)3YVT%=PE"Crr@9f^+YfbHnNuKI+7<5$\r%@_e[[o<mn]rG5OjKD'B#;u=XuQGgp$F@8suBKTC_Td,/O,LBoRd*W+?8)&K>j%m,adOLu;Ukp.LZ/l\"+6l9@\oV$Eh^''u9cj,>\r%M6q]SOF[Ng^X$E\aPT[I.Tju:eSX_f4scD)njmJrYGUjNOYM(Pm?ft-5J.b)W4%X*e@+.+/CX]Q6[q].#uYRk2;('i8`TfQ%'Oj1\r%fNJ2Bd(g5]YD\SOVL8XNIN?b[(-4+=)%)b(TL:l24`t:3gJqY::`sKJl.hl$eYNfDY%?>qZUO&k78'UOU0%YcFT#+ASP-'UH=clj\r%0)B[q$5.k21PeoaPafE/d"h0QS`(,\Qp="Wj)$e#[q?MHB_c#Y`2hqNMB(@mD5)/m087,G?33I7liQs&;AT9oUlT>BY$AhcD+JUD\r%7agqs'7=`f='dhj8J#&p=nG6IPOQ<gHTHp=gI!%\`b\5,X_^6TXAhS@l"^Y#$i1s<=c::,8\o>?5C3)#K4AH>M]-uL"Ms@A)(J)D\r%.4XuLZgui!93Y"NY@d1,XYS[sD9t:1YXmp4JmcEoif&HuHph%)gHJ/;\#lsH"Y*WZ7)@G`;8D^&RaU$T;i3R@<_Y.V&^QGLW75Hk\r%Lj3h0K(#lppHC='Rm%)nS1:5l\Zr6dX)V(j`qPf(?qWQ`]NkWRg57.SdG[<AE<j+N9T6U>\X8_ehjZIkjVZN%piejXL,F!c\a1H"\r%RuM1\<U&IWn(FAL(=3e@^<sRj]nTKaleugO=EcCC$L3_E1d$,#h4H#h%?@m1AjWM6^Q@o,)uH`Fr&=l=<bu^Qg_A:#F`4gP_:*GX\r%\%@!oNo>5aGTdb#QC<N]VVF5D'5cmObGsFb*j;su5@qqj#VW6;DQk4_Q_D<GBF&@cF1(bf%Fi(=A*Yd^>R9[lAgB`'?fo$"&Gfjp\r%#"/Oi+_WSj&IB+mLYf#$SW4$f<+6PC4K@rMV/AADFGnbZh"P@BV6g"q)JG_;`^cZOF[KmuK1CNOEe(dMnnM1i`hD6J3rQo;2?$GN\r%9;jjgm+H9qXGH7(mu.=bZeGZP-*1gV\K"p&8(qFY,j>2'L[21k!+eHlJlf1Oa1*\WNW&F8[[ENX)WSMLFG!iXI@+3s3Bp)F6&+7>\r%_mBp"pr%`dg316logfa%lG(Vf?+l"/HFE]op8Kd:/otFU=^jYS%G=n1IhC]nrG[+sWqVYb??\Lg=uYUZ`a`r(Z,2/^l\9/%q^J^*\r%f%57hD"C0fUig00\!^r`'8X"\U6mpXe8J,ZKJCA;!fHba>-I0'Ld5%5%`.3;cU/mSD@VY#T0P5_4SZkm15H^-^rH]G")5E1*6aV^\r%Xj^8-m%ToG!\^kZ4I+YX'tPnUcVqAK;aK:+U3Wc)H*%](n*E[frks1"4$L_IPrVNR7BDN@o)7#$;sA[SpOfL'BsnlWaF<3u/'9jK\r%G5H<<rcRD<(k'*S_kdn3M\4A+=H&-W>rcOsK^1mpFiNSZr3/4I[n?JNki!$0e1-LX)4\+1j6&JnohG5".PH!uc<[_>Y]eaKTA*2`\r%WW*L?B";gV/Q"Bp),s26Et^o[_cD"0c%70l/KebdhekVBft$NPmshfCrVjB`pEil:0\i*NofS:MThhTZO&U^K!`;#G:F$isAKoNN\r%ZqhaBK\L2M3G.V`G_[b#5;=tlN!qcn\EsP_:8;:nASTg6F#pFQ2QaDTigW\iD7muPGSdu>5^o(d`$(]&IuE&Z>;E&(8r9H<C=0\]\r%dc`):Bmd0GKZHUhPm"X,H<C+#rbl-0^Nm*ak/GF)`S^d1iQ,,qf50Z`:h2--jI=5*:$U>-q+\3R#Y`tgUcgT;?V/pNlWqZ4kJp78\r%H894'T%\V"PVtR'rGECMOc-1q:0&(2R=uSg[CQd+YT3N5A#d#Lilgu-.lHMGk0<3T9`99=EZQu[46af:B?&eBP*BSDE<*Gp*Cm#A\r%5$O-ALi0mVIH?NULHT`,7sZknQEg(bWj?LV.Co!\ha7Ek=&=tJ,lkOLY11BcSch<fhN]3%@fAL&hNaQ,eda]D(9bh$VG)HP.j0K7\r%i+DcYY2HsSF#/FAXt9&'35")_G,]33X71F:JnT>2_WtL,oELAR&@^L2?`LY<mg@Pp2gC'img;3bXRM1sC+-bGFH(RY=.[)UHsZRQ\r%nMkhrl;PpgeU$nkd"b6N]Ac*(,NrG3_ao)I]drF:BR%3@</o?f3!8fU"OZRBL"Eq'qShZ)L"ErbV?NB1OM;-S*hV<&$EnXgg'V?U\r%?$WS,>^KP(,AT3-hA*&!m$RB@H<5^^heV6#]7M#/QQpP=?(q-A+:F:.G6KHF//Fo3]7LBUS-9b:G9r'@NI$oI'g+"70H)V?H>6V&\r%qErQeIL-%MiTO!%bo[!V__H!3[.t7e)NJM^_kF)C2/+"bHm.Z&l%j/!lLZI#Pbm&#S3!VU4cs$URf"9;N*W#B2b+no:%MOj[np`h\r%=\ZPmRae\4b\AnsRaM_MK*8NXJR.S<JUi!^!S*Lp!WfPad'D&%J:RD^orkW+#eHf*VN_e<#C*\GO0AXC<2^@c^N=(@:JZiY;h[ru\r%k_d\9D;J00hC9:LUOcWD@8hPL9sWRjd%sY^1Zfk]!0SAuo&jo:K5,9\@JC8e5aM^7#k6q`A'"mc7*'<&:JG>8p84D!j\?//I"cSD\r%T+(mKE<0-F(&cPX-Qcb!PQ7unO#<i#[\FgEnPK`i#pNr5B+LQEkkFf`$l*Vm6Q<)8*KA_A;T_ARc5lO=6m[-\ktOAa&[c*`FPb)1\r%;c)P1%B)ejbtep'PN=B<=&/H!)URZgUK;e>O^f2uD5=6sMJ1h!'m+QF_VfB(53kgb:J\L>3(&1,AV.(dnWr3kDT@C"O[VcfCC`)q\r%Z0&+ZlOU_"@06-`4^?`Y9"j8W/gb8)47'DN7*GNkXRWp%kJqgAk@];Q=rLa)#Ioj%:=(Eg2@1:>r!Z,*j\*s>j(G<IT0*DuDYsnp\r%0?LK1/R$nBdH1qj9h8r=[9lKqYFog]!$0/;U^7-?%U+hD1DgsGXqD9A+f!9c&\$L]7[q;up%9jO1>5tE(K:1_rG),1FOdoadH4QG\r%&BtuA!@DLnRZ*M]A?f;NF:re*N>uYd71Yqu5=JB"SO(dciG9+LhPj.?VT3Kb8TtAgW!a8Z_ocVDZd4s<a?U&>A>"Jh$UK0F'1)c]\r%1P+03RfN6H)18tl.flk5:,iN0k^"]/jOef>l]of'VH/,4arn7XcPgPNT`q@EagUKo!FBVdh-'q;L,@k"(B,.9#6YV3@H]Fr8%GoF\r%4&C[-+\b;M>C\3!M)'_<G5e*)WC_6^JrnZKQW7l&NiWSZ8Bm%qq6OUkRJWSFpC,L3<3MZR4krg#Za7R*]k>pV+oO`K6s"D\077%;\r%a6sJ]:-Yr+_pU!U$3&d;XhW1U:@S"L+XPEdS7%k.p[hTi]'1-Pg.%;jlU:uIc_%%+T.S;/Hd?r8BQNaVMH3CBol,lhDtTf'9?jWe\r%='Lkt1R"2^R@X%8Pk"Xq9sM;u;c-RI^U=e=49h^s4ptkiKQ1TFNSl.c1d:>FDbNU#mdW,sXo$,pb';[Xj$O?bQ-T0umA5rW4Bj_M\r%"jqV=>b-pl5Db5EZSE4'/,IS_BBmI,f3I@^f5XLaJ!\RZd73/iPDgc*omM:)f16HeqaQT3'l/nqBAjB7,]5nGSluM'j+T@tAl$RR\r%^Ta`7&tE97fJa]7i<#8?Cn<n'KMPJ1Zc_]*,l7+rF44dc)Y46,=uB-)8,iA/1&HZk)2Gj057FgEm9pnGTm^fL/Ps%cSG!=0:(,cM\r%O)%N/s)o&ALY!UJ@J^bP7%-\]%LdmG4>RUTUgXbTH"Knc4NjJ^Gue[Sa87GHO#Kt#KN+:JZhlfcOX@:B]F]oV4HUOoHOj2VWhXoL\r%)hLq_#pM[kat1u6\l]fEb:M'qhpPf-E>3*i8ZWn"R_#7bP,7IfdY^8Dg$Dbo.7/5s-+^FKKR,\:CFaYD_"+F"3)@cYW8%,\Z27gZ\r%%sYJFdokO!Tu+NM#KV,C>]?oCM(9+Rbu&*s[kRCrbj.][`Y[kdP%MItpaQ<IJkHLe+S_c&8kt,\PS10k0/#thhqPF;j3,;^OO?CC\r%kZdhmZjOoR&cT5k?*2.;'>3(_05&P'B4dDA/U'6J1]"U%YH?&-(%H`qTOl`tSat#K3a:&GDXs\ImWL+$CuqY"?EbJupD`bBpKdSa\r%.D*e;]a`Fp]iH-f>m?ku`AB]dQ`%U.nK*j4Pqqc&c+Q*M2l2YQ3-M4TH;ib6i7jfClV0ZPN1`7DR3?Y'FT)Xk:7("6l228::]^]4\r%]%5tDC=N'n.UE^#2F/TgD1OP`>)<BE$H'(jJ]MVWaPn1_ipSi:&Ad%$7u5Y"C*AfB,+'8<^u&9!Ln[,qS:("m2&^Fa8F)/EiU7c3\r%/iWGjWdWg9D`\d:UR[QFm[-WSM5F[d'O^CHQ)67G$eV"jlV6?,T5/Yn:%g7p]-q2#](^i#Vd<`FrHG_FQQ>jc_XcCUd^);Somf7e\r%/>&KtZGXeI+o1Jp*;FK#G,EFmh3F]0ltlK_U&"%KQ^n\^cd$XcWGL=.I!2C1:([APG1N0e0'!f95!(j>JHVe<QI=N)P2bl8X2X-7\r%dq<=)m*IU*P0^;^"2I8;E99UUl=BVA=c_ci4SUE`5!'VSPAeV@HNZModq+=//jf-^R7[\PonDJ51R3paKaYq6B<H)d-SZU5SYI69\r%o\#os3-=cFR>%U)\-p>iB=dI%WIZaNG#Zpd*'-=LmV"RD40sj?3[2H2fpOHSn;r=bZSOZpJf(**cE-H)>\fop44@c=q(7#BG'D9i\r%s%NplSJ[OX5,EpN-.KtNZIR6OTjUJK2*9mO>_)!1W(=E%PnGGi*!X9RCFi^9SC&,\'a]YHE-_RVBLoYC-ejq7&e6.Q^i:/?&e:ZJ\r%%-m1A$j#0JHVMhZ-*!=YD)QqfBF34u[p)J3e'HF:2)).prYCkpeL=Ln+m=FTCl)uBB+U\"lNi_LN`p`f!-_;XG+67DC=k/AqKU!H\r%\q]TY?U4Gu(t;%=_JdU-(Rr[Km-q6Ica-$cEC@:r_0]=(`:@)->ZOlD\\c0)F?0B@^QCg+l=WUZMQ=n4AZsQM+7I06=Xe5&Y[n@A\r%@YP?]iTOserKKj1W6C0'#*<['YW+HU3-0.E1[CRQ9.C#\rW=822d1/c=`dlm_R`K$2%^(]D=dh?27L5U*\JNsCAf@A43QmMqT8$V\r%Dcj*f>4VT,7GmDmhgG9[QC7_"BW#BZ)S;H:\Z'g,D"0M5?lqY#B7>!p?eaet#PNJ&OaYThfoZg$fEYAS2M'Nd5]!ci\\hht!-s`D\r%';'u,i5jsdM1'nTrW'L6[-Rm>009%S4SF@"XRnRk#PN^73HN^EI+\b'\f`i)5osB#p[ma1pe:Nq9>?r3Iq!.Nk&.5FVI"*Ig6/g^\r%CWs@uMi8qn"+nT6)/I$i#I%jJn"3q_FD]o/PT_l*TL:/o77LGLq\2i%Z:2bGaF_Br&e>Y9kttu\Dt6u?_OSPU:OJTAN7G6=(a<Gr\r%!b6@a_%7JW9Eo!aN$Sag'h!Yp=99S5^C*aIBmj[V%:chYPOo(Koo;rFd/70_2#53N*u_]ldsYq8Y8-GFe4Onr3K7!(`0Bc0:at[A\r%/Yb4iofO[@GU@Dra2:B-Z#r1AN+L;p@4iPQ&R?f&$Q;/+>bmBDe2#8;c8BjJ)+8j#D?bI7,D1d_`=:WV^)9=s.;n9.pBFWu4,Q]d\r%Ws#)1I2@neAp"S_ID/aB,TFlSZIEV?@Fp_der)c5cVtZ$r/:ETV/O!l5h>R9Bk\pic\24KcK4>tIL3fi>A0ZoeSf:iqG.FdIY.om\r%eagp&Y6,4b5ED!No#^Xr:\On/kKN\:,0.q%\[c1plG9G;F(me%=ZtG&?2puII3)NclhNDtj0Tk#<fcqm%o,u)GnmYhX!l2("?jIZ\r%rYiK'bc(?Zlt-:CAqEQb2tMppH13b^O`X%F;$d3jVJMi:Uis(pAi#!:euHL<%%P4DV'MHJpF6i>4_p=RF2\W3K27Gt=1pPQ6`!U7\r%c"9j_Xcg#[bs#'i"=g*_9)"5!2f>m28B(42n[%DdNHp(InlA9Gr2soN#TI,oqJnTIPY@s.Y."6XqXIGbi_-^^Go(p)1DZUN+>V!=\r%W][c&VrNr)BH9#k;)JFMbh+_*QdUqiX/[.dYAIJ":i5T\KGL7l(2FiUq4dDZa5*i&;O"0ulc)fN!8Z.i:&T111s2l$oW\*76gk+W\r%n:.5X9Jt)T$Ee8.;W94TnH9umr_&uE5*JYP?o%t^5n;8D+rrMfc#B%kR+C>Anu%+1?b@q%XtL9a,jj^dqf;Qs]qr,Kln:#*@g7@8\r%)`'0$k0]XVfU0KjZ?pAA@q,`A'n7dBELD-oRF.qDlM/ZH(u3MmP;31%A9,SVE[ut-EoQ*aEtAU$<<EH*>*<!?6E:Co<E7m8EMR?b\r%5ZP6qT(M&_Yt>S+l8+bp0=a1I<RE0`'<)m(:_e?o'ToBr"'&cEJ0Im6EM2U'>J#a)a6-!E6E=j:88=ZIHt;eeU?@',%-NKP)$9A,\r%AN/')d^81^T#(@l&ZP%;W+u>H/NkIK]okga#4+>RSP5aC3=2E9;RQ7`8c&>IkQ=hAF*U:^CB(A?*[:V(I@Ddpr"kiLc85L>a$3)_\r%T#5lHdQ^7jSqAP]eiu[nSm.TU9+rTS&*T7I5!tSJ^F17\5#\3;FAn4U%nDNp&Ua3glrjXd"<s<;)J?jVXt^s&IZ^X1,ei-099>X3\r%6/(O+M-&"95Nl6jP#q/ZG?85l.@r+[UEq09:g;$Z?B.*,kEeB=6V;h5hTKr:N1&Da@;2QjcPFU+K$lV1oVM(DD1lHPEXHD%)H+>A\r%cM5TnTd.,h:Cn<ad7r9L8;X7B]#NsB;\6+X5HF"ccdgL^2)0_4#`r=RcU%>u@s%I:B;?4EFMEJu[e&cd0rd<2$3FB_);')-'Eg;h\r%bK3'.9gPH4N<c:&B\bV.+B;_^"B6g%%T6l8+K4.g"[T/aN@=qg1l''bI?G1D$A-"D7jNX4$Q;tD0tIH`&>lUI.6PAkX"i_R;WHDs\r%qFaq*hPHj0V&!CkOK)YI25WLj;D>lS*Mgi9Jj;+@*5$Gqf4666JN!`5f?%:0;f::o?";CLLRs)?E:6OR>%)*p%ljeZ&D];O]I=+i\r%O,nfp^d:>[j!k2.+M]?_cU$KkA2LKA-ddp7P/0#7&(-@I"[V&1?-IP%TcaX/s2:=WTTWNL*!G+4"Lqh$3=*8H#T?KqJ:Pm26%Dai\r%N.;p]THHM>&.?aON.QT*M[Kc@2[*V%ELICA6.M5q%K^PUJfqXE&/J+ShNfBc'SQ9XC]VU<&-YAE)K9^.GZ,0$>\Yf("JE6$bt:M<\r%h>0+D.0p\I'N6*o?P_!g8jOm3g-,r6E@6OaARH!H:_6=s**XN*^P`b9;ODo+!9`olki43faJJ.]"Jd/*B4RTd^mfp@R`!<<6#^+<\r%kk]6$'EgPu1<2[gm`@F:#abfYa$JWX5mYP3TVN^g^G<hqi(ZL&lWCZ/4)D;lk9XB>*Oa\\1_VOK*B+=W/L/fB5Jp#X3(VY"e)gpa\r%@]@\C0oMT_^e>!YiC.oNFp`hbfqi^#GZ,/-95T]A&D&?:7r]IOiD;*kW$r">UH$:[TVio'd@\L74F96+MRu[rTMD*A+<V8;nu[2d\r%RP.t,UY^USGgq%cqMD.o3d7Wn>r4+IU/.lHHTh?Rm.'m"&DrkHKtKVL#%%1$mb3p#nuUTkXIM1UhH&7)gSNbEGAZhkWBQHl"e1N'\r%Bq'9M+(mR(bl4$GK-KiegDlmk58Y=SqWV0B[P'T)?aXlJlMQ+uL?MNV2PY5fVkl,Z<3S(&RD)YP[eauld_.)7?5i^HH2=(C3%k<t\r%D&=X+<,DJ?abYia6,_l>g'o!m:@8qOklSi&Eo`;W?j>+dCF7C.6!"B)#\^[7"*KkWP9g="!8[U>'F?q[pSp=0P0gOZ]';iM&O]Sq\r%+&nJ:FAhW9VD&4#Z:!5\bj57(950pObFZSjfs1*#N7#J5RS$OCQJgp=g0>73.p4k/n*0/5$KkQVTF,hI?\W<W"P#^L\oFX['dTag\r%fC?8P552UC#WiYuE?^lJL+7%lW\J+/pUIB@TkC#$(aEEH[bK50eMNWA-$E"XpL!jODOkei$"Yj>_n?R0r`UkNLMKuUH$[;"?&:'0\r%/bS*ZGR.t'ZOme$:*[<(V]%3`,p#$PhB$ug#Bd^7@t/cT)Dc]i7if!)eX1pdYs;/J</hdJ;^)EF'2Lu=*@M%lidn#j/1:i+SUEVZ\r%OkBXjMBqf8.hdZQ&VYb,@U:_kN[P#ro\5PkKgH>=qT0_t>gD4bAb-?cUU`qfXZE2EZGAX^Ya@#2ZC-n/=Ld!c"CXh;/6lR4/QCtd\r%KaW9;]VJ184cG8&c@Jh3Yq7NkU2q'dPqE(X7$Q+'(T2k`9:*\s:o'"T^P!LXWhqS*-s^X7n8Q96iNIna?/0XN64"H^g@DqI%67[X\r%a?@Ta0)G%e01WRYDT5l6p_W64oDCc7%8'n4H:dP22$<K*F-UuEcAP<eqPR_`32:#q%0lb8H?:4O0%Ka*:(I5cnA>84]'-DQ(6\Qd\r%^0H`Jh0%sXdeYE<;HY7QE`KX`kniL@cZ[E=DgK4j$s2Ii"9QaY>t*!1rFuf)MS=#Nc!Og<8!c^Xa6sK0m<N9WbB'7?$UAE//b=ul\r%[mlKqj[Q&B-h.X!E"5Y3q'mG_er2+<Z)ILiJ0c+l$;IQdo>FaW2Q*/`qs'oK\n'u:Y]XtM)"UJGDQ\(Fl8EZQXgb/aHb4h(OI#2!\r%8_o]-\C.RIPGd#?s*<&I8=Hm.4QkiE2\QXPjFrcBal#:>^j2WLF#%J38C5"GdQ&2TP(VqOP0V2-kC2@%:sq?AHmK$C$RM@-JJm>&\r%H(h$T1?aS=O;CMM-R4EuH(h$T15=sA:gPR7S.)ul)=g,-:]XXt+`)&X&%;k?mD=S4KYcgtT]q;<af&D0O0&_@5?<:30.!4Dku;(4\r%jDad-iS4R=\M]%]8L/Ca8j'MT`;,9D#:'iX@haIYJ9Yh)`Fo8%!V+[4`Mbu%5^7#VG.IiR*=u!uLfAoiJ9Yi$'Vb\.1DAK!!7_,?\r%e<'\s!N6KaVq.K*KRi?<G\TO?!`TEC;[[\tl@=+or/$O<WoLqbe,gY`3Zt"4X^a2<l@<Z>ROh#=W".ID_<8c>:qbH[^50^F*kii'\r%n#q%Jm63C^Y9)X%?,Ka-8??kl+m@RobQp.T[7A8,c*P344DV2.\dhoAkZs_sB#F4&&ukh&41hWE*fMTsp7KOXM`\-<`aRkL`H]C:\r%N45XibdON%TC?n?l)>@p(<sI[d6?bMbjt*=)tFm\P$Mr#CFqZd9<>S%kV9@R2t$Kfl`p#n#CY+1qKVaJLoU;F&6VO.V#!arD$k.?\r%-f(c'Au+juh@d(W_^N!/UAa5Rc\u,#hS[jFf+b14[/B!@%taV*`W.1VQY@B>demU&U/4!CJA=C(LOa^6M1@Pf!gj!lPNP-M\V:d(\r%8./uaAPT&3q>04l:52<O=Y/!=dgpYjU=(GK#8dIe`F%q"R![Z"XFu@[2Tbdma(cHik.sJ)](`b2#l0B8ZmKic&b6`Pn>t]5,33+P\r%TYJ>i7EAi3RI#%('HqsgVG9>r_h<*#:EHOj*0?ZH+.]'c\m@_tDf(]a-ldeaV9D<'S`G*]md',2o[B!b^\<m49S;*KGkLK7MG\9>\r%mF#.g%HW<nBC7H4k-:WPj!aNR9ZhF/\IEb6r)(A+abb%rQI@On;`Gmg\UbA(Hpi1C><hr:P%,GnJVeE"PojCOSat$>C3"OQK=a[o\r%0K5"?2qT2[b@bJ!lr97gf4TkR-:`\\&4://3>tkMN]T^pRil0>GK?Fp]I!kY==",nX%npGaImFa^E5),HNBt2';ujcj>fRMDbrAV\r%q`]9tHpHL;XjK4+M%?O(3f.ChYUlGbfX7RjN<)<#Tlf23@u%/'BdUKGS_H7)TBO"K`s[<K=VqR6R])7X:!;/_O[a)KOQpk&G(7Q4\r%P(NQ:s!F!FMN:S4iZX@J6/JXIVLYG&&1MV:8Jn%[OE+YYTT9XI.i2K]<'J1YoP`s-mAEjGA]R=GC1-o<8bYsI7+0o`A+?D]M0M:S\r%mbnN[N=AHsrd)h(_JLSH@Bh2>cS#X@m7sDYHqhGFQ\B@?U3h=fJq)$Z7%Jkb6f!Oklb^,<GCt"6-O.1]*Zq&!IGC0!rGHLJ3P"nM\r%>d<"[(@sV^CS7a6oc"4V'.LWFMf6c*qt2!GMLoN*MYmQfj#Wese3I0lY>]69J:Y!XAYh4'\NqAY8-lT>KE6d/`40<16F>b>g$Qg_\r%UVHVJ@+l-b?cctH,d8Aj:.Q]6U9"6sGpWtoq]W!9_JP.gL)BX%fNVfG(I`+rC"($pTPeo017/)>CN%=1KsMNop6P!N<uYDe9&Vel\r%BQ.[hnN/gI-;120V75K/,+Q_9>'bhg@)U,J]eeXmMr\A[jIIF!oXhJJfA?,K+*k?b'3g""S(?R%a?,rfBL)#Q6/DpdShh/C*B]If\r%EZ>#*7Eih7+e7a?#P&A9#pD\Q"`UHGpZ;V+^H9J+Fda$rH#sYBE0T??jP?C3oW]P-0%U-o5"*rbfe-qmV@5qg\K$0Z/-%nP$RB:+\r%Zr>B?cmR3bm;]sq*Gq.dV8m^(oqXl@Bln)m5#[t;BQn-tA?lPHTcT]c)`"?82ctRgkDMB#eHZn"5$jGZ/+WAf.'M-\j3&FPh:()D\r%`ZK8?>=F8OWTV<,9oa'+ZSXtPcF0!(!Y9ZHf4\=_AuF*YU.VPKXc7#U%i5b-06'+n)($C+\#o/Q%g*>ncFM'a7cu(&49T)m/0c2;\r%2ZNsmn.>!Vn.=5eW0&LF_aE)T@q"=>YVah@DkZ,5E+_ZP6cMK$dA0LhKnkEhfRKU56f:!IeX#1R+YXm&&@p^B.d1:t)S+fMLd*U@\r%49WBo@"LI>49YUf;@kqnDX(WtkkKF3>:2*G_I,cbMMK!T*7!IP'+^eu-&%;5i1?:rXV%\cGUReBgsj.t9UL&1S)+Yb%tQB.Fla,G\r%%tW[NHC`7d%ro.B=/+U07qc>fMO?DR+GPi1^i0RC"4%PinX<$Dc<b[u[gqkJ6S=EM*[4PEK875Q/U1;K_F&QHYmKn23iSCf&`)sg\r%3`I*&@ri3#Nd(i^,`?CIeTbbP#[ABbe*,cL+\^c^R!8o']sA?L_t2`YQ/?Q<Q-P0<qot\oqc,BIIX]8`H\]m12:n>SH\Xbt<_m!L\r%hE0Z5kjH(P]Q`G$1D]GMm^Vjd>C=)->0"dZd!0p+O:jM-GN!i99Kijp#RJP!8!dI#e9_FaO0fe01usQ6oZ>s41e34g9OefOQ;>nq\r%8VASJnp5*]OQ+_Zs'/c]VjU3M6C7,bb)A])8Q^f;qDW3^b^03?=pAWD*o;>58A4&k\::DJBlk']bdl@GU3!OjV74`j`UpD0\S]'&\r%TJc:?&T4-dZg-S9]'?`U0!OcP'6TaGGMpS(9lQ(h`%)!"<t[p$GborL9'BF"d&nK#=0a*$Oi/bI[@?(TS^Q-N?pV%s0sPIHWMW'F\r%S*fiKYM0L4.G:8+:Cn45'b^rgG*\fRnRcOaCR+#6q*E:6jO]"bW`6WW2Hp5!?5e,bA[fc2F05j!544V7a2L\AK?Cc/K"Z"?]n8pQ\r%BjAE;S9%MdS([kE^WfKW4bH;+<58]^(&&&G;PHdiPC>Vc*ro;Nkuq,^PFX<$AnP`aN79`LDKIa,58Mj+K\eeo(C/g/4XlGkJ/=4@\r%0eKQb4*+++6H^MEhEfI33%]d4Hfrq)kNfhQRB^5mhGjfA8@T+kKY,ud6Q3M!42"'ln*[*^;r7I&e^B:o/fbi(!mX`T.6:smiAOKn\r%VW]i`,fb0[2arMI5+SQ$Y*J5JB2FTZSYpL,FFqS\T#sdT3U#.T4h&toerH5o;g7/&1u3doT#sdTq=%g_KG90B>kEmKBt=OI:$8_D\r%"HcR14[,?29i"Fe9VhoaVfKLM:J?L8D[<W<7[7<u\FG;<<4o!IFe6`MD&A;FYSqGim=nZbE#W`*l[[90\;`G=H@LKVf(=E9NAnL-\r%XX6YqfQ\W[%ru?riCaiSp4;D+^>.kMgnq'X8RW\3<5V[MEe[3\S*a!!bKs"Yi(8g2:/e.&U-.V<Y]10;M/LML8o2sPg-!pA-g3>i\r%P["6k@u4dlm7fiXA?^LbQ:)5=e((i%_arU#pc%DE*@%#IqW0q1KjNA098S,DNot&R/e?@P5?[D4TV7Z;X6ssP]lePLG4&pF)g$*$\r%.CG)*d`h`jaO_6N%aoe28@YdN8W`6rK[*l\Tt42n[lYYKkN1OdTbB.oV71?7,m$&\?B#WX0`nopTef#d`sClae4JTdG`:s,55]Tf\r%=Ae!2!]K7-=&Rs2>*jlN2Eeh2=^)(ITHY5FJu9IY!#7B+*D`Q:%8[WJ"cYOVhucp]j&>1.q\%][nCn,oTA\"Mhl_#k]EmrT*AU]F\r%]+@7!cmp1(*],b#A.f4f&E!@;ek]6[2IF4V.io5orM=BnIWUK,Rr[DMSX7Xe7qnX`2E*hrNh'`d_shSBW;_apM)ffAlJPLB_,%hM\r%"@CH5`/;;dS&5AihOB+QStP0Im%rm_(3brQ``*ie!T>IL"K-F9g:o#+mLmJ-H>]SuL+/T7JG^.l/UeYj`k,)C`3_\b`7Gim#3_q0\r%6['iH[n>U>5=qmm^rP$01:W>S$rZ"Fd)fJ,/4b'1'UT6gDU0n&=0T'"Ql@1!%:X]>39oRtSiTilHtp>?<0),6QTM0YZ;?S>ZXI[!\r%>c9dn[,em^5IFr]KE`4g/+`/A)Hb?i8e[IjHl?*68($K8?uB@4o>GKYE"AL%brp?\iB[Wp\H<ip.aaIS$G+5@,&[!Mi.[qpR*rlP\r%h<1Wcb?IfZ2DAp_A>>nM):R"#o1_,(\i]-%o8%;)_n"<`,J#=llh#.5\#I1ik$[\jWTV<H9qRcX_;GbKUJ9=gKDqg6%'3ri5^ua*\r%#0oD$TIr['Y'"TfFf`fCE6Ht$I=4Qt7m8j@O2Q&Ch<J]rjQqXE[dMmg]?T[K>31NlV5tPKVn.*/]))`rPF,a!c$JjL/:-mc/PgG$\r%WHoRSOpu[UAt!J=Aj)mmkB#=Y&@GIRNl((snr'(P5T4NIG!"G+Gs*pVQ:A>l@KY=u+3'aRJkmpO*Sjl#p6R_V$,r-gr];d)G"BfK\r%T9j/<UC1:WYMb98^0AkI:WR[c$4cqnoH>c('_\tu>M@,ki<+gJdD%ZH#n=M#415!=-f33c=?VCE[^GIDpZ_cba\U$d.D@\2]=Sk(\r%FD?;C,Dka`,P7Vu3@]+UWQ=AY8f:C0gj]$tA^n2d6o"qROfQQuC%jZ.;UkW[f<Z;00ebV1U3/mVQubLfkeoY]5p+Hgaj@^ES]+L5\r%3!3P1W1XYZqO@`dE;)6]a$*<c+)pu!NdYll%D$$kW1X[[G8!7*0C1$1@3;<8Ah-:WI=Q)a&GCZ,n!+Ua^f2cQ)go+unUT=-!g9,K\r%<#Ul6%p'S8Aiu)S4R@cC2renbiX+IR4H<H)4ND)E5HIoZR_8IYrmQIoI8o+\DCNt.5KCW(62(`hqgnD;)=q<dB@&-Q]J+T<=D:e'\r%aA3OY5a3:t3cp>b1Y0[K[Ic^+o0&M9-X2%5g>L2;,Wq.k4!_7s,hq7V@jK1P=Q_Z<g[VL<dHubO[@Xn0X>FsOK0SR?r[fam_!:R=\r%a*TO;<f.h"`rq\NU@Rqi]D[sbMQ"aW=u'#m!jFX@(H?JW](E5<\^q[ia\/X0#Q=fIml+Ehet_&%Z`oHqj]Easrjg62H@Xh?>@'a.\r%J)rW#?.Y$3+`)LN&bV^VoQ'n@FmV+=<i:qPk?fb)?JkS@dr2V;oKTU,/LPnof[Zd%J#`NLpVI]<F+:-Z@r6iY^(?r\F,i=OW80bN\r%SshQ-p!i0Lf[DuR5h"^H&I#d0lDg?Kds1oa2![&3(VeJUn,AIIQC:e@nuskj+jorXK,;j&(kT52\b3TqH8)htTeGQSYu#p_pWP->\r%X(MA,H"j.Q808_+dT_d9rQ9'?:]hpcC"$o^?<1GEjJ)H2HMLT+%deR'Ka%3ah]aoDNuR;t[%Nu`;(nbA<cl@;?MV4eCL#Cj5_7a-\r%^9@PsrVis#mb5)DiDI4qG(2,5Ij,j&m.L8`X!uN]Akj8]B%hmk6Vt62&guShM?`sDc'PU';/a9d4DI#BrC$#="(E;S]mhR=&&Nsh\r%c^>$s7YB(e$4RN?AjH6L#E@lWU<G_*2];h1pVX533Jn9lPSk6@g>j]sO>tM+K5dm'@:gbf>FM>$6e-Du[PWbu'Z<gaBoXe<0IOD)\r%;jng][&&3.X*/<;/PT`;>&7oOSj'*'+/\%0a:PT#."NH.R2-Jg6e?0KSQR9E'K12bh[)`8i$T0V<!oP+"uT_$IPc-mo0YfgJfq:I\r%N#Dli7m]0&FLQiIe_rR*[4_ZmqWBb6F;0BU#_JYpDD8rq*nU'DoIQuW_`:Gt1rYmfWRo>XP#Kp#ehlZpF^OR$qa`,nOWNq=fNE4f\r%+C$uYc5kD_V)6>qXn8jm,(fr2JNrsk<0Z/#K6[gBeSRfKHpp*Q'F;GiB*$[O29lYBkLl5"cT]YX-F^u'>0!",G%?RM>UT,0fm.<N\r%-f^3nA`oJ\.u<hs](DXWFS;\4Fm1])@C;n*eYUUA<LNQ&WOh_i\d!d8":(HbW=.5[D5o5%B?hddZ9cP01Ne6U8=QVPT;bIK!hW-9\r%V9dYF*+%>u?2A^XoTB8R`d?kfUrGF`%^5o:&7).c9QGhJ/EE<<$=d3%ncg-Kg]"h9m]!eiRCY\T?$+k><sK<rUS;)!_\?_h6II#%\r%"a2%\OJrWbQF*X&oU3:0p1[HJkqdI)k:fW1/q%rk_WiCAeYUUAjhr*FOK&,\iJeL]lG>(_D5o4:VQO)OdA?-VBBhfi&oFX$IASXF\r%@aqBgoU3;S\KA!-%P'TM?U?X)@7>rPId0m<qQV3N_GI/qdZ4ig,D%gR(FSJ0qk_c>c,oEh)P\G%s/S>JC8olDqJ'eDCh=<DInD1(\r%\dh[YE[08KDsXTb\(,V"22/e>=$#Br[hkNe6Y@ulF[!,0gs`A(<M,OV#LSE7m,].8^5c_"s1=6@O#@meSRa!kX4Pgb9f/,"k$=C$\r%)?Qo)J9Zr-L`t,W#:usMWch9p]5gp;/Y??U3.8%)-8BuX+aWR/M/\T2Yd1kQM>mG6BInh;=OBG/mE!^KEjZIqH=()%L,-jGG4EPu\r%BleWhQ://nl1+.VesgM6+,q5AL!J'()-T-'p4"Ii.JMTKFmPcPV0CX>LmB)CnO`PM;(.F`>0dm9*pV5BIb$#+QR'!5MW]/3b]hl&\r%g:kmTDSOM!dgso3L"Ss%q_4W3;0*@.kX6,pU#p!^GRFtU@qD-dU7@&)SLXW0+#ko9-kQA9[ssB0,%rso3PI2&\25jD..&o_Zd%FD\r%1K#@n$Q8F_nXr/B1EZg_%gBhB!<HuA%gCr?:.Tqlq_B:%C4MZQZ'.dSWqAD0CZmNr]uVe4'F90mK[CO2Tg4PidS6MbIPlO/FgVcd\r%)&/VC=7Z1X1=A,9W7Dp.<ohp4-k"W-E;r+6pfmO82#^RY's%$uGILaJjf"'k)S0M$$6;(qDWpHA!H7PjX?#qF*[7<.kpXg?j0jkZ\r%3^i.G>/FQ+LM0R5L"uiRH_:%<q*lfGk"lVg[paT`f;cHV-/?(R=BBg_]^[&+O-MKgdh/5q4;FD0E^W3<.QZ>ukCnNW<-3)=n^)CW\r%M@So^DC>cd70b=O%o)5jkZiHMgcuI_U-iRcMl-)IF93gakHF(l.uf=]o2g$1_=GrpreaG^3KAf=.QYXCj.Y`8'cf9FH"]6g70hX-\r%*h(A]d:'49#>OBbk[6o#F&^a?9)A-1PCD350AXTQI:u.;[[LiDbf<'Cb%!>gTnZta"9tn%in6$XTh6l'G'-S0*9NbO)2>:KcEgp[\r%]:p9!mBH0QSIK(PW!:8KU[!I&Cm`uL"Q(hm(T(ILH-_5i@G45>%6[oL>YI69J_):do$)KdPC>'sE6#=QeJB"__O2uhUKmFDZ`3-.\r%[=XW&Q5!+g4-D5JMUAGfEAXn[q3-[QjG3b$DZ4t,_-MnI;?ON%#SFLEpKIEZ,:uR6UC6U?99(;SRCTKS::UZh`sth1DEB_dHeD<G\r%Z;Pj4HPQLYK;./8:pT]:GIKjn^DGMcJ?)U@8@Mh'&_^Lor;Rb1*@\PsHS3!ZI'C01r,l2tW@Z#oDn#C,(2CIQ_])&XQYF$18UB>@\r%ELG="h*]&@`$H^5@aUh%N`MOoP.8_Q(Hms4N$L$>g9.\t_ardm:ttNS-1<+^ke2W&%_V>I8R-UUeU?ftE'NPbQlRiELt[m?Yn3).\r%Y)GA(FZ^.W't>T13BkD\SN.Zn&sla>0r^rP8R,j;(O@_e8R)i"OC1iC$;(Jt9B,dq:]YhfEW&no;6m>Q>8!8On?B2(.>`t6#YL5t\r%7EOkjP'HJHN]R@br[T-<EFFEbI^hJ<$DPu$.1_]/_FHAo^9rAbC#Q!q^s$>VIJ\;TjQjWs?g;R*2sod+<FtqA_.oCdS<qTg"&(fQ\r%h65(JolZ/(F?-/bSn7Q]o,!3GfIfgnEHW./EinCXT`-k>DbG:MnML+:NB\Dihqn$mRD\?V]e!en9i5UIOZ"iH]5Qp0Ka,lZdqtRR\r%qk6feUGQ!#LD&ElRZ#Z^pN.qa0`@7`e:+PR%X+uEb<$Z.[5#;N-aJptcO(6bs4BYs8=UD=U?3[R^kbfQ7,ZodF%kBr+r(YD+:_9?\r%O-'JUKAdA=D$`JG&c0gHOT:1S&;MZi<'\BP3(-:<TE$/?m$.l$M>pH1r_RrQ;IZbkU[g17247,#bMN!93r31HhY6>`-!`Q=:&GoN\r%-Z>cOUZpfqXUpHG1oOBZT2YKP2+o#O!(EL/g*hcN1r?&.D,<%C@,N!egBa:l48</Z8UXPBSF--4X'OJZ_D2NN%F>dZZKSu;9fVt^\r%G[*rS_]oY[P!]c_RCXf+Qpr!(#QRS?>Rfl/HQgSSa41CBh.RA+NN6(9c#GV:P#V:i1od>nYL>RV$"OoT1WUVO=#3Whm>iM=`FROo\r%ro2^J)UeNHW[c'G[=Kn3:ibURl\)V5F'V[<Wh"DR)W@kr=;iUsNL^oLRIO1$lXuXtGReM8?MjLH7W)oc1c-,`RJ$i66a.*m1KCM-\r%(b=\G>_B[rs-/e6imL^i9qs(dO?hYIq]eoQ9ooMrfL3k,IJ206!@&(PPI'9jW!R.kSZ\r>QoR!45V.b-i\5[uOI#"uo$CjK$pZZ2\r%k$QtjU0dat>#ojmO%-S_7`+HU7"80`_ZI[4_Pn@7q't5+f.*Vd=B)u>i9XscT]SE?h-mf)2lE8aqs%(P4ri^oca?_Tll.\\Dn4<l\r%W8#B6[GIA#m-OjJGqHFk9\l#0GXJ02:7bcZ^%nHg2)Ha:T1sLd'1?S^+u'kTCh6btZA>K9oW9[s)n/WU?h2I2*Vlq/TA;p;G,O,A\r%;aE3nl'R82Dk)E:8C'\GdS:(HLrXKS'Ce?B3:p])id!7N.Unp0M3u";rCJGLC%`[JG![r6U5F,$`;pJZ&"fKJ@-mHG8/DXK0LY/W\r%Ko8DYjsXNrFtHd93;CkR%p-@#'5QBg@7_7^`Z;=+_8WD!)qUq0f"utb9'J[-.Ek98d("$<)reXr(oh[4ShHd0(G&h8ClY1:KnQga\r%hMVbWK/[LsL2Rs"[./(d0BEXB[>nF2Vt@_!Dq6S-JLkmHVYe_iWRm$!]cHq21f=LaHRW9b92SG?<^#?Mh<X^N[%<V&b56N<.8Y30\r%@82=DT!8WK6oP\[?(U^m0D571Bjq^11\Ri@Mq$.0>2Gm4d3:O2R3W+]>9:+"&"[5<D0a@&4I&6CT(;uQQ]$#G=6c_hCE@7q)n8$F\r%5fA147(gu1%n)@(Y1o*6GiOT:WQMt1K<%0G8QGbL)-^`a^8sNXe!RBdZ-k""&N45DpFXmW,i"b!7*jEma2X)#;=lg[9T>Gb8!bS/\r%:=*;&9P\W,FTXc7^=3HJFb@#:FFA6/2QDKeT`hG9co4!NhPkGgW#J@7EBn[,Y/O(_@okVI8B[%WeIB_Iqro%`l3<dqC,[!C\e.>j\r%`LWp<_)#,VN!t#TKC0OjOs#0_#!BR?XVm.Y)4^BdhO<EUQjN%TU_5TKQC=G&2;p3)lmp;#5G";pk8NSn.n@XK@%h9)&iKs]`3SR^\r%9,hdtkL#ZB\jCFLD$J=D!ihK23F5ZM\TqN6nd_hfXIfu"%<KmZ0;i:9dJa-Zn(41On':\KdHu1YJ*`MWk:BJ`KtAtX%a''UNOM46\r%qgH$RT&.nIX)-.-LZ;(a*@:<ITs%">WuR-Um"FFA>ifppTe"e\\B6eojM=j9>%7gWfXJ4YS'e,P9u%8FLuArUP=Q/dbb^Z`c\p3F\r%rJTB)q/.Y=0:b=oAl&6qgp![2Q>5[&3;[lggWLsn@U!Fl#.,4W$\tC+"4%d@!Mb2*7<"5`$lB-f0+p\=&H$OQl9AYjE4e^QW<S:_\r%NYc,B&,C`Q4P4n@+ArXc"WT/s2jF&edIK(8Br3p7GL="U)MSeSXM%<6O%_B<'QC]U&H)flhSu@eGCRoMg?!<!]g"Te/P,KBgc4c4\r%>KqZU`DK57+sZ@ND7jQ^HBuh7M4lVSJ@OC@nG0s&!rA(q\H)^_^:k/0J9+]*:k4'CkpT4J+9C/_lXWVT5X:81<,6qA+Q/KZ8-<`?\r%8cNKhAPAu>s"a$kV+;7fWr<YG6nLEBTaZ=!J9Q403\;O^!.D-]*NT2--?/u?(`8(lNR0go9qpZq9jnrS6Z2mL5_[25lOPWuTX%H6\r%NdRdU9!b9L3X$=aqY2c;r$\u&M'-gg+Hff3D-4kF"jHuaVMAsUgGDkpYEsH]r`MriZF_,b&/G2>!a;OQca3Yl<5@)H<bg.[^+*HO\r%ErZ':J*=R"EW9E,=tH+!p$,"XQua9F`+(gEZ1'Wj1EO^sl3^=./.0!uN4OmrUX_-r;pNKdIpSnA@9:aQX4sIo&f^<U7:#/D2SEV>\r%`6Ydcj#36^^CE?c6oirQIG2HQ_/W:!ZWm8ABcgS/"]dj:g1PeKC*.gL#?F&1g;dnkc!m#C&0*_G$sh2*%OrUB@-FhmjG$#d]DM.8\r%Blb&Nd<eeaMWFqF)L1WsF%]n],E&<I3=I@q&/+3nqi\jq:_93@#hU4,9,X5D^BOVA'ti^F>T<-$3>'`Q/W$Yc/e-0%o9P!7<[g/o\r%-Y][nV34\a*AboamgumZMRM/TMSmZBmJ9eI"`8J+j>c(U_,`;&?(.-F[TM_,F[%b%!NJ[OM9DGh1Kc+rnC]KR68#VKk;E;8QZEl_\r%Y?m=IQX^,/QT$tOE<Dl?*sOdPEW0ooq3I1R#KdSpG`#M<>%`WYijG/dU-qf6/*IoKLeu>+WHk[2RC'-'6b^8m>CU#Q[@ukPF1-AA\r%n7[kr*7'dMV5DEbMiE+rkYK05QuDCLnh!ltg,q.2bUPOtK,pss1TT;qN5rSuD[nN#g'2bt*ta&7%m`91?:9HO,U%@BR;I/0put::\r%i+'CJl==8V*BOctjc.a:_o^QiIj57^1Isr8f2g$N[_%n]7<Ghk"E'Qe]5U-o#GcLs%qY"bkg\;$I2lmJn!_i9lp7qqhS=EMZe1Fe\r%,r5]dq8><SFCf\.E5I#r7L1u&Xb,aI!LMPZ`sX$JBMD7Rjn?Z.)n,`(0dBA+VIkVMdnb(=3'?dR-3W*Zr=gFY*1*;!>\c*[$WUQ4\r%&9-F060hX_&9.PE!S';3#WTOTZ)9N+#WTDDp6rLUL*#6hY[6Ij?CWl,g;=R_Gi"1117l)YFJ=e6=>)JK?*K%U,&sJO1TqQh/QQ&?\r%DbBb8Qm+$Wqs7"CSN^KFl+(!"V$Gj@]Bah9mmH>f$iSJV>^C0HVu`<5a5Monq-lr,8c=9ZqGCEWoCgiL*c_1(0Zu9@ZV+l+phR#^\r%G9ZtePhITE:?o%4U%7XDd)UJfd!U#3j-nE+kn!^6DWj\>A@o+.h#oGpT:P5P'1DkA:@>I[>MIZa.im62*ef+Y*spQ2p6)VWVR9ht\r%'EZ]9$r/i]'EV1lj>fb^;$`K@"=FV/,74HlGs#I?*)Qu,ddqu4`;-)<5`9p'&3-Bqn0c4e=ND#,T^Ihp3%T_QKj_b-F55%oRc24'\r%3HZYB@3ODNJGl`LLP:]/HD4iA^/@%]*X5"U#b:_prj"fX^P"KrA7X;H3\5s?F-]DVE/'(Nb!jXCY_Ii_-j33C`<eoiLdFp",H`^'\r%N[TRqA7FchDj_HBXf!LY00<Rc9)Y5,L<MH@OmY]J>=u9OchX:H.]=VZ.Kh.&HsYU1ATT>RiS&0Jl5fnHh7s30;Y*3kGbPasO6CaL\r%<:bIQ&CBm1\):2$!6@4IJjM`Q"[bTg.1-*%I)-JR85TY](N/b'B0mb$-AJTU"HFl5oN/\5#d,S/`:gB3,ahG77@%,:-1%)#(OqI;\r%Z%^6)&CiR8/;9AN(Xk<L&g6N0@HB]endddFX3^Vg!,HJGJc8W`[=S'[2bSDi)aq3;Q=ncgQqu,Yj[;.hUX$SnO8Eojj(Req:hFLe\r%aVsAEqTdY[hl7plfbuDN^g1Q5mTE63K,_,jHMkn52pm%G7PlW:0WVOkDnjD"FS;j8_rY%1SQRsi^:^SNUUT+7mB-ni0&\7>A9L#>\r%U_sWM50bkO;*A]LYUeV%-_C"s!6XV[Z!)))kKE*n2mt@ul<gr=_hci?F*m\Xp3>jp[]p`o57F5&YR]1h,4/LWT>sC//EbSkH3d=-\r%j_eF^Q7f=#Nn$+(,4o3Y(oq*:_NBl/r,]MilshnmqbR`lr=Ht`*&_h'$tZN[0iS6).>4rEa&%cKJ*GhR`Ur]"g(d(!gNKQ'cSV,p\r%WTq]LKRd;']=Yd<^,D:A>:eP#8)g2Cs3]W@,**polaa=h_ckc%mf/G1mT9R<juU/`1\dJ!3-?ON9\'5j]/^EWGtb(f=?8@8A@`6,\r%r!%<U*Qp(a*o!9V@RnYB/SN2<hZ8#^C<+6Gf62="bid[=,J"m+1/_sZF;pD5Dt#17pq;6m4g3'gGVh05HL;HPWGS-RP[nOR5=WGc\r%Ag(*j2+GT_Af6_^8nm7G%.f8`pr4*[agd>Oe93<+m7)TsqhUmm"8g2fklu#g)0K#3(f3A&<6N;b4W3b+;#mVqHSS+d/*O]]?("(Q\r%@I4H$%bQsW6ioW]'`El)aKsLi.uKqBag[!3BYJR?qIL%@j&,.,kpKrDjo%pWRC[t@ii6p5#@gam<YC*"FU%\sO1N`/?(Uo4Y&<Og\r%f[CnT]!6Wlri)\gefg<iJXn;UI1opZ-5/5O<Sc;OHKXr1+*Bs9L14(?fQG)i!)8d!kb<"jW#Ki<Kjj4eW#J]qqrjO<HPMlW;)`j"\r%Wt'7sh2Mmo8i&N-G\0mic4sJC"Y6eFqHGc^EYA:\_TDu@+`*g_n;oR)=u3["(,kA*js=kLL!@n`&UZt7/Lk0RY\AGN@7/nR7`%VE\r%VB:_g4]E*o8a((@QW;.0:/o"[YmfYr3HSOI.^7M@S6'RbY4$_GB^cB#F=#h7%XU`$>kR>*E]dM^cJp)H_A9^=4@IA9*(euV0:9R9\r%5Td"J!!tcC3N6@mm6S>0#X5Lq9Te)OT+5H8;":QV/K/#1\[?+09]87LC=3k,3:;CiWpT!)]1&L?,mB/<UR7FrSbCho7!"G43cn'>\r%keq1a)5;!^1\g<Xbn,$PRTATYG\2cC:!BPMN-$j3oFj$r\-nZI8hi&Qf.kF9)>]1-V"gm$B':USeGMqMR2PjX)*t'gR5qnYUn=$Z\r%I:@jc1\;>:OI&?s1IGMKUY:lWB#]=0L*X*sA7gSQ,R=3VZnjN1'/Nh4MH`$`h0jtN/Lb=Ekj*8Z0uUI)ju+rHcT^I7%/n*Q&9MW!\r%B';[BTjB0[B':USFJ98ibRFHg$sI)<B4bO\B&Bt,&_m@Qcs)$8@`Gsqd*4[=-_c=GT?3])`!iHcaA3PNR2PjX);)JT-X89e:$?JR\r%d"UAC.4/<4->)o1iP$/Z&`(OXW=6@:5<Gfo?<,c-Aq6XI4#95g0nUA"PVY,f'/Q:4BP1r@-YD;nB:K2PR$c8Ah-Ar,XV3M@T4opk\r%HuW,%AeGbV>tf]Ke+nH,3%iGsWt2%1C3GTNg7$rLs(>0Rd.9r-U,8%8qo7L8G["GZ<CQdC?0R;dhd19Ad$\m1UfSJ&X7MJ@-_G#D\r%YPP=/lfO*(F6As;ET]42q"&VJe,S<:[!oC0Gj$Cta]j0#6gGhfHTt%+Bo]C_YI.?%'"clgf37Z3<n15Z%Gd;51>F1Vg9#^JH!pr!\r%f^D(GI>4>&r1\k'+JG;mT:u#=a#$n@M%XjZB+Bg/K?ZlV?J9atd5RK;S4"G4h&PjQ//ctX"qj<faf&n7]959FRd*d\"<5uX7B"6H\r%J2YKR$3AQ:<Eo#_ZoJ,'GY\VWD7t")Tp%*u$](\r\>Y3PSL489_AoerP#rqL"a&1TG+,qeMn'2R\TonZ-QT1I%N%UMSTLYk3^G$,\r%=1C?V8:>TOluXF!*@[Qu<>YSn;>8OY]B84EmE\KZ9Lpp$2=0si'p"6:8pQNTg?Z1`IS4>*l#f&)`+c#/ehZd\34:%(CBs&6hL/(+\r%]!R!0o6"4_;^8E-Kl>Ab]fpq^^ZNc#TtA`lhpHc=IU2_D&Rh&K<Jc1NNo@X\!3.DnpK]_J["nBNc64c_eHQ_1`=5TP>_UY%D5:^/\r%;m;,9OS\Wl`dr7gTPg'^kCTV761:hBhR\-$>j0iTJEhY]2g+40##kh\\uGQ\`.7-'G\Z^q;ZNg"HLK?(G[`p\5jo_-4iZWt'1@<o\r%![$m%Tp#=Dbo+3=B%DKdLqqhnLN@]gL^8C@GH0+uFl.o9^!hg!5-mZt]QZEK_pK+Wm(EL45rMs.nD5%^6mUVNf2%@;pJ0VV>!-"'\r%*e0-jHhUuM<7"8^Rk8+>hEe:m?Ua%QLZ"$5<tW"-+`g_9QQgJ!6g@U/V]p016Yc@4Yp*ZKhI1__k.V5LHY;g;L#p!8FY^KE$LGID\r%XIDXg7EjUMVlgHKH`+!fZt!O/hE+8rdG9$*H1(m`/oAJqhE`fOqM<YX4.(KFh07h'n'n6P0d%X4pC=\?'S(jehE+si#>U.'p"g"L\r%\%Z;BhYfQ+@\(E_8F5I><NqUnMc_=3G+T[C@c(N'n:.Y#WsS^NKF4@0#u;+#7XP7GQf43L/N,oH60m%ORlX'N38)'b/&*Ao[F?7V\r%.jt%_`8.D?j"U#7@R,INR+8%>bVmPd-X9U"Mk/@3qltEJ1TKh+FpA(?08Mj>OfQ#8)p$NomccuaZ@Qs%J@_R[7>pe%gq)\7XiJTU\r%*pcJ*<ORP#eq.\/OB\.be<W5gKJn;-S]Y\:lMg'#R?g9h=8M"biA=PJ>:mu2EjS>QdS)$A:rf/r!':70SRi=t]Gj=W/&X6#>Ys4h\r%F2]q3eY:#"6A60YW]L)gFR061IAWU&T^2n]IAUZ/U;tuIZ;Pp1n>4dnVB>4]7AWk!%e*4@WYF_e-+\/#@J2,^;=+4?H>lsVT\0'Y\r%f)lDL#K=u<S-s(\^66p(@Ad-BlkDO2L)kB;GYmc))0U\>D[S";rY@OjV@"?_mMPB"Ni0>tSJTR6DX\F5U(=h>PAbVfE`rrk./$i"\r%[h.(DS9`mj)L(MR.E@U5pk]-n?IC'$kk5_bTB+Z#5n8>rUBRLnhNi-`99/D#ZI$<Z`N*Vn1]/iCXesYBQ6GRe[L=_R('gj_\l,8F\r%d8SkR.4%%.fn-Q<"_N<(]^$>:CNo>W('$!qV#gq6.o/C(Gso.%WDmrB,J*[_jW#a7?Q,pddFJD`dp"sAk!*1@^lld-4Z,BfM4Ym;\r%c&J[5ds:d%h;!fOU7h0(K%9%I.Z6h/.?i<aAJ(@)56&_SF0:D1*XaZ)'fY9T+S.=haXYd*8(rB$oD5F+P&MbK9])EaL,W7Hc;d/Q\r%&_:KXq2t!WM_HKY9Ncm+n0(M,R0!X@lj+l`lc0N/((m_G6COu2kGjX'$Z32lS^P_;=XD*HMb27;7+Gc*9NIS+'?n&oBsPn2RR2go\r%<G(KNhFhOG<Hd@f=Hc`s0d230=_1CN$u</k,Kki5A<f/V"a+ifP?"LR_)/9U-ECrcc_4'6r?$CL\Xke/D;d"l7:9?P(bc;)EmDK]\r%j+P6/[0,4aWEg-/8>8^+c'eB>rlij?mA9o\>.)t.Qh:h%9X7::<P`;S.TrV6%]&h$931;\#C3SIP#Zh2C4W/sLm#UAEWIJeF=!^M\r%Ns1]JddM#m+'c+om'pPmX=B!;RFk3IcBj7+31<Q:;n;C1lBC8W_O<SY^#-N[ANKYCqcrp`G2LT7kJrtqqtu[`]E?F!N6d,Do.[0P\r%ZUYn:$F%mm:G29BcuFtJISq%R'jo#;ju?]3ih+FZFqVjG4lL/]&f8^Z!C]-,C:qSZH>Ut$Zp-.NDVl,$9!4T>YG)1m*3RH/mC%=3\r%$o9)L5cl2s6*a$M):o\fHLDf"auKC1REWkB/]W'-pK)KZGC/)ba@bQoFWsV-jH@DkKT&Um`$PEmKqn<O.,5,Q*4b/"Y?8m,fLuQl\r%.PmLJ-33d.g9@CG=LiN)m7GpY>gJHpF//k@hWQZBGW^iQ"sko"p856qcG?/OOS<0NHBbQ"h-B]>/XUFb]SE-2oB%^u">/R-U@t,d\r%CN'$_Us:r.DIP"PRT.1aa01;TB.98T?"+u<GUbhde$li_AdRdO01AN5Yo1i&d1Tm4;A2_P>>*[C4*%_XQc7).Fs!:24/1*68EYYT\r%mVD!hTk@;\1j_hNC]"A&>PbF[-.![&YGiG>8CR;c4BKN8Lbt.d>o?9Xd[Uq;D"/>";t<m*$P2GQ'p;k:^7&tC55YG*qF+C4offaj\r%<=Q&_E6Pp<h!WBnVfE)"c85+ZM@Pn@Q)1BV=W2.sS&/\'[Ddq.8YTNkht[&j-b]Rg4m('g]ja*2g=N=BoA`;@N1Gd15&A_qX;"-L\r%)feh3:/R]0?'44=8TY[SVe#EM0o,a9r.Y.N.ClppqK$FV!rb3n\7p;dFaMKhN+>>`])Sq4.j^B=H.m<FfK;j`JEB`6SVA4L.2#E'\r%KmnI[4`Toe"7Ytp_$RYVW.ATcBbQ'GD&PS9edLb[-h/s@mFb129'Dm.bXmde3Mk'!d(eQuST91+k`HF[M_Xb)\+o+bc)jZ^l$?Cr\r%qsKeN1;*TDS\(WVGZmi9R]29iV'E!h=Z^p3qgM\/,RV\C=dt/F!;^97#5/%!k'EIg+WT4uW>P?PW_[07OW]:*=ag!9AC0r#08lu]\r%)Pi$VTS,?@eWCKk_pMlJ05Dc=#M(Qo,rIsF0+1?(9&\6on!A`@jh,"[\:.S/miohM%lLu:P;<aE0[,EM.%-0uqdl%f:ZBXjj30kd\r%0g]fM+(lWgXN8&"I[k[SM/*R,dD5TiSW]&7Ke9FFB\U"TL,BAW9u7E6!hIH91^S7.$6=+a.Hat5AP4_EaudV@e1OK7TA?f%fnX8f\r%,E3$8qg'24kSL]lfHpL%2QpfgH>k4#?dZSp[bO>u0j0\YZca>:^FX^!dg)hMPmfdoR)-rdPmk1OM#pYjqIMB]@u9[,J%mPs.]<f_\r%FT&KaSY&Q28ps'+Wo>(lK$WF45Xc6VJpg:a!@i]r'KCnr#,hf$J@97m`U.fW!#7eI$L:<6!@i]rPd/KO@t9FZ5,D(5Hj-ICbMuOR\r%4\--WHC4PCc*ae)/JBC1q@%#ob]!.RcTTo%8r`p%JrccW55,&BFUgoKSI76f5g-"n;A(tYMuX[G,;<mT\7^(L#H.nr)Y>BO$r@Ol\r%1fKPf0](L?ZL-8=8=QfIHj$AR6lKZ'q[644Lc!D,J;QUfEBHO;$Eggl*t'5Q0!kYZ;tO'ko'#?jDmLVPYd+g,!lAGt9"_>5IIXe[\r%/3YrjS3i7>>Y.79.MXO@`.$+;:=0.?I5M-m5QSPd:KII=&hh,r.4+6WL)b-(UDY>\k$*rY>Hl.q@%J\3-!jKO1)<U8nP?Y;JCcH$\r%W/lE^M.4SKMXD5HJ:B')<'gM+ia6gWZ5)XWnd%`uM3ma<)m1@+K)?hnri,d\IZT$^^d#5^f+7G5!;M>KJ9DSt06Ome^d$Hn@og))\r%#lN0,:_(R]qK;PGdJUPsh=tEd@rK]k0D].c_\:_CdYA9[>0=k0d^QG<:FhlafZ'4<Tnt+K!!7JT:C0E3JC#3(PsE_=1&P6H9/h@W\r%_Sd)NDP[rcF"2A7KLr;cfoLi5mUqK3[)i&?EtU"Ad8daOFDsUTU#;NCZZG9&]-X.0cau"%rE_XN4fY-Ng..^]C=gWQn=1ZiSD@r8\r%%<ntY`YX0g.dh[FS[s`dKq6c17h%UG$\ruQf4dI;iOXD3b/6nDVEM>1ZTugN-],W/khi:++tbmIONt+c'+*C'nY%N^,3fq_m!F>N\r%#3_e,:V]gXAtLk4!nKAXT1/*C'13kG!3634/Rb!1VT_W,Y6oHUfU08>a^>J33+NXn_"R6!0@_/"eg&GlokpK>cPAkBBP?-CQg,%C\r%/b>gdZ^9D:I%0\k>Z05l2.A6L[pB'g9$,>DkM)56DDBm9#;?#HEt!)$b<bp9Nkni;bMgp2,!*b.6]O>lh.<MUPam,EDqV:OP1_DY\r%?j0a<Y?T"-rm?JuC3Qdo!9BqdaBm9Vp"nYR=b)jr$N5stRb0h"D;!.Fp(G]4dBXa@=Xu)JcQ&/Xls)8tQTH[bGlp,AGe'T4RI`$N\r%O#\?e_Yr>gG1cVf5e&TmE+XcV!g*Hi_uTc!2.oF1E*lWHGE`77_OU].Nc#UH#VrP?S&VB%GZJ6<Lp;qK)EZa4WanDHE+_FT]Mj;Y\r%MM;0E[qTc\iHLYQI368\dd/du`-\C%rM)Vi41]*'HE03Y3Dk(ji2UmtF+WhQ3ZIOY1?1H!-LcG0n)1OV=Dtfun+6alLX8nbe9ct!\r%8uhb@3:EE0Hjm<r(7rSJf%?on`^g.Ac?mS81Y/f>F`>Jm)=)Cl,,uS:NHL+#f!3Mq3%1LiVm,JHf!3-i69DUri7E0VAT1S2+s6)P\r%"7l=='7CRbm;C4)$.a:_HA>X?7M=$sU3WI,4,s2M9M!L<48&DYA%U2$pPgcl"3F%-]M[,d<D@Q3>EIHW.k;B0K0G3QWq!!$63dT`\r%n,NUh1^T#_%(]Z'Dk7k*oS.8Cjl3'F<&kdC3q+8\kQqS1n[:N`*'<QoOQ?jg:OdHL<\AT)r0(H7F2M*+GFi0\pTaX"oltGRm>`*E\r%MWc/Dhre3;8r*ODcJ^eoQ)cF3;'`65=`F#<]MNh6@;!k>J(^EB>okD'6$YRPUs\]rYb$A9kD+[j218_ZYDKU[9,L1KnRAed\1<7&\r%7R3d]5J'qj@o)^ZL+4JbqmZ"Je:SW+%tgj:f;=CU9l,XG4eWu.Kh>fX)cRGWUBs5&aJ&-fEGPo)fQjQ,,**2dkP(C_L(#A%*$7]\\r%P9i-*nU]1D=\>%qrto/RPPII?=OiX9hi@;dH)kAZPV@*im3:G+%?mWAM;nnXQqHRcr73'o@Bq86\2"c".fWl6;L=on:-#\A<44YX\r%Q?<-hrt5Gj>@00()fchI0Nka`3g52p@BrF0cDks=e1b#tR+0XilP_+n_k5rkWF8t<g]^TnA1:r=4L0#;;etI!L<3?1Uj#$TX^TrZ\r%,GGQi\lY-IMas6F;JEj\QooO!CGefGa3FDbH5:@5R*(PVWIhUkSurd3fhCQY"GF8%iWHi49B?Cm"-ZtAXOi/TmT"iZs#R_j`15<o\r%G.4/Feq>#shUn\Bq[PLR2h>N.od.]>-UfR;eOKH"boKjIdi%i'!BV=:4g3DAE,%"rcHMclK<:G.cUpO%R@i^PB0&cSJM<GU?0A6;\r%nsCFqofc+]H-HgfA%/R:4L)U>MBA,Wr\k\Mf)!Vj01NG"I-1HcdB-/VZ;f9j2.bf-T5gFI*0X-18@WWZ^8Ed`,ge`HR?jT`2M.Rc\r%beh<@Oc<b:cA8al1eTm#EDkeSC]rr#gu[!&9[F4]#tO!0nq2U2_0U-P`;mrBZ4[".B.R5F6#2V=F9\pWR'md`X`P#s?d'8;nm-%>\r%Tc8+Gak-m5VDGI&:LCk-].X-e._#3^S*:@J_3,TM%6[I!31^,.i%U_d+Q4*:[fPR&A3.W5Rn^IfB=*"@-.YE;phl#D#BH9Y4Pdff\r%+sg:NnBOrRrLNm,,@l"8R-j.,#5@YU<R'ZG%r%+Q\>AW7Q77WV&Ij%LFBlJkU)i)BQBV-d#LYd`:P,-0l?&iALX<rcDMq-XN9j$K\r%dZNALZT-JG0gp2[j5O$&j8mr9*HMVF%:/kVJ2ck%A"P%eHmq[8H$3eNd7omtER2p0@pa#*<d+.Z_!um%1Si\Af]i(#SfuA(E4g2d\r%jqBc5R%;';9;hF+r9RM61[8;=#CHM2m@!XN$4eZ/R9at?YETgN1\+`C3FT`/W:07(25nLcq4&Ti^V#KG^k<u)VU0N!_7Yr@lIBql\r%Oik+D<Q@-AJ(\rV)-i`UjgaJ+,+JR(LGg>@>t!mo8O#5.mNTN?7;X9$33>83fP;98$)?6>k$$l,"rpE)k8;0if;hK'-<ojXF04e6\r%OgG_R@BLcFOcPqbfDFiXh13&MhS^JSO1nRT^Y&/Rn7T;X%mQuV-%D<p.`+&/%1t!PVBr<6BE9Po+bc'*c[C3.#?ep$5GZ\Fl$LLK\r%akr?^JZph^CpbH]%<-)J:K4eXjUK3e)8dG,&/Q7hR&Zl6n3jQ"3:,:#O>%>G2^-lEWac5)"Xe@F[t_A9Ls@pK&3O8hBhR_[C;bUk\r%3/_]HdD/M\Ru>OHS2%Z:\15aAY>\SB_['nZq">JJeYJ-_A_#E*aK$Y!]V08f#HsS\nHOthA<]%D?(/_4NO!We.mcT7TYWXHAOWW5\r%7l8"YoGO>G(t!<8mg'B=LkarH,;_T!<7,I9DhNk<7Wn\EF"L;_?)("M(\:k+lJ,sg8@k`[5$$*C(0bp_;'hbYqQ!HsNae[0`=(kO\r%@uVt`,ot20QfDuBnPu?qA<t04U$"(&ed!X0BUU5q2Y:*pHNIsG6-!P^OfFTgK=IUf3E:]#6dItr^Y%,9rWDhO@u]cD%HUchl?akQ\r%2An)dRea'_KiHdS,$!MXW^slU02hIKUT1Vmh2>6\cX]"u,$!MXWp3:5:[&?TjUP==r^qA?Z8;8YWMO6"^XKQoH?l$]-"AU_039GC\r%e&h>3q:T9B+^\!gDUGY60DJ>B`\u2hi+[/:Ci"`qB*oo\)R&%nlXbQ_ZD61^'i"Qh?#*4'hHrunC1465]GV2Q5PI"8Hrjn`\8SP7\r%$u6tfVlP<]:EoDf]+1U$dd^B2Tc"B[n)e4.[2?t`^1[,l:2<_N/:8;oP]a:4g<+<+X7E(e=38%"iLX=^RXLjkWT\ptK@NBjL]`Q!\r%j*8g:Q_lLbXkQtAD"X4cG`jQpVP67_D=-MS@g!)6P!"GKoJ]D#RDZ!)VL:cHcQ'OfJ`G$QVD/Wro5F0V7;Q`MUW`QoZP9M1`1#$h\r%mf[=_X!V.^@KdkfA&"7YV*1Hu^DS>JLuYm"#D?.pXDF/^65XmJ]dJ@NE^5,Gi<C+LF$Q+,YHTkn8KbASbE\pF7j6uLcT7u1qB^f^\r%-qY$>?;m=_eCXWJ7,OBh307>]-o]+C6+J@!0,8NMnZ<i<E5?.^dE\*Y;B\s,W4u6(-+n48BpD"dkj>kE(AaUgWKl>;G_!M^FN6j+\r%>+.k1`(p,I)`+S7am_%n9re?l\aLsq'r3A=2pb@74b(AAVgV@=?tjRoW?FUS8lH>L#[D*j3W(Zp=Th&eNmMFQDo)ET'&A%5W^:WO\r%e$*Fm:$o#rUr@3i8A3S0Iu6e[ah(*%*Hkis-,T-DV:!udN]XGu5c]'UF19&j14"hkTJ'L4h*$\g]P:?a)ns47k#IVBLsVUJ#HuiL\r%X+$X#64kah6QY]Os.><5SQ>]]j,U,!DCMdcYBAVPUK-&1mRVWRUpOmSo>Lg8RZpjtnU>`5UpOn/7/"j*r\G^o<BGY>7(d84m/ucB\r%n*5[-qf':!cP#VDhO+9pUB)%tW_!:EkkX4j=&"Pd#dCql0Xu)dXsKI8Oj;H9?W/g[=uECF^%86qC"5Ibo?OB`*C/?(?\j!Xe@Z/b\r%]P:>J27g^#i)PuhWp-H#,f"Rb=uACu\/VQ=j8JJI8]bl6)tUnH-Da]e/`q[e9hMHEoY#S/<KemMfH"PN]]6/*PaT&]jrJXe!lt2s\r%<Kkk2[;M"tb][C%6V9Io1r)O.3nZR4V5]#FVP;CG/kpJh9SFX7[Yk'`:43N+A@M0_f`WO#8b$4tSD75&Ms<5Z?W7,]`\-<^lhc=]\r%`=o4#;uajLk0QkbiTH-u#6)7e@-]W\#l[isrGr-*;b&c=Y]dPTHA@/aTnK6)l!>s0qMa>c@rC+eB(b=ipC(=\)MH?ts8P\cpX^J?\r%f>I,om6.eE_#p9Fl>$*SSdQ@nqX_-4<Ho>G?ROf/m.p<6[+7eJL<q65%#'I7%k`Q#==Pa5X&EjO?jE5\lVh@p"EWYBbP<uP)bAL8\r%;#.-]HTXDX\,)SME@#O#2tOq[:3c^HGYH0-:>LGQa@dJ5Q([*=DXc$aUlB#-X/d2`ZtJ47,Fqrd%AZ"9RdK>)dePFCLtRfkDA3`Y\r%ib[f;lAtBlSmYbX(Y&sUP65U\d?f%?kQf\YUOVC`l3tfkW2gk>?*J&'6#0-K_6'c-3QhWpA"(.-9"`**2//;iQQ9*,`'gCAb>81^\r%8%jZB1D!C-a)jG2UTdUV5-#m!C$FAIfH?Fn6kKqF2JDdU>*58-I\1,QmHr2I?uuWM`1tAsn-=P&5Pdq5#ah>i'TLM-?09OKF+G)G\r%&UoIVct8ku6j)V>F\),RE=EI>,6o3nD"IWBq]Urc=0r(C.=6J9Qjj2ZC3OPQbkG8%X51>:R,#Q/>j]h=L4)_\1&"#;G"5V#F"n&C\r%[Cc/CVU]kNl;I?gS*a,Bj6cSW1OXG5+83aijk[dq,;$!^T?r)K$2V?b4o2k*mp%H4q+(mo-\pHg[I^`qDK-tcHG?L#V1m9l4^[fm\r%_QSB_YJI't!l$qG`o6^GFbl&riC?h_?&4Q`p^rH\9ncQ8T:EqR56j7qS(j"Y`Rf+=3K@1Ppa>ZoS]#Mj:\`Xp`LZRH+MQ:+`d=e_\r%0:POg9QRtFH-?DgbUc+qVW\if[#@8=jfV;*m!=7JDC4t\HeU"*?e(8qHeZT-2-*#qgLF$F-^A`U@Li*>alV:gf^mObogj"&QZL?g\r%gr_gAWO!p3B92599MDaJZ>F9XpuWL\5]N7?"K2Uc;s50)Gbb88;g.F8<"b=B)uJkt<R,,VrO22errn@!oVF0QF>*7JrQ".$(GWK;\r%]QnsrH0B-;kfr^oc8f?PSf_Sdm#Wdgk#MCKrUp_@4>#6hYR+0rJe[HeVb(ed*2=45H\RE4G%+3D[Hf2c0d_)0DM>*7Vq?\.kLf8Z\r%%25:KZntok&L[*X')l>Ia)[:nXMA?l-"F_%r%J!4B`e=63.?aBn>?TjVr6Ntjg?)CXo@-O91H,_N#P"?cOGuLkIk2-/fp@`Cm_-X\r%NLIlo51%6?`@e,If4$!#!2-'M?-mLFqUKIZ)XZtd^d"/"UMjkBm^dEWDUso4.McI*FVAoYkF#Zf-<A'gBUdPpb5ArW,=U$rZIp6H\r%$2ojE\eKuc2=X:Q8$k;e^%1b7P$/hI*'[4pC*?mI2ld*TpN(O439FGN+,#dPqKrdid\3&X3msE0b"@L:Fi'/!!Qdj?e-S4cQ:_?k\r%8=d!.6!6@.ri$QSRATcuL)kER0%5K6$Y/ITh,fVt$WH>DVnOEkl@^1!K&\upo,bWFi_59fQs]-3*HM:F_JH1bG)LU*3H[[-jZQ&-\r%qJ(cF=]6^7QLjTn@8!/q;l;<B@Qm(]==jI=>@gCs@OcF#Iq)0O'6_S+V&u*OFi&%(X`1FF;CCg+:##fcPWE6nS='&aHD41$bLK=\\r%,>K`MSGNK*0rIe!kp>(G%%U^V1CtS<Y.WqbA-*PJ:a\a.qZ7`%KH5,COT^,[O+*fVIe:uOqOOL]:+S(Hd-C]=gqtYr.[^uaT9@\4\r%Fg;eF"=A[UV,#YlR=?Ce>W_(),]HQ/$+mb"11)+dFi(;d'n'SFSZR@\<ZFohg$5K?e]8eRmqh[GfSW_6KUo5o)I%4TNMs26:LboV\r%PK>jirA:sW4$R.dX.RC4R#62Zoas-k.SjT<c;qg%etVk-$jHuI`en0Xl*7MDFp2YC&+VLcZ8T$#/iG,U5oag7#Mh&f:\N;j9%]Ou\r%6#*Wn#,12f@o@s81^KYoN(FJ%?TH.3&[/Kt7scj."f['OZ'F?@4'VY?[M#kNNAtV_NNJ3l!\-aYZGopI-^/\]qIsd=f9SkZfF!'E\r%ZHcK8NNLQi9%M\\8(3Q^o\<&98K(g\I>kD:ePB[*<d[<+XaV0mkGu>YSZR>R9!CNLf%K=9T`f^7A=]iO)I)B]<&-D)f>^iK0bfN4\r%S2We)9`-6!E"[JSR?Trji?XG-gQH.`:?$NU%QFMK)u)&,r+mG0CuP-:!5$p7g-jk394"_NXG(5'[KYoIKo;p31^N>tKaW4@"=mc^\r%E5=]MN20)f^%SgMokq[t7/W$iPqI-lA['V%i)L%Z]&:OVOBNC`Ed\a[F<P0_plmE+&YtLm!gG<^nM]i*%nsR%h1J!b(]3#05EIlq\r%,9*^9R6ft_2];EIZMek;bOnnJ:*o*mrk\G"5CROm`66-c0(u'V/4n[T5*)/uN9'P$Z4nl`).!g1rau*/j7Hl>H_$9+gNGi!RjEi8\r%kQ0!c]Ge8TOZ^CQXb["`31dn;Zc+*_<(6gK/1s\CLseh?(.i5_$S)tUN71=Dej5]L#*VO)O1<KH+\j8-!61_u`<dF&&/_;llg7;J\r%)$8jV9_QR(V?"WhB6gSZ<PQ=/Hm[Smitth(68lX\)98tU'rI]8-*:$f's2-Y6gZn/GFX6Q_Il]#^i9R,YI'lWHH-nn@rK\8Shk]5\r%R?;5Zl8bV`SDi$`#4$,Ma-iolaiSTN7FnoAIX7%4)e6MN[W@s)<g3cOc/!BZ0eqH7F.C(79^=^6GFUs/%^"oQ^7l@0O:ES=$nGM0\r%e$Fl\=q+4t,*msBZPiE*;:s,URa(=B`kJ6+@)"!b4GV'q`]9Bm19>0>][dQC>W*>!kd*76Zne^rKk[q^8Lq]9<]J,>8m3*5[).78\r%Tqmr^74\.A*(jBP<j^k@.Jo9/L)$iU<Cn*qnJIQHV/2I<ANY]Ye9r1^\4kCV=9]ZQ4OjX5Kk6oWQ6IsA0e<E+5`3(1a05to%0S.d\r%Y]/RrJ>EVh/tcPQPqHfP1goQWjRi[(?.`cG?,JF$?HaiN1PlpWHrmZn]?p_C/m,XIBo[_>$_(ri;-4#CQXHWt(+u8CfLcslYRFj!\r%OiM#qL1Oa%_kQ/>4Y63>VdG8?14OBD65>jW(m^Sn`X1Z\*lBbUA:uopj"W+&nPjKGO("HeURO=>:DK23/-7K@J#]`3_BL+_bBOH=\r%-tu!,\;\J4%.KHPi\I^*g1XPKC1V#;:m=!lKCfO/jc)GTK/m#oE>agG)2$P0,VJ*qQ8sej_D6o3o+;9JoG"'WbBOH=E4dJL,E0os\r%'66C/4[a/H1(I_17Du9;!5:n?i9LENR&tb3UntUNdFDV%NV,`9(Y<krVi"Q/[`*N*l7l<$PtI6SE':)VKnC`$LYoSbI$75]'j$U9\r%CN"YZ/N7bqiEG'<f.N;oc!=DB.J=kd[`rnl+]7#4WnT,SjE9MQCZSm3Pl,Y6U-0\*O^]\"fXuN/f%,__fm@VR'4TlH\Xm]`qhPkg\r%(dX;?bB<5+BpmYEF04,lk^?ue8FTc3X"4bn9H5Ym_muK.M>#8M6[5dlF<X.D@%HSud2)qjH5ne]Xa_$,n9=h@?)dOCGg#3FaC2XB\r%\7KAVQeDsY>+aFJVK?nOrI%g<a+jfdFjjkoML<<Aks_pJ2.G69p@TeTM8c'l]q[*>S%\>:?G'[LJj3'M!@H']Z!&_qU"/G$/iE5B\r%/1XEAd<E,(=B1`'mQjd*W@lH>K%((=*hA!W+Cand*9.M__oIH6@A[tf.tse]3mq6k@9UcDUVaj]hNO_BjE.'bdh%ZspZ-#61K-\R\r%aXc)Y*a80q<tq:D&M0!n@>E96:i7YP+-SRtJ`j,B5b3"qK"faO_.#"C_Dh`tS>Ljro/Hr_1-CS,'V^Ur+;;gU"t;b-5fWOX`pV[f\r%H[Ufr2u%P7QDBJ3S.,6q#a7#9S0C#L."pS[GsIXY;*"-A2*N(&13a=q]Z/!%:57f.C4)c48pjSc,X_"+>ttT%2AA#4*_Um"Q=kK&\r%%p;K'UB5F,5LGg^3f56t<?hbX1kn8rH[TcKkj*"K(ha>/<n\B.Q'==qpqTWXZ]`bu%O)u@V5<nbL\lT(2s%:o.<R33Jb_q=;&"qI\r%jFT!>R<,O`Q'D+l:_AtW3gTQbM:7,84s!@Ei,2+`j5[D_#Oh;JfD'SAn\Os1#5t@c,sERq`A1Vb!\:g1;Y@PVJlEAHIT#q3S0P3,\r%0mk+a&tdoM.j_C\`"K4$eMReHGs#T)h)108UlX[lj=u(\rgkEb24.Lj*G]9%RU%eM.mouYOW#<.:E@ZHhAl%]4EAZmY=JmSpj-@@\r%A@<H$^gr*%a38*KK2,=7(*mkCWc8o;@2X/6e&5f[L1S/C6P5[T(m\$5>,6-UO'rnsVGP3BX<osEYRKTT.H3*(__UGcd)9KXL1TMZ\r%eqA#\O'ro>/IrQBN#cP'![9lp1]Bj'T$h[<>FEl#c:m+t&:eBZ3.pNC:dDA`HsmItL5/sLZ6mH7QQQ=RG]a-N=+LFAnX><p!sUU:\r%1*W(fRVeG0!<ASYf5"\u/<.ht%*P:Y/59Bh?i(@J>fNPl%/)9*@Pd=^1QJAF1OBDNr%5Ns4GIET+,1slj"W+&/^'oVj"_[n1-c#=\r%Ls(#Ob?2&4bMk8u__Sa>N]\rSEB9la@>Nr!*iCfuUIYu`nJIRslmM\qQH=lUPH@4IcYdEuOh$$Mm6Q7,h-o6nPsEu6qS\-Ka_!GM\r%>0sS"oX,ZDQ0kX@J5OQN0snlIAjJ9rK'.3G$Irt=*VGG-hG-Z(eFCW>4l^cOmPA_RENGd`FqZR+;qT,!bfYgT[@;]?3t1-eR,%lR\r%>qa>/m.DSr3<LL<`F[?=]^\!6c;Sn"p"n]je%L,Kn'B7fE39(gjc]>hf/Z#S2]k#jF8rsZdP<c=f<nj(Q(dpL%,CoZY_YHN^);,_\r%7Qua]_Cbo`7Qua]!kN(G7Qu`i&)Af>,MVJC7!,nKBB0/I:E1>L[)plH^."f4?Sh8pr;CqKGW]9hG![YJ!#oatiLM@L*i1^-hEhS?\r%G@6Pgl:d_2VJu/ZUQo!U5c$W)Ukf`<>3j=Hq>S/Ya[Os/\eGgEqm+lLe;4oU,G4)0iKejQCrX-7B]*US[:IYW0MZ6,X_3;.7MkN5\r%R.>X.Fen?\Do$Z$%6^U2QUpB11HGB>=[m'(r\cq%g*)k^)eOFlBr!pR]n?S&G5WZMHFg@54Q[,h8D$qbd;hFY%3H2h`MY@\%Ys%$\r%V#;c.Cl>s`gdN73802)Wrd%%nLj.g>8hB/%4M#VfS'pNeZ%W,%H8G)sh^tOgh:NLt2`H$Sg8t]c[#ARl+^7CsiZkPm;>g@+L0b!-\r%0?'n'9H$Jeioh>f3Tg#[Hc(8CJ(K_1O1t2V1).mn/YWgF^gi;Y!b.93Y_]H<q=Oa[9334:I`"mT]CTVVrC%kS[`.j@e@;\n/Mgo3\r%\NF+\BQ5)UemKRHLC7kaXsW'TdT0f8$eP2h17s['gkWR,p$@H#h0;;u]j)3ec[LYMalX?*?4Yb=h6*[OeRZ2l9ik8+CD6[&Xn<_r\r%/`)Y6<tf*X84UbMd^R85T?\SdBS;>J-B9Go+m[1=G_D#os0XOkhkCV&j`BfkahG*0Y]Jp2$EH".b12[*YC'K_prUI'd2VQ8qigsE\r%Z1O,2-YBjO=1oFB,;F:F(d])\Vp*_HgdNXOIeZ;#ePtT%qs+17A4P<s<]8mmVeaQ!h>8^#=;TZt,-4e.2oC4GF#YoH1ol"*Ad);[\r%Y0DH:R&o@lhpU%>h^=Q^mp1]!a'7)LAipdBRk%1,Z7`OD@8T4l55Q\+kSt=S+,1A!-+e`2b*N07-0siMHZjh:ls"'AY!C<5`>8.S\r%a&?"R(\b@)iSWNL%=87S&n?oF5Xun82`MR#iPOVHY2n!_McU^\m>0pC'c*Ell_<r%/T9,O>kB%@6q;`PE)DTH:(Ofr!a,)jYj4:(\r%r%1gYHT>F,pBKgK"Xg*7K_ofaSo*.4X3Bh+=XoF!DIQ?(Mg'bpHQT77?=IA4MTkM/Ig%!KHj:g><i;/Oe&:N^B1TJp<4-4l2<MnF\r%`ohS)Cj^F^4s[[@Yjk:tir7U*mTUb-M+k5>0oc%N/onUk9omhW";3f,\f?as#m<2Wja@mi?d,hB,-7"kVb^m')%p+D?G*_:.4e;7\r%&%`0a>G>(YInN4'n#IUOZBc7\c:aZ90=+34g^<6k^8Jai8\tER0r5`d1sLb;H%,#C%3CA2Vl,F)55B%ab8[d)fIZCKOgNUh9FfH_\r%53YV#:+HcYlg\9nIA!KuEn3;4*Jn.NqKe6H"B)9HmjNC'd0Z$gaOS:U7d0$ecnW6&%q&Qo$GCV))bK0dkVHG^2MJ0`W<c)iGri%H\r%K??:@o5on33$A,Er`?07ostBNpWk"lPYPPkUVkA2rHRjZ*mH$M[uccrHu-Q&T:[7FGP_8^E=T>%FRG"rAelpSSWfe[2tao\eTC5:\r%%\LiO1nD7Q_bPO_Ra,3d!JP,Oe"oCi];H@.VK5g\*,dbdobc8%*&+.;Ko)\5H^hU@1\=fQLn__E4&sb'-cfN8Y3O5Td2D;eU.(6r\r%V%sJs-C>i\.uM@'&*&>;BeN[#3f#du.J]3L"Cb,O<r.u#"H,^o^RQM[F6Hck=3c(^fQiR""CdDOIEOVP0urgujW&i=oA`gnT3u0J\r%[kP^34i+Rpn#uFR!%.hJ,T:0FU7(0qJjn&elc)69M=%KnkS4#2]#ctZC^2?B8Ba6?k^UW[kkWV)jI-c3=!Y>(ZB`?[1Z)-X2_kak\r%o_FoGHIK2,88X@$/fS89E*lgK>Lt6ZkJs\SfTdaloqoDDh"bYjd?[fXn+IDJA+YZGP7?3@hN"m^\@LFKG(u(EJ4dT(X#JjK:K\c)\r%V;>T`mAW:bU>@`eVlb7IAsZ;n0S+Okl$@O&De//#n0RaVpGB`s3KDG3*i6JcH2VcN(.+4.PT%J3JDioR(^5`e5eC60!HEpuNP^`W\r%khUq;.H?&:Djf6q"c"OeY=dhN2PZbrO5%Y*EORrg=1\/So8fH\EHP(Pg4;tEjnHQ0SSg=A@jN.6ig;]*h<F?q;rQ^.+ml1B)J?.!\r%,BW:QVDFX,h:k]hri-I?4h\=Qgfp_9cts*qI7&3<hL@]]HDJ%9DE+6VN@U=TQ$qMHh6FF/YMN.86Pl[qAj?'^10*la9@\2"S_kgt\r%b)Y2rBAr2.VsN33-gb;,.bs0FDMjHhbI:"dgjhgY9+e"-S9#`"U8/2piUNch/>:=4jD%U_CSo;B55$'a==P]jF'h"YNO#5'VCGn3\r%YC-\Pkr^itlELkNFAP'6o*6V'nV!@krU_7p[NV;$^Q1P]d]#-<1%0MrP\s^*4p6*qDc#tIcrK=&g`bYD9J2$f=ruTcY@L1nZ83ZA\r%*iokkZ@9NPo8RT46V\Qj>&H\_:/k5fNabAi]82b*5%gP2P"9k?J#(0%+Gl?<6TSD>XKIB>)h,u*>gl7%WaIo3+1Fh$c;R0uXF2rA\r%`RWWrP1JGM88Hm&Y4-Mi?Ee^&76A$a).*,`OEa>scis":.9QeCeG.\_8rZHUk=;ZmprP)-D&0Ydm_PRMhK6<*Uho>k)eD!HZeY3"\r%3>TQCbp(c4,Ls4NiD?HuVR8]9nMQd1en;5L&"k>e1=S'k72Zje=JDgg`'"n_=JDfc.b8#_WX>9Q!/_C?;,rVm_nVlsC%aHtM38Z$\r%SGoHrVtSim^??WN_rLUBdr.e)B:AO6A_m-=>8gk+l,:`eDecpX/^.\@Ha&mWZoVt[P&"^<fD"r4nSY2:f@oFP>smlgSZkFo7=>C6\r%4tlD8_YfsTk<AT%f?LN<5FcD^J2;;VCdei0C?<&iWCYXi>VEmLQ*go10*2U):Xd`-m`E>REc8"K<*ib'm.Ic@(!P=,NGsdnl\.;\\r%&sg!^rF3g@5*\rd;#fn\Aa..U_LN3o&DlV92BdQqqqo?Wh_h\8\QABf`efu';DV"J`:;ci.+c<h7Al!-_Yf)b8)Gr"KS_35Yr]Rb\r%HoHjqX:,\i/uF4n0mV4(e&sjkfc#DW;pbIjB8QgYhq1]<;b814Qmg4$TEao@ITi6,P?[ElEei1ck*YTQk5QiUYV*K(,^00CkgH#r\r%<NhQBAS/Z!UB/ht`[H+)j2]F?#C7/.7]`TeD.O%sSg&J]XH8[]RCmJ[bMSbB:'8!aD-V$&7c/4iTtc0H"<*[GZD't1!>87<\^OJP\r%56jpC8d':QQ"#O6od(#2T9NI&d^Q]HhVKE%9.t(WKfAb?pJK1/L9K7\dgC<ZZhYZD8IUmn]2(IL?@&e;f:S89TB]#TrWDU$NrBbQ\r%Q4b)c5W:4\eD;i+?Uk'_IP4$'NqY>H\57muc(h]P?"e&Nf,l[I)*Q;](\Q0[is6Ea?d2\r1CUaW=n=fn6cu.TH(7)Vp?N'*\dlo:\r%?"G=Y9KV.;?1hC&NLsGQ+J$^-:,[@`O<OZOgU[W4?uh06>Ct^s!;i)*gCcD*5BigGop+E2jQHCXTKK2MUp0G.g*j^36L/"!GG1#n\r%`'+%T\m<(Y@6]$/_mQ+cCF/lOWFZ3*(fH*\;jPg0rpd]#Uu_JrcQF48KqH88VsJ=>h2*&U,qnsj:_mo*>+S`c_3jnr]IDr)n4<kj\r%L0OXakWfX6F>p7Jm:5TGe#HJ^GKN+&Em65^J*6]=1diL5Of%c-3t[1N8/k]g6>duAYn3?l)EL4MI^3PY+g:"mI5\do35*<$6'OQ8\r%hW>^>Qan^V:6j'c;F-X`W[ogC^?T9a&0,Q(lO_ZX"2P;6G(OqfQI8Nu+?4&&"3ioF`!Z-An)NP3TJtZ?%j4\Fab]?\I9S=r*q-=I\r%IaHu`P'RV8q8%QQ3"\UNDq-6'YPCKQI6_GNdeqI@:V^s#lHKi\UU[#ni<,W*/Y#:&3%ST^F5M6"1pPKJR5QhkcVuXc"05&LA3j^2\r%rt&2!neUL4ci]`E5(hC>gUEC!/aX:lfP(VGK8D:7Sj\_p`g]/5BkB)j1!_;UVKf48Oj!-VA$6o3@mmP\8uc%`@$&68.AW+RnY.S$\r%:W+6](h-tu`5g<YJ-]jE!W?_S<I`!TQ.G='=u0bY,V$NDMsQ>!4j+H[h34*m5!%hdTN,['85$F_f;]\Nf4F4?;Vjk.pVSUcs$XD`\r%H1+>"bs$C-De5UqSlCF#pnja':4gsOg)K#H(%#NP;JJpJ[hN?Fb;MENN<Bl6]BCPaGC)"LgHl-XUAu98&T$T+pK]=:L(&77LTsJ>\r%4MRn@S;mhug+($C[NUH&r&_WNj#b#iKH..)a-)n>(e'Zf(I(<mcr,]1&<,2ig\1:*nj'b;.!NBoUQaCbL6ESQC+c&!%U.ETEW*Qt\r%cJC4J180_pIZ;9O+cJ)E8g/Y,$^7rq\Z+MFG>&)Wc=C9fGj\:N5R1c!md.<OWl9@0iOO#0SYnSl?$Pe[$1l1SFQ'bhi@03ms'9m;\r%VED4(%u^Uj2rSb(.%L._o%f#_hLqd>W-igJ3?D*MMSKV?U'o<'UPJ#A%(br`4aPatqf:VWQ9e[p@FURY@6rSp)k=.*-@1;SH,P#K\r%J'VWH2a/JU;_6"Qn+i1qfTL0-P^m=t22)MS@*(>k2rIi\^>umVNX+Brc3D8:lJdT,jSMdo'[a6kfQDT:PCqF(34lP`$LGtm[LO/#\r%8skG?eaKV79C<K?*_a>XXtek7>\uqCc[V[7U%^W['WSI/qoWtER!rte`Xl1Tb##FLV0sK>3,URW6!oDW!Da3_rYFS&gr]u'VO8*r\r%g]nY$oWSLgZNonu%us'h^kXXD4kP>p8L@fQF"bdbLUhA-=N^$uTprUJ"[?=>Z%leVS=+#72*k_-+gI1dYYJLuDQoE_(;H^&'dB_Z\r%ZXWHFq^fb]Q0pF-PP9TEGKNqMOHV0/Ann)Hl)9l8NC//2GA)-X'T?L7]2P5*Xu$Fh[QE9)m4nk949I@`F("jaG+rJ*cU#knR-4gN\r%ZepF@&8)Lf'-6(e#\uNqZ@EO@]O9E+?r=HEQp3S,!C.fM,_T./&A.P%3+Il;jU9S8$#D2:FPX?2/U"Q/4%G4biNbHR=b!n@_<lZ2\r%j$(GulBN)<cZ+i[0q..4:N:ca`eftS7Qg0#a)Ra2i9Q*5*63Jb"%o*&*63JbUFJIbEuaoeDoHkZX2^VO<!;$/2m3\b=HW&<-?cEa\r%X77MrIc+,A7hD5D;WL[B_^%^[`/6DM10/)TiR<i33laEOIt<(%/@Q;=O3*j?QsJjIRBJ#-/t4q#mJJbQWP3up]>4em3h?J@niM_1\r%1r#X1j:*UcA!cqln1^tTUf$)Y+"JOWNSQJRE1rJH]DN`HVkW:`g$ZR":+g<f]S:D_gL7-'&9OJfG.B-\Aijh:1NGtf1#'rWb8H]7\r%QJL:ThKX7>D87C`^JiaMD@Lj*j%uOsoF]g0IQRp*7Lpg7fq![%&,dk>RLm\W5U1Vo^a#>t-r2Q[fA;=r1qN/K1D?'mLeaFakLp>h\r%a>^\oii2b:0U=@j4c6qTBq',m#\)m>\V$J,_gD@hD_"k/c,<cFYr44MBpK8*Mj;WbbKJSKEdX6O3o3,`.X,\2rS5E'V;oQ0/S83E\r%cELt%Xd!Y&`^/]*MT/Yd;[G%G%Nt4!goN^UTD.;bD(*#Y%Tf3!:!W8;bK1d*aZ83U:+d"M7p3*>hHh?W-W`c1@(+Obadm$8Q3'"R\r%4`_UHla#Gpk1&(ba#7tdSiOm+iMO0Zfr"14f,eK*_k;)8ft@bPrP@:X&dms^,'o+uI#n;bo[EL#dK.D;*V=gAjD(C>`Mm3!qGt^(\r%qJ#]8kZ^+[kfSGP^%HerNq]ld:-)C,F=ji7QD=@HpLFd9R%eR1Ar>Mu2Kd=D=Jnb%Dn.u65aQhH/1$r?<)ZBGmq>%c]h.^"2mmJp\r%3S'H:laOu+98XKH!?6(0:G98*/%N[b2"m*)T_63('cWk!E)-c35#EuDqt6pEmM<&JNuR7NFdd?Y+*Z(E2cgbQT)r27?L;Q;3'4Y>\r%"FTSa,R)J2(f<Hbp$-Sf\:dlOHir&8%O5AjktrmSMTnX\Ek'e=#^u6<LG[S+dU66/bu.!p[_(3,-f&B`dBmLMK$n!:XnaDQdB:5h\r%b+^Q#;O3cF:3OIKQ[%bG7QrgcKB#_2qYle)e(H\//Tth/D;KUu*GLiUm]c<<9rH%l!,?o?.,d!@Pb/DbV%QPpp!JZ,jV$t^&lCV-\r%($G?gA@$RuMS-V##$5)j4q!?lo-iCE6UDsP4:4$T\_(3!)5iCaKGuo=.&<>&i<J-[$L-\M\1(3a@d.J;DUBO\r*)_8Q%P&*GN#E^\r%>=bUF>S6@Q:^K'l\&V@WN>r1<<5Qn_PKWkn*@eq*KH%sYW<dDa8#_021(u%$DN!BrO`6dG<4u#Vf]6D*:"<L&gPt&&m[3(@QYmju\r%)`UfFQA#tX2gk!KkUCQhDT]B5]^!\77FXC`_ZZF!E'm-f7_3jZDNM!oOp7QmDB)Fuh)l$'AQOH*'mKdeAW]Tp!S*],]%I@u6O:l"\r%@/dInGf/Kb.d?(m\2b3g8a%Dqq'(eVj%-4e>W1q6lWPnIf]m2].[l?_/n2TB0oiu4\*4<bqtuQ++XsL)@?-YHqF71OWZ3(>$<A0H\r%*=]VYZZ#nEe'CVFoMYd='<R][b2;A6?p1=3elm+elth.`XJ\hIb]>](c+u$&h:m9:CX8u9>A;t=NT30&*`InP/sl][K1L@!]@F4;\r%lm?Rm,#-8O0UoH&M)>-ikq[+E%`P6p;(,b9G3m!Z*jHG@jbsIMTjoV2p7E_'BA'QrXD&I-ePkBM?rSN?;@T_/P8P*,/_!<;]8=o2\r%``drRBo8]1RV2->]c,Ns]A(6t1!]h*o8>WXaQHNDDmV`,FT_@mAqMO4h<b.J=`R7k'kNkVZHG8m,RRRD-c5PDc_Qb1c:MX\W(A?:\r%C'^t(`Z5El$DXQ]>%2[9kWW/m)uF?NFYr%$4&QrK'\p)5ae[qbUr?$W6Ur__0+1f'Em,Z38!,S1Ob4Uqe&%IZ6k6i[XsYS+L`B<H\r%2*56A2R3+M8_FB=IAB8bN]=#&F):cr7#I&A9ZgojFn==;%QeKYFR"r;8+PuMqCbCIo-k!8c]63SZQpGIhsET'oD,mF/bGprZIG-9\r%]/H')%+AqL@>;W>[Egs\HUYPd'DsAe6qWEPV+\tH#q`Pn7((Wt6=a2D2r!O(^?gH7abm@>8K!Ag:7"Spi(;q6JWk!uK1SSV##;mt\r%N7p%^+7oM$hY:l`P*hR4^4T5]n]#9q:Oag34Q,.]V7ARYi"LR:-rZ];K24K#"F&%^Jkm:[&,aPc#+qW2i^'6R-S8mCB^c=hBQ1]6\r%DFjA?bU3+<p"(C_RrRp(a.CX@3S<7'?J;DY^u0f?^9TkCk!d?:"r_l@Vp?OAq#_'iH#:a!$U3NJ'A`J:%6j#nnj*JP?o89OnQOp`\r%5IfVb^&YCd502Xq5(8kYN=K:ikN>s[>IiC,%R)?"#27uKIeYK@:>6#G$9]4.<l)>4+c%R5qIrOjM=MB5_'_@*;0.+Wn>X1-<tj=9\r%^Fb2V-To@G*SnO8T<O4YB<-Xn52d^rpTZu9:\`cN8j(JYPIe2EF3Us.a!e#aY8hQ1E=@[sc2TamiEEuWC,%X,(a+L!"u:ag@lW=#\r%O9oG;K?e$!5UMS4%*);s_g3<CE-uUb+_;Wlc5g_@4@9glitnX?m$9QIqWW^q4KP[LHXYJ(8uH:RSRl`hTchHTO(@tUZg95#R^URA\r%/;Sm'bC@$0$Bcs?$[/ZS-qLX;]Cc"/Rt@G#cd4N\2V'+\-S^=NB.-;;B2#HZ76V&--VT`lq\!b^F1T`Fc;,RkH2=g?$]>7o4f:2t\r%X'a>T$#Z]7>*<t32seBbeWQ^9":dVA\hJm[XDBV-8TH'=ZYN.\Nur[Kc7.P:`(Of@Q^[`2]ZDd^B.`KP*31^g\ERJ0/7gMe/kbIY\r%e%3qDq8taYb`8Xh53ag3["3"0*d6b:Eo(-Mnp6\%NS"**W[-3LNm(9_Wp"qf`PpMj$\AlZaGWaZ-tAu0mWr2IC9pCVWD42C#eD>V\r%2H't`Ck'sk[u1J&5e/#g0CqiuW#:XZDP./6Wf:o:E0!L=#t$7pFG0CFnbmpKndXIZ*mL4lG('aq.rs7RPO%V&l]^@&-f:Pl+4"P)\r%WgO:,-eh=+r6AgeE\kKiZ(aD"Ws_;3V[E[BZD@U/An>u*cRJ[]ip4,/*60R8@o\]][8T5kIO`);nEr,NR>I4$!Q"K:5:s<]h\2\U\r%Y*n1NB(Ps\dehd9Fl@!>h&mGK?;+N@D"Pp^EPiJ2Y/-:s0tKC`iYjA9+7P<pJ8;C))UP$>#[E!;U+)$!\9dQ>7t5;-k1GHBc=B]q\r%W`+-6[fu\hT?-BHh\[db2Qtt@!R?k0TCcJF9>Y%OBnr;0?l/Q74BKAg^NGGPIT?Zks#-`jK&_@H\hW]_/3L+?g6P0%C9WWnE'.o6\r%K3d9QN^_lee6mK8EdSE0n12bLFbf-QfZtWb"<;jZ=pu(BDq`o8B+=soP/9LO^m3pb9h(\e/5l<:P0gE4-6:9kUe!Ts+LUa$NL#="\r%X7P8qei'Ss>'V^W+#s,WjR?j85q5HDK1_<On:[=]Lu1S3>b`gIaajjn?d\<7n.XIjaA<GgK?K\t8Zs_1-<4C_RaS-2)kbs+N_#9(\r%R8]TRJIGNW3('GA*KYip+/b6\h2]$aIiPOt(EIOtrGdq)=`h_Fpu;j<8n(sC<"`Q5ako@A=oE=[Ds*3lm>ll`5)O[=jo2c"ZTmkk\r%Sf.mCl4s3Vct@?tH6(j=pu>,!(91]GD4<aRk4nf%dr3=_F6[ok4CRL:'4/k?$,;HAQsK[!lM&%0E(Bs!1W;,VR%4E4r/-o(CA4c'\r%o4q>tlhH0fUSCWKRe*:qQF/HQnO;F0QliQKT6l00';bj`)`S"f9_fW)!_C@+E/q3jWO3[(EK&mWmc,Y>4E1/-=#Td]"/l+(Fj%9$\r%/YNZ4E\72e,]*^9]tVHl&DRWP4#is7.Z$cH5A%"<nLA-V-;A/:juR;SMu$b(reP:I@CfN.$fe#,IrO;GQkLN^?V$]G+#i@)kZL;(\r%FJ612q,s+X:$JW*>u+P'R3-)p-;4<aAU_k*6qE5up(HVe$$e"mBdeWR\QW+=$iSk]"@K%I\l;(nA;4C-O9qF,Gg(8Nf+_`PTr)=>\r%X(uFt5'h:*Q+9i=r8ul152[B$o?''Qj^8KhiKOFMl/n7@j-8SKGH[N4Vjr'r.^N3g^sAj'f=<B=E+c5D``D_k&U(Td)d?f6kD`;#\r%'>O@4OMDUF-!=l]T>jol-gbaCeC^5%_S8E50t"@\HK*f7lDLnPj-Oture//-]lY\#?5ena[c4+/8gCKaY)HL*k0c\25mJiE9`D<4\r%U^IqjBJo3#>mfe8Pj>U=3PpH2+Jm7gen&oK6Gg0ROtNL7;PtLrN<>FuNh)5)V2J,="H?=i2bF<(?-I.g5tREAdK8@pQ"/j=K=sH-\r%Y8eLZ*;9'9Gieq6oZQo.AtG%I7K1."76cBBai)BAlRkk:P&=%*ABE+GLQ2a"IuVf(Q]rEYYGN0"f4DqQ8*k&5Elo8+dI-[8b2_WL\r%>B%_j`bSt7)ZU1K,'D$WX77KYXhL?HlFbQYY1:![%^.LNe[>6sb/%&AfE^cr.As8fS@rqG::^4DpV"uP\]N[sakar;A6BCWgO*dj\r%NcS2Ur5IL]d><JYYbkn7E"NkdTB!PG\oX_'FaY+Vb]+4FPZl2A#A?rOUI[A.m1!gE&CVE$RF9AGLR=BFrk*rAc"8)-i3U@JT?@ep\r%-M^2N2H+fim9\#^DW[(:?tkm3AiK<p2H-O(Y'.,jhmG_Z"i-6QD4OCuC2`"?22='5_+La?4heh'/a8moh:LfcB>0:&`\9ocIWeiJ\r%T:E1nE;O"Ni_k"47p7nN)[dVW'c_WS9+=^k$Ts"K^t7a*6K<!\j?'iQb6#1X;P4C[Wa%%`fT2NJ)-ekfndqN'4G!t'KQ]\(J`"IC\r%13A(;DuoIK.*r,pDr:\>4[t;]n-CZ9bjM,*(RQS,"R$.fhu]a/R2B5f&R;!1@-KrZFPm5Ur^2\un-CWH?QTH_^a$>hemfEX!fu@Y\r%`S3b=0(:i\_1!6pF[$X%@p+lgWV`)1d#I=-JH#//Z[`F^3*-J5Bi8mN>/U+X8X"`6+CFB(,Y\Uu;"e9sF9.1;*F0f-2N$at.nQ0D\r%>eol98CGJjX\efe2bOK1JA&\O=WD'd@,KE%<TEh@5(+N[/c7?4"(=u9F.)Pq1"k@.<(t\M^gqL6ZCu'k#Eql@YB;>u0E]q+-lL<\\r%!+s%:^2X@9*(3G=#-KY4Q<ZVF*oW?CF,oD6r",,98^TuQ_!;ujHjOk?)<>Jd;`*]@)2+*YCtuprbT]R;5#pSZj_3FNkcbFbStkPE\r%,ucg4b0^nfXL1'Lih2)CS\hPt[89!TL)c1bq@[VR1!:Mc7&6L9.4SbYGC+-A`e0bD'_s.q.q%VPF)C!2#6SY`\ZeJ8#Qcj&.?CA4\r%9f%rWrY*Na^#*Pj05LHm&((*mM]&UPN@jN"a[V3H>gkqG5l5]&Wg_]"K"RCR=^eFHd'M0#C-i.-8?UI\k1+0DkZsu?cnF.X+[C5b\r%0,H!Q8?87B->'J*%%(>oQ7s,iReRSW?qe,rhSE#_[l;@tk[lGkTmeB&q"D?1Ar\Hq)17HiJJ_2mAtZoe'?#E90EZMl1<6Jk?^;fc\r%1JcX!^e#2mAanO(+&87I/2QH:qnPc:KOs:?7Qte>"CW1<J09orGRVb4q3E(Adds]ej4H(;K2`IX>fL8U7a&LA+K-l9SA>Q`$hTG(\r%E<\NO>0iV#j".BD!A'6eibsbc0l:p#EI8m2!8knE04>`paTuAW7\lV3HH-od_/i)L%2:Q790/Q52Gb'd%-_SO?TJ$7D!>bZ;AVQ[\r%4jr$)__OJ8VMNE?%*NVf18S`CbBOH=fJt*<K@q6hAm2Yd$S\&[==-kZV.MX741Tan"^Su#.S#UX0&nZ;"3D77\;\J4N6\mXMT^5Q\r%b?2)59B%]J__Uus_[7s^31U'g0Jfr?j)bL-`bFEf*lBb%Mh!?2j"W(ebi.$?AgmYhrt('r^It9.7cl$3S]#Fh6F-cHRg/`HXU>!B\r%(k/k3MHAp";"S-A%oJfZpq,GQVjB(E3.V#l$uJ3,fl*d#`Ns=GlZs()`L=XZ>+S/]^"/h7`aSJ?,2Z?@:P9XL;F7E"H10@S5M,9e\r%"Ha]p)$8t<UW<orTc=+qF+3\CaNhcrY9kMX9X3q`dNX2\*jRu,=Sq=9hlMj-NfH4[IQVaZl0-2mo])KZd/3A"T#dMnD]&I#D.G<N\r%/:K^AGB`*[q=3/L;l=\(q*'qHnDS?9Yq,8"-VSfu3ugi,:NR\"rC0q;TDK^&k2#hPp%Nm[cVHMQhTo$Hmh7kYI@R",hl!.iH1;j0\r%s&icuI=(WC=EPL^^5#dk4'*]8]cJWm.S7t#[MPDq=]")mkHK*5.^kt4L&%L6VX8U-lH@Iil:@XgnXIt=9eercgR+)>D5nto1qtJi\r%Cu!l\?]=SC6Y_AP7n=D3i+7!"Y9?cQ]/DZ5i1aSk;hVli@#KK/[,&-+1PmqW^Z(n#2&H2ms*@s(qMgf[R06H[Aq)K!KJZ(e,?g4!\r%]>M8`d]i]o7CLdYnlkbScuE\*:Z"_*Gs(H'[H6o';\D8j"A+GB9o?U@g_%b?3M$Q*n-laKX*-qHG^bD80^O^Hs4XPf!.,MPh_Me9\r%A.Oc(s3)cq@]^Q-@M9<@)h8Umi+*NZ7HJjZ"(tNZEaDp8;Xl/n1cmoh^Uctr?O;edX_f2]-h58Y)P)RSR,$l7d/eGaMQIBIEKIhR\r%FJI"/h;c2e9DbM0f>?ibTsrq%9=L7].V<mPAmjAf,`\KL+m^#";X.e!)T`507lRI./)%ZX^*ak+dDh1BFY-Zbjc7jG4?J;4,=ibL\r%:K9+rSgWUafl-q/e==lI+,`I(>gK>bBtcgYG<=_%A*ZUlg[.fm,6>YIn88K4/dV/4O@%@7*Zj`n359CAj7OuC*&[m*W[dC"3f'+3\r%m'ON$/9,brN0EJ4)3(:XqbIV@jRX;d`q#UR,AhOEIn]?S"h.MT)Xr#S>Ad,a@10=?"V2>q/M_95+P!4L<PbAD:99cQW<.IS/G]L7\r%9fX1sD^Jfa]-ZDjLXmu>pb0!(r3kQb+JJ7t<CBpRn%^re$EpA/@6D2sbs#TDlr;tEU%^GnTGu1jLgK0Sh97L%7=bBB9Es*>aPfir\r%7fQH#ApQkmfcp.+i*=kRY?ffH)Cm=?/8`8q2%H-#H#^a3Mkdg)p'07Vl=m7Le9&^oh.>uUd8AMA=R:,f5$,!t'iqQHgP>(QTAlZo\r%Mjtlsq0"EjC;9G%:d'+8rBN/("q*it<hM"TnQNVs4<:.br6lF1_tp^_S?1=$%Lpa?rE[$4Lc?HGQgmdg_:G^o"CFs0p9gE88`b!^\r%B\@DJUZcn&1%t:f6jL>S3UdhtkW\ueI;%Gp0=>_Ji:KX947U<!*`a"tmSppbY9q4IDS2R`)pQ+?F)#gD6auo&",o7Gq5KOBDMPE<\r%BesjYA9gcrBb#p]Pc%TiHV36shq+tirjp<(=C:B8C,F]N6uNP4]/dppPl"C:j6%fQGW!XR.7M"q3'OjL']!:&H"=m+o\-.eJ*Ul_\r%ffo?t^>?_N54%ZVbCA!W3ni3<%+3LKl4BeK_]?`f<<'<b6"U%E]e;L>Y&A[d5j34kr;mc\aU/fu;7-h'5^[D+`@G9+lHN\#G#0[Y\r%U$Rl2_PF^.-pQq7#AgZ`s'@<k<[`*ml.^IP;SqJ9I7\0Q6>a1np<fdCbo`fK@iuX5jhoM;]%L,%i4&0-%'5;I.ZmVEBKaqZ3Yg'=\r%.C"aXY/%<(e`G<Fa0s#m^#__E4,'lPS5CAAH'S]LGnW>J*_XZ0j7s4X!MPcFg>T1Wh0tT4n=g)gHCi:CK+AJE$R_.@o^RgI$R]f[\r%$)o2_qh,_h=gW9#Q=/[9K'?!.kd?=GoM5d13++>C;a)1HoTRRE'H,fn/N8!9&*-bU^X6D[)Q4Q[\E#7]X`V9;LWk&!Q9gShnB_!*\r%7AQ<VDh1VkeVoat/KBj=$`T5A.e/$1>"F>ujLdeeWK;h\?g.l#8;/V5:GFNL67QN>OqmWi/Yk]KU2/Z@i.fB>MR.5->D%bAUd-s3\r%">+^POD8^PI-5.n/*1RiSN!hXCES>k&lc'!DBMpuE]!s`3"Q0@kB0$TAKZ[06icno5)F.5%&=jb8A23<`hds_g"-%(%&B9:cbA8f\r%ZeLeGhNr!%ccSZ`e$f>BI4aQp%.]Yd(B?QJ"/tt%PktN7."HVN$aL>GPCoh.[/^D*4c/OjI4\JtoSj#OmqYcUk^!Q0hUeK4+C?#M\r%VA2;SGd!0V]rqTB#ktS(l?t8*6LaY"64;8ZlGkRpr]%D=mhWnnR8/5+S=_rU2Y1K'2CY0(pRfg9:=6VX2Z-2AbOQ\QK@Kd(H9W)?\r%NV&t-5TLS>_fPhl-60V(!OM"l<jE%WD89u!JC2cbQD)r*]#\'+l2#1eI.X;O17=KbgJ7#4WfBi][s`WY/$3d9=(NMIH*#[a,qW28\r%l]L$V\Rr_s5UZcd1n30<B+S8*-N]/3+i@h4W(e(;=1aulop=:t7&/L"RjejuN?(Wl#E<Y#U!<k[B[d?J\Ehh6d5^[@B[d?Jn6)iO\r%7`utN=4$*5-VK.t$9d?H,$J3F8,f%ZI?W4"92)EXOkK^.5MH$b[/'`8o;&bhibt'MBAuZB_=qJaSk3?rC;fT+_W0QSoQ\:4GhU7\\r%S[ZY\*HcNHkS;NTm,Y,k7CI]8DP5!2FG.Z+;fOS*KMg<52HlQNY(5Ob?;/4C9VK(&CfQ@W/)\NAalpdc?gti"Vl'k!VrIJ#.`.f)\r%n=P;GP3'(k^SFt6\W;l?m9n&uCpl](^Z5:2bGn[&Q8`F10Gs4eIuSPs\^nboaR_H?TP`Xr]N:=ACJPu4RrBe7\s:1Xm5gUAZ@FSo\r%2lQWQ!71/]7sd])RguiFm5n";Wa_kM,S`h&/bRNe`?oAE7Fcp$H85%i%j?$i[pIdbQ]ji93B`nj`W"jU#"?Pc%DJK;J^FA)LTNf_\r%NBk9'TWeKC1]f,J'K[gA6`LU%^&Qb\iQs+hS&s8Qh*o?2CiYueKg/M.8G:.Jp0R3L1>KRhL#6eBs&4;]'H_RBs&4:r']3gW*3CSU\r%iD-lrLuMWMW;-(jMa48u@]]?*s$hn7eo"U1Z<qFor%0OP<t_/V@9Uob<UYsNe3-kSi0@$DH4o8@l`lITD9?E`C#8:<BE8+[E^E"b\r%[I`"oP#uenD$buN$Ca.2`UWSW.=.U()ktW`]G/R@oYf8(CXnT86DEHpC.M$`g;iO=,TYdYCGaInN'c#SZWkNGmRPk$JuXrU1q'"h\r%#"*K(9"k1;7XsO(f(1LNY3/X[X]&dlLE=fHCs`*)lCbR@\YJtsd:U$?4Q]sS*cF"X+#'/@]QZYlk&4V)'$lUX=h&h#:@l'*ZsLD1\r%Z0VQ5-ctJ6kc1BPAFsXlVb&uW.DiR$qNG]!!rbbU7R_DG0B?g5`d:SfSVA4L.2#E'9qpl#.u/<V21Vth(IaP!k6ZTd$cucDmj)5Z\r%Y<?i2-KO[>DGN!OQY*30qPOgE;WCYM_7gr6rJF#drnh+'e`Krp[;%aLLt4WW.pd^H5gcraHdu`@0#kiA*iZ#X=*0f;a$A+a.lr]Q\r%VK3/i8Ct1O?Vu4M24_@R_fpP6Ra,3di<DYTe%K?CM.sNXb07l!-p-ppp=s#TgAHISQ/gk9Qt$027!D9OoVE5rng%rO?QQ5.;`F1l\r%=slD*07AI+L!eRl68")##J<s?7pdm#070=k;,N;_*12_CcHLai;=pr=Lme2Em;`W&rKn2%5je<`m+4\>^5[o.^,NP)'sleH29qZD\r%%sNIu_M:bWJ/cWVHlu=3^m`s&Z7X7f\q%>19N?b:L-YbGjT*6BC_!$iCq6'Zb^ONefM1PMRJe-cqLU`,oj^R.JOf5^Q^8nOjdos+\r%5o1^TM1jHX3l20CqKD$L3g2#.n+p]lJp4h@=tI8k>bk\oA@:4/rU@"8)KdVPFHnem(?1#5/;Y7S+$V8Y"h&6-+/FASctZeq2`k`[\r%H<"L5+ot/GTq]2c'8niNAYf2fn+Gsdn[O7;j*Ul:1u%8q>1aiQY%ueGm<Vl]IqW`Nmru[YqA@>^n&p[%]J&Md?b!`!IPBmR(%(5`\r%\677oi(U+/l_Hl_EDe5*/Cp;Q.iEtXSC)H$:<C:MN9t`0:<=p+HMs3EVlaY#D%5,<?)1f4:0YPS=eo@jg8_tCD$<m(?bAt)Zk[I3\r%FlH+N93]4B]PTkie$Kkh/.CZ#m_1iEfCN%ZV6)TNS9IXJ6/%3*.dA6q`UO^O5J+:&8[gij,,d`T*^Qn`?LrLm<i,rSBoMIF6$G<a\r%BN(u@]$keJ@kmZ:h0Z\uQlXlI"*7N5'aX2ej&ri*PBNe-VqhML$(0%Vg_3%3ZobbM%Hd>/T&,RSDX]^?oCRcZG!e)$Fe%=@c#/'O\r%;mYC/d.QB#33gu63]Jgrq,nPf>qQ,e_g(qAO\akn:!oh]C_O->^TK9fCZeV,b^Pi3@r^*P@J8Sb`bQ,a)Ski1Z6Yj^'kBq"#p"FO\r%bN)Jd7fA59f/&FsYY,E9A.hIUXaW.H357(!7^nh'oEATFOnRPP>,#6bBn*eEG`'K9cK\H_YU?GHYnY5a?baSEjQ$0UqY#BGIj(pB\r%Frg>gI(_c.L9haeU*@30hiH6o8ob/"h!am[R%/_IGD.[%NRbS3(jfUr26=6j=ufmG\:WHM\skgSY:38giV(_8]$5?2!1apE:EqeO\r%XiaT(8o[[srKP)n?9IAOa"]iO$c$4a)94/G`Q;RjO#CToT,6&'pA6#*ghe#2merfec*p_e9KsiY`&dpV]A]Lu#74f)+bi3%5j5IT\r%r>a^SeA*)@P;mj?Zur[,MbR?VR_gQrJFk=nOXWP$/[R7j^,_c.nCnQLNQu&Dpan=\lUg&D,rm1RI`lN[k613RecG($48_YZC@Q[8\r%LKW5MG)+h'fE4!Omo=qS96#=Z"uYY`]]M`1Qf.Yr3rOD#D_Uasha?+(MY8lgo%JB"Hn)^Xn`G(k^n6pf-@l]Rk3iDgIUi6t&jk2i\r%mfKq*p7%95LiHdFGe]]uQQ=eE-\-&YI*nl6&f8bE(6&R^O7O);Sq\90ct]s4:oPCY,.m(Y2X8<7/]cY8(A6)Pk!e+a4kP:tC&0ic\r%V:#G7VWmA8=^1%5qIX)OOYh=3XuFalqkK5'Q5=oA.fc^;fSOH,pqglHo[?R%1+W,[Xg4@94>2-9dO`6>p67hrTPpRMOJHM$2Kj;3\r%_(j@@h5X^sQ;_UQ%8$-<^Tc*I\ZAMGg\M.1[::-qBcW9k)9g6mU\!i#Armb(@L5iR4dXetW.11ZIS?*)aEB1iQF;S4PS4RCR+HPH\r%2NPC[UbR=f3*,+]5';6A]@Z(fo./O+LMip8DR1LAj`8D=0TDljN1SE+TTaj^UK]hBcq-^a8-ZD%g.jF"kmX0Q;Ke5NZg^Y:YHB]E\r%5LUM69-U.iq3fOPf9S88*;\n.p5]g5nGGsmaLDS+V_a>^)uD[-O40MBNfUD>g#I/Y;J?hfar[H:\f\pGT.(WF21>WcphWlWYbZEa\r%*a*`\/-86i&GTZROU@kQAP5G?:*=j`daT^mN./RK1/ObJ<f8Z<#Sa7gB4:R!(*ldDoo038<5:a&[(6MYWITO,Qou93;?6k75`#`'\r%<5AJeoNA+SQ0DFr0'!cU%IYt8'DK>[;u"H[1d!uR4OB@(1d!uR4<P],Z0V=ln8OR'&Im%s$P,$n.(S4,/3JrjkBbU`n6he\bk:\R\r%_Lj*M)%Fn&$P0?l#\eO,/A1nbT=Wq:XaT!c_B6Z77g]=<gMmd,;\1p;H(r;C"TdeL(,uT$.0t6tnA5<"GWa*5riTQe3sl%$gFdFV\r%=AobjT%ZElJV!mrj@'Q1'*[@J,6^B`qj./o]U#Vm)%N)(3G/"TR8OT\-aK"ii(QG(O6,Rn)VgO5OQDdHOcG"n?3Qs@+G+#2=t09,\r%""d=\DUM`^HqF_NJMdTsB+Xn)NHLjMWK!Oo7'Z]dM<!:]`mX4hqinsXP9t\L4Zhn!I<;-F]K>@Ka)Y@aX=#A9l*tI,6sf;WK*QM8\r%,6\+>aGV#@!X]"UaVmLLh'/O8OE<Y_V][DE*i_pb1Bh3mSTnl#Oo?=AVB%)kf[1-.]8P@"7Q1<C?0iC,!3I@"=$u!BL)7ej<DQZp\r%(T;TBP*2!(hRiTDU2u=\8ab;D6m[&#cmL6Mjm)5KIXs@1.X0:r\$h9Aitc`f^%Y83bI+5:GUa]-%s][n;$^`Q4LjWBm:F^<b(B[+\r%3$D!.,.G%*MB2ot@Ksrgb:4566%'p^LUY/3(@ur*!5.,M!FZ't_"E?h]m!)0<If<Um(MG(1;)G::e=>rK1b-=1nb_'kihmIfFabf\r%cq;CdL;4@S@*"1/@0k@2K]B!;KlEj!2h[*-Nd$."0LR(']EO$4L4;Qpdd6@@*$n)uSGoH:W:nrn^??WN_rLUBdr,N@J.4l7@)c7B\r%k`_>mGoU$;qLuGtalD"\?2G,:U&t&2"iuC-5.:=bPJB\tUgkpfJgE'iqMtdY5=u"W\QAJ+%:^p=1i4(6Tk2ha;6GU[MG@Bf1%]E\\r%efc`of@L8Sa>U69euVl7mneo(g_/T/@X+=AhA;]Lru[h7r=RGR4%64,p#=B]5BpY6R@2'US+@0_/1SBXKfmc*<65eZ:KMB(7,Y[r\r%9,)Zm'/^.<,d$l=>IUt*Dh;_=1IDSpVD`cL_MqePXOi/TmT"jI'iG0a`15<oG-/Y8nA3u:29"3lW9HFGZ?^fs3UYZCGAl1&s/=s1\r%3nu-:i`19nTAts.istApUZ666oCq0H&#C>Xj6h:5?0#1in+#lUXVG^t7]<ZJJ\]06dPr%Losld0ODmEKC//5lG]iK>i.d-FTeGrp\r%cG-m1B8sHVCc0=bkKf9_'TnOqZK?tu/dj<],,L(HRNi0H,?;o!dAMfU6#V!dg^ED,$M:c[VT!4FneZ>L!qHcbk6C)aogT+2_tR[l\r%lE,tT8iL3G]bNa_W&N[4*#++I>@BJU"@LVuKu!5e-5A,uitm3MJceZ]l%R1k*pXXF-siZX[Z!0<=\2&-UM%4g42&fdDp8Pk"@r&M\r%mro\F5PO-:oH<ZP)/hu2]+a:#PJ)r-m/tI"3GN4_H6!'V);FQdnlfpB"UBk1BCU_V[OuFa"%3@rR(4W%U!k9G^,+dDk,DcV1?^&k\r%/l(-;j8/M\j)i:@HuqW14)#oY^mk>sm+r_nQ-3I#fVC*;:?f)-/tk/WmZ'kUG:K:L@+u^Y*@3A4ok(gg*>4jt)8!R"5D'hI"Jqnn\r%dke#?Tc-n:O?T%/g`:L$CAPaT2!*+_Wp(DOpj/X0<7;@i'Q+F%V4(jIUGAiX-;I45VIrkD:#?YLC3i?,a4!teko&$od<DHeMm5=8\r%ZV[[d):`C`7STkZB2gPQ8Rt]DUKm\FChYKR(#!Y?<+?80OO=:c&QSj5E70FH8WSg-XjZBaP:hdi,m`aeKo=ruVP@,>1TH"M5te2S\r%B,iFNIQC*o5@)#@.FnH/rF2U&dke"4>"qYhVIrlGh3+3U:!KWV`+_h92*I]QI26Qi28-s;G2U(.m>tMqi*#<@Dhj?MNSPV>P\U&_\r%N,_!M8u\\c+M\YYQ;UFAPJOnO8kLu>9ZAn^o$L7u5*LOZ$n\=P01jiATHM#[#q`!BhG0q1/*SJ4oQE!t]9\=P9lDE>GX>#F!PS36\r%mEn\+XtEr]2ZE)SE)0g$+L&;<=aJq)%Y?W$g":9j"S;R\%K^E-)92t[?:2D(@UUWOB<hsOJ[M&-4UKoh:56Fh$QK<#'Elj[YeMaj\r%cBa*uRXtOmKLJr[CJPhggUYI/;\1p<N_2W6R<F@Zj&f,U&3*l(!c&,Ea-0C/r(msG\I*d6#afb@^d2@&5u@Ht/0"fDiu#kO/TMD)\r%O(1F$OYL2?:_;,^3"#u-%gAX]Co'2cn2"7b4J!P]@SjIh3),%*V?0aJD=S18C,c`iK*Ii3eQQ2T497a-WhohtA*U-)WZ'/P"0/q\\r%[UDI%;h:sr3T^cN4U4tWJ&GO!]IhZpa1NXq)DY>?<4/H2?p:?\Wbq-6jc*l2e4um:#$f.qjqmW&-aR@rS?TGc_.qb9-mQ'^rQN(]\r%7ZsZjjc8.Uk$GW_3jk4?&6/(r5$1%G3s:Fko3](=>Id[uUt'&K3Ou_J]U*kWT60-t(d/=T(OJRT:4&^\JTk6^^/?/>"h#"WGTnpG\r%)`Xj&R.'nlH9'4beo6Cu:7jWF^eT%Ih2&Z.)>g"5f=:sP^0><<Zd5$U6(Pba/$PQY4.M@Fp:dBJ:i4gH7h'j5EAE/AV*E!t#>2cL\r%$k`d(jP[sl0ZHWi5T_4SO[ct#4T7TT><M@HNVcoQ0;J`$DmSC78r]uG07>pHL=O&2IQ@7j`AjJQ5\p$C1%G1_BAea$f$4^4O1L*a\r%.(r<]*(f[^XFD=fdH<0"e+`7^VIQcA[D!q-A%4#ck`#oY+A!ZKQ.3g^n<c;=Tc7R>*%g>P.B*pZkTZ^?S<_!cc(=/5fQt[KYD5:L\r%jXV8HG*KG+EaHnHj2#;*)P'$Wd,.rDU=FFr"OM[9Z$g[p!5IXL9bZYkBed=+I$gPl6di[hd^C0]%HXj5LU:n'VeeKimFWG#]>Qp=\r%q_jjlRX6!)Z&I`Ao^0.+bOuQnOk\$]h@@mk2VMHmX`h-C]7-2mguSsbP;hrTQS[n:]^Tla]?Q)"AuEeUlc'#cm?VKJ"3Q44LM/*k\r%3nY!s-^h\4SPdt[9KGRC7ufd>3E:\caF`Y^`lismJ]@4j"Dl7#V:7=eD-@j@+k/>%NgdtLjRQ.n]'r9C,8r)qMAT>6E;ti_&Ile,\r%LG\41Fl*7-GU.18R:n;f1`+P]#-I_'9-`[o47l[S.Fn(>)686<pa.4`8i9:T-?+Ul0MQ2ED's`mF..>&SN#X!kss0lJ'l0=L=PSg\r%Y+;7kf,Y"G&@X29@p!C%%s2e<kY!h^7D+d%0HKEPes?^egMTfVZ0U46/Y4PIn<^<6"YT!4Rf*bKl&=bXUr`K69cBlE3d*L>2lT*0\r%UZ1?4BM+6p[%oDu5BIu'`;MWl^Q?+NU*J;cj1(%)b23:MVBOsq*Fl1*_JoeE=qfmf^RNju!8Jkq)Vn'\o"r<!M-po@b&`&haJ!oK\r%4,Lj,'fjV+%5@A?MTr10aeQej[)O4=7BseI7*m&,7Bscsl;_!Gh;+Z!EW@M*Fg+)rH@'P:WmX]c)%i(5dD[E)f1pbFmi1_B[F?Y:\r%;Z#:8PWnb?f.bnPf"kdCo_*k[Xde_DMt#uWO7`;\g(ZFlTubE("Kd?<8"n#l`Ed.%5+7/!Z(''9Uj;SFMYql%^os?fpHIM:ImP*@\r%OjH3aErV(>`NUDYR>2dIJ'iNiZ4Ke\$g>*:7UfREloqh`UP-+0n3bI;X3NrD\"Am0NQ$uG(dgf6iTDns3r<,N&*Sa1G=5!j:UA2f\r%jenb&mZcUu<Lt@\nZ0;OjkT@dPZ,20dAlEhf-?<8+S15--"6'dC7G%0=ljE@He4Zd]fNc(%&?M2`oI6@m_QFIP]9GHWhkB1IT_gI\r%3a\5llf7tMPWU>CGdd\.N#em0agH&1Y5'P>"`heC=C@+JYe86\Ddlqq,K#t;fXB*[/;0ASi494O/;0X=7%O!G@A*^\&,';H6?fX:\r%c>gL%/_%A!<@UJq.QKN%HX1/!(;^Hs\IoDg#S!B^5f5ojFXh]%^p&nL0bd_l#Y0TQiX7LmUcVS.$k)$mOM\U80J'$&P\e3'Vm)8`\r%0s"&KP$G/fdU6F@4[%=<ohkC,_r5jk$u8X2gd(\kJ!?$gH"tO]aBm$2B@d28V2Q,Gk=gbT>2/7ApTP+YbM*a07Q`,o5>Oh;>V.gF\r%QeV(7DBg#N9d4@NjC#3OoZM[brU9"Yr_r(XG<3cLYGF[3b9#GI85+As([gf<3F!+F8A1>:NH\m@/bA^udbL'ul1T-,'+`)AFl3m'\r%<[+qMr5egOm9U<HY3(]/`V@jN?K1c8$A#&`fg<1a-h/SV:N[&W"GCQXnM,qD3JNU%9HoDiO^n.lXY&Ag7h)!hk_F,Z\3"M`rsT4c\r%TIabB$FS9aFQ<p0YcMcNR0?fVJd%p"cESKW$C:?AmRCh";Qr\AglKZ#U_#Cn'KA8fOFdY2?ta"\#u\"?'ZUF[;QsOCd'Xqu80M`f\r%.&`.f*Me4pn,+ltU,E-6KaYqa!G=oQZg2mL20I:QE8\7$A\d7XeU?OgM<n]S_FI=Zo7]QE=mY=r4"f@JZS3=93@`GP^853"T"Ape\r%aG'6GgiM)>\jlDVgiN5W_8"EI:V^s#)Ou/8p%*dW\X31a]VJ_R=M,t#!3gdDA@uj6pf5"HH;:%4#Yn`4i03,:&d>rZ)$"%5nte,p\r%gs2Qe\_])K*rCB@gO7G`imdE!KhU]7m)j[6a=Y5A,Q7Dr1YKJ!k<1O1<Je"987n[6NR<no>(\hN&Y3F(+e?#k=`AV(S1tIjZeS#J\r%+^"n)Q,BC!nA8n@!Y^Va@27!X"U;k6ci"UG?4WV\$a9?^k[/NX[5[XR%mHO!1]qu=V,?2ZhZib(F\[2l[l1!&hY04\<=*nc>.A_C\r%M@+51).*!u'-Q'K4^S2-*>I:4]siRMEq/S+E,Y>.e,iD6d]o+U:huLc\#Qoicrq[#)i@DM#GHBOI5f)/M!q&$_+GbN$_:+9\A$;Z\r%Tie+r$\*UBg0-KUKjqOc(\"mQn3^8#rbD$l0o+`f?)`:Li\1%UY,\&[B!W7u5Amm7U#lV4Y>`-cTAdduo;j.n<$"hg=sYm<>3JKQ\r%kY,mn>ds`p_R;U:*L&#!EnE:+C[Y@1\;spCc87E#BW,P]kpcL>\a!%nnl^Hf3?)%[%l7<$*5crQngjetjb`Q<Z'j'sc)\=>E@A%.\r%f7K4rZbVl:>RNYqbQ;"/E@m1u$Z'\Y9#LU)<nbW$X>pKn*914D/`mo&.^^@q:?MiOpSf-\LMq;&/F`Ud6DK+d2p1:[`6WjuDfk7<\r%H2<<Sqo!P1cY"ZjpPJL,T$L6]mh7ikI%6nR^<__<5K;KZT>E24@et$k4]49abZbeM$/W=C-)$+kdBA#^hd.>Y?bfuT!u0X)mRE9s\r%2^0q0m,H'+-/WM,5bqnEDt'l*m'$YSpYl$3R0_@'5Ns?(OUh)A)R(LCh`m1(d9pRB1#r3ec`BW,dNdhu963"S68s&AgG"(FqmYJT\r%EC=p[2W-RS4H7WINbC4)[5Jh*?";4k;tOoV-(7m3cM!Zq=9Bs'`]F;Wh[d*$fUT/RWjETR69lbWQ55A\Us;]2`P?q)2j>)E`L.uQ\r%S,GLjJM21V!keWoJbB5SqM,d<>3j=Hfsa>`/HDgT*_8P53P=sJKF\bg]Tam'.Iqq/a(F8QnWo<@c+s&^lkOY-"(1]%$oX-EqHsDc\r%,Ef[f9s2O_>iI'\WWCa9i>>'Q+#fAb=6^.\rPa)TT7QqtNIN6:f!f&^qjg\L]k=#OmUGpS=B$;bC.n(>H0)R-Z&n8-DrmhMb>8p;\r%?O#5p9&fX1Z4nl`@AqdQk,"2fON7A8hWnCuq=*p32Z"QB-k0J(*N?SpFprjj5l1AW.`TEuKNpYZ%UeHE-hP^)U<jk21[7Dtmgo%o\r%07nT_FXlZrkC[m6"0Z,2eTqhoHf1IOLT-U4EPCHFhXC:V@\d:=BYbq^qEX;?K6Z("?*T([mdE7c?6,%!Y^.,?2]mGrq2QDSZt]:(\r%#+['F&DUI\;XIp>X8[$J0;CAcPp?*I\BHGT$&S[7d`C8gX`_lcBlBC-<8poOpGOF=4M%ck7?bPNP=8CLUEqc*B6cKWMUtN4!XHWU\r%p54$s#H;A!=0tU(V[@AOZKR4LCg%;>PI0*Z4'V8>\pE7sk^^'uk_AXi:ikW\WF0gK;AJB>gDFY-1&<C/*I[3g$u8nD/'O#5^$HZ4\r%^V[dYXBoCZWH%FT&Gl4qI>Wg6`AY;O?T+_"A2!3>:d\#hoTPWjGoifE;'0bK!\!33WN1B+i94BN7pi`'j?DF^7YTg[_UDn7I>FI!\r%>NfUih%pm!#.C+uY?TZBp\'J&Sg2>9n&)/u.9E.VMYb4$Iq,*RGl4tFgYm'nnaT,+4;Qsm?-s9L!Hn^S!/b:a"KNeK!>NS54o/78\r%>t7ODp?1/#:Nl@MEP/aMZp]O[$D[jCRQ)#n"[DaJ+]3Uh;%2&?IX$V;)eC$2`47.CK2pr6FoV0i/j+qj(S2"e.oT>E!>c.SaKf5.\r%cgc:MW@g8SmB[XU?D#`?[JZo]I*[QEF:q4Va:7:Z$%&.B=nPi41B%A9r3KO\2$M!rK[>:kbA&b5A1nCA,7438b+M2Vmou:c)"R7A\r%c=;_FG09dZg:[9;>:/_1C`I<nZ>ktN8`atp6_O\28J+,)[ek+@oQ\F@IW'Hor)kFSdIr$-&Nf1_!UH[(^>"RN>W32h(\+d5rtLE;\r%pX#].ZCGKc\EA*7Q`2'f.HjAZQ`7U;<-KG_%l.-Wh8`2:hk-_$8#pWicSj6bGPPZsr;64rWh:*5i_QPnlhAs.[E4FP15KgQCX'uW\r%q^]6u0!pDKYZ=KT%-QIg;e0iJJ;p/.q+hKaQ/(e3])(Ue,VoD5lYts1X8:2%LZ3OL!J!gcR$-NNot2om/AMMe6C^hM>\`bP?6-/[\r%L9^((QeKh>_]o$D]CrL29$No+faW$RIjr20B,rB$3#-gaI;'HOk1/!/H5cE;kuMk<FXt)]Mtb`;Yr^+mUB>[bC`3s)T=D*-T32'2\r%2%/VrYFbepGp>3&]6S'P`AaZ=q]iGVG<(1)llAe"O3rG(_b`>G9n_(Vek.VqQOGcW3L%`;f=idFVQJV*Bb'V(!f$Cajs=c2nCTdT\r%164RLp`4s`ADCVV1bEJ2J$:*hCND4c2p/"=$s)C]c*E7.flN:u.Vn3BG9&*"^Vt[+hm1`q(A0O.GiA!iKsO_sh:ol:ckl-Rl1R;?\r%77p=VJG'r2j8.0<&d/ccZFR-DTUB#Jc("$<m0<WEZ#$p#GCJ[>(^ghnR!`uZ_YD"@j/-a@Uc"t`)U;l+gcI#k^VYa\!;i,BqK)+&\r%lJaOo/"N]\aGS#Q>D\]sBFY)Q;9'Uca-2Q6]bca'4$SW[BGL_u;/.)jPBOoTWWuiMhs^s)&^Ok6)No/'.J/GmS3jA4KfA9J#$NMR\r%/35EKL?JPk,K(['@R4ggXVqtAVQATN<h+9`>&s<&Ck"0TVqPd'C;=YYQ-YPt>-5:'E(gbVm.R7&mVWR'dlH[$)sW?PoQD/@e'Jk,\r%/4.J2NU7Ljp?"?kmd6_:l)QB-lX,'l-m4(3K<*F5'TbSUEW2_`Xs1!N\iY:0!==@.po<s&"XFXnn;S;rg@$jMXBlt2C<>,Op<-H-\r%^oAtNHRq>@bDFn(qGltfs!a4P;qt2Ul2IKq%GbH+Umjm5L7Vj2dVZO6HaXT*L3,#(FRpp9PZ/R+FRpp9^i)dfh)l$'Ne`(kX\efe\r%2bbFN4:&F:P?c5^qF;[agk=GRbYbm$'),A2VS>t0iJ(R)R&1k*_X12_N,^uGPb['DW2Wi*0-IrIj*5l'+MDaC]/^k-gN@>cdVl+(\r%o>+D"&8lt.V@"9*k?lmim^6bg<4H@$N9@&q;W6c!VaN#ibe"4h9l%q+gD"EAjdthR1YQ-EBe9=c#6J/7)/6JL[E[WaA,9@C,,kOe\r%BG+CEI`BH"^D+75s0!Be'7F8ck0p1`:iBQ!gdURo&%Afi'.:]@/5gDq!rBIr.6,CIfL9b;Ie)n%)u_tE@K^n(Bc4a\B;Gq,1'2N>\r%8IkdE:97Q`Amo_554a11RadMard.NXHK1KL>;r%9Q5]94Ub(S1k"ejc]p*`'IQQnJE#7L-qU4ToGfN9'g>sMahV@MfWsf[\oL0/$\r%]4Z,76:9]BFE[uL3t)4@TY#CS;Of<9JTrL"fZf/_Cjb+NQZ]WSDJ;\7h/)>)3HUZB$`DnGM*-,eX0<1ZNj9/Na4L\[7p1V-5!*39\r%.-iunBNCb(-?=8c$dZ]8;:^:CJsiiaP][tl:tReN3qQPl$+iL/kU>b]]aG`eVZ\1--?Ar>_,]-UhC/=j%R%d5$+lD2UTDr!jnoBG\r%e$j!8lRXJ[J&74OQH.HB%Q>:S_Ck7\fJtPr3L7P-;:Z<j%N.t$jt>k*.iOd6jk7efKr-ss_Tl$0JZ"j&Yk+>$ni;hRe1Yp\malk2\r%LK55XK\]nam;=5A+#g2dItNg.8Or-#SYN8be12bPB9@>rV#4H:F"!&m&U*1>UsJ&>,[`Z5/nacj8(.1'.6%hN.fC%ZYB[Ns+XdE=\r%CnaEq0lNa"];dp:7G<mAKmm6rUdJu]?%]"mj*[sS[`,qc>RUR2(?]JATbQfCg:\OU520/GS_.M8pA8U!(#2l25pH`;Hf27QJ>ZDO\r%W(uhe0rq<q1st=u/?>d37h\&+;q^@D;*PuW%;mc,a*BBBhC&\JOraiUi(Yg<D1C/)dE,EL'X*eQ6Ldb92AD_Dl2\"JJj07d9g#[E\r%"tInAr9cTCC/9E8`2iGO'U)^NbLtU'^HGD\3UodjW4m(JL5#F$!<1[e+E@g_k]!;jrSB8X!Vf`ro$.1ElfR0hn'ARJ!9!mt\l$Vl\r%V;_D-/`-HoY6MhSH&o'F`JGt*#^-\./<P.#QABaJ88O81Ar6:+M5YK+(R@Vh/5"GhDV+!*gIiRAr#uZ+N1a+/"@7kIkXqI)&q<Kq\r%Arg=d1iN=sXH@1R1#XqJSjt-HM/_%Tm+[b<LD/YAJ<?W%IDIr+"Z&H"'1$CN-Cbrt'p%c:1dDY63"_[b,6s+9`Tto-1&UWlBSR7p\r%p@Kuq6oI^f0RK=G`pN<G+CU$=5n^(pZ/A#XhpQk("R5=]a5$3$\%;_!(^3`h(+4,PbLOl(!%?)>?V,<']jfhtp_mT*,V>?YdNp3`\r%G<;lkrPN[pJpZb^,O\@Yjf"<Ld4=]LR*@Ns)CMLe@VUs_"Z4J7TYZ/H$m#E/ZbQJ%>l0?`.A]k,lrogREY[K*+6^,hV(":?Ueh1W\r%gnU3^1$l`18+0RXK;TE7lH9"](^qM_$u11\dm2c`e-$PMoH$icO?^Ja9&*c34UQS/If86QE\GjS:Tgjl5h(1o([7-IpYEPG?:-U2\r%C5bTCPP7eV#[5i>lWU+XJGO`n'cKSk-M\e<@@ijgd(]W4p`cr3?S8nVCkZ61FSV2kY<En:\PG-@AQ=<Io=2hi^2S9OeWoY#?To!5\r%ke4`o`W+\NcUFRaLOh)X=N9]D6F21?rmaM9j,:aL-Qc9[Q63g(5J-LE_6Ab!&FTWlCjc!BQ^]q;\509`]db)Zr<b42Y/O%rQbRn7\r%3AO'/IdPSH\+$Q^kDACMIBZs1@s$1E`Ve!*Hj&:l.f\&l2r1MnVDQp%;,GoeNUR8)FWs7[4)7`fYJ6i#YVVS1g1uH\;c!B84I(t9\r%$JT+[i_)8Xcd%V\P\:NP`jf*+oKo+Fq<c"XIlp]VV/,\mqU\Z]lesYllFco7F\MdXWGCF.THHZC6GN&.!mtMs+nQg\O</T&qj2X!\r%IX5E9.#J7kooEHP)e:#_k2*4.X?X>k3p*nK.:MSFLTaLLr$@:eon>DM+U4CHFo+mkp+tV3nqBU)gP\"Q1VEYPPZ@E/7k_P;AX-h@\r%A^6B;(?<UATW531JQ1/$!WV9d)AA75Nc1Vmo-QN@/BB;feeVK@aAu?p9<a?c/pN?RA]4=m4F^XCr9EY[@"l<rQs&XF^dc'9s*[pN\r%4SrLa?^k'hEV@I,?aq*#O8jIb[o^sPpa,o3k/m@hH0MYRhEgMoB.i$?f=ssn=h5@HrRh:NQDO2YAXhH31ACHKYIn(D't.t#]e+;i\r%1M(]nhm6MK@RSS\6qo;"\L:Z7NUltMh]=ATbfsLle5:[eqk]?bNpL8`D/M8Y*gX?X(Y2"MII$Kk(0TdWG6bV%4ioJRh#)j6.>hpu\r%Q%"]'^rERUGSc]2]mT"fDo:16kMS84UYY+g'*TDh6eGfV\FYeo[YQrkh?FVa/S$W+-bk&!#BCE@+`+!"#-5K]7F'WV\+=i:4mZ2'\r%2qW,2mJdgsaYoo8(OG7iC2$U+@uj40>#M`In6&bKf))cfXm!_#hY>Q4ceF`na#nsVC--FrE)ujKR&\)fO'fiTS1ehII''ThQQR_/\r%E8l-@Y9uDO4P#5HgkF9R*"0E1cKu]'lO8?MORK@^Q1ZGXa84p=nbqocHu-`-f^\EVMUQ?+9=h`TYhX04WI!lj9H)<.5*JnZhp53Q\r%hIqW?lNMbR"'kO8J^n*L3G\&k?cPanMK;e<2>lCGQg_S,m0`,@YC]r"o.o(G]-Csrg-\[5a0g/XaB:W!E"HqpIf?p'qgs6_GQf!T\r%5:j7$Y*$%o:U8;hO.=aHP)Xj=C#l?rUr4WFads^?p5>Hkd];r.`,:^D>&gn,]QB1(eah.L*4]_CXHo3%Pa$J`c>%Xha-\>>,A4Es\r%oJ+ckhoJqP0E$,ChD91Qb=hljL#.ru>$h%VX)+]T=Y8Ne'F2?^jK-odq)e+1OgA4tqP8s4fh_Y1YkRa)[)2KqSCR2Y`uIGO8B!=t\r%6nrJsrfOP$*d2lrpPk]Nr-lDI^@]qCOUm`o\&dZ8Sgo(Wc>%XhB-6ndOgA4tqWQD_2f_sB9>C8<p55Bjo$U$sgc'7Sb=`pgbJ'+F\r%QK3Ku+$$BE53mDa4X+OHib"ancoZ8K.rH-bY3d/gWtdRO?9NLlSCJMt^9ZuB3NK!P7D!-WaB:)@%C7k_NL\NsdR[.$)EFjpUa=]7\r%O2tJ=(K'8aX7-&No,G02[Jq8N3^3J]^-OM4jl<*Ti97!-=o.C=T72.ap&Ct?-O5M&Y2"Bik!*5Q^>/?Nm#)[P\IB8?lLaN.o?Zm>\r%q<b9ps-W/+(N"V\?39NolRqRg2h6p:KU_)H(U*f0qChlcL\TKCK_X9qp=9'4Bse"nbl@)-d@I'&lF1^e(8:`ZlTb>i@uO*P[a"U:\r%gZLh.qr4++(kBF&/s#IM$M,s!R=9S`qWHQ$\V\t([slfXJ,9"_a0M,GPPf;_qt(tLFMIgq.sJ.%s/!6p]_9q42nlflrI_R4?2<(_\r%YPrM6meu<%`QbP<_QNjuqPX?&Hhu2eY<;UA_\Y*2IdX3opFiCjZ,sQ=V2'!'&F>*qOn.5&c[WV(gZI*Phu*3Hk?R`$HNus$?ba5D\r%l#X&A!R(GpLXZgA;ASHLSR:d-fACl:o1-,H="cZX=&lt_mJ"+ZhYZ<mqpS1;okS*ln,;hg*A:H5BAmmf\T[/*>B7TpHkht.`J[ZE\r%2d_5V*a^1!H1?Tf&1Dnorqbt'oIY"t?i,k-J+p.u?p?g(=+>SrXZ*/iWu!CQNs(dC`n/=T+]f?GIIT+>Wk<i?/h)-(r?rcDLHY@/\r%Kg#.RItcd_gjj+NW*[WaHfjn"?bc>JSt3WH4?W4BQiF^>qr0H`ci)spj2GI'Q0#6NY31r"^%^ZIndUur!L$:Xr-Me;fEZ)E^CHgk\r%HM6n[%kg)]4`pMjWt0+)"7gEk]s9W\0"B4[rR^rA5lhA,$Ks:\?MWf;=9!@7k:]'rXA$\#03ihf>N!r%#(E0JnojteIpINrhAb\V\r%ob6\JJ)C.uc*,ZW]B:e72tL[cI<Z.GrjPGL^OY_Er9!97?eIXsIsgXsIp`$8`Ja3CdC_6J6HMrL*e"01pV$#6S\B:-p)@@'Hi;4P\r%?Fi.B&Ab8oR+hQ1pH,_)COEP^Oo>47NPRgTGPI;AkpZE+kNgb"o>.idhn4",kM''&qWPg-M@0eD2L`i'T5WFr`VB8Pmsk8)_Spj.\r%Y9?*@pAXCPY=626n_fJ;@7U5'NPWqI^]*'$ms]TYeUKdZCKb*@kh7\NhYI*'S_)bDV<(7+B7K^P`@Lu"rR3*"+eS/$`n!R\^4+*4\r%*aRM_q!GuIkq"46YQ*hBWI<f*r;glBn[1jt+)=NC6>/W5@<1Z0l4`pFh9B0C:^PY9<=cb']c1$+^%14Pq(1C9p;<LUIJN#`c[GRH\r%^?*Jgo05Fc[r:'urJ+aJLB_mNgV=U#i9+21^mXj['eYg#Z!P-<-7pui=9%47)deq=aa+0Wo(FHWIY4\ImHWMS^V9o$qWCRFbs^/a\r%'XS$8dnS3@?i2,RBISFU2qqa^9U#>/^$G-7ouS;sDS@6?7D.Nu^L-g.bnkj"O"S2Erq.U8k8UmZrq-aXEVEpO)<(N9@3?_)@t\3-\r%?%-bi`f53t*e/V1_<VitJ*GqR=$Cj:G\'%X)^*4L/V$G%^Jr/Eo1(Uc-AV[]5JD.7V:R>n>JrbYoR9%(o=:nDrq4N#3JFHSkM9o<\r%IGoXeqWhM_mPGaUUDr\%Yk?VH^MJ`D<D8\&QQKLYntRt')9Ik#XtNCZFR2R7GkIuHDuC[SP`#8OrK'X^-sK$[[pT-qb(ns75N.E*\r%=-]KQce%/FI&n@V4EKQYqp0Zn6P<`PJ`+FM+&$s1hKsf&_Xc=;%pIG'PN_MaE:<(IO.O,Xk-`qc^QNd72chUXm)MU]%mRVq,M>I>\r%9@2h@pVRMT)Z0>5U6-iL4S7UKb<M\lr`6=R?G61D#Yo;CL=Q=nO,LK@Yns",:&`.R+2;h$<1=+iB#4qYJQC.Sr9fViM.=6tqDY%+\r%PGAa8FVQ4g\%]BMrK[9[I-(IrAG[pHQS6(%nah7c5md^X7?S?uAKTdQ\_A`+:I4g)T?lGSrH@3C0A9c1ebugc3_:-9ci*RVjZe4j\r%q0m`4_m5\XH0P1;0A_.KI;clJqumSOfC/`k>2l/JRe^k<IX:DWLHiou9'PAKJ,\a0O#Lr?%s(ZopuhC5^MFr>@&X+ubLJ]C?%*Vd\r%T`"9YHMHXAJ),D3Pn1#]qOA`H($m#\\Bj$Gp?cd"?N:ilU$d,oqcA:CpAP"r]lW:"hqn/-UG"CGJ,@YOq;8B*$Sorqki'e0TDeE(\r%UX=JhhEUO6i2%rrgj&6^@_C%%X["_Qiem5Hq3;mPIt%?oX5Eq5qrtcLE7"H;Hmn4KkICumr%eXe2_Y/q,lR;ToTu'IAmu"f%l5\c\r%@LgW2o7,S`>eP'c/"^(qTB#SC?Cm2V^MfWh'fOf.6JT.ls+aC!r',[:IrP;4]cZ_CFmd*M5X,2;Y=H?;!H[SlO$DO4^\R;IJ,Jo.\r%3$8/Z_Z0,?/t<a+T9mR50*]hKpZGkUZKK3Go:,X?0&1dKb+F/h^N9:U3tLb/pZMRJIg)O8mr(C<kPG!UcH!6"T^8`B?\$O_\"GSU\r%l/MN*TH&p[f"(>K(&7Ocs$5c:T1AC#=+1D4_fOi\K!Nt"LEF`")Fm"/V=96Pr_YAf_<6;dIL"F&]t>8,+$UWtn\=S:]C<_A!<(5h\r%IK'3:?[Y)/rrGXbmrR3__7@s`Q_TXp0u9HrG>@?f"iISS_mC8R!b/6O'.gQ+LKSj>QO]>k-<-Lbq9;-Rr:/855<OI1)tCE+meuq+\r%r?$Ld5Oc9%ebPOrrp.Cms#VC-Si[b6^Mr`@c-O^aHB,`)LN>?S\6c#n$b+-UmIWJUrPC-JCHX8=JG$STi'-Lgi)<]UVn@fTM.8L!\r%,G0tiltu!ID)GpIF^).]>G>V3j3G(S4lp0%SJ=N]:7W2-pq[4bnU+JT#-!Sikb^\S)m"#h:u4MX/M/M9AMEO>Sh`5h$G2APUBQSC\r%)P^YhdcMgK[<9dOSF&lOr9iS\GGd6l`#WMsY[5]fUP+U]%Nt4C4n/V^%YHV$JNF%5#:l<,0<A#9W\nWg04A)>&/`";W)I_5@mirt\r%D3VHtE7#*j`XDqGRX[<S3b.6V$YP&<_FkDP)c)Z?"q""_'B*aEPR="UGL(]mQ4I:5K5i,XG7hmokFMK7T7>hbeLS*p5l(/,^V7U[\r%(\nZa!l5b0qAjuI%EVhC=U3"(GS(1\#2kn])Q6]H$G<G[>S(M-VA;)QIX94._3,]eJj.XRXl>YYao>ZT)h=_&M$rW=pf^p'3D,Yj\r%kq[AA221RNQkVeZ&l+6K9B5%\@ImWe7ug)q(EHqX9ph\S"5T;ch&7OoA)-!r`9eH'&>XM<As=<d:frH9IO-Tu>)Gh_Ff.>1bc"[:\r%^e719"80c*a@ijZo?s6d-FnkNM:%rP[Ol2Jlo[aHr;oRl$T-99@sgV'$H8-)=&bcbN$GPBg?<98i>R[P@!i%**$h^1GuT/8GWPnP\r%<%#U35VsIFNWUk\,'`kmYA6&4M\\4uB]+\_+rlnC80A<`^a#a1CdMm82EH7AHiaO0qGGai6>G/#>5=%OYbI(P1`A>"4s:*r8f:UI\r%-KJk4TFEA>#@J4HF[l.OT:GDK!U<LJ/neTM+WBY4IV_@;eg0rt'7(&hc:lJ0,YTPH`1"b'PV\!@65s46:,E6tiRigj5Y-kA'q:<#\r%+U/GYl05DY(_UY,8MaT'"L)HFiHCG#T;]nE51+-(Lj[(3blY7u@J,Ej<-'sk5tH[?p12eY%S.G;C,UWDfcWh605Q4TASe*g^e(d;\r%"aiSg+DO(`*DEXLl7dU[[*C*bla,RaAV@]Q)g>(AiQihO0+bR8+/41nKU&3n>H;NlTj]Figgn?"c4<MTD0.q-BW+d`itC&H>LV<U\r%>XD)N..>(\E=!VJ(NH+%95(#Sd>Yg%'"i&>&rdZea<cMlI2T?Bb$&3YmB#Ds![_RtSWP;;-`hr!U@C:/o*GdSU(Y=BI"E)EI%o$(\r%8b!)p+5j5>24r6gfEMn,%`9Ydl^[OP4tAfo7`\6/EA->c]<6K!-M>etK?gU/=In?kCg[#%FVbhh^*;8a'Hk9??$-/oLcD?@h6$*!\r%g?@$OVc/Be8!'/S>+/1TTWX5a)Tn]f.Y;2L>]&%0EHBTgKTLi:8sE)4\;E!(d5nkB#p>T?.9Y%mZ[p/h=W!\7/]KG+ZhrRs9G7X.\r%A:#)_nQfeTU$t7<7;$aQ(3@ktZ[i5&if_22%ssT-k6uG/>al4(305P=&<]#4RhH:s]aBIgm$.0iXZj)s9.$Vu4\-O2:[1?3apW^=\r%bC-Zl"(1Z>Bi]E+C>bnJO>P$9OLE!75[fXOP(CUR1W&O-(Hr!3'`f-[8,&BTUBBFX`NFoN/3!8CLd9Y0HV'Bpd<ZAH3`^FQCuMa5\r%(UT/FODJP28pNI$eeQ7m;JCmBj_3Mt:QRGA#7@GX3:Lc0N'mb>_iY-7b2OQ`@G3#tibA<kcs7,3$XWt-1Ik@OO'eVS^jRN5>k'Z&\r%89b5D1PTY(Uf%9F!%C$7,DLAK,A:;5/dHH#NPc#(&kRf6jlksq'qE<8HMLkZTYeZ@<5)FYfs4Zt/bIpN$P`Np*d)8e/hDfbR`%Gc\r%8SVbq709La.%Fmk_bh-@XW.X!/[SC+_S^UXUbHIp2CQngmQicC>+^`l+R_4IE@4Jl.5EJ4RS&CuBT\XX7UM:V[^XZ0;Y3ROYd7W5\r%f<f+[HnoPN-Cf+`LNEmjq']Q'iA>^End1LT!L65?@<-%VJHKl<"_V_^T3`nN+%\J19YN\!mBSoJJ\F_-P^J$k0=Fn'Ulq\!.p"B#\r%UP7a2:u_NrAqc151P_Kk+GP&B+eVafBkTip.hm=rac`ihd<:&K9t`lQ(65smDRY*kgH>,X]q+8XckAkdQo?CK+d$-<EF(>@;k`D>\r%@tfehc+/Nd>$>%jm;*`C^S?Ob_S#iDhTe3aGIhd<hf8Re!2"9/bBt.Q3^O5%f1R%sq6$LI9h*_@Q\r:;\YBuN7ut_oY[UER]!5#g\r%L4a_,L/g.5FpfgcQX,j_nPnu"!kDd$F=Ur.kWI.A(d\1p3LJ0'hl6fF@gk&jR^=AK3?VI/Q,X*X)(ef=VVk6V0d,".k2hsmX:L!t\r%UE-EN,2P!WDt2[U6-2FHd4t:79*msPF!Fk,n:&PBBka4Mp0;Q^ptjJF.V7T1"R0g+##=E79T9':5h"9eQ!Jsd8/i>oHU3+A)=;Z7\r%<a'\S%0BGOqUBC*)$BbH,@mYH\9[>P*U`"ASAZ2MGYkkc"of!op/g2\$EZ,0CWT.0!uVUteXPK#c4JR*j6NZN8r7Xsbnu'GdLF$+\r%EB9$ZL?&U,Ks%ofTV,u6l;ZQ4.[sR/X+_eh$%62>Tqi`_T)@k#2PE7WQPT.FfE;[U$5I;6U%$4^3E*6j<jo5h7KY$W-5:d48F%ca\r%TgSnRc22Gk2SiS[KV.p?Z&(G,n*8=)mE-bB6YY3Ep!3!W%K!@9@n'9%kWZ5T#mF8lUYA1F'*VndTi>r^CY=AgWbb"sn$RABAeRe+\r%@8s!_+Z=m=157-AYmI'8K+$)#]W_]K[]kTX$ccck]1&C+()E;8+GkYi2M!J??;,9]:4c3uOQ;?lfFdhL;6FLD\R]+\>Er!A5o@8s\r%*bD8fKLQ1kHL5YOrfA)^"MaS2EJH;3?C225-[3qnFbk&3S`N&j_-&k0EKh2^5j'h(Rth?jfKcFk"P<4!Vofo/3a=bMC=WAt#_[sf\r%S.KJO+U.7Ebo2NqKCJNGMQm@l[]kKU$cdYEGnt2`*XbVB2e(8oC[f1L[&tdo)*k#;X;A>-%3@>nXc9?+""RTc6_f3riX\e>_.2i1\r%MEb2L>7^q&__?np3[ad*c\b/U&b=@dgrig<PHT"1RWE++ln(k2=$Q%rHP!:p$HcJQ8NSH$`!]UsIOG&bU5_o"FS!ETJ_gKE7th]>\r%-43.^O/(os:$=dMbR-_/WM"'DDtLl4?G)?Ef\S#u,R)[+<q;uSAcjFBlH!QGDsOmq&T?u^c6Kd,4cahl^GV(_kbd%KOhJ#"6g<i\\r%=$+^rJe-h#XX$FQ^eDfo&b]kAkfh4I[*[dTf=dJW_O<Jp'@h'c[@)Bhd2b<As4[`D3J;q&^Kbm0CuD+LO`h5l)&XV)!p3A>#%slS\r%*a"Fhp8;;R%mf/3(dlp$0(`VM&2jTEA*GRKlC4ju0YL'_PSjKBLJ^tiK;n47ftp<TY6*Z!jRY+:?3_?,d"ijdN0=[`bL*u!O6pJY\r%0_U<j4CnD(j"4aX#Gog.4q:rJ<bFieZ-kEVeNPQlCo*q]0@?q/*]VR;+['2'%!H!J7XlfqqN.:_nkg+.s"LNE>31/qN\H%lB>eUE\r%$JKtLfXA5c*f%bYW+c0Aj'ZQpEO:%FEM0_'/.HtD)=0QpCc]S?i1ht1j:9tmeM%?aIiOFhO]^o]%ef,PE>8%e-lF*!-lR&&VXVtZ\r%4+!*SnZif[CXbT2@f^_N\=6)6-hZ[)K22A'd*$p+-[b`ND[eM6iM[b_H*o8"<GnLiZ51ku!T<Nn"[^&VKHUTjHQ4jZ6W,qbh?mq7\r%@-No"Q(H%DU=!Zo5l6c9nRuPuDk2/S22nMiGUibll*Qefm_mI)\s"roahD#(MS84WFco3?iL0",N<YF.k^8*j<P<8Q0g(/Z*ck!_\r%`6^+EUbO]\<MEeBlG\ga?6OVr':c%'W6rIZ=(mF<qL3U5&:m>_B.&M/>o"gmJKT:n>G0W,(\Ii4n&PUF?D'aq7pR7Flnuh8=M;=0\r%IMQ2gml(0KA?NbtUUSr-%Kegd/ShQ"!j^R];S<C>p543cma;I&gk'K%o87V7%4H7hd%(p^.B#5QEi8"Qm#s4]Y;fjsghAWL39$Kp\r%gjN>;f>7aeE]];h=.C=s(hC:64crAh(_RUO3BUs`%]kqt^#F:iI&YY2i1r!50XA4_eb'[*)>#?*p-;r(V0.5]`VQYg[E8c#Bf>CN\r%ILl-goPKHB_a22eC"00dmB=AR1ra`_;H7UO$nNBL<H!J)fgP.kf>6*m*^M00YCIIV#b[7UGV+%f>U"\63B:R`/ck$C1?L>E_93TH\r%d:hL+:3!mQ`U1(9Y\##6WgZLM%FaE7l%KQU8Jn:=-@qkAK;b@#GgXAQ)YHm_7qaa).r/_8,P5[2@&-j/i=W/67eM&!SEd!a`W2L)\r%F@#dfY\Abrglk7p%ck,1O3k`Q(k]3T&JX"\\;J?`OKjF9]a:ijH?ls/i15+GFQ;;UX-nVF@QO]3:?^dc$q[=OH&P;pbr=kr*b,g_\r%fut^F/K@]S3:$_dX[aY.:=`Z:>;I-":PDI"OJG8RO)kU9%30t_24Iub$_(fdE)LKRUP`hpAi6'>YQsQo&*#q">3CR2oi\PV1.#<9\r%NOp^13*Y[O"Xe$Y1]Mm5KN4\/X&-L5d1kA]Ahda;@gJoW'3rd.f%bAK-RKnER]sNg&mBUC,=[)J>QT[;4Tm6>6;%Wt@E'R;dD@.I\r%%3/<1fPU!2CL-H_cY-ZMYL1qE'Ys'GR"Y-AYYp:G8YEhPo%M\hJs@o]U=$bJ0aS2XWD*937Vg@d6+7Sa@1oF0MX6Zn.je+_a@ijZ\r%mq*2rPnVtPij4,Xou#-/=$H_oKMq_+-[4Q]IIe+A)-u."S"K'PNdL<&gT&VWg'an.UO0F5*::!pd%27oYk8'o?BhE)#gb=%9sV0?\r%[;apUmAC\49e/2S:<ZtP3SJ%u'LjPm7I@[WH9pAKYE2XQ#Aef_g1oTVB5%%IA>^.t##eA;>H\T*]<%)KR-f%Goa8ZEh!>HCqq2hY\r%ljPaT3:7Xs]3iabCjGd/08S8)W(=8BrJJ6!R(>S4<hldu8do7!7B,,Hf;]eXBdQs2DH,DkPLL&B@5GM/]"!8&JM])2<GNOSq+8,,\r%l38nGe;Zp*7oVFs@2%gS8g/pDb#qEonG%maC*#+rfF*U)MS\Vh\q.-C_H:-77Wj?K/a>g#JWitj]E34BdiN)cL(b[7Mt&K>2Hf?N\r%JREn,l:)X70?qLb<cpbk3,^jh7P\#gcn;EP_-';.g56Qa:/n?5cqBo$Eg^q,m08RiPBMe`k4)p/dc3r/'jc.;8.l^T%2e`)+Cc@F\r%C!9uP./ur>g]U:;A\i&L$+i:5&@D&@K;HCtG;ss9emfK*(%0pKM]D,-2n*12L[n=O*kcM@&q^2hmn#5&8dq/?r(Pb??qt,M;8Pre\r%-HKpdbj:]F*?$K1-1<Q".jX6o]>m3!7W9G1(P&%o:!":#[p7=MJ_12jgpIn'*g/._ZoAkc.&DNb<pcXp3I</cUD8gc+L89Xk,<.(\r%bQA.jn_&]h:^^79JfS!cEaDGMJ7*%/"Xb.`dj]JZ%2(ZG/*AU91m-WajWfZ(B(olc50Fg/#_59pVhTdFO*H>s#]r>NVZRTYj;!@l\r%.1g9)Z?_.f:79m,%Fp]c_jA;<=kOC?[OBk:=u[f?)+.;_d>J5U[t*B!20tKcgsHGp-Qe\pl1#kLe>jX5L`*q2a##bSPq?BDG40s;\r%^"n"ODF=+=pU((oYU^[]<\s2uSa#Y^LT^D"6Q)q9/[WnC#@9YXc?Am:.G*R8B##)jC17VQo[5IQra]+uTF`_4aMJi^^j![NTCBc<\r%=M_in)RYXI)r+k-H3B1TORZTo@h,0]!$.n<Wi*]RE(J-iLfK-h?mH7+-q,n$%]h3k%ZM6!M)bj#9+?M/'mgK:H<3[J&&KDjl\t'!\r%4uq/c7MtF="apf?Ga(.V["H`qKkj^938-`hJG*@bdeQM+8A/]>:'eKLK`5MY3je/o=.r`:_6id(hX2b[$Q;+V4bgaBY],+]c%_J`\r%raTfI">c8ugsSM.?-S,[fd*"]C`(&2`-\u1L1,]rpnFM]*1[VhLn(;,PD'SN.d4U&0k+IpE8jpsA#a6uFds)uWY@:\ZXP.f[Ns[I\r%S-gc)E[1uqEFL.uUtlb5/k$X&hQD?+Hrq=$@tI^.(c1ZX+D(l:_khM$=]q@3+-%Sa3'Y&t6$Mj-%,*=^R.4U>G2^>rP1o4>+/W@R\r%-^bLG+9t(+)'<bG5Ah<j-2':S`J^-8i$;LST?sGYnA`::@>$Y%;-5MY1AjuJ`L2qprY.aU)CY!9JBh#q0Q[P/5uA2)S7B.L8"!G>\r%jE`jq\!)(*.:Y7d.0g`7&++;GKi-`,]:]L@0no4!Mf]3d,,SVl%(dNM*eZIpamq<c`NAUCrIi]Cl(9c6remClC#r4A5+JG\!S,nC\r%FBY.fLiG?3!Jj.V/nIZX7rL5]?:;Snc\ig1VS_oP0JlQNCU$PmoPK8M0+AhHWWfFeVC^!CB:n&/!-JT?M:p<VBNc;gS(qhs613*>\r%O7K.;K8f?==@o,4Z7HI*b0kMmjjVYB(A!2hhbqPKdbl7-YKn$^R*t!FB:m]%CgC!m\H4XJS!BR(TY!RemL]Jf0&*-!8]g0LI#in8\r%]s5>qmds]8<4Q6"A%H?KAB,JCU5qW7[r2ks1uS`.IDZl-V?dXK;u%2knfIrE*0d1JA9>d\l&To-9rn,Q_t>'/1T[,tPD9Fp.tEWj\r%`l>NA0WTZ0d8#j%M.*48Ic4f@V'%QKpob]'P4tdhM@_3<ltdi?j[B[1;tT^]m&&IQ8VN?36.P*Oi=`Ss:#beu!get\jt>eWeM6b=\r%8,!Y%6]MF)LJ\:VqMl`<0s-Fmo!Fi0MPlW,B)U2IgsP=Ol4fUkO0j<:lrP"m<[r`G)47o)Z,9cQMO#F-&T&5Tp5C>e=4*D/oe_%8\r%D_uN<K/q,N$8n8V33?l-6GQn0L8:jb'$=[:)<=n9M&:P"CF"K6#mSWdI#ThKZIDq)CK/II2/9L;bTN]n\&[n$)[`Mh-l+OkgPWPq\r%7ndhOJnF5$UD*jd6lK$.BVVY_'SKH$8;:!q'\FE9:V:ejW.CR+J?UR3WPI02;mqN6CiQgQ<^Hfh!j,Th(@<Ym[;?%_qdubEa8QYM\r%LCT=pS/Ymc$rVL>iZ6MjJr-b&"o=5=e#*N-E)>RW>NEK!H4qj[^F,N"@_^1;(-7gk#F*4)hL$l-eg!T5aAE4NhEi/5/M-P3Cu!$P\r%'`I)n/B56eB=-FI4cbn,54*n6Mh"8:bU'8hFOgXBEmPN^?TD(eab\-`;In/dB'@`2-SmCA&#hB'`Q!Gs^[V8OW:u48:7K66\:$ho\r%%3\P]OQa,"*I6@k&ePT&'=d!Dlm&mai(($JD6u.he"ZW&]0-7_KFQ^bB=DhY(lYRLM83e4AAI2DiXBBf-?h_^a9##Sj_&-R"_^"j\r%XVNs7MFS%'j!kNDniF?GU?u<]]g`>B[gn3G!gV2mDE+Xd2u$e@0$,]P;:`VYkPcmT[V&pC'f98&OO9lE0K!$pER=J`$?QA=#8l>J\r%O/V;KI@Srq8G7gYM'N]7@>MB"fV)>2<4kXdi_]FW4aT$UNW=AFUBX@SHKZBOD@0.B&5%*3&b!7a.\]DC5q@8P&O9ZX,tJEG!_KoX\r%3Wt?+!qdu4'/hg[THTu5;HZH4\7:9pG+V1R.dV\*+K7^9!g,bVV#kf@CT9Ji-oFk&,.uL'3OL"(iQojo."d\c5eD.Udc2D\$fGLr\r%4lcnlL=4Han2IqTlIV^2_:?r'NY4Oq`b/])VGIm4eQCFG:+6i1H9s#V<"*Y>lk,VndPRpo'$T#")tBF+N1P\]Hd7aN!d_6;Ob*-/\r%BS(hGfr`:=$]uE'1@Bs4TNjSqN0Men,O0Cd.F2ZrZuZUlPdU#(\^/UX5PJ$AGBAh\Zj2Tu8SaF^RY/Q,9>lbMYB*e10RIkUZjMgg\r%cT(TNDJK/fU9S1IPFH6"i>A)R%P.H\F)!\8!c@')i7*!P]e_H6X\;E1Er\\34GK&`C<!2,MK9'o!/t*,oWSX>`i+H:#?26F^o1+i\r%Ehf$YC6XmT\O1=NP]MGCHH)q8IiB8O8j<ue"pGH"-HnJ-5#EB5:28q@$?UKeba_T6q88^g#N4)="'T)!]:)ZZW5+)(E,&nRKAXPF\r%@I"D(fq.2!iRDHZJ.B_j;bP>6!Q*L<imaK_(P]t%3Fd]#BJXh`6q[oCiRGEmp:t=2R[%b"E[do(4<HXZ:+\U5&!o/KT"pdj9@282\r%_GW,L#$@mT^LYbrTi1WC(tm'Z]Od/WA$;0.)&;uL6ohGEc@jb4Ijn\iJ>jbB0H'T((aXg9\+gReURdA!0JGZ*R)3AjU;V.a*cc!P\r%$p?jnYP%F97h+Vo:!)0=MUspE+W34rZEh\&g1]G5N1sM9h)#FabU?(iFp9a(18AL`RJE&sDklWWU*=\R&Tib_$qi26g*U`LAeP>e\r%noeV'd8H3s6lYh!:)6]aq<X'.=[Y"&^)BR/?tsdLRDR0OBVUh]PXqTNW$?t`#+WM%V1g^[rd1R`<J<6?<WR*WFZUbTasW9B9l+7*\r%eAR\(b=C(q1soe]^o22jF9Uk(Y6;]M"=>*R!S5nt)RZU[@-M52Xj^VXL(8cuUFoRr^nC=pl]=5Z!j'e*M)%u*!2F3\.4d`."^%Oj\r%<]b/6"W5c+cr'H:'OZnM)DLHE!Xp?!E9,!c>liMiD%BNt=p%eM#liHt63Ge0aeD]\f7:,uF:[,/"4fGs0rYE0J/(VL!M@b_=+E0r\r%Q8&YP/&7M^fM_FqmL$2<X"Q-u9EE-HTe'BBSq[<jR2$t.L#4UWcBqu_fpp_QdDr<&Krcp@McPS`R[=nmjtP4fB27TS%"f:*"RJqH\r%"-A+F=Nt@t+'9tL1jo?ZO$8q_6psN,1",HV/??J+4:7H2=]Pp$<uMe6BNa^tk;DVG?tORWV*X#XUB&]2b\KLke'5tH;1jgnea?sS\r%PC!nUCoYQ=S?7l(X1cWf`pDm9ZHB,YQ17&F5F'hu%mCn43L'gY#Fa"p+S2fp6.XG(7cp8#O\H?Oju'mH:6nmLk+.JJpJ6Rg[jC_p\r%R=5Q9?QcVG#bdS+,=L#Cipo3$=kE1m]f2XO5]+1[ZTXN8'u!*^X*o1Y&**osd"RlMYOIB4*SBe5*lRc:X1&`*nL^u<qt9pi4jX3(\r%"?@.Z6'F$653srK"-mrgCrZiF>,ERY%Q],&O/]c?.ki@CPZ][Yo_Qc&kg+(AW$smD_K=2"gKU27oLRTcKO."&(i''nniWLbMAjPB\r%4`"C`-<;-TT#ZJdA526<OJZtd:Igr4'&49AB%fS#6QPB9RC1jb;[8`DgoA6GS8=nDD+-.b,MCl)<E<6iG*U%5Hb-Vb(j,pcH'L8\\r%:4=NniV>N@A[/cp='9okSp6NSGr$,'@oleM8M<p%c8Sl[/nD46]0D?2rKj(lZ94tQXSm$d@VPoi60X+]i&<pTiM0a*dHh(9JGcRJ\r%e8M,[#3b;V:0>^U<teU1,Tuh>C:o8M16bX9ej:>;2XkrO@F-tJ4XV-;@q\:\%I+dnm(0iO6!'4AFggZ$ocq3dn,!N0]6%[96#DfW\r%oE/eRL6sFR?&gDY'EW=SZ%Ee=nDfE0<'$95jE70goVNcA?d\0C<YdX%V`.;O(:qO:+shV9`+doT1M-Q.-I]PJ3_NV!p"X5SdkI+B\r%n?072Xjm&khWA"';1p=_[Bf<;/uD])pfNZ#2&2D+9jMk"8[(+t#+kfNX00pQ%PZ-kq34sik18;/fZnBZ93H^\hItkdF`5PC9=["E\r%9W6a9(R3g=QPS<=;-jkQd,TeRVfD&LO[_Jd*fAfMM./@tj)k6a#ei%,qX"3G8E5V;\q9&tM%$IO\q9AKOpF)WkmEkD,r0.QTQmm#\r%T+Z_QJ^:7a\s,E*12'XDGL2nQ&j_:$h:E0o0XP9"JaWJu8/jCEd1%p^8RsMmAor[krK7G4o]ZRK^EbSU3[iX,n!?GrO=_]1qBZ`2\r%@-Ia(pIc^od7kG(lm7c['5kI5mer;>>;Spj)eer.aM=.)($DR/,cX9-6HZhW:e5jt3RKH2[*\uh,\dab4n+l:;O-)[jAJ_6[/H1+\r%7qG/\_NL<aLF\\DI`$<I#.W*[e&onHT7=./94FXgH]?8Z1[;3dBcD287Q"JSKG<,[l(AhH7P(oi^P$?DnOVeNMMgV?l,6Mb7Kq:P\r%9M*uIh(6Q2T8IMiot(H%U,7?c&_ffU"0F,=-P/,J?rZ,jU>uWNb)5E)Y\COb"ANiZ;O]hT5&-.++`Pd#HZ@;nb=-V*@-LKVPPDiY\r%4khQ8W5bcL-CPau=R%2\T@GFKe0jl@8*0B[$rHCu$8U.$Gme&6'o;U@"mtq*;GPPBR.V/Y4-0_:J*SPsFJ/M:dcDpB+QW\7dl$cN\r%hW:\X+@0.fQjeUGkut6LneNocI,^t+4e2fe(hJWr5B<M3%!&SN^Jm\!;O#k![d0R.CBe]Rru6)lbI1h!5Wi&3/\?PgC0g,6d?Pk]\r%FO)e!kUP?A0S;l$H0]4_9L.^jN;5@V)J2TEDO>.Fn@(0s@/?ol[$`b3iGo)_BiNN.6+PcW>%j[$1!DU:[M3l!1<_`%Je?maFuRWQ\r%8jGZd#rg'fR10*#0[)M;HCqAM1[rX<>@E$!N:R)$'Ot`q_[L-C(I"3R(hObBD+;!gatVk?Kb'69,+T0!%XF^kTf1.T/YZap!DG9j\r%1]]7!;k%Bh[aFp3!2^VuqWM6aR:[Fpb`m4B]4Jti"iSFVg+q\R<q,XQ8U&@:a&g3.S69GXO+W9B9tFP@4J$W,p8]`#TJ=9LbGSm<\r%E<.)Y[&?PVk-R\!BL^,Pb)(:UToC,70[gk4Hf/G%BajQ=F-'$:N]4n7;_lQNNll86)5h)Uqj`/&H[O,&S*2S5\.qc`?"+\Lmd:]l\r%3&Pc6AW44495J4ig`r+>lL#^uKi)oP=N7;OHc-[hbroMRU[IO_><"KaM.N3g]1Zu!eD)@9EU)sEZ%Z+tQe90SHb733:<d'R)5loj\r%'$E6lF,;K=]"^lhj4):#2KS/]iY'G%'dMh!iA"6UfjGuWSD?'MPC*/a@77r!=XYp.-cq><&7ciGKNRF&Qctg0>tTO$:gVMB:$.Ur\r%c9!+ZliYU[&(D("BhdaKBC!JZ6?tkPW;!jU'0#)On'd$tjeY+0hf.WB,r<Wo;&_V#R5^LrD>(gU:R7&*;>mIV?CjPD5t9u7-r^-"\r%ra[(]EI+-<AG4AEMRD'.bYqmj3=Fs10ujK(:`P#0_a,)`kUSD!F>QG@HRa-O/[@=7oOB<G!g3FLke**u9Z&gt=^`m%;am1V^H=05\r%Od6Z,TRcS%*^ZH".[pAf6>o/P$1TdM^Heuq+$7bW<oCY'AjAM44Ki0?n`Hkro[]Maq'"gE:$HRj:$D,Y65Y#egmueR,GS,5U@a\\\r%N]:9f6LP<oE\i3g$p,aVPQ$6l=Y[GM0[8_T&TkGU,d]Y,T@0+Xiqs(^)EeDo:Ziaio,*LHMt993/)7$IcYlJE$V`F<On)]p_-nm5\r%r&I6AgR70*._X*PQG.G;gK<="92o%ajq>Y"4F9;4DVY:o\jWss)XZ]#A^9<1^4*8j\R@*fCiZ-BcHU,^.-<'&4X]am27YpEp7-Z:\r%8^*I1e1d5Qc7Ut;*#r?GNANP*FH&+8]PMS-BXMe'4q>[2\'inGi6khDC`(5,es-#JFJY%NgAO'S8Sbr%i[df6;]]cF1cFI;(JeO>\r%b47AIN>DLg4q:'Y7N*5u-&j`>%-:V%8dfM.(d8GV?R(Pi&a!J8CntmCYqa*:/rbjTNANQ?j5JG=8@>#.`X$du1cA5hdb$gG#>8PO\r%<?mK_&cQ``Co#o_@fm_m/rbk?NANNtVY3i#D"%o6<Z2p0\Ng[j`eLeEcdUM`3?Bf4NO4[%2ULJ_9k,DJ,E30!V+)@BL/p]H[F3\a\r%g?knS[0G)$3!I?@%.[_GO@qI5duNG23GMEe3N"KEE5fRbQ35ErS*1H3*#PSc2GqJn];Mn_S@Y(U3MZ#6`hkG)AeO3a\pG?bbc$pu\r%PV_UmBl"-OAgUC#W4St4.@cip6oh15T#N*uC1\(>S@X%cS&2.m8X+;]hJ$d5Ve.8QcDeFRZ!j06fL-UTm[qLREU%!HAXrUrUp4@P\r%MN`)<87PT'5t84].ud8uh,Cl]Jr+^#b99@<V1;!j+e&6@H3_A27NsC:?=Ir>kriuu3Y1:H$=!D56&-Vtp,N8HpL4DC(>TSt:!P<<\r%T?tJn[..uH,P2Zf7uW4ZisR[`Lk21PGD*M\T49:dre*Jf'[hk;HIs^"2$XHVB[d<C7FePW5lT<,-kp*66BADJN$5A^7d-]BdI_V_\r%6Ef=;91PQuSBr4C?B"V+oGDq(*9E.))^%;t5G^'JNtL'7<;LSKrTka*M9pN]C\!;BniU_s'dJrbVt0ugj=!>$([07r-7-dt:$;aA\r%b/GVD9V+cKR2DZo4.R2O-PqtWE.K'DD9CAYS^%UbPY4S'Qp;1o9u\Frh<DS&\^V=gU_;m"/ji6od@8DhFHfEi171J5nG0^VK[6s?\r%r*V_..,bfP`fOXTPB</Td8A2Eg1_Ec`5kXO&5LEqURUZq)5.k>b+ojlr?ZbPl-Xp:;0lY)1=O\bkSp8n6JG1<b\sKaLG?L49TtHR\r%B;RUo]"u^YRbes$Thj/0<h(/^3YjB&C<:N(9$XRYi(>@%gHR@Q60#]K\RBb4g#P7UmY_t1@k/E)FGuuU2u'UY@kNRrhW6/DBji]2\r%9F@HJ7!T0-$mdB\"mk6nYU!Or_s=,'`+s`EpiSJ!j2T^dp!rdNhkRp^2Xmhi-ro^Wl?%I((YUAg?R[<=ZeEI5Jo7Mn1%[(gEECL;\r%VR.kTHlU5n.h*IF4ut0,TA6B4'4X*_C5K:OgTq,%FX-c6r:a%@?hlF+nPS#Y2?7O/2-'e/$Obu<h\bC=(&3RTDiWY3L;`<(N)Po%\r%M1HiH<uI6T`XlLkJD+Bs6m+#a1Rt](:`H#J7$#hq'!S0q#;g_I:h-cr<4RO$K3L4s@a;dA[@XNN$,bIV88gh#P(-nTEU0ZD59\+t\r%8H52o=^M$59.Q'B,4#l8>;TP$#3LWU4K4?a*h.&?db<%!`D9gBXIr@84^XP-Z$#$`ZnA2k4PSMpLum:#i#(Jn5ZX%ti7-caUJGf6\r%*9[AI.HG;N(mrnYh]PE.A!q3njn7["im;1%g:Es%e!Sa@@:`^o0[1eW0[DZLm(IVLFhof0_#(cTq7ruKq+%(,\pQPOm&OhEV[Q7"\r%ii%]+'.8S_jY,WsEPcIB=@s>iLFj]_W3Fcq9bHoa$1D&u(0/kq3CTIBRNf&#r#8RmgY[EW90=GUHu0^hf;?n_2WGHFXHk2s0NKlk\r%3jpjKj%I;;Bk^1tH,9qdj@`F-+tLc"EGBLZZVPLR$A%,._pH%QKe/N-cX`.k9qc$t@&A*YBc+jUVF&a"Z53%b(V7\SVU3;^AGO0C\r%`N@HMWMMT\@FUOh;q?%&5tVI(kTW'0MF*eg/nV2ZMl^HdG17^jgRM^)F[[(R;UMJLC(OlR>Kb,t`[\:899tX\/T-"08Zco*(&>^G\r%?s8pk'_uhuU0+VB7)F2bM:D'<iE0EQ!g[sX%Hc?h1pL5N9G;]nnh$]Wq+%(6\n'O1f;/Pt\n$]>VL,%ne[f;f`=(B^NHneZCg%VZ\r%k#l4(k1S#_Z!*Jf&F5M.\!.Zk++7&Qd\)BNW[+1+Z`EVT,%M)IXC3)bC&#QIg0g1pB8p9.--a+$1h^n.Ke)m>gcmHNG+I%i`PmZO\r%jY3E_%AA;r.r]g)EB6[GZuRl^F(KOD;kE7MD$bTG2Y5Ec\V9I;\&;Xqqf=WIQ2(&8kaCR!^*;e-^c3lSf#UJTaB6Di=inlIWC=IF\r%Xg$<!`F:.4(tY$)#3bjoi4O+HS$@jinrini;iBDfI8Vnsk-<Ij0Jot-B!Qg('9fPbB&\Z[i5@_QdM.Wn%7d=m.4sZgcWmn^R`o>g\r%8cFQFMd)g%H:sG^::2nebtF8r/=Z0dcW3]&fci(_o0h`;@2N4;$;D2U>0IYO)/Zc<RF0S3b9p%:DLM4M/^7Ul<]4jZH?*1L^G^K[\r%Vd5J_TogmFNuQ&-DMkP&r?Jj&4j?MK6;>SA1&Ek?CB>X\Fs73GpokX"KQ[dA,+oT>*e*=_L`%mUG<,osOQZZmHA8m?.`AA9JWBi/\r%i:^WenJ.c0_%38UZjEGf+C]@"36HIf7NI6ED@QW&,#$#eFaSoon:_$7(W.;J"Rubi!!mn.-$h0gLhSSZKZ$E,kj(l)lBEi(KJCJP\r%m+8##ic.QsD5XTd0SK5Z;rINT8oE4b7i>gL8<I0NYX@VZdMI3m3-5kufUk_gDkt`W>,MjA8kah43l[3J3uX_,8W%+0KnpP[e=fI5\r%%YP4\"2>*Q2?P7oOCLo?7QnUJaIPTs>IDcKo2'8B@1h3?s#N9!j=cpE;Tr"+d1&Tc'6noR]AY?K;:`UmMpeW0)!E]K.%q^q8<QKl\r%hFRH7-?N1[,5LnKWYX<%B`Z9POH"MtVf+OK'i*Y*fiZ)XofSVY(:Q6_bY>,1e&5r:HVH*S[;^rKlOP3P!Y^0609BF2@!KHfd?-Vf\r%)ib!O!Y&8)Y01!^UTB1<a\ca1+MXBaUPS@SUU-)6Wu=`"lTq96W1rX^]S/7I>53QoY%e5<*Q:OAF(Z1/q;tg2W(G509inX=VL;.=\r%/1p!coMJm`;Qk)gWj8Rra1]l6iC!aN8?^(T/Hl@Q6KoB&%GeG^kCRS2.ZM^M4u^gk=oBXt=+o<K.V21eB1^IXCf>l(#h)>=Y;XdT\r%'IM*-#D'G).73L8TH28].gsiFprj^P/c;.@YCJ6d=^lCG!o:n]U7DD'%S6^*h,Gd.B+bmbRXj0Y'.ifT2L=<*W,A9#>-;kK6Dl;H\r%,DAA">(C9H.pYtXqWs]NQ&kcp>^acu$9&G[!(4FN)6K5/`4D%jH!,\6aQbEup(b<NZ`gTgb.8DPO\H]A78b"tqIL]pYSGMY!cJ>>\r%;q[!f85$"V0ICA<%4ANH2.'fTCe+$\M!e(L4eOJOX@K>FKUu"*1Pm!je.uE1.+DjeYO\uQY;TQD&\b87ZJ!S!.V>a2>C<iON.mQ%\r%Rc%A`C3s.)K\ILgD;iK2@e>;Ao2Q?k%6ckPq.`nfo@6kLIj_t17UqY>2WLiHP_7WJWsgR2PVpej\+sc(hjQ.2b#$A4'rWF2R.F=<\r%o$V:^UWXB0)8(iXR05R@;n./O!fU?8JXM$N@&,4(cQiQT\eOr^[UflhO$-t-P2J_R?;cH*k"-El1*e%W:(MHE8NiO+)bN!t*DA[b\r%'D1Kt#VkNTFsdJ2U)lZ1+\"!LSEsm\KO#j%k^R;t%?,m"`4.+ZCta=TH\V6GrbRJiO%GAf[.?"i8YEaZWlVIBodG@<>,*<J*t8Bi\r%KX7OcW&lbMgTg(7;LB[W;bEQ"[ge$=11^#TTW3]p-=8W>I%k:bej+=dl=h+a5Z&YVBRg3@dGtZu@XoYk<%S=Ce"fll,.t6IUT]^;\r%<j*Pn5S9SV'F6Fb"Em<:MJ,n=-Fe]BfS$ArnkN2$_G%f3.lL7$c4P(!9sE->gHq54#eRFSFti9bB<b]3.a4.C8;tM'Fbk%d(:[C8\r%P%P/f]gUZ1SYLBN*JmKnd?3'D4AeTU!]nu^OZ^u=Ih3V,`[(gLdud1)oI$[aWR3SF,Z"R]3`8s9lU\,n:.7[iTZhHt#t4`HNl4bs\r%%cmn`i*%/Cmku^J3Rh[J]Y7'0;R3,D@@3-n*Jp+73`;`,^Qjg)h6r?>n,dH"8)brWF/=F7\>:E!$pM1t,B:*=Omo;dlUVG4qDsd+\r%=]SH^2Pq^-Ul-BANMWtAUekA68Rok'P!Y30(H%N83g.@*ogrZ83g.?!HECnjpXYH@[V-u_E"j<aiJ"fbQ)2*MKTi:?oNXg_'XK3%\r%/A60OoR@gT`_pn(Ke\LeLortUFX2g`bbVLS*D'\d,,K*8KT:^L<(;tmB%E(Y$LqWU=M!fhW2I_4Z"+kH@F-3b1mZuZ&eTH<=Gi!3\r%0P6FbXZqJr,Rqn?jD.n?,_]/'4P;h3*@VV+@:st>Lj"k95#G/%&kWOK[#^Z_4)W.pe>1;!R@;(h.8t:IQXq(4@AkbsXd\=r(2RVT\r%M[)t:_l&Hm8S&s7Ua@N!+L\*nJQ.+Q2+bB6RY1b&$*-W7A()mL.Ep9eP]MF4H0V,m`6/oRWR8S^W(B$X!*2,/P<d\<r.o6G>Ycgt\r%=,BNWD05GfdVe[%P#L#C,2Q6s!qJ*SRS^.7)13SI_d5&\WK\r;dT5bMQ&_XBaA/M6/VFHQ?bo9K$R&"XRq"%Wd;:`I:(W5R.b'=d\r%6Rt##K^urMMH\7s1\:rf&tFSb)<Y`IL5Vg7;?p$^1^MaUJXEE.$FliJBbn:\8Kd4+dZXnj;j3Hhmc`KW,^ehm:#fJQ;Xh@H5%<i\\r%-Y[s=8[8/\StoacJa_kkkXc]kLadF1f96n3gZu!d5t<%qd-Ct7,2kP'o^])uMPNOpp46O?'GUqLctI:G+]K_(`tYtSX%4/+;HTI=\r%r[O)N6a!htFekD#7G:,m8/_uUBPCA4NhkVf!&9d877W6bf$/#FO^dW1@hT%-%&(&T7_@kTEjr6o0m'5.%CqX$paK:-(meh1&EBZ_\r%FLB.p_u"aE2<bNFlh42>fVC5ZM+to%od#Ke45)*u(Hi)DH4oE;lUa.q-b1cu7RbF4%nD/Yr;dY04X(>eS2qqrQMBAi;##SZ8dZqR\r%0_P)3NP5Q62.;^O3^^C&&K&E4o7@H/NR=X.!t97*;:edZTH]-UY$+52"5?%`9qepMQMMXmkNe;m@nMY`T7'TJF^[k,EPOuef$[N2\r%=rO=!ht`5Co_bds)gn;P6,In=1HcC'CK"YeD&A^SP-pZi*;bat)glLAPa#1)QRlKB>28uBdp!c=`[Bf*ZaHdZZo3H6(b<8C\<lI9\r%C:,sKb'V?*W]ZJjD(7*?%7B_\Z53%jA)A.'[9adlV06`_Er)6Qimr=GeCsO&Xi3j7-9Drc:)P(dqR8=n"H;-S).f>2RPM1#RGMA)\r%&p?m$V64UV#UneAXBL:L0^posN"]5j7TP\%imcu=B:mZ\cR:#F)M[CN.?q*]GbL(DD$h:n,r<4bCVqj72AMZmP-pZi]MM)32MEol\r%P5H8s(:V$To[]m9#ei2*c"g6+A!ujR)>Vu#3lXd(H<8[P@;Kd11sI:]1!b*<N-oILAZSLiDk("dqX0PNRtFO,L%"]R-u6t]BYaBH\r%N&"j[)2\1;$>%FX72^BeM;D*^@LJp%/&J5IL;jhaI+=mLfqB6kbZI:NH-,V/V8]R?5,e^g$"L@u'q//M'1On=R4qZ7PK=Xp3K^qZ\r%1_l7AL7rl:=bD":1L7)J-IYCiZ@#>[EU0r,DeUtTW0X;Ie'_d<a<j$u`G0*B(#pT?T#k\\.OZqZ6h<^O#4mL\Z</\Q-B!#gl!m>D\r%>G$=A9=%\fUkT&Kl\kJIc),RG5r)54+K`SgU2Rc`?uhK_.&1u:<+@7#+c[RjOG8fVTEI<$3jde@$b[7i$V)j?'ef$QU3OY.n[g]]\r%qV<A,0!Wdj2JFe)<o=EN6D.!giul\\Q6'&[5q:$37NpqoI!D$:@VcBAYpgUa:ZWW;;kf56dSL==&WD6-D^rXY_GW.2_biRoCP3.8\r%ToH>nQ?`n2`Q`k2O"[@RPE`HTUp,sIar'e%`jI2JW^ZRBc"0%MAJ8g5:+cCGm]T,SbN"BdiD4^#Q!S0L8Z>0,FAnk6GZ18@b?JYT\r%V1nIS&l-;7RE)3TpF:9bP+P'%mmU6FUV-5N&-E@oF$_#Sp^CWm0['c(YKV[N.g(t`j5I#hTS\sMQ:7<X\F+PN@jLuTnA*>(g%qer\r%"!rR20l0[\gl^_:#r4Cb%o-NY2_n;uAgB)#64ukH=2?]bPe=cR',S[[fHV9Ro6As*oNEi:$J-e7>)_c%5;1$_(s;YYBq^Nhja))o\r%Cs9<d>+FajIkAt;E_4:@[VGiEpg(GoAGhHnMDB(g;9%9k$Z1!Dh_EG.cG:?$n[meK`Ci"OQ[Xhk>*_L\BFMZa,FeV="F5&=FD&"U\r%VtUl4<_+aJ`40J)*_758$'@Vm?tr[)l9$A&SeKcR@EN[_mTPnr`"WK]*d.7<4^tp&F:a)r2AiR6jK=1ql>`LfHmd_"?-A1q,2J$Q\r%`$Ko8.DHLa8@m(rl9l9LKa**FS@6.e9gg%3(t.8Ue('-ZG!(&++X'n39P7(`"V.jmU'7BobEblekMR^4o]3>),sKY1O,Z0J])$6B\r%0[\f$'7g-$0T_WgU8/O$V[!qXoU%el_g9<bhrM+Ta\*$_f:D1&M6K.b8PFCaBHJT:?++4@,pd!Cp.Y)V32\>c.Q?B&Qp"c=)3ONJ\r%Jo\"j>%j\-Kt5[`ES[^`b/)b=;&CdK=d0<>#+Og[Q)!kmUq=c(n)KKZ#P4`@.L1<>dTbf]IT0S6."5-N;`U.GGT&6B)Ja\a=Raa@\r%:^8HFMQk1..-*6:;4'\H;r29B0btAXN!ULYIQ(q;poG#g">Rkd<8Ri`\jK9aNZFhuMB9$'7LsD%ciD&:'Lk$sGBXH[0+E55$G9(I\r%QrPH2)#>$`/G'=)*q<uIpQL+Q?>56]@>,/t*RB9nHAngoTgp-@flZT.@$F^I+\35WN+%SuJh[KCF=9Di*;_I+9Q`+9G[_TZR%4dL\r%1sn*X@$HG<;Pc4cU8=_-U/SF!lHi?+eJK5sFn?iDGb5a"D[=>tV\nLI,D@24R2.89H0Emjnr=NNq`8m*KCEsq"U<s$4\qfmZn!u.\r%j5fP-*PrXEnp-1l,/!@l2)iGqM7:FK>M>jFLnM&=p(9;W(N`TL3Xd-g;Fi(a65qL.oEb[3'F`l2TZp6Yo6).lF9A`>B&r0Q68A2%\r%M5F8'65qL.lkKm,M,ClH#rM7/K=aLe04<ABB)n8S]K95E8Jf%->k9X?=Ys:^.T>D6.q5Fe1n]KL/N&7LR#5dM%6WM"[HP9jA#lKs\r%UYLj^2Xh^BA"Z6C`*;g93UY>4Mu4'n@u[[?"3!_[/"t=q1CA0j.n]p,3(;IKPMU'5kY%%%J.*f:/Jrf\`E6S:5+>fjE^/Pf0sV4>\r%G!8ZFGm+="^lBg=OW(0miVYEDC>]EI[8I<FVmoiST=8'\T[YH9<>+]4pl(7r*auN[,?(P`N,CV4)(i)!%<%mGZMH)X>boB:1`EY@\r%hZVNJ$RnC,L=L0M\ahMh?SiTe:L>6NP=IO:>:dI,YmpnEK;p0Q*K<o?LU@/N.+"eB#1p?Sb(Z/cERr0'QUV@\EcpO/[4aZL;^ghL\r%(V*<'.-qVYi@*FK*N0@%Q581&CLPW@=mLflrOY1u4)i'"=+7c6d4CF!qRa`MOQ\D;<&.@3AGZdSm`@nWb^2sF(gIdZ5-BU2UToAf\r%48/00;")Hh[S=Wl<:SY8_e_/iY%B#&;kY%V(ZiV1eNt3,/POcLcFM&m3`W^lTi2];-M0&ef8$Fa6[@oBVl!m;D$UMFeJG)V)\BrT\r%DmW].N7Q1'+d16M1n47Ub$&I0a&Jm=Na-/0*3=6JX3sY^cIq!;NjTiV%']][CcNiL=q5pUiY!JD/[WpR_NO*7/Zj?6f@]r(6*&Z)\r%?ik$u`a)O*@7"tc,d"rh$+d-.oL='m2k68m_N2ttoI`XJs*;30AM#V.E?[@(_h26nc?@NaH%M!qpjl;@M>%G0RDD`_\r:gDB@oR#\r%KmAOHK\n`@R+rEQ]UU32*Y_X/,R*U09_h<F$ZjuqZ\@EiV==Z-aV,t&p0!2d@Aeo&]p2LWSOg:"U3n)?0VB\Q/orDIq^p:Ee2f<^\r%``b-!W9EPimi82^MPf>@DA^I#'UJ#YOB#Yee"sL3Qnf)uh)uiQ!il?f%#)?C)_DLM<:(1nb[[0$fEY7?gh:1K.A:h`Q(6iBfFX\q\r%`[b*D@Z2Lq.X4O=iH&X6WdQ'p?,._tJHF/,.++0qIg=E:dhI.C!]LNU:CRX=]OB?[+KN4ITeg!G'lISTh91=sQDcBn[T5Yb#spa0\r%FS+*-'a3p:3`ltojZljC?4\-fXIOj@p><tf'@R^"<$]S6b'J+.Es?!]i]UcU2]MrlEr,W1]a:"i8_?O.*meFt.bs(B;uuf\#FUO,\r%1G>1O??1nRe_#gVI#[VP"o^8u&rj<I\8!lV=KR=0%2dDNTD/W3W\9P.c_dTm=G-,pY1BXbI5Wqa?Z2-RPtfL+(.mDWm<$QgKEO;G\r%)<m:P"<Lj3`cR4$_EcD_;NhCI6-sfm72Y5>IYL9s%ML8ekgZ(/DHaH//k!ar)]u%l&B*--83YBr]V\d[5f6t60;8UUaZE7.+Ob8u\r%"oH&)Ga@QZQK$L2kuj$;=>`NN.Io,ZRAe>5BVYGtd&Aar.g`d*:6pDj>,5`d65s2^6U1)if)@G3IL7j;'X6noNeB"md;fYAik@j=\r%Y0'LKFK9s+Oe\`kF&;'E85#ZH#n\LI@%o>BRFKGaBVT?sC#/GG6Zj-gc0j>KV4.mcSG?h6.H31WB[,(^bL9J=/5WeopcD'sY[c#d\r%S+oMdW?o(\>&ku>68:ugr6/AYUK_38`0e1lQ73K53Qf<P.ErROZmoA.Q,9ph>:tQg#hNkoR<6]>JB>j^Eb/+Z>(RO$;SkoTSB`=e\r%3iIkZVl.VgI!W5TCl);J;J:\,AeRh"(lS'?jD6919Fl$.TFJk-nu$#][\O2o(_<!leZBUI/o7Erd'AhC)1!uV>N3JlGhPjJQM?c.\r%@ZUIp-u]8a)O/<PEBG>1Sl]XD^^UC6=Ij6:0NNIqTM8.?6-SEV1(YdEB<]J+XEkOb/Rpa1Dfh5K\,9nM+_"(J/<oL"k`qbcC`nHT\r%6B]i7Z@L1lb"9>(Y'hMR[9!(<_37GnB'J%/;\C;m\7)'$j!7'[l:m@??hS$FX":?`-H`^Oe%]R`-0(bqMk:,fN-h3kN-]#t>g3YV\r%8UP@(r]<^%pe'?GUSD2Q,ZHi_^e#+Hgi*gHNp5k&od3e@:JN@%ZA2O_i>r6%$KRB0Co#:fBZ>;=-0^%W=HY9M-\KNmFIr48<f;Mu\r%]m.Qm]Ji)VI2W'0U'GJ+QQC>,a4A^>-h`O^K>n.+-Y<seA;p4(]OBaGKk,9[cpj3ZfhF4WqB[%-a;D$,&Xf"h'SY?g$9)]A>s>.%\r%gLpT\PB^=tg7a:`Nh_fP0bY"?7+X`1!cD/F",&(+U=l0`iG6uV)i9Db>RFOh>)/1.N"YLO]BOMC2+G_h`@;V,Mec<cH[sNC%t3mm\r%MZ`J^*sg;kJHo%bqK6lIKb#f-Ih<#Sl2@?D/QOpn.+#gHC(%dA;^Y"Fjn<tSE\huTToF6"nAiOB[_urY%l0nA#&,->Q515?5%p<M\r%HWp4+gbs<kojb6.6E(Hr,JrF#?tDV&J\jV_ZnZ:o:0X/q<YcBg+5K1d/Y%V4+uJ.;"L:i22*bB750a7=ehL-268om\,[2IA>\Tmk\r%Z5+4T,$d'gQ?V_F\cWof'LO=>3%+hBM@9tHOAJ[>;]ZsYCn-D]&n[4l+)`(js%^]=hW#,4;\3RTiklSf2aL,$4qkN,:lMuC+nmlp\r%$Z38XO>Mb1!QgJN2H@:hTi2]e>>PM>"!<fYV$kF=0@=MR7[4XE^<*8aBK1C9Sh83?ek9N>i6jpSMpOjb$]Bu7VRo^^*n86$:JZ97\r%`[>4^>8bJ7)KAL31DaR6OYn@>!1mpBg+-pHemf&0(Wd1VZN*>P;i7o?SksB$QjV&:3G5N6[@&W?b/uL5g1]GEfIK.M'O0qSN2WDo\r%fkWl6,:tLSdC&>koQ27qfRgg4WtY7pU#rNg""J3Y=&tLSf<+n!/,fn0.nC:orbBgCDMu7bP]9UP66"bCY7r@!Mn_$SiicCY8)%$X\r%L@Wbg-eKe9oS`oUTIjE/'\39X\rIAkJ3\Y%Koph27A#,PnL>`EA"XjL=7Lt(,I$rp'MdqLG0=bd>("[aO0>r*n24pFZlUXF'nn6Z\r%Ce>^0[(npX4hu%liraGfn^>Y#Kf0r]CV_&1;ik]#Ru#KSG%_T60@;mUk[;$J.6`@#[p9%[6^h`P)s!N/0;kbprHa^gTI<\T7__Ut\r%$gF_rV37sD@MsCVd1#M!6kDJ:+Nh\F5n1Xh<R;tfI1e]pOWr"Hd!ZYdTOETm8ip?a/!-O-lPIi>=?Pf%ip_::ohXib35J/%]2]44\r%eZm.K"TZ?R?7nsPcbU0D-l=BC)X`Jr/j2V)R0?'s1FC>576rq<-nVgRd_[%SRe:QhrWobr3DX/m'B?)d@H&9:W(*;X2UQXSP<PJ5\r%\RYj^/U#X1f^(;?M9WpOod(i5O)4&RPihouqN?Q0`Kn5kJtkD5IED>O^1:MB?XdT7^=6iT<:hL*>PaMH/UaUk>Vdi][*b08;I<K0\r%\\#8G>9g(`FXcO?]#72rF_RoUhb%2F^83GBeP__Nb'4qBToErj9?t#r-&,IcP#j5XM4mF9Qb8D/Tak.j*/`?FH0MIaH!t.PU[h=4\r%-&3C,<*jld9-/5OW4Xg$aaoU#/a`9"l4VrZC/)0R9O2[`!M6ZbcKZ$+9bS4GQ)dOff.JL*^""D>P.ON492V%Go)kKtHO+c9UN/]D\r%$WiZ7aP<^j*(!s%(^*I1>$H#40pC4+GAYH3=S8W*0QkJ<27?)%l)cR`fGH4i01B/e!>?;3E<p[n*ub;J$amS,8$q!3S&j&TQQjZh\r%@E'jSD?ht-('Wf9TsW09];SA;pJ[erW(W's13JFn<MhBg%U9\mc;g@tb53K-[`:-2UqYXllTXSHRiS@YZ$CSg]&Zg`?*aH;l4V*[\r%g/aP:E'1eE[(tl'n32bFmYSUDZRGF=>iECc98Co+OhTbk8b/?\W0TL0D0M+e@_=E.2qfZLGZW_LENI_q8_/jcR_Uc/'C!j'*7KNU\r%,R*\DG*I<0b*(M.X+a:iNbbAFGE'FjaTcoY&YF*!/73u,&r9B<&Eub3!-qA8_]Ck,.?$$Cl6W<(p)$]6S"Lnn3L-F'mir/gUPV,8\r%A'k"4<B>sXL`OHXJ[Q-4I'$3bnPP"[,R-!t00[;#?2HE49,sJS6'"LSmQgM92%7(&1!`tB%fJ(j5](gH8LX\=7i4]hNf>]HKC1.p\r%$fja-2FtX<WRr;O_MK^tIE^HpXZm!H,3[^Y!"$N_*Xs/)PW>T10pZ1e*pkZ0,A`2LZnjo>#kGU%M!lJDN0mkE@uigBpRk"i<GCaG\r%!c+[$L;&r'*L/d=:,%iS#gP*Cpn/[VH;cG)IOut]4aYZ\-:3Q'fW@h;&bcYO%#!u7<i;c:J-qMr-fQSN6lTh^.8+_ETplD.`$[:N\r%5B!6TQ59=m%tWF(K8JPjS\Xu/d92kmr/D]P<2`<*3-md/>A0e.KtYoi49Ya[cU4-a:-dPKB)cT@R`?83cCQtZoMLYDlj4.%rjjPn\r%_@BIBK&0b/$-%iQS]YFmGdWT,@lA$bV?6=N8RRuj#+#RGeXI\^^<iMMM4+#0hDJti=Q<2kjOK$%IDbp&IB@jL`t1ZJ!$sou46)6k\r%[3H<r+)*?W!c18&Bn::*0r5H81:s/d)DVjZcrqPH>cSqK/%K@o5Pi9r3-sQ/K>("sc0c=&L.NrqPS2qg%-MFA%+n"_J+"AS<X$3%\r%I0:k@aJD.TN_)%8.e^Ghlo"TL2pml.Dc?o+DT'WF<H]qJ`j+DT\+M9r0!.&GqtUVQL'dF\"D0/@DMu<3g#SPpGk?=0'oh_rP<B8n\r%8^(.MZX*0EaGV')'@C@Bc^5N9S]!YTFl2`1$i1c>Al(s'i^Xj)Ll!.m(bKC,?1W1%9,oosEG#'1Z,=tU]N_(6bg)75X^eh+T$MaE\r%,QCs[S6E@@`h>LD-CQ5W'=4>;\:F=kTZn!VKV'g&C?Tg>Lcq@0J'OasTsR:Za4SLE_*jntB40UCSen?g-022;H!c6RPFm"'@pXB#\r%N0Z`)0WYEkU>h?oV)/j[N']n5Y2uKLoqPHrq1d$66n-5Q;2B77`G7&lU+j)0S63b+-rqmW;;5*3:?Q6\:N@-Z'CB[m';P=``"?*O\r%L`(#[+CaKV9Eo3c5m]0b6GbPPQE+Q^4mJ.9cYf)V4UFoHX"r@:E`Jtt7>TZtGrcXpa]03?8\$=7%451gMSfQI<\@$GgN?;Ij=ntr\r%+utFBXNp[k\6"oPPt>4Gq-]N+9C[#%GKBngIck=[>cA%tANPjQb\W'@;'bHL6^aXP1scA,>7\3EH_%9oI[<tu#OA)LR2/]3L-0lh\r%-KNIhKGIJ%9>EiD32tVZ#UiMbAS]]f'"TmYKi]S_[TYXO.nUoA'pF(SG+.FZ--GgP`i^ll?4u,RCBQ9iZ>s+Ih6)*HAi*ir&qF\d\r%H494l,&ir+DFuHa\q_lbSLsC*Oqphgk&n:C6`o,0Kjkai[k&&RH4.P<1@B>I'-]>.n1EQi9"p^$0ZgdD*%(NfJm%a%Y'`RcL<7/`\r%g)Nla/X+0_MjIfs+Ip:1bc5m?i+FesMKi-,Rhg^M>8AlS.g!9`:6rjl(c>.S:b7Nk"?u,!g9*=c]!LM&>1-m?UA)aYDRVFn8no`l\r%M#Q,%QE]ACaSLW,:ceqsC0@Re_XWK>HrlSo_Da(p.:EChAR?-j(h`Q];C[T+>8<2pmq1$EdT(6^dCP]7_!am'#?]X%6-;M&BnH(6\r%0=lna`.#YF2Y=rJ&g,lT2*2Hn->I,?_aU\$H'kP<<V_<H%MuN.G`nfP6p-j4Q)P6,Zq@SSB5Q0]+gT#(X@.5lDdhES%dlpsUU>9l\r%_#D!aA2Lg-h?_bf^-J.h<@5\aC(i.`f@h-Q9,P*m)&qU,0Er5t'c)m8'heK`]&)(a?rt<eH0F!?Vr@PTE.H8a4eDZSdq6K@;##D<\r%+":=9*=m5Ya$De7\XgQ2!JA>?nhT;1:XtpWYQ"%H=4CaL!S3h0EmNG_:`W@O%+4TC]a7^[5!$_JPZ$[H@.q6?pmE<S\>j.,q,cY^\r%RUGG[KbF1K"62S)hW*RN0nr!<&IpT?B6;&<i54EcUHP(cBS*nr_i!N]n$WS3rJ1tlpigMt6DHk1@g1tdQlB^jc0mPsi^7]G/J;XQ\r%&/pB/7O?.6VLZ>L>eLI7lMR]Lh#-l+==WEMS'quTQJE>Ya)GZmkVkoUVQA=s;g)"2A^'k5_$pKT[@jrOZ(TTbUTB$3XCKh6_08c*\r%&-Kg.$o=9DP?8[*h*t'9Kg+p[c.F;\Y&kVDMj_9qo2#q'-Y!Ls!)k-oOZ*j76@=l\_$pL;L.*(V>kk:E'4fW@_P6&=C67b4n-+3P\r%Pkt!=qC@1;%ZZ!7+E,;t;sb?$.W_>Y0[-[1A>gE?a\c!/pk5-.S/$.`;!Zs0d\\kJ"F9s$Mb(e>S6,Di@8*.YcbKVe9f+oLY6UpP\r%9YiUjEu5-""))LQjX/&`0Dk<`ppBX4MsTDSHkmg;IHM8N8(-/6JB?D3Ue\-3TUsH]L1(o/5UAab.lY:B4!,8QJM)91JWYPWJ3cZ'\r%]+D<'B5kaRLMqbH7D:2#Rind2n1gf+YN0u"5((<<;_#RVP]pq/K44@U.grlG@!SrqW].alrS\s3gb<)7O4N$SC;nXZ^[(-QEdm\4\r%4f@e7Zgjo]>[c&Hj-*\42NPCl$X5^#:WsI"k<35*os/A%eDn7Ee7MZ7_ZgpHr"Kp/MbP)M!`H#T7Ot`XL!UN<,6%]s1t?*(`$U3S\r%&W+!D7b7uBc*RmB,q"&jf7A:tILnJ(TKrab#YS>-*MYAEBr?JT0$:S+=@6&>^KJc:C:UDK/XmSaJVcGs/92?'h?;T]dLs`Cmi\QL\r%/*5Pm?;tQ.6*^HM)"F.Kk(.-mJCcjEH"PJi`Yd_hQ(-^?1]W$35TG`_U]HF02W@.SQNf4d(k8OA"<SitE)VFUe>tK3R+*AEomg0t\r%%i16uNhq%8XMi6Q`L,3sn&G-Z'2f9a3Q;TbKK5$C'5_PFeSSaFH$bLcj"ZQ-^!U7N)1r2Ugb#$D(Qe1E;S<C>jiSE"p$%8ppgiWN\r%,#82.Uetggo,D(!)@Xj+kI5tX.SKF]\:/n!BHljgpIIB4X\Mg_;'Sa^14:MCa:Z=VU!jjB=peBbKr4-0Y_0'VC-P9QE@AVQ/")*d\r%bV3!7BS(#2*d(kWk&Ir:B\e;4,LFTlFgQ0SAXm.>d*H>]"l(dCN?i5`F6sa_.R.Gp7XEue6G$no$:[q1G)&7Q(mZJ#)[<$%jZU^@\r%V0Wece[(,B>:W/u6\\6K.s,GEDHLBU\7$Mc08bn&@F^hiX1leGdNCmTNC+=']=TJkPf^qtNt[SEk'Fo>XQIZ"YaXi'n"&0>hI^O"\r%IQqEeG2jE60,0TiF4^l-gn<^!"E#'4Z5U\Mh6?0=OB%o2S&@!tkfs`5P0]4t"ZbtX"E#&Ig4G4Nfr*OUN)a1Bhe*V_f8@^RS<BWP\r%''i%XXP)8pX?druppMK$)\)p^[o;/4>eLH0lH@h./!fL0UoCKk8mS8BM1PI2.V4!R1&RCr8la>E5W4h&H4sOF]s;(0m;>>GFm"2l\r%_A$s+)5B)GBaU%ME(Pk7kMfC=eOK;"U/G2n<albSEBl"nV'#sXH&:-kUT7*Z%KF&CGAb$gnCF/b^?uoU$D>kCi@I5R9Eg9(*uPeH\r%TMrWuD%'F2X#IkP$%+UQ35u@.T]?VLM\m0I_db4C^^UAj4,\+@EqLd#W\<?mnn`d23N+FQ\Hu#_i/!j/j:Rnt1HLIsM.6Ro%<o2)\r%s5MhOGob4(D"<'1*jUjs8hjHlm8=@U/2?9Or9OOj;bTdO5>>.u=ESDW2;:I-dFs:Y+)jh_[Pj@PlOq7*X)Ju@2N3AhIs`.g=Gd/X\r%a>X2/TkDoFi+hENZu0O;\Ef:??He[47jse.\YeU[f2N*fbGVh"CaMgJ-FeAJ%j/&RNcX`0)09'pdesS,1CJe"DlLf0lgL#1HKH*n\r%Ed'@SQ/P17CaRRLPS.YoN6,mh)pfd5^eFt:"+)p=p/8R1k3DQ/]'G!pk3Po#g9n*#E3r;to;`Q:C5T\mR9o5f*3co(*]s'V)WL!2\r%81BP_E+EM)^g.[9ihh;'8<->G9K83dVU7^X=7'"mf3==3T>]3FY&(<TBVi!'\IQ;"FOZs<B;[VMTgrElM+0n:>ehLs&.6KA)[6YL\r%(R1KqC87q=b$#lmV`)d8]!(Ha8MWif1aDEd%&WDl9Uh=8\MEr5pCN6`iXp)KEt*]+@:rjQ(n29qV#hSX0?lu29CL';FS??-q@!B>\r%f85MCg'^#h$Ie^kN'a7K/m7`^V<;7K$+tQt>g"P(FL"7h$BT-NR5HKY&O8l+NOL:R-ZDVrRo&^5i#E.9<2kaNYd03`1g2jcT,>mt\r%3PTlK0uF#UK!*aZ"I7YUj%bD)i/j0'XgV[P&p&eS=`XmMP];OL"/j'`,^H(l!(t6WjG8@iK@5P5'!-(BpN`*qm\fS(=dLaSB.hTd\r%B1B9QATm,IR/D`2>]DBIEHOPYX2mC.$U\=PS)@I&Z)*^,PY4O\imVA^-6rk1nIjtpfE;Z*>+4-]-7!3jTIX*h-@"4\-<_u@Ptde1\r%Fn-S(X!jegEDXY&[*_7VLp*_o-ZDT`(9-F0g;4U^F%4!g1.KZ)iM7:o-E/6%,\Ih>@Sl,n%`0Vdj.,bJ/h9Cg`lC`Y;0QRcXeuU)\r%W=rp#,J"D\YYrJB0Uu!RQqK:m*-&4P"BN2BY%/6H'ds$#N.S]XJ\]iq!j`=TC%M]d$8"AV@HhMr!D;]$I1S92?tC4NBXD_X]@0p,\r%]mHi^`@r!8Y#(eQ?AV3O:P;T\*s[Q=!@pWJ5uTVflG4;@/'AbuUP4n@'R$huO3l_l_N+104JF[XWBTXRiXn"(?8.C^)/%TAkHiA/\r%GQ0`H]lid-^[mSti2\N[kW49J/f>?;NWI-:MV`rP;Z&/^Uj*;/[F"0nJ^aq"<(I,Ei&Fnp+\+tPCE<_(*Z>q^6'A^EIuiFp.S3E=\r%3K!`)lH!>`-\MYs(k()13>81%j\?LA&*V$!?M"?'LeaS=kb_@pHT"uRqY]>@cp8&W)gM,p/Y+$!(9_\^`aMidKur(<d_GRBjFqMK\r%Y`S(W.UmQl9P%!s[iu_a3)>pXT_3t`2.>uSQ=78-G.R7J8n*rkj:AmlTUF*0Y,UspC,\Zq9m-q5IlND<6;Xlm,H#b&./46[P-q4j\r%Osk]b!K+FJ-&nb[!(PQgKNY?E`%6XO9!p)c$)'WP;EsDUEb\LU(!o"4b,IK<$H@Y@&lI:717$F!l3Fm,&[OqWL8EVL"@"R(?0VXU\r%6A4tbi\S$!\Z)lhm4_9`$8[?,1R1q7[h28SbK$_pP'_le30u.bTR=\Td1d#Ha%\A8;%%fu9,]Ys]O4pPC/^#>L`udEXF,3F\pt)c\r%C;Z?5[7;<:mEt5&l*LZ?dfr<5_"su)ekd2\3<UF'/;Z)>,35V\&r[D29=mC+?-c,p<XL3-%GSfq3p'0k!0r[G>N%qX+tE?gBSknb\r%':228KJUilB-"INV\f`bMk=$DG)IA)Jq%-T7%E^5r9n+cJWG@d"9e7C8-maQ:IM/X2ArLQ`IoL:?VO-jrRJi>lL.#6;Z4!+KrV=(\r%.B3/YU,(8+93/Ld0-i*Jr^tV%k'en%8`sM>GtI1@21]J6F$*;JblF0BE9kt('2&m,CXM4\'p?\_mI4EViRd\b-`>;*T7,g=rgPt^\r%0EMBUMt]]/;@lgAJ1(b4TY!iXk_8jEWh$QhP!MkiV\\fZ*EkrNn_n/T4VaDV:W+sV?m.ZF,7?RX4bP/]HQkS*,rp&k4G;+O'2EcX\r%ohc?oa:;YCHR?$Cd61XNW@S:@:l2aB$IL"jgSl8U[Y-[5Woc^):leRa<\hI6AMaWGOfTsijq'"-E+Tf>0JuTOM;f()bq:(uW"h4^\r%c9uUWU\@<5i)Ef*3&?f?bmYh;1W'j9RA!#b,)5J!@M?"'kF'u@D^7i*9PWQlTPnbG20!YLUkZ[0A![Kr>XSG?69PSn8'.F2og@O2\r%V''0_O?P^fR<Y+Ke9)rkF;=u7B4W:)cf[],.P)7$ek(<_;G<R9&AF`p;"ZsW$.WsUOr;!$R&'SZa[rMIR\8$.brnTiWkY"$;#NPu\r%8ufXpYb_,r8]t05Ku>:f?V+SPm&q]hktnH.1$PdB-8Otp^0?b'C>Weu0Cc$Y9R_gZJKtDT>I"Uia-)/>2d+.f.>rMGV-p/OPSCO*\r%X]DP.%UdI`@/W6)pfb@ra`V4kXnKb\Y<+6hLPMiET;+Ob+54W>]386nT6^fu00Xn8TcRS'<WgBJr5/_:;EKMN9kOG(I.KXPPF?Ag\r%J3Z,Ph(QFG1U,IOc?e2Q9TfH6&E5C4khcg'-d">eTL:&-8WY9hgd4s<a7#TmX1-D=/!990cm)2#h'RX\d.9.]b7P7^W,E>+niJ?q\r%I@ZJCDH[Jhj>p_c3BZZ7<5"RIG5E8J%N_oB,_6)1*8N/VN-uhSR"A?p*VL_pQnHHaOUNohoB'@A&n(se0;>4m(rJ&%^f&<mROoLe\r%rV)[M1C:e2-5>TUTj-c5MVpc1,Gu&$/?*-b6MHjRd)ZD'7:M43n"_C\PJu3bIjspq&Dk?3;pe=GJ^^(D;3-q2='uRW*M;_nMA0'i\r%$,+O0]VV797M[:P=YGIWN)2gh%ciOWKV0$2b,Q%o)Li0-;2Sg<&Pr4P=q*TFNrZ)?2?`P,QUl?=POS&fP-FZbmqoa+%.1bscuqs/\r%<dYlVW#4Ep)Fm(hB<0rQ-JHYOMJtI:Ddlq)'kLUGd6R`6ZG\2-pP[n9Y6q@j.16hR3=:XA,"N:(6,CUdQ-g%2-#=,=7MA.Y9J*VK\r%f##=L3$dUM#^#7*9TBfe:s^AZUG6f5a_qSu.'cHFmN`3PSg2t#a_oQs4$/\.IAbojakl8[\P>JZ[PO+C3SHhaQ'a0Vaqm`:9tbdM\r%$)eKC;FLnGaeGmQ%]h&G3d81X=*5_cOdo'O0+gR`/<NgI+Ml`WM./-lf1Vp8NTN166B)20]0bQGB@>V3;[WZ`3'0M:mBT'O-O_6)\r%?G8b2(MW1M11]^@.<M[-Nk@cl6T"/qb:1pSULW\p8]j%:fJ_pWjYJ-nL;IU-1"l-Q?II]uUU?aP^&%iY^4A=U!3TdiPuXW?Jo3%P\r%?W`@$AM(::d_`laFo#pX:O5Os!!,SV@BHPC*<eV"/*n6k",:>oC1BY_*3CFpe>auNLW#i^/s(""X+b&tRa?h<2,U)jaC*tJ0ffT$\r%ekse(^RE6K2IK(C5241/>"9Lp/1u^rca2ip^M1,q9!9R6g^=ur@8Wf$@V6DI&Fhel#UZG/X8<maNQg]k]T0!K6[@q0+5!u'msYf6\r%>1YPN+5#]-)Ot0!fGpF8F0oljhEi/ecS(mTF6k>h8&[*$d#QR`(HLPG`@c2XNf%,HZA`'G=u[k@BO-#XHt5/>mARN`%bbn`g`jeo\r%W49e\[%h(G]P(^hN<W.7=d5R"S6;'f)M_]9]_+Vj3QfHn$.)P7AnY7XU!FL6I>JHA>>+2n[\I:I3CHBV//ZO^!c+KhY%AG$+-rf9\r%]7Y0_'"d17\4)7e_7<!kh8-W*03bqTX+d<hMr!pHqS_g#fL:hVEB<G18)C2s7?62$nI&[3n;BaD-cI`Z'T@oVj@C0oi>8S<`W6o[\r%nI%6A<go_1Q&FMPWO4o@^W;Nq.XmL)F]A9jTo:e3(>@teIaQ<Nr"MJB<;[qqn2MG;OTTQ%r$$pcW;$NHbP4N$KqfQ]c=.(I&]1=&\r%(HI/hl0sTNJ>;*?3J9oA06l0e0,cF4'YhFl<idJMe2R`7@')6Ecd7PL`5/^1&Qm$qSp^(g%\I3*DoLQt:_40%4hC.50g#GhMWe?j\r%UNJ[7N=Bt?iPC7LJU%ee=NBI;Xom\b4=%KCK=]37CCggXQd@?;\'eKBDmZK+DP7T!'CRE3gK\jLW.&47461&iaq>J&&YC>JGcb@r\r%oW9Cgil**MAu'?2bYK'9O;.&)FS=<A\@SI:jia+(7?A%M@pN$p$.NE$D7V)C+KUn>+]Tk+%^GY6#;CJ?7bGdcUc3+Q*i<>b?GbX$\r%Fi:@H+U'SnhZAm_e$mtOm=Ha@m>;(r[f@`i4^KAbU8bTB1P(VTXA>djB2X7gB]]S[.O*5n.T!-;%[_B!n*m;XK]4h=i%^Z,PLCoV\r%p_56Qb0!gA4t7f$`)6CgYLT:/#\]+X`Xat/V?]qNV9ot_cF,Ah(KAGa=V[f=S-=qHe?iMNZJn92BUa&/UXQ)?Qp_8#ROZA$6P!.O\r%T"i5.naWA_d<o2GLIY&cbXt+E\+XeR!*(p/'dc2*OIS4#)IS0FL(A:AZ[sN0:W@Cpp2o`?`RbR.it:oANX(k@d;-74/9,6/&Ln3]\r%kbBh]]6Sq!g7-\0m3$cel9Y*pdgrIm9gNN=0b$_)f2@`1I5N%=qJ.NOWk=X`;"aM2,ZS2E:T!Dm.EY]iAMb]5?VOPKgomM(kpWX1\r%/EqtnVCh0[I`/.enJ'))S1O8O["ljqq2LScQ\E0'M)U^H([%-&e;Ae.W8CnGgW(d"3hX'ZX$h7D(?o+n]_[[T3t(_.KR8Q1J%R_9\r%9.MX>,&2e"p^-I#`'QR?RE&,P!fWXJ8[B,h+=^HoUo!fM<J,6SNA@mub>9P2Ecg;0KMCe^Z6FsR<5',\$&qTC)%d's(t$lm0d938\r%OgM+L=UG7^p*%G2&;snZfapL?p5_k$LrLCP_LrJqkYm2E8F=lc&<g`=Uh?ZL3EXJ(\M6j3O3r_4Go"f'eR]5DQrCPkM8T&9`)abc\r%SG,QrO*+V]hSZ$2bLU@f4>dm7:Q8)SljP2S6^SlMl&K*jVEN+U=o&b):<qK%@MC5LYoT96X!S%5KNVQE@(#/kLDJ4JWOA>jLfV[L\r%i[ff`Lc_2n1]p1'-p39F;!OiIZP6;'e#(A0LE4R^E>Z]kfu=&A>1.5NFsMGmoq;0Ikm(4,:llR/P_Q"!ruZ=^Z7=+ZF:4g=ORJ:%\r%l>0RRm[*)((/Yb['GMMs"acfk+og\BeD$<qj>'Ye^(iHZjjQA$A^28g-<I_<2KZ34g?h>MI_Qt=juY^4=mu)2c$ZuZ+o>REKIuqF\r%PW/ImI7jCu]=gi&[bZD/NOlfpV1"65IEVO%s#ceLq,VU+**$aOos9$fa1&+eLV&oa9\!>i8AV67g&P1&E.op4L-p`692(b.dmLFK\r%j##P&>\'+.`]^TA2!'Oa?!+I5U%0+QIR_TpL\Hs1^.M@g-XSm(/Vb/3lC9*GUp`nc#(/t%D5i?/#9@2fC$$7>.>sV#?EqcS[Q-j:\r%1%,>ihUo@-!!K;0p^rK5+Prdhp@SPVb!'GQ>b#l2S?3KPXoI1H,Hb#8DVNR/TZEWO\6+r9K]b6Q:X_<o!4Ammd5a^mluQ@J]s;,>\r%lln\.nB/VF\(o>8.@"rlEfOgT7EuKk[Y5%DOE1OacD*#Dl^T1toJs&3?>m=9*,u,dNNq%D3Ca5Nc[]n#qXR#e4_9GegZZJ?`?FD8\r%C]@%R&X]BP]#B==FK=B'8OmkE8U;!)7iG[h8!7t)BLbiO1:0EB[i$\ZB?2c-HI@paXJiF>XA!B=2![^-/5JHuFi<Bnl-<QUZAo3j\r%Z];QT0F91(g8'H`WbQe%3W^XqQe$p8lNjR9?r?=62!KhQ/_?Z^MtcQ^ImfXkQLBd1FaJ"G4-jnT9i!XX@X>$eL8apI8i`X.V^gea\r%RYoC*\2IPXpa04^U6Hn6M\NauM^2egmNP4_U:[A%*76o+WSlJORU$nV:(Kp:&`#e]?.)*'0LYYsU`@cF,Ul6*(JSYS[Yrr(A/!!^\r%N_H%LEZl;bg`<jWj[`XFe0BFf9D2BOdcXElMq[`7h:1DJ,LHYh3*[>"Nc]A63>)_F<#AUmbYb@u99i$HR:KoTb)ltTS$(ol;N>kk\r%C(7^!%#K505td(X.7^nAmNoD7KZRfrV!",qE2C]%T<%NZ.7[jK0EZ6?]fkIJ8$>s=8A^Go9m/OM1$&ZuZs#O<(Q#AtLj6u)F'?JP\r%<$!N3#P'OL;p(L,USF`_*/UM$ro,Uq1Xu?$5.tPJd=hbSKb%r#B*W:o1kFn4R_L]d7hf1+e0<&eCK,OEf.]_hZc0+_aEtc99brn2\r%j>LNlks@408AYs5(:pT/`MA5=aWc2*&?eYbU:ET'Nnf@>,[ZAiMOncT;hZ^$W+&Z@SZ"k$*)T\/P(/ue'tSSYrX.34?Y(##K`taS\r%'m[*QEf;L-k7u..F<d5(,dE0&$ABs-:c6JEh,KMcp+hu4)c9k6dZ*%9.o`ec`>'lYLuO;cD!-[Y%9IR=qOE"O;7[?6(6WRr2ImuQ\r%68Vh9\e31&WiTZf8I`.<$VB*Hfg8SdSA>u@G!uC_%W%gWW!WpDG%!,Y)`u%Tq-:@iU`c*X,cul7$\^'::c6JEh/![QF^ZH87Pn=?\r%ZB<nGKqo('Ca$ni1gB1L_A8=R/nKs5C]Q1\2PSkkP)\7O/L4>PAd_0gU=hku<GXChiDsb\krU_!8E,[dLdKXpI(u<V;/k8h3<Hpi\r%LC\rgs*.]"RT(Nr6gXNP<$S)EjPI>IdErrB)gp/?`?3I/L,3jri:VT>WXJ5#6t*VhG)_rdj9WlF*up@h.6V(XLk1%a9^0sJ5%bVc\r%/ZAsZaZIqN"r&@d%P'r3'L)_$r6%AB6B<J5U.6kj=:2QUknjc6MW9V^LQ[ZN0ck)JX+)i\VEaqGIqdEM,i?&[XTKIk`]Xp";5&SD\r%PB5[#`+C!0hQq@*PHLQ&1r[t9%Wb"`(p$d@A%Y<h(g[ue=U,;37+;uo-]#1fj7-#WdPPAH&\grVqV1LVO#D6A1dR2iE"fSIEr_-r\r%2IQ7IMH(KrLSg(L9/9-oQ<K9`*rRP-D:Ug,,II6g-*-'hT(P;"s8D?MQH'b"LXr/%j)rtAg1,JV1`$#_ClNc(h.oUFpg%RWik4Bt\r%g;IkL4hW`%Is9\&0A[ck`7g:_&(+Y73l'@>9>c-,N7!q96.U_VV=B]X;=G38=;AJYMQsf'(;<MT@r:`,8Wk]?Omi5!E3@U^Vq=LU\r%Y7-U@jYd68+aoQ%T@c"P),jX^1bIhdGPl5kaI*EMpg,=7jp0ZIfhWU0)ucZaC%f008[I=A:7D-!LI1\>>Y;?[m8V1+J6Qa]],f(a\r%rKj[`g$a&9mIfji0C?*ul!W4(\^SOA^[s$TI*`[1fc+a+5Rf?5!^_#9(>B\CT]Ue&%3']fC(A<<f@%a'l/&LrHfk*"dsR.tKO1MH\r%p]J*TRX[0;#@83A+c+&.Q7`as;7OtD5a=A8.s/?/UfSTck\mibPifPfftL'Y,K_*f*Tsm=<V+rWAPti'5/sNmM6L[1356cHB!3Wi\r%0mHPm;\EQ@Lt2*$6j*1+-R?9$]m6$*O:]V50%DKbd;%u:4[_d`6?bGjWJ<0'i\!C/72-NCjgAW00&3rB+`O.R+[!_3[.qpm`$C/h\r%A?'79&8cp-Wo4PX+skK$Lj?m#BR=eW[S:[1PZ_\<R"\"GS)0/REtGaWY\Q/qGM@!0Wp),6*o'Ce$q,$4>"q9SDQ@aZ"**3t)`7S6\r%*sSc+Kgn>]XLIFGNH60<WapPmCSGD_`3uR[dp)b8@[gnFgnVU0c93*#VRMcXpp[-0;]!mOh+iXi&%E4WT/_umr(C,>lutOTB#!)k\r%2#H)="mli1P\.YaWK@&Z\'jVe4-hi&03q5Whs4P$leCf5g/kQ._6e-$Vi-smkpph(bTb97aSCs*O6fs2r!9f)-ZuneQRd$o]Gu.h\r%Th:d9bIj>e6L.H*0+YV%;^":WT@@gsdLUD>dZ=/A"+Ekj%gObZ%p+sm7$AT:!&+3Q]fbZeD.M!:G=!*Dq'lVNm3>bUG21NmQ?H.a\r%"79XnMRFGkReR!_>'N7X8Z"+&,tXt-:.^V.P>dWNp,T23lEhWTZ83O#&msrh3UK>8SmLoJon0+^Tq-ljaSJ2$)k=#>=[.LjhFI82\r%OS,B8I84Rf='c6Umt&kkTa$d-"&Y*u4I*cP<7VS60$3qjPAZb?Z8\&M+"/#QhM*3>7ka_/<cG7O.p5)g6#TrDR.[5L6e7<86slP,\r%5uMmaQ<=\[3$d_n2';bMR,0&)qEA6%<l&WoI]+;cff`:FBln>*WK\L9)3WcB2aa9_)(:ZO6OsmQpn7qM0&$WRUk25QIcSi7i55jc\r%I*Sr71gs)QdEs,r#KH3M__Zb@@?.?+h@k>@LPKkmbkL'P/;nRko7S33lWg,uP?`-TquL*9FhTZ32=A$Jm81q92)/+hMM\=.ld.Fd\r%8beulVNUF9:I8\O>aqc:I?U^>9u7Fs5lr\'TUr8qkb+O8A*BR;h8dl,P6rr1T?fRae`f8>rs6-1IsS,TTmqBoO.h&LZB(]3-8f&_\r%61K#bLSM,HZPsW\Xrd1i/*?QeqC#"CC!9W)Dh6bPe5nka=$Nl?c?@p-9O1Um%TDoKRk`A^_hL8q2Wlf_`uEC-^(XL7o.u*Co%Y:P\r%Z9FL8k4\$&eT,NKbQ5'LLMQ,Z,e""91n0g_*Ypi=cqJgf_j-sRHEO25jn>nj_q^CsF*i$$C/K[qk-,HdP&tlkmD06[c/N1%*&2JO\r%W_!YD&lkkU)&@;e2ZM4SCi&#YR6<)*Uu?Y?*bfR`(CpgZ;L@WUJe"Uf9CV4e$"!S#:N&sFO3S4bLI_+1$=bhfL2XkFG5,'gG0f9D\r%a['rmgkHdo'8In>alT5<6'YI20WF#'E[[RC]5)G4BPro:*k1)48]@C6U$)!ne=_^,2,#L0'/c^n*^U;cXi>[%d$9Nq=6ST/<RM@_\r%>0t7<0\Ig67LeJN$=lj`&"s3Lfceif=CVCeHinOi"30\7P.O)$K?E"i(N*';2\\3Lg`;7kFBRRW=Ug]M*'S!j>El`ePCqra\.(Gh\r%jpb#pP.O)fK.\\@0WF#3ll\kR'K\i(N>'r1<Nc85THcOsp8QJl/nTm\?Ip?DLuqrcO;o4V%[*SSfKl`2#%I?3lt2#[>rYBX%a>KH\r%X5c,)+IP,E4%QLabmpbT@Y[MaQa4M)[W%SolHnl?\N4WG%[(NnZ\.?(d-RFK$9Lpr\.q)%q?o_#OuD>'@Si=?="ic.%,<[>OFT"K\r%i'UcC0BDDs+(DC>jm"OfipH#uWrm:6:XOnO/&raYXbJWPFl5G[BrOK7)De.(i_Zm@n#O%[c?m;"*eXKJ0[sG$3O?J)Z47:TC3tYZ\r%D/O0HFl4Y<AX^VW]7PhR3mJj!1D[g7d]_L]<)s$gl2F^h14_s]-2iR0Peco]POSjg_?/ra$g9rsc.HO-4^uEo!!]]epTb^(fsoR7\r%*8Zs=BJ^lOa\$;P`4X3^XG?hZ9f]LfIMe$Z-5?GnRAAU+E-R-i58L9WGNe5tjLSJa&uu]26;&2\Rr,<R94L\jQ]@2FBqZc_AD&l^\r%Ys-(u'c^9/1TX]b>_u9Q+t(08kp7Qe-S!kTe]f`$+X*Mm)ct(`-`Z;7k485K2/9,a&`X7P227H#^KUs0T?Z(:L?)FF0ah*`@LO8Y\r%)X99A5f,1m@L8/O9@<Nf`LOBnik($RV-PbB_%!\eN3p].a4^gZ$]B.!4M7J$#rS7%OGEgsL`udL=9TDmkSUFn!lj<-V!d5$/f<mO\r%2X@g_pt'&81Z(Ln!Ui>Jqu$bf^O)&Dpe)^WbkH>o1-OPcRf,uW6IlBh8[I=?9q(lqJ(!\-H^#?DDgb56hsFEIhsL(eD:ItH/F?Bk\r%m9A_Fpm()(kY%Z)k1-P/UFTr):gXAbR/J`+CJSqI:]'qcAf=r1_jaYF[s=UI25/nKY'Rfc0S?QJjST#N\4q]S1ak@R.$3R,0i$iX\r%Z+n\r4p%fha--*m.]on#L&DMSra[i$'UBRRdH<%FMqRGI`X3p0\miV3-\:Sm<G*`%1E)a"jH5%_6G,UN0U<.m#3.g_[O`^peDU;m\r%KXDnc.LTS`ZWeP=C6E,5[LYl#E(!@YG$>X\]8$+c-.9tT:p\EB!ZK2r)GZ(kr6/*m.Z2Kn4Y1LCn,kDc'LFoeCD0Mil2u@'6XsEn\r%/;X.?gDi>WkZT2f6lRVFECZSAY6D$cDoTe6*@*$[b1qq3d;6tr>IUk0g*AEHT&3J$*mBa>Z@\Z%7q&H_ab[qn@'TR6^#`((,TrOr\r%Hd0q;brS=3&'Del;ck"(Q%ur8b]RE@Cq6H`#p7=`'_okYBB.ZpXFX6k';3*1m&h62#R7lb@f5fUrmlI8l8&_'mkr16^Y_<JRHJh4\r%^[rPkI])pRf":kcg$eVWc2)2t6?[^h82K,g7lKt0T&dlg>@5h&GC,PI`cq<Dp(?Zb..,dElVlr<p<l&<PLHcEnl3CUnDl\H))'8f\r%R=$!u[p)=L6*2l#*h&a6Mec9sJRX$ko8TaI'HAa0ON$iD,aZSsmC,A_e&sqQ2-cTL@MWpq<8d7Ls!`dS63RU4d9AZeA)Ia/UPUY^\r%j_63K8Xr#l@>I(L<(QcK>'<VX.'%3\.-:iQ_mS[7K%jn:YU*)j#@O+7npCG<HTrTkVS8Z5oV0["rRGU3-Lj/J^VfU\?[Zs`$3Qjf\r%nUAG#:Bg,>eT=n$\n.;FqIj)NaA[YPs0O@4jJh?ST@4_HPt=7s;OA<[763ZoWN`eg6@qNM,Ys+`QfP,"&RH-r'8J[b-D@asBuj6#\r%Ma"$Rh!=A$4;G<QhC/cL,pS,:6_90!UbC%Y+F,;m_-BF;%#HH;qo=p8!9-P1DG4$W/%BAh$Je.6P!XAT8lW(.M^26?d#O]]@VCO-\r%WjpAOO\?F7W:X%(HDpJ1_bcb#E+Q&,BKg39O/AqM@#L+f*)]cB3i&c0(8d[c6hVcS`>$i[]Vhb`>L\DQ<FK[[#[:Bn\LLR3Ldi[+\r%6tN4i"1gHYA7lV>D#/3nXpR$L<ToV1WQI)lk,0\5L!3=mZ3iH(SQ0X2f"QU.[9o0"6MHS7CO/OW:$<X]F;:g2HF=1:5nj-24/dO-\r%%PQ./TfYfl2'!sq-?KJa^'`CVP-..Gd%l8OHg#OJK#?Q.k9`:/E.ad[X([@hX2j%>KA!453'$m]HB3OmplDoO["JC0^?6[8V:g@u\r%QVH[JJ]<(r)(&AuJ/g-L()UfoHtol2p9@D14pAq'IsfcgZP5V3q]l%^'X\nl=/<Ja<C`J]kIsBYIo5)6>i%EII87hiDdlih/7gS1\r%k(#6#9t()f?\se>;AJPt0aomqLah'renr1NIA@sBB%@LtYTun#K7imoJtZGj(U0WOT4%sXecoN?ZD6"i/?[5!23Y>bLTQuOl_-rI\r%po)su'CuSH+6c9eHhR2JJYfM&_8EJ$W"BO'DbE!YA7*-1q\36K@Z&e^$lCddR[G6W-eOkZIU/5Wo2=o7#]AdKdWuT@*sjq-L1.rg\r%(i[9")Ja8d@-ckp;KmX/Q&1`9><U>Bq>e^.*murH<]+!G4fSNVZc!-)1k=h-]6pR^d,P%/jakr2Tp5>.-@>.2("V3U2P,N48`;T]\r%mOm$SU(;Ml"\_@KEd%1#K`V`*2c^/]!#g*8@-TuaWhb`n`;EM2pq-YgFS9A:p(:R*Bi_I8?lX4npRqbKqm.-=U1qH4)W8LfH/Jj+\r%<-Vh\Ij\R,`d(Z4f;a\$iZd$d1O,TpX^&P%:4%;)=gW<"X3ehuYZ`!;B)@f#H,7<`PHH!*]O9^k^_jD1CY,5@J23aK]:!*5$p63?\r%+RY'&]XnU%?niHl#0+.`2aES^_\HpbOFoE8".7>V?jBt<k[@N0V>Th.\UUPj>l_@U`2WOJ_lPNr'5tf"fHat?)[XAc$pdR0,R@CN\r%0uTlB>>^'k,B0!NV?ltf.dE[%+UM/ZG5^]g"&VVdFD9:j[7'Pk4;cuBFa`,93^ON(HOSa("&X<$!N>%uO9UCPPkc$K9bb@1:B\Ba\r%]FTNP:_<l.V6SuS4Fo(VfnPV:?l28qS4B/IAJJ!7C:KEShQg08jpA\#%Y+N"'@FW(K<]\HT"lZRF-Vk8+tED5RmZ_!.][f';T#V]\r%+oi3#>OoQC3&G\/jV4;Jb-gD6NuWC2g8@TE<e&.'+-(FAn^b`,fgSg8Bu'ATD&5;rTGa,t*aMC7rJV4%b_BCX7RTurk29jc/@.m%\r%H*[VD6,2VlV?dXs&13E(kfAU$`]JJuDGI]8g?6hT@-L`R\gcbJ(jot`V-XKmB@]"?Q3-lVXor)J*EP]kB*'d7b*p*alb?jcpAdO:\r%$l.Zm=>s01rl4n%'P`>q*"%[E;QFPRO%NV"rMaVe5e9@O%nICjdWbI\WT#5,d5",+9*?Q]Ltes$0E;L[#jAF[JGfa'hD.J:bn5P&\r%bR>d6@l*e3`XlGY>9Z;*rJ2"fp7H"Pqc:jX^Ycr47M8$!C3EE+^rtUV6'8Y_\a6>JckQ7*Qgdm*<+mUGWRV4Q]0WusB$?"cSdHKu\r%:rup%=NMqB[We\h*&.MIh?d/uVAS.N!^j(5!r5@[m1!hb_.-ip78FBD:^@_5O-b#e6Ya^O[GMn3_&73qVjYE*La=fi:a\[rhsbOf\r%..CFJL.6-Td?9qE#(HW-pGuAO?!(J?2CQ$8&[U(#&'`1j>0=[G$JbnF2ps+]>Q(-<+oeE8.26Y*-A]$BffqL`#"u.$TZ!2Xr]U-8\r%In;[^FUAQGF:2cpgG,r&Rqil"n!jL6mWK+W][K0NnP0ld_&I`l"<6fO'55&5;6]Rc=7L&'Q*]E+]['lfm66<A@rn9ci"'\&e!PTs\r%(Zk^k0.$C5L8Ma$F0n?WL5$Qa59W'N6_h,ZBGej%m*56%?01G:@:eNO>@cD)\k3ski">Ld-=@$&N(qVF]jOpB.^;F6_\1nVX!ZgE\r%'fEP!iiqBRiY5^aX&,R<"e5%q"I7^[#ZJRS/;o+d/!i]@),:L7QULprDC$6WF\sgfS=*`cUl6\A>e\20StVsuH^Z,f?T^lP9NhCl\r%5[rdkNp.s-_?j"JI%7fb:VZr=]HSS(g673C*%(ChWoWd-pf7_dlY/*gE3>9cVX!/hX,^B-UK2)IfV2Co7:-8kJ2S9Djl_;0htV#T\r%q*fQec*%N#f+W#q_MhllTl"A5di*,sH4.m_H/=HfS13C)B.bdhMh(h)?m!Ej9B*2GSlZN^YmdYJs6F$GEfAPS24c"<UnG[m::g@[\r%ot?TR0F,Qc;Q`CM=I\V$in__fG8.X&Hgip:p)9qK5'[hFO0.X(D8ljp`9(fGOP#kS1$VW1Mom`A<H+dN&sZ':?'C,V7?=#%nKP=)\r%.47_FmAb%)T*f\CEWX[e[\'=pJgQqn`aFIU_lqUc:6*a2-kp`]K@eMF8K0GI'[$2ig%j3tluH;@&*Mu]5G3on^\=`ap07s9CGN2T\r%AMjcoi/25^9o8!GC(eZbaDRAuen!KF7*R[JN%Yol@1'$lOlA7ubn8XBB/I2oCFi)nI7\>?Sb<a>L@2=F/>n/,\hdqU>hhc?<TM>8\r%U'^G=N@QuJ0'OQe@7<8*(#))h)QA))j2Mo&46dl5YMeCMqAa0ooJCb-mC%+pk/0N*fA5<97ghb(iU_9_<U8)rDYp<>cgcer-$cZ1\r%i\*ci5kMs2!M::KCK_0ub'XPRq3UVMZN,XLFa5[3EDVsqCq;5p^q8h$TLBIL/$"[g?!_:nL"N>e0U'_G,&AUg=,'JHT4hUKkjf^2\r%d)9=ef&[3_[B*sRej55:"5(_0?!_=/.)Bu72jG"]\hu4W;p\L1\[dTC>eG&[-R[gYaukHYH`CM2XagVZ`[tUuk39/Ye7B-qf#C8u\r%m'4@[g%OhOaumoW?&#7_])mZh[/D!#cOG5%H\^^.RN&h#ml&tJolZ]B\i`c0K.8>*0JU>*)reDsD3=!qEY*NQD:kQ*lSL\Z4AXFY\r%0&#Pu@XfbO&:'l0LJ9IH#!GN5ipd3$%UZ#V\u\BQd_g+aG!&j9h8OK)*^ksbh7H,k'rW&5k^J,NX:0SEV5G1t<-l$I#gq:=NY%JI\r%-4*sY=CP=KV)31tMS#q]#+Fa*^&-/Ef@UNpd8bJp:[#)N'U'GQ`=uVHVO9b-F(]HGY$Ec463k5$/QAP]\s>"8$bGB/K'oe@)u-.C\r%nclg)W+#s2_]7LY(Vc@@9#Q#X?Yj2bqp7cug'r/O`HhVlW3V:5-8f%#(FP-P]3'!EM_<Sm%pa:Vh*;c^X>eL[/h;#uWSpm"d:I4u\r%?$,>d.<M7u<s52CJM'n0<G@/97i22Q^b\&%=Y855+"k!),hI+6?p*;=ecQ>a1nrdcE_Q!.OKDT4JgOT%&#).MFq%ht6Rh7#DZ.o>\r%dY;lZTdp^4"AUe&!+j'pP&OQ*&tYI[*A%Y[8=7:VlY+sXn2W5;R>.qL]N$c9qh#]W4N6jk8F_fFV>sB)>'RXh5#[2.K.%d/TYJ<"\r%iQX90.$pUIUE+)BO,C4ZGq,:A&B9u,jHh_0rIfMGe\\tN(30\CS:[CJ(bo6;)=K;t+5uO\(a*CA$FL#?6bpbdKYT&n"HtCk9_hAY\r%cje&m+%#?bi9dVENN!U4'O*"j\nU]%K:"pn"],[m9#!Lj'dJOE*3(,p=PD#F\l>VqE1.C8kqLM(GekEPhL6m0]kfXS_orZ8$@?>4\r%;JXJL,'@ZO-<I'O"Z<W#`LAUa6ei/;i$FW]:^mVnaGc5,o[>[NZ_KHX]Ng-5d7tcMmAJNP@!\>5dX?K7,8.a:]ZN6)qH]M4F:k6?\r%\`h!M)SQJ'=.1RDJ5)D,JblR[]NMg()Ie_05s-bE%r!I/gCY[>QYMF_rL'JdJ(&TUkSOfeV=PF/B)g_l)rQus#Y&_</i;%Dn+)eJ\r%KN!rIn4oU+`k/nc)o)3&&cU'3T^?XS^rAIL!up_"%qrQ+6a5rQ++_FY]`d*XoFnFJ?[3"XaZFnS)t3A64>?O*$i\:lHAq*TH_GbI\r%5*NdbT[1gr\70>VS_<.6I;[&caDRB7d<h]70:@U/)dfTeSAg>d$r.26])lX/#HOguSr5OF,u4TZlG>&r[=SsZ7%]>qnG21eK@:db\r%rm/ib[D",H9'7"(Zb<8e&B!PK'p1F5/mJuSFTF^s@7fMhm?ro++t<>XR9qKf$muDgj6NUkWdrG2N9oXP\cS"+^i"jVO@e?W"YF"F\r%#bZV@`1P*t+I&&8GN2mVgdEUtF9&KoC_>2:ROdgCpbE*\27c+>8C+^]9s4_R^gq]IE:AL1:s(u"2;IKiFoe9eGY>?M:(%=2r/V&k\r%EI>/RX@iO67U)0NpV_1T@;Gch(<"[3QtMmBJt)RA'nj/B6n>4J8#+9)B2]?Oc.Ksd6Rr;Pb9.AtTH5DR+On:sQ^)PGX5Qq_@JHA@\r%oVdGijl4)q\Z@*1!\+MM.hn/2h&mL2"0*hqP7W<PZBGfOK[=9;7P7UCU#,Fm@,KiWWSelGV;'ig:X`qiSTFIVC(@8Z'sl7]!iY7S\r%U*!?U:sffRl/nK*[G%PJ3=^/AISf]r7TX\k;ZE`Q;>NT/4\@r;3b)4.`Ei+?f3p/*T^F"X0'T)_s3j+VqE`q)U*%lJoNoAQ*V;?%\r%o^HFMP=I1[UA;#ggnu7$T:O.a[=/#a^1s5=ghkrup,Q%AW.$E=bW"^>48f<3qS?9QC>sser;H\Rq3N71rb$8@eb[)fZeFUkn43,'\r%*P@A\0Z$L:1i64D%rsJ^-l%[pNJ*Xd?GL0%AMfbRM-tO]IP=5"poJA[%sIGWh+nge`oQW./.DA@C1aksO:&u5*K@VPT/6(#`Gp_O\r%%rX@\Pt2eBHlY=:58[&4b[P"*@]66'8MBX#<E)4hoPh=Ds4NBRhphE](ikU^;"9,C"dNS!TMU0IT;2:O@F&-G\9^t+K;]%D_@.Xg\r%;p6BL6,a8DA7pXRq5);SY-M<3#8K*Ep#',c6.CCA)jGYFOb5,5j=mjR'0.K6TON\Zju\,6Ui(2I*Rk!oaTPU@Ke=YV[p3,)cBX]R\r%`_V_L;@+i9Y#.UjWeNOFT,o>[_V`]M.Xk4J_7L83;Z8,":te3(&OY6s&[NCY,RJ\#`*B[%RNt9_GT2eWje$,kd10oW:h:A99PV'P\r%:P]3NnV#?\S\PrNG!uC_%W%gWW!WpDQ7\CQc/#p&F&D^H[LeFkAda;B?;NN'dJ[nORq\meE_s)2<t=)A/4B61a[25EROiP`+cAo$\r%Q]f>06??!6C9eE4i,-P%FFT`16oh3f6BtP]0ra,4A0D:B9bsJ_4+f(`mE5G:3fo&1TIMMVG@^4e!,s\b>-/aNYO$7lDD5Jr<,+K6\r%*R%s8ZRt>RF)WpB0$qKt3/j-G-3+'j@-k-[%7FV@'(B/f^p:,h$Q01s%"gaIQ[I*&Dl1mf(:R^#TKV4e<L/7>/Oit(D+9HciV]0!\r%](pl\Latm/_##B^\od<-IhA,`k?O@l/$rV4"KK>?e+.0-m\gYWC,l?86pj\JfpBhm8J_Z,X/,gfCtu%dGTB+L9^Udbd[5^&!hS3Z\r%`Z(\/iUmXr%H@^M+qSJsr%>k]f3iD6b#&FRAH60;<J7e6)a%I#"L!]eD"o`87=H'B>=0kI,AUBp!6:-HA"s@MP%DkfZsbY]2f#"R\r%&W.qgK[Jm[ge*Nl+DcD6]&f&ai6XH*j&5YH=OeD-JsSt8lCE.&-(W6Q'uL<.GA@l(2-rcWQr-)[NEmIA@\#W,!0?$eB'hChEkm&P\r%N#<8\&-g>IXi#D*L+%;&`17QVD:[Vu!b:`u-\\sj`b.cP,^>'t)pT2PrXes_m?Li*8^Ro)-';pA33d*m#rQ,;KZ^`A+7V#Kq<%[/\r%n,j_bm.^Ag17rfR2uGa%d`co^'!gE`9:GZoDaO.&r(46Pm89>N?D"Nkn+A/Kp0[Z]B#!*,[-l]9>MA;qk?ZdH\^S=;5P#95J,C<i\r%p);\u:P0%PISa;O*+]t%maiL8cMdOoH5]m@c^Rq=I.hbpD`*hN/G.oEUgBfOJ[[=dS+uRckjj#t(X&l$_9MQ4ea(f*5KOjg*FZa8\r%Si<JY3eWZ@G83To$[T4hOZ@qM#8;EMapG1$/:X1F"at0#B]"N.bqMDgHUV-J\!/k`=Mr=N17>^m9pn\#?W4g>rd@Mo90R"N(CM5S\r%aT>!,)P_JY^bJf1en*2edQAe^Xi$q17[iQ!geI)RK>XaKI2MU9^#\e@pf7GYV.9u@?56-t7t%-c$0Dl-X02)S$=0BEKZWt`-MF")\r%D[ZsO]shG"2tjQ'BaqOt]qTER5e.'e\^pVs%VgFP2N4h?Y),=s(jO5T7Y\u'WU8Wc"smb5365I3Apmm+UZrep@oT"odFGqZ`JqGD\r%?,rl_+lH'aLf,S"+el?'C5`R4[m;dMi)49aqj[i`YdDg@%#[sr#&.QP[Bq[@p=CErS>3*9GA/9QrTV>o6.tJ.`Po!L9,mQP6D8-+\r%+Y(JrTSo-PHOp$%OhR`N)qF:RYSHcUVG>XIcRs(aZd17@e.^(cj(i4/mW4KTC2'I.(Bpu*(m--0^(FeKmMlfslE6N)E,>j5cQ_i.\r%_FE?I!\W`19pI^1:R<pKrR5>;6iXf#E,kW"%T,A?C])6?R0?eN+'+0/A<!jCFt@"M<^)!:?Zhk6ghkrup,Rs#W3"Crnt:?q,o!"<\r%>1.)**e]HTs1b%N)..!*VYaLJA$c`s/udnt`n8,^a;A?;%r[^Z>$]-=c-0d!/->&9q9tRT@X_m%RJD\WG_M+(7ejBqJf80Y*P>R+\r%e9-R*VMB<>%PgLkk)3]r7d0%QisXM`mhA_JU-OXi`n6i(:#Uht+_&Ceh^Q1*I\<[+NrVZbUFIeP;"ekpZ2*(tIG`QL3APZ8N3Vu)\r%kS:^.(Pr%(14'+H1VoY_gi;#A@KMZDhLu8(GGploA;c<O<(UMMM><uAE3>j>aVGU+.,!Tc\3OS[M@5Yb;3?D^g<!`3Ij[!JZ:/2S\r%Xs.+H##_l(pPo^N?0N#&=bSITKB8PFF0;BGjFs-5PWZ34G(hgB08=D\DE=/dnpWs'W;&X"'^n?o8n=k;6-0fU-0VYO$*tO&-&%Pj\r%lloBXU`_G3gQ7#C$oKPk9Mr-J/h=:_WSpmj+F692"f3&@cO@C*jmN?nfg3#APnnHj42e^6e/mqdU3;Y4$9O%`;:n1=7L!>s#4,n+\r%o:+F:PUo\<6^K+UL)`T\W6%>9M4,D`=[`ga)D3:j=ARMPM_%_hK?+[D6Ok:ieDqaX6qn0&XH:>qL0Kdmkkc&SLdLS6E_r#OG;&/N\r%%]XrW[%Lch_hYbTai\%3gh\OFCiPUhd:A-+)t,R>k\$V!K*$$&DW],RM'b4=/s$oJ"3["9"Z.20,/ri[YAt-YXYIZT?o5WY+mfH*\r%1[D[;&q/E.0"C3P90EdM"1083&F+\Hrrt$[l@uRV@F\AUYeSRH_48aFZ"-1TLE1/`QU8/9ok0J27igH1`FLm$cp$(JUU?$uMjbEu\r%.Y`ctQeAt#)$1"A+;t\c+^r#\i%QVcW[=Zi!5L-8CRQuj9[>-b;n-B83=bMSi^Z?\pf1co<IYm?CLYe5_[B6q#g8K?#(/,%</!2F\r%%Ls@L[_6[^d;1\k=>nB@f(EHDCt<!(s%Sk:]jrsVZ0gZ<QIkLh&5_8dq-#?0@W.=I>i&et7Vt&%,u*Nf$e>O<M`%0)>LPbh@b^@S\r%g[G@t<Nuah(E2QtCZA&s/=$kCX_!Be-S4De^%:/t"24C-DOkH"A%N0cSr.ZlNW$_(?^8R)b$qi7S'o"tIRqD5rQN94qi9%g"247(\r%JPq!f)]&o9*Y@Y(:\hKLM,Q(UnD/PHljn=RZCgoT2uH<edd6`)P@hP`UQGETT@3(MHPNhNi)cBGDU6btGPd[Bqld\+Zet.WgABdn\r%@G4eff>k7ZEjqC'J*^6O'^6jcj?$lbW6l@O5jMkS'iV3O7$+$=k\R!>"R5l8S+OV"DcX]N2\jnbe)8:;]%fO1VF#OZ-sXb%E9PC=\r%3Z(uf^4;QNq-`=@1o_&"\I^Ob>US.qgY>Vc?'M(^['l[@TN_To'_;@]]ro;hJ#ln3@<HK=0j(csXi,P%kKNd;2;dKiDrp^p?UM6H\r%<V,0(2K4`sjF"o"2'%[OB13kB7T1<Zk;*lU(F+(0S?J9,^)Ps%Dl/27#/5!tS0-g>[\DKsdr)P6q)#ZNc=\=r#XTNmHmYP&/8:@?\r%os2nX%C^Ys?-[(u`B0hd;U^nX!bs`&+3.H`[7$-i%'$dRd<`OXpd)Ir(_6*r?=DKgn#GR"SKl9?h)e6T\%[2I6/U%J9tN?kU'pg8\r%1IdTO:CRq6oVk\37J/@&<H+e/0@"1+M\UZKAsbC:*4;M:5cs6;QWmqB'A^'C;cHifY3<c4!>\%TUsE(D1K<Q&>gfPDg,1AWl:S_`\r%#B]KZqqf6\8_!(:P!1`.'l_8GFOT?N3N.c1A.C)X4uM/DZb9>%KPIVrfCZ&&;<X17;49Vt3D.gL]q[uDW\7s!>hh]=jitt;ICb1:\r%?.2/HQ)?]7A::J17+J1skhZ6trqRPMH2-lR,.Lde9ClSWW)S3#j0j8-gAudli5eTA7.9XV+?&7s4!!7/T]^ScIVJN5iJ0M?EpdGU\r%c#S^(p^<9,;9'(@*7+aC+-\6=FTk]?m/P+-4VIcLbOG$CH';FHYM76_:poe<d!ehrqFSWg(\Q#sKb(QYo5EGDS,CIi&J8W-p>.-b\r%@`.C<5TnI=,2dMB@GW"KJ]`?IG4Y/hl/Jo3DZ7L@&cl'%hYR@I$=]"0,%fhfQ&e6bNjsZf!I\*sZbbY</9!sbC4I0Z>!m#)6^RK9\r%;-VpOC:H$b/tX(rr>0]j<)I&L_QkN=5i1,O>UnI%d&VNE_<N&4@^/LLl=MS+'U-AQhL)1,<>Lln`VT@]DDg2uQL6CeX\3no2BHYl\r%]`dP5;?R4:XFTVGku?b0Pn+NWo:UOXXFFN[]`"PXVb='kldCOjXi&KQ6i;Z`5#8Hp"BthZ@[+sO98LI$]7a=C+,E77_?nA4$LT6u\r%hj!F+71(5K8"P5AP]LElLF9;t'TFg9KQf,QCWI_rW3V:.-8f&M'BS#M@/`Lc77tMkMC2epD6ignU'Wk6JpnY@,/X-HET@BSW$pZ]\r%qGn#51#AkI4>;Erjl)_*V_Ed'Y'n$1jM2>^5$u=XK!&[@pbT&22j:@B)8_j7#W7VFJUp$?$k?TPSI(PJ%,4DbnM`*ArX4o!^sEt@\r%!RE?TF#W(_&iYM*;M-9\*k;JD%8p.[_n5l4`"5,)ZQ+i1^uLI=#?n@iDiG(r5-t;?"?s-=Zs])/DkqYEPn[PlR,<`:$;be$@:08_\r%T-(#NlUdf%4feb^"1=?]9iFKW\SLG;\MA5l#Cda7i+00YS2D>>K]/Y:fGILgGQ#[-L@(jjhqV2JUD[0KNc]fO`anME<3R,_@VO+6\r%FC;5!q!@@_#-+K'_8Q7D2Y]S0]-DahXlk4P9aCHkY;tHp%X^0qP0LM'`//eg)<a>N'KVVKhh_iU@?7VU^m=c2>ADHV"0#N#GkF>h\r%jEo?T;/,HBFR\8YB!OBuXi5ZL+BkeajAQ-6NH!EXTL\*,MN4##_#-Rh^=:iR+4.-EAU;S8@+tAEGf&W@WpX/cl+B@!^CtqS,l')5\r%.)FoWK?GMU$1\d+0>UKiD-St:E4$u\<V/;Ri6l<:FE03er-YuonS%j8JD?eg_NfR8?'1mg$2t+@3Z9*/'JPjlmVkPR.]uaTTcQX.\r%1bGPYdPt)M@=js()qsZI'o]=[\7!bG1CVP]r="<79_$#5(f23--^qqsfZQIV2-_,f5?ffmNO\b2KCJE@r4aqEVp\\e6pd\]q_*pi\r%]GMQR15G]Jq:nAYlhEp,L<]E+>+.F3P"=FDYo&GeE*'Q9I84Rf<<tUnM@[&`9T^sXr%A6-=roA)_9_<ulRT'Dn8qX'qd1u<\oKDM\r%I^7.]7"_'>?P5+6b&J*/>)+"E>VYo'c^FI.hWnMYeJ`,\*Th05J[XWfWY?;Gd/Rdd&*Bo;YQ&VL1J(RdjP[NV?Xs>Tb.#nO[m0E!\r%?8$&5N0DJ$<l)Hno`(Xj67J7pMdW,Z;p@Z7F_l?t\D#O4\ciiSF;`,TJG0p*eu$^HWZcu)R.qY,%1uT>%?X3cQNlWfh9NM]S;M2h\r%`N-m=bQWMZ@cRV;9^E->=4!j7iU_?1nrQ\I@?.?+>'U$R2H11$#G-emXmf[9`S<_m(`f1Yh:!QUeDa,PZHBI%[iM&#\9R,CF*D_L\r%-,CImq7uUV:tG58KeAdSg(N+U6I/0d.5W-oo2-J=4<MuBd7Ff!`Yd%-8"HsU8kqL7Tn<JPd62_)3MqMWSO62oA`t%f4$VadiSF.[\r%?:ho.ST(eGh+l\#>6J3Y0.pYfI0jE(cnf,LHNm_.r;SPE_o2K4cM?TTUn-6t-]>Ik;IV8hCaXYF^#PTdLn>Y*Hr8c30(\t[Dgm_.\r%h)SPVGWR!:hmnVaG`em54r979'D+;X5W9t0I1A-Y;5rO/YeE8J^-?W_)[bn`ac(kX*;g!.J]%<e]fL6[:i["<%?9jh><j_:9j?b^\r%Tc='0b/-7r=,m9Me8XMp>rq_mmOs>K"N1'Uk"gfLdWF:,aDlW[?JVs?,RVeK-C"fi'i3fY:_"/TE]^f>F]&'Z-G?.UJib",rIkQY\r%.CRQ&>aK]Qc3@cXDuq0Gb!6H9]jfEX(9T0dJN7a"S5lJp&/3OVdL+O$%u55Mc:O%MF2ZCe:e0N['5!$;%()HS/Dbi8Z$ZXV-reTG\r%<%nLM;oN8SHQH2>kW$_'i!P5GnSunL5$WY5U,]i;/"A12k;R@6.]^'g;T#>nIV4FdUB;eX'rhP",Q2LI'VXW#cnp=$ar"3Q=[JD>\r%*:[on08>!'RAjmG#TEich46kDWcmLp'flsqDkQ6J%PFR_pG8`@bpqo+/)*nk:=4?U*b+3O54.,/',FEa;fFZQP[D,EZ^mIs@L0X4\r%IiDFEZtgUM:9]f?1+#LfPTU-`&DiC"<K<YtK;UMB$V8`tMhOOsDSl]-8>B9M9aE?T%e\;0TM'H#R$ccf'5[=U4/XMN4-$s8K+Ohr\r%naM-E#;7ZmP(J*P"Wu0^raXrH23E?+=)P4$oRhY6.BaaOF@n.`?R(BMKu>A"R3Sd3"L@j7-pR1L_pT98-"6r<-Bo3$)b(>YkBK,&\r%UW\]k_TX[<5D4&\(CV$;-.>>Q099:RQD2]nrM;5t1GS%7:#l.%0n)<49WIl+Dd\Eo4NI4o]__\8*olE<3BX1,a&"Ush1hlgd%&\8\r%bhKL&((Za=Z-E9,(r*8;!DR18.gJoG*4`^)1sHuWLVBp!5,[Pp'T0@%iKZN\Hj@lPq&gL=.h<Wrr@'Ra0&Aqh[]VN[O+O4pF'?J`\r%6DuI7!`+h1_&Ec(CaU?Mr^VJr"#>FcN^M8PH6eVSi3P^qZGf4HmE'pM5J0b(`?"Ci.hnF!"eRU:>J4*?Ri7<6ElHafZ'JW7"pSJb\r%M1GWRi&6g$732>\_']ud"&Ou]0RP=l8N/teWuJ>Dl\":pqjK)FL71,oa!V@FC<^[JE)IH=KY[i,TN_kl`]g6F\(C$(i_LPhKUmqR\r%TtK2&'1Y%hqUB2PH]FN.UkUn0C=m!f>]LhG"=BKoRhFm71hVah/LpD760D(/PF@JGXNrt<i#&@V?q[DlqMPT6h1gm/'W]ua<1u3&\r%R$9X*_+YG-`Whr4`r6[00f!i0?^m<ig-gfQl=HU:)QjO:Lqa[7`;VO%Z%iHedQn$_a#/hS6dNPq!kN_4/dt[)l-=R`^:%tHkG-m6\r%dg=o`MH&I]E(/Yd?Fu2F_p?+h,Ln_<""hqlou"`Gim'PKdO:]W!7_!1!U/iYjjRQ6kE5X9D*PQop7&5^I-g`!D>poqJVVp!WH]LP\r%1kB_7;Pm#fS-C7gN]m]Ti&lNe<PofA)SS<]QsF-@@^\k@UB1AuXCbiUj>\P6#'<nUC"q%9O,u*"A.%sD@;Zh6M-#Ap=Koe^%4+Hg\r%:tF[P8U<g0%9K,=piFairphJ3/.#pr1#d'<]VbnU6VPOk'mb#K3gqe]![bcXg#^"*bX-$'6YgACUcVUgERKk/gs9[DG<.a7"bq^W\r%)P2gV<!_XAdSW#,G$num7p"iBPhNs)A\RD6TqS3P0XZ"ddQgf7:gNkcEO&pmD<+JU:AtXmMF<(urb8f[n1&4l44#ih-rf_gWaUqU\r%ArG@1jbYE6l#)J_7^he7^-ZtmIFnUjKT9PQ$P2i9@r!(;6C/FqR+-((>C>!k*"+_m4[LI7=)=",rE\+2hLmGci;kiU7Ikhalp):`\r%;DH/&q5oIiH5-0b7%>S2BIk^,0m)FaU/86Jh_41Y'WQ_aYb9kc`J;@naTfoQ_e/Z=5!M'`gR#PTC][@.1"D!:@i5H%6T+RF_LR0'\r%*$_RPFoDt&DlqJU4RQU4N8lF/MO"N#c=+qF0Dh9jY^?u>:uZTC=&M+`Y,'=3G;P(LSI>lE3`l4m\CiMs[K#6^qA4`2gugd:#KJWZ\r%-(Y.qr?.dZT$$%UWZuic;0B\OC2##\4C5nUoI6/HVVi/=>8l3s+_<H9lKhj)<l<ICe[)d^PoEg(e`WNE=<4J1.1)+E\f2\X!lE]H\r%IW@s-keQ6_[FeGcc.U6<aO</\a,TuR7_Z?$b!)^\h!7Yad[>m."t"S+2/ih47q&+kE0[<\IsGFjS5UHT,HC5O.*hrW)@@b`"8lgp\r%Xptb#/tS8(Or?I&n[e(.<l)IU0'873it5=),eg$E0td)0H\MH35hgh'r309^+1`YLG(ToEd@p4t2Eu0oCg@e]qA\':\FclTT6K[!\r%`(1Tt)!&>oL:9c'#W6p^4uF6p]?p,JCRClsL@)&ZdodGZZPSk)-I1,i6-P7$E69A;`H3auJZiIO"t<NrG[PC;QEPd'(Jf^=1LkO4\r%J[Yr#k`aj5-;t^SHD(t7Fhno\3A3Mt=0W&oHCsfgoaqC69eZC6<H.?1QiF.h?:GkG4R^oa*F$rP[Q;^C1\;/A,E87HBt[VkV`SNh\r%_6pu:INe[+aao99FdM_rLQ[.YS:1h.q7I78bsBuXZKZkF<Ot"a6i"A<[kjj7piDgAk$baPip<f,/Y-XW=FmcYXN[U#m[`LnRJD[G\r%b;%"l)CuiP0Z1baU;,#<ZaK9\.lXeQ1L$A%q-f=eQg7l"'B;_C9L"@;30LEacgtI$Qp%SbnG)-()pHqY#6Zo#0`-f!WAP2*bc7IT\r%0Mfp][)%]pF+FgkA:*"H9J@?2c7u,p>kX'ZeD%sj2C[=aQ2A][3U?6XjWD#+kWYLm(s#s_hH!\0JmDr#'$S.9IGQoJnIYe;epGQ<\r%:5jkJhXSP\;O,T[i,@l8l?.)mL.V_m*nF$^;'nIt""MBL0#qM>,c]C#:62&2-Iq4F@(=RP;t]suq2Gjr]S"cQkD$s^!bIW*9,+%n\r%nji2d,D>n$Y,f4<6Pm?e9E=?/c<Aa)!j2T3^oItWE%a#44<,G&S3>>]YW=pD"oHuh]C@m/#=ieW_D!m8@RTqJ't.QZ*qO,N3bqSS\r%nGE](#2+NN^9i;-[F7;o?g^_(=n%uis6+2afhNTs+#/Ir[[>c=m2ZP4[Md&3$GLFAie>k<3NmWJ"WK?@LW*L?2OQa.ffTm``T@bU\r%4)[us]d%t/0)a;VO^ifU*&`X#jqmLPIA8[P):!^%cB8-@ilq3/iB^j[rXNh:U,qhQ$q&_24oSmJ59:&#l2SP,i32B<ZiC"X=Io]c\r%.sM_'N1!0F:1H!HH3V,/k]9!^HB_rS&Z9B2UJf#0pl<,8c#DrtYj<bC69"io2LY<8)@C4\DXdHDlsP3<gFW89d0:]49B&J'%,G9J\r%_m?5oBX(uANS0h9(U"dl!T!%Q>s83GgH0IXcN/ke4DsmqR!<tJ+Q6,*Ktfo>Y>/V,/asTGk#r)oV9K921&VH6D,EYVB<>$Bd?t\0\r%4e:,BiT;2_>Ya/26g5Fo)W>MNb5o]IHJHKY=g:;shVPRm]uen<BMs.Yk:AR!_!bs=jGc9-&3;n9/8f'KX8P2oVn1m#*@B>kmq]Y6\r%?j7Lm`3=gY2Y_CUYcsl:'>l%h[2^/]H[MiA;Hfb]l(^iQ5KaLW887"3O9PU(2749B6(`ufK?&lcEWP;;+0Vn<"Ch-1lt(q)"mr3B\r%K?%Yu@RD-6_.-km7HrW6R),P$QIc#')1[M.,<M(oB$b+C).ka2apao?FGDmmEs#QCh.^Kj\AoZq^::aeYt9sB+>bn4S^4^2(NRl6\r%KcDEsgkm)a$]j68(e_rdj-G.qQu-:q3U"VN],,Q7#ATmOln#`TTPMYXQ@%[03P8q+>>#G<'0bCj9Ssek-<WrA]6T)f/eGoZ?nXOi\r%hcr&>Qe=m.-B7):3R`r]mRHPn9o=eaZsj89(S@QcZ@aX-fO7[qQ0^3ZYZT!W0n@GXi`,9+?p7\_nMan^Cm(hPb6Ia_*[]=X<KVn`\r%.bsN2Ik,8i0O9VA"%*e\i6=V<S\kk6[rV-^*-jh-:)+Od0eZ4db/\bcm;gpg]T@2ZAD@Gj]T=-4gL4S_@>tK0n."$`B_]gp1&+2a\r%b!Je"GTis<%[1eJ$eV6nXW)O/-NC:ra,q0;=iCc4)Qr.T\#cNdGp0*\80k.\]RYjki:khBnNq6`O\1QW0jsje^tTid(j&nhL.Mi`\r%U5"V@\LT.\'fFoH[u%'Y4b4POjiZHg3jOBQT.2GVQgF2b7f+:r0jbQDiSUeg>FGP]cO=L0AMP:A=5LdWBI]D<&p6qF<+:l*2(XZ>\r%nKqWt-&*2'i:-_Jo'$M#N_Kb^!JgM*NY?U_YWc1NL]/!'kp;"<2>#F.nmW`1Wes!<'qB6er'15Sh_mFiYV=nO+'=0=Q;0N"a8%aP\r%=<;P>c9NEK"2E=8C7BV$GaN&4MY8=&no>Xi0p@'t@fBOuRtZ[[%4bRKJ"s8uGaI2fcp-a6#$kS\\;]T5rQ/U*;;c:`f^O8WI0d"/\r%=1mf&0k53*+pJE@*!%[uFfWt-%(&;W)Ve@\/0n:7o-Pj),.]5?C]`%%egWW&./[#R,l\j>(Yinhk+"&[Q2WCFe,0gC6;,i>T2K4$\r%?.i'EJdRhZeuTPA$1^tLk87B^-M6C!DL78sX:mF7CLuHdoDl5&Qc+ef$/8dhDE0&gWg-H=Xb!^T4gDId@kM]'>ba3H[ur(Zb6<Om\r%=5L%[2;L<[aOp3u2siJ3WJWR<.APb,[oVJ\1DWVs2s@&(K,cVYT;0)@T\ImkDqgN`f#7:KBXbgpfap3q`dZmOY=cY5d($4:VXSf9\r%4X=Jr=Cu%cTgYIUd-BjZ1AO,5_t]K)L1u"RqW1@>BCk$[c[jF!R-/t95QC,#'$:(?ptoGjOT4GBSi`'hmr]jc^>G'7q8AQ2iEnX0\r%B#!)k2#FrrL!1(;P\.\bWK@&Z\'jVe4-n-?YA8Egs4Y"?qq^\:^&QmuVL92+>tk,BG<;5g[uOf1c>(/Fr%J*Es/?+7gs-bpJ(sAj\r%r'0\#r`AmTs8R#+RJo;Gqg\M;s6'Dtrr)j!r;ZUX)EZE`PDPq6=3Lc?\ub%ZD'%=N'(n)C?Z)OA,nn"\rN3@BW/7i4Gqtq6`\!`V\r%@t!gpBtQ[tD*$L25,T-c17eF?8oJlAh9&R-nf-24!6'O[_&Xj)^$c'ZKVq*-^3D>OW:O9rY)0Qs,@[eS&G/C.$&'`F:BXBb.+aA@\r%V\S"Q,>,n*J\4ar%,-)$Z(\U8Y#8'mN(A8blpRTRhJT@_qWNpX(*V'I9f&o)$g^2ALC'oRdIL?33NM(E0,LJa2!KRJ"3fj8`M7c&\r%(q^[1.J,h3Q196EU(q?+oK]*k#\3[8)u!8\c9H*ug>>l^Xf03A6#h!DcE)WjM,k,+E8YgU53APs6D<B/dR>0^haJT_=1#:uZm-m0\r%Edg:RUX0qh'hT!3N`V2S:Uu+Z+%FCREYp4nk#WnjnNY+@YW#A^'B>AY^HT,BJgkF;%sr!"D<Ool^b[B'jJ/l[JgmYcRj?"#K+S:t\r%BCpH4!e,m8Aj^F3`4)nLF?D6op+5qV2Gt8>>GeXm0(&Gr&*W#4e@bmHHa3tHS!ULUXCn@M>VdgOP[%UcjDL/ZI`OJrF[2Z`/^\Xf\r%M>a8C,&h82PTctcE=V9!rXj6H#6d5n_.*W(5Pu(Ol;8Q)?Rmbl_q79Dp=K"6riHT(0W-E36YY=urs635IkomH7gJ:iKBOc^Xn;Ta\r%\B.#U:V)$&p=FK7/-G3&FO:%-:LI;Dp?a:;?G+?FQNh(U`;'O:6Q:.RU6!.V&DO&l5S<$s#qIul'^T`p`oB"Ea--+X;iSB*5]k^%\r%Mj><88R-!+0L3;.8P$9!j%VMOJ3K)l0b-KaUWX\b9IV5>(d,2.UG2JW5J['>!Q;Y2mIW_(L!j!PTI?icW;R!P9Jm9[r;$uZ?9teI\r%rrCJ]/_k4O1BDq5dV<2=npY2'RVhVh]TgUEOY]g^X0#nnog:8h;hkG/%7G%^@?urZZ%99qN0oO,9m59B@;<AQ_Eoa%Pe8kB6[5M>\r%ZPASr<Cb8YDR@E"i8^C@`T]*E1"*[+r>3(_TVf.rfSlB_[tS&/3%j^V<.543'1;=`jdg&&D!nL\`u5dhe[?90[Xoskb^Ea/YmP9a\r%]^RVAP+MLoDXF=+M'#K>8;?PMO2gKsGq0\;\#Hn)X$/u;.fOBJL?U;Dl.l/+qci581O%7)]af\=GIe3iI<-;[i-0(6)=M_gc$lk^\r%+S4F7UKR&,+(W%=JMc\`/u2Y=Fs:kuhmnk]^=SLSf=ok%Zk$QR1MPb(DKdl7XT*[R'#'AuRRQ7P5;bHAZ0qoMa7lsudaS-ig:P$)\r%O?@pQOo/F2(mc^b.,%M1[?o6-LI*<)&E+k[$GNIi-r7tWP_?>Cau3*PH?C.W>M82HL?15K]a#L$+EQhi`nSVW5E16skl_*5Cm71o\r%nnmjk`!I/\"*er(+_hVt)kDnJ&1E&1:u;n^F$jYk:DNPgS`Oor_>7D's8:JM\Oc_ies>?k.t+qdiXZOk_ohI#_o\V%&a:[CR4mh5\r%.kgknZYV@3p2))r"fId]IS=V+d36%(kGe-'9PEr$<,22+R1Ol>>"qS1U!hPm6l1'h?`VUSE":Ug`^CWu:sRIbbPF^9YN[]d%9ElM\r%_WS!PM\9<7`nI:gmtiYXHF5Fm10*O+[Ool1Vm1(gFX]k,Cn"&qh>C<R"A'KYZI\k,m6jH?8ThiuC?`N(Tq%o:`n+0+WjG*Jd`5@'\r%583+,;rd$oBhbT8`>'l-L%=jS<NMj.R%sPhib(37/l-nha?id3gk@7XiX3X>.eSMTMP4kLMHLCTElGRJ0WW\>RO]ZV`GN+O&m&bL\r%OOP)8/lYtB(R#bT72M-`6ICKZ6u`96kh6aP#WgCfUq+jK"^Ob;iFfLUDef3?HuDaM$V_G#l9`sR65;5R)Wp7$\d4M=j)63\cu^GQ\r%0Q+cEP0-,_Kd=R_I%e^j?VG4EPV5cI4\IO=bnlNOj#2;4P?DS1OCT2s/u5FTMg,&&ObI>3ct(Of;k1Z=;RpiI*?:J62,=r&F=gG0\r%jlnI2pKT:\$;"^#R6m'DBVnV)iWN9!*8SpT^R@&PdUQsfORsC!@1#SDTp\6q@q_adAVDQ[2-e6;5I^u9;0iYq'TsNt2G>:9/MpHu\r%H43L_WiY3;8I`-Q$V<1Ka[2.jSA>u@G/XH5NdRO(W(IHo-!u$\?2VaLkVX55b3*!/f4;s9GJ1L@6O$m*j7AWGit(?S_kJdrk0J8u\r%(4&F*3/'s\]Ii5Rcu8mi?/2q5I7Lo:.ZShmG#-MjbGUV1OKTRCDU]W6X,?0j3:(4Kdi*+i^V^.0\*07li%JkJ=(gQ:R5UcS:r!]Z\r%('og>((5d-H$8Ci1sQX#MB*(:]LB,d'uJ1G7-"6nADL*)*Ym)c.gjS?2LAWg+_HpVQk+SbMeD?V-P6?P.H^>G(alFr8;tJ$+sXUQ\r%ZJ"eO%&12G[n0^!21XY^Hj!GuNsPD[;'4@ue5l),;<\Pr`4Y3P35#+D0bu"kM:8\@bsJeB,^K6@AVR2k)h^.mTs;L![i8N/;^@;J\r%L=A`r/5FjkAlZ_L%?Bj\"7+=96fg78\)n*$nFCB]^%6.gSYK7@?l#YCDq693ge-!Q+ZuOuCkUL]2k2[s)=sgOU:GsNc8Yld0[)&e\r%n$^RK8'Gl>gD:nDLArk"TZPG:V-:F5$RXF;X:>'D_d8VPmG*kobsO>\VdT"dM/41SR1Au\Kq"7H\pp4%23s#h@$ktDZ[MY(IjpP&\r%mQMQ'f7B%Z!>e)r'.<@*J*BFkrD#l2XS9:=1-a\jRf-Q:K'#QC9!dFB;E"Ec:?Bb"41EY^G<2&`mWZ:/p-J%g0("#@l!ELZq1Ugj\r%pcEM9SG`c(AFeoRh55I4o#D8dRJYCDV6`'CpR>-$01ifMQeNg%09bUCc.]Hp1uFPk3f.`5Xh@E&HeIShL5WB]J.k-BL98e2A$/M[\r%_07]d+`#,]],=Vs%DH+&V'0UZ?d@m#R'i\*I82<&f2j5#4$l8b9=.(;%d+4k6J*GqLB:Q<lj3CK&r6BWcAmFl@[J'm3BMQ?kH'8^\r%^"T'a")&KL=d:]%lk"9[fs)"KbO[DY`f4@]'80-6_9Gb&N7g4CTj((J/)"aJCX.s6M^1B>mNR?;mNP6U0f27\F6I3aoI_AbVqfW$\r%V.]-3#)Xl[j5f%qdZbd2oTUADhlLUXeWY&rF@b*$(Y4=%V!OJ#b5OP8#@CtVifLHU]ZBduAV],)<N+UuQ/ip75Sn@1mQI2uF%t8[\r%PT>'Fg;,XF;G"EmVkcIeLRsW#c42u^SQ'QFb(9=j=L(&%L[H9NfCVnc\Y2)UEd$XfP,',0LYaPk[Y)H[UY=g$4*1]6\u(**l%\W"\r%T!Uk/OC[b**AjbRg)g+U!prEZ4)2WLQb70u>/RgQdWRq12HqZmncatqijSe^9[K6FFrIhuR)Ks!)"1;$P48Q)#\/ka;(2B_Il:GR\r%PkRmTI5@P'CW[K.R+ncX@]WIBk-f'Zlf:1HIErT]bQ474[V(KT04L7@<b0[D5haeQ/Q9O?cf$J)a;Ch\D4?PsZXt(5De3t,;d4Y?\r%-7Dl]@B,T`_T4^SUYT-GkgLa1V$$r3TT\\?66jf3H*akua_Xo/2G8I+CjWS$h7;u)dT.f"QPTDJ[S$-Af!\1X:td=G_;JDJ=0-8'\r%^7_i-ar'U<RdF1CD<T+p.K:=(YH7,Rns]oaW]a7/[3=4?Ntf1?oi;OTX$'AK6/:j</8kWEdV=!)NO!D6?4(-Cm1fC$Bkh!QHV!$:\r%-'U3>p[(iVF`,s/"4jnNB4(24j\;@-OG<4I+_6)<M3.\SNP+4W3g+*if9MHn!GBjIpUV"nhsXC1q/2PIlutN+Z9R8JhX&!t/?STW\r%>taLq^!<I6]\W"PI??T3bksP0RFrg6a?oi0R6BPbCt4:sHdl6XA,#$*O[ds@%@KrCXH&=p;s7afcApVt!H("GRalAHbT7k3^`4Bt\r%YB%0Pnp8ZK:W6VlKLAd!T$ig;C-XGum,:ZH.SJ\qOth?7;Lp\<mYl3S,OZ(6;>f%b]n"B,c?VRqA/2OnFSVPUQnR$NDJ<DfpCkC,\r%2_3Y/Gs]5Zh<3K%kOj?3hZGuP*qO]"FNEcF$iWSnY$m>_%:;^Wgk6i#+g4Ci\O+HQN-RQIHCqhke`0q$22ulE\=p0d)*BB`\Z:2\\r%[gK8P<6V)Z<sgE&XTqTK,@=k&=Zn\4C,puYjhSttX@BNglG8JPF\L[i'-=nlqhd<'>A5N33<oC?hj$&Ef]_NJ8NliLXHilW:ge!9\r%8psG!Th9*"QThLaZTgP+q8QY<<`0Gs'InNdEq:2LPb;cYUUuB"ri/RpP'SOROJEqA+UXKt6P5#ElCj##QgI0qX5HUEn0`"Y-)ZMB\r%$;'K%(S["=*1A9$UPIt=>unIE;T#WH68Ej8Y#*e/:>cIb]CPq.*OnFVGNdH^?-<u+1OAh;\O&&iBWdHP*L\JmW`VR;0Ltjj.ON82\r%INtVCjpK5oE>u3FHlSS+,bp,A$WU6K@T(%=A8uVk-qWWra?oHCgk@;*3Y'CLP0QF9KdnQOnSWh,VNB"=RONQ'NAHAW.T`3K^k!h3\r%o2K.P/u8l`4AVXK*1jD^SVO'K8_g"R6D98J<"3nj5>D&,2p1]5*h"E$S]>S\6BZ>%RZMV4RO2!:Tnu>EQYo"c=uHm['9^T"/i4`>\r%3&FE%/e?2?\uZI^UkW).L#g2!9He[=cCbME]5moY*QURT:mG)FG@^509Jno(=ImXq9sAb@/rrp$,IX7<NH0-YOL4$Y@'a44a[8!]\r%UK]6Jb)S]:CR[6CnUU*$@C*)2"L6<"5PF$cd39\aGS<mZ,'5(:,2T(\](A:?fZQIV2;BdE#DSMj3H'c$$d!Hp2KGHV=,:MsW&j&p\r%-bR*HYd.[W8COiYd5m5?6AnLbQ%^"AdN?Ye)iC!F+Sm'TkcmrOZVT?38fmj>YkTn1[d0AUY7ja\p[Tmt2/u34;40-_2o9eQ(GQ9!\r%B\"6BjS=t=X^M#d!0IRr,k"1Cp=Bl1(,DS^%jA$?m3rhI"L0PiXCGe3kiRkkJkTd8nV_qFR+$dM^Y/2EO[/i@KGE)H7W.o8gGH?#\r%2k^oA2jBbRITUJsl)j1]I,Dn]VB)F!`t@m1?\3lKC%c:upP-.dFA33RgX",]Zsk6hVm2ne@3,;Op^8b6+=os1dI>$]GC+(e1k]9W\r%7'l$P,b[E0DTXrp@uO:i+;S86=<"Pc/EV6SfNQNEe+Z@CppXJ6d?elp@.'!J'<//I4+pL(#_\P+iOALSm&U)e`#UX`dGWh%KC&@.\r%$oWP.)DCm;IY6ttG`HCNds!Y7h;3eNGPdG5^"\1$rE^SoN-BQ0=533A8Gh)P4\<!;m7Z/ph<.Md-b.Wt9Y]mD1Nh&'<S:*f"Ab^a\r%-?oOr,";.h#p)<bI"[sHdG)(?k]9qDo(h+(*Sq'N/"q8^cf$b8VsD08R9KRiSi;H!`gHK\]Eae9EXiWQL%dU?LUu@*n5As?Xl8P%\r%,6$Y*>5*<m]/#@:WUT:C)hpI!jP,VT/D8k-J.Us)SZILW@T,i/Gslu+kHohf-+f7t+XOrD$TX5m6uiIG"`Ac_,biX#R7-Pleesai\r%K_R<LS5>M+P=RA(S5jO3QReIl$G8EP*b38:da95%80?0E-]!jP+N6ZS<$!$B8qbsfo9_A1(`;Moe/*5-iO5^RF<=*&&D]h`?/8"#\r%Q\]O7A.?rR;!;c98l#YcLPd>jd6g?[WfcjiIq^YMs7odXBJP]T4=:m]P)4:&81&on-DY8*GseI%Z@>XsK'+$)[bH!eRPP9R9:R@C\r%d;qO3p1^+/%J^+9G4)j6Cj6RSGA8Ui@9tGAP%eXV">WYD[o=QhXL+l<).o_/$EhX+?pBE)Y"g8uFHAhUo[&m1AE]\X8n@.ZSk<PW\r%U%\mH:/paD]@,tD,!uSaF@c`19HZ\5D5fpX%dL#]L(9YOE,cD:QBA7D-/r>Zn>J@C@6YQ1+*6-3D<I4n?P0=kB>%%*0[!E)n__7[\r%&#(A_Q?4_9YccB]'ZTt\8>5;[8>EP[>M6aK^egN2KTX,K*s*TXadCUZ/n#G4/mGjr00V$tgWB,Yh&EQNiCtBMa,O?.rLCTaMcen=\r%WD6A'9mB1:g;cX`pn7@nTt(\tKANdXirEFYc*&GJ-5c42<lWkKPBV#YFeig.AJ5k7$H#`1\;7P:4#@qdcY_$5\Bn)8#ul8])P^$^\r%p2#`Z-LQ][0(+O(7*W>$Dr]jTB%t.=5Ih5.g;;rm&c*qn\W.W=\\54<@PQQOV3fj.\)f"Dqh6h.bP!O\+7Gk?S$LQ>=mshJ+kDr&\r%WhAICJ^j*>I7ETAEYa>,/%f0&mG4d<P;dF/J>q"ja[c8EH/*'3"7[TWK^96E&@.pQOVdq25LSomH4htti(KO;?>i0m#Q.0"hsF:0\r%rGJ5op'87QS,L\38o+9@cdI,WVf-:eDRXh(TAshh1B5R"-5%aLnm_W"+qa]H&rD&4,>s_Tn@=kF]8QoiF"J2g9oV;B&5_V9OcH94\r%4G8a$q,iQaEia1GV6/s&Aq-:$,'FaP]^kF,IZmFeJG,^"GTDVljBE%upFkId=[XHOY%!PGD`hnsGT*d5@7D]YoR^;iX"77/GeUcZ\r%3N_8cM+#c[<jm$nR9,sJMF8YU&q4,d%Tbl1-GF9OattL0X3OHc6G>4E1?9&3i,\lK*g)d4?cX>)DZ62e"+9SQ3CI7m=tn_Z%lm#\\r%]hJtKP2BnF9I`%j>!kq$dY6V4)^_42R73p+$[!F+_=Tf\6p0TQ:GqnjMhn$-.lhns&82^#Y6uF&EuL1lb2e>2+l4U1Cs+n/'D#GM\r%3-mUq(lO5'ma;t93d=+,&J&6g_eeR\jH13rW3Yh;M23dd>HLO?<W'C1iiZdK5BF!eY:'3D,U(i-PaC!pn:<?eK"FT`:SRgJq*Qu3\r%o_]lA+ULa?Th.TALM2jtAVDCA2-``d-]@qL!g/$ZH3TN/O@2kE16=n"+YrP?.][f';T#V]U8JQ"4<`B?:>cFY\b>sdOTSDO<$=VC\r%6'q.q2p2kjR*Y)S,mcsr:\7=(RO8dtPb?6ui,5.='1Hn'GK@Q54a4tqLn^gH(l4pL%N1'hPuU4,WSpID.%f,HCQaG]7+&>rgkR;d\r%oH+02o^j:/:In>O'CYY(@Yp\56aO^sbMs"ok]L[E0+T$N65la0X!Y$HLnD5dDa'n:.AA3cckOm6KP66>TWiu&T7X[(@WE=W$[G)D\r%MWf=QmR%RLmDhI(4`AD,&ZVq,Le/&BXsH7:KWRfc1/LBb*-*-Yk_VM.Np*H0#*)Mk'hM)6\.q[/'HEPfH5;PtBL43#Y$X>4+:;hT\r%0!/=U*Dq2F6C_kjY>-'H?5MlS,nBH!2hAgc@]@`&Pcd&=aIgh]L,62b(qg>n_E;T1>Y^51de:3k@A9@2W9qKq$2Dq<BjWOiS5sU<\r%oGf;:)7Xl&YO%*.8V#\(S<t3uEAE5MVP=[?MJ!?m>cNDTrYL,73BJ!EEEfDPL#nFj%dMGPh,19/1::g1Q2h,u$OH@rFMIsXmMWp3\r%O9fp-c3s]I5aMe5OYKho&dDU((h8>O=E6-6f!Vr<TgX3#h0oiA^;*-s0ZS)e1grQcUR0;u;&D$J91#KB0m)F_@>4"2=L7/BHrVqj\r%[]`G.U)F&bg!#34Adp0dQeS*kZ-eA]ZBb%dI3i@Wb>g-TVO]9L!->kl%<E*(R'^MD^chJdap4.qN=h(tCUmgrbcEtm<Z%Sp@Dq5N\r%\'Z-kl6=dkUXKK+V)E+-q4.U'RPA)S`"6NoBWiC>*U7MN]>LH_GG5NUb</g?S!\?"N>9WH?^8PCcWj\l,EL='TAnh-7`X)qPEeXV\r%!7,)q\ppC*3L0o.@#6*SrgnS]^D3S*ocf(XpEO3t^lslY`0\-p?[IuK^Y>A;qn4&)bRaK5B#!*$T`#J;dd21)Q=dnd\%LCDl!9bV\r%?N8G[s)&@r7aGrodltq1?=s2A?^]&h4sk*LSdGh7A1!Zf7Z6<SURhe?6^"Fd9T\+KVST*@Js-OZRE/m*mOM6`p6)fC:[%B6I\5Wf\r%;'7a$*QH>o2pQG226;sA<.\4G-"tF-eRIX/YqST^TZuL+,qH_6<F\[k1JDj)Wi!<Fh2$olQo-N?6uh2'/=00ASl`"H(oEZuUkFhk\r%f/C`>[(,$N-R%&i:$8;P]kd#tqgEr1R!g,qlpH_b(eG,Mb93*f.,uip;;ThF9=>u<c:7mg%SpNNnn&m`[bC^s*3Y0D]9Qnb6>V"X\r%]&gGoi\VAnPVBS#U*>T=,^2YELdm>[BZ.>NmYEV-&V`6..N0M4]lKP%da'(6W/qS(MQi3[OV#4\i6++%75T`q2$Hi!nm&<G$=[O%\r%9QFj32m/L1(.]lV9gJ>&[AV(k(V`D)710!ln$CK(`ak5oq3$4Z1Yp93+F_7gOSo2M6M;'onq)AW9Ubc`GLF]Z3u"tbi)6$BDPohp\r%#M_qXhs4C5q/4gTB)e]KC%co097-QJ*DH>WG.X.8XmU?fo5FU!*;>pSigU4:b_Jks#A3IBB'EbdPL@p$KeAdc7p#J#nR6ml:[rUq\r%T19,2/sBX=oCGNW[uhqi%qF_j(jHMWr6nN[Z.$9d3-V>4'_T>BgX0XCi8oilN3S`nTU7L_0igai-YH>R2UX$6(TOQeI(idT.6orD\r%$$&?61b^pK$-k.d2o3!5pmC>kDA#e&Q#%EN:3tUV["bW&,0nU=/c5r]rVRB_b_bQ"o>?fS0AG\59gN5JS9q321ur@GEU"],o0gR*\r%jZ&!d'2aWNV\Ru;D-tV<#]'OVar!A(7&0s1Yu48Pj@%M]Jt.YhBU>8^a2lDJ>f!3mj@#6<cWLGGHFZ0dU3ANeKMUc!'NF6`Pjs-H\r%T"CTA&E`0&(SR-<-Xpk@)Nl0D(g'$&S5sU\P__[Cp#Llq(C@[cM^0V.d#O^qE+k$"pDGGb9#G)5oTY/XUe"'7:u9I#b_YKJkO_XW\r%1Es^9iY=j9%N,i^eJStXV,Rq:=32!9TX''jL^8)+UBOTklAUO,!fQ>Ql80aFY_fMZ[9_Xq+8uRP]SX?]jE6M?peX^R4YIOhag>#F\r%)X;$Nc\\T5V32KhcUoQ">as*bI$`2s8PV\05mgoG6Tq9>mNBW.W-_'U,3g4qYMdh=EqT#=X35Q.l4-_UOq*Y>L:W.d:.3o(OqU]:\r%d%l8/H`2<-4<BLfIG8::]Q>^.g9lE&.77aHeYAQ7reLb3"N<U"p\9Mps*39n5PQ>aHleJYRf2u17>!n!\,_AmMje=M<3p@l^Q(J_\r%Zm=5'4`pp,;!e5&Q`Kq3]\DmoQfL*-aST_d*71G@g&CMZ*D2>V8Ib2YI;]5Y8F+DlGI(gd$1=h#Rn=+!0Nq'R9<qZeH#;24A!Sb7\r%</,<V\,&i7;r2\+cW%jdMmpsX<DD%Q0NUQO#UVJZY+QSH-_O$3<^ZMV;:lIJTSC<WN:092L1Z'r,[D0d:8-b>Jo3GNW/<#[U%(HL\r%9RoQ<]+2tQcPtL*_S!e9Km8#V8$D>`Qqfk<`#FbR9FpHZV2!u`<-[o`)HtLu%qQ4Er,Z&ZSQ%>j'on?@S],,rc+dX=%_>GQ"4sM]\r%FQGIqL1ZF+1tD/%)P="`Vb.=XPWgRh/@3=<+o,[J6/JdInk!e]GR9j6RN54,<t4$Z-L;jW,6KZJ"*Ut;Su#+BNu^=e#ZK/@bmk6D\r%=#0a"]<DAq.9=)q7^E2o8>S#/JK7]m`=A(M/nBb8KB.*/H5:u'_^2s#=L/,-C2ft+gkZuT8T_YA-ANFH"Cd>05RsfmE5T<dXf*E(\r%b&Jr#)IS^!aET<2$-XN7.p(WEOVbNIR'Bd1(3CuYjOkTr6!j?!3'+naR8VbuSXI>&QoV#*UclB-)@_M])mGeJ-JK@"nNop:Z+<$J\r%`X<A3BgV(+I<Yd^`7LGm?AQV0gK-6cW3V9s-8f&N$g/jT%,$;WQa#V+N8*94j6LQ,!LlL/Xpi71;rJ[&#%GqjKc)3pgkm$>/3gsQ\r%*2k#i<#Xk"5CjbQjiZHg3jOBQT.2GV@WqP"[`CBbIU7OH@0`/Y57.b6'K]iMQ%%L/;HP.G0mj(HZbt+T>`7580:&B+XaqLu$]jMP\r%]b*>:LDR.l0X='Sjl)3B,<Mj0MB+$$>fdI'-f]f@#W?dcKk?+/iJ$7L_gU/<P=l^EpP3F*W-F:+mrKn#ct.nO-8jS9*@bY:UDlZ:\r%45atfQEEb=JK7_Ob23RfZ@cna.P9kNm-s6Vk8u@W?BT"K^L[s_RV@IO%VY!9J.WdY]r=krg9_5mp"@8'h.g%=]aPD5bW)8c$$]lU\r%igl_PU0oDj$u(C[!_3GnIGWQu%m_lQ]XES*@Xn_5;66"0:@2tcAgLOfISRiCGR%0kKf<UP4iL'/\udF5IhP:q>;2@%N79P5rJfB^\r%2<.%q=EDpO<nCGVCF.:Rl]+#NWKE$S7"#?$m/pWcKp]+l2_7k3bf6bW^9.ahBRgg8_ZN3A]ZH!b8uk4EKk8hI%A7>Jr[D*Xr>^TZ\r%,13/_<mRr^p]%^hJ[l,DU'PnkE6Lo3pc41`%1'j=Ck8$pVTZltJs9H'.l:M)AOSgnG-eV.Mdk2Ra<6GK:5hW*(u*oLDE*$,W!Xg"\r%GABg@!*JUTd2;e]Z<7QMZ["&mf5qI(J?e`a*AF"\=\$%a)DV'DD=dmqW`XU]H:.XC9t:E5MZqrE^KnDNN3J\up<GC'O[6Y:[Ip6H\r%N9rN(.d@]OCI=`_q9gQDDDJi+iMQ+"diO+Im@;jshEHSB#CPM$GuAkVB-S8M67p21+7_)L:Zjopn,m!Mljrk'ZCcB)2uGaEd`co^\r%P@hSaT:l,`O4)6rq\6>#i)Q6EDSOWdGC,VlqlbE@Zet.UgABdn?eS#Tf>Ft6Fg$joJ*IiI=Q*&tPNPcK5_UhY#289O<k6HVkokTt\r%L7/;NH@]Lp#/8jL9%Y>oAm=j'<#S6Ad]#(SpGS:kjk'B/\sIe>m4T73bt^6!7d@\K?p6r%#O`NdIaKj(cM)n^"<'_dMdGaHmphG4\r%#0^"g`)us]%Ng9=;C)r?!1I#5+D%1O$L[Qn'dCFch`/.#i+O@8UG/QbAjop_+lHd/!7.gq"#%.%^`#:ZG.X;WHZl9C<l27%ko)ni\r%VJ)d<Q$lDC\C^'>Qp1_O4LUu._!>d`Hf2SpR#+2Ws!Ui9o[S8f5kc]EMaQ<&Nb"qaDZ9tkPcan<K6CEq!$`kOGYTd!Qh2n<@L@A3\r%FmPiU=hmlD0m$8_f67hVSTn@gBLfm$ntqGlfYAF8'M8nQN`QZ(<0'kGS/s)lkV,g['jR`ObHj8Mf>L48lsWq$nb6\n^genkVNU-7\r%0S2J'$<.*XS]E0a]nSPICM<9#=S?-q6,mUrT"<j;mCs?M/'J0Jd^8p)<1#th=MoopNDtV3/Q9=$JBr05J1f\Lh0Je+l_]>`e!"W.\r%laa!fCF5sq3M'O?\LBb]\RBLsC_K5IPLFaQ9=7._/+(\,YE,9fnBn9$+$nNN:\'5$Hp\//;b@lf./B1<C$;3]"W-p[kHL@c1K2WA\r%+,1gLFA38\]L[S`drc2k;j&5KW8M7mm6BhVRT+6G%o)%Frh5+]9\Nt%^!&X+fCR$=/oqOU_OQYgbT1SsH=#'Un,cpe3f0<D@H.i`\r%O217=QOeeU(pnJ7oLY>?Y^XI]IF"nkSZd).P?@4;K.ER6PrnF&/lW>CT>[d[;r?b`lo2>#%Knts*/k*:6gmP4?q1Ip?nCN?)-&Q<\r%;5rNtW3?-"0u9S0N%XXge"@uQkgcq(U'$@!o9.45<"a4=I2FhoQnFJ@Aj3+M>T*4":Q>_s,p=T:VsUQO8_DFkHWG6=0fbWnE'0a@\r%$)sV`qbWQ;R.ZKW*[Wc".dBY`GnEu^@Fl%$^5eeZ-&d(3F6*#$TV5s-%Y)k=lI(7oV%6'"kN,RWq:qoV;#k@F&ETSI$\^'B:c6JE\r%rI".9;8T%Ze9iFn_V=R6-j)>6Lpg.OKe=m'0ra,(^.9VA$&c5go7^icDo3As)lW!f["Xr$Uo7a\GPbU,KkLiO=`ge')-e>M/*Gg+\r%OXW[gW!a!EQ7:8.K[\i.Gj;-=8e\.k6F;E7.28dA6.IYZG;D\AP7DJ]g/'SZW"![_'VZ>l9He.<bnRaj0ZBiB9:=epRsUFS:c!g(\r%%<',uU(u0W+_jA='rn@pMFe8d+q)fcBsJ<;h\g7(C0(fdkf=R?KrVMQMtu@FRj[+Cpj&:A7W57$6I^^X0,1FR6.IYZp[cA-k-Pd"\r%U#la1+5V`*6p7LE6M-&%06C@UMb+AEo#8^2X[IZ;q*O_/\)@]l%r/firLr?]<EAY/UkW+DKdcaR?\fWi%),QG.g?Q,j9sL)<Eda&\r%q;Ob`l9Cj@XUu\Q%u6+e"GiF?h/fT3NFn,lpN_uArW1hi=S*a@m&V&O.I+o%<&MSR"]cK&q'U9(j0Ui[mt*:&`Z_->Uqko_OR@YX\r%<RnW'U`1Z0I$N=qe(opGV\Ru]*pGK;W,"N0aN+E+gd&rH,Bt*F80l'.)[VEDC^B&\V2kM6ep&nA>116UCb*'Hkh.?,ZcTeR5-W<'\r%'np(0ffmbD%l'ROL=+'%4WCj[UY4!.F*i/MS</DX`(7a-@"`d6r>=G;@M#pNKhI60++qs#KmmCebH2WHD^%:`?M+K#isc+-K&ao0\r%V0r1f_BYm\("THHd!%$4M=;HRXbf0mgI"YHis;^Y[%RZ7K.mepVFDJ*);AK!DE)fE[VQtqFe[6ei,*Cm`e'Oi$gO:4.nKs`0:9^-\r%esj'uAoL>Q,7ZCP5J)n[Dci1QN;6Ebd9K"b[%Z;`_P$Yu4jp1cN7mTH2ad'EXfK6#[&6e,ESpBMg4m!Y?[9_nP-,g/Egq?!>(-U'\r%9.$qn[%<<Nn5Ys@aL$G^'^iqm:,$?^h/$H4hVZaL:)sSu#@%Me+)i935B.c`pid4DRI>5@c$HQ,+nGeRUtP3Z,\2A>Pr/BocD9.^\r%Fsh5%h`6p5^=/pcGJDJ'[#\Xf>A7I.:<,-i^985;dMEVM"iu?mThB!F5,U<J;\M?D#f]I%)'?Ot3aL2j^@r!&V).BmjB0=sZl)&j\r%V:4R;b58P+ff5BXpS,uJ"]sSIBIDsr.jGPaLPWju>"H6N\^jUb8R=?_X$D_=+j$u6<t/'KJ9jj]GBYMcA2!hM<H,-[8>M=JNu2W=\r%K+uc0P/*"05maO+,so\'f/G#do+`Do4t_1$7Nl:qqjc5VYF"!tO=h@Y?RT=o64,aZ+h-EX\\(XIN59%JD-@1dbtf[FP/i(XQCF''\r%]nX-++bqZ_aeS8JKeDd;d6S8ek`SHl$3BTN:.3("a%;U`%c]sDQ#SRYiDL\,r#FOA<!N`e46G1*g(MA77gC%[$JF?u3pIjNW2ef^\r%#75;1&Q-0DFc_WL\N.73%T755.TC8FMW4.:ki+2CSVOLjZHI^&%T:VH"^NoAm5d^"1DLq+SskNJ;GU$E/%AWu'n>P<4!f1%*@0j;\r%%MBeWmNE0/l5gQaV!apJ%2X69kE):s8k@c,K!+>^&MiW(&ga@A,*>4W/t1:/E>O$N-iPl\cH/]"pu2)G2+gCbbD^1%QZ2i/nEG#0\r%5gp=Y>RMEYI5or`8KJP=).%h_pBW25D_6r2[8LQlVT<qaBWL+;C.RYcQ:&ZahfAP;7lM#Em#UfH57+UpVS8m9c1!`6q61jE>52',\r%bbH/`UOsPl_W&D$pi:rF+&Jrqb941]X$OoQLTKuH_YB?]%b]716^:'`=CGM<9US@1,W@Qo>bQsNJTue=S5sT?$sGVNAm*WF0[Y89\r%cE/F&a:5en>=HX>V)_WATS;HMqDtVtCP'jO_q4(YL0I*>M5IMOPRPn$#$k\.:XML<&uaM.2AKt7VHZZ@eO&QL$Its`7kBGW&^0.g\r%Lh4sbC9eE$UF$A&.U#Y+bgHB"nZ*8FU4q*-+^2tAOG,)#2-G_N;Nlea.qCB6i)6j?3FH!cOGYSW$$d>mkX%b`'dA=\>bR#^<P7)D\r%MCCq!WL9L('$h[-WEa^t!=,&)aeLJid'Y_#1R7\N2>VBth\Eu%V?rAIC77tt+p:o`*8O=&r`?;`'d9BM#n]M\L*f=.W+eSOOI@Lq\r%=eU[D"]s-j/Aops3_2[Q,(mN99o+O$o7X%b2,EGA655V%DT*<a-Ib^4MSq<L6Ii6o^Hr12:b>YC'tTV\r:2pprOI.CMHWl@L$0O7\r%=X[7sJuW7>mO*p"c,V+[850koK"MOqLk\cjKr?+O=fAVm(6](X-&[u9EJXs!ObIHkmm7d6@+8^1&kG_4\u_"4UkW*9Kh)M-=bn'f\r%%'i^;/,-6oJLjb.<G@/97i%_k;C?f<X#6"<_su_A%:k$THe]g.(!=r"K@o])@'`'`A6<=%)4-AL0%hqg-sF3XqFDd.ODG&@iq_=?\r%/_u=KV\Ru]A/K;bL(7/jh)XRWT+%B\/qlVK"VaJF!`RhlIDa3^V1bn:Nr=sgojMQE?'g3ZHuVN-(%3""5&?9L@mPa$^HB2$NC'h&\r%)O`h764i_?I0<]c'oOc@WjHjc>4F:f0ss1";%it&(3k]ZhC:r&Qo&a$+kfuFD[#sGi&t%a`@jM.6pSt60;=oD;+i<lYlSGYene-e\r%cn14PJ1"bG,AW86cMk3s;[-b0*oN#Y]TnDIi\tA=UCl]gk(7u/(L`FFm^<on1u*(MB(=6abnqQ1hEbsnNF;70(Z0'k(e>5r@QsCA\r%ckoGXhMq(%Qr];$GXH<Ec#+K/5-r8.=i3(QXRRXLeD=<)&8];#^F.#&D*APtI",_?FsGM7b5GLYfW7[%KNJR6.BEu)5#"p$iUajc\r%eQ]q*KU1%.P/7+(L80B[VXVcO^1,F0Q\djm$93aUpa.TLhpZN=\"naWpX/Kd%YX3C]+?fk3KY-U>;t!SpH"IL^=/?(leTj>m.\,U\r%B"m#nOSs'`Z<?X<.W=HV\s6mBgTe,P\(e<tcXF"uBj]n<pG2ckY7qu)G@]B@aQ--j94i[YH5Jmq&CRmLIL8gAeF\f.Yc%#fVLOdJ\r%Q;@O@Cl2?-RP]\;I]q-_Q&fWXSGiOOD1:r50lQZ1DerZ=^PD[&g\fnq<U]O+.JfQ8E4Hm-Eeq=_i6ZrZ3*`S?/@G%K<.c0Rgm`;=\r%,mR/h8G(rLk*#[Pds2@BaBnR#X5I<A4V9lD">;<:\XejZgaWWgk!qS16C.s%n_"\lW_j=1ZH)cP)$Q/9luQ@J]j@lJ,)aG;Wbid\\r%OW>GFOaTW)Y&k=?,>=))0%+XBl\\5N^X&\KZ/?3E:6(sq)K)U3e9rUr8)6ZB?/8"C&ujX5eW79Z!o@ObLn[b-'[]>6OeU!uOYWop\r%;GEte*9)EL'8`V^FDNsN,!.i!,%44WcE<!DH4=ppeaT_u/9hr[mWfK\(9Qr'VOC%=s3kYRlA><+&)c1;hp)=-2i54.<tRI::)1?N\r%HFaD$LY6BC6k7\pY)"'pVsb@*X6"AoKc@'-O[B@&F@c^[4lamV>nK*h:fg$p4Z'.si\('Igp:/r3HUBMQZQ*V1Cd^?'p1j"F[bB<\r%7?\WBm\9/l`F#biB0LG!qU*!rI@ML<bQ_Yj\C]sSmdk`7UI_5oU6eLs'@'BNNo^_Q&0g"AR>M(ZLRD(VC%EKG2L*O$rLDGXDb9"S\r%Sr><>@BUh%9-fY+<ppRsE^'l<s/*N,Jkc,&LA@bndX.JI13p!Xm,2pbCOCf4U(HoFfZh/>7[r4iq[7.0mt(Irj'.YX)H+q_UR&KY\r%dA,\,esTrC6ah`8nJXq`@20eh1m1bSQ-j:=jO!!@L\-sd-Iq#Z4f"`PpM?0PHHLeAG]U"q,$REu+/FtS-g5Kl!?%(>DAA5`KnV3#\r%';]Zug;FJm+c#^+^p@8/VL#%l[Xhe4O[BVT<NC9,_kG8[*/V^&QgM>Wb?_QTM5';W2,Pbu3'is._;.NLX&7&G#rrPc=$kc!.(YL[\r%+H!=T*/HqH<CAR@iDQC03Gc6!+U=b*>0-RP`?o1:GbU*>#G.$OMC.3IDoE>p%&mB=;^S)%'"r2Mp#U`,7<Hr;:fu)`'X@T0i7V!"\r%),a""&RG",.7/U&#0M<#m\Yf48P3'b+:!ef.`hK`6l.Qf'[]pB"%B/oMBXB)>Y,OijGSZ&%!&"sY(O@t7<BF-^_'iX3H0X$X%6\t\r%_l[%8$OSaaFA:a41a/-"f<65U&;@JeQWC4p8ebn5jh^*7bCdE3;%lCM4)1KdTQ#K<T7VEH_Ye-UY-*9pLnZCBmm@dp^c2lo=$R6`\r%TunjZR+-((;4O//X%OQ?U?EN:q[c2_0FgLu7?@UKW3V:/-8jS9.(YdB'1LLtSj=&g\T[r:OTSHOqfHQ&lL0Pg_a2VmXfn$URLdGq\r%X!Ee`<P1MqKcph->24gt48oQBC,dA-g*OCZ.HDXCg?$92U*+0*duTs8&1$Y#K?r/01"*brF)$1`%4&HJ[Y<pS#/Z1DG6e%6%ntI!\r%$N3\$TsG9JBFFn'n23:]rV\B9s52tAD+0WJLjm2<_n>?2L<=:C5"ZrMTtrW(r1F;$P)#<2GAZ^k)umV37-#Yo4(kG&-@:&MA;6l)\r%MS)GiA=Q2>noaOs8'?fP8:An5m`dmtATR*j,0&,g@af"dNK>&+R#a]j>]CPg[h+(kqIH>'"\Q?]P#c*E)m0`\CCCfB0=q6=RRf_:\r%j!)N(6%')3IT`+,(ru)#k+sSZ[EcQ/cZ>7GRPIom\]-+SZVhH+RX9$W@9bjXi25lp`N@EfPV;#N0NY*P]eo_lb,1$2=Bt,Eh3+L?\r%[<$K86b-HtQI=iqV>94+`d3%_7\0!_T5-9HnDdj[=)6YIUi&@JmI4M<@-eL1f%XK-0:m:q]lZq.#eHg:8pf!b"nSRpEBMEmM,5Z(\r%Q:*K7PlkBLa"U&Fis!"T=2ZS(=IEl(VS;o'-.CP8;XYaWe5RSJ28Q!`791GD6,]<ebE`OFonf@sdbu4)nm's'_j1.#9ZZ0>_Y>Xi\r%&MF*@NJ,Ic[ZVm5d`nR%hn>S"q,_A\V>Ta5L!.5?;^pgPD_%[^mZ"'-hn?FfPeV0Y.HU;A04jqPDD5YqmG26oRbYTuN7[nXq2i8/\r%<o,m%*N7=6L1"1/X`MFVBgY^m7(]],dD%#L^FMrrn:=fMj[MG$RB^GK\J\RWk5d8]lup?:&bn=g?Mu!^Hjednee*9F-M:<&85h(U\r%8O[L,QC!L"<)LES6=`7gb?m'REQW'gFOH2I7l(\]B-,;[HpDu%S"gkS/m+3DHT#Y(4UaPolP4[X+$=m=^+Fib3U$:XgC8X4FF!AZ\r%-AVs+<6U&,Pn4Kp5WK6B4Je%Pg4+GdIGij(=>m$+Bab6mTA/j:*G0H8m'Q3Y<K5;^YHhuVg<Q6Xn.Vc_*!YJ,eAbk_^HE"?n83;d\r%j0(KOr_SiG%NA?SURJsOBCsGOM2cpUQ7`W$cY::(/bP/DU+1_]l@j\2qLNRM^:G2V7TA1P;+IMp;5^U8l;<tLRqaeLgR0ILI(G^o\r%NP;D?MYa<@."`&cPeFY5T=sLug5Ji1c!Ke9B!5+9A3)It@Dc#l!``Se@BYj>_Qd3LkNo.`j^hWdOM/5FbpuaRi>Y_g.<Mk2Ic&C2\r%FjHQK=1*1Ncme*kURu;e[.@A,H.r(pg,qOs^eL5@EV*MoF`-M,;cO?i6Dk5gB:nH$lMOXF6Cklk7qhCG)\:=*poA^s'KTf]3r;ke\r%;<P.J+mSu*4[aoUgj"W-iNM[_HG484,TK"nB<bpq9r=ZeXpe!+O@:1>"R#9p6N9#DDA;/=)L\$<(DcoIcI'I`p=F!G_[722bnddi\r%QA2e7#6i)c5+(D>qXgLLYSI05_P+Ilh(tTi)&s1+)Z=("^ZD-`_"T<h9(kQ-oo\f/-k0)Qhhqu\h1Kb(LMtWJdI-:PEnU/7s-('U\r%pZt4j`odT5iiWS*/i+HZcIa7UbQ]+&(ebJko:UsO5umjG3sU@CjpR>`7Jh<V+R"OiU2'uE)KaIe[lO^tnKHPCCJh#rEOGMD2Gf=k\r%#0;_K^%`.<`ICpJeZES7V-DJ9eUUtR#jPH]Y@Z,q;6'$?A7quY3\0R/`M2j\%XGHm:=1/*e.%e.@9GlN_E"#;a-HtfrhUM"%%Xi/\r%chG9)YlcH>57,?_kQ")\Pl^]n)M)]=KT>"g&BFNF%$FdI-'8=jThJJh,68T`#5M$1e7fJ\/=jQSSP>$sHu+6#eu'ad0MJe$F^#sO\r%i4<d@qETC]mgUip"a$%W-AU/i622,sn^Mj#d1TYmOhdB]!9oC%!3l\'#l]>tX-GRJq42Rm&;*rk5kk\T9-tQ"qAZ(6cH5Mpdf'<B\r%-EI9"%4b7K^)#gS;&GP_VMCP5aBWO2+6,H)#*k>hmM#Q29LH-WjVB4Nb>KS\^+14jEC&sq$rXVeM/aEMS7@B2A'tLLC/Hl6"4j,R\r%0.PBf,;1epB;CkDK]qSVerlhn(dV?Z;@BK`TJ[koPoC9eP[!)O/Ic7m0nUX8EJZB@)$2=H3u8Fr<2:5hFLCC8.p#4d7O(I-Bj?%V\r%$'&YWKa5J]).St4)G/Y[/0Wm)!3paT/g2V[mYkBe+.a5K'().2Eo_@.:c<1Xd2"(8K-sT)gs/H_DigLS4?2$r=rb`b3;\Om,19'@\r%jfFjJ,OKlYZ9B;.f;clGH=X*I#AW`YM2jRm2B=O!JY.s>J>*m9b&4#BLO/XZh/@KVKlQeuEJH,Lr-Zem?J[pR_*1tGF4grdBtdHR\r%GcJZ=f8tHKEk=rlB]hX0<8*VY86U9QWC`7Ih.MbKZ4l=G02Xg<67!n5j^D^>"KDUp92:^A45:0;%+X@64/%<Q/4qPSk=Ni&ai`7L\r%S7J^6EO=2>o]?JslI=\/Kc98MMjlSQ4Ngl71lA2@Mh0,-9qLD72Ole0UQ+)#G9Wh6PG[r6[TPD+EajH/G`IBL*CQ(O3ZDJ1+jGB;\r%.j;EZnr0Cud`_t$Z/MN@6_H=jaQlU-FQH2he)\oFK;)YWgifq^;LoFnM<42=p*Nft;JX[?7h$o\)80-:T%8Cq_,$8m&!5'^11C?f\r%G0j]^.jm=o/IQaW7053A2:_1(!4;YjFCIG>SaIea1E]#E:@0k!Oi_SR2D\\uIhM'_n[,b.7&8d>A_s.ON1>U!$BEgP7IS[E"%!Z!\r%BlF(.6ue#QN&WI9GuK=VOnk>H,E_AbBD/0ufg(u>)TboV&hcR,WTijdJV.M%U!XP8Oj;'r9H\s*%Q0PB4-*aA,B0ZN\B!NrdMSJi\r%Bf`C0]Khnen&aO^LQsE!]1eKFGYW?.$u'([':GR-m&\agLl?'=Z@r8+AjT4K@[iJsA'gcKrp.ej3SXeE7Tq)-4H%*U*i&e@qI/:+\r%hp^52`^RZa4*]es)*3$IG4;\ZJ%PT*pQnp5h59F#="0Q8dF#4cS*X4eY<]6>=tASa@h>oYRC!jrPimAK_(Z2KSuK7[=%P@a-^[GO\r%IRCVEg*3tbLm':<^alc%?5b0DCO$Z-L-29i`(cWec3fFk5?6Q,-O\sqj;%.kmB^>=(jHI2Ioc%Wo%ZS<9Q!\oX5Gkrd2L9fg2?!1\r%XfQo8eRr?"'WURPfJTHbE?]7'a.U2al?d\EDm"pE4nS(tn8SlNjR/*MI7E/h/[`IHC#L7@'k-F:5i_[^Y5)rC8!_WhXP^N>&DtL1\r%nG-r0A;",%Z(d]A_CalSmJ1W-`([IbU\klc#<$M_].G"jp$DM(D@:!*A)hF?gVSO>j5_,T\Ljbj@[t_f><$ljNS(&OD./V?j*SMt\r%_VrRmZ\A*WJFp`lMtqf0LEgpmrE9(7G(h"mcL`@r^BO;(*"B=5_I<bkDW6MW3A-uc/1>l!EIl?(I.Y+Tj2*+(kn^Vq>YqK_MIF6^\r%_BDWE=T-6\JIZ'F1YHj.&-M49hpjh*d.&G71O$7l\NoGACrCbS>Sk[&:?"(eF5^f8(sE`^\St1ECNJXH<]q6Oi9JSKNT\/%Z%nb3\r%5&?euC;n*U`IHN&(H1;;3)/2ZRd7i<<lW.dG$W`/QJp?mXKDp9,&]+4=^;gL(f"#cc-:B^_d7jCd]NtIi(?[!4^HT^JK.5fW`JpJ\r%ONPN'M13A*/R9A>15PGPF,-ZN+8[\a7s?G4M5?auk--ScK9`O8+-d^-`_,3VWL)q=)_'Z$/nn6;"h$I60@19"?8$qm$G8[*K;d^D\r%i_,"5IT2uY90"Y5.B^H6CF5s4jZIiXs"mLc]_JRDej*NI2U?Ki'KE"&^WTZ><dDd[+bigr714o=%Z>d1">MKX>J_m7FDqoO=WQ8<\r%O1*.R,D-<A^H.mLRiXB`gG]!+<LuN<a\.j-[=X88T.3l(9u];24C.)2TO6.$aCZs*Jg,-1ZrflF/1hWO"h[=jC^Kdga=H0`jC(tZ\r%.;X@;Jh1hc<r62Q%f&(N4;(`2CGaA'9]*EC.sM5C?t<67H#$ajY9>PUVg0'`b[3f-kt^j$Rh`Sf4OD4&iM;s`@(O57)];FG\O-Bd\r%*0dhMB?f_0j*_V`HjmICLXA&aj!O^&XeWIA9PWA8MHi%D!=gET%h(GK$+N*ti'E!;>[6b&_*JkZK"^rUJbK9+jsDJ83'_a"0B+:8\r%auBNR<j,a%i*A(,>6e5Ke*F13q_oNX"FK\!<4aeHMZ2t;G#NbdR+udYY@#cpGMSK@kp1cWb:WMV<qcX9!ZM_OA<=ZD9lbr&OdCVu\r%7'_slCS$:m@1sViB.RnUSCE10La?MVbt(,_1Jj$/9Is^s/S)+&#;7^F,p=1uoS**);''$a['\9F<.l*1Lk??FAC-caGG6qhPrt$I\r%ZI%6ErtVWjZQg>AZVW$l99Q9s,:Sur2l*4>>i&qJH+*T2@j0dA")3[f`7X'YLS)NI;jEj;^Wsph#5<M*P+%F*hF4^tA&%,Eqhan-\r%%)V"CXV5d3l8cA2(?!*khFrXb_=p>`efJt.(cMK&s#>#c@?PlrV8K\1FIEnhG\Rd@MSQ2Ck,l=jgFUa?4F((Vb_tBc[$DDc'g-.`\r%QhZ2c/j9DbnPcpM,U3:N,3Oa.7R.'`&`Br0lE]"8A$?dLW\jI>$,(V3'Q(i\LW8&/QF&sC6j%=hptRpo(O=23?Hg@!Pi/*l]F)rN\r%#LbaU\$(?aO;DRqNn`1$g%'kjrf-:-j&rGipVXFZNGle.G)Idf[.1%G3%?pj`CoZ]k-)7g6Z=].HLsDV9I&=6ZWGI57U3ac3o^\>\r%9>5SpCO*,E`*.i-qa+F;S63cjc#'5?1;ju_Q$:AA@L?G>V_XW2G,MShh(EQI`cSL:6O$,?'If>6-J`Kfk9Y@YInf?A2H$kd#-5mX\r%a`jOb5j&DXJLFEt!]qiS$c;p\6X1mSW0(Nm!j>=\@Mp`UiIqsr&6uB''[):d3BJ[U6&."KN>0Qt7ge*BMIhT;h[M$#_:=uLMIe%:\r%X%9K(nO8*T`=b^kVjKEX6]0Qq8?iR`W'3Y-A^H')cq(DM"WnF-QD*LllW-Q]%'FbRUf`1KY=Po*C8=u-S5lZC;@Tg3YmacJ2QU"p\r%WEBrd<]UQ'qN^Nl#es^'=g9_72Oj*;d*%C`/(:\%<EQL];0g;`<\-US"#X,\/.Qce@`?L4MTL$B/48pY2cd#]dCa-nXK6!1oi>+0\r%?f%%_]0QcSp2gsm4Y&GDCV=7_kbNFPPns8P-?e8N3oE'f2j'[P<*.nhp^fRIY\r^31jc"-0,98mJqV8D:.5BNTXmtg`J<B+_oeJG\r%:IT$#S@YQJ@(h]b:DkKl%C+$ae>8.EF*k(+<eiRC@r-V-?kqA>mC<\aYTrpBh4Age?'P*Cdr3S0Vq(0[YCsJM=(&ck=2j@[T&Y=5\r%0`07]2B4auJ8=Hkfn,@TCIj/5#A\_Pi'E"0"S`sYnKHPC?g*"5c_dJ+l$p-g'(9)VQ=k+i-FD]b(S-<[k?#5GqA@+aa%miAH.0RR\r%]YO[eGa`"r77Nq"Y$Df]-F=if?9[$/kfBpfhIu/I2.)tmbqN_kbDi.eRgVn#o5[1>9+75TPJUXJ8/sd9J!+>cGD+f;>WE08D2K-I\r%K`]BQ>W>$\bIGr&PBdKd`FioF4UHCt*UN9JH$EKl^RT%RkM$-UY`Wf>A2A8s1dT+)+pV"@W=JP"8[+MpBuc_7?;\DsMs%b)H-,ee\r%IKk5X0J7U[-a'8a*&=*q'GV<.`K_LL-U9;3gHdsjmJ4r:rFMnVcAg!kTpRY1R1rY_j=>IqQ8EJqfLLWuK]LkpQGO!!@hA+`[a+46\r%_[gt[^Ah^<qi@BLEHqMua"Q=uGPCO]TAP-Cr9K^Ds8;ZejmL%<p]#NOJ,f=#lLjpjqChRb^-$k@00e<CrUjOt"[YZCcelG5nP=YE\r%q`f7s2Z!~>\r%AI9_PrivateDataEnd\r
\ No newline at end of file
diff --git a/doc/img/ecore-pos-map.png b/doc/img/ecore-pos-map.png
new file mode 100644 (file)
index 0000000..0093e8c
Binary files /dev/null and b/doc/img/ecore-pos-map.png differ
diff --git a/doc/img/ecore_con-client-server-example.eps b/doc/img/ecore_con-client-server-example.eps
new file mode 100644 (file)
index 0000000..2a5b6eb
--- /dev/null
@@ -0,0 +1,566 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.10.2 (http://cairographics.org)
+%%CreationDate: Wed Jul 13 18:29:06 2011
+%%Pages: 1
+%%BoundingBox: 0 -1 546 666
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+/cairo_eps_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+%%EndProlog
+11 dict begin
+/FontType 42 def
+/FontName /DejaVuSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 1 /uni0053 put
+Encoding 2 /uni0065 put
+Encoding 3 /uni0072 put
+Encoding 4 /uni0076 put
+Encoding 5 /uni0043 put
+Encoding 6 /uni006C put
+Encoding 7 /uni0069 put
+Encoding 8 /uni006E put
+Encoding 9 /uni0074 put
+Encoding 10 /uni0063 put
+Encoding 11 /uni0073 put
+Encoding 12 /uni0020 put
+Encoding 13 /uni0045 put
+Encoding 14 /uni004F put
+Encoding 15 /uni0052 put
+Encoding 16 /uni005F put
+Encoding 17 /uni004E put
+Encoding 18 /uni0056 put
+Encoding 19 /uni0054 put
+Encoding 20 /uni004C put
+Encoding 21 /uni0049 put
+Encoding 22 /uni0041 put
+Encoding 23 /uni0044 put
+Encoding 24 /uni006F put
+Encoding 25 /uni0064 put
+Encoding 26 /uni0028 put
+Encoding 27 /uni0029 put
+Encoding 28 /uni006D put
+Encoding 29 /uni0075 put
+Encoding 30 /uni0061 put
+Encoding 31 /uni002D put
+Encoding 32 /uni003E put
+Encoding 33 /uni0067 put
+Encoding 34 /uni0071 put
+Encoding 35 /uni0062 put
+Encoding 36 /uni0079 put
+Encoding 37 /uni0068 put
+Encoding 38 /uni006B put
+Encoding 39 /uni003A put
+/CharStrings 40 dict dup begin
+/.notdef 0 def
+/uni0053 1 def
+/uni0065 2 def
+/uni0072 3 def
+/uni0076 4 def
+/uni0043 5 def
+/uni006C 6 def
+/uni0069 7 def
+/uni006E 8 def
+/uni0074 9 def
+/uni0063 10 def
+/uni0073 11 def
+/uni0020 12 def
+/uni0045 13 def
+/uni004F 14 def
+/uni0052 15 def
+/uni005F 16 def
+/uni004E 17 def
+/uni0056 18 def
+/uni0054 19 def
+/uni004C 20 def
+/uni0049 21 def
+/uni0041 22 def
+/uni0044 23 def
+/uni006F 24 def
+/uni0064 25 def
+/uni0028 26 def
+/uni0029 27 def
+/uni006D 28 def
+/uni0075 29 def
+/uni0061 30 def
+/uni002D 31 def
+/uni003E 32 def
+/uni0067 33 def
+/uni0071 34 def
+/uni0062 35 def
+/uni0079 36 def
+/uni0068 37 def
+/uni006B 38 def
+/uni003A 39 def
+end readonly def
+/sfnts [
+<00010000000a008000030020636d617001caf26c0000191c0000008e6376742000691d390000
+19ac000001fe6670676d7134766a00001bac000000ab676c7966c667f237000000ac00001870
+68656164f5a8919600001c5800000036686865610cb8067900001c9000000024686d7478b7d2
+14dd00001cb4000000a06c6f63610001e44000001d54000000a46d6178700495067100001df8
+00000020707265703b07f10000001e180000056800020066fe96046605a400030007001a400c
+04fb0006fb0108057f0204002fc4d4ec310010d4ecd4ec301311211125211121660400fc7303
+1bfce5fe96070ef8f272062900010087ffe304a205f00027007e403c0d0c020e0b021e1f1e08
+0902070a021f1f1e420a0b1e1f0415010015a11494189511049500942591118c281e0a0b1f1b
+0700221b190e2d071914222810dcc4ecfcece4111239393939310010e4f4e4ec10eef6ee10c6
+111739304b535807100eed11173907100eed1117395922b20f2901015db61f292f294f29035d
+01152e012322061514161f011e0115140421222627351e013332363534262f012e0135342433
+3216044873cc5fa5b377a67ae2d7feddfee76aef807bec72adbc879a7be2ca0117f569da05a4
+c53736807663651f192bd9b6d9e0302fd04546887e6e7c1f182dc0abc6e4260000020071ffe3
+047f047b0014001b00704024001501098608880515a90105b90c01bb18b912b80c8c1c1b1502
+081508004b02120f451c10fcecf4ecc4111239310010e4f4ece410ee10ee10f4ee1112393040
+293f1d701da01dd01df01d053f003f013f023f153f1b052c072f082f092c0a6f006f016f026f
+156f1b095d71015d0115211e0133323637150e01232000111000333200072e0123220607047f
+fcb20ccdb76ac76263d06bfef4fec70129fce20107b802a5889ab90e025e5abec73434ae2a2c
+0138010a01130143feddc497b4ae9e00000100ba0000034a047b001100304014060b0700110b
+03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc11123930b450139f1302
+015d012e012322061511231133153e0133321617034a1f492c9ca7b9b93aba85132e1c03b412
+11cbbefdb20460ae6663050500000001003d0000047f0460000600fb40270311040504021101
+0205050402110302060006011100000642020300bf0506050302010504000710d44bb00a5458
+b90000004038594bb014544bb015545b58b90000ffc03859c4173931002fec3239304b535807
+1005ed071008ed071008ed071005ed592201408e48026a027b027f02860280029102a4020806
+00060109030904150015011a031a0426002601290329042008350035013a033a043008460046
+0149034904460548064008560056015903590450086600660169036904670568066008750074
+017b037b0475057a068500850189038904890586069600960197029a03980498059706a805a7
+06b008c008df08ff083e5d005d133309013301233dc3015e015ec3fe5cfa0460fc5403acfba0
+000000010073ffe3052705f000190036401a0da10eae0a951101a100ae04951791118c1a0719
+0d003014101a10fcec32ec310010e4f4ecf4ec10eef6ee30b40f1b1f1b02015d01152e012320
+0011100021323637150e01232000111000213216052766e782ff00fef00110010082e7666aed
+84feadfe7a0186015386ed0562d55f5efec7fed8fed9fec75e5fd34848019f01670168019f47
+0000000100c100000179061400030022b7009702010800460410fcec31002fec30400d100540
+05500560057005f00506015d13331123c1b8b80614f9ec00000200c100000179061400030007
+002b400e06be04b100bc020501080400460810fc3cec3231002fe4fcec30400b100940095009
+6009700905015d1333112311331523c1b8b8b8b80460fba00614e900000100ba00000464047b
+001300364019030900030e0106870e11b80cbc0a010208004e0d09080b461410fcec32f4ec31
+002f3ce4f4c4ec1112173930b46015cf1502015d0111231134262322061511231133153e0133
+32160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef00010037
+000002f2059e0013003840190e05080f03a9001101bc08870a0b08090204000810120e461410
+fc3cc4fc3cc432393931002fecf43cc4ec3211393930b2af1501015d01112115211114163b01
+152322263511233533110177017bfe854b73bdbdd5a28787059efec28ffda0894e9a9fd20260
+8f013e00000000010071ffe303e7047b0019003f401b00860188040e860d880ab91104b917b8
+118c1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30400b0f1b101b801b
+901ba01b05015d01152e0123220615141633323637150e0123220011100021321603e74e9d50
+b3c6c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2baa2424013e010e01
+12013a2300000001006fffe303c7047b002700e7403c0d0c020e0b531f1e080902070a531f1f
+1e420a0b1e1f041500860189041486158918b91104b925b8118c281e0a0b1f1b0700521b080e
+07081422452810fcc4ecd4ece4111239393939310010e4f4ec10fef5ee10f5ee121739304b53
+5807100eed111739070eed1117395922b2002701015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c
+3b093b0a3b0b3b0c0b200020012402280a280b2a132f142f152a16281e281f29202921242786
+0a860b860c860d12000000010202060a060b030c030d030e030f03100319031a031b031c041d
+09272f293f295f297f2980299029a029f029185d005d7101152e012322061514161f011e0115
+140623222627351e013332363534262f012e01353436333216038b4ea85a898962943fc4a5f7
+d85ac36c66c661828c65ab40ab98e0ce66b4043fae282854544049210e2a99899cb62323be35
+3559514b50250f2495829eac1e000000000100c90000048b05d5000b002e4015069504029500
+81089504ad0a05010907031c00040c10fcec32d4c4c431002fececf4ec10ee30b21f0d01015d
+132115211121152111211521c903b0fd1a02c7fd3902f8fc3e05d5aafe46aafde3aa00000002
+0073ffe305d905f0000b00170023401306951200950c91128c1809190f33031915101810fcec
+fcec310010e4f4ec10ee300122001110003332001110002720001110002120001110000327dc
+fefd0103dcdc0101feffdc013a0178fe88fec6fec5fe870179054cfeb8fee5fee6feb8014801
+1a011b0148a4fe5bfe9efe9ffe5b01a40162016201a50000000200c90000055405d50013001c
+00b14035090807030a061103040305110404034206040015030415950914950d810b04050603
+1109001c160e050a191904113f140a1c0c041d10fcec32fcc4ec1117391139393931002f3cf4
+ecd4ec123912391239304b5358071005ed071005ed1117395922b2401e01015d40427a130105
+0005010502060307041500150114021603170425002501250226032706260726082609201e36
+01360246014602680575047505771388068807980698071f5d005d011e01171323032e012b01
+112311212016151406011133323635342623038d417b3ecdd9bf4a8b78dcca01c80100fc83fd
+89fe9295959202bc16907efe68017f9662fd8905d5d6d88dba024ffdee87838385000001ffec
+fe1d0414feac0003000fb500a90100020410c4c43100d4ec30011521350414fbd8feac8f8f00
+0000000100c90000053305d500090079401e071101020102110607064207020300af08050601
+07021c0436071c00040a10fcecfcec11393931002f3cec323939304b5358071004ed071004ed
+5922b21f0b01015d40303602380748024707690266078002070601090615011a064601490657
+01580665016906790685018a0695019a069f0b105d005d13210111331121011123c901100296
+c4fef0fd6ac405d5fb1f04e1fa2b04e1fb1f000100100000056805d5000600b7402704110506
+050311020306060503110403000100021101010042030401af0006040302000505010710d4c4
+173931002fec3239304b5358071005ed071008ed071008ed071005ed5922b2500801015d4062
+00032a03470447055a037d038303070600070208040906150114021a041a052a002601260229
+042905250620083800330133023c043c05370648004501450249044905470659005606660269
+0469057a0076017602790479057506800898009706295d005d21013309013301024afdc6d301
+d901dad2fdc705d5fb1704e9fa2b0001fffa000004e905d50007004a400e0602950081040140
+031c0040050810d4e4fce431002ff4ec3230014bb00a5458bd00080040000100080008ffc038
+11373859401300091f00100110021f071009400970099f09095d03211521112311210604effd
+eecbfdee05d5aafad5052b00000100c90000046a05d500050025400c0295008104011c033a00
+040610fcecec31002fe4ec304009300750078003800404015d133311211521c9ca02d7fc5f05
+d5fad5aa000100c90000019305d50003002eb700af02011c00040410fc4bb0105458b9000000
+403859ec31002fec3001400d30054005500560058f059f05065d13331123c9caca05d5fa2b00
+000200100000056805d50002000a00c2404100110100040504021105050401110a030a001102
+0003030a0711050406110505040911030a08110a030a42000307950103810905090807060403
+02010009050a0b10d4c4173931002f3ce4d4ec1239304b5358071005ed0705ed071005ed0705
+ed071008ed071005ed071005ed071008ed5922b2200c01015d40420f010f020f070f080f0058
+00760070008c000907010802060309041601190256015802500c67016802780176027c037204
+7707780887018802800c980299039604175d005d090121013301230321032302bcfeee0225fe
+7be50239d288fd5f88d5050efd1903aefa2b017ffe810000000200c9000005b005d500080011
+002e4015009509810195100802100a0005190d32001c09041210fcecf4ec113939393931002f
+ecf4ec30b2601301015d0111332000111000212521200011100029010193f40135011ffee1fe
+cbfe42019f01b20196fe68fe50fe61052ffb770118012e012c0117a6fe97fe80fe7efe960000
+00020071ffe30475047b000b0017004a401306b91200b90cb8128c1809120f51031215451810
+fcecf4ec310010e4f4ec10ee3040233f197b007b067f077f087f097f0a7f0b7b0c7f0d7f0e7f
+0f7f107f117b12a019f01911015d012206151416333236353426273200111000232200111000
+027394acab9593acac93f00112feeef0f1feef011103dfe7c9c9e7e8c8c7e99cfec8feecfeed
+fec70139011301140138000000020071ffe3045a06140010001c003840191ab9000e14b90508
+8c0eb801970317040008024711120b451d10fcecf4ec323231002fece4f4c4ec10c4ee30b660
+1e801ea01e03015d0111331123350e0123220211100033321601141633323635342623220603
+a2b8b83ab17ccbff00ffcb7cb1fdc7a79292a8a89292a703b6025ef9eca86461014401080108
+014461fe15cbe7e7cbcbe7e7000100b0fef2027b0612000d0037400f069800970e0d07000312
+0600130a0e10dc4bb0135458b9000affc038594bb00f5458b9000a00403859e432ec11393931
+0010fcec300106021514121723260235341237027b86828385a0969594970612e6fe3ee7e7fe
+3be5eb01c6e0df01c4ec000100a4fef2026f0612000d001f400f079800970e0701000b120413
+08000e10dc3cf4ec113939310010fcec301333161215140207233612353402a4a096959596a0
+8583830612ecfe3cdfe0fe3aebe501c5e7e701c20000000100ba0000071d047b0022005a4026
+061209180f00061d07150c871d2003b81bbc19100700110f0808065011080f501c18081a4623
+10fcec32fcfcfcec11123931002f3c3ce4f43cc4ec32111217393040133024502470249024a0
+24a024bf24df24ff2409015d013e013332161511231134262322061511231134262322061511
+231133153e01333216042945c082afbeb972758fa6b972778da6b9b93fb0797aab03897c76f5
+e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae67627c000000000200aeffe30458047b
+00130014003b401c030900030e0106870e118c0a01bc14b80c0d0908140b4e020800461510fc
+ecf439ec3231002fe4e432f4c4ec1112173930b46f15c01502015d1311331114163332363511
+331123350e0123222601aeb87c7c95adb8b843b175c1c801cf01ba02a6fd619f9fbea4027bfb
+a0ac6663f003a8000002007bffe3042d047b000a002500bc4027191f0b17090e00a91706b90e
+1120861fba1cb923b8118c170c001703180d09080b1f030814452610fcecccd4ec3232113939
+31002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d301e301f3020302130223f2740
+1d401e401f402040214022501d501e501f50205021502250277027851d871e871f8720872185
+229027a027f0271e301e301f30203021401e401f40204021501e501f50205021601e601f6020
+6021701e701f70207021801e801f80208021185d015d0122061514163332363d01371123350e
+01232226353436332135342623220607353e0133321602bedfac816f99b9b8b83fbc88accbfd
+fb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa6661c1a2bdc0127f8b2e2eaa
+2727fc000001006401df027f028300030011b6009c020401000410dccc310010d4ec30132115
+2164021bfde50283a400000100d9005e05db04a60006004f402b069c0006030403059c040403
+009c010201069c05060202014206050302000504a801a7070602240400230710fc3cec393100
+10f4ec1739304b5358071008ed071004ed071004ed071008ed592213350115013501d90502fa
+fe040603f0b6fe2fa6fe2fb6016d000000020071fe56045a047b000b0028004a4023190c1d09
+12861316b90f03b92623b827bc09b90fbd1a1d261900080c4706121220452910fcc4ecf4ec32
+3231002fc4e4ece4f4c4ec10fed5ee1112393930b6602a802aa02a03015d0134262322061514
+1633323617100221222627351e013332363d010e0123220211101233321617353303a2a59594
+a5a59495a5b8fefefa61ac51519e52b5b439b27ccefcfcce7cb239b8023dc8dcdcc8c7dcdceb
+fee2fee91d1eb32c2abdbf5b6362013a01030104013a6263aa0000020071fe56045a047b000b
+001c003e401b03b90c0f09b91815b80f8c1bbd19bc1d180c06081a47001212451d10fcecf4ec
+3232310010e4e4e4f4c4ec10c6ee304009601e801ea01ee01e04015d01141633323635342623
+2206010e012322021110003332161735331123012fa79292a8a89292a702733ab17ccbff00ff
+cb7cb13ab8b8022fcbe7e7cbcbe7e7fdae646101440108010801446164aaf9f60000000200ba
+ffe304a40614000b001c0038401903b90c0f09b918158c0fb81b971900121247180c06081a46
+1d10fcec3232f4ec31002fece4f4c4ec10c6ee30b6601e801ea01e03015d0134262322061514
+16333236013e01333200111002232226271523113303e5a79292a7a79292a7fd8e3ab17bcc00
+ffffcc7bb13ab9b9022fcbe7e7cbcbe7e702526461febcfef8fef8febc6164a806140001003d
+fe56047f0460000f018b40430708020911000f0a110b0a00000f0e110f000f0d110c0d00000f
+0d110e0d0a0b0a0c110b0b0a420d0b0910000b058703bd0e0bbc100e0d0c0a09060300080f04
+0f0b1010d44bb00a544bb008545b58b9000b004038594bb0145458b9000bffc03859c4c41117
+39310010e432f4ec113911391239304b5358071005ed071008ed071008ed071005ed071008ed
+0705ed173259220140f0060005080609030d160a170d100d230d350d490a4f0a4e0d5a095a0a
+6a0a870d800d930d120a000a09060b050c0b0e0b0f1701150210041005170a140b140c1a0e1a
+0f2700240124022004200529082809250a240b240c270d2a0e2a0f2011370035013502300430
+05380a360b360c380d390e390f30114100400140024003400440054006400740084209450a47
+0d490e490f40115400510151025503500450055606550756085709570a550b550c590e590f50
+1166016602680a690e690f60117b08780e780f89008a09850b850c890d890e890f9909950b95
+0c9a0e9a0fa40ba40cab0eab0fb011cf11df11ff11655d005d050e012b01353332363f010133
+09013302934e947c936c4c543321fe3bc3015e015ec368c87a9a488654044efc94036c000000
+000100ba000004640614001300344019030900030e0106870e11b80c970a010208004e0d0908
+0b461410fcec32f4ec31002f3cecf4c4ec1112173930b2601501015d01112311342623220615
+11231133113e013332160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870614
+fd9e6564ef00000100ba0000049c0614000a00bc402908110506050711060605031104050402
+11050504420805020303bc009709060501040608010800460b10fcec32d4c4113931002f3cec
+e41739304b5358071004ed071005ed071005ed071004ed5922b2100c01015d405f04020a0816
+02270229052b0856026602670873027705820289058e08930296059708a3021209050906020b
+030a072803270428052b062b07400c6803600c8903850489058d068f079a039707aa03a705b6
+07c507d607f703f003f704f0041a5d71005d1333110133090123011123bab90225ebfdae026b
+f0fdc7b90614fc6901e3fdf4fdac0223fddd000200f0000001c3042300030007001c400e0683
+04a60083020501030400180810fc3cec3231002fecf4ec303733152311331523f0d3d3d3d3fe
+fe0423fe00000000000200030000000000140001000000000034000400200000000400040001
+0000f027ffff0000f000ffff10000001000000000006005a0000000000280000000100020003
+000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016
+001700180019001a001b001c001d001e001f0020002100220023002400250026002700000135
+00b800cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb
+0189022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f40154
+00b4009c01390114013907060400044e04b4045204b804e704cd0037047304cd046004730133
+03a2055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df
+03cd03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd
+009a009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f6
+00830354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a4
+00b4009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b806140723
+01d300b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f01390114
+01390360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e9
+04600762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389
+008f007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae
+00b2002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd0344
+0029006604ee00730000140000960000b707060504030201002c2010b002254964b040515820
+c859212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b
+0559b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508
+e12d2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d
+2c45442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d000001
+0000000251eb321e59865f0f3cf5001f080000000000c896fa5500000000c896fa55f7d6fcae
+0d72095500000008000000010000000000010000076dfe1d00000de2f7d6fa510d7200010000
+000000000000000000000000002804cd00660514008704ec0071034a00ba04bc003d05960073
+023900c1023900c1051200ba0323003704660071042b006f028b0000050e00c9064c0073058f
+00c90400ffec05fc00c90579001004e3fffa047500c9025c00c905790010062900c904e50071
+05140071031f00b0031f00a407cb00ba051200ae04e7007b02e3006406b400d9051400710514
+0071051400ba04bc003d051200ba04a200ba02b200f000000000000000440000013c00000210
+00000280000003a40000043c00000478000004c800000540000005bc00000654000007b40000
+07b400000814000008a0000009b4000009e000000a8800000b6800000bd800000c1c00000c64
+00000d6000000de000000e8400000f1c00000f8c00000fe4000010a80000112c000012580000
+1284000012fc000013c400001464000014fc000016c800001740000018300000187000010000
+00280354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa14
+03f92503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03
+ee9603ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105
+e45303e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9
+bb03d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03
+cffe03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03
+c3fe03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8
+b7bb05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2
+fe03b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105
+a9fa03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a09603
+9ffe039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe039796
+0d0597fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d
+0590bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a
+410389880b05891403880b03878625058764038685110586250385110384fe038382110583fe
+0382110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe03
+79fe03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21
+036bfe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a
+0360fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe035554
+150555420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe03
+4d10034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe034696034596
+0344fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c
+3b0d053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003
+350b03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09
+032c32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03
+250b0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142
+051cfe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314
+fe0313fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110
+050c16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d
+0503fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b1d00>
+] def
+/f-0-0 currentdict end definefont pop
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 -1 546 666
+%%EndPageSetup
+q 0 -1 546 667 rectclip q
+0 665.925 546 -666 re W n
+0 g
+0.663875 w
+0 J
+0 j
+[] 0.0 d
+4 M q 1 0 0 -1 0 665.924988 cm
+0.332 0.91 92.867 57.141 re S Q
+BT
+16 0 0 16 20.902991 631.872559 Tm
+/f-0-0 1 Tf
+<010203040203>Tj
+ET
+q 1 0 0 -1 0 665.924988 cm
+452.164 0.34 92.867 57.141 re S Q
+BT
+16 0 0 16 472.736133 632.443994 Tm
+/f-0-0 1 Tf
+<050607020809>Tj
+ET
+1.029478 w
+[ 4.117912 4.117912] 0 d
+q 1 0 0 -1 0 665.924988 cm
+41.453 63.719 m 41.453 665.922 l S Q
+[ 4.117912 4.117912] 0 d
+q 1 0 0 -1 0 665.924988 cm
+500.469 61.043 m 500.469 663.246 l S Q
+BT
+12.8 0 0 12.8 47.919678 528.919275 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020b0c>-1<0d>-1<05>-1<0e0f0d>-1<1005>-1<0e11100d>-1<12
+0d>-1<11131005>-1<14150d>-1<1113101617>1<17>]TJ
+ET
+BT
+12.8 0 0 12.8 44.687207 414.165955 Tm
+/f-0-0 1 Tf
+[<020a>-1<18>1<03>20<02100a>-1<18>1<08>-1<100a>-1<0607>1<0208>-1<09>-1<10
+0b0208>-1<191a>-1<1b>]TJ
+ET
+BT
+12.8 0 0 12.8 46.65733 249.188416 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020b0c>-1<0d>-1<05>-1<0e0f0d>-1<1005>-1<0e11100d>-1<12
+0d>-1<11131005>-1<14150d>-1<11131017>18<16>78<13>78<16>]TJ
+ET
+BT
+9.6 0 0 9.6 205.503491 441.642078 Tm
+/f-0-0 1 Tf
+[<0a>-1<18>1<1c>-1<1d>-1<08>-1<07>1<0a>-1<1e>-1<090718>1<08>-1<0c>-1<0b
+0203>-1<040203>-1<0c>-1<1f200c>-1<0a>-1<06>1<070208>-1<09>]TJ
+ET
+0.8 w
+[] 0.0 d
+q 1 0 0 -1 0 665.924988 cm
+43.879 280.043 m 493.195 280.043 l S Q
+485.195 385.882 m 481.996 382.683 l 493.195 385.882 l 481.996 389.081 l 
+h
+485.195 385.882 m f*
+0.8 w
+q -1 0 0 1 0 665.924988 cm
+-485.195 -280.043 m -481.996 -283.242 l -493.195 -280.043 l -481.996 
+-276.844 l h
+-485.195 -280.043 m S Q
+0.701961 g
+0.8 w
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+44.688 81.246 451.738 75.961 re S Q
+0 g
+BT
+9.6 0 0 9.6 205.503491 590.33656 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<090c>-1<0a>-1<18>1<08>-1<08>-1<020a>-1<09>-1<07>1<08>-1<21
+0c>-1<18>1<08>-1<0c>-1<0b0203>-1<040203>]TJ
+ET
+BT
+9.6 0 0 9.6 207.119751 293.639929 Tm
+/f-0-0 1 Tf
+[<0a>-1<18>1<1c>-1<1d>-1<08>-1<07>1<0a>-1<1e>-1<090718>1<08>-1<0c>-1<0a>-1<06>1<07
+0208>-1<090c>-1<1f200c>-1<0b0203>-1<040203>]TJ
+ET
+0.800568 w
+[] 0.0 d
+q 1 0 0 -1 0 665.924988 cm
+494.324 441.785 m 44.367 441.785 l S Q
+52.375 224.14 m 55.574 227.343 l 44.367 224.14 l 55.574 220.941 l h
+52.375 224.14 m f*
+0.800568 w
+q 1 -0.000000000000000122 -0.000000000000000122 -1 0 665.924988 cm
+52.375 441.785 m 55.574 438.582 l 44.367 441.785 l 55.574 444.984 l h
+52.375 441.785 m S Q
+BT
+12.8 0 0 12.8 46.506689 86.755847 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020b0c>-1<0d>-1<05>-1<0e0f0d>-1<1005>-1<0e11100d>-1<12
+0d>-1<11131005>-1<14150d>-1<111310170d>-1<14>]TJ
+ET
+0.701961 g
+0.8 w
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+44.281 227.516 451.742 75.965 re S Q
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+43.477 375.402 451.738 75.961 re S Q
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+43.477 531.371 451.738 75.961 re S Q
+0 g
+BT
+9.6 0 0 9.6 233.439209 138.249939 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<090c>-1<1907>1<0b>-1<0a>-1<18>1<08>-1<08>-1<020a>-1<09>-1<07>1<18
+08>]TJ
+ET
+0.8 g
+BT
+12.8 0 0 12.8 319.679053 553.059363 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<090c>-1<03>21<02221d>-1<020b>-1<090b>-1<0c0a>-1<18
+08>-1<08>-1<020a>-1<090718>1<08>]TJ
+ET
+BT
+12.8 0 0 12.8 267.129076 396.28368 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<090c>-1<03>21<020a>-1<020704020b0c>-1<191e09>-1<1e
+0c>-1<0b0208>-1<09>-1<0c23240c>-1<0b0203>-1<040203>]TJ
+ET
+BT
+12.8 0 0 12.8 293.462207 265.367908 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<090c>-1<0b0208>-1<190b>-1<0c191e>-1<091e>-1<0c09>-1<18>1<0c>-1<09
+25>-1<020c>-1<0b0203>-1<040203>]TJ
+ET
+BT
+12.8 0 0 12.8 308.687842 103.743494 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<090c>-1<0a>-1<06>1<180b020b>-1<0c09>-1<25>-1<02
+0c0a>-1<1808>-1<08>-1<020a>-1<090718>1<08>]TJ
+ET
+0 g
+BT
+12.8 0 0 12.8 47.719445 513.461366 Tm
+/f-0-0 1 Tf
+[<0a>-1<1e0606>1<231e>-1<0a>-1<26>-1<0c0a>-1<1e>-1<06>1<06021927>-1<0c
+101e>-1<19191a1b>]TJ
+ET
+BT
+12.8 0 0 12.8 46.103198 232.2349 Tm
+/f-0-0 1 Tf
+[<0a>-1<1e0606>1<231e>-1<0a>-1<26>-1<0c0a>-1<1e>-1<06>1<06021927>-1<0c
+10191e>-1<091e>-1<1a1b>]TJ
+ET
+BT
+12.8 0 0 12.8 46.911322 69.80238 Tm
+/f-0-0 1 Tf
+[<0a>-1<1e0606>1<231e>-1<0a>-1<26>-1<0c0a>-1<1e>-1<06>1<06021927>-1<0c
+101902061a1b>]TJ
+ET
+Q Q
+showpage
+%%Trailer
+count op_count sub {pop} repeat
+countdictstack dict_count sub {end} repeat
+cairo_eps_state restore
+%%EOF
diff --git a/doc/img/ecore_con-client-server-example.png b/doc/img/ecore_con-client-server-example.png
new file mode 100644 (file)
index 0000000..aef949d
Binary files /dev/null and b/doc/img/ecore_con-client-server-example.png differ
diff --git a/doc/img/ecore_con-client-server-example2.eps b/doc/img/ecore_con-client-server-example2.eps
new file mode 100644 (file)
index 0000000..ef3cf7f
--- /dev/null
@@ -0,0 +1,580 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.10.2 (http://cairographics.org)
+%%CreationDate: Wed Jul 13 18:29:14 2011
+%%Pages: 1
+%%BoundingBox: 0 -1 546 666
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+/cairo_eps_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+%%EndProlog
+11 dict begin
+/FontType 42 def
+/FontName /DejaVuSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 1 /uni0053 put
+Encoding 2 /uni0065 put
+Encoding 3 /uni0072 put
+Encoding 4 /uni0076 put
+Encoding 5 /uni0043 put
+Encoding 6 /uni006C put
+Encoding 7 /uni0069 put
+Encoding 8 /uni006E put
+Encoding 9 /uni0074 put
+Encoding 10 /uni0063 put
+Encoding 11 /uni006F put
+Encoding 12 /uni005F put
+Encoding 13 /uni0073 put
+Encoding 14 /uni0028 put
+Encoding 15 /uni0029 put
+Encoding 16 /uni0020 put
+Encoding 17 /uni0045 put
+Encoding 18 /uni004F put
+Encoding 19 /uni0052 put
+Encoding 20 /uni004E put
+Encoding 21 /uni0056 put
+Encoding 22 /uni0054 put
+Encoding 23 /uni0041 put
+Encoding 24 /uni0044 put
+Encoding 25 /uni0064 put
+Encoding 26 /uni006D put
+Encoding 27 /uni0075 put
+Encoding 28 /uni0061 put
+Encoding 29 /uni002D put
+Encoding 30 /uni003E put
+Encoding 31 /uni0067 put
+Encoding 32 /uni004C put
+Encoding 33 /uni0070 put
+Encoding 34 /uni0068 put
+Encoding 35 /uni0062 put
+Encoding 36 /uni0079 put
+Encoding 37 /uni0022 put
+Encoding 38 /uni006B put
+Encoding 39 /uni003A put
+/CharStrings 40 dict dup begin
+/.notdef 0 def
+/uni0053 1 def
+/uni0065 2 def
+/uni0072 3 def
+/uni0076 4 def
+/uni0043 5 def
+/uni006C 6 def
+/uni0069 7 def
+/uni006E 8 def
+/uni0074 9 def
+/uni0063 10 def
+/uni006F 11 def
+/uni005F 12 def
+/uni0073 13 def
+/uni0028 14 def
+/uni0029 15 def
+/uni0020 16 def
+/uni0045 17 def
+/uni004F 18 def
+/uni0052 19 def
+/uni004E 20 def
+/uni0056 21 def
+/uni0054 22 def
+/uni0041 23 def
+/uni0044 24 def
+/uni0064 25 def
+/uni006D 26 def
+/uni0075 27 def
+/uni0061 28 def
+/uni002D 29 def
+/uni003E 30 def
+/uni0067 31 def
+/uni004C 32 def
+/uni0070 33 def
+/uni0068 34 def
+/uni0062 35 def
+/uni0079 36 def
+/uni0022 37 def
+/uni006B 38 def
+/uni003A 39 def
+end readonly def
+/sfnts [
+<00010000000a008000030020636d617001caf26c000019400000008e6376742000691d390000
+19d0000001fe6670676d7134766a00001bd0000000ab676c7966041fef2f000000ac00001894
+68656164f5a8919600001c7c00000036686865610cb8067900001cb400000024686d7478b924
+152200001cd8000000a06c6f63610001e70400001d78000000a46d6178700495067100001e1c
+00000020707265703b07f10000001e3c0000056800020066fe96046605a400030007001a400c
+04fb0006fb0108057f0204002fc4d4ec310010d4ecd4ec301311211125211121660400fc7303
+1bfce5fe96070ef8f272062900010087ffe304a205f00027007e403c0d0c020e0b021e1f1e08
+0902070a021f1f1e420a0b1e1f0415010015a11494189511049500942591118c281e0a0b1f1b
+0700221b190e2d071914222810dcc4ecfcece4111239393939310010e4f4e4ec10eef6ee10c6
+111739304b535807100eed11173907100eed1117395922b20f2901015db61f292f294f29035d
+01152e012322061514161f011e0115140421222627351e013332363534262f012e0135342433
+3216044873cc5fa5b377a67ae2d7feddfee76aef807bec72adbc879a7be2ca0117f569da05a4
+c53736807663651f192bd9b6d9e0302fd04546887e6e7c1f182dc0abc6e4260000020071ffe3
+047f047b0014001b00704024001501098608880515a90105b90c01bb18b912b80c8c1c1b1502
+081508004b02120f451c10fcecf4ecc4111239310010e4f4ece410ee10ee10f4ee1112393040
+293f1d701da01dd01df01d053f003f013f023f153f1b052c072f082f092c0a6f006f016f026f
+156f1b095d71015d0115211e0133323637150e01232000111000333200072e0123220607047f
+fcb20ccdb76ac76263d06bfef4fec70129fce20107b802a5889ab90e025e5abec73434ae2a2c
+0138010a01130143feddc497b4ae9e00000100ba0000034a047b001100304014060b0700110b
+03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc11123930b450139f1302
+015d012e012322061511231133153e0133321617034a1f492c9ca7b9b93aba85132e1c03b412
+11cbbefdb20460ae6663050500000001003d0000047f0460000600fb40270311040504021101
+0205050402110302060006011100000642020300bf0506050302010504000710d44bb00a5458
+b90000004038594bb014544bb015545b58b90000ffc03859c4173931002fec3239304b535807
+1005ed071008ed071008ed071005ed592201408e48026a027b027f02860280029102a4020806
+00060109030904150015011a031a0426002601290329042008350035013a033a043008460046
+0149034904460548064008560056015903590450086600660169036904670568066008750074
+017b037b0475057a068500850189038904890586069600960197029a03980498059706a805a7
+06b008c008df08ff083e5d005d133309013301233dc3015e015ec3fe5cfa0460fc5403acfba0
+000000010073ffe3052705f000190036401a0da10eae0a951101a100ae04951791118c1a0719
+0d003014101a10fcec32ec310010e4f4ecf4ec10eef6ee30b40f1b1f1b02015d01152e012320
+0011100021323637150e01232000111000213216052766e782ff00fef00110010082e7666aed
+84feadfe7a0186015386ed0562d55f5efec7fed8fed9fec75e5fd34848019f01670168019f47
+0000000100c100000179061400030022b7009702010800460410fcec31002fec30400d100540
+05500560057005f00506015d13331123c1b8b80614f9ec00000200c100000179061400030007
+002b400e06be04b100bc020501080400460810fc3cec3231002fe4fcec30400b100940095009
+6009700905015d1333112311331523c1b8b8b8b80460fba00614e900000100ba00000464047b
+001300364019030900030e0106870e11b80cbc0a010208004e0d09080b461410fcec32f4ec31
+002f3ce4f4c4ec1112173930b46015cf1502015d0111231134262322061511231133153e0133
+32160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef00010037
+000002f2059e0013003840190e05080f03a9001101bc08870a0b08090204000810120e461410
+fc3cc4fc3cc432393931002fecf43cc4ec3211393930b2af1501015d01112115211114163b01
+152322263511233533110177017bfe854b73bdbdd5a28787059efec28ffda0894e9a9fd20260
+8f013e00000000010071ffe303e7047b0019003f401b00860188040e860d880ab91104b917b8
+118c1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30400b0f1b101b801b
+901ba01b05015d01152e0123220615141633323637150e0123220011100021321603e74e9d50
+b3c6c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2baa2424013e010e01
+12013a23000000020071ffe30475047b000b0017004a401306b91200b90cb8128c1809120f51
+031215451810fcecf4ec310010e4f4ec10ee3040233f197b007b067f077f087f097f0a7f0b7b
+0c7f0d7f0e7f0f7f107f117b12a019f01911015d012206151416333236353426273200111000
+232200111000027394acab9593acac93f00112feeef0f1feef011103dfe7c9c9e7e8c8c7e99c
+fec8feecfeedfec7013901130114013800000001ffecfe1d0414feac0003000fb500a9010002
+0410c4c43100d4ec30011521350414fbd8feac8f8f0000000001006fffe303c7047b002700e7
+403c0d0c020e0b531f1e080902070a531f1f1e420a0b1e1f041500860189041486158918b911
+04b925b8118c281e0a0b1f1b0700521b080e07081422452810fcc4ecd4ece411123939393931
+0010e4f4ec10fef5ee10f5ee121739304b535807100eed111739070eed1117395922b2002701
+015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c3b093b0a3b0b3b0c0b200020012402280a280b2a
+132f142f152a16281e281f292029212427860a860b860c860d12000000010202060a060b030c
+030d030e030f03100319031a031b031c041d09272f293f295f297f2980299029a029f029185d
+005d7101152e012322061514161f011e0115140623222627351e013332363534262f012e0135
+3436333216038b4ea85a898962943fc4a5f7d85ac36c66c661828c65ab40ab98e0ce66b4043f
+ae282854544049210e2a99899cb62323be353559514b50250f2495829eac1e000000000100b0
+fef2027b0612000d0037400f069800970e0d070003120600130a0e10dc4bb0135458b9000aff
+c038594bb00f5458b9000a00403859e432ec113939310010fcec300106021514121723260235
+341237027b86828385a0969594970612e6fe3ee7e7fe3be5eb01c6e0df01c4ec000100a4fef2
+026f0612000d001f400f079800970e0701000b12041308000e10dc3cf4ec113939310010fcec
+301333161215140207233612353402a4a096959596a08583830612ecfe3cdfe0fe3aebe501c5
+e7e701c20000000100c90000048b05d5000b002e401506950402950081089504ad0a05010907
+031c00040c10fcec32d4c4c431002fececf4ec10ee30b21f0d01015d13211521112115211121
+1521c903b0fd1a02c7fd3902f8fc3e05d5aafe46aafde3aa000000020073ffe305d905f0000b
+00170023401306951200950c91128c1809190f33031915101810fcecfcec310010e4f4ec10ee
+300122001110003332001110002720001110002120001110000327dcfefd0103dcdc0101feff
+dc013a0178fe88fec6fec5fe870179054cfeb8fee5fee6feb80148011a011b0148a4fe5bfe9e
+fe9ffe5b01a40162016201a50000000200c90000055405d50013001c00b14035090807030a06
+1103040305110404034206040015030415950914950d810b040506031109001c160e050a1919
+04113f140a1c0c041d10fcec32fcc4ec1117391139393931002f3cf4ecd4ec12391239123930
+4b5358071005ed071005ed1117395922b2401e01015d40427a13010500050105020603070415
+00150114021603170425002501250226032706260726082609201e3601360246014602680575
+047505771388068807980698071f5d005d011e01171323032e012b0111231121201615140601
+1133323635342623038d417b3ecdd9bf4a8b78dcca01c80100fc83fd89fe9295959202bc1690
+7efe68017f9662fd8905d5d6d88dba024ffdee8783838500000100c90000053305d500090079
+401e071101020102110607064207020300af0805060107021c0436071c00040a10fcecfcec11
+393931002f3cec323939304b5358071004ed071004ed5922b21f0b01015d4030360238074802
+4707690266078002070601090615011a06460149065701580665016906790685018a0695019a
+069f0b105d005d13210111331121011123c901100296c4fef0fd6ac405d5fb1f04e1fa2b04e1
+fb1f000100100000056805d5000600b740270411050605031102030606050311040300010002
+1101010042030401af0006040302000505010710d4c4173931002fec3239304b5358071005ed
+071008ed071008ed071005ed5922b2500801015d406200032a03470447055a037d0383030706
+00070208040906150114021a041a052a002601260229042905250620083800330133023c043c
+053706480045014502490449054706590056066602690469057a007601760279047905750680
+0898009706295d005d21013309013301024afdc6d301d901dad2fdc705d5fb1704e9fa2b0001
+fffa000004e905d50007004a400e0602950081040140031c0040050810d4e4fce431002ff4ec
+3230014bb00a5458bd00080040000100080008ffc03811373859401300091f00100110021f07
+1009400970099f09095d03211521112311210604effdeecbfdee05d5aafad5052b0000020010
+0000056805d50002000a00c2404100110100040504021105050401110a030a0011020003030a
+0711050406110505040911030a08110a030a4200030795010381090509080706040302010009
+050a0b10d4c4173931002f3ce4d4ec1239304b5358071005ed0705ed071005ed0705ed071008
+ed071005ed071005ed071008ed5922b2200c01015d40420f010f020f070f080f005800760070
+008c000907010802060309041601190256015802500c67016802780176027c03720477077808
+87018802800c980299039604175d005d090121013301230321032302bcfeee0225fe7be50239
+d288fd5f88d5050efd1903aefa2b017ffe810000000200c9000005b005d500080011002e4015
+009509810195100802100a0005190d32001c09041210fcecf4ec113939393931002fecf4ec30
+b2601301015d0111332000111000212521200011100029010193f40135011ffee1fecbfe4201
+9f01b20196fe68fe50fe61052ffb770118012e012c0117a6fe97fe80fe7efe96000000020071
+ffe3045a06140010001c003840191ab9000e14b905088c0eb801970317040008024711120b45
+1d10fcecf4ec323231002fece4f4c4ec10c4ee30b6601e801ea01e03015d0111331123350e01
+23220211100033321601141633323635342623220603a2b8b83ab17ccbff00ffcb7cb1fdc7a7
+9292a8a89292a703b6025ef9eca86461014401080108014461fe15cbe7e7cbcbe7e7000100ba
+0000071d047b0022005a4026061209180f00061d07150c871d2003b81bbc19100700110f0808
+065011080f501c18081a462310fcec32fcfcfcec11123931002f3c3ce4f43cc4ec3211121739
+3040133024502470249024a024a024bf24df24ff2409015d013e013332161511231134262322
+061511231134262322061511231133153e01333216042945c082afbeb972758fa6b972778da6
+b9b93fb0797aab03897c76f5e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae67627c00
+0000000200aeffe30458047b00130014003b401c030900030e0106870e118c0a01bc14b80c0d
+0908140b4e020800461510fcecf439ec3231002fe4e432f4c4ec1112173930b46f15c0150201
+5d1311331114163332363511331123350e0123222601aeb87c7c95adb8b843b175c1c801cf01
+ba02a6fd619f9fbea4027bfba0ac6663f003a8000002007bffe3042d047b000a002500bc4027
+191f0b17090e00a91706b90e1120861fba1cb923b8118c170c001703180d09080b1f03081445
+2610fcecccd4ec323211393931002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d30
+1e301f3020302130223f27401d401e401f402040214022501d501e501f502050215022502770
+27851d871e871f8720872185229027a027f0271e301e301f30203021401e401f40204021501e
+501f50205021601e601f60206021701e701f70207021801e801f80208021185d015d01220615
+14163332363d01371123350e01232226353436332135342623220607353e0133321602bedfac
+816f99b9b8b83fbc88accbfdfb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa
+6661c1a2bdc0127f8b2e2eaa2727fc000001006401df027f028300030011b6009c0204010004
+10dccc310010d4ec301321152164021bfde50283a400000100d9005e05db04a60006004f402b
+069c0006030403059c040403009c010201069c05060202014206050302000504a801a7070602
+240400230710fc3cec39310010f4ec1739304b5358071008ed071004ed071004ed071008ed59
+2213350115013501d90502fafe040603f0b6fe2fa6fe2fb6016d000000020071fe56045a047b
+000b0028004a4023190c1d0912861316b90f03b92623b827bc09b90fbd1a1d261900080c4706
+121220452910fcc4ecf4ec323231002fc4e4ece4f4c4ec10fed5ee1112393930b6602a802aa0
+2a03015d01342623220615141633323617100221222627351e013332363d010e012322021110
+1233321617353303a2a59594a5a59495a5b8fefefa61ac51519e52b5b439b27ccefcfcce7cb2
+39b8023dc8dcdcc8c7dcdcebfee2fee91d1eb32c2abdbf5b6362013a01030104013a6263aa00
+000100c90000046a05d500050025400c0295008104011c033a00040610fcecec31002fe4ec30
+4009300750078003800404015d133311211521c9ca02d7fc5f05d5fad5aa000200bafe5604a4
+047b0010001c003e401b1ab9000e14b90508b80e8c01bd03bc1d11120b471704000802461d10
+fcec3232f4ec310010e4e4e4f4c4ec10c4ee304009601e801ea01ee01e04015d251123113315
+3e013332001110022322260134262322061514163332360173b9b93ab17bcc00ffffcc7bb102
+38a79292a7a79292a7a8fdae060aaa6461febcfef8fef8febc6101ebcbe7e7cbcbe7e7000000
+000100ba000004640614001300344019030900030e0106870e11b80c970a010208004e0d0908
+0b461410fcec32f4ec31002f3cecf4c4ec1112173930b2601501015d01112311342623220615
+11231133113e013332160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870614
+fd9e6564ef00000200baffe304a40614000b001c0038401903b90c0f09b918158c0fb81b9719
+00121247180c06081a461d10fcec3232f4ec31002fece4f4c4ec10c6ee30b6601e801ea01e03
+015d013426232206151416333236013e01333200111002232226271523113303e5a79292a7a7
+9292a7fd8e3ab17bcc00ffffcc7bb13ab9b9022fcbe7e7cbcbe7e702526461febcfef8fef8fe
+bc6164a806140001003dfe56047f0460000f018b40430708020911000f0a110b0a00000f0e11
+0f000f0d110c0d00000f0d110e0d0a0b0a0c110b0b0a420d0b0910000b058703bd0e0bbc100e
+0d0c0a09060300080f040f0b1010d44bb00a544bb008545b58b9000b004038594bb0145458b9
+000bffc03859c4c4111739310010e432f4ec113911391239304b5358071005ed071008ed0710
+08ed071005ed071008ed0705ed173259220140f0060005080609030d160a170d100d230d350d
+490a4f0a4e0d5a095a0a6a0a870d800d930d120a000a09060b050c0b0e0b0f17011502100410
+05170a140b140c1a0e1a0f2700240124022004200529082809250a240b240c270d2a0e2a0f20
+1137003501350230043005380a360b360c380d390e390f301141004001400240034004400540
+06400740084209450a470d490e490f4011540051015102550350045005560655075608570957
+0a550b550c590e590f501166016602680a690e690f60117b08780e780f89008a09850b850c89
+0d890e890f9909950b950c9a0e9a0fa40ba40cab0eab0fb011cf11df11ff11655d005d050e01
+2b01353332363f01013309013302934e947c936c4c543321fe3bc3015e015ec368c87a9a4886
+54044efc94036c000000000200c503aa02e905d5000300070042400f05018404008108040506
+000502040810fc4bb012544bb013545b58b90002ffc03859fcdcec310010f43cec323001400f
+30094009500960097009a009bf09075d0111231121112311016faa0224aa05d5fdd5022bfdd5
+022b0000000100ba0000049c0614000a00bc4029081105060507110606050311040504021105
+0504420805020303bc009709060501040608010800460b10fcec32d4c4113931002f3cece417
+39304b5358071004ed071005ed071005ed071004ed5922b2100c01015d405f04020a08160227
+0229052b0856026602670873027705820289058e08930296059708a3021209050906020b030a
+072803270428052b062b07400c6803600c8903850489058d068f079a039707aa03a705b607c5
+07d607f703f003f704f0041a5d71005d1333110133090123011123bab90225ebfdae026bf0fd
+c7b90614fc6901e3fdf4fdac0223fddd000200f0000001c3042300030007001c400e068304a6
+0083020501030400180810fc3cec3231002fecf4ec303733152311331523f0d3d3d3d3fefe04
+23fe000000000002000300000000001400010000000000340004002000000004000400010000
+f027ffff0000f000ffff10000001000000000006005a00000000002800000001000200030004
+00050006000700080009000a000b000c000d000e000f00100011001200130014001500160017
+00180019001a001b001c001d001e001f002000210022002300240025002600270000013500b8
+00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189
+022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4
+009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2
+055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd
+03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a
+009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083
+0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4
+009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3
+00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139
+0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460
+0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f
+007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2
+002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029
+006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859
+212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559
+b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d
+2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45
+442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000
+000251ebb40a581c5f0f3cf5001f080000000000c896fa5500000000c896fa55f7d6fcae0d72
+095500000008000000010000000000010000076dfe1d00000de2f7d6fa510d72000100000000
+00000000000000000000002804cd00660514008704ec0071034a00ba04bc003d059600730239
+00c1023900c1051200ba032300370466007104e500710400ffec042b006f031f00b0031f00a4
+028b0000050e00c9064c0073058f00c905fc00c90579001004e3fffa05790010062900c90514
+007107cb00ba051200ae04e7007b02e3006406b400d905140071047500c9051400ba051200ba
+051400ba04bc003d03ae00c504a200ba02b200f000000000000000440000013c000002100000
+0280000003a40000043c00000478000004c800000540000005bc00000654000006f800000724
+00000884000008f40000094c0000094c000009ac00000a3800000b4c00000bf400000cd40000
+0d4400000e4000000ec000000f580000101c000010a0000011cc000011f80000127000001338
+0000137c0000141c000014940000152c000016f8000017640000185400001894000100000028
+0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9
+2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96
+03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453
+03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03
+d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe
+03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe
+03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb
+05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03
+b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa
+03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe
+039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05
+97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590
+bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103
+89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382
+110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe
+03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b
+fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360
+fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505
+55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10
+034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344
+fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d
+053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b
+03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c
+32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b
+0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c
+fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03
+13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c
+16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503
+fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b1d00>
+] def
+/f-0-0 currentdict end definefont pop
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 -1 546 666
+%%EndPageSetup
+q 0 -1 546 667 rectclip q
+0 665.925 546 -666 re W n
+0 g
+0.663875 w
+0 J
+0 j
+[] 0.0 d
+4 M q 1 0 0 -1 0 665.924988 cm
+0.332 0.91 92.867 57.141 re S Q
+BT
+16 0 0 16 20.902991 631.872559 Tm
+/f-0-0 1 Tf
+<010203040203>Tj
+ET
+q 1 0 0 -1 0 665.924988 cm
+452.164 0.34 92.867 57.141 re S Q
+BT
+16 0 0 16 472.736133 632.443994 Tm
+/f-0-0 1 Tf
+<050607020809>Tj
+ET
+1.029478 w
+[ 4.117912 4.117912] 0 d
+q 1 0 0 -1 0 665.924988 cm
+41.453 63.719 m 41.453 665.922 l S Q
+[ 4.117912 4.117912] 0 d
+q 1 0 0 -1 0 665.924988 cm
+500.469 61.043 m 500.469 663.246 l S Q
+BT
+12.8 0 0 12.8 312.98374 563.66853 Tm
+/f-0-0 1 Tf
+[<020a>-1<0b>1<03>20<020c0a>-1<0b>1<08>-1<0c0d>-1<0203>-1<040203>-1<0c
+0a>-1<0b>1<08>-1<08>-1<020a>-1<09>-1<0e0f>]TJ
+ET
+BT
+12.8 0 0 12.8 216.362964 532.03114 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c0111>-1<13>54<1511>-1<130c1718>1<18>]TJ
+ET
+BT
+12.8 0 0 12.8 215.566675 409.19657 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c0111>-1<13>54<1511>-1<130c18>18<17>79<16>77<17>]TJ
+ET
+BT
+12.8 0 0 12.8 334.803003 271.936462 Tm
+/f-0-0 1 Tf
+[<020a>-1<0b>1<03>20<020c0a>-1<0b>1<08>-1<0c0d>-1<0203>-1<040203>-1<0c
+0d0208>-1<190e>-1<0f>]TJ
+ET
+BT
+9.6 0 0 9.6 205.503491 441.642078 Tm
+/f-0-0 1 Tf
+[<0a>-1<0b>1<1a>-1<1b>-1<08>-1<07>1<0a>-1<1c>-1<09070b>1<08>-1<10>-1<0d
+0203>-1<040203>-1<10>-1<1d1e10>-1<0a>-1<06>1<070208>-1<09>]TJ
+ET
+0.8 w
+[] 0.0 d
+q 1 0 0 -1 0 665.924988 cm
+43.879 280.043 m 493.195 280.043 l S Q
+485.195 385.882 m 481.996 382.683 l 493.195 385.882 l 481.996 389.081 l 
+h
+485.195 385.882 m f*
+0.8 w
+q -1 0 0 1 0 665.924988 cm
+-485.195 -280.043 m -481.996 -283.242 l -493.195 -280.043 l -481.996 
+-276.844 l h
+-485.195 -280.043 m S Q
+0.701961 g
+0.8 w
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+44.688 81.246 451.738 75.961 re S Q
+0 g
+BT
+9.6 0 0 9.6 205.503491 590.33656 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<0910>-1<0a>-1<0b>1<08>-1<08>-1<020a>-1<09>-1<07>1<08>-1<1f
+10>-1<0b>1<08>-1<10>-1<0d0203>-1<040203>]TJ
+ET
+BT
+9.6 0 0 9.6 207.119751 293.639929 Tm
+/f-0-0 1 Tf
+[<0a>-1<0b>1<1a>-1<1b>-1<08>-1<07>1<0a>-1<1c>-1<09070b>1<08>-1<10>-1<0a>-1<06>1<07
+0208>-1<0910>-1<1d1e10>-1<0d0203>-1<040203>]TJ
+ET
+0.800568 w
+[] 0.0 d
+q 1 0 0 -1 0 665.924988 cm
+494.324 428.855 m 44.367 428.855 l S Q
+52.375 237.07 m 55.574 240.273 l 44.367 237.07 l 55.574 233.87 l h
+52.375 237.07 m f*
+0.800568 w
+q 1 -0.000000000000000122 -0.000000000000000122 -1 0 665.924988 cm
+52.375 428.855 m 55.574 425.652 l 44.367 428.855 l 55.574 432.055 l h
+52.375 428.855 m S Q
+BT
+12.8 0 0 12.8 345.308594 116.777039 Tm
+/f-0-0 1 Tf
+[<020a>-1<0b>1<03>20<020c0a>-1<0b>1<08>-1<0c0d>-1<0203>-1<040203>-1<0c
+190206>1<0e>-1<0f>]TJ
+ET
+BT
+12.8 0 0 12.8 215.416064 85.139587 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c0111>-1<13>54<1511>-1<130c1811>-1<20>]TJ
+ET
+0.701961 g
+0.8 w
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+44.281 227.516 451.742 75.965 re S Q
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+43.477 375.402 451.738 75.961 re S Q
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+43.477 531.371 451.738 75.961 re S Q
+0 g
+BT
+9.6 0 0 9.6 233.439209 138.249939 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<0910>-1<1907>1<0d>-1<0a>-1<0b>1<08>-1<08>-1<020a>-1<09>-1<07>1<0b
+08>]TJ
+ET
+0.8 g
+BT
+12.8 0 0 12.8 46.878833 549.018738 Tm
+/f-0-0 1 Tf
+[<0d0203>-1<040203>-1<10>-1<03>21<020a>-1<020704020d10>-1<1c08>-1<1910>-1<1c
+0a>-1<0a>-1<022109>-1<1009>-1<22>-1<02100a>-1<0b08>-1<08>-1<020a>-1<09
+070b>1<08>]TJ
+ET
+BT
+12.8 0 0 12.8 45.262585 422.951697 Tm
+/f-0-0 1 Tf
+[<0d0203>-1<040203>-1<10>-1<0d0208>-1<190d>-1<10191c>-1<091c>-1<1009>-1<0b>1<10>-1<09
+22>-1<0210>-1<0a>-1<06>1<070208>-1<09>]TJ
+ET
+BT
+12.8 0 0 12.8 45.262588 246.781092 Tm
+/f-0-0 1 Tf
+[<0d0203>-1<040203>-1<10>-1<03>21<020a>-1<020704020d10>-1<191c09>-1<1c
+10>-1<0d0208>-1<09>-1<10232410>-1<0a>-1<06>1<070208>-1<09>]TJ
+ET
+BT
+12.8 0 0 12.8 45.262585 101.319128 Tm
+/f-0-0 1 Tf
+[<0d0203>-1<040203>-1<10>-1<03>21<020a>-1<020704020d10>-1<25>-1<0a>-1<0b>1<08>-1<08>-1<02
+0a>-1<09>-1<07>1<0b08>-1<100a>-1<060b>1<0d>-1<021925>]TJ
+ET
+0 g
+BT
+12.8 0 0 12.8 347.920971 516.693861 Tm
+/f-0-0 1 Tf
+[<0a>-1<1c0606>1<231c>-1<0a>-1<26>-1<100a>-1<1c>-1<06>1<06021927>-1<10
+0c1c>-1<19190e0f>]TJ
+ET
+BT
+12.8 0 0 12.8 345.595336 393.859315 Tm
+/f-0-0 1 Tf
+[<0a>-1<1c0606>1<231c>-1<0a>-1<26>-1<100a>-1<1c>-1<06>1<06021927>-1<10
+0c191c>-1<091c>-1<0e0f>]TJ
+ET
+BT
+12.8 0 0 12.8 348.430322 64.95365 Tm
+/f-0-0 1 Tf
+[<0a>-1<1c0606>1<231c>-1<0a>-1<26>-1<100a>-1<1c>-1<06>1<06021927>-1<10
+0c1902060e0f>]TJ
+ET
+Q Q
+showpage
+%%Trailer
+count op_count sub {pop} repeat
+countdictstack dict_count sub {end} repeat
+cairo_eps_state restore
+%%EOF
diff --git a/doc/img/ecore_con-client-server-example2.png b/doc/img/ecore_con-client-server-example2.png
new file mode 100644 (file)
index 0000000..d72ee56
Binary files /dev/null and b/doc/img/ecore_con-client-server-example2.png differ
diff --git a/doc/img/ecore_con-client-server.eps b/doc/img/ecore_con-client-server.eps
new file mode 100644 (file)
index 0000000..dc57dbc
--- /dev/null
@@ -0,0 +1,513 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.10.2 (http://cairographics.org)
+%%CreationDate: Wed Jul 13 18:29:41 2011
+%%Pages: 1
+%%BoundingBox: 0 -1 546 666
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+/cairo_eps_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+%%EndProlog
+11 dict begin
+/FontType 42 def
+/FontName /DejaVuSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 1 /uni0053 put
+Encoding 2 /uni0065 put
+Encoding 3 /uni0072 put
+Encoding 4 /uni0076 put
+Encoding 5 /uni0043 put
+Encoding 6 /uni006C put
+Encoding 7 /uni0069 put
+Encoding 8 /uni006E put
+Encoding 9 /uni0074 put
+Encoding 10 /uni0063 put
+Encoding 11 /uni006F put
+Encoding 12 /uni005F put
+Encoding 13 /uni0073 put
+Encoding 14 /uni0028 put
+Encoding 15 /uni0029 put
+Encoding 16 /uni0020 put
+Encoding 17 /uni0045 put
+Encoding 18 /uni004F put
+Encoding 19 /uni0052 put
+Encoding 20 /uni004E put
+Encoding 21 /uni0056 put
+Encoding 22 /uni0054 put
+Encoding 23 /uni004C put
+Encoding 24 /uni0049 put
+Encoding 25 /uni0041 put
+Encoding 26 /uni0044 put
+Encoding 27 /uni0064 put
+Encoding 28 /uni006D put
+Encoding 29 /uni0075 put
+Encoding 30 /uni0061 put
+Encoding 31 /uni002D put
+Encoding 32 /uni003E put
+Encoding 33 /uni0067 put
+/CharStrings 34 dict dup begin
+/.notdef 0 def
+/uni0053 1 def
+/uni0065 2 def
+/uni0072 3 def
+/uni0076 4 def
+/uni0043 5 def
+/uni006C 6 def
+/uni0069 7 def
+/uni006E 8 def
+/uni0074 9 def
+/uni0063 10 def
+/uni006F 11 def
+/uni005F 12 def
+/uni0073 13 def
+/uni0028 14 def
+/uni0029 15 def
+/uni0020 16 def
+/uni0045 17 def
+/uni004F 18 def
+/uni0052 19 def
+/uni004E 20 def
+/uni0056 21 def
+/uni0054 22 def
+/uni004C 23 def
+/uni0049 24 def
+/uni0041 25 def
+/uni0044 26 def
+/uni0064 27 def
+/uni006D 28 def
+/uni0075 29 def
+/uni0061 30 def
+/uni002D 31 def
+/uni003E 32 def
+/uni0067 33 def
+end readonly def
+/sfnts [
+<00010000000a008000030020636d61700155f1ee00001470000000826376742000691d390000
+14f4000001fe6670676d7134766a000016f4000000ab676c796664fd74e8000000ac000013c4
+68656164f5a89196000017a000000036686865610cb80673000017d800000024686d74789c88
+1111000017fc000000886c6f6361000156ac000018840000008c6d617870048f067100001910
+00000020707265703b07f100000019300000056800020066fe96046605a400030007001a400c
+04fb0006fb0108057f0204002fc4d4ec310010d4ecd4ec301311211125211121660400fc7303
+1bfce5fe96070ef8f272062900010087ffe304a205f00027007e403c0d0c020e0b021e1f1e08
+0902070a021f1f1e420a0b1e1f0415010015a11494189511049500942591118c281e0a0b1f1b
+0700221b190e2d071914222810dcc4ecfcece4111239393939310010e4f4e4ec10eef6ee10c6
+111739304b535807100eed11173907100eed1117395922b20f2901015db61f292f294f29035d
+01152e012322061514161f011e0115140421222627351e013332363534262f012e0135342433
+3216044873cc5fa5b377a67ae2d7feddfee76aef807bec72adbc879a7be2ca0117f569da05a4
+c53736807663651f192bd9b6d9e0302fd04546887e6e7c1f182dc0abc6e4260000020071ffe3
+047f047b0014001b00704024001501098608880515a90105b90c01bb18b912b80c8c1c1b1502
+081508004b02120f451c10fcecf4ecc4111239310010e4f4ece410ee10ee10f4ee1112393040
+293f1d701da01dd01df01d053f003f013f023f153f1b052c072f082f092c0a6f006f016f026f
+156f1b095d71015d0115211e0133323637150e01232000111000333200072e0123220607047f
+fcb20ccdb76ac76263d06bfef4fec70129fce20107b802a5889ab90e025e5abec73434ae2a2c
+0138010a01130143feddc497b4ae9e00000100ba0000034a047b001100304014060b0700110b
+03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc11123930b450139f1302
+015d012e012322061511231133153e0133321617034a1f492c9ca7b9b93aba85132e1c03b412
+11cbbefdb20460ae6663050500000001003d0000047f0460000600fb40270311040504021101
+0205050402110302060006011100000642020300bf0506050302010504000710d44bb00a5458
+b90000004038594bb014544bb015545b58b90000ffc03859c4173931002fec3239304b535807
+1005ed071008ed071008ed071005ed592201408e48026a027b027f02860280029102a4020806
+00060109030904150015011a031a0426002601290329042008350035013a033a043008460046
+0149034904460548064008560056015903590450086600660169036904670568066008750074
+017b037b0475057a068500850189038904890586069600960197029a03980498059706a805a7
+06b008c008df08ff083e5d005d133309013301233dc3015e015ec3fe5cfa0460fc5403acfba0
+000000010073ffe3052705f000190036401a0da10eae0a951101a100ae04951791118c1a0719
+0d003014101a10fcec32ec310010e4f4ecf4ec10eef6ee30b40f1b1f1b02015d01152e012320
+0011100021323637150e01232000111000213216052766e782ff00fef00110010082e7666aed
+84feadfe7a0186015386ed0562d55f5efec7fed8fed9fec75e5fd34848019f01670168019f47
+0000000100c100000179061400030022b7009702010800460410fcec31002fec30400d100540
+05500560057005f00506015d13331123c1b8b80614f9ec00000200c100000179061400030007
+002b400e06be04b100bc020501080400460810fc3cec3231002fe4fcec30400b100940095009
+6009700905015d1333112311331523c1b8b8b8b80460fba00614e900000100ba00000464047b
+001300364019030900030e0106870e11b80cbc0a010208004e0d09080b461410fcec32f4ec31
+002f3ce4f4c4ec1112173930b46015cf1502015d0111231134262322061511231133153e0133
+32160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef00010037
+000002f2059e0013003840190e05080f03a9001101bc08870a0b08090204000810120e461410
+fc3cc4fc3cc432393931002fecf43cc4ec3211393930b2af1501015d01112115211114163b01
+152322263511233533110177017bfe854b73bdbdd5a28787059efec28ffda0894e9a9fd20260
+8f013e00000000010071ffe303e7047b0019003f401b00860188040e860d880ab91104b917b8
+118c1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30400b0f1b101b801b
+901ba01b05015d01152e0123220615141633323637150e0123220011100021321603e74e9d50
+b3c6c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2baa2424013e010e01
+12013a23000000020071ffe30475047b000b0017004a401306b91200b90cb8128c1809120f51
+031215451810fcecf4ec310010e4f4ec10ee3040233f197b007b067f077f087f097f0a7f0b7b
+0c7f0d7f0e7f0f7f107f117b12a019f01911015d012206151416333236353426273200111000
+232200111000027394acab9593acac93f00112feeef0f1feef011103dfe7c9c9e7e8c8c7e99c
+fec8feecfeedfec7013901130114013800000001ffecfe1d0414feac0003000fb500a9010002
+0410c4c43100d4ec30011521350414fbd8feac8f8f0000000001006fffe303c7047b002700e7
+403c0d0c020e0b531f1e080902070a531f1f1e420a0b1e1f041500860189041486158918b911
+04b925b8118c281e0a0b1f1b0700521b080e07081422452810fcc4ecd4ece411123939393931
+0010e4f4ec10fef5ee10f5ee121739304b535807100eed111739070eed1117395922b2002701
+015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c3b093b0a3b0b3b0c0b200020012402280a280b2a
+132f142f152a16281e281f292029212427860a860b860c860d12000000010202060a060b030c
+030d030e030f03100319031a031b031c041d09272f293f295f297f2980299029a029f029185d
+005d7101152e012322061514161f011e0115140623222627351e013332363534262f012e0135
+3436333216038b4ea85a898962943fc4a5f7d85ac36c66c661828c65ab40ab98e0ce66b4043f
+ae282854544049210e2a99899cb62323be353559514b50250f2495829eac1e000000000100b0
+fef2027b0612000d0037400f069800970e0d070003120600130a0e10dc4bb0135458b9000aff
+c038594bb00f5458b9000a00403859e432ec113939310010fcec300106021514121723260235
+341237027b86828385a0969594970612e6fe3ee7e7fe3be5eb01c6e0df01c4ec000100a4fef2
+026f0612000d001f400f079800970e0701000b12041308000e10dc3cf4ec113939310010fcec
+301333161215140207233612353402a4a096959596a08583830612ecfe3cdfe0fe3aebe501c5
+e7e701c20000000100c90000048b05d5000b002e401506950402950081089504ad0a05010907
+031c00040c10fcec32d4c4c431002fececf4ec10ee30b21f0d01015d13211521112115211121
+1521c903b0fd1a02c7fd3902f8fc3e05d5aafe46aafde3aa000000020073ffe305d905f0000b
+00170023401306951200950c91128c1809190f33031915101810fcecfcec310010e4f4ec10ee
+300122001110003332001110002720001110002120001110000327dcfefd0103dcdc0101feff
+dc013a0178fe88fec6fec5fe870179054cfeb8fee5fee6feb80148011a011b0148a4fe5bfe9e
+fe9ffe5b01a40162016201a50000000200c90000055405d50013001c00b14035090807030a06
+1103040305110404034206040015030415950914950d810b040506031109001c160e050a1919
+04113f140a1c0c041d10fcec32fcc4ec1117391139393931002f3cf4ecd4ec12391239123930
+4b5358071005ed071005ed1117395922b2401e01015d40427a13010500050105020603070415
+00150114021603170425002501250226032706260726082609201e3601360246014602680575
+047505771388068807980698071f5d005d011e01171323032e012b0111231121201615140601
+1133323635342623038d417b3ecdd9bf4a8b78dcca01c80100fc83fd89fe9295959202bc1690
+7efe68017f9662fd8905d5d6d88dba024ffdee8783838500000100c90000053305d500090079
+401e071101020102110607064207020300af0805060107021c0436071c00040a10fcecfcec11
+393931002f3cec323939304b5358071004ed071004ed5922b21f0b01015d4030360238074802
+4707690266078002070601090615011a06460149065701580665016906790685018a0695019a
+069f0b105d005d13210111331121011123c901100296c4fef0fd6ac405d5fb1f04e1fa2b04e1
+fb1f000100100000056805d5000600b740270411050605031102030606050311040300010002
+1101010042030401af0006040302000505010710d4c4173931002fec3239304b5358071005ed
+071008ed071008ed071005ed5922b2500801015d406200032a03470447055a037d0383030706
+00070208040906150114021a041a052a002601260229042905250620083800330133023c043c
+053706480045014502490449054706590056066602690469057a007601760279047905750680
+0898009706295d005d21013309013301024afdc6d301d901dad2fdc705d5fb1704e9fa2b0001
+fffa000004e905d50007004a400e0602950081040140031c0040050810d4e4fce431002ff4ec
+3230014bb00a5458bd00080040000100080008ffc03811373859401300091f00100110021f07
+1009400970099f09095d03211521112311210604effdeecbfdee05d5aafad5052b00000100c9
+0000046a05d500050025400c0295008104011c033a00040610fcecec31002fe4ec3040093007
+50078003800404015d133311211521c9ca02d7fc5f05d5fad5aa000100c90000019305d50003
+002eb700af02011c00040410fc4bb0105458b9000000403859ec31002fec3001400d30054005
+500560058f059f05065d13331123c9caca05d5fa2b00000200100000056805d50002000a00c2
+404100110100040504021105050401110a030a0011020003030a071105040611050504091103
+0a08110a030a4200030795010381090509080706040302010009050a0b10d4c4173931002f3c
+e4d4ec1239304b5358071005ed0705ed071005ed0705ed071008ed071005ed071005ed071008
+ed5922b2200c01015d40420f010f020f070f080f005800760070008c00090701080206030904
+1601190256015802500c67016802780176027c0372047707780887018802800c980299039604
+175d005d090121013301230321032302bcfeee0225fe7be50239d288fd5f88d5050efd1903ae
+fa2b017ffe810000000200c9000005b005d500080011002e4015009509810195100802100a00
+05190d32001c09041210fcecf4ec113939393931002fecf4ec30b2601301015d011133200011
+1000212521200011100029010193f40135011ffee1fecbfe42019f01b20196fe68fe50fe6105
+2ffb770118012e012c0117a6fe97fe80fe7efe96000000020071ffe3045a06140010001c0038
+40191ab9000e14b905088c0eb801970317040008024711120b451d10fcecf4ec323231002fec
+e4f4c4ec10c4ee30b6601e801ea01e03015d0111331123350e01232202111000333216011416
+33323635342623220603a2b8b83ab17ccbff00ffcb7cb1fdc7a79292a8a89292a703b6025ef9
+eca86461014401080108014461fe15cbe7e7cbcbe7e7000100ba0000071d047b0022005a4026
+061209180f00061d07150c871d2003b81bbc19100700110f0808065011080f501c18081a4623
+10fcec32fcfcfcec11123931002f3c3ce4f43cc4ec32111217393040133024502470249024a0
+24a024bf24df24ff2409015d013e013332161511231134262322061511231134262322061511
+231133153e01333216042945c082afbeb972758fa6b972778da6b9b93fb0797aab03897c76f5
+e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae67627c000000000200aeffe30458047b
+00130014003b401c030900030e0106870e118c0a01bc14b80c0d0908140b4e020800461510fc
+ecf439ec3231002fe4e432f4c4ec1112173930b46f15c01502015d1311331114163332363511
+331123350e0123222601aeb87c7c95adb8b843b175c1c801cf01ba02a6fd619f9fbea4027bfb
+a0ac6663f003a8000002007bffe3042d047b000a002500bc4027191f0b17090e00a91706b90e
+1120861fba1cb923b8118c170c001703180d09080b1f030814452610fcecccd4ec3232113939
+31002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d301e301f3020302130223f2740
+1d401e401f402040214022501d501e501f50205021502250277027851d871e871f8720872185
+229027a027f0271e301e301f30203021401e401f40204021501e501f50205021601e601f6020
+6021701e701f70207021801e801f80208021185d015d0122061514163332363d01371123350e
+01232226353436332135342623220607353e0133321602bedfac816f99b9b8b83fbc88accbfd
+fb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa6661c1a2bdc0127f8b2e2eaa
+2727fc000001006401df027f028300030011b6009c020401000410dccc310010d4ec30132115
+2164021bfde50283a400000100d9005e05db04a60006004f402b069c0006030403059c040403
+009c010201069c05060202014206050302000504a801a7070602240400230710fc3cec393100
+10f4ec1739304b5358071008ed071004ed071004ed071008ed592213350115013501d90502fa
+fe040603f0b6fe2fa6fe2fb6016d000000020071fe56045a047b000b0028004a4023190c1d09
+12861316b90f03b92623b827bc09b90fbd1a1d261900080c4706121220452910fcc4ecf4ec32
+3231002fc4e4ece4f4c4ec10fed5ee1112393930b6602a802aa02a03015d0134262322061514
+1633323617100221222627351e013332363d010e0123220211101233321617353303a2a59594
+a5a59495a5b8fefefa61ac51519e52b5b439b27ccefcfcce7cb239b8023dc8dcdcc8c7dcdceb
+fee2fee91d1eb32c2abdbf5b6362013a01030104013a6263aa00000000020003000000000014
+00010000000000340004002000000004000400010000f021ffff0000f000ffff100000010000
+00000006004e0000000000220000000100020003000400050006000700080009000a000b000c
+000d000e000f0010001100120013001400150016001700180019001a001b001c001d001e001f
+002000210000013500b800cb00cb00c100aa009c01a600b800660000007100cb00a002b20085
+007500b800c301cb0189022d00cb00a600f000d300aa008700cb03aa0400014a003300cb0000
+00d9050200f4015400b4009c01390114013907060400044e04b4045204b804e704cd00370473
+04cd04600473013303a2055605a60556053903c5021200c9001f00b801df007300ba03e90333
+03bc0444040e00df03cd03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b
+0252008f00c705cd009a009a006f00cb00cd019e01d300f000ba018300d5009803040248009e
+01d500c100cb00f600830354027f00000333026600d300c700a400cd008f009a0073040005d5
+010a00fe022b00a400b4009c00000062009c0000001d032d05d505d505d505f0007f007b0054
+00a406b80614072301d300b800cb00a601c301ec069300a000d3035c037103db0185042304a8
+0448008f0139011401390360008f05d5019a0614072306660179046004600460047b009c0000
+0277046001aa00e904600762007b00c5007f027b000000b4025205cd006600bc006600770610
+00cd013b01850389008f007b0000001d00cd074a042f009c009c0000077d006f0000006f0335
+006a006f007b00ae00b2002d0396008f027b00f600830354063705f6008f009c04e10266008f
+018d02f600cd03440029006604ee00730000140000960000b707060504030201002c2010b002
+254964b040515820c859212d2cb002254964b040515820c859212d2c20100720b00050b00d79
+20b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b05
+59b0051cb0032508e12d2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0
+022545445921212d2c45442d2cb00225b0022549b00525b005254960b0206368208a108a233a
+8a10653a2d0000010000000251eb2c7ea7b85f0f3cf5001f080000000000c896fa5500000000
+c896fa55f7d6fcae0d72095500000008000000010000000000010000076dfe1d00000de2f7d6
+fa510d7200010000000000000000000000000000002204cd00660514008704ec0071034a00ba
+04bc003d05960073023900c1023900c1051200ba032300370466007104e500710400ffec042b
+006f031f00b0031f00a4028b0000050e00c9064c0073058f00c905fc00c90579001004e3fffa
+047500c9025c00c905790010062900c90514007107cb00ba051200ae04e7007b02e3006406b4
+00d90514007100000000000000440000013c0000021000000280000003a40000043c00000478
+000004c800000540000005bc00000654000006f80000072400000884000008f40000094c0000
+094c000009ac00000a3800000b4c00000bf400000cd400000d4400000d8800000dd000000ecc
+00000f4c00000fe4000010a80000112c0000125800001284000012fc000013c4000100000022
+0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9
+2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96
+03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453
+03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03
+d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe
+03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe
+03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb
+05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03
+b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa
+03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe
+039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05
+97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590
+bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103
+89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382
+110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe
+03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b
+fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360
+fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505
+55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10
+034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344
+fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d
+053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b
+03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c
+32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b
+0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c
+fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03
+13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c
+16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503
+fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b1d00>
+] def
+/f-0-0 currentdict end definefont pop
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 -1 546 666
+%%EndPageSetup
+q 0 -1 546 667 rectclip q
+0 665.925 546 -666 re W n
+0 g
+0.663875 w
+0 J
+0 j
+[] 0.0 d
+4 M q 1 0 0 -1 0 665.924988 cm
+0.332 0.91 92.867 57.141 re S Q
+BT
+16 0 0 16 20.902991 631.872559 Tm
+/f-0-0 1 Tf
+<010203040203>Tj
+ET
+q 1 0 0 -1 0 665.924988 cm
+452.164 0.34 92.867 57.141 re S Q
+BT
+16 0 0 16 472.736133 632.443994 Tm
+/f-0-0 1 Tf
+<050607020809>Tj
+ET
+1.029478 w
+[ 4.117912 4.117912] 0 d
+q 1 0 0 -1 0 665.924988 cm
+41.453 63.719 m 41.453 665.922 l S Q
+[ 4.117912 4.117912] 0 d
+q 1 0 0 -1 0 665.924988 cm
+500.469 61.043 m 500.469 663.246 l S Q
+BT
+12.8 0 0 12.8 312.98374 563.66853 Tm
+/f-0-0 1 Tf
+[<020a>-1<0b>1<03>20<020c0a>-1<0b>1<08>-1<0c0d>-1<0203>-1<040203>-1<0c
+0a>-1<0b>1<08>-1<08>-1<020a>-1<09>-1<0e0f>]TJ
+ET
+BT
+12.8 0 0 12.8 47.919678 540.232996 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c05>-1<171811>-1<14160c191a>1<1a>]TJ
+ET
+BT
+12.8 0 0 12.8 216.362964 515.060583 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c0111>-1<13>54<1511>-1<130c191a>1<1a>]TJ
+ET
+BT
+12.8 0 0 12.8 44.687207 414.165955 Tm
+/f-0-0 1 Tf
+[<020a>-1<0b>1<03>20<020c0a>-1<0b>1<08>-1<0c0a>-1<0607>1<0208>-1<09>-1<0c
+0d0208>-1<1b0e>-1<0f>]TJ
+ET
+BT
+12.8 0 0 12.8 215.566675 397.882874 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c0111>-1<13>54<1511>-1<130c1a>18<19>79<16>77<19>]TJ
+ET
+BT
+12.8 0 0 12.8 334.803003 271.936462 Tm
+/f-0-0 1 Tf
+[<020a>-1<0b>1<03>20<020c0a>-1<0b>1<08>-1<0c0d>-1<0203>-1<040203>-1<0c
+0d0208>-1<1b0e>-1<0f>]TJ
+ET
+BT
+12.8 0 0 12.8 46.65733 249.188416 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c05>-1<171811>-1<14160c1a>18<19>78<16>78<19>]TJ
+ET
+BT
+9.6 0 0 9.6 205.503491 441.642078 Tm
+/f-0-0 1 Tf
+[<0a>-1<0b>1<1c>-1<1d>-1<08>-1<07>1<0a>-1<1e>-1<09070b>1<08>-1<10>-1<0d
+0203>-1<040203>-1<10>-1<1f2010>-1<0a>-1<06>1<070208>-1<09>]TJ
+ET
+0.8 w
+[] 0.0 d
+q 1 0 0 -1 0 665.924988 cm
+43.879 280.043 m 493.195 280.043 l S Q
+485.195 385.882 m 481.996 382.683 l 493.195 385.882 l 481.996 389.081 l 
+h
+485.195 385.882 m f*
+0.8 w
+q -1 0 0 1 0 665.924988 cm
+-485.195 -280.043 m -481.996 -283.242 l -493.195 -280.043 l -481.996 
+-276.844 l h
+-485.195 -280.043 m S Q
+0.701961 g
+0.8 w
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+44.688 81.246 451.738 75.961 re S Q
+0 g
+BT
+9.6 0 0 9.6 205.503491 590.33656 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<0910>-1<0a>-1<0b>1<08>-1<08>-1<020a>-1<09>-1<07>1<08>-1<21
+10>-1<0b>1<08>-1<10>-1<0d0203>-1<040203>]TJ
+ET
+BT
+9.6 0 0 9.6 207.119751 293.639929 Tm
+/f-0-0 1 Tf
+[<0a>-1<0b>1<1c>-1<1d>-1<08>-1<07>1<0a>-1<1e>-1<09070b>1<08>-1<10>-1<0a>-1<06>1<07
+0208>-1<0910>-1<1f2010>-1<0d0203>-1<040203>]TJ
+ET
+0.800568 w
+[] 0.0 d
+q 1 0 0 -1 0 665.924988 cm
+494.324 428.855 m 44.367 428.855 l S Q
+52.375 237.07 m 55.574 240.273 l 44.367 237.07 l 55.574 233.87 l h
+52.375 237.07 m f*
+0.800568 w
+q 1 -0.000000000000000122 -0.000000000000000122 -1 0 665.924988 cm
+52.375 428.855 m 55.574 425.652 l 44.367 428.855 l 55.574 432.055 l h
+52.375 428.855 m S Q
+BT
+12.8 0 0 12.8 345.308594 116.777039 Tm
+/f-0-0 1 Tf
+[<020a>-1<0b>1<03>20<020c0a>-1<0b>1<08>-1<0c0d>-1<0203>-1<040203>-1<0c
+1b0206>1<0e>-1<0f>]TJ
+ET
+BT
+12.8 0 0 12.8 46.506689 96.453308 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c05>-1<171811>-1<14160c1a11>-1<17>]TJ
+ET
+BT
+12.8 0 0 12.8 215.416064 79.482751 Tm
+/f-0-0 1 Tf
+[<03>21<020a>-1<020704020d10>-1<11>-1<05>-1<121311>-1<0c05>-1<12140c11>-1<15
+11>-1<14160c0111>-1<13>54<1511>-1<130c1a11>-1<17>]TJ
+ET
+0.701961 g
+0.8 w
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+44.281 227.516 451.742 75.965 re S Q
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+43.477 375.402 451.738 75.961 re S Q
+[ 1.6 3.2] 0 d
+q 1 0 0 -1 0 665.924988 cm
+43.477 531.371 451.738 75.961 re S Q
+0 g
+BT
+9.6 0 0 9.6 233.439209 138.249939 Tm
+/f-0-0 1 Tf
+[<0a>-1<06>1<070208>-1<0910>-1<1b07>1<0d>-1<0a>-1<0b>1<08>-1<08>-1<020a>-1<09>-1<07>1<0b
+08>]TJ
+ET
+Q Q
+showpage
+%%Trailer
+count op_count sub {pop} repeat
+countdictstack dict_count sub {end} repeat
+cairo_eps_state restore
+%%EOF
diff --git a/doc/img/ecore_con-client-server.png b/doc/img/ecore_con-client-server.png
new file mode 100644 (file)
index 0000000..c435b54
Binary files /dev/null and b/doc/img/ecore_con-client-server.png differ
diff --git a/doc/img/ecore_thread.eps b/doc/img/ecore_thread.eps
new file mode 100644 (file)
index 0000000..dc9d4a2
--- /dev/null
@@ -0,0 +1,17292 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (ecore_thread.eps)
+%%CreationDate: (2011-07-19T13:34:25-03:00)
+%%BoundingBox: -0 -0 597 657
+%%HiResBoundingBox: 0 0 596.866 657
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%EndComments
+
+%%BeginDefaults
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image.  The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/DirectClassPacket
+{
+  %
+  % Get a DirectClass packet.
+  %
+  % Parameters:
+  %   red.
+  %   green.
+  %   blue.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile color_packet readhexstring pop pop
+  compression 0 eq
+  {
+    /number_pixels 3 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add 3 mul def
+  } ifelse
+  0 3 number_pixels 1 sub
+  {
+    pixels exch color_packet putinterval
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+  %
+  % Display a DirectClass image.
+  %
+  systemdict /colorimage known
+  {
+    columns rows 8
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { DirectClassPacket } false 3 colorimage
+  }
+  {
+    %
+    % No colorimage operator;  convert to grayscale.
+    %
+    columns rows 8
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { GrayDirectClassPacket } image
+  } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+  %
+  % Get a DirectClass packet;  convert to grayscale.
+  %
+  % Parameters:
+  %   red
+  %   green
+  %   blue
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile color_packet readhexstring pop pop
+  color_packet 0 get 0.299 mul
+  color_packet 1 get 0.587 mul add
+  color_packet 2 get 0.114 mul add
+  cvi
+  /gray_packet exch def
+  compression 0 eq
+  {
+    /number_pixels 1 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add def
+  } ifelse
+  0 1 number_pixels 1 sub
+  {
+    pixels exch gray_packet put
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+  %
+  % Get a PseudoClass packet;  convert to grayscale.
+  %
+  % Parameters:
+  %   index: index into the colormap.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile byte readhexstring pop 0 get
+  /offset exch 3 mul def
+  /color_packet colormap offset 3 getinterval def
+  color_packet 0 get 0.299 mul
+  color_packet 1 get 0.587 mul add
+  color_packet 2 get 0.114 mul add
+  cvi
+  /gray_packet exch def
+  compression 0 eq
+  {
+    /number_pixels 1 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add def
+  } ifelse
+  0 1 number_pixels 1 sub
+  {
+    pixels exch gray_packet put
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+  %
+  % Get a PseudoClass packet.
+  %
+  % Parameters:
+  %   index: index into the colormap.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile byte readhexstring pop 0 get
+  /offset exch 3 mul def
+  /color_packet colormap offset 3 getinterval def
+  compression 0 eq
+  {
+    /number_pixels 3 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add 3 mul def
+  } ifelse
+  0 3 number_pixels 1 sub
+  {
+    pixels exch color_packet putinterval
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+  %
+  % Display a PseudoClass image.
+  %
+  % Parameters:
+  %   class: 0-PseudoClass or 1-Grayscale.
+  %
+  currentfile buffer readline pop
+  token pop /class exch def pop
+  class 0 gt
+  {
+    currentfile buffer readline pop
+    token pop /depth exch def pop
+    /grays columns 8 add depth sub depth mul 8 idiv string def
+    columns rows depth
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { currentfile grays readhexstring pop } image
+  }
+  {
+    %
+    % Parameters:
+    %   colors: number of colors in the colormap.
+    %   colormap: red, green, blue color packets.
+    %
+    currentfile buffer readline pop
+    token pop /colors exch def pop
+    /colors colors 3 mul def
+    /colormap colors string def
+    currentfile colormap readhexstring pop pop
+    systemdict /colorimage known
+    {
+      columns rows 8
+      [
+        columns 0 0
+        rows neg 0 rows
+      ]
+      { PseudoClassPacket } false 3 colorimage
+    }
+    {
+      %
+      % No colorimage operator;  convert to grayscale.
+      %
+      columns rows 8
+      [
+        columns 0 0
+        rows neg 0 rows
+      ]
+      { GrayPseudoClassPacket } image
+    } ifelse
+  } ifelse
+} bind def
+
+/DisplayImage
+{
+  %
+  % Display a DirectClass or PseudoClass image.
+  %
+  % Parameters:
+  %   x & y translation.
+  %   x & y scale.
+  %   label pointsize.
+  %   image label.
+  %   image columns & rows.
+  %   class: 0-DirectClass or 1-PseudoClass.
+  %   compression: 0-none or 1-RunlengthEncoded.
+  %   hex color packets.
+  %
+  gsave
+  /buffer 512 string def
+  /byte 1 string def
+  /color_packet 3 string def
+  /pixels 768 string def
+
+  currentfile buffer readline pop
+  token pop /x exch def
+  token pop /y exch def pop
+  x y translate
+  currentfile buffer readline pop
+  token pop /x exch def
+  token pop /y exch def pop
+  currentfile buffer readline pop
+  token pop /pointsize exch def pop
+  /Times-Roman findfont pointsize scalefont setfont
+  x y scale
+  currentfile buffer readline pop
+  token pop /columns exch def
+  token pop /rows exch def pop
+  currentfile buffer readline pop
+  token pop /class exch def pop
+  currentfile buffer readline pop
+  token pop /compression exch def pop
+  class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+} bind def
+%%EndProlog
+%%Page:  1 1
+%%PageBoundingBox: 0 0 597 657
+userdict begin
+DisplayImage
+0 0
+596.866 656.873
+12
+746 821
+1
+1
+1
+8
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF6A87FFFFD039FFFFFF3EC6FFFF8F63FFFFFF24FFFFFF5C
+97FFFFBC3EFFFFFF33DBFFFF7F71FFFFFF24FFFFFF50A9FFFFA94AFFFFFF29F3FFFF717F
+FFFFE72EFFFFFF44BCFFFF9756FFFFFF24FFFFFF638FFFFFD039FFFFFF39D0FFFF8F63FF
+FFFF24FFFFFF56A0FFFFBC44FFFFFF2EE7FFFF7F71FFFFF329FFFFFF4AB2FFFFA950FFFF
+FF24FFFFFF717FFFFFDB33FFFFFF3EC6FFFF975CFFFFFF24FFFFFF638FFFFFC63EFFFFFF
+33DBFFFF876AFFFFFF24FFFFFF56A0FFFFB24AFFFFFF29E7FFFF7878FFFFE72EFFFFFF4A
+B2FFFFA056FFFFFF20FFFFFF6A87FFFFD039FFFFFF3EC6FFFF8F63FFFFFF20FFFFFF5C97
+FFFFBC44FFFFFF33DBFFFF7F71FFFFFF24FFFFFF50A9FFFFA950FFFFFF29F3FFFF717FFF
+FFE72EFFFFFF44BCFFFF975CFFFFFF24FFFFFF638FFFFFD039FFFFFF39D0FFFF876AFFFF
+FF24FFFFFF56A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A00000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3D7D7F4FFFFFFFFFFFFF4D7D7E3
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD3375FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE8D7D7D7D7D7D7D7D7D7D7D7E0FF8A33A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE03363FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3600005EFFFFFFFFFFFF5C000036FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA4004AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C00000000000000
+0000000022FF640081FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD40035FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF36000215FFFFFFFFFFFD14020036FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC54684FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86464646462800194646464664FF640081FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFD40035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36003100A5FFFFFF
+FFA000310036FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF7A0046FFFFFFFFFFFF640081FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFD40035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3600860243FFFFFFFF4003830036FFFFFFFD
+B162453A548EFFFFFFFFFFD46A9FFFFFFF876AF4C56B3D53AAFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF7A0046FFFFFFFFFFFF640081E57C464881FFFFFFFFFF856AF8C06D3E70FFFFFF9E
+5E3D5083FBFFFFFFFFFBA95E423B579AFFFFFFFFFFFFFFAD593F6CC3D40035FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3600A52E08EFFFFFEA06359A0036FFFFFF7B00000E1402002EF4FFFF
+FFA4004AFFFFFF27009308030500027BFFFFFFFFFFFFFFFFFFFFFFFFFF7A0046FFFFFFFF
+FFFF64006E1D010900003BFFFFFFFF2400910601073DFFEC40000215070028DDFFFFFF65
+0001101301003BFDFFFFFFFF710200100707860035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3600
+A585007FFFFF79008F9A0036FFFFFFA178E7FFFFE03D0066FFFFFFA4004AFFFFFF27000A
+7BF8E86F020BEAFFFFFFFFFFFFFFFFFFFFFFFF7A0046FFFFFFFFFFFF64000448E7FB9015
+009CFFFFFF2400086DECFFDDFF4A0046E8FFFD680041FFFFFF9381EDFFFFD531007CFFFF
+FFB8010FAEFFFA65040035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3600A5F30A2BFFFF260DF89A
+0036FFFFFFFFFFFFFFFFFFF60D19FFFFFFA4004AFFFFFF27005CFFFFFFFF2400A0FFFFFF
+FFFFFFFFFFFFFFFFFF7A0046FFFFFFFFFFFF640022FDFFFFFF5F0052FFFFFF240051FFFF
+FFFFBC0227FDFFFFFFFF3201CAFFFFFFFFFFFFFFFFEA0428FFFFFF370089FFFFFFFF3300
+35FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3600A5FF4701CFC6014FFF9A0036FFFFFFFFFFD59C7B
+72721706FFFFFFA4004AFFFFFF2700B6FFFFFFFF5A007FFFFFFFFFFFFFFFFFFFFFFFFF7A
+0046FFFFFFFFFFFF640062FFFFFFFFAC003BFFFFFF2400B5FFFFFFFF6F0073FFFFFFFFFF
+6E008DFFFFFFFFCD997972720E12FFFFFF0F09FBFFFFFFFF8D0035FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3600A5FFAC00605900B8FF9A0036FFFFFFE33702000000000000E7FFFFA4004A
+FFFFFF2700E2FFFFFFFF7A0073FFFFFFFFFFFFFFFFFFFFFFFF7A0046FFFFFFFFFFFF6400
+7FFFFFFFFFDA0032FFFFFF2400DFFFFFFFFF4A00060909090909060066FFFFD430010000
+00000004FFFFEF011AFFFFFFFFFFBB0035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3600A5FFFF18
+16121EFFFF9A0036FFFFFF31004BB6E3FDFF2800E5FFFFA4004AFFFFFF2700E5FFFFFFFF
+7A0073FFFFFFFFFFFFFFFFFFFFFFFF7A0046FFFFFFFFFFFF640081FFFFFFFFDA0032FFFF
+FF2400ECFFFFFFFF43004462626262626262A8FFFF220057BCE5FDFF1903FFFFEC001CFF
+FFFFFFFFBD0035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3600A5FFFF6400006DFFFF9A0036FFFF
+EC0122FFFFFFFFFF1000E5FFFFA4004AFFFFFF2700E5FFFFFFFF7A0073FFFFFFFFFFFFFF
+FFFFFFFFFF7A0046FFFFFFFFFFFF640081FFFFFFFFDA0032FFFFFF2400ECFFFFFFFF6B00
+6FFFFFFFFFFFFFFFFFFFCD0031FFFFFFFFFB0403FFFFFF0D0AFFFFFFFFFF930035FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3600A5FFFFD53333DFFFFF9A0036FFFFC60026FFFFFFFFA30000
+E5FFFFA4004AFFFFFF2700E5FFFFFFFF7A0073FFFFFFFFFFFFFFFFFFFFFFFF7A0046FFFF
+FFFFFFFF640081FFFFFFFFDA0032FFFFFF2400ECFFFFFFFFB0001FFAFFFFFFFFFFFFFFFF
+A80036FFFFFFFF880003FFFFFF300096FFFFFFFF3C0035FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E9EFFFFFFFFFFFFFFFFFE
+D4BDEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF52D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3600A5FFFFFFFFFFFFFFFF9A0036FFFFFA06009BFFFFB9160200E5FFFFA4004AFFFFFF27
+00E5FFFFFFFF7A0073FFFFFFFFFFFFFFFFFFFFFFFF7A0046FFFFFFFFFFFF640081FFFFFF
+FFDA0032FFFFFF2400ECFFFFFFFFFF41003DE2FFFFFFC051F1FFE20203B1FFFFA9100203
+FFFFFFAC0016C9FFFF7D030035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCF20EFFFFFFF3B6AFFFFFFFFFFFFFF7D0D0000B2FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06B7
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3600A5FFFFFFFFFFFFFF
+FF9A0036FFFFFF700000131A01472B00E5FFFFA4004AFFFFFF2700E5FFFFFFFF7A0073FF
+FFFFFFFFFFFFFFFFFFFFFF7A0046FFFFFFFFFFFF640081FFFFFFFFDA0032FFFFFF2400EC
+FFFFFFFFFFE5380004191F0B0000EDFFFF5A0000171701591E03FFFFFFFF620103201303
+740035FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
+00EBFFFFFF3B6AFFFFFFFFFFFFFFAC9FB500B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF855ACFFFFFFFFFFFFFFFFFC75A86FFFFFFFF973D
+2A4B84FF7E5AF3FFFFCD5A94FFFFFF7A5AF3FFFFFFFFB45AB0FFFFFFFFFFFFFFFFFFFFFF
+FFB45A91FFFFFFFFFFFFA55AB9FFFFFFFFEC5A83FFFFFF785AF6FFFFFFFFFFFFFF995131
+2B406DCFFFFFFFFF893A2B4F8FFF735EFFFFFFFFFF9C482D55AAE85A85FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE53C00464B83FF3B6A983C36
+92FFFFFFFFFFDB00B2FFFFFFFFFFFFFFFFA46EBD4D29FF6DA6FFFFFF878AFFFF6AA98938
+39A1FFFFFF58BC79323FB5FFFFFF4BCEFFE04BD85F2D4DD7FFFFFFCE4C2E61C74BEFFFFF
+FFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFABDFAFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF3800097A2C1FF3B1E34925E01B4FFFFFFFFDB00B2FF
+FFFFFFFFFFFFFF7A13217493FF2C7BFFFFFF5054FFFF281E3D965301CAFFFF0F20489843
+07E3FFFE00B5FFD0002A5F922A26FEFFE00B3199551E00E6FFFFFFFFFFFFFFFFFFFFFF71
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF9C12427DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFC600EBFFFFFF3B12FBFFFF2861FFFFFFFFDB00B2FFFFFFFFFFFFFFFF7A00C3
+FFFFFF2C7BFFFFFF5054FFFF2822FFFFFF1577FFFF0F3BFFFFF40694FFFE00B5FFD00073
+FFFFB700D6FF6F0FFDFFFF5300E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFCD81818181818181ADFFCDADFFCD81818181
+818181ADFFCDADFFCD81818181818181ADFFCDADFFCD81818181818181ADFFCDADFFCD81
+8181814D0B000F2F54B2FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFF
+FF3B57FFFFFF5C47FFFFFFFFDB00B2FFFFFFFFFFFFFFFF7A12FEFFFFFF2C7BFFFFFF5054
+FFFF286CFFFFFF475CFFFF0F89FFFFFF2D78FFFE00B5FFD000C9FFFFF900B6FF4447FFFF
+FF9600E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFBF6161616161616198FFBF98FFBF6161616161616198FFBF98FFBF61
+61616161616198FFBF98FFBF6161616161616198FFBF98FFBF61616161450B000624428C
+EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B6AFFFFFF6044FFFF
+FFFFDB00B2FFFFFFFFFFFFFFFF7A2DFFFFFFFF2D7BFFFFFF4D54FFFF2880FFFFFF4C59FF
+FF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FF3F52FFFFFFA200E6FFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF0F335DC1FEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFD100E3FFFFFF3B6AFFFFFF6044FFFFFFFFDB00B2FFFFFFFFFF
+FFFFFF7A2DFFFFFFFF3D56FFFFFE1554FFFF2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE
+00B5FFD000E0FFFFFF00B3FF6316FFFFFF5D00E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFAA9EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFE1385E6F3FF3B6AFFFFFF6044FFFFEECFB30092CFE6FFFFFFFFFFFF7A2DFFFFFFFF6E
+15C6EB760354FFFF2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00
+B3FFD00253C57C1900E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE2B4DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D31034BFF3B6AFF
+FFFF6044FFFF9300000000006FFFFFFFFFFFFF7A2DFFFFFFFFE82B00064E4D54FFFF2880
+FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FFFFAD280C3C8D01F6
+FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF604646C5FFFFFFFFFFFF8E46468AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B006A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDBEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E19FFFFFFFFFFFFFFFFFFFFFF
+FF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D000052FFFF
+FFFFFFFF1C000053FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B006AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF79B4BF680C7DFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00120EFAFFFFFFFFB200120053FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFF1D7EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A
+26193184FDFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D3FB8FFFFFFFFFFC03F80FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1D00590094FFFFFFFF4B01570053FFFFFFFFFFF8CFC5F6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFAC6F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5C0094FFFFFFFFFFA1004BFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1D00BD0438FFFFFFF40B2B730053FFFFFF9B2A0300000229BDFFFFFFFF810971FFFFFF1A
+13EC3607000241EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5C0094FFFFFFFFFFA1004BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00D73804E3FFFF8800
+80730053FFFFFF581A557879430307D8FFFFFF7B006AFFFFFF10072422624D09004AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C0094FFFFFFFFFFA1
+004BFFFFFFE77451516AACFDFFFFFFFFAA6B517DE0FFFFFFFF9994FFAC674FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00D7940072FFFF3008EF730053FFFFFFE5FFFF
+FFFFFF88004CFFFFFF7B006AFFFFFF100036FBFFFFE00203E8FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C0094FFFFFFFFFFA1004BFFFFBD0B000C1C0A
+00D7FFFFE83D000C12000E9EFFFFFF211861000B06FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1D00D7FA0F22FFD70244FF730053FFFFFFFFFFFFFFFFFFFF0925FFFFFF7B
+006AFFFFFF1000C0FFFFFFFF2400BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5C0094FFFFFFFFFFA1004BFFFF3602A9FFFFFDA1EDFFFF46027BFFFF9A
+1710EFFFFF21021CC3FFF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00D7FF
+5200BF6500A6FF730053FFFFFFFFA63F23110D0D0210FFFFFF7B006AFFFFFF1004FBFFFF
+FFFF51009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C0094
+FFFFFFFFFFA1004BFFFF2910FBFFFFFFFFFFFFC90248FFFFFFFF71007EFFFF2100AEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00D7FFBD00531916FFFF730053
+FFFFFF66000A3A4E5A5A0A0BFFFFFF7B006AFFFFFF100BFFFFFFFFFF58009AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C0094FFFFFFFFFFA1004BFFFF
+76002575D7FFFFFFFF8A00589491908F780054FFFF2109FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1D00D7FFFF21060060FFFF730053FFFFE00217E5FFFFFFFF
+070BFFFFFF7B006AFFFFFF100BFFFFFFFFFF58009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5F008EFFFFFFFFFF9A004FFFFFF36F150002349CFFFF68
+000304040404040441FFFF2118FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1D00D7FFFF710001CFFFFF730053FFFF9C004DFFFFFFFFC0000BFFFFFF7B006AFFFF
+FF100BFFFFFFFFFF58009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF7D0073FFFFFFFFFF7D006EFFFFFFFFFBAA4F0D01C6FF80008FFFFFFFFFFFFFFFFF
+FF2118FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00D7FFFFEFB4BC
+FFFFFF730053FFFFAE001CFFFFFFFD36000BFFFFFF7B006AFFFFFF100BFFFFFFFFFF5800
+9AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA003BFFFFFFFF
+FF46009BFFFFFFFFFFFFFFA8005AFFB8004BFFFFFFFFFFFFFFFFFF2118FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00D7FFFFFFFFFFFFFFFF730053FFFFF315
+0037867F29150C0BFFFFFF7B006AFFFFFF100BFFFFFFFFFF58009AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD24028AFFFFFF9A041CFBFFFF8CF1FFFF
+FF7C0065FFFF350286FFFFFFFFA5CAFFFF2118FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1D00D7FFFFFFFFFFFFFFFF730053FFFFFFB51900000122D5150BFFFF
+FF7B006AFFFFFF100BFFFFFFFFFF58009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFBC1500182C1A0110AEFFFFFF0E0A2B3D1E0216E0FFFFD826001B
+372D13009BFFFF2118FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8BFA6E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFEF6D442E4267E8FFFFFFFFA95E3A2C3B6BEAFFFFFFFFFD844B2E3853A3FBFFFF766FFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7E9EFFFFFFFFFFFFFFFFC79EA9E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52D0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF20EFFFFFFF3B6AFF
+FFFFFFFFFFFA1803200A078BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B6AFFFFFFFFFFFFFA7EEEFFF4
+5B03DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFE53C00464B83FF3B6A983C3692FFFFFFFFFFFFFFD000ADFFFFFFFFFFFFA4
+6EBD4D29FF6DA6FFFFFF878AFFFF6AA9893839A1FFFFFF58BC79323FB5FFFFFF4BCEFFE0
+4BD85F2D4DD7FFFFFFCE4C2E61C74BEFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFAAAEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3800097
+A2C1FF3B1E34925E01B4FFFFFFFFFFFFA301D8FFFFFFFFFFFF7A13217493FF2C7BFFFFFF
+5054FFFF281E3D965301CAFFFF0F2048984307E3FFFE00B5FFD0002A5F922A26FEFFE00B
+3199551E00E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA90C315EC2FE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B12FBFFFF2861
+FFFFFFFFFFE8185DFFFFFFFFFFFFFF7A00C3FFFFFF2C7BFFFFFF5054FFFF2822FFFFFF15
+77FFFF0F3BFFFFF40694FFFE00B5FFD00073FFFFB700D6FF6F0FFDFFFF5300E6FFFFFFFF
+FFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+C269696969696969696969696969696969696969696969699DFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFC26969696969696969470B0006102B90EEFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B57FFFFFF5C47FFFFFFFFEE2C33F4FFFF
+FFFFFFFFFF7A12FEFFFFFF2C7BFFFFFF5054FFFF286CFFFFFF475CFFFF0F89FFFFFF2D78
+FFFE00B5FFD000C9FFFFF900B6FF4447FFFFFF9600E6FFFFFFFFFFFFFFFFFFFFFF715AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFC9797979797979797979
+7979797979797979797979797979A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFC979797979797979794A0B00091535A7F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFC600EBFFFFFF3B6AFFFFFF6044FFFFFFF1312BEDFFFFFFFFFFFFFFFF7A2DFFFFFF
+FF2D7BFFFFFF4D54FFFF2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFF
+FF00B3FF3F52FFFFFFA200E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+9D0E3971D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD100E3FFFFFF3B
+6AFFFFFF6044FFFFF43728E9FFFFFFFFFFFFFFFFFF7A2DFFFFFFFF3D56FFFFFE1554FFFF
+2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FF6316FFFFFF5D
+00E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC68D99CFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5150FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5546EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB6F6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1385E6F3FF3B6AFFFFFF6044FFFA3B14
+B8CFCFCFEDFFFFFFFFFFFF7A2DFFFFFFFF6E15C6EB760354FFFF2880FFFFFF4C59FFFF0F
+9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FFD00253C57C1900E6FFFFFFFFFFFFFFFF
+FFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFB6807000000001B7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
+1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1000DDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF8D31034BFF3B6AFFFFFF6044FFE40000000000008FFFFFFFFFFF
+FF7A2DFFFFFFFFE82B00064E4D54FFFF2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5
+FFD000E0FFFFFF00B3FFFFAD280C3C8D01F6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF427002783
+B9B1782800F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF201FFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1000DDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDB
+EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5E19FFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63004CFBFFFFFFFFFD72F8FFFFFFFF
+FFEAFFFFFFFFFFFFFFFFFFFAF6FFFF201FFFFFFFFFFFFFFDEDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1000DDFFFFFFFFFFFFFFFFFFFFFFDAD2FFFFFFFFFFFFFFFF
+FFFFE8C7FBFFFFFFFFFFFFFFFFFFFFFAC7F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79B4BF680C7DFFFFFF
+FFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFDF070DECFFFFFFFFFFFFFFFFFFFFE5410D000C3CE0FFFFFFFFDD
+34070529C2201FFFFFFFFFB0290801166BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1000DDFFFFFFFFFFFFFFFFFA5D0D00000A4EF3FFFFFFFFFF871501000633D7FFFFFF
+FF2609ED390700053FF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A26193184FDFFFFFFFFFFFFFFFFFFFFFFFF71
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+99004BFFFFFFFFFFFFFFFFFFFFF1170251854F0213ECFFFFEF150358854B10111FFFFFFF
+87021E73751F004BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1000DDFFFFFFFFFF
+FFFFFF31001E6C71260021FAFFFFFF62000E5F7A3B000BD2FFFFFF1D00291C6B7124002A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E006CFFFFFFFFFFFFFF
+FFFFFF64006FFFFFFF7B005CFFFF680080FFFFFF62001FFFFFEA0E22F8FFFFFF3602C6FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1000DDFFFFFFFFFFFFFF930021EDFFFFF82F
+0076FFFFD2060ACCFFFFFF5A0041FFFFFF1D001EECFFFFF62B0091FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF530085FFFFFFFFFFFFFFFFFFFF220CF8FFFFFFFA
+0E1CFFFF240FFBFFFFFFEA031FFFFF8C0084FFFFFFFF8F0079FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1000DDFFFFFFFFFFFFFF330094FFFFFFFFB20021FFFF640058FFFFFF
+FFED0A02F3FFFF1D0087FFFFFFFFA60033FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF720068FFFFFFFFFFFFFFFFFFFF0D24FFFFFFFFFF2906FFFF0E29FFFFFFFF
+FF141FFFFF65001A21201F1E1A0053FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1000
+DDFFFFFFFFFFFFFF1900E8FFFFFFFFFF0609FFFF430096FFFFFFFFFF2B00BDFFFF1D00CF
+FFFFFFFFF80219FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E0046FF
+FFFFFFFFFFFFFFFFFF0A27FFFFFFFFFF2D03FBFF0B2CFFFFFFFFFF181FFFFF5B004C6262
+626262629AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1000DDFFFFFFFFFFFFFF0806
+FFFFFFFFFFFF1500ECFF2E00B6FFFFFFFFFF3E0099FFFF1D00F3FFFFFFFFFF0E09FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE50A09E2FFFFFFFFFFFFFFFFFF1E
+10FFFFFFFFFF1518FFFF2015FFFFFFFFF8061FFFFF840087FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1000DDFFFFFFFFFFFFFF1800EAFFFFFFFFFF0708FFFF
+410099FFFFFFFFFF2D00BBFFFF1D00D4FFFFFFFFFB0318FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF72003DF1FFFFFFFFF153F8FF4F0095FFFFFF9E0049FFFF
+53009FFFFFFF7B001FFFFFD50722FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1000DDFFFFFFFFFFFFFF31009FFFFFFFFFBF001FFFFF620060FFFFFFFFF40D01
+F1FFFF1D0091FFFFFFFFB20030FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFB370018629089591700F6FFE00A0978B87B0B09DAFFFFDD080C87C2780B0B1FFF
+FFFF7000248EBDA67626B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1000DDFFFFFF
+FFFFFFFF88002DFAFFFFFD3A006DFFFFCA0410E0FFFFFF6B003AFFFFFF1D0025F8FFFFFD
+350085FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8015010000
+012CA0FFFFFFC6240000001FBFFFFFFFFFB51400000B99201FFFFFFFFF8E13000000032D
+D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF100033393939393939CFFF2800297C81
+30001AF6FFFFFF560016708C490107C9FFFFFF1D001E29848A330022FDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFB4BFF4FFFFFFFFFFFFFFE3AE
+E0FFFFFFFFFFFFFFFFC7C2FFFFFFFFFFFFFFFFFFFFDDAAC0EDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF100000000000000000B9FFF34A030000023CE7FFFFFFFFFF7107
+00000023C6FFFFFFFF1D00E02701000133E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFF4B6B0F1FFFFFFFFFFFFFFFFFDC5A6E3FFFFFFFFFFFF1D
+00FFFFE5A8E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF1D00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E9EFFFFFFFFFFFFFFF8BD
+9CA0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF52D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCABFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCF20EFFFFFFF3B6AFFFFFFFFFFFFFF390A240F0058FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06B7
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
+00EBFFFFFF3B6AFFFFFFFFFFFFFFD5FBFFFE8B00AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE53C00464B83FF3B6A983C36
+92FFFFFFFFFFFFFFEB029BFFFFFFFFFFFFA46EBD4D29FF6DA6FFFFFF878AFFFF6AA98938
+39A1FFFFFF58BC79323FB5FFFFFF4BCEFFE04BD85F2D4DD7FFFFFFCE4C2E61C74BEFFFFF
+FFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9DDCFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF3800097A2C1FF3B1E34925E01B4FFFFFFFDF5CA5815
+F0FFFFFFFFFFFF7A13217493FF2C7BFFFFFF5054FFFF281E3D965301CAFFFF0F20489843
+07E3FFFE00B5FFD0002A5F922A26FEFFE00B3199551E00E6FFFFFFFFFFFFFFFFFFFFFF71
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFBC0F3054ADF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFC600EBFFFFFF3B12FBFFFF2861FFFFFFAD000016DEFFFFFFFFFFFFFF7A00C3
+FFFFFF2C7BFFFFFF5054FFFF2822FFFFFF1577FFFF0F3BFFFFF40694FFFE00B5FFD00073
+FFFFB700D6FF6F0FFDFFFF5300E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFBC5A5A5A5A5A5A5A5A5A5A5A92BC5A5A5A5A
+5A5A5A5A5A5A5A92BC5A5A5A5A5A5A5A5A5A5A5A92BC5A5A5A5A5A5A5A5A5A5A5A92BC5A
+5A5A5A440A00020E247DE8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFF
+FF3B57FFFFFF5C47FFFFFFF5D8A94B12D7FFFFFFFFFFFF7A12FEFFFFFF2C7BFFFFFF5054
+FFFF286CFFFFFF475CFFFF0F89FFFFFF2D78FFFE00B5FFD000C9FFFFF900B6FF4447FFFF
+FF9600E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFD08989898989898989898989B3D08989898989898989898989B3D089
+89898989898989898989B3D08989898989898989898989B3D089898989490B010D1D45C6
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B6AFFFFFF6044FFFF
+FFFFFFFFF51176FFFFFFFFFFFF7A2DFFFFFFFF2D7BFFFFFF4D54FFFF2880FFFFFF4C59FF
+FF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FF3F52FFFFFFA200E6FFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E15458FEEFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFD100E3FFFFFF3B6AFFFFFF6044FFFFFFFFFFFFF8145EFFFFFF
+FFFFFF7A2DFFFFFFFF3D56FFFFFE1554FFFF2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE
+00B5FFD000E0FFFFFF00B3FF6316FFFFFF5D00E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFE1385E6F3FF3B6AFFFFFF6044FFF58AE2FBC66000ACFFFFFFFFFFFF7A2DFFFFFFFF6E
+15C6EB760354FFFF2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00
+B3FFD00253C57C1900E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D31034BFF3B6AFF
+FFFF6044FFF423000100148DFFFFFFFFFFFFFF7A2DFFFFFFFFE82B00064E4D54FFFF2880
+FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FFFFAD280C3C8D01F6
+FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEACEE2
+FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDBEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E19FFFFFFFFFFFFFFFFFFFFFF
+FF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF79B4BF680C7DFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A
+26193184FDFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+7CD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+C684FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+96C7FFFFFFF8D7F8FFFFFFFFCF90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A61FFFFFFFF029BFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C0DFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA46D5FFFFFFFFD409DAFFB82A0200023AE2
+FFFFE509C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF671FFFFFFFFF029BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFDB00BCFFFFFFFF4D41FFFF934DAEDA840B37FFFFFF4742FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFAE2FEFFFFFF517BFFFFFFFFFFFFFFFFFFFFCF79B4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19BEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA835363C3FFFFFFFF
+D4704E62B9FFFFFF945761B4FFFFFFA696D06E59FFFFAC615593FFFFFFFFFFFFFFFFFFBF
+36127272BFFF029B9E5668E3FFFFED72E38E54B0FFE876516CDDFFFFFFB8674C61B8FFFF
+FFFFDF6A58A47C0DFFFFFFFFFFFFFFFFFFA994D26C5FC2FFCD6C59BFFFFFFFC66D4E5CA8
+FFFFFF8A97FFFFFFA67AFDFFFFFFFFFFFFFFFFE0864E5999FFFFFFDD725071E8FFFB6600
+59728DFFDF06B4FFFFFFFFFFFFFF5308FFFFFFBC03D0FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B6AFF
+FFFFFFFFFFFFFFFFFA2B0467FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED240D4626069AFFFF970910504038FFFF3D0136
+220273FFFF4C1E12304BFF620431400549FFFFFFFFFFFFFFFFAA260D4C4CA9FF02331244
+0D19FAFFD5003212489CC914154B190EC6FFFF1E425726048FFFFFD5130B460D2C0DFFFF
+FFFFFFFFFFFFFF511C163B1E09A0133D1A06CCFFFF2E3D582D0373FFFF9903A8FFC50871
+FFFFFFFFFFFFFFFFEF0C2E584B2BFFFFB40E1A4C1314DDFA45003D4C6DFF8E06FFFFFFFF
+FFFFFFFF5413FFFFFFFF0981FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B6AFFFAF9FFFFFFFFFFFF7844
+2267FFFFFFFFFFFFFFFFFFFFFFEEFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBFFFFFFFFFFFFFF
+F5FDFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFF4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF590EF3FFFF4D17FFF1113DFAFFFFFDFF9E0093FFFF5308E2FF4C00A9FFFF
+BB0294FFFFAD00B0FFFFFFFFFFFFFFFF671FFFFFFFFF0226FBFFC5009EFFD50036FAFFFF
+3328FFFFFF2938FFFFFBFFFFFF4720FFFF4F15ECFFEC120DFFFFFFFFFFFFFFFFFF5100B5
+FFFF1301C0FFFD0B62FFFFFBFFFFFF620DFFFFFF5612D51E37FFFFFFFFFFFFFFFFFF7B15
+FFFFFFFFFFFF213AFFFFFB194CFFDB00BCFFFFFF601BFFFFFFFFFFFFFFC5086CFFFFFFFF
+2258FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFDC0F0012135AFF3B6658090553FAFFFFFFCF12DF2267FFFFFFFFFFFFFF86
+3E851400FE3D87FFFFFF5F62FFFF39824B060661FFFFFF23933C040A7AFFFFFF13BCFFD5
+13AE250115A9FFFFFF961402279B13E9FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F379F9F
+9F6D00E5B20099FFFFFFFFFF5A09FAFFFFB2009AFF4C11FFFFFF680B9E9F9F9F0C71FFFF
+FFFFFFFFFFFF671FFFFFFFFF0271FFFFFF1076FFD50080FFFFFB04549F9F9F4C12FFFFEC
+7B53462F06FFFF1E46FFFFFF420DFFFFFFFFFFFFFFFFFF5117FFFFFF391CFFFFFF3247FF
+FFF48557463900DFFFFFFA250A15E7FFFFFFFFFFFFFFFFFFB80152ADFFFFFFDD00669F9F
+9F3D22FFDB00BCFFFFFF3A34FFFFFFFFFFFFDB1832FDFFFFFFFF3D36FFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFA89C0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB700D9
+EBF3FF3B086DD99F0694FFFFFD3089FF2267FFFFFFFFFFFFFF7A073DB7DBFF2C7BFFFFFF
+5054FFFF280A7ADD9200ACFFFF0F1286DF7A01CBFFFE00B5FFD00027A0D94F13F8FFC500
+6ADF941900E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D182D2D2D2D2DD49100E5FFFFFF
+FFFF4726FFFFFFF6027CFF4C32FFFFFF4E092D2D2D2D2D7FFFFFFFFFFFFFFFFF671FFFFF
+FFFF029BFFFFFF1A6FFFD500BFFFFFD800212D2D2D2D32FFE2131E4B6D4C00FAFF0F70FF
+FFFF6B0DFFFFFFFFFFFFFFFFFF5130FFFFFF4336FFFFFF3D42FFF41F18476A5C00C9FFFF
+FF670056FFFFFFFFFFFFFFFFFFFFFF9A3004187FFFB400262D2D2D2D40FFDB00BCFFFFFF
+452DFFFFFFFFFFE21C28F1FFFFFFFFFF353FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB0E21408AE9
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B22FFFFFF3759
+FFFF8032FEFF2267FFFFFFFFFFFFFF7A00D8FFFFFF2C7BFFFFFF5054FFFF2835FFFFFF24
+6EFFFF0F4FFFFFFD0E8BFFFE00B5FFD00089FFFFCA00CBFF5E1AFFFFFF6200E6FFFFFFFF
+FFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF2036FFFFFFFFFFFFB9008DFFFFFFFFFF5F06F4FFFFA600A0
+FF4C33FFFFFF6905E5FFFFFFFFFFFFFFFFFFFFFFFFFF6A1EFFFFFFFF029BFFFFFF1A6FFF
+D500C2FFFFFB045EFFFFFFFFFFFF8007E2FFFF5900FAFF2140FFFFFF3C0DFFFFFFFFFFFF
+FFFFFF5130FFFFFF4336FFFFFF3D42FFA402C3FFFF7700C9FFFFB6044703ADFFFFFFFFFF
+FFFFFFFFFFFFFFE55F03DBDF0077FFFFFFFFFFFFE000B9FFFFFF6D15FFFFFFFFE52024EC
+FFFFFFFFFFFF1A64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+B24343434343434343434343434343434343434343434343434343434343434343434343
+43434343434343434343434343434343434343434337080000071566E5FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC600EBFFFFFF3B62FFFFFF6045FFD50DCEFFFF2267FFFF
+FFFFFFFFFF7A1EFFFFFFFF2C7BFFFFFF5054FFFF2878FFFFFF4C5AFFFF0F96FFFFFF3176
+FFFE00B5FFD000D7FFFFFF00B4FF3D56FFFFFFA700E6FFFFFFFFFFFFFFFFFFFFFF715AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF6703B5FFFFFFC5FFFA1A2FDFFFFFE7FFB40174FFF1410EEFFF4C33FFFFFFC7055CF8
+FFFFDBE7FFFFFFFFFFFFFFFFA107F8FFFFFF029BFFFFFF1A6FFFD500C2FFFFFF3D13D2FF
+FFFDC7FF9905E3FFD71600FAFF5B10D0FFCF0E0DFFFFFFFFFFFFFFFFFF5130FFFFFF4336
+FFFFFF3D42FFC001C3FFE32400C9FFEC1746FF5114E5FFFFFFFFFFFFFFFFCAF8FFFFB902
+C9FF2B1FDDFFFFFACAFFFF1286FFFFFF9E02F8FFFFEA2322E8FFFFFFFFFFFFFB048FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFDBA2A2A2A2A2A2A2A2A2
+A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2
+A2A2A2A2A2A2A2A2A2A2A249080414275DDCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFC600EBFFFFFF3B6AFFFFFF6044FF8309272727061227FEFFFFFFFFFF7A2DFFFFFF
+FF2E78FFFFFF4454FFFF2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFF
+FF00B3FF4742FFFFFF9000E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA41001B361B1DFF
+FFAE120430262EFFFF5D011C0E0891FFFF4C33FFFFFFFF85090B362804BCFFFFFFFFFFFF
+FFFFF61C081C8AFF029BFFFFFF1A6FFFD500C2FFFFFFE029012532133FFFFD1D0E310648
+00FAFFE522032E083D0DFFFFFFFFFFFFFFFFFF5130FFFFFF4336FFFFFF3D42FFFF300A33
+074B00C9FF3E1DF1FFF62138FFFFFFFFFFFFFFFF4E0E33350D4FFFFFCF20022A300F54FF
+FF59071841FFF41193FFFF7500090D0D0D0DE5FFFF9A0CEDFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+7B1A4FABF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE00D8FFFFFF3B
+6AFFFFFF6044FFD29A9A9A9A16429AFFFFFFFFFFFF7A2DFFFFFFFF4446FFFFF40A54FFFF
+2880FFFFFF4C59FFFF0F9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FF760BF9FFFF4D
+00E6FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB87F7597F3FFFFFFEA94738DE5FFFFFF
+BC7C87D5FFFFFFC5BBFFFFFFFFFFDA8E7286D5FFFFFFFFFFFFFFFFFFFFFFD8A0D5FFA0E3
+FFFFFFADD4FFF49FEFFFFFFFFFFFA67879A5FBFFFFFFA87FC6E59FFFFFFFF4957EC9D8A6
+FFFFFFFFFFFFFFFFFFC7B8FFFFFFC2BBFFFFFFBFC0FFFFFFB57CBBF39FF1F49FD8FFFFFF
+DA9FF3FFFFFFFFFFFFFFF6A87A86DFFFFFFFFFFAA0767BAEFDFFFFFFF3A9B4FFFF6E2AFF
+FFD59F9F9F9F9F9FF8FFFF3061FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADDFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20539EC1FF3B6AFFFFFF6044FFFFFFFF
+FFFF2267FFFFFFFFFFFFFF7A2DFFFFFFFF880A81A8411354FFFF2880FFFFFF4C59FFFF0F
+9EFFFFFF3175FFFE00B5FFD000E0FFFFFF00B3FFE9131E803F2400E8FFFFFFFFFFFFFFFF
+FFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10EB6FFFFFFFFFFFFFFFFFFFF
+C50AE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC16C3973FF678CFFFFFF856EFFFFFFFFFFFF528AFFFFFFFFFFFF
+FF995CFFFFFFFFF9641B2A8C787BFFFF579EFFFFFF747FFFFF42B5FFFFFF5E94FFFF35C7
+FFDC35E9FFFFFF36C6FFFFDE6243799204FDFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+776A6A6A6A6A6ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF706A6A6A6A6A6AC9FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB46A6A6A6A6A6A7FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFE3EDFFFFFFFFFFFFFFFFFFFFF1E2FFFFCCFBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF4C29FFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B4C4C4C4C4C4CAEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF534C4C4C4C4C4CBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFA14C4C4C4C4C4C65FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF931155BFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44717B2D03A7FFFFFF
+FFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF210000216FDFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA260516CC5FFFFFFFFFFFFFFFFFFFFFFFFFF71
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF560000000003348DF6FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFA727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+7272727272727272727272727272727272727272727272727272723F0000000000000007
+29AEFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFF846464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+46464646464646464646464646464646462B00000000000000000F76EFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5D0000000000165DCAFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF300000
+0A47A9FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0033389F4FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFB0DFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF715AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A0000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000005AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CCFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB63C1C192C5BFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFA0B6FFFFFF9B01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBE0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCA
+F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8
+ECFFECD7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFDBFFFFFFFFFFFFFFC3072C78996B22FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+2B55FFFFFF9B01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3B3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FA83E0FFFFFF4A36FFFFFFFFFFFFFFCF71412D93FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC83EDFFFFFF3649FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE800A6FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00ACDFFCD09E0FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFF
+FFFFFF6307E5FFFFFFFFFFFFE8C5FFC695DAFFFFFFFFE09A90C3FFFFFFDBD0FFFFF3BFE8
+FFFFDAD0FFE3C9FFC594D8FFFFFFFFFAAA8EB8FFFFFFFFFFFFD42445BFBFF89B01FFD093
+CCFFFFFFE5C6FFC98FF4FFF6B291CDFFFFFFFFECA08DB6FFFFFFFFFFEFA0AEFA3B3DFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A36FFFF
+FFFFFFFFFF6C16380273FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFC700CFFFFFFF3649FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFE800A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5938FFFFFF3659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7804DDFFFFFFFF
+FFFF860B49090E0589FFFF97071F190042FFFF7A13FFFF84005BFFFF2E4CFF7316450A0C
+0699FFFF930B18260C78FFFFFFFFFF51070D1C1CD79B016306100278FFFF7A12470517D8
+BD1A051A0157FFFFC5071C1E012BF1FFFFC3150413202F3DFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB50086BFCAFF4A36FBB599E7FFFFFFFFFFFF0473
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAA599DFFFFFFFFFFFD4
+959AE3FFFFFFF4AD96DAFFFFFFEFBFFFD491E3FFFBBB90C2FFFFFFFFFFFFFFFFFFFB9A00
+9EBFD0FF3649FAAD9CEDFFFFFFCCE0F3A9AAFFFFDF9BA3ECFFFFFFFFC99399D8FFFFFFFF
+FFD094D2E800A6FFFFFFFFFFFFFFFFEFBFFFD591E0DAD2FFFFFFE5C7FFFFDAD2FBB599E7
+FFFFFFE709A8FFFFFFA109E7FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA0A0A4685F3FFFFFF86003CE5F15009E2
+FFD8E5FFFFAE0196FFCF00C7FF441826FFF4068FFF730051EFF43424FFFF2169FFFFFAE2
+FFFFFFFFFFFF2B55FFFFFF9B0039E2FB4D0DFFFF7A0046E2FFFA1C3CE8FFA60197FFE8D7
+FFFFD00A6CFFFF2E27D2FB70003DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1E00161C3AFF4A2E2A10060EC2FFFFFFFFFF0473FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF930B0B130785FFFFF64601131D04EDFFB415041203
+65FFFFA000620319AAD426021C013FFBFFFFFFFFFFFFFFE71800191C4AFF363A1F120414
+D7FFFF2246121241FF6D04130B10ACFFFF570B240E0477FFFFFF6E0212055A00A6FFFFFF
+FFFFFFFFFFA600620219A44F31FFFFFF7516FFFF4B2D2B10060EC0FFFF870AFFFFFFFFFF
+0787FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFE7691A010E64FFFF8600A8FFFFD20081FFFFF6AC8883185BFFFF
+1674FF138703ECA102E7FF7302DAFFFF7F07FFFF263ACDFFFFFFFFFFFFFFFFFF2B55FFFF
+FF9B00AAFFFFAA00D8FF7A00C3FFFFA901C0FFFFFF294BFFFFFDB58C83293AFFEA0079FF
+FFFA093DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFF
+FFFF4A0075FAE51B45FFFFFFFFFF0473FFFFFFFFFFFFFFFFD0171717171717171750FFFF
+FFFFFFFFD50767F8FB6B07D5FF640794FBFFD2FAFD1D29D4F86900ADFFA00033D5FFFF31
+29DDFFC00973FFFFFFFFFFFFFFFFC700CFFFFFFF36008DFDDD1059FFFF220397FDFFA401
+94FFF14617F8FFC9F8FFFD6906E2FFC7026BFAD72A00A6FFFFFFFFFFFFFFFFA60030D2FF
+FF4F31FFFFFF7516FFFF4B0074FAE71C44FFFF5A20FFFFFFFFFF1E5CFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFF
+FFFFFFCD4200BCFF8603F8FFFFFF1361FFAD0F0D27391148FFFF4638C906F61B945922FF
+FF7316FFFFFFA000FDFFAE2A011F79F3FFFFFFFFFFFF2B55FFFFFF9B01FFFFFFD200C3FF
+7A0EFFFFFF7E00040404040439FFD018092338192AFFBB00C3FFFFFF2E3DFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A0FFDFFFF5422FF
+FFFFFFFF0473FFFFFFFFFFFFFFFFEF9595959595959595B6FFFFFFFFFFFF690EF6FFFFF3
+0984FF1836FFFFFFFFFFC20086FFFFFA0A50FFA00097FFFFD80096FFFFFF4132FFFFFFFF
+FFFFFFFFC700CFFFFFFF361DFFFFFF4033FFFF2229FFFFFF3F29FFFFFFC200BFFFFFE5A1
+857B02A3FF6607F6FFFF7F00A6FFFFFFFFFFFFFFFFA60091FFFFFF4F31FFFFFF7516FFFF
+4B0EFBFFFF5522FFFF363AFFFFFFFFFF3A3AFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFF1075BFF8600
+CAFFFFEF0473FF2B2EFFFFFF1747FFFF870C752EFF4E502457FFFF7317FFFFFFA000FDFF
+FFFFCC670B63FFFFFFFFFFFF2C55FFFFFF9B01FFFFFFD200C3FF7A12FFFFFF9301CCFFFF
+FFFFFFFF4917FAFFFF3129FFD50095FFFFFF163DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A34FFFFFF6F1AFFFFFFFFFF0473FFFFFFFF
+FFFFFFFFFBE3E3E3E3E3E3E3E3EDFFFFFFFFFFFF480104040404046AFF0478FFFFFFFFFF
+9A00DBFFFFFF3134FFA000F1FFFFA500040404040422FFFFFFFFFFFFFFFFC700CFFFFFFF
+3647FFFFFF582AFFFF225BFFFFFF240204040404049BFF7307132E390387FF4A29FFFFFF
+CA00A6FFFFFFFFFFFFFFFFA600E8FFFFFF4F31FFFFFF7516FFFF4B33FFFFFF7019FFFF2F
+40FFFFFFFFFF4033FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6F4FFFFFFB6006AFF860075FFFF9600B6FF2358FF
+FFB20047FFFFDF011A67FF9117039EFFFF7317FFFFFFA000FDFDFDFFFFFF4331FFFFFFFF
+FFFF483EFFFFFF9B01FFFFFFD200C3FF7A12FFFFFFDA0759FFFFFFFFFBFF4037FFFFE203
+29FFFF124FFFFFCC003DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFED00ADFFFFFF4A36FFFFFF6F1AFFFFFFFFFF0473FFFFFFFFFFFFFFFFC90000000000
+0000003AFFFFFFFFFFFF5812FBFFFFFFFFFFFF104FFFFFFFFFFFB100A5FFFFFF1844FFA0
+00FFFFFFBD00A3FFFFFFFFFFFFFFFFFFFFFFFFFFC700CFFFFFFF3649FFFFFF582AFFFF22
+63FFFFFF3130FFFFFFFFFFFFF80466FFFFD00187FF5912FFFFFF9C00A6FFFFFFFFFFFFFF
+FFA600F6FFFFFF5329FFFFFF5916FFFF4B35FFFFFF7019FFFF5226FFFFFFFFFF2455FFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF530E435F3E0F12DFFF86071A3F4D053FFFFF730A574D101947FFFFFF1E00B5
+FFEA0304F3FFFF7317FFFFFFA000FDEA1556775307A1FFFFFFFFFFFF8A073B4CE39B01FF
+FFFFD200C3FF7A12FFFFFFFF79032668622B7CFF9F034B5A102029FFFF80023059111A3D
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F8AFFFFFF4A36
+FFFFFF6F1AFFFFFFFFFF0473FFFFFFFFFFFFFFFFFAD7D7D7D7D7D7D7D7E5FFFFFFFFFFFF
+9B0095FFFFFFFFFBFF3A14F8FFFFFFFFEC0954FFFFC6007CFFA000FFFFFFF6103DFFFFFF
+FFFBFFFFFFFFFFFFFFFFF305A8FFFFFF3649FFFFFF582AFFFF2263FFFFFF6802D0FFFFFF
+FBFFE7039EFFFF680087FF9400C3FFFF5300A6FFFFFFFFFFFFFFFFA600F6FFFFFF7106F4
+FFFF1916FFFF4B35FFFFFF7019FFFF7D0EFFFFFFFFFF0C7DFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFE0814C3946
+6FE8FFFF860BD55A3F75FDFFFFFA974655BB8691FFFFFF8E5DFDFFFF7074FFFFFFB06EFF
+FFFFCC5AFFFB804B3A66B6FFFFFFFFFFFFFFFFC2725AE5C95CFFFFFFE85AE0FFB46AFFFF
+FFFFFFB4553A4373E2FFFFA94C4FA49E7CFFFFFF9F464DAA898AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E154667FF4A36FFFFFF6F1AFFFFC53939
+0120396CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4704346E5A1CC2FFCC
+0E0E53682AECFF71012E510722FAFFA000FFFFFFFF97061F6165355EFFFFFFFFFFFFFFFF
+FF2C1A4874FF3649FFFFFF582AFFFF2263FFFFFFF8270A41705116FFFF391866361D0787
+FFFF280957342100A6FFFFFFFFFFFFFFFFA600F6FFFFFFD80620591A2416FFFF4B35FFFF
+FF7019FFFFD003CAFFFFFFC303CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF860BFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF6A56474FF9485FFFFFFAD70FFFFD05A5A5A5A5A88FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF914D394986F6FFFFE2613D4377FBFFFF9C4B
+3E6BF4FFFFCC5AFFFFFFFFFFC9593B4169D4FFFFFFFFFFFFFFFFFFF39E6180FF8693FFFF
+FF9E7CFFFF76A5FFFFFFFFFB7A473A4F99FFFFEA7D4062E265BCFFFFF46A3E62DF5ACFFF
+FFFFFFFFFFFFFFCF5AFBFFFFFFFFB848448EB16DFFFF9485FFFFFFAD70FFFFFF424EFFFF
+FF4B41FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF860BFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC60AE7FFE709C5FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC77BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFACADBFFFFFFFFFFD4CAF4FFFFFFFFEDCAE5FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF3A64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4754FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C45FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2B4
+B4B4B4B4B4CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDB4B4B4B4B4B4CFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF97D4FFD497FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFF6061FFFFFFFFFF6060087FFFFFFFF600087FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0736FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF4E65FFFFFFFFFF1624FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF641C1C1C1C1C1C4FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF581C1C1C1C1C1C5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFD4980EFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFD4980EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B01E5FFFFFFA6
+00044AFFFFFFFF2B01DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0736FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF102AFFFFFFFFFF1624
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF2D13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A
+0007419FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A0007419F
+FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F008FFFFFFF61073F1AFFFFFFF6061AFF
+FFFFFFFFEAFFFFFFFFFFFFFFFFFFFFFFE8FBFF0736FFFFFFFFFFFFFFFFFFFFFFF8F4FFFF
+FFFFFFFFFFFFFFFFF3F1FFFFFFFFFFFFFF102AFFFFFFFFFF1624FFFFF6F6FFFFFFFFFFFF
+FFFFFFFFE7FBFFFFFFFFEFFDFFFFFFFFFFFFFFFFF6ECFFFFFFFFFFFFFFFFFFFBF3FFFF2D
+13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8040000001257C2FFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8040000001257C2FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFA5004FFFFFFF2C2E7D01DDFFFFA8004BFFFFE3400D000D3DE2FFFF
+FF8D17AA5C150071FF0736FFFFFFDA2C22C2FFFF881F04031E91FFFFFFE717629620032E
+FFFFFFFFFFE3170206171717E2FF1624C72B06032CCFFFFFFF7E17B953130080FFF85D17
+01072DC0FFFFFFE7461401000E51EDFFFFFFFFE73C090424B22D13FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C0000000000002270E0FFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1C0000000000002270E0FFFFFFFFFFFFFFFFFFFFFFFFFFF6
+061EFFFFF80662CC0089FFFF62008AFFEF150252854E0215EDFFFF7C0025185F70A3FF07
+36FFFFC21411BBFFFF5500327C6412007EFFFFE200200B51737AFFFFFFFFFFF3720A1772
+7272F1FF1613134B79300121FFFFFF6D00251C626EADFA25034B844B0805C5FFFFC71759
+806D2B0138FFFFFFFA1E025085520D1613FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF72000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000048FFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFF100000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000048FFFFFFFFFFFFFFFFFFFFFFFFFFF2B01E3FFA900A6FF124B
+FFFF2D01DFFF610072FFFFFF78005FFFFF7C0015ECFFFFFFFF0736FFA60B1CD4FFFFB802
+46FFFFFFFA1310F6FFE20001ADFFFFFFFFFFFFFFFFFFFF102AFFFFFFFFFF16007EFFFFFF
+3C00B4FFFF6D001CF3FFFFFF700085FFFFFFC6013AFFFFFBFFFFFFFFFF3A00BFFFFF7B00
+6DFFFFFF750013FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B000000
+0000022D80EFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B0000000000022D
+80EFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F008FFF6306F6FF3D1CFFF8071CFFFF200DF8FF
+FFFFFA0D1EFFFF7C0068FFFFFFFFFF073688042BE8FFFFFF5500C9FFFFFFFF5800BBFFE2
+0028FFFFFFFFFFFFFFFFFFFFFF102AFFFFFFFFFF160DFFFFFFFF780087FFFF6D0077FFFF
+FFFF2212FFFFFFFFFF240CFFFFFFFFFBD5B0A96C0086FFFF3207F3FFFFFFF60A13FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6040000001B66D5FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6040000001B66D5FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFA5004EFF2E29FFFF7701E0AA004CFFFF0B26FFFFFFFFFF2607FFFF7C0090
+FFFFFFFFFF070C0132F6FFFFFFFF36012220201F1E130089FFE20045FFFFFFFFFFFFFFFF
+FFFFFF102AFFFFFFFFFF1621FFFFFFFFA60075FFFF6D00A3FFFFFFFF0B092120201E1E0C
+00E2FFFF620D000000000067FFFF1A1CFFFFFFFFFF2013FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF75000D4EB4FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF75000D4EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6061EFA
+075CFFFFC5008C64008DFFFF0829FFFFFFFFFF2B04FDFF7C009EFFFFFFFFFF0721130AAD
+FFFFFFFF2F0262626262626262BBFFE2004EFFFFFFFFFFFFFFFFFFFFFF102AFFFFFFFFFF
+1624FFFFFFFFA60075FFFF6D00B1FFFFFFFF051762626262626262EAFF6E003584B8E3A1
+0065FFFF171FFFFFFFFFFF2413FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FD5293FAFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5293FA
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B019700A0FFFFFF0E4D2E01E2
+FFFF1C12FFFFFFFFFF131AFFFF7C009EFFFFFFFFFF0736D01708A5FFFFFF4F00CDFFFFFF
+FFFFFFFFFFE2004EFFFFFFFFFFFFFFFFFFFFFF1129FFFFFFFFFF1624FFFFFFFFA60075FF
+FF6D00B1FFFFFFFF1E14FFFFFFFFFFFFFFFFFF2908E2FFFFFF850065FFFF2E0BFDFFFFFF
+FF0E13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5F002404F1FFFFFF3A1B081EFFFFFF4C0099FFFFFF9A00
+4BFFFF7C009EFFFFFFFFFF0736FFD71A069EFFFF9B0048FFFFFFFFFFFFFFFFE2004EFFFF
+FFFFFFFFFFFFFFFFFF1F0EFFFFFFFFFF1624FFFFFFFFA60075FFFF6D00B1FFFFFFFF5700
+87FFFFFFFFFFFFFFFF210DF6FFFFFF290065FFFF650088FFFFFF900013FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA5000026FFFFFFFF7100004FFFFFFFDD0A0A7AB87A0A09DBFFFF7C009EFFFFFFFF
+FF0736FFFFDD1E0595FFFF3F003C9BBF9E661BFFFFE2004EFFFFFFFFFFFFFFFFFFFFFF49
+00467D83F3FF1624FFFFFFFFA60075FFFF6D00B1FFFFFFFFF117045AA8BB94503BFFFF53
+0043AAA838130065FFFFEC0E087EC2810C0D13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6060057FFFFFF
+FFBC00008FFFFFFFFFC32200000020C0FFFFFF7C009EFFFFFFFFFF0736FFFFFFE322038D
+FFFA6A09000000083CFFFFE2004EFFFFFFFFFFFFFFFFFFFFFFDB3C100100DDFF1624FFFF
+FFFFA60075FFFF6D00B1FFFFFFFFFFE344030000001168FFFFEC330000012DAA0065FFFF
+FFC31A000009872D13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFE2AEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFAAC9F6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFF8C0AED2FFFFFFFFFFFFD7B0ECFFFFFFFFFFFFFFFFFFCDBDFDFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0DBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFDBE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFDCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFD8ECFFECD7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFA83E0FFFFFF4A36FFFFFFFFFFFFFF8C3A1C1D41C9FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC83EDFF
+FFFF3649FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE800A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE00ACDFFCD09E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFED00ADFFFFFF4A36FFFFFFFFFFFFFF1A477D6A1A0FDDFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC700CFFFFFFF3649FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE800A6FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5938FFFFFF3659FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB50086BFCAFF
+4A36FBB599E7FFFFFFEDFFFFFFBB007CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFEAA599DFFFFFFFFFFFD4959AE3FFFFFFF4AD96DAFFFFFFEFBFFFD491E3FFFBBB
+90C2FFFFFFFFFFFFFFFFFFFB9A009EBFD0FF3649FAAD9CEDFFFFFFCCE0F3A9AAFFFFDF9B
+A3ECFFFFFFFFC99399D8FFFFFFFFFFD094D2E800A6FFFFFFFFFFFFFFFFEFBFFFD591E0DA
+D2FFFFFFE5C7FFFFDAD2FBB599E7FFFFFFE709A8FFFFFFA109E7FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E00161C3AFF4A2E2A10060EC2FFFFFF
+FFFFFFF10379FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF930B0B130785FF
+FFF64601131D04EDFFB41504120365FFFFA000620319AAD426021C013FFBFFFFFFFFFFFF
+FFE71800191C4AFF363A1F120414D7FFFF2246121241FF6D04130B10ACFFFF570B240E04
+77FFFFFF6E0212055A00A6FFFFFFFFFFFFFFFFA600620219A44F31FFFFFF7516FFFF4B2D
+2B10060EC0FFFF870AFFFFFFFFFF0787FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A0075FAE51B45FFFFFFFFFFFF6908D4FFFFFFFF
+FFFFD0171717171717171750FFFFFFFFFFFFD50767F8FB6B07D5FF640794FBFFD2FAFD1D
+29D4F86900ADFFA00033D5FFFF3129DDFFC00973FFFFFFFFFFFFFFFFC700CFFFFFFF3600
+8DFDDD1059FFFF220397FDFFA40194FFF14617F8FFC9F8FFFD6906E2FFC7026BFAD72A00
+A6FFFFFFFFFFFFFFFFA60030D2FFFF4F31FFFFFF7516FFFF4B0074FAE71C44FFFF5A20FF
+FFFFFFFF1E5CFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB23B1C1A2D5FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF9CBBFFFFFF9405FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3642FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ED00ADFFFFFF4A0FFDFFFF5422FFFFFFFFFF9F037CFFFFFFFFFFFFFFEF95959595959595
+95B6FFFFFFFFFFFF690EF6FFFFF30984FF1836FFFFFFFFFFC20086FFFFFA0A50FFA00097
+FFFFD80096FFFFFF4132FFFFFFFFFFFFFFFFC700CFFFFFFF361DFFFFFF4033FFFF2229FF
+FFFF3F29FFFFFFC200BFFFFFE5A1857B02A3FF6607F6FFFF7F00A6FFFFFFFFFFFFFFFFA6
+0091FFFFFF4F31FFFFFF7516FFFF4B0EFBFFFF5522FFFF363AFFFFFFFFFF3A3AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD062E7A976924FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF275BFFFFFF9405FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3642FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A34FFFF
+FF6F1AFFFFFFFFA6075FFFFFFFFFFFFFFFFFFBE3E3E3E3E3E3E3E3EDFFFFFFFFFFFF4801
+04040404046AFF0478FFFFFFFFFF9A00DBFFFFFF3134FFA000F1FFFFA500040404040422
+FFFFFFFFFFFFFFFFC700CFFFFFFF3647FFFFFF582AFFFF225BFFFFFF240204040404049B
+FF7307132E390387FF4A29FFFFFFCA00A6FFFFFFFFFFFFFFFFA600E8FFFFFF4F31FFFFFF
+7516FFFF4B33FFFFFF7019FFFF2F40FFFFFFFFFF4033FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5D09EAFFFFFFFFFFFFE7C6FFC395DDFFFFFFFFDD9A90C6FFFFFFDAD2FFFFF1
+BFEAFFFFD8D2FFE2CAFFC294DAFFFFFFFFFAA88FB9FFFFFFFFFFFFD2204ABFBFFA9405FF
+CF93CDFFFFFFE5C7FFC78EF6FFF6B193CFFFFFFFFFEA9F8DB8FFFFFFFFFFEF9FB1FA3642
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A36FFFFFF6F1AFFFFFFAE0957FF
+FFFFFFFFFFFFFFFFC900000000000000003AFFFFFFFFFFFF5812FBFFFFFFFFFFFF104FFF
+FFFFFFFFB100A5FFFFFF1844FFA000FFFFFFBD00A3FFFFFFFFFFFFFFFFFFFFFFFFFFC700
+CFFFFFFF3649FFFFFF582AFFFF2263FFFFFF3130FFFFFFFFFFFFF80466FFFFD00187FF59
+12FFFFFF9C00A6FFFFFFFFFFFFFFFFA600F6FFFFFF5329FFFFFF5916FFFF4B35FFFFFF70
+19FFFF5226FFFFFFFFFF2455FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7206E3FFFF
+FFFFFFFF7F0E450A0D068FFFFF900720180046FFFF7417FFFF7C0061FFFF2952FF6D1941
+0A0B079FFFFF8D0A19250B7FFFFFFFFFFF4D060E1C1CDF94055D0610027DFFFF74154206
+15E2B9180619015BFFFFBD071C1E012EF4FFFFBF130413232C42FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0F8AFFFFFF4A36FFFFFF6F1AFFFFB40A51FFFFFFFFFFFFFFFFFFFFFAD7
+D7D7D7D7D7D7D7E5FFFFFFFFFFFF9B0095FFFFFFFFFBFF3A14F8FFFFFFFFEC0954FFFFC6
+007CFFA000FFFFFFF6103DFFFFFFFFFBFFFFFFFFFFFFFFFFF305A8FFFFFF3649FFFFFF58
+2AFFFF2263FFFFFF6802D0FFFFFFFBFFE7039EFFFF680087FF9400C3FFFF5300A6FFFFFF
+FFFFFFFFFFA600F6FFFFFF7106F4FFFF1916FFFF4B35FFFFFF7019FFFF7D0EFFFFFFFFFF
+0C7DFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3080B4787F4FFFFFF7F0040E7EF4B
+0BE8FFD7E8FFFFA8019EFFC600D0FF3E182AFFEF0497FF6D0055F1F33028FFFF1C6FFFFF
+F8E2FFFFFFFFFFFF275BFFFFFF94003DE5FA4910FFFF74004AE5FFF81940EAFFA0019FFF
+E5D8FFFFCC0872FFFF292AD5FA6B0042FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E1546
+67FF4A36FFFFFF6F1AFFFF12063939393981FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF4704346E5A1CC2FFCC0E0E53682AECFF71012E510722FAFFA000FFFFFFFF97
+061F6165355EFFFFFFFFFFFFFFFFFF2C1A4874FF3649FFFFFF582AFFFF2263FFFFFFF827
+0A41705116FFFF391866361D0787FFFF280957342100A6FFFFFFFFFFFFFFFFA600F6FFFF
+FFD80620591A2416FFFF4B35FFFFFF7019FFFFD003CAFFFFFFC303CFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE36619010F68FFFF7F00B1FFFFC90088FFFFF4AA88831562
+FFFF127BFF108804F19A03EDFF6D03E0FFFF790AFFFF223DCFFFFFFFFFFFFFFFFFFF275B
+FFFFFF9400B2FFFFA300E2FF7400CCFFFFA101C7FFFFFF2451FFFFFDB48C832640FFE000
+80FFFFF60642FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A56474FF9485FFFFFFAD70FF
+FF625A5A5A5A5A9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF914D3949
+86F6FFFFE2613D4377FBFFFF9C4B3E6BF4FFFFCC5AFFFFFFFFFFC9593B4169D4FFFFFFFF
+FFFFFFFFFFF39E6180FF8693FFFFFF9E7CFFFF76A5FFFFFFFFFB7A473A4F99FFFFEA7D40
+62E265BCFFFFF46A3E62DF5ACFFFFFFFFFFFFFFFFFCF5AFBFFFFFFFFB848448EB16DFFFF
+9485FFFFFFAD70FFFFFF424EFFFFFF4B41FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA3F00C5FF7F06FBFFFFFF0E68FFA60E0D2839104DFFFF413DC009FA179C54
+26FFFF6D1AFFFFFF9903FFFFAA2801207CF6FFFFFFFFFFFF275BFFFFFF9404FFFFFFC900
+CDFF7412FFFFFF780004040404043DFFCA160A2439182EFFB200CCFFFFFF2942FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+C60AE7FFE709C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED0561FF
+7F00D4FFFFE8027AFF2633FFFFFF134DFFFF800F7033FF4956205CFFFF6D1BFFFFFF9903
+FFFFFFFFC9650A69FFFFFFFFFFFF275BFFFFFF9405FFFFFFC900CDFF7417FFFFFF8C02D4
+FFFFFFFFFFFF441AFDFFFF2C2EFFCC009CFFFFFF1242FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFD2B4B4B4B4B4B4CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDB4B4B4B4B4B4
+CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97D4FFD497FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5F6FFFFFFAE0070FF7F007BFFFF8E01BDFF1F
+5EFFFFAA004DFFFFD7001A6EFF8A1802A5FFFF6D1BFFFFFF9903FFFDFDFFFFFF3D36FFFF
+FFFFFFFF4243FFFFFF9405FFFFFFC900CDFF7417FFFFFFD4055FFFFFFFFFFBFF3B3DFFFF
+DB022EFFFB1054FFFFC20042FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF641C1C1C1C1C1C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF581C1C1C1C1C1C5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF4E0F445F3D0E14E3FF7F0919424B0445FFFF6D0B594B11184DFFFFFF19
+00BDFFE30107F6FFFF6D1BFFFFFF9903FFE01657775206A9FFFFFFFFFFFF84083D4CE894
+05FFFFFFC900CDFF7417FFFFFFFF74032869612A83FF97044D59101F2EFFFF7A01335811
+1842FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF7F4B
+394671EAFFFF7F10D0593F78FDFFFFFA954557BD8396FFFFFF8A60FFFFFF6D77FFFFFFAC
+71FFFFFFC75DFFF87F4B3A68B9FFFFFFFFFFFFFFFFBF715AECC55FFFFFFFE35AE5FFB06E
+FFFFFFFFFFB054394475E3FFFFA64B50A69A7FFFFFFF9B464EAE868EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F10FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F10FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFDFCAF6FFFFFFFFEDCADAFFFFFFFFFFD4CCFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF8D33CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFA133B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2339EFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFC37EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F0090
+FFFFFFFF60001AFFFFFFFFF6061AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6700B9
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA13FC3FFFF
+FFFF800099FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA9007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFD4981EFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFD4981EF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5004FFFFFFFFF2B0401DDFFFF
+FFA6004AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6700B9FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7700A4FFFFFFFF800099FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA9007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78
+000843A3FDFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78000843A3FDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFF6061EFFFFFFF6064B0088FFFFFF610088FFFFFFFFF4F4
+FFFFFFFFFFFFFFFFFFFFFAEAFF6700B9FFFFFFFFFFFFFFFFFFFFFFECFFFFFFFFFFFFFFFF
+FFFFFFE5FFFFFFFFFFFFFF7700A4FFFFFFFF800099FFFFEDFFFFFFFFFFFFFFFFFFFFF8EC
+FFFFFFFFFFEDFFFFFFFFFFFFFFFFFFE7FBFFFFFFFFFFFFFFFFFFEFFFFFA9007BFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF604000000145BC7FFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF7AFFFFFFFFFFFFFFFFFFF604000000145BC7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF2B01E3FFFFA800AA144BFFFFFF2C01DDFFFF8F1C03031B8AFFFFFFFF2B3DC029
+060DFF6700B9FFFFFF771859FFFFDD400F000D43E5FFFFFF6017DD410E00ACFFFFFFFFFF
+5E0E001217175DFF8000996315000F70FFFFFFFF2247B4260516FFFFB62B09011565FBFF
+FFFF8C2A07000422A5FFFFFFFFFF8D19011151A6007BFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B0000000000012677E7FFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFF1B0000000000012677E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F008FFFFF62
+06F8401BFFFFF8061CFFFF75001E77741D0073FFFFFF131510417065FF6700B9FFFF5900
+50FDFFCF0D0B6183360218F6FFFF4B0025276868C9FFFFFFFFFFA53D00507272A4FF8000
+261D6D5E0E0094FFFFFF0A180D46716BFF8F031B7177220044FFFFFF443A6F864A1002B8
+FFFFFF88011D76772022007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF72000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000048FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFF100000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000048FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5004FFFFF2D2BFF7A01DFFFA9004BFF
+E70B15ECFFFFED170BE5FFFF130073FFFFFFFF6700B9F63E016DFFFFFF3807C6FFFFFF79
+0072FFFF4B0031FDFFFFFFFFFFFFFFFFFF7700A4FFFFFFFF80001AF3FFFFC50033FFFFFF
+0A0083FFFFFFEF121DF4FFFFFF3D01BCFFFFFBFFFFFFFFBD0139FFFFFA1512ECFFFFEF15
+007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C000000
+0000012778E8FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF1C0000000000012778E8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFF6061EFFF8075FFFC7008AFF63008CFF93006EFFFFFFFF6E008F
+FFFF130AFAFFFFFFFF6700A52A058AFFFFFFF1013EFFFFFFFFE80536FFFF4B00A0FFFFFF
+FFFFFFFFFFFFFF7700A4FFFFFFFF800070FFFFFFFF111AFFFFFF0A11FFFFFFFF96007AFF
+FFFFFF9A0070FFFFFFFFECC0AAA91B19FFFFB20060FFFFFFFF67007BFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF804000000175ECCFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFF804000000175ECCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF2B01E3AA00A3FFFF104CFF2E01E0FF6F009CFFFFFFFF9E0068FFFF131FFFFFFFFFFF67
+000E02A5FFFFFFFFBB001021201F1E1E051BFFFF4B00D5FFFFFFFFFFFFFFFFFFFF7700A4
+FFFFFFFF800094FFFFFFFF2B0FFFFFFF0A29FFFFFFFF6E001921201F1E1C004BFFFFBB2D
+000000000007FFFF88008AFFFFFFFF93007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF79000A47A9FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF79
+000A47A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F008E6404F3FFFF3C
+1CFA071DFFFF6900A3FFFFFFFFA50061FFFF1326FFFFFFFFFF670039003FFAFFFFFFAD00
+2D62626262626273FFFF4B00E7FFFFFFFFFFFFFFFFFFFF7700A4FFFFFFFF800099FFFFFF
+FF2B0FFFFFFF0A31FFFFFFFF64004862626262626295FFEA12076E9CD4E32E06FFFF8100
+90FFFFFFFF9A007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FD4E89F4FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFD4E89F4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5004E2E28FFFFFF740196004EFFFF8C0079FF
+FFFFFF7B0087FFFF1326FFFFFFFFFF6700B9640039F8FFFFE80041FFFFFFFFFFFFFFFFFF
+4B00E7FFFFFFFFFFFFFFFFFFFF7800A1FFFFFFFF800099FFFFFFFF2B0FFFFFFF0A31FFFF
+FFFF8E007DFFFFFFFFFFFFFFFFA10058FFFFFFFF1806FFFFAA006CFFFFFFFF73007BFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFF6061B0859FFFFFFC00024008EFFFFD50524FFFFFFFF2504D4FFFF1326
+FFFFFFFFFF6700B9FF6D0133F4FFFF2507C9FFFFFFFFFFFFFFFF4B00E7FFFFFFFFFFFFFF
+FFFFFF900074FFFFFFFF800099FFFFFFFF2B0FFFFFFF0A31FFFFFFFFDD091EF6FFFFFFFF
+FFFFFF94006CFFFFFFA10006FFFFED0B1CFBFFFFFD20007BFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00
+009CFFFFFFFF0D0001E3FFFFFF580037A5A5380057FFFFFF1326FFFFFFFFFF6700B9FFFF
+76012EF1FFBD040F75B4B2883B67FFFF4B00E7FFFFFFFFFFFFFFFFFFFFD203196683B0FF
+800099FFFFFFFF2B0FFFFFFF0A31FFFFFFFFFF7900218CBCA87829A8FFDB07127CBF7B0D
+1006FFFFFF680036AEB03A10007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F0003EFFFFFFFFF37001EFF
+FFFFFFFD660600000561FDFFFFFF1326FFFFFFFFFF6700B9FFFFFF7F0229ECFFC0290100
+00001D96FFFF4B00E7FFFFFFFFFFFFFFFFFFFFFF831D070049FF800099FFFFFFFF2B0FFF
+FFFF0A31FFFFFFFFFFFF9415000000032BCCFFFF8C0C00000A873706FFFFFFFF5C030001
+2C9A007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFABFBDFAFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDB2B6DFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE0ACBFECFFFFFFFFFFF3B8C7FFFFFFFFFFFFFFFFFFF1B2E3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFE0DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBE0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCAF3FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8ECFFECD7FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA83E0FFFFFF4A36
+FFFFFFFFFFFFFF8F321A1831A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFEC83EDFFFFFF3649FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE800A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00ACDFFCD09E0FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A36FFFFFFFFFFFFFF6F5B85
+762E03AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+C700CFFFFFFF3649FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFE800A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5938FFFFFF3659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFB50086BFCAFF4A36FBB599E7FFFFFFFFFFFFFFEC0A57FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAA599DFFFFFFFFFFFD4959AE3FFFFFFF4AD
+96DAFFFFFFEFBFFFD491E3FFFBBB90C2FFFFFFFFFFFFFFFFFFFB9A009EBFD0FF3649FAAD
+9CEDFFFFFFCCE0F3A9AAFFFFDF9BA3ECFFFFFFFFC99399D8FFFFFFFFFFD094D2E800A6FF
+FFFFFFFFFFFFFFEFBFFFD591E0DAD2FFFFFFE5C7FFFFDAD2FBB599E7FFFFFFE709A8FFFF
+FFA109E7FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E00
+161C3AFF4A2E2A10060EC2FFFFFFFFFFFFD50487FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF930B0B130785FFFFF64601131D04EDFFB41504120365FFFFA000620319
+AAD426021C013FFBFFFFFFFFFFFFFFE71800191C4AFF363A1F120414D7FFFF2246121241
+FF6D04130B10ACFFFF570B240E0477FFFFFF6E0212055A00A6FFFFFFFFFFFFFFFFA60062
+0219A44F31FFFFFF7516FFFF4B2D2B10060EC0FFFF870AFFFFFFFFFF0787FFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFC245222043BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A0075FAE51B
+45FFFFFFE2533D1252F4FFFFFFFFFFFFD0171717171717171750FFFFFFFFFFFFD50767F8
+FB6B07D5FF640794FBFFD2FAFD1D29D4F86900ADFFA00033D5FFFF3129DDFFC00973FFFF
+FFFFFFFFFFFFC700CFFFFFFF36008DFDDD1059FFFF220397FDFFA40194FFF14617F8FFC9
+F8FFFD6906E2FFC7026BFAD72A00A6FFFFFFFFFFFFFFFFA60030D2FFFF4F31FFFFFF7516
+FFFF4B0074FAE71C44FFFF5A20FFFFFFFFFF1E5CFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C0638888A3B
+068AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A0FFDFFFF5422FFFFFFDD3F27064FE8
+FFFFFFFFFFFFEF9595959595959595B6FFFFFFFFFFFF690EF6FFFFF30984FF1836FFFFFF
+FFFFC20086FFFFFA0A50FFA00097FFFFD80096FFFFFF4132FFFFFFFFFFFFFFFFC700CFFF
+FFFF361DFFFFFF4033FFFF2229FFFFFF3F29FFFFFFC200BFFFFFE5A1857B02A3FF6607F6
+FFFF7F00A6FFFFFFFFFFFFFFFFA60091FFFFFF4F31FFFFFF7516FFFF4B0EFBFFFF5522FF
+FF363AFFFFFFFFFF3A3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE30B46FFFFFFFF4D0BE3FFECC2FFFFFFF6
+BFF8FFFFFFDF9BA3ECFFFFFFCCE0FFFFFFD5D7FFFFFFFAB990C5FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFED00ADFFFFFF4A34FFFFFF6F1AFFFFFFFFFFFFD80664FFFFFFFFFFFFFBE3E3E3
+E3E3E3E3E3EDFFFFFFFFFFFF480104040404046AFF0478FFFFFFFFFF9A00DBFFFFFF3134
+FFA000F1FFFFA500040404040422FFFFFFFFFFFFFFFFC700CFFFFFFF3647FFFFFF582AFF
+FF225BFFFFFF240204040404049BFF7307132E390387FF4A29FFFFFFCA00A6FFFFFFFFFF
+FFFFFFA600E8FFFFFF4F31FFFFFF7516FFFF4B33FFFFFF7019FFFF2F40FFFFFFFFFF4033
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44
+FFFFFFFFFFFFFFFFFF6B02D7FFFFFFFFDF046BFF9106FFFFFFC600CFFFFF6D04130B10AC
+FFFF2065FFFFFF3D41FFFFCF22031C0045FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF
+4A36FFFFFF6F1AFFFFFFFFFFFFFF3529FFFFFFFFFFFFC900000000000000003AFFFFFFFF
+FFFF5812FBFFFFFFFFFFFF104FFFFFFFFFFFB100A5FFFFFF1844FFA000FFFFFFBD00A3FF
+FFFFFFFFFFFFFFFFFFFFFFFFC700CFFFFFFF3649FFFFFF582AFFFF2263FFFFFF3130FFFF
+FFFFFFFFF80466FFFFD00187FF5912FFFFFF9C00A6FFFFFFFFFFFFFFFFA600F6FFFFFF53
+29FFFFFF5916FFFF4B35FFFFFF7019FFFF5226FFFFFFFFFF2455FFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFF47
+14FFFFFFFFFFFF1947FF9106FFFFFFC600CFFFA40194FFF14617F8FF2065FFFFFF3D41FF
+FF2B2EE0FFBB067CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F8AFFFFFF4A36FFFFFF6F1AFFFFF6
+FFFFFFE5073FFFFFFFFFFFFFFAD7D7D7D7D7D7D7D7E5FFFFFFFFFFFF9B0095FFFFFFFFFB
+FF3A14F8FFFFFFFFEC0954FFFFC6007CFFA000FFFFFFF6103DFFFFFFFFFBFFFFFFFFFFFF
+FFFFF305A8FFFFFF3649FFFFFF582AFFFF2263FFFFFF6802D0FFFFFFFBFFE7039EFFFF68
+0087FF9400C3FFFF5300A6FFFFFFFFFFFFFFFFA600F6FFFFFF7106F4FFFF1916FFFF4B35
+FFFFFF7019FFFF7D0EFFFFFFFFFF0C7DFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3422FFFFFFFFFFFF2733FF
+9106FFFFFFC600CFFF3F29FFFFFFC200BDFF2065FFFFFF3D41FFCA00A1FFFFFF3B38FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF3E154667FF4A36FFFFFF6F1AFFFF183F593A0E0AC6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4704346E5A1CC2FFCC0E0E53682AECFF71
+012E510722FAFFA000FFFFFFFF97061F6165355EFFFFFFFFFFFFFFFFFF2C1A4874FF3649
+FFFFFF582AFFFF2263FFFFFFF8270A41705116FFFF391866361D0787FFFF280957342100
+A6FFFFFFFFFFFFFFFFA600F6FFFFFFD80620591A2416FFFF4B35FFFFFF7019FFFFD003CA
+FFFFFFC303CFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D10FFFFFFFFFFFF1541FF9106FFFFFFC600CFFF24
+0204040404049BFF2065FFFFFF3D41FF9A00040404040428FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF6A56474FF9485FFFFFFAD70FFFF96513A4265E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF914D394986F6FFFFE2613D4377FBFFFF9C4B3E6BF4FFFFCC5AFF
+FFFFFFFFC9593B4169D4FFFFFFFFFFFFFFFFFFF39E6180FF8693FFFFFF9E7CFFFF76A5FF
+FFFFFFFB7A473A4F99FFFFEA7D4062E265BCFFFFF46A3E62DF5ACFFFFFFFFFFFFFFFFFCF
+5AFBFFFFFFFFB848448EB16DFFFF9485FFFFFFAD70FFFFFF424EFFFFFF4B41FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFF
+FFFFFFFFFF7B01BDFFFFFFFFC70278FF9703F6FFFFA000CFFF312FFFFFFFFFFFFFFF235B
+FFFFFF2841FFB100ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFC60AE7FFE709C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFF6172EF3FF
+FFF43312EDFFC000A1FFFF4A00CFFF6802D0FFFFFFFBFFFF3A29FFFFDA0241FFEF0D45FF
+FFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2B4B4B4B4B4B4CAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCDB4B4B4B4B4B4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF97D4FFD497FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1141B53551D0EACFFFFFF221156
+2B2600CFFFF8280A41705216FFFF94013351161C41FFFF8F052163643366FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF641C1C1C1C1C1C4FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF581C1C
+1C1C1C1C5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFE871462600A4FFFFFFFFE0553D6DDB5AE7FFFFFB7A473A
+4F99FFFFFF8E404FB28A8EFFFFFFC3583A416CD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFD3D0EC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68EB1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4981EFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF309090909090909090909090909
+090909090909090909090909090909090909090909090909090909090909090909090909
+090909090909090909090909090909090909090909090909090909090909090909090909
+090909090909090909090909DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF78000843A3FDFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
+E3E3E3E3E3E3E3E3E3E3E3E3E35BE3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
+E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
+E30BE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFF604000000145BC7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08ECFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B0000000000
+012677E7FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFF7200000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000048FFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF02FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1C0000000000012778E8FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF804FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8
+04000000175ECCFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC07FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79000A47A9FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE20BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4E89F4FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFD70FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD13FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC317FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFBB1BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB120
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA924FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFA029FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF992DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9031FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8936FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF813BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+7B41FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7546FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF6851FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6156FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5CFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5562FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5068FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A6FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4575FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFEFFFFFFF3F7CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D3BC2FF3A83
+FFB841DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF107000B0C160C0033FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF3D00000000000093FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF90000000000011FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40A000000005BFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4100000002D0FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF9700000030FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80B
+00008DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46000DFAFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E004AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFB07B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8D4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5E5FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE8D4FFFFFFFFDDE7FFFFFFFFFFFFFFDFDDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCDF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FC9FFFFFF7118FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF205DFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF6C1BFFFFFFF410ADFFF483E5FFFFFF413DFFFFFFFFFFFFFF86391C1E45CFFFFFFF30
+6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF127AFFFFFF7118FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF205DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C1BFFFFFF7524FF
+FFDD00B9FFFFFF413DFFFFFFFFFFFFFF154B7E671812E3FFFF9910F4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B591CAFFFFFFFFFFE7A391CC
+FFFFFFFFBD91C5FFFFFFFFC0EDE79BC3FFFFCF93AEF8FFFFFFFFFFFFFFFFFFCA0F61BFC2
+FF7118FFC394DAFFFFFFDDCFFDBD91FFFFEFAA95DAFFFFFFFFE09A8FC3FFFFFFFFFFE799
+BBFD205DFFFFFFFFFFFFFFFFFFFFF6B48DB2FDFFFFEDA18DB4FDFFFFFFD4D8F8AD9EEDFF
+FFFFFFFDBF8EA6F6FFFFFFEDA996DBFFFFFF6C1BFFFFF81487FFFFA9008FBFCDFF413DFB
+B19AEAFFFFFFEDFFFFFFAE0087FFFFFF1874FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFC51D041A0150FFFFFF750709230796FFE22D00170038EFFF
+FF0159061768F847001A0420D4FFFFFFFFFFFFFFFF3803111C21FF7117440A0C069AFFFF
+55262E0A1AFFA10F09150476FFFF99071F190041FFFFFFA50B090E331C5DFFFFFFFFFFFF
+FFFFFFAD1702220E4BFFD0071B200126ECFFFF363A1E120414D7FFFFCF26001E1527FFFF
+9E0E0A15057AFFFF6C1BFFFFA900EDFFFA1A00171C40FF413325110510CAFFFFFFFFFFFF
+E80184FFFFFF502BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3335353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353533FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFD2136E5FFAE028DFFAC0164ECFFECDFFF4D0EADFF9F0763FFFF0115B4FFFF6A0AC0FF
+E02638FFFFFFFFFFFFFFFFFF127AFFFFFF710052EFF33325FFFF550060EFFFE50D57F3FF
+7D03C2FFDAE5FFFFB00195FFFB173BE3F151005DFFFFFFFFFFFFFFFFED1334CFFFFDCFFF
+EDD2FFFFD70D63FFFF36008DFDDB0F5AFFFF2B1EB8FFFFCCFFE00B5AF4FD7804C7FF6C1B
+FFFF750FFFFFFFDD00B9FFFFFF41007EFBE2164DFFFFFFFFFFFF5F0ADBFFFFFF750FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB500B5FFFFFF3044FF
+490CFBFFFFFFFFFF1046FFFFFF331EFFFF0153FFFFFF1952FFFFFF8007FFFFFFFFFFFFFF
+FFFF127AFFFFFF7102DBFFFF7D08FFFF5505F1FFFF7C07E8FFFFFD116FFFFFF6AD888318
+5AFFB200A5FFFFD5005DFFFFFFFFFFFFFFFF9300AAFFFFFFFFFFFFFFB88D832D33FFFF36
+1EFFFFFF3F34FFD20074FFFFFFFFFF7709ECFFFFFB0E74FF6C1BFFFF4B26FFFFFFDD00B9
+FFFFFF4114FFFFFF4B29FFFFFFFFFF950386FFFFFFFFA000E5FFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8800040404040432FF2E3CFFFFFFFFFFF80183
+FFFFFF6A08FFFF0193FFFFFF04030404040404E3FFFFFFFFFFFFFFFF127AFFFFFF7117FF
+FFFF9E00FFFF5526FFFFFF5901040404040458FFAE0F0D27391147FF8A03F6FFFFFF145D
+FFFFFFFFFFFFFFFF6D0AFDFFFFFFFFFFD71A0922381B24FFFF3648FFFFFF572AFFA100CF
+FFFFFFFFFF540104040404045CFF6C1BFFFF452BFFFFFFDD00B9FFFFFF413CFFFFFF6520
+FFFFFFFF9E0569FFFFFFFFFFAA00DAFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF9E00C2FFFFFFFFFFFF3D1DFFFFFFFFFFFF095DFFFFFF4815FFFF019BFF
+FFFF0E5AFFFFFFFFFFFFFFFFFFFFFFFFFFFF137AFFFFFF7118FFFFFF9E00FFFF552BFFFF
+FF6A0AF1FFFFFFFFFFFF2B2EFFFFFF1746FFA000C7FFFFF1045DFFFFFFFFFFFFFFFF8301
+D4FFFFFFFFFF5112F6FFFF3823FFFF3649FFFFFF572AFFBD0095FFFFFFFFFF650BF4FFFF
+FFFFFFFF6C1BFFFF6C14FFFFFFDF00B9FFFFFF413DFFFFFF6520FFFFFFA50660FFFFFFFF
+FFFF7D0AFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE20951
+FFFFFFFFFBFF7600C5FFFFFFFFFF2D22FDFFF8153FFFFF019BFFFFFF3A12FBFFFFFFFBFF
+FFFFFFFFFFFFFFFF2B5FFFFFFF7118FFFFFF9E00FFFF552BFFFFFFB1017FFFFFFFFFFBFF
+2457FFFFB40046FFE20673FFFF99005DFFFFFFFFFFFFFFFFCC036CFFFFFFFFFF4730FFFF
+EA0623FFFF3649FFFFFF572AFFF60F41FFFFFFFFFFAC0185FFFFFFFFFBFF6C1BFFFF9C02
+F6FFFFFB0A96FFFFFF413DFFFFFF6520FFFFAC085AFFFFFFFFFFFFFF5824FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81042466632E73FFFA27053E
+6E3E97FFB007195B130BC7FFFF019BFFFFFFD51312506D4630FFFFFFFFFFFFFFFFFF630D
+4151FF7118FFFFFF9E00FFFF552BFFFFFFFF5803306D5D20A8FF740A564E101A46FFFF5C
+023E4E14115DFFFFFFFFFFFFFFFFFF5F01296C525BFFAA02495D102123FFFF3649FFFFFF
+572AFFFF8A031C655C40FFFF5303316D5C1FADFF6C1BFFFFEA09A6FFFFFF3617466CFF41
+3DFFFFFF6520FFFF0B073939393989FFFFFF295BFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9563A4370DFFFFFFA77433D63DDFFFFC6553B59D5
+FFFFFF5CC9FFFFFFFFEA68413D59B4FFFFFFFFFFFFFFFFFFFDB46A5EFFAE6FFFFFFFCA5B
+FFFF9B7DFFFFFFFFFF9E5039467FEFFFFA994655B98791FFFFFF884154C275A1FFFFFFFF
+FFFFFFFFFFFF9C4D3A52B5FFFFAD4F4D9EA377FFFF8593FFFFFF9C7CFFFFFFB9543A4B9B
+FFFFFF9A4F394781F1FFAA71FFFFFF5A37FFFFFFF4A16278FF8E8AFFFFFFA675FFFF5D5A
+5A5A5A5AA0FFFFBB07E0FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFE009CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4453FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5B4B4B4B4
+B4B4B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE0B4B4B4B4B4B4BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4C6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8EE0FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E1C1C1C1C1C1C25FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF8E1C1C1C1C1C1C2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4981EFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3438CF6
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF78000843A3FDFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60000B4BAEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF604000000145BC7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFDA000000001964D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B00000000000126
+77E7FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF0C0000000000012C80EDFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFF72000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000048FFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF100000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000168D8D8D
+8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D
+8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D
+8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D
+8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D
+8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D
+8D8D8D8D8D8D160000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000007A1FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1C0000000000012778E8FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D0000000000022E81EFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80400
+0000175ECCFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFDD000000001C67D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79000A47A9FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61
+000E4FB5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFD4E89F4FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34994FAFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFF9C6D8FFFFFFDBC6F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF975A5A5A5B7091
+E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+DD0048FFFFFF5000C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF580000000000000A87FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD0048FFFFFF5000C9FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF58008FF5F4B35A0002BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD0048FFFFFFEDE2FAFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58
+0094FFFFFFFF35005CFFFFFFFFFFEDD6FDFFFFFFFFFFFFFFFFFFFFF4D6FDFFFFFFFFFFFF
+FFFFF6D8FEFFDD0048FFFFFFFFFFFFFFFFFFFFFFFFFFF1D8FEFFFFFFFFFFFFFFFFF4D9FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF580094FFFFFFFF8E0036FF
+FFFE83170000074FEBFFFFFFE50C46D83204000779FEFFFFFFFFEA4204000F5BD80048FF
+FFFF5A0CCDFFFFD40C54CE2D03000A84FFFFFFFFFFDE3702001165CB0C60FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF580094FFFFFFFF680045FFFF4B002E8194580220F6
+FFFFE400241943814D050091FFFFFFF52000428E7A1A380048FFFFFF5000C9FFFFD1002A
+134A82480300A2FFFFFFEA150054927C1C380057FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF580094FFFFFFED140075FFA3004DFDFFFFFF87007AFFFFE4000077FFFFFFB3
+0024FFFFFF820057FFFFFFE3140048FFFFFF5000C9FFFFD1000087FFFFFFA10032FFFFFF
+690078FFFFFFE6140057FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58004A7978
+4206001CF0FF3100E0FFFFFFFFFD0C2BFFFFE4000EF9FFFFFFF90A06FFFFFF2403DEFFFF
+FFFF790048FFFFFF5000C9FFFFD10019FEFFFFFFEF0314FFFFFF120BF3FFFFFFFF750057
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5800000000000E59E0FFFF0D0C8181
+81818181150BFFFFE40030FFFFFFFFFF3700EEFFFE061AFFFFFFFFFFB70048FFFFFF5000
+C9FFFFD1003EFFFFFFFFFF2901FFFFEF002BFFFFFFFFFFAA0057FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF580080D8D9F0FFFFFFFFEA00010606060606060606F3FFE400
+3BFFFFFFFFFF3E00EAFFE6002CFFFFFFFFFFD40048FFFFFF5000C9FFFFD1004AFFFFFFFF
+FF3000FEFFD5003AFFFFFFFFFFC00057FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF580094FFFFFFFFFFFFFFFE0919FFFFFFFFFFFFFFFFFFFFE4003BFFFFFFFFFF3E00EAFF
+FD051CFFFFFFFFFFB90048FFFFFF5000C9FFFFD1004AFFFFFFFFFF3000FEFFF50126FFFF
+FFFFFFA20057FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF580094FFFFFFFFFFFF
+FFFF2D00D9FFFFFFFFFFFFFFFFFFE4003BFFFFFFFFFF3E00EAFFFF2004E6FFFFFFFF8200
+48FFFFFF5000C9FFFFD1004AFFFFFFFFFF3000FEFFFF1B06E4FFFFFFFF610057FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF580094FFFFFFFFFFFFFFFF93003FFAFFFFFFFF
+FFE6FFFFE4003BFFFFFFFFFF3E00EAFFFF780067FFFFFFEF1B0048FFFFFF5000C9FFFFD1
+004AFFFFFFFFFF3000FEFFFF820053FBFFFFC60A0057FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF580094FFFFFFFFFFFFFFFFFF3F002788AA98732557FFFFE4003BFFFFFF
+FFFF3E00EAFFFFF1190058A89226290048FFFFFF5000C9FFFFD1004AFFFFFFFFFF3000FE
+FFFFF62E00266049095E0059FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF580094
+FFFFFFFFFFFFFFFFFFFD810D000000012DA0FFFFE4003BFFFFFFFFFF3E00EAFFFFFFE233
+00000344D20048FFFFFF5000C9FFFFD1004AFFFFFFFFFF3000FEFFFFFFF563230D3A96B5
+0072FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFDEB6C8EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4BDF3FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF860094FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF6FFFFFFFFE81709E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C
+5085976D110075FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D10000002209AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDD8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFC8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFAF5A5A5A5A5A5A5A5A5A5A5A6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF0522FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E000000
+000000000000000016FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0522FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E2E2E2E29D0039E2E2E2E2E5FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0522FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00040FFFFFFFFFFFADDD2F8FFFFFFFFFFFFFF
+FFF9DBCEE0FDFFFFFFFF0522FFFFFFFFFFFFFFFFFFFFFFFADCCEE0FDFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB00040FFFFFFB63A0500000233CAFFFFFFFFF15B060000000F80FFFFFF
+0522FFFFFFFFA0112BDEFFF55E070000000E79FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00040
+FFFFFF7621698E915A0608DEFFFFFF5300357699814959FFFFFF0522FFFFFF82022EE6FF
+FF5B00327499824C52FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00040FFFFFFEDFFFFFFFFFFA8
+005AFFFFFE0B16F5FFFFFFFFFDFFFFFF0522FFFD630043F4FFFFFF1012F1FFFFFFFFFDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB00040FFFFFFFFFFFFFFFFFFFF132BFFFFFE1911F3FFFF
+FFFFFFFFFFFF0522F548005CFDFFFFFFFF1E0EEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFB00040FFFFFFFFBF54301913130311FFFFFF6F000F57A7F3FFFFFFFFFF05183101
+7AFFFFFFFFFFFF77000E54A4F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00040FFFFFF85
+000D4A6370711109FFFFFFF58E2400000750E3FFFFFF05090312D6FFFFFFFFFFFFF89127
+0000064DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00040FFFFF0031BE9FFFFFFFF1009FFFF
+FFFFFFFFC36C1C0029FDFFFF0522A30516CFFFFFFFFFFFFFFFFFC66F1E0024F9FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFB00040FFFFBA005CFFFFFFFFD90009FFFFFFFFFFFFFFFFFA1800D2
+FFFF0522FFAC0712C8FFFFFFFFFFFFFFFFFFFD1D00C9FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF6F94FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
+0040FFFFC90020FFFFFFFE4E0009FFFFF6EFFFFFFFFFFB2400E0FFFF0522FFFFB40A0FC1
+FFFFF9EEFFFFFFFFFE2900D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFE8FF00FFE8FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF48933030DECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00040FFFFFA2100459B98
+3B1A1409FFFFD90A578FB08E460039FFFFFF0522FFFFFFBC0C0BB8FFE308548EB0904A00
+31FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF45E500E545FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFA8470A00000052FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00040FFFFFFCB250000012BDC2409FFFFE8360600
+0000034FE9FFFFFF0522FFFFFFFFC30F09B0EE3807000000024CE5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFF461A001A46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFDBE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACAF8FFFFFFFFFFFFFFFFEFD5FFFFFFFF
+FFFFFFF1CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFE3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC95D160000000000007AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFBD0B9EEFFFFFFFFFFFFFFFFF6CFB4C6EDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFF8D0B5C5EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFAE070007
+AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF344BFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCD00C7FFFFFFFFFFFFFFFF4C4EFFFF9FB8FFFFFF9A02FFFFFFFFFF
+FFFFB94D22183097FFFFFF8023FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFE83B000000000000000000060909090909090909090909
+090909090909090909090909090909050909090909090909090909090909189393939393
+939393939393939393939393939393939393939393939393939393939393939393939393
+939393939393939393939393939393939393939393939393939393939393939393939393
+939393939393939393939393939393939393939393939393939393939393939393939393
+939393939393939393939393939393939393939393939393939393939393939393939393
+939393939393939393939393939393939393939393939393939393939393939393939393
+939393931809090909090909090909090909090900090909090909090909090909090909
+090909090909090909090909090909090909090909090909090909090909090909090909
+090909090909090909090909090909090909090909090909090909090909090909090909
+0962FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFD190019FDFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF344BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
+00C7FFFFFFFFFFFFFFDA07C9FFFF2B56FFFFFF9A02FFFFFFFFFFFFFF4D2F707E330191FF
+FFF60E9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFD8F3B0600000000000074E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
+E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E339F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6
+F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6
+F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6
+F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6
+F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6
+F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F639E3E3E3E3E3
+E3E3E3E3E3E3E3E3E3E300E3E3E3E3E3E3E3E36FE3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
+E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3
+E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3F1FFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFF300030FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFE8A590C7FFFFFFDA9991C9FFFFFFFFC5E8EC9BADFDFFFFFFFFF3B08DB8FFFFFFFF
+DD9AA3EDFFFFFF344BFFFFFFFFFFFFFFFFFFFFFBBC8EA9F8FFCD00C7D895C7FFFFFFFF52
+35FFFFD42446BFBFF89A02FFD093CCFFFFFFEDFFFFFFFD1635FFFFFF5C28FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED7E2B
+0100000058FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFF770077FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C090723088AFF86
+082017014EFFFFFF0B550B160030FFFFFFA01203230D5AFFFF6B03130B10AEFFFF344BFF
+FFFFFFFFFFFFFFFFC722001F132FFFCD005904150059FFFFFF1378FFFF51070D1C1CD89A
+026206100279FFFFFFFFFFFFFF3133FFFFFFB000DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD263190013F6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFE203E2FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6025CE8FFEFDBFFD4EAFFFF9C00AAFFFF0B10
+BBFFA6009FFFE20D3DD7FFFAD2FFA00197FFF14318FAFF344BFFFFFFFFFFFFFFFFFD2423
+BDFFFFCCFFCD0020CAFD7E00A9FFE801A1FFFFFF2B56FFFFFF9A003AE3FB4D0DFFFFFFFF
+FFFFBB057EFFFFFFE800A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE4B89FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5108F4FFFFFFFFFFFFF3A98783116BFFFF0B4EFFFFFF126CFF7F00C2FF
+FFFFFFFF3D2BFFFFFFBD00C2FF344BFFFFFFFFFFFFFFFFC2007FFFFFFFFFFFCD006AFFFF
+FF104CFFA900D4FFFFFF2B56FFFFFF9A00ACFFFFA900DAFFFFFFFFDF1836FFFFFFFFFF0E
+72FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3534FF
+FFFFFFFFFF9F0C0E29390D56FFFF0B86FFFFFF245EFF5C14FFFFFFFFFFFF220204040404
+049FFF344BFFFFFFFFFFFFFFFF9400DFFFFFFFFFFFCD00AEFFFFFF3933FF9F00DFFFFFFF
+2B56FFFFFF9A02FFFFFFD000C5FFFFFFE31E26F1FFFFFFFFFF136BFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4617FFFFFFFFFFFF203AFFFFFB
+0E55FFFF0B87FFFFFF245EFF7103E7FFFFFFFFFF2F31FFFFFFFFFFFFFF344BFFFFFFFFFF
+FFFFFFAE00A3FFFFFFFFFFCD0084FFFFFF2041FFDB00ACFFFFFF2B56FFFFFF9A02FFFFFF
+D000C5FFFFE82223E8FFFFFFFFFFF30197FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF8000B6FFFFFFFFFF1867FFFF9E0055FFFF0B87FFFFFF24
+5EFFB8017DFFFFFFFFFF6502D4FFFFFFFBFFFF344BFFFFFFFFFFFFFFFFED0B4BFFFFFFFF
+FFCD0042FFFFDF0176FFFF0D80FFFFFF473FFFFFFF9A02FFFFFFD000C5FFEC2520E5FFFF
+FFFFFFFFBC00CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFD2D043B6F418EFF630D5B47121555FFFF0B87FFFFFF245EFFFF51012E6E4E67FF
+F6260A41705117FFFF344BFFFFFFFFFFFFFFFFFF80021F675A46FFCD00202B5D0D1CF4FF
+FF3D4AFFFFFF89073C4CE39A02FFFFFFD000C5FF4B002C3939394FFFFFFF7518FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7B453D60D7
+FFF6914359C37D9BFFFF64BCFFFFFF78A1FFFFFF934B3A56BFFFFFFB79463A509BFFFF84
+94FFFFFFFFFFFFFFFFFFFFB2523A4CA1FFE55AD7683E60EAFFFFFFBD08E5FFFFFFC2725A
+E7C75CFFFFFFE75AE0FF8C5A5A5A5A5A6FFFFFFF1C7DFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3666FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF9E14F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECB4B4B4B4B4B4B4FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFCD9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4
+B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB41C1C1C1C1C1C1CFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3438AF4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62000A48AAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFDD00000000175FCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF0D0000000000012879E8FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3CFFFFFFFF5A0000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0008A1FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFF48A4EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C000000000003338AF4FFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFAD4A0B0076FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3AEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFDA00000000216FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFD2631800000004F6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+523E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E52FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D0012
+56C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFED7F2B0100000000001BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFB02DE2FFFFFFFF
+4379FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34E9EFDFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF8F04000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000072FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFF9500D7FFFFFFFF1753FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFE070220000000000001CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF7AFFFFFF9500D7FFFFFFFF1753FFFFC2ECE89AB0FFFFFFFFFFD494CFFFBFED
+FFECC2FFFFFFF6BFF8FFFFFFDF9BA1ECFFFFFFCCE0FFFFFFD5D7FFFFFFFBB990C5FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFC2571200000004F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFF95
+00D7FFFFFFFF1753FFFF045909160037FFFFFF760311065A009AFF9404FFFFFFC900CCFF
+FF6F04130B10AAFFFF2163FFFFFF3E40FFFFCF23031C0043FDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFD9F4107007AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF9500D7FFFFFFFF1753FFFF
+0414C0FF9900ADFFD00363F6DB2E009AFF9404FFFFFFC900CCFFA60191FFF34715F6FF21
+63FFFFFF3E40FFFF2C2DE0FFBC067AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFEF8049
+FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFF7AFFFFFF9500D7FFFFFFFF1753FFFF0458FFFFFD0D77FF7004
+EFFFFF89009AFF9404FFFFFFC900CCFF4127FFFFFFC500BBFF2163FFFFFF3E40FFCD009F
+FFFFFF3D36FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FF00FFFFFF9900CAFFFFFFFF1256FFFF0493FFFFFF1D69FF5123FFFFFFDA009AFF9404FF
+FFFFC900CCFF2602040404040499FF2163FFFFFF3E40FF9C00040404040426FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFBD0083FFFF
+FFD70071FFFF0494FFFFFF1D69FF620DFFFFFFA8009AFF9A02F4FFFFA300CCFF332EFFFF
+FFFFFFFFFF2459FFFFFF2940FFB400AAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFF40B41FFFFFF7D00B2FFFF0494FFFF
+FF1D69FF9F00B6FFFF5C009AFFC3009FFFFF4B00CCFF6A01CDFFFFFFFBFFFF3B27FFFFDB
+0240FFF10E43FFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF00FFFFFFFF7A021853280146FFFFFF0494FFFFFF1D69FFFF2E08543722
+009AFFFF2310562C2600CCFFF8290940705215FFFF96013351161C40FFFF900520636433
+64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3DF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFF
+FFFFFFB5563B4E90FFFFFFFF5FC5FFFFFF73A9FFFFF86D3E60DF009AFFFFE2553D6DDD5A
+E5FFFFFB7B473A4F97FFFFFF8F414EB18C8DFFFFFFC5583A416BD7FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD0072FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF720028FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFF8009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF260001D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD72D2FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+CF01000062FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6600000016FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E00000000A3FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFC0000000000040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A00000000
+0006E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1700000000000076FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFB0033F71225C682922FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+9EC7FFFF318FFFFFA6EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF358AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3885FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3B80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3F7CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4278FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4673FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D6BFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5166FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5562FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF595EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C59FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6156FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF6552FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF694E
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E4BFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF7247FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF7644FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B40FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F3DFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF843AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+8936FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFE0DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBE0FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCAF3FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8ECFF
+ECD7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E33FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA83
+E0FFFFFF4A36FFFFFFFFFFFFFFFFFFFFB22D5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC83EDFFFFFF3649FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE800A6FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00ACDFFCD09E0FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9330FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A36FFFFFFFF
+FFFFFFFFFFF61C0B33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFC700CFFFFFFF3649FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE800A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5938FFFFFF3659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF992CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFB50086BFCAFF4A36FBB599E7FFFFFFFFFF5D363333FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAA599DFFFFFFFFFFFD4959A
+E3FFFFFFF4AD96DAFFFFFFEFBFFFD491E3FFFBBB90C2FFFFFFFFFFFFFFFFFFFB9A009EBF
+D0FF3649FAAD9CEDFFFFFFCCE0F3A9AAFFFFDF9BA3ECFFFFFFFFC99399D8FFFFFFFFFFD0
+94D2E800A6FFFFFFFFFFFFFFFFEFBFFFD591E0DAD2FFFFFFE5C7FFFFDAD2FBB599E7FFFF
+FFE709A8FFFFFFA109E7FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E29FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1E00161C3AFF4A2E2A10060EC2FFFFFFB90DD53333FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF930B0B130785FFFFF64601131D04EDFFB41504120365FF
+FFA000620319AAD426021C013FFBFFFFFFFFFFFFFFE71800191C4AFF363A1F120414D7FF
+FF2246121241FF6D04130B10ACFFFF570B240E0477FFFFFF6E0212055A00A6FFFFFFFFFF
+FFFFFFA600620219A44F31FFFFFF7516FFFF4B2D2B10060EC0FFFF870AFFFFFFFFFF0787
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA426FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF
+4A0075FAE51B45FFFFFA2075FF3333FFFFFFFFFFFFFFD0171717171717171750FFFFFFFF
+FFFFD50767F8FB6B07D5FF640794FBFFD2FAFD1D29D4F86900ADFFA00033D5FFFF3129DD
+FFC00973FFFFFFFFFFFFFFFFC700CFFFFFFF36008DFDDD1059FFFF220397FDFFA40194FF
+F14617F8FFC9F8FFFD6906E2FFC7026BFAD72A00A6FFFFFFFFFFFFFFFFA60030D2FFFF4F
+31FFFFFF7516FFFF4B0074FAE71C44FFFF5A20FFFFFFFFFF1E5CFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFA923FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A0FFDFFFF5422FFFF64
+26FDFF3333FFFFFFFFFFFFFFEF9595959595959595B6FFFFFFFFFFFF690EF6FFFFF30984
+FF1836FFFFFFFFFFC20086FFFFFA0A50FFA00097FFFFD80096FFFFFF4132FFFFFFFFFFFF
+FFFFC700CFFFFFFF361DFFFFFF4033FFFF2229FFFFFF3F29FFFFFFC200BFFFFFE5A1857B
+02A3FF6607F6FFFF7F00A6FFFFFFFFFFFFFFFFA60091FFFFFF4F31FFFFFF7516FFFF4B0E
+FBFFFF5522FFFF363AFFFFFFFFFF3A3AFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFAE20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFED00ADFFFFFF4A34FFFFFF6F1AFFC907ACE3E32F30E3FBFFFFFF
+FFFFFBE3E3E3E3E3E3E3E3EDFFFFFFFFFFFF480104040404046AFF0478FFFFFFFFFF9A00
+DBFFFFFF3134FFA000F1FFFFA500040404040422FFFFFFFFFFFFFFFFC700CFFFFFFF3647
+FFFFFF582AFFFF225BFFFFFF240204040404049BFF7307132E390387FF4A29FFFFFFCA00
+A6FFFFFFFFFFFFFFFFA600E8FFFFFF4F31FFFFFF7516FFFF4B33FFFFFF7019FFFF2F40FF
+FFFFFFFF4033FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB51EFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ED00ADFFFFFF4A36FFFFFF6F1AFF9500000000000000C0FFFFFFFFFFC900000000000000
+003AFFFFFFFFFFFF5812FBFFFFFFFFFFFF104FFFFFFFFFFFB100A5FFFFFF1844FFA000FF
+FFFFBD00A3FFFFFFFFFFFFFFFFFFFFFFFFFFC700CFFFFFFF3649FFFFFF582AFFFF2263FF
+FFFF3130FFFFFFFFFFFFF80466FFFFD00187FF5912FFFFFF9C00A6FFFFFFFFFFFFFFFFA6
+00F6FFFFFF5329FFFFFF5916FFFF4B35FFFFFF7019FFFF5226FFFFFFFFFF2455FFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB1BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F8AFFFFFF4A36FFFF
+FF6F1AFFF4D7D7D7D72E2ED7FAFFFFFFFFFFFAD7D7D7D7D7D7D7D7E5FFFFFFFFFFFF9B00
+95FFFFFFFFFBFF3A14F8FFFFFFFFEC0954FFFFC6007CFFA000FFFFFFF6103DFFFFFFFFFB
+FFFFFFFFFFFFFFFFF305A8FFFFFF3649FFFFFF582AFFFF2263FFFFFF6802D0FFFFFFFBFF
+E7039EFFFF680087FF9400C3FFFF5300A6FFFFFFFFFFFFFFFFA600F6FFFFFF7106F4FFFF
+1916FFFF4B35FFFFFF7019FFFF7D0EFFFFFFFFFF0C7DFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFD496
+93D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFC018FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E154667FF4A36FFFFFF6F1AFFFFFFFFFFFF33
+33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4704346E5A1CC2FFCC0E0E
+53682AECFF71012E510722FAFFA000FFFFFFFF97061F6165355EFFFFFFFFFFFFFFFFFF2C
+1A4874FF3649FFFFFF582AFFFF2263FFFFFFF8270A41705116FFFF391866361D0787FFFF
+280957342100A6FFFFFFFFFFFFFFFFA600F6FFFFFFD80620591A2416FFFF4B35FFFFFF70
+19FFFFD003CAFFFFFFC303CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC43021A1C0241ECFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC715
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFF6A56474FF9485FFFFFFAD70FFFFFFFFFFFF8384FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF914D394986F6FFFFE2613D4377FBFFFF9C4B3E6B
+F4FFFFCC5AFFFFFFFFFFC9593B4169D4FFFFFFFFFFFFFFFFFFF39E6180FF8693FFFFFF9E
+7CFFFF76A5FFFFFFFFFB7A473A4F99FFFFEA7D4062E265BCFFFFF46A3E62DF5ACFFFFFFF
+FFFFFFFFFFCF5AFBFFFFFFFFB848448EB16DFFFF9485FFFFFFAD70FFFFFF424EFFFFFF4B
+41FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3212B8FFFFBF1532FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD13FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC60AE7FFE709C5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFF
+FF9C008FFFFFFFFF99009CFFB23FFFFFFFDA39DFFFFFE55025296BFBFFFF5690FFFFFF70
+73FFFFFF91361F3CC2FFFFFFFFFFD410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2B4B4B4
+B4B4B4CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCDB4B4B4B4B4B4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF97D4FFD497FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFF570AFFFFFFFFFFFF0E
+57FF9106FFFFFFC600CFFFEC15277B67104BFFFF2065FFFFFF3D41FFFF710A508A3707CD
+FFFFFFFFDB0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF641C1C1C1C1C1C4FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF581C1C1C1C1C1C5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF391EFFFFFFFFFFFF2439FF9106FFFFFFC600CF
+FF5F0BF1FFFF8802DDFF2065FFFFFF3D41FFEC0965FFFFFF1A4BFFFFFFFFE20BFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF3E1AFFFFFFFFFFFF2038FF9106FFFFFFC600CFFF301C5A5A5A5400A6FF
+2065FFFFFF3D41FFB0004B5A5A5A222BFFFFFFFFE808FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFF5E06F4
+FFFFFFFFFA0A52FF9306FFFFFFC000CFFF25206262626262C9FF2065FFFFFF3A41FF9B00
+55626262627DFFFFFFFFF106FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF3FFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFBB0275FFFFFFFF7D00B6FFA900
+D0FFFF7200CFFF4110FAFFFFFFFFFFFF2D43FFFFFB0E41FFCF0073FFFFFFFFFFFFFFFFFF
+F803FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFD4981EFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4E0680EDEF860849FFFFE50651ECA61E00CFFFB80353
+CCFFEC7AFFFF570FB5E25E0241FFFF391794F6FFB4A5FFFFFFFFFF01FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78000843A3FDFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6F0D01020061F8FFFFFF7503030B7D00CFFFFF9513000C0226FFFFDD1F0004
+3D3A41FFFFE7420207060B88FFFFFFFFFF02FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF604000000145BC7FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD89C0A
+4BFFFFFFFFFFEAC7FDFFFFFFFFFFFFFFDAC0E7FFFFFFFFFDCCE5FFFFFFFFFFFFFFF4C2CF
+FAFFFFFFFFFFFF04F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1B0000000000012677E7FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA61E87FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07EDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF72000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000048FFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0AE5FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C0000000000012778E8
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF804000000175ECCFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0ED8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF79000A47A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFD7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
+D7D7D7D7D783D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
+D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D710D0FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4E89F4FFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30D0D0D0D0D
+0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D070D0D0D0D
+0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8
+E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFBCAF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFCDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE383F6FFFFFF2C54FFFFFFFFFFFFFFBD69
+3C2DB5FFFFFFFFFFFFFFFFC296FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00BBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0884FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFB400E3FFFFFF2C54FFFFFFFFFFFFFF4B1A33009CFFFFFFFFFFFFFF
+FF6B1CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00BBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0884FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68C
+00ADBFD4FF2C54F6A9A0F1FFFFFFFFFFCD009CFFFFFFFFFFFFFFE75617BFBFE3FFFDB28D
+A5ECFFFFFFFFFFB68CAEFAFFDB00BBFFFFF4BFE0FFFFFFFFFFFFFFCF94AEF8FFFFFFC6E7
+ED9EAAFBFFFFFFFFDA95C7FF0884FFFFFFD08D9FECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD417001A1C53FF2C401A1303
+18E3FFFFFFFFCD009CFFFFFFFFFFFFFF8F10041C1C86FF2113250610B1FFFFB50E132610
+57FFDB00BBFFE22629E5FFFFFFFFFFFA4A001A051ED0FFFF10520D16012BFDFFFF86050E
+094E0884FFF41F0C261922FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB400E3FFFFFF2C019AFFD70A67FFFFFFFFCD009CFF
+FFFFFFFFFFFFFF6B1CFFFFFFFFC2FFFFEF3426FFFF3A4AFFFFFDDDFFDB00BBCD183BF4FF
+FFFFFFFFFF6E09BDFFE22835FFFF100DB6FFB10095FFE20854F1E3390084FF7719FBFFFF
+DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB400E3FFFFFF2C26FFFFFF353EFFFFFFFFCD009CFFFFFFFFFFFFFFFF6B1CFF
+FFFFFFFFCF96845404FDFF3F29BDFFFFFFFFDB007F0E52FDFFFFFFFFFFFFFF1C4FFFFFFF
+8505FDFF1047FFFFFF1764FF8401DAFFFFA00084FF7E0D9EFBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB400E3FFFF
+FF2C53FFFFFF4B33FFFFFFFFCD009CFFFFFFFFFFFFFFFF6B1CFFFFFFFD3E041A342D00E5
+FFC53501176AE8FFDB000627FFFFFFFFFFFFFFFFFF06030404040404DDFF107DFFFFFF2A
+57FF6317FFFFFFF30284FFEF4D070B4FCAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB500E3FFFFFF2C54FFFFFF4B33FFFF
+FFFFCD009CFFFFFFFFFFFFFFFF6C1CFFFFFF9E00B2FFFF7B00E3FFFFFFDA731445FFDB00
+881049FDFFFFFFFFFFFFFF1057FFFFFFFFFFFFFF107EFFFFFF2A57FF7506F4FFFFC20084
+FFFFFFED8D2915FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFE502BBFFFFFF2C54FFFFFF4B33FFFFFFFFCD009CFFFFFFFFFF
+FFFFFF930BFFFFFF9007EFFFFF2E00E3FFFBFFFFFF611AFFDB00BBC71342FBFFFFFFFFFF
+FF3D10FAFFFFFFFBFFFF107EFFFFFF2A57FFB8009EFFFF6F0084FFFBFFFFFFAD01D4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF221D497CFF2C54FFFFFF4B33FFFFA3393100293986FFFFFFFFFFFFEA032D4CA5F80D
+2D69202400E3FF1C4F765A0E7AFFDB00BBFFCF163BFAFFFFFFFFFFD813114F6D472EFFFF
+107EFFFFFF2A57FFFF3C064E3F1C0584FF423D6E69203CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF995F87FF7E9BFF
+FFFF9584FFFFB55A5A5A5A5A9EFFFFFFFFFFFFFFDD865BAEFFD0654277D55AF1FF8F513A
+5DA9FDFFED5ADBFFFFD75BA9FFFFFFFFFFFFEC69413C58B2FFFF68B6FFFFFF7C9CFFFFFB
+753F5BD862BBFFB25C3D4C93EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFF6FF00FFF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CAF8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFDFDDFFFFFFFFFFFFFFFFFFD5EFFFFFFFFFFFFFFFD7E5FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFACCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD76890FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFF53F400F453FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFC000CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF413EFFFFFFFFFFFF
+FFFFD509DAFFDD83FDFFFFFF245FFFFFFFFFFFFFFFB8673A2DC0FFFFFFFD1797FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFF1842F020DEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF3D2500253EFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
+00CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF413EFFFFFFFFFFFFFFFF4F41FFFFA500F8FF
+FFFF245FFFFFFFFFFFFFFF421C3000ACFFFFFFFF6E26FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A4440900000052FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFA0050005A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFDBF90BCFFFFFFF8BFF6DF95BDFFFFFFFFFFC795DBC000CAFFFFFFFFFFFFFFFF
+FFFFE29F93D2FFFF413EF8ADA0EFFFFFFFDD06B8FFF48000BBBFD7FF245FF4A5A3F4FFFF
+FFFFFFBD00ACFFFFFFFFE808A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC75B150000000000007BFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFA
+170017FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD2C021C0136F4
+FFD4006105140054FFFFFF580015045800CAFFFFFFFFFFFFFFFFFF66040B2206ACFF4131
+1E130415C6FFFF7A11FFFFC615001C1C5BFF24461514021CECFFFFFFFFBD00ACFFFFFFFF
+FF3049FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFE83A0000000000000000000304040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404000404040404040404040404040404040404040404040404040404040404
+04040404040437FFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF2D002DFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D20D7FFC90E64FFD40024D2FF7202DAFF
+A80083FDCA1E00CAFFFFFFFFFFFFFFFF970073F3FFE5E5FF410073FBD2252EFFFF5029FF
+FFFFA500F8FFFFFF2403A3FFCF0572FFFFFFFFBD00ACFFFFFFFFFF4F29FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFD993F0800000000000079F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F100F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F6FFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF690069FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFEF0184FFFFFF4F26FFD4007AFFFFE2019FFF4E13FFFFFF6500CAFFFF
+FFFFFFFFFFFF3A16FFFFFFFFFFFF410AFBFFFF7600E3FF2C45FFFFFFA500F8FFFFFF242E
+FFFFFF2D47FFFFFFFFBD00ACFFFFFFFFFF740EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF812E0200
+000057FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFD702D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB00
+040404040418FFD400C0FFFFFF078FFF353DFFFFFFA600CAFFFFFFFFFFFFFFFF214BFFFF
+FFFFFFFF4130FFFFFFBD00B5FF264AFFFFFFA500F8FFFFFF245DFFFFFF423DFFFFFFFFBD
+00ACFFFFFFFFFF7B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7681C0012F4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF3AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5008FFFFFFFFFFFFFD400C3
+FFFFFF078FFF4324FFFFFF7E00CAFFFFFFFFFFFFFFFF2F2AFFFFFFFFFFFF4118FFFFFF91
+00CFFF482EFFFFFFA500F8FFFFFF245FFFFFFF423DFFFFFFFFBD00ACFFFFFFFFFF5723FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8518CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1732FFFFFFFFFBFFD400C3FFFFFF078FFF7702E3FF
+FF3D00CAFFFFFFFFFFFFFFFF6402DAFFFFFFFFFF4100D0FFFF4B11FBFF7117FFFFFFD700
+CAFFFFFF245FFFFFFF423DFFFFFFFFBD00ACFFFFFFFFFF3742FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA5081C5D673A51FFD400C3FFFFFF078FFFF41A0D5D2B2000CAFFFFFFFFFFFF
+FFFFF11E07446D39ACFF411A1059300183FFFFC304D8FFFFFF1B204A83FF245FFFFFFF42
+3DFFFF99392E002B398FFFFFFA1183FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD25B3C40
+65CCFFE85AE0FFFFFF61C2FFFFEA613E6AD55AE3FFFFFFFFFFFFFFFFFFF470413F68E5FF
+8D8CA94C469EFFFFFFFF3959FFFFFFEC955E8EFF78A3FFFFFF8E8AFFFFAE5A5A5A5A5AA5
+FFFF8916FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+B80CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2679FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+C6B4B4B4B4B4B4D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93DAFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF884F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF451C1C1C1C1C1C70FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF3FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5377E7FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9500053A95FAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF100000000E4FB5FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF2C0000000000001C67D7FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+000000000000000000000000000000000000000000000000000000000000000000000000
+027DFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B0000000000012778E7FFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFF48A4EFDFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0F000000165DCAFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFAD4A0B0076FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F000A46
+A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFD263
+1800000004F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B88F4FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFED7F2B0100000000001BFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFB02DE2FFFFFFFF4379FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFF8F04000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000072FFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9500D7FFFFFFFF
+1753FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFE070220000000000001CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9500D7FFFFFFFF1753FFFFC2ECE89AB0FF
+FFFFFFFFD494CFFFBFEDFFECC2FFFFFFF6BFF8FFFFFFDF9BA1ECFFFFFFCCE0FFFFFFD5D7
+FFFFFFFBB990C5FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFC25712000000
+04F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF9500D7FFFFFFFF1753FFFF045909160037FFFFFF760311065A009A
+FF9404FFFFFFC900CCFFFF6F04130B10AAFFFF2163FFFFFF3E40FFFFCF23031C0043FDFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFD9F4107007AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95
+00D7FFFFFFFF1753FFFF0414C0FF9900ADFFD00363F6DB2E009AFF9404FFFFFFC900CCFF
+A60191FFF34715F6FF2163FFFFFF3E40FFFF2C2DE0FFBC067AFFFFFFFFFF00FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFEF8049FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9500D7FFFFFFFF1753FFFF
+0458FFFFFD0D77FF7004EFFFFF89009AFF9404FFFFFFC900CCFF4127FFFFFFC500BBFF21
+63FFFFFF3E40FFCD009FFFFFFF3D36FFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9900CAFFFFFFFF1256FFFF0493FFFFFF1D69FF5123
+FFFFFFDA009AFF9404FFFFFFC900CCFF2602040404040499FF2163FFFFFF3E40FF9C0004
+0404040426FFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFBD0083FFFFFFD70071FFFF0494FFFFFF1D69FF620DFFFFFFA8009AFF9A02F4
+FFFFA300CCFF332EFFFFFFFFFFFFFF2459FFFFFF2940FFB400AAFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40B41FFFF
+FF7D00B2FFFF0494FFFFFF1D69FF9F00B6FFFF5C009AFFC3009FFFFF4B00CCFF6A01CDFF
+FFFFFBFFFF3B27FFFFDB0240FFF10E43FFFFFFFFFBFFFFFFFFFF00FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A021853280146FFFFFF0494FFFF
+FF1D69FFFF2E08543722009AFFFF2310562C2600CCFFF8290940705215FFFF9601335116
+1C40FFFF90052063643364FFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB5563B4E90FFFFFFFF5FC5FFFFFF73A9FFFFF86D3E60DF
+009AFFFFE2553D6DDD5AE5FFFFFB7B473A4F97FFFFFF8F414EB18C8DFFFFFFC5583A416B
+D7FFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8009AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFD72D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF
+3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8E3FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFBCAF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFCDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE383F6FFFFFF2C54FFFFFFFFFFFFFFFFFFFF902D77
+FFFFFFFFFFFFFFC296FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00BBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0884FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB400E3FFFFFF2C54FFFFFFFFFFFFFFFFFFE0100951FFFFFFFFFFFFFF6B1CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0884FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFF00FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68C00ADBFD4
+FF2C54F6A9A0F1FFFFFFFFFF3D551851FFFFFFFFFFFFE75617BFBFE3FFFDB28DA5ECFFFF
+FFFFFFB68CAEFAFFDB00BBFFFFF4BFE0FFFFFFFFFFFFFFCF94AEF8FFFFFFC6E7ED9EAAFB
+FFFFFFFFDA95C7FF0884FFFFFFD08D9FECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CAF8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDDFFFFFFFFFFFFFFFFFFD5EFFFFFFFFFFFFFFF
+D7E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD417001A1C53FF2C401A130318E3FFFF
+FF9116F11851FFFFFFFFFFFF8F10041C1C86FF2113250610B1FFFFB50E13261057FFDB00
+BBFFE22629E5FFFFFFFFFFFA4A001A051ED0FFFF10520D16012BFDFFFF86050E094E0884
+FFF41F0C261922FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000CAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF413EFFFFFFFFFFFFFFFFD509DAFFDD83FDFFFFFF245FFFFFFFFFFFFFFFFF
+FFFF872D80FFFFFD1797FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFB400E3FFFFFF2C019AFFD70A67FFFFE5109EFF1851FFFFFFFF
+FFFFFF6B1CFFFFFFFFC2FFFFEF3426FFFF3A4AFFFFFDDDFFDB00BBCD183BF4FFFFFFFFFF
+FF6E09BDFFE22835FFFF100DB6FFB10095FFE20854F1E3390084FF7719FBFFFFDBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC000CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF413EFFFF
+FFFFFFFFFFFF4F41FFFFA500F8FFFFFF245FFFFFFFFFFFFFFFFFFFD70E075CFFFFFF6E26
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFB400E3FFFFFF2C26FFFFFF353EFFFF4342FFFF1851FFFFFFFFFFFFFF6B1CFFFFFFFFFF
+CF96845404FDFF3F29BDFFFFFFFFDB007F0E52FDFFFFFFFFFFFFFF1C4FFFFFFF8505FDFF
+1047FFFFFF1764FF8401DAFFFFA00084FF7E0D9EFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBF90BCFFFFFFF8BFF6DF95BDFFFFFFFFFF
+C795DBC000CAFFFFFFFFFFFFFFFFFFFFE29F93D2FFFF413EF8ADA0EFFFFFFFDD06B8FFF4
+8000BBBFD7FF245FF4A5A3F4FFFFFFFFFF345F125CFFFFFFE808A1FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB400E3FFFFFF2C53FF
+FFFF4B33FFA00BC9E3E3174BE3FFFFFFFFFFFF6B1CFFFFFFFD3E041A342D00E5FFC53501
+176AE8FFDB000627FFFFFFFFFFFFFFFFFF06030404040404DDFF107DFFFFFF2A57FF6317
+FFFFFFF30284FFEF4D070B4FCAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFF6FF00FFF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFDD2C021C0136F4FFD4006105140054FFFFFF580015045800CAFFFFFFFF
+FFFFFFFFFF66040B2206ACFF41311E130415C6FFFF7A11FFFFC615001C1C5BFF24461514
+021CECFFFFFF851BF6125CFFFFFFFF3049FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB500E3FFFFFF2C54FFFFFF4B33FF6C00000000
+000000FBFFFFFFFFFF6C1CFFFFFF9E00B2FFFF7B00E3FFFFFFDA731445FFDB00881049FD
+FFFFFFFFFFFFFF1057FFFFFFFFFFFFFF107EFFFFFF2A57FF7506F4FFFFC20084FFFFFFED
+8D2915FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFF53F400F453FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D20D7
+FFC90E64FFD40024D2FF7202DAFFA80083FDCA1E00CAFFFFFFFFFFFFFFFF970073F3FFE5
+E5FF410073FBD2252EFFFF5029FFFFFFA500F8FFFFFF2403A3FFCF0572FFFFDD0EAAFF12
+5CFFFFFFFF4F29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE502BBFFFFFF2C54FFFFFF4B33FFEDD7D7D7D71748D7FFFFFFFFFFFF93
+0BFFFFFF9007EFFFFF2E00E3FFFBFFFFFF611AFFDB00BBC71342FBFFFFFFFFFFFF3D10FA
+FFFFFFFBFFFF107EFFFFFF2A57FFB8009EFFFF6F0084FFFBFFFFFFAD01D4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF3D2500253EFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0184FFFFFF4F26FFD4007AFFFF
+E2019FFF4E13FFFFFF6500CAFFFFFFFFFFFFFFFF3A16FFFFFFFFFFFF410AFBFFFF7600E3
+FF2C45FFFFFFA500F8FFFFFF242EFFFFFF2D47FFFF3A4BFFFF125CFFFFFFFF740EFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF221D
+497CFF2C54FFFFFF4B33FFFFFFFFFFFF1851FFFFFFFFFFFFFFEA032D4CA5F80D2D692024
+00E3FF1C4F765A0E7AFFDB00BBFFCF163BFAFFFFFFFFFFD813114F6D472EFFFF107EFFFF
+FF2A57FFFF3C064E3F1C0584FF423D6E69203CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFA0050005A0FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFBB00040404040418FFD400C0FFFFFF078FFF353DFFFFFFA6
+00CAFFFFFFFFFFFFFFFF214BFFFFFFFFFFFF4130FFFFFFBD00B5FF264AFFFFFFA500F8FF
+FFFF245DFFFFFF423DFF930ED0E3E31055E5FFFFFF7B09FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF995F87FF7E9BFFFFFF9584
+FFFFFFFFFFFF6F99FFFFFFFFFFFFFFFFDD865BAEFFD0654277D55AF1FF8F513A5DA9FDFF
+ED5ADBFFFFD75BA9FFFFFFFFFFFFEC69413C58B2FFFF68B6FFFFFF7C9CFFFFFB753F5BD8
+62BBFFB25C3D4C93EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFA170017FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFD5008FFFFFFFFFFFFFD400C3FFFFFF078FFF4324FFFFFF7E00CAFFFFFFFFFFFFFFFF
+2F2AFFFFFFFFFFFF4118FFFFFF9100CFFF482EFFFFFFA500F8FFFFFF245FFFFFFF423DFF
+6100000000000005FFFFFF5723FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+2D002DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1732FFFFFFFFFB
+FFD400C3FFFFFF078FFF7702E3FFFF3D00CAFFFFFFFFFFFFFFFF6402DAFFFFFFFFFF4100
+D0FFFF4B11FBFF7117FFFFFFD700CAFFFFFF245FFFFFFF423DFFECD7D7D7D71051D8FFFF
+FF3742FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD608FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF690069FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5081C5D673A51FFD400C3FFFFFF078FFF
+F41A0D5D2B2000CAFFFFFFFFFFFFFFFFF11E07446D39ACFF411A1059300183FFFFC304D8
+FFFFFF1B204A83FF245FFFFFFF423DFFFFFFFFFFFF125CFFFFFFFA1183FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFEA7B29010FF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFD702D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFD25B3C4065CCFFE85AE0FFFFFF61C2FFFFEA613E6AD55AE3FFFF
+FFFFFFFFFFFFFFF470413F68E5FF8D8CA94C469EFFFFFFFF3959FFFFFFEC955E8EFF78A3
+FFFFFF8E8AFFFFFFFFFFFF6AA0FFFFFF8916FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9A3D0600
+000054FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFF3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFB80CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF2679FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD54100000000000007CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFDBFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFC6B4B4B4B4B4B4D7FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF93DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF884F8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE83A000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000033FFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF451C1C1C1C1C1C70FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA
+480A0000000000007CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48A340300000056FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE070220010F3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC2588DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFF48A4EFDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFAD4A0B0076FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFD2631800000004F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFED7F2B01000000
+00001BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF8F0400000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000072FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFE070220000000000001CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFC2571200000004F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFD9F4107007A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFEF8049FDFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF3FFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFF7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF8CAF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDDFFFFFFFF
+FFFFFFFFFFD5EFFFFFFFFFFFFFFFD7E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACCFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFC000CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF413EFFFFFFFFFFFFFFFFD509DAFFDD83
+FDFFFFFF245FFFFFFFFFFFFFFF702B181C3DC0FFFFFD1797FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000CAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF413EFFFFFFFFFFFFFFFF4F41FFFFA500F8FFFFFF245FFFFFFFFF
+FFFFFF536689691E0DDDFFFF6E26FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8E3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCAF6FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDEDFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBF90BC
+FFFFFFF8BFF6DF95BDFFFFFFFFFFC795DBC000CAFFFFFFFFFFFFFFFFFFFFE29F93D2FFFF
+413EF8ADA0EFFFFFFFDD06B8FFF48000BBBFD7FF245FF4A5A3F4FFFFFFFFFFFFFFBC0088
+FFFFE808A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFE383F6FFFFFF2C54FFFFFFFFFFFFFF772D181B3AB9FFFFFFFFFFFFFFC296FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0884FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD2C021C0136F4FFD4006105140054
+FFFFFF580015045800CAFFFFFFFFFFFFFFFFFF66040B2206ACFF41311E130415C6FFFF7A
+11FFFFC615001C1C5BFF24461514021CECFFFFFFFFFFFF9B00C5FFFFFF3049FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB400E3FFFF
+FF2C54FFFFFFFFFFFFFF5964886C210AD4FFFFFFFFFFFF6B1CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFDB00BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF0884FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF53FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF3D20D7FFC90E64FFD40024D2FF7202DAFFA80083FDCA1E00CA
+FFFFFFFFFFFFFFFF970073F3FFE5E5FF410073FBD2252EFFFF5029FFFFFFA500F8FFFFFF
+2403A3FFCF0572FFFFFFBB53331270FFFFFFFF4F29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68C00ADBFD4FF2C54F6A9A0F1FFFFFF
+FFFFFFFFC9017CFFFFFFFFFFE75617BFBFE3FFFDB28DA5ECFFFFFFFFFFB68CAEFAFFDB00
+BBFFFFF4BFE0FFFFFFFFFFFFFFCF94AEF8FFFFFFC6E7ED9EAAFBFFFFFFFFDA95C7FF0884
+FFFFFFD08D9FECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+EF0184FFFFFF4F26FFD4007AFFFFE2019FFF4E13FFFFFF6500CAFFFFFFFFFFFFFFFF3A16
+FFFFFFFFFFFF410AFBFFFF7600E3FF2C45FFFFFFA500F8FFFFFF242EFFFFFF2D47FFFFFF
+B13F1E0A69FBFFFFFF740EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFD417001A1C53FF2C401A130318E3FFFFFFFFFFFFA900B5FFFFFF
+FFFF8F10041C1C86FF2113250610B1FFFFB50E13261057FFDB00BBFFE22629E5FFFFFFFF
+FFFA4A001A051ED0FFFF10520D16012BFDFFFF86050E094E0884FFF41F0C261922FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB00040404040418FFD4
+00C0FFFFFF078FFF353DFFFFFFA600CAFFFFFFFFFFFFFFFF214BFFFFFFFFFFFF4130FFFF
+FFBD00B5FF264AFFFFFFA500F8FFFFFF245DFFFFFF423DFFFFFFFFFFFFA4009AFFFFFF7B
+09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFB400E3FFFFFF2C019AFFD70A67FFFFFFC353361268FFFFFFFFFFFFFF6B1CFFFFFFFFC2
+FFFFEF3426FFFF3A4AFFFFFDDDFFDB00BBCD183BF4FFFFFFFFFFFF6E09BDFFE22835FFFF
+100DB6FFB10095FFE20854F1E3390084FF7719FBFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFF6FF00FFF6FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5008FFFFFFFFFFFFFD400C3FFFFFF078FFF4324
+FFFFFF7E00CAFFFFFFFFFFFFFFFF2F2AFFFFFFFFFFFF4118FFFFFF9100CFFF482EFFFFFF
+A500F8FFFFFF245FFFFFFF423DFFFFFFFFFFFFFF1350FFFFFF5723FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB400E3FFFFFF2C26FF
+FFFF353EFFFFFFBB3F200963F8FFFFFFFFFFFF6B1CFFFFFFFFFFCF96845404FDFF3F29BD
+FFFFFFFFDB007F0E52FDFFFFFFFFFFFFFF1C4FFFFFFF8505FDFF1047FFFFFF1764FF8401
+DAFFFFA00084FF7E0D9EFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFF53F400F453FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF1732FFFFFFFFFBFFD400C3FFFFFF078FFF7702E3FFFF3D00CAFFFFFFFF
+FFFFFFFF6402DAFFFFFFFFFF4100D0FFFF4B11FBFF7117FFFFFFD700CAFFFFFF245FFFFF
+FF423DFFFBFBFFFFFFB0006BFFFFFF3742FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB400E3FFFFFF2C53FFFFFF4B33FFFFFFFFFFFF
+B1008CFFFFFFFFFFFF6B1CFFFFFFFD3E041A342D00E5FFC53501176AE8FFDB000627FFFF
+FFFFFFFFFFFFFF06030404040404DDFF107DFFFFFF2A57FF6317FFFFFFF30284FFEF4D07
+0B4FCAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFF3D25
+00253EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5081C
+5D673A51FFD400C3FFFFFF078FFFF41A0D5D2B2000CAFFFFFFFFFFFFFFFFF11E07446D39
+ACFF411A1059300183FFFFC304D8FFFFFF1B204A83FF245FFFFFFF423DFFD51246593008
+1BEAFFFFFA1183FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB500E3FFFFFF2C54FFFFFF4B33FFFFFFFFFFFFFF1B46FFFFFFFFFFFF6C
+1CFFFFFF9E00B2FFFF7B00E3FFFFFFDA731445FFDB00881049FDFFFFFFFFFFFFFF1057FF
+FFFFFFFFFFFF107EFFFFFF2A57FF7506F4FFFFC20084FFFFFFED8D2915FDFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFA0050705A0FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD25B3C4065CCFFE85AE0FFFF
+FF61C2FFFFEA613E6AD55AE3FFFFFFFFFFFFFFFFFFF470413F68E5FF8D8CA94C469EFFFF
+FFFF3959FFFFFFEC955E8EFF78A3FFFFFF8E8AFFF6834B384675F3FFFFFF8916FAFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE502BB
+FFFFFF2C54FFFFFF4B33FFFDFAFFFFFFBD0160FFFFFFFFFFFF930BFFFFFF9007EFFFFF2E
+00E3FFFBFFFFFF611AFFDB00BBC71342FBFFFFFFFFFFFF3D10FAFFFFFFFBFFFF107EFFFF
+FF2A57FFB8009EFFFF6F0084FFFBFFFFFFAD01D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFA170017FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB80CEFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2679FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF221D497CFF2C54FFFFFF4B33
+FFE7104659330916E3FFFFFFFFFFFFEA032D4CA5F80D2D69202400E3FF1C4F765A0E7AFF
+DB00BBFFCF163BFAFFFFFFFFFFD813114F6D472EFFFF107EFFFFFF2A57FFFF3C064E3F1C
+0584FF423D6E69203CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFF2D002DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6B4B4B4B4B4B4D7
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF884F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFEF995F87FF7E9BFFFFFF9584FFFB864C384671EFFFFF
+FFFFFFFFFFFFDD865BAEFFD0654277D55AF1FF8F513A5DA9FDFFED5ADBFFFFD75BA9FFFF
+FFFFFFFFEC69413C58B2FFFF68B6FFFFFF7C9CFFFFFB753F5BD862BBFFB25C3D4C93EDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF690069FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF451C1C1C1C1C1C70FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFD702D7FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62FFFFFFFFFFFFFFFFFF3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCD608FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA7B29010FF1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFB9A3D0600000054FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
+54100000000000007CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE83A0000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000008C
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5AFFFFFFFFFFFFFFFFFFFFFFFFF48A4EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA480A0000000000007CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFAD4A0B0076FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFF48A340300000056FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFD2631800000004F6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+E070220010F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFED7F2B0100000000001BFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2588DFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFF
+FFFF8F040000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000072FFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFE0702200000000
+00001CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFC2571200000004F8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFD9F4107007AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFEF8049FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF2EFFFFE37AFFFFFF7AE3FFFFB99AFFFFFF6AFFFFFF95BFFFFF
+D783FFFFFF72F1FFFFAEA4FFFFF86EFFFFFF8CCAFFFFCA8CFFFFFF6AFFFFFFA4AEFFFFEA
+76FFFFFF83D7FFFFBF95FFFFFF6AFFFFFF9AB9FFFFDD7EFFFFFF7AE3FFFFB49FFFFFFF66
+FFFFFF90C5FFFFD087FFFFFF72F1FFFFA9A9FFFFF16EFFFFFF87D0FFFFC590FFFFFF6AFF
+FFFF9FB4FFFFE376FFFFFF7EDDFFFFB99AFFFFFF6AFFFFFF95BFFFFFDD7EFFFFFF76EAFF
+FFAEA4FFFFFF6AFFFFFF8CCAFFFFD087FFFFFF6EF8FFFFA4AEFFFFF172FFFFFF83D7FFFF
+C590FFFFFF6AFFFFFF9AB9FFFFE37AFFFFFF7AE3FFFFB99AFFFFFF6AFFFFFF90C5FFFFD7
+83FFFFFF72F1FFFFAEA4FFFFF86EFFFFFF87CAFFFFCA8CFFFFFF6AFFFFFFA4AEFFFFEA76
+FFFFFF7ED7FFFFBF95FFFFFF6AFFFFFF9AB9FFFFDD7EFFFFFF76E3FFFFB49FFFFFFF6AFF
+FFFF90C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFE88EFFFFFF8EE8FFFFC6AAFFFFFF7FFFFFFFA6CAFFFFDF96FFFFFF87F4FFFFBC
+B4FFFFFA84FFFFFF9ED4FFFFD49EFFFFFF7FFFFFFFB4BCFFFFEF8AFFFFFF96DFFFFFCAA6
+FFFFFF7FFFFFFFAAC6FFFFE393FFFFFF8EE8FFFFC0AEFFFFFF7CFFFFFFA3CFFFFFDA9AFF
+FFFF87F4FFFFB8B8FFFFF484FFFFFF9ADAFFFFCFA3FFFFFF7FFFFFFFAEC0FFFFE88AFFFF
+FF93E3FFFFC6AAFFFFFF7FFFFFFFA6CAFFFFE393FFFFFF8AEFFFFFBCB4FFFFFF7FFFFFFF
+9ED4FFFFDA9AFFFFFF84FAFFFFB4BCFFFFF487FFFFFF96DFFFFFCFA3FFFFFF7FFFFFFFAA
+C6FFFFE88EFFFFFF8EE8FFFFC6AAFFFFFF7FFFFFFFA3CFFFFFDF96FFFFFF87F4FFFFBCB4
+FFFFFA84FFFFFF9AD4FFFFD49EFFFFFF7FFFFFFFB4BCFFFFEF8AFFFFFF93DFFFFFCAA6FF
+FFFF7FFFFFFFAAC6FFFFE393FFFFFF8AE8FFFFC0AEFFFFFF7FFFFFFFA3CFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000
+end
+%%PageTrailer
+%%Trailer
+%%EOF
diff --git a/doc/img/ecore_thread.png b/doc/img/ecore_thread.png
new file mode 100644 (file)
index 0000000..2c4ff16
Binary files /dev/null and b/doc/img/ecore_thread.png differ
diff --git a/doc/img/ecore_thread_feedback.eps b/doc/img/ecore_thread_feedback.eps
new file mode 100644 (file)
index 0000000..4d2d2d0
--- /dev/null
@@ -0,0 +1,18387 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (ecore_thread_feedback.eps)
+%%CreationDate: (2011-07-19T13:34:32-03:00)
+%%BoundingBox: -0 -0 635 657
+%%HiResBoundingBox: 0 0 635.271 657
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%EndComments
+
+%%BeginDefaults
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image.  The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/DirectClassPacket
+{
+  %
+  % Get a DirectClass packet.
+  %
+  % Parameters:
+  %   red.
+  %   green.
+  %   blue.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile color_packet readhexstring pop pop
+  compression 0 eq
+  {
+    /number_pixels 3 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add 3 mul def
+  } ifelse
+  0 3 number_pixels 1 sub
+  {
+    pixels exch color_packet putinterval
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+  %
+  % Display a DirectClass image.
+  %
+  systemdict /colorimage known
+  {
+    columns rows 8
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { DirectClassPacket } false 3 colorimage
+  }
+  {
+    %
+    % No colorimage operator;  convert to grayscale.
+    %
+    columns rows 8
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { GrayDirectClassPacket } image
+  } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+  %
+  % Get a DirectClass packet;  convert to grayscale.
+  %
+  % Parameters:
+  %   red
+  %   green
+  %   blue
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile color_packet readhexstring pop pop
+  color_packet 0 get 0.299 mul
+  color_packet 1 get 0.587 mul add
+  color_packet 2 get 0.114 mul add
+  cvi
+  /gray_packet exch def
+  compression 0 eq
+  {
+    /number_pixels 1 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add def
+  } ifelse
+  0 1 number_pixels 1 sub
+  {
+    pixels exch gray_packet put
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+  %
+  % Get a PseudoClass packet;  convert to grayscale.
+  %
+  % Parameters:
+  %   index: index into the colormap.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile byte readhexstring pop 0 get
+  /offset exch 3 mul def
+  /color_packet colormap offset 3 getinterval def
+  color_packet 0 get 0.299 mul
+  color_packet 1 get 0.587 mul add
+  color_packet 2 get 0.114 mul add
+  cvi
+  /gray_packet exch def
+  compression 0 eq
+  {
+    /number_pixels 1 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add def
+  } ifelse
+  0 1 number_pixels 1 sub
+  {
+    pixels exch gray_packet put
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+  %
+  % Get a PseudoClass packet.
+  %
+  % Parameters:
+  %   index: index into the colormap.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile byte readhexstring pop 0 get
+  /offset exch 3 mul def
+  /color_packet colormap offset 3 getinterval def
+  compression 0 eq
+  {
+    /number_pixels 3 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add 3 mul def
+  } ifelse
+  0 3 number_pixels 1 sub
+  {
+    pixels exch color_packet putinterval
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+  %
+  % Display a PseudoClass image.
+  %
+  % Parameters:
+  %   class: 0-PseudoClass or 1-Grayscale.
+  %
+  currentfile buffer readline pop
+  token pop /class exch def pop
+  class 0 gt
+  {
+    currentfile buffer readline pop
+    token pop /depth exch def pop
+    /grays columns 8 add depth sub depth mul 8 idiv string def
+    columns rows depth
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { currentfile grays readhexstring pop } image
+  }
+  {
+    %
+    % Parameters:
+    %   colors: number of colors in the colormap.
+    %   colormap: red, green, blue color packets.
+    %
+    currentfile buffer readline pop
+    token pop /colors exch def pop
+    /colors colors 3 mul def
+    /colormap colors string def
+    currentfile colormap readhexstring pop pop
+    systemdict /colorimage known
+    {
+      columns rows 8
+      [
+        columns 0 0
+        rows neg 0 rows
+      ]
+      { PseudoClassPacket } false 3 colorimage
+    }
+    {
+      %
+      % No colorimage operator;  convert to grayscale.
+      %
+      columns rows 8
+      [
+        columns 0 0
+        rows neg 0 rows
+      ]
+      { GrayPseudoClassPacket } image
+    } ifelse
+  } ifelse
+} bind def
+
+/DisplayImage
+{
+  %
+  % Display a DirectClass or PseudoClass image.
+  %
+  % Parameters:
+  %   x & y translation.
+  %   x & y scale.
+  %   label pointsize.
+  %   image label.
+  %   image columns & rows.
+  %   class: 0-DirectClass or 1-PseudoClass.
+  %   compression: 0-none or 1-RunlengthEncoded.
+  %   hex color packets.
+  %
+  gsave
+  /buffer 512 string def
+  /byte 1 string def
+  /color_packet 3 string def
+  /pixels 768 string def
+
+  currentfile buffer readline pop
+  token pop /x exch def
+  token pop /y exch def pop
+  x y translate
+  currentfile buffer readline pop
+  token pop /x exch def
+  token pop /y exch def pop
+  currentfile buffer readline pop
+  token pop /pointsize exch def pop
+  /Times-Roman findfont pointsize scalefont setfont
+  x y scale
+  currentfile buffer readline pop
+  token pop /columns exch def
+  token pop /rows exch def pop
+  currentfile buffer readline pop
+  token pop /class exch def pop
+  currentfile buffer readline pop
+  token pop /compression exch def pop
+  class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+} bind def
+%%EndProlog
+%%Page:  1 1
+%%PageBoundingBox: 0 0 635 657
+userdict begin
+DisplayImage
+0 0
+635.271 656.873
+12
+794 821
+1
+1
+1
+8
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A87FFFFDB33FFFFFF3EC6
+FFFF975CFFFFFF24FFFFFF638FFFFFC63EFFFFFF33D0FFFF876AFFFFFF24FFFFFF56A0FF
+FFB24AFFFFFF2EE7FFFF7878FFFFF329FFFFFF4AB2FFFFA950FFFFFF24FFFFFF6A7FFFFF
+DB33FFFFFF3EC6FFFF975CFFFFFF24FFFFFF638FFFFFC63EFFFFFF39D0FFFF876AFFFFFF
+20FFFFFF56A0FFFFB24AFFFFFF2EE7FFFF7878FFFFF329FFFFFF4AB2FFFFA950FFFFFF24
+FFFFFF717FFFFFDB33FFFFFF3EBCFFFF975CFFFFFF24FFFFFF638FFFFFC63EFFFFFF39D0
+FFFF876AFFFFFF24FFFFFF56A0FFFFB244FFFFFF2EE7FFFF7878FFFFF329FFFFFF4AB2FF
+FFA950FFFFFF24FFFFFF717FFFFFDB33FFFFFF44BCFFFF975CFFFFFF20FFFFFF638FFFFF
+C63EFFFFFF39D0FFFF876AFFFFFF24FFFFFF56A0FFFFBC44FFFFFF2EE7FFFF7871FFFFF3
+29FFFFFF4AB2FFFFA950FFFFFF24FFFFFF717FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73DAFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3AC5FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7D7
+D7F1FFFFFFFFFFFFF6D7D7E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD53365FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFECD7D7D7D7D7D7D7D7D7D7D7DBFFA3338AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF384CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4400004EFFFFFFFFFFFF6F000029FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC30037FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65000000000000000000000011FF810064FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF051CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4400020DF8FFFFFFFFFF1F020029FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA4675FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99464646463000124646464655FF810064FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF051CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF440032008EFFFFFFFFB900310029FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF990031FFFFFFFFFFFF8100
+64FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF051CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF44007F0635FFFFFFFF4F01880029FFFFFFFFB967463A5181FDFFFFFFFFE3
+6A93FFFFFF946AE2CF7140509BFFFFFFFFFFFFFFFFFFFFFFFFFFFF990031FFFFFFFFFFFF
+810064F1844B4575F8FFFFFFFF956AE0CD74425BFFFFFFAE643F4B78F3FFFFFFFFFFB665
+463A5285FDFFFFFFFFFFFFC0613D62B1FF051CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF44008F3D03DFFFFFF80D28B10029FFFFFF9400000D15030024E7FFFF
+FFC30037FFFFFF3900880D020700005FFFFFFFFFFFFFFFFFFFFFFFFFFF990031FFFFFFFF
+FFFF81005A2B0009000024F8FFFFFF3B00850D000826FFF8530101130A001AC2FFFFFF89
+00000D15020027EDFFFFFFFF8F07000C0A0286051CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF44008F9E006DFFFF8E007BB10029FFFFFFB170DFFFFFE84A0051
+FFFFFFC30037FFFFFF3900066BF4F17B0A04D4FFFFFFFFFFFFFFFFFFFFFFFF990031FFFF
+FFFFFFFF81000436DAFFA0220079FFFFFF3B000558E5FFDBFF670034D8FFFF810324FFFF
+FFAA74E2FFFFE5440059FFFFFFDD070791FFFD8407011CFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFD0F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF44008FFD131EFFFF3307ECB10029FFFFFFFFFFFFFFFFFFFD
+180CFFFFFFC30037FFFFFF390046FFFFFFFF3A0084FFFFFFFFFFFFFFFFFFFFFFFF990031
+FFFFFFFFFFFF810013F3FFFFFF83003AFFFFFF3B0037FFFFFFFFDD0716F3FFFFFFFF4C00
+97FFFFFFFFFFFFFFFFFB1312FFFFFF550064FFFFFFFF55001CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF44008FFF5B00B8DB0340FFB10029FFFFFFFFFFDB9F7D
+72721E00EAFFFFC30037FFFFFF390096FFFFFFFF730067FFFFFFFFFFFFFFFFFFFFFFFF99
+0031FFFFFFFFFFFF810047FFFFFFFFD70026FFFFFF3B008DFFFFFFFF910054FFFFFFFFFF
+910067FFFFFFFFD89E7C72721B01F6FFFF2600D8FFFFFFFFBC001CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44008FFFCA01506A00A0FFB10029FFFFFFF14003
+000000000000C6FFFFC30037FFFFFF3900BDFFFFFFFF95005BFFFFFFFFFFFFFFFFFFFFFF
+FF990031FFFFFFFFFFFF810062FFFFFFFFFF031EFFFFFF3B00B1FFFFFFFF670005090909
+0909070048FFFFEC3D02000000000000D4FFFF1004FFFFFFFFFFF1011CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44008FFFFF290D1A13FDFFB10029FFFFFF42
+003FB0E0FBFF3700C5FFFFC30037FFFFFF3900C0FFFFFFFF95005BFFFFFFFFFFFFFFFFFF
+FFFFFF990031FFFFFFFFFFFF810064FFFFFFFFFF031EFFFFFF3B00BCFFFFFFFF60003662
+62626262626295FFFF3B0044B2E2FBFF3000D2FFFF0E05FFFFFFFFFFF4011CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44008FFFFF7D00005BFFFFB10029FFFF
+FD0715FDFFFFFFFF1D00C5FFFFC30037FFFFFF3900C0FFFFFFFF95005BFFFFFFFFFFFFFF
+FFFFFFFFFF990031FFFFFFFFFFFF810064FFFFFFFFFF031EFFFFFF3B00BCFFFFFFFF8D00
+51FFFFFFFFFFFFFFFFFFF8041AFFFFFFFFFF1700D2FFFF2400E0FFFFFFFFC3001CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44008FFFFFED3533CAFFFFB10029
+FFFFE70018FFFFFFFFBB0100C5FFFFC30037FFFFFF3900C0FFFFFFFF95005BFFFFFFFFFF
+FFFFFFFFFFFFFF990031FFFFFFFFFFFF810064FFFFFFFFFF031EFFFFFF3B00BCFFFFFFFF
+D50411E8FFFFFFFFFFFFFFFFD8001DFFFFFFFFB10100D2FFFF4E006FFFFFFFFF5E001CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44008FFFFFFFFFFFFFFFFFB1
+0029FFFFFF110085FDFFC71D0200C5FFFFC30037FFFFFF3900C0FFFFFFFF95005BFFFFFF
+FFFFFFFFFFFFFFFFFF990031FFFFFFFFFFFF810064FFFFFFFFFF031EFFFFFF3B00BCFFFF
+FFFFFF5D002CD0FFFFFFD25ECCFFFF0C008EFDFFC21A0200D2FFFFD4050BADFFFF9F0901
+1CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44008FFFFFFFFFFFFFFF
+FFB10029FFFFFF850100101C02393900C5FFFFC30037FFFFFF3900C0FFFFFFFF95005BFF
+FFFFFFFFFFFFFFFFFFFFFF990031FFFFFFFFFFFF810064FFFFFFFFFF031EFFFFFF3B00BC
+FFFFFFFFFFF449010317200E0100BCFFFF7C0000111B023E3300D2FFFFFF8004011B1801
+70051CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F5AC2FFFFFFFFFF
+FFFFFFD55A7CFFFFFFFFA63F29477CFB8A5AE0FFFFE05A86FFFFFF875ADFFFFFFFFFC55A
+A0FFFFFFFFFFFFFFFFFFFFFFFFC75A81FFFFFFFFFFFFB95AA5FFFFFFFFFF5E73FFFFFF89
+5ADBFFFFFFFFFFFFFFAA5735293D64C2FFFFFFFFA03E29487FFD855AE8FFFFFFFFB1502C
+4C96FF5F72FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E5FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7EDDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFB4CFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD5CCFFFFFFFFFFE3CAE3FFFFFFFFFFCAD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF7033FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF8633D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA833AEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF784646A4FFFFFFFFFFFFAD464671FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB20041
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF3800C2FFFFFFFF39003AFFFFFFFFBF003AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF4300F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF883FDBFFFFFFFF5F00C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF880090FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3A000031FFFFFFFFFFFF3A000032FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
+0041FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF6DD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF710075FFFFFFFF0E040FFFFFFFFF720075FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF4300F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5500C9FFFFFFFF5F00C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF880090FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3A001202DAFFFFFFFFE304120032FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF8D7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFBD003BFFFFFFC0004B00C3FFFFFF3A00C3FFFFFFFFEFFBFFFFFFFF
+FFFFFFFFFFFFF4EFFF4300F8FFFFFFFFFFFFFFFFFFFFFFECFFFFFFFFFFFFFFFFFFFFFFE7
+FFFFFFFFFFFFFF5500C9FFFFFFFF5F00C5FFFFEDFFFFFFFFFFFFFFFFFFFFF3F1FFFFFFFF
+FBEFFFFFFFFFFFFFFFFFFFE5FFFFFFFFFFFFFFFFFFFFEFFFFF880090FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF933FB1FFFFFFFFFFCF3F7BFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3A005A0068FFFFFFFF7200590032FFFFFFFFFFFBD7C0EDFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFC9ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF0D10FFFFFF7302D00276FFFFFF0E10FFFFFF6F17010523A9
+FFFFFFF4175A9E220427FF4300F8FFFFFD57187AFFFFC7330B001256F4FFFFFF4524DD33
+0B00E2FFFFFFFFFF450B001417177AFF5F00C04F1000148AFFFFFFEC175F9922032BFFFF
+A0250601187AFFFFFFFF782405000629B9FFFFFFFFFF7715001563880090FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64008AFFFFFFFFFFB60045FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3A009C141BFFFFFFFF21129F0032FFFFFFBC33070000001A
+9FFFFFFFFFB60949FFFFFF3809D24E0B00012AD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3800C5FFFF3A20FF1E3CFFFFC2003DFFFF4C002E7E6A
+120297FFFFF3001E0B4E7376FF4300F8FFF43B0272FFFFA906146C7D29002EFFFFFF2E08
+1C346D60ECFFFFFFFFFF942E005E7272B6FF5F00262874510901BCFFFFE8001F0B4F7378
+FF730126776F1A005DFFFFFF31417384430B07D5FFFFFF6D00267C7117220090FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64008AFFFFFFFFFFB60045
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009E5D00B2FFFFBC0058A10032FFFFFF84104C727E
+510801ACFFFFFFB20041FFFFFF30002E155A5B120022FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF710077FFFF0F50FF4E10FFFF740077FFBF022BFB
+FFFFD5071CFDFFF30000A1FFFFFFFF4300F8E328068FFFFFFB1E12E5FFFFFF540095FFFF
+2E004DFFFFFFFFFFFFFFFFFFFF5500C9FFFFFFFF5F002DFDFFFF9B004DFFFFE80000A8FF
+FFFFD8082EFDFFFFFF2705D5FFFFFBFFFFFFFF9A0051FFFFE80B1FF6FFFFE00A0090FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64008AFFFFFFFFFFB6
+0045FFFFFFEC76535068A6FBFFFFFFFFB06D517ADAFFFFFFFF9F8EFFB16C4EF6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009ECD014BFFFF5100C5A10032FFFFFFE8FBFF
+FFFFFFB6042AFFFFFFB20041FFFFFF30001CECFFFFFB1900ADFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD003DFFC3008FFF8C00C6FF3B00C7FF6500
+9EFFFFFFFF4600C7FFF30022FFFFFFFFFF4300C71A0DACFFFFFFB8005CFFFFFFFFBC0052
+FFFF2E00D4FFFFFFFFFFFFFFFFFFFF5500C9FFFFFFFF5F0095FFFFFFF10531FFFFE80025
+FFFFFFFF740099FFFFFFFF77008CFFFFFFFFE8BBA9A90D2DFFFF90007BFFFFFFFF4E0090
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64008AFFFFFFFF
+FFB60045FFFFC70E000B1C0B00C7FFFFED44000B13000B94FFFFFF2A106D000A06ECFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFF2B0BF6FA0E25FFA10032FFFFFFFF
+FFFFFFFFFFFF2409FFFFFFB20041FFFFFF300085FFFFFFFF4A0080FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D11FF7501E2FFDF0178FF1011FFFF
+4700D8FFFFFFFF6E0096FFF3003DFFFFFFFFFF43000E0BC7FFFFFFFF8A001521201F1E1D
+0136FFFF2E06FFFFFFFFFFFFFFFFFFFFFF5500C9FFFFFFFF5F00C0FFFFFFFF1A25FFFFE8
+0041FFFFFFFF51001C21201F1E180067FFFFA825000000000018FFFF6B00ACFFFFFFFF75
+0090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64008AFFFF
+FFFFFFB60045FFFF3D019FFFFFFFA6E5FFFF510172FDFFA01A0BE2FFFF2A0218B9FFF4FD
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFF7F008A900077FFA10032FFFF
+FFFFC04A26130D0D0400E5FFFFB20041FFFFFF3000BFFFFFFFFF7F0069FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3800C73C1CFFFFFF1B3DC5003E
+FFFF4200E0FFFFFFFF73008EFFF30046FFFFFFFFFF43003A005FFFFFFFFF7E003C626262
+62626287FFFF2E0DFFFFFFFFFFFFFFFFFFFFFF5500C9FFFFFFFF5F00C5FFFFFFFF1A24FF
+FFE8004BFFFFFFFF480055626262626262A6FFD40A1073A1D7E31C17FFFF6500B2FFFFFF
+FF7B0090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64008A
+FFFFFFFFFFB60045FFFF300CF6FFFFFFFFFFFFD7033DFFFFFFFF7D006CFFFF2A009CFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFFEF09323606E7FFA10032
+FFFFFF930106324B595A1800D7FFFFB20041FFFFFF3000D2FFFFFFFF870067FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF710079104BFFFFFF491276
+007AFFFF5F00ADFFFFFFFF5100BDFFF30046FFFFFFFFFF4300F4440057FFFFFFB0005DFF
+FFFFFFFFFFFFFFFF2E0DFFFFFFFFFFFFFFFFFFFFFF5600C6FFFFFFFF5F00C5FFFFFFFF1A
+24FFFFE8004BFFFFFFFF6E009AFFFFFFFFFFFFFFFF7F0074FFFFFFFF0B17FFFF880088FF
+FFFFFF590090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64
+008AFFFFFFFFFFB60045FFFF80002272D0FFFFFFFF99004D9491908F7F0148FFFF2A02FA
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFFFF4503033DFFFFA1
+0032FFFFFF1008C6FFFFFFFF2200D7FFFFB20041FFFFFF3000D2FFFFFFFF870067FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48CAFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD00240088FFFFFF86
+002400CAFFFFA50044FFFFFFF10E11F6FFF30046FFFFFFFFFF4300F8FF4D0050FFFFF112
+10E7FFFFFFFFFFFFFFFF2E0DFFFFFFFFFFFFFFFFFFFFFF6B0095FFFFFFFF5F00C5FFFFFF
+FF1A24FFFFE8004BFFFFFFFFBF032DFFFFFFFFFFFFFFFF740089FFFFFF840017FFFFD504
+2DFFFFFFF4120090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF670084FFFFFFFFFFAE0048FFFFF6741700013096FFFF74000304040404040439FFFF2A
+0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFFFFA900009BFF
+FFA10032FFFFDA002BFFFFFFFFEF0800D7FFFFB20041FFFFFF3000D2FFFFFFFF870067FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECFBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D0000DBFFFF
+FFD8000013FFFFFFFF34004FB09B26007BFFFFF30046FFFFFFFFFF4300F8FFFF570048FD
+FF94011880B9AC7F308AFFFF2E0DFFFFFFFFFFFFFFFFFFFFFFAA00226E83C0FF5F00C5FF
+FFFFFF1A24FFFFE8004BFFFFFFFFFF5A002B93BDA37020D2FFBD021A86BD6D0C0D17FFFF
+FF4E0045B6A82C100090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF86006BFFFFFFFFFF8F0063FFFFFFFFFDAE531000B9FF8E007FFFFFFFFFFFFFFFFF
+FF2A10FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFFFFFFB5B4
+FBFFFFA10032FFFFED0108ECFFFFFF590000D7FFFFB20041FFFFFF3000D2FFFFFFFF8700
+67FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF380018FF
+FFFFFFFF170040FFFFFFFFF14A0300000A7EFFFFFFF30046FFFFFFFFFF4300F8FFFFFF61
+0041FBFFA61C0000000125B6FFFF2E0DFFFFFFFFFFFFFFFFFFFFFFFF6A18050069FF5F00
+C5FFFFFFFF1A24FFFFE8004BFFFFFFFFFFFF7E0E0000000532E7FFFF750700000EA02217
+FFFFFFF84A0200023A830090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB50035FFFFFFFFFF510089FFFFFFFFFFFFFFB90051FFC7003DFFFFFFFFFFFF
+FFFFFF2A10FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFFFFFF
+FFFFFFFFFFA10032FFFFFF2E002878893C091800D7FFFFB20041FFFFFF3000D2FFFFFFFF
+870067FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B5C9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFE5ADBCE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8AAC3F1FFFFFFFFFFEDB2D0FFFF
+FFFFFFFFFFFFFFECB1EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF290184FFFFFFA00717F4FFFF8DEDFFFFFF87005BFFFF3E017AFFFFFF
+FFACC3FFFF2A10FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A009EFF
+FFFFFFFFFFFFFFA10032FFFFFFD52800000016B43300D7FFFFB20041FFFFFF3000D2FFFF
+FFFF870067FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF8CE2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC31700172C1A010EA6FFFFFF14092A3D200212DAFFFFE02B0018
+362E15008EFFFF2A10FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7A4DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFF36F462E4165E5FFFFFFFFAE603B2C3A67E5FFFFFFFFFF
+894D2F37519EFAFFFF7C69FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62D4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF1FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF8EBDFFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC98F96CCFD
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5844FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C46C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D09000000
+001979FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2812FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00A3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82B002381
+B8B47A2B00E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2812FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00A3FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B0041
+FAFFFFFFFFFF77EFFFFFFFFFFFEAFFFFFFFFFFFFFFFFFFFBF4FFFF2812FFFFFFFFFFFFFF
+EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00A3FFFFFFFFFFFFFFFFFF
+FFFFE5CAFDFFFFFFFFFFFFFFFFFFF1C5F6FFFFFFFFFFFFFFFFFFFFFFCCEFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE509
+0AE3FFFFFFFFFFFFFFFFFFFFEA460E000B38D8FFFFFFFFE339070426B82812FFFFFFFFB9
+2D09011463FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00A3FFFFFFFFFFFFFF
+FFFF7B120000073ADFFFFFFFFFFFA91E02000324BBFFFFFFFF4709B8510C00022BDAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A30044FFFFFFFFFFFFFFFFFFFFF61A014D8555030EE0FFFFF61A025385500E1412FFFFFF
+94031A717823003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00A3FFFFFFFFFF
+FFFFFF5300126278350010E0FFFFFF8D0205547C4C0204A5FFFFFF3F0029106079380013
+EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF533335353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+353535353535353535353535353535353535353535353535353535353535353535353535
+3535353535353535353535353535353535353524BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF750064FFFFFFFFFFFFFFFFFFFF6D0065FFFFFF860051FFFF740075FFFFFF6D0012FF
+FFF1131BF3FFFFFF4101B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00A3FFFFFF
+FFFFFFFFC3030FD7FFFFFF4D004DFFFFF41401A4FFFFFF880020FDFFFF3F000BD2FFFFFF
+4C0061FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5A007CFFFFFFFFFFFFFFFFFFFF2908F1FFFFFFFD1316FFFF2D0AF6FFFFFFF307
+12FFFF9B0072FFFFFFFFA00067FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00A3FF
+FFFFFFFFFFFF560066FFFFFFFFE20607FFFF940033FFFFFFFFFF2000B4FFFF3F0058FFFF
+FFFFDD0413FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF3EC6FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF7A0060FFFFFFFFFFFFFFFFFFFF131DFFFFFFFFFF3002F8FF1520FFFFFFFF
+FF1C12FFFF73001821201F1E1C0047FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B00
+A3FFFFFFFFFFFFFF3700A9FFFFFFFFFF2100D5FF6C0066FFFFFFFFFF4E0086FFFF3F0091
+FFFFFFFFFF1C01F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFA80040FFFFFFFFFFFFFFFFFFFF1020FFFFFFFFFF3301F1FF1224FFFF
+FFFFFF1F12FFFF68004662626262626293FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+2B00A3FFFFFFFFFFFFFF2200CCFFFFFFFFFF3300ACFF51007FFFFFFFFFFF660068FFFF3F
+00ACFFFFFFFFFF2D00CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFEC0D06D7FFFFFFFFFFFFFFFFFF250BFBFFFFFFFF1B12FFFF280E
+FFFFFFFFFD0B12FFFF940073FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF2B00A3FFFFFFFFFFFFFF3600ACFFFFFFFFFF2200D0FF6A0068FFFFFFFFFF510083FF
+FF3F0094FFFFFFFFFF1E01F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF790034ECFFFFFFFFF458ECFF580089FFFFFFAA0040FFFF
+5D0090FFFFFF880012FFFFE00A19F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF2B00A3FFFFFFFFFFFFFF53006DFFFFFFFFEA0805FDFF900038FFFFFFFFFF2600
+B0FFFF3F0060FFFFFFFFE70610FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D0015618F8C5A1800E8FFE70D0774B8830E04CA
+FFFFE70B0A81C27D0B0D12FFFFFF7D001F88BCA87A2AA3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF2B00A3FFFFFFFFFFFFFFB90213E7FFFFFF5C0046FFFFEF1002B9FFFFFF9C
+001CFBFFFF3F000EE2FFFFFF5B0057FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8617010000012A9BFFFFFFCC270000001C
+B5FFFFFFFFBD1700000A8E2812FFFFFFFF9717000000022AC9FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF2B0029393939393939A9FF48001A738942000BD8FFFFFF80010A658E
+5A04029AFFFFFF3F001E1878944B000EE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
+B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B5BDF3FFFFFFFFFFFFFFE5AE
+DDFFFFFFFFFFFFFFFFCCBFFDFFFFFFFFFFFFFFFFFFE0ACBFECFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF2B000000000000000086FFFD660600000129CFFFFFFFFFFF940F
+00000015A6FFFFFFFF3F00AE3D03000020CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC0A9E7FFFFFFFFFFFFFF
+FFFFD0A4D8FFFFFFFFFFFF3F00B5FFF1AAD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2FAFFFFFFFFFFFFFFFF45EBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF3F00B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4DCCFFFFFFFFFFFFFFFF45EBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F00B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F00B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45
+EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5BFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFF
+FFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFF
+FFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA8EAFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF73DAFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFCFC9FFFFFFEBC6E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFC05A5A5A5A6789CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF220BFFFFFF98007CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF980000000000000255FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF220BFFFFFF98007CFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF980052F5F5CB7110007BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF220BFFFFFFF5E2F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF980055FFFFFFFF760021FFFFFFFFFFF6D4F6FFFFFFFFFFFFFFFF
+FFFFFDD6F5FFFFFFFFFFFFFFFFFED7F8FFFF220BFFFFFFFFFFFFFFFFFFFFFFFFFFFBD5F6
+FFFFFFFFFFFFFFFFFDD7F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
+B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF980055FFFFFFFFD70003FAFFFFB32502000230CAFFFFFFFF
+310FF6510B000249EAFFFFFFFFFE6D0C000638E0220BFFFFFF9E0C83FFFFFF2817F34C0B
+00024FEEFFFFFFFFFA600A00063CE62420FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFF45EBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF980055FFFFFFFFAD000EFFFF8901157598700C06C5FF
+FFFF25013C28776912004AFFFFFFFF590024808A3720150BFFFFFF98007CFFFFFF1C0735
+2C78650F0054FFFFFFFF480031868B3B251014FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFFFF45EBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980055FFFFFFFA470039FFDF0A1EEDFFFFFFCA03
+34FFFFFF25003BF9FFFFF60D01E0FFFFCB0223EFFFFFFB45000BFFFFFF98007CFFFFFF1C
+0043FBFFFFF10703EAFFFFB70036F9FFFFFD460014FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98002B7979570F0004C6FF6F0097FFFFFFFF
+FF4200E8FFFF2500BDFFFFFFFF4200B8FFFF640094FFFFFFFFC6000BFFFFFF98007CFFFF
+FF1C00C9FFFFFFFF3900C5FFFF5500ADFFFFFFFFC60014FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
+1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45
+EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980000000000083BC2FFFF46006B8181
+8181813600BEFFFF2500F1FFFFFFFF78009FFFFF4200D2FFFFFFFFFF070BFFFFFF98007C
+FFFFFF1C03FAFFFFFFFF6D00ABFFFF3400E3FFFFFFFFFB0314FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0F4FFFFFFFFFFFFFF
+FF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980049D8D8E8FFFFFFFFFF280006
+06060606060606A8FFFF2502FFFFFFFFFF7F009DFFFF2A00EBFFFFFFFFFF1B0BFFFFFF98
+007CFFFFFF1C0BFFFFFFFFFF7400A9FFFF2000F9FFFFFFFFFF1214FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFF
+FFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980055FFFFFFFFFFFFFFFF41
+00D6FFFFFFFFFFFFFFFFFFFF2502FFFFFFFFFF7F009DFFFF3F00D5FFFFFFFFFF090BFFFF
+FF98007CFFFFFF1C0BFFFFFFFFFF7400A9FFFF3A00DCFFFFFFFFF80114FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980055FFFFFFFFFFFFFF
+FF6A008FFFFFFFFFFFFFFFFFFFFF2502FFFFFFFFFF7F009DFFFF5F009EFFFFFFFFD0000B
+FFFFFF98007CFFFFFF1C0BFFFFFFFFFF7400A9FFFF5E0098FFFFFFFFAE0014FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980055FFFFFFFFFF
+FFFFFFD40615E4FFFFFFFFFFE6FFFFFF2502FFFFFFFFFF7F009DFFFFC1002CF8FFFFFF53
+000BFFFFFF98007CFFFFFF1C0BFFFFFFFFFF7400A9FFFFD00222E3FFFFED2E0014FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980055FFFFFF
+FFFFFFFFFFFF7E001078A3A0803E1EFFFFFF2502FFFFFFFFFF7F009DFFFFFF4D003299A3
+4A16120BFFFFFF98007CFFFFFF1C0BFFFFFFFFFF7400A9FFFFFF6D0013545918471516FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF51CDFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF980055FF
+FFFFFFFFFFFFFFFFFFAD1F000000001B72FFFFFF2502FFFFFFFFFF7F009DFFFFFFFA5D03
+000023D2220BFFFFFF98007CFFFFFF1C0BFFFFFFFFFF7400A9FFFFFFFF90310B2B69F90A
+2CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD8F6FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFEABCC0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF3BDE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+D9004AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FFFFFF
+FFFD4F0097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6938
+7A997B2C002BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF99E5FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+981E0000001466F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF7EDDFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFF4D9EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
+B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFF45EBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5A2FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCDBAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7C6F9FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8EB3FFFFFFB807FFFF
+FFFFFFFFFFEF66320A50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7946FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC5A5A5A5A5A5A
+5A5A5A5A5A5AE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4200DBFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
+1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF407FFFFFFFB807
+FFFFFFFFFFFFFFE55687374AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45
+EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC500000000
+0000000000000000D1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4200DBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8264B9797F5
+B807F9A275A6FEFFFFFFFFFF554AFFFFFFFFFFFFFFFFFF97E6BA7CBEDDA0FFFFFFEE97F7
+FFDCA1F59E75ACFFFFFFD1ACEE9877B9FFFFFFC9B4FFFFBAC3DC8A7ED1FFFFFFFFC77C8F
+E1B5C5FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DD8FFFFFFFFFFFFFF
+FF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE2E2
+E2E2E20006E2E2E2E2E2FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4200DBFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D1C376F
+6FF2B8054B3A590772FFFFFFFFFF554AFFFFFFFFFFFFFFFFFE004E1768AEAC13FFFFFFD4
+00EBFFA8114041540482FFFF8D22304C49029DFFFF7946FFFF543E1C5E3206D0FFFF9F02
+385A1E2B6FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0ECFFFFFFFFFF
+FFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFE0007FFFFFFFFFFFEE5CFEFFFFFFFFFFFFFFFFFFEE4CDDCF6FFFFFFFF4200DB
+FFFFFFFFFFFFFFFFFFFFFEE5CDDBF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCC3968CAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
+7FFFFFFFB80086FFFF900BFEFFFFFFFF554AFFFFFFFFFFFFFFFFFE003EFAFFFFAC13FFFF
+FFD400EBFFA80096FFFF8019FFFF8D00B1FFFF6534FFFF7946FFFF5404E6FFFF2C6DFFF9
+1677FFFFC0006FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFE0007FFFFFFDF4D0E000000199EFFFFFFFFFF84140000000642FFFFFF42
+00DBFFFFFFD22414B0FFFF8C170000000438FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7D7D7D7D7D7FFFFD9FE
+FFD9D7D7D7D7D7D7D7FEFFD9FEFFD9D7D7D7D7D7D7D7FEFFD9FEFFD9D7D7D7D7D7D7D7FE
+FFD9FEFFD9D7D7D7A31B09224B97EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF407FFFFFFFB800E1FFFFD100E6FFFFFFFF554AFFFFFFFFFFFFFFFFFE008DFFFFFFAC13
+FFFFFFD400EBFFA804EDFFFFC100F5FF8D12FBFFFFA611FFFF7946FFFF5446FFFFFF6D4A
+FFD500C6FFFFFD116FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFE0007FFFFFFBE105B85986F13009EFFFFFF99001E6796895E20FFFF
+FF4200DBFFFFBC1010BDFFFFA4001A64948B6119FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2727272727272727FFFF
+2EF9FF2E27272727272727F9FF2EF9FF2E27272727272727F9FF2EF9FF2E272727272727
+27F9FF2EF9FF2E272727270E000002152ABDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF407FFFFFFFB807FFFFFFE000DFFFFFFFFF554AFFFFFFFFFFFFFFFFFE00BFFFFFFF
+AC13FFFFFFD400EBFFA817FFFFFFD000EFFF8D32FFFFFFB50AFFFF7946FFFF546BFFFFFF
+7C43FFC200ECFFFFFF356FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7
+F3FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFE0007FFFFFFF4F8FFFFFFFFDE0F1DFFFFFF4600C2FFFFFFFFFB
+FFFFFF4200DBFFA1071DD2FFFFFF5000B6FFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF7B112E529AEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF437DFFFFFFB807FFFFFFE000DFFFFFFFFF554AFFFFFFFFFFFFFFFFFE00C1FF
+FFFFB606F6FFFFA400EBFFA817FFFFFFD000EFFF8D32FFFFFFB50AFFFF7946FFFF546BFF
+FFFF7C43FFE100AFFFFFF3056FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5CD2FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFF4E00EDFFFF5600B9FFFFFF
+FFFFFFFFFF4200DB83022DE4FFFFFFFF6100ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC572CAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7554FFFFFFB807FFFFFFE000DFFFFFFFFF554AFFFFFFFFFFFFFFFFFE00
+C1FFFFFFDD00AFFFF44400EBFFA817FFFFFFD000EFFF8D32FFFFFFB50AFFFF7946FFFF54
+6BFFFFFF7C43FFFF3842DDF377016FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFDD69371E13130800C7FFFFB8000541
+91E2FFFFFFFFFF42004C0042F3FFFFFFFFFFC500033D8EDFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFC5181B2FEBB807FFFFFFE000DFFFFF2B1707071721FFFFFFFFFFFF
+FE00C1FFFFFFFF5B013B0E6E00EBFFA817FFFFFFD000EFFF8D32FFFFFFB50AFFFF7946FF
+FF546BFFFFFF7C43FFFFD524030F533B77FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFC307043B5E6E712F00BDFFFFFFAF
+3F01000132C0FFFFFF42000C009FFFFFFFFFFFFFFFB5430200012EB9FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFD6BFF9EEC1FFFFFFF8BFF7FFFFC5BFBFBFBFC2FFFFFFFF
+FFFFFFBFF0FFFFFFFFFEB69ED4F5BFFAFFEAC5FFFFFFF4BFFBFFE3CCFFFFFFEDC2FFFFDE
+D1FFFFD5DAFFFFFFDFD0FFFFFFFDD4E6F40896FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFF3102BEFFFFFFFF4C00BDFFFF
+FFFFFFDB84300109D6FFFF4200B51A0399FFFFFFFFFFFFFFFFDE88330106CDFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFDADEFFE17008E3FFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF48CAFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFE081EFFFFFFFFFE1E00BD
+FFFFFFFFFFFFFFFF520086FFFF4200DBDD1F028FFFFFFFFFFFFFFFFFFFFF5C007BFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB30A120117AEFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFECFBFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFF1302D9FFFFFF9000
+00BDFFFFE6FFFFFFFFFF60008FFFFF4200DBFFE2240186FFFFFFE6FFFFFFFFFF6B0083FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE2E8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFF5B002A85A65D
+072A00BDFFFF213E86AA9F64040FDDFFFF4200DBFFFFE82A007BFFFF2B3984A8A167070B
+D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFEF470000
+0016AE6200BDFFFF5A0F0000000030BEFFFFFF4200DBFFFFFFEB2F0071FF621100000000
+2BB7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
+B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+DDB8DEFFFFFFFFFFFFFFFFFED8B9BDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED9BC
+BADDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFF45EBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
+1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFF45
+EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFF
+FF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62
+D4FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFB6EDFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD364FFFFFFFFFFFFFFFFECB8A9CBFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB
+8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB6EDFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5E93FFFFFFB807FFFFFFFFFFFFFF88031622003CF2FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF7D4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF67D5FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF407FFFFFFFB807FFFFFFFFFFFFFFADCBFFFFCD0574
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D162B5757EFB807E3623566EAFFFFFFFFFFFFFF
+4B46FFFFFFFFFFFFFE57D07A3CA1C964FFFFFFE357F2FFC667DB5E356CF0FFFFB479CD58
+3779F7FFFFA786FFFF8F9EAD4A3E98FFFFFFFD8A3C4FB587A1FFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EB4FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCD2FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC92C57AFAFF8B803367A99244DFFFFFFFFFF
+FFFC276DFFFFFFFFFFFFFE002751A8CCAC13FFFFFFD400EBFFA80B3381941E5DFFFF8D16
+318C891478FFFF7946FFFF54233A9E7204B1FFFF710E789A2B196FFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
+B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83625519FF2FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF407FFFFFFFB800A1FFFFA203FAFFFF
+FFFFFF7C11E6FFFFFFFFFFFFFE0057FFFFFFAC13FFFFFFD400EBFFA800B1FFFF920EFFFF
+8D00CDFFFF7629FFFF7946FFFF540EF8FFFF3D62FFF20793FFFFDC006FFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFF45EBFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF6F6F6F6F6F6F6F6F6F6F6F6FFB746F6F6F6F6F6F6F6F6F6F6FFB
+746F6F6F6F6F6F6F6F6F6F6FFB746F6F6F6F6F6F6F6F6F6F6FFB746F6F6F6C1E00000D1B
+69D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF407FFFFFFFB802F0FFFFDB00E1
+FFFFFFFF9907BAFFFFFFFFFFFFFFFE009FFFFFFFAC13FFFFFFD400EBFFA80AF8FFFFCA00
+F1FF8D1FFFFFFFAF0DFFFF7946FFFF5457FFFFFF7646FFCD00D7FFFFFF206FFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF8F8F8F8F8F8F8F8F8F8F8F8FFC938F8F8F8F8F8F8F8F8F8F
+8FFC938F8F8F8F8F8F8F8F8F8F8FFC938F8F8F8F8F8F8F8F8F8F8FFC938F8F8F871E0006
+172A8EEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF407FFFFFFFB807FFFFFFE0
+00DFFFFFFFA106ACFFFFFFFFFFFFFFFFFE00C1FFFFFFAC13FFFFFFD000EBFFA817FFFFFF
+D000EFFF8D32FFFFFFB50AFFFF7946FFFF546BFFFFFF7C43FFC700E2FFFFFF2C6FFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45EBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6EB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12A35
+66C3FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A77FFFFFFB807FFFF
+FFE000DFFFFFA806A7FFFFFFFFFFFFFFFFFFFE00C1FFFFFFBE01EBFFFF8E00EBFFA817FF
+FFFFD000EFFF8D32FFFFFFB50AFFFF7946FFFF546BFFFFFF7C43FFEC029EFFFFE7006FFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45D9EB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB
+EBEBEBEBEBEBEB66B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
+1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5
+E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8639DBEFFEB807
+FFFFFFE000DFFFB1047AD7D7D7DEFFFFFFFFFFFFFE00C1FFFFFFEB077CF6C12C00EBFFA8
+17FFFFFFD000EFFF8D32FFFFFFB50AFFFF7946FFFF546BFFFFFF7C43FFFF5821A0C2440E
+6FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFF73
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E
+3E3E3E3E3E3E3E3E3E3DCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD581600E7
+B807FFFFFFE000DFFF5D00000000002AFFFFFFFFFFFFFE00C1FFFFFFFF920305179F00EB
+FFA817FFFFFFD000EFFF8D32FFFFFFB50AFFFF7946FFFF546BFFFFFF7C43FFFFF3621427
+92347DFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2DEFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE701A2FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+C29ED2A23D19F5FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFCB44222857DDFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2FAFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
+CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61B1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFECF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A2BFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7CB2FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC0006F4FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94C2FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFAD7FBFFFFFF445DFFFFFFFFFFFFFFF8B67762C6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57000086FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF334DFFFFFFFFFFFFFF51000D0090FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1400002DFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF334DFFFAF4FFFFFFFFCADBDF0090FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9000000
+01CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0B000C0D40FF334B4907033BF3FFFFFFFFDF0090
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B00
+0000005DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAD00C2E3EDFF330651CA8D0675FFFFFFFFDF
+0090FFFFFFFFFFFFFFFFC7464646464646464688FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA
+0D0000000013FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF3313FFFFFF2F3EFFFFFF
+FFDF0090FFFFFFFFFFFFFFFFCC535353535353535391FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF970000000000009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF3346FFFFFF522EFF
+FFFFFFDF0090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF3F0000000000003CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF334DFFFFFF53
+2EFFFFFFFFDF0090FFFFFFFFFFFFFFFFB51C1C1C1C1C1C1C1C68FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFF1082C664239723D07E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
+1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD01C0FFFFFF334DFFFF
+FF532EFFFFFFFFDF0090FFFFFFFFFFFFFFFFDD8383838383838383B4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFBFA3FFFF684FFFFFCAC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFEDEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E5FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C3C87ACFF334D
+FFFFFF532EFFFFC77267004872A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF6D4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFCA7EDFFFFFF6C53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFB9D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF902FFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2582B58FF
+576FFFFFFF7452FFFFA1272727272771FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF7147FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFF400CBFFFFFF6C53FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF338CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF902FFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7544FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFDD2B5E1FFFFFFCF00ABD7E0FF6C53FDD0BAF1FFFFFFFFFFD9B3D3FFFFFFFDD7F8
+EEB9E0FFFFFFFFE22B76D7D7FEFFF2BFB1D3FFFFFFFFFFF6BBB6E0FFFF902FFFFFFFEBD7
+FBFFFFD6AFC7FBFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A41FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFE43902250067FDFF3100262F59FF6C48431B0B18D9FFFFEF4C022F034DF6FFEF
+008106299DFFFFFFFF66091A2F2FF6D30C3031014BFAFFFF850F33370BD7FF902FFFFFC1
+128BFFDE1D1E3F1F68FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E3DFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFC558A7F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5927D5FFB203A0FFF400CBFFFFFF6C009AFCF02D66FFFF652FE5FFE11F80
+FFEF002FD7FFFFFFFFFFFFFF338CFFFFFFEFE9FFFFDE0C9BFFEF0CC8FFFFF3F6FF902FFF
+A90EA7FFFF6A59FFFFFFEAFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF833AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF96111F4074D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFD067FFFFFFF3848FFF400CBFFFFFF6C1AFEFFFF7838FFFB05A0FFFFFF
+7B35FFEF008AFFFFFFFFFFFFFFFF338CFFFFFFFFFDCEAFA73B63FFF50E84EFFFFFFFFF90
+2F8D11BFFFFFFF7235CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8836FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07070707
+070707070707070707070707070707070707070707070707070707070707070707070707
+0707070707070707070707070707070707030000000021BDFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFE500BFFFFFFF7826FFF400CBFFFFFF6C51FFFFFF942BFFDC000607
+07070720FFEF00C8FFFFFFFFFFFFFFFF338CFFFFFFDD24113B57274DFFFFAA2A0549B7FF
+FF900B0099FFFFFFFFE45B052187EDFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D33FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7
+F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7
+F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7A71519375FB6FBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF6019AFFFFFF533BFFF400CBFFFFFF6C53FFFFFF942BFFEE00
+A9FFFFFFFFFFFFEF00D0FFFFFFFFFFFFFFFF338CFFFFFF622EFEFFFF434CFFFFFFFFCF77
+02C2FF902F960BBAFFFFFFFFFFED9F2A53FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFEA7AECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB591FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAE7BD8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD8AFFFFA8A1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC28AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CD521B6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9130FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC64889E4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF2F4EFFFFF61076FFFF19AFFFFFFF6C53FFFFFF942BFF
+FF2E45FFFFFFFFFDFFEF00D0FFFFFFFFFFFFFFFF5770FFFFFF565FFFFFE8034CFFFDFFFF
+FFFF2A86FF902FFFA00AB3FFFFFDFFFFFF9919FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF7F78FFFFFFC900CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD171A
+39BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C17FFFF443BFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7417FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB90BEF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF972DFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA07347E191DEBFFFF5D23678CFF6C53FFFFFF94
+2BFFFFCA112B808D5B6EFFEF00D0FFFFFFFFFFFFFFFF9B125E6FF9B508717C1B334CFFBA
+38859B640EECFF902FFFFFA80AABFF3C6C9983208CFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF453AFFFFFFC900CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6
+08F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C17FFFF443BFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7417FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A55FF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C2AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1755B83EEFFFFFFFAC48999FFB6A9FFFF
+FFCA95FFFFFFE7825C5F88DEFFF77FE8FFFFFFFFFFFFFFFFFFD4937FFAFEC36D74C7B9A6
+FFEE97675D9BE1FFFFC897FFFFFFBA83F1BA77597DC2FCFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFEA77516BDBFFFFFFFFBD684D6BCDFFFFFA815269CAFFFFFF91ACBC656FFFFF97
+595AA8FFFFFFFFFFFFFFFFFFAA25207272D5C900CD8C5273F4FFFFD772F48151CCFFD770
+5073EDFFFFFFA9614C66CAFFFFFFFFCD635DB45C21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+9E3B0D7279FFFFDB715071E8FFFFFFFFAA605595FFFFFFFFD5675AAC6C17FFFF443BC766
+5AB5FFFFFFDA7851568EFFFFFFFFFFAE634E72DAFF7417FFFFFF9E79F6FFFFFFFFFFFFFF
+D075F37F50D2A39AFFFFFFB887FFFFA09CCF6957ADFFFFFFC503D4FF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA126
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFCA15154B1A0DC5FFFF710319543755FFF423044115079AFFFF2B290B3A60FF
+41063C35036DFFFFFFFFFFFFFFFF8F1A174C4CC6C900331A410730FFFFA300321A48BBAA
+0B1C4C1217E3FFF41247541F06B1FFFFB90B12450B2821FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF80290A4C55FFB20E1A4C1314DDFFFF5E04323F054CFFFFC70F0E460B2A17FFFF441F
+0E3D1D0495FFFF4D3357380746FFFFFF59012056306DFF7417FFFF6B0A9CFFFFFFFFFFFF
+FFFF99022E1C47C34639FFFFFF6B1CFFFF4322133B2302A3FFFF7413FFFFF4FDFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A824FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF58F8FF3327FFFFFF2A36FFCC0460FFFFFFFDFF6E02C7FFF83318FFFF2B04DAFF
+FF8C01C7FFFF7C05DDFFFFFFFFFFFFFFFF453AFFFFFFC90041FFFF9400D0FFA30051FFFF
+FD1B42FFFFFA1355FFFFFBFFFFFF2D38FFFF3426F6FFDB0521FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF7218FFFFFF203AFFFFFB194CFFB6019AFFFFA801B5FF411DF1FFE50B17FFFF
+4400B0FFFD4117FDFFFBFFFFFF9501D2FFAD017CFFFFFFFDFF7417FD4F10B8FFFFFFFFFF
+FFFFFFFF990058FFFFFF4639FFFFFF6B1CFFFF4300C2FFFF253DFFFF4A2CFFFF21B6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFAD21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF66FAFB04539F9F9F4D11FF7C01D2FFFFFFFFFF3622FFFFFF7E00D5FF2B2C
+FFFFFF431D9F9F9F91019EFFFFFFFFFFFFFFFF453AFFFFFFC9009BFFFFEC01A0FFA300AC
+FFFFCD006D9F9F9F3629FFFFDF735046261AFFFF0A64FFFFFF2A21FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7218FFFFDB00669F9F9F3C22FF640C9F9F9F9F0B75FF1354FFFFFF3617
+FFFF4410FFFFFF8D00CFFFFD975C4746029AFF6006F1FFFFFFFFFF7413381AD0FFFFFFFF
+FFFFFFFFFFFF9900B6FFFFFF4639FFFFFF6B1CFFFF4320FFFFFF5923FFFF2947FFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFB21EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AE
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1DA00212D2D2D2D32FF6311FFFFFFFFFFFF2646FFFFFFB900B0FF
+2B54FFFFFF2E102D2D2D2D2DA1FFFFFFFFFFFFFFFF453AFFFFFFC900CDFFFFFF0397FFA3
+00F8FFFFA600282D2D2D2D46FFC70926506F3C12FFF40094FFFFFF4D21FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF7218FFFFB200262D2D2D2D41FF4A0A2D2D2D2D2D83FF0680FFFFFF
+5B17FFFF442EFFFFFFC700ADFF3E0E4165720489FF4923FFFFFFFFFFFF74090956FFFFFF
+FFFFFFFFFFFFFFFF9902FFFFFFFF4639FFFFFF6B1CFFFF433CFFFFFF671FFFFF323FFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFB91BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FD055DFFFFFFFFFFFF8300C6FFFFFFFFFF3A1CFFFFFF7500
+DDFF2B56FFFFFF4515FDFFFFFFFFFFFFFFFFFFFFFFFFFF4639FFFFFFC900CDFFFFFF0397
+FFA300FBFFFFCF0081FFFFFFFFFFFF5E14F8FFFF3D12FFFF0C5BFFFFFF2421FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF7218FFFFDF0078FFFFFFFFFFFF6506E8FFFFFFFFFFFF174DFF
+FFFF3017FFFF440CFDFFFF8400D5E80189FFFFB10089FF6503E7FFFFFFFFFF7417B40B56
+FFFFFFFFFFFFFFFFFFFF9903FFFFFFFF4F28FFFFFF401CFFFF433CFFFFFF671FFFFF5624
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E5FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFBF18FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
+1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FF3F12D2FFFFFDC7FFDD094BEDFFFFE7FF8001A3FFE2
+2824FFFF2B56FFFFFF9C0081FDFFFFC9FBFFFFFFFFFFFFFFFF761CFFFFFFC900CDFFFFFF
+0397FFA300FBFFFFFF2424E0FFFFF6CCFF7412FAFFC60812FFFF401EDFFFBB0321FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF7218FFFFFF2B1FDDFFFFFACAFFC30460F8FFFFDAE8FF4D
+17D8FFC60717FFFF44008FFFEF3320FFF10A86FFF4410089FFC20360F6FFFFE7FF7417FF
+BC0E4EFFFFFFFFFFFFFFFFFF9903FFFFFFFF7504DFFFD0091CFFFF433CFFFFFF671FFFFF
+810EFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC516FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFE02A012533133EFFFF8A0909351F4FFFFD3B00
+240811B5FFFF2B56FFFFFFFF640311372304F6FFFFFFFFFFFFFFFFCD130B1CB1C900CDFF
+FFFF0397FFA300FBFFFFFFC71C032B300E5DFFE80F142E094112FFFFCD17072C0B3621FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7218FFFFFFCD20022A300F55FFFF81080B362804C2
+FFDA1C052D093A17FFFF442915250E0BACFFFF5706300E3F0989FFFF74040D361969FF74
+17FFFFC51146FDFFFFFFFFFFFFFF9903FFFFFFFFEA1506250C3E1CFFFF433CFFFFFF671F
+FFFFE509B1FF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFCC13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFA87979A5FBFFFFFFDA8C7396F1FFFF
+FFAA778FE5FFFFFFB6C9FFFFFFFFFFCC87728DE3FFFFFFFFFFFFFFFFFFFFFFC99FE5F19F
+F3FFFFFFA1E2FFE59FFFFFFFFFFFF89E757CB2FFFFFFFA9986D4D8A9FFFFFFEA8D84D5CC
+B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4ADFFFFFFFFFAA0767BAEFDFFFFFFD88E7286
+D7FFFFFFEF9180CFD2ACFFFFC2BDE38D83DAFFFFFFFFCC7BA9FDA5DDFFFFFFCF86759FF8
+FFD5ACFFFFFFD79FE5FFFFFFFFFFFFFFE2A1FFFFFFFFFFE78483D5D2AEFFFFC2BDFFFFFF
+D0B0FFFFFF573DFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFD210FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFDD0AD21CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD80EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86A6A6A6A6A6A6AD8FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFF16A6A6A6A6A6A665F6A6A6A6A6A6ADDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF906A6A6A6A6A6AA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFE0F31CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44C4C4C4C4C4C4CCFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFED4C4C4C4C4C4C49434C4C4C4C4C4CD4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF784C4C4C4C4C4C8AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE709FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED06FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF603FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6DD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD01FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2EAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF792E13B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF425FFFFFFFFFFFFFFFFFFFFFFFFFFFFD6262626262
+62B1FFE262D2FFFB626AFDFFFFFF8F87FFFFFFFFFB6583FFFFFFFFFFFFFFFFFFFFFFFF68
+626262626CFFFFFF9062EAFFFFFFFF967DFFFFFFFFFFFFFF9A56455688E8FFFF6E626262
+6262A0FFD51AE8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB0ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02FDFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E53FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD50286BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3050FFFFFFFFFFFFFFFFFFFFFFFFFFFA001C2D
+2D2D2D8FFFC200A8FFF8000085FFFFFF3C30FFFFFFFF960005E7FFFFFFFFFFFFFFFFFFFF
+FF06182D2D2D39FFFFFA0E0078FFFFFFFF4622FFFFFFFFFFFF4A052E57410F88FFFF0E17
+2D2D2D2D79FFFF3062FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFDFFFFFFFFFFFFFFFFFFFFFFFFFF2E53FFFF
+FFFFFFFFFFFFFFFFFFFFFFEDFDFFFFFFFF7918FFFFFFFFFFFFFFFFFFFFFFFFFFF4FAFFFF
+FFFFFFFFFBF1FFFFFFFFFFFFFFEDFFFFFFFFFF3050FFFFFFFFFFFFFFFFFFFFFFFFFFFA00
+7EFFFFFFFFFFFFC200A8FFF8001817F8FFFF3C30FFFFFFFF39380E74FFFFFFFFFFFFFFFF
+FFFFFF0670FFFFFFFFFFFF91064524FFFFFFFF4622FFFFFFFFFFD70067FFFFFFFAE8FFFF
+0E62FFFFFFFFFFFFFF9A0CEDFFFFFFFFFFFFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06EDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+66FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA01C01073EE3FFFF3763FFFFFF5543FF460306
+0D0DCFFFFFFFFFFFFFFFFF9919010743E8FF4707020D1AFFFFFFFFFFFFFFFF345F3A0506
+4DFAFFFFDB37060220ADFFFFFF8F17010949EDFFFF3050FFFFFFFFFFFFFFFFFFFFFFFFFF
+FA007EFFFFFFFFFFFFC200A8FFF800770A75FFFF3C30FFFFFFE204965122FFFFFFFFFFFF
+FFFFFFFFFF0670FFFFFFFFFFFF363CB900C0FFFFFF4622FFFFFFFFFFC90094FFFFFFFFFF
+FFFF0E62FFFFFFFFFFFFFFFF0C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09
+E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFCF043AC5871336FFFF2A58FFFFFF4936FFED
+2A4DE3E3FBFFFFFFFFFFFFFFC5033EC981113DFFED631AE3E7FFFFFFFFFFFFFFFF270451
+D2760B65FFFF2A1891BD3208DFFFB60145CD7B0E48FFFF3050FFFF764646464646464646
+E0FFFA005195959595E3FFC200A8FFF800886410F1FF3C30FFFFFF6F0FFBBB00BCFFFFFF
+FFFFFFFFFFFFFF0649959595C7FFDF0397FF1E53FFFFFF4622FFFFFFFFFFFF241364BBFF
+FFFFFFFF0E4195959595D7FFFFFF2653FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0BE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF5904EFFFFF7100D4FF2A58FFFFFF4936
+FFFF2E53FFFFFFFFFFFFFFFFFFFF5108F8FFFF6701E0FF6C1CFFFFFFFFFFFFFFFFFFFF27
+13FFFFFF4712FFBF0081FFFFDF0168FF460DFDFFFF5A03F1FF3050FFFF81535353535353
+5353E3FFFA000B12121212AEFFC200A8FFF80088EF0F66FF3C30FFFFFF1F52FFFF1E50FF
+FFFFFFFFFFFFFFFFFF060A1212126FFF6C10FBFF6B0EFAFFFF4622FFFFFFFFFFFFCD4F09
+001A79F6FFFF0E09121212128FFFFFFF4331FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3A18AC2FDFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0ED8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF3B2BFFFFFFC6009CFF2A58FFFFFF
+4936FFFF2E53FFFFFFFFFFFFFFFFFFFF3333FFFFFFB800A9FF6C1CFFFFFFFFFFFFFFFFFF
+FF2742FFFFFF8601EF8F01DDFFFFFF2043FF2A3DFFFFFFA600BBFF3050FFFFFFFFFFFFFF
+FFFFFFFFFFFFFA007EFFFFFFFFFFFFC200A8FFF80088FF740AE53C30FFFFB800B1F1F166
+0DF8FFFFFFFFFFFFFFFFFF0670FFFFFFFFFF1D4FF1F1CF0290FFFF4622FFFFFFFFFFFFFF
+FFF1A13A0173FFFF0E62FFFFFFFFFFFFFFFF5720FFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FD
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD670313220525CD
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF11D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFF3E25FFFFFFB900A3FF2B54FF
+FFFF3E36FFFF2E53FFFFFFFFFFFFFFFFFFFF362CFFFFFFAC00B0FF6C1CFFFFFFFFFFFFFF
+FFFFFF273CFFFFFF7D01F49500D0FFFFFF1A47FF2D36FFFFFF9B00C2FF3050FFFF531C1C
+1C1C1C1C1C1CD5FFFA007EFFFFFFFFFFFFC200A8FFF80088FFF816583C30FFFF4E000000
+0000008CFFFFFFFFFFFFFFFFFF0670FFFFFFFFB400000000000035FFFF4622FFFFFFFFFF
+FFFFFFFFFFFF2B25FFFF0E62FFFFFFFFFFFFFFFF3A3BFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61068DFFFFE2
+2913F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF13CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFFFFFFFFFFFFFF6302E7FFFF6802DFFF3E
+2BFFFFFA0C36FFFF3D46FFFFFFFFFFFFFFFFFFFF5905F1FFFF5E04EAFF6C1CFFFFFFFFFF
+FFFFFFFFFF270EFFFFFF4017FFCC0178FFFFD40073FF4E09FAFFFF5207F8FF3050FFFFA8
+8383838383838383EDFFFA007EFFFFFFFFFFFFC200A8FFF80088FFFF85062B30FFF60C5A
+CACACACA3032FFFFFFFFFFFFFFFFFF0670FFFFFFFF4B1BCACACACA7803DBFF4622FFFFFF
+FFFFF8FFFFFFFFFF2A1CFFFF0E62FFFFFFFFFFFFFFFF1F5EFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48CAFFFFFFFFFFFFD80656FFFF
+FFFFD80560FFEC39CDFFFFFF45A9FFFFFA682C2251E8FFFF7D66FFFFFF9B4EFFFFFFBD3F
+203296FFFFFFFFFFFF16C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
+1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFE20A2493620B48FF
+FF7F046595350E36FFFF7A12758CEDFFFFFFFFFFFFFFDA0828965D0951FFFF6C1CFFFFFF
+FFFFFFFFFFFFFF270B37A6570678FFFF3B0E6A8D1F10EFFFCD052D9A58075CFFFF3050FF
+FFFFFFFFFFFFFFFFFFFFFFFFFA004172727272A8FFC200A8FFF80088FFFFFD1E0030FF8C
+01D4FFFFFFFF8702D7FFFFFFFFFFFFFFFF0670FFFFFFF40B64FFFFFFFFF30969FF461372
+7272728FAE1C6D9C8F4D0064FFFF0E33727272729AFFFFF30799FFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECFBFFFFFFFFFFFF8F00C2
+FFFFFFFFFF332BFFE200B6FFFFFF0D85FFFF3517677C1F21FBFF4D33FFFFFF7317FFFFAE
+063D894D068CFFFFFFFFFF19BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC533121C5B
+F8FFFFFB57141C6B6B5AFFFFE8753927D7FFFFFFFFFFFFFFFFBF30111D61FBFFFF8941FF
+FFFFFFFFFFFFFFFFFF275955181C71FFFFFFF3531A1337CFFFFFFFB52E101E69FDFFFF55
+71FFFFFFFFFFFFFFFFFFFFFFFFFFFB27272727272771FFD027BBFFFA27A1FFFFFF9E2755
+FF5E47FFFFFFFFFFF12B8DFFFFFFFFFFFFFFFF2E8CFFFFFFAD27D0FFFFFFFFFF5E48FF68
+27272727274DE2592511112677FDFFFF3527272727275CFFFF791CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69
+01F4FFFFFFFFFF4E12FFE200B6FFFFFF0D85FF9E00B5FFFFD20191FF4D33FFFFFF7317FF
+FF2931FFFFFF471EFFFFFFFFFF1CB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF275BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C86FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF7000ECFFFFFFFFFF4912FFE200B6FFFFFF0D85FF610A5A5A5A5A0C65FF4D33FFFFFF73
+17FFFD06335A5A5A3904FDFFFFFFFF1EB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF275BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD74FFBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFF
+FFFFFF9900B2FFFFFFFFFF2B26FFE200B6FFFFFF0A85FF520D6262626262A3FF4D33FFFF
+FF6F17FFF3013A6262626262FBFFFFFFFF22ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF410909090909094EFFFFFFFFFFFF
+FFFFFFFFFFFFC209090909090909DB5C88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C09090909090929FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FF
+FFFFFFFFFFEC0F42FFFFFFFFBF0176FFF80287FFFFB50085FF7701C7FFFFFFFFFFFF5D18
+FFFFFF3617FFFF123CFFFFFFFFFFFFFFFFFFFF24A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF83025BE0F8A81523F8FFFF202ED8C3340285FFEA1233B1FFFA8FD2FF
+95008DF3860817FFFF70047CE5FFD28CFFFFFFFFFF27A3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF99160103003DE2FFFFFFA50B0205730D85FFFFBF24000B0217
+C9FFFF3D00031F5E17FFFFFD660604090556FFFFFFFFFF2B9CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5B71E0FFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFF6FDFFFFFFFFFFFFFFFFFFFFE7B41C27F1FFFFFFFFF4C6F4FFFFFFFFFFFFFFE7BF
+DAFFFFFFFFFFDBD4FFFFFFFFFFFFFFFBCAC7F1FFFFFFFFFFFF2E97FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA90003358DF6FFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFD52659FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3093FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1A0000000B49ACFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF348DFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA00000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF38000000000000175FCCFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3788FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFF7A000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000016BFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A84FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF37000000000000226FDFFFFFFFFFF4FDFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFDDD7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
+D7D7D7D7D7D7D7D7D7D7D7D7D75AB6D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
+D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D737
+7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF180000001257C0FFFFFFFFFFFFFF21B6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF250D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0B0C0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+0D0D85FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF66FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3000841A0FDFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6381EFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAE2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FA
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE883F1FFFFFF334DFFFFFFFFFFFFFF7C361A204BD8FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFE2FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF334DFFFFFFFFFFFFFF0D4F81611319EF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF4DCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9400A4BFD2FF334DF8AC9EEFFFFFFFEDFFFFFF97
+009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF18001A1C4EFF333C1D130315DBFFFFFFFFFF
+FFCF0099FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF330091FDDA0D5EFFFFFF
+FFFFFF5010EAFFFFFFFFFFFFB2171717171717171763FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21B6
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF3320FFFFFF3C37FF
+FFFFFFFF840297FFFFFFFFFFFFFFE39595959595959595C0FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF334BFFFFFF53
+2EFFFFFFFF8E037AFFFFFFFFFFFFFFFFFAE3E3E3E3E3E3E3E3F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF00D8FFFFFF334DFFFF
+FF532EFFFFFF950471FFFFFFFFFFFFFFFFFFA600000000000000004FFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED03B0FFFFFF334D
+FFFFFF532EFFFF9C056BFFFFFFFFFFFFFFFFFFFFF6D7D7D7D7D7D7D7D7E8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF281B4978FF
+334DFFFFFF532EFFF1060B3939393997FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19B60
+84FF8396FFFFFF9A7FFFF65A5A5A5A5A5AACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73DAFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFDB3FE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC266
+40C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9954FFFF7A73FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F54FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4EC91CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5950FFFFFFC900CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1
+064672D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C17FFFF443BFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7417FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9317FDF4FDFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF453AFFFFFFC900CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF8F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C17FFFF443BFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7417FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2371FF21B6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF66FAFFFFB43D2033A0FFFFFFFD76311D339EFFFFD045213287FFFFFF60847C2F44FF
+EC55262763F8FFFFFFFFFFFFFFFF8015123939BFC900B94C213AC6FFFFBF39D04520B6FF
+9A371F3AB9FFFFFD622C1C3087FFFFFFFF902E29725C21FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7120073941FFFFA0381F38B4FFFFFFF8642B2353ECFFFFFF9B3027686B17FFFF443B
+8C302772FFFFFFA53D20244EE2FFFFFFF8682E1E39B1FF7417FFFFFB5B52F6FFFFFFFFFF
+FFFFB83CCD431FC0776CFFFFFF9453FFFF756E94322469FBFFFFA604EDFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77AEFFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFA006418A48059BFFFF400747967077FFDA0A1A7C40026CFFFF2B152074
+91F41B22766D143FFFFFFFFFFFFFFFFFBB2C268C8CDFC9001D497C2018FDFFA3001E4886
+D07C094C8C3C05C2FFF63D8596500487FFFF90023A81221221FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFB146108C93FF85074A8C3F04B8FFFF2F18697A1D25FDFFA1033483281317FFFF
+441118774B0467FFFF6E6B9A711D24FFFFFF2B0B51996789FF7417FFF1351CD4FFFFFFFF
+FFFFFFFF99011D4B85D74639FFFFFF6B1CFFFF4313207555047CFFFF6919FFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AC6FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FF1F3CFFFFFF3D26FFB00085FFFFFFFFFF5606F3FFFF4B0AFAFF2B0B
+FBFFFF6D06E5FFFF9900CAFFFFFFFFFFFFFFFF453AFFFFFFC90058FFFFA900C0FFA3006E
+FFFFF60C5AFFFFFF2242FFFFFFFFFFFF432DFFFF2339FFFFFD0B21FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7218FFFFFD0F52FFFFFF283BFF9500BDFFFFC9009AFF2E2DFFFFFF1417
+FFFF4401DAFFFF590AF4FFFFFFFFFFB900BFFF8D00A8FFFFFFFFFF7417E0242BE8FFFFFF
+FFFFFFFFFFFF990076FFFFFF4639FFFFFF6B1CFFFF4303E3FFFF3234FFFF4133FFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1F402385A5A5A330CFF7304E8FFFFFFFFFF302FFFFFFF9300C6FF
+2B3AFFFFFF3C175A5A5A590194FFFFFFFFFFFFFFFF453AFFFFFFC900B1FFFFFA029BFFA3
+00C5FFFFBF00465A5A5A2623FFFF993A1F170E16FFFF0574FFFFFF3621FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF7218FFFFCD00425A5A5A291DFF5A0B5A5A5A5A0A6CFF0E64FFFFFF
+4317FFFF441AFFFFFFA000C2FFD8552918170191FF570EFDFFFFFFFFFF740D173DF6FFFF
+FFFFFFFFFFFFFFFF9900D0FFFFFF4639FFFFFF6B1CFFFF432DFFFFFF6220FFFF254BFFFF
+F4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF58F8DF00406262626266FF660DFDFFFFFFFFFF2941FFFFFFB000
+B4FF2B56FFFFFF301C6262626262BFFFFFFFFFFFFFFFFF453AFFFFFFC900CDFFFFFF0397
+FFA300FBFFFFA900506262626277FFA3015690BB5712FFF6018CFFFFFF4821FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF7218FFFFB6004B6262626273FF4C0F6262626262A8FF077AFF
+FFFF5617FFFF442AFFFFFFBF00B2FF20227CADB80489FF4C1EFFFFFFFFFFFF740F1D2FF1
+FFFFFFFFFFFFFFFFFFFF9903FFFFFFFF4639FFFFFF671CFFFF433CFFFFFF671FFFFF3A38
+FFFF21B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF66FAFF0A47FFFFFFFFFFFF8F00AAFFFFFFFFFF4212FFFFFF
+6301ECFF2B56FFFFFF4D0AF3FFFFFFFFFFFFFFFFFFFFFFFFFF4C35FFFFFFC900CDFFFFFF
+0397FFA300FBFFFFDF0068FFFFFFFFFFFF571EFFFFFF2D12FFFF134DFFFFFF1921FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF7218FFFFEC015FFFFFFFFFFFFF7001CFFFFFFFFFFFFF1D
+40FFFFFF2417FFFF4406F4FFFF7201E3DD00A3FFFF950089FF7001D0FFFFFFFFFF7417E3
+2229ECFFFFFFFFFFFFFFFFFF9903FFFFFFFF561DFFFFFF301CFFFF433CFFFFFF671FFFFF
+601FFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF77AEFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FF620881EAFFCC90FFF6172AA6FFE5B2FFA9005E
+E89B153DFFFF2B56FFFFFFC6064BC6FFEF7BFAFFFFFFFFFFFFFFFF8812BBE3FAC900CDFF
+FFFF0397FFA300FBFFFFFF42138FF4FFB9A0FF8F07C9F47A0412FFFF5A1097F4720221FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7218FFFFFF4A108CF1FFBD9BFFE50F36B5FFF88CD7
+FF6A0B8EF87B0417FFFF440253E7B21D36FFFD1559FAB6260189FFE30B36B5FFD8BCFF74
+17FFE82625E7FFFFFFFFFFFFFFFF9903FFFFFFFF8A0195F181061CFFFF433CFFFFFF671F
+FFFF9109FBFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF9AC6FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4CAE2FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF33374FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7433F3FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFA5D0504090660FFFFC023000A0468FFFF
+7507040031DFFFFF2B56FFFFFFFFA017000C0220F8FFFFFFFFFFFFFFFFE5411200A1C900
+CDFFFFFF0397FFA300FBFFFFFFEC480207060A7EFFFA3905091E6212FFFFED3B0107234D
+21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7218FFFFFFEF4D0306070976FFFFB921000B02
+18D0FFF44401071C5617FFFF443636070026D8FFFF85140906770A89FFFFAD1A000B0681
+FF7417FFFFED2B20E2FFFFFFFFFFFFFF9903FFFFFFFFFB37000322591CFFFF433CFFFFFF
+671FFFFFF8148EFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2004EFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFEC0049FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4800EDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD43F8EFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFAC9C9F4FFFFFFFFFFE2C0ECFF
+FFFFFFFAC6E7FFFFFFFFFFFFFFFFFFFFFFFFDDBFE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C3CDF8FFFFFFFFE8DBFFFFFFFFFFFFFFE3D8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C5CCF8FFFFFFFFFFE5
+BFDBFFFFFFFFFFE7D4FFFFFFFFFFFFFFFFE3D7FFFFFFFFFFFFCCFAFFFFFFFFFFFFFFDBC3
+F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D7FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7527FFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2004EFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFEC0049FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4800
+EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC005DFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF423C621B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2004EFFFFFFFFFF
+FFFFF1FDFFFFFFFFFFFFFFFFF1FDFFEC0049FFFFFFFFFFFFF6F4FFFFFFFFFFFFFFFFFFFF
+EFFFFFFFFFFFFFFFFFFFFFECFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFF1FFFF
+4800EDFFFFFFFFFFFFECFFFFFFFFFFFFFFFFFFFFFDEFFFFFFFFFFFBC005DFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333333333333C5FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFEA333333333333302B333333333333CAFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF6233333333333377FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2004EFFFFF1
+175CA02102073FE8FFFFFFFFB122020B3CDA0049FFFFFFFF811E03032099FFFFFFDF1767
+851C010E53FAFFFFFFFFDB3E0F000E46E7FFFFFF5E17E2420D01189CFFFFFFFFF64C0C02
+1F944800EDFFFFFFD43A0D000F4BECFFFFFF5318EC3D0B011CA6FFFF9013000B171735FF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C8C8C8C8C8C8C
+E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF68C8C8C8C8C8C88808C8C8C8C8C8CE7FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC8C8C8C8C8C8CB8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2004EFF
+FFED001F0F5B74210045FFFFFFB506106C7F30220049FFFFFF4E00357D61110085FFFFD8
+001E0B64833B003DFFFFFFCA0C0C628334021AF8FFFF4A00263177490604D5FFFFFF3400
+41845F0B1C00EDFFFFBD0A0F6680300121FBFFFF3E01253678440408E2FFC55900317272
+88FFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB200
+4EFFFFED0002B4FFFFFF1B03F4FFFF3203CAFFFFFD2E0049FFFFB0014EFFFFFFF81011F6
+FFD80000ACFFFFFF4201B4FFFF3507CAFFFFFF750070FFFF4A003DFFFFFF7F0063FFFFA4
+004CFFFFFF9C0000EDFFFF2B0BD7FFFFFF67007DFFFF3E0049FFFFFF710071FFFFBC005D
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+B2004EFFFFED002BFFFFFFFF4F00C5FFF4013AFFFFFFFF970049FFFF4E00CFFFFFFFFF51
+00BFFFD80025FFFFFFFFBC0059FFEC003FFFFFFFFFE50436FFFF4A00B4FFFFFFD80044FF
+FF4E00CFFFFFFFFF1C00EDFFD7004AFFFFFFFFD70241FFFF3E00C6FFFFFFC50050FFFFBC
+005DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58F8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE3E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21B6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFB2004EFFFFED0045FFFFFFFF7800ADFFC2005CFFFFFFFFCF0049FFFF30012220201F
+1E130093FFD80044FFFFFFFFF8023CFFB5001021201F1E1D041EFFFF4A00E5FFFFFFFF0B
+36FFFF3306FFFFFFFFFF3A00EDFFA3001221201F1E1D0326FFFF3E00FBFFFFFFFF0341FF
+FFBC005DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66FAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD9AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B100B6EFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6620FFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
+2D2D2D2D2D60FFFF3A85FFFF4E2DB5FFFFFF9435FFFFFFFFFF4930EFFFFFFFFFFFFFFFFF
+FFDA2D2D2D2D2D2D2D2D7ED22D2D2E3A5FE2FFFFFF7249FFFFFFFFD82DB8FFD22D2D2D2D
+2D2DADFF9B17FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFB2004EFFFFED0048FFFFFFFF7800ADFFB90061FFFFFFFFD80049FFFF29046262
+6262626262C0FFD80049FFFFFFFFFD0337FFA6002E62626262626276FFFF4A00EAFFFFFF
+FF0B36FFFF2E09FFFFFFFFFF3E00EDFF9600336262626262627CFFFF3E01FFFFFFFFFF03
+41FFFFBC005DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6123
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C8EFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6620FFFFFFFFFFFFFFFFFFFFFFFFFF
+FF2420626262628CFFFF0E62FFFF23002EFFFFFF7408FFFFFFFFC701067FFFFFFFFFFFFF
+FFFFFFE76262622B09626262A4C2004C6A460E15EAFFFF4C1DFFFFFFFFCA00A0FFC20047
+62626262C7FFFF1981FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFB2004EFFFFED0048FFFFFFFF7800ADFFEC0043FFFFFFFFA60049FFFF4800
+D0FFFFFFFFFFFFFFFFD8002EFFFFFFFFCD0053FFE20040FFFFFFFFFFFFFFFFFF4A00EAFF
+FFFFFF0B36FFFF4900E2FFFFFFFF2500EDFFCC004BFFFFFFFFFFFFFFFFFF3E01FFFFFFFF
+FF0341FFFFBD005CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAA39EE5FFFFFFDFCDFFFFFFE8C5FFE3
+4E1DBFBFE7FFFFFFFFFFFFFFFFFFE8A0A0E8FFFFE39000ACBFF4FFFFFFFFFFFFFFDDCFFB
+B69AE8FFFFFFFFFBB991CAFFFFFFFFFFE59EA4ECFFFFFF6620FFFFFFFFFFFFFFFFFFFFFF
+FFFFFF2444FFFFFFFFFFFFFF0E62FFFF232B02A1FFFF7408FFFFFFFF591F4A29FFFFFFFF
+FFFFFFFFFFFFFFFFFF5C12FFFFFFFFC200A8FFFF930089FFFF4C1DFFFFFFFFCA00A0FFC2
+00A8FFFFFFFFFFFFFF731AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECCFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFB2004EFFFFED0048FFFFFFFF7800ADFFFF2209E3FFFFFF400049FFFF
+91004CFFFFFFFFFFFFFFFFD80002CAFFFFFF580099FFFF2206CAFFFFFFFFFFFFFFFF4A00
+EAFFFFFFFF0B36FFFF890064FFFFFFBC0100EDFFFD1A0AD7FFFFFFFFFFFFFFFF3E01FFFF
+FFFFFF0341FFFFDF003DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF950B0A0D0885FFFF5D26FFFFFF860C
+FF860E061C1C90FFFFFFFFFFFFFFFF8D0A0B0B0A8DFF8717001A1CCAFFFFFFFFFFFFFF59
+232C10070DB0FFFFD72501160042FAFFFF83070D090C97FFFF6620FFFFFFFFFFFFFFFFFF
+FFFFFFFFFF2444FFFFFFFFFFFFFF0E62FFFF234B4124FFFF7408FFFFFFFB126DAE01C9FF
+FFFFFFFFFFFFFFFFFFFFFF5C12FFFFFFFFC200A8FFFFC30081FFFF4C1DFFFFFFFFCA00A0
+FFC200A8FFFFFFFFFFFFFFCF00BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4FDFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD54C211726
+4FDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD9AFFFFFFFF00A0FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D0CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFB2004EFFFFED0048FFFFFFFF7800ADFFFF970020A1BB53100049
+FFFFFF39003D9BBF9C631EFFFFD800101797BF640226FFFFFFB9041075B4B1873A6BFFFF
+4A00EAFFFFFFFF0B36FFFFFD1E036BC091131000EDFFFFAA021379B6AE853676FFFF3E01
+FFFFFFFFFF0341FFFFFF150B598397FFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF58F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE70B3EE5ED4B06D7FF5D26FFFFFF
+860CFFFF6123FFFFFFFFFFFFFFFFFFFFDF0945E8E84409E0FFB500E3FFFFFFFFFFFFFFFF
+FF59005AF4E0331BFDFF3F15B8FF940375FFD4054DEDE33D0DEAFF6620FFFF8117171717
+171717178DFFFF241C535353539EFFFF0E62FFFF234BCF048FFF7408FFFFFF9903DDFF19
+59FFFFFFFFFFFFFFFFFFFFFFFF5C12FFFFFFFFC200A8FFD24103DBFFFF4C1DFFFFFFFFCA
+00A0FFC2003D53535353E8FFFFFD0687FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF181A6B
+9B7830B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6222FFFFFFFF00A0FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D0CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFB2004EFFFFED0048FFFFFFFF7800ADFFFFFF810700001ABD
+0049FFFFFFF865080000000941FFFFD80053590400002DE2FFFFFFFFBD27010000001E9A
+FFFF4A00EAFFFFFFFF0B36FFFFFFDA27000006684800EDFFFFFFB5230100000121A5FFFF
+3E01FFFFFFFFFF0341FFFFFFAA280B001EFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E00B8FFFFD40076FF5D26FF
+FFFF860CFFFF6123FFFFFFFFFFFFFFFFFFFF8300C6FFFFC60080FFB500E3FFFFFFFFFFFF
+FFFFFF5902E5FFFF9500B9FF0655FFFFFF2629FF7501D8FFFFB4008FFF6620FFFFCF9595
+959595959595D4FFFF24163F3F3F3F90FFFF0E62FFFF234BFF4E1BFB7408FFFFFF3A33FF
+FF6312FBFFFFFFFFFFFFFFFFFFFFFF5C12FFFFFFFFC2000709010AB2FFFFFF4C1DFFFFFF
+FFCA00A0FFC2002F3F3F3F3FE3FFFFFF1D5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA000
+A6FFFFFFFFFFFFF8BFF6DA95C6FFFFFFFFF1A48CB2FBFFFFECC2FFFFFFC2D8FFFFE8C3FF
+F4BFFADA94C2FFFFFFFFFFC28CA8F4FFFFFFFFFFE34F1CBFBFE7FF00A0E797B4FFFFFFF8
+BFF6DF96D2FFFFC591B6FDFFFFFFFBAE8CA8EFFFFFFFFFFDB59BEA7D0CFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AA
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB8D7
+FFFFFFFFFFFFFFFFFFFDCDAAC9F8FFFFFFD80053FFF6B4DDFFFFFFFFFFFFFFFFEDB2B6E0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAB6F8FFFFFFFFFFFFFFFFFFEAB0B9E3FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E0AFFFFFFFF1654FF5D
+26FFFFFF860CFFFF6123FFFFFFFFFFFFFFFFFFFF6410FFFFFFFF105EFFB500E3FFFFFFFF
+FFFFFFFFFF591CFFFFFFE80090DD0097FFFFFF5913FF5818FFFFFFFD096BFF6620FFFFF4
+E3E3E3E3E3E3E3E3F6FFFF2444FFFFFFFFFFFFFF0E62FFFF234BFFDD087E7408FFFFE504
+519595780099FFFFFFFFFFFFFFFFFFFFFF5C12FFFFFFFFC2007CB1770E46FFFFFF4E18FF
+FFFFFFBF00A4FFC200A8FFFFFFFFFFFFFFFF2255FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+BC009AFFFFFFFFFFFFD2005904150058FFFFDF071A210222E3FFC500D0FFD0002AFFFF5F
+1FFFBD006404130161FFFFD5131027143EFFFFFFFFFF860E061C1C8FFF005B0716003FFF
+FFD0005F031984E836011C022CE8FFFF1815240413BCFFFFF13300180A4B0CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD80053FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8001DBFFFFF10568
+FF621EFFFFFF690CFFFF6123FFFFFFFFFFFFFFFFFFFF7602E8FFFFE70272FFB500E3FFFF
+FFFFFFFFFFFFFF5909FAFFFFB500A6F6026FFFFFFF3A20FF6906F4FFFFD8017FFF6620FF
+FF7000000000000000007DFFFF2444FFFFFFFFFFFFFF0E62FFFF234BFFFF5C136F08FFFF
+720312121212083AFFFFFFFFFFFFFFFFFFFFFF5C12FFFFFFFFC200A8FFFF99019AFFFF69
+01E2FFFFFF7A00CAFFC200A8FFFFFFFFFFFFFFFF0A7DFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF25043675E0FFFFFFD2001FCAFD8000A6FFF3CDFFFFDB1159FFFF127BFF7C1805F3
+FF2952FFBD002BD8FF6404EAFF5133FFFFFFDBFFFFFFFFFFFF6222FFFFFFFF0018C5FF8D
+00B9FFD00022C5FFFF4D17CFFFD21751FFFFC2FFFFEC2B30FFFF6B0BACFFAA0A0CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD80053FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3017BFFFF91
+00ACFF8102E5FFFF240CFFFF8611FFFFFFFFFFFFFFFFFFFFB80186FFFF8601B8FFB500E3
+FFFFFFFFFFFFFFFFFF5900A9FFFF6607E7FF212EFFFFF30B4DFFA80095FFFF7802C6FF66
+20FFFFEFD7D7D7D7D7D7D7D7F1FFFF2444FFFFFFFFFFFFFF0E62FFFF234BFFFFEA0D1D08
+FFFF2143FFFFFFFF8004E2FFFFFFFFFFFFFFFFFFFF5C12FFFFFFFFC200A8FFFFFF3420FF
+FFA60087FFFFFF3B0FFBFFC200A8FFFFFFFFFFFFFFDD00B0FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFF68126040649EAFFD20068FFFFFF124AFFFFFFBB8E83322CFFFF413DFF3E61
+179CEF0497FFBD008AFFFFCF00B2FF581CB0FFFFFFFFFFFFFFFFFF6222FFFFFFFF0061FF
+FFFA0881FFD00071FFFFFF0770FFFFFF6119FFFFFFCA95834C0BFFFF2439FFFFFF360CFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE22774FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C023D
+44033DFFFFE70A1C591E250CFFFFDF01304CADFFFFFFFFFFFFFFFF440241410245FFFFB5
+00E3FFFFFFFFFFFFFFFFFF591412513C0267FFFF9F041E591010D8FFFF3A03463B0250FF
+FF6620FFFFFFFFFFFFFFFFFFFFFFFFFFFF24143939393956FFFF0E62FFFF234BFFFFFF6C
+0008FFBC00A0FFFFFFFFED0670FFFFFFFFFFFFFFFFFFFF5C12FFFFFFFFC200A8FFFFFFB5
+0191FFFF3B012A52170388FFFFC2002B3939393999FFFF8E0EF3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFE5660178FFD200AAFFFFFF3A31FFDF1E0721371E1CFFFF7F10FF
+10AC48569A03EDFFBD00D7FFFFFD00A1FFD83F03125EDDFFFFFFFFFFFF6222FFFFFFFF00
+9FFFFFFF1773FFD000BBFFFFD80003040404040CFFFA36041C352900FBFF106EFFFFFF6A
+0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+8546437BFDFFFFFFC24B4285BC65FFFFFFDA835BB5FFFFFFFFFFFFFFFFFF80444480FFFF
+FFD85AF1FFFFFFFFFFFFFFFFFF5929B951428DFFFFFFFFBB523C5DDFFFFFFFFD7A424687
+FFFFFFA675FFFFFFFFFFFFFFFFFFFFFFFFFFFF785A5A5A5A5A75FFFF67A4FFFF7795FFFF
+FFF45D62FFA85FFDFFFFFFFFFF7D80FFFFFFFFFFFFFFFFFFFFA06AFFFFFFFFDF5AD0FFFF
+FFFF7387FFFFFF8A4C3B57BCFFFFFFDF5A5A5A5A5A5AAEFFFF2B66FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF262EFFD20081FFFFFF213FFF5A0EEFFFFF401CFFFFD5
+008C09FA89225427FFFFBD00DAFFFFFD00A1FFFFFFE37E1C2EFFFFFFFFFFFF6222FFFFFF
+FF00A0FFFFFF1773FFD000C6FFFFF10179FFFFFFFFFFFF8E02C2FFFF6D00FBFF1C4DFFFF
+FF4A0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5929FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB0BECFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFD7E3FFFFFFED0B39FFD20040FFFFE00274FF5129FFFFF30A1CFF
+FFFF191A33FFE203185DFFFFBD00DAFFFFFD00A1FFFBFFFFFF7E0AFAFFFFFFFFFF8710FF
+FFFFFF00A0FFFFFF1773FFD000C6FFFFFF2424FFFFFFFFFBFF810CF6FFFF2400FBFF451A
+FDFFFB180CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFB4B4B4B4B4B4BFFFFFFFFF
+FFFFFFFFFFFFFFFFFFB9B4B4B4B4B4B4E55929FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDB4B4B4B4B4B4B4FDFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFA9FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF8C063A5C491804AEFFD200202A5D0D1BF4FFB901465F1222
+1CFFFFFF4B006FFFFF2000A6FFFFBD00DAFFFFFD00A1FF2B477361155CFFFFFFFFFFFFE0
+01304CADFF00A0FFFFFF1773FFD000C6FFFFFFB80B1759693E43FFED0931681C2400FBFF
+C60A1A631A200CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF861C1C1C1C1C1C34FFFF
+FFFFFFFFFFFFFFFFFFFFFF281C1C1C1C1C1C9AAE8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB81C1C1C1C1C1C1CF4FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF194533B405FD0FFFFD200BC693E60E8FFFFFFB2514B
+97AA72FFFFFFB45AD0FFFF905BF8FFFFDD5AECFFFFFF5ACCFF9F553B569FF8FFFFFFFFFF
+FFFFDA835BB5FF5ACCFFFFFF6EB0FFE75AE2FFFFFFFFDD603D3E60C3FFFFCA61447CCC5A
+FDFFFFCA544281B665FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7BBFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFD4B4FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF48CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD200C5FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D0FFFFFFFFFF2E0DFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4D00E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5A72E2FFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFECFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD200C5FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF260EFFFFFFFFFF2E0DFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4D00E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFA60004368FF8FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC72E7FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF260EFFFFFFFFFF2E
+0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4D00E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF180000000D4CB2FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF7E5ECCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88180A838383E0
+FF2E0DFFB5675795FFFFFFFFD583CFE086529BFFFFED8A595E99FFFFFFFFFFE3875C4E6E
+C0FFFFFFFFFFFFCF71558EF14D00E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF370000000000001A66D5FFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE20801287AEAFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1503010D0D
+0DB4FF2E0D75021201004AFFFFFF95006715030D5CFFA915021607002EE5FFFFFF040213
+12000370FFFFFFFF9B09021807294500E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8
+FF7A00000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000016BFFFFFFFF25B8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41000000063D9AFBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF260E
+FFFFFFFFFF2E021CC7FFC22501BBFFFF95000268F6FFF1E50C1BC2FFE767004DFFFFFF75
+E5FFFFB82404CAFFFFEC0D14C5FFF63D0200E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF380000000000001C67D7FFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF680000000000001054BFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+260EFFFFFFFFFF2E00ACFFFFFF7D0074FFFF95002FFFFFFFFF5900B0FFFFFFFF1F03F6FF
+FFFFFFFFFFFF950070FFFF6F0088FFFFFFEA0A00E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A0000000E50B6FFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1700000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000004AF3FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF260EFFFFFFFFFF2E05FDFFFFFFCF0058FFFF950069FFFFFFFF30049493918F8E3A00
+C0FFFFF67E49332D2C004EFFFF4500EDFFFFFFFF3300E3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA800063B96FAFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF690000000000001256C0FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF260EFFFFFFFFFF2E0DFFFFFFFFE50053FFFF950083FFFFFFFF19010404040404
+0404A3FFE7190113304A4B0042FFFF2E09FFFFFFFFFF4600E3FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6079E8FFFFFFFFFFFFFFFFFFFFFFFFFFE8FA
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4200000007409EFDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF260EFFFFFFFFFF2E0DFFFFFFFFE50053FFFF950084FFFFFFFF290BFFFFFF
+FFFFFFFFFFFF5C006FFFFFFFDA0042FFFF3F01F4FFFFFFFF3700E3FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE309012C7FEDFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF2C07FDFFFFFFFF2E0DFFFFFFFFE50053FFFF950084FFFFFFFF4C00AD
+FFFFFFFFFFFFFFFF3A03EFFFFFFF8C0042FFFF61009FFFFFFFF81100E3FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8165D4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4500ACFFFFFFFF2E0DFFFFFFFFE50053FFFF950084FFFFFFFFCF
+071CCAFFFFFFEC8CFFFF50008FFFFFCD150042FFFFD80621E7FFFF5C0000E3FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFAD04001117B8FF2E0DFFFFFFFFE50053FFFF950084FFFFFF
+FFFF8D0B052738240712FFFFC707012632095D0042FFFFFF7302103A21153600E3FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD07A5F5AD2FF7F66FFFFFFFFF35A9AFFFFC55ABBFF
+FFFFFFFFFFDB643E2E406CCDFFFFFFC94D304C8DFD5A8EFFFFFFFF9F48335FD4965AF1FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6
+EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF67D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFFA6B8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2FAFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48CAFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4672FFFFFFFFFFFFFFFF869CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFFA6B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C
+D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF73DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFA
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFF
+FFFFFFFF869CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFFA6B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFF6FF3F7AFFF6FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51
+CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFF7EB23F7A74C5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFC50B303B12FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF1F070737FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFF3A000185FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFF8A010BEFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFEF0719FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF16
+3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF869CFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF5EC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFFA6B8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFF
+FFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF8A58C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0E002270E0FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+E8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5000000003348AF4FFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF790000000000000A48AAFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF330000000000
+000000000000000000000000000000000000000000000000000000000000003BE8FFFFFF
+FFFFFFFF71AAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BC
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF780000000000001256BFFFFFFF
+FFFFFFFFFFFFA0C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E00000007419EFDFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC0C022D80EDFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73DAFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F67D5FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8
+EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3291FFFFFFFF7943FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF71AAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF5417FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0C9FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF869CFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF5417FFFF
+D5D7FAB09BECFFFFFFFFED9EB2FBD2D8FFFFC2ECFFFFFFCCE0FFFFFFF4B093D2FFFFFFE2
+CAFFFFFFECC2FFFFFFFFD495AAF4FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFFA6B8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF5417
+FFFF3C3622120412D0FFFFBB120512252A46FFFF0790FFFFFF2066FFFFB21506180263FF
+FF6A1DFFFFFF9504FFFFFD510118061AC7FFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF
+5417FFFF3C0086FDDF1353FFFF262CD8F8670046FFFF0790FFFFFF2066FFF31546EDFF96
+01A9FF6A1DFFFFFF9504FFFF7A06B5FFE72E2CFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFF
+FFFF5417FFFF3C18FFFFFF462EFFD80086FFFFF30546FFFF0790FFFFFF2066FF9602D2FF
+FFFF1E59FF6A1DFFFFFF9504FFFF2444FFFFFF9301F3FFFF71AAFFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF066A
+FFFFFFFF4D18FFFF3C42FFFFFF5E25FFAC00D4FFFFFF2646FFFF0790FFFFFF2066FF6F01
+040404040445FF6A1DFFFFFF9504FFFF0D030404040404CAFFFFA0C9FFFFFFFFFFFFFF76
+A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1739FFFFFFFF222CFFFF3C43FFFFFF5E25FFC500A3FFFFFF0F46FFFF0A84FFFFFD0E66FF
+8103DDFFFFFFFFFFFF6E17FFFFFF7504FFFF184CFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8FAFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3F0DF6FFFFE20259FFFF3C43FFFFFF5E25FFF80E59FFFFBC0046FFFF1D48FFFFA400
+66FFCA0468FFFFFFFFFBFF9000D5FFFF2C04FFFF470AF3FFFFFFFBFFFFFF3983FFFFFFFF
+FFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25B8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFC90C0A463D0716E8FFFF3C43FFFFFF5E25FFFF76013457111746FFFF68044146
+1A1266FFFF6C032A6A60278CFFEF0F1959212504FFFFE2180E4B6E4A27FFFFFF3983FFFF
+FFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE26540446EEFFFFFFF898FFFFFFFA179FFFFFF99454FB13346FFFFFF77
+3D57CA75A6FFFFFFAA52394578E7FFFFCA4C417EC55FFFFFFFF16D423B55ACFFFFFF6CA8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3346FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A8CDFFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFE2DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFD0EAFFFFFFFFFFFFFFFFFFFFFFE2D2FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFD4E7FFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFD5E7FFFFFFFFFFFFFFFFD8ECFFFFFFFFFFFFFFDAE2FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFCAFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3346
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFE8FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF83DBFFFFFF532EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF0F78FFFFFFFFFFFFFFFFFFB6220825FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1869FFFD00A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF1E69FFFFFFFFFFFFFFE20ACDFFE583F4FFFFFF2F51FFFFFFFFFFFFFF79
+341A204CDBFFFFFF2184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+96A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF51F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF25B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00A0FFFFFF532EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF0F78FFFFFFFFFFFFFFFFFF4E38F8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1869FFFD00A1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF1E69FFFFFFFFFFFFFF5A37FFFFB800E0FFFFFF2F51FFFFFFFFFFFF
+FD0B51835F121CF3FFFF7F1BFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+80A3FFFFFFFFFFFFFFFF869CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF1AC95D7FFFFFFFFFFDB9A96DAFFFFFFFAB494D2FFFFFFF6BFF8DD95D5FFFFC390B8FF
+FFFFFFFFFFFFFFFFFFC3007DBFC9FF532EFDB897E3FFFFFFD5D7FAB49CFFFFE8A39AE2FF
+FFFFFFD79793CCFFFFFFFFFFDF96C5FF0F78FFFFFFFFFFFFFFFDBF1A54BFDBFFFFEAA599
+E0FFFFFFFFFFCF94AEF8FFFFFFFFE397BFFF1869FFFD00A1E297BDFFFFFFFFF6A98CADF6
+FFFFFFFFFFD4959AE3FFFF1E69FFFFFFC6CFFFE80AA8FFF88E00AABFD4FF2F51F8A99FF1
+FFFFFFEFFFFFFF9000A3FFFFF60E8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFA3BCFFFFFFFFFFFFFFFFA6B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFA61108170370FFFFFF58020E2005C6FFC91E0215014FFFFFCA0060021984E533011C
+022EECFFFFFFFFFFFFFFFF2500151C33FF5328300E070BB8FFFF3C36200D2BFF8A090D11
+098EFFFF7B0922150157FFFFFF8F070D0A450E78FFFFFFFFFFFFFFF41C050F1C6CFF900B
+0C120787FFFFF847001A0420D4FFFF9C090A0D3A1769FFFD005405170043FDFFFF0A1823
+031ACFFFFFF64601131D04F1FF1E69FFFD5110B6FF8809FFFFD717001A1C51FF2F3F1B13
+0317E0FFFFFFFFFFFFC7009FFFFFFF3D3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFEA0F51F1FF8502BBFF800183F6FFDDECFF301CC3FD840089FFCA0024C6FF433E19
+D0FFD01555FFFFFFFFFFFFFFFFFF00A0FFFFFF53006BF8EA203CFFFF3C007AF8FFCC0570
+FAFA6209DFFFD0EDFFFF9001B6FFEC0B4BEDE8400078FFFFFFFFFFFFFFFFFF1D6AFFFFD4
+0768F8FB6907D7FF6A0AC0FFE02638FFF61141E8ED4A0069FFFD0015BCFF990287FFFFC2
+FFFFE51E42FFFF620794FBFFD0FAFF1E69F33A1ACFFFFF5B20FFFFFFB800E0FFFFFF2F01
+96FFD80B63FFFFFFFFFFFF4B12EDFFFFFF5F1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF8406E2FFFFFF1568FF2B22FFFFFFFFFFED0068FFFFFF1A38FFCA0076FFFFFD
+0574FFFFFF5D1CFFFFFFFFFFFFFFFFFF00A0FFFFFF530AF8FFFF5E1BFFFF3C12FFFFFF5F
+12FAFFFFEA068FFFFFEFA887830D76FF9000CAFFFFB00078FFFFFFFFFFFFFFFFFF1D6AFF
+FF670EF6FFFFF10985FF1952FFFFFF8007FFA300B5FFFFC50069FFFD0050FFFFFF2236FF
+FFFFC391833F1AFFFF1738FFFFFFFFFFFF1E592727E3FFFFFF363AFFFFFFB800E0FFFFFF
+2F24FFFFFF373CFFFFFFFFFF7E039EFFFFFFFF8705FBFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6001040404040451FF145CFFFFFFFFFFC000B1FFFFFF4820FFCA00C0FF
+FFD00003040404040EFFFFFFFFFFFFFFFFFF00A0FFFFFF532DFFFFFF7A13FFFF3C3DFFFF
+FF4001040404040473FF940B0F2B390B60FF6F0FFFFFFFFB0678FFFFFFFFFFFFFFFFFF1D
+6AFFFF460104040404046BFF04030404040404E37E07FDFFFFFF0D69FFFD008CFFFFFF50
+1FFFEF29061E36240CFFFF037AFFFFFFFFFFFF1E0608DBFFFFFFFF303FFFFFFFB800E0FF
+FFFF2F51FFFFFF4F31FFFFFFFF88037EFFFFFFFFFF8F02F6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF76A4FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8
+A1FFFFFFFBA57AE5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67AE0FFFFFF
+FFFFFFFFFFD28EFFFFFFFFFFFFFFE07AF6FFFFFFFFFFFFFFFFF4D8FBFFFFFFFFBBA1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF7107ECFFFFFFFFFFFF2139FFFFFFFFFFDB0083FFFFFF2B2EFFCA00
+CCFFFFEC017DFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0FFFFFF532EFFFFFF7A13FFFF3C43
+FFFFFF4F17FFFFFFFFFFFFFF1943FFFFF6095FFF8102EAFFFFD20078FFFFFFFFFFFFFFFF
+FF1D6AFFFF5613FDFFFFFFFFFFFF0E5AFFFFFFFFFFFF9300D8FFFFE50269FFFD0067FFFF
+FF332BFF7406DBFFFF560CFFFF0E51FFFFFFFFFFFF1E5E2B20E2FFFFFF5325FFFFFFB800
+E0FFFFFF2F51FFFFFF4F31FFFFFF900476FFFFFFFFFFFF6718FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE746D8FFFF
+FF453AFFFFED0D1F39D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE700B2FF
+FFFFFFFFFFFFFF4158FFFF7681FFFFFFB400E5FFFFFFFFFFFF9A220100044BF6FFFFBD0A
+E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFB90278FFFFFFFFFBFF5107ECFFFFFFFFFF143DFFFFE7045FFF
+CA00CCFFFF671D26FFFFFFFFFBFFFFFFFFFFFFFFFFFF157FFFFFFF532EFFFFFF7A13FFFF
+3C43FFFFFF8F00A1FFFFFFFFFBFF1272FFFF90005FFFC5018FFFFF7A0078FFFFFFFFFFFF
+FFFFFF1D6AFFFF990097FFFFFFFFFBFF3A12FBFFFFFFFBFFD7037EFFFF8A0069FFFD002D
+FFFFF60A5AFF6918FFFFFB160CFFFF3915F8FFFFFFFFFF1E69F1301CDBFFFF7E0EFFFFFF
+E802B6FFFFFF2F51FFFFFF4F31FFFF970470FFFFFFFFFFFFFF4534FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFFA4C5FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD500C2
+FFFFFFC9C5FFFF8C13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE700
+B2FFFFFFFFFFFFFFCC06D5FFFF3946FFFFFFB400E5FFFFFFFFFFFF735CB8D5750257FFFF
+FF2B63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5E032E6C5E229EFFE3160A4B6B33C5FF8C0324570C15
+E8FFCA00CCFFFFB6A80B1859693D46FFFFFFFFFFFFFFFFFF46134561FF532EFFFFFF7A13
+FFFF3C43FFFFFFFF3F06376F5919D0FF590F5E4313135FFFFF46044944190978FFFFFFFF
+FFFFFFFFFF1D6AFFFFFF4604356F591BC5FFD51312506D4630FFFF5203434A160D69FFFD
+002022611312E2FFD8023B6516240CFFFFC90E0E54682AEFFF1E69FFF63619D5FFD003C9
+FFFFFF241C497BFF2F51FFFFFF4F31FFEC050C393939399BFFFFFF1A71FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF76A4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA499D06A56AAFFFFFFFFCC6A5280F8FFFA64
+005B728FFFA19BFF933116728381B1FFFFFFFF7DB6FFFFFFFFFFFFFFFFFFDB734F5FB1FF
+E700B18E5474F1FFFFFF493CFFFFA11F267272DFB400E2855278F8FFFFFFFFFFFFFF351F
+FFFFFF8E0DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA15139467DEDFFFFED693F416EEFFFFFAE503D
+62E8FFFFE35AE5FFFFFFFFDA5F3D3F61C6FFFFFFFFFFFFFFFFFFF8A9656FFF9A7FFFFFFF
+B46BFFFF898FFFFFFFFFFF8C4B394A8AF8FFF48D425ACA78A3FFFFFD7A3F59D268B2FFFF
+FFFFFFFFFFFFFF73A9FFFFFFFF904D394987F6FFFFEC68413D59B4FFFFFF814157C96FA9
+FFFF5ACA723F59DAFFFFFFBF594789BC65FFFFFFE0603D4377FBFF73A9FFFFFA697FFFFF
+434DFFFFFFEF9A5F86FF8099FFFFFF9781FFF15A5A5A5A5A5AB0FFFF9F0EF1FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4820143A24029CFFFF9E0715410421F1
+F644003E4C6FFF453AFF7422104C604B24FFFFFFB900BCFFFFFFFFFFFFFFFFA50B0D4D43
+2FFFE7002D13440622F6FFFF176FFFFF86171B4C4CD4B400331E3E063CFFFFFFFFFFFFFF
+352CFFFFFFDF00ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFC60AE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3368FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFA4
+C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4800BBFFFF2939FFFF1A30F8FFCC
+0269FFD500C2FFFFFF453AFFFF5C26FFFFBD01BBFFFF4B26FFFFFFFFFFFFFFFFFB1732F4
+FFFFFDFFE7002BF8FFD50373FFF10197FFFFFF3946FFFFFFB4004CFFFF8301E5FFFFFFFF
+FFA00294FFFFFFFF0A7CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8696CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFFFFDBB4B4B4B4B4B4C2FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFDAB4B4B4B4B4B4C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF97D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86EDFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF481DFFFFFF5E20FFE0007AFF
+FFFF2531FFD500C2FFFFFF453AFFFF5C26FFFFFF284BFFF10A7FFFFFFFFFFFFFFFFFC900
+85FFFFFFFFFFE7006BFFFFFF2538FFB200C6FFFFFF3946FFFFFFB400AEFFFFD800B4FFFF
+FFFFBF0D4FFFFFFFFFFF2254FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF386300203CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FFFFFFFFFFFF7E1C1C1C1C1C1C3AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF781C1C1C1C1C1C3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4837FFFFFF6D1BFFBF00
+B4FFFFFF4A1FFFD500C2FFFFFF453AFFFF5C26FFFFFF850AEF7E0BF3FFFFFFFFFFFFFFFF
+A500CCFFFFFFFFFFE7009CFFFFFF4726FFC500B8FFFFFF3946FFFFFFB400E5FFFFF100AA
+FFFFFFC60F3EFDFFFFFFFFFF1C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFA645090000002FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF
+869CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4837FFFFFF6D1BFF
+E80071FFFFFF1F35FFDA00BDFFFFFF453AFFFF5C26FFFFFFF60E7C264FFFFFFFFFFFFFFF
+FFFFD0007AFFFFFFFFFFE70063FFFFFF1F3BFFFB058AFFFFFF3A45FFFFFFB400E5FFFFF1
+00AAFFFFCC123AFAFFFFFFFFFFFD0589FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8
+FFFFFFFFFFFFFFFFFFFFFFFFFFC359150000000000004BF1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1377D
+F1F1F1F1F1F1F13D75F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FFFFA6B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4837FFFFFF6D
+1BFFFF2626E0FFA6017CFFFF108AFFFFFF453AFFFF5C26FFFFFFFF581501C2FFFFFFFFFF
+FFFFFFFFFF2226D8FFFFE7FFE70022E2FFB50183FFFF1F66FFFFFF6726FFFFFFB400E5FF
+FFF100AAFFD21436F8FFFFFFFFFFFFCD00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+2ABBFFFFFFFFFFFFFFFFFFFFFFFA59000000000000000000020404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+010304040404040404010204040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+04040404040404040404040404D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4837FFFF
+FF6D1BFFFFB91207240039FBFFFF57061843FF453AFFFF5C26FFFFFFFFCF0229FFFFFFFF
+FFFFFFFFFFFFFFBC16032E2924FFE70044092B0136FBFFFF6728FFFFFFBD120D1CC2B400
+E5FFFFF100AAFF51000B0D0D0D19FFFFFF721CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFCC5F170000000000004DFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF6CA8FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3BC
+FFFFFFD2AEFFFFFFE79077A9FFFFFFFFFFF1A9B5FFC2BDFFFFCCB4FFFFFFFFE80684FFFF
+FFFFFFFFFFFFFFFFFFFFEF967389DFFFFA9FEAB879A1FDFFFFFFEC0BB2FFFFFFFFC59FEC
+EA9FFAFFFFFB9FE8FFC69F9F9F9F9FA6FFFFFD1887FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA480B0000002EFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFA8CDFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF581AF8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F3DFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9718FBFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48C340302C6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA90D0B
+9EFFFFFFDD6A6A6A6A6A6A6AF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAE8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0706EFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
+C2FAFFFFFFFFD44C4C4C4C4C4C4CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFDA
+F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFF386
+302DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFECFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFA846
+090000A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF48CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFCA5D16
+0000000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF869CFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04541601
+000000000000117272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+72727272727272727272727272727272A3FFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFFA6B8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0327
+03000000000000000D464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+46464646464646464646464646464646464680FFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1EC7E2B010000000008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4AF8FFFFFFD4651A000000BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A3FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF76FAFFFFFFFFFFFFB24E0D3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFF
+FFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3BCFFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFF896F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CD
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DD8FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9E
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DB6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF6CA8FFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89BD
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFF8097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFFACBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF76A4FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FA
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFFA4
+C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFF
+FF76A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DB6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABB
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89BDFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+6CA8FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFA8CDFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFF8097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672
+FFFFFFFFFFFFFFFFACBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0E8FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF76A4FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF7DB6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFFA4C5FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB09AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85C5FFFF
+FFFFFFFFFFFFFFFFE88D8AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CBC
+FFFF7AD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBCFFFFFFFFFFFFFF
+FF8FD0FFFFFFFFFFFFFF9AB0FFFFFFFFFFFFFFFFFFDDECFFFFFFFFFF7EEAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF89BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF73DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46C3FFFFFF532EFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F78
+FFFFFFFFFFFFFFFFFF93082D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1869FFFD00A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E69FFFFFFFFFF
+FFFFC20AE8FFD246EDFFFFFF2F51FFFFFFFFFFFFFF3E0A00001CA6FFFFFF3564FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0FFFFFF53
+2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+0F78FFFFFFFFFFFFFFFFFF3D4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1869FFFD00A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E69FFFFFF
+FFFFFFFF404EFFFFB800E0FFFFFF2F51FFFFFFFFFFFFFD2F91D7A5290AE0FFFFA00DEFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF8097FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFA8A1FFFFFFFBA57AE5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFF67AE0FFFFFFFFFFFFFFFFD28EFFFFFFFFFFFFFFE07AF6FFFFFFFFFFFFFF
+FFF4D8FBFFFFFFFFBBA1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB564538AFFFFFFFFFD8C575487
+F6FFFFCC6A5280F8FFFFE872E88A53B5FFE575506DE0FFFFFFFFFFFFFFFFFF79004F7284
+FF532ED86D55A3FFFFFF9CA0C76A63FFFFA35D579CFFFFFFE88455517DF8FFFFFFFF9654
+76E70F78FFFFFFFFFFFFFFFA72103772AAFFFFA65F5699FFFFFFFFF47D5266CCFFFFFFFF
+9E5572DF1869FFFD00A1935571ECFFFFFFAD624C65C6FFFFFFFFF681535791FDFF1E69FF
+FFF177A3FFCD03CAFFEA5800687299FF2F51C2625ABCFFFFFFFFFFFFFFB10096FFFFFF1A
+6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFFACBC
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE746D8FFFFFF453AFFFFED0D1F39D2FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFE700B2FFFFFFFFFFFFFFFF4158FFFF7681FFFFFFB400E5FFFFFFFFFF
+FF9A220100044BF6FFFFBD0AE8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72042C44073BFFFFF1260236
+511EC0FF9E0715410421F1FFCA00321348A1C312164C180FCCFFFFFFFFFFFFFFFF540036
+4C61FF531C173628018EFFFF3C240E3654FF5204363B0459FFFF6F2A53420C28FDFFFF5B
+00302B200A78FFFFFFFFFFFFFFF84C0C264C90FF5904333D0452FFFFE01D104A2108AAFF
+FF6A012B301A1069FFFD002D1145071DEDFFFF1246552006A9FFFFDB1A043E4D17EFFF1E
+69FFE0252AE7FF7C0EFFFFE33D00464C7BFF2F2910401C04C0FFFFFFFFFFFFB100AEFFFF
+FF4633FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFD500C2FFFFFFC9C5FFFF8C13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFE700B2FFFFFFFFFFFFFFCC06D5FFFF3946FFFFFFB400E5FFFFFF
+FFFFFF735CB8D5750257FFFFFF2B63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD0480FFFFC5009AFF5D04
+D0FFFFFFFDFF1A30F8FFCC0269FFCA003BFBFFC72C2CFFFFFF243DFFFFFFFFFFFFFFFFFF
+00A0FFFFFF5300A9FFFF332FFFFF3C01C3FFFFA500ACFFFF9502C6FFFBFFFFFFC7029CFF
+D2037AFFFF680078FFFFFFFFFFFFFFFFFF1D6AFFFFAE01A1FFFF9F01BCFF4A16FBFFFF3E
+23FFE2076BFFFF770069FFFD0024F4FFDF0667FFFFFBFFFFFF3332FFFF4310E0FFFFFFFF
+FF1E69CA183DF6FFFF5126FFFFFFB800E0FFFFFF2F04DFFFFF1453FFFFFFFFFFFB2926FD
+FFFFFF6817FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA499D06A56AA
+FFFFFFFFCC6A5280F8FFFA64005B728FFFA19BFF933116728381B1FFFFFFFF7DB6FFFFFF
+FFFFFFFFFFFFDB734F5FB1FFE700B18E5474F1FFFFFF493CFFFFA11F267272DFB400E285
+5278F8FFFFFFFFFFFFFF351FFFFFFF8E0DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+DFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A06999F9F9F155FFF
+2431FFFFFFFFFFE0007AFFFFFF2530FFCA0089FFFF5A01599F9F9F4816FFFFFFFFFFFFFF
+FFFF00A0FFFFFF5315FFFFFF6B17FFFF3C1DFFFFFF56129F9F9F9B0684FFFFAC6149460B
+6DFF8601E0FFFFC60078FFFFFFFFFFFFFFFFFF1D6AFFFF5D0E9F9F9F9E097BFF13419F9F
+9F5F03FA9700CCFFFFDB0169FFFD005FFFFFFF2E2FFFFFE27551462815FFFF1148FFFFFF
+FFFFFF1E3E0E54FDFFFFFF2E41FFFFFFB800E0FFFFFF2F33FFFFFF4236FFFFFFFFFF480E
+CAFFFFFFFF9002F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4820143A
+24029CFFFF9E0715410421F1F644003E4C6FFF453AFF7422104C604B24FFFFFFB900BCFF
+FFFFFFFFFFFFFFA50B0D4D432FFFE7002D13440622F6FFFF176FFFFF86171B4C4CD4B400
+331E3E063CFFFFFFFFFFFFFF352CFFFFFFDF00ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D062D2D2D2D2D
+72FF135FFFFFFFFFFFBF00B4FFFFFF4A1EFFCA00CAFFFFCD00222D2D2D2D36FFFFFFFFFF
+FFFFFFFF00A0FFFFFF532EFFFFFF7A13FFFF3C41FFFFFF3E0C2D2D2D2D2D8FFF61073B5F
+72125FFF6E10FFFFFFFF0678FFFFFFFFFFFFFFFFFF1D6AFFFF450B2D2D2D2D2D88FF031C
+2D2D2D2D2DE87D07FFFFFFFF0E69FFFD008EFFFFFF511EFFCF0B244F6F410CFFFF027CFF
+FFFFFFFFFF1E1308B9FFFFFFFF3839FFFFFFB800E0FFFFFF2F51FFFFFF4F31FFFFFFFF50
+0AB5FFFFFFFFFF8506FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4800
+BBFFFF2939FFFF1A30F8FFCC0269FFD500C2FFFFFF453AFFFF5C26FFFFBD01BBFFFF4B26
+FFFFFFFFFFFFFFFFFB1732F4FFFFFDFFE7002BF8FFD50373FFF10197FFFFFF3946FFFFFF
+B4004CFFFF8301E5FFFFFFFFFFA00294FFFFFFFF0A7CFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B02D4FFFF
+FFFFFFFF282AFFFFFFFFFFE80071FFFFFF1F35FFCA00CCFFFFF60264FFFFFFFFFFFFFFFF
+FFFFFFFFFFFF019EFFFFFF532EFFFFFF7A13FFFF3C43FFFFFF580BF4FFFFFFFFFFFF105F
+FFFFE3035FFF8C00D7FFFFBB0078FFFFFFFFFFFFFFFFFF1D6AFFFF5F09EDFFFFFFFFFFFF
+1445FFFFFFFFFFFF9E00C0FFFFD00069FFFD0057FFFFFF2832FF6710F3FFFF440CFFFF14
+40FFFFFFFFFFFF1E69570BB2FFFFFF5D1FFFFFFFBC00DDFFFFFF2F51FFFFFF4F31FFFFFF
+5709AEFFFFFFFFFFFF5E1EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF6CA8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+481DFFFFFF5E20FFE0007AFFFFFF2531FFD500C2FFFFFF453AFFFF5C26FFFFFF284BFFF1
+0A7FFFFFFFFFFFFFFFFFC90085FFFFFFFFFFE7006BFFFFFF2538FFB200C6FFFFFF3946FF
+FFFFB400AEFFFFD800B4FFFFFFFFBF0D4FFFFFFFFFFF2254FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7094E
+F4FFFFE2E0FF6F02A8FFFFF4F3FF2726E0FFA8017CFFCA00CCFFFFFF3916D5FFFFFBC7FF
+FFFFFFFFFFFFFFFF2070FFFFFF532EFFFFFF7A13FFFF3C43FFFFFFB4026DFBFFFFD4EFFF
+1E5CFFFD61005FFFDF0762FDFB520078FFFFFFFFFFFFFFFFFF1D6AFFFFBC0365FAFFFFD7
+ECFF5607C3FFFFFFC6FFEC0B55FBFD5E0069FFFD001CDDFFBF0476FF7C0DF6FFCA0B0CFF
+FF530BBBFFFFEAFBFF1E69FF6109A9FFFF8A09FFFFFFF607A3FFFFFF2F51FFFFFF4F31FF
+FF5D07A9FFFFFFFFFFFFFF3D3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFA8CDFFFFFFFFFFFFFFA4C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4837FFFFFF6D1BFFBF00B4FFFFFF4A1FFFD500C2FFFFFF453AFFFF5C26FFFFFF850A
+EF7E0BF3FFFFFFFFFFFFFFFFA500CCFFFFFFFFFFE7009CFFFFFF4726FFC500B8FFFFFF39
+46FFFFFFB400E5FFFFF100AAFFFFFFC60F3EFDFFFFFFFFFF1C5FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+930B09342A06A5FFFA3C001B330DC0FFB91207240039FBFFCA00CCFFFF48B02601263212
+45FFFFFFFFFFFFFFFFFF6B071733FF532EFFFFFF7A13FFFF3C43FFFFFFFF76060E362604
+D5FF7C042A17281C5FFFFF77021B18330D78FFFFFFFFFFFFFFFFFF1D6AFFFFFF7C070D36
+2604C9FFF336001F35182AFFFF8404171C2A1469FFFD0042072C012FF8FFEF12122F0843
+0CFFFFEA2D00223109EFFF1E69FFFF6B07A1FFEA0BA6FFFFFF47061A51FF2F51FFFFFF4F
+31FFE300040D0D0D0D7DFFFFF40E90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF76A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4837FFFFFF6D1BFFE80071FFFFFF1F35FFDA00BDFFFFFF453AFFFF5C26FFFFFF
+F60E7C264FFFFFFFFFFFFFFFFFFFD0007AFFFFFFFFFFE70063FFFFFF1F3BFFFB058AFFFF
+FF3A45FFFFFFB400E5FFFFF100AAFFFFCC123AFAFFFFFFFFFFFD0589FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFE0917283CDFFFFFFFFB27A7CB9FFFFFFE79077A9FFFFFFF19FF3FFFFE2FAFDA578
+7AA8FBFFFFFFFFFFFFFFFFFFFFF6ADADFFC7B8FFFFFFD7AAFFFFBDC2FFFFFFFFFFD48A72
+88DBFFFFFFDD7E9FF4B2CDFFFFFFC37A9EF6A8D7FFFFFFFFFFFFFFFFFFB0D0FFFFFFFFD7
+8D7287DAFFFFFFFFB17C779CF6FFFFFFCA7C9AF3ADD0FFFF9FE5BC7A9EFBFFFFFFFB9C85
+D0DBA6FFFFFFFFA6777FC6FFFFB0D0FFFFFFB1ADFFFF5E36FFFFFFFFEDA5BCFFB8C7FFFF
+FFC6B9FFF89F9F9F9F9F9FD5FFFF7E1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4837FFFFFF6D1BFFFF2626E0FFA6017CFFFF108AFFFFFF453AFFFF5C26FF
+FFFFFF581501C2FFFFFFFFFFFFFFFFFFFF2226D8FFFFE7FFE70022E2FFB50183FFFF1F66
+FFFFFF6726FFFFFFB400E5FFFFF100AAFFD21436F8FFFFFFFFFFFFCD00BFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE50AC9FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2088FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7DB6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4837FFFFFF6D1BFFFFB91207240039FBFFFF57061843FF453AFFFF5C
+26FFFFFFFFCF0229FFFFFFFFFFFFFFFFFFFFFFBC16032E2924FFE70044092B0136FBFFFF
+6728FFFFFFBD120D1CC2B400E5FFFFF100AAFF51000B0D0D0D19FFFFFF721CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB26A6A6A6A6A6A80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE6A6A6A6A6A6A84FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2F1FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF89BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC3BCFFFFFFD2AEFFFFFFE79077A9FFFFFFFFFFF1A9B5FFC2BDFF
+FFCCB4FFFFFFFFE80684FFFFFFFFFFFFFFFFFFFFFFFFEF967389DFFFFA9FEAB879A1FDFF
+FFFFEC0BB2FFFFFFFFC59FECEA9FFAFFFFFB9FE8FFC69F9F9F9F9FA6FFFFFD1887FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD8696CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF93E3FFFFFFFFFFFFA04C4C4C4C4C4C66FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A4C4C4C4C4C4C6BFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF581AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5F3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9718FBFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFF386300203CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF8097FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFA90D0B9EFFFFFFDD6A6A6A6A6A6A6AF3FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFF6DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAE8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFA645090000002FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFFACBCFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFEDC2FAFFFFFFFFD44C4C4C4C4C4C4CEFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFF
+FFC359150000000000004BF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1377DF1F1F1F1F1F1F13D75F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFA59000000000000000000020404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404020304040404040404010204
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+04D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFCC5F170000000000004DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFDAF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFAA480B0000002EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFF386302BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF48C340302C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4AF8FFFFFFFFFFFFA8460900009EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0706EFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF76FAFFFFFFCA5D160000000004FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6CA8
+FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1E858160100000000000010727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272A3FFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A8CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1A62903000000000000000D46464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464680FFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83B9FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFEC7E2B010000000008FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83B9FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFD4651A000000BBFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFFB24E0D3CFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF6CA8FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFA8C0FFFFFFFFFFFFFFFF8097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFF896F6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFA8CDFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4672FFFFFFFFFFFFFFFFACBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF43C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76FAFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFF6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF83B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFAAC9FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF8FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF71A0FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AF8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2ABBFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+76FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFF
+FFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FFFF8097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFF
+FFFFFFFFACBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF67A4FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFAED2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
+ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6DD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF8097FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFFACBCFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2
+FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B9E
+FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF67A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+A8C0FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51
+CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF7B9EFFFFFFFFFFFFFFFF8097FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFD8F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFA8C0FFFFFFFFFFFFFFFFACBCFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF71A0FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF779AFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFA
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEC6FFFFFFFFFFFFFFFF4C6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFF
+FFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF
+4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBC
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF779AFFFFFFFFFFFF
+FFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3D8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFD4E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+67A4FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEC6FFFFFFFF
+FFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86D7FFFFFF5929FFFF
+FFFFFFFFFF963E1E1C3DBFFFFFFFFFFFFFFFE283F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1871FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF3544FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFAED2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFF
+FFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCAF3FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFE3D8FFFFFFFFFFFFFFFFFFDBE8FFFFFFFFFFFFFFDDDFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFCDF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73DAFFFF0397FFFFFF5929
+FFFFFFFFFFFFFF24417A70200ACDFFFFFFFFFFFFAE00ECFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1871FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF3544FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672
+FFFFFFFFFFFFFFFF7C94FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE500A9FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5929FFFFFFFFFFFFFFFFEF0DB9FFEF83EAFFFFFF3B44FFFF
+FFFFFFFFFF83371B1E47D2FFFFFF2D72FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFC50377BFC7FF
+5929FDBB96E2FFFFFFEDFFFFFFD00269FFFFFFFFFFF68800B1BFD5FFFFC5919ADBFFFFFF
+FFFFCD8CA0EDFFFF1871FFFFFFC3D2FFFFFFFFFFFFFFE29E9FE8FFFFFFD5D7FAB09BECFF
+FFFFFFED9EB1FA3544FFFFFFE89496D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4672FFFFFFFFFFFFFFFFB2C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE500A9FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5929FFFFFFFFFFFFFFFF6B2BFFFFD000C6FFFFFF3B44
+FFFFFFFFFFFFFF124C7F651615E8FFFF9313F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2901141C
+30FF5924330D090AB1FFFFFFFFFFFFFD0A66FFFFFFFFFFCF17001B1C56FF4F0C240D067E
+FFFFEF1C0D261826FFFF1871FFFB4B12BCFFFFFFFFFFFF7906100E0D9FFFFF3D35231104
+12CFFFFFBD130412242B44FFFF4A09222004E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF779AFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC591B6FDFFFFFFBFEFE597B4FFFFFFFFFFD094D2E500A9
+FFFFFFFFFFFFFFFFFFFFE8A490C7FFFF5929FBB69AE8FFFFFFF31093FFFB9F0099BFCFFF
+3B44FAAE9BECFFFFFFEDFFFFFFA5008EFFFFFD167AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03
+97FFFFFF590065F6EC2436FFFFFFFFFFFF7C04C0FFFFFFFFFFFFAE00ECFFFFFFC7FAFFFB
+6108EAFF701DFDFFFFDBFFFF1871F1351CD4FFFFFFFFFFFFB50284FDF65110EFFF3D0083
+FBE01351FFFF282BD7FA690044FFC704CAFFFFE0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFAEC6FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFEA37011C022BE7FFFA005C07150041FFFFFF6D0212055A
+00A9FFFFFFFFFFFFFFFFFF7B090723088CFF59232C10070DB0FFFF9C02F8FFED1900181C
+46FF3B3622120412D0FFFFFFFFFFFFE0008AFFFFFF4B2EFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FF
+FF0397FFFFFF5908F3FFFF6517FFFFFFFFFFB00669FFFFFFFFFFFFFFAE00ECFFFFFFFFE2
+A0857801AEFF7710A1FDFFFFFFFF185E242BE8FFFFFFFFFFFFFF4C1EFFFFFFD501A9FF3D
+17FFFFFF472DFFDD0083FFFFF40644FFD20275ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F17CDFFD41850FFFA0019C6FF8900BDFFC5026CFA
+D72900A9FFFFFFFFFFFFFFFFB5025DEAFFEDDBFF59005AF4E0331BFDFF6B15FFFFFFD000
+C6FFFFFF3B0086FDDF1254FFFFFFFFFFFF590CE0FFFFFF7012FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C
+D2FFFF0397FFFFFF5928FFFFFF810EFFFFFFFFB80A4EFFFFFFFFFFFFFFFFAE00ECFFFFFF
+6C06142F390291FFEC4B070C51CDFFFF18060AE2FFFFFFFFFFFFFFFF3002040404040489
+FF3D40FFFFFF6024FFB000D0FFFFFF2744FFFF74130436A5FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF086EFFFFFF6318FFFA0063FFFFF80784FF6507
+F8FFFF7D00A9FFFFFFFFFFFFFFFF5009F6FFFFFFFFFF5902E5FFFF9500B9FF432EFFFFFF
+D000C6FFFFFF3B19FFFFFF452FFFFFFFFFFF8F028DFFFFFFFF9A01ECFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF0397FFFFFF5929FFFFFF810EFFFFFFBD0D47FFFFFFFFFFFFFFFFFFAE00ECFF
+FFEF026FFFFFC50091FFFFFFEC8A2618FFFF18642624E7FFFFFFFFFFFFFF3D24FFFFFFFF
+FFFFFF3D41FFFFFF6024FFC900A0FFFFFF1044FFFFFFFBA94601C6FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0003040404040BFFFA00A1FFFFFF1576FF
+482BFFFFFFC900A9FFFFFFFFFFFFFFFF3435FFFFFFFFFFFF591CFFFFFFE80091FF3D33FF
+FFFFD000C6FFFFFF3B42FFFFFF5D26FFFFFFFF97046FFFFFFFFFFFA400E2FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF1978FFFFFF5929FFFFFF810EFFFFC30E42FDFFFFFFFFFFFFFFFFFFE001
+C0FFFFDD02A9FFFF5F0091FFFBFFFFFFA402DBFF1871ED2C20E0FFFFFFFFFFFF7800BDFF
+FFFFFBFFFF3D41FFFFFF6024FFFA0E56FFFFBF0044FFFBFFFFFFFB0A7DFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF779AFFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30177FFFFFFFFFFFFFA00A4FFFFFF15
+76FF5813FFFFFF9A00A9FFFFFFFFFFFFFFFF4418FFFFFFFFFFFF5909FAFFFFB500A8FF62
+1AFFFFFFD000C6FFFFFF3B44FFFFFF5D26FFFFFF9F0666FFFFFFFFFFFF780DFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF4C12445DFF5929FFFFFF810EFFFF1E033739393975FFFFFFFFFFFF
+FF201E4A7EFF321A6733200491FF3D3F6F681E41FFFF1871FFF3321CDAFFFFFFFFFFFD30
+073D705514F3FF3D41FFFFFF6024FFFF78013358111844FF7A2B65743711F3FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF71A0FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFAEC6FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2422FFFFFFFFFBFFFA00A4FFFF
+FF1576FF9100C6FFFF5200A9FFFFFFFFFFFFFFFF7F00B9FFFFFFFFFF5900A9FFFF6507E7
+FF9005FDFFFFF607A1FFFFFF3B44FFFFFF5D26FFFFA60760FFFFFFFFFFFFFF5328FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF4DCCFFFFFAAA666BFF9F7BFFFFFFB967FFFF6C5A5A5A5A5A8FFFFFFFFF
+FFFFFFED975F8AFFE77A4064E760C3FFAE5A3D4E94EFFFFF6FAEFFFFF66784FFFFFFFFFF
+FFFD8149394D91FFFF8A8EFFFFFFA378FFFFFF9A454FB0858FFFD56B43417DD8FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB90C1758693F42FFFA00A4
+FFFFFF1576FFFD260A58332100A9FFFFFFFFFFFFFFFFFD2C043C6F418FFF591412513B01
+67FFFFE207B2FFFFFF30184771FF3B44FFFFFF5D26FFFF0809393939398EFFFFFF2560FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFE2FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFAAC9FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFFFF4C6AFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD603D3E5FC3FFFD
+5ACDFFFFFF6DB1FFFFF4693E62DF5AD0FFFFFFFFFFFFFFFFFFFB7A443D61D8FF9E7CB951
+428DFFFFFFFF513FFFFFFFF39F617DFF898FFFFFFFA179FFFF5A5A5A5A5A5AA5FFFFB409
+E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFF3FF4C6AFFF3FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFD809D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4058FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF779AFFFFFFFFFFFF8C9C4C6A7AB2
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDB4B4B4B4B4B4CFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF9FCAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF8CE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2716EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEC6FFFFFFFFFFFFDD0B514C
+0FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF571C1C1C1C1C1C5BFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88F360402C6FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFFFF25
+0E0C31FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB14B0C0000002EFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFFFFFF
+FF46000071FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+D4F4FFFFFFFFFFFFFFFFFFFFFFFFFFD4651A0000000000004EFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4672FFFFFFFF
+FFFFFFA90308E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFA5900000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF779AFFFF
+FFFFFFFFFFFB0A14FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFF8914AF6FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFC258120000000000004EFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF67A4FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1E32FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFB44E0D0066FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA041080000002FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFAED2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF72AAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFD7671C00000000E5FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF832E0203CAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE5FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFF1832E02000000000011FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7686B
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF71A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFF950600000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000046FFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF44FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFE37424000000000000
+12FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6
+EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFFAAC9FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFC65B1500
+000001E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFA54509006AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFF38745F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB6EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF67D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF6C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4
+FFFFFFFFFFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+AED2FFFFFFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECFBFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48CAFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED2FFFFFFFFFFFFFF6C9CFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA8A1FFFFFFFBA57AE5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+F67AE0FFFFFFFFFFFFFFFFD28EFFFFFFFFFFFFFFE07AF6FFFFFFFFFFFFFFFFF4D8FBFFFF
+FFFFBBA1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFB1CDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFE746D8FFFFFF453AFFFFED0D1F39D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFE700B2FFFFFFFFFFFFFFFF4158FFFF7681FFFFFFB400E5FFFFFFFFFFFF9A22010004
+4BF6FFFFBD0AE8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF6C
+9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD500C2FFFFFFC9C5FFFF8C13FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFE700B2FFFFFFFFFFFFFFCC06D5FFFF3946FFFFFFB400E5FFFFFFFFFFFF735CB8
+D5750257FFFFFF2B63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB0ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
+9AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+85C5FFFFFFFFFFFFFFFFFFFFE88D8AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF8CBCFFFF7AD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBCFFFFFF
+FFFFFFFFFF8FD0FFFFFFFFFFFFFF9AB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7EEAFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67A4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA499D06A56AAFFFFFFFFCC6A
+5280F8FFFA64005B728FFFA19BFF933116728381B1FFFFFFFF7DB6FFFFFFFFFFFFFFFFFF
+DB734F5FB1FFE700B18E5474F1FFFFFF493CFFFFA11F267272DFB400E2855278F8FFFFFF
+FFFFFFFF351FFFFFFF8E0DF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46C3FFFF
+FF532EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF0F78FFFFFFFFFFFFFFFFFF93082D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1869FFFD00A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E69FF
+FFFFFFFFFFFFC20AE8FFD246EDFFFFFF2F51FFFFFFFFFFFFFF903310049AFFFFFFFF3564
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFF
+FFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4820143A24029CFFFF9E
+0715410421F1F644003E4C6FFF453AFF7422104C604B24FFFFFFB900BCFFFFFFFFFFFFFF
+FFA50B0D4D432FFFE7002D13440622F6FFFF176FFFFF86171B4C4CD4B400331E3E063CFF
+FFFFFFFFFFFF352CFFFFFFDF00ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0
+FFFFFF532EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF0F78FFFFFFFFFFFFFFFFFF3D4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1869FFFD00A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
+69FFFFFFFFFFFFFF404EFFFFB800E0FFFFFF2F51FFFFFFFFFFFFFF7149650097FFFFFFFF
+A00DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4800BBFFFF2939FF
+FF1A30F8FFCC0269FFD500C2FFFFFF453AFFFF5C26FFFFBD01BBFFFF4B26FFFFFFFFFFFF
+FFFFFB1732F4FFFFFDFFE7002BF8FFD50373FFF10197FFFFFF3946FFFFFFB4004CFFFF83
+01E5FFFFFFFFFFA00294FFFFFFFF0A7CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4F4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB564538AFFFFFFFFFD
+8C575487F6FFFFCC6A5280F8FFFFE872E88A53B5FFE575506DE0FFFFFFFFFFFFFFFFFF79
+004F7284FF532ED86D55A3FFFFFF9CA0C76A63FFFFA35D579CFFFFFFE88455517DF8FFFF
+FFFF965476E70F78FFFFFFFFFFFFFFFA72103772AAFFFFA65F5699FFFFFFFFF47D5266CC
+FFFFFFFF9E5572DF1869FFFD00A1935571ECFFFFFFAD624C65C6FFFFFFFFF681535791FD
+FF1E69FFFFF177A3FFCD03CAFFEA5800687299FF2F51C2625ABCFFFFFFFFFFD50097FFFF
+FFFFFF1A6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF481DFFFFFF5E
+20FFE0007AFFFFFF2531FFD500C2FFFFFF453AFFFF5C26FFFFFF284BFFF10A7FFFFFFFFF
+FFFFFFFFC90085FFFFFFFFFFE7006BFFFFFF2538FFB200C6FFFFFF3946FFFFFFB400AEFF
+FFD800B4FFFFFFFFBF0D4FFFFFFFFFFF2254FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72042C44073BFFFF
+F1260236511EC0FF9E0715410421F1FFCA00321348A1C312164C180FCCFFFFFFFFFFFFFF
+FF5400364C61FF531C173628018EFFFF3C240E3654FF5204363B0459FFFF6F2A53420C28
+FDFFFF5B00302B200A78FFFFFFFFFFFFFFF84C0C264C90FF5904333D0452FFFFE01D104A
+2108AAFFFF6A012B301A1069FFFD002D1145071DEDFFFF1246552006A9FFFFDB1A043E4D
+17EFFF1E69FFE0252AE7FF7C0EFFFFE33D00464C7BFF2F2910401C04C0FFFFFFFFD50097
+FFFFFFFFFF4633FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4837FFFF
+FF6D1BFFBF00B4FFFFFF4A1FFFD500C2FFFFFF453AFFFF5C26FFFFFF850AEF7E0BF3FFFF
+FFFFFFFFFFFFA500CCFFFFFFFFFFE7009CFFFFFF4726FFC500B8FFFFFF3946FFFFFFB400
+E5FFFFF100AAFFFFFFC60F3EFDFFFFFFFFFF1C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD0480FFFFC500
+9AFF5D04D0FFFFFFFDFF1A30F8FFCC0269FFCA003BFBFF3E272CFFFFFF243DFFFFFFFFFF
+FFFFFFFF00A0FFFFFF5300A9FFFF332FFFFF3C01C3FFFFA500ACFFFF9502C6FFFBFFFFFF
+C7029CFFD2037AFFFF680078FFFFFFFFFFFFFFFFFF1D6AFFFFAE01A1FFFF9F01BCFF4A16
+FBFFFF3E23FFE2076BFFFF770069FFFD0024F4FFDF0667FFFFFBFFFFFF3332FFFF4310E0
+FFFFFFFFFF1E69CA183DF6FFFF5126FFFFFFB800E0FFFFFF2F04DFFFFF1453FFFFFFFFD5
+0097FFFFFFFFFF6817FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF62A0FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4837
+FFFFFF6D1BFFE80071FFFFFF1F35FFDA00BDFFFFFF453AFFFF5C26FFFFFFF60E7C264FFF
+FFFFFFFFFFFFFFFFD0007AFFFFFFFFFFE70063FFFFFF1F3BFFFB058AFFFFFF3A45FFFFFF
+B400E5FFFFF100AAFFFFCC123AFAFFFFFFFFFFFD0589FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A06999F9F
+9F155FFF2431FFFFFFFFFFE0007AFFFFFF2530FFCA0089FFFFF602599F9F9F4816FFFFFF
+FFFFFFFFFFFF00A0FFFFFF5315FFFFFF6B17FFFF3C1DFFFFFF56129F9F9F9B0684FFFFAC
+6149460B6DFF8601E0FFFFC60078FFFFFFFFFFFFFFFFFF1D6AFFFF5D0E9F9F9F9E097BFF
+13419F9F9F5F03FA9700CCFFFFDB0169FFFD005FFFFFFF2E2FFFFFE27551462815FFFF11
+48FFFFFFFFFFFF1E3E0E54FDFFFFFF2E41FFFFFFB800E0FFFFFF2F33FFFFFF4236FFFFFF
+FFD50097FFFFFFFFFF9002F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFB5D7FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+4837FFFFFF6D1BFFFF2626E0FFA6017CFFFF108AFFFFFF453AFFFF5C26FFFFFFFF581501
+C2FFFFFFFFFFFFFFFFFFFF2226D8FFFFE7FFE70022E2FFB50183FFFF1F66FFFFFF6726FF
+FFFFB400E5FFFFF100AAFFD21436F8FFFFFFFFFFFFCD00BFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D062D
+2D2D2D2D72FF135FFFFFFFFFFFBF00B4FFFFFF4A1EFFCA00CAFFFFCD00222D2D2D2D36FF
+FFFFFFFFFFFFFFFF00A0FFFFFF532EFFFFFF7A13FFFF3C41FFFFFF3E0C2D2D2D2D2D8FFF
+61073B5F72125FFF6E10FFFFFFFF0678FFFFFFFFFFFFFFFFFF1D6AFFFF450B2D2D2D2D2D
+88FF031C2D2D2D2D2DE87D07FFFFFFFF0E69FFFD008EFFFFFF511EFFCF0B244F6F410CFF
+FF027CFFFFFFFFFFFF1E1308B9FFFFFFFF3839FFFFFFB800E0FFFFFF2F51FFFFFF4F31FF
+FFFFFFD50097FFFFFFFFFF8506FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF4837FFFFFF6D1BFFFFB91207240039FBFFFF57061843FF453AFFFF5C26FFFFFFFFCF
+0229FFFFFFFFFFFFFFFFFFFFFFBC16032E2924FFE70044092B0136FBFFFF6728FFFFFFBD
+120D1CC2B400E5FFFFF100AAFF51000B0D0D0D19FFFFFF721CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFD4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B
+02D4FFFFFFFFFFFF282AFFFFFFFFFFE80071FFFFFF1F35FFCA00CCFFFFF60264FFFFFFFF
+FFFFFFFFFFFFFFFFFFFF019EFFFFFF532EFFFFFF7A13FFFF3C43FFFFFF580BF4FFFFFFFF
+FFFF105FFFFFE3035FFF8C00D7FFFFBB0078FFFFFFFFFFFFFFFFFF1D6AFFFF5F09EDFFFF
+FFFFFFFF1445FFFFFFFFFFFF9E00C0FFFFD00069FFFD0057FFFFFF2832FF6710F3FFFF44
+0CFFFF1440FFFFFFFFFFFF1E69570BB2FFFFFF5D1FFFFFFFBC00DDFFFFFF2F51FFFFFF4F
+31FFFFFFFFD50097FFFFFFFFFF5E1EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFC3BCFFFFFFD2AEFFFFFFE79077A9FFFFFFFFFFF1A9B5FFC2BDFFFFCCB4FFFFFF
+FFE80684FFFFFFFFFFFFFFFFFFFFFFFFEF967389DFFFFA9FEAB879A1FDFFFFFFEC0BB2FF
+FFFFFFC59FECEA9FFAFFFFFB9FE8FFC69F9F9F9F9FA6FFFFFD1887FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF2EBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFD7094EF4FFFFE2E0FF6F02A8FFFFF4F3FF2726E0FFA8017CFFCA00CCFFFF7E3416D5FF
+FFFBC7FFFFFFFFFFFFFFFFFF2070FFFFFF532EFFFFFF7A13FFFF3C43FFFFFFB4026DFBFF
+FFD4EFFF1E5CFFFD61005FFFDF0762FDFB520078FFFFFFFFFFFFFFFFFF1D6AFFFFBC0365
+FAFFFFD7ECFF5607C3FFFFFFC6FFEC0B55FBFD5E0069FFFD001CDDFFBF0476FF7C0DF6FF
+CA0B0CFFFF530BBBFFFFEAFBFF1E69FF6109A9FFFF8A09FFFFFFF607A3FFFFFF2F51FFFF
+FF4F31FFFFFFFFD50097FFFFFFFFFF3D3CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7DFAFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF581AF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
+3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9718FBFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF930B09342A06A5FFFA3C001B330DC0FFB91207240039FBFFCA00CCFFFF99C626
+0126321245FFFFFFFFFFFFFFFFFF6B071733FF532EFFFFFF7A13FFFF3C43FFFFFFFF7606
+0E362604D5FF7C042A17281C5FFFFF77021B18330D78FFFFFFFFFFFFFFFFFF1D6AFFFFFF
+7C070D362604C9FFF336001F35182AFFFF8404171C2A1469FFFD0042072C012FF8FFEF12
+122F08430CFFFFEA2D00223109EFFF1E69FFFF6B07A1FFEA0BA6FFFFFF47061A51FF2F51
+FFFFFF4F31FFFF8C0D0C000A0D60FFFFF40E90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA90D0B9EFFFFFFDD6A6A6A6A6A6A6AF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFF6DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAE8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFE0917283CDFFFFFFFFB27A7CB9FFFFFFE79077A9FFFFFFF19FF3FFFFFF
+FFFDA5787AA8FBFFFFFFFFFFFFFFFFFFFFF6ADADFFC7B8FFFFFFD7AAFFFFBDC2FFFFFFFF
+FFD48A7288DBFFFFFFDD7E9FF4B2CDFFFFFFC37A9EF6A8D7FFFFFFFFFFFFFFFFFFB0D0FF
+FFFFFFD78D7287DAFFFFFFFFB17C779CF6FFFFFFCA7C9AF3ADD0FFFF9FE5BC7A9EFBFFFF
+FFFB9C85D0DBA6FFFFFFFFA6777FC6FFFFB0D0FFFFFFB1ADFFFF5E36FFFFFFFFEDA5BCFF
+B8C7FFFFFFC6B9FFFFDA9F9F9F9F9FC9FFFF7E1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFEDC2FAFFFFFFFFD44C4C4C4C4C4C4CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE50AC9FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2088FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFD8F6FFFFFFFFFFFFB26A6A6A6A6A6A80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE6A6A6A6A6A6A84
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2F1FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7FDFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF51CDFFFFFFFFFFFFA04C4C4C4C4C4C66FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A4C4C4C4C4C
+4C6BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFB1CDFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFDAF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFD8696CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFF386302BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFF386300203CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFA8460900009EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFA645090000002FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFCA5D160000000004FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFF
+FFFFFFFFFFFFFFC359150000000000004BF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F14EC3F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1317DF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3DF6FFFFFFE858160100000000000010727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272727272727272727272
+727272727272727272727272727272727272727272727272727272A3FFFF33BFFFFFFFFF
+FFFFFFFFFFFFFFFA59000000000000000000020404040404040404040404040404040404
+040404040404040404040404040404030404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040401030404040404040404040404040404
+040404F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF86FBFFFFFFA62903000000000000000D46464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464646464646464646
+464646464646464646464646464646464646464646464646464646464680FFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFCC5F170000000000004DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFEC7E2B010000000008FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA480B0000002EFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFD4651A000000BBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48C340302C6FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFB24E0D3CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0706EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFF896F6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF62A0FFFFFFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF73DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FB
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFF6C
+9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4DCCFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+62A0FFFFFFFFFFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2FAFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFB5D7FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFFB1CDFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFF6C9CFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF67D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFB1
+CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+CAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62D4FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3D8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFD4E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86D7FFFFFF5929
+FFFFFFFFFFFFFFD875452E83FFFFFFFFFFFFFFFFE283F8FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1871FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF3544FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF62A0FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0397FFFFFF
+5929FFFFFFFFFFFFFF7E14350660FFFFFFFFFFFFFFFFAE00ECFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1871FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF3544FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFB5D7FFFFFFFFFFFFFF6C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C9FFC50377BF
+C7FF5929FDBB96E2FFFFFFFFFFFF0F60FFFFFFFFFFFFFFF68800B1BFD5FFFFC5919ADBFF
+FFFFFFFFCD8CA0EDFFFF1871FFFFFFC3D2FFFFFFFFFFFFFFE29E9FE8FFFFFFD5D7FAB09B
+ECFFFFFFFFED9EB1FA3544FFFFFFE89496D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FDFF2901
+141C30FF5924330D090AB1FFFFFFFFFF0F60FFFFFFFFFFFFFFCF17001B1C56FF4F0C240D
+067EFFFFEF1C0D261826FFFF1871FFFB4B12BCFFFFFFFFFFFF7906100E0D9FFFFF3D3523
+110412CFFFFFBD130412242B44FFFF4A09222004E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFB1CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF0397FFFFFF590065F6EC2436FFFFFFFFFF0F60FFFFFFFFFFFFFFFFAE00ECFFFFFFC7FA
+FFFB6108EAFF701DFDFFFFDBFFFF1871F1351CD4FFFFFFFFFFFFB50284FDF65110EFFF3D
+0083FBE01351FFFF282BD7FA690044FFC704CAFFFFE0FAFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFF6FF6C9CFFF6FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF0397FFFFFF5908F3FFFF6517FFFFFFFFFF0F60FFFFFFFFFFFFFFFFAE00ECFFFFFF
+FFE2A0857801AEFF7710A1FDFFFFFFFF185E242BE8FFFFFFFFFFFFFF4C1EFFFFFFD501A9
+FF3D17FFFFFF472DFFDD0083FFFFF40644FFD20275ECFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFF7EB2FFFF74C5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF85E0FFFF0397FFFFFF5928FFFFFF810EFFFFFFFFFF0F60FFFFFFFFFFFFFFFFAE00ECFF
+FFFF6C06142F390291FFEC4B070C51CDFFFF18060AE2FFFFFFFFFFFFFFFF300204040404
+0489FF3D40FFFFFF6024FFB000D0FFFFFF2744FFFF74130436A5FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFC50B7D5A12FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF93E3FFFF0397FFFFFF5929FFFFFF810EFFFFFFFFFF0F60FFFFFFFFFFFFFFFFAE00
+ECFFFFEF026FFFFFC50091FFFFFFEC8A2618FFFF18642624E7FFFFFFFFFFFFFF3D24FFFF
+FFFFFFFFFF3D41FFFFFF6024FFC900A0FFFFFF1044FFFFFFFBA94601C6FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF1F070737FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF1978FFFFFF5929FFFFFF810EFFFFFFFFFF0F60FFFFFFFFFFFFFFFF
+E001C0FFFFDD02A9FFFF5F0091FFFBFFFFFFA402DBFF1871ED2C20E0FFFFFFFFFFFF7800
+BDFFFFFFFBFFFF3D41FFFFFF6024FFFA0E56FFFFBF0044FFFBFFFFFFFB0A7DFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF3A000185FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF4C12445DFF5929FFFFFF810EFFFFD73939051B3960FFFFFFFF
+FFFFFF201E4A7EFF321A6733200491FF3D3F6F681E41FFFF1871FFF3321CDAFFFFFFFFFF
+FD30073D705514F3FF3D41FFFFFF6024FFFF78013358111844FF7A2B65743711F3FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF8A010BEFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFDCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3D8FFFFFFFFFF
+FFFFFFFFDBE8FFFFFFFFFFFFFFDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDF8FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFECFBFFFFFAAA666BFF9F7BFFFFFFB967FFFFE05A5A5A5A5A7DFFFF
+FFFFFFFFFFED975F8AFFE77A4064E760C3FFAE5A3D4E94EFFFFF6FAEFFFFF66784FFFFFF
+FFFFFFFD8149394D91FFFF8A8EFFFFFFA378FFFFFF9A454FB0858FFFD56B43417DD8FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFEF0719FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFE500A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5929FFFFFF
+FFFFFFFFFFEF0DB9FFED83ECFFFFFF3B44FFFFFFFFFFFFFFC76E3E2DA1FFFFFFFF2D72FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF48CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFF16
+3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFE500A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5929FF
+FFFFFFFFFFFFFF6B2BFFFFCF00C7FFFFFF3B44FFFFFFFFFFFFFF5D18370084FFFFFFFF93
+13F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF5EC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC591B6FD
+FFFFFFBFEFE597B4FFFFFFFFFFD094D2E500A9FFFFFFFFFFFFFFFFFFFFE8A490C9FFFF59
+29FBB69AE8FFFFFFF31093FFFB9F0099BFCFFF3B44FAAE9BECFFFFFFFFFFF10084FFFFFF
+FFFD167AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA36011C
+022BE7FFFA005C07150041FFFFFF6D0212055A00A9FFFFFFFFFFFFFFFFFF7B080723088C
+FF59232C10070DB0FFFF9C02F8FFED1900181C46FF3B3622120412D2FFFFFFFFF10084FF
+FFFFFFFF4B2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE87972FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F17
+CDFFD41850FFFA0019C6FF8900BDFFC5026CFAD72900A9FFFFFFFFFFFFFFFFB5025DEAFF
+EDDBFF59005AF4E0331BFDFF6B15FFFFFFCF00C7FFFFFF3B0086FDDF1254FFFFFFFFF100
+84FFFFFFFFFF6F12FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB993C0602C2FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+076EFFFFFF6318FFFA0063FFFFF80785FF6407F8FFFF7D00A9FFFFFFFFFFFFFFFF5009F6
+FFFFFFFFFF5902E5FFFF9500B9FF432EFFFFFFCF00C7FFFFFF3B19FFFFFF452FFFFFFFFF
+F10084FFFFFFFFFF9A01ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC52100000002CFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+B5D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFDA0003040404040BFFFA00A3FFFFFF1576FF482BFFFFFFC900A9FFFFFFFFFFFFFFFF34
+35FFFFFFFFFFFF591CFFFFFFE80091FF3D33FFFFFFCF00C7FFFFFF3B42FFFFFF5D26FFFF
+FFFFF10084FFFFFFFFFFA300E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFDD6D1F0000000000004DFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFF30177FFFFFFFFFFFFFA00A4FFFFFF1576FF5813FFFFFF9A00A9FFFFFFFFFFFFFF
+FF4418FFFFFFFFFFFF5909FAFFFFB500A8FF621AFFFFFFCF00C7FFFFFF3B44FFFFFF5D26
+FFFFFFFFF10084FFFFFFFFFF780DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFA590100000000000000000204040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404040404040404
+040404040404040404040404040404040404040404040404040404040404010304040404
+04040404040404040404040404F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF2422FFFFFFFFFBFFFA00A4FFFFFF1576FF9100C6FFFF5100A9FFFFFFFFFF
+FFFFFF7F00B9FFFFFFFFFF5900A9FFFF6507E7FF9005FDFFFFF607A1FFFFFF3B44FFFFFF
+5D26FFFFFFFFF10084FFFFFFFFFF5328FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFB04D0E0000000000004CF1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1A7DFF1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1317DF1F1
+F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFB90C1758693F42FFFA00A4FFFFFF1576FFFD260A58332100A9FFFFFF
+FFFFFFFFFFFD2B043C6F418FFF591412513B0168FFFFE207B4FFFFFF30184771FF3B44FF
+FFFF5D26FFFFB5393600243977FFFFFF2560FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA963B0600000030FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DD8FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFDD603D3E5FC3FFFD5ACDFFFFFF6DB1FFFFF4693E62DF5AD0FF
+FFFFFFFFFFFFFFFFFB7A443D61D8FF9E7CB951428DFFFFFFFF513FFFFFFFF39F617DFF89
+8FFFFFFFA179FFFFC55A5A5A5A5A91FFFFB409E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE87A290104CF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD809D7FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4058FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
+6068FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFCDB4B4B4B4B4B4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FCAFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CE3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF571C1C1C1C1C1C5BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFFFFFFFF5087FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF7EDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF99E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62A0FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFF8914AF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC9F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5D7FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFB44E0D0066FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFA90A48A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFD7671C00000000E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B0000175ECAFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3DF6FFFFF1832E02000000000011FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3383FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6200000000012677E7FFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF86FBFF9506000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000046FFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333E6A6A6A6A6A6A
+6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A4200000000000000031E90FAFFFFFFFFFF
+FFFF62A0FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFE3742400000000000012FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF774C4C4C4C4C
+4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C320000000000000000127EEFFFFFFF
+FFFFFFFFB5D7FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFC65B1500000001E8FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57D0FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6600000000001A65D4FFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFA54509006AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0F4FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3200000C4BB1FFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFFFFFFFFFFF38745F6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB804368FF6FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9E2FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0975FFFFFFFF581CFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFBCDAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF5417FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF5417FFFF
+9CA0CA6758B2FFFFFFFFB25969CD96A3FFFF77CDFFFFFF89B5FFFFFFBD675184FDFFFFB8
+87FFFFFFCF76FFFFFFFA835363C3FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DF6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF5417
+FFFF3C24123D2002ADFFFF8D031E3C101C46FFFF0790FFFFFF2066FFFF7E0529470930FD
+FF6A1DFFFFFF9504FFFFEC230D4725069BFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86FBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFFFFFF
+5417FFFF3C01CCFFFF1F45FFFB1449FFFFA30046FFFF0790FFFFFF2066FFDB0870FFFFD7
+0287FF6A1DFFFFFF9504FFFF580EF4FFFF4B18FFFFFF5C9CFFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF3AC5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0472FFFF
+FFFF5417FFFF3C27FFFFFF512AFFCC0099FFFFFD0B46FFFF0790FFFFFF2066FF8A02919F
+9F9F1C51FF6A1DFFFFFF9504FFFF1E389F9F9F6B00E7FFFFBCDAFFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0960
+FFFFFFFF451BFFFF3C43FFFFFF5E25FFAA00D7FFFFFF2746FFFF0790FFFFFF2066FF6D04
+2D2D2D2D2D67FF6A1DFFFFFF9404FFFF0C192D2D2D2D2DD5FFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAF3FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1D2DFFFFFFFF1833FFFF3C43FFFFFF5E25FFD2008FFFFFF80746FFFF0D77FFFFF10766FF
+8D00C0FFFFFFFFFFFF740FFFFFFF6204FFFF1E38FFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3DF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33BFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF5707B1FFFD9A0077FFFF3C43FFFFFF5E25FFFF1C3AF1FF840046FFFF2634FDFF7400
+66FFE30E43EFFFFFE8DAFFA100B0FFE21B04FFFF6503B6FFFFFFC5FFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF86FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73DAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFE82A001712003DFBFFFF3C43FFFFFF5E25FFFFA50A0E24192446FFFF94031518
+2B1A66FFFFA00E07332B0793FFFD270226084804FFFFFA3F001C361A1EFFFFFF5C9CFFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFAD7B80B9FFFFFFFFBDC2FFFFFFCCB4FFFFFFD8818FE73346FFFFFFBD
+789AF3B1CFFFFFFFE7947281C7FFFFFFF68C7CC6E0A3FFFFFFFFB87E7597F3FFFFFFBCDA
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3346FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3346
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7F3FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF5C9CFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFBCDAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
+CCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFE2FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCDAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFB
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCDAFFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2EFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+5C9CFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFBCDAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67D5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6EDFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF1FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFBCDAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62
+D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFFFFFFFF3F7AFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCDAFFFFFFFFFFFFFF3F7AFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F
+7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF
+FF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFF
+FFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CE2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCDAFFFF
+FFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983
+FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+C0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECFBFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48CAFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF5C9CFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFBCDAFFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CD2FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFFFF3F7AFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7
+F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFFFFB2FF3F7AE2CAFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCDAFFFFFFFFFF8F343F701CEFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFEF10121424FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB0ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF2B010052FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6DD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3983FFFFFFFFFFFF570006C2FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C9CFFFFFFFFFFFFC50411FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A
+21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF2F7CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF9CEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7EDDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E5FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8F6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51CDFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF57D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFD0F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFA0E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73DAFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8EAFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFC7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF57D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF4DCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93E3FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85E0FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3EC6FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFC0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37F6FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF38C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFBFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04F1FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF67D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5EF8FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFB6EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8EDFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3DC3FFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CB4FFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFBFF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF62D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56FFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43C9FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24FFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FDFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CE2FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8CE2FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFECFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF48CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF33FFFFDD7EFFFFFF76EAFFFFB49FFFFFFF6AFFFFFF90C5FFFF
+D087FFFFFF6EF1FFFFA9A9FFFFF172FFFFFF87D0FFFFC590FFFFFF6AFFFFFF9FB4FFFFEA
+76FFFFFF7EDDFFFFBF95FFFFFF6AFFFFFF95B9FFFFDD7EFFFFFF76EAFFFFB49FFFFFFF6A
+FFFFFF90C5FFFFD087FFFFFF72F1FFFFA9A9FFFFF16EFFFFFF87D0FFFFC590FFFFFF6AFF
+FFFF9FB4FFFFEA76FFFFFF7EDDFFFFBF95FFFFFF6AFFFFFF9AB9FFFFDD7EFFFFFF76E3FF
+FFB49FFFFFFF6AFFFFFF90C5FFFFD087FFFFFF72F1FFFFA9A9FFFFF86EFFFFFF87D0FFFF
+C58CFFFFFF6AFFFFFF9FB4FFFFEA76FFFFFF7EDDFFFFBF95FFFFFF6AFFFFFF9AB9FFFFDD
+7EFFFFFF7AE3FFFFB49FFFFFFF66FFFFFF90C5FFFFD087FFFFFF72F1FFFFA9A9FFFFF86E
+FFFFFF87D0FFFFCA8CFFFFFF6AFFFFFF9FAEFFFFEA76FFFFFF7EDDFFFFBF95FFFFFF6AFF
+FFFF9AB9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE393FFFFFF8AEFFFFFC0AEFFFFFF7FFFFFFFA3CF
+FFFFDA9AFFFFFF84F4FFFFB8B8FFFFF487FFFFFF9ADAFFFFCFA3FFFFFF7FFFFFFFAEC0FF
+FFEF8AFFFFFF93E3FFFFCAA6FFFFFF7FFFFFFFA6C6FFFFE393FFFFFF8AEFFFFFC0AEFFFF
+FF7FFFFFFFA3CFFFFFDA9AFFFFFF87F4FFFFB8B8FFFFF484FFFFFF9ADAFFFFCFA3FFFFFF
+7FFFFFFFAEC0FFFFEF8AFFFFFF93E3FFFFCAA6FFFFFF7FFFFFFFAAC6FFFFE393FFFFFF8A
+E8FFFFC0AEFFFFFF7FFFFFFFA3CFFFFFDA9AFFFFFF87F4FFFFB8B8FFFFFA84FFFFFF9ADA
+FFFFCF9EFFFFFF7FFFFFFFAEC0FFFFEF8AFFFFFF93E3FFFFCAA6FFFFFF7FFFFFFFAAC6FF
+FFE393FFFFFF8EE8FFFFC0AEFFFFFF7CFFFFFFA3CFFFFFDA9AFFFFFF87F4FFFFB8B8FFFF
+FA84FFFFFF9ADAFFFFD49EFFFFFF7FFFFFFFAEBCFFFFEF8AFFFFFF93E3FFFFCAA6FFFFFF
+7FFFFFFFAAC6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200FF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF5200FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+end
+%%PageTrailer
+%%Trailer
+%%EOF
diff --git a/doc/img/ecore_thread_feedback.png b/doc/img/ecore_thread_feedback.png
new file mode 100644 (file)
index 0000000..4d75dbb
Binary files /dev/null and b/doc/img/ecore_thread_feedback.png differ
diff --git a/doc/img/edoxy.css b/doc/img/edoxy.css
new file mode 100644 (file)
index 0000000..311ca23
--- /dev/null
@@ -0,0 +1,486 @@
+/*
+ * This file contain a custom doxygen style to match e.org graphics
+ */
+
+
+
+/* BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
+       font-family: Geneva, Arial, Helvetica, sans-serif;
+}*/ 
+BODY, TD {
+       font-size: 12px;
+}
+H1 {
+       text-align: center;
+       font-size: 160%;
+}
+H2 {
+       font-size: 120%;
+}
+H3 {
+       font-size: 100%;
+}
+CAPTION { 
+       font-weight: bold 
+}
+DIV.qindex {
+       width: 100%;
+       background-color: #e8eef2;
+       border: 1px solid #84b0c7;
+       text-align: center;
+       margin: 2px;
+       padding: 2px;
+       line-height: 140%;
+}
+DIV.navpath {
+       width: 100%;
+       background-color: #e8eef2;
+       border: 1px solid #84b0c7;
+       text-align: center;
+       margin: 2px;
+       padding: 2px;
+       line-height: 140%;
+}
+DIV.navtab {
+       background-color: #e8eef2;
+       border: 1px solid #84b0c7;
+       text-align: center;
+       margin: 2px;
+       margin-right: 15px;
+       padding: 2px;
+}
+TD.navtab {
+       font-size: 70%;
+}
+A.qindex {
+       text-decoration: none;
+       font-weight: bold;
+       color: #1A419D;
+}
+A.qindex:visited {
+       text-decoration: none;
+       font-weight: bold;
+       color: #1A419D
+}
+A.qindex:hover {
+       text-decoration: none;
+       background-color: #ddddff;
+}
+A.qindexHL {
+       text-decoration: none;
+       font-weight: bold;
+       background-color: #6666cc;
+       color: #ffffff;
+       border: 1px double #9295C2;
+}
+A.qindexHL:hover {
+       text-decoration: none;
+       background-color: #6666cc;
+       color: #ffffff;
+}
+A.qindexHL:visited { 
+       text-decoration: none; 
+       background-color: #6666cc; 
+       color: #ffffff 
+}
+A.el { 
+       text-decoration: none; 
+       font-weight: bold 
+}
+A.elRef { 
+       font-weight: bold 
+}
+A.code:link { 
+       text-decoration: none; 
+       font-weight: normal; 
+       color: #0000FF
+}
+A.code:visited { 
+       text-decoration: none; 
+       font-weight: normal; 
+       color: #0000FF
+}
+A.codeRef:link { 
+       font-weight: normal; 
+       color: #0000FF
+}
+A.codeRef:visited { 
+       font-weight: normal; 
+       color: #0000FF
+}
+A:hover, A:visited:hover { 
+       text-decoration: none;  
+       /* background-color: #f2f2ff; */
+       color: #000055;
+}
+A.anchor {
+       color: #000;
+}
+DL.el { 
+       margin-left: -1cm 
+}
+.fragment {
+       font-family: monospace, fixed;
+       font-size: 95%;
+}
+PRE.fragment {
+       border: 1px solid #CCCCCC;
+       background-color: #f5f5f5;
+       margin-top: 4px;
+       margin-bottom: 4px;
+       margin-left: 2px;
+       margin-right: 8px;
+       padding-left: 6px;
+       padding-right: 6px;
+       padding-top: 4px;
+       padding-bottom: 4px;
+}
+DIV.ah { 
+       background-color: black; 
+       font-weight: bold; 
+       color: #ffffff; 
+       margin-bottom: 3px; 
+       margin-top: 3px 
+}
+
+DIV.groupHeader {
+       margin-left: 16px;
+       margin-top: 12px;
+       margin-bottom: 6px;
+       font-weight: bold;
+}
+DIV.groupText { 
+       margin-left: 16px; 
+       font-style: italic; 
+       font-size: 90% 
+}
+/*BODY {
+       background: white;
+       color: black;
+       margin-right: 20px;
+       margin-left: 20px;
+}*/
+TD.indexkey {
+       background-color: #e8eef2;
+       font-weight: bold;
+       padding-right  : 10px;
+       padding-top    : 2px;
+       padding-left   : 10px;
+       padding-bottom : 2px;
+       margin-left    : 0px;
+       margin-right   : 0px;
+       margin-top     : 2px;
+       margin-bottom  : 2px;
+       border: 1px solid #CCCCCC;
+}
+TD.indexvalue {
+       background-color: #e8eef2;
+       font-style: italic;
+       padding-right  : 10px;
+       padding-top    : 2px;
+       padding-left   : 10px;
+       padding-bottom : 2px;
+       margin-left    : 0px;
+       margin-right   : 0px;
+       margin-top     : 2px;
+       margin-bottom  : 2px;
+       border: 1px solid #CCCCCC;
+}
+TR.memlist {
+       background-color: #f0f0f0; 
+}
+P.formulaDsp { 
+       text-align: center; 
+}
+IMG.formulaDsp {
+}
+IMG.formulaInl { 
+       vertical-align: middle; 
+}
+SPAN.keyword       { color: #008000 }
+SPAN.keywordtype   { color: #604020 }
+SPAN.keywordflow   { color: #e08000 }
+SPAN.comment       { color: #800000 }
+SPAN.preprocessor  { color: #806020 }
+SPAN.stringliteral { color: #002080 }
+SPAN.charliteral   { color: #008080 }
+SPAN.vhdldigit     { color: #ff00ff }
+SPAN.vhdlchar      { color: #000000 }
+SPAN.vhdlkeyword   { color: #700070 }
+SPAN.vhdllogic     { color: #ff0000 }
+
+.mdescLeft {
+       padding: 0px 8px 4px 8px;
+       font-size: 80%;
+       font-style: italic;
+       background-color: #FAFAFA;
+       border-top: 1px none #E0E0E0;
+       border-right: 1px none #E0E0E0;
+       border-bottom: 1px none #E0E0E0;
+       border-left: 1px none #E0E0E0;
+       margin: 0px;
+}
+.mdescRight {
+        padding: 0px 8px 4px 8px;
+       font-size: 80%;
+       font-style: italic;
+       background-color: #FAFAFA;
+       border-top: 1px none #E0E0E0;
+       border-right: 1px none #E0E0E0;
+       border-bottom: 1px none #E0E0E0;
+       border-left: 1px none #E0E0E0;
+       margin: 0px;
+}
+.memItemLeft {
+       padding: 1px 0px 0px 8px;
+       margin: 4px;
+       border-top-width: 1px;
+       border-right-width: 1px;
+       border-bottom-width: 1px;
+       border-left-width: 1px;
+       border-top-color: #E0E0E0;
+       border-right-color: #E0E0E0;
+       border-bottom-color: #E0E0E0;
+       border-left-color: #E0E0E0;
+       border-top-style: solid;
+       border-right-style: none;
+       border-bottom-style: none;
+       border-left-style: none;
+       background-color: #FAFAFA;
+       font-size: 80%;
+}
+.memItemRight {
+       padding: 1px 8px 0px 8px;
+       margin: 4px;
+       border-top-width: 1px;
+       border-right-width: 1px;
+       border-bottom-width: 1px;
+       border-left-width: 1px;
+       border-top-color: #E0E0E0;
+       border-right-color: #E0E0E0;
+       border-bottom-color: #E0E0E0;
+       border-left-color: #E0E0E0;
+       border-top-style: solid;
+       border-right-style: none;
+       border-bottom-style: none;
+       border-left-style: none;
+       background-color: #FAFAFA;
+       font-size: 80%;
+}
+.memTemplItemLeft {
+       padding: 1px 0px 0px 8px;
+       margin: 4px;
+       border-top-width: 1px;
+       border-right-width: 1px;
+       border-bottom-width: 1px;
+       border-left-width: 1px;
+       border-top-color: #E0E0E0;
+       border-right-color: #E0E0E0;
+       border-bottom-color: #E0E0E0;
+       border-left-color: #E0E0E0;
+       border-top-style: none;
+       border-right-style: none;
+       border-bottom-style: none;
+       border-left-style: none;
+       background-color: #FAFAFA;
+       font-size: 80%;
+}
+.memTemplItemRight {
+       padding: 1px 8px 0px 8px;
+       margin: 4px;
+       border-top-width: 1px;
+       border-right-width: 1px;
+       border-bottom-width: 1px;
+       border-left-width: 1px;
+       border-top-color: #E0E0E0;
+       border-right-color: #E0E0E0;
+       border-bottom-color: #E0E0E0;
+       border-left-color: #E0E0E0;
+       border-top-style: none;
+       border-right-style: none;
+       border-bottom-style: none;
+       border-left-style: none;
+       background-color: #FAFAFA;
+       font-size: 80%;
+}
+.memTemplParams {
+       padding: 1px 0px 0px 8px;
+       margin: 4px;
+       border-top-width: 1px;
+       border-right-width: 1px;
+       border-bottom-width: 1px;
+       border-left-width: 1px;
+       border-top-color: #E0E0E0;
+       border-right-color: #E0E0E0;
+       border-bottom-color: #E0E0E0;
+       border-left-color: #E0E0E0;
+       border-top-style: solid;
+       border-right-style: none;
+       border-bottom-style: none;
+       border-left-style: none;
+       color: #606060;
+       background-color: #FAFAFA;
+       font-size: 80%;
+}
+.search { 
+       color: #003399;
+       font-weight: bold;
+}
+FORM.search {
+       margin-bottom: 0px;
+       margin-top: 0px;
+}
+INPUT.search { 
+       font-size: 75%;
+       color: #000080;
+       font-weight: normal;
+       background-color: #e8eef2;
+}
+TD.tiny { 
+       font-size: 75%;
+}
+a {
+       color: #1A41A8;
+}
+a:visited {
+       color: #2A3798;
+}
+.dirtab { 
+       padding: 4px;
+       border-collapse: collapse;
+       border: 1px solid #84b0c7;
+}
+TH.dirtab { 
+       background: #e8eef2;
+       font-weight: bold;
+}
+HR { 
+       height: 1px;
+       border: none;
+       border-top: 1px solid black;
+}
+
+/* Style for detailed member documentation */
+.memtemplate {
+       font-size: 80%;
+       color: #606060;
+       font-weight: normal;
+       margin-left: 3px;
+} 
+.memnav { 
+       background-color: #eeeeee;
+       border: 1px solid #dddddd;
+       text-align: center;
+       margin: 2px;
+       margin-right: 15px;
+       padding: 2px;
+}
+.memitem {
+       padding: 4px;
+       background-color: #eeeeee;
+       border-width: 1px;
+       border-style: solid;
+       border-color: #dddddd;
+       -moz-border-radius: 4px 4px 4px 4px;
+}
+.memname {
+       white-space: nowrap;
+       font-weight: bold;
+        color: #ffffff;
+}
+.memdoc{
+       padding-left: 10px;
+}
+.memproto {
+       background-color: #111111;
+       width: 100%;
+       border-width: 1px;
+       border-style: solid;
+       border-color: #000000;
+       font-weight: bold;
+       -moz-border-radius: 4px 4px 4px 4px;
+}
+.paramkey {
+       text-align: right;
+       color: #ffffff;
+}
+.paramtype {
+       white-space: nowrap;
+       color: #aaaaaa;
+}
+.paramname {
+       color: #ff0000;
+       font-style: italic;
+       white-space: nowrap;
+}
+/* End Styling for detailed member documentation */
+
+/* for the tree view */
+.ftvtree {
+       font-family: sans-serif;
+       margin:0.5em;
+}
+/* these are for tree view when used as main index */
+.directory { 
+       font-size: 9pt; 
+       font-weight: bold; 
+}
+.directory h3 { 
+       margin: 0px; 
+       margin-top: 1em; 
+       font-size: 11pt; 
+}
+
+/* The following two styles can be used to replace the root node title */
+/* with an image of your choice.  Simply uncomment the next two styles, */
+/* specify the name of your image and be sure to set 'height' to the */
+/* proper pixel height of your image. */
+
+/* .directory h3.swap { */
+/*     height: 61px; */
+/*     background-repeat: no-repeat; */
+/*     background-image: url("yourimage.gif"); */
+/* } */
+/* .directory h3.swap span { */
+/*     display: none; */
+/* } */
+
+.directory > h3 { 
+       margin-top: 0; 
+}
+.directory p { 
+       margin: 0px; 
+       white-space: nowrap; 
+}
+.directory div { 
+       display: none; 
+       margin: 0px; 
+}
+.directory img { 
+       vertical-align: -30%; 
+}
+/* these are for tree view when not used as main index */
+.directory-alt { 
+       font-size: 100%; 
+       font-weight: bold; 
+}
+.directory-alt h3 { 
+       margin: 0px; 
+       margin-top: 1em; 
+       font-size: 11pt; 
+}
+.directory-alt > h3 { 
+       margin-top: 0; 
+}
+.directory-alt p { 
+       margin: 0px; 
+       white-space: nowrap; 
+}
+.directory-alt div { 
+       display: none; 
+       margin: 0px; 
+}
+.directory-alt img { 
+       vertical-align: -30%; 
+}
+
diff --git a/doc/img/foot_bg.png b/doc/img/foot_bg.png
new file mode 100644 (file)
index 0000000..b24f3a4
Binary files /dev/null and b/doc/img/foot_bg.png differ
diff --git a/doc/img/head_bg.png b/doc/img/head_bg.png
new file mode 100644 (file)
index 0000000..081dc13
Binary files /dev/null and b/doc/img/head_bg.png differ
diff --git a/doc/img/header_menu_background.png b/doc/img/header_menu_background.png
new file mode 100644 (file)
index 0000000..e978743
Binary files /dev/null and b/doc/img/header_menu_background.png differ
diff --git a/doc/img/header_menu_background_last.png b/doc/img/header_menu_background_last.png
new file mode 100644 (file)
index 0000000..88c116c
Binary files /dev/null and b/doc/img/header_menu_background_last.png differ
diff --git a/doc/img/header_menu_current_background.png b/doc/img/header_menu_current_background.png
new file mode 100644 (file)
index 0000000..de97c92
Binary files /dev/null and b/doc/img/header_menu_current_background.png differ
diff --git a/doc/img/header_menu_unselected_background.png b/doc/img/header_menu_unselected_background.png
new file mode 100644 (file)
index 0000000..50e5fd8
Binary files /dev/null and b/doc/img/header_menu_unselected_background.png differ
diff --git a/doc/img/logo.png b/doc/img/logo.png
new file mode 100644 (file)
index 0000000..b3884a5
Binary files /dev/null and b/doc/img/logo.png differ
diff --git a/doc/img/prog_flow.eps b/doc/img/prog_flow.eps
new file mode 100644 (file)
index 0000000..bf4c8bd
--- /dev/null
@@ -0,0 +1,6036 @@
+%!PS-Adobe-3.1 EPSF-3.0
+%ADO_DSC_Encoding: MacOS Roman
+%%Title: diagramas_01-32.eps
+%%Creator: Adobe Illustrator(R) 14.0
+%%For: Marina Proni
+%%CreationDate: 8/11/11
+%%BoundingBox: 0 0 720 780
+%%HiResBoundingBox: 0 0 719.6582 779.4385
+%%CropBox: 0 0 719.6582 779.4385
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%ADOBeginClientInjection: DocumentHeader "AI11EPS"
+%%AI8_CreatorVersion: 14.0.0\r%AI9_PrintingDataBegin\r%ADO_BuildNumber: Adobe Illustrator(R) 14.0.0 x367 R agm 4.4890 ct 5.1541\r%ADO_ContainsXMP: MainFirst\r
+%ADOEndClientInjection: DocumentHeader "AI11EPS"
+%%Pages: 1
+%%DocumentNeededResources: 
+%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0
+%%+ procset Adobe_CoolType_Utility_T42 1.0 0
+%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0
+%%+ procset Adobe_CoolType_Core 2.31 0
+%%+ procset Adobe_AGM_Core 2.0 0
+%%+ procset Adobe_AGM_Utils 1.0 0
+%%DocumentFonts: 
+%%DocumentNeededFonts: 
+%%DocumentNeededFeatures: 
+%%DocumentSuppliedFeatures: 
+%%DocumentProcessColors:  Cyan Magenta Yellow Black
+%%DocumentCustomColors: 
+%%CMYKCustomColor: 
+%%RGBCustomColor: 
+%%EndComments
+                                                                                                                                                                                                                              
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+                                                                                                                                                                                                                                                         
+%%BeginDefaults
+%%ViewingOrientation: 1 0 0 1
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset Adobe_AGM_Utils 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{currentpacking        true setpacking}if
+userdict/Adobe_AGM_Utils 75 dict dup begin put
+/bdf
+{bind def}bind def
+/nd{null def}bdf
+/xdf
+{exch def}bdf
+/ldf 
+{load def}bdf
+/ddf
+{put}bdf       
+/xddf
+{3 -1 roll put}bdf     
+/xpt
+{exch put}bdf
+/ndf
+{
+       exch dup where{
+               pop pop pop
+       }{
+               xdf
+       }ifelse
+}def
+/cdndf
+{
+       exch dup currentdict exch known{
+               pop pop
+       }{
+               exch def
+       }ifelse
+}def
+/gx
+{get exec}bdf
+/ps_level
+       /languagelevel where{
+               pop systemdict/languagelevel gx
+       }{
+               1
+       }ifelse
+def
+/level2 
+       ps_level 2 ge
+def
+/level3 
+       ps_level 3 ge
+def
+/ps_version
+       {version cvr}stopped{-1}if
+def
+/set_gvm
+{currentglobal exch setglobal}bdf
+/reset_gvm
+{setglobal}bdf
+/makereadonlyarray
+{
+       /packedarray where{pop packedarray
+       }{
+               array astore readonly}ifelse
+}bdf
+/map_reserved_ink_name
+{
+       dup type/stringtype eq{
+               dup/Red eq{
+                       pop(_Red_)
+               }{
+                       dup/Green eq{
+                               pop(_Green_)
+                       }{
+                               dup/Blue eq{
+                                       pop(_Blue_)
+                               }{
+                                       dup()cvn eq{
+                                               pop(Process)
+                                       }if
+                               }ifelse
+                       }ifelse
+               }ifelse
+       }if
+}bdf
+/AGMUTIL_GSTATE 22 dict def
+/get_gstate
+{
+       AGMUTIL_GSTATE begin
+       /AGMUTIL_GSTATE_clr_spc currentcolorspace def
+       /AGMUTIL_GSTATE_clr_indx 0 def
+       /AGMUTIL_GSTATE_clr_comps 12 array def
+       mark currentcolor counttomark
+               {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put
+               /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop
+       /AGMUTIL_GSTATE_fnt rootfont def
+       /AGMUTIL_GSTATE_lw currentlinewidth def
+       /AGMUTIL_GSTATE_lc currentlinecap def
+       /AGMUTIL_GSTATE_lj currentlinejoin def
+       /AGMUTIL_GSTATE_ml currentmiterlimit def
+       currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf
+       /AGMUTIL_GSTATE_sa currentstrokeadjust def
+       /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def
+       /AGMUTIL_GSTATE_op currentoverprint def
+       /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def
+       /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def
+       currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf
+               cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf
+       /AGMUTIL_GSTATE_ht currenthalftone def
+       /AGMUTIL_GSTATE_flt currentflat def
+       end
+}def
+/set_gstate
+{
+       AGMUTIL_GSTATE begin
+       AGMUTIL_GSTATE_clr_spc setcolorspace
+       AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get
+       /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor
+       AGMUTIL_GSTATE_fnt setfont
+       AGMUTIL_GSTATE_lw setlinewidth
+       AGMUTIL_GSTATE_lc setlinecap
+       AGMUTIL_GSTATE_lj setlinejoin
+       AGMUTIL_GSTATE_ml setmiterlimit
+       AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash
+       AGMUTIL_GSTATE_sa setstrokeadjust
+       AGMUTIL_GSTATE_clr_rnd setcolorrendering
+       AGMUTIL_GSTATE_op setoverprint
+       AGMUTIL_GSTATE_bg cvx setblackgeneration
+       AGMUTIL_GSTATE_ucr cvx setundercolorremoval
+       AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx
+               AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer
+       AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or
+               {
+               currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne
+                       {
+                        mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark
+                       }if
+               }{
+               AGMUTIL_GSTATE_ht sethalftone
+               }ifelse
+       AGMUTIL_GSTATE_flt setflat
+       end
+}def
+/get_gstate_and_matrix
+{
+       AGMUTIL_GSTATE begin
+       /AGMUTIL_GSTATE_ctm matrix currentmatrix def
+       end
+       get_gstate
+}def
+/set_gstate_and_matrix
+{
+       set_gstate
+       AGMUTIL_GSTATE begin
+       AGMUTIL_GSTATE_ctm setmatrix
+       end
+}def
+/AGMUTIL_str256 256 string def
+/AGMUTIL_src256 256 string def
+/AGMUTIL_dst64 64 string def
+/AGMUTIL_srcLen nd
+/AGMUTIL_ndx nd
+/AGMUTIL_cpd nd
+/capture_cpd{
+       //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf
+}def
+/thold_halftone
+{
+       level3
+               {sethalftone currenthalftone}
+               {
+                       dup/HalftoneType get 3 eq
+                       {
+                               sethalftone currenthalftone
+                       }{
+                               begin
+                               Width Height mul{
+                                       Thresholds read{pop}if
+                               }repeat
+                               end
+                               currenthalftone
+                       }ifelse
+               }ifelse
+}def 
+/rdcmntline
+{
+       currentfile AGMUTIL_str256 readline pop
+       (%)anchorsearch{pop}if
+}bdf
+/filter_cmyk
+{      
+       dup type/filetype ne{
+               exch()/SubFileDecode filter
+       }{
+               exch pop
+       }
+       ifelse
+       [
+       exch
+       {
+               AGMUTIL_src256 readstring pop
+               dup length/AGMUTIL_srcLen exch def
+               /AGMUTIL_ndx 0 def
+               AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{
+                       1 index exch get
+                       AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put
+                       /AGMUTIL_ndx AGMUTIL_ndx 1 add def
+               }for
+               pop
+               AGMUTIL_dst64 0 AGMUTIL_ndx getinterval
+       }
+       bind
+       /exec cvx
+       ]cvx
+}bdf
+/filter_indexed_devn
+{
+       cvi Names length mul names_index add Lookup exch get
+}bdf
+/filter_devn
+{      
+       4 dict begin
+       /srcStr xdf
+       /dstStr xdf
+       dup type/filetype ne{
+               0()/SubFileDecode filter
+       }if
+       [
+       exch
+               [
+                       /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx
+                       currentdict/srcStr get/readstring cvx/pop cvx
+                       /dup cvx/length cvx 0/gt cvx[
+                               Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx
+                               names_index Names length currentdict/srcStr get length 1 sub{
+                                       1/index cvx/exch cvx/get cvx
+                                       currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx
+                                       Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx
+                               }for
+                               currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx
+                       ]cvx/if cvx
+                       /end cvx
+               ]cvx
+               bind
+               /exec cvx
+       ]cvx
+       end
+}bdf
+/AGMUTIL_imagefile nd
+/read_image_file
+{
+       AGMUTIL_imagefile 0 setfileposition
+       10 dict begin
+       /imageDict xdf
+       /imbufLen Width BitsPerComponent mul 7 add 8 idiv def
+       /imbufIdx 0 def
+       /origDataSource imageDict/DataSource get def
+       /origMultipleDataSources imageDict/MultipleDataSources get def
+       /origDecode imageDict/Decode get def
+       /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def
+       imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+       {
+               /imbufCnt imageDict/DataSource get length def
+               /imbufs imbufCnt array def
+               0 1 imbufCnt 1 sub{
+                       /imbufIdx xdf
+                       imbufs imbufIdx imbufLen string put
+                       imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put
+               }for
+               DeviceN_PS2{
+                       imageDict begin
+                       /DataSource[DataSource/devn_sep_datasource cvx]cvx def
+                       /MultipleDataSources false def
+                       /Decode[0 1]def
+                       end
+               }if
+       }{
+               /imbuf imbufLen string def
+               Indexed_DeviceN level3 not and DeviceN_NoneName or{
+                       /srcDataStrs[imageDict begin
+                               currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
+                               {
+                                       Width Decode length 2 div mul cvi string
+                               }repeat
+                               end]def         
+                       imageDict begin
+                       /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def
+                       /Decode[0 1]def
+                       end
+               }{
+                       imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put
+                       imageDict/Decode[0 1]put
+               }ifelse
+       }ifelse
+       imageDict exch
+       load exec
+       imageDict/DataSource origDataSource put
+       imageDict/MultipleDataSources origMultipleDataSources put
+       imageDict/Decode origDecode put 
+       end
+}bdf
+/write_image_file
+{
+       begin
+       {(AGMUTIL_imagefile)(w+)file}stopped{
+               false
+       }{
+               Adobe_AGM_Utils/AGMUTIL_imagefile xddf 
+               2 dict begin
+               /imbufLen Width BitsPerComponent mul 7 add 8 idiv def
+               MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{
+                       /imbuf imbufLen string def
+               }if
+               1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{
+                       pop
+                       MultipleDataSources{
+                               0 1 DataSource length 1 sub{
+                                       DataSource type dup
+                                       /arraytype eq{
+                                               pop DataSource exch gx
+                                       }{
+                                               /filetype eq{
+                                                       DataSource exch get imbuf readstring pop
+                                               }{
+                                                       DataSource exch get
+                                               }ifelse
+                                       }ifelse
+                                       AGMUTIL_imagefile exch writestring
+                               }for
+                       }{
+                               DataSource type dup
+                               /arraytype eq{
+                                       pop DataSource exec
+                               }{
+                                       /filetype eq{
+                                               DataSource imbuf readstring pop
+                                       }{
+                                               DataSource
+                                       }ifelse
+                               }ifelse
+                               AGMUTIL_imagefile exch writestring
+                       }ifelse
+               }for
+               end
+               true
+       }ifelse
+       end
+}bdf
+/close_image_file
+{
+       AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile
+}def
+statusdict/product known userdict/AGMP_current_show known not and{
+       /pstr statusdict/product get def
+       pstr(HP LaserJet 2200)eq        
+       pstr(HP LaserJet 4000 Series)eq or
+       pstr(HP LaserJet 4050 Series )eq or
+       pstr(HP LaserJet 8000 Series)eq or
+       pstr(HP LaserJet 8100 Series)eq or
+       pstr(HP LaserJet 8150 Series)eq or
+       pstr(HP LaserJet 5000 Series)eq or
+       pstr(HP LaserJet 5100 Series)eq or
+       pstr(HP Color LaserJet 4500)eq or
+       pstr(HP Color LaserJet 4600)eq or
+       pstr(HP LaserJet 5Si)eq or
+       pstr(HP LaserJet 1200 Series)eq or
+       pstr(HP LaserJet 1300 Series)eq or
+       pstr(HP LaserJet 4100 Series)eq or 
+       {
+               userdict/AGMP_current_show/show load put
+               userdict/show{
+                currentcolorspace 0 get
+                /Pattern eq
+                {false charpath f}
+                {AGMP_current_show}ifelse
+               }put
+       }if
+       currentdict/pstr undef
+}if
+/consumeimagedata
+{
+       begin
+       AGMIMG_init_common
+       currentdict/MultipleDataSources known not
+               {/MultipleDataSources false def}if
+       MultipleDataSources
+               {
+               DataSource 0 get type
+               dup/filetype eq
+                       {
+                       1 dict begin
+                       /flushbuffer Width cvi string def
+                       1 1 Height cvi
+                               {
+                               pop
+                               0 1 DataSource length 1 sub
+                                       {
+                                       DataSource exch get
+                                       flushbuffer readstring pop pop
+                                       }for
+                               }for
+                       end
+                       }if
+               dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and
+                       {
+                       Width Height mul cvi
+                               {
+                               0 1 DataSource length 1 sub
+                                       {dup DataSource exch gx length exch 0 ne{pop}if}for
+                               dup 0 eq
+                                       {pop exit}if
+                               sub dup 0 le
+                                       {exit}if
+                               }loop
+                       pop
+                       }if             
+               }
+               {
+               /DataSource load type 
+               dup/filetype eq
+                       {
+                       1 dict begin
+                       /flushbuffer Width Decode length 2 idiv mul cvi string def
+                       1 1 Height{pop DataSource flushbuffer readstring pop pop}for
+                       end
+                       }if
+               dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and
+                       {
+                               Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul
+                                       {
+                                       DataSource length dup 0 eq
+                                               {pop exit}if
+                                       sub dup 0 le
+                                               {exit}if
+                                       }loop
+                               pop
+                       }if
+               }ifelse
+       end
+}bdf
+/addprocs
+{
+        2{/exec load}repeat
+        3 1 roll
+        [5 1 roll]bind cvx
+}def
+/modify_halftone_xfer
+{
+       currenthalftone dup length dict copy begin
+        currentdict 2 index known{
+               1 index load dup length dict copy begin
+               currentdict/TransferFunction known{
+                       /TransferFunction load
+               }{
+                       currenttransfer
+               }ifelse
+                addprocs/TransferFunction xdf 
+                currentdict end def
+               currentdict end sethalftone
+       }{
+               currentdict/TransferFunction known{
+                       /TransferFunction load 
+               }{
+                       currenttransfer
+               }ifelse
+               addprocs/TransferFunction xdf
+               currentdict end sethalftone             
+               pop
+       }ifelse
+}def
+/clonearray
+{
+       dup xcheck exch
+       dup length array exch
+       Adobe_AGM_Core/AGMCORE_tmp -1 ddf 
+       {
+       Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf 
+       dup type/dicttype eq
+               {
+                       Adobe_AGM_Core/AGMCORE_tmp get
+                       exch
+                       clonedict
+                       Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
+               }if
+       dup type/arraytype eq
+               {
+                       Adobe_AGM_Core/AGMCORE_tmp get exch
+                       clonearray
+                       Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf 
+               }if
+       exch dup
+       Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put
+       }forall
+       exch{cvx}if
+}bdf
+/clonedict
+{
+       dup length dict
+       begin
+       {
+               dup type/dicttype eq
+                       {clonedict}if
+               dup type/arraytype eq
+                       {clonearray}if
+               def
+       }forall
+       currentdict
+       end
+}bdf
+/DeviceN_PS2
+{
+       /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and
+}bdf
+/Indexed_DeviceN
+{
+       /indexed_colorspace_dict AGMCORE_gget dup null ne{
+               dup/CSDBase known{
+                       /CSDBase get/CSD get_res/Names known 
+               }{
+                       pop false
+               }ifelse
+       }{
+               pop false
+       }ifelse
+}bdf
+/DeviceN_NoneName
+{      
+       /Names where{
+               pop
+               false Names
+               {
+                       (None)eq or
+               }forall
+       }{
+               false
+       }ifelse
+}bdf
+/DeviceN_PS2_inRip_seps
+{
+       /AGMCORE_in_rip_sep where
+       {
+               pop dup type dup/arraytype eq exch/packedarraytype eq or
+               {
+                       dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and
+                       {
+                               /currentcolorspace exch AGMCORE_gput
+                               false
+                       }{
+                               true
+                       }ifelse
+               }{
+                       true
+               }ifelse
+       }{
+               true
+       }ifelse
+}bdf
+/base_colorspace_type
+{
+       dup type/arraytype eq{0 get}if
+}bdf
+/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
+{
+       /pdfmark_5{cleartomark}bind def
+}{
+       /pdfmark_5{pdfmark}bind def
+}ifelse
+/ReadBypdfmark_5
+{
+       currentfile exch 0 exch/SubFileDecode filter
+       /currentdistillerparams where 
+       {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse
+       {flushfile cleartomark}
+       {/PUT pdfmark}ifelse    
+}bdf
+/ReadBypdfmark_5_string
+{
+       2 dict begin
+       /makerString exch def string/tmpString exch def
+       {
+               currentfile tmpString readline not{pop exit}if
+               makerString anchorsearch
+               {
+                       pop pop cleartomark exit
+               }{
+                       3 copy/PUT pdfmark_5 pop 2 copy(\n)/PUT pdfmark_5
+               }ifelse
+       }loop
+       end
+}bdf
+/xpdfm
+{
+       {
+               dup 0 get/Label eq
+               {
+                       aload length[exch 1 add 1 roll/PAGELABEL
+               }{
+                       aload pop
+                       [{ThisPage}<<5 -2 roll>>/PUT
+               }ifelse
+               pdfmark_5
+       }forall
+}bdf
+/lmt{
+       dup 2 index le{exch}if pop dup 2 index ge{exch}if pop
+}bdf
+/int{
+       dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul exch pop add exch pop
+}bdf
+/ds{
+       Adobe_AGM_Utils begin
+}bdf
+/dt{
+       currentdict Adobe_AGM_Utils eq{
+               end
+       }if
+}bdf
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+%%BeginResource: procset Adobe_AGM_Core 2.0 0
+%%Version: 2.0 0
+%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{
+       currentpacking
+       true setpacking
+}if
+userdict/Adobe_AGM_Core 209 dict dup begin put
+/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def
+/AGMCORE_str256 256 string def
+/AGMCORE_save nd
+/AGMCORE_graphicsave nd
+/AGMCORE_c 0 def
+/AGMCORE_m 0 def
+/AGMCORE_y 0 def
+/AGMCORE_k 0 def
+/AGMCORE_cmykbuf 4 array def
+/AGMCORE_screen[currentscreen]cvx def
+/AGMCORE_tmp 0 def
+/AGMCORE_&setgray nd
+/AGMCORE_&setcolor nd
+/AGMCORE_&setcolorspace nd
+/AGMCORE_&setcmykcolor nd
+/AGMCORE_cyan_plate nd
+/AGMCORE_magenta_plate nd
+/AGMCORE_yellow_plate nd
+/AGMCORE_black_plate nd
+/AGMCORE_plate_ndx nd
+/AGMCORE_get_ink_data nd
+/AGMCORE_is_cmyk_sep nd
+/AGMCORE_host_sep nd
+/AGMCORE_avoid_L2_sep_space nd
+/AGMCORE_distilling nd
+/AGMCORE_composite_job nd
+/AGMCORE_producing_seps nd
+/AGMCORE_ps_level -1 def
+/AGMCORE_ps_version -1 def
+/AGMCORE_environ_ok nd
+/AGMCORE_CSD_cache 0 dict def
+/AGMCORE_currentoverprint false def
+/AGMCORE_deltaX nd
+/AGMCORE_deltaY nd
+/AGMCORE_name nd
+/AGMCORE_sep_special nd
+/AGMCORE_err_strings 4 dict def
+/AGMCORE_cur_err nd
+/AGMCORE_current_spot_alias false def
+/AGMCORE_inverting false def
+/AGMCORE_feature_dictCount nd
+/AGMCORE_feature_opCount nd
+/AGMCORE_feature_ctm nd
+/AGMCORE_ConvertToProcess false def
+/AGMCORE_Default_CTM matrix def
+/AGMCORE_Default_PageSize nd
+/AGMCORE_Default_flatness nd
+/AGMCORE_currentbg nd
+/AGMCORE_currentucr nd
+/AGMCORE_pattern_paint_type 0 def
+/knockout_unitsq nd
+currentglobal true setglobal
+[/CSA/Gradient/Procedure]
+{
+       /Generic/Category findresource dup length dict copy/Category defineresource pop
+}forall
+setglobal
+/AGMCORE_key_known
+{
+       where{
+               /Adobe_AGM_Core_Id known
+       }{
+               false
+       }ifelse
+}ndf
+/flushinput
+{
+       save
+       2 dict begin
+       /CompareBuffer 3 -1 roll def
+       /readbuffer 256 string def
+       mark
+       {
+       currentfile readbuffer{readline}stopped
+               {cleartomark mark}
+               {
+               not
+                       {pop exit}
+               if
+               CompareBuffer eq
+                       {exit}
+               if
+               }ifelse
+       }loop
+       cleartomark
+       end
+       restore
+}bdf
+/getspotfunction
+{
+       AGMCORE_screen exch pop exch pop
+       dup type/dicttype eq{
+               dup/HalftoneType get 1 eq{
+                       /SpotFunction get
+               }{
+                       dup/HalftoneType get 2 eq{
+                               /GraySpotFunction get
+                       }{
+                               pop
+                               {
+                                       abs exch abs 2 copy add 1 gt{
+                                               1 sub dup mul exch 1 sub dup mul add 1 sub
+                                       }{
+                                               dup mul exch dup mul add 1 exch sub
+                                       }ifelse
+                               }bind
+                       }ifelse
+               }ifelse
+       }if
+}def
+/np
+{newpath}bdf
+/clp_npth
+{clip np}def
+/eoclp_npth
+{eoclip np}def
+/npth_clp
+{np clip}def
+/graphic_setup
+{
+       /AGMCORE_graphicsave save store
+       concat
+       0 setgray
+       0 setlinecap
+       0 setlinejoin
+       1 setlinewidth
+       []0 setdash
+       10 setmiterlimit
+       np
+       false setoverprint
+       false setstrokeadjust
+       //Adobe_AGM_Core/spot_alias gx
+       /Adobe_AGM_Image where{
+               pop
+               Adobe_AGM_Image/spot_alias 2 copy known{
+                       gx
+               }{
+                       pop pop
+               }ifelse
+       }if
+       /sep_colorspace_dict null AGMCORE_gput
+       100 dict begin
+       /dictstackcount countdictstack def
+       /showpage{}def
+       mark
+}def
+/graphic_cleanup
+{
+       cleartomark
+       dictstackcount 1 countdictstack 1 sub{end}for
+       end
+       AGMCORE_graphicsave restore
+}def
+/compose_error_msg
+{
+       grestoreall initgraphics        
+       /Helvetica findfont 10 scalefont setfont
+       /AGMCORE_deltaY 100 def
+       /AGMCORE_deltaX 310 def
+       clippath pathbbox np pop pop 36 add exch 36 add exch moveto
+       0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto
+       0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath
+       0 AGMCORE_&setgray
+       gsave 1 AGMCORE_&setgray fill grestore 
+       1 setlinewidth gsave stroke grestore
+       currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto
+       /AGMCORE_deltaY 12 def
+       /AGMCORE_tmp 0 def
+       AGMCORE_err_strings exch get
+               {
+               dup 32 eq
+                       {
+                       pop
+                       AGMCORE_str256 0 AGMCORE_tmp getinterval
+                       stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt
+                               {
+                               currentpoint AGMCORE_deltaY sub exch pop
+                               clippath pathbbox pop pop pop 44 add exch moveto
+                               }if
+                       AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show
+                       0 1 AGMCORE_str256 length 1 sub
+                               {
+                               AGMCORE_str256 exch 0 put
+                               }for
+                       /AGMCORE_tmp 0 def
+                       }{
+                               AGMCORE_str256 exch AGMCORE_tmp xpt
+                               /AGMCORE_tmp AGMCORE_tmp 1 add def
+                       }ifelse
+               }forall
+}bdf
+/AGMCORE_CMYKDeviceNColorspaces[
+       [/Separation/None/DeviceCMYK{0 0 0}]
+       [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind]
+       [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind]
+       [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind]
+       [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind]
+       [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind]
+       [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind]
+       [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind]
+       [/Separation(Cyan)/DeviceCMYK{0 0 0}]
+       [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind]
+       [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind]
+       [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind]
+       [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}]
+       [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind]
+       [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}]
+       [/DeviceCMYK]
+]def
+/ds{
+       Adobe_AGM_Core begin
+       /currentdistillerparams where
+               {
+               pop currentdistillerparams/CoreDistVersion get 5000 lt
+                       {<</DetectBlends false>>setdistillerparams}if
+               }if     
+       /AGMCORE_ps_version xdf
+       /AGMCORE_ps_level xdf
+       errordict/AGM_handleerror known not{
+               errordict/AGM_handleerror errordict/handleerror get put
+               errordict/handleerror{
+                       Adobe_AGM_Core begin
+                       $error/newerror get AGMCORE_cur_err null ne and{
+                               $error/newerror false put
+                               AGMCORE_cur_err compose_error_msg
+                       }if
+                       $error/newerror true put
+                       end
+                       errordict/AGM_handleerror get exec
+                       }bind put
+               }if
+       /AGMCORE_environ_ok 
+               ps_level AGMCORE_ps_level ge
+               ps_version AGMCORE_ps_version ge and 
+               AGMCORE_ps_level -1 eq or
+       def
+       AGMCORE_environ_ok not
+               {/AGMCORE_cur_err/AGMCORE_bad_environ def}if
+       /AGMCORE_&setgray systemdict/setgray get def
+       level2{
+               /AGMCORE_&setcolor systemdict/setcolor get def
+               /AGMCORE_&setcolorspace systemdict/setcolorspace get def
+       }if
+       /AGMCORE_currentbg currentblackgeneration def
+       /AGMCORE_currentucr currentundercolorremoval def
+       /AGMCORE_Default_flatness currentflat def
+       /AGMCORE_distilling
+               /product where{
+                       pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and
+               }{
+                       false
+               }ifelse
+       def
+       /AGMCORE_GSTATE AGMCORE_key_known not{
+               /AGMCORE_GSTATE 21 dict def
+               /AGMCORE_tmpmatrix matrix def
+               /AGMCORE_gstack 32 array def
+               /AGMCORE_gstackptr 0 def
+               /AGMCORE_gstacksaveptr 0 def
+               /AGMCORE_gstackframekeys 14 def
+               /AGMCORE_&gsave/gsave ldf
+               /AGMCORE_&grestore/grestore ldf
+               /AGMCORE_&grestoreall/grestoreall ldf
+               /AGMCORE_&save/save ldf
+               /AGMCORE_&setoverprint/setoverprint ldf
+               /AGMCORE_gdictcopy{
+                       begin
+                       {def}forall
+                       end
+               }def
+               /AGMCORE_gput{
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       3 1 roll
+                       put
+               }def
+               /AGMCORE_gget{
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       exch
+                       get
+               }def
+               /gsave{
+                       AGMCORE_&gsave
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gstackptr 1 add
+                       dup 32 ge{limitcheck}if
+                       /AGMCORE_gstackptr exch store
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gdictcopy
+               }def
+               /grestore{
+                       AGMCORE_&grestore
+                       AGMCORE_gstackptr 1 sub
+                       dup AGMCORE_gstacksaveptr lt{1 add}if
+                       dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known
+                               {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse
+                       /AGMCORE_gstackptr exch store
+               }def
+               /grestoreall{
+                       AGMCORE_&grestoreall
+                       /AGMCORE_gstackptr AGMCORE_gstacksaveptr store 
+               }def
+               /save{
+                       AGMCORE_&save
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gstackptr 1 add
+                       dup 32 ge{limitcheck}if
+                       /AGMCORE_gstackptr exch store
+                       /AGMCORE_gstacksaveptr AGMCORE_gstackptr store
+                       AGMCORE_gstack AGMCORE_gstackptr get
+                       AGMCORE_gdictcopy
+               }def
+               /setoverprint{
+                       dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint
+               }def    
+               0 1 AGMCORE_gstack length 1 sub{
+                               AGMCORE_gstack exch AGMCORE_gstackframekeys dict put
+               }for
+       }if
+       level3/AGMCORE_&sysshfill AGMCORE_key_known not and
+       {
+               /AGMCORE_&sysshfill systemdict/shfill get def
+               /AGMCORE_&sysmakepattern systemdict/makepattern get def
+               /AGMCORE_&usrmakepattern/makepattern load def
+       }if
+       /currentcmykcolor[0 0 0 0]AGMCORE_gput
+       /currentstrokeadjust false AGMCORE_gput
+       /currentcolorspace[/DeviceGray]AGMCORE_gput
+       /sep_tint 0 AGMCORE_gput
+       /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput
+       /sep_colorspace_dict null AGMCORE_gput
+       /devicen_colorspace_dict null AGMCORE_gput
+       /indexed_colorspace_dict null AGMCORE_gput
+       /currentcolor_intent()AGMCORE_gput
+       /customcolor_tint 1 AGMCORE_gput
+       /absolute_colorimetric_crd null AGMCORE_gput
+       /relative_colorimetric_crd null AGMCORE_gput
+       /saturation_crd null AGMCORE_gput
+       /perceptual_crd null AGMCORE_gput
+       currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf
+                cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf
+       <<
+       /MaxPatternItem currentsystemparams/MaxPatternCache get
+       >>
+       setuserparams
+       end
+}def
+/ps
+{
+       /setcmykcolor where{
+               pop
+               Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put
+       }if
+       Adobe_AGM_Core begin
+       /setcmykcolor
+       {
+               4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput
+               1 sub 4 1 roll
+               3{
+                       3 index add neg dup 0 lt{
+                               pop 0
+                       }if
+                       3 1 roll
+               }repeat
+               setrgbcolor pop
+       }ndf
+       /currentcmykcolor
+       {
+               /currentcmykcolor AGMCORE_gget aload pop
+       }ndf
+       /setoverprint
+       {pop}ndf
+       /currentoverprint
+       {false}ndf
+       /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def
+       /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def
+       /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def
+       /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def
+       /AGMCORE_plate_ndx 
+               AGMCORE_cyan_plate{
+                       0
+               }{
+                       AGMCORE_magenta_plate{
+                               1
+                       }{
+                               AGMCORE_yellow_plate{
+                                       2
+                               }{
+                                       AGMCORE_black_plate{
+                                               3
+                                       }{
+                                               4
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+               def
+       /AGMCORE_have_reported_unsupported_color_space false def
+       /AGMCORE_report_unsupported_color_space
+       {
+               AGMCORE_have_reported_unsupported_color_space false eq
+               {
+                       (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)==
+                       Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf
+               }if
+       }def
+       /AGMCORE_composite_job
+               AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def
+       /AGMCORE_in_rip_sep
+               /AGMCORE_in_rip_sep where{
+                       pop AGMCORE_in_rip_sep
+               }{
+                       AGMCORE_distilling 
+                       {
+                               false
+                       }{
+                               userdict/Adobe_AGM_OnHost_Seps known{
+                                       false
+                               }{
+                                       level2{
+                                               currentpagedevice/Separations 2 copy known{
+                                                       get
+                                               }{
+                                                       pop pop false
+                                               }ifelse
+                                       }{
+                                               false
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+       def
+       /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def
+       /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def
+       /AGM_preserve_spots 
+               /AGM_preserve_spots where{
+                       pop AGM_preserve_spots
+               }{
+                       AGMCORE_distilling AGMCORE_producing_seps or
+               }ifelse
+       def
+       /AGM_is_distiller_preserving_spotimages
+       {
+               currentdistillerparams/PreserveOverprintSettings known
+               {
+                       currentdistillerparams/PreserveOverprintSettings get
+                               {
+                                       currentdistillerparams/ColorConversionStrategy known
+                                       {
+                                               currentdistillerparams/ColorConversionStrategy get
+                                               /sRGB ne
+                                       }{
+                                               true
+                                       }ifelse
+                               }{
+                                       false
+                               }ifelse
+               }{
+                       false
+               }ifelse
+       }def
+       /convert_spot_to_process where{pop}{
+               /convert_spot_to_process
+               {
+                       //Adobe_AGM_Core begin
+                       dup map_alias{
+                               /Name get exch pop
+                       }if
+                       dup dup(None)eq exch(All)eq or
+                               {
+                               pop false
+                               }{
+                               AGMCORE_host_sep
+                               {
+                                       gsave
+                                       1 0 0 0 setcmykcolor currentgray 1 exch sub
+                                       0 1 0 0 setcmykcolor currentgray 1 exch sub
+                                       0 0 1 0 setcmykcolor currentgray 1 exch sub
+                                       0 0 0 1 setcmykcolor currentgray 1 exch sub
+                                       add add add 0 eq
+                                       {
+                                               pop false
+                                       }{
+                                               false setoverprint
+                                               current_spot_alias false set_spot_alias
+                                               1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
+                                               set_spot_alias
+                                               currentgray 1 ne
+                                       }ifelse
+                                       grestore
+                               }{
+                                       AGMCORE_distilling
+                                       {
+                                               pop AGM_is_distiller_preserving_spotimages not
+                                       }{
+                                               //Adobe_AGM_Core/AGMCORE_name xddf
+                                               false
+                                               //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq
+                                               AGMUTIL_cpd/OverrideSeparations known and
+                                               {
+                                                       AGMUTIL_cpd/OverrideSeparations get
+                                                       {
+                                                               /HqnSpots/ProcSet resourcestatus
+                                                               {
+                                                                       pop pop pop true
+                                                               }if
+                                                       }if
+                                               }if                                     
+                                               {
+                                                       AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not
+                                               }{
+                                                       gsave
+                                                       [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace
+                                                       false
+                                                       AGMUTIL_cpd/SeparationColorNames 2 copy known
+                                                       {
+                                                               get
+                                                               {AGMCORE_name eq or}forall
+                                                               not
+                                                       }{
+                                                               pop pop pop true
+                                                       }ifelse
+                                                       grestore
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+                       end
+               }def
+       }ifelse
+       /convert_to_process where{pop}{
+               /convert_to_process
+               {
+                       dup length 0 eq
+                               {
+                               pop false
+                               }{
+                               AGMCORE_host_sep
+                               {
+                               dup true exch
+                                       {
+                                       dup(Cyan)eq exch
+                                       dup(Magenta)eq 3 -1 roll or exch
+                                       dup(Yellow)eq 3 -1 roll or exch
+                                       dup(Black)eq 3 -1 roll or
+                                               {pop}
+                                               {convert_spot_to_process and}ifelse
+                                       }
+                               forall
+                                       {
+                                       true exch
+                                               {
+                                               dup(Cyan)eq exch
+                                               dup(Magenta)eq 3 -1 roll or exch
+                                               dup(Yellow)eq 3 -1 roll or exch
+                                               (Black)eq or and
+                                               }forall
+                                               not
+                                       }{pop false}ifelse
+                               }{
+                               false exch
+                                       {
+                                       /PhotoshopDuotoneList where{pop false}{true}ifelse
+                                               {
+                                               dup(Cyan)eq exch
+                                               dup(Magenta)eq 3 -1 roll or exch
+                                               dup(Yellow)eq 3 -1 roll or exch
+                                               dup(Black)eq 3 -1 roll or
+                                               {pop}
+                                               {convert_spot_to_process or}ifelse
+                                               }
+                                               {
+                                               convert_spot_to_process or
+                                               }
+                                       ifelse
+                                       }
+                               forall
+                               }ifelse
+                       }ifelse
+               }def
+       }ifelse 
+       /AGMCORE_avoid_L2_sep_space 
+               version cvr 2012 lt 
+               level2 and 
+               AGMCORE_producing_seps not and
+       def
+       /AGMCORE_is_cmyk_sep
+               AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or
+       def
+       /AGM_avoid_0_cmyk where{
+               pop AGM_avoid_0_cmyk
+       }{
+               AGM_preserve_spots 
+               userdict/Adobe_AGM_OnHost_Seps known 
+               userdict/Adobe_AGM_InRip_Seps known or
+               not and
+       }ifelse
+       {
+               /setcmykcolor[
+                       {
+                               4 copy add add add 0 eq currentoverprint and{
+                                       pop 0.0005
+                               }if
+                       }/exec cvx
+                       /AGMCORE_&setcmykcolor load dup type/operatortype ne{
+                               /exec cvx
+                       }if
+               ]cvx def
+       }if
+       /AGMCORE_IsSeparationAProcessColor
+               {
+               dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or
+               }def
+       AGMCORE_host_sep{
+               /setcolortransfer
+               {
+                       AGMCORE_cyan_plate{
+                               pop pop pop
+                       }{
+                               AGMCORE_magenta_plate{
+                                       4 3 roll pop pop pop
+                               }{
+                                       AGMCORE_yellow_plate{
+                                               4 2 roll pop pop pop
+                                       }{
+                                               4 1 roll pop pop pop
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+                       settransfer 
+               }       
+               def
+               /AGMCORE_get_ink_data
+                       AGMCORE_cyan_plate{
+                               {pop pop pop}
+                       }{
+                               AGMCORE_magenta_plate{
+                                       {4 3 roll pop pop pop}
+                               }{
+                                       AGMCORE_yellow_plate{
+                                               {4 2 roll pop pop pop}
+                                       }{
+                                               {4 1 roll pop pop pop}
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               def
+               /AGMCORE_RemoveProcessColorNames
+                       {
+                       1 dict begin
+                       /filtername
+                               {
+                               dup/Cyan eq 1 index(Cyan)eq or
+                                       {pop(_cyan_)}if
+                               dup/Magenta eq 1 index(Magenta)eq or
+                                       {pop(_magenta_)}if
+                               dup/Yellow eq 1 index(Yellow)eq or
+                                       {pop(_yellow_)}if
+                               dup/Black eq 1 index(Black)eq or
+                                       {pop(_black_)}if
+                               }def
+                       dup type/arraytype eq
+                               {[exch{filtername}forall]}
+                               {filtername}ifelse
+                       end
+                       }def
+               level3{
+                       /AGMCORE_IsCurrentColor
+                               {
+                               dup AGMCORE_IsSeparationAProcessColor
+                                       {
+                                       AGMCORE_plate_ndx 0 eq
+                                               {dup(Cyan)eq exch/Cyan eq or}if
+                                       AGMCORE_plate_ndx 1 eq
+                                               {dup(Magenta)eq exch/Magenta eq or}if
+                                       AGMCORE_plate_ndx 2 eq
+                                               {dup(Yellow)eq exch/Yellow eq or}if
+                                       AGMCORE_plate_ndx 3 eq
+                                               {dup(Black)eq exch/Black eq or}if
+                                       AGMCORE_plate_ndx 4 eq
+                                               {pop false}if
+                                       }{
+                                       gsave
+                                       false setoverprint
+                                       current_spot_alias false set_spot_alias
+                                       1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor
+                                       set_spot_alias
+                                       currentgray 1 ne
+                                       grestore
+                                       }ifelse
+                               }def
+                       /AGMCORE_filter_functiondatasource
+                               {       
+                               5 dict begin
+                               /data_in xdf
+                               data_in type/stringtype eq
+                                       {
+                                       /ncomp xdf
+                                       /comp xdf
+                                       /string_out data_in length ncomp idiv string def
+                                       0 ncomp data_in length 1 sub
+                                               {
+                                               string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put
+                                               }for
+                                       string_out
+                                       }{
+                                       string/string_in xdf
+                                       /string_out 1 string def
+                                       /component xdf
+                                       [
+                                       data_in string_in/readstring cvx
+                                               [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx
+                                               [/pop cvx()]cvx/ifelse cvx
+                                       ]cvx/ReusableStreamDecode filter
+                               }ifelse
+                               end
+                               }def
+                       /AGMCORE_separateShadingFunction
+                               {
+                               2 dict begin
+                               /paint? xdf
+                               /channel xdf
+                               dup type/dicttype eq
+                                       {
+                                       begin
+                                       FunctionType 0 eq
+                                               {
+                                               /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def
+                                               currentdict/Decode known
+                                                       {/Decode Decode channel 2 mul 2 getinterval def}if
+                                               paint? not
+                                                       {/Decode[1 1]def}if
+                                               }if
+                                       FunctionType 2 eq
+                                               {
+                                               paint?
+                                                       {
+                                                       /C0[C0 channel get 1 exch sub]def
+                                                       /C1[C1 channel get 1 exch sub]def
+                                                       }{
+                                                       /C0[1]def
+                                                       /C1[1]def
+                                                       }ifelse                 
+                                               }if
+                                       FunctionType 3 eq
+                                               {
+                                               /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def                  
+                                               }if
+                                       currentdict/Range known
+                                               {/Range[0 1]def}if
+                                       currentdict
+                                       end}{
+                                       channel get 0 paint? AGMCORE_separateShadingFunction
+                                       }ifelse
+                               end
+                               }def
+                       /AGMCORE_separateShading
+                               {
+                               3 -1 roll begin
+                               currentdict/Function known
+                                       {
+                                       currentdict/Background known
+                                               {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if
+                                       Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf
+                                       /ColorSpace[/DeviceGray]def
+                                       }{
+                                       ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq
+                                               {
+                                               /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
+                                               }{
+                                               ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put
+                                               }ifelse
+                                       ColorSpace 0 get/Separation eq
+                                               {
+                                                       {
+                                                               [1/exch cvx/sub cvx]cvx
+                                                       }{
+                                                               [/pop cvx 1]cvx
+                                                       }ifelse
+                                                       ColorSpace 3 3 -1 roll put
+                                                       pop
+                                               }{
+                                                       {
+                                                               [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx
+                                                       }{
+                                                               pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx
+                                                       }ifelse
+                                                       ColorSpace 3 3 -1 roll bind put
+                                               }ifelse
+                                       ColorSpace 2/DeviceGray put                                                                                                                                             
+                                       }ifelse
+                               end
+                               }def
+                       /AGMCORE_separateShadingDict
+                               {
+                               dup/ColorSpace get
+                               dup type/arraytype ne
+                                       {[exch]}if
+                               dup 0 get/DeviceCMYK eq
+                                       {
+                                       exch begin 
+                                       currentdict
+                                       AGMCORE_cyan_plate
+                                               {0 true}if
+                                       AGMCORE_magenta_plate
+                                               {1 true}if
+                                       AGMCORE_yellow_plate
+                                               {2 true}if
+                                       AGMCORE_black_plate
+                                               {3 true}if
+                                       AGMCORE_plate_ndx 4 eq
+                                               {0 false}if             
+                                       dup not currentoverprint and
+                                               {/AGMCORE_ignoreshade true def}if
+                                       AGMCORE_separateShading
+                                       currentdict
+                                       end exch
+                                       }if
+                               dup 0 get/Separation eq
+                                       {
+                                       exch begin
+                                       ColorSpace 1 get dup/None ne exch/All ne and
+                                               {
+                                               ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and
+                                                       {
+                                                       ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
+                                                               {
+                                                               /ColorSpace
+                                                                       [
+                                                                       /Separation
+                                                                       ColorSpace 1 get
+                                                                       /DeviceGray
+                                                                               [
+                                                                               ColorSpace 3 get/exec cvx
+                                                                               4 AGMCORE_plate_ndx sub -1/roll cvx
+                                                                               4 1/roll cvx
+                                                                               3[/pop cvx]cvx/repeat cvx
+                                                                               1/exch cvx/sub cvx
+                                                                               ]cvx                                                                    
+                                                                       ]def
+                                                               }{
+                                                               AGMCORE_report_unsupported_color_space
+                                                               AGMCORE_black_plate not
+                                                                       {
+                                                                       currentdict 0 false AGMCORE_separateShading
+                                                                       }if
+                                                               }ifelse
+                                                       }{
+                                                       currentdict ColorSpace 1 get AGMCORE_IsCurrentColor
+                                                       0 exch 
+                                                       dup not currentoverprint and
+                                                               {/AGMCORE_ignoreshade true def}if
+                                                       AGMCORE_separateShading
+                                                       }ifelse 
+                                               }if                     
+                                       currentdict
+                                       end exch
+                                       }if
+                               dup 0 get/DeviceN eq
+                                       {
+                                       exch begin
+                                       ColorSpace 1 get convert_to_process
+                                               {
+                                               ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq 
+                                                       {
+                                                       /ColorSpace
+                                                               [
+                                                               /DeviceN
+                                                               ColorSpace 1 get
+                                                               /DeviceGray
+                                                                       [
+                                                                       ColorSpace 3 get/exec cvx
+                                                                       4 AGMCORE_plate_ndx sub -1/roll cvx
+                                                                       4 1/roll cvx
+                                                                       3[/pop cvx]cvx/repeat cvx
+                                                                       1/exch cvx/sub cvx
+                                                                       ]cvx                                                                    
+                                                               ]def
+                                                       }{
+                                                       AGMCORE_report_unsupported_color_space
+                                                       AGMCORE_black_plate not
+                                                               {
+                                                               currentdict 0 false AGMCORE_separateShading
+                                                               /ColorSpace[/DeviceGray]def
+                                                               }if
+                                                       }ifelse
+                                               }{
+                                               currentdict
+                                               false -1 ColorSpace 1 get
+                                                       {
+                                                       AGMCORE_IsCurrentColor
+                                                               {
+                                                               1 add
+                                                               exch pop true exch exit
+                                                               }if
+                                                       1 add
+                                                       }forall
+                                               exch 
+                                               dup not currentoverprint and
+                                                       {/AGMCORE_ignoreshade true def}if
+                                               AGMCORE_separateShading
+                                               }ifelse
+                                       currentdict
+                                       end exch
+                                       }if
+                               dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not
+                                       {
+                                       exch begin
+                                       ColorSpace dup type/arraytype eq
+                                               {0 get}if
+                                       /DeviceGray ne
+                                               {
+                                               AGMCORE_report_unsupported_color_space
+                                               AGMCORE_black_plate not
+                                                       {
+                                                       ColorSpace 0 get/CIEBasedA eq
+                                                               {
+                                                               /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def
+                                                               }if
+                                                       ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or
+                                                               {
+                                                               /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def
+                                                               }if
+                                                       ColorSpace 0 get/CIEBasedDEFG eq
+                                                               {
+                                                               /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def
+                                                               }if
+                                                       currentdict 0 false AGMCORE_separateShading
+                                                       }if
+                                               }if
+                                       currentdict
+                                       end exch
+                                       }if
+                               pop
+                               dup/AGMCORE_ignoreshade known
+                                       {
+                                       begin
+                                       /ColorSpace[/Separation(None)/DeviceGray{}]def
+                                       currentdict end
+                                       }if
+                               }def
+                       /shfill
+                               {
+                               AGMCORE_separateShadingDict 
+                               dup/AGMCORE_ignoreshade known
+                                       {pop}
+                                       {AGMCORE_&sysshfill}ifelse
+                               }def
+                       /makepattern
+                               {
+                               exch
+                               dup/PatternType get 2 eq
+                                       {
+                                       clonedict
+                                       begin
+                                       /Shading Shading AGMCORE_separateShadingDict def
+                                       Shading/AGMCORE_ignoreshade known
+                                       currentdict end exch
+                                       {pop<</PatternType 1/PaintProc{pop}/BBox[0 0 1 1]/XStep 1/YStep 1/PaintType 1/TilingType 3>>}if
+                                       exch AGMCORE_&sysmakepattern
+                                       }{
+                                       exch AGMCORE_&usrmakepattern
+                                       }ifelse
+                               }def
+               }if
+       }if
+       AGMCORE_in_rip_sep{
+               /setcustomcolor
+               {
+                       exch aload pop
+                       dup 7 1 roll inRip_spot_has_ink not     {
+                               4{4 index mul 4 1 roll}
+                               repeat
+                               /DeviceCMYK setcolorspace
+                               6 -2 roll pop pop
+                       }{
+                               //Adobe_AGM_Core begin
+                                       /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf
+                               end
+                               [/Separation 4 -1 roll/DeviceCMYK
+                               {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul}
+                               ]
+                               setcolorspace
+                       }ifelse
+                       setcolor
+               }ndf
+               /setseparationgray
+               {
+                       [/Separation(All)/DeviceGray{}]setcolorspace_opt
+                       1 exch sub setcolor
+               }ndf
+       }{
+               /setseparationgray
+               {
+                       AGMCORE_&setgray
+               }ndf
+       }ifelse
+       /findcmykcustomcolor
+       {
+               5 makereadonlyarray
+       }ndf
+       /setcustomcolor
+       {
+               exch aload pop pop
+               4{4 index mul 4 1 roll}repeat
+               setcmykcolor pop
+       }ndf
+       /has_color
+               /colorimage where{
+                       AGMCORE_producing_seps{
+                               pop true
+                       }{
+                               systemdict eq
+                       }ifelse
+               }{
+                       false
+               }ifelse
+       def
+       /map_index
+       {
+               1 index mul exch getinterval{255 div}forall
+       }bdf
+       /map_indexed_devn
+       {
+               Lookup Names length 3 -1 roll cvi map_index
+       }bdf
+       /n_color_components
+       {
+               base_colorspace_type
+               dup/DeviceGray eq{
+                       pop 1
+               }{
+                       /DeviceCMYK eq{
+                               4
+                       }{
+                               3
+                       }ifelse
+               }ifelse
+       }bdf
+       level2{
+               /mo/moveto ldf
+               /li/lineto ldf
+               /cv/curveto ldf
+               /knockout_unitsq
+               {
+                       1 setgray
+                       0 0 1 1 rectfill
+               }def
+               level2/setcolorspace AGMCORE_key_known not and{
+                       /AGMCORE_&&&setcolorspace/setcolorspace ldf
+                       /AGMCORE_ReplaceMappedColor
+                       {
+                               dup type dup/arraytype eq exch/packedarraytype eq or
+                               {
+                                       /AGMCORE_SpotAliasAry2 where{
+                                               begin
+                                               dup 0 get dup/Separation eq
+                                               {
+                                                       pop
+                                                       dup length array copy
+                                                       dup dup 1 get
+                                                       current_spot_alias
+                                                       {
+                                                               dup map_alias
+                                                               {
+                                                                       false set_spot_alias
+                                                                       dup 1 exch setsepcolorspace
+                                                                       true set_spot_alias
+                                                                       begin
+                                                                       /sep_colorspace_dict currentdict AGMCORE_gput
+                                                                       pop pop pop
+                                                                       [
+                                                                               /Separation Name 
+                                                                               CSA map_csa
+                                                                               MappedCSA 
+                                                                               /sep_colorspace_proc load
+                                                                       ]
+                                                                       dup Name
+                                                                       end
+                                                               }if
+                                                       }if
+                                                       map_reserved_ink_name 1 xpt
+                                               }{
+                                                       /DeviceN eq 
+                                                       {
+                                                               dup length array copy
+                                                               dup dup 1 get[
+                                                                       exch{
+                                                                               current_spot_alias{
+                                                                                       dup map_alias{
+                                                                                               /Name get exch pop
+                                                                                       }if
+                                                                               }if
+                                                                               map_reserved_ink_name
+                                                                       }forall 
+                                                               ]1 xpt
+                                                       }if
+                                               }ifelse
+                                               end
+                                       }if
+                               }if
+                       }def
+                       /setcolorspace
+                       {
+                               dup type dup/arraytype eq exch/packedarraytype eq or
+                               {
+                                       dup 0 get/Indexed eq
+                                       {
+                                               AGMCORE_distilling
+                                               {
+                                                       /PhotoshopDuotoneList where
+                                                       {
+                                                               pop false
+                                                       }{
+                                                               true
+                                                       }ifelse
+                                               }{
+                                                       true
+                                               }ifelse
+                                               {
+                                                       aload pop 3 -1 roll
+                                                       AGMCORE_ReplaceMappedColor
+                                                       3 1 roll 4 array astore
+                                               }if
+                                       }{
+                                               AGMCORE_ReplaceMappedColor
+                                       }ifelse
+                               }if
+                               DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if
+                       }def
+               }if     
+       }{
+               /adj
+               {
+                       currentstrokeadjust{
+                               transform
+                               0.25 sub round 0.25 add exch
+                               0.25 sub round 0.25 add exch
+                               itransform
+                       }if
+               }def
+               /mo{
+                       adj moveto
+               }def
+               /li{
+                       adj lineto
+               }def
+               /cv{
+                       6 2 roll adj
+                       6 2 roll adj
+                       6 2 roll adj curveto
+               }def
+               /knockout_unitsq
+               {
+                       1 setgray
+                       8 8 1[8 0 0 8 0 0]{<ffffffffffffffff>}image
+               }def
+               /currentstrokeadjust{
+                       /currentstrokeadjust AGMCORE_gget
+               }def
+               /setstrokeadjust{
+                       /currentstrokeadjust exch AGMCORE_gput
+               }def
+               /setcolorspace
+               {
+                       /currentcolorspace exch AGMCORE_gput
+               }def
+               /currentcolorspace
+               {
+                       /currentcolorspace AGMCORE_gget
+               }def
+               /setcolor_devicecolor
+               {
+                       base_colorspace_type
+                       dup/DeviceGray eq{
+                               pop setgray
+                       }{
+                               /DeviceCMYK eq{
+                                       setcmykcolor
+                               }{
+                                       setrgbcolor
+                               }ifelse
+                       }ifelse
+               }def
+               /setcolor
+               {
+                       currentcolorspace 0 get
+                       dup/DeviceGray ne{
+                               dup/DeviceCMYK ne{
+                                       dup/DeviceRGB ne{
+                                               dup/Separation eq{
+                                                       pop
+                                                       currentcolorspace 3 gx
+                                                       currentcolorspace 2 get
+                                               }{
+                                                       dup/Indexed eq{
+                                                               pop
+                                                               currentcolorspace 3 get dup type/stringtype eq{
+                                                                       currentcolorspace 1 get n_color_components
+                                                                       3 -1 roll map_index
+                                                               }{
+                                                                       exec
+                                                               }ifelse
+                                                               currentcolorspace 1 get
+                                                       }{
+                                                               /AGMCORE_cur_err/AGMCORE_invalid_color_space def
+                                                               AGMCORE_invalid_color_space
+                                                       }ifelse
+                                               }ifelse
+                                       }if
+                               }if
+                       }if
+                       setcolor_devicecolor
+               }def
+       }ifelse
+       /sop/setoverprint ldf
+       /lw/setlinewidth ldf
+       /lc/setlinecap ldf
+       /lj/setlinejoin ldf
+       /ml/setmiterlimit ldf
+       /dsh/setdash ldf
+       /sadj/setstrokeadjust ldf
+       /gry/setgray ldf
+       /rgb/setrgbcolor ldf
+       /cmyk[
+               /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx
+               /setcmykcolor load dup type/operatortype ne{/exec cvx}if
+       ]cvx bdf
+       level3 AGMCORE_host_sep not and{
+               /nzopmsc{
+                       6 dict begin
+                       /kk exch def
+                       /yy exch def
+                       /mm exch def
+                       /cc exch def
+                       /sum 0 def
+                       cc 0 ne{/sum sum 2#1000 or def cc}if
+                       mm 0 ne{/sum sum 2#0100 or def mm}if
+                       yy 0 ne{/sum sum 2#0010 or def yy}if
+                       kk 0 ne{/sum sum 2#0001 or def kk}if
+                       AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace
+                       sum 0 eq{0}if
+                       end
+                       setcolor
+               }bdf
+       }{
+               /nzopmsc/cmyk ldf
+       }ifelse
+       /sep/setsepcolor ldf
+       /devn/setdevicencolor ldf
+       /idx/setindexedcolor ldf
+       /colr/setcolor ldf
+       /csacrd/set_csa_crd ldf
+       /sepcs/setsepcolorspace ldf
+       /devncs/setdevicencolorspace ldf
+       /idxcs/setindexedcolorspace ldf
+       /cp/closepath ldf
+       /clp/clp_npth ldf
+       /eclp/eoclp_npth ldf
+       /f/fill ldf
+       /ef/eofill ldf
+       /@/stroke ldf
+       /nclp/npth_clp ldf
+       /gset/graphic_setup ldf
+       /gcln/graphic_cleanup ldf
+       /ct/concat ldf
+       /cf/currentfile ldf
+       /fl/filter ldf
+       /rs/readstring ldf
+       /AGMCORE_def_ht currenthalftone def
+       /clonedict Adobe_AGM_Utils begin/clonedict load end def
+       /clonearray Adobe_AGM_Utils begin/clonearray load end def
+       currentdict{
+               dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
+                       bind
+               }if
+               def
+       }forall
+       /getrampcolor
+       {
+               /indx exch def
+               0 1 NumComp 1 sub
+               {
+                       dup
+                       Samples exch get
+                       dup type/stringtype eq{indx get}if
+                       exch
+                       Scaling exch get aload pop
+                       3 1 roll
+                       mul add
+               }for
+               ColorSpaceFamily/Separation eq 
+               {sep}
+               {
+                       ColorSpaceFamily/DeviceN eq
+                       {devn}{setcolor}ifelse
+               }ifelse
+       }bdf
+       /sssetbackground{
+               aload pop 
+               ColorSpaceFamily/Separation eq 
+               {sep}
+               {
+                       ColorSpaceFamily/DeviceN eq
+                       {devn}{setcolor}ifelse
+               }ifelse 
+       }bdf
+       /RadialShade
+       {
+               40 dict begin
+               /ColorSpaceFamily xdf
+               /background xdf
+               /ext1 xdf
+               /ext0 xdf
+               /BBox xdf
+               /r2 xdf
+               /c2y xdf
+               /c2x xdf
+               /r1 xdf
+               /c1y xdf
+               /c1x xdf
+               /rampdict xdf
+               /setinkoverprint where{pop/setinkoverprint{pop}def}if
+               gsave
+               BBox length 0 gt
+               {
+                       np
+                       BBox 0 get BBox 1 get moveto
+                       BBox 2 get BBox 0 get sub 0 rlineto
+                       0 BBox 3 get BBox 1 get sub rlineto
+                       BBox 2 get BBox 0 get sub neg 0 rlineto
+                       closepath
+                       clip
+                       np
+               }if
+               c1x c2x eq
+               {
+                       c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse
+               }{
+                       /slope c2y c1y sub c2x c1x sub div def
+                       /theta slope 1 atan def
+                       c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if
+                       c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if
+               }ifelse
+               gsave
+               clippath
+               c1x c1y translate
+               theta rotate
+               -90 rotate
+               {pathbbox}stopped
+               {0 0 0 0}if
+               /yMax xdf
+               /xMax xdf
+               /yMin xdf
+               /xMin xdf
+               grestore
+               xMax xMin eq yMax yMin eq or
+               {
+                       grestore
+                       end
+               }{
+                       /max{2 copy gt{pop}{exch pop}ifelse}bdf
+                       /min{2 copy lt{pop}{exch pop}ifelse}bdf
+                       rampdict begin
+                       40 dict begin
+                       background length 0 gt{background sssetbackground gsave clippath fill grestore}if
+                       gsave
+                       c1x c1y translate
+                       theta rotate
+                       -90 rotate
+                       /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def
+                       /c1y 0 def
+                       /c1x 0 def
+                       /c2x 0 def
+                       ext0
+                       {
+                               0 getrampcolor
+                               c2y r2 add r1 sub 0.0001 lt
+                               {
+                                       c1x c1y r1 360 0 arcn
+                                       pathbbox
+                                       /aymax exch def
+                                       /axmax exch def
+                                       /aymin exch def
+                                       /axmin exch def
+                                       /bxMin xMin axmin min def
+                                       /byMin yMin aymin min def
+                                       /bxMax xMax axmax max def
+                                       /byMax yMax aymax max def
+                                       bxMin byMin moveto
+                                       bxMax byMin lineto
+                                       bxMax byMax lineto
+                                       bxMin byMax lineto
+                                       bxMin byMin lineto
+                                       eofill
+                               }{
+                                       c2y r1 add r2 le
+                                       {
+                                               c1x c1y r1 0 360 arc
+                                               fill
+                                       }
+                                       {
+                                               c2x c2y r2 0 360 arc fill
+                                               r1 r2 eq
+                                               {
+                                                       /p1x r1 neg def
+                                                       /p1y c1y def
+                                                       /p2x r1 def
+                                                       /p2y c1y def
+                                                       p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto
+                                                       fill
+                                               }{
+                                                       /AA r2 r1 sub c2y div def
+                                                       AA -1 eq
+                                                       {/theta 89.99 def}
+                                                       {/theta AA 1 AA dup mul sub sqrt div 1 atan def}
+                                                       ifelse
+                                                       /SS1 90 theta add dup sin exch cos div def
+                                                       /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
+                                                       /p1y p1x SS1 div neg def
+                                                       /SS2 90 theta sub dup sin exch cos div def
+                                                       /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
+                                                       /p2y p2x SS2 div neg def
+                                                       r1 r2 gt
+                                                       {
+                                                               /L1maxX p1x yMin p1y sub SS1 div add def
+                                                               /L2maxX p2x yMin p2y sub SS2 div add def
+                                                       }{
+                                                               /L1maxX 0 def
+                                                               /L2maxX 0 def
+                                                       }ifelse
+                                                       p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
+                                                       L1maxX L1maxX p1x sub SS1 mul p1y add lineto
+                                                       fill
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }if
+               c1x c2x sub dup mul
+               c1y c2y sub dup mul
+               add 0.5 exp
+               0 dtransform
+               dup mul exch dup mul add 0.5 exp 72 div
+               0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+               72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+               1 index 1 index lt{exch}if pop
+               /hires xdf
+               hires mul
+               /numpix xdf
+               /numsteps NumSamples def
+               /rampIndxInc 1 def
+               /subsampling false def
+               numpix 0 ne
+               {
+                       NumSamples numpix div 0.5 gt
+                       {
+                               /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
+                               /rampIndxInc NumSamples 1 sub numsteps div def
+                               /subsampling true def
+                       }if
+               }if
+               /xInc c2x c1x sub numsteps div def
+               /yInc c2y c1y sub numsteps div def
+               /rInc r2 r1 sub numsteps div def
+               /cx c1x def
+               /cy c1y def
+               /radius r1 def
+               np
+               xInc 0 eq yInc 0 eq rInc 0 eq and and
+               {
+                       0 getrampcolor
+                       cx cy radius 0 360 arc
+                       stroke
+                       NumSamples 1 sub getrampcolor
+                       cx cy radius 72 hires div add 0 360 arc
+                       0 setlinewidth
+                       stroke
+               }{
+                       0
+                       numsteps
+                       {
+                               dup
+                               subsampling{round cvi}if
+                               getrampcolor
+                               cx cy radius 0 360 arc
+                               /cx cx xInc add def
+                               /cy cy yInc add def
+                               /radius radius rInc add def
+                               cx cy radius 360 0 arcn
+                               eofill
+                               rampIndxInc add
+                       }repeat
+                       pop
+               }ifelse
+               ext1
+               {
+                       c2y r2 add r1 lt
+                       {
+                               c2x c2y r2 0 360 arc
+                               fill
+                       }{
+                               c2y r1 add r2 sub 0.0001 le
+                               {
+                                       c2x c2y r2 360 0 arcn
+                                       pathbbox
+                                       /aymax exch def
+                                       /axmax exch def
+                                       /aymin exch def
+                                       /axmin exch def
+                                       /bxMin xMin axmin min def
+                                       /byMin yMin aymin min def
+                                       /bxMax xMax axmax max def
+                                       /byMax yMax aymax max def
+                                       bxMin byMin moveto
+                                       bxMax byMin lineto
+                                       bxMax byMax lineto
+                                       bxMin byMax lineto
+                                       bxMin byMin lineto
+                                       eofill
+                               }{
+                                       c2x c2y r2 0 360 arc fill
+                                       r1 r2 eq
+                                       {
+                                               /p1x r2 neg def
+                                               /p1y c2y def
+                                               /p2x r2 def
+                                               /p2y c2y def
+                                               p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto
+                                               fill
+                                       }{
+                                               /AA r2 r1 sub c2y div def
+                                               AA -1 eq
+                                               {/theta 89.99 def}
+                                               {/theta AA 1 AA dup mul sub sqrt div 1 atan def}
+                                               ifelse
+                                               /SS1 90 theta add dup sin exch cos div def
+                                               /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def
+                                               /p1y c2y p1x SS1 div sub def
+                                               /SS2 90 theta sub dup sin exch cos div def
+                                               /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def
+                                               /p2y c2y p2x SS2 div sub def
+                                               r1 r2 lt
+                                               {
+                                                       /L1maxX p1x yMax p1y sub SS1 div add def
+                                                       /L2maxX p2x yMax p2y sub SS2 div add def
+                                               }{
+                                                       /L1maxX 0 def
+                                                       /L2maxX 0 def
+                                               }ifelse
+                                               p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto
+                                               L1maxX L1maxX p1x sub SS1 mul p1y add lineto
+                                               fill
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }if
+               grestore
+               grestore
+               end
+               end
+               end
+               }ifelse
+       }bdf
+       /GenStrips
+       {
+               40 dict begin
+               /ColorSpaceFamily xdf
+               /background xdf
+               /ext1 xdf
+               /ext0 xdf
+               /BBox xdf
+               /y2 xdf
+               /x2 xdf
+               /y1 xdf
+               /x1 xdf
+               /rampdict xdf
+               /setinkoverprint where{pop/setinkoverprint{pop}def}if
+               gsave
+               BBox length 0 gt
+               {
+                       np
+                       BBox 0 get BBox 1 get moveto
+                       BBox 2 get BBox 0 get sub 0 rlineto
+                       0 BBox 3 get BBox 1 get sub rlineto
+                       BBox 2 get BBox 0 get sub neg 0 rlineto
+                       closepath
+                       clip
+                       np
+               }if
+               x1 x2 eq
+               {
+                       y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse
+               }{
+                       /slope y2 y1 sub x2 x1 sub div def
+                       /theta slope 1 atan def
+                       x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if
+                       x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if
+               }
+               ifelse
+               gsave
+               clippath
+               x1 y1 translate
+               theta rotate
+               {pathbbox}stopped
+               {0 0 0 0}if
+               /yMax exch def
+               /xMax exch def
+               /yMin exch def
+               /xMin exch def
+               grestore
+               xMax xMin eq yMax yMin eq or
+               {
+                       grestore
+                       end
+               }{
+                       rampdict begin
+                       20 dict begin
+                       background length 0 gt{background sssetbackground gsave clippath fill grestore}if
+                       gsave
+                       x1 y1 translate
+                       theta rotate
+                       /xStart 0 def
+                       /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def
+                       /ySpan yMax yMin sub def
+                       /numsteps NumSamples def
+                       /rampIndxInc 1 def
+                       /subsampling false def
+                       xStart 0 transform
+                       xEnd 0 transform
+                       3 -1 roll
+                       sub dup mul
+                       3 1 roll
+                       sub dup mul
+                       add 0.5 exp 72 div
+                       0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+                       72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt
+                       1 index 1 index lt{exch}if pop
+                       mul
+                       /numpix xdf
+                       numpix 0 ne
+                       {
+                               NumSamples numpix div 0.5 gt
+                               {
+                                       /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def
+                                       /rampIndxInc NumSamples 1 sub numsteps div def
+                                       /subsampling true def
+                               }if
+                       }if
+                       ext0
+                       {
+                               0 getrampcolor
+                               xMin xStart lt
+                               {
+                                       xMin yMin xMin neg ySpan rectfill
+                               }if
+                       }if
+                       /xInc xEnd xStart sub numsteps div def
+                       /x xStart def
+                       0
+                       numsteps
+                       {
+                               dup
+                               subsampling{round cvi}if
+                               getrampcolor
+                               x yMin xInc ySpan rectfill
+                               /x x xInc add def
+                               rampIndxInc add
+                       }repeat
+                       pop
+                       ext1{
+                               xMax xEnd gt
+                               {
+                                       xEnd yMin xMax xEnd sub ySpan rectfill
+                               }if
+                       }if
+                       grestore
+                       grestore
+                       end
+                       end
+                       end
+               }ifelse
+       }bdf
+}def
+/pt
+{
+       end
+}def
+/dt{
+}def
+/pgsv{
+       //Adobe_AGM_Core/AGMCORE_save save put
+}def
+/pgrs{
+       //Adobe_AGM_Core/AGMCORE_save get restore
+}def
+systemdict/findcolorrendering known{
+       /findcolorrendering systemdict/findcolorrendering get def
+}if
+systemdict/setcolorrendering known{
+       /setcolorrendering systemdict/setcolorrendering get def
+}if
+/test_cmyk_color_plate
+{
+       gsave
+       setcmykcolor currentgray 1 ne
+       grestore
+}def
+/inRip_spot_has_ink
+{
+       dup//Adobe_AGM_Core/AGMCORE_name xddf
+       convert_spot_to_process not
+}def
+/map255_to_range
+{
+       1 index sub
+       3 -1 roll 255 div mul add
+}def
+/set_csa_crd
+{
+       /sep_colorspace_dict null AGMCORE_gput
+       begin
+               CSA get_csa_by_name setcolorspace_opt
+               set_crd
+       end
+}
+def
+/map_csa
+{
+       currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse
+       {pop}{get_csa_by_name/MappedCSA xdf}ifelse
+}def
+/setsepcolor
+{
+       /sep_colorspace_dict AGMCORE_gget begin
+               dup/sep_tint exch AGMCORE_gput
+               TintProc
+       end
+}def
+/setdevicencolor
+{
+       /devicen_colorspace_dict AGMCORE_gget begin
+               Names length copy
+               Names length 1 sub -1 0
+               {
+                       /devicen_tints AGMCORE_gget 3 1 roll xpt
+               }for
+               TintProc
+       end
+}def
+/sep_colorspace_proc
+{
+       /AGMCORE_tmp exch store
+       /sep_colorspace_dict AGMCORE_gget begin
+       currentdict/Components known{
+               Components aload pop 
+               TintMethod/Lab eq{
+                       2{AGMCORE_tmp mul NComponents 1 roll}repeat
+                       LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll
+               }{
+                       TintMethod/Subtractive eq{
+                               NComponents{
+                                       AGMCORE_tmp mul NComponents 1 roll
+                               }repeat
+                       }{
+                               NComponents{
+                                       1 sub AGMCORE_tmp mul 1 add NComponents 1 roll
+                               }repeat
+                       }ifelse
+               }ifelse
+       }{
+               ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get
+               aload pop
+       }ifelse
+       end
+}def
+/sep_colorspace_gray_proc
+{
+       /AGMCORE_tmp exch store
+       /sep_colorspace_dict AGMCORE_gget begin
+       GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get
+       end
+}def
+/sep_proc_name
+{
+       dup 0 get 
+       dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{
+               pop[/DeviceGray]
+               /sep_colorspace_gray_proc
+       }{
+               /sep_colorspace_proc
+       }ifelse
+}def
+/setsepcolorspace
+{
+       current_spot_alias{
+               dup begin
+                       Name map_alias{
+                               exch pop
+                       }if
+               end
+       }if
+       dup/sep_colorspace_dict exch AGMCORE_gput
+       begin
+       CSA map_csa
+       /AGMCORE_sep_special Name dup()eq exch(All)eq or store
+       AGMCORE_avoid_L2_sep_space{
+               [/Indexed MappedCSA sep_proc_name 255 exch 
+                       {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx 
+               ]setcolorspace_opt
+               /TintProc{
+                       255 mul round cvi setcolor
+               }bdf
+       }{
+               MappedCSA 0 get/DeviceCMYK eq 
+               currentdict/Components known and 
+               AGMCORE_sep_special not and{
+                       /TintProc[
+                               Components aload pop Name findcmykcustomcolor 
+                               /exch cvx/setcustomcolor cvx
+                       ]cvx bdf
+               }{
+                       AGMCORE_host_sep Name(All)eq and{
+                               /TintProc{
+                                       1 exch sub setseparationgray 
+                               }bdf
+                       }{
+                               AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and 
+                               AGMCORE_host_sep or
+                               Name()eq and{
+                                       /TintProc[
+                                               MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{
+                                                       cvx/setcmykcolor cvx
+                                               }{
+                                                       cvx/setgray cvx
+                                               }ifelse
+                                       ]cvx bdf
+                               }{
+                                       AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{
+                                               /TintProc[
+                                                       /dup cvx
+                                                       MappedCSA sep_proc_name cvx exch
+                                                       0 get/DeviceGray eq{
+                                                               1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx
+                                                       }if
+                                                       /Name cvx/findcmykcustomcolor cvx/exch cvx
+                                                       AGMCORE_host_sep{
+                                                               AGMCORE_is_cmyk_sep
+                                                               /Name cvx 
+                                                               /AGMCORE_IsSeparationAProcessColor load/exec cvx
+                                                               /not cvx/and cvx 
+                                                       }{
+                                                               Name inRip_spot_has_ink not
+                                                       }ifelse
+                                                       [
+                                                               /pop cvx 1
+                                                       ]cvx/if cvx
+                                                       /setcustomcolor cvx
+                                               ]cvx bdf
+                                       }{
+                                               /TintProc{setcolor}bdf
+                                               [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+       }ifelse
+       set_crd
+       setsepcolor
+       end
+}def
+/additive_blend
+{
+       3 dict begin
+       /numarrays xdf
+       /numcolors xdf
+       0 1 numcolors 1 sub
+               {
+               /c1 xdf
+               1
+               0 1 numarrays 1 sub
+                       {
+                       1 exch add/index cvx
+                       c1/get cvx/mul cvx
+                       }for
+               numarrays 1 add 1/roll cvx 
+               }for
+       numarrays[/pop cvx]cvx/repeat cvx
+       end
+}def
+/subtractive_blend
+{
+       3 dict begin
+       /numarrays xdf
+       /numcolors xdf
+       0 1 numcolors 1 sub
+               {
+               /c1 xdf
+               1 1
+               0 1 numarrays 1 sub
+                       {
+                       1 3 3 -1 roll add/index cvx 
+                       c1/get cvx/sub cvx/mul cvx
+                       }for
+               /sub cvx
+               numarrays 1 add 1/roll cvx
+               }for
+       numarrays[/pop cvx]cvx/repeat cvx
+       end
+}def
+/exec_tint_transform
+{
+       /TintProc[
+               /TintTransform cvx/setcolor cvx
+       ]cvx bdf
+       MappedCSA setcolorspace_opt
+}bdf
+/devn_makecustomcolor
+{
+       2 dict begin
+       /names_index xdf
+       /Names xdf
+       1 1 1 1 Names names_index get findcmykcustomcolor
+       /devicen_tints AGMCORE_gget names_index get setcustomcolor
+       Names length{pop}repeat
+       end
+}bdf
+/setdevicencolorspace
+{
+       dup/AliasedColorants known{false}{true}ifelse 
+       current_spot_alias and{
+               7 dict begin
+               /names_index 0 def
+               dup/names_len exch/Names get length def
+               /new_names names_len array def
+               /new_LookupTables names_len array def
+               /alias_cnt 0 def
+               dup/Names get
+               {
+                       dup map_alias{
+                               exch pop
+                               dup/ColorLookup known{
+                                       dup begin
+                                       new_LookupTables names_index ColorLookup put
+                                       end
+                               }{
+                                       dup/Components known{
+                                               dup begin
+                                               new_LookupTables names_index Components put
+                                               end
+                                       }{
+                                               dup begin
+                                               new_LookupTables names_index[null null null null]put
+                                               end
+                                       }ifelse
+                               }ifelse
+                               new_names names_index 3 -1 roll/Name get put
+                               /alias_cnt alias_cnt 1 add def 
+                       }{
+                               /name xdf                               
+                               new_names names_index name put
+                               dup/LookupTables known{
+                                       dup begin
+                                       new_LookupTables names_index LookupTables names_index get put
+                                       end
+                               }{
+                                       dup begin
+                                       new_LookupTables names_index[null null null null]put
+                                       end
+                               }ifelse
+                       }ifelse
+                       /names_index names_index 1 add def 
+               }forall
+               alias_cnt 0 gt{
+                       /AliasedColorants true def
+                       /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def
+                       0 1 names_len 1 sub{
+                               /names_index xdf
+                               new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{
+                                       /AliasedColorants false def
+                                       exit
+                               }{
+                                       new_LookupTables names_index get 0 get null eq{
+                                               dup/Names get names_index get/name xdf
+                                               name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq
+                                               or or or not{
+                                                       /AliasedColorants false def
+                                                       exit
+                                               }if
+                                       }if
+                               }ifelse
+                       }for
+                       lut_entry_len 1 eq{
+                               /AliasedColorants false def
+                       }if
+                       AliasedColorants{
+                               dup begin
+                               /Names new_names def
+                               /LookupTables new_LookupTables def
+                               /AliasedColorants true def
+                               /NComponents lut_entry_len def
+                               /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def
+                               /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def
+                               currentdict/TTTablesIdx known not{
+                                       /TTTablesIdx -1 def
+                               }if
+                               end
+                       }if
+               }if
+               end
+       }if
+       dup/devicen_colorspace_dict exch AGMCORE_gput
+       begin
+       currentdict/AliasedColorants known{
+               AliasedColorants
+       }{
+               false
+       }ifelse
+       dup not{
+               CSA map_csa
+       }if
+       /TintTransform load type/nulltype eq or{
+               /TintTransform[
+                       0 1 Names length 1 sub
+                               {
+                               /TTTablesIdx TTTablesIdx 1 add def
+                               dup LookupTables exch get dup 0 get null eq
+                                       {
+                                       1 index
+                                       Names exch get
+                                       dup(Cyan)eq
+                                               {
+                                               pop exch
+                                               LookupTables length exch sub
+                                               /index cvx
+                                               0 0 0
+                                               }
+                                               {
+                                               dup(Magenta)eq
+                                                       {
+                                                       pop exch
+                                                       LookupTables length exch sub
+                                                       /index cvx
+                                                       0/exch cvx 0 0
+                                                       }{
+                                                       (Yellow)eq
+                                                               {
+                                                               exch
+                                                               LookupTables length exch sub
+                                                               /index cvx
+                                                               0 0 3 -1/roll cvx 0
+                                                               }{
+                                                               exch
+                                                               LookupTables length exch sub
+                                                               /index cvx
+                                                               0 0 0 4 -1/roll cvx
+                                                               }ifelse
+                                                       }ifelse
+                                               }ifelse
+                                       5 -1/roll cvx/astore cvx
+                                       }{
+                                       dup length 1 sub
+                                       LookupTables length 4 -1 roll sub 1 add
+                                       /index cvx/mul cvx/round cvx/cvi cvx/get cvx
+                                       }ifelse
+                                       Names length TTTablesIdx add 1 add 1/roll cvx
+                               }for
+                       Names length[/pop cvx]cvx/repeat cvx
+                       NComponents Names length
+                       TintMethod/Subtractive eq
+                               {
+                               subtractive_blend
+                               }{
+                               additive_blend
+                               }ifelse
+               ]cvx bdf
+       }if
+       AGMCORE_host_sep{
+               Names convert_to_process{
+                       exec_tint_transform
+               }
+               {       
+                       currentdict/AliasedColorants known{
+                               AliasedColorants not
+                       }{
+                               false
+                       }ifelse
+                       5 dict begin
+                       /AvoidAliasedColorants xdf
+                       /painted? false def
+                       /names_index 0 def
+                       /names_len Names length def
+                       AvoidAliasedColorants{
+                               /currentspotalias current_spot_alias def
+                               false set_spot_alias
+                       }if
+                       Names{
+                               AGMCORE_is_cmyk_sep{
+                                       dup(Cyan)eq AGMCORE_cyan_plate and exch
+                                       dup(Magenta)eq AGMCORE_magenta_plate and exch
+                                       dup(Yellow)eq AGMCORE_yellow_plate and exch
+                                       (Black)eq AGMCORE_black_plate and or or or{
+                                               /devicen_colorspace_dict AGMCORE_gget/TintProc[
+                                                       Names names_index/devn_makecustomcolor cvx
+                                               ]cvx ddf
+                                               /painted? true def
+                                       }if
+                                       painted?{exit}if
+                               }{
+                                       0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{
+                                       /devicen_colorspace_dict AGMCORE_gget/TintProc[
+                                               Names names_index/devn_makecustomcolor cvx
+                                       ]cvx ddf
+                                       /painted? true def
+                                       exit
+                                       }if
+                               }ifelse
+                               /names_index names_index 1 add def
+                       }forall
+                       AvoidAliasedColorants{
+                               currentspotalias set_spot_alias
+                       }if
+                       painted?{
+                               /devicen_colorspace_dict AGMCORE_gget/names_index names_index put
+                       }{
+                               /devicen_colorspace_dict AGMCORE_gget/TintProc[
+                                       names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx
+                                       0 0 0 0/setcmykcolor cvx
+                               ]cvx ddf
+                       }ifelse
+                       end
+               }ifelse
+       }
+       {
+               AGMCORE_in_rip_sep{
+                       Names convert_to_process not
+               }{
+                       level3
+               }ifelse
+               {
+                       [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt
+                       /TintProc level3 not AGMCORE_in_rip_sep and{
+                               [
+                                       Names/length cvx[/pop cvx]cvx/repeat cvx
+                               ]cvx bdf
+                       }{
+                               {setcolor}bdf
+                       }ifelse
+               }{
+                       exec_tint_transform
+               }ifelse
+       }ifelse
+       set_crd
+       /AliasedColorants false def
+       end
+}def
+/setindexedcolorspace
+{
+       dup/indexed_colorspace_dict exch AGMCORE_gput
+       begin
+               currentdict/CSDBase known{
+                       CSDBase/CSD get_res begin
+                       currentdict/Names known{
+                               currentdict devncs
+                       }{
+                               1 currentdict sepcs
+                       }ifelse
+                       AGMCORE_host_sep{
+                               4 dict begin
+                               /compCnt/Names where{pop Names length}{1}ifelse def
+                               /NewLookup HiVal 1 add string def
+                               0 1 HiVal{
+                                       /tableIndex xdf
+                                       Lookup dup type/stringtype eq{
+                                               compCnt tableIndex map_index
+                                       }{
+                                               exec
+                                       }ifelse
+                                       /Names where{
+                                               pop setdevicencolor
+                                       }{
+                                               setsepcolor
+                                       }ifelse
+                                       currentgray
+                                       tableIndex exch
+                                       255 mul cvi 
+                                       NewLookup 3 1 roll put
+                               }for
+                               [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt
+                               end
+                       }{
+                               level3
+                               {
+                                       currentdict/Names known{
+                                               [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt
+                                       }{
+                                               [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt
+                                       }ifelse
+                               }{
+                               [/Indexed MappedCSA HiVal
+                                       [
+                                       currentdict/Names known{
+                                               Lookup dup type/stringtype eq
+                                                       {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx}
+                                                       {/exec cvx}ifelse
+                                                       /TintTransform load/exec cvx
+                                       }{
+                                               Lookup dup type/stringtype eq
+                                                       {/exch cvx/get cvx 255/div cvx}
+                                                       {/exec cvx}ifelse
+                                                       CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx
+                                       }ifelse
+                                       ]cvx
+                               ]setcolorspace_opt
+                               }ifelse
+                       }ifelse
+                       end
+                       set_crd
+               }
+               {
+                       CSA map_csa
+                       AGMCORE_host_sep level2 not and{
+                               0 0 0 0 setcmykcolor
+                       }{
+                               [/Indexed MappedCSA 
+                               level2 not has_color not and{
+                                       dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{
+                                               pop[/DeviceGray]
+                                       }if
+                                       HiVal GrayLookup
+                               }{
+                                       HiVal 
+                                       currentdict/RangeArray known{
+                                               {
+                                                       /indexed_colorspace_dict AGMCORE_gget begin
+                                                       Lookup exch 
+                                                       dup HiVal gt{
+                                                               pop HiVal
+                                                       }if
+                                                       NComponents mul NComponents getinterval{}forall
+                                                       NComponents 1 sub -1 0{
+                                                               RangeArray exch 2 mul 2 getinterval aload pop map255_to_range
+                                                               NComponents 1 roll
+                                                       }for
+                                                       end
+                                               }bind
+                                       }{
+                                               Lookup
+                                       }ifelse
+                               }ifelse
+                               ]setcolorspace_opt
+                               set_crd
+                       }ifelse
+               }ifelse
+       end
+}def
+/setindexedcolor
+{
+       AGMCORE_host_sep{
+               /indexed_colorspace_dict AGMCORE_gget
+               begin
+               currentdict/CSDBase known{
+                       CSDBase/CSD get_res begin
+                       currentdict/Names known{
+                               map_indexed_devn
+                               devn
+                       }
+                       {
+                               Lookup 1 3 -1 roll map_index
+                               sep
+                       }ifelse
+                       end
+               }{
+                       Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll
+                       map_index
+                       MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse
+               }ifelse
+               end
+       }{
+               level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{
+                       /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin
+                       map_indexed_devn
+                       devn
+                       end
+               }
+               {
+                       setcolor
+               }ifelse
+       }ifelse
+}def
+/ignoreimagedata
+{
+       currentoverprint not{
+               gsave
+               dup clonedict begin
+               1 setgray
+               /Decode[0 1]def
+               /DataSource<FF>def
+               /MultipleDataSources false def
+               /BitsPerComponent 8 def
+               currentdict end
+               systemdict/image gx
+               grestore
+               }if
+       consumeimagedata
+}def
+/add_res
+{
+       dup/CSD eq{
+               pop 
+               //Adobe_AGM_Core begin
+               /AGMCORE_CSD_cache load 3 1 roll put
+               end
+       }{
+               defineresource pop
+       }ifelse
+}def
+/del_res
+{
+       {
+               aload pop exch
+               dup/CSD eq{
+                       pop 
+                       {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall
+               }{
+                       exch
+                       {1 index undefineresource}forall
+                       pop
+               }ifelse
+       }forall
+}def
+/get_res
+{
+       dup/CSD eq{
+               pop
+               dup type dup/nametype eq exch/stringtype eq or{
+                       AGMCORE_CSD_cache exch get
+               }if
+       }{
+               findresource
+       }ifelse
+}def
+/get_csa_by_name
+{
+       dup type dup/nametype eq exch/stringtype eq or{
+               /CSA get_res
+       }if
+}def
+/paintproc_buf_init
+{
+       /count get 0 0 put
+}def
+/paintproc_buf_next
+{
+       dup/count get dup 0 get
+       dup 3 1 roll
+       1 add 0 xpt
+       get                             
+}def
+/cachepaintproc_compress
+{
+       5 dict begin
+       currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
+       /ppdict 20 dict def
+       /string_size 16000 def
+       /readbuffer string_size string def
+       currentglobal true setglobal 
+       ppdict 1 array dup 0 1 put/count xpt
+       setglobal
+       /LZWFilter 
+       {
+               exch
+               dup length 0 eq{
+                       pop
+               }{
+                       ppdict dup length 1 sub 3 -1 roll put
+               }ifelse
+               {string_size}{0}ifelse string
+       }/LZWEncode filter def
+       {               
+               ReadFilter readbuffer readstring
+               exch LZWFilter exch writestring
+               not{exit}if
+       }loop
+       LZWFilter closefile
+       ppdict                          
+       end
+}def
+/cachepaintproc
+{
+       2 dict begin
+       currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def
+       /ppdict 20 dict def
+       currentglobal true setglobal 
+       ppdict 1 array dup 0 1 put/count xpt
+       setglobal
+       {
+               ReadFilter 16000 string readstring exch
+               ppdict dup length 1 sub 3 -1 roll put
+               not{exit}if
+       }loop
+       ppdict dup dup length 1 sub()put                                        
+       end     
+}def
+/make_pattern
+{
+       exch clonedict exch
+       dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform
+       exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub
+       exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub
+       matrix translate exch matrix concatmatrix
+                        1 index begin
+               BBox 0 get XStep div cvi XStep mul/xshift exch neg def
+               BBox 1 get YStep div cvi YStep mul/yshift exch neg def
+               BBox 0 get xshift add
+               BBox 1 get yshift add
+               BBox 2 get xshift add
+               BBox 3 get yshift add
+               4 array astore
+               /BBox exch def
+               [xshift yshift/translate load null/exec load]dup
+               3/PaintProc load put cvx/PaintProc exch def
+               end
+       gsave 0 setgray
+       makepattern
+       grestore
+}def
+/set_pattern
+{
+       dup/PatternType get 1 eq{
+               dup/PaintType get 1 eq{
+                       currentoverprint sop[/DeviceGray]setcolorspace 0 setgray
+               }if
+       }if
+       setpattern
+}def
+/setcolorspace_opt
+{
+       dup currentcolorspace eq{pop}{setcolorspace}ifelse
+}def
+/updatecolorrendering
+{
+       currentcolorrendering/RenderingIntent known{
+               currentcolorrendering/RenderingIntent get
+       }
+       {
+               Intent/AbsoluteColorimetric eq 
+               {
+                       /absolute_colorimetric_crd AGMCORE_gget dup null eq
+               }
+               {
+                       Intent/RelativeColorimetric eq
+                       {
+                               /relative_colorimetric_crd AGMCORE_gget dup null eq
+                       }
+                       {
+                               Intent/Saturation eq
+                               {
+                                       /saturation_crd AGMCORE_gget dup null eq
+                               }
+                               {
+                                       /perceptual_crd AGMCORE_gget dup null eq
+                               }ifelse
+                       }ifelse
+               }ifelse
+               {
+                       pop null        
+               }
+               {
+                       /RenderingIntent known{null}{Intent}ifelse
+               }ifelse
+       }ifelse
+       Intent ne{
+               Intent/ColorRendering{findresource}stopped
+               {
+                       pop pop systemdict/findcolorrendering known
+                       {
+                               Intent findcolorrendering
+                               {
+                                       /ColorRendering findresource true exch
+                               }
+                               {
+                                       /ColorRendering findresource
+                                       product(Xerox Phaser 5400)ne
+                                       exch
+                               }ifelse
+                               dup Intent/AbsoluteColorimetric eq 
+                               {
+                                       /absolute_colorimetric_crd exch AGMCORE_gput
+                               }
+                               {
+                                       Intent/RelativeColorimetric eq
+                                       {
+                                               /relative_colorimetric_crd exch AGMCORE_gput
+                                       }
+                                       {
+                                               Intent/Saturation eq
+                                               {
+                                                       /saturation_crd exch AGMCORE_gput
+                                               }
+                                               {
+                                                       Intent/Perceptual eq
+                                                       {
+                                                               /perceptual_crd exch AGMCORE_gput
+                                                       }
+                                                       {
+                                                               pop
+                                                       }ifelse
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                               1 index{exch}{pop}ifelse
+                       }
+                       {false}ifelse
+               }
+               {true}ifelse
+               {
+                       dup begin
+                       currentdict/TransformPQR known{
+                               currentdict/TransformPQR get aload pop
+                               3{{}eq 3 1 roll}repeat or or
+                       }
+                       {true}ifelse
+                       currentdict/MatrixPQR known{
+                               currentdict/MatrixPQR get aload pop
+                               1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll
+                               0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll
+                               0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq
+                               and and and and and and and and
+                       }
+                       {true}ifelse
+                       end
+                       or
+                       {
+                               clonedict begin
+                               /TransformPQR[
+                                       {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div
+                                       3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind
+                                       {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div
+                                       3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind
+                                       {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div
+                                       3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind
+                               ]def
+                               /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def
+                               /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def
+                               currentdict end
+                       }if
+                       setcolorrendering_opt
+               }if             
+       }if
+}def
+/set_crd
+{
+       AGMCORE_host_sep not level2 and{
+               currentdict/ColorRendering known{
+                       ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if
+               }{
+                       currentdict/Intent known{
+                               updatecolorrendering
+                       }if
+               }ifelse
+               currentcolorspace dup type/arraytype eq
+                       {0 get}if
+               /DeviceRGB eq
+                       {
+                       currentdict/UCR known
+                               {/UCR}{/AGMCORE_currentucr}ifelse
+                       load setundercolorremoval
+                       currentdict/BG known 
+                               {/BG}{/AGMCORE_currentbg}ifelse
+                       load setblackgeneration
+                       }if
+       }if
+}def
+/set_ucrbg
+{
+       dup null eq{pop/AGMCORE_currentbg load}{/Procedure get_res}ifelse setblackgeneration
+       dup null eq{pop/AGMCORE_currentucr load}{/Procedure get_res}ifelse setundercolorremoval
+}def
+/setcolorrendering_opt
+{
+       dup currentcolorrendering eq{
+               pop
+       }{
+               product(HP Color LaserJet 2605)anchorsearch{
+                       pop pop pop
+               }{
+                       pop
+                       clonedict
+                       begin
+                               /Intent Intent def
+                               currentdict
+                       end
+                       setcolorrendering
+               }ifelse
+       }ifelse
+}def
+/cpaint_gcomp
+{
+       convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf
+       //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not
+       {
+               (%end_cpaint_gcomp)flushinput
+       }if
+}def
+/cpaint_gsep
+{
+       //Adobe_AGM_Core/AGMCORE_ConvertToProcess get
+       {       
+               (%end_cpaint_gsep)flushinput
+       }if
+}def
+/cpaint_gend
+{np}def
+/T1_path
+{
+       currentfile token pop currentfile token pop mo
+       {
+               currentfile token pop dup type/stringtype eq
+                       {pop exit}if 
+               0 exch rlineto 
+               currentfile token pop dup type/stringtype eq
+                       {pop exit}if 
+               0 rlineto
+       }loop
+}def
+/T1_gsave
+       level3
+       {/clipsave}
+       {/gsave}ifelse
+       load def
+/T1_grestore
+       level3
+       {/cliprestore}
+       {/grestore}ifelse 
+       load def
+/set_spot_alias_ary
+{
+       dup inherit_aliases
+       //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf
+}def
+/set_spot_normalization_ary
+{
+       dup inherit_aliases
+       dup length
+       /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if
+       array
+       //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf
+       /AGMCORE_SpotAliasAry where{
+               pop
+               AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval
+               AGMCORE_SpotAliasAry length
+       }{0}ifelse
+       AGMCORE_SpotAliasAry2 3 1 roll exch putinterval
+       true set_spot_alias
+}def
+/inherit_aliases
+{
+       {dup/Name get map_alias{/CSD put}{pop}ifelse}forall
+}def
+/set_spot_alias
+{
+       /AGMCORE_SpotAliasAry2 where{
+               /AGMCORE_current_spot_alias 3 -1 roll put
+       }{
+               pop
+       }ifelse
+}def
+/current_spot_alias
+{
+       /AGMCORE_SpotAliasAry2 where{
+               /AGMCORE_current_spot_alias get
+       }{
+               false
+       }ifelse
+}def
+/map_alias
+{
+       /AGMCORE_SpotAliasAry2 where{
+               begin
+                       /AGMCORE_name xdf
+                       false   
+                       AGMCORE_SpotAliasAry2{
+                               dup/Name get AGMCORE_name eq{
+                                       /CSD get/CSD get_res
+                                       exch pop true
+                                       exit
+                               }{
+                                       pop
+                               }ifelse
+                       }forall
+               end
+       }{
+               pop false
+       }ifelse
+}bdf
+/spot_alias
+{
+       true set_spot_alias
+       /AGMCORE_&setcustomcolor AGMCORE_key_known not{
+               //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put
+       }if
+       /customcolor_tint 1 AGMCORE_gput
+       //Adobe_AGM_Core begin
+       /setcustomcolor
+       {
+               //Adobe_AGM_Core begin
+               dup/customcolor_tint exch AGMCORE_gput
+               1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not
+               current_spot_alias and{1 index 4 get map_alias}{false}ifelse
+               {
+                       false set_spot_alias
+                       /sep_colorspace_dict AGMCORE_gget null ne
+                       {/sep_colorspace_dict AGMCORE_gget/ForeignContent known not}{false}ifelse
+                       3 1 roll 2 index{
+                               exch pop/sep_tint AGMCORE_gget exch
+                       }if
+                       mark 3 1 roll
+                       setsepcolorspace
+                       counttomark 0 ne{
+                               setsepcolor
+                       }if
+                       pop
+                       not{/sep_tint 1.0 AGMCORE_gput/sep_colorspace_dict AGMCORE_gget/ForeignContent true put}if
+                       pop
+                       true set_spot_alias
+               }{
+                       AGMCORE_&setcustomcolor
+               }ifelse
+               end
+       }bdf
+       end
+}def
+/begin_feature
+{
+       Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put
+       count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put
+       {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if
+}def
+/end_feature
+{
+       2 dict begin
+       /spd/setpagedevice load def
+       /setpagedevice{get_gstate spd set_gstate}def
+       stopped{$error/newerror false put}if
+       end
+       count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse
+       countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse
+       {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if
+}def
+/set_negative
+{
+       //Adobe_AGM_Core begin
+       /AGMCORE_inverting exch def
+       level2{
+               currentpagedevice/NegativePrint known AGMCORE_distilling not and{
+                       currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{
+                               true begin_feature true{
+                                               <</NegativePrint//Adobe_AGM_Core/AGMCORE_inverting get>>setpagedevice
+                               }end_feature
+                       }if
+                       /AGMCORE_inverting false def
+               }if
+       }if
+       AGMCORE_inverting{
+               [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer
+               AGMCORE_distilling{
+                       erasepage
+               }{
+                       gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse
+                       /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore
+               }ifelse
+       }if
+       end
+}def
+/lw_save_restore_override{
+       /md where{
+               pop
+               md begin
+               initializepage
+               /initializepage{}def
+               /pmSVsetup{}def
+               /endp{}def
+               /pse{}def
+               /psb{}def
+               /orig_showpage where
+                       {pop}
+                       {/orig_showpage/showpage load def}
+               ifelse
+               /showpage{orig_showpage gR}def
+               end
+       }if
+}def
+/pscript_showpage_override{
+       /NTPSOct95 where
+       {
+               begin
+               showpage
+               save
+               /showpage/restore load def
+               /restore{exch pop}def
+               end
+       }if
+}def
+/driver_media_override
+{
+       /md where{
+               pop
+               md/initializepage known{
+                       md/initializepage{}put
+               }if
+               md/rC known{
+                       md/rC{4{pop}repeat}put
+               }if
+       }if
+       /mysetup where{
+               /mysetup[1 0 0 1 0 0]put
+       }if
+       Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put
+       level2
+               {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if
+}def
+/capture_mysetup
+{
+       /Pscript_Win_Data where{
+               pop
+               Pscript_Win_Data/mysetup known{
+                       Adobe_AGM_Core/save_mysetup Pscript_Win_Data/mysetup get put
+               }if
+       }if
+}def
+/restore_mysetup
+{
+       /Pscript_Win_Data where{
+               pop
+               Pscript_Win_Data/mysetup known{
+                       Adobe_AGM_Core/save_mysetup known{
+                               Pscript_Win_Data/mysetup Adobe_AGM_Core/save_mysetup get put
+                               Adobe_AGM_Core/save_mysetup undef
+                       }if
+               }if
+       }if
+}def
+/driver_check_media_override
+{
+       /PrepsDict where
+               {pop}
+               {
+               Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne
+               Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq
+                       {
+                       Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and
+                       Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and
+                       }if
+                       {
+                       Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix
+                       }if
+               }ifelse
+}def
+AGMCORE_err_strings begin
+       /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def
+       /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def
+       /AGMCORE_invalid_color_space(This job contains an invalid color space. )def
+end
+/set_def_ht
+{AGMCORE_def_ht sethalftone}def
+/set_def_flat
+{AGMCORE_Default_flatness setflat}def
+end
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+%%BeginResource: procset Adobe_CoolType_Core 2.31 0\r%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved.\r%%Version: 2.31 0\r10 dict begin\r/Adobe_CoolType_Passthru currentdict def\r/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def\rAdobe_CoolType_Core_Defined\r        {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def}\rif\ruserdict/Adobe_CoolType_Core 70 dict dup begin put\r/Adobe_CoolType_Version 2.31 def\r/Level2?\r    systemdict/languagelevel known dup\r             {pop systemdict/languagelevel get 2 ge}\r        if def\rLevel2? not\r     {\r      /currentglobal false def\r       /setglobal/pop load def\r        /gcheck{pop false}bind def\r     /currentpacking false def\r      /setpacking/pop load def\r       /SharedFontDirectory 0 dict def\r        }\rif\rcurrentpacking\rtrue setpacking\rcurrentglobal false setglobal\ruserdict/Adobe_CoolType_Data 2 copy known not\r        {2 copy 10 dict put}\rif\rget\r     begin\r /@opStackCountByLevel 32 dict def\r      /@opStackLevel 0 def\r   /@dictStackCountByLevel 32 dict def\r    /@dictStackLevel 0 def\r  end\rsetglobal\rcurrentglobal true setglobal\ruserdict/Adobe_CoolType_GVMFonts known not\r {userdict/Adobe_CoolType_GVMFonts 10 dict put}\rif\rsetglobal\rcurrentglobal false setglobal\ruserdict/Adobe_CoolType_LVMFonts known not\r   {userdict/Adobe_CoolType_LVMFonts 10 dict put}\rif\rsetglobal\r/ct_VMDictPut\r      {\r      dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse\r     3 1 roll put\r   }bind def\r/ct_VMDictUndef\r      {\r      dup Adobe_CoolType_GVMFonts exch known\r         {Adobe_CoolType_GVMFonts exch undef}\r           {\r                      dup Adobe_CoolType_LVMFonts exch known\r                 {Adobe_CoolType_LVMFonts exch undef}\r                   {pop}\r                  ifelse\r         }ifelse\r        }bind def\r/ct_str1 1 string def\r/ct_xshow\r{\r    /_ct_na exch def\r       /_ct_i 0 def\r   currentpoint\r   /_ct_y exch def\r        /_ct_x exch def\r        {\r              pop pop\r                ct_str1 exch 0 exch put\r                ct_str1 show\r           {_ct_na _ct_i get}stopped \r             {pop pop}\r              {\r                      _ct_x _ct_y moveto\r                     0\r                      rmoveto\r                }\r              ifelse\r         /_ct_i _ct_i 1 add def\r         currentpoint\r           /_ct_y exch def\r                /_ct_x exch def\r        }\r      exch\r   @cshow\r}bind def\r/ct_yshow\r{\r   /_ct_na exch def\r       /_ct_i 0 def\r   currentpoint\r   /_ct_y exch def\r        /_ct_x exch def\r        {\r              pop pop\r                ct_str1 exch 0 exch put\r                ct_str1 show\r           {_ct_na _ct_i get}stopped \r             {pop pop}\r              {\r                      _ct_x _ct_y moveto\r                     0 exch\r                 rmoveto\r                }\r              ifelse\r         /_ct_i _ct_i 1 add def\r         currentpoint\r           /_ct_y exch def\r                /_ct_x exch def\r        }\r      exch\r   @cshow\r}bind def\r/ct_xyshow\r{\r  /_ct_na exch def\r       /_ct_i 0 def\r   currentpoint\r   /_ct_y exch def\r        /_ct_x exch def\r        {\r              pop pop\r                ct_str1 exch 0 exch put\r                ct_str1 show\r           {_ct_na _ct_i get}stopped \r             {pop pop}\r              {\r                      {_ct_na _ct_i 1 add get}stopped \r                       {pop pop pop}\r                  {\r                              _ct_x _ct_y moveto\r                             rmoveto\r                        }\r                      ifelse\r         }\r              ifelse\r         /_ct_i _ct_i 2 add def\r         currentpoint\r           /_ct_y exch def\r                /_ct_x exch def\r        }\r      exch\r   @cshow\r}bind def\r/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def\r/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def\r/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def\rcurrentglobal true setglobal\r/ct_T3Defs\r{\r/BuildChar\r{\r     1 index/Encoding get exch get\r  1 index/BuildGlyph get exec\r}bind def\r/BuildGlyph\r{\r    exch begin\r     GlyphProcs exch get exec\r       end\r}bind def\r}bind def\rsetglobal\r/@_SaveStackLevels\r   {\r      Adobe_CoolType_Data\r            begin\r          /@vmState currentglobal def false setglobal\r            @opStackCountByLevel\r           @opStackLevel\r          2 copy known not\r                       {\r                      2 copy\r                 3 dict dup/args\r                        7 index\r                        5 add array put\r                        put get\r                        }\r                      {\r                      get dup/args get dup length 3 index lt\r                         {\r                              dup length 5 add array exch\r                            1 index exch 0 exch putinterval\r                                1 index exch/args exch put\r                             }\r                              {pop}\r                  ifelse\r                 }\r              ifelse\r                 begin\r                  count 1 sub\r                    1 index lt\r                             {pop count}\r                    if\r                     dup/argCount exch def\r                  dup 0 gt\r                               {\r                              args exch 0 exch getinterval \r                  astore pop\r                             }\r                              {pop}\r                  ifelse\r                 count\r                  /restCount exch def\r                    end\r            /@opStackLevel @opStackLevel 1 add def\r         countdictstack 1 sub\r           @dictStackCountByLevel exch @dictStackLevel exch put\r           /@dictStackLevel @dictStackLevel 1 add def\r             @vmState setglobal\r             end\r    }bind def\r/@_RestoreStackLevels\r        {\r      Adobe_CoolType_Data\r            begin\r          /@opStackLevel @opStackLevel 1 sub def\r         @opStackCountByLevel @opStackLevel get\r                 begin\r                  count restCount sub dup 0 gt\r                           {{pop}repeat}\r                          {pop}\r                  ifelse\r                 args 0 argCount getinterval{}forall\r                    end\r            /@dictStackLevel @dictStackLevel 1 sub def\r             @dictStackCountByLevel @dictStackLevel get\r             end\r    countdictstack exch sub dup 0 gt\r               {{end}repeat}\r          {pop}\r  ifelse\r }bind def\r/@_PopStackLevels\r    {\r      Adobe_CoolType_Data\r            begin\r          /@opStackLevel @opStackLevel 1 sub def\r         /@dictStackLevel @dictStackLevel 1 sub def\r             end\r    }bind def\r/@Raise\r      {\r      exch cvx exch errordict exch get exec\r  stop\r   }bind def\r/@ReRaise\r    {\r      cvx $error/errorname get errordict exch get exec\r       stop\r   }bind def\r/@Stopped\r    {\r      0 @#Stopped\r    }bind def\r/@#Stopped\r   {\r      @_SaveStackLevels\r      stopped\r                {@_RestoreStackLevels true}\r            {@_PopStackLevels false}\r       ifelse\r }bind def\r/@Arg\r        {\r      Adobe_CoolType_Data\r            begin\r          @opStackCountByLevel @opStackLevel 1 sub get\r           begin\r          args exch\r              argCount 1 sub exch sub get\r            end\r            end\r    }bind def\rcurrentglobal true setglobal\r/CTHasResourceForAllBug\r Level2?\r                {\r              1 dict dup\r                             /@shouldNotDisappearDictValue true def\r                         Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put\r                              begin\r                          count @_SaveStackLevels\r                                        {(*){pop stop}128 string/Category resourceforall}\r                              stopped pop\r                            @_RestoreStackLevels\r                           currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll\r                                       {\r                                               /@shouldNotDisappearDictValue known\r                                                           {\r                                                                               {\r                                                                                             end\r                                                                                            currentdict 1 index eq\r                                                                                                 {pop exit}\r                                                                                             if\r                                                                              }\r                                                                      loop\r                                                          }\r                                               if\r                                    }\r                                      {\r                                               pop\r                                            end\r                                   }\r                              ifelse\r         }\r              {false}\r        ifelse\r def\rtrue setglobal\r/CTHasResourceStatusBug\r     Level2?\r                {\r              mark\r                   {/steveamerige/Category resourcestatus}\r                stopped\r                        {cleartomark true}\r                     {cleartomark currentglobal not}\r                ifelse\r         }\r              {false}\r        ifelse\r def\rsetglobal\r/CTResourceStatus\r                {\r              mark 3 1 roll\r          /Category findresource\r                 begin\r                  ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec\r                             {cleartomark false}\r                            {{3 2 roll pop true}{cleartomark false}ifelse}\r                 ifelse\r                 end\r            }bind def\r/CTWorkAroundBugs\r    {\r      Level2?\r                {\r              /cid_PreLoad/ProcSet resourcestatus\r                    {\r                      pop pop\r                        currentglobal\r                  mark\r                           {\r                              (*)\r                                    {\r                                      dup/CMap CTHasResourceStatusBug\r                                                {CTResourceStatus}\r                                             {resourcestatus}\r                                       ifelse\r                                         {\r                                              pop dup 0 eq exch 1 eq or\r                                                      {\r                                                      dup/CMap findresource gcheck setglobal\r                                                 /CMap undefineresource\r                                                 }\r                                                      {\r                                                      pop CTHasResourceForAllBug\r                                                             {exit}\r                                                         {stop}\r                                                 ifelse\r                                                 }\r                                              ifelse\r                                         }\r                                              {pop}\r                                  ifelse\r                                 }\r                              128 string/CMap resourceforall\r                         }\r                      stopped\r                                {cleartomark}\r                  stopped pop\r                    setglobal\r                      }\r              if\r             }\r      if\r     }bind def\r/ds\r  {\r      Adobe_CoolType_Core\r            begin\r          CTWorkAroundBugs\r               /mo/moveto load def\r            /nf/newencodedfont load def\r            /msf{makefont setfont}bind def\r         /uf{dup undefinefont ct_VMDictUndef}bind def\r           /ur/undefineresource load def\r          /chp/charpath load def\r         /awsh/awidthshow load def\r              /wsh/widthshow load def\r                /ash/ashow load def\r            /@xshow/xshow load def\r         /@yshow/yshow load def\r         /@xyshow/xyshow load def\r               /@cshow/cshow load def\r         /sh/show load def\r              /rp/repeat load def\r            /.n/.notdef def\r                end\r            currentglobal false setglobal\r   userdict/Adobe_CoolType_Data 2 copy known not\r          {2 copy 10 dict put}\r          if\r             get\r            begin\r          /AddWidths? false def\r          /CC 0 def\r              /charcode 2 string def\r         /@opStackCountByLevel 32 dict def\r              /@opStackLevel 0 def\r           /@dictStackCountByLevel 32 dict def\r            /@dictStackLevel 0 def\r         /InVMFontsByCMap 10 dict def\r           /InVMDeepCopiedFonts 10 dict def\r               end\r            setglobal\r      }bind def\r/dt\r  {\r      currentdict Adobe_CoolType_Core eq\r             {end}\r  if\r     }bind def\r/ps\r  {\r      Adobe_CoolType_Core begin\r      Adobe_CoolType_GVMFonts begin\r  Adobe_CoolType_LVMFonts begin\r  SharedFontDirectory begin\r      }bind def\r/pt\r  {\r      end\r    end\r    end\r    end\r    }bind def\r/unload\r      {\r      systemdict/languagelevel known\r         {\r              systemdict/languagelevel get 2 ge\r                      {\r                      userdict/Adobe_CoolType_Core 2 copy known\r                              {undef}\r                                {pop pop}\r                      ifelse\r                 }\r              if\r             }\r      if\r     }bind def\r/ndf\r {\r      1 index where\r          {pop pop pop}\r          {dup xcheck{bind}if def}\r       ifelse\r }def\r/findfont systemdict\r      begin\r  userdict\r               begin\r          /globaldict where{/globaldict get begin}if\r                     dup where pop exch get\r         /globaldict where{pop end}if\r           end\r    end\rAdobe_CoolType_Core_Defined\r        {/systemfindfont exch def}\r     {\r      /findfont 1 index def\r  /systemfindfont exch def\r       }\rifelse\r/undefinefont\r {pop}ndf\r/copyfont\r     {\r      currentglobal 3 1 roll\r 1 index gcheck setglobal\r       dup null eq{0}{dup length}ifelse\r       2 index length add 1 add dict\r          begin\r          exch\r                   {\r                      1 index/FID eq\r                         {pop pop}\r                              {def}\r                  ifelse\r                 }\r              forall\r         dup null eq\r                    {pop}\r                  {{def}forall}\r          ifelse\r         currentdict\r            end\r    exch setglobal\r }bind def\r/copyarray\r   {\r      currentglobal exch\r     dup gcheck setglobal\r   dup length array copy\r  exch setglobal\r }bind def\r/newencodedfont\r      {\r      currentglobal\r          {\r              SharedFontDirectory 3 index known\r                      {SharedFontDirectory 3 index get/FontReferenced known}\r                 {false}\r                ifelse\r         }\r              {\r              FontDirectory 3 index known\r                    {FontDirectory 3 index get/FontReferenced known}\r                       {\r                      SharedFontDirectory 3 index known\r                              {SharedFontDirectory 3 index get/FontReferenced known}\r                         {false}\r                        ifelse\r                 }\r              ifelse\r         }\r      ifelse\r dup\r            {\r              3 index findfont/FontReferenced get\r            2 index dup type/nametype eq\r                   {findfont}\r             if ne\r                  {pop false}\r            if\r             }\r      if\r     dup\r            {\r              1 index dup type/nametype eq\r                   {findfont}\r              if\r            dup/CharStrings known\r                  {\r                      /CharStrings get length\r                        4 index findfont/CharStrings get length\r                        ne\r                             {\r                              pop false\r                              }\r                      if \r                    }\r                      {pop}\r                  ifelse\r         }\r      if\r             {\r              pop\r            1 index findfont\r               /Encoding get exch\r             0 1 255\r                        {2 copy get 3 index 3 1 roll put}\r              for\r            pop pop pop\r            }\r              {\r              currentglobal\r   4 1 roll\r              dup type/nametype eq\r            {findfont}\r     if\r     dup gcheck setglobal\r          dup dup maxlength 2 add dict\r                   begin\r                  exch\r                           {\r                              1 index/FID ne\r                         2 index/Encoding ne and\r                                        {def}\r                                  {pop pop}\r                              ifelse\r                         }\r                      forall\r                 /FontReferenced exch def\r                       /Encoding exch dup length array copy def\r                       /FontName 1 index dup type/stringtype eq{cvn}if def dup\r                        currentdict\r                    end\r            definefont ct_VMDictPut\r                setglobal\r              }\r      ifelse\r }bind def\r/SetSubstituteStrategy\r       {\r      $SubstituteFont\r                begin\r          dup type/dicttype ne\r                   {0 dict}\r               if\r             currentdict/$Strategies known\r                  {\r                      exch $Strategies exch \r                 2 copy known\r                           {\r                              get\r                            2 copy maxlength exch maxlength add dict\r                                       begin\r                                  {def}forall\r                                    {def}forall\r                                    currentdict\r                                    dup/$Init known\r                                                {dup/$Init get exec}\r                                   if\r                                     end\r                            /$Strategy exch def\r                            }\r                              {pop pop pop}\r                  ifelse\r                 }\r                      {pop pop}\r              ifelse\r         end\r    }bind def\r/scff\r        {\r      $SubstituteFont\r                begin\r          dup type/stringtype eq\r                 {dup length exch}\r                      {null}\r         ifelse\r         /$sname exch def\r               /$slen exch def\r                /$inVMIndex\r                    $sname null eq\r                         {\r                              1 index $str cvs\r                               dup length $slen sub $slen getinterval cvn\r                             }\r                              {$sname}\r                       ifelse def\r             end\r            {findfont}\r     @Stopped\r               {\r              dup length 8 add string exch\r           1 index 0(BadFont:)putinterval\r         1 index exch 8 exch dup length string cvs putinterval cvn\r                      {findfont}\r             @Stopped\r                       {pop/Courier findfont}\r         if\r             }\r      if\r     $SubstituteFont\r                begin\r          /$sname null def\r               /$slen 0 def\r           /$inVMIndex null def\r           end\r    }bind def\r/isWidthsOnlyFont\r    {\r      dup/WidthsOnly known\r           {pop pop true}\r         {\r              dup/FDepVector known\r                   {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall}\r                  {\r                      dup/FDArray known\r                              {/FDArray get{isWidthsOnlyFont dup{exit}if}forall}\r                             {pop}\r                  ifelse\r                 }\r              ifelse\r         }\r      ifelse\r }bind def\r/ct_StyleDicts 4 dict dup begin\r               /Adobe-Japan1 4 dict dup begin\r                                         Level2?\r                                                               {\r                                                              /Serif\r                                                         /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus\r                                                          {pop pop/HeiseiMin-W3}\r                                                         {\r                                                      /CIDFont/Category resourcestatus\r                                                       {\r                                                              pop pop\r                                                                /HeiseiMin-W3/CIDFont resourcestatus\r                                                           {pop pop/HeiseiMin-W3}\r                                                         {/Ryumin-Light}\r                                                                ifelse\r                                                 }\r                                                      {/Ryumin-Light}\r                                                        ifelse\r                                                         }\r                                                              ifelse\r                                                         def\r                                                            /SansSerif\r                                                             /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus\r                                                               {pop pop/HeiseiKakuGo-W5}\r                                                              {\r                                                      /CIDFont/Category resourcestatus\r                                                       {\r                                                              pop pop\r                                                                /HeiseiKakuGo-W5/CIDFont resourcestatus\r                                                                {pop pop/HeiseiKakuGo-W5}\r                                                              {/GothicBBB-Medium}\r                                                            ifelse\r                                                 }\r                                                      {/GothicBBB-Medium}\r                                                    ifelse\r                                                         }\r                                                              ifelse\r                                                         def\r                                                            /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus\r                                                               {pop pop/HeiseiMaruGo-W4}\r                                                              {\r                                                      /CIDFont/Category resourcestatus\r                                                       {\r                                                              pop pop\r                                                                /HeiseiMaruGo-W4/CIDFont resourcestatus\r                                                                {pop pop/HeiseiMaruGo-W4}\r                                                              {\r                                                                      /Jun101-Light-RKSJ-H/Font resourcestatus\r                                                                       {pop pop/Jun101-Light}\r                                                                 {SansSerif}\r                                                                    ifelse\r                                                         }\r                                                              ifelse\r                                                 }\r                                                      {\r                                                              /Jun101-Light-RKSJ-H/Font resourcestatus\r                                                               {pop pop/Jun101-Light}\r                                                         {SansSerif}\r                                                            ifelse\r                                                 }\r                                                      ifelse\r                                                         }\r                                                              ifelse\r                                                         /RoundSansSerif exch def\r                                                               /Default Serif def\r                                                             }\r                                                              {\r                                                              /Serif/Ryumin-Light def\r                                                                /SansSerif/GothicBBB-Medium def\r                                                                {\r                                                              (fonts/Jun101-Light-83pv-RKSJ-H)status\r                                                         }stopped\r                                                               {pop}{\r                                                                          {pop pop pop pop/Jun101-Light}\r                                                                                 {SansSerif}\r                                                                            ifelse\r                                                                                 /RoundSansSerif exch def\r                                                              }ifelse\r                                                                /Default Serif def\r                                                             }\r                                       ifelse\r                 end\r            def\r            /Adobe-Korea1 4 dict dup begin\r                                        /Serif/HYSMyeongJo-Medium def\r                                  /SansSerif/HYGoThic-Medium def\r                                 /RoundSansSerif SansSerif def\r                                  /Default Serif def\r              end\r            def\r            /Adobe-GB1 4 dict dup begin\r                                   /Serif/STSong-Light def\r                                        /SansSerif/STHeiti-Regular def\r                                 /RoundSansSerif SansSerif def\r                                  /Default Serif def\r              end\r            def\r            /Adobe-CNS1 4 dict dup begin\r                                  /Serif/MKai-Medium def\r                                 /SansSerif/MHei-Medium def\r                                     /RoundSansSerif SansSerif def\r                                  /Default Serif def\r              end\r            def\rend\rdef\rLevel2?{currentglobal true setglobal}if\r/ct_BoldRomanWidthProc \r   {\r      stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth\r     0 0\r    }bind def\r/ct_Type0WidthProc \r  {\r       dup stringwidth 0 0 moveto \r    2 index true charpath pathbbox\r         0 -1 \r  7 index 2 div .88 \r     setcachedevice2\r        pop\r   0 0\r    }bind def\r/ct_Type0WMode1WidthProc \r    {\r       dup stringwidth \r       pop 2 div neg -0.88\r   2 copy\r moveto \r        0 -1\r    5 -1 roll true charpath pathbbox\r       setcachedevice\r        }bind def\r/cHexEncoding\r[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12\r/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25\r/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38\r/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B\r/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E\r/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71\r/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84\r/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97\r/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA\r/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD\r/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0\r/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3\r/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6\r/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def\r/ct_BoldBaseFont \r    11 dict begin\r         /FontType 3 def\r                /FontMatrix[1 0 0 1 0 0]def\r            /FontBBox[0 0 1 1]def\r          /Encoding cHexEncoding def \r            /_setwidthProc/ct_BoldRomanWidthProc load def\r          /_bcstr1 1 string def\r          /BuildChar\r             {\r                      exch begin\r                             _basefont setfont\r                              _bcstr1 dup 0 4 -1 roll put\r                            dup \r                           _setwidthProc\r                          3 copy \r                                moveto                          \r                               show\r                           _basefonto setfont\r                             moveto\r                         show\r                   end\r            }bind def\r               currentdict\r    end \rdef\rsystemdict/composefont known\r{\r/ct_DefineIdentity-H\r{\r        /Identity-H/CMap resourcestatus\r        {\r              pop pop\r        }\r      {\r              /CIDInit/ProcSet findresource begin\r             12 dict begin\r          begincmap\r              /CIDSystemInfo 3 dict dup begin\r                        /Registry(Adobe)def\r                    /Ordering(Identity)def\r                         /Supplement 0 def\r              end def\r                /CMapName/Identity-H def\r               /CMapVersion 1.000 def\r                 /CMapType 1 def\r                1 begincodespacerange\r          <0000><FFFF>\r           endcodespacerange\r              1 begincidrange\r                <0000><FFFF>0\r          endcidrange\r            endcmap\r                CMapName currentdict/CMap defineresource pop\r           end\r            end\r    }\r      ifelse\r}\rdef\r/ct_BoldBaseCIDFont \r      11 dict begin\r         /CIDFontType 1 def\r             /CIDFontName/ct_BoldBaseCIDFont def\r            /FontMatrix[1 0 0 1 0 0]def\r            /FontBBox[0 0 1 1]def\r          /_setwidthProc/ct_Type0WidthProc load def\r              /_bcstr2 2 string def\r          /BuildGlyph\r            {\r                      exch begin               \r                              _basefont setfont\r                              _bcstr2 1 2 index 256 mod put\r                          _bcstr2 0 3 -1 roll 256 idiv put\r                               _bcstr2 dup _setwidthProc                \r                              3 copy \r                                moveto\r                         show\r                           _basefonto setfont\r                             moveto\r                         show\r                   end\r            }bind def\r               currentdict\r    end \rdef\r}if\rLevel2?{setglobal}if\r/ct_CopyFont{\r       {\r              1 index/FID ne 2 index/UniqueID ne and\r         {def}{pop pop}ifelse\r   }forall\r}bind def\r/ct_Type0CopyFont \r{\r exch\r   dup length dict\r        begin\r  ct_CopyFont\r    [\r      exch\r   FDepVector \r    {\r               dup/FontType get 0 eq\r         {       \r               1 index ct_Type0CopyFont \r              /_ctType0 exch definefont\r              }\r              {\r              /_ctBaseFont exch\r              2 index exec\r           }\r               ifelse \r                exch\r  }\r      forall \r        pop\r    ]                               \r       /FDepVector exch def\r   currentdict\r    end\r}bind def\r/ct_MakeBoldFont\r{\r        dup/ct_SyntheticBold known\r    {\r              dup length 3 add dict begin \r           ct_CopyFont \r           /ct_StrokeWidth .03 0 FontMatrix idtransform pop def \r          /ct_SyntheticBold true def\r             currentdict \r           end \r           definefont\r     }\r      {\r              dup dup length 3 add dict\r              begin\r                  ct_CopyFont\r                    /PaintType 2 def\r                       /StrokeWidth .03 0 FontMatrix idtransform pop def\r                      /dummybold currentdict\r         end\r            definefont\r             dup/FontType get dup 9 ge exch 11 le and \r              {\r                      ct_BoldBaseCIDFont\r                     dup length 3 add dict copy begin\r                       dup/CIDSystemInfo get/CIDSystemInfo exch def\r                   ct_DefineIdentity-H\r                    /_Type0Identity/Identity-H 3 -1 roll[exch]composefont\r                  /_basefont exch def\r                    /_Type0Identity/Identity-H 3 -1 roll[exch]composefont\r                  /_basefonto exch def\r                   currentdict\r                    end\r                    /CIDFont defineresource\r                }\r              {\r                      ct_BoldBaseFont\r                        dup length 3 add dict copy begin\r                       /_basefont exch def\r                    /_basefonto exch def\r                   currentdict\r                    end\r                    definefont\r             }\r              ifelse\r }\r      ifelse\r}bind def\r/ct_MakeBold{\r 1 index \r       1 index\r        findfont\r       currentglobal 5 1 roll\r dup gcheck setglobal\r           dup\r             /FontType get 0 eq\r                    {\r                              dup/WMode known{dup/WMode get 1 eq}{false}ifelse\r                               version length 4 ge\r                            and\r                                    {version 0 4 getinterval cvi 2015 ge}\r                                  {true}\r                         ifelse \r                                        {/ct_Type0WidthProc}\r                                   {/ct_Type0WMode1WidthProc}\r                             ifelse\r                         ct_BoldBaseFont/_setwidthProc 3 -1 roll load put\r                                               {ct_MakeBoldFont}ct_Type0CopyFont definefont\r                   }\r                      {\r                              dup/_fauxfont known not 1 index/SubstMaster known not and\r                              {\r                                       ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put\r                                  ct_MakeBoldFont \r                              }\r                              {\r                              2 index 2 index eq\r                                     {exch pop       }\r                                      {\r                                              dup length dict begin\r                                          ct_CopyFont\r                                            currentdict\r                                            end\r                                            definefont \r                                    }\r                              ifelse\r                         }\r                      ifelse\r                 }\r               ifelse\r                 pop pop pop\r            setglobal\r}bind def\r/?str1 256 string def\r/?set\r       {\r      $SubstituteFont\r                begin\r          /$substituteFound false def\r            /$fontname 1 index def\r         /$doSmartSub false def\r         end\r    dup\r     findfont\r      $SubstituteFont\r                begin\r          $substituteFound\r                       {false}\r                        {\r                      dup/FontName known\r                             {\r                              dup/FontName get $fontname eq\r                          1 index/DistillerFauxFont known not and\r                                /currentdistillerparams where\r                                  {pop false 2 index isWidthsOnlyFont not and}\r                           if\r                             }\r                              {false}\r                        ifelse\r                 }\r              ifelse\r         exch pop\r               /$doSmartSub true def\r          end\r            {\r              5 1 roll pop pop pop pop\r               findfont\r               }\r              {\r              1 index\r                findfont\r               dup/FontType get 3 eq\r          {\r                      6 1 roll pop pop pop pop pop false\r             }\r              {pop true}\r             ifelse\r         {\r              $SubstituteFont\r                begin\r          pop pop\r                /$styleArray 1 index def\r               /$regOrdering 2 index def\r              pop pop\r                0 1 $styleArray length 1 sub\r           {\r                      $styleArray exch get\r                   ct_StyleDicts $regOrdering\r                     2 copy known\r                   {\r                              get\r                            exch 2 copy known not\r                          {pop/Default}\r                          if\r                             get\r                            dup type/nametype eq\r                           {\r                              ?str1 cvs length dup 1 add exch\r                                ?str1 exch(-)putinterval\r                               exch dup length exch ?str1 exch 3 index exch putinterval\r                               add ?str1 exch 0 exch getinterval cvn\r                          }\r                              {\r                              pop pop/Unknown\r                                }\r                              ifelse\r                 }\r                      {\r                              pop pop pop pop/Unknown\r                        }\r                      ifelse\r         }\r              for\r            end\r            findfont \r              }if\r            }\r      ifelse\r currentglobal false setglobal 3 1 roll\r null copyfont definefont pop\r   setglobal\r      }bind def\rsetpacking\ruserdict/$SubstituteFont 25 dict put\r1 dict\r       begin\r  /SubstituteFont\r                dup $error exch 2 copy known\r                   {get}\r                  {pop pop{pop/Courier}bind}\r             ifelse def\r     /currentdistillerparams where dup\r              {\r              pop pop\r                currentdistillerparams/CannotEmbedFontPolicy 2 copy known\r                      {get/Error eq}\r                 {pop pop false}\r                ifelse\r         }\r      if not\r         {\r              countdictstack array dictstack 0 get\r                   begin\r                  userdict\r                               begin\r                          $SubstituteFont\r                                        begin\r                                  /$str 128 string def\r                                   /$fontpat 128 string def\r                                       /$slen 0 def\r                                   /$sname null def\r                                       /$match false def\r                                      /$fontname null def\r                                    /$substituteFound false def\r                                    /$inVMIndex null def\r                                   /$doSmartSub true def\r                                  /$depth 0 def\r                                  /$fontname null def\r                                    /$italicangle 26.5 def\r                                 /$dstack null def\r                                      /$Strategies 10 dict dup\r                                               begin\r                                          /$Type3Underprint\r                                                      {\r                                                      currentglobal exch false setglobal\r                                                     11 dict\r                                                                begin\r                                                          /UseFont exch\r                                                                  $WMode 0 ne\r                                                                            {\r                                                                              dup length dict copy\r                                                                           dup/WMode $WMode put\r                                                                           /UseFont exch definefont\r                                                                               }\r                                                                      if def\r                                                         /FontName $fontname dup type/stringtype eq{cvn}if def\r                                                          /FontType 3 def\r                                                                /FontMatrix[.001 0 0 .001 0 0]def\r                                                              /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def\r                                                           /FontBBox[0 0 0 0]def\r                                                          /CCInfo 7 dict dup\r                                                                     begin\r                                                                  /cc null def\r                                                                   /x 0 def\r                                                                       /y 0 def\r                                                                       end def\r                                                                /BuildChar\r                                                                     {\r                                                                      exch\r                                                                           begin\r                                                                          CCInfo\r                                                                                 begin\r                                                                                  1 string dup 0 3 index put exch pop\r                                                                                    /cc exch def\r                                                                                   UseFont 1000 scalefont setfont\r                                                                                 cc stringwidth/y exch def/x exch def\r                                                                                   x y setcharwidth\r                                                                                       $SubstituteFont/$Strategy get/$Underprint get exec\r                                                                                     0 0 moveto cc show\r                                                                                     x y moveto\r                                                                                     end\r                                                                            end\r                                                                    }bind def\r                                                              currentdict\r                                                            end\r                                                    exch setglobal\r                                                 }bind def\r                                              /$GetaTint\r                                                     2 dict dup\r                                                             begin\r                                                          /$BuildFont\r                                                                    {\r                                                                      dup/WMode known\r                                                                                {dup/WMode get}\r                                                                                {0}\r                                                                    ifelse\r                                                                 /$WMode exch def\r                                                                       $fontname exch\r                                                                 dup/FontName known\r                                                                             {\r                                                                              dup/FontName get\r                                                                               dup type/stringtype eq{cvn}if\r                                                                          }\r                                                                              {/unnamedfont}\r                                                                 ifelse\r                                                                 exch\r                                                                   Adobe_CoolType_Data/InVMDeepCopiedFonts get\r                                                                    1 index/FontName get known\r                                                                             {\r                                                                              pop\r                                                                            Adobe_CoolType_Data/InVMDeepCopiedFonts get\r                                                                            1 index get\r                                                                            null copyfont\r                                                                          }\r                                                                              {$deepcopyfont}\r                                                                        ifelse\r                                                                 exch 1 index exch/FontBasedOn exch put\r                                                                 dup/FontName $fontname dup type/stringtype eq{cvn}if put\r                                                                       definefont\r                                                                     Adobe_CoolType_Data/InVMDeepCopiedFonts get\r                                                                            begin\r                                                                          dup/FontBasedOn get 1 index def\r                                                                                end\r                                                                    }bind def\r                                                              /$Underprint\r                                                                   {\r                                                                      gsave\r                                                                  x abs y abs gt\r                                                                         {/y 1000 def}\r                                                                          {/x -1000 def 500 120 translate}\r                                                                       ifelse\r                                                                 Level2?\r                                                                                {\r                                                                              [/Separation(All)/DeviceCMYK{0 0 0 1 pop}]\r                                                                             setcolorspace\r                                                                          }\r                                                                              {0 setgray}\r                                                                    ifelse\r                                                                 10 setlinewidth\r                                                                        x .8 mul\r                                                                       [7 3]\r                                                                          {\r                                                                              y mul 8 div 120 sub x 10 div exch moveto\r                                                                               0 y 4 div neg rlineto\r                                                                          dup 0 rlineto\r                                                                          0 y 4 div rlineto\r                                                                              closepath\r                                                                              gsave\r                                                                          Level2?\r                                                                                        {.2 setcolor}\r                                                                                  {.8 setgray}\r                                                                           ifelse\r                                                                         fill grestore\r                                                                          stroke\r                                                                         }\r                                                                      forall\r                                                                 pop\r                                                                    grestore\r                                                                       }bind def\r                                                              end def\r                                                /$Oblique\r                                                      1 dict dup\r                                                             begin\r                                                          /$BuildFont\r                                                                    {\r                                                                      currentglobal exch dup gcheck setglobal\r                                                                        null copyfont\r                                                                          begin\r                                                                          /FontBasedOn\r                                                                           currentdict/FontName known\r                                                                                     {\r                                                                                      FontName\r                                                                                       dup type/stringtype eq{cvn}if\r                                                                                  }\r                                                                                      {/unnamedfont}\r                                                                         ifelse\r                                                                         def\r                                                                            /FontName $fontname dup type/stringtype eq{cvn}if def\r                                                                          /currentdistillerparams where\r                                                                                  {pop}\r                                                                                  {\r                                                                                      /FontInfo currentdict/FontInfo known\r                                                                                           {FontInfo null copyfont}\r                                                                                               {2 dict}\r                                                                                       ifelse\r                                                                                 dup\r                                                                                            begin\r                                                                                          /ItalicAngle $italicangle def\r                                                                                          /FontMatrix FontMatrix\r                                                                                         [1 0 ItalicAngle dup sin exch cos div 1 0 0]\r                                                                                           matrix concatmatrix readonly\r                                                                                           end\r                                                                                    4 2 roll def\r                                                                                   def\r                                                                                    }\r                                                                              ifelse\r                                                                         FontName currentdict\r                                                                           end\r                                                                    definefont\r                                                                     exch setglobal\r                                                                 }bind def\r                                                              end def\r                                                /$None\r                                                 1 dict dup\r                                                             begin\r                                                          /$BuildFont{}bind def\r                                                          end def\r                                                end def\r                                        /$Oblique SetSubstituteStrategy\r                                        /$findfontByEnum\r                                               {\r                                              dup type/stringtype eq{cvn}if\r                                          dup/$fontname exch def\r                                         $sname null eq\r                                                 {$str cvs dup length $slen sub $slen getinterval}\r                                                      {pop $sname}\r                                           ifelse\r                                         $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval\r                                             /$match false def\r                                              $SubstituteFont/$dstack countdictstack array dictstack put\r                                             mark\r                                                   {\r                                                      $fontpat 0 $slen 7 add getinterval\r                                                             {/$match exch def exit}\r                                                        $str filenameforall\r                                                    }\r                                              stopped\r                                                        {\r                                                      cleardictstack\r                                                 currentdict\r                                                    true\r                                                   $SubstituteFont/$dstack get\r                                                            {\r                                                              exch\r                                                                   {\r                                                                      1 index eq\r                                                                             {pop false}\r                                                                            {true}\r                                                                 ifelse\r                                                                 }\r                                                                      {begin false}\r                                                          ifelse\r                                                         }\r                                                      forall\r                                                 pop\r                                                    }\r                                              if\r                                             cleartomark\r                                            /$slen 0 def\r                                           $match false ne\r                                                        {$match(fonts/)anchorsearch pop pop cvn}\r                                                       {/Courier}\r                                             ifelse\r                                         }bind def\r                                      /$ROS 1 dict dup\r                                               begin\r                                          /Adobe 4 dict dup\r                                                      begin\r                                                  /Japan1 [/Ryumin-Light/HeiseiMin-W3\r                                                                             /GothicBBB-Medium/HeiseiKakuGo-W5\r                                                                              /HeiseiMaruGo-W4/Jun101-Light]def\r                                                     /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def\r                                                       /GB1     [/STSong-Light/STHeiti-Regular]def\r                                                    /CNS1   [/MKai-Medium/MHei-Medium]def\r                                                  end def\r                                                end def\r                                        /$cmapname null def\r                                    /$deepcopyfont\r                                         {\r                                              dup/FontType get 0 eq\r                                                  {\r                                                      1 dict dup/FontName/copied put copyfont\r                                                                begin\r                                                          /FDepVector FDepVector copyarray\r                                                               0 1 2 index length 1 sub\r                                                                       {\r                                                                      2 copy get $deepcopyfont\r                                                                       dup/FontName/copied put\r                                                                        /copied exch definefont\r                                                                        3 copy put pop pop\r                                                                     }\r                                                              for\r                                                            def\r                                                            currentdict\r                                                            end\r                                                    }\r                                                      {$Strategies/$Type3Underprint get exec}\r                                                ifelse\r                                         }bind def\r                                      /$buildfontname\r                                                {\r                                              dup/CIDFont findresource/CIDSystemInfo get\r                                                     begin\r                                                  Registry length Ordering length Supplement 8 string cvs\r                                                        3 copy length 2 add add add string\r                                                     dup 5 1 roll dup 0 Registry putinterval\r                                                        dup 4 index(-)putinterval\r                                                      dup 4 index 1 add Ordering putinterval\r                                                 4 2 roll add 1 add 2 copy(-)putinterval\r                                                        end\r                                            1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch\r                                            anchorsearch\r                                                   {pop pop 3 2 roll putinterval cvn/$cmapname exch def}\r                                                  {pop pop pop pop pop}\r                                          ifelse\r                                         length\r                                         $str 1 index(-)putinterval 1 add\r                                               $str 1 index $cmapname $fontpat cvs putinterval\r                                                $cmapname length add\r                                           $str exch 0 exch getinterval cvn\r                                               }bind def\r                                      /$findfontByROS\r                                                {\r                                              /$fontname exch def\r                                            $ROS Registry 2 copy known\r                                                     {\r                                                      get Ordering 2 copy known\r                                                              {get}\r                                                          {pop pop[]}\r                                                    ifelse\r                                                 }\r                                                      {pop pop[]}\r                                            ifelse\r                                         false exch\r                                                     {\r                                                      dup/CIDFont resourcestatus\r                                                             {\r                                                              pop pop\r                                                                save\r                                                           1 index/CIDFont findresource\r                                                           dup/WidthsOnly known\r                                                                   {dup/WidthsOnly get}\r                                                                   {false}\r                                                                ifelse\r                                                         exch pop\r                                                               exch restore\r                                                                   {pop}\r                                                                  {exch pop true exit}\r                                                           ifelse\r                                                         }\r                                                              {pop}\r                                                  ifelse\r                                                 }\r                                              forall\r                                                 {$str cvs $buildfontname}\r                                                      {\r                                                      false(*)\r                                                               {\r                                                              save exch\r                                                              dup/CIDFont findresource\r                                                               dup/WidthsOnly known\r                                                                   {dup/WidthsOnly get not}\r                                                                       {true}\r                                                         ifelse\r                                                         exch/CIDSystemInfo get\r                                                         dup/Registry get Registry eq\r                                                           exch/Ordering get Ordering eq and and\r                                                                  {exch restore exch pop true exit}\r                                                                      {pop restore}\r                                                          ifelse\r                                                         }\r                                                      $str/CIDFont resourceforall\r                                                            {$buildfontname}\r                                                               {$fontname $findfontByEnum}\r                                                    ifelse\r                                                 }\r                                              ifelse\r                                         }bind def\r                                      end\r                            end\r                            currentdict/$error known currentdict/languagelevel known and dup\r                                       {pop $error/SubstituteFont known}\r                              if\r                             dup\r                                    {$error}\r                                       {Adobe_CoolType_Core}\r                          ifelse\r                         begin\r                                  {\r                                      /SubstituteFont\r                                        /CMap/Category resourcestatus\r                                          {\r                                              pop pop\r                                                {\r                                              $SubstituteFont\r                                                        begin\r                                                  /$substituteFound true def\r                                                     dup length $slen gt\r                                                    $sname null ne or\r                                                      $slen 0 gt and\r                                                         {\r                                                              $sname null eq\r                                                                 {dup $str cvs dup length $slen sub $slen getinterval cvn}\r                                                                      {$sname}\r                                                               ifelse\r                                                         Adobe_CoolType_Data/InVMFontsByCMap get\r                                                                1 index 2 copy known\r                                                                   {\r                                                                      get\r                                                                    false exch\r                                                                             {\r                                                                              pop\r                                                                            currentglobal\r                                                                                  {\r                                                                                      GlobalFontDirectory 1 index known\r                                                                                              {exch pop true exit}\r                                                                                           {pop}\r                                                                                  ifelse\r                                                                                 }\r                                                                                      {\r                                                                                      FontDirectory 1 index known\r                                                                                            {exch pop true exit}\r                                                                                           {\r                                                                                              GlobalFontDirectory 1 index known\r                                                                                                      {exch pop true exit}\r                                                                                                   {pop}\r                                                                                          ifelse\r                                                                                         }\r                                                                                      ifelse\r                                                                                 }\r                                                                              ifelse\r                                                                         }\r                                                                      forall\r                                                                 }\r                                                                      {pop pop false}\r                                                                ifelse\r                                                                 {\r                                                                      exch pop exch pop\r                                                                      }\r                                                                      {\r                                                                      dup/CMap resourcestatus\r                                                                                {\r                                                                              pop pop\r                                                                                dup/$cmapname exch def\r                                                                         /CMap findresource/CIDSystemInfo get{def}forall\r                                                                                $findfontByROS\r                                                                         }\r                                                                              {\r                                                                              128 string cvs\r                                                                         dup(-)search\r                                                                                   {\r                                                                                      3 1 roll search\r                                                                                                {\r                                                                                              3 1 roll pop\r                                                                                                   {dup cvi}\r                                                                                              stopped\r                                                                                                        {pop pop pop pop pop $findfontByEnum}\r                                                                                                  {\r                                                                                                      4 2 roll pop pop\r                                                                                                       exch length\r                                                                                                    exch\r                                                                                                   2 index length\r                                                                                                 2 index\r                                                                                                        sub\r                                                                                                    exch 1 sub -1 0\r                                                                                                                {\r                                                                                                              $str cvs dup length\r                                                                                                            4 index\r                                                                                                                0\r                                                                                                              4 index\r                                                                                                                4 3 roll add\r                                                                                                           getinterval\r                                                                                                            exch 1 index exch 3 index exch\r                                                                                                         putinterval\r                                                                                                            dup/CMap resourcestatus\r                                                                                                                        {\r                                                                                                                      pop pop\r                                                                                                                        4 1 roll pop pop pop\r                                                                                                                   dup/$cmapname exch def\r                                                                                                                 /CMap findresource/CIDSystemInfo get{def}forall\r                                                                                                                        $findfontByROS\r                                                                                                                 true exit\r                                                                                                                      }\r                                                                                                                      {pop}\r                                                                                                          ifelse\r                                                                                                         }\r                                                                                                      for\r                                                                                                    dup type/booleantype eq\r                                                                                                                {pop}\r                                                                                                          {pop pop pop $findfontByEnum}\r                                                                                                  ifelse\r                                                                                                 }\r                                                                                              ifelse\r                                                                                         }\r                                                                                              {pop pop pop $findfontByEnum}\r                                                                                  ifelse\r                                                                                 }\r                                                                                      {pop pop $findfontByEnum}\r                                                                              ifelse\r                                                                         }\r                                                                      ifelse\r                                                                 }\r                                                              ifelse\r                                                         }\r                                                              {//SubstituteFont exec}\r                                                        ifelse\r                                                 /$slen 0 def\r                                                   end\r                                            }\r                                              }\r                                              {\r                                              {\r                                              $SubstituteFont\r                                                        begin\r                                                  /$substituteFound true def\r                                                     dup length $slen gt\r                                                    $sname null ne or\r                                                      $slen 0 gt and\r                                                         {$findfontByEnum}\r                                                              {//SubstituteFont exec}\r                                                        ifelse\r                                                 end\r                                            }\r                                              }\r                                      ifelse\r                                 bind readonly def\r                                      Adobe_CoolType_Core/scfindfont/systemfindfont load put\r                                 }\r                                      {\r                                      /scfindfont\r                                            {\r                                              $SubstituteFont\r                                                        begin\r                                                  dup systemfindfont\r                                                     dup/FontName known\r                                                             {dup/FontName get dup 3 index ne}\r                                                              {/noname true}\r                                                 ifelse\r                                                 dup\r                                                            {\r                                                              /$origfontnamefound 2 index def\r                                                                /$origfontname 4 index def/$substituteFound true def\r                                                           }\r                                                      if\r                                                     exch pop\r                                                               {\r                                                              $slen 0 gt\r                                                             $sname null ne\r                                                         3 index length $slen gt or and\r                                                                 {\r                                                                      pop dup $findfontByEnum findfont\r                                                                       dup maxlength 1 add dict\r                                                                               begin\r                                                                                  {1 index/FID eq{pop pop}{def}ifelse}\r                                                                           forall\r                                                                         currentdict\r                                                                            end\r                                                                    definefont\r                                                                     dup/FontName known{dup/FontName get}{null}ifelse\r                                                                       $origfontnamefound ne\r                                                                          {\r                                                                              $origfontname $str cvs print\r                                                                           ( substitution revised, using )print\r                                                                           dup/FontName known\r                                                                                     {dup/FontName get}{(unspecified font)}\r                                                                         ifelse\r                                                                         $str cvs print(.\n)print\r                                                                               }\r                                                                      if\r                                                                     }\r                                                                      {exch pop}\r                                                             ifelse\r                                                         }\r                                                              {exch pop}\r                                                     ifelse\r                                                 end\r                                            }bind def\r                                      }\r                              ifelse\r                         end\r                    end\r            Adobe_CoolType_Core_Defined not\r                        {\r                      Adobe_CoolType_Core/findfont\r                           {\r                              $SubstituteFont\r                                        begin\r                                  $depth 0 eq\r                                            {\r                                              /$fontname 1 index dup type/stringtype ne{$str cvs}if def\r                                              /$substituteFound false def\r                                            }\r                                      if\r                                     /$depth $depth 1 add def\r                                       end\r                            scfindfont\r                             $SubstituteFont\r                                        begin\r                                  /$depth $depth 1 sub def\r                                       $substituteFound $depth 0 eq and\r                                               {\r                                              $inVMIndex null ne\r                                                     {dup $inVMIndex $AddInVMFont}\r                                          if\r                                             $doSmartSub\r                                                    {\r                                                      currentdict/$Strategy known\r                                                            {$Strategy/$BuildFont get exec}\r                                                        if\r                                                     }\r                                              if\r                                             }\r                                      if\r                                     end\r                            }bind put\r                      }\r              if\r             }\r      if\r     end\r/$AddInVMFont\r      {\r      exch/FontName 2 copy known\r             {\r              get\r            1 dict dup begin exch 1 index gcheck def end exch\r              Adobe_CoolType_Data/InVMFontsByCMap get exch\r           $DictAdd\r               }\r              {pop pop pop}\r  ifelse\r }bind def\r/$DictAdd\r    {\r      2 copy known not\r               {2 copy 4 index length dict put}\r       if\r     Level2? not\r            {\r              2 copy get dup maxlength exch length 4 index length add lt\r             2 copy get dup length 4 index length add exch maxlength 1 index lt\r                     {\r                      2 mul dict\r                             begin\r                          2 copy get{forall}def\r                          2 copy currentdict put\r                         end\r                    }\r                      {pop}\r          ifelse\r         }\r      if\r     get\r            begin\r                  {def}\r          forall\r         end\r    }bind def\rend\rend\r%%EndResource\rcurrentglobal true setglobal\r%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0\r%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated.\r%%Version: 1.23 0\rsystemdict/languagelevel known dup\r  {currentglobal false setglobal}\r        {false}\rifelse\rexch\ruserdict/Adobe_CoolType_Utility 2 copy known\r       {2 copy get dup maxlength 27 add dict copy}\r    {27 dict}\rifelse put\rAdobe_CoolType_Utility\r    begin\r  /@eexecStartData\r                <BAB431EA07F209EB8C4348311481D9D3F76E3D15246555577D87BC510ED54E\r                118C39697FA9F6DB58128E60EB8A12FA24D7CDD2FA94D221FA9EC8DA3E5E6A1C\r               4ACECC8C2D39C54E7C946031DD156C3A6B4A09AD29E1867A>def\r  /@recognizeCIDFont null def\r    /ct_Level2? exch def\r   /ct_Clone? 1183615869 internaldict dup\r                 /CCRun known not\r                       exch/eCCRun known not\r                  ct_Level2? and or def\rct_Level2?\r       {globaldict begin currentglobal true setglobal}\rif\r     /ct_AddStdCIDMap\r               ct_Level2?\r                     {{\r                             mark\r                           Adobe_CoolType_Utility/@recognizeCIDFont currentdict put\r                                       {\r                                      ((Hex)57 StartData\r                                      0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0\r                                        7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60\r                                        d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8\r                                        cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec\r                                      }\r                              stopped\r                                        {\r                                       cleartomark\r                                    Adobe_CoolType_Utility/@recognizeCIDFont get\r                                   countdictstack dup array dictstack\r                                     exch 1 sub -1 0\r                                                {\r                                              2 copy get 3 index eq\r                                                         {1 index length exch sub 1 sub{end}repeat exit}\r                                                                {pop}\r                                           ifelse\r                                                 }\r                                      for\r                                    pop pop\r                                        Adobe_CoolType_Utility/@eexecStartData get eexec\r                                      }\r                                      {cleartomark}\r                          ifelse\r                 }}\r                     {{\r                             Adobe_CoolType_Utility/@eexecStartData get eexec\r                       }}\r             ifelse bind def\ruserdict/cid_extensions known\rdup{cid_extensions/cid_UpdateDB known and}if\r     {\r       cid_extensions\r         begin\r /cid_GetCIDSystemInfo\r          {\r               1 index type/stringtype eq\r                    {exch cvn exch}\r                 if\r             cid_extensions\r                         begin\r                  dup load 2 index known\r                                {\r                               2 copy\r                                 cid_GetStatusInfo\r                              dup null ne\r                                   {\r                                       1 index load\r                                   3 index get\r                                    dup null eq\r                                            {pop pop cid_UpdateDB}\r                                                 {\r                                              exch\r                                           1 index/Created get eq\r                                                         {exch pop exch pop}\r                                                    {pop cid_UpdateDB}\r                                             ifelse\r                                                 }\r                                      ifelse\r                                        }\r                                      {pop cid_UpdateDB}\r                              ifelse\r                                }\r                              {cid_UpdateDB}\r                  ifelse\r                         end\r           }bind def\r       end\r   }\rif\rct_Level2?\r        {end setglobal}\rif\r     /ct_UseNativeCapability? systemdict/composefont known def\r      /ct_MakeOCF 35 dict def\r        /ct_Vars 25 dict def\r   /ct_GlyphDirProcs 6 dict def\r   /ct_BuildCharDict 15 dict dup\r          begin\r          /charcode 2 string def\r         /dst_string 1500 string def\r            /nullstring()def\r               /usewidths? true def\r           end def\r        ct_Level2?{setglobal}{pop}ifelse\r       ct_GlyphDirProcs\r               begin\r          /GetGlyphDirectory\r                     {\r                      systemdict/languagelevel known\r                         {pop/CIDFont findresource/GlyphDirectory get}\r                          {\r                              1 index/CIDFont findresource/GlyphDirectory\r                            get dup type/dicttype eq\r                                       {\r                                      dup dup maxlength exch length sub 2 index lt\r                                           {\r                                              dup length 2 index add dict copy 2 index\r                                               /CIDFont findresource/GlyphDirectory 2 index put\r                                               }\r                                      if\r                                     }\r                              if\r                             exch pop exch pop\r                              }\r                      ifelse\r                 +\r                      }def\r           /+\r                     {\r                      systemdict/languagelevel known\r                         {\r                              currentglobal false setglobal\r                          3 dict begin\r                                   /vm exch def\r                           }\r                              {1 dict begin}\r                 ifelse\r                 /$ exch def\r                    systemdict/languagelevel known\r                         {\r                              vm setglobal\r                           /gvm currentglobal def\r                         $ gcheck setglobal\r                             }\r                      if\r                     ?{$ begin}if\r                   }def\r           /?{$ type/dicttype eq}def\r              /|{\r                    userdict/Adobe_CoolType_Data known\r                             {\r                      Adobe_CoolType_Data/AddWidths? known\r                           {\r                               currentdict Adobe_CoolType_Data\r                                       begin\r                                   begin\r                                         AddWidths?\r                                                             {\r                                                              Adobe_CoolType_Data/CC 3 index put\r                                                             ?{def}{$ 3 1 roll put}ifelse\r                                                           CC charcode exch 1 index 0 2 index 256 idiv put\r                                                                1 index exch 1 exch 256 mod put\r                                                                stringwidth 2 array astore\r                                                             currentfont/Widths get exch CC exch put\r                                                                }\r                                                              {?{def}{$ 3 1 roll put}ifelse}\r                                                 ifelse\r                                 end\r                            end\r                            }\r                              {?{def}{$ 3 1 roll put}ifelse}  ifelse\r                         }\r                              {?{def}{$ 3 1 roll put}ifelse}\r                 ifelse\r                 }def\r           /!\r                     {\r                      ?{end}if\r                       systemdict/languagelevel known\r                         {gvm setglobal}\r                        if\r                     end\r                    }def\r           /:{string currentfile exch readstring pop}executeonly def\r              end\r    ct_MakeOCF\r             begin\r          /ct_cHexEncoding\r               [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12\r          /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25\r           /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38\r           /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B\r           /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E\r           /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71\r           /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84\r           /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97\r           /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA\r           /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD\r           /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0\r           /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3\r           /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6\r           /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def\r               /ct_CID_STR_SIZE 8000 def\r              /ct_mkocfStr100 100 string def\r         /ct_defaultFontMtx[.001 0 0 .001 0 0]def\r               /ct_1000Mtx[1000 0 0 1000 0 0]def\r              /ct_raise{exch cvx exch errordict exch get exec stop}bind def\r          /ct_reraise\r                    {cvx $error/errorname get(Error: )print dup(                                             )cvs print\r                                    errordict exch get exec stop\r                   }bind def\r              /ct_cvnsi\r                      {\r                      1 index add 1 sub 1 exch 0 4 1 roll\r                            {\r                              2 index exch get\r                               exch 8 bitshift\r                                add\r                            }\r                      for\r                    exch pop\r                       }bind def\r              /ct_GetInterval\r                        {\r                      Adobe_CoolType_Utility/ct_BuildCharDict get\r                            begin\r                          /dst_index 0 def\r                               dup dst_string length gt\r                                       {dup string/dst_string exch def}\r                               if\r                             1 index ct_CID_STR_SIZE idiv\r                           /arrayIndex exch def\r                           2 index arrayIndex get\r                         2 index\r                                arrayIndex ct_CID_STR_SIZE mul\r                         sub\r                                    {\r                                      dup 3 index add 2 index length le\r                                              {\r                                              2 index getinterval\r                                            dst_string dst_index 2 index putinterval\r                                               length dst_index add/dst_index exch def\r                                                exit\r                                           }\r                                              {\r                                              1 index length 1 index sub\r                                             dup 4 1 roll\r                                           getinterval\r                                            dst_string dst_index 2 index putinterval\r                                               pop dup dst_index add/dst_index exch def\r                                               sub\r                                            /arrayIndex arrayIndex 1 add def\r                                               2 index dup length arrayIndex gt\r                                                        {arrayIndex get}\r                                                       {\r                                                      pop\r                                                    exit\r                                                   }\r                                             ifelse\r                                         0\r                                              }\r                                      ifelse\r                                 }\r                              loop\r                           pop pop pop\r                            dst_string 0 dst_index getinterval\r                             end\r                    }bind def\r              ct_Level2?\r                     {\r                      /ct_resourcestatus\r                     currentglobal mark true setglobal\r                              {/unknowninstancename/Category resourcestatus}\r                 stopped\r                                {cleartomark setglobal true}\r                           {cleartomark currentglobal not exch setglobal}\r                 ifelse\r                         {\r                                      {\r                                      mark 3 1 roll/Category findresource\r                                            begin\r                                          ct_Vars/vm currentglobal put\r                                           ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec\r                                                     {cleartomark false}\r                                                    {{3 2 roll pop true}{cleartomark false}ifelse}\r                                         ifelse\r                                         ct_Vars/vm get setglobal\r                                               end\r                                    }\r                              }\r                              {{resourcestatus}}\r                     ifelse bind def\r                        /CIDFont/Category ct_resourcestatus\r                            {pop pop}\r                              {\r                              currentglobal true setglobal\r                           /Generic/Category findresource\r                         dup length dict copy\r                           dup/InstanceType/dicttype put\r                          /CIDFont exch/Category defineresource pop\r                              setglobal\r                              }\r                      ifelse\r                 ct_UseNativeCapability?\r                                {\r                              /CIDInit/ProcSet findresource begin\r                            12 dict begin\r                          begincmap\r                              /CIDSystemInfo 3 dict dup begin\r                                 /Registry(Adobe)def\r                            /Ordering(Identity)def\r                                 /Supplement 0 def\r                             end def\r                                /CMapName/Identity-H def\r                               /CMapVersion 1.000 def\r                         /CMapType 1 def\r                                1 begincodespacerange\r                          <0000><FFFF>\r                           endcodespacerange\r                              1 begincidrange\r                                <0000><FFFF>0\r                          endcidrange\r                            endcmap\r                                CMapName currentdict/CMap defineresource pop\r                           end\r                            end\r                            }\r                      if\r                     }\r                      {\r                      /ct_Category 2 dict begin\r                      /CIDFont 10 dict def\r                   /ProcSet        2 dict def\r                     currentdict\r                    end\r                    def\r                    /defineresource\r                                {\r                              ct_Category 1 index 2 copy known\r                                       {\r                                      get\r                                    dup dup maxlength exch length eq\r                                               {\r                                              dup length 10 add dict copy\r                                            ct_Category 2 index 2 index put\r                                                }\r                                      if\r                                     3 index 3 index put\r                                    pop exch pop\r                                   }\r                                      {pop pop/defineresource/undefined ct_raise}\r                            ifelse\r                         }bind def\r                      /findresource\r                          {\r                              ct_Category 1 index 2 copy known\r                                       {\r                                      get\r                                    2 index 2 copy known\r                                           {get 3 1 roll pop pop}\r                                         {pop pop/findresource/undefinedresource ct_raise}\r                                      ifelse\r                                 }\r                                      {pop pop/findresource/undefined ct_raise}\r                              ifelse\r                         }bind def\r                      /resourcestatus\r                                {\r                              ct_Category 1 index 2 copy known\r                                       {\r                                      get\r                                    2 index known\r                                  exch pop exch pop\r                                              {\r                                              0 -1 true\r                                              }\r                                              {\r                                              false\r                                          }\r                                      ifelse\r                                 }\r                                      {pop pop/findresource/undefined ct_raise}\r                              ifelse\r                         }bind def\r                      /ct_resourcestatus/resourcestatus load def\r                     }\r              ifelse\r         /ct_CIDInit 2 dict\r                     begin\r                  /ct_cidfont_stream_init\r                                {\r                                      {\r                                      dup(Binary)eq\r                                          {\r                                              pop\r                                            null\r                                           currentfile\r                                            ct_Level2?\r                                                     {\r                                                              {cid_BYTE_COUNT()/SubFileDecode filter}\r                                                        stopped\r                                                                {pop pop pop}\r                                                  if\r                                                     }\r                                              if\r                                             /readstring load\r                                               exit\r                                           }\r                                      if\r                                     dup(Hex)eq\r                                             {\r                                              pop\r                                            currentfile\r                                            ct_Level2?\r                                                     {\r                                                              {null exch/ASCIIHexDecode filter/readstring}\r                                                   stopped\r                                                                {pop exch pop(>)exch/readhexstring}\r                                                    if\r                                                     }\r                                                      {(>)exch/readhexstring}\r                                                ifelse\r                                         load\r                                           exit\r                                           }\r                                      if\r                                     /StartData/typecheck ct_raise\r                                  }\r                              loop\r                           cid_BYTE_COUNT ct_CID_STR_SIZE le\r                                      {\r                                      2 copy cid_BYTE_COUNT string exch exec\r                                 pop\r                                    1 array dup\r                                    3 -1 roll\r                                      0 exch put\r                                     }\r                                      {\r                                      cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi\r                                 dup array exch 2 sub 0 exch 1 exch\r                                             {\r                                              2 copy\r                                         5 index\r                                                ct_CID_STR_SIZE\r                                                string\r                                         6 index exec\r                                           pop\r                                            put\r                                            pop\r                                            }\r                                      for\r                                    2 index\r                                        cid_BYTE_COUNT ct_CID_STR_SIZE mod string\r                                      3 index exec\r                                   pop\r                                    1 index exch\r                                   1 index length 1 sub\r                                   exch put\r                                       }\r                              ifelse\r                         cid_CIDFONT exch/GlyphData exch put\r                            2 index null eq\r                                        {\r                                      pop pop pop\r                                    }\r                                      {\r                                      pop/readstring load\r                                    1 string exch\r                                          {\r                                              3 copy exec\r                                            pop\r                                            dup length 0 eq\r                                                        {\r                                                      pop pop pop pop pop\r                                                    true exit\r                                                      }\r                                              if\r                                             4 index\r                                                eq\r                                                     {\r                                                      pop pop pop pop\r                                                        false exit\r                                                     }\r                                              if\r                                             }\r                                      loop\r                                   pop\r                                    }\r                              ifelse\r                         }bind def\r                      /StartData\r                             {\r                              mark\r                                   {\r                                      currentdict\r                                    dup/FDArray get 0 get/FontMatrix get\r                                   0 get 0.001 eq\r                                         {\r                                              dup/CDevProc known not\r                                                 {\r                                                      /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known\r                                                             {get}\r                                                          {\r                                                              pop pop\r                                                                {pop pop pop pop pop 0 -1000 7 index 2 div 880}\r                                                                }\r                                                      ifelse\r                                                 def\r                                                    }\r                                              if\r                                             }\r                                              {\r                                              /CDevProc\r                                                      {\r                                                       pop pop pop pop pop\r                                                    0\r                                                      1 cid_temp/cid_CIDFONT get\r                                                    /FDArray get 0 get\r                                                     /FontMatrix get 0 get div\r                                                       7 index 2 div\r                                                  1 index 0.88 mul\r                                                      }def\r                                           }\r                                      ifelse\r                                 /cid_temp 15 dict def\r                                  cid_temp\r                                               begin\r                                          /cid_CIDFONT exch def\r                                          3 copy pop\r                                             dup/cid_BYTE_COUNT exch def 0 gt\r                                                       {\r                                                      ct_cidfont_stream_init\r                                                 FDArray\r                                                                {\r                                                              /Private get\r                                                           dup/SubrMapOffset known\r                                                                        {\r                                                                      begin\r                                                                  /Subrs SubrCount array def\r                                                                     Subrs\r                                                                  SubrMapOffset\r                                                                  SubrCount\r                                                                      SDBytes\r                                                                        ct_Level2?\r                                                                             {\r                                                                              currentdict dup/SubrMapOffset undef\r                                                                            dup/SubrCount undef\r                                                                            /SDBytes undef\r                                                                         }\r                                                                      if\r                                                                     end\r                                                                    /cid_SD_BYTES exch def\r                                                                 /cid_SUBR_COUNT exch def\r                                                                       /cid_SUBR_MAP_OFFSET exch def\r                                                                  /cid_SUBRS exch def\r                                                                    cid_SUBR_COUNT 0 gt\r                                                                            {\r                                                                              GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval\r                                                                              0 cid_SD_BYTES ct_cvnsi\r                                                                                0 1 cid_SUBR_COUNT 1 sub\r                                                                                       {\r                                                                                      exch 1 index\r                                                                                   1 add\r                                                                                  cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add\r                                                                                       GlyphData exch cid_SD_BYTES ct_GetInterval\r                                                                                     0 cid_SD_BYTES ct_cvnsi\r                                                                                        cid_SUBRS 4 2 roll\r                                                                                     GlyphData exch\r                                                                                 4 index\r                                                                                        1 index\r                                                                                        sub\r                                                                                    ct_GetInterval\r                                                                                 dup length string copy put\r                                                                                     }\r                                                                              for\r                                                                            pop\r                                                                            }\r                                                                      if\r                                                                     }\r                                                                      {pop}\r                                                          ifelse\r                                                         }\r                                                      forall\r                                                 }\r                                              if\r                                             cleartomark pop pop\r                                            end\r                                    CIDFontName currentdict/CIDFont defineresource pop\r                                     end end\r                                        }\r                              stopped\r                                        {cleartomark/StartData ct_reraise}\r                             if\r                             }bind def\r                      currentdict\r                    end def\r                /ct_saveCIDInit\r                        {\r                      /CIDInit/ProcSet ct_resourcestatus\r                             {true}\r                         {/CIDInitC/ProcSet ct_resourcestatus}\r                  ifelse\r                         {\r                              pop pop\r                                /CIDInit/ProcSet findresource\r                          ct_UseNativeCapability?\r                                        {pop null}\r                                     {/CIDInit ct_CIDInit/ProcSet defineresource pop}\r                               ifelse\r                         }\r                              {/CIDInit ct_CIDInit/ProcSet defineresource pop null}\r                  ifelse\r                 ct_Vars exch/ct_oldCIDInit exch put\r                    }bind def\r              /ct_restoreCIDInit\r                     {\r                      ct_Vars/ct_oldCIDInit get dup null ne\r                          {/CIDInit exch/ProcSet defineresource pop}\r                             {pop}\r                  ifelse\r                 }bind def\r              /ct_BuildCharSetUp\r                     {\r                      1 index\r                                begin\r                          CIDFont\r                                        begin\r                                  Adobe_CoolType_Utility/ct_BuildCharDict get\r                                            begin\r                                          /ct_dfCharCode exch def\r                                                /ct_dfDict exch def\r                                            CIDFirstByte ct_dfCharCode add\r                                         dup CIDCount ge\r                                                        {pop 0}\r                                                if\r                                             /cid exch def\r                                                  {\r                                                      GlyphDirectory cid 2 copy known\r                                                                {get}\r                                                          {pop pop nullstring}\r                                                   ifelse\r                                                 dup length FDBytes sub 0 gt\r                                                            {\r                                                              dup\r                                                            FDBytes 0 ne\r                                                                   {0 FDBytes ct_cvnsi}\r                                                                   {pop 0}\r                                                                ifelse\r                                                         /fdIndex exch def\r                                                              dup length FDBytes sub FDBytes exch getinterval\r                                                                /charstring exch def\r                                                           exit\r                                                           }\r                                                              {\r                                                              pop\r                                                            cid 0 eq\r                                                                       {/charstring nullstring def exit}\r                                                              if\r                                                             /cid 0 def\r                                                             }\r                                                      ifelse\r                                                 }\r                                              loop\r                   }def\r           /ct_SetCacheDevice\r                     {\r                      0 0 moveto\r                     dup stringwidth\r                        3 -1 roll\r                      true charpath\r                  pathbbox\r                       0 -1000\r                        7 index 2 div 880\r                      setcachedevice2\r                        0 0 moveto\r                     }def\r           /ct_CloneSetCacheProc\r                  {\r                      1 eq\r                           {\r                              stringwidth\r                            pop -2 div -880\r                                0 -1000 setcharwidth\r                           moveto\r                         }\r                              {\r                              usewidths?\r                                     {\r                                      currentfont/Widths get cid\r                                     2 copy known\r                                           {get exch pop aload pop}\r                                               {pop pop stringwidth}\r                                  ifelse\r                                 }\r                                      {stringwidth}\r                          ifelse\r                         setcharwidth\r                           0 0 moveto\r                             }\r                      ifelse\r                 }def\r           /ct_Type3ShowCharString\r                        {\r                      ct_FDDict fdIndex 2 copy known\r                         {get}\r                          {\r                              currentglobal 3 1 roll\r                         1 index gcheck setglobal\r                               ct_Type1FontTemplate dup maxlength dict copy\r                                   begin\r                                  FDArray fdIndex get\r                                    dup/FontMatrix 2 copy known\r                                            {get}\r                                          {pop pop ct_defaultFontMtx}\r                                    ifelse\r                                 /FontMatrix exch dup length array copy def\r                                     /Private get\r                                   /Private exch def\r                                      /Widths rootfont/Widths get def\r                                        /CharStrings 1 dict dup/.notdef\r                                                <d841272cf18f54fc13>dup length string copy put def\r                                     currentdict\r                                    end\r                            /ct_Type1Font exch definefont\r                          dup 5 1 roll put\r                               setglobal\r                              }\r                      ifelse\r                 dup/CharStrings get 1 index/Encoding get\r                       ct_dfCharCode get charstring put\r                       rootfont/WMode 2 copy known\r                            {get}\r                          {pop pop 0}\r                    ifelse\r                 exch\r                   1000 scalefont setfont\r                 ct_str1 0 ct_dfCharCode put\r                    ct_str1 exch ct_dfSetCacheProc\r                 ct_SyntheticBold\r                               {\r                              currentpoint\r                           ct_str1 show\r                           newpath\r                                moveto\r                         ct_str1 true charpath\r                          ct_StrokeWidth setlinewidth\r                            stroke\r                         }\r                              {ct_str1 show}\r                 ifelse\r                 }def\r           /ct_Type4ShowCharString\r                        {\r                      ct_dfDict ct_dfCharCode charstring\r                     FDArray fdIndex get\r                    dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not\r                               {ct_1000Mtx matrix concatmatrix concat}\r                                {pop}\r                  ifelse\r                 /Private get\r                   Adobe_CoolType_Utility/ct_Level2? get not\r                              {\r                              ct_dfDict/Private\r                              3 -1 roll\r                                      {put}\r                          1183615869 internaldict/superexec get exec\r                             }\r                      if\r                     1183615869 internaldict\r                        Adobe_CoolType_Utility/ct_Level2? get\r                          {1 index}\r                              {3 index/Private get mark 6 1 roll}\r                    ifelse\r                 dup/RunInt known\r                               {/RunInt get}\r                          {pop/CCRun}\r                    ifelse\r                 get exec\r                       Adobe_CoolType_Utility/ct_Level2? get not\r                              {cleartomark}\r                  if\r                     }bind def\r              /ct_BuildCharIncremental\r                       {\r                              {\r                              Adobe_CoolType_Utility/ct_MakeOCF get begin\r                            ct_BuildCharSetUp\r                              ct_ShowCharString\r                              }\r                      stopped\r                                {stop}\r                 if\r                     end\r                    end\r                    end\r                    end\r                    }bind def\r              /BaseFontNameStr(BF00)def\r              /ct_Type1FontTemplate 14 dict\r                  begin\r                  /FontType 1 def\r                        /FontMatrix [0.001 0 0 0.001 0 0]def\r                   /FontBBox [-250 -250 1250 1250]def\r                     /Encoding ct_cHexEncoding def\r                  /PaintType 0 def\r                       currentdict\r                    end def\r                /BaseFontTemplate 11 dict\r                      begin\r                  /FontMatrix [0.001 0 0 0.001 0 0]def\r                   /FontBBox [-250 -250 1250 1250]def\r                     /Encoding ct_cHexEncoding def\r                  /BuildChar/ct_BuildCharIncremental load def\r                    ct_Clone?\r                              {\r                              /FontType 3 def\r                                /ct_ShowCharString/ct_Type3ShowCharString load def\r                             /ct_dfSetCacheProc/ct_CloneSetCacheProc load def\r                               /ct_SyntheticBold false def\r                            /ct_StrokeWidth 1 def\r                          }\r                              {\r                              /FontType 4 def\r                                /Private 1 dict dup/lenIV 4 put def\r                            /CharStrings 1 dict dup/.notdef<d841272cf18f54fc13>put def\r                             /PaintType 0 def\r                               /ct_ShowCharString/ct_Type4ShowCharString load def\r                             }\r                      ifelse\r                 /ct_str1 1 string def\r                  currentdict\r                    end def\r                /BaseFontDictSize BaseFontTemplate length 5 add def\r            /ct_matrixeq\r                   {\r                      true 0 1 5\r                             {\r                              dup 4 index exch get exch 3 index exch get eq and\r                              dup not\r                                        {exit}\r                         if\r                             }\r                      for\r                    exch pop exch pop\r                      }bind def\r              /ct_makeocf\r                    {\r                      15 dict\r                                begin\r                          exch/WMode exch def\r                            exch/FontName exch def\r                         /FontType 0 def\r                                /FMapType 2 def\r                        dup/FontMatrix known\r                           {dup/FontMatrix get/FontMatrix exch def}\r                               {/FontMatrix matrix def}\r                       ifelse\r                         /bfCount 1 index/CIDCount get 256 idiv 1 add\r                                   dup 256 gt{pop 256}if def\r                              /Encoding\r                                      256 array 0 1 bfCount 1 sub{2 copy dup put pop}for\r                                     bfCount 1 255{2 copy bfCount put pop}for\r                                       def\r                            /FDepVector bfCount dup 256 lt{1 add}if array def\r                              BaseFontTemplate BaseFontDictSize dict copy\r                                    begin\r                                  /CIDFont exch def\r                                      CIDFont/FontBBox known\r                                         {CIDFont/FontBBox get/FontBBox exch def}\r                                       if\r                                     CIDFont/CDevProc known\r                                         {CIDFont/CDevProc get/CDevProc exch def}\r                                       if\r                                     currentdict\r                                    end\r                            BaseFontNameStr 3(0)putinterval\r                                0 1 bfCount dup 256 eq{1 sub}if\r                                        {\r                                      FDepVector exch\r                                        2 index BaseFontDictSize dict copy\r                                             begin\r                                          dup/CIDFirstByte exch 256 mul def\r                                              FontType 3 eq\r                                                  {/ct_FDDict 2 dict def}\r                                                if\r                                             currentdict\r                                            end\r                                    1 index 16\r                                     BaseFontNameStr 2 2 getinterval cvrs pop\r                                       BaseFontNameStr exch definefont\r                                        put\r                                    }\r                              for\r                            ct_Clone?\r                                      {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def}\r                               if\r                             FontName\r                               currentdict\r                            end\r                    definefont\r                     ct_Clone?\r                              {\r                              gsave\r                          dup 1000 scalefont setfont\r                             ct_BuildCharDict\r                                       begin\r                                  /usewidths? false def\r                                  currentfont/Widths get\r                                         begin\r                                          exch/CIDFont get/GlyphDirectory get\r                                                    {\r                                                      pop\r                                                    dup charcode exch 1 index 0 2 index 256 idiv put\r                                                       1 index exch 1 exch 256 mod put\r                                                        stringwidth 2 array astore def\r                                                 }\r                                              forall\r                                         end\r                                    /usewidths? true def\r                                   end\r                            grestore\r                               }\r                              {exch pop}\r                     ifelse\r                 }bind def\r              currentglobal true setglobal\r           /ct_ComposeFont\r                        {\r                      ct_UseNativeCapability?\r                                {                               \r                               2 index/CMap ct_resourcestatus\r                                 {pop pop exch pop}\r                                     {\r                                      /CIDInit/ProcSet findresource\r                                          begin\r                                          12 dict\r                                                        begin\r                                                  begincmap\r                                                      /CMapName 3 index def\r                                                  /CMapVersion 1.000 def\r                                                 /CMapType 1 def\r                                                        exch/WMode exch def\r                                                    /CIDSystemInfo 3 dict dup\r                                                              begin\r                                                          /Registry(Adobe)def\r                                                            /Ordering\r                                                              CMapName ct_mkocfStr100 cvs\r                                                            (Adobe-)search\r                                                                 {\r                                                                      pop pop\r                                                                        (-)search\r                                                                              {\r                                                                              dup length string copy\r                                                                         exch pop exch pop\r                                                                              }\r                                                                              {pop(Identity)}\r                                                                        ifelse\r                                                                 }\r                                                                      {pop (Identity)}\r                                                               ifelse\r                                                         def\r                                                            /Supplement 0 def\r                                                              end def\r                                                        1 begincodespacerange\r                                                  <0000><FFFF>\r                                                   endcodespacerange\r                                                      1 begincidrange\r                                                        <0000><FFFF>0\r                                                  endcidrange\r                                                    endcmap\r                                                        CMapName currentdict/CMap defineresource pop\r                                                   end\r                                            end\r                                    }\r                              ifelse\r                         composefont\r                            }\r                              {\r                              3 2 roll pop\r                           0 get/CIDFont findresource\r                             ct_makeocf\r                             }\r                      ifelse\r                 }bind def\r                      setglobal\r              /ct_MakeIdentity\r                       {\r                      ct_UseNativeCapability?\r                                {\r                              1 index/CMap ct_resourcestatus\r                                 {pop pop}\r                                      {\r                                      /CIDInit/ProcSet findresource begin\r                                    12 dict begin\r                                  begincmap\r                                      /CMapName 2 index def\r                                  /CMapVersion 1.000 def\r                                 /CMapType 1 def\r                                        /CIDSystemInfo 3 dict dup\r                                              begin\r                                          /Registry(Adobe)def\r                                            /Ordering\r                                              CMapName ct_mkocfStr100 cvs\r                                            (Adobe-)search\r                                                 {\r                                                      pop pop\r                                                        (-)search\r                                                              {dup length string copy exch pop exch pop}\r                                                             {pop(Identity)}\r                                                        ifelse\r                                                 }\r                                                      {pop(Identity)}\r                                                ifelse\r                                         def\r                                            /Supplement 0 def\r                                              end def\r                                        1 begincodespacerange\r                                  <0000><FFFF>\r                                   endcodespacerange\r                                      1 begincidrange\r                                        <0000><FFFF>0\r                                  endcidrange\r                                    endcmap\r                                        CMapName currentdict/CMap defineresource pop\r                                   end\r                                    end\r                                    }\r                              ifelse\r                         composefont\r                            }\r                              {\r                              exch pop\r                               0 get/CIDFont findresource\r                             ct_makeocf\r                             }\r                      ifelse\r                 }bind def\r              currentdict readonly pop\r               end\r    end\r%%EndResource\rsetglobal\r%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0\r%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated.\r%%Version: 1.0 0\ruserdict/ct_T42Dict 15 dict put\rct_T42Dict begin\r/Is2015?\r{\r version\r cvi\r 2015\r ge\r}bind def\r/AllocGlyphStorage\r{\r Is2015?\r {      \r       pop\r }\r {\r      {string}forall\r }ifelse\r}bind def\r/Type42DictBegin\r{\r25 dict begin\r /FontName exch def\r /CharStrings 256 dict \rbegin\r    /.notdef 0 def\r         currentdict \rend def\r /Encoding exch def\r /PaintType 0 def\r /FontType 42 def\r /FontMatrix[1 0 0 1 0 0]def\r 4 array astore cvx/FontBBox exch def\r /sfnts\r}bind def\r/Type42DictEnd \r{\r currentdict dup/FontName get exch definefont end\rct_T42Dict exch\rdup/FontName get exch put\r}bind def\r/RD{string currentfile exch readstring pop}executeonly def\r/PrepFor2015\r{\rIs2015?\r{           \r      /GlyphDirectory \r        16\r     dict def\r       sfnts 0 get\r    dup\r    2 index\r       (glyx)\r  putinterval\r    2 index \r      (locx)\r  putinterval\r    pop\r    pop\r}\r{\r        pop\r    pop\r}ifelse                    \r}bind def\r/AddT42Char\r{\rIs2015?\r{\r     /GlyphDirectory get \r   begin\r  def\r    end\r    pop\r    pop\r}\r{\r        /sfnts get\r     4 index\r        get\r    3 index\r 2 index\r       putinterval\r    pop\r    pop\r    pop\r    pop\r}ifelse\r}bind def\r/T0AddT42Mtx2\r{\r/CIDFont findresource/Metrics2 get begin def end\r}bind def\rend\r%%EndResource\rcurrentglobal true setglobal\r%%BeginFile: MMFauxFont.prc\r%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. \r%%All Rights Reserved.\ruserdict /ct_EuroDict 10 dict put\rct_EuroDict begin\r/ct_CopyFont \r{\r    { 1 index /FID ne {def} {pop pop} ifelse} forall\r} def\r/ct_GetGlyphOutline\r{\r   gsave\r   initmatrix newpath\r   exch findfont dup \r   length 1 add dict \r   begin \r             ct_CopyFont \r           /Encoding Encoding dup length array copy \r              dup\r            4 -1 roll\r              0 exch put   \r          def\r            currentdict\r   end\r   /ct_EuroFont exch definefont\r   1000 scalefont setfont\r   0 0 moveto\r   [\r       <00> stringwidth \r       <00> false charpath\r       pathbbox\r       [\r       {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall\r   grestore\r   counttomark 8 add\r}\rdef\r/ct_MakeGlyphProc\r{\r   ] cvx\r   /ct_PSBuildGlyph cvx\r   ] cvx\r} def\r/ct_PSBuildGlyph \r\r    gsave \r 8 -1 roll pop \r 7 1 roll \r        6 -2 roll ct_FontMatrix transform 6 2 roll\r        4 -2 roll ct_FontMatrix transform 4 2 roll\r        ct_FontMatrix transform \r       currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse  \r dup  9 1 roll \r {  \r            currentdict /StrokeWidth 2 copy known  \r                {   \r                   get 2 div   \r                   0 ct_FontMatrix dtransform pop\r                 5 1 roll  \r                     4 -1 roll 4 index sub   \r                       4 1 roll   \r                    3 -1 roll 4 index sub  \r                        3 1 roll   \r                    exch 4 index add exch  \r                        4 index add  \r                  5 -1 roll pop  \r                }  \r            {        \r                      pop pop \r               }  \r            ifelse  \r       }       \r    if  \r      setcachedevice  \r        ct_FontMatrix concat\r        ct_PSPathOps begin \r              exec \r  end \r   {  \r            currentdict /StrokeWidth 2 copy known  \r                        { get }  \r                      { pop pop 0 }  \r            ifelse  \r           setlinewidth stroke  \r  }  \r    {   \r       fill  \r     }  \r    ifelse  \r    grestore\r} def \r/ct_PSPathOps 4 dict dup begin \r   /m {moveto} def \r       /l {lineto} def \r       /c {curveto} def \r      /cp {closepath} def \rend \rdef \r/ct_matrix1000 [1000 0 0 1000 0 0] def\r/ct_AddGlyphProc  \r{\r   2 index findfont dup length 4 add dict \r   begin \r        ct_CopyFont \r   /CharStrings CharStrings dup length 1 add dict copy\r      begin\r         3 1 roll def  \r         currentdict \r      end \r      def\r      /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def\r      /ct_PSBuildGlyph /ct_PSBuildGlyph load def\r      /ct_PSPathOps /ct_PSPathOps load def\r      currentdict\r   end\r   definefont pop\r}\rdef\rsystemdict /languagelevel known\r{\r        /ct_AddGlyphToPrinterFont {\r            2 copy\r         ct_GetGlyphOutline 3 add -1 roll restore \r              ct_MakeGlyphProc \r              ct_AddGlyphProc\r        } def\r}\r{\r      /ct_AddGlyphToPrinterFont {\r        pop pop restore\r            Adobe_CTFauxDict /$$$FONTNAME get\r              /Euro\r          Adobe_CTFauxDict /$$$SUBSTITUTEBASE get\r                ct_EuroDict exch get\r           ct_AddGlyphProc\r        } def\r} ifelse\r/AdobeSansMM \r\r556 0 24 -19 541 703 \r  { \r     541 628 m \r     510 669 442 703 354 703 c \r     201 703 117 607 101 444 c \r     50 444 l \r      25 372 l \r      97 372 l \r      97 301 l \r      49 301 l \r      24 229 l \r      103 229 l \r     124 67 209 -19 350 -19 c \r      435 -19 501 25 509 32 c \r       509 131 l \r     492 105 417 60 343 60 c \r       267 60 204 127 197 229 c \r      406 229 l \r     430 301 l \r     191 301 l \r     191 372 l \r     455 372 l \r     479 444 l \r     194 444 l \r     201 531 245 624 348 624 c \r     433 624 484 583 509 534 c \r     cp \r    556 0 m \r       }\rct_PSBuildGlyph\r} def\r/AdobeSerifMM \r\r500 0 10 -12 484 692 \r        { \r     347 298 m \r     171 298 l \r     170 310 170 322 170 335 c \r     170 362 l \r     362 362 l \r     374 403 l \r     172 403 l \r     184 580 244 642 308 642 c \r     380 642 434 574 457 457 c \r     481 462 l \r     474 691 l \r     449 691 l \r     433 670 429 657 410 657 c \r     394 657 360 692 299 692 c \r     204 692 94 604 73 403 c \r       22 403 l \r      10 362 l \r      70 362 l \r      69 352 69 341 69 330 c \r        69 319 69 308 70 298 c \r        22 298 l \r      10 257 l \r      73 257 l \r      97 57 216 -12 295 -12 c \r       364 -12 427 25 484 123 c \r      458 142 l \r     425 101 384 37 316 37 c \r       256 37 189 84 173 257 c \r       335 257 l \r     cp \r    500 0 m \r       } \rct_PSBuildGlyph \r} def \rend          \r%%EndFile\rsetglobal\rAdobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end\r%%BeginResource: procset Adobe_AGM_Image 1.0 0
+%%Version: 1.0 0
+%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved.
+systemdict/setpacking known
+{
+       currentpacking
+       true setpacking
+}if
+userdict/Adobe_AGM_Image 71 dict dup begin put
+/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def
+/nd{
+       null def
+}bind def
+/AGMIMG_&image nd
+/AGMIMG_&colorimage nd
+/AGMIMG_&imagemask nd
+/AGMIMG_mbuf()def
+/AGMIMG_ybuf()def
+/AGMIMG_kbuf()def
+/AGMIMG_c 0 def
+/AGMIMG_m 0 def
+/AGMIMG_y 0 def
+/AGMIMG_k 0 def
+/AGMIMG_tmp nd
+/AGMIMG_imagestring0 nd
+/AGMIMG_imagestring1 nd
+/AGMIMG_imagestring2 nd
+/AGMIMG_imagestring3 nd
+/AGMIMG_imagestring4 nd
+/AGMIMG_imagestring5 nd
+/AGMIMG_cnt nd
+/AGMIMG_fsave nd
+/AGMIMG_colorAry nd
+/AGMIMG_override nd
+/AGMIMG_name nd
+/AGMIMG_maskSource nd
+/AGMIMG_flushfilters nd
+/invert_image_samples nd
+/knockout_image_samples        nd
+/img nd
+/sepimg nd
+/devnimg nd
+/idximg nd
+/ds
+{
+       Adobe_AGM_Core begin
+       Adobe_AGM_Image begin
+       /AGMIMG_&image systemdict/image get def
+       /AGMIMG_&imagemask systemdict/imagemask get def
+       /colorimage where{
+               pop
+               /AGMIMG_&colorimage/colorimage ldf
+       }if
+       end
+       end
+}def
+/ps
+{
+       Adobe_AGM_Image begin
+       /AGMIMG_ccimage_exists{/customcolorimage where 
+               {
+                       pop
+                       /Adobe_AGM_OnHost_Seps where
+                       {
+                       pop false
+                       }{
+                       /Adobe_AGM_InRip_Seps where
+                               {
+                               pop false
+                               }{
+                                       true
+                               }ifelse
+                       }ifelse
+                       }{
+                       false
+               }ifelse 
+       }bdf
+       level2{
+               /invert_image_samples
+               {
+                       Adobe_AGM_Image/AGMIMG_tmp Decode length ddf
+                       /Decode[Decode 1 get Decode 0 get]def
+               }def
+               /knockout_image_samples
+               {
+                       Operator/imagemask ne{
+                               /Decode[1 1]def
+                       }if
+               }def
+       }{      
+               /invert_image_samples
+               {
+                       {1 exch sub}currenttransfer addprocs settransfer
+               }def
+               /knockout_image_samples
+               {
+                       {pop 1}currenttransfer addprocs settransfer
+               }def
+       }ifelse
+       /img/imageormask ldf
+       /sepimg/sep_imageormask ldf
+       /devnimg/devn_imageormask ldf
+       /idximg/indexed_imageormask ldf
+       /_ctype 7 def
+       currentdict{
+               dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{
+                       bind
+               }if
+               def
+       }forall
+}def
+/pt
+{
+       end
+}def
+/dt
+{
+}def
+/AGMIMG_flushfilters
+{
+       dup type/arraytype ne
+               {1 array astore}if
+       dup 0 get currentfile ne
+               {dup 0 get flushfile}if
+               {
+               dup type/filetype eq
+                       {
+                       dup status 1 index currentfile ne and
+                               {closefile}
+                               {pop}
+                       ifelse
+                       }{pop}ifelse
+               }forall
+}def
+/AGMIMG_init_common
+{
+       currentdict/T known{/ImageType/T ldf currentdict/T undef}if
+       currentdict/W known{/Width/W ldf currentdict/W undef}if
+       currentdict/H known{/Height/H ldf currentdict/H undef}if
+       currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if
+       currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if
+       currentdict/D known{/Decode/D ldf currentdict/D undef}if
+       currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if
+       currentdict/O known{
+               /Operator/O load 1 eq{
+                       /imagemask
+               }{
+                       /O load 2 eq{
+                               /image 
+                       }{
+                               /colorimage
+                       }ifelse
+               }ifelse
+               def
+               currentdict/O undef
+       }if
+       currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if
+       currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if
+       currentdict/I known{/Interpolate/I ldf currentdict/I undef}if
+       currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if
+       /DataSource load xcheck not{
+               DataSource type/arraytype eq{
+                       DataSource 0 get type/filetype eq{
+                               /_Filters DataSource def
+                               currentdict/MultipleDataSources known not{
+                                       /DataSource DataSource dup length 1 sub get def 
+                               }if
+                       }if
+               }if
+               currentdict/MultipleDataSources known not{
+                       /MultipleDataSources DataSource type/arraytype eq{
+                               DataSource length 1 gt
+                       }
+                       {false}ifelse def
+               }if
+       }if
+       /NComponents Decode length 2 div def
+       currentdict/SkipImageProc known not{/SkipImageProc{false}def}if
+}bdf
+/imageormask_sys
+{
+       begin
+               AGMIMG_init_common
+               save mark
+               level2{
+                       currentdict
+                       Operator/imagemask eq{
+                               AGMIMG_&imagemask
+                       }{
+                               use_mask{
+                                       process_mask AGMIMG_&image
+                               }{
+                                       AGMIMG_&image
+                               }ifelse
+                       }ifelse
+               }{
+                       Width Height
+                       Operator/imagemask eq{
+                               Decode 0 get 1 eq Decode 1 get 0 eq     and
+                               ImageMatrix/DataSource load
+                               AGMIMG_&imagemask
+                       }{
+                               BitsPerComponent ImageMatrix/DataSource load
+                               AGMIMG_&image
+                       }ifelse
+               }ifelse
+               currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+               cleartomark restore
+       end
+}def
+/overprint_plate
+{
+       currentoverprint{
+               0 get dup type/nametype eq{
+                       dup/DeviceGray eq{
+                               pop AGMCORE_black_plate not
+                       }{
+                               /DeviceCMYK eq{
+                                       AGMCORE_is_cmyk_sep not
+                               }if
+                       }ifelse
+               }{
+                       false exch
+                       {
+                                AGMOHS_sepink eq or
+                       }forall
+                       not
+               }ifelse
+       }{
+               pop false
+       }ifelse
+}def
+/process_mask
+{
+       level3{
+               dup begin
+               /ImageType 1 def
+               end
+               4 dict begin
+                       /DataDict exch def
+                       /ImageType 3 def
+                       /InterleaveType 3 def
+                       /MaskDict 9 dict begin
+                               /ImageType 1 def
+                               /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def
+                               /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def
+                               /ImageMatrix[Width 0 0 Height neg 0 Height]def
+                               /NComponents 1 def
+                               /BitsPerComponent 1 def
+                               /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def
+                               /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def
+                       currentdict end def
+               currentdict end
+       }if
+}def
+/use_mask
+{
+       dup/Mask known  {dup/Mask get}{false}ifelse
+}def
+/imageormask
+{
+       begin
+               AGMIMG_init_common
+               SkipImageProc{
+                       currentdict consumeimagedata
+               }
+               {
+                       save mark
+                       level2 AGMCORE_host_sep not and{
+                               currentdict
+                               Operator/imagemask eq DeviceN_PS2 not and{
+                                       imagemask
+                               }{
+                                       AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{
+                                               [/Separation/Black/DeviceGray{}]setcolorspace
+                                               /Decode[Decode 1 get Decode 0 get]def
+                                       }if
+                                       use_mask{
+                                               process_mask image
+                                       }{
+                                               DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and 
+                                               {
+                                                       Names convert_to_process not{
+                                                               2 dict begin
+                                                               /imageDict xdf
+                                                               /names_index 0 def
+                                                               gsave
+                                                               imageDict write_image_file{
+                                                                       Names{
+                                                                               dup(None)ne{
+                                                                                       [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace
+                                                                                       Operator imageDict read_image_file
+                                                                                       names_index 0 eq{true setoverprint}if
+                                                                                       /names_index names_index 1 add def
+                                                                               }{
+                                                                                       pop
+                                                                               }ifelse
+                                                                       }forall
+                                                                       close_image_file
+                                                               }if
+                                                               grestore
+                                                               end
+                                                       }{
+                                                               Operator/imagemask eq{
+                                                                       imagemask
+                                                               }{
+                                                                       image
+                                                               }ifelse
+                                                       }ifelse
+                                               }{
+                                                       Operator/imagemask eq{
+                                                               imagemask
+                                                       }{
+                                                               image
+                                                       }ifelse
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }{
+                               Width Height
+                               Operator/imagemask eq{
+                                       Decode 0 get 1 eq Decode 1 get 0 eq     and
+                                       ImageMatrix/DataSource load
+                                       /Adobe_AGM_OnHost_Seps where{
+                                               pop imagemask
+                                       }{
+                                               currentgray 1 ne{
+                                                       currentdict imageormask_sys
+                                               }{
+                                                       currentoverprint not{
+                                                               1 AGMCORE_&setgray
+                                                               currentdict imageormask_sys
+                                                       }{
+                                                               currentdict ignoreimagedata
+                                                       }ifelse                                         
+                                               }ifelse
+                                       }ifelse
+                               }{
+                                       BitsPerComponent ImageMatrix 
+                                       MultipleDataSources{
+                                               0 1 NComponents 1 sub{
+                                                       DataSource exch get
+                                               }for
+                                       }{
+                                               /DataSource load
+                                       }ifelse
+                                       Operator/colorimage eq{
+                                               AGMCORE_host_sep{
+                                                       MultipleDataSources level2 or NComponents 4 eq and{
+                                                               AGMCORE_is_cmyk_sep{
+                                                                       MultipleDataSources{
+                                                                               /DataSource DataSource 0 get xcheck
+                                                                                       {
+                                                                                       [
+                                                                                       DataSource 0 get/exec cvx
+                                                                                       DataSource 1 get/exec cvx
+                                                                                       DataSource 2 get/exec cvx
+                                                                                       DataSource 3 get/exec cvx
+                                                                                       /AGMCORE_get_ink_data cvx
+                                                                                       ]cvx
+                                                                                       }{
+                                                                                       DataSource aload pop AGMCORE_get_ink_data
+                                                                                       }ifelse def
+                                                                       }{
+                                                                               /DataSource 
+                                                                               Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
+                                                                               /DataSource load
+                                                                               filter_cmyk 0()/SubFileDecode filter def
+                                                                       }ifelse
+                                                                       /Decode[Decode 0 get Decode 1 get]def
+                                                                       /MultipleDataSources false def
+                                                                       /NComponents 1 def
+                                                                       /Operator/image def
+                                                                       invert_image_samples
+                                                                       1 AGMCORE_&setgray
+                                                                       currentdict imageormask_sys
+                                                               }{
+                                                                       currentoverprint not Operator/imagemask eq and{
+                                                                               1 AGMCORE_&setgray
+                                                                               currentdict imageormask_sys
+                                                                       }{
+                                                                               currentdict ignoreimagedata
+                                                                       }ifelse
+                                                               }ifelse
+                                                       }{      
+                                                               MultipleDataSources NComponents AGMIMG_&colorimage                                              
+                                                       }ifelse
+                                               }{
+                                                       true NComponents colorimage
+                                               }ifelse
+                                       }{
+                                               Operator/image eq{
+                                                       AGMCORE_host_sep{
+                                                               /DoImage true def
+                                                               currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse
+                                                               {
+                                                                       AGMCORE_black_plate not Operator/imagemask ne and{
+                                                                               /DoImage false def
+                                                                               currentdict ignoreimagedata
+                                                                       }if
+                                                               }if
+                                                               1 AGMCORE_&setgray
+                                                               DoImage
+                                                                       {currentdict imageormask_sys}if
+                                                       }{
+                                                               use_mask{
+                                                                       process_mask image
+                                                               }{
+                                                                       image
+                                                               }ifelse
+                                                       }ifelse
+                                               }{
+                                                       Operator/knockout eq{
+                                                               pop pop pop pop pop
+                                                               currentcolorspace overprint_plate not{
+                                                                       knockout_unitsq
+                                                               }if
+                                                       }if
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+                       cleartomark restore
+               }ifelse
+               currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+}def
+/sep_imageormask
+{
+       /sep_colorspace_dict AGMCORE_gget begin
+       CSA map_csa
+       begin
+       AGMIMG_init_common
+       SkipImageProc{
+               currentdict consumeimagedata
+       }{
+               save mark 
+               AGMCORE_avoid_L2_sep_space{
+                       /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
+               }if
+               AGMIMG_ccimage_exists 
+               MappedCSA 0 get/DeviceCMYK eq and
+               currentdict/Components known and 
+               Name()ne and 
+               Name(All)ne and 
+               Operator/image eq and
+               AGMCORE_producing_seps not and
+               level2 not and
+               {
+                       Width Height BitsPerComponent ImageMatrix 
+                       [
+                       /DataSource load/exec cvx
+                       {
+                               0 1 2 index length 1 sub{
+                                       1 index exch
+                                       2 copy get 255 xor put
+                               }for
+                       }/exec cvx
+                       ]cvx bind
+                       MappedCSA 0 get/DeviceCMYK eq{
+                               Components aload pop
+                       }{
+                               0 0 0 Components aload pop 1 exch sub
+                       }ifelse
+                       Name findcmykcustomcolor
+                       customcolorimage
+               }{
+                       AGMCORE_producing_seps not{
+                               level2{
+                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{
+                                               [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt
+                                               /sep_tint AGMCORE_gget setcolor
+                                       }if
+                                       currentdict imageormask
+                               }{
+                                       currentdict
+                                       Operator/imagemask eq{
+                                               imageormask
+                                       }{
+                                               sep_imageormask_lev1
+                                       }ifelse
+                               }ifelse
+                       }{
+                               AGMCORE_host_sep{
+                                       Operator/knockout eq{
+                                               currentdict/ImageMatrix get concat
+                                               knockout_unitsq
+                                       }{
+                                               currentgray 1 ne{
+                                                       AGMCORE_is_cmyk_sep Name(All)ne and{
+                                                               level2{
+                                                                       Name AGMCORE_IsSeparationAProcessColor 
+                                                                       {
+                                                                               Operator/imagemask eq{
+                                                                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+                                                                                               /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor
+                                                                                       }if
+                                                                               }{
+                                                                                       invert_image_samples
+                                                                               }ifelse
+                                                                       }{
+                                                                               //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+                                                                                       [/Separation Name[/DeviceGray]
+                                                                                       {
+                                                                                               sep_colorspace_proc AGMCORE_get_ink_data
+                                                                                               1 exch sub
+                                                                                       }bind
+                                                                                       ]AGMCORE_&setcolorspace
+                                                                                       /sep_tint AGMCORE_gget AGMCORE_&setcolor
+                                                                               }if
+                                                                       }ifelse
+                                                                       currentdict imageormask_sys
+                                                               }{
+                                                                       currentdict
+                                                                       Operator/imagemask eq{
+                                                                               imageormask_sys
+                                                                       }{
+                                                                               sep_image_lev1_sep
+                                                                       }ifelse
+                                                               }ifelse
+                                                       }{
+                                                               Operator/imagemask ne{
+                                                                       invert_image_samples
+                                                               }if
+                                                               currentdict imageormask_sys
+                                                       }ifelse
+                                               }{
+                                                       currentoverprint not Name(All)eq or Operator/imagemask eq and{
+                                                               currentdict imageormask_sys 
+                                                               }{
+                                                               currentoverprint not
+                                                                       {
+                                                                       gsave 
+                                                                       knockout_unitsq
+                                                                       grestore
+                                                                       }if
+                                                               currentdict consumeimagedata 
+                                                       }ifelse
+                                               }ifelse
+                                       }ifelse
+                               }{
+                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{
+                                               currentcolorspace 0 get/Separation ne{
+                                                       [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt
+                                                       /sep_tint AGMCORE_gget setcolor
+                                               }if
+                                       }if
+                                       currentoverprint 
+                                       MappedCSA 0 get/DeviceCMYK eq and 
+                                       Name AGMCORE_IsSeparationAProcessColor not and
+                                       //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse 
+                                       Name(All)ne and{
+                                               imageormask_l2_overprint
+                                       }{
+                                               currentdict imageormask
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }ifelse
+               cleartomark restore
+       }ifelse
+       currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+       end
+}def
+/colorSpaceElemCnt
+{
+       mark currentcolor counttomark dup 2 add 1 roll cleartomark
+}bdf
+/devn_sep_datasource
+{
+       1 dict begin
+       /dataSource xdf
+       [
+               0 1 dataSource length 1 sub{
+                       dup currentdict/dataSource get/exch cvx/get cvx/exec cvx
+                       /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx
+               }for
+       ]cvx bind
+       end
+}bdf           
+/devn_alt_datasource
+{
+       11 dict begin
+       /convProc xdf
+       /origcolorSpaceElemCnt xdf
+       /origMultipleDataSources xdf
+       /origBitsPerComponent xdf
+       /origDecode xdf
+       /origDataSource xdf
+       /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def
+       /DataSource origMultipleDataSources
+               {
+                       [
+                       BitsPerComponent 8 idiv origDecode length 2 idiv mul string
+                       0 1 origDecode length 2 idiv 1 sub
+                               {
+                               dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch
+                               origDataSource exch get 0()/SubFileDecode filter
+                               BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx
+                               }for 
+                       ]bind cvx
+               }{origDataSource}ifelse 0()/SubFileDecode filter def            
+       [
+               origcolorSpaceElemCnt string
+               0 2 origDecode length 2 sub
+                       {
+                       dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div
+                       1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx
+                       }for
+               /convProc load/exec cvx
+               origcolorSpaceElemCnt 1 sub -1 0
+                       {
+                       /dup cvx 2/add cvx/index cvx
+                       3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx
+                       }for
+       ]bind cvx 0()/SubFileDecode filter
+       end
+}bdf
+/devn_imageormask
+{
+       /devicen_colorspace_dict AGMCORE_gget begin
+       CSA map_csa
+       2 dict begin
+       dup
+       /srcDataStrs[3 -1 roll begin
+               AGMIMG_init_common
+               currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse
+               {
+                       Width Decode length 2 div mul cvi
+                       {
+                               dup 65535 gt{1 add 2 div cvi}{exit}ifelse
+                       }loop
+                       string
+               }repeat
+               end]def
+       /dstDataStr srcDataStrs 0 get length string def
+       begin
+       AGMIMG_init_common
+       SkipImageProc{
+               currentdict consumeimagedata
+       }{
+               save mark 
+               AGMCORE_producing_seps not{
+                       level3 not{
+                               Operator/imagemask ne{
+                                       /DataSource[[
+                                               DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+                                               colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
+                                               devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def                              
+                                       /MultipleDataSources true def
+                                       /Decode colorSpaceElemCnt[exch{0 1}repeat]def
+                               }if
+                       }if
+                       currentdict imageormask
+               }{
+                       AGMCORE_host_sep{
+                               Names convert_to_process{
+                                       CSA get_csa_by_name 0 get/DeviceCMYK eq{
+                                               /DataSource
+                                                       Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul 
+                                                       DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+                                                       4/devicen_colorspace_dict AGMCORE_gget/TintTransform get 
+                                                       devn_alt_datasource
+                                               filter_cmyk 0()/SubFileDecode filter def
+                                               /MultipleDataSources false def
+                                               /Decode[1 0]def
+                                               /DeviceGray setcolorspace
+                                               currentdict imageormask_sys
+                                       }{
+                                               AGMCORE_report_unsupported_color_space
+                                               AGMCORE_black_plate{
+                                                       /DataSource
+                                                               DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse
+                                                               CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get
+                                                               devn_alt_datasource
+                                                       /MultipleDataSources false def
+                                                       /Decode colorSpaceElemCnt[exch{0 1}repeat]def
+                                                       currentdict imageormask_sys
+                                               }{
+                                                       gsave 
+                                                       knockout_unitsq
+                                                       grestore
+                                                       currentdict consumeimagedata 
+                                               }ifelse
+                                       }ifelse
+                               }
+                               {       
+                                       /devicen_colorspace_dict AGMCORE_gget/names_index known{
+                                               Operator/imagemask ne{
+                                                       MultipleDataSources{
+                                                               /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def
+                                                               /MultipleDataSources false def
+                                                       }{
+                                                               /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def
+                                                       }ifelse
+                                                       invert_image_samples
+                                               }if
+                                               currentdict imageormask_sys
+                                       }{
+                                               currentoverprint not Operator/imagemask eq and{
+                                                       currentdict imageormask_sys 
+                                                       }{
+                                                       currentoverprint not
+                                                               {
+                                                               gsave 
+                                                               knockout_unitsq
+                                                               grestore
+                                                               }if
+                                                       currentdict consumeimagedata 
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }{
+                               currentdict imageormask
+                       }ifelse
+               }ifelse
+               cleartomark restore
+       }ifelse
+       currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+       end
+       end
+}def
+/imageormask_l2_overprint
+{
+       currentdict
+       currentcmykcolor add add add 0 eq{
+               currentdict consumeimagedata
+       }{
+               level3{                 
+                       currentcmykcolor 
+                       /AGMIMG_k xdf 
+                       /AGMIMG_y xdf 
+                       /AGMIMG_m xdf 
+                       /AGMIMG_c xdf
+                       Operator/imagemask eq{
+                               [/DeviceN[
+                               AGMIMG_c 0 ne{/Cyan}if
+                               AGMIMG_m 0 ne{/Magenta}if
+                               AGMIMG_y 0 ne{/Yellow}if
+                               AGMIMG_k 0 ne{/Black}if
+                               ]/DeviceCMYK{}]setcolorspace
+                               AGMIMG_c 0 ne{AGMIMG_c}if
+                               AGMIMG_m 0 ne{AGMIMG_m}if
+                               AGMIMG_y 0 ne{AGMIMG_y}if
+                               AGMIMG_k 0 ne{AGMIMG_k}if
+                               setcolor                        
+                       }{      
+                               /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def
+                               [/Indexed                               
+                                       [
+                                               /DeviceN[
+                                                       AGMIMG_c 0 ne{/Cyan}if
+                                                       AGMIMG_m 0 ne{/Magenta}if
+                                                       AGMIMG_y 0 ne{/Yellow}if
+                                                       AGMIMG_k 0 ne{/Black}if
+                                               ]
+                                               /DeviceCMYK{
+                                                       AGMIMG_k 0 eq{0}if
+                                                       AGMIMG_y 0 eq{0 exch}if
+                                                       AGMIMG_m 0 eq{0 3 1 roll}if
+                                                       AGMIMG_c 0 eq{0 4 1 roll}if                                             
+                                               }
+                                       ]
+                                       255
+                                       {
+                                               255 div 
+                                               mark exch
+                                               dup     dup dup
+                                               AGMIMG_k 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop              
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               AGMIMG_y 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop              
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               AGMIMG_m 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop              
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               AGMIMG_c 0 ne{
+                                                       /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop               
+                                                       counttomark 1 roll
+                                               }{
+                                                       pop
+                                               }ifelse
+                                               counttomark 1 add -1 roll pop
+                                       }
+                               ]setcolorspace
+                       }ifelse
+                       imageormask_sys
+               }{
+       write_image_file{
+               currentcmykcolor
+               0 ne{
+                       [/Separation/Black/DeviceGray{}]setcolorspace
+                       gsave
+                       /Black
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+               0 ne{
+                       [/Separation/Yellow/DeviceGray{}]setcolorspace
+                       gsave
+                       /Yellow
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+               0 ne{
+                       [/Separation/Magenta/DeviceGray{}]setcolorspace
+                       gsave
+                       /Magenta
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+               0 ne{
+                       [/Separation/Cyan/DeviceGray{}]setcolorspace
+                       gsave
+                       /Cyan 
+                       [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx]
+                       cvx modify_halftone_xfer
+                       Operator currentdict read_image_file
+                       grestore
+               }if
+                               close_image_file
+                       }{
+                               imageormask
+                       }ifelse
+               }ifelse
+       }ifelse
+}def
+/indexed_imageormask
+{
+       begin
+               AGMIMG_init_common
+               save mark 
+               currentdict
+               AGMCORE_host_sep{
+                       Operator/knockout eq{
+                               /indexed_colorspace_dict AGMCORE_gget dup/CSA known{
+                                       /CSA get get_csa_by_name
+                               }{
+                                       /Names get
+                               }ifelse
+                               overprint_plate not{
+                                       knockout_unitsq
+                               }if
+                       }{
+                               Indexed_DeviceN{
+                                       /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{
+                                               indexed_image_lev2_sep
+                                       }{
+                                               currentoverprint not{
+                                                       knockout_unitsq
+                                               }if
+                                               currentdict consumeimagedata
+                                       }ifelse
+                               }{
+                                       AGMCORE_is_cmyk_sep{
+                                               Operator/imagemask eq{
+                                                       imageormask_sys
+                                               }{
+                                                       level2{
+                                                               indexed_image_lev2_sep
+                                                       }{
+                                                               indexed_image_lev1_sep
+                                                       }ifelse
+                                               }ifelse
+                                       }{
+                                               currentoverprint not{
+                                                       knockout_unitsq
+                                               }if
+                                               currentdict consumeimagedata
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               }{
+                       level2{
+                               Indexed_DeviceN{
+                                       /indexed_colorspace_dict AGMCORE_gget begin
+                               }{
+                                       /indexed_colorspace_dict AGMCORE_gget dup null ne
+                                       {
+                                               begin
+                                               currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse
+                                               get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and
+                                               AGMCORE_in_rip_sep and{
+                                                       [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup]
+                                                       setcolorspace
+                                               }if
+                                               end
+                                       }
+                                       {pop}ifelse
+                               }ifelse
+                               imageormask
+                               Indexed_DeviceN{
+                                       end
+                               }if
+                       }{
+                               Operator/imagemask eq{
+                                       imageormask
+                               }{
+                                       indexed_imageormask_lev1
+                               }ifelse
+                       }ifelse
+               }ifelse
+               cleartomark restore
+       currentdict/_Filters known{_Filters AGMIMG_flushfilters}if
+       end
+}def
+/indexed_image_lev2_sep
+{
+       /indexed_colorspace_dict AGMCORE_gget begin
+       begin
+               Indexed_DeviceN not{
+                       currentcolorspace 
+                       dup 1/DeviceGray put
+                       dup 3
+                       currentcolorspace 2 get 1 add string
+                       0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub
+                       {
+                       dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put
+                       }for 
+                       put     setcolorspace
+               }if
+               currentdict 
+               Operator/imagemask eq{
+                       AGMIMG_&imagemask
+               }{
+                       use_mask{
+                               process_mask AGMIMG_&image
+                       }{
+                               AGMIMG_&image
+                       }ifelse
+               }ifelse
+       end end
+}def
+ /OPIimage
+ {
+       dup type/dicttype ne{
+               10 dict begin
+                       /DataSource xdf
+                       /ImageMatrix xdf
+                       /BitsPerComponent xdf
+                       /Height xdf
+                       /Width xdf
+                       /ImageType 1 def
+                       /Decode[0 1 def]
+                       currentdict
+               end
+       }if
+       dup begin
+               /NComponents 1 cdndf
+               /MultipleDataSources false cdndf
+               /SkipImageProc{false}cdndf
+               /Decode[
+                               0 
+                               currentcolorspace 0 get/Indexed eq{
+                                       2 BitsPerComponent exp 1 sub
+                               }{
+                                       1
+                               }ifelse
+               ]cdndf
+               /Operator/image cdndf
+       end
+       /sep_colorspace_dict AGMCORE_gget null eq{
+               imageormask
+       }{
+               gsave
+               dup begin invert_image_samples end
+               sep_imageormask
+               grestore
+       }ifelse
+ }def
+/cachemask_level2
+{
+       3 dict begin
+       /LZWEncode filter/WriteFilter xdf
+       /readBuffer 256 string def
+       /ReadFilter
+               currentfile
+               0(%EndMask)/SubFileDecode filter
+               /ASCII85Decode filter
+               /RunLengthDecode filter
+       def
+       {
+               ReadFilter readBuffer readstring exch
+               WriteFilter exch writestring
+               not{exit}if
+       }loop
+       WriteFilter closefile
+       end
+}def
+/spot_alias
+{
+       /mapto_sep_imageormask 
+       {
+               dup type/dicttype ne{
+                       12 dict begin
+                               /ImageType 1 def
+                               /DataSource xdf
+                               /ImageMatrix xdf
+                               /BitsPerComponent xdf
+                               /Height xdf
+                               /Width xdf
+                               /MultipleDataSources false def
+               }{
+                       begin
+               }ifelse
+                               /Decode[/customcolor_tint AGMCORE_gget 0]def
+                               /Operator/image def
+                               /SkipImageProc{false}def
+                               currentdict 
+                       end
+               sep_imageormask
+       }bdf
+       /customcolorimage
+       {
+               Adobe_AGM_Image/AGMIMG_colorAry xddf
+               /customcolor_tint AGMCORE_gget
+               <<
+                       /Name AGMIMG_colorAry 4 get
+                       /CSA[/DeviceCMYK]
+                       /TintMethod/Subtractive
+                       /TintProc null
+                       /MappedCSA null
+                       /NComponents 4 
+                       /Components[AGMIMG_colorAry aload pop pop]
+               >>
+               setsepcolorspace
+               mapto_sep_imageormask
+       }ndf
+       Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put
+       /customcolorimage
+       {
+               Adobe_AGM_Image/AGMIMG_override false put
+               current_spot_alias{dup 4 get map_alias}{false}ifelse
+               {
+                       false set_spot_alias
+                       /customcolor_tint AGMCORE_gget exch setsepcolorspace
+                       pop
+                       mapto_sep_imageormask
+                       true set_spot_alias
+               }{
+                       //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec
+               }ifelse                 
+       }bdf
+}def
+/snap_to_device
+{
+       6 dict begin
+       matrix currentmatrix
+       dup 0 get 0 eq 1 index 3 get 0 eq and
+       1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop
+       {
+               1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def
+               0 0 transform
+               AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
+               AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch
+               itransform/AGMIMG_llY exch def/AGMIMG_llX exch def
+               1 1 transform
+               AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
+               AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch
+               itransform/AGMIMG_urY exch def/AGMIMG_urX exch def                      
+               [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat
+       }{
+       }ifelse
+       end
+}def
+level2 not{
+       /colorbuf
+       {
+               0 1 2 index length 1 sub{
+                       dup 2 index exch get 
+                       255 exch sub 
+                       2 index 
+                       3 1 roll 
+                       put
+               }for
+       }def
+       /tint_image_to_color
+       {
+               begin
+                       Width Height BitsPerComponent ImageMatrix 
+                       /DataSource load
+               end
+               Adobe_AGM_Image begin
+                       /AGMIMG_mbuf 0 string def
+                       /AGMIMG_ybuf 0 string def
+                       /AGMIMG_kbuf 0 string def
+                       {
+                               colorbuf dup length AGMIMG_mbuf length ne
+                                       {
+                                       dup length dup dup
+                                       /AGMIMG_mbuf exch string def
+                                       /AGMIMG_ybuf exch string def
+                                       /AGMIMG_kbuf exch string def
+                                       }if
+                               dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop
+                       }
+                       addprocs
+                       {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage        
+               end
+       }def                    
+       /sep_imageormask_lev1
+       {
+               begin
+                       MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
+                               {
+                                       255 mul round cvi GrayLookup exch get
+                               }currenttransfer addprocs settransfer
+                               currentdict imageormask
+                       }{
+                               /sep_colorspace_dict AGMCORE_gget/Components known{
+                                       MappedCSA 0 get/DeviceCMYK eq{
+                                               Components aload pop
+                                       }{
+                                               0 0 0 Components aload pop 1 exch sub
+                                       }ifelse
+                                       Adobe_AGM_Image/AGMIMG_k xddf 
+                                       Adobe_AGM_Image/AGMIMG_y xddf 
+                                       Adobe_AGM_Image/AGMIMG_m xddf 
+                                       Adobe_AGM_Image/AGMIMG_c xddf 
+                                       AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{
+                                               {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer
+                                               currentdict imageormask
+                                       }{
+                                               currentcolortransfer
+                                               {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll
+                                               {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll
+                                               {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll
+                                               {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll
+                                               setcolortransfer
+                                               currentdict tint_image_to_color
+                                       }ifelse
+                               }{
+                                       MappedCSA 0 get/DeviceGray eq{
+                                               {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer
+                                               currentdict imageormask
+                                       }{
+                                               MappedCSA 0 get/DeviceCMYK eq{
+                                                       currentcolortransfer
+                                                       {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll
+                                                       setcolortransfer 
+                                                       currentdict tint_image_to_color
+                                               }{
+                                                       currentcolortransfer
+                                                       {pop 1}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll
+                                                       {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll
+                                                       setcolortransfer 
+                                                       currentdict tint_image_to_color
+                                               }ifelse
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               end
+       }def
+       /sep_image_lev1_sep
+       {
+               begin
+                       /sep_colorspace_dict AGMCORE_gget/Components known{
+                               Components aload pop
+                               Adobe_AGM_Image/AGMIMG_k xddf 
+                               Adobe_AGM_Image/AGMIMG_y xddf 
+                               Adobe_AGM_Image/AGMIMG_m xddf 
+                               Adobe_AGM_Image/AGMIMG_c xddf 
+                               {AGMIMG_c mul 1 exch sub}
+                               {AGMIMG_m mul 1 exch sub}
+                               {AGMIMG_y mul 1 exch sub}
+                               {AGMIMG_k mul 1 exch sub}
+                       }{
+                               {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}
+                               {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}
+                               {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}
+                               {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}
+                       }ifelse
+                       AGMCORE_get_ink_data currenttransfer addprocs settransfer
+                       currentdict imageormask_sys
+               end
+       }def
+       /indexed_imageormask_lev1
+       {
+               /indexed_colorspace_dict AGMCORE_gget begin
+               begin
+                       currentdict
+                       MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{
+                               {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer
+                               imageormask
+                       }{
+                               MappedCSA 0 get/DeviceGray eq{
+                                       {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer
+                                       imageormask
+                               }{
+                                       MappedCSA 0 get/DeviceCMYK eq{
+                                               currentcolortransfer
+                                               {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               {4 mul HiVal mul round cvi               Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll
+                                               setcolortransfer 
+                                               tint_image_to_color
+                                       }{
+                                               currentcolortransfer
+                                               {pop 1}exch addprocs 4 1 roll
+                                               {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll
+                                               {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll
+                                               {3 mul HiVal mul round cvi              Lookup exch get HiVal div}exch addprocs 4 1 roll
+                                               setcolortransfer 
+                                               tint_image_to_color
+                                       }ifelse
+                               }ifelse
+                       }ifelse
+               end end
+       }def
+       /indexed_image_lev1_sep
+       {
+               /indexed_colorspace_dict AGMCORE_gget begin
+               begin
+                       {4 mul HiVal mul round cvi               Lookup exch get HiVal div 1 exch sub}
+                       {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}
+                       {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}
+                       {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}
+                       AGMCORE_get_ink_data currenttransfer addprocs settransfer
+                       currentdict imageormask_sys
+               end end
+       }def
+}if
+end
+systemdict/setpacking known
+{setpacking}if
+%%EndResource
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndProlog
+%%BeginSetup
+Adobe_AGM_Utils begin
+2 2010 Adobe_AGM_Core/ds gx
+Adobe_CoolType_Core/ds get exec\rAdobe_AGM_Image/ds gx
+currentdict Adobe_AGM_Utils eq {end} if
+%%EndSetup
+%%Page: 32 1
+%%EndPageComments
+%%BeginPageSetup
+%ADOBeginClientInjection: PageSetup Start "AI11EPS"
+%AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0\r
+%ADOEndClientInjection: PageSetup Start "AI11EPS"
+Adobe_AGM_Utils begin
+Adobe_AGM_Core/ps gx
+Adobe_AGM_Utils/capture_cpd gx
+Adobe_CoolType_Core/ps get exec\rAdobe_AGM_Image/ps gx
+%ADOBeginClientInjection: PageSetup End "AI11EPS"
+/currentdistillerparams where\r{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse\r{ userdict /AI11_PDFMark5 /cleartomark load put\ruserdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put}\r{ userdict /AI11_PDFMark5 /pdfmark load put\ruserdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse\r[/NamespacePush AI11_PDFMark5\r[/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5\r[{ai_metadata_stream_123}\rcurrentfile 0 (%  &&end XMP packet marker&&)\r/SubFileDecode filter AI11_ReadMetadata_PDFMark5\r<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41        ">
+   <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/postscript</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">diagramas_01</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:CreatorTool>Adobe Illustrator CS4</xmp:CreatorTool>
+         <xmp:CreateDate>2011-08-11T16:24:12-03:00</xmp:CreateDate>
+         <xmp:ModifyDate>2011-08-11T16:24:13-03:00</xmp:ModifyDate>
+         <xmp:MetadataDate>2011-08-11T16:24:13-03:00</xmp:MetadataDate>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>152</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAmAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A715g80eW9GsobkR2NzG5&#xA;KE8v21APD91FN8RHjTAyAFeaE1Pz1+XxtBGjwsLs+irtbui8GkMMkis8LI4ShPgae4qWKDt/N/5f&#xA;aZPGI5I5IbmNXk9S0MBiiWJpVZEW3UuHr0r1O3fFUxbz35IXV/0dwjJoFb/R5fWEzSKixeh6PMlu&#xA;ddvA7eKqfJeeW3thcLLaCyZlBcmNUD8WIVq0o1D0O+KpBJ538pW2ty6XexWsTxtwUxJJM5kZ1RF4&#xA;LAPtc6/CxwBlIDogrrzT+Xmq3pg5R8YkKxOlkZZCzq7PWNrd2X01hr4b74WKvpPnj8vxbSxVhENm&#xA;CFlS3d+UUYSssgSFViBaSnhWtNsVRuhecPJmqxA0t4ZATzrG3or8TqlZnjjQFxEWCtRqdsVTHUtQ&#xA;0OwsZ55VtJLi2T1JopCocR1A5MFWR6Co/ZwFlEC90ktvzB8iS6a91MII3QUkVYZZIlLO6RhpRCKc&#xA;/TqAVrTthYpQfMn5e21lDqsawGWOvp2n1VViMjoJTAtwLbrGJP2T1+13OKpzeef/ACLAtsYxA5uJ&#xA;RGC8MkScBJ6UksbtFxdUO+21O/Sqqd2Op+Wb+BJrIwgMokdHj9GT0WAbk0cio/AhhuRTFUDrXmny&#xA;bpTWiyG0kN26qhVQy8OYR3DRpIp4eFRiqT6x5u/LaY2olWGsqiT1pLRxIkJQyhlSSBuYkpxoOvLb&#xA;FWrPzH+X1hrBs+EMkp29VrRknSRmWJIFgS3Rm+1t1NK12piqIi8/+UJ9VNnbQW8sSsqmURy+p9l2&#xA;kJiFuSPTEZ5VNOm43oGUQOrJxLoBSJy9qbaVmW3asfps54ghD0JqO2Fikf8AjTyT+mp9KKRmaFzC&#xA;BHbySO0yNIJI/TSIn4PSry6bjFUjfzF+W+q3Nw6mKFV+ISRWQnaVeKVkcNbuY+LShfi7jwxVH6Z5&#xA;7/L1bFgUt7ZIWKhYoJJIgGZwjM6wqqc+DGh/jiqO8veavLWsxsUhtoHPFYjxbiZGRWMYkeKKMyL6&#xA;ijirE4pIFJb5r8s32qa9IZIo5NPWANAEW4jYTNI9SzJFdRvQLvspoR4bqEb5P0ObTNQRWgZUMUhL&#xA;852QOWU0VZYIAtanuxxVmmKuxV2KuxV2KuxV2KpTf+WdF1KNZJ7ZBciMpFdIoEqcgd1anYsTvtiq&#xA;Q3vk+XT7CMaXBpCiIc7u5vLd1dlRg55Sc3NHIPMsemKrLbQ0uYkSys/L8lCrXUECco3UqVKtxXdR&#xA;z5CoxVG6b5JtYtVW8ubOzjijCvFBah1RZ0cMkvBvhDClNsVZG0MPqBeC8ahuNBSvxGuKsfuvy+0G&#xA;SdZYYIo4xL6rWjRhrdjwVQDGpT7JXkN6b7g7UVSy70Oa0v8AjeW/l1dPev1aKaIxMojLHmqsWXk3&#xA;P46dPE4qiF8qvdB2bTtFnt5APQdY2+BQoUohUbL8Ndj3xVOfLnlu00mzKNFG13LT61MKtz4MxjqW&#xA;3+ENtiqve6Lpuq6ebe9t0mR60ZlVirbgMtQdxyNMVY1qv5cI0Fy2lm1F7NOk0U93CXdFRgfTEgbZ&#xA;RvSiVp13+LAWUSBzFoTS/L6xwyWnDQTqbF4vrCF5Jy4URl/jLOr+IrhYpifI63E0Ek+n6baAMpuB&#xA;ZK8ZdK1eM0CqwbvUYqydbS1toYIYIljjj4RIoHREFFX5AYql2r+T9E1JZX+rpb3kqhDdxKA9BQUa&#xA;lOQooXxp0IxVI9V8rzWCRmytNBi0yIL64u7douZ+JArvyccRyDDlU8sVQkvksahdWs1jHpH1W3mL&#xA;3VtBzeKRqDjyX4k2K9KD54CyiQLsJ35d8l2um3kl5cQwGYOzWgi5cIfU5hwgalAVemFinz2ttLyg&#xA;kiR4SGUxMoK0KqCKHboaYqkUvkDQfr6XVvbQJGisBaSxerAHdixkVAyUY8yO48AMVSYaM9rdPDqt&#xA;v5ZCkCSCJozG0aqFUIqPX4KR1rtv2xVEz+TLq9gkWSy0lXZzJDewo6zUZzIKOFqOPLiN+nhirJNJ&#xA;0Wz0vTfq8MKI7ASTlakNN6YRn38QoxV5d57sbCbzxcS3Ovm2h+p8ZbOFGlaN/WHBmDzBVr/kheoF&#xA;DU4qnP5a2mnw6qXs9Skv19CRS0kAiP203Dq8gbpuMVelYq7FXYq7FXYq7FXYqgb6a8jt41gtWuYn&#xA;UrP6UojlUEAAx8uIJ3/nWmKQaLzvRte/Msy3f1bS47rnVGSSSWRYZ4YwDHWaZU3cnkA/X9rYYqTZ&#xA;RMes/mfp1vcz/oe1ng9ZnaYSPLwUS8JE4+pz4xqu3FfehNcUJx5K1DzxPaxrqtpbm2j4ItwZJRLI&#xA;jKGM1X58qdKbVPTbFWTXsl5GVa0hSeWqjg8hiFCGqeQV+nyxVgepeZ/zBj8wIINIQRzH0baxkdxI&#xA;8XJGkk+CQwckWo58hSu/hiqE0zWvzLS5dE0mO5dvgkikeaQR8PWHPlNNwBaRQDxfoKYAykbNou31&#xA;b817T62w0W2uGLNIyLMZFikKxlYgrTVC8SzHhyFTt4YWKN8l6t56ubZvrFlby2kZHpzSSzq8pkeQ&#xA;txeQSNSL4Voy19ziqe6vqPmGzsJn0zTBeuq/6ORICS+5+OM+n8Ip+y5PTbrRVgsfmD8xp7CSBNOS&#xA;ZLacRNdrNcIPVklcPGXEqTN6fNFCgHpSuAhlGVLbvzP+YKaLDDNp0Fuk1IYdQd5VlfjCsgkUrJ6z&#xA;OzKx+x7eNTaBEnkitQ8zfmYyWYm0eOzQzhlIeVWkZJTwhqkj19RBQ+oBX7sUM00u68yy2cD6rZ28&#xA;U7RpIRFIw/esoJiZGVuNDUE8j9OKsf8AN3mDzpavAbfTEt7WBkluLhpXdWYOvGNGiKsefLiVdBU9&#xA;K7HFUn1fzb+ZdtDb3d5pNvaLEofg5kVJJXhaqNxlZOKt8VHYHYY2kRJ2C661r8xZ9WKrpCihEP1a&#xA;CWaM8BJG5kYxzCLkqPT7Y+1vUbYqDRtFaJrn5kXGvTQyadbxl+K3Mcjz+nAscchQ7s6qZjx3TkPa&#xA;tTihmrXOqpEkoske4JYz26TfZUAH4GZFDMaDY8RXv3xVhK+Z/wAw/wDFE1vHpSFJOXC0ctzjtY3m&#xA;EcpX1fSDyfACQ9DTbviq2LWPzUthd3Nzo9rIKCS4HqiQQMscRKKrTii8CzHiW3xVB2Wt/mVbQz3K&#xA;aUJoYyQ88st08arzk9SiPKrfu6KAVQmmKb2pk/lDUPOtzpqNqlpbiBOMKyF5BNJGIoz9Y5MHD1Jf&#xA;bap+8qGGecYvLI8/3MtnPCNYNi66nBcfV1QIJAVdWu1f4iKD93/zVRVkH5dLbG+5pLblvQYQpbm0&#xA;ZinIcmkMCo/ULTn44q9CxV2KuxV2KuxV2KuxVBXOqWdlGpuPUACB2ZIZZFC+JaNWA6YLZcJq2O2/&#xA;lXQLS9N5daTHavfMqSzQz3MpeeRzx9RQideR+N+nTCxTRfJ/l1JHAtPhlBLoZJSvvRS1BXlv44q3&#xA;a6rKL2LTLW0UQonwNK08bejGVRmUPDxbjyH7eIKZRo0mzf3w+j9TYoUrj6hPcJZ3EayycTMiSRll&#xA;opCkhiCtfi8a4qxy88seWIdSmubbTEa7jUz3jCS4i+GQNxPFFZZASrbD7PYYpAs0itN0Hy3drJKl&#xA;mUnUqlzGWuFCyBQ1P3np12Yb8elMUJtpB086fGNPBW0UuqKQ6kFXIcESAMKNXriqIt/7lfp/XiqW&#xA;XemeXNZsJpbm0S4t5STMxjZJGMLcTWgWSoKUxVII9G8q2cSMdKVdKkVplmVruXjCyjifTEZCA90q&#xA;ABgZUatO/wBD+XNN+rTGFkPqRxwOTPIfUY0Tlu1Kt3bvhYpvN/uv/XGKrLya1jiC3I5RTssPEoXU&#xA;mQ8QGAB2JNN9sVY55q8u+UfTW9vNMWa6VeFuIlnUn0w0pC/VldgeIY1C1PTAWUASaHMqlromgT3U&#xA;cVzYejdFWmt1SS5blDspLMVjCmpFUPTb2woIrZNdMg0i0urm0skMc8Yja4UiTo3LgQz7EbN9k4oR&#xA;q/3x+n9S4qoSrpt1dtbzRJNcQIrkSR8uKSEgEMwp8RjPQ9sVYsPLnlm11R7bSdJSS43W55TXUKcq&#xA;B/iYJIjNxK/ETXoMFshE1fcmlh5e8q3EMs1tbMYy7K6kzqA67OFRyp69aDc4WKb2r2r6bE9oa2rQ&#xA;qYDuP3ZX4ftb9PHFXn3nPS5b/wA2B5LKFRb2ZEd4JLd5HWSVysbR3LwcByQnkvL8dlUf5F06Gx1I&#xA;qYVFxLC5Lr9Woqqw+AfV5ZCa8hUsB02xVneKuxV2KuxV2KuxV2KvPfzA8sRy6bZSNLe3cKzECzHq&#xA;3FHkjaj1QerxqqrQuE+nqqkcfkPTbv8ARZguNVaaVyWW6tbiAxCUtIZC/FVDxkj7Tn2OKvQNN8pW&#xA;Gn2UNjDcXSqkSIzpcSpVolVS4Aai86fEBirBLvyiJPP6QOt9dma6Sa7vnSRIjGqLPxZ0VIeJMfH4&#xA;Ru3cHFXoq6LbRwLZpNcrEGVlYXEvMABgFD8uQWg6VxVhusfliJdXTUZNQuZTNOJbq7Vazr6ZV0VY&#xA;4l9Mgsm54beB7KpVH5N8rLqMlpGuuwmKtb0W0rqz8ZEIZRE3w8HHHio/Viqyz/L/AEik0Ut5qkB9&#xA;L0+MVjelWMixs78nibfmhB48TsMVZL5N/L+zsbY3kr3MU86oEhWSaEwiNpKhfiD0k51Knp+OKp5q&#xA;/ltdX0+eAX1zafWU9OT035IUruPTfkortutG9+tVWDSflxpOnxXrapLqDWqSRrFaWCSyq0KMWU8+&#xA;Dt8RkPJQRTfr1xVBf4K0e602N4l1iNwzPLZXVrcsnIQcVCGKPky8lUANJsPliq4fl/FcajYw2s2o&#xA;XFtuz3VzBc2zRtNKz80DRx7x7El2qf1BlQq73ejaX5ZstIsoLaCWdgsccDkyycSVUKZAnLirtxrU&#xA;YWLHPN3kG91K8gmgnluYbaFvSW4mJMb8lPwcV9SQnc/G/sKDoGQArnuxfV/IulWs8Np6mrXVbeOM&#xA;XEdnM7IoR434qojXqF2PI0Pj1LFNZfI/lb66knr616krGR7oWtzy5RsjohX6tw4niT9ntiqI8ufl&#xA;rp36Ve6aa7a1gcujTLPbvOZI3X4g/BlMRf4WUDFWcHS0MSW6XNzGYSzRziZ2k5UFC5YtzAJrxao9&#xA;qbYqwif8sIotf+vT31y8ErzXMtxEheV55Wk+F41RolULLswTfwHdVj+g+S9Ilkkiu/0zbLEpj5LZ&#xA;TssgBjNSSk3F+Ue44DwGKlHS+QfLklvOLWXV4rhWJS3ktLto29N5DF8RhVhzWTejjFWWeVPIun6P&#xA;Y+sHnN1KRPUySIyKYo19BgG+JQY60YYqjNWs1udRf1b/AFCzjESCMWTSBOXqSFieCOOVOPXtiq7S&#xA;rMQ6qrw3t/dRNHJ6q3jSFFYlOHEOqCv2umKsgxV2KuxV2KuxV2KuxVb6Uf8AIv3DFXelH/IPuGKu&#xA;9KP+RfuGKu9KP+QfcMVQ97dW1lGksoYIXC/u43kNSDT4Y1Y/hirELz82dAtdVeH97LpsdInvoo1e&#xA;H1mdApWcScOHFqnbFUFL+avl26uSbiO/gsWX07aVAYOT0dpKuswVqekApG9TTFVsX5u6TFbTIy3E&#xA;LjlJZNcQMzNAOG7AzcpGJc04nt2wFlGr3Tjyz+YlpqcbxXVvcx3cFPrDLayBF9R3EIKK0zqXSOvc&#xA;dq4WKa6l5p0fRrOWS+kZPQXkU4MOZNSEjZuKO53+ENXY+BxVjMP5w6MLR0uYLlNRXYQC3oxMjusV&#xA;IjLyPwqC29N+uKoKT80NG+qCW3S+fW1NPqlJWj9YqJZAYfWBCCpUV6dqgYqiLn839Pa4tzYCSW3L&#xA;f6ShtWd1RJeEshZJv3YC1ZQUJPtgZbV5ss07zPp2q28U0CTxExpdenNC6t6TiqNUBlPIdApNd/DC&#xA;xSjXvzJ0iye3hsme6nmKvII4TJ6UJIq0iF4nSqsGWo3G/Q1xVKJfze0WS0tmZLqWPiJr+a3hKhFK&#xA;l0VWWY8W5BVIJI61wBlKr25L4fzT8v2moFI/rcmmGiPcSq0o+sM6hQszzFAvFyT8tq4WKL0z81dM&#xA;vdWa2S1u3tpzxsWS2bk5jWRpzs7c1UR1HEV36d8VZSdZ09Iku5HaO2lLBZHjkUCgFWeqgooCk8mo&#xA;Kb9MVYjN+bGmDWzax8lsFlMK3DQhklaNpRKY5hMsfH90ODUNa9MUiuqCH5qeW7u4lmu01CCJ0Bsh&#xA;GzW/OEiPcgTKhcvLsV/ZGKETY/nBo8cDQ30N0LxW4xxJBRirM6x/A8pdmpHVqeNMVTry356s9csg&#xA;TbXMUw4wTuYH9IXBjR2QFS5AHqdWptirEPO+tapB5mm023l4QT+oGR4vUVh6Aei/DTdj8XJumKs7&#xA;0Py3plvZxs1o0dxQqzSBEk4hiQCIWKAb7UxVN7aCKAOkS8V5VpUnfiPHFVbFXYq7FXYq7FXYq7FX&#xA;Yqo3MJmKoJXiAqaxkAnp4g+OKsOXXNNludRlt5NWku9Oiid4mdxAfWiLoDw9SNQB9pmG3XfFU38p&#xA;397fWMk9yS8qTMhVWV1XiCKK4YhxU/a2r4DFUTf6Rps15BdiGGO9t3Lo7qrKSwpVkDJVhsVbqMVQ&#xA;CWPmRdTluv0vaGBxxW2a0BUKCxXcXCtUFzvX+xVdLp+rzJdRS39i0N2PjX6o1RVBGaH634IKe+Kh&#xA;H6JY2WlWKW0ZRnUUeZQiFviJA+0xovKgFdsVRZNu0HoTqjqftI5Qg133BOKpO2kvZx3f6EmtrKW6&#xA;k9XnLEJiG2qK+qvw9eI/Zrttiqla6br8WmfUJtWtJx6ZiEzWlH4FeHVblV2H+Tirc+iT313aXOp3&#xA;NpM1q3KkFuYi24JBLXEvwmnSnc+OKpr9R0v1Gkit4lkdQkrLwBMSinHY9ABgoM/ElQF7BC3eg6Bc&#xA;2a2jQIkccZih4so4gsrfzb7r36716nECkSmZGzzQl/p+vSz231HU7SztrYArCtorDkAyUoZ/s8Gp&#xA;QUwsVd4Nda4jmGoWIKK6FfqjUIcqT/x99aoMVX6VpVrZ3dxezG3kupyrcoY1hRCqlSUUySkFgfiN&#xA;d8VTT14uZYlSDXbkvgvv7Yqlf6G0yK/GoWixR3dJAzyASj965kYgeonFqsRUdtuwxVCWNh5mgnuJ&#xA;JtYs51nbkI2sxRaKEHHjcIfsoKgk4quk0zVZ7We0ub2wmt5i5obMlh6rFm3a6YVBY8dsVTewt7a1&#xA;s1tbdVLBAJGTgpdgoUuwB6mmKvGPzLmjg8+mRpbtFIkMixf3ZCWoJoFqGoOvMbdRXFXqPk7X9BvL&#xA;ZdP0+ZjPCrytBJEsLqnrNGSVjUR/bBG2KsiT7T/P+AxVdirsVdirsVdirsVdirsVSrzDd6Ja2iy6&#xA;yAbPlT4o3lHI9PhRWPStdqYqwvy7508sWovYNT9KCBoYbdFS1uiZIYUeOkyNEVpwG3iPuxVmPle4&#xA;0GexdtDJ+oq3EKVlQKwH2VSUAqoFKACnhiqj5hnurS3vbqHSY79o4WeKQGNn9RYyV9RH9P8Adjju&#xA;Vct4DFXndp5su4or23jsbW5tkY/WLiRmDwhpBGy1kuCxKLy+wdiN8VRnl/zK9v5auJ4tPsbq2t14&#xA;2rIVWRmK8i7LNMSUXp8L1rtTrRVMfJF7qV9DOILC0vbeIqzSzNIjM0rPsjP9Z+GNUUUr498VZBrl&#xA;xd2FhPc2+ixXoRKxygxs3Lxkjb0zwUD9lyem3WirC7LzPrstpdJa6Xa3ttBIUur0R0MTTSyVj/vu&#xA;R9OqqOJ2pvTbFVO3v9fm015bXQ7d4ipgk1lYGaU8I0LMeMwl6qd602G+Kq+peYNfhS0S/wBGhsIG&#xA;k5RyGNlklEchASizK4LpTZup7HbFWZ6O2qzaalxd6ZZRSTWwlQwMV5NJFy9JlaOqipIJ5H5Yqxzz&#xA;prVxp89mj6XHYwJxmmmIDK7KwrEhilj5Bh8PxruegxVKdQ836zBfWC3WlWlpfGES29jSv1l542VV&#xA;KrLTiHpTkpPy3xVHS3/m5db5/wCHwJCFhjshCTEw5pymLiX0vhVz9NKnFXWmp+bxq1yP8OI7zLya&#xA;3eFgkIiqqlXaT0z6n+SBWnfFUPpV35rhF9dReWY7ieYtPLNJbsrKSxX0FDyEv6fDiAvTw3xVuHUv&#xA;NsegyoNCWSFF4/pF4JPUKSqGMiq0vqngHryDdqbUxVfPe+bZNMS2k0AW0dfSW7EMnqs0cqKtQJRK&#xA;okFRUtv1riqjqfmTzEgtfrmiQWE9Fu4Lf0mDTBBIGjZUlVh0U8W+kYq9B0Jb4qst5Y2trI8YKvbM&#xA;TyDUahUopFOnU4q8i/NC3f8AxnI6vexiRJa+lKkUbcLUH4aGpp3LfZ674qn35c6tFpmqS2d5d3Ii&#xA;aJhDbTyvMwdrtkFIIw6KSSBUH2xV6bp19a39sLu0f1LebeN6FaigHRgD2xVE4q7FXYq7FXYq7FXY&#xA;q7FUPfafZX0Po3cKzRVrwbpUYqxfzTpGjWNsbr0tPt4Yl+JrvnVvtNwSkkQ5Nx238cVS3RNfnsgI&#xA;LM6cLdyJCsHEBuQG4c3TgnjQ/L2xVkWv6zcabZy3huLSBUT1eEzMGkCqCyoDJEtWJCrU0qRXFUs0&#xA;rWtR1iOaJ47TULQ8S3ogPEFZmoWP1iVW+x2HbFW9Sk8r6XJKLmHT7QJK0irLbyBncAkslF/eMF+0&#xA;UrT7sVSSf81NLtrQmzeOBIVZzC9tcLtWnworq32m3opxVUi/NrSIbaJrq4UM5VWaO2uQBzOx9IPJ&#xA;IAAd/wDMYqn8M2la6sqyW9veRMj8nltbhUbj0pJMqqw5fyn5dMVY/q50bTb76jDbaAZHVn9D0UaR&#xA;RGVjYOrTRMWLGi0HanbFWQaHpVoII7i30iytX4RvazxwrGp5EHkvBmYChqMVTW6nvLWL1bue0gir&#xA;x5yu6LUjpVmAxVi195/g+sm3hubSePl6RorzK7FivwssoHE8T2xVA/prTJWmTUNIsJEiAaWQQ1+F&#xA;TySqsT3Wv2tsVb0nXfJeq30lnZ6ZZyTwkrIEsJJKEMFP90r7Vb7X2ffFU08xWOjaZZrdfVNFtVZl&#xA;VBdQoCwLBDTk8I2LA/a6YqoaPZWN6556RpN2sUgDPawQERE1B50nmoaVxVZrmo+R9Etnn1K30q2R&#xA;XMaRSWzLI7AHZFZRyHwkch8Ne+KpDN+YP5cRWwunsLI2zceEq2gkDEgNQKhZtuQrtiqyf8xvLGk6&#xA;lGYY9NsZWkMduRaN6p39Nv3kUvwKWqORAH0dVU2j/OXRY1t/rMqJczRyNxCO4/coJJTs7cQF3+Kh&#xA;7dajFVN/zO8pXeprZNFb3OqSryWD0xI5Jf0+HMOU58tuPKvfpvirNtHstJv9NgvW0+GNpgW48E2H&#xA;I06Fx+OKptBbwW8YigQRxjoiigHyGKqmKuxV2KuxV2KuxVQvruOztJbmQqI4hydndY1C13LO1FAA&#xA;33xVLp9a1Pk8VtpvOeN1V1ml9BDzBI4OUYOdui4qoW3ml5PSWW04PKodZI5DJblGAZWW5KJEwZSN&#xA;69TTFVHX7HRtRkjGpaal1cJC0gi5KZhGhKPxVf3jqOe9Ntx3xVC6ZLe2MMFrZ6LBb20kgNvC94ok&#xA;qYyRxjki5BvSQnj1oD74qtn0/QfMpSe901jMicGcStDKqbCm3pSMvLpUUriqrpWt6fa6fHa2NldJ&#xA;ZKjyxFkmKmNjzZ1kkQ8lq9a174qhtSFxeTyRzaZd3kAkZhJ9YlQK4chlVYYuA4AlQQd6bmpJxVUW&#xA;x0NrY2sekSyQAhj6fNx+8jT9tVPWPjtXFUztvL2hX9hb87TjHC0npxkkMjGSr1OzV5pU174qm0On&#xA;20NstrEvG3UFRHtSjVrWo3rXviqTw+QvK8N9Hew2rRTxP6sYSWRY1cOJARGG4U5CtONMVTPVZpLa&#xA;yeeNz6ilFQmJ5gCzqKmOEcyPEjoNztirC9W1z8wbq5FrplnDwjbl9Y9IcJVVNv8Aep4fT+PelCRt&#xA;Qnc4qlEui/mWdeguESJeKvHLc84DGSZxIH2dKLWj09A712riqLl/5W5dXTwyLCloU6k2wDN6bBgz&#xA;q78gSKAGHuK0pXFV3lLQ/PUeuXst9MdNtJXeZJlFvMzEmKsbVmnrzAPJuANR70xVPPNP5fWfmF7a&#xA;ZnS1li5mWRYo3eXmFA5My1+FVK/TXqBiqa6J5XsdKtgiQwvdVkd7sRpG7NIzMdkUAU50AHbFUJru&#xA;gXOv2Edlqum20kUMvqIFuS26hkVvjt+vF69Nj374qlEn5TaKUmijjhhT1UktWWNeSgel6iPQKGB9&#xA;H4aUpU1rU4qhJ/yZ02aX1XuEZwzOnK3iYAnkafEpqKsdj/AYquH5N6Y1oIJp1kk4SobgxD1B644t&#xA;xNfhouy+AAxVTuvyZt7q8mvZtTZru4LNLOLa1DlnYsWBEVQeRr/Zir0W3WZYVEzK0u5ZkBVSSa7A&#xA;liPvxVUxV2KuxV2KuxV2KuxVBa2hfR7xQhkLQuBGo5Mxp0AHUnFUFaa9pNxe8DMZL3l6Yt0jlb0S&#xA;TQhqL8J/mZqYqgbHXdJga0tLgvFPYQLEtmIZXlMnBQWWJFZvhQEA06E/s7lVH6jc/VdQiuCrLGsF&#xA;wJLkIzpEvqIxLcQabKaVxVbLe2dLaS3huJxaTiSSkEpcmWCRQw5KvKvLcjYV3oMVX6dqNnc27JCz&#xA;yzS8p3lEUojJMnEqJWUIxT7AFa0HTbFUqt5hBaLpH1e8lvI7M2kPJY/QQGIVAlUqhHwjdmJ+nFWr&#xA;p1h1dElt3aV5VaJlt1m+FLuSUFZxKFTkHAPIfD1OKqU1/qulsbUQXhaeKFbRrVbeSP1lgVG9RnJK&#xA;gMo+4nFUwvfrEWnooWQT3Vy8UcS3BgA+sTyMC0kQkoQv8oOKtQSXVqLuC69VZrOFJyEu5JwyS+qB&#xA;8bxxMGBhPbwxVDy/pKVNPluUkitruaJUeDUZ/UX1ASvJRDGGHiOWKpZDY3iWGnajcXt+6ahGZWjG&#xA;oTdfqklyAAscfH+7p1PyxVM20XUxdGCFp3MSpKWk1a7X7ZYAf3L1/u++Ko+xkun+rmXnGLq3eZaX&#xA;Dy8fhXahjj3/AHmxxVJb7UbibRY72aK8tYbiB7i1kjvSCWW2kuFVvT4tQqhxVfLptxpl3yu76+kh&#xA;hs7m9AN/K4JtTDs1I49iH71+WKpvaXTm8+rSGZJJYZXTk83ROIJAlii3BcbiuKpb9fludPtp7qG8&#xA;tra+j9SCSO8IckQtcBax8WWqRnFVOJpI3lubtrqNYbJtRj4ajPKrIo+y6GNFGw7A4qmUVzcNcfVF&#xA;aWO5mikaEyST8fgKrv6kUR6yDda4qllrPrtreuNb1S0W1gPGdLdrgT1ZFZSgZ3qKuK/DiqjrE73L&#xA;x3Gn6ykdsJY4iJri5ich2UNVVaIdW+0ajFU1uGkXSB9X1e3GpkD03muWNuaOAx2YOfhr364q15dT&#xA;zG/O51C7t57R1kSE2xmqWVmXl8bupUhagjFUvt11C9vNOM9/L6dyXjktreWaKWMGNmDtSSlDxBBP&#xA;bp1qFVXQ5tRWbTke7MkMzAszPM/qVjL0iZ5H5BStHr9k7b9cVZjirsVdirsVdiqA18qNEvizmJVh&#xA;cmRWMZWi1qHUgrTxriqh+mNIu7mGK1vbdlaQF5I5U+NhusaEH4iWFTTsKd8VQOlajo8mlWs97qEc&#xA;cUcUaL6lwFJCqE5yuW5PzP8AMSCKYqjL2/0+y1a3kvbpLdHguFVZZeCORLGdkJAZh22riqFu9XtT&#xA;JBdpdoWN0sSRCUBVDQShPWVW7li5B7Ad1xVHQz6UWeKC9S4u+HNkEwdgnIAsI1NEWv8AKBiqVtLb&#xA;y6ubW3kEUMLIs63C3SsS0jR0RzIq/Fw+AlaNX4S2Kr9ZsV0y1tjZs7NPciNzObi5NJFcgKFmjYfH&#xA;x6ctu3cKpxpkEccMMisrvLErSPG7vExoDyTmzfCa7e2Kpd5ke5lWBbFC80Usc8cwEMkYaNiCro89&#xA;ux2aux/piql9T1F4dQub2aO5ubi3SJY7WNYqJEJCPhknccy05G7gdMVULK31m5FpDdzxQ2unyxOi&#xA;m3RZJBECNnW8mUfSuKqNrp2sS2GnWN0yRwWUfpiXhGKH6nJb7kXMnLeStAoxVNZU1n601xBf2ic0&#xA;SN1kt2fZC5qCLlP58VdBb3VvFCzzJdmztXiSKFFjdzxXoXmZRX06bkDfc4qkcGjapc6SbC5upPRs&#xA;oHgsY5Y7ZCxa1e2DFo5pOgkPWmKphLbahqVzKL4pHA9ld2ikLGtPrJipXjcyk0EZ6cfniqJjsZ7a&#xA;4e8nlFzNDFMkMKFgxWTi3EGe4kXkTGB1UeOKpbpmk38ltFZ3t3ILXT4/Ss1kit0JrbNb8iY5pCeI&#xA;kPWn8cVRMWiXTpcx3t9BLFLZPp8KxQmIrGwoGcm4fkfGnH6MVRllp0qX6XU1ws7xh44wpk2SRkJr&#xA;6k0/eMdAMVVTpVjfXN99aRpFE60X1JFWvoRivFWArviqA1/Q9EtNEkVjLa2nrQNKY5JWArPGK8CX&#xA;Vj81OKsaWbyLJcCL1dR9Mnj65hPpkEe8XKn+xxVmeh/V/wBCxfV39SDnP6T0C1X1JKGihQPoAxVK&#xA;dLjhTXLa7WCyjnvOIlKqyTUNsZQY1LMKfslu++KoXQJB+morn6rbxPqBo7pbvHT0FKj0XMrr7PRR&#xA;9OKs3xV2KuxV2KuxVxUMKEVHgcVWNBA1OUatQgiqg0I6HFXGGFgQUUg9QQMVb9OP+QfcMVW+jbIS&#xA;5RFLUDNQAk9ACfp2xV0kMXFm4LyCmhoK4qkurx29zq0Vu9ldmRfq7fXrcxcAPUZgrVf1EClPiYIK&#xA;g0BO4xVV8xCA6bbj9/Iwmie2mtjE0oeP4wy+qwV+SqQetQemKo/T1RLW2jUOvpQqhSXj6i0Vdn4f&#xA;Dyp1pirA5tLtdVmvo57iygFpfNDHHLGXk4FVcluVzEnH95T4UrQYqmGliNV8wW6tbzJZRpHFLbqw&#xA;QgxLL0kkn3Bbs3YbYqwa+1XUTqVqJLbSjORG8EbC9NS5r8TeoaMlKD4qcvHY4qzS0kupPK9xcERW&#xA;93E8ZJjQSRhqxhwon9QkHk3XffFURrFo+l3thPPBDqtWcLCLWJGUVQM4KJI/wg8iFG4HQ4qm+mXN&#xA;lepIVsVt3Sq/3MiclKGu8sUPjirzq7tPM03k6bXJ9atJDC1xNHYvptsWIt7hoDRq9Om/A0qPnirL&#xA;tA1/Rrh2shoIs1iYKqIkTgFnIb4VowCnc0BxVFatYzX3mHT7CO6ksoZbO6nneGK2d5Gia1jjHKeK&#xA;YjiJW+zTriqAu207RLXWpNZR9atLF7Z4IngsxNWVQOCBEtY2+L4vi+/FUzjnMIWOHyfcrFViQP0a&#xA;KEmuw+s71JxVW07U7Sa+ubZ9Kl0q5skhmkNwLYBopzIFKvBLMOsDA8iMVRK6tpVrJcvcXlvEtxLz&#xA;jLTRLssSKerDpwJxVJpIfKs/xaVqFuNREscyTfWlmKlXqzFPVox4lvtd8VTBRqoQSHXY2RWAZvRg&#xA;4k9eJIf2xVfb6xpVrb+he6laRzh5XkJmjQfvXdwQpdiKg9K4qp6dH5T/AEhNqVjc2Mk7hV5xNERG&#xA;VUr8JU/CWDb4qvtdG8u2GozajF9Uhnu/TYMqRJQRgqChFDuK1xVGP5l8uRyGOTVbNJF+0jXEQI77&#xA;gtiqtDq+kzoskF7BLG32XSVGBoabEHxxVUe/sUYo9xErLsyl1BB+ROKodtf0FJvRbUrVZqhfSM0Y&#xA;appQceVd+QxVX/SWnf8ALVD/AMjF/riqIxV2KuxV2KoW5jlaTkisaBASCN/i7KSACvUn9eKqiqyw&#xA;yclCsRUmtSTxAqf1Yqx2Xyxf/XZbyEwRGeYGS2QvwMYuWkLMx+ImWNv3iLxWpNeeKorzDp2rXsVs&#xA;sEUDQ20tvObYn4pGR/3icmHBVVDUNQk+A64qihIdJ0q3MiF5I41Wb4mZmkbiGJYhmYlu53OKsLl8&#xA;x+WJNRKtBC8T8pHuDeScqk1Pwenx+0enLFU5S80y1s2+q2Msv15HUQRtNKzJEaE0SORlXk9C3Hv8&#xA;sVUbDzHbT2f1i6t721YQzTmNp7qhEClmVXkWJGb4d6HFUlbz7pN5FLYjR57h5SXEck+7yRpzVXkY&#xA;ErXgAP6Yqrza5qOh+neP5VKSNMtrD6N+lw5mkqOARUc8qV7Yqj9O/MO6lnlXXNGuNDtIbWS6a8u2&#xA;CRgRmNWBMkcI2E/xHltTFWOXnlv8qxcW1/HYPcw3I5wx286+k6tWj1a4WqsUNKGnwn3xVndt5x0e&#xA;4ZVjak7EL6X7suHPEcPhkILVdRQHviqV+b59Nk1XS7CbTVvLt4bieC4kuvqPpRp6CuokG7eoXWqr&#xA;/LU9sVQENvbx2N7p76Fp89jfsr3MU2pJI0jJSnqO6sWpxXj4UxVQuJdLmttKltdCkudQ1a7u7MWk&#xA;OpMkcYsTMHkEocIwJt+wr8W+Kpx5ej532qadcaH+hLtre0ee6juEnaZJjcRrRhyKmIxMRX+bFULb&#xA;agmjW9xZiA3ri4nEVxdzi5cem/pgFac1FErQkb1pirUOvzXSzW09jaW5kIVLiOV7duw+0sU9PmTS&#xA;mKow6Oi+Sq/W7ssbdb8yC4YyeoIWfgJacuFRiqHtdf5RRWtpZQl4x8U99Ijsw93b0qnfFURehNR0&#xA;+3tpDBYSG5gVzY3axSsrOqEKI1c0o/2eXUYqr69pMIfTCbqeMRP9W5fWTAhUJK/KVgrBiTGBuO+K&#xA;qOpa1dJIxtLHTpI0685Ym5EGpIaqHp/k4qlkF8uteY9Oc282niLkPTt7thCwRWm/eQiONXqYwKnt&#xA;t3xVB+fJY5deZPXitXhEcdDFdzs6sxfmRAqotORH2ixA+WKs90WzsX0jT5PSikJtoiJQlagou4Lq&#xA;r7/5QB8cVRklrbem37lOh/ZHhiqvirsVdirsVdiq2X+7f5H9WKsF1xJz5xFwNMiur60UGzvPQf1F&#xA;gUxsYyQjeqPUlYqVkUKVqVJX4lUz89rJJpIuEt45oYYZpmeVSHUhAUCHhLxY+DJvSlQcVXfV9Wuv&#xA;LCW01mILlf3ccEVADEjqFbix+H4RXiT/AExV57H+Wfm5XDEzmkgf/ezegi9On931rvXFWTz+StXu&#xA;tI0i3NrbSyWEc0U0V48qLV2Ti6m3YE7J49+leiqH0nyBremyvcNaaeTHa3cYED3DPK00ZCIyyMU4&#xA;12NKHFWD2HkPzJY3UlxJaNZ2/CUJMYwDEWheOL4wEP23XdTX6cVR80nmHTIDq2p6sb+LTdQWCC39&#xA;SefldxMGRyjyf3RUMOS/FiqOsfN1x5pmvLKXT4ZmXTrl0tIoHVJvUltg6yCRm5V+HanStcVU7W11&#xA;h77yvql35PKXcOjulxPEFU2U87vHJaJGCrBBHNI54/ygAGq4qgdH0fWbeLy9cr5ZnsrWw1O+u5LK&#xA;Se5Wa3aZ4ZhI4geeK5WaUs3A0CfNTir2ubT7S7jUXVrDcrxovqqGoGUBgKqetN8VQh8q+XSKfoiz&#xA;HYERICPkQtR9GKoDVPKM8txpdxpF2NNk0yaSYB1e5RhLDJEyhXdQm8vKo64qiNL0TV7XVbvUdR1C&#xA;O9a5itYERIPR4C3kmYmoZ+XL6x7Up3rsqkOoaZG5nkkhhYTXNzRZlBMhFww+HlfWw2/1cVbs3HMp&#xA;FbaZC7kDitla1cnYAenftXFU5kPHyXWRgtNLHNwOIFLZqmldv+C+nFWKXN/ocd3wiS1u2T7MX1cX&#xA;QFR1+K/9M9e2Ko+xvVuXtEghtIv9JgYxrYJE6hZ0LUZbqTid+tDirIPMckUYsWkKcfrVOMiqyMTF&#xA;OKMHeJffdsVYpqGnwXLPI0NrJIymkkcMCkVHRVfUV6eFKYqraFY3UWtWk8k7PGzyqR6UCrza3lIH&#xA;KG5uKbKTTjTFUJ52mvU1udYJLgJ6kbcIbl4V50Wh4qyDkabNirPNK1C0GmWizXSesltE8vqSAuAU&#xA;X4nJNd+Q3PjiqKN7ZyAxxzxvI6FlRXUkinUAHFURirsVdirsVdiq2X+7f5H9WKsL1nWooPMzrNFf&#xA;J9TKS0iunS2lWiKWI5pGOHrKDG/22IoCd8VR/nPWEt7ZYES6JeGW5F3bM6xoka1qxjIZ+v2RXbc7&#xA;YqnOkXJubK3kaJ4GCvG0UjiVwY34GsgLcvs9a74qjsVdirz783PIM/m21svq8UklxZJP6IQxAcpW&#xA;hFGMjJtxQnbwxVhWmflC/l2wi1+4hu/0lYpO8sKLBOgAimRCqxy835c1qBiqnqOr6Pe6bd2d1ZXt&#xA;wk1ydREY0a4RWdq/ufhuefAU+xsa03xVkP5UaZ5fg8yzT6ZZzWsq2UscnKyuLVGVpYaVe4urosV9&#xA;P4QqjapJxV6zirsVdirsVdiq2T7P0g7fMYqwW88uai1zPJDplvKJbi4kZpbW0LUeZmVuTBmbkDX4&#xA;qYqpWvlnVBOGuNLiRKrQ29vp6lfFvjhep8NxirJWtLn/AAsLRYSbkWAgEJUf3noMvEgfD9rbwxVI&#xA;7fSvMLSf6RZxRIBXlHb2jsT4UPHFUemlzBYPUtJWmS4gcusFnGoCSoxJ41cUAJ+E1xVMNbtZrgWg&#xA;SFpUS45yhUjZgnpzCoEvwVqw64qlNzpGpMH+rwslR8HK0siQaeNadfbFUNo+leZYtVtZb6FTboZC&#xA;zLFbIVrC6g1hRW6sB1xVLvOOjNea9I8c8SfFH6iy6ebhgVIICzG2nqtO3Pjv061VZNpOmeV5YIYZ&#xA;NPtXvFt0juZDZrGrAABhVoo14lh0oPliqP8A0D5bj/eRadZpIiFUZYYgwFDsCB0xVNMVdirsVdir&#xA;sVWy/wB2/wAj+rFUqu7knXreGOytrh1jFbl5Qs8SSFhJxQxklfgH2W3PUAb4q15nuIYNMEUtpDdw&#xA;XLC3aCaQRIeSmg5FXXelBWmKpnFz4xc0WN+HxRqeSqdqgGi1A+WKquKuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVbL/dv8j+rFWJ67pd2/mW3urBL1Hme&#xA;Bbt1SKWzZIXEgdg0sbKy041APXZerYqivPFhJe6AImjuJ5Y3WXjZrGeTIpqrpNJErI4JWhf6cVTb&#xA;RoHt9L0+3cMHhto42DABqqqjcAtTp44qjsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdiq2X+7f5H9WKsUvLB7rXF1jRruQODAlxEGKRSKsnx1aRSGQx7fB&#xA;06gVaoVTLzBYXGoRae8ZjLWtzHPNbM4AK0KtxcDkHTlVSCP1YqmNiZfq1sJzW4EKiapBPOi8qldu&#xA;vhiqKxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q==</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:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+         <xmpMM:DocumentID>xmp.did:F77F11740720681195FE9289A38AD1BC</xmpMM:DocumentID>
+         <xmpMM:InstanceID>xmp.iid:F77F11740720681195FE9289A38AD1BC</xmpMM:InstanceID>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:D47F11740720681191099C3B601C4548</stEvt:instanceID>
+                  <stEvt:when>2008-04-17T14:19:21+05:30</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FD7F11740720681197C1BF14D1759E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T17:01:20-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F117407206811BC18AC99CBA78E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-19T18:10:15-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FB7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+                  <stEvt:when>2008-05-22T14:26:44-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:08C3BD25102DDD1181B594070CEB88D9</stEvt:instanceID>
+                  <stEvt:when>2008-05-28T16:51:46-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F11740720681192B0DFFC927805D7</stEvt:instanceID>
+                  <stEvt:when>2008-05-30T21:26:38-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F11740720681192B0DFFC927805D7</stEvt:instanceID>
+                  <stEvt:when>2008-05-30T21:27-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F97F1174072068119098B097FDA39BEF</stEvt:instanceID>
+                  <stEvt:when>2008-06-02T13:26:10-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F1174072068118DBB9A084B3843B2</stEvt:instanceID>
+                  <stEvt:when>2011-06-09T11:06:05-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F1174072068118DBB9A084B3843B2</stEvt:instanceID>
+                  <stEvt:when>2011-06-09T15:15:58-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:7FF2245A3B2068118DBB9A084B3843B2</stEvt:instanceID>
+                  <stEvt:when>2011-06-09T17:21:50-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F11740720681195FE9289A38AD1BC</stEvt:instanceID>
+                  <stEvt:when>2011-08-11T16:24:13-03:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>uuid:4e77a4dc-c4f9-5f4e-8a6a-79787d0e84c9</stRef:instanceID>
+            <stRef:documentID>xmp.did:7FF2245A3B2068118DBB9A084B3843B2</stRef:documentID>
+            <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+         <illustrator:StartupProfile>Web</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:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>719.658203</stDim:w>
+            <stDim:h>779.438477</stDim:h>
+            <stDim:unit>Pixels</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:Fonts>
+            <rdf:Bag>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>BitstreamVeraSerif-Roman</stFnt:fontName>
+                  <stFnt:fontFamily>Bitstream Vera Serif</stFnt:fontFamily>
+                  <stFnt:fontFace>Roman</stFnt:fontFace>
+                  <stFnt:fontType>TrueType</stFnt:fontType>
+                  <stFnt:versionString>Release 1.10</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>VeraSe.ttf</stFnt:fontFileName>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>Arial-BoldMT</stFnt:fontName>
+                  <stFnt:fontFamily>Arial</stFnt:fontFamily>
+                  <stFnt:fontFace>Bold</stFnt:fontFace>
+                  <stFnt:fontType>Open Type</stFnt:fontType>
+                  <stFnt:versionString>Version 5.01.2x</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Arial Bold.ttf</stFnt:fontFileName>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>ArialMT</stFnt:fontName>
+                  <stFnt:fontFamily>Arial</stFnt:fontFamily>
+                  <stFnt:fontFace>Regular</stFnt:fontFace>
+                  <stFnt:fontType>Open Type</stFnt:fontType>
+                  <stFnt:versionString>Version 5.01.2x</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Arial.ttf</stFnt:fontFileName>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>Arial-BoldItalicMT</stFnt:fontName>
+                  <stFnt:fontFamily>Arial</stFnt:fontFamily>
+                  <stFnt:fontFace>Bold Italic</stFnt:fontFace>
+                  <stFnt:fontType>Open Type</stFnt:fontType>
+                  <stFnt:versionString>Version 5.00.2x</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Arial Bold Italic.ttf</stFnt:fontFileName>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>MyriadPro-Regular</stFnt:fontName>
+                  <stFnt:fontFamily>Myriad Pro</stFnt:fontFamily>
+                  <stFnt:fontFace>Regular</stFnt:fontFace>
+                  <stFnt:fontType>Open Type</stFnt:fontType>
+                  <stFnt:versionString>Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>MyriadPro-Regular.otf</stFnt:fontFileName>
+               </rdf:li>
+            </rdf:Bag>
+         </xmpTPg:Fonts>
+         <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>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Black</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Red</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Green</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>193</xmpG:red>
+                           <xmpG:green>39</xmpG:green>
+                           <xmpG:blue>45</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>237</xmpG:red>
+                           <xmpG:green>28</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>241</xmpG:red>
+                           <xmpG:green>90</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>247</xmpG:red>
+                           <xmpG:green>147</xmpG:green>
+                           <xmpG:blue>30</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>251</xmpG:red>
+                           <xmpG:green>176</xmpG:green>
+                           <xmpG:blue>59</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>252</xmpG:red>
+                           <xmpG:green>238</xmpG:green>
+                           <xmpG:blue>33</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>217</xmpG:red>
+                           <xmpG:green>224</xmpG:green>
+                           <xmpG:blue>33</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>140</xmpG:red>
+                           <xmpG:green>198</xmpG:green>
+                           <xmpG:blue>63</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>57</xmpG:red>
+                           <xmpG:green>181</xmpG:green>
+                           <xmpG:blue>74</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>146</xmpG:green>
+                           <xmpG:blue>69</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>104</xmpG:green>
+                           <xmpG:blue>55</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>34</xmpG:red>
+                           <xmpG:green>181</xmpG:green>
+                           <xmpG:blue>115</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>169</xmpG:green>
+                           <xmpG:blue>157</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>41</xmpG:red>
+                           <xmpG:green>171</xmpG:green>
+                           <xmpG:blue>226</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>113</xmpG:green>
+                           <xmpG:blue>188</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>46</xmpG:red>
+                           <xmpG:green>49</xmpG:green>
+                           <xmpG:blue>146</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>27</xmpG:red>
+                           <xmpG:green>20</xmpG:green>
+                           <xmpG:blue>100</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>102</xmpG:red>
+                           <xmpG:green>45</xmpG:green>
+                           <xmpG:blue>145</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>147</xmpG:red>
+                           <xmpG:green>39</xmpG:green>
+                           <xmpG:blue>143</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>158</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>93</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>212</xmpG:red>
+                           <xmpG:green>20</xmpG:green>
+                           <xmpG:blue>90</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>237</xmpG:red>
+                           <xmpG:green>30</xmpG:green>
+                           <xmpG:blue>121</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>199</xmpG:red>
+                           <xmpG:green>178</xmpG:green>
+                           <xmpG:blue>153</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>153</xmpG:red>
+                           <xmpG:green>134</xmpG:green>
+                           <xmpG:blue>117</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>115</xmpG:red>
+                           <xmpG:green>99</xmpG:green>
+                           <xmpG:blue>87</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>83</xmpG:red>
+                           <xmpG:green>71</xmpG:green>
+                           <xmpG:blue>65</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>198</xmpG:red>
+                           <xmpG:green>156</xmpG:green>
+                           <xmpG:blue>109</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>166</xmpG:red>
+                           <xmpG:green>124</xmpG:green>
+                           <xmpG:blue>82</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>140</xmpG:red>
+                           <xmpG:green>98</xmpG:green>
+                           <xmpG:blue>57</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>117</xmpG:red>
+                           <xmpG:green>76</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>96</xmpG:red>
+                           <xmpG:green>56</xmpG:green>
+                           <xmpG:blue>19</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>66</xmpG:red>
+                           <xmpG:green>33</xmpG:green>
+                           <xmpG:blue>11</xmpG:blue>
+                        </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>R=0 G=0 B=0</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>26</xmpG:red>
+                           <xmpG:green>26</xmpG:green>
+                           <xmpG:blue>26</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>51</xmpG:red>
+                           <xmpG:green>51</xmpG:green>
+                           <xmpG:blue>51</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>77</xmpG:red>
+                           <xmpG:green>77</xmpG:green>
+                           <xmpG:blue>77</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>102</xmpG:red>
+                           <xmpG:green>102</xmpG:green>
+                           <xmpG:blue>102</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>128</xmpG:red>
+                           <xmpG:green>128</xmpG:green>
+                           <xmpG:blue>128</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>153</xmpG:red>
+                           <xmpG:green>153</xmpG:green>
+                           <xmpG:blue>153</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>179</xmpG:red>
+                           <xmpG:green>179</xmpG:green>
+                           <xmpG:blue>179</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>204</xmpG:red>
+                           <xmpG:green>204</xmpG:green>
+                           <xmpG:blue>204</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>230</xmpG:red>
+                           <xmpG:green>230</xmpG:green>
+                           <xmpG:blue>230</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>242</xmpG:red>
+                           <xmpG:green>242</xmpG:green>
+                           <xmpG:blue>242</xmpG:blue>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Web Color Group</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>63</xmpG:red>
+                           <xmpG:green>169</xmpG:green>
+                           <xmpG:blue>245</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>122</xmpG:red>
+                           <xmpG:green>201</xmpG:green>
+                           <xmpG:blue>67</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>147</xmpG:green>
+                           <xmpG:blue>30</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>29</xmpG:green>
+                           <xmpG:blue>37</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>123</xmpG:green>
+                           <xmpG:blue>172</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>189</xmpG:red>
+                           <xmpG:green>204</xmpG:green>
+                           <xmpG:blue>212</xmpG:blue>
+                        </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.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>\r%  &&end XMP packet marker&&\r[{ai_metadata_stream_123}\r<</Type /Metadata /Subtype /XML>>\r/PUT AI11_PDFMark5\r[/Document\r1 dict begin /Metadata {ai_metadata_stream_123} def\rcurrentdict end /BDC AI11_PDFMark5\r
+%ADOEndClientInjection: PageSetup End "AI11EPS"
+%%EndPageSetup
+1 -1 scale 0 -779.438 translate
+pgsv
+[1 0 0 1 0 0 ]ct
+gsave
+np
+gsave
+0 0 mo
+0 779.438 li
+719.658 779.438 li
+719.658 0 li
+cp
+clp
+[1 0 0 1 0 0 ]ct
+706.658 767.438 mo
+13.1016 767.438 li
+13.1016 43.1133 li
+706.658 43.1133 li
+706.658 767.438 li
+cp
+false sop
+/0 
+[/DeviceCMYK] /CSA add_res
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+1.49613 lw
+0 lc
+0 lj
+4 ml
+[] 0 dsh
+true sadj
+706.658 767.438 mo
+13.1016 767.438 li
+13.1016 43.1133 li
+706.658 43.1133 li
+706.658 767.438 li
+cp
+.193668 .150057 .155337 3.0518e-05 cmyk
+@
+706.658 43.4492 mo
+13.1016 43.4492 li
+13.1016 14.3047 li
+706.658 14.3047 li
+706.658 43.4492 li
+cp
+f
+1.17553 lw
+706.658 43.4492 mo
+13.1016 43.4492 li
+13.1016 14.3047 li
+706.658 14.3047 li
+706.658 43.4492 li
+cp
+@
+.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT Initial
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\r12 dict dup begin\r/FontType 1 def\r/FontName /ArialMT def\r/FontInfo 5 dict dup begin\r/ItalicAngle 0 def\r/FSType 8 def\rend def\r/PaintType 0 def\r/FontMatrix [0.001 0 0 0.001 0 0] def\r/Encoding 256 array\r0 1 255 {1 index exch /.notdef put} for\rdup 32 /space put\rdup 65 /A put\rdup 67 /C put\rdup 69 /E put\rdup 73 /I put\rdup 76 /L put\rdup 77 /M put\rdup 78 /N put\rdup 79 /O put\rdup 80 /P put\rdup 82 /R put\rdef\r/FontBBox {-665 -325 2000 1006} def\rend\rsystemdict begin\rdup /Private\r7 dict dup begin\r/|- {def} def\r/| {put} def\r/BlueValues [0 0] def\r/password 5839 def\r/MinFeature {16 16} def\r/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869\rsystemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup\r/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def\r/Subrs 5 array\rdup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> |\rdup 1 <1C60D8A8C9C3D06D9E> |\rdup 2 <1C60D8A8C9C202D79A> |\rdup 3 <1C60D8A849> |\rdup 4 <1C60D8A8CC3674F41144B13B77> |\rdef\rput\rdup /CharStrings\r12 dict dup begin\r/.notdef <1C60D8A8C9B6E3FA5101D97F0BCF44F7161DEB1E2A84766DD477E7\rC8A936AA182F5809A9> |-\r/space <1C60D8A8C9B854D00D> |-\r/A <1C60D8A8C9B64EDFED26B9E21A4F64848088903AC9891CF791BDBC4AB29A\rCC8B3E8D13924A7DDE35F09AC5F4A8229C87124C732743268600EF8D4582208B\rD16D82> |-\r/C <1C60D8A8C9B6079F6D1C46AC2732DFBDC9143C94793529C1940296210AAD\r6EE09C39CFC4DAB7C5F3BA33C9E10838E0BC6FC9318A4E57F309EE20438B434C\r69AE73A499211EBA75E22A57C1581D93869428818DC700A28C027571D7047CDF\rA8B017AACDE96DE4B2579EFD2C826A30F6EBDDC52701A22CDD669ADC60B66F32\r261A1F55EDEF9802FD4511E0EF130772EDFD708A4113A1EDB1E717E0FA7D3148\r51DE59> |-\r/E <1C60D8A8C9B64EDFFB83C6241DB110BEE5AB2FAD9D94B39ED5E81E7411B6\r6E9361DDE78FC667AB91EF9824> |-\r/I <1C60D8A8C9B854D0F463D3892D665712D6B7D6A81E> |-\r/L <1C60D8A8C9B7EF3224EC6E192BD0FEC2445DA87B99CF0E03A72A> |-\r/M <1C60D8A8C9B6B41CBB4B6664BFFC865F56E6FEAFA79E7B90883C1C68AFB3\r79AC174B0F8DCC9294E2C26BD06BBA9FD3867F8768651EF4BA798B4F538FCE8F\r80AF5A83421F8F> |-\r/N <1C60D8A8C9B6079F629170873C67115641D0B6890161EC48F71E8D2106F3\rAC927984C1E464F121F968> |-\r/O <1C60D8A8C9B6FF86E621E1FAD9CC02A23AF5AAF7451327A9277DAE8170AA\rC8E603A02E3EEFF561DDADE9FD6F6F16B77EE709DD797791A73F1C532C58482F\r9C51E1EAE7EA6E4D820E6AA1026E7BE345B1C97C5D9EBBEF4840C4188F96B538\r0E7625249BBAD172254404F6F1CB17CABA1F131B17AAAB56C5D3B94E3AC2C2E9\rF0A0D079C435D0249DF6C47E18FCF00E7FFE3C519BB35DF797EF47286BDCA762\r289BE1> |-\r/P <1C60D8A8C9B64EDFF4950CC53012D47AE97D5586315BA2F5162B63CEC117\rC5379A1B3DB174CB2C739C68916A1E99A346AFF71DBF25658867D9AEF1BF3C47\rCE1BA73978E8D0D40E52B85A56E08A1369D85E15B0A0C517291916FF6E61D0EF\rBF59B4862165C7DEA15B42BE3811C2CAA25C54> |-\r/R <1C60D8A8C9B6079F62E89B521DCDBE3DC5497B8DD99916239C0DFA5ED4F6\r32B33575F4260343AF5DB7D477D12055F49C5E99C0AC176EAD42723223937F2B\rA15ECAD7751CB6A136B700EE485E38E7CDB87D9465C90BB8E29B04FDDA42609F\rBC3833B9FB5105619F4CC434003085F449D9FD5022725306B331FB97B31D2952\r57B180DE1FD5465D256CCA19301DA97326882845130A5257BF61307ABA64C3F0\rB222> |-\rend put\rend\rdup /FontName get exch definefont pop\rend\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT /ArialMT findfont ct_VMDictPut\r/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /.notdef /C /.notdef /E \r3{/.notdef}rp /I 2{/.notdef}rp /L /M /N /O /P \r/.notdef /R 173{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [16 0 0 -16 0 0 ]msf\r284.899 36.4146 mo\r(ECORE MAIN LOOP)sh\r234.184 104.554 mo
+59.1172 104.554 li
+59.1172 65.1787 li
+234.184 65.1787 li
+234.184 104.554 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+.278741 lw
+234.184 104.554 mo
+59.1172 104.554 li
+59.1172 65.1787 li
+234.184 65.1787 li
+234.184 104.554 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+234.184 191.073 mo
+59.1172 191.073 li
+59.1172 151.698 li
+234.184 151.698 li
+234.184 191.073 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+234.184 191.073 mo
+59.1172 191.073 li
+59.1172 151.698 li
+234.184 151.698 li
+234.184 191.073 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+234.184 277.533 mo
+59.1172 277.533 li
+59.1172 238.158 li
+234.184 238.158 li
+234.184 277.533 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+234.184 277.533 mo
+59.1172 277.533 li
+59.1172 238.158 li
+234.184 238.158 li
+234.184 277.533 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+234.184 362.545 mo
+59.1172 362.545 li
+59.1172 323.17 li
+234.184 323.17 li
+234.184 362.545 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+234.184 362.545 mo
+59.1172 362.545 li
+59.1172 323.17 li
+234.184 323.17 li
+234.184 362.545 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+234.184 564.759 mo
+59.1172 564.759 li
+59.1172 525.384 li
+234.184 525.384 li
+234.184 564.759 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+234.184 564.759 mo
+59.1172 564.759 li
+59.1172 525.384 li
+234.184 525.384 li
+234.184 564.759 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/S <1C60D8A8C9B64EDFE3D078722A65C31955939D63AA5C8A4945719B5E558E\r3B73A676CC12D1E18D93A8DC67C074D6E352D426981DE76F8EC4CFE5DAE051BE\r47753A7C234C4B8D7D9F50292A61882B5500CC701F878FE626CDC6D4C322BB39\r1537921D673F5AEE3EC19E36E7EFEC0F06A0EA4EAAB6BBA94DDCD11A6A564B13\rB510F8C915848233B82F046D854DCD4F1639F149305DC73D3C68DF8AEB47A96A\r30E55CF8BAD07FA2825BCE0D675F1CC2EBE61B07B772130E23119250F1EBF8FE\r12A2098D9F09F3F21BDC41666CA4A0BB70D5F0A750B44BB93A5FBFDD2BF8DE45\r0B277265536F77D5BD6F44FB72FF2E708C60107653AE44BFFB26AFF8> |-\r/a <1C60D8A8C9B7EF32244AC11AA6BAAA29EE8C78E0E7206F4A2776A2D1EA7D\rC8D9A28C62ADE3B609CF5E2EE23C64D0B75055BD249ADFEC7B4224D040D883CA\r6747571955349CF8AD17E94E6FE5D0259F4D55623D4DC5C3CB4AC64A7A87DBBA\r48B7420D7990F3C261DB9838C5B90BF72B82C8238A1A58FE8E6137AAFE2405FD\r710F7ADB95B4F576668A6DB104942C88ED8D01E4E58188F5E32A24B5B964D5CE\rC10C08F76C0F472E84A0FB6EB5E37AAEE233DE54C212B0A012D3E20F864B2D53\r463E221F81B784B6F7BE81FBFCAE6785C2430454DD81C436E0A516BF8C8307B2\r879FF86378629C5EA7E586D83C83550D2E732930F7FE3BAD07B86C81E024D177\rB5D88A> |-\r/e <1C60D8A8C9B7EF322472FA01213C7AD90A23B536C2309DD40D370E2449B0\rD0FEF85A6BE8067F30686F143E75903EB6FA56935472EF47CE3F33433C2F0C8B\r6FA51573AE54B2C516F6F024F8775AD6639544E339FC2A328548BCBFD58B0EEA\r03B7DC3AB069F44477958BFBFAAC7196D411DF9BE0B78A86C4BC33EC5D7C3729\r5284C077711C162623860AACA404F650F8D516970257> |-\r/g <1C60D8A8C9B7EF322851D9960AE993FFFAEAEBBA8EF734FCE7E65DE817A0\r65D42CB79E2F25620DE08D5E215259551032CAAB8B674940F5B4BAAF40766D55\r9B26E9A0C2464D0F504C4718579670D62707FEBC08A2CD71BF2528BA3A24A0C2\r47BA70F9E817A1709BB6F7008D6C121249525DEE3A93F6DA16170F68BD3667DC\r9FF533284D078DAE144C0DB42F376056761CFA5A80B4ED7D37E57EA658F3FBD8\r8F779C828BF992A89F02F1397EF90BADA44FB7F676FF0295FF6F9748D66EBF57\r5C72F67F4BEBB98F8AFA57505EC9> |-\r/m <1C60D8A8C9B6B41CBB5F87BE20C872DF59FABCB36542419CBFA3D5519AD5\rBA8076F32ECFD724B055F72CAC37BC47239ACC8B0FB48B8ACFF099B97085BD99\rC333951D0338D27FF6AB9B3F3C69320476BA0CD4F9573B79AD358A91B0176AFB\r9AEF169308783E9C6287F18E6E658AF5AA6C9688B500806DA169A1B21069D55C\r54A2FF607A6A38976171B08665C3ACCAA84DFB970D01180645CE5CBC48DFE37B> |-\r/o <1C60D8A8C9B7EF32334FFE7884F6C3B903D000D9FD76C2EAE8EDCCA90A98\r7875625CA0393015EF6761BE1C3B6D9E9DA4BABE1DD313B783BCBF8F620C846C\r7F6361946173FB7A4A6BF94EAA0CB4947DD1974AF371F3C211E584576DE9AD79\rF9DA988E9E531810E3876F3029BB1D2ED366525F30E48DD7CE3C9B66C5CC099F\r518C54BB58C51D6FB6D0C8> |-\r/p <1C60D8A8C9B7EF322B3B0CFC8FED720BC90E20B208D27DC4B8F11F10B964\r70F8B4F5FABEC7F7010781F5077B417FE44279776F2304ACD6E0EA12F436330D\rC4B79C907B9D28468D10FF9256A7D2CA504E4498D719ACD86FCA89B33C61F556\rCF1168C3F262A781155D5EBF0C47D71C584AB93037B47B18D39FE408A49672C1\rE63F9E8368D19E113FC95C59A9FA4650E46F6399F2FF256844E27568BA34B9> |-\r/r <1C60D8A8C9B81F2C3A9694980E415F1DEF5C498473095A24D1BE11285789\r4FEA85DB28AD762FB8D2F4CAC5BF8B9C18D8A2DFCF155E0751AF58898A6619AD\rD420F549AB7C795751D32E8EE6> |-\r/t <1C60D8A8C9B854D0F45CF665C7276F8075B54A4ECD6470F395A458CA2D06\r5152075036EEECA213894C1EA0DACFBD370590F4B831924E5BDA5281442349CF\rAD2545E0750C3004A129C25B1EAA8DEF5DA8BF1998E80AE266F591E64CB5127F\r5C42C88FB43C> |-\r/u <1C60D8A8C9B7EF32240889FE90FF09F794E92023A18223CCBE3629AB7F51\r7D090BF7D55C0A5A8EADD9BE381137FE8504E8B2DB3D16839889E327241ACA8F\r992A2BB9AD2BCE57ADB306CE2789439E67A64C32BE8669C197F5851EE3879399\r0906DA8D7F8ACFF6D70790F06B02> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 83 /S put\rdup 97 /a put\rdup 101 /e put\rdup 103 /g put\rdup 109 /m put\rdup 111 /o put\rdup 112 /p put\rdup 114 /r put\rdup 116 /t put\rdup 117 /u put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /.notdef /C /.notdef /E \r3{/.notdef}rp /I 2{/.notdef}rp /L /M /N /O /P \r/.notdef /R /S 13{/.notdef}rp /a 3{/.notdef}rp /e /.notdef \r/g 5{/.notdef}rp /m /.notdef /o /p /.notdef /r \r/.notdef /t /u 138{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r75.5703 92.5557 mo\r(Set)sh\r106.528 92.5557 mo\r( up )sh\r140.93 92.5557 mo\r(program)sh\r%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/d <1C60D8A8C9B7EF322407C6655A1B3652DB8522EB511BE6B0855A72D96214\r58876CAD1FA22A00635F436A34E23EAFC09C394044ECC1389CD99E4AF1C1F6DD\r52305C78619784840FC37A805B0805EF290BC9E049CF068290816CB7E74DB612\r941355BCE71CBDD11DD0F9CA29531036ED13EFB9CAB613E9F630FBBC9408EF13\rCE4683D92968530F64760C3DF85C7C7EA06EBA8BF859> |-\r/i <1C60D8A8C9B88C087228DFC7C7ABCC71B868F57EDB285655227000619B17\r1C8A80AB> |-\r/l <1C60D8A8C9B88C08722AD20D19A90F9064193C8D82> |-\r/n <1C60D8A8C9B7EF322B3BE19FB964E04D2DB06D4930CA5D8F41D2EF3A285C\r0BD536CD2C57668EB9E30311BF9A2872DFB44F2BF2A4683B5D66FA01BB1CCDAD\rE9C8A9EE2CB010715D3D6DFF0E843CF77C87A07D1DBD0482675E3CA1DAA2A520\r3A8015DD09B7CE> |-\r/s <1C60D8A8C9B7A73DA057E90C9BFBE0FE301E99CB771FA2F05368A6342B5F\r80456D91458EA2F3CAD55CDF89BFF34EEB39D7DD325B057E2BF0E9B878C214E2\rBD1BD70DCABE10E0DC8EBCF7B100B55EBE94FB0F17084E21EBD279B324AEABD9\r6538911D053BE9D7ECBF43F934B1033C9E405BBE31E7EDB643609C8D779046E1\rB250C3CF05E6FA4787649137D90F47F85972A6603BA900DD7CB710E02662DB32\r87CB26D7B7AE794611498865FC85A28083D2F6C2DEC302D47619A4A577C5B843\r5558FCFE71A1BB6783AFD5F58B6D2C03593B3F2297A66A7E6D13C1E321C57F41\r72D53C8FCAF4D28F2B78D3A4BF03> |-\r/x <1C60D8A8C9B7A73DB920A1A3B81DE7234ACAA5546B4C65820CF3C50E1629\rC5A6423BAA34A2ECA8C7FE4B71726AC6704CC23AF1725AFB30D2892FC1BDDAFE\rAD7BE7BD65F1051699CCF4B0> |-\r/quotedblleft <1C60D8A8C9B81F2C29FEF6324F1D6735A7858A1650FF442B8\r8CE2923602889F1B3B1A969EB1BD5F20410F3DB624E1F268B8C262BA05A2218D\rB63CD4FCDB84E55D828665FCCF9A1929C551F51708569F37B29C42371CBCFE1A\rDDF91> |-\r/quotedblright <1C60D8A8C9B81F2C2EF77CAB1B3909C6126BCD66FE80E8DB\r29C6D13E62A206E4D2C01E4CBD15B6CCAE445397315B1B2A4223B2D9E8CFF123\rFD968D68396195C7E56F7437E66455F3A5CFF0D3E7C9903481BE93623D7A22F2\r1FF9D67D> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 100 /d put\rdup 105 /i put\rdup 108 /l put\rdup 110 /n put\rdup 115 /s put\rdup 120 /x put\rdup 210 /quotedblleft put\rdup 211 /quotedblright put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /.notdef /C /.notdef /E \r3{/.notdef}rp /I 2{/.notdef}rp /L /M /N /O /P \r/.notdef /R /S 13{/.notdef}rp /a 2{/.notdef}rp /d /e \r/.notdef /g /.notdef /i 2{/.notdef}rp /l /m /n \r/o /p /.notdef /r /s /t /u 2{/.notdef}rp \r/x 89{/.notdef}rp /quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r89.3267 176.887 mo\r(Idle )sh\r128.311 176.887 mo\r(enterers)sh\r75.0112 264.347 mo\r(Idlers or )sh\r155.245 264.347 mo\r(\322sleep\323)\r[6.86865 10.3125 4.58203 11.4707 11.4707 11.4707 0 ]xsh\r96.7842 349.331 mo\r(Idle exiters)\r[5.73047 11.4702 4.58252 11.4707 5.72998 11.4707 10.3125 4.58252 5.72998 11.4707 6.86816 0 \r]xsh\r234.184 479.113 mo
+59.1172 479.113 li
+59.1172 407.598 li
+234.184 407.598 li
+234.184 479.113 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+234.184 479.113 mo
+59.1172 479.113 li
+59.1172 407.598 li
+234.184 407.598 li
+234.184 479.113 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+234.184 683.385 mo
+59.1172 683.385 li
+59.1172 611.869 li
+234.184 611.869 li
+234.184 683.385 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+234.184 683.385 mo
+59.1172 683.385 li
+59.1172 611.869 li
+234.184 611.869 li
+234.184 683.385 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/F <1C60D8A8C9B7D8BE1661AF70E1029B586475C590C02056C6BE2BB9C2329F\r7F6ED1937D1E8A10> |-\r/c <1C60D8A8C9B7A73DB9D8FD6AA4FBAF8D65C36EA1D4AADBD389F972C0EDCE\r9E7F36285FA93A80D3647871D2CE5AAAA6A6A370DC54E1595FB6AAB3E389C9F7\rBBBB85F787D6C418B35B940450E5E243895ECFD2205F51B2D154CFFECF34148C\r344C1EF806F9AAF539FB961E3EFAF6353381E833DF7C0542FFF27122A28D3654\r8FE63FC8465B1B685766E782F0> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 70 /F put\rdup 99 /c put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /.notdef /C /.notdef /E \r/F 2{/.notdef}rp /I 2{/.notdef}rp /L /M /N /O \r/P /.notdef /R /S 13{/.notdef}rp /a /.notdef /c \r/d /e /.notdef /g /.notdef /i 2{/.notdef}rp /l \r/m /n /o /p /.notdef /r /s /t \r/u 2{/.notdef}rp /x 89{/.notdef}rp /quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r81.8896 436.481 mo\r(Fil)sh\r103.653 436.481 mo\r(e descriptor)\r[11.4707 5.72998 11.4707 11.4707 10.3125 10.3125 6.86816 4.58252 11.4702 5.73047 11.4707 0 \r]xsh\r%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/h <1C60D8A8C9B7EF322B3BE19FB964E037672C8A279BC86F7B9BF0C8203E13\r1450D56E388301CEAE43162551FBE05CABF94DC3B5DDFBB4DA55D11470EBD41A\rC970CEE2D2EFA88D51157B4EF5536CB673423CDDB06FA774D27105AD2B1AC2DF\rA8> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 104 /h put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /.notdef /C /.notdef /E \r/F 2{/.notdef}rp /I 2{/.notdef}rp /L /M /N /O \r/P /.notdef /R /S 13{/.notdef}rp /a /.notdef /c \r/d /e /.notdef /g /h /i 2{/.notdef}rp /l \r/m /n /o /p /.notdef /r /s /t \r/u 2{/.notdef}rp /x 89{/.notdef}rp /quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r83.5967 461.231 mo\r(hand)sh\r129.479 461.231 mo\r(lers calls)\r[4.58252 11.4707 6.86816 10.3125 5.73047 10.3125 11.4702 4.58252 4.58203 0 ]xsh\r%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/v <1C60D8A8C9B7A73DB99D94C9412F55B03E92C174A4755E69F97C27D9162B\r37724F74F272B140D258652D102C2EAC46833C73F9> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 118 /v put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /.notdef /C /.notdef /E \r/F 2{/.notdef}rp /I 2{/.notdef}rp /L /M /N /O \r/P /.notdef /R /S 13{/.notdef}rp /a /.notdef /c \r/d /e /.notdef /g /h /i 2{/.notdef}rp /l \r/m /n /o /p /.notdef /r /s /t \r/u /v /.notdef /x 89{/.notdef}rp /quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r77.8564 552.572 mo\r(Even)sh\r124.867 552.572 mo\r(t han)sh\r170.739 552.572 mo\r(dlers)\r[11.4707 4.58252 11.4707 6.86816 0 ]xsh\r364.847 564.759 mo
+285.306 564.759 li
+285.306 525.384 li
+364.847 525.384 li
+364.847 564.759 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+364.847 564.759 mo
+285.306 564.759 li
+285.306 525.384 li
+364.847 525.384 li
+364.847 564.759 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/T <1C60D8A8C9B7D8BE16D2C1CA7ED2E06F707C0E9530AE37D06FF7501A595D\r3927> |-\r/V <1C60D8A8C9B64EDFFB759009DDECF50F0319B844741E3CEB2C0ABDDB89E7\r563FC0955B866D61D9CC736D3C346A5623E20C1E4D> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 84 /T put\rdup 86 /V put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /.notdef /C /.notdef /E \r/F 2{/.notdef}rp /I 2{/.notdef}rp /L /M /N /O \r/P /.notdef /R /S /T /.notdef /V 10{/.notdef}rp \r/a /.notdef /c /d /e /.notdef /g /h \r/i 2{/.notdef}rp /l /m /n /o /p /.notdef \r/r /s /t /u /v /.notdef /x 89{/.notdef}rp \r/quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r305.207 552.572 mo\r(EVT)\r[13.7568 13.7563 0 ]xsh\r493.763 564.759 mo
+414.222 564.759 li
+414.222 525.384 li
+493.763 525.384 li
+493.763 564.759 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+493.763 564.759 mo
+414.222 564.759 li
+414.222 525.384 li
+493.763 525.384 li
+493.763 564.759 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+.69482 .6318 .621515 .583612 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/B <1C60D8A8C9B64EDFF43B9E1D43B76E7425A98F23F483468D5596DA760F15\r54BAD296AA38A849FEE692D78BAC3B162E2013F61317550246D6F77AF27886D4\rE04AB44C473130F6FA990DAC6640A48EC2A80691207E5DDBCA7196686E7CD5C9\r80FB78081AA13952C8D8F3373FF54323A4853D0F014ED4C5A1024912E545AAB4\rBA7F36D08386B7A08B38C3035C03383BB204897FB23E6B597B4E784900841F18\r58E5E1740AFA815171FE44AAE751E7961222B185E93D26B02E1EB5C1FF9174E0\rC619907BEEF9FED49CD2B96F29B7B01884> |-\r/J <1C60D8A8C9B7A73D9658D627ED627C91284E113B36EE4477BE063DB79C01\r4B4C1304B38BFA4196C7B3993D5118026189127416D2C23E3BA1516C5E2D259E\rE2D27698DAD25B31EA788FD5CFA3D890F5093AD3EE1D75864143B6DAD8719C69> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 66 /B put\rdup 74 /J put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 32{/.notdef}rp /A /B /C /.notdef /E \r/F 2{/.notdef}rp /I /J /.notdef /L /M /N \r/O /P /.notdef /R /S /T /.notdef /V \r10{/.notdef}rp /a /.notdef /c /d /e /.notdef /g \r/h /i 2{/.notdef}rp /l /m /n /o /p \r/.notdef /r /s /t /u /v /.notdef /x \r89{/.notdef}rp /quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r433.936 552.572 mo\r(JOB)sh\r627.095 564.759 mo
+547.554 564.759 li
+547.554 525.384 li
+627.095 525.384 li
+627.095 564.759 li
+cp
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+627.095 564.759 mo
+547.554 564.759 li
+547.554 525.384 li
+627.095 525.384 li
+627.095 564.759 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+@
+.69482 .6318 .621515 .583612 cmyk
+CYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r567.455 552.572 mo\r(EVT)\r[13.7568 13.7563 0 ]xsh\r%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/comma <1C60D8A8C9B854D0F42C7AF5C4668C35A6B5F5176B9FC6F495643D40\r00A6D27DE0DDA4D01F0D89D11ABC5445CF8C34A3A1CF> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 44 /comma put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 11{/.notdef}rp /comma 20{/.notdef}rp /A /B /C \r/.notdef /E /F 2{/.notdef}rp /I /J /.notdef /L \r/M /N /O /P /.notdef /R /S /T \r/.notdef /V 10{/.notdef}rp /a /.notdef /c /d /e \r/.notdef /g /h /i 2{/.notdef}rp /l /m /n \r/o /p /.notdef /r /s /t /u /v \r/.notdef /x 89{/.notdef}rp /quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r76.5522 640.753 mo\r(Timers, pollers,)\r[11.833 4.58252 17.1807 11.4707 6.86816 10.3125 5.73047 5.72998 11.4707 11.4707 4.58203 4.58252 \r11.4707 6.86816 10.3125 0 ]xsh\rCYNJSJ+ArialMT*1 [20.625 0 0 -20.625 0 0 ]msf\r101.372 665.503 mo\r(animators)sh\r43.0615 168.983 mo
+49.8262 171.868 li
+43.0615 174.751 li
+43.0615 168.983 li
+cp
+.75021 .679683 .670222 .90164 cmyk
+f
+.5 lw
+43.5879 171.87 mo
+33.0605 171.87 li
+33.0605 649.18 li
+50.1582 649.18 li
+@
+152.418 136.505 mo
+149.533 143.269 li
+146.65 136.505 li
+152.418 136.505 li
+cp
+f
+149.534 139.887 mo
+149.534 113.584 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+.278741 lw
+149.534 139.887 mo
+149.534 113.584 li
+.75021 .679683 .670222 .90164 cmyk
+@
+152.418 221.519 mo
+149.533 228.282 li
+146.65 221.519 li
+152.418 221.519 li
+cp
+f
+149.534 224.9 mo
+149.534 198.598 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+149.534 224.9 mo
+149.534 198.598 li
+.75021 .679683 .670222 .90164 cmyk
+@
+152.418 306.991 mo
+149.533 313.755 li
+146.65 306.991 li
+152.418 306.991 li
+cp
+f
+149.534 310.373 mo
+149.534 284.07 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+149.534 310.373 mo
+149.534 284.07 li
+.75021 .679683 .670222 .90164 cmyk
+@
+250.658 549.955 mo
+243.895 547.07 li
+250.658 544.188 li
+250.658 549.955 li
+cp
+f
+247.277 547.072 mo
+273.58 547.072 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+247.277 547.072 mo
+273.58 547.072 li
+.75021 .679683 .670222 .90164 cmyk
+@
+380.706 549.955 mo
+373.942 547.07 li
+380.706 544.188 li
+380.706 549.955 li
+cp
+f
+377.325 547.072 mo
+403.628 547.072 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+377.325 547.072 mo
+403.628 547.072 li
+.75021 .679683 .670222 .90164 cmyk
+@
+510.706 549.955 mo
+503.942 547.07 li
+510.706 544.188 li
+510.706 549.955 li
+cp
+f
+507.325 547.072 mo
+533.628 547.072 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+507.325 547.072 mo
+533.628 547.072 li
+.75021 .679683 .670222 .90164 cmyk
+@
+642.706 549.955 mo
+635.942 547.07 li
+642.706 544.188 li
+642.706 549.955 li
+cp
+f
+639.325 547.072 mo
+665.628 547.072 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+639.325 547.072 mo
+665.628 547.072 li
+.75021 .679683 .670222 .90164 cmyk
+@
+152.418 392.375 mo
+149.533 399.139 li
+146.65 392.375 li
+152.418 392.375 li
+cp
+f
+149.534 395.757 mo
+149.534 369.454 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+149.534 395.757 mo
+149.534 369.454 li
+.75021 .679683 .670222 .90164 cmyk
+@
+152.418 510.026 mo
+149.533 516.79 li
+146.65 510.026 li
+152.418 510.026 li
+cp
+f
+149.534 513.408 mo
+149.534 487.105 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+149.534 513.408 mo
+149.534 487.105 li
+.75021 .679683 .670222 .90164 cmyk
+@
+152.418 595.912 mo
+149.533 602.676 li
+146.65 595.912 li
+152.418 595.912 li
+cp
+f
+149.534 599.294 mo
+149.534 572.991 li
+3.0518e-05 3.0518e-05 3.0518e-05 3.0518e-05 cmyk
+f
+149.534 599.294 mo
+149.534 572.991 li
+.75021 .679683 .670222 .90164 cmyk
+@
+675.316 547.074 mo
+675.316 546.584 675.654 546.215 676.133 546.215 cv
+676.609 546.215 676.936 546.569 676.936 547.074 cv
+676.936 547.563 676.609 547.93 676.104 547.93 cv
+675.643 547.93 675.316 547.563 675.316 547.074 cv
+cp
+.69482 .6318 .621515 .583612 cmyk
+f
+683.486 547.074 mo
+683.486 546.584 683.828 546.215 684.305 546.215 cv
+684.779 546.215 685.105 546.569 685.105 547.074 cv
+685.105 547.563 684.779 547.93 684.275 547.93 cv
+683.814 547.93 683.486 547.563 683.486 547.074 cv
+cp
+f
+691.658 547.074 mo
+691.658 546.584 691.996 546.215 692.473 546.215 cv
+692.949 546.215 693.275 546.569 693.275 547.074 cv
+693.275 547.563 692.949 547.93 692.445 547.93 cv
+691.982 547.93 691.658 547.563 691.658 547.074 cv
+cp
+f
+.75021 .679683 .670222 .90164 cmyk
+%ADOBeginSubsetFont: MyriadPro-Regular Initial
+%ADOt1write: (1.0.24)\r12 dict dup begin\r/FontType 1 def\r/FontName /MyriadPro-Regular def\r/FontInfo 7 dict dup begin\r/Notice (Copyright 1992, 1994, 1997, 2000, 2004 Adobe Systems Incorporated. All rights reserved. Protected by U.S. Patents D454,582. Myriad is either a registered trademark or a trademark of Adobe Systems Incorporated in the United States and/or other countries.) def\r/Weight (Regular) def\r/ItalicAngle 0 def\r/FSType 8 def\rend def\r/PaintType 0 def\r/FontMatrix [0.001 0 0 0.001 0 0] def\r/Encoding 256 array\r0 1 255 {1 index exch /.notdef put} for\rdup 42 /asterisk put\rdef\r/FontBBox {-157 -250 1126 952} def\rend\rsystemdict begin\rdup /Private\r12 dict dup begin\r/|- {def} def\r/| {put} def\r/BlueValues [-11 -0 674 686 484 495 650 661 710 721 241 248] def\r/OtherBlues [438 444 260 266 -209 -198 -153 -147 -118 -112] def\r/BlueScale 0.0604582 def\r/StdHW [67] def\r/StdVW [88] def\r/StemSnapV [88 92] def\r/password 5839 def\r/MinFeature {16 16} def\r/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869\rsystemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup\r/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def\r/Subrs 5 array\rdup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> |\rdup 1 <1C60D8A8C9C3D06D9E> |\rdup 2 <1C60D8A8C9C202D79A> |\rdup 3 <1C60D8A849> |\rdup 4 <1C60D8A8CC3674F41144B13B77> |\rdef\rput\rdup /CharStrings\r2 dict dup begin\r/asterisk <1C60D8A8C9B71C16FD6190DE2747ECD6E73FF07230A807E96C7AE\r2B98B3B10B9552D7A2F8DB1494B6D182C31A4D9AB4A4349CBF43A3D56BEC1068\r448E5F4282D9D59206E816275B1EF4B6EA21F17B5CFA3518C7E5A044A5E16A3E\r5363912798C4BC12A384F0DCFFC564312FABC87A136226D4061A4502240CA590\r7EA37376CC3> |-\r/.notdef <1C60D8A8C9B7A73DC56ED86B010528A4AE924D9B6A4AEB6B57364C\rBBC1FC7743E3F5B16223C8BD8911534CBC6ED69BD6AA5A2C449B7A6EF268B5A0\rD64C6C74FC81FE7341B7ED82094E8390BB44FFD88AB4DB74763338FA8306E917\rB17192> |-\rend put\rend\rdup /FontName get exch definefont pop\rend\r%ADOEndSubsetFont
+/CYNJSK+MyriadPro-Regular /MyriadPro-Regular findfont ct_VMDictPut\r/CYNJSK+MyriadPro-Regular*1 \r[42{/.notdef}rp /asterisk 213{/.notdef}rp]\rCYNJSK+MyriadPro-Regular nf\rCYNJSK+MyriadPro-Regular*1 [12 0 0 -12 0 0 ]msf\r243.895 161.453 mo\r(*)sh\r.597284 .512352 .507713 .201328 cmyk
+%ADOBeginSubsetFont: ArialMT AddGlyphs
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\rsystemdict begin\rCYNJSJ+ArialMT dup\r/Private get dup rcheck\r{begin true}{pop false}ifelse exch\r/CharStrings get begin\rsystemdict /gcheck known {currentglobal currentdict gcheck setglobal} if\r/asterisk <1C60D8A8C9B7361F029BA98E8009911CF482C1C857CBE589E37D9\rA1982A7DBDD3195F89E2C6022B037A854A7BF1931D8EFEA5631A8AF345DD2E73\r7C1E354B06DEC6E11AB4D71707767CA1076E0E28ADF8EB1761EA2E2D596E2663\rAED0252CA9E55ED4E> |-\r/period <1C60D8A8C9B854D0F4604C2A88D29523E6F8C6> |-\r/underscore <1C60D8A8C9B7EF3224BB0E94C1F3EA8D5F87D58A9CCE> |-\r/k <1C60D8A8C9B7A73DB90BDE2D32BC36BC1297E20AB90FA9E27E830D444A32\r0C85D226D41FA634DF03A4FEE2FD90BF314563D4BF5C68> |-\r/w <1C60D8A8C9B6079F623B1BE11B16961396A063624588AB070AF82F2F6FEA\r646F6999B73C9332DE350CB17016778F548397735D109B5E72AA9A92DCB1D726\r4371419D7043A117419C0FAF4C> |-\r/y <1C60D8A8C9B7A73DB92EFAEC912AA9CB61EA2C87B96577B4D13A11140AAA\r18C6E226D96ACA3DE3B427B0A298EF106E8BC0FCA1DC8D81AF2F08A42A0F5836\rB6230FDF576E37CE129EFF9730F23EC10CF5ACA4D4CA70309E71B89A944CA734\r8AEBF55FF5ADA9F61B4BA14C9A2301A8C53EBFBE665E1DC22E> |-\rsystemdict /gcheck known {setglobal} if end {end} if\rend\rCYNJSJ+ArialMT /Encoding get\rdup 42 /asterisk put\rdup 46 /period put\rdup 95 /underscore put\rdup 107 /k put\rdup 119 /w put\rdup 121 /y put\rpop\r%ADOEndSubsetFont
+/CYNJSJ+ArialMT*1 \r[32{/.notdef}rp /space 9{/.notdef}rp /asterisk /.notdef /comma /.notdef /period \r18{/.notdef}rp /A /B /C /.notdef /E /F 2{/.notdef}rp \r/I /J /.notdef /L /M /N /O /P \r/.notdef /R /S /T /.notdef /V 8{/.notdef}rp /underscore \r/.notdef /a /.notdef /c /d /e /.notdef /g \r/h /i /.notdef /k /l /m /n /o \r/p /.notdef /r /s /t /u /v /w \r/x /y 88{/.notdef}rp /quotedblleft /quotedblright 44{/.notdef}rp]\rCYNJSJ+ArialMT nf\rCYNJSJ+ArialMT*1 [12 0 0 -12 0 0 ]msf\r33.0605 739.02 mo\r( * ecore_evas registers its )sh\r%ADOBeginSubsetFont: Arial-BoldItalicMT Initial
+%ADOt1write: (1.0.24)\r%%Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved.\r12 dict dup begin\r/FontType 1 def\r/FontName /Arial-BoldItalicMT def\r/FontInfo 5 dict dup begin\r/ItalicAngle 0 def\r/FSType 8 def\rend def\r/PaintType 0 def\r/FontMatrix [0.001 0 0 0.001 0 0] def\r/Encoding 256 array\r0 1 255 {1 index exch /.notdef put} for\rdup 32 /space put\rdup 100 /d put\rdup 101 /e put\rdup 103 /g put\rdup 105 /i put\rdup 110 /n put\rdup 114 /r put\rdef\r/FontBBox {-560 -376 1489 1000} def\rend\rsystemdict begin\rdup /Private\r7 dict dup begin\r/|- {def} def\r/| {put} def\r/BlueValues [0 0] def\r/password 5839 def\r/MinFeature {16 16} def\r/OtherSubrs[{}{}{}{systemdict/internaldict known not{pop 3}{1183615869\rsystemdict/internaldict get exec dup/startlock known{/startlock get exec}{dup\r/strtlck known{/strtlck get exec}{pop 3}ifelse}ifelse}ifelse}executeonly]def\r/Subrs 5 array\rdup 0 <1C60D8A8CC31FE2BF6E07AA3E541E2> |\rdup 1 <1C60D8A8C9C3D06D9E> |\rdup 2 <1C60D8A8C9C202D79A> |\rdup 3 <1C60D8A849> |\rdup 4 <1C60D8A8CC3674F41144B13B77> |\rdef\rput\rdup /CharStrings\r8 dict dup begin\r/.notdef <1C60D8A8C9B6E3FA5101D97F0BCF44F7161DEB1E2A84766DD477E7\rC8A936AA182F5809A9> |-\r/space <1C60D8A8C9B854D00D> |-\r/d <1C60D8A8C9B7D8BE18F849B536EFCA0F02FA3E76A4A36E3F76777EA56B16\r1C32BD3650224D2C9259AB137A3C28285F8A9610171A5241A00CEFF78A51C9FA\r2E4D589D8C9CF88EF8E317ADB723E8E9FAE4F993B2D89B336943A7DBBBEE7EEC\rE669D1C221EAFAC164EB8F3C6FF7D3C43B06E75F14E8644FEF2361494818DE01\r2A036AA7CCF2F7FB1D562B56C84E6A50CCEFC44A> |-\r/e <1C60D8A8C9B7EF3224CFE21A04FB83F1C45A37777D179847B4EC86B1681D\rF0F99CBBD414684BAFE73557D0E065AAAC81256CF83BE63EFBD3AF9BD69F9F87\r14A4A2B32E3E594C3DF30F01568D0B36A70B75B5AADFF38717D024E3A1D9BC4A\rEDF484C697CF9A2B7A61694B407AF3DBB6C86F1B9051369419BE53DEFC654B2F\r835A366FFF7D34803565C3D20B2CABED35FFDE7B9891216B2A2B0E> |-\r/g <1C60D8A8C9B7D8BE4BBB56159F6EEF7A9D7E8A196BBB978AFAC5D36E71A0\rF24B30BB4A1B5B10E9AA7CBBB62826E8B120FDAE7186231DCB6E95547DE3703A\r40384D4C861478CF109A506DD3CDBAAC6E5C0729DC036C5D8EAAD080AD330AC8\r65F9BF665B0A0CC79471469F3AAE05D350164D0F5932464C7A0FA860E50B8E40\r5242350E1CB55888115E061E4FF3255F51C4138A8027E43EDDE5569A8D41815E\r78C1D4C64B1BC3BF7F89635AFF2FCB151B40DB9E8CBF741674034A783056DFD8\r3909C1CD2E5E140A6297822093439BCD0613178B3F1EBD9FC45308DD08A2368C\rB8C3C7F0DA915F094687E32FEAC82B72F737768D3C8769888FD0CD1B87E57057\r35B1AD49E447> |-\r/i <1C60D8A8C9B854D0F404D3C2A96F9D07DC14A3CA0E60D784855FD9CE583E\rA7EBA0E2E0029C64C1FD6689> |-\r/n <1C60D8A8C9B7D8BE543421B6181044C47731ABD2BAEF68FF0D0DB7753F6B\r1FA10389D204682A5B33541322032BF9431D697179DE1F4251B2FB86F61AEF47\r52502C86CF232A02EDF9E1B77E34F9009EF05DCA5484473BD82BE28C6E3EE509\r9F9ED9BBCFB467B04ACA70EBBE95BE554659F1> |-\r/r <1C60D8A8C9B7361F5EF709B7989AC3BC298794B6140D777839B5A64C013F\r0C5B98F7B8C3A392C57C88712E6D3D72BFB0244A1B98F5AC6EF74A203B4AEC71\rCBFBEF6382C15BA91B> |-\rend put\rend\rdup /FontName get exch definefont pop\rend\r%ADOEndSubsetFont
+/CYNJSL+Arial-BoldItalicMT /Arial-BoldItalicMT findfont ct_VMDictPut\r/CYNJSL+Arial-BoldItalicMT*1 \r[32{/.notdef}rp /space 67{/.notdef}rp /d /e /.notdef /g /.notdef \r/i 4{/.notdef}rp /n 3{/.notdef}rp /r 141{/.notdef}rp]\rCYNJSL+Arial-BoldItalicMT nf\rCYNJSL+Arial-BoldItalicMT*1 [12 0 0 -12 0 0 ]msf\r174.453 739.02 mo\r(rendering )sh\rCYNJSJ+ArialMT*1 [12 0 0 -12 0 0 ]msf\r233.129 739.02 mo\r(idle enterer automatically)sh\r365.639 739.02 mo\r(, )\r[3.33398 0 ]xsh\r33.0605 753.42 mo\r(where rendering takes place.)sh\r%ADOBeginClientInjection: EndPageContent "AI11EPS"
+userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse\r
+%ADOEndClientInjection: EndPageContent "AI11EPS"
+grestore
+grestore
+pgrs
+%%PageTrailer
+%ADOBeginClientInjection: PageTrailer Start "AI11EPS"
+[/EMC AI11_PDFMark5\r[/NamespacePop AI11_PDFMark5\r
+%ADOEndClientInjection: PageTrailer Start "AI11EPS"
+[
+[/CSA [/0 ]]
+] del_res
+/CYNJSK+MyriadPro-Regular*1 uf\r/CYNJSK+MyriadPro-Regular uf\r/MyriadPro-Regular uf\r/CYNJSL+Arial-BoldItalicMT*1 uf\r/CYNJSL+Arial-BoldItalicMT uf\r/Arial-BoldItalicMT uf\r/CYNJSJ+ArialMT*1 uf\r/CYNJSJ+ArialMT uf\r/ArialMT uf\rAdobe_AGM_Image/pt gx
+Adobe_CoolType_Core/pt get exec\rAdobe_AGM_Core/pt gx
+currentdict Adobe_AGM_Utils eq {end} if
+%%Trailer
+Adobe_AGM_Image/dt get exec
+Adobe_CoolType_Core/dt get exec\rAdobe_AGM_Core/dt get exec
+%%EOF
+%AI9_PrintingDataEnd\r\ruserdict /AI9_read_buffer 256 string put\ruserdict begin\r/ai9_skip_data\r{\r        mark\r   {\r              currentfile AI9_read_buffer { readline } stopped\r               {\r              }\r              {\r                      not\r                    {\r                              exit\r                   } if\r                   (%AI9_PrivateDataEnd) eq\r                       {\r                              exit\r                   } if\r           } ifelse\r       } loop\r cleartomark\r} def\rend\ruserdict /ai9_skip_data get exec\r%AI9_PrivateDataBegin\r%!PS-Adobe-3.0 EPSF-3.0\r%%Creator: Adobe Illustrator(R) 11.0\r%%AI8_CreatorVersion: 14.0.0\r%%For: (Marina Proni) ()\r%%Title: (diagramas_01-32.eps)\r%%CreationDate: 8/11/11 4:24 PM\r%%Canvassize: 16383\r%AI9_DataStream\r%Gb"-6CNCcCE?P#aniu%?bt,H^+QJRr)8*@5Wr`VhmP[KPLX\pD>8m[V0f+74!*]>_2#HUbhr0u+k\!a*=.$AZ7QVeW4Zkhhgc[b^\r%Idr?p_h\,UYO6nq5Q'iNcUs&Sfs<N]B/Sf@/@@J8iYVX@X$>CRgGCuf3R!DiiB4#`JetR2?@98p]mp(Z[gt-0hn?XLGl@.*h65-W\r%J%iHXqsDXhn=,oRJ%0q*qVbf,p9/C@r(m(0ou$`TBY&QflK7bXrs6C75PXDSqhNcV2h9eu^NoeCKn/p$hS4F;p@dY:mr%%>I!>J]\r%eIU"*n8NSm:VZhpcg]@U+R%K#DL_TRqW=pWk'%p(]QsJ@p>s'J[s,TT^;#-iqY'dEmG6%aZ[+eZ/:C<qqU7Oa&[2XmB(0a,?bHC-\r%o(MgnXP9)V\V"8(_dCp^l0%MQhnOr/!R_'tn+*sfnD?@gIsj5Hf4g0Er[tUD3RJ@IN"LMP@jq0>Qi@>U]n.<\]RTTns$(rY`4UMC\r%F*I6LJ%kg0J7IV(hVPqkIImH(jeL)\q2ESW$`Ql?J@kt(i:bWicU/]lTHEcNS3qmHeAAFHf(0gBR:#6rFo0LgDZAhM+Ajduh7nGa\r%pChW:pTImWIs5hgJ+r5X!@)AnkO=1M<bjLKVsjZTiUuTm5Ma)k0eWfIN8V/U05k220*TPllPjC&85JH!Ee?U5]`%Bo4j9"Cf,p*$\r%^HS,Wq:4AO\9i\roBk:VJusJ$]/R4nIsh#QU)R3<JVj%NS>W\Q`q_0E.@pR$&:4S*/+t^oT<TRM`1X%Z%/TEY%"@sEeW6p%IiW!L\r%\&X=/jDWnhHJ.DT`j;*5TFRL<mf00a1SrI_p[<%hL%5ei^\hrh1QLY5r=2#<\:8f"E/11ho(\,+aO!)+hWoq=q02Ngr<?U.n7MI9\r%+gm5XqXF"Rp)W(;I='Pf`K+qUrqZ7=`;*m:o%!,3ps$DYQtZ4Y?<i)p^O#kTk2L@OiktZJMna]?lLi?TMr/6TiSmZ,`XOl;+`%r;\r%'Q696IX$;<Y89.2%DRB[aBp@d>C(A#\E-e1h5e$Yl75@(MVGdaD-gA7HU9r%4E0$[DYrAG5$6PE-KP=grP2,loVTOF#Aa5-k/SQ^\r%hd3qu!cN!1?3%_nhS$[Pq\jhOme-gAh8Q!N]RG;+ro22I>NEShT.]%2cp08ar#3*;QDQTKH[5/@i=5"G++JTd!Rq#//PbdCVSPH?\r%IfJp:jm<Qp]>MVVhS$XKpX<NC2m5HY]6e]#Tf:E7J%iV2\GNK7&"@b=pVYaP5MQ=?=803!oA.['(EZuD5IA69^uan^o\oKaG4Ob4\r%^YE2Orp,Ko2g=m=8CsmY2m;0DHg:p(_6<:9AGl3'LALW3iVi)s+5ZaA0dg?\HM%JhrpC5/fS^a\`_M1]r]4:HTT%[@"HkBTn)uD;\r%A7.,8eUK8JqH&G.nE$^#IY@i49J`:?KDkG[gD_3]_hY]36n-@pURV6Ok_>!;?9s?84Q+C!Dr<\f02XuJXSY-Wo?FmO,EVm*:#H!C\r%nDPCDaDeD*,'n2mmoV=T7biPto,EGa`f'/$XO1srdI4Tmmi4OYp[>W2T=Dk44ISM)Y?p3Z]mKM=_S+1rEHh$6/]p0=Iqj/uJgLUr\r%BqE_i`D7TDJ%U((iU6B`L\EJ5+7=(IkJ`>uG]3B;J^ioU?bcX$4'5%&IJ1/>93tdm9c`Y/4J8D>la-'!&ho7%+"n=MTtfSUiK+!l\r%,64:4YFkd`m>'F\rqtpPbJ#=3`mXA'n&iBu(+oP1'W?"mbhcK!UX4oDn",WHa6]kI%54CFZ/8hLMX?'2DiDCTAg#I1!FBSLA/jGD\r%<P+S.IqH"c0pEgH_c`r&!p82'5CL%e%K@gmYO6l?4o>4kVnI(f;$0pJDf8HVi'2rM#?9]eLqJN%I/3&_+"j4]G@VIq]QsDDo"ti;\r%@U9)TpUF<,qRKo0mdBehS$O9FklOm"<6/IYe;KeTnA;pI'lC[p\pY$2IgfJe+DC6DFaO/Km9.XX2LZ*]nb_d(^AIN>lgHM%n&9fN\r%biA/CkJ)eoNi'ne[r:apoCp"Lr;hB?2fBd%]_ThN%hHQ2M)-i#BH-qqp:EQhJ$;QElKji=kWaLiiRRh[o:&g"Ie?Q+?k'f_4l]nd\r%bOeU/qpTIjh>RCtIXdo^L\lS8IJrZTTf!,>jKnl8oCgG,;1hM\%jF>Z_u0EIQrCc7!?QC=*VL@ADr1KsSf')%mgLTDF,>rdT>pW]\r%$a_5;T'bEaGk]\?+!2P1)qsDW%(h#rMXCFRI,jtn_YrrkR6fR\8V?]&^k_[qpD%B?p_VkTs,jQnhLN:/7dd;na$+J'p\#p4h3SB_\r%Bqe\tm^bM@aR;u)^3G)'h9TJ8hgGnPEWah\9+XKh3h=u[]/LR33W&6BRl@g0oDMJ:eFG[g32,4'WpeWIO6FNLcM%##pO@gA)2t@u\r%TD`g1qSV^R+5icaPnj4tiA_ZT*C060I('&1N;-b1-][,Z__],-`]DCTK4d.2a34!f4H.nP2)G[aL(nZq?sNik4g_F$H[%0\<B,Zt\r%3"@[](fSXuMC$h5`til=+"uXh4GS0P`Y9%B81EXWV35S^;bOa0:RC;QSjU'n3^Siejd`4l(O0\dF3D2.c^4GW+7aQg#"$3AV_mLL\r%R`b,LCM1*UKuHj(ro@t_TDUpZJcCC9+J(8opeU%6r]/)!m*A#2/&8hj5?7Po->p\m"9$2t`W)(6qWAok.q&'Z]RnFfk=BLurJ1D.\r%>[Lh[Y-4u]YP6Y\lNY[_?*DHE"O'EgnN'p9L[2k:E-8ZQljp]q43WJ+.#7&K&*XW9!AMFW=,3iWX37RBeS_m3=7]G*.Tb)!#1ghq\r%!!HP6*\OWK0/*'d]?>@X?e3D@3F1djF;ZaLjg`(^+8/e5bPcn)gUI-oYPYVtp3E;(E<&iQGLsIEmV6sVg[B<t[[VJ`=*E%Fn'WiV\r%!qcAY`p3Dh\q;$7U/#.+Y[]c\*-SM`(U91VbtME^c=2!k_tY@;_dT40A)Ar=s2Y6%5pJQ9-]f.cNJTWH4@-+m?gnqm43/N=DZD+-\r%Rt+B*1ud%Zr'HDec]DqQG@pa0iA7+,oeUDM_P>G&p=j4>!o.W7kY+2;`V98=d&3kY;sB_/C%/nl:4%:P,-_*_8f3m]@UDHQ).+">\r%).(>_C7._iB/^M9PQJ])bWFaE_X%R#`0r1"E;EV7[Ee7uG]n4:62Z8l+9XZZjtMESRF@[gU&k6AfQNkL2M7[IqtUjo#`&;gd4B(,\r%`KhF@%Nlk8J;126?/%<"D&cIeODC59TZC5j>fd)",nGpe[AXN5Dj3IPh9f#\*`-_CB;WF"4jsDB'")9oNEP5d)?'cUi9q]b]na?U\r%7>kK8-G9`kI8C`2?4@JK]D.@F^^m(X6%r(0@o:EMpi@cfgIU4r`nciu7@ec*Q$/-4J^.iORm?R?TQpq/hY@b#K6*-P&+Ku%"nNaZ\r%[f[*a+*!5HM?Rr81cTk#]//HZKb:hHZ+,H!fjRerTfTts'c=4bT1!,jBZ=hXPq]q=0[cUA!94LJ?U,)t*YNQGJ0)DDGmdMk$1bET\r%;4KqR8somFYmdoRJ[H`Di;r$0&nH%g,g@UD"]g?d4cM,u,Nt-ibh#Ki6ZsR`1OPnW$'pq]g^Kk6=YJa(VC1%AN4bmI;=Tai-Mlkf\r%Pf4sK\#3k/:E,C8Qc+hUP%L3bQSa7YWFf&0W*1FF=+!J8ZIbmc;:T!8\j_=2s6U$=]8^ncC1#K*Klf"`iCo\"iUH;-VJo\3\U>U.\r%Hpt%QPr#FQ<7$U^fF_t>jCt7`%#]V\?hDiXcYsS'54b2N:Y0ahBOZJbOWX@TB@D*3>H6Vr_TUgG^\Ifo?J`GLY9m(n%AWOT"A3Vo\r%MP3EL?u.X:"Ko8Xe)h6S)e,l2WJ,G[VXl]?SY"<),t^h)9qE1?=E[1H`a$Oj&Ji_a);@!PJEDdr_`=[#Hj5=,-h:dbJ\M)J):N?^\r%*]K:dDdM:l]mi$=mm!MF5-4_m_\1WV7OhjSN?oh3HpgC)3A#ub/q6+nQ\'p9c4nUPNq2MZ*tSqhb`Zb>5t=<=NMu,aFum2?fp<-.\r%hn6Y9^%\,D$39:IqDb2^]2J8.d47Sm=4(JgS!C*VZs1@eQ1Y\h_L\#h7S@-_,r!O5a,AgiBiJ1IB3JalE-)^d10B3<0tm]X^B]E$\r%f"_V#3%j9rZ@b#]+=ghi2F8`X@Ka">>lo*`5e7<5+jp*AMuPtQM15,I`t4u]at<rJ@/;?MHJipC>ae-R:F4J/&t^V:>8?6+p2%?]\r%]SEQ%0!%sZ8.T<p#-pbP(@B\Og7u960e2>L@+M:1ULe/#dT=\j7#S?3Hh,<1aTsYcJZJon1kSKh5e\j:g9+j=%NpB1,]Wqf.P0Ke\r%fCM-VmoQaG?c1kF^^s%E(/-u!"f$Y#BC\R7Xs=[@NAu$R1V(mHS)&p78#)*7l:-g,Nh#Du3S9\XA7#f0r?QE\`33a)PtXihl!4>T\r%$?p*J%dg&jQXir5E'dFb!_kHL*rAE;kFufdnUX,JTLiNV_ZGaX!5+8&W;5]*r:7K+<,edFB;#Y><Wn^"1)APJ/EkB@]uUt!+Mk];\r%M7Fhpfo,5'eg%m+;(%YD_*S["(?"^LY4DqCU^&C6JjT<AP&]O^E&;iNTl6OiX!#R1\AeC25nrFK&#:0rOFi+R_:#/V9!qJ&#?*UP\r%Efa[$UgV=jNo.L?=pmhR&&:u3<O9n!S5D&>E,92Sl'+N9eL&e+*'AE7%d`0ajQ!M37m8!i%.)uuj@Gr-a)7J.HK+4`lbWL2B2@<r\r%5s2kNILFoTQfe1-D7UtF63!!XDPYstI'Poa5g.%:Z#J/ns7\MZKD`9=>chL;4AXrZ)AiFD<jA^<MHog=MbL/q)LRkG<TEjSPM*s*\r%Enh"7hPL1!.5'%7Q@sr6/Uk$Nc3*usSS!#6eSur!fq)YKFjDTLs,29iJO)C'=oKk/#boXS0C_Df*>T6/NbX*3Mh(DfTi)=4%I4+P\r%1l??$0h)c3KC9-g/4j\&Bk8aLPB:-[;Lr"[U<iuL+c@Bp'57GLj)ot(l<`!iE0?K"el@;;M(;^S!\G%QHq7QhB$eK#L(*!gU,RB-\r%Ce'ODOXF?]Ai5eD[g+kblKWoY,T;mQH6Q9YXHKathZa5Q*t;6jXs4,+$9;^sjjED5\%g1Zpii2ls61,MO$Br,E[YI:JPQ`#AdO4q\r%$%O!@keY)E%2Th;D'XsPE7"A6=<M*$nV\mE@u2:kGs4h+\Js_g0JB^Adn2al@Z3$QZ-BJ47&e<Y9!sUV*G?n4Uh+*r=L`+#22C3l\r%(pV4o;/t)8TJiV0"37RIBE?j\"D^Mni_4?n>0B/XjCA:n6p[qGJZVaOc#SX"+@3.\$?Ye_Oe&eaV[XV@AR"&Dh_+W9?c9Z9o%dg5\r%)Yrg+mnmTP!sQG"r2m6m*rTslrU04Ea[O>f&MfB,%5'V`,W'Zi0"-au/Ri2l0/"q?jo]-H84HBrEAEN=Bs`hqDAk'>VEQ2^@<;N,\r%$)6sr#_sE9%rl?G^MnS7E"g4!;'+I\):f`U@YLuPd%rsQOC0Vp@TB]_%QfbK#8?8N'BH"l9Tkl%'J%#P.gs@334?,@4ZEOjCL6HT\r%1cnWL[ZI>BiRpVbB-8kt>/IXJ,Q[dnU9tuES]Q+.'XboiD.Y#]*#:@IfYKtBL'=+/P(cF3GK5I6@\[EPWYQ(=2Xf>AnBpO7c#dPr\r%B2TRW:2fsX4crEs$50oCZ"mp5A'[Eq$!Zg7C[-L#bReC+6!1?MLBO-06%"g:]FaX!E*&%3M^sW^m)^5b'W[U8PG(gk,5WqocpJXW\r%:"OqQ&Sdt.)J?VLLh_XqPM&tLh/;;!U9c*S4@s4TkTnQ(7[bAR3I#;sR]uG-E&QWZ^j/2O?k=p96d10U_^\$2"3NufdOr,!`fE%u\r%=MA@bE4cAm0Q@mpSlLr!Pce%+%;:4Ma93NM,m2C(,&>WoFX>l03jR/@h!3ml"G\;#JKbcX4<NDHd_2e\4<=-3]Q;sGNr;7Q(?8eO\r%I?r5K+^I-mIbg.3]bL(&UDOukLc#"?Tus6I]A*j3YJSB@g7TeY8BV5WY%YE+!`R<jSS8[F,BhB?(AkM'B.jPd^FMZFaN82IXh>iQ\r%Zqp5TnfZi>n*7B_D#MYb&2Ft^=WmH?nho8_Q::G]/#q=Vpt2104KPHd4Hhm:$-9DXBaMh87W/h_SKCu8[?h-qoV):tS'8O'8UN=\\r%BTlK%9WB5eW(@EU9)O/KX0I#iiAB9B<PSQ;I/YAlZmrf(MYFN8FsbTh-J#bT$NeR=[`?7$`r^,$:n,D!/DQNq(NEAllI,U0;*:jH\r%<_!tVAqG0i(C\t(%^P&_`C"2YF@WsR]RtQ*0e5qRiM`*(k;:kf]o6"pLVRG]2G.@Q_`BrbZ]bqAA]\&uNhUZlq'Sn%)(`S`69LDe\r%UOf")K<4%'oa_!OQ9%R\LI8%)Qo\G:eV@+0:fW*44Ua``eNlO&eV.(O6qFfcYB17NF==XHMK2B77sQ4/W=^B+Q5V^1fMN=L\J$!`\r%cfO/KR6Jt>$T5%2.q?_sag!j`bIJH:%baZeY#c<mi,g<;E\cSX94QuWVR,[<c*f#$Cui'Z+tskm+qY`O\/]&Td%uA-QS'/_>f]gZ\r%6*a*F_.c>RK:>aoTa"X0F=@JVT54u#PDQ3d;YMj;rXK#EXJ-6&OAQU2QpS4K9%08)<E6%KPa(?=RaYfdiY[#@MbXj^hGC^Wp@KqF\r%ZJ#NZ@kmE6?)_0g94h0YInDgPbHJL_e04LWX/-6$6#s*W;`ZJbkjCuCEJN&/m`r2:#)L;UQp\Q/WAPDuRg-)h!H>YW[-omINN\%o\r%I68Og-\QSc4%hsWB#qbO2['fDmoId3;S@!pRWH9F38m<'FuEE,>Sm(S_^nYWb7%3U\?b;GT)IYWYC/@V+66K"*/%o"5gM^E/2YU>\r%P?]qaaOM^e_&6Kag81q)\qW/1UXm-OC1b9B1=jBf+3].o/qGUQS`*Jd%aLia1;CR#p>Xs?@a?lXApZQDM`m8Nnr\SCORVJ*i1@2<\r%X0f:Piji5V_r^U,rT;cro!IdO[Nc7UOW6s9OF/<>ntRXsK6T#@G4=*9rc4@II/Lh?=ut2U].#D=Y'M@/-a%p+PcJV</522b,C\u)\r%%Y&R1^NX8B+mMfe3O?VcI5U_4rQ^im9:D?H*j-"S8.]/?:\Q!;`SU%>4PhCc!=fEL=FbhXaZSP;K*9)49+qspi6u1AUaH..@?HD0\r%l^[2EYTk@Rd6u8JM.\Q7UHPqWc8Zh:9$jL]n-Cgk^t>S!-4g2%0F?usGKSCe0S*hfZ&&2*^_eNBUS[Pfj5*?h!A;Y"!oXt.cNllu\r%c\uL1Fi'B(*'u4jSO8`M7dM'A5+Rs`Sj39\#10j>,+<2sH<t1nJJ9_+!lSu:Lpmt*3ZK0d;EMo&l7?L?K6!cY%OG!ID1[nnq%Q-r\r%_#S*.GUduCUZJ9oR/UZJ+cL-8$W]+T;"05YVbDlh8)sjI^7GFAbhNQM,mTtPl'EY%4b%U(9;e^>95"e!).0fmV+2\h+,"n:&B&-E\r%"9Iok\9ij>3UAqqk@"2[bM>eR-\u7R#NqG[=5LD:fd!\YD0Wf!J(,J\S3Oa\a;7$#KpfSPY&:d2jqM;D1s!$21MNLR4`q2l2%)D2\r%(YL&=bpXGXlE4"Zk`\Xb'K(^t;T,/r`P^;?B@!/DA[N<'!)e_KZJq34P@9SqU?=Uu-Cd'3fUS!?S8=-+3?ckta".lcHs-c3ae6[a\r%N_2nTmsZ.k=U&kH@@Y/]piV>*Q_!CS2ghtf/>AEjIh,$_2Qg>qE[aT1UoENl/9:@fPH!L$8s;&1[YgIDo1HlC:<qo<2MU5Ao(dZ1\r%f_8lR+pM@@/9JhgP_9j+*YUR]#flL_jI"G96kIq3]PT3<*R.MKpk1%`bMt$(O/E5dY8?2[oq7&ciTUEKcJMKm81oP8LTsi-Xp1)I\r%_^^9d*YjXUM+8?o-RaV2QDMNUbl"m3/,28VT1YFcVuAU=FMe^P[U/Wm!AW):/AqdNB1=pt;IlK=ZpS!X3$X4MENUSj<[\Ud`UauN\r%1XUg*.--)=2i3,l%C=#=`\=u(k;Ii9@8JIO33.UP?l1Cl#cgh`$DUW=YGr^-QpPiorsY*(0J:m(]SjB*#7<mGg]NolhVW^dN(]Ba\r%RV(lHidK';]S2P0SFRL<\sL=4O5YL<LX@)6gG^2M[]qp,UITP+_&\#AB6.aaT@b$A*81/)"$<g#\Yl"CH#VHfnWA4bdPJ&r>SUr3\r%/'5A?PXeb>]K,^I"IMrSeBBAd9b);@4U_-Y'V7_O8JIaa@3Z+3bk.kQI9[+jHdLp`hie^:T77@<CX924iAmIt*e&@[eKE3;ma[Bm\r%\*rS6eM1a@8g'ZH[.AonIZVhc,<`p*05UV6K2UiQ0LkY::$5pK`\/F)2$/g(IHJ^%SBkb?BCgLW;f#h?oeh=SqYIZ/jC\kBTC2/d\r%mVZC'r@"<pQtINf8&6I*'![Qd&Qb#Q9Lh6YEL`*P57H;X&f,6X=:2u_r_a9<OKUKg1^PAY=a$Fnj3f(*!HndY%$.2MBHkC%aQ2%O\r%9HJ@c\Fr?U5nFhB_>8XgoO;i00(bMr)-i^?Y&Vhs>O:0s!0*1Ia[(H0*N8-go]e3P5uK0FWE`0rYNA@$G&VnCV+:BEq.knmE7+n<\r%omr.Fo)\YZqL1rtNqA/*-*7C',X.tCP36md76/rbKrc;oj*u95#!;6ba5.$tATY[\`piD[,rYfEQL0g,LEhfNcpqF?0%g9<r]so[\r%7/e5CNOM,"ldkY)*\VqZhu"0(M`4am;ckU-?l;^JZ$:n4pj.jPpEG#$pH"(VS\a^a[hk<&>hP9KOgj_XQ7Of"8))P[WS75</qR[[\r%PeeXk\<MY8;F7QfYhS4bX>:NgAB_JO_'dYE3<,UFmU[u6@jMAg[0!5UL48%.:W$pKhsKcKp@^B2rp&\O^MNENDNDR$no+9uqbI0#\r%YM\I,bBOQ@h0uijJ,%NBs3`ZV<G\hN.g'h5`a2>s9c;<dAY^fmZ/n5d4`2Y/N<OS/>eIa0KBfA?!+Tg/pbD=F1HXN<>L=O'-Z3_+\r%S-IfYR5/bGC<?P/RkgMI,3Pd[''K:skG\8L]mctBYOo.MnTCdK\O%RN'ZJ&&(#:;](IQ]30r.RR`"$mb0@F=S@6ls?]*\jbNZ<`U\r%#?kGlUr[E%j6Vl!(h2>1ZNGNDrei4:(qdJhbi*+[=jJ&D=f1VP7eA+/VocH56oIlm/a(i&rYXdX@Er!9UXG;O<\`kj%kAbc(3`lW\r%`c'2KImFsND=sgc98Ynr<p>GUk?#YKNeAZkGosbKI@!hgZ=<*f\Tc(YoTY!!EKK3%rJX+MZ4#siVh+eqoDI/5=79MpIuOGA$p^Qf\r%'F.`?Mb,Y1`Qih$dGjX*1[):S2'(g\"L'2pf'WGP/E6.HXF^MgS&Yh8<s/&,=\V>b]!rq6,Ctm+(-)E(Dc;tdW3/h;P(f*HasWhX\r%kT`ZOWdEpLT&l3&r7QOpf@PK8$0hF?`K_^pVFBSO8Y+r`l!F6qPD8Ki:HIT.0r'^oo**IE[",Rqc,umEquqiHf*;'e)>?q-j4!;g\r%Zo\2oXH$]QcO460.P:Kj29o3s>$g\kcMZCtNo,GB=3%LO?W2K)cLiGu[Gq&?F2cGFQgC6.m`ep,53:?YjjlTVeii-GI9I>VEpK<;\r%lb<;3Vqek]gq'C7R_S8ARO:sW&qq]1GS5^#F6df<rTq2)JA-""b+ptAq+DC"g2oO<@CE@2U=+8#d62Egh=J'sc[-_R,8HVJ(=1$;\r%TO((V#dQ>[G`*%%@0PLg0!sOfBa\Q(?(&*bc!&i3_Ap`#U#"8j<B56?W]FgVlC_t8CXnnbV*WdklOe[6C2o>\5"Kfm[)^kQhsiT+\r%<sBu2=t87)IB;J(Itj^0cX<BDZqU$_KB<"Ns"c5LqV(ca,^1!OYdak9M??p+/$)n4=SR@\"TI&51u"KG5'^GPnAr!KT<hV)h>E(6\r%"4]VEo2pSMQd,G-7/..VRGj9qn5h7u_diL=gI6k'P!2q@,[(E#5s#"-asYDd@8TMQb-I#8F\gG[K]oh?(\Qj`=ZKG4YNV`m7+Vf;\r%S5AOC_dq)V^G<7/4B'L-.c^>0nN\iUY_9!_,?`ORN_Ep#,t?$J.Bl.eql,m\/J.07o1Xr!/\HE]7XP8RhmNeba(*$fL+]C%)"CO`\r%paJ]1'I/'a&O46jT45`71#f)JnP_:..5:NB$;[Dc,RWEE,Q9?K`Ko#s:p8p3I1cJ(#e`+4h\i]/0>cT]Z+)*sh$i8'1A/OYMrRJu\r%5L7i[5.YL0^=$c2d%oRhcu0p=\`d+^e4&cFc]X;uo!,i>(M/4F_op"s._JG+,slJkGl1=T/dktu*gHoC+)qi`kd'-BJa>/&c>EBY\r%]oRkgiXF0tB!^-kAN=d6$sp'%],nf/X5ttREo=cU_eJkn\.R9Emco'=]gS8@T34p:*STW**Idi<O#(Z1^gIru*$=OB$:*bR;%53!\r%<ri[TYTA*0r*u'g%O(sC6IQje[_2bYL%Q#GSF=iuKR5YS4"oE`Z*>B]n?#g`VHi]B7KBeto(HZ>]Wbjb4]*!s/W8ua-0esD]u!2c\r%pb_c?Y)eH,Fa'&EZ`W!D?lE&r_WM9Dr7H$DL^$+anA=[^*q5U`Fb).Qqp-&^B)ioEk3hu.piRZ[r<t4U8.3Q]#.Dt1,[km[d(L]a\r%mNdX2+3A)0F;IN#0g3<SiWUTPrQ%MGO#4Fi,XH@Ol)Y"o2DX5[,J\W:@:Z%C@$'&m/f(uC2C"Dg\KZB'Yp*D/WPh]cW-ZK8YH5[]\r%iA"oT@,YTs\?=.I/2mD)ibnBq$=Vh$o7o;;(O&&j2"KEh8hRD/Ho/5*876EP='T"U0mqgE*/eM&,+^cAjDKuJDW^`hmC0u'Y.n9!\r%aPeberRh(XKA=<e5ls'i''4;(E\pZ*HE;W,XQZL8FBA]":#kgpHs3@U!0#4&i!GZ9^R=R_'V7_O8JIaa_*m8JC3hb=Fksbe"%_;I\r%o%ID]4O:!lY=s,f\%acSl0F3qII$$93F6'db[46tlB/cN8*A^YYhJ.-F&.")qJFp+k2)q?Or^o/e9[$t06\Q3)0i5fe96n?[VuG[\r%8_i$oCm<Zn?=!W`2J&Ydj^r_(TnDb3lH\j=f2qZlO4TfjM+G[%:\ic$djifpBosWIrCD-+qS%e-l0bsXRf03cWH;ca2i*rB.4)"H\r%MprqNf61Bk8-aCM7$[0j-Fp,pIF1@dHXW!@18nh7::6F8_"Lftl@=<l3Ob-PE@F[PeYt=[XB93.Au6$-*W!c*Y(t!`@$*4tG]t'j\r%p9>fAg\n!,qj/V/Q=Z^%(TH\#^2K+h#l2<`>VPgbr#'q*%auNCi`FU/H+(J1N*-/Y:K$l.Im:K1nrXGVX5Eeh=ddqs\=-IgBJsB4\r%:Z8:ie[NPOI10NY]U83YnlT7=ag%n-F?/tc=dH8"^>aBa_=>#aQt7SML=OhorF08D2JZ/LCK3E2=ZgIYD!GXb.qg5e5ED9X>0A[)\r%;FkSBQ*e[Xp:Rp&lWA#+:Y"'CXN&iP$V`0-.mI'Mb>m:X?>g2s@5q/,X5C"$]^Ah(]QL%Df!$R;jU6#J]5PmCi&Z2M(-KKs;I'4l\r%/WmaHpk?7n$A#@pM'5[R\0W"PPnAtg-u"A+PhR%9'b`_:\o0AEkAo'k"Rm5a$?Q!,&,:AnPG7AgdbDFCd.>s46faG%Nd.KQ1n_-5\r%FZ;RmDu.R]e'Hj#rT"a\@u*=VQb,PkRT/L,PC1VbRV>7,!a-9B->'j@Pd5@!i;!#AXo+angOI_Ac'p^*O65oN[$W6W"3?ch[_@7f\r%l:Y#Rp$U4MAh&-QiK7)=T8`&6;/%VI*)q,nTNB*j7AM"t+F/'sQI/#B)@YlhONU.W/2mmI_m'VCjpWoHO/?)U7oM"oi:?%,-Kajq\r%&D&@sic-S,$%6:InVbK#pSliBde,os$(&><TkKapgcOt&#r`m&c4>hl_IGT[Mek^S537tn+1n>X;2llDpX.[G$;5`FY7rE3Y*)<$\r%.<,sg3ok?HQZNNe?GTk1o%bhU<X/QInF8"ihNOp.(`r%SVF*LkUo2$/*5GU5+L21'[i7jHYJD,N']&>R/IZH8=DJT"ifX*^g\oTu\r%qs[J;]fj)VpR'o'Hn(WGGVTMHm^-9;>Ho:=g(DBde(ks,SZHk5HTZ=Uk]_HTK>X&P?(^E=n2\$=g[8n[V.o!Mi/AtDn6cQ'7\[j5\r%VBI!@):eWf]6&pP/B(oe\1U's!d&f7@f]5cm[7m2UA@CuUN>'Oj:%f)7R9j'#b)D>29o=VBsSSI!nk%7cpqT=lOpNBd.l8h)E'VS\r%0a`EE`p[P6_^CL@k[)8P-c<u'Go'tUi2q*I6ePE)oDZ4bXt(ikV1cLMj]jdZ)s=q.;;uR6Me`q_VV\Fln$'(3ql,7o<As$D,fY)e\r%'24rhV(bOZZ-!7E9]=u5',@te&j&cVWK%#+qSbr&QR"rLiKU='hT5FJH7D(KSl/@bVtSi:]_#hi*RtP/4lr8YU:sR)>[5^eU2i]c\r%rlB@V]"*07>]OcI-F8Dsm&9"1LA4M";#Li9iP3Kq(sgY:&r4([Tn9En2-46;`P5[I9Hi][8j5>fbG.CG>HN>eCu;$P;`pp@!W'de\r%_tHnl%gFlE$+P)TNbC6DM#'5S3-"\;m,7D$:s6A"%nh^6+7.:3c2P)Jk]=JO>sS=bpc9\+F(b#DkOBn&b2WDRb3VZ.f4QS>J'Y4e\r%ch[8NIsj;R'Xut,Wg4LbRWsEZ/^a7L0H\?S"KcukGh),L+._ku62)+`icl^B'Yefi>i,H<7<:;IP*WL25:?,l';%K>n+j<<B6VYu\r%qKTm<B;T'c*]h'$p,V@U>]9CYdWYU7U[q>S<0=QKNFSsc_o+/qO!@E*k,j-k,a%[YJ90p@P:&`nj\otqGi/ter2-HYO%/a4d9ut%\r%KO:&=?CUSu$ge>ICYAME/1Sb#Zh_<%n#sPg86Gm7f3mhh=M.bri>.bn_!@mF)Xq<?POiCdGmgtS1jU=2?A`k_fOi[Ah2]HD8?fl)\r%5=mGg;U8L;akR=(ZOHbupdk<qIqJS)[VU],G]o!X%pk1(=T,e+Lr?,P=7/*@C^>G7@tFXQp<$l:HO"2YFo/8<l`JKdmtO7G+`F!\\r%?9CPZ>>5iIFq1#m#t7ogW!uq1>uL8J3J^UdFqe#jU@[63P,J+@;GW*XN60T_g1r:6EE,YF038d*hAp7bEGghLh"c=ZQYhMgG(V'p\r%i=T?)7t+4)h4r,4E7NrF5:39M<C?2M;Z%9qaiFD8]&C[g_:176HYVD$?'GX4m%-3H&aX)r?/!E:fu`)K(A[1QO25*g\BO48GZL`G\r%+jj4L6#_Qi<p(]-7l[-IM[h+t@6jirKSN2t<BN8idR1is'qIg&q1HVdZ\Zl_@b1K+pC8jYTVL9Z[`3)4kdgdXa3BCLpFtZQFF+'T\r%BHR<\(k&br1YiXnUO@6[s4U9Gs+M&&Mk@*f0NlDMeOnt&UR!iQbaTnp2m.(;KP.O>X05fW\Vd"]Y'=hU#Ys3FId)KsaC/'\Cmf:K\r%bV\i-->?TCQ7Od`<gb64cF.<Da<G&'=Cd:?mq5iOL+Es((5X/lr/Y9Spqb]l'`2%1*jLX##tUM:P[kpG4V;Ci>bl.,Kt24A8XHm5\r%g!c*DGdL.>iq+Kf;&U3Q8t)^n<"]u0BpY`3QY1"uP<9l.rnm`Pp;ukhNe]'LU\r[&4Le).D]`[1lf%I#kC$mB=/.p+e\9p2`d@LI\r%S\Is\pr[6?kD;>\F=lN4;*7mr1o'-C"PeboRQ9ssDu\?uarE(DMUb`Lo0U4b5Bd,!QjqEk]XP?`5Pbd-OM<"*PHQXrGQd!G?9.^A\r%6K.)as1"bEZsrF#MTtEZ+7VeNFe-\7<5MCj*aEuCMTr+$m&=OmYA?GJjJFQu]QX$TgVJJL*^!eU9eQ3KI^e0Y/Zpq@c2CIihKpgZ\r%$fjuTUXYdHq(>aI=UqB>aNR<<p%!Or':rU*];QW.1[*-2@2\ckafQF0TTJ6Y%(S:_gs"j;1eR)EZk@'X2"%/C*kFFiQGk&Ed[K")\r%^@t-4b4X,b?me_UIA%kHd^Xb_V&c^!OQ?j$hF8%(OZaJgKs0`C85H1c1-g1In_poV#2@b^Ba3"J,*Y0u8WGo-`m)J"5;#9JjO,u2\r%aH)B"*BW2W[>CC6G[Z&&SC=,PTbSrh2OCXTEk&gB&<j5^f,Fq>`>e.Thi>?;5/J+r`"\6&hWlm"$apPGJ:^"uL[g$=D=*I=b>6nM\r%pN^u.4aIdtn;6JpNa>NUZ"JE+h8c\"qi$I"L*P655Gu6dUX/FC!Tm0@p%U=*p5;EJ37G3U)jRhbH_jM8W,&=q@Bck[o`a_&_&(t<\r%rqN&Mkg0d2F6ED_hn"7s%7b;A5Jb&!?[;8>]%dUtIJ@?XRpPL#lCC$tM#TOsM!K_Y<!jQ<Y\GK<mfg_LH#`JPQ!A%`G>\qOlVQbj\r%r2RXJT_kd0,g+O%/:\eP<UnNj_Irl"Xe-8,FSTrYk:p1fC%lC<rj<`(Sga!;a\ca-%9ZgeEp1;GcV1bT<?FcgDW0uED<ZV_g^j3[\r%eU_/8)8b,Oh0Pb8&_f*B4%=/9jdd!m2_smr#iEZB8U4iE,Ab-f[!YWj^R!gW\2]kl>cGXX%enFYd=>tjUAeE1Q#kJgMZ,E,Y2(-!\r%+1S8>_+nbUSY%$BE?]`NLfqg%4frR&F:%G-.j/1cbh!BojP&R.>$;SRp-MFANZsnsfe8fh@YabDpZ;IZR%LtCio>66D_LlLE[:8:\r%2dRIaY3DS;;<.JWs/mDg,cWFD4fS0_ErPlU(=t3$B^cm4lYsEdHo_*UQ+KTQ8T?ucC0a[q0bPN\lc't9FoJ=D"*rXJo",idiRgB_\r%U%XUqao+>Fm50#g/tO,gcdll]]Rp$p/-kAlT4T]lY+HcF7`$D7Y.4SBfIgiSH'5P("*hol-/nHt)ilW<hgeBOMg;0%Zn8-em>k<>\r%aG1>H&EnnHQ3gm89Xf`Fh&FBcSo7-m9f>O*AqJMc:PsS3ZfC;qNi+s#T'kri]!LG]cAiR+_>b8VO6miKh:_=?B?,Mu38`1R%8W_f\r%,RR>An/&^gq$X3XY3Q1;aa8LpRfVp?q:)i6T/sT)mCjoZEDOp[>o,rRlPu@%O\"M^FfZ(cVUDOYCUWXr5EjJjA6b=l`-E%QAPl]M\r%$m[I`63bk'#/4\EkWR5)Y^e%JM`ngHQTuL]-j+=jZU-1YUA5e#/eldt+>m@]Ha.J,^9Q,spggNL\'.\4V]PV,R-#h3b(&#;pq<2F\r%OL#IiaB\L.B#:I/&@RE"T9F5uar=a5rKS;tLk6uH4FDMS9W@h4)K2/lWHq>tTB\VjI[>sPAMFpeL..L#C6LWVg2MIQ`Sq5gc0f8@\r%Lg?IiWDJh_[Q#i_NdTj:0&qXm&a9#PkdP&3FdQWOM^s_ON%:;tCOcgdR,AKW_'G>KEr6\(hkhla<^LND8gok$KmqZEcbE+DiR-ZO\r%HAH2n&llMlUaZ,<9<q4i>*P7'NZg8OgTjK6s-gXe?EH30&n,qAB8^Y:E9UbuAK8RWA;aKPbIEqo5n_BCV8acE`)(!RQ8LcH9]F=;\r%,hfrc#39*rbmouk'.DH[;t^a&Ekm_T:^>[Ujh4h\^LjBjQ[8Ouo\m&q!(Sm*BB[7Rc.1e%p8[!K^0_n>=VfatQeOZh,B[+\J6A2n\r%SQFu\nfhFUSM@N%]K<VZ0(&4Cl!<.+e*F9mC(G0pMoOm;)r,i`NQl@MP;_W*Rd:Tk$/R>\@RGOVRs&U4N=Bs.iAFQjB4%Rh7[H9G\r%eKWGq'G_LqK+:Lj;2%oWLmh@Cc#X"n[T2#<Nf+9\NDj\1"_.liX[RLDM``$D)D"'bY.@!=c*Ut2gM,#_Ce4ZCpOE'Zs80:/mbbdj\r%s7+bu\'k%Y%"J-YJ!9Xd^V>'orq>_B/4&1ldtaF%\*qUcpHQC+I0lt#$?-ctH-UPu^XH=7k7.I9IjaIB#OEomM=g`Ech,Q`$:"N>\r%!;r1iI.l=$J,CDKfh6qsr?'t$29n8g'>.u(!OhjU!iGEM5CsDSp[l#Rd4hp67$d+XUc'U'?8b5%ecR6hU;CLe$NnuPPnIniZ`jB-\r%#/:.FD=_j-SV%HCR:$'cht0Y>D*%f]f:Hn8+m91+5L*C$!*8n5A@Yb;K#1DI%rI>bf8mc?h<.;tl$)>S@+>B#"iX'j;-4.fWRY_Q\r%r\9eSqtp^`rJo=%msC)FGb/+K_OrfIm23ooH&YP56Ec[6LIFLH&GW@P&2seD9_neT<mCL/SHF/_.Mn,]]JM1EkspOJO:iS_3sXeI\r%g>_d80J<rPHjaho`^F6a!;-5"0L#VSI/4kb`t8qY3)Ibsd[;L8IL&:[/!nMCPQ[s2LanmCTF!QKrIGJa<H,!1N<=p>n-SFdndR!B\r%JsQ1"mK1\rZbPC;@--`^]VK^R3At]o-I\);]>B;q5I8M)o!n00)Q]Q(_D>7k7^mujKHXm0L3gS"YId:oIPDdC0MhU$H"BlHU6Puu\r%?B3&d.k?a']0J:Voh=U:7R`X`P9&c80ppQ3COD[Nn7uX96Q,3Sg;M&#,01@ANLE$dYp4ui6S%CfF1W<;9SW\<Br,PJj<j1)Q2g"\\r%ano6HHh"0kE`r0G3qN^%cbj6RrIgr+j<mckIEWN(on`$7OM(=8KBXYV^!cn/61@6g9PY\Hc:?FuV@\^>Oqop3$4K0o$]%i&SX#b/\r%ElE^kpc/]L*/s&HhWio3bYu9rVmNUD#]EdhS78E:!I9XE//%m'T8!GPQXGi2D>@2ol--oq^]!Zi-cKTcO?!5S(sdBps53k"n,],7\r%d<XO.,_P\k/CStVl8ut<"`+9[i>E^743'Gc#CaAiLC#;#:'=T+a'el=qZ0DdP_R<ai4qpBr'NepMG;HSUk.*sl-.rt&QFeHkLqrm\r%>srYR1Unu7_(Wh"0u?!X%-QR(,pjj:^^.a.cKbbZ:oE[a+ojX+@2>$2+fn@&C\&!b7NTbWOG;1&JlTL%ps7S(jJ@Tu(LIDC#?Tn2\r%SXut3VorMr2H5dr6jPhSA2h#`9+#bL?7\YOn5SOqfe%(<o<SD0XlG\TrT@V*f1pr;JPPTYW%NiIL-H.7m$GIJqtpC'5ET'c4BMm^\r%Vdu?kB)k,R$_dT:OY9W7bql8>ej>kQ"!X_"-)[H2BFarf"V)rg1P%]P8&0l?<3f<P$`m6^4lI<@M=O4].Dl5,c12i0"6$`RCe5MO\r%SEGc=`o+ek6^6UVD:.NY?pGkrqJdKOi)%E>]LqL["&f@fS7D12_>-3R3Lh6HZ;>RG/FAG4F?\;R0Z+ul8Ag9=@K:qp;[hA<Abjt8\r%`\VKLngs_k,7r/h:Tu1+1D9cKOf3+[&"uC/4#=c082&UCPO\oGRLt'HV_#d+;@6&"J:ZFci(hQ?-?0gp:,O9tV@\tobi!'F#YrMr\r%>f[d"j!\%$=;4&kMt.jI=[OlC)rN/;gY.mD$spOG)bt3e3G3ej_GL61:!lB@?tTOq"W.O-R1_36d1E+P>QeiC11qquS'luMA'9NL\r%SEDkhKRm]'*1oLr-1+f'fk7qt`ieo([\O14SeMIJWkbKboo;K1E)cC4NSFaM^JI=Y5h.Vf&<<^+!=DKVT0T]?cjHd)9%0/lW/?0[\r%mu),c;.[31dkjcKZ9dA$NSfLe`Ae1.+laGBk9($;:3]'$k=RK?^ta0F1/.6q$ZOCf$ErVp$irnp%KRt*)&^fD29G$%'GM96c_S5h\r%DH@C@8Z5ADXEZ7u$Sn3lH0fe!4:2g&C6F.8KI.*\Q%<<d9gKAA-5=*Kf$]o!"dlrSGD;,iTf5_`().Y,KMbFB$F$>%ZTKR%>F&W+\r%ZnP/9.6FC]0UW7nSLqWZK+PiPNkqq:#e=H4Mic:T*T/W.e:8j4qab>`Do#A23Y7r'W,2R?LDNo,\[M`S$c_8'[m^Lqi#F-p@d$*4\r%YYLs6*0n,9kGiU)3!:h4U6uZ.!(.c>Bfb:uAfu1i^XRAn,<1W;pF0ju5[[jN+@&._J74rV!KkH%B4gg<aP7(O#H[:8`&af;Rh8=R\r%ME5.NL`eD;e=G"+[$F$E"c[$u;R-J(!18=KW`9pP5RO_N"i^V&`'p.T4Q$2BDCW8M&iF<-FQ];p<!nOE@r3bc!:5#p<$DE;S!D[:\r%(b(%CkgHmjg]]8_>AYSM.;0%5?kL,M_NKJ.?rZ6C]>^+o5X1NZ\O=dY<EQ9;]'d!q$,EMTS]Q^g$ijM(0;A=N9^X_r7h[,70s[mE\r%1[l$7^o6i.[q*e`6/#@Ao6$lA]J/GV2M%D&"q"Mr)ep;j(+bcE*>P]i59VfuX&&79BJ#nrJi4sHo.YHoD+3VGRN]Qq%ffP1nu7jA\r%"=d]Cf2TNS[jmb=/Zr1]^e$'b;2'r/*7E8W_P!W9+IVRY>[o2abi<12;?S;kdb?30[UA?@D%[QDo#f#"7hH+Z(uB!C9@1e3G_:mT\r%Y4jfB(#@+Z!!\N,234!0(gJba(<`sTgH&rq&&MMS^Tr`%[-8$:>FJRU9$,Ksgm"P7@D`Tf7('re$U>9=5I.D+H'[!UU2I(?/sE#+\r%>8`\jgMIZ_UTQBbUE,6$eLZn=9d?tVBiM@`JMgfRnIMt/X&4/#X&bc2@195?=Yn0MJW:a`?+rXrm<tA?b*cH*rP#Xo*0mOmC]Wp5\r%1SGT6Glu8T'-OCDMI9CkS>u\6A-fc&9A#NGFJ4__@gni:8</N8/5_0bj'o-(.13d/)JE@*1k9#[!mInHW%f$!6VrC"M+MLk!4ERE\r%=C=H.Ye[!/.i%2n#QiB;@EaUZFZKS6-qY8Y.0(?#20m9'<s2p6$ObJ."lPp#S?(@tH60E`)oPEQ$fHke!!<jFhLMnLWp6K-C'$8;\r%e5%B[2\gJ3J3cJB(M:-WW(@H6.B?2oER[hc"0Lit1X3"PZ)tNUfrRIB#+Z'F_3uMi6\W.1Tl'n*&'S.,7fih$X;$2:2$>L*.L0FD\r%en.B/[%4*dJ?e4;S5nSP^hMAV8$!M7dMYs$^dG1tB1U-ZJ--X;('N,)!7%?<f&X:oYa[bZ6AY1uYS\09>D_6Y^t<_dTaf+oWC@%\\r%i;c2]_3?Mg#3VeNK9e4reuVV;A!MkSU@/2172sK_S:l,hZrChcXS1T.Z)I_'1RA(]Ai0W\()T$=-Ie*1`>sM,Vf=T-M):W\2<'1]\r%:_\JJiW+q$>1,2fYt@/9&-V:k,D&L6T>e;`"=@qs)?I>N*>Fc)!2c`o"GhB>QF8-&FfPf1W!^)0g&50lM'iOC<l'^;>4l-.i$^Bn\r%lBWhb;:kGc`4u[A)A*DJ1$6E$9T1fp?jO%U\CmT_ZRk\VXs1iA#B`$8a_BuWQ%n9E50L#DhV\HMU+IMm"P.D&eYR!r?_'5D$5\8d\r%a)`'BYmO<?S4F8;aQ=/0E3h$]!EX0=,K8+5@($qSX.!_njF##q!>PUoIBWLPap]riZ?.,/#R]D8+Q1nPZlRD]dl@Z;TTV9)F^jn>\r%VFsNI?,OHk'5np\ljI`DaWRNK7rZiu`uJWMJO_C?YIbZC&N3djCuSlVT]rJ4;d4bqlR4*'<"PG(-$Uuo&>WdY.^/.<duYf57[^ak\r%1TltRVVs#@n'@YMoR/T1!C<8u7A1l6@)I+o^(fp^4A72)M"h8VbY`p<S$:%+W""l(6jUSq-K_\ZErgmuWiH@X[54m4.B17_E=uZ`\r%i"*N<BJBXg.nZ"J$@ps@+`!<nP;p0>!8+]<TOGsm>S[H!:qo#JE(:46!DqTp^JH,a=a+(M"P%=U,0hCP[u9LrTZ^;%<Lo@,N,8pQ\r%U=o`+>`Afm:ZnD0=e[%+cuU<2Z&Vhd%<95s(mJ&`#\s_2W%tD>%fkU+XimuG&A;8L;c/IR_#c<kEL!h+)gNflQ"LP#J/ZOscub/"\r%TT%!ih4t<K:.g'?+ok0*ZA:eE*e=*)ZDt45GV7o*G,I_c(`6lpM,fSc'@=s;=umC:2Fh8?`Kcrs*LphQ99+U&@ra?F#V[l=p2lPd\r%ND-%2out=AAU8A0Vh-I;21pe^ptN7''l;;lnRMj`[YUBTPN&-&h,Tih[o9rqo$i?oBdi7G<!d]TliN3S,V+J6PW91)-)&-*X!Xte\r%;.(%mp\41ln'Z5&SY^M<R_FU#<nu@J&6c(kTMXg>^P16F[\Z^<*.W*._e7EJL;;>?)g6c4R&@$&Gq0/O.H\2R7b#GaT;R:KBfNVZ\r%+[Em_r$4'$@;IG#STmY0oPuanU+5IMQNQa,1o@D8246ajQoInD5M"4u5P/^_rF1[UX0WF8C_`hT;8/:E+?.c]ol+2#\,@A$R[HZl\r%`k[#I2.C4)o,S3cfRUn:5=QnN'e$09[LSL:a$>Um:)rP-"9iC6(+l5/3rjU]TV4b/E,K/_iDuE^_53'6CXTI/7s'n"c6`%<$'XUN\r%JZ^>Cjqot[6ss;,8RrO;DR';1XbKliN@')d!&[;uIZ4tu#/[;Z'3,EUrhKo(.7\7mUNmej%Q<+9<kTaL@((#[GARAZ/r1@jqKfIJ\r%L%2QRLjn=`3Wgg*F(GY$=R6]/Q;R^uW:N)Y2""M7`mJW!M>%g#V\['*(q1Ff#H';\d8%L$6!FKW/f;/,@Sn@P=!3>o;TkfNONItW\r%@(#1uHFs)9/<";M-&aB^!Z(H;1N.L]0F!MIki<qd7IXihI8fJHmpD.>CRY9$`>D$_NjHeg0Uqs.ba_u>]=Vl;'8">M(<2Y3gVtYW\r%QtLutc52PBmX\56>:UXSN!L\Sl>ql7[94nI<A]<L]!lT@(T<N+c<WdkmeV%[TJ=1nW*XPB=b*_YX(!Y9]*UT8;c0%j9VZ=N:ne#4\r%n>hKlQqC;i]VZlL<QV%@a"W,d@qfG?&`>R*3O_">^I1os6pP.:3p0ugiKu0.YsPM"2ggs_MJ4UgSWh(R&Z@EkZ-O6fB!&%XQ$"'Z\r%gOktT(sP=t>F[.$!5RUE+CQurcPjgWFMp/aKPd4CLoJ\T1Y`rYMRO?90L/Ia\P*uj6=:.''iL"u%&p1Z3(A7eJrF/Be1+1j.BA!j\r%^(LJtH="8iMEoG9M$%jO5b^:Q]7UM;X%j@iprijV9=o7"N4*)KdGH4Rh>uHI7jnPAL#5U3VbpcB!.j.0M!ujF5'(GSH7iU]Sog1'\r%nMV?P3O\R:etA^dMqleERVp,;<j@%Tf_1j#1u):J&FUsplUCPOAdnTE55I=gRa_bhS9mU47rrQhVi(1h\-HP]E*#c+YnMsZ8q^b`\r%Y[.K;;^[F5A(+n]WT&XSMIp)PNiRWD=\uAZA0B=U,:%OI?qO%j/W*4e2<U:U5IMSrc7\gj&D2+k<YG\RV5Sg37RNgm-p'lI/d.`6\r%8QUSc?H5uNngWF(8"f979n!5\h2JA0`TW%V&D"$F3*I1jN$fa%:)Q@):!ZBi/dUcZMM)(VKYXiHF9J9q>nrRIY)"qJ9TeQ9@&taW\r%>m@#@6(ijUo7hdDG-a,\^aZ81*Go'eE4)o?i-5mY2;8b4cK4`;Gp?TKq/m$fWlC.u%tlE,3X*mZeV.?'c4H@JOK]Tpc*<Wmo*g1E\r%UjD#P5ltUt/>9"93-=dg$a!,Cn7Q.Q.Le4LqVg#TmO5_tlTZr:/d-;YTQK;W?Va8.":A!q66[mI;cIJ6I3`bP=&"b@i42+bPqKZj\r%#V<8-18uKo5l6jaaq-OG:1NCq('1bI79*-l9mP7Q[FtHKW.)m*X(=Po7E8/GEfbEI7Xemi7Iq`P&:GnEgIfk9TrHi^-;HB/0$82h\r%EMC:dmQnLog4e4%b(Ro<VrX5.["\0Pqcf"59!=JNWIY-/.]Ie/qc+%UTeCYS^be5/p"]sACC\.E?,sNh+u+BB<a&XO!F<lX^nu2g\r%B;S8G!<U`OK?d\*gb?i8(B8h7g98XBGm*9*98e$qK[`?$=ZmUPG+k,E3C;HL8>Mdi##;$0S:C\C',cX&,-[Q_P#=>pb'W[6eQ=j9\r%c=\f:C)cYeM`J6`cZlUp/]CIZ2oLZ3A%^qQ]p1C\)FkEWH%ED(,NY&?63p8NTpI_Z&V2rF`^(F2M@iJ2q'@Kl]Z=5F=#Dm\dUAUA\r%0_5+I`J!$&c-F8$BIa0BY-nn0*\*f7$tWh7<$@o-+@+`k6TL-i+m;9_0hM2nUpI_uU5)lnWdHBl_?`h6NNsCOq-.udD2urT6dX&^\r%:]thH]']^eDWt#):';iJZ3;:k8!hqq]F5HMgRrOuM4`7p/?2K27aPBo[H\C\>^CL'^Ct$A_d]`@!J!\HhGR1![o=oK_O`]8Bi<7p\r%<KOqeK>$/_PGUL,Z)OThX5<1Ih5rrHVZ0?&].Cb!M\r@_0ML#umH"r6TF7lk?f5$#e^ObtN!e.cfSLhXJjT0mBrp<-HY\dX:LB!S\r%V<*k1aVY$s7pSC0Y<n1BrD54Gcmr#;05AcZ^90TG'c]F[S$Q;ZgTrM^'XKWZU0<2<U5p![i(J)&"_fb_B:aIBU'230D:?P*"_hZM\r%*J(SGaYQ3Rbn7#XSOrEO&NE9dO)tRKd,p4^VSK4L*FGnj0j&[,<dP%:W_=u_4X4q0/'l.>^t=e>E)rcUdIE-,,tHaXRTDO6#.Jl@\r%-)-*AQ"bf[T5?IhA(-N`OjHnBWo'!D:cm#^(i2Qm3&?Q&_(\[)0&?O>1E0bDPD3?N+^ME#JTH8P;)N,_;dC+<l7+CK-F="m#[6L0\r%+m:?`')k7+eeEkAKjnH80fY.R?9M(XZ;i54S>>b>OqJT4N7VUPpG8j$":"P#eU<8;6())Y.8neVLSf`Ei\(A&m1,R-K3^\j@r4(*\r%BO@XY"(Ip]fiMKQ@WJMEO+?3rX^JaaNK*1YY(eNJF&3!&,W8dr$k^]5LU&3pD'_]Qql<SW-Q.^i8J1UNgkh4qLt]DA<-_.i$;O4J\r%.$ui7'oK`/d7-b8+CNQ5IbO)KpEbs5q4L5OQ8Y2DL7s:`m!srn>QBsT?MJ"(*&Ih=MNd/baBg%):G/o@5J4lg`PQ\=@8m7](X83.\r%EG,@HrFg&(-gG4\os\_fI$[]sdYOS]b=@kK"28,a)QF=./T&'EZd#8S+A"lh$<*KiQ%CEoMR%$na>1FZbXpQIf#SjiX]<iWp"0I+\r%[S3?6<ieH,3Tp`L>Ih$In0$?rVaf4aPrJZ//2>8NA_-5:\Z+s00n3DKI#Df;7,24uZT",5c9U3+QLo/d0\]_XU%Z$IHfc3:E^jHs\r%ZpelU4se!b2A<Z;_hL86qDF3Z4Vr((6OK>#fM[mo":tXtCcV-Xc%J>!?0tfRTu@."AQdHW3Wt40:F8dKf`^5D-c&cWU'7EL2J,*[\r%7VFAt9%%^A2*Ilb.CKMPX.CZ3lt&VYRMsY:CKe!jc=.?aP*M.([#-'Sr#"XKC;eeKKeNs0fS(1rHH;,Z@NAfM\4dg@5ltQt8fV(O\r%?jYDg[Jmn2-DAZlOcHCJ!I3m0J@b3@>l4lCV.t08RB.Tk5uYi\B3qirl8ch_>=UJeUeI8=oeU)u*/,`WW5J!N^b\g`1!-I]TUmf0\r%HsB![M@>'-<5OAu/D5jq"(;=dVS^IRUa(J_`NY;$C27Gbaeok]d<SAfS>)fi?O^5.B`_8QUr0;b0`&M,$m9a_3U+)jBG!&K^H&m!\r%I4jG+ah4V=6k;-=QImVg]?N1c,+Q6AbEeX4!7DM%^i&`$_PL1n>j^^c#"gL`2#!1L<^"'gEDuoB;]N/%VhU/j6]PciMYS>s_(otE\r%b$3"t<,6GfH<a&TI)u0jL7iZr]9ZT6eK$(11agh'Z(rkP'=t2))\)8[d_`ns!Ks%jSN,5*nb/BKHYWWJgm(kF,7Cda7m76S!=K@#\r%-ejBn0So)G5f^g[_B\5QF%!Ik/Ard$5S5e(RtY>8E&)u)M1e3&PncWM":PY%8SXpf:a9`&4sl+0'GDJZGT(GF4QE*oUjCIL/T>A[\r%.Gcao]G0LmaH:!J;nt:*m?].`;92h55-]mGP+=su0_SN,`KX"==EW(*pB8G(M!Sau&0/DH'kLj\%6k/K7o!m.bsAU?,?sHGBfTD;\r%M/;ZGiuM#h)i?2^cY24DaTb'WDau`b8$Q;C#<-ak='a4PH$H\>4QiM6Ll)t4Y+i>V)=AqLb"(03I7Cip?"ha9_gUfIVb"7UOYL)&\r%&l)M7LrX=%!MXI#ii[YX_QU,n8"&()=(;IQdg^mAOEqNB1mG^P%YEgnkd_VR8q/I$lFQUhp@&YR$XWK6&8tJSqOSA_9ScO^D/gMI\r%Rl<bp`If1/Mg^3[TWtMIW@']d(<-e%NQ:[U=Ur8;c<&Oq(7LYM<mFVDYXTo]E.ApZ71MA1:Kb_K#f<MG2#!UTDd$'/Op%K3*.u=(\r%&<(!ThZUF',hK.Gr[\Y?fq_9idj`=.V4KRG*lX#iauYEEou78p*D-jBm1Ite(6K*PMUQhe/_)E*ennC`!4,('d2iG4[DR6@c3$/c\r%h"i1VaLN27"e=]8FjL6kbTPJ]ETHZr%*Z6f!m>&k[,e#d8e3&i]sL'N:J0'(a/6/u;s%^sS0Jhg?m'+g<@55.nVko(5tF_)oQV4)\r%Rnetd$,chn[(aV^])ZWK3c"-T9[?(eS/V'ZZJ.6ggLV%^mNntYZ6RKt$KrM$1UQbo5d4%I::[Bmr-]V\QMuV`-cJaUXO$+_J=^2,\r%SEJ#0P'"OL)?qu%'PE%jI_KVZM\lg&PAT+W;!g8*pn.je@m@#Wpp^F4/'A6pi2O"-h0F+k523=b4bt*T=bb=Ii$**$kkfZI5%8A^\r%VJThm*ltliG6BDh+9d@T6s$X'_QD4G#iZ1/oGCIJK7:6DcWeM'7-ph87a(^hrO<@"Tr?tISSgbjRq6_2g"rNg?'DG,RdFCM'e,"&\r%G/bSsZBHEn!hXN"Rg,"!h4E#n48",ugA2*)7!^fXnYBdIfg0?9chP_fClATWhO`-jB\`[tmN`Ph4I:+cp_Jbl()i8S_I0p:V&s7Y\r%I)ppO9].!c9n6nI.M4Wi%qEge<C%/i7Qt7_#i]MI:'u)"4*),gOd-h#e^/%k'3Y\\#L,WT@Ll1%92kNr-lHU4*PB0K(6o^5TR4"I\r%1deT:Ju.g0PF\ET/l@"bbeag4^]8ouoJIkN&Bq"FD=,1Y+l^WL%RrQ^E+Xk[nG\2pj/D!G2**Fj;!G*PoS>cg4UBl:`f_a7i^R<1\r%A$@N.*4)fkP*Cs&E?o`Y\76;bfWJ=e=7mH]f$V94cql:EiLrD,iN4^^3Eh4]g8X6Td.eC=<2gAgC+Y:&+9\[sNi@<f8#d't*L.kd\r%3^qF"%q:bI8L']SgjUdmP\=2qTTfA;Q:VHMoL'Q"Q_85FYt@T-NoD2(N'9Q/=%Yf'Z5(QA7O<AYi5n`QbbN0geO%)o=U?3Yp6[2H\r%N4-ic#^R]'L8B7p[O6)=Y\5fNBIOk)T3%Y2+H"TE1i'b'Qb;U7FtK.%JWs%!@KBQdN\M`PbE%IL?r$S!;0*5qW&s]W][,\lULOHr\r%-LV(B/Y0@G\g:9&9c]rA9FP_d('RGOko7mMS+I+)n*0'0Q0,Vo$+Mh7e1$lor[3?KMQn^'N!!0CDlOFV*P$K4j5_DBjjM/5DDT?\\r%-@Ta]PbH4-^fK>/_D')>eq@?JJNF#?-*3,q@h?!7R-NfTqXK`f83<^6nb8SJF)3?Kok9lMP;Pd;om*CWVlNKX'S_:@D?>m]n[Hnr\r%&lcaoR]0pFlUD+K#:s"hdL7F<CWQ_Eo(Q)^Qlotpr_'7nm.fq?7[Qcfh$J=@G*E%;%Qu/k9.Nhli;%@<K"VpMm$67Y\eD<Jp3r#8\r%lO[/.R[-Vq(:Nj*@1dA(NTF#2b3BM>b')VR!i3nAC$o4H)<Q,MDH8h#cRM%Yn>qa6qW[fq,gWG:i3u\f7.=@TqJ(PTrG`JOqZPIm\r%nu+P;o-Lo,**.?&mr'BJeU+"q$NT0t.=C/s:1[*uh_dhPI>bQK,V$+V7a,heP\7#%Lk[HdVa;*udB5!N%#lb4eTYKS[6Vlnb+4[r\r%Qh?Hl*,Nj(MCDWQRkss%0>tr!1\n.oe%(&g!jo8=,#M#:h0[&Q=>dSZCg2=MA!gFJ0@_BM2Q\lhAa6S@MmNu;'M[\Gr`-PLO`Uu&\r%Xd,&?'7PmV(TMF'jeHdASWk??;TBFsKV2:,r^M:7Ek$`OpMf+bNOfX\5WSFhj_J&`<I.PZlS1nn>>"#9:ND9';?>gGnPZcqUZ;#6\r%Ai^t?UFD$In1d#b:;CQjpJo&U=5_.pN6iPhe40.MffkuTda8D4:4i+tA1b@#)3Yh,U)d8>'FN?G!t0B\'B[)]$`<H-8n,e6H1)]`\r%&>nIi.q`1qFI_SD\*Oa@K\qZnE1PuY`5`0[\<<7eHg)?Rr>PhHgV5:"';sL5`k(hsbU>/@M%+J.8B+qM<WkJeL/k!\gXrh'?3S5L\r%<MP^S$f)LZU/AiKf:ip\Ue=1TfXYc?$j`Jj2`?i/ZU66lX]Esb9,p\@D66sMBsC'8jU<ppLt&55=K.H2'm?M$lU8ot*UT5BXr<:O\r%L:$HN59L-7Y\fJP0;06)0rq&jAYVSWEL-Eq<rR9`E)(ct_V+@:N89l$80GHqG:PB0a)Z;@.\fPQ@-"9<j3([W6\.@qUD@NaD$qE/\r%-L\r_F[2XN&TmN`_9N3b.UJ<?'IZfNR8E5(p3q.c>94oJIe!BUmd9nP="iFFHFU_8qt&LE!VFS6YKec7HiNfirJtU+r9gJP2n/\9\r%[o@5@Vr(bXlKnPh-NEJ\-@bshbq1mN^YjTH6f6fo"lboS,l'Qf6FFbJ<(;o^'C"^-193;S[@2<*-#1;NLB<d7<QL<9>CeYO"oW==\r%'ZGYr^q3]J^CsF6:\$t[gHqTbZ9[\_npMN@"cmKg09FcI.nU-L$KT#Z@X["fX,_>G!?=5/at`&sr\!e559s&[<!X<SiMfM"_R1G7\r%"g]ORC#I3(dZ(`!7lSVOe(k?^"\b:i=hh3M8?rks+g=rh5\9AN8I;u:"dAX.g>oJ!TMWE03dA#@.ig,U:s-=$.8Z[X=/be/HbVVm\r%/J!NHBuCq?=C+!H\gA-#`VIX_YRO()V_;*Y,oMTaQfT*/_;l?TA-C\i^_g4^OHEM"`R$4BdO$G0Ouhr`7'&)7@*oV>-$^F>V$"m'\r%Q*gr/>^UC>Zo/C<0>=VTAZ_'Zg\+B&X;_?LCV^UUWmot-7_7:aNNnm(8XL.J8=8`Z#J:WLffsc"Q(h2WjCV<!a[$TP9h[3b[lULr\r%S15l!kN7<;gfVS'CeM+'4<'(+!L\J@<>[3nWtn7,SBkLQTKm(k&F8*EDE4e6%PVf/>/R.#JbAY&%(%%3#8(TR^F?9%ZbA-oNcj5K\r%bcD!:TX,E(.RBTo\E_lWS9,:.8dQ:h'P==t_He[>9NH`"2*C!#Ec5gBKo9Z![0)*a*?55U"gB<(OYbOR'F7O'X44_h]jD98L'PTO\r%N59Spi&&]+-Uo\8*C[hA,Hb8=Wj0EUf,+lZWZ[:g*I"so9204L<U,O;bXq%*1cWHS&YLm;f+_8&Ro]"L=?B>-0W>k-i:u=F.n5Ci\r%,q0!!<5pDqY&3Wo_n+e-1DVO<OW@I>3+=UUL,pt?E6Bf/m`(<&f;6Q?=t&)dPJa&OR0TcEM@o\IMgq(h.c,itV:6k9TX%W=Fl*rj\r%A(9*bX<'nH-isQ^M*2SX769/JM'G99b$?=E[I)f882hM"k2Mh*Qb.eC;kRNO,qgj<)atQB$lI?.:NgN6kbUj8f;pC8"%UV(7ptFd\r%h]/bA%JgrnkFM\(r@!&faLB,/hJlk1m6IA\7`W<-fAWt=h-tO10MHbm[.]g"YD.)8!9A!)q_kp>rqf6KKZJB8"KX36)6C:Zoind_\r%,\%68=n1NXL3G-rH9%bK-[-?a*#_h#,nM^`F7-uan1E`[#EQ.mq<Rm'LWUBda4UX"J":#j>G]f,B^_gl>ke2:k@Ad'kN#DOf*`MK\r%K>1_&74o;ME3_IX,'s$CG&qHIi"A&1G:W/n)n/dZPHF8Q\Z`.YUB6;0IK/36XdXk#Z$'Mq*j#ML::sh>705KKbYb#u7UX`W[]WsX\r%l]qdOWkR:p`,^O!GpA0%G:RVlT;5h%?;4mC8WBsBEfju>e:'tY^Mf$F1cLK$6fd#"FpCg55e92eUs3C"bKh\8#?FCgD0q<`ekPU/\r%jXO.Lb:%e6mDumS3+1N6bA%(g=iY!Y_Oe$0k((V.1/D?/G18nM*btuf"j1*SpI]32CXJ?OScSpJJkiF`g\^*:DKp+M=-8)'(8'"1\r%7h<V^&lH3/3WFq6=HZ9OaN4OL]-&cm[MTfqdgBjq$3eRX"hTY_*UBM4Sid/X<:26DY&3Wo_n+gCah5SqC2>bfTW%4#W"^jr?k50I\r%3%9'JTW/'Y].L#K>2,\T'0OhUA-2COL%^Db%dBcJ.!YjsW6A7N?/+3fLNUjm;gF98E!U1a@njhP'f]<3S-o7q>LofJWi-_*.?M/r\r%=[$=t[DeAo'NS<t:af0&.QCS97>Ea)Eg*7`J;g."le;&]3NO/@SA8@Icdu;hX<u&>n6jAXARGiPUnh#YQGi)(W/M1[)I;*Jnf(V3\r%4&@>%`[Vf5UPrBR>-V\_WGrUX:`6=`]!f:Z%dSiS-hA*Na)L;^`hkG.s)%uMSAW5BBM$/q96Lr^(0/3XW9d5egpS6$)E(\4-kr',\r%$Q)OYbrV/J(!l0`2$F%\"A5e3g\^*:DKp+UIh?0g9g^m>>i]c)euLVUIT=qoka_gH<#ndsQ]mGjCYQ<S*S(]G$>b(uXBCl"CXUXQ\r%ScSpB!i:(f[eIsR?1Hj[/gJLO+$Q5AoD`\1G.$FaKdP/R(02,lZ`?PGn0Lqo^1E9YDGYL!I9th"?o_0EOY.u2IU@W&TIa>WD1/;j\r%l\5En3</$r?si50N[).jIhCSC"l"b$^7td'nbHg&,b!%N\LfF-^1bXWOV-'I-7idWq6mWdcJl*PT_BHI3:pD3*U@B?0KBICa9Xi7\r%Y&3W/n.ilC4:jmM)r/G&QOdf)">2<N.kmRa03XKB%RA7W=-r=`bf0*P$:Xd!PrJE'=?B>-?j%Ji,b*((*Aquc'-KPOWtOaPp25#K\r%)\/C\Feh.j+u+NrK6"F&B8ZO>[>jJSiNWVJn3I<VB+O'p9itXUYM'c:)0SP49YR\tUYqa:m#[6n]&X,.TX%UTF_uK/*7bQ(:?=H5\r%^3*DaXb^WMTQh2Ck(?$X'4+8qXE&L8;eZS<hTB,P^+J1iUqARd*LM-sNe=q'9HEBM$UJt<"NUj0Z*%s4QG^;r^ra5Y9H*)1'=nr*\r%FQP&4gR06KT#suX2Wi0H5QrWYjV4q;46_#+O0o(D!_&d?i(LC,emMQn3=5nfgf8)pgYOT=Fi/i13KA2B-#6N`k4IN4^mMCPTcZH?\r%0-5c.fO6dmE<5.7@<02S<c)RLRTETQ:ae$N+-ejgl*h@@i,,M@!Q"0#3FZ:KhQ;f[_grK2NMr)O>kfj?L$i""jDT"!>>\8[jBr_S\r%lNe!!CmCcG^+Esn.U*?t#7:WlTS'@SH,keH/Y'*/-kN'B<N1+XI<Q.dL'K)I)fb$4rMi`hE#gpkrN^O,UkpMKXTZu2TVf_b$)lXA\r%CI3DQ=EfY.f<BFk:nS(T=HbBY<_Pl?Gt!8aQ+]fWU2BA%@GUG2A8Yn@CeT"/9R&_M:?!Tpa[FS*UhX!a>udQkX\)d;U9.C@>%6m7\r%C$rXu:q`?lj2?fp#1W)L:u>>X(N"N&js.+P"SW&E,*G#FF[h9l$6C10S]*oO+`'Vrb+faV':UuD9j>.bDMbb'Qda[(;QFMg[C3Rg\r%!+G_MVmX##ST6,[$t*`<;m+n_^l.75q'lp;`He[<pn"k@gK^gLfLT"cRfgAI"BZ&=[T-O*5>YS0Q'#.@oAVmb/1cj)j?)^o'F9d4\r%FD>+9hCjY,_h2n$iXk9X23*=>KC2c:G?"ef=O:=q].*oBh)RKgZ?;,:XkI60J.Pda4-0bFXsu9L*GljqV)%r:$]s97[(<]Z<upP:\r%s!MjGkc0Q6K9`[,f%g[LGDoEoN2_XJCTS_jV'4.pa?;&"D6\"`D1Q_0X'7N>!Zd`DQr2hF-.Yqgfq&6G.W:SUf=(Fs@GUG26r"`X\r%&&QB1.9EPfEtsT0$V>R^F4Oh(Ja8>W<7`NYT^l-#/(YOm"*E^#O`hRkhK4T>UXf?`3.p(;kJ&Z8jfHnqg@e9%XR#kXb(ZVF<18gb\r%'mRDrJMS,$@!Yc"h)Ms;&c5$D>WP],)n:d0Dd3"Dm1O1>$3c;P_6Mn;d]j"g5/:#<5io.Hle;&]3NO/@SB-DZ8iLH^pJbtf-'ZQe\r%1:]F/0"ht/V/'D7e7%.;8^G5aQGp.;*(g_]a69<_X6ifee<&YuIKe3H#JYk58mU3.-\lj#rGQo;=Ol^CdS\)t't>>$Va<h@Hn/pI\r%fIO02WrjhQkqpPoD<%u#*btuf"cAt*oc=["2-<"\7tCZ*Y=bp4lapq72`s'bqaRn=kVuVU2=,2a:3M5:PWPcLW9%S\4Jk;4#?:*k\r%;.8!u15"+cSJG8meGAqWfM?q3)RquWOobY&H\L0BgYQ5R]&CK)gc$F/CXo*:h-u^W#9KpP*@6CTdFI3F`9B=]W$)`SC?JdN/UhJ.\r%GB'Goecem@gEfr0>;!/*rV!9e_45BAG\UO=hCjY,`Ih+bE)a!Al,ZTjgnhK4WJmeVMs\g_Ts%p]`oUA*QJo9S>Wf^<g4;YC+Y^,7\r%T3i_3CY=(W@JY-pe[;bJFc<Bhs8.(\!UJXgfm,5p.raYAMU/e9T_,F$4W:>%BUa'd-BRL8:9C\Q2L!C!Y]c]6i#GikUb/j3>kW)-\r%JH-QRVq/9CrGl"!4SX(1%WB4PK*5#VPr*L=XP<_rYtF@sBX?P;,%WJCaM"TW)9TG-_R*fZ@I6=R5R0cp>%ku%%@o#?JC)W\HX_Wj\r%TQ[@\h/M:O:0d!EKS`Ldh6"KGe\Y"^M!pG5i!.18`n:BX[;q)\\"31/ZpWPUW?2oJi7RMDkX^>3i9(@WTWtqBg@ei5X;_Y>b([`b\r%Su&Co1Dsg?-s$X0[COrPY?d6Ro@Q)t)(YCI>tZ^o*7lT#O?Tg`<F@bf*(nGoQ@^F]lN1%o.\X"^mukT"lMScZ[m8R.L^?P)p?ku>\r%bf*;E>cIHWpDXk:ih._'#?8u@Be&#+.PnLJed`B$'S1k<m\`F0<I1buXV)aAjfK0]g@fE,U`0f6b'CmOXXqeW'[keAbT#b6XguWs\r%<Y#a+#NL8Anqc_uCWi_Z=Z_Q`k*0B]7k<WfE!F$fEqst])IH^*X1"3bZnneQm[q:AUN42:ju\X;peX252p#VOG_$Z<F\C^P.T\tH\r%f`@A?Ko=ja[M<S3U_VGj'FL)0*N[f6*7iJT9^<CG?KK"%le;4')V,?.:?K6D*l<h_Om:a0N.JO:A>j-Flsd/<%\^e)[Fqi3Hcm>m\r%)IWlna7]B@VV>"88?G"Ps1SJuZg(Rq9A`O_\`s%6gbp-W/m=+1a)O#O3cMLl<ch#rLGoIM+Kh\LDeJZ4Q7Tf#g(pj6]YqA]NoOp]\r%3gf3:Xg+1k`=2tR2!,^aY&3Wo@GUG2A8W>e#toRUTD!Hs2IO/]DK9NC)u@:@9gJ)N9:GkDgQkl!=?FkfSX3`thfjY%FCkK$l`.Bl\r%C@->.*55GA5K@OIJ$B\[]EVct3,SrE<ojjObumC#]TVql;&D]KLis`,[A/Ub*>AJ%4)#+[]i\^`JTo@ne]/NH?gC\aQ:ebV\E`*g\r%%bDlX@VH<o9CpsHS2FN0.-2A/kSE6VpIH"4pK3"%/%fUmG;-+8j4];^X;r]'kTD;+p@:At@(4EB$3Y$i'l%%/aW4,7X;`4Nb!1eD\r%;fpZT*i8C7bX7UV;6[9'dR"]%Y5'K^C>rb5h;X\HUUnCp[crKD*btuf"j1*Sa*sjb`u=RO;F^`)Pda8#DqR56:i7+h.ea?i"L38j\r%;,12>....sHD?;9XnnmWGZRL\+Q[A[Fhbt#ihc$"Y&JPlEc\cYj5O+-;4TGQf@bX[5fVC.P'FBGmukT!met6I["t-kC4fDQNOoY0\r%l$\:T0E%dD>kIS80O'tJ.Vl"q`NnlIMn-ajJQD'RK-OaPZc!c.@GFV/!0t/gX_Z\gjfiWIE%2Y50=S2B;3^U![fIEWIEUCu*NE5E\r%,!)C$B%:_[18c1a#LS<$i1%_c-Lm0LV,(mRp9+hMpaHog[_4$uiMP3SnBCCm\#@hm`hK'X!pir?\P@L;X2h#?6%(^C.7pR^dnM$%\r%4(BSM2-(55$C%Fqme3*eC,\Y-$3[;d<GGgohCjY,_h4.uB"36>UoCH%)$V+OqR(-)Ygd/TQJR0/9VDgZ5\9E6NjPAQVGN>]",-eF\r%d)#_D/&@,-brMpT&>6;;CteaR)V,?.:?J431=A-:V&S3l^o9!R=AQ1?GEU)Y<O:sUjUNj.D:<ZC>%PdC((-!Q%q5PTn(AkDSB\Ph\r%5_.!_-.]Ks]iCjI%\3/Bh/\l;)=q_JD0ecgZ(ofn#tE?CU^%\AW;Hs=Y+)l5.Z7a.^c?Q:FspA->p<RqFH8$cckpR22(,B:>D@:F\r%JWH@u4(T:qO#_fAqR<NJP!EjT]K'-X^qG1hRV]aF='A1ole+u'<EW58Rrh_3=^lHk3u"^tqNH%3h!:k[XKKuDVdNAeV,Q^7p3o$'\r%)]kNJ.SHMBB56+(<>Gh*&h42@bQt8L/C6''Hs]ia8Jjj&[B*Olg(8F`YK>e>]m>P[FB)B<V\^(N3gm^!mu>5ql1q<=eKqj/7pY([\r%Oi;lum?A=TWd75feLE'UYQ!$<,/#0nRe.eAhmVaFPTFTFqMHg6ghWfIXM)c6UVKrAER_S.]jD98L'OV;=9g'576=O^'j2Ndf1no)\r%J"hXE[E;*6HLL-n,"k8M=LIdJ7#&#MI6EnW2mfr4MW*n:<nu;T2&8]]CYSaIE,PN%Z?(-p,Mee3A(=[$[+A#DBM$I;q(*7]&mdUs\r%RKG$P21*cZ/Qu?6A*lN_NQ"21h%YXO='0GFphD@?=P(!*b@+[ti)GKs&foY,/&J<k3,l'j![8g)#It0l.9feL?]?AjALX[GPH1s$\r%3.8`Hf4%<8Au8R,$tlcHikFh2YrG?]gYO<5F4:.&*3$j%O6ZE48h:J-CSiAgqcU;0<`_lG;Q5'j('(CRin@.TH/'$J#Pq%D%btis\r%339g)MPIsg@WBo/[_6#Xl\5Wl4&Uil5^1VW&rQkd1(YiV=bTVOWrPuB(&LTS$.!Fj>#)6oZ/M4#SRee=ikW6:MW*oe<SZ2S'c'<=\r%CR^jWC,e0N5M:$;Us7'7p*qU$YguGJi09rh\0A`!q9ghJ\RLE\Y&0S2gL0Ea?A2qkep8bTCTji!..C5=*4:^5]jD98M?g&]_NH7H\r%jQ`eM/APFE-"XdU@(+c=-rN@?0!#Bfp+NT'ohqh#@0cKE/.8[_9/2Zhl(m51'j)HDb@ra+gHE]d!WM8\^k/$i2M\o:keOl49$C=^\r%]N8*id0.m!@);`Q`]Pj-L8MF'40/qUrBpnY[8J!q?<+sAi%)#kC0fT9WF<]UiPE!)@)77K^@5Y+'j)Hcf1Nl;f^2E=Xf<#/@plLU\r%68u,_9hfI4]E4ic/?q7/YJB/5<\235m8[.+!PSVn,M'9ih<INi*&s4a(bthc,7D0dMZ[1gP_cqP<>(D$WX@Rd(SV"Pc`"#@\h2'"\r%>p8Sh?\-1IH`\!;Zr^7I"S`<TN`aoApW?q#E8X]U@\!AH.XJ8O6$o^J]Ie+q^=Wd:9eM**<+#_bBQ5u_(?eH'ULRCfcrFIncsA6A\r%+mi90*!*bTM^-f\mG2ebf,Qc<V\mh:f1hT<J]31eXVAE?17(uE(;'fkddrX8!_^JtQ9noc%=1CSa4c*Y!fI0T=t'qsYH$S1n.f%F\r%[B=B8Qc$Dn_5Wqn^msM8&RU+.JU=L5]I?h*GkS-e&MkfPV?0DLjt!sMG_rLoWF>0Z?\-1IX]UHJg8h55!dk.e8$$L\]@E$]3,eqC\r%&X?8%$A2B1`IWB<P_d&i,TP=6.M:u^beDSaZ5)R1X1!8*\SY_(edh<e=;G;HQ/]%AW[a#1?\-0nle;4')V,?.:?F1gi**\C?@g(H\r%qrN>."SoC^X%@.HokKIC4/m'pm,#.hr=R:!267h^/$LS?@/"?hk,RghBgmRQQ+]fWU2BA%@GUG2A1f)>0q+S?_X!n4MQ.>eR&h:9\r%;?hQp*Mttm6$LFtbEu6I*Qel!ngb)]%$Si4imdf0rp(!Af9K+gZ?OB`>k\,,eQ7jbBK'*sop#\_l_Io9bXp<A.bKO+M?B<g9U`f^\r%g=FB+l?96L\=CtOel!q)XAVu.6%DsB=jYl,p.dW4.gGp`S__J6$7P5.MXJ;@Ygl<r<<VYRoe`J=$E-V1Dq>)J).U!oN4nV7=8/[7\r%VcXtdHZ0JMXXf1W.]R_#>kJh-X_Z\geZj";nEh8:Sm7I0nTsjC&%+GI7-LR24F4UaFD?tkj0&5N%VRN\^7;V8<pBRT*NK;9l73oj\r%e)0-N(J24,]BUo<<nFeSWZtgDs&ADj^g#6N/koMt`Ik9f$D7FCE>6l&.]Qn&9!XrICo8qFDJrb6K"U@-e?M'-X1mT0<[Yjr[>HH*\r%!`sfh;sW02IQ=JK*h:B("3`W;*=8j^ih9O("f^&M<3)sL4f_.uIB<8PE^B)mhA5:['grk6%b@\aGc9.anMmYFMZ:Dk^>`jLD0r0#\r%eoh!gk.V#3^fCmIX1mT0<[S(8X]^WiWMkDsdi71LobHOT90+u^(?SQE1K&t8"'tR7&%4MJ*ii:?nJ&Lu/"Tqr[eIsRh=0?%mMfQb\r%qDu=daq?2#;NP/3k,m67_4J'9Y(p%b5q)+n/6\("mG^rgT\7*jC3<E:cJVbXrI")b=JsZVm<s"WfA/ZBlUIm\Er`?=M?d@V'VoiN\r%)D9B0)$<Va/JhsJ=(l0%)R-HSGaG12IAg70crFFUK&tXea(c>h49_naMPo%5p"_L,)]kNnFi.?\1gA>,Y:RN:b?=\hX7&]q0EQk@\r%SP),TQmQOoI8F\uSAArB_nq;%=s"ggMdPe37Z/iZ!htT?3arnBHaa^RL'&fEgi.qAC*0Liik]kp9N>Z)pIo!PP\X%r&2\cX5j_bm\r%/\tcJikfN2`/:r)?1!n'QqhcTZ,XL?FUI,K.8sstD0pIIeeJ]jk.r3XZY&r8m?Ju"Wh^b6$RWm-3^bJB*g\BKC2M_6(U8!_44%`G\r%/AYR?AVkN;1%4#Og+,foHct9DNcEVJIm<sM`1.]>Hg^m&"'_%T4Q7pCMO7:;-'+hUQF#9qWQf%6>2.OVYb73a<Y'<ORg3/_'T^f0\r%WH\bTm1iF!CYS_t=HDt0g\nT9rr;>uBiAT`[35;Rl9FdW&b_1lc?Zqr,`qD:5<OU1G<=g'$O*7QM&(`4U+GX0qNl!?@@mX76SY*`\r%[M?)UOZV`2o2'McGI^e$E6XOI1Q>^@7l&LIPZ9`9HQ[/uL0EkP>M'^n,p=0#g&ntB.m7"_V"C5C[OZ1r?1*u,ZF\pZ=dF0@Ad=o"\r%KN$,Rf]?H(_3-,KAfFo*&'CdO/+YCJ%ObOc#^.'=_KM3AZ1#&TFh(S"E6XQoG?XU;oFpG/YOn%Gg9t#3?J"PZ;[ICMMSr,<?4i2Z\r%?qll;ZXncaA5n,6PpMn(PDtir^![NO.g<1oEgJqnk$I;'Q*KVdXSGildC\0arC"9+D+T^mRkF]^KJs'\;5m\qF0G5oRO&-7lb-DJ\r%31gO/Xd'Bt\Q</XUaUV-$UE`O*.%"'?1*t!/88#Y:2<%YIKEgCQ%$#EgU8ZtFNk:XQ0>)A^Fr9KjB`_?CcYY/':*L3*iToOX6"L>\r%&5SelQ?_TFd8YE3@22B-i0ksgn$D.Tl%e_JYOjX<g9r;M]ripd$"PufSQr.gbIu>VCR,[)Wg8Uj;?L'Q"tK:;<b,E=PV9Mbqj)!)\r%3pO*XG.C[D0P<uAH`d*CqAFCc=8LTnD>WGG?<?jYa^d?\'R3pOPn>"hkICSpQP*bY65"9X=\Jub_A<db]'*5Lg7Zojf,e$-Yk2=&\r%e4Kt>H=)QNd*9@Li^Gf\Y&.BEfB^R#4IPgGBC&$jX=77tE1'0.A1O`@BL8iF\)lU:TPRBGQ0:hE+M(Qtj%^Pp9>E<7]aj`6k?;X`\r%76R%="(cPCgsEHGMlj[qm(eh,DD2AEWN9k:Q4_>,Z3\t):.AjR!c7#cRXbRX:1EYf[Rt)6Y1Eko<Bg[AB+Po,c!b2]h!f0MBl2I&\r%eFbb'rTbe<Z+4RQ3r,l_9Bm4\iGf=K<G]f8%([coYpgDK1*gY?.9>'Mg0FsLjgGY(%AnQ?P%ga7]B*Sf-Ws[9?DAcOXtKWd_X!k)\r%b8#*0]IZ4UAl+'3(7@TZ#0O?*$fdoY/h[V!JV<$,D'?]%Qp']A"*SrmH>q-%de?pdXn4F5o!7noD/Hn-[9cr/i/(u'kdbDrCL3;J\r%>Vi>:I&e&%#>`7k>`c$G2(o@(6Xaa-UhqZ!NLZF/g&\gu/3UKi;<`FmCb,Ge>$dMDY-hiMW7L(q#!A%3#!J$(;(a6CRR76j.lsf$\r%D$:^+E(8*r!dbKQ`!Y)(EAcKD%r@Y:H>(QtdW\mdXn3:jEjPD%D/Hmr[9cpXi2Hi=QpZ$0HX:d"N*sr*K(EhNpW5)pCC<"AXla5H\r%I7R5@Rb"pH@nNQK!EaELo\c0,V=1hS>NoeIj_!aigY-i:C;$e<_%VZEcuZ3a;DgDV#d/5^#'CE]_Ne]CN&;^c^l<$X[ZDV5R(0_3\r%%9+"Jo\c06V=1a&?KoN!ZF'7FD/HmB[9cqds7nDiF=IT.\h#EX\>*QRV_LgP/5)/'F]hlJCuQ^5$f3jf2FFYMY\%V6_3M"cH``];\r%qAFBX>5Hp\[b\MuYH*$><&,FK.S>pF2+pRQY5)%9_HL1lfaS'"Q^j;6W**;c]N!M)Y,tZVDnU>0/ka@nk&^lWY;PoD5D(R]90_1^\r%G$(p>]"/,B-,U<uW_S_?V54FKHn#-GD!.sh=($$Y3`"<X/biA1'U@t;\g6NnH:B,N183td0nLjJ9&F@-][BTKbL4g7[^@,VbFPg(\r%^ludlNQ3SQ>"0q';o(IQ/Jhu)_=^e;5g@`/Q`;gE?/*6qO1AUeTU88?.-FOn4!!a2VZbD<"OZ5F]:7N?-,$JJ^fG&]l,)mQpXH+\\r%56l=l7"iIiGW>dddN0*qLR/o*k6+9Vq-;_V)2Q^_-ra(p41:+i;KeG4f+,kX3-n*Q7QD$-49;ob0;1)f-F'D0$\sZS6Qf.J(IFX'\r%@a`h9ZJ[S5g&_)-XmXh]\MGosP^MC";,M;kV<e>AZOmOq((?-0#t]_($J69&p_BGF5H*"!Th>O\O<tJ77=./o!<b)ZU(e1[nRAk=\r%p5b9=3`<V;8Bt[([0m8ZZk3f)B$H#t%M^%bQ:Gq'[%o-mn/a`q\BN8k5e&=L]tkE`>6q1"JAG`I,Ude/ns4>gZGU4%H:Q`k(F=V&\r%eE&L?)$e`%4?*oAfrM8L9F#R56<t`7K6T=D:8pf8b>M!<CkCkk"*cL2clOH)64I.7-t#!&/oia9Yq\aK[;=qEfsDG9m18UYlBraA\r%ALM=M`4&-/d3Y-l2E%X):gQutN7(a*k/iFEFrbM4,"X1lBh2B228Va06K73Z6.DmZM0tJ[L.Strd_[n]bR#smlr7';lUfb8eO'EV\r%o#b81-Ls_D;U*h./D_c!LZZCA<3EP7R#d@$l/`<\a->f5L_eWin1Ce?I%`^FCn)c:c'1-&f0hi7Ti<-?mSPYde3r2JqDu\8KM.:V\r%%6sq4,7!-eQkHi7bPT.LE4#VKNfab2MNE>\jWDr1^UnfAGk:1[pB@,FT&!WPci`d,5@7dr[G^u;K(es5$%.!kh>((NLNe7I&cSL>\r%rTWYJonVFs?^,HbrO2]-W6B2[q5<7;?b\gX*s_@Xk9%Fjqt7]W0<WHip<0g\cG0="HhJ$W9qbrR-^,=Dhk+8g^H&oX^RMporpf9^\r%r=/bpQAO+p[8Od)86Oj4?RHY^W6t?PkML];HUkECP=o^l7[J;u\Ws5jl2:MIpR;u8c!Gc,1KO#:k1TdISMU<?k*c8H'k[I,+2@XB\r%ilCL`^<mm$E;k=X&tmL-YMo?4s)W@0H[,MRl@#)TiUpJ\h3RU4OjH=qc>Ppb?IR9r5A.'+>;4h!VjhTh'rLp$Cu^8s2k+tWH@CQj\r%Cg=g$fuHl)1GH2CHgt*@?%79LIX?AWrbX1]Ls>pJIW7:+EXn(9Hqe55@]hn#roNeGjBluZd^OXM'Rl_Q`moH`o'u)@2eW0b;gD=u\r%8C=7/*8GPSeFbt'hh^XErk8[NZoR$Mmk9&2?XJ;o3Bd8Wc,l%(T:^!J:006-e((lNYOeg,?ICNUo*Y*(F(<tkYCA[H3Oui;ft<!h\r%o$uU6dIlU^f,r=Wk<+I]QiJlT)oqsF=(`WK^/tN87:9:%VC`OMg`eGc21b#0bt6kY0E-?Irc&O<(6Riaf!H<3m#];q=_Y669J:T2\r%Mo;tXrC(1!,c91CR+f4[M.t6b[Tm:q2nLRrc'nP'8kk(Rs#RdeqYQKNf0;EtZ"\F#$_krq4mjqFrq>@#?-%8G,`BoPprD.`?_./]\r%qugUe8#GKS^Da*N_o\g;+4!`c%duTWD.Hm1T>paG3;NMg+QXJ>T7N0_^BRH)oocd"%pa\[nF>l=Sr<S.f]\TlmpC$.47mJFJ/&5h\r%Yg_orl^RqNl2/)hKH@K!Hne!0`m'f^nY"Qbr:0.G0;%[D6T[]02m\=Ee5$l.2b2J$+)arXAh7QeMcVSoc!K#jrr(mMe_*=@e\6:u\r%F`$iCq"X+9_o_/rf;C"&?N8AuQalsA%FGJD.qJK:PM]7eZUi/YB)gbXBE-kma9DM7qY]XPGa:,KGnb./?Sal+B(EZ'*6DI^\$ZA:\r%@7l-R<J%t'53/'3c/4gW]pT]7@E(\0iAKK.AnptU?*!:hY.&K;GA0;<WOo8H*e(=LVJ]`Ms6mT4G<R&(=qZ!uIf%`\o/l';*MQsi\r%2s7[-?_6*!\59q&>.-MUjTAJRoC9[J*Sm@5DSA2b^"X\gA2Zc!;nN'W'3P0(*m<EQ%=]#h#5h'TSAa!YqDM,t9,2k^rpcJQlg'JH\r%S$TI$hJ@.7r:"pS%ppDp%P5:RH%5g-`[46g/Q_"MW>IR(lJ)0F2G\bejgOpH(FM!Il8p;urTX1@a7$2bY.r^b't8tiIhN*%LXFJ-\r%G^sX"6Z4(UCI(<lJqiuCfMQZa8C+_RT,l4:1h5s3HfT6brnE8WT(<)npA&Ugh7!(RcJUdnSUGa@;;@Ys*HrohHh/7^U:=Ru4RR5`\r%khaET(L$@"?"h3@dYdGb=SR(2h:Z+,[s@CG:[.kefq*6VrQ3U?fu;QU(MBYPAED>p?JaDAfu!F?AZ^FOC/j2no8c+BS=H0VSmC1O\r%l/]l*+r-FlV5qj1UTKh5e=QTE\+6:8Ib_G.r+QAI-1/,Qa)*J@gu3Wn1ZlD-8rt9R[/AC$%t>NQeXYC#[5WTAYd_;)J+MI)Su\:l\r%$2VlV)Re`BI@03do&9N+@[;5Z`E&SmLR[VQ):QW,0<b/]MneIL0Jd`f:noUA>MWW3i"WA%@Ho3V5Fq_bH1ME0\imTlLX)jWbB(=c\r%=7Illc'b8<ULp\@)0'eBZIoQ_o]5$(:Y.CmN4YB/^6Y6E'`L!Ck2cL<o@rkdbudYTq=7BARgEN4+rU.$3;8EU)OnKn)<#>M.@m&Z\r%])6Z2]0a9*Y3daEo-[W&QZM<c9O@KURP&>>/T)-'0_Nm8G(Z/:pRT\3/8c$&VQ?<Z"Le%"m][YKN4El?)WNE\6-RD^[6oBS9*)9!\r%+rd#^]Ie>\GjEjgHQ=8)GM!L:`n\%peh)mnM^-/5*mC*qK[=Yh&Rl6!hHJ(3_i>9ak.WWdOPP#3QudV_p?(hJ,K,POD`q1pqMl+k\r%D2$U_5E7`7Bf6TKV,Q-f"C?.3\X%YnqL*k9bQBr2mE[_B<uQJ\1T#Tra)A]//-auoV.OCb.*`6ld^H&,GpA/cJ+:W;('JbEJdT7`\r%"LWO*$\DOne:O?"'1)TbV>qA9C;E]LMP&2P(,"fb5u6goe&":#k\3=Y$[UMfo[K?j^3N<io'TnbV<[pJ6KZ"DpksMCRod;9OC.Jb\r%q<RjkcS#3CEUr][3uj1OZ;iPa3l54jq99Cq1rmAUn^6ZkmLg_U3P2r<1K\s);H:qseDK7r%njoqeMY!?`WWuQ^G'Cuqssc%YPe8d\r%q76FtMt2Y:h=p(q^NtD'iV`!/8rW^kqsj%6p8^4"VJH%f/,K#c,e;R;RO,qlM['o6+Iu/SMn5Qeb&=O:I*8"Xg@aj7'!^1@+3^2P\r%eiRY#P5I4$lZk-m>Mo$>9dAC3QR`6OkEL_YqBpaTIG%IZc]aSlhn#2B+(i0?+(!t^CfV5JE7aCOWU&rAqH^P$Id6>Y,k9,X^WY6,\r%T=Wj%m()5rCbCLV';XtTP)I#\ZLI#SpA<%>gDTq.09<!tNnXG?[rR>:RPfZ8@eg]Rb8j>B[ob0tMreEQ>V)2U,`<tC"gD,Jou0$-\r%YuiG^Hpp[Prl%L?==HJ$dpB,?Mj<jYB#""RT>aF5:!\-pXd&;#5CE5_,K'Q453]Tcf_SZ4=!.D6]_pGMj"4LETA.cd<>"u.AfT%;\r%#;<fiT?f,BY(,08ZA\>C^:u7Lh`lg*Q^\dLD?'0)j(<W.l/k?Ao4MCCZ1XhdHJtd2gXQcMFjfu^P6g,qn_MICg!pmmcT1m^r9F7V\r%GLp4"lhpV=m.Q@,ZhIg3hjds-Bl.#F9T,KVd5.mGbR=\a;)U#KVU+3&dUq>8aa]piI_*4n[T.eYddY4/;qSa?Z]"Ct4@Mclo[U;g\r%?_*teEXXqc[2^I+,#RWmn^%bOlePUMI/NO$ZllZD2rR;5R(p*X$I>Z1-\jZgF0YS\.gUj8fCcb*s&^]E6e9f%fZJ=g\r0"$Z03e]\r%[Z]Iu?*L2XF;M%"5S_;5]3'.kMsb'%>qERFEN\%@jLl/]`PjtarXKdr(Y-]Mbi*?'R<DF$ndt3-euE-780Hr^dNgCfq60h.B*=!.\r%CInG`i:&$<s#$[fXWdLY,\d3nf?N\/@i+=;Im#g,;qJZL1i*K;h]>t0UmG4tfi)7FD5CgM1$I2OZ%n1$>>ND-ZncQhQL0\uGlE\-\r%;Td4P^afln-;r!6rVak8l^sIM(jE,sP##\6d*+-jXEj+<pZ?9d94784S]9g/C%""4k/0)1IZ\59r@[`o:]92*qNA<'%pa\[nF>i\\r%0)EiGqft0oiE5?0T(-0,D8-M9q[r#dVO6ji3JZcqp$][./99+ga[+X\?Z!H/hk/0a:T<_f?<c],XQ$/LpN+!R\CleD@:/oVCRDr/\r%]`rO9C[O"2Ze+-\RO2Fa/A#Qs[ZLZA)k);]BEGVu$Ve76$(*I?72)mO'',bnfKu=BBEGX&*#;8a1JD3("FPqDFF,d`_d\a[G"`8>\r%E-$&GHZJZ>lgl".\b+FL]o]s8GU97`krJ=_F5LF)_Ml$D]`<A$rUoRRmHIn+^g7M)Aq*%[QkNmm1k'_hk@PO^X&#(3.BibYEu*66\r%I<fbeK?]f_^-2::pA:>cs82'Il?%c.3bc<$3;Y;g:760t+)\57B.O$e^%_YP484XofUS9-p3HqF^OCmY^R`;#9.H0cMcirO4HY)4\r%#'jH/U!s85;C7W@d?sk1e'5@o0$7bY-+2DG3GMc0^c.GBiKp&U@F6.!(I[/6+46TYCq1Y8N"p0.(X\20Dm'[K,Gj;Q'puT8HG2h#\r%^4'F,2_dodU-FEU/=PAebB[AfmUiYg*E(suD:%>r'%;J>r?=$L1=IF'D4S&=a@t>3Gq:`"'@2&jR5Qi0Mp/P<1=P"J3a/>VD3^PJ\r%B*Hp2WG1s5(85Hc*rR9>/OIo11qfitiST=81hRP-/i;t]h%cDkc$apBVuM0nrVjEuP8W"mOd^GeC3h+mi9*P?DX6D3)\Mh6jbY;C\r%I[a)BCEr86gj?4CEPK,1FNGB(70r+p7H#/a8EPDMHZ=*&_\[Y&])M6\o_eFGs-f^6qKVo/XI@\hm,d7AB9`JQg@m@@qE+::ILk%G\r%LL/'GgU#_cidlA<[T<(q&X0L@mIl0]&H]K+A7&"X].KCb\(TKgA`C/k=jLBhf"^=WV1H?E4dj4]%?7i90mmk/f2l'tH%sO(rSYX2\r%p!`YV!f&G=G4Y]]/53OUC&8]Ren0E(O.U;RS=H1q]Qn#Q>uLH4]6Q&QV6p.1B=J7@D>@h4"6.WI/1nWk*7gT/`r8G!i+@.$:2rJ4\r%ZMMNjpk-n!fC/_;j7UsU6e9f%=?)V#@sJ-9ARS[VL8CN[f8OBdOCNQ<e`&/l>i(:olC6eJ(5;5C5OKDclt8G8+(!tZbU@%P=-J*u\r%qA#kkA(U0)RJ0X(gH"r=ns&cF\$&7'G2<CC[Zt?LadCRnhgHDdEcZ^,rT2_&o_&YEH[ULMXgDmK<aBClCL!6DV.Htfkgkp%LP_9(\r%.9f?rCQc!Zd@r6n\@1E;ScM4I_!XGE"Es"mhbJoh2c8a]A"&2o,1:BafudMK2RK9Ygb)QRGuD6-*!<q*86G=0rb(%_'s_hApsY0,\r%,ji#X;/\%kq*XuMj#rtP3uDjhYqgg?micQ.bC:2,bM.pD=V:sUdf\:\bc,Dqk(*CN:*&gtWgOZ0`F"oBr9\dPo9kWJFJ$"o.KDMB\r%=NfUZ7#'=4;=!nIpk*J6f"U^('lTc;\"6HQG[Y;&3r$K,o$7hZ2nqSlGo[X:[[cIHagX(OEN9guAoG"f)jgB8AnpI_`ik_XkL7uG\r%hf]8U]RcPo&GO]2>J3[Z=ROUqhBi,DdF-uh\L=+A!>2,W^H&k$pgHWIo^03<%q7Q-Q>q5LGQ1_0%VRTC_uhXGK3t/B!'R9p]X[`*\r%9,%na=GpPC;u,N<a5@K.3:a+'s/=I,^Unf!.us\O"6>q9?XNc>FFbl&p'H+kp>,OEs+bfJrfR)n5CNM%jgWhXms]\0o)?8-4h\>>\r%pXf#;++EfVm<r.:rT?uF5*^WIhI#+s5E10l>^lL@jbNk75X4YH]g(o_^]0q[HOoNDp23*>Wt'0qHW`j]@/Sk-_T[ROg/fDIm"&'k\r%!D":l(G#ZpN;ta>6!:sHMI3uJUp6aZ#h_1RkmrA%!J'S\)BBD,%YE5fJ2rnOl2,F]9Z"7;5hVs<D(JV[nI%$qa$:;*mXWeQ3mdPH\r%BpoQk9:j-1T'#LalCuT-1ni,#^N[8t[0J-LS?+MX-QFe_/"DhSS)SI'0`'QGfU26:AT1ed%aHl7FC'/@>5l8&OB4PEUC;8F4(NW9\r%+_QEmIo-,J5k.+O^tW4H:=J^s^nkSPA[!5:.[NF'_LfufWInUDoLii:_XL,=f\gJ>FPsQ`"S@OYV'd>j'Jk7+b;Y:sQ:n"UNoWoK\r%:aUcZ\kh0L3s-U0`maLh/M6L[$TLWi\ZPB6[Q4.=AZ_e)9>FAAPi8r!@,j@c8kS3bQ5u_l7I.3q5-QA,#>/3f5uqQfdBjB-p7'6'\r%HusM>&_<B[gau]]40U`^7V1?1549"SqafY8!tA;nk[:H43Cf]3:uDj7!:Dmrf)"Z4e&G,DrOGb6:?GXg7U*XZYJqtZ0<ef/3V.8C\r%9WCTQ]2\4R6&7#Zp%rH&[i3qHUHJ0elO<!IN%-L8UqG<OW)7+4-JIGN!LVdXb21T10e/MKYh.b[!0t=0roP)(*jFXblP0S:Gl`9j\r%>m=E8/e.Qhgq*&TcLp"X(,36NB2#cKhbqD]bHo_Wb,\IF9'p")Y.iV[2"hi$b5@J9P8&r\92!1/2`af/5oYJ$!:6d''HqNL^mkY2\r%,;At!n5J4B&/i9*fnfaoiLF`D_lF%U^h"U,We*fN9mG-5Ug&EB]ccO4Xe9\;#+Z"+%jNN/3rfne"+a/l]S3`2aB#-6WK)T]WQT)&\r%8[(BT-j0&rWk96?,R,Y7J2H.2+a4@2028u[GjfDu;]\uZ>Mo*RJ1A(nYU7L.[2GER"$AGX9/-ToKj^e$/mo^*)n3lgQ8!X?9EUMX\r%`TbC3Eh0T2PI?3b8Um,33hssli6)JfasAK0N/erX]hRUdm%U'+]CL$iBr,BdCKdkr9aQ+N+u?e'YX:$=Sd=a\d,SUc5K58#cL]^(\r%TMI&Y$`u!tYXtEAiXB+q=$c*"<tCij?SR53mqj5<Zr0?2'S*#1k9ie*50CtQHD7+UO(G#DZeuZ#Q@Qh"_0EWfo!;1G#]_1kV>M/N\r%I1BpIB'D,0i??>YXFkcG3^M(5d5+HM&C,*J*9W)Y@R0e:6"r4i#b3HOE#gB)Z1*!!#hb=B.!'J?Bkp55@#dd2)_#PF^:+PJ8L!jC\r%lps0W>Z8bGo6'A\\K"-qY""nCGiQq6RM'r%-)CP];h4b%>TU0]Y3eCB._of?_o$O>0X)kAVpuG,#0)DVn4.)ghNPqpiI-T,A=rAR\r%\I#$2mqBb(iFNK4edX5q$oqbfn;RFYlSq4Y9\?^^*VnBJ9P/^G4Zci>EmM8TZR7B5B6""XGSN]&(iTdU[;jKBFZ`pUJ]C7XjMT=W\r%&=M,`[N1L%do.#(n>"U11k:Ar);e2,0J'A#6juE/',cF!\VMI]\5]h"$9=A>oE(0%'&"i&HE'=fQ568L"H(,P:CCPkek'_RE-JZY\r%i&cC3q!C05jZi[W#fj^Z`t\lcn+XQ.3I-+'<[;8Dno+45lP6^2rgTIe[PTX=0\Wf?\dJs,r9g,n/P5a'^AL;&<;:Q22_gSgffQio\r%pRr"EGZa%Xs!XW-JP,%Wa"di]eoLXf\T>"]T&g2Wrb'Ckji[d_[WJBp8C.Q#ZSIMiT(M=NC+f'nq)SRm9JG0M>rIfN]Ie>t\([(\\r%M8GTP@q`d&WEA-&F@]*`R:7Vk,en;UQAB=%02XX^J:qO%=c/Xb:q/X80m*k<%<Y2!&QAGpU8MkO<CkWJg_e#:#ILWc!Bm*Y,:;k&\r%Ao=(^5H7uVQY.)^\45=B#<NRh*c.4PFNf9#*Q`F!nB[[F(-Y:'O6)BUYD;HbisBXL;[SZ96Lp%Na7R'X$N;)+86V9qX@1b@9`0UD\r%=M!G$R#1&WCbK%Y,:;p(aoO(qoVd:A#fHh3)\r`[!1HWl<1k)DM&e=AL`%(GUul"I6kP\$=SCB'RP0_&'/^$eEl;L?GTe4"^n>_k\r%N;O-HpgBoD_Z'ibnVFkiI"cC#EeTel2c*o=&2?-:<WGEAe7lJT"j5kl`Aj->_D?fK4GZF*=U9CO?3krN.&CRLCl68g)7nmbR$XKj\r%;ffac5g9ht\P-E/AH`bf&.'@TD_)4\_R.pW1Xgc"K!KI>''2(A"GOc1oTP-M$]T\%1P%3_0[u(4mk6JJf7]o=2j%^mJh1cnGg^+*\r%OqM@$E_(cG]+)&eGa_1[RGY%-%`#q&kdp;+7t?nl7j%puB%5i`c$,G\9Lqm.l3$!)H<5#6'E2O01WTC:C):5(=RSF&=J5]jpu%]R\r%9f0S)L\RSV&U>IM)dXVLq8-Iif1Rb3-sC.69qF1</mP'^rlClclh^AV;Zn8cMWAD<.0>HWQ-.^VK4la(TdAX'Ed)5Bbt82YI?*LO\r%Z@%^X;VJ!A;alW`R<>d'DA?VfjQ-s:q<\`j%NSYj\n+m;8]50`r`@;k+I,$7<s]%nI`M)NW<r!K2$;Y8)B\;<Y;?T"4?gTQPQCSd\r%U%(J/2*K*bOXX'b)X/b6(8R@L`Gm\p>@d.ES6;Qk>%I5V3@67*EdYD]H+N&<Nb,;3HU'Z#j<D]8%dMfWl*bD`2/^hXSoDd2;**Xu\r%8ZUMd]@1%i\K\2L&>dfoQNmD*]lfuhZ.;]T(+sTIOWFAQ\ETi6Y2C<V^(40G$,8#%#ujC1#]Euj?/_0ndkp(e"\k4ZH$mae&=Yh.\r%p+?DDF<cZ^/;XnY";GQ2\gcY/R`P&MUqC.79TRJHftg'9(/SA&%R:fU,F7trT-8=AV,P]="k7<dSNtJFb7RG^I4W1NDX%h+K@2ND\r%.I%-IVoLaQLdW+fLKLO4(EKYu.LP:"-f@-AKj(F>,Ges:o#]rDlObHg2o#GJ#CBs!5X@u^d#HgZgMW<BR@S#2BfR1?Q\CL=^@"kE\r%(t@C.=bsZ\`,1/c5&8Q-1NB^CGau^h\3-9D0fq;FSS'Mq1.GH3\9+?h(966)Okm&3ZtIYKN@#uI\`*7C$t"9/Q371u%f**?Rj."G\r%2WZF$5:%eUb&ZKG(%tnb;gd(>)dAs7aRN;16/42!RKTO1D"OC@XUKEm;gh;(B[I+s:Blo<r'l.M,0F4MW$o'?+pLJRP;k%l*ngs!\r%n)YB3!7=MP*[DMqhIZ3_C!%hk!VN_N:8KP<<4LJLA;14]'Y,`?>T!507<&3?'`SRLIhlQc:Crsee5l5!6D)CuiM]:Wl[>qC/B'/t\r%>SVsW7E]m@YO3\=Kp7G`dFuHOH4_RcR_',:]1R>$-S:0R!E_m?'qN!@%9ASG-qQ0L<>X<c!SE;5XYQhdqd)9T:RA'IB-B>/0e2Jt\r%]fTZ]b7f)NKZ>9q)eUXX8GqmQ%7o]U4<%(p-QWOS/=;@#!AGXQqa<J4g.BX(#rX6ac4DmuCKF=`0g#VZC1`ABXPmRl'RJ$5W9_]-\r%cD6JZg-JOm$R1R(!eEEhHi7Er8KJ-<OECY*7%$ds:4!,n[a=rZfC($d7;Aha%lE&Ve5q\@Bac`t\K+t-\KG\HjlkdlJI?Hhq0I7<\r%UU>b<q?mHlZ\AcA4V-ZGf[;[S'B%%K-B<WlMaSL3D<3dOdOX)2jWP'%XtZPHHfjOO+<5XKoY$]t^<A>KM353'MOA<K-f4Lt)EB*]\r%#AllUhOu*fRiLqt7cXnZ7Agdb=)=sW>mP&Q!gMue9UdoF:>Kl6\A5+=>-]^ucS13S<iER#Sp*K:3m(F`DJ3WKL0IW17H^23hRJ.H\r%EkSbYVCt?M?<OhZ,Qk[CSM)YO3Fmp"o)QlP"h=8`KE[`*3)G>S>4*JF@8.GM&DAXPYbl#?5f3h4D[g^EaOT]aOc7Mh6Uu8JKXTmE\r%C;Oqe:>8hY.EJ`2AWJ`hgPq\sfQor=Niefj*G1ABn_h*P,'ggH5*#gIDc;GojV[?.Z.BN?34?c+CtqRi3X'(jiol6O8R$I5*SmgC\r%DBuL[M>$#?^13ki*DmoCfDmm[pYjqXr8ZTt:lG:up[>uUYCEnQci:Zc+Rc84cpN[e\&jI$$Bsq9"A\lHB1W@^S^WHm^B39u[Plg3\r%/H`*e&!Ea-+q0EI7P%R#'P+hS/ST67($Q'^dD4\8m%^j&%i3E5;?X>n)1XWOMG!E/$Hu#K5@rMDLVaeN8N\%$7ok9E8"tnrofOg#\r%Zb.4ZL0(X]P`(ahj`jd"8AmhD?on*tK@u)i?l,KZ=<<dJgJFK/=9ATfl/cRk)Al"H>VTiaiD%u>4S^2:`8Ca,Fb'[WE`1JG\hdp@\r%lI)c(D&-8N/#!%(%H2<6od+3;.WSJnX@"QM$]J@]om=s_.]$o`CNQ$D<@msMPaORL=g<nUYS`UmAHKE`<o\8^Q8on0ie`'d^rW39\r%[>U`377'_kPn&HY8>N4u4H\V@V&'ZS>4(j7m,XggM:+[Vh]Uk,>nMMh++u1-]kBRPq)bBI#ds$2!&m'H80mb-iOh%=[I3Le!VB*p\r%HXG<("f&RI)2P:&_'ihL?srY`?q6-XD8Df@g)@!pQo'X2jjo&Zj&?FF_([iP-[%>E27)<(@ZiLO/CoXK6@/e=/>C@3UT4E(S5A$+\r%@NZ,AeZ>6q<tbb6(MN%t9U_+l!r'eD\0?Pqbo""%6khQ"M^K!=cU!#c`1OLb("S5k`oHVU/2PS2>6V)Ec`(b2nnu`I&&86l;/t#B\r%1Y79"lDlQMTfT[b\pAlf9tD<bhag$Q.%P!Q<2=e`^ctr3Ceh3]@7f.iWdIPU&KRQU:#:aUjC2A>!PnM7oSLB8'#a$,7Omka:*5]%\r%lu</(:co+NYE2Y1Y&jXr$;&9NmDKNp;.(SCN"C6q-W3C!TU0YTJV>_4=sSD=H55J0%S+;<=_7/7"$\c>Lk+'H'1n'0#baMo!).0S\r%A6EUZTiElB=8IV!3/ML_UNO,;@u>UX<@kU(jg6sEcna'jIansj:`Fr<PHMu%0qe@tLMG$&Na*hjZ)onTeM,PH#7_5e1,K[5;_Vac\r%ZX1]0m-TETab%)E`.A8T++CC58bq"6Xk2Ye'jOs<c%;dg:r7X"(pr5\!4YlR_7kZ\1Hb$po)F"2%XbAi2hKpmJpXilb<h0@:D*AG\r%5dcBFNudk3m\#9A/_?Pa90iSW`am9i5MlA(S)8[?F#sLkr9>6?:@d=k^39pX-_IQumsY-5jN"U?9D&2_cdM*:o'\XrHCI]tYg;_8\r%NZR\.R7Ct?p>dBHVpBbDQ+arfS6UJdp6f7Yi8C:\lgm9?RN-9WM6/<]B(2s2bZ?tO.4eVQ!c9(5Zs6.+7,VQU\S-$BE?n[,ZU257\r%<_pA7!q4]M;:LdK9J/))8-/uB-h+_d)ZmL'1N2(n%oKP<:48K3+<XWnN"ZD;Me$[0*=+@gg$u9]kWrnkKBp7FDA=]H"@cJ964La8\r%H-D"!>gK3SkmUY>h(%hnUD+JT%[L<8r,9ZOH'kkFGRBYrJb*$g.sh:$>Ong8Fq/J,5U2q<EG[\,7I>7\3Lg2O9nm_l1T!fB\f96[\r%gn;4rFPW[`C`V?V67_@ClVLCZR%02g?K,,%5UM%8ONK0Z"&:g1!_9<b$rFXSU.io_n-rcV6"_>9Km:(#O!<h@Ffn!`.aUnS@h-)k\r%^<knk.T3*1+!;@cZX<^1^`*P,PX+#3+!A9nW2RBDSrd)D5`\P*'D$gs=!3,@>8Xa+ejuqM>hD3!=2_n)odgJj2<<Eu>Y;Vl6q2_:\r%8VJ7d@)K(Q+lfjJ]N>U_g!#LGRP:$B&[CgG's&tn:I*-=-arODL;b,TGkDDUQ.U:;Vtt'lBN68,J\TtpMf=CGA(:n>8#18Mk;M6*\r%_#$[Z5rRe/)-.Xog@K$fLA$"b"M>Z.o5Vo$mqOi_>bGTnLjS!eK-XkqS)-'LZU1\Y9>B#;Sf$7baglqQ(&*)<70)A>O%0Zj1<?Q_\r%rI>-@Q([bqS)BjrC>7PhG<]K,PH/*&WT[Ll4#oE1h!JTPOcgLt2/H)EC/M1K+^R9?RKN>a':MsD+aD"l!#W:2j74>2J=*ZO0+'[.\r%PG^KDaG'D<7(V+UN[-&J%]+\Sn1.#m5hqB;HJjKpWGLtoH2p1"o#bP7+Jka!I(4L<;Houq(Y+FlV^J(aYeU$?\,A[nP8Ko,:0FLZ\r%,HM7mT5<>DnU]<:)ppt-l4J<kK-=2m[p"fS&<i`X3FT0P\KHRrA:F24N<g.MT6=.T>&W\^Hj;3NgmRXCDV9F#abkr4U4uqJ$hPUX\r%H0+UolQTG.@S(Jf-cLG9I>>;Je/SUL#2,Sg:t_!/(2++:<mo=3Z/U]JSApK(3rF$ucq1)-kVXmUd&&u:%sQdN=k:.#q]/ug/e!.p\r%CcsT-"aIc(X*-P2BBVW[kJ8RB+sia&[R$1=n.[iLlHuG_mju"3ottPs=;p?Pp^[5QaI0,:QjP[faY&B8J$N^%_HO2bFP-KEj*4H]\r%]Y'e]XEC]+*KZ!&Kb;V/mK25t\..JiNH\7flf=Dc>3T?@?#UuJ63c"1/+TE"D04*sa,nu@`Q>u&(=\sVa7t4`#>q<s:g8gfp7\nP\r%:fKUbMSWsu"?-h?OtrCK1DDpp#BDjL[hO"c./TM_:.Eo#:'\"4A8img!B=`sC?e2_5jk2E]kCFJE7#pf":U'gQNnN/dEJ:H=`ar9\r%.6n%iL'j4)nJ'J<qA)n0$CcQl@`4&)1@CeV<M\IS+/5:je]=&@:7B$sK_12WL8B;EYRrN+E7-/\KYbTF,JJ&[UJQF&=bsoS,q.t]\r%'XO`_(YV"SVPRNnL4HfYXL&*",3rsHQDLV''Zr/:$hH&Z-XeIalC=a-Sa6M^P]LsoW&s/dmI"MW_#UWYP#JUpXS?i.B8F%JS*>d]\r%4&5Mp9HF<b\;X'2O/H5t\Ot[F9*\2,mb[!or<am8/?hO8?n-@DQ*4#F=8JO[6j?s'."u*91!7BoY^hr[N.[Z7)dGCLfG99oKR<78\r%bBN(::9/nP7+B&Uq\6OCMjmQ\17nrB5!48cW/#Fa/R+0g<moD2$p<a@*hag)S;*rcDXS)pB4k:AQPMl2GnG_4.R@/JG+(BD6G\tM\r%[IrnM&In!a:\cFHagH4C7'!'u[t12pFc$G;[=g*"B_E*be:S^C(*1-[JMSfeVcK?D&1EEa*R(lBR*&tAAI*9.1Y'UYBuY:4$Fkb`\r%dt"!rm#GJKGfDV-&qGgF*oen#/NJ\!PbB);"M/n,?7JCV(VN"KKk%k*Np6`^^(OSj.tNQW/uYBg]\3H/A.HbmRQuF'm2,u(KD61m\r%&D9:bK7`0Kd?c1mnjLQP:e>*lfOr&)no"S8HfQ;3&Bi"lbOKK.I[d,-F\9;Q\QKo"lIkH]cEl_!-VF%UnOV^A`sG*QI<(Jg+]VNj\r%nmYZi?2l@K8@1i_BVSRn/I3d.V"V?Cb1.=8Nuf3Ke:I'ein-l1nF:$(MRF(MWN*,Y`P@'?)O!sb%>Gm5*eGTmHlu'$if'D`#]#8/\r%(_FeK4E^qSQZb-%&O`a8jp7Abm^Jcg"2#$<"83*m#8)f8XF#Ua[GhfL]8?FoQr3aO`unZlrQ59,PgH=oT6NLp,^UL^=O/$_:V[4W\r%f$cb_f96o=*$&7:^j<t(06[q7?o^;sfABJVH8^3&lYKC;Bni*qd,HY_LTc@TbY@\<K_H0,nCj@6T:TX\1t@ABieU!Dqs(JSJmij7\r%ag!$#+61AKD@';K8YG)OHULhLJo352gtS86AWZ:,">smBQjaG=ek.oQ1lNI@=qP<6N)NS&H+E';02MdL#D/\*[Xu[7R)DP=@L)\V\r%!&noo:.U&#BRYEl85)"uc7(9s&k'@'i@2kC5b_?q0>XfQ(kKV.?jp(W,GZqP6?tA4BF*"`aD#f<RRjm<ak.0Qb"gZ-SgKPSf<?Ce\r%&$g)aG&RX.f9<X;`efZ$mH<E!eFqaTY.nl^I\=q;ek-3F$pdZ"++fB6,XRTNJnBFfFlXK!GZWG-7t+QPg<qHh`p4%^+64h3>^bB8\r%DhhBqSg37'JJ`oF'N7F2Y9c\XonAPLRB.i'hQiF9Z#]VRqX2`]?D8^-:@=mu`Koj#R8Cnf.Gb)"YfdYjafah2K5jL!`+9nga>RVH\r%Hbd7&#Cm[Z&-Fr!-4ikSSYSd&9)SXL9ju8H>C(rHdq?MF8]4@uYGB)!1mp0drU@MCH))'FcEsJs@&c.4:MC=f-CftrR4:#BaFn]s\r%XMJ(`"9u5P-g]'HJUlaic3^TfFp$nEbt+102&bjF*<jK;U]5=0luA)JAg1Rn`#1C6--6`Md4sF%?b)0ak^rMk*$Jn8K:kPM,7d`!\r%IcP_<4m@5:\ks(Pa]m*UH:E@a?IPK%_[B1.\&uSHh)A3@4ZPKL-XmPsc4JlsE[))tTAIA$as69ke,#Fn"r?+0\G\<l(NG,H;[Qlj\r%a@,S$0EXHt'3A3R&QBei+sN50$,X;!dZZr,b2sptoO3si&<TT%!g+K-=6LuD&;&2k[YW$/W5X=GeV_&-;oqB[&lh7b_GcPL#t/l+\r%d'>DjdjL=#3;\]^Z!MUC#^M&<W;u)u7<9XfJ2=F_$G:u+a[1QT1;WKU1F*f._88Z=q.61.LC@qP@1ULl>VV.kBY`jGE]9p@HBVJg\r%)=R`,E7SuB+_MB4Bn5g^+[ITFe^OkeA_P0O58*/8a!O$N551+4IO%\_O%k'KhTtP$4jADnoXW:r,fpVu-Ebr2aaI,I8poJ;TDM/a\r%`ugfJkXaq7j)Q5A:YEeM5!!-[n`\auU(_utm\ALPqV4Su$2NDfO,fU=5</D"KIf5@pQ9:JUN7O-OGCm=5*?dG3qlJ\pNTC",7.@q\r%D!iNn30272,d6o-\W:JlT,M\>khJ\fU&C).7ngrXpX,+bGA_b?ntRff_N=[d69\SY"9]eSeL)<r_fI"B^$@,fK6&4W$.XNA:8GoW\r%]KHn@mNWD%*f4(pYmG?07'HL/KXXIGf6po@>B/8D8Aa+DI1MB7GUj@ZO%jkG,`:DJ-+jt2m7/M94_!7*UD)K*Z#9'6KXYj;n#Hb5\r%CBonpG^IATh$5=?4aK$e*h)S![dMNLDl]WrH0@CRiN:>^d0X`&miRhap?5e373A,j<o2(G'Agm4I<<>15oYkYG^C]Nh+&g)4VG0j\r%,88oTM,sAU$#bm]$&Nn3_V6;4lTR;em?/o,acs#?8m!hp/=@-j]<Pm==>D0RR1er1PRtojKMe/G0KAEgg;(K)3lu0']jq#-6m"c!\r%VmEHQ"'/@U)@Ca)^7GKeY:1VEEV2"$!NkE)5TR`k;]_g^Kn!/I8QH#be$bJQN^gkc$Zlo<^6SQQOD]"lF@"Q'b#]#g\oXhW8KrR?\r%KZ$IflpM.l9D46sYQ-!A]k/@>5]b(UOMQ`#:.^;P20^'k3Ud"q7g;H.&..Dk"Vq*L87t^,">TU4=(&k>\?f5.-7>t)&1[k2oI9D$\r%eccQKp*iU;67l7W_`<PF25NM5DOrWJeDf,2:9+34QY-dtLa6dK&7`^!n<@X"<maUpQ8:G5?N3P!%0GlP/,E1&inBJBnKNQ*l_"VS\r%9igftn?kN5)EZS#F0/tj)-c*$&l?75!6lpX!AG\T.C8N6XTF6D]U8,[^4$UlksUR?m]2p.''O86/KM]e=N@3`HlqAF'%:p@MVnh(\r%A`F6ZZ(\:NI!fK)BY>;i.+-R._,a35k-PP6Y"#"*^F8+mJ(nmlEKp6/fIZ'_a)]p882k"@St:J;UcojS)Q#=HTc22/3oKqj#,i"Z\r%,-'EGT76LQL0LJWVit_d!l`N$6M;pH(#O-e1^PorjtM2`J;MD'!+7D.-R:?sV6;n_anAKH?DXT_;'6<D0,Vc3Zof*f"eI,(Ca\j7\r%Q0Cs&c]F$RK4%TbEXO6@0JO6!>Baq@q/tfq9!1J$YNo^jbt?2>&b#p9)9([J,6%jj00spJH=4,n;_V/-ee@eG.FB:6SCHW2P\<nj\r%H@+>YKH7/XT%bglasC8=&iC,1)H<Rt*_i&/qFlOcL>8&.OP[)T:8Be"XG,l&de>V23#'sGb_9.46j?3ii9E[o[7p-Ab-E`<UGq3K\r%@Fdn&KZ[o$`*qJDiuoA;aj[]fB]OcgEB5p*o<Eq3^0kg%2SrP614m!XMP$-3E\N#75XI3,[?G3=o>W:#`<DWM@.^oKPAi!s/P_-j\r%cb(a)lh"2(gnj_G7@H?Dk*aYJ>4H,;h*IA]1f-fl>a();ZE>$Kj<5+LH\>\IdO^ate!h7)EM[B0C`fe)Ugu"nP,;]?<T5SaR-0]6\r%NhS]#'VoN.[Mm9qROQ'gX`((Pl?V!K*_[Nr=dS2=@"qgs;NP?G.`j;Pa@h;_IVL&<*B7\2c._.?XgJ;@VlVI^j&_i]\'LMDEuna2\r%",9S.9n5Mud:fbr#\:F(#6ci+PZo"FW(bHP%#ge@%[=+kaGmlu)n=&^hNqV<Z%'eNpcXa"KnA3uGs`*X1D"I*JK5n3St&Bi!+rcp\r%g*UW]GWN1S_`PKs.$8USK/D.IVYu3;\%k#/kf>EX*%IAnR!SuME0M7Be[mJ4b-[<.=$Zo4E[6s;J:rC!-GU6Dkc$A9N^5h+#dZN@\r%ra&:NJOgQE&&b@GWXHa%]ndf-P.<>(^HcS_5)X>d'G%Zmog]P-#S'cLcrh'O/uY]6g0iMHj's*o24:hZ?*eQbF*g$^]>qLf?+1dA\r%K'%m;-Ap_mJ0;ES;NHVcRaFGTh`rYKcE>Yi6=?tCQ7X8kX,,0YiRrVmclkCp.sAcCNs&E3+P:bh@/s1P0Q9AbPg)s[pG*pn\ICnl\r%&"Qq0#+nCr/O&Y;`3*sBYe#uAA+:.2PJQ@LiiS@ZLmW@[=I'Y&!2KTbORUmnKAhg.j65@!U\(%ob==u.n3GTt+BfSId9"Z`&\'EU\r%=!h7RE561f\uAi$)WX=r\'M=Y7,;=QEq<o:GBd2=m9Xn*DS47p1I.?2]S,+l8F@0r>`@kc5Y!1KBi.TTV6r#r85L`i:Upr$[K*=e\r%U`&B3'F1V+0Sa0OgRd":6NiOaS8A[BjQN'.e9W<E'B$@i0s_YXb-)+!M=a_II4\WN@M:-l^M8/9RV_psL#:QQR89g$:[7[8">P+Y\r%(53se_9nU31PE1bcfXh8EjKMe!kkt#8j;DX<fd\5VAc`rT&1cqZ3CtbiIp\e6(kaSNKpLjg!J[XIRZWLXu$?TK$^u\ZsL(#5.nL;\r%?l;nkA'Z)I2JRW\8L@8bJ4oF?#imKK.tL/gY)stWHs7U;'g^Zb!_]b">7AMH5Z>SR`IP(fPbg+Bn&O]/,(/;O1-6Dr&ok4F9cG6U\r%;fL$>9bP$`gQ],n.5?I"@R(q]JKo(Fk&aY5i)+\CJ7/Hh"bNM7))oU_joCi;HFD6YG\YX[il.;8lf"DJ[a"&_^$AQ]phdi"cQ@]7\r%nV=I*+n#%g5,#A%K5\TJ#CN,:*a+#?%R(]%Q7`6IdYuKe\10]c:=hl046.t\U9pV\%+Z#/FP2,rZQ^'MJ?LRbMIL3dKgKqd$9LP,\r%Vh-5V"Qbs9]21%e%"j,*R4:qQ`2MQ[RuCi)*&Kcs)Nh<C5-9?:<d0LXr"[sR0^UDt!>#Pi-W!J4'kS[)h*G,[Ld:p%I"RtF+,<k,\r%L6d!gQZb-qR)Ts]_8m9oSd#B(n5AAXNB1$0e974E!%W+Y$g??"FhNOo%$&nV(2W%q\JGmrheus/D(>g5;j)6#iaN5A*SF+E&[\:`\r%Nt'pV*o1@GYnJj6fY[p]<a/)Z[\_5_fYTQF^27-,Bq.rVB^Jjj(4s-RWAN;F%b_\7j+3NO:T8*[/[t%h&<gZ$8P?Oq7lM;jCuPjD\r%[]k=pe[D0_I;-#+p9;iWD]75M)Q+6.>.[eIL#C*bVO+LfgN"GjP`'/+(XPaAknS:@C<r]\TjQ9B+%I(jcP<PXh5en?SSaa38*Yb^\r%]k^R8S#/&kVTJ$llaDUdR<3s&=@q05$O99?0Q[4/e1]<F+csj"-2]A+J?CoI+T41`&-W>[J'6iuJO)ibBOp?B'keT:LGL(;'?k+K\r%]l0*&@jjh_AXlk)KjZP**k[Po]OZNTeD*=k)6KDM"VE`:0QGkj<j["W?XP9.%n5]3QUaGuYR7OoLrpWJ6hu5q%*3c=>>a.V*m5.$\r%p0gCVCrP<phS]1U(Jgb3p)mL$XeJeA1`"cg'\c,l:*crD9u/$;AIT$&%UH4DqqHQZEJ^DQj'Q*XLQlY]n])):O/DU)TAQl!fF__X\r%k[HO2l,o>2FEEk^i>d^\WluSGTHN&$VJc^Dif)*CTd7ebW'DpEdaGrDo.l1S@UMWWC^%k\=/0UgR*JN"]h\YI$;;C#Y`tl[H&5A9\r%GU0&7,iDRboEa7HP87_eF_I-/JX0bPlh<oem_HHX2G#*f>Z:OcJt/fq$7$u#NgO2,hP8(aQ/0Ah=*UOc`<"aC1%/u`dsdJ1?Ise7\r%'i_"-Pa\"rd[1bU1.JM^;1F+\,\F$9?%HH4P),d6XlkZ96a$Q]N8MG,9Vp?L74YE''j$O*P(@N8S*aQYDK!j=Y5VHIJWI9!-d_5K\r%5QAeBS9<J*Bb+$)`0Z*7a&u;.rq:8C-Pq7n\\1$'GA0!XQ+t$m5<\o?o]5$0lFT:9SA5)Rc@2YYbj)^QqtH0'2n*YBdduGjou5SG\r%lK$]XZTiguIt.0sb:NT'dH8os`S'Y8rncVUkmp"Lgq97i(OC%L+jA766)ulfS$AnN8(^#9:m0lXK8ps?ShL%W[&TOon5iC+omMGf\r%OhJBg(H+J#YOXquW7E#AbJudMU8fFW:[,Cd[@;7)Z`^A-E]!4%r8bbBi/FQVo"T!#B"TuO3OXH>orND#?gpXMM?(gi5&&/JhDciq\r%OCsddV]5_/Q:Ou2eDFgN;nn$Vq\cI)p-!,m3YL\tDY&Od6#F!0/\N*M,0?ZfT&JsnZ`?6Gj"4Q+iR7Ao3]5:rk$#kuV'T-:?f;g8\r%9>:A!,_DiH!RFign'qoj"kd[8V9K*kOfR6*;+fUd=1DHl\I^1"XPIus".lHmkGVbCK7)k]6h%p9e-4BmL8rG07h&9.\8'<P,+?s(\r%GK/l^cXiL1)?\^=#lkV+MDLUk%,*I:eP&U-C=PIG-7Q`?^;lb5Tmb0LS\lijQC>--Y>BDS!nrNHn"r.ke8=G@F6N`f^9#)"QBA<L\r%^ajAo?&)aT=$Q5cZ"4G>m&M_S2XD48HE=@I<Z'3?9*NsOb,+gUTmec(dBS0[/H\/\RTm\0qVLF[\UdAup`AO.iHLNpR!p_>`*aWa\r%9h`pn5&f!Y-3fn8'%DB`LMVMZOpBoPp]^1R-oSU7o<NgK)M#a7Khq19'[d;?_WpX_dA%aHGZ7?;&p(5b?2nO*91LCbc8`Jhqd-=g\r%Hd.8%D?!4jJb*DNPg#HEB$Q$pf^N];/<#hk[\Hmo]=?$uMA#?GJW5^rAm:$?GN87`*8]^8B7,VJ4\L.XlL2-'K9[$is21C[a>t^[\r%EQ=>#=J8+b^47c&_r:!Fmg^aH]:0#V"_u#poj<5B.HL3e0%eB&%d/k'n[*blXabdWP<AVBGLpdU]r7aLNhkjB*8LX%4?cC*nd5To\r%%LRF#/)T6@09!lV"#iGM&OtGME/h@H@/s6i@AA\_M!eX;:D@QhdraXn4ZQ&pSDgp5s0:P:8gDc/i5g\7(`BAn_!ZB%"$"/.FY5TR\r%4TCU4;ag[>9Dfr&XYXNq!E<:Ua-LhDn;;c76W6>l+K#lt;-j`?<7#n>OAbMMmnRihpDrQ'Fk-8JJc(ogq&ZX2,%4Lf;F9"B\:/oT\r%pc`umfDFbT(3B8qhJ^.]1>UK)HbVa,r:9LPe)fJiDc%qL*l0u1dfV]1>Z(1eA]q9[Ip1*#qpcln^5-<60nWDMjW4KW0YNXeFO!_E\r%d"\nSKi<`Y0hL>g--.cmRL>B5m+]40R>[I.oO=\*"uB[2?A<<VSAKcu[SF?`oh=ZYcRQWA!7/6;7D-FB;n,jE_0b0ZXqa+ciGPi1\r%.A<uG:/c$8]G9o3":?]1"3eiqc5Pe`p*c<&">[>K*Tq_R^D`W*@)",H(KeU0o\ea1Ca`M"<sM<b]:`XMi!n_a9#jO\+i*Ht<gRJT\r%\P4&`9Y-mN,&SVmXO.)s-UWiX6-@HGYfr65FA@RFg)A(/fO6Jq"1brAdt"E-#$1M-@idgY9T46RcbfrW$u;_"i@#T:"c<IO9kYiW\r%.TA9=TV<;K'IrQLi;!B@Y=,O9>sLT2g9*:+**Y9$6Y+:CY[7Rc'csPaGL*toMMP92<<di1.V8,7,hoP*.lXY*VH\K]HDCa?&[,);\r%l([(f<TlE#2:24("28F58Hj_OFh7I%_=+RGm]\]'d_X*t#E.DP&I>gM+B[u**FQ-6/U"&2m^1W;(;&$H]+\]XTJRQrA\&T/.d5ZU\r%&Sf52m^2ih9,aEF91GT83pVc$^dOSbha0@2a:\+GgXGH'LCYL%),3o8-7'X+:PFj83EF82f,LJc^[J5q-HYF.R%>dP1c.KqTTq5Z\r%hqn`H9M`td@32%h\6Vd(Ms4r<1`&`)0g.+cV]@HS6%WF#R,shI<cLGDXSWK:mdU:3YRe***=EMp6b!A;RQdJ3@kAD[gdC6%j-?#q\r%XiX.%=N_arm/nTX@)DFhBF9uQA@+>TT>QCZK-HlcBQJL@TSF%!e6iL6o&cQqrDcfo!QW!C]up^aO\+YZ!+R5.*phI.U#:fjla%@C\r%d-`^W@t`ukTiaO,$3bblS;1?,/;qSND=*dQLQ(\^s&]C^XdGDAZF,M,Zg3;m%-]]K?JUNWD@etNCL.6Ofk%XAo-Z?+'7?u;n/SaL\r%02*)Tg\H'N0=&A;$S8U!+q#s-^`j0QJ1P*%kS'hS@eRGq_&Mhi9R@$3q>ROT[GXoZ!;aMXTYpF!5o*Rjfo*rS:6rFs*l("p%A*i!\r%=kdT4""T"!?-kJ?qOI*V"Q.C22L,;)*)0c*)ii]s!tVJYKD'+D>dG.ne?"OJ-.bEfaeNu5!NZ+5'?5?0c+Q4^,E21Y#O]3EL;eg-\r%^scTZC\N^[K3SHAYuuYaPD0`r?k%@C#G,!<prAGR0X(fbM_M@@",ek;#Qm.2%(PHrN]E1S#AAj4Gr\p^,uETt*X[1^,Tt&l!]OOc\r%XHtJAXYIhpfR(ChNT7F1HbPRUDcU@1Qo-h=LG]YmBu?:!2pT?g,#U<.\JgR8@7[AOq$aPoGK*`XY)39-7QSa5l<sms^bH!_b0te]\r%fW>0Ad6H+9#V&<R*]eDj6eci&(pX4^:`##S(`H3%h2;Bkhc_uH"INl/ZCHBn2:*N7V![%[i1U[;;HY#X3k)_opPK(2ri->^op"IO\r%KDOA3ET$QaqPk[/rOou$S6UJdp&r2[6#crt,RmmqFb$1h<lY[Y^qfU`YWsOCP6%%"]m,0+,"BeHh`A\*P6SAP\%sR+dlR>!-0Q<C\r%(r:nSLR<fK>Uq2O#&?Jl;[7#8D]O"ZCkGgIdJA:&PACq<9+2!&SO-m9PkXq!NI@`M#HZoKVGDuiT_pamI0ipQ@P))kQ(P8rjV9,@\r%J$eHUUpa^s@JS9T%j*Sc(1f'RQr4Q,S-AA(8F('=6W45jOt\O)kQW.F#:(UIb[^,I+>-&R\dO/0RlCTfc8RdXN[\AI$)(ZBkL0Ep\r%19DRmg_Z$*;Hn@,s44;Y(C!X<MeTg/]E50rf678a`R\Zj@s'Js;1l6$\*gg2G)o7G8*foJOe)$]eI<MUB+7KB=?KX;%Lg-TkNC"<\r%G9a=DUI(UR7`6K(X[BTCZ7WtPX#iDWcapH%3'-1]FQ%b*iDZh1Fhi=UY$QrGp"!Q\a>Nk%MQh>t*Y:*V(OC5?*E^K'^7_"ZWuRqP\r%265nT4&G@um/73l?f-^:Z=0^[g$G.DGj.Mr`/^(s-HOUK,#uU<0(urPo1k1]@r^-em]h-9:a6lI\bj-qWn1&mWo/X;%s[l*!Drk+\r%]^#\DI>/f_"^>r>W0'B"7Agr':9V)VEsV,W^%umG7"_8L@3Si&a)]j#Z"=$8Aa(rE27I/pqC_"*qg$NRp6!RaH!9@1:^g")a&V0#\r%4OF_Z#Z=ho.9Y1%.n_0"K7tq:h<Xqn=M^hn#/;Bh$;(peCX[MV8j/-j!:#ctc*cR9D!Y)SZtZt_BJ"'Xq#+l;r>YR/Jqp"6Vsm>;\r%.MqL\.>!pI8Gs$57Me`:fa]57.mbl<4WEG6>V&/'2gu_UQFrak)Ehot_oI]E-%A<)oYfN_G:W<:Dlf*Fp70:)\ltp9DMG&5PmuBp\r%c<+uh-A_,;K2q^2h-`tTE')\tJ/f"50B=eFlC7W:G^p:VnJ.q8&>!e*9iffZ&^Bp7mRN=Z]D'3)28$54el5kE?iWc@3`',=f`B`;\r%>p1XfP4[<Ee9;gD9osAG"KP3-<>sdKJbtbnW<77XHA]+BE1:b29ia.-NtiXUi9t3(3rIY`lCC/d5BpJG%>S,?:ndWhNf+Wo"\`-.\r%-k1V-'/r]JC>bWtQ'6rl9,.t64-O`tcT/;Jfig2Boit=%q@l]^XhGX=lVfM8YT/s/mAA15UNb1f$./3.[-so:h;snLEVaR+e7g.h\r%f]Th0JE`lh\.^!("N]]^Dd%[;Mb^fkHe4c!KQ+,ge78D$Z+K+\.C-bAd^<_J.7DI:,1$BA>b)SD!Bi+T$p(%$6\SoZ#T)af7`h']\r%MBIo_6e]m%Lu0$JY_ZA0C^]AeZC?!-<a`N@(",g]G1\H[FkoRR[psl)%'X,M3$ngFN1d":[6r)KKoDHEZ9'L//&0HUAFUgAZ-R$X\r%r-[)*D0Mcumn;O*BLU>8gNNJ*h3KO`2df!W'p>6fD9@3RLT'-<h/3E<nMPBMat^?5L$"/:c_T.sPeelGT4@8m?d7lYO#e3.hnlfR\r%!TH;B6;=I#Q)i_qbZ$p;!Sbh7[f@u.flm]\CX'<?DHk7!lA/KMXt<WQWLGKQ2IJ\3e/b+(Z$+d'Ap*3*lSmmBRPL.uQ(t@dKoX'i\r%P7(EoC?O9u)IgP.8ig"fIu4MH-mT,LBH;o(p:sno7WHrIoK\Y#^pd$kB4&/:-kph(a"\:Z:e):m+#r9=,=\I9W9P70VEkWVo"nX#\r%pQD@V2*"33M7')#V8qo:+6@07s-Q)jGr^DK.i#.)<,Q9kQ1+/EDndioT2pdIrQ2gWDpE:!ZL`S<bhmJ@TEO)LU+/]=@?4*=:h(BN\r%6imR#61br?$NO%BNCd9C6:V8O#m%Ro`7kP*+r@I2bMYRLPbNKn@&aA.#m%S1=<\TVZ3KudIGgKdjo2Sh0P7=?/_2`-?P^"8e]Tcs\r%YmK@di'R+S10.,<JmgWrfi1#/)FHVFIN*)^8$q0iLZ#bl0*d5&!J,+H=T0nm38LASd!DeMfl*f>bTi@1*O[#Rl5@^1!3lVS$K\NZ\r%GLmV3oFZ@Z_hHjVr;b0!;!We'-j??VVWGiRiA<RlQ$[Q$q%;.A6DB-ZM(hj1=[-ro#V'eu_AA^b&HnBSZ-j:"eH?JA(+2ZVRpER`\r%'<IIR;V'?0b2:WiM2B<K*f"X&-pTfs82s240O<Fhh?!f^<=QdMk2k6W\[7t6bDp1Q4XGfa+^#`Z$AAR5!s_(DgQ#jPl!'Gm6g$j[\r%TH2R\/,LlH>i?edW[A6ef$el]TtW2tVN1H1MO=U9Ah#&J-nPXIC(g^8$Ob5..^[f`o/pVu885@LXf5LpY]0!na2oZBaC#_%m0&1j\r%@jYiqHBjNAhls`;"J8igbC^di<PQ\+m@Jr3N5`Pj1W9"U<q3BnEH^m4[&WZfdZecpCm6:gN0Hm:Po^:OR*Ni11-hlge5"Y[-]drT\r%kZJ^N\c&e'LdfY"XoiTNJD>mr01..K(Zh@kEYfm@L>fapHeEnN$f>ltXee3q*$#"c&GhX%E%u\2a9u6OZ`\o[=BF4!;"pb-b%4Ap\r%U75,9ooib9d8MMa#tCB#&al@I,lU29%IRG6SW?%u#[]jE%4]:;>+2P.)6t@gP/[V`6&L^>9PMKf4G]gpFed?%/$9/8C.:kXcRTPA\r%/]%8:JO'_0W@Q\A)%9+t8ceWH,LW[beZdU(O]'$d+7"OU*pVmHUD5,>d=!s[$LHBK]"=lJCb+#l#])dT+,H[5QFe9gBDKYa.D8DH\r%IXu;==e?<V.mQ.OK)_6.F_q-q;rYE0@hffILF6h*]`j\QBesT<`@TcJ*DDoF==h[i0/+JjAC[9Z8uhdj2-*s'e>VLJKn;?'H8E*e\r%@R]8fM2$fsB`Y6&!XT6Ud_\8Yj>iGlCO1LBhna.SYhr=g26sc`JTU%9K?<2ZXXT3o8fWYJjjApc8NbUD:cAS@fRT0Ye4cP!Un^LA\r%GZk,/MN'm">-6kR2fRG[+(QqPF-,m#\6O1mjqks(d)scP5eRpU_I_/HbKO/#GEAU\"C^516,#aiZ*G[(mYGFCrM)0?NhDo#F3M:k\r%QS/BMH@#iV1s>YjnMG92^\>rAPT_$SeH_'".L<C@Q*hIEL#\:lq1:5OZ0T1dY^P%?5-A!<'l2f]Bj\-8/5?R-Snp>%=GKMZjUF#H\r%W17At3_T`LO3W"$bMn.<AaVA)4PUd/^JD*q8ok_I`PmH;:3GbZ$--Uuir(K#-%sK4Md?kr1s*$VM:+R]J<%oR3Y67H;&6/#EpOTO\r%1U6kYaFs(Fe@nXf-S/65`a%>NFUGhb1NQ6s`0)Xu!!E7SD!F1AaFo6GN^Jj>/kP.YH#s)8`^1_aeGOH+bA$blim;Cl%E!DJ2Ug5k\r%^SI.VT;$N,8ZK?;So,?[\c.ZUbHiWZVk90DF+Aqr>Z;arfR5B?b=a!T[T\L;nIc'O@)/+(ar-GQE'G1gJg/jl1R@gQGgPMg&&o6R\r%LJ]W$JOt[fT9eqo\RHo9[//KP_4bWQZn!>,>7Vac5_BO:HJNg][ck6I`*<,bprOg<&4O>&%=1-';ef,W`I8o9n%n>$`cY+:IT0T-\r%Ep<^.U_ML&en.%Q?<PAJHFin_&h$9_l+d9*Z-*^);++/1\.&<!mQK"5gjBL[Q7kF]:K?k3q'/(&rIEK)8dEPVKW0Dt*S;!-hT,,V\r%6Kdi-W5dgIAdgIqE0*9gOjs7L3ZsJQ/:Ia=EM,!_U^j@E7L05j/Q>;j-Rr4GeXCX0D]Pu`lKJ]bT!c>l"r\Zn*Opg=57h`=0"*K4\r%P3VUB+]kokS&=^O'u!<A7u^Q^#g9,<nb#2p'Zrd\B"YO<r3uXnHb]ONp$LY^:9STmQPnf5?C_YG5(X^&mM0%ZO[XA<]8s](iu`Mo\r%J,aJ9F%Ll@]3+Ldqs/1H^A7>\q3s.5YA\p)3;]RI@o.Sh:lUE\BK#8:e-K!=5+7K#&l6B1nC2]40DW1n'fmaJ,>6^VOWcu+56.B(\r%49uO@jTH!V6##=6Uf.AsFM2VjS(tH:D;W9C^mS464Z2.OC'X0==SqI:19C7aAIiD+SjO\l;Pfod>7jD.QKg99,)EDs]E=L$r^XFu\r%IUR8b*N,T$IX`Y12Ru.8_:8k1Zkt5O$ZmK8K*9HF)A"Tu!@t6gY0f_GSK(P&+`/#V4BZiP._Fh"m4_d^e6+V9h;P,Q!uRFmBD;6T\r%@K3DHG8PfW9eFBJV6O16-pGbLOq&G8+2!0:M7-`%4l(^NqY267[bGXCRbmFf2[t(dYR[I<c#F@2>UCFMIt$br$l3R0!WN%r,#];4\r%Af]`E*Ho5<qZYbN[._YCOej,ll^mL1bu@GiC!2_fW1qAlOuNrreX%L?YrR=['c/8BX%>sENT1HroW;M@2n&C>nt$9'2PA:Po\Bd*\r%!d\r$HqqA,]U)a:=(b?\,$30.qmP=$>Hb)S0Se(jG;kuAW*;O*5X3CJgH%]/]*6J+%HgVm-ZC7u+k/!nMQmLjTd.oJC6#YZQ?>lo\r%]%\Uu$>%FkQmbmmc>h8h&L0"%fjHr?l+7P_Q&V`5C0u*TFaSasDNUjN2f3?q3aGngkFN!YKrst5.`B*C9^><Me/9@O5)2<_<jSIm\r%kAgXd+>I&*9D+IhOTqmU7DA=5:j*K=5snj1?7DGb?9;Q_oM5pd2$CGc]qJM(2.a'P[2B6Hc9cQdFD^?TqHd7si,d5]'bLPb1FTd:\r%s&,aE!tF@O8/u]&eSCOh"1kLe1[s<CT;`IbA>#%L"r'L<0QCo4&40.GNLb5X)IBe,%##slb_t(:NM.8B_sd^Ah)S9=D_#Vgqj]5:\r%F-"+(\;'&/;Xt4AdjWZLlESj[Af<)fk1HsAmWOp1W2JPa;CEt/\F?la6<47,:pX>VE[#(im%eKqU*sNT%7h/2-X*4W&stb?L#jKR\r%Wg`tj7AV>pmFq8lXh@JRi3N_[\V&99l/5oZVFJ`oG'k-g>esQ@GSZ$d<C..0.0=<M:_a0i";N,Fa</92MBm%(64i'RjsFpc-iqem\r%f+,k8TFMkWa?A8e>H^>_')NP#;!_RFgTGC!<pOj="$W>Z(sF2C`.EFU-d![i6c?f,L+k8/U3$tS=Bgk;68mn]ZB%J'9ZTK3;>.qb\r%6Nmqb4.m]*2!,<cD=s[mHEFtDK@>#h(f6LRlT58f*:p*$'<&^qGPu'a[f's;dks5Vfe3JE>>3$3k@'r9%[>LZkCOoK)Vg$,_^IAB\r%n2)Cb-2O'H#NYUf/ks>6$,9L,k>^(o/b^*a%-4[EZBHT=kF=j-<7k[e>W7J`<tO+ViN5f?Bku`0>:0fZSiL"PP!h!#&r/OPPX&P#\r%SiW#^_g,mXY@]Ko"J/<+p)n$Xn]FiY59J5o7OKa]"icW=Q=AW#0T25c!4l\\"*KL&n?bIo$5I0hAl:=6Fd0Br)_!<K\K+)KCQIEG\r%cH%J2I]=kf*V&46aadDQK+gcf(p0VOcli>h?sss*UhGE2^D9F[_,h1pKun!0B;NFp!&4GKZ3=nGid,S?JA(+d`MJ/JX7M0YA,IcD\r%\0.j0.bJ]Z(!WGn\12#]HO-Hp:ubT*E!eoSjpVV]Xe=-=T&N!M=No?EM:QR'TnLMd7(?snN6tAETrW<hZ/!@C3ZD%8pDo,E2Zqpb\r%*r,(^374YU\3XEP(s<f,R;T!uRp2eP]D)0XVkF3Ui't?]%Z+^$%4(:rF.Vrk"0XC^I%N18OL,1W>0Z2OW:33PRnSRb,OX/1o\'DO\r%@\1u(qa(>;-nqL>O!g,mgaOI32Q+I![.M9kH\s,c%)YC)g"F:6!m5Gank>0&-BWA@OpI(0LAKYhQiSo#[fXXHGtQT)Pp')@"EZ76\r%_+%U=P^ndc#Y^CR$ZQU>"e,U!jTSL%V.BlZ8+8LN"-K/uj5hm$`rDe&"Wl^>Bf\di$J!rp-lZXK:..8W!h1l#+#8\;L>YLPRgT:c\r%abI@qX;.@4\]"cX:FNLS#g`le>uCf,a5kg!YJDiWUYE,/R$Cg++:SS^jEpB:fe3Tj_1Q^`d""SJ<':bBJ[!^-=Slem!f>hhV#3<%\r%^oU[-&kI#2PPJH'[,HPXK7^*9E*'Fs2Zf!s4UWaf=9g+?f1&2K<;jYnMNU6TePsRX!/uKh<70)3ZjdUF7rjJ6H-&7+^S"IM$a:Re\r%5p_u;1,roNJRM_Mo^k]@J)UL0=Y>KW\:1&bAI+)\&8,ABP=EfQ\4i.k`0u?)BPjfF7q)s]6[4-_3r4dZ8u:Ta9h0oJH+j!K'm:#g\r%#(_QXOq&(er$?OJ[HrMN5aBu_&NR`R[T6TI==4Gcmg3cdBIi5FgfZdm8)kd(7U!=]i(X9o:*]RW#'B>q68Y*c>7X#;j?3]N!&0mp\r%L^>4/n,^%W,nRH!VjgG\L_tsgXUHqQ"Vkb$9bc0X1b%c;<9MG?^,E]1,sq1V"`RTG5JcojiTMgTaUAeGB`@0'>d+N<%:PqA0FC3W\r%ofE8c#B;r;.QPFS1ZqEVfb$#8UkE0VT8eHj4-t!>_$1%03(>%]^sP@K#1B/2<I.u2qe&8].uDh+B*UCXj<+L@0I;V)H4lu=16FFB\r%<9ZZB$9tge5nmmU"Zs*#QUlYTeM.XV,"\a;Gp@A6;Rcq@Q6rl>QQ$L`.1MhU1c[sT:H`c)MNWDUUV!0cf.")`<*)*#*gIEU+]aUO\r%RWD:I&cDs9Lb>)@[<hA@/RV<PrK%_JU)">3^=D/\kd[3B\9s-K,:3d0$r#Xr3dn:<bt7%<jQ8;p^TAKm@n!V4Oh[gZ`r'1u3Xp@k\r%&Bb&$?pJ-)N0)X6@65/nYl*fNUq_fgh>=lt=(![OY7fqo"\,G`Og9!0?DG4W:(PL>eZWfi()LIX@Q"q+!,N2`BT"!6\qa*@^$a?l\r%"/?tC$(W6X(lhq?m9K7^XZKf"QWM*jc'pKa#%c+Kd=FmbEs8gqNi(_VaKni*`NgpQd^=EC%`ek$7_C&L+rVFL8-X+KK9)BZcZrr9\r%P%`m_MCd%4)^W!(h[QI=7`h`8JTYAfMY9W3IiN%'KEq[``H;2kK+Q[_@gd4lKcP\&@@`AblsNOZ&"F@1PmmSY'LC_P?1&X=J$rCT\r%#L*M=VbF5s[Cm28#^-G!5,8?%P/O<Xm3?$4RbOQcLMgb@.HKbi.$'TVE088"OW^)pS4HRFRFXXj#:HOQaU((uiGkNS`LLA0.L4.'\r%3?A:n;ugPnO<7/L?ir\S76CUYoc>[$QG*cL<fXVq_;(a](tfTYAcIKM>YF:X&-:]'$7fptL1ES=>ZpmT"Uq1[N=)^n/kpFRZp%mD\r%g&kub!#7$HN/G+L4M]/;#Fn`\h7=+_LSkGMl*B!1dc/Q@/m/_f).Ujtasqg'YB/<X(__FbL:^ef!CG&4HQH%b4M.\hI8s$tLok23\r%M3t,B7&tjCXVd*#]Z33>8Wp!Udn!0J539MtGAc?(fN<bl]Z'4Z!9Tp`O4fX$L5'`C5aYW;)iAYQjD2%OQ<0M74Yle7)<OuH1;i)e\r%^1WtMQ]ML^_b?68O:>\0;KGZb<h^"jUe]tR4p>W+$8q1'F:/(<:C[F17%]#nrs;.\!!i^6k(l`0aor-2.au\5=2/,rnj"pC#$SM9\r%O615Bf>P@,O&Qd5$l49ljM/PVJ3BPJBcA2J5L`Us)kMln=\M7d?lq]R1f</9([PU.=>/tg$9=C^%>e*#YCUedX\C'/Y5LDU5nL\L\r%'?&=-li^imJAaShQqPfqT\qPCm"..2i@RCg%]XbMBO(E`E7L@,1n*uZ'!Gom)guRfTgB1LAu<mC3qo8.9>Nnt7DG0_$5D@q$s3`j\r%eeH\Q]C\1P%L:lfo]/J\a[cO`1_Lb/:Fcqs*COBt?PX-%/Kg,686Q@WYkAYRN$9QIB,HC`#-&Q`b_@:+9+]n`+WU2&.H;5?,Crc5\r%$ru/22Ur8ROuH#:`usm\_s1Bn,A&-TBdQT0!+J$Ffn#ZX,\q\([SN_J\<H\NbEWrq3$T'YSttk(1rZC13Ksh11eEFPNZ'lX@Z7?9\r%&sUr(Cp[P0J4K2lfn82_1*3;<EKI=,qua<\l<0d-!jnm6V2#=5Mg22e^BO;"L3.J?%0bB$E:O"L%SD-Tr*25_p3s@[qZ0eIAB6l2\r%:<"Z+25r8OWui:=<`]hNXaqZ4Yh,Q%Ja$l*/pUM8JU,-7&cj"X\JUFe3gC)amR'h136BkU9#ecZdm]*gdT$:eFRetuSbnF9RfF=0\r%@74Cg;,%grB2S(^d"%^WM#LP]:Q;6='Pl+W0?+#]il0Q$%7`Ds9Vt002ctlP^IpQf^PbTR(4R?=jalX+d!+&lGZYQ!(l\8Jf[3O,\r%K\.V.=\<cls"<8g1qg%l>=I0"lAG%Xo9"D?3(^'B!&999Vt^B&7b\Wm9sn4Lk8\0<Pb0337<^?QJH5Qb`_^cR08bjYHue&MCJ#q5\r%7V$!P5Hh]^lWCBKJo"hd=cCC^IJD0oPA%rUfrt1QraSnRXuJ[2E@rAk*a4b#=1q$"&6]\6MB>/ps&6oJ@>C?4LI)iH/b)3?*'^f`\r%%X#NN13CUM>j0Pt'\?PULR-;\-Oq0FlU-I"m*HpSlCgTA!MMl,?0KY>#>YsnUq#iir$#&s>"4qo5%ONbS]_=a$m3p`_M<LDX5QFr\r%&b[ZkLQ#2p*5[JY#A`9cH<p<-R<H0Ir[/!o141_F9:b=r`=Kq1nO%;5r/b"GieJpsD\>9&^m4[<o!0.nLT&g=r(pW?587HZI`S`0\r%\GROLV-p@e#pA5c\e77bC&0(U7+7g%3rI_>+S':MM#=gaU:<hs6ucK4OXtY]+R41/8HO]-Q-R,A+u;)_#(!f[,%JX$(_i4d"VBeg\r%!CV3=!0NE1Bj2TCPdQS\qF)_LF>qWH"qXZ1iZ/=JU-]W60Ru^Uf`=JuUi/^&;3X.,,CkSKRLK9cBjC]NQbe.9!$X>K5%t!o86cRH\r%HNT'JL")4abC'CZ^4t[8Fl.3>;7o,D.*W_)^&XndbBj>I2U$CP+PMDI,)KfZ>6..WEs%4p8=:>\jH]e?-%KY8+M%Xibmtp@n0EP*\r%F&5XS5bp/*$;CSXe7SssiAHu*&F%LM+B%M,Lt)8$,0J.l-\*VK%j7$7Z.g?c'Pd\Gig:XcGO#6UdHQ4??JM"j68X'B5t#F(&.rk'\r%(dnK@A(K9F7AM5e."q8#@N\O:+%S6a*(,SB*_-i+JTpJo8T[`ROeb^"i^b7HV*t2O,0at[8>>UaO[O2+,`tsi,)P<j80Y$`4Gb?+\r%lQV26"!WTolq!lM&7.D\aCL,Q8p:O4@(?@JkXg1J&UqW+3Hk]@JI7kJM+f!^"MI/FObts8D1P*+",Y7ui$YV1UXfV^D4!&u&Ok!I\r%^;LVs<#cLL5,OH1klHo7IU+4]?Pc;pejg@lFcf)c!KfeL`?L.`TK.QkB%mBD1rU%eM'I$k&O#4P$kYW`%rjup/naiUNZot9bu$lf\r%C+tODS/4U+XncqlQn=3:EYOX?pE<!<;5HpA,)UAr,._Emdhj9*0eP1K:DlMfWeVCI+k#[cLn]:33JL).M]qX%L`sn\"11cW7)T#=\r%ILM@Ad54lRp2#a4K&^,1o`J][2NE30%+34qZXSaYReIF^oYN=N@=8P]=;O?#kJn.52).Lj_hB-P6PNieL<+j^$rIQFGS`_(*5G4f\r%&=HdB+N4n30TVR1R`(0?h'#0t&KI%1o]jI06<"`F+[eWJ&0dB"KZMCW[71^ANZ_O")9*3G&Zp]sh*4mG+,YD<ps?I(&$^3$L@Clr\r%[X*i#+XVd[_M@L1C'c!Y7>)3MmH^t-7h%UW[9%"_d#[h9Q$:;I6NcZ>Q3*m_SRYD5*S(M$\nkj]Us&3e^9qmJeo]UHGlhH=&TFU&\r%YC3=jXr1Ss+u\pq]=-Oq>,SD_!(XdF6iZaRa8bqp<s:\cqXj^JZsZDqc#<<i_"(D2:hKN5L]#4=5d_*%TQ/'lBS?b=/,5LJ7b=Vm\r%=sHoob=3l/\WR5iftShrfHi_iZkqDWEKLu_$Bp/Dn"H+EK$'ROPLs8#N2(S[(n<l93,BUnO,pI3DBo7691^<p;IR9[9l"m^8*bBX\r%Qms@j'h5g@4V2g)Y"$>&B[HZ"'*KAp>Z2922Fhn!$c@]W'sd$L_u@"]/B"hV#(u4K3!C@]qkXd]W3N9N:!FsS9MRIVA9GUVl^)Vh\r%'U9/:Nckp]#&p+%?Z:K]YU@3#h5[OLp"@I3l1Y:'qntd3c\:3W4>]aV#\pZ4pjrZgaA8l^'a6u*lRq:1K$2J+C1Z!;V:tGbDpUj%\r%O4)HL;cEkhK&9qGki0mj>0r'=TQd1;""H^)i!f:I,[AcL%RIFP=;<AVr>$C2XQ/lE(mrC[9LUlt8J9MR=g7s_=m-0_gA1lE<d!L!\r%HE$TG@*PXdZfqO"M/(Ij\VFQt62l!)mU"hb^P>9Rrq*7054QC,#=,YfI1$BP]`*<?&"djYfYtEXVE]IZ.:X1[cC+\$=XT27X?14o\r%_e5M5*P2bD"0qb/Sff*AYJ+_+qoD,.73)/A6q<,$5#h/pPep)'Z,aLm+B9pd1t"aK^>le8Y,*+C+W8;C+'-FlpCA>WEQbZe!=\[g\r%=4^N#7DMPIOo37@i\:OZMU\SU*'D/O/`r,@r&t0^X[\t7qnA-jb*6AdJ.#6ehjJL&;U(u9`*!M$L3fdr'g#8"%+81<Z6;`b2>Tr@\r%@OC4?]M7&.@b<jSV]kaQ>_29M8*j?<Zup0lrlnDO\4ePPCplpp"pd[l;#Z>qeoG;@XDTp-ee?-U!sRdh4_php3EY9HP_//q^gtKj\r%03FBc+5PHl@Lq6q8$^_2)0A0=h&dA[EQP;9,B6N0IOmI@30$Er*eRd?'_<5XOH,^u13A`lKVGlm,8>OF_MYa!.N3(_;n6_jRfaRK\r%<aStOF$aY8R<!F!.ZmG0SrDeei$O9J)uSnJX^Oi#0W-/%F:N$0iMQ$^Fj6W8220hB>QYu$EQB.$S-?32D_4Y&HGnr;jQJ;k"(UHd\r%;6Q]7a_Hs&nGB/V@kW)r]a4:W-;N+mNr(_*bcB#kb$HID8CO'epk846O@IS(C1UcR9ASVDK4R1Lnk+i!XB2UEdJDU<Ikb8K0"+28\r%2gM:OAO:l2P7dJ\g,;d\f7G'E&B5-0S)D-eV;$3U'>6Q>g"YE]_p-<L'6[?lQQLaI/JI:;>"*`i=&df\Pk0pmo`ti[)"J?\baP4Q\r%+?jH"Wl1_H#9R0JP8)Rp71X&S=`gp3i21Fj7,?[CWS)/R)'7erXdRIW=OWe)#*@6*i7^LO($$#V-kuk/:c/EK6)uqZo>$0SL_T:K\r%c\-1&%.'L__@VaLkmUfH,+qDR<LGaA=*-I"8uTS!?H9Yd!RX`A*X$s8>g\g`g*JV,-mC?9>d>l,l'=9U#MuWcV8>9I7OH1f/K5aj\r%5f"8%2E\<h)$j!Yh3NhTjX;m!CIR)Z2<YckMn1fY4[dH0WXu=AhCj1sDO&Z-"hR8c,W+V+`s2(jo"!;D8?gQtKn]2q<9SZ4:O+OC\r%[quHpH'1Zh5@95YiIZ[[i]IuceC1N"8f#Znhe^4:nAu^fW7Q<@*lGN/:XV$a1kCbt,Sl1g572M*U5;HmGAsp_'em<g^Q;rS\GR0d\r%f$L:C<tuU@jO(=C^9sNWe,CbMWui#1>i]>&\IE=V#FV!2TuUQZ*)TR,3$P_c?h/Ild/W*9d6gHbfo],o"UYPrB%`@M]HGGEPNg0h\r%$(r,RNm&_oO%L,g_Ji#>Ia9F"A[#+TAHP/i.&gk\!Q_=*10L&T3KBL>.@bRYRt;*\?#jKR4_=`+?idsh0XAQ4m'b[`8Wqq+!]9Y/\r%QJBg=J[C3KO[[1j(R*nPRs]UE$6BJ`aUtSem`,=qGi67J'hF8s,[#"_-nN?oIMp!JYVeDe:.)*X_;N_)mM^KJ.U.esr]`'nU$EP-\r%%*r;p$L9p1c),UN7JK53f&>kg7m3A(.N$1"'Z%lKGi(%+f<Qm+0a_[ao_S.!lVCUNpHF%Uo&JE[jn8MWNXN@(=oZ%GIkE8Eg)SG-\r%Zt,f#MVlOJc1(Lr%*qPX#;\JGIl>?Ba`[t3!>4"HBV7aTUi8(AXJBej=N=>1Jab<<GstsMWV9?TGb1g)i3^Ae`9c)24&N3CFt39n\r%fUXGW_e*f,57=s\*lRHuEOq3>G4Krs-a.$(N*86)#P'tHdJT#qam[/<o/lZ&pmlQoNHts*7_^?uA*:0W&:FEf(+23JMdt>D39o1!\r%*72k?Z]Q?Pid_sh1)k*HLSGfDo8#[CB+FbB)4ZJg)s=+`S,p\#\$Pg)^hs8\PN/SJ#<jUS)TpET1A=<BVIN]A$Bklt!WYlukA60d\r%1\;XN;G6Sa']<[SBWc+R*dQIuSQ2&9fE!Nd2hK^R;'26U+s;Rj!7"K(*/jHBn-`F4@B#?\nsI7\e:YQr^9+'JZ5pBMhn,ZJB$Ok+\r%[)N>fZ3+\Hh!J*-P/QPIN"1BuM[khT9Ic4K0Dh,40*X<k@-3[geP96g-u2GY.4'!Bb;uo#%dAA"p&V[o!6bpB';90=kB=YO\E0c5\r%fpW8DIBJ@&:nK<^c$S;r\!$FkPKKQ-3<V6b/'"#Ui"ImreH<_)F55inAbp^\6tZlA(!:W)D!;&[E*REeE&gohI1nGGnib<hJs&E?\r%C&%F?NNJte'E)N;F'Y56+'JYRO-'<*'r`@852,j[)qEB<X@_F3:ES21M"K^>1N_32rsL:Ti'JrCdceunQ_3J$!/#ZW@,j=&"*G"R\r%9FYZE#F#<[UCt8Ja@$NaS^SHj$#8D^XKl@D]]@u99c<]#r+Lpkjs3h%j&*Rt&('E[XNlD#?P*T2p`LJ_1AGhWUCnK^C_[:bnAqNl\r%"sL6&R!o&@atG"mJG@;'`(2Gu,[IVF$.pQ.(+1%XMKCHN3ruMGc>*,?K74j?<7VMm%1E/>nDB_TJ)GV33%>!"i@]I"bQ2KWmA&QO\r%VKhuY[M#a?,T`49V^ukN)Q7EW_&jA^#V<`kOg"!*=FcM(a@I@H/\,T3>p1OLULPo9lr7kJ`dL1("J]qm4)"h#WFRgT:E?N,g]U06\r%_CbK/]qt3hBWs0e4GgKHOt]`Q>b>O>>[^lFk8j29lLu#SD.I20lh`fe!?%2mXFMJL0Bc+rE/mE^W"mV)\q@;b&;q'5H,5m:+]H!"\r%6-Ldti*8E$)\9JUaGE#EJjII%QQY`)A2IN^Bi#KIROpua;K8*pNd3U*9TN?R&uX(!6e7:p*QQdQ5pHTHABbk2q@*Q'!'-W,SKk`6\r%m\:F7HY+"T'2qR:;?A0cIG5BIG!L-hJ8VnW"a`th1'fe.P07jr#u6Uu._Z7[S-SYGT8NV$-;Lb.3+ECCOGetE(1Nl-I85;Y3F?2t\r%;7r%6\N.i@D_3Ic$<XRN%(*IE\PWp;CrB$s7NlAQ[.T(k/$*ASN-N=['SW'NeX5.d-j^I5\<&!OEn1tTB(gVt(lUqjJV7d,l(J;e\r%Rnu:;ZkE^SW&i="hGR#p9r!o:1`!pcY9i+ofng.^bD"Ee_Z$VaTAAs[l>'Wi]7!S]4!:f)1'@/PbA-\Vlb^F?XC;Q\I3bWPJ,n]%\r%4G5arjt:1>p5*Ji+i4TpJRH?MK;?>t[,t;+c;>IcSNtIC5_\;_4a,>mRA3+*[&=$r*F^derY=`Rc0CgC]S=Eu,$&kP"Yb5&&^[d8\r%<Ds)q!jZ\^hk)0ABF\=8b>NRkbu"oOI!Oj_"aocu;rnF<5qYM)*JNK)Wj$.e2f9]Oi2SnWaK,Pj/M4KrmfE*IYV#@p6[aB5g_cIM\r%AqCPf0=V9Ef2taiqAD8BGmm8ei?1G;'SnYn`+XpI7^M#0.4')K%Ji)'f]r9_1,HHj>$8QaJYF0HDj<^406qR*\09G]%IjY._LMb(\r%-jM1HfMmsJBI19;#j@ca?GHc0Z,#mDG[6E#P3!/73+EQ"mgFstXAl]HLtdS^.M,mrmSdN:'U]b'Tc6h%$i0'F,^Ck(;"X//;'G%^\r%iiMmAEr'b;W//euodGSIn*eI_c0n$m[XUO;[d<<#jf9Gs[WRtoYa0OpC_R@Gj0SX_fmE2,oPp^Wpq6^rJ_l:mf_!NPTnZN;9IJ=,\r%fQ269pg*bIaTVc)R!c5QbN#pAZXCtOdELf11QocIKpJYkVfI/&a16D]^l(Lmjr'cIjBh08LER2cOLp7+'3Z*i]rPJF^BXn%hFf>D\r%4qOI-Q=<@IMZQh5C5<MrHh\1PAB1N[`Z`WdEHj;X#V#tD$UQ\M^cDWZZ,dO8"PQG&^Cl7CHMKWNPR7`7KPh.d*]VYN_IqhF#':>V\r%SqX@""kh(=ETN2YVJbjh&:XQI@)RC;jT)dgFCZaqp4kTdUN[q`N\BFJTDT!->a5EV!eJk+8amN.$;'T>^W\,A3*?k7lT:2YRMOV7\r%SOkF@N$5bHF_2BZ[dn@("6V^DG4m)^l516VA#T5lg%I_q8c#WZ+P5YYj[7a'T-S^4*?4u0SYg;m'`IM0gt,Bkm^XE83d132s"cti\r%hc]LSG;(4,h3+i.:#!aq+QMT"9$uu!c>8<$[38FW6Nm/;B$'Yk!eckK8!8dd-U7Wk0(adB!qV\`iEY&.L;+B1Il%;ZXV:2J!J*%,\r%0HoY3+bt"g#)=M5-Yec;0m!DN,c#%*UQbc@[o]0o#IsM.9C1j]4f<2d)4%f-O5H1NX>C!XB6aQ#KZ$&@_X#eJX%4,l'2"`bS44s6\r%`4DUaq^E-=r]*Fq?Db6t?B2,Eb:W?+#0V.C*=:h4W9Kq];Y2`Mi)N^l.IM&ia$pE&[7RmYEoh!Jj3E8sS*>o<VnU\=I'X8Ej`:%H\r%_frsrioe2-TPSjF'!e[.>F.Bjc%M$kjr0i&AkLMBi0n@HJ**31Q7&i'$L6_X1G0W<#1\I+*k:#I`6khXm_p;.XI2oYd2kMW\I0OY\r%K(FkqN_MbY5Q#LMi@XV`Vh=I]+*$sfO<e=`_Xe.`VnUV=N,d5aQqlX?M%ZWrMgeb65JSfGYuu0;)AU+(8lW,E7$%G`V@TU#G6j]A\r%Q3!EcodL268Y"5$KrYj8,Da7F;q(=[JL`bl.s[]oXT`\*4-Eh_QkE('+mi\DLTlm;V'U,kW%Y=5!C%^-+NH"2$=FaL!hsOp!VC+U\r%AQXX_N?N94bJ4c?!B1ot<hJ<M+.f\_Y<EEQ-H@e3s$GVBDtORsaoV6IIr1AMkm<\N\UsB$=&:O2$Hf2MPVe4XUg0_&m31R8j\d_6\r%m7GGHK(<p('pMG'cEI5rEW'-T5G)s:,9iJl:dHrfQf=4\;m'o,.]6ND:OXPMqIXg^J7%4&f;gqo>O?%'M9!M>7PThnL@0Kmmf^0_\r%ou/!MXn=nKK:S$LkF+TRm^H,CQ!#i*&I[TfiJ;V]^8L.3VO>D4#*cljc3A[>p3OFAJN.AMoBL,+1#VYK;h2'%KX?0c@XFN?LdZ-s\r%m&mcE;>V\&FaDgYOcXj=<dN]:/N45'E;fu:BPga^G1.\akpaL[eqZPC<euE&e+W"?4+1`7gC+Ac1=8!(_/)RlR#.pc]:P&`@pVpn\r%^dsJBrkk%s+;eK0;PCn0:eL6W(rlN4^@>j./ogcjc4B&m\gH?"PTILIRd1ah;n=8NL.m2KKE4aFq=/no;8_(;\ddj*!XOS\lqTte\r%_bP4$+i$H.aU&jb'DeP$KM:^r>D<!=1I,hQ!ks>UN`br<"\6\B!R::j:G;VJ-0<T#EImUSFI(f!SH;=K,D8&8MnnE,q9t^nTUV+#\r%@-sYZ3q*;[FppJhX;&S13Ajo=O28snKRY[S5[7f6\\?`(6JNU?mA*sWYIn'=B8+&"T?Y'6#B%@=oY,Z+(;3r8CX&07`CO[Z]q^>i\r%q,+O>J**7&5m%69=KBB2\NKe:_i&j9\"3B\$t*6\dHQ(Id2;d_Q:W:]QS=g1OiMAaPJ/k\Ulh,uJ.CL)^m\md4kG4rb(Y+)^56(^\r%U"55Ab\qo#78G@E3u^`&JbFK]&H[Aee6'F:+EH^h[m$r40+YaB"e`Ac'>%SK[nFfX,+"*,onl^IB@rd!=Ak()C3Y$r(E#`h+7i33\r%jnlj_iGf$M0<h$SYD2r-:4[9HK0Q&OW6XkT8ZZr]fT*8PNE3IG&.TNpaY.F8,kCEQq>YUPf4BH\.!32iIn,,SADoR1"uLGOcr!/#\r%%37<JPX.h)T+Kr/=."Y*3/7j1!]U41@gMIs_RF_un@,=R%L;hfC]<3UO3aK]C,B"e\Ji`CBWaf/*WH.U.3u$,$gJnJH+WB:Wn&,l\r%+hrd0)Y3n9OIr>P,oM2npmn4ajV`OU&#CQi>*>Si)U6fGY3$]E"+FE@7h$IrFO\Z76Ur#9%0$2-gjoFY3mlh0>6k?cc.-L17WUGU\r%X3k1s)*63q2-9DD5]N5"Bdg-X\;&u]MJFVhNfGsipJ2WVe'K4BK5_::2$heV>Qu2T%37<JeBh&[7h$J7d?24rpltgq-fL,t_3]rh\r%1^\5T5n^p*(@u!GJ.;anpHe_f+YI/$"*"dg2%\A)>Q\t+F<pn[Wt^(UX\)rQE"0ZA#hL2(%NPZON&^_WEKZm.6e=H[hh=l+hqrM8\r%g)D:oc`MJ1c#[Zl>8A7Z)(q$o[)r@X`AJ@]:g?BXF*.?UWmVPpEGlCWDgKs3fBd7jDB3E7LI_+t`Pl<$h6G1Ac$Gf&#-c([lk?`F\r%nI4,IkkNl<h;Tp*!DI<i(bc3Q$dSKN-"HlhXT+1j>!:+.HP#NCb-\&K>&*pnS9"WP#H7kq>#=k[77Ts;7h$IrFM*-as-!U-%93@%\r%TW5-3BqVJWWYTVikU;4Hg=tF?FO\Z76UqS+jj<POX+BaO8Pq2!^]PDhT[AMp8^dMiI$4ERGOke5=aSCMV3Ph0.'B8RL>j,/bG!r\\r%TNm,HZuQTb_DMVN+C'P<3HVo7Y48t\oL\&Lp5VlW`AJ@]:g?A-3HWbWS>N!TL5m05C?R($NnP\[L5m05C?VUiUDu=X)EMWsW1fu@\r%NZ't$TVJrBUnOQ<NZ'rnkU;4Hs-2=aXo:s\E=KlE'\?/d%NXe`_I6]bVcH]hTt#j:)N&;Y/r,J@mpBhnW1fu@NZ't$T]=Rp#Q!aZ\r%'gTgn5m7_72$heV>_?uUFOUdMB]uCgUP=dI3m+.kG#1Il7h$IrFO\Z7%NVt/@r(;,Tqd@&)EOIb,9>-?7h$IrFO\Z76Us.Y]QVBH\r%:J`;t*_#qi+:U8ha8h&%!pFl..#8@,;<#??f'\[o,6o-ECFH?Z\;'#6kc"G`JVK1'3bmlWTq`Sg#-YtTF9!QD0n5&j;*bhC^^("5\r%LC.HLjVPH,P@E:>s4["F^IOu#cqjT<O-p1Mf3[5/pIJtLIfDW#l.Y9O(0YCFKbdj*TnOIIC<KKn3bmlWTqd@&Ep0GR953UgTqd@&\r%)EOI`URr[92a1p=W1fu@NZ't$U#WO&dJW;HS,EJHrS890=dJkh?WaY@5LukUZd?J?BgTSf]fH'%^?8ki7atr<^B[dmN%-hmpIG'<\r%bH//427mrQ((Oj6mhZdurH?4:]/Anc2B-%uou2A8>CgrBhH9.X)SYo]\%$/TU.BIEPBCIB\m9130Q=_/3<Jfh^)\nc;<L*_$pa:F\r%%YgP0X,koLBXMnPM6`oH@Pl_#o,"t2m!?_=7dlbmKH6&\EjqL]E5ot=:loX8g;t#@kh#]h@)gq[ZW2E:'=m'm/D%X&5'Mf:R-9^V\r%"l]%:\-fP%6FSGN'utcZmrYsEVUq<*3$t4[Ai3gHB7Ki5me3i'<-b.lPn[Ho/C5jZj<^FkP2B4\J0!OfJM;Js'7r&#.brq2"?_l?\r%WHAQeeI"i-^KCM+*rs#?o)tL0pg8B"K*e-[Jdf9J[&2&dr?![KPP5++Vq!eYJ,jln`LatJ0.gL7DjZ*.1F[utrP_B(<\U*Yh[$4V\r%Jc"ULOdmiTa^DsUNWHC@g&8Y\^P/c^fkRZcNIDfuIMePbD6XDhkgO;_(tJ<r,*N[$2]=#rq#+5bc[XWr%QF=>Ge>'aoH8+ArdoZ\\r%W2LAj?OU?YZ__c(I]dj-;UFDK*cH6PB?C/T=HC7LU2ZQSW?+MA1egQX!i161O;W(ocMW6#6]Sp'h1PJYi'NS!s-jV;5@rYGI@/44\r%0Gj,nI"Pk(iN<tA#R]jK%)=kjl>\IC#ADfSp\XQ4K<X/1O$A*F=./IR(GII#!pBi"WXdp*0c+V3`;b=WTDr&`e\'794:blSksn[6\r%:rkf7PoT^s9jC[Hb@NG4MQJncmtZsR@]oMi:C0sA]jTO&Vsd-:X7VT<i"!3^JBs38.;kLj8sTRR,98Q+*+?2jVhAj#NE?>,*pLZ.\r%Rf,T>oL-J:Jm1&t$3oWY5::RJD>nrdDu%&;![5=IjTtcp3TC'"PeMaMb^Qh_?J0D3C#1\sQiA=2Wub>ELUACcU%dngQt1DsjXn+X\r%J61Urf;gq?>0g4_O,(?;)M*04B,78uDM1ilhH.t'rNus'7\LBTC"Ipcp@O..oX_1h\4pH+a6@D!ih'.T2[+!tpnuTt66S)u%-inb\r%&KYWJ;u5Wi-p0iT+gfpLGa8]prnoM`LF8]a$b/1;4\QGEKr21%kn`J&4bX[+q1f#2*BO0/(n:knU!W>9\G0n:G=Hg6(aLO;mR5N'\r%#cD4Pb,L#C1ptsD![XdA#_V.G!qB]pX<OI$<ga8McPZXqS-f9W6/g2,&.P6A&N&H:Pt_t[7j$pp`ISpK+@:N6/g)1'-Q0fhUcokF\r%6i'd+*t\)K*i4t4E'N;OoLXYqQSCgUF:/_6N8n"gLqu!Z*s\$UZ31_M5"5YU=ctg'!ua9f,,:i`[%Jh;1F%ALcpK*_!k1[1_52N1\r%KUn2.i^XsT(e#TcK)mGel&UcN#`JhniPlAK+t8=Y+h'H+$g;%)\chFkARe#U&<[FL3/Ig!kX&&GgJG]b6a."ciZukR:H&:,L$Y^H\r%JWN.K+2H!.mRTHrc4!8-_DNNZ$iUYS,EfN$Q[mL1Oa'I6(kTR8`D7%#6mF/aH"9f=?FW:ipMe/PEMPC`E!b%p"r,:L,8qCU$B,B7\r%9bcMIOU]ckE.L-V5Y/+556cfQK$7*o=kZ[1JYSVG$IP4`K+L)_!RFP,j.HP`,<-ifA-5A65o`^trPCsuaC$-D9KW<0aA%$p80J+K\r%+Aff1joKhF+AW8_kD(O]";QLHTP6iXIN"d9#R+pQ=TjFUY](/ViaGZ>n/;dLR$8El,o@2*'+LgP5RJ`Dn6isO.0^U</<6!b#96Uh\r%0+J`;7C#4o*s#mX$R-Yj!BLeMog7"FP8(6IKEBX@P8'PXG^pP`1IS"k$uGl5[g*Zt3+*6eU$s2k;6V.&VOt2:a<NtV;_prL80kYE\r%62:Ti_!(IgiLGIO-\6jN;C6Ar1)UK-H3o-/a8nfHccm<T+7aKIKKnT&q#o?%lj"%%c-Q^'o6aGdXriYZc`tUf#D*#@'hr(cJ3Xfg\r%3(tT+@CD7;7=M\<aT@S1a"Yo@!sE'7+:uiE`=Q\3";-;Fi'6-Q@#RH!I[XY`:'5&nc3,Hj6\,6s!K9-o%M?N[aSQ8t0geHm-9u0n\r%;jB'8BE@%2^G,TdUd9$7:c*_H'>^prN_gDA.tn.hC4Q"k9J@DJ&-S6ULdNBKi4o]q<UC@66"?!GLR`rANu&&kEVp,N6O<5j@:sQ]\r%%35LL#3J.<3sWO<!BB:F=@F%^%Z.PZi.@"9JuI<<9EbJX$K0J58$N4LfF.pH'C8L71Cu:JlQDWIUA+`Vqp?quUe/kI_;Gl!.Yn7^\r%C>o5S2h#F3U-\q.j5QjV9kRYJ=YA82!3r5"!iUX=OoP\Ra;9Z8;/d#@e27;<J?BLL3@GN:"'cO/@=E;tNWL[:,$MeNUM,N!+d(@h\r%_4`kZ1^I5QPF;i7d\LOd*.qc-.=d"7VoRI;"=]0LTHJ`_4$oYekR)h?!Yh(b!p5Yj+G=o,r#n2DiB@Pf,I4:F0SCUOn.P53a9/sX\r%A4/pT_7>OMrtQd^Z4oTFPCiL<LhtG!J^;ER:cM@]i4hh!S+EdQlG&GX'%)jFE?8!ojTfI[Hn>XO!fa9DJ:t`(*-s3nVXS)<5taY/\r%JJcK/*KfPg5arE=Qj?qV#D<]qTO:1[Z2?-VoBROQ&<m/B=@'*=RcY0E#0r1eAgWM4\OqDZO2OQp]]-fp_Dk6OW$8d8#`?/QQ0RZh\r%51WM(iVHtu4l5F#aKP'V-7bJ!3;<^KMheT6n>$)u*&AT!GAB@.HX*Fih"F!#G"kntb%^/D*OuhDMI]I#b6eW3s*Ac.Cn[/rlm%V%\r%^%JdGf[3`l>YPtVHTE@frUVM4f[Xoc*k=/7j'4Bn=OHLJ!H+?)'STp6UhV'C"'1KoER#8c.k^FEa),Ku"LMAfG.?qH0+8+p";65e\r%'bHJ!$BR+85lm'f+TDgS/ra6LY_j8B"b'32E("Cs94;-lMkGC^$"))j_nQcR"De,oJfd9@KUkq)q>m>nI#K2PFo$Y:9HYlTM&,k:\r%bkYK#G]@[q!V4mlJNOQ2/ccSNMMmOGY)e_\>2\c>"&G<H>UYIpBE=E:rXi1E-(#dn$kV@5?Qj.iq?&/=_LP+<eU\R.VN*G`J[<f9\r%6J-g^HjUcLEC^'qUr?oC7"FmnLCYS;hK9h<=3)jgLuX7_#CcoHjQmc"\">Y&-,gCBp*>LO6dgLF,/s&B&-GAZ*3^[@JI%[50B*_]\r%i8JAnINUWHJgGC;)05HCBg`0F9d6\ATi'mmg583p*=0_5eKTL5g-\^8`%aOhpX;Ym\24ZS#SM+7j;ES/T"$cL7j*G^"n`E-q"c,o\r%$>Co!a:(L9a5J6*aEcg1-N&*BFKeT3UKLBLMgiOshI3ff\dYOLhf&sXk`2lX=IF#Md\Y;`a&'b2VkXo*kN>&_Q3j'5=s=HZY$9&-\r%"NS#VXl#KDo`C<Ps)dtOH3q6k]eEW+^jf8+G!86O"7J==3hSS7%<)J6\\6[2_']$_OIG%$DpB]YSb,6\rL]AIHY##t])T!sIS55o\r%j$*r6P[;P8=oM<Ym=XjbQ<?pif<$&!"si))qqZ/'!lf>2NK@I^1]??'nA8$1Xs7fj&.F%J)5.;.^;LCL%rdk+E/@r)"O,*po+C$o\r%/XQmh!]0W-_93j48h+spmIAbn=V(4!?pY`Ca65)C52j+;N4qkA$fLcWC?9n-*6I&rkjACU/lpo=LY;(I=b"3H:61%)SCRQk8GiI9\r%8ZT[L[MZ;8p8Esi(-oA;s6P3lN4?KClY?=r)oHP<%R&Si"d2&eqATNZcaAJY[gMM'b`ZnaF0[t*p(*G6C:tOb&BnSm/:=Bc1."Y.\r%?TYFiCc)?Si[VqPN2&8ah4m8@+.oq5&#oRF-%TEfKW=RgR/UQj`pg0Hoq+(g_nW1BlEKM[Csd3HKDfu&?N.?'p?1+;Gg!nIAE`X#\r%'N8e-J,6eX]_makq)?OGmJ&nq@rM8]:P8%D2Ya1[0uuq=Ui;hnBqWoe8g%*s=(qE],-\(5rF\#Va',[,M/W1@%`q)u62K;sITJ=q\r%huE8@:]V3D2O+6A6Bf01.,ro@V.'#J+OaW5oX`&f5dmV'<9MU*%9u*6]%22R%Rqml.eGCgq7nfbeLW7A4(\abTO6e*oS\*aLA[Km\r%)XEPCL0(<=J.1rG-]9-2_s[A:L)oOalc#=Cj8-LBO*DX'=i><n5XmtFJNRtdhruNTHG@#CFLGI.R,&%p*2/m`=2Wu^.cd6`g.q<8\r%B"K"eZTlgi4+2/Q*^iL>\L.H3T*Qo&:$<s<]gl@4<lfh`m"g_VI^]?Q]$(I(To<<HY[N&c#JU?NAjcN_0D&>^`Bh^L2'Npne[FJq\r%n0<qBg!Ou]r\i368,qE0ZbtIVl-C-Oh=%*7G`n`%\=a!lgAOKJ@9/RT1E#HCl]%QTqeL=2SF)XUnT6(c-q>VnJ8^a(MlVZ#Sc4_K\r%T-?6D*^ed<_r6H'/Puu*dA?5B]fWdC/7q"FdXoJnS!fVT,ePH*aG^k38[>9jmWWGDrTA5EUu*jF_#JSdgb5%I8Vfj#>)Yp<#ihJn\r%>f@GCFVMCUD$69'RFQ6"[O#s6(-Wd"JC\C2@!:I25\7kL1L"s&c;fZP/*d5BJ/XNXPr<<nS-J]0S$Ofgr*nJp(<t6=^Xt#,TY92Q\r%"E8`!/PI\O9d*#O/3VC:1&Y32+b2b7fkR>?U2l(Wji/7Up=I'=fF;*6'hmXAPE$\lOU68])o7l#keV5+e_gd%K>hX/e-^9Xs+36j\r%!M\8=,GX$*G$mZ-P7%&20eXlA8+U7G[pLZhX6>LE.!'A%fT)YBn^@k0f%;ctB'UsPOZ97ATB+AqM*7E$Bg3MI8AA=M"K.locm[LM\r%FP&i!'G,RE[k:@(WD$1D1_aPj(M6Sq9W?$.;f9&?3h33J8#h_u)6UBOqkIe)6f.4#_#'6ei#[Kj*V;phHO.INksK440O&IpPl]K=\r%=U=2-CV27,UshUZ/$>:T@<'P1Pns,DF`C\A5*;Z0&GGr)m*H-BE5?A';hqr-^E*20BsZ&p3VS+ZWP9#"j[!0bmC8FpnSE1\T:Ik<\r%>k`HHA;BX,9*F=C6qrH31";U:f2Q:&"2+)=2-sX(`_*6IXu&QWW6_^&$_g#uq[f(Fj0<e/2[n4phQ8`:gTlV-!u7rK</HZi'Up`n\r%G.p-%>")q`CDC\4>cVNijVh4KM)`NRFp&?u3Q/&**lk=PGIZ;0j0e*sAC\Bd6GNeMZb:/j>;&5ekakhJWFU=I[J]L5bH`Ko)Sq26\r%bK4HkKm&+A$J(mkS=uI?%dc6jY=t'!ZJ4F8NQZ#B2%s6cG,sEi@-JE#Lr&ZV\T5`RL23sC>o>@nn'#Mm"KrVFE=d5S^EptuG^&f<\r%D0bf8UHWW=+Scr@hs@Jc>5c^>s,D!=GCnIR+!?T*mfPrXUY0C+_2:/;<F0+'+a6>,T0P@Z4,#p]#s-KX`E(DE8:+r*#-^/<pOCe-\r%f\(3,FT\po%3@Xman!a<KE^I,;@[6^!]EC0i[%S,mr?S"3Lp=(;7*V6A1-!B,\Y)B8BG*):0XDnh$LHk[_(I;\ON(-i:dU[N7n\@\r%gIm\4D0@%C("O!3?//I/Wk?[_61-U3aU2oONb&]SO&R=XB"RL>UE\gIGB&Gi(%AauK-A^_-EGOIJL0qir5!-'NYYl5ZbW9d?j)eW\r%'b>`4PSoK`8HpNrlI`4pJa!KLT-daIpqN25PSj]8esjL03!hIp?5P_<0\i^dlVF+a4EEMaZX4.EdekOOLss)`CcGVqWp;hK@&4o0\r%a9LOC$$\GP)U:CtmM5l:U6P&N%t^qZAdA;g1u/S6XY3_T=kHu<Y@1)L?\f0Q/IfMYC^Iu:X)Y)jn.<hn],.WH,aQ(#A@T(r8FD)U\r%=JPVh>kK!_c-?Fu*Pud&SP<//q$Q1s6_q^c^Jo]>,&528qm5+A\H$JU;b:5e7$==A-J!ej9F0W9lV!?jCagu!oMLT)2h"rP0<A<D\r%Y$T5"?pg$$D1jhfTX?B)<bRacU_OJC;W0Z-;J<'pXHD>MLl+j[UGVs\IHkWW6oNB3PZkK6@/<L8XW3>9b`b+nH/2/]`Stp=m<l>C\r%H<a_]T4'Mk3'qdMK']c-\eWdrY6J&p6ckFS\:APA#]!\c\hC2_7?EL%1b[6%Vh#LM@YuZoWc_j%Q+Xk'06u<)>$iGFbX%!KRG<.3\r%]ikrDm!:[D-\]+K5,[^)Z@;\JV,Oq&$.qDMo`CJ`=1^M[Ld98OlbuO'(hM04JUQt"<B7jEP26(Lc-@i6Ruj^f*C$N<j673*Bt/t^\r%7T]k9CFQSK6k7'F%L]f%io!+DIbEdcWk!c-MU5!Bqs3,l$XMT:20GTsIdl@>6@$#Nkin-c%:;_\YdHFn)P<"%i`*ZP<d8Fbffj>\\r%OQOCF'81sK+%CR_KOokUYKX'3om!FEF=M,",sg\AB6G$PpCV`a)6Z_#h?[,4LTEesVO."QFA$#,B<Sf`!),MCHR_]qG5LJ]2H*\C\r%oV?e4Z2fTc9(cN_V1.M+rLf=se*P$4Ds::V5)HUtS'Ab2d`dI#Eh87C/@5F=IRlt2!*)d^&'VmQFXFSe/_@Y[cB_J?/plEq>!$=R\r%KI&9$jpqFRT\o2k-@o7-!#=jO@pQB/as0I8.RLV\/87[7ZS,u%AV!Z9D4..IEeDYr[Qq1Copf!].l\-(m"JGGGm+&BIo.q<J?6`-\r%k).$Ac)LM$8f%?-H2tKQ>[e!VPJfjBl1bBe,SU*m6ejDMR3W9W@WTf;Mjn/Y"2O2AeF1UNs1(>(,dnp$n*A2&o+.?ri;<Z8H[E>2\r%p/fIS_9:9`ScX;f1G"o8dug5/UsK3WLCglDs(=Arl*nlTd(G_\H=a)Y4sn5(d-9b^/\K-;m14:cSp'\i+1?tXpq&tU*Kg;K^"70f\r%4KJcY52n7.0u;8-^c*jj<p2:&X'4>*d&m*@$4$VIn,k_(Oa`&Yiu.fI6'(sScX\c"%?Mq"0=Lbo'QRD_A^DX<JJQijf,KhF*cSb5\r%+1R_Up&!8Z^0o6e*46,g*3cc/3p.W_74N,1"3J"4K[oaNct#e+]:,)F&Pa?Hk_R4b1lD@>ID#3"`E"9faMmMH[I;#s@_LJQU#rMa\r%"6?c@#i6/(Vr/J[25J48mkcg0SM!KMR$Fo69]H&h=V?h5MCnW`9.r;^PaVn-C9j*W(5%/H85k<5KnC.n_3!K.lD<"BiAhr,1VR$9\r%'Zi'F2O8*;X/64A\MkAX8'GB6(Rg2"/[5].En.W`K!je?1hY'72LkYpLV_pDa;>=\S'bWJQ]*su0MomBr]'fdoO8pUCnlf=%qZT+\r%D("T9A-"kr)W6Z2Qqo"tH,Pbd$L\34SaMgHI'D;NfBgPN=Fsm)k\H%a7df3d)V;Lt1'ke$"8"GgClfV*_/=q5UWHpBEst5m@dn/;\r%B?Ao@8N6G2KT1r8]OcOfJktf]piJDWgU;P".q1>snMWO7nA0aP]=IQirISAui)`_J,Q;80*uOJp'M&hb5)[.LZ%N*i<+(!]T1b6W\r%Ys50'C,=-.gR']3c0UX#Z?#+R;a*u?g&B]/EnQ\@!4'%WZ[Hoi2)DZU/=H(#llhK7@?NYZ'##l11/*NuOfT05o4o3?khs]Mrig:a\r%CkABRZO,1U4MMG1K.#cM0&nQM+$'f-Mc:+MpFt`pkFB;+(F=:M/.df_#j(E!7i0"ji,T,4doPmfbO_.Keej.qWP*pG`TD_U)Hf_5\r%dCK^KDtdR#T6bs#-C_n7CF\X+q&qtGn)UP4b/EJJXEFL&bbs<rO469SF=4eoB.8Zd*N7P>SO'iMi=E'^YN0^eg#o*?@Z@,)K2-_.\r%.th3]C'@C\h$n%![Z\8#8Fq<"`ui$@WGHOmG:_!3BN5Be>OKEZ4duk(3X`WKMgGJ.hU1#CEA!L^hg`q"jg!!)0447)'5jh4ijM\,\r%p+c;*=ai8gJL3Te.8Qo4ROJ`)2Ou/%81_j3,%0ZaZu8#QPO+ru]B5e>S0#[>$1qJ*-X1r8e<S/hj*VJP4g%3,ekZK5?=RU6Gp>,E\r%C,LI?;GNR.+<1<t?uk0HK?6&S)N;SNVnnI?oE1Rodg!]qBa=Gjo"&j$]1.G5roqVa%#:@o`fXRn$\$+L]C;:=B3tnK5H%)u_Nib7\r%-:)n"")Ze#2&NIOYefDGg`+IjX)G5h@-Up*[/dFZ>8YO&m!"@hK-T,S)k?#GfALB\;[.HDf.hO,ZC_>>hr?Ec-F9'?>Lj_tHqTM/\r%UhOI"OS]:*&?nVs#0LfJ)//r=2$=RmdLaRs$\n/'TkB/i#!bP1R.ZS"`8d\_iN<i`(_S@SAOqNG)+48NoPV`R=gK8Qs%4+8QHbnm\r%=PK2OA^<PSW%aN]_u6.L@AmD0U7ot1c4$gaeSf]JSfS<2rMS'4[!$'k0CQ.pkiM3rJN!-=M`8OD45`$h43a("pp;ap`l!&?0O6Ir\r%_q^+a%*S/3QXO1kjpb[Ma"P?U9b`P@,-s4s2Q<_(RPJ$*p?C%Yd?VG`N1R05_h_<\LloWV9:a$=p^ELJ_0_[-(^[D&N,]dM2($u=\r%04T=^C`.<-ZJSdN()P!5>G5Z1%BFqfF4")-+*O3`nJMFNhNA8An\&LY2tiT2kAd:g(hXA0^s]US)E7=s&bNB84]!J8M`%!*rk#/O\r%1$_&m4>!R@_TCu6.:=H-VVmWjR\CmdYpn)uHnf4#9/TYAL#l!na*Gm.Ir"gRmE_0?oPAR#9\n(8BO^68CDooN9@G7crmY(EX(HZm\r%g00[RZa"[42V[$OM:pG&:X*";r+QWX*gYs8g\[<t?JZOCkmVGc(W`Dm>]i16bY@giAq'B,oB%u=Vf$+`VH<B!>+V2G+5=JSZcd\I\r%L<)QUZWO;)pD&U%DgShKpWUcHm?0(po\LLqUp+j^P+OY0Q>/GBYdA(^_X_Nu4^!)hq3P[f3MS-tmiQ\qAis1!%7A-R[EXI9X4Or<\r%=T,T]@L^rZ=)292[-K9o4OklbX&&>P[;C',X=oQ\ho]=_^ND:=]NSC)8$@((EBMsVgII=L1\*]^r11"B(261nCoR!ZD_'CB6X0L@\r%IV4"tff-@rITj.=WFqQ7=Xh)>G4WWm^cu$cB!?X&TdMo:U;HWVB5hM0js!Up.R6FLHe#FUhqj`OI9>3&m#)QIflsF$d:#\-"qG"o\r%<HlfT9&+F<gNjn9YKYQppWePSVc*B=nZb!:*OBu0o]#XL"9VClk0)lY>$k!!Wgig)hA,s0B7Vn#S.4eQEB^Qr4_K8\]K,/]m]1E<\r%IXcK#*0[O`#d3&jOb0k,b'[T,f=a8PE'76o=;PK&>$R]MT\$S-2JJ`$D1=L@gdJ;imuD_FYO:a82fmRT>Eerp>:86Z%l3HWp?.JX\r%j/P9:GV!j$LCSZoT&fk%USkaAY<AGl)sR0CH`VPUhWE=oT=eQ<=6d3YV6'WL2_j-=?G,B[rR'B!7*T&8r(ul88umZl=<aM(:UAaK\r%"c&t*0>0%2I'rI(oY!AOH9P_m!T-tlf>m7OA/$719QTPQ^uV`JY&;*;PKY9&Dib!9"o?1i7=.I9_=;l-&!++<;nU1Z<W$9"'6kTp\r%YOPVdhB=FWZQqiTCb?pGc7Xon](\l\3PB]I3,6jZ=2e\p*LYK9V#65`1*-.7+R=-L7!:r["Sl2g"T??\)Q'k9ICll0+,eQJJ*GWt\r%oKP@\49+Nt]_-27o/>Nq4*Q8&,AdkMdqMJ5_,k[\#+c,:pi8H1b3;UU;*k,T5iknX(=d<2hPpLk^7`2,cW8cqk,7F)A!dAt/DhsB\r%d@E6OVhaWm8T0C2[o@.(_.]OH$'s$hJ++a*\I[!.M9h9_Q68N4W*Bk0XIW(aOe"s/+!WS/n%kqam$p3t_Vq$4!&3^k++>8*2rRn$\r%QI/hZk42t%nYbuh81%j$7bX8J,r0j!fciK^H]2EW;]qN"J'Oe]l(Al)Jo?\5fD+GPk.,h6a5YC<,BhC,#I4#`\K'@g!bC)W0=11N\r%VVdBjQ^u+jqb%Z;5JEP&XEP^]H@?[FB=iAq9r3<ZjP6.bG/JtG^09B[8CF:cdBZsbM;`Kh8K)p2H'2]EB?BN0H'3QF4H>Vt2J/D`\r%7H^;B:h.76PrBPLlD='Ke:o!RFI'<.hFXT.6m\FBm<5>u\=`5#bYS+EL9B?N1SpPlS*<+3PF9Zc[?^Dfj0NPOk]C>Wh@.Nmbdi,H\r%fcEAe\VP/Bb2&-@&%R.+\'5l/N`\L'$23pYa$&W4hmElmq(J(e/RY8m\r`nto>8s5)_Wb5Mb2=P0#rlALZ>`9n2a)V5=9_)jOb.?\r%V>/-m.^e!ZDJ@fB`QRu/la@d[l#k,k`<cRXSF%g"+T#E#]b;icV:)XqSX!pPos<r!%@q6]Q:b65%l9sVR>MjL?1_ZRT;8crpQ#@(\r%rV\MJQDo/1\O\=$_hd$IEUU&YA`pK_0kF&Oin`A'rk@^c)M[[)h[&Aq`^VOj\*,B&Z&<WZmCkX4]H]Z*AgcfSCG,&t8hJrAqU!C^\r%Rf-9jk1I$M`]$s\fY39PlX>.B4kYhl&'dJ]oT4ANLEBi+M8fYPNm'S9?4?:%Vt"M7Cs@Dm3`7QEcLR?mN#s*JJemAk4-!sGW'^7M\r%WTLKVSgO'oi7[d3VOo[#L]2AhPmG)@R+_6\4K[DP[,'^6b;/C^]].tRo<h7eHEY4m5Q9f$%1I/hbO"?XXhT^:%:-/;BB_nR_u9!j\r%UK-Q]gC(UUB.-]^Ap>3fB!h0gh>?]'I4s;oqL.iiFaZ7I`Vi;QL!Mu0YIagF0)"1i]0thEGtHLibe@1toHVV,^#']Nl@%7:D[qBn\r%]8k/lBPm:k_7El^L6R&U3G]*XG.?nO3_')]()YS30<*>C*GLPU_Ui1#H[OP.kMl\*+UPG6WO8hrPPKB=R$*G/A6S^Z44D0=AS;!$\r%7qC1q#f"YcpD"6fIT#i)n[%oN>(1?9`Rm:`>n#ne9Tkuc5<$e1RV`0Dc[1&H1d3MOb=&_F>kWtYBk=W+CoaWHIp3A0=D[B%]t8Ed\r%5X)?KrHNEO?o?E1hKo4SXBgRDcLM_JL^1X8Mi<cUOPUS=n9-n[]9CNY*L:^/s2Ds*=daXpK8T<JM@W8u*Q;qO^Q#8j`GW+eN0;&l\r%EV!j.=P0X=D44]\=sKDD$e`#fYRnaLi:%<Q)Qeg3:[9,qlb:*Qh3+'g>tCsnG;\]e/,C*h7@5HHM6thrW<A\t:;`9\Tp.@CmC)YG\r%nSZV$6Qo*j_MO%q]^!6>=5IcD"M5c&\L^Se>!ROT_Q[n>1Ga#\k!Z$.FXEjNbr2gY'0_s5&ZHULTi#NjRM6[*7+=G9JV5C7aEYD,\r%a]V]1iA9\YcK$NbqB`o"I!/Hf(QTMG9U.2kh/;M8;l4sqj#93"4r:XtSL$)38psiOAi_cG4,qk$A392G.!I.X([`WEo3=3dhKkNk\r%N8(Yag%3+dc@U_7qfo=31ZRmJ%5XiYn2N;]V5NqnIO'paCM&)u^(O9S9Q>.SbM.,WdT_?"eh<D,),d'aV`EH$QrY1;:X!d]Z\1O0\r%Y!I4BB\:d4s*H#[[#e<ilJDI?Z`FCnf'f1":<><rW<G)5T4Y7m\2*/l`\AQ&ZSV2CGh+AS;[^d>c,7-Lp;oqMq??\=,U0'68B[u'\r%Vjg5[#.C?Y<fQl>%N1`V-%'-+Uc?G[[N-JKg,>ZI8Sf68V0rd!04'Xk4ml0^6._IY#bEQ47(O3m4_END!(bTp`E11rVpjt'/(tlT\r%L5EXDMo`n>(,2C@jYT8g]Maei@g1s.:X'oELH!K'Y_(h>;`3TFU=PjNotnRP.!VMBW1YIu$e@6PrTLR<Sr<03U6!t_f0&HGIW35]\r%B;,Z*pBbo[j&n='\XUN^3fgOZAGCH-6^e],#4uZ0!8e/tPU_LuF:Sf<p/htd)YqdgJ0C2'8"t_u\Y"2A4pT2Qk0oS5qoW8KL9[.F\r%<<&X(/S*_uanBh\9@h@?C9gQq5l2[&Il;jjL+h5XO1W(R,0jqabd9;n&.:,'CdCnMo/\[FAVWgJJ1T`"`D)Ib:.(,KcB<Ur?(I5[\r%WK^&[m.A+9Y!1\c%0ZhiQ3,3M\m;:XW-9`6j+0kb0$&lJ/0kBc/6?Y+cXdl:$7c:si(kD`EHL2>J";D&GK+1*[+h42njJZS\I4:E\r%@L_g1)rTA8GEt@Ve%Q\<jm:QX,<_ll0A/N)F_4)olc+IMMMR41iXgf@aX>t=33oukk9C4EC>#(*IaSW`pGmp3>@5QoZIVZKF6RZn\r%LuIIp0UEh5T+Q=jkTHL$:pJ%CD/*,QcEbeT`D1[)=TB85=scJCN'LI(-sDPF`o4u23ObpR#2k\lQerYWTo^ea^H[iOUps]ke$JG#\r%JnXCoXV21CZ#CO[A/)I)_+\`-TQsOCZ-l9:k]HA"E/XpD/JVoIpHDh/>9B]#D\f\B3!*SoJP*AOlUdi"/i'tRYjnNq6sWpg9bbVp\r%lX&H^3@bhn!]o4oZ@ht><TjEWO9NN&Zh;jL!Upr4-(BgP;qeCj'EJ'ar,d#FoHqc-XVD+i%hLAKIo!FcCFrifC?%f:_eIASPIB>1\r%%qt*Gmgd5L%0L#+C':D5TRV!Kf06i35OpXoVk(V[k1<a[HOp9WCcm<+rFC)j@hadfo':G)`XiX)!1U>Oj`82$Me3&$F;KsKi`pKJ\r%gXUs'[4#HiW2nOfr1nsh1T*Ibl20[jU"[H^]n[kI241_'_q[oFq/dn`5K/21j"YB"&)Z>`HhpLM#""g>B=O8k)Z6%UTU81ZU9@Os\r%68[WV(j]BP+:YNN3)[ks-V"D(R3qJ'ZH9s1;1Qcm3P:Fc]1Tn/pBN`a0<i3$&da]r\G/Gp21aQ4&PIob0GZo$afto&aUK(B"f9\&\r%f-6%'Tbg,V<()gZ\PCOR?=K"*lWBP<R0^H`L2hDK-.`tha%:8.M)7U4[#dDh?D<Uf*0_8SW*7`/3)P=REhWj-)(;QgD);YHVdj_b\r%d&7F]&Lk!Jr.,*7_B8"t/n]2@<Pl#"5)H&o3^%lPCeWD6<1!i*>S0JK0U5S+ji4#CX;Elo1iie>`"$:3NGEQ$4di91M^ZHpaY6/O\r%KTA^[*HRE.4H&X!FNWq20^g8&F/7@]_.lhW.#FbD</HDNej])dN0G8S%`o<F<@_ej%i=U:M&^1Nb#+rTQNKK01i[9eAqii"SA_.2\r%#DgDI'uV+MoSF6r3)Z41GfKg"5=s`#Kp&KIF$(n(Yd1o%E>Zf@VnC.uE."gpj=U1O+Hq>HP/J^EL*`:8hmK#3#Z`moZCRnFi6"/o\r%8N7lM$;RoQBff_E0JVM&(Z9mNP10mNJV9kiU21tEF1`u7;fq)sP"UsZEs^q/`rg@U"@6Z,Y"KV&osi'A9_n,"0C:(Y5"[_7XbUG&\r%='T?C'qbI"mNRu'=Z/TEd<$@k0<TreC\oVb9;h&/L>eo.jcNq9"q%-0j,lrc%6?7hBI;uQ;DV6\SKDkTP(>s/Qn1H[5b-&>p0a<O\r%\$ZgkLOKsf"l/g@=3M\tQZIr*R0/C#K\QS@UZmR%W14_a[OpC<rX-O)lrTX6[n4I3H8uj@9SIR(Beje7:cL9a_gY5/Egb7op[mg9\r%njUPkb65bm:)q>#r^##Xi>OK73Q+F8(u&59&#=_%o>LW&R0D[df)t$#M8sVVFjM8k+!=C\g!WgNF4rR2a25KlNobAIMp-b*HZOs1\r%(uUc\#PA-25Nn=g_8V$6BCicU8f1Dt.]dX8c4:S]?<Da%iXl,38,j2k6h=/8%0eY2jZ_P]ThPHR*eSPs9410E?Tf^i0K@oaOqc3]\r%Z9l#BNQh16Pm9:>b7K\BQCEFR;h[CX_uWpmC7Qm".lu;J3_d0OCB$S%6H^LTrM\K;HO\DU8h&;h-briUQhPlZ^ON[;)u$I00&mcU\r%2\*jA[USlVhlgOTEdr/OO\aRKLmL-K97$GH#eT*lpNOHZ\mD$qD`K\Y\j0q9+!9W](p:7<;KF$o38>&]!jM05\\OjO\VJU^3NRCS\r%N)->>TC/,*PjYAHGN3PMmQ/RYcp=-r7*<hFO?QDKa0]X(<dsfMoFbYj`.K4dFFZ1ZZgW__1q>?P!H@CC]%nSWLDg.l5qbA*OD&R=\r%mi/p3Lcj>&P!q,MYV8Pdqtas2rP1OJ%`/T)pQcp&2[,7ucDM$e3_O.K>E>%#"rCLPL"Rt&VK2BndM9aEo+rXMUc$WqO'5UtYCmKI\r%HRHUlF,p)@P03u7#Zpr7lTD)D,0Q=7X[m&BWq&>BncX8q;l+o^gDkOdfauP"[4,U'Q0+D;Jan"D?gCk7pCp1)o!FC(do#Q9b&b`^\r%Qd<Tp"FZ44TUR<,b?>m1Z(o+phOgh8aVQ)bju2OG;IbR(3nPH0--C'#$7<WN?aIh`d%;T#:H9jQ%^ES"4k/(dON3BmT;_md/b.YE\r%9?[n:o\BN2mj4,7D/'e":/IgFhZU+pR<#oS4EOAC(6pdsFEcm641=Ed`pLuPB?@a:eU9378A8[@onDEO>iJg3-^Hame<#gLqX-Ge\r%FsR0e@E<N8I+4`q4e[;0hXks.ZX.SZ2#c\AHBEk>S3)W(JAkKX+@(4!aLt*@^=,i6pt$-,H")<%KLU_9:fmO)YeQTNnNt:@?NVb^\r%nQ=QDjiQ3-+ih\V]O**##83b\Ke2,.;MuhZ#50g%U#P%bF!@mriTESggHiN'Q?9@9Ft,C:9u=eVs6I>>M^O.2?>R1ELmf^G)$Wkg\r%Ju0Y[\A)X4E36B1$BlUVR2)FoM:gbN'hk&i2;)dn^<UT5Zq\kUeSQM#ZS9lLoor80V`T*3F@bs$KoXF_YF4CC=\ni8M;=TZHR8i6\r%*`sY"0ATVpKt#it%t]'QH@_cTWCY^4*+pUqY+H2B]P.oec(##:.-cH'`hPCJ]%<muCjCfe*R4;+0:V"CS)Z'P[[LF2GE]E<`ohZk\r%p-*[&Zj(e.choEM:H@f'9=X72?^'lceSo%MG=@X1KjU\9c(`(+Yjh<[_*A@)>WUOA+_%2@"E5pPD?n*;6]TpJ4IL%6ktlF6npdI$\r%@#ug2YmGLT$qup+Ss?o>L1_V:CNo4/M.h;.#`kjb0WPV=;/1"'Pu@Toj$P!`k-q<..3I[m;6bK*?n_-24\.fCC[&L,&o6\?9B_Tb\r%R(oF'U^/WI",S]Q1u.76ch1SLr/;.4S]8hH_p!';E_H-X!,$J*o!S;SJA3'0Y<Slba\3Fn00$aih60%!j%sHPkrWOD;!!=hk)tXf\r%&M8d0fF-%igr^#^VgWKOE]NFF68bLbo&R+OfU`HuRmo];O*6'OD''M9-0$GsZ3b'!beeCT5E!)TaJR^F=R+.qMoIS=bMrmCFmnYB\r%\HK?f#<H5bEsAN]#:]!AHmV73R6uFRBm:GYO<pH@#FA]DD7V+]>pV&B]5P=n+ut!iR1)gImS15c^"UV32LYWYO/#9u9YL33F--uc\r%^o'PML%b#!FN]nDJq"/bW5n4cm0,DRk2Be>)ebH^cf^[0T(Lc9%pAe<hh==IT*bt\\mLO'^r5n./,%DkU^5#N/P?/SQ%gu(/go9"\r%RT#Y8?(.b6m"LDeU>_#gn#pC@!:#H_0Wk7WhNI=3J\B;%P/b++Xp_V/0V_GIm8:_[R7^F7hV'e9Z._2!?K[gg2[.&@^BLDGM$;UL\r%N/U)U%_i0;Poc_GPqGAX&\3_PGY$c=CeX-&2oBX\?I">%8k-8CGVd/TMe&m')0=IT5oD&LV(q`oM3JX,c'L+7&,lb*njl4f3mstW\r%PHFccEUHX)Co4_4D1UG6/HLV7.ecfJKTm^3=ub4=&uuKm-@'_A0h!e'p'n>+Fhr-q?/,5.bq^A0@qt868fY3GA!6'9mf!N+H7%=S\r%59VAAG@r.S%V>PJPZVmRJWRKg06h"1T:`4P.;.IT7Oe@$"Yq*[BhNJee7<8(!X/1.(TGa,H6Q9-2KkLOh4B8RTLEbU.(N`O-oB*7\r%X@7cgF(l/Znak\H+rA)d@4Z146G%:d)pWZc+U:YF$HK"A%P,9UUF5Ya*t&?N#4:o.YJ8D3oS=g#0iHe#J!$0tCm:*u5Fgo,*%]b?\r%'f^srHY.*MR&F;9(X'KF]Y:.IAj,kkBOgA(_`_'/mK^9tog1]?,R=\R9[[jcX[Dknfp<-0[l\hN!!IC4jsdQX4;fs:;YM[tMY;u6\r%KqXn6_[g#EGQZmabt!Kb265H/iNj\h>SRUVpKcC79@u`$j39Oj9b\(GKZ'Mn>][b<%>+T7q><mirKci[PE2,'^cFPC0+k\sbS%TG\r%LJtiXZ:Gcm$eg2+:LBl(\R[k.$!4V5p$pHQ7=F-gAnI-:jr*@+2kZpVG*ICm(UN,l,\ka/1VT-,^53G^X2!d/Ca"Yc?g.2R_3`@3\r%PA"1+!?r#C-^.a\X2'4n*N=<0lJVi0'8dG'E34P8GW<4LTcm4=@8$hE3?Q&A@5p'*TI#*&D;qD9bO-P,>ZX+fpm5JC9pq]6;mp?c\r%lgCW8^/#?a_r<3[(@]"U1E`stQa;q@5E2+>[`&XMkP*4+_FS\C-qIZD%_kaU!s%c2R4,L@\-&GN*J!AE<sl2XXH!o&q[V=YP^98=\r%I:/p9\8rG@%eAaOe"%p*`gCiN>iQ8gFhYjej:ZL!$6;=(/N2J'!g8nl.PkCT?"iInG5[kbqG\$/%_)%Vn"uF&^GpfMmDC.K[d7C?\r%lih/.Z5k.FV+C%1h$K^47ASDXY#!jH0qFBtA=Bj@?16\`b9DKHPu"Qt[Q\rIUR(/iSk[Yhl2q$>92)70)#mGOh#Qt`2.t*:EeU?W\r%(4cVQdHo,B>c*%YkJb`:*VA/TG`(FA\DsbFNE3"QG8RMPO&ij(F<]0)m$$fnr=6-Y+ipm9*[\EmNcGBe3%C^e)+d6-%k2g)Cu^rO\r%Ue?5c^U6W-"C_?al9d9*Al18?UJNe*$@iW,Oh:m6W,l#3ZPkU]d,^;m]GBE5Ro=QXApC_7q;QE)^+u)/ZU4(C?q<A!O:s1)+P_J1\r%kMaR_"Xf@klq*8T*DYqJF9n'GU.JRsjPJ!1HUdH??@"D3bno-*G<93Qm$D`5*oCe<h@%;]_CK)QX19;NOJ(reJb6IEH`o)M"jCj9\r%^(=NlEQ2NWr.W8Q?QFf*EPFsK?Q^TKe"M@[knVl-KkSY$n10-2cI!btM6Bn)%[?]"8"2u1;:r0@?dY$Ym\@(sjUA:nm,T'UnG>C_\r%eH(cuk1Y[]V@-IaQS1B-3h1hYJc6it(n93BX8ZYQ56KM.b)][=bJn&jlsje[9_`eVN3A=b7PZX-<\ruHj5sUfoNk+59>4#-h"KKs\r%(>i2^5PC:"=EPC(VS*$.gl>@WfaW<T#-![\!:Xi.[MS?4*hVm%O.L1[Z1(55YLO9,L6=a=Hu`%V^IR_]:,$/rm^&='iN7H7<!AaV\r%WS_;e;1LCus&NSk,<?3A-1oUU^r>,I*3R<t:o=:4*"Dq6fN(j1b8]?p+QneD_@IdLA^))Oo@6,SUG=&P[ElFaPt-qS)Hsu>5$\>s\r%kFFWd:9GYR=MQ`c7&8YkH[XX6+nX1-a*:0l-dcnB?4CIP13ZZiQ_6;!=B\qnDK1f\^4*R/?7)r%'oD-*^FYSEHZNOdPXF2MYRl6T\r%k123b:6p<T_17uGgUUEA2W3cA#s[s>,J$1Aa(`C1qoF$VM2*ATpAR`KDt&(ug3?fjr=+q*1Me$jg/'lE<do)U`#'Kt2(\(>b[?aE\r%8T\c#1Y3Vel:fL.ZSEY>\bDpK2dte3I&mu4)qhY#a6k.+HTo=[@ATFWd5IBHFbnn#DP\6rVb:ZR9!1JAZsBp`2.aDP2X2S=+bH<p\r%SG#$1TXA1a+8h"DK!,Xh2RGY\N]VZ!]@FBF>c0UjGa@b$_Sr)_FaMhVc[9(sm$*s(o+q-sUBWfl`@WY+'P3cSA$+d0INoGJb&t;'\r%\Z6d*:'4EV@scMDFfMbJPrRW*;.:_2eu^[Yo:$dZMi(c;=>!TK.!/(LbU_6V6_+9O4rp^(\VK:dpFZ29o7j1Y0>4i+43\Rt[To^k\r%$PG/`&oW8mDK0<pT0:cj,Q"p1=(%qg1\'VpcfFBnGCWFOmP@51?n'SSoO;s4m6n"+_")oKeEK'LSZ^ZRSL,22cC+3d:-gP'.G]D/\r%q6?N6=tl06aI@RT;+#PCRZ<j-SMnoVpm674nj'aj\g!&O>bTW^e9UeOW6'8KIt#CX+mf3(;k6?2V$V!V/r?$%Vc^+Vbpda,R4Rr0\r%26G@WKB:o2*Oo$#1KJ!,9A2jYqH6k"4-TQ%n+>:C58!A?]g'Mp2u>MZM3uM0q\$jtZj2AW7aF+IN7LslnIV?lb]>hnb3KG1cm`P#\r%kJLP#B0#3Wlnj>pS_]BTVo>iYifh&ob')KrfZ97O;(m=+j\^rS'KU[8@'+X.;81M"@<DPGiipULg9Ib,?reb:[5DfKoT_J^A"E0;\r%.c4roZomC^dFb-kc6E_QDG!C;:-7oij%cT&)YSDWcH(35NFtO^ghV#DZ=E:Qk!d6a5G&%qS3j,l6*.\(GRg:=g)I<Oqp3Nm((-51\r%S\>n'/&b7d9?UmCkk#b20N`M,/BNo0Gjd@*&m\9KF@pjT-dDX]Icif[PE(huj*7OW:=L_$Mq\WdMb1rm_*4CJ,j[@:dO?=9q'CPT\r%jZDjO]=,`S:3UobPEE`AG37>kFdm]sMoSZXB"&:j"7.jambWgB@AHcu$j[51MX0mE07.(0HN]&jNW5UA1o*.%/g#:PAm)"GJt8c6\r%8'3/KCVbHuj@Q6l\d3\<;gc(5LA+*O`qAPjc+3BWo1g=4<-YY@emZP0cOG9T&NoX[r@(eBYj@XHSc\-#=;C7%-A0j6k2VoXkD2;h\r%(b1?V$[cmU_3:dre^XAiGaGQL_f(EVFd=0/Cjmeh%o/Oa:%<+aYeCM[moE\o4$o1!bl*!-*)V*pAfUFN$?q++CE`PYjmJ.G?_K94\r%4h,)jGWNj(i=joUrDIF-GdilVbur#t3m4:pmkZBKIsfFm@u>Ip/3V^gGkZ8\h\63MakWM4Lf?b3l/b#Dmj[&rZ=u].-[-jLZ]k`F\r%r(6GC_5cCm.,D9LXMm,ria%Y&-`d3.ir'L0B>g)'-4PX]&QZC\-t(_qZR8?rClb+AGI8CE49"KO2gTMRrK2:NV0Dn+-D0S?A1m7h\r%VVt+IDL+'T_fnHo@ld7F<%reCB>J#1Zu>i+k_pTea`cG0Ld2=8N;9dgqeC,If%^(sCG.T!EbMYGO'pos;fI@NdsQhP9PGC"n&)TM\r%rp&.R:N^&so<c>4ILhqrL!PrnK5:\lhe<nJ:=jPdh%oZC$%n=@G!X?EHf)LkM9#l[U*WTDB\$a8S`p/223Be]d3n1F"c77N!3P90\r%hhs)5K?#K5?T#@!ELju-)<=sb9H(`FZ-RkRg\2t6^0.Q+!1A).^uo"cogXW(9X<cOS)NVi8&?%Ba"nrQf"u!+I<0H^W(rpE4r7/8\r%*luJd#PJk""8Ng74(1ls3G/lbC1QE(14(E^;oN"u&<LM-b3\6]m'Fc>3k>69E6'HO+mB]q&du2P_i[945Ct(e\oX.(dB6%,5RJc%\r%&,-<,5[q%;r/Roe@ONJ4`g?`$'ue;HM002-#O-_e=!]Sc2I.[g;Sa0]SWlet,kg"m71;S"fD0/$8PElYUC_*Q>,&?!_H2RWKl;8G\r%f%fg,7_[=nLj;u_VR)dWkbrP5!XN^rWEFL5#LdoYTtk;m>&@H"k\U!H<\Uj4kKo^"iHL@@g7DY<_^Ca=o"c$@"3QuCmE-9u>W17,\r%n^6Y#i6)k]m9/:Cf^V)-S4tZ]"f24\'=do?GDgrW!O4])0BqsVWuEKk#2<0_2;`jm(^s3R9t3n^E=kG5_/B,mQjg1Y)uFRU:N)X\\r%TV+n*2!>)&U&77u7&*cj<d<L`&TcolYBp!%fu2)9NM(1FS;mS.%l<2N;SMBD@hJ_td0TNSL`ZZ'[O,g\J_=!D1i^imInAOO>6mF3\r%pjNV:__(d.G81Qsb@b3Q$bF2Ge*Q1Y!l'5)XN)RA?6?.<:00P)T8rTiSh6_B?5k?k__Y@'.55BjkU\rt#`o$djd>)Z@;]+6`2Sn[\r%'4JMjMQiHE61K@"TM>O$]k1ZLe%&J%B8Yes6)n5NcI?KeS)%W7"bpJe4.eOAYp!-T==iYHKZqJP7\"tb*:/\m<Ocb'*S]BgB?[g$\r%A`e*DYkNTX=su-RmNimY8#0HXV-f=T"Mt_#kpuhOL4*V=bJ'f3-R/n5I%gC2iYAm$m(NnF#NN131Ip:OHWamj7rg<:`&/i,'#'b_\r%lpcL"8TVUI-k*Ck:c1f5#N?TlP^rq"flQ3,,L)?kjb,cW2.<8kf?,Bba6'-aR7C9^)q+;@0420Y:/lCa)4-lKKb_R2,S.6Za.$0l\r%gD(Hko)=S&^kD:sjiG1h-gYl8!*;^7%mJjU`&YgSGBk&+aFaEfgImi4CE12$cDH.uPpB\;+XXgWC`0o%_A2MQCWW8D+\>+nk+J8X\r%<<tsib+UN/Vu=$6n\2J`>cW/f_*Jot_hoYd(6]uSqc$_Cgjjm!k0S"&/9=f2.1F/m8h-#Sli73&<EGb9TkFM_XAhQLT@;6X[#Mq$\r%q;??9Pi/8Ior/@FAF(oZ-'l1$[,"l,;?cuRqniM[.4FX$kJ>tM`aa9BXMVB468`g-<UlF_>,^mN0r#pA?Mi@G"R/I\7%WB\`KBF:\r%(YLTo;\?>7-*J/4IS18=Q?/&Fgd[ZY(8.UKb<TL,1CkWb>b+=^[)dHo-=dHk`gs_$G!3`*>h+<"5llSB>Rs)<&`=Oo5lmSRr>T_;\r%gn-#&:hPp^#P.k1(]RD(B*B0&-BYRYE`7QXUn3==rp4)bh@qd9;``CVQr+$XF"27kp&*p7Im#R.8`AI:.ci<5r$u/nBDL[4q6BF2\r%SrM<n&D$_-*l&F$Qa0ikM7/=\Z([0!W_K:Lj09hSbCmd"(/`@%IDNjo2nJI8qH-.k1]AL>SOKZ:c?$(f\Y^2K92;IC,J9$VVhnq7\r%EkKTE'SIR9-g@5=$P92ImAJB2]!+IJa+^&rUn#cj9hOP;^`C+NnWh)2JslJs18T9Hh0p5;KE3:LCZ8/mOTH\\8SqGBq9$l/?i9$I\r%ZD2P85g4Q'MU\KPqQi`LFkTik;k<#O[*%\k?XM[(DQ0RjbjHF.>ECku34X:>]VTMo>[U<,FE)s"j;5<#h<NbJ]4l8CX&_8imrWh*\r%hgX<T'Gn5LF(fV@\%Q5#q@50NjUNcl1JVuOAP$cbl^L0_Bb#JMh[ASip#W<VMd+BQji&fcFJ64W"iX@8Q,P=hF90ndFa;Y0j\!t,\r%FQ1QU3;FLD8WY5r/PA.J'rKp[eh8[okq%pqJ4c[K86iaA=5*Ot_O'=7S:XDH[S67f]M&Cn`GfCr7rAH%HQ/G0T'^Fe^M_/)R$\\n\r%Bh0BT4C@7V_mHCBPB;:G!N4*PQmt>)3_J6l`#L8So#"m)5U$`'5`I-!"ZJ#pF0ec+r-:c8J8Nn?3\^gaYo?d3"d\#Ze?[$]-7CXG\r%_@\39i270'q<D_eG@GN9:==l;GI[6nQG'0s7JgeTFo)X]T9Xq?%E'q:B<=c`6,*9>C4bWhDG.[8=u'Nm_DDqCB!g-e[*K0#qTIVa\r%BV]<B-E\u\?_8X+-)g5:\O"C)<aS0,8B5]k/70?gCn(oVl&a`Z\hsNh8qaPF///&dYf:,KMkWWgX^!;k9d#:`LWJ*:!64q77$%_;\r%HX@St-M":($4tXbN^r&R!k$G0WI%Rjrm499h+<i/<7nQNUIm/UpT#"i"O.tjXg=OU]!FS-Z+,\c$AT/?5[oQlZK0=-Z3c=7,1N's\r%G)kH4?=:k^0b,1=?0)Rq[?6&#=^5D1("AL3M0#tdW"tX>^)?(SS0<GAG.qVZNGoFYd=ml"i#:qm#jZ<D*A%o[\FY_/T#&W*76,[/\r%cuOI>/Y=sOVQf>!6tpV8Ge1tjf!(32%g(%*E)cqm&>;-$;j!rmOZoD?M9<bHC*rKBk*o<EFO`FSG]Ms/^nPn;_CF,FY)Q5r'\97P\r%`.3mFHqj*7\QE&/prq9R?D[;u,V_JgO\4u,2\"\cMG%inOi-6:!.]s<r(To&o(M`DH"HiLP;l0]Y>PBchO^rV>3CZNrL&<BN-&So\r%gD0\<<-e@=9NYh#6X?95\C#AE_BPJ+_\#r"#+1`sj\]p+!T;ThKlruk*$86Rg%fGD<qY].Z;^1Uin5NL1.=3L>VG9(3,EdhSJXm"\r%@Lqb:VD*^$-E]=bhq?1g%_h2]'g#d]3tmNs%MhsTLq7=M*p=W7qdEju(YjAim_<S1P'pjumN&6:DSCPd8N_-:5%(c^?:D((d5';C\r%gpAuBaHtle=`K/VWm./6]WqR2Ald("TsWFH4GQg14lsZ"j*47W,OB>eT0m9m.LHAVr/j!]R$E)f1Cq5SLXKMNG)P9/Ij%4G4-$(F\r%^[csV^H%)1f4!ackBq%Tos\TE?/2crD%6T(8os3N=inp^6gZU*BkR=W_(rP>Gh1!P@UE,_*LY1sI1)G'rDg7>IaMT\d;.!I+`jBE\r%CWGboKPtKrkLt.P1O=mXjs:u>JnnI@Sam9=l'/C<EkrQR_quEejp]P$a!K7*M=7W'35%!Cc`j9:-MV>U3ZN8ik9T%Tk`[m:E^)6'\r%9REVIhI$Au)sR#l3"%5Yji`Zk<L"R`_K?TIZU"DM6*2WjQu^lbdh4O>YLiG2aYAQc&l6Z1LH\^La6cjd.W^ir;O^[S_u@A*HQVOq\r%N]eNlF2hjB2>]0()PTuL(5^2JW;W44l(MqbV#EG@-k\V'Jo=M44ck9GK'1))r<Mc(8dso5n`\b5iQITu]LTB[o#)piI*kj\.^>i@\r%+:f*;Y@$jCqU^Pbc'/RLi4GARf-Id6hD_$*&2UteW/#/W]J"J.8IW<;VCc;9B%S^c<[!r.9Ycd>)(lG<U:B0uhL<#H[6OHSNiud_\r%WHRT[JLPuUc9R'H<7HV!Fl>ar&G[!Y#P\rt+[/PVN!m?cc<bmE6<AliK0jrB[(<">B+(?[QQq2OOML=DaMeKAV]Qfnee[T&op+56\r%R6h/?;TE\i'>qN8X6%9d%`2<!.]OhhNN&lf;+41@BSKc7XkG#rFmK#RZ,rS84"C6KbEZEU.AqUU9&f;qmJL@fbR%8dAZ@7Q5$LHU\r%&t;W7$"%(99d,9IF40YiOM/!UmofaSWY4;!-WHcLlrT5r]k4FLa;jL?e7hoWq1c!'GlJt?=j7>Ap$=kpRIcA&,2%n?0L&T$/?Fm2\r%8=l_]4Y1Xa<m:Zg)lnbQ%^5dkl;(FkT3'ZnZW-[.p$hL.Lhf\4[sIi1Zn5WLr$-7!Y2oJcH]Gj=4Y3R\F3AL$r'^4^bc+?;J<RV0\r%@,tbX9$-u(8[TqIQ'YDp4'"AP,OC<Lfn[EN-&(IAGH>\Z.'r193KuVE%agH?o/g1ErdG=00RpCOEE:&(5XolbLp&lTbb6mrFmT&n\r%L#dM"T.SX/>/tjH&sYsJ11&h@X>RsC-8d$]>g+QYF/;VDB.NI$X@0>eD4!Op4oBK&Wko,@09s?9>:VQCXQjMnWmjgB=b"-=pO#F-\r%f.=IRG,jiZ"Sg8KY=ZAqJ4b0>2rnF'q\V`dkrG`)Vb[YTj#FdnNDBm2'W.'*P?7\Mc>ZFbThs!R;ECnT*/$3E2[bDehPg%@Ku3tl\r%.S$^sgG2s/TqN\2Vn38mU3$!-=?:SHe,[So.VSPccr'K,JZIRr8&)@9niE>BRHeM=W481iY$Cb?/RPM/dTKtTg/6-p@K#/eCB.up\r%pP#0V4+$[u.=Sh;pGD#tXa*u@m%7W6XELDJo3CY:`%nsrJu+CHJ%:=02?5^3@SY5tW[e]GR4?@%ku70N<9GojmIE=A,j/Q8M=&Gg\r%+pG5C&E_%!K9*^uV+"5/*&]:=DcM-V$]YBDT=k@uAkc!2QrfG4"K5;=H2[,tJ2t$FMc]4NJ)hSu$(^BD>Kd"@N?DQ]/"Zcn^]/<V\r%;fZsQ>Nbeo;nm:#pP:,E/`cd(jQhRo+CCINQ))s<8o%kue$WtY.Sn[.#Kpg2067b(h4=cmjtcm3'rQqs;t]VG.f](=h.,U6kL%7m\r%Q?G4KS#36,b[:@Kko+FV@)^JG*nV30\hIE.W(fO"`o!8gVgcC.Fn,$gkmC(CiH/("bG0Nt^@aC)+nss6?%&]H>Xi"B%Vn"ap7T2!\r%p'-m;W]1Ee5#-h9WaU%8f*XT--[QW5f_B:CpmWMIcf=))Qd2V"\2nbT`j`Zop1/RKg,N/Hr)4?j%en;B,ncO?frO,.4Y/KTIiX<W\r%`"Z*]&X0&\]Ch)[@+r*)q;UE2/RbpSO1ZN7eGeXPWV.>>;Mp>hfT;[Af3C:LJ!m%$TL#^nLrfrAq%m!4HMt7cWj_$!dbpas)7`cd\r%I'SP[Ak>3k)Q^TlpQMGi-P=Yu/%I9u#2bXkICh?24KnZ=8qX=\U&DU"_&#&\Keldp>T.u&lU^bWI]t[(,h>iJI=pXDB.*,]UFW!W\r%9[2f3[0m?+T0<bf7X@_/,M%dpO7c+FPM0d.+'V`1AoY4f8A-Y3\&UQ#eK"'<bKlD$G3!i[^RM9Cp!9X]&oW0j=<1**r1-`eo6>5i\r%P$cH/[L6]+bpsZ_]!lCi,0O=Rc$$OV%/5D(^:R-?@6\8gRssK_,]@%V(E$2eYmhH+T#U?Y4?nQ/j!S/"`g+^S%eucXWIP%PXaGPn\r%6)RacQ\2Ro%eKV3$?AA;E3fp9EPUeICjPtO0)2"9jlH\1\q#Zf]&nU@-"RG(o;%-5F?'#tV#B$s?HUU4o9O-P^V`+mS+AH+fAu&Z\r%N.:&VP['OHV#JU(obVKHk.G`LBQ.Zc9N_s/0LC(>;"F=79<,\rSjE20Q8ur>\^R7V>#K'o*BILA;1[F7h;>4>^/i/KZ^(43Rc#9e\r%X?W]lQ4r2YQ1`b0Jo@Zjs)qDH*-:>6dZ7E4?]:1uX=F#-b50:]_<7:]W%(oP-5c_KY3N#p2N]OemF(*r@(D_6S`QcMJsCfPpLgOY\r%j_BD/IdQm]We0>IK%9hRmk%PUEm,^,ntT4$E](\'(]2=S?o_+Mq`e=#/4U&<*<+?c@(D`a9+q,.<Ns-SI_%$(s(Cdmf+LTbn.fmS\r%.f5N+6$<kR#`G@_\?mh1+Ge1Mhu@mqJKi0uKIV<1Hh(g@l#)V/PuD=pG;8a.2J*+GqUd`VA4ir]7@[aj(V6^+7@[bkqG^V6.lq[-\r%XC0NM(c@61:IZfs<q%;.YZ5#XE`TD%?BSGln<u-@9!$r>SD`qHct!;5Jf5PKQ8HJd?M(\N:DGd#"j^L[a?1*`ZE`mc,ihFri'hFm\r%`#X1,<q(^]-CAjaXKNVc0'=#14(adaCn=jI`?Ek21mXXY;",f<I?m2H,S[nJ=*'9oSlo/p=C("-BZ6Hc27M4o[]L-[imjB+8?(-i\r%2mKn2X:]W\H#>@amb$$YfV%)T3HhZQDXha`O+FQp@;bTGpJM+[@e8C7eJS)#lsfSA@KWX:5M3pUe(iq#B1[aB@e8C7Q#&b(N8&L1\r%@Y`,h]@]6TGd2J[C3Hk-DD>.okYc<gGGMp/b;76lSt,A=@MbNKh<A(*EH\U4DD@\@GoaA=4LI)f/uHc\2oZ=_`%CuFmi,gSS*(R5\r%SKf(_(RsS'Y@.eWYpE_b38_6bj7AUsCl+.H3_cl;c#\ffnm6eQN#Q3ar`FRNlsfSAijJaadbePh>J/*#Go=6H4L`rGK6pT=[>%o`\r%c1u-8]6GZ%>!L=(ed("$=W^@ung],DH5pM/Q_,g?g)O\)T(V5*b)Wlg.2j2fD`mP3Ce8pmjWD&sk/at83Q_ha?GW+NP\4b10:"A1\r%Nj<)IOGu6B5P=kR4LSGrh9DZ^[h,0*MsEJG!e)k%B/W1>>j!QbH-I=@,HgV>1_^%poBOF4/["\e5/3f3cq:II3V8tEY4I8$Ooa0[\r%4o^3?f6M[J%Ye6OL$kee\]u_Ykg[,f;l6lek@.(hB8_4d-FqF&3P;`/cI6`<b=^N>lYM0l\H1<-IaZDolYHXQ\H1<-9$ft5;-$q7\r%l^SPC>j#hF&s$!]>j$B+0,q(c->._G\^&Y@=c0\a^ic5(SLM-[s55qBFY>VmFZ+bHV8.5F2VpD8A&WS^%N$!BZ-qVm:RT=ZFKI-8\r%S_(/,WGnE+9]u(oh`BBBU9CLeY4Hb2^:6h1_fbs=[:[I%T&-G,V'C%dkLEiN/["]0l"mT4[)@*q`(F6PK=pi<IgM$s$J5+N"J-Xc\r%H0K.8.bE@0g<&J^kLgMT<a=f0oAnSOV8RMR2H<l$Fgg@9]KrYUmp&PMlTBS?-FqQpC%9sl1H&*@`HC%m"i(DqfpJ)ZVHi:+-](O,\r%c9G@%$.o"M9SjeAH+k))_f]:h4@t1kCd`\h1"Y)p_YiBc9V(K3ANDnXm't>JqZ3[\=E0muXZg$nZY=i:93gXoJ$pIE;r]o7REc!e\r%=A)o^'fA3EY4M9\QYYDnc?5^f<QBBW%G,l_0435te)EDaIiic[bdbqKqL+6+k@o*^0]Y8jDg+ZhS2/]Ab&fOn)n3t4So0QqN]@NX\r%c:b$R7_$`.GF543kL\=Ei$,77LPlYGGr;XJS<5bn26UULj$]"6YB`"+H/=D..^+-j`PK#[iACj@ZC2dd3kXUj8li8!LKm3Zk1-Qq\r%WMf5t]]RbGjs?V9VKpE:Y,gK>)"JA!^h[9$CB!Y<]Etce266PBC\^H4k1-QqKhgM@Gg39Rk+KY.%]j1uIoAD^LtB:U"EC`QIkf,^\r%?Hm4C_FZT$CL58#?@j.Tc"gWKB3FK9CkC9O\cF"T9b_ish_&dIX4]OdgPdr<V]t?%]]RaHR`S6;@p\cQMu2@*/Xn/WjYa6%X)W!e\r%3Nq,cSDQ**H-'Q#i5N55YBfdLkOXN^J7AMJh=Na$]2#l0S,oeoK@d7(.2k9n?\@];?Nu!Fc`Nh/BQTABE;.P(@81/FRMmJ_QUXUh\r%p+lD:$/).P6["TMU4_g\N7)6<9QoRneha3M$ToQ_CP:euH;(J&/\/u%7!@DIQ^1fUR#c4B/V?U\amnF/D7f.bng;+ZMmb;ET%95&\r%)cqZ;%/e+6156<p;"ZCbU)+RbE,AK%4WM2<:(N8Mfdk.+57>\(Q',Q6W.?_L\=6(+=I&\F9@*R:DeH6Wj=HTtr3EMq1j#Y#Dqq%?\r%Y(%c7@_E>6_otHcN(B]p]"!IXNe5*YeM-5+:D/YK&5BBj(QeSIc]aKF]Gf"'r_<B;Y$gMqc;h*i68h`X)Lm9q>a[LEEW6#mHp,8b\r%7fEuBCUVpjoZOO7<aW5U>4)*,;d*W\(oaANQGr1\T%Puu%Fl5`!rf+2nhnou;\[LIP2Pm^-ntVl'3?f1h4(aPB=Fi4h<XXh@mk9E\r%]q_qpNNhNZjmq)\hSo?KZYof2<<ub,H]4mP/13:#n10c^f(**Uam<lt_:*c-D0h)RQsVk12FDdu7bH+1]PH-(UE(sC^W\/hH3)(/\r%KSQm2G4^)m]hsg?.X(Hn:>CGVZdHh%KJd/a_q?H_(Fpft*mX@mY`'Scl^225_jQNW^cE!=UQ:C.Xt4oZ06q@uf[19-1R^jo`SqL<\r%$CQiLH<XFkPi`=@A^6Hn$CR&S0XG6umS.`A^!?;8D8R8[UCp!Z$='+ZTn.lM%W".BF)J@oc;An=</Uns\\f^R@kU%hI9,jSE(S4m\r%f1bc1n<,?\]be$&f?JP6!6alC,"DLL<oMmNKkpV]I4ed>9bkfmF9X,-MN4a=P\CD=YtHF.oUa5FL[4]7%k]O'V*[WE):hYi_m208\r%Xt+nWO=Y;ajh9f>i*N?a,iU+%LW5`mUK\/Y-/'AYAPn?Dl>V/</WWEFTpEc*[0X0FK^1]@;5:tq^T>ajL.?($AR=]ZmP*&R_jsu\\r%oDRXi"o"HkWrQW4foLgKcbSA``Jg0Ce'T<^P\(:q_i#uj6>9a882g"BAtsQ]IT_`l`[>@`N5T.2h;DjilV4n5<0>)-pU@3RNm/c'\r%T`Gpgg(8]4IEOe?n2D73N@k'fM]VNC_sVZtUHX%!l!`2:7'2,[GlD,&bkoDZQ%$8QA34fKV,fK4OcfEF.H.s<.45CpH,4UP.](gk\r%N5W<AE_L3(1k0t[TDW`HB\]_>=:8)tB)@!4?ifg;=$%MJC31CZHUc`OEa"=_AK`)_LVf`.#SqfQWO5pKIFJ2Fjp*@OCRm1anB=/*\r%A"qPbI%IB]X?3Y%J,U9c]NWQN77oA,WPY%N]Y<)SG(8eoW3`.>F(W/;=fU8/Ch<e4UW.&>aV4PSm4=P=2H/qS:D5E]YWl%TT,2h'\r%b&`_rBdcjNL#"V,,3C_nF6:;+,QTR]nXWTVEe6A90K`9;rH=g:#3qW)LOn'oRZc,d&+1""()H/T]O=jpqM2KTS?[8.c-O6l$9gD;\r%Jlct](T--Al\ZArpDPGPN2!!(X#=C00&hc*DktPBCqUb8L,.'@N-c@9Rht3'6d/;IO>+iD>iN[_Hc$dY423;!/9HuX_X)rbnofRN\r%]1I\@gi$HDls.^K?%@4>UUngX,;E`@2Wk0dJVL0ZS2u+a@>B,`lh_X4PgH!0Y<J\K;-itmq\JP?\ZgXncZ"&]#Pdl=1W?(d,4;:o\r%9=*r9ZQoX1!4f>E3UdkG]QC3h1_,A7OLLS-agj+7\k\jM*f\r(2n.WBkU[/?`^M@=iq6MG=f/LrHgLX<lC;U07.gY@[P1r*EGeX`\r%:-.pQ$K#V/bGWmE&g'#a(\4cf`KOR,Vc-V_LTebi4E5U_St"?B_;/fuH+]D@T=9:;c217(3W#!(`hs47N?UR33TF?@p;>#@F-uD\\r%::?B_%V4pVMfmP(qpL[UHKmO=n#Cb]eD&Sm?E^6mn#sM'4^R-XE4Agm9]mGbQ1)WLg'MbjUTd^S8^iG0(N2D`fjmY28+rc#3'G!$\r%h/WB"\9C&seoj/MrGF!Q\sEMUoLg`s9[k]tVo+9;?IS=&?Fp`eq0`!+jmu9c$=>cLL#>\.'WWh"1?oDFg>hQ@s6E45nYa@b);f\N\r%lgnceq]gUA9RZEnTeeA%44s&mf:C_9heZWkq,UdIkM+F=LMn8[:L7C82=C/)cVrir6hoj2oqQZnIIfk_Y8EOmr%GI&o8n?J(#M0J\r%@8F)keQ>%_G5Zclj*/*fNh(r^8&]WKX&*io4h,ZZ@pIQrpXjU'pLEVpkPdeBqIBE)X87LMSpo&gWPe!903fUT.0mT.lR,IJn!.,]\r%5.f#LD1J8?`!U@3o\7"S4"j\+.65qL6$1!Rh;iX7,YbH)0s3'Qb40n)MB=L!45'8>^/dUP7??[0"5<LCekK'5AGNl9<qq'W>N-$u\r%lKE)g)<p'b`T:HR!tQR5HM#rV=t!Qoh]G<D\[(cC4UI(Xa)W5-5Mg\?K9u@$P3Yos)u/%U-lLsn-7OOY*8+^%Gg#t:?bM0ff(2-%\r%AA0GhGgB=7Xp&6rppTjk,JOc^]s-g/WP.3%-#VbGIt#>ZZk?]Aaq46ah,!%EG-8KJA\!$")Mmd)3(4MR/H"=$.GJd2<b4GBXp/>?\r%W=8F?0k\1d].WI_!duA@(>:po[u]=laaR?@Gg@bF>\j7eo&DsHn5\'l9HMJmURAlRUn=ij!B'*;aF!ShOo4%oko]"lH#Ok>B+l$H\r%`8M2sT"KA6]ZJ/H]L+!08At*Ohc2[[m(19#a"IQ#K/EL2bc>k]LIp-@PFf^p#Dpjkf2n&@p+#X43XTJkhh5M;:M8I@V'FU>CqSoD\r%Fh#qaf8C;^pFu%fo.IHGG]T]DW&d/G)$O?[eo'3\?26=$FUPB]bcg_-=#G"O&SErOO6sDDf7A&Cj"Yj4n\*#_c-%Q;hp]L<O/`$b\r%oZ4STX7"%#DrYD[j7;')[Qo9Z=\H8WjBc.%?6A64C&(6c?_9iRa6]RS[mBk\*V*Fo_jl%><tBb<jS'r.O6K<>o;'86,9Qr73eH*7\r%`5WTHL:j9t139]RT9_ZM>5-u%#"e:I-2ZC*]CC*[CV=t=V!K3$j3p&:+tAYF.W=hCcMpc=r9nU`qN!S,]DZm-R/RkVC]&PS2t[oW\r%mI.N3mP]1[o2f244bnnXHpagHp4YV$pu[\m?2]"Jq7'=\`N4F_G7I\`+C75[HK1Wah!g%3Gk'fL"S^g.Sc2IHGNA`qY4i1)C7fRU\r%[-ld<k3M>]H0s]h4R`"J"-L:l`@n>49SW$H!p'$+7pZr#[(<466^%-7)O6)Q3[^Qps1IL^p00NidqW5M59pb&Rj_QCns\e6kBDMa\r%cfF*Z=q=b-iU4a9'F)r4\CTFV\Q4M&]\5dLGN%f@`T)kB()0[0eOfK-,O\Kpb2jKomHbmgW/4.'Ysa)+E69OiQNOaWBLse`hqScJ\r%WG>fKhEEEOm.h#op$W6n#+dFhZ\e"+GI]&RISCTUpO"`&4T$AdOZU&*Z[UpS17P29S6Qj)cc=FgorF.&jo=P0>Ig%u0%Fu^kA9Q.\r%i#Sj-p_%lD;Vk6S*P&7.ZMEXbo+E5p:f[BgYNbR0+=2KIQ,2pQZUFiR(rNcZB+fblG*)@poa=a\5n(Xdj_?C<V'PcL^:*3P;ej?9\r%:$"!&U>oJXqV?qQ61GE$eT1sS\aP+Tq!a%Th\1$.pL^daI!pF7P>\;m1)CeJMs'K9.K9`8Rgp79FMJdIc*pI+4ZO5G]-28@g91AG\r%SGK((s7p>gf:\p]ch!R65O^Z+P'\%-=_5s.]Mc=:^10hba,p4l/tMEDB.$cYn:()(lI14V9#4)TF2)'R;W,O7?S3oIo/3i\rlc6F\r%_3E_/Q&_'Q3Z2\qT?*=]]]o0/iN7P.Qu$"lB'<SX-1V5qK=6hg/X%i1b^V54S*s1(3h>:VdiZ+AZADrWa&"#kT+Be>S[X==hhM=3\r%OWduX0b9lf5B:rip%*"t\`k(%-0!t^JU0D*WojS=[iK_6VQop[3^$Ias2<mtmHd1>qRc'FX759n[S6'rqU"cu5B<%PGR$.m7ULF'\r%gcPGf%sIIPXCN!>1e+k7`n5db?Rh*AXs3ZLpuA;)`tIJF)6r^@KQG'".:0%0XtM8H.RbFsW"<4q[utcRIW.E]dn]n9')MPgRiHm)\r%E^n,[jmVp"L[)"V^8m(Lj72otikNP-';JLf6+H]F]UZJH,iI7VU[WK`GC7ftn</N3,e]9=GlLT#L)c;%8![m.rs1K3r$W[n@1c`c\r%-`6WND`[Q(GThRO7_Ri:7)=64[oVHj%`@.hEC,$g@HS0YTBC:oZ2c'0Fj99p\A%doYE'K&H>qF_4&#Z&2S3?[jg"RMT"Bo*Nu'?f\r%B@4K>@!g,i';)\ZaY'BTL,5<D)I6)GU8?r_gl&^pk[6U]s-G9J\[U`1WJ]2dS)YD9LmF>o?_#'F#<YcWieQ+`SU/9LZ4?+^q$MIQ\r%FGPi[,ipX=T-/L/\8Y&^01'_EVZm!\^;KW?j]%bG%%TJFC]*ddHn,.Prk$7l8Erl`'+",JjmlDA_&L/XKnT$FPn/Mn:Qqm\?V(+*\r%_q5XS8*-'2k7>-$gNQ2g0_2^5^T7D+n42fSr@L2*7lh_._6k(d=/gUm]Vth4X8V2KK>(D?KOKf<F,p)\06qL#h@#D+M4a^GNt[A?\r%n*_8aob$6f=E7<pM-=:HfRpZ\;hF[jEG#sH9<VTMI.g?.R\h(AY8WQ,NU?"LGVuh>pm)noN_WmIT?=Y<YjSdO,IM+Plua<2\&ZnW\r%3#7S2aZ`+?Er`&qm[XuJX3LmQb59u-no6pd0mRrpgRh/7$U0U[E2SC17QF:4J+1)MjP+=6.J]U]9m]dK]r,57?,Th>4QbD#@qXm#\r%U"Y2>=*EY'TlI."s5lOR-(k+-WS6C_DJo1)U$*CW:NdS\>$q6t"0BM%C\I4[r'@6N_-\_.^6s5$VRX&JHd$^6,]4R8U!eABI@X=n\r%&U@HgX8_B6_pZpE(-r;YaiPp%(NQYp;DZ1-.F_Ac7Z5PsfsNng)MUa&g'QS#lTN&X4ST'R2u(J;+'07-mtZ.gkbl/,aZ`^R:ZYfA\r%i=E$@,*R6h:E9Z>-mqX*Q/>RkqT7utbSs&IL<$kXX?:ans'Q`!Q;>gF?C=T\Pk!"Eeq0fJ:2A]K>[h[J?sSe6e,F-1qIZf2S#S%t\r%'!K^SUZYu\(immCQI1uRCB)s7N;)qs^Opd!LblS3H91[J:B(4QQZFo%.L]KITi0"JJ$.`#Hp1DjrLTbE*aZlUc*-BeY^lcM*07mr\r%N"dGr9%F15c`cR)A,+!$Idm395jmagKMU=TO,XN7P/**]dXNAJ:Ht`D"hA:4/G.CiG\oLpce&,2:cX!pdh0(o^;?5s!s-+hPiH[D\r%%<[&M06URsd5ULXjkFq]2+h*7Np_7>:%^riWf+ur#h<0jL[9sG.$8;Wj77'8>]tEi>s-Zq2%>%ol]H,GX6I:pCN3sQiG5GYG9Q*4\r%k&<%XLq.)a<L]WI5[NYAcHDAuN`_7`G)3crn#N'?k&[eh3pF<kV7"VRp[TcjqUk2Of$fLDNTM/;(7ZX=fD"]UVZ$9'L0l:p5m"er\r%_#NZO\t!nU"79X8!$b8^!-7,Ho2QQun5-%qof;(kMX;EJ/#lYl'fPKl#iBRWbA]fj^B3X1/de(j2T,:&=$6IeR2bSUFig2a3]-[f\r%=I5Ed[`I"E9U;m2>+cK\I+Et1)s&4dGX'r@ZNe'nn+USl,_(JQ@"q?ZB+Ma(b`j7-Y;Gi;:oNOZl/Pj%)dYEL(=EC3@Wae\<>QTD\r%`9MS$Zbrl%Lt2#LSgSFt&I[U7-ctb7/uk=d_F@=spP!K><Z)tr;H\gdA\]07K7u"c_cU9%\Rg;<TsbL5^7W#._a9;YY,fa^`oKjU\r%P9#$[$l3;i)&D.pBIq*Wo5qL0/B$=!?q0!4,-jt.`988X2:U/2VI=Wc`qpVGKpZ'KZMO20@W!()]$Of?\Rf`i9J$BS.Kj3IE.HXf\r%a1jWP(eeY<Wi*"#VeV!&BsOV'W[D]TMios:</i9<L-E+EW^^7NP%7;d_tRAa<H>SGkBtU(i0R]^:f2%1X&86Y51DmVqJ#*Ja2-H`\r%l26S'E(/)J7Q:.E7m32gFZgg+Lt.cCZ]fV"j4j>kFY_uD"]go4T(%B\oU+tQ2DBVo)+ct*cge%S';UM3Hf5d_7"]q4=<0&e1RE%#\r%fOrRcV\8bW._$3u^h`C_:JXXQ%J43FVtD9:S=6p+g6<'opuFGGRj;'X=K0Y<QCRLD1cIOq^`Pde*K.leM$JfoEUcZ\@9d"l/7-H=\r%#Te_3nN*XWq9hVdbMPJtF/UfY<\#L2)W&Y3(1M/!8B45M+ft)cjq_ED)<Onf-nRhh#WAhr^+V<`,ZWmi01j_/;t]=DT3:\V[N9HB\r%/;mSmWc8NTH1@==EC?8WbJIp73kC66:q6*=9q+/qq:QOe$a?D-C*qU/fbUc%)/u0`@3K/Y<(#!#&?OZ+6I:(E&_g3k^9jqqSY'ch\r%8sTJu%@@p7jC9G[ZRfG)1;KAq/0Y5,#,r^JF'"/<]h.aj:*i73l%u^P;jg>_1%k8-j?Uui\U,H%j"p-3jic8ghpXdh"CD:lP_Z$`\r%*a[>[WI(@PO-Kc,Z\Ud"QMTZPhq)6RZq0[+]]'69+rM<Z\V<+gG>.FtS-'b62'8@(pF?"R?1r,IIp>kinS4*]KBO'<$h9A/DVG'@\r%f_oUL7N'0,^/#g-*314BrJ4i+*>_r94B@%G?1\m1P,Z$8>.%g=ZDq-,<@_&/bj*aoP:MN5lOQ3DZ#q@l&-@,G\CnQTe#?QLjUs[1\r%Ap*G3`?i$67Wn%(>af'Z=HlGZpqD,V;@XeL`6lAF95Ur--5A),\omj3nQT,GX`Gn(8dc6lbIO+Dk]8cC&KIDNh!k(?^=65r-Jq.>\r%+m,)!&M&jX6EE1ATX58Ob<V.=Q9.)mO"*T4FIZ9keT)e@MU$gPAj_]k%.U/]Z8P3hOs)02+Tj`6P71lF2Jt!3@+Am@7uT6WY:eqp\r%AU$=D]b#8.n>!<t11L)ZC0eOba`7EF>$V_ENtlo'44uupOR!XW9Og9hJ)$)XE`+@'oA&AZ^dC"4\Z=>]\W:1%2"na[;DgLcXB^R)\r%o"5+W:fBdDU2qHf]$H8\NI&h!9_PQ+j&mHdFK#C]7lDs!-b2TLLb-CI"H15L=U%9m1+chS19``dqtVu1/D(`APB@JKfut$e]Y(E[\r%4YR/ZHj]`8PJedU0t.SO2jsM/YW.&8Rj$qiqihitj.Q_^X)KJ?S4*bAZ)"*[!ftljp=8<;C59u[?Z!NXAhY02crJD"i=,G1$bP\G\r%k:$Jed3pAWdWJ_!$<Lr`S]k%>T#j0uhWAO[Li7r:jni]9&pAAGGW2?GGRq+)\OPRoVF7nY=JVf_^QkH+0BS:J*2ZmGT29e&j<RmW\r%NZh,mA0f::T[/O&gS`S+4g"GJI:47VlDRt(6di'`KpZ'KLPs8@bUipR(]"LopG"FWUV@@]bM\al#d5LT:Z-u'j:PYH5:MKu@@pS=\r%2Jb^nMq1lrPN;H5aX.U.T2om=&3cdlbS6^XQ1TnG30RBPY*$MJN'Ss["[?UBf]7#!C*d+HE(S)/\u>FB%d"Z9LPn_S1"Sto:n4E3\r%8hc'fo`oRKQh=Bg.)@4+:k7\#Qtn!a]]D'AQ=<tgog1E@]"HBj[h<ifbIE-=Jup%^;@\JI9dWX/%!M4[ChGFu\RD_*'7Gqdq*\XG\r%9fT'r3>SFt2Q*9"j+Ri'@o8]1Hg,WLF2XPu%_E]bSLA<o&4=I!(_jQDOilR)lKT3T?oV$9-j$Cs!Ztcq\<1dj<'g.,cOJ?+"o"u8\r%)b$u2'EJ\)WWe3o?BO;a#Z@QE\^.IC2MtnS-j%K7][#@+UKMh#/icc<^#]D\X0!h@r[fN")Mu9)R0?4t!BbJg#WAKkJr5^R+rLlE\r%c?$0sWc3!_L;8thl-mt1)$G-MR0C:@C"=Ao<)T&)\3f_Mk]8qGYSt3^kR0J1RhSUW;dpk50NU4G]lEo.""WDcReX['iC($Y3!"#K\r%H(j`5K.b.!.!PD"Q>m%MA)gt+LkGAXC=+7NeN-(c`H\,]QmQ56R:/.RD_JcFbV1&g3K7o[Qju:GKGEd-;[C_dVJ0M6F2`A8lX5P5\r%?k=tAdtGWH)5cG7L`/.mWn<WE.#Of7TZJhKk*CS^oeDnks)=?71(gG3nX7MNQn-E56rt#7K7P3qmWO!B6Hh"`eB'6W@W!'t-7![L\r%_Ks836/_t:Z>Lhg8R>4j^HQBEIVI,92kRnj?T]'J-LXMO=<H0TfY</n/`\BADKl.E?-dpA$(]4-!>7B,#,6%r?n(,DodI"0CL,Bm\r%h3g^56Jn8.MeYD^DkdTHMBW>?pa]]"!iV^9@k."G+j0j'RDhM:/]5%8/BrlNZ,<f8qE\t42'SQ/12KWE=`TE0;,g=\$K&&"<>O+Y\r%@guFm`Tn-?>o#<HEa0^2RVD]<N->l:*a]V0OV,Y.<Mp$;f.2a1+%ghOYR/Xo=XanULJ;;TAgo`T-=/SM2N`5eH;;M7LlN@&qf%\8\r%;`^Kh?="bl/p(mh@(2&H'tRHYKeIeBWoT,PMt"@]$0^W"<b2R'$J'5$gN&U!glrLW+8%LJ_IAt$bV!SH3S9jZY"9:_;.K[i+>XKN\r%n;tiQ.hK]-ejQ7:F[p02NcG0*?.JLn^VuQ&dY*T(fIi%H#i=sin/c+^.F[cY9@JQR,%-BS-r^Ci8Y,_c?[@&0),1e<%$o-HeiUB>\r%`O7uEZ'ZkSja7uhq*?EqoKc+5L.3-T'=Mr\VTS^@^@Zl<(&^5E'.33A)b"-_?[F&DfWRPYVq&la^;r%+F4hsnjb$Z2)$N&NF/U"h\r%K&(/Fl[^UXb_b%KEk[eEfNJF4e0=BQmc6s%^O<%k:rJ2L3cVHFYgdZsh.!YkER66B?+hRVmakAX/r;MW+L6!k'QC:s6aWi*d3SJ^\r%aW]P+isS1-I]m\LFL+[]m#=j[3@a<8n4X\Y?obJLg/17F4`WsA"Z!NJLA`\#k?hT4Q8*\caDkdi@DqJUDaXjhDc2-[6;52\Fesr^\r%o6sk`n+[9#L&.tp?iS%:74H(3U/J,]o)8>f*ao-S6'"u)=R99dCa[D+d?EOI[VF8l4bbpfEM&KjZ?K7VU`UZ*lq,8*?"\7cLY&\n\r%fN(V+Y:m5;@]Pis_5hV#_tFpA)3>-5.j`o7'&OMjBt1*h(A>hJ"GN%<L/`S=mVL1OPUKL'Kl1"/'g3JrLjTc?ZmlaopOu>ek%r&!\r%V+SiGk0$(9,H;uq.t)Zu7iZ>3EiV.dIsn0cs"s%_Me^h8'7HX>R_pF3j5,3X+;CMi)\1?jXDaT75/(AAWSF_!"0^>(1NYC$Vok>5\r%=j:OeD4<7ZBSR`</g)^&r.4'i]Ocbh[ojK3hm(Td9gG8nf(S>9#KtWjC"%;]OX=I32JjKc\_DFa^O=2#!pRb=#l8kC`O:*-ggC<"\r%KipVp9bU@r1$^3g`f&BR3Tr"&)+l0J_fki+JmU,9U3BFhf0ZLWN2DGgar+^Cco<N.oFo7)Kau[Pi\C'M;0[Glk35>Ak8dF6e4Cro\r%EAAmWdfdSsZ[QAP-4g@*Wh3B.0.`og*8_Dui1[<jHZGPh\ogRVe]^:Pj"ZQkaf:u#V?t`>EgGa><Bl'7nKUQ#M"a4M#TfQ?GWPt0\r%8UfL[dQT+6SY*"u/9uT9)J:Q(9@<su$fuhhn#JOs<EC)1iF_iT!&75f01,.\ABn-,I$to8(PX1fqXLjJ9oPJhS+RH(&+r%D]S(a.\r%oiO5)lft=dF4m`R0s>N;L-%6V?5XF62iJQ*B`e!=/,dC8#A_&;Qe]\t>kC#].A>,B3EeIeZJA/V\X/<iKdLoJZ/\*\le[D4a<cc`\r%2La,2?m>hJdKEORCo(MKa33UI^G/2tEM=ihK<.m_Nq.-d*=3YPHsBPZ5;MBM"RKW7AI(hqJ9[dSMmhhZa;CZ;Mmb$.3+`fBHTq*+\r%[>YI/GVK:RMmKq`fEltNR7b;!kDEH'(M6RLJb3M\^`)@WQ,'sg!A?n`V-p]@g@IPYmU/ZH''DA"fT<Va1>qC9m=g)!%[J9,5pqKk\r%;3R.hGfRr5&+tXD>D>^K1*4A#O3H18M_)b6TmbCD#iS0V5lcH]"<1D[Z.4I2c`UZb>eqIG`GkCJMX'Zi!FL/.%&*&:qU0W(>ffs"\r%J1Lf*5#W=#nhHk+_GZ+r_F?I$&J>H$U]nN78pHZ(RhDa+B<ZJiYbLU/,>7Iu2=qBtLkZn\npa)Po`#59)8\CY%`s[hUi*='a>W40\r%]:AWUo75oem1]hk&amWie#:H&fr@aNa?naX!p*<9a7h_M4Dn#!6-k:C[eJ7Z]q6u&AA;%X\j[&`7!'f7HE[e'Kl$3*VVY*758:,F\r%*qDYa,`mHlU6e8"06@DLbLH\Zg\Zi5pQL@cF_XKa)_,f(XU$D<(<iBYft*ptl]1Q7Q4kn9+:@5bfdJIp1N-F$/QM-:&auWM./Y,P\r%iQK(IO7N>h^!j;I`((=a.>+X"AS@0c"MSsqNUu9,o9$#5i=l+b+B.a,_P85q.a9/Z&P`?b.4=i>aZSJPgh=.je+UGH%XE`@_L%Bo\r%%daVsDcO$'Z2@a81"O;/\+`82&6ERJP"`gF*Smmd-nGK3)eJrLLtj0/U?]:cb1$pPJk]bnE2LQQY_d`9cRbFj2N_Pf4%^GqLpj0J\r%(NH9NE?R;@VH--n(D70n9],B^ltRl&M_U'HHjo^'[NmK2$kCmhLr^8us3:ohQ\ON9Mq>^e>0T\(E\Y.Xj_;-db=;%hTfLJmSbn4^\r%G>E2^#nrfGr8<DddqU)O*2t^PM/?Ff)Yb0#0SjFO72tfmhiif)^=H%.OFI3@i&td>NjuheZgj>c`*7O5\ZI<DgE/EgDKaA";%NoE\r%T7#UgNC8#.]VXl_CEZbPF2Q0j:'ekr3Q\BlA7Fdb?%t?cE(2_6\4^:5]TVFan\V_Z--H9abgJgg+S\hA3NYd'5`RK<a0Yf&e*9Zh\r%2TAV)prAeCX7qcc"FFoTc6BAp7b"6k.9d++b=^^/k-N(`o`H*,.VFq5$^H\7]?8bui*07a&&F/#F_KBi;9[,#A:_1o]<)3R8-qC(\r%FIb?GJ,<PD+m:upi=XCtA['^9[]'`Nj<`Eu>>EP?IM@5*LtOhHInN:/Cfef[cl(X%a^>E1pV"S5$:W6@#MQJD@^(Pm>L5Kjb/M7^\r%)J$][p!DXa;pfHo0ij`GeCq#J3^=C-,H2rsPJ@,JVkP_VeNZn69M\)1YL,rjPngl3H<g+2k]oaV\PJ$QT7&3#]i.c\aS-W:R><<O\r%]m)bdmd=dR6b_-S@(07S_Eq4jH)+H`&@5gKp8N?Z>r&U#-1Gbufa'a/n&K?gaJ:S;fm"0XWRJ5fCprbCe%Abm@60kjK)@jG&:>P\\r%TZ&E.D(hB\HeGbn6Dr7&n`>E[$Em'"61N@0WBl=,AOFM]#+#/!2IU=HaOdl7V'T`rGTk3r2sT#W1,b\ND<kCE4<IR4^14*LcRVE6\r%HoJJjA)$jGCqXWlPm\J<UHi#HAr=uM^:*\d\#jRor$nFg?UFC=SqX$:g=E`DYAY<>dA6EU<5+(oQE;hP=U%uV[_b;,-R@:724dqf\r%>);/bq0M$Ice)4P_-.\3Hu.%qOcg%/2a?i#UC"&.+W6bE^4t0N$ah8U)If<je8fQA0S'j13:CeecMXDq9da<.\hFj'ZD?>b3F3O0\r%"!%oI,[VdR?rb4DPHU\?@l=psKc`+>-9eI<>(bI8=S2(#$?Q#hU2J*j9&O):&YD6_m#bFF`2Ce/F++H(O^"B[&O"3M,!K9?JfnMZ\r%&YJJU(b_s;imW9L:92WcA,<>p=Zj\V(sUYB(Ls`^ak*Ji_iu]_-!i.bCKMAt!Y?qJXEgM,Z^@r2:cD(-L/8VHeO81\]MQ`%?V98J\r%)7qCb`kKRCak%ApX<urU1dRAB`ef;@6kIj%o,hKc&`f<+$;QbbOt:?0&abLTU@DfulhA/d0uQ>\Dfr^sEH`c8VkTUtV=7\qq\A(%\r%pWqK*#eKH<"i]*DB`di5AW4-1:?'9G=KGrp@`4s2H<).(F.1bXW(5f0aN&8_5Ha0dIEV$C>@'LemQb'19,d/T^/6Y@bf8X!:&Me2\r%1)\#ZWAZIO`,6JH`o_d2WIfDK%?E\&BsH25d,`e,2saf5P'kbq/P6Zdf$Irj-6W$86BeOkMhNuRr%!aQMUn&"(-7)>MCK07GW.s#\r%ah8qdgRS$*Eo$s_*6N>HrI#-s`,UI'V'WT8=YcTri([g!>WQ"(`l=jUie?t$cS;%?:f+=1h`fQ,W%*QM'p4]>kC6;WYm#<41dPK&\r%AnAV/1`G?beQIo>jn\ln'&Of*@bgI_Qfh!X*Laq@YsJ^8"bJ$]<t'2Y3YV3#PC?s\"c.tg9.Ick@(2O<3mWF9*0u),C(p68V`!g/\r%F\-S"1@RDA.9Kjn?L`2.-hst<dm-BE$co+QXT%b#+(iWsL/%2-8$@^WEiVPoTi"TQWZE_Ch#00OX8fAf^cOpCR0"D9</r-D<"h.R\r%Uh5i:0uYNH"C4&nm'$S(cB;k:"G0KUQkUe[HU)]P+HIG96+DZ-*7D$;k#2?4QE7:me!,C[(b=sgRWtMi@WG/+Jko?9&I%!]8iVlj\r%6\&]WOutiigc-Uq'4WO[?s/!'EkJW?+b1;haLrQ-o0UN$N!Oan)'VC>(2PXnm<[H-I0Yq9446q?,p93V-gY>p*qbc[goP4NQp1*L\r%gEULVnZjE7+;SkdhVfR_h-2ud"CH=/kT#1G['hEY=O74C'@;TB-#q1E&MQARhE5,'U^;()BM#n=F<$?.'SIs?JYsg9eaoh<b<@R!\r%1"lDh%.u3#cC55g0P6$A?@sPDhA:i_e>!pQ'=6m4<_(`n]eUmRR>@2(7naIIb7hk40E`D<0nk??;3W'F6Nk(Ok"41O^T]#(I5r3"\r%-#p&G(V1h<a'>>EOZ7km+:/caGAeQn9Eje\/bB_*1]a-NZ[QAP-EO5<=H42@8(KlRm*bO=jK@cZFL)_gb>AQ-DTo)$XA0F=Q49=4\r%K!IGag,)*=IMVlM<78=hrpCpN#pitb>Wo&3ajl?46Qo[-SY!k5/49Lj<!n3uWC5,QZNsE2f5-MAD0l\6?La2!H+m6K"[l]UP`t2%\r%Bk<ELK^CM4e72&1`E)_9Q/lIH`J47$![OBRJdp[RFhY:IL+%BWq*Zh1]>XGtHQCXu,>c`f$LeD@@^_`VQIW@RiQr0ICi9M8_8@Zg\r%Rc[80q;ig5[[IsV26G.o%-lE43_gCgSWb7)('^es=75[gRb%2^[)B34F'afr[W#N$:&o"Ss%##m;Dd8:=-V/2O5(,F`XWd`*rEH:\r%(Ais@FT1HB0c&"]C#XICb>,+/<kPM/'4ZG-lhuKP7n#d\)*LVQKJO>#)D78b1dP6i/1o^+ZZ3u#mi09)R5BK\@]l>JMP(;mNpk#X\r%*'#E&E(jeX&MVQU&37fD;A$0_=c;l9>Dn#h(4d"HoWplgnuRill!!p+-Zkf0Kgoaa('-cSK$NsD>h!aJ.JW!+7sbf*gc)+G%a*Sl\r%e`q3,JK:BY)Z(>s$ZG=Kc@!@GfOkQXfUQ/_3+#I]$X1?+:7m/3&n40NGK#EQd7FYEVfiO+0m\hMX[QWrYm\De+:qKK%>"08Nl*a8\r%1ICRkf<hpk[]2dSKC>ia!BHC.1(E2=<5UdY*b-j!'=JYW)_HZeTU4bpSOQf01\Kt[`m3-Z@'2rF)2b-q59m_n_i2qonqu'`5Hg!s\r%+%l>nTLHXm'QudT0]3F8[0X\NiaB*s#*DM#rU;4#,o',[Ku*bWK-FNXJ1e&.!oPnrh]h;2oY66g_\:[+"KVEVU/p6-_'85@^=iV(\r%'+ia1"ArQB&St1"TY$PXir9eQ$#D2F/SPfQ,"gGIq9o.?_#U(BefnM!7GsA?:"(B`p%O;frUpj[KdX+4#\[rbFL.AKDKsi67A$/9\r%fE>">=0r73F/otTguOl<&Tf')`)b8g(4q0O5ud/FGSqFo3K*jSG-qUIY7]7\P;@'5@(l>jD_>"$\tcB/TB(Ga/PC!K]T+EacJA-s\r%ZMK\',t!Nc.=q+E)ta\P"6S-9NLTUP`ZM?>FNN<lCH*aL?0=HfQ&E76Y.cH/_k&_kK'e^mgEi'P[j&SK<ir#T@u0U:#&#Zm<J2<h\r%8%1X9[d#S8VAPc_:<$7($)`"VO]R4o>psH[MJi5h1jJ.6F*CF:[&Af`W0hWb.EE)nA`I;pJc^*gVSYT.R8M2L%"q+54pKo]6>6!A\r%./]gnF!CM'2pu4*[7*V7:I6%4;Q(sVfIc=tpD,)hI$5B0>abtF,<&*5$b9j^ep!csJ!Rl12cRh#s*TFt=1U+i/3;`aVC)FUV&+cn\r%]:MH.#=W[BhB356bB__Sh^iG&fXc#@lGC5,&9>H.qBMbPG[5k)0jg#QoqK"=Y%)NAc,u/W(4/3j9?Q5_6up:R+:Rpo/9I>?%)kg3\r%Uul;@Gs]W.GKhD&?klerV0)P=BU=kq3mT&#\:_#9m4)C8o;2>6rW>^gV#qlmKOgn,`s-8H(#.9&4M2Vu1aM9H:@qh;0IR.*mJ=;/\r%f>#U0K\.T7Kg=F"(+NpuCa8=M,43M4hb3Bcp'KA+ZsMQ"1A<fCoR:/%`G(,'I_;8)`pMj*ekt52NoIrH$u4Hp#*ZKO;c]IXX#gog\r%UPoMgRPA5mI$V_?JB*aE-Cn#RA9P5.0WL#Ed!ZtMoDn9KPYJ%0j>;FaKHeOiYf!]1:g@+`d4&Q?1?+mIFAiZ&GB>F4M'N`KZo_-Y\r%>F48Z3JaSMc]i;,Pl+A$nTfr5@--bU0'2asCd[EL6'gp7[lr>-?V"-`n1r),fKOf>a[,=,QW#VsjhdK3pK4'%);1Qo\n!FS#LZaW\r%hOhg";fs`$O$A%iJc7\6rBt=\K3U,ZMJ`%#'<lTn\#H.d&Ubl1FcRIs'N=0?;IqtIkh%kkXl>T#fN2j-+jZVQlKMNna,ht^'eEPi\r%)Y,VQNAD<B+j2RBqMac:RoE29=#-W@P-lEZ1/%Hrq&$+,=jhN/.=j//T/$^1_[VYGH+of,DKI)3XkEIr\1j["_u-fN$qRR\F^kU0\r%]LbcaG-q;X_<p8+Ka_#pTNOE4nk<Jb$b(S/@cNl^.g3QY,j\)@4G(FA!4,ek#!NXU=`2f+lR6YNUH%\AIm$?[#>fcFfMmf?'P'i*\r%rV0@seMg)e\!W$*.Q#m[Tn11.6'-LX%pNWi\9&#OY=&u,^lM>3!]jR5(ZKa"!Td3RLMJm((HRg#`Pu,f``jA7T7hP#2)is\`)#aQ\r%31\atbl75bNp-@lW+JDO%k2>-,osWEGP"j&FC@ljZZ3^4r:]&AW'JBsKf._-4H_!P$qhhbYBZ`D6Z*n(RH_);F\NeCLF_.g<mCd6\r%c=1"KKq=:?%pWgk\>1p@pq3(Y8[UVf)N<t7/Li%\##,i\GLKT+B<'=m)!:p$f])L!6N'*%(KLr9DLVd,/;*:o_YDCkALGt+`Cs\i\r%e%Vt_U;L2dlG>*-c9kQE6r!M`2`_G%Dddut6#m-.iu=WmNK+*<)9b,kctKSt)J2.9c56.%&.Eqhau!"0do]S&T_H=-R\/D=:dWt@\r%F6Me6H)6C8Z'gh]4V*i)RQ8'/]<e0Gj:^a&DU^(*EpGosnNtn)QBnNu-k5#?a>5D.>[jb'5GYt(F3=QacW1lrdu8*P@iEZFW@`eg\r%4G&Ql=$XHSfQ8"tg%]`'j*^mN;h_4o$<asG)j99UQ@fP<.W+4c\#n#+r*'j:&%NtE=2J]/;gbQ@.BM\.g'[3U'\[sT?hW&]dHB5_\r%^q.0"5V$hO1,X6\(##W8[!PUd84SJ+;RkCC_>pRu"[/<]/(gt*Ydk]$SW547U$IYXU6\c98BG46Bebl"``d+n*1tmA?rt>U1WLlq\r%NimY@W%0m&W"Tf;ZY1!#ERh^eYDjLY9GA[!FR/o=Hr]51e$gF%i<na%h31=_`f2dkNA![L$c0h*/]h1aS52\6dKFk(ZK`gO=0V&f\r%$!Qk.1ejVaXD,Z*TMSEO5I%Dbm]hm2@5AuC0cuJ&K47LBWM4m?*&F36VJ%BDP$/>3]7.Uj][/X]G.<j<#76)R4X90!.1-G[4N'UE\r%'?QXj=)<TaD(;mtd2K6e5m9?m6^2\<DV,g@;!+XeEPAlLO!Z"0OK()s_L1_38]HLoK.iFZb#W35VF!B%D`fQ*?%4eb!n9?iY;A&F\r%qL7:Qglnke^.Dg9GSES"JTE[*`'nCW<bUBR6G!cfT[Arl[E.Y<dY,kmAB9-da*4eZe9"+2E2M':XjBgA'sO<GU<HY574Sn2,RTHD\r%_H$iq9GOeYNJaj4s+i<k1`%KrJ$D?;TLBr@\M@J.oFkTf6l<Y7e#XkS.f-'I0#JN8$OUA?k]ucK_T!smkU/c*d4^E[?Drh'7/P'.\r%oh/lDf./6J$i&d_>0(sf@TEq`[>6S2HnlC2D[#Rs.?G6l+e8R(8JN[\L&VEBff8RAqj1#+gXP`7$i>c(MT7Uhah?`n\YIV%VXI,X\r%CaXNfF1]nf)^EfeQL&*4ND%C]A6!d'>T%>&Bu2)/mWROEL_#U,`VG1)jt/(d?XiWtN,q8chnjOf:4hKs>`@?<goTf-#1\pT[2ron\r%6:V-bBadSg;1Drmm4)mD;qXWa:dK<`(bd;SJ+SWZN88MD_d[=V5\IpAW?=KX-](NdMC#://3jB!DbUCGMb6;Ak$5XjG'3]=/5Q3F\r%D<<'ck2YISPGjN>)Q^Z&-Zas:,F@'2#C4$:1d^nPI&l\36(qG59<.0o[dSg#n#I5nbT_LGcc3FV)aD'&KS#:YMnZ.i!0_RAPBL,m\r%n"+Ar^oaX=ApK[1kO''^\bHni%b">f>GG;3;,E3%-&.NOafLOXA:0BZ)9l?.;Hk&TnbO5Y`J#qdYO)J"G_%h5lnf*E0+qV:]nL\J\r%VPH]p'P#DoS!+0ePH0[X=fhI#[WpVE"Fd#24Fs<!$,\X]TU)_8E2Jf,_o8#88<W[k>o8_Gf.lS?,*bB*(GhjW(#kmQ_d;(J[O"L2\r%=^MPCZI@XO_7HTg]9@ALMWK(kL/c0>3POY7RD`#P)Cn/5eB82i_7a[-eT(85p=JY_<Du2KagLt1HX'i13N3:IelpS!C(8d+0B7[s\r%Y8@r-eZ)VN8"9<fZ)NO<Z$>)+OFS6;87iXs;o6hsYMA;T"8M&2_SHGl^E2"I!9XCOfVYg36L]8rMS;qCO$O?j]n8e;06QQMN>pb5\r%DVSI<+qHOo$&c4%_Vnt%UbWAd<&eEbUb[APVC,H2##J-#)@_Udo;s.DPBtc,Y-:b^'N$e+()cPC+3j;ORleqQ>F<_O%MrVbD"=d>\r%-SmX"-6L,3#ub@#.;o(<A6.W,+6!UK/L:ctZ\A3[!V+$mN(S]=Z6$*HNtL.N9/>dFa4G6gi1fq>.UTdN\F%T$YB:Tt'^sCkQ3oXs\r%mO\@CVFk?_7q]".U/"+gZhTHLKeJBoF:&A"k]UV/=$$f(++L>2_rIelk^.+QG%^=]3suITTr.AYekX'L/H0[&dC@5T.]PfoP_+Y%\r%nLX:.b>d1Xikt182XN%^#U<D=?T(=7:]^2ILMZKeh[&bW^!=J-%,'.N+C8+.QRR(nW"=38ch"!e*sCPmQc7O@-V"d=0i9r@-Z`c5\r%Dn,o."0pEnA8^,6W.qHqW9aQZ_Gq+]$MndTOf-@AQ':-i)6k]*W6^klg*ZP\M-](kn#OEImSSO`_]9G>O^=Jq^W&l9%"V4gIO/JH\r%e.TD?$^!]0CL`M]MVH3]gL#so%192#R0'(rGSWu(:uAVc(]pC%:_:YeZ_SftH)gJF&,A%-m4&Y4P*5XqpVucDTYnao=)+22;'1OX\r%YE\-Dgg\]dFYP4P>"3OjcBmPmlqa<P=sseK\ug,H(US(up3F2"qQ:N#05CWrGkIRqD)tneAeV9c;*>erf[s3FrWJq#T983@hWEO6\r%[apEemT8g+L#:>X>s^q_5kO<e:d;Y-T$jd5&3\+AWM"o?2Gu\Hm*fi%B(<1W4Zp'ddoDBf"Otkm(paA`2AOg5ael*dW%R:e`HSt2\r%=VP(/:PIGrP3N@F(g@=A0?5'0'(A+\7G/-k@9orYd_=aQK@&72iDljM$_=sNXR/m,1>nspWBKOh=WcHTG-'P.*#^e!Y2kZR.11dk\r%72@P`AfsglG'j]h_OiVd[No8pq.3L_ZGX(nqUAIi[oSK.eR1Sch*"2jHp8E*2g[lN#c8kUOs\73`f_U[-GRp/SfA-FI;e&ca%'^2\r%4p@U>dOVOS-Q=LqgN\0?GlHSdZt_$TNX,q&(A/YP<%>6.U;BCUd)YbTd.f=?"=qf.e4hq+F_r]Xg.k,la7BZr%?bn@.-R@P=B'YH\r%$u2V)^JDm-fLF\a$B+$M+uFRf;,^nuDRPA4BgP!**n53sk?7;4R\ZoLYW:-K*VaL;^__`Wf[B4'8PVl%,jcT:5h-3n*iZLTe?[u%\r%^DI=75f^p2,YUB+n\US;9PR__P?6sSa(2IJqcOrKGb&Fu/uk=deQ1)Q\r%hfKm1nentl*X"0?'lFNihe/g`1,>YnO&3O@Lt1DGHh\r%#bk7g0,9-k$&d=Y.#UZD>kKhY7jY^4i%8*cUQVEIqL'.QW&%7Q&sXUXO7Fb>Mp!`TA[1N1C+_A`Q"=baof4+h7]_u2b*KrL9\q%%\r%3\H/(O4<QCUs;8;7;XELnGULXEUHg'4$K&QK)B[V_G$DJdn\]:WA`6[B#A'n.U0nkD':J6?UDqW`P2b&ZQW9`IB,;kqPAtYR=WMt\r%28k\T68a\RnbomXMlh.<Esf5p8EJ/XU$I*O9:<-8,9+tD9ftZ:I8qaP):,%/UKdAMUqBN;NiWSWg1M1ecR`Z?ZU_de'9]EZ</&0s\r%In6Jt6MqZNFp3dAm&H+TD97Z@_=prBRCdh:`^k5lkhTd5ZFt$faNT*jbaq/1i=D3Yj3+U(V!-<*itG`W-V,11+"al:A$ne+1:)!V\r%7!)2s.7)L-rn<h4Qfnh9_.q.lR:P_l8.u>i`=lEZh3=bIl1&\jUBG7qg4&FNWtq.[2Me6gla(AkqJC@Rb3GjAZ$#0P5\N?P_*sVW\r%;>pHZKg)\Q:'o[k&=YQeM@%%\n\N2E#s>nQp?Tr^>?Gtn;%;?^n5UW&.%Q+4h=\H!rq??bbi6GBEW0F#9q)@+\9he>9j>niATMfF\r%Y$n!h*^"']Guu[1V1-@[l,5$3%^LSS`Rsg.ek`=uqi!5po;5-d39M(_,3o-,h!hh>VMIsQ3t&AuZQpsgNs\o(X-f#mB>LCMR*h@.\r%PUgS-KWY%sTV"t[o[P`D`%en"EahNR3WjV"(8u;6hdhJ^87+/TVT26nFPnUR<$sjSjoMjL9hN`XF<Tk]i)aho5<<d26:@"EQE_!`\r%ENI#(1I8mZ2\)L79e*>c_r-!\'PH(7R_2@Hip5rrl+t>2X9,e^Ms6YK;?/9_[&@F]k[CAhr>XLRc+5.S,F#IREJ9d9E(@ZL;IW:K\r%Q:3Yeg:WGt/B1^+atgl[1('K3_*qj%mc@AdQ<ei'-6t.A0=2Rq#.>q8Mm;1kfqKJH#(poB6-nkbI\gR5F&V^Wr[p/lf3XElIbF5T\r%VsVGSs+OI"5tO^d9m]1OpT7YmcX:ER9A9gnV7$htR\Up0=5iJg-UujKIhbTCs%+/%F]KUd_[+9hps$8a[Peg_D5].qGgDfi]Q<@J\r%B3WV&JNl']/JtMAr0Ilg05U`]8N%s[c8PdYMZgC',A8`fT`\MAp91LAU=XH)*mo=\@lDcBNe2La/([3k7<<#\26$Eha`W"5C!ek*\r%jufC,.Y]!Qj^3,Rd-\.b1Bq\P5[(q$p7*VhbB_]q.ZWo4:!nT?%S1pba9nK\734D;W3+a\?-TN$Pa2;`=)Ut0=VB2iUcBi?dOPG>\r%=,PA,-eG$i+^WfY*KVl<92UJDE0lCfaTbbI_mLOA.)6cF(#``N%q1ZB*K"TFKS#8G)5C4!,[M<,EKB9:$nXpW9h=JI[1:gJ9e&(u\r%\RE(C'(\H(+2?.^*t+7e]"]t,eY4i-;].Gje`*BkWJoPObS>9!RcD$PKR;?)$UNaG5cS!RGD0!^cc.GFHebEs-0RWag<A$!6%:f,\r%&tR<5S,"RC@'2&';H_-?qY5uE$n.ha#`JCj`V(2&ZHpU91bD1.r#u;u<Al(DSPe-SA?.m=ZY3O7,bN,M]o^B:gLk'O4sQ\Eg+f&)\r%0/PP(GhFV:V763BJF,.u9qRQi7&mHYPXOWm=$Yt=SQVYUQ)[Jo4`(EkB&;_PdHA/5Lq]He-5.iB<!Yl;3>jVnKOLo<doC+ROeY'#\r%odW?5<H9I0F4>+"9jl]AO]HDE(Lu+aXdbDK4MmIZ7q\CXZeR5O9olRAb>O)>9A0S'M8+JROi=bP?59[$rWE\+$r[H7G(-mE*dsX!\r%apABlAo@aM`Tgn6W\p+uD#Y<?r\(U>>"BM*N`esl2L:GhW:h1+FuEd]keZY\#A8a)6VA)IN?6jVHB@=en[]-C,-)SU(q+`K/+r7H\r%PaKtlA^u9D^;mH@lR@/2cfrnrdUUqD4Ic3<+Q311-j56q-J[t14utjH=K.RZfdB?."JNudluN3BP#[Q/G^T,(=s(B^St+H9r][WQ\r%.(60EnVO<#eK6#O:VBn%)&5[[<Lp_.R_qRd\G$XZMf1@VAF1RG/P\g8'DKMV>&AjV&-aV(r!_aV?h\#N,@'AkT2:kI)52Bl.1:V#\r%#i;Z+BUg`rTAd8,*(7m_:/L_kE5RU9hN#ehK0g@,=GbQM>kYE46c[LQ/9au(gY-mm*em`=0D#.;SHBfo\7P<jmDBZDdW$ufWZP=?\r%pjD?"]ihekK3LhVb(gN5\W!1O,>mm-^FsYP:P#SmWu&4ah0([DJgbB#6X1=k:eC]s5gcJ+g74q0I?q81=d%u!L(mnf4GjT.oq[9!\r%9?^G_hR7_gP\LH-+iU.]LqS//L9%$Gk$+E$'?54n1c,l!hjDU-`O9kTOBm2\qs\b7#u'8nb#fUZ[U`>Ihq(Cc)1-CW3aQ-d)]>>W\r%E9PA4WGNTNp'A:Z0V*f#EPAc?cqS2#c;3d_Mna4C&`EPOAm3][CIC!l_XOSdZK.P+<]o$?iW4.F"gn%U$AH<F5R?4lEq";+UoemG\r%Fi=HTO"VL]0f0h84o(%\/E,]3hQP<E>SIk`Q#)os&eoSRaL%pKJaK/UZ$.`9HJF_s72nYna!>"-hDPVtTHYf5VS]o.^L\K;Q36\V\r%+'FqT%^O&fJigQ(B4,$1Z;KL5UU;YPqH/UqR%%At<6HJ_QbM*<(^d0]*bs@`fptH+om$e%,[]idD(W/tU7pKQg-nSN=)0edJ>>=F\r%-s4j=A9W(((cN29r\(@A$>T+:IWohBXR8lPKR1]KK9a+5$gmhF@.#AdQO<PB,7f,Zc?(t9L0,-.)9CSBhGfrJBB/Vsj!Q(-KB%?>\r%,RTHD_Oca*4r`*sb-9[amHV3?SP9glCj__YEA<>CJr8V))r]>(_Oc`CS;eU7KDQuI.IM@!1,?1b_OcajlR2Ts2`/S^6#SqIQR6Op\r%qCR'FG9_$?6''$#W:o1URO5aoE&4jUS1%5g[P>-104rW8Y)B9)a2>pu2nZfM"[,cBN2?p&aDAuQ,Y^7'N60hOj2LjO(@Gc4+U*7A\r%[6R""\3C.)J#^EcoNi']g/-PSL(a,0YDBo!X?u%iU9D:pJ\4k+r'u-(Q:!&P+tp]ZN9H;II#t>RaG1VqmeZf@8.T%AkheBRMleLj\r%<PoUl2f<ml/j^HQN)"Zsh"*^24fBfK;0[oN&?#sK3F%N`i\RJ=Cs,qj(Wp6-aY!=06J(<hUiM_:!Y6a5Ftih%%YeFSWP_>>6b&J'\r%+jh+jV'WUCs)r'75O2fX`_LL5N6Bi_j2KsE"LY([rTW9N+1pehF;DEKfTn;>kIp5\90i`i"q`?pU'-7uj;_u6&W*RV78m#NUbZC`\r%C`5S@Id?d]N5\AWJ@s3O/8dFR2Wm>cojJVG!DB!=+X1`_O>bF[?(PYM+`):"HKqA9pqD,Rk_;GnP-Nsqp+qkZf%V/`$TebQje:oo\r%d+*\SX`;BNH&0]E7%aGerB?ZGU%u#9(0c)\L#$d:r\#rI/TT],/t?#t+2'O6Tr4h=a`l(*W(H.uJq\!lR5gp:oCXJWOG/V3oP%6I\r%Q<]TVEBZhm]C1sETr*`OncT-UbG[_6T,*$2e9/S#i81=92]?n;i!!hTb,AGS7VT"V^(q+$7)o05_m/u)]7]WUgcBc.oX&-+`(\E;\r%8n'm0'1B7kLPs>51SXG%<a*0ui=q=:=Ie_QjBRZ*=PO<`GXIQJ@1'3jT28oD$,-%XSa9-]X6?Mgh."B95&M7o+Xuj2.c3I2l8TRB\r%,e)Y;Tim^?dZ)nN,9&/?pu6O,l,Yc@a5g8K$B&W8f&nuM`l'LO7&$oQ-4k+;e;TC"]e&1)B:=?tT`qcj6"<rJocc?-*#+5sTrlnU\r%<OKhL2!0jJ@_)u?q1Y4n5?Wa2l8+[e-d+2M(P^B9A/QBL,]1oD[KOj_LAZmKLe%Wbf5#./-`E9^Ord3/T&^^-dX\YRB<:S*`&D,\\r%5nREo"V6KB6DmtEMe_B\23k?c$s!,$q0K>!N/`Nm`='@hln>O*['BK6`e`N\f_VP%al$mnZ'29sBLrs.J/:83.iAsgb)[E%#O@Pq\r%:n7R=pgbV'PDE7#@;I#"=FF;->ScSW"U"t:Cjbesn]?nj?I5H0)8q9gBmZ$T*lY@C:Ym]f)&BrACEAatPcq%Q`"]pm\M)7e$#Ju=\r%p=^OW"A=nUn/2$&G,G[>d)@f(qe34hU_CIr=[+XsSY59&<$Kd(hU8c!VLdP04]>$HA4!pkj<-^6RA/(ap8d4`>/l`s(RF2]`Z3[1\r%Pd+RTfHkdd0cKZIf6]i)opdL(H!#"mZ*cYOdI)PHmcm+t]Ml[]XInt%T6!?Nq4*d,B;\8.GO>+:CD6ST`uM$iGEN1MLW.]7(n^@q\r%5GYMG]@`p4+r)[-6],$39L&'MV%jd>CtrQ'bWmok255`+oAs6Lg7F:Bf?%\AP'MRJgN!#KcFhGdc$X'HI*?h"Gj_^V85#B"J&8EO\r%5qI2Md!r7k#I0\X%%*(\K$^K%Ua:53R">48RE*ktV0oUb<6"+K:^eN-A9W'uL5[(.(J4\\DiQj8p*Wu65o/:HCZAU,S9n1Bcalq(\r%l:0^R#Qo@l\Y((8&c2'WlW#bZe?Y*GaNPndS8DP%GX9n]"oK=>J@ESHV!-\ba.Tb`3J:HZ;W,_bJ0t6B<Wt=QE8:k8@_:@n7=kT8\r%ZC?,<(t0RD<PX;d^=a>^4Dr#;SW-&:[aWTrU@Mpkg\]_]]<g.)B/(p&\KY,-SH\W16;/c:@HU+t6OEk2,,[bleC(CY[dD@l6"_A$\r%3usVU?emAEdZ00!W0]68=^ZFh<'#r!jA,7L^2t@@NqXp3SP]MQm'J8(Z#*2MQI::Jr@D&cWapKdKY)SO77H,&3X>O\*=%2d/39>o\r%fo4E41/c-u9q3Sl0q(\#TP$F!&G0:2:uJf#W>eHTHm(=0I-KU)I$/`J0Xf5oS0Tkuc(Q(0bBBe?Ie%*ap'a9/Y,SWCWEWr0c73G/\r%)aN)8<0iKmc7@3MK>ft,(Pdr-'fI;%!@.8f(VPHJkjFVa\Ab=s/3EQj9UcBp4-=Yofi5&0(Rim<j2Z.n*mHs\<#OqFS/UD1hKq[>\r%2"#ECSq$'NrY_@UKLJ4Dkp'>1MkL56[4Ip?Yi5m`mGXa:11Ll6d8qA$h5pCfcqU%oHs(^>PJ4?`(HR1\JhIig"X`La&228['kY,,\r%BL$K"Z.@Ep;14W*=tV%W?c<Z#0<.15MYD/JV9.;s3t"Dlm5RLK/j#ZJp>bm\7+fkaG33s\Z)u;\f$8XU(/':smOVI`(,O[4Mo*>S\r%1>81\&N&)U.C!/A.:H>'TrGP"KPiqec<T4<$<(=>(JY&$9EJqU2`aNN8#NLWkjtIpOC'(c((4<q)eVdJ+9a@0@r*S0MpM0c'XWlr\r%_iT1B_`:[_]RK_k'Ra&F*3>')(N,`aIH,npfhY9j(+Yb$/:8*J;Cj.s9rq_7XU/EuL5YVhKPo9afk2(M;+2--FAb(AH-0`PXtr[U\r%Q%,75a#YISakLXYK*sKE_aP$#k#Yu$d]4eQkS(O/)>O"Xm>+;!&XQ0\R\nOcb2K)NF`4.VZH7b8d2gfMmMTO+UlR4qiFN;VD)BbN\r%*N!GE2#4k)PCk3pW1ks(o(M'M`8G6XmU4FK(h%BY_JD=Y[^G^6kg(+XIElFEY3T48!GPr"qPo`^*@$[ub2HfWN+?n%8>D1hF8gmG\r%Zm]151G?1+OTVPW]F*'LP2&XbAoM[X_*+Qkkngp>Nro"Aq7PR>c/<3Yi0MD%&RUXE;f>hF&=JAPAg<^HS&&sM]tc;J`RaLe/Es\g\r%Mj_j+2M7KfYQ7-Xr"+XidTirZ[@t%0%5hp@*a"j]Ci(Tog/&=r"eh;O!LC7C>QG_1?<A`f$Ks#)KnUC6.KbN+k`Q@.KjG=B6E^OD\r%E9O\kMndnIbU@8\S]0LQ/7tHu4a(K.f/eflA9!(9D;(Q"?gB9*j>HJg>o;Y5iB]mKI??LYK*tn+G4A8Q/'1sc'jIHoGZ511m)b+O\r%lL1LQUGP>gg17\J&>7$.7<=/UqT;[G_mLZ\AScOM>-n)l$jmaK(s[uPm_q,c83BIS$;_rT69J1?L4soX;k,=>G,7,KG"VE&c%X+h\r%DGi7LbKC/C(Ec8pO8.-j-"qK<g[-Nt#>+Pn.7[=KF&QfqA(CW!(Q7N5N;J#]/f)GgEB:Mo"EcN0&6s?2HjEN^(,G@E]P(e!'eE!>\r%@BqVIrK.uO#qo6`@D`s(^WF)SYgUSuS`b?j[[f*T#08H6akIS+7BI>#'7C]E6:A$kiA#NQ,`9;BHTC/d7\RM/]li]LG)I*:)\&_9\r%P5Fq:FNu#WSrIZ42D0(UNKb\9H-LO3qO>c;]?j%A<$Gsi4+I3/k:ap)=#+kQ,DiH*o4^U.-M`*CCbpdSb7sXUHK[@be0H^lY\"MU\r%CO-<?hR-S]XsK$PDKsirZ$5,mHL(K%S\K'>P[9N8.<'i>I-g4lLmdj9ld[Z!cP9IP(&\cE?u%'+G[/HrPkqf8*L7MYK0m>A&8XI1\r%k%5TV"hWRt(:&$%n]<X';>_Eb;/+/>kA>YHXlIFqarIQEKLKGp(nEY>\8`:onQfhp7TlGVik^J8L(pk<c;_N$YQf942"?9S@Kl+#\r%T3nOf?oqVO1:Gi<C2ancL=5;3T#"U#_2;t\PSLc4:EK%$6.+9lamaI9T$]PS7A_b;Bn#X*nDp.>2#h3;@49C8QO1KOeC;KASK&YC\r%B3X]A@N#&H/jLgaO/DM5LMP9?OS8U5m$93EW79j=q<gXkj[KpR>s(_\7/r9FKM(,B&.6YiFElBNWN46YGH`N+-g*.AbLfSq&@Q.$\r%ELAPr5:IusfLSAGZkEXuJ.C.?E=rtiqJ=43<jeVP,]09!@PfWF3TS:pdI^'u3R`lHekSsK,jeaa%4cQ9]GCdH6^G*Q2GMne.p$k;\r%!?pr/afR`T16<h&0#hC@&eEX.1*)9+cS*ek=NC/gU=N=8JZJ"d9H=fb(d#PI@lkGRAIcGr9ZQ/MlS3QmEQANe,i20TT,-1q$P(ku\r%Ig21(1IOEY@Mqg^91B7IMbb#=Q*Cnt%*%:?d[<^#m[Zn:S/%/".gi1C[_n@*YW/St-$9EJmdM=BSJD).1f\FP*r=eV7cUk3RANUB\r%eLRXE<4Eh1`;f6*]'c'#f_3AZkCR0cjJ$rk0c(O6Sd"dS$<h(6VK)i^(+-@V"nnj)VE.bk2X%5Z4&"%GR"B,t\c#:emPJA\BuP&J\r%`[=^%-QbJd99:`sO3u&Tm0RQ!.`uAC>QMICfPY?\.n2@O"+LWFNuVJ*:6Js[2HRT#]k^=PaF.1`$2KOU\0'1)[89F\UQN_+Ku(Lj\r%?+Wi"=pU!9?5C-Fnh21DK_Js"GMYgFcpupeKOFBU[]%27#,:0X_AGk>KRm[/DRQXGilg,pG17N$fNG#DZR@0><mNdEJnK9CloU,/\r%#-r?[L?D$D^7<hQ&c89'hOX#YJjj>26=*;g;IXu#(;1mYc@Qi'&K5Plm4Xesg*Z6L_?SkY[WeiRmokO"n[[%8IXG/(Yg4lQSlm%=\r%`tc7R?reM8f1**#I:beFbec.?##;$l08JUp+pG\3"Df+RD<eq*$GdO>_Y8b1C)dqo\\d<7/>r'8h8.8&Mf'oV5$'^KegDP3(nr-R\r%'Y<7"`9o2UEbDYdO7$f:/74DF6)1US2P-NISmV-Y<-;.qSX^gf3_`anNBHehQ_dp9(PA3VbnP/a@gRf4*ucG[)$6MQ(A1\Dc>QUl\r%%rJ0RM%8>gG/Es@`MR8`DA6,K5"WU_gdWNW&8^2B%L`0XK$p&U3D@p@7n"i(@W<`<_JIa@l(^=@I>k"+,BrdE77q)S5<6&XCaX%k\r%=Y(@D'a4`$/*$6g=f9QMg'L-("j%Jh(V;kL3KoA\JZZht8Y=&teK'o.kO+8/%;]mY0RK\$_MN#Pk6Q6##sCWW=nF,dj'EY3eJbot\r%eqaJ*$obi#a[GW%oNfEI1KaWf<)pfdJZ#=Hhg1"63G<"m?S>@5`(l\9;:(0+[1f-VE&4p9?H#R3>gPND2lWSXqn1u,KL<^Rf[_1N\r%W^0Sn<q>#WFt02df/Tk-nlSHu,e8&I6`5sM<AY.OUAR)#7D<kH/&8h07igD#.0t5X<afGnAM^htpnidc:Jum51[HK4_Sf+bWXH7Y\r%_D[&D7p,OSn"?8h:l$]GE5D-o<nOeJSHV)k)Qe6=ROaK;CLR-<K[k"WRtd"Q!tHpn(H]C8l0a5f0<G)ceiDm>/nc7X_rHg:?9C*M\r%4#c:I4PcRBFlLnHOJ]W'e76]tON]-pCd'<jlh2m)ddon@m&Hsor5"^,JI(o*0ajas]<g.sZO"E:7FRE(^#:+c7M)$QRP*gLlpe92\r%Y`H&SKd&fk<Bo0BiW1!$-k[5mFjo%f_CO0e^@Ri<"=LN>G-Xq$B<Z/`K#D5TaU&R_7HqT,k=`k++KE_mo)"lA:f(@OoD:;'K;DL5\r%NR,T-+U.TTDKpH#I^\!SBCQeGU%E"fLZeZ6&F9WIndPHoQ$+uaReWQYc_R646E)[sYl4,.A85L6f'BY-WgDM(?\>Q6Nt!?Cng:\*\r%7[d:KN/s+&@hh\h;<'$9r"uE0he+9,*"rXrp._4IRfH`<?KHpXrNmgl28>sr;[Hs>qM`Z4*3>Vm,A43EWnMC*$/]C&C3CsTadQ*S\r%k0Al_L8fiWX3XB?Ga^=B?6:C$i0@rY$s[The!(Fe]f)%0CUAEs)l7-ZV+/g.Pq*mB;kpe!n6bf%(4s)D)=9_46G(%YU+#-]5>'14\r%eo.$\++O?Qb+`(#*8@(%J([bF:CE*;5r0l;LE@DhU9YUhE&GOVniq/\FT.1;G&B.YI5FJ#S\\<2#i8,f9F3/dIHf,+7\XAH+3?f@\r%a;-*9&eq*)'"T]F)8[RG+o!7@;Y`&PIGQPKEk>MmCk3GXIE3Po^DZWM%N8K'$``]<<0"TVa#-`m\6:-45HiMZVNr7cQPJNkFX5(>\r%+f%dVR`()Y!:Ohi$Yp;9`3c$Z3#8bNBbaaN7M`CCp?+VoHa9=U?>WT`ig[RnDp[&jn>0;d_q0M'bGrTL)%/;d>:YWX4aAAE1ds9C\r%P7W=!OV1t_"L11:KQsYuW9refaaI5[Er0TKfOdn:'n<p"6T4iU?2ZLZq%nJ+l-UrGZ&TndU8@T@W9.h\#i/<X;V]/ss,@@$hIIT?\r%5gc.d,t))pUe#N+3?%?Im^A^Bs0S!b:.(#p\]RW]e7uT(CEQVc%CdgNNBJ"70)bhPj:jM^]j+lC/m`"#GFaM(AlN1)Rnsi>',mM4\r%mY])E<5^\2"9452pe49c$H5A'$)&!e$bYn_1HW?U+?MfP+L-Qq+'eb!VR,f(H,7MlD\pb"4YM%EJkP^P6rSdo`.MaXd[-AmitE#2\r%&q-2$\\*H2ZLQcP)X:od"U4O>hGf)uX'cfra%979PTMZU7'Y^@$#5i-=?qP4NQQX`jkTlV2cik3q:='8oU!4+QZlXLRl($[@6H:A\r%@#(S&/aSEl'qt-V.1uh+'H7[4,4$jt;D't3b7B_UM2e#&8gOgV2&"iijY/0mMZ+jQQ(/G]<$P=q'2GZtaq%W`$s?W*@#*_X$B8[h\r%:rbF2='sVQc1)rk=&0;B@pr:S:.>Gg-b'u(a<rWJp>/%>l&SiBZnJBSbRhN?B'rGG*4,/c$dGh#R2ZkN2b3BC"ehE26aCqg[tpMg\r%CCk>[KBVkE#9D-ZfTn8t8Ge93=k//Td.I-e@;?E/ef[;5=X_tO'p\5HiZWP>.e(Kq79S+QU[HQ`@;?FZclhn:C=Xh$.G^69N%GGe\r%,EbE<On%M[AdWI=.GX%s#0<i3nBNh%$B*UJY=`j4Zsr(k[uKQ8IYpCN(r32ZP<$RGObQrU?P9qIO(:&#\'#I$FQZkj)]n(eL-FP)\r%LdSM:_DHQIfV3K_(@CaISFBFlU"N+JX$$Y'`mIlqih<>F;.sLc:R17O-t,fV#:X\!9^M\AH]6'_I']T\b@+@jF[nGhPHNAm:hW[d\r%Z*gn4me+ek/keR-fg*CsZZ0bjWBi2\h=\ZgL^igAK^kn5ajfg*I$.&!:iGdX\'!_ef4-d6VMsI))a*pE:@*19T@&=#qcV;?ZY4C\\r%aaL<W*L46u/HV8UeQH(UZ^9KrK"_l/-OnopQ/5Q4V5HB?jni[PkeV[Q&[1*k"@\rh)2B_hei)*oEOaZ+/#HMbI8Age4?`u9MQ\VS\r%O&b*+2]5ffj:U(@,l'QgLVg&r[2IcSAT/a+*l8lTb_^2OFuX)QVaU"3^*j\9=589,V=oDVi.abY<4QH6U;Gg%4a<h1"1+AkP[QAX\r%/It01P5O#e,?"8LEnL4E@Fu"Vm4c&l@4RSIP&g=s239M."uf0Zp[KKr?<K]r1F(1E_QXp5Zl.XcnASbnm[h(*;%j0MjLT.32a%AS\r%(Is)md2-qk-__\%Os=fJ[q,bf43/Rs;\skEqqN/Sniss?=bVK6"/%OE1&.(-oZ0aR$q.+oTjCJnHa*iXh5cgNiGgSF)mj3=(p7Yf\r%6V+u>Z-gX&:q.*#fF)C[TfKEO<c5:)Ek%LDhNVX4k3=@MMcNqb[a@'q0,%GD="Q7k=Gs)*c)g:gZ<^cL*cdU*3#t+)lI^JKrgZ@K\r%Y'KW0YmWA*B(,&EO(kr0l%HuCk'"7.Dc/mCS`C/c7i6-n3QMS^_:ru[#-:#CArgb*a:i4?lrfd==NfL`R:6G)b6sl`%B=8[;=<Z"\r%HU;cGS>sqq8k,`rhrBE]5rtTr0Q$NB:ImBu8NC$+S%US$fADRDD;PN;h`fQ\`9^FpFYD<:*;hnn@S@8rQ;:%b*[o;)`OpT_\<=]g\r%W8N&b_i$jLKp-dt.[r*2ShJ[XiM'3]#@YpZ<)Stq2b`CTA!IE@4h*ZITLX$(:C>HZGH9(:APW8^i'C^NkWJStGP>>V'Y+"@:A.AS\r%#cP*HPIW!Ip>SZZ<38`0.=!W?ji2Z#aW*&rfpcUAnSZJ2A8_S-"A>/04<<8IAFIfn`!nB'M@^<;cluh7aSTeC]l2V$%%BD":'[@b\r%ZU_GPJfqAKlueau#uN:#1]hW&mE9@=-*]R*RKM)hq/R;>4LQ0t[a1-!5dfh&%=e#EE)+oea+\r-7-?+8%TLW<'0E5@)8KHcT-\@O\r%/86/)lOrik7i-d6$\%+s$F1LQWYc+UrG$d-><*%Mgri-X*3o(2LF[B[MW@Hq/,!,o(=/-d.'uMO\d?)=JcbD;SP]MQlESZu[XFH`\r%bmO]KR,cB[2q%&h:_,i=&098U@G:(1/aBq\"Zpaf)4lQT3XVd[)f/Cq=6,%HHP0k_Rjj)cNln=LTp)q2P.#k+1m)?H%f;N2k3cj<\r%'F<KPjmsnt/;_bWddcWHmRfo>:.jMf,%Yj;AY18G5"dAF_oqoq1_g&KU5>+_QF*d#,`gTDOp[>.-<Tli'.Nf0M<.mgn^@MT;M2@/\r%:7`h-9r)Um6-@HDmZL?7+AX>4V/m_:WJ\\)K@)7-YO):_NKCHR#?RJ_M-@3RQeYS(:ZPCKZM,EH=J9`,S#^?)V:pQ;jI:.hYXH9p\r%U3naCm6M?I;0gZ@/<d*"0+fLf?D_CO%rP["YUr+pBMQiUWs:L"D$I:4YT_Xk'\cW^nA#r1A5TJLNc@*.Ld(bt/\,4q:KQ.Fn1AIG\r%4VAI$SN*rfcRddnK0%0612sPn9u@jc6<P3Bp/r%"Z_SBJUo4m/i`QmAqBA'.$U8R;]l:Iub79].5d(3cZ@be(="N&5LMJ')ell0,\r%%1:b.=@e%f"U/2VY18milB3:IF+mXH?q*>?B'=oed\(Qh(lM3e6JWL#'mPa4RijU>hd"uqVXRoDWJoIFS*#7GVK0Yc\mX"MD2>bX\r%SLYh@dF!Fp1iJPOY9#-#$,tqeSi0jY)l9tpPhJ&E/HTWTjQXcZCKVUQ`Y>7-"/W+(lU>]93@Kc%otIbYGP[Xc9@BHK195!<3(n_L\r%Va^)e#kGA:Y;'LHea6`rDb#CgJf\GRTtRH>VcV&jWFp^!n\RWNTpUSOktQ]4aCVnj\u#kH1M[g[3#<8s99#d\*=3(_(UimX$Ti>d\r%[HtE`_m$)*pp,*?`bZfl]j"`@1\WAi>'@"%_pGQX\i/'\:7S$1_)NjiLDLQbP,W8+T35"A17uD0L.SNjh5eY6@B4$>&3GtA20=J+\r%LeVbaY-:!GmI=P800<<6oBXGJoNjNd:YVB"9?5$@U@W4,CTA_$^5^bdVH-9S;:+IO\&f:>#\U<5R9jNj(V4pP'/f$e"CKlc)`U^&\r%SQP,;Yp**8RjN"JJ*^J(6L%h)]`Kef"f.>++?^$&W.H5GV$j#<`-21<bRRpo!80R4If)3%3L$bkbcI3iCH0t?_`4-o1@'pi`*=B9\r%DVF/LBS_]Z2f8,o'q3#EdQU-#d:EGa0V0>*lN&7LVjClY$b6s^p(P^%QNd=s[%s-^L1H<0qjk4KZ(\,$U#8f_O_^,tqf:AsXlV-X\r%F*W^\I@6:o*Vp,5A$rJKfQGb`HS+"`#:_i6-)Fn)"hnHDden_Ibo)G\FH4Vd4(Rm=,)\1"Q7ur3`>k&.:;3@N1$rG*/<!"5F%Wf"\r%e1+o.=TfWBh`qrM8Zj"QA)V9,j'2(Db/bcQip4-p,YoQI@6/3N%SQF+h^1@qX''7>ZT-m^?9s=HffI%CX:&O<"RE49$qeh5C)4Aa\r%RX<\Sf,!kbe,j(9EB+<VU(^Qeq=DUFrlqTXTjNZ-KDhgS0<G%.7'W_?=0l!a^5Yjl'iD#7*-Vl]hnt@Fi'mII\uT!3Cs@RRfc(7S\r%jpW!/6de9'`R7Da@ma+as7514AC!u7ag#,hdC%W3Tmhq02(M"?!*`?XnY21KD`[NN%:oY]C0$!G?BnW:\<>Xt/:P6DiFY)?afN?X\r%Pd/(GFi%8r6r*.T%X0dgTC(RF]OuUTIo=)g2Xb[$b_*Kp:Mm%>\#WYJ/D'"&d4]dR<KaSJQgetfDC(/pJ$VOUcKD?BYu58AQVp9'\r%S[:Gn9sb)4fmORfL?0PkX',@2blY&%jL\5K`EXhO[;_ca;2D7h$4@5e]:&mt2Um]blrq,4=0jTJ%HZ`STC5lRNTMSE@XVUg@mb*?\r%ZUj1"+c+ibUJ-I!>NdY^aPs,M:i>?Ub?Wkk$i>tQ>VRcN7<tAt\7rk(DU-=8l+kTT=i)_8*e);gq^q%7;qP'G/a_\Zr:$5==m=VO\r%TS2omK,T%n>bl-oZi6G^p!:\:-FtWW*k>Et[js`uFX^'<`I&/]:6p9PpZ]dd),]GCR1:L2p)@:qB)XR)Mb8fWi@@U/AYI2AJDI+R\r%$aj].DhBT$a]e#D(7cH"\iDpn/@g0\?NDZH<u,PP2G[<gC5j.h[TRX,/QWaLm+o]%0@nTNhI:n?Yu@2N=EW3/aBS"1BE&Xqfc@Bn\r%c]A<*U<7P;TEVDC.c>QVQBYe5p/5@T/:J@;SFhhDf2GPd`V76G?nj`V%H>TXcf+Qc7hu[4nHfI_!]dKga"3Ff$AJR-%H(/KrBY[9\r%<e>83YmlGg[EYGLk@OnCn_&rdGiOCb25qc-anLs2;m2KD_JM6db'6<$qsg&E1`u\aR`.5V^N3([7'@<cIuUF1E,N,;Xi+ZBH0hkn\r%U>U\sg+F-Rb',]NMD^<X^h8`Y.t^\5]F[576[-2+hQ`c'Sdjdh>?7ZGgS0C31)p_qZ";5.c^cfXK8-*Z<GnO56(41>nQ[+B'r5Pe\r%#JCJm`'g#p$]L;T:IH,8Y<lj`%Jtru(TgC:V!h8q2ccJd[TqI,']PYFMjWtClk2!2V4n(H^0c"A_/LF_8$f6j0T;?].'(J*3@RPh\r%N5ZLco#-L2QYTod,1n\FTDs7nJb_%\_4Cb^:an@Md52hERuKgaeN!JfM_c!`;&O*L^P+:+m<d#p(_[.'MbsU7NoT2B2[1>_,!U/d\r%fC)9>Zqn*t-]5#Z_[JZhee_gP,V'miagrMbDRS=kRZ4YQC>/t'_]":4iln^1huQ&^(iubt8f0qM(HV.5NFI%qFVn4T=PIDo15S,n\r%V'XgGBnaA3D9VbD+sbg,-+Hc.ITK1:<_IIPEh=.nna60pQjC5o.!ijhFt>L\=_\q/Wn;hVP*ZNe$jVo+J]$F!otUELs%Dqs2P*X#\r%XICee^h)0YXG]cKl6eJ1S;6np>+EEc_gkr_NAEP>gR$%$<%s&@j>)=Y4SX_OS4tA'H<eI-c3U7u&gjI!,1\=!JK.6SXlV<]1[C$:\r%K&OA03KKm-$H\f"!:apg13PJ>[k@,,?NBVA#!"$"MRhjh`boDe&'q=q=l(I+@jFWFb;h-(0V!cH18bqrRorO:Aj'bO.r>SH`bCPP\r%.:0XmWLUig$G2`!5<Z?ef`@G%01&XmNM0ZX<Uoabg*nBGrc+bZNZte5BpSKa*!Ng7DL##:gNNHR9%1=S*(d]o[`I"Q*YmAQ/dQJL\r%!Z#/OlSfKp^<eJ#NT)\(jh6qE&S!n29OBabmViAj!.-.*HgF\6!&$f/]:&=Vc5tKXHeolOL&a\@&g6^RP.*m/7m"\BT2dub4;hMp\r%Ud5\*.]dE6Qa,";1CSS^9aV)-GOd(Lb'V'8+QD.sAc*?#lb@EV#1pe[3"0;/eoNt.noU(G^T2>ee\X=+894C?p$lp3rK#:+rs[h)\r%mMo<o9-JBo!]Z-$(0f8Z\_;&#QR[\cA#ZTh1,dRV`L?QkDd:IoJ?N4A&^hEQOn']oE*Wr&3j:7r#KbfGqOa?^hgE<^MC"?Ybq\rg\r%7I])]+eb%!G;JQ7Eb7Jc=[Pb--X0J.ck)VQK-Y'.;B&BC^q%up_&i.%UfWd-fNT+=;ij-r9mjF29aAr-ESB3f3VpD2VRl6LXcqnG\r%#YGiud@%ha1.+B*Wk$gSP57g.MtY9Y4$NOti+uj?73IS[4ed44MI:@RFpA2T7m&_=7*sk4<\%%s5)mCeHi/-.Sr,#/%"WK,0'NeI\r%-bk?^f[F@+%FRE_^Vqn2f?$7/X)<^`n46[l+"9d%kWALrO0]'uJt22lVjZmMhX)hhnhD+QOp$P[3(6#umB!5)=$snr<B,@&r^u!d\r%'ZMimk<MdoR$S8\f];Ee;Q[_m#OUVeg0H:e;D"lU+!Pu52YD##!71T^8$TlYD_id5UhQ`BYOkfE9NEX&H^e\8DOmX^=][NLiTSg0\r%MRV-mGsM?TbR9(-*$]X@QKR*R;/E:$iSY]P-m@OtKRU^IRoPTOoac5RUn=h:c-eSt?:3YngBh>qG."+fXX/ruS2aXaBq4qBMW0!H\r%fEEUg$lYoLZE#:R60"Js314$i%+.&hm(td9eWPBkQ8D+lK^0d$Ufk2*Os).Z/.>hDi3^KEjlRfjfX<h7'^;sVbXd$(n44pDKulOX\r%Z\+*4-""uH(r]gXq$b>8gQl_u&rDidK"\;=[d1n0VDX?4WnWOh3S@(e.,j7:',')`K5X57m:o3,C.UQAk%1lh/9hHQMfH/s5iguo\r%?ak]s(+3#`Hc/<d\<8&ge&AaQ-B9#<^O.W<2S^g0`tHD-Mk(L"k"6>,/OX5:KlG1TBJdBS.8d1e4(no\\#9AoXp3_Si5JHJ64[)`\r%0Yh3pOqLeKS>Zf#!/!&>fI9ZK*e(p]3I=W_D,)E8#;:7K8O)!se>u\[E!$WG.&c96$86S1Un=S3nMV\qE,s]s,^`e*-'&\.W]VVp\r%EcOiSH<jtn'8;B,>$YTAbST#iP@Lo`1f>=Jb#gFgob-L%6R*OH^l^kHM/%NmWqgZ]e+Ei?0o#N'NDrp&Rq25*=CaIuR=IFbgWVTU\r%Y3l_#2f`pt05:</8M*SB*;^"rLn*KV0ef@/-F92.oTSm03#:;k@uM5]a<]=<_n)FK,'3c]0kfY/Y*PkJ9q1hKXtJ1*9+'a.E%M^E\r%Xfo]]''gmpMcjW@iMF?6Q!r9R2i2Z%#3V^Rn[hfGfCK`lH4hakk%]<c')m\rocieAWF?/lm:@%[#'[*01f_f6bV;6.V8P:(/dK>D\r%P.G`[Ft>M./@B*_1@"0_.jDcF]1.unEfl!<ok/dB'G%WP4Q*GR<T`?]#45?Lj(b!74Gn37[W1#??g,YeO\7tb#J6G*5VJGR3k2*/\r%S".>G1@)(QdMqn7/\2YVC,K!W25>2rX.?]MRp\4o@qHH8dD,&24@Vt>bZtRcQ.3C-oN/)QM.O(WN+!9YN$<P(#u'O?e]u9RB7f@n\r%Wt:70XY[KN;OD,2e-nh+X*b(s0a"S4`7<SegeqLa;pYF\ok^fL8+MliY'rL[j"#:1$X,EG3Srne^1)jK%./P4iGD?&`VR;XLFfl&\r%(2tk*`=O]rl;:p)?-;qg=5=9dQQL@N:+WD`_b$`QLbr2jVP#u^H?(`/WFjZH@N,C'\k-O3Fb7Y*dJ/ZO@foqkLH=p(F:L4g_/@Xe\r%9Ge@@F:P0j2i/0W8#2lI]jjFo.T`QBLV:MI$TTl1<-skOSn,Jq2UkO/Tt1\A6J-rnp*'lO=te.>Z9+?6+&HZp_%g@o*jY/IJU"Cd\r%LN,4hAX9C$R&lOq($&8#2`fK0`?n-'_cYK#>t]:'88bU!.jc0Y1rk'6XHZ6GkX=E"`3P&qZKtb""[d++nug8`MtMK%ge,.G-upb5\r%mt*#$C'>5/3_O@ZJU"#)%OXmVbl-S8NDn%EM<X*uff;e,omI"r0tKb$E[b&Ya(QT8>!sdUe\moq'O*AKF?qgFM3*E9]/L.lW+gG"\r%Lh7i07A"DY2JS`21qRAL2R-nJXi+Y)52ocKm[[tAg0HB+c!lXRVH<kgl?tXM-c*B0T&ZARf8j]j&`!s`jQ$^koGr,c7H?lDF*$\l\r%I25&pB/)Kg*j.rk*>%+DBR(Qk::#l0r"meb3`b!?E\2J+?[cJ`Mq0+us%uAR]bX6o"e9,7_`ij`,g+"g\J9/u%;t2ac)#&uLtC-%\r%l[Ch_A&A\[BE\G$Jm6L0f[VN2W*.=QZ1mb=f"22RPiY[`MuP4`i+]>@HElsNKGQ::.1R<MeLVJKTk:j(#qtXA&q!-^iS2m6IX8<\\r%$s+)_7M:;%+Ze5![&[@-5g<b]?@'Jk8J4$7O3Fb=n\[5B=gf[C:,_)Chl80T5%l@VR`1?=/8!S(e)"P8ZhWdR`=,slWOLO1/83Wd\r%3%n,fSZjtoH&E]KT[^V;`RRABg:H-MLF`kG(/nJ_j1B73p8'%?blN0nl&HZg4IXH?bk>2db*!^^*rIAR5nr$3=(Io]C8.F'0/<4G\r%UbJ,FSBAYd5#641c[t"98L%ttl_FUpnSQS&ADQ3&Aca'neQo2ZqfH$nLil&'BrWa#CErAoSMpD32;+E)#EBW-EV2XapMd@-lE#!*\r%ZVt[7e<LU'Ie'HIdt,+;L0I>*S7QI_4Ij)hM)*arBm[gaSa,RQ"4H_KN7aSF]uBi^!nHJ42K'P2c`b5fR&i+ehCM_aJ[M;]]uBi^\r%!i$.'c.h-TcP`)r2d),lGV`T!\/>A\2CB7f!"Z=Oe`Q7u:19%)gVtE,Dg_dY8t3.EB=OB:(\ik#pkk,qB/^e.5FRQa&E/)j(Csc/\r%O2pU%ToWQ5/-^;XJg1^pl([N:E&O#G4Z>!"/<l'3YUaEoZ5k4KSekn@=<b6<`TUYE]tA>6e*BOfo"oUcbHTJr(;)p`caGBcb17(!\r%-ZZGD4-OgQ7G"g*7]QU90"Eb]6_qZ<MXd!'0)s\64*7$7bk#b`kW5"LD=V:s?>CW.3*@r93`LdpZo]\$i(->"B%g^b#^/jg7OCe\\r%pUO&M@sJluLPi!53'50>;WFJDVLn1,PIK.>p/ioF5k(/X:t3TID?<B#j7BlcS3K/poAkm`fX%^>,Y1-^=TeA/?V#%i^U7!#>8%UY\r%=>u_.0tCgZ9-tN^qnR+Y1;%kgStC#s$Tj*/MW0is@[%<$ph``_*CC(EfXjnRCi>KGKO41HW,QD@h9<$3kbgLsY27NXK]AT_\a&>l\r%F$O9lq8_Q$G'h9qUX/8tq;><1,^Jp^;h<3XTGE+QLpogJbGS/&G^Yg`#eV5/fCL@9puX^uDf[6>hSod7^!`]<?CudP"J!A.NGs%%\r%!d68?kJK]Z"HV&jms'7Fbj.n,SS;o#OL_s_P)"J%W?AmdglC"\e%@j\6l4Rb-krt+/aD!_>>j/(.q>AamuH"t-bK<_^1'<oj;_m!\r%`=2[-+DSs_UX&1HZ)MUu$?2l%$)e=r+e&nHm\KMja6WV"?Cr70-DVdU)nY!7GrAYO7@9UYU$d/R5L&N+H=eig+(neEk_SK-%0_.S\r%A"&Ub1X"q`6_m+;'OpK.5Vu5''OiR<^1j&ig_]q@_K*;_e,F92I2g_&QbEojKlKQGFa8CL6H="NVV"on_a-!,O)o?]U[j95o'qal\r%pQN6R^B_VX--)mbI+FR=\-)472l`0tgt$2WMU@\4=Jak^E#h<p\tLN>^t\X;9XkG-VdMNj=OQSLN!:$83W\68$S#bn(tC>`W2F0N\r%Z]GD293k&XS;mbmOuY#$fV6LpjTPAjmo)uC)gbqX78H8d_0-.UQ6V,oJ76bWm\8X>8dP-"$.dB!]-,\HA>K\aApJf(-+0W":+/_L\r%5m4fnI?KUsEcCiG/)8tXK9,7rg*tVOC/GaP$>m'o78P^<#?p.kCg<e][rU:`Y$KT/<_T^FS0+7g<T%_4XU&0i$uFQ()[:PlpPj>-\r%lAndG($&8+R4F/fi[]q;R\U_iPZD&tAD"s70c0Bl:KpuIOWL=6LZd7['deeoj<p:'Lr:`8C9>p=161]UY4BeC$[_U[5_YOhK("%J\r%k2^u;a1D(dekKr[#i'SbKj6kQSh)PiHLYO9(EWhcahtutU^JZ2AJ)#N:;a^j%8c"oZDh@;4P,Q`VZ(QfVN\4'cs.GKO(E>\E;+(k\r%@kgMu<-KlT[$F2+A!r<f48,[HUsAJ=3/Yn#J]>X6,eBYER_63!k[mSZ<"l^Yg,#ub3:31;Kra&!J_b.YT:IP>)deb:cOZ5liHk]^\r%.@PfAp+a80l2>%]hLso;%_tP.1>0htVdgt6[UI*STGtl`oP4:nXQs4%M4RDl`Ju-blG6o,18gM9+FN'f%T'&N[peaPO6=M%7Lq;B\r%]FEl*q)=n3O6PcG_2*qCB8Uc;6[jR^;2J"o&!FqkaMs)P7Dd;ZNN6D/\&Xclr"4HJ%3JZ4QHR!KXNA9hP#OQm+nD?B01di8*Qr6(\r%DFOtGOVFBpZ6)LQT"u3Iq\'Yd69Vte'FpNZlK(gY+gCn@![;H!]u\#>5(ufm7tjmb7Gtg44Ik,`'3mtLktBC?$t"*B/c)s:IH`g,\r%S:(195R8QC#0[R+IkY:1!)I>&/8A;RgB7?G,uhKld2r'(?E@"?A,pD=GU1d;qF47$^4gJ"6G2Hj1M'_aZHe#,q@]oGJ5.]t)=fof\r%d\'8j\c[E,Og-195-oY1oJZ=oLb<?XiOS!+H%$)iGf,Bd@"d"GJI5g\U?G3;3"CX2+S8<QDffC8s*?`D<^q>Z"J^I?@"cYO0PnX.\r%n/5\;he.j&MRIJR5Ts[7I0H*6_[+SV?o%anV%F2lndllM!p=6&7Q@sI'XbsE^Q="*`!Fi:>[>#`_Uhup[Zq.&\[mrVo7"UWNIEUQ\r%b=an+oe3PcM!sUb#`-fi61M]4R,1JiD-7(B%@7kT=Lpk&aRWehN7Re^QplPgf@oL_"AluZk**I&*6h:#B&G3($3Q9#EZ#W\XDO.[\r%$6o,BS\Po^kq3V;]94]$I.@)[n]U<0[%HPUH)tGfEa;MHrpjs-V\J>BiCg"08qe=\m!T6??ZNku0[@O4"j.aU?Z5%6dhlrY-IW"<\r%)Q234e]g^D\SnKc:+dOm]GOYS#.h:;7lIqt4L^OnZ7s`+)T73I/8IpkZH^#ea%E7Lk#cg"D!><%5ddKf?1\cR>o7@,B?^P)ak,u*\r%l/X<#YhgBbVQiS6jI[As=G1ACfR!E]oC-TZ[LC*VAKFCdY7&97e<!5k[^Wm.qTJbCA)ub:($i3c@)^\tY?9[WYF&^RcQdFi%$Nt<\r%!s@3%XMWX]Da;SG%ji,k$^OLfUVL3BLD`$/K`/nQ0,C9+kO;Y16q$G:X(^cWegi6qL)K;KS3/AWN[Y<lQY\<dfPZ2of=Pd.-Cj5k\r%NAZQV%CIO@Cl*<cNQen0@X#'El9G?eoV`lI%?0s[;4235q6a.g2csC\%:t&K>eReIC!Nd>-6tC<j<0)!.#,DJ$"K3iBQjl!b=cSA\r%Pg6H59RG&^P1&Pr;eW=YhV.[6=HD"=E#bj6[WjFH(Lp78&K,*W2OU.e3nBIGcFg@4m&+ji%*.+KKf%8`?Z)<PgEF<,+Q=u''UBG7\r%06@hCZWiDs'gu1V]=1.TqR%)dbl(I"NnGJ%gkd'2>8-NeZr=RSF(/=XNF&s$a\'MXc^A0U'A5JM@D\PMh:K]<fVYZZZ;NEoF2o$e\r%aV9^'S-ar-nspAA@0h'd)s2g1[Yu+Z_.2ju@u]uJ#rYt*SFaU;A[8r_E_+i>QU.2cHj^[(MU?b1\sE*fb(pWnDRoV6O%<G1*O_Gl\r%gZ1Ob:$!oCD.*MgLXqVTg25-U@AH;BRPO'd9NGXK#Jcu)j.%?-<l+Z$:oNM2K,b4-a8PG_lLgHe\P4sp.%@q_,.`C0PDbg7Y5#=4\r%@^Q(Z!'@gcHCG`\:,:Wn%p<555=RHVj4\s2,q&FS8N'Rc`8MSO3SrJ9:EqmTq'W&`C_idoZ,osqZ>$DDf@Q8R3U-++?b4#l/h_AW\r%cl;ehU2+-]`MDt"s3SqkE";>fip4Q>8MX/sjWW/hJCM+2Q/O(i+*k)>&!LkMF>kHBZ5VWhkJ93!Y]+7WW!QDAph#3Za#mJLiFs[j\r%DarCL@.e+hT:S2Rmka5KT\^hU_[rHtLI=)K(`pj1nLYBA/)96PnlU?"i`hJaK$f:W;co![nMtl!]r^M\Z2?X?XY#M)9^S+F$I.$-\r%m'Qdh6tK4[K[&rudlD'$\(8b&M:k\R``dk6Z&Q"pIqFSqb;h,?#rp%t$Wm8dN<b-"(V"deh,nEnIugo*p;U:R0D*tBSP1F/86DFJ\r%a#)`CV_E%++(R?$+KVIuDcburG(Ee?^)D\ihQ\s,iK.p=.l"3XBD>blc^;(.d%!CiBCO]s<Ld_FTCudQLC;KMi\RD%Z#ui&_<T&"\r%]WGh'C<PpT/+Yh%42eV5Alfh]F]E5ro5f&\K`;gAI9GC<YX<g7COCmc2'co72Y#q9(L*Bi%=R"AnL["Ri`e(^FD@BUT;[DV3/f&t\r%90U]#+$b4'TuI='6tILHXV---.^uke2"Ht>G`^Cq2EhVF$Yg@'-9_o@bci4!WK4soZ;hHE;1-'X;Ohfuk.q<RM;23Bq:Erug!%Kb\r%XhE-_b,.a:'3dZ%iF.4Xcmb*NnN2\G!(QZi@l/A#.n@8>mB_U(@e/e=-bkB@COhWgktTP#`m(@8YdaIuNAuM7SoR9YX"G,Bi"`K'\r%1W.b6\aZ5YraW1'VD'mFSa>Kd4h$NklI-=u?A+D-ilHB.-k.+W2']qo,"h,nbl(J[%1dr:k3MDiPGl`Q`(NUma/IOVC^B7b"2&/+\r%79.-.?H4!$^<J@FM^d?#Z#0O57DN?K,IMB;2^`ss.Xl*m050+7NP#5s&<&?7K@`IK/P'U,I;V6'Db5X*QH^jd:^<.6&b/B%>5Bt1\r%0he8P>lTfED2)cZiX,5tT0;_N)\E-MVrC0b/CUj_":2r:)5_i/:_oIK^b=4"HV_jMC>;Yt*gq?]hL,aJ,;VgFmDA4';N66q3T)lp\r%3NWc=0l/[9D!CMR%#NBj9><?..ZpVc3gUd,k7qof,=f0CcId:ZO[#7fR<q:EkAqu2qW:pUDG).[QKRBmS;F\sA5=se.LA>6Bhq<=\r%;J2o3@0o/HZdIV&C=:]q\R`fjLSlR8=#X.X)F"1fj1b1p7h+!eO8G5u]lGl/"0T=3+b'dX',dlq_3;9a+aBr:a>U*T9rUgbTM'DY\r%3]ZB]`FoC<F6?f/<c8pN50CTGZ]X6!@;grrYr<<YYWO[j+bn[O>L;$F_7.nSh;M!=@9=#m*t4X=!oEC]s4]S87n*X3@6'fX&iXL<\r%10HQ=*1U8Q\;@3DUkMgl]46&$_X9rX#?]SV8Hr"6NCs-M$#HoCDQ&`5b?W<4ede!e,Tc!u"rhd*T7,@><E7`'p!$iOG@[%-Dk2\)\r%OMr,V]JF5=F^jm&Pk0MIKGaY52J4bgrC83Q3J9Y$D\[<@s$AO61KjApSS^^.n+"+(Tc^78<_gY3hqlksFDBqXSceb"Hc=0M.YA0-\r%k<S$A2jX-r5Eh@Q16I5;>$o]Y8JW=nKcYN_,`@[JAe`-VdObc\O,&K''\6d9J31=jjP`>@KFuVgO='XaH:lprWmu%*I5/T:ku#iM\r%0fcZd1>._+eeR(<\8f^/_\l@aI^,O2(IPI#'\5rX`5ou)59,6]N1/1pdA\iMrF4TOnPdY4]^>,M78Y@]7n,``#>4M7RgqD90Tc;?\r%K4sdEbcN8T?n#p1gbti!i-$TL/=U)\L/l)A1(si,$VH;!8rr7J)l?c/oQ'K^r0X`.0t3`"Ji/!%[RM#g2aW@uAU'<Tn`iTp?W.X<\r%rRt'X&'fF=H*=d>@g:U,37?ndk!f*O]&Sbh^`1=CC^Z8F\VUo%5)NPPXS]iHj,Fuj^+c,IN<0\l3/h@'%T/.WH$G!Z4@T\MrP-p<\r%9%CUWZN)*BeqpZV5sN2sPC7R*21be1Q8H,3`Hi`1%J`S72ATGt/m^)nMr;o2B`LM.@C'%S(p&S8l$+rB9(MPmV+a[lO7X\=L60K4\r%.Ed>hI&SS4IASa"@!'OS_F;7Sh^Dk93oIQncBO(Y]FZbN32n`Y`nc'q"0B,gLb3rKne\JlkAZTn;mUrCOChrY@=BuUP>,$]LOVW4\r%Ai#rE\>(n$4E!&(d@IA]E;&l9F8pLR,QbG[?)aIqM)gEI9G^1A:Namf:<S+g5UaSu'5T2_nKTCf4RG]ts$p/oS)Bqkm`QM.BRLnG\r%2pi/#+AD6:@<8Sk?W;"a*UTKC>8fM%@aWpa$YSg*M<0$+"#_1l?k8DJc!*N<IZ-4<J>0Um@skU@+.6RuI"%qH76tTBl$I83r96K:\r%47<b7efOcl-qLJkgP0X?>7N%(CU-hjLX3p:'Z]:OnmZDq>$r[i01#[4?nVA.fTM,8a,7?c[fO*VNS]K@*TF*>"FuAU(ia@3/^0,9\r%%dmUV4Splgl6\$pm)oTJo34*-+gYrap'%O=50DYF<CB#JYm378[fUPKaYP$hs2s%G(%.Xd/Oj;Ym[Ir"/lDo#S)][P_P.Alarn0_\r%pM/3jf2NWQ\RQh%]/Vr_3]0B\7BacOC,r"/UD8DW,&lQ9.4K=6,&>E<)it,Fn7$qbfMo>L6C[?94`o=9gH)J'P`:[eHCd"2<_TW_\r%AN'4#&D2+g)q">;/-:ct>sSa',2T0>q`?T8ImD[(NinIo"VqfV&r/ZG,A*s3D]JO]NGilkXnQ\$hkpW`;S=2hp*DI<jG]KQ0f-M!\r%g$j<!DGa.J1KWn<^mD^D6r?$oNu.*h1;kdk::bfY@o5X)>MausOW32^e,rS*pFkFXl9KHrbcL]%cX$]]bbN3p3Z&="3\Sb\BIN2)\r%&t5nde$#Ol8%Rqdni"FO<7A%pJsl9A+1@1:Yl'hZ%*<p:"0:_E;/Y'GG.?,X9\.<)C!PaK3c(GX(#q7n_olRTYZ$uB8S_<PG24,g\r%&<W0c72_LfH^OjRJ^uRNfg^"Br3kWjD%&D3jb<T+/[.7+!ak4dr<]q"?^T+mF+33iO3#kB]WB^Ir5\ahL*fU&mb_BW]]*-Ja4m*m\r%`0MJu?Gu^]HXsO8f\/HHp4]ZniSs9/ULaoY*rBQ#U[T"c7idVAg1X_=AeeuR(R[N.;W"B/?"="LaL<"^Q&I:*(1ES!%GMIm[O!8I\r%&p%NS"YHk08M#X\^1h<+lF4mT`+YnSaa?SCUPbj@+UR&]A?kl0KYXjnL\&)U4OB5[Rp+YeAnbMd\V@tlik[O1#I=f^F1(YP6$%hF\r%G,6)6A[@g771\SOil,U=`IJRh\&Zh$WGY]oHLCVTjbj&VaJA-2&g4Jtet<%]8-1VKf/gb$quF2Z"mdW2F1!oujD+WiDV(0Ij'?@/\r%#O<H'P>!@Wk?7P3;h_a9'qUn>K^*VX99j$@0SW_S,gZ>-I]N?Ddp(6Gb5#h-OPh:>&Par=PH7]AF/4_O\!`ZNT4"X892`b\gue<%\r%YB9o2UrPYfr#rQTHVn=3]AVug.Gf5fTpqkU+6.c:ZfL"f4WBM0?`MEopMmM%?"L;`D6Qh3L4F+1*1Nt\YL]o%rO>&k#52c3qkDh/\r%l*X9`=o2/5E$?r_fLZI?BM/Xk)nl$t@4\Jsh/^KW.Z^iCm-qa9$Y,V%-T+YJ988DNF0WtU43H*=]+^sgAQ3bA^K;l#KeoBZ\(Wmj\r%a]ggqO[;#U9-p\l"S%3+SD9HkrkOJdQ)flVXKgu,dA6grB%XMQiK6_VS+`dCPAQU^+K:nT_bi-`V@"eb)0`GQ"^,]J0/Pru\J1uV\r%^Zi-;3DD4Afd'7h`h*=bCFG+8VkKtNA_Ce'q_Y-%[^\!V7ScC*G24+rHHIL8\,DIuh;Ksr1?kYm)5`\H'?9rL7J'.CUp4fr7!FQ`\r%-]F:K7<b5D%3W5\bTXJ$[ja6hp67,oY*kWO]AGFqc&`^j\[Q8nWJ7mTc=+=>(7WK2q85do$@'YQA@%SMg*ZQiZ#(r<hhcJ".#AQA\r%C70Q+Q30"L:7A>nK68Q"JgT1f:\CqD!G18bdIirBG.I-[F5o0"+Gp$V$rLl)[:qL']hm#QJ_^#UZ7Ghg](-EeW\j074^:,g69b$'\r%U?Xf]RJ($UHM.(GV8&/uqnJp=JIYlV4hS:b^`:=@S3u6)JFkHpBDm8g9?dIO5c/*iMHe]$Q8Pa9E/ok\)>TW?a;4j/"nFOa=[0#8\r%:+'qM7'.enEU2\&-7cd>FV;)WoiNf'>I1+=Li`4a1n93=9l$U;-W>q--[l)kEE[AJjD>fnJ54nrF\X-j/O*".Q*>"LW7O5t[8*Y'\r%:+L4Q==4_c;Mn[kPp^:bXeYMX;M8t&"o0:i8Ii$c.g4d8hKAe_4,+MS-gXM]U+3G%3l,_h:-&RYn6k,nHtb0oa$*]CLFT=XlmIDc\r%`7!j@Z^)<SYK#H9])4;Xd.+>#-Z;obWO_8Z^R.5TTdjeF)#N^M^LcLMlo(%eq)$2I*VL-CV"9G>l&FRXol%GrG4#14Odj_P2)'+d\r%6T8Gg&Wm#/jlF`,4UPCl';[.4Yn2oD9u#ue0AD8eRPNOiNhYlK>u0DjgDmkE5Tb_b8QW9Q==<2'I%:^SFKZ_9?GF4:-4cEC(Ku+$\r%_F-oQ_@B\5ko;dC]?+F"jHMiV!FIKdbb2,S+kXE8`(RPqfl$AI;3Sbdh-mB@90*i5_rVoi?g()SXf&&(PrK@V7b0W8:Hc1jG>aUO\r%<VuGAmk7OQh,^P:]S*HE`Q1/LUsqP\Vl6LLSAXps-h@1]mQNLBF+)ik)=t)KnrA)Dh(gY[8m:DEY/9/)GrR(mMj(khS_qQ[%ek[_\r%3#p&Ue!/uBb6tqc07Mj4ZuDZnfk+5jIsE24VFsi)7Mk^Bmpp]<<hmt/N-Udp?AOj0MAqTQ/?"FFI]EZHPMIs/+LX;FPN=[L/m".r\r%eT^bs2%SG:1a(uUMG,k*KfIc79d)+GpG],&)c"Q1n;UDJeK$`sW4Ao6g>#7SlA9SB;RE[W<&(Dq'?"[P-9CWkNg&3qMJ[OoO4T`@\r%g1dRg>2\B1-FsdIm6*uQ](YU]Z24Ef.Po96.!`%'RB!WjSYh91ROYWOCjCuGmKZO2r;lEfM38o+&S:_QUX-,QQ@`pG3"T29AY>0-\r%s$/M56Z6"s9UFKlSUXs0VUs)On?K*Y;oO_e6P0%:654I-JA\&He:<NV"7G646]t=NY0L%"SE&`si+0Z?O>+Xkr_'9/F1$reagNrJ\r%=PaH>@omkoBe9"jC?!tcCWqhWi=/lB#R4Ejq5V</K?USNhL+qlH>s[t3a+IUe6Z>C-CS4p:6SkW0=E;B?Vg4K[%9A_I/Ra`cEEID\r%Q.of?#UV@\O6SYR64f.*0Z%lXGZ_5F4S4nN#K4sla(%uJn=I+AX?0dGiF&hd?`8q]d11tcrR9$PlkKi8qj_5eK,`<kc\3.*BbTmL\r%Jt-PFO%_F8+>6"g6T)(b.i[XV.]2ePCj$1B*B##%SE@[IK.hH!CAm/p(c'/L^,18VgRJ9ND";(ZFV\JRL!q,GGk(+k@)q'Q/o3K0\r%3:o@U]Lh2"D`Xb92be`ZYc'Y4.F)@9V]`3'&*&0MJ]Y1"Rm4\c1f>2,=3T=]StkD,_K!8GT&<k;!'u!K!hA,ed\T1-&@0_*kZ=82\r%`lAZC[?ZkYjUq)._#t7,$ZU3u)oI-Uob[`0<G+ISP+T!oNU]sUkA(6!S1GX"_IcG4>]TLuW&<l2EF6"77]2DNX.3UU/RqYFm+%qa\r%h";ltfe.L?p^EY4#KpmsLn*8H*@'VNi7'3#Ue&,Vg<JY6A0)g0glT`<X5,VefW0#)[;?\HcEZ(&-YD'0rcrm^jEn_p4"8;hRJE7U\r%pdSYs-[B:Ka%aN_'PZAjs$E.)9iM0BnV4c$f4lbooXi1jX<'U(n:_QXCEI)G)50C-]68-`-AcFe[W(lk>'%i`?ei/UWR^cYDcTV.\r%1nngOeX=A\:53mSiE1t0pl8m3-r$b6)!9N8JsKjEL7`:D@:%a(&',uhE_^\eW7``Te!@Jbb+#Jsj\s:lC7SUOk'g!iQ^k<4kC0dk\r%O:!ooRc>u.DfjCtr`]!]%@23HA]2[*if!(Q="dgS3B?-D\IoMEBJ+>[`]ScGVKRD9bI_Y1_Igtaq"u(B-YiU43*006c8b''0*]6^\r%0XNZSgL];%ahT!fEUH=n5dTB=S<lPgAL%'erdSS=>9$_n(,b-(aQ6T:;otc@3]F=e_!;6O*ZTTp_>]c75r.."mkXBGK]UX5!&&Rm\r%!I2=C_W)%j`+pd&"$E?dUfuIop:jEVm1U.,r!SM450ifg>rC&$SAPb,XYj2dT+(qL-7e2Ta)A7H7Q0)<Du%ZahdID0*TnF@e#6Rt\r%4D07?[)q+A"HRkRl&oIFhdVrbG4W-M.0Et<c[Z<cMYMKFW-6&4hOO>)JML(/0]!(bS*cmM1mTYFfMEh4cEH/'=lo?,bZe;"RC>3P\r%^S)3*/V@c)5(CUZObaK0I&T-B[QN@_Ri:qL?0@t[SWBac0AF]0;QTbH%h6&tc'%QdFKK8COUR\DjrtH@0j<Vq5u*\61Ua4A0mXi!\r%Yno4)%/PZr8YlhV\%JT;.E.go7od&_ko;eh(W7KD0rC0,lJ\K(Z9@)X/)<'1;R?NDHj2f;MbK@VGg-VEgb.?f6+5tUj"_)53$WKe\r%q([ao[jAI/3/uu1s8UC<>W>m<;c1F"rnq#mYu:n]T'A+:?>ZE&ORRsH/F`,d_#FR\TZR"((0sRcLgAX((),BLQ:I'YPb\s*6=;Ce\r%YTRCh#bgq^d)f=+@$A&$b25rLlI`-D2YCfFk+p1]_!3%OBaA.Qd`YZd63s\pPYSZ-&jg9h@bc@O$ijkJ!.dMK(n-*hRcUFqEAcgn\r%;AiF4X`D-!A',83\nO1AfHleph9#X>lOI"SRe9kIF1f^;inGICEF)C(`BbUE*#sP.EWE:.&6??SrV0(_;e7o9<8!'I:R!7cYpO;1\r%dS5k'IlK7;_+R:h1m:'OWIJFsj2M\Om(UiHO-5^NH/MmhW")dd)h!P,:GMb#-Vit=Dld[!2@#4pYLfj*9J4Q#=!-F-s8E421Zubl\r%-9"VYF]\HS.YjB2@4bBOG_jsK#MQIXBhcQ)[TOV98<^VV1HE(tWT+QYQmukm@N:)NK<]"$ONZ!4`8h2nXRtXH:8V!Prd@E1,U\?f\r%D6gF7:p;81!^'@\`M%-2S+[7gYV1#]@$%2/:8bSsm"MVR'`acZG^[VFY=Lj[`ZWJEX>g#iLW#O7*J4b?ihF6D5McJrD\a)F_i$[:\r%h<9K%FiV*JJ9Ts[h=aNu(GBeXh@dEo5R>f)0F&4t^\r/MUphVZRgJJVM"*i(VIM8.Ij1edZYo=cX4*0Aagb\ohAj!7;.2$!3@k8M\r%)frZ%&1nEc)^:rja($INGW;(X@q(Ds5ei]SJQ`o,)EW4aOkD(]k*n7m3I()]0$Pim!]E6q"2<Uu`-O"2lum7c`q(`p2*R.>cuu$j\r%j3p=&@sI#I=^EZf#Cc3uSE/b>-OKP&L)n'h(ig=E5;DVLkS:"@(In#,-=0Qu[p7fDHC4&!:gd5X[YfO]L=.5bE0N<@DH`?'e$>D_\r%"s+nUiT(Un!5J:@"`ng2`78`Vh^B</ZD/?bQ6:?'$/bnjEHIB\MnGd@[Q,\S(k)iuF$.dWV.5OB0h*hi</g=0mA7lR[mtV:bqUrm\r%@g3OIn_5;u6uj)#a)@.Vd:.PSBtct(MACm^$PN",qi\kKEsKVP!.1&3Jj9rSctl8-5X0PC_iB3GgZ(JQa]Wi%0=%Qf?IXnTG<D]Z\r%1&1k$?P;f?P>/#uaEIRo]@,gqH$M&pq@"5"^!B@'09&,L20$bf;N4%1Z*f`qSpqfFJ!=KF]Xq=^XN,tEY@lX=K?8sRj1:bV[5#56\r%C.sjINQEo?g<!DbVSe^q?&t7J4]ZWCVJM6bA;8%2Jd7dfGp7R2RcYh!"n"S11`nG#)FiT7Us-WBNkLSUK9F9=050%8SR13^H@:f6\r%35_VnN@:836MYKVbR\k):'2CaE!ABHAcN9/rn%pXJQOU7@pMlFPcGT-_-MeK7Y[_V<g(1g^R0U_n%IRh8>p&ifOhTGYcX(qPtBY?\r%8;tWO,eSqc,c26(Ua%o1]2+F2\%%?[T'3]+\cM<bKJ2B"?G%I*6Zp*Ip)B:gFVc9F^`K^6gD2$Cj,hId+!4SMRq5p-(H)h-q[]Qi\r%a$9MgS@S]5LM\_MX_egc5ms4CZ]4!ap]T?_$06&Q!/hSm0V#DaZ&Z:*:@Hdn)I2_cblFQ;Sej"d2*iPsq2XpF+n2l7,UZr3m^C4A\r%R&lMu8'.US.dmRIMkt@0%#JEE@YI=,.r^Ut?=6mAW4iXI\GA\;?IA%-Vo"8bVNHgNW7#@[DE3_:fkXW.3h@F:s7kq*JqH3r9K&0(\r%T:Ps#4n>mD"tU0gC,,rnkD5RsA)5t.LUmH+a*\Dg]`=WYa(=YiZT@c(DU]]'R^+b@5M7c,U);2'kEEQ\IM\DW$LC8@FumpC9;+f7\r%#$m.`V]2n.@Fr@uN82"d'l`LF?qmfIiClM$JBs-HV$VTPO4AC[+d24q'>LZ1hFpu+poSEtJ-bkN<@2Q6LuVLK4neoh,,fKp=]bXH\r%eq-(4l`+_D_6mt5,gd>&^cYr_4N1iiD4O_Y)aK23;-Gqti[]gZVM+R5eA[@TBYS)[7l]t?aPFPe]%L]i-Hs'gC1R"M`Eh&`@b+_g\r%h45[@_8Tq\fGN)"c+7]Vs'aK)]PO%bOV'%U<H"Wm\JS">i=nu8!7<<%$PmHX1@.ZWa=4="<1B0k+cMY!iB1k=nt(.KJ9;_0frl1+\r%Y7RnQ;=U\27cO`WFLZ$S,)a4a034$N::$0N?MjhfA#nOH/WU7nYT0H_rF/7g;0.V_!Q1`Bl]J-4/qR5As,DK4s!\C$0I\tT:PI0Y\r%3eVom@5c(37l[.moHu?`7OeGY:68cB5>?4q+sIo8M&]tdl`NFO^5#H;Z'7QSX0U:o4Z7S49(@*'@Q<jZKNP1%N$TAq:3=?V=]_,o\r%%e%oS[SYHD0\N@7S/7HhJqi$>kqn55HhHSt:!4)*X_(R3e&l(EWL%bZb]tlViT)3\\Ppu2:eba!&3D&nMa^eCK@qC3&?T0`aD1,e\r%''jl"*1N*naV<mF@u=k+-[rem1mi<2kDd=h5E%p^'AC]Z1IqiM92(K:/+B/KLaasGkJfbQM#->Xfrs/TYlti[WT@@('W@0EEfQ)I\r%A=_/DqYP%DIm=gq6[4#Xjqpm77HS@`cq`'H+AM`YF)4@sff"L#29YR\kp@olF%hNIWgZjDa5eOcP3JEF@Z5=$-g!DDJ3^9jcS)*p\r%DjZq;^65?R?:03YgWZ1%4*(hn2p"_,Qd\0nE+hLZAf^%'k1(@E/`2nVH(,G.H(3KN+oS6RX5m5?\`D/?7eE<r4rR,)rf3meN9N'"\r%Qdo_DE$gOZVELrGl*+/*Fc2t5Na]uN44Os!0g4a>W0WO3o99[H7%0uGaO3p9`S<Zm("Oi1%cHji.6'65j/o'oSB=6N.QeNlCbWJE\r%K4r88h)Jj!m!0_$\P0iZ(>TPHKTg50/L?g$ZT?E=RA^88"IC$ROCH(q]ED(EeV*TDCV;D4p$+i:aq@gD6tnebb'u,r/\R%4DD3"N\r%;:9*h8WRK.M\juJgm;VBe6"0%N(;qC^3m4#L2I8`a[Bj<)kR=Y]N@t*d70AZo\-Od.sl/=]N?QuiD<P&]OX)h/mpC<)_Z5Q0448/\r%`hc@I)C+DL]95sqBrcqX:+oB,BZgMfs8HcMQUTN2jB@g]X$tXFj<Q[uFO>LX2!+k,]'Jk67K9KTG=q3P`0J?^pP[>2Bm(`V3.WoQ\r%j-43pCgX4/K71j4]^>)=Zq[M)mL*;<!od\28N+)Po'>%$Uh".d^Eh9tWnb\J?*#0la%_f73(Lt>XA;C?ot>8)&q"""<J"k>VGE%D\r%DqPAB'EcOGMRi^QQVB:A;4YHIEOFsl!2QK2`28]7=><!:3D@6g3"5Cf<6E"&n,'>?-k&E@?#8aE=20`0QVArdj1bIXLkHt#Ls/%$\r%!g03C,]6^GpsMfD1@eU"4l++t7p#MDXWo,V"5=hj@f)dT;o7AC%$#k>jSKT!UApo>)o.B*]W\f*E$h]m9[6t(_df:(rl?@[s.q=e\r%5L6pQ?%I,_*+Y@AMd;[o:NY8T\.h!t4hS:bR/?V*Q]>kObE,01B\uM?L<*iO)pc^JoT4d!_/"V5EIGJ8V]M@<+Q/P>4(RlfaF\Jt\r%U8R$e_.-i-\5io+LNT=KO_n**'!716;L:9M,A+%knh-0*V!sPN<VQYgXl.lW=O_l^8oUMTe!_:Na55*\[<1/_Oj_ugR:J,,F>-\4\r%J+LHOlXeHb\9QcI*WB:@#g8&Kh:_#h3=_>#'WqpmLD.>LS>.0+oOaHhA'NuUoD-@/\ah9%]l>K"_oT5E4*G\dS9u!s[%X43j?_kr\r%[cu0kg8S_7<tTClEe]_0ekIP')h/Rror^n"gBo3KlecA*RM9>,aRYc.=.3@#]I'\q"W%u=rHJH!RiKLO"$.@OOkI*#)Q&\XR<V0&\r%N_DstCh;2uKm&h`dC@Z,!(af77.uWg_:tIqR8$]=2^jgg#ARFH9LW)i+u`YaC(l#=6r=Fb+W=L^o;R7#p1-a&:\aiE;e*/f[[W?O\r%=d*VqY7kN"?`$'sa)ieJM&2HLdG+g'I['n**MQ#8'W7:!0e4`,a9T8d-CE[oHi4>C>VccSB]h-e>2ZaQ:W2$_rqc?d6D0W@<ib6=\r%S4'AE^PI4=?V,J*f1\+.[@pschJ=$g>MGGpe&`^&&?fZ.Co\8k(lai$E\Z+!!SrV<gCGGE`r(-!GeC[/lXl?#pp[Dtji*[BZ0,0r\r%7#0`MXfL#:mQBtj@Tp8V9:^jcHB8%t'qZFn\?6WCea,EiJ0>6dM8=6%+o''THW'k>j`6#lp>=h3F"B_[#DM66o]Zlmn4_ROIl\Ld\r%m*Ce8kniZSKi`8$&>JT9)h6ST&/h^!En5,X)]F^WK*D7KE%$AI:Ec]^1?]$_T4+3><XLsV/P=R>0^nS%=I-/LqqBlTnOFUFIII.l\r%1;!8X^(HUp!*&4o4Gq<"kQJ&/s)LH9R!_l9>PH@r>;UOYqqTm#n$BE^Eb!I8-(W,R4k4Opnq#KAUaHYaT@lT<0###=mg_"C%l)2_\r%A&'I)1)HQi^+WNr:6%;:P6EI'I`=af;KF>W>?:`(c5sRVp&.e7n^:bOQ='Nkf3ELHDuK6"&$JaBrM;+#gb2sCqqBB+]K?d)J<hk7\r%Pa4Dr=g52En9pkkpl^s(:AO<#fnlUXabN.O8j(jXGN$f/YqANFC@C4a#esF^'N^?pO8hD=f#'.rW]_&8-m&,3597AtMk$Oq"W=JX\r%G6eTTLifY%&1ie<0_A92[#7q%j*A&d;7+(q=X3[kP6^l`!]TjTMr#k/]n,pnA`NG[l5/K0?a'7N'hulZA,(t@42N7(B!Im)$n8<V\r%f+>h_=5T6CPHj%al'skljn$ep4I!9:_@F`WEn9@-QOY[Y3;dE?&^T>6S\`qT5./_Y>q#SgTCjlGJ*Zlo4*T@N\ar^<MC8A/Y*s0l\r%P-BFr45<&NpP"qLM3CSZZ[[I]J'TEf1!'U6e6Rc.cF!+Ur8_fXm"q4pdCG`mUr:\O10NS0@[u;1>4>'a3Za.A_9P90Y^E"u,Y)ak\r%,B9@BU.7P>]\PW*3Z\TOIuT6;n<&em4FAPkeThf&Q!8IEnr^(Lf$t:BDd#b/$e?c;eg"Uibo.,#fd"Ta4)3u))Ej8413k-S@D4i<\r%J+Ll*/U/[T6W3uoo%SN#i=T-=Ns,3rcuiOi8=HqkrD9Jq[gjd8)7iQLeg^Gopn?fkQVL\NgW@J?5"kgmgrDI0$YL\h@%M/W%e4Do\r%C2d)d:S!VPaY/"deN,)SM8P+4*-n\$`\,"K7.+gei&*YN8;qYRO'VUYg;b!#l"f7j;`UCrX=G4RQP_>\r01,%_0aZTRJC%WV$tP;\r%]VtO?W$,fEXnS4cbBbP06`>7d/ZR@U(C7rX\$+N+WhS:;qbm2@;6G7,r7F^'o'8F]h?S9)6bWHpV-_JmpUa)2:FA3K?+B?qV1<OT\r%$Lb]E)WQU4oIgMG]"H21*NIdGjffhPUI0`BHFNNCboJ7'bqV4XQ*>2[Th8[\?[U#E6Y/H/^TgKCeUj"?.NWMKW(q489+R:<._hTM\r%Nmq,l2Vd2dL[*6qnk`V,;=3_4_S4W[H=I=qXN-nCGCQ/N,lh+4aY#bVgo#F[SXQk+kr\@j@qFnuie:=CIJKR/,[XmofdZ9b@^,TD\r%RAIK?j-t?HeS71"Oco-"osV@%:bc\[XLZhURB5k(WEaK6a'RT9/H8h[/1if1msAfAS"<bI@olJ&/$?\M<gCW$]'S\`X'4%h<Ul#b\r%F9U7,!8thP?+kT'k*OcOm9R-AWn4CK>LfahXCYBdDlM'cDJiJ#s'a/=T3^9mW\-`DM[ib#[\6^OiaaN`6=:aZW=1db$VtecRmZ:.\r%?FQtV7r!AEQQ@X->n)+H>?,Ig>[M>J8%W^'TmHR*4&RlLKj+DPmJ\k6eZ'R@RuPY0Ll4O;r(3af.`da@l5H$R<2lnL]s4WXh46],\r%ZR>S?VRYnf_>Z(\W=SGjm?F"L(8&ZYaX)`-9tIph)H;[kajZ$FD)A2YgAO_VeOiY8S^(Ll2&^75W]?7tGGG4AO@,<,W9_"/[@H-!\r%pXc]M=.d[r^I?GoA>K\an45]=b?T&U\),Z'X7YA+[h;tcW$KU0.ln0jh!UW4<">1:UmbSUMgXa*PJ#G>1*=THVfP@CB(t3BIX^g\\r%C-K:I'2aa5hoJ18C!@Zt743@BUq4WB%<m;iV33/[Q!U8t#cB;s_/>'.>CkkPjN$mahAE5@)c7(A/!4cGW&/pn%p8;L.Odl-dM86;\r%\u.?,G?oPhZBbDNTg!3=n6%n+-0n>ig[HLj[W>QiO-&$=#QNa)n)ccQO<X^=ZJn+*b^2nn%,e,`@oS'O4Nl0Xc&U<),?_ECl9_lP\r%\Mmut]WtJ3Om0=a.sG1AT04qGL=mX'6,-MOh]=1?-5%SRIl)+cn'[DIn1\=M?C_TWk&s6jc9*I-`8KJ%reP?2I3_3DkrUoSNkVJi\r%-.kRX'Tk2RfK"65KUmQd9$p/gRJY*XFI$]?8_!%,HWQ!Cj19Y>#V3Us\K`sFpdiGY:B5;HrZup)Ml'<'*M'18UL!"sl$&GtAPCZo\r%pRbDN#&AM.j,lYU2Q-8k.7Q_nqFR6>'C]k:;S]=#8HmjO74ae-(O5"9KLkq2'9CWn&rL"(0eO!Ap6tq>a1os$p%,5OpoiAL&$(r[\r%kHi10'g9[IG[bA-'0^t:3T-Jn/4uu5r&D$+N(#k1?KYs-f7ggi]F(9.nO9TaB%JX`^:[JdU]5ON'?XYO?LaCG%="[$10r]h@fN;%\r%WJ[<,QSJ@bG;#f9gbU]CYhkKq$W6ZV*Ok9Fb_5'J-h%+B)nrV0s)5tnJ4GX:ouc1X5B>I>L3;Ph6Zme5n?aJg%fhCMpeFhLc]:PS\r%#i:=5G;9$)D!),Jb%Iq4_&2=YU2%ABI"gVGWlnPW__+@Jju6gNmpQWGC%"WbUUPSWc[?YHQRCliq(sRFQtp??'72]14ri-aNAWVk\r%Q:LAdcPPV?)jR"sj\u!S4`NI\6$PQB1=FE7i5I1NE)Ndi,6*<%F)F:5S38oi^;X#[2.9)FH`cs+ht_9nhC$m='<\[IS?TK+RJOn7\r%O,n=imZ<VQMhe3u0lV0-NDAXX&(d^n7!<RnY]"k9<[+CshQ&1kA!uhm<J<LuRN]@?G&k>X78esI,dYp>[6>p!#oIsL?HulL,2f,k\r%18YL/'>f@@?9*K3Gb"VprE&SnC1)l&L?bYB=71=`K3fYASVl/O'gEW*g*\ZEfak'O50XI4rZhk)WJAE$oe%W)IB!PA%#L_#8m!k&\r%EBd/dU87cQ?B]0h.?`^J=q;dui@9=#pKdDPI%lcGC:e*7lfTI.?@QS4aR"slA5*?G.<$;L2W7JdDtP$BakMWWn_uK&Q:P_UU\b_V\r%'']%j:I=./irh!M,;p;kGN)bHcr#LScr98(]=SAHK],*Zp/*tW;S5WnF)ZoSlkDXGfpAOef/98?O1t'j:T`C;*4@.aZY^$0NtU<$\r%=#cJmF/@toRoRM,/O9.N8B`aE-Qg"!+69cC5&KbZn@nDl]d34L^giHHdWVD`E<^pikXIp!A8QAOF.;67"C.`KRhst&a/GkHFllp8\r%LRX(^G/\as]NlTlZOY-)i0ZPF]Y&8?6\iTE)OL$a#sCUL^,HFHWr;#n6ELo*5B)m#O2[2*BZ;-#d(0B2WkuJQA9['V,\69K2^],s\r%'XY5ps(8Ej_5c0]>hQ,a0Rfg[F:hWBpoCqKL3uc=e)\".+*]cQ-hCsp:#T*Pfee^ugZAu=-Z\Dm3-$r:@_(DonQimu?&W#7oNC7u\r%`_l8VF)\A+QZfq*3k\>G+!$]eb'ja^aB_Vu<':e-Q>\":LFa^!<GVd5R!fNT$<.9>hn8#$:,PsDbo+>gWC*7.goG$+@ek9,`jUiT\r%dBQ!kh:qa5Ohi?q@^<W[ZT[l0e!C%0Q388&LSGn8*I^Vuk@'DaP4Wk_RWq_#nfd5p`+:I"p7o&6/tBD+/atcjS0!>r:d;osVu%fb\r%]^KLo-0/*=?:G%lR\srglBaX[X_4Wu1#&u:]qi&kN9,a.bD"X(-2._@Y]"F.UJ!`@5<bbS4UXEeR;Xc=eQt0XQC4gH[Fjj(MbsC3\r%!,ej52K0VqKVKEk($luDA]4k97/gK9>r):e8p,'hFuq2.%ZXIhi#KaD>+Q]U_B3!$JG'_5YI?1'R1?jlf$)/M2g%*BD=4QU]rB_H\r%HlX;UkI.j?H3ZImro>cLA5AA+:A4=d>j[7nP5l\]>9\9D[lK=.q"<c2X5'Qpf"(@I`m7WuNrhU4(92a^G,rd5kro"Ibro`!Gm$,k\r%eb[*<i"FXm6Yi]bY![kW-q0WWk9!#9H^#HglSM]+djhd@(ZA$5%sbFq/(cFe[\Q`U1kr+lC%ql#**7=g1;7)d0ul;W94S[B*HiZ>\r%(/+\_WR[WNkjsmO4o^@9HciqG>JspJoE#6Ter&o&EV=937Ab]YF`TV4lbtA6*Ja=*a79l/Ah,?]crtta,VQDe[SYHnoR.T=L?,Ml\r%@th/1k!t3<Vk%qhYt*t"LHjg,aH.c#g+2p4aSeE_7*JqVHWh4&rdi8ip9etceq8AgZ@i7P1jt@?_$uD$$Z<erfuHrQ$+:nWf^tNM\r%+Fd`X5Hs&)?+^`l&!n(&1gl0P[pY'@"/J819\.^KUY8Y#Y&LFEipZV((hm8^*0i,SIkKj\15uOnU%s*>,QWh"R)*!Pb&m4),VL1O\r%S=&FI+?[tiU/+G`Ys>hihU(:uUD3J?>W9$m9$Pj-\k?Nm5'sh2;e)RqJs+e%H[JQ(rnbRrGD5^C:99dR@ZZ>!=Y,399!ob]iHP&F\r%fRinloL(*h0KjFuC7T-KSna1M#YOY.Qe=(FiRSlD2NHsuIdfj6eY(F])YTpl'()c\Fl;4r'$U;E`O@8Rd5iBD-;->RjGtA*9=Bc<\r%FrpH^*K3tCidoU7ik?r<,Yoh'-9bfW[+u.mo1/_$a;.S,h2Vp3r<m(i/!5[$qoN0^Vr?TCO!djf*YO!e!['Z89.o;TL[/.0KY`9X\r%FaqP.eQu!incAW2J9`OQ*2_m$It*&eFt6FmG5\!haR>bbnGCq#/0+$TP9>sr/_WUeeu1Z@S_:bia2tp)I1bhgXUe_6Z.<7"Q@!eo\r%ob][j+4.bg6SSR&-=+&E=nfabS*]cdq)s[qn6^jt<oHM9J*a*LS*r_#"8@N-KjbP]Y!k'U9okmM`McQ*`BtUQm#1"0k3SctOS/:L\r%*n-Y>\JjVq(G-%l:34>pZH^3[N46K+(ZkbAPcL8K4O#5=r^:_oG;g?CFLCb\=7bn$79.,.UqolVEdme`b8<_/V.^FS.Zjp*T1h%$\r%]+s@bCGuB2OaW$e+r7GRDi>?4=sNL?Bn>YTT1=Ir,TC]N+@L7\O&8]:2D5A(!d*1<I8EjZiu`oC;pB]'dF3ZAX#3#33fhS*QPXS3\r%R$l<0h/bM@ik`]Y?58+SjKlrXZ(K?$i`SF6,f!^Z253!LF+gLTU*b)OX7"'D%'8@S3F`XgD!WKfiO7l<'Qk/`@>;V\@hm5.akgiU\r%iL.-+U?uFbP-OsO]-0<B@],SV]:,O6ZnEHSDCsW7orkn'RGr41lju5Q;j/PqWR+GQT)mmcf7B=hF3K0Q8Wm03Dgs7ZgYGB='fnHs\r%J/o"$6J&@Os7$X!L[332=HH=V;JaMh"`%]3O:1e?2`K%+V29R"_%%_[-&,<=.%TO#=*(X1N#O9)+25B?mDGns`R&r5_H<4ujQ;+s\r%i@R+@9#Q,b&+Hj-mog3:fFB1XKkNO3"Y1[N85EL7N-CEE%cVX?#Yt-0-$WO4BTQqh*CYcqLl[<6nS7Q_ZZ++:C=E%WCF.Q_8uk8-\r%[om0WXgHf`NoG/pWjOmm[T6Rk`%Y!PqMDWKdqVgBWC;4S,hCO=X(f-77>\G?30%72=Bd;X[P0pHS6a)A%HgGKc-0l(]99lL>1J\O\r%4*\u_p/JXB6<LTK7cZg87RBPL0Ajc9,U%?r]RA4;+\aJ_plOIq7*rV&GY<*uT,4mfc8.X]#tETKTV#]!=/rLl_p>6!`f0>RLE@h\\r%&hbJO0[,r!ab00O9he-24pgVtMJ\`Ae<<+:P'!)5Rd@uC[peV`baKPIJE4jAQ_kg7AS/ie5o*?'p_lLQAS@9e`a+L!f5S%V>.@4T\r%^chg)-ED]ZCFS2i3e^(c$_6_u(d(bMe@HkUj,+jId__\'4o+*0=qOB]Bs"MI<>u%L#!"M1ASWVBq2b=^c/\e&#6*mm:BpfN=SYOS\r%FoBdKo8tE`]Coj-8uCH0jWdImUP)!IZCYW@lP]eWQ+*=YUV%nc\&Y?qG+U;$fg"H&aXgo+=)qZ\09a=X?r*nqW_USH9,&5W-@`VE\r%>S6aoK'!lcMsZ]k>m/%NBL3*ukpG+V8R?dk:&sEJ*!;@DKs?u"`=u:/X./o!C,#HD8"_HN1&X4;"iJ'%*pQtpqo"1B%*eX5;0NQI\r%,*QlDEJuXt.(9t$4]W(ZI!du5_r($TS;uDB%E!pXD3SHG!F]YM[XqqSk@9jF_;fhdX20UdPu,L]0l;N9m]sX<."HBrSoPCT<\i+p\r%<U=rB!h7.#-L68uP/7B'mKnMi2Emr@,J1(MW]co`*3jS5*\hn@dP@@j=!dF7Z(YFmVl\S34+KQpS_T^jS6@ULc)tio@.rAggZF-9\r%e7!M^"Sg:f:W_sT2)0H`Tkh"#FK^3J0:L_)[clu3n(5L"i3O'"gg.X_Xk&uEfmR1,n84FZF;170B,De'&KQQNZ;=V292^HR8qgu+\r%;T2_Mi,6dSDbZV'[eA4^/_V<SC23\if2<Lrs0t'0QVr&WO7_J8O740N;kZ8hJ*h%M.-A,DH&DF'LoHQW$PGt=S\T`%-"J<l/KH']\r%fqY<KTpC_JDj*L5qfG0-\<[n;G#MgBDTWe0>u-^WAt1F<gOCT+';"Q`!Xn%tq`ftgHb&IIJ#LNUD;_?p]ZDDWZ%;)@%"GXec*kNK\r%c[9-0`!N\bJel2>$l*aLNZ"G3J#G7!H$F"WC7b`@9K0rg+j[*dG\FX-P03R:$S"kKgna*r?UTm0[dMDf+M.Gm+9d?;L2BtnTui:c\r%<at9a<nFu;9-7,c3:\l'!m%O2`i:1iI1InGdc9qM'6%Mm03)!=RI2(2rVjXQS+hYOea1%$@MEJ>,?R6P5E)t3&7^r.it,rt7koRd\r%,Wa-u+jMm]j_OV06fp*b3j@M2!gGDh-D`4T[?]:CBX/+XPLi`FECb<=0M;RRp'RqnM:)_jimTY$mJW]<C7f3?]iJbT*Yi<gLS&+;\r%("%??m#48SU.on/aZ45UIWa;e.HY`lpX$/lYacP@>;rJ<S)3R*ADYJidDu(D2'*eX*?oe9"9`(qr^rU^JmgNFRmM^5r:q#Rq!Ecq\r%B`-7Eb))l[ogO@8@WW#aRJXB<*k;M/,;82kS3q3ACZ%)'5FA019Lg`$kEt^5(@A(Z-W0W@cG2rt%Thc52%9a*_-`o?r@J#`G)VNJ\r%T,UEG&QqqAP11@(ZB?l!(_7so0q=$L-f24Q_FW"02d(8;cSe8P=)WO-<[sj/C`n3aXr6,WQ8KE-`Z/1!C_Sbp/=aS"j'Z,F=0<TY\r%7ff@-N%<kkIe'4\GmL%pI)T8e?ig>=K@p,7MO^0X1_WL`hh,;j@Nurq+*I]&,B`^@Wuhj]n=O@_3N;Tdpmg)epu@7$6^+Po,FgJO\r%TX!0T%N5r=Kl@cZnA#i1>htgc=XPq\PHQc.J7cd!2D$FF!#q-.(K&K7/?T,8hgFFXcdU1l@aM'@"+V#f.N)JeT""5bGY_\h\IoJ$\r%')?Os'aSgib<URo7ocF7cqrYF(&QuflhZa^D5o1?gn"ZqchN_rATLXl+U(QK#S1#[pbtm\iue&L$RGG+`hr0+HG4)&O:O/,<A1C'\r%L`!7:2#6%;boN(__1R)D*[,KcY*/H*)7qo3#)YM'e0(d>%_MUY/t;8?NZQ:lN0;X?p3^lI:9RYd[dE4b42$ok@2;U^m1(WpLZNX2\r%_:mb1pB:6Ta9oIsTceG,+U(\Mk<sU-43>R9NVi=3s-#TE/u2Gb@fEjKIqNK`21JAt]LTg^XdarPH&i[6#YU.hH#KM.3`Y#uH29A/\r%]LNP*:jn@1H&l2sPEg06Nth>m`^dGL2ld*F"kRT%`g-9n\@[f@G097m=5KEn9["t_0(4dG',Hi,`m"P=QhO$jD`@i.DB00;n#^-!\r%)HP]>d2HU22_=EgJq[?5hQ%IX3S+/O(WcMH?]]-egG0rLClMF1+VbHCcWA;KY*I74'D+'RorrtEq>+L>$t8M+c4u_T"Pf@kR5u;I\r%I,(ZG:*RqZW2O48VmP77;'=S[iOc]pZdle6C5V4QJgd&\>D;\"NVU#`JBh2On.&0;dp(i1qb[)\F8h^0ks]U*o<r)/b/ecO-DZtV\r%*]V"lq(:>T.Tc3j@:-IA&*lCKR-gTdI%RO!I:9iGS0L1Y3(L_gS7BKPMb9`-@21H],?6i3dt7`tI]iHcE4l\]?6$[9&g3hY&RXog\r%c:OB&6L[J%*cL'g@JkIA6^.*(9a(Ih2=*q'r;/GqNaJEF3UGgq.1b7iN:$SOoR*i%PO3t(2VOL8NORHe.f</)@KDN`ZA`3=eB_Zt\r%nmT=HklO%MLi[g@,3rhsal2&_`lsB^[Ig5OLc3+1K$GY-%c8Z;l6>=jA6YJK0cG143fGlhbmK@fj&s[`V&dttHhfErci3A&5)Nbq\r%HVtQnM-@f\a.(H>FcbgD:#:n"YCf4R^2dEr]abZ<gjO;+Gk^Z]2\7*`C<["$&ZK6KW\qgkDLDl11]`3\0sj1V!;j:l8QeqM`'Z6Z\r%ph]uFA6XL8Ne[/lq'U!2OoF"m[ds/+o:G_T_a!G]7q8#hE\d6+PM4hrXlLflc/`*<P&"'hDjndL[Z[9HBI/Ftr-^Bseue#Sk;T.'\r%\[q'_[FYlQT!m+iN$u2`jiVgQ;[M\C&)`3Iqi_'sg&:7bL;)'E[mR_#'t>S-e`h%"V'gWShq3=pf#e2a^<$TsP78WSOqmeCR;B[T\r%_0B)8Ct0?Yeu2Y$6KFtm[A`_5ZBF3cnD(?oXO`GL_4eU_LgE&0$&^K^chn^c:0K!6R+]pSjiW+Ek4uP&_9O58GobjJ%UZ2@YLm>@\r%UGP,#ApWj3_=;%a$a)loQ(Qn&#q-:2j?@$fmFc-,$Q1r:6]mlD7g,]D8=Wd!D55+Ggnm\q1[X?A,S`=Z<qpT)V0,ZGN'5bIOfORf\r%TFT(C_0"hH9n3+jFIn+=G'W0+L77c_(C+It.3S#h9l:_^"d4.ah&im[1)'*3Us"R&X8>qs?bAHuPN$3W)'@+3mUF=52K$<JVFNeN\r%\Z=n(qn`ecm.@t\ILu5B:5*tRm*TP2.&Dg!aW&\-M)gp,S:.Sr26,!EIcul(rVXu9#VrR5X"kj^ZaTUA:m5A)K)V^=YDoVVP?Z_G\r%-[Y;ZG!)(.+*N9XOA*ji$k2]cDuRE1M+#5E7'@uE1+#*)>JeM;GUKn64%A6Le_=_$m$m@!agsrjjlg/38&m(GnCd]WmfiFVm44]"\r%."`rS<uE&!)FF8D0P`7.ZDh>m]K_6A:sJEk3jg;:6P.Eo_/#4\,VALamJN01/b*JCIhKZ7_c_9s4gji-lbr+:J,0OtmIMPhUY2Nn\r%:)C:Z?Q6XtXg]J2;Z@[`>N,la*4@DL4f<Y,lmaq"NX`_q$J>$!n1TqB:W#^B6fOX=Bp]p3K4u0tI[?GK`Y4r'X1kdu6tj44D=)K$\r%Gaf0IJm>GH'X>JX@8l""Rr*MQoe;K:;aDQ$A^.=!q?13m(0j190Ta4,6l+P(k]NgH9R#/`F:aC35qlGC&fqK[6-sXEo/[.HWuqs8\r%p-f3pXF`,tPAI(IJCQTlS:LR:c.DRM"\rqMfsT&JQp\/Fr_n;!8E[+Fc3="DreEohB5b"I<=hu9q/DM#JUQ4]PP.IP<K6`A3IA4B\r%2DALW$&5j2'NreZb`HeGot;,u302BM<#0F&R;_XRj%iqPGp_k*:L)[H>I_t_XUJ"T%<s(mJE&\sP>5;iA[NMP4\qc16A?&]22l?2\r%KmSiqNSd'R_ECEI*_p3MK>Ke)F8aYa.1<If-gaOD4KKl')s3?E)\1&fA>"''=`r0?F]rFeGGpcb*]a%]4h*n[Anr&CAM'6AeSK)s\r%+\pmY[^CjH2AoSj>%+/G[F^D7L@gjHPLV@lK,#_:bE0r8e@m_udKD$4S-!aYH72Ka5>CH&dI;F+p[rsopEo`U.!?.rAEHQBhTA$c\r%U=b%>gcsYfs*sIBd:K&WnkMR=@+I`@1>$=NZ)=0l9Ak1nWa/5rh=.m)-ImR](o&H8Xk+u3@@Q=/9)>tnEk4sXJ>1m].aG2&\!"<n\r%R>/8%$:hmbH-un*Ymlq3n5^GuY>(8m^u.3$F36<Vo1sL%hGb94LTN3N2J,KoiaLL24sqF1@fYI]2r`jU_qCPIk]iuHE1(qfHlhRj\r%D"*8h`PZ<T4eJ28<"bHP9g0!9p0RnIeNDB[WO)$']'>+cEfI#EY-*)f^)0cBSD3WqnM%)7iu@fuV;)WqiaIaE1m`Ejk@&l;.Tbf5\r%gfdG=RV(.UD<u$qYn(u[E9_S39m`9.'bcQbH1P?c]d=Y@Ip94:%MSfUciGjVdA4ZtWI3@C\M5GbA=YO)X%bFKnBj)A#sYFs%B>Za\r%opV6,-pjI_d9(nOrY*%&d3MHs'u6mY!X[!39Jkls1<f\e-G#1n7V"f9RPJNMiE"C"VTbHA36>qd4K`Usa1"qg56YH9M%=Ck*@u\O\r%j_XnOVFFLcI;D#:D5Sf>4-eFVrVSeOO?2qRp\'miKO'*L$Yh^$YF(Qe0.Abh&ZWim''siZjo,#q1OO>S3QWZfcu6Y0gDmO,7eE1R\r%mPZFK+:RHm?eoRZ/%0H4H#^9PH[3(\B&LG+Il$hY>$uKfq.brAW:t.[1tc(2k,Z,=YpR1Z^NllI(o80PFIQc7I%u/^\Q)njD,-HJ\r%#5"CgY'$1T<BIta2db*P*X[:M?;]rC%=TOo?rM\s!5*P`@Qi:UM,j!#;gJhZUE89/qor1YC2%m5BT_J%h&OGuSXBoO2d`,1LYlQ3\r%^\R/4F.?f/,rITeVe"eb!WD/]oCG?Blo"Xa_p@Wb/mr%pl8RTb4iCTI@WgX=[Uqh+Dul)a&Mk%$]X@F(>$AEQk5'fNqd6rB7QgqB\r%cY^V<?seZZ@42#=S_udl`F]6"qsfK2p)[q<a?#"SA,uM^*+TUcq2l>hnD`2:EDk@Qh4?9ji1#2T@e$Z\04?g9i).M^EGQ+m,?egj\r%!*bO$SIj&XP77^Rah[g5#KKLj)8'1gX?l9tR^M>Ob8S97cW[a>[Dg&/VK*KrjhnMB%n$BfXaJdPiaKa(9N1Ljp)?N@m-$TTbng+G\r%0HU_G7C0l\hYiV?!H_n&]PF1]Zu&n8C'lb/'tttKDbXXu=f4j8WKnK1*rd=PPr9g.YM9CHH=*W-YS;XOh?UMU@+4l3RhN+3!h8,O\r%.:)6s&D2%md"/tZ5A`5-9fE-C=[g#M?^c"!*<`7?LNcAo2I0b,4T?T.(<r\'4b$&?<lZ>(h\;+'<3i(S'BeK;or55B)Q/8(2V*W:\r%0_bVE'rSf6?k`GqRE/u&!ZU/Q47ZfT8dVqk0!^BIfMfu4MnO.C6NZnaAhcV[ec81?$?u5nO&!^`A3)S\7["S@(ha?J(We&j6"'Y.\r%fY&Wt7L2Zggstr73@3)a(nq.N"M8m!+Bf#$fuN8%!XNTRkJ`@;#\WU,ABp<^BBH.&Lt#N^1$8kWU%sA:c;%3qlea'"QhSBXGiama\r%MeQ0=ZE-04mo?E4Nml)fj:o=u#J2EU9_Ruua5eE[=I++_&!(fJigf.-RV`5!$GaQ-+%C2nRhhC/fe/c\FB2h.:Rl@V`eNkATXV)>\r%VC_lfm?mhc+E%'!_qU\D%n?T1Lq"rm1A\s,kHK'W9*MkJaDm@>ZCN,)%QQ.n?FLU/=s:qO3r:k@agrq:p,.fc1qRSW`1/[f\TGo4\r%_2=3U\V+4\#;Q'skNCqF1;PIZ7L?\:=M=OE@J&'W=i2Xb$(-/fQ%m[p"A?:6'Kr`6BPTKV_FYD1TWQaH92h?eLpgF?HbdrRr8kL"\r%Zo,^(fmg`miU+H`F]MGn,.V\6PGr3lq"C?:jj[4?TX3327,j+hN-UcId/L\YanGTHqNo$QNMX_.Qp!]hJ?Lus2:bW0!PUslAh:(g\r%^)#d<<m!#??^6Vh[>%BPD$!3J?i^/KN4d_Ri`\?I<,O./$2-f__@1Ld1/c*o9W._8nriJ5ba@'DJ#Sb+>t]rR9;80d[TUjao@Z.$\r%WTcEtc-D_BU#lY)n-o34VeCkGYhB)kRU$Z\<:Wp)f9+*.%ZT.%_`:cPOMZ/0%>S5'hi0/2=28>^&r.DIHd'=/f?:PC!$0NInn;is\r%XT6^mWcA(IQi_2)d_Vci$XmX\;8WmkK/Ks81'#+eX0?KMjMBlXqKhZU1*P*^!RGsV@<1=]N'^H5X?0c\n7"Po\uTl1-SG6XA.["5\r%ikjDMXWKtHj$AieVe34VR03N!>QMV)Likj,APO"'!A\KsdqU@m+hsIF[YVdDV67s4AS\6<8u8S/;V=D/8u\k3$<!Rpar6pf6V'Xl\r%'/l7S._6db<($Pj]FKOeah"0JZ$q9JR)Dl%$f-@lA'8fc5T='UHBODA!ldmpM\1jb-=FJ#>ethC:;D*g.;Mn02+56)l/mpZo"+=*\r%ktWl5<u^K!BZaGl@$V7LnjdH9;DUeSGd`?Np-kgG"Ii=n5;U7Y4.$Q@:*Xuk'qqPV6[*b7Yj+bt@(<jR:hR:f?MQeMH&(:/.Q*F"\r%7mgLkMr+DV..G\%6rhD5"KFCO1LY;`<?f]B+ucp?QtTNW_P"^EMe!:`5$]>i'hh/(OnUM<6L$qA/)"n@O1k-kBO"WJp_3EG!]UaS\r%OP$8'Oe)OZF^SlM%:ps*0U2=HqW&jTO_r4'AtO/4ro`(Mn")6ZDH^6$qCN1f%JhM9d$fVa"S>V*NMZ18&7F&/!Nh4>+e44S>'On`\r%U;gfVOY6RE?`\nMP)7[Ad`)X!Y*9)DVOTja?"e9o:_o>p>UU3#]H$[4T[79[f?3%)B;ZAcB<tO:+0=Ei\$J3el36MPC!VkL(;HK9\r%fAFIII+CS?DA\OX27)%^kWffAJY&2#DQ3;XY[[=gLRVuQ]s.e5SZBcgn=]m#HTQHr^t6Y.qCEWn*t]rnF9\_6is0oJ$R[%Dhe?K#\r%egq<ooL39:f`;WMoDh%u>"de.NSq(uLEBNJ'^#bf0(dEFV9if+IiPOQ*Z!,IHocG;&746)dU\HFZ(Jrl2cDK;E/>'^0^ZNl5[d`R\r%3G2_.?=9q)g)2L2fae7%MSMkfKI;`%=iAL[osr[g/,Wh_0CN*A^['qJB'/mC5Tah%c2MbXIWiEWqY$(u#:j="Dt0#c3HEEe)7Oc'\r%#Du"W5p`cnOG\u.iq1\f")52UZp(1<[$O+[]RAR#R]TTdcd%.!+hf_#0NM)=MM_j(1%Co=(j2h*LA)gSa>gmMLr8^!8oEos[\;ap\r%8--G]T)=%*W#S'9n`mWo6i`pVn^Bs\Af1WCStS7WrcYOCMrk5+Se3Tk'$.d],HYuN1seTuG2(`Gj-dBp694BKrTB!0j68#e$0,WB\r%c)QPn)=J:"NGi=aW\_[oL/FSm"59R4pEre,_P#.a%3W<V:$d_KW(lol.LAHs-+S\!nR.5>62>-&q^/Xs1[pZ>N@_hl1SAFKI2LZ!\r%Rt4F!/T_h*Af+-u3NI2;:pbRVIM`F[8su]U2d^f7>,br\667pJe5<&GLh7f/SMF3gZ>h\3`c[>2XBAp?6UP^.c**R;8#\O?QPEc&\r%K)7=Jp@0O,WIr58f-m6(UIZ?DKDb(E`$er,qZ-I`>/ebPT12X,>g;H$`o,inKV\bH/7,U>*QC`s7/ueY;*7tPH\_,D9'Q)&FX-YS\r%d@JcV#MXsQS,oae>GY_8.hY]fXnc*Z66_3m83O;!KL?@dYgXP7cK2I3BV$7nFmUXOQ#(<odb@\a$_V$"k^T0Rs!deUNE1/[OH-i/\r%0=crm*&iG\psQdUHnNbB&fsSam%mGuR/-Yqp>;9Fh%+M_aH&j#=`DI0Br&]Wm-('G0<\=<_0gBVSuWe1Be@Z)qsL]npVEqZCEB%=\r%q<)/aGF83Vq>%F<6tYQ_o.Z5D9:rgPGD#M9S#>u'lLZPQ<Kri!SA'(MT-rmKcXe>:jmQg=%b%E4c_lEF9R#S]Q*0SWUh2EPgFt,S\r%gJr@Qh7;5kF=#7^3fH.FEnHZikUu20YeGSa4742ap"2^Qg[>u%Ej4FpY&i57Nu=;V9-rK3=;+Oq`>?Ce#eDJ_NL*0\F*Cqc2I;D^\r%Bq5[n8nIe;U8ncO``lQq!E)M3'NhZ/X5m7cR+h31W>J,Kg;_3G_S@do.Kr<6QT]DdG_AoBeL<3CaFnJ*PlgheUfQZK>4]jN'H$5o\r%k>G^d/'#.Z4L-kpd-GPL]&$\.\"=%D?_gs;kH3//AU\fMko.q#GT",>TPr>M+1cJ.I/t(kcDMG96fXnt?<`,*A@&(>a+lTpM*L'2\r%n\r'*7INk+q:f($r;;Ng6*BudoU13PGg_%j:kQ*^!GZ-_l)ndTm$SBb15OYn"-S/-%d5KqF@!3Gd)f(6,"f7$>$7d"U$.?KGb2n<\r%:3o>)Gi%i3R[H1Z[fQ95K#&+hm\2)OJ=bE%E3>r!M84?WS:(S)M84?WHt1UP'D=F6j*>=/*++%89[n5t85s,kaESbPNdY3JT![(8\r%?hWRm!,:J=RP('08/omme$`-\J@+i/li"[_TU0U[&#KUl#5$oqoCe<P5Ka82n'G@.XSe+%fg=jJbhFmKGH].8IHbg=<dmP][]ZO>\r%GoVAB<8W9((0c7NT6k'6:BX/N1d1251$*Ua;h*Zb,F?s"ATV':,S='YURM.U=^>9%(O/NF<`a69Jr)NS@npE5<%<$B[f1iG.m`Gg\r%WE%c8DJr%kAAuA4XBFIqWAOAqB+gB(b@Vf$@qpWl4=rA2K24K#jNt8u"eY.9.E0+Nf,%@(I'P+C-\>.?X)AW':\aM.oU+Rc?o4k`\r%?["eH1(Pft'm4PJa.H'eM?H\)mP)fIq1F^fTn[e/lbC`-\6>=%7`&o>EL<:,_#6O3Eo?n4`kZY@,JqTlYB>s-W]0;SW6SNd4Y8I&\r%]e(LC?7Tt)i'a*o&\AZddJCl-_a?/qb*kF:m<Gis3cRP+=5jiA[;;[!S@dun.gt0<f=b(n[_<*\B01g>pXobJ,8u3PgGNJgf&"1s\r%DG6<\cX^pr"@#o'j&e$W-2=GPk`*g1Q#P&0]9Qqlf$N+E5M51\2*i`#:CtpuX>h_G1%QWTDj:f1frn"4H6/,Yf36tUZI^e('7#Q.\r%G_a\.F6lst0+B3mc8@b83@Bo0<b+2mY[#ZUaRY$aqW"?rKe0,%bP))7"J$>[.aC7/Rj&3YUJH8mZLeI)`l/\8de@F'!`#HuKbCL`\r%@!+2!:CA\;E.-0%lfBs/N^ATR-ZWFY_t8eh?S"mE(ur<IE&7Y!R";sR0<pQUlOues8qY?Al4ZmT6Aa8@/BRaaNTcV7V4^/3egHi+\r%`MHCooKgl=NLX!8YuOV\hA90?6%.1Klb4$\K!&W5$7/lJ5g#t1Z\Gj>p9kSRUs$?+lKaX4"bf)I3.j.s"nYUN&ZjQCO=I3h;^>*f\r%%C@$4B?[F#0kd$E9Bc4Wp`3'RGIff/"UfWH$mPr!W:9EQ63DZ3H7:g&Qe>.liOiECCf"a*63U$+&S];7oPhW%XIQC1l[#Qi3IA6K\r%<Hu`I#3Z8Z>moeX-l>(5V^,?J"QYG'cS&M,"QTpHm0O@UjID.RhYHkRPg/(D-OcbX0gB`Ym+t\^VP2:CiHp0O6qG(WS'e!U1%]9R\r%UNi.77N]X63/RrTNf[[3$);`tDm+U^J5V%&T"&;#LkH<L(4@ea+cdAsT]p9G4;!7aoX-brD;A!4P'?iGH?(2YiZ=T1kt+Q"_ksUT\r%k4-fDM4DYN166YJSPH(Wj9a,lfq4M=$*a,$`Gpu!EtuN2+>[)[+!DVZnU93R;_5sT+D8O,EPU'Nqj1C)ER5s>-H2#Win5B<+YLEX\r%L06JoYq*\2E3<^o3N1st\<Fge'/_<\#>Jj\g0>VQ6b$g\/-u;4HBrk?/!d43/e6_7!ncuH6-BbaEA!6)e(3L%m58)?*LsY(iQ*Nu\r%oF:&OepMbT31TlRUlGq!h3C<o]P'hW^0]a(TIU3QKC`rd]92@`,dm<*ZhF409_<O(RioGrN,6C:Rt]"`<T)&#dD)EB&CP2aE_(Ms\r%#EaOlMc+jB!9,e1)asD8B<afod!jiQ_hb!@+aiL(#O2n8a+NfX=Mt;PX@@oah;aeU5!>qNF<9M>[S#d^O.mS1^k8L?+<H1:%rbia\r%&J)a/#J2]<)Y&?-AaE=ClI?c@HaUYQOhY4nV7@DJDnOo>:35lQZ!$j<O.(d3X)U$1;\!WB7%eQQ9Y"c3E;2`\>aTP&4XU;r1LSAI\r%%%"A;SH)X77?rDC*%nCIDdJKI>#,`e_FT1+<[<bTm"n';Bg#8\S!Y-13N\))8qD7NenI:gMlCa7co#q@k3OQGEPq_'HL@5/JK*aD\r%\PhODq)X3sh6=_/C0ngf,6G\Q$`\0`L_jZoI5PmZ=VHtjPC,<JQl4gaWH,n4b&sY5.bl`;Kk\+Z2_6DiK?juO+r`Zs-+[Mnds@Ic\r%c4,ClOVN\i[,T^Y,&S7.;`.jO)s2BRis^6oh&FCroP3JSgp!\T/An-C[oSrs9MP%9nlg*,4@=HmW4G\%U0ZP:g$)<RX"Y&8aUr4s\r%(nS?q@Irk&*cIY$!E<B7nA&]IR+#LkcNBq&?pFd[l[dG'0Xl`r_9a7`ZgFj$$pLsHrWI5V1gRNp7["0#171BJKfqkt(e9-YYYmV<\r%RKI0(@AIDW!tL^kNCh0X#95G!puGr/!tL^kY*A1%d2XjmK9bbRd2]A-%S6^4N95ZL^*K*ffF?(+K3<!#*Z3-&UU&ApZ-:>D"(ljZ\r%Z-8%,VWiO?lpfV0;k2s;@$qZ5bX9aBc8);A$Hm%LX6pZ3$=%nTYT/rhEPR/f]eWaQjICO#AS&3l@lT?4*Z3-&"!oSO"/@ka,$iO]\r%78[C#>)ihWF220Q;6C-nF24l`0@L#5F0%bm0U`)u)%fb00U`)U^QBgg?o/)s?cc2/0U`++XHVak?o/,4=sqMc^h=2p9Qm[c?lSq(\r%rF)__4mg"UTdB9S8c*7LHFo_nCct6l@X-WHoY+3r$l`Y0$)uDe_hOPL'UETm!NC2fYg5PM$C"6lKXKne.o8,QcoXDSIl#.k"^5/b\r%+=g8(.<&a><2a4T+=\^gmFGScUDFgK[Kd!85NRgjhL2?q`I+<-:-d0VJJ)sR;Yja0EImm(UB:Vgf.%"ALf>"rWQ1&-`3ae:V'D^U\r%[%mm,(O-&=aO70&OS/7,,B-*3X?:K-TVdJG"!uq.3Rqn3>TeZ_a9QP]Q)+K82*HJ+QOI[h$BHPFOK@o=%nhdqV?f[h@Em:/T!qrG\r%>!#-G2,i`!f$Ij+$V6$6;?1EETL\rg"Xh>UUobKc;u7Z1L7,0^R4&m8Pn@$gS#`9K63djRD\iN*5G/*qDkh5"s3sBM?Ir^1#t?#!\r%G!%kn)+>2)Q$Qa-W`1%()M]gX9G2G-Ji3>3[uB+[Rh<mWKZPjC7DH8aVRYh+Es-Jq8i0,d,KH#A:P"uHeNbFYIgUDP75RigqPR6E\r%*"o+#-Hg6HO&Gf(r'bA#e!e-gUKRCPr#&m<UMh^'i:6`ai`2AhZP8e*>CF\_+%U:qrkpi<c]&&(G'NT78*e>g[#jSnq=oN=82fP\\r%ci"3Pg>*Ut^\e$NV?a94^?(r!cm.iJPUJD2ND5rpD?7ZF!H3E1h,QH"hR@DAm\5&6!4Qr)OadZ;2^IB@XJnrEE$H(+Z+BeAIC[(8\r%qkJdEmE`E>-FI"l_X9;:_CQ)Bi<OIlWV"Kh.L("i3e_hk*Gt]nY'b^:%IF$,bgW(E3AU288"kOYAu@!kA<"agJer"go&jfX[Fr9<\r%-$fg0`P.o$HQS4%)tS8j]mJGN\ceTsT:NT9oa]f9[C]JM3m%Z@'D/-XILXHe.Dll0+6</_lepO:hY$d1CoMRQeCNDfUpH,l=FAhE\r%Y17d_(L7*ESPK%bmp?;X0[LbQ2"Jub_OA>Og\DW@kjhnA[9&TbMs&pn\#ET;KOPJuOsZ!.fHuEY0=Eh>j4TkDZK;pHIVqGAo6/WP\r%l/C'Oa"l%HH?KBBF3Z;Q*a]%SS2U$F1[qCmIH5l7d2&D]B92h6\:n'3FOHA!N`E`2>Bm:[pX/<>XP2l9b$KY[(g&k\X37p:J1m5C\r%pJ3DZnF%3XrF3,>X9Wa3pnoCG=n"T8?c3?Aq2&Tm/j97&ANre$Hhgh2Si[%/$fCKg:T8@'fal_GkSdA<(#([QcP<fb;B-DZ-;rA^\r%`UN\UNhP3q(/bRcAlM_\2f3`Qc72k!<[1P626X$h2>GcA6Z8::jU(7t_UaoL=9&44X^"n^m[(Kpnp_%9M<bk4;_\Kr@2n>\04u%J\r%71S!^bRM(B837m,P&#+@IC_8a=t/q?7b@AF@)M.mB[*uDGL'paKVn&EHc=7G8tASDVt=TKe>rN(/.YUUXKFK4U+;4nF('+u[kZ#9\r%L]u!W8>J!F`4iCskKWmV[jkKhYOf0`m8!pZb\<DBBo1M*FnAfb7.jZRH4W"O_ofb8geoL'Blekc>A[(A[T&ABhA4Jeo'?,M5'64R\r%C$O#9<eV/+2>=gXW`fn-D'\Q`L/YM(ol:J@KkM5r=/&lWgfp[B1^ia0QE"-d[)O?2ZV[N&iYln!W"u+1ctAbG/Uc9Yg)!dAA0n&9\r%l;S/=/=N_:[1LRa8mIWr&Z%GU\oa$,;PdQQB(<)1V5kAP:9@i"26%tG`96;\/MO-U%3=k(T1+<Gfe_e4*]D71IX1Ui[/`=<3r<D:\r%<""A:Rc`_8jcL<Paa$n0i-lESYs(CVQ^"`<fA5\^>eHNg?gV:3@(AChDjAbai?n8<r:6Ru?EV&NbcCPJKuaYKQ'$ZPqhWPf]Q+1^\r%DQmLt!0mA[De>;b'da&VD0o[a8k4Y=)fZVkHJ5V=(B%^Q!r>?"d4[]DkSp:eF#h]sj=(=H?e$tTOXo".$(9pkVJ<f>p;qLXp\3!J\r%<in\e.X2b)>c[4',C(&djH;F8(HT26I\dII75W?-duH"J[#!jI5UI'V/I(5Tr:)X)TrNXQ6LW'mTdo*gN`B?#P<ZPP>'O<M0oJ+4\r%GXGJ[:diC[Su*m.:)#q(mu[62]'K(M"C<j%dC0X2Y=tUJ,BRpoIG`!trRL?hc5a6a?=rB:FkGs)D*4?+EWOu``RL+mEo)1,!E*_$\r%ZKD0^i8'[qktHDT%bMl8$cAaMIV-oB2?,MQ9r%IC\K@>Un>N>]Deojf8).gI+44rFd6p:Q;3[QJ9#qt7bZ">c<%iIKfIkH;Gq);^\r%,+,;)g\QW"W?V".U-'/bNbd)7<4#/mVT[7`dAC!L(0c$jG-s9$0?fM?<WCUP(J<kFr(`]1G1>8RAAUJd?hjH/f`d,REH5X\PQ`YY\r%Su4WC%IGm/m,:?I_P+[:*;ZJa3eJ$HM8Lk]:_qW^06qiqa]53_pN]j`,sHlo4a7rH1`_B69A,'QR_qM3::p)BAuATm=Mk57c8MhL\r%\h&d^2k]9/n77lNDi/FVndRYcg7@GQ.F7OcL+2g@;ON)uAQJ+IQo70Hf(LH6X<J9Ur-9a9I=\XNVR#!&.8WUKM5eR;:*%K0\(KbD\r%*m\>ub:o1DRii%Wb=aORQb0od9]b_t@m#VRc:H#1T#=Jgr2uh+j4OrJ)5DF1%hg^W-ZKjH4tk:k8)[<-3%qr#=+O5]idL""QAs*X\r%H$\AHkpSRF-tpfpVk_ZnCEo"&MT\ItE<RAtOkD.`_/M.Mj[7PVESeY0-$1PRpXA\TjnN%uS?(aU3tHZS>dmN$jTGBiCs34u@YMEh\r%p+e/<ZDm5WQP><HPSB$Bhj?_US.gg4[:QjA$&_6Cr8`c)6+/g"(aUmPj_OjY-Wn:nLC%Ees"NDn`AM1d76.]LP[G28/;bhsK-#qs\r%*bQY@!>W8A@5hPan/Z?//^9K"=>qn!^pIX57:BKT^N*BOLIYAl'><>4Wp@nuUe2#1?\J#^0/dF_QgRo!2>.;V&+kjMo0ZU)iq,lP\r%l[E`naGm?lV8hKDJt/rs=H9-K+WlUq:**7(Y4S:$=/57E]i$N??Sn*t65ciU5n2*SG(,BdUKU1h1U%i+VP&)sKn1[j#>s``_BN.k\r%XL(U%?>g!r=3UMF2qDW1b7i^qk`d&F9!,/eNMuJJ`"?_(_b>FSLt)(Gjlo8Ul)?QTO8W31DLQI[b[,"nNH`]@qY4,"rTe/<I'Gur\r%EG</uoK_%Fpj\f_,3QTudjc=0ZfRsP5/\rfen:Jim.*BsS7gU7Zi.17hh-X_#r=$W\Q-B:o""Y.Ap&0/!7U1:n2gD,=S-F\=>-Q5\r%jra@Fn.a`'E#mL`.D'Z8=W$hg0.Ie7ic]MVf'dtQA\C;CMO!m/6[:Sk4b%H5rTu9AT+Fs),Ie3KXk0'..h<I09I+`KX0n'PhQ&s^\r%$(FKTY-`$k(/lWT-%t]7*`Il4$.1-g4:?Z/M*&J0O>q7Cf22M&`1<<!Y1/\2g]]A$rsoce)^#_^s%_AJ4)t"]-LSsH5(+4.`*IYC\r%A+nS'mQCBPGiI"]+8i6t]@m$uq_(b#m@p)W\8I7pNQQbD`1?)hh-W:<;n#W@NGS#<0/.Cd*=N:7"o2c5AfJ^KLcN(Oo\YGDY>*a9\r%hrgO8<rY[2eiJ(sc7\>nBsF>JP,92OkERp2QWc%<b+2"_r2?99MP%4";g*>"3L<M!<se*4c`IlU<J#;,nE:"(Q([A70:.ZYaIjKi\r%Ql@=:ff4*uPWDJs'cV7)(j!U.Dfg\b??J1i<eV0g:[hR^JjP;8F0g.?,(jbARRYaR<6as7Bq-7RY;nF6*'5-g@hF?2krjbe2hj%G\r%Ur3??iuW:M*HNHlO$a3b(j'7)F$ib&O?p?*H5pR5Ed.j*X#$\r->jPa*^\rcQn1)d%T@s@N/%E%\87b1\-_`IZ.2R+\CRao2ca-M\r%0gF?WAn]^2?eltYc*UTFNb+S3Y.+dMiF8jWfSZ0>^A?)lT\RJ7M\.fjU%jE,.X]-Z>TTSfjOiH=R"6X8:$<SDWge["S&1Z0)TL%c\r%HIE_7ba*p-#csT6@QXcc#IdLn?s6a5<GO.@::n?j]bJ]oLS)Fm]ps3iXd<V*Rt'`H=ccpZQle]q!@`s"ApH3n58Mu&e-:O!W.?Z+\r%!FZ'2U(.eX#N^K?#pgW\rH^D@B3k:L>-,VYeulFQ9&.4$S(7-_]b37Xgh+gKd)OhOdGo(K_ej?o-5pg_)K#rLO@1ke:?QAkI&f)]\r%-I'q=:Z./Q--b-?S%_cGn<1:rOTM$@CufG?b7$=VS!CXg8Y6ah:5V45Whe(R7r+!4EE8%8d:Q)/TXus61RgOQ"#R-u't)8;"=>9*\r%8Wln9@cV-NXonk6>/R;H?Mm`:WiR#LVMAfi;X4Jo&r1Mi8eUo&kN$a,P$_LY)%?le,eaIMacfb9AHogSWk)^EpgY:LZ:'e!ns.Y8\r%A;MG6pQUnaac^`1c]#s4OsP^5FE>OlOsP^udk`2]93.4nb8e8_:DdYKZD:&-8DpMZA>=H>j`SZXI=gWi'm7W]-<\u"U3F`I,*C>j\r%5fH>M@@+'>c*+9CQ>B9"qtt3?AB>^5g.YIfac[uRlrY_%OsNi.q#04:OtET;j+RR\;p6imo%;=SfFZ@Q^-!1V?Th4,)d49J4Sbh<\r%a+dX8r_KJgo<H!(aNq`c-Xe75cc3gSUh8e%C7'_"8A`Z^,Al>OkpJq9[XTifBu8,q`;+'$==;l\?"Cs7Fi)CKNj2LDDVg=%^[pLC\r%]1=3S(h=D\,XJ-CYl:n?i'i<b?Y6Fh-JT_PQ[Hf4CHjiLN#SgW_DhuN=O.$YDt4dTAGLY1h+t`k2nT6bGfG_c_CaCib;\J$3[(=+\r%c+(#R\=n&N^l05uKH&9h3*=hsj(>>]cFDtWIR96';OsF*1Q(D%l%<tq4,B8CK1ae>QVeWE&]&*O53'XDiMPke$('in2u83^jRGK:\r%-D#48%.s/rkj(Cd5alegN:%L5))kTZ*9^"$Q5i+\cCVQ+@`d$CGr/)&XY,d]mrFQO[%Ih;@*(j!jOWTT[,_Zf4i_]2MBm,e>Ki;E\r%!Da\R/@G&>gXbf:GftEKf`LDZVDl5<H1Ko&MDMBRMpmgWcXA!i<J.3C\$[3"&?W<gs#J:_J,;@a4BQ:Qp%#*[[?KaWM;.s@mE(cs\r%GiCVGD]?&#-ZOJT.JgAedC>RpgV7pW=8SQ>f<s_a>$E&3#-4e2LF4aGgS<PdlRM_>A2B^UHf`dD^U;ZR_iPrW[]=L/5HZK%:u%To\r%0B*;`V3d\+FSE.lEf_k+B&Ckths3q(?:&CCeu.ENf:8=TN3;'!Rc1iue!=JI,BhY_i1s?"Dtq%'C?MYJMPoRc?-]5:1-*Lb"5>T?\r%_@pm-W*\ZWBt468aW!`Wf)$gG\eaUn"YZKUo.,.(\D=@RRU:&@m(=S_E=ho@Nq4k@EM.L"+4C'*=S%:k%cC!>Ob-FA3HqZ&L<U>L\r%ajG2VJgDO@1`!pE1jBbSA,s??K!O*\?GLt)ls=*eL`C`$nR1Dj6KHL+8_tH0%$<pO$P,^e#9lYf;6MR\RMd?:&0_?\noQNj9#'9P\r%fql1+k_\B+\(37]&I/?P!N$"8.->/cah6?Aha+!s\O]7+4r<PE/>8lVdiI9K[Q?&_&f^[ImR#?WL5t!m?`7UrQTH\ucl6jYTu5oL\r%gr4EFGk\b`0I_S,I:KAALGVI%NG&<L0DsF+h^gnH>^)-rLMU[VCr]sgTk?,%+AciXGqt3`D(E,ZGA$fc[T181nAL:Tddp8moX;tB\r%`O;&/A)k^M>?+Vt_X)Fqs(uUCNbns34^g#EH+'!%(fG-RBf\/T'\c[P)tSte-+9(%6_`5A_KR;IKkjT@$@N[DXq]Vk'+Il4Cb%W?\r%/;@bEYcZ:N_I&$ScI_Ae[M>X&97^p`Hl*amJ^MYQ:""Dsd'iK]\C)c+nnfn_JlQMh@A8eC@Co+cb*qK068L=Z"\k?.k+gU1md-lM\r%gBtS=5r8\]3J@b`5r8[rD$<]P5r8[rD$<P%\&&ln7#`tuaku5`-']gcQbY#KTZ\Y_p[?Y>;<-Vq<FMnlhKl,p.t4tu(EKQcR[KRh\r%lWKG#&fds/is@bIRnJYSZ[5_VqU`"Kf<G\K5([UY![pH%%)>76Du1,rpCUY?$D7q2,_W$B`7Aool[Z%/!"'<'6=>d(*srTF6D/7U\r%]D[Q#q^@U2SK%tK3#)3?nt6Pf#qRiK.hrC'8798Kgs0<X?$@ourJ85c#[3X@gQ2-AO7<$867++lqoBp#1:83`Y7oVjRa0f>`,Ak*\r%\^p%^.ns^WT%19tFCCOrK5IILr"1l:gIfrjgQ2,H/)4M\?q.HT<XBC^>dfpJIAH-*m77)_Q)e7Og5l$H=7emqFScZ"p^4^R\D*)>\r%]8u=)_UX+RhgGX>$G>arr7slI:?HCXipT(:1F)2S&GVF+:O\RR#cD0g]D[QcZ"EP%(#gD+/e*mjPi<kU;TlcJ-/p'p]8oJf"FL"X\r%J+o)5;W;IVipT'g,p#n:O8->JckFFVIKU8<\rf'2ne,4Zm.&K`=$/+d>-s1kKQaP[2=&]b%OAVfcFkkK0[AB$/Ch^k[A=kYprc)f\r%eAYnn`e7VK9ijiq+R>X+7YF1P"`^etE4GL\UGPnuhNnKb&'.*i;BX,&Z-^1f!\bZ,KlE##!/q/sEo8Dq!/sE+9M#>F#@&h4]1>nE\r%Dr_u)"kI`52PGHmY+(asWF;cK[Cp%[=Dl9Oho50Cq[rqi!>c,COp&Sq*dlaHna<qD:K'$bq.*'InNckAoWIhW5NCm8#JsOQblFb3\r%dsZc:WDBj551IjKcRC$QGehn7k/P:=j"kIA]&_Uh=DHHd![qLo2Q4c32:Fj,SVrOA(f*[Kh7RS>LRj]OR[%HT(P*gZ!TO0fBHd'"\r%ab,i^*>"9Ia!7q&?=,Om8dCjLbIea&j<%QiSb5UWpUqSU.gu'j6d.*<<gFM=AkBA8J>X)jB(8+?MSk=V5dRaC*32p+-":G:1X^NK\r%[+:T$&,N>62lWkc^,aCdKpZ!UXXq]ZVjgg%XXrZ6,-QQSAn=8s6Z)u>c,p)+E/9o.dE7%]`R*0_Mf6=X,A^r-]/%=KP%\Dqq-ror\r%/EfQ!KG3FPZJ=$G.%DEm9@cN+k2>a/U0J7tL"k]';(edr)j,-V*djsG$X2`,c]&V!JdLH6,md>.$RVfDYn#gFS*727JiOZ\iFM*+\r%kV,:S.8Gt_Dsh9nC3Dl]hq[$.oo5H_k*t+a#_&9d(JN2IL5NeRHCtgI>Z#+'+IA]8F'&2DodApD:3E^:$Ai3i3^[(Ds!kFfa(:Vn\r%9OZ,fDOBG($*qAMCV@SpDIWe(\'Digcnb1Z;DI1Vm3C&>LRZ#qO%@:t,,J<mV;KUC-k=p*iTGWt;+a'uX:^3rr=n[)(4ReAT)=Fa\r%Jm>9+UrAMU"M%E5Ra.PKi_O-J7Q+#3@+L[eRSRL9QOU/:p/3oWs"/a9`)?eJ?pTNp(4KF^,d^rpE/bS`aH4`"goDQ"O<L7Xj2*Z'\r%HOKaZ6&'cQV@2G9dGHP%Tni,I%IV#7HS=IDr/BEaE*!7Q2<4ko2*HJ+(BV&"^Z#/(H4O:lE6Xk64m7sQq+hK<X6(T+dLKjW_C\Pb\r%Nkb8,\QZ_To<<GTl46fuZ_N%8g:]_pTm*>G1Sa`Mq:U4!h]"FgV;4l<LT\e%SW!*5oi0YtB^FYYScrss:UD&9:9;j%kN^F$,s#]A\r%=6E[WiA;0()$;LMCF(3Yd$PL;=XB(>>$2n<=Rj`M6;8!FGn(c:`*Y!,IkLBaaIio1gKQ?B,D.Tc/RnWa;KB?V[(QXR<s>ggJA%fD\r%Ep/,&p6M8P9cVVkgB*,R#`$6]d,(M&3YTjDU[9XT^GHEaqndHkBR;6p"<HkKg#pLmEB*].8`Fmq1eOh6Q(m'!^,'GGDeE6E5W")t\r%QcIrdqoVX&h64-lo]IhsfBI$r6GEp"c,8A??>[>dj=:%L,S*s+TI[_D<5fb7]>'k=AFR3E8#..9'Hd"(1qtPBK*QY5GkZSt@_^+P\r%G4gU'ioXXF:34$dRR;OG/)YRSV?^[$[fUF`1eVla?0%MG8%/P\3csfupg*5i9J!bTs*7H-<Hl]$UC4Grgsd+AaOb<@P*jst)-sI^\r%/N:*!iR%7H4SO7uXR]7n1ntH)>t@\,d>T]"^IV+:'sEYhMrs9lp((VSg%cGH.c2YL/$n\<%SK?0AbMmY/smYR"u:9R+9nSKp;c6k\r%[ToT.A[YBn%Hkhd3OK$BCG-g?E5kLbC5XFK2!LtkRc)%E=#A%lq_?BYMh2Cql5)A2i.$i;&V^`!10\u>:1;C'S!03N2AjMO@1J-A\r%fO3X-U7\.]2TV^Gpek<dmNOl_fn,ij!&fWsptgBIrVh7r*laZe9meRYiNe6_])pWXiu@o$7VD:8#[,QqR@<S$ipV%e_f`'#I&gE`\r%Sg-Yl8k^4Xi)^V40]*"i1IBtofCU:B?k7[jL.(!I1DGZH/#<4[,O#g)D8&P^O3lA(aQp1/#q3f@Y7Ka1erLG5@V@g;ZJsJ9=or9S\r%V5s)'[s+t-PuT"R#+eiQ<*&q.$FCXI<fNY:pU'sHL/tuH-`*S83F/X"7oeN)6Aqie,.)M1A<u&7.3c,9A/6GF&db[<j)?haSLCjg\r%i.Zh"K?V1Hc(eFJ]:WHk6G%;ih9e1$NHR8/+12iiF)[n\K&&:I+kiK-El,Z\Ua7f`&burLU#!8pm[gR<^PJp38#+nN_!^\-98%K7\r%Y!)g_j2RJB9gH&M?E*JPQp!QCm,LfQoL(q.7QJ;ho),gqUp$]j1+DGH9Q-N<EcJQI?I!fI=f8aX.rn\j>21k=ZG:I)0J$Z,NpiN-\r%&C/AaI@6LkKe2)3L30Q)Jmt_O#6'HGF\\ZTU+k(gP\S5:%<?nNXm$H+MF/`un^NQ"K&Y-ulH(?/(DMX"'LMAQZ(SU(g&4T(;$_NQ\r%8IC@N_MXe\Rql`,5OR+>]XUGV_7'B00qMNN6L&rnA'V"'=8h!O#EE5!Si2pd4]mI9`LQgWK&Tf&9$C$L\[TkY`rd:BMd:#cBq_Tp\r%d%nn+D)l+lIggZ?/pCGc^\-@.\^8>boX(,IIcnDZGAp'pCDiDcWD^@<\\$<IcTh*Q?pKTc)u>VNc:bGfdW"ZkVmu&S_>E?;>XmUk\r%^KjHM+&s[/ZI<'bEa50D<_isqCNiUpL5adBie.6ilm.]ST@6p_aN(o3&9kn3Uog[,XpI5QB29%i5]ZUDO;^.6ZQ:4>;`>uDO%4fC\r%<]F!)e^IC1[;sW>BcCD4B<?)RRiT.chCW!adeNNMf()=t!"sNq*lmtF?dq(hcEt_`rG;9XVZXC5k&Yos78F``)6u?c^NB)(VdM$'\r%AH*89+Tr=:p<.K)&*OHM!Ni3_EAG`XII$!9pN(#)[5:/C5.j;2'@a@0A)2OUbs1\\?lAYY9SbR=qF-!OBiEIcHe!m+X[l)oNL&[.\r%;2_fo2-T2PMUZ<"R<M8c<`WOdQFFma/glmr7LPUW+[oQICUA%fOp&0-XgP6%8@mNdq#-^pY0jhPlK3)LMl*m)bn6e\r/%,C2-P/N\r%QiCG"e5eEgcun4KeQ0'.ZMbTNg=lMq`i?JA[2+"7'X]gGN"DnqU:$:899!f3)=NV4<a/%rr#(LE[bfH$XtII(7lccsh]hB,r8^qD\r%h]c53&uho%>Q/cNWr*X[=tjfo._eEZQJIt',eldr>;-;_._eEZ(4*hGbAWNd-[^\;4MO>Q<:F3ojgS^e8kJh1P268*Uaj,JdT5RG\r%W@YeQNX&?Q<V\50hL^#G<V\50hLZKDWr*W(DkT+qZMYJ`[\:%2/AFX%><)AG/AJT[q10Secg\Snm\R4KYGY2P+X;J1OA#pmT<JWI\r%ZW#`ZEatII9hm_95KU30XN;nbSd`k=aiZn`3_;Zk3N0oVV:9<nF'C$tjWD:UDe(C#<fa%bds["'!Bf"3Peie:bu?aAciH7V-*+t]\r%irM8a-3%\<f3IK33]7u_n@mX\9H?#3^SPd+5ohl>BpW>P4P^ASi;MF(qet4B+#_r=6)"nJD>Z;=[IYD`fC+R*rK82T"h9>nDT(I'\r%i,2HFpA6*3:UL)/$YZY(g+9Yg;p0ZmOc@I(i];QST6'?BZ^ZF`QJ/Am[8;4KGeZ,N$:qoM\l2hVfnQJ9_V]B*s4T.oborEq`*s8U\r%g*HC=UcF[?J\P)9hAb'9^rh5jia/fegq;n'mI"9rHRRm0[,Z]MO0j[g[Cq-RlQ!A8p(0@OX!R^&eO8;(C+7jVJgX59H\fibde&4d\r%&=5D1\T#si&38o[H\fib_??kap(3QNKVtL=m%L&>YE-SlB&VdLhChZ3^<G2p[m-XCo)<+p.F+`GZ=s0ZlO\sY<)Teh,Abam_Tk&R\r%^7cA*$J_kt/_L;(kbhNkU8,1$oBZ5N50H^GUI9sOdNs:3**9'XM,a6k$6ltD5`$p$!R2Ma,0)M/m"N"Wl?)VR)bj$C+ll)`nVBAM\r%'6]3<H)uBU9k\+\b/ZknAJ?;k%k7'f_B<l<XQ5N_BVT!2hlANE6I'BX'8ZR)\SncF%5^h4-CrXOj##\d,*gYCj##DI4,Ka;5lLEY\r%S-F(p8L?;gEZ-jIkj4?hng27_8A\>g7;AKd5B(jsc$*RiIi(Id(u2<hLK&-u9,AF`>D5p+]m,&%<+ID-!aj/SIYSY'D+5:+?'O&s\r%UE).3<Z>L("!HN-,U<k#bhi9k2U[c.)K6E@F,S&rn=]l?@0^iR_?ur<N^u5Q,e4uER>D!DeD:4(,I\V(B"brg$p$I]F$=_m!'5&?\r%]_n&[Qrg]/?0pC7Et?$I5\fGJ6OTP<p"EJP!(B"6Pm'ub@OV)C1D`<1DU<nalJ82fJd94jFo`;'Nd76I&Hu"aRaKE5f<UgeNY_oQ\r%>,D6m=F&;i4DOjA!@ofB6HZ@f&gjuo9N8q%4g5A9W*p&"hRd*Wg`!%T#no"KS/S9O;C0^_V$0RhV*@0/dA9J*PtHDQ$r13$S9-BB\r%@Z"![_VD+0!?W\<.Lb1TalgO8VS\q>aAeP76]uODN1RilHA_Q;FMA+*Ks@dR*@bI6-o0g^(o.@LF('&.0>7i)?h[LI%$'_i,b,6P\r%?+aT<5iT=.eu:?F?Bd<2&O/q;7HVHhVo$e>(,m$V+bR]!<siMXJ9I*'0$Kg$0fD6_Vo$f+&XWraQjPq1YE[JiHb5<@Ph]21]2P7I\r%,C)G[hXgK,/td]BBORX\O+P('Wt%Y6\Zk,C;WFuf_cin$hKl,p`=K%%#EM;+$A,mb87@Lo%uo_pR@0&o2FV+l'cqQh*V?@<-r2fI\r%TjCBk2.%>jRBP@K:h+TC5C1<GDJD0M/;MjT">(F1YflQ@^QcGn.OWHu@$N"\AdL=td/>07AdL=t@-1(Mbn=csi,u=VRjHQpJSD'e\r%'[G>'lUbl?q.3nmK*0e[W"]_Q<M(Cd"6l_^'TS[l%_BXm)a*I)*8bL9Ku&E/*DMSiiV[c8"7pX/Wa*u=5%cm3#E^GT3>ie`idl%Q\r%-^8ie]R]u)iW4ue-m]pRB5mkIM$Ga)Z1'F:i*YK[h]j33oSc<`*_`GMjCE3hL^*u!S>=(*Y]NAMfSEdoP2qdW4UCPsq9XXg\8%8U\r%o*7E"6K0rekRFeMemmk(bK,8U"9LOqj#8lE%cT8"_W+f??"7f<AL[:DT&W+D')N8.i\uL+V)Y!Wk_7#p/7'DUJ0QdtA*JDV!(UMr\r%#'Y.8"#pqR2sunK>IZ@qr$J5O<iA4()o((EDNLa%qEZ<C&2^Ytq*E-XTYj%4<1G$UiW`9E%9,P_`!t.:<^0-n%C0%OTmi)Kr`Rob\r%:ag.E!8kWR;$*&ts//ZpDSB"@.05F=?LIh4-",N\./ljGpm2W_[jV7hDNI3l&7r.9]0XdD,(n"W5m_5KFl33[,p;sOcm]GT:W*3Q\r%8cUl(0@PX7k3b^B1fMM^U>2D1oTa'dE9IL<gqPM9lZ;$oN4rBcL)<DN!nI`DIqPh?M19o=JqhHrWn]J_RuQgW$*eHc@NCSS4S2=-\r%3b!nQH0ug6g,WtHbc8@nj&2^_UC!HA3,$LP,Bj)oqd.B)kNR>)FM6!mbPqTkYAIIn/(P`f1nh;A(!@?9mSI'ZMMkdC`&@EkYBVLQ\r%SsK#fUo^Rt_RNNCoa9a,l`^(hDlkTm6OLOuYNkp&\_8ANZLja3AZ+P%EJp59i3rsc?2V3)GAhXW\*^j:GH,_:XCdFHgTNg%TK8c(\r%9^noBl>/?(d+KK\bstuNkl"s.;jFsRpSGS?KN\)P&H8P0J#BO>6Bg"XHT8hc^g4:PRqD&BWBf(:^M3Di;JH9_"^&T1E#0#G:`$35\r%+*6sL6FVX/`0lLD_O>'i6ORM17)]R7V?E)RIOV.*7Zu;saV_+;h5%NWTNMn$,5VE[o?MkWIL0^C`WT4@+MVHhqH+A(SFSY$Ipl&*\r%Z.Pm]q'DD_RS5EOL36R,e#`43N_V:qToVAn6jrj"3T4HPVJc/e4d+lm,4A-Rdqn/JWGRUg)\Gp7makUpC`i\VUZ[k%;bDQ><QCId\r%:$;,IXOYd9k,>V+1k"'2J,*A?Z=q_qDp4VfofpN4S-ELP//eV#VeK`Y;Pa\I6ET&mV;K<\#$Nt0oElY%MIX.YRq\7Xk'R]R^m/:p\r%/eXdLF#E"?ik^^Ilc)^niCQ=[NC;_B1gRtoTG7L5UKL]f"JT%b-_;HNj_TN(7C1nYP:2q9(<u-mbW)sJO/(Z*d'gZrAL%^\5hhS^\r%*HG9f1gqn3enR6]/dk]bon9UdkRA]P<hcZ)kfQI,ho$41&m9"poHr\h:!22]1&b?W=!+n)f@OniFILb)k?UX1U5+Y,_%ua/&.Xk;\r%HC/hW8BoH)e9J(4%%_Pl4>-X.:0^p!)f#5lpQs8M!.aQsQuBi4%.*H3%d&IS#U(q\o'n^.iD9qk,R1uG,G5nCY,hpS1!l1*#0$(-\r%N!^^_n7PT)C\-oaa$;@'OVjS8OqJ-pR(?-E.K>='#MG1Us$?!;@3gT(?_g99OPWRQ*h6o8'UFuTk$G*tRS4_NOd&sEi[Fr$Un"RU\r%[O"O<#,]OV++<'`e]8W;6:_M;_I6n!7bD#24+gjs\o2?6K>`:X-Q%%YUW;(r-'0GUH8]]BY,,*1)o[em:>OB[]!8ut*k>IugO\\R\r%T[I%e-TZBu8#..9W#F/1;Hn8[dGJ)@Q!1lXb!`.FW]*1Mn(EGdGk6(CidH:$<aG]"?2UkdCt6dNGO!%[S>0)NS9(i.>s+h'frE6Q\r%WJ`-Z3EpWSS[od9k5A_g:5X2K=523YmEB)+0cOfI9i.t8`UEth4A#(d``MJH($e1a3)R(9=0XBJ(M>I*]R.4o;.:nVI7_P&(Q4ht\r%\VIE<9D&fA&CUq=*U/!1QsSZQ&LXH&*R9QOnZK5j;*=XI.ZL/dI3%hOjb^1VYPIa'inaf,Z^bQhe+WRLZ^`]5.64`)A<PF)MGAWO\r%-+"_qb_3('pSRfCm(kQ.aKE0?DEmf+?`P.>b,b3HrjV)#n</X+2d!BZS!+"9qLcOtr1ul0Nt=rd8,"Ru0091hqUILpH>O`K^-i0&\r%6aZqW/_S5+,$].M1EmcX&/[V(H@5!c,_Vt[JGM6XT="$on]P5-AF)Iqgn1i-&Rdn\$cdhWc/h0\?aCfZ\j5a*cWd"0$?'>Ip75E/\r%kXJb#Os**6I7pHA:G_C7XV/;'QI#a%c'SQ@MB>/JZ3>lg(2a,Or,P6A[1\_8rNu3G44??fn9FNNK9=/"3F9.kbA#[ihILRGWsKXB\r%8uX\_4LB3#W2YP$lK_O%"f0+X.0rg//1kIZI$pN?j*GJ?K@f.Yk*"(!,8."_`=9?uOH6l/';!tP2Yra1:G)5)F\P?(HBiY9R'_o;\r%+s![il?1@P;L))R*3N9=*Ze]SQFDh._jfcH!Rk@mk:Y#sZR37pG4*d@4T)Q[fXZ?V^ksKblp9b<M$/(??k4n*:rnMA9P%#_C8lT]\r%1^^TTTf4aQ>ZeiY-qu'P:u2tdiQ6EgXXYF?nuZuo,C>q)Z&i<WpZntsG@OnXmf.?qm'5:@Q@#4n9WH_PD<_7\rmP*M!UjhJ[8f3O\r%hR@DAmS\D&57/4lN(ArFBmN*&,)O/?4><3+2F5hi!`K5^U@!N6M8BrY%ufY$fd&_;*Z49@<l:.q%ufY$_611N%ufY$iOs49%):ZO\r%D^iN>;k&]AA)T:N[Kf9C_!%c)0Fqu]&.=P?i_honRQuD[C:PB&D'>qDZ99n1",<&MA.OWrEmah0f`S!0@%&]fX>4mr;UZqP<JCu`\r%"t;Cg*Z3-&F-9f!4>>LNKC0P"X:d^9Xa'TqRK%'()lZqa\1;u?d($X=!>"Oj)30Cu6+Z[6W>Yk9dH4\jH!n*;CM)][hmOOUYEC>e\r%BW;.BqVn8,3KG$>J]/[mG!,]ZVg;_N9W>LYRtFIb640"g2UPTO2+5mbE[`C?.1V`IpEb,n1^D5rfZEa#BF\,I75Kc*(@l;5q"pt,\r%S_esS#=`dM@(1pA"'`D9?*!(9r$qH,[^NN)`DlqUJF7gh`DsMNb6ue*`Cqohb6o_eJu2Vfr"Kb^hYSUJDUXK0,n--62fa#Q9F=u9\r%a=WTt`C+O]EM^28,Pt&B/)oaE"C9FG]0L5T@4MCZ,8&%hMlirB**ufX[Nb.tQ:A08=r!L\ATak@+PB8j's1&S2'i('SR/iPHU9>.\r%;k88Bk#LQrO@ZZ)b"taH0&\1EBY$6fIF;0LUrj6m4t7c08,'^>,2!Y$$g*[QOmL1MeJ+25ak]@qpN]='N,1q0(JYI^hTY%6\n:\<\r%Gs/C$@l5('+k[NLM;+7BOZi=6P!p#AC)^G=h\NFPT]q[,P3Yd-huf$[)+W;39eA@%+c&SA?V:jCT`t)ITX]8p;[i.an1KuoR<_nq\r%k*:2;Mnfp=]TNZol=`.F#@6bKZ3V(9HFl_K*B&lLI"-:5&hFWu"?X7i`"EYg$0W0`@Yk@u;:A[),pJb[&<<LG9G`"Vg8V69rIC:^\r%dE4f-=I>L&dE4dg5Kq?7BP#lCj@HH6Y-=1fl*=O-MYE\%>%"'9hT1m:KsE'5JOM7Q;eSr@55hLWd^dDin3eGtPf]?1M2B+*fi`$B\r%&HBT-&OL[@@gF7HpLN%#I5-^De$$$'"l%U]lH!<+$rUdH_a]$@&>&g6EC(thKJ9Ib)^e<59F(_Zd>K,A%u_/O)((;YAWerFpp^*_\r%A@!h$H;Kf-+WWa?kgHi.EC/&]6:)nUa;P5*8'*`a)q:!(9LsufG<,"k0$Sajk6cqMd1aMa:5JmGrS2,;4Zp#nG0oPlX1I.mCq$#E\r%CL:UPA1oiQa-Wr"]>g:eog%E53Bn5P,=c'*Krs6R'k;Vl$d(!&b9$,f-]qJ8i_#,l=)R`8@=0Ylg?@f.:NET)T)9)c0S[\XVo:X0\r%_mgZ=@=/C:bsj-f.Kt[uf$eZ?nFM+*DJ$o/PmJWs]u)i-LpZ2.Dmap[C5;>,)uZ>bok*`Cp5^'oi8;2<2(Z(K!eBb,0SVHDdpfD]\r%_\f]0?;QBF%V&4G!G-4o(jiQ_n@V,\AR\37s(Xc;d^cNN%V%IOgd?\(bM19@rba]-eQ$$@<f)P6-Zp/?;kcc&0Hm8%$&7^pS#7NE\r%82,-Rcr*GMGkja/_)%K\=n1f-a*eWGC3btGl'JeT5Zbc\(94GOJ';*0@.@C%BRGZ6o.-lgK8&S?[iIQXlliF4Ju9ouZAR14j+i/f\r%_H@pTAJM&BJd.dBX"9j*:eZd5=2Fm'?qcJE=+S7.LhWE-n\qjPFHpAd@#1sPmhaB=<e;*n">MJ4?)=^CN/^3A*7JBD<J524Y,qD@\r%<KId/U9+-4<Tq-B*n,_KeQ&uZJi#NlZAR+2pN&tsDKO\c2%HN"AG!Mj1_INY`+b7kMf[iM<5u+2iGj1??G+$d0#OiD9cH'8-3+9.\r%3*/BDko/5E[?)l700dT#nMSH*]28@X6I5NrPN'>nL%b#m%\ef;;%O)<k9#4Ni%,Z;?NOrC`(-U:'i.&%7PTk5;:<M">3K<hl]]O%\r%c7G8=&YZ(KRH-c;4XDuAbN+Tq^!GKIbk#YWS!VP$U9&^01bW)%(JjdG-2kFO]A-W$\eXX>-I'`*b_YoZA^\4bP/?e%QV$eSVQ9#h\r%p<AXIlX#>.j_s?u=[De21fQZ_)Qodq`5/#m.ck%"^c5^,/udH7[J50ib)(&>mag7H#-Eg'%#Dp(j^7VoO5AdGl8RNgp)A>)c/"s,\r%YDtdRV4*g$_"T3raN2U71EC\*%^8'64,/I?QH"=LWUG<7S+&K\F<2Je;Uulp*W,:i3O)*`X(d0"OK\H,I0TlQUYiW\3.^V42caY[\r%[[;bCR<Dr]^2IJ&)EfhlB9(\A0=17@FUiTkEuPYQ0IcaR:2F[fhV-b44i,H!r/GrIhdF5_pX=\l^aRt:fR9#,c1Nl>Auka*0s6q4\r%e,:Up((5;3g!WtH=Y+5rA4pEhXSt*>1_rk&Wt/R;&]=$u=hl$4)cotRN)uUD`0D)lgE)trKVGCXkGU>WhjDOfAirNbqu"ls"@LM7\r%[2tMg,T&QdLu0j8$^gI?+O%_o)\NRm;`0t1JtXe4hd%*U,T&Qd#VM1F+i3phAf3sfTd,/VE@5Nm0Q]\o[$\3D_>gtrbjnEO<4"?K\r%+*X]pgVPp-qf_I\s%1[<RJGEV.eEH5OdbO;<`5@B\'*9+j2HO5FI&A"7S>c>?Sbc-+/ugKeMoEN4,*[5nbg3qNjf^pUe8#@68Z<r\r%85:I7-okUt=c$b&,q#$t!P*q4mc"A=YZrFP5#niSUT=)>.id`HAJ:6I\Yak[09u1+ce1RR968RM9Q;\r#8T92PL>C?A!IoZ7)dXC\r%(Vd^CEQ'2:T#OO"BR[#9SVs?[6M=,!^GYOQW<7lG^Sij'"R$<:#7NmCUTZQ##ceF)mV!P!bU^ZERjNH:GA[Z\p!'_OY,O.m!]Cn*\r%#tiVCG_JbgJF_6dGH+Su&JhUei#>U&KEZ0G8>[dh_?/m7eh@GiYg@`hb6Vn_cLT<hU%sV5=#`c%XC[?A!Ts'Ii[X=^Z91=m^$??5\r%$jj9S%kg-@Vq<MrO,ti,*#^,D-=QA[X3f32\p=62`i!H"0N2%rs)f&^#Ci&e2>6iWB(e]PfsPg3#3hY3!]o>X+p?0JdGO_%af_10\r%:STf@D@&A-;eDoS>h!lfTC,bIs2XC'$Ms3q$Of!)"rN,,l.PqfoNpkN]u&+mKbg6t/.S^:k[qLKNmR7ah*Aa3;r>ZUDVI^09c%2(\r%Wb&7jMi481&5PV>4X.;a)NY#;F9(5+b^D(0oNR6O1g_^U2)7BI4Q\[,Z[97aDigMN(73Th-n54*"fj+!7Kahp0@Ed.BZ1Q;gX)rr\r%L#!LugDl8MZJ?9MgX+ETO^6Z\lr>.I'(*,(G.LYb/RZ"i'M[h8>JP']hI=q#[X`\AMGL,*7TFA?Fcd*Q_56#8GmVr<7f&mg@UAt]\r%:=F/%<:ttN)PR-\!98#;V0R&#>VHY+f)QVIK+#\-c,0h/3<h3Nl,j8l[s%?&[kN1NLcUB3*"s58$H@X0'p@K7\AjLJ2AA*1,O<3+\r%N'[>:-5smThYWJ,2O_qr:J4^ALaAH5DaF7WO014FTLO=jB[WG0Ra:+i&BStHLq(%L-%"#nh;Rck]Bri9?k/uHbau997?)tk2O_qr\r%,X&\5)pN#R;+V48;:bb:?>T#iI*NVZoI;knNr*sR`/"=lC3>T\!M9g,A!3B@7qU:t8?$EA'^n*k9@t'PKsQ0R=FW:\b\?YhO`ikB\r%!(&gm<G2CmZ!9o9TC5U^BKJc4AK(X6?OLE!@!*XEBqrd$/'B0dBqrd$RqXP'BqmiGn@N`#ksg02YrQYE[!C&VAVPeJCU-U3@[Y%Z\r%oC+>q<\-&ZAE]F4>-T&[P>*mp8uqdq'RdgN(T^_N-s25d@Kh#P5f#4[TEQj3)%)Z3]F.keq1*6mPDs/6jTBIIS/%<MQhM1FB?%tD\r%9ilq5&*Qu.mm9'A5-X(Namj@["rbl&->K>r"'u:\r-8#;>TWf8"aKjYFJ-fT;kR=8s(H0:nc?7JF@326&T4d\Pi1X*E-Y0j@[Wot\r%fihYe<@fp?/@2m]gj&Vp>TTCI"aKi._(nj3"Y5lVp(rPZ.MXTY3.G&FLfGu^pfZ2'\5:."6btPM,7@O'1DDBm>:is^bYYN[m>afZ\r%b6Qtr[(]TJGkllFM7t^lMIhNT)qN)>(!@!hbLUqNW`]8@B_0&ljo7[$Ht^@%O*2^9GL9A+9G%P2/2Q2qOV4":m0G4E[bPVkMIhNo\r%ATWog<\-%c/2HQt`)S?EG[/TQ+BYm2iGm]Oq$M@O^`X8k=H<<Ts"E"Fk\L-`h=3/1j0,^L==TUS$C4iJ*>'%0IuW7r=0RXTA"j^]\r%$jFgL;HTT$RA"$ARSF[!=Crs`eo]l.AVQQi3W"X`Q5L$qn`iHB@[Wot),gRT.[CqZQE>QPTo*CcW/%5X="J"ETcTYI`A0fs121/l\r%>d;LLY`-kc14!CHM*`gXOg#LO[!A)37)D]P]aIj47)D\EM';]e7)D]Pc_?;g8DSu`:/</%7*N2>6r,)p7+Oi9,kOKFqnP=Q.XE:I\r%-c4_o,^SJ#(bOBYHGLD^rN9\d<PUN$]/9?rrCQM\RcqS<hL>UNDXlN9$YpeAd7mV)5BhmA<YLKbnY\Btnf*qXpqVL)S*$rhCAVdP\r%)@:au1kD;kpV:GPR-hQdXVLnN*a!MOXt1*BVK++K<e;A0blNIM*k<=/m@7q>4YW>G`\U[o4YW<,Ai]<84YW<,QI)br%#nu4C_)Ke\r%JD#cYM&mMY!<`=g>RueUJ9fFu,S,jrJ6B3t1-I=[!sVO<\K2U4!J>cr>RueUJ>%1`A.OX]J@V4"dQB4P",7cJ`%%&j/2)6O$<A]6\r%=C0R(&Mh$:/2*Ns'WY>J=O+OkMrYVr$jFhCGf;F*V@.e4==+9uFHr;AF*#Qn/jGK9h,-jPZ-70X,F'NXZ-;.%i@/HFMId"$bNc3A\r%o=G2kK74W;gZ<fm!YrllMpodAQ_k-l/2JiRd<Q>+=O+LGY2]CgV%D,L/"N8&10sp&]F1U)/,Ag*Z3Jj$FnA(bklP.iMOmB6@Ql@j\r%R@Zt%H^_*tSsXXV?0H`77Sb:t0(]oX7Sb:R.f(^=k_X\2AQ!gu@4,7-K50V,KQW+C^+t!Y3?In5'[[R#3t^@'MWfmBdtOr8Ab8BR\r%l%0cc<V/]MCpW@89'D,m56R,u6CFt[E#?m9ffD^L)Y7[agC/&4b=\SM?kA%@?%gfgJO-XTkq^[md$GH)5nm(<BbU<F7V-L(G.J&^\r%(Mn/I,#a58p(c(0#OF$:T.mdpX$bk"jab$UOXMOb0)s$*.L1SnH#nB(C6su.g?"RK/dL_pi`HeFlZ=D2d0L"1?Z5VUXcaNr&J/48\r%B2OcK+bD5E\N!Q/`U/ga3*YU+biin8iq<6tl'Ff`(273;o<q&i%FFtY-TF,V/XrcVi,-kcJ&qb\^AE6aj((Nu,sBbW>6/!SLhEdo\r%4'TFm[,fA]bLo5V9B4s:cerYs3*WVZXQ&3uf:R#sKTq'[X9@#MK;%0=!@cDH[D(Oan^UJV<fA,'?R=>/qRC<1[UH>`_?_<X&"h&'\r%Ce^U!Yjt7^?$OW?TtA[p@4R53i?,r1X/'<GV^f[__l!OImKtrum<G'@YIak^EM)YKoem/<e")'=lV(sB_fWI>Q3L2l<g$)b97s/q\r%3;`6WMk"j3Q3QrP;Bjpc;dDY)9;9%uWI/,t4-fiS[_mWcpWQgA6-`u'#+U*A/.J>]g_k>?/.HOPY<%sRd9>IbX(#cSOp:'c.:R!&\r%Op7_R<O"@^'H0Ck%2.ie0V]K-dNBeE9io6\BV--+r^tN3Y_"l%]DmR?hBm<(&>/oSJq\W5d$fWpf)O#8iQM588ZmQ,>lV5ds,XQA\r%B:"O#T8*S1:Did;6LPRWl3Q?^<&&EK7`iOl#So+h`U1d)`@FWscW<OBQuQjGn&*'Z0Q/Qq<m9u7Bo0TT)8EmB?-X$L$CK^cAnL2-\r%LRVCq/upL1L,V'<JCPDhg[ep4$^f'7U9]:e'B-VUBQZ^fZr1q4n?![6)thD'QQt0OGj?s$>JRn@rl%<ZGKu,P!bUd(+N:7eJD$QE\r%;,tDjl^,F*;-Lbo-OM_:E<.ku?ZmG?<<^VA3X:^AB`W8`D-g*@Zi*gI$CIlcD'sg6Mtn;*b%a?q/D*saOk#=qs1iN5N3&>?Yg1R/\r%CK[Ga4:3AO%O_epO44(#;S%0t.?_K%V^9N2>N4QShV7cd<cWEYM'rKSOggO5?PM4?59Y58<#">]_X"pu8$DMnl:mrefA%U^P[8gs\r%4EC8\l=85jk[ghRg-0j6/iKlsJ`+%&2SKhtd:?]<i5mU0[]faU;:aoc,fTaq?#7Kho$_sN%.D"#g!eHhM7V?M\]4`1/5O)`-n>Dn\r%`gLNYNHF.BrF-e?=W+Au,+c>;9ZpgTAMDu+?<RPDmH0MWWpJoc=W*Rdr_dI-@\E2bb=(YN]Fj3qgmu\bWID(+(Z!@<`N'j2;2Nik\r%@.F+CHMK]T^aC/4\)D&ujfUQ"\_U"f3oAr7-2PXLSgu\)gN])BMWT\`B_f?HAp23VPNBe:F1:dE3[.(i*=o"Qif@b8UbgXK[:o`o\r%-<UF$[:XD<V_88:)ppm88+9@DdsSF4'Y4kQO+Xj\_ZIE?:WMlI_AdKIJ=-3ZY.;sXOVJ+@_A6kK/S7_T=,f4qL]B(^=&84BQM9a$\r%K!hEiOs@fdV=hCNBl!1lBOBW(p4(]7h9F16[t-`q>dS29jmN*6HEm/1-1qb!T2ckA+hM%Mk<&s*6$O1X:^gbX7PMqQKjq821&ehV\r%!#C#JJAd!+>)o;SKLcNY)NTY_#U;(NdkVu%+cO@T:#Bqe$t1E9VDCIlKTR*r\jOlh+IO(rF9X.J0G;8^V%s9S&@S($Kj!!N?oSe:\r%;;s';#0Fe+-uj$7nD("$p't8b4H=4D2"<J/:Et4g1J"@!:;qPr_*&*>PHkIYd$&nkLGXZN$#+hIoHn/A-/<kn['K$UN,2`d^rh8Z\r%\16%gSPs!7;AQOC0H#hU/WAT0Jt+eJF!Q=%Kg#lSPHp"0-.\+$C1T[5#bR\Z@V*@o-H+,kBP#kG--aYsBOs1;&WnB^_H)s<DIuJI\r%ZE2A=27"Q3=YL("@V/3=Z>_T-h9;$qAKbWY(-@=*3R$_fM&jNI*5>iIcabSWbLcS,<c9O*AV%.CXZ%"J2n&2Rk^$atEapj:&Q*Ht\r%Ch;Rj;I$o?Ya#CQr7H=*@4M^9Mn"(C@1\0YXH0>>(+qPSAk6CrNJ0Y8i/GSm:;S+^ch(Ui]s06s_kI/>K&6e\DpbPcfPaFj#Xd):\r%F'8FqnE^g4+s7<XJ!p6Kc#sa*@;%tc$g[."9WBKP/:jXp]?d)hP/n1[o?eJ1oQQNuLq^.hH=L@p#(F>*eJem_)cLD.K([.#ji6`%\r%+'!51%)P9UZ1rWTiH!t8>m92h"W@Y6kcSGK2[8pn>Al&$_LU-$Cq[)m\M9tO,s<Gn\Zr"fe/JdJ0L5/J7'[F0ZE.@Rk"&N>&;I&<\r%e/Jd^)uFjrnWBo+ji3b7:i@nD^X.)*863SmQ8PAY*6CeiaMRB^p./6$5Sheha_J8o!a2aGaUuWe(s(-IY"2U15Sg^\F%!=>aT>V=\r%IUtpb(;E6!Do[ltA0hXp=\:e=P(aV;kCA%e0JG&Vkt8r!"2f_p5GlT&+:EZn(E=7(hdpc3nB;Vo,V,RH'p>Yblsa,im"BaSAetiF\r%OlUmXen[Vc3BtO&deG"h$!f+SjQDA1-$6D"=+MTZQ-dK:T7nYUQ-dL-cnC*Tqme"CP"[H`9Zb-s,U8"?J:U#$.t)("eL3OTYLJL)\r%(X;&<.gp["N,57m8<qVi+6A$<"hS`d\L\LHb?l4t:J9PL<qHu<a0RR&Cq6VQ8pn"2Ks"tS>Sb)>jdf1Zc"6EL=caQ[c"6EL=dmX.\r%bMp":1n?jt7BES&iT%B#]Kbb"oFDk*dscRS$=/><C+uH;mX<KM(5&r)h3C;]/I#k2h6g!!dpd:)#bsK.GPe!e4_Wp=l?*pJa>8?#\r%/B&u8GL9A+9FojgCQ1i.c+7&[K7NBaW@g9!jKA-!/;JqKoM2a%8<(%U;rioL#(B8sWMSj"Z<GXI/ZcoR=fn!Q&]0A$77;P%2<'0g\r%HA)tB6H.RFDu:i5kl%5BI"f*;8k00Kn+5!J3DER!^)1m<nj`sC&b3iqCQ*b#YkX+A223,r"l_&ZCQ(K9KWJ3r;Tk]9S8:*Ldqao6\r%Q;Y"ld3cW?;@7+rQIBW.cG#D3`R\f5:Dhq0@fB\DBZl8oU7>P"oN<B-NTI)oZl0aRA[&0ioWCkSbM__E`][?P6X9'9Kp3/#>iXp&\r%Q)SVkV.R<>X/WYa_Tu3DrD3DWK*)VlL:.&!%fG$gpK'\+7d.K.HL_H\1K`cKh>S3.eQ\a=L?Pe)=2!]AAGAn%]O(^fJdmqV1'BRb\r%7J"4NIM$b;-E`]nJ0F!mP':cJ%N&ZX_Y7-bi:k#7p!SDUKXgL[:p@K4HADt/Y/':5#]ZOk2,8_QL3QM$%;hdh`OhW%W\N_m%WFD^\r%dJM'Q>ZcK,?`>m#23Hrt'&p2E+r#gBYl6t%?YtT,lS#(/e:tL&3Q4*,Pp%dZhJ,4Xp-SBfHko]hbYN#EDD)\FVm@,*+jN\Z@*r+S\r%=UNC'?ZY-OfiLib`p)cuVUJmJm8792c%TIh)XBIg%\LC_+mH\JP[1nHrA6=rr?ZNnIeG4C!tT=...Lm"N.KApRoe.pC2m@H6/T`M\r%E!3`'+5b5\G[mUXC)n>^,$?m2J2D_u=Dnrk,<51hUE+lkpVFXK7(RDc'*Qo6qGBm#]Xg&Q=-cq39=1/.mT[@7;jJ5&HI4JGf>G@n\r%R9@8+_f)kAq9+'2)6e>$"OF$(N;c+Y7eeqB5FA_@+#Gl.>O0I6gY)/GgMX@efcE!YDcbsMA,!48CX(9kbhYFp7k>hUZqM*V$7o0:\r%/0W_[M(jVr>!e=SFA*i("qT?J$fLT'I+1RoSip7XWH`W8\a8ur`-;jm2*V8V#C^5NUWE7")<U/@lmJF$Mk6[ohH/j>,fT!jM\_4H\r%S'H^'086)SB;a3BJZJ/lqNJL\?5Z10Tl3h'As$%,=!>5g[ka;6'3J/NKaTHWXXB'rfefuo-_8*\^hh5G-!7u19[%P\QCN[YT'fqa\r%^sW?1JtZh2^UY-dLV2HVr6;ou_\?0rDa[t>4e6<)FQa%+!X`?He,<TX/[`dNkXmJPP[F%ITT_S.<H=q#ms6usJT^P.gCWY167\lj\r%!PDLCaUhYei8[LZK$.(OcTe=B:bFVEA^=q'Fa4.mR8+64rSHhr*F9N9UfQdp\cW*!Xnd!s?ahp*lMC'*Wm>l.g36&(,PTbl%FX[I\r%k$d8paQrY=N]u@1,LVTbAOWSH^*$"%`o,fiI1d?@Y[)K9H.p(e:XEge4#kmX5328q>1KHtSLH`?<Z.'U*N%YdDa*o1A%td_.;Nl-\r%rWdniGBCOBVu*$.GokfM45Pb>bMj<619S;hS`Prf;&i&Md[fd^icOehm+`+rE#l=rINHg;HZ,h*%mQ-i>(;1O<.=>)\TkJd!8*][\r%'17oF4B\j%H/>6-ZEddc&n8^\*p+<g8h+KI^[[)HE)'Y4Y>gdknBbI_8Ac*LiBb%UWH>s-4A@!PNc=BehWi$i4%<=3qSj/[+RH=O\r%+aO5H/0$!l"\6r;")'RG!1K5W/jch$B%YN)q@X_iThA:*p>m/7U%S_gBG(CmrC[H*J]1=p-S5142aOHOq$Vkn8\tPr8sW7TJ-f67\r%'QWP#eMn3<aU&?D/ga]Q#Rg@OPr81d8m$V5'RblYV4E,\Yl#:pYr>!OJ1K;]/BB"d$sj9QB"p/JKEXot4,a>uYjcaE:RZ_3<L6'T\r%^jG*:hO[JEBFKF7hDVuQB9e.'"n-^K3$OotE;/$j26UbA0\,DC(0n_nQM3lU',K;gGNf"bLNY16G&-&j"9a,i1@<VA[;F94XrBOk\r%("8KpM!WtZm\]QUq$Tn-5eE:(]A^EtT\X^#[p\g.5:<V6q%_1=05,mngH]CYTZ<<4)IR@A:j4.Q`5]BO8'b]H&f[nHYWkcI&f^/(\r%Pbps5fO.]tc&R\7)A]q0BP[gj&9dn5fPTLr&RA#pVtNaHF7Hnis#,!m"rjl-S6j4epC>l-O*ZB;:s.YmO([eOD/$6qoN6t'H$%bn\r%+BpG,:Pa,s/(Q(9S&Omk,YHhF%>8J(8knPHQ[bPWX\Xc(-A7T"')I9U?f-+&g[bIg$;]<aZOnOs-KYDiT<e<HBPg*"3@;:4Lc-Ck\r%2Es+UR"p+SD.B*>(PK1C4CR=E#r1;%hD;ZtQG_=DV0$X(-$2Jr]K/[8D-OoZVJ0m6kSo`@-WD)2mBk:3qP-i_SG=@XJMh[ST+L+?\r%[,\uflou]-:T+I,7/JR'RT^.m%eKm._ZF:FEnDU6Ra0A0P]S1nC<U,FTo%.CE$CR(LF,>To<p>C)@6SSrdGo^s*:X6e'KZ&\4e,u\r%('=#)c8]8U>TjY+RDKsHiM*%!<-(&T,ug\u[obnm>[=#7G,(U>XS-'Np47!QM?,K%g"[(F5Oas)2aD>1.V(g^X*m<1%N4?uYb71\\r%q_4i:_+bKBp0fBCJUN!`C*0q;kF-"?G\Qd79G(IR6G=n#?[;Wg5m=+k[R=q;M8"WbIhGfZ0Vn9I(]hIA$Am&]84[\ULeCiSb".4S\r%]/V]M5oR(\SdDZ6'ZEuod?tQuKhJ#\B0E/]:bJ@tPomO1P>qE5+OT\kV3EF3o;T^gd(!b`f2a%8&;?4I=!@881L.5r$<mm/Xr9/B\r%=*uT_)(n6<Ybnoq.(>MIgk".\<RuVkBI'%D7jUD-9/$Iu.W,_Wq2+ThWR`s\cVf2OHKoN"3dgCfQfLZ4,LLCAer[hl[kSL)G"B:9\r%qf8Yn?e\&2onrm.h[>5./^Hbrh^:I4YN^*(IA2j;E*ep;-]HB[UR`q^H,<%@NmF:b-VlRi$]:5]M5KNHF['\51j!&'eGTN3BM%eK\r%Hq:WZT7::"U*W4%Bf^HM-34_g^+g*G>!aJQiUelkd1RYN@&fCmMO"g1#.0TT'5;&jDq&1!Rj)rc>`Qhu/OlXO@.-Ern]tbCO,Dp=\r%F=4efioo&>$B4oJ:7=P(!fPreQY#Vgq?uo8'Ib`uR4BEa7e@Mn/BSYD=eiLFBa"hp@cg:W!XlBYEK\`E4XY>X"EO=>>Vo/fhrmZ"\r%3MD^9En?D@Me;/I\B&@]o4eb(PD>+:cUH<)IPMg+(C`E[GfaXsdL:P6.]QPPlU88&'ND7?U`&#0jWpVkF4"BfT9kMV5:MB\bN,a0\r%I^=D.[6WJ37b\Z_`:14E2+&S8'!%.2%8#-D/"%tnZf;Z?S>d\X$hup/U%NUr56_N&=t1)cb\D]#5S>N`s&?\Df_pX0kKti8NF9hp\r%VG"jd&]e)ElF=>l+Cgim&Mk10)1u2uBpc/%a;D;+9>c^B:=%V#7QHj@Cr7+PBlXF6q^SfM!BEN8Zr\A_'(,=3b8J`=[.a`bci'eL\r%o\n4_enq.*h!>5K,b.s89)hOXAAt.K'l0Y,?-mR'W"KX=TbT,>fM+nVUKko[>Bja1h.=Imkk#R<gGX@)B<P^Z5-Qr2<gRUR^2^^=\r%^-?_G!NSD.FCf&rB*3%^4`=$OqqaP(HEluJrl?Os$IBEc?=5aj>1?]gI+LN>#Z*JZ75/eM7+6d/or`[]@_K%jV<?aLlpiLA0AhZC\r%F!i!7nD,j\cuWdlDl7E1S%#^VLr-k*ns#,\]emqZ'E2\fdetM!q>p*dX&;a9k1:(=PH-_E&Q^\bbe+qiQXH\.%H(DND5Jq3U<_HV\r%p!)!/aK8UW3W8r6hJoS`pQl,6o'+NfSe_.d-SL__.\UV4N6YV'f$S2k`_Ro]c.kSFLsGP'O>6*YA'A&X>1.?Pqo6mQRAEJX[+?t-\r%hnMo6R0?p@=Qi-nrl.&VFZ"AYHXr7KS`Nc'Gr`[:>;bQ5X9TFU\.>:(dINmBqR8(E3s2EU!,(gGC45Mmg=h16^lNHi#A4\scM:(T\r%I!i;I0_=V\hR,O.cA4UOi9XO(L%<]bl[>S_:9V?hDRPZkoENu#^r$*mQ=??>c)ZnI^G[e.glg_=CGiiT]pnKhZ1$SRXZUoA:RU\?\r%NMk>#e[G:U^\W):ataUS-9[I(.6ORR:,L_M7[Dh3SQq;;:2i<D!DXM'H9S"-/=a!VND)tS,ZZK6NGMr!ISL-paI40Q=tgNg;Eo0$\r%-"I'0RBkbAJ0X7"R=nNo!Cu;01gP&%mcqC53#mpP90n-W**We#>RG65>4XW#n7U9/`]\L-;U?qiP"L^dcYlET$Nh8?Jnk+^A2'f^\r%(s$(t@S3)l::4U[#ZN9QMiZWQH&Ilf2uP=Wic[N2F"'tR+.H4]Ss0gf/\\_cK#KaGT6O?D>!)2]Xj)=ld=^:qV5h7fiu,SedEs;4\r%\VFtEh>Xo@(/A(h1Uku-*u]>(NHW]D>$O#+bsj#O0b\rO6p>3"_GH;cf)D%`fo+^Prq#<(*V]UF==O?H)bcA`VE,*thjW4^raZ%r\r%0jr2Kfg]u!c6Z=&b2k5O'12ld@7ou8N_DKba[#;A?(\o]Emc2\0Z\qo,Q#-ZB(f-gAPt=akt]W>UITc4Ydfo!/rRQ3q>CfU]9"q0\r%(-7<W=tD+OSK3>VR8Q[AN/#rRQ1XD-mrE@.lB]YcJP&NuIE"<pB!%7EVpE/`P#o_=H*9f;cWFi+/H$bkX3d(<3r@%,auAt3XOQ2t\r%d-9C/m"($YSaY@cJ*qK//m`_'+U0V>5p`(]^X.E'Eoar-CZobcYicl6oC!EFSE[gXp"HJ_^X$#>B=ITK2J?AQAmgYeCAHKZn"]XO\r%[JEV,Oo:$k@bo&Zm:l+UkbCtSRHXs(J!*nGYqKNqmESmu>9,TpfU6X$\"ENb,(:2S_h67P_afTC=BW7T0dnke&=UK\Ld[pCK@'Uc\r%0$Yr!k2BB(Ra/*^rcbq5cgTnk=+[X.iXcs,W]15O5+p5rN,q6urDUKl+@C25ZRFiRONhp;3NRmT5UZk>M^@L*0FhIVTN0nFa3C2(\r%kC?5W/\jN6oc\hLmA7*J#D@-eO*#BEcPIX@*]Atn`BsQRUPlI3*^^n1aNYSY[#<BMT:V=qdf&?DG&9?)(%'-$o-2I?\1k+HL-qaa\r%Q@"f4jPDp[/I2/IA%f,XXKdNbQn(8.81TX?&9C7nnR1MeN_&7OUkZ[54rb7qO)KmVm^'1TSD>`6mP`f.SrBQL,*[-km`DtQ6(]YP\r%gQSlkRf!^TY%J^)@^7IB6O1eNFpBgV%8"9K._@XI!@)3SWI1`L!K>c11m&6g`\Notd6olp_r.(^*.OL%4JEMH3V$mcdo@Z]f?_ii\r%WP,pLT\A3=f>%4_**-1BX`(c5)0b[iUR.NY7dnL]WKY:Qd('[3rQqY<$:iqLp.`G1>HcMqgR*cN+KaToV"0MSE=KB[De._p[]&%W\r%g'srOn(jeIDHa/l8UED`hsc&.eBV-r(!eFu?dk[oifBH4G3=7"V,=1B6R!qm-B^'Hh)W!ab\ka(f:A]$`m$lZ+pTk>Re[8/'GYcR\r%ppga3\oXNW,X1mR^=94iMV?eO8Jn.07T#pr9Jf)R+E\RaqBV`4s70E%Pf+;+;.H=1*C_Wc3sVp!d35RcmMo"]8$'Sild#>"8uN-%\r%JrSbBaIt5Z.s^IT7\c2s4P3Q`SMN9EWM2HZOt"rso:o?2gcasgoPc7\4(fRgaHj/l\^-=7g,pq(I,(_*@/qAVi\2[I%g<X&]M90R\r%1;66ok`!kAI,"d#=N.QNI25oZPg].ZS`8JgW6S>7'0IK+GSY9[E5[h>SU%0mS9`h]'^-O2+*HCp.Dt6Rh>";I$`PC89!sQ`2IDn;\r%@AEeO?LYf2^i]n6`Xh!G(#1b&.V*ekr8C]Rj_XiaS.W&$jPQSJ_;aY77:k!d\9I-C'35;u=TqE<?HcEBeg:H%_^#=>E8_Y\B+aXK\r%\rH()k$YCh0TP9K`6J#FHXJZ8biW,%oY>,M)#.Q\4g5bqZQp'?k($m*`&"U;/&P?KOoc;GCq1h6KHI6'_q'u@,:CHX1I/\%l9Z3V\r%bn*gjZpldoG=5-(ZF?L4]ej-h3L"+VbdSFqM\Yj.+C[/j%.h0ODh!J0?ei:X(2Ya6IR-'(2#E2p&WtH>qSsEbHW_+R"IK'%C4>+g\r%,;ID$"6>q!aVBF'Aq59Hgk@T^/(FL6diGa\0;&'jSjbU&9"fJ!d53&2>ge-1*fj+Prh>pt-$5hlX$CMWDG-[jD[WNuhtg@\`I'I,\r%^7gUK#P5X>CQqKVp[aqh.!G[5m<a`p0]1!482J"G^!>5UKu_ug7e+4!YV^q,?:d#6EO3(iMYUk7Hp`?iBd=!<!oXH\1m3O<34b9:\r%fj@tn7/nZ:+aZ7O"4Jd?mp^FO+TIV[mp^FOE)0qP^PgY06I4^\IMZ?glG&:i^WO(XT,cX*4T;-^k<;?<;ZnS1#8,5DO%=-8X=c-#\r%$[n=O<gSs7kfcL4r>Xc0=q!10D3djJ[)<o)=G0_Bbj**J\J7i3P)uahX'/%%W_-;(f*FU]'IBg$HII0bX%??S?c8fE-qRI%>ST<s\r%b*#aM<s>."Ed84YI"#cl#T=/hDIub/XR`bS,t_5*_8iYmn")W4J'HrK-`[C<9&KG#DD$)^`m*7*1Z2><;s\\1C?cIsL&"OMBS?"g\r%(!0I,?g1-_H1B\kGW3G%cs#VlUGPPW#U)FBa$ZJQo8*$L<>;M3?rPP%Q[(Hao$@,q<UP*q>o%Kj:>l?sbk@_0"(1PEn)e"ANJ()Q\r%hKaYa4b]3>2hc%QY>l'HRDI(C-TC$kS8NeJSbiG78h58PC%Ck?`e*6A/jK8!O.#Z"E7"0.ccjA'eHgi;]].6tNVjp=\mZmL3)'3[\r%m"]QN_q.oa]Q_kn3ps[g9VFCcqeCKSFhY;sNF"3Y.1jl8#Yes-5jX?;9'EU_+&n;d,cca%"Q!qRA6"OF-&%UD;bkJ,8\H^C?dJ0P\r%*+;W7_%^u6-ft+hIX,qOW`<_>WkF,n3EQor6;oA<k'+HT3Eh-6<&C.;Wt\oB7>CA@(G8=\\</;8k#ZYa8_,@JV1P;);RB&<_^8^_\r%8_#:IV%U*:T0TI(ejP"-Dd6k0CQd$s7B=e"$G+5&CDGRXgmWq\WE!U^?!Hbje1*;O!YZ00=p6l9rIe@.VGsW7ph6e8&'NF*n\0$Z\r%,Rdu`Fql99(%/]^G6Z=[l,T6TlPt)b[E@4]*X;,"B(.o(XRk`p^C<o=R2r&uIr1Q.\rkj(2#Oe[aTt@ek#Tits0On^%Vk=Cik9?E\r%L=+W#h+4p5+oT9!7!^f?ko8j=ZZW&;j839cK86V"$?k;Z<iEo\&kDKY^/s#BT#=JgS9ed#Tr!e/Tgd=/F9O7FmjFSi7ZSeF$<iGg\r%T>F36'3<K>eMnprS"I1WoY!#GcmGie7<^%R$#RNd>)f_=2IQb@kSK6lg4U3JSiKo='&&!R[$o9?6CY32eg42_,5AYJI,6CbIh*/B\r%J.Eu_&g@%[!.;`H+UGg&4kDi@GLt'=HeZSZA`2'nZ#A_9m'L0=XWf8(jaIu]$*i\J'P'[X/!+/n@Y]lTLXn/BFVemH7iJ48kq4E%\r%^PRd*s5`gFM!h":/o."/;g6Uq]!?Gp9m'=d*C@>qVRk,8=hl7kFbjF$.Chsel4?DQO<i4ZllI7L8&X[(=`g=4*YGG?KUn7D*YGG?\r%7!R``4<dg]#bGPJ4X*p^#\SAqHUOqFOjhI;bTdbT;j'i[8*_l^O6F9FWqDD+-enUWh`n#AI3I>B=I_1c5mOlROPd=`2r+.gh/0qI\r%ALSb%i4S+QJ'JtEX$>EVoPX6E%3iMi42n\2ej8WPqYt!hm.*c`qiY/.$f:!kiFfiRq,0a@/%t4cX'?\-c//Bh_#DbF`CB'E`QT.s\r%q6B;"?R2?n!oOCW*",84%)t=&j(m&`56g''6u)uko$7^A1VW9j<gK;)Rl%H0?OMpQ5A'H,EA[6I!Vco+eq1t-#2gRs&I9T\(k@*$\r%!u=<(Ac5?0kh)M[^a>_`+ZCS8Nrf#g?caM55DHh`B=]<:nrEhHLK7#2bkXu'&''fX+p(&/R!BmE`A;3]?*t6gJicjFAY-bpD/qF.\r%6o;E"?U<h2W%LeQk)"iqT02^5mO%540.HK\&l7F29$KKCThh,Zs-L2M&K^qn<Mk$8Guu1t-V^4h4&sTV5fHmK2U'`W_RNMem,Ua6\r%L;]Vefh-6DGL>FY-i(YT36`Uk6n7M@^=G`9Wnt[D6dq==SH<4IoM\`-SH<4IoSoi+3sEJrep3B!G7'"o+su_Gi_G'/PKi;dbr&g&\r%;jl@j):Za1VWMb(5?"!E5P]siZ2mlS^k,<X,KjP23E+:e[[+.sASJCd>:Zjq20KUOU19";0Ytnucu]l:"=mg\k];SGIpA@*48kDJ\r%q3G#c"j$M0c*n\AK*'<,X?[)ZKo8GnXR4jtPAM\6Gr5(OXpco+gTXC-EbJ[VFO[de"KH?"muiR(=D)u6MPS7cjgQMMs);8V]325"\r%>.$98T;Ducp:4<TV74e:_H)s[F!X!;'\G8:V)ad"&H51?i"K9sn.nq6G7)hjJMSLP81M!$#c7j''hO*_=cReCW4uml^NK=n%/%*q\r%q6sCEo;98LM9jKqZl!>>VXk+r7OD1nDCutk84]GHCb8e&YC""SgM:p2h7S1<pML-@$(+HmKtV;-:Rs%Kf3Y=Q;T)Y@r"bfHT>=N"\r%?QBT7gn3#<[P@Na>gdQ,rLYa.b[0[E%igQp.D>CN7??"?,^X,Eeud726CPD>Y>V\YR"W,`Wdu&"NO7167e(s$O&9XtSSk+<md5SB\r%>V$AE6TFTPh9ZbNW*et+$_E[!(YT]m1%FT"Nt@$O+OL!W,S4;dXgRHSX0:PBRB/Cp#skB]`dY0qphZ"[Kt"+&^h!!imD\*UTdCHB\r%/VER<gLcU^1>*<Q1n.(2ab6.Akr+_nP6k2dLs73-Dsh,8.-$elVe%XB_o4QiDiASma9:f0+iK/e;ZbOVpL&\t:p^R]Hf*7;@j)j,\r%Xb(Lq0_ee;d&Xf7'4QLY:%c-OK5:BM?$UqTId51l<]BB19C$_k[RS+21!(76Qs0!_b@usa<^,o?j*_pG_-aVCV'^8Pi/OhF>j=O/\r%QR(QITt=3>\Wf8-WOQ1?4&)0H\6KAB9AqdSQ/tmM'15?]-;@QH/qkr#R"qrZVFJ/do7!qS!:J'<URarPlY1o+#Wd.3@cT$9\^5@G\r%5]JFXcl@JS?`),AGV%:*8@d5]na<qc1V8X%c6OT]\64(3h,o<#hXSl@A%<;s&S]:<4XI,eeA)O)c/N\;?OSX9d6Emdn6#-8PY9us\r%alF_CjDl]YPt>]#'\6HJISj,uKqE5/1nh9]$=D9GIUOgpb1*kKV_[kG>CO/TJ$qj:S!<lqp!NFd'i8Y7'TK7#f9iWtWGoG?Fhbj&\r%=#%9-I$R@<Snu!0^G3dflcH$iU$!8HY:#gB#;'QIq5--t$!%i^OfX5S$>XZa;N[3+qjpuc-)V"`0M-F;ifj5%;j3b$!_$"\lO5`F\r%/>G`c1c^7SMc1l)?Yf;RnAI0*kZ?N[la;/RO9lqje"ld_;+#BL%/aHWKJ48V[M7e=^4PO8oU=s"Hl@-"D$FVd>UBBmbq!>kF\V;M\r%)!AZ)QWi?-cl9CjVt4\i82!)@*RUi!gSf/,bA^4aR'Z(9NOS&sXg4D'f/hI@Lt,G"m9Q5oS5,t.ZWV]4VSJ/.&"t%A8^@*Ms,%L^\r%L"8dT4X3j^U^Gl*/$!?'I^O$BE9As.<_Dq?Ua@-=:5ot%P%>A"3Tk=ikVa*@m"?CU8?-$3*#_hX`>A=4_MAPhjLQAY+;GAa,$-5$\r%k"D17)uV6[KTg?_hlgKB)H#HX0?K8G79&pAO.[54I7&XSpK#D.``bYmW\u9^cX!$(l)rK?ZZ9<A[^N.G7b@&pghY(VJZ$7BcXH<L\r%S[kKD=hLQ:QV1DJZmFkn7>R'<2MhLD$f13@jj1EB4mSeLXhdA*Jsq^pjocd7;EZ&n>:TrLQaZGWEX"*eSLan#\qTHR)QOIW?pD5U\r%L$4.FX'js2-F"ii);"4],+cLsrjF5YA&[.<`SVF7mn12Fl=]8FF7r-$C25qFYCEVPM(XeIWf2ORAYRU$CZgu1>/Cs/P6n,XccW+Q\r%CC-V]V?@Qr[1m'`O\(hV7T&^@\@<5i'7p/rCD9Y/iu3!P*%TrukfOH"iBLF2^k4f+iKlfb!O4-`GQ=!CMg1Tl4Bu0]m1WtSa<1ft\r%+$&XANqcK@P;8*:3CH[mnY=HbW$X<Lj<'@K?g@1'm_:%:InASuP/,V1^s>5_\pp1PD@DI9&tTK;9E-Lfn8[Ju^!s&6Da`(Ii%8OW\r%gf=G]Y_)khO$uW6nFNjWcrPO9iknouMq7eB*=B6X%!.hZZ[5n\@HBXcHL`:YGn5fZIJhY_$`@-k#U")f*(lj.hJDPR"eWLYRgBQ2\r%4'pnK5OZEd(4=&U(uBmlcH.K+gLe;gI,O0N0^0B^-9-=g\5[Ei9Q8Xpiab8!@"JV=,DqlHG*4@Y&r;q^Y3F%o$LCH*S:@fCi9H]f\r%?7/Sj'AQ)o;oSraFqiX,M_5>nLF(Y]60a`c@0qB\%Q5?/`aq+\M:tV5*>YinK"f`b_Ql#(\AJrmW4(J?EJGjo?ZB_*A75bBX4dl#\r%91"D&#uuUH)1)2q9ELR=YR#I(1H@#6k>[Z+YXJ@=OQM@==S?YN*0t8f7FV&PQEC&NZC/g!FO8Ha1W0'Vd3L_'dJaLM?0OG#hb&Tp\r%pNiYq1pW%RTgXsVdP7qc;@Tu_G[ADdAQ=Nca-t[Fr`kbf?h!8]Uje09DHDpq"MW[H"i\jpf.T^V8CoLOC:UBPHL"ksk2Enp3o7k6\r%gh,sIW1bZ%iAR(hP=eajdY?LqRs^Ch2Ql#I&/)JeRY!EPQFjfceFZ`>DE*q\*ZI/qVWeE-gUN!mh!#:djftMsD7Cfj<dANFE1<^t\r%/<;C>GE-HA$54DopMDCi3[VASmJn_]O9qM-=W=V%_(hs-Wgfn@_1C8$:r1[:_1;nQGqdoFE(u[4)2/tuRN?/\h9^t#r4G(d?atr8\r%r4G'mNN8d&OHm5NMcrU>V%0r/_;IR>;Hh.pIs"Ie>f_SJ&U/gt<?W$A=dlKQp`t-20FA5+[K!2!.?LZ24?]X!VEe5jRR3GE0oU)J\r%8QL+QW*pC2Yo<#)&"Ka?3TIOnnsD^Y9=9IIOa!Yj%&1qB%q+m2Un"$sfi%/+?t06HDPGb,jiaT]hUdCFJBU@3R(VulT?R/1)s]$A\r%&]T%t,N<d>@J3=2mE#oOBi'%Zg@#jHNN&+<TbTO2m<IR&;NDY=[-i*=>,>9'#M)coLPjZBopOqtqUaR(ID'84V4#ImfuT-_)b;H[\r%DqKDb'$FcPD'HXA/#tcje0]d(4)*f]U!GVj"]WEVn@$K>@lA:fNMV0AXh:#>AqRj`8JSR_,l'TN9BjZT^g*KUAcp`/ckJ5S#dFD2\r%j/SIUjQ&QbLFQm<+Z:JAU5[bjL^iPe;oWWmM%-?\7TRBB+J7//n#KhSW*lT!1)jm?Wo;/+1X8^NV1ZZkWJ]@o*$Y%3="@R.aV=!`\r%#%Gd7eV20('35V(/LI+C5_ojZInU$P6+"UiNS+lq]26F^+N+IDql6"mK\-9#(fecaEi6c<^FEh_ckTQuC`m^7QMc20Acj2-BY$6:\r%"!KQ&6WFl-JOib-K2om,+Jonc%ob8&a;KbF(0/Q_nn^[o5%VqBZ>"rhe08b35AqpKm!)rG`72)LD+^0)`733L1)l%KA^0nI@5a5/\r%4RA-.@Q"crbG$r6fNQ.h(4'0T<8AlX[;^n,S?4)RC*i!lE1'lC*;J_*.&!W:l!.5t'N8ek?tt8P;c(@G\Bm'<8I\U+[om3_L;XY^\r%BFPVnCC-J6ph?.<g5Xe8Ji@^:",(0tktH4HCQ;k(L@H9O13-4$BnE\[QJ^1YhcROn-#@<no_tYg-#@>T=U!*b>CKKYXteeIgRtNg\r%[qh5U:]<9PQ^EkC_h@O9:Prr7_0*loOQq9Pm9Zb'57:6t(8`d/)dW'I'hQ4h^RmAL!lnf"AnL2-#C,ZJ)1L.@%B[X6*&2PSE3Wkq\r%cUph257@FS84Q=5T4P3je-2JKT7tRK`8FR]T7pp\+ri0pI[7U<X<RH3hKW4@(-W[)oWDHt\k.T:>&sNl9kUN<jbu8)2TYiMG%kro\r%5hHBk@m%_#G3omF04^oOR%5DliqIM_fb_Lt"fc('.CJXXUOOZZ\0gXHd1`lCr-.-qlGVM$BReFE'6jIOh#0<SpKp"%[qFKTXuB#<\r%hYPCpb/><(4*O<a_W,OP`*K6$C\Gu-3i&6[Ir"'3/DgZ20LG*iXsmrAc?DY_'6e,do[YhhqJ9kdii^ZZ%ZOhbGdpPh`#Ued%D/?S\r%=LTgde;Y/0)^J/bWFljBF>"b$ekI"HAs6GnZ#22DD7t4Ef\>U31b,F%nl.tHMpB9p#-o1o^G)tL&sM.uR07(%?#$KhkI.c[1Z%[:\r%Z_HXA9Q,=Wo&MT8cl$$"3$%ho*%kk%Wkiak`c'G0[!r$8b`H)XH+J:*d(8Q);u(3AKe&m$]SHbBO/tgY&Bt9J3'3q0e%Iuu"4-U]\r%^2mZ]\_HqjGhKKV_sS?G])Q)sgimKB@i`p]*!URWNck+FP\S58D:ZZefT\01fHC=^J6u^\s06e)H]97a(VTrVKE2sLD/;c\*-"a+\r%R%0Y9A(-,.s6;1I=eSGf2*8EWs"hFCfkt4D9<(qR4jVg9CHjq/-$7J_+b6FCN\tlH>N$J/j2c^m5%12RX4P)a3ef$^#=\6NHb)tQ\r%muPML.E]r:g2kM,cMmGsbB&H@kL]MuI@l"q[kN1hK6K8;hYG*K;<bRhIZ0n4mW/F_Pg#o-FML.nSJu@(G.>mlD6(q$TDD8^).\):\r%KA>IR*E^TOYFE--d9gNgk&%P2a7-4d&-#@DMDM(i[@$9<L)r.''BA'J]mPQ&g<?Z^\3`7:,Vd1A2@3E"VQP$BE:KpaI-e[`c%iH"\r%"pVd6FM=Mg(>bZJ2pj,9B@lb&d2A_Xn0A*>*c?S9abYY@&CX8rR?78(GtD5^2ZbW='2YhQbY<4qZh4&h(I*pQ>OkW1%sf)qDp>u&\r%>O8#\V2,$-j>\F:G47$0(#<493s="+\>R)!NU`mTl7+l6I)_##_RH%nD&-eO)"".CHL\E;@FV6MePeDJ2T`A4V.p']BrjIZ;gmB.\r%?JbPPlY_tuqY!t,mackin!gFQgkXcpoW<WHd'0W)-3cn1%N0^WBrlh4;o54Q/U?kd6r3IIXHI;@3@^c3'XSGO(kiR04Z^X*^XePS\r%%8"(3c%Z[WP@QnT2Tl^2Lt]@sdq!3?T&WRLKXuc\Ej);c-\iF_U:/TWlsa`$->K$0dVbp?DkaZc#@)>Q6uA<ES7ZO-->HbK_ZAbt\r%R6cbS?>9+BbQ?8EM$H-g(OB3f$8.15j9cT+pq>!c'G8tc0VQW`EWle&8D%pG>XCu-+M$"_6^j.57kD4+(M?oj78.lYUk=%?=.nL"\r%=0SKOV?k9Y.(IVBL/i8nWHt=O4rO;&([NTiQX!IsaoR+;R"sWF\O+AF*$n[Zi.ALtH=Memj9cT+&l6Ua.(J1A,LkSf07TA"&qD]4\r%Mb9h""hX,#)@+A!.(JbPa\-XX?;pbAj!D71V[$o]f@imf_bY:V$8/\\As?PCW!HX.05fsAJWH4u-O`.=defEZpX\J>hMn^%lWrbd\r%Ib-NXr4R.#J?V_eM+HEK>!P\BrELeGHfOo)kD_`I<OKC.b`"-u<b?XogV(R*;<a$/Ip1=8ab(aed!Kr1^K>X.pe,=7mTODkh,<_>\r%/@B>ea,!\j.XR2_dICgq3n<7]c`T@5$c<Q`4/9,JWqE)+rPi4-^^q/[I!U`c#Ka%0!B=-6<0ck:k$,0:F7P:MkIoq1qr8o!f,RRq\r%Ab6&r`s1<DNCQQp-/H2<>_7I@$&08T0,RO/=a4%1r34Rp4h^YFf&34q"'1"J=Q/&qVujO_kcV%2Q<*2;0EMrFVUfbantiZ#abGjo\r%VR3;&]C'Mro7e$TK6u)Bf8%b*YBaGg>sJ&DnS23i/$8aR))BYc[dBkhD$>m`7jQ"%'3ju=c,,mXas<%.?$L;FG$[+3K`gs&)@^<d\r%2PsEFY^,VQn"B:AK\%H,rNkPF_<7`mSWVu$H@)Ln=ccQIlQ%?.C2]8+s-+GaWrD](4b#Y-BcmR@NkYck6p*[lbpo+/$2$El.l0gP\r%iV.4a8ZZ@`*R>":fFF2DfD^CdeS#L)oQLqZ:fDjaOP=PgQG2Wt("Uc;K']hDLDKO^p="6hE:fLrOn9#gC8.QcTY1Ib#kT.TZ$Ft-\r%;>$1u*XKF(B,0G6HH+)']C5AJHL;h\DW8ha]mt>M5^[jQQbI7[?$ppnQP<5Cc!F8@bp*igRl[M&#Q$aiIF(-kNN`ri+)GN"7ZXsD\r%T"nARcWLZW@(-&dM$Qrcbc+sf.58Cj(ZE-5.kpjq9<pM\(.)]tW5/DeAe[h`)I:u;';iS322[/Jc;fGKf2Uo\Mc!ljr^(7V=Fm04\r%ED4),Zt%-lOPT[pXD>qU4ij#*B0"1r1@rbMB6*nSfjE:be(/4P8eqb"I.IA:(3AT6Q#qH5qb'S^q^%n#'Wn70.La^=bZQ7@hnONP\r%4"sl"I&'nS1.EA]W2\RBS5qa=8kUe^[I\V"j'&*4",GJSc5;T*-dBrqDfg!ql$56_R+U.`5O,6R/<(BVBni$]:2qUKRd'Fc%WTKq\r%R\?5(:-aW:Q:4k^KG!@O_=Vs5J[8PRX$+C==SDqM_"^mP_@A]')b**.1RmsR<m(^29$Ytm*hn[fC0@X$Lj4(oeZt578qGNu_;.mL\r%X(B[;3Bg@"b&VbO6qkZq0?7g19Eu2e<$:RUA?;)fYAJ-2-QmY6b<e"C:o".n"DDX$(9)i9GN``i(9)gKLa3n<J6/>H6R!5DJ5],!\r%-;]pZ`iPI0/J_/Wb->+cmp/a4(#i6:Jm067WNZiQV5BQ[DHHUp>M)hHna9$$oi"dNM0f08%8<pTC0<[TEF6XBP!uXVnue99\t0!:\r%9_/^h+uX5cUN*gWH>_$9O?g>J)3(-.0BqqRL*QQXQ^$h+\;IZ>Bb!o?U8r4W!ihU;]qKKFE*>%19\cXZiI2q[L8Pmp$PG0MS>BC)\r%]$^kOiJc<m,csc,KEXrejg'kCl(Qlr>MhJXjM%\@]W5VGks;#nZMIiES6P!:>*<D[5#-@1X>-Uu\69Z2_Vl@X*n@P.rX5W==ffQt\r%MF^"?/21)n/c]1blrBXW>'>4p:IMTAqH]b!<cGH_=Q^o5[HpoM<`lTX2m'?0=3I>MOq%[-X'-9%@5p'ErDp>W1KeD!XRB[9pM*he\r%@4/Ke(04$Q]9$jZZA)^8\69[:_A-%deZr;8;-P^J9<2eddFo_FQK:E%O04eF]IVggZA%(4B!naO52*'2eZq&(f'<.UCDacnNko_c\r%0A(a[dkBPBjVY,qDt^%KNQD;a$bGO8Y*QcT^aF=/fB"AYe`9qO$m:D,G8@?&44huN:\SX8d`)5_G^^&Am,BVEL9Jk[Dl`7)P?-B/\r%a[-_GAXhEK?d^D3Dlg^UZJ8Yq@33"7*]Qd#=F?QB%+]<G[F&LMAIJ:!UX?QbTjZc*mTAB3_=m,bbIqm[q/`lLpe-<)fDIhF'c.57\r%S*,!dL[;l:[]PYJhqU=7It"D)="nR'L]2:7P"729F,B^H\Ma/"W"'E;-'h1b9j^i>hn=rl6.nd[?9eaV+gW.9++HU"KY3?B`iaom\r%0u>P<Pj\*@>ui<"Ha)/6b7F"-\G&#J/jIm?f9W,ACOEiaV7ZY)(S:"#cs:Ne+K=f";dJ%Xk,Q&kQ:'TF0^C?5;SuRTGQsb?mda:^\r%T_S<I/hp<768sJ%mUFl4-eDXQWlpprk,5ih<0s(>`C"kFW@g:D_c:pVW@iEsH?E<XP!sTjWNIY,Ao?XFAiW(Rc68sH9?)A'3-Rpg\r%kUt#idWG^PQ?&&$Q)^"h^ZU5kf+@#\ME^!RPXWtXPgFQ07Qa)%epIK/"jg8or-H,K`E[1+O?pS0W\*o'1snYlpnC"rZogkN4!+5I\r%5tA9o%h?Cm`U2HLRK@T&hG`b5S>m7p:d<9OKU^gR'7kC9#!<aI?f?eGB#'$RTc/r9@&<0$mjYLB*qWb[]#ci@i1]a`omY[9XM!s(\r%NjP5Or.IFS0h9qk%LKk$_O,Z-^I07eW8+BP2A5f"Y#Q7D_^Sc#/UI3L<a"C`ZFR`PZ6EI`F&<=>^TFek>@mW<auTgcrYrVcp\b!/\r%,-7.f,PG/@)_J/.]s_UZb)cIRl2OMZChj'C0Xr,oJ?Na<LVVdXUH>]b*DH5jS?_+t<;u<45NaB14.(?`5Us\H=oer3joSPVXSLqT\r%09fc2Vp"n`_Kcr%=m3b/FgYb&:n672g:polDGFD'T[(j-%tY1#WK3u"cRP0u7Y,(bb#USpVUZU)heA_6OQ>\E+Na:_<X,U]L2tbA\r%DIYn(\K:56Pj=*[4K4s,c^;d?=hG$)6l4#*.uoiR6_Q'q@ne=JFMnp:@Qt6-Q_6[uMqdnmp24uilt:lu&R$T@?`]?>&6^K?r@H#9\r%#q_C\.s\a\=\teCp9Q#IE1nhcPEf[pKsK?NK=qYdKsDEW-e?S?i:I\\6<X$SdktiP;r%!Y?"_Xd7f)?fG;fCo5Q+;@rF>(>;2)=T\r%kpP>AZE_hRnN*/,dSDsgf1f>2N,kut=/VZ1SPB'+YH1uYh"JWiA^QFuicSKmDs[Jg5Lq=]<C;A72)a56p/]kM)U`)7NYp+mHagE:\r%e=,4]lJGXq^TFf6ojP:K^CSf%SWhq-Br@Q:5&OY$Aga_1;tDH_\RZK40/8&SqIUDTn2kNA2$D%&H#S%l$l:DZq3/D0W]a]"]@Y`U\r%cjA:HIr)o4\Gk@cPIK93]Ooa]-*SIH!mgR"Tb2js#_9Og\qZt0F3X*jnH1L=D9_i;MoD4eS'YdBU&3,^;Cu,\rjV%Uq[>%Nc>ue[\r%@1,^]g]52uI!MNS,SQ*>q:,7o<.#QT/KdcT%PO+Bndl;Q.\gCrn*<Ae5^.%^KT[>G5m(@EHB665@tZI9s6cA*Qk8DE#X_kG^F?G.\r%"\p8Db=/T?/:'4.b8',YTp$B`T+`tRBM:aM$ZY,GJ+tHZ6X84>7;.Jb0:S[09k]=jT3f1A&/jKEj#1Rf.5o+U9LK-rET(=m=H,h(\r%\B8_2Q]'_\P%7a_X/k<QNZYhd;cb)ibXh*n;$>uXkcTkE+18++(KX);mKbA)JoD>`BOqKcYtRJW50_W#/QPZHF':?,\Z/oZm!Ne<\r%S%Dd;IWL73$<ese5sF-X:JD!f-Km!lT:<>,2giaZG'b'ekW<A.e[cdo;ChE[U^Z$nkF>rqcM*'VH2(5"MkgEP%.tK,:.8'3;hgIZ\r%Yt3"pAU(Rp4(.o&%uCP2P3Fa:A,JGC56hU&(Hp<Vp/1q*q(Rq:0:bA>$h?3bS0D9)#[t$WLa$1#\qm`3YTY@8nLUqZ<-&o$:LB.d\r%oDJC1r8=`bH%*-,LSU,hBFPVnp+VR.kVmc8aaO@Xdb.!KDJ&R\gnKCt>\[HW6jW_c3A5WlKI+=[TfK=Sh:G:S]Ncqt.kRi-C3hBT\r%,j,?3nZ\f*T:?]8F-n-6"Xc0]hI9s;V6J6"3`6-Vc2@ql][>lgR3K"Cb2HJ//=46"9mn*Q@(?t@RiBj[_.[nnH52&ja%Dl!>UgNC\r%*1gYK8M<8@F,AOYA]]56*%ZG70+)Q6ORr[Nc-buhfdGe+k4jCnlCHpo2O@q_2]%E2QXmkf.Ge`Z4oaO/S`5Vea5k@uGJRs6fMN@5\r%nS8BFi&`h;!UK.'LDS4Ob2jmS.XZ%iEo4!=,PQ2''@SYQmh^JsN$Bb_VUS/b=L4>Fj9pB;J`ii%LO<Ma,$6f?5no6R7.TZEAlC8)\r%H%&qW`O<OO\[ko5P;A5Z+UY_IJ*W(dcG3s,=\R$16)iq(mNrKt/&LCA?rN8SZ\T#m7Plt_r:]BPVC=Gi86;tI!(,Xm`+Wo&R7+`h\r%W?:e!,GS4h$Z1`5PU^Wa:@I?''W$[4KQ)cGrH#]?Y?IIm-F6+>!eXIFpgW^$D?:Z&Rro@l\VO>hFd$u#K#sqDoGh5^.+LMOYo:HG\r%T:SMr%/M];q<]ZrQ^o94L%QW3^QNW]%paVXTH>uN>Y@hln8EYXp<q8pW7llQ8@>PDCWV4<Wj::4=om0:#io*L;Cme)^>!M/[rVC%\r%<p*"E:.@kUiH[,Z'"0`-eu#>Rl8rQ],llm8lNI6H<K&0f`s]sj,pp5X44"'&@W>!UBo@DA<D'Z.qFg=,M9iFLop=$?S:P09l7W0>\r%@Hs9pB<4Z&-0Q-QUB^]")65tDa,0H5da$a/e_c>9hi-+CN0PVtF`pMPYm<I%6lZT_#sWY]a6-Qd:A@9D(T%MRh06LT%Jc?@/SU4Y\r%Icrd]Sc>Bb13'lbkpQDeREVe_2p`e3=Ih+>#sV76!Pgs\'7Q+"/"ub,W*8F'p:ZC>`h'gEK2>jLjR+ee7Ofr-N/[S50$Ani9W80q\r%"$,?B)&dPadjl:3^aI+C(9bT95J68kLf]SV5W)V"(Pfpp$=$(oN8mpjKhKNP>4Qa>6EdXb8V-TR>n0D:b@S)&WYIYT-'/#mN@kBr\r%!Zf>1fn745oHsg6HrSYGgdft0VfF)k2#6:9$(2CmUc+doi^sP7B1MdBnG+LaFB<LMiJSl`lHLk$UPS';7RRT*dcX^nE4r'_HFg?;\r%hl])s?rEZC)eZ1c,p3BV9h#0V\(jN*5W>6G"nEuDqXms9(QSNM*\.k$+F:dVbj1Bdleri@'J#8(.F:`sL#N!_8V%A[Xb.A0RhR9m\r%Hr<r&)(O+qF/5a@rkq?)KkI@>Gqj2-G0cgf4N\Q#"H>:;(Ig7m)V%bbou7WpTH8D\`Z*I')Urj!a2IMmFX>=YMgoJ<&+>Lu):dc1\r%YTrZKaTqJi.Nn,WSiN`^/"Z&Yha'DU9V>B-?m[jrk):8$`BKCEfHa"F5s9J0]G*ShQ%&\uQamiVpD\DmO.5sQof"CHhU32ZNVpbM\r%$,UAGJqn^*l$oU,N#t+Zp$q=6\s)p)D/0/NBYl<B/u1bQ?0SqPa(GcN<*V;f3YGUkTo@OfF/=]\NOMhl@5U,:-1i4):BX.`N;!]W\r%=R)_>%%5.?XEJY\RGfiLhd.dW:jeGmk5Vr"I#ac7Fj_N2*=r)_o8%i/Go)R%.O!>f[ct[Ngrqq<VdZTHDU$?GFO0!@oiUEG*hR^?\r%pl:&&jRJYY6gpAgM*/g9='F4:4aF\DY-dm=A6?C$8=s`'Dqsr+1S/H;QUdjee.Z'Q&J*us><S%->^12EG$[+9\*!b)N^gpSK"Y<^\r%&+dI-[Wg)dGf$dFMuC!BjMC#WqON2%<"7'*;jc`/:1Vl2,a&'T29b1[m3?rVI*C;+rm3G6`F7VCr5HI!c]g\nkL!S'=TTef]-COn\r%L/!+ZGN$A<<:4,j%m#KaelZmZVZ%Qi<Kt5_Sbp*\k0[Y1<Ll"Es4<m_,E-JfkoWO4n>.Ip7>(:H!%oaGnHp3KWkN4l&gTYO5=WN)\r%OjJ"?#Ii)@f`n\Da^Y.]p:(9MC.I/4oss&R$)20Bk:gE+n5iAcWlYMD((9@HNbTQRP9KMR?Mi^?/"rHXNWDLGe"H0^'QkTp+')2d\r%:7#:Kj'rm4SrYmCDkZJ`@rTDo[rAYPoi`c@IJ1h&m>6Q'`^C(NdiI5\48oLOcSSTD6kGngL=nnWBeL7N0$/KsHot;@XL!WERnQc>\r%'m&%:4,O_T[$\1RkW'D>?-$Ze&H+5$Y:@M-+aT&D-u@&Z6M.*W_p:T8JZ"#(`geW68X9:"=)0FS-Mc'+>Cg9Rcos$>kDJ'VUA)/C\r%kB(.5GW&D\_aMh7G]V(EY5P<_Dk&WkkS1-J`i*<\Z`'IDb7u$OGaUTBGg%h.[u=aF3H,0'",<rq&glj'Jk-ikVmSu'$GMb(+B%-J\r%@7[Uo59A6^IReL@(g7#r@C`Gb]aZQmFbbFB`45Q$Xd5=Sif4sCfP66L+R\/4PLgGVZ0:qW$\kkha6.;22A2MYFMSXVdBjT_(C\o.\r%Yh-o`(Ym+GA>A(3M1lV=b!t&I,Et/R.[V?)^Vn"rP/7@8c:A)EJq[<8W$DFV"UhS%GZtq1<`$/70b>l7[Ui<U"M_^dc!:L%*giQ%\r%VZ.@%*gkgddQ'J3`rkps"d0kaJT\EUF<6gA!sVOo^)iZ6",=@]Ji\@o1KQ\%0L#dnJe5eU4-/Vk>Wjc*#>BX<'7+&k@22^g9-On*\r%(07,Qg$nXLr#@E'f>lDDo/^9IL"\$?QeT(5Is"t]H2ZZ[?/MIKpW=*?/2o@[*2LISHTo8$9M8]><OKC.bR>4=d)_-mH=1kX$.qLh\r%='kSK))[[BDroT32qtd(6.a)M;?V5PPXk@U;Aa;'mXa3-PcJPsrm77&DPNcXe+N;4Ad^JB-AA/33I5(^%N&_Fq0HFt%N$OGY]sPD\r%cSjQ,XfZR7_#,0+j15A=?oc"+NmU(_bCQN,J`W^AFdPiU!m:uFP8R(J!m:t9"cMX,SY,JN[YJr5EMU#FYA]lac9'=*f#^,2G2C_l\r%UBABND<Dr&6>K5'Q:Cd3QeD!_2U3Vj/:JE3>28!H\6\'+N)uOm@,2*KF%Ko.&PJY[qW/*fIb97.:RoUXZAWps.lMm9lc^*9kt$Yh\r%(E+%O6GJEtfe+Pq"k+K6J?1`Gp*m[."PBl`Ti-L&>c^o?Z^KqQ83$oTP"YdM:]WM@Ef[u#.Te_,?n1)rR@=e[ksB0Q.5#tM!7I^3\r%?gkJ1;\XAVg-R=U6r1@^\L<,Pg$Rha^0$==qIdBWkLS/4BsqT[DjaRJ$+FW6[,th?Jfa7@3K@A<[$BmmhQ%bO]02)UI7ZQ3m/ED*\r%=C#lurrm#G/8'V@r6I=NolKeTN-+/hj`Lg+]#80knC,gDGi51X12#MS;'dX>KqHJ<`'I^t0$sK(dtN0)?'oQPJ\`DqB1[-:UW"t:\r%"`'JZ7uNG#Kj2_f*%a@'Q8q1LY8PO0cb^.%6&sOho`lR'$U!r57uNG#(#JZ-/(:?,$$#M$b4W:b?N7&&=g/.SLgMP!Z`NM_d$cE]\r%jQAC(($K:%1,FBM$WDb7T-_V'piV0^QU,;/jrOY9\g5s(Fc":`l+Dp^7uNG#"f^Z-8'AhE/9,Yu\WpV-55lh\B-u,?&V-$A9'H)'\r%NY;ue3^_o,0F+Gm7BO:rT(TFqJ.=utI2*L[l6$+,CD\!eB(u]r/VE%ad;^er,PiDkP$H9W#/n(Kl#M6[E8HQlk<e(2BYZ[8Q)/PK\r%+oprQ<Yes=8AI9-S-tou!F\ugEA$m4#r8hRXfP,=S"$#qZFanA"BJPWIuHP*ANapHE:lZ][qmS<dUKl\>HVN^:32Lu&BD/`?j.KH\r%6%!j.:JA%g1q=I)h>V/aL%rh,hYGN&_Lja#0EN:'+LHa^Mh',"jqm0[2?M`WH,:-^.4hY&:O$8'+n92M4a8"A4nS>2LIe_^bi;1%\r%giem2pM`7K]LR06'&b,sYi:Oo#d:+SDVK?N($&['.^!4r>e)0GU"RBLE7I>giH5oX9US4@KZ=4$K*cH.iJ1Tbms@!0/bF#@I^?(Y\r%F)cYb?HZtm^SS%XF0o'O#OqAR?@`XpX2c[o[Oqnrmg7g+A?+9W@2MoHh\M7@L@saf$+__\<D$VM=jttE_Sqf*Pq/Yqfti9`d5!NM\r%%kuY)a$7:WCk:c$Q+rZ/6:/,upQ3)4@3eY&!@kH]qV=kqBh@?%Qg^H4g1]^NDra/Q\J7Yg8&#Gpe.uT'G"b3-]4`luR&6#Q>qEZj\r%eE^V`GHpLWlar%g(?sP;7WuW+F#.!?j.QN.pbGKr'n5ThHqSUrSfcs5=1pdXpdV<KilHGu7<&93Bibi<ce'FpH->qUT>qPE$[m;$\r%Rqo0mG(-3)nh8\9*9-oO5B()@O7&"V+]O&Y]\p`?]tKEN6RF;oAs\YaHhm%AVWEq]$JNd\(c+b(lAWHGK7CZCr^>Y'`FQ1..P7+X\r%/pegkGlrJeY3`>sa`!Ec?7A%\k/MUo[W+"9n-aDid"CELBMLM,:0&EbTdS(B"#O;ls.)3#db!d:F7Zs)p(]OS(\1fH`FI.fA`<SB\r%b$5^1.LT%PfX\*H@O(VQ+8(LUf84U^cDn6I.a*-r;0GuW&NE>]]i;d$2[Fnsg%%i?DNOk#%/,<UM!=Ug*U!2#&_$,_A_`P;M!=V`\r%S`;e$3+DUr""<+g@pFlTp4+1E`C(<eUPWh=,Bb^nT2D!gNl:RhmO'0rFFi7D^6+GTmO'.X_O)?27)X1o^^cQ4";0,Mc$W(u7ngCq\r%W?dRmD@bAkZ8c=)4^]YZZm0`e74n?2\VFK\lR>__.u>.KMg\[<Y2@ECmcjLlU>09pb<aeQTiU&X?:,p5-qcPH<"as\a(J8A;M14V\r%7i+<&k;>HUFO0KMR=tg6%b#Pkac)p:=S7Ij=@0FFDIQGZKQ^sDHB_%;mMhutTN;H8;5D_Ks#dugOf3F6>K;ramt:)^5aCh7dMq*J\r%pQsaPTAIr0J[`tl)APXN+!/c"$\RXl5Bh>\<KbHHHFaD=O8WK:L`Tl/]*X8.IHeN5Ih4YO+bU#C2m4M([I_Cj66)`'VV6*>).nAE\r%S`RCLFBtJFk82PC[D1C!(d=J+4sJG/q8A4(l!8d'`buF_3Ir3RbbJn+JN^5YA%bVJ(OE&t[Ft=R^T"37@qB>NCYeBj>e53o^6g$l\r%*q.=/5<mJX)%#Beh:tFN/'5AJJ^u6,T4cms7cUBXINGsu+/(lNFg<EESiocGn+MRrkLo,i,3J&KS.U7"?LQ\],g"9OF%u2iJrZI9\r%cUt0U%kYBDao8W*euf'-Ibq?k#@&/D/9odXQCKL:@:bmL"9H`c`fi!CFH([<]%s`Bk[)b%453rS`e>[7jkJZ9ki*9XDK)8l02mt<\r%q;0H.]ek/%%KAca5UqBh-m6(L>elg`VTdh#Delbo2*<=$DP0$,lo$@'4i^g7[!jDH078r,[7TGJ,f:L+?UA)S,Pps#T_g0[FDe=O\r%BIGg!lLsiuhHb_tO(XZlit1cPq0;*T`^%Tijl>U;f(LsKY2H.%XEEIC0=6<i%0aCh;FP+"0E,aupF<D!(DlT#eV2'O?<k8RCOVrl\r%]_JA?De+tF]XWJ.>%WFgn7#i/BJH1q]NAE1ZJZ'r]^jSHq#sgginMNC.g6ka7e2\q:qEP[Pl/fDImXO>TnHJ9>+#sGb_Fa&KY8"M\r%BdfYi]ND>pr4^5Z?IQ"l>J^2DP("T6PTVh+["9)E*nVDJ>/=teFi7>M@V5qlonfd.`J,"3?&5T?jhl`sJs4)5=_IslY(m'38SA:2\r%dn:<T_99ejMQGaT"h]5qUlYpiF!<qe"YYTf^kA`7$=<X4"91f'"g9_ubn8R3U</%Ja1DDn.fPAGWHX'NZ5bZ<@`[U+F3MiDM=Rg.\r%r'";u>^+/4=)bo65(FdEat]G>WW;<t*^0=aZb=ad>&45(agW8V-+CF1=0=oAG6RdYe%K5\Y.S*`[s*O-I>3(pcF\\YGl=K@(tOS8\r%,N>7<P2rTH"dYUI;afF(a*^fR;tFM1At;[/FlB-.@ZnbXG&rAQ>(P6h;=2!h,0ua-&jm^!f#cp':KT*>T-C@bfB+p*F%fR1Y0C[2\r%fcF#X]Dd,K5C"5S!W3?opV*m*h6\P><Cc6B[%T*!7]$.MmO*cAE-K!#<A/5_S"@gem!_"p9[MNpk'jVZ[d&P#<_DNP$433"_f[&b\r%Bd<@or@h-TF2O/X1;P"_7N_id<qJoSZ`PLZfP.TJL+.bXErD*N]XHA8*;WN(D6P)1[_c[9Xk8KG[Z]:$SHs$^]MA0,F7-K%hIt7J\r%Cg5la1<B=G<X\TPVo8MRhFSnK3QD(t8H:pVI"ce:O('QC33)$PWMc)d7-a@2/$Y2L]^bU'i&aEoEm]5=fWVYf0%_G.FLgTu/q)`>\r%cK1ep\3O,mDR[t%o$[E9`VqSDAtnhN?BO8'kkTY(`[<(]QHS6a(A[nApd)e&#I3p<*hSh9_+O^pl_S:%1'nP"T!PA>f*\U-E]R7\\r%C7k!.`Ed3WR(W>;]"Clso'-MLH+&5g[>G_cN?W\<htD%IM#G`KC7Ki05jE1E/.[#..]1^\if6l53Eo2"K%Sa#R>#.KO\7H0==U2S\r%7HmmnFLFk`5%.PCdb1XKr!0)(WrQ!Yn*.cCU(@K?J!"+W8sBC`f=0*V]5ZV';iR%C;@tSX!+=Xu\jES\);LlrD6CNJ8?^jnc2\Fj\r%]s7F;#phD-La6g:q?nG/k^!+)ri('i:5e?/F^0G3m)u#>20H3'JA5B!k!@oY,eRKED;lU?_g%Sr>&,/7)k6NurHY0*+'"tEpNAA_\r%TCG1ghj8P%C8_'^6$d6'#7J8C12,a86\p*QGh>NHEC<%NhBhr+9dQQndGJ($=jc;7@/2?g)Di>&Hk"G`)E--qbu#@l,;t\:RsQ"9\r%(FQdXML`3LnWW"b7hH=,cnh)t50?IPgUd.nK5/]R-50-30>(W@gI<t,*u%,9:$1TT9q`[hfjlcC)%cAuBTnkNNc:VC<LVn4iZIaN\r%.*^,N1+;5&;4=2jdOiatfOT_t4<="PC6Q4!@d]<o8"0qZI[F0rUXYrN_FLZ/pC7NMD).$r*dFaTYfT9l)<j%^<0L1`9nlDXP11h2\r%7VSP]o7&tLK$kuu]fr,ToB6K\DDiAE%Z:IY)fIII5]aTT@En>)fjoDiQ,>!`@[!LXiWh<T*ac$"2llNg+-B$cpGn$dG?33>e$S8s\r%b(eKKelMoo?6IKLK#pBU/#-\e:HO-6LG6HO!n<(8Or:0aVik!JIgd6l0t^kL1$2kYD2mkk$Hc#4\/9V#[H?RWaUbX(aZbg"OH4Va\r%ES>t>e"h$*TJ=J%m1SE?iO*5^N=A+-/A`.`jH*e/_&;VQifHI$JLfI9l]@h'?6t`jSf&l\l_Te5[]'::qK>Q$o<K_1\TqS3%N%%.\r%nb']q*&-1bj6;-2TA.l-ELc?*@4VjlAmp:/W6j6ZS6%d6fk%q\.+6s#G`0OZNX@$8C5qV7"e-3^n&hls.,<&TP0:$h._I\iJ+n?"\r%C:HC%r4nDu=+Bs->\d3\oEK_?!jjuUXB0lZ6(9BmrEJFn#uc8:IsI:E//i;Q;M\`)`0V0^n;JjeL!Njtk%j9H(U_<_Q`BSBWkjar\r%TjA-@,IDceX9Qo=%"CX.mNr4FD0Dq6h40=[PgZ^df7/UVYn(312%SRa=u/jh\HoqF0%),D$2Q*GKt"pKYqK^=?R/ci(!e4AB:.mC\r%)Ge&1M*EKb1lVPt7;GN,Y--#bajap"4o:Nqk^P5_W0aKY6D,eaf9Sg]YbSnYiPfji\Hlfsh"))<)FF197r*SAX^^/+hF?pIX\j`1\r%@7BGL5LcAhG8&:A":[!g+49P%pl(V2oV$0$h8BG<hGI4^3B=2aBsq/B(DA0CcuiU?P+R(?>#O\G+/L-Gq_hJ:%AZ,BdL<%F6`:rO\r%U`%PB_PeE$U`$Bt_l+OL,@e3DP&!$@Dkh+<HOE%SNL[MJCNs;OR[.'cL,RRYP/VDMmA6+YDk&o@d&%_5P:2<(BNne4?;(XVnDC._\r%ic>QGbKE-AcA-1K>@*IDNbdibo8DTHg6S("U>X?TZn3r`LZ(Ih#jL<Eo&#0Nc4*]833DG4fru%I!QT#DTB.B@]X)$q$W679Em9@7\r%=^Jh6"]I>':Z]I[.,Sj.TB1dP)!>_&h_d:^0-%<,INgk\PD^n0(=qH&XpaE/QsYWPl0l[k(6Nb7l3,qQ/\\#$^;0)mhr7;_i="Q(\r%pas4U*PV"`Mr3Meg>RsTGjH2QdYU:Q"!>.oQZSrupFP=4pl]gq>5([k(15K"?e?HYhr7;_iN'QsG)L8Cm&q>ck"`bg3_j58hB\6_\r%.5_B'I02!J_%l'/l3hlk[D5CAaGb'goaS"pKl8_>WNY%j#qEW?1Ib5g'smN>pK$Uf=1dZ4?EHNP@@K]0q<.M*FI/GD+;cuCk*':0\r%3D?D/Hf_i.VL![<)5G8kH/-\_qrrAPf,5&/J+QhA`om*&T;$D6r<?sscNfF34HsBk%P:lBiT7Inp0Cu87*=Q&(_]m*lP]TE)aYL=\r%!:e%(?\l[f7s_u[4;)"Grg]bYR`\_=&RQUDKc:HrM_C.`P%5`q.pdEOUW!MNE!!tE7s^m'bLA"1.BD:ibq@iXpKaV;Z>]'o`ERJM\r%oU8B\ilg2(`j_J]2kb7OnN&\%pd-WD;X,E3_>4s^;,RpS%q/>K\"V'3hQn8['.:aj?_aI$qH,h.mI/6%.ahe(D,;M^gW7;t`;r1C\r%5[!JH]"[\4V'X[j')J4-H4R'AUj?1SX[8/77N_?PZ_H<d(CZ*>KLiFgIq`o*S\P%Cf5,pCH?aRf.;1K!p5%;i*7E&E0T7p>p<er4\r%lDYRY]p1%!/lJ,UX,HJW(UGq#0.A[E`@T8-QC9GOd-XLl7<F<uCa2.0+8/#3-L`PEd6p>jU^qfTSqV[LlS8)(eQZtQ^)&lEdd4r_\r%H\,:,o(&T_%23s?XVJB*'=adD(L>%6Wd`"CIrUY,h7&-:[W"2HId!Er1b=%`VKAs9IXQ?Q>]Y.T\U>lNN_qc5>((l_V@R%-G9qkT\r%762)1al.*P//*L.bG0Fc:\Z)u'\Wa252k[_DQfD9QTXJT@&_,7k&VUq*8OAfOq(tO)066#e-8UKA8_@mmEYSTHE/8)h-N)K7(;LM\r%)tuY4d*r')5sEU3TAK<W%IuZ27fb5OU"^lVV%GMp*W7T7!#H^,"\tcl^kLs9_`Cp#i.?Ie`rU/<_-9H]J.%P73I70eD%U%%W9u%b\r%,.P16DPSKG>0bLC^+pUj\g;h"4r*!bkE\BO=M*.37*PTB>)4M/)kJZioG3A,d@h.,pmW8O"rp:Sllt\W=`#[WO7k%=1#S#So9^""\r%doJ+4'/cNt3)uB%6Js=AR4<O>5NR1T(E;d@]fnIO7Vg$'aLXS@kTaGpOVkU]S(7e-$)[]q:Ug`Qhe<o*+5<:6SWD'`<i2n=\(XsO\r%WXi*jFAY-/F%re4FMA$R.eK7Frn,;Qg8ek2K[(71_R0-CK3c,9g@2KfKMV%7Ir!4Gd>+_-a-C(siFVYj/aI=Zf&*p;^MR-R]!e]`\r%CYVHSg.1MqM\.l\V[<6V@8A>$,;GfCS#Ag9YWcMUWCP!5GeOC\0)cMB%i=YZ&VuDK:[72G9Wn`[l;Q7o`Gf;UF%jLhS81^!^QBc#\r%?Hch2,@;=0YtQEYZO>[YWD76bA%o$JkZsUj"D-!4VpgPSeLO^#.^S1/P(nE/!dO:jPB>+CMB*m#[Mk8D@jZ,%SpqZ%JF>BTk9)Z@\r%&jf9:5C%/b`c-BNdpH;,fK7E'cHM-WV$!g(?rWl^a\IsFVpPAT.m(.K%_D$[&jupMm_4gUi*p+]^8nbQ3>gpc=*$0$EoWjF]/d=B\r%HrtpaHp'^d'3G%D+&PSjb+*c3'6a@6ds&kjp[Q%E-U-OS`es-SlLrVrEB9=pYhMe,7^'G;]oC<)-7bka?a=(C9j@d]jcTKQ[eIe$\r%[G8#JK3(\?+1cds7,O$D,gnfO7<@t7Q;VBBI%@mT^N-0$73J20H'Z]ln,."^@".&N=PJV85PB=YVf,"qX??DI:RJs'/24F/n'q/s\r%54XCdlCtJ-?oA@95Io6?'TY-"Cm7.!cq[*Ma[XfFb0@cFk?b@eF.L*.a63gS('o`&;-#"u+<AEK)[20^Tg1kj_58Vn;iqS3fdM9W\r%7j&?sfR)`*C'Q4r=?;=82G.=*"fJ-jA>@ALcOU<FQ]7/=_*C8@hKPcj!52Urh4#_4iTVaSfdK5XM$!h=2'K't."Qn332tkP=mpSV\r%XHS>>!N.7f`V!hgBApf$B&VE?O[)1<nP^tM&<H"BZ_PBfJ62tHZ="dt?:C<9G%!X$CnP8NGXslQ:H$A-X&)=$FV!t[[sa9Rgl^Ah\r%rD>dDo5<oLYhkYJ.sQHMJ98S,6`]Z+>#7KL'\<t5c-B/mUfelq+D![!_]r'4!NBu).5Mt+n(UJ=:Rh`[^EOn#4oqY@,PiDkrKN+o\r%'GB2)o(-[],p7o+76KcpeJ''Pa'q?dWM]0$pFRX7`>jsp[9.*1ME)f5c<,0V.d[X8IGH1bDK@a5UQnQL(7SBO>?7]/'f?H>LCYd>\r%m)X3]0ju)*HIg!\@_t134</T3*Efi9_G>Um*EfO]'KCqS40gc8],5-I('Cc/l=*3+oUtB"P!CG"b`ZM^&;m>";fYuCk^EgnZXW!g\r%4MRjAZi"Mb]Q6n1V-+po!m<-Y"E"RK&\Oi-@GBcP=3q@Zesb.?&=9@El'FkB92<cIb\b+2<n;bpm?])X+32NuB&(A2Z>=:)PaTM<\r%atc""rJ=Y3X=Qr'\uIlo/H:(Si@79#=n$O)&!pGgIc1^/(h>k"q=X(1)CO)FM8s8;0XD*<?^XniAb+":q*R666ils_fC.UY'3[i9\r%jRrh1Sh&09[@CQMSY`A?2VUq'BQ2P)kr1r-,qff+9'20mn[(leh<NiTbWkg+nV4ZO?rt0^PO^($?D824HkROoZDq6$C6RH%g('9S\r%o7%IVH$M/5LY^gAD6W."8D/b+J$-O:OT7F(Kbh*%A'H+knI@M)*OsV9&s'clas[/+D48d7mtSSQcJa]C1mq'-nMkol:(tqB>$f\3\r%mI+dIoBWO./Sn,/r2QZrk?'8F+0!_"OS!"&pdgr&b4JV+Vs0gH5K.90PNJ]`7RUK.HC?N@A`f+hR-<sr6dcYWqM!!),3D2d\QJ^?\r%1;FNLrDpP>jkVS:04AF8I!Z9GHj@>Sb3+%eE?PLDmNI#lTpJ,r"5L%$9JboZ1-7XH7O/@LEg(G0rE_Y'o:L9sbV;LEr;(j!],^jp\r%j)D3pA0co']?XL]%c&uU8Q?B3;eiRPJuKNr!INkS28Ohi_*AIT7dO;7TcaE'<M9,sTci!ED+m]ghC-VT"i33-8*`"Bqd11;&:kr0\r%8`kh\#[BX43ggoo,1($jpHA\7O47l1=._q`WN#608+!sS#6/'m2Q>.n_bmeEhofe=COTSb+A]E+N5@RYciqiXaVcXVOKo/bReSj:\r%5W)>rG*/fXn)r;`Y4J5i&pB#6MX]R\"S!P1Ne`&jfb+1QVK;G$E&9n:?0P*s]"2+VVsAbmbe54q@^O&YHDa?,lJu:?lZ&@=R2O"7\r%i&'EkA89?5WO>.T1c]nOA&A#r:=FQ!EIR$Z9IAG)n):f@9)9SlHOmkuVW`AG"`&\]4aQfCDZ$<+n'SK9,WT]6LkNckiqS(HJ)9r>\r%Mo?\I.moIo>))tVI_SRU=6mT<s42RGT7OYp3I6bq>NtA4'Q04qSXgs!:._`94#NX6T9*]`YdFUK.lo[:9qr:LZ;[R@.5PTK00;Uk\r%S<B8F;l%Ma4:Pk7Vd<a.E#$U$$BqDE/LbtR:'o,7\6p&&=e;;;WLlMqNj'V,!kj_kE>?]s*_E4YEV`02LN-`;s#ED-M4[9CX,okk\r%(!NlhhS_=%=9Zp.a+/M8_('btYbOb/ggbn83,'bNam<cie0XUb1RaV?*;Jaa']iWb\q4.3U^8)s9)j91F-VM@?kkgApoC4BDJ$0-\r%$8.Z#h_.CZ;RcV/b25lqCG'AfC8_&sK;#GKmV2%oBqI\.)=LE'8ae8"j\pi\.3af9G<CM%@@Kou[=fU[LENr.6hJ1McsX_o!buHX\r%B<fgEWqQ&Y$WlUMn)>VA-m)H$ogRfqq!&SNZG)-6H?+;m6%1\``&;N/AA1nYNP;*WCE%]^;b?p>#5aB^p)%NO?=9(f>5A/JVEFg^\r%T^Q]"ei-cd*]/BH?5i.!5HnCu-\#/I-f\NSFg(bt;LVqJ!@QL=K0l-a<AfUl-lUY&i<A<:+7LlDjGeq#F#L6DBJJu)NB^Ok89*?s\r%]hkriTTT,_XYfJ?]>NK3]mS6Yc-;n7@Ce3(Vs?X0<L?nH6e?tV!k%6:c`*=Lh_qt+DDiIQ$b^H@\i3]oc`S-LFIAH@:WBP%LDAB9\r%'fN\egp;I1O;%Z#T/-H4=gG<Ae@b*Z'A4mWD4UK^cKE)@YPE6cUb?$ZHg5D7WHMR#CTqG=`riU#2@h^'=YXb1OqTA8]97tQTk"pR\r%2(6>_(5ktPMo"-7Y;Z4m]klXh<DPUZh/JO90$3@LbCjn#rfPRE(_lVak4dir\5;tW4MU2EA/DuM<_[RTo5kC=rsDm*:c3ZBJl^jJ\r%>[i.jD@JuuoY9%2K3D`pU]Y9eFo:(-a;gG(Vocp(]J\L-(otTIE:r.3h"T=QH3VR>PM_)H-?6Re]6S8X"\j8YibODSmPF/6;Zm.g\r%<UO#)##<dY8#5(#R*9XG*%\QqQ"TLC-0]CV<JBLsJjNK'5V(OpSb7oV<oA=s(Wn@LednmH3Vu9p;HMl+]G!0gBCrk.[R!("AqOnn\r%$Ef1FlXtX0ahSX_p<18>9-s1+bHZ52\LM+^=[-\s3S8[)#$6o4qE<^ffL?Z6J-ZE\H&O@I<c1\(lWQ'KZGA7pjZ+n^2`gD(Q,i+*\r%h6lGc;m5gpe]V]CT[)0Wnc;eC_^1n1!!duW!#?kcoF&mYRbBh!?@eN\)8C_eaGC.\r"7GnqD/5]DF_Ci8pr7UYjBbaGd6b;K&K[/\r%1?G(N[."C;>50)bms%Cn7ABrNk>fmdBu;XkmIHLeS(qqTIr*#LZ(lVf,=!j-)<6L[#_ZAHIjI%T73L)HP"Dno%aI4_g5=P?VtIk'\r%*&'M*):J]bXsC<`q+2dB]=&U656\AVHp'/J#7Rf"\U%Y4%N*F_nb'[aS.Uc&R%FHb.Z)(G41i<VL0fUCM;r$Bo9<Z`/Ak_`_I52N\r%A[*fsW+FVa7jCfp:W<(-B"u\oC8;tD4?p[M;g](ff0Xoao@*_BDr"W)L,O@2m2i_Y:M\n'XBhmAX+S\d"0Wg)0)BJC,qF11"]k)\\r%V91db3@F$dhZ!.?XVo+KBtir[KiS2_bMB5FPBjR*\nW,?A<'cMcus5&$I$KU&uNI7NGO.Q$mN49/.*rQ^kdf1[ee<*,5A%;!bmX!\r%doK"t#ub6?rdm:8!X6T2[Xtk/K`[1#[Yge<:arV6E$.uG,LM(di'<.t>=:/oBmG(gm&rZnT]?9?pn7eX_1>-[7&'jP_1?o51]e]=\r%$kC3N@MCkb)'"IGUt?TD<+4Il4`N:oWPV!e2&[LV*9VpDGU,>33R22IX;pH>SU;[Vh&84m+."p#/o`Mq1_aes9-4uqLiXFq=+]I;\r%5RE67#;X?1J?'4h@6kXk!p=tZ].>qeV-b%u!j%c/0"CX]"^"+N>gqb]&TKEdOm7iNj;@'CAB-\RNH;6#A7hh#>^fr\r8V&?-/Ce%\r%$'''u+Y+\$3*5;+</ki1\Au-"%9!>g>XB@+VW(jp%9)'B>d/hAg[+5BkH^S97)lb[s2)7ufC,0nfkR,'^4(&Sr.KoEp192(l'*tr\r%U.&[f[]3Zhc8A0VY)!R*:2qnt]@(j#Y&@3/:E257e!(1.\=QLCCI1J)Mck`k1F"NtL#-8Ckc^#C9-ZZ)OI*X<;lT+D;YeA&D=TZQ\r%lZeMr,!Ved3:Q@4>ZElYL\>h[CUB:P\pb\cnkkh&"NS'3\!Z)5QR'U&n>2"`0sm6F=BUges2>c:qCY&=em9QT<&_%H"hgW2Aemle\r%$gs>]1Q/#n"d<3mAemle.k39la3'!>\,\=CUQl"pUB+sB7k75q"3iBW<gLQs&+cDQ=BW'c2J$K?['Cr;d*1K_AJra"%Pt0W]&39U\r%B]i!$?\aX79e%Y$X^N&MYXklIGes`?:q6Cc@^TU+>$9c.a)Ae'A#f#>-8aCPnQN.fpO"^I3d(lHWKh%>Hnej08?FGq)irm.7;?CZ\r%aHPX)oF%QI8k-AA3:8Fbp+<(Vmot:j=C6HY/S7c=I'B6Nn=s=&N_='AemAm\Zh3u";\bV_5(1tG_.mbe[Z:?gHJBli?/eglKcJM/\r%Ge-KSWPZ7$>&A$!DKhAbcZ7=Kn=CN)r@Ce)U1OUH5KiDpB;iZkGdciMh+UgN"F_,2YB3cH_ee@^5>ga:o\NA*p%7oslZ+aBBr.Di\r%:P&3Tp0Y<fA,4e^2GK*21R=ZH"^6k'1R;C^a.\V!NY%XC11uQ#kD#2=?o0tW%6Qqp+/@eW`:1D2GMfs]@i<*GO7\%;$YJqjq3]VP\r%(Z[)V5msYS0&0U%9[H-7aZV9KRl]e!]NH0Hg;?!la-3?.Io_qi,[kC4'D*gbS##Qb1uoj_V,%SZ@;/F&o*\u@fX@:qMdpJRb@Ykh\r%Ks<J_(.eV1/qgJdlt_Ib<.\3jp>#k>&MYhrns^p+Y4Qml214$,P*:SN?k8E\#e[_7Gd<C*HO.ZkgWekuiVCI"aWe$bZX"mOFSsKc\r%]BVb7GQ"s[J'<=MoO%3NFf-jtD).dQ$e"q72[6Js.jJ>F\5IU`Me.-$l9c:,[^(Rn==+'V:N]s$ePkb'Q:u.u.T\Df?QSeH?2YW6\r%(OBYG68lJR.JR0g@AsPo9A/L*DceIhZ4S"h16..]02kC5LMVWT_r,?L.%,i$`=K6T1KQ3QL(ME1[*#s6)aYYdYYoLM2SpRU7sieh\r%B*^HEBrAFDl08Rtf:LDsDkVEF5S&CA-_)W>I7m+r3hM@<]B11Rr\bflV3b&SP2@@i?B8k@jEqDXSI\CbV=Ofl@r(;8D9h@b\9!_o\r%CBK"36+4=M[\L#4Z!F%VN&)9Zl\XuakiQ7$Q3C@d^Uc#?l\ta'W#GL/p/.)]L>`p_m(s'k@7OB&Rq2lo8cflb$]8RX=aCs?XX0l7\r%k!Lrs@i7loDjm@Ab7L7THte<fQJpLCq@:42N*-;r5RkbP.`mDX5YGdG,'9qk(XVn=J#;[g2>/!QQ7AGr=[PYIJi1!TAbbY#5CAHM\r%f#d-apqi3;hON.m[;fC%2ONN0YWjHKW.>sCZh[71S4aJ(eA)T@bioiKe1gI7Jq4j6rYS]Ibg-<b-A'6pF5`b.eH>Da^sI:aZNoXU\r%J>'$if`MV+X*JtuIb,*+gi<#&r#@D]SBoXd$[8[sH!l(2(j6S&H=213R'+AQH=213QljqKJ#:CRa2^9jAbc-B4YT)*9YW2G*Z03e\r%:MRB3:-H;)h7B,T]=m4MFX#33$<.>qhWJO$"e&e3FhuE'$8fMVll3;0V:G=\j1oc'mNZd&-k8pp_-8I`Y)?f$$f*I%F^:g-0(ic@\r%VOSb-8q.)C]:`:^TWX2:h;u@1Nc^UBECU0fF<?Geh'L0RY$0qC-/A`CA00#4qH=jgJIHf[AJ:+K+7u%KI4pYJ'\iHC4:;t`I"hH(\r%Gg-cE(S'%^hoP\hc]<*BZb:pUXINV$;?9AK8,k%g+Ar+c55$%H$J2gfhZVaLI1C0cfI,>.D)PHTh3gb.B]09"XC$J9]uAE0nL<o\\r%\s-[;jVgNL8\tC.^a=$m(@Yo]gr6e#To98Te$]C'>M=cQO5J$E[S3XUddq,2'PH=qkFo#Ec8VrqiK'M^c<%OEAP@;%4(%1fDl(ef\r%:L<S_^#J_!O_cs9I4n1Sj*Y"]DcsUlDcT!7Q`cLAc<'2lZijR/X=LNu_o*JO$S1Fj<g$F1`AY@?]$d,D_NAtBT!Vhm\r5t18b0`5\r%(I$GS`Np`9]Aq1YSnbQnHeR1fB[)1aZ6rB.@RI^&MW5a4Y<4(/=P71/_+:B%h8K"NHA!g1r;Co9k`(X/]Hu/"lc6p*FF<F-J\ID_\r%VuGE!ILb2g-TBVfgo4UGqrsM:]Y@FRp>*dc$I;s?,u'X8n&:0i@!kGVO(dqXClVT*NG!o.GMl^C_Ch@d1rR:!K8'&&4X@nJ.9W9B\r%)9)6[8DPn#.E2%n8DPo./j=_cZ8T6%LDEeL]Wb"c""f0X_DTc3QT;$3%5"BuH,4]`$<jqs5>OL^#bFI9BH^C$99NdO$`S/QP"Z-5\r%<"mBudiqN3b<_/4-FjDUKj41004<W2gJRBkZ/rXR]l0Jq:`-R$.d(B50iD[.HIJH9@f);$\'"`"5;GF%*_/uWqo$C,rrCUI?_h&M\r%kh.MPc@MaF!hDa"W$,IpP7JU1NuBXdl4?n=#FgVNYb>W:YRZaeDXuUh#2Lb_`Vf\RiXc4,j!tN#W$/7,,)-PBB?[bhkZo'3guYL%\r%gA&?X<c1[5s6]d+Q?,l(IL96dI=$Q/Y-kClhmT>4kme%tjd&l::e>f'A0-i:8SVEFhI9"W+^K-=eWSHK&Y>:-\]=TtR[UfJ!XWt\\r%L+Yl0W*IT@V1*rjEZEKqG`]*;3hh\66@Yne5/Zhm,C_rX#;U=tkjP*d2j!ZZ#H.'uY0S5BUd@+c^Sb=$4QQ%_-Poc;-'^kGWa\RM\r%83Kn-.ebeJQ;j$r8,!g"]m&LfPK\,X8h+>B?gn>p`?,aS6AY4dbG%K4iSFg+9C)qXZ%<]Q6>6+PL`@QPS)emE.j^?CSIM#5=8WXs\r%bdQV?Ls3PrMe%JPX^FR3,.g;M5MrP\1>bE/&!G=>I)83T%[NR!&=:Gr%1$t(e`Hp+Ls)/)(EDGO]#s+*$O^tE,.8*I.aVWk6X3_p\r%iAHS8&/Wnt#$$:J=jcQ83#!9W>m8Pb!JST9?);nOg^B78]'=a<!7QS\X+j[4T32dsKZD"5re8FblR0fiKNE1iZ`>tQ?WO6We"a:N\r%&:#;e91ld%aX)I<=:-]Lp=(6YdH.le=fq2`4=B5*O6>IQO#`lrT@KYuU4#-cWJ+QE:.XLZ2>QC:M>l[0D0d7CWY!jIe1u=0S-tHB\r%8M,FX)KR(--`Me+LJ3EC,gSBYqYJ[#CE^!]%b]jW#8AA+lKQ03J%P8j'Ae6ZT#Zq'4q5U0oaC%LQ8g`EL\DnV1[ke^aBkN`'a]li\r%SS-%R\h[*gl@3I<3(U4'm2nR[$JK]pQ38eJIfD1%rR,l=:A-LrKEs6QEG#JgIh)m^7!O-&0ro(@i"ZSB_S]n#futQH&RM(M%@S0q\r%7>*V4fD%.SQV.H:/#&)c6td1R/::M+RMg3C6]%6L1a`J\QgjGfBP&s0a,7p]i'5k(L"DgA4]_)92gYu`naYBYW;D[%(H"!^n+d$A\r%_VFg\g%-4]RD;"4hmrMZiGMkAXjALA8TsZeDJ&C*FCrmk(kaL\[[FsW99goVNu@[*L@<?Z4Yb#s=$!Nl_8\.>"*`'\ZR!7DF<8G2\r%F&uih&p/I>IG<'L:OLmD!mF&(97EILqY3jh>q.To$[-mV*RWcjWciGZRGfiLhd.ebIMPhbf[1V=-5t$$UUoi4[.sE!qSXDP+i-E.\r%$f3PlL'6>agu2o)]tP%JMiXJF^k%P*,T,`X8MU;\KA"S6A-+.`Z_(efZ@tOuR/JRA=%5G0R/O+J(,O!lBD&V#Ue2=8KA"R;f-Sqo\r%io=\12,"\uKA"R+;Ol]B$t_`Ia]&S"@PI[^Ae2)[U\4MLO.U!G_;YhS!gt@V]K:=iG2O6k<]sHN-h+Gr)3!mWTV%h[WAIJP`RZU0\r%(?7J*kiZTPmhk4Z5sIS,i]\gTk@[BA-O'JBI*pE+o;&%OT*6bI^6=.tIMVA5$$!?IpfXh>)<PW&nZsW!M%"j!s'=mW3+hok@+mN_\r%dGj2!@J1h+s2<o0iN@_C7uNG#p&C=@(u*@\SUtJFZQqQdd0fWS<qCCgVo%cMr^lp%1\\DJTBRm%DY50B/ns53l-f-HTq$N-]U.^=\r%TQ9U*q71A+9-34JA3UMHah56IrE'q4WWo(JA3X*!]IUm5)+nN?EKqCVO&V9uka!U+"Z,WLU0F5I(Aa&JLi-?^=BAeZPZkkV?lLHJ\r%3d>kn_WANnTAZ2ep"Hl^a0>=56%$F8HsckoSQo@)F&Wt/aYeKbOCtu<P?O9e0>`%?P$0Qo6^uVXPF<!sM?C3od*R[GFCg-tdY7gM\r%YfEg+r2BOu+jPal7VSR4-S/oCI"!Cr>@<:)cFf''-o*l@7enc)os'cPNa$sKYG\S5I-X)7_E_m00JQZuW\`n7hajo3:I+K5VYiCo\r%?%!,C,j>%T7"L'Q.s$o^?<Ou.:<(H,b^/OrEd5,g'H3"^ZiYS*!#201MZk3'$i`*GqHO5(<4\<#]1L;JWU-pBrpCjC&7$CAs&dYJ\r%%D+a35KZ^/VP4%$<'fuUpMVoHkS92`3W8*eR>`c1]l3-_h,MV/n#7+AXV.9j-:hh;$mArRBW^:m5foOGF[.bunfq_\R:!]mn+[2J\r%oX&-lU7ZDRP1g2@\(d/K5iYq>;>P"4%f#jBoV2b9F:B:Q9"[9cTKeY@Put*'$g!md'JWFokqldCUPOK<9p.Ms,.`H^W<4'B;eS]W\r%?Ru\Tq&SLSdI9,+VItJ2`-H@bR.4+rbV@aSN+J#X63n/XT#D[*'6[gHfJ^&r-HW(%GSY?oP"CN#/ERerZpKW>FQQ[jD&6g<7hapD\r%ZO8>\bg!b=*K6UN[QTlk'Om(?BoZ#!r.R"C)4)-M'AXhMGjhaIP8B9\(PK_O5-7LU`;!/8r'bjC1?Ktt&`["B&)g6a]K26&*oX\$\r%o0gnL'+[jX*70l.>*)^rGW`#l7#XntnDZf]7Ci!/8Vus_%VQD,?J!8)@Q_=&)B:i&$!<bY_q``2o*!!%0':b,**s[bLeQl$gJ6;K\r%MrEGN6CMK>EYbJ(/=0*aTZnE[Lj)M*o<ZrT]aG"JM?/+7-4#bY*q"Yd"WLN_^:C+OjjMHHE1^XO@m0aGI`Kpj*M+LiG"-+s<9lt5\r%qMfE?K?d=8U:Y:BX#E2b3'b@JqPk(8R6!2Gq7?BVmeu.iaYVeimNmYA+!3Rac*9KFn%5X(NQ:bQo#85'."Ql`klkMp$eBVaCKn%L\r%Ng6lngM"9lhL*uO+'Wqhme0rtXli:ip7:ZS79R%)ZoW\lXaB[aD]Q;??TPg'K)=bD8rL9JPN;.K3J/A*l[sQUq5Y1_6`rELnTsbN\r%[9RG50?=]p(kqE<iCm_%Ss-G><-W]ToU>'%/b+YA1%b7aiuDFb]m\X\h/!f9cs(QJS13+F4*iX,CN"P)SV\^"oUIN,c]41oT:bC-\r%\oZJ07Ytq[h$=6#7\i&WW5=pp6JO2[WA+'TKr^]I/.YGs<k,_lR4GJTi=DfIA=eF$%L:*5,j+NtAZ?De9q8b",LD_GI3Wt(lEJlc\r%<I:n;ip9IEZTNGf<Ys)co8Dg6mr.n8L(@qd<ddKi.PYF`T@Vn\n^`T3Iq!iHWn/Vd8(1B>De%tM>!3lYoMXFYZgjrBe&3?hDiYXj\r%*in1Z;-UYCfr0.[B%h&8dOud[q4<(,1",jh;hj4eoAF56gN#]a9[)0<.3]eO-Q<6W>O6/8EAks[ha2uOHT"KZ`AIss?bF+/<=)>1\r%`RcE3Wl/N*E,QAtY922%BH_i4XsL]4eNdCA!;2d==&s&jZV`(2/1;P#RuJ=<CpjCGs8GS:oXfdRUZdd&Q]70pFOYW@gd+`?2>+8d\r%]bN=BL!Q,2*E=90$03SpV)1$,4/d9']h0Eh-$aV7]h4CIBq:p5HF%i'@nYR5m/,@>,.h'O,Vg</j$``SIOgOXHP?0!Q\eD9d=Hf%\r%JcE0Ba;2,Fn3=D@%hB;@KC^6+"g.V(#G86,K;UfJ]cC4J0S93JdD71H8^GH36'%9(aKZ"o=&Vs2;[(P1UT:AkMQ-G20Sr!*L>Dsc\r%O@_Q;Cu<hc[pVk%A$Vd0[!`\&q=_6;ZZ,=9!<=G"0]`&dW8nKOd^Z2iX89BXDk>SD5f[05]Ij+PC];Z+[G#c$T&)nOnV,_]r8l>=\r%WgrHNY-IA/$SpJ3X^9i@hs&^E^29!8IlBb/HA#ENBcTCr?Mi^?.q*$&rDch^R@]W1B>T2UT=WHmR#*MFQ?m^7]`6+Ge(GVA"D/EI\r%OrS0)9\hA++E2]Hf=)4FI"N*m;?"7VL-FbDXhF^jVDn!H/E>#Ggo)&]0udkWZ&+N!lfM\9^OGjC$6R'IABts>rr2i+WO6b2],V(F\r%JD(^0O@O&`8HPAYD+=q=(G;9n(Cgc3!1r^S[R]h?%,aDVK\o+Omf8s?*PiCEJ-W^;Xq<eg%fDaR4b38;1*Ht<o5%^JYYG[LkEJ[;\r%[]XceXZfqe^Z:pt2LJDp.n0*^T!)Q&:"GI4D`.1[H7?[RrJ\&7ger.='3Jugk628KL!HhN9U-dCQ(%M<YEjf@>\8]hmC7iK>Ab46\r%Kf+r.$2(TE>=D?%Qa3=2IN<+sM"!olkXnnHq![4`Q*Cie$5!]6i]9:3=)YTKemZ/%e5l6Q(O!F%8.h[U@TL+enR1?/qM>,e$b,,:\r%WjaI(!6k3.GLu^/$a3uuba!&(8%&EC'jnD'+5'!T?=U8m]%UD#1aZlZ7Sh3P*U?ZV`)F71TSJoKL"KdV#t\1N\LL-6MFpq&J'K=H\r%Mb$n%=poi#.!pd7>DVfl@24-O/]@F^`+B@>&d9T7QRO=!^?5fiJtt!:P"ab#9^cekB/4T?0msG7:=5$D'I4t3)O'mD9Yn%:7s$h?\r%a(TgUl-\n6;A4r!0U'AYR=aXu'"V[?$&HnA,aBO!AgB!-OF]U9aKYZqdcMdAJu#OecFh20$BeG2iZ1J1*b+s]@W]VgH\gol1\BP%\r%mNJHOc!\#9[YHg`;+K+m?N_#tU5,,MKc"nX)e+o)Kc%o,e?-R:/]?!b9\Vp.ha39N$?Zk6I:\`#QR&jl$gs?@15rAi(dH%hH\go:\r%ZQ*/-%5F6qT\g^CEnI5+5+L`E_385jk@X#`,L+%Z:Z[q?K)K4WSt#,W)&XsJ6T>cXSqSQZA*9hUbX/G/AG2:)GVcUSDZV`Q_Lo=Z\r%ABo]5he$>1F)f"7M=%k,LU,_=[VfPE;QF-\?M\m80(O5<4*g[?ip^Ph=";Jl]Db%Q?/Uo=eY%V?H3Flc"+#5P'*nK"ot6-6[Qj!"\r%=Rd^Jg/?e!;<1Lm[!@9^5rUE9csB[arL$pJ:MA"V[?>0,bXsb%Z)<i61?W6c]n2[\kZ0.0NE&aX\>/&>K/RWZYK(g(s)Ho7`r4=8\r%]"?.$BSH2Pr@d;=fN3$9)/4kJ&KX:CXJS]Dm2ulK^sN2#9V'(WGJd?XMm<RQLjk]CDV2uXN+.pK6K5A;^O%t@nZ5'cQ$Z[r)QTDp\r%D-=QR%_?m0$Z*FdZj]"_l8?C$!(,i\rJmdO7/.hN(I3f%kD#-Kn'p:^P^sub!TCHj4)PcZrNa#7AB#,e!!pu9s8$4M5AIBnl18D)\r%3>Q<qMM4XK'al-P>)\VS@:+(b!+?(QHD;O)kYZQ6R:ZF1lE&9e9!*%4@=;&>'j?rffh)'W4ZDeXSsRbdeQV0cTdeTN=fnM66!`SU\r%>KO@iEik_Z>$_\d7(H>Z?F:R4(]W<>hf>ideQP!oT=A.LWn,lm-YBajH2=u,kbDe[&U5)n7NXdGO6DRNH'DT8:UVUb-q5;$"XYaX\r%Xll;5kbDe[;86H>X;@c/R)cJkLE6#UWE+DjSqAm%A4#9c5]8=XA1_RFOaDILT,mUm=R_?3J[42qPN3N%1\R'SYSNk7Udg`l#(q1<\r%!Ck_VS.WRM+-U4Y7[Q\$9!T!Qb[Z8sZ4J8)@tR&g=b%+HZ,%R!/\hY`fO0#[Qb*jlq>((77">m3&Z.UiPIhFhF&r]&_E9`DYo;eB\r%KR%AaR(!c;KR&R_qdT\d0TQYia[1q?Nt#^h^iMEN4>n&;/-HeuSk#=s$SfL\2OGc128U-kN^(B0(\XH6Yr=:gEWKCMCRFBsnAdY4\r%L6_Yfr^3mZd.l^a=-+o%qK$o(Yk1pcO2m:CP$st_I<fG5RJ\l__--Q]5Eu/+/2`P6)RPi=19lE9\6p2Ml6$6X<#l[b#?A5j5OW$l\r%"/29Ol;#ZI\,+#lW:':OGDiL5ht/+s]_(>>-I^/Yo%NY:?LZg4D0i`'(1MRRc,DL>H1r-=p!4/"jb6c.Co3O8n_Pa1I1P<X>o-P_\r%]*%T;fY$YK--Rp\MBZP"^Rj#G^Z]02F9saj[!--+2RN>;pMSW`-k8R?U4W`k6jR6gL`g.f$VN(34JX<$E,@<;J-a._#jODX@YeDc\r%KV5AQ//f]L'-ZRhmfu/^I1_(p)UuY:JhWfj!>18[#k$fG11dfs^Na&p9l^Og13Q@GEeJSNRVB0p^H]dTSLjhJLu9E1>NQOf3pkSL\r%-Jr.3'r:W-H>71SVbFR-e\Q=<ho(6^6)te!Pk[c@Dq0.aFd/u/NM(>d`N<;tUM0:7+cW<,gIgU(6M9Zp@PP9L?64**G.dQdbe\=S\r%ZZeO/Q6_[fC9b-\&JEe89eAp`YdKim/R=9'fNQLrQ:,1t0q2?[V%dc^0q2@,pIh`m`GB;Jl1?B.MqQUCA-,tng!nHJ3[8GmAlB)7\r%THe;*AlHn+0GS8:0q2@d*%WNR0rCr33+LoH6mbh?4E4OS,/'rZ]@O>g`)%f?Mk;&TA9o_7]Z^X5'p7A&_R+T+A"5i^f"ZA@15;di\r%lkLhC,1;ra&Nd[rdTqmdSmYc\g!kVc1=F`_2RQqbT9tKQgXK]#[j3o?#k(AT;[Xr?,&JoD;bN8[Cb96t.oou8g=/H%/DAZa2RW/t\r%OpG9Mg!g(0?_jgCChcPc%R,`KjeQO1XN/a`Xj"d^#A:Un3AI]g)Z<+g^]";ei\bZo4-9HY.)p\kQ,kkkh*h)d]:DL-0)$"3h#&fj\r%^gEi9[PWMa%,i;oITUiCT:_?%&_A_Sm0lb5bg6j78nF$;RFs.UA!q<nb`GFP$CQ?Trd?S[46U[3RLY!nGj\_ek8+-an=VhhEt#rI\r%)VYW-`39_FZ3Nj/+KWJ5l>ZFc%T^RY?Id-"lcaK@dIT)0f*jeo`C@i9B8)se=!N2A3kVMUnSa<!A%o].\#>ZbB>fgfKfLBoe]=A>\r%69(C\O37f3*kl/S5ICM`@A25m?N3Gf2)5ql5Qhg*NGQ"i$*?\*R.`kIOg-4Lc5qqC7`M>04^l90,NG].c%loF'b`M04nXg/SUtGt\r%1\qu\&pH+++.!T6=E,WCqO)Ld1W#F$(n[Qo6Y>sP*hJ&G8nR_U1B,%YKHqm#qMcYCFX9,;d>uHVX7;Qf`nKGoWCpkf@CV!:!aRj_\r%q"TQh!aRjDBDB^CDN``q=bf(mGmV)J=U4iGgk8t+XRd[F`>3X^ajs0H5Q$fGp;f:fBZ?r("u7%OZZiVYb<TKX+"Weq#V.449Ukba\r%7)E?]an]p*N4o_?HE&*7i#f02a,'a$)]CUK?-rKdXelb#"a"OkE(,O`I83M7??Vp,kqubVU6Bg_8:cXnP/X[_dO_r))#_eUaY/7m\r%ku)VSM'5Jc(Tus15!Og#Ts/;^aa>pN\=sABpSfti/0a^TIf8W"BsHLmL5CuOAq"Uq%D@nK<DcC2$>SWT2U%$#`[NHF%m0aYoSN**\r%UUC<jYYK(Nbt3?:5!es*-E^mrOEH`1;:sR-:6TVf'>(V&?kP4nqHj#R-6Y#H%p^KVlt$(W(A"<l<C]4LQAZH@OR\>J0F:nLk3r%/\r%g)()N4UIO*Bm6fOp3./?s2uZukND./\2dZ:h;LNsB^7->-<F5erSg++n.(;Jq+"Xjl&:EpA``1aNb=_f/]Ml2d8sE6R7')I7B`c=\r%FU;#Jr!YBKLko#2m]tpkFF0q_jusVH]"PS^=qoe!f>o,XC9;uRB;XGD3@0;r5>AW]hC<O0p7ROB^:cM;4X<s"^3tC?4Z]R9P>qC*\r%?d/GC^$nO)9\B9<]D5+Lr1gsn`d8MRjrXc+f0H9i9q^K's6/&@%5[KaXjAVid(83]Bn^/MH9fp^=Xu<:e0DOPEON9*Ia`CuV(<5)\r%.Zj6iN@FVtR<N..J[J_/V2UHg;u+&orEN_N1d$f@Ykb%u@\-.]oL=iulPNV,^"uPOo:q"\m//8p9O-Hp=9n4WU>PLVZ&1)c[d'MI\r%8>OcS5.4Ho)6>/'b"\YBm:TXsGGR!V]kq!4jJ*i\]kpuIG9t50@m=q`1&S9\cX`cUq[O"L"0r4aZ]9N!NaX\_-bM/P4d.ntli$&?\r%<_jnuI_?i:*^,]IoBY5;RGFjN?U"C65C,JAne:QZoCqXI.f.&Z"n^;mWcgk,l?q]2IUrn)RSu0V7>mf9$U++uXAc+tJE$GD*nh2[\r%pEnTaiHoA.Y((V8rS2]Nc5&.fUK%#2o%N>X+"*1S<7:WPD>n&&R&6G?XF;LZ7otD_Htn'2*V$o']l/_:"8$W8<T)`dBN3"Chtei1\r%E$IhX1^G]351!knqL^ujc67N(S>Vn-a<&:B952f,!Pp[YL^n#=$7VRAh<n"7RVcq+CnH@W7T'3DpB;`hMhWJn@pO1E=nL7gGMhWD\r%j:+lVr2(5OL+bO6Zc%sDJ.k)<'tl+b11p<gp*\'4%nP?lq!aLr&!K@)U3kSmLW%=l+;0C0<'W39Lt6'%"T]T?*g.?%+U$mmmIA.^\r%H.X\K@@eqXaofN1/J#u+IE1+s&'cSa*V=q]8ncI6?e\j#]X8m(*7=F3E4tX]^13.]7AJ%Xe:eohX3;c!Q(-0a)\3[N67g#:@c,VB\r%(X:s^l;Fg,]U.l*Mq`G^WF0T"_/jGloa8H6p!h]C4[1cecj/Hfb'J&<4mE7:`Q:VM:!J*.F_`(X,0M<Rmn>`Y,+SsS'sM6FbX]T\\r%V_?A2F3W7`c>W>Lr[$n-A$F:o>ZNqa>%-,$lh8`>EB;V3b"F%adrr40\']KBA7`.I90,mWqA\%6nr9/%-+bq`=Nqke1HLm4rW+DA\r%'7DeTP=Y5.(/54&/Yp`Spc<V1J)s;r+qXJqfZQP8o^cln($0'I#P/><@&jAm803iSoUX$dQ%r`1#rD@,"_P4CSN;8K;abl"bIZj0\r%'fRn\p,/`i%4$2"8M]mN+MhG.&?%!LS($mWS%W+R&Z*`,/"6u+'PV9&bfXOMGX,Hd*4)pgk$]Z1S($mWRuKF1daI9FVO%4aj?>3[\r%0t$YQ)tn9fnB,A@jH%KJ-T8A[Vene'+n85XS^P_A/r3i3iE]lSB.SF8OK^7Z>[;:i(Q?[8V\p<C$k)@-H%l"&i)HVYOE!S4YTS8,\r%L_ps#p`1.?JFC!UR[+<%UC%!l0bNGtSmapt4)0fag>,P?A)D8l*S9d]?)8G?oppf+akr0*gKLZQHcrp]XE#@?AO/1+=>+T@LQ;gh\r%L'>tGN-S[4^V<^hYP6f-5YX&rMDCOZq3bD[GGXX%r?QGVAt]GXYe.PRq1_ljlmV-ZY_R9Jf:'[X/YE:`NSZ?P(A=?(NNe\9hSjYV\r%0i_3"CA^kC>"Umo"^^EC35P&M[-#to?$Ue7N%a'?p!1l]g\,?@i4sP3^:M\"fUi@[(m>l*%Wo&&jbU+2dFfYmH;T]Oj)6jW+_5p%\r%Sb__SjX+29R:;2hDS@ud2^cpr:"W)KZTgW0QtuDJ)4m-03*UfJ49DeTh,rXP5MuZs#lb'c-tg6>m+qApf'DSFLHT,/#C=j#j%WW?\r%h-56de]uV.r#KZ7/8Z\;a6h':c7Wq0IrmKC7=BCm/S$V-%':'.c##.?q`(ahIDq2[=3PsRalColV7"&\_a7rL0H!U[W&rO1@+48C\r%dqbs2\1?r6-5BnMSMSB_@i+"V\"2-q<oF%lRmt;`JfQDmGFMrdgH4U]4=,,GI'J0ES3-e)piX*_(";$&A1E3^Aj%s6I0tTWVS*/7\r%)^9oMbMuApfiuH[5H2I6e)#[h153OZe)!DUKtuV=rcC'&_*qmQ@<s+'0$E+7XNq`#E4Osn<;%*!\-q9;HOR'Ep6OR$jo#5a)I,#a\r%/at<I%'D+gFf\82\J*\$L9:qB\@fR*]tFRjT2:38?XefpTa3%=k]k9H)5?H6^oAci\,P.S9:3D(lPG[`B%'@7?N5/X]k+(gj0@l@\r%m4F]*LsN(K[C=B5Sp7>_;L?T%Ar4L,-agG-CdL6b4Ti6K01$9NGY&D&EscR1PEP5(^=Tk$XY_3#*a#!'=nSSdH:_^WeWZ0]JTN0E\r%J/LSVSYT:0"jD40!oD#g'3_4-/>QSi&mD+,/G.e388,EWL9DWAVq2F!-/E0HT<2Ju8s`SeY8b%@`D5`>irn0kkW^WdA#spY2#Fu@\r%*,(Dfc(")lYC"o.qUI)B\sL[Xb%-&%YrtMTfNY7taC#h0Yn,.%+kuWKACu6O3aY2n10>on*Z;:O2U-Z&R]sa#K>k26<@qh2)oPd8\r%V5K-uN7DA`^M5Jc>RWD6;q5>+SG@cY_uo:>Z#'m.mVp8*rPF2!(p;PdApQg/-o(E:T):_)S1X)U-%C,]Yp-P^/;TMb5>B\Lhn:jE\r%i<jWU__?OTT`m`)#H'*)4?ardnZV4J-<equUE0$gUBkMY3VY&F6-=E^muLVn^c-&T/7jJd14O32QEr$gE^q0XCunIiD&u3`C`5!K\r%&3V5$82o4FQU/)Q@F<3MMr.ceOtr_b"gq5':hDu?@^j'eVm]9]ekDl,ZX;oV`imgYH\3K46Y9%&F+de9>q5(6Zes#g(1\/<H:U9b\r%krjDtqc3EL6_nF^dHX:TaoF"EUApXQeWT3HaY:pgl3rac/"!8K6Lk'i@"L*6Gl/<#<WmS73F,EHmi/-%(f&i*6P]Ss(&r:Gi7]U<\r%5GZCc_\IgE(^mLMcR8uro6eS%4eiB[<E?&u(PCnb.0'fWL@.Z$QN`=8;BO;)*"otqfj?p_@AaOa>00F5.rQ('Zs^Bld#UQZ:WnmY\r%EC`5?r_)`?Ud6jsFraW'(URco&Z3XBd+EN3&2VVe)n5/n[i)Z=8>]VSUrC`4'RW$hc`9#dOFe"L$J^N6""F#LWt;TsqDc+FVs_XJ\r%P:Z"E:YY+cbWOFHT=.,Q0j8_/S4GiYBn>QpY;R;jag$c![lq^XJ[NlX,p&kt8;j5FD]d'6qVq2(?QcZ6kWf,3qH[PG7jh6)CSUrX\r%s"bE6m(0r<H@Ei\J[Nmgbcs,gE7#tc0>$G*UYW?*A"/s<mRhrIdA0M]>B0:"cQ4?9o5ceLbSbXX`R06K*4l"EMPC9u3*9C*.uk+P\r%VH-n:O5f@g1X>X3#`>Ch^Xa;XbrBg[`(HL>k+7U*-SWH(,P]tc9J/0$)+WK_i\KQDMrEG.$&t-PYSieL^Se>HQ(DP)F4<_:E*Ou.\r%a:['WMld#-]Va9H*#6/oN9g)[2'jc>G,Ask%Nq$PaDq'$YSnlMU>M?uKp!kqdCm!geXM;G$mrN_l`35)B'M5%SpJVC@)u2`a^c<2\r%,T(QdA>V(OqjN<*.aLLA%02\\=&$/k;3*`KFObRA:`atTOtfl]M(KU_Dr`?m"]qqJZ"+:;,KGpJ<8pN5dm9LZE-XkuY&*YSV7`N8\r%=89HN7p]&L.nMY[e^[$T7UFJFB?!Om!0e'>YGdg-q!,n^<s4nPs(K/LZ?+P1fe;KB:6N[K.WOQf@?0g:KSq?NcT?urMM^nS<#Ug#\r%7fj/,LKVZ:E@&^]jV=&jJo!<*=iYK$2:\!="Q^fKHtFCo1@H2ck(2MAQ7GRenj'6>0!gSsil[ig*q,b/3*fB:b,r[qA1Z)Sj]XDD\r%GGXU4U9@9%BoJ,-IMgC@i<Mui^aABN'(A"kf6WnL6-JlpW[WSNeefsJ<Bp<ahGs(*DZoVnU5g']#all_kWFp<X];1N]%p@uSqjQQ\r%mid#H2R(!%RO3@M2R&.Q=SOadk'>lB%0*=\&'mV+afE/,LA/+(_SKOBEp)Vbe6O)cV+\u>J!B#,pFA2$^V,sdG:T<Y8SoeSq749;\r%XB%.%gWIiZj1rk++GP>A%5bs"==iY@eNb?);I`!WW!411l=,(81"2H3**&Ep,;Y`o"KK[72\i44O;=<,Be3/M?9X\,[Kl80Fpbi7\r%"<13Xlf*uc-A@Uq]jH^cc*R0AipsVOX"R;(@1`_@0M$r[n#hH!E68Cnirbl,mdnMMXq(Ze_e]j%lX^u>n(3d?Lp#X\7QGKR"gf$n\r%.'<D<\]Vh>8Mg+*;&ZYDqf@*9%ROTFHUNUuBUL=q28K6lGtTK+I3?%+Ou]9&"2XZ3j@L0!4qLs@U\?>W?1.lu5JTb?5H_u6crk6F\r%e8Fqu_I^p2+]6)9j3+V:DI@Z!1*3Gd7J(p"+J[7"@h6RY@4:[E8%I=00;>XJ776O@lOS(\3m6_8a1pTj'[R4pP)M4g\tHr,;M/9V\r%.HbL=LL-0#0M]'6ro`N)ZYO0c?c%tBC-c-MG\H:/?;=L.5>9FB\hhRfci6l6lWZNJWm;cU0O)&GT#CNNr;-)3a-1"ScbRRcU0ipT\r%9.%$3HL\Grd^*km>4QC5Y$OjMlfn8_:JP[XY+Xt6::1Ar#S;?j)E;p'l$,p4^`oFGZI.jfcuY.,a[VJ(42c?6hCqC=_5F3h>IouL\r%K25:Z#LX29#G3%N@d&5D9F)pJ?g#>REU`3I+Zd;fNe:,g$'AbE%Xsib'8#g/PT5's9F/3[8N?LkD^A"LLl6j<an-R#HHd3^4W)2T\r%VoOI`1IfX*VoOJScS8<-rjh-,d:#A#h,,X3I[V/g!kUV&*.7TGD:h^]jkto'6I'"LIkuJ(8.[+9P/U-Bg7.a2oUqSn6sF)oX"S9E\r%dFKMga<kXWdC.>*qd[Js+d,@EM8=j9![eXulO<JpBfYt\EXbf1;f_Bl.JV8T(2ogsL4W3n(493J.JW["7`iKEVr5J<<=EV*,mE20\r%o.c,T:J\es>)\o&:[ab2jtB=:5.t`d^<+kEI!XC<f9LG6!VEO_]C2#DK-*@p+"qb3H7pYJDLQ<'Oo);a@gn0`ceY@=EpIa$4)*ci\r%N`M'jlJYY<Ccs_sBT[CNAT6$Ic.1*cHY`)>khd<A1$bK,/J_Lq9jS'aIA,mdBKPl,;@(NP#As)/640D2l_%lDm@dFmg2(_R7%G_&\r%/A]&sW:OPl-(M)tH(L1#Ughne7)U^#,7q2EbZsF&+D)pf\^ZU(bQ?sbV:=o-f5Kgs$HaLg0Dci_k5kEbL`3Epf.8X<bi]MB2a&6>\r%IWm][D[\K*C]2F-6$IK?CW7X$4$2N6iXs&aRGKOYMi$1&.@qLAl;%.LO^a:i,G^*D`OVg%Bgi&?R#4g?5ZLZ(ail.HJrPPQ*Hi^R\r%f"\9'0%(h:'35fT(."IR!ieMD,Wd5&*!%,UL,4OJ`+Vr1<>=Z('6m&b]pUj?rBl!V!hHTUb+Q#pC;&]ZIdE;YZ2$S5F($*P$@ccI\r%Hh+CU!ah%T[a#?K-O['<YUGq`Rr+Z"8H&.FJDm]4WDdXN/;;])$;&HEdEsC6OSp;YVc5Am"YF)9T=+b,4hNM%Hg"(VU,3m"'n):Z\r%iq)YUW*W4OG:A,jDX<W=#`*#,*RF=a?<.AtE<m+%R@%>[1(3+\k08/58RW]1PVT[i1#BMRUl9.rX:s<EPqbP]p?@,VqUK3hmY-;!\r%0^ll4b(=iDhm<^5X9im=paC042l50EI8P(G68gK*FV,XpcHJL*:t<^58nH@lTrjT:Z!D;<`eEE3X_0CXU0>\*T@UEG2HUK8@UEJl\r%QrPod'ti.bR>"c=WaE5onSd:mQ#p;;Ro_7<ciY$]cRMrhB?8jf>k<T0jr)L/GlMq]]rW8m6Xrko:#0ENkeXll]qPSbJ`#]B2fi=U\r%q6N6NM!j<fO_e-(\jP.'`sUZVk<1CWfe070D/Y#4%^h>NXh<2KrkhrGm8is>#U7s[M8os7;an!_r+)g(2H;"A]u@YQo<!Z>R$cr"\r%HCuO)`$>RSP2XM)M+P.<a,Tupm]]Vc?Q\TmA)JDP:3t0)]!O6(Cj":O620uXHI;Q!\i[\hU?M'[TP&<>Yb@WJk"p]+S:3T.q9$7;\r%PI3MoYQ0*l33\R@FsD"!7Gp@6k(]^:`nk9jA=c.5GMeCShjt_^-5/;VYRH&TpIk,aLcq:NGuFT^dVrKJP0uG[%3"4E:@jEum(H,!\r%rKn6?OrRR56T4K)qbHY[f[OgX3:W\TG^ZW$3)4ilKJJd'ioBd(hT6Kf/RGWZ(%f@*71[8Qq_]XR(Ah@*-:i;e-mpCDS2cS^ET#sa\r%lmg@WkL7c>9?d:*,d[;#fgRun:Tp*-a+k?B`-3.kje#KRoFa40aj8QZD6EN:_`A;a>Es8*Zb8O2!T7^W"b8Cg@:oD"@0\Rte*5rB\r%q+#DDC@oCb3h`*^3hQBj0+i]s=lqgp)%jE=h*2f#QXI@R:f&eL+!"JOB@0?OBW-)l>9sf2$?3j>I0X)V"f't)9u4Y[r-p`s^V>d0\r%(n=46^B#K;Vg!<aXeXVm-m^JJ3dAXBG?6<uE<XXTKd3b$bltMU5#bs"]nR"To:<W<0<:[V)Z!bYX=LIaXAa5hHG/Vs[VmP8$hINu\r%E<^bp"!j-ApWs.:k$]+AWFV6g*;VnF-Fq1SEZH>.jo"uF;8]oITX`LnkL[GU6hV`S&'5Ob3ZE_"kg%SEPJ'\`64Y>ECF/003"hlj\r%S0f?kn6SH@X4fq@m@t1V9$s)cV+pR0hBc?p>J6s6g=(K\4\/=cXJMe86jL0jXEOYd$_!!lZ!QU2<i%1g=!qf4<0RQ-QlFnNem-tl\r%G\,WS*9k'^r[mWD6NU<N@,ZN7cY4l2MnA,sn(LKK4a"-dQi$+Dr[`3[Oa:j3^*Z#e\QcukI^V_QP(k$ZFO/&M,gL)\>q[#A3W?].\r%1i%,F4o&'(f#5f%Z=^J]B2.<C3MoNBMb"u@8%m>E*U7:;VarYHDtdU_5OWp5O8hoCKLmukG-QaTQDq[n3p>H646XH@G)Z6\_Ug^B\r%_m>!@ls0gmDEttUS3S6g5LDP7fdA;ek:5gi't23k(<)Vdr\l=@TXbE#Cb2GXeCKH>l>rAp#bS/JpO:%k`Qnt/A4?8u"f>u0?"nb@\r%X^e")o9lZcT<$?1aPi<t3<J:ZXrDN;I#rB=\mOYO7Bp``8P#P?U3O5,IL;.;^bs?!O2L_37959YGd"b6>E\2Bd=5^GSHZ?RT?/9-\r%7I`-'-gCu='ZF[RnO=9q.;C`Gq:KOt]reNkD'$"mpUp+,gH=A<oRmh--5t.mG1mMN9)mq[NKhCk(h"ppR0Oa61C@[$5%b:tLfC%#\r%X(WF8An_*.RV-UL`oHC;Jl==?HE(DnV)C340\&hh]SulpHL\=?KHlebc5XH[#$9Q0Y#P%J)YA63kbirra+L#^1D;a&iKkI%9fb*q\r%dG*Pn'.%HOocDH4OW&[:haZ)!VOJLZQ&Y^?rO%T^#c9XWGrM01ff/%=G^']<emhBFnFJGOY95e0Y!4MkPMkC<;3L`#_8C?PYYO>C\r%":rh0)qbAV,^=PD*3MJd,^=PD4Ijk>>N0o2*e*SLQZsR&kL][N6/m.mSg4]+GTMD`9m6i]8qMi]^s.'LCD&`l#;1!gJqpsin4\!O\r%_0+HIFV6f!#9K%RO/_RF[%4^=8Z0!)VOIc;_'=`dVR.A>"o5/[5A^W=&U`,7kd7HgLb^sYI+96_L6jhe=kC_WeX`>@e!hY/W]NF^\r%LRr"GeX`>@_i>Ie,^?gVkb0rR:4gO\`+bCmiVoLD`0lhIiA6UDprWNGD&.S@e.HEjaYZTY^\m0mH%,>OmqO`Ol`JYgCeUei(87'B\r%((rWLDK.2o"sTh7&eBgm"[iQ`<\,N%*tW^tHfNGU($GN.m5s\#Ij_Jga8+b.WuceZ,hr&6rjU&+q:6cu%d2Bf:3JY$SBjN4q5i4a\r%2h.uPgK^@M%e.5!oY.bP%l9!,$M(K?;X;<h;R,+pDRWF3N6KFnX^(:qIpJB5D4.NZdP@E0/\GEI-9ETgj1TPK3W5qKCu(?I_dDYH\r%(NK7e%H#D)3Hg%ha^8&eZM%qY'4"=@0!]q1Qmjc^)*\Mh<jkmT4"R/2MmE_reDS*[6Q*KH(,:8pemm)CSS9\;p0sJ(n4fdad3;7@\r%(n'pS,MW,N2F?tVUD#2@s(plCCk?kB\t)I#-HYpjfX0AthQ3NCdoRp+Z`F*7:C.PY6qp527.Kuu4^S0HhZX+G[sqeD3):GIV@"/5\r%SE9pk"3-KD1L_?QYG@*o;i*gQo^(fS=$M!h;8ehO?u.^]HGar!=m]7.G4CraDtL2rI9Tc+hQ!UZf2RWd(m!"t>-%FFbIE\KT+nDm\r%4PZa$2tXZTaWe`Z=8u1r+Rm_$RB(!+/UCKlY,8Mf*OYK>)L.L*SpG"#,86`4X^jS97,5M*0<[oOI9o[q2eR=@I>?*+J8C1"s00(]\r%XqY;TnNnTBh[DDEq"RuO0iT'GK[1:+?'mE9K&u2WO-\Lh-$:q^Z3SL^!oBS:U?Q*:@p_dg^Q$c=,J2rlSiNt^_\)kD5gS!(_pJ`1\r%F9NM*cj5Lc:T]7Ek2%TKgpV6!fDB]%OR3dJrr,8*SaW1FXa[L`&[Mu^cW]oIT*7^1oF;.%iNjsDe%F\'9G&g&I(#S\/"TkJ'[[3/\r%V[jKO4[pZ0-'?Hs:D2@:[8"7FPYWALIThI_Ju6*NJP$N6TR?T$FgjEA&N"=s8DZI=C9aF$:d3,[OrW<ab,9Lh4i]l.62C/(g@%Z6\r%7Sl9sTLP4plsLg1("!m,D$8tL#E%r9kUILG%s6j*'seG#8j<J9K(A.."ck=<&QDHMLpmt\WXmSiC@(2k&36\&Ym?!m.S;HLeIlJ*\r%U&.80eC^3g&dgM9%pkX8&.1;7HbM2-.MQXaifJs:<&C4$_P"pDLZ7Q?O\fQf<a"9U@rK4Z%+H+u=_Mq$(2Aef-^/Nt$u1`^LVCl>\r%TuPa-1+6ded7p8aKgLd(Q%bha,,*$OZ%i3LO\fQcIi.Sm)q6jG$FEg'I,c\Q8Id9RV/j;eI4oA!7d5<J<IpT[(Tbn`\F0TJitTd?\r%bUQG%2hs@Y-HUgMTH"+Q;Fs/cTH(!tNVg\u%$Y6:W25ZSb<S'gJNEL5\197;J(agZ^B2U9QZ!W$.St)b"0F1n<M6Q((Jk;c,0_iJ\r%#"h_rHDuQNQgemRIi0ZT.StAMEPmb=C)VpVDBs0YMW\AmiC3lMW"Mn]80D`e;LEl^N1OtjXN0>[)9JpEof'0p)(<NT:mgMV-j/Qj\r%;5e]kL!)1D.T#SO&"VTHl?5VnPru'3iLB0^"9%n$Q[s1Y!rY@W^3_MU-!^<SEY0]#&J1*R^%Wj3YV$[0hWt,io1jV!KLmq%B7K*G\r%J+dgJ[5;R>jF-0)C=<<J5%.IqMU%Sp)(<BP:r"_BAY9I45\6dL#7HnL".2HF4MrXF]^h905T*UR@OBK\"jE54%&SsE(9k43.h?,G\r%>"fPF5ObSa:dXLgKT^ItRt=%lHf(c91_1k#S3l7n7e90FBaGr)1`AN6eibj3@E;^VV<1-WFA)),PJ:Vj`6MUheRM,=8Hnd[iO%mr\r%,5c.opY7;!OnQapngs3!XU+BD<NjJ;XZ4Ks#i\9q:ad^U<R`%Y7C==_KE7G%?EKU/rI3$0SQu/1@AYPL_Ju04OSTJ[J`H73dPI%j\r%_PG_k05C>ul&n]7@+$U@WLQ%b&1n)1=_*(7Q:i"P/S5VIlB4RqXTBH`,.bgHLbuJ0(6,:3ITfU=aZo\P$sHMuaZk#O#)2VjTWJ"/\r%r3i=Z9,9OZ9e2*B-OOaUB$cFpN7/NVR."&i2.#M9S^`LJ<Z!0c.*d$!a/B`l\J#.kr(L9kLn,s#:pc/X3]QF?[*@6I:=sb[Aa"E5\r%l:3j^VsQuW/0L)%qaHlb6X?s:r0d3pb[ELUl$*Ogju/Sobb1$^Zk+?IW,-`1#PaF0#'3V6162)LbX$g&E2&A00ZW^J%4\^A\RLE<\r%d&4A]k.&&AKT`g^\K8s\&^-l@=$OM@'X8X&#MrfA#=U0KjH0-Fk+IOlE&!@Lkd4<Po_\i5:rICYbNF),j`$@.:Yf`q(s='MkPGVK\r%TSV\0J#1J!%Z4?uFg^iRb[HOn3#C03f58\=8pse;#j.e9jj5luSqB%TlUc19\qh[Z;_Z8&F6oVk/L,,aJ3u!q"e<CM?M5\+(-$q1\r%`G[F8"n-*G<FAf_@*papc,H9,3@M7n1<\].R"I`K\6P`MU>npGh09ImT[5IZ]@NR+3NQE(_,e2s,_R+.?Y8f16BElpBk@YSL7t*6\r%;\6)rDWKkI8-^>2)UW?_nn"%Un*=lB<FZn<gnsEe/X8/AQ\AbS0uE.p]qCMJ(F>%^O(]bO]\Ui`iJb2!=l8H`c@SMq8q<OU%VJ'P\r%a!dLr=jZ@j3T$=!nUD`C^O3^:8@gs[Bc/aMbL>j&,HpOamEtO"jkC$,D@a:QC;.A[\p\,8XM/_qETt+Q4j2rYirZ[CHR8tLa+[TD\r%c^>b@Nf0"?_==l`Q\H=cR2iTT=&TTm&*C#-br1]:is@XUo3cplohf7?LrG/lTd!g,*A]^!UJ]c>%U+0OD)1[Ja[&!RUJLEBa^LjO\r%,+%1k[R6.X,4M&C5tc-IMSOQc#;*Ws6k.+Kb*8Cd!XrhnqN8I(EmW6=S?GTr>'`i`m@bi94ORH&hNEoWnjm[JXQT`%"[g5cc*XZ@\r%V0lRKO/n`kDgQ/`oE;@&JLed<#nst7pm^nXMR7_51Ia:pU-W^=JlG3o*Hq'tA=tPj3HA1=nZmAr7d+tZWP]I2<rkt%SK8QL>2o>g\r%T;1JMLdr^2%t+dRW;PamWL^bmIPccPT>OAZ50F9&k@P+"Gh@%<lD2?D<8NqQ_Fd@"U%5YIQ/%Y54B,Y%k$InVbo&oa"#T?CB>?0Y\r%%F>gfcdd$GZ\;&lE9A'U'sg>2.V%SL6-L3T.4`/'N(&Z/?lih*+Qe?]MT=<9VdOV"=J8?HYn#-;ad-@VYM$LVm$5prE4Xo=.mNAe\r%:/20];P_)IH$?WKh?&m(K1!gEPQ@^t_X7"s/#Eip1@EjJI9!lOMeX(G\QS';rVbsGX&?ZL<T=<ta]lA;:!\ipU2W:6?K$+iqPm;T\r%kmo\b(N3lR7>?DOqhl9A)c%LAoFKk-S2B^'^I'cm9PC$;pn`6%]0T-*dNfhVTN@bG0W@)RN=7f^XV\6Pdc[dM*c,UJI+3CeM674f\r%/)?cA>6"RAd)I$9[%S5R+Y\.&_(1uMSA<-Pi^%\p!Z9R^CW"EE=spa+en^o.3A?;BSNe!QR2co%6N!;kg3u1qEmQ.RE'/j5LD$Z?\r%-Z[#jkd!mB2Or9q*uuN7"Ttkr`\7e1,bI>[@c$15D!*I(=b"!ZaZIkDJ6DHcmfmHNM*;(8T^V*WV9t'Q>\gN.M[6YhL#!gkAt_<>\r%0@6GD=cgroh(PW1h.E.u1./F#aa:8+b[;.:&"8FH(&X&eKZ%%!7Yf_T%R43W5.nXlNEqF9OBt7Eb"fF.&690cgJ1=rHdgL)W_bqg\r%AM%Q:/`_-g]pIJ?GP'U3c9e<i,3a@A.8F$%k^8ur&Z-MT(6]=([aCNCaas^Qj.(dYSpea46pF8!n5RhI+o4bs7.3b2/4BH*qaa%Y\r%gf(N%6M-Ip#\dIa=bp5o@QK`9W:!"e6C0S:;-'Y"A)[R[70V09d/F]WM+d.JB5QX39L;/A(hFJWTAU/1)i>KG0tTt>G5D_=#pBR"\r%H>iRq0D)PIOgOSNVO_tT8#-USi-:<&*'1a*84S?2dX+/%D)rkOWq^IQ?CHl[dfkYONjtj^$SmNkVbQ(5*6p;2jrBPW4C.*(WLu@Z\r%0Yo@f^$nU9Ss^_$\;),6O;33Y1@X.=#YDb;0=9'?]66oM%-.3rP2Z1dUFrL/o;V<Pr_pr71qLpcf'I(l/[*kZ'N8=GM9e2RCXd4=\r%e1l\ake40NYKUYN2/3E_Yh:C!TNgYi>F:2P8b+L=N0hh6okOoHet0%EBcsFZTgpCF2\,B7Ru:'PWkE.?X;*sQ(!p1E7B!?WaJ]`g\r%c:mtSJT=k8FTpsm6LW(a]?Pa"pA)3M2NIgU!stf,bi`WjpSD4]KIi?<GaM2gghkVqlOQ:5]4dQQ(5+nl;_U^Kc::jgPpI%J7Uj/4\r%/6;2g/(qi=FbGlMG;C[G)NMM.-__Ps.)qEG*?F[#Y"ukr&<np:$WejF>=)eFejf\D\)YDb,td)?BaBRmEn1T=At`m2MTeg'^gct%\r%%<_WSSK9\qk;G@gLP);\oH7Zh3ES\-[ioj;G94A]a(Yln&"_(S9jXSW'0]BZ:R<nBa[d1)WKNs2\o>JD6;^i`]f[F$2mg]qN&#b&\r%66`VJ2JOYQS_[Ls>Eu*DTlG?^hg[<*>D(Su6'q$MYSK1T\r6:1on/UX(W>S"YQU-LFnhnp(qE[koC0,LakgsOO5+krk7THFTqPGX\r%NO*jeK\]L@cZ9%k=ci4#6T0*?bTsdf=a"TDd^7SVg:>RFaeWS&g!6E>*<g9BJtuE_4j2,o0$oZakZN);F-0]cm-S%;gQk.OZ85<H\r%Gb7RRZEp)pc6Dc8Zg;MkK%6#Qca([<okTZDj39oL/ES1p^;87;MD<m^,Ltk8i3lS3R@K+IaR,Zr7<G/YLf9eUjX%FX7"hW\F"1Y,\r%=QKG=0%);[R%<X]GEG]<HG;/R?*&)*goDZPlej[q0&$kRca\md]!Q:PV>?^Yl5[Q$Z:WhrRt.TQFiCa0]kUJF&(j)CSoGPQFb,.#\r%/abs(CCQ9pUT9h_SZZee`P^RC$#ML^>*GB6/jhJ/OEt0VQ@T=a^`G$e&9.]oQ[kC0<!\0,H!8ul;BE^CW2r@ukrNPiA[@V\<QZ^4\r%+=Rh@O-N^lkk0aBjl,HJ)3g4@hCseY^Xgg4SsCgG1Rs_cEj@FC1dd$=G_TpeMorr,Y+@u?7=.S+4@IMR&+(OBnkaeM(po(#hlF5M\r%H8"m,daJADZ<P;A:2\MF%J?5tHGuS)]ckG.<?,2?7iK(73K#".:D_6@/:*VQ4^I8qThR.EIID#E[Crt*C/:1^>Gs`NIX@AdoSNJ/\r%=a$)cb5*jm4j2-B/rk//ZWsS%h:#So#'S<UbKf_q3$;>q/3D0BCAOIXSn4JLOrBHr`e"Hc]95J+Z85Q-pV6Ll=a&qb'P,#g[?.5>\r%QJA'^4C'oiKL*qiZd]OnI0MjXcCQYKpD@)t8ucLkjU')YKq<]>4j2,K6Zi"WL^bNiVB@.]_M0SWWn,5RUA%ErMr\9':Mi%$h(QN]\r%S6NJP4u7:#"&LnS$t%?@<H0MtJJgHN0&ruPn%3%S=i'ZTW<HO)V-Hs-TUKM)0m;.)7W@Ll@#c.g^h211Y4(i.%^JEC7+1VPo<S"E\r%,[');HI.Wfd_iJN2C@,(_faLq,,JTUG0b>0%sRQD'R:*gK^SK0!]c-NNP9?HNqPS9/5sUsYo^nl`A3.K&DtV/.[DMoKh<GZb:H]'\r%Z9lOFn#'VtPnec:Kd-',"\DRiEYdNcQ"^ted(mAo.:fP/jF"?cdjb^`?$VT<o@U3>X!e*/_0`dLD3\2LlG:_AjQT\@S*IgQG3ZoW\r%^sn"&gZO&]4U?*+AoLKtU&>3Wm/Co`\R8M1ACjTuTq@Q*qE.*)%k`>u+#(7%=G90b+[mmp"(eIk9Cg`<9UePNmjNKr=/O4e6n=5R\r%4?JE_65f6=D-+0j,IE\]WNKkU[9h&J#`iBU5C"0"+"%e.WAnkVT&>kaE!8%IDatEnqr*[][5^TeXCGf&*`pHt^nrP"dL7.X<MKd`\r%?6.b#E`QFfIBc]_P'h`9Jq@OOB8<S$*0GoT0R?.qGG<GS:YYNRZ\Y]/j4*,^<>Q]5&L/h#\B:b[o53-c`Dr!f_9B,pMlT)HD8,0)\r%L+R^V"Z&A!_j2mWicmQ&<XR)acQi(SVZNu/b8+?VR@f1AX5khXj*:<DlgEk[*:H(0h,^*p,hC+Lf[i`!O:"9hmF1;f67Q[6F+I>I\r%[DN]S%pXOo-jW&5O1ZgoV,slFI/r`j7/>5m5$P'%UlWtB@n6C2$H&U;b'EQbiYSdm<=V/lLGro3A(+E=%&oKb+5]dmcD6NQ/-:$k\r%&*V#91fa?B3FbPTkkUPDR];lL++8@_9>ZA6XoW_Q'5e_b>r>W-,(8s-hfHX;]H"9;j\<81W41J^feAVCOR%0CI4$#d^j2+dj\+NG\r%r94oQQ?WtlQ)&A-AVE#5KC5uJKMoeK[i3a=Dd**/Z/c'T`[<iBqEP@/4No*s3$Odd\U?)p`)cQFBaL"(^Y&C%2ta[\X/9g-DUZmn\r%&ld*$U6S:+LEW+C(g;d3PA"GQ@V@(9p+;Uhp/5%M5!Me/nbL2=`CbduWXdi]Cog#1=#tLlZ*=r#3SC)FMN*l,Osnsl'bXF'G`PtG\r%Q'DVN8e0ZRCog#En(\Ak`_%LP(\ZZ]Cog#En(\Ak`_*''q!>ScfN<u<G?!g]]%#a<N(-kqbtt38%:_=2Rq='m]qSi&Tnj1?6T:7?\r%)%)qaaj5Nb-3e]LVf!n@9[%u>$/@TUK2Vdk\tRb11$JSq_6E$eM;`^BDC@D:bRu2HLl(Z_(N\C@V0(>CG!iNC@N\B<l\8;Z@0c,"\r%,91Or`>D*)E#(6lLi//rftNrb.]-7BaS($Zc>fL.Ki3C:O%BeIV]R3>(B.u#f%V)nS.N!1X+a_.Kq^UPW>(6MM7$04Xj)IM3g7#)\r%PX8NAMiG,@$qm;T/l#k-<1I5CPer@3??8$$:i_F?Yni4*.25roltW5QV,5^'6G8`]RWNSbf-+;9FZ#YCCW6&"@gZ>RnL?4HI,g&8\r%O0KhNqP^10E2smH(pX+<0"9hYH[]/<f6JI5.77!K+5jD7;7=;`8XaXcJu6[dfDYDcZIUrai6i_%i:!!3%b,=J:?s3';'oCjAc*GF\r%PWP3bW=VC(`SGjS3)#4soo)5\!Mi\]??F#R\:u6@3FI5@Q?-8/q0QpL/`XmTQ7TgOaW\LH*WC-Mp1!b>?KobO5J(*=Q!<[H=q3R^\r%rc?9'f5\j\E]JtCb:OgK.6oC'mCC@k?Qa,XWT>u4r!pr3Q<WdI>->UjWQ?W!DRjh'3L\!UjHbEu[q_sdUIq8"<kBqG.Z7IhUOLFJ\r%g<Fo]=P2m2W-375\j889jHcRiRLY?XigbLC7][63,^"\JU?-VX\`M,0:eh>dT3La-.Tpjc!O573#IcX/#jjM2BF:J]>DZ%qPC]u2\r%BXMB6>Ac!m?!M!+<a"=jjj'rjs/4:erD(Yie.;sQdeuSl))410cK(A*HL!QZ*)u?`<DqQgD&c"3e7561:Z"#g[f#oWe@&`Q8$qe"\r%+h0*m^<UpVX2OPRNZpB1,0[_Ue\.)EDh^)#7_1OAT*S^=`k"*llHRs9`('Jj;S@'4Lo5,X$*c8jnQRmc>AkcRa^"B\'Q3"b6clo]\r%*_Hq547K-Ug?:ZB]VQq=0oF8/XlMpZ9@m?'NR"l7?1P/+n*%D).9pNrs'[W#/=,'*X'=cY^P9^.+)H?q*]!.7=.2V;a7472cgl]d\r%jlblm(V%j1jl`1A@!<0=nhR%TH6^,Ec\i*k/Tdim!m!Jt8fdsMDNn1[V!atLl[]$kRNukPJF%2%JHlM&5R5K68BM^0aa$L;MPP%h\r%RCU'f-pY5:Kp`Mq>L\YE"(^5C?fqt`4@cA,5EcXAgH48LpR,!Y/QDDKjXY8AV\Pnl9odT>WPiYYf[ZZn)AV#KTZ'$"N*#/B/%AIa\r%+dnr8&7I*[T-+:=,7nr?.N.ln3?BQ"Wg@F4d$2\:MUIQeqBq64EH\Xp-Is6ldq"cP<$Sg/*r?]D;LL]-7I]SBUo)9#N^u2PW!?$b\r%)1a+j;enjk9T"f']#+,QFG)o![U;alEE8eb&=SQa&nQX@AE`<JM)#]<QG/h(cMb8=5R#Cj%t]Jk31b76`4q$UpC1&ZBb:;uL++d$\r%&>V.=s.[Pk-4b]m"p'QtD"Ac?Bb1tLggqN0.1JU`%5?"Y5VJ8uKZ/-=N"s5g.I3b'po\F42iN/d*7)2jMWDCd8k;UEe:-CaWqjD/\r%o7*b%_53UP0)g0sq7'=<8.B[@ob6DeK:A;Qj*7HG^,hqThBg.od<phUesZk)MT!`PZO-KNQ]Nf3EW`JuL30*;`li4G]m2Do>cPkb\r%8`0YR1+UU-qN4.'`02P<OFEuM4[mis&V^*Q$u9#]8jQdlNVO46ok\6ok1/pl0[E3mMbKVF1s/g0'`&M^V,=BFUX0nM<Z8C$kLJ.3\r%?Li64.?-*!*fteVSN#YRN?h[CT9m^h].T(`jmtf_1A9Qmau^O`8M:Fn9DK8_dL0ATSh+3p_X*KYU7f/`%L>SQCX5=K\@6_)%9)]k\r%U>/tc@!C+;?^,nq(V%j5qk>:LX_iBBf?,_,VF*(MZ$=*_;"R2EApO+d0=,$0F>.kRY<>O9VG"X]QL.Rt8WJ2M9[a5m[<O,^,^+R%\r%ohk6mn`"dtP?/n)bC[jZNQ#Z;#*^.kbi*,QHbKabs,SoZQ<Lq3[X(O#So9N'A+XMGnM9m%mGmnf>J0#r^a3uI^*s^!nN"YWq6kOi\r%8`38$p3^)W.+0#(8%un7^loU7QF["b*,V!%?.`K[/PZZ-K>p^]Z9u*0HQ5g!Noqp/&)PBLZ9pibHg',n,0&C^3eT?J!+O/(U-js=\r%QQ:A_gS8Rtn4?i8)r5:gq+i`09L[!qj?[@tRCe'!rh-R@Fm_lqnWa3u1=s&eFWLo7b?PQZ:p=%E=lqbh"mY`QZHRIZMW9?11<80M\r%?K\Ijp<>&04Jp4-%pa6X#H#0BT3::]cJ4]/=SYbUE9=<2l3f)b*)1&>RqcknS#RltR=TDU%s:m:8++N>\mWN`C$NORe3JCbfl1$V\r%NU6LsGL'RRR9sC+K&a!n?^phtg_G(7"#Zl_#ckB53'^UGg_F"V2>/LZmY^&<2nIFY=)&tL"-d3?aGX(9Z^d+o,B#].^AXIsQKTn<\r%.11(Gc%;gS+[!ch<u__g_3/XQ0>atA=kVUGq-#Ft/E>:Oa!f,U*?lsQWcQS<f/F#(*0F4?Me7FY9F`sl]P(#?(?$CZGgWF&@pj7e\r%]QcqD^ZGQ^n\UkqVS!^a))#Y;B7h4?)/hCH2<aHCn)nN0G_)uW*)$Gej0^RA!L<1!/-^70!LN>VkmbIpnY0Y<l?EC`j-B4E%K\9C\r%Kpa"`XanT>2()IuA\85V@";h$*:G&;^!]%VFih#!#rj^,##H_'a"TK5<$qj$ekX!E<oa"^&@S"4p/X5VpuDeWQg?aobE(\]G4_oh\r%=8&i`D`p!)7RepuSdOF>[;71SdHc?A7=X;1/Y?!ZQA&"'&jik'ps[.1j(bJ>7>b`EIeUirg1%`l6ElKTD.%CHfOcLFoEYeP.D'7e\r%EHhR_gJpKd=J'ri(K5Ya9jDIpBU!uAK=)WnLYQCn!3(WV[:(8eaBBLBGGD#QH6i>DNmB]_M"%dRRjN6<%]-(JrF"sU=a@dCT>!X)\r%fZkhIL\ach`Qn,sVWBXdk=Sm'cnemdN7X4H'1WK&OdatrW$=1-QffW;Z\(JCeVcED5c]kmH:YARLr^2->$'E5(<cALBl;uPCrM<!\r%6F`.o=Y-dmAN<SQ*(]V"=H"q2$?f!%6)1U/&lN.uW%`'b3@P,'a-.AkqBM/gJkh.B]kjVOSQrSN*^cbH8LMSn31cC5OJEOXf7eoV\r%E(M7do%n#X'O9A0)d":HDOFod(USu%EN?1C>`_r04JXn=+;_D@"dSBd8:-W)%tj0\J6^GF(,YO%/EMI!Yoq(kjaocD_TPX4U0Nds\r%,!<mN+W%NB4tqs$+;_D@"nfM9K3[mQSa)h"_aJa'iO/Vifd+E>grcFK"e?BPp2WGYWSK:G,/!j1B.b"-r93^qcWi)9R5ae1M5ab,\r%Jdg%L#sp7Xq%":#>gOZ1KGc*:\Y)AB#kM-uE^>UccmN0lR0X=o>\YU5E/F)<C2&n?1/ER)3p[jaSh(N5NTi^E-,Rj;E(7&C6m=a^\r%PT1=k=XCq;/'T7&Jl*`);%F=F,!8U'%5R2MCX5uRD>?'`P6gWMJnCAU%r8J>#u?fl?[eB<gVmGQmNr>`I>SUM0FEHiMjqWBnJg-u\r%nfC==4QnA(&f!<5n60:j21SNjjU!hqOQ6"(0":mJ@n*rR0_jU,gb+,=j)G3q.=b5i\_r27``'op!+F+Dd&:CBe4Fu@p'4eC##F,]\r%CqYDTKY[a+98?R#KY\&P`b1;G#-W59p^;^]GZ=Z<A.QOkNW%$Ar0KSA07,CWlp5ml/J!J8G'hkp_+X]#H7VM=^$Lmtk$S5rQ!FQZ\r%nG$mC!PQ"(L\aG=FqkE&X0VWc"1Ys;O%M^%:@P![[`[;P"Z&LCGuPTCHrO:"0'cD0N+LBo+Jn]BFFlK!d.7i@8jW"<2-C"u#*Fls\r%&L00s'NVGA:2Fd#HMBetUD,!<"<k=0X\t7V'8/0]<[jtSF'U07nZ8"-,b6&hhLu?6+A!r:jtXkJ6'>!)j&ml98NK/6Z_!jgOJEPS\r%2'a`<Jg?m0cA5l.'I;oGd8S.h.7hknU?fZu.7hkn6Ad*oV'$'JEBJ$5+A!qom!rK='I;oGjf-R'.<m>Q;@8S/K!;/k<[gSf#so""\r%>GWHVJ;2?qs%5S!;O8`=YuM-oVLNQ*YuM,8jaFK$@PW5d(b5d3IBT`;Jg?n[hIaVs.7hn8^ci02V'&>W.-m+".KrC)6#^kL<=4n2\r%Jp?EjWYGC2+Ranc.7hknE]e-6+:DK4EhsoCG`^:t<[gSf$"AXUWD\hR'BGN2"\Ca@R)[f/"oYKpBp=4FIo%rhr$Va/$1rT)\uipE\r%nORQO1'\6)o+I:"d)`sUN#8o2(c8$H1"Qj!7"OL[N85JYedUin+NJiY$jqj!EZ*Z68W!ob8=OfqE*n\ZGfmh[GY#['$q6ao,uT=V\r%S,@H19$Ma'Ht?\&%Y`f]%LMRkoSD&7h?GD2"-A48JifG1%/:N($HA?E8T8=+JH<tVl$$^.JJ",VaIIfiitugX^pk$5B4.D,Mdq?#\r%Rg]^c&&dnsX&7Sd"pW+0-b-MAiF#`<:7:>o"+sg@i9lt`O[-D(`O7H2B9VC.i1EM*C.-?kQQlm,$k/gP[S-2ooEqV%TgpDaDWfID\r%2Qf3ke@$EOTrp.)p2@>+-`9Qgh\d9@SO$&ffZ9q.Y6u'oS:=0eghsnkM]d_+`i%7,"V3L'OGr@1);9\SBUBhVKKjHT&4R2'6scqF\r%aoVfI`g'\)jRPBN@Cq'Mo>#Qu%%VDn&g^@S2q#1]B@(.RC]I)-*08$=YIl=09"d.>\O+'Xi?fIqcIu1pCN%7Zmiid7F?H(a^2QIa\r%hhBA=[ZDp(QSCi3&?dK>Ekf5j_,_90ce5C](u5S8G+k3$qI;TMChD!JgBIQmmsGp'gVr]3pb#aY$_/ZqI$]<,WH0fTV%1.V9,>.7\r%*F$79QL."7V%:;@H/=$b[D+=$(X?h5\h62A/m>\Vi@Fl*q91+;[8*)98'ugW0U=LC\j!Hhcb:COUG<AT8qT$?Hu5q/>?'_sWe"0)\r%aC;0SjGaBYg5"P+IK0aeBHOn]!rskV\8qJQ^S*D`_1q[Jq3F=$p)+n+_1hT^1VYMLJ^`mG[*NetQE/@r1gL7(\h'cb!tO_9h1@p"\r%#;KKBpcnh;"g5rE$S>cV)VV+Q`WH_<;r<kVLA&`gk0*ja&[%XBj>\ukIsk%EX-Gt%3.;Q';qM0fbOrc0e'FLedefnIEaKp5i0tHc\r%K]7qd34imI=`U.e8q+.hlFFm(4`jsL'm]5.8CHPWoP@6aGF!&I'R@96$8agRYoW,kh<XU<?;[=#`>P9JbJOCT39(\,Zppq7I;nkM\r%'R=NeGab,>#,,#:jj$n:2I7C_cNgE]"]cci'gR._YmONl=Hn(H`LVW>c]9gl&0IH$DlGLqG\jG)drOE5C@h?OoAl\lM`1#(SX=42\r%*4O2mP5?]=.A#sfs4AMHf'XpW`UW2A1*)=Mq['sT7\g!<qe<WB#h&Z^rD!<q\=]X6nUKu)J*s5LjaPXer@9+eql,j.*Jg&cV(<;S\r%e**MT20/.XhlXUGq\S'ae\^b#hf_5Xa*PLf*d!lgb;'08EhGk9\E4UqA2ZlkqXs`FUkHZi#6ot<1hQX3"=s(lL8*T&$fG#c`ED`.\r%";iA]:e$5DAVd8j=\>\B.]VQ7"_1t<[BR.-:f8%^S#.6.K`VN)Ti,VQ0<U(*-g7J-Di*\[gkMB#0%RmrC\P"WYuOG/jKoSiOt'6t\r%,ZRgch1?I,N1TctKJ:7`^I%d?[g^Qf8QKZ2mqngUs-!V&$dufe.POCT;Y>"7ND$9".]V"Z8KT6Y'GXWP_Y>[]U8Y"WGI$>!e!F$2\r%/p1f)#,Vd#,ukWo<<u[[PZ6`fe8Gslf#;LhOt)?H.[Vf9Q;g^\<1u7Vhi]IHMCQE,5"hn(.]NnK'OFG4-n;7$7aYR7'nnc2j*d7n\r%;,gLDg$*rXW[QLP',L1?;FU-N5ZaE#Ot$gI$iM\a9<*ZO'J8(9X407u<)Kl*\=LHC8JT3&2!9ec=shQ_-ZrR!&oC2T`?%'dpAL:V\r%;6X>4QkB)Q-g\_G/?,?\8NHes<>989lk]4n;FSEFEP1b'.R1I_oHdKOC_o-BIS6[hfIj_LdT];ng6Rg;?.Gb9FCi@8RGiP`?*nF7\r%Dnbd:d!T.;gR]nM/(tWqeRC#hT'rCb]?L1:7-ECoB'W@.h9NT@VsJc1i-<%r\32#rJ)^+4/G-6-Ok;YmbV!E:Z>$=ZB"Kb7)c6Ne\r%c?;L;&Yo71#I]P#_W<F\]/V2-jYMBQBOmaEnE>m0&ll60T3OU?'j[9pk9njl<1S-QIXZ>9'U>+1Y&(e#h0.?N\lSs-H-EZ3d!`&=\r%<iJr9>7B&7%`s0KQn9mOh*=J!p.3u)-Y?"3P^<"hF'I/)I[8^nQn>tK7)a$=@CDE/?R*$;>02u</O.IF0tUrS;)*&pI[I5;BDrpO\r%RGYku)4@U<n^LTO$Z^RX\1KqhQBA:]#ZrWs"l3\T"3q[L/OL/)YG?ATAkQq:?-7$[@CB.LE]LVj-eFF>Bp8MnjSGim^[@eK)eKK/\r%0i5tCkI1:B>BmP4EEh%i.@U(QeP1cU^e<B!(tAUrrad8+:QI!49q;h.q4A+"8>W^K&dRd0QD9*e,@:*3gHn6Z:G)^AC-+R0>d_NA\r%+$KqS`DiLfqM6CfKdS0>W*cNp^70R.Yq=*,WcCH(\_4jlQRbTQn%gb73S?_K=N?esS89@6d_omAbumUD3SkLLnd)4FZWIR7ZKZ?*\r%EU2_$H<N;c8NgV5.pX=S/q'PUH0OKDT&3_pja+npLZ7c>\CTKZ4l2k3*R=9Dm*Si'F9p2cE*7_&h@R1B[u*QIH:'=#/3mKZLn5Eg\r%i\9r=0UP2e?NMgcOu;a>JBP#R*nOOtbH)o&X_mni.h'Ma@a%Y\A_%W+Kdu=Rq!rOoU=He.d%gWfR`m8ZDrH/m];sG^+%1I@hH^;2\r%(q%%L1D_f]YL:`@B]']P,>/lNnG<7(0T9PLVih[IbqmV/1CTK4D$dmic8%b/GAdlR_+D(cT#tL#@llXeL4=;a4U2>3n2SMZ!Q-T"\r%_U-LK/.Al.<F?3Pe@/Pa0MH2J$5eM[\Q@?9$seGIhuANYMM'5AlLF_",gO=9M1J]-AH8:-3kZd=;Kk9BVJi(725.LAcIcX3lO+c`\r%iphE/168MoZ/hd4m^>n'2M46@5HJ_\5DbB[RpS\mkj;o6X-JmnGi`KoKP$E4S+,n(kjK"&kRadFfLQ3RZK5>KAQsupGo*?0,U%/7\r%5'P@%8rZ#d@El+-LdWcX@53_dk07iJO@k%CW@"d'L:ctjCc)BaA9FSI95ck+'KmJa?DBJIaLGB(.)nQc](VUZ(`<Yif-O#$4:B]d\r%I5c#!Z_L>CI=&Y+(1Z>#T$/ed+4_jW3Y7*I9^N`(egdQm/8T93)W;tkm\U]AQ9+&NL8A"\e=#ZP@T84r9:`m-j15rJ20FXT)"o[&\r%(@"T5@Z3paCoK4<-aP;AZDGi+Dmh?de=!C5?UC@[VTtKJYAS/b[a^_M*LkauG'tG[g;7[*1M)&p\eN=,FbZJ[G.')/fONg$lG46J\r%^hi51)GFRQ*Fi^iZc-`?'9\V4bSIN&-WjsicO6+7<HJIMP)T.!=kUZ.0cN;dXDD=RR#U,DQ=;F3if$L7Cb_D7.4mu*rhqX">e.:s\r%\YdY3QDI]le<q9=UO28WqN+NU;4i/&.d@Fe0t1,KHg2#(0?_Emhpe(N>g,g$8>=DZKFi<Q6kXWshI9g`Lb>Y_pKD>cOG`((JLXkp\r%eN3)6opV"u]2%a23dHX;="]Nnq+URVhTHlJd2?0%:%UOCE;@0DEq"3UTC:#omA$+lJ\JeQ7s"7o8M0TKWoI-^p/,nk%sePhL?Q84\r%40@D@mKa:a`pk+0fFrabriXnS-U*\nrU8+>h\KifI'E=rl1$DGLh?a5f_n2In[o'Ekkn*?<qkFT%T>2I07Kp`'2tT8CJn*oA4OYW\r%[n.#bM+3sQ0JSoq'B(t.BK7U3UdEJ:E7's4N*nX"ZZL)Y3uM[1`a189qJ!q7PNUH5QUKI-iF#DmTmsHIQkkIFS.ZB@"?^jpJI;8>\r%1b.$KV6/Yg'k'g#\c's&f<(TL:5rPA3t"?2LLEQ"Qo=9'X,i!_kT!0db7e]/>'oV[o&o2ika1n3;dndNlm=M:4BXS1IH-2;I57#V\r%i:,t)(/5Umo'VOecMGRA)E+TY[+63ki`.]Wi5WIFP%sCp8.j6"Z[<3CcJh(<01OpuK9[Oe6ju-Zg?bZeS2:ciO3bUheWgs:>c)US\r%C?J4US"X6I!:.M\S\D`u\sL.EhTSQNa?-%:6gMu/=s0iKG_CaS]ob#+Ru6V_:%TlHli7br2/tN</`I!E6&FX9fXbeXr?Pb.[$/Ug\r%r2(4<T&8;mD^hEnjjL8P't%luiq5n,?>LnB@mB;tnJV^#IE-EYpUhT6c?3pBC5I^@^oeC)^>BRXV8c&BSZNFLb'oS@l<i`OegBIX\r%Qj?"4D\8-sIX!\jXSmO!2(^=I`+^:!F5e`oS4?An/sLYO5N:eJ.#5N]XVe5W`>+>pn8[AReH;K57IQR\(4dfpa#PB5pJ'G[8L$5B\r%h93j)8harV1mESpfAACd_"VsS'ou;W+-+>H.X!9qiFUGiPN/)Gq0L_\j&3s`@*8#tN4D+rTb:&!O!d#ga6p;>KO?Z#f^0B(\Z;JA\r%b?H$;8nK3S?=?Z!0+Y%rT&3Be6WTI[o"1&e$HB:_%.sHUV-pGV_:lK.)[N46ga)goL;td&?]JW^2:VR3RXb1Hg.0NdoL`U+FbI<c\r%/fUemgIY!2*bB[?TDjX>ADF7Lm)q?9@I!0MYA<ssc:c;,r1IiZH(+Q_l*W0_,ZH]D_Pl"H,Dd-!=S=9t(&;/58E%QGBO[5gf76?e\r%P:mc5F"(pqeu.Jr/&NlnEh'?b[kP]&:fhD:-St":3V\hl,bNs]kO&o]?!1p<*_Z@a>\6H!]oCe@79Jj&3\I:1@&_JHP>KBbSKbr$\r%b5O>AcK:pA@0:p`Cun.pP*/)!&H\sWNt/Df$ZD18>0#PYi]^>a)C\\>^&>Cq>6J96-l14ZG1IFA7s>[s!aQr[msH`Nq#8qZY!66n\r%i_19Z_i#rqb`hd$oTYm6g[?^,NX)U2h%9s?MaMSDdOh^E)BQ]k1F%"2SNM3mPUksmEZ&gWGLC]a64R6YcdOZGo$#H\W0C/^iDdaO\r%f3H\oe$$>7&\Xk6UfH#lc/j0sX6u,[5<LC^VB?oD%SEr1Xhj?cdOB<m2/Pn&Y]cpe]AENd*qnLY,[*`>`36B0I_(jABoHf+O4i<3\r%D[l=89YJKB]erX@b4M9t=PID@oB9,)NO?`,(U%>e=PGl(,;4:d?%g^*)0m$65\,9uFYK!!==!6`nC_$U4;J6BAY>MnGfpFWQ+,)[\r%6GPH$L+IoVCHs^X>+d_qk'VX4)A%!grR??G.@L:hJB1p[!6`un'6O3)JGed;h&pJu5RA<-DkVVSi@PgEDkXnu!],<[]nOI.,^Ab_\r%V&%[$+#I2>T<E(.LVcIhX`LI4+>k:"3PFcp5_K4*?-$)dHNR!d6:j_DhpQ\]Ki#]ncetgJYq=g2D[e^RGaHp1CdFe2*TDR4$akRa\r%W<)lM*<^O<[m6uZ;cH;;6rH`&_8CU5Y)"gr!g/+tN(&GGnZqo:7*GE`5q4A^5O7;$:]n"6D<#kq7>:_']S4F2mQKIQc>GaJERc$A\r%7cb_2r<QG/oo0qnq$4@fia"P$jWFMFPf0Nu_s$.P?N*6encn6I;>H"Cig<^%1qJT^qh%bG]PWg8S_H&.X1VHOSaZ-17$G)]GuJn>\r%32sP,H:8WMhT"?B5fu;R[$H&=H-7XLD)eZ6P^h%:(c#!7s2>2[+Nm"=.CZ040e`RBa8u,f""jQ"*"[[eIk8_+AQ8Z6\9HoWS,8`Q\r%TOmuIC<<:L6]<<E>%6eThdb.jjKADJ9*Sm.rpfn!8"a<LL:6jd*AVE5B=[s#l7u[kM6(+*XiIl2"_-UShcJW0jL1-.!RTWXo\fL*\r%D<^1J+D+TlhGcg#LXenq>SeJPZoVo@f7u=I)@k.\1Mtq?!W/1;[ZC,73,,E[0A4HmD#5@NBJIEJe4E=(d;h?b-`qjBor\gI>o:&!\r%OLdX*7VR$_+/H%MNeb'(C+'[p[6ihQDF`!I8_0_D&BLHYhjoJ\0@E&^h*EG4Fq3I!rkR.QaBoRPDiEZDVP.NQE=#u-%ODXcj%s4^\r%GSH%-7a]`sXYf>o=F=@(Hqtj<n]0\u/WjH;[e.cRI)toHd8cY48;Q/_k>q5k..PC1B:_1IY-1'Kf7emPfO-*R:WXA@R5*4*&:_tp\r%@;##)H#o30d^"MLH\)P#m,`<E:49<kL:%:,%fiTU)LTj<nd`h1C46iVn#_rBRn2kPF#&U82re9)l?dGBWpQpjRIo+oQ$.P^!N0eK\r%epRBJ$!:dAMtJQgr`_sqO]LA\(6u9&[/,f<eWoib\aKk81=JY$qBB*1%_hUOR9:QdS,b"m65Q_BOd=SM@PD`pnZuRQ%_CDF^jbg%\r%f*Nbs40X=,Wb5k6Y#!o\Vm>TbLXim=AT@bIrN7pqrM%njGEUCl*jk[]aIpFXRW^fZ]*@VDcBbg#TQ>9W3QoP?rcQMnCk<b"oD+*m\r%3'Q#<k/A2$S=N[**$5HNYQ+uPL@M<cG#gVE4<'hIKAH_\.aL]J/8#Rif/Yp.oW[YLJ^2qOjifI-3BO:3Fa^QqF2#BHf3-/3EdT"G\r%<gGfgmP,J<BBQn]gh3mjF-\#V?;J)F^TT``S;RtM?n.g2^@j!^T%5Y>EtdYb!(A]p-\Gh&,e3s_CKS`f!i"n1erH-8W]3g6kKosu\r%PL7-LN0_e#)4Vn=Q3D9a]HVki$<;Vqftr'YgE4YVX8Lu&TIH-R'n#Q$OiD&O[8UUYoM\`#5!Ag0DpmFfODA]uS#,Q\qi17+UfIZ0\r%)4F3i$TY28FB"JKU%Nt.eYt&V&m]AA[N5s,YLH&nX`aG>.9t3]pYXANoS9*jMmcQF]DW'tkZUHCmoMTfHm@.\lG9)E+W6"C4S@,H\r%Ubg\Ah'\?kh/#Ifj,45H(5DZI5`\i@;Ct\_'tMQurZ`p:^X1_Z4jn%&o'>S\Te:?Agd[4]Q+dKd[gBsjP+X1/*<O]j[DV4^+4qLK\r%le'*p==2?h1\ZCG'%d!\S<rUA`%E+m[Q_pVBnM@%ZO3fMa3G]`KKUW6&p/=k_Hm#\8)(:^dfAA0GC^'?@KAo2[1!*P=[3S>0>\p#\r%4ts%P(4/GN^Nj@!YtblN:\N)Y=[g;1IpP;qIiW.+EqP('Eu:t,ARggbC:&#5DQ;/)rZ8iFCP?p=_3Dr^<L_onkSn;Uc,[l"le5l6\r%LK.gt8-Y:8#)8@DN@j(54d)%<bcF7QaROi"bZ[>Fd52n4bcE+$(*RZU0sf"u\:91OJ;]dL@28_kk$KstZl>"11;B7fL#/)qL#[gZ\r%4Ae`%GOG2X>Wk9:7,.`:lKkA"3"Zp(+BYMdZ2o-WYV)#*SHW+cnlaTI]1ZdE#90G)GUjO-kH"t/US:^pO7kS?MEIIH!j;NdS\iV2\r%J1Qm:a0S6Z,]&8(AB*hn?%8\T%kG\I7<aJK+gMpB6n?PepPWBPq)A(O1Ip?DfT+upUH:!76W]r'n]nip2Qe@iI$AQBd6[&;X4`%^\r%N&X2r2SSQiA.`5-XL<=]b_IVIPSiE\=M&Ii(7I&U?`p=Y3?O"615^5pW3#[32Yn<6[Idbs;ae+d=]p]S[C=OeqGn0S!sV:c)Ih\4\r%S:;Q>#ABQL#_dDJ7.#4'.LYr%'f,)Q8DN*(V2-D=A/;cHYM)mMeB=PHl4"lAW!>r2XO*Np<.t'MUQ=el'NCChIL.tJQIu)S4;:iP\r%)n0'nqVlgF9h'[Lf.5Il%TL,qetXb!U"F[^pJY<-c4oXb""UP;G[+MrE,e$[idOEO]&J$r%k\Md:BWutXHElH]1>).q[H_RjU,74\r%]LR5.$=%$%h$^m$]f79VKr/j.<[q2/C*>spao,e(=0B=Ra*WJ@)S!B*)E7$!(#V\[n;?k-rZ=Z93kmp15C,-P\VF7h^m1G<m'0]a\r%)I.j:-;Yle^\lVG^0i1;N6*Zf\_n$JnHQ1%JLbi^%.Hk*Js#$B.CS,!l%*p+$q5b#JlgrC5;\ViZZ0$#=.4*K,B]llbd`4*'VQ'R\r%E!?!'Y>C&&"MLK)#j'RQia;#W+ihLsGUcG>c_uLRWBW+eVY):[@pq*8\dt7Gcb.:*%L\\u7gbpP`Cs^^]'B"c&]jNhIE]d#/PoSl\r%+_p]Bi;,cDZp530/1%dGgCY5.XNGIUJ6$K#+JSUA8p>ZV:Q[eITjCNpQdTX@XP#u'QbWY\_*h]86=AdHMikmI9jj)m,g`GK#>%ap\r%D."sNY`4d<;@iV^Of3t+BXU$<S;]PuLHhj0+@97kr6+Ymf%mis$@>oqa0LJQPeRQHZ;UhjK'gKTKtX=jS3[YjWJ(HJ0%fl:`!QDo\r%oG2LeBT94UoZ7ni>\d:HJ26o+d-ou3U#fUUkf'5ald%=s5r7fb+Si?O;K?kmFmh7^^+8Qt)=uh6U@i.R8>)\2:<6Qsrd$QN8PM8C\r%ZZ$C:diK!^57?mi[QPVu]K@aW'@Cq/Q?Y3`BJSo4+SiA)Bq/`F#AN37XiZNK3(PV@VFG8H4WJHn5>0ktp$0n5UeuenO\l.R1cP@!\r%0=XU[n]YIq-0c=M/;T&mnn@tfa18fen&n^Y7VgT@3K?VKMF-N%>da'(k]cQ/c>qpN8hG^"au(ImW-MDJc9gQ`9H-qHrlL2H=u[_j\r%Gb?4"@^L5@.m<+9$gHX("bG!7n"_#mi`.Gu(p8tq/@6aN1M=8XZf$-!ABo57B-CgEc(*mQc]\#SQduQ?jKieeK1D'^:GJ)-7DVc"\r%fl?/\SG2geqeZ$YX;lCk[+OkNWb981d:1"+.I3?QUW%u6!Y;IJUSW*<bjgP3jW;I/]unTlB!"%;hSo"Ao"Klbap`1,ORpNjpL4tD\r%0fJo<.'do[f39t//Y(R%N!B8!Z\L3/XsIA77%WU@+8`uBh$#/",R0GlW94W,$klV"@/BS0Pe[ZeS9GQ=ih0.e)-l/DdmaGo`'I=s\r%JUQN#3j!iD#Q<a3dj>RiH%U,MGVFu,1sM3_'*iYV#[*^L`cbb$&?^IYM1[jb6>J>^ih2c]Y_?l8nST$+FA-ldqg)K4`X1H_?g0Rj\r%:sU(K.nj?-K;n7MGQp=cdhKj`/m>]kJGFVnY!\7B:CJ+\?Cr@n.0TrCqp,T0QLhjhjD2HmZ%k[;=\se]_UQ%t&6ieqemdg9EG*GB\r%:l)9g:"Z,j,Eb(udEI)cqG@l8iK(F[5A"XnbX+(1*W>G@=`6HFhg(%/j<2;D/OLZWPT[gI/Q%/Qp$<i<cs>fXW&b#4P/gFPY]%&h\r%2FoGRXR?"2,dm,(`ZQ;X\Ts:sl#Qf)B7@Kj8qs@J43FT_lLq-Ae"q:/ce@UtMKG_`:h6.:l;B`)=2E#CK]sWcY0a"iA2_ML;N45$\r%.XfU$<Ha>nXZ1&S+.k<f<kj.V.kfJ,bY*;rjgOd2GGW!*[Oe'%-;Ai20%CJNl6JuXj'@d6[ZjVbp?FDC)j%e$#0[4SYinb`%Tk9$\r%78D60!R(/C[:J'"0HdQCR5BE@ckX`WCiZ[F0KpZY6n>D@._`\$Y?ZW/p_7=nTku,#:=Cu8/%cUpT4!(r:r,_M"\gUbO(^h-q1J(H\r%q1ma8g&Oj#>d\"'ign)>hcI`DPKmA"-A:5/)io^r$0-C4q`t)mFHY`0Yl++,?bF^ZO@_`04pm^TE5p$7g,ne\#?o3E[f6J7aFs#"\r%ZmN+/A@g!_*YZdFKSu^$f.RfWM/?u]H>cgrZmqmb<%aI*s6?Qs*om.Arg3'@X$(oO:29"LJ(0.i>,Ncm)OYXbD"*@D,EdA<&E7be\r%]%B@EjX/e"k'^rZ0pofcIUO^^K,=10Fcr?B7#/OFUdn/2GU.(cS6e\Y,?qI.iu-R3CrmUZ'P:rAZ6a;Ub0S4ZA4tLhC?^>QnOV4r\r%:9P&:`ZnW=;eP@Z)NSEg_S4FG2'0jXX<F:8CHRb;#`DR,20XiA=[2RUEiK=$?/q'K!H3R6oKt^'UJLE2ILOj6:9*^$YEG\O9@nD6\r%CN+;e5^:0$?HN7D:c_P-C&!(&7Qf9ian_7PFH&er7SBDKUMDuT2-?hE:Y0h:CZPFKC:_D0=efT`;UREDaVrODY](XDP;Sjl]#Gst\r%KC39r[Ggag%9<tfP:I]r)K6+qTPHZQ2=b&q2;I^mf"e2nTPHZQ2)+X6TPHZQ28CQKTPHZQ2=_4`2-iQnCV!_WZh`aZ2i.j'T:\2C\r%4d;sF>)j*je3bC<Cab+nNP(D]U3tQ[EARhr^?_K>$IbJ\*<mL#Nj[H]$DQPBBQK]HS/*_Xq8VaGH*5Vts'F5>^4g>kX(j?e?(EjE\r%><T)Ca)r@_D&Bk2aB(02*G\EQH1u=BH5O6a'7OeX)TcHn?q:@NBFT&hYh)<</\kl5%d7VF]NTt^LQ\&Pbjm`49ls'mp%GY&UI20c\r%Mfa((Cil1.]-d^tU'G(KWha84(SYQ\0>WA+OnQf^EurW'qH%@R@m(MB$l*4p69s'=.!0HoWo:-&$D'k%p*3f%#itY5ZQIkhO'i3a\r%RJk4XI,mp`BXJr8RZC-h(OkaA<qB12XnAO8r64Lt9DZW-6DD"hQg3VQINY*gg-"Ls&EVY1"rZ7n'qDJ)`RnsE+2)np2JbKH+(sMS\r%rk^\[:tdErOA+S\>Acj/Y-j%F7\jJXn`1P'U<G$(YmlPprD4/LIA<9d)^Edo,Ee'7CO4)lUnKJZ$,(/$HdRX+`ZN`$;qb6&,$7XS\r%qM^D)()mm0fs!CZ=_pW2X'fF*d]^4=?p-T$-/2fj==rcs8.DMBMLi/"4-YP$la6;M]VcI&)[Wr[.n\AeE,HqlhW!2"OjHgdYg?V<\r%>oB"K8Z0&)V_S62Oq*?T%IB\B8Eit3l'4eX@0ZpV2q$2BDo%I.B/e8'QJRdQ8b?mGlO?6PD^ip^/DWj@Q^NGZhL\3TG&F+07n',\\r%o]G-U`I3DOQ2njO3'5qiE1tb'`f4NS*"L,NUsiNf+.O:lB<JXXN$uH[JoN$_1k5=F,O+idhHA1]NMKo[CF9ok2\JPK[jsDckh;H]\r%!d+``2put6/'a08p6B"?+]j5sbR_2,(kmET#YLVOQ[5`,]2JUu.1\KcA<q"ecL&V5JdlLpG\-X1*L`u`Cj\fMI:oQQ]^//##fMZ0\r%$cJ:Z6\ssd[=sh8k^?#DO(d]L3_MEj@+ufPbaYT7!ZJ[3Y`nc_qWCL,plb8brkHgHPb&o/-:n?,7sYP(\Qf\N*pG7njej?54ORGK\r%(,R>RKt]1Jn"/B6GC/+epU[93^lRi6i:9EW\S_6*[sk($oG5_*Y9[:)`jT4]JdZWt6Mo)M`tc:A-7(a*bBtu^/!V^"-*u.12\;bT\r%?]K>!E1u%G;061EbOLnp?`3I%lYjAbGlB7ID+:Y@Ptihn\\_qjNmE/;Nh>%Q[pi^tP-2Rm=L/g4J)<""_CK@=HQbc/")X;%`$\_P\r%WTJ1kBpp^c6qV?721;rg#/"(e4Tp+(:Pok40)]C*Z*7,'2!-Kr;VB?b"G\!*l(_eoKcJ()pd<k.L!V>3.i$/sKr&4.`LsVqCo-F0\r%.:=Qe(p`KF'&dP/2biLBkt?Yk$;KPRX].e?)!G3R9+Q>\bE;<u'#rmd@5LlWHlmL@L=&$%G>D[,45._MQJFg,Hg=SjlY@\LXUJ[G\r%[lqde:Z]nSBED?J)0@0CL(FJhZL*I"8RB3[jnPhI(LF95,S?fp040o#X<*Tqkj5ZE1N\2]o?EHJLj[_gTaNln*$:;b4SW3J*0CqA\r%T#q?/k>>MUnkj*%WNEWk#b"KKO2=GIisdb6`pLBaF?-.e"kC>f410#_R&BX`m@*A"jgNRuQqMJQHY4:(D@<e0:+i0tjd@HaFE_6b\r%HmUmGYD97h0FK^=5(OIQb`[/aI/to,Qj$%9-d\T<=dD'.G8,jn&3]o>JJJF5iqrm1$CHNr(JRI<S;pECWTi&+$5]-u2EF2';"E02\r%"gf7f*uS\,%Z*uS700aa?Cq_7p&lsYS>D7mcs(o8S;o9_cGHM)[,ihYFbC8IS$$jdT^<%.`nZ.JJ?KA(`nYUCA^5mQN4DAIL`>%"\r%a-]dLEOInp:!q3D`n[`3P&6/g77X:'kqS2Q\*+*+jVJ-YXCKI+[gtqDVASpC`DnpH=*X!ae.DaSEbnBVU*DKWQ)6),r16FiXug3m\r%/9@SH&GW>$.@gDM8\Iuo;KE5[Ui:<5EWBHZlZKJ_Nt.D?-No^-qagfqH0E!-M!`VN+j\FDHn?D%F?CH2;1L<E]Pd"DlmBL2#V-?G\r%l/C?!CJj>@)a_W\o8)mbj`-_U:uZT"N@Mrs"s9j^I[.:AZ&q0(WIn,;?!lQ6/ILtoh;ji&=Yt:4dflsW4/:#kZ4A2;IQ!\a\GrD7\r%p9lFYO+bO7D12Gt4Dt[<`s5na42;.Uq:8iYQ`_FCKYF+,.*(ip)sV>Q9eV]GFZ0h,d9q+3JZXIVPLG<[pT2oe(>EjEMrSsnhFur(\r%jkEA/=tr2-2dT8%g[olZ._R9iKbh6PE.TUbLU3NdH%@YMd!]i-+1.A&0P+T\b?4<]kHlNVSpI(uEJ/5t]p3SNV-.0AX[KS6p[l:"\r%1CF$Wc="KXNTliO0sbHU3Qcaq`,B`XUC[,`i7'i>XcUjQj'1(basO"f-Q="XI$_QG-V0soNi/!#\ImrjOa&$g4U5_L_JfZ<Ma37t\r%(p:[)&(LB-i<ffa_Un25N),amp4/)tpf5T/JH-J/!"IX'$G`rq+ZRcm6VAmBSqR(QB;$Ob>s69co;)DA$deL@,F'R73K2+*@=es2\r%o;!TG3T6&0X1/MKnr*6Dd^Rht3N3U9T.!h'j=%.nO-,N]g].tGk=J/n(g."&H(muNE7*h7I/=cU(Ct@UbC^D56Mrj5LE.#da`)If\r%2C9;17)We?W_Tl8S1l*mT%9Rkp+>>T;buAk>hP[`=14<=lqVok7Z1<rKAB97@>n#'h;W?5==BY:jQd;hr5FI7e^sCSO:e2a#"6(e\r%q]fjr1RO_t6r:[;BRudUE<Ye6^*em?bC*Ye#feBnIam[M`D]';Ulr.Xi8hDFjBEg-7^>*Y,`@P;^h@qd!t1>iTl8S9V$7<F69L#a\r%<%tkSh1,Z1:]^F226a<N]NPUf`6KbF5E1sHB'S=h)R$$5;Z._8HYYf/*aRAEq`-bW9uP63\%G,nES/DO1Cm=r5C)&<G8Sc<!V-!1\r%j1]:MQf;0i2^s_jDDYaha%]1d7b>UP*k++Oe]oYVD!V@Pe%pF=ZS(`#=t0QrG#mWdVY@DX[^.m2=n/BJWgsmn-dtS*>CTSoG#h/_\r%>3omEY7^?ZA`K\ZFW4)UUlQO0k$K)jqJn*5[/?F1B9Ld79kN>JK"^+h3%X1l&9KHm"VEiu"KWPd1Z<T\#b^L)!>.GW)6e%i1`!nd\r%RDJD-YmA(c%!]P>6%mBVjc^.ATqlBS^O`EL]BP<;a)U^H.[cCdX_FrZ%%=*B6tVt%D[>r<Gi09nE,gm<6>@5NZQe<2GeXfW%/2l=\r%fJq+dm!+IQE#,-p6V(H/[rDtNf]q9O`HLKZN.)hQ/7/%f*PB-=7E25M2#UeR<S\UVa68_I#G4>(`'k^LI0Y"92Cib8kKnEHL8i5L\r%ZQXY=&<K6:UQW>1I1N/n5q$`c`;b9For#`\LhsUt#1BlW,N8';*dog-faftR%f9crhG5D%@lE24e9dUsIQYBUq.o;`;.l93,2obf\r%91u"0pVtPKVqeh18VLo5G&b!OhS_uB!G&da\?q#\.&@G^\*:D2I=r30/"\f6U>UB7',HNK^KRp^,T)$jB0Yp@s'34MfR8QW](6((\r%EjUj$p'a%^k&h(h:eeGdD[8NJL1Qe&DX"4MX^>&FJ6uoVfCem5YHLRo)Qh-3pq`b+?+W*kc]1A,nT8tuNGj"]M!,m8=S-On@8bZo\r%.;V<b8!$j*"<Dg)F]ihZZhF%/;s?*FR_mMaH:sm(eJ+U(d(tb:XKI$'Spl^o*El1rkr2Cd5rFV<%fFc%C4&pGGku'LaTV7%U):LV\r%FMqiMh>c(WqQEum?a$CE-\&A6U?DFiCo*0=CtUfI'+`#aV*Cr`46j[lim#T["_kaXEPa]*[^2@ndBEFGP4P^Lh`_H2Q_2nfTO*8A\r%5uT7/.X5,spJ[';FB-Y*\#V*ibIu]>f:+_ZaJI&)4C+[M1"cZCUDL+k>;2C&n[+i#BC0jiosi^lV=0il)):iRD^[EVHm@pg?.+dU\r%jRJ%\isGIB(iFoAn,5se?+n:jki!K2+X=*;`m3"ToQR51#`'J_5YtII!?(a4&j#to)6E.u-X4]VSonNS4Vcf9QoV(3WV`!1F3L.Q\r%b]%kdK,c]1'JmBdB#l\WK]:h6Agfk#W.pIXELRE6J6!L/3G*O-LOrEc>rInC=]PGL"YHj=D8iE,;D@;e!i-NLEf7tq:U@.CM,I/0\r%5&-(=2bHAQa`L"/IOPHa(]s!L/Yu8H;1Fdq;D9E(do$NR4M6nVJ>X#5=+O6VSF[6(+%i6/4!e9!fou'L's@TD+eGK"Y':,O;dqn=\r%0CT>6;s@J3jGI#hRGXc[`!*?;/%]%YO'E!PE4;JVl&gbp*tQdE=1eT`msC0<\`+@NoAWJj`5H4Se+?!\4JLUS=d0u<&fs?aPpbgY\r%/)cVb,4H`iU(JH_b3qoJ6n(7`U`St!!pm]Mb?=Sf,?M`,?kPUoO'E!Pn@R,,oZ3<e84h6N00M&rO4NdWGLPs-`O`SUFqmUq_`+d`\r%g!P41h6']jfX(WpJrOVuTkOO.IN.$nOrfI(1"KfpkXEl]1)[u*F1"oOGE+:Nkt?@B'O1N]q9]%^S'_$jIa0)Fnf1-"`9A^uA\T6m\r%ceN)4:,]S4f"&ic1:9G1Fk"!<>Z\<V\*$Bn[A,2%M*-Q?Q34>g/pWH\Q=KY;.^o&7S$n>sr$e_A\SN;HkY<IHc\ND+cOop!>dfZ4\r%Njk#19&G(^kOe^uSEB"0MmId*c:1uKqdV,%INUeG3b8B&dY9T@,*F4WThHT8Mq%?45)X=L\ObsiInseI,G2"d-ER#JUi\5r-8Ws1\r%,0fD]WO&2f\Oam3i:C=Wqqui=VYOIB^ratpfdHiuT$KhtkMfV+F+M_]LrQc@ehX0(&spA3rshNN*SC&?o;h%MJGs(`R"r!en>sT;\r%#JPO>9FhNJ+88Ag;EbmGSP*hs<V*bu5SI2[O^+SZZ=rSVo"0.1gGD&:8.!fS"p4KrfJp!/_`(X&@89S)2sp[Dc.eh\d=H7")O89D\r%2OX*A&V.#WY[sI%6aaVt`Ni;<NfbNHj"C,*#P#s_UO^.sd>fC1(djW^pY[WOG>T%$mIRss"3:_MT+M^`LNVDHqN/Tf]dl^oDH:Z_\r%l]%g&7=>@.(X;X/QAu0dr2_gWXB%U%7OUlgh!ZksX$sfM?#_4Y'uBLt90HU2Co<'5m(&\`b&BJ'GC)`@M`cPu<pp,6bZYX#%?8kI\r%j`i&ZHK@kS-B<DV_H`]jn4*eAkuh5jJ*lX-NpspS(Lr8&+;%qi\_%bYjY=U[VP5;>.S&56[?<O:!A/*Y"72a0Ou]Z*lN#bs;MLp/\r%7dGJ460=Q6S.1kn8CjULplWP@(hfHdNcIA2b`G)t`)5sC:X8LqR()r2>TkK8HOS>S/Y=FC`'Go4[sCbMTi`:1MT%=V_2P_,q4oWc\r%MWgjr]Us#;F]N.^]e6Zgao:Q]MAoT[_.[]IeY9S85&M5;C63C*'/s_fM_7`cn.p(R/,)Roi"R)U>PV/qq<pJJYM5AZ#kjJkUQK\K\r%:r"N'Imp9rT.&ZC2TX9kT,TpH6%CW3R(h4?j'QU->c3/D1SiBr)fQ8YP)7LMn'mV$4E?k<PmP#Ip<?Q4hic/3VfE]C('Je?Srh-@\r%P^5H;)@?#KWT\7Z!6r?)M\jfm@$;BJ1c%)K=mMu<$8cq=\)Z@D6u+MM\'@uSB&c_E27^E3N;dD7#f@ui[bQoBnJj-iPEY:tlWl62\r%q%deW*DGRfRse@+X&C_s[`/+VW5:</>sK21*0J9^(R':+pjaUq_[X0Ogc?)t6eDU#kL+RLbs`P)-jVUM%t5<R8(8em\fbeq%lNg2\r%Yqot)3aUm,Q:\qu$,R5dG:s8T;8e`HKX9H+&m9[`&\d,W,DJ[%lCO9;mZHLd`BAh0qnWI;A+p8Q0T/64XPG,,B>c=(6HcAW\dL9s\r%_TY0[n[a3<GE3#ln'%*-qL18^e%8*[^J^-55B/8fDbo'Ai[<sCDr0B$LWko0Y;.h:OVkb*RE<B`7:M#7Kotts,SJ#j@h-e*+`WVr\r%]5jL,6t5A=Z'1$tMSs&mBJ@,RqYUHK:d1H5E)JV7-PPjMAEu?*rP1C>OK%iA"P4(ZQ3#"hU6V@Uo:.W?Em1*;,^l&mUWCl/:>-OQ\r%pD@E'3QZL5Z^ZS&RS$=ko</^HeqXhn,-#>!Cf[CR\34@9UJ$jaiB'N\qG`odi:T`0N87#FFG22a)s@%GV2QTN?Ud&d,r.1i":KU=\r%-RI@E_PnK[)A=:F2V\r-qkYjPFp%W=S%DJ2b<k2Ef`c%fYZeY1h2m:7P)b;<6OQC0ZpQ&,p"JhkQT*#0H8f3o9]#QH/V#0")^kM3\r%pr"W9+]ZCGga(lQ6>5%K"QTOXDdu>m,i[T(K([4oRREZm6m*G+[Rm:k;*`dmCXU?'?AIT)rN"U.>V!P'*kUX?1O\;?*pmKX@4]@2\r%Iag='\Z:I#+5d#UFXKUq:;V,%5/tYJq,\XPIM.,,il+UJ=@1UcC&'emr)J3Wm^KB`[D)QF\Eft<opt`q2CM)V^B8?u$f:086q'%+\r%qgpG8kCQ\FB(/q+BRElZRdHb@"\jSqO>D<rhRk@'lo#qD03`J9ZDL)VTDW`*SOt*Y0m4#91<Z/gnki7DT8`0>nf1G:Q<3%j;Qu@R\r%OMHmubs@tkCHC*gYQH?V9"8BAJ_YbrGji7p43jE7YuT$a8RP']nkd1DHa%".<(p\4@2a?E4!)4uRb6b3,4PYV1gIT_d"^#<E7H$s\r%gE+4(VrS8531b7>YAZR_B>+UI&mM1T$22Hn[Oa4[8[-69&`Lad](DG3?@e0p/l"?n]Tq[8#6jHk1l=s^H)p.QmM(??O..bs`_Uf0\r%>8l@2#[C0Nf7_*+W[:`DJqRPCj<n/_cg."CQIK-ZGrEYZ\GFPI^252M)T>>9e7561#?Ud<qJ"9u@dL20N<%()!=dR(F>ZO#c,Eir\r%UG9c5?$mWS@#VY2"M%W@ML:t)A.a_+kS_!I99E+*LH_`OPBs`s=.o]%,'9_A'k)RBki7fFM_SfL$nnbZ5i5joJ<B7o)408GE.[%;\r%p]l=F9!`?s1f;kJj5k+VTkrKdF([98ecEOm:@C#lEf$W8?b>=eXpigkNtk;md+3WHp-S4?7ITnt)d6%@bsSbVQWP[40q!`)j--Oj\r%>&lM3`=j&+Tih3M0bjN]r.7/hUVFDLbC@!%I1\g)<phN'9LUSl:P.\)*)CW0FIZ;)]*J,[gqD"Wga:@A\V+Jo!`,O<'9F^P&3Ti]\r%9L&^gd"/`on/pXoLA6L)Xq4t+-2"dRbA._u@QYRf6J2%7kW'n`0J)p<dEoQoRFT1E6$o1O-0mYeHP\<,QR-j7%mCBp/j)M6;L6\M\r%gnN`5+<STB`&"#SkCb\Y8bAO87[oLZ;&N3s1=@Q`dY,PB1BtUP@n'Y61rSck%G3D\VJiYR3Abp7FJ\9]A=M.36giuUT9eX+SUo<H\r%./o=B.?=oU[fjHBWt:gV.8H@FOI#%!Q%kl&->@2>f5q&.GYCc*kS\B*QI]?l6tB@+lpDnt*#Yq+JU`Im'K#*Pnft^ug2Z3.js5,V\r%UUc=1bKeCJFTYA<B5MX3FB;V.&]'LZ-/3k71KA+!NdB_,_E#<Dd(OZEP(JrZ?H%1kL[iM[C_`r\\'S4UaeFXPm8o8>3a2ju'G3eu\r%q-=SBH_W+n9t*-)b<:4[o@($.PYZ0Hs4c;MTmqJ=B`BQ'AK240a.!Vh(.Nf=IgO^Ck\`n(&q.poc`c!t4j0L:Hq)<Wo/$Bt%J19=\r%bCd8.rC@g5K(`e#qNR>s&F`XQ.>aesYKEc!.CdFF^Oo6TKY'.]-lO#;j0!L.MQVjPY(fQ$eDnZX%eZ9EoWT0%9>\qm"G(;3H7IYT\r%TtCjG&5ZV+_9c=$HF<CBD2n]^*cQL5N_"c&(LT7<$&QM.HDRhDAgI@&g6X#LOp$%H2l44;A%,TH4I?@n+0jg'IU8>)>l(V5KF*rE\r%DbX<:279Z?Epfkf?I1hc\?*l.`!a.a"i#u'@3LK19>-[SWp[tp=4AA5;j)beOX/f2Z@;i.WW/P1Qe-]*>:;UZJZRNE]W<Hk,KN4O\r%TTt#3l]@qh#of%8:(Gd:KFLLnP$W[),]$#'eT/2Hadi(k5%-`s4d-B<*cfqG?(7E%R"S[fdfaU!)q3\sT>l:tDcA5Y]*%[OZ[@2a\r%id<0#;>krd#JYlP>AgWK/7J@YG)r2g'l,44g/6dW%&1F\4jpq=L^CA,`c&gBa&A4-qQ@=2pJXn+,SJ;\duB"lccA*c.Ng[5r_mlc\r%E,MK5%W5m4Ii)7,HuNsKQUoo,)bKcJao.L@\<2U$*p.>ch2B2TkXO"683$.TkXL0kp"&$F<F?Pb:Y5C+2ijDXOUY<hIftQobJ>3]\r%dI)usglt;<FnLA,#i^)S6`;rEA1[KYh.%K<MPaf,Ph0"N32)8:Y`H$I8I`rB`N:_2bkKNE3QXpVd/(QM)\D$CX@FNV&)%nW7jO>N\r%'ZHf,]$Y^igSr6LIK^a8/VAT>"aW(%ct%R4EfEh>pq*F/1#c_Rp>n/tl5F.J[$,`u]"Ec24p&\D1]*<:q$=Smkj:n)g#7eK*ZO;M\r%,"BGc4c=7j'1S?(%8o0AAV5khbdVQ<3D&Xg\hSsPNJ(Y)T]loM7`$D`]TJb!,\l:GAC&gQ7FTDdD1=63QP:0EA\EY"ZUu4`7Q:[1\r%AMm[m#pVW`_SLprA^Mf8j=:<E%cS9TB;IQh$.B(`2oKF*djbJE*2H.-B9]@.N#,ufW!ui[:uNN\j`6MjJAOUbW'dG1TYa!s]/ELE\r%T[oGDW,OH)csu043/F^<X^;F;Q>D5,f;!%cWfO3MUtaaPNs.m!q+]6n&P<[cP9*AZFt]oR+BT;unTss3"N;ZhKI`S#/D_e82aYL@\r%<(=Oeh7&)kYb-U'\W_?@m.>hIK"JYK:(I_6#iP\)I$PUDWsG!_*5#/&nIQ=WI7/ZGW[D,eQJ1T8kslDsRn]j5WJYP,3/3J\GHqd0\r%DRS'M3!h)>3pA_7jTP#DKNiAZ^&rd%7G*%`"6gMHG_[O[Od@BpiE3Xg#Qhh(V+l3&T9$<AH(g=<1i9.%D`r;HIt->mabp_s"7,Oq\r%L/ai4EWN21+I.E#(EaI5UekkFUiKEFqFl"PN12aVNS4$W#bA6=CZI*-l32ej=N>+5Q"T@cGLEO/=b0F'pu>r(7np\T/R\=(f4]jE\r%Q?pBcMu'T`:P8PD`dNVHCPco*K<_1X-AnZZ@-U0Z697pr0:Le>/+nLN(W[RC;_JeBe-dU0ro0I7MgBZ"^6K_:S_U,98CKU<%RAhN\r%af/@@5h&jT+)k?mSpL%Y-MFO!cFKT>.59>l`4lGp]',XlX>#*+QfZ?rd#b3[$&5c;I_t_3en<m@,O;(F/kU/ufJl'/Z=[D7gILkK\r%)Ukd3-%>i1psjfE>#D(QH;:fTHR_`k&C'<4%2b`C(.`.5ZNfM0.&kQBs")3kZ'?D/DRGY'k9d`C\$qO$5[1r!M@tW9(3]g9Ju^t+\r%V\<oX/Qf&8D6#o.7jK)cXiY`tTVa3c4iiL2G<f)n?)RffaeH[Fj*fZ3:l]1Pr9!>n;V&)V8't+T^p"/F@7G&R7;Vli\FYh05<>6\\r%]`&>;k%@bpG[C5o7J#Zq-iW#Go_eL$\J^XlBtH\01kR"EMI%MB]JSTpahke,mp<U"EX2nVTB,r#FKH=m%eD@LmqV0+dZRQYo_i^q\r%Zh@BsPq)@^rmi-`4looIU#`9C.EL5k<hek3!eW+MH,i*g)X)2A:Kn]KYGQYU"tT*>"k_K>1SM1#\iZ8=ld-&-'k$3[Qs%,2.(aFD\r%rVX\T<j@lL[@<4QR1qt18&$N0iZ_(D'"*-^+[AEHKaA606:"t&=DRljnVr1f:lp&?9mM.N;XBq,)68A1NsipuSM>.VFt%SZ+joB2\r%Ib5Oj;du5/7q-*RVjD7l*GI4gQu#\SK5aF5;nrQ5i3Qg\B1HED$sEhW4?L][Mq:j-^S\f*G`2eC>r8BImX8/^i(V*D('Fs4(UeU4\r%C@qMa]/l*NO48V5FN1bI^"R(nnXQWWlI1r+/<8"/[GtNNgEnl<q^'d+KHQQ?*KTXLmIrpJ3k6/,3<,<:X[o51]C;jl>P)_<0_6f=\r%bXhh0osKYoRigff9hbg\=qgk-@%liArWn?X4H9>^q1ZPl[Aj,\#$U;-T9d+pFC!['Tu*Y6caY26k^`\%YL$uZd,J5tlq66R7c%=A\r%6frA..s]Y)+Y6)B,*BocC*4u4f;!ddMM/"?`P*HJ)0]U4a-jp*GW%[E1Q)>F#\kFDGj<"r(&([9p#&0GRCV!egJ8-V_XRCO@?#_0\r%:-r_TWB[(YC&8rL(G6k\Tb^fnMk.cC]nKpVcO%;.L5a[8+>lt-3+4[&8.G9#SZj"OUo*B.X]XueRj#nL\2eB1RS/h.^X^7PY.jY=\r%,_#&,lDKKh6;-S15NW@4.99\@:3W"e,)l9peJ-]m08>W6jm)`B.>fc3.=rEAf+a&JY;J`_,t6J`AiYqOfI>7m"LBCYG)F44WL558\r%m*sW-a;i5qPf`k==?6de^!u7ULT:u9Y+\EYMN#m)IjHB`(nO?T3#j"[:SkBs(fpp[;sC&66K3Rd<'![kn\O`p3_RFkF(O=0oPFXd\r%_Z[tXanY2)\WKkca+?i"-`/b%&[2_P`G#'TSM_P=[FRVF1<pl7nK;7Lg`i+AaQ7a,g*Z[-:\=Qi5CDE`!sD>C.:/F__N;?Z:tbO5\r%[kLUD--5C&i7nIflXS>W.Q1&n"$6T^%p$m%&/)^R*]f^k'K!l@`7]At5i^U""l6&H8pVmjV9tW_5V?+j6X8P<goc-lF?J@#7<(^n\r%s/MI(J`a32-:%=g(k'GR5CF@H'Vn4`CE&tV$,g1UJmW=B9^CrZogOd]s/OqiMVj["ormYskA"eCa8T*2@%U<cBAcElOiZ\oaGfsM\r%-N0tS8CEF4IjTIW*[#I2XfJ6K4Cs8@8Ak%_Ka2uO>oK<,/3G4GeQ)bUCsf!caeJ\R:DU>^:=W25MM<3\Z&>W[jbm*s:S.o5<OU8F\r%HsB!FS6nWZh.$b_JuJ6R*hAqf@@4Q;`:AkD^WhPkrfKreR4$=AXe4G=D>3u#qPj"J>Ks!ueEV7,ld+f'HCp`r&=O<ml>FBoJh)=2\r%*o1qkY>D#Nc%I;4g^k=jG7EOPC@RbIkY@0;-sao-j\UQT5p%L>(,EnF5N2SRH?3H3F@q?nKZ>Y)JsJbQ=.cm*cpEq9_8ld31`:IW\r%ksX5#\Q$=kCA9E.ZC%"=h@P_!3"c"<ct)Fu70$b5#+>s$(mef0mI[XY]t#[4DnXt"4a%uipS3fNchlq6+XHm35+ZBab^-^B_<`%Z\r%&WRZLg-!p$DY@AX%_H,94];uI2q[FG)Gajfh1jt#df%@X.hCT`Y+kGC/Y!'q9co@MRDf)i:6YoKPKB6dL)UEslIh?I]moE(6tL&n\r%%lUq+iMeY>_)ELWc3=hfQa3T=qDa+!rsKKK+<et]HCD4L?Q*"pIF!`Z95P"*kAjju'lStqXE)\\Ko___9Iam33ek^h$XouI<ChL0\r%j2J+j@6aF0rA4Kk-L,b$7<(gU1cZOl2t`OTe]$*R5>)T9:-<%;k]>XtkE)@K2#?!On2]?ZZ\q"[-<,ZB@@ofC!bUEh0j:7C4V&iJ\r%[9b8dIG>"5'r"DD2tc_EP<>G?j()Y<d_Mk:9U_-(MrFM=kiA>REYstT%5KEpHe*982GLg[a1jhlR'a5I+9/>>o!X-IdeR-Kg)oaR\r%9ha?&H/1kB"]L\"XGfp5Xg5D.ZZC-@\jmtqIKFRP4(feJITN5]jimr,B7:bVD"c<`^I4Z"o5L!aK7m&.D<Bra77eKtF=n5^"bi2T\r%r/GF09nud+aDC4pK<\uFP^S9F737%@A_Wm?e$XQE]:X+6[_*3/2+#VQA)9abNJa^:^3tY,a\6t)_Jd#>HU\?NRjhoeV:1;tY40GT\r%p?Q_re;h6XqoVZPrN5h';U/\%CY;*%`B\3%fg!i\cqf%hjjWKW8Q92/;6$gt,q1T5g'&#JOmN\'q/ZL6:bS2\!I&CRe-d>DE8n6o\r%\l)<h$?R*NJZDcpWBL,*.#$1^q?b^X!YpHs=)*HL[7:@/?N/jl\GS_^0l;Fa6E]%hW?W_@R\XIKYW$)59BT"e3[9KTo/5Y)AQRE<\r%K1't(ehnf>Qr]nPia/8:>'fm.rokqTL;f/C.]BtA/p=Ddi(Gn`R6tLD]Z!R<h0pT\f?j^_XW_A`\Y7JdJAhSK:m?IO:Jfjq2u^D'\r%Vp]hg12,poGD(7D>/3KHbkra/-o6JAm>!f-Y)6*HEo')LmdBb77nO%]I3qi_Y:1i'Rps'lVUUDa*\8.jg2-sB[^&?3,T2LL8`#.G\r%>FW8GO^r80/u^\a#0Ga&ZGh`&CX]M,ee[EHdb*.)6t'meXN=eN9glXE-I7g7(XP;\CfQW-s2)8q$0)2L?UP=U?h[hpc?Oo=m%QrX\r%[!6#!#Moo!TZ%:`L@L3>B^l/*QJN2U/RH4Q]q,f</RC+g(V<-F[!4mV04#4m/RHfm0l"XgEN_/#Q'up85`6FD6fK+@d,G5@4]jb`\r%@##OR9DKA_Lk-<pW9lh+&-FLj=?]r8pH@``%*&TH]m.WaUG5c2n,gZ-5n(,F!F0?q&HhF5amjfk""dhUe[F<G""di@HP=%9#21F>\r%Y.f+u5`6H6+[.DcTZ%:h??\%eR>ArNnH+1.H_9aUnH(a]4qIfJ?@Z;bmtcN10?@9!?4d8k?3$3(J<\7J%sWk_R?T5-;GNDE![Jci\r%V<?:s!pkpOV<?:W>]QT*0R>?WNWZprm,fu54dRmO/iZ"\Y3+/4"RPed\sa"oOeD>OM_5r)Re3H>1*6k(\KE&KJY(&2qcI;<d%)/D\r%SkE.+ah68sL@,,"4ZH^1(h.?d_-.5CAL9Bh%4OrpemJS-2?1>XBX#$(f;FO?'S1G<a7Fn2)DECg%CXl]1D[(.`XU,Oh-fh=`:=%?\r%Yeg#Om,eT%@)K>te(.oZ+X:n)$-6KV:KSR>JU6l4di^VJ>LmHuCo\j=k%;'S"MrL\q"tB5=friZl8d,EPgGD0goq<@Wtsa1B\40[\r%B$_(j6\ekO!1gba"!B_BqL_%XTnMpu>5GDkg*'%c+Ru,:dmej7>$2D4&L#N,,Ee(Bc58_h#m.Nd9*d@sd?kFR72FjMfX_Bala390\r%aNbQQWqC(rBuGQKi'>PoB,kpLWr;+'i4AlB-s/@9s1!lb%^Q$\RgrNg[pH6*B@V"$p/4!n*kl:9X(RXUmsT(:1N'j3'I%I"DoHI;\r%n=":Yg+0_PDgRMAMeY:s?[fa@s5JMuLY+iM2oi$`!!@S-%,Y3-ZeJe@I+pW$0ZE[?XACb^WiY]!"S0cWrU'GrVVFU:!.ZYYojmZk\r%^)NY^)\N\..NWKRY?mfBI"n8AFD3Ze:.M1b`/+`6-!4TnAgE_F^OK!glJJ.&C6OYRD*&V-?E&#A6I[o:E79PYa6"EtS)2;p%(5oI\r%CtSVSL"cH42NF\%D9#^^Tu_.fRi\opW&f`$:fV6[-aiS5Gg<1MOn^!oGtqOZfI>70q-V5,5!OhS;;8SE#-DCDh*G^2baV^:(cFSP\r%dcAf!0,?lIb2<ERl.u%q'/OH&UHA;DAi1NHNM2f<"`;f5eF;+%ZZgepWo5[B[J-0)]q4qf\%Q2jqq]DheOsRh`nGb(0d5&bf^I'B\r%Rq`ma?%OB'1b9Cj=f$/u_3.g<<i4fr.Qf?JqdTYh<Hu`=QHVV9.SNjafn0<g<Q[?l+KLO\GH!9Tm$;jA*UigOXr,n(Ff!1,q:MH;\r%dS!&_dM*L'GuOE9QC?",V%J>@[Qg0+ciq,H5b,Zfkt2iql8i=VP0b#[rJIjd-\GgJD$KFhk9'=4a\;g7HO>aS0<68SCbenuYdUOm\r%-"PAQZAW\YI!#Vl266ZDoB-X3kSCamQ)#J(J<'Sie*C*r*Z),.XCINF(VHD5ipB4ui]OZI?RpY=gB_CKX0AA/p7%3>)qZiKQR)+l\r%/3*\<9iI"a>SPSk^4Qu!pqGoZK\^,^XHahh]ntu^0oVEuS)FWd.m\!,dOjt&NI*`Hr!$hc]$RLS2rWqKBarC8Z,X+hr/MT4,mV%E\r%I;0(F_G,7E:q%V;n@I\r9%k7FP4Q!//?4N;df?u\7:Aoe>7RQ5eZ%Q@SP`upJQMD*D%j70o;R%ODl^/`8SDAcf(\(Fo@>%-I*gue\r%"2&'*DquR=>X*H6T/a37k&AUumRFJarG?q%jRAAmr:h[!$,=3ngP<g4G[\O,\%,o8Jo7>6s7CTENtCdEQ,Wf%`7o]RIcT@'$A.4(\r%5^tV(%;+L[:8obFBq[*qp?f5)f@uq?;Xh;h6u1P7q"7Y11unDVh,le3M,%k1*)0'Q&]D53E13!6/VnHOi?0A^'8ZNme!FSYAS:mn\r%E@dmOC`A["%in;hPb%@YIVk&_a^VM_E9!>E"36m:qn=%Bk!QDt)],CdH:)eo!_]tconJb"92=Nd!_BcKIoA]u5IKLt^#%,#CE8d0\r%$-gT;MF0A*bE0\].\"0.X]6OT3"=!i:up$g6&Fs)?O)5lYEI*TqLWc&@#jghk:"+chWsb<k:"+cTHp.KNWRG(\C(VPUB#A2NZja.\r%NWRF%\,Eo/.\0b-LJ"#$8*qIjo!#J%/5N!FKdZtY_(oN<2d8=s?"so+Bh,WDIT[c009ie1E^OreNH_'X>tZ@-OBQe'2cM.NQfUm7\r%Qg*7s>!\%iAu11s=".LC)NhXK@*KrFkj>&#jnes?D17BP9W5)I74W2\"!(9BF,t)X4_qG`@+%b"F(aXg3/qWn3#Ft_YJ'RIm3:r&\r%&f+Ms[S.WsBB+6f9H/h$K:1U8RGj3@,OoSpj_)`COa&cL8P;]bI94:+4@L^#mn-^8s0;dgpkCc$[AI_?nl#iF1Ps<VMZp8&]IUeW\r%YnGWuq2:d6k!%g"`VXONhV?RS*:L3Bl1[V/s!\AH21^:@4KAO_.q.NjBWnF$>"p.&9,1!%$&^M.q=jQRF"+3Z8m&Teh.cuH.fj4(\r%3m0]1dU\(r-!3c5n\,/>SS(e$iqL/[/YIG:+Bi2YCB<6AaflQ+V&%Fk&l;H]:hTn.<5PBm`O-K.I3gG6k-&>g5hAf.Vb1(\^FUsj\r%oj%l^Ash\VYeDVrEVG[O,J(%2KjBD/V6I[^:tW\O.654=d[K`+"rCujgp^f+C&NG`V*a(tK.;Ram=Ta6+$'n6%h%C3NZi!T6O.Q0\r%3emVI*CJrsiNHbT._(K^li$B=f.g5=Zb\@NElZNA/_p0ZdkUKA%kZ!es#Po6FU\67(^d9Qkk=7amI,6-$1iVU.jQ`7"""&%L=>.H\r%SF9W`B=eAj=Ni1pWtpVV0[E3mTQWu^6s<rfah"r^24I&8l1mu2Kf@FPq%/-Hnipf4$(Weld'\e!lf3gH75GT]H`o#p=)7.RC>f^t\r%3<1X9"7Y!0[C(cpqC39.dQ>>$:<D2l<.CDK3?AlM"%k/8iQ#1#iD.e*]@/+kLI2_k&>_^Z8g2C-a/W+[;CMa:.W.k4d$&kP^Gh!9\r%#UNEs5q$_tdC0RePM6rV%&(HK'Td)^X!1ua-%HO6r.5!q,1$l.r,iCmHIa5RpuD$hTR]?WFMCpc+V\<sMT,j1H&!Z\&.8>'_s\4'\r%WK;gO!\[=LV*Ys/$,+<0%A?%r`U![#M$FkaTltG[*($?lUjtf\nBVI;Q:heAm(uO(Ktd*_)+&oE(WQb#6=EW`#V(Kon$<9TKYlr$\r%$SI)6j"K6e'Mo&=^8C,m&o7i-5s<:/JQ[dV<Att$#R(c8#C(qOGGIdAQOP3nJs^\u4G3cC5PSN7HFgiC61?,l\Ea\m&W;@=aS(#_\r%]dnaeqHs5gQ?Z="QJMaa(K.p\D%#1a2^'cig;laK5=']cOt$rBIS9Z.BQ"#a<?8)GF-c_1TpH5=KR'],Vi17JadrV)"EQ=SqiS#V\r%aCtn9[Je1tI&%qoRqpl9lZ1SAA;fhM>MRML'`6m&h]VZ1eV`U*^[Z>BhPM+-WFK7C/@6JWoN%CkB0.X7h@-J3OP;"`-K!SA#ONhb\r%mBnU.PrOJ$Sq#@T="BttfGTD&VpVesNXPRVh6L;/3NeMKm)]0SC:NjW:2^\n6#d]?I\*.&#B)>8d"S".@$V_2>`m)#+4J'ShlSQ9\r%!.B'[2r?!udsP9#($I6_fR]&DXV\6P\eeFt40?cs;<-me\rM70mS7DsIt%s3fJbd"l-P<nHT673_-:aHF0=>/V<cUKK,Oq);$$Q8\r%D4!@flbrM8HL8%"Di1mREK([LT\j6c\kd%0:H@9-pM#.`S3%EpQ)49jHf*oPdqq(HK&\i<8+4ElTbo@GkJ`i7F_J7S3FB#kQMOF+\r%qR;]E_@?mYqG>oa9hT/4/*)TnjlCG;6g7@KFp-\!pZ`(9Aq?l+[OdHrjc>n`O.u.7oh!qt71,@W;^Mt?0$"2?7Q.gNnUkGBC450Y\r%^N;XRVC'djBd_3HWCAXM$K9`/gS-Z+W9BkrV^lcn4o=+"+e9TFhbA$J^UWa>H*=1T^7Ir<lGEE&)PFtMoP-D>Y`M5Ve#Uh_kLcP^\r%b=ADo1i%n9n.U[%2GWiG7A5Uq;hmTFiZL20ITj*6L@PcsELGTOZcPcS6u>XedM<M>iak@0_'>up)4r+;d(SYD7\b[c;d!u'j+sP>\r%0#&lile24841]N`Gk_c1eSS?kX:B[!A-br5h6S9Gj>,`V=f@Lt)gr4te!23XpUdCh,p(\]br`i5IbZ`dhAO"B^l*Od:?e=SlPQ@;\r%ce*PV)RJtbUu';]p#Gkm*5XA1PNGCZ"djdBQ8Fs()?,j^QS5=7XjA]gf$TsHM'daH<uI@ucj6K7Q0^E2,8<*R38QV_IK%?udIg5q\r%n#usWg;hB`I3f9QUbe2/:W;(Hh1p6O4&=cf7dJ];cVX@G?H5<!eq>RGL;;hX)!fC*5.=bmWc[PCeM,pJ=lsl*rTNRJ;SI$Kis1cK\r%Fm\<J4Za.M`REYr287ad(o$oM@*u`SLIjLk5Ud>'iiNC[*nrK'"W_tb=XLSF&%;>Z85iPpCF9P:9*5lg^YRd5j%d3*S#tZ=hul>\\r%&3!pRn"j@VZA.7[n-]//hF<C3mJ(2U(>X#+\.V8_+!`k2k2s.BDla4a]d<8Ss2iV,lXmJOolV1<lJlkjgMG<(=g=p]A';DC4;\D%\r%TMblg#L9h(r3!cOg2L"1p:^^@@>uWSq0DKKeqQu#o402n8s9Ro?cpup(qXL(`+V$a&&d6(ME@GQT#"ehW\&*EY`\\#LsUl"Yecsk\r%PpcuL\ld.&Gh"5'R'Kk^pmbhO]ZsZUrZ?L=\_a?hD4c?6E"^qH)bAa)p[3.$(T7#9''K4sV>sO'=@-JhFjAfmf!egR9G)>ZZst%/\r%aSonf7nebV%-CX4L/MC:Cp=3\<,rLfM"S84@(LK$Oml>JZ,ZX;!kidCEins[/HN\?Q_(Xj6XXjKUDnUtrSU4PE6sf[=mFPg)NEA@\r%`il*-cpSP0gW9k@>iRgo58O--rL;rpCq#Jj'fFf4l-0TU?+rWMUtdpn:[gq&6rVup`<Cb4kKKF0\?J/^Q7M`C*HY5&(l'nbT)LqM\r%\C33F0@75`GHW&Vpk@9ce+_iVT_R\&e]U'G00R5@U>F#%pnn5>qGuaP\Oo^F1k.okj$=>/;3fK<HMBsP-/?)'WtH=EqfPW8k@1(r\r%7#k86Xp,ee[[aN6MRJ<4!\W(F$-d&!8&449hgu`#a?h[pko,8(91ISM6$&.'0&%Q]D5mM_(>77K!KZ3I2pRK)^jG*XZ7Q.*(7N6G\r%A6X^9e@<J6/r,lf[Y7cA8;(>BJE:0$;Zc;Ed!mMki8S(B*fNPhV?GO9l2QC#J;\dH7]qcLq^f%TTVld=RXq/DL;Gk?hpqJd/_ZZ\\r%oD=kk&W!mB).SqK&R87i,eX3K![)]O<ji1`TLtIc@*,hM-eh6XY;\O@Z7o#N@t$/q!&HH9njjHJVOpXj[ToT+<Ajjt2>qHg;Dl)9\r%RI#+VZ+P`ZN'E<tm<nO=F`aSN6on)jcl*[`g[W91qC*mO0WiE;)Q8pf%4)ulL@Z<3f@VkMnSmVEnIZf5Tr$i1@oWgc8pan8eJgbU\r%=V"g:@5F7>'9TtF^Xr(dV_<:%\eFM0IN>LX)lB/FUX<CsX$&>4eg;KmT!.F*L(atTpDh2coW1NuR.*!QDeHOdg4h`FBX:gIdf&t.\r%BXX_d6/qDgS&`YUU_6'F:po5M]0Rp[aiH-[9*V?ukC6t5`2ou&DQ9ju5cV4<LnVcSl4scS,(Ng2ik])s"Z$Qi,(NT5!)+3bSbIZ0\r%RXn,+9a$OjYIOq(]3k6GYihC!VjP:<,KMUGSQ&d:^PZ>,J,`Lk9T8#^G>)1PEVDi0+ApQBPIk2X\+E?t[[fiOh@b2`o7AEea^@dr\r%jT1V74&,kg_ID4YnTCPTYGsb4DN,<03@s,K%R.m]cs$](KJF^b@'XC("inj%"IBHIE'bu0p]PdJF%nKDN/5-p#_.jDI%pIE%"rX(\r%UZb7[h*$jfD$fFb9%8BY-tt^g"B^]]EpKl*?qrP"_C$hV1N2ZqSjYOVqmDZ#5#s/b4!*lT,<0,QlWZ!"OQG=&P=T#Za5^GcQMlrI\r%f2%)DlB"4jX_#o)^*BE'W>(ZQnm`QiR4Mr_+GXM!0kYO#pp]k`]+QnZ8^G+IB$cM5=I53!EE]=`%3\e(Oj?.KeoI1pa`1#]J%tA"\r%/#D4GKp\8iSfeXfd=IZ^l<E:cE:*CmKs$j^luYjmgoAP[b"!N$+I\D9]EPld[*#."?eErU2m7$R"%0$2#R-)NUBkuD19CEMXe[r*\r%^aDViV>bnJ8#kQh6PbV1Y,i97MKX48P*g1r56_S=_Y@X'n7*]8T;CKm\aKtGYbmaS_i$He^i/:&n]/l4a69k6_?L(g!2&@BM=GV]\r%>7SX$NP>.R\C"_L3ES5O^,u2kb)QDt[a:#J./[3';%1HsDEnA(IjK:L\p9#:c@^"""brRS$E11*Fi/pWJG4Lh*d#Gm/++I#""F;"\r%iT<E2a'7AVbg;ls6$Ub#i.IfpH8VKLkc\OfT\C=?J3<%q"$QJTfL0fOjD:[O'n?-%;Squj0ln/VIJKZrn,tfl:N)JhHfsKjH$A";\r%&sYhJI%dNm[m51KQUK[.ipSWuD"p5h"0M)K6"d:l*q).*^q=0F.;0/Ve;+S6-?'4#S7*XA/`8<e17Gub/Dr=&Jq"FnJH]9i6`K\.\r%/T;-=OF.J"Rf%%O'b4N&d-]Y@5@1%5I6J$m'9,YW1!&YJ-msp4S?[rM%'mGP7i[3K1Bq!#b%%)-&Cu7*rL<<bD*t-Yi__QYg^@J*\r%Le"$4fGc:r%gU&_<tlp9ZiS14/%sU'NmTfPp+3S_gO;tF)iGh:)-OUg/FBO>NCA9hM2a'H2O=1%`ElGVCLgqUWEe4k_5!mU[A4GI\r%C`^;6EB:^&HG6V\Os0"GU8IMMaLU;/;sAVNiOa'0WH8RcQqM@*WMstkW<?Od>>:s[2&1Ae<0AS)dFD2;^ii)75i\^/_/b,rf_qu&\r%^Rl$R2\PJ;157"e\DI>#157%"\_k#/$'q0C&q4.9j!tFN.$q)/^d\Jf;E:457>sj7@%a3p'GF:Y;i6+)]RZYA15(,.>'"i._obd6\r%PD?X0KfbB2LC2l0F0^Vjb(?>LK&17hF'8.BA-t&X,<?hU=u$mC`%L#EQ_j-1=5P/8CchUfOJp#RfPoAr_&;:,&G+J._.q(Z+m,m;\r%"4[he\+B78dV]AJdl\WHhYqoTL[i@NC`JE.'-Zlj(C*=G48eY>rF>cqHe2l]8(T$m_nOBu%p[Pq@:(=Rl`'#PI:qYbdtH&o9"!*]\r%]mb=5fPf-E>.Zm;=oKM_B>8"[>#!,&W_k-Fs86pLe,Sh[>T9ltn(Xg<l<9h'rGYO.5"on-HkTbJZ68uP(R($08ju>n8?%"9H#(j_\r%\3"W')sMJMQdMfVkO,IXk`VHq/]c(LKM4'!i8"J,F%$SS-5p0^DI;80*`LH8?:OM?gLhb=4t/M&)l$bX:B`He?L)5jiKs9_?r>UA\r%A>"V,$>NP4,*/Ul8b0*a($87VLQu\hJN:d3Lr)AbmdP)C[G_dYhk0EbgJY\5e"/^%gT[L/&RQLs\@V]cc'qW5W15l>"IAGq<--3$\r%VEIdS),!_mWZX'[ar2BY0/t8CZ/h,UU=4DKP<cq;ND=."T&gK5J"JcQ+KT+="UP>'M4gX<L6N=oHe@BUD\g1(=TfFA"A+DNg6?JV\r%E[g0;Abq?t(o7hYf^X5e/P^Jg.(@C/qrg1BO.o,jO)F.O`?s.>rI\5U`K(lV\CMq7Q-\&SGUo4L"(jW2R\%=JftKVO4<)=<Djh?H\r%*7*!kfQM0)Fue%)=`,T!Zru4HP$^rJ+*4:S<koTr#^YrDTXSp]A>,X&P8R'_'Y0KT+$d#&eu!tMg6&mC4V73-PfA5)"49PE`o"U!\r%T@,hHX>79fn!mrcgg0T!#X7]p@gIa"S4X1fEL]D^l7QTLSFu!rgLU[WTZ=(\aT$-.e\gpSHd8q7nK@@0nI_>_$/2)T4`&WqCc]i.\r%JfG;lNY/LpY:JRT[P%5nOeIO)&:SsJ6(;W?T+$`*B,U2&=jjVQ(B<BaAM(C3+3E)uif0:b3q/DPO,rklQ1kf+i&`u[\TnfXQVDQZ\r%5'Pdqr):,OLRDRJ=tRDb\_bM)^J:tF5g`eUBDEqIN:!ElKR*VS_Orcrq?_Ag>q%guf4%^fh7AZVs(G3imq)p/;bQ]UG:cg1>]'IX\r%epC$cdEp8Aij22F!YOA,RV\,EkuV%o'_+8!cPhMaLJ+Pt#W&tC.GOl$UC\n.2pc,WPH+<#e6;!M'6`-\^B9oULM#B'L+s@j#Ip17\r%99j3!,/?naD%U[8!H&k?%C-A&k%VL(:jLcGXco(I8tYL$i0iK0#N@!#N?Id$S[#6ULb)hj\,:upc(OP+I_p*rnaRu;KcI]_a&%*+\r%X^'A'..gXJ))RMdB\Vo1Mi5U(7?B23K.uq'F;S&5(W?Ss(kt7(>590\'h_pkF'Q'p;N6c%j.^1BcRU\q()PeXPFD1jqKbDoe`>:a\r%Ua8M\:YEt0j\$WVjRhni+Pb8T)kAZDR]4,bPI/K_0-uDTM]cY-/ft3BAT5"A(EMnl;%.@tNmrt[E:dBK.hP!<'cd1@s8!8uMKYJ[\r%ir;u]kf1_5<([q04*'BV2<3+8qL/l.aX`GW#B$?k+)b:*H7DMW&mbro%lPtFDBgEjX2n@4Ta`C;$L_6IY[Ip#k]ApETAM@V+Z%c5\r%MEk;TIBm8c(T+rSJmcJ)/e#%&K4;_,/du5E2`>Jqbul:Ti#^q5+e!@@9>Ji!d_(7*4eG'[@(L/4CdLRm,r8r&,4*._&&g/#4@qsn\r%]D&.eqJPNXd?6`VaWG8)'@6-X:l!'"s*UAYNhH[f:ZJiUp#2sdI4W56__"&,"FM"7gSO'^q;]);m?0iqmBaGagP%g!"5d[dO`k$*\r%[YYoC]adLGn=]%u([<)Z2pd%HUR6<DI4<!I'^^t(*78?Z?RVj*.\^_8^J@CC;%[(neU7*-T2mGAMi-^2r)-g"6l1;YfLQU+;3R_W\r%OoZ7(,2YR-B;3SP\0Il^W/*(gedS9g.eo"ZVBWTfqIFWH97-JsKl5qZ/3gDop<`3/NES]Mg&/l-?5pc@N01^_.0MYK&!W>g<46D:\r%RkWFHJOXU@on@^hC`="J;p`D+nQ6HXq"ck7G0_451,kY=%4)UoKh`0po6E_o(+\8*3OOS+9$#cP:J\RH79WZ=Tqj6*aj&e>09h^?\r%Jud5J.V;q,;d1Y4qghqi][H!<=iE_TQ.$+,%)j0$X\c[7qA+s#+-&\8lJ"Jj0KPbMkEl%9E6.rXq+@6XhbKTsFR>pZl<$VPC73F!\r%EA%neW<G*%6<];8e08`b_PGcPRY'$eZ'L3FjonIK[L;%q9W7J7+J?gON;</_'B1+_dUP^EHV27dc+5l?CJU!XD.XOk&jfi<:Mja,\r%78/NA(^%dPod-lm))]:g[7/ahEk=I#K&i^N:YnRObl(6FhUm$X/5kFO-M12&ne2[_9]I*_9lP(V9"\$_^pAk(p#Hm<(lK):JKNQ0\r%`ZdiRpl4VZA!%rdoMj+EXPu<[1#_+tL#lVlrI"2r!Xk7P;bW"M$^[r5:-LiFka8C">Kp]\)(-acU!u_XZ>cAd@Et5a5UPV+)lLm&\r%i-tNc,kraD:FRd+0FhslQJ#[o\!>ctJ412DXP:f)9.T55g^QaZM!PqNdBk7@6c0oIEL,'-_:>Ag/[OS*Ds><[C0S7o3mh/5kW]l0\r%;Gt(F,c]8LX<QLeJO<[>d#rmi$gD^k#7ZXVd%\:7&DG9:O$5M?S)2"B^#T<_:O3D^pSg6?>g-OO+0K3/JZ6tTeEl:R`>F7*RMYq3\r%<r;d"Gkng*Z,2c<Bjq5elMk?-/"7r*!Ii_bfu1Ht:Ce&"6a)4=hpKB2Gpn-D#MR*WqlKgIRTT)O,p8!$/`qs4U*>AO9U1.$M^bV_\r%5j3fN$VYu"65M_4#mS!)MS!8i$\!l+B0TM^Jq4=+/AXXh$or9rM#gmC=+PJ!Jl9RI*nn8/bq%cAn$-uJ1l2)taXmplXNjV<jU/`)\r%H.NbhhGg=tYdT[mb'?hj:OWX/Z]j["Vm\\CFnNfE2UdLUT.0A7r(XB:XjgDk/Vt&CIb#"1Q5eRAWOGdKg@WQdEcb,Xl;t[54d4Ig\r%Lebu(7&M9(($=KanF326qI'j+j=Gur84XVlMqF2dJ$k/Qcu9AJ'1&9n6Z.[*"o'`qO/eChOHrZ"l6\e#I9]rV2+$?NokY;kbcbTR\r%8+B;\M)3>__asD>"M71sn^I#cR^$t'I6;F3ja(869iBe]m.+9o<b_KG)aH6;^V*?3"Nd@a1GYRC8nC%-YT/34MUZaTEVETg-dUZX\r%mIe`+KNm`Ndp*!e4a^2CSLd:p]<I`a#V8J"_(qI>#V8IaA&T%\3$B#&FN,dl7hN;>QWiF5gh5(cpeL7@QToi_MRYj03$n=XrNZ1*\r%EnnbD9FZDjTCq3BN")l1*8EjIk4;5(h<O`qIb",JMR42,Qb"-)W#C^RjY0!`&R"/AeXBFs&`A)CcD-)Q8+o_n$LLb,G6\/(p>Ha@\r%g6>;Ng5!:VNrGuNIJC/R&_\UorU>c>IH\"VBbBnWrU;X=@nQ7pdXlJ8fo9:_Xu,"/I;3Q.UO5J$oKtu&UM]*tj<OV!aCj-0mJ\_R\r%GHEkc?ko9A`6;V;mXc&6HtE/ddXPrf#m"02:Sn*X#7%O]%V/:@l<^Wj4M,A2-t^F*,2_&aDV%ZMMbkK9\$dL@j9M2i5*u3jh4C2Q\r%jMp^g5-]+>]Yl@\;jCWomt_2sGShXWODW;K4CC&:?;9]bpPQ*S&*W:_,9Hb(d5g,n\.:_m?/T%MD_ebW#H:d_$o3I+=p%FXQieC[\r%Z!&"7^atHY80T)lUiBZR&iY[-]VTV$CYL1hGRb0sg^N]bV!n,G`dqc5-B:_omKTB7rUBM6dDE`"qd6L[Za()%@=)\!=<+g51Me`9\r%co`qUs'1A3*bP=TL(/o/krt9dJVWC38r0(6q&qd\Q1Akbl*l.Q:d*A>c*-g)cH:S0iq2B0nWmP-@kWuf(=pf-hcek#8\"S\PnNB<\r%(ATusX1c;!Xk\+KI!iUKMSo^'^mTYsOPJfR@bn,N7Zj[iM=7O#2&Zd!de0M9`=DZUgcIhYb[o"'Me'/J=i_$"U*rC(kfa+uOiH?L\r%C$-GVW@H&';3\YP&QV>+h"`LY11N&bW[R`lV(.?(N(d(`jjRFc]55QhU)$hRhDl<>_->,?&3WdiSmkj%a$Du\Hr4E/`X&<bdO;-<\r%.!q"T0`A;ch4B/nAZbc<61rF\C"uKu'NJ_/*K(Mr7T!.q$%>OBW%+Rh>KjE18rcko)?f<ghV%*P5FFJOI1N?#9-AOYpnTb[,b'ls\r%7M.hLf$Yt:=E3qTf6+9UWljN_1O0oSd/1DDK?qD%!G;r`jdX`:Brs55%qfO[#Dhj@V]teSN=gbeIr[I@`j/6K@rDd@7'^SJdHPnK\r%:F8)23SG47Q'HZuY_QhXe@CCW.eFId\l*IUF7WpB]8KGQ=Wb=_<t!r8ZI3+Sj7-aI0pr[%&/[<^<%PQs`M'OL)k60I5^+D*WIAm_\r%"]"MFT).GT"FLPr4ep*6;eR/b8REG6=p:6a&Bf'"7(pEKNmuK\R([2cAl?g@Udn:<pRb.-X*tfL^$PL'PQ/<&-2pWeq_q+8h^#mb\r%POrr-;Ftc>*Rt'_dc6dlf7oJ=rL9VWDj&tl8UCDp8U;j=q-QbB)dV'[l@Gb@-0^u"Ki@ZqE<4m*+/+068MAccB-*MBlhlq<]T22#\r%8["e?^G!%q:"&nt8aflT(.*l4eT!!;QT(o'oO'o:N"1I(r>!8]R(NFYoH<BhDuSi0Ve7r>BQ8@)Gq@<%4m_(XT=_nuoIMG(N,a.I\r%f/Pqc=m#%F@PbB680+Vkka-mLIQse?FFGZ\`i'nVoR85hBi!oZo'f:hXuKJ]RW:q9j7L"^;X+b)hr^j[3=C/JPhNsU4/UA=%4"\E\r%i't5$8b(.F@q^lHSN!h%hKO#T.5Jh']kio\JR?Ps$cbD*O,rUPd5;XS>ZEt-H;;UkW]3-c^QbT<iY8<"q%-i`;9@7dZ-8l?cY#Na\r%NF*%MacqgbL"Gbqg4"+.ben!Dle_=s!)J]@W0YjT-cZq7?OA`r060a3;+<s&.I2-HImdqaPg5BL,eZ4`9bD=$lfaD-'dq$9X^=[,\r%X,5:qnC8+5dV7ai<@k4h$,MN2"!7tH!V&!6;q^Eefrhn7W;BaNPFs%-'p,[2Sh$@l3q_:<q::XVhp*@dTSYVP>NtHo(iN:$b,M-B\r%8?3g)%5/1M\9d3=XV@)4^m?Ou6$8t"..F'*FF\S3T'=Vu^&C!jpTe^a]Fu=8eT*rYY>_.t<E65O>s-;VRB(Y]"M;1Ff?JY?DE_W%\r%pB9NhBl>!*B)BMck#aL.<TDi[UK8bC5BZJ-_8C&lEj"b[)_ut==ou<1Mnl-BSpaM+<c'c6Fg>^-S4m*g3!`VZIk"T<=qmu3#+HA/\r%=(ZP;qmL2NR']i])kg!lf$U?`@+$f=0u#Uu!g=Cg/m)sor\t9hS!M$hFmE_hZEeD_Cg$s>4Lk6H2D"tZ*hJV+'dC97Rt#:Qn,h1f\r%aeXWf5$".R_Tg/0BYeLebVA4'aD1:&6:ubdr5eB7`@[J^IS!2E8IP6V(i<FZ-7r>`M/?FU./K`r$N9r*qCGllb84`4;DOC_=0^!J\r%oH<N>V[(CB&\uG5U+4ciGT1=^C@40rgtSGYaUG`e1gOXHdEAs#>@cE[+q$'E7s$d5W!>JHkT!o8DBY*BWG,^J--(>B:eeO'Q$3[X\r%%'g,KKpTFJZZ)46O;5EQq[ra8rZ,1<r[b/<i>#ZoU)mhQ0DG*OOmhm'3OD?U=hq]IGA*-8ZW&<=?\]Dr5KbJlNng<slH_fg(kY26\r%e=SVQ)u&I@,5#RT,)\gHe=Qo#cbDi*e=Qo''o2;L"o^'S;=s8&,5#U-oS/:9=kl*06]9HdAT=MD41%QW=hNL=SGcU!p)ag#f"tS@\r%_k/4X;dEp4iLr'Ii6WZ:["R*Q,`)MN<H\V\6]9HdKiMm%*Eib9Ihm?g0fZO2rE6LTV:D8.lH]P!W.0R<WBUdZ.en1#O[;hk<g;C5\r%ji:e"n'E9OBBct%rZ#+;r[`_c(`Z_Tr[^?GEG1L2ZYXq\8r"1]57=U8$k=jeJ!R+D$nui9YAGc0(LZSPp1F[UO[H0i^X'c+WA?b1\r%1AN+0CFB&Jb$k[;4;MiN$h*]5nQ6JV<d9s]`I_A!=1HD4`I`GQT#]j8@L6Kd@=pHR9@]"XKajc[]kMi"=HLp)AtZFNN/kl//fT#\\r%Qi.-Zb@8:M`Y:?+5f-uU.j;T//Ggf;B<gr)aZjUghosEb@QgeEDOKJ"@_mM6!+CL<\:Wl(@,pT.Ml#h4#@(lK8.3Jgqo1^6d'ha<\r%.*57d,oqp*TS50pGW;s1kj$WO%2q6S`%74b@EM[(?oopqXssPG?H>WADu9@-D_?&rRog5G5-i<7VpR@b0E,M4ad%R"-+*.3#ee%P\r%N_Y[.c0dh.ke5cs4</`+V=s`DRR:V2'E-aX64TtG`rh?_pkXs((Kl%3HYapS]pG1?<:N:B\ioAQ8P,m&jGEtn?E!XQ(f^<a<3S_V\r%!NNf9\LXK(r*f\^?HejsG_TN]'@j5-?+![,%!ERk>;G\$ec:Xoi\(FSEN8nRJi3PE_H7DI]$n],?tG[GW]PNg7O(+e(ImBbCZhj%\r%VRt^+``Xp-K3<fi#dd?NDMsq^H"'As(\EA`n4**Q>1SVLfY_Jf(qX$L#9TdPr2ApR8Bu6A)pH1T:TctKH/5B'cj$i+SjWgVV0uC:\r%E^:Yg'#[&rJe!Z"-D6&fl=--7f!-@YJi9!mc7n&8K!peHCLdh"SmpbdE0gsd@$V@_>gN\]"J0X"fA'j<MijpKdq?8P7Q/CgGPY!W\r%5d+dmFhpR#BS0HL%-A]LN1gOg_3DD+\B_D(^i]sjK%KUn1ge'Vl"7;.;AUKIFa(uMQWq3ae,<'>-+0C1(B&5V6@UP[R@cM#*Bs8F\r%45q:/JasV*"EHu6q+14]9gJ\8V1*[P*qF3,G]u1iqCVn@F:NTR4[9Cb<!8+`hA5XA&79)q1H=XNZ%PpbR7#g;,_WB,b8BeF+<f5q\r%+8nb:LSPPLo:D,kOEUa4TcK&r8I,u$oXU0+B.K5%4<B2Sq:$]+'*=N=/ahFp9F+7;pUGDY]C6@F_OA\#mbLl:W6NFbNRSPY0d0d<\r%`jg4A)6Hl6jFNP9%EG\`%PNj_n/760Lt6g0[8?Y[?#bkEE!XL??j)dE?J7,J3Gm^lH=tBpMrVEE(a$ntL#Z2]>V5BH)NVIug_+"c\r%0Fl,W:#jfLN"DmJ@BB%9=p7P]L@ql.f*VIEr/7RMpK]/*:+Bs;#&&>bXV5m$+UPpcV'>F0l\'7;L63)[:n=hi;`MQR@2t;YmURA]\r%_T#ECE\``oeXo#u8gA_g_i.RDRq&FR`gke3oEqTgdA)k#i2HrUYUcR/.(D<H%%dt$i8.`^Fi*qIJU>Tq*b.'o\\BS2TF('3`M9h'\r%fK*I(Vp]ShpX]t"8E=1k>.7mR;`I5WgdhSO+QO7`*8Aa>T2W#&$dUROIALMJ[JOb'Q'II_KAa<A4'/Uu12osIo^g'W68H6sRXA-'\r%[IH^%VR=bfFOiopC3SF5?!'1_e+#\uk]K;6Zj_%?2l1&)YCbF[a=&S?E8,pa[uuu#c/kb^kYVCj%B]Oe?]Y[SD!#+Y_,"5=Bi`5)\r%HdGht#&.*B]#X`EAJj$h-n@Xr#o5UNWB5_'A5:;jc,pTVB?*MGL67a`bH/(CfAE_A:5]qCl).cuW@MQ6jnEkkTM.SsG:BWFC?=p=\r%V=-f\D7X$^^OJK/H_o2hddP*&&"e4Y1rBHn9JgjJT]ZhXR:tdsd@KVsRJ9#NfC5S(l2IE4CZsHLG(7nd^VKM9li%6FIp8E'hQNar\r%:o@g[b]&'V,3$9g"=5nRFqeTICkm5-#6$>sEm*5Y_m,40mkWo$0p4T##O-PKg@]1Rd_#mXG-;qKP^'NdL^smQKGOd=4"$UL-!mQH\r%?BbVMdljPa<iXU8=a#VhmS,,d3'f4j@I\,s=Xe!js7">9V"=&]Vo/[M_4s<?RmOM0KQ-4BSkFoqSR/LiGWmSHT^M<lM<C'8&%`0T\r%3UqJpi^"18RM3GWs2,)6U$k;f?b$-6"LE4mW"=fC-?E)qo;0P7ZYn!5dP\P-%40eIDn.sD2K!EHjOip,*r:p*Yen&eI`#6"dC3<X\r%K[Tu!6FB%>_2^_0gN#iF]j2EC^Iku7MLn[JC'bpD@k,NFSTQqj\QSYB3N@pQ6o)gDJTU#d3Nk8c+>k.SGKscSV%n(rmtN';?4oq(\r%UW^4]<e`tp5aTs(9ja65[EP(0jLj(VSW8Js(]B.bOn2YB_+gc-1t$;U\;C2s(%DdX^Mu])-YK,6]&h4`;R/!A1\Wi_'fi_nfMc@V\r%f#W-D_Ed=4^le4Bopsof"WTO@G^/$gkKs>rL$kIo&CLB/0FO!h#narH.FB.G5t&JH#GambpPLTK6=`AsJ<J!Z&6Y*`5b*PLP(X*D\r%C1LJ'/06Rfm./4agd`_=<rr2=e$\*Ak*i(-B'g#?$Vu4_-WXHDa1)Br?%$:98Eqa9nWc*m9_fDc\u$\Z+qMNMU3&dhj=#7pPriFq\r%m'FW#nE?=$B[26A(-MRpD8.]D7pF`O]AQO1&3RPH*G:5%49U_JE^rD(UoN'CE^$J\naB&pB,<\AarSkj`_Z*f.X,E2X60YIY&[%r\r%(??feFA58qBruXd*aN\+][,J+Un9iGBGR]Cl&ZlX5/2$PU[.SO'rq$9Y(OEfJ^Du/j=Y\I]T)Kt+;M-=O]:3tl`l>cNgfpAj[jmh\r%mB_q(4ur&V?ELS'@%lETo^bPS,%"$_4Q`uS&lNAL]$bb+^5<pIaAn;[h*L1PH7$naGO;Mm*.-SsG1%d"!]$s3D-[T,&&lR)rjhE$\r%i66<jn17deFe&h$bEcF>BB\%3=12pgSW,7kke_f:i7/C9nN#L[l"iXhjV-_Vo,,10XR^\!BpX#("JO)aM<49VZg;Nb_l9s^HBu6]\r%AqJ+%BA&O?cousHfPG/7H38N?ZFA(P_oU%bbMFhoC8M>bca)E54M4EKZn0*Xk1I#AMAsO&&Tg=bZ=V+<=WX$nf,qB:q!M:n*6ba#\r%))pZ>_`@T'2!\<<DHU"g(@43-7a!RZ5dkM]b@hsWd^/<<W9F/IF)s'acZ1^s4$*?Lp;a6C)EP!'qOV9eQ=YVGeq>u3VR8/LQ4)FA\r%1WY@1dBi2aTAd6rIhO$*O,pSZfpb3)op4r-bFDMUIIUrrOrdQJ1;*NI>F%u4B1tJ37a&(]hIX-[E4_Gm:(Y.[p_1]VYXC@JPuCq^\r%.Ja3BYi+#W5/\6L4B>5<g!8Xh0P"tCV-iG!\83+0Y`>Pe=Xil%W_4cqU<H,>-oF#N6eB+&0Z,AMS97$l5GE5`f6aM%)T<:&U<3+^\r%OM'@P%JB4C`i&G:Dn)k5oDhP!Y`'1=aT7ZU?+(3:$a*-qV-dj7IW2,jR-;t='rkK'c?eMcCO)t+0h@AZhj;;TNqHb`f,(AJ&Q<"*\r%G']8C?\1gAHJ(Xm8F!t^gsMe[^Jr?K&A:Xg;RGPF[8]!t+kfPjaeq4)k>#^6)f#cZd$F@aJ0WSXCO%9I=q9\O[_/lr/A&eO'o!9:\r%H"/G4o8sl,eQ^'o)qsl&>(FO?d+2J$%@LB3<!5>1Q8dA-32*H7[:8G]A'@=HnSpj!>ks`$WO\BEURT#%&\Dh2,7uf7AU*+bd$>L!\r%P)@UsUq21:7ZM.TAM;o`3>Mb",/,Ap/i.t;B(cZdC.8&L=bsMd`LWteg@E6eWZ$a)D+WQ9]i&IhD73$&)1gU58^IK-pJb>!hetJ+\r%-)2JWbM6a;-j4>meC,'cG6@!.Aaifem`L&8nsZoOn@\mOboq]Pb:[oa]:F0t0=?PP5E0r[k&K.<fr>g32ta)sL"l0SbWp+.2Y_:(\r%R#\J8;3#riG[>b>d=pHJ8dO,+6t^t;"5RR4Nd\5^%dEY@_",i%%dEY@Wq2?JEO\8P34n;jWH%OZ&P"jgNg1Lf;%_kM6eB;;BW4'l\r%ZI!U]K^bCWC-Y&l/;Bbp$p++Y8+WnV[bY%M6uSu3Iqd_86*"m_\'FC_3Y0P]4Ge88:;VeDhsqJPYtunjfa=SL2n&CYrpC)p5[V\k\r%`6=h;b8f.P5udZJ3LipjTZ8as$5D=:C_<i.Q4>I[YjkkmLUZ]H8kL!U$a'm:IqfA,fZ\"DI]@&gCFL#ap0C^'K[dd6XZ\sH_N4O<\r%WE6Z-8&Jl@\I&aI#n++JQU8]^\!EVFh@V2.]4?6`PZ(qR\o"\k3dE!iZ1oirb.enAn$t\cj4f'tc;BA'k77Nprq<T"StB57>&5W/\r%i3UdO4G$5r&4@b`_j]R.LVheY"e$-d(p7/!Ej.o8M?d[7l8]o'.3@'W/O([*K'75/DCHWGqj:UfJkPXLGI!OpiKE14cSMJD@',$H\r%j'baRR!Ve[Vg+m!@[?$d>`&b?ms:"LrtLO(H\%T>/ERj8"%_stGtL@l_!C8O7UmCZp^'#-N5daWTI=b1??8p4d((FCn_fSiiOC+k\r%SkA0/@HJ77K2]BXi[hM1\2j%@J.rO#=&aC>G-6(fGefo6[nH'2Oi:>>/DCV5H;!.\?uGgO$d/^uKLPB4.@/Nc;h2mgc*o'6m"gM5\r%9)(JSZ4UB8mdNMbh/tl;/suLdMK8#V=i[l`-m;<=>NYl6DlV"RLec".]@M$nFJcWE^WLS5jf>NOR9?<S(%M"2NrF9,E?_tZW=i0>\r%LI$$MHes#qFr3U`Zn`4l?,eb"oQ1D6:TB>1kX+`1L;]*I@<oFkmjV&E[>0BX^K""`S7%7VV\!TM[8&gV;50-m?D2MC/RS2)he2%B\r%lhC8T&<gVfX'^))7lBB@#N)<V)*^BAGWMn%Vt!gJC@eft^-1;nqun!-p/I%4mGF>3EBgSe'7YKrZ8:<I5,lCm&aVHjE6g)QF\0ZA\r%WRU-bK6(,O4!=]U(B0$/!'P6/GrqHH""6RGS])iC-.-=8cuVtKdl7ZsKTN\_lQjMo7iBW%AVb;#VBr]=_gSK.6#YQ%l\a.e4f@TR\r%7,4\cX9'13!Nu&.0MY+s3HBN&`I4CYTnpbY8N3>![X`>Ns.c5kWNZbFK.Wua=>]7`pZ9t3UVP_6^6H1C=j&=TnE3o#g.mY`9)\Wr\r%O+;-=7,h2*^71TF=4dUi>K6G)JiitH:tGqXc8GE4la2n%3/k>CgXI$U<94])8#YQeDk:`j^IFS<]aUbf,uKXsJ!@0bTX>uE?mrIS\r%a.*h@6QV4#rGRKK"9RngJ.iCn3N](6,sqlH2>c[`a4uWcb0TVj_8!CdJc8c/^fS<N+D5r,0M=?kij#P"9;uih\'r[ZK-%VC,Lt"G\r%Vc1GE($GaJ'U5g7Y@WI5Y9CRQjfkQ1j+V@JA@Z_bUdoMdhAbhQgUXGi$\Z[&4h2Rt)T10;jQPW6>tR`0C%MoP]*N(-COk[?RDI!b\r%c#dCMQn;_&K?DUrQn?S-&P/4B_/-+>rHY:^=tcgoQO#M40&37[%<Wi4VuEUIg;bj>_a%MkrBc=P=9OBYVJ=Hb%0(*@2$a>>c7U(9\r%FtREYTijD"f?RsA3.a[D0k;%:Wig!GF:NVJ+_7Q(PShgV%->TFX_\7OEUN$7M'94@&@?D-Jj'&1J4U.`lsZiJg$3jeLJDWBURg^X\r%`:kqE>9GY2()Tpl4pHQ]2oOl.0LXN(Z,D`,@/*MP]EAj7Aq;+;Gnrs[R0A???+EL8a=K$Pk?YSc)DVX.@96m2`/n,0Llb'00FZ98\r%AmR#"(oHaL0:!G1$OkG5?S!pB()UdKZBrK@4W!Y0dX*AXYDYRJL?`Tc5[qec0[uZ1Se=D&J`2Q5pQ?@K$Oe3GA>-r'=^VLs,USB,\r%eReTfgM\>sLX/=+0I*tp&3^W7dLnc_&"hI&`k<Vh3kC9<=XC80K5#De5$+A)3\@"EYj?E#Ge\Zr/>qdfO1Ua]<I5MTc%X-kVdeAM\r%GW(6Lq(QZF'5:46@ERbGA_QLC'G$q80L]4&37LT50%;2TG#3PR>SSkDAn0EojW977KlAgfg+=+XLB$2=6=VNNa("=J4[.QhP!_E.\r%5i@9l\^=On?I^h'f(>6so0r0kl*2Eu1B1T@2MhQrX^ISOUYC89)nrob=Vss:p*<>II&?;YM_,l]^eS-cP-1iX^%9qJ[3_q/\S&lj\r%IJdVhm6@bA?ET,k;Y%)Uk+GU.`?iCMB$J#a_\hT_1%k_;$f_on]oQd&cZ\;<$#;3-9^>"M9rj&:>(^,#L-"a<92Ft,UQi\;gn\_"\r%<Q4/:Ae%`Ji^?s5XWOY"?(8RmU;5(%(qlU=D)kX$Oe%dUH\O"GcHWld=eA=0ooimbbEgq00D'&d>"<ri;fNa\O^k;9=Tl,2'M(eK\r%DorG8f4k1:jdX`:Brs55%qdC6k)tH)+SGS-eY-*G[rD%V4YsUY</g)o]m.`IasXfulb[VZEjR>L.kC9t@1UU:WH/Z5BG%B!b!8Gb\r%b;;sE`(J*R?=Bea;sNJgK"OGHZpHUe;!/SAV\KP&nd=X1$6cg62Qr3+X\^-p>Xi$CI9Ie=X=><I<-a2i8jG\<cRYee.n&hBlF]I[\r%ZpLn(ROYM&5-5Bf(YZMgqQrT>?cb)i_hm5:\<8nVOIk;qT7o>0OIk<\`Z3^F6Me&Ue*\W^":Z`)$R9XEJd]7)b#AZc:@o;_A(5dX\r%o^nHl<X0HCNb:[L3+P_0J<RQph?%O)hZOB9H400%T_cC(3@$o`I2S[h?'iA'^'soc"PEH[cs,4a@N^)+`h3C49gSH#)/4dkJ:1c/\r%]`ju>g:TauH><P1EQfr/^[;%F-^QEgcm>g`k1_bq&AK_Eo*Xa2$DB&02Qr3+XUomslF]I[ZpLij%FW1KLHLt#!]=t+$Q$H+C%D\r\r%dgBMY%b/FN`ItJElc[48<QlbFUa_!K&jf,O+A4.oOUrE;LHu\sWS-M].>9;c6?(V>V%g3LErdZFlKS7#5o"I7fb1<q!\WUJ7(5'+\r%T#Frr3R"72ft3VEe+<iLbQY04d4\ZO]5I]cF5]T&qe,"sb[kNA%^;>DWA2H$R-W"80c.>[8nX?<Mn)eW.MGZI5SFIB6kN'H(O@R1\r%o01eg\:Z6m&k$!L'lYmo+>O`p&JT<^BE@U"bQU^1H_'JQMn+?S_`(Db`E]QO"'gbp"PXY"VO.b)?VDjlW+%C+>+=3E@#DJp]oj]Y\r%qCgu_4XFH7(DY=TlZj#JQjY&FIoI4!d3[Gr_dJA4@(PhrFa\bk6KRo<j(,4^GrT+'B"MGFp<RppZ<c`5o?DKAZ<cB+n]uE)ZX(RA\r%Y'NS8nm/&-(Y2mek.=1;0(eKdn6K@:f@GqtG%o%7MsjP2$R=*m8u+smkL/Mj=[G36S]_'Q*7umZ0,u\%!k(`5=no-gG-8=%#$u8Q\r%HI+V.jiVc"53`*6lje,@]sV(_FtR';)m#URN5^CTF/_kIIebTo[L8sj5XgdgNZnkg7ETc[+q*9sb'$YFNVdJR68K#Ph_iGt^#m)"\r%fIfI#iO]lY\[7a=<Ir1rZqs;OT,6pLa9Id2NlH1?J=Ts/32Yb.F+D:76<ib+3qu;uqojfH2'aI:.UI!9e5E8[M6>+0MB"]nDp"("\r%O.oX2X[kCGK8t'FpmAmM4oR&Deh,cLF@'(C5^_BU0f+bp[]sr_4^Q`W-!]m"+c^_-rUc2M6:9c;!e>J6dd:24O/EkqCj:V?K!9.G\r%L-UrON2LgA#,j7(Y$Z6jlP@aN[f6,VP?Rcd[qs&96$,YQ08'tIX5d$V/oU=&LA0-5n]Q[-cO56gQHcq9p*4XfDCt($iaglNA]&:U\r%'jE^]mqd7H<6h>Xo?N'q(%cl74R[+]\V;Q:KDEfIf:BeH2\;$dG]4)9Vo'ktAA_20$<9!s;cY7e-Fma+_lgk(3]ukIGeo#O@EO<p\r%-e4Sq@=k%?.(lnFEGErH>7kp7]HHcGE&tOUS9'%%B>_&dglZ6elamMTFElZqn??(/pP&HU!4Cl'><4n8Cj>XO@S_dBSIH*X(:56A\r%l-5"I\s+1?f+?Y<=s[9_":i)IqB;IeDu+=sqG^Y$hhRGF?HuP91RN:oL^3Smpa`DAF9iKj$Tu"^SHIkGc,FI3BZ\eiHFo_h%<SKU\r%Ln>[u/%Wi`kRnI,;iuC:`X!`q5<5WlG\@(sM2:=3&2/jP]9&SjKn@C@$[GT7]_^LJfnJdGYZ/(ScRrb0ltZK*J"0nt+k@F'Vij[T\r%ZF@8=bo_"((W$pJU+M&_Jk#pK\$f,H0(/!k52&>F>o4NBpHT=Pa@MZ@@cMn6,2[+cJ$3Wp5LPP"q-i6EYKqgL&Ycbe9M)2J#]%'"\r%.'\dDkKX1`o%"B[U7ih@:.Ju,7NBn@q</+31d4hN#,`]qF%8MfW9X_]1V@j`.`:TK=ZP^PK2%ueFbJW9F07R@k7!W9:j$fX9#BM.\r%KJ<"=$_20i[BiG],&i-?7u24WI.rB#[q#$Z&`O3C9hFPI7qcr'39pi3+(u]o_,**OjN!%sn>sTg$(ZpV,h<R-?(<8uW[AW(Tse-n\r%DkQ2]'ReP#L#`.6cK\pj5:3$I:"^O&1@jKUL0MV*>/2I.K]T-<huiQ2lVVR,+hmebYV=hLbI>&uLSs@<qR?ks89]7F:)e-Gm<J5?\r%.m05Vq^.n>;%IgbN"%6U>N@=O>]<*/j+2pfN[R&F@lSN5c*_>]^.IHUNqIFdRWMaan'7,,pE=V`G+Q;bcNe1V*1u)VoJ#E,&]j%#\r%/]-UPD9thEk4D4oXR?>/)mCSV[@\#.43`<*p*dO7__::LB=="kL-Vj<ks[h&eLba>0tFLVI9(5iK@o^C=6pF$[&VK!5\Hq-rtbG8\r%fi]B>WQa_`ibRD+lZ1SAj@X8hKL<)IJR?X,Yg&KA<iqTHkVq?n.\#MM/U\#:\0\PSiUh#\`FF6$I2C+HRr`b%2UN&h9;1*U:Yf?t\r%jF`m/QeX]@Ki7`rASA&G?c$9Z>4Le6aYcQ4H(X!bKpaGMkL$k8gm7t4b!5)^7\96V!1)C>@4mDI2;"B7&k(=%i*?Ct!Z7>paiP9d\r%OC[,YS"*`WM5oq%A9-+la]6mr9lU(K09_SM1i_(;q_:+A65)o?i+@"MKdN[FrY[[]Vq%E]aVC7H'+``*&"K="W,9)5S6V`oH7J`Y\r%S6VbE_edGQ[N`o_TJnmA65.8SlPl?*5SM"f6SECF!)9hRG!76#=(l&WR:.s5l-Q4E:HtJaCdJ&Cg,$EnS(K?%34T)&gT@1&q0IRt\r%12u*[1I@5-N^=IlV'o=T67ITp9MVbc"CX#_KJJL(2\9*dl&am2"/"cd+?"o4o8#$oA>!tHFf!qUcHdYuQ'VsUWk>r2J5EoK$"!Ef\r%+;AaA12AIS6n$pe`3e":KM]>O$/g4Q#fRaTkai@gTnGK4Be"'g!)<*p(aV-BR0'8"UTnHROdeiVWol3G/#R\0L36)$a%EK5D<9.@\r%5;C]PYO<iG=(\G<R`T:.A8N"D[RWG/e;EYc;<soq;k8o[4nN<nO66'*d7nJjQ\S/3'tYF.PMV?MJ2UF'cKi#aWLAL"8KPGIJnbqD\r%4>`,B#ma)Bl?$>El)k'OK#fYjh)-<\&1JjP:Jt'ALic_2T_`!X,LS.K,E56<%7j!%bj>V/O%=I(86>U'dYRO"q-mMI\43:+Jk&A\\r%,)Sq#Io<2#FOu%bfH9,hO\XGnj?"Pk4/kG']=(9:O>s_*FB9?I+EEE3G=An4/EgJh*If_P7AOM%"JfP?cRU2fc<IF>kdu2B:M)R7\r%c5a&?R,d(C7(QqhpKPOG$V6&;B!7#4Gl?/`,LTj"dW%#ZECBYc%:bOWp2K^'@k:N2jT?_Xnta#U;?^KH#YRc*VFe\IUig`TH'ulO\r%-AYatE&':s(q9jG,BUK,gtmSDm6)gMPDbVr4/13od%0NG6q8noPUuND/kE+RQ%$HXm_WH\cZ;Z7?7'tG'>2:t]hJ&n-M188H^RRZ\r%SC#A'M"G"#H7+o=3_SmPE[[X8pVp4kZ(aZfoXIN_JZS'TPp"L".iM[#A%OASaGM$?WMpeXaGM$?6&I!@ZD,B>^l$Pa.nX'S'8`*f\r%#)JD,1Tj%LF2_/KhPWeC[Mt#&<rmcD793Bt8m*T$LO(m?%C.1r<MiQl:476*MB5h*5*-LBY#64lgl[l-;L%#-Y+>]")3D\SKW?5J\r%.&`AMitm8h';#P3Z)5j0i@7-h7oo8l9(7D5k]%@:/sOG7*`j5:4*"l>!*>jE:po73FH99D.iM[#T71*bFs&r[0MMZi'S5,+5m6g_\r%EE*VG(C_js\N-&8<7h-EN/,cD>.&nR8B2BCD5*Yr;Th0jrl@iNO:i$P6WZgTl7N9GNp$PD*ZqGETrKLN!kmFjCe?jhX3.]c6XWH]\r%pPK.j%q4HK!fVoM=+&$W"r.Z"+Vh(4J]:&b8>S5N)"A0*:hmbV#K!PpT6LV]%Y7oUIc;MY;;<:MLX=C`_!qt<cj/#gTT[%"IJs3l\r%I9Ng-^A@9e$=4de%kP8QHF\ju1GT$'I5YeISj4-KGMuM8?t@hWAHKJk+sRlj.e&:R:t)b-98%^_7UX/I%ZTrk)1aESG@Uj#r!PCn\r%3(-5D[B2GG,*9kOMMuG-a9_9oT[W1c%@JFc4Rt*a7RfX%8"c\c'[o$WA:u*%,W_n9Xf8d5%?1W=1'6e;9t"d]iB$(:X&aRP06S*;\r%i[i\\jhr/`#Ge*L0&Q(imIPW<4Y$71jK3>M/#D3\"^,N4&V3>>TQSHs)W<2%@]ba&Im%\EJc.^i[*6at0L8)rYW\8;lZ\^h5<Z*u\r%Umj#/Ylrfs)FYB]5rn@.&Rc+<<scpU'q34"%5d>$2fa\#nWS9rr,@AZa`,FbW8mW1F%E`\"*"'F.*#4=.ZK\'hl/l#ei8F#eD78!\r%o>Uf_3(oHX>NiR>\cbSMbHT%DJ.c[OP+(,/3?C4%U[(fb7l,XjV1c$IMhL3,AO1E$(ckD&/HgF"_0iol^Zn*7ocR]A_^=_q%f`<h\r%_8Pa+*rIeO-m8_9\mKq#3RMD1CCF$+Lt4:aWb^M3<"KUH0_>19\k%Z1.2f6e?l/5r9"F-X_5jF+]mTR67YBT2T<^e+T:Zeqj[t!d\r%=jZO-QY$$&O^G-_NIq/8*/mit36NBg`d*#DKpoT*Q2\?bn#gBVQ2DhGV0UNsp.ssAI[MNbG5BC)g(m):oTq*(KbG!dC$fdmdpK7S\r%6/Y=a\WU;-3`7u[$=SPJ7Xq[XXr(`(GR'fVrT-Y#JHju-[)J%(;CbsZ:@q<M-Ynu)%7HT_Z4n8*aU3"iL`cI$ar).oZ9jr!37)#Z\r%d`lH);Sqh'_LhCaIWa:aXh_#6V<.Qq=62b9^5?!=3at>%nVa@_=G:2@nLC1e=d=j.[+qIKcfS7iXcmb1e'@F=c_H:MK$d4QKC4#l\r%[>M\>UaofoQZ]'mK.,E6"[8obZa7orA="1i3CWd1?D%,2`r#"u:BZ$pTA*D<ol#"7%68%e-#AM[ag'N>oUjE(O,"@i8JV#Wh,%#;\r%lnbQ<X52tdU+?kE%!ns+6s1Wh)6c4=U5Y*ZWton\$"u)T(1rR`)1#Vj7%$gcU:1>(&:MI#QhOr;S:#2f\@^+1@>84AMrUU!K`4S1\r%(hPoJQ+Lft6Mh?:GF'F-Wt;sQ)#b(ua8j-ET@?knM",qU0[,2W!eauc$;J;ibe*b/X1R[>k^Gj.!($>m#BuLW"q8DN$u\rr%$)Fm\r%N!0U,geqh\_CuD8cu_P__j'G2g7`P2_*,dF_\0/lHtF4D?g"cMis1=D5*].cf",(bB*LH*RLP![&2mGtr[*unf'ca=DB)HYBXoT]\r%jK$^7)?*a86Y-a]Z.^6ML*U)Af^5Q#/FHN2YIJ95#;3$^fS@Skg,sq_i@i"DFp-t!LsD5%/Dpu)@:%:@q9Ir-4#?*_.Sc?@f*#$;\r%"@JWDYF8k!P$l+E9e^9Q0YZO]HFAm'@.0r;<YC?mIQo^+<$f@7p%bToVCDnDmISfX"=IkTK(UBPlC)+\P$mc[ql0t".LA#])^oKR\r%WChb.WT's*R&VE6&:N+4;j@KT1@==@JuM@o:"iIURUE-h6p^HJ'22C=XK?!n28R%S<P<:%]He?=0`Gg=WChd$:A.[$9Vmg!g.U[G\r%Jiu_XJ+k]+>W0MX_,TDX3+K[;JuQ\:>5B3tEM)jt$+k03Jj<R2;VYg$/%XTF,T'm:5;g8V-,G2sZR2'>,T,%>^1r8!8qOmon#Ie&\r%W[&EeI=F,jru7pUC/$B^8[-o+i7A3'=qV7H1g`,V<$fBEH1=rL9N;]VLb(_D;PFQ1#5nA68;SsH-i<Ld;%R#:GAY.C)B-B:,?i"&\r%"f?%;r;+3"kq17cqtGZ(dT\M]W\5G2.D:H'A-O+m.D:GmaM*(1T(J>j"brUs"s4\]$VV+7Hsia&0Qb>0<<p.a;JNolVs7Yk6)00t\r%pf%L1]"gS_kNW.b5"\f)_=K`DRL9Prr7n<)?!Uk<<3?:,FYGkU">2BD1CI]8YU^^ro,+t%?qSJ$cg"n>TSPDkGuY*]!_$NP<$\XW\r%G'/?B*34_J?!t0>g:%TOe-2^aY5J.386oWeZgb"*G'/AP"RFqM7f&qGl#U+0K3<SL*^28U(Ds7OrdA1M/hg;UkuT<)l2j=s14p*r\r%e-1Tuq0i.U86oVbGi7Ha7d:'(hN^9Q@&,D/@!MYI^dqa=1KU"u+4siAe`:TZ9&1"rD([Nb`&=6=LP"aFF2^*-&Gn$2U>uVc@&>2g\r%+$MAV(RQ=#8')E8%IlVH>Eh7$e5-]VcW;AMfHQB>a*\]Q#noo?"jqJ@B+$i/*"!C(N)B-KN\?qnAr)TtO;_R\8b7>ON>$$/m%-l.\r%TbDb6+*`Tg'A0&?$)E<%$T"4'&=q>2P9"tK+f&g,7`c=Z!`dbg%"mWE?d-:FlT`lP(.dAW+>QI/]BO6-JVP3b6NhsqK#eoX:Z2#r\r%;p?2Sj9_W:k]rSQ%FGDUPbb*sVsrhp?!GOC`J+dsV<&&YgSRn;\Eg;5@kQ#d0,_H8-?#X\H=(l;"PQ1:6fP*u,Y?^WSGlK`?EQ"L\r%C[%HrAh`URjgKapgT9WNF0E+>;!C=!?mkOg/Y+.lh-Gr"k]ApL>rVkeoG[Rp>[=><gGpBg3XGFrpS?Y<%="=b(S0Eh^9UXA/P+"2\r%5nu\>?JeaeW4cPCeV/CXKdOJ$W%R/+/Y$fP?It]P>NiB$5niS^l=Qt&q.L/PqrX_-1i!IL+,Ak0<biL@pYA;>lms$6Y245ahT9>V\r%iDt4'^r;+?#6Q4'pScS+DQ^0"??7LlY*/_U<:d9,ZZ<Zl8N9,=mRmBMqX)7RV_Tdq[EI$]M$)4oXktn8LFZE\Q)fE63JcpLG7h!;\r%=6oVJ<%)mKe*$3?Sc#S(Im3jTlG$uPlCciMbAZY.b"Wr.j>!+h^4,RW4g/)umoiq%b6VU:mV27feZ[XiEC6a+j4hnDLe8NPX!@Q/\r%_s[g@YJ&)hZ7!+ZB8MRh\L\rGFcl,LlbD':cA0P/]5:pu]_g9m4%^R=!0Cp);*?.Vr,*\8mF6?LB=P/YFG@cci9.,=Ed'UgKf-@D\r%HL#K.GN%+ek@C)2X<kUBjj2ep,-F]d(@(6q6[sc-dG=[uQIMHU]K<I$3k9e!;BH*kHP6:9hs7%,W`1I:b($N32Y=C9D5.Zq<en=A\r%YKuNBmY/`ja%)cA4UR>=2\8P(ZE4U>D96<?7)$pu$B]1Ja94LKhM'&E:T>0S];D*</OX3<q'cZ5D0<qh]YJ7C>_l(;d-eX[q*1+j\r%*_7H[m?@u&!HCJ6M!U69_6FR)<embO9&'f:D:_`shK]n]]4XH.'d=TS43'Zu>9,JDGhEIegL9>i<>hJ(69asIS8^HOC/(I=9)/:1\r%/6sp"XP.3=YQM'9$dXj$%9mT3=1n(OYsBj<CBfAUn)\`TiS^aCSD0JA!l8j)7"9EYO@(MrG_/J56q9e5Ppa8c2T"'mWB!Ka0/TnZ\r%YW'AS0EP)4'2iP9G<Ua5=%EKF$kL7AEQt$s'rV?T2iJ"bQ/;JX`N\H=f@!Z6>RXi>FtIrF\/D_[m99#GF#.XCg9l$X*>cVZX'H*?\r%(LDhJ=1ab@E\qUCg9o:tbg3NTC=gmW8GF%1>jY_[FMZ)'ja-e(bJVT/j_EC&oODLNQ;Tr[X4&#r>jY^@ar)#5QE+:!HP-Dh1fs'J\r%\0'Cb@1,i1m"kd<FtH#@B\7>Gqur4,)S6Y]kd+WT+>;Y+lPH<RCaIm'>3ZO6afsmlCCimoL+QK=Q:I\N]j]+7Xp*-82oCr^>ml&s\r%IYKG?Hl*?)?.Plk7`1Om?-A(SnSQp![;/&52`JX?X'H,0Ogu@<>jY^.[H-+slt"_"'o$WCZBJQ%h.-?k>HZ/<T%(od$e`Y)"`-&m\r%@B15;FT40@._\Ln8uT$%4C)/LcPCtZ!.+<D970")d50%5IVXcH1jXbPWq>_W[=#39]?W]#'Y_g&R1skjpgj?MlkX,".,)LBnHmEL\r%rXd5kZoB0;PYcG[fF`uC4t1+KgZM]agQhq.nc#?JN,_-3hY9LsKM]>O$03Nq,Er\.eqiLn4Hr`QVBr]=_gU0ibt?+$l\a.e/_GP`\r%T<*])1_IYk/4)7.Je9(D3$Ef!NjC%@fKgOH^spC1:'dL!A>sj,PPm]Q\s3W7+?/%q![glI3pt1n]1.?7+_3$CJ$YGB)WB#Ip9^A1\r%AX*&c`?#%:!?E^93)QA@2;7nMKdQ#pY_!O<$&:X>U`(`1=%aS\_BNsB>p[/ZR$//d\O,FEH;X,?KO3X*0T_&.ZPJi;Ekl1$?pg,?\r%3NZl?V"bPm)(:&7!q^37)Jp!j&W0KD)K2OG]*CK@UID2N_+pmR:X2:LFGkY0@A.KeiU7".!Q\\@WQ,D$Z_.76J!W0K_JhmJI.DD'\r%Le@WGg-]Q7BFJ736$)U,>tR`0Br-:.lQCj)(87K`QPl;5f?ge[p/KMus5WHfj-gW+'WSS.5FS/BF!$9PU:6iKo32V4]]6%hD!U.C\r%'MVlhL(_VOO&2pkru?oEs7qE,4i6*i_s]cVdBcrr$-nnP7)=OQ?oS78I=[,LbWNOhL/;Q?T]kcjs5P]S@i"1b9`%8a4D%IIXR"P4\r%QH(Q!6gNB6=e<)NcahWLEZ#"B&Vbu]#kB94T,4PZC@6ORTYa'g`Bf:"6%udhPW!_L3pH-9<Ho%_m0;oMip(W+!XJjOVj!=j$*2RG\r%S5*.PMk*Vp0\$r(HF_EnZd*S0bt#19'&L3u0K8.h$!##:4@nak3TZ2^<#sf:_$UFPcUl<5jQL]+ni=Nbak,e<FA:_Rbh)+?jE"MC\r%]i$k]E3Z/O+;7.,CloB4Pe!EX<RHd(e\^%fFI;l)ng;cVI"$g;M+(=TT@\3n7Rl!X.JY>:>Hak0RRoH)BSeuV/=5"6Sc1sqH5<W'\r%YNWfKIJnnM>uap_d/m'NQ[7=^%c+;Y>%6N/3J<Do;cPc^XSmLGP=9t+8'h1ZlOT$+d/ubE#>M$MhS>IGT5]ssn@JFe8U[,g$<l(N\r%@q=?>H`+$T`aD$Bl_<Qd'4K/KXTA:1XT:`p^QL_Da*Xi)DK6NpM-ZsPe6Bt[:,5$sn&"f2*G'\2oN]qh#gB^.TqYp&-QMRI1CoU4\r%kWsRO/kNb,lj+4\PfurbW+Q;nQRug;T-+?)bAPE!KOAiR@21aX!$9"Br^\Fe$HfFmiX#'j!"UHc9cKdk<^$`&N'lR#8r@+m0qL=H\r%O&]Sa`V@]Sk)]^J>)[/LeQG[?KH9mtX$Bc<YgQu*X9-_i>ar!gW&$^bC;s_Yc3098)+tmFkeem/jEt`!QK;Mu@25ZH'Di7"ZPgq8\r%X?t0d,&G91\g1t/>**Ieh2GqFUf7m8pe&9F=JRJY9/@>IWH5aTJ<K[c@lZh760-j\jYY?<E@&6faU,fbS%uKNCU"e87l-GEKZ!]q\r%f4HQ]#Uc#;<`C3%$Gm*u5o^VmK;m2')/H)<g1ChqJ-hOS)/C$H7a#i=/F2/O7Fbi0],?OcWO.1p3L7?GfO8mWn-H'C-%=7G0h?qn\r%.YRK:L[0eVSWci%i6+r$S2T6lg[XF^<d8*G-@i[Fg95'/MXR*]Fkq!arS64H"&1\WY+*O#Pc8]aF?ErVBT=K(L1C#PdUlW>n[7.B\r%?\-5pakJ4V',*_&=;CVR^!tcK@I#aQ.it%CeW'%fk^#-^Qqn[tVW+*5'fEGc:F#'.),@S]jf;Kcf-eHFMlA=g5m)WoA'hO1YHqMW\r%Ler"RQf)O>3#STP>j6@[WTV:G2tX8;Ic&H9qcAD^!^%I)oQ<0QY;r'+O!ZQA53d%t%J.ef:qmP5-RZ5u01_A7lqpY#iY_rI6,A[E\r%(PZ\G<$b`cWqKe3pFfA6NON_8(EgMM/)YHc@e+3ISOu(6CSejn(Hkp*Ate>&jN^_+L2?5fS-SDh3WqOg"sts;%gVKNX.$OYWMQMd\r%3qg=i&)'P(m:dau\!<8!\%!K;.7OAErSDep._)E@r#l3j#Pt,0!Q*>Vea_r5a^?\?JIKnK;CV4^[@OAOd(O;i'iLhmGV`RL=.^^Z\r%_=%AoDFt+=oV`->3IBK:KdUuISOFW,-1k>l/XLKO#%K*Kl=:+>2phg+r5;c(H6qLdI=<e,,pC'1WP:G.d(`:H#bY76?7dt2k9nUX\r%dOP?2M$F_u5^F`L2Y58f8p,@73Tcg3C8eI(p-jp%*ds@t!/p74ehuq,J-A7@C\$$,BaIMoRC:mscZX0WcO<pMdiXYRlKNW0ZA=Ed\r%d2uSSg&qm40$pG/lm4WgRbJWN"?Q5fmQ.=I&ZAmZ8N3F3;WduO+JXTWnNm$IjCKUmmN,UnnO?9oK=jD-,L5mMeWO0(?ZFY_YDsY^\r%crWWhBZBIYTS&t-^&,1bP^7"'&O`IA:s;S3Q(OXf^4#K?1DJf$+j^Q`M'@rhC[?Y;E?fQp0\o>RYqtUS=7qW].H>S^_3QjJ3cEi/\r%,,900P`/W.s!mG].IO(`6u]P0ptK<73*#@p`@X8.q>Bj8Upk>fhF%anlOF-o.]qude+Mj4/eq.l"](O_puT13LboiBYut>LTi8po\r%CVc4S^@A1IRQm#`^]Vl6\`1_Sqofj=iMJ_D'i1t9:C(#KUSB*,MC7S=-hKt6O^l?DCU5:[.)rCI$(f:n'i4V#&l_!((-K.hO)a4q\r%&:>$WNYP?mQq\\gD8[/bY*_q-%K'-</;K*1f7GBVqh_Q:M.ThQ2=8>V?Fbi5T_5hJkAPp1d*0A/ilP*feA!mAOPVV1V;fVip(?5X\r%kK6]sn\'_)k'fE(m@DD6EN48(]mbR3?bqd)>)(<,??$E]B;!`M7dE\6O*i6\Ao/8YXp%VdCq8dcGsD#pa7'iRM:-%Z;SJB%QP-Ke\r%3^Bj2SI^RZ*&lt0V6$sGTMd"j`4Lq,V;r_0bCQbZVk7m6"p""#>C7Gp>V=;E<q0&A<EOXQSb-uD<0pgerLA(0K9Hg<S&RH82)tE)\r%"Hdn+K9HhgidF1H^jnGE_+>o-mUXU7%8J*-IAb[CWF7-:bPepP/V5tpB6<`;C2el0g<@kEZj:'jC`gY]ciWfDdMldaq[Xpu,(Ngh\r%]3kbF">C4t$R="BJ6@+lAcl6..3<OaCJbSSf>5OtFOfQn")-A++C@jS\<2a[BH]dJ\*=F/(+-D8"0K+(`>N:PH@?'k70'[Vdt"EK\r%('2Xrk]Lg/"_\JVD]\^aUd0h<B!EX$P;_YD$DJZb0e;5kW\Vb^T'[>-&\oq_8W5omV2:HWBG&$2UMGAeBT6o.QmT2#Yl_'"k!^IA\r%?QC0SBcm8f5B$J_:BB0^]1RMB;QthoB30&EL"`@b7-Aad'>]E:)GB+hd$>L!HKcB/<(F='-;XK#/cmb3`OUY?V:UiI^><)P0iIB6\r%hU^uIR1@gJ&Ilfm#$bf/-6-b6(H9/;@h(=KU9Ua$3N(27Nqt^MM;&bc]_-:.NU3="j.VN\ko9IY\1[@[3SsVB=i1pS_<##G-\tkJ\r%=&49VC:/hL8@<^t=RNSX)Ol@S@JP&dBA&KNl:DNh.=8@#4[Hqn!+es7W[G/#q^Hkq^8B?BiTDN.W'7<1_c'p=K&*oK&X\-aY^2B@\r%J]XVTp0!uAk_d.n9=E3t=P=Wk,Hu#"!k:*O/^.)!-Iubr?g_td2C4$p?-o/0#@3GgkFMGS]5[ajs.j2d.7]Im%NM+EgcsOroOb^c\r%XUZ&"c"""$@$m00DSs[?/.BE\\t3^X(_$:3Eo781#lZ$-,$Au,J1qDX.-RY[Vj&I<PqG"lgQc$dGtOJg91gFVYsZj'W(Gpu0jZ?P\r%mIKX.H5"i(kY]HsgUV^:WFhXqM\FK#<YR6hpn".XIDVgVB'$83g8>@r.Vha=G'g=g@u\p^iT(E8.d$U3\rZ9Zo&MF"T\mEn+Qjk_\r%,Yas+$P)p&gift_;F-9C]K-C:TKhjTYmaG8:OXd\%HEQX\C'.4n:G8oP15ad9dr)*=U-(':sR)N88e)MC[tL&C4q&Gh(E4nXJ;3I\r%XKC!eGIP!1dK\!aO6?_k";,$D8%S)##$QTHN`8mpq;324.A;R,n'Eq7.027mmspn2c-3D[]:aafk_q)O0/5gM\AoARQ^FJ7\cY0o\r%QQ788*?$,p]TmOM*VM_*KrOQ&KY7b#Z9p+h+iZ2,ZGXW8g3*a1`HEYLS(dARL)F55cFIE./\_Z@/)I!fo]uh&L)F55ba/7\0H/?4\r%@hU@?2U(*rd+&Yc%:dFf,]&jaKjcOpQOP/T*Pr;C0A.M6kg1W4@^59]8p#kQMdJBD\48)2FDV%\,Whe7*TGnH+CUW@MZj7$p/KE_\r%BL`/Y@<rQ2YV6KHUj>'u?n`"A0UTl^Kjf?a+c/UB\GI^G(krWg+9ol@):qiW`WKYe$n_sW=a\=$WC2NG-Mq>k5$,(:=m[?OA%0K#\r%)ohSN>1kSI9LW.s(;=Bj_e*.U+*Z>.W6Qn^r9\-"+IAi;%:[u;Fg5":Km#t*A(MkS02GF2[&>A[*=juaIZEVk'QpD)bE96_4nu9P\r%=TB54W/C.K'SUnjGm1Ibaq)>1`@Zo%<IQ>!R*nLS_onRu#P,cI-n0Ae)jq5jo#=j8$c`9bH"3tE7Ze:"H"/GDA*&6L?41a:(,%LM\r%E'[^b=A*GMAk$"]=:8b.E^3jc=DJCL=96i6+,cKN(Y`Rl>L$>D^O7pl%l;r1``fV$j,UPX;LC$%]$J6R[d9%^S&Gd(p2E9$hF!Bn\r%#g.\+%T3Fo(VKKfTIk)`ARK%,[,jfS7ZY!jYnhZSF7'Q^_HI!g[,m:T"AWXR)f*]C0h/P3NO9lTJ-Xg!``hT4R*estMIXe_J[IU`\r%8CEt<d<5)'?['k9I\'qMAcR\Z5[2Idd17])]I[(Ef]c_f%;cR8MlBfN<+U%V&Tin)F9jD3&)#oIf3<?Q7[@L\]'Zt"=<`Rm`b-J]\r%]uqBSR=!*e?'"2k4KTQn89T7S;itrMY<,Pe<j[_oF22VBd2u.7:81*t-hE8XF(Mc_O^fr7/$fDL"gRF@\E;)AI'.6(_Ya7?q-6@D\r%BY%T-j_K?QI-e>BM>PcqpLW?[EOC)GWhlW`Q;)IWSpc*o6RpKWqGd<Q*E%_(B7!7XZ9p+hU!AKnb7:L>LK_P<^$LhQFGN+R&E(_9\r%]qA<VQgBf+F?#m"816Qq&fp7o#H[1RhP*BYl1H>aU_4]J3`q=,YUL=oA;=-Y6Zoj0+ZlJ4*R=H&!"bNK^UuU*4V67#SbEL)Vh7<D\r%/dW\k&XY@1_Ae%Dpe/;aK0`lJ\^k"Q2N5,4?N`hB3YXuSZ9p+h+\R_2\`aU&!rA$";Mbl(\>850.fFa8h1ekAb,6+B<t80P%N/FM\r%/@%W"+Z'dWhlGn1A;=@_nDS^3U!@?f_6An)r"2n_S*5p<V5`79+3OqE,aJUr!sc82F=9Bss'o-0QO@U#,/M`ZFF.'Ee:<cP,j6^=\r%F?1J=RP-dt,;a0d]05tiI(G/gMDij*r`7Ilj1C7=LO^n'aUY;C)4k4<8k_1:)."nC3l8s,LQL9N96NiP3YY!J5I"c?\qpo>ocRlk\r%bXR6Dlb]8"ZdE15S%tX%ZdE1UZhTY';Mbl`+!5\Nlp$KKGS4EmYZNS^L\U0+,Jm\RLF-&d-P9sc_;MqmLp43B+!SouK;#3kTBqY3\r%FD0uh$7P5eKhLue@:s;#mh`iM_87mAg.>*p%*rdB*J"BWFXW%H_m"euM])Pr6Qm9jbdLN1^C,N8bXR4NQ<Kq8%#YSrnHD12fkqne\r%q<1=l80p=hh!O'dFf7HgoWgh6d@l;$l",WLU-lS7j[XJb,s$\pAm_i2.a]D+(B.j"<2)`^a*bu=WC2O"Ie"dHU_4]noi[C!%]MjO\r%TRuk`4/<K03[M6)$9U/L(3HAC9pU"?=p"G/Gpgu_i"s,LnkN:[hrj0h/FS8"*3sF0#9LHd/_--+1KiR+FGSd_rm;LdkYMh=aptC=\r%LNnT-CU-'S"d^)Geq-(LNlgiEU-gjk*8dP$60+RfmtA+<4D$rbQPnXO)rt^m//Blq-Z`%K-YY;F:R64A>3]=NB<o/`ee1C-amr2/\r%91Q2`P3&7;WSNoZSh0>`[FDo9<j]8*F9l&c^<,q@U-l@!#ZB%ncF2i'/FOiF"LY?bfccXE:s4TfQQ8t\%UhlTQgBf+F9l!mQgBfk\r%fu!>_OF\>4NhPA42=M>>gpNBP6RpJ,H=$Nk%]MjOlMJQU#+Y\'/+LnG<#]k+a:>1;LOrmd+dM7&hoWSOM+L-k0IQa9,UO6H!lsIs\r%G50C[bnH!F9kj3@Z9p+hiPOr'/m3rTfcBE^LP"_gFuUj1]ZaA\7>J4N:0Q<oQ0?SpKaTBrO>[L#TC!"JlnALQQ@d:@>a,f:-Y.i3\r%1IAm#_)`>G!]*T^L6;UuS/9-%&=A$`@#)[em#Xh]./9&J;Mbn2Rd:uEOc'_>Sa8jikTDo[UT&Z[i7.+)eb/H$?j?Vi_cIc.mlV->\r%N@k)53RUh,9c_9ae9H";>=Vc+"BgMV#f*Z,3XPOLKZZnqT;W0q4qI>>C#eTp*H0eOKdXI)oC5]b\$L3;[^n60r"9oc.P7Lr4jK`)\r%Fa&ekjD#aqo1N!Ui3<Vm^MW0K4reL0??"%d3FY"CH9CFH*('hZnKXLMejOA/OkZQ]@(B<2H7.Bh6&p^qa66.If9Pi*YG['6ffgb4\r%jQPY$88csU+S*/UTj+kpgtd3=82m/]Vmj"S7@hF-f0D?r'2$I0fg%Lu6/2oeMM@B@XKPsWIpJ53ph)u&fAV9p'&4O>GI=hH?%Pc[\r%lu1KgNRq3,?[%fCIp0PLa0Ib:8WCi?IIFL_gD\"jpUamYY_HMPXbTG#;r<'4I<V+h-(d7c2n6+RgT%@Zd8XumHT15k=1UOYb)]W\\r%5I=S^kW!0HeQ>u-m_b7"Rs>iV2UU(Mgp)_LO3h+-q@<Pe'UHZ\]#TOoBsmI$kB[ZTd*q:u%nD_#W6^.1SMW#k%ql6m%9eCbT5^^`\r%Q(lOdla-fp:W$YrXo!A?O7r#<h+XM2C.\F(Xrbb'Mm\l>PPr5uMZL3a0?7PmJb]Yd:!:eZm-*:aP'^e_X'`2];Vtj\;.&6M.3I9\\r%3`2HJe@tlDZ"Rs0.*s>**'Cn-.d+sGge++`1=G9iLnNEi^=01`?E9-ab"V-IR/I>TL*poa];+FalXBO#1;>ge)[Ko%[ug'%lFY:s\r%ptko$K1`E$)Z3hTeZG@4jh_qm#ZuSg\I5lA4"'&V@4h"$07W]HQ.g+4C;G03)stRW(!+C!F=7*Q-2]$gq_62!FL4r5#ZDfQI2`ju\r%N8Nrr7]KE;!^1t3Eg,(B?Z)B)I;eS@(In*Z=M+D,P"iF^rM*`m:#l'EW4\Mf!,[&=5]Zb)\Gp'o%,'aih$H46/Tf6qQPh(jNTH0Y\r%^\[^C6MS.($+%Z*[$Jn#:a_L_l^5s(Cb+)WT=Il/g_":Hpr9LFotg(rHp2YT7Y#],/nAht0oIkX-FO]24^\mc[)cH*<fXOAW/K$3\r%f-ajB]`'@_\0au>/p1?SnMOWNF5P;J0C?hNWK509qRHOP.jogN2kB0B.^pVMG=6f"Co4)\.GEU=+cn]>?jgt:6:tf*pLc;U++0gQ\r%8R4G-rMIDN;6+:MU1Y@rK,p\qI0[HY94no91PqUEAgdMjn;#WbM[#&'%dQ0o#u,#Mp]50528p\qmUXVbN)%9i^^_8k?J5"+N8Ud-\r%TFjgZN"^#D8aA%,p/8#;*.::qmHkn=GH((rJ'OE(Q^"[3d+t6H?>hG+#cT<p1bs^89A.8bdJ;.6Wc3""as3DMV.Fo*iYM+'$+%L_\r%qr3#&`!d(A(LFgCB4tT(e^d)t+6IV@joLNFU^/Nf0l9*8PNSeBS($MZl^(%!>,?jZ82"V3[N*`XJ+j:2jPiFXfa=&8C?]F&.\e)h\r%=Hucn7%l!FCbuuV(]R!I[Wn'a/`=-.\="5`?u"CXG9Y7#K>Cl$TVZ"_#(n_OSHq#D[5Aj2XY@SWIZYorZBfsukncK9KpAJh1YVE>\r%>)"\e%;gB#/_)GoZfT@:CT6P`SnKW;-9tel=:6tT4OBBQej<.Y(UW:`[Es'TK!r=s(-5q.BF?=[)3Qo%)%kGPd@i-FXHaj-8elNV\r%jc-[tI2Hn0V%B:ODlfe4B=jihqkN/2[_/j\BLmB@/ajhg-<Lak93J@_idnPNYnl]Ao0?O:;k:]1D0]VC]Jgn-+jJg?`Jh7<Z'LNP\r%_1oD2Ynh4ck('nQZ'Msc`f@L?YneT^bb;-PHF2dn[2/4m/2nb/JY)4LR=VG7*b^JjWAItuF`aB)$?GIGO`s,r>0+_EVZJ"\laYUU\r%;t;^jjO<gqWDpkVGj*]`'Jj4&nJj?NU[-$<9d$"$#l!s&1aI/!.>q<Dk+-O)[S0253hA3Oep9_7\"sHJb&%9REYZ"Gb[qUUj[(ih\r%[T;7m=jM$s#naYc_JBOsg_L:("k,FK\)hSRM$pu3a%*k-eFHc#V(%1fZ8@`6a!6[n%3SJW&6`i"QSS,LFBU3o*'@Y`'O2GPLg^(r\r%b`s,>JCi%k"MHZc3RnT6Q'?c+#JLpudQ(&6B4/Pu2"lk\GOrn-XA8?m./,@@eL5pn%">$Rs0cr]rI5Ycjm2fcf+iCGS=Z``d/A,3\r%Spe[4SZHZ0\p_Lq6`o!9,:LsLWQmuj*r<b-8+ZQPkb^8pbH(.>ntc")WTW*!q,rDfC>S_OE8cORAZ.A@!JVQ=2<=uSW.@s'OK&n+\r%\=p>94-T,90+LpRL@nBd5Ig`I8"`=/g.o4_]Mt+0@%[_4GQGj_R_2tX!X[AlT+p.I[a3)T:d[lm$91l":j8!*C:pYD'Gs/H:8!.V\r%Ij9DN&f:sb^k!C@4oiJ>BV5PF(o#=h=K\>@0SI.0TQ1KEO9LobE-,U6r':O%QkcXcbmUKN]b*-oN9):sG8f7WHaj5oBMYJd$LX]%\r%ChVD]f'RVjCU-3fFe5fAC4M/?P,QON?XU=Jb">M\-T4^th&.9(eFVAKC8Z20:3P?:n;>p#`,&ck]hmRgn`rK;c7XPb6X:LX3(62-\r%IQ2[(Hh-5KeW=Z$^Y7n@Xqn)^JH\>-6ec)k%6p3MHoJ>#5"g&jO6C[J:oUEa/4[>3ZEdBS(%si=_KCktcIV&WlERA=gV^m5b$oXs\r%S%50Z61a`G@S^.>+-/?bO3*WB`kh/UWeX`G%jNM5Firq>'a#Csk*$m`qabn.5!4soeDUmdJ^aLUmZMf3TqF^lQI]m\\6@Y*HN%^?\r%p++?fV/p`'7V;f]*h6P)I9Sh?>W[m4cX@@FW'5Yk?;\0W:U?,F#UT/X+N5SUS]3:SEB8a/ot:'gZR?12Fp>RUOLLqqP/69<KtJ.S\r%c>C>/'np=QjVKE8b&I_M6fhSgKp]->A@^na0&ZJ<=Y>#\93j.6=>"o[9+^>j/p]r0G1ZT9P:'?EC?fmJQHP>`:_;koY([kI<RSm,\r%iAI$dje>fj\iT/f.LJI]kE@<gi4-Rj@V<6SP.VN`1ccr_MF-*a7EKSt:S)W5cQqY=^T$PP`,U'E4`aR:RQ=B'=Y>#\$bL1'=Y>#\\r%b<:W6VkO`.(Y1![!_":!.5=<6'6%3.a;cL%TI@_bmER7!7n)BQGLWcKj/OLqpr+O;Su8:oe:[@]6JdSd*PV^rX^U(;%k_#fY:t$d\r%6JdSd^gd9^]grllYk$+U$@+-/d:Wd0^L^e)8=g74^L^e)5^YcB(8[a%T>lNQD])XbRO3XWD])Xbr*htf[g]>AdtL#n7AD9$AOO&%\r%/M;oIFm?;K$@+-/eXgu2[$@@`'KW+\HD2uUMF,t-#g0nnr#u:+hmuDtEuXPR#fsdB`[:3JDZucZ:UJIJ2g%7s.gjg+NF;ZgIT8=U\r%'nnH^(P%"Y^foIhAMMnJ;AADt-mdTA<"o\0d$?WAU4+S?.14IEiLhX\XXJkp"u6?)MkZ;6UZbKN#]7?JRR5kg6:#-Rb90e!!mBUg\r%/V@#"W4hpCG*5B1L"[#n_`tCT$DZ.\E@BDpItupTmh1LpS\0\dcYp'b9^/.c+(M)qnt[/oG_2bcOTtp2#$#0"^m$$=RN\m2/BC`M\r%]B=ZkHFd]+G6&g?"+LUX+ts+K_,Ep]^r5n[KG]9ZlZ*E7%!?crXsDe.F<P&fke8*c&ah-95S6%e^%(Y6Bl#nCBY==SlFWgBRCFs/\r%_J/W0ODC-7`.\4.+:C]\ANPf(7?>X8VOtj`G/4P2F.nHuC'V00c;ii_@O;6#isplq<+Eq(37GYr(_WHjn<l.gC:HV-k[emZ%EmJH\r%CUAMCNhQ?>[A$PP2^$%R3@uO`CIKP^F]%s);U+5O@!UDgHm9>1#gY3LRNZ)_"h=TN56%^JMqN=:N=kR2l2H;Y+jP-fIf?@=?=Wsh\r%2"1s-ck9D&Sa3<0mX2HjD8B>r^&!3PmU`9!mlLnpU7E3kqMs<2<-Erlpf,)SaUAs(fsWIZhe%D:^6,PH\o69cI:7Mt^?F\Of?\X"\r%7gWu.r0c,ies]GX2cgMi$/pNDPgC85lG^:DRdND`f+/B>outG6IAR$[W11H-b[aX:9'm%)R\No-RQ+;[/%FUCdIZ^(jiQmk?0Yb1\r%%p>8tHsOfhN##80=o-L:<3eAXE*WX6b]cbT@MSa3#FU@j>1P8c^4U=;[%,cnIJST!Et)+#Gm40:oc%38fZL3>>q_c3&f\==ARLGI\r%dJTL2i_c4nrl7*#6d@4TGc3&emc$"O4E!NeA3]Ysq'.>JoMntlDmfHbl'!kil(FUcgg%;#;`/qEd>7rmLi0\o),0L&#VR2j9)*[I\r%JBlftf%'hLX7ZoYV;4F.ib8FA^C\b/PmT@(>uGZMs'r#Ha%&%$L>HBtm9\#`bheEIb)7u?1PE`A^$k8`4L4SmMLGMM$E^]+l_.F+\r%o)l5ND(+s4^(*U#dWb2)&YC1?h&GNVp#QP/[&sGd<F7YG2Oc=$WkQ&?^YU(Bm]ca[M)LGRl[T6tjq*"YT;'9ST1lj0=d(neh'I!$\r%VQ/,c@@A!'ZX/HA+O)upE;>>$8Aic3%AqhIR/[jRp(f7`b_t0"+q[?JIbt=+E<L!--dlE(C!Vjeq7,a]5PB?H&Z#6l-2@OTpt=i!\r%CdQ\N`%)g\6Rrg!8Ah"kc7k5&84/3Z%An+JBetb.4A=c@de#@J#FICSdLM.KT-+S>OpatT#&.c7c8=V7h/Ga^dKE=B7rOLOUVk@a\r%dVdYJ2Q50eenKWi'r7PLEYmS'_(0"%@+q%hWD"#q+T3F1G)0bn\)i]nF,@nlpA$sNrs8;AkcU3&]NntN-)>VADN5mMjqf)pb=W:2\r%Wo^WDDG&1_9.Ok,XjE-9?Vp#XKq<Cu<uk^UCcMr"s16^\A_&uTQcY9OE'23AR."@qP*1le26D3cqO:L']1?98`t\cJGXl`L)bPAH\r%Z%QEngD'j@++%a8T!`puBO1ng,,jp@UNp"[@Y&VS)pQPU8od2^:VRllM[7!/Ag+JD(+h"LcRd"\&e1Y-_X_5*Y?Q\HFP\XTq$o)_\r%_I5^?o4Wm;jV%13/J@b'0`j+1h-o?gp<e`=<RA=fdmP=$(V&n^Gk7X"ZicA$96GQm4CMgnL)BBJU,1^:!A-,(3s#sq'5jh2=t+O&\r%U4TbCo(PV_IT]s-Ulh_EHi3L!qg5)Ye#Fbga/s+KmPK!-oTN=uEqg78WAL4t)b"mN@4";V7!PE^_]A?L/K\.MLFC+\0:ge\+2H2^\r%DE^8`KWJ0T?5H*:BpMLHRa=CM_(n6WDchi-;S2fdJN(i?s%Ict-BbP2$hqAhQFPFoTo%h!^$/MrKq<]EH@r@!bPk)<rWZ_G?$0Wp\r%7aNp>44TYHl.SSliG7]'&0+P]du;+7b>5"_VJVM*:)K);-?+32i`!Phe;)MajuMc#Cpo#@_rXNsBr$7Qfr%"H@@_V/Q66AOFb'Q>\r%\h4]>2SZmHA4,mAPk3U*-[.-PXgro1:[i0fm,_#Ih2U8'O.07CVeqFD`sF7=/)$^Y"OT>LKK&Vo/('NfYV@na\ETre^,>"Ql?sdN\r%hTIp2CFUm*mgYmOIcN');5A2uo3""cf_X$h&t56Bac!9C,?6.In80u9V)d#uJmS%U"SbYXihSE"2a2ioXIMD`>H-AC)-'*j07ft;\r%B5f4sctGi!n)cNoH'"&%cq]kE&M&I3KreZni_(_]SrK(8g]7Tt`j2mJ>ZtTKaPc?u(A](c.pg1AY$,ES("[7Z>&l0:fuORs[[ZkG\r%>%XjI^+KgaHum),PK`u@Yq3AaO%i=TC$?'Gm\QOo?@'E[.e_^Q2mh\+[Er[1"`8Np/_+"MNjbI_Q@?e1/R1dcjbfnS5nn5j&)#OB\r%1F3G+3_p$9aetM!&Ob&,%fK8Xb+N7JIl-UtDqg9E6hE,Pp6X?iO<8jU$?)Kk4`ha:nN7FSn&gQPnDX,N4AA0OiX#MR;Z'Uka@E$#\r%>)6CGh+B3jh9a7gZ"%H7qjMbYcNUWnhu<4)GF2Rfls+C^F8G7)mr@:Ce_`QV5ULWAIdZnKk\CQf%<XIU0#M`HdGf2,0$^O/T/H:2\r%rbXjtp5]V9ADQtZ>+b5agikDHDdF?#q;j^K7MNeXqYB@pH<Hel&TX*KW`V1MFV#$/T3fO2Pud<7'Wu986BTo.$_G\j)8C>SH^Hb>\r%SK+&tD^icud9m_D@(Mgp4oP.ggcIjkT?A).#]Z`[//JP4lNHrB,TJkE$S;T./R*B-=>Zj3mb9^qf#'dO1^.B$IKn9@@rHQj.k<[`\r%oO"a.p$Kq\Tt1m0qpfQ]U/SN-coP2ccA:b83GlEpL,/bX.OLPA)ZWlH"CbgQ&3%r!<8Y(M+q>9J,1q[e:\(Rep"UH4C&au.P!s')\r%%Z1]OVLS+)Eb3.[SKs+O2ojrHlAiZG0KR+TG?Loc@:Ss*U<'FF%#>?K-;To3$AK"2mG[0LL9WVsdRt?q5"n4XQn^Z12Ck1Y,>:]n\r%<mo3T77a':LPAG"C+H3f@C'['ULXs7S%RB-fN)gej1_tojN]MQ8_h.:*fGUU2X8Z-@Ifj]Ut*rj_91Rk7^)Zt?$$1.G2_JId?NIG\r%;_9f*L;]^4mWkgi04q[VlViYCTQ0q+S'12nFS#0-ZU&2%eT*OU1mQhd@n",!/sYD%OE"J4ndctq9]%`-&FQg8Pmo`sQ>4L#j$,P.\r%?6PaPRM@8sq4j&7+3kr=iC]gh3p%Ne"1Y@D#2Nm+0)n`c&(%;g)G8USPBB1`:-dm(Iu(!dNs%j7q1iq^]b1kmj<)[M\Te%H+OYH`\r%e)qgu@53@/AbZ,??Snb3Dg/BSST2%VMjLbS;`r03XnBM&Xn;F<9G*SN+FsH&-a&<j"uai]"R2tIT#LBf9'trBs.SnoZ;=3[LZY`r\r%T/BhPe.TFg(Kn$PC8pVh'G8\[#U:uHMS<-Qhq.<%=/(M$-IVFB2,Big@(XDRaO+=*%5A+6]-XaGOMH%')G6!*a+<Vc_(B[9CrbfN\r%F(BV?JaL94jFUre@7.2%?opQOUk.op7::sg%j\C8@0\uH_"JoF`XN[k^QI](/D_qD\#PWn?otr`Xc`"%"L\]4/[@O$_"JY8i7C._\r%'\JFX(i*Z/+G&p!O3QQIl-5.:]\GOu&'uem%PoaoGdUcnS&lT$55/#[Y2EnErOcBN_7d2;(>.JC1E5'2-YO9W2^0@q>?Ac#^2.0q\r%Zs*=/-%>**70l4(qJ'[WXcR`>plb!2@+^a-PLLqHQe(MZ^c=a.Hpjmm!O?Z)U15c07)5QpqJF[^;BZ`63c6'";b>UAOLcbp)5mi-\r%;`_3l0MiA6VpIRrBqR5a3O'8OM-J10MCFRo=ep<-:+oNt0nC%",]T8YM?aSh/n-r';ER6UXsGEVin7OIK>C3JHR4]Vn12IV^"&-P\r%4H<<%]YaH`=JShWS4)<e`oAJd""q\aN5neQ#LA<d(ltF+&)Lcb?S*W[*_.ZN+M*I#3(i`-=Tg:Lh!S'&ZU31h`\XE8E)P:jUj.H'\r%g_gFcc=/nr+@]HQ_SJNqVbJ!-<,XWc:nqqXT"=JSMX`YunXP^FV3Gbh'Mn,%+\Uqk0?$l?l0O6BhGQJ'`a-N-*4HmLoZ991/\J8/\r%Ak&<0GT<Q)\l76[R)LVq_jN""@Q]ZK4A\AUM"*GsnN[0uW:<H#5QknNdZa9.Y;nfrSfkV%nMj/2ZlOB=0cih6hS2VrZr0#.-[Pnr\r%5#ON0ZZ$]?EKoIV'uit,a&._l4&[-;GT<Q)lEa7uo]Jl)BCT*7OD!oX4@+'(j3^Ef?;)PS#:U_A4q+b3&!DsoncN%W$peu5agb%E\r%^86&[MeT*>>Lp\=`FJ(<8>LJ<ZICj*nT<B(&/k)hh+ru-4PVR`J*`a%?K+TOorfJSJJo4'+c48go*ipm:@3iNC9-`@s)79sa@)l'\r%8h,8cpUpH#J'R:%6AEWh[FbC1-@T>6/"X"aa_t8>ZJp-a+WXUd^fESph?BGl(rV::MU02!-d[b6p;.-hA=0X]"aqlRXE]opBuUg"\r%`A=C>aC3$(XEaSa$#i9Z.j"=i4Nr$OXa&bEobBs?A]9l2L(SK0nK9d,<u<ZY'p!e>.>S^7P!;.1O](MDI^7dYqsh)X[*o>%iSj'2\r%`eWa=_V:&G_^b/@hFI<=l,.h6!,Gq_kpj1q8Xu8Xs-p.clGieBk0m&.Fd&p#lj><B^'.@pqX9!(b-mcmM6^.QDL;o-2VXQOWCXGD\r%.dkmY`BdC=X_r5SHM/D+9cE=N\n#m%k(!Edi0bb+IX_&NSsn4/itkAPAb:$]^!qsCUNW4mGPJq1G8IlP_"((4?S5PW/Q@]7+AB!t\r%[3-iZhUYT=ml6b>rR]P0rT>qrV6HClGV[5s@=kndV0<UN&gg_M>*9kY0YuJm14?C6[MHA@>!\T\TZ-gB-<Qa@8;dWo9_dNnq]JSb\r%Rp&=ENB+<OIL-[h9eH:Upa/\=2RV\O#R&\IGdg0k=oM3-4d2@=;BWi0a2Y:k0ri>2O=,5m>0L_sR?Tl99p$khcKldF1bBcc"D^rZ\r%Ql,BcQsacGZ#iEC?Y!8(A[A])F+;#o@4*6:Mr^_#fTWT.FqofM7`Wmoeps6rpTo=>a"(n:$*o>->%JCT[/*pgll3]'Vk6t(!jK=p\r%:"J71G32O[2Q3.F;kEq=q[lE?K:bIo+rN#\n&,Uu_9,3)&@/^-HG#;?[-2&"ljDF_rCT:n$*J`CmSiZWQf..Al!-1iE!_PRQFro<\r%7r8VQAQeW^cdLLT52[&c5:[>&mk&?BLZ'eI\@at],h2O2,lX@<>4!n(r?QnN6#U]#mim9>6#U]#`(pE8$$pqkP3m+IcG=9EAjZ,g\r%r9%KCRgC849s!b,W@i9u(s.4mb_5ilQrA2\?Afc^g;*k_2D:TX=CM?arS#ftJNI!OE5Js%ATcns^^4kWcku6S-Tl`\`kJ;84Gn:r\r%HDURtFVN-M0:q/2?G,.Sb9aheM2*4fk4t7[LbDht%YToT`0X,CR?TM4ieo1n>*u&rm]k^0MqN6jLA1<(.$U+*Vh6r9XZX=Mf0;LA\r%p""c$qJ])3b.f;'-RQBQQB2kDCOe%ZGYN4$d;*3.,@4OKqUD8).$+@/6186i(fdbs[jCYmR[PW;7JcH:mY@\s6[*Q$Z9:Stq7*;\\r%:X=nNCS2GK?#$2(^4r,!m[mdRboRDo'Xf6LUtGqL$hTllHKraY%1btm7pWUSbAeKe8eKiC\hoU]1#,")1deZ^+RU=tQl-+?i(iDO\r%@.cP477]$@37rolj%R4o=*tihK3`0PB;DU6)=5d7MR/Oi(sN^QfVMBpZV]5*%!L#Z,CbOc@h-28"D&7q6a+j\JS\dAqH:t@(N7Vs\r%k%s&CKk:rV_Q;*7itHlPL@o)^=Kq@fb^LkKiN`P9a)0bn/,eakP@<n68'eu&4f&^aMHq*%P3b`U8n>k.'tZ6*nGX9p]4Ok??!-Zr\r%>PAoec1p6Tp(Lt$-JM=ujk!tffX7lqG5kMk'=]LRV_[M,Oopo7n/J!7rM7`<PeL(!oPUg4de>8j$p]D\!)AfuG#sS;cRqZX^TEQW\r%T)EUOH=l.a&%dLk6D&s]T^NL-s1t@K%AjL4j;d$IYYMB%ge;'JXbCNKG\)I@k0$PKf=I?!bY?MDG_VB^e/dD`?m2(ebs)K"k%sLZ\r%W:6mj3g,]J'MT@2NV$lGko%6CnkU?i1TX@Ee^1T-?L6J&j%qE,m-Ed4[B]M"Vfjl-]oiNN6.ApW9as#pCHk<B@o$RC46@&:,i(Y1\r%"ZsDK(@00-+jFmkW37BVG7!>%Yrsf+;sEY"oeZ-4P#-$RB9\h@jhf>u(6.]lQ.=T>L34<PrCl>A:;<K>*gX'U[W^Tr-jZ$eP\YHn\r%J"367lbaWgduO5@T%79:>-!Y;mHE[(/4,P7=357*O7OAYPGsJN$IB'r*A'dNal_[2^9f-9,Ee(B<"_Bhndpdh#:h9AfB"FkWROO7\r%'"qWJ^9NuDGLa:X86$O/97+!.[CZ^U%GR(AGqr!cL\Z$#4'+n&@Mc$%E&:X*fNCEfj%U<&UmmZCdHTd/]EX;:MX_"X=5NR-mgM/K\r%^se4."l4dm&V,`j6f"$Z72ShR8h9SX]A!8=k.'***?TCa:*2R'o$)N'<b_jmOUpr^jff9=T$9"iRd1R(4p-VG(1WCJp)-,3&40JD\r%LnP()M^82qdn$dAaY7K$*Ed(*(9j:1>50(#P/^FNTBrNjD#Z2;j[FaA\GU?WpOrC"Y3GMPFYhsd,hRlUM+u>SD]CdueLAr-amQ^g\r%?s%7=`g]2_Ih.I<>jW[(]OVrC%3slLaZ@$0+E8KBktit=;FjU5D^oAtgI;.HqV%<1Nc(kPq`2;\IgFGA\kN2>k"&j9B-DOjY(#JH\r%%N7SG%L8p20:k9<MRFT;3YnlV*Dt6BT>1g3f5IIiar)&fh#p5917+JH?ZsW%59$O\J)8/3)r1kf7B8]mq!8RE:c;J;gj;[GIcB)i\r%IBqrH0W%l+?TT'Jc%kB&(Z)"1mHg>P5<dTCCM:=$U0kp<VuZ:_,0MK07CY9Ugg-EC?aRn#?@T1:FnjM$9`-:U.%X'C"%EgFG5C`A\r%bl2i)G$M[Dd`%>Z+mlHX7uM,:@&VD0q-k0Vp=ARdJi&'&gg_NFL1GnpD*Bc3m1I2hS08_1^+%DI75,,P\8F8CL3+GDk#d`_L?Q"M\r%1(<CM_pCs4%M=>AirU'PF:f`(@MmNtFhgu_.uDH<TS'9uJmh1t(nrlj#fDa!0Q\cPrsV7U_%;#2+Ul8&Q[Sn"eFu9[N0)=$rUuAj\r%2VR0,/n9X&J[3QcfVMnCQKsWR^2*6j$'b,9<gStSl=Ju:h94\tn`>p?;uYEc+[2QW0;m"?d72RLrRBm+69.2*iYgN>db3m62Nijj\r%i]<h$Gc(,Mop@&>SEm\u&%;QLh4b[UN"9O4Ai&Gi-,$0)b_!g#96pUZ-j9)%P$Vfrp:08/ila5Y9&<\8]g5^6015QuJO&beP$WA<\r%SgM0\V6.3tCpeH0+M"H"*.fFPX>M&N9+i\a49_).ZNqbcglqf%i1d'jE_A#\_1bg!77f+-_$/@X0Zd>',aYFe_DCYs-("5_bQohC\r%`],6q!F9_k$80$0b7*_+$&s_Nf:\:B2)<8%U%,>p(I3#c!,0H*99KHN/l0;@gOBMP\NC$3G,buA@O.;<i1`3Cpa)9)hu_V(=EAVN\r%i3Ld\_Al9kVD&7>>b2\:N=Q\-Ed8!ET<9,.BKV]Wku2UWoNo'R=8RluC5CHGTTUh5]pR'<ir!QGpu6e!_b73P#(%g?f5EU=RbU$t\r%Pg77:k->oB"LhetCho;u;N-s_M[R$TAs6i@;=V+9CY,!XMbb%og8`_*S!@?[)72JKCB$o8d-&Oe(f9`^^!ucgM5^4#lHqk67CkXh\r%ghpio[&bhT;5Fbc>hA6lU*CL)*j5KI=F=LU]KnTQ_r>r=n]!Gq*/0R"!/hBS.%K^eb`Q-2*JK[33:FO;>9=Z8$VslP?q6n91Vi!e\r%hGGr#"eB9,:.Psb$TcVNd$=Td(<f]Tn@\6Xf6QTpd!9j*.EJbpEtlbZ,q_Z\d.N6eo,_/1d.N5@ZSdG/)aRr8oP)/"$AGWY+?)T>\r%6D52*kbe\`./9TaeiJu7Atmp[X1=X'6=R&B5mi=K:Z1Mn28A7:$0aP&$;Wkm:ajV5\7Ma>n2hVR>F]VOP85;af#f+B+=2L9GmA8G\r%bc74E+?%eChsC`Q;!@adRV"lf-kL0j76`sGQ0X-QN.77XA2+E;fMh$BQTVIL-7;UDauHrBmVl.ZL7rplC0rX7.r#PMf(0A$?r2R:\r%ThceW.f#+m0si>]",AOdl0)EL]2[U*@=4<XE)b5"=5D`G0Iq65dd]$]J9"'(0Im\V6Pp#+e,?IV7;ZakD6-N@.\[FL,nGL%PF?%U\r%gSc1*<u+PY.26t!*kIQS"l\1gHW'nRISsU[IYPR\@bsAN>X>lkloh"SEsLZQ<8J"jm`*:U484.*Z]t(6HWKkm=9^CK]dLr"oK@Zs\r%T#"1bU@7WYpSK3!EE\'l<+$o8QbLMdhD6S]![FOReVtjGe+`XjH]f@@Um-eNBD#Vb7S:5DHdJl)+]8Z\^/s&)HOmfP_haOti?*Si\r%(IFo3dsc>q81>AS!IYb.!9.KG)^J>(p!G)[k8"^[jcU-F,DVSCCWQgrP::nG4esSqj0Dn<?1aNshiUehqu\uih"3aYp7@tr\`eD<\r%lok7^'-A[b@dg#V&k8Z2qT`qcK&:`f?-s4[5(6D-b!KX7P]cq"c<!hbIpJ=MkdkG6#emWi,pn+W[H;HMh.*W#ejq5+J8[K2b(eiL\r%N:p'KI/'TN&UZd'8-JFuRS9,\nj`+g;'([!*mp*JY"I',@4*g.b!gU&GC"Z[pp^<Oi494<;T]1$_n6@9JhJ4&O4OjdadTg&1K)@a\r%g]OFes%"TKI[^ba4e8>r4As<jgr$96nW?_PEaGA3&KWC_#a@@l)nJqSq9<K!_bVSNq5qSCIP\*E0j?<qLM6:K9/K?6Op%938;V0B\r%c#9c9'$Q=(cPuiJc8!)E'VmpZ,i&=[C+\Z`WPZnum/F7tXX/'ek:sS:\!HB/0nJJr@$<$'lV6qfO6G.-^6?O*hd!90fS'^Lr8q`G\r%_.r4J/qq_W1A&;Up^uCedbc^pc#9c9'$a2028="aY@Oji6)nI(NFA6;k-T]Y[$LLM`N8D"WgMFr%Bn>\+.=R=qc5/C,$&b6Ph)!X\r%?hp6r7n$(ZVU\kPXI.S%FZc4dc$Vp"C[(J4;s@o[6R//Ed9=uZnZNkT^M'O7<ccB4CWUICF'7Ct6r:_^2ja23P!^t=\ZB]rM1X;<\r%Vlaf035+SC>IZXUoMgQRIWJZLoNc6No:$Se*`Ns+mo%4d4VBn^4AHDm(WX<l3&j'^3Bk8=4nKKlTO,]!4\<)@I,X&V6D9joi:Ki'\r%%R@^hEI-i-iD4(+l,="(EI)]IPCdb"iV"h"3'DT6_@ri&:+?cL:\TqZ6H87UbqCURf2L8s+]7aho_rV=Kh.^T:<RtZ))=qt*(1!O\r%.R]eu2(o^l:(Ptt]uWc->b%Cj>)&!bA)LVu_!*kOb-5i2BS@T`*CSr[5ehR%mf_YB,h[@Zcu=<`$TGtF&5@73=.d9M&5@7s*8Xhq\r%K4pdHV8^<il/D9,)5[M,kR]Brp#S^g<o&DR<\7W-[%HTR/b&Fi9p6cD[a:SX>0E-3E#!j"j]htl7M/"W8<V4ed97glq74Vr-mCAY\r%p..eEP0H+_i*+*F.%=,&3[/reQ.urXrU!K4]%^7FqV.]CU.$kR5V2cdohA.I]3+^79;tIfBWXUni:bYMd3=oX+Xn/aOG&/`Ft"/i\r%$7H\g*Q$\.r%8bfPJ`>K`_$D8b7N%X/u:>r>;Bq.#!rtW$[0>&Z=dHAZhqbA<NI'LS,jRQN7-$#'hJl;rVb3A</g0IdHGM8;M"7?\r%U0Ui1h0)sEqO>4"+:A)7\pdJ804eSX[np'XcdE[UU?bM-E+tU0rRP]n\j6nupmfB*4@m@i2#4b]dQ9k$Nj854IeDsc7qf;8hc-ef\r%0gEtj1FTZ"n@Wj$)it\tB)j22*0G>*_aWM>,>.liC`28']1UJh,8<ESQIT)[,KG=)JEOn$O,1221n@51f-=bl&E0P8ZU\P3F%YL+\r%"!.J)mXdk[0m&3[QPsq+kkk5LUt4@Hg#p3sbkT6R,F96.7-M5cNEfrV&>=G%B]KdnLWFdJHq,eDFGOmY&M.sZTgRmEq>E]60m&4n\r%$;I27-&)nl/^Y]^E716d&ZDLUO\6*',4o/olE8V@8Tb'i<06OBFGTR70p0&*Uq3er7]>`!W@lu4Y]L[BX[.(GWKra$lRn@cK%W)f\r%\n`ou6\t1,F7)?'l6<hFKBOqNlB6`h/hqI(,^Fjp4stB-TgL[(<X4Fc@d"@trQ2ouf*_AOn]c?YZ3"[1XGJ;\lWN;mdo@rIpGGQG\r%bosbNl=^\CcO+&VbJYoGD1rAmmF`nlq(=e`6_/HF4]o7.Z">5CRR>ZKn,J1bc(QHsBq&-#0-ImXJ(bNNEsV^YEPQM=jq'R`idfpX\r%bp!%spe=t%D%8;KkLb=BT$8E',?50AgCs>Kp5]@YI`K-@hf)kS!P^d;hi]N%peBq4M/#_0ik?^!]U:.JPm,9m_LUO8XXo*E(Wssc\r%Fe9V<;TLg\FN-Y:H*Y^$Wg).ehqaeuS0"\o6^rA,-D&#P'%Y8?NH5hFjp=d4W>pNSVm'd)XH0N.hSYb,ZAMCK(8k?KlV6kSKJi@3\r%eY%5/EB#aMf#/6g?%b'+AD?^0H":@!DbjUp:,<Icr:\(n_.jk=b`apSK_10^i4%m53d'53Mpl0^.Tq>[T"&^6b7c@#07iOGJ\Z2"\r%gc)g.`<!_:ESo+X'aFU0lt>S]QZ-Q.XF:qf?pgB.ZIUqH$RZ;Vm4#Q8=tJUU;`45n>HH\B>.sW<V/Y/60.iid0O@0A=Esa^X1dUi\r%@\%@Tm7)R/*eBLL)I,J\>6`o*[_]@r*CP:cUmJVR.TUr-U_c(%@>HS'oTJ93`0X,CTef.O?TWT,+4OM.d,rf$:Nor74)?G`NXo=R\r%6n)9nH.]aeg;"hZ9\Wkq$f92Wgs8Z'otpUV[P"QqhTmS)&%pI7GX'e_%$GUgF0!1]RcD6jk]=QT==ZHdr?l-Kq0\Ks#b^u8V4<5J\r%1rlW>9f3^s1roH.l5g@$J^Ia^U(iuk^MmO2,R%fE0D&5h.'UQAL/o*lUMIS2Fg7d=-79<U[A?&tHl<F@Fl>G;ILLt\Ui6,N"(G\K\r%T_I3S%#47o9B`V![<P,76i^Cl6#X#'(2B5(\tfj0>qbPoqW.Y/WILIk=-ka2lI@&SMQ!=b5Qg(jI7BZBDkjY'I&^VE+/:[ANsAH,\r%mh*[i9PZN9.kTYp@a6FI8m#/4Cak3rG=?ThP9nKC;]/IKP9nJh&KrQ\l1iVH8rD'SBCo31jPG3F-iu<DCf=6RT<32,?072="WicB\r%<StG$WLs>kLZW-)#VkBhL%MoW+(?WdP+LP3.G0ED4!LNP:R#/s&L5D(#87>`:e16BL!-L:A^o2BE)`lE9FEs*V5MO^=nU:,(mkEp\r%@=25N\;Y`!47Qn4F2Ap(q)c:(XEjs4fqMjae4N:LbQ7;e77f,Xid?I_*t$6.gumk.l>aMYEN8B<&ZNPJ;S(kW1EmQY5g%JESm(e^\r%rr`3t=[D`CE=93d@fIDD79*D1Sm"a\Yb.:I+B:_J/u)4uRAAm)P@Ooj1&^-<eoD__[<D0&0[Xe"p?p`(1XBm1qJ!Z.h0/\cL#-XV\r%J[qf]Yt%t2]KNag%OtJ-X?5N/?F^pp6S)+]4"CLd7ms*33[3g5qO1)@@VMY`05=.fCjuBnXTC`W^KB+KgEa?eeKpJ;BVe.!/*Nu0\r%P&jb&J:96GeD9*B<q@JsPYiS?[2Dj^3j16Ane\B4Rc</o`boX4U+Y[,e*ma8hN-74iG'(?`>\FIl834mo&d&mTdBBc>'9H!Y0'PI\r%b,q&%")PYrP,H)IEZPp@.LCr./9t(S2.t!_dOWt`o_n9RJM,I,Y&b>bnt8b&7;.ZF&'A%99bX4Jj[&R&eb`3SZ[(8R4_n*X2^e:!\r%mD\I=Cf6b\k@Isb<8`!LQqX1V7.$E.@A%in8S/6a$60S1Q2"$<eEjX=4Dm0M>-?K!6+Q)Y([)@qe^;.VYFrpT;M'[5fm$DUcHl!(\r%Z%WBA+$'#+nbCp%Z9k'$0?;1]k%f2*Y&f&<o2L4]/`s8=b@c9q^,.oY-dfroL(_OA=ct#Qn"XPAnb@2C=__P5,14Z+Ch,QWhhGBe\r%2ffo'LD`F_<@n]I^\"?D((u^3i'UCP`WMrn$N(5)O&0h;&H`NboC'=dL=ogASV(#@e)W_<$7Un$Y+_e!>jGnRkRHLl0J((kG2b*k\r%&ih\:$@QZ>+N%f;YIFsJq_X=2$r#RCF+#@;NiJ<:<W;pOo\\`&)@n"&Lbr6FY4FZ-j5^lG=f^&la\h8aRnTLN[nSB>+D8W\9qlC1\r%e`EA<SX^LJI!A_Z_ase6S@_0*^!f&GnA)b22]=\W+eppMDQ#S?3_HF_o$_Cu@ce.P(shk4\W0Wnr!N9H*W:DQgF->hFB;r/R2ja%\r%VcJ,n.'RpSW)Aku_e(CN<lX6VCm0:YH?E9XIX?df]DUWEDAlA.cYor\V\V/HHg0ZQ?H7$'e(P>g\VFM2/"TU85(fRTGtq>gpak7Q\r%U61G;+=:-:?2TXUE=GW6[';(ONi<^S890s[?$1Ga/o>M4g4H%?Y2Y_3Y>=i^[(:hVrS;k6U98lRFp5JRp#E4b["K_@KZm@P0Ep>[\r%c(ML%V%g=9K.;`&P--<<V3uTkS<h-:7$9C%2nJFdJ>'Qf[mOtSM3DP+K?+[<Th$uP#<OT?QU.(V_u.D.6-AFf[Ui!4/a`+jQm$#n\r%9K5CsSfhT*+p)@I&JCm;Oa-\ILjjV!892dg,htchik`89WFCB9dXf:B)-S!$g)op",GFjNg"Aj;qU@?b9N!`C:%K6Z`Z+6+B]cGA\r%Y%`p2ig-I(A<NsdBH"o:%.<75gb5lB6W+tcK*A^'Tekggh:B4\-"Pc,9n2lOl4;]6Ub&n/55Hd2q:a-5q*9G(HbIQ3Q;kH'F0ALn\r%=_C-8FJ%-VMZ_K88VS_LQ8C\+7@X&?0a0&q7oXb`FkjD+S+"Th"kjh+GQZd/X8Jd>nSuYgG`+Qbbo]Sf%4#R-8TG$BQp]5R,%n+q\r%A$KkSOu)N/Sj1(6qhqE8r,N!_'^^KAYad/CZ!Wb*8bOio%,]SP&g(RfEPNMH]^+7SW6BZgPbahnLfQ90h`,9eQ]aY"pMO8\?Q#n>\r%p+3<\j]t!Ln$&iX?M_uq_:Fp`<7Xf[USZ^\r'RBMO7Ve1i;n6d.<ud(:]7Q"kK0()EG"(t6+NamMfp3->#ZMRX=j]69LGlZ\@mb]\r%7Zq/b^:&U/i*_Pf))G=PN[0n:l!9(TUhK9,52L`3IBW"h;9=-GFf!Q]CA"p079;@uI[hYM2R57E>XR=\,Fr@db0@mm'0#W)c#:#`\r%[9dTg1?t\(Q[^*(BbgU,&O0MZq-MUG=-I.GLVm(#+7+b,=6?U'm3/CQqT>=.$HAi)h'UNtj&Ru!%%Z-B$hQhk%%\EmcHodSa*7et\r%TbrXT/bC7/If;0eXD-U%\fK4=%,`-!"_?Q.0plli?6B=dN^8hV!Z;jJ$XoJ+XCF@rCo%(=:Dr<],qYEfVpuFJpqM]1(V>auo'Xo2\r%g>#K,o5j@GiRpaSm[[D7>?SeU=12ojXEhTGa3VGOFj/6I@hh3"L5Z%0d\"bpYiij8=QB,H"<&`X5+-^Q%Dc0o"8%`S;]/]*%$HPV\r%VYn#$.K^?J!M)ZgHS?H'\DV,W_boTs`]ZJ-M=l-o-I#C(ZnoQ'^\`pM,D"ftke/'-5a(jOI#--h<*]e"eBo:Zkdq,jeBo:Zk]mIZ\r%+:1gc_G*tKg&Tt_!@8;0!(%DO80G%CRbpjN<dnT]pP`7SJ=I7.5laKbG+;UZSStRR?DMG-DmuYQHJ/4ub0\2NkaoAC>$cqDTH&3q\r%MR]d`?H%p\/m&5B>ku`9[eUII)XdalM']M5/3WY[a:@O&c)+P=36\D)e\`t<NE8'(7/Bn\3hqH;oON-Pb)aFlYN-u'&P:$,AE"2X\r%E4j7M;HpcR2._/]<^["'-a0[B:(KW]B!gdBiKb80>!6.6XZZM"Wm,:!"3VoOqrS-Da+_NSm)+LBS:l<=b]#[K"-:92B6CG@7Lm[U\r%B;[Zko[uChl;ua*5s+gh'CiH[_=Jkp=QaD!do/'\N/?_IoB8gHr9q-U$>5O;?2X0+4n"Zc[Xmo,X)Z&-[Xn8Q?q^Zg[LHE\r&&B%\r%g,@k50P6pO)E1o<)gf=TL_">D,s[D"NS_++A;8*`>!G4(V>JX'D&`CP$Ljb:gGY3G`eR%8>*:!M)I7.C]0.=3`pLEs^cjT$gW#[!\r%@Vjh%0P9l;r5<,]Y6N6A7]!9tW!gq?1DH(D0GWAu7do.M%&36e$OE))4H5s#.cY9?&;kRtAu:53?1@O)oD@_YhHrC=Mq?G)S*tVB\r%f4pMeSm/d*@`;pOWd%_La&r^E!lZ&?JF%Q/m\u<09"IN\"M.$O5#?_$d1?2H:%uDK't'kI[V,>_Zjob:BD1*EHY)0SgMY#P7*"hV\r%"qG`Em#s[P-2sDd"'$raG-a(>3BLNC]2[U:H(pVtUQi]9<'`jUgLDq,l+:mjFu/Qf,!+E%H6Y4Y'j8%qKhQYGD]b20L)EA\ZARjV\r%2gq.4`ceD!Q^?F.U\`)UqsDGUU8M,OOp[B=;_2lZ"](GQH`YpQ(:^0W1q/oT/GsHZK`fZZ+'5bDcN_JEB=bL]]UliA=TA)Z$E/]!\r%M?RiGs-WB1!:cikkk>p,n..HP5a#8q!^UK$:r*JGreYo]YtTB#Jd)1uUC"HA$0$Sen>d5k>D=$nK0(0p`/oFO_[-6MXMt>Hs8;\-\r%4M9SoI*1EGKGsbuqYEMfrk[:gVo]Tu+,6129mj::hCLr+&A#tWf+)uI&1:#a;W<(@%mH'T9Ki[,r95P+P=2/J'kK_Q$KDL>J6/+g\r%.#>pQo`gSo*Q@qCRc3(jcChtKYVEk4&[/.4"YI=Y:k\A(!ge)'c]];>'1D67>!;5M#DIrA6$mdB[:iUC)<IMmirP021k-5sH2O_>\r%,Xr=609Qc`gq>-?[<^I.m8-<qj2^Gf!OoeQ7Xt#RUuces`Dd=\*>>(d*kHIT!%@mNihCGIA-TtlOm+?gZ?@)+1F%H3%,Y.^F'O"A\r%#!]h/0a([C6cMCOfa?r"dkK.MZh(!7H)h/"rVRhmX`,WsB0bt=XaIMo+DYAfGq+5bSBbO6PY^V0Z$/L*&,E6D`O$LjYKq2BETlIN\r%a7CL"5(qEtd-kLSUVVUX#B)D+NU1O>*4f<'J_LUk*t*5Hh<ZB`T+@>/`+ZLqnB?6Hj6kc<N$?<uVg[WFa5+#)dJ%$91j(gK?(m7i\r%j#.!GPJ\Aaa))$OgCrSV4.[l)f1i4(mO!;-Cc'Y&:E!\s6sOR5:]K'd:UqA:WliT`]./Q8+ausmr_r'kK$&=f[>o^8jQ9=[e5786\r%Zu+;I9.uqo((ta@h,%VYV&g]GJBit'3i9&B4Oi<8Eu`[aq[lE?"6VB.Lh,cfPfR_7nog9`*UC/@H??H(;9,cSG*q1tM`PGZ[c?Ws\r%,jLaSfT%!.+]6;ZYIU@,OV1$6j%m:\"CT53+_0HA&V_/J8u:Y?9)%eD9^.KLn<_>CqnkQN.\<e$mPc53)is<O9g/-ag_`FDq;o[[\r%PpJOEGdqBr/j!En+Jg"'21)G@dm'.?[C'68.!KDBPpN(+>]'CBI67<#-u[s!/+E^@Z`i/UVQZ"D;d)cg^;HEGd!qIDqcgjW@):X_\r%@R-QW8b?@gPP(Qk3"XaW&:O>,LQ.(Ec\OBA`U/n2:-eS%N4EeLk"lC+8Wi'V6Rhd7@Yh!Lf-P*,c((/iB^r/Raao(Z4C`--Dee\i\r%^_W\>q`/Q$_S^0`eC[q'>!GNOE8fC%:M#nQOMpLtn'J+&8_0k*=C0Z1C4*%**d_j0'l$au23R4LQGK3a\,k`LRT<44*sBo8B,R&?\r%11,!HBh53Veh<0sG72/JSAU'o1p@,W(ea$"cY?`M9M_ipofW1jl,aIJno4d++,hO?m4`F7.t-M4\8l@IVIjDl$r46=iaeCcD/'um\r%>h;sD<c_Qs"hTU"QY-de&37@gWU]]1IQ'5n)kF05id<gf:Zb:^I++I0/n[X$juN2(6AsgV1)O84%U,qi*#;p?@AKuY#GH)s,5a-d\r%WJqe=SWgn=*(h9S5j11RYl4-8bJ=qjFWR`bR3hOsAXLprU\H$_&.KmYGn#LDlJ5Y@i]OY^+.usm2.;$LC'8c=c8O5*=_eE0ldp`(\r%+<S__;-USVGY$k_GH[-V?Uoe0]efuWh,sVY3IWdPA@u!0mW[ZEoO-dTKkFN7j)s2+U8;`;d`6N/O8&/OAGMITcKM^<N6gcP>g8pG\r%I-4Q_2a2Z,oj9f797@OdFiok`>D+T(XSPhCKPKr*W0H3V35P(or!A6.AO`b(/D70%bLu[HkRkT^B;<^5bJ5$\2tnXHWPerBn3d;M\r%)TF]EJ:1Q&Pr':!()S)>a^4bH@O.@FhMrilaub15@CZ%m%j*\O*k$p7R.+^t92-/i?TJ]gnR6!F7>8U$RJE<hg782ETSfeL9s`8e\r%;!:D@hZDDZn%8E%Zdk]E8(+S^^30\0VJ]lQ'Nbr/LgZ--eZ2"u8blYhF1(3SB:FOp)s&%VjG\3Bi95QI:CJZa<(n>]mNb[C6+uhS\r%90BI>\<g_3XWO?,:hh&MF!q4\c&BD.N@-N=Q$L6c&&XflV+)C$k8O5ia[ft`r)[CC[Yq4ss6tKr+8g=I.eBB"d@0D:"tD;6FC*9;\r%:_Y=Je9Tk/JPi*(g%Wm5iH:;Xh6u=?kXk^_+Ag=JKn2[d\$J_<'W@TW71985(^2D2]XDuJA-B9"fs,0jnT+s4HC7c[L$h/4'V-t^\r%0[SK$d.Z"S'g+P*QQGeCDABe6om6Qs<W9Gl,D.n]4MJa+%G'V;r\^#(\O3o/Rf:\#)>sb3D;E5kdW]%C(?h1IGAr;;T7qEan%gA&\r%)F6,nk%*"^g]9S(/$5EkHK(k#X[PHTMltHVJ^?3:4ntROa':@,H)>.bLJmJc;sp=nEnI;gGed,;3$L*DoCDOeUrJ_W>Pe>dEs;kS\r%ER5M;Br@H,;`LMg5&o)MOd?bgfV_!TSTW1;*-XTDFm-.m?AY;edlOX7S`9Blk:tR?*^+=5I[6,U6iT:dUYdZ\'e?9P9CuTi8YNki\r%Qs`FU(dB)6pM#XM\fX`*G,ci-\$b%gnWlmbU"A^1COH*OKQ1eY'IUJ0lPHHda5=gMlam;mR,uZ6@('n=mIr"erOqf9ol.$Vf1JMq\r%f@+3]5"[*B]\J(W#Q>uH?kN0c8/"`J0o7`8h`*7I245G],;;^p]F#]g3b7T!2qmASdP3h?dj_'&(P3jA=BNq33`bI"OC#Nn0U#c]\r%MN?,_PGu?L-aWL,f1-*ZMukPLSOL;a/P0RAD$cqNc09)il"nlkhq.%1iOW3pV*PU3`W/-j$@(J:ks=9V9?]@(mT).:[Xs;P8Vh;+\r%?MTGl9,Q5M=%Om`ls0qtSLo]/[hY^FKp2aND_"@kbBtP\m;3$kCuMi?TsrR_qsp_u8?-Gt4J;#CmEBNJN?pg$k]L*6iLdNIfcaca\r%1&@6,UgL".;UGEWj,SE7[+]8jL=N(54^g,[Wj06G#(>Yd<3e[er_g=mr=/NN2m6S='SGQ#A_QpSV.p56G9-YNj)=_AC_3EIGHq6X\r%4/G9rY*@6/D-O^%9']l?gd\ki^B\79MH3Nd%+>)LUC&Jb4ZuV2[<2H2_WIJGQ/A^oe/Y..qWMt'UOQ2F*8Bjg#YaKq(>UUnVk'qY\r%%-juEh.h8,e.&`J*%4#!a%J)R.-#->"*B0Sqr;\n%4.G"EQIT-P^GG#q4`!!L[.0!mUum^0WPuoh^,@AR+2Sno9$.m=?[?>Y8p)q\r%20DQ"PR_$?6L';.]s&q).ZA84eI+b5rQr,ajNJ=ch(YlGL6Qprh(YlG-HY4h_lR13D3@P:2pAj6OrRdebj'mREd6Col\nNh1"L5E\r%Z^8o*6a0k.$:;@5<\Fk.\ARTd=lg9,edLo#_+C3\lk7q[o1(h<Mms,4l(8irK"u8k,rod%M8Hl5<\Fl.'gh2?=e!Eo**tSJ\u&A]\r%h(YlG#)nAB\m^mS"(rEW2f'e8,_joNXYO'^@pN]B@.\Y4<Q>#;3j.A@P+!q62q.L;eIBijQp0/&.Ae;NbB*KI&$I:6c_@5]:8+C.\r%>LR>h<`W$ib]u=DcNS'?I;UOjCjejkdc$K/DM[9>>F6usHlF!gEoFFEE'k&H$DFoHnCe(AqbUL+p,%&G/[9'Uo<qc7+16F^_b/mp\r%SR5P[7,OgR0+J0Z^drd&R.qPt#=e!/9sp@u*Z1jY"tGJX"2!^aJWW!$'Ik5T%h)oH2o/ITF@e-1MhN:f>ga"n`G"83bTjif0h)8V\r%@>?K"-->btf8`F\E-(eVVm7T$1Fu':?Xj=:5hJ9!pWQ^#M(^[$O>?E-:#C@_kCQBT_&9#mI*G&3E@<M6J&.(D=:38%N6k?4UqjR+\r%rduJOVnak^KiXSf'U\@r]/fcmA&9i4"_R!P8IeOI=o(ec.#M&5<\.&[f-n.im&X+WJ=6#b^^A<.ECYm^D\$.8iXg.;V(EDe6SSql\r%dU2k-"[R\SI`6SgHupF%c68TOjD,pTEq7S/5gg)@fGAK@71f:YCS76K3Bp%aX4:60#!.Ob$aKe?[tG5p>`2\56j1Mt.ekUHai5hc\r%FU97KZKOHZs2dJ;2DYlp3I%s-R3WG4>)T>TBn2uLG'sR1Z+Z.B;Y$dkU/?&A/Nfh3U53I>r#ChIc!";OWEs<7%S#tk'G"JNQJd./\r%.>`h(AX;=!5apZ21qP^T7@Kor9IO-#(-U3##O/>Cc5'X"l%R8,@/:dFR.AQ*c\,DWTdAjHLuhEgQ"9lQ=T3tU,,9K[7P'$UX?M]h\r%QP%E5&.:X@hMbQc%Ylnr`!J$V65G0"O>eDM+*/jPr#)d;R)A/F#7i#L59Ue@BK.eWq%I58*@m_?=T7G"m(d\'MD]a]HjR'&+,2Qr\r%Q9QPD?pP1]Um#O?M.TEP`CW!:l!GO@KNQmm'?`rp3U4se&^3fo_$#`\=Flua;NJV^8JJ?T/`!,l@75.a8X+<YX\fKSSQ)B:'0fVU\r%@emJl9TLAf7P'$UXKI`]11L(TLQ_!WBSeAcp@"Ogj%kJrHt:1dGKk5@_3YbWT+Hq;Q/!7^r!BXTXldlaj\L\dpBtn//:U!fj<Gn8\r%59\T#kAsK4q3d%@=`@7Nq3d%X`Z,-UG(+.Mdl`,90)da"@]WDCko$7m#R,tricRqZ(^_qnM2C+RPPsPd\;T=T>M2eY,";^Mh<=FV\r%WTJcpY.tG.,:N9I`WcI45BfOC[nu7jI.5n,7Go[E<ZpF_&emEohi:Lt4;RS%TNM&GGC=SCqS%Pj\V?K].j\P92-WgbE673ES/^q>\r%+:UF;IQP.;rdnUiq!I;D_Y>Sk_J_AsN'%C6@ef?[ln\jb#2lufeM$,uIGV0,c0kK/D;Ku;hnJW]NU$(m$:V^OmW7k5;i=MT<nu#p\r%]>(;=PI:*2TU5:Nl!%si8LDdf5n4=h9'9Z#h'E9T=SKM&N-j8d<Xa5Z"c)%%o5d=J4OkaXNmF0YqndKnV1!l<YmO[sAA8;>aNYSc\r%`C:Z>ZN]=QMkCI+fn-0f'1*LW?ZYBePsh1@10WC6W=e<mbXI?5(7afPMjpW%';h`S=nFfkWS[_>$aK;&UhM<,*>:G/7@L(TZE`&-\r%.ag/=VrI;2:IU_L_VOK2/Uc9u-cr+GWCYK;1F0ZLo2I!iS_cpP3DW)TI>k1%i&haR@0E`.c^%EcU@QW/OW$^9I1n\<7@L(\ROlQ]\r%:[?hOs)(#B;X)=8HhlU5+-rDbs&B#PW>Z"]"b!Y[gjE@LZ>V[ojlM\ZcVorQ%^8<#kWBSoRL0b$fQesp1mPng&NEQTR\lej6%.$W\r%"\b0CVHh>l.YGrDOf#*cjVL!S'l<`'Fe4J44J\,CcVot'WPG,WG+OS%foosoo2I!Y*mDBTSYlfM/':%O7@L)?eO>"6WlB<K2/I\G\r%'JAT$+`q#.L&-,(KKtC3WZ*doMV\ttSR,`u^7Ho"KA>H[W[`j#SV#P(g"\%6WDds]T1trf(jE\/$=08pZ5A9^f-fMC&tr,MqP<\]\r%9SoE.'ae6=Qs)&664)qaB/Eagonas?;^gk:1+3jJ5!eL:M!^)!5/E7s!=FO`:F&45Ks"4UMa17ZOIjB?5bZQtM6RF)=J=+7M'&TX\r%5OW%WXph=,kk[^)<=#a(./N!Y>JbZhg*!UdU$EBE*>P8Ekgp>nQh/PD*%KHn%CK46<V00;4W'^BN*"N!&)Mpq^KMp5P`-6)cBd!]\r%Uml#T4\5-kKu/%%P!1VqQA.`:?*9t.b-+!#Tr?5s=ag.A3-c%sUp*Re#\Dejk_&W>rF8m4*4b<]@bs;Ls/CM7UXFrW^TV!?C>Fl9\r%rP-67`ZZ)rB)`\j,Fn`f\l:@1KmcG?.acS`Relu1Im]P0E*[9hiQ$_)n#em_Gp@(SO_6p2ggb`MD9'I0B4<tYL?LPu2m*-04u!YW\r%p#pG>'3ASe^BB@kFl2o!(iRJi&/J./q<F4"]Bqm.C-=<.d!5kX2`e&[JKnq.<o\Q>[=:P$/h3T=%Qds`"3tE;#dfu'Lg!T5\&fh5\r%\1Q/'L%gVZS,Eaq8rXU20t)ZpmU.$snSPsj6u!3<*lWdN6a`+R,hc4So;0obQ%-EoC#d]Z>"E-3Qqj^%.Sj'P<>l8KXY;;hfi[:$\r%(LE(_T&+s*@^$@rb%g9EA]+4q.P#FpP*D.Jb9(>lAZ<rCZQ]lU&f[J8d)DUg^L'Oc+]3ao5tae.*ai/*fg*$:;G`j\^"H$XiYqd/\r%hiX5&Ekmn>ha\po$!%T6ks=:%%1s!e6nfb&VqbN>1j/2)fmRP5=%=oDcjmb=jCHa@AG7g2G+^>jW0DmKL\b`!:KJ%T'EH2?M143(\r%%,;<Loi9qb-+;>:W2sdt(GBWU2G"A^dH2&NqJ8J@ftbsCJG2]%ft\^KYd5jICg[e`OrRR^0Sfq'B#5Z0;MUjLJO)-VI:Vob!fYR>\r%D?f=<3ZCio($2NkeNP2%0I^WjXgS0^dXOG)R<e$]6"ImJoUgWt5?-%']5@\l"pWJ*cWDmS^`XOLGLS&\Soa@*Z@P:u+T4Wl%Ecr5\r%W2Ls[URIhj`ij1aPUUF4%CRoXO:?MeGr]bT[&&@P`hW19+ZaK5m%?:X6ea^Sj&7r1^tVLhYF4Y#S148;Bt8deng>/RpX"?[Y8BMX\r%P]5P1!(ufSVm2:('kP,i+[0%E&.kb^`\b)kr+p)p<DE''4)oa4a+p_)e+Z(-G;7jrrS\m;#<hrH0g7cU@LQN`Al"TcY\+0Cd19_n\r%$j]fAXnLdU[2KJUgC,csm*TLN[i)3.;X:91ZJC!,n[5=A'O5")QE%p5?cNR4)HpR.C<-#Y:HUYU1K+YL[5E&8.SJ=dcee![g"*Ec\r%\BDOGnR-[WQp+4MMuh0\&-=%.Bn=3=Gd,GjRpPD-=man_6.54+5Shdt%u*0OW/=95m8M?i=e[0%'Z&dl/"lWBF7P&3Wf65X]b7pH\r%:KJM0Rub08P1A(:oH'2r@<G%A9iS:@#f0!Lg_leV*<+6>+,Rnd)$qd4"Ed26l%'I#L"[E406.!c3[9&4XiZ'`Oaipa5LgY1an6<D\r%-X.XMJ,uPX#8(<iKL=of$36RDRA4h"9jE4iKJb6;^_^F2Q/N^)p<E$BbG=TM'hB]@8$Q4WOGH1e-2plfTd0OtO&siTP'ZpZbb=#Z\r%^*mC%r]/l*jsIlo4^l";M)>$?eM*OPc8O5*=_g[4+28S]J.bSe)33EAY!&RDa6W9>]AFira6WVnG[VM0)H5##"e7(p>3b7c0tWWq\r%]T6-EG$S-0UYE(05-+Es2%t5I*k^(iQ`hQnf4.9oU*OinIX98@nTn.^LCmVQ)QtO\?c8#WVh!3#ING4jSdOG9f>DD^>?iVUd^%3h\r%H@ooRnp!=#/]Gbq]#O%jlUG8el.&4;dco<0^WisT\)sIh:Yde;PP$3[U[p;)_e4l1`j3)Dpt\$;FHD]cnt,[2?+T?lTAD]\?ZM&b\r%4E@(?r&fBnDlJpK4Sp'i>XsE"^Q5+O`8f<TA>u!qLdX1GZB=6NIiG!*2\V8G_k^j[Tf[Pq9.qWC!arBt!+;Zg'`,pQ^Yu)<miS5I\r%nKMSCGL8#Q".#?<=&`F6NdJo<!7?bD1GdhN<2/%_M7B`!/(';t4%h>oBQi>1V@5jK'$gubk$j0ZUr"5P'G3_h32rHccZ0<C@mZ#a\r%V!2fB?G]SlejklkW0Y!eVQTY^'$Ws)W$HOS#^.9q4>WL6.[4U9igI?(8\p6q,T`8FpB;2S83A]dp(3$lbF?+dT0tIJcV0s\R6rf`\r%Y?OWV4Z?Di/i,-RTE(](pJ^<%Rb_68'U5*]LT3;\X:eb4K#F0Rp&&U!'JH((4'2K7LLe/J=j(Ymf@nK5_aM,%gUhM?KW.<QdlkMh\r%?e&UM2_`Q%9SY0aOVCD3NGQgo9Oh_.<6IYCc)-Z6ps`nCB<4,;7#,kPddctJ*3UTQ<]]fG[T(H4pJDB`r/$&E5br;KOQ:.%B/4Y;\r%_`g,H<s/(=\BJ%m4%=BFmORgMQ-<ZHUS'\G(Na='quWej"2+n?U[:N6^C$3;IAbHO/$ElbV<Q^foZ2AYJp?5J8Y3e1.:Y.n2o3hu\r%%+j,?40?m6?KUNcRAh(:K/8OmR9m1F5Dj88:YW'cbt@orUjf_b\6Y.iC6Q0Dm,D_uq.su;%\f?qf,gp-jg2W(oEL<[Qd>BVr%o)e\r%Cbn_1@02^=n`>p?i.qY)I(?$hdedI/0:2=Zh<D9*b8%h0CZKPJe%/MA35CsB@nJ_^=)Hb/%R+mnPeIb`%W>-N'kk$#X+cJ=[^m*(\r%qS%a:-hO_0Cr+<`)fHe),DlB-/Lh$2e[<<(lm^5i`@A]CFR,R-p\B!i^)B=#m+5I]=tRun_P-@OS\$he%CaguDa%[FAL'moq":W%\r%/H$=)"4&B)IZ3p!cS&38'%6Jf[@Er*,WRsjAps;##s8V"AlX.r`kkV]QN"1fb_T;-eh9pW$I$q*\AK8K!jcVUIGZe""_R!Pa@ln5\r%JQ_gW*"c*Q"u#!Od?ZtDDU<._g$0KJV>FFQZEY-(W`QBf6aZJg;`7$:T5hnNMOghp<N:8*U:j4SK4hH':[`Hi>fA3D?_7mfZ[qQC\r%h)s!!_5(TeB>-:.(G;uNEr5\(qW[f(,\]/Z6$jo0i]L&!73s6WfM=1o1[":9=+U1',\]^Y<5%0U^[13ajg1)LJu+k\]>Ri#dS.G]\r%&j4B&8=XCp%7Zq:'Z6?1RpI#;&QXi9;p3pXj?\%r\&!09E]BS'Wso85?W`h496Hr/*u\eGC4f)$Ei'"T0a_RIU.g1M2D!.\7@=?3\r%()CQ:,*j)r.2:(7FXYFU,G$].;;<EW4O1<&EANc:*7:Qc<]%dTdRb-DELZCiKG'Pa;V^b8+ua-QSQ%5!)qJIAEMgF>?",hC<Zu5A\r%rD5K&Q93OO(DG&][U][C.3W]./W-%NI1(T^D,K)=EtoI'g9R`HHP[iEVCdZESkTKI1Mtr3qJ,9U9ZK*?G@)S\<$0[G6@-,p:Ch8J\r%.[/:X7N`9q<7="0Gp9,r+:N5^Kcm7$"A3O&Bc.P$%I&:i`&..CUuN=5.hBSjHV'2K]si*Y3"KKP"^qD7FU3e;(LVQh?N_UN?/o1o\r%NeN"NFtILnN.lhMG2XO%Gqi>"KMQ?Q5*mN70s+eI]^8Zk2K$odfj,M7g%5u)[4\l,f.Tq-m.lJeZdEnu^Gm5prZ5*=h^,52XE<h%\r%C17!">C661MG8Th*9mFeiEGWOQ&HulVZh"u%@t:imrn*qlr\IJFV!#he7A.t#:KH]/][=PGj1bX2Y?Q?C-6ABn#Y\`rXb%fDg"mW\r%hF9fQ7CI3ZB^,j\I_<k=M;S3]EsM`q^OPZhrm^WBcPTG.(Q3>4f?SZEh5Ga/l[cj_!SAXMQP>\LRSE8lPc@,993LrIm5[cG9%@''\r%/+0([l\/p`$S<kWebG(FR:/6]//E&=*SLM@%[`KsV</:@iB15C0mVJD21*$3DuD!"7;/TXMX`O7$jmGnX379coq@Kd?*Fk"X49)^\r%k]21%9`=d2@EGDAS9<E>6G"+"]Z,<kfoO8K;eu3:fJ>F`CTh%C&d'N_r2gc[:X,pHFnL'2X(^iA48Oq4[=2<Be?\:LSA*a[<mp^m\r%B)l:2%oSV1Fr+bk00O`1OuT6=`OCW:Mr;;]8JL0K)'6#502X.>!hgs4,BKa=GK<+`KkR#bX6uCiQs'lri`_bC;YoK&SF'eb0fM\Y\r%,aFOne?-G$?7g#BXMZK#C2IFFboSF9p8am>U5;04g:Y,o;;l4nF]@Qu=;#*32-rAc4?_a!9E+0#Ee]A*o_$SbBt;m,\]8+7W>K;U\r%)bU]fAiHL>.nQ[qUUW@:V\89iWP`=WBf01`T>YVkbTD-jn!RI_YFoePhfR[Ad'3p._TM.`8MYd^Mqm?u`plg,@TYBhK/%[b`!3Ap\r%"fVK"+qq/Y[1sjeXH$h^4VG8V3&,!i90!Uh>k:kU:pTek*Eao-s!'!(d29<pU8iBBT'hZma2;;7bW-fsbsn_U\6@UU*>#i@TKBA@\r%l'*Qj'RGd8a(Aml2ePJWbZoa.2#d]\A%7r%=*)h_.6<a`n.%!!/&l5?2L/4lm0krIN:fHNjZJDcn-,LAem3Q,e9AZmqW2""s(ui4\r%m)P+s3c_-ZnH/OK4ZY7(K9sXaGgg]Cdq3H<bt"&ko]pPKChJYXI1T]&ZIZ)me"^7Jj^`Fj/L/g9#PGsBd[\,;/YhE;B0gHag[3.U\r%>NfR?PN__ofD!g8f)a^L:pS,78pp`o$iP=Ld!c`ndl#=VAt/$7eIE5Bf>_?AFAk?Xcfnm3^_tP3s.JRFqT>_.0m`1LJ/]gT(.nI3\r%4Ls70\5G*[OgYcSWuSbH`eW<_!rqp4Bps'38ZZ`G_QH^uhA:e"*o>2(fb[hM6pEmp)>Z[Ek=Y1OTi*_pHi^;)Tq+&,:achKZ`[-g\r%-P^e>R$cQJ'FGY[ccHS3B#V+QQ)k>SD2mG1#E"RFTt%k:9qfr,#uEKI-ks6Vn_1D5<@A?*o!T=+S!i8/U!WH=3/BsN'Y6IoQ'1@&\r%)aU+[eTco?W.A\V(9!"b:F')%6LfGc@r!&Z1YL'"]ZPS>@'\L;iU+=Oo3su>RWL0jPjqWe_\_=p0Z$UdKgOB=P!!*FS2)K,\iu6e\r%?A29C>3p^Ol:INh4fOT`l9s!sdXM-o9ch($[HQ1/_/U'(NM)#PFVLg*!Dg[p48Csd5C,p0d4/Fb;K4+CJMO7)Z!3T\5fs.5ED<S/\r%EL90U@Bb`EEY&-5ppbj=`BsgaF$!Rea5N=WX,r@>PP!Lgkb1u\&;AU<e@(7!b"c8KNLV&a's3d!S#;pue>lJYTL8TW*e"RKAi7+2\r%7&uE6MBn,2.O:jBY)<Rf@U8RH8ZCVc/+O<3It?>U&,a5><>\<c!O[eKNtOZ_.7KCWD&?Dhe.uH;@W1A/>50(#Em;lkr`T*?X,iC2\r%TkEQF'C$sVQHP?<>6#'>\-]k^S"M:f3-'+i:34r`Z?u!ZG:GLtj38[k^UF^F\aAQ"dQGiKVOQB!r[jYADaF-b!ET`\67[3.]W^3l\r%bcU[nX&NPIFpX7&E*XHYA3m#SVsOu?-BL<l!c</6EG(J:fQL?YZ/(P\Q.pI@h<PI#Fr/m)PJ`7^di9G!W<-p\\o2sS5.-a6&88\n\r%Nc&lbW^,;Z])#hl.9s;C<5Zr%?2(e`V)MLnGHdk+&YCQ"G5$4H(I$Ro]O1T#f3&P]'&Rr%:YQo$PJ,sSH#.\*!M(LhmbmBrA:a>X\r%&[jc:ih3`3*gKtMf/cImkqb,hg?p6>1Hng3m1/P=;LId*_E'1"0</]N918q91HJ0G?8"-KGj<LOl*u=LCOkCs.>d\4g.QJ&Q@!Hn\r%?;ZVXJ5G;thE1(&ieg!i(S46.4+Q?dV`U..lK)0Em@l\h_c(9V#lF/=Rd<-\fm?5A=_P4ndPb:Y02f.J;MOoU:N<[0+Sk`fi<4>A\r%I2ALL%dl%V9O/o9h-A]bV+*3TS(&,qhE.*SnJ/df3:FO;>9=Z8$O6'j,RY#fo(:e4eM8tI\Q/7TCJ3&+F,OQ==5V:Y%hub=aX'Gm\r%1*`37*g_9.%AM2>#T+!@e0hi.;p\p6V`o[s6J,\mN'=5RVl)U%iWb%6>"mRVOJb:)6k0EH((R#34V\;bX^$KET)&T'pVdRGH0Q'u\r%7i!s!jJbp#Ob5rkqW(GV4+85*YWLJBK08f5HG>7T%.YAGiq2ok#D5/3$2Q:6#(o&2$!LcU%0k)BPI6nrrV/??($tT[58HjEe9Y#j\r%fsO*\$LR[QY9P>W3I0=Z`lZJJYN_^O<Z/$+O[@13!+a1B8$j0@+C*A]C,>\B6Asj/`];6&3??%f7$9a%1*S>:S07V^`0^_[F:cY,\r%eC@TqRqJ)u,3]bC@6?k[K1E;;PWDBJjj_tsNatc<M0]!"\gV]u7knE>&tMpUVZhWM=2')5PnH<2j]e.Tm5T=X&fjV(dnT>"]0s]f\r%l.75+mLgO5L\^j7[0io02.mSUBb`-F<c.7PfC>5g'RW`4@8$p;U25HC>'4apKf#_A-]R@u+rrLPVF6uJK/t"J@K?[U(rg[ec;h)7\r%*JQ9h,O(]B#5=\^8YcGXGJHKbL+s]?%bV&!c6J7S_4d&R\$c^]#)>E(>l@K9E#-td9H.77YGO8Jg#2Aa"bpcj2Rk324'W^EhC""<\r%3E-q;2SfFE4Q)kB_jCq8ailZQmV6KWo?^Ds(McScDHgO-31d%r^=03X7Au!%>[:6u@!CA,N\Wd]bH(<ra'?8>?<iTI0sdR,b^t?2\r%BJ;]W@A>^G=2PtHqc0Isfk5HC?'('OhU2-h,Waj-K*1a!7\+Z$pa5BK^a\+)E^/C;Xk'cW%=OSi*,q5D%48X&EkkiW2k?H\Hs2:h\r%WrnCMYT.W5+1S_G8-bYrA:kT&YT.VJ/<Jr^*,q5Dc'Ducg];&q0HapR/-h]A==#si#Fm">,[BgYp:j1>GRc^6Qf=Ut&e:M>(oh"r\r%kAYnW.%6i]kDY6@H\\TtCJ?X1%Y%DRih:tebh\je_/m-_[uuXe*H:5<o(SJI%21@=cEV.*RWS(^.I=OY,fq3^kO@YdRQjd@S4,OG\r%aT6&MhsaDJaT6&Mh["QF@_m,q^BFBZ<:CmAIB_Ta,R9jIa["rl$L9>_:Ltpa38sM?3IWhZRh*UA2j9RBM?E8gI?)n[k=)!Vl[\S$\r%T;s9pQV-ZCioT[uT[3!pJ,Q.gKgD=m5URnj$2K&[Zj?-:7`ah/j*pT>(G_qYqO?4a9\Smge'ieu4800@Sf3#"q=`aY&=n0Zd#s[E\r%qGZ-2rI+I"LQ.(Ec\T:I@\Z&1?6#N8i]D#!ENo(Jo)m]W89!C6T"nCe];;\cn\?g2m\nrh;;7*hk9=(bf9_N_:G9nlOINi1?KjVC\r%_h?i@itYkRaFZ])lG&qKFj,,++JL(M3$lFo,1n!,0Ckm'G&0sV<I\)ieb!6</l("e@lk5bQ0[\4r_uM7^RZNFAuAKjJ\,qZY6bW&\r%-X:ICZO8?@h,@fTrE;F(hS1`!>'1U1S`+elAVZuUf5m3"8nZ;$dSKP]@inH]K%bhB]'L[+qhqA@<_n,cGS[hGqB\\a`R>_QaWX:n\r%T8B1hP+hA[.A6-$-iDZ1ekYU_2^,=GVC1$O8q-Wmdd*?-q7)!&2b"UaFr5Gc.MXN!V,'<-fqfC4ilJ=O*;I/lcbHLRQlc3gF(D(%\r%F=o`M/l8hGDIaf^R]2Q3hbM^cq,.@Q2Ps)-1V-]7\T`AD&lO,VJsO&ZQ4b^;=fAT@ehX"AH[LDRR1XOSL%,td2"1:sN+;+!jVYpG\r%/HO]L@aNQP.2!1A2Y*-?V8C*$ebRp$BOC28=(=7e3>h[scc-#L(]juVB=IDh'n$mgTNcljpSM/IGAHT(o@TXW(=guN"e4oK.r*m7\r%:5C2LlKS;i:1KTZ@/)Ns:OLq6El==,i4L#05:acmpib4S&U2QT&kkMi*Z>/X`'0>c:L13nBetaXQ^qKkh"^LJDc=-?^#V,g"Bi1a\r%@I+r*k.7KEeOM%P?B&t3IXr.@0>a>hkt@H!KfO4$B<2#P2L`-4:e6kEhQa(HNH9#m@@!?tg#Y<.-%nZbrM4H+gcU,JbkG-^^T+?H\r%enlT#$PfDlqe7-I&"0h2F6e^Q4sc7P,r'++G/_KQ\[^+QoURKg:[.I.ZF[^<.hZ'gaT<&rfV;!Z;\G:k1gTpjns%(g.7'dub>T%;\r%VW?Y_'CqC+,hq=Z:W^$[PAG#roK9Hs`?a3,*F=eC>B7$Oj5T!&)Z"mMikeRh:E,4Gj+GoB;+fD_*qh4r)T248gM*g95>'#*7VDS(\r%s&FR4mL?3CD7>T*b#Q0aF)aCj=/'$)Z@cM+qDJ@Xa%FXa?gqVh(C-sK3X&6.`N8UOC/H6c@LD2"hP*qsdrK@3g4U0X4q)n'Vu+_m\r%TCd'E)JY25Mc["IT1I0,#DV\D><&UM+[,_ELp[s7C5^@S8(Y^uW%G*:U8?%Ldt>Si&*A0`FZh$2Ph)NYeCIUYZa$q?6Z".&1Y,T7\r%W%HM/*jN-T6Z$88cQh#l$FPS)`O]CD)bX!#/?KZK?0q9*3.G>2%TOLW(AXf4L?c%tB^,6EQDH\3"r\OdN]StK&;Em`VFW#)Vp]S`\r%5[uY$k-'0a-(/lrX-^offTI.7h;:K?ir&Cl5$gEEG"cu;AM(BR?#)Ap%MS51DXYm<Kpt<>j-<o^H3BPKD@\mI>FMm:K`0N1FT:Ji\r%A'_<#*7(0]90FIR]=*5jCorc*f!!RsRk3"TC:-sN$"rTtcMbqhF^K49E@iE[KJg'i>2,\l]B1$a@Wi7d)VEKY[D#M7;B,(1%GQZ'\r%:2I>FZ2KBW$_^L'UmWg5?n##YHN@>DR3-VGT[d9SV6tu#'jMYt:2?iK%sX1H[RS[ARem!\EDL<`0sle]C7L6-(l:!*_=QYMQnSVK\r%AYkYGk$Ao:%tP173)eH3nZWolg(\&4KBIr=GVHn5(^$?TLR44b?pi1/4Eqh7i1r+FnF4ZC4N'VF.b\YC?E=/\oY#7G8gKf*nISgC\r%8h>dR^]loX"n</VJ;:J'lk[61%!^'86<FLSll`SbGf-"I%!WIQ#Y$qTc*L;4YQ58>SW%Pn!=X56Vp]:pbGHVEeL''5lW!..=T2)m\r%/YJDr!>1pNjR8[t^D`n(E53N,D-9ZJH)QM+a;.Ok^/\dIF+]L9\4ge6O8!.Td>FhDO`W^QZ(`8$CrJJ/ekmmpZ:2"W'pP3HEBW.H\r%CrS%-KV!TF1S-i^Sl,*Cb]j2kGj'GC1?6c`Gh+`bZJrF$#,k"$hc;jD>*dp%a(<5jVESpVeb`4ELK$q*[%1Q-5W<,aW&sSrRFRcC\r%`0gkAP0KI4`0gl!(H-2<&8.SO#Mp.kMq@u"i.!BdHq2chgscXnKasZY];N9BR$Nlta40"3bQ^5&p,o]cH5Z@>`:@EhA^L$_c\!-J\r%etD1eMuS9?Z0'nUlCSjhVoAXLYqWRfiE'7iHGTiWJ=S3/oL)>D9hla50GBZWdOmD`d_qk->\g";f1/8*A@:.V`^&_EGbHMCl^#n+\r%MebkA,pHN7Z;a,.Ytd2`M5a.2X@6V\=nJ<>rs[oB1KmbKK3+3m1V':<M'=Ea)NYqb]07Ia[^XXe8j:cZ!KTsDfoHAAN8o^^C"C^9\r%9r."D*N_*>(7`gS"D8ZqA`DZS@@35c,0d",?h<HVJk.[hAt>-[8[IHps5d3,<"5Bdio@HF^F#3PY4TJ.-K/,ZIG[":d=$B"*YdSg\r%U\jaMM`I>Td?jEch78<gjpTEZh7)S2MZn(fd=$A)*/4lCh``a;,Jpu]p[+CJ0tVLFCaqb`k8rHg2p\8?lJ/03p;iXN_N<?'D\#lt\r%5L)DOWJLYX;R62noJFSGc98a(ctW*fSU5I6OHj/jbdg7<m2;n/JXq.0Pq*/]ma6H05]-npgm\Zr#$j7.&I/DO?@Ksf7i=V7HD0*F\r%e<Ped;iOd@dfGm1QA(@agG:nZJXq.0h]BmV45<?0-maq'o"h=C*6%j22\A"V45\He4F^AYD%Y[4&b0/(]o&7^JG*%V12mVCbF\.1\r%%:n0KqFdaT,rN.'hU:RWSLAL1*OS13>qg7/diS1<UuS/@@N:M@g.O_%@(i3kca:nI42'01cc0*`>:Q`9?0l["A^?s9imY9T@+iHh\r%@_k`b%$j'G_$2a`0e@*d+.7hg*e^d.CGLrbn"]G[W-($_%bnP_Rg?'!:J[DKldoWXXCHu7'4j<4@i]WnQmh8d)!bEE6bXH(BH?]A\r%X;cF]jhHdCiK58E8YR><8Gsc1KLDQE?iHVr8"pPiU-PWA?H`<m;>_Y9#UE8LAb4/!EE_,H5se*V<q1ea3Cef&^J(Bc1ti,pk5Da[\r%J"/o8?,)Tp'r1r7X'0)15_%Z,%q[%`r&Ta;@e.!/CEDY)RRR2YM5&Kl9bP-GqS'5#6(dje;iR?U^t8<aE"81Kb0=nT<c/s"dW?+U\r%h]n:U'R_79TuZnI^4SukkS_!MC!fg;#<%=-eDkti!\M6odM^l,Q18"jLJ+(c,RQ^J"jborT9:V:etBQm#&^W.aKi)iNC7tcDZV^D\r%Yd_ZG;YXg$kX@[p8HI<(;^t4\9FC"S9W8_R9SuGNDiL#R@AkGQ1I*d\!n69@.L!Mp'r8/^afN1XREjAC2dl#hJ`gc?V=;<sE*aO1\r%cB`*,Z?%;7EA7C;(1]RlHWruAR2#L%N2=!Pk\T(Z1+=X9fMj2OqjZ"q>OYUtosR3\Ns/ujggDH4h$GNf8`?!=c6m(_H5.5@k1SDh\r%#>nSp>XGcg)*2!+F2c_b$I[VU4h]'\gHM#>c@0>,9F==SBBsEncB_Kkr+bhI[e-+@QJPZ(eu092`L"!3`Lk"`)+/nTK*#b$[3)l'\r%DoR+tWXMIEqKu@\-O91V^naO!7Yg2U"?.!g=6u68RGoC(S=((7BHM+h("2iOViE,/cm?AEHE#dH'#g2Y'mHKcBrt]VZInB>Z17@#\r%rYD^4E_.qR?%a?7>ga!c(X_6c]]POP6I1)t(dOG[nobNJ&mohH[3#2oacLC_&4rab[j1FtgoDsg8rTMV4o<a!.rrdt"3/A(HR.9N\r%%P*/W5E(Xhp.043(a"BdO^p(sSmB:9pG/gX4kt=lU\/FIL>43"*P!(W$uI1-iGd!;@+7XX6^pW=JC*$ug/=V!i,9;a[##2E*+P`L\r%<`#p957qJY@e<-PqjX%6,).ufFEmpGMAZ&*%6mOJ7Zk#Oe:WsRS("_5d3rJVI"jEmYYi?c-B_oEejjbMk\kVTZ=G!1gI1i%#AY#.\r%!6ZN12'B2pU!3SnKRh-aL,KXlqt*?T7Ho<M)at0P,&e-52N!CU_(G>jQC2,%7:W<hgEpBY.NQV$YID#f[G(#Ik?eUs#I+.$<3(rb\r%'i^?o(83OYHh4[Be_?Lf`A$uS&%1bL0U:cYk^@=uM'%j34I>+55fB;$=_58'/M]-Ti-6rBjPu%;p:S#noh?9qaqAq8X]@e\4>(jJ\r%Lf>cr4ekna2<akCkFq4YA'h"*o;l`qZKL0eGV=]@0W*\hr=XpcBA2r&REM8de".r/>R!?`p,p$PaDB5pC!SRj\QB;e54*V:*-a,h\r%Skj^)iU1)2kkVUK8MZVuc_io:SM;1<Skj\SWlB;mH9U_As#Go;hBh8;8JIa#4eMF1lC>@;h*k4I(=h2qmcq\]V/OH@WXEi:`9Jt<\r%l68;5KBOpcI>?.9:u+Q<?'6aBGEGjk,[>PU<#=W.$dr;p$]FNj@l<KG[-,9^3/9fGV`bQmr&b0HTCtBT6uX"8!pu)*e6U9oV7/b:\r%V`bQ]0d"1;?@*_s/U7bN54*Xl6n5N/c_io:4d?%o7'%CQgW[9j*YE1C8<ULlH9U_AR%2K?d.:tt_]2*p4X0Rj1U9o(3K1m[#F!6O\r%#--*PDH#Rdm,RhG,^+<S$3)m!Ik&R61lknD,BT!O1lh^t-mT0&(a=u,Y:XU53Xb73Za'O+M\3@a')dahNW&."6]2OCHQ=Y\W+!a`\r%+qOr4I6T3GXeqm>$cE$k[_/]B03!>0U_dPM=W"r/>S&-o>ga"Z=2K4kMue%RBV:P+!X@!T!VDcAnAYIr0<=[uJ>E:<Ffqd30>hW&\r%m\ZETk&B@hK2!?ERE4m!W-A`DWs5,_j:[(GFK%]#%Kuq_a9aj3"6b=:8jP.]/#gYYIRP,uG8)g4GWNU8qtYkR!%kI"#;;LhWkE.+\r%a=SQC!1aZd4de`$#*A,(>MMlH$=:iR='P,4J'=VO)[#;-7],T>`uUqS/ZmMi;PN":-;g#"^V5u&$[E2p]2mL&RZu7&m%YYIoD5;B\r%:X9$aELB:Gml1(l^gbC#DkOl@r:h614DR$QDfkmHR<_l*_Gba3>&E&47k^cQro$I@>[3VX,5OcIU6Y0V9tgf"o;\\HXt]^t[r'd`\r%>#,Zn&Is\eJM5^PJ8,kna-%65BX;N,#AcIZ.I["=pf2n&)lQh.LKd;s/Z,1GX=;t?HJM5sH%.eId2X7+-B%1i/ZOhOk^B[f[,KG#\r%=+@0#>5GI.K<$)oV%:a,f]a,1:Xsag-DB1&]%-u?cF"_5WT\MG_N\?E"[fa``kF\3\'Z'TD82[M:<0aj7^e'RCq%&rDOqj\f^9Co\r%@8q[?q,a7C7M1dTOMOfT<(+>gbG[0hY(PY[C"saUN_IKaF1F_[AhTeBTK9Wlf/SCA_Z=GB6F6];<RB!F]8QK-%,]CDgtYBHofG0m\r%kL\`9l)Wid7]YsZX>n;dkN-F<GeDIlI$PHdF91ik7EKN?J^Vs7/6c2t21ss\2r^Rt@6+r[(.o]TO-F-#.Mp^*5QV]%>;!'^5>c_j\r%l$C@&*H_S.rD!+PHE]UL<\A:FMa\1.(K[^\TBq^J&9M2EbJgmSDO;+J.i6h&dl8\b"R"cJ$P$A96d*Fp<.,qNi`[!dd,bQa(Y<]<\r%fP&(;F)e;g,j6P.Q&BEP+AKJBUg2^Hc^UdK\t8",R?NQ@Vq_^,l<4nPb$m35W*ET!Vp[:eVMrjL:%bMC(f56m481a;U*<EXkE3>Q\r%9"7V3jlTLf^Ztu*67sk8.?AA\lNS''3Hd?Rj*:!F>j;pCDEcD=.QFbO2:d[b;%7T[E1-NgOR'XCs*G'_+6D7d;CV/-=2'sQg;^!P\r%4HCIo3%jpqRB'm)DEb+&,g##Uq(03ik4",`k-O[m..JE#,YKdr/B[Wm46O.tU\9*F./Y#o-NQAVi)S,G^?`-%F0fXu<&/2><eZ5b\r%ZD"Ofk[u?fV6NPubP6`4R:/6]//FoYHRd-<F33b-"R7Jq6eQM;>)gYQ7LEk$UMp+%`1coS+?rhPW444(n7hQ-2\q1X-h,&5gQC%'\r%79Wo$M*Y/!_^c=F0m0q_7JDe>pY(bJIN+oCW<aNBCPQi];[gI^g;)A(f0<F,oBj8?21usQn!IjlN2@+pBH,QmHTQ/`F$);QF?>V`\r%mSWWSXr12m(7%)V:A5OXc1p6T?;RsMPO5:!nnYLCe6B?4m[mr#_!>P1:+u#Xm2q]iKAZH'lR-i#`k@#$MpkAJK@FG:h:87=ZV,j+\r%3:!>l%lOQPJkO%Lq(KC*kBS8kd/h^ep*+ikI.K!BPA5=u_E,B]QL(u]Be<9la"+r'9BKQ0@^AK%0fM\Y3_2lG;Kp29>Hu!\YbGbp\r%m=86j$V!(ZV\6,JZPL$k!L=8ILLi8Zp3$r::EP]Tlu^`Y6VB(<m+gC^mZ*Km)bS+bl"DJf=&BG+cr2tACIp88%B,!f/Q^*\WO-"u\r%%4sq1FQD_MlBs0![uBUmO1BL\]XWKen"p-/48joBH!&(X878@]`%QHIP*mJcCNe9YS>'*N_]!pONn#0p1l!^5X/!KrD+-?d(/b/8\r%'eF[KIMLR?ZUb8K)kh[o7gqm5*D_i87oUP(0eDGr,8BhS6j<n[hi'V\rp`_:8W_"Ah<K#&M7IALQ6:/`6+:9LdO@s].D/#g3]7?[\r%]1<*^B<K0!1WF%*QZU\s.6<aen/<i-.oWJaC`?,H1[+,m$odm=AO3N9/K*]L"RuU_GNEsEci-o/QZok9\'8p!+$2[MaIPLI8b:4(\r%j_hYQn.PPIJj"ks;*1b"r\Z(C7kq)^i)0q"+2nd4"kSGi4t;#m;?H("OO^IGV9J^pO(*(oJ_N(jHk_3;:S4m!'Hb:**[SpZj.dI.\r%UMTbII\V9.Jp^G?+#M-,+ikIU3WZ"']n1VB*.&LA50`jq7*a9@B=i.J:sd`phUXV+6!rA+ML<fNG"^T5n*ePG^OC*E>T:r(i8=`$\r%msm^7;,O/hl8C;r=EM>^o[UI0(@TVV=LtQpMo3'jS=l'lqq]BG(DKd[Hs3-M<K+EQXm;$HUs@<7lfPdgK'2muL7h^,V:>Ft)%VQP\r%qfq"$O/):FVFLEC0`)o8I\e^pSu6iEG">0t4`jjF;LDV'I)G0_baS:QG6q?^GS<FAg@m_SHQhR1)<O).^)3brcdTO^c<,T2?e,Wm\r%keHmgnR]u7V=.]/g%X3%drKq[Ub=mpRGB?9X6Xoln#+=cf#WIu+g=)C1n3UY\7q$dP^B7k&'^]nT@q`Fq#^?*/uiTM919$2)AtFN\r%TN`ul6d"HcD'?=b"s#3?Oa^#Oj7WI=(U'dV.-13dHs6&6VnHuf]Bt]sHDf?)<!L9;/`#kPOu%M2X].fb0[_:jN?m2pN9C(oUo7Uq\r%pb$KOb%g8o=XQ)`[+]8/)_L@lW?>'Odo7Z/=E!,r?M%1YL\1k3l3.^2m@)eSGZ617j4\[`'A$AGSn:*9<]oT&c^=76e^Wc!Z$JWL\r%p"G1d_J)*H["*&2G]DrrPW.FcU"](I9R6IGBeA#JXmIa#\+'-]3pk>\G,[@5IX,r>/TdE302@9\k./;`s"6SP[cA-5g"P3L;/H)U\r%kL&SR>4&JXN$PSYs&e7iS^E5]G4#1n=LVsd%olTsDr0R5)B>ItqY_'\a0T<0`G9d?n(`jFJ)\Wt]lZ/sE:N%Q?ILnB_;`Wa^!IW1\r%-GFZI0Nr[q9@"C7*2'li]$#+3%)E=l2F-C%TR?)5R!KM`/d7PcGIS>.T0hF(8@XoM/@rj!oZ>-m'Ni0M$_md0oG@KZV?4A8<<OeU\r%=akB.$I$q*epCc:!jhM8lm[Xb^oUHE=tD3.B'HM`5"le#bgKirL^MA;VG`3WbgKkpRN,jgl5)gs$bE&5#H/WuY*P6>S34/DL1IB'\r%(T=,@m'X!6(T'(o)k\Bs]<XsWC^fq9>Ng6]ZC($'_&"_t_\Ujc$qj!=b"tBBYtd2`M5a-u5gQ2!eG^gGpj?8+O_889?>7h=;+)^)\r%"!XOZf4Tcdp,4s%aep%(!J7Ir>5H=gN;\PXBne\oG&[_6o-Vn-q$r,^3i,sccM*WfG^*<"U`#7u*9&L`Bnl(eEht0\R__$C1E1NT\r%\.Rk<KAgNdnVo5()[uXSo,D,:0^_GoGD!.rCk^OY'@[9i&O),T0WPSdNA+EQ9Rg+NDhS'0=tG*Z3%i/RB2)f!N0-$[4)=,X4JZK@\r%V`F3,VB,71(Rdo;=]<VKMegU2:LWtOXC@al,575a2\?"Z(L$X6P?s2h?MC<aP;q`:XHrM;8a;h4qjWc2]RU>[S+I=Lk9\4i<OV?V\r%0C4CFe%3*%'407S`$Z.Ec?W!e(a:'8&2fWbkE_jY/<Y5g<YXT4;s!"D;9G]$QoQh:"GDJ^,>URpU`SEn9m!ird$(AEf@8%(S=L<k\r%3m%_#edHo]a[17BcZrsE'kPh:Hd3!^@<L-]0A%5A9mSP>H0qB1)_WZIj]3TX1\t@>@!:\VS6+(8dW,6P9LK-$6BZ2L?543gAhIGF\r%H!PWNRI47]UjH.fLjd"\`bOsSlU.Gho[TubFYhZnfsO,f?lW!)IBP2l`!Omuk.I)=,C6ZLZSel9C11.i)cAH74'_i2!99p+5puH/\r%V_&Y7nk*@NWZ\Rnm00*LJjd'#q(C(D>nV.k/,43&>]X\l$Ts<Qo3FZ52UZ]6`(UdP1>N,P[OJ=A4B=PH/nX7X6r/#82q6'!Qg!Zd\r%F-=_!LEU9@$[/[d4:Erl5Th"A$%_(*!Hl/R:'_8heW/gT%9e+'XEN<&OuQLS,eIuf0Nd`)HmQ2XeP3J&6#_D(oMVlAQP`abdUJn]\r%A.e\l5r,bBE)P/Vjj<Y5+%A_c20X_GQ]Nu./6OKWR$$Lam0P3dbGmiSRCu2NT@GQJOc_N=C7f5q,0s@.X52POFk#WL=ma5AQocNc\r%0WQ4C$<'Dp+BH*"LR4.Br)=#4[2XI@Ie.q)=m_<l7UrKW@C63:Q#]8YXEL7O9PNnQZ.`XJ(C'p27/oQ-*C'I_Qdm_1oHXbuXEM^5\r%<.a6-daNS0]nV&JGA./T?A7J9`i3[dW)=7kk=\VB[49g:H+ro/&Tk'BjS@6QI.]Y!i-E'/1uG9Y'rP&&BQMhn#qK*";C_ITn'EP@\r%LJ:(F;O14S,o6g2Q(lQ\$d4g@8dKB%F).&OO>XLFJN%UO\PaJ1n:G_X6J`ZR;(B(_),dW%IDRVL>U`=F9\nr!o6fe:^>QO7OloA5\r%o:9n:_T8"JPR=M6,4^-GBtj!DDSLJ2oNp4`?%jE3;T,Ig:nB='bnor67-+0ldsTua5/2BWoJBpN/;3*[daNU6HXA0%OOPFok)#!=\r%!0TB2^kWMak=\VB`Iner"@08A$(0nfPJY-+AgMnIU)a^7;<<3*CW"[Q!rlA)/3p7;KQjS8h4bp^h'.0KaN.!]K`sHR:.LAnE;915\r%dqL?uMuNi7]OA&F/J910a++>l2@aY9d4@Pp(:2QhNf+R,"mA'J$gC8\/AU8MMZmdV!"EKO$4G3)!Q)1HZN(fjU03#LHt;tq'uU0\\r%C2CDD_dWYpV`?kBJEWg"YQ-6f+F:eU`WEM2\urt="IdY3EX?=Y>2rlOW=0TA6/:W>aTAh?J<Cln$d^'u@N'2V/ASbsU4H,V+T.LG\r%>kiqQ+k1H[:3K-h3&Nhq-=2)1Ut;u*Xi+ZtV46;n7Df"2bsQkAS[aHKb.A`'k[/F0FF0Un=u(pf1JEiX^0FBT]2VZa&pQb;Mcqs#\r%hd@4,e0C-:LTV"ZHo]eu]D.!=W1&nENS[Oq?ZM/:?e;1[KSqLMoYSm^n`%_<]r'8do<10@pi8qZ]e:^;I(?$hdZp?^bE"e^Ij5>a\r%>b:XO3+KfNQ`&cY>QmufbL<%qIpN1L/l0;p<9*lW^0LBER?aC%^mE69B1tRp)YAF2o?d*g]BR:Pc^R#n7_aKkm<OjG-I:;(UNhU,\r%dsTPX.4!6+DU1-%`V_[.)!YgCG6D`.0snSYnN!(Fkd8@?RU-CSYF1(!+CK07QC"/8qoA9Hr%u)(>$gWgKePOT:pbO-+]-XGU#e/f\r%;.MNIq6]<V1/m"Hft2Xbo/tI+H(&%Jp,ptL$eY)\Yik82DNVMgUq4n[,>r`2f^kd-c=,)kC!T0(Ku]kLe"2>["hR(HV`bRaa#FKR\r%54*XBH06mFq6]>LoPA,lSkj^)3FBm?d.:tt_er\%K:YkcSt:p*2<_#H7GXH"4=KZKFfkd]eg"@;hA:IE_7o</5u!07)RC&B)/PkQ\r%>?a=4e%C<*)Eih323<^!k,Q%M-U@4QT1`&smpA*dH=tZ$"bc1so/EqQb(!Ggg""Rl<5=QX5,#.ZhKSW)i7=Os8(+TI_\`ZE&s"nh\r%"t'j<^U_?Li5,Z)#1AH]k@6k\$AAG)UAlL,#Q@f!_uH7j^R2".IMbkW:\&h%Oh36f6-/AngiZ2cgd#r&l`An7krQgZ?E`EAniA:F\r%*U/mjjE4Mk3`P,`\:8UrJ;5)$S,4#2F4Vpf=#m)FoEOLXdG%'D#<jj9O5;5[O7rB:YsZA<M$WMkSbe*hK`uGq]Vp<1WQFRW"l)r1\r%*JM`91W<2;k+?EIi=7d?19:*Uh(RX1:Ak8%NIUL[.sE"W'tD?Np[O78h:F'o[D*7uq27C<f^7p7"&98[i-&$UF)(_7mQdrLQ.F9F\r%X=giR+0.gno?debSHl^.=+0B<[#f#?N,rsR*:+VDDO?%]EdaL#4S6;159^EFY$R^6Qdj[9Hcp)_3S5(84T8>Js*M>6fbHcHYgFuR\r%U$Grg5<U%A#BZMpl\Fq>5L=O*j>qV\SI6CkZI\j26EX+^T=CT\>f_%Zp'G$f6EYsHn-*+\6EWt1U$Gt)Ff[+l5hEP#J*&pZ0BeH)\r%\W4t&@,47L>sLLA"^U:XY+mf8&%^'J-oAT3r6TR=jLQqR3#i4C[">,u\]/uk>2[4L820Z>?)NT6Qh8.OCuWDM=hb(Q?ak0epmUFo\r%KHe-8dL15E6P*V-10k5WI(?$h\-Ts?7C0!p2\T)Npi8qZ1M9+?p`^p6@>Dc;FI`fMNq^Ql5hEQ.lfb>?#@6Mu($`E^5+q4Hm8A%3\r%r'ArFOR(Ci/fJi&$b6a)N%aBU(NNfE`?<UnaE;_WI6lJqOR&(r'=uI8c1"X\+:jA_c-UfE80/Ne\Ln&/;mRUuF\7/pkW2f=YU'+!\r%Y&f.Cn,t[KqJ_P_@EC0ESI<!2VoegdY5cs[s.pM&d/tWX-(%7<gB/\nKad7J^`F>l!s\YEhEA)@NkYfgl@;/Z6#7'je,]q<RDPh3\r%FPfN;*a!+d+<HFpfGtE$L/FLI_IV;knQ]K7"r1sQ1<cl>_NA9hNaeqB%#Zf\5<184L.)sG.YK:hlpO[$4YTb=%,Uktl,+]gHPja@\r%"(Vq+T1W#XE00Ep=S]op_V@`!Qtjp2'c\KG(jLIFl,,fmLLFp?KLV>%CE`?h7O--R[@mO466j^^[R#D8/U]TLp+WL!!]7b4kIm3o\r%lf4^Y619/olQW.r7IPRtdnBlT<OljNn0s&F<95$tP%;F+<?QlRBg<$-r#uI0;tP`9T,92g^^>du:CL-:@"gr!-TLcpJ3osoP@\=:\r%6P<@ld.N6p`<%M'\iu6e0a`W;:X%U/DhYJ:4Ias54";G^Lnmg_M4]>5$=08pJeSPtT0UXCf)1i1:F')%6D<]YA,;&*V8r&Po0^pd\r%pZSk/IrT&kcKGpi=!>(?U$7cK*1hZU3(.=o58JX7n^8eFI'EYYKmru^Xuu`3?;F9jT!jo(Ec^'[Wn5]LU\-B?-opqe00f&57QkI7\r%[7[mmWQjLN$S@7Z)M:ltqCcolH<`rc)>/q&!(3H13'm+FBKu\@<^$)McK]-pd`p+X9[2l-R?V<Q64oj9AA"&X!>*!9RIF,m$in+o\r%J&!SL"b>6$=&WK!@5[_,23*U<B-MO5joZb"i]P.BA*"4&J7-/W8?up26E5M-6tqceKga\u2\[3P0*lP.eROQ^4\XY[Wd?6Hr5?:J\r%GB?#icg0Sppu<>m2RJ+EJe7ZifhYB*?4c+f,dT9#VSkWB;L++GR!6Bbg`q2FB&Xl-0sWP._VeVD1A<baHg%9NXXu]'HU3I7OH%No\r%jn;F(P@W'(0N./5GMY]',6]9En.GC?R?b<!KXcf<4soDu:lZ_=F"[f=:QjlspJ(coj!:%X\Mpq9<MHJ5qt3[&r5Mj*)2Z?G&S@$_\r%Gq/45&(6D<$;.%sTCB;/?&mYWD5j0.D8,qMb'7E..QM_L%;k^@N-FK`e*-MfK"7YBCNe9YS>$hc_]!pONqjN`emIiKX,Ym$kTrEN\r%34JbC14An%.&kJ6"/[h%cr+Rm[?&3V.b"ZNV"/kD[5m*c.@njR"o9B()!,@NH#$d@dIb#o*"P,2fT)mm6t82cfru7VRoU7TR]>Vg\r%MS+tf^eS3ANLV%V""T$'.mJ\U]oCj#0hkr!pbc$?eKg[>]*Pt[gQPBX1.n7\q/gEg.!A''&H9n=\7@X?L3c-E/XN3_ll3SCMos2l\r%rWI6/B'X#@\?TZt$MkO%7jWt4@_+(nMn3IhWF+N4p>7dKc$o!r4d@%ue&Omk^3RKK:"Kk]+s0XekAVkbm68e0k&(Eo[C5>ub&A>>\r%??8[^*,tG2;I9Do;EnJ;[%B&T!]j@+-kLJ)"FBN`;'99HZc$6;o.lsZ>%c6-,6tKH0c89m1KJQJBKkfoke01sWN[.pIXZ/=Z'1TT\r%9E^b]5>c`9^u1CB4BN_oi[EX5OY[/+Qq[#a.<$YuABNMJ:*:AnmUWe#Z%#h0?uW'aKuk$)OYZ#JplHqD;Am=/^kNIK;`mJUM/"Xa\r%%.:`o`!$AF.sad=^u3j4,"e_W^<#h4W[O:p.8k\g/52pcMA/W?A]e^pRGoYn5eW=lastJs._HqV!\Z@2*@j>f4Og:W+]C4Cr*G0"\r%V1P%VXJ&r@74P7ofi9at+alS$9"U;p;W>Et9%R"BkfRA-N,!+o(:K81b$l<S"o@i\EIh8n30-Tk*d[:=N_%_N-+%KTL[Fa4no*'\\r%<LThX*VHF3)3C'iSk9Zr<Cf^cG2^AS'p;IG*I)b0dUgcTIeR:GZjKC(891A;*E5.m7,m77IJU#Tm#?c3,O:fK_(GdkH36q.`2U((\r%BS@$RX[A`2Z-n*=PY,&90hpu0mi0:noU#/"Xdd4"$!O+I#-S!ir639>FAhk`Dt%$-:VN[dhJVal,LMkK&Ehoe>Dsa$(0fW2RRp`S\r%Xc^l?ItS/sM\rmGg'!bkGU6KPa?"L9MXdaXO9qF+bk,>Ik5?\OgMVc<BE,%3d+oXm7b2b[kV$6'CHE?q"5VtblW&,tVO\4qf]s5E\r%p2^<(Y34e024B>OYI::RNbd&)rHh4(\&HP(HN$q.)[mp[J\_!3cXj-7ZI0_&ros5Qc$fT/d\9J53@ZY+;5DP27XT>X7?:FIr7lCt\r%baErhafK-FLkd!.>'5YXQ0>LJ`:D'NW:a)kT@Q#&mDGca7&t(1e`EA<SX^Mq#YWE3fq)*d_i9rk]Jn+]&-(-)(R*M`GkneDA@(Qh\r%^9$V`>oCBY[oZ)o53+Uof9Wq`cV%a)8IFni2Q6gjV`T-9pfXr=]UhkgMqCMj3o8s/:NSCGRX'?t`BUc/@4k,1c_j%s[3+&qVClfT\r%f(IF<A*M+,TmKH`b.G/1G19$D.e,<%YdKcLQ*o)pB^,6Ep-\$10+@U&$OU"_k[u!=L1c-[\o#?j_#`Ft"kV"'I+*dmf/F?t^S%<u\r%(8gW2]*3NUP%XD"FqMqXZ"V7g'H3L:Q#='u)*..,agZ_Z(ah^)8[9`CDX+3:FjRI7f$folCO%j6O"pAE<D)8fQTV%0d)n!oI*'ia\r%BC,7of/sc9*V>JJKeI^tmpK1\'Y[Q7h<2Ag_)V%,Zgj2sAWO!PVh:Jbb'*#b-(A5@4J6&g1&AT-/c*/OhhCoQmT2<[3839BXre`c\r%[Po"3R@!7)5rK`$GOV.Sb.d%QhLh_(R!m<0]E`Sb0`.H>H#MuWFS8Ac`lRa]`BBpSqQ@4KXLKWWgp'3Z##YJG^a(oKUk62\B$f^G\r%(F#4r41T`_`AL5mB4)BSIr4=sED.eF='m4?JMa&''eIQW[8r>H_jaJS'ukM?s$')r9l80mKOqIQjf[+^"6DSG?J\.dWC]FU_B/(<\r%mEND!gj]X@4H2%a<$LcD[pP+DU1e!I4<`=FLf327>BPn5r1Sf!,PWm&@oh(lB;%jPb6p8a<Fa./)Ck.#3^.I.cfmQ"6.8`$`+1dj\r%'+h=rVIXGI\<bTYQVVn10r6ch4)-6O*ljRg"]@R6bb970l^&OU[PLJEgnFarrr&\K>f^VArUa=5^B&fok;K63^OGnr$)BE^di6Y0\r%If3<Y)oE+Uksae0q<Ju[]oF^^0u9LaNFWfN"L%f1.*5;<4hqa)Tt-R_%uO"nICU@,d7=&,W6N$Ua51sA26O"G/+>t1E$-DLYmmN'\r%*^]<Le,U@I6b35l:NDN_8@CX-m=!QXGubeViZ`lUhY(+RroN_O3ec`QY]\i"qXs3T;`QVo3[3s9P3gj2V']NVTbcPND^9*k5O4bc\r%#CC^=RKbCD+Td?'Ag5%$ME/E;nFj0TM#qhUG]X\5(^8V+6DCI;`N-]:7eaUY@@Ns`A]Cnm8k_#T:2KOdL.XLqTe^:0HletGSr-dt\r%:i;m/T.82h'3MZ2U%HW#cYb-cbtsSih[Lm/)9R&tnU`_Q#j5l3Z\,dRbKOI7cjWIS\]?ZgA)c^\`Pc^'dqp_C%=K$Bh);_e'-gO3\r%]$1EE\GD?@kr);F3[!8@,27&pPYeq#S`nggMeo`/AI50e>\'?'IM#;`M/!!X7CThK2VhqSd;?,5NC)*2&Z02fQeL/;H:9pP_PB!n\r%!MQ/+Ndu"WbT70a\%0R<P,mM,[uE"E=u62mj0^OgL6ZOHC/W1K?W0HETGQEr'2rAOc!fI;#o94YE/1=F>_ikhcpI!*?22"mm/;!@\r%fii"W%S8odT=l;']THh@7'Y1:f(DB9C`A7c-Ztq4L@>RG(isb9M7IP\`2fgQhfIn0S=:&h6Kd/%K'+7R]V;2S^U37`3IPr];OUm]\r%>L4TiEGeh&*iM0!8UC\0F=OIQW6'IHS=?nrlcEOsE,O5P-q24fKugl6>MDE.]CKmsKq0oM1WED8Uh^^B$^ocSqD+N38,)@qlJs>$\r%:G$R`,Wk+U2<t?<_ab=EH)1JhnDUobq5*I7j@0]'LH@MJ/N7/#/).$S+okt0?1?1"+FSV_3C6pur6A^L8T\hQ7cNd!;8Crm@iG*H\r%A-p>:OCTt:QBrafo/C1l`5c]9$CDc`-J/l''^PX"P/AtNX?71Z05t)4/Qi)`=h]bT@CZu"/NZ)u'?/*]8TGXpMNrt6I27C%-rqCH\r%iiVWERT`rZbYke<C.n#QP*XR4>bI]MNR,EPJO[E+g,]6c=8f=gei:7Q%QKeb[4NI,'d,9KhTFpJ`q!kC8q<;3PT>4$VhD-*_7`t7\r%*Xh#*qu+7_6E%N0@X]I0:"ue1h.-+Wb2`,KV_];,!==$_D4rpJ-_N<\\M174+nS6I1IJG'&c+VT-4i,:g#6WtO-%nf9i:Kk168>g\r%4YT6oGcLp.jaJ0DI5sbZ=A&.p=O(e8?"Tu99+RZ[>$UA(oeSmT@/541#p+gm8%h*8WDA"+rk9X=?BF5%Lk-9oO=m#.gVZd!\47WU\r%!l;W^YT.La+((s5g"KJLU"_SFSo/].O1sd_GQF\U#UFRG]RY&;"!`P7]\mt='>+;dX5Jeb'eeL15;6PS`=%hK"u3@A"aIfW+pK2&\r%%_<E.iWod[H]:#%!De.#Lga:WKEK?_U*'Z6&IssDh7gMM>9,&)%Sl;*]R]t%6BgPFG_$uWO\'W$nO29FME&HR^FP!bc-c$4,Woe$\r%L)2,?8TPqt_.`iTL)=%_!bcq4,DQ5]oS.fEo9a:c^hi"i)#c&6)g'$F;p6m_71;H#?8@n*?rH!W36:UC4=^iR$'*=%_(`JuS93.3\r%h:1q!0$3'[_t4OTa$VZ_e.HC/8#iN0j4B<S3h3uu8@P6ZWMm8O"sAD1G-_]Lb<*4e<CpKQTYL4Kf!,JjaLU<'3#F]$BFR(qWTKCn\r%J.<Y!VHMZX+UaBRJ_h#-?,jU0)MtjlP!+X+#L+qnf,kK4'f:BRS[WCVgXG<Xf)/Q)n^r(s?l^f,=qljeflTL.)q(\&@+3LZ]#,A-\r%BJpmPfZ`%?/j^M"(c5PopJY$00=]&sLfA>.]SH[,02`sP`iHTKk!Tsr`mT2tr!3F(k&:1`:IF?dN"=&2J8gOCJ.t)+W9sD'1Ef.S\r%MVU)hZCf,98%B!$C@gM.kMKNuIrcA(;Q`?*Ti[=\"b*/3pfmuI))(5#2mnQN<X-tM3u$282R:llX#W.*L%ah,\"::e1lbL!LYLr.\r%]u?.I,cPP@*FDabkLh##%)pdV7@SLKfJeBD*>?JVqZYiAV-Zp1/iWZ8^rb<2D!bWo)StY+0D4V3^(+PLJ?[GL%r`s4[+'N!f17)C\r%kF'/'V#dnJgU2!!Pn-..3c4On/+bO8Yk2*EnXp<eX"m6WpX4Rd!@3^NdZ+Q,X>;\@W=l/L^eK$^3i)i2HItW8lu(ia,#8B0`"%kq\r%.)7*?%9OGN(qTRM)'*slO*LU]<fq;8@ke3J,LFY>R`+u<d%"o5DV4nGX,12gF@3["V&k-KrT!9!&H],B8E9+,O8tl70SYq_>*:&8\r%5a!?H]XXUG]#U\`d$/r)1pE*Q*SRS)ei`=MbeV5a7GsgIN5eWo+ND5^5QZM%5<q&,5naNojNoU_fkT,I!1X#Q[T=9l4k>",=^5!F\r%k'Ge<V8;3oFu/%0&)#U*r_a]LS`7=#&n>Wf(o!9[p"R")d,VYq2Q*Y:V/BaDD:JU8`cWU#dAg?]4[sPXCA)@TCgbJ!(L^.pDDb3u\r%LcG&)VPGm0R-[>sN&-J3VDrkeTBXPLpZb3EiFD<$g4!VcUmK$@HFEe8/]^_B_#a]SgPh"cp%IhtSCXe1/C\m/nmrmqT,Llho<\I@\r%\nnIb;.sJ3W#QOS3%BV^m/)$Cm#(5G`UU2=lYnPuc,;TTVJc=r:P\S=n&Qk.9NUG::#dA\G,>tUdT!MP2u?VCo-/Z9k?QW'lmW+/\r%J+_d?lqe4ll[.lFkYPa%pYADHCh9("690d=)KQ_T>i.(-Y5\7_pa&o[1a+loF]8<I_(X?ncP8$</pAI"3otp":<q4"?`YETPPbHa\r%:t=X!J]_/\8lX0,1FWKR;5tu#V9qB"^7\6U5s"4Z%+^3dGp:@J38df$b'HJ-nSh>TDCt<N*(?i1>J7Vkp2hIF*W6\;jR[O8!LE&o\r%1n*utJWXP9M@b^pEK9"U(NG\(*n,5%Lm-p-p1rTCrun!GK*mf*?N:!ah^+0cXLUM$<7p5HFk-enOn<O55r=ae*1s)7>:'/%'MO+u\r%+@&:ij_P6,4nEetW]qJH#2Oo8nZ5qsQpWf@Z8@_G\(\G*q7PHeQb.<dY(<V?#Ii^iLE87d4$n5r:M$BmG'e;4h\#(sKi^X/q9uIX\r%`m2GGdhW=A(8$<+pu^\[Oi!)1e*?&JaRT"D/AP%!2@D*r!D_t+2;\?Q-ELL_Mg52.V/bBaa3lodG((8oS;UX&7d5_%N:9Dmr%YVm\r%,L=^qL<);1O+e$k@u,Mb$rtU"[jM*5\YGKgc]r_:1oG8U&2J%`%onAF@L[$s!UNELcO]:O__;?`n!E6GfJm09=KA9C(e3OlJHttV\r%S#)0T]87A.Aqm4f'(9q^lNt3"rp4Mda$:>0!fBC>n%jKi`7Z/MDKektN):OplZRd-p>,QRg!Z,UHh?#kdW0UDn&ANQ*?(bA)VQ(A\r%/F\+FZsH;dq"X#L)KPJjNM%4,JK4Wf3j\5*#<=Eph,mTjq.f?E-M1ABlHcu&:OTkpDm@NC$[#&3qOc@)U.no0Ce?EoP`$R922)5G\r%^5Q\4p,/-Yi%&N6h`[>nL46D67!!3DKDiVD[9i]+k(%![Cj!ePN%qY1?>59X8J\)#oCCff&Fe54A2)B6$-8V.UJNO<@Q7)QD]_je\r%P`X)S)ap1X=knnKDAaJ'[$%MiWL+HN>c=@*=>-#B-.E)MT%M>^\('9$V`BNu5NZP'l0Z7]5r0US#./>R>NdW7T,L\+L(;K+R@gJ=\r%iES?(3-.GC?XaAfp84"AHmo!@%&Q3(O%qZJ#3eA_E#&a:ZVkI#]G,fB#6A%lXH"RY]83I5am)F68=[.8.8erLO!U)2G76;@*jm!`\r%A)_2J]d!hlZ,g+3XH"R3UDQ]ud_AoN+,Rtl]f_[9*e0*H1RaL!g%-f57)HM*\7o[4Ot8YTS"t&5mlElfNLR#8,4i=B@h))Q=em`F\r%KZdsc%)X1rSM</6lP.=R0`9=rF0,V`0FYf`Bcec4_]TA3F$p>Pn0nU&02`XALMD&Y7gd-f#X`5U=r<!t.HDsH$H)A($G-Xs?s*0W\r%OH(>&PGJLIZ^[e?IC0@geP,YVdb<ouN/Q^HP?#62K44aE*gDXkRQL7nAi!Z_\NH=rYIF!;(U;^NRj8-L0>&dV\pc_DKEEP'8QL/(\r%/"0NoD&;.;V3J'AkN<t?I>sKtF4"BYm$PHSHG4'nL]E>k<"W`b9OT.s-$[[XFPDlZCItfJg'W-o)V+s8^3mSeG%1E$mZXrOXW71;\r%jW;:I2_#UUk/(<cH&7+YF%q7JWY#7Dk/(:]<PuE1U51K>%0l-#"@SW8"p=PV1_J=<\Tp8Ro[dID=ICglh@"au:s9_\5HFtVjh9#b\r%&]/qko3T5H"^o&(UZ6Ia<D4*[j/K?g60q/c@6[P"Q-4FjJZjuZ\(18a+\gA7hF9Wl=np2S*^Og;(usbAT1]$^S5V)uTB!$3&\*c8\r%B$8]n9m#0\$T*tE(ZB@TY/eT4?&4K0F#g-D3KSG7c5.NfF@sF1k$6jW0Yp3i2ojt?#nn?\-Zu:*4_3?<DrS..\@KA<3:3.n]b751\r%`m)&+:r8%sO.13E8(a#b"ieft2LZs?X8"(c>@QT?[c4'4#nm+3-'HJ4$a/aM*5$Z#F%J$(A_URRK$"S67#+l)bTf3V2'-$NZM373\r%)/#kONTbuUW!LQ02;!I])bZdj-m!;+cTHDac'S=QEpITnIYF+L4H3.>ZGU"S#a''HS.LH>hG$LuQi$UCKXeXo1-TUdPadBG^.kr-\r%I;?mCi]2-D8S1.1203ZGgkO%`])EAFo88trmqf#KPII:7cc,1l\6e$G1R:RFb3eDsX5$GsE,P,SkT9(Sp8X1/)>#2HNQp.pT"+lV\r%/9;CUS,;Iq1<UQ!;B3I89]onW=Yf1LnGSePC4!>%X02chQLbppYt(S(oJTK'^m4'4I:M`Z12[U9-fBK:HUF;I?YDZso?u9@M1%_C\r%5os7>XPL&4fA)kARS(ug=k;<.I$Q&T1KjhS/2T&P`ffAI4c@VfDh9(+-&0aop\?ri/MVVgi(?4'9+7Ghmu;ZL>%77XXR5Od[/Ba$\r%lpL*7S=CTs!I++Y+sM#%/dSG4^Jm_i:9N,SM\p+^6rZ]5>,&n,b8Q-kQkA4"U<kbc&k`g6kSbY>*jgf\mS+g<QX#3G+YrdDrJHCt\r%Vc*_;V?BGfOCX(i,'Q)e@V'2A/"H`WHY+!)KheO2.mK(t.NkJ)PEI>.Pp[u5Hl0,*\27#qB]0"(L)fFlHCg:L&WojMKf(d;dj\$H\r%$3Db:RTg8-@q-I+E&r\_64^n6nt]3W3I,c[;<SoBf<2u(&&"^%!rC1=b6#-g!$uo2k/+&J*Uu-n1uD7Q1d6ta>3#-\0\&EF1S?Bl\r%hs7?JU9fodRTT@K&DugCHVdX&g;]Gd1Be7M4eT!FH!K+i6I+M'dPHA^p(;#Z_t\r>5m7)_X$sFEY-#O>llsNYh'\c*f<J']4WEPd\r%D5"I;:f=(+Rb#":&,s?<]lGEVq_)`XluFXnGZb\#%4K?t*CPp$^lMs"^]&N*c2ZS=Ous1AcsJ4c$ZO/A=<^=e=Jlj1(8-oq#[*_8\r%Z2gEua"c/hETtMOIXn'\CsBBfqY@EiLhUf,_Z*TH^YJXUXS0X_q!1qerpIYsa4YM!U%3Q.om?A39b]#<<\!sj0?<4S/>JQh_6,*K\r%S+?%MD:J]&oW;HB*\@q@CT%)5m56M3$\0%sf3am%O$>k0Q.pI6\W8*1V7X)#p$l*Q.k<jYQt<]KS4-"B1)QVO#m_Yq>AEr1"0I9r\r%^'Pa5n/2a?PK?nMBiFSt(leG%jrRhN]#gA56-IT)r37Au9J`bS0&m^$,N>e/]uuZR/O'?N/&`cI\/uGUIYK,+:=,Yn(j`Za^]Y*M\r%IYR+JJclO)>#V+.1nr4Xp(uXYZKME#)CS#*7<!h_m?E6P9Pf:bN@?,t?Y"`m/O'?r8tPU!HM)[<'MSfIJfd"nK[)',1D<%V->5O)\r%5?nL58P4Gdd4?^n6)3&s68Rn4caCt"c+;l/ZHTDqcj:UK.dLOMiIICYBEC%b$:*=ei_@IUT^d?"X<lpLXjK<]!&TUfY"sYMmjM#$\r%W_ZeNG;>5Y_'&X%>$5pQ7?.g,-WaglA.7kW-,^C&g)Ck,7.XPAH,mD#:6$L-Xi3LX[L$I*U>*+4^E8UrYdd]2kdHiFf1(4:p4S4:\r%DL@QFTh$c92CZ#)EeY7Re<g#M)!ToLE=)Vp'+?P2?N>I/VWcjYIGSeSS<#lc-(3@1fDtit5'num^ru,1gu:I42A^Prc-t8:F*f#&\r%b<J%e_D9LeG4(5:KQr7M#@jrq5TK78/9k5O#Q=1oD2suJ.;7'M=3Mb4=-B4@p$3d0FI/E6&s(@GZ%[@M%1HHZZ)-0t34AU%E!-.7\r%%fY4W+]Z/ONL$?#Gm5%7A?'&(Y\3i!:B3*qI]I&-6^h0Z+SfX;'3=Y['Ab%ehtn2M.QtH:-3QM:l9Vpp/nh+LY/46L%:sD$TecNs\r%PJ(u,hgXk*_&`,Y,_D1\E0q?VhYjp]U<ll=79(soFbJh7\M])8'nqs/2dCp9dQQj>Gq'.E#MuF/`1_n167S&kFm"JJb:R7<Q(=O$\r%GdUYG(K^OGqi1t/+bVp;B`*0c7UrRneSIrL>k.+n/p[nK7mk;"1OoKTI/LQ/]f!W(/cR*ca\DL.G."8+b"_Lh9$Cq4jE&#5`O@HL\r%>Y#(m/ORO]1E[S-lpm?FaQhk!<LG/KA]$cO_6-,GpiQdebA<JT,Idg'>Bk@VS_sj20efckLgPWKXfa@.0,O8t:M!r'KndC^RaSC;\r%#Q?bN.2q^;JmL`+M%9%*]20)3=D^Fa;Uuuqea6ONjbIfm;AN!QJ%jH$^Up?q<mJH'F@cSa<_QP4Da2T#:fe6lH-W+5I7&L&@3pj2\r%DfVEMWEJ[+cRb(QDa/H4RTH]h+!$$85#rj$@k7.Qh&F/=;RC&u@0"iX>ETD4XF,1Y3G`5]\!LsH/.JI$dZ0(tW`/mLKZZ3!auC4'\r%5r@RN6=j@gaQ+24?aWp7Y6N/p23D3N7IPqI":>qlI=d$`O;^m?p;(KQOIFR^k(V@(+>qSQl[-mEh-H>^=n1_9ZhB9NLcIkA0t*t8\r%hhduo`F$<dT:Mh?o(pr35CaQ&g!Lik.*5qeG5Yu[OPCJF]aB(/EttF*B[CE>&L>iGMYcrBq1'&!SS"<;R7JZYX=Q<&\i*5<*C=c(\r%R%g')BJBl76?0dJCe2GXLEOqYa?MJ6!_6)NDe,Ob'X,co'gdHd&&9Ft%&%WA&*QT8?N(aL+V\8-P%$d,E!1l[C2Sc&T[PAEKYij0\r%+'AjQ`]92%E<q9$;i3Pf,%=QM*B/;E3^na!@&oMH-V"q=JZl$u1L/Ha+Vao]cWhV-K,`,J$62>4$<=nc'Uon3lWU(461\\N'E:^b\r%ddSR1$568B`MSrH4?[C.WU*h)qNC%c'J9"S3*&s2^6:RI"dj]tI*)Y88YP=diL-tC#&^%I+`92qk6Q)CD_T_:5fHZ+CO@2acjI@h\r%M1EU="*1rBdQ<uK+9Q(WWuXKMXg_(UfF_gM.@`e'*hbT?e-$N&.Y<Q4"a)hKFoW-KCMJ4j'u?Wh`@];4+o)'u;VUm:3gWJH;?GKu\r%;TTJ&.Gu`0Hr=BX;WQN?Y'JCL5QB4tGkOSerqX1%E-fF/:C<em;Co@?2i+;cKemD+JkWVb&ShfJCG%Kp:r:q^BVm5"jVJj<kV>lc\r%;?F_R!)A5^S!#tdBfqo]&)ZPh`a"\@SRXKRn"j+c8R.FM:8-3^Q^5L.8Z_.jY5E4]3>F*KcWS(7;V1+.TWBgUK.s$O('VT:Z)s/s\r%L1(X*j,l^GYc/gV>=8Wh%AehZ#`P^$mZ"P.*kW("f_K37<2<-m`hbp4'iIle)&HFcHg_>d,?`JDhWs3h7tX60E9<,bN2SGfQ.$lk\r%![B0?muRmr.:jIZ0t[G:<0Cm"<BKPOJYt*aR,=;U.Z?6Q&lQO_;/lk#:"A,bL"<N5"tHO!C0ta-(UgUg9<W+HT#]G/+JNMqZp&pX\r%D=Zhk'\WP"h(K%I>\pD,6*-!\\g1K3B/UQ+ogb:@flmmrU8igL=EP4-f^fB;aX(3aX'R/KQpUrRgTkYcgb`\fWPt2?cl0.X1meJF\r%#6:Rb'u6(A\-8F"aoe(e+-?cP@-2Z%=N%WJR[l:"n_&30"jOFLkJ=#2f/a!dB]a91nO-Ju5r3m9#Do\CJnBc"b,`sYh-T3pBhk&i\r%1NR86&T+_gjsla+=mT.@FT(/P<^G4)gNgDs]KL+<Dp<2X'9A,C#$/k"[<Bf$!a-iB#<3+/D\\ht8p:VP^Qh'n's7Fi?8jF>C`'im\r%]]t6LbD'ZK>'Pd*^ca"qf"r2;iN+CRdl:u+Yue$G[.I/7!P6$$A8/<L*,UQV,=jpnAB#<knWs/_Kdp#M?m+]@.VC*nYiQ+19E/g@\r%dI^QIbI.]7)$uCA6(=8R7eRMqr<B=X(0@pJ/_L2sIBhH@2!LXsjq*hq_4B-o.,0>#rU\WFM@)J1AC9'G2!LXNO_s&9V-#O2P+#?*\r%Y%qe7Ns-HhM=f+kZU@g'iSPh9gB(^$97OXcG^Q)OpQu_WX`+3B1`+b9]psCSDYDW"b'hj9\Ti.cX=\jM!Bs_CP`#SIA6SorX.hLJ\r%^=UaFQC@DUbm^3J>IpJE9W'4EGh#Y_3-Cr(aJu>;ML2>eLie^=$f?OdfC=A_ZlP9pI,Wttors;Pf\NFuH'ubjOtHPT]&X7@Q@0?N\r%nccW$B(gpknc_/$8,@hTCrip6[6qs)B43l*RTu/[J;,U3-hCHG$q&Ti.@/71DT1'$eSPN6Q+,(+OQ?hPEs;:5*N#l./6A^[__>AQ\r%Z<TCFm/A_AlsboLbWi9_X3B1]Pq_5ONrEn=MRG+;ZWp`3[k16t>8Ea[J(q:.D9MckD->_eK5&AWJ@7#PNIDCP95D^sOtr%kptor3\r%g3cGoj32SNK0.Rg`'fWZHORZ)`0"PqGn.96TG^AL@+T_YGm-\XU'^QN8!5ObT?F']79TDV$Me0_79TW[IJ1T%GC1JLWGm09b=WNE\r%Lt#=381Tp8cb)S=*ksV[^ReH&o+0N4ZAcH1BT'1c&?'Xcd1p6O.rIL'!j#@m7OgO:7Tkt0NDqs.i3H6<4'I$@d9eQ^nGB1u]GGOj\r%@f97_2\g;8hL;L&0u'?<k,&3=/CmTcF&PeEWJ1%E,q3^]h3/\m:Nbah;pdi;>Se`SEl7rV4@'>48hZQ0;`<&)KmYM7!q6(aI]?S3\r%-KK6!'L.SO5>6'H;o;DmjfB9aVkS_V[q?u!T5*(S<Qi4&&aQ>-SC,TTMXtT+&uCI1+9gq6#k_+ba!AqSj"QZFe5&L8.AlE6R%K7Z\r%9rHG&6Mm`q+@Xm1Ekmq,Z+log##aq03=JSa>#Y8Jb6-j<DOBouB%WZ8XF;XfRk!o+l*u3>=YpF+p9GW0Eg>da,.lF'T1U^_C[0W*\r%HM'&9Tk1*sU6E=^/g@J0]dQ@Vo(qL,/Plu?.'BBR_Hf)>e'b`DH$qu=kaC%h<tfcs,<`6VT`s3TO`nF7oP8fm.;e&Df=X<=MK@nP\r%g$'Y4Ep0^iotA>1([#+7M<0K9T?-1k%cPqn#X-*p%S;6bq>A>X_XIc&LUbDK9/k-f%rhpKYd6NL<0'\N-clCcH<`d"X'pl_WY_U`\r%at$'0ENmgg;a.<W\:I7GrtK0#okpFCp.mhd$cU[$J,bb9kk8hc'%9&KkV[sB5),$.:]Z!*@&MiPn$6A"l1)Xm8WG'hca=Q`jtYfq\r%IBL+#?2Z/QqHO[ils3!jd-&j@_-8IBJ3K;hcg@uH;<dU,$rR(j*kt/TdMr*`H=H`K*3"HE%9*Sr'fA6I]"XhX/Mi\^0sH4dJK\KM\r%.NL!323GUhX6nM*ha$?=qp[U1TI.tXf%#\^56^E3SlJ,m\qCE'6l^-DSQLAlT!hA<.@nBE;]LXlYtOVaNsC+gQ6T;(GX\uKCI8iM\r%0/HO)]NDqP29OT1JCV:XH]%=r9(DE#2lhZ_ZkO%Rrlc:\cm;YSbca:oG=bM;0i+DURnIKL>L.[U8+k*Hp"7O["JCO[a<>fCGSm1Y\r%g7mLHRor)ng(l!V$oM"X9;j,(27"K#@YMaj=V3!c!^2g-R2'-C.no[NrShY20$PF.II;5+JmUR@a/AS=69<.OjA!#Wq>D#Ai6$.0\r%g%e7C3-6cC'UgZ@SuBj_CE,C%,7;-mrO^eC.RJnjE4\+3KiNApSCupP*+9TGUiM5jJC8mY>Xdk\$7gfW,3TY-4W#lSi]j@_A?#Fb\r%$ELr[&[UIHP$u6XcicElXs.si"`<^[V.kl=XF`:6P&^Lk?[U4!>D[8MV*R3Y[g?c-M<!"Cap;^#R^h*1J*@"$p2Qt#bh(hc**r[C\r%7cLVZ!0Al0a1Ur/_`j@Z.gVefWCRF^%`h=W.l&;UNOru[6;a`AfF%Yg5iUg60L#/A`!,!^(X!*+9PEC66Wbpa#$&&ohTdoh;Tq*E\r%m<F_`mL^9AJnlq%X(OAWjJfZ)j]GpobBfKuP6,nA4TY]hAl=/sc6G#>?m^Ta?o\%PLPcHB^="5[:gdNN..'/!"0$9kWN3X>/:G8f\r%k/mqIq3FbVS"P-o=EBIL5WnZ($%^Lc"!Uua-3O[t#B]FaK6lt5p:STRY2j5e4>Eo(f;$s9+*?pG<e6Vt,'qGHq:sNYTDfsD<F*d3\r%Zqecc&GZtTWC8Ru7-.4_?`G=hW<M+01g19rrQ_h"61QD#8Z`OA&KIS^ZiC7%;mDNikY@^DC[mKi^WiQI)l_q8!LRT[$V5#0PJP++\r%:UkS;"/\"rP$6f)E^W^]hPnlL'<[BK#u\D2P?Pp%-9QUk2/f5H&k2GG5EdKFHGW*cH$'RPD4MkQb_+IZeiMo+A=IG+$.q:-cV`b\\r%SmW\KKVnn>Ts'q:.4O@Rql``uZl>X=%cc_l&g7Xh\_0GfiS;2KQVdc8CV<td;G1q9pSYFKX0]!eda'd@:stSL3K"lh<%_gG]k>8L\r%CBZmGNRZ+PU7]Lai/De>\S3QoVh\%:q#KC&Q%Ib\`D()=EgVLd<`2S"Ts[4N>"/`UF8-itg1HINGdS5#roZjf@Fr:G=t;G/AZh>h\r%SgRW_B6g("b7V9;]=s4h:sY>Z(+#C'o5p4eniY/@LPUg1<&q+m<&e1Q-\lfG25Z-?b5\"=(hi>5%Ui^B&:0.j*+J-jV:.e:j:EU%\r%KFc:"bTM[Co(d\9o9dTBMmEteAT#2bSOqaKZck"A#]"`"!U([ZEl^1f/nC:DhbTl&0$Bck0.C:p3BcItFI'K1dO'qXN\/c[UoD>`\r%_^s=><EjcNPdHsPOWWQarR>O$B<>1a`+s4\!1'\b=%d<Kh-C8UbDBSbNu?s?L!XbsAqh;<:a^f`ULYf8r;'.p=^bEO3h7'RpK/8E\r%n+Z]o$_d"^MYVr_1i9]_G1,QQPQrJjHTK&l&EMi9dJ,j`(Y\9[4+RLWm"F6:DS&h`GD&.UV5\Qc*N`q/Vn'H\HT>e=OMr@6G^A"p\r%mb/<r!FE=oL0OmBf#+;FP'emJZPuQ(fdS$.iDX$?C]0rU->8X*hhM;fC4FZ/YE*&UdiXW,Uqm]t892X(3+iK*q68=^kKsMK#/dla\r%ONq"N>)E'L&tD5orVFE?B@&f?(!jIF\JiPP<e'2\XnFC6rU6InIpMKfnVDIjp]np%D8l5[4WH9,Cr-I`9.Gq1gRDt/2hPX`2U\_>\r%`m2GGdhY6)?5X-An]f7@K9"&+1fc9U7ZP6=4[qYIo'A"hM47c1rQeohphpu=qS>ea^6=SRDiAOXG3ECVF-nagksR@M_8$4[I1^H.\r%/[T!U!df7%gj5psh>p8WRokL*N=1#(;sqB*ke^Ts]]]q<?Q#uII,6/:($=L]2Yl:(248j2#^]0#MUT)`H#Z/>K^4CK'R-n\Rok6+\r%<]_:\CjO7tMqS=D]M0J.s3khg/fZgB?5AkNCjN_*1mhO`HQV58Chuk-N#fX'ip[cMS/AkEWS`G/%AF1&`ajrP]a7?f`3.gms/D"D\r%C?"?\BuJ+1.Y?4;e'Q`&R!h'6?M&EAH&<P@VR3,dmu$#Y2Tj*\US27rJ#89Chl@R\LQAu-CJ]![,s&2f,)0L[)JDFgkFm)DS;_;(\r%*hV`bha9B&RP-M`]+U7Q)1/l@C1tl9ci2gi`l2I:cjUb/#DA2Pl7#a?WsGF.1tNBNK0r8$KlSt(:9V3<qXg[QU7c\jP855+N=8g`\r%EKG9GNJakQLbMS;R)`OV3J$GCq?,obXO)#ZQk8XXpHoJV7ak9`Fg73GV@2K&^1g98p)HF>=HeY)hl_@rUu6@aaOIY7S\h+3E97YC\r%>m@d8oTVX7?&nUL4u0XI3:K%6c]drmW[2:k.<S_rc'2.>A<qX[pnlP$+cc!Z6$G(DI'e,lCM&>`gNDlPEVk)6-gg7FdZ-9J(o$0B\r%3S/8+5tXQ_9'J7ApssG!g<QJr+=#R,#m(9*WRIb/L7Gh/.<V:]A'(^VXuUPqSLr@r]*1?=D2u(-JhIr4!ln+[nC:('iNc[T^D^7:\r%b7ehdZ9ZK"#@-Im--633QRC^sH?]TY0$d75P!16!Ed7^=E'4S]>b6HRPUaNmQQ:%EnVIFZoJp%_jRTrC@To0>oEYV>E@<"/\17Wk\r%4967%q8GWP2rJH>[OQP#EV-o!Kj:5,'^fL?ONS;V8Ko=E-f>'.Jf!K7Vfd\$Ed7^=>sfe?Ed7^=K#@gYY"1\Dm-,4WL5J7;k5nlm\r%Z4I)J49:co$\VcVJ.)7m76rP%^nj-'`'CJ9of<%<"'h!/@3JQaWKL2`mM6_(R%9cc)&T%0O0jut=hPh'@(/WdWIo1;j\a)EJ8$32\r%"`LPX3`s_ShigT<,&DA4h/`=<gtdS"cpsl8lXBL(L7r;l_5jIt#j\jJ_0Y=uG=Lme'!-k4HL9++OTb!DBA[jVUBoG')+I$_P(0^-\r%,^]2:V..R&\I,i5cG>K^)G@'cX]Y.l;!60XZgu.)eM)QA]B[Pl,>=j$)CAP2T$bUp^4p@%bgZj1N#$$Ai6);;a;GX$^0K%.^,IYU\r%I(>mdGuok*?`k/K4ldURa+ACfD4?h3(53j!`ral[rWdjCO)"8c)7[*\7J`0PB@01odCfiq&=?6cZTnY*i@gs+ej<crV)plhMh1G^\r%,",fSrc5[GUBifsp^=[\UI&@<J[9;l?Cm[@!!Hom0>0.f&d2fP;b;uZJ^&@YE?R%.1A4L)LL"]CKhUrfRMLB8!4Vc.>"%fuA(!AJ\r%%o-c.Mb#o/<R*_pS@:cG[Ka8LdokjY\H7E.3psrj.;8hR+OGI;/]D.t.mq.R`bJU2Y!,39.M\Dk[RTI*T/;f&fm1[CUpTpf67[E_\r%4fXUVEUVCurZfja)9cShWTTW;1[%9:n2-MeAd=+T=5@sA<F_R7RK<$JQ[17gRcuC[SuLm^TGcE'SX+`!a#OP?k+]]9%LB=-R#;/9\r%F#"sPf")]17\.lKi["[=k*'U4M?nk#m#8cuNB+=sn3Y1Rfl3d3&7493]\YW%s"_kB&uso3./88Z0rC(D2@Ub-Q<dI-()He],u+7\\r%nI&!VXECXQ*fI$kegbAXh?77mZE\P3<mkNja+SZY=sZlgff5EQfl1*@r$>(5p!;ib7Ai#+Os[&\WR)qck_qrr#%q?rBE3mh9/\1S\r%&i@%KRLg[UUe-HJ9@g\OZ^?k/?*Y7!7eHW+FNI]49nnNj&9KqRQ.<gE[\;4]k>nZq7Zo!N/f;+V4';u6Z**!QI-.[pC8mcPCC-KZ\r%-(.XZ4$[.4LPC"1Nu=`[QpOq,G/4%!N'c2T-2F(36F_5j^JNM6KbJJpHD0]]@P,3c?l^dEUd8jqc^VqX$<JV`j#hY&Le]n%H'QaF\r%/3)I9Q>N9ZPlfDDm+DU9=LiM.4@Lbop\j<&4t/,?J<k$P=u_giK5ct/HD6E7g)Waq2ceZ?`@<^?K)<MT@[/F&Z-i=B\2YFVF9?gK\r%IeY6D\oBD^=E?>m0GdnFLQKJk_47/Dn/6hgcuM.:4R"#VlQg?N3Ksf53(#A9=tU&,YYi['(0P,r]9qe#2d(c..LTA]8p_&Z-6QIO\r%OkD&5TbML8Q;6"%Ekj^`0![t+UMBpo2:.W.6.bmo2:_nW]Ak)NoXC2&od2qAAW8nKJTKq67H[L!I@-FS\^5@WDnRHm5)tLml;1Ui\r%:&,ZRj2"V2=LWZ+=Nh89f<Y-48cc%YkVtKEC/`9g?C3m_`104ob/)4B4I(Iq6/..HK=\c5e2je3M=]">7M]o2BDeX(gl;lVb3``&\r%oi'#\O%;>R6@=e<HBceMP!t1Lk[6FU4^9od/RIl.@3]PLoD9[;Uu"F<koJV\Q19-@J>X9CNe&(&UP(NJ*<WpK*$qrmknpr,ZV+ta\r%.-9g=)Q[E_(>?3uM,;?gpBsb'Xf7Q.TN19&K`63G1.^GAr'!a[D*VeT>^_VFg47U2KAU;mTab*iC\[ZA95"E.d";:OUP(O5>.:'a\r%&Xh5;XIpk$MTdBR!RnW&XTE8ED8<Mr0oXX6<?.T<fh6"h<,i2\IJ40+3)9it^pJ!-GEfLg2IK^t'UCae9'aL-E:acH5fR#;d^o6q\r%'nW6(s(?Bf`27[48-\*Fl^mLL&WtWRdfi5JXk005N!``bF`O9@#HXT;=p=U4g43nnYReWK6HbSD]aJ2VS@sDi/PAD98u>QQp(CR.\r%l_iNEDAN=VHq`h^-+((ugpc!7-Pc=6H`e>BXW+1`ZBrpiql>Ui:qEXT2YIL3!h'g,'d\"ujXuMBPE)RZGeoE-Uni.nFOLYKe4Kg/\r%Y#]kKKN:/OU/Q?NJR/I\CB5r!mC`hRV01g@N4jm&+J1NVd*A66bu$bWa]p.!!Vn;9mo)km5DkI"qWC.'s)T+ec"E1,>36IOJ:*Zc\r%JS-R.%EN1UX3X^2)j&AiaF^sU2B\Uqcb:Kr-&0`tWukTMa3&%G$JLQg'#SAP-@lE^Zd9Qt)Z[^iB=U#dp&KnDl*\dYB:6t7n,N^u\r%50HXL&RdopUkC"Up7j'#X7Wt]@rFJ[rQ(2KP%9.;,>UL]XCHkK8"T=L,R^t$H-W([Z7CNe?]35S:#CQh8"P*o,l9B$@e_JnhPW,4\r%@e_LLo.`W5"9Y8"g<j:/&@N@JRELQ-^cf"p=8h/$!^)a.lZ[Z[UngI=FffhcBO7Lc3VN$b5?ah1;F(!/>>0.g3$u'"?;Vi=3gn%<\r%@$#eMXfV>^:lM1c3?I6eE$!DZeCmb,>5[u$Rmq.DJnQL5'q3Xh;d[$7#R4074YL4G+;dX$B9F;T>L-)[RFtEQ"!G6IXW6Cbm)RN`\r%F]4J!'-I!@/QXR['WhO?YS=\Je_7F^$Xb3YJ&OJpDVLCorTdFN.g%ebOEfD5=,&2+8Tl#2r`.a-:u%b`F/er<i_HT7%Sgd0?cCj9\r%MS"?QGQ1m)4*X<D=WD,0TpHXa`^M#7?p.QA($rVE%,7!o6@$.21Ut#h`K+=U1jjo#Qk4r1N0ES$&V%3f[XZS\(em8Z;(.)QF[XsR\r%oNVP8KQ@)uc`>[Zh&QhhfsLdZBm]t<58QY#?JRR6hCIX[0QFDUPC#[0F^8ZFTE@+G?XfY3Z(K&Uf%,lo4cK@Un#[Y%Tf;OQ"g1ME\r%]QFI`!1p[3\Pe1k&Iu[sf!At(CNfCp_=L"m;YNo#J`<YP]p(Z"1ga!.S*Vj4L?bYGV6h?1+(%VT@ArQRr-Y7)@OHB72UMcsVpW/_\r%7gB!6o!%bCkKRO?C!K"2gb;k`G+Z=<!p2#.;8AGKW.8Is?EeD,P120N"gl,L!t22,!<P>53&t>;UD<M#^sR5g1eJs6J?KO\/W5Bl\r%,$eCLhS-X@:XJ`iT7["7pA#!Q]WW9aF9h#jnQ@EW3`q6X^V20#nYnDV7>n8`5i];0QB0F;pF:;be-#9FT\WOB>!&s`"A37*&J%>\\r%;dnk3;4>WdeN49'*N4]m2dAr-l61Xg.`kJpQ)4nf9J*b(;aK*u-qt.RRHjdKUb^IVJP'Te.d3)uDHLsZVA^?.An`_TXb&'%H.j*f\r%=/H$H5-;a9Xi!J$AUn3P[k]hXL++&ao4aR)=IEp31XKLj2CTHUg2QNk;8q:?-[%YV.JAV)okk[&7bFZ&FG+T:B<8Uh;pUW@]r@$f\r%,I9BfA8c4")2>r<jj4=WMm59a83=8Q.O"!J;`/judF@0FPG38e>"cOmNn'dp8B%r*p>PKiCN!>R]fg1GQ%LQXl\q7RDQgOH<cn!T\r%F/u^4FOkiMmjts9[c1B.WC/!,L2tpC'6ib*8nR]rk&G$arpTWXkR&YXZnlCQg2Z=$dMc'sId&DM2^$SC$dGWM4!_Fdp=2NTU:)eI\r%`-*4ipL<m%=+*3TTI9SPCsFGPfc>n"d%+u(a(9=*)o44VCY$_MNQi;b)jZ^7rA.m`Zmf,5*j+nr.g*VeQE]`<*42L.^:s$n?.T#'\r%gH:nEJmfB4;BbN-5!N(V>i6aen9G,:DM2I6)H).P16#;LW)J:QlTm'b/=a]-%1Pea]2<CIeX468V0_[tn2E6H0\?lZ]ft0]B!8nb\r%R+GTcVu0%WrB_<Dn[EL.J>sU0ZRdCDd=lKZj5qK=q^#T&Vu%9*kuaoJ(fu_;*CHVa.$#Lto7AEFeg4pLVlQ9u=uX8B7(q6p*4I#Y\r%[l*_G`fk@+"O/\BdHcmXOlUoPJ:rGn1,rdHJ:sKR7CBgq?Hjsdo.n0](\qsLnT.'h<$Kn64E@k8%UG6af%k?2fHa863rlCKqHG's\r%bjQ><]l%>hFcP@@+>PIULL8Y%@RSq<0<F0o^9s<^]6O4SH[:c)X<p/spfBJReT[@G*+83/C1ouT9AgZ`.P'Xr1/E9Z!4g/Q@\ijn\r%chP%/C8OY#U((s!5neo[k,bK&ZL6B;@iXVOB7fqq`Wk3<D!91;63!.ZE6HN!BQN.0Eo764o?;q%$H)@TKN6Ar_D"(miC"[oL1Sq)\r%__<I-&/>Vk+O'Q9Ns:>I&;G6rUP*(PRN+$joARXk_D!dN/Q*GJ`;<EJ0^g8M/f8a;2bfS"i3E2AYb*Jr_6^=&Q4$pMNMY77^W'@?\r%rZ1>>(@U0I5iZ<HD%C)]m,*q9We1OKKqR">%@s5nP,tY574k+`c9pW+$+IRIf85\Kf"a7d*i&FVSfIMl1]P\_9a$@='d],n;]t,G\r%Po<APB$<c@5r7=MAq@9k+k`ImRp'(_%(MsuSnr4oZUg`,^6:],7<-\uk^RTfnJ:6o"^68/L;[]lM8\*M'.cXU?,3C"_jeFY<Ys-:\r%K+m"l_s.;,Hh;M.CKOk-CX7J=Ma_%@dG*d$6udQWH[rB\#ce>HmGV]ZJdCP@edPF3Xu,+-,`Cr24W@?`Kl`2i=Wsn1p)Ya3bsL!?\r%4k7^hM7!RFMR_F6Cd<-DMm<!"n0JCHp;$84<O7cEL]T@F<O7d0b2#W',+F9;PRFR+<6[aqE6dY`$S$W:RmSCJg4Pf;U"uk.iLJ:B\r%+1g4W2lb0F,RPd5>Vm9mD@&abYsd,.P7^;e>sQXS>%)Zml2k__#\+V=Ls/_=#efe^eHL'fTUB.lXfJA##@/-c[B?+(*],89K[g6J\r%oup#0(Z=R]:&L18=Rp$G"SC:l^Kut$X[f7HTR&b%c3Y3@3pUn/YLd8alUc+6]cO4X:QiWZoiTajY]%XYf=Uf1%P>@8X'3go-,=N)\r%)$QrIfEWqo1&>$7in*M$WqA'O@+OYG]C^ENC-<N&jK$mRIo@:``'>!0G@amNLg^LAPs6NkjAbGBBd+p;&VqiEbioR.'J[s&N68;b\r%4Y"_`2@ra(!+GO/U+etI"&1&_TnsrtR`O#6'SIlDTS\K1.hkk!5SN*5?uMe'gg@8*Wn)e[R7FITfGesa1g'`m$&@l(g&^i33+0%i\r%[dUS'B3l[2+lpaifNc_&=$M$8OR*]il9hKrN+gPZ&I`?cON$[@`,9;$XYl-.6]/g")m,Tp/fI^TdqthNP!.iM`66&I7#GXg!729t\r%iJ'h'JQ&ju[fEO(\!MlX0VU]7?:^5HMtS!4+`q#,MY<RlS1<3E2f_I:*eS"L)o"(bp8F.feE0=aQHlB]Yso8TA6tNB^IAajQ/3uR\r%=FWbm>O2+,&VjRh>+)>Jee_g_?j1TeTf[NH<lr8qQPR_+cD#t`Z5i-+0]#pNZ%()Y<G4olP+;gcO&]jU%A#2*@MKeZdH<4k<[e3j\r%.Q!rQP?V9o`CY%=@MKeZnTG6IgFpUn9*hUs@[4;dDN@o$6:34ZojBb\_UpXgY4L%/.[H8k'NU'HZ!rg%!F%,WX*C(dnR'+9"e/).\r%6emF/$I@G3X!L[Y<hUZOoL:aCb,H5Z6:35a'&\UH:7ntZEOq>/he<$m<Gk;c6S70ZkH)pB(KLQL;+4\;.aWBCMUV'OSoMf':jTju\r%22ioO#V(4EWLS[;.GDaDp`L:F&S];'=uaP7]b/E4?3BcYnns<hX^G-bUqfRLkkIQ/Gn<Rs+LaY"_1WWpbYC53;8hMS2F'FHPZ_%C\r%--%M@34"R9f!+PX$Ap!W27MSFi?=(?iC,l3)BP:B+t2Gj+Vbc`;Lfr4(K/(f0fi@Wk9%19qUN2b/Mn;/K;NqSRfp0(&0:`3UW33.\r%b/b[\!<3Za3Iq@i5Xr4)^+n&Wc4=qc0;G,^ZJsL4Jg9Bth\ZeYWM05"2ZJJKWXT+`HAc"'(P/L)b,=-PbJo0/4H_8>`m`&WCcqJk\r%>H-a.Ccq,U"m3Qa]32<Xpt\?>\J63X_U,a?)6YFSqm'jYo=9D#RPZmNqp43)m51kf*@p`):EBpuOG4M+kTRsDeR,:3p!Onp2O1XS\r%hS\B,5Lgq%q!bd=-F>-)5;/`2KRa3*0NiD,IpZ<H28/1/paiKQIK?o_R!ADVe8uu.(K9VF(sal?SB7;2"CpbI>-EiB!!I6FoTfX,\r%4C+[s^,+rB?krROdYK"2J&To^0j[f#ql2]3T6np9Y:\N%7iWe-96#0ABWc2eYR@q;ek7+-*&JAgfqW%c'uR?+]f(W5_dg"ETP&GS\r%e??&"N0pUD=OWBXli,k^nWg(@]>:ejr.-sY)o"4Rmf1LC2BS79N$RMq("Y3nY"L$:T7"c$ljLPp"[&'1lh@8e*p7U0m)*C_*<T@O\r%>OcX:V'ui##Al!5=t(-6i`BIj<k"*]=6H`!Bb\U$86"Hpp(d$DZ\jL'*5WA[:(BI)2tL/-mNX,W?[%?Fd3UfSBoVFB;)$_Hj;cbt\r%p^tm\F)_[DH9u^UUsnMnX.o6-bn9C9JK9pB5u$`[)d@PO99[E"%J6i:'km:)AKKIs]%I="%WM8IWa7e:c''=?@!#mrf@tj#Jm%Z&\r%Z&tg#@IQE,5/'HJdcof?FWsR'27s2LnBnXQ+>5E-=k:>Pc?IC)5^"53-:)Hr7T5p.nB[BF7bpQ%T_6`4IU:;=qq&_$Fp#*-2s!"g\r%\b1">p^/FEM4s"\+V*n.)co/6!7sZ=S?F$4j:,?;kh)sC\@2(ERkO)m?#]A,Ep1Q&7qKH!:-C/%Z$EJ'I,9OC&OIVKXV:8/>-IsW\r%o71+.7prA_.mLJI(ZTH0pHg6OI4)49[<FnV[G+rQ]5p)]j&OipD8l5[/V'Ki(C!9HbH48'(fhPn[l;p)>`^@H)sPpZ@qT5_BnKCK\r%mCLX^hn2'31(s)!=hQp:3W:?0<Bk%3]<&\)S>MB`]`0uc)#rtI?9_P+giq2OoSkTsVV]],SG[IJ5NaDi1pVV(^&YoT\]r#`5<s#T\r%`tr'3B,O$B^<<Y9l_Af-HAf!6n2&gs?JJT+qXr>$<IaH/Ii:L5pFF"cI<8Y5'rZ\!@BU0b0G,#h\@akcbiI>Pj-(a8&J#Jdai\Yq\r%WJaP9aat:7`8eGTD5eEtMg/L6PpAjt`8gFRT[f4UX`N<IC'BR,2LXRoMg/K5*H];q.,pZBAJ;5&#G'Ap)9n<gMg/LN#?+*9ka6-u\r%cU_$SO77UTTSOtscQZ3026`ee'_.jL=XgAAnou8"@lt[^M9>(j4C\nP.HYquf`GeL[OU<-c;BiU0]j8l59hT9EHu]Np7Iaj*Artn\r%CocsT6D&aqd2R*p(\%WQ.d-/!oB-oHW.&&kTmLF%7@+UO2F`^ol^Oqcod)d,j6esg\X);IMKnKBS_1qGels3hZGVm\X@loT%5qs1\r%@FCcKQ[-PTUEe3ILRfkMN_$MC>cQDr)]S"Fl^_`E?"YPVG^EOkqWVl=Ms9a&@LDa\(%JdB42=ue:rMB<[BQZ0HkDETD:9@QfBVM)\r%[[h4"r1oV\MhN_AaZsOq#lX9mFHKbF^G!6Ua$jb%[!B,bVs:"a6BbTm$KFcpKdO2mD`O$4$;G9o8SJsB2,.gk?_W6bcpU*&=@,[L\r%@i:lL7D4TRpu:*)kd`d/K+nSGe-AQ#.1fZV%(FjsKJ:c)PWJA;OOK7TiSH;8qckK;2Me3kP@RH5`JUT%&l@aNPU*HY(Jj`dj&A%p\r%fUhG9EX>;8#d^jbqr'4TA,DXE?a=%Vn)gF\40"XTSK[i&f7h6<ji%F,M["gf2La&9N<6JIQ0m`;Zk:W\%98J:!(:3^2rb+L0g9t1\r%'Qditr&0bcm2LX8iTn_B)*c0]DKG?7ohEi?:\h/<p9_pK*E3"EV6^tK6*26[+1p-YM[OUKb1#J]i5LB$E.Ui3At%<2(KTs,@P)W#\r%a[nWUh=78u-<Er,/f+Ht5cO=!;2g0NEHTi&$!k&>bus[4s/8n<-L)/N+DaU(ge'IK<L[Zn:0n$He'gC5Er#D!NC17Cg2hkL6'qk"\r%,rMYEr$!iL$pSN&[gIQPJr.%F@cGbYo\N/gBlX*:QYg(H-u%cKZWOH6Lt6,:F?2/0FQe!)dckr6$^\3oc`Q<Df(Q/Bdtu2D_]E.]\r%'i]'(\"Uib;KkE=>;fb=1&%ene4E*Bpmru`X/G3R.58DLjO\H'h=g)!WnYYahG7d`R6kocVL?"kY?$7((2MTS&`[s)>qZZY)s1;i\r%X&jKQ<AecfDIVH.)Fd@"=*@tJ/"fJ-L"f9R^GOl.qV_5'b\je.(Cl-gWlK6Mg@=ZS;-rP0o@cMU=4fkr9_t(a56JG/Pt#rLCScS/\r%CM"Wg-O?@;/$%sCFtc=^np3[6RCcX$;MXEU"N,D*e9QO_Yh>VDdW0hd-,*tecujlgieFiR><V`W89_)Z&[;uH!N5Z*]`sh`h,^kd\r%ChskjI\P@eZnU=S8[^5-q']@OTOSVQ;P5Dj8.a(lf8g]6I_gaM>"sI</.f\bCjkj^/Mm>9Qnm.(n&4<4RG)dP`9_7\3e@jiZlH,N\r%,S>-k+6t@K9G)BSO(+m!rcul8s4kVW4:u\<p7I-bkcg,o*\A1""<C0a0<&^)&Tk+2e);M7TU3]Dm\5W4ZR:Ao(I<i5qbskfp]rpE\r%Iu-"6N]d\2%&nsV9$[-2T*W#p_`Ee,ZB?T1N1_C(040(l?h*Ri+LSFKae6&gBiQ@6TO[5f%j+(bao(P.r:;8H0&5irr5d7),XrV:\r%7rtM`O.[07^cq@Y8i'$N&J9+Q%E6rUb"ld:IUl:fFKI0gP.R<$R=R4U#Q`1?C;HIbgYP!WqOLqD)4F+0]+nEhGC/ZA3NcclG>NkA\r%hTAW/_:>1*hHK>X*`I]B&Xj7VLX(?S66+AtLMfU2B^sE,D*9,\l+n"(6YCX5Htf_0U_`3uS3^qE-FG+%N*"3[W?hlACAF&skZqoL\r%>,>=^Za^`CmoQte8'p5F;LhilT@B#,H+!QA/P-`<eRDCTL%f?X41->:N*#>;P=-#>X2Ulg$glL8kK:G>;-pGl^JbMQW3U`W2@?$^\r%/_1\fE*b,GV\Wf2M"#0L2R*JXC)KdKNP[7?/W<cShu=kA@_>nDYZ?q)W&7`@:&Ag(BYgJ,%-gRh&'l0BS6E/C0>adOmq-NJZ/Aq?\r%J#A>QMt(QX41/J(']IU5GA7.g`U),IY%R4<%l=.\$c"(lDd-]4ZQshI?Gb6jCdjbZiT6M>dn2Yq>"[u0Bo^!1pucZ(Y<#/%6jT:5\r%%$T7]D7,2fZ1b`:(<3653[3s9peKt\Bml5r`55$"Cm*%$BgDr#8=NY#[RgkZKTJ)D#*TgK.`9uI(ee+r*87:/!3U-ue=\]OCso>#\r%<>W6<PtL8OYifL$k-OR-G;39CT+mbf8j/u\Uk!`'N<'IUP/=_lh"XC].A)i#;(PdCXR<<6'ZI5&ANQ/GK\d*7$_BelY*rI0U$t/(\r%=VD/M,/9jS;c=G]:=&DU3=[Ag:/AVBN1TcWj7I;_Km31`R[?&tZ3s0Zrc[2oU#P^].Yu_uY/3VWYK[sod@1TY`M/1fFqGP![$(dU\r%o^lFCLu\+=HAs-F4!OCC5>Fue)u\Tb1psi>R!$*oE=X^KZe(N"'nh@kCI7A_<Aj;M>:0KbX8WpFT,L4Df*k8-5tQB8ahOIDf2#s!\r%;lq*7SuMbP,X(eYhcF%)EhfP"?V!NtI&gb<aWm%sj>'k:1NQ`IF&IV>mikJV#Et<<K#](NCRu8qh?(@8o"d#l;4MaU0AY-`_p_j3\r%Ve8fZe!16n+S0i(Lq^mgT+c,D*p&3bj'hlF3[.:KQRW%hkod2hJ^9EIPKUR9KMjj]<6]=SiFmL,Wu^=6*k]-OJ+$17@gVX4Vq3*.\r%@hR^nAXuJEBDO+f$!nkY4@s]fn//;gNrY6B24fd3UCT5Eb74UU()L3VGASJ<P0;.cSe^:h]B?T(o'K\r?TS'iqO-E2EuR"(VGta9\r%`bR4d\Xe-5kN>L$94o3#leFu&kr=h;$G:4JVK'$U$?TqNLJZn7$Jgs_>mLT<=![=O(LG)L65M(BZ=fG#^`oWA6gLP<FP<Hs8(#3k\r%-.!D2an[!t-pb9i8#j,oKj^g;."otX3hO`(gTH,f"?(D;^jFsX6:L'iZ8@Gu\D`&Y57j,NS.A5a`a.a^9^2aTT'%s[M;g7uXe";K\r%W=qGfC><+bQfi(BN`K)ukNa(Sjk3U@/h!GKiF=Zcl3%P=9IV,0+^nc.9Pits9qH"_Pf-b7>Q_>Y4EZ6&cdOt16DdN%P-CV4P.Ms)\r%?_/X!K\:244EIuEkN\*FhMB/i!Q.RjNV<BO168p-%1lk-rgU0[/_(hQh2X7V(PaWBV9KEK]tOAp,^0]4@LE0'k&CZ\E\hpNR]O6I\r%a+3:I3R=BL>tq*Sr:rf)7p]&^-hhoYe'DCjJ+Mm-n"[XHHiF?N?iHid4[7Uc8=Ue!VP@L.cP,e-kZTS:XD@C_i]rDTCDs#@oeVYE\r%`A2\5f!67;@3[kH]keWZi,fT(,o.nN$]N8:!8KmPG&IAJ9guf(S^cE99flKNb\(=AU7q5Ffi=Kb%qj_nI_>8S$fSqF!KKn#hVW3P\r%E%V?gB,P90P0BP)_(YD4foe;-Jm[Yq<_IHlU1^*VK]8`!nG\dT9]qK#i(j!]FH%!'[^q1gX&3Pl#&Jkr9]J_PoX?X@%9*1Z-8%@n\r%^;kgBR]Kd']:E[!G`cT5R[THBRZj!2=):>(Gs8i6;Tq`/b!0`<3r3r0mY*ACTm%emk$AmG&km]n<D`eA8^RLSQFY%L:4flqV<BZ^\r%6,"XLk$AmGP)7.%2(&QM%IfdLN+q'65NoI$7@TL:;!<ZLq`*GtOdVE[C`*<QY[S^P(5npUMiHa1C/,sf..>BnlpL<<Qh3h"37f%&\r%?e%mNZ!!6r1IS-!$6p'7O&CjO!WTA#P&;Y&,ph)&D#BXsP)MPPgD;X08UHUA+UtToh)/kdWkut5$Yc'sfle'D=QNFrPS[QWNT--_\r%c0[L0D,+uh/(Ha^`e$4Dp'V/4n"E6?fkWpm@*W=T;VUH>%`TN\3I@n>#>ZWNou'?_RA)Q\o`\ude*mFH2o0mof/BSI+<[>.ITBVC\r%(X/pE1P(*%Ipk!7c[7ZAoutJL)!b;.l@pa=+cKaPQslj*(j;+g"GSW+$d`)&QG=%YJ&,)OM$5F_\,tol>_'eY^OQ<Bg>5K+AsLPb\r%\bWgbOmf^s5<#BlRD9%4pZe\U(8A.A<-IK;kW6?:-UKlUS6"NQ>%6%8&Osf6B4n41,WXl<>(!8>=<;ZC]o&E(BPVDR9?V:NflVD8\r%0:K]1>-,"SXD!9p[<NBOpK4f1[>&0>JBeX".V!=tV='/F[[,L3,JLTEdOlK:P6q2RBPVC+>T%Nu/QUQ`m(one]:%4@kT9&S0=HE8\r%g'q7jRt>UY9kCu!>CgE=BkC*<Z81el'&-io*U.s1YdP>)55K$YXK@IpIQso7ZM./h#m&3Xc6/"3i1W8up+*)9)f5n@jMefs1UJh9\r%fJ-Pb`RNJq58VLX]/FB6EkC:*?J^4TfKiMSO1.]$[lq4TX1$UFLpZ2&P/-=i[5DbSWb48VjAf:N3VoYj#T!+$FA05O>Dl-i5nCk4\r%>?a".4<lW0)<4WMfKXu>?qFML59Z&&2(V#Vl>Ma7GP,Nu+D`P6cS5ace>iMrgH>"C/'Y-l`nl&Rg`@e;p3UguLe#l[qdHb%D=#$U\r%5%.jFj$D2/5;rD-&)b$h\%B1KL[<ACY&+piZ`e7m,(AKrUL)(a%[o&KPtcEs`pbPr\!6S2SDG`#Qh0T)Z3Oj"c2?9`+1.Y0\(;Z=\r%pT\5"kaBfQGRB/8Ha1+^@h'%>p#=T^DpMBn7l$HKgXu4PfkW6Fc'f"Uj?HQ-(V5cf^PuFtf%c86:WOJ^8j&guh)]^mjj*E&,PNj]\r%aK!`2N%7ED^PA(pq8RmKH,30heJ%H7:00B*#+OQLZ2#Q[;]164R^Y.qlKt>gXM;.a+-1@+#CC`tr&Fb%9M-CCo!MUaImXUaVk<!N\r%cTr$IYC;L=4\*am%N6ime8t/HlH#fnK/;YhT>Ns=F6tf"XE`/T$!^l>\7_abkT4&WXLP0q%TZ52Z/VXJmS9f'N^hTK*6u,-'eA\i\r%.^#\qM2;uAgeYo@79$@uB;dfS89Mq0_eD:/hWKq7pC%e'A<%2H&eI<>B8C%G)Jtp#Do,^P=KK"[1,Rlt+sK'16cD?4,qN*P1K5@W\r%>kuBs>Oj[5Tlb$qm$Bl=WB5rg`PbPW9r:aJJNNrB]WbLXcVSWR?,X^>S"\hgkQRdscu7cJr_#F=J2?C11YZq;mj0s*E`I3c,V)td\r%"KjS=Li0YpM9F2?YPb^>`VgtjS9?5l&$9_^Jna#*-m&#:e3*7=)%iD\H8a%R#b%n1g_g^ZXHGa"3)$'V^R[q/PUPsl-Z1WNb_@I)\r%A^05@nB<O.;;@ei!mR"PB`4SY"d9=RNME+)JMngA`r[aK@)%th:bp=`?T(/o6>8Ka0,1,@5n6J,5^LKqLU,MZfen8"#gG'0koi)S\r%q5u#HCQD#<XrfuM*%YLb&N,")J01K[itG6#"[OPHp#<SCA@;<edcO[EMYikue/fJZR:-\b5<b24+VY8I)-\'Jkdq*d-sZVR^^0$d\r%U`X[9PQ-Ar#hI]SFS1>1'RtK3#uhn`7q$ahfntglefG\M?3Z)24?76^X?Anr9-AnnX5&^>Fli>W6Y0A3,U#@\=YXpO:SkDkBY:h0\r%7"<_WSjZEK@<4F>NGRlg!DU(@oYC/AZ_=W2/U@GEhORd14PNaIHf]h,q/s(0l7,-AGg_-BRqM1R6H;I7,01A\=9\E*]B[r&ZKg^=\r%!e.o>mqBu@j!K)ob'Aa8,Q@*USD,8&X3cq8\h4&hMHBEOiV30%O8->J*3HN`[<L05pMr:elW')US[H_E,Z":L^\//2=75c,IdJ.a\r%H2-*SppG=card$S#X]oNf,)X^`1aks2;(g`7AmhoA_`-ohTa9S';E/r1@?+e'<]%G#@uV\IOYqBg^2NfrHDf-_+FSaj6kf`]>'_Q\r%kFoQkXgMH,&rlSp+U_4s(S18[pa_u\TY"mEG;/W8hE^]2AMf$8#"n?),opTcJa:1sKa-,bGs.Gd/#].1BRl+J?Vim/QSL`d0-GfB\r%4.iU7kN?+(4%Toq2=`[EWRo00)epb/hSDfE]NSKB3S\;P=',7+]cs6Fc@&+7nKaNK7&or5[]tmBk-10mT%mp`g,l-<?Q:7D=)ZNo\r%GA+QAeT]DTn"@kDguF5bH\_$";gfIQp($ji5@q):m@>M,l8sI^?*^OghEVNm*_U.r\>K=f8O4%oJ-R)+jA(6mfBEbhjp%R6;CCSZ\r%5bt<Kpp45!)i0I807*rOod+qZ#0g]21cS.Q-HT24[ai3_Qo$cQ$3B0Z4;b7Bd@+5@i<dPu+:<\,R!CWu1>@iu3eeQ,JF@$@VH,EK\r%#a!M>)cn0;Va>06'bc9DamSUI,RD[Q7mNMD"@7"5ZID!hi8CEV#_MZ,6BFN`Ga9d^P+ugQYoofGE@3.?c:)='VXGqPG'Lej^Ena[\r%3*-dqXCD9_i05F3<KHnE+@EOfP8X##SAWqm>W1R=oYrd@Ic.p^'s/?<hKC&>S-1H.#`bR@g/@e]YCYojpJ"$ePD;EmILVN4%Af[i\r%G9Z:rU?BErM$RS]&=cGR32%h$hoj@[[(i=GI&2gb,F&)d%(lD#2)Q,$"M>XVZ]<V`rOMLeg"<=*#T,U,@2@SdD/:3o75Hds<UGSB\r%=J#-'-MlN<>LStThV$%t7,%/rV5>>shV#KF[#HccEH=)KJ[Q[JDG\RfTAJ'H8EGYJ6h;.)B5<k_2gAE0Fgd$]E^T/[IqPg)c.O%?\r%VcGgk0550l6Wi*nfc$`m(&Go%3a9kK<qK.c5&\Bf%<[lBZ'D1bU3F&WBaqMjee7]AJEBIW>K>X%@q)^)DB451%]j0YXWn1Rd%!$#\r%^JMR%I*S57Z#,XD'!!_*[TW?,Pd,)0$RZ^jkXah%]P/N(=CK-W'j>DmnV`7B.Q!qfEYUuO'cKtilBEj$Ed"SlN,>%VCl9RI9p.qT\r%'nMp:S?fb?o.CHIih(E<.^feL>!n$F1IP8:Ep1kb#1h#MQR",o%:'dd=N*ZXBZ/4ZmMNT=A0&GY>m8VX`I@c/d%uYMIND$8Uee2H\r%)f':mjlmO.)//Q8f*^/O@\*kE+.jB3MBmHA\M0D):j2ON33O3Jg@GY<&Y2Y(H1G!X`N:SuUVj6T4.0KKf+7j4?3hju&ZPO.XiUjB\r%1_KZ\_Pm\GHH'h`>.iY:"%fg*aVRYWl3<..Y,[H,Rfhba@Bn,s2N?<sZmHH>_N?CbcY]=fIl=oI1Y:$bNUE9bqnuEM)Ri".D"CF<\r%i9*#FCmhlG)og>#)e7H0!Ie2SI2D<^!WH=)4HFJ/$h3<dkhN4(X?o9(s0$`o6DGLpK^`2jP6L`&"a"kl=0_hDj5[_!*8475^)`YX\r%8)GE[p$LOiY3D'ZraZ'/>QJ65`VOakC]XAa,()Ik;H"O+@Lpo4+O[_dF7$d7,1a4jK+F,ah[U)ZOPQLA1?U3:N?m;g6Z_X&Fh1E,\r%%aBM3\<8dRJ3R+#8)ddq!rTS1TSMK#(?!LRcngJi,RY%4OsMENghD6iTm`5FL\n&m>X<JdFGn</a'I$'Tr4c^f?Ddg#[BI)S7U?h\r%ks3':40ud-^+)`>f*#]]H1E?'+"o;g/ta;KG!)+gQRuP%IOBp/;l>gh%2U_PItUpI4:OBFkS@d`nMKUjoXQ+7!aO[cYQGsq?@XP2\r%^sqt6Yj?TQG1cN.\`9u$L)ii$B\Do4lp..?"EE,Dg7B_PZ<`2*b:t8!0&%]$1j5u)a(;jk4-CRT>dhh[6Zq(8O3;\aG!L0`6!UkA\r%YTq8P`+?Oh4"sm1^)'2XA\5Z*ft.e:QQ7W.MDm0B5B5E+Z@bn%:L(?OY[ad4K&a.BL)lgXM@R3kitl]Tfe1/P=tQM*bB>$6?pu;r\r%bB=bHcoMq2>dhh[j-e^8/hYn"mm:\m[`bmb\cp'mA\2h%\<DVLG!%]$a?1e30&(OILrW,LA]N9(@nR%6DqXY;lq"EIbDrK/#Fo&9\r%/3BGX*Um3"&=;c>m,4EbnT!57;Thm($'*2PX_l_8+[.O57;@C^B6IO'nnb9F9/j4T5Z5eT_$Z(CL/$96;TjG4MiGo'O]l:f?[,ha\r%Mq"3K`@43*LK56>XehhZ.MX7PW20%\a/uCkp$PlhNTAEic+!4;p->^7Dg+3ke9HIM)%eQL[!R8[J3s+",KY7LB4h,Nhc/g'/KUYP\r%ZF7.6]mY1`Stq^e0lkKVDkE(S5LlqVi)($3+6,/](M.'69++b02cQj9264\s$fkaIe.K3_Y#7bY:cIiTqcD_07mIH`7^gd,5@a-F\r%A^o0f6?%kON/N=4Bu]%>EinN>\ug_s"^R,,/[Ent_:LS(3cc!Zl/CaM:[_rKHnaqtXnKcSr[E0Q_8g`"^6e`aX#btTYS*Wcf"-p/\r%ma8@C^2F]XUSR4GT[S5]djm9<'GD(+=e?'rN-D=nS'SE0V=u@.1Z*oKG+`$UT:0mE"tQ"(4]29@Beo-qMC6_7]3/p@#&TDY;=>i@\r%c)pd1'UI7>c?MK\T<li2k&URdN+pSSJ,4p:b,d:$XP;JmGqc$t)L`nQm/Gqll;,56YBOB_5)SYuDtMa_dW0UD%l4,e"-Nr@`=KOf\r%i.@Sf.%q"Q/n>KYM=q56P%%IkKo.-'g$'8q=MW\2-5(ec[uqF$>a,"?`[ZGtV3X,]H&U>SZsFPcd*&=7d?pKRoO`5T%(b)"]r!tC\r%22D+EZ%O0`I+%F`iF"9DHP^=Ok1Z[:Sr,D5?M[L\JF^VT3?8JR)(\h_g)0PpO3,h&T%V@d^V5TPBr:`:q#_mFT/d\-=/I,0#*T8e\r%"*m^$IVJ6*s-_,J?HfN`2jDKH>3.O0^XU@o^8-mY/`<UM>eeMuBFlaGWU*j?eM)\#?EXc=$e/==ojgcK`RTu0akN2d;**HdYhhiZ\r%s6!4T.+1":q`lJ!0cXi<bK>1c^>f*%ec6+9ZGU!!m>?3gYI/BaJ\kMj\XC'5EsKC(26d?L,$JD-c2k^VLf]AYA9SD]20#4*@[[^K\r%XW>N,>%>+UKpMDTb]L/H=fPdj.F"&nl@[KD3JcEg,nS"Y?]6Q^/Iph!0ki7H`$:g:/mTjGNJLqpf_VB?M.!sBgtl36r]&d]MZVT+\r%n<a?`&-u!Yl0Ib!IVPu#=OA.nE*]>F@"YY"a4j\rgjE8.m)&CEb*5)&ru^N>^QVDU/>9=oXk.sWKU:*4_5_A$L:ii'l[RhT@#jQO\r%E>U?/8M\re`6\2;Y@^:_ml(%.Kq%2pqURTbi!N"nR95E-i,Z3@VV]_PR/D%F5NaC^%Fm[>d>VAAc,1>^5jRFM(L@3chRM#VP<X6Y\r%Q^:pkf15T%RRlu_gS]3Q_20.Ied%Rc;<`;>r_LFekC2NZ[Z;31>QrUd%J569fX8O'F)ZXt*AfeW1Xq!aonJS'd/kJPG06H-?K8?"\r%!*JT6rH7r7q"(gq\S]r]qe5M%\i\)A++LAj5L5r4pl;g_J(EW\]((-bR6h`B*P0>7Eq?8Ge)!f/Pp9)+69D/9&qpQk3TA(/1o,_9\r%IKroQ.3%M*=G;K/5hj2;<@2(A-WX[K^A21PpG\Y_.Q!qfjtW!#Kf27g_QeuY<7"4EVB3N^@^-8Wris)_`F'G79E\KW@^-9P:L&"9\r%6^[9hQ>gkr<+$U\McFG/F5&mn+KXS_I1qE:BLi<qoJ0g>m4g+lTck.6<J(sc4=mT`rKZIF)JFm4L1OuJXo^gg&b&a\Y2;E0-p*2I\r%KYWbO%XQHU<*JS[ENFo$DIc:0=Bbbo?4JPC-.P4+JNY5DfbbU:d_g^eaZRib>?X.oSTAE^[!,k-g#;PI#&?[0DIO'$7!_<(67R7<\r%E<fjgi1(p>N3H'h_"uYeo\__>%h^H=!OQgY.1,ni$0\s>V^0L/82.3WQ'!32r$_sM)$t-S`L2n)SWSHJ==g"Ggkqs&X4s^)$2bYI\r%P0B,Q:r-=G/6Hk*n'DKsRh-;\etWgW!kL"qpW`[rZ1b?i<C895>;KSZPFq]DqIc3U--1T5WW._#p5=;DEi&^ijmX5B03)n)j4g.T\r%a-nH4IH#fVjeaiq0#m[n\/6F6,7!@e=;`;Sp>q+QrZ%&a+Ta+Ln-ppF7kTN%'&%tZ7'$e/G^4m^7'$fZ,`BZJ1t76JA3\l"QP]F9\r%(CbN'$ko-U@V(?,IM%ONB]BZoN.f)SE)QW^3;hVLMS$A;56Kjs:,YD:kP_$;UrSM-BW0*N5mtS994254.HCE9@SJB2i3mTkl"^mb\r%b'BVrNhNjlHV-OogdOS93-.&58&WO]iLWGegm)-jhL?VZ`:ti-1-XZ(lD<`f)4sBn,3VWUdlha2KNsU?GDaD#K`%Ua5F5"qEX;:k\r%J`n7aEenh'>)fA_X'i7KfgBf8SY])-aRb4pj+5NcqM96>aKM=<PK0j9oWMnmBb/`s$?iNRd6h1"O<b(,LUbDK:_*c)LD\,VZE-X'\r%CLQg:eu%XS/oh62.tc5:fS*5LI,1(Q%u6]ApRkPLlP:8ucqTlYNElF^BH7K.Yfb\'8tJY!_^Yu*Br"sWNLbdnV@?k*2siqEI.Qpi\r%:uS+k[!I!UEr8'/Y("MIIP'2oI9<\>CV9[-9Gmfs,$mK9C#!p\Z1O#1s0D5q[)D5)S'Z^"T#s/e%N%1AV9C0?:F,A&Te8maA(0Ro\r%;<I*L+XU1B2DZ&aqk17h:\QmI\/HA!_GVad+-YdP5sgB7d[lhr4i1=SP4h.Xd1VuV0$1Kl(`Ie4TU3cZL]q-<kiIS,I))(,,9ar.\r%]g0mc!Vg\`FJfaL)#/-2l$@!UB^k,8?M5Y%kb8+JD\3Mo>gUZ?MZkH@(aq%/%S_7(:gPCl69+a\5qgH?'jm/%oG:Zn7aLIAoG;Y7\r%bi@r`"7,*<(c)kpP9]BHnkp"Pn!KWr=C0l-SkLdn'R\^l3c&NL$3hk$'X`V*5ZjeN\\0Xf%SqRSHi%`1cn&26)%eHNO*@X'3kMLG\r%FI(?N%;<1MrKV`\&S]:<,k.3lUdDDJenM2:>+p_He=F1a17[`+,rPKpY\jtjV$Q1S5;XV1qXDWjIqXR<bCIaKP64jPPh!jpli@RR\r%P&dH%L'mtPN;c1_A9$RXSh;H`()[&6l&r@6.>8<4o5mQL1*cf-/4L$Io8NZ986fEpT4dd<?nl*KJ"G&;5'_SSiI@GSJrBtDiI@HH\r%Ig31i')q&3r<LU^4oFcoCeb<UroY0t#JCG\_Z)`nrr?1-$ifgWrmU$b`pgaTR8'7EkW^mOM[TRV":3Ak/1g_FEtFUIY#1E,6%bJq\r%!I[OK'/XAN(VO1oL&ZEfs%0N3n3>6DXKX;#%L0m.qG37XLAuNgs%0N3n3>7R#F\eKL&ZEfs62^2JK1'/;^j9qcSPFDOfK$Or6I1q\r%&*Lfd$NK^Vrkm3=W:3$tkW`73<T*@2cfdS\h'"'AcSPFDeFeY(s79LME&s)Zn3>7_5M5@3%KEI<de/C5=J^GsI62B!P..@6l`Kub\r%B&^)cR.RdYTc#2_/3qB.--=9MZ2h!P5e&FDAH>O\,6>3-XNEn,gp(N'XZfr9nE#7.37U-c?7DoU(M<YS*OriAbDqp8qesdP\PQR1\r%0#H'i5LeTfJUnj<T`0Lm3"?KE^*j'ad<betAm[,7#R&Z'U?+l\O21+n^??,qoiXT03u``.:JQ-/&X\9eU@olFr.XS"a:O^B]qboG\r%R"`9ld^-nA<$O\:(B1Ua0h):X<LqPMfGSl*.&fca'=O)4c0r*cB8jVGj@P.I&fq/[0B4@ZE(]jO,U4h[`J%6`L-!Wj[<QM91D803\r%7gHNm_C9TA!%SD#9Wcf3!2A98,><HVodIkO>UO;[hd6Z-eCW*]^JhqH9T*8+<R=Y<]oJD_'K%<N>o-+6TPm_9$S,AnTc&Pp_V[e[\r%RD<oE<`6oMe9!g+#;l%KXfUPSo(3N.d#?8M)4]Eu-Mh4rS''.[1dbn,Z<VP\RK8`h<A(lebp8]7QQ7.1UOZX\,dAr"%uf$BL3n/t\r%qS7-VPhOr+kfSU&L>Y6L<YlVCnWfi,l=7VpU:PC(rSf/t`"Pb+/@&!mX".6oIdu[F-*8%,6?:Mf]5l;p,ZqtI<q%EdMe,HqXl6%'\r%;pnrEg2`tSb*?T&O2Q/%lH(U\X&-BJiO#ILGNG!PB)W=ef9M9I[trg1efPOr/p`nbX0BeR)qtPj(e\=c\?9(g`JQ9>TBNF_P+ii,\r%CR)"PQb4h]#1eRrb/JTi9'?<e.Ca1,")U+\k^oF+aR+fo\es$0c<0N]UF,]A%5bOERWhgcOm3,8au0$Ygetg'?+IA7]l&"*ZRqVR\r%c*gl<Y$B6sd^jJl]aL!&EW9=j,M9K;,J#C,kE>1''bPQLOuG.;XE_O`>b6ndi,Uj!K!o.-X3[VEEd)C49+MDC&24U6P.RA9j-G!$\r%hYU0HN*GR-lq30aA_^20JZ:L[FI@0CGVqO--;H@>3jCS(Jc@$@V\<j@P9bqJFCK*/,*PpO:+)KIL*iVca2i^7M\??kUS-k145UPe\r%0Lc-0?pdDCpZ9@ortl&sjF#j`nL;J8>3giRrij@:JsBU_`D-iL:8BIWFV\``.s>A=e"uQQ:(4O*YR_Br.DdkgLGWAK)lCJGYhiL2\r%5/@FSG%.Cm,4ep8@OHnGC:H5j'K\$7?&KHZ.s<t,S#4?.UOt?<>Y/Snkk;F(Ea^K1Z1PUs6Q>H:3Be`0X,]r*'%4?uZtB;H95P2K\r%?!Ctu4K4K[;pnZq<#I*S20=_U9!Y<p(W!qPLIf/mdFheQ:=f1raRo[A04,*pnO\Wl0;(11iFt"%cZHCZH*#RIOI`OV8U6KchtY->\r%7'#k"l?e]<`i#q9k&KR[!I\&r=#?Qcs#er`i`^!1ebE\>&p7Je,`PUNS1$hYpgcZHgr2:mh6BW>fZ7iMO.iCa7C:"Y-*SV@8p#pG\r%cZS3@>?D`u[P&utGuqKY=1!W+#7Qrl78%ktg<<<#5>dp(4B2Sol>7^!<Yu[BJjK[GZ0B:3Q.9KM:U4ag?pcstpr[@9@^PT-dM'Pa\r%RMM5tb],=;+-;m'i8Xr$n8n`:qLEZ>>X0ZuklVin[is9,A0eMeErsb'.8>M.RpeYJd/:@-h'lu&F_Lb(2!deedi),>(5<]8f:i.A\r%Qk9ok2#m)EOp+0)`k75f3])=$)HK63d%LWg;WH3!Z#^\.:*B1^[Jhq1fi=3]HO[C=s.Eu_r>4H0A\A#r7<A99bnn.e*qHfj8SaRa\r%ncG#qiS"76%K.-714XpQ'=r]qh)XGNr^TU!&%!4rj*"0[`"D7Uiu>u/G4qVS"'Gb*kQd3nl!=V\ou&,:iuA[pHT\n#EH#t9g#Kr5\r%a3?+eao%S`I`7]h5]arK30RlOF&n)Ca"%B'RPTE3)4m$P2.uj/j,u!@4M'Tn8[bqFPE@/P>7POorssVM\0QuHVtEj$",/4'4)LqW\r%EIH_"F??Th5AFsc&(OG@O5nS)'@KYAT0/-<1Dh('5/,Nsal<XQ$#-=1&&3a5W2LW,I%9lg)P>AJSWsd!?1PKN8([MM%KF:)NCT9s\r%c9EZ]$,6R26q!#1[cDF)&^6'p'p(P<*>!PjG]_'fYZcotVtEh,LKk"S`i%>MVQSGZk>o*Y)'e/oMT.$hVpZ`rHrDe]o=7KeiNg2c\r%)*\TP'd[!5AR^00$G%!*F??USr&E!3o*dM_'L,>Q*a1..+42<^gaC.Y'gE0GGE)[os/-`Ym.',G_9f)]5tq3diC=C4:?rud0$.N]\r%,$'F(hCgZFU<rGjOun1VP5'%0X'cG\O!K1EhY&H\IN5P$;:[p>kQT4<FRUS3IN4n55O]sIIN7t#;o1TCn`.'t*,kFHB^6;t?20kT\r%g9k07Zul\Wr*JM3Jaqe#7GU`I+)[:`^YM]cG!AFIrBuVeGBQ3-khN#RO(033d*>qJmO.Ppj$\+MGBQBmO$d(qhh_XP5;)c6K#6Nf\r%1!=&;+HIds*22!;ET*VOa5O#Y4X,CR3:u]$!luUC+3.0R:H+LTBSPC@^>2Upil<@7<]QOFR3d=;mWfW/VkV.k96+\J'n^oAmp#W-\r%W!(&"9Ap=Z%/)+p;(#K>_r&ICrpf$eO6iEg-RLDHh.*f#4MgRJi-t7@^_7JJ%el@N@$/BgP<1dTm#Xk^#V#nem-rkjGR,BU:7>=7\r%q*-@&_scN_'NXeb.69;tCj9NHqFRgUCbpkWEVEBCfc_.sTOk$ZNus-5(;'s/<HO&$=>8DO(IXUWEGh0548c5i,!4kC+"(t]>=<BT\r%n`,_3i!:Hd,^p`a0h24h,k9pY[s5t(7E1B]El8^*?;G,8n`-9pFTddr&jHjf=#8mRPF`Y9N:GpRj3Dp<naYZ>5;V`E`/hO8(q!Tl\r%Zo:U?rS:>"n`+uLHKMh"Wb4Mua2ri&`WbF_;t@tRbun<&X=<d&bFB:qVa?RFP:FN3<++"g-`J;3:'J?k[N5->S\*0@]h[n`Bg%)f\r%cLDEo&+T<nqnrJ\7?-?#EG."b0P^Mk24=2PU;lTX<):l;KiA>:W0"lcNYirin2a#LW?A*=843V@L&!qqDaXbTp7m<o2I;>KD_*N8\r%!o/CDaW/lf$EJs6#<RU!W0"YZ.Ki4?^f/?t<<GZh0^N*779#f*fIf`2=LUB:G1GR`_,^RGajYZ)9\ll7PA94Q#cQMN\pc-k?C-Np\r%RG3qo\f,eE&8Y1C337^t..3]TDPT0f,3->!.'BlMcc*3DY"`*KcDce3k&G$1<SQR$4ED-(J0Xn;;(U<Q]W,U'QK0KqfQ+&IJn;Xm\r%D\@aeM5'0)CP=+Cd+.;se`A0dn9+8q[JkQDK"Gge+-HsjMq%SV8-NNN[D9U!BqRI5[3V0T<L9?-!k2RA@OE3p$WPKcXh+G+Q=jBr\r%:TH*4W?o[aXh+G+(:s@YZS_)P8M,&W"(c39O]kkZ*)W#V4,G/M/.MQR<d(qMPOu_'BilGtP`SaRBnU@'iLMpTRN,Ir#,C<1A<qt(\r%$j"+2Q).o+r"@#,Y>pp]e8jPs[T;3Lg/79=?%,ZZAsgA:)LLZ_V%h9phI#ukLYNrO_#"MR`\*gak-sK@`\&"^(<MFUT9YgsVXMc$\r%$(@BA%#)7nq(,(-[II$7AMpa^d34beN:jZ/I$T4D8`i11#G3kY>:llBF)?oVB46cDH_G=B5"kX/YSQL.jKmeC_GR6NOO&Mm4ChSS\r%"/"[sEq-%*q=.UiA@n.4)tnGJPOUlVaTZV50SC'lX?$23OV(2RET`JX#DP&_TnNG$HC#W<g'gX"G6ngH/TBOZ+lIdUOOR4RGKQQ.\r%?K8?"!9!0hrH7r7q"(gq\O@<Q*t>qWG@sPG/%22O4J,ngQ)o[q/5\"KDVUG$RLiT#UJJR^[e\E!$IrG\XWno-ZmM!?R+(ol[&^0]\r%r&mf$C\]f@j#@lOJiSg3P%=%F7r`,h4hH?[aXOnA^^Oep@PaICg``"(4\h*m`7s@k^\<f?AF:eB=ZoOEeWai'`-Y+H9htW)"_mnq\r%CNAEY(?rH+_GlS<0bR@=749.7R!l=838ppag#U*!j.mBq&&jU$[o2<-buCeTlu?lsjqRmb^TY)m"Ik157k(8]EnOk\hJ^!B#sFR1\r%,u3@J5HYWsA?ZCg]d&f9`(<\)6Q8gL@45fC@0(@Q'i$;#gphjBW[;%flaAHG>C'A8[%(HD;aTlDo26i*'U-7<&k/gV*CGa-26g6.\r%""%]T>>@HqiG:3=)f^/P;,VmQ*FHEWO`ij??Y1CBDKf8JhG@*CHS*<WcY&$2\\)s03GDt'UgE^A*VK:(V%*K=!.1rJLV<&liZC_e\r%i3te)f"s;j$:F6OE,sDuZ3NTMqB2g=G9-l=%0H>'@!N<l.#>F&S1LbErcl9bVI\`6@GuN1X.CdW1((lS#Qj^.KLJ1O"@88IS/nR^\r%hrWGXp!Goaks^&1qp^PkWnERaVK31ugE6@BnDUobq5*JR'9fK4p/MLFKY'LCSh7Dm._g0M)m`6Y`KZHW*@:4X*sUA]]fuG<BP$;s\r%:/>b9"$Rt6JcHlFfRr$6E-[*OfK'LR_B*f)JcQr$$u!&ddE!F'_"/`o"i;AT5b%]>@3`>b>Pq3dGX&20>EQI8hQY&J/Em=ci2!A]\r%$>bRQ<d:U*$hf)i4jlk)<aJHbJLt.*5er-_p4/`!&FeY14_3[;"$TD@^oujiF\O#&,[^YQQ*H>k3(I5^8#D1-!o$mukM*j;L/U([\r%!o'U4:B'_5_QAC\;&Qajj]Fb9UP1e1Y6.3l^`Fa$5'aN0-g-ao9?o3k+@p7<!J*EmI)G`L1l=Ge6&WdjAp1\j>t=Yni!3KG"4Iir\r%a-1$`"ELX)p;@2Y*M)5.;i>Q7QWWi#n>$aNN/o.N_=YGF&*$=.c?kYc&g+2j4tDT<5NW0*gmEA8jt\1bI(>mdHLEYAYP-;egM*Ft\r%rj'Sjf[tB*_a?&7Z#KdsP1D#eEd7^=oR7AU\_Ir5)rNJ5;FNi':V]EU0.t>RLXs`AUqj-<CZQ)i5uKAnTAuMK\WZ=Q+CS7i7%X_V\r%+OM0"Ur?$'#Dr0LGjED%HB;eM,eOX4aFf_`p7kk&,U4U#S-Oo55_?-qYoY1E399ECMQ/!>CZ1'S.6!.t$XT#I$25RiFCo&*7\g8<\r%lnfbG,S5E_=:Z#RdHV4RLhh%YC.Zh;gSATVIGjO_SkC,#D1k]$ZZ:k%GhSH(ES80r`:+fnRKL[oH4K7,C+eaCZKZ]A]V6!+9tH]=\r%\AuJRJ]ug/7]4jpm/?Ze`[PbPdMiVb(P2gi#Z+t>6*A3?^\oSFANh;b8p'sXYa6nQ2jQ'XfIV\>hG$LuQOtup-^>_S=*EF?-oVNl\r%I@Bs;YPc4tkd2ELk+cr9J[A$Ts,#<P"k$/k4.C!VjK5BQF0W;3Y*X@;rCFI>*Hm_&aX#&E5>$6iO3i5\SGgOXI"ZhZ7G3_abt!j$\r%3n&PrZ`LQKjs+rF=+pN#l"*&AjB1thW>nPiZr(q5HK_uFgQ+T>+"1%uEYO5\O$(ZW\f+2"rQ*H8,fp,T8"TP=GT)XK>RKY`l^bo,\r%j\k(/bp>C0E[cE7MRZoKT%>@$>RFP*+iMDt0%H<;lN,2*nEl0IQmg.S*3Oj+UWr?.R##c332s6kE"PU0lO'ABUWk)>W+Eu]$!0@>\r%E[h!jkJ5L-=O/Y5>fsbCMp@^%J0fe\F%OC1jq1+QPPq`lbGF\]2)HR7b,$`Q<jNafAK@mnRCJ%_42L#V9M_L;#2NMbAQr;/A`'eR\r%`"$"^'TB;VFkl*e+m4,@gM^'Q;JVB4ciB&7YEb^%)qW5,p$+Zj<Gps%een36E^\XO+A'oJM"G_e]7h^9=6ZTRdUu?005-@,nePEY\r%0/FB9Kt`K'"EPKRA_2u3;D*\!/G'^9[Tj.m>E\@!BSk]SCoWt$j\iXK>3rn$b9$U2rS0'UoDR+W\FfAh]e@nk5?F#,rd"9@Cp'WV\r%UN7hT1-=A.]PG[/Mac,Q7J:/;q6'P857ib#Jfqj7.kD%E1C+'U@-LN"?a4j][2Ottj*gWKF0$sHfKC_j_K$(\?3j<]jm%:m0><?3\r%gJc3\E3[ep;tg[p?Qoq9`sP!d3T$G,0LiOrF&u&.3DP$BUK;IW74S`(N("VZ7MLP9=!<Bb$GRqc'nohdUXbV!q>(<`iS@HuNaG1q\r%cc>2*iEmcp1,]A]GUo&WU(C48KitB;"_!Qb/![$,OEdhD>,a&7s6U:j;(1,g)2*#Upjk5a"2a1KZ7-.>fdC>,rO5&]japf\]k(ek\r%D,ALfD_G=.hYrcK*?p+'YpdDSCCMP%bUW\Q[g(!BVA<Oi1`+\R&REQH,ah*"jA\L5qtilXm#G,1e_@QOAUJY2Bc'oS]VG8b)^5jE\r%i'3n7s8;a)r;W8mo@:t9$sr:(l)-aLC18JI8Cj)Uei!75_K=^?Fir=JfLr/L+31D7qu:0p9G\Vf[B=o]^5)b!KHqhO$"P=Q80C/P\r%;p8/p'N?gBs/.HpNoWa>e6ej>Sj.A/:DYAJ+Rc/?p9SW`2*JA:3&#u`WI;%m7jRfIN6Or^WR.]`Hl?2P.gnV:8DS-Cd4=u^a[f_I\r%[Qjhq,#+C(RRF8i1cr_oZ'?6o^dn,?Z77`AqU*!3iRe!WIBe:#0*YLhe3q&dcs?`4Gm4)C?nXf)h-QJWIZr)melB&mCQQ>,gh92:\r%lu(hDOgUR`IU]jt7l!p#I=Cnm^h?o%lG!&qlZhgPr28]CgDh\`Y:d?]98XXZTKC\2W_HM,aj897:Oaf$h^'g>=%n+cXneCEPp5pg\r%@)cq.3\PZ+Be!$uGF2M/9DsL$("W?sQ.@@j^P&UN>'R3crmIlQSlkq;32s4sV?HUZVKT)06A9[]92TA+r;@qo\WQs&#h8<8>egMA\r%J'%%'&]8Ynp6Y,/=:=(afHcJO>n0'Q7e?+%I$fu2#CH9?_DjZXM=gr[ras.o;.+`PbgmEpnkA0-MJb"S6:cpH+h*co[IsIrf;-E:\r%[prWNKW#j^7cnRu@^HDeX#qrf?g*j=,!W_b]@>UP1mDa"/nqI<%r[4F6BaGl5QYDFKU/(jA&k.+IOS@7J<umOg`^Br1^52rk+_pp\r%08sLcZ(9c'5O0.#JS?K*kQs!m,36Y8BD0$i2-NGD!E3]`O7t^2h(7ES53$[_QQ0VP#nh0oZ^B#2d6Vmeh+>Y?nOAR#&.\Ac4L)BU\r%O@B4Aq$[-+rR=h!bQCLO&^'.J=Q-B1f6Npo$AW;#h&O]TgaCe1;17j!m^96)T(%KtErZ%_H&.@'Y8jR*?H22ikH[5RF8$&B$@h1?\r%2&[`hL.ilZH%(h^At'^>WTSWOWQY_=n_U@\$Wr6E0NJj*!XH#n:r1b51s$eVT13VPr0mJ/3#ejh=[u88a7/bC5,rSp!W$U2^Yb#X\r%:e,u'+3Ijc+pjQ#h.H%XM\[iE\H;abU0q\?"9ltIJ(R@`_g"QK7790g&`^Ql)K"Nk%I>N4le_,=]G6\4j;f3"NLgq0l*T\ON&OE<\r%$>\c8=uk1U>,.a&cE&#Bf]fd%AZR((SMn->"_LgAa;^]$j--%d)"39O&Pe;Z^S!C"O\QjUnIB30$Q-)<]Z&m.dtVAF'omB>(Y:pL\r%igjP6Pa6Trj^ujX=jh"I)($3\m=PcXFY$J.<,@LP]#TK"e']r,]C9sD^e]Dn0?_7!i[5Iai'jHjL0m/e-f80&+J&52&YON5jA&+J\r%A**6#VUL:1e53!gXs$g9BolS71n$Al&aeV(=l,N-C=9cZ[QON2fH6ecH*p5Nq9<MsS)2Qfl*TD#DegFAFujJ"O3cPCO.8tg[^O$&\r%05E)CdqQ^&hWAsSd(C<SCA4ZLZJBjlr0gE:VUL94e)Ii=r,gY`FD*S7WKH5=dtVMa!^BgU3c-iKS=7X=R8+]m9ab8e$kr*eB&Kk2\r%E,kYT.=@!kS\t2MT4XngiEjsrbmI0K=<-hia8HhV$AC,G]n%+e%NSk&i']-o3:+ONkO?;=GDUmf#Dt/ILMuHT$1lC"IV!%"+)?Kr\r%@<Tmaouo^PK;-BEnAQRj$ce;u-+<?oS$:Wl/E06=Eq)iLS3+b-Ku:srRBq;$%'I-#T"1NNVn;*N1f$fN0ft//j/)O+T0\KQR&Cug\r%fG>El@4HLJr#Sbq_tY'FI#]G''?93%4UQ?4'KV+c,Joa"gr4TB'[cH"T>PTp$Ocgmle"Vp\TYQl\_cFcD`LhI:qch:2')VdBIO>]\r%MVU2JWE?ZI]Te/ZmGWMjGB'5.p%nMUg]\42_7)_lV_35@7O-@OTZb5u`7N;sq&n46d>m,SSNIiH0nC)%+^I$i:CA+?i!TIdP-_?p\r%^G^O,/beC,8c\a?'+F?FT:gIMNZ#^i<8VH(T&'D9V!(X4^a9aS&'bB([Bm0QLt6+ln1O)R>:8g=Qd-,o1&o_IPa5%a?2(Ll6#pTp\r%Gd)D(9Q_"hc(T((;oe4c9']kV"dmgec:X"(#50Zb1](<`?9%.^7IFfjVLFuYL%J[@9i:"4i*?:$V?,!i6c<[eIFZg'SqXh3P"!aZ\r%D('Cap-:MsCO9`;=E*"^>g4GT*j^WK_uq=hoEg!8M[r>c9?RqaO;-%hE*^<p$7^uRp"5dRFN.ho,R*fHY56'A,S;he@OW!NWVLL]\r%!].J%!g3W]j?LRI`\c4uY)A6hUhI/Ibc)X^-&E%$,&tJ.(G:X\/qt%BbTMUtRHf>D&m6YTY!/8YX&+S!cAI(YN/F_Sb7&\HV55HB\r%4I*W2Gam4R&)-W:h?_j!5G2)9Sk0d@e79T5LFYEs2-8YJN4[/7jf:QPBGJ:ffL3j`k)pin84Ug3;UUmFVu)!h.-RYD6n^e$\engd\r%JZ@8XA%g@4Y(^U*o8'4&_3@[8&]n3f;`d6uak`EMJ:lu\a(TqgYG5I4]p3rUH/:r=-!`c.jfo;T-_t+.qVhF>5cm@N.Q.l<S5pd^\r%'r:RKBGK^!'=8*\JQ#PA."jBd/Y`!bI9pAr(&d_UZ+N'j4-<]aW[.$R1CZ=0pC>t![egQ;?qlOQ:@Yj_jE^2"r%SLU$2.b>$k!C2\r%hDn^s1!'a\hE.NqUWG#=mi?\:9=4F'*3-IE:7h1ih8qE;$3BT9-A(+2U/QIrQ0'I>HNuWi^@*PjHRCj!Q0c0lOH&M]4#j3nECB9O\r%5;N90n'WjD]lu_#[G?',%,k$SpC?&F*]1APmi<ZIM=>D:Hg`qZ77?SbdZoji:7h1icWH2$d48taePhG2?&JC%Y/bq5N,\6VijjYe\r%.XTRj424F@&BT'a>0p3GHY`KRkMHoQpWf@$jW6:"6XTM(@P@r-N8]!'iK/a?n15!\Eu"2e;7q+37jNBK'\.?`g"nf\EbgVUoY/OD\r%H1)AuJ^LR]42f2gReP+QH++ST3Sli]h,0oj@>OL2c15(rn_T[j3N!@6;3(A\Z>=@O*Sl):NG=a@mI&N7[pSU%QE+fU?X*dtT7b5Z\r%K5h<E:`Xm;EJhmXMc;[sc_7c8A0J3Ke/VZam%_$T;c]pbT,%>%jl7M%WiWZij;,`?!>GS`Moa7(s1q#u#cN@:P!J]:DMB6e@/2EW\r%@G=I(K^kTK5TrBoPQS@b%S%ZF^T!2ZE4H<LYjI5p"SB>p)[#%c+i(6I!/?#!C\SAl570\brpXo(#\ZrpJSdp4+BMPAE#8LSQKdV!\r%@CGc"5t`H/_R:\`&8]*-GJGC=C7?Z+fsaZp"h!`;FL/ck.6N:R9fNXaVJN!uhC,>iQ(m+qX,^H7[P]KRFdZ\!+lJ4,aLnuYeFn4V\r%BthuG3sTre.Br1t`gWU9IY);8I:LYqDESaDom<Y/UYK6A3=,>)*en.5=7sj2@LKB>e'g:GI4]N.h*N4OE7IqkdrV^4O%@,4f^spA\r%ZYU!ae#uu/nY<C51Ho^<8,ZV[2+BLk8%F2_6UH`J!9Jslq_DVk""6+OC%&[r!b,[Bcu!#lMN<l/5e#]IVI6mfkJPnHpZ%uq&K@dQ\r%W+'4H_e4,M]82j*$(o`KO.qGE*WN39E:RUuD&Zc]KM:6)KYqN+6C>D/CD@V$>KG$E5\qCLe(NG4ENj:nKo)X+%aM?gfJZPtdBj5k\r%[LGGS6F@0"KF$.=19bV.fi^=l@^']?M[@ra,c)]S"MU(3+b>QVh21)rb\C?jhM"e.6;f:.cF\:B66j7aSOj[7AE/#]>83C:;]:e0\r%AgZnu8#o$d[s>W*;72:Dr:nprY3/8'l8$8kWt:'B(AXs%?,)`VgsaC:[W\.BXnkA+/YuoWj$TSjYe#Br8l7I/Q_,Q9Y\A#,&:.Cj\r%'h\0q(G1N&d-&IOYB_l'o^t%YD1#/=RTG,M\3<d>Ldr`2!Wa/>M2sC&L`JWCqARoc5RfPXB[U;H2mdNrn<a!^Vnuans.IW-YUU?Z\r%5+1\Q=L/<=A-)\d#("%/\f:'V*P$6<inQfB>eLRmkVQcl$\WI&l@6t$_:lqYYP<O0E4ZdfGJQofi,<C]Y2gl:n8eb@GEeFF^s<`l\r%<7+m'Uf8$cY#\ui$=K.;8J^5c2s?3?P6L`l![aP3O"A)m'u8*I@<4LeXoKfV$D#op:$nV2iZS\7XAiZTm?"2g?rqoG/ATRHi$>^N\r%V=D&1\22%G8f"p=ama?T'NOe\c@8Bf-taHZlZrX<OY#XblZrZmJZL[LGA9X1R)\.ri6G6[ERK)@-@TuV"e7,=@<4N+gB[WP*3qiA\r%#J@CTr]`qeO#XU9Ik#kJnDns'eb@Z)UhMZ<L)2gBf2LrnUr/GD4nb0ILC47?;!`E-s+!g&pQQO*o+15R!XT#1PQ4Ik^l0M$Nb>qs\r%.!U:`Xb6iHq1OD;i.;?hmh[,l44Jg%-R2X0a:<?##<R^9i!$XA2W%1P%pjbo/q@5BU.0<.pVoY\Z3(1jMCJdr*>mE0VnE4<G$n^u\r%QSKcqQVC;[&ocNTJXt_8Jfn<A?sq%INXEg<#6o?FQ^VkuG$n\_r0@t7fn"\p4&'#u0)O5d#5L4>r-h:I\EpSP@#*f<(P'[EPJoNi\r%QQ6pq6.NJpA-[#=c.KPm^deq#(I>Rt^qbtqR3GG<@,Z]dM[Wj6i08l"OFYLa[-q\2cBu-.[!uHgf.c3(fn!q=W3`XA,[<7VhF26c\r%G$n\_k)tDWZAAZF\1]0>%Uon6Qu?No\Eq#H%d`lp)qgnpm%EYgDIeM`Y_*tPU.0=)"$=l7&iR$_*S=4g.Ce_0-)eo$AI"Z-Q?Q:b\r%/itbkj&(1JES5o?(>cTBgKJt"7dd<7DWLe%h54]?Z3*fQB=3[PXi'#FZFE&lES5o?(3W'%a(82U3/-@tXes[pdA#LNbH?F4]9lZ(\r%^F/3`?G$#]%2lZ7efKY1iO_9h]lXJ0/tB@qo%Lf>arEENaC")*7`F1]Z/9?b[a3mCr'8g-6*4D[N'=GfVK1I[0<J]uA`<=E0%i8P\r%Sa<7IX6C-Hq,pu^)S8X8^4=i,%JsSJ7<e<8<Q![*\7"p*b^r,*HVW@>A"_0C;&HdJPtDoP6;CfF+78&]@$g"N&D+MJIX5>D+e<]H\r%D8(cb%&@+$h7(uh]mEi[n`c'pXj)pq:>gutoFf@/MnH=-P_)MVLfYem>3^%BMs_O&'D)p*]cK?^MR,*XRr@`0YFi\@*ah_#!>5f*\r%h]I/Gj);;bT0-Z?Q-n7p*..A_)"qCHiCP*Fg$ac.kVk)db-S`GWMat'HCa^-2-s*ffD94Y\\%W;)-V/`o5,V]qM46fA3GM\b,jmc\r%Zq118XBL,DM)J/pbk+g!oj5s//>8EW<?f2GH^aC4N+D&:1*Xs\C.m]l9,-WB.o/SK/R:nA%k#CIH=Uh+Q^X;m+]](t$c8s_h5t3l\r%8p0;8jl<0b<)LF0K_&Iur@1"m4jH3m=E"#R(G.!He]t*g`p/>LX?M#e_4V,$%e%Cl_qKC>[f%;CUXQqkQ)L7sFRr#]q8IZpPb()P\r%B=R2=Y(s/P\sV88@,I&EmU'0k%shi'amGoUGcm4$#m%ZtG]I$L\AV4nr^lBmir%O/=Z=]T4dl3?YZf6-5MrC<YtV;3Ap1PZdX1pX\r%1bP'$9R/;OQcs'rat/Z.DgMXtTr`*=Q^Y'\EP&*/E\_AK[J^Qi*45Im]oKJQH(_(;fDFuVqeeK@l)+DC?KU]`b#P6J*o#/B\'7e<\r%BkOrLGA\cs(\MBkhT/9i_;dhu']Te5a(,NMGRHuW3jJ#'$/!=;/ubm;;VlGg1knH4#Bb'KCj2L:2e)6T^[ZE-6]^j'X](m;74Lhj\r%B-dbSd`D]JZ'bcd>qRGnD<U&=<O=%kQjh`'cM#Oo]XDT-$KfV=V%U^9TY](24RCC4"YsJ:&M]gX.lmd`,j>J6\(PQOQEa84fkaXY\r%#K,-Y8SsBF53Mf=Xn&pOH%H^BJ_#q)SD!E*E`PB5cj(S%dI">SQM]5)60/3X):DNe[@#%2)S:jum7K0?/bb>rk%\j(Ci?$AIV=?A\r%[K`eW+.:,Qqs!A/VQmm;`;AKiONVK!raEP*^g$u>Vdg2=]Y;i==P99*jJ2MacW!!%qs3dC*1W`A3-Timrol(62]DoPZW*tkH9l`Q\r%E;+2+-SPBukhQ(`^.db"/09=9HjT'9YK=b3k:sU@Ksb$&1-$:@Dt5rO\\-ZeJ)$Us3-us6r;<Y47FXK'59mF:1*7&p++Nr91P]OW\r%o'[3KC5\4YDiqj;P=Mdg5YGj=P=qs<P`"QEo,fNL<q4`/`?Y<-=PlQ?<Zrn,bZ1<NPq/D4X,rR'=nNB6MY19N[0fL)b[B2Fl;Y8>\r%K^Iu`XB!V=SPf&&V1RTi6F@.lWDKM?,AS#l9dG3`gi_D/e1+>%TD5c#8Z=,T[0l/8%dI&q<ZroW^gt+YX[5o8i#VK*Q(P=h$;%54\r%C][nCZkd^YR9iN^%=7h0bD`d.+AAj*4I+bR#hGJc""BI^JZ;`@%pR4GQo:u/Mm\lap>\HkO+nMY(5j<t%+=TA3$SI-QE)nAC3t;U\r%WX2VkG(;j)7doZ.;QpHpRmA5=&%XkZO%>j.3rMI#dpZ_/RR-N<S1<_BV`46IA$(Q6:@Ppc;A/aB$"i`E+!lK1O^N13\0q[4f6e>Y\r%_)#H?9M%cr1D9W^KoM6\AL)B3YMW*DK=0=E!$_NpQJ@]-IRXD*-VmYR9J:EBgV.Ik/DP,g]Q`Sq[EuV#IXO[@m)1W;U$K"1EB<gl\r%4m]lZY/:%Ai3K"O<u^8gQhBM<hh.0ls.(MVq^]qgDDmWj[QR\uWZ3NfcHWX$DLAcej]IpkY--i\b3d#m@@FSk"HMp64X/GeOeUhV\r%Oacj"P%<tm?-dZ!GQ`o36U[P=MlOB[*?sDi$IW3'*?qPR+Ad9E<#7Z^<f]e5mNSV_FH=E)&[?M84L5?GF;IMkR?TMY*YF=u,,m1`\r%'s5*HPP%7bQi*9GIht[0^@!2E/k(bu]<o:qd)qDU/p,5gC@BE9C.W"qnNKVth;t@WFElB&I?X_)FTE(RXR79TL_NjrmNUINY\S+?\r%XsN^Gdl#O*:LWj[iWc%EfFt(\GQseC;Yg3nK:G"d&s-A&*0jqnZ]M?UbpCs'OS)oSgI&;'90J(NR!oC$("(`&N(49t&"5kY`.RHN\r%YgD"<HD7+h2QFC<;ct9g+lJGMC(G;AL[`G.V*2cI*&?D)&_]TWb8QrcpFL,$f(KYVF3+%HL9u^Kl&D$%,/$&s9OpYidmUWY5b$_M\r%baPa#S)rU(=CoWVh)tK5VTMg%$!m?"O\];S(6McASGQT:Q-Sm-G3JsQ=BlT15;Fl"NiUrUlcl!%DLoTO1k"DZ7_,!UHD5O\GO"'O\r%N'>e1)&tB%H-d?@#+V>Io5Kj)P;b.T1CndI@W`L/R:djqZ?Z!9SU"V3=LYf8!htVL5Mj8`@R7asdWFm^A`2pk)%.\V`T-;JhQ;$'\r%90-c?12"pW(+i^bB^lh!?A]`m7FEhgnb'7%;1&PC(S4840>7M9bOU^N(12VW'KP/'+MC*g(8A#Y]D1ZL(LI4-V8R:u0snU'kJ\Xu\r%o,JjR..ME[2pFg"(^g3WC&(1O%/%MO/sj#oDqSCl?'(4VjIR-sP@`hl\b?J*58DMRp!,8=$ct'uf$Vg62@AX^D.j\%4>eS)Ue_0m\r%ldE7kPr^NoRpSRd!j2ED]H8WJ/r\l^!a5[ASqd@(St[E3[(h<*;5:""no#GAF,tc<ddcfE$[(k`[`>qVS`?SjH[8^!3;8Bma8VBe\r%1qLSDh]B">6oaqXV&A@,MfA*<9/DKN&F/%dA(jME.4KYaR-(4(9M$\55klFD9$3^-'`e9/UAnVN9Gm\g3[J@^=G_V/;5^5h/R")8\r%r^TEWOa#bPUWjNR+T*mOf-_(-7n*HGSIn0W5:ZL?p0iWjs#fM[m)$!cUAl?o;],FnMZ/6=8R_*QC5m(*V$VbR;:0kQcXIglLJFni\r%&-&E!s-2I)NpV]KU&Pg,+T.:(LgmBp./4l!rJ/n'1gd8`EacO[)#TGPr^1<l*;hI=$8W(fO".I*>>,b/O,Ep(f0p\WO,Ep8K_N8Q\r%:T@,K'\<F3U&U4[&-r61UAo$7OV%:0(&`o;M^\?B(&\AQZ7u%q(&`p=A9%*'.f'\MP!m.dW9?Iu\Io,HUS@crk$8i%O,Ep(MJik$\r%pQ^:N=:K4cB@-W=8S%JMFs?ljC.'&,12BNK/3k&;g2L2F;^;]!/3oO)BM[="@KH<e,6[2g/2!H[4Blk35+$!kLno26nO9<3`tMg+\r%nhD0-?+6kSH3Q".pmSspAkgrAE=QYhT]O9Np4ZO?-=I_cT^4p/]K/>k6kg4%g6lgL3oo7YYk'G6JUkSVE<*^:Q!u(:J[pJs7A,g<\r%^g-hl=e2u&bPZ);"Y)4rF%P?[Fo/j*6\2fE$W6t8.58:Be`f7Bae:1VJ[tUb;DX,/MAp`M0d]pMk#B[ql?`A%XuYtE1OeD4c'&ta\r%&hX?B?H*D);pK_s9K;J;&;ob$R#$78MTF`<$(Q#l\-7WIriG7RG0\fLVCUSj!VH/a_Jof7!k">s07A6e8c>:bbR3t`egj>jWcD0p\r%E@6Bs'PLbg&iU;*,)7>i/A0*3][4s]IuS5G81CRBbs^TtEu`SW4B%]b$KDk6iE`hnoW,-A5lOlTlI(AX1K9E,j0H;F%,K%R\Ep@T\r%1F^R4/j"BL7;(^3C7I:<egW:P_9SVSCS-Z.j#C2P2WlRD*#NHl0('t-7.khIV$'bi0.Rj+_d_)j8.?m2\o9QlGdDE8ka)QX\K4?C\r%1FJ_X.i2ee`-D%emdel/>dh@KgoOb*,J3&qXK:4A=WSG`\_t%RdrOp@g[qbWEg7La?;+D&l*cj5NT=h+E"95AU;r,%@d]2nil)-X\r%+=(O[!i:2-/M9.92l&5R0Imre(ETh/.4Z5'.L;.hqs.6F[:a:oon0f?^bQ"_7&eT<ht@,C9&K==<QmUCN8&Zfo"3mV_;X;2OY2`\\r%]3Z/AQ0U3;Lnoo[Q@;uoYiB=?BB;2+-2J4qS;OqtH@Afi4jmQTIt9oHUufbBb(\-Q0W[7a/dL2kP$q+%<\BMS-R:3dQu+r*,\in!\r%hV/oOq<R:7PLe:Xr,sU`e9k`pcgeX15ekC7N4\L<m,s^')0anX%SJBI\kGhlfU5L945Ta<)*-0&2:2_n^S5@%YpMN*h\%0_M)E[P\r%EB`FL9W(.>NPe(qC9c,l$^2&-=$c&/;7_<&nU:1k0r)aJL_pF/3Bn3851QoYK:NigSR>bTB!>3%B,>3bP<[X_#/)!PG/@l]U'*P4\r%Pj+&D44oB5f#cG=_O;ZbFg<:`7?e.F8Se03SY-m^)=59Ql_LJd.YTn8M.%#dM')*&&F6-jiPA:Y11#hYU5Ro<*)=*"Zi%m8-J#W8\r%p&L=Z:-)Dt*KLl^l,2%%rH8(=g);(?E1aV4c'?PYcU[_SKc<!*c33cojlT;E:GA25^Xhr,)Ht!5F$^`)k#@6rO%`;r1:eM)ascpK\r%T9]AV]IL9^W[9fuQMBP'4dkV<N$ArKT.9%Pg&OCJ>K(8@i:XXb_<m"0oZ-A&KDo=-5.TG$d,C7TplosmSeO2A:S,iP34I8WcXa:j\r%CgNljM3P/YhIFDSFod5dU4.KkVLASOi[0e5qOV>R95pRN'K$5&K%JF_;.m!dp8adF,DN-p85Vg3Tio5:GiKCRC0-/o<agWkUQhud\r%Z5HA$i"n*`Kk=N,p^Tc_"Cdo(o'uQ[-eaYt&r:Z?aBeV0-@t^u#NZD=&r:Z?aIc`W3XHMqVLBUj\-ic>q*k)*_OCp(^BjA'\Lo]u\r%WPLXCag6ff6Y#A>`:ou(Z^h]6$SC!KM']^2`OS+fL"D%@-W!8+TnU8&;/Ic#LGkWu-GkNRmQs:+dL75Of>c]t>eagl_cHc1IGO[:\r%d4ZFt+"Kgd>4$n(.RVT:a/>l?0@u?=8UgiC;a8V`HX&s/kA`cPkBQhVX+kqe2:I)RaQ#`+rJ0@#fhGm$O1WG"8t>(#jGqNRdEsW9\r%npU/o*No7H:K^?*9H*D)[]aGpl:37Jgs4u4*?0:bEV-DUf]25;jDjp_P9";SDRFHS3).0+-'-[,Ki*?/np$'5B1Q0EHd;C,BBD#U\r%h/aot4:W?URlrBb4DnIAqL$$pnp""$aWZ__r4[u/g2I*7>5A+*4=T?24,Gh43c-ht_;c[NQhWC+*_4b7[)=?$@:XWtI4_3u9f.-C\r%7LlUEpmp3^H5h;L5$:[8hq`%RPbAV:LYqul&tf.:qChd947#t/Pk`0p-]972UDbIsiY)E>*)r*G*g]A<GH$,P';&P)*B562Usk'^\r%`sIUN3:U^3]p=/XBP:j9V2?`UnVQs=HESGFr6c<3UYQe2q!ljE?!D4G0^tkK[4_[SPp4Xj/Qat9COg%2_JnIUr-/Jq+a?+<%04HU\r%q!eoU"!`9mru0oM5(;;;@`2LT625H00"gGUr:k9/Bo^j@ETebE!9@&Ij3UBi!Q_+qa3e*B3(GS%H"U`cEQf@j_N3FbgsTZ(Yk1iC\r%!.]HOpkjeJ[h<]`N_7^oES+9IhX=pmO.-eM1PV6*O"N`t$Q`Wc\9$Ph_XZZj_G&Vrs%d/ijgZ#Ws0A9rQi.UKqhY\F*^BOY"[=V$\r%qoQd;UT<hgOA!ENUD:cZ+I@[%[lROmH\k;k3-7W;!-0O`EHK2EpV>GOj"P+#',M]/5E6b.PTu('O5o&fODH="dS-'k%4+K45m83n\r%%7N-hEoG(;SbFh9EZG"e1WpGISn]$iS97Rh*e#)C0gC1n$@Wtb.PV1,(riHf2%KLLRMLg7+#hZSkR9R.Zj80&S'&M[K-)K%]h6)$\r%_o,AF)9.1K8&$@=m?#M5W2SDmgT0r#%_;)hSk^K%m?#M5W2O^9Cf]".m)%#S*PtC-"i#u7:1lI*!ZrbPm?#M5W5M<F@5T(BeW46&\r%jANPH,)Bbkj>%a%BY]S8_^P;"+Lf;/=3ngG_b=MbgE@A^h!BqfYT7bP%O(;k#9]@b+.ja/9#6SKn)=M49>Q\Lg<p?OQ\$;Lho-*K\r%Q\$:i1@E#kC/ON]s5f2$$2AL63:m9nV;TBG/Ol:k!rR9Q)I[.Ja)h'+]Q#[=nK<<tC,?;R\KVJqEK+R=##PZ*64BanqdDf^'k0-;\r%2@Gs7cGe#,n6MPLbKG;,3LX9gK<<CbO+27i1Y$;_o!j%_R9L\d!TZY.A'h`ndi0)\IY2at=.b-aGM`5e:ufB18jZLeac]Sa$A"!?\r%7HN0XNf9pP?9!=9qqGP-Km8C\-1o*56<#A5AEe]"$`G<XUdC_C&eYUu'8$#l'n5_L%oOP^;$$PJ@EF^B&/EL&1+]Rc2PS(#G7f@)\r%KHhrh=JNjhm/k6S+DuB>^2>fXs3b4#/Mf\5Mi^YfWGYemVp]ef[$us[Lr[P*T\F$*9]6VpSsoQ)]D?#35Q@1QEY6:.JT5*DMT`Vc\r%%4$\6/Ndn3T:IG4"eql*/j9^S&k1k+P"6:t!qaI#q,+nt-'0O6r=M)Y=.ADBE*;rXM1Q!>"HOaFW\/d"94=,kELL&rU1bgPh4rQC\r%G45D!CS'&,qM2&#;4Cbh+t@!eVO!dj.fj>OBkj>V4DqA:6W6WTq,;G3Rp)33`gNjMhp`"&98^p@#j[A*@qiGI/LO7V1fY@B?4g9X\r%IP&R/Wls;L6<[&$9>`=i_)j,uV%I%\g@'G-/.K(fKqB/Q/.Lb6+$oQHhX-HDddVUdA?duHW^i2fd[8b`[C$iIW\/d"bNU6mV!@M0\r%[B+X.Y#J^+VA;g+'_Xu8AQ1R'.hVLlTT;2KJf/p>948jc"0nMad/&BT6g86SVsAY;6,.df(QJ8WHJ\%%.4SDl/l+^4K/?6'JHr;r\r%pPh=4Qe'LR*0G>*pamJ:\k$/(bPBDZM_8'q$hl1)"*Gj^ZV6u(F.dEhI[96/@LgnIfZu<e-d7.Q&c5]Xk:.tK&,KGP0Z5h@AFDHq\r%s#$!Fn5bOt:^U_21$ucsDCAq;8*rFk:r8+ZE;+2+2mDAhP/tmtii,"=;(`nTcGic@CN=FPGso%iIe8M]ak7M:\kc;u_8V$]]\?BK\r%%':e<T:Z9HbIU1U)2Zn,BrX&_nQ507F',k92OE<(-]HV4OG6!YqVgbMO*;5,jKGP6[=)eQ'>sb]30]Vk-]DG.\f&:Fb+%J157HXJ\r%R.;O`?&K\WZDRjnDZ$IZ-iP)5FS2C=EcC)!=]@Yh,UY[okrQkRirngChBXKJ`W[OUF(URK^H;YmTJ/G?<FNF@S<Ah`K">kO3DSd5\r%k"]q@P-KJLYI<E,Dc3)TQ\3Vmd6,(j"nWN6O"DKi@2qW=<J'Tj^1Y9_^]C?o(u^/*@`*!4&>t<r:8T,Q)re4f?S6&\naA@b`$lm\\r%AbHJk$ZV'6?fTDh`h^]R6hsM"Q&tGPq[9MBo[J291d(o*R?p:8E;-Smj%fI$d:PU-qRRMO7A-Jab#JuYGnPr8(&CL30JYj1D;9to\r%7+1U5,1S[tH/*-*8+((T?.Dl_a%5g/pWuL^p0(YokDsb&OSseqdacgO3UYD=INgeYC`$#@'G\Gj\?Gab=$&B#%CnQALAPGa%fG,G\r%M;^a^BFoDQ3Ksd-77!m1:AX+.L&9!30a34H%cRRVTTrk($A&V:J2ab^'Z<kajTBpg-a$#no4OYo6X63i5FnSX;ZlaG?QK.1DsR..\r%US)1aC,OX3aqfn2gR!PP]:\I[Ab<9\l'Q)WPQnZDaW@(dK1G]]A^BWqQWRKrW).%9H<3iLT1&tC6^'Z',hW9`O&:SV&XVj8WFn]Z\r%;_RUB6k$:WrVZ17&@UpccB)Rt-^?,eJ8OeFqIC,1)OD"C)i4sC*FOf?M^s181K"9jK/6PK!c67%PD`BGp;J9]fOC*[0@l%Ip=Oac\r%\H0-2M""h>!h\p8>Z54R<V=>-1mcRa;G;FWfkfAt`)P\&Yhcp$cp!Jn:IK^bp%J1loYTioM++4H\)E>Qn\Ql+I=fBh)%3Ci1PJVJ\r%@9?'=ls0OL'@MQ59r8'I%#=BK)`'ZAK@(V!IQbnlj>XJgJ])oN[H/*]0Bs.k.),*LC4:@IpC\S!TW)'KP#&PO!lP=mhLd[5*XB^*\r%^jE<-?nl&:Z[!(NSp=jY(`t!b"t`0<QVB$ETMgpq^&la+>5:>@/+`M]8KrSpZ6q>u$2S+.,o<X?D!X=2ghV;Z729'bat:/UK,(QM\r%U/n4kjqfDU8:iAlcp"VlW__ge&nqCRFqf46OHQddA+m!/m#%:uA=]VrfF/Cl)[&a6@V:eDr\;eV8>HP;&"fJ>#0EecN5sEc,Z=Zk\r%gpn%XK1).n6J"Zq$kfNZU/IH?`T.s1rN@<G13BDAUrMJi1F@>Nl(9.>Z;orE+b>M#H3T3_JHTUZljV=,9A_hG:YlCAEQI4a!f1\7\r%&i#tDo&6n7a5hiT'K^q8RQuI1"jS!]4kiR%A!saRUr5Vp13T+Z[Ue+pnbFTjFEC`_CB84G=)dE73?u*-=Fk/@19?eY`fI(98'hu6\r%rDV6F$\,abBmB8-X<TI,\NS1e2>Xk]_HnnqTZs%'$0+P,nBpmuTOYr]7,mtRbf6iPp!/t&J5b.E4`*jsg0gTTB=?Pb:WD'!8^nLI\r%7b0?TK0%EeK44-:,O4b1hGY%EIRG2?ZFlrA`fI(97qbWj05R`5)Ac=jC+^q^;f=>HaF1J9NSL/,gU&b*"LHXq`fI(97o51@N?=Q'\r%ZTtB/gge4@O/Trd^*H`n9KenN*,YV0K5[p6%[Y%[F7`EmKQDEdF(\fQ<k+BLE[EMG$:da7pF`7p9A(f:)_Ue[&03BW^FAk(b7'^]\r%-KN<8RsUZeXD%4BXS0Ieg)P9+V1qY%O,ff[\`$GrhOLI3b<VPlmij\qMOsJl*,TT]>"9$g@RZc]g(N?+P0rE:p.]//'J?WZZS++>\r%b0GD,L.g'\\R,lJ2+XW9$/Aknc`e&o0'.R4]iPbunkrW6PkQq^@YZ=99#&%+'qhn@JKa48r@E>%7"e4h^QbdFVuA[3I9PJI_.pM:\r%gsA-lP9M6fI)Zaia&CKlN`I1DX%%PZ8R2c:bgAY?`iuQ=)#@C>djm:\$MUls<$kc,;YZAP<70Z&UpUZ%?""a*1&WZq>I_PH;GSri\r%M5BRh73Yaf\k"AoM?WdQ\&;2Coes)MBE(#tFI0Uls)6<(mbsrJG48g+llLU*fti"IZ$UFq35BkQZ$VAnD2%V3I>\U3`Jm7W>N?"e\r%rmP%ejYPer/Zrj%j8N:'/OjVrU!)@ga,UH_TDq?&'O$I-ka>GeqaDmoq?!crK)"n.YH,;l0.'_I"jWj:noqY>HX)FXbV^0aj)V,L\r%oIe`1m(cC`3IBBRqjZ-AdB'c!@Uq[#V-b-PE;A#=M,[?<2enB]pb9!e$?#[=7-J[]pUEoq&h=<I5qQ9!DQYT.IuhdPP<$3Zr&q2r\r%l.EX3/pJW4G.AH9>ks/-EpfQtRN'B:=slQ"pNlis<:g+V)U`*^Wh)9->Ba#7D;!OEij)_!Sib/i=2t!)Sm#7<!t#*cH^R\)&#aZ#\r%SPNoX(T;TBrYug<^YWR<X8&[D=2d#:i0p:%\.R<)R,0\)>Nd$UqF:)I\WYjO5[MsrjqriC8uR?F%uk21[AI<*U)eIi28HS+:n(ra\r%dV*dp%u9sD^uag"oq/Z_qUP<5#h=]a\oomD)!2p_9<2_\T@D5EGoToh%?as(rG\muq+r$/`X&JRc0)l[e^Oe_r2Q!s.;.Nn\cIpZ\r%Xs#A4dt$)j:?D!-(kFauTfM7[Y,!trYSInpjs)b(*&8@nc'N]ordK@pmPVc*N_LJC?seE.4k4G-Ygi'P=sTWPB!,Wq`"5oU!D.3%\r%$m#2`d#Zhr#)ENV(gTeejR;84^KH8MYu(:^$O@\?AVe`nh.2u%YnGPs+s]iZPYN3h"-Y/B8n[<s/WS+24]e=L7mN7E5PlT1\mh+%\r%IKJ&AJhDD6#u9bZf*s#l=%neaBk4c!DEeq4_uMr#1ao@db(X&i.`'7aG!$P>aTQ\E@0sN-RnOU<+ce"K0GDkn4&oX6f<hWJ/I3be\r%`to\@l?@[$3b&Y[iejJAj7Sbs:7gl-M=*%UW\=#$RI@#gpK#Cs5//lQac&<:0@F!C^6%<:5CAF%k>U/916Rur<F_^b2tmh:mLm-A\r%:a!P\3!>L'3a"*[!VP(gf^=L)Viua^raG?c1#9q&XU^Eu<tg!3/]-K?q"YS6>(lY1"[3ngL0acCkd</DiD,Nl7h9rXhCP#ea4JTZ\r%J@?bYI]<0Y04n'`hVN\(LitgDbM.Es"3kW&YVR)fnK/E'!bBI)lWS-A7VGPao9/I*pd[94H!!CU9qdX!4'5LfVq:McS%&8uj)=P0\r%eHfrG6NAcXi1dQG6$6841k.Md=1:9'0F>)?>#Tch$oJrBiTt="o7Pf>*sWK@>B%#_$ou_Ck1e/RPm%ghY@)E]V3u2X20TgR\*PA@\r%X8haud(R,AIJ+*tjVOAd(T1d#hnsl2mj^HimQ1CZ0s*ClruS!&s6i)'fO&@LUIlu)aBmU_l_4MT5cug3qKN0:5d$J9=+TcK#aY-%\r%llrpL,&4).Df;49]SK`Sq3\%a]MT+o7IrG-&?<1oHL>cAe5BH+^*KJ`&[bT(2cShS,&4).DbLEK'N&'l>.JI1`:AYY4CJi0<0m:.\r%^1Egj=sc.,m"egpb8VsOPNL\Re%-SJU6`AVX9biB_gr2],=;$Q=IM-X,p8rU+.][*Ft8_fX<L0a;H_k<R6j2@g!#210bJ_Ig8'1!\r%fAdOukIa)-plY/&#$?"!JI`DWU6aNUZ"?GD1iiZ7Zju%Vc$tf]l*bX!ff'L8e\6Jk\#K:XG2*'&=9^jM'\,NuYfWGl@L'(8%&A*7\r%<@sKLBH`?iBhqs`]KgE(Fbt*+1=4cqk2H;4d$qM2Hb+JD^u1D2jn4N7oZ$M"U*=?O5]>9q'c'Y>'tB.DL#lfJgWkbc!772u08UjH\r%Q4!7Rmn+P`>tJRJMqa*TO,Z`LLg$fW%^21g&[cTVC0XLo7:\e<eL@Dp![DHZjh+6'&eIq+j,'DcimWKVI#8g]`lEVhK;eku(giP`\r%6(W+[P7F^mOpB"iB+_@(a=StZFt`q*Ecf<W2iq,G3@5_$_YDgifn^&W=,VdKpnf)I:'S7I5<0X@O.jC@hCikWHta+K&"V3Q>e#SD\r%5)/KaU;hrX0m%&[<']F)U$;2I+ZW>-=DC\MjKNP?'?3O0n[UY>RU:u`0Ks.G5OMo\+O/sgUA>5?hU!9O+ECR9kqKj.Po(&mdP$P5\r%^>.:,H7aXHFcbY@?\g\`2+?R6n#%]$XM"b/ld8:T12(jA&ZTbF:t^t/^Q%<pElH)b)e\a_fLg(V;XH^sLkRF-&+?]6]i-_R<V/TF\r%qY%J37Fe+*T(O^Y2L5D[@q>@dGCqB$??#^0KHlY?L[X;c,GN0=r!^0$O/>UEYpN`(KV@9%DPDVDXgt56oL?8k';l`)Y*(j]EOpsA\r%3NH&h8gV`q+F!ut`FJ_abc[-SV:NB[SF)d2JU,F9MEhTuEjrj9/#VE6F+(h%g=!]Bc_-3F`r"l]WQ\XLPB_;G;9^.fJjJkQhX.TM\r%Mo)WBI\BomC1h<P)0HTKX[pX(&d\9\AhIjrqH4jh+L.]\f['DZqYpD@e>]>RccakHm4Z5:mFX4[-3k'4rGVJr#Oi:E)G9i,WM.8U\r%[>r^41<IP3E?M`ae;P(6MOQu3[Nr>;riG>@0-:_Sp(1/DaS*1K\Sr`kOoia4P#@HJI00:"Z;Qju]KVBCaf:8R^m$*GT/^"J6;!EA\r%:S=%".j`:hnJ.<bTtj7]LP6sa+Y>#)hsDMD$4Bp7Gpu>D[ABgd,ZgTdnPYMe@H"P`>q?=o(+^GQI8Zi'E)726>=slIRbCc_D4RjE\r%o:+HDLC7M1cln&!+uLjlqc*Epi78eZ-X$n+U&2Ls13sj)a/;E*TNk7DF]@C+^5b'<r>t5Fd%+OC3)]o1>30`8Y#W85g!_VCQ??">\r%/YjqXa*M@u'1;V]0gPd'CjD\GJ#Pj^[*H6Po4)tWY#VDj,TTZXh'8)jb#uH\VtR,Xb5o)I<M8T_"2CjpUu9okmkbe]6*$[OroVO-\r%I^?_:*`+?U7M`%)84j'6J&H(:P#?iknJPNL^#i!lKs\WiH[=LsZoILpFqO4XPsIG+<dZQCf<=UE]m"YG_N+g8jh6<4#CUQe?QAg2\r%4R\j#ESnn0hSK(XlEChc8oF(O%&jraHfqogGi][,pC:2OI.AbMpJ+RqdM/(]GAN[PEP6SSl*]>kik0ImfVg:3hE*gF!o/"j]Q`jo\r%ET-#b]QY]L0Og5tfmALgMe?/Ko%s&u[&+"Qn&3Per4DTZGjeop8cZ'h/t>-Qb'SohR%qIXH1)G)MKb!1HP`P1`-LguFcc]&!/"<B\r%n,+dI4="l+]hnGp[JMU$5mm&QH[/=18TD/?W%cT56BPO)Qg'L]j;`!\Y5r2s&^br<dnQ6"N?J&)J'cN&Nc4IhV]8H8^u,9WpC@3=\r%bC(c!La;HF"Xq*[btW<4[I1ErY.K>IeNmI[A:)dq4V$qOm=KLe5VfurSm7ka4R\ieD^iqX#Iut*qbEaW%b:K;qp+chXepOod]]]]\r%aMkh`=3J:DfEOI-EQ8?c,8ouYqm@=`7]WJ]fglAGfgqoL,XiH8NT>iA#2F%DNpc,YZ7Cdmk@]e8Aj\'W`Qq#2QJEj]&C/&5UMpnK\r%a"3;?@!jAU@/>pk!Yl3aTFbN"+qF6^kInfa63pB.%7_QE^F:1WJF>3fi\l90Wj%b_Ytt_pV:ds",#AQL2pP(Ok!pSfVc"F!bq3EW\r%Y-gBu*E,G-(b#_hcb.25IM@AqO3CASk3$RpZCb_A\+u:;])'(XmB\W.%ftOP]YnYODgNA5\NMO.Ip3E-IYs`\`QCQ(nPo@0gCU:6\r%f/n2r.Z(WOcW<;H/Jn*'n%B@p)kg>f?<G95*'EEEAB?l7YG"JVOkJKY9+rQON`m[E1sQ6+S$eiZW]/MGakO=<&bCfhnof-Y9qP;^\r%TtO@>,X(&[;<MhjUYT/pe73.5\gTM=.j\cK\gTLZ`aiZ&%UJY6H!TKAah$PMRlW&E9@bD->En8<B'Zsja;2)u!jcFnl4>D&#[+J'\r%\CT'*Fi%d6'K,Tk%`@?:pgKn1'u%d/SGG0%HUHC7dBIK]b_TM?)a,oG,dn0>A#rkq,AK+JHAaLlQ$Cq>Ulkjr'iG?(E8AIM[Lois\r%r&H"-Y\e@P`G-,c9a&0oZ!)jW<+#r;XB#qO]81uS6T)VdXl@(4h8'CdV7acoDq61-1:%iW)e]O*Z^CH1*M0]NhirjDFrPP\_U=#1\r%[0fL)^m`KD<DK-p!PFr_>%VH[$=_\*N)-9oHsp$e)./G`A9Y9GVi5u/JZb"G296!%+d#Yo.PoM((_t2PC`mi>OIg,/Z1*SPFu8j]\r%Y.I0/3[da+J.M'+[+hq<:qL%!FYbloLi>I!:<u*J?(pWO21]^P7/GuGVPh_N>C,W1XfS32CdYt;md=J2K$N#npn4P@4?ho&.?k0,\r%DZd,-gggGGhM.<NCZ^QB&A&n,%29omnFnj1bQoS!^u5Wb''\/9rC")nDhYYXB'd?'aP\5L2:.o<9bu[M$:$a$2M6d\<32K"JQdc'\r%<"tUi/ATRH5]:1NZ2hYNZ!D*,A-%.^J=HQOCMmbh=2=1;7%2lhi!M^Q.s>gN`t^Qihaf)@:upCAl'l.^\^7l-DGk8G\K0+2Fbjm&\r%ZG9V'Ir:#u[0&T=Z#_uPq1-)O6K`M_nj*jO[mP2L!T-cjF3^?1E@P(!F$"*Qe.,ZG\]FpN>QMSPB-RfREs3E5l!/9kA?Go9@0FpD\r%pp^Au"YDOEDEphV_;*0t6tdAq[kiI2hDCb>]O&cG>Vt$1GQIG&4'K4%aX)Js<hbW@:^;//M0%\\mW[6ET'1@L=lBEoQR;nh^jSW!\r%^lHM[!PH3\9cL1C`^o1g?"^q\E5;]cKb65K6QOgq/ne*,44Jg%cnCON!aKL[Y$o9/Z3(1jE$l#4fqAoB.&t(F*U:EM-p@sIm(gCH\r%k)G;>AI$A'+/N*[/itbkUSq(0fn"\pFN.kLZ3(1jn@V<-AI%XE7?rJJ%L<^:N_7)u#6o@QFY*+)cJm^o$'uYLfDu&="C1Yb4'`1G\r%3s'C_!\W4hYd=+K)-'9aE7of'DY_=@j0Aah44*)O-s`q*"8)@6i3EHu7n!n?S)iiKO38#Lr)uZ*U2ek;CC1Io$+T?d]aG^fm(gDs\r%P:n7lA;C#W:/0At_.<iUG+q0c`/u)*^^fd7M&P'@%d]j89\d]!F^PGrV6H(&lG/FS$67`m%d^t<,6=,O(t_,3N!rs7TW+d/_.<jn\r%eP%W$1gIK<eB4J=l=I&qk^T2IU2ek;VAA%QAXV-&Lssj/hj)&ufn$"9T&LHFb76A:4T)Io\Ep7([#>Dtk\!O]B]4B>_GdpG\R/Ur\r%0kYdWr"%[\[.5k1@TNMHs8!cX\RNWUmJKoXg0(rST:at&[pG!a7GR)V'n2agU0#l:''Vk;D>Pn$ru<9tR:";;M1s7O7j;**X="c^\r%UMY6>hjo;L6g&IG6?i"[Qhd5)m[GN/RX3,&.*Rm95N1H2p@DXen4&5Sbt#B*GaCl6f6V;JI/KadS#L"hPK2Je/d#g4p[,??GrWli\r%a2dbCUT`8/@!CD))ESLKG#`9P0$ZE#Q"W.Y:[j:fga5;P=Ohaf^`2fAg!m-0CJtmkoZ_5/M*t$06at&%,s'R8h;EIL7nCn;Sagb0\r%>u>[X\bn7b3=+.MW]WGQ6=2kb7d9i]\Y(hj)Ge&IdeUFPAJLm[P8]a>X+/*3C<qLbIU_K3CXt7:Zuo7Sj00:=3*#J6*W9u4dkJ$)\r%IqU+"cHEK)0()6=B&;W@(H]#eQ?6R*1HG)^30CHScGLb24F6<)[NI\)gbBO[*hAn^acuT:Wi4BJd(S\5#(to=p"JTabO#&Df8u;^\r%B\1PD>]i`31m?HcnR.HEH*$,eR:.a5<0-k4<#5IYQ,oN>qpPJ#q;+V!dsF%PBdBf^?G:LKWhbnIgrG"``KjZp>>*<==l-*U44nW9\r%Rh1+03`L*D>3)%(b%^HTiU5Fk9B#T\^P-t9NHa=h=7c/>mH&gKPDbWm4o;5N>s[l?@T(cpr]E(?P1c(E\4!Ktk.^Jjr`IXq^ZMQ\\r%NK\290c6X-XBAe4?g2].p+sC"EVDZ\8=Q.T>.lpZr+]2#`D'-GlK-j=L7UHL[W'h(e>jDY<^O2\];B-l5)j:+)^U?kImh`Td$dWl\r%@WeZRc5R/9p!On]@Br+;[RpS]<AQl)\$OOo]DW=&PujI/p"X+%5fs2+rVldsk:r0##P0H;&(];Z;TkQt8rRD.d$`4miKC@SH(rWQ\r%AgR3S:@AF6%5'#Tm8dp=D\h?g*d=>lFUKcqfC$pSM,FXh,LEdN9oiAK&tY?h$SI%q'Ni0hYiq%.<k#lu#"+G%V<>VFHYZu<:9P\W\r%a"V#ad^03?3RB5d0LRY\N35@.]kUnYEjfh(.r3SD?gdp$QA=q2/6[A^oT*oiX7T$U?U)+lXcr/7k2H%RWP-9@Or90KLRq+f*phV4\r%k#\[/q3jr5b2(38ZW,W%lJ:R0^9oo6MdBH8.YpihJ%sc@.(;.KqrN<WY2O`Y6dc@/NsFgn;!jA$?U%m,bYUS/CZ#*cT.9RO429.O\r%3a1#pHeDD</\JO\N\X+b]^V6tWDRZE<:'@J]BqCj'SkgJ\MO)p.[sUXB>1`f:-T0pY;^[Ic=u`X5@%GeJ)meno*(no]<pX?rLIlZ\r%&'-?62a4:21\itJ8f).XR5^Ram`7?/<S'.8Z*ar':oG9KVH"*.ot.8(loS@?<Zrn,8=)-?b12,A58]GkCDE"1JWA:QGE&@tB!H3,\r%FXj8QMOV`,TN0pGm\;Wi<3)+F$@(LJC)-S%\k&so:X"ZZVkh\1/6Jr,AO"/b.O:jBemuU#Kqq[[oID/"'p;Hl<7+kqTN#;)\uVd(\r%[0l0lJb1$WX6cN5]Rla/^Bm886Ss0l+gP.B4dE`3W-@OY/a[_k4JZbXNW)9WcPu+MqF(SAfEE8h6Y.N.2h?#SaTW9=)$ri:'_Tu3\r%k1FOf@'2A!)Jk%Um&PdTc\7?t8j`:b8]QHH,pl5N2to.9DB$^IA3J")\3,H_,bm5j1(k:dT9@"98:WlZ0-u1AO^Q_*ZRH4K2';BF\r%&ubDe+d<+Y7Y7B*;\CWN_V[R*0`AB!^dn`Rh,#L+r/:d69*-d;;X+Qol1U7cHZrY0<3q3uF<RY+cKh@U);`pSrI5?)mu#@3R?n*?\r%<As3@Qe*;0k"\sNo6u"`52t*,aeBaf&?VG5j1-(];rp?6Eh7,dMqAf-.`]\rKBk:V.[PWu+'2#s,1[59HAfc+&^`[.ak)NWgEA>/\r%dpYD6eXqcRoirk;l4L:EM!QC^34`mKLPS*%._K[4hBBc1Qr)W#G)..3*pd,<em5(iMH,g9h*k4IMK%B?;I+N3RG9$U#ll49/s>L_\r%PP?"p?$J7nW9t9]oDUBel!`+"S#"**]1Aq0.O>;T[FAub>48sodp4?H<6I&]Rc8,nG2;8s,u!.VUBJq*7$sMt8p=,o7-Io*=Ef$i\r%fDU_1_Jr!gjsui^MGa\OFEC`_CRApScc-.C6[EXq88^RkJ4N`O["l/[6^I1mWBCr]=mAB8"GVeoQH[:;l1Rs',8-J5X4V>^%V\B3\r%g?kYJj(rB[PZLJncrZh$&6tPmm3/XpOOFm+D%CVDLD2U<H\c07_p'?paqU[8`75iJ\i``7kbC>c2BE>@[E`LTmAs5^hjh'V[cb,(\r%WMelWg7PUlWY-jXDo@=Zl$QJEG_7[ISh$s;YJLkCZ4ZTl_.CdcAXFdIC<niVmS1,EoXa_dJ$o?tAc@2;]j'rJ?8EPO]U66+`op@_\r%n"9(#_ju)")%d(CTK;\KH=c[0`Gt&!^%%K$CUQ%Fk$61)k0;=[r?#t-3@J\2Pp<kRr]6Q15uMf:SNKj""[4=fB+M##0[a9rRBq*X\r%Q)/NpR!Z$1S@u^@S8*>;,RWMi/%0n`@aDBOO@Xb)0c9O,g@H"=i[Z.bXS9FCY+[AZJ86`&Hr55+6H*$!CnApH&0egidL3EabbeIs\r%Gqlb)(IQ@Rmoi3s?gogW@Mjj*hYUdQMmV6Fr5_DUf!YVm#@%D;nr):3.+$%eo8Dn!rjmPYD%5:9=@Je+07(9'f9a38Obd_QfjO<G\r%Dh([6o[`Qa)Ht!5F'J]/o=C#e+`.WAThD_pdI$.!7]C=U&(\pQT3W1X=&ghNhTK;n*DA]BG4+l?OlY8Le3B!Rb>c:E#J1XnX&I<W\r%m>!:ca6j(,*dTO#2H6,jWf(!)]l7ZiqtqY.Hf<B]jstl>$m+S!dD8:YkAY84+*C2uo"g37s%uE@ZY(Eer^TEW3R^bJi.'6*.E=G"\r%!rhr_dUMb)IoQ%^r"``15:ZL?cb53fs&%0n^k`O+s._bADQ9c<p`C7LVl1ftJ!782/gR1kn7jBZr^TEWfpjQ9n3:ZIXfu_=c\DHs\r%d=5ad7p6?!O"(\TOmkRbq@E540_c`t&B4K7-p`K-b5E:m=k6>-A&@/R<:h9^r5.BAS12YoiI=ghNP:<1p`C7LLXn2"n38E!DgI+o\r%gB/[C^u@MB!Vd`OrMQRqiI=i!T9[YE#6%+]s!as5p`C7L#:'Xbn38E!%sN7e_>gIt5<*/ii."_u+0(OD_>hq?oH.Qm'-$k1MZ,up\r%-22[dBfmAWLV<Y4q6X4,Qp\>k\h];j!d$r/W*G&0/ARh;mr0&89*04IU>f=+/dY?OH!,YrHhn/r6Q[,)gO%#1B++<r#?k08p^0PF\r%SFt)R^,B)7V;)2YfX^Qbi3J6DM-9d5Ake]+EI'6TT]I&2m*"ZpLORTP5X;ujU$E='#WV)i()VRPTmY$;+Q.A%GSY[4;<972Bbl7.\r%"bu[$G^1&24LP<L4.!mThILatV'n$!ImKDkQ3%``:hAlI0&XAf8IE\D;3X>uBpN##Qr?023tXVlhFoQZp2b9]4Y"FXQR*Hu@sXSq\r%IO2<%/,r@7$_0PK;WMfP/eT]_O'Q-O'SL"9`seJYf&Xp2\EcV*H#;"ei"<hGD>tIL_Gt^1b"B7JB+cm3<C^u4rd)/IdML,IVsCn,\r%cT%^cFS2b%ZQF*o>k[Y6dl'6[g#j]eaTU$#.bGl14n92AdL:G:k`!p#C2gnr[*7PPD7Zdf.Euf@,DjV3eqmF?6jf::Q=e27Sp]T)\r%F'u(J@'CtJT*&So!jgaKhDqgBj0@gL>^0=>T*&S?6"*!:9N3)LP\/5c/uihj<j%X!+gn!HI*5Z,;Xq)6BB^3e=h3[c*5Y8`P*Keq\r%6$YV@4!-noXB\Y19RKknE38N7>^9J_8m"e"0.XNq(.#1N:F_"8B&s*-JHN>$d1D'N7,k,,!dj.X7i%f,U3&jmBB;0WC$5]CbK<ht\r%"&74LEh+4>mtS"7XBa-LG$;&]XB\2R,[IE#W2^lIokrmc)T+>*aHeI+SkAJE1JfNk+)&-CH9!f4G6:k*XlHSlVH:j^b/Mh*2HSo;\r%X&3s?B*Di-3l_?Aa)aX(VkW%orH_R_l(.:L1+=^ioS]9+.k`DS;$CFJWHL;@hfG$HQ0[ie`PRLF''\5_)@Vh"603BTaQU>)7/FOF\r%_!X5P.*A9C]C%]3m?'gTGMR=2^IY,Y]C%[j>.RC%U!PTd=;.5>2,:"^CSI"OZ^sD1M)EZeX^a(@SQHPr/19N&-<mSLg^28Pp@MO_\r%lCdVq.;JuO*bl[Uf>,ZH"XN&G,idq^E/uXXP*kN:Ka'Un`&diAcE7J;Z\omk"P?Y-==<TA`sd-#.+=`X?<Ku7pJ)L>0af);65iuF\r%EKI)MA^QsQ@\"2jG-DX4WSbjIMA,?p&F0HUi0_>U%'`Q@L%,:-TpIL#PE+0`(XdZTD7pJG7e1782MU+pEV9B?5<6<=0")GA]jlLl\r%OXrP/K*3S^d,ps7?\n+MTEo=XSB4=e#:9#GRZ6s?gf<mVZ=Chh9G"+*+S!RuHa5\hH8i)l7N_H9WSO/;<<B6a,ItJ67[dspj%+Rg\r%*m\poZQ>6rp]Ng4??6M#_eCscrW2jqf0-M3?f(M-Ua/.7Gu'aX>"[e</'VHBMk0Y(l.hEMFjW6.D6[Se?6;n?(;#)HZR>+X>3p^7\r%^:tG5p']b>9?YknmB7WWJf-2'k!;YU"N1_YK\+_nCMD6.n>W_VP(\W7WY?Z==NqCE9n$NGW,,nMIoc41Q]HoX_T'7/4FJ3!`Omin\r%`0g15s2!>8JS*.-IFZeQ?=1WB+P&OqW;1.k5Zr4q&"`u6SHFK,Kes*HIofYm>.=ql4O$8nF2?qT7/!=j8S+7k_E!GSHt_Ik[/Y[%\r%#SWf`iJibY>ZANcLj(R`%S.2m6OSC+UM!qi%kZRj#!O=F5.#8FRcPWtI;$OaIpTm[0<N&1aT/G`\`A6oIb?Js:FF17/X(\-e+?9P\r%RQ5Nhr%#I@?"a903)$,;mcY'M*?@rUA[?d8aZl#ngK+?n-O2Q=E_dXl0$Nmf1R#kM,Ee&lCGP:5'_45^T5dNi?`^=5alArJhqe4J\r%f&Cj<q`rIO8k4Yt4K`q]j7::OYX;m+`u3"Z"+J:YU@NZVp`4!J4iZSDRrY$)hMi0$qor?Fj32KSEHoe(*G:b2m<HoeOiQG6\(Tg4\r%aQ&RYigTo+TDgQN"O-I%&]s'jTQJn,ni14k1T&Vj-]_blWdo3FE:Q!\.n-8_L6K[*)d-A(PEYb5Lt4;94YDdXm`j^U7iiI+=W[^[\r%F!p;<M,02;al@C;0C82?InTf1"T6QpaDqocVWq\@M,,c%cCK;n9RM^c*_5[cBSfMijDj[L8k==:ON2@M>#O@D9-2,(9Y-s0Zod6'\r%:[XDb+G'qpHucD4Hl$l.d;@?bFP=?U(k*I<AhIH2-$.LiV_@+19)Rq\dpN8-/0%WP%mWn+O0]pjKHC^Ym_UsoOn%K3eVlR=pi4q.\r%o)Zq/i5\PD(6VEC"@#(5bom0RDGI"q"gI!\n`+l:`X<oUJfdKYAW1mZenHA`F[M`Z&qqDTk)'MdO(4mo9md8bO"4rF5V<4)cH>@2\r%LEB%DAbPUk,lIH5MKcI=(g`)Z+9+Qgr<0KdmJg`^r@e'4+3K%iM'(p)IYrq'(Rk:j`K-eg^)oTm"[B06kR3:4oqFM#%j73j+3.;<\r%?3%MMr&Ci2=aFJ\nDe29$,M=R_N1JLiWkQ<_2ffe*h!Na7[h.43@l+AN&3of=D0UW)#QAgPl1,P1@X>>LZ+c$MLZcrcA;qLO+Z=F\r%jo?.6pllD@J;SpUn8HZ_U@@3lBdPTK&a50N(jI7pj(O.'5!-`B+#d9EW;SSSdikmiUY$'onDfR!^iTk]j@H^H0)R]R$RZ]SY,G3c\r%#!AbM938"(pq'$`1k(scSK8#bVl12ELKoP3U.2L1Eg[E^[o`df+d^>Oe;1P#0%6NMi>$n,%Cr?nb&C?jj2X=[r-Yq?0)R\NX!?:-\r%\a\X&ZD=i5?H:YF.>$0(+89jjNr?CROn`ppPCkQ(nb@):j%_^c>Z%J+21bPmruT29?/OHY,u7$f_2kAS-$21?b\WO>IdmEZRi,2o\r%pIb%Ds5T)sif+3=@k=BXOMVuO3/_Q/$PK;R8/5Sn($>EXSQ$be;k_DX<DYXireiS=j^kG;>1:Z=Yl&.s"6MG&jLY4NJTfKaNninR\r%$t+J4G`^atNZ-e[;CeiIEF3`@,AK@99c4NX0[2n7<!]T)'fr.BU&#9c<%P#:):#BNi:S-1;#tGf#>6ZnU&sXQdF)UKGX^o1cUnK*\r%DpUfENAi#J+&UuHnL7"_5XYdIYmO'o'SE><lS0TZ66N!(^L,'D$88.5V>,fhDO9)E!rj*]^FQWi>LtOs(7M>JN$:#pQeLidHRaHq\r%n)cN^,f"C%7ZoNkDV+J/Oq0VM/g.O$`^4rg/e1`@#`PO?.$j1$$oMEMSXQ*AAM76_dE/3/:874uDi-ppH:/C&i\H#`;Qf;UqBK]R\r%CbPO)o/o9>+3?%nIj>A580FM`j@n+cDe^`^rtH+Z=@m%EMqa*TO,_8rK*k.Debp#Q!f@/MA&X=^#6KG<iCtnCWl,<h@VBL*.Y"HN\r%IoFOk/6Ghnq3tRU5)_Ie`cP-P;<>&>gnpCfXnK"Vl4l$)%C`=5W!mOFfM/J]BdUJe/Z<)%YVbV[Y,2uIpLUTdglIIY,a)7JjRaPA\r%/.GYuRN?]6/.G[B\P,Qa/.K(fjmFNdASJAbr1Z6?4&qW^W>3H8b21XbP?aWW])5:)WNKoPlQNs-^]-@9$/Am<%#>JpZCo#dS68'6\r%RKr9C15%q3e:&15DbhLc8c:Q1+3Tr=IMQ1:N^-lr5AO5#/aJr`UHn*.Go<UjJ[u7[,TY4Z09hLJT;nJdpsV)Za^XnKTI8"sW#N"6\r%Aa:/P5i%7p/1:CO/PnB85795E3<F=Jp9Q<).Vk\pICo4+Bb&]Xp3XdIRmd,Qs!63VgJC5;AIR97CI<r_"#$=@F;S[>g$T?WU;+/*\r%N\X,MaHHR/Or>'Z9>u@`\_B<c3?-<s.X+@S=(V!^gR0^si_*?t]t$dZ:4"AcC%VFQk.A%?<U_B^Xa^-]dJ8N6WkD\Q5CHQi#@oW/\r%/<kVFE0&)QWU+g=qLfrEE@Y7mPWaX`:+&A*c!Eg(6lWEY3<el<5[2-M.$J!J8JCV#k/!N13"2X^r(0Z]_bfj8m!PmU,rtK*6g4h^\r%+t.5i'7Z$@E+4WK4GPH-$.=9jP+:*9'o$-W:3J!^B&hkVeM-nm:AjZ:kj42`3=&Pc[aSQOEA1#Z%I_@-k;]/XN'#-Q^DoAE!%aZg\r%$C:P:]8"gS[c!J4TO&khd;8$Ght8jJ%dJ*(ff#:SG?:TO>Z&$uS/<K@:=K1J-X8+*LH%_[E#PO'GVHnhKHZ_qJ/*e_i;tORX:V98\r%l*J.]=52ZFB_M&C(Ks<DI(S^8A[4du/nC(m>,S2oaLK^idAE44g2$$;?YV;[3a"+N2]%Mq!]OQofB)(dT79u@H^pso4)l7fG<@X;\r%,#a6LeV9[LWtmu&TuuJ&6]1)L#SO(i'[#D*%\BcM1)JPJ/b:pKND?2Zl@jR)7.A'][gh\XD%aH:p*u`I1^Hb['$>hLd3.qCNQZsA\r%jBNCPEAT9o[I_)82-'`DPn259LaO;lc:[^p"[Q8TEahiV<"K0XIRZXiT\F`Sp:>YNr`nKQj>nuEL>)+erqcG*J8=?YrS`7+ggBFG\r%_A2FbU>FSHY3*-MH+!<lEaJ+?S);gE*RjAIdNFm8Z3M'cTC>F%BZ\Tc]&);Y;-@Ik@Sn8XKb*/%ct/8"rt6N'r!/,kg]Un[U@>-%\r%$Oj7n^%$mmLn0T,<nZM9PBhgWn=.^b4lB(r,^]`9iSk$nY,5hY9F2*2Kq7'k_M:eX8F;<qZ6u_,-EabP`#d`IOZh9;XlKIdgp:CK\r%TqBQ)6^"W%WqleIZV=S0JYt*e_du=JY_Cn1G4fpJNYZ#<Z.#JH*tI-)Dth-!;lQ9F=C9h1\j(\Gd(F<F(ig*m\>P%l-%'l"k0VHH\r%F(.J)YY!'-'dZJFJ90AdB@%%_dc4ZQ81$rEXLner>sph"M>%Q``@]pKoTBEd<?o%j1m-odmjM":iPYtMh?-Gja+Wt;n/cO-+WcT'\r%HHf_0+8RQF@!ldX)k<9d7Iec'R:;%,YOlQTWp$EEC7T28h@IB`@nSGSi)3O7T$8h.729&Sh,KKsU'`MLY@3T0C9SmUE`!",U'd,i\r%W7&?_S&5(m?igZ"0sNN*Bu1"9U5$l7C#AZ!p),.)'t9"*\cWU:kdq+l5pCH(E*$$&$khgunPjpgAroOs82ss-C^/#?8@$M`OX?1*\r%Tdk3iM)9d:=+6Qs":q=hh@(%d^qsT%Vr.A,@WLF&(-@-oKlG*IPDcT%i#*f'U/clm+H\"4m+H,N1J"ZKm:OD@<ab@Gfa2iCj8t-S\r%/r/*E,l2K5;IXZ@5JP8W,glf.WqjPFODH;t8t8WiWaXQIJrr,h1_PMoE)])6\lM/`%m#`+f\qrt^X&&'.P*i_WG'clddr%K,P59[\r%N??ik6IcQD/[^=%_J,XYCj#$E];;usho^CKWM/.,%slsSj't8hr+PAOUuRk'<e2KYa,`^gF?.+HFOA(f8*JpCmMa44TEpS@8ab1t\r%)T%^T2RNJ"h1g*"ef*O_"qMfL2-J`0&U!li6T'ohIRG2?6HVXMp^qXOK4GbT_F@k_@P[U1Y:o29;%B^+04XXpF#fbi#Q-;bj%%VX\r%,M]URCkrrnU(/95WTA`OO/Trd:(jU`nK[>gOeT.@+3!90K,0Xd0'2TITn6h]Q\r[>7i03%a!W6>$:d`tdZMam.3'oCX/3aRWS8r9\r%/m;RsH/VY=?BWNO.K=k&<4'31L4r:Zdi.Y.@mZYP2M]e$.BH[&CFqDKb0_k?_kliOs/3/o-&5.(WIKlc;UNnSppY3s'ChjBh+94j\r%iDOi2^!q##?22!uT)I)DQ5;.gbcha%0'-D(F=5sN9H[U*Yn8+%Gf-@UF'j5pJ#qnt?ZT6HI[3RTi=2-b>M)2M.,2&#F^EpL$/"2o\r%/T^GrOEffmE%0WgP58=+(XDA\JOln#OlU7iV[2G)rWo(;X%hu-m]sXccSF<Q'#UPb-"pm!8IUs&<udd9=Q*.oCE$OWY`>$:I[57b\r%B]2jGmpbG633Uj'WLJ!DorCna^(oMUo*`QTiV!'C\i?X)hj'BYQTO0^/pN:Cmru$K9j+I$&c5k8h(J348+1ZHaI7DlYL`],=tC`P\r%>Yt[!+=n'lD6f<qIX\H3+:-`"'S_3AFMN8#hPSl2RF&VY!S%o>qs"*<X1]8A]S(`1<hMIU4j7/.;*a`s?_^.95JZ-0(neG>/G^B@\r%juOi&P_rXf_!IPp;(AT@&G,^':Z6Y?<\s0U!-P?nb+lFe*`WB#B'q+C2>#Dmh9A13IgJt--@\_9-l#b(T\<<!-l(90W2QFPTHm%$\r%j0o^W8k!k:.eHRf:XUlK;:p6%=r>B*B)"7V\nu*S89B+1Q@7hEkT!$oH)^u!p?i(%=$V't01i,;3n/&ea)t@rY8(=,'dnX'Tt+r1\r%0/MusA?rCa^H?2Eg\K5kYD+!%^kF#A]'b$A2pogHG+5V9C>GMW2:)Ar86Hq,V=&IiJKu5H?dX?Wb^Y>]LX)g38lBEN:#P[c_HZVE\r%870Tng]Fc%L9Kd!jO<f.>Qig9,?S_?^aWs%+4+1!m"\chBQfChW(P<*<kDW_T,tGhoqh+76bS,SZ":i"]@Er(kk'=(/8e8_rao'W\r%;[\Wgla/f%;tqDM<9pTb`VQ#%Gj^>CR`jB5rh9:'Fo'!YZj;'PRJ>t0(pjS$JS4#8a.YqPH=`N?3^.];konisB:[n*V/)NFAhSgp\r%3dW=B1b/<R@I*T^[`&`6Yj8ag[akJ/nt/]p".cmBSCo@cDY\ZtTas3*2V6:L9Q?'8B!Y'k5$b08Z;"i!QtnYDYf:@@57`4*G4]2J\r%T'A$#r*]M]L05o-9QJ*:)?$o7dTQKZh5'6q@rdLSS0sI,;H2%(:HfLm43.@(dn`_78d=,^CDoWa<)%oKDjMb`)L?"ZV(:ZdmG,1<\r%9Y;C33$(8u*5!<k>^5De&NQ0c"jqQVr(X:V-$a_sB3%t]h@>n-P_:J8h@<:1IqFn=9#fWEO,ihMA`E)r`M!FRJnVf&g;COaLUTo<\r%H*9!nG-6:NMRR)ejdtF/@r"e@?j[AB?H.m@YiRchp8*o=>co+>pLTKSgcNR!jN;>QC[:fnY6cV.+3O]j"[c?.X>,CI2(:#p1?Tb%\r%Iurm(H!%MicnA*hXli2`\k;[?Tn4K*]1QB$Wmam]U6#7m>5G(#"hS$25Qj5pDAYrT0J[Q2f7\$h)+XC+qflO+X,HBCB),T%`]En:\r%G!;u0k1\d_hab*_qfq=mIBOes<&>Ll+"iKmN[e/*IBRd=hqWR^h0)8eiu`]W5JeVWe9P.9jI8A?'-GR$.,r71qdZuqikB&?J6=V2\r%;eTtTSX4=40pn9C6>-/j,FI])/9H,G.#NkAb<kA'gS+r%10EbU6R"h#cm\u^":NmLLTc.@'-3En%MW7q'-3Enc?Umb9lsVU3q+Re\r%1=:)Ekea`0Ll%/86>-95*Y[A[]uOC%BV>e\9JN%#\1Dac\jS@%M4lcP1=:eYkjV07`Dp;$d;eO_UGE\17)rl4K@M`?M2obG8*]Va\r%_CT4E(NWaCCl]dLM2obGVl12%FBgj3\ic*KFBfSBfXlrMU>rQ+!Cnl-M2obGV[2SJKQhE\Sk@o5j0I%JbX`um*LGD5)+621DbLp-\r%W%B6^kdW0c8;fnmd;`=Q9TPoe-q(j;#J6`cTb%VJ3]o,B*XWM+<DIB[(((X=6=<<mGUPtq,\L0pJtW_VP8nmMb()e]9QDq17AE-l\r%!b5Sp.Kp.k5XJRY;:/3r!"o?](E$&*!#!/D/4;fJ!f+(b^0i?W!!s5[KSY4H"HX0ATAP>h<:qd?U)=mW&O8Z2WY?jL?pE1^h8lfg\r%H&rR\>Ql#[U'E&G%u3ISp+jI`+or#_pupqRaFHS[lHLFV?4[epTF>g$K?Wj8CU.7R'I&'\E-;r766QE:dkFoX!=BE(6D-9C$n+LD\r%$%YY^ih6o>-Fj7F+ThNK5WFu.Ka;e4S.kt.:l#)a!]VG<TF_-W"&>0r%tt9/cdXVbTb)dXP#E`dKgGp(&=.bW%>>'1+[!DWO\c<Q\r%ekJgd7%g0+.Tg:2`+nS8fj%)*(#KiJE1n.:JfJa6gM/[3Y_Rnd!V]SiF#B2ZG2T2RPTXbWUbZntLY/(`X$]i87;NK[RR:V!SMt`u\r%Y'qpUiX7K8knBBc+#S8!"^20!F:ej+W)#IP_[T\>^bgfPKgPg:f)1F;KbCOaJ>sbZTnM_FoNaup"eF66/b^^lD5]YWo8g.1XT)T*\r%Yp]r*>b@\`M\(RTY"uoM96Q"%Y#!C^S#&pu_rZALf4R+UpgDS5,NnA9`8JFP-ku;H2uZ_J$+_`U'M;2oAB"ihrG!48>%21:/0-K7\r%A\a!iKnXI#-FNc(p'g2^e5jpcs.P6giC5R[=\%r>MN2T"Q1o7"6;f:F%HFKn^ZqRjXg3eJ`OH.U764<^PENYM38I+!;mW-pp(G(:\r%kj)].Pm+0fIuj7t,J.R8)e`D$_@]@3"Xi@TXg4oHTYfc-c#g`eH`1F25PE^VYM.!+4IbQ<U^K_o4P$4r1r5:?E!Mo6<34"XJQdc'\r%<:K=S:p!&^.^4s/Y;s3q@9ha9N&@r&/5iO1P_u25!-XuQM<2^ehhfj';iU1X_nDjj!'@]>[;bRT\8GaWlkmBZi.[@U/;.ebchtLF\r%WIuY/irSK``"f;miWAH``"a]7QiK2Pmi=8q8>u:.hB.XVY[d1ZRHms3JDJb.UPNN,mm:XD"FBOpWJh.f@up[_I"5M$pC<bDj--$Q\r%QC95j?.A\:J!5=igD^sj]i3odTJ:][i4U3G@)q3=_u#bi!-Se&eB];#jh6;H0.+Jp_0^r<R-4s4IIrC8G4egE5n@=7'QLh5&FWo3\r%Vp]efoMkOYUN_0R##rDB>3n/TTVkQZf(AR[^Ek>c45fd+B@?)$`*eCm[OoDcPf$p#c2?efK&(bYa&CJY7jNBKE$DD=da@qI(\$;?\r%%#Da8BNF^F.=k1FHO'0IWI[aqH\\b^\3MC@pC:9/1'<rWhB"\.9])dHC#88aNKJ\CYP1u=e[=eJo`+qj-E)q\n'0bYO5IY5pXuf3\r%Y;+\]?ZT#NRj'DEql%=,o8-Pq5RRZo(PD\'Tq?s;7HOODSosD<re\`'Xh@`T)%b@(R+@?O&d82Jo^FW7rA8trolhF2,BoTXDDkU*\r%f_fQoS*eOZrr)EX^u8nk]K5ncp"TrEhY`)t5o^S*E0eOo0Ms5$G[?]IR>AL7<YPU5(+d,-MoT'B'EWH%K^moNh_YrQ_6,Br0EbPV\r%0g?(t'8:s3lDu"N&e%&K$3@7_1>lkt5+Eh:.6+)]KrZlWCkq>g?u6dNAPPW:Qu#tN$m?VrKja)SB(=.rc:IU;/R)6=q$pJMQ#oaV\r%D-BBY\j)ZWkYWe+]a:K3;<h[5K%YDs&.uo@QH;`%&&HI]U_==k*l@_F;=C#TJ_?;]nh2et*oja%EUs`R4dEa@p9"#CdsRnmpWfcl\r%"rPOFIME+"lW6T5%J5u_:bA>Y//lX4a+C$(lM"-LW1%]ahs"DeShs<(F.a3C**X,YfCR@<+E-kbAaMYHGMIW0<qXa1@LK<#GM;[O\r%c=UG,>\:Ila#dN8.KXh_c#\T9NsF2=gCZ._+c&Xu4Nk00.K-hH(hY<#+0_"PokS9C?NLk]K"21U\QO"s'$O&mapf?H'UTgYb0@W^\r%q1WEPX.?@5A^jGegZkq^^kE/#k:!Cdd0030>H_hM>uWVY-fKIsJpu+f5J#Ol_\*U.Kmr?!$XQNaql?;bC@`1Jf(]X9!UH(>.#0aS\r%f.^m1%pqESO,NR_]"6_N/O-tWG1"IIVY9.U>9@4uX;GXKKBA53-\!+4g)Bfp<0A<+6H+=cY*NRB$u=+sS*MS#,;9>M3\Z)7<_FUb\r%3oRD+fL<S2XV5L@7T%(1MNGq!Uf=FB9JX'$9pV$#D*uH4YZ;nr(!CU[_mUjl7:Y(GrBb9cMScfa-ir>4D.0T:&8YQ[Pmc?$IH*Z%\r%$E=#Umikf5OD5uHNla!H"I+d(0.'StE:GQ6@b[CZLr`c=*LtKtn*lZJ<%46A0ESV=COa*SG=>rnS^F+T-&H3B@:`lpgZ5WobgeJI\r%<K-"Za1c^[2bJp8\'<].&Ai>V5*`i4pjs4&an%D;8c&MJ*j%1Sl3F@/8>[)$,C0)fU?WEObQpq:h"@WR`R5FQ5@(WA/jbmL$bYWD\r%5T;72eu!Jg_-L/%RTG+jG6$Y88]QJH`BGJGTn)nT")M/eO1p?k!)RUo((L+?B.[fTPi/b;F&.M'?N*6[3sk*aE-/E7P^).LR+fJM\r%(7=B(\ANIMhSolgp/j9#ZFk,tF$D[D/5Z@FD@Y5]p3XdIRmb3'#%%*/`UD0a!dH=h<;[5k.q#8/Mpj.$V(s8q2M+sQ.2>;5-O]Eb\r%"Vd5o/ASH,i#^o)$h/3@d!+Fq$h/3@b^,5//ATRH5jukJF$!HokB8gd5Z)%9m4`PaX;uP:F$!o1X6@)7daSc>OZUmi!p=_tnj*jO\r%[mQ;hi):7M[mT`73-DM0k+(b@n[SmYbjCMWGBCh-cg?gkG48GP8J^7I$4p-JArm2k\H37&SSN+uQR`((oXJs(rH8]rB6X<(OO-ak\r%g55K%qQA_tq%B^rY8^$]BLVtS!$lLk06!5[VpoY+LFJpDln-%<Z9oWhL[848aA+\gPSju&&+,V`.h$qhYQOm0a@E&A"a76cP/$/n\r%(G:5;;Dc#d(L-sm:r5\FVuo-F\qh<YTu$sI2'Q@W$SF-V58FitSb<T\.&t(F*U:G#U'_mnTapFVraautm(gDsXXaS8Z3(1jGd^d<\r%/j&GBfDueq"C-+X?jE9O$+T?;^^g8X$+T=e%k+50&dOaDBNt;(I;ud`^qbsf0/d<N`th%d\Eq#uXJf$9fn"\p87Ij7b>-NBdkO@9\r%(2GuFWb'MFXqcr>%WjnmH''R^Ho,6I\ElKH_:qTqLs$8b"dJck4;'8.0X-2cl/H^9!E6UuO";9;*>nRUP_EdUG$n^u<8tc7fn"\p\r%F/N*da:@l7KfrNE\87b7P':Gl3j8]-&dc)7^qbu)$67`m%d`-L(JuD=e:AX(WZ`@K*>mE0s-NpoG+bf<mhZ;?m(h<ZFAiLUCpFj0\r%*\P(=QZ(s!>2r*?cdaVHWPq?UMVHXt8Z_?eN[S.UTW&)T]Fo2:JXq*UQ%I0h1pt-Lab@pp3EjooHeHr^Ftp2/IS\7I]ls#E)A7"-\r%X;qkuUN_.;HKbj.>rZ]mjL'D[PW<d&OPaQ1)ARHh`I>#$gHNLei6^[;G=J3+AQ*C4ba2A8hm2`tF-l6`p.k>1V:G3nQMdhYFj+Oc\r%/hQl#?I(Rsa8$M,ae)QB]:7c2c'q$-7ZGX4_Y.H3:\[d(\$D8k)7Dh+h74bXEPU*beOZ+D50]W0Y'%5PoXpKB8`AXU\+qB10T_#G\r%bYZ9PGON[=52G``ke<&F:>gutoFf@/MnH=-P_*(fLt<jC@d7mJMs_O&'_E$+]q4DWJ2a45s1Wphhg'_eJOeN)5MmQ/=6"5CKACfY\r%F]V%F6ZDDF)45\2Do6WY[W\/;M.GP6RXJ`@],"61=^IbgH$8@sSb2n=?;T6<T!k9'Mf4lS<Fn&F#1P[Y884)erPK"s;#Q%$f(3TM\r%PN37pXS!C%C@e7HBYdj569Y@QKO-rGM>UuRBtcM[P*N@HHf^UAF`COd(4ArLFIC]5dFoWMc9k-jM&@2Sd#Po``U']o]ER8c??[pQ\r%Y%tUiNUlVf'<7s;J&9mAP^X@>d$j<@mV0Xdb9t#;3Je6KJ=NZ(I#"u"$1&,iibOFc9@U$-2?.0*FP8[U6Jf=^+V(B=575^iq#+*:\r%r^`R<QCh<4\glrREq=g06ak[LG7Cr+?@:*u>>&ieA\iGQoLoPC'uuNm+ubtq-`O_7o1ShqD]cKQkNg7FYD:Y3rr2^WooE[)M.1)/\r%f+1embps'oEN-$Nb'P#@A2`1CAr1n\gFF*KAIY3jDdBd1G"ie7ACNMPq]!%&B^`00IPf7"7nj,/*lHIXl[<ufICGc[FE1;5oCjp"\r%.T/$_m:jr%js]u21Yg>=\!&"2@eHMQa@WJW7gpG7HVC;E[Mh_^$V,#ZZ0U$MfZ7t`WN/=jh/]5HL1S%W9t%Z0T\H^FeDGL3aJ"Cb\r%o[YHem/0J&!N[n6.l$g`:,Xedbq/,GE[b^\H$Bp%Zm?ZY%%Dsr4OI]P[VIH%fs;^3F#?r*>-/+8!Y(IPk$`ag.o$;MmHpTPF,g[]\r%YdFpeHHjuWb?-1+Cc3d=K44*=Upe7jb4>Ld<d@p84Mg:<5V'odc>7^BV@Cn&c#&rr/bD=6=`f#XRH8lTI8KaTD2*.4CFpkgWQ&g"\r%ICmp$=3J8nY4bm=-$*+>M^JtBgAI(I]X=B'NaT;AJ$4\&_=o+@gMHi+I+*YW$;OC;*!Z,[_8u<a?;uRG_BU/IT6[:`8'eC5:Jp'X\r%f"(P@n5"Or]%JKFRAF'r4o:WL/\?JAHa`C,(OdlVDZ1;V-M1LX&&9U-<;;negijgG94(eZ'do3O1%Zfr':I%UIItSI.=ea+'$8Hq\r%oNU6/l5niTO]X3'%u?p?^Nu67_m2/sGPSq.V$jYhgf(a&cmi.(TEVa:kpdFH/u!+rs1qC26;f9kTq,Ji'T^,=$;%4IhbpOV5um;N\r%5+kmEA;WXS')\W(;Xok@"DJU6;M"dWZ!)jW<'\2$[0ess0sh9>^J_.6+Xn/5_?e^B_WJeIVkbSM5C&Jc8G5tMX[5o8mTbo'X[;DV\r%$IpUOV.($'ibFaNY#Z\p'm*^aCDHK\>Dp%i9Wt:j#/.Z4PpWs`lKQ'>e1/c:"7&[lJb2OJTVthlP(2+f0#G75Y`iBcfT-8W58la2\r%6(q#sruQm?+JI>+[AI;JDm)qo@B/,n&.%"RID&Oq9c067RRp*/3[0EC?mk*(1J"F92(`m:fWo+N]NqEB3m6as4k3XbnhUoK8M1KF\r%!^@n1ehLK'!^@n14=%j\*^WHVB-]a:1bU/+T98&*4]<a8SaYmRPNH9?FjHm0n1t[kQ(O4)AL*WL!mPQYY.:lX]B+A-TRqUj>3OgL\r%^HNk[G2fk8d</U*3$!?NHC"<n]*dkb]7m]I-uZl%2rFWVV!S-M4PA@oC#4'?M<qY9\Va(G,Acl`R<"tpUJp8VR<%4_[&A"l0O^@2\r%l4L:EL_M^AO%@$1In;D;LeJW$]QQHial3m\Xr\0jLBtu@d<e9_*MQrY'OQoW[6k(rjfrpZCPe`P1h2Pa7ZWA56Y-"#"mR^<3MZr4\r%?%`\b$%Ebb\k@/)-bHo@7Q3Wobko/3Uc5&9ABjWNe6O?M"oFUomaCsc5q>0G\^2e:X7p5N[3RPt>ZJD1''aWV/tp23[d9al6m5!o\r%Wun*,`7cA$^EocF>!h+'>n]&%)0PETgQ>oo/H4SV<@WLuFc^[B7fn8MApGk=AXLaoV!E>JM7#LbeJqK:@!a:QZdad%$k*luRR;$V\r%FC"[&#jn>Mk"nT:X.j?]ogD0ZD,b_WVl2r96X7kZZVl\-*o^oE5mDP/p(1;H8>0rLnLSIHnE,haWP[1,@V?5tdMjj)7!a&pW2PR>\r%W-"KL2@X=Vgl8iW<a##oOVWk:Y_muj9;s:\iS-jdEHPGQC3addGMuQ;%<Yl:o`%W:YDURHR?n)t<GqX*k"\sd5i=icd\0P+k)c0J\r%h:/"\GMr1ogb+kd1A7[o-Ls-b1XG<uMZ?LKSU$*3h*k4IkdiJ5XuO]hB1J(YGCaI;SUV+VVJJd[]`*u$Lsu`oU/P%V#8P;_\'GnN\r%Zo>tWqn$+kkNi@uY@1,o^ffa'k<Vk;"S'I0?XekqpVQ:rM[8hfpukP69+YH]1**JN1;m6ZHC8\^iSl@a2OhuEiSl@1]hiPp6[T&@\r%?C2-:YNa"c0,CnY`R+0ReCijI!,e9c35\SNlK$/BqI)4I9A?D$s'9"QL/MV;=2YM7_(JugEAjRl4Q"^O_aH.g)!Y<q5B5C*i16nX\r%bsI&\-:O<pWM"`HqUViJ`s!'2nDepm%PPr7G@;b`(XO))n3!67g$N]$=k'BaRJ`Nimb;e=\Y:1..*WCZj4r,/EDsJ44fa*[d-'1?\r%OrsR*7agK1\X\$*dL>aC"ZZ7nV&;=(6C`B*C"C;2'5P(4*W?k'9$4]b7)8i$;c;72-jos?VG0WJD(,nm8"GeuYDXOu+*C0_o3k&'\r%s8I9qk!T/7FWh1m7n*G,W^->$(&\AD"_$mbC7EhVP6Jf&W/W[o,Zdt?*u4aPW6FbGbO<,j3;eiK9B1-N7DSr%kWeO=21Ln9>%9(_\r%5klFkeGP7t.6dZj.M,iS[fH1F(&jo*ZZk0a#AM%kJlmU/WAsQ4mK?ZSVpKpdObLXOW-Bk4&.+!h;*-29[M/oFUS@d]0.%,,7n*HO\r%GGR:o+8&453kPN@?r<OgB)!G_rF^.@"i:5;kWbHq&dJB2UAn'?-P$,G7K9(E73)5dMZ*]:PVDkS(&`p^/OdMUW9?I(&g.DXa-Oj^\r%&,u<gJK@o&?u0K&r&RD[o\Oa8rEX.d&m9bQW"_ojbSlf$Lr]YiC,'ub^pJaRK,TK_!h@unO-O?nmu9j/*YS$[gEc3u\I0ciHj-;^\r%0Hj$I92@`lLbEh\bEmbFP?rLVL+9q"YJk$HJYRRljiM.#%'q$Z+4JK>Ootop]%*K>^jG]QhK7cX!V+(/W&,XTFQ8`iJ[tVm[]`KF\r%BTL>8MP7gla5Psa_,P$(5R!HcR7e0[1oj/H@'9Jqf0u,0j*%@j;IH[,ZIWPp$I"Jjh&*a]$@42X.`IqCq-@8BTYT@-B<*]JCS(l3\r%@'9LG3U_D#L0hlo"/fNk3BS;UI0aEW5"ro0AOU-Kb6Z.rY7"8gma#Y9C$2Q,G.I`,*-VB-:i#=ldatCZe.5/:X?^]4]on%kXE%Br\r%E@8Y8"i_\hJk+lU+O.RTl9LhQWl_W\d*CNuNGI!;-CQctNs@.ko8"Z+(>_tO!+!-Vh#m5gg/O\>Qo).UCh.M<?"o&M07p_#k[C>`\r%JLSg2i,Q&CPq^#i4"GN>)rn#)7?').`]=8-X6%PcYh8bMSeX^)Wm=%Ij_@+NcnpV03_bL]:bmI'*bL+jXB\]=p^\]8/([BJ'BnC"\r%3VZteT'G:H>[A51Pm_sVP(uhL<\DV18H:1B8hKX[.F"kAkZPI>1J1&Og;f^6a0mWO.i15kZDNahTkJUo,H<?XXB\HL&>6JK[?e['\r%N/s0fX*E'5j^mQ53n[-KQ'[aDb[J!L+=erYI2=7_='epF81G;LlK_G5[:a:oon0f?36R7PS!PO/6Cpg,(&V(U4`-/4HFNIW&sefp\r%?DD,o_TEt:W]).Q\"KR)ei2s*fk_1"bHPg;fibl%,Ee&lr8d)eP-]2t(@1cjmIs.i*WKF.b0#G6atQ_IR&jPj1EllN:<gr#gefRR\r%='eo[Gi>$pikoTmi?2"`SG(gb:uutDd^n/(heo9^RSVo1\Zj2%@F;W_]0d3Bgi^rZFcf*1G@saB$8teZ'5O>+U;k;s@SLs]GtF,S\r%SQHPr?lp_AV@un&;uan-T52\[U8.Ec81Fn9Yuj&#WY\4E8-!R5.V]rXDD^fs.02;$kZC7^G%-8M''SZhM03j0>p7$Z1T)F/`B"U[\r%9DO11(h0&_SLh6!ipViEig@t/^1,1F&Km=?$8tY`'18jbbNk'+m)0J$K\#4o_+kED:1dQa<j35ded5[&9<O?$b']03Ugs)F@5h/7\r%A0_h(>=+,k`7&2D[%]VG=Sm&&3J0Dj?KnZZ=4Pk%8V$]N"`:DYNdX[6a",r^JUs[UFRS[_nGJH+oP5IsXe@$l1Im$j=<9mPb_0W3\r%Kq.pKF?B>a;<ict.q;Hur[oNJY6n!fWl\"K:4/Ko,3a?^oD\dB47g/(Ogg6U5qW3r-iu^JOaZ+!GAXg4?Vt$EQhu9uW<A@uPu*`F\r%p!!?jrb"DNdqsc>F`Pe!4Y2Rg7J&B1!$L(":8%\Iml/TXG.'*eO$Eg,^*dm#AMl[)I8?&#YCsnC>FHujCZCVr]:0hG,Ksq=P)C6`\r%S(sJ-,BcJj%au>K7I4&b563?U*D)4(kP`d@\/RR:>_3>8To@qCCnWb5V!Y3$pTM&['s')Dj=,d*eO^KCiQ>mA@ABbrBsZO>KJ0C&\r%7+'BHU:7<J#SSqq9hjc#JDLib'$,1b)TQ%=IguaeQf+&mXE-WlS_\"G"&8p&bQ5O=Fo.H?F(kQV1!*an0FJ9W'H5>LB'7Of:0mD9\r%U%tV569-8AW.9Aa1W#ADo1u(=jKL&S-&-X&P=+q;U#?kq!BE":'Ntd.ROa0UT0hT-/:;MP;^o)Wb3sgF^Ea0b7f'iE<Vp.N09tja\r%'dHm3FWbajnB`gY-YR4$W$8J[s+VM^c:T-Ze<u?B6dMAeDQ($9ZO;"M$lEjR#Q;%2T&od=-09XnH(8<$[-]:lh9e5?>5H3T\r/2T\r%+00;P;paOM>;[[.0$C?WEKei;jlhLEO5gtV`?(@9*quJTgW*P!H$nUPF(ESk'5+I;"+Tld24b\-GDZnir/!51/W2-#`_RWt2mHQN\r%!(l6koR*(2a5bUhj5WleT(sK-ko]Nm6HoH8-]b%[,,Cd\T009T,QggHH(;!j3@oG\;8ookqNJt9ZOk[^Pk-_jXJrSRmBll^4/21D\r%&p^!oZ9Ait%d3]4`i%UnLeD^^h/**["T7\KqCb_bTBohn^I;2`PKu9m$@*WhrG[R!(@nuph\[Vp4:X0[,2-c0alADWMMT9Mq.r'>\r%IpUT[gPjBT'ArRqpH>48P).+*qtL3004*-@g9"f0Y<09%pt>_p>uk14mhpB$7gsio#33uNCqtuOG;/FdDp\YOmbg'4%Z-)P+Tjt.\r%T4cq>nDiYN@;2VKK-)0_<Pl2nqW#WDRHt->9>Q[aeO9b)L_W.7O,FZ:/d4HLCOR(M>RGr8?LnDi2e&=9K'/%"5V<4)Nn2=g`"s5=\r%>Yte-\J4tOU[OI2=NA\"F"t7S5A6G3-1jTs4hTi3](EMF`\>!bTBR)E+9*GJITlX'rUdSrktcIeM<Wf,mX>e/*tQ`s'EC@X^5Epq\r%/d4JBW#Y?]_"_n/q>p&:*;FMq>hf=".JRnWM=kOh$@WuOOO1V57,l7<TBo@.&:konpLN0!-o'-Y8?I?s:h$5g\K5ep25T6OU!Z-l\r%4;D_%$8NmVGq,N_EHhR-DLdTJ5E6c@E!'&Jj&>/*(4uMSn'b_u!4`gA3#m?2#+cZ8"O)b7!9@&IisqE2afGi(+,AXj/:T66I[m28\r%1<0m`8QoO3*DUk>4L%7kr4&I*N#crL*(nT1+[bH)G%td38kC:WS7JNR`t#XHLZX"95jXSJ+f_IA@u"<__b%H[DsWQ9FJu,=@u"<_\r%6Ug*)oEGZ)R4G+JI'm)Spk/dq&3C;\+,AP75d<[/r4!@rG/tCZ$uf2N^lQD+iW>37_2l2GG949`d.hURST&I$!.GoP\-kPS"[Dun\r%A)-n=a!]2]^N,%Tpi4(:Vi^]D'\He\oT,oe?f&:@hDiV!$cf5#n!4!/Za_t0AqJ*n<$>kD92YXZ'k0-;MX!R/E#fqLc<Zn#"\7IX\r%Z*jDEd9c\s;+fEK*d5i>N+5YXT[bPB%lK@^!N[n9:ufP^Tt)3_23)$(j2huJ2=:Yi$:%Scd'Np".OJJbc\lI46j;;Dq<)#f6j4i9\r%4<PBT5Pu4i@f07mRWKE+8dCV6*/FqXV8h*ub\tiW1FtRAL^H6r8;C.M6r]Q<F=O(Q+JJoulTH@*!YH/L-!?<:W7GX8WS@)f]0%+j\r%i=:7o;Yogl\K(H(1RYN\;7F_i<P"3`G(%(.o'rF9?+4$tc$ehnrLp<bIEe$j4E6`Yjs>o>^c3g#io5-TJtu5K@Bo=W,`4]\+NdmI\r%r6o%#;,F\lgE%l%,*`19XI^JTS&snlZ2F^WQ'^gje_EUU08Uk],]J-L;cMK,c+d8Fhp_^gO1/-@1::kZ;Z!\<]\.T-nMTcRCAe_o\r%i:_Ym$>@2R2eUtn!mS"5KV->UXh+G-(:^(^Mk(\Y/SinWeZ-f2C5q+SLLY&B1:;W;)iUW0@qq^f\29KU'MFZB^82g8LARHLpIu8n\r%K;m*@1eYacXQ-`?C8]NT-PT4kroe$V8RlJeVNs6).YjkZnrffR1i-_?,'1_3C-bHd(/)P'[1nn@<L;Um!ie^T;hW'<R[kJ\@VL(S\r%>)FejV#`5>$>A*$3@+]=dEM=mpj-q?FpT8W]%bg,QirGXj5F[B`N+;s!F"c/7eIlf+4/?NoD?ac\h0^]au*t]MSmcW^P1rd"l(<P\r%cN:ke)_\#=Qd4=oKt7<`/>QWt$?ZII=Uo<[9;-5g5KeFic!71dd*I;XNo79/<^05S.?;t7$ul_#ah.58J&rrP4B#l28oWr(:A\NY\r%PX(-1V>Z\*84*^L_&kb:qlYLHP8nrd]1X>*s,#q,d#)l6!1Gg311+8KGHD+W>/_:bDJSQ[L^r8('c]7O_Rhf/?YC_urVXmT51Ua#\r%aG?q[EMO@Uqh@<4l<GT`'J,?j`HQ?#8*_!__k/[\j(6jh#(PE'`'1<D$/WN&Z#JJ;S(6O%NYO(\S2_BGL7uieID.$U^E0:Al7`n`\r%%XFP6keg6XC%(D.Z@"C0-7AfU29^tuO6:KV38s=82`WIm0f1o\pGe:g_r/Oghdd>QA)'dRr:1CXJ8dD,n^@j@<oZO&[i%n8r&mf(\r%D2aNoX%bSCldR<Z7IRQse:69=%).>^C)m*X]nZeGi%U69JQ@BI[`'WP=I0[8RTUq3XpV*+'l/L:B%sVX3-eRbD9`sg>%79-8ZQe;\r%FGJhXE"^O6NB*-cqnd[r/Kip`j"HYAkcnrM?nq'hVGQA90e\/Id@3Fr37feof=U:`f6IlW!\OCV."OWS:NIc-69f5W#3P+>,Z+^$\r%,*bP.=l2l3k2RaNG&pWu,`5m7>IE:Af)E4HeU#>][#)uROZDjZ8q%sEZYUI%8JH,ds*%$Kp3TFB'#ip<PGXYi<gVZ"o[HQHBE:5.\r%Q]48H6HBm1"i7JGBrFs4qAr-B[H2'I\oi$F0T(X.,s@4M+2tPp$+;8=3&sY=isC\(Jc!I)8ZrnQ<qqrDPG9O\P>7%qiHoU,dO;7H\r%*^%Dd8u&+>\TRm"hW19P;]=a]3"/YHE-]*,OaCSHU3K_RfL3h%&cjjE;7oJun8oMn.uJPO?-Re?\Y=>+l5@U:7.J?:ar85da+_,Y\r%8t]hUdhal'M?c5N]4ie5ah/H\?PL6l5^SI%08_uO#BrhgL<K4Pgrq,NV.G><.Ko#`p5e4L*olXGifE(nkh-r(;>_aZ,eA9uUA1L.\r%TIX[K72aYSY>1H5*kYM26Vdi9Xc/ghY\M?gCG@\@\>]<i<ac94%3dq'6AIN.Es^9JU?ZB`cZt>Dr'm1>ItXGC6BBb.s61o?(ijX:\r%etB)[l(!C(mPMu#F8F#4*iL@0/Q1CKpKcR.XYAIWR,FQSG-NYE_%lugVk<<cc85F;==D#:$mfoiW>J4((,mJ[]unp@A,6Ll@/99`\r%PORh7ZQ$PeEk0T[7B^b/ZWSdgT!r\E!`h'9"\gX+TG^u8m4IP,Z43teIO_Y5Zr$<M\1%&OC_FnfiG!32Fd?oamEl?FJ.kP=mTMN$\r%Mr!61SN_!>#H.O*g07=hU!qrr]su3Mqd[%CcoFQ6>i_a@1q3V@>Oq$"n/?4WK#heJ3UJE*;d&Lia`F*!i!Lk:-r-KBF<7^$F0:`o\r%Qi)*^>M-3D=i]WEH%IstZe/L5)MZf#o!5akOHi:^&$.`hErnH:4",.T)=Yj*:347ZO7QUBVq[S$/u2i*H.BH9Fh.91/pd+jC?%Ll\r%QG35W8;X%@Yfp1')LS8ui/q3On^WhZU#G"m4!`DXX`'9,-=e=sZ!?psq2O8\H1Cf;1r%eJJ"mb4]rM=MF_YIF7-gX<Q*$Y/>H"[_\r%\KkgN=\B/6W^us[qYlITSm/"-:JpL2dMo;`hFi02iOs**WKB`P,'gT1M%QnFHLn1trpp7O>'3c=b\eeVYK]?rJ@!W1r;CW5<Er_&\r%'tR]uSQ>;"Xme>_F^!$Pk0/fcjD@Ug8V>33>8,P#L#4:^SQ;hO<qQT!l?Dgj(IQbC.k9XS=JODioG7u\"/C4uBdKt18o\rVa_S88\r%Srn#j'iVUs:nnb!5`@e,.#h8SBZFZ,0Qu1Z6h?e[JJU<@UdlNdDOR2lq@,WV&OKK%DEN'Yd/4SXo&,_)[O`2_+&$`H(jlC?^1u-p\r%JCH&kn7g\%,'WN*Hk.kdbn#4=.aLmT8;e@5_B3&,5I]jm-`gGb<V#&]r`kP;Pre\nG<(!;b8kuIU&jgp;?rhul2n,rKG%_QQs(Iu\r%d3ZY_Mh@5e1'aH@fFp:u;?ia+9B@^d$L36*.p:^^N,sE!98(>#_Da1p!KLpirKq5SnC%\uWZ0?Dc]YP0R%*sddn`spL2,uG-$>L2\r%P3]C63>.4i>>:QYjZ38RFGjJS:Nt-=P2<3&9KQG$las.DohuC^PnD$^qE+YolY$0;dncV1O]Zu!4VGB>qhQeo``=<W\#Gifm,Rg\\r%r4`X7[h8P'&aO7t(I-UCK*#5Zd*_UT\J!A3A[Q&pp07c;\XF)Xm)aRQ&.6'KnP`+.KL3<ee"WIs(&e%*nhR9^)ja_'*XG9,YalhG\r%(J*ffK0k8V;+SH.r6H4/PksHt*0rVtqn?onU=:(8Z2MTWYnq*qQYTc$`Xir8e#?#d7"U3(Yf?oQ"5)`3Z08mF[9Tl_3e%+^J:[-)\r%qX1q\6OSM#/q-(c!W(SFO%[:4#f@PpHnhTf>^X[<kR\Q<+]nFM(Od51$mK#EMr3Rc;&5`U(Ve!*As04a('!lr_E4aHBYMiHLgBk,\r%UJoglgQ?S*I:%6afOp%doUUrUb4XS/4gqShl&DJ$9YBpO++ZU3oF7s1^S&(cY:l1pdV'</^VDtS^jiM]s*X_RJ"!4%@ot&%._B_&\r%?(Li;IU-]FLPHc\4.i'gFm47t:i@/tGJOA\Y_#B&B`"I#a*Jc9iGOq.(OG;5B<=\S'm5GAm=?$oDim*ZAb7n.$+*k;.X`q_?A'6!\r%g[u`6IcZPYlEG'R%hH.3R%$mfo!>LlC?\`Fp'YRhmccD(W[g%]][L6cZX5t7@[d:2ijSrY<5:4*a.!E\4RmQ\s$8-mpLX=4GJMe]\r%Isf$-4(O66+.X)*OPtrLkc[fb^;dG/p[=RA-Q\*/R^13n9+fjj^MGL9X<#%=c9H%59j\s<1L)NGZjpHs]G)>%(D.f!]U[W=X_uLn\r%*thoJ-=>-_V9nlZ%USQX0/^<ESs&46KSPmmk,%cWXlVn-jdpe7h96KE?LDNMJ:<n@0f?NGLNeXW?LBg,L%!,M=5Gd+7Ss?+b<:7l\r%73oP$F'd"8F!Z.jKb0:l+%?gSgiHe:U;TL9b<>$bK"5g4o26RnFZ-nfJM(j\*B3A2.J)B*+F(FE\m/+?lX@Q*?,+/?U)VNC26q`@\r%+78j^PhK_M]@gJ-TRTp^m_``77])onhcS0T=e8FH7U,(sm>fUOJiSftNpciE"S9W)Ic*RI5>=*0fP[[L8%],a\A%V):kq9[d<O\X\r%"EV"'deMop=\KLQ1&RlC?ed:";Zu\iYAH+jUCF.YcHup[1k%G1m_fa^C&E#<,RPibe+i$^l@7$seFGZT)8m*1BhAOl.p3/?+_uAD\r%]qXKlk&CaCgu0Lc,+-jSjjnd-JHU%_<&3Y2KptSc<.ZL'"S7Fo%&0LMQs`\LQ]I>9iX"['IQ;"^M\#@jQd>I&+umXka%NFIfB6mT\r%VO,4tbDZ2oie)WPZ>`*FH(e;]l`gu4F]i+6O0;Ja:b=>*0+rka!?6*sF^$k0AOQh!r1+Es5s?L42jkQq7PL_\;ai[^S>K';5-hC8\r%*tdO#G=t4)F2(o8!*o[-C3d^(Pq9>U0ZiE+k*8if474!V^mGM0jgC+ALb5p^nfl%#"(P*Epb3:ZI#sDFnL:K&+<M3U6cVV"`r)I(\r%!e/unEpk.a)a/[?(0\7B,Z`WDN@\(:DBb#-qcE9b\+'D5"(Ee)R1X%M7DR>XF&JAC>S.NO0u!?!_%h'.7JH5.(oecLWZ]h@@Ao&#\r%WA7W'p/';BhFaBZe(XW1gA&'uQKpBnhcH\ECL4>RVQ?uAA[9h\>ct?P[IT`'QPW`2c;Af2hr?In8pi8Ce:EuI5".6pgq%;#5n'Xm\r%?S?:%D<d)-dG8U,dm!VDo>B<mGgk)-#J"fF2O9\=YgW"#]2#Ifk\bqEqo38`-^*-L./<4Q1>XB;l2(B`p&mQO&)/fKCT7@0G2KhM\r%I\VV9o1.M`#<@'=%38+WpK+]a`>l&n2W<LVZkc'c8CVQ21)XAZ+p__%$"OX$5m*-biM![I:Xs^"9&EpX(6!R=dDr3q/cK!*(t$U7\r%1;AtQ:HX`h`MI,7[4c#8a^oQSQmr`rJ/51a1)eM&@4)ElLt6'r`UqBu8jK-ShC21:%SWp=ZM4`c#/nV9-EAYF5?qK&'jlXd_JR%R\r%`"uS[/loAd/_OdXY:=S2(NBsBn&`Db=8,BY.Ua(Zcc+dU04I?T4!R0MV$F7_8El[oBfF/>!NN75Y?YGLUJmh_6d.3A_gRXC961hC\r%NLuKcFZXnaq>i5@S:8k4D^/Q\^']>FAnk;umDHE]N(3*H&%).,i6DGXG[3D0V[(i:/O.#Sq\G%U@Cub;f"1nu8<p<$[@;!.$T5c$\r%8<n$%oZPM(!W#faMLNr[*pU#klKV?acqgWl1Vs/)%&hYiPm\cQ:oTlK0s>(.(i\H[m1BN3+Rg-[QC8oRU6bYg/_9>#gAT<G[;aR9\r%0?g,R0OF\#]+DrnR(ji2TC>li73++L^;A43:HWokNK+USa\F_,,eR?.P:18_rp;Ym@[.?1j-B]XPk5(d111:5W\5o*OFe4K&6M53\r%bOPZA/r&T7g+p3^2Xu<f]],Em\pM$3qTiFNmGr;8d!rLk\#RJlL/jXY^VjG8;`E\"K)SD`71`bOIn>ZIH0B?94gqsLW&uS$0+\*<\r%Pr[)$ShB4kGGPS>$i81T5uL.O]n[mg!uF_Jg_F!AZ-`^g&BrgX8XLcOm`GZ2S8H`8WM8rB0T?=blV$G>ai0gX":n5Pd#ZC0GP*I]\r%RCc?rg>l7=eD+&.99"rRg5;o>onSLeb$T6;;^S]$b[&ob9,9:?bA6E7`1<bgj,*8J95(ZNQ$?;)7)/o)U8M*0Y_2e(froNU\,5D=\r%c)e<!PE"/LHhES7M'?-O1uX/)m4&\QKT+pQ-JD,7V`NleFYXM!QY&EcUhpY9fQ`<Rp0cWg\+E<<hZZ#AE9A<9YdZQu`5B2FSU^Qe\r%bT8n#\')23X0j8lC%k$\kMGtep"uiT;uV'U<_OV-)_]7n%<b`0?F^b.[FPW]NXAhH>BApg*bPKLEs$j;?4ni`G0MuAGhHn6*5t^>\r%8s*Z?)#iW&LuM_,rRGBW?7k;!36EN5*#S7l@%B=7>m,ko1EbNh2)OBbL3Q47+mhP-Rs3%POEUoI41^KpQ!j`a&Q\f5A/)!u/BnTK\r%B0a+NZ9&-I0@4p*/&SRsZcMt5A=*n&>;Z<\T#af@(`$OnO3*YqpmAqbRoC9F5\oGD@6TKkQpqSmH)DnDcfS9Wle6Unh;qO3&T<#.\r%=)1OYK5BXQ]Z4r#-2%&1Pn[4kUgMU-j]YJ?Kfb5ZOQASrn,=^C7HG]+B7T,G:Ck%]jHMPX8e%R3,9<TY/i&+2;H,<tHdF@mZkcPe\r%(Ujbe4a*91J.\(nVTk4V.W(p7qK^4jD>@s!]1kJZg@Ej!OR<[R[f!NKG2<=_hAPd!LKiC8KDV#=,E/kC^u#qoHM@0Id!$)]I/3YG\r%QoH\5q==9n^jQk^HM?U8O6;Z/LD&F*`''WH&3tR9B+"d!5Qp?-T.L>NIj.GPr]ruQ_]+%ib[\@bn:2?aH,4#`YQ;"uPLG9LJ/I<n\r%R#hDZ`-Bq1_,0KK(uL9PciGkB4:LUV"/h]?cS&]lN;2Uo.V1jrHl=I7Q,'*qMB3<R!dKoN]%@$<@Q[=]V$r.l,8?"bL@jn`9H=di\r%Th+YOS9K4%+^mW0<(;um^&N:4MUSAFJ'L-gm1DX1pZK1&c,G6*n,Ai$a=)og^&)m-@1=H5o_q)*>jTXZs3EV?VpLFgH&2Ii<;:Yo\r%(OM0mrG=.seQdKINoY])JUTMlKPnGt&mTR;(*_oQo#^<Xccs&K^RL;ArBjct\OU#`1LJlEGMTThl_h`qDE`i8Y'fBpaU<Do*Cl60\r%eDaRY.V`Mar?*"M4?i.&(0]CP8@6$pN@`'RRrEei9kMUu9J5K;F=&YiREm=$h^k0!;de`V@IAO@$$Qp-e)rgto.N#ccgTeF5p)O9\r%&BjubG:peWC6bX3%gA[<h*"e6pu)\9e^nXmkX/%n+lS3P%3-:7pa>WB57UeA76N$8@&IUk%-U&l0(sf;L3?khO$8#n+AKG+47$L2\r%XGD/+8O>;q7+`S(kKcO<@LA*FM(j*.(]ci8Ld$Ldr#Y>pJ`oJ&P/d"/`U\2iL*$aj+*p\%%X6h=Qd@4o\bsJr1uZf:PcN5T"L[Re\r%/`;OLe-O1_@(KELF'mj<Q1_Je\IsmJM!k0TmbnT>iF4\#pRrX']1.ZmqaM,&/8L+6:P53akiY=dgS8a&91ouaTs%2!5<ujOEh-g+\r%@Ho#3#c>.fU8`q;Y&BbU.%5I\W&3q9s"W]7*dSLR78aYK'A>[N>H-1FkOl2^NF*bHLVnL=459^;Mc9D+Ce_!>q1jhg+Wt[A.0N$n\r%r54@,o,o05i?+e0^NqRRqSV;[o+/n5aM+m'3\$^']J4jC-Q"LT_r\;iB.8c,A'Osf2%3gJqLfrY@3\o+(*(PTah^9p$QL5^_$N!O\r%jk`tK3I4k%_-?7)iOAVVi\65FelhOaT>L]C$+qMnILZV6Pogkr&dL(FUNkj1&E.aI>(m_-4P&(FF.H?ZrsIXeZQGseVtT+cZ#<@p\r%f3`lSMK&l^QJ%3Y1T7iC$&ni&]@u&>1X*At<#.VNCK5GCi\H[':Q=Ku4X4,5p7Qg5A^Xg7=i;_?;H<_h?Zt^(B)NOIq)M,:r&V^O\r%^%P+\nHu0W=">7BNR5iEjX3gJk9"c?Zn";<jf/cV$tC2on/?2s!fYcl^Tude$!Mmq/ac6)3TUFU?9$Z=j-0#5^&6>Lj:n)5k%`Ds\r%9BTO2p[D80-4Bi(di%[ndu"O$kp"Ga3??+7*j!!aA%9Fp@O\FG?/()\V\Lk'l^/[OWbd1/TqCPG(m+?&eMg][g$O>inO;L=S5Mr)\r%kXuGuTZ*Xfr#2p:R_;/Dp@+NC._a^4EMrS`eucNLpl1kBN6$:um$i7\][`Go)*)Uu`VbdBB]M:i-]8dJK_0ljairbFT<-ij7*;q>\r%CKtc&D`2("qM;#aluf;%b#;[]rO(\L()3peD#FOX7@""];$#7l88.20htI2(XpF46htM`U";/qG^[D?P8eK@8O71WTHZcOfB*&Zn\r%EJSLqMK>X&m4fY)i\V-bn!*p/#[0p%$q#>LUc\%2&nIB;(]V6-IpG>ndIuJ[YJ8=hJ"+1u21NH[GfbsaRN<PlfJ$^_:f4Wie+<Vl\r%eCQV>#r9^DB+Gpc'P,ih6>'!"fZi]JV+)![P.S)V+FCVW=-pWboo#$f)ERW%o15K*I7*S0N,EcFCZlP"R)9T:j&s!r6.77N=01cP\r%3"=u>>OlU8`>CjYBguN43..tDGZ#h>;:nSs9/BonL:o`N?d'VCEPI)(Z*QlQJ,K?>`Sbe9iL*%)cQJs_;Fh/B5D'4ODpT3Xk9g8o\r%pEQs:hC,\:G+SsgrCnR2nbXpO]=bb+IiI?2<E*#u7Mtt+IbVcYhZuU,:mh%t@H\Zj4$NnXB.OaclXC8YSEpU<Y0:&dB!hVlSd=q[\r%#D:k9f0kuArJ[iAhp7XUELr#kWHk_Q04p@=]FI=hlJ_\-U#P/+M$kV)SM-0-0`1'TNdu*YJAGIUnH]so?Ri-%?sEeAQ=!5M8(#gR\r%=Mor#H.-^OG440"E.a2*:_tmnE#YYHDJGEhD<Mch_ef2;\s@u-@e7$D^HIfJ;--^$_^VtK`7N'G'XqLrI%F8P@T'8"`I_c152:nP\r%%G[>1gR,fh[`Q`?%6,oA_/AYNK83-4fe/V[E(C%$Da*G0G-%ROLS>eE2\U4\-_2/%[%)TUn\-?3HK`Zu&OejQk^DV3@j#&Tl6A17\r%BbG9$NauV\q<JuW%p.,aCM>Y4\VVnO^$>#(#1CE1CECU/$^5(]mUNqa)Na;=d,05"r!e.I%>a4eU[_),BB9G)Q$;WWk3ZdQ@_CkG\r%0"&Xn<Q0cCI%r(:deB3(hSS$MA]);6Gk@PF45c%!16UoGgXAcd[m7frVc`W&[rqZ?E.7uaN50J=Y4ZPo<Ni)NmgfX;c-jj6C,E\/\r%KBhbB(TX-MBP]da-?j,3PdnM0Z0pX2%FANXVM)Z*`dLGOIe.%(L^m3G#?m1F6ZdPS3_WmS&>I&UcnU";$UJlZ!]n,B(P_/C"EZmu\r%;&H%F'@6d+8n!Mc:I0a-M`=+[-_LQi(NG6@:[8F%7n"R^496I[8lKDtp">"hmY0jqS7g$=oblIniXd-%J.;Tq9*W(;^?6#^kWh4P\r%`P95,^Om8TkjS^s^mQ_^d1N&=2ZTSie*%b")W_lcMF^-j-_SA'5:-T^iAngd`+`Y9%So?F+qi;^$0]0#A5S-m:Y/9;"X6!0Ej4L7\r%*PjeHGnD'gJ.?[]M*lB0!]oh?.oD*4:I#/d/VP?/496JT'buGdnC1Ve,p3nr_c(?=;`94=*M3!`;nWN)FEe-FZR%CeU16(S'=dX\\r%O^r3H1D7II^![lSp*QOg"F?G`,<W1A:!$CP4\<P%\;5"]idsR#&?fL?j+7?*([/J-_ge`c9R,d?7&cPj=VIp#3trJ%F)D?P0l^CY\r%hrH(XEiYA9Ua_on\5o$rVH;7u"K>?I=!a>:_>,=*X[5r9OAlgm<G:\?[-A=+<G6.l72;q)BM(]jV1]HfV*]/k6>@7(;Gi*_'q/$O\r%Q',7O6;o@I%3nuUO@l@L%F>bkZrWlk54I@"BU*JA;acsiBcoIqkOV_?@)C7&.U>R6lRf8H0),3-YL#G>b0c&C4Xa:WOutU?6oQ0E\r%k[D,Tf"Bg9=qpE,s&'rq`Q;aq9DjT^i+O*ulRQZ=kA422g$KO-Go+q6Uhu0\GHm$k.][,/gr`CRqV(>6Q?Z[$i<\E">i50.s52jB\r%Hsc$^l8Lek_p3_=)d=qsD19I;#-H6lOc-fdK3%+rfGt0o`m:R)r:'Gpcu3?7C;Ta&pukYIR_"k'*;3XaGB(2Hmgt-K\/-!7_`g*9\r%/Ru6pY!d!&_C>5VXPkFLfB90($8@uL?"tbb$`>+cl)L8:;E0Buag'oDd]T)Q?8r,G<)Ma'i9]e8m^&">J?qHj1`8"ni6Y4.;`GMp\r%/W7#Ub$=P]8\g0q62ShVoW4:CJ>3\e`$aL0r#9r_ng<8r'McJC/::mRXMQDg.EP/s%Bo09.<t9m.]9'V:'#52CaH!g:.k[o3@1M@\r%as+5SD_i"5VsLnD)qi_S^=ImWB@X&%Wi9>H7\Jc3(p*u6as'BCN1k^pFoP\c-ukP`gJd"=H4$Y>Q,j0@8)A"0"MFC[Zt3Mg2pfVB\r%Z-$,>4)9b]m?re:HI;3#BsN:*dk;XSjBk3b*Zd2eK5N]p:d&C)JX9@.MlWc&)FeVl0>=qC>jE9J4C%OnXHPfiVZ^$r=i<5LA6UrT\r%s6HHlrO$]Mh(2jXja+n0a5Zh\DE5=8/`!-c^%t#&]Wlf!%$<Kp^`3,&iZ`<4JN$#.jNUUoTk@qTJ,YIY5DsCZ<`E6-Y^ZaoqS%5S\r%MY#1=m!3,=S9,Z$!ncbS/0d*.i/[:W6]%uuG;dVIoFZ=3k3HTro7P%qA'sgj#mWro_P5p`9HA=Q@PBJs"cH.B`C&FH-.FlJXZ[BW\r%^(Kb=.]TCbUrQfe%=d9VW4.bdG&t7'%e!f5o\_]55YIaD%H=.X4XSf?U<+:#NX>B<BQ==W(88GSbr,'0rXq\>6k:lF?3U3q1tP8q\r%fmG#k-KocFl5M<<*45??oeT<(VXRW;b;WVie?j,bW,5g\Y.59CTj`(,$hB9,h2;eIjY+3+8Q0#rbs]<_6mE'[75YkOY=Zj$^Z0#o\r%nI!K(?QO?cP4#boV=]2pafs))42lr(&B9c/g==u>>eG+TqQ76@:UB8_J$7hi,X&RlbTcTIW8ea@r0PgY=EtRCKgSAa:S6ls,]QSk\r%GY6'<o=O.<U8)i_W@mlmF$^pN3+I"3Xn5DE7fD>GQsMEuTL[T#q@Hb`H2Y%58*_mOpMR(s(UjuIc'?IA]leGb@44-#hUI<RSTW;1\r%W,A$L!;BS0Znb?Sr'VJrpmsT:nIoafiV1Gm'L-M4`-l(YKJs::Y$mBPnLjU_A`<9b/C[\%8!8"C_m?EO*IVpM<M!c%%U*A)!Q3h!\r%@3F<C#Q_m%Mp7DM$j+KqKMWqU:cX1#$\?'N^/TjREb>"-,.`cBP5]J+lUh3,3rZHHkdUndf(#B_!FJN$!m]*+_5ukpBjF=4c=8Iu\r%RZ\7S"85bN/fLslP!M00k>/nHq):+[.45./.iIu,Od:O(7>rEF!G<o#r8(=L!fl9!84^PL8d=Hd\IrjIPRQcBJ-e1F-0'5N$;J=H\r%B6F1jj"<&KBVN[l[/HV/gnEb`k?m-QDPMh#rV5#8&"2Gm-PXHYX`J>RlhpNX7d&E>KXFPkGM*+hegV&9,/+O:+br8IBj$Lf[_]%j\r%/[thT#5Tt(_h3tmrU>pBS(;$*U3h7LX:D&"gs\=M93Vk-Hgo_)dlQ\2]4r;4;D/88JW81>rFuEU"DHNp[h\;m[*dL.()D8rZT<t9\r%T@R^]gspW+au?FgltET'FpFD8Q#GKR%G(8[+s-fAc=&#/s-OTmYj6NXpYc=$g?N4,D0$<JeS(Uu[0%QGSa.>V#+\i]oSFnu[:9!*\r%&(gf#H%Xqi)$`nDRp'S14ZSeij6>-bH$q_HgHIRCa6Y,"C1VT_BJ7=8MBCu<':i=G8:5'Q+%Zt5-SRln+%]_m%`@eri2R2L4i>F'\r%;j[l3nIYUXF*5;cORqPRR?8Y"IN7i06<5]nnDiGTElcBLL;G8.*Gh[s-)7oT[,bT(A2`S'Wa$`]m'NKk#*%sSj^t"bZMA!Z`&dVt\r%V.Jri'6T0^-<$h_ZH4uM6lg%fRpW%1)Jr6X/eLfIJU<a]=1[h<?1?\ss4/L[9e^p\hUZ;PH1gK/$;8]WlWs?'dBc470):8&iO9(5\r%'r,NgW>06bhBi3Q-(%=<dC\Ih9GKk,9E%i@Cb?4M]6"$#9nf;.epQoWp"ar%h<l0RjnpH/!rpCSC'3<sartpfgMYEdkO,tT#IYS2\r%gtAR]l:3mY,0@ug3N7$i#6F-PK6C*\Z\!>)XW6s>'f#Ph^Pj1E\Bo5Q=5<(ShhK0KcuJ5<F;\n\Kr=o,0498S26,0K=sEpF@:"IE\r%0k:n!*:N`_0B4bE(*2/Y*hkB:[c+#F/9>f;3jLb6P3]%V35$L:83j1rJ&@'\mJ\p`i@`R2g?sp2Q-hl)?0*FmP9ktZY1?obPa3ZH\r%Gbn!+B4rpm`f$h[pq26#USoc((ZJ8&1!.g[%G,d)]7h]XSJ+AnPp1[Vgfo)qLJZ>eBPF?BSri]n>tjroOJ9n`@^=%+bRD.S/gbr,\r%A`bW+F>:`^9hb&XPh!``2_eaM>#H0#%9HA*H!O,;:)t^oA99QZAsB.dV0"HFAsB%4lXFmS'r5t,fu$SF4XQq^a_kQShaLEZe(]cI\r%H/hT%Ub4"KMT+6i8R5!k.;(hM9Qh)5V8Xig9K+boH*b)Lm#OoMrJKrNZ:uFN?=\15fb+cA+CoULft0@7h^c`<g$JW=n1H'"M$^=W\r%=^=^#(4ks--JOQsluYg)9X[TJT)6r`._CO/&Yno0N;?[N'm\oN\;:N49!Z$qlm='l[Zo:\A2bmpoUr!4-@:+'[n,goZ3,:4qd__2\r%#!64JB6Y^W)si+2\@#R2(R'iV_0nn<\sVi7*P.=%FtnD6Q;1q&d(=CZ<l_aE,Z`WDKmom<Zu"U6Jnh/epj\3F!"Z7cS.Rk4!Bba0\r%3[8m5#@%GIc,)+N#ut$=J*B.aYt9<)$'*`hhnuHF&,q%DI_TI(VP?=Ik*"$fJ)@Y(0I]31<1nLXn7(l$e[<Q6q\"P\-N$Dm4r4Y+\r%]o,Y,dl;u:VXW8P!DPEC?-rWK9Xi3'X'4\b46LOWq3u%=WpK.HA4,d;]S9\^I/0ZYEc5E&Z5[g+r]`=%hN-U'2Y:!\=6[?_eUgXO\r%2>T;*YJm,L"XCU(<rUj8qsX:SrbW+TG++Jpb)TD]Dmbn^*R65EBZP>7Lp/@Mc-H6dL>;[blH5_p&*fM)aYlg$FoH%%KAEk-lLB<P\r%O!K<h9[8is\;Nc&KjH&-pF`-a?.4pbM9frrag-Ks9e2l$\:2JJJ4/+4f(s_$.qqGkJ!2a+kViompZ4CDV;QWo*;E;34dK>Y-&.c5\r%IC7QqY:lHU3JO6Y2h9Hg`0"*CLlO@uE:c(J#O#6#.d0t$(A-1WO^T5ao)!AJqrePk,3FLX-Fk*<DjH@ucpWN\0H;uS5SMDT-O3=)\r%2YFEF`]Aa/L/pp_DM;=BRR/JaIiE7%M7/nVV7mkc>3c(W`\tS>FlDMQM/geumHBdQ#"L]_=Dt2>$.9h<FHF6EJiRhK%f-d0!p^0>\r%1lCQ1%C@rdqJL3DRoRoS$i.gW/Js<;f^*:EHh&RMh5m>sD2\gK#WR%iem^G;VgoE#bk:diS76/gA,=8Q,)8;Na]'Bu-4h(\Ju8[\\r%k?e:e!j,-=m*qGe>es?iXI2?Rr^q>U-U`DW`4.n[$P$N;+rYF#+ZIUJRV*toeh9<eJb2WDn"Bb.Q"^a1<H[P#dunHd7KYE@B2R&d\r%^T))#*eX,fe#<;V]aUKZRhZ/2s2>i]4H@T5R>'1FkIED+NhN:H]U0afIO0[&@9@&gi0%4r<[S#2+5^+g8><Ro-==hZ/+dH.ko7ku\r%0u?NdI2Cig7Zj5bk_03Fh#[N[3k2B>+'R.&9V\3u*?TA(RW.?J.[><NJ#e\a%fC&2k<]Kn:7?^(K&Sk:WYn[/2mE"o3:c5>r(VT%\r%qnp6]f[_\d?Y\%3c=6(t*3;TZS&s1?oQG%`7o=!WNkSUipUOdXf#:D+)WN9l+VM6:1m38ra`]So%R%dCPO4fOK@I.(EF(U8f[spb\r%Lr'/YSG5.T[ODMAi*3KugnlPDVoOi\(M2a/:XJm!F82\\PH^NP@CB>BKmTiq<;XCf:DhmIff'u[pYaT=-S-hB4=T(73!q#;DN_J>\r%#JoeQ)BbXFLRB9RBn/>/Qi@L.6e]fLAkDF/&FiJm);HjIFU/=5@fq'K$F`6P)cdd=*eJTO(^dbP6<flJiE7VbrX8*Xfd[r4_X3D1\r%:fK.`DL[.mS::i;iV$o'"1odWms8)rU5RN?#>^9%Z?,)u_qlT7"h?&:SP'k'N^eQ:9mIp"E#\]-Ori@8erAt2g^8%j!@9?a'GCU/\r%!EZ+e!LH/(h-j6#(Om0:k6(`"L\K2OYZ<bjeT4h?jLGJI4N;tj]='(^AT)4S_5Dlcj1RR&>$OtZds;D02$,iA4H$4:^[1W-jR('/\r%$,/hhH2A@/[F_fn"&.R+[gHL@.[VQPVG:eN:E/>$ATUkGb\dZ#:QONMp,8sD^i/0kFTT<MJ/iArMj;+[(a"1onXNar6KRpC<(d)d\r%Q#C:n2Y!3Z1li<i=+G!NT6ZsoaX`700[i!pV8P?S'4r-f4'"\U$;IMXit>CnbQK4'KL8<K01?>+9&Kas.&oBo`822+YL<=[pV`.E\r%5K%_4/:R0^.*fmF)#8c)9U6c0]-2ZSClE_t"8a7G;]-GZkib\26gTjtGs`dl&$_IMBTGaV6YqlCAuA;&8ocs;;Z%*\%>"9O@f-d%\r%7KS$Wa[o(^B-b9/!\YjNT94Yqqf5CChc?WMhK!@QrQs0-k:=[$[i)\[8i9&MY"Ijh1sg*<O1&:td,":m:?qMsa_;g+f"$%eAtD&%\r%KD*r.i[2r/Dq"AL+m>8Jlg%(uXL2na!>)/'F9-i!Zs2"*e_L:`0(;1Nd'cL"*d1$:0Ed^uZG)*Ck+J1b**oHK'S=o:/Ip3]m97C@\r%KqPB=;d?[<([)[?.5"eYb@5WLE9d3IFnWLC;1/a))ob5DGo^tk_GKOE4dhF27oJV]V2_rTCq5#<J>E@JL1g'K&=2bZa5h*`1mfmJ\r%%SMTFa^/AdYZNrAlX5kI7$e5m6u>UZR8k`4-'l\b#fn?6\^BP.YB'NHM3d5KgUIO5S:^@to?.'b3ScVU+"(O=rJiBcs+sN$oZ7jZ\r%i;MP2k%j;\Y4[l]qSLB0\$^?>K^#WiJ04n"n`Bs+])/JJimL-sc4(du<F^?-&R!AJQa<@r^H*0f*sJ^HliJG_<U8r&rV/0\J%Q3%\r%KU5"e3;/iB:dm`-r$CN",3OIcLVEuTR&lTTYiJmUrPs$;`4*Cj^T%#5?;A\EfJM)oIgP#Q]NSXhDAD1b"aOn.mk97,03,SW8//@5\r%?>Y/ujt(&N]\<A5K\diFjjj'kcokN8bH$%b'ieS`X6hPp]Xna50?NSuRa:-Cir!g1pK>:5s,V=3fuJ"m%EpFt4rR`ZY8nIR.@NTh\r%VROMLT#8$eS/n/@R/HlY7)>fT)[!cRrKWfq#@KLS=1XA7"]J-s*o3tb[Rg"VbR@&Rh80[g](Pnr&S/CK$!Ho$9&9.<dZr,)m7Qu:\r%i!q!?gQg@V$Ht--h6++s='uW%a#mV9/$7J>Y@/\&i9^@\SB:C+ggf^JF*A9RkLq:Bok;,Xh"[Hl-jBop?G3EdCUSOY%.<J_0F2/?\r%_:qi70f[ok)V[[LIS:Re!8Bp+bG006Y_c&'?N:M-]$sI\UM%1t[PhJPg2#Rk9$-q\_p5e?J_nq>l61]g\GB%^PVuL!71ca8omVQ8\r%<mMfWp?j-fL[.;R^F>-D?r,@3U9i5_U5I*u'P4#Fd3o!>c&['aAO?lsNOF^FK[\Uf'EGL<OuniFoklm^MreQKMkIE((7=MhV[,=&\r%N<1eG&;d0gd>mJd.41)#2QN%"MZWtQ<f7!KNNq/u+;+\"hLT.ZL(Q9OST^L]k9tA&Zgh`Op8W3T5JYOOoZP\Z]"R%.\i?8=m-]93\r%DGh&``6'#,"g*IWh^FK8&'=7X[^rF#f!6fsf("3`e'@@9OY-kbQ=XVBm"'()NpYg_fg'3Eb6H7^\J7COSU=L5#^PPp@;KnC\HcaK\r%Dils;T3BcL/!1;1P(pI"PQWJ<GP#!%;U_f2/i*Dc2?k"fjhHJbYqa&Hlo+[T349]%4?2?O,aUbo2N<n`:3MI=A^dAuYYppCn\3DN\r%V3@POg1qcgN]6:i5JCLBW##9Nd!\TVC9]W(k4I)%$bH&$lXBp833+/n[Fgq%aBAsO/[f9-f1QD"U9,e+<=A8[NI,0:Wl7.<("Gsb\r%r!9E.Cs@RWj=mUqC@8.gWESX]8l:5?(@mskZcfS:-qUgcF`@Ud/`WDUh8DuX8ZKc/ka9gL8[X65>d7o0`gZ!R_]iJBYi$rW9=<DJ\r%F-G9'8%%!i'_n!"</[k]TX14W[6S]-c)Or`bqc.!"B$h`kj,CEC\DtjnA!50Db*9r('4%fqtTEXl;^3`kqDc;eRE;0S50@>U)0U$\r%V1)a($'u(3B;seQqh(fR5=q:uf/@TlMp[])(SE="R.rP06e_`Vi%'k+SdQ;5>ap-g#N$^_f="q!Vag93-F=n,0c/-'Cst%4SgsT5\r%dFdG3q=2\:R@X#&8q&mDD.nue/,:?K\XdLlNsf=#NBc%W1GKTTJ(;iP=j1;uor8?^/"^7M=,DSL.#X`92`M]-&oN^>DNWJM7)BDh\r%PBes%LW$K]+lNX,S)>/Ceq>!L@gC>iYpS8qET,*N(%$r!CVgONpE1>4pVE8_E#Uk`*`D7L5NBc&]5Xg__TkajL&rsc2W9be0bi>e\r%:PJpdo9Wh(NVoYi#rcp#>U2[f[`2@$1DIh3Km)<RMr5q<ALPn.!kOF!AgdpU6NtEl::sY:$jE(fQd+_P'5mO9P:2.e/HoU,$O4kc\r%YoZhZ`[YB9NA][,5$qo7gidU=)%*a()d`2WB&*/+P%JL?E:H@f0@I+7&mpuf`<H>.[lq\HDXs3?76.k-OUT^%$iNc3Z@2Wt7!u*M\r%dL-nl0(J%P<TTB97UqO+]Uu7#f<ojXEN$t6*d2gR[n%<Bm^ou-HEH./d7t9&\XPa5iern)VVW+A^'Ns,:Lm>^b<G(L:luB4A<L`,\r%aN:k*.)&C>Q.S'27?Y4B\Y9Fq>b6NT47BMqMYJ]BipJ6!#<f\-<Kg$'1PMUmW\a;u1HiA/QS)CMTVKgV>tR6-,rVI1rNL;Y"Rf&A\r%p-;J$A"^m606/eo=OpY-R9g`oJf*hT,U'!nTJ?/ucXj8r@A""7Q@n(o/8iUoM1NYgh;O5``#a/#B>n<jb\9A")!ECaZom]++qb"F\r%BV'3._grA.rh[o@Kk$#ff#(r-Cp9E>f@i!]PT9WMs2-DOl>gW]r3Qb>0<+t,$eddrX4m79C1'Ha]r\iMaFQM$0+T:=cmiU*WOVU-\r%;AOftMEggm,/(^teNd$kZ\-e]!e![BD'N6LjegPD_/2WQ3GnCC$J&.L&6krI&+g6@M]VT=!;9kBqJC7DTq%GAfP)9[F0>`Vh8(T;\r%ASGcrlP$Xd%m&G;_a>@.'=>@/<@Gi;8p9_7^XU>C7iTLnbNIFt'YD,h'DZ3\"pZ_''#.W9KAO;tr+.4eHr/VbAY1k&n9Wj>11QZ!\r%:/2p_AY6Kt'78`?AY3?*8Gm(25E`,6)g7c"6^];5gHsJ:`[PJjE6g,jAY+bt]$?M5bS-kF6e6P&I>GS&;K5EP#gk+YV1PV:IC+kK\r%A&ad/%ga?I<]B6Sq!+?!n,^Cn!Of*5p],=0TKOV(5!Tr@B"+EUp].n)n!%P+%(c.D^]t-T`aX-_L0FnWc>jj[pq,20bYD:Jgfe.^\r%n=bi0EBCU6\2?)\8Uq<_],^6K'&Wl1qVC0&986Y$T%8ik\@"*PW/?.1e(B<4iRX4',Va9(qk]7;(gb_u\@#;Qi<2;ocX\d"!W2Z*\r%C8oU.[[b&rYH;6dMEM?QfG"!`C@Q$n'bLPW`Y3Opn:B(=>-qh&SnPU>!TDVtit?`tFL_"cB3FP3)agF?beYD<gtGSCIauhqSs2[Z\r%Xc99IK,"k<+BF)O.Kr"$TEjtmOr6I!F)Q,o#A3`a6/_nKH2sP%j8,=tpXSSL]sm^@.qXCRT&29kQ3$8pbY$oAZ?][3?F\[-81O7R\r%?"i,#]fau!\++H@4[0gqr[&C\h^)BJg$dd:1bN!^qgB"ps1bmRD1AC2f1neu=5u1,<*LbS_1q.]AShftUcSYMKt?#*&*'h$cs6Y'\r%a"^FqTea$h/^IfmD050k*]h/+D>jD"3Qb%F^7&g`Z.9h#Pn^+(BVMr0d[8a_XX-)p7Ql;j>"e!'(Wk2#,&/J->"]>W[OJCg'Wiu9\r%9Pr2.'"%U41UTR][?IrgA$R"BiTO&n[K"c.!mgP:RmeI#@FUb(jpCDYYa3Y9O2BB^D(U$2B8'M^OLTA"92_i;ZSR;GC5]Ndi1<'U\r%eFp,4)GAH"=lt4KJA+[\i@ORlZai'iC/#*48O9g9lIcbbf>/G6`mT'<#:WGM$#W6:C[O`s0B(MJn>8-LmVS8j2!Dpe5\OLcDgT&\\r%I'+)uOg[F.q<5:V%p,_625@R!m`k,KAKs)"VH2EU>p\]**W&H<Ec8>7)kQ"'RX:g+hB5/u,ko:`e&FCM+4$Ht>ANcH[%5=A:q8OW\r%bV-QjNkfG?*T@VMglnSSi,Ar3SsA.e3-[;/JuoL]^50lUs1'@EIa#5`[`k*5J")DrPtaa4];N7l!s!qhLVe,9H`mq4OT''EJ<Kfr\r%1iGU>iK=-]YU.EjQr`WAbkR<ua+\k/]b&p+[jt_D8"Lb<GiCQHbIn_lJ)pHt7k9(1I=H<dIkK@9RE`3^I5:,Ibiu$Ja`U'`Y3u?c\r%RgM@`_Ogkf:Mq'<)>3+h-<eFhb(R#md;b:'L_PM*BJaaBRsM+Wl$*^_<PEVJ'.:0rg-l_cafro3^^bD]fp>m\F%K$^qIT"A!.0(H\r%$9?h<8M^UbiS95A0;*[-_GbrQhQXbGA5TJ1-.8t8CX8-V4npWl>GV!5D%9L>m@u_L5SXSDKG"18hb[8sC:*m/7Zsu4Zg"?M7Zsu4\r%K/`9$7Zs4m,3Nj/%>;%ao<#=KpHlR&p9EMsI:#MD[`\R[\&rl4+SINs5mrbp\27!IS+l$bmH3Ho7;L\I0j+dThu.RTfpO/YGhCnn\r%A-(N0$.)sPE)^1[`Uo2p;jqQi4t>CbH$'.4(7/gOQJW0:4t>Z0FB)B%Hi'r1dd9X&o'eGHPdKm@Celu[j\!@:Gqeco93:l^G:"Z^\r%FQolki?E^O2=V^mn-SiY%hG:pn[+s!`lcbLJNHBrq;@geVm88CFK5Sf0]M^*)Xr[AETME-^H8RJKu:pZbMk9bh6o@;rJ*125G2d?\r%*LX6?N"00Tn[$DdP;IQ#:qAh^4H:fQ+:u#/UP!2fIBo\ECe(\\ITLHfl+tn[DYu=25GD3-:P81K5Pm#Ai5W3oNFTUTR`p\8?7N10\r%G#/3F-X,Kf[<H*A$,0Hd>5.K,\+X%lprq#R;,i.Lpk3YMpMq1)pDftd]W8L_qlj"/^+6%OSS`r?ipu,5qYpDlDDY8KHXT-$<?R[R\r%`=e:?GTdE<rW(&'Q5-t5*/KWuCij&uM6??up.hYnr-%)b@D$q7MjpX%D6m)M><Q_)/rq<hlMGQ[GcsAC&%UgDm&:4PR511W#ferE\r%3@OZS)b5>SQmsXBqk`n%^3>=Q:ci[*R;+#=V$K8!-5")CaV<oZmbM(7=3l>U%BR0#Gb?&.e!7bQanhrE#&\2?MiBI9YBC8rfY^ba\r%.t1t+db3^'.f._eJp.*AgD'fTYo+.J4><)%dd;UV/WJ5CRc-r!@ZTiSQp]KFY>^D9K.3NW`"OB(9sut3\_--ta)W)/iRWK;VW$,;\r%>;PDg%/k(?F++nZZ1jt][S-8il20U8`\s6(Y4&dV-:>:uQQ/SW!Q,[egB5L=\]'odqH5K&Gh.o3nEE%9q;ma;3npC=FBb`bqfm5l\r%noMEb03c3V\XSd1X8f"0m3fXt,.6F?'AKi>qFg2fQ?9=]EXD^G],)N@5Cqa`RUkN$389D\0^B[;Qd_FJ4+cV&'!/tXk8l3mb!igP\r%9<9pTE:h1L?1MU=>ZshT9G_Y=``$/*1L7sj1:=V08a]Te(hU?A=jTKJ\ua`kr'F6:9\9'Q,trI'S*@dAR?I=Yp.UfW]ulf._EGQK\r%$Y@GJ/st^/@oe8Nl*@o*,SeJ]b@`r^+g"QV]3U:DWDIcsQY*j8-@ncuTe(Y$Msb(q$Y;d%08q\mcrj-pPXW2ai(TImosnYXFJ8.I\r%[nntfk))eLdKt]'B=]4Z.^`(gcZGjD2A<P9I\mLEa8on)3+oi#RJ*@e\j2+q.$WPtO0@MQhP;5Re60_#FBO$>r)T/^d:LA-5[H^$\r%Wb)e^''D6@f)Brb22,*'A%<Grc_C)iHAlnS191SlF_YI^a15SYPjFPB]L@m$Y4iQ,I'JD"[eZ([g,PEZ.4hAiem8KJ^6kEC=o4$0\r%f8Ijm0"ce$e0SmkF."gbEk5f]7BK7W]4Cr2X\:7;l#q>l<U1WIk@CqTq/sf"[k\-PP%A?=$K!-[W0QTZmFgg6`)\4N0%p94<[QIu\r%RGm%(VSB6,Ip8>:[5)`EaU2coRaEGY+)GNZm#n3P1.g\mSa$rTdNrZfadUP(3F/q6P:RtYATc,KlSc7ZA9H#6-V^n(`%G1SJ-Y^,\r%=^A=V!)I%3LVa2`'_UL]141K,<pT4nCAR]MQh\4"c1Qt[2oY7_b$D9@qS#5p2Ai.&Or+@e1Y00X)PeRMS=q)U-8*V$U`qE$;.2EG\r%9L1-f&/Fetr_6+SUZh`d>sM>Pfp1^`C.dABO3l^'/\ctAb#&JJP""]R4Zkg6:#"n_;#bDsIeOB?#bCp!5c[*@A9cFJD(j[ecVCX8\r%)DAYs*;5QdR@bi[XmXe\[/%5/`Q`D9`V5!u,k:Z:DjH#Ej3?+FZkr+\YPU5?GX!N%n4'N>>l5MdM8O`FqO(;]L7-Z:GTpnbJI'rO\r%[,nGD%a(S$YEo^u1FA%h_]fNAK7RRcACPOP%)ZGsiJXt`YcXl;kaA,,]H3OWb7!]D-nMX9@%k4S9F[B4?'n=ULufNI[S]K:TXAoa\r%G&M'Y_/Zo6SfmJ@r)"P)je(;d&*95Ja(/:*cIJkfMG]DMAjuh2T6Z1^'U9i-(HReYW!orDd%NQlqi>qP06ATQ][rRV]J9HKnN1,9\r%'+f;<\OE!QXg48f&_TEV-l)F,o1Z5\/cm/Ts#48F"XX45AruG*6I494[>ZK(!co+9)YentdJ!M8998HK1MFbTrrDo-!Kk)_]Q/H!\r%NdeR:,B`UJ7K<1@rnbLa)Z=AtSegB3@XRn(;6M)a3p(l<PFg;XH;AZ8W@f+Y?=4H2U"t1oIdslOWb\870!B2emt)79O^?WLlKQ.X\r%q:+GcH],8u@BT9fble\W*A,Z$m/g->AOK%XBG6l)kSaDkW>b'HHWTNEf?c1aNI[X$/jg9Bgs]fNDlnGdJRV;"7J3P_MD:M50:V4i\r%P`'2eTE?A<dDDMgJW:+ZPLK!p@j&/Io(P+(ht(n4/8"Q7\H!D&)A$>n"gENYFWc@V9F/.,OI9mOg$ttZJdfB:FEt$&5mG70lW%4U\r%61tnIQFF/^kY#LN.ELGV+A(]0A9_Pjd"/VJZTdF;+^/*Aa.->O04ekPA-*Bf$oT!5497d#SGEXpIFANTO?OW>9\`fLT<WSLq!'[+\r%Rh@UscG;Q$1+>+!fdnSm-<&F!;$OXT"s>%m9uc,]$*_N&G)'U%#ZiZT@%0he!u<D.fjp>M!=:ZPf*&RbQfp)aO!df,AVO]p0W2`\\r%S'8:?B=>pZkP2Q'ZGlBXK>Ame<?DIU_Ug-h71UduO+-]WZA8trDJ=jO0p-Euh1?c\oJO4@3QcF9e=7-,GUT;-I_-`D(L*u<qnBes\r%aa;,c.HeSH&4nm#?S(CVl+RuH%)flI*=Zh/dC!uJ2\l`NGqs42s4/!=A'XJ"EST.E@:/BpX].pjr0;252UG#A!DJ(40Q&_$'JK\c\r%6ob4D'JRL:ZJH2S'+^tEAeMf?c@eFaiE`'T3'0kVNp"B/iU!6]JVkopcAp6B)-d>2]t_&\5UN!A^ES?d3!5]LANgp-pXaen+;)nZ\r%q1(HV-POdc(]NV.,7)R)4*B[rMC^_K[V-@T17TA7,XiHC>5[!AMCKLhDS>5"$tmVaQXRm+!h>h>"%$W`8MM",#?4Zl&1ESMBY>LO\r%#A;)le4b#1L9pW?;krZ6^=GGS8IF^4OO3kdql4`N*Y!3)lD#r_(3Fc!eDYrZkUs%tNZQSbm:Lh8NtC$kouk8GF^V+;f%SU"5!3_o\r%>LRoKh#])2&9!]>4e'gdYsg\XE.&8q_uZ$#8(VGV"/tm-MhCY0]@O20JEXJ`^]=B&'A>V6Vs\odL9Zhi?N90omI?@j=H"MT[a3s0\r%6Kac0;kS7gLI;D?Va,UQc)6(.Ju'$5dQYoPJm9D(EXZb4R;9tebtuh$9B@pfH7!>0^0ITAV"[#[%kEe+k@`JS^mBY!=N%3CEdR]/\r%TUsi'6n!u5Z.9F6;`m!M^/5Ri;]l<k5SGU9VH9-YnJ!G9H?"+!I2HC'MPj"MgTnoh)@BtLL_Tc1<5oc99;Hfq^caF7BW'.qQkLYI\r%hC)"3QkLP^4^V`-beoPk=>At<*YLndN&`%ZnCgc&`gdShBVcsV@nqgog)Q^bN4E/gSD\0iPYCT].IQ'%q<ATU.7\5gU58cQBgGL^\r%1Ae(n*^LeuTqC%BU9L-VPUYkoNTD.eoN"\F\aR0F]S#<cL)MH8J`",)dF'[cdp9=Wq6=[12_!CEa_TMGUB\;X<jN2J;uU!sD%H'V\r%1FK%.oepOK4IDLVbtGHK7Wc2P"h=;skId#l^_u/+Kp2S_&AKlON]r(O1ca\TA3%Q?'^5LWaDqJl85TI4bBMFCe5p-^9>+]h0_dsE\r%Z>i]O\Z[Ys-E1CA,:'Rb_&'B_+^pJo%)1*@jU$JhBCLVFSQl3]UDSA%d/,!PUDSA%1IVkT5)R/m10%43aYhfh@SWnb3-6c[#hXdH\r%,aZ-M2dtS[Yt>WT\NG9`9UlkE\NC$sf_H=A?c_TpU,>Fepa)9)i,Ud;$6%ch&mXqg8sn]1'O5.g8r2R!'O7r3p,d70VEL:,ne>>J\r%]a0g,Sq;kJUGu1mGm^\llp38Gjm<FapJ$n5EXT$`lLB>2N!5Pd7ZgbmH![H[>o?shd0(7Hd?Y,sl7]^?MjmHGkS+ce+bcI1IU<@d\r%Q!E.YGL(u+hPrarVgY936#*d_YNW*XXW6<Zi2L@MmbV>UV"m@09<)GF?S/t*Uok?U&Gim6&8pg)0_J6rRDS7unbYXlLZ*B1pjF=W\r%]d9:,`:")M'3X[t'?q?1'18!UVi0:q,^HkJ_a!BRRra0,UtA6dg7/hE\-kOc7%86apLM+(::0+F^0?Ib:CsrK]#2TS:CqSBYdtB-\r%ksV"^_R#t'-_4qF_4F742<dN@Hn6irE7.<#M.1QORm\u@dYTmF1nNik"pB$BF,1&&iglN?a3,Xu?/u%fnOJA00,4a@f1C(d2ua8V\r%_G"),,j)qc"Tm["^Mr?P46]-pVA$WrCsn.uk;4OLMOS^^brMK`-/bTJ+;6DC$16:T_]9Igd*$i;'&7N>n&dNUj;N2FqF8WeianKI\r%2n!U)i4'G/C,pUA?o[DWXS&lYT`sfk541gT%l[1%D:)kKl#&Re2sTdRG++'?L5_jcE@8WQ_EIAIa.3K7bNuGH546AA_]*XOl#.+$\r%h]CXh4hQ8kGlQ_D?2umKs7Yr>mGWbi](3=cpMUT2h]CXh4hQ8kGlRL,rpA\Cs3SZQLr=N"b$[#qK"Z:H8a)_i8GkPVUXeq@;U3/0\r%o"q`]3VZR9;Tl,&`Oo)`H#X)-hQ&^_<GF_#%I_pY6h;\6NkLt".SL51q<l_DeY[#s^CBV'Hf^m>*r<J$1;*I!HAXB8K#;YWil)]W\r%]bK!Fl-T_GnR^!\WS2CQWT,GA#jGnr%*`.!6.c'tlOsfM9GE(/.VOWrpm=gOCRe8_[^ru-/m-#MU$LpY3ukP0?!Ki8kfTn'-qJo7\r%buoj&@.qHNOr\+fY(&!8=V[=+^X2Wt9nCt>*SQ!R.56+F8%/GR<+*06;H.oKba/qb9S(mn9*q<-["@-eh<a+E&Ts(B`l3ClZLFq(\r%Xha:k$@K\#8s@898^\=*35*!!C(h+;U$Gt)Fia1/'tnO6=B=lXK]t?COL'P:#(f+lK.p;1B?\\"C:&ECKV%[l.imngl0X%3ZPK_s\r%I=4lUYL%>m01PWXib\u%ieHiN_-BlW%h'YO5CB80A93Pjn513>-RYf\,0aagQPZ+T]<>Xg3mHh6c,Nt`D%GHdrO,7\B'8XskV9R9\r%e=R4(mN8*/Fk)&1k*d;s7)-\DAW4Tr'PRbTbU(Q182G?7]>YYO1ddTc=+.8=UgoV\!oM,%Bi<m4<Ssk0<tSejYIhNXf0&B6[+ZVb\r%Kl^GJ'g"W?9[slh-TfJRi(/cqXKjE+AmH9^ZHBVKJ=l1<64)'sR+=6nC'5AGcJBtV;Y%n_L!hXB:!J1ISrn.)SJ[9SAp/d^0_EKe\r%J\M-OILd@kpfoZ)K2$HsffM[t&.mIFqHKrN\u=RhT5ai+C>MC;GNa<Q\jNCN0Q)0lp_ko+qR>A<Ht,p0O$O)Ep?+c#gtPi%c[D<7\r%lETE^2T[UJndTnbEfSDQQ15begGN%C=K/h&54Moug>r!'R_F1&M+,ck3B2aTeTUh%/`rRW34YU+rYa]P%XlYK:7GEukNIB-VSKfi\r%k8Wkhs!?YAblk4$h[AWs2Z2+PP%n]40ujb&5c^tcn=6hKMr?6K98^ncCZ/k@!GY8P&on#N?ma?C^F%-XR.Y>KnbWMTr5T\Ce.MO0\r%DQU5<]D66i0d9&3MSh5t#q^sVX4g9d9;=_h-P7mhVD'kM#\e\lc\frPdrh=I-WuOM-aBq6aQU%k]/Bm#7XPkagFk8#Y=UdAGYJ\d\r%&uj:_T0?;6=_cu5-"fV155)Cb\NrnG,1?2Z,tSp=WcT8tkLJ)Gph:BMn't"dl,YG^qF:-c[=YbX:'D8!h@\ff-IXPK)V*4rj$:'i\r%g?9Lq0=<`$H@TnFIbdfHL7<R/RnZUU0fZZ6:<)5Uh+p^KUhu1LrIi@D+jr:Pl)#,n5P2!O)b:b;o$aSQ+PfhfkhoJXVgi),FBf<X\r%a+R83r8Vg:LS4q7qT7Ii6)<9sl+EU^Q07g[j)T3iZOn/,8,VU330PXR+c,c\_bC[KKcnfbcC'eKdKSJ\A6l5sF=-HENZVM#XM-I6\r%qO-I#Y(m(bD5=Z(WL^U16lf44A+a/XH(@=Ci:7kiWVVVL^T`u;0fI\FBk=$gj>,%2&Jj+\65Pa?5^4mPTDg;G<_BGSBZ^]n-AI./\r%,*36'19]/'I,H7W,"#$a<qa>W=RXG8AdXpliZ)&u<;4J^]fiYHE+"NE7c[N)iE9$GVF\LFEfbhu\0m&b=YOM`NtnbSC*o.r7ib_V\r%=B1rg.P:0e:AGu1f9D9H^l)]+)\4L1O9-t2QgT`O<AVJ/Gf`0?#L7\c,TSa4GB92o(t$FYL93@-##W_m*G^[1;8X[D]R@;)Z('8s\r%98t!U!-`-"*oJLEiqh#eUjKVi(63i`;Hnd:VE>o0!a/LR)b47NkSBJO@mrjHemgP@F;%;^Da7[aBXdV,,Mtrd/6d)RoL`MZPVD;&\r%I2>pL+6+-7[g2P[kujlO&cGB:-GjY%VZ;.7pD`<<4'PfNGlmhu8Z$JtWaJ(61!,+:0JWWVKJZWW);ZB\`6QE9[O**`>EbG1*>,Nn\r%.p/*n>qqL9/T+%@H^-0dVTs[j"`N<fAErML*?=5tOf5U4'1-?sr"F4G`'n5%VVeWX41*Yn%GihMgh?;R=1S:_7!GitD;8?4?Bnji\r%e"64'EG*F1rj`jD4;D"(=t'3qcd?rVn]t\Ys65;U38r2NrUDZ0'%Vu5KB+ka-L?cNFqfQHjd:<(C.C"G;.t(aerI&[W;`OZBh#@N\r%4o<l/$t^2a84)$-&fBF=4,Uk5_Rr(:UX3lfBLaeE;+c'pMSY5ad)F,2&;=(r83;^FN3_5l0Qn._asFZk"5$HZAsD,o'\JFT32T;m\r%4,Q=7__akS4,Uk510acFfhn%QFWXs`hgHN@`,or'5t7LpEiA^V">XFG/3s5l62489$YMLt"15p.cC2(5d?!B5K+l5h6fC*8h2*?P\r%B3BX-RLc5k)f8`e8GAgTbB?1bNh%Rc^%kYus*7LSFe\e].!p:"A.bCdBJjG)PV-HCo?A%5"*&A+MFi@9RKVX$^>;Y0bkls:b'>N>\r%0jtG[JmaY5$T;3O)0Y;urT6a?qgLPZKNJm8Lg$dY;A>&T=t+`A!T:8=Ypd!/NM#rY-0:5koZbPKhU^m^3?L_Do++/7jj8!=IGP`T\r%pBU)7B>7V0l/WZCctO=M%Va>$JAF80ioGp@3J2D-d9l$?W-Yap>Mibsfl2`toUK3#hd!iW@4:#DV$%$<p&&@aqO:SnI@"=BAg:e?\r%^+W]?qgB"ps1bmRD1AC2f1neu=6%hLiXP;$L[S":qt*EVbqY=:^Aa96Q*57J%/0';U1m07eE_L3<+"E)K$$OTi<Ca(RiZ67J\$c:\r%]!12Sdp3^feg]g5E;!&3l7QOTAd0$!R\T*4G)GAR9o\k"`CRc_AgU'#NfiOBeQ=O=/go$S,Vdb(Ss9G32n]jB(T2]g.)*^LCFtI2\r%EUZ^pK(pNRqUE`F)"C$Gdk/=4`mC)?HGOr$$0$l)?A]`m77](QJm5b[$BsX;gC>X1XT[&D&57KY>q3Cpdl.R9!KW^%1E>DTn1,Q]\r%NXDnQ!n5QO>&&0Wd+6tJ6cS$[<<U^sj1]@%aZVX<*Be2fQe0e_<1OgE*L)9W:dUX'Y/IAe+p*:JWep2F`q0EZ)V`E/kLAoINA/2k\r%QU"&jC8?P1c2@O:9sg7M:N`\P"O[]ZY[g9Yn.r"O%.#fih`M<)f\[WOio+142Uj^_).(3?`L.ESAp"O8i_4q\45+nkm?*#qa3\q<\r%-VMFU@q`IHXE7k!j!RKr8@!+A`F..L1u6hkb)8uL#M;^d3gij0K2'D5FEC<EMbX5P`VueOiu?&Xqj$/'0U`)u]d09m(sN(K=(MpR\r%Ck6LIMq.q@c3'h%@-2fbM)*<FSmR3\>At!]J]B-<L>e2RmUL9KQpc*&@nKHLrW8_611_:<@JC:g9GrR$eSr!^.`4AO"@?Z:(1H@s\r%7AL/XF24la/Z/hs2Rf,]f?S0q/shHQGh^+9fpFpa`HbIpNo.iKlL@S!Bo2Itg5@9)#He-(4"ri"$*p'd,E0uQd#Vu\@2VT9f$f7h\r%1HD:kN)BcB`CL5J^P`LpD,CMC*8A@K7J8=]NNh/kMB7DL//,qhC)9?CX0d`7A)6*h.^[q#f32\PW*gj/crruTa=tI:)iX(N$V*ZG\r%.F$k2YfGDjfAb+ok'MGh\[8g@orhc$mh"%`YOSD1i*A461eZciftSS@(&7QLFae4]U9`29hH0@<kE#Lb0G^7*NfiCYM6bbM_i6@,\r%D>RdQb*5HmWl?(2M]eGI.8nC(<tC^^HqJD#'Mjhmf*b<MN5)D1D?TG]`-/c@<Y+>'8oU2MFt,jU&$IQRaV=/G*jOK+kqaPdUqhqS\r%/4q!c096*NKHa<kGWs3RH5.`)4@P-SasNoXnJ!F<b;5G5r@9><4!04oacrVZ..lc/aqW/PFj(p@,#^J)9".JK;PW9IL9F9blBd9g\r%WdaXVcXO(+I=LaN[V)?h]7[dnf0('aPI'Iq]'G(!<r0OLeV'49<;l1g&fU^,,jqsKrN0_'mUV6_mD1s=CQ"ED?!s'&0Q5Uj]&tSB\r%Fh4]G?g[La`o8=rbJOu\m"N"OlZ<lU6J[07]&6_1'^E8j3O:B7W;OpP^Fs-"a1.W_IU@nFAqY,XpjF<QH++0(rs.\Lb%DtEK%j`(\r%pK&'Zl*-D]<[,r;cO>lPP+62#Dh#aj-A6A@r;@@'=,N=sY*/lu';S5:/6n^o:JU.P1U7(EGBd.fJA^C8YB]cS$:WgFeO<=!Jp&X0\r%N"N^VP:Bj#G^V?/G@m2$7-T;W$g&h[PV*Bh`M/H<kY)a:>oqm(RrI<;4o1<oHCmp,ro7#i4emTep!<\PZNbmiM5EnONR(aP5:0%2\r%fU;t.`PS#n%+^:r?g1H?Dd#&IpU(1np%F]jd-bN'@78K1VD=$Bh>Z8":R1h=nJ?N$oN4"7R-LK,c$b/:;F[ZtY2nJ2C[SI#S[;/W\r%!d`A\0f@Cub!M"N(J<rbV=QP*D9p$sc%m:OJZ5A+[*#pV0.f)E@!U2:<G@&Y<7"hsrTWjHo;f<cp`4'Qc9"2.k4A,i2>^El,I(b.\r%VEWclLjSJ5H_\+L'EbCB5j-d%0m&$nafLC`:%^EE95b_pBI,I=Js?=6+>=.[l31),693F7;@NC+5=g@@.,_S0iB[f>42jY3E%.gN\r%'Gi@=V5OGo>j;.J;(57k_\(A*+lRCfQcbBoLGLq9)cL]8befre,ops7&7);nb1`^2VG#I)\FV)ALDYUDs+RRLPqiJ@0qoTt%>H#C\r%d)^$?WaWJ<nb'cPjhm\p;A`H8A=!g>PL%7$0k4+Kg?$60jC>;E\@R(_UJ1=XR':RZCChF'Eroe9\=dt::i%.RP7Q5RS6\>V9g0?W\r%LnRO#9UDbt(MC_?VA^dlK_tOh\pOR%WT*)i?j7TUUhDFTNNGFdJbSM/%=2$cNaMN,V8mb=FjD[?E(.B7f@I%HO'cJE2UsKeWotFl\r%C/_6X;ig[R%DDF_>4CuEAa<6rG2_-cZ:0)+lJ5MnVdGa5[YZV:nG&=()pVgPdAG&mfJBWB/E`Qs-h+/>FBg.R_$3tcp^3QnlNE(l\r%>$SeYAH!n%`!PZYTV]\K,_!)*9DAkP^'1,g@J(?LFaE$M*cPp/-`lndn8:A``!PbBM.b"*@')ao.Z,-BX"^6NnOdL2r&V3r;,i$n\r%_lRa'dF[OGK)5$YV^FoY('+[?B9'7pPO53A)fuiYG9jV`P2FgP?AkL`41bZMXhgp6f/,t+PC)\o?GfO?D"(B,Tde<KHS&hF!aY]_\r%"GE\#E)/WP++:"bYApkkLO1Vm.gs?si2'a1W^$73LO.4qbor2%AQ#]ZC<Bl8.r#(!MhcTf=^uPL2Ab3#bpRk,2N$cXcJ#eZ8'lba\r%1LG)<Wu'L48c<&Up<)nu]hTZ]?Ym61*`6*ITHE_8\,X,+ker:D$-hc-6hJkJ]YGrtlal$CLY-Lcpq$\$6RY>YRqIJ95cone"X_jT\r%9f2J"=u1&9H@'b:[6MI/h*or8Bcm1Xo-=t:s"Du-FQJTUBm/:aUf7gaaSBH4O@SEZDRu/1C(+mWpWK'$hi8i\*CHFkW+5irDETJ`\r%l9JJ`or-W#MgB.t\XM*pk>e=ic>oIfrVO`r<LRDF?Kk!+H=*,MLP`p*$8P[BkY/G933bbe-_K^Jl9!6h3%fP3/lQEm4td:U(2eI_\r%^PWnYR@!6oB^;I8]H>J'`]pioB.7WGG*\G!Og_U=pgUtRBC]\,Rm]L(c$CN=Ssbqa3'2XSj%!_68/@*e8!T+l_/\tpfI5!n)f%B&\r%:MVC)E=Tb.k7E>E(s&uAW>EEq,+*il;_N5+/^Wd:XCnAcH6MjKB$d9YYi*X3h3mT9iqlgPQC@ahD*G?D?]0>JM,f&m"^E82\"c(2\r%!Ba1j/c<jMhqfVYoGbQQ^Afm2l\kuZq05]=Vag9KSe3QG?ML!28pK+.;mk8H`I)SQ8$rJg)@-q<KARje6U5e^YVY:'%J]mS]n>\a\r%g[VkP4]a-R/WGkUIJJ_,-KZCkUU27TVWFfeQg+YO=:!'r()Th/%*)=U7<>THeJ<AR=g0]P8J68q693fD5CGppZ0,`U%rHl>^3+jb\r%(KbZH[$m`/h/Kd[BXMRhgk%9m,@eZ/##bT5%8's6)Le=FKWBeqX+=)R.[]$P'==4=:3OG'oS]26#0@&YmH&7lASi%MSWi;!BNk%"\r%RChWK8T.TNBQGbXe7cI$d9AP63WD)WqmZdd,(34`MT&RI]tU;F6?:^A.C1#9&)jtR+XUd;bfN*T2qt-%QoQ%k`u$18_Y@9rEKNUb\r%Zi)FEY'!9"$_>D:UU>(uN$NJdF+FHOHVLH;]EGVbF##qN"YhG>Akkfm=XRcCqg01BA>#8Z<Z@)_-Nh[eH5k0?QU5+ZiaERZ^HTJ*\r%'`eZ\?_:G[###Bcq'5(%:ma>T67EUuI=g&J655=W_?!\c+r#p2:LL*GU]Ud%./p7g3;Og5MSD>p.mC4V`4]?B,`M7e9aubQ./s'2\r%;8jptg,%MBAe]B2.`Jl_QXtTW"LAD8-&)n2gTmlj-"+p?PWlqUC]Om^?_>+sR9?5J<m[R_f[SZp?Y`oUR4o:A54I`C=/E7O`%^K"\r%l(3&sWtsK>Sl;7d*_%X+Ea$E>0h%0jn^f.%O*O1;VN?d*YfpmGT<^V!hIgcS6_X9#o?\MZ1AOp`Sa8ts"]-Vdek1,U%StI5\"erC\r%k2gZ"&#(rMm6lEV`/UJ&j_Z12X0k.Th2d'4oL""8L[8<AQ@#R/9_$hu,;QdlIFaL=f8**-/]+-8kT<S(rt-.Kc?`>nUZgnpf/"/9\r%D,bW/.'1IdgI=VUND9aY_R'YEW@06c<k1=_f5/4<)L`p*Dm8Mj&:QF1Di:m:-B>f+k)(>[L2gd4bV4e/LkDJ$;Sm??oSkXgar5^R\r%U2M_s,9ctCM8%g)1Z"RJ'HMWI^?K/H?#9:qLqY<Y_JcgZR!8>m%\bsfr8BRYqF8b5#Qt/iU2T8-a9]Nm90Yj?pl,i!Iu84n-2^5#\r%h\;+?g[Mji1idNh?K&@,m$h[FLN883VYIW>_Z2%P8TFOMeW`CkC;IYRI/&\W^7fUA7egg5IG9=V>CtE#F)tLBS/^if"m=^:E`<%_\r%@=7u\21E8>d&u7JC(=im#U08.#;@Y;78L_pTo>\=VQ;)h57JQBN/igM1A4>UnSW?Z^!`(7J&D6+Acg8E"hd,c]CL!5b(B=Z^tJNB\r%1IE?6!GCTQXA1As#rqg<UHKAB!QTA%K;2f#<hq#!m/3>u>eC\grFG<p+B!*JFC%aIebJfWj)T3iZOn/,7pLU)U7"GJ+:e9XcCgYk\r%5TH`SQUF89+E"bUd?7h=2F_CG29^Xf0>=6&'dhpuOfK$_I!,0i$.]/=a!e:u[cA@S0C-Ma@n8qtKcT\LffUXX`#2i.%aXCo+?V%L\r%StF,I@e6+e>'dIQZJP1G;.*ke9P,_->CW'm$`UoCNZWNV+"=3P"_R'R7?sddHp'Z%$7p!4,;8EoXqt4Jbgp.Hgph#$Afjs8egO%>\r%`L0n@Gn_)XN0cYX$g>'E+W%uq(UT[\oY?8Pei"Lb=X&3akS+q2j?d84_W6*D(;!`JZIJ(e.ak\JBdXC<N*LnfeRcD)o_#1jSCH+t\r%&1J^)l:^#(o]!1cG17GAKdGjubU>9Ji,;+C1%E'ben29nSrK<aMFu7l#=6*R.HM_tAoEg?4oB\IMR0QEo<0j]ha%4ofqOe,;P]_G\r%:7")5jN&]A*);s,D5ZJT>g>QYNA)<+?5_Jk7@</)(h&V4PA!u:Spk-+_EM<ObDUGV,-g7@b/K6jGH_^=0K@?hgBLSU.7P._K:0ql\r%iC;I,/bUjI@ab_k;^D`/_?_(hhH`Z+_?_(hpK<;/_X@*:Z.::=Yjk,]?mCW7_.['WTe\0XQc(MoYUi&^_Bm+HDEU&;(+@)AQ5M\<\r%%#Zg?NDZ8U_]fNQ%8pciA7A*0%.ijZ&gkN##W(Y_,g%f=n&pi%I]]naNA/3R"(mlr,A\GbT_`Lg<a3qi]^9.K6s;L9o50OR,>=.E\r%cWb_]=2'H,0L_fV@?m>7Jf[#,?.7+`J*6We0OijT]nMr0`a1i6f@uEo+'i_&L0GVUgiP\B\3?hC<gM<gr^oLo"l1A&CDG2:gDD(+\r%MOp37.CBoToo+2Gh9sW`e/Z487VFAu#:mUr,?BDR*$^EH_6!R%BHrJ?_=68Y]FdWc@.8QKNNcT^e37[gDg'udI*H^m?iIdkjDN*(\r%Hu6nQ-jWW+bImES6:#km?I1,P$jFI&R1^PE0a30mhB_#4=25L,hgrncPNCqTq/O%B\9cOXX"5S`J+T4;%O\lo,d/Hc1M)fXn%1Q+\r%8#eRD[>4q1PE&W?XAnrgRh$%%&N<BF!+;<.%?Tn>!#R*Y&nXq6E54Ga(UrgBN.CGu*p[qu%"N=a6+XIk0YfZ!(WTK?nUPTp7X#]b\r%GTV+oXCRY?^c:l3E?7S3@%<=dMCJc`5(aIjLCY5<I\123c&!7W7peAd4P0d)8@J`Xa(,1i$,!dB8cakaDAOQBGl4`4E*,BKAo6XZ\r%A&]uSV?`j_:tXc@Hb[kc<B[[]?b?eg7eIlfmpnhB@>dpF`Chf<?<XL71Jcu_ih[E-Hg#b^a;,k>iruA$C/Y>P[Si1\nZ!0A/QD5L\r%QD0+DMbi31lS#Y9=NeB].jarqls=o<rWN74]p+sbkLhN=2]=?I2t(@,&jGD>(4gU1gtY[P5t\N#/po!-8%YQ*Fp72+i:XF4AkAln\r%,Hnqd@O.@Fgl*NQ.U.Ru`V#feYb-W6Ks.6t`m5Rt-?qOS@f.c-TdgR>Jc..t6k0X!aQ5m\(VRuYcXs:=G_VQ3lX/e$&,Uc)qTV6t\r%-1btb.(\?%^fDj5(V%<i><s%;'(rE![/"YEY=,H':CE%5GU;W\c/c+uJle]'($8kB_<^N`-EuEnW-<qO=[Ks*-Z`C'_<]=*<:>E?\r%Zr:*8?AWu0CJJ,V_(5''EMKld15)GU)c'=E,pG_n]FpqMVOf(J]Fsn?kdpsIGdWm_)RYCK<^C[u@:CY[;0=I=mbkcbB%a^]&+3N)\r%\%LE8Y:s64X6"KhX[6d_5/*>sq`78>H*op)9b9M;V)XS/'@CL'?mJk,F\AsXJ_'gGN0YJ=p"P:O//K<rf.`V1FY8.`f?lqP5UW@Z\r%q->nuYO?pUel+GG;*lAd[QE>i2sJVnp6KgWl=LUFSStAJ4m6L4gQTaq[Rb3FGJ$6Lg>2>bMb#eVRpU=1T-r`77/BKL<]DSSS*Rif\r%iRK1aj3Cl+[0QA9HkSE4Yj+B)T3fI:3GYI5)2jreJ`%E%'osZ:^i#SHWO8r(diJ%/!2gg8,hFfu?3K9SO8\c6><EdHlIl-u91/T*\r%3N_aU%\!/mGq4#;MW35#[8QSb!\f-8j4@P%]"u]/cXWPQW9:SZl.TQ4?,n+YJ@@C)Fkt]]?O\8'GG*(AQoQcY^<>oOPDT/_Zsq=&\r%dFABG+XB6*%L;cpG[Z;u8Sb`kYU?ZWo`KSs$7sjPA)CXO59!.,n'l]"q5`W*g?'3<T-\E=/+JA.`l!"urdBZq04t-]\$*QB7ciqU\r%I._o0;geV`2o'.R,'W7BIjm5sf7nMKlY6)4Gk5RVNkJW#WqNWgQB1aM&-"PtJ*rSO)LL[WcB`GWHFqI@&$_Nimjn8/o>a"#os*4<\r%XVWLFf6HQlYW]J$pd']M=Bu&q.6e*+,&I+TWi[X3AW!BVZ$I&%a:q:Ce/!-mUu8>+.%)j`9ueHs/#O(PVKdt4FM3Ko.@q^eG<`WL\r%$D_]oaV7O5U55$_Sg">$Oi>EV:QZ9gQ\X>-1A/A?Ea5M5Yu\)<A;[9UZ/<DqTBA,m3D#Pd-<K,Ag]*Wj.[s,:B+F3"kYfOASJ*e8\r%9b2<b.]c=s\f";scp\:T0juhK/5hch>&Ru_Y?fB^@[>1^"Z8kN04E:kW:D7dn_6^3Q/Fqe]ro=U_1-Hth&T[q$-^(4jMqT@B./[U\r%1IW>OoT_?fF(e6.,-1k<TG[OZ6g`B:^<e^2Z)oR6heqiZ.O3Jd[;P$6+U_oa\@q8Q^+E*gk:h[mM':%`g=C:jlk[;>aW'+<RVJt(\r%or>WX.>%@hF3%7_r:U\g3J=eB&:95V*#^VgM.7TMgkckk6:YD&\.`9\=iWu'\.`9\5u("g\.`<Ii41-'j%b7f"<(F[\.`p::T/7\\r%_AlHQ.H=1AYS2>sa;B+FL7Njm,[oJbMf0JXgkejLef,7Lj%dOsdoc&D*d>1;R8V.nq?LlP'#pK@9ru4PSH;OpEK3,kL7Ra&jrC!H\r%;``"0'CjIeQC?0?-R-tC1F!OPSVVDK3lg<ug"eg(@`P$q'f0qs8/QOpL7Q[4P;2Jn*)lc!=o>cC+g'/W6H6MK1$f&+R"TIWGR-JA\r%qm[<u&;@VDrPkCa@4-.mQ8.eq$p10K7E2hN1$jQoj"eWFLg_Z-HkOGiLg_\#/0p09`SJF,q"Z+_gkckk6GGt/\.^U`AA03!541g8\r%s3Q0f#kq-?oFnV<pV/TajN7@1T!AqW^'NtWY8?`gMi_977$\t0#jF5*.>?j^q2[e/N`C>lTDo9-r!$I-pWoK.Vl50VIr@ALf9G)?\r%*00pZ:]5q?A$Qf9r=;>c!ZTt2i7]Mab<ZV=Q3%GZ*t'c%`6IKU<!qpTN!N6fcH-dB+\8]Ld*\2W_!EocbU(A/@$F,p#n"o-?e,?J\r%B^VMm*#/6$6F_OEY-0#tSE`oK$fLMP\UXV.5?RT8i;WONs3,7C4SR0oqF;]+"Pod_oad(s#k$UM$PEW?r`O;6U5^kD#(u@g_$D9%\r%0YGHE)e"C/L3^#_NA/3R)rJ[=)e"C/#5p1fN3L'#llXVa1Q=)<^835&N3L."<M*qLN3L,<ljd(ahlS+I^fZ(TW`MJU(h&&jj!%QZ\r%q0P],ACrI9$!aD;_]Kod0tB%J01k,?.92*_oY*^2(+u<'<IZmo(R$2`n=ghWD,Ort`(?1C_oC#N)+GHOK;$i*$mU_sD,4Oa/AtQ1\r%@>#4N(oEj[2o5j&ASNsY7MrBn=BeBO_?_(hp6Yt-N6k`T+[igP7VFAuG9Od.,A]'hp++u*,BVIHD(3m=gIg-/QuP+06T]H9qj\8^\r%J^GGk8ji$2#I_V5J^GGkM`NB8"/@kaj0rtA&'Usn%#=``5T9[K6bN[H!,`l2lE/n'C0E]k<u\o_c>oIfrVHrhGO6="Q8fZH\.#Q9\r%)pbXXor:bk5CR>'*[V@EZH0`;M%+Jeq-:C-heA\!ES5uLY<m$oH!)g9jS!sB4Y&fTp+e;Q[o%8D*Uh&?X76]PqH:u+c2DG.KtfUJ\r%N%aN:FA@=O2#Po4%bSF^4G7,ro:\';m\<SQOVpJXX]R,6X<,-/ZN\2,>:rkshA#f<di3']7o*nLUj3Hbc"GJEa4F7_6ET70P<pM6\r%rphn\n@Y-drUl?9ZG/NH0;-Wgm4[e;:;1EHX[*=&*X9[1>c/=o^V[J2m)Nf2WP/(1ls&eXqCDCpo(_+N%`%PRd%b/Q+O1t+gRF/q\r%r5LhPgo3*L1XKVQVep5"o_fDK**l%^0HAI():@I.75tn>!n@/b]Hegjgn^-,,#EpFZXBIXig18Nm^4F^mJ"`i\Q[s*BnY'g00`lp\r%(\<]u;;-SrcuRZk985Hm*W)D(ghd0W5?:5`($(knqqQggRe`<HDd[Bt!DR>W>Vi^-bRCiIil&c35^Dl6YO?%oT(2Cus7?m``H4N>\r%D?tOp15_`lcF9tFi@g`r(B.CdXTr.<jlki)&nh>D4Bl^K_N%\;,C=g^S>&$(h/5r9l$b`W]7ZBh_UQFB]'>/hRW+[$YujWaA_4A!\r%qJ4'foQiQY=7nraG]m)/O`n(pk416^I\OG`9.r^C,JN[>PIJpsJOeX4F?i,OUlq=sQQC=.7Pp98@hrDSHI]\loNQ^O8/#@->asNf\r%S`7hK/fSpbnJaWbgsTt#q^,Em&^nk`_$UucK_0kA0jaB]+*1KD3kN-KVL*Qn*Xa:.h@'#5g;eXipO+'U#qe;*,X?Bq$8-EB$O0o"\r%$6@!rQnZYD.Ce<i%g62$6E](#Nt]+MKj6ReCB3QZ(NQ()Wo8W6F!9.t8dYc.k<c<R[jM`/SI;t<DgMOOf=@"/^f*;@9)R%Y0''U=\r%Mj"[_c@oM9U'*/&LqJl9OAqVS?&+u>oMpW%OR),%*;m]1,M.M!('qLsjXDZGVI!lfEgB1\/B:&k"G3esH'%?P:16?M3YufWpb2_!\r%C,qCANqQ@7kW0N#*B/EOJZa&_%=t>,lkHhmpY2hfh*nqR_;c30]4f4qIht(ra(J%K@X(m/WX#!O7:&29JUmFE;')9<Y7XgB`].ZS\r%LqMS>N=u2=qS'M'n`R'Mn%qP#BAOhl]+.R[6!iI"nj`93Cl<kWcH9E_lf8W<F]Pl(U4shpZ_B>$4A8TB3pXHgCZN:lFk/sSV8[i/\r%)QU-8Ond,b0TmF:cf:igkF"P8k\+N?<$r**N)G'W;1!/?7YfU'rS8I+KknYFp[sI$Vg3VWbHAj9GmBmPf,YD_-!9Sr(`'i)-C[Y!\r%o4OXW7AJnp,@u[Kp!og;=<da[IKApb/!)-\_S?%er7\/][)>kQN)s0?nO[2XY=,+WT4L\OLQrJcbC":r"l+;OP\FJq5Plo=#[[ko\r%Ns3uGY)U]qKkA[Ng_)%,,N)[gj]6F_6[lbrLIUlh>hMtDB?7t,,/:+p(SYKDAiW5.Wr7_)(P54eLGSRr0fVPu^5ruC)<1CEd!#d3\r%Dr^DBcoK,5%.X3]MCRZ*4t-["Xg7rO&AKlo"E9+jIA,?\NbN-^h\W#1E6iKXgqM,aK.f&n%eDYI51f.KFVu<n*A*D&?1qiR":q5Q\r%ejH,ms6P=cDJ'KXJ@g-neo7nDCa!7o)tt;p3W7ra2a<miat0@W&"_2MkFeK3CHMn,hmu%_+AWn/GO=MSm:Q!"]K_N&=C9cs)>1ne\r%?lHJ_^4l!EjUPIkf%(,Z*bId!hn9n7`aS'_VR;1m%*(NY@VSoNc=E#%")s>+@gV4n$f3MC[-R=9l82f9/qQj>cDXqb*Mh%nI<%,H\r%W&QptE24KJjO.T#2T2km8Yd[oIMW-J`1j\NI7>2.T1"7>L2/m%mD0LZcE%RjYt8+)^Z=c6^!<+*19GP9pODPCpKlmkg,=<]5)91K\r%#t[[('@M4<Tu563)Tkk\(s;Z(]&iA$NatfSX_5E?chacW2OMEO^+Wco[J*^kG/q_brII'Jj$!$4pE!bHf)A>/!uQb:hDr%WQG<1=\r%^?-ZM/na!hU!hEa>9g:kS(^d))0k47mVp[)3N6lD-^^C[Mt31^I>$'R8#sc*K"dN/Pk]]FU5q=Y^i_Zpe):NQLNQN&)L0<-bh^8q\r%[a8_?@,@S[r]L+tjPd=m9hto*nr*LmH[(M/HWpA9=*",'GmhFaMaL>Ta[^HL4%JL5T3*r..71D0iAmKo*)ob24.=`L\:8P$=l+HW\r%,2i(*A?!]\b%TaED%f7r+7S48/GHG?h>?n?_jZ%0(b\IdNL3i;P1S:tN0j%Gd_iH^a%O3LG)iUPYneb?lXS3AN5*jioG4C5T?ED!\r%>VC1TJh9fp>Qt*B-t=;3Ck70hJe2(8O8%iaHIJXs5adh!=:<XYq'6;,WVOZN,`7(C'Rq]k_PV+i8sL'j$tt>^&r#."Ug'Lnc.Tk!\r%6kRB>Kq=W-=b(k_l_Z.(>.N2_)Cmkp!lb(:\uqZhm;d2o%LWt]:&l&VR?S+KSgXu26Tk^/9V41R=D1L[p@4c,Vi]$.?f`_Inkn@K\r%a2:'Q9LgA.nCGs)'O"\@f.5)=:\=oOM;i?I/X9C1hF9#E.Qeq?=g/&:VERj[J@5g2I.)D6:^h+YKaLV=7:cMfjdOl+p8"+)^RCU>\r%YJQ5o=G7"+$b,Ui?POV)5,#tDe+ZJ]iUKt-iTh]9pk7=(r)Z9)T<R\hbqK:\PLeM`,kr4KYjKPtE>N_:_A]&&H:r_,-`=gWf3JY=\r%5%-j0c5;u-HK8Ua_L'MZ@HSfDgqq-g`i$S:"HN)<_Af*gBoGj_jc8M7OiF=!$gA*ooTj!Z?]=Nsl$a7XHqNWdmt-Nppd_Qk:SdLe\r%dp)$pM)@Jb.*3aE:+-CNORs<57`Y^64T"GnXTfq[8M:!7#(e?N]g[/q>m(tTd1U"ReBX<tih3d1b@s2%5_Dr>GE>KB[Eoe$M>)X@\r%3g`9Lh*%+*C:E`[Yph(m[Rd?:p2O_E=1crKi_5,l+/q[g,3a?F;4L9pU#0QlGh(#T,igg9WO3?h9jgieqiY-G9L3G_-FEigbb_]k\r%P?LHL?ne_E^?-S0/P2h4[3Cf<fJ,4Defp;]J)3t1WTi[h"fVY4U:IX3A5Z'`.;5j)U_[-tkL3Us8M+6(5qN0I8SZ(aR7h<a-FJBa\r%UJ(<=6>Ga`h],fM19"h3l-3#tMaD/EY@s<O@Q%*lhd]X-Ia"V=S_?8)7]&A;1>+;fWFb_k;C)-.+gn,Ejfqd\QBBuhTXE-\4[.QX\r%;fJS>4CO^tBh9nX\tMaiMZR[&jUWl?U.9sP9O]jCUPI?^AD1S/.&7VP8efBr&P4Ro>e#lk(@7%0-2U+S[6R#GQg>N?e@OC39'@qs\r%Y=R(0,)Z=&G[<(siE7^J>=`(#FBbPUP1R,(@^NEK>(#q8!YW@j'Kuo</*D]aRJbN\<D>*ZpP]dl#!NEqTh(,Ca<QlD/A)M"<`ZhF\r%>+WZGn_pe_(T60kFiu3b1dE()XlkH87HUp%R6=W'S^4T`j$&D;+$N>\flJHEW=nI)f'g)'msaU"lr]knLBm*;p9Ad>KU(KrNE,G>\r%]"@[[P8up@+KqL_Ir\%4K%,9[qZI!i6Oi.3M@KIaoS%Y3\u!C)qYi2JD1)@GXSpZBK6\X4ln^Fb/m`5a1Y8ZZYN>0ff"QQX+[AUO\r%AdAG8?eJh!Ln,?Vb970Q(_&.Zhng@prP6Vb_&Jf+n`e$-&'CTUMdUq$`s]^I^JNsS><sOWpk3o9"2F&t<J9nam=#[ZI)=@IT%kO:\r%pr)OV%qU.*V]>\n:u`5B=jPjtKO<FmJVp[Y3dbUVEV2$KZoPVT8*DMmTGL5[9i3Zd-6F8sj&EFtRf(uDf<NK[n?\mtIb\87;aR^K\r%L%.:1;*ppPNUD)W-"40ajMmg!BeCo0-qXcK0G-mi?Z0^#"?sDteecc][,(!"Hk3/nN(CT[9Ed`L;\b;L$Oa>h$l$Mdk]n=@1W4Ga\r%kk!<X9(1r([G:PQ:fM<b*kDJb1!2\O*"I#`bC>P#[<LP%WX]W0Q=C$@#:ZY8E](=g\:DeXh@Q2n%;#$8#*[M7;i>G/Z#M*]Clltu\r%POrfVGRSrae^7$2p>_^@dDK9neAnD<agFPP3(Yt!8*(P.0q5ueAl>\6&9)+-\+-\d3LS"$ROmO8-8>40^T?%1JKm.J!!mHoS3#?l\r%A^^;Z1tUdnBZ5UHp%r.AnKdEZqg.j0C]A..Z,7*.%'/E^Zho1LHI<_7^[0'X>MWT;m,)Z`bP_UOnh[4glLlm>\)R:?4tT',:WrsK\r%E'I*4Xk0'..m!o%:PELo3k)5^V<Okk-"?KmI4b,hf.ToPr[#&'>.Zbb\:+q^.XbCWH!djsV9[R)>&Sm#PNI?VO#ISM>BdbS/9>[r\r%]2J_G%pZq#B`<P$"'6b9'!N@d!R%(gc((VX`G_^U+!3`;Rn*<%aa37H`S5I(>5X->(^Qn3KfCbl#S=ar+:_d6!TH$K`%d>WDt0;%\r%ikSK,J=LbBi\qCd+f#21&AS0tp7GKD6dh%kVgbh)KK,,G7/Z3CkdpAJ]D0W,;+Wl/VgT]uH7D@>h`MH?P(e_L4:k#G6]0b@*!pm)\r%l+\/4@e'([oJnpoIGELk.+@.`$I@F`[4uuto(0Tc'#/^2Nh/5T?2Wi?OVcaY9O\9aTHbh;n;a/_]@'HWP.A3._lT>-F6MIg3@Y,l\r%O\[ja<e<6R_;VO+UO*pj;ItA%4[QfN"-m8ZRQKHP:\R>(7.9XGk85229D;KS!n(d$^Z3VG)\umWA_O6RcK<d`KK0lp8fVtl,h6+\\r%"+jmIKB]IuWd>+[ehETO=P12O_AkgT5@=/NXDYa<TC$L:0F-pskGESNWSSUCM3I@eUjCK;=J!)_P3NL#UiP#!O]674L%1)9.i'59\r%/r0,ST,fbJ5D-Xlj%F#Wm>#V(V>-hYp9m$0,o;#MH'0.)0J=AL:+Xq8@%M:A*]So:"m35_B.Wt*R1,&A&%oY2kMfl%GP[$^F":68\r%X?^XmZer=N:sd`phU4!a"@\m!ND?UTK?!$A_=tHfDs^hP\f2Uc-g6DBWoY2mXZGfT2DNp9Q08TfbBW+Y4c@k&<iIiGH-Q^WXgd2?\r%;L:^7^qclH\^696G-,ueEOq*8.-k["]?o8h;_.WAe$]87:h+&I$W>>tGL?rqVKh>&Z^\9kC!a`M_t7h%f%u:F:LHcMktTcnc4TC7\r%G-MU!7%BhDK*QmNU!+DPok<gMj*O^gU>\'%_<s6GXhb+ebj0]J]<,W)l5h!WJr(@ZcA/;i)jj:BkhYH3:l@JTl4"k8G(0StL']5o\r%jH,YI9\MgHRW-,u,qL^S5ko7jEfr9ARe34$NmT^kC>!)m[.jEhcL5<Ll@NFHdcU4Bj68lXMHla8%$=1<l:TBHBWnBL.%X>ZC9K\S\r%8$ARd!^/$PPd?m8JN*,gaJ[.'IT(kqj1O*I]IOA_$H-./4W>N36FZrZ3URt1kt;P5AiD6Xjr+;ug%mXfkd<26nBA."]sLbGf2u9W\r%4HN'5o8a[4JtL`_emb>O[6Cb%N%aU&B$bZ4@]jcFh`*``Y3WQ\b<FcFN0M/tWb*V%ikL(jX?dT(<ZdL?/#iAeE<3jthP$""A9(u.\r%88kp0^CO=+[+^D=hDC]Ir[>dE218UrMtQJQjt!@?reg94ENXP-.V#/#iHMG[5$+HE/W@(@gofrUreP6A3BmW4rh'o.1_%"Z:K7W*\r%d9`l[,u*a-P-M3nq^e''88!lS=37tdis%/'S@rd$)6d%QmHgp(]q=]WMh4-Fqb2Uo.=e9ZX,<`M3M#eHKnIZD>PW_."!4A(K&2f2\r%p:;0_BESe28!boc5+%LI,A!?dc-7c1>Cu18eBZX+dddU.mCT#*qq?5#:#`L<N,C,d'qW`,H:>H*<.6s^XZT9?N#!L!bEso0)(e%"\r%(:l,LN#!L!$i9XM(bIq!QEKZFB=.I'=cguO`+\]"Zg`&K^hE8sZQqQ:BTE3O==n.D7=,_r(6R_;*p*Gshc->`[4$EgNl<3!p*f\e\r%]E96MZq!Cg6#qEBd@S<iXj,`B%klY3i3Ohp-og^!o5h$Zba[a4:B]&d`=+5A@A/c:#>j2E'^\b6r7Y83b\6P*ZQqPudGi&VRJ_M5\r%j^'X5A[aDu/,.c@kTMP-Eq^AEKmfA?X3X/D(HlWlAgHtk(17-AQ/!u74L))d)JURYpOXsj'155L,H8)GP^qX=[h]./;#[8V:C@f\\r%)kTW9&P0$SOsU70"l2sqBs#IP(3ZH/AsBWc>-L62RSh@*C15,>NNE^WC.U1-7QGf^3P?@p$E8_ZC5a%lm%frMk@_sdB.(+ZmO,H%\r%Ect>RP1_Y6fu"eG-BUKeS3>(^P1_Y6fu"d<Y:*==3I@+qk[@RLb1XZPd%/CN;9g6FJ=DMcJ(\fO6Ga^IHV0M?jm6Cc]K$@?R"L1#\r%nBEA:P8ZX/+`\2!<L<kLA'>hPm')e]a!tPc_r'pfU<P*!%s,NI=N6;?p+V7-acd-A%^=^*RSh?Ojrhe4)<L3n%bU`uQr2/#:ekcK\r%R[6msIf6&R)<L2kj`&4A1WnAaaq76Tc7!=$.$nK<N,nV[#KS)sbp[4#F?jUsF%/0:U4X^]EG3b&D>F_K>=LW"U'#X0-o/s2[r9f3\r%qWI<F0>G&_@SV$Lqd/MCb3(*4bTrE7]$[K5b1RHNS\7.m)<L2kja'-H>=Nmq3M@Eh&o0rs4/irTM1R4NHmX]%,,>'C&d>0YMRUI;\r%,ROQD'^2q'9;;3J7.D(W.(E:H>5+E2$=9I`;G8'a,ZE&nFJRK,`=gp:\28W?P$3*[N+W<tL)-Hp3c]:5[1g^U3S?]6.FZbP&je"]\r%MRnHp>k+tPi,C)D8[R'&H?HRq!kn9`Cn`ndT_=hsYd%7>:+3TT9DB`p1FY6Ud;L!K89K<D"8(m$-s)/Jj`,1NdqhN'hXut6\n?\C\r%nZIYs6>&t[nZIYsd]X&Qia!(o(!umnV0LTZC8!^lVmSFD-a??"F2=c!f0a:EEYtu\WJ1?$Yd4ZrW.KdnQp"Ds[)K9;-C7R<bpSr#\r%-/"W%cmSeJfZ=6_2SAQ!/&aYIW/%Obr8[VRDpL6/ET7pIh9??+hc_\:$ZK0BK0<#=isG?3Tfl3%@*b&(G_1/$j`_@'n:2q`@Bjmc\r%*+a=@&f3(1o?ST=.D*Ll(j/lN(/f;\W_OT@,oE8IR@ajR@Fi=aPMKrK=U2&_>S,'UAelEnKjntj=&QI[5&kr,7*4kUIPJ[E4%\Re\r%:kE8&^-*]GATseBT,T$f=a$^PA9&%$o>N)]-;u.Rl>$$t53]#Zb4##<Q>',J];'a'S[(=OCTZZPb-]hMqo\?R?luEoI.C:RZ9*oq\r%U;U8Z#>M:,c(]Mah;.$8]-A:+FFA7F&qgak!>K:VeaE07Gt)tdoMi=!PQm",\hj^XKMq';(7+En)mZgaDkD-ST"FlmYBfT59.RTY\r%$*BN&jn/$0`cu`Hrh@\npu`A9"EO+702Dr:9)C;nX!out/u!T=%r[`fM=?Z:],WmBioY%)fBk9c%0UM8YAV+OT%\?8$9H2f<k!+B\r%\]X)B41F%4m<8I6=u8-,$[LL5W68"DqR_+<9K^2Sqt\Cmr$;7Dc'r'C1k\(hcp+,EVM""((OBcO(Ho>Pd.RV/]^@e/d?dRpn\d8)\r%rKUo>'j.;6#Q%O6(TDq_>1ai1)Q<]<#j=m%74K").*3_PZt,f6GcJ(cMs'!ooLcFLYEVe$bZBs!Z>VH/7jXSN0gmJqii",dr/6+c\r%.`lZ0Md6a5s%Bn/p_rX&P"DtJGNGbKdhs[5%&OS.1..m-.L,HDP+e(#fO@aA6+<L_0b?i$R3UD;>7AGI8L>^(GR!L7O3BO?Ns'W"\r%pJZnG#mM]D,l8>Z;(9WNdVsIllZ;g^pOW<b<e@f1?Cr&H)8c9(:*AC;1:/BtSO!(^'*s?2/8l,grsHYB7##pE5%H1,4`>fn='3$Y\r%'EPFMCE4W([AQ2&.7+VS(N++A6=;3.'j'h=-45.14`n.^H]W$V?a,kj:oXM0d*6q^4L(W+2S[6oEkBHiZ(R.:be,mBpsnEpm"Yt6\r%5"C5BB^l/lIUYeUf#(6`W1Fk5m6BobbUW\MkF2KBiY;mXKu5O,g0GQ71?6es/CW$Xh8Kqj@=WOfk\4ui8Hd^Yi9H4mK<oDNYX9$A\r%\fB,OAk_Tj&EmTVAgCMa)B:,:Ur(-16qN#P?Q<\sS:."7[/C1LN%,:^##[Dqcj*0#b.F]OdbsIC365'UOp8Bs>5(aDUIF0.BlMpI\r%3h$?:CAeg3"ui$J-6`oEaFZc,'u#U)1cR,:3!8gR4!^QKi##WQ,G`0/BNPn7#%u8^kdq*nK<t04Ya7jV)Ou4MiTc=nKCe0>1SqqT\r%h9r1:fi`9unqU"nUYS\-6?m+p_%&Y=N1Lnk)2%)KAH[@gi/Y%i[(MEe`7HB@$0kqj>=*t6SktMO)WaojSKG%?.$G+`-gj?j\G(\^\r%&hL.JcMkC^W96('<'FF6AadNi59cLNENeAmD)CogU98Y.I8mTKj)gogW!c80d%)^ge:f2S=?X`2e@"7,.R5MC=A]l`>V5WA-rH>Y\r%QkN,`-E;U.-:1++(iUAh0fmAZ0<7o@"lMr5#.]*^Qbb":ArD8O,%tWI#.]*^(\V#$Jm?$?$QK]i"1Tf>[j=%T!&qlFDI!,g!SeCE\r%Q+kud.=dm3ITqsa+IAO%?-ZA6Y+R&RVubZfn_:;&_[UW`\^@0;/ppR[jXTbN>eY^rc2>HV./%U4nUt/]J.&MD2ot)B0hX8laQ3f>\r%Yi^fZjRNIZk`#%a>eY^rlhPfl/mlDjo>m$q\1-FHN<]):!Sj1-$YsDo^M'?A/fSG1B$^r"21V16;sAnXS'^B!<0_Rn2<XNrc"!3h\r%)`_X5G7`5f"U;'ZJfU"?-SlF&X]=-@j]S[g>VB@EK*/VH7jK)c&eBSS8.=Fj]NqP<ag4[qa?FR_DjMSqHODFj(KihK)h"'O!Sj[M\r%n_71!'eOs*,(:KE`M*QU;oETIEo[4<$F\.:j:YB>MiA-GPEDe1=WG29<Z&)qZIT@-Zr#=<5FH/X//Bnu>r[t#Z?Rn;9Uuo!.#X8r\r%coNM^:_m8Zcufq).#WL=i33ku-u7t_Lb4k14s5)VVX]PR6<X4\Fn@/f:_rNfl4$Yn$Y;o?$@Y_m32mLQ$HsK7@>2!(U`^p8[SW9@\r%8W9*;JDMqg$Y@"#B4;3ZYn%,B@q#gWnMNbm7;SYK#,^U0&R-ZAI6]jj-Ep;^h`c;M'3Q_VcF`"?.#VTDYd7YHTr_b];IH1L2XE[=\r%][/uJb\((hetNL_>tK@Z$>&`=#apc@$YAiC7o,u66<Ut&5sM[%6<VNF@I?!pp,5PsO3g3r#>,V2.#Z,OSZNZ0./T@d:V^U'h,!Cj\r%gU,)WBXNe\]hP!/%K=N>g"Wl_WF1M;]^0K=^D-AfL!JPPoh.ksPjE7/><LbV9BFGgY[7_K?hiu)>/-<)\I+h>9e5`'EY`KEgN7nD\r%a#cis)8fe%ltopG)dY*`B5c8qV';]l1\dgGDm_>(.l=A/VGPt#[!jHG`Zer3dp>sD#md0:c,s+BbMK*R9u/t.5'rbWH(0X*%BUl9\r%Q(8td]T(M'#hdt>akQ$)M3,DFS%L>p;6mZFPID.`MibVHS%K3A^@9h1[)q(tr=V/<Rl5O2rKRZAgU,)WcCJ;8ltrc`mD]gLT<_g`\r%NILEp-C/,dhPO$(Q=Pa:mJgHEM1HJk'AD-,+a./tSei2!'G@)Bj-,#+5)tI01Q=C<&P=`@0q=;U#j#)Ms!j)),W\2:!tU%tN)(RE\r%NX%lW*ZXNPlUV<C2E2M?W3d(d:kJ3DADH]?.)D+/`!N,6pg6!'P[Jk_EC)(ip]S253$=IDGIX4I*Z^pWcaSXd+>Q7i`[?(u>',E1\r%N)(i7g*aMTc/a2P`I#KhaCPSLa7q]dR%Hu06:%r!7r)`ZG65@,P*KV*g!q2XY%lu1E"2;%-tI],68er]-9+`#X%#Q,p(9m:_n2\&\r%#R*ppml_sA05IoM5`K)f6hrmb:rpX(]!<gp6LiO<O]66Y$_"-abt\-dI[XU/"q%8T,H9O=<uRk%Xg$4"Y,g+FlY#>VIdd^SSR;25\r%r&+LXa=V,Tr6+c^F`CO:\h1sp06])o^eGL?TnEYAR#8LY.']6ceG+\JnU]ImL)Q\G,sJ2(`KEpVmLRK`hVm&D(ii.U6\ekNLH[u[\r%"^_cQaak_ZL'O]d]c)fYIMSZ(OGIo/^l#]U7'oe&_67b^7*U.'5<r9D$.J\:k6W^>mia!#1\](ojTog:7+2a%jTtRE<gU3BVPDW\\r%b7Qdnrsrl':-OK5fIea\*p+lINS]rP3VDr$f#g1RQ):#J^:j??L&7d%qko.;UP1c4-FEO!4&V-dWU;^pX0&M.39\-.Od`oN]XQF%\r%k&[KnIdUa*qdfN6B1UmN.Riuff10MqrUiZTT'd?OkLS!ql1kut95:Ij9eNEeh+8ZY^jHnLJ$7c)J"j\u]l9.Ps$)iHL^pl$H&r^#\r%.@E^sMeg#?P4"hL!9n%%puBpBY14@)g]i/hNY^O+.`-cFW23PD>2A3H?fY`>:WHoq7jK6*[@gh9T3=9r\ieHMcu891+A#AVg84R&\r%<d$&h5^Ne)[_l-`Hum]s_sQ+#NhM4?_X6""Nh0r,S_J^8l.e4Y:Qg>d]_Ngt#A$:gL,Y_-Db1GanE,qm%5U[SL,Y_-DnG0q9I^.H\r%L.uSso?ZpgPMe%7o+bue'>3^kDI/4-i%>sTMDPt''9I"SOmb$RJZ'8sdsJ3:317#B4\"if7n">Qmt%qb?UYlI!5VfQ*#31,;@gM8\r%4Ymab'_s6,8CNbJo2_[c"^L<0pNUYR+MJ(9+o*V98:1qKG&^NXOV5<TgOG.jn&S<:>Ou8E$d.u$6hOQnUI(q$grMr07Z3Mh9j2!#\r%;a%9/4o\?jL^DpiEtsXiCe2t^b4+PWi9b*$]G]RR'"i5AX.[`[42Dm,a1-?mbTqF[H":iJ2]pKXHAf&HaG"F7ST,*X2;OYETNIg[\r%eICe*GuB_Oct>Yr%2sp_0q0LL;^%`E:`])R;B]J<6"/Z6D^#01&&>iupa$!'nc7%*bW-7X<Bp:[4a@%;NKJ!#!/Ug*B1ngI#c5s5\r%+q$`s5[]3:Z68A<7S![OlfR-KJrg1RZmL\_b6ae+`LIZUlmI^IkB:ee0O+*Z5tDuO`?fM65r^_pL1geamBR%h#XHN75hC^2+onS[\r%1b)j(f*nZpY%YC4UGRTq12Ss`'Li2fp<^b[6tceD3PADJTM_.D@8`ic#*%%>WbW;o2Z8_6!h(\i]0W4]$8)e#+C=$u<K^iBb6u'p\r%ad&/W?9s`g]0TlUXl1i=r(?I7\gmG-K*RqVZLcB"]&940I2:s@@Sp4kZ[p]*Y3&>Gql&e,Vtto?DZ0]Wc):Q'oIFcf'bXE\C][\>\r%6:*0cWT8q:XtJ'W4)1\Krd<YCGW>>JrV<+n%s7"g-c]H`I)s0b9PQD<^ESOGq1$uq1B$mls2*Ul![mZ5s5fmQjmW"P-5R])?$tDs\r%hmY_e=i*f-TpC\>)m[XF9`IaEo6Um<QM(8ts2tFh7?%lNBJ-:aVu89/VOqD]U8rHeQ\PK65J"/dFDi0OCO\s+aoBdn3SI;V1%:-p\r%Veo@Rk;hQ3,HQgOlo\o:c.U/;@NCSQ4ImA[4!Ke).AIV^)lr1NR@T2PNX^bIX.&@K\#Wc@_lL]P?i3l.,RkQc2XsdeOYg>4Ic984\r%&,,/gpH#ptOk)G38RM.5kQcHR/2p'5LOT3qX]eI!r*AUL2n)ZfJ%hMEceVX^1"G4M-ek?@b?!XXeKABG_H&JQk&Bo%8!m"Z!Nq4S\r%Dtn)+o^5n@'<c_\0)N2ss&Q\Bf_Lf4mi3p[h7_%dIkl"IC[NM^eB%b/BS!YT?fJH^`9GaiIu2Y0>rHY"s!:G?F4pIKQORNVi3p<(\r%&BSKnQYih@Z^,WS_Yd1W:(LFQ%/qqY"rF<X+e&o:4Q^4B3:ff,l<@=dZf.Yu1->7WAU8Z';VT7,M?nDX0$s/^L3bOYm.?!XFgM2%\r%BY??'HE+;;HVJ)(fIMSaBPrq^dh,//Wo/3s0MJa2IIoUVKA?7s-ARLYXW#a&12JS(&Y*XFR;,\17CV4-BtSLEY=LNkm'OJkk'P@P\r%A#Ft22VcD3Y=LNklni5`c;hZVW_2RlBSNiq-E"l:Z_u4#a'T#U40L8O$.9bpA8mMr0?m6D3P>_#A8ha\,Xj)<!be=9;'+1SGcrb_\r%;</;,3<nOA&*I&RSiTDUIm/5jKdU+1ZP!:0GlZdb@"CQi'4X;`mYfeC!S><ZIWoYnW;Z@o]V8Xa%(?%idDNNO`JO)50",.e-B);-\r%YkV=MfI_/Fp#\+0bIl8"Q+8i]k.dZZ5Imi'RXZ7)RX4eCf.b1f`q#.%R'k_uf\E3gT?RVQhqO^q$$PRYq53pu$NuaFalOH/aq(\n\r%;hKo+>!)30^G"BrdfoUk3n%5-.<X@A(drKV#e']jfuG'3pf)23)Sg(3"`E0,!Lu!smb'A^DZ<ndh-W:P[!).ihfjsD6KkfSGMrE<\r%4XHLlV^LrHnLuL0?H5Ip9Y6sjYGr6@AR%He-eK=HT)SBS_S7,e\:^]!"-p5';JluCCj2$\qIEqf]3-UdT+FF@q@*54=pVj>P!&cE\r%/i^=SnK[4+'.As@h#QHSU+cIhI5laRV-a"G/)/@6W\JnU=@ThW*L/Goh%.E*d5_/?!fah$lLk,S8LmjaUNOf7bAHQFI*LI.VF`?s\r%cX7#@68,ChWUWLAd@^q>[q[A06DeBK1V+r29`)!KNIt7KT'\N2op[:.-2hUj$oX/H8To:!3l1lW:US2NTq#krl'N69>\]ohlNas"\r%=5RgfZbFf$h!M9jMb82'j%k#fj`oE9>W,ns(7Kq8bTNCeec*O5En>#H=fIF4U)E.^40*W;,#FJ9bAHmNO1%0,!'=-WN&./f#fh;V\r%DO_6$m:YPU%H#eB^Rs7OCa7/Fe/lq&TIo[2O6X:Ge#PM3WF!#_[u/Y`-bOTXO,l'R"Lh7a[3jXlS,1S2ebQUrq.a_6_a!&^_^k7)\r%O>U1A:YSnPD73fsVXJ\"V7h?[$DN0>,AZg`_6e9%%:rO';EQH9gq)W!Q5uu*%O#]Y-Hn@C8!`.+10KRFQM_WD[']d6-G-o*9AL@j\r%s!*L`1T8:4/11BP#IPs!R4*YHi0$L%()sTqatF+0fU,+b;rWC4MFS`;@Ug0sQ]:<=JZ-Q-/G:#C!4>o<05RT+`[n"%1,<UT8ffoS\r%W5Zb-jpjrceDgG((2C*]cj1p(6S8#4C1cVkLg"W=!hMeF/a0Pk]MXUc%nRmYZ/:W3]Ef5^g0"Q1:l@%$c%j+*Y]!cDMiCl@$rm>,\r%`HdN$6S13._/@).W'qSR#,;qQZ_5j3%r)u(qA&Y\<l_"I#$lXcW5Zb-d@X%_p%s&.WE1UfOa@#7T\>b:FqhWgV;+<\H$3&CDa%,c\r%%>Lb:_.,)io*fs=/X6tuT?Q%PPPu0K1ietS3jc2UH7fnrl/&X2d^A>]`j<e4@?3t)FiIUp[2P(7Ro-WeH6%YJQ\QFTfuc3r>oUG=\r%=d<jj\i/:p8?Zi>f<mmhRsE7mQ#5m!2W-,gQ#5m!2JWiS;RV!\Q-T9'V9)I+r#rd&YAJE++ae(7]e9$q=G/\Wqq#6E,//Qj1[]V-\r%]I"3&;/<l%>[J?k'jb,9Kk7]uCIVL)[SN,"+(6&L`Q6K5d)*(kOdP<k**O\T]/n7!I77Ui:8X22OmP)7N>.*F`j%TDPeQKF(q]ad\r%amlo9.0gj[2u;B"\:Vrh]qp(FA&"/eE!;ZdD]3H,_-PA2$SoCIR3DtniM>%J[W/1XaF_X#?d]Pd3&:-_(L)u8AeBhNaM]/g&m^TU\r%-ZGG)Kbe4Y(V/s)V1+\b[,9f@O)3_3BYVA$WXK'!mGjB?]DY33X$[Y5U7:h$YD!2.pGnXPZou(Llo3mp9%W`7VX)"ob2Dc`iG62Z\r%2tGn@LslR8<b8Ijmf&(^P%L,%^OJ,\Aj2.abqdC)mS)?-_HWKQ7>C7OANJ6t#c%`gA-";3oF\bnMa=Y5cap[ano_u"=jT!CdOaTX\r%Sa?$Vpa#u4iFj!6Op1b:gh7I1Op*4.o:fAMf:4;[J=^BKs"j1Q/bp'+7UV!8.`2nCYFt@$Kjb;M=,^DgcQp`4>K-kPT#?9.$qi:h\r%JgOSP$qi:h!btqSL.+8tAQXO[WpZtGoKO0=_\11sQnB<g;IsHBK)$/:O%d["<,UI)$qp(7AaLrMlGC3$I$S1Ik#]nIj2/#'DgY/4\r%+,7bm=":ZtBdUdC?Q9oK@"&8Dq]$H=kR+'J,9,jdq5,*m`]//t(ak6g%)2inBH@RTn;A:[a*99h_>Eh;*ok,A"S4/-H1>HJl<j3K\r%Zj]S]^LAOtdcnUulIAL@`4jHgn%sceiN2@7`g,>mnh^]0$IFnB#f;bZ"cQE"Xo_\+6:*._ZIj\$\j#0mX#%h+0@nI/^Fk8J=G:iZ\r%oN17:k^um"6St+a_@H6t+D`k2Gk8:nIO(1+\83?u'bXD1D_]O>KnND:9&be084WnIQ(5)d$)oo?[9QmB<cnX?qXX>*[]HRKA+As8\r%S,Z%Z$ZHk)F5#uQZVgi-jL!U-"Z(u<=^$)pPp9tjQ!Ij>g?b%^4bZ@!:7D^!&4S#.[)Jr^NQ=+sG"N_;q>G?fg_V>18LGVgf>77D\r%ZlQ]gT7l=5fea;NT)FJ>W&\]Q9n`=702Zi06kiMF7'JU&<,RD(,!?kp1f4sSdq7&sn4"1Ydh^a8`uiDk8-5]Gkd;BtK#8('M$G5F\r%g2*2`X#^FG[+R9uc6\=hBsVLt1r0OBBsVLt=N=+0#eH`+*-9j#gF#=j!ZfUCOf3iMr,3]`?1sY41!t?8D'u7@c8EH;=N`n*7m1Od\r%.Cl`+>eN#4X1En%=+(s*<tR$"c]HVArdt\7qQQZ[,_lP1kS:]IjMl1O7`0!*"CLI#-&p'Xqno<4"8Ho7:sU0n2gl@#8-E:;]&*\*\r%[,*5.\C_[tam$&hO8q45nHWDBkiJB33.W^no[;8do\dp,jt(Bilke[m^1Ou:,D**#<,QTl1+dXt(NAWA1es.U(NAVASX_/gI1&!s\r%]$XY12[LBc]l4WJqrkmUm)mT.IHS,_&\;B.@WHi+kjhWDcpO/-T?GCM68oS%&>AFLN=TOWLuotF=UYlf)i*U4#iTJcL'[aC#TOF.\r%6\M'0X3LBV8</L\+Yj\a,B-&X%$<JC.gjP\cO`)W6NJ1Sk'K:L#:GZVRG*:G)fn>e6laa0*'?383^)1*4r79$b7gHlU1K-7hIki(\r%=R%K^CC:'-O;q,lhaA.7Z!j</5>P3]lg\@NR`c`?aq,Oi!(6B`I('t;UM1nt7mtN3Tm('oEek98p2Pl21.+HJG_-CL&^aoL4S-H*\r%gd)`0rpauY?8<n/7a]ZTFjK0cH+HSt^K"Eps7fkepXj8?Q5mbgY^Z5+<TN/3(U16tdTYJeU:6i9?*fC%MmK0*0J@tEM!j<fp]UA?\r%%m?00DBnrHfdBbiCc^m)4=*3XpdC:e#UOlL=Gi1sk'/+LB8s1gFEMTO(d.\CZc5O-A&^-kZYf=)Fr\]\D+lt4aT.5fC"qE&q<5"-\r%P)nglcoFFbqo%J":(`H/%*rpJZX`+#F@Xg6&,/l&29T4M70GWBQ`T!q,OKd8A8SYsH7M5<m?V@pQTaWj[r329<'.IL$G+8;@hmGa\r%$QL6qX?o6'(fum")32WDm(q+"i526.l`$DNAiLRi?sMsZi8I_0UN<X<2\7'?7fOu4%\<oI%8OK.`6:o!XcNT)FBsP[GjN8uerT?C\r%n2ts<)(kNS!!a#`6'o?=LT'P!mbeDs[cLkh,K\pb4>np(-0Y_Tn/0*&F+P]"GYY>Lc]ooO&9`@Q5@hh(K;f_igLPD87Sc(6kMV2#\r%TE@dDN"2FBoQ=(I-*>s;[*+CRd(pC`WH;E1#Z<'$2t+3X%rcZiiYj:mc!7tV9%_BC-q"@[TIA17h6f^'^p)1W+@u($!2N1Rm:dMD\r%Z\eJ2+T%P`lf[]$Kp.a>JWBVPTH9mm+us<:rC-h(Vd9nS%.plep$JG.>\_.D6Z7KMn(@u:p#X^:!9Jsd\f-T^'^4bkE05_V-t3C2\r%'oa%e5Z+0V42%u$)su?K>G,KNQJmH#AdWXKZ"ia+IBqCQqsh(MeQ(8>l`AGF;P7Mp(KQ6MO9-HpY&mb/#V"-*RZ.0S!A4O:H8\at\r%S:eX7%6n+dhB2)NgA:&+kJ$Y*#FNpl4qF%M"GbeAj]P%@J:l\Gh.L5WoF?NgKMLhe??pBgE^,jf3%/45qGA?A/fI@_)6_V@YIkm(\r%I+2pjh*u-$iKnF,EI4.d3r7'8<TX)frQ`Q[NT@+-X8X%ZZ!\sK:<*ArS!tJ6)JEo#H"\@V0mpijcGRP4bbe5WaMOjCL'P+s?@=I"\r%,@>0lB0u0p+8Jf-H=E@r>_9[*s+%S?e.PGI^5iU[C<>+,in0;YU6]1_M:I%X-^?:?%<NEAlpk$f=Ch;k0<FhYWJR=7E*=J>qiNNe\r%[$6Y7lpne>P1="Wep^"U/P37'>S9@TTf4_kqiNP>"RDG5>S9@TGuMsr?Xs66>fu>=9*jM,SRXDCMq%qa/.H/Ogs2Z\>q)H^#T\]E\r%.fDP$5V'SP5c^h@%TA;%XHJt]1rj\pO&bHhe5C(N.^^-(aIsU)-s<B,7jK*Na"LuPd<La&k;Eqh4T_[kSc*]'C-[#fSUskIk%&A@\r%2j3IN^b6[MD^<jP<o!M=Ni["kYBqKICN,>s3-2e_e<mA8f"IniWSN8s_g.JIqcg>TGGuJH3s%?r:`5dsKS6JDH=Z29Yj]YLPE4uk\r%,5R>bKDekqX6e#2[I\0^E_"FjlG'TPi^XWuAU=Bp>B]MmpRYD;%VOeBpp]elo<@pegIGV[:kN&g:,))[Te;jV`>*SW;3r2N^o5GE\r%d2dnP\hAg:W;Y3V`a,pLC[p,D6XoE79Y\GIKXNK/a&-*!CJ2oWld3VIMq8X_(V26slpnc0(O@R7(VU*$lph2=90\@7cft;Q_g/B`\r%e+N[gp&-IJ?^PZs#eE3SCi*Ul54gTglSB'45c]ttGN"Kt<eel,G5F:(s0`.[6W^TV]sNf@NGk<GJNTs@o:+I#:6WrE<QK'lNF8hO\r%J=a^2$m-^WkHl(d<8L(iNt'3SF8W*`/9]SF>a"h;+q9+)=\gmf?_:M,4Y3<,WT_HH&9Cd(G\W4+I_j7S8q5sjT'h%15dM;\^[3#M\r%TMW$OPMVtO=-bnX]<=echNB^B7+1U5\tH>S?,5p%fA+g'BJpC\i"5jdlb7[*mB;`%+OL!SX<e0?1WY1`C.Z:h%';55GnB1Z2A_n=\r%;QHVCcIS')nck\$>WTa"$hX5\/D(][BSMp-'f+("Yn]JYI`P]]?qG(-0=M>K[hELUAj/TZkdtBRpPEKnS0+C?$G9Qi]'AKLemG`K\r%bs/?/X"e5(I_aT@a&1)p0[>^a]9S.cE6:(\f$i_s7nMBg'a@rXI7L<&l.i^jQDU,]gkB?oV;Ck@jiJf!7+Z#;icO2V3K1SaX0<DI\r%jH^l'^r?-40PUO<o6Bk7[<:*E`%orAS1OVn:>j$6^\*"uXO"2i!u4+Pg.`/SqLK*1HqBY((`(jnDq_Ns::XJkgV:5DMu?E:qcYWl\r%et5RLc<pn^7juJ"%F-=<>`!r2$gP^cEuYF;UH@-L%A"aIK4>]4&7K`9\.N'HOe9!:PtDp;9hoPdQ+rYu)chu'/j,C$L7(b]Tja=X\r%V0i#9d:0N`C#9?bMj)m/TY%hoiE[m>jKt1?&n_+TIYuKM0\D%[h)F1[kf;+uIE+?6-T0L:GUo:n>q-W.3Q-?@caWfNe`7ZDW$gI+\r%K<]I3U*bo=P.>Ds(+eP\F#8cnID;c?)F,NhH-']:h-K5g;[:oV:Jgh2gj86;^K*hDY''&Q824UI4N)02V?i]snYDs,dFu(=Df/;l\r%rP>C85HSuR-*Oa'[ul)DljnY.]C\a1jr"ZleErrB?YlNiRB$lJS]u[iFc-Stkc!jN\9X_T>i:i6?Cuam`\7^SG^%#*LtT\*q-*&8\r%1s<pr7t`R'IUY<cku[C0f3\>l><TVkZ-d`/&#9"C2E]S*Sk>l\l=<^jGh,nHWR%h&aJR$XGsVcns7D9-0;YS-fGV],qKch5">@3%\r%m]jLI)Y^FpV$B/iP$Eo`,r4[8pYq5/a;!DlgA<o,(jhFYh7!=H_7XE(Z+Z);dR"DLeP/Jg`n#T:dBh/e"!]O.R!U^?PA\@<c>r12\r%6UpS%^4pWodQ@IKQiMAXgsKjAFUXkdnKe&A08C'RCX[%@F$"cNa7-J7En=O[ght(ac*I[$duI>SiZI@<"Hpllj'\$DYbR"g-;2IS\r%I;)2KNi4$qH&*iQIMJ>`TTK]>^VHlB+@]jOG.Y=f[:(60<2Rq*mOV"T(IPZ?s)Ckb4NsOTq/gA2-OtricWE&5Xi+5_>r'et3ceP`\r%S"!XO,-31!e'J2#GtZo)4^$Z"('RuoAk[g)bUePr6c6k.,1ogPq09Jik-4TKF8'e@WTLdm9:Vmf?PgW12<3rto6q<F9iq'5Hb,lt\r%+F4@[4AQb9ERWGacI2q(,#S.LF*g>9Hb(KUPs6G5dhOLcSCQ'lWTJlX$I54qb#YBqShC%D-D$g38?GPrZse;i>FF,+?2kkG9Fj+!\r%mp@To^K.5Hf#kqhHf38n,fJ0Ng<(,TdhSjIC!Tc@mB6ZM6XJn<o_q0"d1o,dm1OBO,,"k"WWh(dZKUSCjfpmYEHWtm.in>apSsZe\r%HLL)j!"O0)j*6a2H:/i:f/UNG<kE!JSn.!co_Nqn&o?aJh6e5K@tX/Rn:'?D)]NVVEj[\/ZZDQ%f\Gk!NDZQuIi,5/:]%>.i3Gr1\r%S@#K.(:W#>a4=bCA^fZ"mQtQFi:$5XGO;9E\\%@R5ND4lmI%7s/!n#o6[Je>?AK57NcTLK\tN#,6I+PL/1O<17U>5]:uEsl2CVPF\r%\R^-.q7+UIK(<WCnd#:55LK,<Tce0U]VR][R01s@IPK.R%:Zm#3A/!DR$Qh`gT)V6`s%o<)O>/.<lpSJ%W>mOJJu8t,oZR,Q:fJM\r%_/'2Q5RmY=-!>2["s27,:+e8jrLOL:rdbu4C^.g*1f2)3V$RR[0Vs8^lo1d19KJNY<8r4sQQufg06e?^,5]%B>Dta6:mmp:``bL5\r%^<&d08o,Z&+X7+!re4&tg8GDel;b5T7&]0!VtR.RS(^bOA)]7j4^;E\+TaCCFmL"!.H-X'>kP,*O2'8n&scj3VnWMu<sO)sN!(V+\r%eqO[2H<RMQ?>66eei54FJ\.q4?>g'V;&+2$<@(r-9*:7oAfksJ2ffq/_DqpkRFrUSO%=k7kmI9H%dZpFXoU@p_gZY)GbTA:2=r!!\r%mPiNXG!Uf=<L*48=\ig]lu#=JB!?J6S$g'ORRtH!NQBJj+YO"G&R+uZo?X2-T?fDhM5\O]AFP/8JGqS8c9IAQIdY@7QuDnS.pZYo\r%I7Z2XnLLF&$[,&hN*e2Lj?J78cDUHE'T8#VQc&[ecOQmk`m:k4\FHC[Q1c&Frpl-$gY;!]J,0,s4ZgG_5Z8!QhM">,$T"gELY(WT\r%oU#0+r7CY]?2#KEX=0A](Upm"-Ko@E]EYRu!W'k/'M<e[Z/ro%(%+06@4BZ7CF,Opf$qfCs"aPJN0a>#?1a0W:0MWV5FgQ;pbN\7\r%]M&OL^'WBCcJ^)f*FHY9K,e9dfjj-WJR8>'&&-*OHg>;-TI"FSV"<m\m`QRBXZGfT2Y$\Fcd5bV/mc*SV&l[]X\r_nnsg;6;K'r]\r%3@M9O'MB#3Bn%lp!SjjNY!5[J+loV3]a_)FPZk=5q`28FGj<2\(1g8`NNc&.i),%+qTj&>4La`*A*pDnp]U3l42'm)ZL6GS5.t5Q\r%E"p'4Ao.*@m*07k;p=!d`pU"cj*Pig)P?6LDgYIG9hI5,QHAU(P*)elG`[d+cHP[]TiCF`lh7,7]BrJDXR/:fY.i8%&3QIT1+geJ\r%7(Gs8OKi>p^[Z8qpQIP!`eu;EB8R-3k+Io$p:.`cs)`]CgY,"Zhh*L$;t./GcC!5X?r7m`bX)MdK&2dUT6HCcP[ADW22!Oq4&)0X\r%X1[/f]IOA?:A=F/bFU9u2#4<RQ#68QD"c9tG'!"Vg!0C^?:dqqRqPi0=CkiO&DlToJVAA!h&Mf6eWZYs>^%Vd*G2K0hus;#[;67J\r%=38N_0`Z/>f*+6-$dEIB.`%X^BdPk=;2c<,qQbtole@!d(f&J7W4Z]3B@4p3P[pE95c7]79/>0m%`/fLa+H:6THg0Gk55Y[Wt2cn\r%C4>B@-;T-#d/Q51fpis/<-;7/1u0])<u1HPn6g9R$#,nP25`RX0BPlCHV7,#nN^`G9396F^:=EN6,R2D=LS8B=mG/BYP5A/I8S?;\r%BKhV&Q42H$r'KLedVfj13\P@3qrJ6V9V%F9hsY0\X)X*&S(5a1,q-#>9PeBmS=jXmjlqq=dcqUT[Y=6n3LhPqOZZq,f<6R(iVL_=\r%ajXfI)p^qX;*8,tKs=lgi]LM0_pp'Ydm[q]'&`!Uc'A)*`-Jqq1bJ']''8@El^6f!''JMrb$hIcMn>kp\6%/0--jsCrlX_X(G4AF\r%ccbS4>"HAcf$ia9;\J9Xilo14Ge-$8Mk?mT:20o-QcZmqrU=p#/qh/3O@Q$%=+SF(P/-=d@2*5Xq8j&u,p>EWBH=FAPqZ!8K^N"J\r%:RBmN5SK\$f$f?(ABWLLcI7KF^37B?k5C@JAY!'PF*CuHf`4*8jfAmK,G/_LXTT<0AZkqSls'RZJR7p_j=8f]J\H:[L*MlJ>Z_*C\r%B%sit64tNq\SPo9837W`!thX5SF'Rs,Eo;k:HKAc='%t[&3C]R\T4!XH0niBm8Y:\E"pKS9;f$g9*;?UG/E>._E#:1SR(41?*H%s\r%]">2-0;,Y0O1PdC7tWk7R,)&>TK>;-?>hTV'I?Ne,]>*Ba\hUj8'>Xk0=)EL9>a5)UrJp<\4^W*-5%BLA[Bpn\-qU2+l&/B9>dM,\r%Q"5d3XoOBH>7Tk`-Ej$r2G?%S=ImWT8MWBN7E'7([Cjb(@8/C"b;G@@RLrQ^EKcO+5Rk&`95L7*5-r$LPJL<a$Ma1>FEf#<%Fi2G\r%!7iluJJqDW`YiGMR)XgaC=iknOb"DfHJqo%H/Qjhr?G)eUGiaHD.EShl'e?]_>q=B1bm&a_o_0m<u,+-C*g6Tn,csPE7<<.4th.1\r%l.Wb:I9ueSCSeClLA9YO.>4Rd4jF^H(WuG(-F'Lt^M*#oq3E;,h,19BM5PIJ]qDABFG>'_MWtP#@J+1;fdNl`?ZJU(p:<j;k8h<,\r%+MU0Y91+1L*s=p:i68u2XQsZQP]Z=nR7Ri56aJdC,TT[Docq&S2@O77*0U):Yc5ULhInekE<_k_dXF)iK/YW>SDMr#%GoH*OotTF\r%Fb+7GXd?6.g0PTg$rsLJ)O@7#g0--:(DqBdfR.)qjjnDLj.KcW^58[7D-pl^9nZ\'MGc*5G7gh*Mo,1A-J59)?505BrrFZ?=6i:P\r%l8>mU(G/tMVpro2[u=5N78`=Rq_/Ut]dQLdE!p`o=tbb203rQ6WR`T].J7HS\8?L`^!N2f[FU81eB;=X\L#F_Ao)m6S7f,i.9GA@\r%aL.2md:nT)/5H<Q&fX638<tXfp'aAKa(0JD+:;s4I$<Z+>+)njUFqesaR.rN/5OERf9MG[C:u#f]d0#36h.;OU&`m?5(A5rq73>.\r%ct3oqegoi6os2bqc"/5"#6_Hf$`u+Q3A?Wt4&;6t8O]u<KUH_]1P?V+DlqPQ/qH,>(>S9lh!CkM6W%rP"_7i620%;1%d6WSl1PI0\r%7%\(p*Mim!,ik%T[Vi;,pir<Ec(WlB3'JC-EcL=:$?#RCG"3d#HNc?TiLUVkh-Rph0)U0<FF."sRI'KF/@/^@k32'H.d/Qt?;-qC\r%9+/dDk/HEGJk:fubU\pU$eT2e^a74RKdJ+heKrMi--<Tr9:Vp'GUgs^V'&PMD>%?o:RCKuo!s=]H+M4BN1TL<(>1iV#es4-?/[qP\r%0TDR)/odI8+9!RLV[K%pcT%`,U5jdqLo8G[9;7;l#k.#0^VZ6uU=3?RnT6dse6#6K7SagqTJBbXi]LM>\YAUW6rRSfDGQ?::DY]c\r%VQ3@[V[IY_(b32(S+in)XNY2.?a.-HfUM3jM(VE&[4@EgWe8lMm9E9Pk=Isp=n.Q<MU;GJfZo2K52Xl*:j+J.n^-k_s+ij^Y(4kf\r%O.?[22b-E5+?LC8![>i5fZo3>jHW0MFtW-`-C\!qg:>uFLCroYc0XV1V0RRC)ta^[jjSZmB`[%CWQIVlK0-^?\@\sT2P@AaD[f0Z\r%G=cj:]D/nJ%!O;&U6dc1Sg$_^g?/tg-'*]>Q#ra$K,$416=!(KW/rP>)g1-#(*`1HZf%utX$ZW4KY#MJ$c60j-"pD=Qf/bP#Qi]N\r%jF`qi?(Jis//LCgL%iUh=g!fff>DX6F'ND?pLCaGF$RVGC1-7ZHf%3qC:O+HUOfU<Bc``d3)B^,FP,gm)Q;WYj:W<.@HNQ-%Fjlj\r%%>Y>?^sL9[;<.qqD!@Re7ML#:]LARX4-@@G.nct/^jG+\PVWc0DkI;h?KeAY!FOsG.7/A_'VC`+CE;'aePic7-P&AJV`s0/d\Y;o\r%c?<[6FE[o^-91I]K%=+.hp<+aY&I!gfaGN3'cj`gRVJec(iVDCoG/A[E2TqOUj%/k0C4*VTtb3/F:Dn1aY"u!P8`Z-%,=0^.J)%5\r%Ad4ElR;k?Z"4)3[+uB[d8;)YXQ1[itrU?u6L*Z>AB)&?qakGY^c-Ug0OL5Z-RQ9H*?5JtfWKgat%;"_K)o4/23=1Ht[9b;3(YEGr\r%$JmEm-V(?4U9K&sG*Ki<("2g;8C[uMlU>7ZdQ:AOeU%23@XfJX7ERKp%gD2_U2g][?HC2b'U!6F1LRdIaY27"ZPFk=ct:(D9b<S*\r%BJX&4D-7id(e-9lmNP!#@:h).&RZ.S];%]$=J2sX)[uU*RO\f`@"K+#_e=DSU;8O!7o:ZC_][1W:DO,O0F3;:"edUY_^Cu*-n*]o\r%B#*?<n&p9Q0<F7nP`$kljg&kI]0.?Y%Hfm>Xt.#mRf2oV<5HqGEuF]l6l:Rp[+95D1'"VSLB`BrT0EpR#N&N32]d&rKS4NNg.$<A\r%ejnB]1/E\6Ar]DC*jdWI*g'-Lh(I7.jB8?sj;L),<XE3:l5!RQ0<uk)"g.l'\V<#n6KhEOY+^i_E"B.F>XNjT"+G`CF`X[%8)*Au\r%R"kl5dmXB`XHe6AWqK)DQ]kh6$aS8MjVljc(SE#pbZ?Le"fY4jEXcltO4F.S+P5!>o9ckWaYhjD-`0^mB#tOpYm^HIS^oEr`\'.J\r%OOA2?4k;5-A![\4A7_V9e7U^`\WcY&b.O+#?'=QZFpTmHU$E>VoU8-m`IIgR89/7hMo+,C^\8c"/g84e:9!AsN*SoQ\S^a))S=@1\r%?&NOc$L:;o1NidP-5=$Nn4VDm!Es!",Y-#uTJLa/Dm?k*+e#Z/a89EYpki*co=J1nVh8PrJ^Ro1Y"T%l]aL;,P_d=3]EcX4j2GWs\r%8geA8du1*iQJh<:]PB)MgsFaOFu)kTmZh:4O0,cbO4Vi0cI[RHq5Ul&?<CTE[LA->alX7IltTp.?o,9SOOlT,'l#LFdE[_I[QAY#\r%"XJcb+Vg#nhJnc)>/t\$]*sY">J'<pb>kt)Gj*@`Ebt(cGkElrQ(^+"nM/YJAbc!?/$T@i(M)@Gb_"W0?!%CnHd1f7>uYSY4I&*Q\r%>o\i0`cWHTFb-eJ$OMS%oT,nj'OqqS2(.!u0c@T2e$\UZm"-9/T=QY8`\*d[6a#b7B^Cmm?f9)SfHnYRe]AehPJPB&;k;.;38%]s\r%8Cbg2lJc@+`?Ae1Jn'V%Ips32c6RuG;kr1G_mJc$VTF7H^Y049h+=rQm>TGR>a8LI(Zub68i.GD[df8NP4ae9[#S.Wk6*!%Sgtb[\r%OgkIK^k$C#XZ-A:8HnC-IlUP!HTTRTUaYqFn<7[FIXVKN;r>l2SCodKR`rB"R8uNfWAF@:4spSiU2fBjp@XA`m7`8Y@A2$O^\gf]\r%*D?)MHh*mVoAMibc#YkPBr3bUG@rZl@tC%SHodI2f5j1g*hU_gZ]WMgRN1+N%,6YV;NRSjN$6tdd=MdNiTjOlN87Xqe,'p7h%enJ\r%FBq,mk$f9M5ouJj(dg+JU6/^U!_05fSpr=k;tZ?u^f!=%[YjC)eUI8R+PlK$GON2LH[[i_l>e+.1,=WAe]<<S&I8GR9)@OGUSpZ%\r%a3ub`\0I0:Oi]Et+?l>E3uF`VH*op`hBGoDj+.]QU-boCERZgo^Mp;E[]d64<bU`^)"J$edgE)NOZduDXD*B8BS()5^Y4l`pAJ`p\r%U<G-X'ai2Y/!OSe]Y[rI=8ft,<iCAHf^]C&dgBMYB$Di::Fh)^ERqchp>gI?opN/HfotIDZd5-^c^l+0aV<FuOW1oSD3'0Z(SA]"\r%Di^0mZ\qUhQbI8&hq82/k(Um9?$bq;IqKRi`\-IJ@Yg!S3W6i(_[mdU(E-WdVVi_f.5jA#S/s_$@\LtmcNkP5TccMfh?@!2U[UrJ\r%hp?VK`JcE-5%J=hYbDQ2nKC9[F_!cY)]pglhM%*uSR$`iajl2[J).<Y^n@.ohf*V8kXJ40Q#q:)mI0,ISG)R.;H]u/HHWJYK)V+I\r%`Ecnf].DM=qo-4\d5_$51TIM3l#r1E)a9XE)M:N,mtenupct9a-!$JMU>GXkA<>Y%\%!r/2S;FVg_Dgg*Z1rg`EeUA]-Nf>@ETI+\r%)/bI*L99OWT3nkAD>#-==MN1u^J3\%h8POYGF.f;ke"cr^&:I;FtQ?un*skrF4kIdO`i?K%drjbcbIW_ru)[E8WF#sR5I't?!rKF\r%PlupeJmkoap&"RM.RhF=V\^2=JBN1Dr%:C5VW?P2A?G!A.QPL^GjcGF'RHoGY8@_0U/:</E,#a77;]hE;<UEOp3G`Zhm194bP<R%\r%^Lb$dJs%M`@PihiH2ar2`W3<Hg?ReCU]:hl9bY5241>=i[MM9Ii;@+Or[f)2+S7/-^Lb$doK-3K#VnH)36/dF]=7.9=L8LSi2A<u\r%n+4US$r/JZ?;-T5bB@g_4kT<QDt)jK2hlq*"hqFNd,3>P];MFZ?Xn>uJ1o4e#l?=:_J;l6T&n\K?uk&r`;Vh;]3Z7_(oa3qd>8(>\r%98ha,;H*7&E_0!n:8#`[T7oB&jRjJl#PcC\rr8B9Q@0^CeFW/&7K>*=`N-\DerJX_Tf_eXY0"-q)d(KE[+8RNUMKO&_+n.?dVd[d\r%jO1qBO50@nC0/b1rI3K+CY'I)dOfS"pI;^jjZeXRcG")p_:8ZO3&paE>Ij:K7G$/Xjnn#@oC;)O]aFTF[JPAQT)!W4amp_Q+^>ht\r%amp_Q+[UQ=PN<$n?R2rok`c/8?CXn(X_apY]2rOL(L"lAgV"f#^$o6BT&!&SdLdD)d%/C7P6scFH<+Yi%KatFS!.=%2#;Qk`\qC;\r%RaVWK9_79H@i?etD2QFlV72g\n&#Ke:R8mN@NSW)`,TDC;qe,6YVfHiJiJG7nkaa:_58Z#U\!]e$?e3rSGKJFVPt`/e?hr&Tp;6C\r%+'((%!;;CB+'((%^`G!9I9=>8K/$S"m_`L7WUXeQ2G@&X.kOpH<j69FRZ,DX"$a'6)&gg^4kQ:]N']*f"uYr:D68G@F:hh#Q*cu2\r%jMk&q6]YR]S[#+n=;635kXf<)9\hfN<g7^hONfH?^VWfK@8Zfr,alV+<EGC!)s`M;e4@5$8k.+eK39Klk(6Tb=euKkimm-cDPR-*\r%!g)h8JjpV#j_UOb`H=sJs,$CM@fWPhTcI84Otu7fQ#l]B?5pW%ci&Hn"\\5p5'n,lppFL8"F[e'5Bm-;AI%B#iX^hDMZ*(tja6UZ\r%+`KCDnArK++cJoS^B(Ye_6S/Cr9WA87m<3Qi#2kEU3eAuYI;r/g<*ba[7OWbDu'p6Z)H%Y'Yt4/:2fo@#)Zdm8VUo54nO8pV':iF\r%I&1N?Gl]XgHL^\KV\Z%506B"[fZ=o("e0m5AqXR`iFqe52)u'G_IiAT=H%(fM.lIj^Ts5o%RNa92BRr++(J1mfmGcJI&*^i.[A*\\r%-g?b05&a]g#^ki152Kle51+-%6//+"$9N!$%,+SP`p&b/OJjB\g^s'MP!![@j^I_22mSLha!l\N]2-Q$i5BBo=Wq'LBJ<sNM:`P.\r%]#i"XWXPJOEGeP`>ifGcJZMTgRnm"IcOP7lF$jNmCm65#TU=efUb?]pEW,;YT$UE8-:cdu5PNPr<gM::b&(-q++Ju%q;=/VZK9!E\r%jFdI3%H[?:YiN;tP$FG]D.%Q5)>l\?jqI<A.>#Z3<t=DYe8q=dp0tqfCs>qSBE'E!bnMHr5golm:1-Qu^l)(KKLib-Z#<2Q,8ZME\r%OCUInQK,0f[o0DKFXr,H^hLUV0lhRK+EN>Y\h5NgEZmg25]=a\X,s2c]oA.%<[!1<@>ml%,8X8<--8h8EZm;HHN'9K5/b1]ofZD3\r%I)nu3P7TprAj\7":;r!]jZ(6!LY0)BKu=/a+Z:;!lqHB_LY+DO,]i$6i2!75ba.&[&=X-6F\;T-&81a$3'P8%rS[VuM@Zu46.d7m\r%`J<)^#WT@_nKE)&P0^k=?]872&2HghMNJ8a+pTp=:f7Ep,+qo/,=N_jXK-MoQ\OkMN.I,1OWr:NV(2c>q#q5-+'2Z3&$5V\aB`/M\r%l7_Z2(jFT^o?Z$UcLO@S8.#ihMf%h@7YATEDL?hqo=.rmL(W!*&OPB&6KHK*8]S^TLNAJHA4G(LUQ#_)f_++&H)J-8ICqRV.)S_c\r%\*i2;Kg%sYA;D5$c1=qTOYg<fk:3!ZM]kL6d.YgVA;1GRF()?L0lfQ'Ep1&9=^LkD9<PX4:PbOD\tP.H$Q1.DhCn:63OjYuh\`nc\r%+`^WL+'jh1a:L@R-aUb4Kaa*]P7i;&>f[I:]^jOlaFt%bP@UO-\W@tTP3bgKETEH?/'>tAj3KBHpk:Im/gS178DIU?DCdL&+!VSb\r%?Qq@$"iSK9jHkOuTk='GOrDJ%7Li1.D.f?/?UA[AQ5I/or0!Z'-P3l!'AM_E"sNdggm>sH`PBbPU%^`DN*Jo&8WoKNj?eUB785Y;\r%$^(&K>u2E;R/&%"Ar;]YaY0@N`FP>Gcmrk\;j5HPQ1lVXTc^%hOc/^.\uq\>50h0h)'^oFd%'M)d/$\8i0PR-Qm"qZa=m3eNW@00\r%8*F+1eD-1)QjmfHe9>t"*@"'o7+1VpF?teH9:+%pXc6?Q^<Fm0/]EH3X]<VgeakH)8.d%Y]O,>^j?eUB3BF]a@cUGG6KB]q65Lj_\r%1.2UfXm'?V6AER4O,m0>pPidMeo^Y$dQ_CROt5)UXY1#!SAY"N6jC,9;bN33*C9sss1q)T&\JDOW$RDtFE4?,WbpsJ<Kbo$kE#Kg\r%7$/Joi._5e/gj_R*`p\(;LU4#joij1JJsAOg'Mob[^`'r,!q?kIuEX;`F6o,ERgKOYW]/-(0Br`75%k%?#[md#TcCYoS0;)!5U)a\r%Yb+V1!J&WkdGmjRi[W3#mKd7F^*s'G]5UM%j171p`*ranjcKWV$j@eQKguV<E!cS+@hF#lBj4hNL'cbt9&&>DS-hfZ"+Yi2EoYp6\r%$J]Fl*nR&#f@?VL4faT_MsF`n*fSJ+3krYAOF:AMG4h0F28:3aNd>g^K)i+h1^g8TAM(XlOOrR^Om6Y&%IS;&r.J3KUVK@N27:%7\r%gI,i<XYSYG\hR%0Q^LS?iI7k:6i\j/H&\tC7jRc<_ChA7k^&P/ULF"1PE;PF<c08)mG)q_99C,uKDSouIESRKY/,Oh^q]APF:FPq\r%8[?Z"B5DZ!?KH]cj3d'//B+sf0P$CIYN5H0o$;JTMsn*/l_SADe7&qj#k&-g/N.3,X!KoD.3=0W`*$_HU`cfdXs<Ufe]'-P3`=(u\r%jbF4W(mlVNbN9$5C'iGidnhqX9W5qM/G]h_5La_D[S_sB=jWV]$+5#lW@PSSP/X+1^YBmEW5Zb-pq,1WjZ(Ks[FcR'&r9_-b_"--\r%0[rG5,2eJb"LE#&";W_MJ.l\&0oI:g[Es+)7mS^bB$iF%,G:@iW@r"k0oMI!_?mX*-h>E!F_.@R08u+g1*ap#:lC<9m#241W+A2[\r%IG?h&j>N6eN`j^lk(?hU5S]LqC<8-f`'q&W<)dtf=5VYQD7[0rWH(<YMFgW-C:/iT<OnmDPM67Z8oo4NG:bb&^>:!/2#Gk!L,gGL\r%f7nFP&!qfHMJD\t^4o_B[L8o3c&OPqm$68i;2ku._=a`rVS1o6<.)ZemO.=hF08$P>VE1E6L.L.lU"X\XX/J:1+hl?Q@Aa<N1:Rk\r%/S7:OdI^#X6,GC<ZA[(*qUJ,*(7(Zg5*p`H=^d^s,Y$;$KU%D5ibP;O8L,Y)Cbd`NrC/pY[bo;CakZMQ(lS?)QK.S(;VEM@.'idU\r%4o<Hkb:-4,g%b?>&8]*ILlXQ;g&IQ<fl)ge6';8(U]#qYbp8JN#6)d89d3EF&`%orT6/"-NXQWXg]EF_Pqc;T!KS^0?aYh<cdOuG\r%Yhu*0k%DKgBYVAZ-1e1-eUE/&YsA0j&,V@:`&_\L$*`<7ec.>VD^=#fJ4#l!Q7e6P\bjZpds%4J=^`LENK`]fOe,1sot1$%e`,+o\r%+(k2Qa*n+r2S&qPpf)#KQ5cem-2"CZeO,UmB(7$I*eni%%%1_TjP,Wr_ODi?HKbAGXdd=Z\+%O7Z<01iiK$N%;MOGGX'XZF#+1d/\r%X7)og;U=)lokNfm`_Nl8Ot?H9+"*MrQXiBX,sRj;F3R&t*`-atO@bbQR<\3Oq>L-dW7sl)T0b:a_>FXJ0cg`r0Ya?/hL3CYf#Rl!\r%IKa!n/dtB,^Og'H/dtB,^LF%.dk`N[,_dW?Un[>;_lt+70eC0=MVD_&6)k>%9/++imO6L>//P?4L*`3oJOt]]@@=smo^+?J=Rfd$\r%Ji>m<G(uq(Mi1rQ=S9mkqL3I,L*_)rf$Gd7AlsZ\'m^$\P`\\d<8j6_5T8Z*[7Pm;aMY2HCH2o[-29p3CO;d3/G&?p+,2)/?\+/l\r%3=O*pRY"rSk#YsBRT1/igJAr!Ipmh\G+"IP0eC0=8k<7FjuUH\[a>o&bP=O0kXYlUQ,GWR,ecqdN`_!g<1M#2dWt]q%]g5'`=Vti\r%B.H?D8]4[AAfVD1(R?<B@$Ote:$u"O(oqnDb!7sS=A8*?Qe+3+'bXD!1l<9X$43])H]0a]+X%SBof6Lss"7(7XY7rr_qq>AcmYO[\r%9+)2Rp.K1:huA]8(X-$dk-WejD4ZslXuU>WBEIXl^FZL-bQftU&lM\(gOGuVe&Z6%5&Mg"<WL?!;qfTBR?uCb^,QN]D)P+A'1-:A\r%`[.MlP:,Qo2OR*VA>4m3-A!95@%ulL[1p0?':gjBU'Q8#-ol/<co&SGS-Km]>_T,i2<^hK1Os>2#f$*;jg<\_*U[H83Gfb"^un/Y\r%@[bA[$jd;'YhJ/,jg<\tOj7'ca_A(q,1og,Q.'?o7$>?U2Oc&1De'Y]e0sd5n]>LOBqhQ:$?SBTS1tp5)Qf*bTX]&<Y^$?[7NHUt\r%2CuGG+'cK:Vp0?qV6s7=\4_`eIMU=WSm#+A*B@p%>X\d&mi-g7Oe*F"X\=%UZkFp'nX.lsE+cf)!l!G=eB[)?E_FakM;ZR`MEAY@\r%\rP'U^TGJaN[csZ!qi2dnE#4-VIPE<q!p['ZmLP/?hQ@TEoT]r&Fef5`>K88Fj<K1h;61@q18aZ>V.a/+dXk?6LT>OQ(,LAS$['T\r%Wle&n_G.DS=Lf<pb0@aZbm1gfi$-9,d,k.b!P44sZ]AldQ^-m5jWTI(Z<V,#8?GG)!W*pm#b3@&3MMaFGaaC2db0;X*"abi"T9u7\r%7s(51kD3dh,$89dJUmA4&M6@\B+XS_8KffVZ]:^ZNp&A;dXu%OfL9\&RHmA'^_(Qf%n?-J\CBaTB5i?*"ajm+NeiuE6Jj('8&S;D\r%EF&YE-'F$NL6@Wl:He`jK6Kb5-$OjL1=@,fXgoG"kJD:.EuC_OQ)2"ucOnP[6q7.mk(pD>a2`bOKu:r`A%2GkiJ<j\55P[NY@SeO\r%T!jktVRC(O/KL`o*h3fD-Yiu*W^Rf08r8->!n[#`KOPb.puMZihKrp5>h3L+C(+nYXl['+e(mm]T,03ULns(i'o#*eA_I,K-Km4.\r%<DOnO'G7duH6#d-%iM"tpPU[k$'R598fC&Q9\?F$L7U"SO)`G`,:/>c$:AXaHnVs`lQ6A=D4A@^10?-'[r&/&^$05?0E6B4l)B-a\r%WKmEW>LSP?R%<4Ff-TJQa^/^nrI2HRF>N4<A==`Ug2l\1ZZXW@ec-R*C^U./9=f":[2>m9X3VZaOJZB5K&qhh84WpMa)nC\pJ<Xc\r%M&Ei"C^R[+kQ[4A4nqK3JW9h6qDid['^1p0(Vr%,<+6'faWVZe)eGj89?d0RfCCN?!U$4+#EP'C&EhufnWJ-T(HPJ_3I(H8FEool\r%!d&iW$?U[%D7QN?>AeN`%N_+,Ja>["%N_+,nP$/G4%'=7<U:S9'KWg@(S&ARIcOaNP>R,RX3677_%XOJ#P'La3Htb!ITa4,^E$-%\r%1Qk!.:Sao:Fo>(\'55+pDB_cLBMRLN:rWAsKBFO0Iqu1SE=#_1#V"+$:>?KjO<0C%pRThsqQslm20mc*33q/A3tYguDC1-ejlYMF\r%2_SbC*=l6n`ZpWRFE#Gh$,PNjD&b?^T!7OP(9\4+Ya`$0h!9BgTuA+?lH8&S[]W<Mg*8`.E%K?j>lt[j"t3pbd.7l-BRlgBa*R3$\r%BkNa>D/RRJ`P7':)Xo3&q5V@gg#]><B"sA/^8F:f8:_7EIBEnt+U'pj]!s84KG<XcSP70di*2kLYEi%,%aM!I`"\,j>F38(mE\P6\r%14J)r9IUGk!&]uOjb_h^B*U,tSG#]ra6B#:XmG%[20E$s5a1^.+`.*'nmC,fGMNK\A)l+6\@m;KJ\%^o8WKW#D\(2ZVPau`OGth>\r%QE"o]W=C2O`R[ZNOZ1ZC48J/KVLOg>2YZc(BlQ^/Cug+2@H#8MA:Skh5gO?].7&>X1ht.]@hm7;jEpd>S]o?-j@_)hPL?Q2ki%I;\r%n.q0j_S'l*qiLkn$!hu)r?rq+aiI6f@m<:-Q'PU:A<-@.?YYFZUaL[rE_]6>*TK%5Zu`B0fT1EBTu>E/j@_'B1JCdFd2ZmmP!.lh\r%&8DNCI2BF>KNaOL&%Ns==sBl5B/f9XlaaX2_sC`'#iX.$K=_>Xm75;a3GdlucPJ(HMmAL8(s@t?)FG3]6&/V5O-PSUX(:<>e*,ZN\r%YtF6PY*IQ*R?mSd5VpPk>#rc>Lns&sY-iOC195Nn?<*1^mla&4k$jT4H2>.,ro[uIQrO4#cWBj1;S@VkQET_9UjCMe/-9s4p,/aC\r%U%U*SOrVE.o1G^rIH%?*U[7/\`T]Kg>!P#TW\X,;*LSK8_IRUf"D9/,GN-B430/Z>8!%f2_g)sW4'K;j9]N$>+F"qF\3g-QSpX*r\r%3894M6DJJQGu*`;mW=9IY;bCsrj7/nfCMTq;6.M?Rdn@&U^,2l^iRG""OpH'nNJPm>.3cf#JR^+KY$fAb\_dt2kR!bfWhsrBbAMD\r%4l$ihd"#n)6/0;N\CC+)]c7i[PBkiBHoWhO]O7&KqO1:J8%orZ>%-4Lnc'2,hnqnFT<@XTY4&RYqUi*],O>3)OrjhmqT?Q-9#0\g\r%rG.&]6=XX[^6QdTYT.iq:8Y2Vd6<S>e"!)m\@%rYH8aZjF)i!2HV4#%jIrLFe;$/A^dH^fEU8bV1a742&[.\!TX@hO2fq9EY7V(h\r%h'tI%AMr"7dkTcu)X&b2!*#gJl1*9T$[\N>YG%@K/H%HYIgq!AkmA>C3WL3eSN`7oYdK21;Was4`HH?h,j,b2a$Y?qmtaAFf$eqN\r%oh$_D[)QOJm*:6^_V*dFdLYdRW?YE=-->X%$FV3gBP+L!%$m^L")G^j_1Qj\m2%68IBISS#S6cgib])U!3;0DZUEKW14JY\5;[[B\r%QDW+%7^J7>*49-KC7FjobfY`TQa`4IA+TXtWM@qN]q?&!c@4j#:%U`,))O\Iko92<Ct>AMd9o(sAaVIR^+%f;ZLQ_?m3jF<i8W7-\r%[c'j=*N;HtYrd9r*4^%?Bb=X^iON/n=QtjC[3+h/_g)d3epdI@af=DCJ^t_BL^PSGRfJ-aE%?%:grga]n(Tc1927B5^Y!r$4?ahB\r%1_9;;HJBELZfpBO%#4D.R6\(U-a?eA^2mOJ5?pgRZ/`(rV":lh2LKUqk%:2*S\]VqLEd_-CG:!M]+Bn8e0fLEcP[05&.FS!L'ugr\r%,8f52KR64&*kOu&>n`"6b2:Bp<t7DV'o$-6KL+T`1`3[i\UD'`LM>F]1ZUa??g,3'0\i3UX4ki9rQnQD[=*&/Ts'cW;.CQ[lL\or\r%o^8_?c\X\CD*M)[<'uuZJiJOqDq^(mn)'<9\h3?R--0K/l$6W5NlQV:/e+\_XjQ>[l'pBU!It="#`UJr@;\f4q`K)*lNs#8:%UuA\r%cHiUulXK@BmFLu!g78.^kW<:l"D^+8T4f"Os0+G[ohu<t'l_MFBMs/dFDG)[oPRtVU#G.Hm%;_M0cWs?m7FVA8-O4?!o59i1Pcs2\r%b<FZ-.Z7SAJIDH-MdtW6N"H[4@<]R37(%ago4?HAn&j,p!0)QD*EHFK?DGu=>-`IUf$et`mGTJ!n%l`8kku.RWk'#]r2eRL+9,"L\r%.[YWc3]PO]>LiZC>;,ZK`JpQIf0)(A)chGr[L;)Tg:GiEQ6,78#7=,)aKYD`r8=$)5c=Uf<-IWk>UlePXi%!iCW@NfGPb)-n-YAZ\r%-u%dDj/oSoT2\WTnE%GVf+5S'k.kg+Ue<GBDtE3^1b*gr>eWm(3ps#?A-Nf)]PJ>7$`j6oa[*Mq/+291K<)a,bag89_oLg+WSX0E\r%phEjL`=;,a!m1(;;hg#"`2G_>O\Dnt#AjIt":*1^.ll%1O@OC5YF6<LM]+9ML!h$2@5:&YSQ3;V.C?H_Y?.*&eTq=>HI#(7;L,\2\r%Aa/Um%Q:p0l&:RU^pla$A+ium$fHcQ'&2geA#)1`(\I*;p]m>G&+h&NM>'+!dYb#h\$XC5BGeJ*?JDdC&kq>lZ_/`bH9tR&A/0c*\r%d6(]rDX);f3I88e9e]X-ELnd'Ms7AsZDX`@X7hS--X6PY+('r*E1S\g@u*V]X1tQ*Iokp</odI8"2,&`T:kQdjlP_^Oso,]'AP`V\r%;,Y['4^E623?b_\S#;1DPps)<CMkX9(Jbj.<[RGk.1:!(U@`R+O0pa:e!g-bb4Mm&l#3sb$1`36[5.:FFG4LA@eFj5BOrraH)n[R\r%O?9R!qYgPak_c%@FpbbMBM;K"B`14e+kX>E8*]PaX#sEYg>d&56J#eW2n"W@9<DnV!BA`B\q%c:*7;gP2+X!R)i9KEa3H!Qf[(qs\r%c=K^B6LA$n=RkU7%CU=LJ\A>$ls/[JY:)J63gSK*W.E.Sf@(UV>:6\_g>@da^.V2WmOl.!chP,(h-I6>=D)Yu8OS%EDg.NnPPe]s\r%GLp7&2.Xe=PssW[%E0^U*-N#bASKeq99SOZQPt@H^g3atEucL3i3(%7SdeU>6"$nfpp?X[N^cOrqCA23-t(NQ0BW)'A<r.Ej)UYE\r%C6m&[7arEEhS;n0Em;ZT.?i%Cd4I1O@h*sE(8u4[:8I'W#s8;In4*`8JC$Oj4JlVLQ,l3"K<Gt/W+!?$"UAdMk[hBS"9iOJkoWTI\r%!\/1Qf2P8DgadA-cjNVco>)5h)+X4B)9rr9R]3b.%+PTU?$aald%umi@EPie8s7)M7=S>M(-Cg^.`m>@E!,*MI\p@^Y9AublS-4%\r%^-85'[tOa5K&4C[-*CQSDQBGIe!T>P?h-ikVuQ6sD)e4gChnVdno7<jSt8pnOP2=d/$[P*..ti#nWfqGmd=jg_a"P<kJ&BZ\!^Cn\r%5VmV-8*D1\T\0MH#("NG4cOCj8Q%hc\(9)5*sVrPbmk62T=XHkQd\,bJVOaF:a'^lN?8Cp+e]ccG\=<?GXF93^W^;,n:G8L]MpWp\r%7Ug.Rr>MR.f&WP]B)068+a6'$XZT:&(J^)J,3B\:JQS/Up17PH9&iuDgQs0A(r+i_bC9VPm6Pc+.]6N&U,1C"]mX5RG?WnUTMW<V\r%Sk97^I!sRpmLG68%_\TC3k%WD,>/@,*[d-2ibk_TkdP^sBCM8^!Lf_VIWt^8<S""g4,]pmI(/3EDU<u_g-7SgQ.AhT9)Q#!:bU[s\r%j"=!XH/7PeVhr^ZB2sMZ^&r<K79sI11mn)<R]fT\)*d\UG,A.d_lh+\S`T90\559$BX.jf_(\ZGQ1kJ\d;lYpC#9?bMj)m/+M>>M\r%R[5[Jg.EOq1]I_F6YIncCr2+u)fHtnA*L\@I7E_t1<m3:h?p/_Q\krd%WUCioBj8A2$%dSc+Rl,%BW^]`/tDe[n?gkp;T;@(+eS]\r%F#8cn"!<dj)PG8H5'-&X6GK!N\AiiH_T1]f':N<q?Rm@2f=LW9'N,/<NGP18)tXj9VJJE7AD]07r4saa5H/]O-*Om+[ul)DljpLK\r%jm4a;QOOBlR&A^I(1,t5EGjo"^HiS'MpQDS4GXls`ZZ;7Hr2NQS$5\l,hq@=q-rV@1s<pr7t`R'IUYTkku[C0kAYVo`C:e^&$=G&\r%dJ%$As!6:<pX"CI.#rOu,FTNlZ'kYN_;J-hGhQ2'8I])9`DW#jC;9E5&N^(p-c2eXH>&3>0=GfeZ,4R#pEQ*>?qm5.pG1!"m:GpO\r%(2CDWMl+@ubZG9,2\%CU;sEG[/FB6;1$UH>l#s4pf"Ql9Qf1Im!V#fmUX]k>(d=DkMUS)+,rl^PK=)f!kf*D&$K#r54bfm%Qb2*H\r%kB8A)BqE;!9@,-kU^"ECZ6#1N;K?GXg6$eOdd`u=CAng1LNjHt<t2KpmahmT>oXVh9kE%[mUG+/cBseq]8N@%Z2Ze^59=Faj*Wnq\r%"r&FU"bi_Z&m$Z'a[@67b],(LDJj<jO:b>e&uM?-eFJp:H$cj2CFfh("O1Ql`0-g&icS*Wj=BW@]@PhCD;$!XO7rnM@(`A;e4SPD\r%FC&/J0<l&7WthlLbJo;.YPB/6(Sh)XY&<j_[P!cAbF<GfdF7dOr?R\tY3pQt?/U0@0VsHpF@ie*l4W:E_O^@SX%St\bI<anX/AUR\r%D-*&`:DZcBZ^&1T4C++d]=Pq+\g0;tB>ifnklQj=l08oEkq\BG351<:m=N#8POHqcb+/tbSh<1n`;<hcHb+n"0/K1P')rU&klN*u\r%*kS<XhYX1N/,Y0pkNP=Z^'O:#Yi^h%$mE<8%N@l'L?STQS6a#"l&oT3eKrMi't(Z>cI:ll1_A^3P%<=t--jtNkOqUC9PrYcb5Xk6\r%egggEDlHp%SL_=F`A\kg;"%Vcjg32"'&(VGO;V_M:Z57^O8[5Qc:)kDP+>7/Z(]?Vk6_Jd$tJHU<B"CS>W?da>nUu:dPW<Lf:7nm\r%92@Z0&T$Vs.u_*9bGV(MP\Jtr`bO>Yrp*^rOh*Pe?YqB4[?HZRa4,K\Qi69741h5u]CZ+BgeU5,?$tF57UD^*B3.WJQRAF8qd-$d\r%a\r>aK-tY6Pl0'#p2Md$e)Dtml@O@V7$bi5EkGtY/tE^d_Hg8VfM[q"=W4^YeE"RMMnA+T]KC5MR5B1pE>Ju2bm7AK3A/s8B4\VU\r%33Ko8[:EaWkVt3X=gV'-70RG941R`_C=r;-#^eK>^@n<)C>b-_cb@ak%1KpXG>r7KL6\b^1f+;#cHsBZ1f2)W@0?gMf]ir=n7>8m\r%aPc@uMo_.T6S7W7VYI>KJhKW[(^=?M/3IBV-2oE"_&'bC'-<b^r[Ut8?"&.fe$IgHG"?*.RnT8_p,Gj$pF4k/_K:!ipC"Va.t`G"\r%<G`6Y0"K.cj!c#9>n:"=AV`TFEueXj$&<=^F)aok++LDf,qQaf97Gj/(cD9B_/;&YB]bX!W-_"6T^/X.l1/07P8`WqblUfL4i[YZ\r%f5X2'CVp>#JjU1>2pjj5[u$f:(,V52=W>#IR7,9Qi!mrH?Q%@cCs7Bp]Tc7Yjf>Vop!piYq^S\pdR6su7H";8F)iZN=:+2pK35"I\r%DGo-$SF&NaCV;,g]g,!tZ.=iMp16;N,Lh$:P^<:@Yh6Tl08`X\1rBTTQhQelU$E?!er-9P9<qTYd'[0oV-]/tk-3>R7B)V!8$;M/\r%Q[6>PBC&MLh#S+eer-9P$a!p/PN>@l[[F)303NbdU"K-d!^AFh=WX-bONI'h>^:&GF%8rj-gC?OGN#&C:DuW\Xu)0\ng&]'\Wr!j\r%5AHir:oNqZQ7(e:UGE[ner-9PbK<Qj?gC-Xl@gQ2?HMa=V-^C,&@'g0Vpm5Z2p6pl<[E;8>?;%4B+E/1J14S^$0a\kc#qo]00fpQ\r%Jns$Vi3&5][o[OTQ_bh!m.Le-$k-hC6M$R_[o^'aP2bLFeN>6*Oga!p3'JB'6ThrnK&bl7\V3P_=)`OLf"lCjp'P^2Jp!#B[o]f3\r%$P;33[o`>$qXpXA>^tGej6;.H[8:F@9V*lXl3p\T`T68Mpa&V%(SdnOlq2=)\-.&f,h[?`M=YiR%'T*a''JM2g!XtbM=YhoAIjOg\r%FQlmY+>/e7Vb9ej@ck9DZV6rCSZcS_]>Ag(@"L7A?/dtPJc&.d:DZ'kei8>hD?p=V?Vd$#01hD+$e@$ED:MUS/'a_=4mOF?8O;b.\r%dZ_K>'.hGX--7^PLTm@&$h$04+7>^Qj8FR8?/dtPB($[MKpUoc8f5]5]);d]/Ch^-FKoP^?'1@!=%QX%*FS'1S<X,&jFJ+G>7&,h\r%/j,*uU]uR^F1I;Yaj`iQZ#^)%/m<EN4]Oi_D!/+VC8#f'cs%""CP(qYH8c)VXNJr978,\"B'2KoY6)7hUKD,53fR]Sg&WH=?J\G)\r%41coLr@-N-H:+ibB:!m6^t)n<GF.,t6LO4"j6i)k^s9+9LpktbH&<_ioL=iZ-1;8*h`4k@]6fr'&*f<gEEO2<l9Z=J&9hj5h*ci5\r%G@?a[KH#56(GNLCEL00%b&6`iqo.?B5aFP.?pmNK'V<KgZ#a/`[A79BSoQa4`QiJfB.Sl#RZUUU"_qH/L%Sq""#UAZ,oZR$c"@\X\r%"_qH/--:`@2;CqZTpu!]hRLqLkF&IRhLQR^HGQb9!:]*L&I"F<\O^f]ZC,p3#&<@)@L2KuQO5]V4lo;Rit\MDTpMGs+FpX_\8CMY\r%HsSesLo.k$?Ycd.[a5lk43pZg_Qt?D`%Z@Yc0nAGM++gqnU+!sNadE432OOZ<W?*Ne7n'm$*#K]K[lDTDjfB5Wom`07ITr]8fm._\r%dU.Gt\u0MeB!O<7WI]`H^eFriRPcC^HW=Z5"3JpV!kq=;,8-]<:IHE#=@#L;a2+Vgf6X4FO@0T*9NS3=ZSm%q1RpBfPI1u'RQ9H*\r%[L3LlQT75`3e]FB9WPl[0WKfDi**=p0!IM2IVEE/g66.BrG%c.=6l-?Du2:F,%usC+`1S4:L^,'0+-GMm.<cKp%jH_rr9iE+`e*0\r%]HkVYEXcklaSG2oc8DsH0V,HUjM7X.+`e*0"q9[U$-G-4))0.?'ahi4P(>`lkV*F9e3HEpHP6P!0FDA-#8lT6'#eXh`544:hRB^C\r%%"g6\7o9g+_daF#Y<lY7#%@AP0+`l+=TlT^%;c:XmjSE]?k"sHhQPI;+"bTG[ten)+luYe]Rg]^OsoXN-C8_u6%hN6H61MqlPP`:\r%1`.LHM97^"h*%+*C:E`[+XOL6N"OJUe^a)0]1@de*(M7p%qg%]*0EpJ26^8hM(lKQjp@hRs&PT(U>GWP/aTSTP\XrB/P0?QToHHf\r%mm:!VTp+@]X_rg"%Jh-;2jeUp]iZg0&U'VA!r_6,HWcdf!P*qCmfi+24IE<[h@#p';7VFih8a8<(Q`EGV]+j3$gLta-(V!bT\hKA\r%AF)'l88N(.#\-qAB13ilY!?LKZIS1#3;jQ2/lIiRIq';/PF^8W+iZ.Eq@Q:P$H`a^D'*Z%;+Rm9PSa1nP3fGs#r-Vn9f;Z$G.CMq\r%p#7TeYm[,P.)rE'Xu'<l(ReaN6C/Sf&k.$[D![<qhs)qV`\+X80Edbr20MQsa4`E.fL8qVF1sG;#Kt["eOlK)V3l:816D5_BL#""\r%@i)YH=aRg6NEqVQGeUDJgJBMkBV!>dKkrMH)+:49%6_CCS#b4LDb:`]SXa&J([/D5l[!DL:OOY>10^'mT#bcn0m5k#F01]H%m$,H\r%L^L9<7\DHd=0<>loB7dg$*!DKG#9@/F$+:*_JHX/g8/-40%JM5=f-$Q]:>9/-*=RQh*T<]7<UTL,J_s.2mYKF>saKU\A=8Co&j]Q\r%10c_$f:5oFQR)IZF`B6]6$Bh8?'fEpC8KgSWr:B*jWpY,bM`+dF^8F7>s%T6,\*1+G;3=RQ/ZHC_Ya8l\h9#_0(]pK"'g*g]C;7_\r%Y"n+]S;`P`?Ze-EiagsuI&`B5Mj)s5a-C4L3p]uD-[('7:EjI+2;3IUq_"=Y&M9Dd91SBIQfSshr"$75M:'4$5`Sof@:Nu)0gu'%\r%f+YfW\^(RM5c&suM(=)^p86EfI?`qCGL]ac:LdSSh+uU:k.B!q%U@1?NG\@Hr-]DQCtnBb:U'%q*XOs`RI&/aZ<NN<G:'Z\a23!H\r%6`L?.9qJGg##]E&3g8`O7Q>N;_t,&d\mXG?acs/&UtC$"FVC>?$oZG*8Vtf_be#YKqS\"A^%c[r9/JqZOZSc_NGN3BEf-_Mq76:g\r%#r53M`>G?"P#%0J3`.ECN8<LCq\I')(&b+R?,)kC13]oA"*eXYD9-O)GN_>I:T'T-Jcq(5[T$R8YaM]fL&U1OIjJ5s\f2T<g9\&2\r%&)606gum,,bT%s1,7!d/aim182a5p_"BQg0Y=jNnP,aYX1`<e-S4)$OJlb`8aN`*,<$UGQ1u-,!Z5OSs,=@KcOD8<Jc0_l)FBt:*\r%$JEl8)>]Jt]L)>!6:lpE_CV(e-KlOIAW",ep9[/7\tI>!KMC&ZHWm-%HY(>MA5=_?AG3Z&p9[.:iK,4dO?GTF1F%k3na+BfkcZ[Q\r%a0R/69@daGT,f#fZ-,VrjFcu:llu1+fpuDr)S9ra@R+Rme_#"S\J%=eFrC02^7APW)S:MkA;H3U3W2=;"[d*R?tfItDd7kLr^.D>\r%+#6U;C17n]>pqi\4;tiY$H$$>(mkoOOZK!AN<duC6Yq-">\Ld46:2\2cR?[gI6`t>'H9gMrs>ChAqQdaB@gL6Ep^`qXeI8VZgp??\r%jAKkJ[`ch<qa8iiajip7Hi]j>;pW2oWjoJF^QI[oG=AS"\ck6U05h!(lnp);nYoAu_u&t#\tV:ULnnk^@%-FiN)&KbL/!lJo.ldF\r%cT<'eGd4fu?'2JPYp*X`EED5T/m[/LafmWm4ikOF<WDtHj;-&Ob3cV/j8.f^HEK6/CeQA:p[pU)o/Eu4Qg!>IO8/b<'5?[h^!NRn\r%L%u)<^!LLC,1=iUH\&&\LA>$N'h)\IW!FenL/HZgrtAN$1DWc/eme/XHl*HRO]a<_KnuNQgd\?@fd+ep^ZGB\`ms5]^-'ccA.f4,\r%95U:L,<g7lfO*kH?eb"T8>NhaLb;e<pa2AlLb>]f+VN=ZM(\E10?bTNZrTt<5Sh2hq?FOG2jN1nUejO!OS@"u+5TY4R1jCipiQqB\r%MpGKr]LYh?+_2atiRsc?)2d]g,.\m[3u$4&],>GJJ)BU;2M2HL@HZ-[+A1u;4T)uX:K&rORWZ4c9mRLA(X/1'eM[-pm@+q7790]_\r%9#&=>Xnl?EIJ$0)>:R<uU<!]7`&=V/'1#YicK]N-0u*:JI(RhKh3X`jh_[\X3U?i/c(^?fq:?_0LaZqr_pkD9c."Rloc&ZY3E<i)\r%Gt5X*<"Zii/ti7?qP>O*<ce$`,ElWA_OtZc,XkZ?C,^4]Kiu(n])c.9++*Iif/V'i%j-?5,(Kb=$&NLcHESTf%Ld3QU%\S.ri^4M\r%40g'bdXLq=If%H?G%V\V\B+E@X!'m<^R;cBri<i,NRY#(K.Va'(GfGBBe"a)G25NGJ_J\PgU+dtk4,5#f:&&Pjm8oSE>uB^0cIKL\r%'bPboDk_Be[=Nj6$qRa?<GQc<07;]Ho>?,4an,%[M-VFXIMh?gK9:21JDJI=-OO+21WH2&R1@hVhi^LU19o!frigK^3pYJB]I<+)\r%b\H>ca/#qN?@g0P8[cdS"Hm9iN?"\:WuT3$AN1f[GMDpqY!CMT":P=OkI+XW)1W1m/tiW09jj1^kV3&Vb_ZG/3W;U)/h!;a1;Qm,\r%b2a7mA=CX'Vr%n+EK2<N+rrn<1I3Pb995*S,afD36m7t;gFn>"@f#Mr`&N$4,+0b`^NBM*[N]o/dm8VG`M.Jgdm4*2?UX"-fHerG\r%^Ch%@,a4L4(pTQt:,8M!k+\8YC>uA0iT'#@U[^.4*<oT`3i>0rH\5qicbBCBop$%V8^$@''Rg?dRf_(PLZFdeSNb4NYpKXKGEYpX\r%AF9ku'daj6KW[sML2cY/dc0P#cMg-a_mHi6n(Xn=gGGa>gkDt,"YrfG45#Hj;AF;*f1Q\."!;G'h/1;`$]mg6]jtj`2LK_Vpo:3R\r%KR<u%M=$9'J[Fp8r-KHmP7#IW`C"8r/4eO>4ImJc!I#O\?kqCN)l,\;O?Ij]F?KHj6DRPEIDp;AL5@CXA&&J8lX;.S4D3m5[_)%;\r%lhqo;7&78Oa0B_0IIXM_Lk)Cm>OejdaN!45#uSA$&[LA$CNAqta/fG-dsb&ODVu/`4\peQROu(Gf[2MATN.:JMB+jt%]44e.<b=l\r%4*Y(L?Id+GG4Z2)DdHf''K^Vq*G7<d:PPF\c/G.$LJI-).?'R$B56?b>>[M8[Npd[F4jKh`%l'`D334%m-J=UrZ/cI\-ktSNta[%\r%L7P@gQSHH3G`NNFA;3jaA+"?BP:30%f[2MAFSlb7`K#EE8GK6hTil'a<kIJ&%3`ke4a/`/MB2ZliP[YQ$>Nac2*4V]NI&^=!4b.J\r%e^W1?:Doo1ehSV*HOZNTpX:Oh=-^I)HC5GRQnd/P0clHVjoip*9T!*t+q7akB6mUIWH26hY$&Ms\]b@lbFgg<3(e]_3@IW.c7=G.\r%h.=21_CJ0_a*%OukBh#fH/U?@=Dc3.GQh:11`NVpAMDr-3`sRK,K+\VGHSGb("2`4c5:2q68IB43p*a(#SD@`>KtHKKJhRV?E"`2\r%5(qe2b27=$=S]N!+Z:8@/5I*Hj=ZPY`c0T:iBqE>"J1$=I#._38K8gma"U_<2;NKs6X9Eu)duo5M$!G`Hh>e7X2(ZRr'C=5]Y="F\r%RZk_\+Z:8`afNAO.&Iq6XjL_6i,-%[htt8]&WE7,o+Hop3C'dH9a!Tt9.Ih7,Dda9_EF0elNbH/NnSb/%Oh!APJe+/?V^>Sd(oOf\r%Li#(B&Z-L<"ggrYh:89_g5QP"5mX<t9fI=7#j\5;9fLYnn8o9+LdYjNKN;o+W1s#tB#\p+)[nt<=iki[@B/6[]AmP80f1-q<EpdY\r%([gGDT]2]8DTqjhLmFhsh6gK]2n'lo9'X`,Z('M%`_WG(Q6a'e$(_r*9@@]56;*L?F(RnNLmB<uU^1`N"LTN&ZuGqHP3e2Sr*'<3\r%,hX20BSI,MP%8b^8[>jl,\O0Z\<\E'ZS/I-al\qK7%N"sUbA>;&lq:+C.Y`,V11`>V7S]S[j6AVo1LbbMeYhXmoo>/$ZKlPppMI$\r%r"<sr6DMPGjn1@t9;%"PeWOJ793=V*W$TRR84$r_=A+eb,me?Y9$U-g?Q?/A)>moAl!LNg,;1jW>)I&dU-=jf/#_.jdC1D.*&U0m\r%Fo5?,\8-)8`%OF%("\bI$h`du"P@C_CNg]UPQ2]SLA@M@L,,^rQWQ=`8Ok$H%l75pS[>/!kjKMbZbtgmX='K4))RY7#g>/0^5]L_\r%/?U;@mRT)h<CF2>fc<YI/?U;@?J?aYLHXhIP%<n9oNooV$FjV8Bta\oE#))Ze[Vdk0$0D=*Dm#R[q3D$CBPM[IANF-;bQ_p$%/Zt\r%n5p89h*NIjOD#ib_V%?)qIV@#3ZBLY5a'N&SGV]CHQ<er\.3)H?@sJfQ@$k#Yrht7%I'kDOP!%G^#kN)%IFQ7eXCFE23Y>1RX,G#\r%<0EfV5%5?/<N3he%)@&uF_5_o_>r_8^<]Ba-@9ttG)]s1!mQn`_>j`-NR)+>i9G@k".8!>b9IG22[[@J>0[rh&17&g&uQtP-I5E"\r%%cDUCP^6VBl$V0`f6/5X3VSt<l8>Z/j27`LaJZXTQ5LlJVXIdck?daO]gafmIK_)*<Co?V%`.A6k,aG\Ug>.8CA#Jl.9T_N0eNC3\r%<(C`Tmi8o'f08C6Il,%s,[dBMBLL%YXpflU).r?lCUok?lEfRfmRoUpAk9^L4X0-8\;A``!IM2ZK.tVKCH)]Q[__LK=j%;Ihc5F/\r%CFaaND?>!Gr+hZPfFkE`jBnDRr:FdM0#]'=Ec@)E-"'6*io(W,.09>3CH_1mC0c>.d[B4a=Rroi:.Ho0J7[j9#XBt"Ac]SV8CXAm\r%d]A$[Z@[nA+:b:P#XU+$AjQ2\(hu?%UMtnT5go`G%CI#XoBkfD-8?3Ln]#lP]6_i9;Aa.G;P3?fh."AG[<TEb\Ml,B[CA=D_GH0>\r%O%_hkTC"2%Y+?16+<e=BFQ]D9eA@;9^pU6++(3t;Amo*)3-=gaZ8g?C?W4`nU/6c-=V-&@M-?/&2lWiJP/X+11uJ#LkeXA0,sIeC\r%Etj'm;k=QM@U-[?O!L1iY>tmt&.Yhj:eRdJ7e4ct(>jEdK,+m?]`"`ZX00_6Yk(dRiEo36P<SrJ.]M=1/T`Lc<4<4:Ua0=<H"F9G\r%.)U7;NK[s9,"^B5ab2Y<FYp,"=4OA=mJMpKXkR\;A@Ob;fT0%ak!=B'ihRH6D)f3P>+@F%Y"_E6rn!Y`:7=K#VXIeYMN_Z![7N-3\r%Z>Fnf4RX#O`]'I[L\P?J\7ie%`OdPK,:l2<^Rqll-nI1GDM&8=oX8,$[#Cca9]@K7o8(>j=3&u6(5_9mnmQ*=AGaVI4mB6/kjBff\r%]q3u-j#S%5IP[&FF.6&;6J?A%DSa-)bJ(7)BGhhO4n]h9[1"%f9X*E!^Su(b0p28/ese)])i(.L8.]`*q[H`LgoWM=rSZiTml3)R\r%Un_Vs)bAN;Rpo'C!5S00[GF=!YQ5@IRZ\6;IUdR/cYL4N@_]bVQ;"D>;=$4B4&\K"Dg[_`"(dY'N_eANq[K3"[alDKc5SU`mPiN9\r%qWZ'H':_"!fPb_-*`MB!Yg/`[``l7'+(!GOoE>/IAAIHe(NA)Yeh$8+d+r&0)/'dmOp-36XH]fYqN+=UN&+8AiteT_AkPDpT5A/F\r%WJsFo$iV_GRO.#,M'NI06Cr>*pSI16JS%3_l=@X;`N7T<25:F'nY9678JVQK)kCT7-6?:@4=\V89="Jf,p!'2Jp6F20J%<p"oL#9\r%(`#0I!]sJtOTVaX3-`cIc*'BM&,2[A)1G"]/Yb*QFFH[!q[jY\ooMHSL7Wf?L;e9h!lI@f=5\AodtN(/.[=G9o..WG7UT?pXhP#D\r%<>aZmE4R_V-E$AaP0A\iTl5<NS/<#kIKc:lKI$.t=QmB*`iaGpL5!pVKN/Qe)qgle;J;o*.jIAs"<F(A3A<"+I`69W7qPkTiVfth\r%$_:YPe`lE/9C8YNQc-,Tq%\!!7q#Ltj280K[9D@]0/F4gL5!pVE7+>Qi_&oNH/A1Q$G`6$N)`+UQIs;L`[W70K$K_o<Z+1I>n?Lb\r%eJVo&+7!Kn58OE&5oAh+66FTF&>gGAZ/c\oVe99ngKU)DS*(C[Tk#b_<ZrV$==s>X'bXElk:rQ1KnNFPCrmQqOH>?n\e3Be@WfDd\r%kmiM*L]fnu/M!ml=FB<(k$QO9!h9E]:7Ig&-4.n1ZU'f3ONStD/+'Hm"ASUH3<,L,4/EC%'a3X*fe?'^R<.*APJS`DOA1mjjg;QO\r%%R$_L`4id<,58o?k-Weu&bPT2oZ7^6S2U8'k\^mmhO6\iD.N("8ecQc.76k"9bY@m-Ru$RhHCu&\&Q^-oAqO5k-We`h/Wl1aD";)\r%8cna\M*+Afr50!u9a(C.W15abR)<-%<)/oG8kYb#!M2;g2U*?Nb\=Ct,1mp4&Oet(p-RoKfeehl0o&C?46cH)pK6plN52Qco+ZDO\r%$24+>jsd^kKsmGEV$?d[FSF@ZY?Op:lDcE<l7/aqh_.F3oC4Ip`9(-Cn:b2R>9oZYd.GVZ7Q[<l#!tnNV<n0>F$G0oa.$khIRGCT\r%Ej+ITRRla^AtBdmIE8pf*7%(o6j-j<kbTf@\UuOGoYNCX7.=bpF$H,7eAH50?QSFme&<1:I-%&@Eth8+eL_3>?rGtg\U4Do4>5J>\r%2gpm5NAc&GQ(,LAS%/E0[W3$eppsbARD!M\=/'qYd%nS]?!_;VG3H72B3DcOkbN'MaM@\Z*0E<\/!:.Xe,L&J,@W4e!?O6&8&WO]\r%fr>uM7s)7=ig:]n\Y"6O!I8p/r%a*'-3mrV&rn1t>Y24V7$+2\Sg.]ULh?S+JN+jilG7ul*->I1E($e;8r?eN`5E5O8ZcD],1_&J\r%FH8Eh/g>X%<dG33h]3[0q:a";WAU:X2Pl3YG&.SLeX5r+p^GF[Yqe_cr^tBH+[h]Cg?%A2Z!D'P32-ZuT7$ledD_#nI3"uIbfQ;N\r%['Y5:Fa7qtDj%N-.VnS3DcLn?]uN\="<7u(kTR"H`BQ"`GJC+743%N:Ta'>p\>.&L[-?kSU#lO&*g(P,KO7tSoZ[bWTr%b#8#YM%\r%En9Q$.Xk'=!rF[Q#_ajGN0H/22G6Na)Pd%K@4e"EWN-[mCQ+K7Ah-i[D4?m$_cZbQ1^PTYZdcFR%/]O?)kDBL<`]o0k`sLY6D+*b\r%d7QGdX'h]c*h9i@SBIJJ8bG%A8aGQj)l;qg!eMCF9@dG$VOmInE3d4.4h[+&n7G=geBJtUmTVVmSJf7bm=5^J+X%S&@JF:H&lR+]\r%b6_:)COlu`H&nVK@m`2P\(VAM0G?7l!Zg+?'>VEtW^)?0GJUmV8!:DBGU=1K+VHS)h6i@QFJ+ajP_7#*f6dHL@L@3rFpFPglL#.#\r%#7kVI%khC(NinEV0uKGs)i^5iqHj@bGjP5H3,qe**h/NOP)c'^N'5"?M4#$XfQ3>NReh0Y?@L"Vi<L#PY-uG[`/HL!0URJ?8:_9/\r%8e)?&IIqZGAL42.C8>F\b?'QMd#%Tu\um+X.?p'dceH/C>k)YaaUSPO>t(rbbL^_G]s7H[NWhI5O-P4A^`_MQ,=qAa&!TXkm:rE`\r%fu@U*T6\THpTjP9_F]n%1SA*A#Y--TkhqhZ4G$Ab/rgh56%`T_B:o[!)R07gm@t>B[](jDeqsHllWWmpYSju:#FNGc5m%NM"&eca\r%!JUXr8S/;J#dCb"@Kq5T(X<1FP5P"'LfM#VXcr//a7#Y>Ukf'm4C'osFG(@l?k9I4-\W8u=F9)XS:daD3l\<(f:7Km,R$D;leETK\r%6/)2".[nBGX,jm.Q$2Ybn=r)rkT+WHf=Cd]YELlR+9eIp4H,Wa)s-GTV'HOCfWBPOqTXrpOp(*)I'rLQqJl0#<NFtulH*CH?sgH-\r%c!DE=B=*OO]gI9^FjW[!Q1S)F!tSM<'6pG8!1hA/%GqVr[Br'#O99r5ap/1=LPP>cRn2L0/a<*do"k)u9AX!H8G498C<=W-UtUk6\r%l!?L[[00TjC-U]E/R_DEQi5!LcPLtV>jOuEV#&-DRI>PVp*3pZBc\qILK]jcg5gXE9t]5ubC8M6K1[mL2N0sS8NcB1^=8=&`JE@7\r%go)N7GLSLFo;7f^raj)u`0XY:8Mu9OOYPp<.;Src6:dL3*/WO$ZiUY/?'u+EEbJ-JMJ2rSa!%c]Ds%C<jd#mY't!gGEm\Ka,WW6r\r%BHF5(6("M&YZ5EP(5S)QEZC3`4SUMh,Ec3+@6[o;N`IdD"BK4ao6?n/6[3h"_^])DT<%C>UjCKG<I!fc8?+W)q&$nhA6j9MGQ`9o\r%kOh\3F6BhE5)!0Yqi.=s9?!'@$WVuN.&HXGA'&Gi@Jc(ho22:l%ZB97GF=T0_:E!GORn:r42T\m%aH<1mn!3BR^>Tbf=SYNZ-n*V\r%(uMSg:[!:<kJT_#U>KG.KQ*VK^\(=5)*=0#LGNp\r7g`?APi?#rBajM?\Me#[Z.miW!hC4HuTr/FeS-\^g1^Q+TUrq]GgL=eoT0W\r%>pRprmuP#!fAa2r;SbFQPFk)U+cDoE_7gmZ8i+6A;U<C:]lB)+,@?JSB&B+0QPFrib^SWrE>eY>T(DaWR]^S50in;&p&1fSqknOa\r%o<e=V*$tK52>Q2Qf(G`'Z!!`FG_DJ<3+H1S6"@UYHHF[6p>BKFC6g66eo@k_9iF$52_2#cQM.)gETcC4A@=Z[@B;YCT#CAFA@b`a\r%eoNboH.G7ZN;4?Rr_sFE4)4pNanZg:#!gaU,jQsFhca8J/>E/Do]/(+WdJ$%G\R]bOuUfqft6FZhnIGGdMlX,s0d:0KM'e#-bVg(\r%Y:d5hG<b+;]-V1bGj)W@*K^KL0&UZ@fA+gGk%o(o_'/YTf0/eIdbC/V8/20M,[%>t#t$M=fG5V@!^4ciJs0JT(7"1<`_f>LiOQtZ\r%&]1*Op3_E4T\Tcq"`N,*1,e/_`fF5I-Es;Qd$NJhn_4?jPn>bqeFB_[3d&3c-kCBIoKn+1.p?!prQ+h_YgN7#r,jm8CtNYCRqk!`\r%)%FTr@=PKY0X4QbdE9e&ZQ1?'>Al*cc.PQf>2PHWVVAT)h5/5Z"*^G1@Au?!IXQC]$IO!!^Gm7GIL`-UBa#[MO3Y_->C`)ZIf)?&\r%R"'9#D]Gi9n%.acqV%0tV*<64I$jVre$EP4Q5psD#QdtD$?4,uCae@`f)*fFrsgTgO5@3UafKNf.(A&Vc3q=/F*asT%I6fdEt?jX\r%)D!'L*.8WZ#$9gAQ+VG5nIfIE#0/2\+N!JQE8qU\ji4EE\Qj_lP>eC"b)^MpJX,7RZ3<k8qYX`gp\%J3@eK%+p6<eU@:O;)HNJkE\r%#@6rL793Vu8\iQbM4Yru'_Jlm75r3?#ea>T^Ls/P32tTn_+4J=lVau1c5-.G1.#1epV!Wt'[<R8YBg"^BYC.[NgRkt]/89HP`O)*\r%-l0k\eBEQ9rN8.;5aRdak175"?71#;NV*GMYG^dNmdb^Me(D'G^(3=^[_?f/TYUi^'\85F1KK0)X!Q-H\,XY,S3He-:UPXLk=eKS\r%D+f$T8sRBP5`:uT0#`O^Tk@_KU]MT*V3rcs3f5[ekQ]tF=]E0DqCWVOh%d@.FGYn]IPc/`+l8co:Tlq:R'3@S6DJY8nq7S:lQ:Q,\r%\m0V64Cqa_e!@Nu([<T=p+VHo_0/!*1VYl>,[eoKP<i()=^/;050$709GJ>1NUUTKq$"N?MU,Y71Q5*%e^0Tf?L6J&@snr<p@WG*\r%g/raL;d56"YGBQKm`$:=OX[ecZM/G41%ll4]4:ff"4HS3:U&sj[+JPO%r&bH]t\5/*5bPpLP.;c7XZcB*13RoF=Th'Q:im*0k0m+\r%Bc)%Ch=L*L$%I/RD68+\_r05)JPWtplf$%@gbbf@55q/&f'?Uc[=,Y-^GO7\OA*8Y;2]ppmgr$e!N_T115*]\A19OG+74mWLns&s\r%[icYfH&*iPK%7*KT_fO-[4]C2Cms1_/llhNO#<.nUTui%WSPP?D:j4#f:EI.k[?ZG3-l4.+;GTNek02PI.1WoUbg&f\@K-RYJINM\r%@N'PX.rT-kGK(SKT]sG=JhB?q<J[eL&5.`^/+8C(:Y?*CkqZ/]k?mgOSh>u@Al^kIShBY>/6<XOVsEg78Lul)gCNB01>NrJ93@aV\r%/j/_EXtF^c/necO?!ZGP>lf7?,C$eAoLdB#i8EkZQYK:eFSVc%oC[2oBOqP/kmH"a'\:aP]p7iJ'Xl&gQ-%q4otT;)F?=]>rNDLN\r%^K)\AX\@M4>th@oOZcu4>++N"]"#4)m@282?`Wl`KN?98G>TKW$Rb.mTt4im/mF\=Ne$[jZ9"1:ij*W:(<l@%h%Cen$i#/!guDo-\r%qQ-WPV9c<I!siQ&Eif0NNp(!9)WoUDC?J:6kutTg?os^HE#?8IQ>YkPpDB7R=Lt%rP1b1l_qV^QSWZf2(XDGN:qsa0S*@rk@BA0C\r%mCf-7lH,NZf%'KRFt<+4HqHkNGCeq*f&%4\h6iT>n*U74h5nAL\%<$=0nR/u_;,8?Gb-eRgmftp\tSnPS7@>F1Zhq5aLNRO`Edq0\r%;C'`q4'.(n.;%Asd=Fc'R.:La(VeAi5>i%N=PhULc;[2e1KF?,h2G`AB=WV8>bJV7b&Y$PXq-5;j+9-K.*L^&X7T+If=a9J"#U/=\r%QUj^2kZnMTq,gmpL7*9/2GaL:kqKp\%Fi2?$Vdj7"#\k//l@0<G\i[V_1<ML'gQD*6m]#!Rc9!Drfsu7kQSSn6,=AMN)p)V][32h\r%,XdaXo9u1\LKZgKZ/l@5Af@P"e4`/7*uD1q^"gr7=-_>:Tp!$hg9$l`BhRR8(rJPY<RC,>%p)kGLd4XD"(54CLMYnK=1*2KZ[nFH\r%e,l3?ng2$nF4a'<['AB0+.@>[DF_CgMLDUUQnJJa<<fkf0#41gkkZc$WjJB"+>q5&h0a*O8+$5bSttPog5'c;&i@Lc3N4e14)NW@\r%\6T>Qej@aMGcZ&m<V2p<pKQi'HQ^/nW(Q@EXK+4np3$L'1["b)mJ5oSbqQmsPI84GRTWd.QG?Hf9ePeLL%g-E)-pX5m,nI$!r[7L\r%kFY795<&OMN5i&s:\o@%DYo%914\mFV!SOfbl\ftI$p+H%2M$ti"K$;4DeF8C:A]HB_?\&%DgGQr`%T]!;asTRi`_fA,YNhHgg=:\r%V$(o/_BIE_)-,J1\pT<_GA\`$ZZC-<GsHETQ6mDkG0\+kDYq-PYMfNYa5dq,I5A.iQ)+iCGH/PYVT%,E3gZtJj.G1>l?<OdoZ)=B\r%%6mS&3bAM4r3k9Kr#,+@?cRS)f*#l*kAZV!a&hcs_144uemmgTJR8@OqpT!>hRXTYBF4QYdXF<2]CJGiW!k_R%6Qeh1\B/1MjNnD\r%af!9eZWJ7rd<BT&'6IDrVu:(?6*UQ4htAEb'>X!]p\O2t=dcA1<9nC7]qEl\p"2?LBcK/&mX6#?CJjfud0LD#PXbl]keDII11d\V\r%LnU)`4$Gb-7DWkcZB9+KN)":-o6fh2Uj8HYTVn0d3K;j#HcPmCehfS<HW,;ik=nQ)lB^sE91d<lI6>S=l`sqK6^h$Cd<0fU3[V^K\r%k86TQTdhl=`(1/j(_4E7EgO"oC\5X[U:sdj9u;-0V>a5o@DX"*1<1G[f>c_AgTj1lkgU1_Xp<&n*E1%n#:g6.*.q]q8i%I0*TT<D\r%<h2ek!=HeN+SukTr20'8V`)\iao^L"]F8q"OeBg?or^WM]jOR+C\K$B^$\sB8nrb05dU=()L\$9\8u%'"t[tsl/obq909]C;N*Z\\r%?:1enkpQhAAR^2%M@Q(kSBc;n9[Z>Xg7_+m-Z,8C:4F#=`L=B>TZ-c9Da&gf1a4CkBfD58Ri:K7R@H!#?BWG(/JF-L4hO(ALfTo7\r%1XN<hk[p7Y&W,_\aHO([qLd8^/?<r_C6Xb%Mu"!00YXuK1es.$<?C4&F!\9.-)\q2TYoe&hG[%bp$F>U&Rpfd@H[_[A>u%WIQl*O\r%oL2'4T_V95=>FD+o(1sAE!nSq#OU-/14;:f02jq=rr#US\e<$h]2;-A?%NRP_*j"^`1^K.),HSe>ht"7D=]kqe:b`<T!%>Nqakk5\r%nVVdRmHP>Il128<M=G[Z%TeuV:D[UU%9JlU:RAUq\g3d#4^E<Aa%+7pcdO2^[]<&kVb<0ngl='aQT'7fN2K<E4:',SZ*IZTUdX.Q\r%eiA&fi#_L\?2QikrrE(NZd\)tL;'63FA`u>?0LQXXtF^c/mY*nSNQJY>+qB8$Q28P//pL+JdeIefd4Ht?,6#uXtF^c/oR)9(f(sn\r%Kelt>i]LM0CqI9A_E;+Q\NPkQ'gnJb5LPj?Eg=`&r>]DtG-:C=$,B%`=]_(C^3l7&/'>iVjc^PfW>[toX*Jk@8d_9dGj%o2O6C*:\r%U4adIg:8?f/:T\mD!+,5#n1*km9GB<9sC23Ehs)MF5caOB1WntSI;.)1?9?k`mVcaBe8)iJ8;Y8qmsD`(:-"\+elRV@ki@,^t.F[\r%B,;Y6(NAB@c7Ua;XrY10j,Rd\)C<]@,d1j'#)JH"4^(lJqrr6X/.MK-1DLKGZ8?CI--9>#De4V?G@?a[KGu[WC"Q5gnmQ-qTUt/G\r%J/0fI*"^QZ+`El@T)=OTe\uOmF)it#.lbQQCphQ/Xl`_gY2C99`aW7W--ngcr8IajV9hI:?i8mo^2g=5b6,H)o--(h"+PE@jVJc4\r%0tYab,#AA/0D)C])lS<PQQuqKeA,ua8Ic'@*7@&lTZ6+!Lra`^R<];n<?cuI4%fu0X!_1UGR!dAIBppZNC13iC.<h!6[MlKT,4_M\r%L=>ITem'eEUG;a"a1Fu1P$-POU@oqD`1gG9E5&Gt2Iem?#+Wa#"]`O71<cFj<)X>:X"?][7R93;Oir'Wf2^fiBE'i2`^8-]`s5RW\r%k/[r6V92JHi"go5NN//a^+2"-JRiF`:EeN1SQn?K,XO;5ki141Q58)`S">F(@,>P&2L%SFM3t]e)k+SG9C#A#5Vn2.PgopAqj)%*\r%CKR%V8@;b4H:'3f/UX\Pf2qpWe/W:P*V9]fRokh]qpMC#8@;b4[P*<QU=OWFfY/IQ,%@YjKC*H_Q0DY,`F`o!(eVJ`#<2C%Gu(CU\r%T),23H81Y1Tp7iWXVX@((FW9-_D$^B0BhMS=R3q&l32N_K:PJr=tbV.01S2jVdt)$N:#0h6r0,@fD"R&/.]#lems&(Y.U@#aYR(k\r%Ut^O7$bjaRUd7re2N!7]Vm3Ta7>L*B^%+m`-frM:\r0+e?4<Z:jQuM([9a9<?D+dgRk.>bo`@j+`*+euZPRMHZKd2?C2>=>&<St,\r%de1N8"`n)7/#IVjdJUShc4FHHVcpEJ>Qf=]bbiMGc!GY'%,:/<aUE8MH_KoFf'UG(6rL?-m.GY8]dP%\rnUoQpinVCF6WCma2^h.\r%T5H<.I(Z%k(;8I\^:$TgT5LhXe^J);0l"1!3L7rADo^;@C-*S%>ri`/;<F,Pip"nKa<A^=!dV@NoGY6`.iH:SL$iKODNg-Z$XD#T\r%X%St\$\"#ul4W:E!lpDel4W:EMNU-Dmch%O/stW26[H=oi=4+WR;A3jTX.o`+XAo%`Tl]nZ3^.:0l`ef!;oIm:D][*FB[o2;.NH=\r%V([\#V[N'[7($#"e6GH9F@e5<2N6Y[Jhq#M]#8m*]NmF)4C)L1ceHo[2]A25`-Jr@3YnO.bK&(sgq_&phg<G6gCn^ZJP:/Scs"%*\r%.BPXENF_5#>;M"+pWlE;#?pZ$eM;&)(L.d<,OMmG=fHt"ls0>=%s(,\3u9n$&Z9ASnq-76etaS@c3;mRVrO@V3u;kqY*(C\G-:WI\r%LCroYNQh-6)6Ni2LY^536+qBo.kWEHgFubOo6,?BZ_`.a(YRWP)h/7VmZQ^SG4BQr@:k2@fgUs8_bot5<!Vbq7#[<'%?adj/(H,N\r%TEnVVbL3UlQQugP?*teX)Tu08npu@SKA\@X<A09L$a:J;+HW0B:IfMJ4,!tl=)a2CH,`rh0(]?N.g=qB#YbshQ>8A`FC(UEL0hHc\r%>@=,D4T#gD:h+!!S%paT"+PF"_MAZN+>arB#h5O/NH6_"`pX_+JJq!5R,C4=/H*I\7LV_[kIXU@Qj.kZV27'2d%aK03n*T8#ARW\\r%KK24#n5Xd-7dt\kcBS.l>qVaN=33Rq4ET,VqN,3[9-olhcabE8??]K/h?9`Y1p8c<2b(C<fbI9H0RLXfXl/YG?;&l"<".EK3dQ_W\r%!L9WWHFMN!_YuJErT-\$)<u<>eqOQ)d5(m6d90(+2i3rRcH[+V7jLDW.j@iR8Kiq0^:0?V_l#7/Or+ClkmXaSCP+Q&P@RSB"ug4-\r%a@l3^*bHK2UV[qlc<j&L$]NGn*44:T_$(&?agM`HFJT',07W!uPFuU?p-m2]Qs].od.V$-91GoR@^(93Z7BCdf7-ohhgrb6Et)E&\r%V6F2lRfS^`hAdAh!AbU"Ae%L@=qC&rEhQR[\V<!E#5_ms@@3aEi"*`P8bF2-IHO3F%!*o1`5+,iP/;,L$H'rR/)Ds2)56ea*JWP%\r%Mc47W_D")O"8=8ZL)DusJmfK#@DF.Gau-OD0Yh.K33`".p$>5[BV8?X'BcXT'/eAqbZ!c;ITpTU`t,!JG,D@a\ECpjKJ8&@#&[4k\r%]F4D++=,Rch=WnTjM6&kbRXO;oF*Y+.P6;i@m,MD/p"a?b>!Y8O,'929Lg?A@CJle20"q")7bJsXAqYjX0R^#ons5rro/I:kZH"n\r%i^.YpD6*p?(K%_trqq5&D2[XlLJEMbSQm.kY\*0AWR<:L?93<aa<D1\CZoX4NQuq!GqX:4L#j6,]U+Ys`T.rkL_X4on@=:gd##kG\r%TinZq2g40@(9a6p]<M`,0+Mca)Lk;`)nU3b,qH$uk8rI3V/o58cq,:u/ec!%eh/,c/kM'sH8/6&7[o6/H7:chEfmi999T7g.mIO1\r%^f5B1Z&=c[mVhGY-^A"=lSWj:;qP[K&n:3J]$c6s(CXPjSPn+!!EN\Hk$H0[@iUJ6TX>7E@$1q-m';e79P[^+@i&(;%@[,Gh^Wm]\r%`ZX$bNZU5^-A0Y$"_V<]XCEkuQOmXC?7fGG?E'3)*iA9Na%Zb'8OC<(]hbKj$JnGhfmDfti+"S)l1$Ng?-fE.?N]<J/)!m8@DS;`\r%1=ft?DJQD[X,]&gNU1=I?M?ieTK>/r^1_)5-Tc0@8-R8j76)RVGj)W(8(=YH?=VUC9<"Y/l4<:89TILa!a!\M:`4"()':J@QR$pZ\r%>saKUE0%Q2>saKUO>cR5G4@80c)bctN;1nFEAVi)U5i#TQ_1N5!ss`moT//JX0ITD9]9RLJh>Rm2KhZtDd=/LA!c7`f>Z.iL$g\1\r%\h9#_/lQm[W9`GFS8@nW&ZV$T(+2b\Dfp*-iagZ[0f\^MBnidCq$IOu&jbd3B]o@K,s,ecm.^"Ioe>#;2_*PL&H0[M&b9<_c:@_7\r%[(0>s_65nJUB%E+($@T.#cO*\82V#]!"h3;c(l4I+=<f?H=)?cIerb]+AQ^R^H&";gtN]2a-PrP&,i!WajZMhn!^2#Fs]`,O0NmU\r%6Z14dCGN]cD2t1/JNP0N4-S'^//GhTcNUpD+_ZpeabuHS0d?'X2p[%ue/(2clV)JtC2B%g^%c[rHSMh@4"*^619HZj87s\o/%0h8\r%%+0:X(M%3u)",5lXe6QD]um8INQL!fUc%]L1A"g9jlU"W;F)?BOr#r:Jdgt%Kcf6ZWp9E+67#br8bXgej(5R$O^IEs:(C18DIN"Z\r%)nY:9ad$E7C=U_XE]q&!?]@b@NBdtU<DjXjg+7#][%_aOcVu-E52o6n18`1?Ce5f,%Yj1H?B'cZ)e1b21EB"k2):a+/_@>-C1K](\r%CgV87]Y`T@KqM?ORTC=gXjDC/3:[FNZ]31)CY[!Y?;6T9]Y`T@Kp!E<YL#llge0E"'cIrXJas/#V\MO29$k5fi+[m)M]cD6@IW?&\r%fS9d%*?RC(?GA,/ZK$Qba5_X0JD'J/)nRYc`5FloD=#]u.jYRc94O<h`Ji0sjk&.M&(K6#gkTlkG4B;5_JLXdZ10!8IjnK9I#u_M\r%Hua-%O&'S>aO#1Q*Xp'"KF*VKlkp*E)K0h=o27`WB1-^_KZ%(+:*e*r)]pgl?BPE0`eTf;>4WS8Cja=NGiS`X5;k]'@ol2K=$<.#\r%]O.jo5rJ2IiT*naNOD__;Pj>V^Q[u(dR2)B>:M'Z9Q9eCG=A\%_C3O-fqS"+_p$TtAkhYdFpa2]n;cOkdcP76,hI4eBX6/jEK&G#\r%g"n:M`\e]AZG8T!\1;SX4CI6\`EeUA]8ZJJ+2_+jojE$^QG]l51AEng-*H\8`Y)X.)j21F\]mh+hs]K!0B(f[@YsNV-]W@&fXV@C\r%it^@pjk/l4B]h]a/9$Z:HN$h]rnFYZJ!/6nDo&a>K*r+\r%XN(GQbonC[1QRl70<Z:i],99uoc:&0[L*SQ`PirHQ#u-UqUCpW\'*\r%E/E!3-jjflPT$;oDcEJ[$K6q@@l2tR0p$n.G&P2,M(&B>3JerKIk/:8q(cuRq<kDEE4T%B]mLhF(j=@nYPe*2+2@1fP;&.NcG*p8\r%)+is=Xn"n9E:npB+N6$k_urHSp@.fpH)&+#)<6lg85CpmFc8hF+[*Y<hsDT+BRE;N?QSEBVp3],f/CL7pFAt*\'t?o_`JBVH.G5.\r%igX;"XXTJ1G9,*UL7[%IB4KQ<h-X`VY-+PaIof:o?5I,8NSOK=V']uA`0-SA)ag#p/q`;JpF6);o\)@Jir9r$WSoI)UXMdtT=.5'\r%]U0I)$S#>+@sqaif!Y;%p<`S8dp,W3.m"#2`P3>V-(<GZlaR;TpD4NM/Gp)O]U0%3c^0:1DYCgC\IK0p)uZ?+c0YE"?U\aA^:)D)\r%mL`o!/7r;\Cat',G!.f_1YR>Q<%KgJ2,aZ!TjjF``=#]`o:!#W@Wn"?R27ri!]sK`j2IP$(gLc%\!;um#W[NBh,_II&-fVon)TG^\r%MS_%"$+_:lM:]JJh<OQWp24;elH:iSQ/Bh?BhQFc$u^TOXnOCs^EgoE]!_\39Ana"AXGgS92ifr?SYWPF6hX+nOnt?(9s0mJR?:I\r%[aAiH)>GN5pPKicWA8Bs$I:BMhmMU_0BqrJ8@?D&W>\WKM>o5,22M1Y9WCSO>%.\ba_q]5nBfVCl=#ulj0#S5-q[Z<k?(TS^Ies)\r%DJEqGXhLJ:q9V7Tesa?lYC]\GN_K=8NPrZ3--3Zki>]du^]YR8P3)'"q^9?oKaEHNGVi#WI]U#DeRiI=qEc*h[bG(,Ma.A8:rcOS\r%^D)!#LlSIehA?ek$Vfj"f<`AYHpP<RGj*@(RG)98l/]&Z.,d/MbZJm0'hHlR$p&,iNqG--Ua0;>'a.DfZ84L,LX-D]Xpp-*R34Bt\r%P<YS"cjl+F=1pY@D9RIAi5$*`3]]X[(K*iFWhVp;^Iq.24R?TrBDe_Unl`19YfB*J=.`tb7/MA!)0`hJ8f+($FL:UsNJG=.&AVFn\r%iZ[7ENmP=0d]i!7@QZ_r8\Bm7ohdepUW4pYH]6[O)h8)8o]M[I^mi^l,/B5TNItB*BE<:uq=/UcZABE+`t2S_^Vp\eCFlO&"7-la\r%lO64+PQ3e"pc;8e-o_+`UPA=e5gW(3?K!0OOTXqeip3\S/A>"7EoJnt!lUH)5Y,-J]s!4j^n,aV"Ge`0+n6gCI-D1>>Bg`&^@Xq:\r%IK"a3:69Z30u/em^(-Z<G(AC7^7ltJ[?4KS>Zg#7\to/@(^'++jhTVPn?ILUh/QZdQJ]i\-79d@#BADHA6gcpPYe0rf>2Td(gr,I\r%1h_]kf?c?<.$@c#5\V=Ea_B$48]NWm#CQ[?d',Z2hM-c%aD>nF;*lXYehVa*]H/HY`.R'&i$a0CZ/X"Y5RXp?/;W=$oUT<Z=d\._\r%C:>:M9'X`,Z('M%Nl!;S,]5:D&U=P;hZb53bAecPDZ_O$?`ZS_IW_hB:TQlL.Zcl,3c;n3D'V+U*tlq=U['OSa,N'n%G]("p^eBY\r%lf_=W+(DQ"crqKE&"+u7)#Q:rUF;!1Z#;H]NsXf5CcisLj?j>6"J+'<ZR$-s9pCkuG/'$.eL?4`Yt)S/?`DQ;ph^G)RLh[$Aj`6)\r%1nZ0YK\sf*1*aq[K<Dpj;?ToBTSSClM@<NA:H&fR9)iAF?h3;b@79p.,!;.9l_gFFBG2DsZ)!Q\2F\%51-%KJU=&tF!3=iUDncbJ\r%.[Z58b9(f!?6,"p#W?L@BAG:e_e?fY%-m^97_d1Opg:lYOj&cCI\FMrfZt%gDmHh/#$lXrgaIfpnh</\D7"ukD=lMEVi$D.iI^e3\r%<tuP!DhHg+p_P3$E0\A'.Mp?JPGi;G89-8dg:ZNQOQ7!<8MZd1#$0O["\Bb"NLb:0[33TOVibL5"\G;3,`3?i8jSW<*XVUi!<l&d\r%H6e0_6kgnllB*>p83rDo?\3qu!<l%9I`_-Ho.3H'n4S#gV\UOpG0?$D-.""I-qNpu9*k'E2;#Fg:lu/EkbQY+%T#P!-qF].ElO)G\r%P!g7*0Q;TV$_[bDN75Hm)t!nLbV*,aFM7oMSdH'C0b[BFjJbYdaF\n-P)!CbU*Pa&8KN<eVp<]tP-u1u"Z2`VD&^_rd=$E?$Bj&6\r%9%Og5c!'U6o.*AsC%XiiXM_-]?mfUY9B`sC-qJsTfTOfjeV7h:rhalJ\T?IY+7tldiZ_L5JgBLk8]LqQb3+TA3ni+/!,dE`[,>h9\r%mT;Lus/kq"pFFjq-^G7WOnfe=H0UMcPoAh;,YpQ9>%'f5,_bUC%Tnf\^gb\*E0#k?p\o@![.f%#4e4Fi*Z5sSR^ZN[U1A4F"=M<_\r%QD@($P$`S:ZSs$?[=i.@^G%U!=pbhbk"?@2oL^6`Z<,*">ju,Z%o$RBi`mM'op'F;*fM<I?Fp^oao'!U%XeG_br_=)H-J)5)Nqpq\r%aQko`j>FunCV:hCqd&aXQ=Jj\;lLC-lGO6Y:!A1?,HhE)f68A?Y9hj\nsZ=J?/L2\7UC-E]]Qmd:1gaRI?'U4`s9YZPs:)W0P'*!\r%>*Jn/Y;len9/=Q'ADb1<8IhG:$l!r7rdE6MZCjdOf,OmrTkD<&]N/piB.Y^<Be#0T`lXJ`#pH+cCQ<ttn5QtDY:!u9Nd=\CNVim^\r%C]4,3/5e4,@20rEXb-Q=.I.q$%K$'E_lk)d/?6Z2h-&tX]";=Y4@.N/1SonF^[!f!4:@tSCNB'TcOiahK/n3`q";5P=c7-j`V`c)\r%JO#Jt:JGZF)YE6/M'`'\EqHcX&q1i]qANXf#0TaIMna%mF1;DP_lk:XnaP$ecfFP[i_@hMdOQsLr9>?2::?XehpZc^C9\!ppar4:\r%MiCltH&7>\d'MUNd04N2'L\GoE<^k(Jm*!7Jt<ceW5SrZ0_6fi1b[A<3g>V,TJ7f4CAH+Ndt?MB_GH/M=Wf`^d-G[A/bV-2S\k;%\r%Mj(IYLK[5tA.!(&&s8_52*FetL=g9fd)n!M[I?r<rE!PB#XL%#B!G>=r)&B#:!oC\%(4`T"a3E>TGA*AFD]62,jGY$/J_sOa",@P\r%H><K"1u>1MIT#jOEA=E2^4)6(YFsUK?al9Ak3D(ke=r8hlBQZm#)>h]X]b3OH[kg\V<ck)3l[n1ZZg@a$+dQ<5SaM\EB>)bWmJ2p\r%QkfQKU?-Hq`ge;K4X0-8k_rB%Uat9Fdpf;Y`=k=YDj'bSl#TS4dTS^@\i0&7LJO(Fe[7\)G5*=s<aD1?;jD2eP-Q[LXpnF!n4D'0\r%\i,16@TBi_.nXS;QN#>r:KC*$Q[_XuC'>!g+AL$L>"06m*<["@br2n1dP?j"1.epNAW^P5INgL'?,Ya[hpnY\Ys"i[VKJVL3]Ohb\r%_98X,q:]bS3BjqN7Qh/j^ObI3\V2u9ilJhlm(EtO:7ka8'@_KkrMDSo%*^B:M/9p]1@50d`WWd.!.H(,hOr??c[HNekpVep`n"CO\r%,VC@1U$sD7L<Zo3Li47Nc6AWWGSAbZ"4,0G_OJX?)k0P-B&<l+^Ob4g\V2u$p7'O,TD\tC9@1mo`k%Y)bgXgV(Y@J6/9!a-=NBn/\r%J=4T3l>FrKrS3,$5-=<$HbZslJ@'kg3d+5kdk&3YM^/tFgfp\q+cU*]3pPgD[Vl;!\O[=oApiB#Me>1kP:Yp'3KIbYGXN1dJs!Q/\r%ZY8oHg2Jajcn+"5(1412)h_H%hCts*YafAB?]mk(J`fG-YU(>mf:7'&-sV1<1eXdc"/&fdr]C;#6Ji4&SLMr((-93>:.fV6Qtm=H\r%WKm#C/&8h*W;-#S/+?O/?s)XjMXIU,cEJR05P:g*^S:W""8GPp#@gbf\aYLf_r=+b,_h#uY8E.Qa:*tQ:F,K]T]hEUY^!o3M-k75\r%W((5u3&Z:`(`#0IJe4Q'>3D9Yk:nO[?!E.!_a<NfU+1uO7Q,MbGq^dkE90Q:&^q2:q%_7)nmGS`r!MX>Gq^f.n:"2gL!Hm;:2`*t\r%=R5aXc)M,'H&MjC!iiKLL2un]8Q:E.%drNh$_:Y`Wp<S1ql;=@O*\Wp</gR0'<A'e75WtH_I=5m;N^%N==)^&'Dn%h'!abfl_+Xb\r%GE*dS3/cujoFZa^%_d8qqlHe#QVD&<eQVL@XcQY=KN)?ejGR#/8-Q@`I'F"bWCSd_X?o6'QBOs,l\ga%0Z/fQ?Zn3W_pYM3Dbd[7\r%EA=Vdn,I2Ls6ohlG*:@F2ERb[BZh$Odq44Z8CRqs9<0.pa8`S#:'@$$q^*ejc%]@jDfq_C2RRsP,6nje_$Ui*Vp0X0k0QN&ll5>"\r%_/e7GI%n55gdG$8QqpJH9bX4I//1r\@*!&O_nAs),4@J`cY9_","$2t,cAnh\It(S"t+OGB>Ggjc2Qqb9G*Q=-9_ak9b[=JJTD=M\r%ep1d\3GgZKV!F8`jL!SsOX,k.BsY"BV772#dq7&s`qs=2;0;5!'J[s&OrT3)$Hb.sOjZ"D!p8TuG@P]IhY'$<fXp(/@-`Y;7N(8G\r%FqFfO[H:/3^a_4:[H8`;=&Uj#Gh$g5=?hi^Q`gSbGPW1@i6/8I`m>)PZFRc;4#P^qQ.-e*9)E0O*\2+^]5bKoecCe%"CLRsg^1[0\r%?b*0oQ.015NoC;X4O=IA(D5TK"23'(i<R*`C[Qa[Gi+ZKq!oOY@o%q?pbJPpF.n`lWK5Cg<g_a^pcpH=^]eFUgaY72$TIbX(J^6b\r%^4i&R51uiSo-ik'gt[\WpLJ4RN[+j^/f,T_EG"ET^!K@2.NR!_iQi+H,.0a`E6.u2r/q/2brAXRF%!)<&U:Bj*0Gro,'e.SebA$Y\r%]RbT14?2pfM"l46,WQ3%A=V/%T3l\p#^6`2k(m+W,%!PifAqI\l9R=_aCrd(aUtf;.Oc!#`6&YUNhNZs&So&`DTeItcAp+&."13]\r%Po[SDW5^ZSL:b?`R](^K,IJdo)'[jKiSoZZX1Kt?aT;&59$@lQ&%-Y+OH6]kTJploNedeXB4!s'Ma?rAk%WF">4QuYlA>);g/T5p\r%C?tYmik[#+*Xda"ll$\t]E!HhA"]YtE'LloC>;7ImZ&2X?@[Glddb\&+Wo)b0-L5H<RUHD2I":%n(RFqSr+V'!""T\W**W+UbSB[\r%`\VChf[Js-;7(56#[(Z5UbSsXB5cPke<@FOJ$8c(#p^ni2Loa%m-@eo^\?TfHd-[0(4DP*V9,%;j;>Fm5>0hSp$8q7m292roo%;(\r%lfT=dNPCHe"]d!tk6bibkF3QC%hn)tS];>F4BQCUFjmVf[5li._^Zq-@Wt',_C?h,U?D0sYR1nM`maN#=oh,`2u(!]n-tuk*J]\/\r%TS"U_J^0du$VgjdL)u)=K4h3HL`,itn8e"p$?UBU7uW)@Ib-qNN$npl:!DNY-(C>hVc?-9%V,B36t-@K(U;@tTsAOQ&MoS$cG=#:\r%n!4GaJ:klH5a">hj1ldJ@]&m;'RRhu,Pj9?AjlDS5j[H"Kr8e<eMbN;b`K+8q%r81;p!M)doo3OBtg%L^M#%h1'9Za!hm?ehn_H#\r%S/aZbouj$J/Ql+Pb,pD,.mgEdE-4-bF=[<)o9Y3L#9juJkitH(KoTNe5Z*GhSR\k;Jj/%6=,U,aKpb($_qUV83GWKk;K4d1!+#QV\r%TRedeoT'k\D/KDIC9Q``If$4H-I02a^\1u3#5M@gR5?C?3+r9mjhm[1oC.hN=eGlpI`.l[L6qujHI)XZJWA$41C"?l=kbu\beQ@?\r%Khm70FDtG!3bWCnM'XNbqn*;YN7H>c&\&Y@kdteo$6:8n3dQB1CX,5u!Za+'#g54nchh\crGZ`[kO^r<J<jFu\C./D1H6$O+3INQ\r%[NDE:8+!3hX[LgsqTSp)0&?3H:N)h/YD'ps%SDiD@d_S,CT%2R&kATl8a:NSo&jFDQ?mpBLb3c??a4iu-Qe8]et?%%jMO<)^X:6"\r%>)$["X&0oks6-d!d(#LAofpV\ehWji*BW3*\:90DR#?W]8Duid5sqeNbmd0Xag[Ul/%)1VA$#C!qiIN$:+SlB+%;oi!$cQk+8P@#\r%@a@+hqiQ/%B0rR\qQX`-,<@KtbC8L[CV;n>0og8"DGN+dOm`^9jtV>Y,@>0l:ZK+S8&!K9(Q3RNe+lg5P*]Dd67nn?(u9YZKj'(V\r%rVut;kS9p.d;T#lq@=m*"R45%ZD)g(3APOql)o@3rJlF!8$Y`qQ.4$0(>jEdUH<q6KNTTkH:(fjgH8O$oWnUTDs=TDW73#t9'D),\r%j%0@g)\]9*:??dnm@7n$=]VNV7o..XVRBH-.q2Nc-g;M]&g,pK8bE9D$t%g08bE9+P&R9Cl^BV3NcZ;C5A*_peq1pe\<U?^FDmZ5\r%`r0>ICAX#p=5/YfXi+00a_5&u-\K;\31,pY1:Y"CU[s<04+]>XL\$>i42Qel`d%[f20i78@sP&a(HZnMeNb"%A$rP%8O@ithb=cY\r%o6lfslPo4Ig;;5FPcQ_poRCYj^+Z-pE-7:gl>O*bmNS>W*PM$^>pRoGa[FplS/?.Mj0")A=\j=i+-9XT"eJ+hgsuGtmX1I2^S_$O\r%prRc#*'=q(`Wla,f7JlQc&ZQbK^c2fq/T_BWT)6ED3.l&i#ER"_@]p'cWU0q6e?P.OKJJRY4"S\+#i]NUWn#HqEe^WYU2S*Og6&q\r%lh]ON]V=G>EW,fr\P[YH;7XEU5A=_F_`)@MC?`<u7eUlG4A+WBDOMgB(/(7agY!!L-Zpia)/A]o``<eb'OM[U7O6:u.'XYPb5Ju!\r%<G;ohRWXti0d8bc-0m'Gh[%.W2?8IH&Lq"Q6?6?HdMn3rctanh>)5k%@I>Ih]6rH-5VlJf6W`Sse17ZRa#0X[oS*^+A68EU4]Y4=\r%FZ`4@%X(5Q1eX+]he9pa`9mCp)T;@J(1]gLn*OM*Tb'j0*i9?QOuQ)IL1WF*Ne8Va*p2A"K%%;Vm)e:8WSBO>_5?K0hBB-b9B3F.\r%]Lo[`G\^g0b4md\l%1mA@=ffeZ.!KgVmbC.K?@jF&SMp#U1<BCgUEa*SQ>/;RL2NR$TYg@=l4s_mHs;MY?mec;g,n/5<k#)rq]NB\r%MElV2`6q?p?%(:om3jF<Y]!+VfnM"_`B-tBkM1^%b4i+<#Q:[UZ9l&RSt?+//]M)8ms=0rTVK%#LgLmF^KgfFC#]dGp@#KiOn:/0\r%CgJtKKD$3+[5+=biIOpMFdWDe/;5R5B).d$Z1A8c0nmKnp>qrjqkoESYErO"2JbRBI]^F+K>A-8F%(^o@`p8pPp!p$$*5lb,4)e`\r%4lT8)s8>"H>Aca.Z(8d,ig"$E'@HsD@]Odk0\>[oGOk(WBn&0[h-9a32HmtHS[9Kbi4cj$5:V<2AHU6hn-o9&n)EH@DXscIf.<6.\r%8Rj-i4<s'chG3seeq.?;ikBQ\6N:S0!k;P)?@SLu/!ItBhKg,EY:-ep4neJkBtA;kPUlWU0Z$TDP7HtWJH>W9?C!^_mNl>EmJ-/R\r%oE;e^a[X,r1-3*Sbi9Q[?%$,j2Yn$iC'sT^RBnn:qK_M1m2b)RS(%.3mnN=DV,'^l[KWlP<k"%F>"Vu$m,LBdG;u,<N!PAA^k8SG\r%`.KT7QmQnWE7I0,^Q6^M6&F8-(QK%iHG\VR*b;@*O>gsb8JnY-eDCQl;c950k+Inu0'"D?@;BejZ&KR^NPFkiAV]t5M!r0'4i#Tl\r%p`?0k*4QiM]+fQjEiW=-"4'0"T#8J4dmP^qV88WQV`)\iao\57]EiYNkm\use[mTWrPKj#Q(b+!X#t's[otGQg=2^T%)L3ZjO2c.\r%\]/,qiBZ8$R(kJ-B&>dkO3QNHRB?@OS<=dt2peY?YSMMP_5ek`%ZKYOFE:iIV4QI].7Q&4eZ[mT)Ei8I?I$IhG82,Tff5PiJ=33i\r%r@`r+0q]5%cOI"%o5/;]cLLX&d"nWJUn)-18>a#THrFg(]6TlV6E?qK1HCXB4Q[rFP%4J'8]QJMFOq,P$?LY#$J#I</n;,#hc46L\r%DiK`o<u4N-acj1\qTmXU/>mZ[C6Xb%M`;d_NI_>pCJ.4Y"K>Pc6%1[m@bY+-\r9-?@pHT;`:_A,GR_O.4>dO1J;6DEN0Ei\duC!G\r%ZTW_>cm<?hP9?/"<ROs^&)@o;kipN\O:NZr']eM!@kgiP/t>:<\@R9;\u+*J-dBKIlTTs!99KIFYi=sR)%iaH9:Vp'mc-BiMt;$^\r%ZFKf=gXG7MYC\lBr):j3T!#W'k$1#S4Be08Hb)PP1'R;lM/-[k('V0&c$6i!T4he&VtIf*VZ0hfrioM$aI]PBX\<.d>s)>Zr&n?F\r%>+&PEL,)P;73gYX/Gffg;@5p:;2?i/^3+I]aPQk8B"U,L/j!/1XCRR9Wm-eWHks<6gu]Z8SZAA6AOe6eh;EH/E28YCA&B>7a3N4t\r%A-CA]%HHo5Z?,9#GkBip\t.#\?l*VAE]buVm9HkBoB;11gUR`RQ,Cn$csA_ugfrEiV2*%==LtI4f5Ng3ipHkY1$e98jmI_[5p(<;\r%7.b]nG'E3"\C]UQ`8.hrDrFV^c9Vh.l\=C4EXoX!Ui%Tp+m8X37)N<%2CT:(deO^Z2CV\^jjAWKD4#A0(:2nh0>MSb^%Ujf$,#gn\r%8VkYeBr5:L)8U&aNXJPtJQXTINiQLWjgaYVF*<jbL?%j'5A-2*4^K3/JK!M:9;nY-6e)M$X2GTtGs8eb#(1]hQi>hX(oW"Z(VD8P\r%#&<'p%_kGGTSE-B'H3p$B,%*EJ9N<BkF,"P.WIVu9@&/"$,-o.VPu<F]_(q^F,1shkOhJ`XqnLo&HA'f5TGOp:12<\])"]Z"<#.P\r%>,uVVX`cU4]k$Nn8^U`3UE+bXG1sWE;cO$m@8=#EXfJj@#h^UkJp/*U%b7VuEK3G:q3#*J*u/gD5_Wed>'tH!XT;)@Ri"\I'!S,g\r%^CKf?(*.37:t2EnWU.6KJCF[GXBL>B%SkWaZSpUc/D(OTa0VEV\=RPV(>BmCSp$0ab2i2rN1ej!;-f0P*hXI\RFC/&#?tA:lf)7T\r%.4/tC[F7Zb0L.F@\o;7un:kQ=:*r\mS=u>rq[-"W<_i`cB$3E"P('S2`Mbu)cVehgnT>BhrS6]TRq)AbRsn,@IHg3KB&cr`gR!B/\r%R#PIkQ<k@`nuol=r<W`o(2IRdfn2fdFL?O(IGA[(Y$Z?oiJKJsT\oZnA=^jMH8uu33L#'N>r]W*D;\CN)s-GT,orHA<k`>Ik!a\)\r%;F@TFhGuk$^:n@4Rnc-Bl_%0`\NS2D*IVS-MDDl_oX&HaZajo!k25,?#e7o/?8QbYbBOE;@NUBp)%YF3&)T*if>Ng4mRt(63kiID\r%%l2!UVB.8V%FfZ'H`iiHESB`[0-.Hl?^Fh;\7);EZMAGLdfXoNZEXT2U-l9Kp@/"`^Ur:a"GH?F7oP`]K"1c92;0+RoFcLcZgkLg\r%WPOM#@_N5p(Y!d)H"\BQ]NWThF2?J6dr(`7d:hC3!X#eSpVXYkT_AoOC8H^[_5X+UpfTiMgj^s3g:PpuAPs0,PeFu=3N]p**/5M^\r%U3@X`&tW1Qe4FAO8*0a0\Z)tldpLM7CfniACul^D[g0'KU#nBuLk5t;BK1gWlT&E6#S#mi1M5QM]K:-3@%LbA)smB==-rUHb/\?-\r%1^qIU4@m'>>pYR&d%-fqn3,FPZ(#$nn%g2-!\l*J*M[X'plTVD2$@PO+W1^+m+:*liOmn.s)_3&gR2*R=Gc"k`Y&TL)1:%/iA6SK\r%$dG"/m9XkX?N#&NUtg@Sp3i9qR2%&(#=`1<,!D3/%d\S^e4qK^_'WR'keRpCFr>J,[ki[SjJg_s*#Co4(pdq^NJ66N?>h\u:cbB!\r%hq"khl+q<oU%do^raODdh+Mb:<"Nd/h-0:,4L&Ok7lrSiQl5+.b.:.kLMqJ%]IjeVpt?UV%hbu\jnJr8cFsmIcnK%8C-.j(qd^_9\r%\nX#`h<W?jZS4Cf`^=,e^6tQ*5\eQK'&27UosO;qq_7?&n&Dj?s*tak0>]s3Z-$0`H/%>neTsBJI+f2i^IbX9'@&a!jQekZ8nT`j\r%I#%CA#Um/Wg/fqu?f9iAm&#Z@]"#"l>=p'_1E>2>aA@XOrn#s!F@ie*lLOIe"^0T-4C)b0LCl[Tk`!L/RH<g<qH%N(S>T#CD-*&`\r%:RAET=.H23`0H(V8s#rDP&49e3):?hThJOS3)>kdgTE/KSh<j<R]\8_ShApe6*?e38WLZ3Z*IY]f)Ug!g<?]ip2iSe].`'\c-qC'\r%qj+9U4T>IEGG.0*kbQW3>5[6$93_UE]"j^XJ3<D<g4)_9`JP,"+@@SGG"HXKQ_j(@rLJc9FSU+5E:n>3h,2)?--jtnSk<e17@^8k\r%?>`PNlTVk1[<_d&D-7-NP`um!=MAr2V>KF$YJ[I:f4s!VB*$%CA$j,,\_NU(=P$'O?SU<G-n0hhn^*^u322J)M]@o$@-<+^`T-N`\r%?os]#gJCM4SI7D@=%S_i4-q5iRT2B%\^7t:?.'J/cIL!`hj,5ULY^536+qBo.kWEHRkRtdHe_n?*M[e$nSrd;:Sl7l[2XVUmI%9N\r%>ia0_541&iIj%=hYsuhk"Na;Wa=)<[[8O-D$C^\5d]afQ*V#!.d]cRb_YY\JWWg4Eb?/<]iJ%RYgdOP8#%-Vm"H?s^ZK6T`/'=uo\r%GXenE*#EKH%*3GmkI>X-c,F]tpZlpe.lbQqag<$a%Y5N8H<C_>;1TX,nI#MJBfXa0%1Kph_P,%9%K+W4]*Jkq^gfE/q8EPQi3TQC\r%aT;Q%bR%<dTE^-Wp00(!pp-`GC%@5Ro;$p!.Xo+T"+8d)@a,Y[W"bD<(7rKHM@.kKcjSZ>Q#>h<3PW6XMU0I^b],\W\k;,LjIlt;\r%]fA8^$E!E7IX>.\mOi^%K(G#ECX(ChOfiqPKi:%V?LW(fkcj0VA6hpKJ@heU[oa_KRC]1QHX/9iC(gjKX8hLV#0g%WSCcqn)RtdP\r%;YmpqbR>aa1NEgGA9H0\+q^8@6Pn]tD^hZ@:Ba66!j6Wu,T9f)]V1bMp?TuWi!ms#C.[YcVEm"n]QB/A%$ZhS("R&4._^l.=t^(Z\r%k"RfD;=!<pot%dV`mT(+M9#;n4EAAD0*^0t,Y,$1@^(:>p<mW^?4=7q8h8B*!K5X=?4<Z:33eHm]Y#Us*jAbb=tbV.01kj`>ZbdT\r%R'Htm_(bme0,%JVW:aUJon"^rUXn`SA??Y8WL)J+(TGuDU!sH_h!l/pc/d$2qHj,ajW@%$?4<Z:TN'm>/5H<Qkh5-h/5I0Ph-J>h\r%P3#:71it+'%0s_A$b]n,-d.]ojWup-X]NrkpY]`"R?O2e@MWE$oo`kBamu6*01h1/lc!9*Z?&RVqf^dL+,qj>#=N58bjVP'E+$,#\r%d_FNE]k/m(a$h"m6+9pYg?`Bm5"=o4U1=I;V^sY@#OD)PG=9mLn9!X<m6q=QSE]aA2gZG2QcRuho_<Zd]/EQr(Hjt=de-&qp7ea-\r%Nn0.[h-P2!([Uk"G'c)UQ0qN8A@qU+qe%W$`7"lnKhu>eJNR52;[QOe(!+i-;dZIYY<\[3EupgOgPk4X17VVE\J+/j6?fa.%M\*j\r%6LT?GeKrMi`?T_K^8D?Z'uIm8#4lrqUt3n?Q^@*N.c7[*CmWuM*JX#lolSGh&I@oKL#?<)Ge.:ThfO"WC"7l]\tlR8%tQiKOt;8K\r%MP@WgN=9eV+<uaLn*/8!B\_7%^Sf8abD*'q9+'S`$Ld4'1`?YhF;\6cedAU+Sh<Bu\)t5Vn-gP;\^!cgiVhgk<0pr;A^7B07Rs_Z\r%U9KY<g:Q4e&^\ZP!RN<0ou#i7+$5ggK_2NjFo4#tK@m_nPs<+tII(4ALd[a>km0ipA*:_tb/U2a4-q3s>MoSM>j/c/9=ff/\X`W>\r%ip9q.Yu6'L&8>5MNo:DVXcljZm;9n,dpdrj]??t(Rd'15]=VH\Yf>VhdTKHIc7V<K0'qPnFEWf&>r*(0F+WK3H&3@a5<h^<(OfHJ\r%X0D'Ek+/>WUFu%o"ijn`r4s1nc(_Ad.kpG%7(N!G$];PY3`(^QbD!pf"G+KRGrhZUpA/AUh2GalB"<M7>\LPSb];AVQ[8X0)DZ8:\r%PbnaoQA_78l4^+)G^0DsC,"\78:_]E<TeXU%\""m:]l2hUL-]"TE_77Lh!(^9AVWU>##\4^.<OR+p0^lN+0FMfo&8U.W[Z48Cu@\\r%fB6u-eK6e-%527b#)6H/[L<5Od*"DYcO8<7[e;>Zcg,'SL?\lf0"n02+cbVZR"jg&nE]KLh4*?6?iF"9(-?:6.`o6<.1NVMSiJn5\r%\n2&2-u3hqY_`9W6186i*/As>$E3GN#5ZN0r'K:pe>5fkB(X<_eYRH_mUodqbm\]:V@:!TOT`o]5c[-V8N]DUlFNm":3ml9OMi9g\r%bhO:]B5R-mAm!MDPI84GRc,eT>@>V?"(P21lO+@W.)>@AXS$%AJ\aK-lN:q"d.l*@/m`j`?Qj8nOJN_her.fHL"dK>eTrt&^<f"Y\r%[FXY./G:a7@e4ULmJG\T=)uVEZl(Q]9+mA&BJX%XclS2Ll^VkD=<1aZoZAQ5ct:(pI=>$Ibe;=U!f!D4R_ad[eEK;.(fAu**JWO8\r%<+gIZ_D&R`MQ8cnC@<*7HG>S/,8,ai(SW/_L10kGlI37.(kt<n3b-$I%;c:XF@tLOYgc9&Y?p'<2*('tKZuB5oMiE)hp!F/]iU45\r%!'*rcER.(+4eKT]4B5tV:TbfC[]mP%f?hN@cE:d_=R'#&f>rtQjE1tk;A8;Q<d&_ndjCb?1=e4ALTX:s,Ednf]9cDamF363ZWIU"\r%?(%U[k5jc][4#^HNj[(^BG%e02V'X0hM(#/g,,0M^X'EuSS9%W\VC)Y/rmJs)6!9JUOPCm,["BTU!7q0g3uCF?Zb-4)F-^P)VVh?\r%grZ:2%II+^IC5$&CNsuQi;[C>l"BA2oD&bXEaE(l/kPb=]6%Q7EalQ'DX>4o$i7O6N*VOkn$7-4?CWF`0"Cb\K*a8U)60/SU_a-p\r%"k*XCoX\Z]]bi.Nh=LWdpU_c_(q]d(<:f"&%&rCg`if3LI7]0u$`@`!X^+8P>pNJiIq':bZ1&V5XMum+qh\E<`mNEbc!`*s(q[#H\r%gM-$^D=!u3g?<7dVjPb+;@h:d`tg)ZfEJSkoHkES%&*8kjr:od8oe+IKG_>JDt3)^g4M%`5uVrR2=`LIab%D>rLQX5'i]''G/2c'\r%d-s;4Vm.bWn,rJ)<V3FrW0!AuE-&7'>O9A4gSL@-3(p^h)qM/ieiUE]84=-]0WIb1i`j;D's<?"5@`=3&P:#1GOiriM8h/ECK?qX\r%@DAA)anX3mL?MTCNKia_bFCNO",pOLlFX0(6B#2n-^S9/&n:3jA<4-VX0KiQgE`2o]%Lj<T<^(GVu+tdbq888cSdOCX`5TWGr8/k\r%NEnAR$9)I]Sp3N'lf)UEJi25ZY)B'[95e;ceobshG2YA8\ZUj#EO$ke<[T9j'dr#eE,p(VTAjCf"b977Tpq89$4MP5Jl2k11i]JM\r%gX<9DS*&L.*8d@'o+!doZ.78k<a/j$^b!6Wf-9irl>OM>DMg@[HEktKcZ)]&!igP8O[$gA.i8jXd*:_Ia*mDk%'bqY7Ep'%]/Kl5\r%Nh(a3\+;L?a(&'?'8ua:;o?`=BhdaGRES)a2RbKqOjEK09f>%riO!Xi9Fg5'$/1e`1pMpj/rm=7n?`F)nffdV4EsZ5H-T/EUgSu!\r%S]MML248Z$1-Cg&h*E2FP?AgW!d,i^,RH2[P0>Z%E&P_?*mZt*Y?)l=n+eTP-chCCpPhP%U#5NA1&JCW;Gs@iP^eeRjeS4F7:?YS\r%><$EKP]lI'gKO9CL8dI[LYWi[BD*Y12m',-[nj+qVXm9pbgYul:$kVt$8u[QYSaJ\3Q)Lme]9]S:,8l4WPmP+X>krG]be="flfQ:\r%X@C3nTHq)e)..A?.Eu2j3I-=pdgFLQ&"H]<4KT0%(SA@WjQT8_Q>UGI:L7K!ZpNsp#b"gSRoTfaY-bQ&g]A$@Y:t3)+m:M1jqS(r\r%/%#2lg%,Q'V\MgEnEfr.amn;;$^r(X4?4JG.0[qU&)PqBpK35Z_17MNi.,4Y6B'@F"_kcZcE?6@`i`dBTs9Ni%tcGa*#cFsl3e.B\r%+*.4%q(1[K`eOn\0BVH*s6sah1)$QQYV#rCj$S/_!enXHd[mZ-0gnJ6f1\`tf_CQ%nRrpNBPIed)XgXK0uV(eA1ijICY%/5OH!OC\r%SQt=cle.D@!K+K_r-uT*[=uuuLJguIg%VS_PA:g3`.i0clDb?u:N9Isg+N$#S1X0'nj\l[!emm#OZ2j1mE4Cpq(P;af66u:A6<c<\r%.;I,Xau3GS0/Bjj)2E$QQn@J:G=Bf3QXkj1Y/n"VL/*Sd@E[9*78j^$2JeNB>5@OE)o@l:ptOY.ICjO+:`,Em+3W,g_J4O!f<3<i\r%Chf,[^!?'^;W!<SSb]#O?8.H1@(tj;(O@Q"6lLAr0/UR7@(rr@LSYoAb)hcTi6`E3;&Os9NRja"^OaAt81^+j6EhpHi>s3EV#KC2\r%Z@C'[cWiV6hE-Hr?*^"1`<a3OZWck0A5Bcc'n!R<@M#7AXo..VY!>(qIN:dsW@f+:(&&>HK_D$P%Q%<\$Vb]o=nF2)2)A#WV4f65\r%[l5J>cTso2MWtO:FP5p3g`"Vn1@>:0N6NIQ<iRY]d:G"g_5T%fU'mlK"0R:[GOforn(l'aMl0$A2D?CP&=s5)gT%;lGFhBeJ`r9X\r%q,GrhCi"<ja9j5]2)3sN'cs&I^!kBgWu?%c]Ys/CN$9b\P1Aelr4d0"\$Ph*kH62Wct24J7SCbGq[[f#St>$er3$BZrdlms=4\$l\r%3QXS]eY7*UOAql<4+i"[jqG&L2/T<<DZgF#T]D*MX7MhoZCq`9&C*:R![:h"i_S;rkhI)nEa)U_`]+06;M!q1DdfeL[:\Us_H2Vn\r%`O-J5@9mgnX\:Z1q%f4Pkiu[MRX)PIg0/miTq&g.fr;!.V2'VAmS%X0n35tTn;\ITj2&"TkQJW!puAnKgcW)YHE3h7/CWPrE#(Q^\r%QK`A5C1T0C]Zu+m@ue1UD`*3N!Fn:ZLa0sE(62GX[5.NgNiaoeI)ck,Iii/nSO+rpW,0/f<pHlPf^e4AF_p.tEsmK+ltZrlA<+)P\r%?W3?>28I6Jk%b<V*CXkS0V:>Ca/LlPOs,K'A-@[Z6Gj_YZ*/?!B?B'u77fCJJD>j9CZ!f_Fa79W*V[rtksC%(Ko0CCQj4Q]^7[:E\r%)n7V(4h1:.b*=\D0/P(J<@6G27-GQIX\>7b3W%?_Fc!V`Q_Q=`Eu#3$R#qTsVr5bM"bpZ=?3O]M/hj1Van1.t50k8J*j3mPI_DO7\r%.kQRt>0JD:QUXQ)DkC*&6_G]G,]e?=@/<gDWSkr9@7%gS[t68?KIO3ZgZB_p*Sc2R^3j3oNr60G"^f!qe<-aC^#7)c"U7mIO+K#%\r%h(ud5)sFb-;`@$TDJ8Q4[\Y<g7q7>.2EFc18,f`678)GBPIY,Z0E'!R_?Pu(F:+XXk$69fTZl=Ip<[JW6c6oZHi[O;`]?G1Q]Q?W\r%qF5Gk2k$:E(LtV4"WAGnItjEkT)e$#4fba?E"/_6#>@Pp!nXk::Q+NR8HtthaH"CS5_uQYqG=qa>4\[P:aZ)40j\fb*7\!mNU/\P\r%Vo(V@l$2]%-q>QEFBg8oLBhq`&&3Go!-eVo^Z>KHBHG&&OC(`f.Aapuro09n5t^B,X(@*W%Q#dAb!bmi.4Jejc0EHEP&0_oR%od[\r%O,<,qr\b[Whp8m3P@iS`N#9e=ieU&4'T<=?Y1[L,8H(1s>ej4\V9d7mr*-U'e(>V3kMM.&ER=U%c]+4'3mQl(2c^WK,L)n+qFW]c\r%WP7"GPgR^l0BM2T'^RFY9Y#-:=?083cld3QYOehKFu4Vo^FRA$@W<90:3>OR/*`IAJPRbDgOH*7(uCOP;D.<s%_a2c.2V[tN0PlE\r%;D.=B%BH=%X&r?7AH6hIUK90!(UaiZP/X8&fGPLDXo[t``Fp/Ss1[_'XtTLYd`-XVc1h\VTP,>D`u5D3eJDFcV*!dJEgH*k=-_1S\r%5NSWj^G!AH'sf[O/*P<NZJ>"'cDRcV-1BhEh*Q>[lP;ML!o8=WD&?4[m!0DR7jK+93U^E_mB":8cshI)bbtq#URmq,N&CUX]C<An\r%s*K#-;`(oSMMj^6E1:igoR$H&)s;,$NJg%R2J.N<Op>_fc[L4/WY9",`?Nh=j*MlN^*qK?@hpom$UZL(Ahj-5P'(?#k(QuDLVfD^\r%e@$>nbAV\I'tTT_Tb\TRi+C*_B68$0]"CmurCnk4KE0M2@ho/L#XL'90VS(k/>r`Lg2S7b@Ug0F[(urV(3io<67k)\O9D9n)m_eF\r%L+(P\@i"DJ&qjG)b_"AAJl%Ab=o@meUSASDZTr8h.+D^!k^Z5=Kj*it#LE>.IIr6Fcr9g#`[mhl,bZHZB_"JAp@XUh=&A;6Y?T.[\r%F*2OFC;JG!l9uS*)ffW:P,I"1_rn+>GQ^c&,0*2!B>Yt\*F*W0"@<k-SIKX14eV8l?/5]Jf2'e1hfX^7qh7Q8*KbG+*@2<X,>:UB\r%V42a6/@Dm1@OLURO17<#Y,PK+CPNrP!U/&]4sJ*%49@[2Idn!i_]pG[2a2h4c,59+5aIj7Hj%LZ#e2KNnI`M3\7A$B/]Z:h]'%1-\r%WV=7@Mlq-\@MEe49</[S^#@mVT&.9@rsA,mO_!t]XMs2Vhc3_W:E]Cmg,`(h\RjR4_1Z@SWJCM6N4Z&m&=db'r20M?ADG"8r@d4!\r%^Pof)1@E(lgmoel%l3QR^ph_iho`Gr,P6&DSoL+1hc_TsEDmku];GAO/7H1RC?r5dUsU_s8%lR[p<fi0Heh&H-o^2H(0WidGta(Q\r%^*EoOL&HfQOp-#">Vq?chknetBe66i1eSWi@Wh=urQ#-Tc/MC%3%!;A1lF$/!kopt1lF$/JeP*(f/u%;ik$cE=.^GVi_-T@Wgc"*\r%$f7MR1G&0Td<#^cAQ\0o$HDsZ\hM_]*%]WEf>C!h=Qo[?TT!b!^CiT&Rr!NKW@(:8MPF00J3Cko0EtMoF8DCCW<VWOJdI_J_kL'1\r%f*afk'#3F@Pmu'DGe^55?h&(N>[9!S;G/?\f8ES*jBu)m(])l0)&E(OXi-')U%9eEpJ$b8Koi>X_"Am,=+S;n&98Mq\R(f:4a\*4\r%#^AQ6_a<NfN4k.2%#`h#5%ugO_XuE<kR<BK$JTAF2kQ^K<>`qi4;\hp^LHOZE7FP0PPs#IpbiKQ7FZOaB!I5>=@<g?-NmHn+Vhoj\r%3#AW+gM134Z:R@u#\H4ViW&`^_I*W*McE(bd74ak3V`"C@s,CU^aau>equ\/"ii)<U]U!$^0$)B<$^m6KnND6V*.>M6:*/hhrfks\r%84WpI_:fVp3uRBnl-tnU-ectX(g##WIl<H%,2r#uK3c!#O`3D(q,Kri0.&:a%YH,#m"^h%eIT]1<m[Y;,jqrp%qpRX-"7`)"3cAh\r%\PQj.CAZqD3FP19UQcq409/7kjMS^Z%d#'p(dL;n0d9Io4q8Voi(Fa">:_U.<:WEepsMS0gaeX<np]%J1_FCk,8*ER?pKTE'N&S=\r%dX9>lN@5.sh\V@c-dobJdmR185.?3TkWX!PKK*qI73ma-BHis8&</)I\>IUS&<SAMTSWYMZ4f[i,bg*G-:1L>=J@2DcR;3m)IS@=\r%JEJ4Td""!iee<n!1<=D#Jp2[g)6`JLKmQ!Tf$tJGa$A`d7uq@KNu"(c"n[$8RE4:oT/J5:1L-G<n:ao_L>"XlL7[AE%2VuAEsO8_\r%QaM(>\A@IM_(M4=7jN[>pF:&G01^"Hi!Z7^RS)iuH:MrU?QSD7l?!'bb6,F3(?5b9lt^K+0D&I:J1hH*E[HEY"CEeFoaDj.R@j>S\r%=.%j_,"!ti^a7*]O:0?9l3"/D&(=j+H?QB.f+/A@f?@1dV?#r7!DYJhgK2to]fs8(182:CH_;;F9e\ar^d,:-*ZVkE4WnjWpiqWO\r%HZ6,(3b`hF;T&6S*0I;2-Fa:NP'mk\00.tBN&)ak8&WO]=W%f.Nl[qE_g69\H-D<oo!WFio\`!kG^,7)FmBhAQ3\Imbn._joe'Or\r%+.=E`AVfQ!A7!@Y>h"CB/Mj(\U*(o0iAi)_L'W.`6?>Pr\S-<;;6XT<i43O@1`e%_/[u$Uf>>dO7*F-:(<>J9]Q_3-&R>pTG^#5[\r%\]fS^;a?Fe5`X1)JkBd*LuuIre#joFb2^=;-d'V/+&k\Pg/!E(b*fhGcYh2&!WX^/+W2if;7"04c+;WZ7bb955jN'SEr3Q:]s;TD\r%'=&KG,TRD>%/Csl0/"IHfi?JkZ3CR<(Usqt]Ghtg]pg#kDaPL=!9^kp26R4=dQS(+$'GgY<R>.]IAh9PhP;lbpUOmqOcm_g-S]#&\r%:G[]:Q!SJ#Em-!\F!uih)YP2>Efl_$4eVWNRMje<^WeGWprCe!G-L.KVRVt8J-Bf"3:DiIp@j`1*Hir?[=7_A^''alX,XU=O/&n^\r%>4nak:]<ZokfW9A64'nSK_MAtV\f,'Da.6;-/Ifr`MQ!.k++]il:an:pD:>GA7`1Agp>#Z+ah.Zp;=dl9Xf7,hua$kYWo"'Wk/9L\r%37'ts/%Z8p4ZM@j%Guj!Iku1QeXh1tnYENOm<.!HN`sc4bGuadg?G_U5+KN[%ft9uCr+a))nqs&otYuN?o^tFROq*-Q+9,a-Cgir\r%?=H]IJfhNeBn4.4A$.M_eT!bL4>a>:HjC*IdS@DsK"EHoh\9@Emu7i>e.*ba]$\mb3]Ju`&:`9W&]@h^[0>p2H]Tp1EHOA00^3"f\r%Yi(lZnYtAj*5Y:l;;^n"Rs4TCcV=$ATDn\bG2W1<HI>;3D\dEtR10>df^DFpJiNC,!n'WL*pWU<4MB<Hj7D02hB0!Q+1Lc(^;4J>\r%&+Dct'.fA1Xea6md!0CLYP5P+14*C)m/-2MSY<Tkh$*!%(7pN5Di*JLGl1Z^,PY5g=%>9I-I<l0Jlu\`.uVm@[J+A\)l'[5Rl]HP\r%[*loc%,W_(]_'Dj1L:E\G+>kPF6*[,()!Mrai_lG@9H10&"=PsGNZ+_guFX>(H&QH-f4,-N\=@=q,#ELSBcD5Aa8BQQ\1[1)@unS\r%Y?.@We2R,cB78N_W`T3eCK?bUfhpuOla>HnO]m@Pk7,b#WMD/L]9&i_2`;=7j")9H<R<a/0*-E)6jS,]4Y"U'$b2b?Hi$9"@,SYT\r%1QFVtaMsc5pZ&XmgA&@mX47aP-2d9Q+)X8Kd&4U^Lk-9okaVf,@^$pIgrQa;nMBTmn^7O)]!g2fIB.[=L&$_#4Eq%Rn,fpmgUo0J\r%b+hProk*6lfZbLDQVU+1ht?BZcUpC5<.@15cmIu&Ejt8YG5de2l\2fqG4BO$A%Ql27)p.-/3"=PT2[q4U[]<W=3Yja[^j",flE>!\r%TTrrb41Tfg7PibT77X%%\UJNZG5^46[.1U[XhYinZfCA2de6<T<rTjh$1gs=j,J]!k$9nd94+1VMU6_VqRQBRjfP+inrIVWa*7):\r%P<ZMNBCFTq(%fD_'sq..<Ig392ADTMk@a32EAuXM:14ZV\p7gR(\c5#BC9DVl)oMbHLop</M%ZV8jG-*kO]M&?V]TtZq_q?`hVYA\r%_g!a*pj<WWlK#]hn`ik5[[\1P6f.SCo^NeEc#5,(I&g*c0E:7>(>pkU=9Jsbr>@@J?G75m]F:17SDXP+0P&3V4Vf0mo<Lg^T^4Lm\r%\Tbm5C@gt)Aa2;4,g_Xr/'MgR`_pD8+\P,>!t92<HmF:e?RQ&h4\d[f!eJ8o*=QZ,Y#\UNB,`(;GAeq`iCUb:?Ep,,^/L?9'+F\'\r%+_M.A38,kWIW?:f#HsFuh*E;7jA804#=H4%a@L%=!CJW$@d,N/\TWfsMa_d8YGid':"2(@K-*,*%Qm,LK<;SAJ;A@jJ'>J$n454'\r%6"b#74D:h*=tc9^[*+`TYqJa'r7,"WSm5I>\]2*QiBZ8$ZuTC)O3Y[?cON"`$e<JM@^W(>^5fPp7P\28Koq0$c@TOaJA!PKXsQ&E\r%Rg9^6G9lXbF=*GB`TJLPe^1+a/F!D3k\kB)+6Yb'PYjNkZN?R^[arfT-5Ok?R9^:%?220[>Z69)bMOE:s(cB8po]/Hs3#U/T]HEb\r%3js1O:Hu:91f.)HkB4!DD.fGTqjZ:9jhGPRG]O.AA+`R;9%L9mjfjU@lsci_^^7>&'u7oNSLU;)]VFJm^+r]=B'ChFnUiT$nOY!<\r%.Xm.N1!?=Ke>r"'.<o2JCKi3!&juDIZF5HRXo]tmGBW8@L?;3E%b;H=g(l_>5;oDmFA?%RC?p*a9,H"mOrR\>2]"1$d3sDb4pI2>\r%\Gf\*b"m)D"':qL4t1lVeF1s]BDKr6`.KQ\V2OrA\15Vog!O`j^"CF/l_nOqNRbn[&)]9n^#9ZsdDB%O9DID5YO;i!L*jKf+`Iu2\r%]))#ncl`TG'3edGWWWVp946"Hk%XdTR0N""L$%A5_?Q^-$$Q#M+WN+V<lo_j7Wl5fr@M]kUcD\[X:?&X^I:X."G_n:*>p:3%DBa!\r%g>295@QZ:U*%ocectla`&DH(UEZ4,@__PGaU,lQCrYE3;1V1JX^2YfGJs:A,Mo<`r6@XbXHGds2S6CX]Cfj`s=^)%\jsX[Im;Scr\r%>7c7'3F#=Bi>aIlIgael[TH["UZT(gG0=eCs&c9jkTD^sVp]ho26FEX*@R+@^#[cE3B<b5UK@t)@qD1hm"$LH*"JLc3M=R^h+sf=\r%?<-^')b7`$D:`&F?5XI,mV6s-H0PKOo3'dDqM2O;ATH?g=Cl2li1JWf4sK69#euI]8Bu"RpG7m)lRbAB,m=7oWbUOp$T0j2,mCDY\r%2="=X#g"([PadG`/C&$cFu_@`R5(nUls!EQ>>j^)f$DoH^(`Mc>ISbHfTXAO;Rpq[,/XsH$FH]4];)0-Q/'PmVq4mDD8=#i+%*7(\r%/37tB]m\X\h.bu"j5.8mk!IAM^sKPo?[I.skY++tS^>pdq+:KCRQ#_RZ/fH_+I6oF>7@LQp0<4`g\@Zn_jXfKdT-3;R.9X3mpGr&\r%\hV:'E8\=Or#GG!(Vf9LFm<WmWopFW$g[IMRl2<2[H[AQ\,N)n.if5&OH9fr!Ym4d+X%Rs%b%XSU%#F;3N1d5BqrN>AJ[^Yh=frc\r%`(B.s\&h,JH=fE$kds[]N@j)*T/$BCFkepg?W]$CPGnG<-d1O6f]"j$WC@4uoTlt/os4JbJR*'BS2S\&o_NdcT+5*"f$2S0N(1QW\r%d$l!BarC#K1?_t$nDLK+mm$3OGkhhXp<$[I=<8hQk6.@*gM+FT>#;<2r7h3UBPtFfmp:L7/ur:F]Onj>/;:?4#%rh`fZtonnP6Nu\r%YOAdVc;)NW!qY=,]rYQBeQsHNg5Z\>?te<^:,W_[2t-"u@Qpe6R;iFd)#cNO\Ba:(*T,m/Hoh^^Di.=@IC"1\V*09C.;?>uO2hQ6\r%p`QhhGU=X?boi(m(dA#Z$Qju/R=pde"`lh^D$2'UN'&b%p>!O&D\f+>0O@GP^Cr`IQuFBnlk-^Dr,'2#]<\(IFmLq"qn-\oc+0jW\r%iTDhI*gPN\JYo+,S<:jr&j[P5rFs.0>&nAQr2D5tM[1t&>oTi3A9.-r:@R3+aPpS%&3T\;3@-PsDJ8^\Kf+4F5uXC8W3:]mVsGqJ\r%POXVSmAY25^NV!q[$\%/mk5Ru(q.<*Y6.i7[/(MB/>C1`e]X?t.!^^\qIc>DG!NRd7+9k`8uT/T,43]d\"N-?R%PU"q+/-^PBA^h\r%jI9>ZgWe&J;;A`Adu#o]<T%mc[)/?*!K;KSq$u5+F8B0B#5K&0p[t[aQhNt5-Z;`OT;U4Bk=ldg7TX_Y=W-(dN$OThRK$L1?')J=\r%l-Nl0n,%EQ=<0HlXpjdH@9(Y<X(@+.k<S;mo=>(PcNRCriKO=CrESPC!Jc8?:7a`/1kB#t[,e8qeSN,es1oc+8"Hfkn#MM]mDnnC\r%NrJIT*^57C?]Qbg7L3W=_T;>^7G4`:mu1:Eit"_)B9D&KUH=D+kCplZ'ZF59RrUFI/W/O=P%7U3;)3a0aOj@#n.t96U1S\c(>N'R\r%<nu*878]RDE$n/?dkOPr`!5pCE]UD1#b=q56EjPEjmOdY@Tn:<(/[iI+K"2T`(HmJ]W(%`JeU>CJ@HpNVjIs$rFg44]!Frp<[PT.\r%S.'Ok6ogeZ9`.r58%,=gFj,tZKHE3UWFT]Acm>PVa<HGV.&=N^?2YlM,A<doX-^:g_<aURkSU^8:Sfj:X`cKl+:)rAJ.g%i?]<\f\r%Fqt,&67>E0.P34(r6rYPmrGV@ROBSTdHGLaemAB\1Pao8e@W-F`Hbq=5)ZoOUlN8f,<K(kf=c$jM=a4e4$;21caI[O<"_RqLns()\r%hnjP)LWdd0(gUbB?:ks?;h&K,QA^ds1J]sU!ruC@TN=opl0HW!ZS4Cf`nT"Vph"hE!3%ir8o/FKX07LQ)!Kh9E=)UFVcT&?7JI*m\r%',bStco+R6[9h0+T+7L+cQq.r$0U/#2cMo8Q6\95>*2B.F=.`&[s;cDRC3]`e=+?c"Bm;]WE"tT1X"OXoWQu/9kn*RcTGA]19#ub\r%0CrkZaJ9S@(@u4AaJ9Rt)2t<j:QcT/XiR:R6K7TN/Pb]0O[OO)Um?Q_kd4B$;G5>9QpYXX-FI6RIkIi<RFK)iJjjHT7X5WK'q*Q<\r%:ZZt-.l+(=\;`3WWTE0HE77uc;@B&Fi1q-7,L<9q,*Q2nbWGQe1iLZaX<P^YP)u@_o1ki!+[b1M_pg@D,IJd4=tB0`0E*OC8J*_W\r%7EA5:dAmEr[6WP&Qe%$fC,oGEbgq2_,CB0+R,P`n@%\c/nSc,C6Vqs:j59^nE=)Kb24"m'a_.=Cp&p?q$$iPi^K/MdI$Q&,)(cUf\r%$W7ejcC(!iAY1(cLrO*359f?:=E?o?Zp$!T@d147A6h^dZg^m2ct*o]c][AI/u.?PQ6\/*c<f'EJP&o(SBY]?8Vo0CY*&Oo/N<).\r%]:6KdHKhe<>ZsBO@C"*DDkXY-fQ[\70dt.qiup+iAZ9RWa$VCaH_teFnIYJk!rk#7*Wl&lWj%)P6])0rR5aQ>:fkn2>pdT^_d1G$\r%bB4@u9Xo][In0K?=9B:MB:pn?n!gtLhT4Z^\+L9S^i?'I:KW(;_/X<t2!ibUIt!u;((H5H)glq(Qa?XG,P^iG0,3o`4XVVI5uAJ&\r%V\D[!.*7&m8\@)_(hbqbPUA5V*KSHiL>`ZW4OD9mLgU?mG&'mB%)-g)l?q3):!M8[JDeW-GAaRV8#;;hdN`9u,'WNVH:th4</1!!\r%ZAXV&U$=,S=b$"hKeVe^\D2@S.XAP&r'M%SIZ\0NA+EfEF^t(DZ$5&OD)9qu^B.\o!?$i5Cs*MOE3F@M-hJ0H#RPJMn*H1<jr%lJ\r%:<r;ks5]C,8Kqu9d9a0Qr[rP^1Q]!0T;"YZ[g'@\"WSKB$Os,6XI3NQ[Cq1K;L9K2o*]m'\EpEu\$mc"QDpUAV@DPTDK-ke#=&[\\r%/7kHC(pP+,je3gjLdr^2%sWMR,8-hU\(L(M=2f2%POsGEYVeDpRt])HHXS[aaH:)ehj4F10M""P+cumm0M"!=7Tc)gO8#URLbrsj\r%e;Hd(oid-gdEp<@IT_^95VV+<:c0j4J@N62-*m:2[g`$:W;._?&.J==4I614;KJh8cLA5i'[U-`-$8Y]kJ:QWC1he'H5QR,=Eg%!\r%h_Hi@DPi(#i&Z"dLfP@S_N/p_]2@hTN]I]QS%@?L2F.;Hn^`/83kB%ln!.j7]FRh.]/d\TL*C8crZNj?KBg@I54hfh61lO2f/>=_\r%%tj`F%b2t,hr=B5S9a0_of8Xamg.HR(F_SFN\YQ4p;ONdOJk>X.0)ra]N?/a&)Uk@&P2Em82'0JHKdG:I=`&%>QIC@C]](h&m#'r\r%+hKbZ'S,6U63n/o0-2g9;CSjU+PA"IWM(O@$m*(#<-7Os(SZ)=N>T?f*P<Q3kiP^P:5:<K";4c9;OD4E*.c$CJ:qu56m@`&!g'XM\r%-k_*L'n?E4$D@a$p].*QoQAX56De^'1c4pYH;?"O@u<FR#m[QfWrRS9rN74SJRkJ+biS.[fa2F/MJ0tn!1jIln^nOiBSm^0A7q`9\r%,*7J<QmQeG$o<'!XP65mphX'&W@X:O/feF%P!>K\'[j!8U(skAjH.s"\qjBXP7Lo>0;LHXU6T5*1JDOSX$W%3jB3$]>5.TIgh1Dt\r%OaFjS:!6#5_E(-mBk<6:h0&I`n<Mi<8ua&G<Jna%WWl^pD!5fkU2'AsB%Xf=2MV28`;KKZ&B=):#L.oP^!:D*c)Z-i04[;@Vf!^U\r%am/5((\<?=BbQ?,o2;dJr43)hIcId8q]<K;1F.JU@l+p)Zn+7J&2)-J/R*&XcHWU`b8Lj(*Lnc9>1WM.J!MurfkRqS,NO\9"24[g\r%k$TP;Ag#j@Qn1$)f!-W<?kbD9WPZddo[2iXe3Gn85kJ>+WI\faIj9+]>)F2R:22>0/Gsf1Ad/l/]3'fJ315?c7&l9u:3Yh*Pdh:s\r%K?Kqb>FAaDeA/F(Ag#AmnSe@qDZ"ASnS;3l6K@gl(>rn"]7KV3"[rT,#(j":U'@W+#3)Eb6,0Il"AIT#f_DH0A]Bi&]3*lAZ)?$"\r%rBMs\<=5/:?A@`g)5^)J'ItsNX^bdS@)U^I./1))>dHK#gSKb#.4R+b*=mNPmNYVsJb5ot4>0alJ7ZDQ3@/j@i+<2Egs,L$]:ads\r%anEZ:@keKI_J3LsltO7YTtA"E]s569/.2*r#Gi'OF7=gm[qWH!WR/5h#C?*Ie_A@tFo8@[p.)V@/U&7J#PmMkf>JaZfh8ghof<WC\r%Y;lj<S8iCU0t$XOc%!L#!3L5/T;%cIRT]oRXX.h!NDol:OEbfCQFg<ifilh$QCV2#@r"Z*>3I#c\$`#+/YE0bg02q%(/E,1ZaJ<,\r%Mm3Lb$(>$Oa[NJB>W(3#2RRMS(M@MTRp,;\C2G!/D^j:fM6aOfVA=!YD_mbaQjaaCC[!#,.E><$):KGEj/-CeiQ4S?6\EA/OuB`;\r%]/%[_OuB`7[oeTk-#IB_hJ93p-#ID53YlLH8Xim_=*.p_@Y)\c-\%VPhHrOo$P076&6(WO`tq,Y>3NCcY=A=j\Z'%Yo<F2@pmhcB\r%c[np5-qB3IcQWlofj7RPs$ZOd,0$iRa+N6r-q>e28rUm<11D4T21Ci'j(PF^Zd@6`FL9Qm=g4Y<j_1X`ZQN>6,91spB+;2,LP*N[\r%kHsu,eu>Qc:0L_'dp&s(;tGiVDgD<iPJJPYDrFG^G(WH7hL[[ALVY9MDaB[`@+Ih@QkeKBj^Mq/?0%UR_\Q<0Tf;kG8p?Cs(ML'n\r%nul`pDgX@795j$DHfHIi;LBnm#[\Kh)Sf*L"4RU)b^daqeB&&]Yt,oPFE]\s=%uCE(<PUR7*s;+<$8pS"po[OUQD9YU;U.!pgf/p\r%UX1^&LbDYuOsUrPE.2/Hp^0SGkjHe?^-ZBeWlB1;YE8B39O[JQ_<AsG2lG;`.V'T%F0b%N8::7,S[%qsfHUoe?`?JAH.!(,`H17%\r%al3[Gi.\mo9*k"3O,D&tnto)M!pR(Ba!Z]sA68qNB>fiaXB59LelAh05e?#?:Vdi2?DZt/T-$VB1mUF^Q#W-6cjWu!12@aZ@@8Rj\r%r.:n\@Jd*bfdq5Zjpk+ZeWMUE"l<8([d>E]VC9kDEXW='(fHDcP%N*?@LnslQeh&Ue=#^:1H-6[8i)rRbM6n^.*\tg@W+/HlG)NZ\r%6a!XG_pl^ao_uXq9p"?Q`e8JoWs]qQ_mE&oKQTs)f?g92)B-/@&^JH^U;]O;\ss(E/R1Z(C1s"2\;$U2!aTQP\;"^aC5=8(1iWsf\r%WZds(f#0H<W.r+PXduY1i>PTM\2Bs;E;kbBY+bSmK,JiS[)VpA$sH"Nm?\QinaE:Pb+gg&;]jW<;n6RqdDe%;]4_ZGY11HKoWBX?\r%!Gg[5$KggbLNUG)OtNo2GPaYU7u?P0(tLR4?mt>lOffd0q.XhS$H'IAg/8c*a;D#_]F.3=TgW!!-;flb\eKmAfdW=-iJ&sd5qCa;\r%l0He,2oL1L=5u@#L:CmL0H&f'dU?EkdZHSZ+c0biINtng)3S*Vf]/0m)9.AQiN.UO^.f>N?$6i20s4/X=;OjN[(%`B@9qo"3'pl:\r%_QYZUg#k'&7)HM<k/@J?]#HhFdNHG.0&*.1%./=N.?G]?=;UD9,0+gT%-uoJRYuoCTk>IfFeR9q''Uo;Klt@2!>U<2rC&1YbLDT;\r%5o8[F8CHZLF)rN$S3O/,XY-[_cR"_6\eKmAd4$nN$H'FVHPaN./qm_>@t(_Nho-Mbj\Q"XLF7c10);E.-*5;Oo2!AK.1GM\k>i8U\r%\eKmANTgo37q;qlZ@+H:>aN=30'jpHj15qZF[7B#-*BmL=;SP$n[=ajWPt!\/7E92-8hr!@9Ak%?,YB!d\bRu<J+gt8XinF!>0*_\r%8Ximn,&!dS-#ID5r&t?D?I72Rl6=g1OuB`;]93=:04ele-\&*&lQWj5PI?daWF_G*[MCE&FW"-$cEN53[A6MKd/.XtGSsEf-\*l_\r%j'tfcgNm+N.0D;201eqCNl#2/[A<+_B=CAXaI0U%8g+\-BPIROO,Xu0@qrPX/BZP,2RUoD1>^TF2RVlXL_s>hg=3tQWH#A4FBB@'\r%,P+c$6pQG1#HCT_X:*k+OcG`rYV+[YA+lMt_n(Au&`m]*$1"nq9"Ldo`m8[G'<$qW)F"UEr[:90NLp@fG0Fj;Yb)))2c5U$R]nF:\r%]^QbCK(bMD=u%%%K(bKnpW@;k$//VWFeR(VVujni?Ra:K?k)FR^2^QlMkmomP8`&L0W`IN+,`h/Oq6mLpVNm3C4sL9TG*L?jl6$E\r%I.!KeE]*H`hVjX7YcdN1,q\a_9h1n#&ic1`Z20/(^<jK;J[M6aW#?Sm=)=LlNhk`mq0ahda\LE;C@N#gRghO?.jVgTSZG/*`Ir@O\r%-8hr!@9Ak);WG>&Fqd7b/1%Gl@9=>Jhf?;4:`.d&RURT[ejW..oA;9[_Re)T7Z6S1(tN9:O%h&/l[kRtm>*N+?!(0kj15ps1[r@C\r%RLKFs):Xrlc%^gY?*JCHMeb:4aeb/93#U9N4,UVZL*"mlku#sI20;i"$*LupY+\?CN-7\i%5#R<en+<dlJWY-HjumjZuHO<^4m6[\r%9r\Nc)Gf&Mi#8IuWhH,KCZmYMiI4F\C\[5H<J9pJ6]YsfoP@f<6a+M<GC/t$%D<\7END.H)Yg+?f"'-GW.NR>2=s'nGiH<EL0c#A\r%S?UIrehBdG>XM<KU'ap?f?cm#N2LH6E"+u.(T(k\iYm,B6YGjS1KjlA<HN3i^"^T,?qG?D$H'G_@S!U+(AUp)`cW^=la#,Q-#gbX\r%TdedK`t(,i%-p5E,oU[",chC)0s,C^bg4'f]fP,,\7lCPY^58_4tWWDDMZ\p5]#J5)iB;k\^MP@BSIduTj@8jU`#=tL5)[rAk39p\r%ninetI@Hs>?&j4W`H<U<l`sSb@U,8:YV*hh`cW^=l[jC:ERTh'X@mS?N%qEW0GT0JD2_nOmOKBr(udDU(!)ITf&]R($HI9<%-s(L\r%RWF.)6+:\bXp^lQ(ghhQXG_i@-m$t4+//hB^pLW]](%m<2tV_QX=JldV_G3qUWuI8g;JYe0iD[1_n)dn(XHfL@9r*.8GHJl@9mAm\r%?Y=W#ndM+q&b`h=_n$8?mWYW<l[k]Y8mI_"YV(%jBlRDc_n*'*7[Xlf(Y3/qrt+5%'S^b@>_U;0/qm_>^77U&XX.h!J[1*>[A6MK\r%kP[`)lV\SN"n.d[>>*]"Z?r]`Cb9@"b:jfM/SS,kW#DqLQF*WF2)76O?I72R$C1c505,+2:F-r<?I71'c4q9s:r_"BF%+W4FkJu*\r%`mtKb>3ISbl#E+pp9$`@XX.h!5lq<20j_lL_TrT'0qQS<Jk'l<3k^bON0c9,pdf_*VO!:7XUI]S=`9IHHT6YJ`Hn[$iZQ:=(7[*;\r%@_@Z!"ccTaXX.h!6.HceCIt"!Y]COpCIt"!YQGt_CIs;()18C"M=+q5:a+>S!iS]9YV'$0UDtjCIMS_5F+e<8L33NpQfX$D@9o':\r%73+d@ghRqhBW:O.`q*Xr7n\i6L"9dP\";L'1;_!)OJAX!X:%1V[(%`B@9l,\i%VYDm4DQ21E0SNp(ljaMSZ,CX:+qB74aFSYV+_+\r%W)Ru'<#9j1WOb`.=;RR1O47Gb_Rf6e-c^?Y%.!HtF]_p%IZM[T@&%![900/tG,o=0Q`@8BS<]sXHr9QpV"hNml>K,'$0oK28:!`!\r%.B2S\N1Ad,[b5Tn>ppLrTsE@u,JHLm$a7[0`ReX&=1IS9(Y>K;XNT99-cL3WlmT5>bDC4E$H'HFg+ik>-l^_`P%)EQen))G$RN[$\r%%$MU]V(etYPJP=[>meK\@)bgsLn%mZn5C`T>mdDGm^H_F2ADBfkdp7?)[_=B)&g&?0p>k"\;!72GY?9,:Am#n6u'GMC>g(W9ldIA\r%lJ`_.J'[A1f>9E;W.nV^Q?o^ms0S.g/Z*!]b=uDGk(/YB+ck'Qao`kK@!7STh#h^[.]!?]Ho(5K4>;p#p(s^jE\\'skI72k]C;&E\r%:)Ohrfqi_nlYlE#*Ee,r=b]Xc0c`"XM_KKJ;54Q;+q3<]>%O("o4sY#=G3A,Z=4?'jFH3]6MJ:hd48ta[8Mu%9?h@8-FdLF;]3)s\r%^eX?#SY,"0-jmb&KWX(-AusMHhQh;'n[fdH_13&k_$IBYo1/+I2_c/DB5J=Y`WOp#gK)SskiSV\Y-nC%,TRDE$Lrp?[8fLCG&_&d\r%pLS5onW=XsMTo>=A"A+<V3'7`9[1u+=DQld/"P)/=DQl#;>!C\BPg+_5<]Z#R[k7*#.s@=Vh>YjG5&%<bC'=mmOi?o;11+QF/?\J\r%MY=aMFR1#^k:>9\6I3@Yk::k_bL`G&O*54TluIDu6QM\s#J5raBU>%$/j"p?2qk*>Y\Ta1TS-oJ*UF]BAT88I"U;Tc)3Zqki[q?&\r%kD_$&H8,hO\V.ljBU>%$0#NXK'NGQbTlhnGg-lkF>,6<GYmtqK9Vl_;G2YOkS^JfXRhotTMBD3%eV/T3kNK`7q^of#M'b%224h-n\r%8%Z,:G*2W/eIQgX-aH;QFubSJ)NZ+RY\Pp'ZTL1-_a=B4+firT%HY=GJIJO0cS4;b(-VIa*UG92St;4Lf("e6dTt=LcITM;K.uF$\r%3S8I_>og&"2HoNDNaZ?'ls?G@W:*aU(`'9orM*YO_(NGHOp8N,dm)QO=T=-Tbs=QY3ki^k#.k4p`p<uQ\OML,YfgMd4/6(b#.l"c\r%S1s$-Gd%Q=qikm!Ej,pt7sTB6r.A:BC*(>E9`=ec,;FD/HVDX85NLdI\+'Fc'</&09DI=A,1ZYc'Ku.)TD$H$1F.s.iADK2AX1XO\r%8Rl,+JlPK#$o,T#o?YSChpZ'5>KBj5?K2PkL/&IUFL"SZ16Q(&"mbL9l7*7E;8]2!-cZB<O!PV,6A/;Slmdfgj<$8q='7\h\E>1/\r%K/+f#gGr</'R:liI_CiGKc'B8.795Y5)UILhL!"n:uo%1no+bWGuSjO,(GncMPJ8Ef'uF"$cl^HL>=[Ykk0AUa)CjicjN?@1?b^%\r%TZHHc\`+.hd`8h-EtVV(nuN7FGNPGJ_FlSu/*ufF%h"3sGYs;Y9GDd(:]EucIB(:f0))a(BNUhS@K+$0Wo;be7;/?1(&Ali/Y"@`\r%RJC$5SPEPu#C7D]'[piqe'ghmCg)i([_&dIpH]9h+`C`_5N2(mnXkQ#)HpRf\e)"8YLYbb(FphJh/9K_I+X+S0;S?#jrLf<bSQ1N\r%XhFRcY1@5#kB3H*G'hb3brcL&)j[5JY0^OilWI<.g*4Vc/TftGLA?VXhh>MipUZq<p"KpLdJU8*?D@bXF6cZEntD*\r,>0i7F8)>\r%SZfBB`.r]qL,ZD?YVK:]1?_?(?tHKCAb<-9%T`#TJ+AADi>W_Z'sr^EiQ*\E>pMbOR[No<>-C&:ktCgrAUM<(]\8T';T@<JcU'@&\r%0Vj:C_,(5Md'&%EP!>YH/)X"X^TLbhT_H0-eNDVp<Pt\J%f]49)Vg6ZmdIV,+$UBE3U`_%:lH?eTdkpUP5jbDJS4hSf=q,AJToDO\r%'&1Qp38!-?)3j5-Jd+V<V6HsR.*M;%WAd#RV1!37JK#%]Y(KYc@JX4kml\6Yh0DF\qQFnt[aQd434j7Xf;s[%p%Ap.W?BUp)hbLT\r%JHgMlgdEgAYAXcAG+jtW^5IYR@+>X."Y5,'jr+6;XA2blH"pW"cgll0GW<;3qJgn/?#0K9GLoT]feJQBfKjMjUum+efXY&iBccPI\r%62mSKhP[cmS>#MTh*pf2+CmpjReZDgZ&N:9$!nY&N0RSgO(=Z?YJ#.,0,MckDWZ<sf?0Cp$%0LtS\/TqP'JLiO8XJQUJrf*Q?qNP\r%nXs(,Zk&V*F1J&H)"(8$Qjdjp9!r9-Ib'j6?`60_X&-m+fd1?;+O%O=BpBN:WS";s[a>HYCk7O_UV!X)!D2O6-ao;ZEZoLDh(</d\r%-b>Eh=>c&/!8kLqkdU<5UJf`[Th"(r9!FYnBQ^U&?*$-G4M4"IgA)lAH79j6_KU%ea(tA=%u9a<GUb6AiFpJ_W.LkSmmY5!F!X]B\r%).%l]@/"):=sje2>n0'P`TH-MKj3d!];VBt8%6jUSiCX%*ENVS+>JY<Nm?EH#PXSm3dPlU*UJc$&1l463$j/fZ@reb``:C5UKcsK\r%lQT+pO)CYDC0Uo_4h?>b1'Kq%NZKdEltTdsNZR"CB?sZM2US?nX'@5up>3;A*Bguf%Yt?>kigE*XJ(H151)\%-T*e`Pa@CO]f-@!\r%EtrfhkSCa+/s!=)j^9*&oD$hT(Y^t=b(XB)L!JSN-ppLcDP8j[20AKSC[/JnP'$?[(-:XW,#(RgG&[phY_eC@L!ENUj$^L=geXdH\r%qD#J+TmKJ7M2k6qTW9a%neU+L#Bd=K'-1-^*M0MKBqjX&U%;1*jlkpU/T`\_Xb)QSh*U;;pGGJ?\l/]G,Ce1M6LtX5p!49(]S3MH\r%6:<lB;\&8#7O-?Tkoc;<5c6EfkIMNQiD>EX&5?eV\tF?E$lXEOMo-i,ej=mG4uOL7G0JC.6H3<h?jc:gM&o+*ShkgW##B8.p7/Nl\r%eth[MR'<@XS;"T@,j^o53R+hR:l7`p1$t7iq=Od6XS3Yh>3qW4SR."nN1hX[1tmsUf0ro`Y?0U!lK5&ilkkKfj;B`$Fps6!"M:EP\r%daQOrMCb78%n@R_63]pMKu^`u4;m@<$+_nb\]u;ISr@*ti9`9=#L1+n-/4\fAh`[?-f-K<W=3%JgQY^Zr0SRW5I!JigDunqLETs4\r%15TK2Br6nkX@$YU>PMcsSuPqbl<WiOk#8*CB79`&CD%BO\4pck6FG1OrBM.#qh<nGH"tqmT1D?!7X2r<I?]4p0._hKP#>r!/bHT7\r%[O)`?DsqNW3[3g5kh2"[i[_j>\]h8'D'R#@e/D$gTIjhW)m89mcYjS-0'RNUVj;K]Rs<k,.+?U>L>?To6Q'r,R<Qo.4?F2#c65q5\r%jOqN;(Fbs3@d8:agFReHA95(]M=b*<c-n6%N9F.k'7$eH<D-a`lY.-I$`?S(Ga\e@*aPebdk!2<VG"=AR`2hX-<3_'86HU/kpSgC\r%<i9,Y1R7[F=376'U.r%?R`4$h%]G]jlcWjn9k5l7JF[!r1m-0J$ai]>G[='7[@i^EbM#AHF@9e[,(i$\?)klENaRRgV-6"+1<p`b\r%gI)hA^+!hA_b>DOWl9=S]>QT:Wl<F<P3G2iSRh6VA(=HoIH]uB6U-:#>5IVm'g9.9Od]$#09JuBC8!kWJLgNk.rAS:%u/[2kEH^X\r%=t4YoP38^_!D+shdsoMeE&`317l2Lus%k`rmdg![[?*CBCgpu'Z%=[=8g4/=Z;S3g)cW6aE:+<0a"tr<,>qF&mWTFJXfJS+PmKET\r%\(aBpE-C/]Q]9sCcL[bJ%d35rl%Hr_B7pr;m9Od63#qQo;p^j<iG`ZD,6<Ss\gj?HatjtqSb'n_1hdTBm=gJ#oOT@XOQ(=o@I2U3\r%bTomJUbF&OQ8pEd+VB7S=Q[iB7*sUdOOai(e0^Kr3mKDK[u#g-`4S*[_t8f%[Ej/&RUJoO'W.BL@T`(t;d@@eZ9!^tM-peYR)?/B\r%6Yk7E8"*j\,$9I5S,BEE$u=;g)Geqb*o<J2=HB(H2MO)ZeBE4q_jWutL27@-$u;"/5]sAAL,CRQ;_>nUeADL(E#Lu\TcUY!Bb"j3\r%22P_#emu`.CD+HE`_@"P=Ha$A6M-"'L38kkh)[_cMGH+IRWSG"k@MlA7Q9YV?5&Tuml;-+N*iYb)%j^ol\HNemg9hJQ[e]9rI^#S\r%"N.hN:eK?AC9lKnmZl/4?a[,_68_o9eWRm`5qgngUs63-HeR.d5o8BeaCIS/4>hA%(N,#IFWR$+IRMWS5jq4t/=!P:rh4Ag-J0m5\r%8"K!hET#85k?>Z3617E_;u<0.!]q[=VY30:"g+(F;u>u?O1/8jgG2T2.'m'T-4;s5gboPsT+<t6dJca'^F1G-H2\/\eRB"]YS)ui\r%=+'j5b$g/#=)]dQ!f&)U?SP53%L^6_Ymu@(=it/m%S$+mKILPBV&JU%(oG/)r<[u8j/%EI6Tk%CC.t8r9n@2^CeUJdY8Ab0oVo7K\r%36@!?Y^F*Z\An0?rX(\r3i4Dore`pA<-h61>-`GNaU6&[WT"9KVTQpNWW%c`.NHp8qC@<"`aO_t=8;DOh-l06=3u;$jfJIEg2E.h\r%K!^p)=oD`0=Ok!O0+SLL7W+0<_s)26BD!Xa_NG)T[4XQPA$lZNKVc+Y(pjWAWJoX9?ELN)HWo1f!<C?4:_nD7?@MNl0d%qRW`J(?\r%,"\cdRDNI9;E-pqaW9_E:M?$<gsaO>3oE2gU9t>"WJl1Ne7fY\;?:DuX]?SoQ#W_83it_Pi*_R@X]?So($E/),#1?=lku,5jkWL;\r%[P4=I,e$QfpnLT$h?@uQ.8/0iNT1@6Sbac9$t6&c;5[7.E.jcO[&$cG(T=&7=0UuEdR'Z7I2AKZ;o,D2aEj-d>'AD0o!Yo#Q!*TT\r%35SF#U/$=Wa0UV)h7%o3'Kd4b9a"(YaXB3E)FY&m&^4<K)F^5lKGLn\*m#a<pKjgg&a>d>Ca+57>088A_X%nl3ZVujkHm^bW5qF?\r%K2#mt)at0-`gPjc%3,a)),Nnf7M18IjR)Q>JfTqh,/]X'MAU.RW*ps2,)0lJa;[PV)Ip)1P/et#f(VCU$oX6mLlaBLGdn)IZj\^"\r%*d<r6j^6'^rHne*Q/^h[JI;*i1&$nMG(FO2%Zhd&0"$-;DMKD3_J9=N]@LR[GEo9$Nu&'`c2:%d)#fYc`^*Cs4e#=%h2DtRGbuPu\r%b4j&!:b"%APr,T'*tFn><1=/:'uJs'oS>o)#d<5I\,'ph-n9Cq\Yn\8hb)]G:Eg9nVfD3JXa9LPP$W=WLiW%IT>j/ugh!Ca'ji-K\r%L#6A)`E,TVfos:Epd/o'[?pPS[V9UL9.m7&_DT)ij?hJ%ar5<\Ri.p?eH6H[M$#kQs,1Nn^4hh:^mt"mlqDTe%:!d?*IdapolGIs\r%.K@aYY!kE?\0"1@]"G1_6p!fs]l@8f/:O3C>YfLJYoXK)a;NOMXDsgE1H6&3.3t.aoF-c[*b4o"*XYg\Xr3b7&ngln`'DW3N@a$#\r%Z#8A9;B?G++[RP6*Ri?\lk'QJ,7A`aX:CAYm_K3bLt"Sd^&_#N'!(%(GtCIL*YFl/A1h@)"\t,hfce)Kk8k-p<iZ.]=$d"\lSVLm\r%GO,ab#89k.B5m?eT8D_^1P91]h=,bZ8.XjSG$((K6cpW_FbmOj54A@8TM(XLo4K/NAJY3+6bXG.k8OhML2Pb`T<%/sHV;HO!nL]#\r%6]sWQhYYTGs3=rWf^'SFNn;saPre5K>-6ho8dN7<\Cik*'lG'7o5VEnnaSkIYTK"M$YU^Rn^58N"?g2Fh.!ZJ."N)dbl)cgCk6*h\r%FTr37DQRl)ef#=,B4_Am]RZrj:>!0Tb8MUH'FXlV5q>0G\ZdK`Z/1sk"!o`D_736el<0!%QH3k`D^;Wblijefb[oOD%HMV0Aap.'\r%_APY#b5=KfN1AeZ]5*26BD[8%Pi-]mOp1X?T]0k_!-60CQ9Mc2mQ6K.Cr?iLBm]_n!suUN<5X6o[Z>mJ4bZY:>[hkoV?U\dntjPE\r%'8pE@_,n!%5'rWa_[6eZmcFb@?SM..H3:j"(n,d@l;FEb\7s#=/RJVr13O<jBup3'A=0[]V'5H:O>.DhHBF,?bg/Tc&.]UlaS[UM\r%Y\,-4/OX"jLQ]BN1h:]+@l-mo$X#A:O,\j0R">MCQTYo*8JJ?QUKGV$?)]c;;acOPUQ;%$N7K_$)D]W#g`FO'haKs\U'8lsI.#%Y\r%7L)pr;o^%1Ln5E#)DXMbGs&jf6UU!K+WL3W00gm_gZhgh/h:%9-B1-W2U=l\k.cA\ll)d*(7Xpk6/f7LYBXe;*;so#PZU<GoOeob\r%^Tb#**D]okqW0J^s4Jf'=1-j)66Ydg,bT_u(#iaB1@l*q`rd)4GY'%snpJ-3ja\Q[K";&d?u,1k$L3WW(,FC*A/]JgTr!:g9?/fI\r%h,<a:Cu[H!Q<o#*d^QB.0$dEL9L:sF3K_$]fN2`8K_"m@/;;VN(Dj'+b@.A!m,B5^E#GNfXhq@GYC,sG.i!ii=XlRO>n5HR^:-sJ\r%quW2XqPR&kn@AnP:HiUoqR*QDYAUR:MU4:se.&M$IXT\^T5iu^FeeCJ/9"F#N890_)Rl?gJc(@QrhtHDJ"W9G]mpm3fe%RIP4A(Y\r%Dm:ER+ER_!rr224NEQk\c-Ym[YCAW"Df3'8Dld<R60GP)$\*DU525hRl9/&3[JORH\rk!F"K%g2k6.@,]<?[o2-"V]ndk2QTt9W/\r%Z$ZH4FOn%9.k\AN,T#NN<Sb\Z4u(+2">9'"c3g$\&Fl\arV(Xt:TeGV;i0(+Ec_@^o7tAWmd5&;?gXB?9s5t8jc8=L_8]DYNs2sY\r%G)m`bHf+Tdmsa5ZlKqur^?+DsoYaCGj(GES2/@QKSD`ih6LRO\6$/eS'uSNeK*uT/]A8*CJSOsTejNGeqL&RWb)YZ(O<4Dc[Siok\r%(K9Jj/ZrO%E[GuMZ9jk,[su^"";!/tg/l,1LK=kA6>)oT;#K*]+MW?]^SrgmF#Zn%Q8XZp0&2W?W4j(FTY1df6X<KgN'"Io=6$%P\r%i5f5Ncni::*AeOo7a.u_H1_bgC]<tgB5]G/J)qU3N3(<jp<@"Ts&cl</Fj"fD*H/q'f$`[NFMioC4Tf]0bd0,67\DX;]3)oDhZuq\r%oZCqJiM*Rs&?],Ifo95]5^5RU6bSp]^ta7h2ditSc$+\ke3qj@JOS5Nh^!n."sOk%;2JEMQ,RAJXo(pR,pn)C1lKUr(DFQ088E)R\r%OHaE0LMUO@XQmdeeR04/G3M5_m3FG/&ZmbMB-<rkmIhn<E&Lg4D'4],HNfkQl;kC(^4gd;MWX<P-Mf1IioqomcMG)LV7dppk+L4"\r%1QBOsFkSGLpG]82<cEP)%MDt-lZa^.-DBolJq#k?$Tb1j\k49h*(>)a@c?@SBYgR:]?.AVq0obf0+.F@"/QXK:%)Bi\JMSdR*n9i\r%$o+7FHU#0SENF$UcdqFQl7T(Nb``nDAb(n`NGmWhk$\abbtJ#db9jl^O94rhS_1-Bji23u&"$+8#heZ^QtY$oTR+@ST"a!q3&:,*\r%#(^;gE+H0\(BBVPE+HC-gs!4qRQE=7Rm'DthQAZjg[!JSk0!LV43`>ZbMpM*7c<_uIR/,(po6X5jmB`52C_oa/'VG9%oVHfGFiX;\r%0/W.0fgPO[>k;QVTbI4reSBW)*SV54K73&CpU#6FJlBCEf&ZQ9]_]W\f"Z[bg-:l^mb)m8p:o6Dn[f)nDl`;SJ4]G!4a6D-dDO.8\r%om?3J3\`.cBVF'mUIBDDU7"d>gCL>LG+bh?j)B?Y(l]F`-h_b4@OP@@!&CYc2q;--RQm<6A#e6XmE\tNGu:2b?F[&tTC]gXrqoo'\r%79*]mT)OJ1]",H%r701bY#r#nO8/PCRbGEp);5;_mD^E`nMAX>FXC^(cTV$`O5L]>[iZ\V'&fE4WBR\&%nI?A3n0Yl+([`&Cb2aS\r%A3gUsU&B2AT[?>:p`Bn?Ik9g`Z(UcpTOn#IKNQTh\^_G\nnt?#Ite,TF.5K/i4&gJ+rL^qqY:j"Tn1Ff'k]!p;ku$&S=-+E%rL)Z\r%<l\+:O^F_:(C;NHfo&m[FL'`b!320B83.f<?5R]umU%G$X&FKn!7fZp!)bKNEE/g[ahU*!g>!UpS.&_4PigPY9J*dNnWP^PVNu^K\r%$VUqC"0*6988aF[=g]JiZJX6A),)Wo+,4?)7`Nr0Wul+m8Xio//mPcc-#IDq1Pn+e".kINAXLn?HOQbe\h:WiHNL(1iF:glCb9@"\r%98Ii.D/'q8K<6G1C6_j_;p4%^NNome9eE`4`S4SEVO#[k/3%q#C20Fu7^f_I0a0.qWPpmj/8/dXZT'1H/SSAROMM(h`]VD*lm+'M\r%:i]5]i$lY!>109KTWaDgCIt"!n4"0I76"!nn18$c/SS,kP^':3-"LbeQh0sD#J$3Q:3HFA:S/,l>7J:b;^K)J:De,'&=>crqI(e4\r%(92=L:t^sd^P^,to2QYm$[*5Z*%df_1g4(a=IleX'#1%BqtpRe9C.HK5O5ueo^&"?Y.[CrE4"-i=h'3CE4"-i=l\RPR\Q_!cgmYD\r%ZD489cb^E5KVPB`ca(0"I?%>QpMj8O4</Hu^&<9=Zr`ie68r>a\j=Kn@9!U7?]7'bLXk6:p^Ac@HOJ`Qliu(;K/.l"J4Dk+T*LH#\r%Le!!/^+g`2p>/hY%F(nj-A6YT3Sh*_cqF`EMkdmr?'f?!>Baqr3B4tI.8[2f:/q5lq0n#*#oCF/O8PXPX9HL@`8c<VB[j"&(ZS1u\r%'Pek6(.fO#R+nBBHq@5*`&\7!e(tjI[2=Fb9LiMrT9>Y'6CW+mE?ki`00>4j\bHN&E[R8D[J1)oc!eJ_,4QD2?Gs"9%"Q#L$b%oB\r%=`Td:4&P0&XOf:\BckuQDU+qGV3L].,9._XTp\;$nQ#CQG,M:5B;c4XHn%9JKhca!OF'$6lrm]\E@E/QnBR;N.B;SL.\)qN5=O\i\r%0.Y$(r:7E^b3?J@2MK.87>8Hp%3;mgi/kLAB'SS3ed#2ec.J]Wl`%Q.-&h9k\$mc"QDpUAV@E+dDK-k*FDD8TV<i7:kEt7J;8^?B\r%U/B0iS4E43k=IHWbJk<1h.!j'>ntP2*,ulj;m!n3hCN1Yh[>WNWc?I'>[9$A)[]1nn<,c"%0`Sr@0X['nNK/;_?ZtaO,a^"6!#F?\r%R`[;LJcH&\qu\9A7KO\bmm`0#rVA*]Se.mN!gTQ0:C+*[hN+*u4`uL_m3>DL3HS2AnHS1?6Ic"E%VW7+]NmZ/kVHFeQ($Sc0/G6I\r%FP'=600_!`SLeZ1&:VRHfSrK^GLUnOh:1u'N6UW-YeoZ.;0@@qMiD.fWlWs:QeO2Oj6aib"&uoR/"&J4\<$bsd<-&mWON"7\`Ujj\r%akRr(gG!3\h"SOk!*Xn':c3pJgu30D%</^r7J2bQ_ouOPA8[aWI;dS/,:O2@A8[-\+U)EE^R?m1?Khk96c*AOY;eD`\FNUQ`J>mq\r%23GG_:)e;pHt7+*@7DSbT=>*G]IXdOi1\e6mJm5Q4T1$g_KC$EVo9D/$MTo%R<rESIGK"QO=As"A#Oo-4YW$$-Lk&i4Ks"4;Rh"e\r%l\E!(Ga$IMB3XRWF8<CE[WU3U8[e)&_olY+H"E]$3SDaN\u"50$tSkd(gKZGHI'<3itnaJlXoJYU!l;,]/`%PCfEp$Fn\#<N(jHu\r%5Tu?5)c+cO^#MCfNp%'jF+&,@37D+]n"CXHqq\&CSJgSB<U9A+#sK:DB.=;NYYTJX^VAHIb[aFI"=AQGi;o'E=nbs+%'fsZqAV'N\r%5`)+8;tfoGquS8@%sei5-[Y5]H%+O#mrgY)U2p#UGO;g:Q78(ADA[[X]BP</!IhfEV]1DtF5NZ5)Qb>NNb</?GIm_I*A'("GGm:'\r%rQj!4PMNU#Q!sSJ?`Dm'+-lP4I_MMJ@dgB?*N-uX!uu)\q>'dX*n$=Of5=k-4inEM?g(qUa[)ua!t`C?S^GtXZ<-?.k1lP>4NY"e\r%\Y&?iG*[oebq*%EVQ<"3l?fI]D<*lb)i`YMeZIZHG("Kee#<9BH-?;ppAM<2P!C]p/.j4:&+<6b(bX?OOAm46NFraf]dJ3(pO\QC\r%#`-E.W3$W69,@Oj4C.:N9j:T!52Qd\2qc3thgh)DhZUf`rVrOYE2D03c)c1Jn+,Z<kA'JV24$Q`XLck3=4acZG90)hm.UnOb45=d\r%/m6Dkb4"fB4>;p#-Qec5ZK_DZe$Y9`oq"8C]B]@6cB%VOcI&`Dful#1$Q%8=P$[=J?G$#UNNPGXkr2?FYj^P_5!oBr0Lf!CT=hW$\r%N\X,-(^cQhWDRB=>jD'P]BqDuFFlNV8n[d9<Pa#<kh4j]/h^\gFm8S]0%i8PSa<8tMs3H[j@='`f[uaa$b0s7C\Vn(/M2&lJ(+gE\r%ZJ'96VX4@/n@e1D@b`R+$Ji.?Q8Vq"C:3%Gj@*>o!G8!57T0E>0E]3<]eD<?%5ZB)`9Gc:<9,D7d`atgDk'Q3<5T,t*g.pdT]02t\r%$8mp))42sCn!k>/1c8)=1GHDH97_3T:HqFYG/hl+i4TL1kQdG?B1PbBYqcDen!-3KjC\[[2L]'N0!P!V)o(,mr7Y06Q7U\2+s"bP\r%&KTZ%1BR_/M*MML_[MKJGc0k!^r3@,NLphgB$b[_n@MfYY/mNhIg&+icW(=?b$HD3B'"6K/oQ)082M%3n8t#;$oH1AC7lP&E',t2\r%fs]kE.3O<Tf<!9bG%kE%MTQ?d(rI8#$4Z*Q5Retm"!a\]jqHhc=O_\kWAEld7Sj2$beT[Z]tRnkFQ7Bj3L97*)QX_:n0\?g+)_t,\r%gH4./bI`cVAFFnB.R?0%5F?ee[X42:$*$"<XX.h!.A<41IQmj:iSHdf25f)1d\[dBqm!Sq[&N.`!Yct8O\@>SLH!r<OuB]V(0aGc\r%e:QN(=BeGPe?ZW[0t*CTWJ+B?G[!hpe3a!XhU[iJ[1#V"^$/#@>10:6f?kUICIt"!L8h7s/Afp-V(gA8/[.ArA5"T2,X'o31/*D,\r%8CVt7:sr\cV[OH56j7S:YcGRn]I@`5H!2c9erhr!Ll;U';hW!:iohDJ0X^71fGIgcg=3uf(POX@g#(rbm4STgXlE94JtPG0_4H.h\r%=m3jrYEBm-Z(I;N.OI(rX6>T$WUTdfG)mj'h4XOGmksCW'Zkbif-Skmi]eX/cbansf[5SD&sMpnm+kOMUSYuVZ?Jh'Ng:SJ$_=On\r%7n\i6L!tJq*%a$sQ@3%PNn,o=GW86qG#!C&B:XAFk+m.-28.O44Z/kAln)W!Eu8/6p(m(JAiI4&m4HP9@lLolmB+JJ'o/RsR,u^2\r%AeiC5p9QTY/ojbd@7s<N@;%Pb;KpB_7U%.gKc*8]h1_PVi,T,\'DB2SKt)j#*YTk:L.:q^..MHf!/IEZI8Dh_b:lpD@t>Y!%!c*$\r%2S-J1XGK56>XCD1M5nO]64u8)8"omo9Sfn?pU*_L*JIaH9#;U&L8g4;kXdEM;.pMJU"\1*PLYPoOS".f7>(@B8M>R;#J!Is@!(HZ\r%jV7SgL!8Rl:,ZAfM(dc#1DX<uHR,J`&GF+DLbEujcV`YTkblM]$]4AigU$gVQqT&L`m)4(AgEI5M`\g,N\@3G$gZ@BMKMp7%5:0B\r%5#9!25$k)OF.XOF`&*cGL6ZbF+j^X!+YmgN/Rb%rL<(of-caqJD9QUc9=)^5.IaKTW#E^bh8Iq[7@M1;O`W_`IN^Qf7Sek(Cnb9[\r%[n0M-,\cBp]3(O3"f7WnVo7;*-n*>FcXKe4_rH+m__hkp>&3.:H;m8uN%f;^7Dl\jMa.s-d%_KtVEV/V7l>rl8Jg"JT@%*T\:u&3\r%,Ie,ZQ>>^S21TYEMee]'WJ9?Dlf&g4Ql"cil`sSbAR*-F`C3[,Qi4):__q)5)U9%pB!d;^s.U71@2#TZ>XNU:[@fCEdXJ%?)Ljp;\r%=!LlNehLH86Vlg(l)&dS)MU_aTm'3?Ae.<WXG`=\X,:]V;%;?WDadnuE`a-XqR#qJH4Ce+PEgH%Up)K+9d%Gu.1GOZ1p'liTkmh4\r%n@FDt0flBDWE38.QbosZ],O?egsF.[dL8),G"6\l%5HRuBp)+MX:*mMPdi?"@9rSAWKLja@Mt30M`R;8R_U[H'eDGk:cPQ"QhVGY\r%lV\SNKp.J:EErph\r]CY`H<U<lgeV`L#]`YL35K_m%j/%Kje9ZGqf>]+VeMNoI$ts%"Wk1it(I-4XE"JThJQ)grYej0&9LuD2.>J\r%)V0V)U7n-!]T/-7\eKmAfpuD"6V%.h'p(QL';bgd6U/'h3\gINDcdgiqW,.=Kje8c:8Z!Q.1GNoc7V^oQbosZUb$2!>meK\THf'/\r%mh-#o18Oh#<k""_WK[bU1/)FfQbosZT[.V2CC,`<TqB2F7&dCC:p6+n/qm_>FuhN9Y"N2*QXNeP\eKmA6,t!9'VV2!26"P#[[)#;\r%(Qe8uD(TI#$bp'.Cb9@"$S.,p>>*]"1/%mV9A7lN9En]og=/G]S-KudBPJD3K<6G:C,sE\g=DEF[ID_-ZaHT'/_K6I[C)f)/aOg/\r%[T7[AA8=c+>#%S3[&kWkC4U]]coMpt[Ceol3+Dg<e1*-CRp,$8bXd[o6IO>?UR30$8G?2JPbDMX#<=Rg6_'/gd(IJ5C)P76GaXOu\r%"XsE[VNtWY.&X$Jh&Wc/QF*XQG==l=>mg<B*0nI".MQ^mKulhW>aN=30#NWk[+'bO3GJ%`7nZQY([egXa)rg>l`u_5k`1rI5KbaU\r%*A'-tQ4`.jWU[=A4Vm9qWU[;kV%i0-W<qlWD_W;c9@2NN9J1rjd,+?UOdQV1_6>Pi)bLK2_]rl'%S7X56TV<lT&rkK]1?@9@ui98\r%GKGV_q)[mHaG$^(>sN9>#&5iIFePgrgZ@Ge\/n`'][`2$jl-g:E\t(:nYM'F*o0[Qeh7Wp/'^jskU7/5;r['jKY/R9/3s5!^D?>S\r%P$Xg"22JG4fo0\`p#7JI]q"^m7e%cCf&_!?nqo*GYV(0%.MlG*@9rA$,k6S.GPlQl!/s!3>aN=3Y#("D#elB$?>,_U\1WJD?-iu"\r%AUb#?FWi=P+0Hn1eckYSPdi?"@9qOCB5][BP\.-e_U30J.*_*(U\JFg\Zi55YI.92TgpuI8`2p?6]SB'W;1RU%6^^7SkIMM2>!i%\r%G&F]/Y2MUE`MCD_cr6p'CZt:GS>:'T>XQhT)>dl(\:u'T:sHXT>Z_fVa#%cFM_gXl]!L"dO)*s-;eJ!S1Kq]Ca>NV:)Rt]UbVb&B\r%InpMW,>:5HK@]N(g,5T^0\o\Af?cm#(oBL"Tr2q%%TUbe%3SO3iYm-p'R^d7>XM:t@jb+ef?g92!d@T[f?aok1,S^WL(Xo[H=3PQ\r%/u1%3EErph\hGF\$Z7@*X^s<"BlHF>@9j(#Y"N2*([cn+#rfef+C<*1_@7OFZt?fk?J>le1Y`P:%3Yh*'%`s6X:*T6[5:5`bA`'5\r%+\aa<Ymf%1(S_jgKlu(kJf*+90WYYRI7db2_QYY7`b9?t$H'F`P8`&L0W`I`+,_hdUr0drk/ClK\mQNl"rW_0_n,3'T,V=^):euH\r%;+b)[_Q^1fWjuA:<uLIs_eMd!4'*3K7Hj)I)*7VLW.<aK:F$ZO=a-Z(I?%lV%__UNEErph\hN*)*7q#@X=Hi8$,gs8%-mt#8Vub2\r%(tOD48n#Jm4flhgo"/#[0!V=;2lmDXOsk<U$H'FtMj"e*V(etYHnk%6EeeerGqj>EQbosZgCksSFX[ab6;JmZY"N2*QbaJ,-tmA7\r%:c/r@FVuNYXX.h!_0(UB[A6MKK>lE)2RUP==`Htp3E++,/Yd,6BiE4#Z=1bm$^t8_*fIM8UeNG6!liqtd\bS`ne]F!;DTsAB5:).\r%=tn&e[^@0(e#p!R(9[MnCb9@"$_BtmX^h,Xjn^X8`-?m5oan`$m[.1F%)t\o=&.1BNh_+\VRF6sU^[3LI_d.>#%_JPfNQ_#(4K=?\r%&`[Fr/c.+8@r"Z*>,\lg\$`#+/Qg&&D(TI#Ms?1;lmWA/Z85FH;2'Up6Kmcn5SYaUl[hmQ-q?p)=;ND\53+pW#j[*!d3qLX9j!_o\r%j(PF^Z]#_k99#QtY(!1AV8gi5*Q9Es99#QTR*gq[R]nEjIpk+B"RRer$-@(($//VQ7clD7"RRe^8Yj:I.0RTLSR*q7L.GF52uBI.\r%,T3s+-*BmL=I2[!R#L?/(tJlWF>Z=CW3EFE2@#;d`U@e4GDGR+V(>Z6Mr3R36r7o/QbnbL/L9hBN^AnXM%X1ZmU#)F-o=ULieu<a\r%Uko6lSDVp@^-^6U\iVa)Y>Eo2Wc9'=.jVe:;cnEeKQS00[.n)9lS;-ci[Y_o29rIi^_\cA$[qu>iOCLo@9jHoAdZGeChJD<f;11&\r%$`9MLm4[V+0!ngQKPSu3=l^D8:<04Q;,p_bmCY56)[]1nRr-@(Ca^^VYY&AC2A?Sc1/*+$6gkPuf`W1qiQ#/3IWk!h+uS778RYob\r%l9Ya-0^VaI@3*h92>!i%L.8=SKJW0`/bX*s0kDCCaT2M<9s"XiEkp%mXOmV"3FM'a%uLCYlC4pp%ufS"\N,MXA=+.43I.hZS0q'u\r%@8Nh>#S)#L:SfcTG+g^h=,*^B\VfU27!GqC)2:QsVJ5:Z@9A3ARU;s$_q3Bl29R\I6oM<d/mq&GotX,-%o/MGfLN-D@Fn+/Ah5Nd\r%?,YP?jb$inmg9+X]jl26Q3X*3!1sk3G+4r*;Q"lbf(mAT1@&?"\=[-T#j]bXX]sW"@#1D^c!jKg@G@fM+5L1p3gj8jYoSt&[1&7l\r%[OPt8/rhLT^<B<MXi+UDCtA.tlho3_0gm6Jmha6ra?K&m@l1Kl?dop$;/;Zgn"729c3me[]7>.A@"bZ<rMnC'hg^s(9:K-2k:>9\\r%![=QMkKEP3G"B=`mSd$AHq!p=:1'X#o+aF@L$GpFi@7(E"Y(rTg8/Ab$f/q@d4R#'?#V.r7_?#9G-O'?Z@cG),,iZ#/smK=1qd/;\r%CQW@W1%3"N%<dGm?+X$=#.niN`7"`71t^nd2=/d1dhsDpfG-W9VIHdQmSDC^?*J:QPJ5`0SAYZEi2<MEF,h=._L$][m@\$pbL^mS\r%5Q&;ZfO_8s#"]8IKbN.f=pDSI1T_!p31*2npuAU*^KAQ,aaN1im)&X0W^);XrJI1koH^bK-i6BF$FcpGAZKtOUP*a@oTYf\0&M&Q\r%4k^Vjm(0F(Nn-K8/U&S_YV66(Y>H.dpF=RC?/B]959b*O/$]'_rJQ;WIWTt$LVE;oBNJWhQlR>1f4ZTQluM[l][8>`K3d]""\623\r%%!L=UKo]<V5M.jM\)cK_ndfo;3uJtHWMc)p`*E$$,*AmB?6j,DV'Yom>@Oc7HCL:MhnMq1h<"(_s36^sYNU9?HEL4,?_6]i4,.Mo\r%hohFmP'4R6I4nt?W,TII^%p]HR\"=/F^bU?,h%sje8eoFnfCt/cdMiV(0gRTG?8Dn$bbU"PaiL6cZt3s6r^pp:K^LU%Y'-m%f,u2\r%^#p]kE>ZE"raSoee<4FD7d)DC)-rW[WISCo]`W+"@MmOQY3W(d(=lr:X6VfrJ$W6+2J]E<\e*?$6MdNU.42OL=8tn0'OSTuHM3UX\r%%&7T7TJn8$JVY`_AYae%@O`4Ld70J9o#iftGnQsm)2<,N'#'CDLP&3Z^Y]SeQ(/kM?GBo'fj4%,8,ZaI>/a9JfP-18L40u5^h`uK\r%d_B'W.\^2N.r0hQj^kXnIC,jlk0e#m?W1!?Ag(N_+/E\V"oJCNJ849!ksXLm!gO;Pn"ZWUT=<KRW7A"=#'8!3:dpj`E6Z_.&^+4a\r%37pXV@'s?X?9VH^ldZlK/+;%Jcq!q57eM*K3kCg:f!9FTb4aW>g?NFXff?d>RUa<IZ.7)`*9R"BQb9\_aeu6QOQB!23aA[$DDj,%\r%q1m,J,$N-u=4(`-*8kF#R!U+c[`FN].\.(X"1'u(DZeo-1m*I702go#]q<M=io$/=G)mghM1]0<NHl=np/BcFWePhUSTde,@\,Ra\r%?4ujoQn\1E&uCkQKa#[TJ'sWknn)`mGM@OTLan+u%^-L""BY=O.##Bpf47@"TV/Nok/o&-ThMTpIUI/mr$*S&1-pL8)a@0=A/b46\r%a7BCE9I>,#;U8m=X)jT_N]R]6<SfZWIL60A:r[#QkSL5@43D+)oKJN^#^*PNaX"]Yi%USu%7Z!hP=\%M010_o^\:n+JMJS$\5&(I\r%#<Eg/K?%"IBcZ8kBj(,>?\LhtbV"UX$1(9@[m])_=L1milcZ`T61n?lfK?gYUA@LkHl*%d&pbd<%E_9Drh0\Njl8.l0.8?X_Is4t\r%qXJ@+NHBJZ!EMkcQ/E#b;9e"dqTU73T'H+cirWY>W`GXh9MLZ?YbKUNm&lgC*nEu0(njqB],RD.>,XbP>g/7(<_>nH4a%,/M.,i:\r%jIi,pR/MFQ7;2/@#"XE:M*AA6$L*mL/\aK)<g7Q6iPBR;$(JcP3=h<G"]ZA$*tKF1Y'"mZg'E,>1bGO`9aJU&e[XY-X5]q=Rd#@M\r%c.#MO4R?U2BB.f?XlNpMJ=I=tkjhQUJm":h%C;4F/,^rA=0Cs._LVlcJIRf+*#Jar`1hfk^60]\=>1X11/]t8QB5@&NX.Y]'(Tp*\r%YcOom1Nse?e%6aa:OtV(Ykhk-rF>B'@qSKHDqaLTrp,]Y8Q\>uVu9nkh+N'$K;NA#:%d)9jpu*@fs=WSZds&$!$MJ)KNH>]kC4NN\r%q6RMUe#B7[m<@i:GGk8;UQ8ZbAgJPJ&/aSi7="-<YkN<ZO4Dl0PEQ>i(?SiI4nn#un?2H`If&[*,8&/8NOh*^":=tjP7NuZkkkJ/\r%o[.I3I@S+-k?UnJKs_a\(K`"!Gg(i"bQTUG%tD$!;Lum#f!J]?M9]%E?i-_!!]M$$Ad5/.U%Z$AhKa@<](;,F24(S^3K%a?>up=K\r%ppTMYM;J6:%OZC].`gu4d/ce-L=J;RmFXP#LPt>-Z'G4_VP_`k2Z5!eA=(+nqhr!IrtOpR77_TcYjqNK5.s.Kf(8@5*ON@e*k-,T\r%mqA0PIQH]L<4nT+]5)sO7noGHL9(F(*-H($25AI%-OJS=f>,1[Y`=/!]fWA(WgUGdo;u7J>HT8k"e5AU>.S@,[!=+6.tgDPRDR?`\r%Ndo,?BUKI+C@K+c@\-1V4C[^>2-k%t\_7*X@=\K@\@tY?]dBWa[tAN7?$].OZ%K%a*kB0=G+;Sjpb'TGq/EAQ%"2U^A?o4[[p(d8\r%*KbG+bYY,Xn[5]P5"N(f$HKpNm2Y#O\!)0M3N*_ufq&_b%_N2)mJ"3jZWXk&IE"&X^#Um5]F>81-)@o:2]jsNg09EI=`s&<nH0-0\r%2lBo4?f:RnC[aF,T%ph?3A@DGfm5fnIJ7Jq=s_gS$Ko5G.^*t1<bCf?FEr-ZffEhS]l_!)"T#`=Fu/6*4)VQT=3:A.V<HiG]K\<O\r%!E62ts#iii@d8:arOTM$aH"CZkusqX&o*c>ofhC9]l:S'>59Nbk%YOn]*BTT3Uk(2V=/^;db][&K$"Ih\^f4sk+If)C\ue6^d/:4\r%:NOu,\D\%uPh?-ES=a$^gqL;e4JJhj5CZ5mDf;7b!9N5Zig]\i0=Rj9jPk,%Oo4uVL!+0*Zr&Q_=LOdDU:'OE]?D6qS077CY?=rA\r%m/-HIEG!hYkB@<oo?YQMOWEI'b183IED@30B'GCfa++d=C-:O^@rOc;c]D;W@`RD4"la`+Buf-M7Rn\&^lIr-gbHf/Tp*W9`rOjp\r%.*d[MMY;4><HW;DG(5L."tgp>ba9!Y*Tt@@?oeV)r,GJ:G)SRo,nT7X2=k=FJoOOj1I%[18>\?o*`(o,5PlXE:0aA!;AOgCVg6q0\r%mhIVR\,!eiDlLmCEM(B=S.guiqGud^\4DU#b!0^fQ`SB6^%.P1[ks:u3-``4VLQrkaZKMYN1BmXbcf?0,7/>=)L72?qT#*CVJW\X\r%Y4eqr]s5d$lpNfWl$/k.=G!)Y,60KXndk,AV2tgHB6L.N\@FSt;l>*R;``QfTq)VKaHFA7%..S[aZ0=\?1W$>'>l;Tk:>YGSJ\5R\r%0V_htfI:)VZt9u><+?`mSXLhS_FFoo+7aF$X/p%rN"/q+l.DG(Ml0_Eff)'o`R?AmWDBpH63CL0O;c*+8paj'C'bs(eh"$e.^*#J\r%8't%Acp+BBc]'di.)&Z\UpZ&\FQCbre(7!".gnM?L!!DgX-SoB'A6KElYRh5mn.GsA[6eZD\JPjGO_$T2iUOBBH>R!>!1%r:&e(`\r%>!1&]Sek\4jh%Enm.;A_Wl;Sui(fk]c/tTQ]p=p%o^Z0Ham:$:4fZK5I]u3!>X<%)WAK];aY-)`()t4U]D@+Y9?R1</mgOE7It;.\r%q&j\sfmF#CC78i35HnCBhesELNkPAJ"fE-Y>h79br](nK6FWoG.f@Hc5<!*bh<unt_P#%D#f-^M\69[qQr_s:)Gq'_k.se1O%;;Q\r%<_:RKdCjUM#5?cFD-&^U9-:*O3_X@!lunIN=%2:3]k4)ZbG@emSA2ZE<g]ibZLKF-FkE50+q:sZku:8VWMFsO_&\)t&'%LtpR/Ym\r%^hgmbfrj^QfT2mk,dTR>3c+fl[BO*:^Hg?B>%(I3V]3>3b's5q<VUl'K79s]m[NJ%Y%pU6fJdQuUJ%O5+7Y")G.eog,O1`\B:@r!\r%lIk`*`a$Q7gV>lDHsntO#*ti3[UX:67A+/Ao6P,AD>\g!R+9=1g%HZ`of;o_^\"oi2d]eGqFnq*_MgL4M?B"CnOT'TkT6M,QGkbJ\r%=U2$fAT$A*=tDq;Z-4nSX^t4p2DJs1(t-K,8+-i:f?9ck\Mg^t?jTHArK,'Tac*^$@`7O0kRi:sO"WKPs&i.p@Hao0^\V<4eq;^l\r%g$YrFIlfqHbUW%:\?UM5#+`pA0&E:.q/"q9X7tHB;sh;%Y&:&+r`/k=fe30X=23OZ._(c:L\J>Uj`S&b^&E(6$e]U_nRRNlF4dM(\r%OsJoT_n@^W4aZPh/pYm=IT(I9iqI>^>ab#W'!8:skQI3PSaPlcb$V?BhG(3OSI'2HM%i%fD>/SJ*^>V<Idj>nrPGHi\ohMWl[%T(\r%X,o2SH[,/1qrk6hX'tog,QV^r'/Qdb:]_J3A'V/=Ck!\sp\PQG1rg"/`O^s#Vq[i+EqV7E^Me,$`E85_N^FgpW4Mc[r]09X0oW;V\r%b)?1F-f.RR]rHW1NTM4,<(^kS0+k$?8)GUf8=ub_9:JB6I9Eioeb?opYRg4IeFh>2Qs2_d*cLQj*8*sqH=f+`$8Z?H,+Y')qsld.\r%SG;m4gIo#\ll&r)V1!De)uib,RZ)W+F.;?6bJe)&42<]2>Z-$=M%o91W@$"MlM>?56,/p0\%k,K#K3MrhiE!PXfJ3bh)bR0UOpS0\r%,cEU/eRY@LE"CrEQHE>Xs%p7D'24N_,W(6]Lf%HoQ3^A(/2dmV&P4;WVU5*SQAs\Kc:/2/H]&OqbO3\/;LGfTr/`e>JlP%Cn!P`B\r%[+@1Cmp0q?-<%(XJB^F:Q@ZRlAMsqHAAMP10fI2hCsnB=*L>oHdGDK3Lf#Dn.u)10Yj=kA/C>afXt:AJ/CFGhBX1ss@>X\Z``c'e\r%@Bj%I=so"Ia^5Wh5mImsOp)k,WrG'pF@@tn3rD_P5@HiZA/pp8Z(V-;K)Qi"3lYSgAaKh'aF^S@kC,NE2W,%Tn:-&oD&(=MpJs#Z\r%q,m/>U=XDJf.,,[Amob7?`T9QMDN9hVc='/9e1@qga=M./Yj#6kYH,Xks/p(`kknJm"gm\0XPZ"D=l3HnhBsqRa<O^++<IT<aSo1\r%KE`f$X]?So'goN4+Xn/<dpAkO+Xr[AlCTsW2!c]N[7VXV4#M[/QIA71=Yq:NngcHFDGK/DQU^)si!3=kU\E(W;tqek7C+>,6CBR)\r%pPecrY3P?as36'QD<=_lkaJuA!gJ5a;PTNuSE"b9(V3Q4$u]2XK7=P5!_Q#^]Zdlr9dcHDl==lJr2`Cn4Z"YEgem7.F]3KWhuOTf\r%^`4,(90;,G9eHfWD-L171`</<RnBNTXinQ7h=ih-csLt#q.[lZd6(+R7Q/0F(0\8em+b:"X-!k:fS%UdiQo#Spq"i`R3GKE-c.2S\r%]5LOO;ojQn=*>B^N?SRr#^mLdUM.AT\SG`79gnY\UPtr:2iY5%:n9.Q'WGJ``>_5X2A&!LELm?7;8f,<:j!ps'JV!R7u=8NNeM9n\r%kSr+\4)c2jmA[BIT_Kdl+pOOX0VsaQL2..'GtFce_'VK]N85o9]-A1^$oS^!a[/H/Qd9>9d5"h!:3"mF86E!:Q'cChGCG;gF]tF7\r%quH()>5=(4W6e2hX_P/'SJa&Vf6/cr.nSdkR`A4_H'o@R_.`%_<%>=G8.&.p+Z5Nk@\(MY-ijB>,`Aka.R'/)fL]m3"-^5u9Kq9]\r%;jbSb8M=;]l:L%+U_e:89#]CCaX2U&=C#W'T#*6"GQOUR4LXn)C`[d/1Qa8#0@WNFWo,X+2TZ,<NHik\]O,!fo77g_3n)kYS34*/\r%kF@#V?ePlBkJkHNh'lacgE5A*b=%\gbK[i;CVIMW_0pUP-!d`o_0N53d\Xr.>p-@`oENV<iqL>-O%:&ICmZu'Tr]C"n77DUA.@'4\r%EYoBc*`8d_4bI7rA"n7BX:>j7-]<=>XBW0lmu)N\@tt>\eC]5!EK>q++o8CaIpm;Pi2IFbLfed7F3]Tk%$!E9,ifQ"hVl0K)>>-]\r%qoQR]Gjd6aE&g.9;nXgL0[/XMG4t2d]X$m=Hp/*`,$:1%3(2+$-_;-sl4Cpu^bIk-jEV--=E9#:%(\&(*YGG?']\_/=)bE`ZZ/,X\r%-G+nq@.'+p"pZ-B<DY0G[Sh,<$1(iRkCpqI!a8,EI.Zc.d/s/hfA0oA2CM9DR.&T5[qDgOiHb^Ybu)+RqhV'.iOL5V&a?rYS\6@\\r%hNX*g3ErmhBAH:_Fo58hTG;:f\uP/c@"!XPnNj?toD"]n4hUn(V+P<YO[rtqj]BYEbAH[:b:p!H"daLi_GPDn+@4QqM)5E`(L4$r\r%lZ4A7Z$P:?fqu1!g.pdQ&1JXPG@,8g.;._r5O"-f+54am]XYD"Hju.Lact_,bPT`NcHL_:r:K-^oide:@I6ltqL8:pl$o9MgHUu3\r%Bj9TA^)nU6R30cP@'';u,ZhHVOQ&pIY/08PaY,Sak0QQdD5'+$p="JAK+e=g@CC,<e]Bk]Q[e:Sc9`SaU-(8CIMT4cQPqdj)(J`p\r%)DVC&\T%.HW-U"*=CHGgaS[T"W;1^QaS[T"gT;7H@qTBsU[LOB+iA$=6u!W((@jis.p^/XliCaJTALcQcJiB6,QFSk:,X[nVBPQ;\r%OO4r(UENFG`?X6uP\Y$$,/K*1OaFW5(Rn4t6O"uqGHNo>aD#N-1:f*n1h6e+1-DAr/.RTm@olX#Po#SXa\P:d#e#-*=fK*o3cKBU\r%$:RHZc<b^Id4[GWi3d.so"OD:OSN&#A+ClQ%=,\ELX*T!ebM8,KF@=#-fHSonV.kZ.0LQpn.A5CA>K"kpRdG..gJD`A(1IQ6:uub\r%KoFSnRte#o;Wrle"is8omH5[18'j.=3[@A7I9s9a$8ri<PfV^bhs.N^d!&peie#cdC_mneLC;^D9"VT(9#]Yp<iK(i9#](L;5mR8\r%8u4Y*QG9=9OMGKP+*i$T#:tY:+:e<2>(>_j;^nV^E0a4O^6)JUn-S'OI-hrJ\%kE>,:n69Li9^a?oMN.#1l,S@8[WE4C'uHf"K>X\r%ZH_dWh$^C+-Zo4g\iSenkWBhq9]+*Vrtp0m*XB:rNEU<,18M(qc0^G\Fh?3B%dVmEF^t"hd/0U#59mDcoMSu(S?<emV8T8dDOX3C\r%,uOofSUX%Od7Z,$Eq)<dYm-b-i_A?NB1:p/oV7$(5G(^bW+s.ocC`i;>N;B-*i\`+\ZbIrUnn8CnW^icNpEtF^fH9#qe_s=kG57t\r%;Kjhb/5Nc9!Rjbu`T5Kn7887D4>4h["B@W&.Ki0+#-kkrUCdSka\n>#.DSE':CW@(.I[InrN^13G@gUXqNUib+'i'Q>mIHmb[+*I\r%%9^TLmCB#;;L#U>]6O.loL^2qM$GuiKjbJcjo#iSiQYPPq:/2h'U.Rf,]qe2O1!-I+n!ta*_jg1\t,[1jXac?RQGa-4&@#9N*<FB\r%b8$YaE`lL(D'$pV?$ef#@:!b[%mX(D6De^''O573imZ;t`Ud%5Xrt;mHBl@lqcuE3>lCd0ef;\lQ-oK?^QMnbanDuL"#\;/n$6)"\r%?<QK7:A-KWDJAi/]Yts7\lcR)4oB+q8#:?81aV:4%9?XOL5@1tn!3h7F',o_`UtfLggr_E['\H.589ti!kl[+YY4_HUuR#TTc^Nt\r%f/KUc1X23U*i`YShp!n6Co%I)#7NTXjdt&3#=&TGh1okiS_g]H"$#$pW#(q)K:uTB\#]9#qjX.s9GWN$UotLq+;HEmhF``l$p+!J\r%2lE<1Z)6lrI/!k?miV0?S51?^;kCI>Gddc,>,WFTa^'8j%qS?ZLn!7nc#Ef17*I!Lj-'l)A;Jol*Vdb,NOlQ`T7:5:/UtL,?G!o_\r%K>R17\-G)Un2)2Z.qR3J?%!uF[=2Q0h)`@`ZL,s9I.t+V4FD!XdF'g^rV9CLb;XI6Xc5g<rTZ:8^lbnhNQ^>&0FQS:P1cul^=%?o\r%;)JK9>f?1M$OutJKW[s+o_3/n[JG8,m+u7l6\e!,I2M&=S(mc5:$>`bs"AJMXn4ZXR5M25?2e+/>jYh2jq:4><Hjnnl?_%HcGT8m\r%535=:g5A//?u\2`YXcKmU2s`B$`^N:5CT+Q$;H[,p$+\apik9cMk(sS[@O'qX0\-ubSMn/9dIHu9>,N?le7qDZfu"ah2uSmp%ldG\r%qsGkRjGKYh5&"b2g+AZf^#j50%/1&.<NX[eI9]e=?FZQjnflA&?$a2p96O'W-i<0!@erkDq,'NF=L#+m2]$.B4'rpkcF<"4rhpRe\r%`m8?uaB0lR0k3E`j,RdE$3)Pn['J4s`Rf/GAjK)aTga1!WF8)JHaE^(/Ek<`<Yk=<a5-b+/80-'s2T`j*t.pp/80G_BO;S0?XuIS\r%P@,<1k3nr2;u\dYcka4?jsl'YAM6D^6!K\b]d;l06g+6f10NdNS;C4m5.(3R9$QYN+%c5`kPuR)=e4=7dU^K/[1A8eLnm$KTEBoF\r%d-=_>2=g'SjoeLt5#L0eA\H,A-Nh:F[CJ/j3>oJNV)5Z9A87+9Td">*Bh/8rJ5D\=6Sc'B[teBik4e`Z7+U]2RTf+^GO2,aN2bo]\r%5tBR2d\`>DcQ?Y48Xio`Tu7q6XX.h!iB2+jVEG,^CHV>0Bkp;0=q%B(6-cj!WPq1d#i@oFVO!Do*GoRHQs-Y],aqn]c6CQbOuB`+\r%/J`,;8Xin<al*X7Rp+INJCD*@ZQ3$WadH>[;pR")o.6c)@;6je_Y#7Wr%)n"Ei)m!$7Ip.6oDBF9.e`GOuB_fSbA2SQF*V[e,'/E\r%7,$-WcV(pQ-#ICJ`trN,Z'\_h4,#Hdaku7\;F2u:?4Es3'Y`;eq0]NqD38-Nq,u'+C-,V0.6tmQ!=;it*%a$s(0Y.fNn/R%9$P"m\r%m1s>;579HaU.;$S=ehh4MUa^;/pVm]WlH;(/N%tm]O.BQ/N%tm<_3m`Q5W!2jXF%H/N&!CJ#AX5]-R?V@2;"k%gRsAc=ub7XA_pP\r%S@#H-VRKa.VreZ7i"EE+gtGXKDhm0*ZE"@FK1jSJJf].HK*sTH<qu1jcJA^T+Ft>iE-7:il47+oGu:TR8?*'/4*Yl!Chg>rhFr_-\r%Jso`_mC)-)?2\\[rhh2gI*1#L1ad&7=rI_1ESuJ<0(_G0YSIXGLrZ(Fb<%#q,Y#@MTsMhi;$[Z8#4][/?fX6TXk*$a::-L`[%f>)\r%Vkcq4L!"MM_WVh.$:li)YLJA`^`UMZ)cnW*6IIAD@AceH&\;j<0&"9Fl.6EI8iajc<$CkCRZh=:#N0("p^5Xu;B:JOmZ)P^"Y\mr\r%l4d7j$l/Q&6;pj;gU$gVQqT&L1>&FXU+*,+)(Ku-k+/5en!A@.^LCL!=p(Qmmdkn;T5TJLnHu;1\^(d3@N*E4_ofL8cqZlD*If]Z\r%]4=MGUUuM@\EM1lh.!j'>ntQ]@f9]2&e#SYJTk,#9tQ7$;+I(+h@DL`$6PBUbq`;k0A8"fqCd&N'5=IN&"DdLh//[@)GXr,Q=bln\r%eSHW^bm_<u6[i_R&+cL,gVXGMnDKOH)oU-$G@C(3&+EjM!>#\7#FjN.!?fNmJ*h:X+;jSYf]*VK5ciuD.(jUBC+HAL]_3H7X60%X\r%gFX6*\kN#rXLlUsp!1I(V`7/45(5A<2u_=nP0NuU?]?--5Q7lOP'rl'W&ij@EkprC;0A>8R"MCp9RUGhO3<Mt(qk/U%(C;L8ffa3\r%cu<D#E.o!<(8"3$L;hDq8X$]u1GW:WfZDp$1+SdIgSKJ3=4RZ/n>!iAi!RUn(Ra$YZ,atL9$,k@E.I7BV503s4cqIpL!6YR@u+6C\r%:1Ob^,]e=O.J,+R,'/*9DX<6q,'/)21W'?K=b09/FtF2L.U^%Z\^-p=ASL!35S,;aHX(H-H"+kM]dlB(\&[T"mn1;"f8$o56>#8h\r%JSOkW"kI8);!rnV4dA;DXH7dt?<PN;>Vq`Kgd5?rdKoJ3!Qh_hdP%9*b.b]qNGQ>X]/i&gU3c4B+oiK=a./s_"m<jn\ZDLDqQ<&3\r%$u]""=SS-j3f,S$;go!KfOXP63IKFinp&N"a`^(Z_OR5as6:g]nen=CMWX<P-Ml';<Pt>KeP7o[b&MRX/ctc+Y2)Pc^IZTc*mN=,\r%8mG%ViHk_-Fqtm9::YJ38ih;kpdL"\GP5[fMTG1&?N,=:gU.h$]*40l$0%8E>5"uj$U:sJe^KLaF(N,bg+%K`T"toYeYnHk`Vag*\r%G?mjNL#&\=O"R+:lZ'!8*JkGPc1<a9EaeWWq']aUj*gS3X)h`m@p@^aT<6`,eQlj;4(4T=o)Fi[nZA;*4NsM)H)]\Ifn@rhdNH8q\r%A\6r(DZ#7\J1\%Dk!?;aL8SjV)-$)!b0u[rk2KES(OF_W@K+74:%8XgXPnYBs0Jig[f_LQn9;k)e\q_TL9&S.S*MTf(>)4X[!/.2\r%g%J]mBBFBdhViM3-(d!Lg[!JS5[,DC/rLOD)hGbZ-.Q)AhG<j6hJiYW9(U['K@K\rSL5BR$dJQd2NbZo>7[-/kQF(uopT6#a*,5K\r%@,H:T4g!S*i0<]*2>R1QYJ/XmZ2%nZTq#<`a7@554,h,W(Y^<Z%S>LR!0c]uHg]g9UPG2PlM'9sFCJ9OT`_'L(?&Q_!^</n5HOk:\r%C&_;Jm+?5oGk>D7&NtM40>AR=qkuAO:@.HG`)*\^JK_0Sgf/3OCAr0!NT[rtC4Fh2c&;E,ZqXjYs.'+3o]OQSl:n1JrjIlZQhoLn\r%C&[D],?LsLa[c8VHEN_235bIN^"j'/&"bi_87l;Ep"XW#k=4qIpY1ai*sn!hBCB$QWI\fOJReXFUB[`,"p40;MAiFJ)//bJql,.U\r%]*D&k)Q8B.811e!e3Gn85`N<:5%\1j/rsjgOdL^`Ufq$I5k$>!W.A]NJUu*!*RY*!QgfZ6]Q=`o#5WT)I*`BVK?g>QLeZ1"1BZGR\r%71(n+Q5RcNnI%K]5AMbVQuek2L**ojM@O4dJn8n^K,KKO3?kDQC7'Q\LURajK.GO7h+Uc+-3L,Y$N"*1:M&GkhV=ui"?:;71fB(f\r%G<MSXEA!>U[GjkkC5U.BFOjtP23<S280=9eGB,0[dE7MF[bI!U;nghB&aL$#a$W(&Hpf/90QKd%0DBS[490A$S<u>F0EVb?RMtBD\r%"5W?ela?6b9"HsZ>_6>@oYPD54.&]%GI,Z^ES?(mm-OH%WPN$+_j+ZH9!AU:c@al8<;Y!?bpV)N8ZFeef(r0=c)Z\;DK[OmrO005\r%Y>EJ\;p1l)7GD"oVO#&-CIt"!cpONcJVdoPNOq4rD(TI#b:jfM/SS,kn+=WQ>108`3$Y]:QF*V;2_W0cC8()/Denm3>$KO=WJ14%\r%ibU2\;p3@eNNfgd9eB?;#pp&MQs)2e'=P<WWmLt^^T"&sUdm/I$r^Rc'"-RQ9S(2>DIk6CF!Y4/3E5T`>>*]")JcTK>>*]"$I_c0\r%9b@t9MqU8X\$`#+/b$_gD(T'm/%qIfs#eAJpCMdT$Jn5<TL'cREM*Zl6%p6s'o8eA@Qt5JYtd8^W5:]#5uPSt.OP2>=/GjHgn>YF\r%BMlgI\GWGdatJ33MP'"SL]L.cE_=Ps[++kROBN^eBW:O.:c0<YBW:O.$o?Vb;WDCE9l`i&=[6gB4'IX!a'H+CE6oX!p?S!m??p,i\r%h1k0oceoGC\&Q-!UVS6iDaBr<@;lP,>Nh%9(gPHE.TA[G='OquZSG4udX]$?<EMVp>+,a,;aP]1Yr36sVt]ateoeOs\TQN4?2-p1\r%$UMP33DlI^4t]J*Qpa6fFJ05fP)Mj#\Brcm9u]M<OG-<6`s(:OilP;dK95/S6Fb&mLbE38,1BBp4XA!e;761.mo*-:;(+B<caqej\r%hoP*%=6PkRVehTSY>Ep=j27f0?QnYKm^hq-Jm!,Z@QRHM4'[B+S1YW1H#Cp$8#;IDgEX?OL$6.)Lp+tI1f&o[<#:_m6?Js6L"t/!\r%A(U!LO%YVADosgJdKFe<hM%02(V9@a9!LCk]P[ftK()*^g>mKHemf.0[^qR'>F@l6q(u$ZZ13!J<bcsb]r1Qfp`m-3IER-Udf9"V\r%--_sb.E^#e(-5+Ak@SC@C.r:g2]IVoOX/3<?%nXp0f\'[L!8S(@<+u!8Xb5%cI$GV.*_6L.XSLqTJQbkaqeX1ql72]*nAUkol1F(\r%WZchLdC=qR_Re+k72sk*UDh#AP:j#37l>r0,$eHks,\#F_DUu\)MY5PCZt:GT\!?`f?eT<I!`*?\VC%R@WGm_2M"J^C\YftK/$e?\r%kiusD)L?'+GkQ9"%Du-SI:s'LWL<GC8kBb$K9Z)1*j)+pm<;fk7]63b6>IDV\V?]uKmaeD>XK%(@IK3Ai>R$o'N-`/E=Mk,]_]-m\r%*n:g:(^[>g@oug"TdoM^OW6'[Vij!?$bC4(EErph\mXuY'%`s6X:*[5!_;;[lb\ij3oPg\T7QUQFM\L'"$p!q1Y`Q1X5e(GST$sM\r%,aV-5TbH"2c58.994:qh@B-1BP$!H^JtYf*+c0doV.EBJ$l+M>;)fhMR%f2:/l:Pl\1WJD?%tq1lV\SN"\a88>aN=3/n4C<*S7,A\r%XNSlK;ZSYL@LR8$:B_WuQILS1\VW>1EErph])Ec$S.aGm(=n17C4',b.#ZOrf;11&lb@uXa;WW@R"EZq/q]1<4sqH'A^KJK'S^`r\r%ap]T!94:qhSc(s8lV\SN2-*;%\1WJD?',W#ZEPsk0&h>Hlr3/`K(<>UL<7alj:CRnX!Lu[Q:+gk9QF"i\eKmAU$@4Ff;11&$[a[$\r%>Sk'dj::KBG;:bQ/+T/#R9G?e?u&?'>)(.,CIOUoCggW>*CMBo\dT?Y9A7l^Drc.I9A7lN9En]og=3uXj>^@:g=-2("p[%md+!Y^\r%S,jQ^BkeM4K<6G:C*EPmisH0_>2\tig0-8/(:o9OU<-eY8XioOZsYF>?H1JMPdHIiR9Fcg*So:u7rqV_eC$n9o9icIC1SX0bK*jS\r%[_I\k)9VYXYpi&XA0o7=Qs'\M0j_lLi_BLc1:>b\7qGCHFH=Dq>1-hbGa=+)f;3G9@GGYCLaj)IlN6g?'%`s6X:(qm7Q=Rd_R^^F\r%'ZJHt("P8)-q6me.Ia[JNu[+lWU[=Aarfk]WU[<b,Z^q?V8gh:b\0L>NLtp-$SAMS@9=>GqKNE$6$j!O4R<9=TY9I17V=Hc"N.g<\r%;Iu[*nbA'*j15p_'7-tkP.E/!X:%fePN04gL33Z_MqOXLcEJpg)IV*;iaH+&[ti/gMY+DZ801hTd=BX+iXb?q3*3-!QPpJrB1JY(\r%L;hd;<.@P`7j2Z?P$CMNs1PV^;hVWI#4WEhjUOLX[J1)#0,bp%D+C;Kh*J2AP_F5`\nu0@900/t?'E7H(IM:@H7ELrL$AB:0(S@u\r%9L]'i?3i@"P5%@uYV)_%BlRDc_n(6g(s*+^'\6h/g50fT$H'F`P8`&L0W]%PS&!Zm-n*?e$H(>/-n*=KP8`&L0W`I^;U`K?oVdLn\r%DGMP0:b&OSS4$Xf6]YtqGGjcc)L>@M:u]'rLAui@;oLU>m)!Jp)L?c?8GgrV2>!i%pAUF#Y+aX`(k5X(d-&nt%?#iO26=urS#YWi\r%H;uIl!HiAkKD@13\:u&."4h#,2+4?B+'QS?P6cbR%6O/Y&(f/Y7)9Pg`AR9_\\fK<N7P5tF*b?N*a/ZUUUmsi@<.8IY+[5KdE8YP\r%CZnbgL8g,I(_P=&1Pn/=CkE4bJu=bTX:,%BEa4sJYV*,3L]TM7'%Z/N(\&_*KQTT<KiY],k%E=0,T>Wr\7#YCI<sk,+Q7hRXqtus\r%1s)R@XNR$;+iSRQ%-qr6$\^E)'$Chl(WA3u'$Citdog@=Ea`6si[6I`94:p=e1d,s/qm_>L.RBj;AdtrmjJh/\eKmAg&;A!r(:C"\r%(NEbT'P'bR(o#QD).\!'f+8AVEd+X\5_d]q?+:-2*7q$LC@7#GiXb@,P?K*rS3pX*-*BmL=P&$C'ej+Za%$<oK77bWFPQLKTs-/:\r%je9V8.1GNoSR+onQbosZ_kb:p.1GNoSmG#oQbosZoWD`t]-P8)E+bNAho4l(Yrn<B@9p<S_8e(e&*pNbMj_Jj"N.gTb7eqbq62LL\r%]TD0b'S^a]B0hC?;Adu='+E!&>meK\*63poMGV[L$>;/_XX,"=A[=F#Yn*S+(4*a6gKN%&QBu1r@;AH(>3J_A\$`#+/R0aDfilh$\r%(*lLn@,hDb/]2,'[A6MKaF/uS[A6MKE-Pl0/SS/,p6&m$/SS,kk$Mq/CTBe0[A6MKS6d+HCIt"!OC5#qFc9jG&Mi]$`-?Z-"\gSd\r%A0o7=P4[C_nM7E$:t]2E<JH5W*TYG;%&%a0Z[#Kbe3`&HOVf`]C<<:PYaSbn]qZdK(/3?"g02q%QK*jcijoil09CL^,>a)GTL+8P\r%f;11&bMBXdEAusq]$PYXFL9PNFhu9`-*BmL=I7i.7X)5hpfRWtL,L6ge(I04[++kR\@RK8[++kR^ep&2[+'bONLtVgK1jSJ6MD=X\r%_'Nc5)12XT?s&b(l=4OQ-P]qc8=#"!YV,P`;lmT%@9kS[*20tYKlu(_QmfM,2672Ba<I(50<>Pp?asAoG)tt^U?/MCS1YV-=I5NP\r%WE+DG-\4'q']M;&Wqb:JPa!`IVo7IiBQJLmYQ4W$5V:tG,e[T`=+g8T8M@a*X'U1-UmGLFMD(s5/mrkmM(b!q0(`G6MD'!PQXNMH\r%$Q6gm@/>]mf;11&b=aQ'`YUC`FTE;='%`s6XNRRpRHuTsYV)=(M@.s5'@m>"N"Xa=0WYY^5)s5B6"pPp@N<XIK$ql4'W*c-.L>A2\r%HEG_=%6^^7<oUbs_c1LE=!BNZ]OME:$EsdMEt(:4+o#NX\:u'Td%3bY__q@a(AfJe=I>n^e,ppU@(s;^733;f!AdF"*n]*GgTPl4\r%R(Z\'oY=!-(m$/QatOQ0F2l$KkYi\JYl1$-_(O$41r7!\oNh+30Y*c*Y3niJ(=XhOE)@'_A?@TqM_K7moZAk89d07*WsiK/A5bA<\r%"[0P64YYUkgR;FtTaL^4$\*.2]05[IR%X2=_[X<F\!'<Ci,K%:fYp03&-^uJ_KnaK'WUE*gZ^.@,aJQ<]A--r(*bA/6%YpmZB/\@\r%9kYbf>Q)ciZ-EYi/]4B`/^Yf+Zkb([q4i)5RhuR]K"G.oW\'%$Y4[pc]s\'=Og3J(c\pXnjG@b&/^_Z7MW9_7!@*PCD*-Ik2AiN*\r%)N:n^%0iAbP=AY#q,[>lm]KgNW>Y%(U5k3("kPDVYR>jq--fT!mfi-KJFg`?fJTO@pk5]&_(ONtiud[:1=uc$.Y5u"/V@?Ud2a(k\r%dPBHDFEj&]G)_?OdGn!-K3^0j/nTEPl75lc_(OG*N7u*#S<<(YmF!cBAOLaXaUNEePFB=95qpJLmL2uRfG0uM@nDmD+7-<1@!,!V\r%J)cgCfd33O*8QQ2:<HKJM+/NP1<e*YQ^5H?_djj<&0L8Eks1Gb6#$Y:g_m0_BU>%$0%dWI!ZAlI:C!0Gjaj/]2u19BJYt8BrE`gZ\r%A,5n:JMPl#I0mMKY=U:PQ3"[]cna6bB0M=\YnHB[:mHIUc]=*)ntElP9S'TL1QMY3_63=ui4<kKOYk^5@9jnUK@X5o:(DGiGG']$\r%3N*_ug"p84R'OQ2E>#<6g8/Ab$U$/Zd4R#'?1*'3K3-,Yf]CP43-^-nK3]Q0M7L7R@j:U<nmRoBR8.H&XKK%N>lF=R1&J\7%=`g3\r%s)43qAk3j;Jhn`K1P@@5228B>EH8<FRNZD3$hO5)BnlT`c[S`Km6U#Ep+/pq:0&4%Cm-6'dE.TgaU93dmcs.JTm,:aiX/G8'daK_\r%9VKN40*DMV"04&d8($WSIH8Eb13d&K[1(qIb*/!^\mV5Q>>e&7p3T#m,6&L#L%th`J8$Z3OVaPLiM=O")=gSmg00Q/8pe4rhqotc\r%MTo<4]oH">\O-.h;(3j$c<($<0:]\<M<Bl!mC?+5medlk`(>\G]Z%f<nuMjui4a2!GZ"-JFFY0,YT+6]/@tocLAZ;*LI@8SfN;DR\r%gJeXJ.PZkHksfjk?V]/@m[4!a"o6L.I*V`:djDeTBLSua;=4;Ydn1'q9/soWm'CZ#>qLX5<_9LNgq9CdTOD!*j-LMQT5Wq3c7J&(\r%T;JLiPo?h%]Iq/"cR</E.Tr*jpMTu(rOrPkpf?fsD/T^;W_dNn*em^1-,0U9<[kdi3,%GE2]&#u?VL6NA7)F*XKD4)[k!;!+:f9H\r%aeu6QF>Js(O'5_n/r0$;8D>dMUA)Ou.TV,on0F&m1JBD,LS.Q:AO!Fb3!>M8;^n[e&.=JQr?m"Je\FNU^)05Yel[hB@^[UAg<gAQ\r%UFQlAIfY-6hd_k5d\$(f>mn&?3e7VlfET*khI#XI5lZ*d9D+XE6T#W")!rskOroMalg*ZkL?^E8>rgjt*WAq'0+"LeEV`>DLgV1S\r%P4=km'2mL[<G/eS9(J=]Ucc2]Wb?n(VJ*uB"/YrB-RY%3^*hhl\MI:=@G5QO7$^K?rY!DW[Cj72ITL9JPZX3ElOo6gPZD?Z>,,'*\r%=1#_QlhqZBTX;HJYm6bJW4_lRPb>*6<1^M0Z.[e]1PsI`oAeG3)sP!J]KE23W:`XXel"2m@?MP-``b,k72]5eNsF3%VL:^?"q%Fc\r%!pTtj9*Nhc2(S@+^?k_`osnF`6Is@5@4d'fZ8YBuH.uOQc;Y-d(`g[9KbYJYeb;d$T=/(p]CYF%XlSU=0mpV^2J]Ydr-IHBg>K8R\r%FLMu7<p+QaM4V5emM7Rm'4'n9'[@E<e1f+@R&lmEOg*S-O%Nia"bt`'0WhQmFg<+F@WK1bUq00o%gW!Rp;^tAndgNI4&/.NnDc5-\r%'`0YiJph`aSZE*Z:=T_K>m*7RS;2N,S`oHG%R/Uck2DlM'bY>9]cYgm@'5T![.9-o"ET8"_[7V&'?h1(m,TG_`rpI;"@q[Bka5a1\r%L*,ct$Un!6K`pErEKQVrY)m%u_MH/6F+jalC0W;:QqR.3pQW0tK"44"m3s!6"qS.dm!:52i$hZ;$m'6R^^c2t9JBO=0]jeK1jD@;\r%\<Oi$!\LS0e1),UFGn'?X.6Ime>d-E2L)HfYg_\j)E`T305Un([Wh50XOuI!$jhZd;CElZ.jWbEiqtOI>Tpql?RZO"bS:a!='m@&\r%=K2m4\\SsG*9N4ejpDDQ9Ym*(Y)m&Tk80!^jpDD!&qs.U0NUe!k$<e]"ET8"UT6$`'?h1(N38(@9JBO=YTXnubggkqc:ZR7G.3k8\r%Sk-UKDAZt04"=U5CR*b7RdN47Dk1>-FP#%GM%8a\TYGa`.dg7L*RJOm?okM)*EWX0po!WO)&<k,O,m9^6M[_3V&&,J3$K^1(S#tU\r%7dd=2O,>lf)PA(OgO=HTc?4lZUG)MH_Vld:Hm)Hp%/-"ts-54E(!U$!iGZ;\hSYTrb"TeB<3MMB^W':+b+GT6kO.\@FU5\u/j,S@\r%"1\IaWi-EuP@6J3RfK]B(Z4"^qqq0:gF"k%k5?g>JmL3l]$6t\9'"TF:XcuXlnVm>RgTZ&0a3HM0V^LVRZ[5^d^NP5q?/lcg*+@>\r%fA>c2I3+cRFSdqu$bB8rb447#P*E0-0m'AlU\'fFTbe'4H7PY&,hZ#Kf(mA2Xr<t%@D[Ea!^(>a^^r_C[[4%pdk7-X>P\(jiX@nQ\r%A!WQRA@^@,H,-"NRXi<i"QJ+Jf'u;DqE47GHA,&lD4Z6FJZI+thUC7F]_JDQ5MqL1:AS#SY.."+ioM7?k=aCff3Wa(?^><N:O+pE\r%c7;aD6hc-?q`2r>:O[_0]2NMe[75h.V/<SWY4eMQDL#\&a)+BrIMRuLLF@O4>k>9BZ1+,KMuNSCUB;==Yr]9)#b+]jTtRZENi;6u\r%c#a:O(C,)]0#EfBpBbq7p7D+r:BroP@%Z;eV2AP>N0hE8S@^-"gq%@?Si@S]o-_SBO7k*/>*p62csT)`KeI7\/FPXCK<:dqUC)5R\r%GVJkMD&6c;f&_=$n(6iAB9YGHn,9uR+5o\_Ep$kSODfSp:&G#2U4bt#2qesqc05?nHQS!VcD_uF&bV'CJ]CR%9@jNQfgI1;fM//[\r%(ReI4(oBLIib90q'A''ai9qZjcBo*lir++L-YlU3Sn9]NIB(98/<7$/Wg;X<V7eL[=sd-YK*P>N>#6MP3q?p[l*F^cFiH:'?+#om\r%XV\'Am"n\nC2ptgN,%l>$`[UBW>;\)E;!Zc<(e[Cr]utV^FM1@(@S$Qe*)*WM_\T\bKN&r/4b]`NI=^Yf1/^jSn9]6WYY&?%TEmC\r%Wl<F<0Yska[<S,DS9M__q6!Q%Ga]p6@;<A2RsW<M=tj6FQW[qY]'*$DnP?"]$Gs/jV1H!GIOSI.fI"f.l:W!b.Tr+A)hk$^272^1\r%E<2_;TI&md-otE9YEk*I0T*.kJUa_C48Da'[>j%p$Y;5@GA`Ob4QmlF4X(KpI<k[?$E(e[-8nhThG"`Uj7Je*C+P^UGCt_W,!\.@\r%S=JD$,QO(h_TCbZ9X"uO]B4*C1[(eP"3PVCblm\Ia5@A7D!"7QlZ;cHJ*C`]DSEQlp$).R_$Zs2q(:*m"`?3&q+W3Xa>sS]"CN;u\r%MB\^J+TO[=;+*@0kLO1?Z]Sj4C_A^ecLqas1OgIo4ES#gfbmbZqt,do#5?Xo^[?l!V7MDdc[%W?]f+)Jm^3tu[I&nU\C\-jZKgLP\r%V]I(4=(U>Xmdq/o`PkK`L49+MmPUDYND:r>obsd8;;>qEZg,B["C9$$VQ#-nBTKoX9OI?@r[AF"H"s;0DO28qH``$KD4&`+CGjUW\r%QUE!).BlaSnZ:sDR``<E6bT(aSE2ZTkE_%NDKgW^\Qi$l`TU,",*j)]e8,(_)7Y9f`SAqaE=:!c4H4[C[]YW'FmJr]]n4.WW$[G?\r%<T(,b##q)20h!R)Sbtk:]'Yn:3;plU75g:X(j7(>FbSX`R62\XGd&MNfdn)QVk&e_@)Ed.CmNnL?)77-\#:V]HLIo@=f<[jQp[Ud\r%AtbYEL<4,8$lEdrlF)X[.^W?W-4<]ei\nsoCsn@]]#&t`Ur$Psp/_Z$emSk#eRX.UC//"bl%e?'i&Pc\%SO1D@[LmMQ=tce0Wint\r%@4:NIfNhp:6i$WpoMisn/7GAIoN)H"NPcCnY>cL\-ge-7r"\CaqRe(&LZNI%[%dI5O/>?i==O^h9=2Hco>L;fNL`,fc*#SN.H:;8\r%-urFa`Kd!SXZTQ2,d(O_<8k&Lq^Z0C8(M+*p/f3)rhRFEmB7A()M]X&YFL@F'uq'>)O+EtLDAr[YlSda"ar14d+tD4@:AEdZ\mo4\r%H`NOhI&o_O'kdo[YdqX$&E_bX_HNdTd'Q\p0RGpU/@LX4(ns7.4g%I.$bBAI4!I7q^u"j><^@,fg-uU/B%DW93W8/G=1.lc=$mh/\r%3n7s[P#B,sV,FE^;C_C3P"MiC>2\b\$g"(\+f,7CBRD4CH?X*0'.g&<CpOE>k`mgPGZ5U7=A_11g^JGVAhNb0'+K''UZ1P>4E74f\r%W(/,\KW^6iGZ65_S2kS;nYfQ%)5adf$HAiA8M\I9*iP)h4UTk1TYuPDU>Wj3Ca)ipEZ%==b3f=44=[drSB2JAnYikoC<.`RIXZG0\r%W8VYU[Y^[/>&-7#_c-D]m%*B-lH7\cY94X4&eG'eM=c5RL`d%6O(*b?ZG$:AAgNOn,ZH(T^"7JbrTB]af$]@g.Wa+,o,/UiULK\u\r%r"l,*1s.P38+g?Rh*T5&]Z9Q@Nb>EmVMl\#9k9eL`$c[,Vo:cV8&a)Ej'<Tm"<,1`hi]H1p$g8`-A":HD*4iOm/ug*QQ]@0d#oLH\r%-*p.,7d?Nf%g)OX<IiR@W80_M/iAT&#*aWP&B>Z]WhmTZ0c(Cqr_=YB4ICRYSAmk@MlmWKZPQtpp52Tp8_#F+_Abq>VSWXl<5KBO\r%\bL2i6o1;<B;FhEENT".!hMJ$"eKUmge?`nI\d;/b94KK4R%Fl1.X(og#$9k^'rEt-VL`]?O#bKF%'0L=(M?,mYds;=&b@+;K/>p\r%_O]b>[:U#0@i:2WqdHRXEJtM(Ifi@2o%$LGXS0QAPV.5SLBt"9X3q0BX@W(Kp9]0d]S7E!,7Rj=6u&8d$tsf<K;7f,XC4`5S\]k`\r%"ihZ]T%"q3<#7A4OmtA9it)5k_mr9*l4@s<4JMKY;*MY$T:Zu]^gnLS_BU7ILck&G>WP8rh1P&4n2OJj&ZJ,#RJ"ig,#X1%muHfu\r%iPZToDoV],hL(AK9Xd*L\P)YJ'YRjq*eTn(+i;^:X\2*&4G*`A2rl%-C"V)I%XKU1GXSg7e)roj]#<s%):"L;7-Y=Dp%[&&[k#[K\r%2dIlZBW(JG7@G)6@!57l"je_&=f\bO5ca_aX^ahIBPUF5@c=qUo`Y,92[q3tDl6[D_>(/]gn%S/_MoYfc$$aM.e]$=O(ccG3&n!1\r%Q24&jl'(^j(clU%Mq+#8E3.Cn<YVb/_ZQu:crhDKL"UhpGK($3RDm2(hGNtYT*E`263E88O*H1Z7iUAB+.0@RQ8]@@`2>mX/3?ke\r%7st<3HkEW/jGR'WI7$)a]V!Dq@,K=+L=Tm`6Q)u:3>]u^d9l-s`#i_Aq69&[jM5Q98'Xoe]a+s()tg.aT=iY]LAX[8O;QR]1$GTA\r%*tmTp,"><,YmH8,*>&B1i+5GQ,PP4t$]/jD&YfmJlpG5e8&T@/lY[lPLm[9Cfe+O>'+ojlC4\Vn#%eP"L;^SS@khoWM*XC<%raYc\r%rEXKIZTPuu7s8L]L*G#SPS#Vi8P"dD09lATc6R$j9i8h>gbMuL.0WRkiLjJ<2CE+ae&qlX9Th,0K#\Rra,VuaZHR!@4K-;f@?T5)\r%Q22KEf9dC9PkH6F;Gu!i`%Pj[aj2cqrpWR3j0o*$a527<_3X;a[#2:KX]?b<I]%I6)&fMf&Ja<%(A-uo`VT%Kekh04:BF<".cE"k\r%6<pkYeYP=$g$q&Y.P><O^],a\QX[b'48-'Hb+N9GK.WF8YH-':9!BTL9*)eiNA?LG;BXeS5V!7hf]sS_$FoEAU7Vh5:41Id]j'*S\r%!k^&>GB(IbD:-=6f#%[ga_\T!b^-d,Kjh#^.!FP%NP8esK'm0O<a!P"@?V2=nb2g6NOf.6LP``Jk/48nLXFdLR'0qqL+W/qocs:D\r%K-`I_-V'0N83U2pb_K7&O3_:s?Yp9/hE^ahEJ2s!%.WfS:NbM8p<%[FTSpPF3`?o$?1,hB:8_#/i7AG#9;&>HhB7+23J$RpQe\12\r%jInnGY0e)qPlQs[+TX>lSi-Bm.`b'MfIo'*])#GC*Spj(FB2p*m!ht2?l4.^/YZYj#/bEGCN*@k0[EA[W8/LOX'cbe:HB@]V[J7<\r%Gjf<bl39!0^jCri?D%&7X@WndKgdg,_dF=L#!CC9Yi`3XVb?bnRpHdqYI1MJ85oHE?l7^s\l4su:Acr0L+s'j!?Os80"R=E-ZpJs\r%Er5sp`7EI/OJmPham(9e;dnjj1A9V]BR]0V)lRrdTW+Fm&agqAA]C\C)7=K&)S)A$Q+H::DOP0<R!mbt%)Q"]jFV,Ogql=^%!lEm\r%;W6VL['fOBVNl6Y[F;4LNZu_;H?aA`ij[&3&VHp)a"IAq'>N8#C(En!cW%RSdj^+_Bs59d.nd"s;rY#!Ih4M5_aUX((H<I\((Q@<\r%QN)O;B;l6"+#)WS)1*hCg->s8JsYP6[*T+CmjN^mhRFh2Y1oNIg\EMf22BDr8UBHIHcOt*\=`dHA0-(dZ*r=UF6`Z>'Ck0>Re&4>\r%Nr;q(k`!JEY&D5XAT9KHi`t.is1CnNfNVk]47mEBcJ*p]Y[%2!#5+u[GPJpnpK%T\iSq[!.+Sp(]5ceE';X5k\ll*3hVb8':u[j<\r%Ai6$3[-qetDA&?g`K7gX$$F_79Y/cU$u>%99)to*fm<Di3\0sA*Gf>23?FXHg54G7?(cYt4<9,3]AYCdn=<?Hjl+dVY,Ufo\9ON^\r%d@L3+(RC&QRrSob9[(Qg`M26-IDW/j\s'2B>V<)A\T68V7`9n%h1oT\>Q#!^kX<j/(,TSEgA_9`)P,CX=O@)QT`8LfHc^k_g5"gF\r%"^MIcBi'?(^sN)c$Q@Oc<`[M5Zsl=Ze(\I9]$SearY9]G(E1?#ksI7MU#!Ioo4#BiYF2935S$tp.+W;ABjsVareP1,!uA8c&^C4"\r%8m#Dbj*P#.$;bToQg)>\hDC^c6.H/!gmYIhS.'#c0[6^S1US>GRln1"JZ4@T2B_7hc)i]V[@gI;H#ATPeW$I<=`\7pC8"7VE)O]8\r%WPt"P>-:ROoL</*CUl@2rjK`b2l7@4Wjlm!,;?Nu)L'c>7q6:R4FsWrg=4"2@cX\r6W4@tT!c"m)cI-dg0$e28@>q7>annihM%N&\r%jkA3fPOqSZgUth]!kiMbCOtm#F)>YPS9h%h[@g<0Xf^\geoGZk*f-&S]p$NP6:iMUY%9i-1po:U>KaFR[EKD.A;ZJ;=t0j6%R&e%\r%e:LiN[C2AO;sXEJaIm91=?,%6LD"Wqi2_!"$+8sf>m0oh:UjfsBSB)gC]f3-3C(Gm*VrpCNnHErX+&Vi?4?Wo)KL`lU&-,,a/g74\r%-V$#bZT,qOl6^\\@f9P((`Y+cIMVX>D&b,cIMQOngGiAQr%*PmDWti>nZt43hU,fmB0i-!WMA"#Q64,\6N+"]IU4[]B;a;Grarn`\r%HE'*TgKUWAF-3q!C2[OILYUg.BQ%UPO<b$sV7d&%>:E3-_LeRR#Y8oj8&/c]!(aW6MES@.<JJbOYh-o`G6L@i^1B)Dk4\"](QJb&\r%QcjsJC)t!WNDD.h?g+#Ybo9P+*!$:NYNZH;PeuG^('.&LGJZ3*<5XN2bMtLN7BQ2['%g?F0/h<,b)SfBg8#<fNJld[l]+<[4sbCn\r%L"c:8GFg"k`B4]=L/SRtZ3TC4+MFi^LMT$ZQ0o.R.]%>hPH*k3#?FjI)>9bWaLi(*bI#m;`FSM8ZU[PI$I*2rWPfUcN48.dW6eJb\r%A;X!MTb;7hj'=+l9CAhn8"S[^5=K-J6\Xf9-<!md%+Xot.HO_^nN(#o,?8ap>QkSn:GYEs^W(pd,\"nfOC9$^ALOIL<_n1-BF0T5\r%0Of.Un.:qo1i#XA\p,f<>#K()b3Hl5oAEp9Z"]!jqP:PP>gu*/&KYrbGX-(LD)R@6d.c$tGN*La-(VIDY`Jcr35EY7`cP63BkE`)\r%>M!]T:n#MT:W1M4%],RUQ"FhjKZEnU'EGBT*ED'_`L^L[<9[:ZQR7"Y"9JKf9:iKo5\.\0)OUUK#b1p7'%uCR_0%Bgr@#="N`DG$\r%SN]sDe8&hP?T5V;b:OOo\et(-U:W2<V>A*./hOl8oAB+Oq("+bD"?K^Q6--Vr4PWSQ*9g`=IhfYh7ol,'NgoA1:P@XS6'qs%(AU=\r%b?DP!.@FCY/SP;l(OU\P4r$qFX-7f`;DP`(jT^/h)_uVIBH?$2jLr,KF0@\U.flgL>Z%q?DRIJjj]\u8F/rP`=HbJ-)kC$\A8^ss\r%+ZEs"Ij\aI)`"mKaq]62-Y.*pjiRm.hN59J/iSm`=30/H_FuX2F"[t4pJaDKLN4J&O%Nkc$UA[&r^0-:DI/M2\8j\N13[R7@4NKh\r%H8fD7X)I@W;?>JDf]jJ2##D)P!u#->S#JaPiMrDI\V9gVBO[+8TGReWfO@%k>oAVrer.Q6c0OE=$ED[sU'ZigImH[&'U0DLA=?#H\r%oj(5X+M(!1U@9P1?1I:$V@4"YUWK>*ETjQ`o-9tEk40Mg=6I*72k)j\^'gL4-LnQ`(%fPQ_Q'Y[(+EllEgq(]39o<NgM!r7RW2c]\r%^FhRGV#V4D'=ilDLeBe*>e1Ee8](6kLq.a#B>f[@g"i1rq)BJ=Mh9`7Al/loL*9Oh7B`21n5Gh!Sb8G:e>W(E'n0N9.nA4I)Ysls\r%S+YE.5(FAk3?OecTatqQ:kjkG0tZS+.j"H&FV+uDa[q0C_`R0bW<4tm>O/3`ROel@p$IuWP"YZ_@dg6-NBD$NZ8p=4^?ib\#Up<Z\r%ca*IP8sV^#4CChK\2"QTMTV/X-%bF\AnH,<j*1Cn+`ssuX%C%95r4a'e9kIbE&:T!Jl5l*,_E9OXp:"rU%1CZ\Q3U!K><thpJd"#\r%mOAJ@gO5'W6>oqTj7_X.=k?]1YKQ@a=\ndW=B,7]U$P[HhJiX,Wq,=o**W9rAY;0>WSBG,^?Eh9k)K:)-ZK(>XSeZ^aSf<0On]:>\r%l%N7Y:AP6uaWKDbrEV=#=UqImCQHTo4_`Xg:A`#f1H;dWfds*eIT='2c^jW6h1q>?iBfRlV^5>n%ZD<0JqnWA.XSU0HRLute/ih3\r%Fnsk,I/&e,I[r#a`&oLs7RN.Pd[)sJ`)VGZlFi^G+8`s#cKcS`WIM%m<QPc2PLmpcm6?f<Y@:p@085J6;R^dm(;HGga/$?bR,d@.\r%Fk+us)7Cp]j^'oloLoQVie?dbF&PF0m)!BTe`QIAT:V-WGB#$uJ[5;b!s*&O%(%/A/ZF;;R"8qY[&!tAR"<lK<Q-+;E4Kb$5n.AB\r%%)b<u2Uk!1Ed<Vn5WWL"3iV*Wrg5,lO:="-XL$)%1Jg=7j@[#9bl"Eb4!jNOb+JjWML!51$8W6*H0hJ\cC'7;NF1?&25(5s)o$=e\r%'H=Lapm0Q>_iNRs8&sHDhC:;mH@"tWJS^^)kZpdFG=AqI.<0[sYL"pY\?jA`haQgROZ\n4^T0?+%3Z$s;MJn]LkXUVI"o\P5\B+(\r%Is,<hp+3;EJP;G^9rQ+6`hl)MX(o:o3iK0@9j'7S9ujKBbHp>e(<f%5.C$eCe*OUSi_%'D@eb4OcCM(8"4o70QUrmjC\\PL\p'uU\r%K)^DN$a7ASn1=;(Z/p/&g?#\KI6G@D:hjt%q66e#.o>1e/:3QNIfn6V`n#0IC9aS'kBtZZYj[Jk'aK4!e_FhR\MgkF4?a]gbI+='\r%mUX<D9P1.;Y*9nR0Thf-kY>H&CUl@231dq:Ec#PWB$+:]bI+;Q%e!S*bI+;qHV&!h/_?j8beM6-f#/Cbb:mfLmc:daQ>9D,eM+(g\r%KhP/lP8*.Z>AIY^9q95JE]eoT`It&-//H@5hW.f4='7"?Nb?7n[o\=23DA,=l+ke8^WUq-bI+<\bD;fI7;PXLqVG'sVA;kWY-kZB\r%Rp(\")V]`I-faqcj-V4k$YI*'2Q/rtTL)D/.dZi6&5k1GP.7lJ(92:K;:uQ@J#0s4G)k(u>4,UtEAoHH/=W=^mIh7j?#1N5qBMI)\r%=YTGbFL5k]`#SVVErVN7UW(7!dSVkq*%a'tQI=Gtl"I?lZT-gud:2-K!CtP_dDC?53VIlf.mJt3S`Zl84_n[-)sAUWkD8N-`Nr?R\r%E&k;7cojj.E&k;73')\MbhcNk;;lcg=;pHrKnN\mQ3Q]h'jq3)\nNKZD_]8C$WL3TTXnOrfg^/hQS-mG\s[L[(]J0I]i/sFfa+2f\r%,p(pa:,JO(K+`E6kl&@X),':8eXpXBC<8:MbNpe&4]fkH(OHcS5t<*d;mI*EB6cBUKhhK/kW9,_:9QT-5V3_t'CfXq?EhoEJbUuk\r%0>,cW?@3Wd(WR2H0,6qm2&BW*%s</*G"jF7j`LCFPqDX,Ur-A_`1j"<r@Ud_=8"4^!\`VZfD%ZoG[Wsq4e9k;0`<9B'+?Z0bYAPW\r%PMP4+f>@tp^kLN<m`A!+97.oZFn=h$\Xd\2N;03aPJ8A1j5n@`cle&!;MX.qk*JtM'%pWoUN\e6Ahu7IP?e&M3_Rl`MWrcX\MUW7\r%_cf&AS?^$F9q)T/Vo7M0mgG9RLTifcVNkaiohdOb3g=5101O?*kYR_IPJWX1L*n4$>XOckW:jE$k8L@"6`e5*\V@J">ri`%A$2Lt\r%2$@:1/$>R<23d9d^#9n/D-Dlm=I88)*$_V[b1D/"jqZKE>P!3^2,kY>fCNH>@9r*^HbhS(r7TeqqLX<GbU]i)G_t!J84O_r2=PbY\r%Lhir`23tgOLXpuEs,\C-K.?9?0j<UE9DeA^Xg*83H&C1'R7+6gL>aF^6VF(]br&J(WB?=.%G*:-P/GHsX:+tZSo>/3@9oCY4gq?m\r%L7T4$*gg)4Qd/<-JK(m%lV]d"aP_f5_n+oth__Ko@9==Xg07=/YmTepdS.<+)raJ/3VD_Rgea\YGmlXMBLAjO]n@>6[,LTSZ5V?6\r%0W^2m=jmf(=GC"Z"rj#))9WR(5\OkdoO2$mTkYY#`A"A$OsVa>\ep0Eak+KgY)?^j(HhR1EEs!j\s=hf_Xq:Nf!T[-N(I+fa#aA@\r%(9,0^<2p-OaO!L\(KBE1EF&SYe_FG4=&Id6L\XQ#\1WME?2Di!P+eYcL^Ig_q6?XqZL*Zo7@te7ld@8&6X3][?!%o`>K1e?%-q*J\r%A#jTT%)]Z@pPW0Z(W3J[7>E@hhaJF6`OYQO8DPo`Vp\FE(WTb"FYO<j;DYh>_R1A<F[;QlF$sYL?'qC#*nS@bXG^;?q3AHBL1+A\\r%OY,S((l!/^msWV46AMG(2-$Eo0WYYRb-e[DCJtW0orYR.>anoiP1J>jY"^M0]%HK%]/I(T\u`<I>ann^!iNiR4#F?)T"rotD/.1\\r%O)&P`f;=ilq9.4;Ec#PW287YmEc#QjDRIL8HI5Eu1(!8EZ8h5g/_?j8X=t^(N[^h@XScVIGeL*LZ?Ck*CMLu[I1g!O99Pl*3"!&k\r%@b"gsV@42'^RH?Y!bKH`Cu-En[@i6t,K@>M[;[VE3a9e8WTCF0PgIp3IET%,Q>9FBbS=.;\ep0E.9$aS<2%3A?_r[r/?Xn>=I6Z.\r%BC0B;$0s@Bafd[-Cr3d1:U,&LfS"B]\I.1*i@teo`mJ8UB5tStUW(7!6I1RlUW(7!Ji26,d:*d?L&Dg.K?Kt%-.@C$%5*G0(A(j/\r%(gIQg]!U!ICR.G78^^`9a@%Qga'i6nF5:CCeg7Y?aE3d?YV,]V/E45XL38&nFUci&)qN!uoI^rna+\=.FGe6&U(?QFd"+;O8nLd!\r%2t&.OkSH>NL$n@lLE2)Oqilmt$IKa_N!6/PYk(,-)5J'Pq7R>HL9_[[qd,(3KCm$.95<uc)qG047H`Zg1oq)]P<BIaL9N:P`n]P]\r%$/gMX^SPXL(W3I0o+Wu1Hm&O'&<ql;>Sk;^/rk-fJ'ism!OmhD>g%+h(U,tPijot]FeSO;9s^N\BniZPnn(7EdS/dO&iUaj%-tdp\r%EZT30eUN\0jP=ba8]&&L-125o:o,)QlI?iVTaKY,GGSAG6ZZo$0@=6h_n%ha40G8L22#iqYIK=eh.!>YR;ra:Wo9]$h@$K[8i=Oc\r%S/uYZ'rk\lR$JaCDn(PeDlWSA*htU"]fk5G23o,'Q=p_L>$[m\O:q;HCT-so6!f^U>XL)C_`P#pg>E$<"C?'W<L!r<h^bk'MUmkN\r%LqM[bWn14<iUqk>W/>D9Mg<9!<2kWC"Lg<p6T(qQPP!)Z\ep0Ekn4DmG[P.8%ooi7EF!!r@9q[bkU$LB?,4'S%l\SLeqI-tX10d:\r%@9j6emMXdk=+W,5kpbC!?h#F^g+0ZV?JFE'HO;^M[FK;Q_uaht-EN-c=jmf(=G@f:RUOj%AVem;)k%pI=;NqAQ@57H_Ra,V_'6%?\r%@9=>GqQ/\f(l!0Aa3$NIMd]^(GY,iNQfG;&\p6$.@9jlA)Is+P6tQ8"/p*/b!#^rSF[>2p79gYHYV'Cb\Z;qe[.:!@.bM=$m_cW;\r%41e%<NrC@TTM.7e"T=uKkW#0LU2q@+V:+O-ijot]FlB7H4KaTN=I1Ij7Mkd:,-5RbG@;-9`A"A$e]BHA0%-u,Pnh=3-A.`@jm&fj\r%%dO0[^I;BD_lta9)dC7'0b!@LB>j<PM8QnYiQs]iMd]^(m(llDFYO<j_C9*ZEEs!j\i?:seoGVBOl[h"%I<"ubIB0Z@9jjK?u*;2\r%[BrmB93]TIWF\WD1:OYrRp$e-?u*;2[31lk!ZUUTeDb]S>KaFR"n(,K>KaFRAXWIm[C'8/>'a9"_U`aEC>h8-hU\-+?(5"ObHodN\r%Ec#RM6j"WB]URa>L%E$M(iO&%9sX*591b!1SrrZ4i@$\JrDi!l4g'F-$'_-G$0e=4e(W;T-;1Kf`k*t55`;bP[9T2)fLoC\CUl@2\r%[+XZ/[[(]-CRluu-EIS(4rRCo6VsIS>HU=.\d[nVaV6g,MbR<?S<$A'5Ih*d!g9.GUW"R]$[*6O*%a't(<>/k>&=*fE"hRX/N/%n\r%a-4(,meeX.Y-`>YeqA25Ab5</UjB[\Bd^+]iCr6JJGs?6D.Y\5%N:PZi!7m+OHJf@?Uum,[<+j.isQ0j]AO`OM(^-AmTQ]%l?jCo\r%Pd7AP$:,t`+MJ94bM5U"h,+GW%4o4#K7kms1J`:ZP\`rR)$i/?5:Rr!?"+UTB5a^eL6"?G?3Ni"(R<CEEoD+@=(VDHNR^I/F:gVg\r%%,)%3l.[]lVWtAX1[gV:Cbj+o[M;,TWE0GN0'h2K\7Cucoh'e7q?qDA<shY"+3m4WVWogV-[V`+/9=7J.POkP_;;\'$;AVa>V^[j\r%_Cc[[p&m`5mc\7-L5P_F4l3ktgii(QP4i+k9C+Fu:Y+AW3T-W2K\=m\ct!)uM-[[$,0Y/F&D+o4OQ4e\I%:5PYZCo*6%kM1bQZLG\r%@c3!K/j9_::&hj'7WQAIf-s7U8Rkb'26M;C/K\dW;cG#79fX7S<jYB(aR8<qAE0hH:=6eO=)*!jLbs<U,]#+ioY$$U8e(6N3:8pT\r%<GF3nlb)sgTA;B0`#NgK&6B>,`uK0QHri4_!g1&Wk&<%fi=4o\B6PA]%^@Z&\5LPUFS*Y`ZS=K6L!P>SL,Kpp)53T">#mmk=6r4_\r%R7fek\*(EaX%uH9LYbW4l+Jt-Z>]/0HEJ5GpBcE>A3qgn7b@@YI<+o1n"R?geiZ7W`ZK#4^_NmtFeh($s+mhJ&nj\s;fXjA7\LD[\r%^Y#L'Tc).))21M\#@Z6<:(aeZK1>Rmb+lgA%r._/imu.BrM2iX#BA<N7>A-)4Xd3_3mDVU5gj`:aA#->R?1=C58kY53,VC>5d1As\r%2['C\,(4hpPn\nDi[DO/8d`^(n.$?oWMCZH#p,4.1f=m_@loNc-Bs*E"<k.FgNJ'!RI=>*/pH:c^$d"pcJdFTdAJ6Xq92Zd%:5f:\r%0sp!0fZ,pL8O7TZXc%+@0*OA-&ng[sN`Yq=fJG_Eq"l<GO8$!:1t"&/kik9ZN=)d`IiBj5ca`]FC%*0^k=Zo"KV]g@A'T/51rR)m\r%=f,tgo%;uIFF2!m@`,[!,[UId-0#Nh6YK(CQboS(+pl"p8ncI66n'6g1s/fQoQkWn[Qo-)R2lg`(s*@k;')R(#bpk%JQDT%,5R=-\r%"/GA5@CMCdlfosTNnc1\QhF+)]tR[V+?t8'\RBO7`n2)s\!PSr;dBS&G\-EVJ!MnS.\Hmc?W;ANm[.")]N[n:JMm!Y3rPU[MWAr`\r%#6(8#p[gBS14*@XNPbh/@:'O>DWe!>4!24g'!ImEAFNqk>_>R)2ed8Dhn!uX(FqG5m^?j$;H'*W`uErdMoM7+D!thY4LiFFO(bhC\r%Z"LRhohQU.`e?+X(XYf-Dm)>NFF+g6epA5&7fIW*0%=[Ni\GRjhUlB-lZFg9B*YPA4#^mB1=nJRIN,E@UG&ELbBoZG@Q9Qf>ZKLi\r%frN-Eji)[/p9S&.[$/TeqM4#<>LC]SIq)H,(k(I[Qeh;,ofB+#U4:DiI'bt'#Kn)&a.oC_?US_]IF3pojR_!PB/g0Kj5L%7n.u16\r%,ZHCKEpUX"%=Hq%YG%H=:%d7K?Hg[\-JX@A*G+_H/Vp+aES\kmG)a.ThP#OF1Ys"Z23<h8A4bE$8RRG<g+8*XT5m!ZJkq9r^)`p>\r%gD>*`bP2-O@b4=,KLUga:[@/5C-Taf2[Au5EBg@?8\^m-^RG<F&f1@)p:E=)Dml8O^V?0`/KPYLgC)nDnh-Gf[hlch?o#^MgImqO\r%13mW,2=COSN$VFI#ouaLXj]O*PDNcIa8B"[7UEdR)&^SDIFL'j66u/dZ.q;pnb6<%R`m\8d.>,Act'S)VG7TYXg?uTktHjOB:OT,\r%$Mo`<r4B2j7PJX&aR""<E2J,DT1kRNiX3tA\T&tb-bCeFh9I?$gc0pFZ;W_]q29@T9]<ccF]$NCnc)ri$EH5tV-Hb.g,n'9%=SmH\r%lnkZ)_JdSmE+T&!Jc70N]-O1k8PJp<^BD@4k%&^S6_*=j0Uon<('IKskj#@LjbfD>eNM)-2VS\L4IcgVYNA`TI#H6g7'kq4H]3-+\r%X^-rfin]r-*]>;JJdjVlV<2'F$"i:6(olEqR4R2JQF,G&hX8@7a5_'t!FHZ'f#,:7T@1c&lm^@N\&J);ADPH8hLuY]cgs^_Pe>27\r%8'YJj/B98L5aAH?+4:OCY!Sj)qNQ.Hl)'+I%<=aZ(8n=EY!J/.(IO8;EIB.T8?,A/HEkMGE&QQ9R0iEO5r0l`c[?Q#akehjm,L2U\r%?MF>&oT94e;RMG^-k16`"8di5@BMKX&PWK'5H^eS5$/M2oCF/R7pOi<cRV=M3/L4llX:V#H@a]B&H%dPh,u>3GstR?lq]RaSs!Za\r%<Bt=TbG"d`_40,t[^p6kZaK1H@p@''Zea?<$+Cq)*NapId^jm#9r2ft7$[1c*HH=I@4pg:\L6/Ba4FbUfMi;=i(3rhS:O_K1p!?>\r%niA4D*Hju\mui]6nF5FWrKum=5lLY'[YL19PHK.9IkDT+-JV$t(-LsYLh<p0Qp%D'e]L%WH[Nctm3oPe-_nNCj$OkLX<^Nu+9e5T\r%l:!\:_e<HDlXCbB9]bZ?%fjXS4p&<dA\96TRVZth"1oCS.d:SCp!L!mZnr39"*2aIUL=E[iM;*TQhk!19k1p85ot\cOeQrYD5jAh\r%P1nts"#MXdEF3)3O*;&[NiBAWV*"%'ZZ*VF96[q=?Y:%\7KQa#KU`ktp3&%>;RD%!"f7$bD5L,qbN",h%>D3i.5oJ$cohRRd1DM(\r%`UOc(Fm((QQ"^U(]]24MZJX%KH&2PI.HmHPcCja?JDTh,F@$8JoZC()hbKnD3o5H4YUQqPLY%9$?IKGFieZpCH0A3.&b,RN:I?_$\r%5fLe`d"p!5YR!nc.gP9dG@&EObC7drZ9jtc?r0rF>^UeTnXWEOEVFU$pb-uA\^JdK./YaBMR!Lk[u=JQG^[qbV/iq'5His':4h$4\r%Y7t-P-<IFM(9Ug(#utDd#-8T7c:RB1LEkpGK.L7L(Pl+H=bE_E)Q,=DF@eRYOTm1<dj+f1&YN%epH)8eo[BN]Ve4kFG?U=L>M7a/\r%dD:'9jSagE.)OD/6$4s;7)9s!<78LrDgbtM<91\nCJ/7#N<N+AU-uV;p!1h*_<S'^e4gH0kuP,1]H?)YF/`L?:1%d\?\r)HR`f8R\r%KGXL8IVZV]56H/0IHXGCgN-q*)aE7f;L(e\-R!S!k0fNIoBo%WqJl82!k5BHQZF/3%=e"i,1fs&dFXMN810a0rM*lX="O).]\Hkg\r%j7J"olK_++#l[RSF4\og&QTa8o<\94gXI`Or>-rm-nr"=7Pr%-!_L^j?po8.(Y*p7m-h7j7Pt+A$-7Plbk`oka5KLo*Zj.q8jE"A\r%e:2?=hfBeAm9"XP]4H2JE^4'^C0dYdL%&oqiR)[UrtD#>q6\jo+JUThLijgRhS4.VYU+=ChQGP#'F5.#%3HTd%BtGO>,D_.F<HVg\r%hNd.THAX,!K=BCl,HJ[gk4$7UW84U>2Gr!<XM/BaDu7OD3IA()K\dHI(UtU/4Jnb1)OErbQ`>e16rOiu-;HY=%T<-$XG%#,I`@rh\r%DVFW9EAhG&%,mgF*/k`_r&e+tAe1q?TTS]S9OOb#`PP`A#q2,"4UFSg]Y]cTb]:@cWS,gifle?L`2en8\ig)$j%^p"YVk>"N)ri^\r%&RBe[,dD<E'VF3igY4=.%XSYihYsJ5:/Ipq*Nd>nZR\VIj>/qEY');q>"TrXF]SRPUnLUdFdm86dW9b'PAN6-nF\k/hZ;[^_9ZEN\r%:n@IK_X)#BPY0s;%)3!T%/0?b<g,,/S<#m.P?DOU099=_A5[1Zjtp^Qa2=Ga=SU9_?fm"njYPmEhrP'mTU-WNMtdD1Y4^%boqgMO\r%prJpXhrp$,\)'(*hBo^9HA64<DWo3oKj[Q7Hnj@h_GNZ5rUM"NPXSB:7#uPp+H*rR/@+Nu2!a&[GW+e*p=UCCY"lIj)tqOEE]%al\r%SnY,;:")&fZSuii)M@[AAbO+eWmT,0ET(YrYJ(Gue'2(XpBFWGpjn[m?EKeM=[Pn-P@[+O\bN05CZk2NO'l-M>OR#JB,>C=K?_Um\r%hU+m,cL(c,Zf^L#N;hsD4?L'uLg-9G^TRV,ZFFj^DpeO\SJRSb`hqO-#<drJAV`Mn3b(4AG@iM.*(h]@V\2u>-'`Z9SNp.7PZ4q$\r%[hDc8>i'VS4OfZ2U<91*K&0?3;<>%?!Pada<1-B/32s?L$?d/5A#]8%6+MZ+Re&LH$27iNZ43KJ;`;/tcopS@\t)GkE=D&,lQm;>\r%/(k#hS0kS(KUZ(9W^S9\Tr;-JWD$_?TI\9,*.'=(EXg2]P[0kt*Db0I?"Nu]DKtE(*G(hWI-9.^<-f69XgD/^f`QVag&T%3N*G1$\r%\lnT^%:?Lh<_k?b%W?\b@A_^NE#*J-gBjk<8c8o]C]"3#C'RTfe5nlEB/Oi>SWFQA416J>>F`EmRRdTF%$\^)"h[?./VR?rU]b.?\r%G88tEOWeXc7'ko>GDG=:Af:0EUr;.^4`o=kAqa6l/X=<>SZe$qQYF<-5?`6LE?8`5X7[Lr@>;GK'aIl"CGY&%CCXn&8UBHIHWRG7\r%PEV**GJNYhFPnknU).:F/@9.>%D:O`SZJo;kk"/-hVa;eQOD*I5u]k/<050j+fZ<@.U&^4<-"EiZ)D[kWLt0-&602d'jAXk7$U,2\r%"[2>hU<91*Os_B.7?p53A`t(?-`S.Y.f?o?M^jLF$=$H3Hn'n3M3L2h.]J[!>#mge.$l`R<%q\DPu"5K.Tu:ej&;qW7,>=_mo-3K\r%8g_$GU+3XTpi.RY3"LEe<Dk8/MOsTBc>-'cP)A;5o;P\\[</H4n>TAY`JAKC7T+4gQ)J^OWKcg:;GlOP;Sc;r]Yi,j;@/KP\7Uh%\r%-4EmdHO6^J;TZoe&\XfViH?U$66E!?eoQ/FU?[IBb==.f3Sm)%<Em?,lE+PGJQfo^_c3jB"D]9V:MDmoPld0(ibGhi')b24T3g&\\r%(2D"W:`PPhPRs6PpQ79qhR1j3DU]BE=OBk]dAn_'-<!\XdAn_oXsDFoDUd1I"@Iq[Q(k-JDjbY4B*e-a9]ETiBhON)`h[q7O0u$L\r%Y7%;NB"J\$RiYNJi`@6#lht6rr-Z5]Qbp(-$q*Bg1;/K4rHE1i@`EoYj715;+AM.:4__`^*HA_a54OY[_Ci1ONdJ'*!O-Eh6r-k2\r%%JL"rp^@^4p=tinh*'m<pI%T=1cb.Y_%[6UFaY@..knq_Y>:(\A^3Gi9$*N3bDLY`nZ4aZB&"%_+3'7do)4_pbrq1:\37L<n-S0#\r%O)M45LT:%7'q2DdSq%Fah&W1eV:Y<jHh+$n]^"M9*VT]=Q:pe*$2<Llq+J<YSnQOi/e$MKb`?b\4fRs@?nff+\r;^od(9Xq`D)!o\r%!VZ`Z?;3dL+%csP-QM[>G/HI/f7fdkBrTQY%HAWqL6R$/mp%kIO!3VV-qkA2kqT!hP@`aOHN<#n/cl)glB6LGIYun=8`63<fP`>a\r%rSi!FnmB[8;F`,)e:>0i8HS;d;W=a9<T`'Mi$shtbrXsX5Wr`".C!o<l*r*#=4B66R#l[cJ'R"qbrpW#bQbW#LjK2=nq)6U_EC2r\r%\fnFEj#n@L8LV$(Tb!4mRt4d]';fPV$:HCuT1*iPq/Frn0h^+1j7m/dR27[>6.k`s7L*lZ)H,\e@ticI6A*([4O0"$esL?,B7UBW\r%,nD2A(TiVIq6NFI4:'VS6$MFN[c`N*&&PRAiLN!*JoqDpJ;+d9lc-o^b9M<u`%qRGXQ)H_]T^X6enlBBZas+q7FMB8!URYrcZ2A5\r%j/jI.[e!eLbd;BVU,DlNbk8+oJNr[id2H0e,Y01ZWsahZZI2c`cOBTDi->`TTT1WK"X_cg(j]uXq%lre&(qQ>E'LS)Zi^/nlL/Hc\r%j)[4M5H7e;2c?4]pB,b7VSJfADn0;9JNm,D+4[R%R*/R7Mbos-2YgZ/S#_RYG^0:Un,Z@UGG7Sm\'[lL^N0`hKO)?h)9BeDDi)cN\r%N$uf\*3L$lTnnTd[<s+ecVp&3k,Vn$MQ;QZqon8'hCh?2qbJI7/HqI7=M0*n(d?\7DI/+(Fk@Q;RglV_*+;ch'`Y.mDGPm,XnFBS\r%`D8gVA34@2p2S]i>>(%6`G=un$OMQLrYX==5N]o-mrojQ(SO,%$IGl;VQ`9\aTXj(U5\0Z$>K<_0Hm9=16'c[N#ZbN4e\p+C9nNl\r%2Fl,'#*jBJYFF`eHrZ<V>>)m?d",`KLt,*kHc5%91uL6F$4&0P-!G7\D,f+]7Z5e9<V;KV_]A@[HVO-Q*7r$1gdO[2\:@V[jIS-5\r%[hcWR3:E<L%E>/W=J%&:(i^XoL:h$aqb<@b*`;V/E3FlR5"\`1&,Q*%kHAiS</uB3hs-a\pD=V>.2F$?.g'RsgjQskO$c&7V#sdn\r%_A<V6IsBk+j5H.h%:=rX.*9?tXOEP*b8m"Jp!A_Y.YIN:4u?TfItqdLA?&d^N>0pfE&47"4YQYf")F[8EUhJ!Qijnc+*5[d6*aOX\r%"*k9r`LB:)2h?0!3Sq\8446;QP2k5+8(o=\b$(kST5di"cbFo)Cj:S0U3gQ3?bYj.Qgk<sNk`6DlrtP_ra#PUcHP`hmI'icQMM-g\r%%Sa<6Rb^5&dLk#G7,4b.P)`Y(GFQVZWcUYZl<*b@fpWr$7g7cH)TP<kULiWWm5(TGrRnlc5C@;&Tej.4U\s:ui!1P)Ok>*1!!2VH\r%*^'/SU^#Ch(#%"t=[k'o+RD'O-K>V<cP<5qIudjDq-d@S95HY/+rd5(?o,@s9GL!FCs.g%&&m[tZMU\I2S87/T>O:Q';c+K)VrUR\r%V`+U&IBmm@rbTXmUEqP@*@t+;)E0a.$1??7%lFUJrMDSs45nsRk]an)grjP:W]Z8%Y'L:HBHQG`Z0$JMl]6m%!l'nSpJI+K]6IZi\r%1tqZFD5Od*k/5Qlm*VZQ.839Z?43t$]1#/;*N>j4A&CablD9-^5@A*!eUIQOSC7quX+hcccHuRsjM_JS#!iRha%St<67I!cT[f44\r%UJa7Lg$sRtCN2b+&34FuN0^19Z3RU-;;^f0(@+&r2L`jY*L_!b1f]@e+D_c:B,Mkjk^<h,0ALCY+``k\Em!u?&L+,Zo+f':Q(tSf\r%?BWa>/XUmpb8YUf@+%qbagIrq^a*fjCj]O&+19)6P;?2:k'FO!ZBb2:9U_BoT-L2iZ@:B;5H.%7ioS1U[W<&+,hpd?48EiGrcPs4\r%pc?_s/%<F^*Y+K'?i4uupc:M4-.Qi,*chRi,g^?_Mh"4'\^>5<#G+Jo&SnguZ<,V"h-d8&d!%Mum0B?r0Ja8+9`sWunLpD-5P:rA\r%in[$4h1dQfpgKMk8ulUUd/(5?QfLSg4mmnK%R$lPc^6bBmBr1L'`9d>r`/?]1;qlKM8BFp;1GDoA*oW/$[H9MiId:!2lQR$U`4<T\r%I5NUa<8e%!!ek_@&T0,FbQ!PS[E34;^-kEu:88hVC@t1clQ_l5>.qBpW\3jtGRMpgd9!s0]P(;4^C+OH#LfJe.]j!j6V__0?)nmf\r%]T]2H]4k84B5DFrr>%hi@t%/2NU1&1l5mAA'AH\;KjCaJ4mRj&<NY8eCfQ,R_LhBo3X(i\+q=HTQNGp)`-K%5JSuf1YI+.c9"bOn\r%nQc0#T!rH9$l732B?:rm#(nR<_*u+TFPUd"$Xd@ZU73;2m01$#(gT_ggpV%4fu4grZ5\N.EH3EK$uE4+..L[6`<pQ(T@0SJap"J5\r%TnL/@#g#FgbqhukC1-YiRW24Yqo[9E<X3tIdciPB.o+h@%@ii,Q6U"3X?WH4nLTj<MSB`0DT&R%)IMkK"K<*&%%C/QqU4HBR>XT5\r%;cq.39CW9N^!,Q4V0M&Pjl7Y8&rbpgZ'q#TR4bYs,f-Q<kc3=M:k&OU71l*!_8a?;Y=JBFk#T*8Z=kk*7o>7h.!n@l/sk`l_St[G\r%<-7l<(Bf`07oUpcC_@RWo(.I"fgF"C>.R<VR);h7\K-RoJ?em`/3o*Cf8E<<%mT!;<gi#H[+];20"3C3:_W%g0k`d?dq-6dBK<4g\r%3r$fu*k(Ueb2</`+43A=^DD=&o!4U]TXqO:gAr%V_mB^%?P17bEN?2T=s*YD*mrWU<dM88P<oJEVlDjQ3V,f)W@ADl5s<YA-=(@-\r%kWDl,U#1Qlc9&BQ@WJ-\oEX.K7Q8kh:sPDZIJJk<o(ZlZmI`:Ibgs&1JR1Qj>JK"Z_t%E<ebAct:=6rhGNDNrPAf'NA\>>Xcd33H\r%N!+1q88./S/"'WqCcEg+[,1bi1=ZhBTfWb!e^&q!latumc.<iG5G(QkfAQ5U,j$pInp92"N`J-XrC(D!40@7#.bXmbYaeqbE<*<Y\r%Psc_0*+&43Z,Cum1PeFFnbu0ir\&uY5)%\'`,j!@Um-*4;j_@L7AW5?a@d%iB(pB6nntl3&hEt(M(o>H=H5u\hG0CYh[Q^qdj)Sj\r%?i8:#\c"<'gHYPfNSjbXE`-VaZ,7dKSXLS@i2P43^DAWuZjD]eX)_+7e_m'oa`D5jrlf!nqfGNYr([%pM"t#+C_cNf.9Jnt0-hZ#\r%F463Pq0![YS*_ih=4W&ZBE>6)j1D%)HX?*tAff,%#j4]7R=IQ[;$BNkc2l-R+gc"ITTMV)NI<'Whm;OYj#*Z'0bf5R`c4qEc0'(*\r%BRZ=,mk%)gStYs7R")@CcaNkYBi%oF9m3588/2mpTANUXOX_oB#E>"FQWI/G$Emr7j;!riP5Te6nqp%E6.KTsY7?.M96irPY/'.=\r%,d4/beUg(T/[)+k(!!X-BUFW,oXrhuWrnZHL]_sK73o#O\'JNHMcsFaM(:TMb>_e>!M?`7.Bf\g'sKaDjH]74=clcbiX4jMHGh[?\r%Wug&emR1C?7i7jt!c\D"*KK1qQ+2G2Jf0g#ZAatt-24CTp>QFmO^3'EP):d8WP"r<=.E3774#)jX4)p<U(UN]qrUFU;2Hgq]4g:@\r%^nAd0'pZ:\SR+s7ok+YIkC!.Kgf8;,QAnn-H1S&k\lo_q'2fS$4Z9F'^Z$0dC;k[*T7(8oWTNf8'Tf-1WW6f#_c-Am.R6a5Q9\C]\r%*7=+t*,d@-d.dGePTfKh`1fjKWFd78-)pGm*"YXj%G.%:<&p1BbC(3_;<:VPEBIslR2ao'3bO,BD7/SZp=?Z-Aj(KN>B)d=ZD,rN\r%YbOaiXQXLOi_3c^[M;iH?FD5a\d=t]<fiBdZougd[Na$lE+<+G1IeIISD.*8$nn0WZI;gi\='MJ\CDYS<i^YQ?J&;=p62IuQ(4;J\r%<*$gm_`J?F.jO0")qt^j0lJ4]\A3b\,u5\1plo9g\X*jjCYCmlgPYU,1Jti_S-*=kYH,mQ3S<(ebH,>PD6*\tq>;bO'hf"X0ah=A\r%<q_BuXDBCERDhhR$I;f=1mSrd(&B@31tH#q.'9bVL_HUjfiAKdZ+%.V\s'D=MT16r?Sicdo'L6ec=CTPJ$Jr!Qc&fK\dnf+'4:NN\r%Wsi?_!Im$3Y5WujUK6'`'2dlXp\7UVH;P&Na@ifY%FKQ5r7WXh.q&EVUd$'_2nJk%a2Lbo0j4AM>G3EdGLRtNKXA(-3?N*FlDMR@\r%p!.F5=T<M'+Y?t[MS/`3NHB?@R3pZJh*j1cbl5k,qG0-+Le[.FeQHTXFD.Ff/AKf.SgLf7kV.u(nW>eJJ'7H".T,!F<KYh$]$j<m\r%qk0j8^to5Hmt75*!W1!G]FT>BLJl#dnNJ@7++XY!DqqV^A[p0#=EL@%SEEa6(bumYZ0:[V\cee_@F;jXE'BfiY&jh:\&+l/4YO1h\r%%k?Y\]%W=oM-5K/5hBQVo]'JjANS[5K)BT1:F:ok<lL)&om('mBtP^hdkdf@&!$B$DhljIggcA;+&p;lfm@iArLcK+38hSfI1ns.\r%#@qj8Jpu>p57[+r%Jia^A+#m@COObe%LV.aAZr,NbsjYQ>o(&$GLTJ<21[sOG]^tg-H(3E,Y>P2<UUTd-7eZg"8h[0N-M2[H*PN^\r%>o*4t1,BN(h/SCKKdj94Wd-<7Z"urWSM-5;#qcff`!<QF7'Ep@c(kP7Z^[95aLr=EHPEZ:gV`C_L/%!1=Us)^'fbo+<LRVnM$m(Q\r%q4Z/XJV+7@TpCh@l)/s\m>4s,aV,4,[O3\Ni#1Pm`F(.O0u+Znh,']_ZH7MebjgWq3+K4@bOO9NDYbs\FEoXeQ$2</<.+:TP1hEM\r%:QkZ[nCC<#Regm"Jn5aMD&Ina=TkfmYUq*(3SmX2g#a;TpmE!uKfl!MjJ86A;o/@-G*5@&T%QHrrDOa=!eO$V_;t/,St*/VoDj02\r%'t?Aa9Io[%X*1.1SnPNOJ>tf?b);tdJSB=G\eULu_56?4TQg!'Mfka/3b'L\%-p;3TE:9J[j?I@JT+PP\?0j/SAkLQ[)Te\Yd9A@\r%-rh0`$'bh=4W"5:in`'_(4G5`rdV;ps(IDld2LWc)I"#MCg%V%:Ec$AO[0:gkHZ9-RR"B&4I_0]q_aHh?VGO]4GlZAgse$s`)=)O\r%m:\9^(2>C*4PN7S^G*:ZJ]-==K)^_%?R$?r(MC&bJ39Zi?p"B38.r2R&V8gC?"?%,UR2Ws6FhcF=Z[j'c_Z*WWHd'HN^?%3#$uXS\r%-(iim&7[c8-]BSGmd-rkGh_Ig;<LG+6T[nk7\c!Xm]DDTf]TCOGj9Lll[HSVlF&*o?co3iGAn.Php2Kt[JB!&fq)NrY@"!TCFB5C\r%C\\QcmGF0LEVLXNN,YCo5U@7O[Z@@Ui-t@lr:WLWbJ=Lof^,f_/@C7Ed?^\&.9Vj3ZFo1e;X"k3*?CjpM6rZD*upspTi5M'GJqSB\r%lLk-nX*WUZm,S$0E$fSq!Ogd_0A=ZUq81%/&rs4,B9M$0qW?UPUDeI7X4_8HF=.a%2E.(!fs`5'D/M0L3b*iCbunTMrCX)k-]urd\r%RDLR5)fVrnF,9'ZLqufYbopEcV.*_U3'lZh<CeWBN73<`0C;\0L"nVlamLam,LIBM2g71WdXKEl*tbVq8)L>SS_WSfS\e<n:">`I\r%mHdhXg>30fD!9eI$*>AQIFtk'`JqQ*?f\Et=\NIdF)i5'N;fWunGUeF\UO=jk?._bSaScRc0O5)&;!cBb63!*1.tElah-,$m__cL\r%>LZ]f^q/\4(F,BpUU+*2lS!]9(S^#2)*M&hbKFJaQ2\gg"me@S<>JBfptVl72-JR_4GJ`>B\1EfT*h\AF@Z&MCTtK%8sSdO#JK7Q\r%ZdpoWY,E"GIMTMY]oYYe;8fT%73lqGMTf&Gp-OW4VRSIErKj\-K8E4?&5`rf0MODSJ%:cVBH!io<?8f.-GYr&Vk-ZGDf?oRZ5QM.\r%%e[]Aj*H&T]r#I;G0Bj%c^MTEG<p,OMC:7k.-lR3.Wo)AK8!T!PS$ad+d6]r?P+73V*5Qjht4;65$1k'BBthm*#<g%_[9(KHg"ZZ\r%]3q!PZ25kSLJBV1qmHbnc/L--0\-U#FVuKZpoL"$Ha($djtXaI,a@a`LEMS9>SA#)^\@-6?3DTd_?HaMho$8RiHDjb<AT29<-CqK\r%p)O*DVnM[HRWA>lDt1+E\b`I]e4[V^9ZqQPU,PHHL=Gd!+@S#>f7Oq%f`YA)7KO,Ga1Feq>(@I9:]@j#/\T,V!$f?@KopJE9i#Qs\r%$58$[AD;)^(75Zko/ij(Oq+faD<[S-834u7nSTb6Ur.!g^OD]t4XPjB/Ioc7'>j9W.#at>D!HtEjZ$IDFH$UCC%><bCs4RV\-q"F\r%KorYZGDQW_MX,A\)[[hS0H2>Z3MnKn3h/+@5),F9Nd#=R&kI;.TcUX:P]f?$,i*JFb*d;X,O$m$f#Wk#N24@->3F^'9F+CY[2imi\r%JI/$?icM-K321Rt\!W6\f@jG&LqHo[@QbQ;6BJ?T42g8&'*<O@Ng^od=rYjPk,c+UWjP\I;0\$+;5pm.@R>#l#:4_Z?;g_l#bdM_\r%rt.TsF[Cn`UiK'5Tp&G4KFl$1oIghDOpQ%5+a0%6J!^e19`.Bdq2Z*X+!JQa63r^L@S@'4OAntf7Hl'4F?q^h^FU[r165,J?DNoe\r%n.qd10@EKCUll]=O[`6jo3uh.`W&$k@V1c1ngloBfe7!p4iQ)a8]C3@j6X%HJhuO<c<eV=p)%G'2%@i#pC_,"X(_>-iZZSg9.G0m\r%4N5u`8]C3@j6X$uJ3438EVB0(bDnZfE;#/BjtY.&9.Fe9R8-`#,rRa[`FQZk3.!3UTQAaaS3;=X.*9GgI&a\E.]K)Ma&AMAQ$R#"\r%ZhM,@r4=p6$ukoB;P?2*>F[kU&ru]'B9+P_GkO;>fjdUmnK-`WD=YU_ip?2P:Gg&T\t]i1`]_;oLIkF3?/b.T!.mls:N?+'GYfi7\r%MR1?d9!8"Q`7Ze(n=JY+n\Vo*k3rdls*(=oU\].+^e?Sc2jaLO1M3@!0i@=5B>mP$,::PpMQWA(6[QlYp@q`!Ck]"2[:HitUOb#?\r%E@mQ(Ai?l)3N`Nk"De:N:8;%Y6\G8i<UBl/6r`GAGHg.?p>i/l)p(T#KDG#Zo't-'PnntrGQZ>L2jASBQajsuYN"Y>[VO"?+NbA,\r%ASr?7;mT%I%9LBrXHn:fD!^M/3icgVWJ0poiO$1deag<6s1?p9/7u<V-aiSG%@=*LdL4RfM*%?[ZCfWu"@Es2>5$Qil12?Se[!fO\r%Qj2nj<XZV=b4:XTZLf8B,j"e'>R]p*UL"b,Oc)n6ZUHYbG0VRIs4r[sLTVThlV1haVpBd!T#[4[>=`XYR3VL;h#,fJS!0cciK?1f\r%pj6I;3\)%d)p8%HJJ#oZj,uX=Z,'hR$L!:=WZes;NEjBgC)]?C7B4j5dOWc-C/>V=I-/cY7Au4bG7DTF1e&i_1kQ_kV3^MAB5RS&\r%2!\"TpL@"*Rhe,"iemGNK[DJ=1ba]<4\!<hd=ASTL)>p32$\K(anJ]d>]m]5hI80H^;g3RRs94[2_3mU3o-X4WO4N_BE='e@jg,K\r%GP0QR20"T3RX:TbKXr`[QT;7oi?:5m:RM'fh7>]X*.NBn5:*D3TMhLa<qNs1p[_<5.sbJ)/8/3u7B`bVpPYRk_>o5if>T&MO?ckJ\r%e_DIbO?clu@n!H"k]N0'6XkYad+T]KA`[h+M,[X*p(ftX`gULQVQ3\8V^eb)HT*cK1L4R&65k>T2@L#crFFIf%-Y*r<E@76c+G$Z\r%l7,JAVGpUg\dD\>>%L.+X41AqechpO=/"qHXfU`/($DmGP"\rN1IeLJk]IUgEEZpBYH'X,N[1=$;KCXQ)O*dX'tpbRY*N7&22j\8\r%$9>BjHS2kc:r'R=JoF8UXP@tbCR%mTp6;LUiO4PHi\+,BqsG\j<,+pV-*AHEZpDZL@oRiUU(H;V!iU6a;A2FbAd\Ha6F/0,s/sE:\r%ZJU'DZ`8p?nl=.:9gQOj?;K5oXGs%6Atb&&Jb!PlR@Td5obaBoEhfMY4[uBJgo)ZIf@p.Clh-J]29#*]HHM59;JLYb4V`,';lOL=\r%oSZd7Q)^^Sk4d#r;UlHmFId&kOfBk_\amn@;UlJ-p-&#H<&MYbhYC-NRY![K=("<<25T\o,ONpS=&WcQ,LfY0e.fLjNd[qbH[DAW\r%<E&,H4,`d+;H*)OHf\0D>omp3.cmITc\D/jamOO+oqTD7]N7:^>P]>ARY%Qc/"]H48=YH!Q)^]hJ'9F88l\eF[E0A[b"<nbor3$Q\r%&h9NrR@8^G`j&<^"QH1*6o$u8qqI_6d&40NHuqPPG%nVV>,`rM.7p@UG`r=/cULW;QcH8@%R"8i.H$E`BIkXnnXt5jk_KuiQ$"l+\r%j>J@qg[Vs\b"V?1Yc%tnMW6k)W!niHj5!j;A<I:U3Z_C&#"c5FJTka(I=Io1G;Sr/,p,m1U&=o7IuY7*a6NFaa,8$EU(,m%Ltfd,\r%<p9oH9Y9^hnaH;j/3Vn;2h(LL$?*Hcip/+ER`OY^248cH0.e=nJ#`Jt2K^7%RumMJht9dFc`b0%,VE;Rk#Q,D$+7Q1]"YlfV9-IK\r%IYt,$qXiudIWcKP>`@OUbg588ZKdoq2+'a9;Z86'U,=r[IkseO32haP^>8R*GB$um?Nm*=*7V!dE,1KYIT$[lcGP`SU6HPI+j&G%\r%-*+,LI5n2lqiG@cUb+T(g1f+Rl#78GUO*?q,?:oU6B^lo.k@R2AK;3Xr6DXW8<^K$@ZKKM/^gFHV[b@c8FhA,aZ:]X,]pg$Gs]-i\r%qRAm#fV-gl?QleC6CUhlHKT(=Qd"]SQ8F2+Vk.sDoPE;+NHP*s/$qs)8L1H^dc'2&a=kb$KXbXhWY^ZH+d]*YDRm$^UhONX_nH:o\r%qlOWQW0Kk^kI`:!;LZ_)IoX%N[,H4SoJPt[[A]+!G!*aG2NQA!5&6)LF/]>Bd#pRh.u18s[K/D:]**[g$]SsSZrdkbcr7IlGNpq'\r%G;9Rgak>n%a.3XV:3\,5@b`CN$gb,A8AK*R1G#.E5lt:4Alq5iJcs+M`:@&3f!8Z)#g6jPOH?LN7T_iIJcpNIZbl99&gV!@M%Q'"\r%;T1;$H'i"8/0>rr/'84BB1\33;Dj98I$K(@6Ud(j9?247j]e^1('Fr3DTW7.kG7:`($Q]5lFP]42<gXk).NCm#nlgC,pOt5Aa-\Z\r%)eU+GCa]P%:B$C_&str'$Hm'ROH?A#(h*4kYGjj%B7o<P,Y6#F(IhLj97d<?`Mg%h(S=j8I^e,W^$RhG=?]Bs6V!`tC"AX*W"Ads\r%267)sO>)C?,g\3gY^GR9M3#-Slm3*7RcsI,/h,E4h<4O_.3_E:"?N:1nRQgSbn2N5&hqEah\2a`:<$gXWf/dZ\=kr]OM]3Mb@aD.\r%^jR$#Y^Db"$Dn#p@JMH#'n5jZ@JMH#Q$1Hi'p^NDptYR3EkNe&!r'UCQh[H(?V_d=_RED7<;OJ8]1)WnkUW:NIGs("%DM!2rVOk@\r%&nJi3?ddO2GE0l5VjCb=enVqmR-`Xms"<Ls?ihN4348T?8nqc'Wm"H%es-4"5.n61(XeugIRs]Oq1#O&9d18;YF+if6f%AgPAW6.\r%_qI*jk9r>CA@(sspN9M;C'U5r?(;CqGb*Xol=\Aj;&K8V[s3(8SIr=dVgb1a\jVf],M_#S+aL\"Hhu"qbNF(JmZ.I4,N"Y&pW!3.\r%Xr998&u?%/]8mH`N-rW]S*c/9h_]'!5%g5B)'nV3,"_[%>lrm%R\\b0K=Uf-K&6!DO5=oT#Bo+mj&2m^Qf*!J)+!>g+P*=N@FBli\r%Q)<YS6QC=dSq7nPk:@H,`+d\L]k`GAqdWra)jJQmc%+4?Cc<qG"+Nd@%<34FckC;PA!+po_@4t[!@(,P/W86ZZQ+G@;!i8N5t-5[\r%j039R2_og&m^s*0/K=fo#MmKS/KBp8rpT9/6_\e2focF6o7YIC#<QDYY(QrGkp.l]^+Kp*8d9a%)"HR9+7\oW:PDGG5Nnh8^Je#q\r%*(/0Bh6/fOD'j71XuQAC9M,6M%XOh)\H%$!/h665)rgLtQ\P-<!WA/\K``%.@,X8&BDV-Z-NC6t8iiBoC"?'MO_,h$]Jl/RbP)]s\r%qn1eD2lVCpQkqA,S*d"DIl%/=h\ruO;\CY#]*HTN3'I"9i):b(1;BgpOn!K/0>^Uu4#:!qcDJj0pkWP&6Rlg;&P\_]N%]cBdTpp9\r%!9#2Xrh85)@Al<p6-dK^V^H&sHN&4RPl/)*SgVd+\CD'o;,<\KE2t"\0M\,)?@E^Zb.,3L&IR^C8VH!=UB-*t+2$2Qn,0,FJ7QC_\r%Z[<V*8$8RnD?tYtVZ`bfH:ES?4)./.%pPu39=3%a!c&l]gF@,kHJclZ1Ob"@j\JDe*oJZJauGJ5ij-+$$7EEe@;^P;n+Q'7B\s_/\r%PC+$AB(iugSk8+[eShP_"%Qi/o>K8meq5Esj3p?VI<K\6?>8(!Y=*/MPlq'R^;b%WMn-TBHh7*8l`!8'AbYJkVu&Mk2uVlI*Rgh+\r%bO\H-b+I""B^p;5Jb!KPEo2]LU,Ru33q<NH_"hoTnp>g0O4Uj2ibRn[0MB;4+/t,fD=>?U(bS6e,M/+%;K/VBGtQ24X1l)_[0_I[\r%Qg&+anp;U"@)u-?DBAp,+.#&$HC;cHUkMYTK4ULi-[pXOR78LNPY_(>kZ+Cg>ZRUqPj2`2l6VpUM^N-;/'"3ur]'kM)Fu);4XXb4\r%:1s,J^Y:.X+2&^PhEDk&VPMEIW&?T'%A$0gD8k'SC9Q@HBK"WPC&D6MW/T!t/P;;e7^F-Wh;HF3p%?gaD?Sj<*Mq8c]XQ/.._([F\r%9*r[l?_:mSgNuF`S)G$QCAF[.g$J`uV;h4Sj\l"blT?e+qr2tl3e=8]5jj$bm_c6q$Bq#K7Y=!mFWs>WK8A6e/6k"'<4X3UPIb?G\r%:Z'r`HS![qWtmXPf2?+RS3>PO68JE1!r%k!I-*0^'\Bii6Fp.H.67-2.XN_'D'D)XgU\OFAL@MAngJi8_j."8o*^#^A=gP`kI;s<\r%?4BmZqJ%^2^nY&BfU$fbDNr*F4gfu/Ik(kS;#sC>"E!4ZgU"b\C1YLultP[$Yl(1>bM*95#Or81=Uh+G1f]>r>a5JI,CK8XeP+RM\r%-U[*i9'm?eJ-aIEM/Xg[R!U<&:C;aZ.AXS9,V7"R;9`>=SeMf)63c\<9/B)\O9%Z08J)rim!+gqo6_eV'^9`!&%.tHb1p"><u,\s\r%q;Hg&F7X2H5=dXB^[;TI?`Nmql,_?j5246WU(sX4`md3EAp&J?Q&e*'OuE56!I\6qJA7K3_3=0%?_$teh96UY=!dX>*lI1jm.!)M\r%*/$+P+H;srUrdu73/DE,W;<G2#@#Y1\B"cPLb9fGH?Gh/ZXf5[lp4#Ulm\'eVcTK0D(G@?>H:sdg(rNuG3YBQ[`'dT)[eEMI3Ktk\r%k"0@+NOIqnHZc@r;P>u*br_^BRWLlf5(8tqQFWD6_]@P`+-^nC(J^2A$pWT$V&\W>!O[cWbL1!.Z#qi]T6,F.m$NWADC3E-mnRol\r%Aua^g-0=1QhDL5JlgDUVKs"t19JdCg*#!s;SWq/ZKdeh*B#]]O1XXFp<-NXk0b_eK+3qqZ[#>O')J@#_PaA>(lrN2>T1Y%!ccTrF\r%asR]FJ*&oZ5"s=6=(jIP:R7\Mn^g3F14tfL<%07Z[Z<-dr)0J^+mE!P%";al7]mA]/U@8[7fTmd,<!J#(nM[loWjJS8q'_DiI>7b\r%eQEQ<V0HW-C46"Yc?7T_bB:'AedjR`$/)n9DLh,3C;ul@$2lK'rRD?JW<FQ-B)FsI37Y\m,;$eFc&N%\A^(hY>:k;&nlJ_W_a!@n\r%^OYd/,gb8Z>o.C&U:@>9)1*hCg-XP$L-IS"kWq8uJ.nFb,/#_Ba/$k#>OI\DL&,Jt5*&,-p?#+8dm9g?WatkR'cW'1\.J*9I,IuZ\r%OG@o8J)HcETmLH7!4?AqZb73k<m/YAI<=B&W&JA/Jm!Uo?_3TiB^s@<EH(4FG-fPqo6B7rdS/!qAU]1GV"P&gUX@Xgkit`?#C%oN\r%b+j]hqi$cKW(_4dKS,Z"gV_0P("rA$ois6+l_NG&FO6_m\+Z('&ch5OqTGj4Yhp:qC/Vn63Ss"C]V<;b>`:o>k&("gSF&MTeTq_o\r%9)#lcO!7iDCAd$MRPnBrQ/jT;olEAdaP[e=?H9)oT?r[_L7km%e8hNA5XS-J2sZCNZZ6-H-o[r([\KqloiXNG=61rJQ>ZY<Dho1^\r%Ad`d&1O.eT]Zs<-k[ek.JX'SH7jlZSI#,Mbs".F'T59R%G!,Cq(.U3V5@$mHYJ%BSmFs^)m"A\&V*KNtJPF`^m-u6(6D_B1La;""\r%HC*\_qe#1BFC!NVUfb(#^cKK:+iU`-"g,m^)H'bB5150"b:$Sj`G>a@-lZ&8gJP3L9%f<3Ru)R+eMlsGqot'Ah;+LT7j1*2eSfMA\r%]iZ]9YLX1=NR[W,;@7"@k`7Z8*+/!o#G8P)4E?pKDtXBi:)5a9/>->:3a#M[=:PCNoR/:SlJ$KfYj#YK/iC79(<`"Y.UJ?;NAG,9\r%Rdm-5r\9^4?8Gn%qC-3I]Xs^[,qj"uaNH/",6=!Ph$AVoIBL[,F[(Ic3Ih*d#0]OJ/=Tf3)'^+e&47=jbq-/-a_1gnEm"s(DEIpj\r%'!Q6/J9eotV:+SjaA>LH5/.>1?Gf:rGYc,fL2p@=hO0"A%9n!0O6cn7f/<__)49$[AV^0Yfn4PZ>BZN&#;QAP)?_,ENPmUY4IA`N\r%4,74PAV]/P'GBm6B93dEbPj,?:N]#UkRB-iSlOAOS]#m.($drqVPV4p)uXb#,"rX-<$p!GcP"#5JhXf'9AAPe9GP5<r'CZ_'%/+X\r%2RU)H>@s+L4oIg!/9OkSgE'3Pq""4_h]"pAFt@A>JEX!)@Nn*Spl^!f;90N+ffUfoR[0f[,q"EWI3kl@0C=t`Is"7<4!*b*R30gM\r%!+*Y=ZKFYrH60/iFPTK_?L4XnW6"p+.pY**9dHY=:j,=@R7L-XTY(Zqbs[.N&qsfr-o3#P9dE]lak+FNm&.3ll5+l.nm44X6[pJK\r%R[MFLDC+ic06;O.Z?&&#D9otOSqoN\of1f<Z%o0INi(olfY^T_^+Qj'Dpt!($d0tT*fE04ojE!n;mD+S*hIZO;XE@<#X=#.m'Rn*\r%MENN`jK!3AV&>(Pr%W3Fn"YYI%nf(X]T@u`[%#/@Gn8K?6c52A_bq!N+eFQSZX.F6@a?OQ'%LLKMENN`n/S'e@a@$Kmu>u;;@cdf\r%hMOI$Ts+;GN5Zj(HLM^A<:"%m#HO]!@Ll*pk_AY-lsZm&A>ksmH/kuQZ%o.sFJt@Z4gBJ0NN0n6r#YeJ%!qV1@qa84WTb7'X[sMP\r%VOHEcjfP7Z3hZ)MJD92%YKLoJdP=$9JDpdOlhYZDN4q9CC]L`,7BcGH%%-40nb_MHD*3tV+6-gnPDEP9G'r7>7cNn7*?iQ1V3PYK\r%a^muTDHr6R#+WZW&@`HA;;r@=@4+Q%UC59B@r8"Nq]0b\-2VY=6sVa.Qp>5E:rX$oC@B2GUmsTiD9C\AUYa6.[&!)0_/gCilXH#M\r%m/oN[@Z[UA.D62pjQ.5E8$&bU$6<aPQ?"SQo5QsY"ctio[+MKIl^49ZMS!QndHfp:GqqC(en\;aUY9K`pjG:1rDH"T@=,=%]?(<I\r%ZW>@A-W?sOkDRrOdNtS"V'.c`AkJ\cs"BRqK=0d0062HJ%tb?n0^'YS[c:T$^<k>EaL;nt54F97.sJ]Zs4IDOGifB(VOP:rj6-Sn\r%aib_&1$f;@:XM5c)TY?tj2/>5mXd>'6=;eI6(8!#0T3ZZ<>+asDGo&]?$os(Ba.)Inora1N556q`dd(Z-WTQ@_Z,n5^H-U-bMOlO\r%.lWCZLX?[QREi6V%u&%+fVPPtr+)kqQ99K8N.r7.Z2Q$O*W%_H?[,)%_QdHcl9E@>'jHs(OrkD(Fn0DH&#q4r^5@VI]bEXsCZX.'\r%R1T/ea/$B;FFtZT<Cj.U!PFQ`jeNH5-RmJl=2^[pfNsI%/ptN5D*J!n@IC'@#":2^6ap$^A4oHKX=u/+]"r2L?29lAmW:C%S+^!S\r%*,h1Pq/qa)_6X>3g89;L-?S%2VerS#0@&$Tn?_T2'XFubfK(*dI6(%TIfK?ZZ;67lIB`7I=?d>ITt`IA]D87;m.\RQGZZae%EcO?\r%+,15LQub@`5a2b2Y)?Lub)Qqm1*&heP:cB7fVHDMg94dG%%D>UDG<;'RrfLlDNBqk;`pV"\7$\QOcmNuZ"GAD[`Ykq#<iM%Pqe&@\r%*0A=]$o@#s<E@l([L6KDW]X-q#u$)[N>Z0gfXY8k*d7IIL9!P.I>FTOP9eS*01jM[S%uj4J9RnNHgPKf(]EkFrGhPs""=KeZE;r%\r%nMRNoL>#A#FjcHDa67DGBO#Yn[(W5p,<jN<[SqpS/EFa6OCfH.jk0crP*5t!%m@2sQJXW"EYceoHUP4#Tq>e:7'kql1%a%1MY2"/\r%haA@!i5?dlf/1ALALQ0P,hgV)1/p$>#dg9EAZ4t5&88t81;#ZF=,+:m"YTl#R`&!GJEHOI&1P=.D0Y`o[oIafoEE:#fDcJ)(a\<,\r%r_O&GY9^H!1=-I\$jEfXiBXlROboLS%L9RRKqZ;IBa2-n=/c8c5W8]O>'Hg6%<O8#So$]jl[`qq`q1M3j9+6%jH:!pURL)qaL7/S\r%0g77+Lh36tBpiO=9F@sYbD;!d,r$TOfa9n3[*1:O@Mu[<%^ZS>M<9b690:7K';_*DrKuseE3>CR8;Lgs:X:Th9BQ$#oYH\FbNOdo\r%nD5O*Q5p(L]dDK)b#T4&@7iQZ!5kXT[2&$VU9XkC"h<-&S>i`6<Z1f'DDZOs3od_o&:`nLePK7qRBpfb0J`$$CkOqLaDE9I)i<fi\r%]b%1!Q%\j+4DEL+M.b_1%Sml=SbF#'+S!4HZ4F'I1m['7S)<7eXWb34Icp;,qH_gSA84Q12'uW$90Vh'SN/IYV]=+NGX.k-4//_@\r%X*:5MoX[8KG6`8r0+7.2\o>i2-WSiThI8=-TL7B;De'2Jd%TenG;>.(\<).%BE-/c4Mb399>R(9!`q/,/@'cR7Rc:Z*ounImL2>h\r%SjKd>\bq`Z`1B'5)6)9cRjhtT(E`;A0%bgL<:"%m#QDH8@Lp5-dI6(sfMaP'SVXu':POb`"nQ3S@S_3E?-p3V::C%ms'eH4?osSA\r%3$ZuK]TD'NPqFr_`1D-jg]Oet8qbf:'psh@'0!`0Z"GtYaBn4AWMf/6GU2u>Eu#gS4iJ*/=R8'#[<<\doR3rMM*3E_PT<0oYm9AY\r%M-fQ-UN!k%Yr;\17kt")I?k.baZ6QD*aSs=Rd;#hp/(Xh$'D>r!U6b>W&F#YgT&T12"jgd`_\AqINLCg*[G.qDdu)pap#Tt"J$nS\r%[#co&s1o"0l9>QVX.?c?=R8K:FVk=_TIV]3QT`%9$+,,]8maH#bQug%_X6<*7>UN&6^*I.#r5C;GOn_/IZc$'>[&;tm!(d5YtnZu\r%<<:I`Qc89IY@naV'I#lG.!H?Z'!Cc:P%j3]);uK6(Q;9obm;o.Vq4+T<S4H<2s&'Hh!N3/4n?A$/">@YP7W?fprr?mbom_+B/e!?\r%6@qtY7>92SLk4Q2JGdQ+Wa"puIg;G<QE[c5361'*KDPOij&9)hIeTUNp"Btl^5>"=Q$.3#WF#<4UW1o2I[Z/k9Cp*fc2>0&cSsb/\r%IiY+m)QE!>qQJBLa(I_GH!f_1nEVg$O*pr"00f>)5$du]q6/JtkO+sHIp(>Z2qMPh3VV_(KOQ&uq)6m5rpt;J3L,mkNc+2BYP/,J\r%jlu`Bm%A,jntR/+o=fHXar(5)bj80`hq<Qb5['j<_tB!-^/FCf/3M6>NENXDdH\RCa$,`Do&##09/Z%=OeUR]Qi,P6.A3,ZqASsj\r%Z]3`@Wh/sZ@UhLQ;D+Q<kn79H,96Jn-`=*#62M(=VfT0k3@/7VcmGZ<cZ]03,2GhUSpt'I:?lln(B7ItomHr*='jbC?T=U*l;-0R\r%]8KiQf6oZp)`TU$cY=OKFZ_c.l(j_rMEJ?CNAhn<5!+6)NZku]/+GF*]!'GT><fWM2*DeHpV+A[mi0'GO3mp^T(rGA6-L/#nu"dt\r%MOLD?ag[b%(BmCsrA:F7j/fQ*2#Rk4*Zqb<*igm%pbSe-?[FAWT4M[i7*F:WP9?.3_QgD[dc`\T3GR>=o$PTf5.i*'S(?kQgCH>2\r%GGs0D)<dR)c2+Sm;LO!'DBh=")Dnoao1LK8d"<&,D(#K.h=jjE#@?9r$_YY`j5Q)M<lDo1V0OiLC5.IPV>OK-Xi;H7T:*ZVFn)op\r%NB_V'cbAtN6-kg-;`K^j%;OElG\5!3T,/n_5)4-al5l2/0]];."5Qn#aW*-TP9FenGBUH`Em<4tLsu^CS^nAgn<k;g4=p@*YS8(O\r%Wb5P!f(G*+Ug`oPWi2f9+(At6WK::/YrW^cUC^=`WITXgl6*_blI\g\0kjSJR,GO,_/dok!m",P@&I6T76YWEc<qg^@OHmWcfAa+\r%/Z=e`Q8sdk0V'5LJ?j)3Y.cb!j;u;M'&-U/i!?Qh:hUURQjL$fq[bYnne#e+2:ULOL!D2u0&%P+UP[??E>D<VLaGG!ci([t:'sPZ\r%%%H$ea4ej.f!F5sCQ5Og_JLY2P2dj+d!e70=f=Pfe+(0nkjSGk0//sok`,6Rg'!$YJR2@nMQ)C1\;P6dcOB[1QOj'D+T]YsjL3Fi\r%i><J('-d,TO\2'JnUfa$^-$k%U"??P<#UOUp5i'Z_@(Z#SLsPCbor^=:@'FXX2jsfYT[[.-WU"@>AWBH"pBSqKl628Lo,u(EI.=`\r%Ot)Yn(TU;kfBLT($.>BP\rr4ed':k&0:3:1"S,,QGes2b:*?1p#VW+M?Rk"<H5.Dc5,ef@aur3)q4o4Ia@qlmDC45pC4'=4#)u2W\r%\gfq'o?HRnrhNSq`p2T'-CHuuT/GNPnX%V'5d^*OkWm]K&@8$2F<G?6#^,^<%Wn]P,JhEbR0m2B6`hApEh`\UQHb9sA?>p,kA"!%\r%Z;uN9AS+@9\kmq_gARIo$3ZF9;*(i<9&$C3G[AJR$;E]4YmQ`mP`.ZMSI2Icj:*RM#eI&td&@@WH!V1"B]\fh<Im[e3V9+\<$4:V\r%7NIjlZ;uP;*-aClnDD?7-";C$X$F4jRh5eE;?_*RQ(u;r"YTX[(fW+Gf@7;tZ5s886j6a@Yu7R:_OJ4G7-b]%Lt[OilpkP]Z]h7c\r%%0TW)#$E>^0DJ$%jI_s[b:')cJ%nOkD=XeXZp*N`PpoJGllTVC8rK3oKHCN9@i=>O?K^`s0GLGi3/GrRmaHOgPiRdDH0X[uAtI3;\r%eqVlCl.pLbLYEY:.S+TN<0<b=2]6Tf%m$H<nSg+Ar=MbFH.!=T(MsG[W@tO)GIkInPU^%,LZlE9:&L@$UQSf5O2q9,/ruF%dj`"?\r%Z6)TW:;#3HlE>hTict6NQB[A^3e/cV&mh'F6_nRkTIK>M]6/B;3*'eWc]8D)EqUWF2@!`?,>:elGTX[VH[r9E!W5C<(VYkE))cTr\r%U(d"43G@X#'9H0mNf#Uf\?(>g;JFqPYp$)KUrk_@W>nT`@f6ibOR9V(nJSZ)2^R^K]_ObD[-s$>hj$f`jE<rpJQ.,!]-AnHQhlfs\r%[CAktVI]o];5,mQj"=%];HM:ch;^+Jh>k26_d*K1E0k1cJjb0c<4GS'`uG8G;H:;udm2@S\B?rkgAq1)c2pS:b&d`de"^^]lCKLr\r%je-1UbS59#XN:s+1+DW(F5`VlP#C6k@K$G-Z)[%Q#PrU8[FOFKWU?fMS-RuVRi(iO(2f!hmJ-B_7OKMB0'gooXuJS2P-/ekMj\e8\r%ip6)2J-P?g^.o#+gT>_p[%&Mr"5o!K?oPSg#C:keHbZq*-$4(T8j[&>m,GW&^6]Qe_E-I`6fqT>F(9"gGOC$rfi@g6e*hl^^FY4G\r%^[_2jBcIZ&6#p6D31,<Q":7-1?3SH-3G\1WV:+mIhaRk,<EnZ#4rc*5@g>=1rMI=7n6(r_4I)U]pbND9&ugkDmDj['YElc,d6VQ/\r%BQcMN>+4`L'^23<n[a49K/1,tFO3TTXLASL0Sj%m5G7iS:2^JFP4Jm@7Dj\Q$;u2Q>jEMZ'r7WZ]@K:A.VPe4Ca0>>l_&q='!bsk\r%IsZj\5:tMabCtj\#MH.#gsJitKC408UJftc9h0M/'#u]L@kMe,9,rs>&35&nF$q)W?uY#U-bp%NX[3%Oqe2OYP-tBPZ[X_M:X]Lb\r%`9KgON7FjG]rrOhlRf4[G`,_3r"3$oqL_p<*Z*lQEm/$07'CK==sGcIT+L-,2lI\^nWDl0f;]eMD^s(Y=]VcLU_fL\0:\?iXPThA\r%o>99[j.ob(h2X5WS<og1kT3!&/eqc#N!10X?7MVGdK'B1G0Wa+msEHR84M!;#k_<r0,BaX)RX!;kLKB\?M'Qdf^9__?IPa"=m$Dc\r%TEsBjDZ-OTGhU$GRWr+2S$ambVLa&`rX1>SBaYZZk=paEM#[MAnu1.NEk.fH6DQLU3J0lQ`jX-pGY'BEGDh?>ZW<r*MA0#;04[\u\r%G"cZY!G;"LpLd=Cm;6OE/C[On5>$clmCdqD#^T4M5--&aep(L&[5#J&#<+2!f(7%OQK'3Y%V]eCHT:i%;h5l0I8=^A&\!1$,IEh<\r%&n8Or;ih&V,<:2lS`Mf+?cpcl@8)Se85%6#b;!jdHc^@<;M!jKM?PK/5h6>+dPCX[GRY!)+u]=+RN);AUC/,8+9$-Xok;O.>9[!Y\r%R7dj=OB=1[mA'kgepju22f8rO0WTX/CUXHC`lVm,DVPkm"E$Sj+EpKHIk9CgqO2nT:@FK^l=;sVU#CXP\g9&Na%B,5Q>VOkp<A;_\r%0V$)s[mZgh?P<t4g+>$+(U*99EoNB9q#%qe?TXtMfI\867VCYF-o>=dS.;m2$76mO$S088M42N*$?]e>QH8YNCZ<08]-Rh4d5W&h\r%eh,k3bau%Y9CQc7\p,nJ\"pLF6f=7YDe/`i0]I&Ul'njrJ(XM)f$.;o:!Sm4-,@&p)\5F(Q<_F>:Pj*\R!f5Q^.Zgq=nPEki.pA-\r%.)c*IV;MDBK/BT?p_<-A'-#pnO)EEU;YaC6S3[NklGG.h%/,ma0S&AhBo<!cUD5Uh'3_#qUo0RkTTZMgiJX"Qgp[g^NF]C>/22UO\r%7l3:KhLj?"d2W8`[au+'o=I&RZ*`A18Y@.?mn/kCLZ5=lUHehL]@%r#]*\QAY(BaIG81/bcO1$`n:V8RB\6VLGh`1^I0fAuF.E\n\r%l7n&2^oc&Ng_]l*>sh[q%0#Q,@..at?O+<,0DDQFIDOE`=*\/Q5Z"IE:\)6:bHrpIMg:T^A^dKQ2[KDG/iC8R0/`,iGq(u!qbknW\r%d-m^Rqg+fean*5W^P?0:>r7"kiA.&`=`=2I0n&$lfe$.F"0c[a3"K']4Y-8baa=UmV3,a=gs#N64P21ckJ?,)%mGnT\u@jU_9I?<\r%iNBT3q&]M$Rl0@P\[uan-bkEU_5fi@9#^73jg<C7h6l`Qj$1n3KiArX[:TTdo=VQQI_LTtWT(u=cM+!0P!TL;SaSkp3$IJ$c$YR^\r%FpHQF&![d*Rd\@5-kEUU,2kYoEIL00Dt_)Ra$4rh#rcCd?S6Q%\^0uTTC9Uf`F?\sFu@@7'klC,RI;j5Gb%=<CoQeno[5euk'6a`\r%k#HgfrNamb@Ks"i4(U.2nk62kcprEIYQG"Q6)qpWS)UkpfRk`WFF6k$6PS*Oh+jT!)7/A>]5m9Nc1Dm:F86.sh`K1"-V8leITO2M\r%pU^uf?%d;P+@^89U+7oGTGf0<T=<oPaT\<QT$DjD1'9^m4e2WM/fYd.RVNu=gX@#[Z>N_<%/(l^6(E,AB>Eq(CR>n4YR,87SJiUP\r%ml:M'?sP3+(Cn=J_0ZZC$a?Zs!T%l'>i>Bg3\="pAWU5V?>IR?bOAcY%PMnn,tkGb;+;8"RI([#T?Jd$feR:[eM-Af?q<.dAETEG\r%%^i+76PhR2Dr!r,0\eklQ56O;>HE+?n4no#hc,eMj=4efIAOl^aiZYU)5kT[a][JUP8^[O=gh+/p7)8gG2+gn=oKe)dsme+k;$]'\r%5%PV0R4u]b[SL%\>m2!(bP!C.Rb7gF3Qip%bNK;3L7(_K-QXs^BUEeP`8A9t=hm(7mWdrO+JZ#:hVC6<T(9KqVJ-&eI+OO<:.dpp\r%qd\f34"1n;!l)ITkXF'C#7PCDA_r]DW8mf3VFK20/RH9N!B\!7`2cuIc=-tUnZ8sP=`BOJ-/ZfSX=butMrPg]?%dK)neK2Fh`<4J\r%>"Hd4Q:-p%/qapbmk:M:Y-bMk16YV=KbUCs>=kfDe?M?dq<%UfIc!*k<X6B;ADpEm#0N^3b'bN"Mr$"2_'4BU\XWUW/&16pKrn_P\r%*nAQ0-eRg#%3!%5'Z&!3<g.oPUY9Jo7n[IoJ-9e'X0lJ1J:"\8YI3:`L8RG7[XKHQ<9a-=0ML>tP$CW15l>GrFa:6WXkb'>N:DE4\r%9FQ&n_fDe,B]Rn-DeGf%-@Nqc8)i^IJ)@h"Rlsh[e!k&6(6qHrS@tY`g1d47QFF(2d.T1(?u1VE?Vd@Vfb\m^9D\e*omPICq6Omr\r%4C2p-m%_l<r/iL*4H=*V4OkRU@/$h\\Tp3>,>j\XpEMf4Bbd5I#J\u2XnV!k!9NI#mM*;sU\FHV!WS>*6TR46Tc5`lGOiRqpS'D@\r%\9lf6kq3%1l4&78E?ZotKBVVlmY-j/RJKFofGB`EZ'Y>\FHiA9;gj)Y*5UN(Wo_:k<d1;h[nhK%Ulm9a]NbbEI7r^3,*a'T6.M,)\r%PE0`_Ahd)8Yb5aQ1su22@9unX?I5Ug)QBr%iaoP#D].\k:9)!%<Y?p]BSg%qj7b3tLfBe4*Q=U.ZSb;O$k4iFIJC5(7o!T)ab+QQ\r%*cs3tp$]*iM8R!)7_DRJk:"R?9q6BY*V!=uB.[;KZCe(?]4o0%;N0Ylb*8"MkM_KtO?K[sUX=3Ga%*0a3SkprJkBHtZ,6E#*a^u=\r%<T!%@#AcIm4P^#U2W$As6*83%o(bX;e$[8Ee0FbTB"Hi:V97Cr6`da]Wo6i.Ob@o!.[Xn4<68d7/Gc\WJ`627F>Xhq7YWk-3n:W!\r%e)fYHAi!`89VN6rqOO;J8JT&3gD*mjIpJFINJg\K>f\%-)+5kAlh(P^W,r(Igi>UX0MQ.NB=\f6KctaM*h"^0oTj(X(<81Vb;+<8\r%1WQD"F4-(@il)<eLP9]3:%X`_n<WuO>"*@XI.OuKqG8E/-u-VnqJGGTo`I]o$b5p<T7Jg1farq?m(uU(,&b1X1dY8&o?-9Ao\DKR\r%kVTLf+A^/ng<gEV1X#<:]t!KFD.U@_+neB?OKlVa16drB5<h`&ZC;hFR!i11;BCU98]h^O^>j!de+7+m8XOProFi4FLW]aP9V?n#\r%4b(Sc$B)p\%NF1-a0,J%RcC1sE,q-ca).olhNjM-M&tfmO!W93gn;="?Nde7`7-Z_^Y3Pa3[CKToqrqeTBDeB+dN?2Z@#@9O/h)%\r%rAdBke\uT>2JOMeDo>FCo&Srn(_=H5<]R2;T7j$%+0UqhDtu/rK5g;:<F9q[_ltK6/jj5O-:9#!<@,0]Njb1VZ=DuG4H.(sK`5M?\r%[Sj*qpebO2ABO5*WKkTPaFntj&#=lpaHZF-ed^_C(n!NHWOoV#Hl&YD+?/8QG#K.p(DfZB)Aop$d+r$Sm>!X#+S06<9bNf(YD(:>\r%HX"NuA0P;N"*\j#A9.+W4FrWOFJY7f8S;T-2`jGWd%;;F)4?D3(e%&]HEQA>mcWQ+dSLYP-mBsq9##E`(O6Hb6r)"R"@n6H_nubK\r%9)k"gk(%9%Z%XG9GgN[iW,nZ[$55i`'<S9*6U#>pm;fjnU_9<L>sI`'+'P3r?hV1,Mj2FCh4Y(iVIaq;]oI`Pjsp"-SkGVS-+B&o\r%7=%A.j2l_R-L"h0_R8*W4[hCPZ2Qf0)25+_Dl@A2[Rk[Vp;0OI(N`$LkRP#h%E5BE<HmZtRZe?oXVN]EiD?j66JWYsDeU]%-#%R:\r%\t*W_'!F7%;(B<-&s?/^mP7k$LM!Nq?b4LQF].87U3DhI[.uBD*EB#0#XY"$L35e#%n10<_ltc(Z\pfMR@;]on-*^l$'/bZL<H63\r%6r5`1)DEQUT*,LZm!5l7TXfj0cem;l\,*>AqDGX)*hB#O&S1#tr58(#G(!Q6)ptmcrm^?<\bekk.=[EHeR$mi=GG,\h/=fBh%9Q-\r%Hf)B*\up1("^D0:-IdS5d!MqsOqgl&,nNTl]o`-k1hG^%D.Hj7qn1h>J+g4T64Cr@1l(3A;U=Strm#2P^H62cISUH`q8KW^*Q82$\r%;BE:,j`48*DYI$OFCn;PgOhTf<S_m6"hl;MI\'j\mF4dgbd%iG0ti$B0NZn,bPij(SV!u<]&korc0i4ZZqI`:0)0e&0QI5=eZod3\r%(NfP"jGD<l/K<M@PSS6)Y!ctbQArD@[%j8&P%fFN8)VX9;-[aAr+!^"7`k#6lEq2'A]o5)e_dtq7p)Dt[u[fD#\si]:DKSm(WCbN\r%<*JIP&Nl>lb=@iD!?<*Yc"%R@RB_O2b1Lo^X718b2<4RDORorkqH]>\POuNrHK(`=2ef$PW[pIG'0'j%fhi/n!h)(<bdWdTETtLm\r%bXZKJ;NG;[*ianF][64bQVLJPif)j7A\AQr53oNj_GudV,J*%/W6h]upr]8W!Mbi<(<%FJ[ZSNDJBM)L81b<P=J1Wh$G_;-#of;Y\r%lWmBVH8t^nF%&7`GqR!h?V[Zgde=O7<Y[7A>gR[rKb,kCX""8DGr/uJKQ(YLkCEa(63rptI,;c&L2[H8>DqY8,%2PK(H4[j1k(T)\r%^"RRm>TX7VP*,A%.qkkL^&Ff#9[>e`f]18>%6a&2p9V3WSeMuq2Y<fTd[:QXi7k"aU5qOg0(TeAQQAUj_#+uF@`rkSP^Y(HiV(VR\r%.SM[q)2Z]t_K[0sNH1B8"E:A6!N$Gkm@F!2Zk7*=Xq<ipUtRcUlPb>/\$W5&*KkD<!!aJV9q7^]!][,1l1U,/c?-NXmL08<0W6/D\r%ZD5;p65MfQT^\-'juhOCmQO,lHc*N@3?Qp#fc*57)$S]_Qs]*`ljX%cGUd!a]d`Tp0$<#jUbZ)7^#Ao%I2CV5`):ccekd"LC?_V^\r%NK&>"eY$PpLE9AD/L/.\<Mcj@g+kFrIkY?8r]"8!PT!p]&iTeFca.SIbPAt*.?.s$i<L=DX<VDe]u3e$*,S8A]3-GN9H?%W=(dY-\r%,COTn\TcuZ/NKgM'sFKK=WO[E`hOaXA_?(Hf7=oCDa2g_7fHj./d2mpDUo*pI[NoY/FOZSqI"R$g#-UN^d<'1^$?Q3AX.jP"q$SG\r%)eCcBoJ^DG"SJZUoZ3;]#k8n!fYu+BN4/1DRV.)!C@^t*.kQ[:8.DS=6)OA/,PCr</lKS37^]"df?]!gfq>+(MYk'<RJEJk^9Y6.\r%Rsa?jna9WLpOTqFs!cfk#.aWGh!`G*;/),1^?<8odjn.n#C<R1e8=?M*fQ7S5#nXR:Kb]N``@d^H8h>^?4U@EqC]58Ks8>Uk$7GA\r%OS9;>B'&L[]5P's05k]2E-N3$'9;kcdMq?rUU_->6_ssATW^1o5THJqHS*9PfMt=J:@CQ?NV(-"%Z!mY%u$(DEh[N4WWjM4Ae'X0\r%^OBC,$ou*:d`?Pu4c3#4%oJm6l@;FGs)@!2@,ui/jF=\.kKJhe3:"b[S\am5!HY'Y*L,QSs+#=)ebCPE:5#)Xh>^b/M3dHNH<t]@\r%&$<Da%YEUEcnPs'nM%fd/u0CG/m2%7k%atS-])1X?eOK+rXrD`_d45)emUFm\>OsG1Ki%o^0\C)J@^3gs#*ME^4Z1GAt"^,`PHqN\r%&`kNq')K@7VQ9-SS;ZNa-fYV]h,@d`NUe%A#:rn*6iSUO+s?IUb6:]<$1q_r7hGXs*Kh":Ls4"OCIBfMHBYXDj\\\eR['V&8Y)K.\r%d/D4ucadGq=Yqm\\2;Z?4jUptW5SQdQ:(/lcbbK[\b\.HioZ6:$.b$*efYJS$)HMi]D0$So"JA4DkO_rF[a"0Go5LtH>-RSHke45\r%&#gI(AhmV1$?<qBMZF[LkLmi7\A5OjhDh0KrJ@WhKfn('I!9!>HOiqn\`I?TgNt&Jl'dgLN1@,EP-MiYI*YB,=!%].%4fg"j(.3R\r%WNn:&)P*PD-$repLUh@^m6/gEE<Lj6loc'>:rW\]NpT!V^;&F\_m-nqVWN*S9G&s6JWmc7HOgWS@.<.-hS[5B(jn<Op[F7]I"\'E\r%Hf,oiQbeGeHOl76BQ!=uf\U-0m$eo@34ARCH[I.E+-,_On9lJ)>cZq%g3\>sOX,"mRCri/`uJVLP;Z$`Vdr$0H/%0X%B9mZoIpCP\r%+-,_O8@q"0lojRp-5\UC<4N<QJ8gH9cqJVX<N2YoH5J"IcD:.TL)E?NK+H#r*mh7GC%1*6h?2S^.i+:+@4eKe/bII>XtXDVc'I]Z\r%4Nsr5Ek`W=D!uqhMj;Y$S+[m/nWDOF33`.m=_YJV4ri=(TK:auBX:E[%lguRC%1*6h?3KMSH^0rm60C'GILe=;gT$W/U&+\R+QbM\r%o*kbJ%hD$8n6s;mUCW,EL!';PFtTi\i3W`T\4X,O<uLh"`sRG0Zn_@pbM1W]("S?@.RuF]^?TjnhW$O*.u[8`8Q1n8YAmD0llu.c\r%,jtC)GBe=:KN6kLVl3(SL@*W:\<U9HoZR)\6>X=+2nZS\>E-1KckfY*__%B;0o&_[7g)Q46p4'e\HGb#9[n\oBT>s`9U$Z"7>=bY\r%nPSsQe:Ua#$Q:N4em02p==Sba.[N'5dIA90<6[>icV8'PC97Eb=T,;*g7bc,G-Si>TCg%KckenQa^a?^_2r3I",K7Q1;&LZDAqOF\r%/P$R$eofnAcF!cBW0WM>GtgOc,Tn+"Z)21]lfk3Uc[.gqHds%6EP0n)8HI\WHUU)_PeOsu_IB7YJ"q^h]4m&pAIgTNci>*?Td>s<\r%34+n6Un"BZ"Qt.FSJ8%q9"sKHLN&A>o=_i4G7g(t(RIDkQbhi(G2V=@;)4`.WuUsma/(_>ad'6WKFEDGO[$T:+B@bjGaM/L[Ce.%\r%nsA[dr3SUY4^@qjU*#.tkSG&Eg$@V>T8oR%-Wc2'*t'0s!a9X$'CUe0gX@ZNQUQVJaorUd7=q\[+fW!T)nANT8?F31^C,V'KI(C?\r%S7qE(gf,onGJ&RH#*E^m#!%\e%[pm"O;%V*X-lkKX.:gZPqdt]Lnc(V6>:sb(r<(WoX(J31A7Z@WUAeoZ%jBY-Hj4j&G"QJUsOM5\r%J(+_;P&]4]?9O=QD5.PDnTe)V%@hdaYD#EK4>*h+o??m8F?lAIA,]jg*3E&p9bdl8\ghaTk,D>QJq*:Bb&sbX]BW[L^DU(5S(dCX\r%`m$/_>p.;N\A7-Abd#2/#p8WNbN"WDW-hZ29@+t^#@I<i=J@Kdguap!GLFn+LA"J5YU;Pg1ujm0e!!PhD_Z3n:Z3LqC6uYp?5Xl)\r%f\2:F2aB-P(QlscGr:`i832O2Ag&c</=V$$]E`[?EhHscl1Z^-a#k/e1e:)0QZFhB)1D$]7.;8aU2g)MrXX-?"aE<Dc3t?=1)m4K\r%i!Qo8&W8e8"EJ0:(P>HgO6kj\*9XJS^<e-OH26Uf^XEnOpcFAL]0M-c)(d,LNWQnA)>!qMnd$k6[YC-AC+k)*NOl7,JbigA3;oG4\r%Ed2^VC/f$J27*Ae=s8]qqIR++lt<e@KqHfq67$]s@*J/bSI`"c+3pWq6Q8;V=-Tkc0EDkh(m.<k]0n:ZN18Qab*,#8X%k8']m\nK\r%GaUW<U;^E^H:YE>LhM195i2cB@fj/Kh2!t>:M[#*0kj'<>G(1X`\FS73f04Zma,adghB*f0B?FQKjhpHE5JhsK;t!$iImo\KSQgK\r%3&)*Ua/i)H[GSrKQC(urZ^WDfZ2i*_$F@GH9J`V7_'?g7K-u-JI%MSoJ8Goa/4dRbmf%))(jOlH&A-.UI@[Yp!(.u#fl]V;MR]ZT\r%X/.rcQmDd#__YC]!>p&Kkt&T>K<lR20M;I$D5&kl"O'c="Hk':%@=qk&pPmC8\ck`^g+^s>C]W_,83Ya/.'*S7M7CJ8Ys&eWQ.>X\r%5k$0<)['Vs^jc!@,t*uG1[OMMGR2UkBHj0c,kgjB/qYd3Pn*pM:Pi+#Q6BlNfH$2CYnZdUKC3G5%h<S.lqN(s>[,n)gcTeILT3Ol\r%l>gKrOA62N:9FCN)i;=b8c:#9fh[@bBkX8$2ZkctKEEFCEkGIHV%MdE=4"]V:=2Qm:WFPZKLI(lR3'/!4E`\Xa^NUe+GTfOlK\a!\r%#(!H[0D"?E_L@PWE7\l8&/2f#eZd:d)M+:L&E1s11>$d>>js=D`E!elP@Fr/JBr0#APNWO-oo!/JJ]OR=64#MqX[J:q81#d"uK8#\r%^=]M@DWnQ?obQ9#>gmW5l7ML$G"]Rre*:nCm#lfjAn7lg'e&CWjL5q&Ot6A\q=t]\`?"oCXPSQ8$b,b4EWZ^<PqM=1_NK3QC.l&.\r%>I&P_4dE27[q$b!SFu5R^EjQ_PWa$?qCT60-b@ZlOU[4Oa)*gr;05IG,uY7]Nk)"DP3YNOqp+k=BM_Dr>H#TtdVm6,6Sr8Tl*o`7\r%jDe&3,pR)J.c&Nka]QaHU4,b7'R!9e,o:L8[rb9XV:(:4VVdQe>G?=s/,Ci#]d<CIr_k>+$i7!]Vf4Kb>I&P_P`K_H[q)l].(S-]\r%DopU`RI$5g93,sse`W6I9;V]>1RMDC/QodK@GK=Mabq#rK"@f9P"CE7M;-ErQ("#uR0=l(NdaW%DkRba9tr!T\"NW\Q@;J-Don##\r%o^uF/ZOuXZ0'TiUC*T5s\u";IWJuLVK0/o]),aUVd<&cQ!DfOrqCNR_M:mLQoNPli80thJ];"2G+dLnE5:ui">k$\40:2<818Me2\r%@>002]W8cUT\iZ-(Us$@18KL3Y?UiT\_;d+"1Ro,#!O;soio&6T'>IJA4Yg%;86\a=2D=oCI_HjP((Tf*hQ?F-'&M*?+?`gP3J!Y\r%lId3VQE8pE]pPbU\tQ7`P1<bDk=Ot8/bs]6`]a9dXPUfrbU*4RXPQ;4igP<H/?-,Jl)78O/Qoaj*(@@/>=r6+\+Ems5;J<%=2:A'\r%at\tjcc0tK+5U!SWPQ-#f@H^9?Y"Ziq-mR3_jS?/T+Y<nlF[HpIHRl$Vjj!Vp-U'LF8K'"4$WUV9HH5(gfu"^(hVOMcN_!4a,ecq\r%bq@3p\Zq*-UUJO83S)npUH:nK'%Ru%Z.9([5P-jRSjbDG#BIee^<gP#(P'GSIaNZE(>?*a@)n9I</b,-ksZ?I4Klr_N$bJ?4<b3/\r%MRUc@kr(EHPM4JK<0er*F8QZLh_,+6N@o0?cYAN%5@3T%-&i7dGqaC?g2C[0+ZjqmX\]%aIZPXLr)WLfe]5&9[/N7a-*`Sos3/C=\r%V^-P5qg"4P-*RCKWS_%eH0N@07S]H-e38DnIoh%]4:R((MsI#_Z-:;"`L3/i3O*:q0PaBTs!dALQ1rURl>CW4\*R3#/4MY)9Wu5E\r%AhqWL1;1=UoNem=bPEoo#u`8-jf@Y'j7l"/[`gZ/r_;r`s%*To&Uh@XE3#<n0tU,VA9o*e>kqr'-?dpY.D'DO%m6]T1=E>(Zg9G-\r%\I=IbH$7kK^Jb8*nW@7'fqp,ql5MoSjJdX/pVSQ1?rT0ST:."Ks5OS4oMueAhDAR!d=%])>D?1GBEuWDBRtM5L"LQ/hVq1<-7Pks\r%V)sKg[?ZM3Cn^O$o.?.uPC(R-8M_&SZNtT!<O_MHj%u%'WPhO:c&HM&%Qi1Q-,qQ56WG`ujZD3KYq9jlkb7;"M@,3pL)[_I'=->O\r%XWj;G=+;7R[X*fm-#NqBd-P,`)lG!%1ZX::(lAqbbrqE2PgOn&Lf5X-bjo%&DQ(KLVO!.;`sq\qb$;<;CdshN[b"upeYDaUqR?5&\r%qgqr8m)^QQGR?sg&k('4EDp/QdFj`\HFQ^ngtCH6)DfGhca(F5c'W/!9(t"D1!c6f>)l[0GUa6B';CENWVY"A+7tp35LIVl,oTr]\r%r;6TTB?'7UqqL8Oc]-tl&.Q<3@Sk1l"V%6#%;l;4Y?J(<5sOL:RAfA[lZKZ%QlRV<0?<32VZ&900T*Ias66\eO6r-[3R<ao8XX3@\r%_jft`YV:2\V'4^iKUI^`[62>'^hoFXA5[itof/'t$sjhZFL/(D&Vpb!fO%#BP-nQXB7>l,hU7l+8.diH#e5/TU\S[dMBqH5O>K6*\r%D4+Hl*_L*=(Md%L#>&1q"%Lj3>A_*+[UOD?:%ls#5%`j2X&M"6bC1L:mkf;,3bZ\VCY?cC-5=6EZ'L0=K=9S.l6OQ0p+UU8Q9!Oe\r%0M[e*8ae)H0aC:tV!LY!]b2Y\K3i@]g)FDW+?(.Bj'93D<3<mQMSHGKJ1+_a=O-D9KN%2@4DiMZ9IIRe$Ds]_UD"Rl:.sB4YCb7b\r%ju73g'<,cL2t]"Ci2.R%gXQ+G684'5(1b[]Smi41(Q04Z"r8LfkV`=C[sR9eSB]&+5$8Z!7rpuR+cE@^@oV&3d(_1\dgUFsR''#C\r%g85q?XkV7jhFu%&]GY0CU<5e%jjLZ4br,9>MOR?96#9O`m/Y@>q.f9nR#U_[!B6UFR>`9M\,n(XY2/p?>u>Z+[";U["haj`Pdu%P\r%pZG1,2!CbZXS2u-Xp//KFL8a]-;)WoXRk!77ffE7cnI!b5Sn_[f#_?a;qQbf)0^,Rj:jM;F$A\*2VA:&XN+:#CmPgY"Nqh(#+R?D\r%TJk<C\bN[5ID%*MPCp6%mm)'3elU51.AC5imKmYFZkQp*Dg*h]kPg$E<]c3.bGik0`VgUH3f\1(1N.M`fF_XkHaV!;(5%mY5N=,C\r%/7<V@9(@],\P_*2Tb3Wf59nrZoqd-,Zm".T)Eh"bDq2!26K]s+MH&C)pl0:K5r$^r.npZ8k&("u"^A]=TFi@?BU%gS'n;1J7jB.J\r%-(_8!"[MF:;=0GcFlF7oi!pXY`FP#Cissc/2^nK`S88'?eNF:_(%%*XBF3<ni[?/!s#W2t\O=;GNhZ6:r_IJI@9Cbd==M>Qpdus[\r%j5VmS5IhmbZop#s'4kJo<^"'/DMSZ]n?mFtRAa$9\].=-d3<6;ggVVQgUH+njpj205VYZXR4*\f88#0U2j,(!-HnlgCBUOucC'Nc\r%"6cq]K!oiIW7QR,S,m%kn`BDB<8Kj4h$r\K&9!:\8-W)S45<>>n.n.qGPtb5Bpah,O[t8.^GT2n^5qt!Hs3>VHMat%*BVWZR7JG+\r%E)btOLL+(F-iM\tFjo#;6R?YJ_1ZoL`GOHU>.ZRuO]Z7_VtlR46%<q[IZ2_sUi@ao":A-S->8EPIXc)fkdSB4"K2=e%U3=L)_*so\r%$nX^-3$%Clr:$)a);9#pi207l5"M2Dg;t"-.:N6pS)#%3hMmV&95Ng0e'8u*(X;3K$e?5*3jp?L6L/NCJqfW1YE8GW,SSu4a2Kf-\r%mT+T3*EugP_d^p'WF+W:;AVa)#6J-ih2C\#:pOsDN2Uu-&5%?KqJH1SWt3WpXOV[25?DOq"6d;R54\+;XGeZA-l:IBH[kH)6/DH%\r%RWAA28/9,TP0hLhqe]oEH`Wlg_^4]2r5he*F*H-DrLP"uQ&As@P'9OA/=2R_fPX2"nYDL7'i#pW$_n"LL(_Xp;'BOoP$8Y^oB7O/\r%.b$C,7"]6'PR7_O(9@j[)ANVU(RgVu?JQ&s"E"fhj?=%H*[J3E[+VAI3;1?>0e,S,Z5'E,3hBXLPV=S^67L$tDG<f8<9RaK/_9p<\r%B%qs2klGj!VsSJObp9eZ.O"%Y\!(62Vq16>:Sm=dIO3o3^B3M9>_Vqe4L5Oo]'DI.N1"$PmWP8]3Idrkp=h<CMg1fo/$9nB@%RVS\r%5HNt/IK(51fP80%#O%K/o)7$[MqGV8hY"[X?0@)+D@pRL*fRn8]u'[4[lLS8@<^P,#lVRkRmUCo^H(Tg0W[i&i..LA\L2I68/P`(\r%%9>H>f5%Y>2*"/_=`&4tC3!X3^;;<YS^10poMYG[lKJ[i1Q9$+elNgiXm6El%S#;g3]_g6F6L)1i/_"q6+:QZY"=o7AV+gQ!e#`6\r%+ES:rEPF[UTE7If%qE]ah#aNO>+c8d@tpXC(fi$(Eu=V%p'p20eX.n=#s'MC0t[=pKe,,n/C5+h1I7(G0,H'?aC8)f!a[fT65K5B\r%rf81[4O<ta/H/'RruqjIaJ/0<W=<:8$"9'Z]RLQN4["I>^mRkVej5FqA_Au5'@4]mgCQJK0AYc8s5<`A6]G"]c]u"45j1TU'OGff\r%Wd2B;\Ap^=)Me'tq=/+6"175U7mIUUo6tSIidFrFd)[:#/?[?k`5VH>hk6$sZf[XX9OQb8IB##'-B@?gff6E41`KnEP,e$76JbD*\r%?$mY4CC5PG@7oE3h:<>61blLMomFYYe(6aio(1+CUiS8HXVPgW2Y("o=E7*%2).^13*0R]6l/RaA"P[$P+jF<p-m^j?(Uq<YB7l@\r%?#H6!QcGbI;H]TmL?7&Kg8MCSfOO\@m[a>[6-j#7j=>`ZFP\qq['5/AH#TeW:'WsVXig5R0*ZC8Lh^6FGc)@L(S/Pi>4*e%)rdL1\r%5V<ZJ:!\Ind&[-5%9L5P3s761?k,7"=p-MeSei^".U)C2-\Z/oARcsWl@<BJcN_>7%%\9KHn$-Q"FVR)2^X@Loe9pP0%Iq"/-cS*\r%+11JUo$B3,a8o0@rg7QGJNS2QA-n>9nAf?J%W"9XAg/'&6d]qiO;Ht$5S6aZ0\@KS@51\m>8pi6apKMoLR[H6?]G$`Ys`=n],3]S\r%!CHj_Il:&+"LCIT:.YTKTkQMp=D6`CT9eShTa4-Sn%1-&;6XqC'Yt&K'j[#BI1a]7pgr8**7ln@-K2Qa:l/K5%,i@8N@;?^'Di:'\r%\IR8?.TQ4]Ymg4&n*`'>a]oj$m-V$fSU`9j!hSl^j=3-?>T1D31P<Ym9SYLV7L5hr#NN?YRQu#@Z.kh)Z%#2*\%;p=Z>>AW1'bJY\r%G)+GFjEKdYgE#dI2h#u=\_Z4e9_>rlj)ug-F4opj]o1rqkFUG!17?*-\%C'"@57-3gs#-"N)1h5\8m;,#&IMED?JH%O"rEp:#]@&\r%Q.D+REK[Nk-@TC(R8T4&s6.]YiKqr)Ct3n?8i,91IS!mC`%S-KdDR]lam`*b(EBGRF;)E*:&Ftjn]NWqC2=-(l(F=%U'E'U)/dak\r%9hVER2nRW]l+VMt[:Co71o:(E1K)>jq\ZZ\I5.(aq\ZY)^X?-H4rurin[U((QSO;=UQuPIrG`Hd,e2*'6nOOj>6J4qmokqq66)[7\r%]2,9grk3\I5cW4#X)ig?6S3gkXq53%GX9Rd*2YZpQbY9,6"UfoWI?[1LN9AGVVIQfBmUg=a=c>\Z76s`@N&N9BM-nmgFQc[!I[C.\r%.+@*Ij(q#^.+(uT_t=SHY]iO;b?(b85sUX5Z&s+r0q.:-KIibsLQGmfabF0LFo:%IDRW0i/(tITP-R'Vj+hf5&';\F*SPa7UY?C4\r%=jtA`XIGdGGS4k@1`a:#L0p!:]TN&)b8YjOh.+0fLQNHimd\gcebGH:1KD.-<.2Tp+Y!rQ/bf$TJ6uOb'c9gK(:2R+Z,9WF:In2Y\r%7%^Z[),tC![>d80<<()M!fD@_K=apIYD1AfLen5]hpXLZC/ULW)2ce"U342=LJ^TT?/quZl9\DM3TI.dq-Em3H[I\q(Ul6b.]4MH\r%)K_-O$I\$P!?Xt=a$U,[SFP,TJ'5pbdQP;_S6b>N=fLuBE"/R;KlM[IL/e?8$%c\G8=crm4#(B_&Wa%0QaM&k^dN#tdD-jDTkrS"\r%Ej9Z)j<0VkannFfDeK-jqp4.,?sLYqplP)WJf:Ma_2)AcpHU0k#1G,XRn_$3oW.O!"bYsghlfakWFu*^i'7WDaeL=%o(FhC@,S0:\r%A/C;fAb^4I!dK93IbRrRLDNlr&Kur'WN=Fdr>.bnT18<Z=Q_1N(V+C:^5;4nJa"!#@h*@j#Y`!$^82Lt0-/NF$Os=kFj-QH(BLbf\r%iYNQB?Ne.KiKlgop"CAGg\]jC?#8I_pcLWjJ,AjB)h6`&h^72frqP:gNm)n?D_(J7QQJk.#I?JYaE&n`*QUdZ/C2_@DsRTgg@%@l\r%2(!jE;U0d%=o#DA^ch$FFfo%C7;0;eTt@Mg(Im.2bepZIbW6tE=T#tge`mr@Im<Te.)8\*l_,/NcDWt)SdPO3he;cbKM>_Pi-am<\r%SosB%@-dppUT!OmC.uMn>)"Jr>%t3g$nT:QBtm9h0QjI2G"4u4C)LX0jij`9R"mCQ%AS_54jI;?$/lfhq_\5Ubq6g9\!%h_c*:iI\r%a4N4B^%m/N)JrU8lB=t:T8>`m6#03gZE?,&/`sad#)R/aNRVk"iesXKS).G5UI`a!+l[pDeO7^e!+BCf4okHAa8<8,n%UjJU'd3D\r%%tOJ_pFp]:!)2fflRW0`s.dqO>N<LB!d<$Bd$CiP.Na0f)I![db=hk!=9"hg[`sl^4Mo]G?[rc6ph^GQ39]CS-iF_tWi%E!M`lK>\r%-#soN-!S/SffBfne`p@i#H5rj810-q]EI\T-AJd"10SIIBMpI-=2N4G'D1?.aO-#+dg4?6C:o&qE/JD;&H_`[7[oCA\(Z',Q28V=\r%(%q+FklL:)q*(fe0OedMOr\G3D[UfHX%,Cdm'<-Q_f"ul[Rq7\P[+%PCuQbBXJ]WnCl"E?$q6ZHD7h\g=(FOXg*@&!-JL/DE]]U]\r%V0%KK5N^Vo9].?+igj]$G;Q9pRX\)U^!'upED[XW_[[ACZ@9j33)K)E;hHJV#!5TG"imQE:1PNEL(U7$+*ah0V&*Q?8EhRL_PUbo\r%0OAO=(Qf(SUID,Qd.8I4:VgrF,a3+'.jq_R2S"KA:q#6ZR:h4$E3u5t_Y5_R]"%?A3ZrUK'Biu7ZN[,@<S,2aYjaDulESl8SqRoQ\r%"qT'E=pjOlN.-GJV*R<QY:[1!-&"L&8u@_BRHe6>Rm(:o7#cfEs%DoiIbtidM(ABTg2DlCE.r#4lF]5UcBmPBS#kfD\@cS%1Y:5V\r%d?=KiWR9&44&>TP58`D$orTppih3^a(ce8XU5p=dBAEEZf*+KdNXIu+`glP&4:GXc_@[<:19NGnp=A.o,%kQS+:V4(Bt-EE(%KZN\r%PfSNXgk=P'A:g"u&O6]LiJ=HZLcX#,r2g=c6r)9+ZAppagnTEh\pSJ_#33jQ3r<MClXk4R$I>*N<FFR7i]_F,-(NP+M&1-*#ljCC\r%ER0WrY;`8\_fH6,G[KU0+dC72JqJ5)50&Vd5F(LB(:_A61Kd/eGfCe".V%Al/P_\e]^;j.e3@@XrGaFGX8O#@@SFo]fm:$lC+\(R\r%9%2Y];i0q8I/b=&Z7?XK-N4-.loL5ZVG@E1bAY7YV(\,Y?&X+lBQriZC^-,A-f?[:Lcmm(.aVm&CcRHfe?Za%d2VB'!Z9PuCp"$=\r%0,Cai'>=d-C8]o$gFbuXgGT0$-88FDbm%O#qCK-C*Q+r](bo*k@rc1=S('0pJ$Llq=SVQ&#UH[0*_?cB">8>qC&00lKN*(h?q^oP\r%6,M`H7bF>[G\oSNZ6;6W'"mJ;?AF75R@dCUiN1>J.@E0oniJK=8]&7@QCm(trC?WZ_P3^GFWjJ%6$#^Z_-WJFeoP+f;dJm-Bfjom\r%SR)b;mGcsZ)M4A1,7NZ;;4&8c6TqkDjfToGE$!$b+&3jNG,k<NVTrQG/PTG:ldC1Cf^d_R;Z!uI6cJV!4+1)1*W_0rZ@"QHomlK'\r%HZFX[^4+_J<Y*DbmA".FR*C`Tk$_pNQfuiP[U%1;Li.H6c1)\'#W:>@<NBJ9>G'RoW_;6LCm<&66?_bh:Q)YM>Bj@Vm=IcrS#U*g\r%_OJ]#L`Rtq+A=apE5A8C6[1uU`=7_`%H5Q7?d-lk9ga03cKla\B\S'.c7SI=!(q:Jr)kh(`$Epdn],'YUQ4dIBfCH*=mpt<o@?j>\r%2LjjuX/kCa]8RMc%*bE\A1`KaD.*@5,bVM]o([Big=E+'Z+jJ[Hd[\+?%MXg1]mGN"<XM#A$1.RSjaa-?NMM0T@UlU@#tV,MA^+T\r%^h<BVor]Z%[cmda`uDaU5A7:'nP9htL5"Zg#4KmITioh]Jt$*RH87q]P.MpMS5q_=YHJ1X2S=$>i'YCh9h^o&33:O$=#4ofQLFYL\r%O,h[8E1B,#0$/*iV5D(4ia1jdD4+lcKIa$p/[8E,ab9;jQDCj+LpkO4(3VU5J@<\,(2+@pTIk5dKt[p0Zm>aK5C-E>p.@D[l]26e\r%R:@hIa%4UDAcc+kf+D8V.1tkW//UkKYa1AU9S6HFI8lG59?3m^(>>M?9s?6"P*:hYg)<FsU+LGf7?gtNe-[qJ>0u0)J[UA_'c`pL\r%J&#,o$Z##'.bI!jk#dO:;VnR'lCim>bd!I?%^.1ceXR9Um;0/(F=;=Q%tOj&akep5"?RXEBc7[I%G$^@/gq(FhV$OrT.P'!a_;)l\r%/W=&DBWDNl"?@ICaj"/h]OP^Ym+?L51?QHI;X=Z(/_M\elniagES8@?9^,3L[4Tkj_E#-#%Mu:mbpGXYG&_TXoItZ,SB>Sog3@6*\r%<^ArF$JRa]s0GrinW"!;D:FQHs)BYrF["G"PQjQpUNoo*cRHH*_-X+!'8ToD"IGEH[!#Lgq3K&.>_TUg?XnBYqHQTt?gUM:"l,WC\r%Rn6u[8rTj#o2'eUI.*hNG4:ZpI!gp+Rt&'DQd6-lpPl+1HFkVRPuKjV@n=TqT]0\Gge"GhS'rE!1*./[hB1rI(H`+001Ig#goTn=\r%QYtT[HadF(j+]V+%=9>XOG'X[9ri/NlC2;A"t.`<Tu1[,#,f&"AN)R^NsKTe/JT?4nQi6,=l8,^P*UJ8E+d+@S$b/]f?=\!p4Dli\r%m^^._?(9VhZUTRn+Hpck?KmoJotS4[s8'SQT<VP#'4:`I)h3co?!k*foW?<]hXWakFpWTUqDU:GRf3jmSVueKb?+WY_uHYg>bM)p\r%TD+':Hn1n/qCqh3mL(E"^K5n)cuKf%dsE('6eB@<1gKDU2o@OmBTCVmV`Bk%A2*+@PAWu?gXO->dS1frna<,J?s>R^IG@+TTW(cN\r%/)OtgXqBriJhj0VgJM56nZC-fb6YQp\$n\LKRJa&1-@5#2g!a,0Z/UWP;>$_.gZImlEX8o-c<C4O6B?:ItrF9r9RNEel95Jm\Lhq\r%A.N+RCAN:erUK<hQ=EX_TXu]5#9:6k$VBjGQeCUW=*&1Cr/@#1/g79(5C"Hi).DCD2V5Fel:\h(BqRi<e.0.[$g]*p9F/ip'qN\m\r%RBU0r-A4d>D7^!if(&GF!$7pEaFp)pEU%.BH3@bFYu7<5f)VADJN#[te@jh)]psk/>h+Zi)Y;j"i_q:pd:'a8"b-_tG6VVq.Jp!)\r%VYZCCdG^AJTg-G41HJK>)TAUP1o#\LbTK+"gl+ukW&r5en;*L"-9t%AhAonMf%kNW@R/1HbL/H.I=BM(Jf%KhPRtcH7Zi4rk@&&u\r%NV&6P4k0?u@AOiIjp2bBE7S[O2kjqS-g&*'mM;5bMVqd=\f9j6E4@\j!Gtt4R;p9+%T5)rFGnAh;`tP[DNQ5WQgJ[QH*7M+K0-Y5\r%W$Z\&7d"1gj&6E2kh;0Ol=u.Cl0ho0<0QLMTus]Z7V@FIX9qa_pHW<\d!tDLLm*F\%h,R=OHAe3-P1<'rs7V[lZF>0@sZqS8;5;u\r%C6F^JDtLifXhcV2_abW=&V<04`HX'5Bdk:WeeO0#;J0fV4K\1>7S+sPFYH4-j0B/:_1+7='cF!Q`R"S))6'PS:39\f\]:Q,XqDX-\r%S[9Hl=Zm[1lg9'tbd2AJAFLS6jtp_(A@AKG=-/C)eu35_9o*>%a_r*)@?ND+K`#H-*Ml2RdnnqPfk$fR``HYC&l1O7-+Q9i$ZG?<\r%>Tgf7iK#u#0efQq>ti@Y<'Uk\an.!"L*4L1s-QLl,@P+a5n)VhBMmUp5n#qWTLF,^gpo_e9o\^UGYc:rK$,8@T.&-^]GV@=YZml6\r%b1g&Y*PYs*EdVT6G=^bI`!YVNORQl4'l]*%Q7BfpDTYNqGu5B.$O]aA0'9!r`hQ=Sg[LC=Cs'&Arb7AdIp[,^>;u+cD6A?Q/R(g,\r%;-XVo<%V?PfD_o2XZ"i*@HLOQ`WP@A$'6!sGN!.X^,QS6Cm.7_gp=5Rkp^I)Ei,a[U*k9\WFU=D6Nr=Gi[!!ZfQkOp;Tnsc+FgrI\r%bYQuWeAKh_-2MU%aB"@ZW4#C4hEKhoikEM^T4d<noW.,$E_qZYr7A1&8@(N>8hR5KEBftgBRh5pPDM^g#*PM6ji5-6rJl..YsBWS\r%Oq$3^+[fo#k)+_Zi1@'TE3j?<<ZE^*%G>&,Ss%bTX4^hYHg;M9E7ES.MQQlNYA::\Qi6M#oDb!NrOXS)f'5tJ.!lWj6\-BLM`RSm\r%%jCVs0q:W0@Vo5r)`_be*cSD&P@_CIp5tfZ#AI\O0njOLkNCm!3UcthKM,Q)/[%aoktrO`Lr-FA*:+0.K^+KYQ7];tC_X?`gd(bF\r%mGg[j`D,Z?[(E'>j5T302El$9Y>@g_bRfnR(H4^".&nn;OS`Y=n]QNB)l,5l0\a&#ioXZ?4(qBb9,l2c[>u8D(H40[;@UFd3^-O6\r%0L"?D#>oa).t^`XX'T+l/>7,*c,fl,aN`T$9sN3>7h3IQ:GQ4F(diD;ZQQ:tHs(BP.+<\<EdMsf8pXoF8#>e?M2qB@kE(ID(-02J\r%YTl5RY.b1:6Mn3OVK4Jj]SRSf(I%#s71\9rIudm,N&0BZS\Q;tTLV"/IgA.,De'r)FZ@32Yh7AB9WJi$V=j&i$QoX9XRFX%\%d8p\r%nF\+S,8G<-G%-_GZI#Ze;s1'PX%GM353IObB$n]BpejI"_o+8i"lOYAIi.'CfQOfVIG2!rpiO(C1m?q]NKXk9D5q%dZ[mP4)S[PB\r%k0@2kX0GZ2^b727l4@=bJl<^0]]IKjIAiStO/<@<iClI@0D>$gq>A(jAW@/Tof<XSgD%/C2D!h2\gh1?JBbe8BibI":tb9;Lg:`p\r%8""R$:sHat3[:b:BBrJZDCc`U3N]#GjcLd17e#XA9#hmeMDIRui.jbd-[!WDK<oP6i^u*+0XU;\&QbtmZPU%"d#2"/0]3`Gin;\(\r%>OhCelX7Yq^of8/-;3iX?e)Vo0bJo6?0:Zp;1&0,>f^amFfkD+=H@k(Xm=*g\b_cO:Li"-9]GLDeM-[IqT</l9!VlVpNQ*ep3S#[\r%cY$Qk4n\482oeLnJ!o`@4TCKce[b<S*2=BkYSJ!iYX/m?.KFgK'b/^c$HAW?i=\5YUi8%U4L$\Bb)?FVMg7An4B:SlQ0M5aA9T.B\r%3K3^qVIc5gV0^XqD(UgWF\&BK1"WnehY.=PquqKVYbCD3>`N5h=];JNLMMPqH?aXfb^,k!3mNjBkK8^a:7#HT[>CO,F=j<`belEf\r%[?0B(34H8uCEZ]cGT>pNoNdIK4H4OWpkVl]o'n2YbZ'6>K="u9\eYoY9CX<fp.?^D(/e-?HM/Xj$Z(ZBW,"o1gPOk7DdV+*=dLDk\r%_5i>F2nrITH!`JF.@XfS?-D91*(#Nh\$nlHZ0`jd0k5Q]^KR\(#E+59R[]T%/)S#UBL^oLOBY`R\t\'S$m")oB3bDrXVUAcR^I"@\r%=/-L7?(k_QRB34kfNu01gC10`/SRk.5pWI'jD8qdBH(EUC<Ra+@o[A;>Cu0O1NgfGXg3_O&*<0(prQF&]_lF#$+Yr>NTB7/%6H$;\r%)<$%E0D0sqNNrgb*cXh3&6tpbTQYkiqiV@0iPoR.)C+eM\$YA^lCDMF>l@8GfM<`Nn`#amb;tW%./At[]/htWEn_g&n1/,jZ&AHG\r%F]"=EfJ\I2OT/bpS=F8QWQh-Y[a)`F3$Ef!OMr(c'\LKoNRI>kdrS7T0_TnCdT/K1%q*=D/\bci$%::P2oik3>$oN_Ftnp)0at0q\r%s"SY#k:.CC6QO(_1%\afqkfoR8Nj'g.*2O59_2!Y#P9Zo:j;23m.mOC*?&kHQEH=j2T]=oP/p=s5)T-Z6es[qO$j0hRBCIs*f8*n\r%Pmn<JW>r6;?Ri'O+qoY'f-?b11-"SuOHA,]`\a>$J4'7=;ZCU+6j@B9iW`3S`[6NNB+<LO-7tOiCuj`V8MKNpFsUO^^lH4uYR4HC\r%&O-iG]B_0g_7d10,(A/p\\Kj5eUBlhon(L0E%gHq`^X^\1+K?nFB&-s&Xqm\/T/"5-FH0eq2C>@o,"\?JED1A^5uYu?b0V3!,+^&\r%Ma^8Wkru`Gpc<6Pb6M`amRm68rk=lMI138@N)StiK)f-_.S^eVqkBO3\o^/aZIaYrpW=F]*d56E$AWe8MDBUt-4KC-WQFdT9'LEI\r%Lq28n_)%Jbkr<CoGSo4j0l=e/^&I3([+@P$]&ZSQk#2hnT]`E+itJ@kpbSLJTQU/ZW(bLDT-h,_=\q['Q(a9`rJ,]fW&u7jVD)_Q\r%ke2L$#h)3'<Yk?&ge&6F=_OHFE[sj`/kL'_Kk?e;]cIOjcGn[4':#V3kU*g)-7XKj%j`88!Dgh61f6=C,3rs;EqOtUq_"_%CA3.#\r%dR<11>-Sui,u%@a&qu@2>A9i&RpqE;Xu'"Y*ke\[&b_6_PKH9N9pG.H<8BhmR(Os@r^LC*,1mF-IrLi)kW2V?!bZsJ^Rt3R+IDW0\r%Os[3Y=@)dr5IT:lf'qF3AUgjE'd."oXJC\fYD;"hjGF.UU8@#cYep6_Bqjh=.l>2i]2k>@Is-!?IuHc5<7:RW8"ZeibP(!S=]Qm4\r%mLPJU9(.Yl'98dF5O\uoZ27eIO.\lf[,DeA#j(7e%EGU+0$QrM-\'Nr)j"5(plP6<fr+t\oJWpWDA5%\oemWt'Bj:tCg6Z+2I$)6\r%B6p&qD5*HOIi6f2(Xjncs0XfnK/s."_Xk%9SGRQCZr$1_lq)\MAQ\QIH5!9upK9LE6Win&"P.kU&2obJb>*GN"jK,ce$9XZAITF(\r%F]pstC[s;5CM'XuB!;?R:c!1f_bEVPBtes-#cO1P-Ai\J2Z[2CErIX@Acu_t2G=E6,1^1[5"Iu+;WdI0L+-$b51Ytd^kSQf;[bsL\r%ge1P\PUEh+^GN(1'LRs+g_]#>C'gaSJeV=Nl/k(mJJ@^Eh\`6+TGES[`A/Kh,"s`h^o2j-_dlkJ%XAnK0Z=U!5dDXmQpS>nAQ:;A\r%@48u,_sQ3r:kU9P+N;5pKIM3i"dj=QoMj7k.>H;Ap?_(:5QTTsJqm[E0Z=U!Lq07%@#F2IWOd`KdW\pSAlE&ZQ`o'.VZ;Im+GYf$\r%U&$\?Bo#R'hCB1)#rHs?,dP67[MnfhW%>L(C%)F:j:RmDr<'P43C5I7U>GQ.R:;1Qm\9+D"8gm)+d$mnYDfPCM%%pE,iTSp,Vn<L\r%>HfNa8Kn985%YtL8g;/cYWFCnc_/8)&PgH9pJf'lVbEXnUA.*RS2+(O-88E$jC":Z-\p8!pWE)<-TRRV.@=cb,@kFik%;T+eKJI,\r%_S/gacI0nC<;:^[iWd+Rme8SN`,IVP9,428=JN<N:<$,4IdnqiWbSR>1rm[k/@eECnp3%XQ^59JQf.Ptor:%79O=q$V?p3lAUT:N\r%FshX]HMHhBY?@jne_muXn=Js%<C>l]D11$#op&R<gu7=+="PpVh#8^,B><q4$c?`)GX7g=Nj",q4PH\c7W?(\iRH\J6jl<1,J`Ir\r%oZM/InLa6oGD["!>:8H^eiL7M,No.CkGJ6tn6$f?=a7LY"-(!7p+ij=2<!k.9JasVV,qX?h24pnW[ddO`)RqVK($'m:u5+_n!j1+\r%Eq#$A<:3NtogI^L,+]C"-)LL2bk&;fMPW;L.O\Bp2oET:]];+i7:$M\KP`)GX7H,8@;M3B2WEQIViY4VNYt5aqfuTj+(D-DV=OV^\r%\GDo._(KUH=Z,Pm(9s6/A`rLP&7(^@d?UZ=DB5GTrdN*]ipT_lNaArJ$(CY8SoKQ4=sGhBC7f(49P2JqCGq/>Kg+sX(NN-od0ol:\r%[P[MtYGgdN<Ia$ZJ6uW;O@Ku*WBIqXD"sim@jABckDik85-f:ElV`P8ckl;a)IiNqPIWhoL0125`AOQ%fk4Ec@2)JSc&?T0%/hQ$\r%;/,X,7s0<uDHk#r&2Z9b[l(CNU0_>^)d<i71i-rD(u5Z(,^6UQ:t=aQ$B/9N[K[Ph>knf_)PH1h2)YRu<\ZB+PT(S$BDbNsX3k0)\r%X!lFS\nn,]'k*,*'XXnn[KF*Ki8S1dTSmtKr):mK\[pP@@+oP!J1c)@62/W(k[La,YR4YiE5C'.L+`/+/'p_d/R=)`\3r[\^:V_q\r%!uJ<k]*ho#dc@BR&\&'O0Q7'52HQT1TedNckb@:T=b87>9@/BQ1KaVV6'kc=NF^W!s&b=X5=3?*;lREZ8*lt"gZABnG"MjB0Q7U=\r%6b(Hn2WJp$/Q]IbDYDfIBikp2[UjY*?,2WbB'm3&]Z:!s[gdt:%DFTi&#'#d,d8E2C(B!"1pA+j[H$*9Yf?RGC`^J/SA^9c$Wd>C\r%YU1/[riia]L]NF59SdOf&;(4X3@.9[*Hdb_j^Ie1jbsgPNg?a;j54>a2#Pg=W0+Fq@Ii0P=rZ@M();n^,eO`rr*4>NU70\BD*2!c\r%$dX`+@hC;:"TO^AG3l:cN.2m9BdETqoMAH1qJ2lT1MfTVNU[J4m<%DCmP,,j(kaGRKVT=,6goT*i\:'i]K9-tI2?J]rEr,`jK;T"\r%K@"t%g#\MKR*#`j2,c2F$)U;<Tl1:8E,SRmhEPNQ3Js\A&kC>L;_YZqgksI*1Z'7kfR#HR&Q;Z+%D@Og\AQsGMqnO1m(obb:><#Y\r%_li-$)/6Ht-+Q1k7U,8_4da;iES2CLj(n%b4W(810Bl9!mD1&2Z4qZCW\q,!AEN8W1lBrM4\3O59^u)^mD5q-Ca=?8MYWUKJN_Z?\r%XhaI9IQL,S#g-L2QsJkJ@#\!sJIlFn^s+OF7J'`\"YMcO*.tI[lX<Um%8J/HBasCV&TesNfu<!H$+%hIML*lAn$9Ku%^YJ@#&LLp\r%S2BlB&0Ij]%Gm^qVa6&%N'0=W9>#c96Z4ir/$d?4[=_*jHd"*t@?<1`*82/AQklIqAVY--FO/Y*ii1&l;qYDu*+7]l[R[p;D6TCf\r%q&u_S0nF$nYWAo>(B<0:K;$H$2]TA2H\6]]iXMFG?_SWT!H544kJMZ9H$8K_P[6Sf#6A05?MEkr]V3PXggtaolse]*#Bb=j#X'g[\r%K`FhLU]En\O'.$&V4@Q^-lfS2^cep$lWh,fMO:`s@)QaJd*,X+p]TFt%ulRuR&hUiMJ;55B_Fm8pNR&jCHe\,;_WSC")KC/H'80W\r%6\3`$bg>Cqe.bS>ME2au]m^GdbG*_<Z-;R?e^5!+3F&g#hW<2PTVJ:VJ`4>imHEc)*38sG1cd[DKeMYQk]V&kq-;>3kih\\i"V2h\r%7n;k-I)K'\@>1aX3\`T;d:6jK:=*1.]r]s.,#(r@3)AP8&H$S5g.ihdFFXgBGmp7)d;%Yd:Js(PPPrOF>Cl299C[f-F,dlhlNSq8\r%Hi&V;GFkU!^83=Fjm4\0\f-pF7d_iK>:l^P88s])IR9W:'9+Q`iHuHEr]<iJ]77G:T#-UBm,F4?`CQ>^Y;I-g*O=HdiGToFI,4P&\r%M]7C>fO9>;gj8Y1?RN[!3=cmf/ZDl1X/(rY_e/l4/CJ@1:[YJNQH4[7N/<$arn\T:>CQbJ_q8u*4_NEHJ3ESJ9F_05`0$fE2@TZ!\r%5HVB(H/i?6A@jtYNdfOk6:oaMP$*b)0Zkp2>n?L5oWP2DLLDED/Vd^\hqQG&)4\X:5+#<^a+feHU_g+YVOI1P#FYcC$CY*NHD!j.\r%@'*tQbeC1Lg'0i6r1ohT@aMB#R.ZUTgml:*_h'fcoCqmM&2ELj>2Y;C$A$>h$&4=>'Ss4Z9fi^4ZE6WjZ&#Z@Yb*(,]Ce5?N6;'_\r%d#(le2a3,Slf2pZX8JM)Urn:!h/E)q9&q)Q6O@P?8d&Zr!X.&`9&K%rG>h9=">u,q&^^G&[VBrbkcZcC[-4^anF.HSL)Ll[;t]`0\r%pgQcE^\sgo>qn4'[g@`+rP/#8Ef[T@&VF[%(R0Pe_Rgi::n?s-q1-J2!8-NgQk*l3#LH.f_gF^Z4b32Yo9i!.UguZ^q5,?^V/8Dh\r%.CDPQ05^:]:#A@&.r&`]!/%j-*V"-H4rEAmQojLS5^f4%O*D.id"o5J6QffJ=)A3soTW-A?*YWh'f`3Fh6eEA-3Q:a`Nfr(m*i"2\r%R@+%.W5h@K$SePNXKuh7@CV23#jTgH/iT9j8Ib4o#*GrE"<r?>AK(^Hm%T!H"Wf=TW48<<d^C=7:[4euF3TF>h`m1]%O1Cr^<lF)\r%eCdrR?OXD\#]^/P=bQM73f=)WGlR;Db+,%.-bUc.^#tE\Sd6'B7qd33QM=(IQ[s<K27=u@p:5L]E5^#s5o][tlt);4NDit<17gE!\r%b4j$)3+I%((%n^Wk#^gZo\+!<8#lp%IPqa.4j61[.L4PO,C$7?FAN>.\'laO/&%"io&k#*=%cibdIU`^gHj2]TI3(lR&Qg9Nh-N'\r%W>R1CjEjY'-djlT7jGHR?%4R;98XoSH6TUM@]1^'k_Ue4PLZlW>=TWuoL+"<iteVF"N3PKCVUN>OFS1(F/tj/"&7<#(Li/dFq79M\r%""(1m:8i^H`'D.ec4MpqJ/AQ5bTSi_Qe$!QjTjR9lr!pc(GkHIiU31@H.<(4=t&Sc*)ZmJLk5N"Jqb+u<Z%aa5a+]L6O]47kNl+L\r%$-rODA*&dj83dT:3a"fZllR6OU';5A"$JJf4,1[=%mq^)PdXAk*NM4QZcd6,W&ZS/i*89<%Q,U<MV;gcae@kk<1X%u5<76+9dF@l\r%3CjWc(Ve1NJY90BOW:AD"tjeJ'hrSEO94?&6cto9#l.pdP!c_HhdRJarSQLFBTotfPWZRbeA17^d)YZr%IUKOk%-/?d/Hp"^XS5q\r%nT7_Tb!A,?q&5O/l(7N]gKYu\Xoh_h"5)YL34d$cptc#/9IbKU.[SM+JHhF,DoGb6;mc&"HWPHQ_nJ:$!YT4p\7.YK@eP(S-'^Lh\r%5e$/7ReFLY4FUVB,rWmcnF-Q=&Uk\-T`k`5A>9n.^.^U*Mm8ED(u`,QgP.MlkQO]=:$ole>!@Mpj\>,1L5#-rDBY<U)&>3?Oa0ke\r%O^Ug=N0t7CT65&pQ=3)E*t>SgNjYO3[>_OFbHNg.388,i*,>k/AERXL*,FLOL'$'aa'-97Y^s56b-2#-]L.KDT;/>4`,[EH'&UYP\r%g)=U^Q=O*"s'c"Gfooj\.3&f(AR5Lb.&!apX>S;CjLPf&@oUg@Gm1,0-9+=rk#`!=:!iSh-T^FgD[[+'n2/LX3S)%l7KI@o@kC5-\r%Tn0Yrn#:j4S>.ZWXG-D8h.Y!*$qofA>!uS\AQU"_K1g&DQ$-_@36Pp#&Bh<e94SN:QVCVG@=aT"r/,Z/=MReh.E$8N-ks:3k!CW>\r%N'a%B\4_Y>=GF6J^=bY@,%D=)V>o`cYq4)&^,7h*kc(r+J[0"MNI@qVl;ibmmOBI=nlS0e6jnjTZ+PL57WmOPPk,U`<K:rDIF[X;\r%1%7+4XaQTRIoO]'?;d&LYAmBq`%,KepqD&2M>ncYooU$EP,(4WX7$m,^WZ?oc#"TP-8iKgo.bgc91,6o9iXXN@Q@LICm:q,:J!iI\r%<TP.UGaFCP^3/ot7SYks$uZERmCd\Cff7hQb`'-\Y/hH>":jpMVXXo@F.@F9&'-P`omt+)d)-\(+)P#&dVVSla%(bS4TG;b`P148\r%gk;":a:Su3Y-9f:FoL*5aepct1$$cJiD$LQNFqWD'n^K*EO9Q+54>'X%k2t.ARZ_)%N][A[+V;ujKfJX<7&?DXM-R^DD,sF5Iuhi\r%q8\J_jSfVD-<-SMI7DR:8sa4NXM)`R!G6DXl@j+BGe(9'IoKck*s'ZB*fDB&_*F[)81+iJH6oJ*(.ST7es17-\&UlUB1j+$a_6oY\r%i"9CpNS?XZ10;Jp^F:K7I@\<9cM:7fhWho6]`MfbW3K##Q%!A0]D[sma#697(8PR/'!G]1H#i^',7?W`-bjn.c0K`5s8@9VHhp8J\r%iXZ9$7r5eBD6o@GmkM!ArW=%;#(eWAj&g=k!0h>ss&]KJ_OBg\ka.IDC7*39m)-GmUmlaqG+,)6gIJuD\>7mG3O)3dbY3K9h@?c#\r%DUX$_B-"D?Z.7B!LC5^f3IQllCEDX#K+#?HT/ot9.c6;B&*cZ]hd_FIgcTW\#g:.``tGiok'>'&i!DP"Pe!'$<u<IY3-g3t.WF23\r%'X8>g(%H''[Yj^XCqFe8K^U#X?&3^o=lImP/<r46%YrNEWP]l\WGqOo9f7D"dY[IYMtR]Y@Ko#&*hg4#9)Kk0$t6=-)8OK7G4C6c\r%EANA;qcD8j:j.C@GoV=4h3Qa6hnMai@NRGbWGH-C*Kl>VfG<5@nWiQg%U+-p^n"X#2uJ:LKp%N_3Q;1oE&MmUP$LGJ'KK6:/_S*i\r%/e]Y\o<O9@8\CF5!Ju!m&u>/J'Wl"=R3tON(iOAB+8uMX4(u/Pb"]JWLIA%WQT:L/:\0]?r@ba_afpF(6KN#.L<r_=;3EsuD&rY<\r%'4>f=&_=$qTP#F#l_hp)7GA[ro]EDZ>K*DPU<V>/S4]k_p+QD0&$sZj]fq"Y\-79E=?=,6bhC%J^U8*bq_H#!Y0_t`H3-qYp3^'^\r%qt!8K([&^$;;s`p:DGRE=%rXfD9n$MJo!;C8ojeNB+#5;hA=u$hB_KX+$-5^T:mqLh3[G!qGB3eSD9+`@3*$$rbD-'e]0+V0oBLR\r%E<r^O9^D.'g'\i+kooH0>Q*.LT@jAt%E8po*)>t#2h-(_LQ0s0\[Q$bK2n@AY[M]55JGB^doj1T>VbG3fBHPj@sc$+]BFHjHKi8u\r%M*a3A*D-%UQ]fgM!@'[in7g3\o[8B>Lq,%p6au%O%4gbr/_;7q,I*TrZ@n:+$g1'tVb&X!Pjj+95uW);<jKFk;,PbWE:rp;(%T95\r%goUHZ6i6$h-.cXE9)(<SdTm0O>0#flKFa]U$g\?>-%$OU#anpM9),W@:HhQ$P41c).B:V[W^A#BeQ@KVO$?.[1V!1DmtX-)>l+D"\r%H^\.IC-gjK4:,o,;%d+opW;j>khr2:+nH[3CJEbkp1"+-OaT_8;EkqS.h#9U)Kk^Z&64,`*DibI_2#sQ=l:fir:/>Y<4"UQ-FC:X\r%CoI3c1uaP\+uotM*V%AEZc:NkUIX&uc@A"Ai/6:E;1Pbi`Yc5ZfXhdN:/t)3Ts/t5.!fS+:NK%fHVV^(-""l6Sct;lXQ-)6/SX(i\r%7!g5j\)bdMr8Q9H*)-:e:d"4QR.T,P\;OXEhrL&2Up6`UF.jC"7iI$/O[5qN[7K?;B^or,'h7t(<,#dlZbchdX<oN8,#DLkC3`Z<\r%/l0k2g@'a4%]i8fQ"Fo7dMsXJraiZ2DH297F*mSY%+c1575]#4J$8+03U*.bC4>0L0J`Ttnmg[kY7GIu!ZU(j)*f,EdD@?:_+AoV\r%cpg0Uc9:f.hfkcrUS2Q4r+);Xbs#LVS]4@(O:KkJ?1cKMGu/b-TLsiT3rR/"3p6O(3Tl<DJWGQNO`P=YLt8i>YA?BA$#8HRp9K?,\r%%X6/-<2P>C&%mo!CFLe#*3[JdMIGD$:=fp:Qi[fmcVQq)gh'dh[j-ct"rq`E#DO"kOh.:04*VIS?^H[ejQ<eHE=#W)Oq\^j:P]bg\r%A&rU!rV4*=QRCf==1s"@nSb\s,hfVH4KOk4pKS9G"<`8-K\m#-jWh.Jc&N>nqV?eGEl;8`]R)4A5I5L:^91Mo$N(sXb<CEK3/ZHG\r%)dIc["t)e3n7dSljHh/`%6Hj#EmnIOd:Si:HV9?CYP-bfh)Aeq8['/EC]GZZC`,qCSr;5%"e(a,&.0oJJ]W1mOctRR_G30V?F>WO\r%k[PQkG:S50BVWgAf\<PhEWWr,2Kkgs\e?jb[Fg<oEY<I0gSU_DnALbG^VXT*HefD$jE#$XMil#O=]4')1q[GjB>r.`VNG'=QNm9/\r%F_6*VStmF1IP0$/__:Y?MqdUkE95FE52:W8?>hKp\Ol8S2\l)W9D!^j3tK4K%I,<+5Wl"mRHC*+P-q7`Z[r/&fV%EGI:8A9TJZA9\r%_-X(Q05fr^Eu0!o#IYmkSOsV2Cg2,M+>J2sS15*'62iJqRn*>rDd0J4,TAM_?C%"E*l\u)1Ai^\]kV0f`\;aBAl]7Ed<u$WJKdk7\r%?Iim!U"f4H[[oZ0\cM,IS4?HY,!ii__jGgJX's2+;9L$#@b<G;//s<q'<=)e_j30T8DY.Lmp`g`AGt"Y7S2[3U"t-j=7H1e,8XpS\r%*a)@)4jUY67B_WYC/@XC*4+Y#R\-`cLSdo>BR.n3j^Vn^!]fH"=djkd2e\]2l($J<h$jG**EbVJ=uU-GnMSrWj5VkZ#;EGACq9&P\r%<sGMP:8:Yfdbu=)%BVc%?Q/CLTLTL1CJQ]kqqXI77ZbD+eS>?eKIqs2)b)E;b5,DV^AZn3.V%pNW:7Q_=RR]5qr4b95>e#^b*r?^\r%LFu,[>s*iP8Zhfn0gE=/`gVBss+N0Cplp<p@q;2>T(J4_j)5b4FrBpl_0.Vc`pS`uIJhho.$>')/>\^_;:J>Los?Wr:^M<m^F=e9\r%PV4>k?qMhSj8Ih.$[mZ.PSU.[R70_Le@Qd7MqJhfe"#_E?^[BXj'A2T$rpmE+gj4=3@?T/'WJC?R5Z:a1-o>mkCDkh@MUC>IlZXP\r%RPPu3;e_0U30E?P#<&>k]p[##"HN\VE"dWI/&n'oJV!pS;%[\Ta"5X`5EK'\85!QW#SD?c1\3h`rH(-Q?6H1G4%'$+q+UHRTc6sj\r%[rWo&@hkA-Xq^c(Ac;)Q)a[Ti(Q>*P?motT1.+o\0U/(\VLtV_Cn;,kJo60G![9XZ65\Ai7FAqJ*l]0g=iF535C+/=WaID:MB4<W\r%.+!kaPP3KJe,k@;f.fW,AJmk#oIuL2<t]J7bq[_#+bnG<LiC;8e&,"4puo$LoIpu*?8O(Q<%_Yo6[:)"lHCuILS<PO0hPuO_5[;B\r%-F+Lu.!6`'I86=nL>&Gi)PJQ?(s9a`UF8/?9#es'k]G^J0GLV1AgiNJ6U`-<.a-(c:Kc.!%unJZc*.I\nk0TuL9QE!!X_EkNra<\\r%:5*OJGnja_(t5.#9[[iF:0A"P:DRFbFr;n$]J$mPMUKJmpEmlG$%UV+*rP^;_8FD-c8`_q0DI-qgR%RdoVOV?#nq=6RtA<)l^ua_\r%)EI08pqg/GQd$JtN4S.9#[Z"A(]1P]l0Ci#[OQG1-1,]`hE!]iTIT9t&;IL9*L,P(;.6B?i<+`G`N>t#qCZSjK2CS%UJq_0P1]1A\r%aT8%A#%%TPGBU0g_r3t5N173s)n`q*QBM=eoT;'D&(2>q!k]`D7$72:5Vk`n_l)+A_WR4a3IFY0:GmPK&*'H!7G<M0<_Jn\O'@%2\r%dMVA:jbIiNe$u>_%1lK"c/=Jj1akgTQ$.13BRWVVVs(UlG2rIG0s$_Y>c0PFqf?`o5BmHhs*9*C-qPX*BQ\b,,[U;;?>`FT\6$ap\r%9gd0M-BmY:ZHIE:L$3q$$=4llj);1JH\I!ZD='+IKX>Aag&$=okTo5I[JaqiUcee%Sk"*#D3OZ!.!p-BR.fs;;tf^)ECZ#\-mb-'\r%`93!r8OM/uc\k`M*W]iuj.*JH5hY`_L86u@F`SBC+RKb;pAX`ls4>a!?Vc#/'701cSd>jr?Fh&NfUt+GUTO'`KHS(fYUQ`NCO1OP\r%gW3Sp3uUo;q=9b::oTtGG8EtqpZ6[p28,Bjp/>XTMlbiSO+%5[hU`A91#h<n_'/`dcCmk&q1Xp84="oXKGW6iV`B!A')`[BKbUk)\r%1QK11(NuNkdcG79QAs$D'==p6+G:BLep2cD2TH!!nHqT<P>ejQSYs$OjLNF`9@%bUZtL]t.<u1-3-q([6'oXO(%jndD\-q-[+TW5\r%0uP6^W8OZ*i/p@IW%g;`BE*V+5uTG["lD(8Y*$I9#^2U-//r$*1l-^[B\A3GQr+:!eIZD^Qami#jtSUqap/LG4>"BGZMOMGBeeAu\r%?SZS9Us`VeaJch&s7ZlFjANKC-pO5Mk*d1FhO3#?8@E/'PZ6d`_AW@J<r>bQD-4F<`qnmFBAI1rGMtF"95kA.k-=@X0B!pS6qk&Y\r%;Xf\H0:@;+>'L?SQjmL+mW7(s]S'+EKUCQ39>N\ag92a6FM`b^MhW9Z6?TRiOjhn;s2Wn6*mi'ubLV!B\MjehW5((378ARpK86-K\r%E\[b>9#ZlH?Aa-]i_K!+kgE-pjCF(5KQ@u&+t)\M8?-pV6)Lji]]<KLMOY+F&jicI^@ZohGW*]T5VYG@ki!hr`Em_l6PBo1oD?L(\r%R]lQPcG[cil6=MT^9:>W@0'QP#^tronC#kH9+N\$)#$-3@Y;V/N,$nRTR6&1*OdNCnIeSM[6rL!KpNMFjda4:Be&n%an'$N029Ss\r%83[0g<'1/2PS3JKOMX-W.0*[H@715L['U#t$&TlJqGl]_rXW6l!P^:D0+SQA<n0u<gO%03OXb*&78-j18#WY*(?5qGR-8]ON32fk\r%RJ9--YR+^/nNCud(MTNB[,ia>3`2\n76QYPFKA*\H/A!QJCa3NbLPK:eTghg>_7u9%c,='!`6oITjr3L?B6ZLT?Ss-o[&EAMf^l<\r%kb33o([5bWdDI!]RgVk?4lGP+cqoJ?gjCft)0G)iU[%l.4U&8b&'eUl*=6HW&OL6P[NhJ)I'VAr7_!'J)k#MfTi*p7'\X,^a"I:5\r%!5BP!_nVU(S,Pg%jp`sS#N"[:d]#/DoClc_6enf@DeZ.)=2=]^#sEjUa<C3-hBeU[?H5h1N175)=9;QMWF1uei-31n3=Z:H]lHV*\r%fL<T%e5oahl/uK6:&XuS^)3JT=1;V];.%J=0==<'iNNgNd,U-G^.ukLr2c0JW\iE)cEZiop>)X0m:DmU-(jfZZG!8SjKW)EgWM_4\r%CFd@4O/&;i\eC-I=HhS32Np;TG?0-TbPIOF3oAT+,NS"_ZSORRJJok[=)H*U'&(hi<BXsTX\Qo>IB,$`37pd*3TaaT#('c'`rctR\r%UGZ\,cOOl91M?ACK5.c*$OTm?rr@1oDXb87XM"RdciXmgLkS:#f9[HfW/7%'k]sr<]?h0N):J+=N/F8e!.nMj<Nn^R#XrSP>0!]U\r%oUP4APVXZ&/j?15G$4N]2(2Sc&Q&n:IrH*fgbJrDPek,mrS0@7Fp0E$5gW.j5RY4:EqkpT4F!9UH;Zm%^GH&;W\b\4'dSa'ZK0p2\r%0iY[\Q)<uFqKh$)ea<Y@g#hEZcf2Y)[)b^Kd::t_6+HG?cUQR1(cQB'os!mj]R.1sd:,6%!Z/"E3YnU$]J&hkrkde4("Zq;rBW.A\r%5kH-3p4F!p(hce).o2e!3L4TfO[(9)_2h_Of`!GBHgJ*`GZRj2U$`-MhL!Z:DQ[0^eMr9`_IP)14Mpok]^P"c&tM$9SXoMKTO15n\r%#leK;KX7Qr)q[-G!Ei][7DjTF6sPb*<SY?@P:M3fG<;q@eD$IH$PX6@_#$<+)BHlOlKl6*qGCAG]>;ZT/Z.(;j_:UkE6sVHrk*Ql\r%_'2"$92^%\Q\h*f5Gk/aiXrR6b,dQ'dO4.MH7ZM9HL:kXj]o'G^na)d>AZjQ.j#HUm3H%*s(O<Cf$a:L5>/uiVe=]J;>L`[S<ANi\r%gJ-9!Ic3XYQ6+G'%VE9/a)hUcibjY(:[nbfIH%psaEKf\YIDieM:Yn07S;AZBL,4[/,Q,*JejS)@[_bfb%AGU@1*G=Pn$B4"I)&K\r%>rX.t&[\2h-h(0+:b,0jW3*F6:&>'1$/)IkT05K`F)6="*W,1()p049DprDFBgHTX8QM9Vl;8g@6$X<fUcmo*V+s@?qeU$f#k-u9\r%&<len:^QcV?&_=nW'j<jEnNhuh0jLBO`C&P4bqjP7[ACKDFPj\$5TXLh2OnD/LY"K],HZf>>SuRgXUuRp6q3=#[1'?:pn`)3^.'F\r%W4'9S_PrX"dRe@$H)N6aoRIY0Oi`k`$LSN.;NKjq)#12DP=crD'(o/TT0F.4=igq5LJ#p\9#3g[%mXlKJU%"mBbN-\86l,]EC&Jj\r%S1fk_ntPO.ne1_IS>_(?s%^DJO3%_MINYW,4s[3XWbRkqJIqU>'&4q;aJ+V=:^q6&0(LT:,u?nI>NP/!jKY@%Wja'cQmmg)GWLWF\r%OX%6O9J\-S5FD(QX4C"#D>!WU_`ADYJ^`rCML#o6(sb!^TdJJSW_)Dtoq:Fh9m\Sbn.1-un+YuABG@cVT)&>aa`l9l":B<_(Mq;Q\r%&h&f&2Wc+m]9+C9BLaC'j)^[59Vd,XSBU>.^;%4$!I@HdpeO7n32P#$*@SUmH%V)@Dt&7KhEZ13isk,U55=X[r\O-M^V<.mi9KD6\r%r6<j_DbG%6J+X#/%qi2i3PtZ.Rrb=aFfQkP@VmRKSC95R7uN-bjI"JsZoKN1/lk]lTeE:K3S,uG5NV1XBpc]%cd5Ji=%\45&r/^A\r%q'DYDS!U6?!a@iU6O=(4RLLdH/Y<V(mn(D<FCr_*j6fjOjYJ`X&CKgPV*lkKh3QC6:]b^?23nlk-_%PlL5$?!VWEDS7q3r5i,NCG\r%bP/M&Y":I7&05lWf^]X8^UODPgf)dB)+m-u2`4f'_lhpPf13fGcd5KT<'T'Cj\oV1rSuM1f[E@$mU;c9$TW>e7os->eTgiML;QfS\r%>#b)9G'Il2-*:\YM[o,`MkbCmGB9-rrrI4sX%L%WI?T?<e^XE:gMO8:T,hjQ;kCk%\Z!!giJ@j1Ft;oOnV@*bM/@[T2.VQ.A&@-k\r%Si@1rT9;49.O![Q00(jJVMBm-.Hi8Cd'Q#tj!GEuceV/*W&2CMrZ3.j>_TMV%U&<D0N:[<2ol>T6r5?cHLkRG^6:_l#@EW$pN,#u\r%%q$7Nm<p<dSF#^f0FOn##=&[@:J>/^n#$eJ@%Z2@e[\4h_kL`PP(\)^TV]2nhY#7p@WFncTESX8(#Ih]V_HIq_5st$)eG0WChb-2\r%/:hO(ghXbHAdN*ucFkRK@2ALRXTL0ES$_1#mU7(;/HV:ck?$@A=obng_"I#<UToFP6:nMBd+/d-n+a3W@/tk$^!R1Jrf`?PJKNP7\r%L)rQK`UWW_%@p%"5iQ;_5UZKENJFMD<Ga6Ea$0M6]/:3U!-e#6Q4ZL`T2IIS2q3%1s3JTE1&uM/W\ONL_1a[T!;=;j-iC_R3l=]7\r%M[Lp15@>"b0`Z@lIq["U'Cc$PX$FZ)1`o/-rZBGD-=Qs9.@[^`.q8dVD>ml`OsN[;J55lhke:0"oPO-ue8-O:qD<&_/[5S[FkZKW\r%[G.+d!rm3!WNquok^`[L^o,bZ&o+>G:0!,O?Jk?B./kn.FThBL;j2:8Mif[n^RXfn2P)B6%JihE<9`!!YZc)IZ)m+oD(A>@Q*n%8\r%&'].aPRI.Yg/]u4%sM:^4GAklG2ke!OFGEME)R-#r.#NL_AJ1)T>0LHD`RIE]lj8Pq*'I\/:VA5;X!N^lD,ul6,iBp='G-#i$Q1g\r%jam*6'>In5lPfP,k%28L7D8"q4n@/=FhQ!dhJ/VUInp9#qmd>V-/bm4ATh3/A[eqq,Qcd)\%KprPn^6,>k9_;<DlY!OF*C&>$";S\r%@j"moi#kQt-e3S\(GgQ:mR/?)HR5(T8lm;b^nR%+&r<7,!=B9%#K;R[VtiJn/\NBn'Q!\M_>f"BdCT/6G<f"kU&QCXm61ZG#rRGW\r%?H,$H6;OE[m1_!iJdRfK4*AD?YLnkXjJ;Q'2RHDYa9emOChoq>OV?f6g"0!d*`N/#JZlIEm8VhA/s7D+aK;o/BVE-:KZFI#9DdEl\r%?/u^mFgT3r@:TVs.J$E$Octo?(L?*T<dk;-.8o5[p%oZp<%gl`3I,dqA3.egK$&h8UM*^johTQAooYH(UM*@`7>dVrlmJ:b;bm9C\r%.3^.TQ$0Q6jY\K-_DBlRG"RIYne!\]fcjLIX/>.B-4i/>.+<=Xg]WM*7(2d`=C@JpK0$$d7o=X]+X7`Z9AKMmcDAo1^<Hen"@a!M\r%NWK5],p5aOWg@qEcsJh%:a'e24%L=&oD:?k!OBnj1^j<FBJR4)pU>BqS#E8R9_s/WI@`YpU&QB!X4snSJ8Vb!BO/=ORK>(6dm\Us\r%?p;-g/l/mt7f$fQ<u^XcH*7FLIMoZ69bTYH;eet?$lAPAk1R`6-V4]g_sI;G"/#[H3(jJ['"4Ge$^uP6Y,2AVHa!'oG;Us#Z1i"H\r%$"^(>"_SX[RS];R:`dWT$0@-3LOLuN#4>q6N4PZl[E\E?c1OF[=blB7S*PiAZ7[_g0%\Fekct)"F8`lZhHG;k*NgLP]G&:Tg#r4r\r%Wh7cl2%!SQj1A*Nl\DMKdeKbCasP_9JbMn!URZ?&TS@GDJi@N,7GoSGpCZcCL?@[@oHST,QN1)3GZ?b)Y!qj>[79CDkXl!HG/)Ib\r%#[Vn7$csrA,C&mkIP?tpfm^<=IU^>i_tKkMob5ud>.,MiY+M(aD`TqUpd<kA7pg\uiI.-gkl9<U?5;)\#^1POSqlj3-*A=Z8R$!q\r%>?jD.@UesDYE<(8(d5;LD6BK4,BpY*oJ++sSXOFn3Xa!k%BdNC$KPI,c1N22bM!\R\UIp0Qn;`eju1Fu+C*#idjs^X.LjV=*(?37\r%V.>qslPLX>Po7f/'\me!<CT!]F@B1JR"\A";kO:JlN;T_D$[JD<$o2N.LjUbS6P37W\cDfn@Md;<G>j,^epm[Wm\[6&*&PG8cuDY\r%n;BY2Pm1h$Z>`*/V1Dd=S9N,M.LjURrC$im*(<_i#%jRZdLB'=,;3`B.D:%q_BqN`BD&G=ZeT/l#qu`q0fML#Y-=UC_(>L:oL2au\r%QmLZ,lCoa;b`WMZ>u?jkAtdc'%8iDhI\dcVPm1i;R.cb5<>q6Ydhk<Mm,IW>BbP.l^b#EMdhc"u?l$U4'$t+*0>j6$TLAje5l9[T\r%BVBW14;**Y"LFb65uCSrI4N<alq^7VMJt3t%7Yhc9l;lbM-0g^qH)1Y*cMg;!\O$IQ:nkT`:LS-[Ph=Lb[HgX*Dr(+ApN/D<G>hV\r%])-B$W\cC;r:sV0<G>hVg6(b&Xe-oj:2Q4ogp&lk%p[EDqP<FsrQqn>cmO8>?^WUe7KS8F"@>W+Xti.=i>;0m*S^V1e5#Wg#@elj\r%";:%Zc$fO&Pm3V.QlZa8ICOd9TQ5[<WQ8m9nbNX2R.h`]bJ7uU'P'PeH^#,D1jQ7=DU'Hh=cpWa6UcAW;La\.p-r[uCnrDDJ^9V0\r%9?rYq\tQ[,j+ODM3C+%q_mkJ],\3.'>W#d%7e/L'][K_XKPJN.c_(n7fk]0VB=GCp97<uJc]*SO>Xtl2.dq6GWnkRSf'U)LG$'ca\r%Wcn$ILn>ISqG.&]Uol@5e9G)>'JcL-#?J<Rf]+SR5kqs1lJ=d84SN4EhE^0"AjOlLl^1o#7+jX6pFArfII)&)&$RT>f[Kt^]lNg%\r%YX1nRoe28I0(Y<6`>-$L2I/X*=k/_aBDutYNjm&1k(Am!n%\IF9!R\*m-uIKIGlAH]H+=O?g82oYV?"-MtaOD?ZS-[Nim%t@bgq(\r%4F_^Uf_&'C"_ES[c#E1Q0:<a,r8:kZ=er*3IO-[=YLT;gMZ3p.YI#k/Fm^?45Z&Udql"DIM/i4P>F1gRq4n31!P6B4:4_+Y*b]52\r%V*LfRajO1PjRNCl$pQ:^oD3NZ$_HLs[*FGWC%ebBn#e`PY5X`'@G2au0%gR[\_cm+'AB#-.n\Dl,jC16,f7Z(Yk212>>Mssr(RAY\r%M[+C?6)^l&Zs0e8nZn/>LHpmoo:[pHoj<bN]0RK-$WH8#0u6BKaJWu]M7,lo9R6%oodRlG'oTfe"Y@^:4Bi17G7O1[+Y@Ikd8iKX\r%<h3?^nM]OP4BkP6D/$Ki9:k)"g>pUSSA7`:3q!R'`!Q!NKd7m5B&Wr,"5Oc71N=mi[]o<a1_V7@'%_8><t?g84Bi!<hQE8+6(TZ-\r%8e0+a$*;&kc+>IQ<Y@Dib-MhR>)dQR.HT6o?!@eqC.jaQgRH\9Bq?oHN]K!1-a43g<LO:2#Fa5+LU#2gZCPWdn;A71,>F`-P;-Uu\r%9K]uB9&*q69\_t+m4O/*3dJ0BQsH$LCgk7%RY_\[M(:[#EhY/Q4Bn>>kbc%ag/UM*BM1G5(,NSJ+e^?/!'QgAkf(@!r0f`Paf.QT\r%;`Z=#f*"W6nE;cOC2fPQbI3gP)`1Up<^N!7CGX9P?W$9<fHFe[WI])]/OgLTSJq-J)F285f;V%H6Q'KV;9cG$"H`"=>M=A2ke<->\r%2$@!a0sGF),AO=dJ$ou2*&H%8ph2YYd4-BC'PKm6U2r/,:V9biL6\[0(0&eTinoF;Vj4SEjoQ=d&XISBo__V#4bE(TN2YS@/H=fN\r%iVtC2msCuWT&8J/BW(,4#FV>0&**>T6osBgBQ"#:/hXXi;G#Qcn1Y=iBr]HLr29N'%@j&&mI'-ENl+%8@MMX/S2>:XbSB'8F;R]P\r%CTanO@5>.!!`"u'(/2@#RfWR&OLQM@6r4*'C?Z92&HEsG?1]6N)HLpMKs```O)kRp!.[1jHRZ-R!(&Kp.0Lgp5e(Ic$j%"@+Q;!t\r%"G$gYO<H]Vc(_dsq$4r5lB3KIe+C+sMVt(PG!VdVr_8BUVE[Q0K-m.p3oaIJJj?.trL6(D,G)g"+eu<E=u44D^%nf8A&()5%6m><\r%`C3nc&,+jg-KBsO'Z)?fhteSAbsUk.>+PCIBZhEKQPp?.<VS'!9r7>]M1V&_3RQcXn$4*lakf@q0s^.d)R$E.)t^`/N^bhuoT:VT\r%`uW>,hb*S:_^sZ`;+[cn9H>?npPMk-X=?WHG64[*W17LeV+sM7_Kj4o<oVruGCJl<]aipLl/gtDZVm7k:@qU8ICCVs7fhIj)!7hF\r%j`U3g!d;sJ!=OS*h.(N)i#s4Yl%0(3VJb<)Yg_1JMQ,?e2u*>oX2,h72XbCnOBD+d&23\CeL4jFcbdqO+\Z7,\YCdr$Xl/NSpbhC\r%KeVTWll9&=8skm`#G,D;OS8+;9$-1>+n67AL[UM%c1VcbIcK'a3_C5K[raK6Lk)I6AiX8;YgHCdGSle-L#`q[2rfU2-1>7jdU)PO\r%C)B..Wm=t&RXR33'd\foEB.>2.q(Q!bOIo.2o4U#+in5RDqMM$`=$D-/&Vho<9"LsT7LZjpOBUNU9kn2U458KE?T6R6UqIC@49,'\r%Tm$fUYV69+G.d1mNUBG()Qu*_k>rBTD8r)@nU>:r8H79Un_Bej?-BRVnRY;5IETY!7l@@s8]*:].(1UcC[pi=q?VY09GQks">;kt\r%:dTk\'N`er*h;j@>u;F0n<m<n(!.6Nh:j;PlP16,Ae<5oSEd]3h0Z3?;018;Y/W3'<(rSjeOQQg2D[$/OB0oE7+(6$(g'<tR=DOR\r%_$Z?8"8EPhrX8(^dY^!M-Vm-t+tNo'+i3O[e^NoFD^?*4mD/V5_"K_+>+eQoLphs:?XZ+=/MAd*B>1kLE9$l%%4oYphU8FLXkpUu\r%AtHbT:Qt+jaY!@^UDdQ:7cqLq7kmi'4@$a7X`rqmrarm`#,HAMPM1caqbZ<G>X<k#UM+`$j1`9$@hplU)Agr)6"s.Tc/<?K1akgT\r%R(7rdIY#+3D7(mVcZm!Dh78",L*"**R%ltG"F+)teKiW!ZU-&i.fO8Bs"fE$ADIHG<bKj9#IdNT?eirGINBKnXaBA#F7pODQEuS+\r%W059qU0JoGoLh;3)in`=?(_5L`idgYXJJ+@Go&t1;0:O4\R#V0=!QB,mTA-ScDY;1Blhr9])*u99MfcP4uX;'BEf2q:CRnsgj_&q\r%4JURG5p+.[MrS7<UPgsQs7P]ep"QT48/&:0n+HZbeXiW<d21S.^0R@rEBsS#oX]57ceY@E2LgeM>sF:>8muSPger]bI.uC<<;0Kd\r%iUJ.F+g`<G*Aq`L-O7:KTAcV88.nF53=.2&:1Y'!Y1Za)=*!K=WZ.#YDX@kBc.c=Gd*oXsWFpBiB6[\X!8H)=HA8fO!'NOCl5<Le\r%N"qle9l7;O6mV@Re*[N)8Zth=cA9cc2UsSdg)4\*)*Ol=G=keOS?`fkb)&arCdj&$`l%.Dc^[@B<u1R+,(VY+MZ+SO_Nh%abdZK3\r%^AcAf'j$g.LD+(LqsJ>:+Dqu8mpE;Wrj]fAq0%MbW5dk^`i1f:2RLQ6d]ZX1@;r%&X8^Wu@%+URmTe/^H(Ka`Jb>(ZiVhOk_]9G_\r%&q[[eL?$:Q;hWZU[/2Zi'nRN+#TGM^`NA_B8hL-eHlZ^`J<5!%Nd""H1B(MsQ[hI6NPr2VD^_k`JC,,)Y".IaO@KlU1^>bNlulFW\r%7@.<V5+DS`"K5T-:uQNhs/er0qG?Pl0_^;LJNAIc*Xb@a<(_A.9/V5PePK);\**st)B&oI-]qTjWaX[4k)Q1QO\4Q3@;$5-I;?)R\r%(BMFh<Q!0+>f4nq>Vup!!ak8aJZJ'%[:(?=@?d]:rgn9G\7uki\pa;n"Ki[6g,<+UF(SWebiT35<t2n_N0nnKWbN6m"'5q!K7pl_\r%8qF$2l(uZ,=8>a7=-a;d^fA:tLJ]N7?$P=a4\-P2KR69CWKFP&/>^-^_pBM:`P>JQFR;"kciDu]$=>oZiC/n0a14d.65]8@KH?1V\r%!:"+=I)hI"LOlL\Tg@nSVug&X_[Z`L%G_02c7Y"OmBGLrJEjCq'8iT-G!R?leSsU`H$q`&!qM:A5hfdiI'/WH.0EW`(ujZohBE5O\r%P$#O&Jt<Cj3M8sfh;ngB:Pk!SZ.f94g$1-f6]L`Y-6Wj^qe@+(;4B9MWh8k/@C^2`-,3V#P6MI+.X[FEX@=$OGh_ND+F@2>6U;QI\r%ECj+T5*jl5Vj,k4!dXB&K1knAaJD`Lr=>h+TH`C4+qCoWI/GA@J)UHK3b$ZTA<mhS&,O&$T]HcEWac9NiH5DAr=P!iUD:KX?/>1%\r%1@5Q$-+ZZ4HF,brVaR/#2gS>'&ArpiS+NIG])u(]h4u,Ug)\HSUmgqN8%Xs)&'TdY+mmST,l*MKVVULlI@<_lHF,bRL!cUMV('j\\r%@"6SXXSJh7:kS)8>C%!OFsl@0fM;:B?=&TsBQjNiK4`Pmh?Se8O)EC,??Kr7(X<f`m[s-*UJ8?6YSbW\+$F4lLS::2UIVr6PnMWC\r%+$J<uqC[oN!mRM_]bumsA6%((rM#D5rV8R/^f1AWR\\r!\P0UK=8m'jh+JaDd*k%f\9VToBm7)1K4\MR`H!'q0r]monDbF6F`+74\r%J3TCVr,i#:[&$/#+.)SO^a=_`/:Wf9[UF?7OkBch<DCq?Z_1N:UK.&^\CHra$lWsJk,sB.U(Q86ZtAsT%`kiP\K81?&6o7$Ad?/a\r%G+38lH[eEdVX-\cclIF#Dro4h[Q@^iAd9/g$@."ORN:=h-g[,$RN5d$,3no&4Ncp<]%MXD*Re`+UCgE^f^#oh%WF'?:.TOYQo%)k\r%^3[AdOsJj"73rW)HLQY!p-.ERQemA@s2Wu?XsL9YD/V]u![T6h;Pa%n7I9DB;6XH=D6X&t>a'gTOt]HSlWqj5r8V4FOF!I=[c9IE\r%Cs'!OLKjco/uaMLHRu#/$WQoX/Z&;+^9sRYN/Sh]P$S2u@.j9TB4_(IP;o`5B7J(f0%^`#Ku9fWjf@rXOG60fH]-$&8?dQ=QR"`D\r%em^P=K!n'a+%ET$9?[U!Q)iU])pEK3ak#>CY;<;,F`E1:Z?R8mElgrA8u63W@97Fi5=[\o96(O^]*i)<LD([N9\ZX^Lgb-1KK#F!\r%Ym'+d64rAucPHoLBofuX771``f&Af#f9\1.be:1G7liV*7<t&rdmna"##-j_jTOa0YE`KYh*G4H:954G?1]8s9V;\MqHD"7VtbE)\r%(\.GJ^0egf*q=[0\UPUh4`6l.q,mTdB'%D>2<%8clnm?,)Xk(m-/o$A<!k0QOs>jV>[Cu],+T;5Zp8/c9LMNl@H\O0/!Uf[Vg,;]\r%BPA+5'Z-2l\3MHp/QlJN8to&8mRBjQcX3oq["a1=oh[4ZfM,XN=10`]Vd!S7aJ(V]%^_tlm010"XY0&1&T4e\=pV:u\)hrl.%7/`\r%Vo%h)#B_sM#7$+=B!)8b8L^g7%lP#3lORsc+8XhmK9$8L=`hF90+-[r;o`:<>4u$L/7QlDY.2%sNYJ:UVgEFLlr0o._R4rP^chqs\r%`M8!A^co0CMII(POb&DJQAMq0]G[XRlr+O0@;DOi:S7aboVcn;c<]#@HY<"D@U:#'`l$.e(7$hmYOD4TBD&Wr"KkH(7is4A-\W>I\r%_i4>mRuMI\rdplDb$_33Aq'$B.YFQ)kJKE&I/@HDVQ%^GWPWk.(T+3:HW-3G;T5lSR&UR\.X3V"VCMO>[5V)'^jr]tV[\g!pMQud\r%=K8H_^.2+e_,A7VjJJqc-UhdMZLEdS0idK4U>nQaL@rMb[6=uPPGp%"1)k;]p#:b+b$_28kg^2BPlZUnrg9\opDU\*9&ETZd)Rm?\r%R&UR\.^b+uQDr"Xi"l6")H2nJi:bN5ToCNegQ`?-G%,Xb1/K5p'MML29,4,O'iWX#T\$Ic;jG0s7F:`i30iL>6=M,&Ee+F@&q)H6\r%)=Dm\I7X_AC<i3egf"B9hrR!UR+pQ+@Sj2+l9_5`fL7`YIZF`#PRmt.EEUtKDj9`MYiQ3tcKS-Jk\j`p\5eEr:1]7La\IH^e3F(!\r%;L<-2W!mh=gZZ?7<.R&+ppKUR?<%/4W=3VF]qt+Ig=CA(Ao9-R]^\>!-A3n#\lA]EbSqq[)1#-tin9JcBBVcq#^R=CSY62Ud7!*G\r%D0>IS]qU0@6SBoVBcVprB1VI!=qME?NM"Z#&8G:p]H,>:pKbdr>H/*O.Nkiqnc'53`CF:a>A!48BG@$.:X2spp`(N>pKP+*/_DG*\r%Fj<33B:mNlF3Hj/B:lu#m&A2dR3Z14f(:3AQFW0b:K%%Z1]GKVqdaOC+lT%5ZVNCDYd<Mb[./St<JH6RN5QatJo`]M^f(X+eo=H"\r%B8TJmcdnNDb2R$T3U,#Tf>d]ujIFRWVPuX4?U?n[U)Up!PGk+di>U0Ho!ikq!JjUC_?BCX*]PN<TQ6;L0&02c.mV[m#b'L==ob((\r%Mjl#N]3sK<oiUVIS]#>ddc1,r[&CmXf_3iJ?s%r!ANl(S'#m46&X5b[G!'03*lP34Y[NCXHQ.!A"o:nIE?u4JqMpddKS=m%eo]O#\r%<\p`I:9/AS*,@Df#7niH3U<Jmch`W,3G`s`-\73+kKfk6^+(u8fQO_(+WEEb*5BVepJ4j:Hoi+EO[sD9@U#,8Q3V$V6We0l(,bch\r%C,miscWuh2fPQ!H`rMi(_Kg]nn`L3egcQVZHn*7#Ia]IWPqq\0Yj49N>dJH']N(Qhcb$Z9AOR5ZJD20I4oLN494I-Uc7EDO?L@,p\r%ngP4YE$&Gi&0^]>G.,&'<FN<2ES21-B^DP(*jGAq3ssLj&5$UU@6OY0B/>j58@h8I$cUKKX4MVrDX\:rA"kOQ#Uh(t\m!ga,Lt)J\r%\nYF!(=Nm],p`rQ6SU/Y/M0"9?AiM(C2)(FnQJUZ:eT!9Sr7:hC2".G`D&'=5qO\&O82r"KPP:ulbudW/O:s?ba'<.BaJNgQ0'_1\r%`O#cU[-5'h[@#O@Q?K.90nBfTV@/I(ZimeDs8>tF#RZUk[PIfi1ATYHjM7?]UQoPA0s1JX9L*)$eC#h7_]F\L$#4/lej%/S<U8Uu\r%>]7IB"LYVP^N_<,-)dZZg$.@NBaJNgeM\)m`O#cU[(u-Wg`f$9XcXE@;+qp7?V;nTQ/92Xp.d2oV;p+3YGK4k*SuZf$#42I.*8Zq\r%.<Jha*$%2pBL./U'<%`8TU&(:jcLG\,gG*DOm^rOki0Jla^jsK>]iTjP>'VA@88UU,am#/U!b)q^Jd:>f7r]"81(0uae?huGkBUL\r%9VAnjAoc=(S-nPm*FA!,ATG*/MjG=W\PL9,A3%Ra1eg`2,SPJW<[K3!HosWf6Saep@bsX&D)RV3,"RYS+KphqLQjsD"P5iFkXWZR\r%MG?7/lq&Nq5A"eMU.7!'&e56/?1(61-$Rj3LK'60)n%,^(m[pPP_N]UVl&Z*n#?"FQuAtr-!AVh*_E5]fJ:<-#oVP71m9f=KV%L$\r%>U6/&5R4s/N5%n$`-]#9a=@`eO%rmnPet-[b7Hh>,)4Cg#%mEaMo5to:d4([>.[4E*+YBRL`L):F]dM>-jYh@%3/o>Jg?*&3tAPd\r%5o>Nj`'IHPUkoiEZ(cf%egg)9GOCnWmP6=rk:ZZT;S@^IMq^Mlq`=jf('fEXeAF42MM4OUi?H<o1_CbR1"ViW#=@g0mqPqY/J?I5\r%h[<"&3b]d!XBS;bk`_D*9_9`A,!&%^*\u-p-_a6qPu/@K>\'RE]MY5-V.?!Mm]c#&c-a!m6q>Qq&"2VaM<Ic`=CtYgRHSE!d?f2W\r%<^XFA6mk\sf60B(ZJ*qXU+a.,/2P\/#A[B2#nkXRPum9W0Xg6U6MQ8?4325IFIs1R98"0r0V;R:AN4G^_RqK7SMUp!mBO'ek\=`D\r%D_<YfSOB<i0rnfArX1G2TudjrcIm1mU2:[O'4'<Rm+,aBlOqSqo;GY5\s0&R2A=n!&\S_jfu\S@BSr.q2=):@WO.[_`VO+(L*k=s\r%&&*J`=[heU?iTI!>=EYiRC>Sthb$VT#SA@KG,HX<C?O%L`'<UE6%g4s="\mBUE;U/Q73?[N7?.FH(5ZO5>R*s'0`n,jY_m_JA8hn\r%]APb^S0/F",_0%_Uh!%VrO%[j"EGnlk1bNh*CGp\(ht+6KQ(!41+\g&$A?fW,[3+[*lFEJX`43;^e`B_%1/J;UB*/roWPhH5/pAe\r%dV(n)?b?Ck!gn[gGeF,0!gpr/&l(9Y!EC]5B/C_l/u1aJ2&`\%T]mM,!$;=%g$9/r.*JQiYkJPj4[tOuCBgbg!5>D!S1N>@L8AR(\r%Z=KTc9K&\qq[fS6aXn"uVb9PM&3(X2-VkAp6aTUu5j7;mk9M)MLo8^?=GJo/?`Jn_^W,p1gRrE)7PN=P$.ncRNtc"o9bTE%/+urL\r%``T&"U:^\Gqa/!*:4Xq?'ukj5Xstm;>-957_-$QI8:[pP%G!\^,"5Um-]GGC@5X,;lZ1o4[SFZ/llKZ!+tW;!grl_1e2?/"A!%rd\r%n0HFV1GhI$#[)Df=DJN"0J)"nF'Yl%.Lf(:HdUH_)BZ"E$(f6I=Qf,WRsb)kR$-[3jgI=!Sl@HP<j(fR-lU4mOP/`KNZ&/2l?qs\\r%WTNEOB70>6X`W2-*'qj>HfV(>#R`tCS`3'H#`uJk]?Ktji9KGc>+08F5kph)=0;[ZU>@d1k\L>?'1,)R30b.gq"-US^j98n4ff-C\r%Q=5.(0.,Z9&r'uFTDb=5XI1k3:?\^"6W)NlWXHG#5$[,03tYkGNXoO/(a8\%M757W==b\11[IY'7i2c+!)r<3[M5!HMe:_-Z'\sX\r%jqLfA=QTDWZm-`lAgGnq%u8G,$CkeJ?g@QbP0EtqFd/7>MZkgl$ViEsJrUur-n5=>@TZtc.Ka^C$'q*UEfQYR+AB$II^/I;@(mgB\r%3oE7:fn_\t3uQ7;kW\.FmaOA">mr6E-X5]dGaL^tG#FP&BQj-<:CV+.2u,3FS!8\^emF0VeTPFYo_IFOE7Q'nj[+H\J+8T*c1K[p\r%RL=#hjqgg]88<<rIZeOppP)Nm`[=,/Qqt^LCd157K`gA!Z*9#!pgeV&4rBn5lfSGaWX!<f^)EWJm0U(lW#D<#3u'-U9Q8uJ"WGM:\r%pk6,.mP#-0:WB/*@!oi"-er'#ebFemJ_-4H=b5E;4lauu'amr%]Gbj.%n5LlSoEU-o@<VhQ!<1P0c6P*PoYb%-bV=T0B3_c,(O$J\r%2*PG"Z<Xm2bP6a7['XT8U[cGW;2;mU$""4c[BD;KBdfbROVrOE"/rp!?oPGA^\C-"dU/%54hr>S2*UtE&/_#R75l7Ie)'UiFZHq.\r%%4@>"Zg\Zr6;ZBoOZ7W'Y>o2/8nfXJp'H>c'6^FS*_ArZTr[RG$`O+7jZ-J:-RV*.XtTJNp!!Q8UYr!Sb>&oe8!5ANBt#3pXi\*V\r%WF4fp_([:?8g0/0jtN`;iNC=Ypt'ND6p'Zn<<B'Vl#J(2_90/[Y(Tnj-_;E()r0K)QRINj\1.P7Q\Su3b4:bGHQ1q?5RmEX!F70h\r%l+3$3Z:1pLX"Bd:9&ScrQQ*F9ZVZ"&<T#ko+4W*JPl]99+)7XAguD*T.tlfd29]>tN$Dc2"QmZCk"7U/Q,'AL%W`qdVb3U0nd6tZ\r%/m#nMnW-c0]`B\dQj$8r$_W4CeFY6>a`Edc3CU9r@Ms_DEIuS;^:a&:_N6905(%].'OpeYka*OWag\mK47q3FRL?gcNhUR6SJ+i]\r%&lL/WT/ij5oE=pl3^e2B_RCGQ"<mK5U!X5<l/RNUCITPJ8&5!TpYFt[][G=g>&g0]&DA[`%u@H3X76rUWRJVW'QqB#X.]kalXed!\r%lHh;]jJYRSV5R2ZgWa8@_qRq#qPTA![au*t3g#R_@0Hf+QE+dDNi4f:@LZs:/uc7NT;3-8D$q.]-"\*k@k@[cc!?[i9ZeuOf@M;G\r%/T]O;p!8'W](u0-R_+T$HX%r%PNK#8*piC-kV@FS.!H^!77j9<2L1iMGFe<KDiqYLR/*kJf8JrKlQV`d%tD=5p%^[E\=EiNW#=VG\r%6?k5u?i'N]!Z$DqMI@sRnl[_u%$<6.+;)DT!CZZ:hc,mkk(_q4)B%o8$1'^4,%1\fIIF%>=sIT^UA$tV:C(pA7@#5Qk><mH-e91%\r%-40%:i5]NjjY6>^Vinl6J&^M_HnaR7:H'T6PE$0$+d:1&a%0>jE`Q-IlUS9<_RY:7PY7iqa&6F;C78Y@MqFQ7gGho8TqVV^TZ?=A\r%p5QU.cnJ3]Rip>`ET=C<M,%fI6sm[*mAVrE@LYBbXAe4]WO:.uOV\r+],Db14Rp;UPrMI]8r$]&CBD)%:5ZpUHS#X"j;.SXYp`Wl\r%k;SRh`[lDK,E/+)>s<H&e3JB?<Y.X)@8DVngC&SI+5GA=[lK(Yod<bBGCS)Gim^!tCVMU/)@<kI8ar9,]KAhMU)Bl+hCY^-'cT+i\r%\AS)<<G^UCn5ZG:/#-'DCeu@n2"!_2YsFA*p6_6h&SG=dSmTe%ZhuTNU1)9bLrO>E;E0$qE]Y;69a<s?+X/p&i["j4f#F[\&^_>A\r%s(s)NFRibn#@ZP+hmO]\YI<>2H0\>J5o>?b?i=m8(5259?e_dSkl2a5r?cT7\,AK-BYsckg4![J(:Y2A$Gu;&h*Da.TfBU\kkN^&\r%=S^M;X26oB^A-7KX26ofe*BrQY8W(F'+THUpf/8^_40@aa0-qpUu(X"L>6H9ab]Ggj4CdN;\ha\:(M_KrVm9uC-V,5At(js@4^2E\r%XADer8PtNP+J'K\!..9o]$GkjJ;`\FrY"&2![XA7%dsR6Yi#Eo+S7:I]jWm:&H00O63$cQ_pD$;]TYrK/rc^dgUre$&u[\+d.cX@\r%eI70"]!n4XKJq-$nuH@N)&],(g!E@QHAcC+</CZE%CX)][uDI!HM84B:*"G%*K#8u[W4g3S'5k"'uN(NV2@>%UgdT9;E='=68sG<\r%jbb6r/!V?=J^R*nn&8uk<Rc"9(#EG8/(Ms6(MiP@Ob,9qj5XW'EP94"VI8EC+Re;"5/b:P2-mf*FomeTXsnj=r%No@QnYVf-8(7I\r%i-OqD`.aUUisInk',O,5fOO$@M$l+6ke6b,ikcH`q0I$ii\F']87F>rRJ'C-1)ujCE^k`RTF==F);75CDW9sJ<uf1iR,hJ7"_BZN\r%aagG?<tgp@kP**:Fc]gohE]K,,qDuC2K<.,a2fQ(2f[f%'&SoO1i_L=aN.F\2fW76(O-U@20!%4(T^p;C?!)G+EWY>CZ<2rC8k/e\r%JPt]Lin_P,JJ>]e':QGLl;4R=Tg704h;gU=`Y"<\[keS_\5!,`:rRS(/Ya",0QCgWK;sb9Vd.#u'$C[l:,[*W%oY6k"F1gI019(W\r%`ml%k:V]orHjJ\+CKG,LcrSLRL:77>m538Dc,29cm.:EGTGKT/c.%Us$fK6Rf\_nhI#0C\g?i<k#Pf.[__L#'?&67/U-3jqd9F6j\r%3("dJrhpko1O2j)Gf`,;'[t^Za=)/Dcq%YRA+9VeNJ5K4U;]beo2BJ41+3[\<@M\o[r,-NS+n7th0n4cc7o&PhMgV6O+0@?Y>d!>\r%fOF/U<N*EK**mLL;A4/cW=\HV?0J<<>J#8s['G'4</k2I9Eo:!=H*H,r/,4Od6,F.cf;XSc,XUUParG>g#jUb=t2T[^V]I#TGGl:\r%EuJLW8SDH@o^.k0*%cm%`Vl,U#C`ZBo<.T3^J%Yd#:mKF`m6l'+'qa/21>f@%(!Yrr6Pj^Z6*d2r-[h5eLCDI]5&u5IR84;fW6&.\r%TJVgajJ]Bsgd]S<Fa_$95"E1JBdsZ4QefU6WBf<+i-]WJO>KYn.L8r.FQ?e8DVI4_L$8<C0=V':O.FaXNmEVLDnRtUE/urM4Tn>3\r%>MaErM422F'j$V,Y2K)+"s+l&p-_Hq@biN&WUH",ffd8;J.KejU^o47cq'T[i$rt)1:#W!&dbD\mU(H_A-PfZ:k7%D-2YL#'gZ=c\r%)oT9VCOCG*73g<=@,ai5ZVI,kl]*T5D\()`I6%em.Q>kD)mL/>k]$Ls;b--37F8@g1p4,ud+2WgW?G=:DK8'gg4pB2qp/tLmbqHS\r%6AfjSbiKTtgZ+nm@B;nOFVqc]O4W7,j!,+^=1Nd?:Eq8mCVt=M_Y'EN5gk"Mla>2!WHOZ"#3uOMa"uqNoan(hO'8l5Bm,Y)GDjYd\r%E]fI@3U1E`fO!G"$d6q:!"u[9jX:mB(7X7HRch-p_?#l@9B<HE80,d05LRtGBEk!:6u^sfeQs18AXNhB6_3VZS'pjg?b:`b*e"eN\r%NF)DXW6Mbt=C.J64Do;OlHrho)lu1?9X1RTBe"01=Z6\3M9f0c;L<+L9.Th[q,ui>q#4?dMU'MbAote"c,!ZD=+!FR=^$;7^ZbNl\r%nA?7XDPGr-"hR,3r%cuS48!guCtKbF(/&O#nkt01^g]#F4P"_,2N,PYSu]($oRHY]n#ZqT5lW3+YYM7'$p/U6r_LsG>6\?V#cb*7\r%O;_0!)6fS"kc^u&,1-?EXK*hPAB'c2:K#t.WPUFW73_]&Z3'Kg$B%/Ca*=f)ZIJmTcT&:UVN=kfOX<qMX2=_rP:/!SIg/uCRjorj\r%!2uu&;if8Vl2Mm>_.+2qJc:]b5V?gUTGRPK6`^:[21)P@DfPf!p)s)hQkmZffg/CBB)fkbE8jVrKC'hIbC'<(8Vg]'K!/?IIj?nB\r%_2@MrO+Yt(#^INTVZlSiA8qtm)T;AnQ9cD$r2#q;Y%/'[QN3X#`*L/4$o/1=EWj#m0.*N1PY\#VM'bSt:NV8uXK^7t9oGDgg-QqE\r%Wm5fjY%s1qJ[!O6"eU@HknL1#9?Feb\]#lKdUB7o+5sOl6OMG#0FmSS.<-=o\F\B?s6k#I23)/eg9Sb&#k:bX>P;/,kJL+]>6_/T\r%>VBi?'l-*%aBGt486h^6q78X]bs*lMQ73l1%'aa_4fh*ZBT@ClJZm\hNIO9s6CZk=hT%<e[GQ4b1r&*5k[H3**Y'.Q*;f^feYi*+\r%?=HauUlKf(bi1fO5XIK*TRaAAOY1<C5tP/>Ec=^DqBGNp>F=4IUa*CFMS`D6<4/pE@T\s#=A&PBgO40lr>"*>V#i1s;M&2W.TdHo\r%SX?5]g@&!XP+LLL]G[Me:9O/21M.^XiKA(V3"*So#p;>#cKQ[H'%/sA_Y?kH1gcqJa^7W3lpmp+ksIOTSWeu?U^rOSZ@^.^8Y7`d\r%hB,<2^<Jq*Ycj3R@mdC`P!1G\K*djTUot>^Q0^Y_&kp@=fn1d51nX;I/Ta/H:06d&o/SY?9oa0&I!$A@jJ(iWf6d)B\Q]0+H1R;C\r%]pNnK%IQf?"UXB>70C:O=R^VqLZ[>^#7^<TU<`!M2"g[!NQA:qo`tWB_rF9!iHEXA_HG@nDWB%mh6^*=PQYJKa\C-S_<.JPXCfI!\r%2"NZ_ZZT!9DKm)gEkQXs"]DcSJo`Rc+e8Df_2'q$6+$larRXo)d"edWp-9!UZ:-QbPE=n\I(c3F#9Sm;Z]"dV0])[X$FeJl8VdM(\r%#8j6jTRP-cL"l>gg)Wl/'85bHBBB!"4ZP'6]@hCC0@F2(jrG"",Q?PPFH2T#0QLk\6<BusK2L.T?A.X<_Tejj94nk5hGs?&@H$g2\r%7+-_rHaiL6'C[,QX3h\KaY#lu0$[>d<jG@pYm^A;js@VaZ$\;D&<uMo<:&VVV72UnWFE?,&&D;"KirjbA9W8k0V:^aq/.>I<Z9m!\r%F0kdbpb.@)oCI6,;S/n7k43:M4@>mb9ir@kD9TWehCp0dFA547U)@8Wi=;6=M5(s\0@U"WK<Imcd0r'F7PH-#J9gl+c![dm[D\$J\r%ML(+kn?;f2+Ygm=H>;R[d/1PPBEldf&hRRI@6I+:&.gWO_g%,P+<Y:clDV1*"p/7'T@*$URXp!VOfs2.<hmP:78'c&;Q4(D';F;K\r%ZL`&n^eQX<[Et[b"*T!,9C"oaMEB1kdS8nB.1ioPgbim&KmU-"cJ>1UG^djoJLqGX:4)q"k!Pe%N\e_D_d3Dhe`4]Iq"qn#Nn<Xj\r%VQ^kY+'Z$+(6uC2F6*XJ;'T6H[2TZ08VO7&I4IU,i?8&87SZ0tgC0_]FqQIrb/=_u,f@ZTh-36S\[KgN(`1>s`%7>%oBiI3PYjX\\r%^=m<GLd!n(eW3i:Q7L\l^=(sUNKN>tBu'BodWtJY<ABWZoqBE@1KjqE<Q6GS,E+0$#V9%XH9FZ^'*OUG,jmOq>_t$0hQRD>BC&?[\r%kW1\p+0MqXY/O3GCQG4FA#T25]%=VR!jOmrhVn'R+P&M3"3Fag^:Oo=[n:%dO+\Xp/e%i)jZqnk@oPM"5/2)tS04YR'g'f4:@Js%\r%`D2`?$/J\FD<Ju3o3O9+M%XhY[3m^,bHR^Sa3T!@B4c@TSO*!\>CK%MB6o'h![p(2`fclIlr5EV!TmpZakVM^ShtQj3",:`WKj5S\r%R(<9ueonS3DGh;1`M+Mu!Ste4Eu,fskN_c89$sU6A/g]O1I]3cDIr]?-lSJ:NO]FfZot:-:=6.Yqk]Lf+=6=JBX#;e%EpMZ![eKm\r%%<8SM-]3Xe#tPu\'TJ>EijP\:oU%Centu_;:a@9+-nZ:j\CW,iJkF!8;Q,8pA>r>B1K<(&bY%%]1T9q1gAN9(O[->uT,T]E:QS?'\r%'V;OBXTD3#+oEWc6)=S@"G!LF7a'cg(/D+:[2Y/S=G3$$d'"u'(5SWJ)IEa8r#Pt,#ib.e(;7W/JQOL[EaXGNDCu0;BEW.u?FL?I\r%>E,gjfcKuC6sDJYYX<n;BVU^fDDf/2cp<H#]@FrT'#T#*YTnt-_bW"*!Hul`nT?f-c<Gf>!Pa<N0lI)9"T6\_Xo^b&U`q$K8`nYR\r%#JW*G&%e,6hrMme?4stDrB9@j+\MNYq!fP8_\h'L_RGeXc04WDFOsF4:b_Y<8Fr5'KQ!?NWq5s5=_\F[UdsV=23"s!Q:<VNI:rO#\r%@,GYF81@2]O2CI4Ulc]MBdD0\OueT`14RN-^BZMn'cICGr]Ssl&q7Z[_p1aja_M[!K+UsX&,Ja?iKqKe51<%>Ikn+O1m37RHV*uZ\r%4f6kuj>u8SWCG9<_Y4?YGNA3YB<m;GD`Q\oMJ-JRK;.J=!+T7Jn06_rN26WQMYgdI?,$&d8+ZV,)<*Q;L4!oo<>3+>kbe\d[j=&_\r%Hg`b+KMU5%KYS.[gPl2-jradH4_04.``3j%758q<mpdE\,BP\GfsTWW*s)Di548m(r-M#m:5eX:=ZWR`mBfo2[h*/U\im.]>-gXR\r%nd&k[o[08$S?BAORZO:#\n]+pb$at)N5Ze0h)]Jd`GLS+aWgn1"Et]ljO(jUC"k4WB5kSJjKS#Pl/nY%3ELJgrliutH^Xh)5Pp\G\r%4J$)Qd;8B%+2+#Z4OQJZg?_dKJ'VKKGOPCYfI'b"?[&]G!g0DL"*Sn@2umFMTU'%k)n!BJq$Umk/,h>ZQ2Y_>3]^.8=`s,5`]1C-\r%GjUC=^\;q^q:pMa-JO\d)2kIOZYLB-h3?,=XJ'6l:<BR\`nMd)`bB"c*91>[:B\,7K,M!4DoMU^)WVoF1.\>:Q*H(7C)/2[8.2>r\r%.<6%K-ah,0'2pO^4l@%J=;`WDR^Js)^BZ^%H`;r]Q9CYUaf29Zf9NTDUV"7,a&Q\%6(Ap4!"kB0QD@4VjW's'a;oC<.-CkQ//>27\r%qLm(/%^9j8X!MI#1I=(OP/PHsXNNjh7r`QOC[IuIejDo[K;)I<26i6dih.\8aRlJHjQrZh<asok'ZEC5m&A@a$+)tSPdb9KNIEU_\r%eJEfX1Rh%<E6And^%7r0V<82da4sr,h0PMQaFN<X1n^#d/c#,o,Q\7=+i$QYR1Hm1,fO//@fnpL<Lc;[6f#HcT][^P!`Q@S7\liM\r%RrB.aW7XX07\I;4M2dfhJgiUp1:Yb@PE09`*]%9#nC8;kg8=t8VuU%1S[(\jm6P'Nq%bQ9FTl1nagOmI;*QeIQo;L(4e4;Q,N,tL\r%T<OH8N:=1%-Z#S&,M\LH#TMTLP@>aO)$*5#$QH'0OSo!IYYkC?:e`dmlKR&<-T)s6JK84G84iE.Nkl2d/l(>b4kL@LkII1P;N>u*\r%hNLi4g\dnub)O]TKZ7GJfDiS:]:[ItESkQ-.YMf9_:lV)]m&=3HFA9$%-sa`a=\^r1=LJ1M6T$D6TL@@TAI6Se2\@F$KA">IVG=S\r%mb_:DV2M_8/aq^)Tp24$mK*Qod0a?!?LrS2ejKR$JX)#]l`,\ij808V30an8Vs8\?iIXN'\+Z!%URa/`jSl+H<76dFh^c[G=1fB-\r%q0bK.?KD;q7o=260`-1[S-ZuEZCb.#(aU;hjDWSL^@0UUW`T*tPb,r[<kW7ST`(p;`P?)R2bk:a2Ro`E[EQ\4M?pf32Kc67-Rd3\\r%_JM6Y(TZS)=sAQak%0TG81-e:86m,`c;CkQefu1G39LjZ4?I,gr=olXgg&'CNe%kQ5rr>4+/Aq4,:GCkG;XitNHCGuMmIi,8.Nj1\r%;P_rGn[0c([dH;T#r:*DY$@=)p<kh!%8ofIKT'#m"KOk!>"Ghd"U'_<@sqNLa(60(-cM/aWCVjd2RPh=>;Y(U,_MN7"uW:&%ehYA\r%Db*;a\u^T"\t`%O=AELVEE3E*,u;WVj0gN-nQalpU"?GWY[C.!Z,fU!gW*+kmZt#kJg72o.*2LPifZe,+%-m11^a&*OoNE9N<1)l\r%"!Y]1N<0uA%Ytgc1lAH&B0DC:P")/"b@<u9r*T*eN5l*OH[3\gPlFi=:VPbW7euH5q<d9`eB?m(7^5WEGNRjd6_g<Bh[,G)P"%b/\r%QkL[_-+q%b(cd`<&mgs.>u6:mN&)Zs-&mLhIW?XO-&htrK``O<-&lAsGi31lCM4F+]TX!X/nl#Y`6!iMQS]')/KGBO/nl$tga=II\r%>gb$$mA2YDOc#+U.Ad_,rT#eBk&0@lT+jSa>Udp7?6,dOn!?pXl"0UqS=3^o%e>NJiD+5RbqC,iQ'Ad!Iu7i^mh=AdqWpuV_6bEZ\r%^JIXk2TqBjeIC>VBmhGPZVK+b>B/r=i)F`:Y,ODR>]:$ko%Jt"cNU6;ChZb]o69/lI`Km,K4^M40qsjaD>#`M3LNM<Nhn`@VZU)U\r%F7NI(ofJK%*9m9.<kn6"Ocog)9W`ca^<=MprQZpE3<sjDW7C>J46o&[moYT_r].KrS;`u6k6oQ[l:dnmahZ`\A,Qm'`g`idO#Z7G\r%H,^e(g/C_42@D.!VS7?*8]mOohu]a9:E*SYS4Lj^lXab$g&8rrBe(WNT%/I^Pd`2n5<pmj0mAg8UqEZED\+<$O><5[QJTKJ9)iT!\r%)sm6lSCi"7s!]>(ak\uhqUYSn9AucgKYHiJPAe$/2?ojmd&2MF"ar</q[K/D%37S%YNQ#td'`<lih2.S:s4Xs"A"8Q5/pBp5Q^Gi\r%6rI=3%`!Vu"[FgK](#1#Ye5+CQmIXo0f085UQuJsqCS.Q%p^jN>;V=!a:#JJQSQ/+ROO%P3'\&5V@/)@!3QgcI-`B1!7i\ON/,Xf\r%qTj@KR7m)sikQ+EJ7hOO&I4&@"3E8c*cZ_BGo]=ele6g4)=Gsbmr-(EDhg/>)eKr]I66?Djo'kV06KLJQ,M!*?a%G[B.=d!mA*YD\r%]ng<RCoBHI%arn[B=qJ13BfLYiO0f&']IN(jmfaK7maD*!#9f6N0U!ndn7ZB-@Lmc5&lYVo0UqV3#g1O#[+YJcMiCQlr5+W$$@eO\r%ZZ0e>H<+d4ZZ5OT6l`/Afbt91]i3OJo-fG#A.`\'qWoMnBQUk!$]34XFH/pgj?<C8YDV%=9%q(Ij?V5'PdJ+V[?W##2N?RV7+>fi\r%EsMl!k1/\Hm*RiJ\V*%/^;\?@YL*a6R&Uf27>?Au[qb7C0FZC$eI9V\%;u2k+H.6m]5(:G]'.OfesE"VU=f%.V+*e/r0t"ALpT>F\r%.`=iolsU\'mKr>grH.T#e\l\]4(?P%Qs>bFVWr/#O-amA1cUEE$oucB9mn:d7c"n%clUZIj7.i3>cmZe/AAMUjd6(MLM=c2LP]1s\r%>6s09B"</,-0(iLrO:sE*mc>b*BbYW4i?>\9o&q4%imP"r2\RFT6ET]e\UF'AUCE!.cL*Lr"cg=$h0,iqD&]c_M-SR;c%6JhO$ZD\r%FV5LW8m-/_:kO[lg.-Y'LS*2.V(,6.a,%;tYKiL'e?k'3XC\P)C@&<"lG1PBoCuu:I@_hM,.6=&g%KMj"Qj!ca!YOG5H-%[g\U,f\r%bF^hFs0]83M%j3b::j&f2j#:0m^S2)GnVW-&$G.@eO9Dq/lLk,Uj.q\llpT/7#DurcEYb'?[4bJG+3-PM]or$LKR;6P_Z)[(E7[(\r%+.(`;kbmeXf&NIu68.!,;NE1c;^_eg=R,E!<rm*Bl>4aeY^rVl:LW.Z"<1J.nJIR$Y^rVl&)I\.Y^p\i3n!'IVEBJTn+Oq9Y^rVl\r%cg'^m.kXiQ/r5,h`Wp4EH9>#GP6;igp7c%[*h&>W"WKEm$#gu&!.8)+Clgs7$b]pMbGcN5PC8Ef>C(Rn"WLQ=LNr3<<j7/:`41u`\r%jX&Qp;NI`%Gpie7=R,DV,?"t.Ygh])rd@DT#*sQti*T.lH"a^g3"IpOeDh/9`<KuQrSXJ#L;Zj<jcTVF>YtkeYe9Q^CD;%t4^KA[\r%J:<tT><UgX:3I:<_?i%(4\K1<_2>l>+/t8'r!bB&qHe\*+lKK6X]U5t1)M<GPofEt!`$]]c,>oFP4aV>gTdW7,(X0Xl]#p"r4;Ng\r%fQjhGY.FCI19?+-Cn`MMAR[Hs=Xl<2Uka6`EU^iKVIH1jpdsrgBY[l81_\Wh1$"]WZ6YC5hNAXcA4[UmXEg1%S\9!r\n[Fc/`eIl\r%9uSI(`5XBs,cTEb8A-XnLLqZX<'C`/1U1.4>WmgjeT^fT'Db^I!o_!M#[]bE's6@*L(/fKYL>a]r%Nop:'/hqbsu1-oCrfD3;WDg\r%1pJ*(VBl']2R+n3KZr/'T[1JjT27*YkCh%+[F?R7egA>>*r:Nu4&tPZ1.+!8Q]7QnW"X*78c+1b1(oiKfIC%3EqB\8KZr/'+H+$`\r%T+EOc2@P"#Ao0l]`9OL$8A>tk4s?seR;SXYH^B_U5,"6"TsI=)SU/Y.T9._6`eg?fqh3NE4t:tIAfgdp^JBgk1Lj)U:83j(KV1&T\r%DP*$RUa+LL;T=t9qh30]H2&gXcmMdqGS0$dX4@dXKF0H$XfB85m'/s/S/A_WW[$TcfYsgW:42s1V9$,ahYZO4Ej9,*SDJ0=QNT%q\r%Q^&h\"_k4RM![I-[j*i5^4+>c9-4$3JYpl]o+r+Dk0TI@r)2.55[],g8T`EZo`sqSU\fZfU<CeUO?Y$'!rJ1Wk'fXXUDph$m;+j=\r%Mrfh$n*X?*ZTMA6I#,"=-k^5TEBh"jU1qD$3ct#rh`a%RS%,)FQcFsGO6mo/qlFF[h+rq*l/FeoT6<G-ri,I5Z;n&eL\]D6-T0S<\r%Ap9mCe?JXqP:q!^8U4EOrQWl9@l*c1i"J2HEhU7i^ZAmD,E,>qP"Vh!LUL-flgp<V1V#IBF[,]bINjmB=c2qjQD/cQ;S:&SG4IeK\r%eRkA"cVhD'AZ6[U[0s_7=h_?phD71gT&k<bi]X+ma%F($SpZ0Ak<qA]_/5G*)>582I*Y^'pJ:L?HBdlh"]Ddeb$D*UV^:6,A5K';\r%1EW:uSi>VG8PQp3.GeQ:T0r7Xll-u@Su$ZB1fr2fH^<YSL8?<UZP;kR<2o-DH^<[)V8)T\n%uDYcVhC\q3EAu]tIpiJ7c!5Zn!d?\r%"j[r4\;rXeDforK1?kplNfZj3rop3]k=48M`7/t>$H\s*W8/?S3FLEj@d#mO#+d.NCUHBoir^YC6<8su.KbeFM[^gLgu0AkU4@Yi\r%6?mOB<rG`8FN^=)qe6+a2!(Xn[R)[,n!"@Q0+69uN)WT3"jH8l[>ULi(pVL>YUFa&5^Vir,UTq9CnN,6S&9fN3YnLB%&AqPJYLjm\r%)e"l>eh>deH#]D$L2]6!m]2]ao#=b]I^HM3YQh_>p7nb_K55s:mC-EfVt%J5B`02g`*)2kF02&MMg=n[Q%%k!PdL$]_RKprXF2qs\r%B0,k1/,FO+)U4.0'9'O7]\7bQ+Vaak@rI+<Q]a$WHbtUSWS*nu5cOrDGB8#Njtfp;U?TO+2BTNi9;G0FoCq5jS'Ob7Lc^>,'2(fQ\r%%\JHXrQET!@``;cnl_mJM:q\e.L,MC_&>LQ3R193o@Aj9&YGm]6=tT\GXgJaI]qZ>><[sRm27KOI+DE0WQNi,4eq,-cdM2Lao>hp\r%B[PeFBW0G3o3"'1dYcEj?g$\C=Uagnp;1Gs/4F!<,q*;+k<53X5p=hOdLRBRn6*&(b`^AJ_e1D:7IrrL.5[]UB-B'iV8`bmT8O+N\r%J?bn<MtV!AKmul?:#LT+FB&8IrbhW0=*,eT$Xg["^K/,H"#1Lh%Fij5HG33"E\6Ta&JE\3^j<i<RcF-e)lu?l_&br+Y<0oI&i>[7\r%aK4WkN/buFAV.kP*1^pk.9qJnU]r9`6.um-]8a]MTV0_+4tD7nf$5o'a"ZpB(aOYuj.`AA32e/t!$L<5aE>&(M)K?2<t/B5NRmJ_\r%.h^.sNILo.[MkD"['/O?XO%i7(Noi>M**h_]-VQH$RQGqBBZ[DUbAF;AV>]KWaHDmmUhB%H\Qcb.1[1L/'8<pdH0([^plS76=d"L\r%*kDc`G#f8,/n:1%H%&\\'9<BB9Dsi.Rff6k:[FQkk8-L);4YO1D]tY&T?E7REB#3q)8P8J'2%g@%(a/!:PI08eUb(C,V>^(4B?,l\r%4fs0\ljT\T-?*[t;]hQDF'77M?Ll@ko'+YX23=k./"LTN6^!/+q?%L1WdsI?Erp-!_""\bGm!)Tf0)[#";]3kQ6!4XKiW''GMPZn\r%p&.<9S,=8V`^A\jgT/]q7Ru!(8h@HW_2VskZ*FL,8kOVPJ`[e+_/Z.^B[6S$=FqlopYm&I.1EE*5]o^SclCf<(tRk8F1j4u[p)!"\r%RU:FZlr+O$9dA$?E:e;H.;A)=1!gopV]`/R)lV%CCRS\FoYSHc7_^#o#FaZZ#<3)u"3p@OQ&Z6GJL]]g(D`TO^':$9aK\.:^'<CJ\r%l_(6/5]ck)s!RV7*s9c1.#H;9"fpAmOT4AnZMDjB%Xl)4)S3Q9[JatYfYhU4eV;'`*)O,8QsI?5prU@ofF2BOHqX<ek&Ab5ro(Se\r%@g5b=V':Rk5Q(P#?P5P0+BJThR"tQ>:16'\-KObDh]E[;c#KDp3'YY\I]9W7a+4kTbYt(H(XNXCn`U54$S`@P:P2c2_^`'A#l_%N\r%)m*cZq;BYGVXdCDkc_pl2tms2+$2mspF-I.X$W#2D0HBGrlXcu_4W87hI/keP&UG\oRt5kQF1L\D=2tTe'/Y&A'Fc$do2ZQ56hEq\r%`[>ReSJMiX3`"\HM]ob.8k2WMT+63qVc)B8NXM+1=L_T3+QP?"ps?EE29,RR_lVcf:=HK]nu9)Kd2WBsS8i$2qteY\"YKVikmI6.\r%.&[Hbf]L)D$\Wf*6QED0@NJeJ<57iI"pbVXpKH68Eu`G^H[#%9<9I;O3`4b+>Di/?6UFM]B.;\9T9Z#/HW0h.4bEDp0&NuLn"DhX\r%6,*(IY@Ln\pFO:1J<HkQpFO:1;Vnp4\%7mo@JU5bg$bC7nK)4a;3:5aO1momLE!,g/<n-54j51#^IY<CO$[!^(XY7?gQ.reH^;Q'\r%Gle`>lE@13Dab%H/`1>cMK+"=Su$[-X0hUPhm;BXE"=TRq4?]<aO$1?=c2qjesG;,'?q7Lq4=F-:J*_lPOBN?M0ti<*h]iQ1c2%p\r%gAH44O)3\+[gb/nmq0LAki5dZba'K.'aBuZk`k.TMKnUhb95Z*p)#+OSjiA08Hib+N?Lp$(\TLf"g1Iql$MLEHcl/9hTJsi<']L>\r%<=>E>l?Qj%^5'$?!!8Fo0EctKVd5h&-\cMgMSOG30gLnrpm.!Kht^8KebrN5=Cb=Vif``ECs-R;d9t?OEK>Ht,VVI[BU"Nh\]<M!\r%0"M],4+)gCGAsr@ZqGN1.;mHX\_3\tQddFu'Z<gU9BMBUmu\O?];Us6Qj#O:]1&AP0UHmOR)K8HAY%i\B.iGm0pb;@`5JmaaOIES\r%\W^pum@q*\:*V4Ri41#gR"5mUKQc,LL312ZY3,ZKiO-Bp]UHPuPh,I]%3a!Dd=[EZ+==Ia5WE#A;*)$:%Fs[c*rL*c590s&MsQQ]\r%D.d`0XC<T5<?snZ*&7P@991e@"<eG?T'\7E_CB)*,R/>_^4tP>'Ji#d14_5*#\#.+[_7Lf(j:li0D#oOL]r6>*A]tm11>8hRI4,%\r%U-*)ipoJh"RBT@Q?Tn6,@O;@KH*H"4--L'De;FGa'*P$l8NFF-bL>oKc_<PW@n!HZa):26(,I[='8Z3EC%!cgJj>QuS&]nL]2Q9F\r%.'&O?U-/@$nIt7tKSBGa\!RI';4a6.k;Hq(A-!E%=4.^2XiVLk\OR79]54O<`';oQ<:gk\iNi>p(dg)o$Vdiio@X(^pQO`u8b2VJ\r%=#GG)$2+cU=DN<<T)[_>Ekk<sR6eF_af;%_J-^Bo&k,F&T!N_?S&..4Sj]3i!W]c!+Pg0(-+t)a?bd%@>K3$LaHL0;Lj=sT+57Y(\r%>HXU1.e0dupn!&fJ^Eq9iqY<tj*Kn_4?/'([#TEj3UmlEgB1q!,dnSl9nb@>(ha0fX3[D-((73<'s>ki<EE<S)e0Q*aZdY1)iRLG\r%mO)0mjp#=ZFQYSp1bPmKj>#ec'qeQ:P;L1I/W"P":5la"fVD@SYGlb]>ddCg>0#a[ASo)(<j*e2[6\Xl%.3)#](pc&^Y_/SV^6d`\r%b;l7,kih?oHbMn;_jTl6d,[`ca0;"hZ@0%G:UI[$d-`+3S623"Yb]u80?QDE@*,d$Ail8WR>7BTk2!K?1o&<4O$9sbF/=YY384;s\r%+QH^pL[HjLg-"D%FJ?uh=Aj"-(P]b@lLP^,T#n()a8C`O-^_q&7%5t`*IMVJ8\c@d=0SSsTCY(s*0Tp8[!>uBH*BJ%VTn_,b_%H[\r%12WU!AY+:_QtZ*:@#^gQ-e_g#2I<T33u)YFJ\Ds6$VBO(4Q+/+#j=)"q/iTd[b<k.N-WW1<TJ]p\&$`Go)SZlMf'I3*hU7s8I-eW\r%:jbhMkXd0PrFnhOl%g]=4/M&9Pg"3'[8/rpYK>lN[?m2%k4t1i5q$H4f#\6-SYm5ed]9a876H5D9pC8MGj?rMe`>Gi=G:ci#Zh(M\r%ZkkCDX1Xh727[InP+OVB\<Y/_p"WNPM'a]bRHG"EOLKG!H*/KHRAZX?AY/r"86P$dDYja7b=h>5![6aIJaI12Q!rY7;rF,(JT,&d\r%7f!Plr"+<r(C5M?<T(bNI*!o'k^1WrD#3nX%'n>pJW4tu"%/DImcWZa5S(Z[B>9>,q*T%)4kfgrDJSIM&K#!V$jQa-J]5`Y`e5E:\r%\$qq`:</60=JO)@dD+trGL.1gb1Br'R"Q7^6.dZ(GBE'2;s$t76g+F>[smNle=TZl#:Jt/qO@EkX1(r,AVI1QmP:,enNM?WH[P2p\r%s+m#KNDCBr@J:GNX4@Rn#edn6S/@mXbK,K4HZ6s.r;A"8Ve(8(+/(!j!\EKapnWD-B&F#?E;O?s_VbbJV=A-B5N<F6Mu",++,j!?\r%`/kZF4rU'_CP?#/U?8E0R[N%K>l!"GWWcJf.H[i(M+4Zs+h3-s0jfo9(gO&!Pu#CIV8nH%?:bW>TlJa[fK5VJc:*MVp5*35=5dZ^\r%Ru[EibAGuT?%abB9)?oj`%6t1@==C4m2aHXf^Y$bj@6&W6\h&7]Md.b:QLmk_.+p""M0DtGO`oWdm?Fdc&P!`6S%D*`fo`*ah-G&\r%p0L)2NL7YBb<UnEM#2KB:4n)0na^)qB/W#b6kTMU(B*Iioc%orUhi5D&ki[H@lke%.nXIsA4\2kl<3adrm$d^^Z_O\qM4L\lc"?(\r%dQ_h'fu?QnL$be93o=@u+qB$_o(nU'LU5/6++'"V,s8#bIB\Tk0Q,9SHOAc=%?cf_,d%JK,q]B&/R=<'$3!pp(^I?<ZPX!j[p1Tc\r%o.9iM=9A#bBB^MBDem=A$@R2DmTB<5h.3?<GtjAge8(!G_g4%6iCpq4RCe`YqP)YRZ&Cm$\kUFeionSA#;5gqpMu&OZ+'784MQ.=\r%o7;@i;TZim>8Kmihq9%LS,?`!OleBbl/u/7jNTqY@%WUH?(MI("SO:!ok^9VfVd*[LINlfJ9n7lcXLP>h.5ZL&,.gafhB"X4fD`H\r%"\;Gnjr1q*EDF)k8"81;I.WV@pX>4?PhY<_h"X"G/)5NbL3,EC]#6-93%!DQfh[0+P1#h/0FQE]#]3-pbCI%&.2/AHgTMus.Sb[e\r%Bt#FebocSVmdk*FD@NEG7On`lm4g[6\&.M<c"ZV07to0dc,'#RLuS\+`jm$`N,49cX4,&^0m"_MpYb6W[MB_<[fWhP(9H.n.f3bn\r%<KBAmQhX,3koW,NV,uFMq06_8#E(0!";u>rBPF^lW-##7::F<"%Umb"+O<CA5fipea&4P7X+@*OR$6W3D%I_,f@$*cjeRL2M!Xg-\r%E`1&);0t%!j\k^868N9reh&`Yi'"+Ne_!SB\^Fem[=)FA)SOqC.V''*3m_s<0&_(mS4'#>i^Qh^/=QE_F!I[Uk5S,Q0L>=SYgoD'\r%eQD+&1I_?1ne,8G%AC)k(kcdDBjE6Q.bs9-<U<O(L>Ff6l'8R*?uiT8rtf&(bdI&#O_=W[3iHu4:607+oA&-es3R0-VuQs(maJ$3\r%&)CY"'nE@]^OmQ2rKkLghT_MIF2g;g,(NfK'114/a/8\0_-qtC4:UX\_CX'N=TU2>#CqUQ6k=\pXu8Ydk30-u?MWqgPYg$gM@]3E\r%UpZNKcq1irS[2FeFp;X64mqk-qGSDZ\:PcqjLL%CV9/Drn%pP@Z#&in[g+N)B3R3&Yn@4nJ`"l.<bQ)G!*Q#Q6@8(hk,0N;Z1JTg\r%*fGaOMrX53k:DqK!TC,lf/\`mXg0;A;pEaQH-#eq@Wm6$_dT2@8jJ*8EhW^_;?Bn-8iUGoI:tOdR>cbD^97mQ36"'^gWdAUCioKP\r%jI;bFd?irB))"-a+pJ0N*Yp5DWS-sdIjVAF2WXf90X#ESDdK&0>PXT:Vr+W5BWI'+$bu9/N(<pJ19YWo=RnDS:VS"O5KW67QX%s>\r%^Nk7BH%!W25dc9q!_p*%b&seZ=PnI3T3=U85t,>;W,cda,2l=(h\dQSqELM%2Zf<.4\um1nXkgpQ.6XQ2j.sB>1,EKa^J;^-g+qc\r%TEEn"F,sO4SF0Kg,hFZa+83LsPE_S;:alRL8kCp.S\Aa&ET]q%'Z?_)(0;rD/@Hl($,1t?0&rqQj]*(5(,u-9(CE\PV3[h?8a-+Q\r%RX9V[ZEd^aB<j.pcH:1(M7tmS>hs@IrhRV2%L[\P+g.&K3(V7GDX,RpQ<U?,27HgnDp`BJ3:16NRoBn=-GF*K-?Z^r'<C#se("Y1\r%XlTm?m\mQcR9?]>UdVafb04n&FE#]EP;;He_L%5VS!4f7JouP*5c]:Lj0V&+gfkg8&$qY5-kAu@Xu=2$em>3TC-p9+7j!<'e+Wl[\r%UQmYb\S[?NKiEs07:Y/'.M=[1O[:OM?d+5OM?HhneE9d=khKj*n@fQ4A[YMD+;N1!Zj]6M21d<EOD=aAVdZq6B#LYa:^in#(E>^j\r%`@FQ^"k<!06:`E[a*]dKff$*]1KkOC3?P,<Vcl@cdc\:54nu%Q'a-jhEqXEDeSkPg[!ESC7Oo3O0ruTrjUtI"2&&'LEXA`+k$lLF\r%F=8AOGW&aa<GQVO`Uu]JM/T#VQQ8@A`d<+J!Mkl_bT'Y7O3V3k=o5#:os\)?$;u"dTK.1"8Idg97eMqUOG`>+<W5B]aoYO_.Pg4S\r%)nc*X[m+U!V%>LpUSF`SgN<(cU2Beqn,V<_8$%EQb.t`*+\>-37=nP(poZjpX)rI>(<s8mkgb'=B'JM<_RNagZ*21u#cr<"#Wu+J\r%Da3Wd%#>C#q\7K+mBb3:e0aYKkk<]nP4R'm3r80Z/03P))dRe4j3>PkbI2-ri]]r1js_<626;:^lpE+clXRXA9'Ed0NL<V@?f?=&\r%lY-HnQ$>Je6S?W65(g+u@EeoN7V>plj"S2_&EpZhk=Kq8H@aqu%lZZg;uGItB[\*NZ]sXHgT:GUW:=IHcXU)%W*S7t`[DEkqFtD2\r%:FVt*`%p%O3KsE$2MZ#E1X+lmF8g&ehY&8L*4XVNpM-SMo:jIH);V[c;-0!-b#PuYS#>W&p<^?*&"grX)I;`qGmIIaC@f)g988<l\r%BcU*8T#``o>@pD8VK($f@e\#-26Uqh2G[ZP*8K&_>39=*,qc_rPM&YPB#94&^#eW?/&a&=a29aJ_LtDV]dMTAM(*66N@9>)8SbI0\r%pA?.?&gW#ei_q\C<oP_E-N5mY:\a]N=sH([69$j),7&BmMjEK]*Y%RNqo3G9gi7+qc*ol3O($X\4"jmopi/i/Y8?t*\""1#_h1fq\r%G-PBg`d==HFNR%P@d*/pJ=B[odUGb+<7!_:*nePoPAJW_H^M-AocQ-KZZQBrcWb(EgWg2cBtVX^g8u.SnPTY#'[c_33R?a.>OM$I\r%lNu1$>2Ksg^j7anQspA"i!r*`VHAEa-1A\N;p[MSGE`/kfK85:#i\R=b\FuUHl2N7j>$nU4p(l="MtiYP8nSj'QM"t]Yb_/dM-]n\r%?C^/6)i$?R"-FaVN'[W1_*GrZ[YmRFcT^=J[,W(s'MTA%(C.O\/W<L=Z]3A;4[l-dIf#:#c#&KNIUc7XP?InuM+1?\:.h*=2\6"m\r%e6.T@(l0q-K7O<3NGC+6*XtNWG:KjR;Q^)GU^".q[0QYt"*Oms)cl_O:Iu#`AptZbbWe/[;bUs$7ln1SfpNSGP38VF1Nl6_]?p%'\r%)VAHCc?):t1]D\B7f*:k*imNe/EbpWJ[6E<'gsbZiqb\7O-aS9RH3ame3J]W^7,Du<<H*8$O;K?:PL[`!-ah\:(9VDPNY$+6$)sI\r%d>=0iT[AcmW^EAr,oMjadWAZUe:A??Q%kFOPYEV!%re7$5:Lf_6MRe3&jq4X9+9s+M@]l\()hr/S>]`OUT_5.E;Ns4)kUS&.U+`J\r%R[m]'FdSD2I_,#-=`c6527PjMP7km[:*8lgH?jXC2M'adg9Wot^/lh`^pjOUNhCu`bD&Vsga!Gk<:?Vf\6CumD>$#EgpjnZ,o:B.\r%&eOp5*!hJi^Q8YT"6E"JBlN?@[#Q#tS-C>o3qb5@+bsSi4DT&rl=\Z>ou5@BFbsL>]Q9)#5DAPPbfi#WPN&S@pNA'tiG/X+Q.Or7\r%V6&F17T,;HNJlUU+J,1ckC+`/9Ums]C\QrPaP*=dQ%YPBR$<!#9#<Y)Y5L4X8Wt"hH3rEr%m\io)6#h9T18n])cDHH"cCor.kQfG\r%=hW7PEhuqtc3]E\bF>HE>_unVlBNV_`%EX*#;42bf!bP2ecLtS2s/_Mr>FY.>RAib*RlUmPUe>gWg;a=99gDu]opQZ-,!&fD7u+U\r%q1)Tcg$Md>m`Lf*mALj_K@jejHDP5IhbMCYLG^Wg8'g<iL2Y\AD6\J7]][ON6UWa.X'@P8MO%537o6N[XR5PrPo44`ih@_h2+qZs\r%\5nUJ5`7pM9GtI:V.1:cIt;hX6*:H;a<W"94q8ML*.S&W-7!laP,"HlMC>I.c/0'*94CHYA.9oL`kUu5bd!sajQ&nYA<*[9jC>Z]\r%-9p`1p4V/q.u002F:.&<WJM"t\Q0@U[!;q,7cMk9Z])3eR`cQUYKpPeLCF:EgGp^P%W+I]>]Rn)QW!2074"p!Vda_L@Jd.`W2L(E\r%(Ba)?7Lfn@Zcu_]rc<t_kC_t2Sb<:J]Gu@gWPQW-h(6,bmh^[sn>Tp\q0BP?W%6U&/R1?`6HEZ!'%uMM<t%Mc&V5Y<(8RUsB4Z<D\r%!>B%0mo6f&$cjW4b\C()8-f"4J])G1>^:VEjD/^>S2*IWGp1N_;?;-@d7:uM^;a8udlFsMY*6%DG&3:2q-)nMpbQ9lmUa`Y\^Jef\r%jXQ<=fk*(1I,D+Qk)flEd:T9pqg8<o^3A24`]f$/<d+(X:c^U#3nrW%*huR[@<;_Q7Iu9k_rqrg&4a2fN%Xbt0BA;+a81'II_O=(\r%(Ypk^e`^r1T?6mWps?ah]RQooAMu?3>082l>eW)Lo8?HD3Q4Lb(?2IBPE=3FSGihJG.X_=W"\IS/t7c[V4?sqGs1Opnq4'ToRMZ]\r%'Y06IUCij=5V6<Jh5Rd^R`6`&akUHGXH_W1#FDf<oMs#&V;MeFM:<ehWo.`NhB]'#B&@8nhG!Y&RBelRGs/aT(nJ(*9DK>]hn;K4\r%FCV>23KAi=8T!dV3S5\kj3-\.)M&Pk;>\ZATd`+kg<MQXf%gRNHr_)B@`og:0U/Xep:,``I49Cu%#\eRESq"?QCm>YWl?MqB9oQK\r%]l/*japq_rLL7ca;RYtK4g/A<6mdtpa&0Oe/S@=D(3rMUk]/mC?0'gj3ftrt"NQaHi"X!Dg2a'0@cq4Q(%goBqKql(@i##[#l[m&\r%Q#rb8LS\l0Td1,LN/<Y-,/^Y!'T1!_1AFSh\2UMR`M\mN:1;ECnsi+@l*/2#\'Y5,ZNOlhfnuLMPiV\:S[-ateBGZDi6)i21)#fX\r%P"H+5`R6`NI$2dL+)K.%EZi$%Li!L.P?(TH?\70fPd?^3#Tp$H^:\D_b-:g5@j[^EEYP?d[r.ih<kmP7OR:UhF7N<QclLgRKj#M/\r%EH&4Qa=_r,lKN+"hQ>HP\=XaWd8W(1;0MFO3(!Kp<tlRDV`M9Vi#k)emquWB;@;Eq+`a9)do@r%QSFBVh2:[O,efaWGW32]>K(eJ\r%#k,L=YRg1\BAT24bqpnqm\F'6].!)Mb2q\GN6.,q\KTjt60^iEmC)s&l/&;fir8;<(YX]jr-]uu.Thu_:!D#,:)PD@F8.<4Y^u#S\r%7Mk,fNBfT>h[dX=>ITd,/fI*T,5SAWLgFtsj0Rtm84nOQVVgJr5=Hc4[1ir8r1p_kU\cpV8F,.@NEW-VXq^+sBZ.*KfF3GY0s>aC\r%CGSfQ]Y/l-I-AjO?jFR$#kAPXV0*`#Wfkq-lk_I.Qj6,qh13I8Zg1YP5&jc8S8_"nCmRqcV00sUh_`8pL:sO."IZf:kbiR8>j6Bu\r%eh+)t/j2M(CIN#Vd^g;gSfiBe_6C;9IBCp:BR#.._=Rq)W_UltqN]V`?i--\8G5&7UrRS6/F7$UaV2#a?d9\l^l,bo"S&`_1a`)s\r%b1D--otQ7mclu^o\PhmE)9mj(9D\;=rN9/ZDYKC_<3G/d3GZ"bd7Y@BX`M=D`G.28JTB-BV,Rm?;$aB57jDA95%!$*/f.1Di7u\T\r%b@1$X*erT&$=TNm^C9Skm"5T?c_hlCje7d[h;IaR>91n9=[3bk#<feL)]YRqi]a,m+#omcb4S6[SQ5/fOj%[J4ZO<rm1rE[\aq",\r%%Fi@#@THUI>0Z(;pMf#l@`oA#@Kubm8&$TEi]\Z0X1@#)Nd41X7Q5ij!bW,5'm7!KjM4oom<k]R(OV;p@A-[ZfZ7S*>G&s6#UP04\r%HT=n85(OjGeKk^27mRRL;@r%_%LDoA=+W\-E^6VuNBe&b0@VWLY$!R`_=Y?E*H`IK5Tg:7eVu(FTHcH>_n$Nb3g'S#XHapTE$1*k\r%5Y#i[BJ_uqgpnPH4_pp?R1fPZ64i?O%L?6R$UGo"_&"[,JWAfA;ZDYP&89^SAqE9<E^8EFk,42/PM>+a&1G^&B?+]f3?TU4\.Sp*\r%_AIf1k^&>h1Ps%j5]i$s'*L@jjVU&;)/J;`N(sr:IS7Ir.r&m!+>qLh\_K8-?WqT>KG1.tQ\,"fnQhqu@&^SW`HRHM?#lk4$K'CJ\r%-fM[.fe+Qq@L_4[*#-fII6EZLO\TgS#ebQB]1CU-`Y%)SMUb7+O6bDIG4iXU_fdW$Ap5QO+++CpAJ2jK9=sCrFddkij9KOA/n.,>\r%&<?4""=XoU)%]]SX\*Ds,^_h9q=a!Y#5?QO;,5^oN1oEJ:ura:.N(m]+$)#8[@cb:RcSlT`Vs1Q<iY4,2gS@L76J`0)F5=ZAV[>O\r%5o1RmC$Kc1n?(%25)<D(HS_6+^=VOpf5\O6KTb+;I$<]>j6+/BKQ#:dDnHRT-@C$t[,\^AEik2X\YZ^:C:la4Ne3HX$$+*ZoQdZ$\r%\U/\NTe6fun`oPejZrR0:Q*@sAPmsq/Z?^&l0?=@8QbfFFf9>n;gi?!"7\I,i%QggKh7+l1O.i@'%=@^rM%5J2VHg]rcJE.?g?1\\r%STI.i+NGrlha=7^p*NniB[LaO`QBX'IXKHSBBknHBT2L#^QX:R4J0r6(aO_g-rR`s\qF[r8`71>=j%9qnT>7UEWWf8^pW@T5hEK:\r%<@bJ<_d7BWA7!JdG3Cr!%lc`k*Otg5)R,qm3cO'2FMmcXrgNBp)D)qn_/g?bEOF>IC6TEY]Y@FnXLC1[S@'J8Yl5N4jQo0I`[;`$\r%Tr&pbXT4K6&Ce%)PWH*NjG2rjlrAR,!6?:6b+esa8c+RPJ.,^:2?H9'8J(H.p?W](\K^%bq"qm!(!;#MSY,Uf^"!U0=p-0(h5\><\r%IM;elDCC7.S[9[Y!sNheJ?(r9i"T=F@'!e-Y#edP;@&1C2>J)=(l-SN"nPi1^B99&cL5e;lf[[S_Y'GDn?Kf$=fdWF2BkGN/XgO;\r%@El5o+qj6-&k/"24Sc(2h@c@\o55Gmee%g\L6'(")a^;4LM_t%L"kT.q2Gb5&Oc@JH6PXJM4h<)^p?SY;BcBBA9*f?_pUtbn"E'l\r%(k4ogZ%iZLpH?$bg'=&!FSE:d*,`M3I6ZZ9\7U3iVOdW+:[j]uBRY<O^s,#A75OH^*6fh&p3s7`,qQJb<iJ^SU$@f]b+JX.mNlFB\r%nman`HO8$?QMX7rP1qom`ApS6":^2^Y%%cNgL<R$k=GMQQ6qs=\+Z"RS#cDrM"-bflQhM,A!R!A2]e#!U2Jk:(F0tCI;_u.L46!A\r%kp8ns]2cDBV:_&9Q+P>bd=5s'=!f^BhKDN?5BV(SH6(s7Jg?8)4$-,aX7pek6'Sm5=c/s/$&!bVEaB-@C\SXA:Yu@n[<l"FiW^N^\r%T"2$V3j^CZX0XgG]9XZ.C3Z/.gZ'sSMFgm7IFHQGH*6%\A13a!K7De*+P%UI>MW?dU+K+>%!N+_rh49tVZ[o=8E_stRA!&7HsRc8\r%9'l^e$t`iWmBr]b[sWNV.&.;Sok6?*(;sqj3/#t-N_V,3\2er@#9*:o6c0tT<j!ra&:"oT''K<rdt'VmlWD5NEPeD._(Gbj+m"`1\r%''p7H;0c(1,1n3'lXJ3;MI;ct\@^RkZ_/G9,a&=bG.glg6\X[DA`aTBqU]$8cB10fNq"-3;2F<I?IU=sBMr2$rr@?ANSTA!FmgZ6\r%^:aK_anZB<GqEtp:Wu]lAJMT!N"d1eg&52X(^i8_o]!'36MRPeGr:(m6K@";K$aCA([e+DXS]C"qkkg2c8#:knG4!l(/7/#\6^*u\r%2nNWDC;W/Y0:M*(l"&/U)BNWIEgCX99[Rcbe[ejr9Y5@>:<rSeZj!L/(m[L%$^sTPQQ&'M>hL\fR(<K<6B,P::?,^HZO"AQ_(gBX\r%dA*bf'IQBBnoj'jTCuD1!3m(#^rM61)5"lYP7th%SO3NN/p>b!2EWLt2sr3h`m)Q6^DoXZD0Rt#"6-Wr2+BOVIU[J?hVgPqJTSX?\r%`eC`$@B9/'M8Xs+*udmhE21@#qDLPErWn7J2(2HQCsi/mh<.QPHmd2+_0_;^n2DqtFNMDe)ZM<ENAp:PPNM,C/2RaTHX:U@=?f9K\r%Hc>tr/Tj='mp<8[;eB,:h(,Z,&M%R!Nl71GcitcVCS*l<\7c.kh@C%H^(H/H"EeF4N[^!I7s7jr<BIso)u>-5Hh"KlCF$3LpQD''\r%n;jj)oS^#^.#CHTbn>>[T@XLt>YS'r3Ln`T\ASO*Ynt^Sdh[@'V0TUaGFpL3'!jL-kWj$GDfoO^HT&_c0Ef.7pdq<0!-cL@++;u6\r%T_EJV".iufZ.e.PQeU!EVrcJ<kt[3ZH=cM!pYJg9m8n-Z,hCE-?hO.,c]<Gc$Sl*tDi3(bZU="fP?^#kS8?K!Csr0I1FJZ5*ufN,\r%/tiuF7f"<f"I,^G7f"<fP`CYk)Q=H@<jE1&Q:kLIaIhj;J"bWld7D1,l018^'"Ba_.FE./_W'6iGS9UCPFXJhVUWm]>3qIk2hell\r%.'Rsi*1i+PI+_<\?35T5YPk9"I7sEImjt%nLBi#?)D%ICLUUe_4gK<%%^4+Nj4\rm3\6jcLBgm,%2R9]_c'KIW78rVG.Bm%jZRD;\r%n6d<4_;^l'G`(3SG&hk=nHRCR4bj7KmI")hjU3B=:84X''c,,[_gAo>D(@VJ<*280%aWf'BZoC,A=R0#06="5UO-G>lo@2-.?@Zr\r%U]lNd8=R)!nW(M&Z&0!GB>"XBZ\TQ+0>;.:oj)9rWkN:/4>^>?@I`\E4S7F,_W'6iGZZn"J]4s&$jO//#!TG%?[t![)D%ICLPPR?\r%'c,-pN0irdhH;u<`F/;O,j-_MrF.Hk&^XqUlo@2<>LHpLlo@1_V8M<GF*Op46%d._kO@Qp0@)2@rN`Z7Wo0GeZX4K&oEH3bSiqk,\r%:MG!uin8BtTSK5Win<4t2&WEc=M0-sRq#e$qPW-h@(E<-'6^G>r3hUA$PaH']>mOaia"+^/PJ8gYZVae7i-nk@;U@jlNHEobJH5o\r%A@(,Z2q"ldQn<(:Kc]R_XG>)r8e_."].;s076;"R0X'QUd!/fWbnd(TSe+(&UsY`_/7tql/bHPCbhZE=$uKb3iB*<L(E5Qb<pj_L\r%);J<E`r3t:;ceXK(,LHGc.!J:I"u^/D<?47=?g(N0[#re#k(uDmF6f4:"XqcA>_`MAM9M*P6T<CMS3]eRT8q[9tCM9cSbf1BLIhG\r%FA>[N\tc)a-%bjS5>f:([&?PH)T0/O74Uk@ZSoB1[u*Zf!dqGZ_2qFe$,a=bqu=f+*Hm'c["J+)n'B[j9XHXfpn/6ffe_]X5^Kjs\r%g#SIbDsoX3,;IV*--'W&h5V0mfjOst1%bE(=EC*hm=@mSnJ4i_9d594%-L@L0D&Kl](;]e]E-pWY-NUrP"j/@9dG.mo44%^e1uNi\r%,hE1kA$hCne73A)l"B49'@qj/Y9m%C%-cZ@-LN%&nlY1ZjoaA/mjj3dS3eW8!TGQc"6&4X*IRPi^O?KkehJI]6_R0njXAR<>0N?L\r%ko?J?[?r[#bPYl]>YAf'kL2U&"fIjD-Mu336G[<?9c=A0//1Ydj/u9&qCQN4FHRi;S8[(nTh&rkEZ.QG.YMe(jk<<-rIIcp"Y;)U\r%KTYXO"X]6Z"miE/6`#>'N:@s<_QYXB"`X6nP41dNI\O1L39a\s8'"5lC\Ea'bI%_=SSRpYQEaeI,jnnnBj>F?MHL)">*pmi.&pU?\r%ECZq*g9A'JUJJM#g9>;lM?puf>-pg"+5i<6Z;-7";7-Fd0s!#seM`;&MFH'MRVK4M*#)D&\--=Nlb9=oGS^hUPnlofKn#'APMYBP\r%nk+n?Cu1<mEQ%$ScPKH[Nlt_rnME#*6tL=th>a$5j)bVoNG#5Y)?GK(K`$JJIL;VSIflp0,sZ`5qSDL`2rn"[nE$hFHhbdrNPcjE\r%oes<a3pU&Jo4]#=,,EQs?S?AZgX%!c,n:TpdNN^O5AklU>d)t8,l_&sUdEde)%i@o`:M#ENc0F0N;_=0r[rkVGB)RWi<,V*;Cm^U\r%`q`?YXAZk!jiK/n<6XiO<pV&UdGSEe<N^OqdkE>a1&``9)&D$FJ!Sn!Mf._g6W,@pSY$Qp$@'XHE_n2m=XX9N$8*e3jtTAC!D;,8\r%qRuq_D#sFq'D2NRBaXq6+B`%O@9\7:Fq;&cK=6P3C#u&=>/JA3^"2E!ZeO\YRhalJhi]Y6Zg0-T7n%o5Xn6"2?(^j<m-d3<Fcm)b\r%-CMSN%lR0F+D\i[?fU)_RauAng(J'D;VTo'(I)m6P(^eFnC/qVdVd8m`F9i#[m,ELMQq.Q2P)NL(1T_!in\[q:`]TS7'>eWbfU#=\r%6(5@PJmpGm*\b")1gc-F0h;BMOV+J@U[.1I,#.Q5J0GFco(i";]nRTOKgWKgr=:.p=F`7#HuW40i4H>P3CoA%Q8DgZbs32b\uZE]\r%"ObeiX*"aY0-H6_S['kc5ao%eB+!+XJ@'+haoLph3@G=ZW=7GVfEPPZU%8f'AgiNuH=A]?=^:)*8LPW!i=glQ9mJOn[&-dPVV,Hk\r%g&JO/m-1K#L.&;WWon-b-(Z4-73OcRc`QEA<Z*Y=\&[SGbo*f*qMUDD"Tp2)?c1/Z=hr&7IpN.eG-J_2M"AWJTekA3p-/jNL9kcr\r%BE'n!$lM`2\ftos(c$iRL/RX\12(3V<%e<8IVp3_Ci(_R(TRWMFqN@jgcQ+#^VAb\feA[!_gP*?Z!f*uVI3q!fJ&QuK,d=HCfpS\\r%(MP[UY3VK2)l@Xa%-nuSVK-,/\G4'uWE^:XP-\SO"0n.$1M5A,fs&^M*B$S[DmI"+jG]d8"b?D@_Lh0f+IX$]'@^ebdfbNna06@#\r%<WU"iKu\d^QPnUcWW3f1"R-@kG6j,ok/;#.f#=\pI.S0GLr8PQ(C7g\'W\\B.?B_t+(4S?q39ZiV@.]MgQnEQ8-kni[;@?62em^;\r%8a^)%<c)&eIaE1Fn+q=j2kln_j61f/&cj:8hBR1+ic0]b"I/"2:r`B-X0s[VMV]!EB62DFh0$)HnTQ-5b%UltHq>JbHJ8i.bE\Aq\r%Y"ndHN@kU;n\IHZLrs6kN,=8l7gq9POL@C@6^W@$%*aMi@6>O(K<n)ad96:nj<m%Z'P=7bgm%0("i[%@6JKBn:"c[#>T%,._0oV=\r%o3FI8r3c=PZT&T@-g?R9haP\20s!%E,DK3D`h20$NV<h'':(+*?N[$A<i9`IMj3VGHV@A3I1J0Q%IK$h7B,9uo^\<=IP6HUXkDt4\r%3U#s#VOO8eQCo?X93PpU*16Gfl!aohdLosT_C@3)[kU[,B%$P.EjUlJq#Y$TF,UsS#gP_pUVm8p4!b@h5kee:d02.XC+7i'34aVc\r%\,c!IF]u:q=NHEN#U^hGE]/M+RkntB?kdp"=>0)l;B3KVldS7335FBT_Q^c(@2n?'`].egf>J9FS$p%4$(%_$7!'<%W93^b"X:NW\r%J4]RYe4ipI99jn<R$ao!?#'/Y'RZ(-CV>H5^\'ZFH.I1_S0N2:qK+TBm]K/6S[]'%Qk#RP>>a]Ukt\mV7B#9<<20ab5NY.;g_Pun\r%Kk@"26J*F;a6>k`)55H'Wh\hY$uu?$,!+Oa2'KUGJ6V0t!9()MY&a*4+[6l1U=l9op+R,ggu9e/6%>(c46rlc:C[bHoG>Prn@ePC\r%^8n%0V"EatHG5pdfu6`-dr+T%YNoE3e4qaF>ch]T]5)Zu#f+MI;6'E=.].BHiT(c0X^\8<IC`8pmsP_HZ1lub2a4ndV<R_lHkNOA\r%5Mj]q6QkkOel"-F+'r(7\Q7kWcRQLSP3$*5o;DIem1o:,@$`kuTLXN^n^T1D5Jp&,HF&_1)IuL@"77gh29;Xo#Gg0iRuFSEbcRC/\r%+.[&+PJJ`=lWU)_;E5U7I@[$iY+0=u.$dX5"6D`/\FOmXkN>gbn@GY_G/SF&l/j*f$a!o!+M5OGk<QZPG^a2t:k-"j`b56VZn*Ko\r%+E9r>]jQS;n<.'u)[oA$d>[(\j:KeMF$M_H2BZ(PDPEO:[t-@&W@"'Z@'!TZVFQK5>YYpVT_YX&85*+Vda<F3+YiqG^E6-bI&qe;\r%/NF3R'%>CDFEG4kQC&.BiB?hd<KAls)eh`O(Q/_BqZRip75Q3,bk^CnG0G4TOi6f-&VCqEpBT9*U%)H&#a)pm+o:s)S8Q&:-:+Y3\r%`.paOm\TPl)oUZZMe727VpItj+cH?^]If)i4#S:;gFKNPL7/>lr3')<i''6Y$"@"p(Z'N('A56P+N4_(&eEP9##`*amP#[n""@Pa\r%=>,J]'JE"$I^b,a'JGh/,L-El"F'rQ0-1Z,.:,8`9+Qi0'JE!YV-Cl'MAP=k`[,(:`=$@6EJGC,^h!IC!fZT4!&#`a5'Mg6'JD/3\r%&;*,P:`"-!HguV'Iaq90C8bJs'KKVF`="Y\`&2!H]i*C8.6!'6'JHs^Hn&SJ`='3Mbr&rQ`='I^H_9cYi<>aDll%U?iWY)0Jf%&K\r%!kRuM5RaH5_0HNI)hroP]c[Lo0B=e\2QE%\4OQJ^kPY0`e7=f4pZKNHm9:c2aYi[bC,Xt1$dD5B/OP$jo^It28Y`j_i$)FPF)'Fb\r%)4'YLnlEX2O8d/Q`hNG+Rfuej,u8rhljeN2J%-@Z7n`5@%0&B"b8h[<1d_&N4CEe&*21-44Eh^.i5;M_?#!GZb!GOVNu9kK*r.em\r%r[nrS)s-8q)FV'4Qe_?u^^6@&nNB(l<Ju5J5&Pf,+Tcbi&(5hU)*VU(dFOJue>SERoW!qL-bAg^$iVJoG:^Od@;VNdP<t!IgWc*d\r%HhR0@BJ4\>8*CkQcc1:+h`n]N5@8u?m9]Q9F;hV'r9/fb?s\<gjW>%A.6O8%D@e\TfPmQ=?*prG%=Tajq9^[Jd.;XrgV!Etg_-[4\r%XLOM"dVN\r4<ql?MB@=T#FtUoFV#%UX0QpM\#WAIOpYu9#aa#b1dSGn%=&Alo@1SfZuBX9X4WqkE;lfGVt$oR=Q#a]`iD9U*$<(u\r%Jfo`E[?e$sk.:,Om!89YhOuR,$2u?!<YF.L>BT<Rl3uu,8B`A&6[*u,6"2GelKB\Z38)uq6QK2t>ocp8%WuGsE=aDX^nEs%<upSq\r%6sfPbdrqZGkcJ3io0W5P4@","7*$23h3*,-OR2?3pd*WHF9LbEaMuA\U%!M/V^0.kTO!(Xe`Q<Y*d4ei>o91;arj1e#bV6<ibQA^\r%E4r4CmDoI9.TXkVIBe0_.iJV=iO1PE6%8A]/iWh=laCK84a^MY_#j?blIPb((RJ8*$e&KT#fiR+BTJ-N"AhB]gej1Y=[E:*QB]2%\r%9@pKiamrbjpD>JBOsO(XkIq+%a>VN/MrJ_dG?u]9cj6%6G3bPk5(8WC]_FM50;b"5;Q`=NYk(AU[$4,(>rIK7I',(I!f.&e34'L?\r%%DO:PEtr'M]?U4tV5lJ=F.[e%gQoR/28,u2X76rUWO&`DquVV>SA@OCAkRWS/+HA7<!9p8=(2NSjIY_lFs-uTqc=XkgP(e&Z!(GD\r%KtZN'fuE7.8<;CE#W%JDfEBWa0"oArqe:G1OTT$al-BOgoKO@$05JiM"o('/4]pD!#5ICi:LVirp0aMHQ^UOA<Sl5PTsAU>CEj-$\r%$h`b]Y%f0f]GGNejqGAm7[6CtN@#:P`qB-h%d]#%`%8o0K^`Gs:V]1KCO?t@'MCD/`2=)7FV9r0qUS\GH$!I+,uAl1@=SHscA+^+\r%K`TLlf=<fX/ds6U::Jp]gk']5$nE.6$.S]M8LY=`*S[X9l9s9R\uP=l*A1oXV2^uK-'=ID1-m])4cpKR\;d*"-LG=$I8`_$alWfb\r%$!'rSG[o.L>A+,M[a8=J/JdCpnY1R'`(gY0/5&3(=dMFECVZZa(%(#p_,,lr9PuRjc9FNL<8ZnL]uKsqoo;eb8f>kTgC&ZhVGOoE\r%&Ol1U*%#86k7(\FM!cr-p\RB&*.7$B8DU$:L3SWrm6RfiSB6Ln06&s>f*5RoCS@kn/q*OD$](a?+Q_Y:C7;J'XHsDuY-5QZ)=)uh\r%)"Qr2Qa'l>UneCldY%gdp6=6G9I5`7Bi!D#OG<0.UBC^-4b>Q"fBA3D6ENSDa4_RpXo`+<rPh4#q'Foc(41%CJ(bIJ^J"66XXT2j\r%p$;%?*R4$CEs%J5cf,c\5htoip+-\K2Kjn/`*fb)2t/g#b^e*Yl^#SrB6!Fj7tJ^cB6!F/9S(6h',f=%J6uRQ3;SWfYW1&kk15&L\r%$>8jE8V+q0_3n'<!,$7;#R)9ir1,;gNWh5uR)cHRY8NW9O(6MqW,7JCO4.5V:c%-O]X@adWIp>=48_Yg<Y9o4putT&Y`!TG:IZ<k\r%69E_n@?nf/IH'm_L3;[HDb7j4\irVHcMkaGBinqd(m\4NnF]OGX;8`$Jks'6"neP[ISL5Oj[qc#`I:g#k25b['#jl>_rET$J?k@D\r%c6<NV:'nW%oI"a%m#YZk1SgbN$**W2[F\u\WbSTOhqq[=YXR><P^n&tZjNI5VQrX4YIVB!Uk0t.oNR3o(tMTNL2[^U<W887BtB7'\r%Ep*6mBbC5eE46OBCGWg=5[rX#HSX-m.91AciW\s]4<Oi+]KkNqYs]"rG_':GLgfJe&Rlm%$\m.XLPUKq0/0ID`'B1r(tK((+N4_O\r%QcC[e+N4_-]spQ@Uj.I+bs='Mf,\<C`=(lL,=`1@X@q@c\m@KA##`)6GtRK:KBkEb7u1Rg0D)S_;[>i.Xq:aNf/'f[-_&eP@RUAA\r%EG>Z?Q?^70htL(mBo*Xl4X2cj,VANf,jA/VOL2q6;MHZt!_H%t!%q%@Lk-6n^_>Ba@N`?^dG<4Q@\A_UbRjph?Jth&jW"o"Lk-6n\r%0WZ)/5`-ANB>crB+N4`8/En31OQ$Fuon"#OnH+h'bqm6;#up=)K+9Qq2_=KNd`1L+;aeS4J<=P*7I9OG_5]?rL&m=K?VV1J0;,51\r%Db^me`/!C4*\ic9"lLmo4%7`["l.#]P>alg$d`D6/15jcMO5cDd<:DGGQB02qrAGg?Rnh1,`&.aoYN<Wk'GV;"ftSnaXKQWCOd*P\r%_"H]R;aeS4b@G*)S0BFh5T&05VhfXm):h$MLl)uSnrkLV%-UjYRo;_o$TLN(2.CNndd2`f7)]Nf_7E#C-Tk0p%7Q1`5Yj*FLk-6n\r%i5B?]Lk-6n83L!k&HaIg5^U]W@N`Vtkh;r98M\0kbNqN1`6_mT1COQ(:t?n[i<@"MF>ZX%GQC]"k\?:)n,g6=\sam#]E%_\XsV7!\r%0A*'$;e-^RqCr>G,W!(5Z_\I4de>$o_dK)?9oEGqf*bSQP1_)9W3l<%8Qrq<BW&";\"pnqB\+j#BTadfQ7a&0jdi$4-HQZLi:Sh)\r%RNs]%!3.!LRNs]%!)jtF9p/3Q#XqIN).(*mNDqc,Ap?UZ!MHA_Eha\O__?=$I,k\<:8$#[L<hocItA@fTVG:cP@TCa>]U[@(^@Xn\r%W+qL>n,dKoUT-m@_[C/?VlWHF_[DF.,gWeD8V\+^6&ZW,og2fFA;1mc$V+9^A;1nrXu)T9,W!)`h1AT`8S33u@;0M?bj^54qaOAF\r%A;1o]Ak@lK,dSp<<7#_E8S335EXS<YL?fgJL&no%WG7U?n:G3m/6.FU@GN/_lPq?[!)B&e-L$#V?-Y%>JF5+U2+aT,n+<rb)![P8\r%bBt/,RNs]%i3LVG+i=:2%p_oX3qXU99p-B#YYu(\@i3E$T*J*=;c,Bh$]m;B=-M]K60+GB=Q(enCQcp2!d6e*eKgRAKloO'ru\bB\r%9:N]!k?lj4YNqU6lhPmts)gKRG<M_WqWiJ,FZoc9Spt%ls#J^&9j7=74o`*bs+ak*2D0_kfCQ33q:G<+`:a$k.K$cKBtKta:Ao;u\r%s14eO?-g9gkPq(<q1Rp\?-g9gkPl^WF!gDBHN&%Ms14dN\XpPXMncE-g9,(q;h&*!^TQa,fCQ33q*4%g*^mPGfCQ33q1$KY]Y!r]\r%4o`*bIpLBB>gKb)YNqUflZlP-FZoc9Spt%l^TQc"T^0/6-@T7H^TQc"):u4Mh"L&[rcLC(\t1@\T&7]*Y%R%&kI:#clhT0*r9J\.\r%FZocf>gF21D837:?e=naeFi14\aA#Ar9J\.FZiq_%(4GbqUbC6h=V2gp"/m7l[&PQ4o`*bs)Y>UmVi$Tp&+-%rZ?/D8&'OZcbHXG\r%?e7(Cf5iNcRJCtg;g(=A:Ao;us14eO?-g9gkPq(<H0[Kal[&PQ4o^FGcfMs:P5)T2eZX=h*IF`8V@.k_ca'k"ZQ)Q8?1;-HVuUVn\r%^)ERt<+&h#%F5k@JEtli__Y!\`s)^0-TTV[,ue8S:NE8Z]Gr5J$J8kMVr8Lf[4m[;BR!jt;sD'lBR%Nn!REHK)P6Vn6u0#GSb5Z/\r%0Is?X%rq\VQ2V\n0iX7"?2b_5nW!g<jK%6bWOhWMn;O%Bg11+#T(+N=c'>JeB*F.@Os>,</>3,=(VU`XO4+:#@=FAAqY*.D72Mk;\r%!U":%4C=nrjknO%+gu(>\$h@@6=YrRhEos<$FSL!pg!jf&*5aaFhE:^l(]B)TA4n%I%*@"EP9sCJa]B:2.<PA4c,UPLj//X5(iiH\r%qBoHM#V85tU0'TNB@3(XD_"YYF^*+ddQ=SN`Gr!0bT&a\*g6dZl)peR;!%@)Hn#H1bA7^Hk6gsMVt3NpQg$0t@TR4I;H:H;_ki=E\r%TNN*BKZ7GJGBK`gbDF9n*]I-PDR5gAYaWiYI\9op+)KfTT``&.7XOJ:4Y$u/!:A?0RHr\<U(gl?E)k?E&CeC1L'U%/jqifG%fXWD\r%6D$WTGu)01#9S#ph<HB*jqeQE9&][Hi@Qq!^,\i-_<_8@8qCDVMNH8a#Ocl=C:la4Ne3HXBdB&6m.4V+Eqf9*9j_7DWX;`Y=P^[$\r%*9_kCBi4]+/.+*/"I4b_j_cA'Hqd[,^.uPfpT?lKj.5I&1EMA0.?eE2U\au[ZtNGU=6IQiKn,b([Ec&H"sZYCme=cc*r5Vamt^Ia\r%/IY,4hsZ6FmqkgBPON,fk5/:s*%Ka+XsZklo2=>8hu1X:T_.o;:;l;W:Z-Q"!W2`s:9S/kS_@d?EYg%9q572Hcb=/_qkYS4=?eI3\r%?d<QL2:u%4Y)TR]_cCN*2LBiU:PR*al2(\p+PWC./eSrmk=,,="X!U<mq6Z)$9ki#0CN7_DjeiYa!Wcp(cIl]F8=C#cS%WXk7f"t\r%((X?iJZ[7^:a#K0EZ>?CdbfW&q->`e=u>s"?2ao]6OnQ_i>nHf5PD7$4`R95?3(jnD.0/)P"j4^)2sRH3._7Xnc$9e/YPR*[%u9c\r%qsEreT@r&*0Ts$Ee>ZAHB\tB%TLlMK%]IVol!V3ZgBtl3CO7$NhLpub9[Q0Gb6QuCh+6C!6iL]bVkkC/NS<_J)6\6Fa1kLkaMrPZ\r%-2j:t=a?=9h]G<Jc-oI9GCQV'm8:Wg(\bN)Y?Y]i_omt0<5Wf=V'/#'n[hsF[;u)_jS:U,gl\r.F06n3diGFJh2_XE0?V%H,uDAV\r%#k@+ApjGH3c#_@d6rNFZ`E&)RlW+OEgq3d3rm@K/_d,Bj8jCR=UFU$*HeprMX0nSe$hS5;:";#^DpJ%b.EZSncAobkSu_)C#@tb/\r%I,#I>IeOMA77eHRZl1,<:X>4foR?9"M=,(-S*4EJG2:RT,P>,n;p9m1,Qi)^)cbcoG`Kc2Mp3p>Ia8&L2Qg8(/`<cE7,V1`aE+"J\r%0&E;4[B.]8OoN\Dr:U>,c!W3@eN6R!%>fSfaR!mo25k-JS&naOOift*q?/1j%(>B$!W?\o9VAnV:I#rq\D>Wu.t@Cil'N0:%u5:,\r%iI**/P"0<A,"On['e&0UA-h/(O8@H,@2/[$ek[N:0o/n@RCka.l!G-lEXp9e(b)omI/\8#A.\,Bpt!>u)\p!jiI;"engL12QDt8C\r%_I_G[)/5h[pQg[NJ)7nmd)HhS<)9)aclN&cGG$LBrd;/gcJO*?4CDOQ%3e\#oY`o-G,k-1G?`>8MpP#n/j_oFTOmZ=Qc3]IZ^Bt<\r%2UL\DmIel#G*!<=71l5QLQ;q^,3s7-Wr7ng:H>\>570!"N>]=JPHIrSio5hKp"i,!<.3n)hXQ4e>KXi@5=rS`4hb/f,tm_d.<<n^\r%%_?/$YUBS")T6:Sjd*hBh;&PKkh\M1-,:tB$stOLak7>F@Q+C[fIqei.V^kW^@r$hE>]Niq%<HWgK/<6M\uEomi]7jJ"RF5.uc[!\r%#i)PrS52?0\fA9pL$!$[p38dsc/"@dNg2c,Jr55fHX*jbI:Y6Bhb%bBiO01VpT(4"lf\*F<-TLEBI4^LrTCXEbsi:1lF-.3WD!8W\r%Jr"/<:(3rH#Sf,\GZiA%*`V<8p]=Waal=f$__hp^DGTSrMS@lEEAloRWN_c`IgH"*7P&j-7-K#rKoQqI&((<5!(?ikmP3b>2Hg$\\r%**d\B836l&TEq1rSbr)dk1b/;rHenkgM!^/F+(PqcFpua:`tKQ?I8W&.1%j+3"-a(8$TJXk4NU7-,2M`'snBn8fQlQn'9\#<Y0^!\r%PHt=>"np?@R/^'UFJi9BMB[Mi0_iFR&>8,%rd39t6iNR782tme/3Ma3)Rltl7lma>g[T8pR/#=9N%8hpImZ;$1=`J@7#Pg-mEXm0\r%TtpRRpg!2,DrN*9K"kRR&0SSU2f"]9)mo3dI.Oi<W`2WCQ^dU3F1j/lH0DJYWD/GK`sP)[(D`]^HB_"1R[$b;*1k=ScqW2>p\R"0\r%gF9)dgKW!?j7dERj`VP-YMA@ZcOgNMn*M-Xg\KNU_W_I\JM%qO(WAk>^XWO#3`ql"kBXR?20`Np')3qGlS$[9Qli4ZBSW")mI[Ha\r%>V=dD$D!fgd*1k8$t8=d;SVD7ks;KQ=nFs@eHpB(J@;M2n&iKC[oA53fDF#qkeko>rc%Qd+bkUmW;\l'[mXFdCDRJlhs.OEn2L<n\r%rMJ_;!8V!"^SfAQ%S7Tkh>8jQi(1UckPP4lH/8MVK\%QESqbB"eQ:/Lo%//;qd[>=]L_Su%,Y(b9m9D_S_Z!!?q5"WH=VDUgK^_]\r%g#/j7q3L>SSdjhG.rT:VosT"NNHQ/<hM*rGZ?f`LndZ@Si=k*^l)%Y89MiS)``%`+]lFDo\#?O@p*Y1MCi6]#5jnQmi@f,"$J'WS\r%)18DHm5[B%?d0,*oe+3/TT9,e\%F!*hW\?=pLRTD+7YfZ?/2>SDm*@"-qn*UYu]/A"D8!W^ANQZS]a-mB*f$r`2?66=mSW-#,BlR\r%*]J`9W?7ZQ>;P6<j6qhilTn.F<hQLtomJOo9:^9+s'6$6Y`7G_GHU,(cr],d-QB$:$!0US5P,T%/H<`oi'p7ZkNNkV0:A^ks#J)u\r%E_f7o4'rJ9n)5oKLnT)=D`qdY('9+r%*"))Reg](EQlqXN`=#iL8I?"6c[B^4mVo?HkstmL$RQUUr.$R4VsUJHd\8Y<*oI+gJt5$\r%JdDPl_VN.Yp2sT<a'QBpe[_'#fDZ(8r1m2eJ8glAW/E;I?l%I)S,k3QEeHhC[=tYqZHgKMZ%mLW\cAdOO3`[5o^<jfRqX&@nCeJW\r%?E4>Sq8IN)G5JP6kg`QI\tKE>qdd>`l$<VnOfu8c6D:%)6!3KQ-%n;u4M]ZcHr`Ao$h\[O)e$0EK9+TT\j4eWq<6d_6`bZpL3WU5\r%<Sr&1rXb'/mIdT3AnFJHK$I_ST%[XO$U2+jIO_GX?8_]egtj];e&)2c4(lF?Q&+=.[FX*h72tKN]%:Ofg@2V%rPZr2ZXj5Y3!Fi(\r%r_f@KrBOWf'&>;7T\fFekcZdRle-;7&-qBV/,H;fT4t)JGGRU>r/qN%c6etFrUsC^p\rKcY/CQsa[%L@78L[_\GAcC2U4L,B>*'g\r%_RLZ_9I9V#(.2c43)AfV*S/S2mO5*nbS+ZErF"l&p`M:>YL>i!2C]sOl%=,H%_Y'&i0Aa<SDH1B77?nI2A)-F`.a\\ZpaDU.PG^U\r%5^lF<kPTFJ2RmK<VgiGpa*U:BmIbq(Q-=0$*\%DYc!U8,UWWK2<aWGO8#,[\%QWbmFn,.nI,m!UQ$mo34G9,^+@6i._oo[g6S/"b\r%JS'3f4R[cJ$/[]@kgad6r\6E#20qd^#DVF+/[:o[1h266IldbInnpc.qEN6*kYW+d.OUuZq[2fo6=mroc0+p3_geNo,-u\<]5Xq7\r%.IQ#?CJ[FY]D_uLm^lVkI\4JKoO/-e)1G;.!f0oQA9^nY)#iQjr)@c$q?N%RVSdo[]D*Ja@V6kg(>DESHCM)bHMgJ=eI)9_.eEG@\r%&GhsSY-?OcMqPpUl=?51(2LY+K3j+BcRfo2gX(Oo,):<*b$W"p8&AkHYDNq0S<m"pglURSN&u<@e>(f;1YD,c^m"1e?iFTAR]B]`\r%>A'5=NTj1*/i,]1LV)WGA,4FEp\8G%YTsDkNIaG,hT+:kJX'DgK?^e_R1in!DYe1rRsU>>"?mn'f&R[Z2hDSi:'0`JrV&E'<)4RA\r%n0[&,rU?#u@8^^\Sf^1*`,5hYlWlPLHjQmj^M\Z`$2sL7FBo0[Rlfi]h8.(]fD+)nNp(>WlAiY)Jjt$-I]>MiZg,_>,@$]J!a"t6\r%o\iCN**6p4?LY7onl-5pF`kD!D"[/gW=)f[JbJ0B8tpZZ=Z9D'+[D>`kk.%ceBc)SJ?T+YaS%]Pqoqn>p25Y2Yo:.023;L71Dks<\r%Zi9X/n_$Y\a59'K6jaQD?B%n3BF[Tj-2!=Z7WV+piDjS]US6ti5bg=bd7j4uA/`]9M2)!*k\2l,g&)YSl\!$"W`KO7VVAWnbs8%b\r%o2td@9+2nTCS]A:5biX+;N3Ne(hh-ak`PY`:VQOim,-2cd`m8NGcEMI=[)3pi0ci\3$n7Xd=U,d!(WU9UNFs,5);Mt(k>QO=T27n\r%rjc>0,OWI8&hsr4[cfP-pDji\[cfQIDeY8/df;=dO[+)sAW#/W41=B+Q<_b-*&K"iI&o)N(nkeh(4.2f?);aRT`[A79Y];RAX)BR\r%.Adt7B,R>hS\8m-c8&;Z^#I2aCmNKD:%:3'L<,"1%6RYOU+M20MSt4u8LkmKB?fbd`J$'s7.a-FS\m5JpFW</NXhCk._[W$;bM.Y\r%UN,E@^9'JFX4$Iq"s(A2=g=-n8s:uWjLG[Si/7ZU@%biR"$r;`0[Rjc%$*-[PS9p[_IIcqPA,?BWA758?7NmF5MA\1V*ENm5!+DS\r%[Yd]Ja>Jd;>#M7LS]p!Tn6'j?5MFc+.mpJ(*(hbqT;gTfZ^1UKeY^V`g3<)&M$ESA=p6u6KUq<#7c[b^aH^D4IY$63Q#U[,#e,Q,\r%deK_3$eKpd?OGGO_mOo#.@UUG[8Wl<7e5_T0&88g\(n,Yh=H9h]Ge^u*>o&Z;*BX7PZ/LWhL7_DRhRfeOW=5L]2/@.r6<rpX1:[$\r%P"R>HNH\)'2)0&5L-&aZ!@O-F"1(9p\/l'id/(nBguP4S<Z6r3[(_t73>Dm1V1*HA)j+%<OHE@\IROm?-KKRpg;8V&5+6oRf&J\1\r%h:>Fj#e`.m_Sm%P1u^e_FIJ^TPKKHhS!DL5p/:"%?d>A#Y=1_T?B=")"*c$"S<"[tJ[jfM^8$0s-;aH3pTL/0b`rgsfA,i.E.e-e\r%]IOEur74K^`CS+I"[9A&O!\/X*q3;BHOaFE])W:'aEbNBO7Hs)S:tbQKuZ@?:=LRiZq6ItJPUu\UG0+90?+l\%t*QD,P4/7&m<3D\r%iTa??R^a<Y%7kA!Y!"mpqjS%'2f5;WdQa8pkO3`_q='$*8_c2<Qs0VbkAXNam.WBdW:^t#WLGGEs)$>r2iaq70:QBlk-Tlf@-?JM\r%%e;RN@/Xk]6aQZ5MK^oMNlW7RkWjtgcKS'M)spFcU?sqm%#op4q6MoW_=U*D^.26%B\cBi/),oYm[Tgl^WrJi;/n]tID]7]'].##\r%U\h[^S(\Ht_4.NiG.H`_W-oE9$+nPYN>Y>(]T6d'>qeED(@((PFgPm*PDT1[Vi"T9ruS[OV9tATs!5X!E_U4hS>O,@p?P+O.61uG\r%Bn]jhfq,+f#$YLPT+r:?#t!Von*OnfE`?J61a_pb?XhY_+m]9NKDoFV*q7!=mUsOl)>oSiYRBD^]sPs2lmcT@IUpHnFRa"HHG4`]\r%"6HnQ.!As_)5+!/EKh,<]5pMC4pM3"]tW&nj@oR*AM6kO#UQC.6ne>_ZaJ'Q>^8K\E`^bkE_ZH/>,,2IG.M$Hqt0S?9UkHZ%lCtb\r%`L0CmNV_Bn:?JMe5QVuWNIEReY0J(8f:#d9AiQ%;lb2.fFg7rr(_W6m;KfE/+258>6?qB9ipuj;;>EAV_WJF^OT.!ZK`,OnoO_*H\r%&>i#Wq0"b&NMV^BUOdie?B-=+79oV634mbX'hRc@,m$u(*Zsdaf&8"O`8+anNaV!/"a[HCnIUW_RmLe/P3#o'%j`''*+Ap3>/Z-J\r%-eMii'ld[U$,'gW79o+6kGu(Q9s1,2k,O2&ZsH!6dBh]rQ>Ld-@M3u:NsM?aB.=V&J]6!i:S;Ll][`nPQXP%"#b=`(cJ":.(mUQ+\r%0?qm.\dpT%SqL;aVh(VH0B&hk?`R2XA6i(nqgJ6Qg-@%7,FT]I>an$5*@s%ahR9`>./a_m^8oTQbt!H+[Q4/2`QHb>BSOg.g9HZ<\r%3^^)>XF6ca#L(^[PJWI]mqkGgcepfh3J]k;-nRT-E,b2dHPaKc"7@V'Z]4a"rP!S^;Ms`tqQ]TqD)OJi/W]YTOuXNO]$_@rH<4dW\r%eC:AlSjW)X;sOj:0$MNq9W^)N=YMYX0X]3qEJf%]Y<Pi#o):mret=tJ^oi3'opEB+,^p("LAT$T#eCH'Y)%\Ko__X-DfaD#bb082\r%m9C_bs0S;E1;5qK-[XsOTs@HD0;dj'2#EsS0+F1pOqF>NG9ucTp=UgSIGn`1ak@PkbWj?jWc]]diJMRHq^(lqo,:BE%LHSj$j.][\r%MsOeBbkWXF(VB#IH7gfs*,4(RT1`fd3q`k@n94UTqs5!cQ$2sNqs9M.A3nC&5osA]>DHif@Q5uRG^Yh4;Th9FZXI*QI2&6N[Rb>G\r%13K?<%C1nUSsoJj*qg2T"f15PZ8g@Afi4Zp!g!aj47QG][_e)A'"u6H"X/!EfL<%4/Z\<%)#!I.rPKuWNB]NN/>/6`.k90"!%HhV\r%kC\/0Zo0Hc5Js8JrMC_Bo'J:1W5^OjGTSB.D0r%6JCLsI:X6!]/5r8C;Q.1r@Z\n9Up0#9qa!CJOM\>CMpGW=V6#1]fac)2#)%E_\r%_%+Nn9">.(noHO:;Vtj\:ugISe[jc[J$AS9i=G[g_ON$B5,(LBYte/<U4$i1bLkGETW+^(!qfG`TEQ4h!l<QZE\%sq<elSgr*Dso\r%Z=@$&p!S/JA9KGH"]*4tQ6?X<1>`@DN9d3uj8-nkV3po4I`mcpG<p/QoLhd%4B"P2E4`O^iiF-.(P)$Z6.d^mgC^Ral%?=6+#A_V\r%W2?7nMm'?PLd?K4I>PCs:=U7hf`G7?b`tnIV$C'.s(82k0EkPI.9>;YVXVaZE1adL4<EnmoL]:j>RgEn"mZG#&\uq\68oduQ#9(=\r%Zf+)Xc0rnrTDb`.-c:@R:Is`YNdhOPiKZ!6j`:d4Ck4*^L?*8eh`MqI6^<hh=>(##-)I"hJ601pQ'm--b"l+GaSG$e+\qQ$I7rL`\r%`eaf8/"NL<27Sf]i#TT`>Jkm9+*.Rg#iKIA8"TV>6n`f&)n$VLHsZWSX2B@+=2?aVei^^ZgJ3d$`'11T[jPWK$bQ_H(bInCPsMlr\r%leOas,u**_1Kn<Qlh1I0l,bVR@\4bhC!XRY8U0-_dB\6j&tak*LF#E*(Z!Jfe\Gk?Hrd:H:3=7#7#-/UO7O3Ca]_Q&@2OIQBMZ'I\r%[+OkNYet\m_rTui`b<mWUW%u6Jt:eVd:1"+BtO\-N#!?r$e<@bN#!?r$P[bbN#!?r$_R<t+I=P8!_"S%jDrCU.GhLV+I?q/$dM?p\r%7Z._J[>a3U_e3]G/a4G14KY$?c]ZRG>0,ficU,s3Z(?hP$/tQo<)4gteBINuF`6%ij>&=IclHVtV]qCLO>4[S:IP=idWE&ZNZBV-\r%no:c(<$]6_GDrYqMSs0'37`C*dPD%a3a4`^$#iJ$dLsX_Ra6SUGFO];!M9O.V,IkjT$O-1$ejOFd-WE7)LrOU@I0$Zg?,_lZ_6<M\r%>k(tF'S/9>`J2\?[ml^ZJJ:@A1T0;U1lqc0q)E\MGNX>hHMWqd()oFF.oICJ"qp^4E@"!S="r+h_76-=>f$61JQHgcZPXK8J1J_^\r%M#"QR!F3aG9Nj5DkB?<ke=aWphOWK7WB1940!+Er:#%2+dAl70hjXqW4:29ugV')F]kc.oM7]7X,cd?Lf&!IQLP25ET]+L%>mA,:\r%O0-`9K]"TkT;$uI=(^'0:EkN.[mo2%FQ5/JEZ$^6T9pAm3gW-h(Sg^B/ELn+^M>8I>BG5teGrh"G>\U"Sr76[`Gn'sQ&OlJQ&k:S\r%B9;10.%Ofu4l8hkmnsV4dds$jp^T)]CjcKo/q\r-*@l@n32j'"3c5>:+_>cNL.-h0`?k,t7cOi25Ztp4#&`c&UkF9<NJ?2na)"HP\r%`MDd)iT"1>DP=u<d$!8NKB""p'k/,QN00.#j>WQU4-eI+,M80^8@fl',[+H8/D.O[oiLtQiBrAcD]L!'b8&"3=1G'S>Nf#<$+<N)\r%R61et7^-H]b!9=u+E_JgeWsL6c`dktaM&OLIajckTI.S%Q#B--PifN4RAW.7o=GCcU@<8k'\n$I(P,d)T'iPcF;q`t`7#`#ehk^,\r%3<E,D?92HW&6N]\Ktgm"muW+H8t-k>e.*AH9Gk?RiH97V:jHSnhdi$G:1pfkO:`>oF0+Rf1/&ZC![CX!%-`.ZD"9c6l!*//JY%d:\r%Nsp@F)54D8ZB)?\O[8;pTmfpS[`;DC0h#[@F&6)qGK9cdW22ug\uiVfpb@Ii#4.X._iH5d12o._]C9=^%Yn$Ba8[QC6^QcP'Fl#/\r%cL37\Qm2B/@M2t#+&bQL9,X_3_N,M-O25U)muW+t0K)'LCcQ$^guL?$`&jO;0Ho0Gfg.6RekZ2sH>ZWMYZ7ZpCg0!);u3ZKeSOkL\r%U)E+N@sXd>,l4A2/+XNU%(uCjD8*\\:)`gsa]uT$h<pAPf0T;rnqq,D]/YSE[Kd+s83'tZM2M-CnFV2k-(uLU#.T-epT]>LorJ-R\r%>qH3=p7"rn1O?[.jm5QV?0Y7Iq_uY[9_92P_(YU:5&`1H`fY(e-I!oVi\V]:lfL5BO>\@t"CPU^j!A@O.Wo%fkMpq8D%G&VAeO*U\r%]@(B%<2qX\#))/^'hH/^EULJ7CHs<F.X5bpki4@]C("sf9iEJ5pQCG?!NCQ>Ej;;Nr^S4MRfFld:RnuKTE.UZ3!q(q)G$RjZ5cKI\r%##]LWV^7RJ%A\):S=S?+!D(&&MD^V:oh2H='_F#D67LMOC3ct\,EdZBfB:Fq&Dbih23:-^N#-)Y"s=(fZ3OuoL6C<SF]jQPe=<dQ\r%Ct<"p;Ef$C"q<gic?s/72Fn$Mi!?n.9">.(4rPj2)G%\$e5@^V)FuGGiY%Jr%A\BA6dp0^D`@%\9;.RRO?/gW.=`+Y0$BrQCES=S\r%bN2RC23>]?Ve&]I23>\QfJ4l:)Fu=GQkbj+%A\A.:s(YW6LU;N&QUZ"6-DhO3k;.$KlQ5IS,uprO6dTWV.L883:D)A'jSkY(i,_c\r%0]Rl[qc)gtDX9$,8R.EBbeX3Eb9a]=(UUWcOLh2fC+L1p(WoS.4IO//=g`^\)rb-ni9J%sQh.&u!BuGf?'>(67&YQg`\`&3XcD?e\r%fDF#q#UurekEbIG64=)d:t9dZk))'Qeh5mn?YnWJoLJYFRLr.OcRRuLe/;<UiUJdb"KM(lIc%g+s),\E>=NTkeW*Q"2)"=EQGEQ-\r%WkMa7[/9sR];W4BYcnsdR`3Ci"%2?$RnL$e)%Tu!?oV-:gD"2C'gl<#(A/b5Q55+MUQ+Jb@:q<._7q\2(c2t<q.rU-S9nYrT!ie&\r%JY=P8)-@;>;p"5WhYc,ePn<Y%C>`fUQ/#q;N70)&fhWljolS5Li+"tMGTX#CJYUheDX(/qct`*15C;oknR^MeJ-@]^Y7aaOE4oQ0\r%[Pl!a*N5q/>FMNG&h8fOq8dWTLbR?;(1='j_GDV.r&[1,l?Lei"4n?!E?i)\iM21k%C,I])HrgiM^ssn#Le=s.hY]^,@%@GTDkd`\r%4*J!%kjIt$(^Sn!<)sR@WS$@.[0H_/=Z\gZrRaj:C8hRC.YE"q)[)Kp<!Iaf)[)Kp<$p^b=V=seC2^?ZHd-iLRE@C_hD+,:1oqMa\r%JFkJXUO2*-iil@03A'UG"1!3KT,mFo)(9E\fWB/'-LDW'=laM.+!fUG9'TkmWX89Z_q^SX(rtM,p2(ZY)I*>G)%]-V>u1t9APX&%\r%%0ut\]mP8b1*G(n,cLKrhQb=b!?pSV8-nQkJo==D4W@Y6MpjmJ<1uPFi<>'hNTn#@a3scc-_rMnA-1K%Y>Y)QD=\<enkO/eB6\]'\r%ImDNf-L9*tiHZMuJiE\meT?cL0feh1L?F.Qcod9)HREM%1XWt.JR98Qb(M28J!sHdUTD+B>lBBkQKq*'D"-n\3dU&"%$Dkdl\2@R\r%0o8SQkV\2t(L$lHL?/MC"WOo?,afF%85#DZFsYVcM6t9:P"87+46feBA[5:.D#PD#bT,A,+b+VGkaoXL]%<;p6X#&\flTAg^TpmP\r%8F4EP:m%5M;HZY?f')1$btGp_HM!,6X*&gn3pO.SZJC#4nhDc3cSmJj>GeX?8+Xo&_1G,#PH&j/QN43G:MT]^eUf]\&tC[sGS61I\r%p\t<'S\(BVd-V$TF=@j:=/G^-Oq4GRk6)/5k&%?tM1NuFIb%ga<Qu<QlZ54$j*'-W8#Y7[:rQ0H@?GLV1#9KV\8aSj$WVCo76&tD\r%KQ?L5?NX8b2kbsuF3b"mKaV$PoQYU3D*;RWmcN6bm:u;S?MqdZFsS4JX2?kD=%X:l#+'u,1"XOn5;[M#]k6;W@Q@)m2p`XV#.[D.\r%(Hd+hggl9AN>\*Tr-=/Q>Y\D=HdVaD&%a^(0J;@ZF'dX9&V4t]V!G/MUU+\jornUl>ZYgo=nUmZ&["h5JL`S[@Yr]iDN?W!9dg)]\r%ifA=X\t7u,6%;?&+V;Kl5M9+'g8D'S2;0KDkf"n1r+OJ]j3E_Bg?,J:S/oT]FuYs>N/(H:##W?3lR8sHSFn1frER)Y:hQo('p.I.\r%F703E&h8%[Yb)oWgOo-YBuTldBg1rW[tAVb\-bUbp!m>Zs1L)eD0>('TZ+=MGdJr!^IS$pEq&)g!bN^;#HH8_GPO$B!\(o<Mbm#U\r%YX;H[2W*S4-4m:X!%IO(5n0'!!2R'SNXf#2KmS5I?LD]]'Ws'S5q1DN$KpnVH+CNf;Eg*B9">.(dSqTRQb+1ZKkd"::s(YWno5@?\r%au,9dp?Rp9P\VCqTDgSojVg\g:])h7.<#/;XIten+D"BEZQ^h,5YC/4/YJ=<8<&qR^QO*].(GU1.G$i-a&,)Nf0IJkX=.A@Pp@L6\r%j1J<IWBc@%hEXFAg&k5:)CX\c826L?V#XCi.61cbD#u0M-n^3OY(;fQM46g\f0Dsm_)b16[Z`,Q'M?W$eBYWm+9boo9;.Sc+GCJM\r%Q9ctO5RM-208!0*JJ:/-QU<4R5YC3[Ad5):""D>2C'g,F%AY-FLBT&:%A_pm&>3!%B^VUpm(!7K)ShuV^f0(*TD%3X*SBq$T4^AC\r%Yo(t.%)TV2a#WqM[nRaJY.jPg<r(HZZ@?NM]1>.B4>m!S!(]>gV>YUhLJp3:pf$qd\R"tTm\<B'nsnG+cDlp9I#!">>rmHZ5L`_^\r%38#+@Me^dT12Nl%WBSVpYh^<'hr?-*C@UPX&)6&?45e(?)R`;=#"_q=`I-<5IhsCXdF2Mc2C]XqpN,-W+V3>DDVDF+V`l`Ob&n"[\r%1QKM<Oq?Q*HL*a\qQ519)_Q`nB#2N52eT$`ff?-AD-@4.gud:&:#X<BO65fY.6FYdQT/W%GIsC]X+C#Mfppl<I!5A9k9m#l_=X-6\r%'A:Umm*P<\P_JG>=Um)A<*c#9K_i'ETd\$b'R$qIm-_3rW2Z9nI>S8NFqffWQJpB"nMtplDPMRo1IZ-Wfb+D!%ll`magWle7/ZsZ\r%2*QMA)HDu?SX\chA^``>#*5oYs#LTgd#fL<Cl"A4b8jRO#TVJfUf#\AP>f0j8BuSqa%,79LS!t&WAgGO)2o`Pl*-.Rqor$5]@Y75\r%=6KR?YZZ3<kDO::q'ZXDNk^VK<O!1^%$g9Oo]EKo,3aEB4%A`%1[aW:"I1#XI$?jPMj<>m!!X?'?o]ke\u-oe1%=kA00(3@Sb^X]\r%pWP?tFln<?N)u&(W\^9)`D!u@Y.e`<T[\0h`!mW<?]6S*dpr#t^FnH[A>Opq#p;.>q3$A6Ga]=*Rg5cU+W/=-oKW'pQ4bUE/j-Q,\r%_\+AiUq#qs!X68WYH7Sbr#XC<bU]_Xfh'L'ZZLh"3i\E,6=<utFS(T=@?teU3#_OG+m^@NLK4uOPD2^fC9sgK]\_lms3>6lG/&Kt\r%*.bfqnNTJ@[,\Ff8c)6D`(u+Ol(jci1;22":HI`a<@@3j53Y/PqX]V/kp2U;F]*pY:HAgAaLS#RIF:[ua2cs_SO@Qc8't6C'(lrK\r%lB=t`8bXt68LM'EgZDh/qP9<K7$LXt<^,c*32_$HD`u_tU(A.EA"Z<uBI]j(`A(<e-`Nb%%8DW#LQ7_'g%@fY4tG3a^qXE40i)iB\r%8;RQCWDp<u?OH9qH]#U*m3JPFZ"]jKhbNlD#]eb#mc]2:SjdDtVW+d>o59;u0H-@k,9?`Uj"9(c3`9g6FD*#hDOV*:6.5(Unn>!*\r%F'o+o@c&5ZU.?;ZLplYWEUe@jo!GoLEMJ]>m(]=?i"$%oWZ2)K[1#8[+644@<.dc7^]!g!YSbM2aLW=OGO#de(tW*O$>:b`5aS:/\r%MIh-LVbF5mA:=?SYU3'K_*?lOIPl#`i;b@(1Z>lOP$7^!n"O+\7dHe:0bMFcWLG8Q?Do1$b=A&<5HlVu/*"[6%I'6B90W8>HW'_C\r%&7;O3'=s]*F'j/fel3H_cQ)6Ij7ITVoh?KX3Bdc&f6F%_U8U1_0A=Q2IGX<<Im2.q[-:&%_,Y/?mDWMbm2i:3DS:Dq*GFS>Hk9Na\r%j@0Z7>f6DD\FD"$_r'8eg2#;nYHMDPRa4K^P>l#Olm#S(U`WM/B:J(pheDo-)MYAa-to/"T'fK,-]3DT'?.d,9.,T9n!kfe?hAi/\r%`R4pnSL?==nNZ)&0b[4?T7`CB`QF$Hj[A'q'?/F+n?4oN2#N3!NtVWpdb_aZM;g&jQ?X.Lo(ZYY6ij54QphSEbKo'PE]da7*<aXD\r%Ie_Y.Sd1mFD,Y*P*1s@kWi*HRX5L#O+?k^L$UX'$RTF!r0X@YDLt0:SOLY0J8^Kg\J"t,p5+_%KkqJA[Qq*g94l#+nQ`26jR6j[k\r%Ju5?2.AD@8jO_;f@\OYYk/BSL;d[badSBaL`K3.^'ueZEq"2-3:f0pbac6Ul!id.[!HnRi1`@n)[`8rJ+cNK-BD/$%Ed$]^b(&7H\r%Hudtoq?UPN8(Am:>Z6"Ho3"%G.&$IQ6/^\J"A];qkeWm-K>mBnr80]JFquQG[l;nu*uP>]E)+C,@jP0F<q\Eu],C\bg5@j-PFImd\r%?$($pUU#;nf%9j`/>)d`_qD*a%_!TmB(2=j]RLuWk5Y)u:`aOTmM[g0lt0QE8)Gi#mgm1Xb4#-t+o!SCU$>L"M9cO<C"Qe5lE&m;\r%anPY>:AY7Y0Y!4jCtRE65Oi7kE,h>OK_NN?gY,\o@0ur*=a_;+GPGjU:uJ+(I*@mFKoB>$;-(fMWkpIOj6S1p2DI2rpe6n69OUda\r%b^+HOO;[C-d;h?0J?D3q+0,el7[M[>Z^.VnKh,sl%D/Fs@V!DpC;UPLVPQinL7'OJ-!Hu_`Yb8j<aLLGDM0RRPujB`C7*2FXtT>U\r%I4A(<n#a50s6=jlpJP=o`Q6oXX"[H#T)5,#X"a*u[I:*-.K\TZoN`HYX!i$H0D65:M=KCVT+r:?aT4GX.RBG;MeF>KkJ/%-@U@3X\r%Z7ceI]2h:`Gs[_2A=#]Korsun&Y`nAehie/C,o4]ba?<ek?AI`H/\$Gg"5;g)Uqg,e)*"glIun'^-;d;%EQ"Oqe6Vn+[@plD&BW^\r%W(qMHCJe#[D_bb`Y;Qs;)>"NdW=,rJ(bPO"*T9'7bM#3mg+/>h#OEE"MYSBG0[&sprKENY9"r:SKGhYuaVrAT*aet]+O"dW&",1_\r%8=8@7N(fWo,g;p525/6[6qDrm6Bg`5ZFT7/OFqFlcQmpjc[tjbg4kK5@Z[510S2d?,MEZ^1Y&GN7]%k+[g@0DS[[=[r\CSC*2-*A\r%f3-j*"e>?BAR:h#rS$r9%#8bU>8O2g,:JKurp]((`#gPDI/$(fb(W(4rjk$:YgE2TVkS:3^d@5-Jd)UC19<YKL1]Y/W#b18fNGeU\r%O0pY5jB/SAR1t\RIr?:q=1WD`I0P2EH1+V-dFM(?Mfq#?*cUk\S8H3*lhAraP/<!]d1;Q#C9uU`D0`dd`c^iS\8$LdD)D`[Ub,b!\r%EdaI'7Eo^fdDn7B`j.>.kT`hTZCY8gD_baAOnIM(_MagI.I8tXg0T4,.I?'!(6H\^kHBrAoac.SH6MgD3rd"]ZQ*c0$b\dKJk\D'\r%iC3AcH^5tY%PNG.TQqPl3kUj*fc"1]d^"\hM[Y@WTkj%#U#i7XU[@#/]^rH7P(nJ]>bsI0%PM;ZPrue%E-MuH0]_amL;Sp!0BOAZ\r%NI#hHl<>=H*@jZUiA+G,SL;>q[tcC@SW"Qj(B7pNRd45K>A'5=NTlFWV-C)om#T+X3*,(7=0XTO`*nP&:'QQmqC-)@ja$TJ;A'(@\r%W?Z:k,GGr^@uU)F9;<T@6nm[JYf=.^boK(/,/RgTCI"H0dHW:jQn-'MJ(Yt)19O<Md)fNq&,ODSorYN=/R2o\FOZ=QBuEXAA8@sN\r%84SerAGD%Xlcn*AX"+g9A.P"4i;1WRqkJ*PHZ#K^^/.>XCRbHGfhm,4h(FMKX/F_sqkf^C0bfdB.#B>u@jiV?D_bHf[T#epg@[*4\r%Ost*JeBOq%3#?B<al[>[\(S^00Q)lu4@^;mPj:'Ufu2GdMs-0UaX4G;=bQ$*(>6XW,E$eEKg@W%[;l]Q.PSpj[SA0h=e#o+M62tu\r%nXdrIS(Kci(tC<6ZAG]IM8@`475hDn1,3`qSl0$b&-LP;;TF2DZ#qh,/qqtI2R.C9D0.XZ1I5QC9WX^+1<V#!S%9l7fK,F&;P^nM\r%-FW''J?rXG9l+*aqIg44L[HDPA0j?dYM;WICl;=?PAF^oA7COBLT>6#lXXJo+^pL-Cn46N,u(nq-FQYr<bFt9*)o=K16ZN`lSfm[\r%8nO1.1mqJF/f*-Yooj6MCgu^@@aMloa<n>j-MDFqY%XA"/E\7ic6eQRAme2KZMSHIlO5<da!R;.3gnX@;*ZR#kn@5C,rn`4cR-()\r%;NPLr'M>n?;RiJmXo<>JUi7EqVY\J"OA_GX.k'Kt83oJnL'`W&+Q_W3TTj47"k+JbTp0=8L&I4%5q1DN8uc9c5Uk;MC(Z:9TTj47\r%2=J@b67IAHX;0Ok.@=";$Dgu0.I;/`$qdcuAMT$=<'Vp91MU\L#5>YS:s(YW_Wuo(Um*56]4F57ZTQF(P\VE'j':&d'L9f2"/T6)\r%.=%NB)G7OE;G-Dp$;.i5;DKn;%Ad;3.2jI<EXehkF.mLn3!N8Qns:)UEXegpZWIR2>QZGE*aB&K>QZG.*QT-k\HYrH(8jZB_AGhg\r%>ld*H'371rbFk)8+GK79E[^#f8BIA*2(/';J4gKD5RKXj[Pf$l+Jj5-AS@iI!)diSl'dgA##^Vf!_YI>&s.](R0=sL%AZ8d`e'D[\r%##\:6ZJ_O[JJ=(jObT(*##Zd#1q#CnCEVa!fPjad,ZZ=\!\%Bl0]8b.JWuJ^EPkAQ9P&5OUsRC?6)dspb7,h1%A\B13%8VcjZ^AB\r%#"V%&_1IlVY(J1:e(N#N3p*6>JX#/dm#mQQRa,<%PHkBj]$,I:S<Pmm6G"NW:<FJGfueha%&ACgA\gr@""><>H,mPYUo]+]S1cEQ\r%.;L%0dt922.;L%Pq'`i;Uo]-3loXL$PHkBjJ1OfA;V")?Z>3T^;V"*jO=BO>\;pWc^upRY-Y3a_E.<fI-Y3a_AG6:hL\lH=)c"No\r%8ATU\_+@c3.1LUrE4F67Z/ML[JJ@N%0]8b.JJ94j(7^UHOS[.L(E9?dQ[T`e3%8VcV5Vd)*U]+SmAW(ENE"+FORfrk/>iJGd-Y8X\r%8Qc-E@r:JTE$(ZOn1n1+i83DBE$+FV/3#(o+9`EH/3#(o+GCOA$of\O+GJB1'2FDhM7_rHXP\9hCs5jS706B6LS<Y%>QQ@QqH.]7\r%ej'S7a:($WCETJ8`Om/XPB'.JF&LRS9!4@@*puu(0O>7`iJ\oaS<PmmP23HE.$_I_9J06;Vr&ku62l$ZPusY"e(VL)Jh-2\bKB8/\r%'O62E`@INP"]pe!i5Y3@k`A7lHhVLgmG:R^hU*?RBD6:Yp?prXg:`uE]n?3PHb4L8;8ONo!j>@F]D$)u/7]Bn<],`WS2"]`O@a'Q\r%P+.bQ]6?sb1<JmRL3p>:He7.DZIuji)ISham(/f_Q%_meHcK(3^GBj&lasTP2m)"cQG:)m5\'uqj5W7f,[nmueV+6ZaG*oZeK!oX\r%OY-AFAqA#-ZhO9#*tu81-hCjAmG:R"^Qu"1C%m't[J@9L.j=O7[Y7QK]0Y`E5W/j']6@2[GP=5jReD/DN>(hbPg9_sghYd)6_^i4\r%DkRh+NQRF=a03&0qdUNlEUgLK&KW*Wo,e^H-.eSeULlKMk#!Su=^ADSHVg7)/=[,>W%=D!,L?6=OtSo8FJCV)S4O[ts.m15'2QG`\r%[4YJ^?fd!_XQ*01O+)h1_Sm%P2E1]"!#bRLQsX[<.tmV[/KFFPS%hBI'9jkD)<Pk"bQO3!?=s";,c_R"F4c&7TIhrc4?_oH:,$.t\r%9[Lg3g'Rc.%G$*5N<<$p\_K5bd5V[;[gh@_a]Do-FeEO15fj=[M05J#*4Y1Yc<[!MUb[&$A`oYpYFX`/l@O)L/aagV/g!T?]6JfJ\r%3bqRM/fAe?;JWBU;tTsqE7`t/VL?cU_##BnUq7K;Ed-R)Y&U$i^-MAg_^MF.)%ti_TB\djK[>dif0t2N3`?o&?M(&lVpd((n]<+(\r%&YPmKYMKj_06UBEcLh=."pOup_^/#,Jbo=8Lr\-JHi+aO/i:c.KF:1dZ@^9(1Rd=,r5X,_fZMeIk+*CN1'LobQc'5Oc#7@(B:UO<\r%%WY]Jgp)H9Ir"&h"E=<\*=hK"COn6p)<=s$>[$e6)02:f+5b7aoX:lU?.1#^c(pa1\TIJ"A#Fc=hu[P$/'%n?T]FfZ&DXTd$j-fZ\r%J]A8XGY%jSO==hk^YQp^CFEl\K.MD0YjttfkRgi+h;7]M#t&.q3=?P/J>)ZpRhcKaiG(lPB2L`D#bgk00#B9lPIIWBNthEEra?I+\r%]SD/o"/*aN8_6=JZL3Sq#J_iR=rWcmTAe2@Ia\i1q0![n3/6tDqa_$1gD`SqFZ:uDPOiMocfD&(J$QAOT`ZFZrsqjZ[LRg5s$(c)\r%'FoZ91T(IU>&k\ZI;=/c\M(Q%UsQ,`jNIORMVR`(nmr>MY'jL6.R8A&=L&lbQ-UCBFp"o<ELp:</&gM1cE5L#TI_s[dEA16fcS5o\r%TI_(H"]I@O#%cbK@n8>lc'ZV6ZS8F);a(Sk8kVWh$(k5WHSL-l43<C$:1UeNm#,3:NU=9O%QcUmdPmFT`LDf;44T&VN%FXGol3V\\r%Z5VI-1U>M`/A9@Elb\-hD%>aC<uG/jH8/J==oT/KQq&#slA2)qgZ(jpQMO;<h,,g\ZL%1J[PG.CPBe;"iA'28U`Sl?Y$Kne<hJEk\r%?aWdp.uqlrQ-uM>_&\4$R-Whr+,Z_Zjm*T;IBR(E9n"c_qcl8AI[d$/V+G$8Q?\h4q!M1ZqYVIsn'@VJHrb&!L&.aVA!U@nTX(0<\r%OlH!(QQ[6)P`$j\/Zk5A]#nr<<dhMoKPT%&i+e9T+"e.g8[O3JCSSB&Da#)[B@2/IoO<k'H0fLQof#qViPco/f[^d/f7OP>0s>gU\r%LsJh7g;;B55@l[-%pZTU6:2_$Xn.G#Zsm_j`gaVM26@_F:L<,tC\QoOcb'A+jh0GDjVj<W_04rDBG0L-'CoIoH1$r=M8N*]jg;6b\r%5>aBnb-D,`5(hTo6oEV9D=2PAmFZgTU0k8J6a,+U<!;1n=^i4WGMNj1]d;<M*`:>UYteLS8l'qDo7Nne%=E*gU=n0^9$^RC.FAQZ\r%U0E_cr2/g7"l*4s%<-Gl:siCYZlULP;9^6g4DYibPfEq`h["7]l_6#8pa\#*]qtc&>CM6Wp)F$(b!\XpJr8u>D$rfAF*Ifq#\ZNV\r%/-ak?)86X,ROo\B&2'AK@l-LXCENO,Nt>Vkn;X]6[]H_LI#8lMeNAdhKG*=u*XQ\;'UdO7D7$]`NO>'p's'%-EdH+%!h#]5CTN4G\r%m+e>;j0QBUecIJG"km-^.V,V<a"M>Xf((@e(21l0CVdQBDQ@Q[AR3.J(niNsXQ;(HQ?I^LbtIWUk0V/R6!MoB9/?h=$>ipU/N5_1\r%qHBG[!ha<ihgm8%-_.]]$?m-3c'sG>WY/enoNdu[XhobmD-:@#[#_ae>D$BFq\M&u%5WWQSb#MPDp0?,df^5KEcJjaNG]3%Q34+t\r%-'1ID\0Y"JgER.q&K++OM'oYX;d>FjUb$erG041S-ft8^`/BbOP\VE'j!^RbCEOqr/s\c%jj/;\OA\s(ekEuAPN2P/Dt5e"Lt6DD\r%.7NoG"f8/Ke4)Tlf2,VDlamCOE.@iAa8&)0T.u*<M\]a[RXZ3pJdS/A_H=/N9CI(5(Lti:/D/!:0imW(>q`G(f,g.S48R&lkpM4`\r%^l";s6$Q'FhpTfbE)Tc=,lFWgs4f7)&J*7?9bi?+_HtJpKE9;QVrm?u#Qs$X;bt6FGQ'WiDhK;(=WANd4uEd=)!JR_o+YHEF\QUb\r%';b@c%ZT3/.2f=53lf"`RC)kaoAmu'A,Xuo^+l/r<$qn3Y-mB8i1mfEXnD&,$u2&4Q8=02s.i#/45&du%dbd%p:o_9^7\_5FD.#J\r%$a9@?6]mGX]27KLs/&.F3fIpL/ShF6Gsa/P>LEC).^7<)-,E9ebSJo@m,&Z7ba-Qb2d,$)n&@jFEM%XjoR]/a3<o>,H\k;`o^/![\r%rSVsk1CToHr:pF9W_hL$dJn]!pG9Wu25L@>-Z]4[m-(@;l_]#4H'Q-DkG/!R2S+H^5pt:tG2Q#f$H\o3)?a7V1V"97XINTO+)Gr_\r%i^P5ZfmcNhmiO5VN+NWABGM1098KT[$X>RCKl(q&4@m9G/R"Bhfhu[L1g?UeAujW0BssfW/!d3;`811ZZ!l//a0AZ^O[]cdhLdF\\r%>9qH/_IAI(>GTq=XF"NYg*4cWqO"=l8@+$A"@I@4/^eI/Os\LK[7/M[8\GLtW\'BG$b^&/<Eg`n(;e.O<Eg_<$JmMGW\)Zb,JD4U\r%+>=O[c(4G4#Rm7)frc7sVW'76__>)-OYg:F][Wls12pj=;q9GDN1Q(YCbe9U_H+'5@U`jnc;:o;JhpMq`)O-5dVML8D(J[kUpA[_\r%KF>2kg*17>n6*k4[1siu[\Qi\V.tpafg<(mA(;>dZN^4C>LaK\Z\:SsZ"f3h`qqaHWibBO6l)dSP%G(tG;*$6d:fW:X0tQf/`;fE\r%WjYHe/^Wsm<GdjT>Nd);XP+k4[Kpau/lc+$+Q_WcX0tPa9#b>iWi]\"rlQ>.Cb:ce)61T"`XlYEQ9i"a]flt&>6]$MfhY;<>=7Ms\r%d[7^@mhd:]G>khlKsMoT^$ct[$MFAMG(RJ6k7H^c82k=Lh]%E:Q56G;[u;BM95Stp4iRImRYB4/oq?8LPY&?QPu6ogDTi,8?eKc"\r%q`65:7ddBk[]p_4cHGT3:d8`eN['tZm9`'H]pTGTUL6nWXa!_8.HWOP?u>V.k8!!(?*YXW^.VWAo,]4S*PZdoeQ=Gje_':mRRPAu\r%j\@[6#1#Q@n18^.OP]SW_:<Sj7%o\58AB:0b,>u-P'])crRR_7iXVJfT@j[;_IBn'X@L8h\5H"Kbm$t'c*pqJQGlq^g2=URBZhO^\r%eh&D(`":.RNV<sJWNf6X]-=*,:1dWfqDY!<h!LA"F)U&+00WTY[`(N"r6"N0l^dYbOY@/<'<2R*Hdnd!Q?d?3J-DVcK#G,<-LSMd\r%JtulhEW8><_.peB5KXm[jm5QXL-Y4N++2dR*n.HKAqZ7AQ`@8r1q:`+Z9b[0(n/<koI89c<N?qjK%1Xa$%FL^9UNGr:qT4H#<P`-\r%plNT[IJM2D""4oV.R:QbhVR:?$+OIK'$Pr-kn7Zt_5p"t*kSBZ@=Ks%(E$QQmdHV=jZ^2H",sl7mYVt:LoAk`@C#/IQUX2!4Ya0G\r%OlG'j\e*TJimEg,H1ZSr/Hm"u<RT"=<jR69N]%j@d2egRPPp`AeSS')-jFf^<9A*0ij3=/$:$=UPY+pX,D>h)4oV4e.$cVUAP93t\r%\t4s=o?t,_lEB.b\t<G]5oV.OHO/27)gjL6,:mNQ(/`bt"7Lr1L5O,a:>?L9%2G/e5/3MPL;nk/g*N==>1Fu:/+i`=34X9uk./P_\r%\TjBE]Lje_,o=mkMd%:V<H9hkjC348=38F^jPj0[nLD*Es(udrrFC8?>eEZ]?6pC,J5kp1o27791>g()7J#mu@S"\J(UIZ\;CP/,\r%(pas*8)N7`[orMi5ER:bg10(f4tGEciB**#l-a%o/0([6;9BVrWh#ka:;L)D9KTX8e77YR"$L1Q*5_;$VY!^G$\=L>;Q,Rn3<MET\r%:(H793rg]Z3@+F</.UG5PTjpumI6s"S/9(dA&A9bX@c9Dm;Va%9Qb**mG?4'rFrMS[_nk`Z<s6gGBH&bk=Srq09aPiCMc7O#<0%J\r%Yj*T#>m]-']l'Vkm,[XM_+i]HZ\*b+@`Wg-'f^ek8lh(>.;VK?$j1[O:A//8c7iYh2IF[=`6L&EkMnZBYu:noK^-Zn:%hCp4^r'H\r%MtQgtqNenA7r($if$'29ZNWa%X@h:^jBIru2>!g<Y(aDS.(:W^KSLNM5\9H"=t?"[kDDaPe@+q:5W`J(oNE!1J_:'?O4hJ-?EFFH\r%@9U1dT,dp;fLb3"f#)Z/#eaiM66gtBOA&Bi?5(Mb8@fkRA!0On_/&$k5O*lGW@QJJcZ:4BWk`cNq8T&%FJ=,N.OFKn^H:p^Gn?]#\r%X(9%\!aM4\GtmATN58r6"`kFdiUTq4Z6"YI:>:(R"t*K#QAVDRJ#jj^q4gFrVuFJTqs'g3U^*eeShteKmMOdPfqB@!O0%L5.Zd5f\r%l(C2mX\_M@e+rM=SmKnF^mWPLANFi=Z\;5Rq%uG2`"B0blB"#aSKilZL$iD$3=A7^o=sE=d,qmln<1+3Iae<$B*#J!BmI".KLYaH\r%-YsQi1W$OJ2JimWTc1p,VW+df0tIZ87_m%,+]G'9)n]K>@Ofmf>FnjaKW.e?.F^%X0bl`n;d2pa.9QVEAL^ZN!d>>!1DP;%YEd&A\r%T[EYG\Bbn.?_Tl#.Q5Zf.Rpf5Jb/[k4JDUnKkfFK!'I@3ke5btkG+N-;&2:6;b'i`/k4?V6:+/Ol>4uGaaQF-mejR2TC&3Dd$n98\r%$<Llt"[;c#CS?@<-S'5Ph_k'a,k2_u+*2m"!ft_0TCA.c23%:UfmK8)lKs?FpaRD:JNdg]#<o/R\9gD5TT;/"_cTiM/pstN@q_tL\r%@(O7Pq1*GS>O=ui,W@_D:6.>?hrJeKj-,R-3jt$>7-<b*Aj?+_EH\*W="O*"RhnZ`]f9!EpW<)EWa"puIg;G<(*?Kk2WbR*ot,2'\r%;dMK!].p[<XpJHBV*ht'M?k5?HVbeMofGKQAWgi3feK`]iZFD6C_/Qc1bjj<f$dM#gP<aEW4^sC>g%d5*#WXKUZP9UWHs^`\NH1U\r%?sbn\Ga-m#PUf*Y+(mY"PdipI-\Sh>lW`[PVe(KU#URQNPob/:ZV(Fil]LSH<%fIFDT.]';<$X&]2[NdPfW\;NM`M?r[P3K"Hk5\\r%POHXF&P->"=L=&^4f\$uZ0>/GDs@srlKe@m%#gs3Np:?mSM-J/7*!QU9[W%C(n"]riD>cTZr/Zu1d93N_4*ec!tHJ4kSf6%eEFM@\r%H;hFqVKV,]:?tR_/<;s&aHeW)m0]2bTLi\QQ=fNL-MR?+=6EeK)a..ere[l)!E+8:mbH6VX\.C_Hql/6CVicVha(Jh*\.(TCHo1D\r%BUZJO&r4h=_BCc6M5h+ZIQ%NQs'^:uHJZZtHg"X3EX7n21gU\0"Bh(ek7I@6c.Xek]RuM;8:gK1,ut61I0pHMAIrr5)_Zeme._m9\r%K7E"s6rqX(3r$bLXVr]4*;`ab\lHZ?i,ZTtW6hV;h/?qlBM&`O:pn&O%4t9bd`(Z;B>W6i4/Uq.FU)@e^I&@c_(df2NdYm2Fsd=/\r%77N9bR6MLgi)3I;cA89<QgX`u'b#Y*Qo\9ClRt`fk)>B*'d"&1l_WK*A"#RU<o:mWH@L5JYe?&TrTn)^$jT/H-1>4u%(g)[[0t4#\r%07N/Sroef0U]-$T:hBQr3lC:u*l?;5'Qq.In!hr-hp"\@f?1)[%7LBOf=bZeOmrE$Y5[3b'g6$,Dn9G?\/V<o=c(qilGVpTmKSM0\r%mZ(b=41_QF778RMjMXYM+c:ienK*4EA(m6[ic<%*g28BV2t^*Y#5b&KPPH"QdWW[f[^N"!VAMp+V6Q/kRgRo@-;F,K9n3fgEjZHL\r%=L=cBma5lEg3u(9S!uA-L4`NA+YX2ATX,Wb9M<_)S29dd$FGqQW70+8W-mfRfaG0Y&#&juUa9:7IO+sI>T_Wgbf-U35/1sAon8fk\r%qs9M;&mM#Q%/767F42,?Clq4fG4:iT9=*?)4Tg`NdVRBSUW#b#2\cCO(kG)f$4ik%Mb:cLg"@*7-CZ-<oWSNTF\tRR3:@SoRp(rU\r%=D@C_XQ^'c<kpo]K!%q]?D_gu>[;SJ="'JA/Er%]Sau_fUJifL,8q!n<(`a>+6N/Km)9LT_C6#n^8Krq4J`3shc'%I?3"X\o2bd>\r%n#((1jDlVsQsWIWk@Z/k3$9N\pq.A,W0:L*n\_EnX;=d_M^C1!pg)R/+)l-q6@9i3+-t+uRu/:o+[UIH<r@KE&*CH)7cFY8+b[Rf\r%\)IWtU\MJ;5@?I'Fr5/:%iETbo>Or("-u+fI'2+[+.-ef9uRX_]Hm41LX!\B<N]^m(-ga/#BppZHi.a\]IAN2]ppIY=!T/4p9n$d\r%XnX'JnQcepZ1#,dpd*ODY0P0]M7?Z*E@(@DX=^U))O6EBdLdDsC-rDcW%(1WR`*ZAo3!61J0%(mJfb)jA/`X0@YP9`'c4'?&,J7q\r%L(!jG/Gbd()LqYS&76E;qT'%QIs&P_ZZ**p:fS#cQRC8P7/*@S*j>a38%Jq*oml>g7GU<4HI*[e@4LDRN)#cC&oW:4++ZF+c?[bm\r%#:/.kWg$U@#://6SrM$U3?[hrkS/*X*9\cg1s>t,2_+FsAl_O8M`K%5P]hL=EtCKR_]4b_"!?]b3QRXE#:).&nh7AoJao3JR0+(?\r%!#V+UF$OKXqj9/E$?)#c/9>QK_&SPc@@W_&PW:G"PaF32bC+`MR_FrsUC<Om&oXF;!FWebOE^jLa-o"2opnC2b*G%1nHR?9[U9T0\r%JK&ptJA`DB\PLNk"QQh%Ta#![U+P&W)9:p13H25QFj,CNN<^c#WD/R%F-m.Sh%@I)Hr_j%#1g"DR70#d"`<l\M>QXN<L"/0b4s'L\r%YQh6,X:8:YDNV(L.3L1F\/=T=YQ3Lfb6f$+)du#W5M>.nQQL)'i[:,2RL/Jo;KNcLUE0$98Z&@VE5']O-J^Lqqp0#3-%-b#gE]_H\r%,Wl[Tau7Ak1^Wr*[`ec/2iq8G(tg7(RO/'<ABPsSGQZ$l@`oaQGQW'.(c)CBdj2'EO_`\s;q!"Z[Uj'?A87P9:S04[?nb<lSH_ZP\r%`0*,'I8a:`c]C0V0""s-*12*,S(f8AD.bLU#Hg35WL*c#D]habZ=FG9E!?jq>NUG=B=ua/W4[\Hrl#ar5iN6[Y3'Pf!uKh&2OFRZ\r%DZJ<I1YX0Rdj4Qk4:'.bRO5T-po)tPAT&uObQ5gBa_+S\]<P'c*A'V."ZtHa;q!"K'5(jFA3*ls:9D`VP>"]71or)uqS6L-KQ\1c\r%kQ:p4+O+1GV[j3sJWF$>9e$RS*SMj.RO6u3L6ZV=WG.OCH.%sp;T-d9$,'j8Cm.OePL+M^B:EFHRY96U452%0RTJYHf[qO=l5G$i\r%6e`kbdj4`0UUEms*).r\[Rm=r#h>7-Cm.OePFt:[bVmS7#E_s>,fqkLh,M40Y2^OWQ#2]Egc&HG8KM@r]'8j:Orl4a:I@$7o!,Pr\r%1-NA7DC8+oP>"\pk%YAQ[Rm?n8U.qQZ;!)39p-m8g"7X>Y#HdOZ_k0&:048TgEa(=;W98TpQX=_-:Q-PPJDI,R;J+dBbGRlAS%?A\r%C75:l)d=<a8VQ*_(tp=)FsMG>;U`;hJYYV_GtYS,K`B)/_L`8+`?r*,':q!gG&2b*d_M#?+R0O;-Z"B24lnaHZ3^d99f<$`SpMtG\r%@DsRpfEAX!JtbX-Memu2L%$a'',21524NMlLHlb:6Ic6L*<Ks1#`q#M*<Ks1aN(R:+coY/\9GcV86Ah7pc+=k"LCKS[R:2D#Xoiu\r%O,VZdd#HoV7s@b_r`D;0q^8TS\F8I89fW,"Z3b_>jg;L5_Y89.*uIF.G1Zq6Y6nZG)4Q^L@E9eZ0#j&K&5.fWr]c!/#ja`S]jqe8\r%ht0.L-D6hX/n#E>I#L_Jd4*X.J2,V#+2,<9\>Bu$*j!DHJra-mIWf'S_1X;m,R,SZ=,n[4:^XO'@ZV,kK23)m8=:&(co@;)nL-p#\r%iCQP<:TGB-Peu8DG1sune\M&a?>ZU\$*j&DZ-Sk:!$lHN`/rgP@7)J/AdVNNK<*(5ql[9tM?LUcJ;#1uMpKtD/_HLi+u]sT'DG#%\r%[/+YW'FA7,kVWlG7bam(NV\@p@t,(d+$nF)lteA\2X6]*+5p5qE?SAc95U>-;>haC5X4d8iM6<B>c\pS47QIY:_<f'+cQ8fPf:Gi\r%bJ(KKlh*uLNu"mR;_mU?8=2UC2q9'<(5Ha_gaOP\Hd/("FmcH+[J6'MgF;cm;!\q/BF4cHXFrCIq5q(3)^mt(PfuH))bSf2Y"eFA\r%g1q6l;KeO@H]@XD2X.;b!ukplbFkuG+^]C@?M<'9009k$UO(.EI+b3<))PAPjNA%Pb6[XkOY8d10;CJZNdR6ocr5aek?2LW&jRFm\r%Qf72`O=r[.0@ri(hPZPj3ts?kT0b&8Fsp\jEGj'C>4F@Oqoe'Dp!OIHZWt008Hl`QTD*?6jNA&1oB8nl>!gpS0:V1DS\[h:P?i!@\r%:CU&h:+XR;`62n9Ys%WX4n8*+4?cuXVrluMp_4\<AV]8V-E2JfTn5`_C_&)L&hhEg]X76@#&F?pI+b3<fp#3MGXXDH_+MFh!R78+\r%Xt!e%-si3PiRFO%gtcR_YL5KIeo9@Xrr[0.(IIrV5dOM9K]gT32/ZiL(N#p+l;!gG11C0T]e-as9Fja8<DVCtS:bS!M0?lFlEU.@\r%[m/tB46$Hl9BT5KZnkGa>HO<6H:jOah`'4\4#puT$#skRiR"/iR1SO.+&5T/,ULCf)&$k&f6KP"k/=53inWV4C"%O5'B7g._tc:G\r%KK):^S6h7mOUnA&A(9LM-i%`F\Lc?Bj+KBNq/GQ0:aX+4jMSsoWUo(Bd]j)bE>IGRBg*MCPuJ'0DCT8UP*m(C+jNYC*4i,Z<=I?/\r%F9ur)o&66:VDSHumSF%Y_R.B3NeCnd+SPAc-2GUj-cn4@E0s.m8r.PP%u8GYb(Ma/q-k*GEGk@+J?`:@&D+I\2pEB+_a1^R>sd=/\r%+)WSR<q9]%Q+#K[/KFLFE"fRM%nFAaFjKMn4$G_H<eNs12.r?g-^G7O&a]DN$%OqmV4U*S+gS7;QfM?AC=EZIdQBRl5-'TA2ELE1\r%Q+Nc0\(/.(#`Z2DB9o:QPZ[bH[1hBFApJB^8CLW*Wo)ZP4htP!=+%"A0&!#a1OntU+5J[]G,*I#Z#bG&#f1T!bODp&St%t&b,lQF\r%`-r"*P+lQ,;iNGaQh"YREVo#qY)1LijED$hKKfGPil]r><d(%ilHB"a6S;MM5q6^a<&hT3.s,J/qR?4A$qXc:9<`V$;meN?/O=10\r%M]o-4)%]JrXE7Y5-?qk_T!'>4=$_i]>I?@\X0#->ZC7s@9ip:;$raPlBt=Ybac+d(,d$c&"+m(IS&B0:SY*/jS"sGHn%s7^MDSUm\r%V[1N/X1lGFqt!g`kpiXOfrDGOdoGgVGU[Fk+k<*G`I-3;3+Y\N86TlOX_+Wb-N1g8Y(A%_4tcPgoDD;%d2*"f1`>'i$:in4nWDAU\r%Uqs),PSuWk2X1"&HfGObg*Ef/$XV%FX\B_8Jt<TZ[5R:B0ht'H=)4"Mq(hZg^05m*WaqgScMVL@[+`"pb>bV2=BfW8X\HBuO(5<C\r%->Bl9*,Dr?M9#+*XOZ#M*^`!_=fSl$4GJol;ethL)TUCaDDh&AC1'N+G0sT68'jmh.*$i.?#+=ffpn5f#@29fo@1P:m"QsuOgsT+\r%ZN%k2X"/+$Y*t+pIpdN8mEs.CiO6=]EOYppP2HF](+oX+_UDj;3+,b?TK!o(*&)0!#ukRe%OVAa\r0a!3:@'T-l&^6#HnR#f]K^V\r%Q">SL3?\V7d=uUgHs[QirbtO/X^P3jr4Qr@?f=r-8U(AB/r@^B's@DcMg#U&+&$i<$BMDKIAJ%o]'p!tQQp)#H>o0+RD)!H=dh2!\r%KcE/&]P@cN\)E#M`b22FI=<q4]I!YJ4J1sc4Ml.8l4A7k'iiU4C#1u]QI@pJGnl[?:M$8q39UYYNL&`^"nQ6u>@jKl)/ec3TU+S&\r%^M%C1;Z%7hiAu(D5r\a<"u@<&YJGuEj\Of*o&<-)c]_tI^jjRGZihA/V^)=3&rmN&&\u0*FV-r-bkKIkC(D+\&S(s]>%aO8O/0*)\r%&KoZ1P&VT3HW:@M:(%H8P*[>jCY9:BVXt*A;OJ+>VY#Y)UF/<'R:&,+6J@8=>B'=&,W!)jI*?H+"o9h_CZ-ts!b%P0I=u=Sc"?hH\r%AlgmdMVOe(g<"=NrO5uq/q(Ndb/Bg-Tf(AJk@Ym!/HoG<Da/t*!_:1g/_UEBa``N1,Q"ckd.0.?DJ[]Y'$K<c\?SKWi9mNWil6ka\r%=e?T:bKu_p2HmP:Y\Zk"eqa.E[KJ7<?duq[96JTJHa4G/>)IE-l?Y`+Y6Tn(_urHn+#GS]qpntj^=Y-sEiAVbGKbg;QF6CO=;q2Z\r%=DJSKbdSQ%9UVcD1DQh6ePDbC"u*RZEGgpGBu-X,VUTc0!A6Ct:n)A`[,/Y;h"9`5%^!3fp<9uc>&W@<L-Ebt+]?4M@MS!Uen9Vr\r%*qENQH9pJii2NY]jsucKATlFWb\%J46.[:O4g.qMobJZ-i2(K!5R,<H;:_@94j.rL`%n/M!1P.'p;2hNR`pb>"F'VBk/f'OSh,2'\r%cg/HUE4Is`2J^fqqL37MPUB4,b*ZHcNGor2Ks&P#WTt>Ra4L^^9aAPt/t04=_JCsLZHe&F,g:RVf/U9eJ,*'[/M2)41X8?6[Bsn^\r%a&X6rLl]m5p;XO'$>&AU]8[GAPHaZ)2bIc12-=d]pthZ>1"dsF69TJoh2/,pg2DbTf/NSHj&&A2NU*1/&5#^@@\D*c=EkMaJ'ar%\r%%PuJj8th5rqo,u`0`11V,J:=CU=1:B'&W#Ep9;mj1dHE>3j:`pa2/gt=S[8'P..<\:5-I]R'pC<.S(SXd!f*$)WI$c8@fl7P:`q.\r%*o[WoSk@p[fUm)CjgnP'>b`mWd;GZsV9k;^okO>4M!je9Dn_:cO%6UQ09eNep(W8Ton>B5gnqq"p[E"ho"\>\<>aHQjV>f<)[\rq\r%^9H$\k,YBH/)7b@n5a2N^4Mr>Q++?Jp6F^?5"$7@`S<1bq[+YoSBN#.CL?&`icsmY[XA<tZLbV:>$"39k7=p%D(jUE'8&B.Keegg\r%IF\,agpCs+l1C6!g/eqlm48*?4L'FO\4C_27ltbZS*T$Cioi,*/ooqX\WO#e*6p,85P9\G,e>RVe'Minp+^JbQ"kM3r[se@.b/n4\r%F&1Xk<:,3C4<:d%`h/k/c!Wlg.oiFGWDmt2*iLPg7#S::B<"R(;^ngbJuZ,%m93MhC+ADQ$;4?`#G7a;#a]]H."$s++#uTBcSJQI\r%rMnB?,bB:cY:2an->fTZ`"B@"^DOKWcH+K!0#ON_/^&.qXN4*LQq%XEihDu9]:QP$5IBsB")SPV?]fFnoHmdKOZ9N!n..Qh5\tXA\r%@<%_k\Ao]ls3qge#PTOP-g'GO%[Y&*#ee=oiDRfAj)A6@@kjmcBP9&[YDJA2B&]Gp>IIktI(9%&[-e`'RWj,8=S?C6A1!EmSb4@>\r%k)Es0),$Dn?g`nRMT0;pWC#VDZHW?VPSor2s5ii^g,C@t8"OKRI_pf&(=$#ScA&(d5bEXt=tZn^850O\mpDNl"XQU7`^c*f]6I?b\r%2R=_i;!ghHMVuB>"8<SYeoYm7F(T)%N,>3OArUq&=o.GUC(AB:&da'shr:-hbS^geo(I>*YU`uWm\bc>W?8f,8)_2C3NV\,3H3?i\r%/',5-rqPVoPoR*FS9pOtRQ3P[]DQ-\>+lmjrT$N+6_m%Km;UmO=.egGq-F0'fQQb$>oK*nX&jM1rV+1)h@6$K)Q(K]]"%F&WS_X&\r%':"1ds&ZO-("9\=VH0p5Y0!]tZND`@]\Z?D)Nm?cktt$D.LmI!lfDC2YZ#s1/aQZ%@*Q+0])PdT%f#l/DK$3T-Gq]4#H$mJJ+'+=\r%ZlMMQFC4;q@]=t/<JV",Ys1"sl:>1a0^o8<C1?/Fd(gH15EROFh&H-TJrQ]UJXn2:@43HgopD/;KV<rMgA0"S,`7s7kms<>,jgCZ\r%,*?>VmfQ`\-^m.*U7=V)I<K2[$i!/;1%U5K]+#pc`*IBg,$Oas2"6cY8;n=u`RZH9oY'$m!b.C)*)&D84d]as9<rN0@MV7LFK"Dc\r%*=O8\TC(bqZr3[&eEAD?qFZa];PUGFkUSOe?W3`3F4Jh%^+iNWP?`7XHEj5-GNc'-3ji^NF]l?AidGXZ=-p=q/j0)$?X;6c\hFTT\r%KKZd,WXCWP["<JaY.>8&B-]N6gtcT6UoY*oH?#AH+UO9eP&lKA@@?gTWX5p@4O^YJP2om=:mFK4(kLME[0Ec9`!pjucS\![ULEY3\r%hBetspDE0M%g'ZY2d2iA_CRt-;#!@Qab'S5K8'C`]H.33;^t^N#)HKW='G^bFu0W3>I"MG([>6(3mN!FCD_>*1tV,pe-Cf=/l-6G\r%:ZpO;`2<tScYX!ui?:/CJodDTiW.^s'l=fj!LF\Uk0FOsZ^k'UD`qna(Mml0EId?"n,/&r35?h(]oXY0.OFKn^H8Ss`)SYsBL^XM\r%Lg-hr&:X.#79he'k>dE72IqVfTI\jpGBhj`r$T0p^LTrFP4$`DR-KjPXhASJnR=uE[^qAOoX;_\dm(\'2OEX9;B[sL<%p7+18fHD\r%KPdQ(=D)PSCD'd8K9@G/C&/$aYO%Ed$HNABERq+>Cg<qJDHcIcDUWq@*>5e%4f#npN5_<G[bC!Kq]'Q5p0FX?*SXL!+.``<eH!"1\r%cZ(;)l35FInqf3t,kil.:-Og&T&c:iI4AVQ5&6^rK^7HT,b%KC3WJ)mf%Fk>l;@Z1ee;pJm^#]`q;g"IDOQ1XE?:CW_-^,k!,OMU\r%6te.S#h+bK+77rb%-9UO`_dmC68)WQ$4ikE%1t"k8@fk6*F/^Y#4^C2@1C9mE<.2h,$D2!k[dGE"AC%j,1TU9!I+LH3tTk$;,SJ;\r%3`hmc$(+2DAk4J0KUWub1`))f'Q;Jf3MXHO`p(UZ:_);9)cA](_4!k_FoRK1j"4!*^s<Ebc/tlqlGkRClGNZbhdcIXh>?AYiK(K%\r%e77YR(r:^$9ol'"`9.lJIeO1le"]UJeZ=^EkBLnM?6NPAIU?_6->dZaZ]0sVG$]'aJbiO@F<&D=8&"b5VN_d0j',9LB9Jc4MfVn_\r%"MGK+H!VBf>F3\;YR/bDA[&BrX%!QT[?-GcbIpr#1%a%g*&K"iI&o)N(gWSj\^@5P*S<;I1?d%pD)DD!g@nCo2#K[;5.Xae=UN9X\r%*CYk\$\t"?cWCBTa'VYBJg;KW?nk5F<fU@E#e1J0Of(9Ca7FSI_+ck4_.H$Va(,Zs),Gm#IOg`q-:0I0B.ApL-mXGCD_=Fe,p`(R\r%k_CE0@jiVOGc;RWA9@?h_3E:Pp\(\BA3Qm3fM"iuGZF$_A=<3D>"1C>fm\f(,b&Q_W[FFnW2u$U_%]6^bo4,)P+`5K+=6&dq_pD3\r%p>[=1-mTb@'DMIoSh2+RO)oP7'-UMd+U1>6\V;V]8TiGecMc,8%_C3F[D`#P2U*A4:FAfNU'/#Jj\1u568N[c!cC;SB:#O%"<s>N\r%:mUU1AI3B<[`>ZV4I@@;'tf_Vi#=MF;Y*SJ5]@#!5aHph$.-0R<0i&m@4du,M(A[79#HO4,>5hH"RH<ZV(=p8P=`%_A`V+L/-1YA\r%A<i-uZ35QD_fU[3Z33VlkY.;h$Z])O=TT?b5_%!V=i*DR]toOV!TP.AkHQSS9_Z\1Q8$?4hT?IMK,Ao,T#q\9q^U6\-"'T%icsCH\r%/-3LL#k<0j9>E%mk4q0*-"p=*$X#gU/S5>)'^'kIA-m=<#]F8\pj0aFH7DS_T<\c^AI8Af2Skq860eXASLaf"&qI7X<0i&]ho\?r\r%=0_r[9(6gAb7a;,PPe[uP9o.P8C\Z',>5hu9'X<=-qh@M"B<8mP9lGaZ39Q@nP5B8RYP<)9>EEYIQH9e=TT?bi+XTBQ2p%$Lp\d"\r%Fk,tZQ@SEYoTVJ'-.'qC0URr2Q""@MfZ[:<4Hh)48ZWuV&uZeJ?-<k&kg_Il!Z!)t46ELn_%Vc$FprT".d:IM(]khEjK0t!1MuHO\r%/4&+f]p'i$R3QDab!T;5-6R`,a0Gi]A"-Q*"QemSQR/;'V"gG`?D7=9EB7!T`W)7Qd<6l<!H&c6Z.W/Q7lp/$f',_L0m8e5[W_YB\r%3upmb!q2Y>`iLVCruY!+_`sV@Vk]O+dE:^0[F8"CVtg(sSW5t<f0K"9Zi%"H3]as8L]Mu,>cN(sN)I0N'!iOff)ih1],=Np<p97]\r%b[J]HKWos=O'DO:fcFrCrD:A0D6[Mfil,YU7FLj:DL?^H>NE?J!5st)i$ZhK755@Vp5"*O&h2n:%i*6Xop_5r\Frh^Ip^JEPduO\\r%XS)?_5(I#"E^"Yo"mXNkq2`W4\st7N,BFp[[c=?RbW#AXh1VQ8G\Y]HC/C`YNMipcmiL*MPl&4L9e[&pYLj!0Cr-3G2W;G-2SgO#\r%rEli:AWPLIUB]nr_BqNCir4g0=Kr/_2M!HLYZ]VZrbXQE^[7XP+_WY*Dda;g)rELr'`2cPZO+L'-G=t%=G&*@6L0=6&]j#4\=c>&\r%U0k_IJefIo4m)Bo-3/UiF\nW45Oo)><!TL]"AC&5F5I^pn=8`>Uc"pIcW_SZdi2rbD\T7.HiE6V`@39&g/hCJ/*W3Z1c`F)?WFke\r%guM!^[Oir=4>](8YQsT`V^=pdiX!5-9;488?ISnhRF$'iUac36/IKDgPQ/p&NprmPD_atL,FsMI(`X#K2*&Mh7o1QH9of&V2C:rh\r%%*.Ts3g1f%$HKQrO`d6T/!D2/'O."WBk;;fJb7,ZNj-J7jM#nSEeI)'ZmraH3PtN8;8pZ0j9U[HJZn^qjN'G.Q)2S7[Q'F,M&r**\r%i@ZikQ!Tn!WP*:)9oe/8SE$s(99UURmm8,b[Y_`p9a;]!>?bq%nQa>tXiZ]S<GJ.6'"pBEHD5c@N*)Mgjj@MUV,5F[rLccV'kPB3\r%-kl/>W*hO]5?A3Lm;82Dd$A%7AeQ`W"GZ6iYR+?FL\!nC,S+I.mt/*"+If#r6iMdU6LCN=;D7c"ho4;<oBe,=g[5?ta`:tQV;2`,\r%d1fpNm#I$WgXLC:MPH30G"2hOK&I;G]-I;FpjJa0q4$idFZe17j5siG9^Id]F8r8r&T)IA6:=(IG6D$lJaU@Oh%=ltG=k4lG"6aP\r%G:A^2Oh+k(g)V%g3'+YrC$'0NA%Nt2k/q2G,NusQm""J`p9Gi;m#HHggYK=)NmQ6f>^;OEbpkO/V;78p><YsFhX1[;QsBK6BQjSc\r%2`;.bLNZ29gpj1d%Kj<f'tr>,46kVRZ9&+XS^#9A9=pt$N*+2[%<N)&6[oCe'C:b7X\.F@HeXS,:59Q$.*<FoNhD![Drkti/X?mU\r%&Jk9"_.r*HqU`g"MC4R&c)X\t*(ohq?LP53=RMpDe8.I#T$8DcG?`>8MpP#nD+Wdfb4'mQXF0]pdKJ2hcX+MGGI9NIM^uNkHPc'G\r%opJ$ia,c7VF[/$I7d\Q9[*ZMBDt<:T1/#q<ZsFHu,8ZqAl3IdFo*F+jSG+:B4ce[%mqiap>5P>cO`pj14O^@%eFCKK8>G>::nRgc\r%f\H/@4+W!E;dGHso/tI-$!qlu+iLj71$5&toA.i!JV#up@jY"XUB:%qiEDlS/i7Y$,O[aUgcN!le:`q(2g7E*-r9nJD<kU@b_aYO\r%O1Z,S/7:2.":F(eiLobM.8U!\)QRR$2R?:FVo4QHJHBrOkH7>3#o%cWFtg]^JV"&OALLB:S6Cgl7kpc7=aYdfHQH$mACgkdj/QYK\r%H*mAa20^1YV`6A$[HVr>I=<]-+uZ#_TLiD$U'&`:i57o&=4SYC,FH!1],o@F*iWH$Zd!NnfDC\'U[(`Ag8og3_K/9=>Wc&_WdJFL\r%kMpq8D'.3/X,KE?lLChDrk?pL[O14?W\`QIA-R-G:$<"?A;6/?l\;no1JjoY7V=D#1U$tHop>pc1';\mX7QTSA-SW'ZUA"Ka:,^c\r%>,4*]+Z%Jh0r$NAOr7A18#A'ZOr4P=>,F6_+Yuq(A!u2hL<Mnu+.YG\3eJTDU%,Q;VDk_&1OL1S7_:[KU"(BOdMl^Pj0[a%b]&`1\r%AtR<B?Y?2e)4n;@WW%XXrm*<QZCV)bJZ9+$oEI3aL46SO?8J+Cbb3=t0H`0!S99,[)_qN_Q=b4C6S`/SZ8#!j?peNkc#5p]0I/Gb\r%oP/:=_h?6q>lmQ=#"(-J\dBd+L7ZV&TK@MWQ9WMER5%J<d*NY&.p7*G5LpmbYMNg?./X0b0>%O>^m[-`9^S^B?"^YCE^';\TaS)_\r%!*k&\5gUg$2h!bfqB?Yfkh[i]kBV\<_nIl.4GRd@4Lt-@YbB=GYKW*#$a%O76O(Nf%7QO$@@ogdk8#!`:C\6V-#(4cDM3EB7@f1-\r%c],/>:f@;.n9j!+TV1IWa5k@9`R@`WC3;7G#":?$7:YoLO?p^Q\BWe7!eV+`BHeXQ,#<@8b)NWDnYDRPU!AYe375MrK7[n<Mi5N%\r%Is[)32o7b2i`J'GMa?kmRmUdaXKsqNp#ag6MN<JJHms]"]0/&n,O@37ptW>1X^p.:2p%&`c_+[+cUMf*1Q*X),MUG%Y]''=OC.5V\r%R%#iZ:048TM^QV6Q.k<@TuE4pJt(V[M,qI[n;?iR:PsancK**@-j/&7%9\EQM^LG^Sb,#K@HP^)QJmqG^h_h>$FP:'6ci$,O[<oW\r%a&!GGku4PJo,+.*ZC=0tT?!>Z(J7hb6QSVX#J46,iK2+,cGIu+:tt.f?rboTTsi9WW9Mqq=iNV>AtD>+T>sdja67%O%XAJdo8t=?\r%A#W\-3KLFHUX#Neo>PSS[0mKh)_'9C-[e)<0mjtY5WhtQ6dd4.(hq[`0mjI/W9k\aper%'_9"eD+cgPU$FP:'"1TVg.Fe':%&h0_\r%a>+b+(t`]^AdYs+<Cn^aE6)P1r@qJYL-m!aEo1]S1>FZ11pROFU't"^3K'W?--?3X*?29mLS>4LN]E#l[O')3HEed%N1+8moP\.O\r%%$%"\#r]UF0S113T_$cXb9lF*`fa%M)Pm?Cf`Z(RL3ki;i'5@2gjMDB<c#X19j"Y,N7imIoZ,j%'DR"o/^hK7^P5J8qb$@[O4T+_\r%4aBeiZO']q;XijR$j_V+oINo_%!:6]+XmBooStLiKE8*Y%r7hP',M#PlV^H'&2jO*!)Ibu\=s9pQu9;+B`Fr=!!nZ=LI[nm-ZsDR\r%bNE"A$(+2t4,cNN@G7Fj7%b4H>9ZB$oJ.[)Wn2loEM]3GFX!7@m9__)!n=V9+sS'37S)bPe<(?mJIr9MTQVM(*!SlGPO^+G,9-nW\r%@$`ZiA-?8aP`io[Hg`GY6q/^:N0#=>+bcp9)?!sf7)I[!#hpC"6f"5*)&Y_-;Aedu?TrsfS?9j<LOg&cS#h[0.-+)I,9-nW8H(:i\r%m_"I?&InmfM#'_U@0Z>=#]$ohKuaNG0HpW8bIb-4&Qi=3*uSKJZ#:(fcu-t.kVg,p5*#UpdkmN8hR/GV_ns+<\cn%a^'!&Fh7s:<\r%B.GaS@:4bLF!kh&$]ORp%bMt0JIr.ueIesk',fa_0ESACH"=i!C;C*4$Y9U)nOiIo[NZr$X@dnO`+7o*,$^[W<(W2aC1)]3\GCr"\r%UHKYJKho(XFhUt^$0Vfa=g89c4]IsF.q50#A*ElDG=Qk<:J30`HE^ds7FLjpZ3d4=XGu/u;k(QLo[-0O$8?[mqBrQTSJ@Wu@M;dY\r%_MV'lUJ7,*aVC;\<h#0[7TXECMG73X#qIoB`?q\=KGC!G2q\?5B>l4!fRt!/^l1u9Xk3aefE?<mT'i`5KGBu\@M;dY_S:n$#Zo0@\r%.lLhT-EPjQ'q;F:'E1@8K"-rFoi>l1HT'h:)dfiV.lLhT-EPjQ'q;F:'38qdhddD/^/o-fMG73X$-_%TlAA=*J5$SJj.Cr=S$6?8\r%<c#X1:&+Ie$._p]`?q\=KGBu\@M;dY_S;+*#btsZ>$nN@XP!_?RWr$s*NdtI'q;F:'38qdItg\=T,kpaX\LUuX/2,LTi(oE`CMr?\r%@9ePu;+.u=ADoGrNVL`jO`!AWTl(R,DL0UF;5fsqUg"bcgq#\p+7#eB!2b_65BQfBp!f=XXn'lXs.Ae1^FfKS%ghDa=+N7]_)]e,\r%eHI8ITu&glUNa606UQo;l<<Yo#60L&kDsb,`a^0V\s,Ha:NWZ6*8H$B3dCJC6+$PjS'?t3bN&Q.'KptIj]21^3Y-`c3g>Y`7>>5!\r%H%%fdPs3JNBV`/'GjS-_dl\,qFbg6taY/VUO,u[b'&V;lqX*ce+PFHSZ$f+oGkbrhQj4]#(TP4,cETtUl"fUGSY*TT]@OsSm8N[(\r%]q35o1UH]9liis8VZHE!pk[E9f_d];8::NOBEI)KBn'M)mD*?,%_2mdT#Zu!]Bu>H^%ilngNS!K!Pjti;W`_@8'Gu7@YRJ<Oi0W7\r%Y=eaD2mS^mkMn+%fWNaX9$Rno-#TBRcT"!KEHcJh1aHt3$C4t@34R,.kM7@7Sl_t4IU@-@a'a,eejQ7IFLQJm<kZ3A;olb?+ft>k\r%JR$B+/`r5;^fG`HS$$2%^!mIgYkER5R\AgDfYC[/=j]72[:Vj1_-1s$b^_94==`tr2IV_R=DO17@1Uq`S]EYM"6qU:!mBK-fgL%&\r%^PSU[-0TEcUcQBi*X7r1"H2fjqd9SU8h\6lAjIMEFDl4,K\qBr@UQX,,uS4>l`GAH]SfNq)T7OTmJQ(8TXpD<O(iJbqW&?:SM-J"\r%KMb\Cj:&cS6j4F.X`+e6UXPHI5YZ+Kg:8ElH?''Kg+=u'&O:.p8>$R`kk0#%`_Z:A/\&VW?0L3A9"=/ZMbWp:WQ!6#ZY2@GP$=8t\r%MK/YcK3tA!E703W!;M+lR:e7R"m4KM3S3Tqa=P,L-m3A8^u8c#.Do>Vktkc)o&o%\1p:>`SQI'#8)a);jo'V.05XdPQ)7;(OXBh(\r%kP!ih2kSke3FkLsi<2M"*CiQ<8[T,sr5/+9F@b!V!j4VKef-TM(It#f#rYU,2;q,lKrcWP8PNko?H?m(^<O-Tk)I$UUR/:u(^+?Q\r%U]R"$8:Wsba]W&L?:?>C:(\,@*:,dNA":+ma(i:"76B@0$!)9*@4_IX2th-JoHc_e9XQRnS;u_,U7GK4MVR:#/6;><Uja(Jg55?P\r%7iPMW$(J>QG4FQ=mcC-,jT9u,?i"KLHNOQfdnE!u@u37*HWJK4GUO,LDnF1/o3(bJXq=.eFZKe5c#<+#(#SkT<Zm57:O_F$g]"Q3\r%<WgrViO[G&`b37GI#W/=W0]]*@c2%10D>U7$psJS4>pHja#UXRrt#IpOVt^m+D(#LdDigTXPhh`KO,TlZ1@R.,gTccd>*LC:nLe9\r%7O"XPco-!o&OQA'!T!B05C,\dZW;'h(e8r(fgMN4[0aC*0<5Luj^F3$Jr=Ohkl+d+Canm-JU-2_ASdA;cMJf999]m"fM@Og5m4/e\r%Y*>A.2s8`SH@$\G\,Q;2D[51N-/'35.8U36@\,nN9i9rgeYf94,ig:"a6E-6lPgne`#RZ+aS"n#k3;JL+.ZMH2bNO<m8+:hrYTJ]\r%hLY1R\05ZAZ92mJk<<^CU4S#Gm.NB`he[,;QYuj*r1[V*n[<8h$GYbFk$85!,0FeLOEp]nTB"s+U+=ahZ-2+n4`2i:+0f?>L$%FJ\r%bb6IaBEr3fGI!T':lu+Aq&.DM=\kaM)%m-pBSIrm<)aAHI(LBai3rhElpu22!r!pVf$cl7%?]FpLmlVaZBG*=%3C8os*X<qMso4:\r%)\'D:YqRfiH>MH$PY4S.n!.?B'=58m7;b<:bFTMIOZOH>+r>[8@8UW^`5(mC/Z&>\9t9u#p8kamq$*GI6&4/a?*'o9\V1K??`YW$\r%Famc#^nEi);1fg;4`(XGpuSS:-WDHlZ;,9s-WKb9Z;,9s-hJ`ii3$YV);7g2a15'nct[4OHs*><GmsY#:3,<@EpsaiKmZg3KB!ul\r%AidI#CiDWT2!NrG"#mTARO:k&%W4KM>f.mbVh<aM#+'(RHg0JLD"(X`A=<r[XVVr@i4=ioAqR-%gu^0/^-ebajXK9$ES!m<&DGbl\r%cN_G9`>qm.*o0W83ZB%g=M*hU?KY?"BuX-Yg#+PQJCD>aL=GJGp9VT_q-lE+gjV/kf*Uej.\"4gI*Z:TM,'CJ0--PaYcuNgg0?Z-\r%o^/N.g[@*n9VS)"nCj0+CiIVe4!tIAX_&;JY_2qiAeqQB&f3n3@S\NqntPA"grUH1s1rREf4PE*.P7J+G#_*];lCg"*ClTYo]XTQ\r%*)UgFk]D6`_8e"=:F[:&J-;aBooQ!.+*E:<f2ru";-):m(\2#]]\,Vi?tO&VmsZ70#OAS[ruZUF\^3=a[!Mtf#S5!aCh$*b39LPo\r%Qm"9H*/>]ms649PQ=P\MLY[Bn1Oj#',hi[^<V</sbeS9^R#`sAYrY*GB*tuIe^D`]FObi>n/&$9?!%tXRIf*C&'TQ1"W\Al@WaHG\r%0?(,r[oL\<gUWU:f(tMhWXI&._#M1Vr]ms.6F,K_QPQZ>Mi<[^2UKTr8T:\m]b:91GNJa][JjQ/a-18'?[sC[pZL[g_;*tA[JOo&\r%CHrBM/,-e>&$*Tlk_$0nYLM68^Nn`7AaCA`fDONn.D;5)lG*lUY7J*`^oFsJotagUmG]qTY7@pbRoG=#OKIs<6LU!2Ujd5mdCSj8\r%s7j;VSSFLJgR=iL/\aCo5HJ@\Q=#N4+'368lE&TJ.JY]1@;>W".JX^DB_fQ1r9[MOFLQ7YVH<=-ig`#VG:T[`SeG/m1Fr89Fo#L_\r%Pl,^2@sf%Zb:cZ5%kGDkje#TE2d9aUr'h.U6Y>nthHW[%?9L%aB*DeKVO!iKahIi.j<S!P%ubC!b:cZ5Dp2UC$XPsY(gVOoAl)_Y\r%5O-1(/\aCo^CnaU&ZFb\B?\rtb>[s6/nXM,ns'%Z=8>Rkj9NX8l9We23G?N5o%PrH-\cYtC<s4DD/d7s."DkA9W_lVi1=-m(jGrr\r%=96t'q4VufCm5#fnGM+^6;bpJe?"4e"<lUP)5G'[0DhGRV=9qgE&uQ*&(rg^$X=Dqa\'B>oK/WX9CaAZKf)R^F=M3*:NQ59#U_-r\r%lN2/Sa^c^U_n;U8,a4M_arbLW7]na-:h"FIK\24e![YX8N+k'P5fm:h(/SI9H>R*#%%ma*Q>WWh$;b1\\Dnu&iWCLjfloe0;LfBK\r%ofsg$J.b<D5UB<Y&h5_h)^n#<Ql@Le"-dJ#BBUVo5RD`O2cLt)."O8/"dMUZ8dq%B`Z[N':kClh)_*RnP35\G+AefZE43<.'(f>^\r%:l,mZ"Km3DP*HJ)JU+P?T7a,Oc^1OT*%:XGQsI)cI!21$Nsd<V-o%WpK%(N$5fj_+,R#TI9$%7%8-)?04m%JkCnP<A+A`.:^'cEQ\r%!gG\B/i\k."dB":bgYWD!(u1KF?q3NJ.f4m\tK`c5`)4]TFr\=M*:$_nhK/+9$f^jTTY#kc\`F0"OE;19ofGZ-&NU=Y6b;''K+80\r%=<LEA2,&PbYs=rbSk9eu+pBB7n6gkY-3,HFl0*6$,8qs2?ap*b@iqA>_[)L"Vij[Fbm0K+eM>5<=<LEAbi&QN@n*-0cghpEr;b;V\r%JO%?WO>@^o\&[Cu=<LG7pbLnu"!s>8i,<om&1@Q3>eo2J&1B8Y8q*YX!eCt\4\qOgMZuc^(.#I_KHDW<O/W:m!%%HMZj/!FpDC4b\r%O<,h?WVIh?-(s9+32/[2`8E%iFkrdC&e!T@lafLe-,<<:QcHrEP^ig%<ZVYEJMFXpa^Y@EjJ<n-PXIRr$3<b,65$.E&He8j=5gR0\r%U&[gTo+IcH&He8jcP!6,&He8*'k`?"6julnQpmC>6junD<rPoiM&;lgf&Sur)Q5(s"-g;UMUS",0gLR3:#Jl1"9TrFrJR;F_ur\m\r%`eurEM48]4Y[VbV,mL8+=ApCJ.,j7\:]_qVKb<[Ajk'2DF`P!5(-bWiW8X0X0gLSi1><Yb!(nYa8cjMU71Ik5L]L,BYTtqgM5#`?\r%9#L]Ui7\mB.C"Ge<?@e9f4,tm&huY.0tR_BP_]?4PR(!?(ncPdU&6bo@Xo*XcQAl1&He8jWun>j&He7GC:L-/$r@"(Kcj*H31pC[\r%(Wphj*h^IDk7?(,L]L+%Q:-uJaTIbel`or$804El;8Y7;@XsX:C315aKV/Vpm1)'OJj'QR3oi+o187g6TN@g\LZAJ.5g)N]%`ng;\r%.$6lE5+j//j4mA!1dRB:aTId#1Ie@\joJ(.gK(Q1/022i4A^XpA2[64=?q_^\qs1;j8hjeQ$2U3ROook-ikSJ1*)Ms-in][VCNGb\r%:nmGOWMk=[P$](YRplUp'K',o+pKHPY5(Kd-$TJeF[R:D"J\(V#.WGRM2Am#)rP`=,uDEI)W5W<-.pt<ESNkkPk\qKq14^XOp<B9\r%c;b;E/OlB9k$p-i[hsZ/i*D/`'_)8tTR2Z,^;UABTK>/oq%b2OU.hKA8,u7U2*.l8(*cYM`&$:["A5mNae^F(B)<%b5Y3@o;&E,=\r%o(ckL690Q/=Hd6^Dj`l4eY*`d."Ua=)!5%]'f3T#o]BA:5`&;JU-PA>;'e_ki3j0+ehPCX(kE=l=lPfe0`iZ*=,P+H#Qm]Yo9<@-\r%&p.F=Qu=\\-"`SPXn`amD/[b@kfgLQJJ-$;O(#b6"!r7ETEIBh@[M'g![W:Q^NcD>;.H#40`iYm1m9?Z/OlB9'LOV![hsZ/!u%Rj\r%hdQ^\!#(E%^;UABTP?TLq%b2O@b!/sk$*d0$$\kV0]-=B9'hBYSbX$G:]gMe%.c&?TZ"Jq[,tSO5RFn<SI-bO6kb4T-0TW2A%iZ^\r%P]Rgp5`)>rV)7(="A2LO*63GbESQKN/`R90R=Gp/N#5A_)FGfKJ.d5WZe3gJ!_OR;6E7j>/[n4M:u]F4jL'Dn)U!Md&L]qXN/cm0\r%lcF],>R^3U5+WChq%b2O!r!O=HjL6YU8U0[+Y?NbW6G6]0n9n#F[KrY`<_^$=,CG$`<_]YRhjHb@f[k[b!U$[`<_\F0$WpL!ojA/\r%TLP!3'Gqo?JS>XA8dR(G'!6HB#>-%QMTV,\649$Nlb\c^649"p'6oAmlhKQrZ\pi?KGGt%.mHNr#q\uJW&uLTHtmcN5`)4iCJ)MF\r%-0S)62r>OD/QTB4&l@8cVj,O0-.2OR,(L:n0?0GY@K@cggC>6@Jf?Cj8dT@RCo>B2V3E[s=\&QcYaZDL8dR(GU;SkF@K]<Mo>6Vf\r%_O)u'/f<=HPh<-5&oqu_cTY,s#q]!5T)^&R-m;LmQBW$9>MS1&`K3u,"!oJV5RGZ!fMbCUJJ+a?B2'hK"\O<u`L]so$^<&E.4)>d\r%M8GNU649$NX3Zo+649"XK8;[eKGGt%.h#o[8ak_APnkcf9R7RS8n`bgFBpk(8n`bg!uYNA.A6o;@'sN@.A6o;'U:&BKGGt5m&,gh\r%V1]U4Tg]XiJ.b<48LXrL8t&LL,#:f;/Pq%ep<4s3[,YKI&X79k:C!+$q(I2cP-dDSgYNPFPUM-(rPF*uVnQ&8&km[j%gu4nEB/rF\r%;F9.3=\KR=PS./m`:/Lj9dub>8ea/JWepdKr-:o/JJ-p%n%M&D&!eIA."RhZ4f*fI-iqS>TVeOWPn=+_i&O#C8dR(GimNa)*&/E]\r%6"c-$V1]U40mH<l.4)>dM4'jKQr66YPi-j]<1J:X:u\#:F2tfr![WTe/@G9h,>\HRR'8RE5bQ'b*to@O*XJ"'X"Q*N4V0#=<.T&W\r%JO#'s<sjh+k>S-s""!0a(Dl6U#a?2#(k##u?uJ4gc9:Zl=ZffpPS./m"=EWTinOWKRFm9_<1LQ(P`37`m`&3l:n2l?`GBu=0lcX*\r%Gnr_0Lr@6B#6H4.N_^-]!^=<7inPFC`C'_QW#cTgk8jnn(se,53;5\2`*s;aM/s3?m1iW/S9s0GY)&$X&%(2F3PVdXpHYCi\)nJ:\r%P[J*iW&XN:TYsN5'bfaO#a>mJ?U1-.+AdYE$W1p3JO#&rrPTT:*i4/FO)ki>hQjEjKuCM,![Zb7,V75(&1CCTJT:+/5`(oP,::]!\r%&1BijMmtb@5bQ%KJR(B7K(aV4EUJBC#u!mC`OQ3T-0TWb^$=4g`46*S-!lTU=.FWq\C]*u#ZEef!$r]b9<e4m#$Q[7,>dC]?-!%=\r%lpN`DEUNB[Lo>ieE0i@X5`)3BN,oL48edD-mX[V0IMG_"mX.,CDP.,1R=rPi#6H40E[E?_4n,mM/&/SRpHYAS=6%LR-+#po=c\Dr\r%Et<p]XI<KeS9lAT@dGb"inOWe&jY?-`OQ3T,rk9n<1J:X:]g<WYW2Bm@1-CM7)c\A![Ve5LM9B!!%!A4Q_6>45bJ60=CH4;JNsOG\r%DM6!>#6H3CHAjN&4V0$XpR%m=pHYC)7?&?1-uksfgi;b55RFGBH/dV7NL^gg:]bjHYW2ABTL;W\`jl?"1)5Zi4tf`QLAf/G`OQ4S\r%bilWoMfTC38n-pc#k];Q%@#cc7T>n)+AbC,2Zi!o`T2q35<7lt+stSu&1GA^Kr@!*5bQ'V.#Nk&&%q9EIOQ!8:kCQ*U>jr1'd]6p\r%/Lo%/&1F6Oq>#RS726[&*XJ!t.$'`TpHYCin@9/Gk8jnnT\<:KS9lAT@a=eg`46,]+o[pSDP/8)UTTjg:kIseEH1Dt5`(%:$]9!9\r%XO^bq',KaP#aE+c-7mG*&1G@e/l?WVJO#'K^57\fVbj,rLiX(08eb95S9lAT@d9+]RZ`,$1f+h$;%s.tT^"k</X-F'5_:.P8kGm6\r%>C,/""\KJ/@%;RO`JdhjEH1FHQj8a<:]ecR@<(^dD'-@cio8_qJJ(Bd)!;s'0.&Bu4V0#Mi@2_N8eb95S9s2]6P;We`46-0p5\qc\r%J"1lD/Zu=UPfu9AciPMN.PT.2&CsZWJT:+/5RI-'(DZ*S#a?1)W1Z-E5bJ7-XbFa)#6H3/a>iq0@1/[DM2H?b"A7%`:M7C!C^jHl\r%4]L=9qMibRGdVbB8Y7h\?^"&kZTd.4ml!Yum@IXq7WmMX=sBG/4saffSbY\EAYuH*M1thf8`A^tXMt^U"G/1^8dVi>/Z4*mY)dA.\r%ESWpI[e`:u+Op3&$@!0hGNGt.ntS*!Mgs(2_&C)A9/!C%XjirF7_Pj=F+f%LE];50[^Pbq)c4Tnha8@Fb%e]gP,XZ941qDA8T/9@\r%Q+=*KS[C=;D3Moc4`,OZV4!t]A1+$/7-FFsT/DMEWKXpm$tHI&RIPd/Qa\(#)I/f+V-qeBIp8B1?0sgVTrCOXV)`<N3'DiA<X]f_\r%khhqdn'M/MQ!?]'a7n]!mFg71l1*;&qkZ8Nb\ObWcdMBfj-T2llR7TgB!aD7W=j:@Hc\\<iFt5*gKjbM,X4MOM.HR3JG,t;h_tJ@\r%O#ES5"f<+Uc,t;!bLd83&<_D<YmkL]4_6f@"sg!o_lJ1R*2*9./EMOT4HRtao=)%DR!J\t%\EFO.5/u$VmAoXE2Q8'ok1KUHf!u0\r%Qeo>'s84/#hoa1<jp7h$h0rh,I$QE:bbkH:(u^_sXX8Z0fY5,Tc[%1j:LnYFrU\O\Z#rOOH*XjTHhA64aq2#kpadBQG4bV-Y(&2*\r%SqC'Q60nJqmX+[f#:)^r2dY3EC[YEf;YcZkce[/J^WL=S:1TGt,?8.3>?c.-7Rqm1^h.?0Mq4HU&3[VbL,O90YFr#q[B4#jlAjFW\r%r>b_;S1@@6NM=Q_ON?*uB%P1hg3B$IEhkUD]h1VQ1/JHuB\0Sk=]kLu&>ZL"XjBh7DMsV1BJ>#+<NgnHjeF\op6Qu7SZAY-L"XWF\r%=J4.J4<]=hUtV0ka]t8J,.).:P+2&GW2u2C.a+hT*m%9<S)u,AZN\""jel`rGl2V5beL![)4u$YmG`'Vo%OtkguHdb5JKCc(>oC#\r%c``\C?e.dh<,kukerl#XF@2]#epI7A"go[q'pt$HbHlo``dPBO>@&eWlee+u6F(V5?YVIJYiKEe[njInpp,d,3Ib,%c_EYdY)$E[\r%i@BDepOr8=cfZjjI27<rp2K+`s*W7%8/4#+kl0&&#$90+MK^VY'5\Zbojgme_&I0/"'GTKXeIkOfuW'qTB$%QD!)l*LLZ8heWpQE\r%O,K-D^!g*8kA$roam>Sjd.\kk_$sf!&cI`Fen"LeI2]mE3^g]]G>IA4pi#_=gKFbdX)E*^^6`Uh+[Ng6lZsHI?3+m`=77+(p!2hO\r%B`QPe0.s+WYQ9E'9NXu"?ip[l+W=:1P8!gr*5TGOUt]7Yo['VM;05U:G5LmMRflnR(*E5@;.@5c]%C7fge6qq:[=?:^WdLqoXs%^\r%jS).2Q_W7=IICfk$0=m`qhS;PpJ7oO:>=>1r!?YmUsBMB7Yf[JlKO=+;-).mPn.,!VlO"%P-1,JcP?uVjoH3=mk_6$:ur_<*sNoM\r%;oGsGHA5=c7DRF0lj75<<m+2.Xn2=4E7Nb".H3+$=$IdUC;pLmIr"KjCM=K7Ea/_qkL$IR-&t$XL=H!fVa/+kj5m0b8OL"al=eYH\r%2rO`8T\AsZX1k+=lPrs9S"[Vu#^,,r1Gm44kaN`S8HE+W1d_bagb]4Elc%jA5/DbArj2KQ(;45-qqQQ?_*7`+3Xa*h5ra@qqkEgj\r%pYlTbAsR$>g.sAC$[<";f]peDmS@9"qM).RieP&`Y.Yk7BA[sPm<bp\Fe!`])J(>8GHU>MpL(_-Rcpm9T>l!W($Bq4FiKr!"2//.\r%0@=j'?EuY=d<5rXb"_H*)[O:=2&Y>+5Eia0+[/IDg7-3l,?TW-He0dI\mq[dHo&*$0q;8=V&D$7-q.`3)Wu9aG\>Rb(oNgMkARPm\r%m>1&,OjYa6)hn[]_)?8p%X:hl^rcVS:`al6bG&2sM<UiM;Po2EQf8k_3Pf6$Cc+,a+/hGmImhKDb:bj0Q-r%i1%/dlZsoei;(B2]\r%%+r045`u)lh1%5;:s$q-i&,Z?,uH*VFJrdeCs_K%TJM6naQa2YbX\;^0Q"9=5>+coM%_#rR):$:m%8-#h8-97LA*^2H#dSr6f7(N\r%m&'H6hXM@bLY#F9C,so*6?1aa=e(QK(Me"&kaq`L7)eu3U\?7A'l_]B>Xh5qe'TfY&g^N@<:mu?KXNBc(u7!P*t0ah`9h%6lngRC\r%DcFKM:4ApaC^V!Wh^9.%Fcp[:miCki.V4+;OSm`O)O*\?6WMO3=s\-V6)fC&;XSj*a:Vdjl_hX"qcQ#YNN\d:-0S@`ld3D20*gu*\r%AQ5=E0UPkYLP=#nTFGP'7F[ilg).(M=GZgsen_=2IJec/7/c0pqs>VUWfur^hI!?-\,Og'kWCDe^R7b9p]jPJg]G5uaITZH/Mc/=\r%BYU'B^RGZ?bT,u7#Se:3#7_ip(0!29FobY20!<LUiaE7q<ng-8Ms'M(W7KgPRF6]7#PDuWRFgm'g@3DA2%5f)F=2sK\EuB3^3]"D\r%j4/1H]f3.3TQ]-OTLm^Y0]:m#=0K%QOSm_?5K:H)^f8+T+1hE:ILN9ReJhA\;tZF#4?E3,>N_m\ZIN:<T7!>$iQ!^Ig_th$Qi:M#\r%SVK]k"(G\XHBd4bps?eHM2^<K"Oq/9JtD,O5Auaf"KM3F-*kMV:1E2]pNA@e<F+o21_62+ec!C29X1YeSK=m[IWSaX0\k)-J*oI-\r%'aCb*[$hlQ+6G5.A2DCMrI49"UORlM[la>7)M9>$0),*6HLZCJ&X@I/"4W&Gg$m';]!J][;`@fYl&Mo^qsN?GC6gfNMl8FXT#FqC\r%e#UptX*u$?D#f$0O6_a:\X,DAhR0O*G54:3CoIjArq).T/D&4#Mbs[qDBI*eh4<n1?9=X-2X@a&n$Ke^Tb5!oT4eJKp$r5mQ_@Cg\r%`(e+B<@oZ"Tj(.@l3Z`$*/mJ>1YikA=u,!oa7?a2X]3FQr+.@ahMiF/VW7G[>j,183],FebR8;l%L[e58L4l+pBn+`+:aDm;B-IV\r%YI,Ib#B^<P3#jW?X'1u_X%!$;=Hf5$c,]fPl1EI@,8?oce9F=??*tt0<fsfOj!TTZ82Y;C<1jlQ;lC$/V.t9gOPk8&p=(S!F5K1c\r%[M&Tb.$(^#VtJHW$>u:*&8!fFh@JZ"`T=dUHL4/rktfVBfP[aF*Sc`Y$9PAtRs&iWb9!0'TVTuX(/.[Lqj'(pm->QnPL!U:X5']H\r%:2C#Nb6I$MY[qjX=Si`\B"f3_>@7R+18gVPG.(@Ei1%_m"]"PjA)dCV_K$p*0N?loj-N&_YZDZJ:@J"68k/ATVK5cg,W@Z5#5=uT\r%JOP?ol0/>j8[F+]C29Y">>A8Jol"+>7&l+[Y1n!.;:0mO"pj%47qIW]'ik3!5?gJ+]X;2N=Nfp[:VPV3`&ucE>FG7aWIW3=['cJ0\r%2h53U5\I-n0-lR%iGGa_h:I?53Z77^>t_"$W!.FbLfH7Cinb[,G`HGZcd;`E-`#,khOgQ4)%JPgl+l1iVu`uB$a#KG<Ob$CW7O/u\r%(R"[!<GesahZ1T0X3fMVh4SE]c,l5\D3rWMRYV\m!MqW'<cp,#7T)#U*ADpbLp*bsRO6Y'_:J+5AgVEQeHdf?pQ[KY759K+0FM%-\r%7.P[Y\WXp*,lJPI.jZn`#qs]Y?fWmS#qs]iOl\81#oKS=nsG8eQY<8p8ms%ZJ.A^'d[5mPD;%OT"D/k:-"?nZ?tNlf"q2B:M1h3d\r%&e)`8'E9F9;P3](OVt.HR#-K_Lp`s49u&>lMHgg6e*TQ/$+TKkVr4p]X5fD[9I(nn\s&sF'+$<(mk9ikM1h5Zj<ojt-5*uZT3Pgc\r%0G>\$>6HYo#qln@aXkZSo03r57"PDBhG>tpM1eBtW:H=4jEROPTG1u^i?],$8#A,far6?l9lm%IU7$jK6%u47(,M*B'%*buAL:Gl\r%R>K3L^H?*P!R]9EQc;]Em3q=1ZC$K%Q`,^VLAY8L8S3Y=ac`$JV!UH\9H#^L>Ut2_8Ra"Z?6\IFLh7tt+6JOnC%Dr<)3Mm3,eV'g\r%r(7RF7)H*Ijm`Xh-5'W/el[3bM>`_WAtn%T>8B#Wn.L]eM&^+O3QL9X<sgaGS7m-^=j093VIDa(,\A7Z,s&?ZKejAk3PCs,7+)qk\r%r+%h37+XP()DdMG+E5hm`CqPi6iju'+>]-b7/SO`bf&AADLn:F36b?b_+Z,Y'\\\G0bXjH&[FE-0b_Zb)m:rYR#(s3_DtY[R#-K_\r%LouXmAg6Ju@O/4uAgS-sU8%34'=H]=YA,19Omj!Wk*O%\,eQN6+u>AN&lCe=NL<<am#DsbE+YgL(R)d2,eQN6+u>AN&co>#`CqOo\r%%ktS+0b[-.#2-DiR#1i<p/=b%p/COugl\Ee'?OM1jRu,Q-3i%e+j<@AqY6itMj[+\M>Sbt0Ji76MXmu*'+$>>FO-8i9I/FJ.-tJ!\r%'+$<(=?!OQM1h3$.uZ#kU43N#BP&II,m%"6(,JhE$:E@W$=tOs?6WoEa^QS0?6\*1JshIlY7(ptOmj"";ahHXOmiu<(JYT!Omiu,\r%?VD4kOYhTG.Z]ug)F0(uSO@1\a\S5>9I.8=R.X#[QbpC'\AtD"94;_3U.Po^_V%[rd^Ql..GTb`3cSlm;P$!78`<RW'iJ#QiDNEP\r%F*Z_Bpfa)%>C#1*3*OJL;2c/@PrW'N;1qU$O(L2'AVEcc.\?$J-7`>Y-NAeO,]G7M<Ek=eQZAf_P-"b=UHH8$Ua_Nu8o#b.;qOCO\r%6bA`@E%)2/!J<pX\<Qg%8.M!'"?abQPSu/cEdK'e9:9EdEk#)]?ApaH$:d`TD(.>I$FB_^T.Dj)$6KfU>KRA@139NBLJ-T>.EmU0\r%)(pW<V(`]\B"4(n.4dJa$NEB])JX5F97<JrVgYg1Ze<QN*j1sI;gW!`op%3-g/dtFlGp*ba6E1jI;elC00lU6''cZS=.n3rdadpH\r%FtoWSk=IL1XC*NYk)UNWjW@0MeN]8LbC1tr\S5p,?>is@Mn'.Bc1\:n?_1LF'P]FjcAmn#Re;%%hp"C1mj_-VB&-kFC?tVd]p/3'\r%dq!NDZ$"gE-F/uJ)TUqu<DsXZ;GCm*4^>`mrg48"+52k5Cd0L-?`Rn/4Y9kh5&Qr&lSlR>B^L0'`Y;P8R1<]3U.]O4lY;^/Jkf0;\r%#"*:j'9bB&4.FuWD017&C[:>qH]RH449I$MD4QVM54m1E7-=DZ(]AE'S4NAJ<YNTW'-.u[h3$>i81^%!2qZ1foJ'l?SnIc?-;F4S\r%'KhfO$co1b\0-6]X8=R1JHpZ2e`CV`/E@"B*7Ba"K1?XS=\(ksKRelA3/D:$f\KLHEU`6]pCIQaD%P&Q0uUmWc[&+0Q>p24ZaOQ1\r%Z5BoUcJ#!eg+o[JP-pR8bhDWfUNIt$7YTp`C&&juo),sn*qn*cE&U8Mpr'HZrOUr1*c0W]XmjOddi6FoFc-5gr[#fDQG^MDQ4(I)\r%MFreE(if_K\n-Cu-\W;\XQN]b>OYe>m&.kf05K1Pr=)nh8$./em1j5]At@I1WfLckI)A!?o)rs#KC7YJI;GWd9QrVR$:AmT46*d=\r%$H![ijW;M+[DCO)7o,*WI56O9[62HC`QYMT9)[<o.Q:?0A-,mJaJN_K>j](45ZFkFZQf#fBFE8SEu6i%5M][g!Ef4[F;s\9NJN"/\r%2o$+Y[=H!glShk#>-7PM>,P3OXlE&`c'+]e++)$XFpC\;a(W6%?\B*FePEs7l_FQ7Ic&f[L9$H:qY^:p?V`NqQDW2'^($`T4E/hY\r%39##^(b38:mL9ur'aqorFK5ABHKABu)F2N"FLH]t)F/CMgasXM"%](U[pu-Fb"SUan^36Va%UT$WQAWs&mh<,`b-Wm]AuJ7JsdH=\r%JJZ-r,eQNe?)01g#qs\*5Y,<1rqGuGfpR["N.]DB(,M(pQj*e%%Ps7>Co6C"'P='F:]"g;,2jib)3`$5bhl`LW_NdK.Ek1]!kU:$\r%,'B1\(GjI&>TCaWK]sX)1Qe=1n5RP>-5,g+B]$`a'?NIr6tRXBCNqXhl0<K:LQTMKoQGV&R#,(NJCMe2B=aTqAg5(WN&)f9R4*B8\r%M7V`,'h/ZhOmiu\B-E8&89fuK3lOeJdrJobM52"CZjCc?M1h5Z>a%T4'?NoZWc;1c7)DU8r%XV:q3[KS0$Wr\o.=:CU<6sm&mf#U\r%<Ea3N,2jiB1Zi3pSsBL7'++L<dns8l6is*.&or[]'1jR/Y.c`),&)`F<?<rYZpI6Y,_qdYl?@jNLhA%Ige1N+0bXjHdC@5qR>H6)\r%12bGo'?NbN>ao7X'+$<(p(plU7+*obl9[Hdn`rl,W\"B0'+#:]IMU&VJ;Qa,,!!^%%jTWMhM^qqZj$Y6V^uF(i?_[!>r%e(KU8X9\r%nsG8eQY8K7EgV]ZcS8E%;OE=@^#WW<Atk<RM52Z<^'^$jM1eBTmP/G"6ukCdV9*0n&mh;h,YDJl&m1$9gPTVj&m,M<p./X>&eH-?\r%;e.TraU`3SAe&G4pI4=G>A4#;"EFliRRram1,lZREia6O$)9IP-Zi];FDnSL!d-cE/HOGmJ3'&$m=o`ff,=MPBZ]&#3(S/Z,ni>$\r%%WmVIbt<G7ej+&[Wuq"#l`;fKI)Cl-f7i)e+!:10'ma1)l(>TD`r+)deh4@3[F<q9i6_og`$CFH>6:)Leu2f4\H(n`9Hudnm[gqJ\r%r1*RlmW'C6D:`."HA@$r_6bg"`Z;O6\]<Ckht;eeP?pZrDs-K(6cKd1`Ui4<E=LV(WH`s,#*AB1<4iXl%o'oc1Jd31`PMBh$n<e(\r%r;C3p+49X=^^S;g$\1#9Jf+nK*JoZ(L].$[g('Qb!gOmfPCTQU.<m!=]GN`>kF1C3M)iLuGQqUYSo(8<fQH1TM1c"A&b%E&$sJCL\r%SCs^>68h?-U&t#cnD7^_N;C2R?_t'G$h.D*4DsQ2hHW*J1s34HI#'8uZSg+uh_-Pg=Br^\H_O#Ro'h=:n43pk^t![YW*M>$AbTam\r%>l'CKbCE:WDeX_qF9b<SSBZ8O+DRS`\>T3tr&7;=`3dk_AO"gO4JLskS;t#$6Zrpp!a!A*RbuFqSF),]cJlkC'&M^!d&FZD4jDZ,\r%@CjFGneUt@('i/<Z/4JhcJj^2g0<@Y=WH]]mkq!I9"a2M^gRUW@:Y*cfq!hH\.eohf+g#*$#iBZ"/<;V&u]2jogY[+'(EO&-gc`n\r%8j)d6,RXj)O%lt#"9Tsi$59UeL_#_0d0+_1%Run7Q.<b1\hTo[8j_$'!eCtQ%F7rc"-b2J6[[`IV%X<hZ*<2a(neh3$ms<;!F6MX\r%M)$eB,D(IZhio#;5RFNXdj[n`JJ(DJh7Is(*:nH<CuKn!Ml@C:d6NPfI?SL+&E+-E#UmNjc8_%P(8,1ESei2B+pBBgWVQ@@'%$2G\r%+-@Eh0i9"6((LPD>E4;j!%#GIi`5J9""!*"?a>B<m0>/e_?#1Mr/J9g-9qm;a5Y`*0ENO)N]_0r+;QC$YNT=]!%!0b\tBZb5`(?3\r%KpDN:J.b<D5UB<Y&k*6DXU#&%9_SaXBVjSt%?s8"'EnL`W4J(f80C/(Um]T?(3k?BO:H*R![W`hJP)_;ba8K.V>K0O8eb:L`&J_b\r%!QTgHY6$FD$+fu,?3Oeg&k*9(.M)]Hn7m74J.`Wh;LG-*;*@a4'VGRl05d^V$;f`LNs-I<E!%DD(Fl*`9'.01BRpdbofsg$J.h3n\r%0El9K#"l[XE%6N@3)F(WU(TgqXfQ0G+flM/;1_,:K`WQF$Ki;9L^-Q!ardW4E<.@%AO`<qSsM-*M&;lgX^h"CCs5/$A"r1f.1lZH\r%TTrkjn;e$CTIu'FpkKY60jOg*H3]R=C0X"1bkf15-1QMKiG>jg#F(>5,oX$u#>1k`NMQV$Afb<L+[-!)K%%#AW8q\H0*Nb$W85.3\r%J.fY[`ThX!\NRSjM&R7peb6fs$e(>r!D7;h3Xa%QersT;'gb8M"TTj%VrY$1&He8JD\&ahScU<;]_B&QTS,7hM%1qb]Hek(;NLsE\r%TH6*m;^)DoiGm2@#>3@DKPF,t!%$R!(T&Vn"-aX;oO(CM(n_#F8uSUT$rB9eH05B(^tJMD=-_1:RMI;+&u?iOW]>VCh!^#39#L]U\r%3%ZXK;^)Do0rg.>9o0^["O:,:VF1hh&u\89$C!Mti$7$jG^pES?,GF2qDE/``6duXCJ)MF-%I3rffR6CAYL)tc/.+UPe\?E*]VjV\r%2rHAaM3s1RlGR0OAApUMd#1JgepDo[,E7i>e<pms;7o_^'VGTba`1"F)1`F!@)FfI@Xo(rO+h7>_uM+Qm"]:I_uM+I<C/Ph@Xo*$\r%a5T-A`s53N2-a'H&!WIOTY<YtXtE$t-";B;]B0V+2Rn=$WPfc*5RCc;68TutJ.b\RLM9B!!$sU=,",?R"t6bJpk$O<!e:pM"AWmL\r%jT8&'2e[aTOodm[^;UAB@$HF$_1j!Z$1`Z`$^<&S/FtG_TEMANEQkm/JJ',t_i[1jTVD>cqC&!>G8Bi5>;8K2a6<rY,gr0#0`iX:\r%e"5!8M\.@7\;0i95`)4i`Ia,U@Xo(;Qs:mJ-pbII*:p:^d"<`1:r;.`bL#sNBoKF]>DtfR8S$j[K8*`37A[Mogd"FR:Ius2!nE!,\r%P@6\K`#hVb%?r8U/FtG_TELdF68TuW0gLSP<n!LU0`iZJn&I->@K]<=ff4`^(*cWWqb%@h/OlC$M.aQA#aC_L(p3TL,>`u[_t<(q\r%N'I^#MM>e:_uM+'/f$Cu1G2L5qiB-mD_V;>BWmA)^;UAB-u(=)/OlB9/*uKE[hsZ/=uA>_:kG<fHLi^XTZ"F^@`4p=iWCJdn!2aW\r%M\.@'CU0$Abj\a^bkX]g@!Y^)4k"b)W^(42`E4kLT7o'mKJt8UX9T>1qB[^i1>VKB!(pXjbas8T$^>&&:3uL`7\BmqU_r5uN'N6m\r%]MP&80`iX2('0Ej(*cWWf7c!^P6*.0e0m.MKVAV#j;@#`N'Ks2bqBh\!G5CAo.<G)"<?0*Qu=\\-+4mHSbX$G:kI9Z39FG(5`&S@\r%'Kp>B!D4>Q988ZD)^lT4L+BqYWc(i7`b')#g,nMo:R\htaeZ1ETC&E>ZJ-4e[sNGcg'Y)Y4saffSbY[ZIU#Gqgj`!)+*V?T$CE+N\r%AAQQTr%JN6Er("KqRD8!f,]&XjTna?g4]U""lc%CA+)a$B%HRC7O2R4l"\_[au2aZG1YP(\(fWZ^Mc@TB7(5,Qn,69mRsGFj=,)j\r%oXt9Xn>o=s8,&VK:f.<67.Y=4ME:iV"6_LGjg.F53-A-NT>-=i+Z!W,p%%eY?%\%kZl"bUkc[YN]rTu0.^\kik+ptooY_b'jQ9M.\r%hjoPkd/dsH>Qrq.\s&Jq[V'L`VoMk7m?cg+0sB\N5"j)6NaKAMYG5Xk@7<h!S168f^6_N(*hINgZea087.TrULi1-!!@/6T[aD"$\r%40E7l=W,P6=o;eIK]F2(Co^$+V=F<tTFcR53sTF`5>+#q&J&F5:6sCBSj0i>kIl(@0,E-PDZg7q`p1lDANb/=-E:/>hG*h/-NX6J\r%B#Zc"0ZE8L'+<p.HspGI"VAWYYJY$*)/L/8q;:RP]p@k01-9nSIOAr]Xkhm8a7)QQ\8?3'6B46Zht8YBhfI.:A@:9tkIu/$ZTD2;\r%^[]bG>'nRFQcd([ZX*N+,L#P;.Bm7=^p?(a)&!VgD)og/i'uR^Zghg8bGs)5SD*oPE3:C]2Fa^J*!D+gD'Ng]%Y@)D\V]lJQJ*17\r%4#mQZ_2mN"@1?O)h%kOS\mdBuo4WV&VO\lc1"pW.^L\r!WV0nI17.-N#jn(gjQ:h*.dJ@ZZ4(n;Y!*oKEK&Z7.!;lHqRQOrCrB9P\r%@k5d<V6V6NUY?TqguHdb5JKCc(?"mhc``\C?YMTiAPg?o$!L%]+E)<">OUhN(!*b`i:okLT.Cdjb=gr=rAuf686/LD9<EpeQJ>15\r%p?=I??WQ\MkO6RbH*lbi(""NRrQa<f4lLhho/V_HTZ,fa6!X655G.Qa;FM$014S$,i6)"!G\!MG!<hR$]S:mu<`,F8Cuk'I:\'$d\r%[W@N&__Go5C.j93a2LT]hJ'(Oe6jl7GLAk9Rqr6eJF;HkN\AZiI2]o#jPmRaXTDXikZWBff3gps\YH@oAb;Gq[!>oiDrfM3X/D[2\r%5g.WJc$c"g!E<#>pLUB+4?9[=`=WMP::gDS8e8&7)b'5VC:?E7]Lec]A+>]"[CWrfc_&dlN..6H>3U=G=ip,lg+Pt(NMuakT-(Ja\r%Rp,Ou6K@CqZu,aqEd4.=UsBMB7Yf[JlKO=+;-).mPn0Xg[bA=!`8%k[5"d)J^">tgc>V'eP;uu=5FOZb?^ecs?23Y[eFrjtf%T6G\r%>[jk+HaNQX2\2i"I%Q7\?s)9*r*c71Ar;`%5S%3OZNssoRiQHO`T&^Y/E2B8i*,T<rS,NRhLH_go4<S5\$$i8rLhj,Ps-.#Fm^$H\r%/b/hPq5=$c23Q1CmsR,:!;ZBmZl7ec0iKU1/t1=!B+]I-$EfrY+kH=sqY\^jI)4Y$D(fck")34/IppXTUo!l)B?]Cln.U6.eJ_UE\r%[QE]C9WI<M3F:q)eK2.BGd_B%&HN3D^,VXh)X#&t8gf0LS>&bOQF\_]"5&(fgC1SLG`TJ-qtn]mnOu#(K?eZ-c4?CSjn3I0GD*B,\r%oK&%//%P(]FRX/6aDO[2?=.soM_dm@K2s%c36n1gH9#bfbSALT(W[K<ltKJO^]Zog5Ee4goX\7i8Li-E9WfDPEkL5??:iZfj7VH%\r%R8mQW591@=cUK@XI534&PJ]KK#E-2+N7^k=o=%er?;qs0/Of6r\]:-;&5&mB?8"1o%fB+JWDQ+:a0j8PQ!?)7+XX",#F$U/GfO#/\r%3Pf5<[[Ond%ofjZ5GCX;jVOHS9'N&ER!1B6>-ZJpaIS;93]T%eX-p*ZbU0EqUWHX^]d?4Md]VHCY?QbH0UcpJ[bJ$YV5KBm$.,!^\r%JJ_MncF0nDi)fV\bA.>LFm+d@ccHd/_GK%X#(uA!s$Ba'maP7b[LX/HDYCf$qSDn-qS1W>e6/<6'NR=U*HZ[*>s+I(bk$Bh_<)j<\r%r+3MJ&/@5Thn#h3^J@Itc\'!2UYf9[2HiTBb9^gOTS3170"U)TrT*2;*j=2eCX645rU``7$L.?&NYoCgX.np#df>?q@;b1Fa%&2)\r%U]84P?b38F9'L*$s,9#@S7P(F\hQ*\<gVmr]"of*gA74O^3(J=&$DA54%3Bun*9)R:X/[EpM]F^@sSp5RDW=YE=poZ`u#A`nJ=uP\r%fV@KgJQ[j$.imEf+l$%>0]?las8?ZHDUk*FGFcW$"oK)@I\C&+#6('%7MP?Y$%?:m+pau\nB9d+*@<e9L:UhN,bFqVr+Ga+/UPO1\r%rQ`[N&^4;5WNT<d@]90upK`"'$sI8/Ae3Tk067Ld^"M\sO7#ePK762>.e1EHJ$-I*iFh'(!!;[Qo3akZ:lXpKlOL>\Hp9L9d<='M\r%Y2n3KD@4C=FB\4u(&N95^(#G2mc[*o_)*=B>2CNc\fmkBX4-%lErrc"U>d56T7b^*b"g!Tcfmn5-&n-q!B(MMnKg+)[Qu9`^rPaK\r%lYc]c]KX@'#(;g$L`l-R`k;/!rJd34#'[6orCqN\j7#n7hmrW&=SRK?aq+f?fI;tE<&4n?amfq7(3"-tlYhGu2huX]Ur'QbO=b[n\r%eBDf6^ZZ\VTp9jS`P8q8[lmKTLh^t?>9(DjUk^-DcGps==*^pX/gEQd#/&L60+JW)6ci8K,o3+;U+a&,$n\X[m:-+^1c6Fp<55A,\r%I\M1*WsP=q78KK8>NgFS4/bX%?S*NfG)+FIJ4pFF;cT4R&dfqYdBCMMU>PL"/=W!oqWT]aIb#!Yj6L<=a*ZA1\s=dP%cD9JW'KTT\r%nmW1Q(Adt1=L/e9e8)%C3JrRV9Rk`AD&'78T<NX;T,_FWD76R1_-(tIp4V"m^GI$?CAha>K]+"4]l4AW!`DtBhR3]^BqtWIErBls\r%'EMhV(jEH^Y.:kHY\JB%Fm^$_n#0E,+*B3-]0DumHgbN<$Utr^].%B!]Ba7M41o>gF@dY-*.Ws]3aOC>g3`E@&9HEnOF4@JK?"G(\r%48!?XOKd[b)u%DJQO&-Xpra3(IS2mP]b.Yl6[`N%O,gpOf"(%ZCpfW(nJl.hoOF;F/.FA\97O7"cGUsig+3Y-O-9C==\/KH(kk18\r%XWNoUf.;F>4iC$(FT#YI+p\?Tp.1$tmhu)1rS3rj5_]0"C6C5T:_"b!`r^=peXA^bcVm(rB-DiIB@6KLYH84hrQ30ab>Q0iA>1+J\r%pPZ!?RG.hD`;K2Xf%Fp75!/duT=a+6f#d^I6iXe%Ui7.KF+'QLp@hT$afUaQ36.,K6=?EP@]9KK?iqu^j0/H-B"r.W#0st^[QnTb\r%CY'+umVfqJFotnh!PO+Vr5G]RU?:=#.h$%IM;d;/4bS17jF1G1\9D8'$G=?HH_jMh163K[r2Hq02><Q<75(4'g3W'oI,-P_I0OH:\r%ra'+ip%XBi/1s.%'c3MIe7HF!fqhB@*bD/A((Spc<)^O['`.a\Ji"2u"aqsP]i5Dgc-Cj$.d&Ql!eeNH"gi\!rYTP$0CQ"VCeL_!\r%rq)/kjL0Be_3ML_J[BULDD>,D6bpT$[tVLbn(mt)2r->kkVW=L#dsmDZ+Ec0`_#(`dXO3qP9=u2APP1*m;/bj^pf=%m%9XcaHcbZ\r%<9Q/6Ip#Lbm;G8\O';AUg8cg5DW>$hos3K!T5RgMX6'^&;$Ypn=8LQsd3q.c!sCMl/F<,CmCi6ro\r2WgHU-)"E1o]'q:P3GP6]-\r%Mc!p+EtL"sP>P#bBQBIPCq4+nX`XuYh)[`Nf$r82n[HPD`U7,JrtoUNpP\N!q[UB!j7^Z5DkV6YR67t8BR%dOYa9^,C%aff[PCkS\r%gMTB4YJL<(T&nMEGXUp_RDLAD=n!:]4&[^@F@gY>dsCA?$E\rS:XaET5b2opEDV/?bB4k,O0@rF`+a>p7M5?-W+lj&a6;3+s4"2f\r%'<@pOHbh:1dH7R*'XfS4&(ql)9[#MN_=T!b%[SQAQ5s.N?5VK.kMH80`W_a\5/1t%r2s=Lf2@Ag#O5\+_igkah:s^AqY?<L!1cdq\r%MsAEu&Uqt2:kD_s2cRXMDLiP"lN`[L-[ppW8ea-;hfq.VUoG@]M0.nH-'>dKI8A)#n(o@&]>Xi!q3kD6jaJK;:K!&E1cRT:2Ui^u\r%BQ/Kue3,WJ]Smc/B8JH)r0Ao44r4ZGnDFn^GhqfG*g93K_\f90dQANYF>fo&?aidgrD)\UdWf_j=[LIK)![/pH$$APjJ>)JjC`VC\r%d%&>+L\p*L]9qiELXf29Ko9umo3@)B$qO75g7fHc\WbqBig)Z#h(]=Y-VqXVW/N<0Ts6Nt#KiT"Vp1@H7,)a!'kYX[ol.I*8*jc5\r%Fc)GG`Tpl5j\D,ol"N.MRt.sAog/"cH)HYd,Pg)pAe>cb2hOG,Is9opaQ!+.n])WtNtD:-GHqcSB-A["(5n^l:O>+D69GTmhFoQL\r%a[/D^"M(8VEi1\#grTX)iU2t*mPH_&aup4q9cFNLmc"t1>8@Qi$9t_`GbAA/^Z[P$B`6WMGrdY-J&+9kFnMnCB57[XAY_t$hZSbU\r%1?o1SolU/rm9B$;<qGPL*^7C0!Qt&rV0)ZI-3;%U9h\%A+VD3YoPF7<>"7g7$d$ZPHFbj2]i%[Fk!k'c6D4B9^VejE*Tej,SMc>h\r%")l`^eEm,fY\U!sU>PLV*QY-olP5/lguHf\)Gn8:oBVZEFA6])a3_/,q6d8,9tRudde%V1=QCOh[9B9S4Zj)t\,Cf=Oa7ifBSt?H\r%5rJsRf>c:GH.]RtoX96PQfLYSK/l.0]e(#1NT=0\Upn;e[fI/*M;B#+g]e+'-@/lIEgt66SIt=I-F\Q\#nt!((:amP!3ji)!m#5*\r%Mgj_Fa7Bq)hA2%)B!OJZa`uU"DHS_9>[rua-\L:,TV]-:,.B"A`&f#\)trY20Ac5h@tShK>eIu6CE6cpj(Z2sb"%$B*=o[i\g6E`\r%.lFl^o]_?2Di4de3)X>JdG&,Q1?_Kq2f=Es[n0tMqN0J,P)F%rD%?;pGkAFHj>QYsZdIN:OkVS4_g4^cEgrdYdbA5ngRoTtU:8)c\r%[i&s:"2-9%\P5p=l#!]HD8@]k#^RFQ\P<+()86IF7!eE6PfU"mNYC)H6%rM:,<k3@ORNI\5%0\b5hH:l0jijNs#4dg&Huu\9h.3Q\r%MC:fK#bR_LVMHFl#X+HS0h%[t)@"(RU'VkPk)(+2+Z7">K^iAs/eA5aUWgB[S;iY!J1r-1MW#ZdC?r'LZlk=%b4D-m_I"R?0^IHU\r%8ecc62QJ7=#XUD->j0-sRih`X_<9IB.`d3JM"4CioR_W1/!EUEoRbg&7?n:p"KFJ868'1#6"c,dH?j"R?LUf+Q)S2+0BO=:[VGZX\r%`qp)HJPqU>^"A@<bg8uh4KP%J]CJlDckm`bj\Q*gSo]U-A,bf#OOX$/]g*00l]n93SK0;[leD;TgoNK!G@C@Xq'R&&DmE*Q4soJF\r%D6LHC\X-CioAOHe0>0*'N0o[iRq,J$6\6BO0:RqIYH.Kp.r(?pD[IFm=E-fVWPOLVa,3e8]Jpe139,nr9euR7AFqh&k\lUr?'<TA\r%lYhrKp`q*ODj&N*,br+G7XpV\r[&N]9euR7AFt@1aljo@rTCPp:gMcP9)E-2Oj'&g1a8MB,-9i\dYM:=Sb\9%r;CiSomLjoGj,]^\r%obX!U(?+<A&hkPfU@_g_JrW)piaXF97uiS+`5bd&BCRGFn^A8SG6mOT:`FiX'3GC*C::Nm5<4XUie8'F4SI$5IgIlL(22TAW!,s)\r%ajaAIA)Job^)=&phUXbdbn;*f!BuIh&\fuX!YZ2M+JjH!+k[?Y;4.;iA&0R(c6&6>,uQHC.'VkVF?H3$;A`gV;oM<9UbKY6/@qYP\r%0FI/U0n9s!(o;:kNU-<K/0@=1<,>Ngc)#U\3EQ5-KFQSQ55GY.fB9RO_'L_-MS&/PC:u%L*(+Y:gub9e[bS6#i.q<u6,21r^=44)\r%KuLC4Q^jZ$.BF=(HWn72)=b7cWYD0+4[qZ,8!WN#0qYTjAI!CZFP\LMXJ1=1BK+E/'dpKIM8-mn_LjJJ^V3t4%2GK_H`ZEAP_@Tb\r%<Rb@!%BtnG?d2AKb:]G5p(@7R&tCUe5UF6@%NH7t??J$C0BI&>DKg:`](_Vo3h0>H3X2%+/n\.flXVtC`l;U%j,s<C'B/IGE-aaq\r%/[1?'GM8ksCYL%XaO18rq(E')Y_6(%;dni]E5]ZK-e0]^nh\Ph\bTSt^H?2s4rhidc-Gk%rNFMalL5g=B%b"%lKln0Rc@\k*c9me\r%DUr<hCG$MR0s84m.Zjds(tZ_-PrO;WO6/d(?^e*fU=+3HPqFY<:>-MR1RlYEkM^1Ej/dXZ4)!O>F;sJe\G(">][P)Q<S(ElQ+77u\r%Q2>;HoD@c70tZ?=;H3:\mb2-!mOmnYhh^N7'NIiXC3\/V`l&$kXbMHlYj[?ZXUb'ebOI1<49fY99bqKkk+B!f$>pGYX5Re5R#d*F\r%=q+82`JUAQXOX)H5<K/"L's!s9rDk3,"Ud3_HuJPUE[ne4KLJ`O4!LSo!H%g^XHdqIA+<_8M&_f?b;'d(E)?;Sr--;L%=(MZ`ANY\r%(/E*cOL6"'J!%d%PG<W$X'e@Pi6iU:>qCsSG]cVf^c@QYD=7t[XOZg](7;mqaBB$kgn<p?DV^cM4:F3dIfh5n7+Q+c'o"S]2>llC\r%,.fa'f';^8FPCUhE@@h7CXq#$X?lGdV!+J0]p=;j/R`VWh"e!X(!MBL>WF$bVif."-m\OoX86)g[VQ*:SA1"abco[JO"^J0\t;L#\r%5j\ZhW^TSf-PSVK>-_AUog1*LNfY3%-[T<?)Y;iH]pl_%C74U-@63Jh[keGLc%4oK<s^nH1l3h9-"o<RFu65_WR9M4-e$+$7VI*8\r%T$G\Ra/8)1Gre<OM,X)%Nm829kXVldY8)6_<IO57$%a]XS4(>0GYPhg3&Ep`L=_Y<&#\ADcE`;+s+tZ=%D<Ta5K2)GiP*atnlh^F\r%2<r,4/?]3q?DBPAaRWN-iAGrTK.O20)IA&C2J3Ccd/`.9jWkYcIkACn[7`+8[_*AhG\ncEMLd)U%BiWG).\$[28$X_8?=K`?Glad\r%<^lK/6]_F<;-ek43ECBqJ#QP"]PbN,X?Ur9BWN?O%'L-<`RjZaT]*:5K4RJ6BFV-oSL?H,YOT?qDg<q]n/<ZIqHI861qY1'%9&SE\r%!Y)?<s-UR_[6VWFWu_YQ58IdS%JNu/H($/!CF.X(>+jh35%FSXf)hd39!IEb5\Ub3a8@Nm"WC\d.u\H=1llbt^+TEIBo-YDDDRE(\r%=_bh?rrah-UVr\2OA$pdL?GfMe\'T=3JM9^Ko)983\B3KPl#\iMm)&o>OH"fPnATiDRg:lqGDj:fQ&([8VJT58$;t#c:&8UcAu1"\r%eK[RhrFf7iE&cne%J=jD>Hc6cM5qPrA"96d;m'k6Sd`f(@n!<liR.SU54FMW'KXJL<#>P6T7!?;qt2b(VbaMl;$:>6_:?;?ok@Ai\r%4OlZ,ElB!WZY4es/%CuaN$O0;9(g)sq(^H2)V#@ZjsO?Sj\C&/e,0>.;>@)=!]<3H0W2c$HGJi9Cr;tVZgWPEg7[=N@#]a+$O8(C\r%?k$9kAPhaANDr[%]8`_KhEH;k-OP?\h<R)t:%_^Ts5#3!gT[iSjf1KLSEqHbOe59C7/WbO>Vf4(0\81h>D-aC$m,J!(P%tiFJ!cs\r%/O]gfKdroGLusMBa2<?Be!cp`gOiLNI$t%ReS%+t5fG00;UiqMPT2,eC#5Vf3L(p>S6(YtHN\#6_A,A8[\V@T%=8?IUWqB_UtY/V\r%pYS_B3IGsK3#J!F>4U"i;E0^ibbpe/-U^p#L>OtG:<;JZjmN^#r`MYb6Q=l&?AE4Arm6Pfk7B5r++!(l1Zt\,0;*,A**K&&MN\p(\r%RC`59Yn33.Tj:?p=9rC>B]W=17l>R$+l!b]C7n;n<$fV'&rkB%7+JDj-IJud7(5m4g1_25du<4iKUP<hc9bJIAmfObAu#cU"RnLn\r%$D1NT,tX-C6'iAD16TBrW_dSsBI2:X>+eGDQY.,B8MlF-7P'be4_Q8`*X`)>*+gr\TX6E*dEb=u;o0#Ls$uPpJ:(4L[b^BTj"D0V\r%C_\>(TJ&*X6Lo-)JaTGP.U$dTI\7bkZ@Pmtcm/gOM>YF^YZi)L*^"ledd&-1AXOuq'aXB(W:9M<5ce`>/LRBOFPmc0Ne_n.;'s`F\r%ebrg\cn7M"9L1hToelC:N'"beQ;&/oj:K<nF>62o@E_(T6WZL@0]on-P_:b%kR?6D-55WG(=Hm"A29:MK4jgj,$E[u9[&Ks.<(O>\r%!CVQ(I-,fer%t2C2\YFo@&GA-WFjUIF>E#m)aBp4,SoftDl8(L28@VTT:\<X]r06b_neNX!e"103M1UcG>mZ)eW*/n9`pYYZ^Mo+\r%\lD4bmc_6jn,CS.ApO!Yf_V"]T!\fPVT.i?&\:P2'7,_+k[qAl46YP/Y8VR]4bTm)$L3J#.S\92rnOD:Q,jr"b!qC'<<D#:`g*tC\r%k4J(:G"Hdp.0c@XQ-1sF?)o>$>TSjgW,HXSq&Vbda6d]>;Kf:a]OJ(N`CdZ3"1U;:H9WD*I`0D,+l0Ve=9Yu%gi&G)OUenPe"1Z$\r%*U._OiJr"LhJ9VY@]1MWlB[#qk=>S]V:/:8BY>f)".bI(9P:tPS:</H(1:)=o=M?,<hZ)]rlOW0&<Brf?gq&,7B?kZj^,n;Vk%-Z\r%o*cA80Oe<1XU\u`H>4El9)NJT=6C>Pn'r^V_:u8h<BAcihn-KI,k6\5BSlFb5m/)l.&n+7#_=K7`?"F)d/d="]r+6"Bk"d&]%C9<\r%ZKb%HJ,A#8J\FWqlG6.GNsSZhfK,]@F;\0;6*ub1@&o4.9bi)[[=Y_Z5s&&p:VZ$X/>USnMR<e/D^@ZdAdi&O/To83Qf6+;Aj^_4\r%B]&U\L446/6d934"-io356<Tpcj`=3o;D,].*9b0?,'L?p<hRhZUuK)JS:A_/HQ8>U(>u>X&)\n>GJ!F;ccs<Wqk1ZKbC![*pgu7\r%fr)1eGU>&_R!fn2J9Q2#+n)-'-(;P<*fGQrf]]g?J<ZYWrQ'>oa.3M4?6FM(]a@:'.4nCm;0fHCBj3&3,F(.`PSVrhaXkZhVmOM\\r%GcIu\T@+offLq2aqioK0+_LEs/cTbC(G8JV.4n'9p9kECl"TV0IbCX+*'M2XS2L2.(=[pr%"%[s9.j$<lr+_![FGcj[4K'V[d6rH\r%]%f#qiMX?-:<=1d!==17U@NOnLeO21BeI:h/VP_PPUj/33r>-We:O-]4o:HZe?YZo[d6rHjO6q)1c"rmp9locCK[u>BlA!@p)n5G\r%.;eW)]#Qe9:MH"gEI''Tp*jkL.I<>dfr)4!Vi&W\I7h]"F#^W_A=q;Un5,1iOaTh0>G8+DOaTh0>@CTSk3Q%#jAS1KB$NT:7@t9Z\r%-i9,dq%S1T0k[-,\ogA4-@>G8X]m`1.QOe1C#-@caO;':=7KeCOh%;:%lh>b;uGtiomlWi5d9fch:\]Pqad2c?#pi*Qk_/^p*m+T\r%2fM8ud]Eo_32eH3ZVOqpBJ$jDR`pnB8o*+^W+):SW)>AS$7l%I,t4*^fg*RDq!&6+ILGmu;n0,/Be?seX)L/879Odi-K`7Pln6'3\r%cQ^)3#u1;VRsdnuTS<)3ED]'MBj"-_VmORDJ;^[FT@,'Y)W$+Jfr)4!VpN2_B:mU!T>JasSpa4HO$Gh>=L(_:m1E_rB$WZ;2=re)\r%AluB8Baqb8)MU-He<>9[/MqrXr/simI3hhc.;eW)>%'Cr:MH"gXkJpiqimDRVPlW1VmKJ1J69'hT@-md-n8$d.;eW)lM(L)/Rcc!\r%L7])op*hT>$rgpFdql'(5Pp\2B83EMNpK\J(Bj5-&F7[(kCR)H(Y\6)S3C$/hMUcRJEnrPlr.)f(9/rHZ;52\Z'`c3-qMEu#nX(X\r%$CQl0AtRM_+P=(J;t_ZB$Nf&VH"A?;/dR3@/Sk&/D=XZgB>L$b8t14.W'&b2[(!`(UF<-Nn['g()Dh7Is->"bVmORD8otPT8G4KL\r%nu8ASA=q9sT3Ae"CtY_naeq$AJgpS]QM4se0XG>_ddk-=HAj<MP]dmR?%!SS#A!72G8>1H%eAfa.ASEaJu5p^id;6a[`\]_PGS'p\r%KRXb74pQ`K#0ng+Hk$Du9MspI*4RtcdX2O\b5laHbi!P->Rp79OlUSV?_e1$k#=X<cN.b)%$tQd4pPWI<[@M]OS=X#p;)ut:;fhq\r%Oq=LhoOUj(T*&!iK9r#XT*'+od9\9HkC>5U1VSi-m/+)9%L=5:oIo3P%UqMQ0_l]M%bgR>Q/ZjMg(e_LV"kuAQ\/\bO@W*)U<<'f\r%+>*nVf.K1ocU!:01)8sLZ@!.<.fgd*Z@!/'nVk+^3Bd\djhP-AV"bo@QNII_;7OpQEB16DW$M-XO?no$b4@V9F>8aF`:Z-Xm1rXi\r%cc#H4W'@I4ZGl/J3#_.6mD1cUhJ+^^jT*iQl-+Djk[m3KF'p>r2IHI5pJ)7F`+WUF=jLtmD8I3)IDoE^-R6$>pG08![fGc[Yfn#4\r%)nO*h^POaE9:r.%g$KP+;Si<Uo2"tQC<3*.msR,:@(QAP]HuU8Z++\=6P>mUG4b:g@Cq57h5p5j?FF&dfBoKpW<+!Tm1)0)'7a#B\r%(HQcJLM\/gFq#?Z!5F^9B`]&,KC*jH,R2]HI=YNCN__Npe;:^fX1Q!7qtn]m>Ku0qku)`4k``%`$g?h%I^)2D6A*KfCq?P9][<[L\r%0"drHCGJ[]f;lQ-.@f_^ZS;&o0X\%2ML9A`Z%/Du]\Dp&I^8Zh@3+0K&C"/EWabSc\]:-;Y`PrVSC<M.D.bP2h47nkLXp!MfFI05\r%d%)^HlIC%M`H?BR]cAM"`--?R]cGMk:ePr?TF@:-HA57m1u6uMUfNGrUg:O#/56PaqJj-Z!tQA?!Cid/_UmTM>[_lB4tO#JQR0XZ\r%=\Ctt%196*iG)b<WhT>9Vpa_)k3k?h&=!$hK[r4j[9.Zhb@YWAl4sbe4]TNPS"^8h0Qh=saEo[A\IqjniX38\__Y8?&l8,QebB\5\r%G$d=6g&tEG0ZA9)q?0eh@`A$I=/3'MENhOCj@6<r")ic@q"?DLMQn'g]N;DGMBN;+pIcm*7M5;H;6?RC"BCe<Eh$/b<e;eD,Km]1\r%DATp('p56=\_-GOLu@QRAZ1JX:^'@[YRFMd$*'@)&X&h;-:&BXUp(8-0aXk;)P3WP-:-2,:n>m.'dFhVpg_,XWgGYUUNijA,!b#&\r%1/u4<W+%)!TBR<6n/8nHYN_P(@A5nK(Z@RoS=qF03"O)[M7._gFcLb"KChWOrtY7#L]g_&?C7hN@O7tA'?.`q<A=f[:,WfmUID!+\r%S+5hMB;h\],cCooW>QSR@M2XS*=hlb]O=,>8uAC[:u-U/9Me0M-#R),OJ$@D@o8)\]EtU2jU'+,'pG;jW)=m-*eBEl\.^D*nd'nB\r%2+P#ALatbk;58,XrWH4iAMdg'2s#3eEgHg3npja-qO?\l`gVtp2WaX7EZ6!CiMPBOs#@n4Nn0GAgD7\*8%iBe&,$fb;6Q932lt+6\r%9Y!;u%Z2aTPhT]iD6Z03R;urc<bpZkgu19+DF)bF_j;2r3\.m#k`%?dEdOT[0N2F7jkaamP"HT4?Q<#4jF-t*bfWWkCs),oTbKMa\r%gh)'0]p"MUqRB504e8%98hoH$S8I<O$TI1EAuTd<EXU/,VX)`j1jS&Wgn%88;5KY#H`j?ceQen!\#3.\C];+Uc.T(i-(<DLgLJ?B\r%FF:r"\RV`qU7/GK>#DaXGG]cF6='=l+0@c:H&jD`A]ammJdo.cQ]t0\XV>Bjl&#jKH70YeeOAc-9S#dGrcUNhi@TXkgGEu6K!u#4\r%lE=UP@W.r!bWQHU%;kT@7_P0Ik\QOVKuEL63/Xo6s!t59h:D_.H;c9^]6G@^h.CgVR()9CU>PJ@9Cb<A%r_";>T8X\@,mF\r.TkD\r%a]c1#qUf(BfB%69pM`&ue%=497;]8QhZ2GIX3fMVh8&uIJ)ICnUH>4hpC3W-BQRn2P^ERGrJg6l!YARjQ%:s1M6^dmKin%X`Z`5T\r%4<Yr&=PPY_d(DjUZ+MbYC`/P@isQN0EQbR#UCS&Ub3b="@CHp?VVE41(>?`<Qu[Oa=Cr!UWG^a[@A24,>):-L__SDZ%r%)VZA2JJ\r%5gnNbF^Iu#XPlJZ+iNB+@Gtj+VEo`Bjl^XGVMUdr)6>B%mQ`Y@:hOZdNkr%pQ8:HClJ_(W8^?,Z>TR%ngk;V]=_a+i\]HfIe?uTP\r%\VU`QjRA%NjsEJZF+jo:@WBSqCkO`@LrJ3G;rmETLmrPM<X/o8\7Jc]oco/mgbLGIdENl)MC$/\3.Zi,O\:F_F5E[F=PPY_i$jLo\r%fD0FPi9IYTlY'j3O>0.YdIYG`S.$SBloP(qn#*dL<*<%(Tl9;5O4F<HW^*q-1Qg?MCh+W+/,0"jD!b1pISCRqTe(O2@rh@AKsD[j\r%@5!uo&BZcT2d\6h*gCgD<F-&dZ=pO'q4T@P>5EkS!hh1;]MLYQo0?H9)@0r[5[!ih\f[/*l_EZpZC\g@6!;Q;cm:2fhInGgbL!rn\r%qu58F<l5HjEp1KPI/a2hH3f20XQr2E2IqKH!3]o]Z!p%&kYCi'=i\dgk^;&4-ZCO1ZAL-b"<=%NaEhHm*QE]:E+d!R3u!lg,rAu[\r%5Xp?=LSCFmGJ]TGHs,t,@%n[QTWI>FE$u*Y_?"&15U_P1Ko$+IR4A]TQ\H0rlF_?5DWA')B^@<&@42M+(-u>o5U]8KnuA3>Gu[p1\r%rGJePVfTBEPk(jNpMp^#5"cVRp"CqEb,b%%!3oum,/(Vr`)THl.\$@ge5N^B4oA3Pj]/ek7*iSPGnk2sd<-$LY<p4XWF#b+aHfo<\r%Z>AUCX/t5+i$_&a2uQr#`L)ghk_u3+1CFO?$Us/7Z_.VB1?OmM%8q:eP>PUR6oT)j2]:F%V>23SE"chN77B.Tl`Q1Z59d\\7sC5Z\r%V7Ud?Q,1jBgqc_CFV>YK`!os"1so%A_+j$<%@:'KJWGb-iXTj`j3c->j'X1o$?PJ'[E-?]'q%rSSdIAfE"b^uU8".*]YR<sYB<6T\r%'DI]ccpTg4#<+pP)]@Irjpc3+</TldmbfFG2ZSBN#9>sm9Sd5li$OhN7n,FW#<+(]7<B2eE0K>8k;ZpME"d>@OjQnY_+j-P`R\V>\r%=(S(2/@I/]IW1LF;FEH`#<+(]V'LsL\-[Ko6q'%S#<0J6)&_8K*S_@q76iGAU-O>R08WQ['I1*omE!]&:#*QZcm;+M2fT']R<W:f\r%F;&k;'70AIURScGS'X;f&)lks(k\:t$G0+?LG-//;(86/\EEHI.@JZ49lYcSo!"<oGY/Bhp*6?%fP*K\4Un#P/.1B\NYN-S87^Og\r%A3e5p%$FdhU#ldS"?5<=,q?K_41NDr?6c26\:(a/IQos+M*&5h@&ZR_2fTN#.$D?bLYT^?O>S/S@>U0KiG;W+Jt(+M(*25L*S`JW\r%o7mN%0a9S1RQijEM*&5h@+n+=2fT']=^8J`kU,`U-;uK5*o4aTgk<#^W,f8oIhb>#'gmHc6iVWaL<tg&g%q`d'!<)*kse?`s!id&\r%.YdpPLAiZWr[N[%.YdpPLAm5`L6b`Pr7ng0FV3u\m7.Ua<7-0MIW!qS7i(I3mH;K+pL;#;\Gb3md2<Vaa6i'04mf)clc8C:.&.Fl\r%l,W23$3RaNZ$tJWX>!*9nA:-2Q,A[;Ntl9)@ghngp63S=o,i$GA-2_M6N#\j:JhBL0t_DZMX7Pe>YbG8;?Ft_F,h!oIb]C6&?a',\r%qJf$O`^TZBq[$cjfb`tpmH;J0_GOk9j7[QS<`IIqgjX.r0]s8<`uXN:0@Gp9n$_sh$OUQL4RJ"MglL3NpZ:<_#kI#QF3j"Aj7[QS\r%#1ec95Ai^BQRdhmL`a)JmgDo+K_f]cn\,E*>biINh_57UY(ZXkqmg^!;er`^[qT-0r'M,Gla8UK5?C/NE]h+*ID"i0k:[>!?NRQE\r%$2Y':(J.c8,Y;%!QmGBd/4GP\-%#O*.)0btR0_-%,tYCU8!]Ge9;ld-(R(.299NhFIQpl!ltq-3#nj(eZ=J<sT)2t^-DTT/HD@3"\r%-H@"!cB9b)pKp"e5UN+NjR=_RZc,OaO9npkd^!ChR?*N:A9[kQq7oe&Ub#Z?c@Q4;o'lL/B$!MXhF1ts'"H&..ODODGb[VhZEu/c\r%;W0%(]I[3+9l9TsKIg7-2]5^1<L,29AXeWtPG64CP,2AkGdCp`'R$'!=hU:fX6&e.'$E\_4f.8nJ$%t5?h5#BqV/dAis3`D+f\oO\r%?FF8maHq=UR#VF'rB*+Y[1=iFpOI$PEA=b<'L,`^d>:B3aJ)1>G+];a2d.c)"*-N^N`$rRT$IFjaR7U+iL>@USURP,.6[t>[PEqg\r%3BdZN[K8W$GDtnAic-qoKmI9D4pPuFSTpcZ\e3A$_cDk&/g3^8"'_0LV.nQhQLu**9Aroo0XhaY]+f-_B@P&>&YEM<J!^c,:\fo7\r%paaUa#O\i(&&=_2<$%R$&@[$hq7Vh*1J'9^,,hG8P2Pp"4qC63HA=QeW(8sB&Up72hh;HfUki7_EN-8SAR>>#RI]=_hK>]aD/J*)\r%c=/q#iO9>8jqNZB6.4!9?HhLdNqVFVm2SPN(TQMRFCh-<A?\0r365MBSd_j?`-5d[IpEOSZ$[0L`ij52X&aF8$,Y=6"U]7"6R&Qi\r%,%k+W`V;6B]/)Fs:\$X@!kE8)r>EK.)2M3AT0G]Q+Mc.&jX"#`]//)E3)4sXE-DLKJa]*bVCg16e4np!7b)_1gDlu"D(R&GMLefW\r%+[$kE;sClF%kF=1l>,#)g(GQ[>5Z-$'s?(*Zt<=nMhSWCpj(iD`P"J@XLG%(DDjFmp^ei=H\H!Q=N'MPk[0@qqLs)FMjD]&S%<ck\r%dN2iqErZ[dF[X")Tf!]0d4Z<F\'Vp?1FfcCLIH(,3N;8BPMQL#WF]qVRV6Hfc0>FE/SS;H]tSZ4J+&<5JObBp>[2lu):MGC\[Vct\r%;cJ%Q\7F]Rl):[g>_9jr\Snjc\/#R`*Xb%#,_#TBB+3-)3Z0dVSXHXeiSYS4F9Zg08FVRnSqtLF2D->7SnP0?_rurrioB1sY^Z2E\r%e#]W6De&a>1&2*<&c*(X?1h;VV(n4]W!*ePZ/YioV6Q$;j6HWeGi1;NTWjOYQ5Y6/'P/KicGjl$[t!9AI,'qP"<M"s@FQtC7M=K7\r%&oMOfXiMroNJ-827Z8T.,G>E^N1jQk/^01]aiDjc2g^X`"o*#@#AIrBrt*35l!o?"^&Ue47RIJL/P'_-_.Y6jW"anF8+FK/.,j*G\r%cr`mo)G1R4&rT*"8"[0uTEc<+]^)@ra.7o4_IF_Ed>>ODZigF";&B"s,?H6VV9gF;h^;b6<Eo:H5G+SUYGe-8lVDjGPI]TAM^*p3\r%G#]B6L!YQ30kfB2rR/cjM/b#LTGeVc7,J8Rd^-c\4OpiVjW<j<%1oepVn,-j#[0>jTF[`-N1^?m.Rj\\bQqD<MORk\5Rj"r"]bV4\r%-.oLBop$RP.p:W>prcMK_bke6/bh2,'Q"WENAELs'Q'/1E]7/9D&-<qGT/5l2Ts%%-l]:\,5q@e`bMm?q"8oMTRY@mDqpWEf9b7j\r%s3Rrf&T-DqgYk"S9;=pQ]I>=SUIERB);H9Aq*b=$epl;`,JJ4@lscKE(.F^hW8*A5>[<LLk<@7LLG`7#a)?#<@GjNU8^'SCqk/:0\r%)DdMK=@sPQnp)PU3&p7i1Jjo6Yql,6bV890WmQAPS+bYHJkc,Y4ru\mR#J\,m]jJ`e:t;(o]?OF&\?Hc)VFmkbDc06L"=3s`3aHO\r%iTE0Apg&OndDrV4RaCgeC?W@JqBijS))Z,@X[;U<Zi]m;61/_1&jZ#3g5i#9>gkmD=rON-<7=%<^OU0.>gklWc)FD6'U9H/k:u@F\r%.(K(Hq``<JB>&r;elUSeZY.q^)=qCt#(7P>5"2jgqR4jR\,pQSGML]`&O;E]:H&IFmTIm))8s>Ee((C@Q#2QNn%l@9pKdUh%B.=+\r%mm7hug@)adlD0;tmq#62:k0e6nhMRfk.jo)nM7;g&qCkK;$I>/$j##'1#DY=-"&q)kB$bZ7@cb?,*SOq>rCtF>NdU>@Vt-EJJbjl\r%pI4P_DMB%A=t\&@[%C[e(1:[beXmr>T0dOJStUPkLU"m:Y.Yk7--Ud4JEi_OYhF*TYjG]MHhbF)5;ghmbs.3R$G-*"o-]4?@5HX1\r%MLDZtY70'U5he"14#b9VXp;=Tb`qlS"p=055SM)8Ob0rIDM0rNrAAI^'guKa0?]&=Yh>\I>u=SC<o_YXj5S8e4o@c?B96LZkiimk\r%dOW.Md%gP+l^/*e6''P=qCFDG#!G[F>/t0@%Do=$bs;<W^ap>^S7714.@0>FACoq=N#)?\I27&!nE]7VS1Y@p/gS`aP(:M,'/\;q\r%?]C)R^&,c+%JB=^KdKp*m\1Z/X1Oi<=?$*tmJ:A"MOPIX/?"Q5R[=(\<h(DGNb>Atd.?8FAM'ZIm]`Tr*.[X9V[H2j#3]2P)&6c,\r%M^<9X(ok`!UgqHO'9&d1!i?<gSR=!K(?WL0?ZUd<9n9k]"?$RFCGP&M^4B!J>gl2aU!YO<ekWX6T;s9Q7Z4"._K@V@ULgo;>CgXW\r%ab\khZmaWZ94c#gB\?.$_/344IuLDTU1gkIQ+PG<BX8D<]@!?dZ`q$,YL/fU9r?YroNCAs/_@i*7Z4"cZJ:"_)D1CejO7d>Zrs=K\r%j))/"Rru4XhIb`sP,$FqU;$VDQD/CY>!b$"GYC"<Jc0?=i+]QCZT*Z,D#@egq7M\&7@WE+puHZrJc^P1d@t<\%-B6FUIB/sXhBmm\r%d@t<\^jV6>d5jn?8^2r0RBt;8aqPVi6o9[5F$JMTW7_fC_6f!Pg2d'&$D,6AC'NgCBBh4kc^lUT4LodOY^J<.d(Qd^c:o+./R_&g\r%JnTY%U'j!sWuc;RSpE!\nnV=%H8o3WF$/[*=H;T<(N_GE*+V?(75)*[$'stW"4PT=@d&CbZCkJPM5:T+aF^'X&kEhGYIU,RW5tY?\r%H?pu.PsQ;ZO9H@VOmMOCMP^c-H3:5c&l0>9O9H*M\8]$PLF`_sQit!nLF`_[;$h>1%p9ID4pc<s%p9H!KdG(L4_-jc_T8AXHH:\g\r%,tXa;H>Xh2L(R,roT05rDKRX=Yg,cUoT07DH*UP`TSG(SH80+p+k!/g#p:40_+5^4rZ(f@Lo1W,aF\ugq4`Ii/WU1J6,3FWoSk6^\r%(R##^M5%q]?Tdr!kaTeh?aI)#*;#02K"0\S:D`Yb"oh4o"^]XcV_1O@?*Nt/k`BT5A3nGN&Pj58OSdC>.>'8:3?G!p8tZQ<aF[N&\r%-Rn)BO9L1;0.Z(LO9OSaP<]rVO9IA:=&R$k+U^W5`'Y>W5,++Qfq!Y7h5%`Yp4)iT?DCdWW%i8hiF_ZD?9iGeothZc@p!N[?!Ucu\r%><l&Fi/LdGF48j7^#!`#;eX^Pm9O)54Lse]d</SQ4!)"_%sLt0<EK^PQk.p]Y-rfZfh2q/VUK'sGHl;Fb9jN]<l)tC.I8T)'fD:o\r%4JQUQBG7+Vj*1-5p*?3\c=YT"ldfdThe@LG)LaN_g`sm@7U&*'l.d7h%cDUe*<=pW9kpdi.2<*detdA=Vi6.BQ+Lh((M.*afUaND\r%iO`t&jm"2G4mjEZVFsS9Qi?r2?-M4*=Sa?r*(G3KlP:ms4l:P_XD51VcA^^7#`Y/?**<DBkWOAGO5&>[V<eJo$:9OW05.M=0/q\I\r%lPE@aFqTCgf`>H2nQqln&f0uuNqZ_a:%:;)q+F]&=$Y5M0^aStHj*8c'p/N(Jam'V*qKp;d_!Pp>\G]N[8l+T4gbXah"OTn^HNPo\r%gOIDMO"]eAdhIDoJ^c"d,DD")-0iYeoVJKaU:rbA'L.lBUV>_Kl,ASWH7lq$jh<8/92VNRIJjOPKp>e0(!RH"lW3A%4j;gNB8bUf\r%3IiQgIDf^VNip+X1e63h^@$T(5`so-=J+Xq1KjrC52FOh&9rWPmXhN1o_0+0a2PVKZ`'kW?Pl_O$\j!9RVE=`.:7NmTS:(:9DM1U\r%HOC<'l6ekH?[gj`JFACjq==+m1jp*d;nh&O_`T:6cFhcuoO/dSGO2:AA`M'Qif:V%BH-^8_ND^R*HJ2*D;;Zrgi3c:A`M'QiXU3E\r%Ul@IFM7`^cL=s(l6];^+mN*0=J&$oq`8-mai4X^@]hC&lqm+h<RE7>*XJI^mLX_8R)g?2INC%.8c=Gp`UIT<NVFWG3-LT1G=t5nn\r%M0l/!1/.9gh<+q(5P+Zed@7Y`Hn<^cS_M*=TsBN@Lbh7_Aj$oIj3DN$Nq`K#)g<^8/pL(F9c)&n)ttcppX>tE8[0eZAL[+",m)I,\r%K4i/N.N.b-GUgTB/MVL9m6^E8>='@Qc(NFp33Gp_T:?!58j(::4Rft=EC=.rlhk9'IE'=>*?9ptd<QJVlW6X#l4o=pJV]U/4Nl`D\r%#9d8[n1<)(KHaT/n1<=25&NbW/3M+SP_'K!:-@k(&&ts&;]1I+M8?NKWt:)#_%dZ9B0gYPL1lF[ZQ']r+<\L]B;+Y.)1tV8B>LB&\r%%+,]?B;&T^'[[PGB3AqO@AQ+OT&l?WE$ZW^j&r<!%n3kDi)uA\V$GDRlo7%8n>rS&;@K/9W_J;)B*%HF%+,EuZ`^e.[!3A?O[B^4\r%0mK"8]M!'HnC`QLKcEa$-_?%cI9rB&5G<M#_R"35@0iSR#1%=!(;)&,0V67Op.L6Tg&0n26q[r[KjJ?e#&7h>ZceAXIT+r51LqU6\r%08i/Tor3nJd.6D,["VQPO.STDEi[k.>1<>L.c^]hN1n6D&_%*Bad2ldJZ't3>5h%a4.`1p(qQn6GM;m[@XX`nc5l%$lj>=JI?p"X\r%b,Wg_eRu_KB3/colE^KP@97-ilEejOc_Ae_]M6W-jK9/;n%160eDp.5,'@mPT1Ds@0&b!#pq_5b^@D,X9764POepqZ9`sln!q]\N\r%P-+?>[to><>o.5O/Y_+m8]Vq-If8ZQBR6rULR.k>XqmIiq0D73Cn[\XLo^D>H8.XC$Yr2e(P9hWE9?"QXp*,Z[pX":IdrR-_7N'$\r%oAs]"n/7^/L6%%uk0)S,D5"Z6oW,VO-*N[El!]((PuesR^P"jXSL6!=YIM0(Vk7i)r+3O0^V+AK^<=bd;%&B^h$kfY`MCr$Gbq4K\r%@S&0QJ_d&g`[HQ@8@h7Z<KNJI9Rs8pp7T46@KLY&2F1AM0i(ggI9nY024kAu*K;iZO"Z7$_TY\/W.NpmC7.5%;7$@t_gP:S!MS+.\r%]:aA'pYGc7f3U(k<iB;pWB'A:a*oaK5C34X]AFu)o]=IU]!MB`JK&*md+DPjYQ+OnX^08UC:Ho_7R+Z!HKS][g5ND!Ieql,pK/1l\r%qT<4i=]cd2WRouDTVlANph[+t(Rpn0W1$q.jDVM/gM#,#XeFl;!>nn?#,td=koe/9E]h!m`B'`->3N7Ce5m$[L&AN*]pN*QcVFn;\r%kV%*Kq7F1%>+o7"5d+'Vp=]Uj*`n9`fCiDD[B$VdKkXsHb<f.B+5aFZQ=ZaE;dqF4oN2mkn&A#8!o#TAP"UD#L>)r>]V.eB1#":W\r%i1CHtebE"b-@W>YGHC89rdc`3m9eT/Ah0U@hrZGpZP?p?$Y(\RSS[g2jfoPo'=[aoZ.Y$3jPkjQN.J,MdE9#ej=;h-8@3:dauNXq\r%;,Q@'kO^plGE[=W!00)p,2X5M!'V:U&j0D!)52k6qeDpP4BsEHYI)A0m,<O2WA5^UY_S,s;=oos>8lT:af!`'[tb>lUs_ZFD*+;%\r%j5R>0AqVE7AEFq6`NW^_r\0p&b%d4[BU,QqoOaNICl'm1!8V-!Asj*F4_mpej*5D"`shq"[-oEf+3)Pj0N^9NbrM]4E&,Wto=%eJ\r%CS[L%`(GVAB4s?70QYNh-6:in%gJk?Mk-:RWb:;QS/uH@B*tt1F&%ema-HNKcCE@):$kPEX?!3!RM2nN.W`mBkr@gqSe6W5\Vb%F\r%3R_(q&*ZtrbIi$UM@kLc8D=tFJr'A)3j7F56+r[,lJ:'80j*+b>3dKEqF=V:[,/!Y`H6Otn4eMt3-i!:CP6niG3!?bR3g?c]FM>8\r%k>IfCI2V_dab/nboY1$cBR.(c[U_I/!:Mi'd>#o2^5$oJ,SufToQ..2V\TpL.D/mOTh=Dl_o')T<?J'$$m"f&>]V:](+-_::,4rE\r%>CSM#Lm.Df,mUPM2jVXRR5MdIm6L".A[lD#_/h4^>([m0,KJ6*J(=RP1NjI4YQc,u<o^NphFk52K(aV-:M"LjBBSW7>ed&#/GaCb\r%LTXH:%Jc:'S=TCQ(dNOX\k`7mXLZ9U:.(@Y4LOq$:rfbNm:nau!842^/p5nrCO0_N?I^\E2FluEk-kaV_tEA-)m--0lXZQ@C!Y:$\r%c$DeXFo!H>_RXTOCT*(O?\Ys/h&V3k(;*TQD1=JrD6WcKKO1Y];ReNi6ej>c`*]E^Qc/7c7Cu<a%_@UZ?ZbW+rK-flYW.*ZY1%(G\r%pJXW$>GmOr+^f99%pZ$SXH1\g0moPcAImcJGohhp:!>Y8q"'F)<r/rI7Puf]>NrUl_`Du7eCLeQ\MYf;c2\U\0=TBuqEZcHXOQ-Q\r%[(%)L4I=H?;+ud]<79[&b$<+UZrdC3@jbWjhY/u[/VmX,eQ<4><]8;[3n*?ZmDD/hY\s0]gDk+h2%Y2M->G?B92!u89f)keqm[RY\r%b7HnUOSnKIZWp%->ZAsjoBLe+A^4>C;(5dc(#$dA%A67pU,j.AfN2^P3=i+;]TXQN[YZL+Ap/jnEkOP[m@j3e2l&n,N-%(:d:*U"\r%V8R%%N7+Dtd`1PDp2Oe@FL2lkf!)Kcb\/^>E#@1Q-sE_%9p_0S;sD`QnZDV:9CmY_]_6F$qSCsiq1$T^)hG__Q:l`fSXU_tA1)fG\r%^n9V]:Oj^Je[\DL:GWgL"C@t?-$BLihtFOL\T%5,PjU%ahCFs"8`d[Lk3u].?B!0XL!k>0"(DC6'$9J!3q6N2Sp_OO'c-8'mJSuV\r%'%pA"(G@Xk)'1#qW6DnRl]"f0>[g13,[P5s51iS<!67JsV!q:,\AS*e/c"/Eo9K@EYb^Goq(J'+(JFU_,tZ(=p>Cn[(deQC2)'b-\r%m-K[TcuiLYBS/PF+pBc+&Yc(Lr%]N3p5S-Ib]+*0*$YK+ecp5`Rpf$0/qNFFX6lIo1J2Mg2kP^gHU8-LeX8#QT<`nC?3TAS*FJ:8\r%1cf!hTjq3E[_WsG32.L'2$]spZ`RU,G0:_q!^@t4;,n.X9U=e,>)\`P*DT]?<i<0&33Wuq7(0rB_CDPrp'>(A<D'M2L@GSN:?Rpf\r%3Wr:Wdk9CJH&l4?\X.1*.aE`0V<&bJD"#fLa3\G=^k@A(4iW[+"4qqg+*KP[TZ(ZDPJ=f22&pL;_P`[[Zp;AZCKbG4J\G'.R.V3b\r%?&U9;Th6[8<J'_^'dk6a-p+ZD$KnPNb3EHNHaK:,pPP/=@bY\K@h]HYn*i(efgY#><WbUh,1]f4C,eLpmVN9sKY,sgrKDulZoen[\r%^X>C9<A2Agq<L?daT#g1,Qo8EL[G"FH%$&?jV=o\e_L\oFptHIO5Fs@gH.WK64:V(Tb$21Ab>ca%(,?R:HdM#)#F2F^LPZ/a*?JP\r%#e^f4G&4DgI5Ykl'251dF$MNZ-C>:MH7NNX=j+2gf/l(?Xl2mGd66pT*hr\(X.XrKG+,tF`d55'dQ9g'2EL5`:&S_>2"SB946S6p\r%69eR;21N@tgH;fkBm6\EH-\Er#OU9:DBiF)j'P.1lO@%8_SZNVMKt$Od:Vj?=ZAdPdb@#W=ZYurgjJkCs8CSehX/$Y3i?c4Xhi1u\r%$a%P8P5_sO=T0rAUI/:&ie-2WTNBN2pj;5lc"sge:Fa#to5U\Apj:Bb32rKn^Ft*8D!!p"d&1'ISc9WbfKPXOnue[NNV8bMeqna=\r%)_5:]?a]n/9.nUCpF=q";Ipl=2HC%E9na'mFU9`2EDrF7Z_OBZ=ctq:P_.Bp1Y?)=]-p63qCKq-S+MKe/i?]%cL-t?@h7]>rL(_t\r%]"\,)&Yu&O__h0sqZQ*$RAkKb/7-oOA4\M,X+=5u7HGi]:],%WbW2-2!LMjMNiJN'$$ki8fIP`)*O%#@CKC$'Zc9,S?2^]4>%`gt\r%GRkT@Y7&)U5!J8>/$oT\h!I#^DiXE*LP`Zm]R=dR3=TLiN<p/8?2EG3;#8ud8pA0n_)sGnGjk?r(lr00@CFro%i6f_Q49CE>bUhQ\r%kVA#2VP^-V2gV.+O0fM.BE<?M!O;lDdDG;$-lXdB^olhY-qL:mi&`k:oIq5h[@"OUI2+lL[E0fJe6[Y/*E3gf7.)*(3q0M;$rmY?\r%TKC?#I=A"[S!]3o>V0e11Sno]SU4W%T"G8R++R^jXN;top(N)Q_7uN=,h2\k5;/pZD.ko+%_#fiU5L2&og`@[[*d->GdQR:NSe%o\r%'asEin(lo:r%RkIDmo>gb?9BX[MF:MFAos,4KdTQ"AN&%3kiJ,+tpA?%h*u`BZJ]t;O7P9(3KRA-5U99EsiL,LAeQ-[Q3\U!LOdU\r%QeX@]eG!^3f&dN,nOEhg=.\i)LW/q]bW@:%7N[@bbOD7/@F&leEWl_B/*P1-4SW+GpGMT&Rr:90"]A`*iK;Q$X]-Wi(&oG)=YtVI\r%r`R9k+bXojlHKlXm,5AReUJOpD$'uT%5"=qk43`M::6bO,XtsLIs.ZMr:i7iP@!9H\I9B\(ot-VFseq.Jrj[1F1$EJ^GZqZZsg;F\r%L'eg#M1$'.GN7#SLDFY[<B(K^06=:(].*bQS1DtdS69O=0*RZsk66>Bm+(?pE@TdB"f(,4id;LP&$SD*^8_#g*Wr`&a+/F-DY5o;\r%VX#lQ*E'V[dH+Cd4gd72.a1rEa)3u[F7f7+kV5_IXeJ.aCHdgrQ('7N=Winn_]L4M(<A9<,Ynn\4WD_mn"&7op8AJm\jc#Om!b=K\r%\C3J=R2!J@GLQ)5r4.dM[(5XMr?<uJc`\?H)oc3P_%3dOl_#W9M;H$Qa52&gHm1q<k]]-XFWE2K"rc9^H1M>0GB_sYL(au*5%F,T\r%0XF:3#BN5(0UQ%aIE(82@CBXdnVj%*_NS!9St?UIG"6s;3*s`jr'o5Sq=i04md]LTXBeWq0$*Wn"C-mnDd,[A>%J2P\q9n%(!0J\\r%5:C!h0])`cp8Xl0A.f(=HaIU<M)IEnr4':j^0GL4j.S9[g,LV@5841-G):"'Y<,Qnl</4G10S:=YGPmNYFS!iYMA\d1;4AblcHtg\r%(<3]@hGk*PH8g3(d_!c*Z)bJ0<$0&$l</3K&(p.#+d``k<qM;bcf^,SoH?;Mg!Xrn1VG`uAB+HDKQ_YPIAP;t6H@V(dsL^i_WUZe\r%*J:7s#b9`VmZkWFgO4&7brY7L+r_Yprkm=h@3(I.Yj6`I&4Umb7=Gla;5toG0?:3sqO^BFh>[3.Q[#=)[$aG5M+;?qGsZuI^EOV?\r%`D*&#$AVoX]>92Uf#?0'lseeo(!h>:mfr+AZrX7k_!#[)J#r\)f$P"WHs+(t6OBl$oABC5l>RX<G/NH=L#p(*o9+tr]f@jW(AJI]\r%4-.'P`U!e((JQ":NN:f!72a`r2UE,IOb]s8Qs[&@D5/b&QdD)"-$2pIme^i(G$jM#XAD''rEe)2H`oK[LNQ_(lS.+o(0]7))[_<`\r%Qu_'eliC%?K%eX6Qp-$"g<&6s?g?)Fj-+Im*19;<#ZIEf)7MUF(Fp"Y3V>ej!h'Z<<pLU\pbPpsHBnDQ_;"$3%]f7jeV<n:EJ2kg\r%U1tE#ToM;I/K8@XDV^&'^u:GeZI<<[[g"'8`jKgs^aC<dn.Q$\T)\/+!'Ki*n(`:361+R[<?G/r%U-oUHF.&aH7EEO0Z=#J`et>0\r%69Gc*.PP@ZDN<ME2Q&Ksa3MS3<s8#mUKQq[>DDY")c8]/C]+FqGKOh;<R_jN$I-6=OY&q`AJA-N[LASI6H0Rh+\YS@]jLL`MJc3T\r%+.+M\QBe-/E4C&FS!E(tfsW3]6_ctlL>eBSL`\FQ@%g'1A!00j==F$P3e.,XjO^!t)M+tbeD3"F")BncNDn*(B\1qh^0QQ@s.c_8\r%TJZRZ>r@"JG+;m]B>I7B6D1?>f7MZm*Bi2SC\`*)Xlgb/Si1""Z>;*;XuT/\>r(f,(*Em8#NklS=f.<lA5+lCDasU!n0VY*0s>Ia\r%JDk*;Z!:SPmnp\\5,k8[p1)"A%fIcBqh=+Iko'OJ^bhZ&.]T($JU&dtY34F*IJr0`F;M-bq"97$QJUX]NcIuKNJr.fI2&2U*HPEK\r%?ne>2I"R$eW!JiCKMOkKgG\I.`)?e;Pe`#<In@75HO?K_2dbK;Fo:N3g?KJpGhME?7-`fB.?W:J)^Vf#\R,[9f>;;)<G_Phbf8UB\r%ir?:XVJE/P9=41'E"<naDpq7<5XO[]"MkQZ&4FJII%Krq]CrFC"pc?f"HrG\FcLtFI[<;*1NQUIW#@P93Ui8mm\&k`ioCd@4cC)P\r%1;5n_FE?fVpmGVlP9oW;5*obYPEh,r+^++O1:)nd+mS-5A]8mcCq3K)2gU.]Eb.naFJ/r?#-](4N?`n%SK(/BHfVpc&"Vu1fY3Z:\r%&aJejA&s<rS_hTt2bPp"B1DRJXIm5!<DS[DDmPo,]%osUr2&(o)p@7Wiqq:uI!?b'qJD+K48DW\D>K&)XIELd`2iDaa7g10*:1.0\r%i]XC!KDLDci\<"rQkYS]ZHs&38be4nppLc:iWfT%[keU9PeaSjEiY'!#d%V0/[ad`(7"Ocp/5W*B@Q,o*R8*BHsVuAH*;Q_ZaRK$\r%5DS)e[7tQ^Yk+i<P0*55XK_1U10(>53L&^sa>DMr@3u^0>`^GecK71(4j>e=Bf)Id()muM#R]IhMdJ?6cn'*L<>5G=^$&H2+G33n\r%=&FX87'OgT5Z&eGZbPe`/c-/(WZYCon:S@h/[@N(T*!71OInP,?C&%^\=$>9qaL"khe[:a?eFI(\RGG@d^5qV(hEF8gp\bo7,abD\r%6:3cL;TG2-lKGX70s$]98IYe_,*YJRKBI9ZH>WP*on0FCQ\UeM3@nCG95F@QV$b=kT#tE61)SU06VKFO'``X,r(JbD"0`SW(U+_N\r%N3Q1=!_OBnah/W3LpqiP?.U>!0psP$f@kDo=t^dIGpg<k"<6J#N4g9,ZPK;bN?t?@`]eM-QkZ#>i`AG@oGm#7EBOs).I:47CD#IX\r%6mSTlCWI]]m*kAHnMPJ@(8sQep?_0LPHT7)IXeKbSY>r":?k(p^WXW,Pt,%/0A1TT"k+BfEf9@`*=3]%Y#>X^?'.E\cIK5Vb2e-J\r%-mN-mD*p-H(WcsTq\u7A4!c+@`A>gN]uL6T'ME(u_B7jSDjA*m\i@:qG]a_[&XNa(:8gS<TA4a4W)ngpoN(r[U`GJBMn1h;%(!X?\r%D_[KFBndJjq/]YP"7d5lOE@@uBL(uSZ`(!Y4!"^KBOB`\X]]*b`N;cS%QG=J,C#/Ma]ch\VEX@(]CL,5$2gb1G.\K`?1^j7BsZ:D\r%dQNg&R/5l?(b!T6#nr)O'r?Vr=\bjN5F6\+k2R&;WP?]S7]<PK92UO4MojKGk>K3s'[sCVl;Y16X^m+?]BP*on<7C0p?7Y=Pg*]q\r%(Fch/A-6rAbCD%WP7#lMD8<tCk4^5eYb4eI_^.4m`CR-W5agWlaO`+c.42XoHVIE_nht?cW%p"iL=Yp4H6q;epoTbPSV(G9MjqN:\r%k?aKMq^9?G1*'S"F3f!&c.$D%N2$0JcPNPAEt4M7b3@FO86][Q0,p`pe9*q^0<!l=VB,S5H>htVI3U10fY)q5etV/Fq/N@]pPZ#p\r%E"SQjQfIA;p@[4cbK!]H/'j8WD9b_W2&B>%6SQ:0BAT@cTpm1T0!mk7jF\cL!15)/J.//CdCD-O$B4uR.hgo<k[j%T5*PCC]]S]7\r%FoQ`(`H2G7\WN.g0<XtUj%mRL#(,pCCYap+HPa0c\IZ>kfX*/c67bgt,V:tppEZgKHqqg[.I1ap[j^lgYM#[$fEPnU4le'jPk#Df\r%p0uRJp-Fju,].3K,OMDC0AH*J"ZTT)UO.nQ[P8*rs+-TT4*^o)=TYVR['ZB0H\a5FCg'Oc)V8dZ2Ta[iWDpkNa=T-+\%S6b>[86+\r%q!)c4Hs[e$VN>/*jB-al^m3eW<TQ2`Wrd1s--h7MXAb"&e^qq%[i@0@3SB\B;XMV(iEVsaZW*bj+A+!HYjpk4B<NeXAm)->3NAie\r%E(eM1mmlob/=lGMK,YqTK11mA6/AUup2[0m]Nn^`3$GI&So\?\`__]@,b)Z[$rQZndQ;Fp1Q6:D$S'C\)9dkBEHfF%>_g9J`osKc\r%*Ki0QB__]#huIA\mW[BAXdkS5)5htkcQ^&\@t5<NI4PJF9Z@-/71%%S%!$7odj%5e?.gr<M7,n.e-GN2d:Tt9f9U:NXb'8,MG!$j\r%*`IluCWkt-;dkf#F6q:_OYjmgQgO^@Fu=!C.bu"@HW@"LF'eATXYuBC+gY2N;D;n"'H<9:Y+b;[k*Z;Vb-#L=].]IB:7hAi+dZtm\r%M:o%sC6dNL^?]66'2lR`]\$HeK:4`Dg>]S23]/d>K6aYhGC=8!+/l=DHYfO^U7]"(I*5,hjX>8:68IJa78oq1aY>57X+6V[&CY.B\r%[+8gFh)"E+`(HQ?8sKtcEhJ/H&s[&@;Am]Y5h1FI8fOpbHu!/JOHf:JR+k213ET69cDq8N\PP&uK[),,*005,#Q'3..WsgHVYr,K\r%?9uSPm9"tALkcCND(7+6lRQA`A1B-Ik7If&\&Q$P^@I$[Y7MA-4Ga0>)$]][`>&R>e"D9td3%#?LZc$C[X_*`r(/!s#VWkk6%M1B\r%QuKr8A8PEF?]G_qKcE8F)"Y[*@XWaic;FC2)J)d6F6"DdgGg6b/`l:RMKl"4fD,9h.AMU&IDoLD,:nFP=8^nY#bMF>BA@2^)t4*j\r%'=FiaE`G,4HDU@W1?t.4Y^DbIS(f.V?]Kf,(I/d0C).%iD^uPjfhuS89!2SqX9$Y*$FpB*R4FVCKhVo1:Q'8g&%**,C#Z$F<-olq\r%A%>IDQ*hQBKhY,YAMEF4>`('T5(3'%a2j0V"MV!D*8r!Ff#J/30%B$kAdRqc#fBEgQmKD',E0r[UGP7TD\$INDHoesN<GaKZZ)^t\r%_T[.!(c>U]24-t[ndrY.j(tibLpGPn]Vu_,.\42'QkRa+iYCH8`3NZ#'8`kf?pY@QF/6T&Shrp\U_pML0?tc#hX*.VU>](SLq%5W\r%V_dTe^I5n&Qh'k?I*"QZ;[I,oeV:L/g$lmu5-rk!m-jl=%W:oL."r?3!saH]4$mRK2J0b'D\Y-k[9ZFj'B3rl0nk<1qu.^iksZO#\r%/@I=l/,;$\g;k_OBpd`6+O,e7>T-0ub-&!89BerL2"`416#Ts7'LA!W5D$Ed3)RPb=W_)_-5[pQd0NC_JhhN[gbC+#nIpVh2@R10\r%a!r'P5L!tOL^]m-#]8072QAWLX8aTI5@VqW\![&iIU\E8GsR,<;li;r)Ci&Jk=]'<:%\t%/[1VBM*^F!T4.*ndb09ga1D,j>BK7T\r%&]fG$SZr^Z61$#[p=\drNn<^q"BHnEYg;e/J@)L1UcJMnH+cBbbOJJZ`Qd_**&$B4YB=LG/b#Q67JJ>P6*Z>G]T;)a0M<rMrA\,&\r%?</U1rA\-C1re@t*2`lfRgo!'Z.6'jI!/3h;G?_71IT'eIBUbdn5A4nQZ+&T\J$'a_QH[D%DAQQF]aJ,M+AVS].;&NVVrmlkHunJ\r%lH/DPgs*:TPY0ZfTC,@"JMXlL(6`Q)k&NA8R\!4G*LUGaWQLf+R?#M303K3\_V_XEJfRAa'6?d'M-pS:^^OgT7'Hc-@$nE.p=1UR\r%^fRQ%6B.GmfQocf.LH$d87q0Gf/-u.`CdZDrdgLm=A=lVA"JTC8DkSg)7,cEnSPn]Zbb.4_0"]dD/d=%GtRXD0_3`9WjlGkj$RYe\r%KaW,XWnCdk1%((ON.Erk2&f4P(CVk0C,VH*/ssJVSdhQg$\iq"[;7Pi>d+t&45b*/kCSQ(eT218/\<Ja$Y6M>CFS:A(Xn<sW6kRM\r%VS0?H]^S/[0o3XRQ$mW6Fj>(6Bg5@_$a$JXUNWi;1_,&t)_KSYQ]6nL#6*jM!JgM>BepuVZ,cQ;C(aR=[Bp9$CnhDTe5^m)lCgh*\r%;'[KgTMDhpM'%,aSTUAWKKXTqA8?K^SH_)"X%H*ID<0r1k<4McaO.+^c$qi#<C*0FY8O;NO56e-OfGY%:Bh!)o3mZq62OLj`lZHk\r%_<AUhf9)8=AMa_0"osPDoHlIG*^_Y,SLH&=?IVot(8l2fg5CcMp==6W=)jQ&0ZVaap/c6qCTU#GB7CYO7'ITZEPV3i5@q6/PY<dd\r%A:pF:W:,CBMj*ncLph2#/^Fi.ct_*;jEP8H&[:W[RB:^+.b%dJC;"G%p5Mtq[iVS[ME+j8R$',baHgjI.[jg$-g<UfQm3Q?)mh0Y\r%aHgk,A(iI#@$[[$Bi*$9?"ejn_d\XhDY2tI3O5J$K3?*$N\%t'Qo-GWaHgjWR#n>FLl]D2f,n&@N&)n@RV003Xn5Q4OOg!#3:g"b\r%.H8d)a]pXY8Z\>t5r8V$`]"fF2VMSK_=`p;ZWAC>h[mfm5uGpV;m/V*nXrTWJU&O4\/XsKVbu)omMpY)dLStF"S\;>(LkXA)&B9I\r%._'1J=57p]4>/p-*ZmM(E0Ls3;?&O5XiD24N;Y(KdbnXJO$Q9RRY5no3c`[p_uieB$0DQKY)fR[@%Xr4bbH6LJ;$j[GnBM)N%QG_\r%"E`\,+jNYe]r-PCRs!6G]FbN;-epdRTTI"&>psaE:*QF*kHWZ1qA<X-l@b-BA@1Fim_VG(33FS3X@;::(f=.u!nM\q/k3(#.N'Wd\r%?m4Mk>ff6F!R"k77`do0!R"l:;_k;Rd)b_\/;'A9'Mh%#c>_WE^fn?EdI//<_c^[S$dO\.fRr@o;k!h(W]08_H][L<'[1OqY(Em3\r%TGKa\)nMfEB/opJrYOZZ7]RC<RpAJoZY00l&5lepOl:gC,P=;/cFt>%Oe$N`>fs[;e<fI/B6%]`&H1Hq,kgc-lS;Aq@mjq]WU)B<\r%hdZd>VRjrAI?+t8bu!/+,cfpZ5WH;I`JmQ&d[nO81qk<96;mW[-N-:bO%-g+n6GT.nu_;GL\X)g>rM\[,]bn/@Fc/Fel:Gm>N/2r\r%"hI?SO?sfD]RVeUS'T/P1R.J>DTKGlZi1BqK82.2$^..0N8P&8$\2C'.#J\k[c!DQL"UL?.]H]j_lI'Q.Q=Q@l[$'M109]026R3A\r%".IH%E.Vo7p:\qs(Ik+-3)uWLB3XSaGd69uPURGG[[d)<`/$/P"3O.CUM<2"qs':-%,**W/7f?8'-#<5Cf;:!I8Q@&LudDnC(JUJ\r%*m$QmFB4NJn^hR4KKiG@)mK5(-[l0f)q?%3I"kCde!]@qfafmK[HjdjB&a>4D681IL(i"DD>]]#k>MU^0OnFK#S1fd1Cq7/-5)7'\r%#Dj`M-cNa<:R2`*DZ:j!4A*$qoH4aGIb2T@'tf`4OiNlNTfN!E*E,^lq<'9r\fS$,:2([h53#9_d7;-``'>3PW=9Y:5,H#PJaO;n\r%&S"In`0b+iENm<\R2E930[>hMYW&V`Wr$n)+XB2qRWb=kl9.S]Q/_5\jqHp(:M%$eqcMmarm(f+/,L7S?bLLFo=Fn^Pgf7M3f8eo\r%4ce"_Pb.kMWh0)E4\l=['lt)e(.FZPq\=/\Ao0AGp+,8Bbh?amlrVD^kX&ff><bGX[A@K<hR<]>id'2o!I?FsI,d,oKKVacVHDRD\r%5[dIXq[7,ajLG>+cNAkaiOS=-mKX*^aJQ>#%_U@eLu2*648["j#j8ujG,S2N*E<hSSC.I#VO_[dll$g"$1iU<Be?QV/i-.sJ/u6]\r%2&"8t9kc1+IVL*t,Fd*_`2B/FNbh;qeJ^:YcB1h8M-_a,F>Ugb.4q9oYm,D)88g!O2?l$4C$j7>BpI*jh6l.u%Q7pbB`N/[`FSDh\r%Q.nhk\-nUu\QDLKFtSmo%.Z4Z<?qch'j2.Ol/3&J)<$<B'CPI(ROA/sacU#urY_i.`:3_OR($%8`LS7Y5CA(-d/=K=mori:aQ$@,\r%7DbD,/=^=jD-7JRnWd8i[q/,>bP^"d`,4g1>60T>YfSG28IXJoh+&$c2qh>q`%^]AEIqj=iafOM>1S"]kZ4r.Sr4YB7(6q1;BOf`\r%LGmThG1HL"B!%sIm&KkKbcgR/JmC6`4>4jT(K:mo#0!+\/i5neKJfk,YBST9b:dR2o9XcKp9^r>eGLg<oeh6+0L*"Jb&)=@9reK)\r%/gCe5!a<,E]Al?t3:J%jUi:%e:t9`B_#aBdLK;:BE-epZr@[4-2'$+ESD*ml9rl>Ve7"$H<n"(i[afbY_%uNH<3*DZlYI;Y7)`jD\r%AY"$FAY#rtc>nrqhR:u'9rhF>4)kGLQ$+bs1u`??B5FWlp2"cX)fCmu8L]0L&<3lGS16m@oM#"ULrqi@^9q"mT8P_8V&XaVb@44^\r%Ikc_%Kl^ZRH.K]fi0;Cb.[h=m:*[BJ*+7+ipL;FA=57*(8S&4'4.IQ`laA-UiZPuQbI(6%USf)fo8tm[k/`j/QM`I3ME.up(,5;f\r%;PL1E6k*`;M`J)>S<_u=/*>(<>h2->3^`o;^$sQ0h?mWaY?/S`=t$4NHmp_=p.sOU.ln$s0b#Tn]BVB\Zg*Fn2K)O1%"tb?U-V4\\r%=$6d=]\6D.G1CY%/>cuIB)t`D[`H%ScB/j4N@%Q)kj5>4M"MRl'qL='<A:Gt@+Mo`Z`<16egGo]?.%?5fb\^SFXAOZX`^CpUl9FN\r%fnrPQj48s\Cs]hhZ`B\(0tgOFP4I1G3Lr^`\u@T)e8o/#RkuE?0<.,qPE`Ok(-7SBPot(3,\:(>I]K%BhkHUo.+WGl0gU7`P`DoS\r%XQ]$>HIe:U9K;P/-oe),*q2hZ/ONDWhCSG:h&4B,`2kpNfgk+I#_rl>Gg6TI+X<Ib.6VV'n<:JVHhkcrXEeJO;YfLMCBm(l%<6nk\r%6GcL6)]=+qg(eg;&,F=&=5;%r:,nDYs8AOaL6dd:Mk:Db7HLNHr5n]V:YnfKr"&SE5?E,ZSEr^oe\Z@>,Te(6*sI_GIn`8jDa6\>\r%P"dQ.A\"/Z';>VYf-O'1BQhhurn.*BH1_>$o!`#eQ>c<>QJc"!.)l*2CKbtOgr$"o9mCk-&gi=:Fe:H26_NQPft]mJU>e9Cl_4U9\r%]":61=G.>BFl?,sMND!-28fo"\70g#gf$\6e[R4WE:Z>pLE[P;6@OjM'F9]>h@[4+!apNTrhCX%-)J:'r@M9I]jC3G4aL7g>`s^B\r%f:=SNNH+^f/U+>48o'bm4,r;^iCQpl>\NM6^lWhu?)@C9=Z9EqIOi7\aFk<WhJJ`7n^:K0S9%G\8fro9JVU$_k7GN>_m(Y?k'OM"\r%P1UtLenSV2inBU,]=!?V%i<dYp3"q_`.RsLqZY\cLcBEB`-,OP=-rkf#6%P)HMS1rJ)(C@>f%]`/M^q@T)!3oon/oT#ii'AiAWl]\r%h?&8We'6lKGYMJ&a%i8eWuJ;'jpYbSZ#d%U"2DX^gg4Or^6F*n#$e`,E'/7rk''$e"rWJMN>4p1.juk3>SXLfi(+em2XBAr::nh[\r%35&,I5O!1G%IQ-"](Ua`f9s+US)8(W^jiZ0'?%t`b+h5qQtS'e`iJWU3[/]q#;GN'L%cru+..6Vp\&e'P).o$k?N^a?S!AWHVJm0\r%i`l3W6fN.9Ck:uZ(*Oa"?"KtrEfAo_eu'>KgMHCg2/qOFgC%L@0BQYZDH@?8aCZXPGq`O?a`3V8j<OfcaG#<i?e6p8oC8lM,fTDp\r%$$;HhLt,X66K"IR%m6_"V>KXQLSbqrW=DjY[p9At5C@V@?(/[W[hLWZE7(a=T#u"rG:eZ&+eBM9m%M=&\4n!l;mGc3`?[h9KR8&1\r%^Yf@#?QJYCjS;(l*M;/N);M.;;`p-JIQVkci<O;p.`K?T<Qlr*Y?A72M$N2)_OPY#m%%^=FhM#e(g4REqHFu8^+;Oe(CY[S]@&>Y\r%*a)oa[euIq:cus4g&WY[IIjK'_-kRD>mJCo*5<Oq.?^Q(5(;$d!9-%_d@)2^'-8K=p#L?[1Tm:f(NZ?;,2HgR;#K'R`gjSf!gB&C\r%OX3M`)P/[nJZiVS4kp9`h&Pr<_:.>b*h3dXT860NaX+/_?X^r=\,>Er7qV+DbRqk`[D5d_=+^1b*h`DLSD@RZ$mR4FnpIFuX)?YF\r%`=#-/osImN`Xn"Y.eS$IT*Psfq?bJ%03*"'n^YuhAD0<%pK'(e!E0P\'n\@O^g@=fgh:-KVB0g>+`)TBs7u:lXF^sRcEV=._gg7T\r%,q"%l3L>?]QKIYEf_Op1c)ol3[Vl1*6!9%Y7>C*M\8J2K4\r2VKUL)tB#='5VNVg'*ut/oW\5pIW"ds5?pjp)pbbi2qJFklq>DK2\r%V:VPF(JtGe_?Aj?@A`LaJ>MWL<gh7-!kiSIFVLuBdghjq!Y7-@iW==*/,%82&BnJS%QnItF!X@!&TWNqbK]dP-,Sd,+Eudj2Q]St\r%3E0d9pdb=IX0WH*AFl0N%6/C3pPHt<LdjE%@(OslI&r3T=j6PA<q/d`PeDj5"n6q='[-$.EMTYk4VK28Mgsjdm-TJt%@Jr`oE#%q\r%mIi@RHLm.N-%\EU%02(So./pmN))l1%kb*l0(IW?:S!e%nPY)9qZXY./W?nsb6[MTe@D;8S=?^0=XW,P`qbj?QEhbXDcmlH`P)C!\r%c<>VGr1-6Q"#)!a2lqmGRBt:0'-0X:/WLF];(%F;4"Qc3PP3cVQ6R`ZYZ%(9o#<Oj-:b*!Iifq"7cW)@OKuU#nU9=65N1=EY0A%j\r%%3^NiFBfj=3B+iTh`U6=9bH`r>H3Qg_j19dYk%p_YhRahaCeT:]JW;.YdQ8YffSq<Y&W-^V61p&QGk;WNaO+-SgNY@moIbl"#FD^\r%%H_33Q$UE$P"kdgZJ<*r$2Nd(75:ZuLO];BO41O7YTl:&^A<6%r9fZ,:Zs)f\./6ip&VIV0LBUar6*2t3Y60(]:!s=I=eetP'ekC\r%C5ff@GK,"V*\k,b'+$iH$Jn3K\p>U?o'fOZV(j=ufLiHR60)6@Y4)=2,OiL4ZXj<QTj*=C)chgD"sI]3%R^Nq<K[Ad,dFo[04s_N\r%=SdLj3op=5\,Q'kn6,RWN$kh/Eu?/+0:/Huk3MLgrV>s0GkaLEiGJ'AI<_=_0Dn$fGEL,2Jm]>uDo7A1M$f;];ds?WT*U/K@'j=I\r%n/\!o7nHD5Q9aD(dDB2EVJH5(HJr3IX?h>HL1O!spY$^-=!.db.FmE"l3Zq7+aC>`,9gBj0C#(nNAdV#VqkhQ0(1A=7ZB3>eEm-)\r%/t?UpBN`q>;0lm?mgEsh[lZ[\D;E@^2a[*"MO#[?]5Vgd8Z$R2c69X<Y-F2=>PZ9-6m=a@nmKp=`>2%9"m]O;'%rUB%r-!Be'!Jl\r%NQh4XlY#6+XM]/]f&?0$mY6$lh+1#H&^kC_e#fR`&`65Go`<t:bAp`m(q$X.cGpm<=(X&dKga]"ruAOmh9UECKLGZs+Lp"b;eO2e\r%>MUWrJh<!!lE)^WIdL0FIWP&fDWRQDS.<;3ah(6[m4TiB-a4rF4KR!c!aGE0RVF/$:?9"])U#cu[Vr^Xhq6gdA4%pE^!&r/bS-AW\r%@&E18\*l?Qke')b)I2jB_?o?V7r+KIT]Ho7?`$%c-Nr?@rIW?M$"/A$8\(=M%<%FA"$BXVk!oj'=Q[aYE_o9hO&\S],"f]d@OkSR\r%g_dLU5b$eH6LZQWG"AE:\f*,M[-7<W_I:qe%33BG-%"'iO`DDsc/h1C\s*8'rp@;2KumD20-<neC>cSupepR$beLeoh4h#_mB<E!\r%5;c.HV6miRWIWhC3ghutX)78^lhFT<4O65.T0C4f$O."bX3u<HE,'%kB@aLYe50dEe\!uYTS'E:.1K&^6FFFHS:bpiFrfi+8/SlU\r%+-foPhhd/5JX9XRN*LbGUA%@)^TmJYC%:b!_Yt)_9Zb?1&ff4C@Pt(UI8Q=[o0i9QH&MH%n2a_,K%>$@m0f0CO^3DNW>%-3I/7Dg\r%P5@9GcX&Z;6MR!E"mb-t?Mrg]SDQmJ(\ni^_%92K_9!24(F@/WHl'SOahHo=cQ\p]oZosDaq!shnd!jrSWWQ6f;(K$fE!1U6UEos\r%FtcB7P$FtG-eFMu(qt\RQfC]LF8PZ#G#<5TFd!JZe*6*X3ORn.Of,h4Fb2]X,V^RU'_-4E+1@*NYsQPOWk7TdRCj++0ZD.^Pt4f'\r%YMJt<',SbWSZC+:AYJ`ar5Ns!It(%Mk)(^/Zb-G@KG1<<].c;Lq8+Nl\`NC?3\-U7[CUNhCDa'-DA,2GZ]A%nPKU4m2NRE%Y0iu^\r%iGVHXDh-NuqcI4*Xc5.aoOu8;n[OS8ZQf*-V5]ciFRdSl5)Gd,?ZjBu=k#.SbJh7C`b1df7\2FGOf<a3O!.fFV[p9NO5/J^(&N#/\r%nYu`hdQ/1;U;WdC(IXV4eLS:3g%D0E=fm1U7UJblo0X[Fs'/j/L[S(2:08SV,TjSl%$:SjoG+2Bm/i-Zbq"%.n'Y?,jPN4g?@$>b\r%;2YJS3do_5g$S:+8<Bn/jDRuQpYjS)]>9Yq/>Pu-a-MOrX6u=/BO=2gB)1GLd'8p9gRfSUi&X='Spu%2>q?>MGW+\B:MC2(9.ri!\r%ek"OV_*ormWGC(AFpB2QPEeS@o86Z"n+brFTo*!+lRt3:.@Bt:K*tr!7'P;uj*gXfOF.f=-_S^d5T&=Eg<4sQ_+i*K5lZO[LE]+;\r%'J>FkPN;KnFLPgd\!n;a(AmKC\;na*Ig-N-GNo!1.8ge>_'>Edh*Z-YNY=*1L"*Ser*Hqin`mLrFQ1/fo6]t*M<Hb.fjUk)V.m1O\r%?&8)]YD_]lXDe%WSJA,77JsYMmimC#2,"i-GNgdIa$u1bf4?=@FHp$HUV2%l_mYcAdJ4N[U2X_qkd&5J7f26mAotf=DQuh\Uo\3>\r%Oa)EJU.=KW/+Fa&!B!Y9CaC.<=6boofLe86<^hen_cGatj('0.%pOkqN0JET4_uDcLk!f9ors^+=D2,YSU/p\4;c;_V&krlM3PDG\r%Y2IM+B"Ks`l1n[rJhk;'p,<FLdZ^\a!c@UYo$<Gs>;S."Uh,)HVO-L:1D,po:b6B2\#L8[dG)kn"`IQ#@9-j?/YG3l(;qrpR)U!i\r%^ErOEl+Z>YiP,7pl<`8kG7;sF3AT+JdN)kEd9;j]RZ49M=2EB>JpHR7@E"NMc4EAc24ouEI=)fECLUS6A6H%Jf!9&U/3u[XA1\)0\r%`)P"C9//f.?Z<XQ&c(&piGkhJTQ#Gm>[E%ceH-i&]S=r<pK4Y@:H:K%U&;2(I,ORY4H/h75&bcRmmO)P.kRr,X]N2c7kC4).nR`h\r%9EeOV_p9R^A4?@`Scr`_[gu0Zj;(T7f#)fc\+DLNVZ_?Sl"S+COiJ2ObHG?Z"c]3?jP@Y]$H;d'?fK,7=hER#R'n#jXBDFRR/<(M\r%2PsfJ8;VUn8(b;m*p8S-fs`)&B64!+e2"Vn*@&!=Oml*3<hdPaQj61GXC`C\J@b]tP"6hF"d)^3ZXXM2JSlg5K'aupG@<`-5)q`s\r%SB]hn:b6D"q>+D$aH>n>SI@G9G#T`c8S.>_iq9F/`0Ta=U'$@2ZQoc=&5DeX3CA@5#-I$!NO)**6T"U_&Q'(HafVD7_]BSUVnUC0\r%/T=5O?L"k!Gqma(=\G*C*=uTNAk9`Bl-cel?f.E/d`gP&7S8RnQCIN@KXr^nSTeuk3u)P<1RphF[C$eq.]bsPdG@1$Zcf4^@uk0g\r%83%E[6\,q4nRLotGAUnAG$`g3s7p`=[7YMkKnm*h=cU$n^0tU1,&s&?k1@Qj>U>4Z9R_D.fG=kP-!9es/^rpf^25Psr])IBkIm)3\r%3U1s3QbtN#7BJ]$]qKiN(\kf-L%D$NJIc!l1+?&q!["qb(r7\*i&!!(-,jo$:5BLfj)`d\oG<bg\0VMfP9<3Ca'i7MZQMTca!'<k\r%/;RF)\-^,rZgS4qdO`COHkKSac)3D9?\e3a]UUlDDV6NjkN0)@ET"g#(l]bg*9k_0pMq>QqBG=lN61,RGotqh@uTo"UX$n'(>J$6\r%[./.S=75U!gA&1cl$>G)S2qbDF(@(ch)*@&WS>TP*9rY6F",)-m2?-?ZHI#;CD]I\/hbo"=p5MDbA/g#?JoiSb6U*u_&8;Q61;`\\r%LTgsTrkRX7*3<KD='FJBN*&7:YI(rQNubc\]2L6*pha:jr7/nLpq8qK)O67s+U$rI2%(U=6O8gHX\fY'dO&`MUDYtALlsLSSbN6m\r%g6FMlkX!LYTcW>:`Bf/n#XKduBGEqVL(G2+lC-o[+b[[ZGRuUF6k<GMS.kdHdW?g=iHKteMe[jh5afhreLHB:h:&<bTihpM)a]Vp\r%]\Uh9U/[/q<ti5)7X3)Z'9*FfNUW5?L9n(=&`,:Z>9$@K7TcTn'C^`ZL;#lt#i^"CB\,a&/;rOBCTW4$hD2p*I'V$_)4la-7X3/\\r%5KqRrSsNP?M:-J7<%$cA";^+32VC^E"<5S]ALmLdHF:ps8g\eV`1bB\?[M!cnNK=P*n_*?8S(h"^0aYa^i<T+Kr3NqaTReu8Z-C$\r%A:bU\ApRu<STJK!&\q5I'p9^`fh1!Z[]JBM!]7uUl'/;41]r4Ud(h9/+,qtFkrcpf9+-\Fg`?c`_$.4#Pj9f)hSjcf)(6Ga6?5\b\r%GGujd*DiV=>t9dt#5gKoLEIprUR:6=(g1.MQ'.1AUHX+3Q0XiErN_]OO2Hfrnm8JiKubg366QCpM@YC)bkj6!hT$eO6a(=&jPqBF\r%f.C2Uq7'Fcg%!b<(<)_t`[jBb3'PtuMB7!^))cr#1W]74<_>R$@+Hu8WA"FX):1()GBc+QQ+m[E_%KN]<C)<)nm^HRZQMSXH&:Oh\r%<^DE*nh.QF%M'aAQBtR8^Fq7c^sHls9$=hE'@R[En$'np!+j'."n';=$mK4L#h3,1.pFHV&3j]O22]dP`TiO-Jf<<'Ye2&)S-q7d\r%OWZtKKJ;VWXcu-X11NnRCuoQ(X<18nSc%uIius4Ln1=<JN#`R"aG(7ab.Gqa=j2rk8F%EB"SrpW5t&W0#ju,aZ02%9XWTs]a2-H\\r%Qe"Mt0_UIh9']Vki:Wo=\>b8_=UaI_9N)jpN+?pufUJNYXln%>quK&#4/EZ9\UhdQ:oFi?R_i_->pU^u*4HtpkX+T<`;D[FHDGiO\r%HI.!%Vn@5:WM^?K"UnuP91H3HNqA:oPc[%r"+LGr'n2&ZDC#c$&S+O(Z>m*7a)%S_Jlcrt%bXIr">@MY4)X.@ZdSR/-RK\&^(*VW\r%b64#B>c2D7\d\N,Zj;d_n2%Q%m)-b06E(RR1;O1$/k1*/"QMm2*K9KR#puYrRW9p@=c!k&Io\>@#.#pOGfp6iW2lR_s1l>W]QX5U\r%S'rgB&cT(k]ouAjOQF&L5!U'@%%t4Ujqo1QcnSc#YP#YH/2(,b8qcUs)U&.Ks%D_%(P(hu4LgN#MWkV1*.!\LA,dIaU8HR&4h1"u\r%:qDn2N(]NfK\oG4`t%s=cA:r7_fW4\EL+*+_UKu]'D"E%f`53"&fk+^#W>gIP+\m0>Z904Sg5`]((lC=6k\;6$_?2[NCic`d2Mqm\r%Y>ZM[mWMo"an6J?m9X0*CME<!S;EV2^V"=t7`Wq*:3"`us%:Im/#N:EF\qmm1J2<:B,S"fKW1]prfrdNm,cX"[')(iGEdA<%`sb9\r%@UU<a>S1)p@N9Na#JV7'/b\YEH.Z6U?Oj^q*;BsFEVTP3jhNB#&'pk6KRN#7-a_LB1U&REm9_/sD-D[,47S6kiL*!O5fbMGDcQGf\r%Wp#1_pi1Qg3pp?hH/ZF"[XWM`0(ac4*m@is$@0WToOED`$$do40[Fd#msPZ$g]+m6ih#i)S\M]9Z)9S^nBN,3Xf0mL.m,0%.o$K$\r%&K[.t?,SG.lsFIPEK@f'Z8hG37_;"Y[P$Ols(fj;NW&`:TtHT<7#K9KcP.&!J!n3$8O!aa@[)1`DK9R+C%F-hEAN1=rOVmmQT;,V\r%F1@i+-d6"rB5b+-DlKS46Lt)*HLie2GW4jlVsKpp&-pg=3,(;\9AUB(Yc_?qYU7S&43NoB"BaK"##jqRn)K4ad=YWockP1e7[?!M\r%AflE,;4o_+<r[*1\41o+&,cW3m$n+1_*pJu(AP],"^J#s6%<Zq2uA^p/*Ln'02XekUnH&dh8=ni;U'2@mP7%?"3)VRl9+I82iI3n\r%NWmgaJ'hC1n9aRi%me!2IK0,^9kWZNdXKmk-5Fc4Yc!Zkg;-"M[IJ60Ss%+\)d>LDd>tAOqo4q_")Fm!<TS:3aZ9^NqjqlKY#!@d\r%A33RA6M=Y*B`-GDe`>,n":%L=\PWSVS703RKO[]")@^?h1a'BVg'FUNKoC68X7K$ZV&3>4(-7X!B#%n$9t,V,$?:G'QM&a#4.d0p\r%=Ot+U>p!&81!*O-DHpBQ/7Y<<9AW5kQ_aLgVjlog;]0s8`^3fJE;Q[EG-j"Aj+V/!*2E)rMLa0+_jD02:o!%'m;H!(")DA$XkS[d\r%6>`$?;pHO<al]KWn*dVC/PO3l"gKB>lp:Rok+AA3D'ESEH'aeh#O_>>p[QL%31>;^9=]=oE0EGL-BGJJF\Q)%J.>G>Y%\7Vcn/k,\r%*1++t^L>h?+OGbPhoFAjVDu#5A0hQADb@.C1lSS\Z8s3m^/sFeNqJ[(NKO?Q/a?N?-IhqJXSHW9]0"qA@J^,DRYQnCdrQ4H8d,*9\r%5-"(!UpD,CTG/OJG!;qh_-VPqYgeMs.X:aCq5Dq8G\PlC4%IP(2$!05#HO@"CD4ZB%tfZ;H06EqPoCJ,,h'uC]EL3&ri0uK:Q8jd\r%Xr#FDau3Yn>%f\(B)e@>m\dJ%lXH4t;4k>I3"tdc,,j-0TO$Mr;+%1/]bs4@5d(m$=5I$_Zk@h&e9U%UhYVHSN.#sRBGBLVaG+T\\r%8/8e$dr^n`6uIV;K;q+i2=\a^=2t`kW+8V2^![b$^_+(ai42O&FQS2_rX0SV7k+mn\ekYh('Z<jSFYV4h<&CA:>K4Zi",T\nHL&D\r%h$uO&@El'Ca^'/C#8MV[cO:,7jE^3iJ!4HTK/D]n.i^bOBWA(>P;%ho(,_#Fig$.F]sd)mB9WN\Jked+>Q^WB/he`_:m)M5ISnN8\r%6:hS[&)snuS;dRiUeK#Beu=k+o$sQ%?U.3'3+tF>qqeJs*bLpmLRdC5+8CGdFWF=JJ,0[+mffrUP^o1`$_1)S#K1h9mYjZ'#i./j\r%U`c<P`E8&GOWd+G2/fY`fJ-oln#N'Zq0@aMn<;0@H8V0is$Uc&-\I'8<Ga<S]tmjr7m79#\Ql4iF_%J!-AS[dSd1Il!N%r;MW#,b\r%QMMqR='B>D"[o@!%Uq.-DqB%_%o.c8=c:1[6:W,+bsR[[NKR(rdMR)""0WdT,>0X54rn&KGr*R'km>6Cq6A15a'i<I'^`Ig*R@ND\r%Q<`KSCX,^Qkps0pk9>]B\2*9fP+R<=bFK=&Y^_7GV7Na%(u6+[U\F5*`+#ao<n:a`!8)4&+Mc2UN86XV_8C8jAS'WqY%`hEKD_k%\r%7a%u&OMBms!@92d\I>$Cep/8$$F*q"jUAp@ibrBWM#TRFGMqmQ(lRY#)i&C"/Rl43@P&6l:r0Du4VS+,c9b^8aXlbuU8rFZLO9LT\r%fNfT3Rq4G#r>W30*+G+CpVrYD`_N9eOqIge1:[60'Ql7XK^S[Rc5-=4-):h\Ec;qMS"er%0_M&`9+>M8jlTI"_cR1Y'/&6;@GU.[\r%X1aQ07d]VFIq\JEO\5@0m3m5I-AT@4BsXRdE8EZr'bOe#e5;e9Mn3#6fA6anX@N(oX*C:_-^UC/f,Y0R@&YoM-jsN,\l8B/3`@&q\r%/Ut+X]<g&hXPIEdr,^9I/SBt(hFT8dPk'"Up[sg=f^)8Zi`O:)2L8oYNeQWoqfXGr%JV)ko;?:-kOgUIodiE'hhV5$Do*)ULuac-\r%3Yn1.Z0K)#W+R(sSN#E2YJS+-,nm5qq_*&dX#h*>,,Je1`M';+G'[!J1D!JQZOknom$N2m0g2E*02+"LkWpU\03Zs)%K#OV'AYRe\r%>!>.i^W>D1,E)QB`H8H(-rgfu6#UIZL'21&9LCNI*G9Ap*=B%R6:WL63>=NSC91PcGktg?goPcTj(MNGFFXM#Jh.W3(-SWN"K=[D\r%XtLNE!'JYeBb'YK!&*,fY["50L>S_2l_/,1b+NrEP[saN]]`Q2eRlZ4F%0dU<h@I[D__UglqDWmSn'FT<`/E&gQ@X_Z0^J\kU\iT\r%Cg0jMelR)5ZTSOY]Fi/h@3VQ/UdjuYfMA"7bETi'$D@qpiWk-5b*g.hVK3hjludf422*+,E#(MiX<_+#8<s2a'6:KQPnQX]cQ>8)\r%<PH6>d7Y'3F?$)I4;oXR!q%>fc'kY_et=>IQ8MNtSe5f>\*V-@VcPCa/Sh)(9EDXAdC:EGVT5P8hGV62_sphHH4[;%3YrRbK=[)K\r%+E8*cb.Wq%2K9GYle<(EC!*f\>p!t:'@lt(<Cd>L>,TMmRJ+e^Kam%?3:cnMVQmr+m0dmk@Fub+e,'0rebou1fJ0K3282'ZKpMbS\r%6aLkO#.#AA<DJKfdh'M/i&$u_=Ahk47VET$e8]^jB!-4ZHXsOhrh:pqdr[2Q`)1"SoreO6e-rqiqm^-p4lFE0pEj\Ln(1H9*_2@U\r%U=HN14VZg)%qiZ*&C;?S=A0W5E\-D_SW<(u'J$r%/)=OU.VNoTp/J(M4;P5X!h!>oN^[rTnNOZ51:4+GF?hMpjh[E*"k%DepNP5(\r%!&)&T9"MeG4>/o?$ec?@`Q;2tZ,h618hl&6PN]cs:Y+5Ys--C1[52CC>L8!A5##ZQe=iDo?Y#i>Z2hWO9iHb%[7]6Jd7tW\R^H]6\r%m]oU+,AYF9PWLPP1'P/NZ]*_r8W)fd(sVVH'NE)2E@^V7_turNG[4U!`VVW8L06^],3jQrhLpJg/ZG1,qk&"OrSY'EGd,oAZJ'D@\r%H/3^<0dN]+:9\mG.%cMj,Ii3U:k+?3AHftNb:pX#TZkCpY9(]$C+&8Ig$u8MTaiOTiQ"Ji6-mrDWnC5!cS/s@PGIHa>ADe'BXlu<\r%-G:L1fl'%B]#:n4gpkYS()Xr&gOllV<uB0Y]`mQ<'.D;$-*]#]0]N"CAGcDX/H0V5i\^(Rh3!ZF=b"i2^tOicnWs^XVqFn7L;uC?\r%:G\sL81d,]Z)hAc>X-3lp#ntAmc*a"8W5:o!#9Z:&".S^V.a8UQ4Li3Od%&t%V%6BX4;iakMHh&BW^"]AGJ1R>;UX;h+oe@:B5n3\r%@(k[N8fe-F'@bBTTDHfls2!K8pX;TkP3iC"Q/g(mHHW.(W1!.97'Q\-nbGrg1i".9o<bPYVNuW/7#!i&?e3IDADMcMUANstp'7'b\r%,V>$=AcZd`&lY'=!bA!C>+>R!Z'M1q>5Y;PX+o<[jcl/j-unF/_Dqn"R%EfcC_]eXF;%cYeuN^n3YVe)IXTskr^F#,/D@AsVk"F*\r%irj/nHtu8IO`[Jr[*r6XpD'EgRQbs_neE#5l\-^^O+F^g%8WWkE\`5nQA2=+ZB;$*:)\""E"4gg3.=isDl9i1,iB"%0M_pff;5n!\r%gs'_BKJ+jUc738HroV3Xb`.8<Al;)jTJL)BQ2]'qL"K;4^2:t[Xj=?#\o7IrcGu[]>(cVV,DDSu2h3U87YL8B@=pQ1]D/[].I6+=\r%5^b=!f9:=Z^b1b&>=rO1maK6,BX.?UAo\pLV5g\Zmnga"Ot"WEE;E.F)3<>][TK'!Do_`dh.X^;TcTeHEUT^Wal)eD48=dQ#QDB,\r%gJ:;&p"WXed8^s>G](r>V5Gl/S>)#RnA6:WNhP]dYoR=+]h'2tLr/"?^QW*mrp]G&+b'7bC?F]RF[BWDYYWc"EX';"ij]6PJaZ6%\r%EK1dRZ=WBa4H!]uluK'#K@kJYjA]mo+L]j"9-c->*fcj@m9o;6pE\>U.^J<S^KKAlXWp(=UMWe\<pHPAL+.^gnKc7:Sgd28rakAl\r%8,6rNXNlIr[8M.rL^0SG+G-C2#3)RR$K+>s`X&uJP5[Oq=_IOR@\"WneQ72jZ%"dj?].h_I^W%!RTgJ.-TICfQ7Ic6K(G^T\RNm1\r%d@*18OLJ#i%uM@t%15cY1*%@p[)%de4(Np_ML@T5m@pL9<i:CTX<"uVb+GL#eSsN8hYI1`:?(EAM9eW2EWsPf@bt"LElH5$cT?uS\r%o1Z?!4<m^qT#.Ac:lqVOX(*<rBdG=<K3>R%+7&5Ple)RL+:8W'aqn-Z2s6.;=K[Jq.ij=<(Y2Js@8h##]CmSm%Hc]27J.Q&-!6Zb\r%R14JcYmsRA_Th.B8&`%L]RI-PP!,`K#>09E:RbH%@MlMT7W9oQ'Z\klm_$t;,D0.^EEjcBJiHoBrnrFZZh9iU6bAd_=mtBT+@-`Y\r%Ad<$-@X6.&7;8NZ<(kYr#Xo5W_5oF)8g+i!+sfmL.QbbX?7Ohs8&iTm"UUm\0dSe'(&s1Cr[b>T3/94eVOhCGp9s_Zra=tF(sMjL\r%#>:+D@huo[o:i!N^WVB.r8(#QOsHG+D0d[T78LuGe.kqre7#7#HG[7\etAbkF+K[,b0g15NS@Z$:%DC$*<jlm7C^r(6#JCB=/e0B\r%T<('S"jr#N,pT:6@uA1OHb4r8b'Oo0bEJ:9?e3JoB&.9SMXT",UdMEZ0D\:T'(i2&J$?3g472UE#'IrfY]_KfpYTWZ%:->THGA2&\r%YL\[S=uQqMARk?Tk:_uL\U%Pg?e13+XIE(,aEo:9j"_jl1qbI7H&Z90pPB"JZG3K1_c\oN#LdH'$B4q<053D)NHf?j<RA-F=J&,u\r%DiIO_;L`:Dj3snV.?W,`a"TD7B@lFrq=p_A,12,<3"KYFQ=3:.c<1P(oS>A_beI,`f[lOc0+ghJR`-&TE6qao5=9&sU#JCil>N;a\r%n:%9CGk5@MT'tEc.d+%'aJQ24_@>G7&uJ.C.6PP"4Uh+SNme)[no"I.pa[[b'u5Q#!g>AT/ss8]btkr4pZKhHKSe(Si_9c-gaL0G\r%N/e;igW@/Ip=T,Kf<qbc)`Ba7qWAD3ou@s$d[c(84t6hs0_FQ.$'0J,3mb_7/G/SUG7_U=cK@fOb%HlTGV2"$A8cRW&[$1>*!'%E\r%J65IhkoAF_!'.^t*<B.Fi-;ut$"KSc+=*MTC4Mcq;:t,fUB_k+ftY>3ghit`)0M)]=7gZA<L_.6@LbDG;:La:*,'Ko44P\&Bc%HC\r%>&,HsVFItmH;25<)hRl=NI=cTI\39&FIbWCf(jq]mu!j1@q$HaPk+oZ#k@d/<=k*X''kY%a;KOSqLn`L<YKq<FYGnWK;m``oYeVF\r%D)Nhrn'C5a_Hg^?AfhV0qY+t(&e=^=o3]JK3)XcgjfC:EGo'UZVuXYn-U_V'Bh#edq2]e;RT^`Up)K*te>R-S(`/a:M^TNZ@_pN(\r%Za;5Cr':bk0@>JX?ZQ&[*DF.a$G(=B!ESVL]PGX(.>$hO]3Ef9FdTun=V]/tkr")jH46NgMu!\;!:Mu0^^&*+&Gjo3YTl3Mqs%"i\r%beHG^JH00YZ2UJu5QLTs7MiWC";(/Xi^tL':K0&$;Yb&[%SO`"nYE%];9;[4&H-)dQOZ?$>L>YZ$QZ%%[m#Pm70b:%Xlpk$ES7E\\r%S;G2C*g0+M)^3W3b&jQ4SXS"(P<\PAoS$]]Ss%AQN-l&sMs1Sd<Yjheb)ub@EZFNlb!V8$9cbl$$5'AR0T<LJU'7[QhQ(c4/,u?f\r%;&lOfMOjG.Nkfb?B3l#h`1NDLpFS!D^I?Hk8X&tkh+oie0ZK;Y(bUt;YXkCB1VtjBYKTMfTo8MeD:$2_,A6FLE"$eBj:\_r#Tus=\r%95?hZ7eE$i4f\rn[k&,'iH,?.&+"VN',j^b*lJUJm/2d];^pY'+=6]2hl^VZ\t1K5*@M7RA]d#C0:"<W7gj9/mK`F<3]Jd=4G^,[\r%J2u7(>7-E$Ts-0C@nWM]oh$/HWF0]Sn6=]_B2Z`_RL"3=p!^57&$mqp@;5KP?%XET%+!#urg$,+^G8MTlJ_!d;X=7gp:<Ea._PVd\r%fP7SDirF":T;#Usj4\"YBO$;tTtP?iTb^+m?=tkUa>S@+9BGA2Z,sg6j_6iQ;=N@Nmr'4LfBGMN,YnB]0R'kT!)AM@mZqRcC@@q$\r%e13_Gp-./>3lOT]H?ll^^G(&ir@WE;!DmA9%,ZO-Z^`8)UU,g,;6poZ[a]Ms.,"J&:G+hUepr3$K1&:l+ube,H!!87O]7ptFA:k(\r%*KiXf6ZR=i^l"X0Yip_gYoUi#RcQo&RYKq4hs!@_";e`/YuhL/Jj6XMP#Bs&IkCAPknkZX2mLKheWt%qd3h>OX:O&PEX="0WJGDB\r%h>ebKi]%&60^+%8OG*3s2r+gG_R^56IP"BP`:[$=:cX=*BU<*\bHic)#o7F$QV5eF;_CTO9_VD!e90jOOXcDePPJ`'FEO_VoY:<K\r%%QL=Ij[8[UCe`?1\j*[=7J""2UNlonnR-I$MW\+MS'!=QJh)qU7`@/8$$c;cXgaFF(4G1,B3*FNl_+;a&0,DCNj*HtJL2B3!4XE^\r%H[qid;E'/_:Tq=pMWS#TW-<#2CP*Xpma*UPU_HP@RC,KADs7DJ$#O\#cX/m#>6j$(@@8D(d?D:M9T"h,WI2)Zd;!e:^a>/1Ca5T=\r%Db1-'(r5V+/#dKdVYpNe%E/p\NO;1Qn@3C7-"<=IoT5kS9j5YtJD]X]G1AN%CJ!(7#F/Lnk&0l4Jd7Er.X_lCeMllqD\b;E]Kcu/\r%/AZFqo6,1SIf>T32g@r#m61#H`2D4C7&$N.qI?TO.2""<=$84<pH42*/,R'nm%95ERI6'(B7q_!B2,(FR-6"V"dZX1W#O^l+%<F2\r%J=H7g:X9<4)Du.F#a_&Y`pQ%^@N6\%.qdud;$Kte%7pNuO`!SEH$iINhGOVEG1P"3*:<s"LWRM"1?n[D[sV"2\uq72qes!/B)j&p\r%-CPhfVg21LV$FEj&%[IEKs!b*c3?TMZuU&gnrl2I5::5\h;Nk&JuH9,_(WK6_%6EgB,n'HpPV$npjcc_BBQd,bNEM*N+"OZ;HW6/\r%:U/ReWU_n2=9/jrKKp7X:J#=D!0NH,@QN6;ngO)1fZg+,"Ve""8aiHYLU3;KYRh#710Ce:(<W^-;CMP3'68S;/_o\.e4[ME[Al5b\r%\:s^+Pg4Y9o#MuO0TDF7)RMV.p$\=DH+\M4f(_'PZ74pA\8X/IJA=3RgZ]4:I2mt$8+6%6J]44lUeeXbLL'5(0XgMbQg$pX%I`Aj\r%cS5&9T>pXio[@%(<,V`-7^^7RHU1K-?QdeK@-RqBC)"BXmOHd=e/EHV_IJ"$`<%-k]U0^>Z,"EP,B#3=0q3`-h3$*(P.?&?aQq"W\r%4'B&kHd&:BNTCmmg`-IVXK]I[ria_%4a@!!Do'OHHL5'ZH+D6f!V7uT$6(hY4CEYUOe\tf]9X9&^2EgLmd+`$Ih1dnJ`m][U6'aU\r%/D;^Ue7emJ$p:P![gK?sc`i9XRt`&QM'+?W+UDscE>@`1hpTq/Es7,R.03k';d`=.>CbA2+]%4#kDk$7F1'U@.(@<Enrp&.H&'VD\r%9Yra_OVD-b!$I9OQ*tZnK<?uVA9gThY'>L.>[Hr)Zr0Y)?f!C^D4CXVmf`Zbhu8n,G<OQUp&7s/PP(JL^V7K7e'62%ItH(Ma4B'M\r%=]+;InDQ"AE<5u?,)J+aK.PU]jVW?i?.qo5Y'D`B;ksdj\)J+d6*?.n9`'f.l(P"h==N"\Gqen/Vu,p>,J1_r0!D3?UQ_qHC@*^`\r%<3a4D0(34simeeH4#tDMAEF>I-e4^1I\kK--ei]iA1$$kQ>ZM/.pt7Kl*'G2C05I>o1o.!J]^3j[^B_KCYiF/F*U@Wb9<R_52720\r%f\at74h.JVYT/:*XD`@'DL1"c#5-TQe$X783bd<s/g=^GCShm?I8p[QM_'<H(8J#W$V'*h^iTfq5Fq%hGo27igcqL*HW^3Mhn:VU\r%75I*p(KaWtGtpLb-QQ[jQDIh=/ir=up*g!!Z=cC7i3gXta\VhV;kmfWUC,,@S29m:_E\[[(*q&mhp(K91;0I7Ucc90`7+\TbrM)c\r%_dGFK'=@)Q-tXPDlI-OjYNmY%#EQu2?mk7JNu-W[hi)OL#2sP]9T>4,1G!bU)'S0,5X/%"_$1oAX!A?PAu03[KJf?)T':NfDY?60\r%EhB+J^i@g_`,3uq<e^-`SQ^J5$"HKn6AH2.1m?,NV$B"ZRMsT6X>AH-o]+Sh#\1%Q%ktk)-5^p3*_(Ct"Cm]e#:$<I2i!+O3O40o\r%F/BqSJ:3C7Sq<%#m-RbAq!1mlNrU(dV-/-ir(Z\]-O)j^I+?Nj=b"iFf]u"Xc87WJ,2rPknR,F!6,uA(0u4^EW14Uc6R/+0/OhZd\r%%g%t\'l6Tn^Q--K*EdY.R@)nHiUjQW@"]ma:4qJ=f6d(5,Q+%uGn:ssV8X7LLO%?!C9XaQ])Ib'%3-a/\b.\?:Y&k!;DI0PU34c.\r%0"R34KM@[.4IijE?[Ytr@+Mk28phf70msG(RW^s#]]HI.CE+hOpEu=&QEtYP4tVHf$,i`R4-MjJm9<Gr*WmPT6X*EFmfi/*<_3Dm\r%G.QYuh(a.,dIJr;:cnBD*Tm["1VHbuL_CejIH:mDI#o@_j#+ZikQP8C\jBgQCYT`;X"/:3.WqEsZ'O6PNcohI=Yf5GT^^#+i!>8P\r%OI/n,Maic/<t$]M.r'(c@C9pArM1P?IsrWVP/HXL%nt-)Vad"P8ZA$.IiQ@>&;*Wa7$iaH4qD-^[H"KT7kJ@irlLlTM\Qn!0/C2l\r%3X42`,23X=BZ7LPW.Hq-S*mNoG*`#q'WFs]SHH>@NanhV>ePgaJ"tPn:U4?N\^e4&f,:+8?3M!iGt&?,,>@pk0,IA&/faZA<"Y)+\r%GmkF"UPr$=Scb-iV@W<=E*i1%;'S77:ShA4=38K7-@Hu&llXlTn.=nWLh=X`4YVkj>D"=&l<.gNI@M:85hh+JYiY!%N0#(O9Zi_0\r%ZBih?$I6*mN\5#Fp5:MT#Ya=@^rQ8/E">7/8'UL;a88;Q#9c95i;U5(V$D,mMdW+[clYg*Y,(mYY=EtU+U%4D?&M^<:<7QSU[Spe\r%B:;V!_AH\*6Yh^eqnqtk9>@Q'(!B7^RdV4kQ`IG=Lsg/AaVEQM\<YcF3pD,b-/]mMOVT[?MTM%TJ19TN>h*=d_=jS@B43*ln^gR&\r%e1O5>:"B.Zh@..U$m>b7qNcbaK."eCJ%Ml#:[X3QHZ\OsPh[5"-d0O@?@(P%K)I:P'@,7\aG9Ul*0kI:e]i.1`Q3':fi#O75i?uj\r%fim6^5R1Wco)=`[eB#>*.8d/u0^\.acfonVP6T'kB9@0N4iY0DQ]8004lY>6o'9N:,OS9*D*!\Whg_80ES"f)95,B^D_@.YB`H#8\r%bQHl[N=tVN("t%f$^-<UeB9O/UG\f'Ib;EJa</lrd!7&.idg,R65Qg)K%cWd$<HCNm)_mVh5Pa6RHUj'Kf^J@gT\eG1d."Oi_JpV\r%d;T2b"?jh[!_gq&8qXkteb4oMr+`71QlLXO5SH-/KZDVt+<oC^m[(]ejh`HR?8p=R]UpEEWHT@PmHlIlq?Z1#r]6;DePnP8;h^ng\r%JpU*0LbX?9<IVk'e0m=M8f.Z&r]q[p[uN#7aq$d@2@Ghe?Y9)6'3rM\^t:fi?VM8P3d7oB2j3FB,_["s@PmTOHB<E\@Pi^$A0//V\r%A5-O?PnM(0BY^eoh(LZ".&7qm/Zi%hNCN_/%=QIllTjUcno7&B6@1K6QB/p#k4g(99@MRIPo"e9ic\Z/M3r)W$GU`E,O<EWr"aLB\r%&aHHikmlAlbOs#ua(W51A82&JN&Z)0??F0kV\#V/<DqgqO3J5Ffo`<'#Tti`Wd1?0#Fhej*DXg_g6e*Z`&%+;&JLEAM@nW>3Q=6r\r%s.G5J>=V^T3@Rs!_bj"eRCh,WbF/\)C"0Epai8"5p@W9K,V^4CD09]A>dqiO2*KAjO/%Lmq99o!iJ!57dVl"4F[n=+aBgN8EL=P@\r%7K)J)mc\@?9*PV#@Uop%ZAig'ktL8(#5<(pZdI$M=VgmXIW\.<;$WgOO/=*h%8Rk3>fRnq]`/^9epP.*r^fS*.YQ1InX+ru.WS4?\r%))Kd@CZH=Zh2scG=;I/LFTd'0=Hb@49tO2FI>g9)9tO24fn54kfn2!^/7;@OZOCUj\cqHHqto'!s#9V/fl7@H"D7u%_"*s]%rNkh\r%3=hhLWVdDabjIjgF)U`&ena;B/?<]X'jNX-7FY'q4GWH+('JDUkCha0=rrsuqg%WT923%WS%<c.4AS'N)KatLJ;gsZB+CX$84pIn\r%^JgO"e.cLFbBr-(FQUJu\ik<DbE^`p$EE4f$*M/F<AX!AT4(3.&)eK:6[itL[$(/YWjr6i[,._Sq[0DNkur0V^4PFd<-erF^-\OQ\r%_3#njIYOk\5p_dQA%r<bcs+:dGtp[k4,g6+o_u%97s0WP8D[7N@j-1I<\-,=@o7!n:uTg^5A'EOTB0;BJb,[u&VWTCE1VaR(;6I!\r%dT[n%2jI,ODkV;=CG>'9(gAgo\<HU&H.'_K$G&8QLq93:7[Q4><!8b(6eWN<hcZHScJiAM=YQ94Bdn_Pk9:R-r?;XJOMr"Lp-+M^\r%P11mr6T+11Ja)#nPQ(c(>kNCeHI[-lp(:4Z2BE!kb&Gil\a&6p7`is8JjJkb/cg4do_!`Za.F.o&FWFq5URDa.$#%a$W?+SC#7mb\r%mhXD*Q;r[XO,[]OM=8h/SZkYAi`V2e8qGG$,S$'rq/:T:N]Ip\+RoPoL#SN;(=j,["aUaLB-FF_3*>%l.KRgF])IQ.?i#A3Db+,G\r%A`HpJJ-mc5\MYo,(;D^7rA<r.LB=%T*"/k7FWuA-MO=QlS%gh=K6:3Cg,0pme;0^Y;#&G_#jtFhUHVmPa72L77#BJmF,7<5g6s4*\r%>rtq?+#o"rQVJ`Oc3K.Y$E(gPc2:)Q6N!qn/'o<7]CS+.R`d$q\bbN0#rJFo?LF_qq-&fcd;e-"h]+]9!fb!*i02D\pu:sNHYFHq\r%B5k$XRd_r2jl@'cG,WAX6YELH]Ude`+qo4t@q4MN4&$upY2KqAg-[(T:7hf;S*b9:!$[INGbKMN#a_/NI&6['8UPu@/^Et!s3YLP\r%FaOl\'0]9c?ati/*0+g8MZl9#R4h2rSG9`i90<8[4+2=NS.>S?IoU_F,f5i-;sJ\u5^e)N$SCVWnZMIfhe+V^/V@G>[=>CTW_boO\r%gTRVuY**nI+EGYri;Vh%5FIqq_\PU=Eq8;c$FsF-leD0)pXZR>Zm)I(ZG%[HB0=2&>t9eM<nUj&fKrZ@Z<ul4)6/%4X3kt4j;%XA\r%Z`C+m01BK>pfduh?,(O&0?pr[<A"CA[XF8V\>&C3.sh<S2i=cTCK-fF2=@Qf;(Q3L55Hd2gr8O%M'keq]Ppc^9n[0(a-:X3oiA9Y\r%d_5/)=kXY^gJ`"Akqma9b>oJWPRgU7o]-Drq?_6?K`GKdiGmEDkfPsNe8;:SmYk''l]HrtoatLY1KuMo%rQehn9FjeJ,B6*N1X-[\r%54><<lAT>/D@'Xj6(ApgiZf]"aFAnAKBJ:,`Op:V;hI8F&k8Y],M0I'$H5>7dh=i.@4('+N`5qY`Pg],AW"*e]jAM+Hb[M"'O%Kb\r%c`^ZBL0*bL_WWW0(.N4R#BHrE(ZTUX:f"qA[,9gU"M\;m)h;e+T5;6q``JShjICG206MDFNH7J")^!b%G$Fn,A\%9\DCJ?SR-[Nn\r%fWCXsr6imI>Iou8$!'a=9dO=gBm,X\H=_$:@)ead,ORZK<cC47nGYiA"$SkuYTmBJ'%3:(86h1D[<.JgI,lDIC#33J.'rc9[cQr3\r%hnO8,Xk,'jQ-4.nh77r\,DIsYVI$k5Y<(FlqL+Bn:U]`,HGA]`Q"'H5lV!dGAmAQ2hJsf\f7d=Lk'ggAkLD[ib::7aj;)$+et$/_\r%NZ-eu/?5pi;+YDXOsbZ.Z`%dYZAV>(+'DRmK`&Qcn>5<lihkl&>9WGPbVif#\6$-rQJ#U1[fittihemYHYuHC?-#4ojZ:K>'($k*\r%7JTY0Ds==%lB[_O7c@&^FA$i6rFc/"5s!@4WB9us[(fc:Hf&4sNZ:'@EaO,?*lscpEm+=_pZ:+]LqGRf]+-*>j<m]C;1i$>aS#7s\r%o>n9k55i\fnF5g<#F3`sl/tG.jQUPFI<`IVj0NWL1>P_0LJRX-Xe*6BLMsT"#$Y;Hf1so4TklmJ`RC10<3.P@>WUB--<cFRWFKVt\r%:B?LMAMgjE$)0>-a:[(9gTAX3Y9I7o/%W7%hKN-&WMr'm3kI#VIq@TLr-5^F7itfpCV=n!Bt#N]bID-`.JZlpj%<lU=+adZ!:,pJ\r%LL'VZVH5ZRQ+q/3/mHB>,%gL0+MM\W$[MWVK)tA6CPhj:\\V?>^lEo6Q16IV_Lj*+YrHUi-GXOIbi`VT2@iV2FqAM%WoHY*1QFo`\r%P\]21o9Dd!)]:cUX8\eKFS7uq?LFHRI4r94GN??n)]Hq/bH((H?Kuj^)gj4@T,HM$B;fV:K))K!eAC6I^;g&pknCf'3Ib5pAj0o.\r%l%edQo59H^`U&'4qDg.(c_Z\R7kS!uRTuUrDW/p?!q`XDiM6@eK[C$4RPmS'q=u>N>"nZCYKj]1rdA\sNE7]1s1C$M:Np0Y`^Dd$\r%WH+\'_9JbqrleijC8<3hdBo.i",$79cMI\gMU%Y'Z*W,OMl]#_),2>&Y%G<b/,_&X:H3rK7'A\%7dVJOVqeYHkdbf-Pg[7.-*U'g\r%4jW(iS_o;(`P&pU?n<uC'*]]Hg69(Z[=seT(Y'j8%/cD+W1XN"0?IYGeIk?Z=Vni`R82/%-Gaj)JZ9+OI'=@nB$sp9H%VNU$\.b1\r%*#A+O?<Fl/l=oI@^bt"BIqTFsdoR!'i\[_ReSDeCR*OHm"g`L+b;?,a<m8F1%;a/./5!)YLSo+:++4-N/jH1C`*2"Mk"hOu;6\cF\r%Z)cJ0ZHnk_9BPkl-=i^;mg9lEKQsa/cdZI`ZOQfl=pAL>%?(#hn1X:qPLXf=WBmrN?_*]V\n>k:QPlN;A_2noDY%GbUk[id)1eAg\r%Y3WGS]Y^JMJD;29\3mM2RiSh\3O2!cOaO$j4ftWsph/aEQo;P@l#bO+F1khB!Q?qQ!nS^X7S6,q;mosEMcC#SJtYfbI.5TZP>pF$\r%.'@F*T70tRN!Z[3(u\8@R2MbgFqoiM]++o9NLm</cY.'B:.-_s<SeaD_Gi:5a'J>p8*NDt0hM++GBZpp!0#;&<%.5b:TFHfIYV9;\r%KBlC4!akX\QPEj)^ZBOCStp_A*eQDtD^M4#s3u$MJ+,,Rk[eMeb8Sk'08k=Baej`HjJ/V2-eI4d=-?@NbfJMt?f.$cf1Sl_[h`/\\r%5(.pD.Dr2^0()Ht//$?(p<phTm!e-#`k>Y:]WDONpQf`%qem@=f--*D[>3fkQN#t(Ug"W5qfin&K\Z(P8utV6od07Z[RQc!XRrD*\r%""T+U0"L/7X&r^S#-Ejuq!<ff?e)5qUmLV$:s9XB$bOgBM6?>U9UqnqD`+!E*rT//]#9<h!TRpAD;#o0agf6:BoOhRRM?l-NEn0`\r%0m_3@je[Z;9pK!glIAVFXb^-PfSB!g$[JB-l\3g<s'Vj,]J!VEdSG8[>mi*s@aGkKX$Z"b=e1e8=_:iV:OB90UJ=GFLq3;Lj7ZV\\r%@+o?;MokHTlh[%qLq.iLfu#XY(3\uRS"dHJPInmET>4pf5Og>a?sle6,gP#AM2$669.!caV]uau#RrC"T3l<5OLE*m`;=f&^+`0&\r%O&L9Jp>f`!nV)2AiYnZg'Wpu'GLF7bd3Ep\4]nGSVsr)W5FpY&[DL>EGb$.fma\`6A9R(bjm)+!fpD4*I8A2-Q\:qoNAk6CC(!rg\r%V'e?irWqE0@efXsOr.X-FhlC[AII9iCr?a[1(btBa%jH^r^tqN\Mi09]ND8!Y1'41f3Hc]]SH/r>V1C!qC_WYLPfs&q0^Ib"aYKl\r%NJ1LdbRYJ$:4B(Iqi<h-ld,$Y[A<`!5:5HmY]m)Ig0EUF5^'o0YchU^Vp<rdr/9uebS4H;.P+$'s3B9W#mc]c5N_`mLGae1!3Z1%\r%F0&LI83mQ0SElAu2k;+)m,c_&&M.`1G',Mm]L7OsS!^h`adMpI\5&DrBB(R]/2m?!kj>rdcl_bQKr]qYSI3phcru7nS".DsblV,f\r%\>Ya@ibjUN&U,X+':*q5UcWeo)L<s\U'6gae\./F%nF6h:*3u\iA4.\eLJJ]RA6^R-En7qW4;%^A^*S@Or@W;K:?1'J)D&#YP04T\r%m]q!uQ#un_fH'T"*S/Z^VQo#5K:`H+h4,q?#WF/(R(BGG-a"X/n4q7GqlkSSmGW)cpIf)?"UEXTl.!bU5AeNQ^QrFM+08Rrjn^d=\r%o7@F0[?PC\hK7AD8*2,fR!_$^^+O[Wn3=EKG#2+hWrd*oJ%6H09;+3;QW9kEo$DVqiIRQXB/hGDN5YSld,KoiSq-Kb$bG3P6<+DC\r%Q0^XAR%V$::Ure%$Ros[UuVT`QHtSWk.`Com_j@O/-[0TeqH)!Gt9@t(S]5or%48GYfrW8^B!VZ5D>6_W<628HK'mSQL.@i8u:3c\r%@pTtH&H!FFGqiT09J-N2;!66a1)/bqIMC3MEt)IIh7O*hhq%p"Ymdnt"\_t4[=,7#U$tr_(.h;LM+A4?;V)O70BlX\<aoOS38'G)\r%]<Y[NSRZ&Lfb7M`X45E39g[3?4@sQ@"ICZt)=A;l03N,T7"aDO,/$BdnoZ,[_]+fSej$[CJr$(W%N<Ln80X`#Ja^1XK(Fm'`(fjk\r%@V5PE@!u9X!&+`dEUZu]U^%m65Cts7@T7",bKDTjQn>oN?/Ei\@=4Rt\CDfOX<`88:7<?(]>:4o)^;,VH`h(>`ZPK#XRKl:=$'QF\r%FG_LN#ob&`pm#V@-g.c(G=OT;pW]b9LWnRss+u43Sd$XtHTDQ1DQdE#bl#TbaI[RldjIRBl[.)iF?MfFi;!R@NL"\8:J-S!Q*Q!R\r%Q`K.FK"YZb'Dj#;kU1#P<X;(spL5)Ef@Xl5VYqu@&%:%4a\g,nrDMQ(f?9>`/%"@*l(02I^P!5R60eI+[jkV@?;8'i7)I%mWWiur\r%/?C=JXgIT7Uqr_rl4WFFoIDM`R9KO;Mq*A5GU74MNUP6_^B3aZSqru?S:A4E$a+AHHtph^iM6?efAgln+HN?_=9WshXNie1HbLoN\r%k@VD#pjM\sqJ#d<i"Lk&140DcP-5+ckIA<"U4%9s@4JVh9r'FV*B*-`RMHo2Rn#^R1ehq0h-D-8l+"K];<'PYg)of@*MeS:pSqsV\r%_][hJ#UXj3+qX5s$8KUV#fQ37#/P@%-5^8(!WbuMLb=Dr/-].`D%g@86a5(uR]#?."H\%)]`El/BhM+8bo15+D<KQ+,B@/M8LJuu\r%i8`XIQ$;ssD7Nf2I.DQn1at)!oHi`+P2nsj0M'A;KaUPb;<fD=DVHMZiHk,k:9'UFcl]rV^t39EWdk2<"IfrZ<PSThj,AC)ouT2i\r%W!ss0HCQ$e/+bm*i[h4N>Fl'pQCB^OA>p,C*55P3;T%j6H:E+9\XPb?^%r][b;jTPcfJnWicK!ZnG(__qarDc/0D3ma,mZ%9&aY<\r%btM\6d>`tl/%gqf<k;oS$b1#L82bJ-o?Z:G(Pt<kfKj$Z%D"&WE_eFn_1jrd?%+6\0"HoLC8c^jn<WK)6'dG7.5708qp?O6lN!TX\r%`f;9o58+-e(Lf=ahX$!A-hn9>"Z_T77A^[cj'+jC1W>RO&uK36poIBOX?7*%=XL#t1</7d"7HL"W&96.FAi5fT/gk]9kL4):AC-5\r%\@b4=+lZ=SHQ[269Zf3,1tDaYm@`@lC[2:6)T#?B!'/tWJ@02-@'e`)&@hN:nTAcO$,BY%$$[`o+D^tF-,lFhjj+WIES'lFEOWS)\r%+H*iN36nM.L^Am9Ot_k&N5O;H".5^9EK4@g8OZip'U\N&?6mNoU=gZ:eTK8$a`MRH2846b.>XLW+:kg0`VWZ&.l-Z2j=kmrINc]@\r%\T\gP#f0;@'9PUi^19PSs,g"0!Frg^SWo'E`l[[.2:4[F&ah-J"&\2,p\*_uP5$_QeoT_#=T!,a"-MnYRL:s800K4+El22Tnk$]h\r%'YO0;$Xot\U@)%u,*T&^S<lYGD?2'W4`dH=k*qV<41<2TA`ioKs1F*A_CNSrApJ&B;Jt+-#%=biZTaq2S%]VM>bOl_/hFb%nUW2V\r%Wa(l%8k3?d<$5GDIG(FX&OMj^ZVab"#Vqb^P_+oG";-nT"f3?p64i)RE.0BL71d26D?+<V-GA7M5D*D41<@^i$(f:Lo^hZJQu%0K\r%Blj`T/P)-<k)fTeN!L](AQh"F;UEgF+P=e#Q%GNu1`qVPR:N(2<a#bAO\EuaIpH(gA4o4.>KS7#89-0j/CragCg:eIHT80N'YnMk\r%(.^_TLA9#3Pn@HSFIDsIr-fuAR[W@$r&@n2-DG<6%r^]d\4Yqe+<KKH/m]^S_/n?Io7/9N.!]RNmXjFUru<IAMgYR[2Q?5k^V3S$\r%!Ssoel1&_I@'Oi>Zh7P1JMYq1\??78%@eTtK)81jZ>^!aFk3b`K*C^f/D#emZ-1/7C,k74KuPk(c6Me)G9KMq00b\QN\1GH0;]YB\r%W@\5jbW<YG,o6Bg'QeF?#d'rJQGn$\bu.C5<U>&-85?;bfb[HCps9)fE;%J#Hh2!>'t]06O>fqkFOd*fmdmT1FA2$Q?$rl`gDm4J\r%f(07Sl?q<is5ijK/nU[cIaUGh)A9qYW2A3SK_sJ4RQk4hXtGuAR,_sIS#<RhM)Xls0YR%"K[)F?@<(_HZo>F.5]OeT7'L`meVaDe\r%`;,A"FD%:!,_MX:9.Zh>aZS\Y+INKKJWk);+qe57c'lN;g1i6p%GuUSXd`]rls1XN=3kQh$+o8a^L0!`q0p:gf+TN*D-q8fOt"0Y\r%TEHTQ/6p!Uf_f]Z3`"k@&om[r5V`l#o*A>-*.VRYN]_'4(?n,efcs#lG4H!`k_E^"lS&)X)9flLZ-88"7XF3SOc3u.d)(1>DVo<c\r%ECe)WQEZ<s8;>>%=&*Kl&BV$"jO+R\Lt0!57%rY'%*$C^/>F;M6-HI!e93O/_;DQ:1AW.3K3@nW)BtT/DF**?bbCOK#2!reL)O6u\r%KO^+&_(8fZd1FDNoe(^UZQ0]l@)Y_UT5?fU_5(j42R4[P`X=>m+-KdfPEh<b%R`(QT(`<p9$35(lAhke[2k'6%-gB##9oR)f<[k[\r%dfmk[aBRq[A4Y4Z^bYa0)6msb7t!j*,X_,VHg3Cj>F;&XCr[Y9\PoIZOti>J<FrO,11X_>*os"(P/3`PI94o&ae/^c'$KKoA2YW6\r%h2i%?Q2P$Sd2L-":#;57d0@]0be'l1lB+bj3k]6\q6T!95aee4_fqC(1T[5#*pV:^@/7]a`K.T$W4MFT9o6sG[&o_MZgk<$[:#,R\r%I8%WZBB,O_^o82U'WlT)"$7]E9"`JjY=jn,-j)gBLimrWdE`QN0UGQ*/5,bt\E+X'<(UWIG"_9;]i\$/6o]\]k>H_P652;6N3_:E\r%=/"JDP0aLjgB)*J`>+TRiSutROLuJ1lT0b9]XM9f;XS.,_qQGQUus3fXp_(,flO&#;[t"J]j/,(9Y'l1cY3+e8kPLlQr?&FU8S]7\r%ho1l8TXUI%2]r*=9F[ME\H:j!W:+ZaM9:]I7ZM7V'$:cVObs?&ObH=!fWH1D'U=OA_<hSn*%Dnb`)"p^Cn9+e(R8j>@S:5qXkh5+\r%h'bC7c!E%3n,2M^GtRNQ__mDe4igJ)o+jK(.1Gh^3D*Q0[IBY>'.].%pR)Mt'gdbjePZsd7nN010Y<Xd-N:Gai[j@SCNT.i(do9S\r%g]+[mQkF`)s3KPEY,/=Lh(.D-:o]&-K\h&W/D/mY;H1Rejo4/jP9,mK1-+OqhfHO,=C]KaB!5?QYD%DWV@.cu=m,]/kP=cDgL)P)\r%1[f/iGLXQ;*o8C1=/*0u;@_aZ(mQ^RZ(*FGC^p?m4;Bl-M6\YZ^jA1r%]l;ci1q0&QDmpP<jV&S:=)EM=_q6W]*_f*:UR,O</SCS\r%d!-PWJ]1W[%[P[#[D</:o?>;&K^Kq27A^aehi/0K"5IW.X5A!,6FGih(5m_[!s]B0pO@-.Jc<jaGCKDZE`\)4]:ZLm1eQ_`M).JV\r%4eCT,^kuAINre"mTX?:,@bp;B%]'e[MH$P*_e7<2K]CeXef)4VS4;4^nAW'@ZM0POYGO#7JTSQ3mZ.s'R!-kZ/17jTF%oo#7A7og\r%obU#.csi/m#,:i,*V:=MBYOM1$5Ma<6YPjY@!*Jpo,HF"G0kV!D]T)2'_^j&)p.Si_nAEqJQC)fld)amLb!B-1fHDTfBC8Q,FX'$\r%1T/W3nY-\Dnc)K\2*,G+Q.&3XSS<H#<@-4e4k0;'D`&)=m>,KgN`?Xu).3BU'C0P-l;Zfi29#?VVd0Fd:V5QX=Cf'?mM\.Q1(R]P\r%:%YUr"f>24I4u#eJ?L4FXODiAk^=U%XODiAJ1Fb6GC(RI=WNlW`q<pnfAI$:aTOP=#1D_LjVu65adaWqH0\-&=.3Juif!ae_tA%&\r%G1ER@g_ESC1Jp7OaIZ<&,m$/-;.=Akm;_2,6J@PolMcCs#4eIggkr4o"/V'@4.&5M6_@3/*I*IU\q@'@#W21<@/oF*9i=32#'^<.\r%Vu;>1%lG4FWcrL@Cn+b.Gsf@[HDQ5Pj6D!Li_.pQ/E-k.>i4M?JE:-m*;KAD/Xkciq%#P_Zf["mfrG2"E?Hj>/tnH1cEP&RIk8%i\r%hsr6M0h.tJj]?QNh_ji'7jl9D)bO>#bV^pd>A'T!G5aUU-N.TTqQO,KHe9&3D`DYrQ+ebn9L!<96Z;.b1-YDl?#qZ0pZ3F.4YF70\r%rSc+-r>aUjS$gC^$DV:S2=lZi_T-b'IBU+iK'DYU\mtI<BTkhKkeF5R:dip`\@ugTK)PsTOPtK`H!Q<.XWTm"eR0?T$OuuK&'M/I\r%j]BE%je7?>q.&k=q0DU\ZW\(OZ[+'BM.X`BdjR,b=ecjhaj[smM"MVHZ(^s\_fGXuQM0ZVK^0^"HE4b;'dhiGPTY&U?Ej39!.@F7\r%(;#]<cdTq15+MlmX;+&rEh\Fd-ac,cQ^;flPL/KW@k'!Q*FC((X"/'E_`W?Jij#sF^PfFJF9?qFW)`:oOC%2/7A7oepH5=u7@XV=\r%ePfiL%OTu;`]P-'[YU!9%T<RV':4,'!),H>o-U2Qrp:)SI]s4Hq%g(@Od,jr]Fd)13-DT/g2Jf$g-p\nqKD^k8-<FiXh*%2f).%_\r%?%6`#.(e=uYZppYDpu;n'O%GfggV#tS`=m,1t@"BiMdPIYN]U,PA%4fg2.n70B!:iC&>j2_2L$,LoS$T8D@6YB5/I4,.J9+-Zf`"\r%\QQ5T*tJRLfg'+^6Ip\7(:T@e%u6jAX\C$fIi>FY13kg-)?M3Ck"TR85"/oi<,.FO5&m-Sd?Bn`SdG`!"]U:Z!i-d-GfKo!)kZVE\r%!QGJ-QjjPP9U2RG'uaiQ2b65o,%qbaE2F0;_ZOWp.E'U`FdLHsFF\2D>u(]"7gE-TY-]2i)U-G+@cj/%p%C<sU*-sU>ATqimSW@N\r%1:<$mD?B=;h3Eo%E(_%n#Zj`<>#b9`3=V5TgE\K**QE<A0PI%!SjS8Gk&YQVSfSRgQ-$@GF5;6P?P(tTE%UX*DV$j23&r,SqH9\9\r%F-G&XC&bL,VqXl!+:[-]/XT!=Uk.-W##*JMBaBg6!]4,k"%cJ+U!Mlj]k;P.o)&cc/`"7_j\g2G!:?^>T*IG1&"McSh<+f7P_%a*\r%!JoG=\uNA0^0c)K7ZY!+0B_;7p!13h/cRtMh4B@,\F@+#:r[Q=gqd:o7.@bUQEuS7:&UnL.g]`V)uWq8X0u9ibf[h]1p3C)oOE6m\r%m_XNunqu8%'6ACE<OU<;/5q-ia;2/4SAbjSfj<ebR^(31TP?Th]bFf!^kJW1&o6uOi\@=;;^(#CL#.5F,08eeXASK-WTJ'`^p"(W\r%PAPj,>i'nSI]_dmD0H<n0=K5Op9X,OLJF$R@n*!em.gF^Ha(*,I]J.3FB\>0K6g5GfhZT(rtS/IaT<H&:\9p63W[31jH+`$e-HXg\r%/di_Mk!a=Wrg5^,5P&nd(Kk:M+c!uQH,ns+W>t_DE]N2Q+bt`H]Gqs).!5t519_:a\)49jeMX-C4j4.MQOV\/:;ba+ai]#^IWfHa\r%Is?^q2Yt#eOBP^AqD2^S#@5ZqNW-)skFb3Ja2s"6$&A3:[ru8?$R8f?a+2R0PV[`]5&7FkXBD4p"a%9fit74chf<H'B2="D`S(,,\r%,;nfjhG&SRh\r2slSNeTj)"e.%/V@K-@ie>.@35<=TTj$a)j!5p`DXmf/ngAB5_'4`9U8(ZUG*7(Kn=5AeGHt`6L%TQnI900NI#R\r%aY'H[>b]uba\f14C_C5=I7+<']K2rl!^E,9p@tsb]O=3`Af,0;2iQtIIrUd!_h\f+Q+&"$Lc::V^ph?]iXI+nFN;lb?"aqn]-A&f\r%Dr-sZ%C:V(%p<g7251J*gM0Skn!Tr#S47Mh&7)_*<H]5QHL4\<EH6;o3U9/GYc!/219QZ*V68.b6Q&4Qn")rYfD,.bjQO>[fmY'K\r%)*C%5(MLq2?nXY[N;I"t3-BuuT8)RIHj%PunIFs[%E<+P3[!D#\;\0!'/ZKW2pKD4Fd@AQ+/)Bk\?"R`)POh:%N^WudqalM&u9cP\r%H:,%`RoUO"L`ebVB=OD>Q8+/#c)"L!l`j.ceUgqbL.(A*TNMd7Vg'siXd5l'%KBM4,K,nUs/KfReq!_L3#bhA.BjH"pf=`1FjGO-\r%2OZr??+CYr$%N8`44XM-4'H9<j2\o$$ho_QL`g3X(UEKnB0ah#jd]c`9?*uMon5$;/LA:uKhjrLluXhQXa\&[X@%[`;TB]_'pV3V\r%g&)J<jJgR.ouLd4If.EfluROZW"=BU1"Gpj)0])M-&(X&Rt9R-@oj*qO4t@coq)0Ak@E&!6h>Uk(0Qm#E1d3,Lo3RM:apZo_4TV<\r%im@Vp",3cM"D@<KJj?eVoRn]&1lC]s\@+R-qKX$2'[I03@!TbU4ZG,<-58VT3'#rXR.*8fd=F)D-,9P6Ei^)H`i3!UOJ.`jUEQ.>\r%Jdt6kf]F]oA&0:?nBGU<Y*UA)D:<KW7oVJi-rn'+>\6%2G_D'54C'TlC@F.r["-\pb%d;1s/L8D@&HHF\)T$i\lt?Fh;/XG3'l#8\r%*&qqP,FpWfj.&bm_kuJ,W`/MWK1`91mAI8#l;bWXb>7_N)lHKoB"'LYFMr8@eeaqXeh\?(TU!"]hF!Zb55?S)#N>L?'H@\MT<-9=\r%aZ6"e`?mKVe!:1fCN.R3j\P7#]P7)C8cJ[k:Ic@SEY43PiNll2qMKtI+g*1i%VQi51QYom"#L!jU2GIrP;`SVK%SBN9ZO?ei/Gj[\r%KgA8H)-$:^D4iWaB/iqV%%3jsB4-4J"Z5t<D)+TpcCjH3pKEEk))E]tf&7%\Moj:G'@,B3(?#[H&BOp3,B2e;`f/Q$1[(r_9J\(t\r%Sh@2Jd#`r;SFa86.sd7<k<.&e-PI)2Bf_:_)FXm9qF"s(lpT6k39&Aae!J!6O8DtY+[P:2Y)?6U'd+^9KDdOT-hn_fhh>!&]k@`A\r%3_\cf?4<+_ZrbMKc_B=l;bO;G.LHpU:P4OLr=#2HL*:E\s0:k*=IH=QrH6h$GYM)pr`+fS9\MOVj17`[4!)$fr"2rA/_[.HN`=CJ\r%14<PCkZE&X.03q"MJ%4S49)CT01Q3@'s+ua6GMF6^KY\*54ef0IcI9R_Ra&f-We2tH962'p:FF_=T_]P/G?\X^g9V-)i_,Kn&;_<\r%foC"(cMR<srd_A>1gK]Mlic%M-D7P!)j(h.PHYQb[LnA`n.=<8>[D)3]$tXKZJAL@o'3\!;80I8R,5Q<*^[l9MQU$<VBWHYW!hcJ\r%X=Y3'\%JJ*mm3>fX0Kb*7/L@[dZi,UK!A8INp7JK1,@`sjRO5V189EUV]%c+RHuX@7^??eOn),hfL'%f#^"+W[>.S\@-uW7TUQkW\r%K>lQ%[1jP_0\,C\nulI8m+=[E\dO;\+g=]Hp;\/\LQFS=3+WU4JsK23>ADhY5UD['am:1r\@GgQ%rm)PMU'NhKWks9llfd&]a,Vi\r%T;A?<6DOQJ#?.n1m2$)lnke#l9D5:&ramVK9qe"1P-F<^+o4NUmR#5;68OYQ6'^.8ib/^Es8ILOV+*\X(KJIF?R<Z!K!!cG;n7@G\r%aFR&)U4SQ%;UE#ZknL/<&0gskS%!gufsBS#\sb_j.(e9JbNSLNP_XeD/Cgb+THQg2<2mm0b7o7?qBbcB>[r&EH=YjI+u111B(pPc\r%=;a0ZLC-iK!)_`-KP;L]R&<6Z17O?t!Y7O&29qr>ejZ"s/NlPJ'p.r?m4Qr!?ao[f@J+l6llSrn#-D?HiaFG01bPu2GZa?GY059:\r%PU'mV\@G)bok'.JC97M!:=GHo9[NL#'qUhVSRMJaPKcFaT@0n3$mlcP%L]nS1N3W),Wmk/3tld.KJBYASe3]gF*S4J_Q"I/Xki2h\r%Mn=B^\nf+FNq;Rp/oNZlV9p<-NYaWfq0NB>]smYUKUNi?)InNVARl$%j[RNWkA/]t-qQR[^3;35d:=O4hn/9m!,\K\a,K?2oP#8W\r%mM!s@l-hOC696r?g8:+06/Afd3T6pa7Z/<=U-I<V<3'"u'BUt;P%SkEf]=F>S=o>?!)@i8MRqG\(]#[&KjdmZ0h9Zm`$l@*M`KsR\r%ZZuh#T8Lo#=Q?b55RYW5oHa1,n/JjBphMgE.2Y(J,?:Q@-QIR5Nn;Wk9Dd,?kJAcVZGt/"]QVe;7^Zk7=5$KCZ.cP;i[RHPCKK6D\r%1RE.?45tEr?ThN0n5jWr119suXY24FGap]+N$h75Ylp&gb;l_Ad&f$V@1hB^I[='W3j@'t?6NPClVTO-=rbG:LfUH!Gk[gL8%#6n\r%h]k?k0-6KQhHu36Z>VR].lB0;W%;3rF`tllLM;AJs10.qA5,%ET1_9S`-B915Z3:lRO<m$Uir61J&]']YFAC\hXb]2;I>)%hY,p5\r%:X[<76\3p^\5gH>?oPP:\S$E_XO=_ulO.koL(A6`/+iIpI*GhPF2W">M9]8o'D.;Z`PiuNbX?s-J.)^Smarl]c-*R`K=bjng)p(l\r%)_Yk7H+imTlf'>'pk'o[p(+s:88Ald=L.X5Ghp_e_k?t)=GM;@F7\.Uo[*4*L%j,#hk$M'5)lgQRXI;X92C=TgOn;A^<]J*:XL1U\r%oh%^bl#uLmfg%[$`CM;Af6BD/[-hG[D'`),Wgn@s-PDb,1sL7`oBF;bbjch<WPflJ]WP&m;n(#hP2VOM,GZgH^K3`#HhY8Fn@8&E\r%Lq"[.^7GgaCD')fB;%s9j_g&U7[euBoHW+cN/TaJU%cN\GF_ToM01qbjBZuqVlBQ%Deaf5_O:)Z]^'IZRuRT3X:C?Q#IA&n+A\BI\r%Sf^UfqT&'5[I%"%KQjMPVR=UZg?TU6s,?s&\*K)d>Vj/(\u@jiEmG$gje"&k>X-.i[9K"Mq$jp5D(AOJTEL(T(=*DkqbQb%F>`Wa\r%\a>Rr(.Y(oPKjKE8sLoZh&Zm+MtbMr$WaE^F/?7Ie:_NV+?iH,Ff$E8lM/>KD4Q]$*P/6I<&[9`lV-P]3+jqni(F*ai4h5O^(fZV\r%f.TT3HmqZcd#L-e^(ep%<u4nRlU#2WlWdbS[WSJ4G6qnjcF2"tpCFb9)+7l/m+LO)p)Bp`TXgLujT"-4NL,5o^g5&<KGO]sLA/Lu\r%muLnL](;s2?+kZ_7GBk]hVq/E!A,-9i[Uhj=EbZhhMl;M`7)iHH8uL^_k)1&^ebp@8<0]L]8Wb0E0LBXX9)bKeOV#.='@h_)Ch6'\r%O.Yhe2>^O`Z!2h'/+ZC65J(C>L;UE`IL2<3VSYKf/a]qJ)'G>P?JFj4Ra54aRF$"0e.-#$WnV@pOucEBC^2`B%"rss2Fl+MdWJ'O\r%HZLqX#7@?MjY^gn@"i<X<NsG:.7D285SI3;YW/l21]\BH)ldG:BhEb31"-9;epBcLlnM5u0h?I&/0s+f5#VX6A<I[m"0%tkV?rEE\r%X=)on:KX&W4<gjRhs)O>%:s@`%DOisDJs(<KRI`VQqbq&^.#N=E&Q'qArB1Tr[&)'?YEGEhIlkOC0[K'"'m!O7@KYdc"0-=ej*"E\r%H7K<^@C<,kjg?+Y.sH@+:pYTu\EeC4n9]MUq?9iU`_Jm)-:`Y?.]1oD,d7SC4M$5p?lZ<p<F>-P8se/(eXN_hgP?Yl25_;g^^Pib\r%D8CE7Ld32?:U4-I-Ts(N5qZA$h?BMU_ET(/dhX"5_4u@&R&\)N[8b@1Y=%e%P)Ok`14P#6M'KW5I4S<Q7rg+,>Yp;&,=O5A766?^\r%:l.YWc/V;YK,3iTb*7+>ORoWl5ZC7A/fuZb]g2fo\gKP@5qI8A$3r1ui$+bI'Y6+YHW\dARk0s;4I<[\(.9;$L:"VJ9H?uR]R6C6\r%4_-fDPfd6Y,EVa,4Mep<R(1=]n04L]V8Op+:817s51[gck60=h1"OGVkHs:$-U)STlXYcl!p-X@f#\Eb,]jK/YYO;HX%'!n$I/"]\r%d>bbi5"fu:2l4>;A1$\EZ(F^g:In(Rn2_lUI6r]&o<nm]CN7/`i-A6rj4\Ooa,RInJ]k+Vis)ps0t6W=1IK1UJD]bAb.=j5C&$1,\r%rkB"Y$rT/]bi6.FA9])B(5L`3POUW?:W>MXUX.r@nbu:0(Er5LoY/s0[1,[j+T9?fLp#C!1OJC3H+5sr*k787"O:5TAHgmE1D%B3\r%iO%oqi.UIu\e\qRP-d$!8_Y<1TcT-l$-6onD?=k5K54G)hUWS%ok.NX=7c!L6%C8&%Y4CTD-%Bs'<'Xq?%8kdC`@nU"+-K9qS%a?\r%"l8"QR*+^n_QI7<0aSleO6n8)Og[EWMYPEg_s+eX)t+(gT(\(;5#eC,VkY4h+3,:unkQX3-Rc5U@/&:URl(1W*mSS90??-Ed-"1J\r%Y`nR4-j]PC/8ONcibY=jEI);?a6L1B#PsTAJRn*nHbgZ(jUs"!RgsJDkP)"obb\V7ETdM\1spn7Os?tI&%sVW8)upq"QIL8FS$CK\r%7W`q,.AF]aP#UbtO5A__qikjn\YH-[#Em!DpVjGB%aF_P+:akg:.SKb$#s>uRhaLG@\sS1\H,pJGI!E-FdDs\>[H/!%M1V?lkVg'\r%((/O8;g2o(I/8oG(kU":@_o.Im_XRgc'5_4E1GLC[o&jnPi%L#%A&KKR+5DbN#nNaB)5C_:_?5<&Qk.TVktMbgM"g2!IHaK+kM%a\r%We&44iI*dBWs/tDi9=I'=f(HI[=V6X">0'P'/?NloP1>5Zl?>d@"7%@YPbi*=0"L'p?DC@b3<jV?+-oiW*Jt]d/#dO=QC3mDSXOh\r%e_':nBDR;Tq=Ki9Wo80ZTfsVsWeTD'!su%&p_>GRUh[+Y-'P><Id&)$oi035JBd"9QQct55+rph:nu8ObB!&n=g<o=81Z=Y.'dAi\r%"CQeRDh%hOMr20H%<HntRtV:>Uq!K=2l:7-W%LaV2o%U7EG0$SW>lqdk[8F*ae'ZU39.T'7c:+tk*7_@TphL4DU=<S`"<"j-`(PM\r%B#<d!p/7&11"u"8qRL5gP7m"bL?M$Q0flO@<2_Kn)eCKX4g<!9V'3r.L$$h<1?2Se>d/\3il]8WQlC#j><eiS&<C9a#8P'X1IjZi\r%h%`nKJ#,I*etM6HOUh:>$JkO%JA:!fmcr`3\SN"I=&JVLNoi[U,0_bBE$aj;jmc)(b9Qc6"pI3Ld)XI=0PYZ.5[)\F'_7oh4QffX\r%G3;>iY5pb]clHm,^(/hUBWCq(>e0V^bj4*Cm:FJqlGg@?8:N^%\bpEM&@,cn(l!mRZN4n.nerirbY3/I\)6F=Eq;)U9&-`^AFT*M\r%@/DJ^^<\H?\(e$/-Ym'FhkC1h]RgH[62gVXn]T0jgQMndSiiZIX3t4`3]X#iNEX#`14"RshicNZ.AJi1QUeCTRh2eicc(@jc<an2\r%qiS!_^$Pn[2sVlUVmanpeihcTeXKuT,PMr2H>l+]@7<4(5M3[k*6Z&'VL!464q"FXbmnr]I>FnC2\I3W$g`kuQ-(f*DDo)=$\o.f\r%!WL'FOfW7j,NeOsW^4,E&H`0&Od!6`Cr?`DLJ7>Z\I3a#AfSRe!?9[B-bf&`")PLG1!M<j1-IV4o&t5TOQjT$GqJZ-R-qf,)0SD(\r%Ggq6Q)InFVG]40'GVGl(fO4uIKIPntBKM$2F9[fuq4SBk#;;I9bKH-Q-q9s>kA>s8%.+'.Z!bW*NDKC/QGM%-^:qOd>`;Bo>bH`0\r%`X0L^?Wi)&!B'1M26#8<&`_A;=rBF<O/UWOo*AY*RrXshjNl/V[i9Y6V@CP3Dl7$0+/")u.Ud6SWcdu6Uup]P#8].mRVlA:dMY/^\r%9fKR#-^qlHeoV"pR"YqiP>+!/L*E,'UW1qoO#mMXZ_"a\8!U&8E,g[t@p0E2@/f61mA[#Dm_DbCmLHCKf;?-!G20GU3kqX!Nac$N\r%&6o:ns/=bpbRd6WlpTS%W&2`%KX$Z?GNOTpq<q`BKQQ<2r9b.rf:>Cp./B#g\;Qu06u^!,`lm%)oVVUcSWs=*jgH?Wa@nkG@)k;F\r%lc2]?[U:HhrJc!G&_q6>p+sJ$Mht+Wr[dgAE:taa:D?\!F:OcOUSHO9iUmW9ffCWBfB@J&^b6e=mf*Eq[HG`>/'s<^g:V9W[<>'$\r%m%a8r'>>'II,oW_#`G6dd]I-C]Jdb2Dh)WVH?VNoZJA;hLRC,&;'nJ=:VQ\(H&&E6:aR5ed>-WH"QN3mr%e*)I?CFGk6TJ=o9?J9\r%El^-MJPcLGqC%M\Uhnq)/a[sBA\5Wk\pa@JM9jOQC"ak!EM<Yh;I*VlP(i[9Tbg1uk]S'sQ+Mqu>O>tU&4%s_S[K]h$X1/ZkR!&u\r%;r+mU.I<X;R7b3I_%!nRke3KtI&H^m^P!IbicBC80X>k4#C`9l&H<Q@frfLh.#bVE[A!=;-FOBB8h%AM[LGC7B61#3/p0NbD*qp@\r%d<g%`XJBPP1n<lo/<Y`,R]pjEc=bj9n'DfXhra'33sOIEm'kBkk7+r)d0n^4rJtTe8eB]>"Zt%-X\b\qQm/=n`S&jtRf-%s_K!VA\r%oHj?]4rS'IIpp!`k+39HB"i'QHQS#\3nS=*S:8[7-Zu?-81c/@0,RbI@kY5Y'q5lXX9g6:ck_o,rFk9C">W_E4JLR"5R"k$Lano/\r%":YgeX4"2fSY[&r%#f*^lm%J1YR?$*/+[5SbXq%T;U?pdJs4VqUt@]\.OSf7]a.V1Op3.N9WN54GJXnU;K,P1N7<m.SOH;2A#,!9\r%=k<=I?\^CnGWo>kq\JF>mKe,aL6^(>Bo5MK:q=79.4Vc-+$(u.[_IoVZjo2i#!YM7SFBD[O!u:P*rGRiQr\I$FW.SW\V#AfpX5'3\r%.tcL#$$8nGhZJR>W`f?-(IbbX\`mr<c,YmD)o9,@=XB9t7Hh`gZGes-XAS'AD"IjqU8PK`'H&\3fM=D6*%j$g.,<"i*:E"bEms:7\r%l!q@#oV[Gdq=cZb'?3+0C?9ls[Mm3[%kb&"",N5sG<8O/IG=UT!NU3f&[7mdSaGJB&F+O4LK!g<G'^_`9G@f,YdPcbq&RGF'=I0Y\r%Y3,Jo1;$'s+6I8,G]0&FHN:]saRMQ9(X7X\JYN&)i5ss),h;l1H_F%(;(&Ao4W')KJ.J[2)[r`ma2oA@h'Wp/*bSurm*CNZ8s%T=\r%)en06UV\h2^XrlfEd9N:.L9KX\JEJicm8P]KaMKP1^QZaKk-lK"&9(E#u)?7WHft6!Y]-H9hQ_7`qNLd"M/Cp:_DGG#lEAbPEYbV\r%fnaV:m5a[&Heck-Se`&iFEdcBGhhD$$lWIO3a*0A+r]h%_\daU"[-t@P_t0Pn*_c[>)m+brV@<rg:Q_QqZFHL%?IdKTfukZlfXm_\r%"ECGo?+>'!)-r!o<<P:2'<rU$<Jbj2%s>iXLMD:;!BH\Q3*p$n^6^t\3+bp\bMkqq*$6T+ZCL[5);PTH#M"P!oL=q?e1Uo"^5F<i\r%);X9-*eu^6O`?$J`@9(ASa5C(\8Q(A/_4T9X9jqL)]n(5<8mcu.Uc:F2)C#KIF?F$m(4nU(&OQB@E3IS2A2/"NY_`N5UE>9Cm/&\\r%DRu1cP*/u[=tCi)c>NPp'U=9CK%+fG.&mjTc8sN)puAXBK/fY\)l0DL:ZaO7TW#@V>UB6s81p6oYVYjji:>#4`1CQirDkBCTd6jt\r%=*L#95$D^M^PT2sh)kZ)POjE';\X8o/>dg.bps-tb_WB7H<ir_TDtY9-Ntsh$/M&l85(Sho55^"eeI,[ME=]_fp[`;AMkme']MF)\r%Kq'`e-K9RkfhtYJWL-f%:,X+,CFU[^Ea"d.Qrk,\>6p,B',0[bS5i"DMH*#(_c$jmeKs'LU`bh5*<"(M4t0D978,9%0D&72]HF>L\r%=J.T'8YJd,D$na2qu"&Oe5M:?GOnr.M#*,[,*5J%+E:YL?:O:,++]d\*9'"shVJ`(5N%[Jg=tk^?G#QBd6XtJ^RNP[Ljd,trso'^\r%[lOe<7(Fl<:Zg=XQWGJ#Wro,:>]6K[%=Y).Snf]%mO[$TR$&#l]NV`S=a-h;>6D3eOulR8:\]+*VcP^Er#D0A!>hu4/Gu3=`bhW)\r%W.a$$@/(T6ZS/#,a_D1U\9^hMWcr%2e4sFd#<qVeR+d8TQ?MK&3+6R"YdAIs*AOtV`@ptTCmP]^OWB<)IS!fE,Oe@225_Hqgi6CF\r%i-f'`G%rP:b=e^%eW5@uIGqR3m-$V1dZ44PNglS\Ck>Wsk44]/ZVps`G$WCP),l%ud]*3t&K]rsJuG<4R[Y=u<?UO=VrhT(h4n2t\r%cV@!*8C5\C$R?)/=!CebqHXr8CFm%ZOIK\N1oB7@6en8;FEml,[a9@NK.??!\>IRS<0&K*FHn=b>6f!A@&b(OmjDm^&-Wt8c"<mp\r%-QK[86MOtm@sk>DF6oBHn;GdV5omn23hlOs/275V2$l.8D\UT:!FEo(eS(bk@m-MUbb05T2hQnp0nZJ6h$bJ_`!kCgUAi@G2aa#*\r%l?!BTE&ETGJ_g1UI2!(5h8/2Cd-^iN:>E\7];[k'REXK\nACSSfXP0Q8(7l0>JU!anC]1r8q#`lU,j1j*&glCmGK+8'Ei\Q`c)In\r%&:!dO05:iN?1-gL[:"Cj`V`h_YZr9BoJa%n0!d1("hN"#P%Id@[[i$KhR<=h/cfb]Ph;\(B=iq#A6n6/]>pQD;J#kE;J"29)D<?!\r%:$)O2a)<(pak4&ej*D>\:Xm*Y+5Y)tAf,SiI?,KKU/@sTXo:pUX$4L.1eL'E]FJ0=m6qfaU1N5\I<@=0B\EF`qYmu&qWpYoE[ir%\r%ULf_4?d;'_@W,I,[MEP-2Xa;amdqE;-<If@kXL>"dH02Y#B-ehi0)8V#1Mf]3qW&9[(RcY-a/>\:Ssn3P'FN'pk=u'c"91^E.4:P\r%X1.OhTOSJ2[\oW\ldQroG#>Z2r=l9@T@9kU&!V@tQ'"LjrS;EZ^!-TSEq[5%0.Epkk6)rdc0lP`F2VG#qqC$c,LL`.E%T6-?rpc,\r%aS/41gHY@5p[(W1eT=O5%<nn6!+:.]+L.6AcKLfaf0HB;;TeDKa,r!Q!c)oIiur'6jU*#%j%uurr0K4HDBMn^,T'R_!/c.e7Q@JM\r%!>NpP-D]TfP6*sgm3qb^)2=rAcVT[fD%3,9i2b[X53e-X6Pdq4Uc!O7$9lj=JWtmb:$j6H#9ou&;cE1j];$8_5':@m4W6LA"eQtf\r%c_?/T2jl(d#6JWI5$Z"lg.Y0Nl4H^9mB`4BH-U+n3(\/J$sWCma%H\>)KHY$f;?Kh@MXT1T,CG5ehb[MjRQI^VH$s%^:sf"/+!Mh\r%)N`@VCcP2UpQn-(2=l9jhnO(XR+=MKO1dUA"k+CRq/J;EMm!fee$;N@::]^!3Xrl%=HT^I9GmGh@(@P`%MM;j*k:#IM[gCi`L3HA\r%M`HQL]9#.G<^3&hr%@?6e!?$03r,#/7g`,L:+f&1&kRk?3&U"t]9"b3P4tEYES_]e#ajDW$Y[YT$<Y"i%C!5[gscsO9D*1ua&juK\r%W)BauF]67g:M-E&Yh7\fO20)\q@V8?9YLmYZ,0K*[qY1W#`):G'Ps]&ASPPsTC7(5g,"fJpVn401rnT=1ab@mBW`'<_63H;q4="b\r%X^9;lXub*o]>BD,J/EGeY@^S0q@[[a&^;JO"*Wis.KEeIT[R^Id."VSCJ-5X_Xn'e<m14b@(EN;hZK8G-!2,%5j;bg7+`1ZXsa"9\r%h]f&=p*K+"[;;%1>W0/WX_"!Oimgm!d\L3YqP4mc0sYLkC8;X2"hf]BZ;#)m[rNRmAWbK:Hu&I2]mZMH\?oUQ2XQ5jXapI4=Ak(E\r%I'b@qN4iJ-MZuG8OCMkW!a]l@7S#+aOn[=.VFdmP;gEbkMPM"uU[P%ebiMXBn"QJ/F/lQ]Ir.d.WuX5CGA/X"E(o]kC,\FnREVhA\r%88A*_fsSc3g)\I0jaaRa7OfjjG$qEFdTX(N/Xp&L#"^D"?:i<R@=_I@>3rsLTt"B.;X:]7!U2hN>/.q!11(XjXdiS("\,dWjl"<e\r%`]j0!^u"r;NYg(6Y?qs%pZ\UlHc`uV$EPR?C;G',.eG-K*r"tRfDpM@0m!\gQ/Te4b^5Vt2"4g#llLt^.dR6Z3je,>0(U*.h.h+E\r%_/-ZY;lDm+W&)urG<tI%J\K`'J9,sES>'KH-dgQ7644RQ*2^@KM[<F5Pt@sm<#X:4rJ1FUkRe2Qg)`RqM7e-^8&r3CG`iC=DTb;C\r%+^D"R_Jg]](O+JORCpfko"oJ,1O1PtntJb9hLM72=6#VFh2Ma[GF^-u-Lqr)Xt94=iJq0/0&2S2p^nZ5"RLl5Ej>9,_dgG[%t(p<\r%&!-/:C3@H=_r0U$_a;19pu0+28A5KA35WSi33c:e9h0GIDm0>]m_8D1Yl30?!f#[[5]:?pqoV$sEd<XpWbNj^Tt^7jP_*Yl=6rK/\r%<XQutn?)D0iVpud(oSO8J1B$0MEOZO.nW2YW!96*%uCdpJsFZ$W37PD6<0YT;G_fYm?gnHR@g]]:p2[oL/O*??V-N7l9=_0,X39#\r%T.u>Vk%^+RQXUu`FGri+QmI0RI\CB(<Pof<qBrdf(tT#X""?tU@p:%R?T8&W:-p&$&#<H`oRZj(8ttVboRU@A-tO>g!FNB-+%R-A\r%bAb!_#=fT;7Fi9g08,O;9f'F;I38SYM`RllRmf2_+P3;S-TpbX:OA7_E>_lZUCs'iMdY">GV&tK=B/`59f"Q$?p$*@%,j0fSFp9n\r%DoZRrA<1al6M@=6W1ZFe==f4+qC^2/DT?65SP1%_lZ^6cZ]RG$<`2Cj`Anq.?EM,hjlP\h-IYB`MQ-_M9[U[rXF_ebd05&j$lt9h\r%eBitn)t""l<hr.IW=I#1a2>QWi?P@is1LPqbUQH\MgQ'7,)`[&XThQQ%2moedH+f1%fbYN!A3c4R4@tHSrsj!o'/MRKnFW=">9iR\r%_SNFXVJm)&Bl%^>K>Kn`/4N#e=?8$[RZ3g%h.cKXH?7/O5<3?$Na9Rh2bl7q=QU5]?R]7^#iu;l@45A.X.lOC3L+`$VqVQu(a3AR\r%AYt<X>i&a#FhQKPVQbQ6G;uZU(2LB!5c?jP7:MP/c!eoZ6?]Tc]"WdJIbh(gXm]Xqs&"_S:j3a5k"oT]R=S=6_33fWEj8q&V:p;#\r%4hN%bWh$LURHHS260l%PPOUcuek.a[^'2i(!PJtL)fT#HY3-tW%Y.UYPO3^goD+[4Y_j>s6-k7h"/+@"LRr_<qSum.&shW&kl@[E\r%rs-aR=U.4"(J1$!D;PB@7#.<^#=(h[da+loI\3P@i/h\NSI/;0PS.O'p^E+0cMrrJ"XN=4#j)sqnUe"F+#m-a2upD7XkoiWA<jSt\r%2[Q$[Ro3<8:>"C7Lq^U!8oubT9c1)8<1!YpN_a'cB_@0rf&dJK`&-c;4iilA=ID^6hR!#[0CSu/<t2Al^F8\n_?dODR!+hH@%'PD\r%G^[F'-MthDCNGg#FYHQ-5B/tRAiNOfQtt3H*6-B;Z.;/NZ.Kb5KRu"I!CLqo3^Rcfk*:TNH%^T%0MrNh^412t'6$OU_!h^;V,)=)\r%W-SGN0&a\m_u`XV+R#-i9R\BjUM/RnO!%D,\c_!N*W.$j9!&@Iab0tU7CAl5CW_=JU08.@9+rWlqe39rYXa["KDZMj+J.Si$5u?C\r%-6*fOMEFA:6*2")KkQ2qA&;YXXa#[kJ.flESqUYCj.WJEXJ,=+3jj-F<3:u-9"WU,*Xe#)G$GW-H7`'2g*fe-MuP+Gpt/7,-Z3.j\r%-r4Gp9!'Lf6kCKo1at=!8Wlf3@b\q^OARO>]ECea9o9C#XGE!TRM6_)/r5X+RM;7@+,7F3&M;@s@Y6\/(s03>pFU]3T</H\Hn!LP\r%MNY,Tq]qZnD!4cYCah1k<EiGg2qHS-fh>UhaB^Y;-6*Sl`VoEg%Kmeu9Q\pHD'!u:0#:q-"E]gr:S6$!IG^\N,B8TNo0*Z3*J;<^\r%M3c^XS3-(_57'>V;=ru/!W4dnr>2Q,4RXZ5q;W<aP0rt_8P5jpZP5;hjHnfj9f^g"pOnm1:"M$B#^S;K/o:J@#TfR\&Wf,oJQcc4\r%2%`ZtR27$W=K-T\1KqXIo1)bY;7aEP3m)CCrQSQ;$GZEN$6:E-%Q)XVn>XoGZPj:Q./D/7CH>(_.S@qS>1QOh<Dg??C/ce73)d/f\r%<bJ#dr0/bt.#k5TTnh6]N\]]+e'1ODme3Tj+:K]-rQ$GCmEpCqr9a6jgFI[^N4Rc%bR"))7,@7@[JgH8aLo:$F7/b[U<3;e$h!^c\r%[m/fm'6L^-H*nj(8>^I=]XD=,%A\%gPU-%Y46LJl8=]:\5Bb?.*oY8tCF/Cdmf`ZrlY`oG^M(76+7I*(b"S1)%rA/uYg]'\5E[@S\r%'W96"4q]Wsd&m.\[a5l<C8/2cfsWhe?7rF,#1SUNr@@4tU%^ufEmOS;M&,gf1h*a:3r#+=f^\Y:re2*OOQo+ue\s>7CZ7mDZ3</&\r%Wia5ga9/4@Rd,@#"#*-ZF%o$_lGZH"k(L,6EF4JA](Asn%ULhP<9YJEPNa7NqC?\&eg,R_UfmrT'7<NL)SBFP)nF:bbd9g-dfhr0\r%@.]TT63^jfe$>(u?4E;<lK<7X'4A[aU`8`F#0mtA`LmZ:0F>=1RE,DBmLiHdZo^n[.YC5j4!)$fr"7CFhu+BcA/6`>KsB%cPJ;cY\r%b%DM'OAiFPVGj3.9^`\Anr.el=[?DT$BY1>\)Nj]([:u_C.;Vg!TX`q3?%P&pSYl'YLFmF7P27pqueBbdZ==f>d(WqMPNhja"@ZP\r%7:X2nj5FAp';cg98O)6VG$89tQNSOpo:tr#jnnqbcY<^#-r&JM:ZY(EAgK=9I8m35`u&?22-`Z&UXQjd6eHECEq9R5joQp:@.<iq\r%5F]o<p+WM1m0XC6a:E95@8_Vh5'rZtqCFZD)YG[Mn%K7o6DM8KltgCd\^5$`0M]_HPWin2HPe7Wp8&;KJ]s\*:A1oRO1[E"fFGLG\r%P:560K5OY(Ib"'C46Ql\9-`]=Q%5Fl@9b0!8ftLZ3MC`B$0-6C]l>"Y>gV\rdM)qkqoMmHLIRPaf\qpViIiO*i?D_jYtoe%Y/Q.h\r%cm\HBj3_^,He;n&HY?B(W,OXQWBE)<49T!7](XLLnkc9KpSJJUaWBSfH4?Y\gW:L;o,T]k4Z'0$gn-5HeK.o=*p3&E/K:r6arY/=\r%H]4a2gW:MVM:..,L[AU_A'VrsIA,'T@@)E>63HA(n@mP^0/R'CkjfWd+1=P\i#9Uq_8Z89'aY)a_)NCH(%@/OmQg#b/b1aNGEce?\r%Q5WPOYD$ZhQC@FVB@[a@hbo[;Z*gE9<I"=N4+BmtqM5%XiVY8bl/-C,pYY,5&Y%RWUJ.9Q/M'Nop:+iGbi`p/\8&sRhk!bA\8&7G\r%q9O$1LioW!Bd[1D'R0(Sii3USL\JAp&C002PQ!iQ"PN])[9DBtJ[7(<TgKSCg&*G0g=^&_WmIL4O72*RQbT@D.=k*JD#T`hoFLil\r%&^B32PPtRqf=!0Ar$"K`U&SR]J*X^FMKLl<VKn?HjgBDEb`GLfqtPgVZO)nkYM\1L<pj[a9MGXH\d[0H;0,NjK)bC]kf2HqB[H]i\r%=RdI>U\Ph*.QJ6NRZ`^$h=U!^h!:r7(%RKQkh_1&Z8.]?(]m&F%qS^1#Dg^k&QSc8F2/(uk^$r;M)m]M])]I]b%f?j+3k,\Y8G]:\r%K]"h,>tJ[.7u-D@b=Xfq5=/=%>Uso<B]cdtUbf$G1Y+3kduP'b@qZ@!n"UD3fmc=PZC6s%W/cm<gf[Y*):d-F]EXUBE#AgV8V[YW\r%6Af>>%I3.rD/!-E\"f]K%$'/XofAend@kbk:Iu?7i/Zl!j)[n"J+Qqb5/Rf,StOIW]Vb:[`TAH!1Hf!<A[4h"qsH[[[f^'78m"sH\r%Z)SJb"ZUqbg30MM!de*<&+&kip,WD65,5m?bhoQfQLXZ!%+n;Afp@%TCLI.PP0*AaML0qmlI32,W?+lf!c0H[(TKEdif32;j@>KY\r%eZm1ZZ(/<arlI;"o`*gB*T,Fr4\psVQMtN^MKn_/\7YN^U&A?\d!dk`_2uisY_Sj_AIe)ld:G:DV'if$`bp_0M;gr*`l_g#;]&NT\r%nJW<_Bok=8_CW$):HrHoh<@*$_f6fqq`k#,q#&D5.G\!5`U7AU3K6r7$M$2oQ=Gt'4H!2\_\W8H]sS0+\:;)N_^nZk`Dqp*f<-SU\r%$_uVWfE^OZI!4/%0)ra(a1^3HX?9L>0*n7Q\0O(k..q/$S2V+CTN-YshJ3_UTG^4OOAJTsH=/4JIkB6p^<od-f"dD$9@l\)>m9$$\r%ZpBCqh$jiqC1uo)-mR3<(SJ:e5.u-/Y(+I&k`-Zr'W5RNdr;JPU:A9fGE<`?&_7b-h*GeC`oRpeF&TXFm7hojq>B5rgM_^&]mMdo\r%*Nif;als4ikudnO6r&N>r5pZor_dlZR_,`0POh'g'7ZjAVq'+K>U^G[QVR.sYA?';?D>dB5P^f"fcobZ8poS>A/_G:Be&985N]D4\r%oMKXShac:]gV2$5LP(;#S\/=&#EfH6_89l?Bh+U<=Y6$4<6j<D$_u=jrP_Y16:5=/IXlWg,A_E([QKcm*X]oSpp8,`f)["U3?)'\\r%9"n$Ij3/=e&@`c\j,'r^(AI@s.(uarDEBeEXPmrDR7,s\YrVD<\*cbm\*?K[0TA@s-Lka@J_$/L?Ob7Y+k@aSs)[9(O-:`3S?/F=\r%.-^H5I;NAf^'4Jm[EC(Fc^Z+_mGDkE"6ba-%+ZS-QlWq>,"V,*(gP3KbRP]JQS54X6GMDg]B8d2WnPi6]b@f:0$IljZG)TidtK/F\r%qWYjn.IA.V]'7(h];ROhgi8p-`"8$"P8uOa'N!69[0b9H\8HH>6*n[-%k[)8)1'.R:&E#K^('"-M_$hBdN2pb8;cSN`Wf8APKUHF\r%+;SG/V0E*&jHiF-L43m/MO\'K%PA`/(J[ggLkZ?'@-CA<h*3Zp>8033G4f+'S50t,nq\N3Ktm992rt2K95I92&ZO_4Q^8+)68dIq\r%JaqQdGLaR1+<?qR>a6W@KZ=qG<j=:hjjh`NITFqWP@T$s-*RZV)00*c!!_cG/HGB)Zl`juq[mJ?_"js.gm?Y<,2)/XeD\U("'SUj\r%f=s.#CB0EOo6q&%*R`TC!G>c]mFRQ[4dZgA-d<tc9fX?*MTH!P%tF3O);(<ha#0maNHJ3:bkofL@2Y-AN+cZ1M/:haHoKR-iXsl(\r%aWld**tn'[n%kT!*SWC<\@.Is/UDFn63%Q=]CjP0R6>8JP@f^dBLmq:3GGo]U%a7GPETU:'?lb(ceP`SctK40S&_EFC/!!3&AS,-\r%TuN`/Hj)1="iOE[i3PFkmho@2+ku:+$1V*?IoMFCB''33-!E!<2s@:0"O;"O7ZY!+Nuh5K-.q_MlCE4Z>5im=Eq],g?+CBYHVd!i\r%)Stlb)PNqe9Ch!nI_oRT"kHj%,T".n^JnhlTd4P\,f6da9.Xr5D"KlM=LQtgn62g>LkWtaYn9WB<%aoai>gpkUSHO9iUmWG6gH9'\r%e4;T-)n0'Y7p<A9NE\$=>3csS]PSZ+D;@O:&KOiXDFqcu5g5nSOqVq$Dq'0o/\+:i/ehP.\=MulAQH;r`G,=B:)%?u=biOr'_`23\r%*`Uuec:<Tk5]@dVB/e,Y=64"7P.A=DG0/3J]>Q[oM)8rJ[C]*:VRf.#`qNMMU0sZ=!o,G&Bt1_'A+g\ef^gYcALdLj#Noi"U%^>1\r%9fTg>O<J]ELUs+:p_0T1B0_Ul1%PguEZWKI()TX4cBRZ7#i-0l!`h`'I:r[?$Z2b]jG1DVW\OthjOf?\a+%lsITAH'r1;0\_2D4C\r%:*B^#-0uH,$hs#D/89;f:80c^eRc7FZ"T*qL2K<:m2[i3RCAH.N+"P)08eQ\_dN0>IS(XT(!)$mA@f5!HF<rPHYM*_2)X^WQ;A$^\r%9T[pS&\L2]F`"+kT3)]!Jb!0HcPhIU'ki't?*<*8_ElY[>T.pire-08pGG4G3+rM[fZ4T?ZdLCN"754AEcOMA#5feQp.0jL+`ne*\r%_fp(#g<2:cPN[&\ejVs=*gLO>M?s)cAEirX8XN?cjr4c,l?bhYIUJXU]MJM:k0afiRp;[,]ZFU,".IUB"b_gND)G#-W?a;q%];!.\r%8g#\/a'Pnnl.sfEK^&+@*Q%\A0V(D%F*Yl83Zc])NmnU\p9l8tl1>RYb<Y*S"abM$U'lq^W9/:o.SS_"C9rQG>[Cp=%Amh)VWp.#\r%;5'-K>BmF>*uQ^iH2-->Yu!%?p*IGBApCT89o+Kg+tps,j2F_QqstA`;F1_7HeDnJH1>Zb)7@NqVV*fF\t%Fb,oWN"TJ&l+P`_W\\r%mN9iNp"gBs1@Vo;&S6-"1?FdA41td5O<t[IP@_'&L,>Tc1s:UY6hn+XW3bPmkYWs6TqNGq9C245X&`7MH[0EdoVb)"Q^8g3dY's&\r%M\-%YRSZPWJgJcAB;R3(3#LqRb.87N6(u/n#_`h9A\4n>IK;%YYuAmS^j)cdh-C2@qMaOYUp^NZ=]*'r#a9a)ANf-5A'gSppeCo'\r%pb1Z^:SRf='r3Q+'p^'.c;MQ(_5DkR:P\fqW5D(9+hgc*em3427(Cj^@is$,7"*Kp_U&'5^*$5aX>^Qc/JY+5/-L8<@Efp^n`:Wa\r%p>E_qA/9=o&H\3R1EF0M/01o#4f8Uc#%$FDhT31l?n'K$$+Q/_\E*`mWgF!]*.%HbVhZU?VA&:W4K7/c1PofkM)eY5Gq'ETYTqg=\r%Sk?@>E=&t.@5C)UQmR-Zbu">>6YG8)V\ePh7oR&.a(BK4@&NcOl1S6o>)?Qn#J+..:=d-k^-r2.WZ?HT%I280NF+t;Zos8==ndGQ\r%X\*NrlK"2DCo4ZtGDKK4Ycs#P"p#Br!>`<RFKD8))b%9L7T6$JH]00@9HTp3d&Fr2cLc\A53'-#W9j]Q..4"1*e.BYnOXnq6S#IK\r%NDJ>NEObNF[ln0_(:&oqcgS7dL$]p8M2jJXiO1,d;f]88a^/;:.DH*mouS,Ei3j87Hnss6D6`WqDtN6?hY<o7"\lSu$('V@l@sE5\r%PJZbh]4[<<Ha8Q:N.jFn^[$=ME@/8T*G4e*hYe]`5;WF-EQ@pO;iCpAo/8si5ODm,f:N5n#J/04(j<#D2%F)U9!.=C9=tU`^F]-^\r%(?j\dEC*`F^Tr`O-#2#GC/VCWK$u,_=R]HSU07p=Ak!PsZ0+hA9i(?CB,DDXGAPu@I/.q(B))K(=.p8!qtj?gk2U1](G\I$J%:M;\r%G)?sf2[JUGU?<_!r&Bo;.qCdNc^[NkP%&;2ADod=P/>edjjiq\Rt7*t'?#&q+L*F`<:>f.csGNn<:ATVA&J%D32*Yl<Hd"2c68aL\r%W3V&$N3(<bRN?9KdM<Jf,-`q_1HIVfVK+5K,<@n`AI!NSVf[*VaptO_TX1C`B9Na<SK0@jqt&!?A263X-V\9oF['$\g&:_(i/!DT\r%Kk!/*h@Vns^u$k^T'6'E)1SK7gUmWF:M/C4XX?;hkDJCVrPU(nXoIMPrg1P"?OlO3OMcugR(jf"pG=u4Iu6Z4(%cuBA.kNQgS1ro\r%73qCpHp:no`$ZH(O_Kg*O3(Sj,]-Z1,*[asY@sjo3b8,eW5bIT$9jBBbK*+_@D(W[[$/ZI#pi#YkTT70W7)XRKVZa:2T/1Q+A4Fh\r%haa<<j>2<I;e`)sS[s@USP_Hin"ck.7(#i>`n+nRKi"_X6McK*qaD+hN?PC*@i6e[l8gdDMG4*oWNK1[Tsu+fC[/JMU]")('dKf_\r%e*p*[W3-N#gt(;DFQ>`=e6j=BX0,AgC'a8A<nF<bl_).UXL_/$>:64Y&9FC=e(13Rfoipa"l=VU\*p*E=/bH7Zun@!_3F8=S,kI$\r%GQ@:$:SNiNlRUV\6,;YtI0XHGa-=!BFq-/sqf0o0:,F*F[3*_g76?_kDa2P1M$jOKReGc'iFoiX':O(XO>T;IE5J,lK2oeqfYqO>\r%9arPE)4NH+Jhq%;T\thj?p12iooZ\S:r!<:UIa0d6FY:XW>$cYoZ:<5.#]OH*co,C6EtZ`GMpSI:FM/Lpf+-hee<5$TMTd9^TC&'\r%WTY>+5o5fkm?E/<^h*0R0\'-uS72+@?"M=mEl`!/r`PgAJ1J7[@,+Tdk5:=15VEJCDVsNsoEgB2Cnes0oXtS=\ArTb$Au2S[,TGi\r%"Bi:4:7`T/hBsQi&%_t33hi(dGVkH;e=Qp[nbS[0^t_BeG'i)d*R9dC*l2XDAR+lfj!l?F>fK-_+!5$7ODs:0pZ%J!-<RV)&VY@r\r%Z8u=D7mpH,Q.6U20BmY_2c"hFOrl;0p=IKIHF%bY1qs?m@\2!LI:24$H\j-B]tnWq)Gbj[@Y\#$aj]PBNHs8A8Hha<(Dli]9\ibo\r%[AV08B7@_Da^"Pg`m^;N5Mfqh<6S9t5E,HEhnp=/gH<]V*]\e:WdOhQ"o7WCqoZh:atoKM,OWX;B*jM)!dDJ2:YF2LHD?BY]_:..\r%otAbH*fJhhE<qopNm@*)Ach0j?0:+jnT1o*c2Cbi*m<G5F[($49\FPf-gITNmsoJn5N!t?*7]31eGUkGlK;p(]i=bM<T)Y`=Lum\\r%$e3kq7N].VqI2@J8o^R0FG-kBo1D?t3^T^4Am1q$P3(aQ:#MnY;P@UA;$1s-rAGGo3^P!R9-q@ih:ArN@GGHE%AlP<a2oCtDc%XO\r%cc1:aT+_BIj8-a=#Pa_hDJUC:nJESVE3nX=?l6Di^*VI8/N)J+VuN+on21C)>[C@Ubp%*ol\gIdAJVe\]*_S;I'l*>d0t(Il3LOR\r%#]80Y1-.b#P;fs>oY99eS:Ne*Z3jAe0!E0''rIuB(?<K9pB24WD\f>'ieQ)3X+6Dn$m=uP[NNO^Jb`XcVb-F0J+!]f=OFt\D$i('\r%\5.LYKtjM3cX0O`q#:,Jr]qFag1Uol%,rffo3Qr^^2RT076o+fr=PakA;uIk3Z7-]C='ep?6@mh-j7*;d$H2*'-$UpSuG&abH\RU\r%9*DZ);OKL,M_5O>WmWZ^EU6!Dn*IIe^)4j@,PXXB%_V@?IPc+nV\$`=q2<CJ)&+AH,`,Wq9O<s^O<iiBC@\)eNlXVBRb7:L\@kLV\r%Z_:>;7`>fF_42NMZV/hFNgR.o/ch\,HhlbQhlKRJmMkgsBQb37,_"$Xb8'k>UP$:)G$/N,R8Pj$3>c42Qr34Jl>'*,qdIZj1rcVb\r%Y#F<3=5'U\K_i)YUq\b.0AL&[s%%nDdNlRMBu6%t\gbgF:-YV-G\?lMlXkIJcLCh#,gY)Hl2"^@U%C1P[F2_P\g]9=R)`1^,X*J8\r%PI?JDi*'[BHFo5kJ?b[tSW[D7#pVW8>/kk1DgNt(;NSn<NXU*Z]/bNBS/^YX^dX6W8OE\\D<`IsZ4)T)r_[B47dqib<Y98R=BP'>\r%=H.rRp,9-C_rl@Vg7J)35Ur>K:O/m\'7a_W(%B^qFBQ8Y6iTea?06A,b>8dhjrB2M;`0sb<^Y\dkk\48A&!ZZGns2N1@BM1?-qD%\r%N2`oH03gE-Zn[sj?nj5)41kA:PI[_@o2EsRLn5Z"1K<+Ue3`hO-"%ZPYqF9H1O%@R4+#"YfL[i-Xs;Gts%m2c0O^44KM[ZN#nXQ\\r%YhM30:=H]h$du#;^kLlhc+dD6Mb++Y<Jt=7g!Llgl2-H!(Fmg@2uK?Qa)k=GFJ\;jr^__ZM\=Qdp%5N(3<FoDGq)MD7d3M)'YGH`\r%D(8f^`Y!SZm37co3ak.]?6=)3U:#$n1#;C4eY(>9h`(X;o_Z-`:[2lF%$kg.iBSb$@YcQX\N2cf&-".^.#tn:F*Vq1#A;:mX15g"\r%em;:M\Zh8J,o_E8_t,n^<B/21g[I?;W6L!=$6R"e_B)"'$Lm%.YYl*EIY3+?S:`!O*%96LdrG&ohA4O5Yi)H#pc;r0`2W%^F62Dn\r%0X#\Q\!J[bWuL4_:AjK]jmp=&C=]CY)O#Ik]$nf3Y&g3.k&ROKe!9dLdLCMEDgcALI`:#<J@7t/2^?5/#p'Zk4,Squ3P)3`bL)s(\r%4@I,J_WB;nD@"rn?mMnp57t;ui)#SN4,U)#b`:\G*N<4c'^3)Hj2iH+$Hfi4\!#U^^W]$am3o,=5U1QRUZu&^\C"SA_dRDe=M%!*\r%SG3qGh]?R55bjc5G)+#9.aY+@&>LMoW^*>J5j1ojc#^/XgK2D-.aTTO"F5CG<ImUsJY6#IBprEp'Bo!*<<^66e^n&?CB@eM:YnY,\r%%UGUU<ImX0VpZ=,L*TBH>%6<p*&If:p_-oWXfDNrW?omujY4+'nd8dgN17L,eC+:-=IJeX'm_gCP@R63a[h3gL>S2K]%ZWs0uGJL\r%3?Zq9lA3Wn\0ZZ;(g[bu)1+QB+PV#Y-*<!RF?:Z(1+l?'G[,Lt/&m6e5r+WlXS$AjEFp9/3L(kicuVCt"JuV.)mm=m5o\3j9s:tH\r%:m*H\Q9/6\)TEIlrVH'cQZlL=W-<RTZG-Q4If8)de%ml2Z:fa`6qi4NA_WSAY#"1W%;AMRHOagZ0cNl=de=,lH)6Op:3f`V47K><\r%Ydu4$"t]nqpRXHEThkGerTP%k,X7&RPte>Pm6^B!R\gBQeUIn=5/H_C!4"7d(Fl?Fr8@,aoR9X5,)^J&"6D/EcYl<KV^JA%UiFbt\r%/JH/b,)pYhjl3e[gG`DKbt-lHK#QTSVDJdb0>##-!,1DL#f^9J*2o+g1HJ.,X0cgGpBF-_P-BWBk$MFmc:'&</![_]3+_'!Y(`\B\r%8]/CGhA=;eC03IRS%>LY<%aQC??CJFCr9HOW0L[]ZJXf!7OtcSgl>M8\fBdS6tQ['"HFB%i\DMI/f`ko?=CUgLRB/>O)\9Up#m!u\r%SH7fMPRogr-Z"](811Z+_mq+SUpb*jIGdU]Sn:QeWU>O&!!@@+f/1FJ$m)Q.-c!DV`U0UN%n9@_O40&+[2MrlK5QdD.Se<,St%9j\r%gOY\S_=op*D4ffq,;J^\!FhGE<P4,dF294dUCUhl\`iQ>`^#K3a&&jrl7l]X8D,_nma&-+Lhaujpe!Dn#5si<`]O4%TJ&fhh$0i!\r%G6U=9,lAPPh&-br,3$o[dWK2Q)+Mq$gpBkelJ.-^fR>9=D'9kMbG-_%'8:8%R&@2_Hq^_5g&")-2&/2d;6`T>&IE$9buZ;,h^#MA\r%cP89#NF$\\V_VKQ@/ja=NoKm<No5/d6fG6e4HQ4d<K@r:A%`?p<<e(T$p!f*!FdXTpcWGpLFUrngT8kk7EQYKS%4l/FBBF!ISQPt\r%A%r7<&ZKC@,?tod<EMh*<(A;qK8E2]s(dL68/$;VCaeO9)i8Z_H2?/G55hISOnF0Xhd.j;__30lZ/+#n[.Y!lA>@]h\'p#b\#l8>\r%fA9r]WBpiD*I)Ge$/a7@p<Mb7eTXmmQDjLpb)J,S8P\EUGCj%o:6O'>>(-9rjiV0^`sM1$:6Lh#/m;hTnG;.+s+G,EDTdN]T%pi>\r%HZ5h?2C=>U'<lCMq+lf?PKQ8lM19OUYB?_aje2X,fYk_rof;%s+Z;'c*;#j7kpCABdViXd^BW3ScqQAP@GSH`2C?GU?.VsLS`uN1\r%E*ThF-]ORg)to&LgS)rg#dnd>i7jgSJnn)rj9aVVKV&2@r$i.&HOO\qfD&:*UNbbp$U1>]H+3C_"#^F/H>o3)AQp=ZQ+J@InDLKm\r%>h#28)630&p"`rNb7'hf,8Ifh'PZT6-$BN"fr_VK<gbqAr-5<$3pacR53gKe2*o8c[ph#h\*e-Amef,WCu+gK7ddTjWaSK9nL7\.\r%#W=5"26P?47'L)k`Ao"L0/>L_``P6Uo0efJr@\@ohVmW'+h@2akqkUdi8EB7I?a#^nk\JIdqeml-.qD4X4PF7.)?qYoqrr":4_i#\r%ME_8!GDa:NR1G-g6Hp48L0%naKUNX"$Kt1:oqrp,_7@3nrY20a.AVE@Z'T8L-\?;amM)eDQ.1N-[]uLfBo;<mJ1U>5Y/n+O@/Rn)\r%>eL7E@7REKd25fmO/.%\dr&?TGW6IsWLU(;%lXjajl$j18Oc]i4_bl;#Mf`/fn?=[*S`j'rp-icQh=Io_UI\939PNG71J8g&'&fX\r%=NmQub/6N>1q0%J)q#)Z[2md*I7^GI]fh%$mSLS[3Vc8#SoEVu(qDBpU3]hf)5JL3_:lP(pT.NHFr/(.%Y6Hk.:%W_+Jq5R^J+cA\r%6a6"=cjdY?G+:nfF>:f7qWu%FCo<mtnCG;g];]3$C<(I+K$J10@sk?EeLjh4^BCB#"o,L8;*T2V?>'4VMlESg$bHo9b8sK*g.4tq\r%j0VPkg`#bt!0*OQX?1j,aB24dE#_p7OLLfXi&LACOL1TEeUnd#KCi%HX=*^dV\?A-&91tB^@P2lf<T_D5+&em1^2K1Oi=K""AD-o\r%Lp6h@,EO';3-C+&30`T$m8'9NAk;/68?o0iq\`;*9K]\VI-Z0;Ie\Bd.2&F]?L8.Mlm;`7`-iM$1)#!lfE:T#V$Pr=@J9E#0b<Fl\r%Q,2JX_.4aZ^+Rq[TB5V^Fd(23ZQ:A*NY\7pDhg`IcVe)KVO%G/=Vu.Bpa^Z95^I=u9B,r%mGZSa%#[W$MBpGGNaN<$hIg\Pg_i[B\r%qBpRDTpaJ^`uP2Bk439(1kH<F/h[IYTVYK%Fp]]@56%jEB'dkI$MlYCrE,#Y$q!?be;=t_r74(1Cte@LHT"A!01oLY$UE=QgM(%B\r%4f)fChbmW`cu?E`1)@g>F+-Z1+.&D)Q$\H=5LsINCj^OGb[)thB,'m?lb5C'UOdY^7tOPj9#R@Z/E4M&:aRoXmdl?p#4^-#<2He:\r%jMkJ54B\\7];TZ[3A::MFDFQY=N#k8hpN[5ctU#nZm<>ZWr@:K?=6U+>$($e8p%3e+C,SM.s(iF080+*X<1<q6ndGO]3'WsV_g*?\r%nuUbmb$Cn,jo"pl<j5/.#dK0-j`Sid6L:C4GK_LK#Y>OAqco)%;;"Nqdd^(6q17(,-o@*lMCT7+N89&_kf=dgT7"14olLN"IHU$n\r%=CAtArC/+EmNBu)E?Fue^>YDsh>X&*'L$kq5P&Z6@'L]D5'F0fJH`Xmgeq4l4f>g6;eQ\_0-@;"CS*7X<05\Do6XSbQs#d&KN`"V\r%.LZ+IbH!a0gp,bmQ=#1J=L0BocDu+tXj4Z:b5N2][MG=/(7_F[QEA,K87lXW_9#[u%_^E=_0rmtX)+^#)pReFBY9cdD(?$H7Mr'F\r%;mX?>Ag6F>]oO4$`f2ZS`_'ir+Ym(*nJbY8C-=>C@oW6$<g#MNS&0+?5(iFTA=YAm2EHCO/:H[h[Neer_^a.0Rr$]:*`3B[8QD>(\r%CF/.k_>D-3dj(ll&RgI5U`QcKq5`\ik\UYb79QLNYBDlg$l+(AB,TUkIDMej:C"Ra$JNmH.=#54al7FJ]ntSd7%<!Hk`*WJ(*]&=\r%TJr4h4FT(niSaCJ,^qP1hOoHXMr2aR2j[U]DqBpqoA4H)rW;^Gl?QKE<,;##7)aGIDgT>UmP\u_O/TLVKkGj?4lY-M'jW0_9fb8F\r%887<#)e_G0AjaPjf*:!11SlTO$d-?r-kBJLo\YXAV@GgoTt^oP6cHV)&1\U6<1Q*=45!D[#C?f-8I%E!0jqm/oeV6r1r_\X_5MD'\r%m7PQq&o(UH_YjWaB;B55%UBf7U\J!:i(RH[,-OJ[etd<7Tu'lh3k>ucZm=\@'\Ga\nj?D/0%f8cD+N,;(^!eb3GP/V1V5$4*Z'd-\r%^69"?Hmb8e%;E==GA/q1NW5BTf$KpB`Cs^`J\_OU+aPb1"+p^CeJPOJY<08j/Ha:f_e7<b]gqj6kmfU(Q\mb2>c*BAM%7K2j"On<\r%gIgIY@3"3+h*>q90M(S#VG%u+dA(R9bPTS*p!13h/cRu89MAM?_s\YZFL$8RCkl3bi%BH[FQ3GKg#[#pH;f<mc:UD::g;3D_gqOf\r%pl5QN#"!J!$j?keO+[Tl8&5p;&UY)c3MWA'9B#OPR-?Y91WTl7(0<-5drqTZ41kg!8_Y8h@uZ():,Qro#7B0[S$[f+1^j@QdZ2:U\r%]<kl0=W2g%cg^FCU$*:S>U-W2UX79VT<\r+QBdQ[dq#$APeJ<:>sl,$-A?@D/<5t454F?M0Y2ab&,bL"5BFkS5H+C'o]I4fj-(g[\r%%2O[[At?OiMZ&2r2Q)L/A8WdG\3$J<%j;<"gmuhZ#*=O]m`m6S@l\P0gmq=/#=s5t]=WZcQ9%=uB7P9r?_^h2cCq_VPdEF/J;/_n\r%(:)ZkkqX<:p-Lp-&M@4=ci%!7l2ZII\[Pf^rRpgt")4U;crUuP<?Kh5p2T:#6l8:HkVDLkd"-r>-QTZ:SBPUR^@^H8oK(?F!sE&%\r%-'1i5Q2P1+HjgEN1)FQNZ7I(p?+8IHr#ipJ#ER]3?!6:M-G#^A>OW-M[WRKfo9!\kR[S,VI:#NgT^D"[T/U6"OHYf0kiicK5Z?,`\r%Z<B5EEj:)gZu*06/m$B\?=mIOAWi%.8irVmBWUY%S<Te<UO&c-9U=':c=c@IaXI_G._cCAEjbd^HI2L*<drFloAb-Ge3-<Wb$:T$\r%Fu?p;\\iNqmZ(869-=g:ma1n,!^<-kQNMFk==us>;'3M2E$$Z4kGGVM/<f9_*#Irp#hhk:f0UHYCD"naJD-+<$<6%4rUMQ4_nk2`\r%e='iaa'^ZueIRGc*S(ZHT/YkR81T$iltpfh*Qh\@$kcr$RDQXSi&FHT@$5:Dlc0BjYlR##,kA,BMqWd:rVYE]"_DnBbl*cK$U.?.\r%P8\A/,C/8Q8#Xi4l13OGTgnJu+:D[('\_Bd(:u6iqBFg>q!]<fVh:J:aEa]7i96nO1`bA!pE^_f7ao2%_*QIXJ:is-U72XqZ_48+\r%D=[7[5<lds['TJ*\F=]f2/-2Kp8Nqp7uat%&foWiZVsQZFGMF4el<Y%@S<uoh4UD@S7iW^XK5E;Iq4h+!JfDOmJ2h\oa^gKp;d0f\r%(t]pWoAF5+@9@maTH_IV[)0S!$kV&RLZq+*P^,tVA)(r,Rbh2el@Rn+)>qoQmcpcpkel90Vq^F@=K^)gNsCD)SiF<?:mmoFNcOoH\r%W*0//6r03Agg?HsNom.Y?^rK=E/)cpq@dKYH[V>44',bP?#270P6EYQJ]5-Z6Q\.kn/1W&P@-N+32X6q^u8m55N;at*tr>ccIS*-\r%Qq.0:SHtL43C!K;d>+UDe.4_WT?X&rA/h8J&HLCZYtI)<#E=uXa@<pi.5F)r^B*__7IWc;;XJM#''m:+o4V_uUX58a$`O&1mo[r9\r%*)Z*J0!G6d<Ocl/m#9KZL:_Y$herQfFI\7=Rd\EGoWJmh+5tJ;\$pa<r`,bO?W,N"q089AZIrcuCuG*\fPE<J2B']KCpmAsXr%Lq\r%@pm$7FE=D+GW=n^&p%\[>U&i:Ah(tn'3jqnCMd_%-Y!68?<XVtlV!lbH[^=%#U_Qr.nmN,0Dgcpk_'0lM@4+Gs,BAZ0ar&G&cK(u\r%ZeYbD<GK"0HE@96%nn;<02f-q(^uVU/I<sD'c[7r<$pd6F=m#DkXCk@G?.Ac_.-82%$eag.&nnqTp!ufW7!`B<,P0=/A?eCi!O]j\r%US-L,7mE$id$aitTk6OL*%)YuI:*m.cgaYmg"$0,R?%s:BDH3tgc9kS48OJM5D9V%fr`U$3V#%Ce]\W?6R'[7j!Uc4Ru2o'<m=YM\r%YPZsEoM+Q4N#e4frII0u#,'BBHL#"sfhle[#G$8>#BhdGX\J:na_Jrf<1r>^#%7*rXN"7a&&gDX;;XO,h&itehJUs:_"K7$HUC$+\r%J']Hfei>XMc&:EpFriX?Nm\B6d7<<JAXN"i4ta@M,MC#M]u=b'bhY*^XI./P6\8!pd9B+ZSP#fZd!MdK2nP?Ue@]jUMCE.ncmrEI\r%N3-$5Ni7+`<R"O)RRbpTScu["Aa<;V#>IBV<1-K!ELkNbV6i*]k<N8%a@*D@[H3u\*8?H4Hj@T-.o+-tk"8N5CMBqdTA84gH11!2\r%Y#mZ$P^C*9ip^e]Vi*a3<5095qgcPVnk4?q9@T8>.ZN<#e-.;2=#B$D04a5D@W)Dh%#^TCqV["tK9[7VKR?$RnA-<_>p%G;k/atA\r%W!GTFICX]1g[<J?a0B<:3D7!T^"!=Kj7E."RW&=0<O?*4M.k/d6T"gr[e(j>"RK;BKr48$+\Y`Ac@(=imaY/@B(R@mm;=b2^`X>V\r%9<]q4!Wd!Tk<6bTfC'=CKbNW<+I?8<lP<7iW1#0Cl,M,qOKUgo,TI;!*((?+$dI.Q-65clP?;LVWl&?XWkRfXM5'=ac4SaiaU9J_\r%=+0fL'jH2SZFFk*!6H]JHakQA^Oi'#6(P0>98:p*n]\bsF\01-dcFkWSN,$WSR*q0>NimIT#T$$gX8]]69'soj^-V&mbK_f6*rgj\r%?=,UGV<k-A3Ou-JE:3#Pe2P2!CZUn`HkZJ:^/6P;Ap9pWF#"Ip1fj@W60"i.6>IlZC&]&'1r.l#EhT11=+Mpe3!Meg"&@&p(WZ#Y\r%5$C6H$b$eP?nbbm%1\n"\$,17/#!b`?Cc%hp`D_97C+XN+o%iTXT4b<`Z#E6dF9sfR#b;+n!K,;<cOj7XD#-B0q23#+#!J2<[1nr\r%\hSFk=/mT[Q#tY=BLS\<TlJ)0"u@Lf[d$d7V')==.Ru2rMb\395ko;.C0Odd?d)XISLHK6J`F)i%qn-%9/ldo'^,*iAYY_Lh4.tc\r%-*uC>$-4\WY7Y<ZXi"1b>b:oT.ph0,LYjQ)S3s+FWMH':oUDq;[>8lpoY*n3'7<)i2_h28]"bI_Xt'5?Ho-=42C7&11rB!bd:sqj\r%GN5/F9E8R?R^npdRYngHpr-G3SL"("1iZO85)G`UG7M..W^Pa\Ch^pH<AIm`BqTL8G\ee,*,^15"eC^LEY9$%W3e3efg&0b?KQI$\r%2^usY6UWiO1-,EL\32Y7>P"c!&jKe##CEJ@5rs6:!!H+:S^_nZhoBDdr]pWSgfB'*YLlqbdW&5l1lJW*'6aLP_>nB^6Q+M\Mpi@%\r%Zq[sAOZ"?&"?j<[[Da;l^9*-MLCg)c,H>R\Ta+G@bJX$Y$gqhsY(%LtgM.S=-???HP"+?m+2\F@N%W$H(4^rB)>]-EkI8g^BSue/\r%GqCp1C2B_1go,(j6$BB,NAZu,..(k/Q\!e.Wt%().3/a[2I0X5,jIU:7kT]%MdbQKN+tTcB/;*oE4=cP&M9oZPf"t.PM/AR*%7UV\r%.HRc@R\Z8@f^2nH1CBru.(aT.EY4S4Jgrt)eFc>HV3$PU_2dS2Lg6+b=?<jBKsVa!,q-l'/)[9=1*rGXeHNMA!_I4Eo6Wt?>CbP:\r%8-Kg.?R`!&d>H`Z4ccSoalbs6p!hU,KA#Rl0i&"MVL>5;_j""!#k-MXZ)WSMZ@+#nDt=/cc0)PhHr5N7p%]B\<rFLaa"+=m=[gk7\r%rW9^kfrN0;bM`Bf'EF:O3./mMM`E8>'@86I);Nn-KNmA')&tkb_[a?+)>JjLUNdO=;&M/A@]1H87>9Gk95D:bN*obiJa1hGM;gsU\r%I=@A`Wc7V'4'k:L/aWeo+\W,>Z*$8_i1@[.\24A]2T9#\$4>%D:+>*nFKkBAn>Y#\=W%,"a$0.1fJJ(TKtf;>LE[c:/1'fi@H[Pp\r%02r:+;eR),,a?lNp$F^DXA_aLS1KJ8e@;;C>L0,lS;$b*#'ci[5]0Og6]OJ]@as(*qL4g+htqOT\>4&&/-7=l<'rTLXsfaZLYZ&c\r%]4aO6-j.#SBkm@GW3b19Pp<..I=iui%dufPG?6@-ptQcV2o*,pi0u5!nhsG1#0ehs=LBR(%FiMBB5Y5S:RGo14ghC8.+;s*jn]9H\r%(Pc]M9Hlc0Ot)I`QEEtXl-![b4*-0fh.@E8_-r,;==1OYP8[+IqjQ$]J'j*iM[mk=?c":ikC73brGpN3&reW_?C#>$QKYH@goR8E\r%T%ZA`N-e^5h*6AT#-@%f;7!qPqd+,jQqMi=__NI&r(LW%#PoPIek374CJk_MBcceM2MBQ2e?2biU2Ugbk^'-?"#7;]*.09e5Rb6+\r%A3e@g]fc=T?Cm3+4LKd:QNtAb'tl`_:U!fs_<-)D"2p"0BX9MFeR%a4[u^;p-AZn#a:c*!6^.,L2O(O\$H]rYJ,\G6Se?AG0+W!b\r%5'E<EF%D&Y\KYQoWVQIrF$>W7reT"=$`40SP`1?^akI5K%M'+0"Z465gdZQ-^:RF2WHlg3FM(2*8hH/!=0[sFdcFi%jhfrW1stJn\r%.imB_&`q&3:WIq&I<Y</It"7-CG:96K+_^[(O(HDrl+-S_D;GKqPL`ob3#^*!AE;/[lCkUXu'R19>&$jRh^5pi[MbL-0Sp$TjoIa\r%C/=M`5rEYAk4i9G+FtDA:8,gVG^hQr0@67l@Z0WKf);0.HF9J+"n2[E_2!b,E`otm8(-?d80Sn&e`8**p;80gjA.r.jT7Vr)s->j\r%V\lqVOrT*Npu*0@I]qm2Bucp1G66[j;7Y^`Bd+G1[@7VEpU)<<%,g\;LQ+]4KI\@(YS#u$HN4p8V_5.df]\j.hGIb:_#RB#D>=%<\r%4lrDhPVs:[R)3-d'4lUkoj.Qj"+l3PIn8_mT8+]QRV7b4m[+lE"=*UGo"4ZM@<ng@[6M&(+AMFE+mcS_FRZ9`V#@,l8+VC>%WXWT\r%-pg_e0lBL_$#ql76em]J7k/4jB9.tJI9<9F7?Ca@!%_$,9!/8J1b:DWKJ]Tfqq>fMj.M"[<QNkFa.3X"/*L+MnkebOFF=j[q4-I;\r%Kt,feBS2X:<Vo3"qCK;YY')3N1gRHe"mnl6`h=Z\]dSRD+41UnW9A\[r<4Q>QpK10qSDlUGOLT&]K_nan0n>oRq<*`-)hq-!7BEc\r%dKTV]g8J.".(_>&,4Qo^CXTmS+Ib(\QIp,8OAi64-L9%_W;\R%4Sd[)g;iV2eB'PU.7g^^Q8TjAGXRhWJOB<p?0'`B]R^s7K0,3T\r%4eL8>nC5mZnN)LZdE;_)Vb@=[1KD#K^H'h'MhKn-'/A)S!?""J'/A)S!?'5RmDpTg[KOi!+^`G]bdBmG8@2D9N4D^&4RW*jj?/o'\r%[r^q>iaZ.2VIBc^.U.n15LK47UTEo7nYOfa,\Z+-Zlc7Qd+IJ*F=m(W,Bg,f&ue#oc91\38^JEV!'H8:o]&[.plD"Mr*e*ArSD!f\r%r[i'[0G/V!QN/o_+BA7:]aF=[IIA\]anrU\ECZlg?")0V;'`p'qP%G/rjV+fPR_qCrK%>YAS[]h\'iTJ1>LZGjf^"HXru5[`*Do`\r%P^oE'h<15n0]SVb=&B$jo13-:f?oasSsiTm/G5'[CS'6o!gc=+2,B2hA$lZUY'K\S`M..>)CQ;)2)MJ$$u;`.b!`>)#=.6SSWXb(\r%"uhguh03cnPm2l,Rk]"JK4oo>d7?1HbPn"kdb;%6")ecgl!l;QhCYBP,I[*)_ucn5al_-Q<UqcU>2Df")CCZG$i]i,hAgIK%9?g<\r%()4P1@2"NR[n92/6G`'J#ppA*f$I4;;iq`lRC]E#ee5J>PQ"u9cAMYi"I&g0HT+T8+4%6e,5?8uKE>@S+C$?STtnrA"AL<65]V/E\r%-ibXj9SX+DPF]I-LVtBPjt[/1>E]oBLfIjW+e]YMf&Z<<"M$DhS8b)DQkd[5=?V7gi4.Q$AO;p#!!%CFJZmiF!76@%^;9U.X7VEX\r%s.nJHk/Tu/bl@a&keO`_^_,*!!*ToB<N>Ft]!,3b!s%I"i(6d3`SGONFoVM3F?'0>aT)="kh$o##6OtED@S#r!&1.2<dfu2!,sOk\r%4.,I,oFSjLgG'6*hPM.=PtpqqYC&P3[Ed[:c5*8*_Eflb?2-OM7]L[9D_g;B3f!;pPfMa27rY&Unt>8h$KlsRs,03`7ipiM-r8C*\r%K+Q<A;;U3m2BVD7DVnil[Z0n.h<(^+'pU/#o?NrZZ:$Tk3)=O_,0GPkdOC\6?8J`:G^Uhonqp.J"P&WJN2bT&dO+/PIBd&#)`9XB\r%?tB)dC7(M->;(h],hb/=6?=)GNV05a%)Q0u_"*/X1,-!iHRH!%6U^*/P=?Fe:pgBX!WT7(1a>I-Ao'5/iTVGSq.)r4Cn.D:PVItW\r%T4LZ;n2$]@=PUF!ZLZ#lc'$J7cZ$%D,:ol_ZR%-'Z^U2=$M'-\JhH58Vuqjn_p_JX3]R">U8uH5:^t;g]+n?JJ=(B<+F8MF^=,=M\r%RW<e=M@5B8)Y6g7.3=6rN:2?o"!M,k.,GoAq:4oY@GVOC\HXqc*a)3a'6cNW5-gB\K3DuJ1:U)5qp6du>$fVU!ZK?&BlE2Abmt?#\r%M'55fDkGE^0FrIPdZ%Ztf`UTe&#<OYF%cTO8obp0kTU0RE_2PtXDc-n/h:i2[=SFK6j)ZJRu#o6XZ<ughKdaAajKc9PM""OSdk6a\r%eb=*9JK#k_COe^=hK!jlmd_][V=$)eGYLIFHik5$phh@$51&jA1*09JA1kUD]^j+Tn+>K6=YO%J^p.TB@Q4Er_isp@*:]bLdjGHs\r%jjQou\#h#qNJU6DA=T-_@n=#o,jO.n4,S&N(Y)LFs0m<toaAhjIj!*bjUR6%EDn%<``6bs6GB^T&tZh4+l>9=gZ<Q;j;UU:]=_f<\r%X7_tjq8RUtHJ]\Oq3Ig23Z.FI>?0(Y3#hE?j7oF?goF+cCG4cG<IslNL4$`c7):\uaj,WgF1\3Z+l=@jJg'%('2am"aPB@<+l@d'\r%HNWGfW:/T9*V0.;CWX,<ODc-/NI@t"%/K&a/Y*@H`^M3ILN,*1>>Pek)Y,KM;04MQ)b5:n%Z-r(h[8OoLI/^p`&B(f*=_haF?fP+\r%a?mVWY,joCj;SUTbTpqYI,CT$h(4-N0(hHr2D5O8Y5M>a?tA*M(\3Q^SK*ZJ,96Hl`bZaHQ3[Q?_=N,-j7r&V[eNLGGVKsV6JjFL\r%fH#'L9OV&A`%'ZM,5&B@bEQE)9+CdVo0!T8)mglfHbu=l1Hq\`Ur'NZ$]Xb(Pjp>$]<"c5\4r4GRVQT64\bBS0lH_!eM%eHi>.7p\r%Ep-8QmH>665MmqC0,=$RR2pD$U0qL2XU<@;#ug%_%GM3"4N,V&hil7TEg=<S7PZ]?VhXTs>0*F"2/J':(pRtii:?gQ:uDPl2]$i*\r%>[Gk7FD=V`hA<KRFDAL21;t8rDE>133m<EomA<hJV;'C&g$Y^FWV"WT(aId0Vq+KGCF.YO3jm#MGs`21VGlfWF*VVHdm69!esB,!\r%oB/'i9rB>-'HF$-Fjm<iK"ERph/582fd'`O_u62e_/;<A'1VR1iGL\67Z-Y)-J(tiVA+YG-*l?Kk4E/li2WN<%P&]ZG13G`d`L>-\r%8T`FLE1=>a9h3QI?Dj:<.C],:+dIh1VE057>)fr1*o3VN'R"feoF[_KDS"N\WX*+0VKe9&)CO<7Vq+N(o((;a21f9*^Dm18JBBEc\r%e#=cL3H^+^DRp8?,TiJj&>g/TDs1ABoB;555Y/tp+'l;r3rC=Ve8n^na?"Fil`S["`[Si/cI-gJ]r9m*2fokb&@rn)JJ^5?m!Ve=\r%9#W._be*$%NVuRdp@HbhD9XjSPfiF04-TCbVL<H`Iu`T<$#*b.-s[j)]&rRtZpa+m&p.s=kjgcNe;.r[L#+c9W3P!#.:`M3c^Dno\r%G)=2&ThIT<93'H=RqTG+q3B^KC_*gO\t;X)F1jU1Q()K*e=3R]UJC)(Ugi`4k)1*8GI2&Nkjf)CNou#B!O%b)Ei,r@O.3s])Ui&<\r%^Cd&J7.GUTcW5:[FW.SW\V#ABp647Y@:^#I3<;hiqcs2F.9(SJMdhBX1LEg)PP]"RMp:eRVUN`;a*.";:T^/Q^7SiO<H_k@,o;1#\r%'/u7LAj2=c3",CQZBa0g4&*55g\QaNP>!?dm,6+2;K21p1)>_I8n<c\;P)i!!D/H:iCpPjbb!fN7tAQPB9JZY,SRe*`D!T7(UUoh\r%2jJ!n&eqj"FCTG2^[7Tj_mu<dm\?#ZL2'5AO=#S`fu7$>`0J60pcU[_K-sM>[9jA3$H*?lE=+S<DSljr[h=E!,KIW9"2"L1f4"D\\r%LY[G#G(2f5*A#R"^Uh<8p,q[(R;.'$7hFnBfO@K,G&OT$;._JB:U\C7:8%nRmU.KCr(0Lsp7Z%-?sb=7S*T9G,Yk&JrPe-X?2+['\r%-kOFkdFHu!beAY+$N%Loi5%7JgPcj+SFZ6!ZSb@uEN>HB-E)haDX+U!4&SPSmcc`b:=BggXVBDSHe_C9'4RWDe0*msBK9Qm<28P[\r%?56p%JY#0B_,5Ib>4/P]7Hf+VKR^rXV<%]lBFo4fBfWh`W=s=UBfXbtGfN=0Yiq8!_Ds0Y"Qt.A@ST\AA_mC,hKeiAY=)Ui'C[/A\r%5nK+lHLG.D@=8:n'X?9YIqMQ'R"U^G3VVD%ro;<C;^\n`YPkOnqm.p)k$kaHN_l%"r9!8uZT`p^*(!WX*L^JNNo>=$nC\)n]-5.p\r%aq+DIXu1mi*5Z%n`+62Jlq6&LQ&"4p`;oo,NupNI"b5S_e<%Fh.Vo+`hLnkQ"5c)oH60&S#Od(@4V-*h>h/H6^LRqZnrsG!GscD;\r%jj5o!S05@,"\6$*s6'4]g4oK'3#4%D:V6$j+ZrbDEh[Qt1G>Zcj@%-WkN/4>n0tMhH5EgPji#Qt:j^];3L+qYmMC5,mSNLq`a<fg\r%#AB]&aig[<c'KMIEH6q:*`'G=MN\_9r8?ZfLQ_a7>57TLin4M2J__0%]dC5u/YHd1nMV4':TF*Pf[PPYOg9Id'&4L>_:X#cce],6\r%S)!B.TnFaJHYrX#Mgs3\s/'<+Vphp>^]*JD-,gJ9S`^YlI:qjMWYjZL`XWVCk=7]!fjhtihgBpHGWp-7p%8jJ*/!%JnPk&#1'Yd(\r%1CrLV%W9AsHM^+>E2p=5SW+<@VV`\A0>9^q1ZjI+\-+F/MQti>e.:[8%!V<L<PTZ#."6n@BdkDk'6%e(`H<XVC'NL(l`.=Q*ZCol\r%2?!IeZn%gao8l$L!iXKXS]RQKqP)-fs,>tl7/,]AbGTn*5>BY'II-6@\A`Tskh9f][i&NnG"]W^ab<XZ]Me1%mH%7cs!p"9o;tdW\r%[VZf1Bi<m)HXIW>Bi9N;6IRL.[O:rR3_elICf7+<7Sj1]Wp\oR%"s(;#:3TX">j%4H7;[<-*5S%nW"NkAuYdeaW=P#6L#`5^o?9#\r%d-1ZlmfW:f>]bRiPO_P`b2h9h&.'B4Ng:lk?+Mii]qR0qfA`i_Ef9.I,5L051+tUeb$9<eo!+EWWhK?6lhHq[k-$T)rNZsUTNaXB\r%9j7T24ceJ.8;ZdN+1#Vo+n:ful]tTK^TD[/_g>bFs1L=n`mCdX4cj)uh`j^+mc1_!c1p6Pg/7JHR`C_*1oak&)s;smp2DXFP:c'_\r%6V4I-[U!f_d7^9;Je9?%8b(=oVTW&eqe>]+R!*kbh.hMC#@8X@P!]PdU%hb(E^TADT0dRsH#BQ65USQkapl%uP]-(Eb^-E2X`V8`\r%e6/KR:2ZP!9o-/n;pqkBa&3bpZHrJASf)`f0:0W[h=@>e_THC@2e3jX0`@6_BcCmq1L5-Yde<drbtb@/^,Zs8eX3TePk2e"T8u<J\r%cI*e,4YZU,^TB+#6B@E'rbnjnhp<b=]`6`$pG]0$47E2=%puJP@Jrtrd'_d2D0>dfc!alLIp;=>p''Z])4Gc!UY1?ZrpTOJn,"3T\r%MP4U]\ZYsZWEV/8?SOsh@L!oj\7TEg@L2eN1tE)3mdKlQWV[X+9'?01AnOuSoLI,!Tt^0^ck0]-ktgY9QM\E=2GP(=rSLYf^TFXg\r%=>A;EGCL!<>O$AASXBT.Z(:W=>ODCof8U#.QF`Y!.;-S%s0pPHDfdN_qS0.UIj87`UArt_pU<.a@8m38Y59/1a:2&A2cP$mpOAZU\r%J"OOq:72JsVij4n^kkc9J[dJp%f<Z5qjW#9_m/")MItME`?1f4)r!lOIsNQOYN09LO8UNs"((a8ISXcQOSTB5!B5u#c%P84q!.:H\r%#P>R77dUg)=ruipUm>#98YOfO;.+\koBZU@aV+,:7q<rh)T]N\l66J9?\*J^Ms7jpKesJ;Ra,0ciN?f#Ra,0c5uO:;9m:SGdWFW/\r%c53]@'K-@WS[kI.h6sIC?1d'L!EKc+Z/]2"G/7;A`n9gOh)"]h90Kq**W+uJI>M]6E9pMFhh-,ph1'A&^+YMprnpF`@,67'pp5nH\r%A8Ia^qX<%lp[M0@IL.%&8[C-taCA?<e%07`ok9h=BM46/X@G@5hKN0a2pjO&-_'dBdkT^SVc%<DpH"4RA>-MMBY9+a)DRbH#V./@\r%DWYR]kS:bbJ;)kp[U/R5q!SN[])8G.!BS6tIrO!%&ZJEk$2O_c>)eR4hP[j>HXaW(AkF$=$=-GsI<t4m-cUMk>AC863o`@;okLY7\r%=0SE4?2,B_iH*c6K?]E>lkR5eoIUWm&]UF3@AAHp*=?)--D@?rr%?U^Q:7s"nUo:`Br':HHf`);H6'&[d?5T%=?nh!:U^`6@L,o;\r%1n#Reb36j#hJ,:4Nj"Vd/Jrsj%@%?9Hg&4Hg*-i4'i1JMoqNu2lY$26#aS<mqS9r%h/&k8HejCe?P]t0`aukFlZDCd&kK/.>cjmg\r%9-CbX,aIH7Q_7T)o8[Nl^eN.^eW/n%MNt<8l*ZQ9nl)DD)fd=.bjV)e,.B;E3fMPhm9T`JeAS0nBY"-\7U7sP0A9"j$U"<X+K'=s\r%.AU=`5YeG,'HJBqR+_9o+K'\W,6[(l%QFX<MbW9^M>]VIWQSnePPE's*QPgMisV7<>\YFQ''%7o^-s'j\_:cO=#0%sk+.Zd:18c%\r%@^!*ugaJQk<;M[#WsQru)K5pmo\mBAAdDfT(@f$#C>@lTB0`sWiE20F(2$5lGrsrrE*:&_:r#B^eSPW563.=hB"0AM==E+[>IS\]\r%n<JiIc:^,4$94,#AuUH)8b21MFmJi)k/f2E\Lm\l[Q:@.c2;A"_?8`f#!(eR?E(Yf4;bpri!7OFFq8Z#F+4M+4Vp>.CuM8NY\qX:\r%oi:D@^:@<P%"hK4"MUB]pHOoO2_,jg_Ec5;h7IOp_*TNe2><Q1po4e@kXR8E[`=:=427q@nK^En53%.fF40cdDqr>JM)C^7E]a9q\r%OJi18.u,J*f0q<>h)mr8kq0r!df'T".d*)6&c=.#idP(th/_b1raa<'o#WNgGP!8(p(MQ#;4p.]c"f'g:Nfg2[Si;$B1g[%G1rAn\r%4I)MTF)anYG<Zs+l"JUX`/9g-'IBS&isXM6-onBNJ?H9!6ul4i_0t<Y<>jLJ)9E>!f#?pg-A.>4:mI_[PEFY/G.G//VUmk%>#d<r\r%?_:t'#-X&)_BHHj1-R3J,c<L;FAd`n#=&KH!=jrq9u\!Rh^rQW-6mW`HP-4NT&9AGSqo%XkmVZL1;88B*0TWVN8o%RWX4E%C,4^u\r%hhXX??'Bj--[0/Z.lA3XGLW+j<9"RFAk`JUhq"h`ZthG8?;Y/@`D'(H9pNbF9a9hu6</b`:$2IjY:-@sKDl6iN\.4WUX$3=_m*LN\r%ac,4mjM,H#S[;/8\Z=HNi4NBQs3q7\fe>D&bP@EYEM8)8E78Wf,BoK:/:VW>Ht[ubgl7ccp%5WF8^3!@`3=4a*A^3n<1pXq?oT_u\r%]2X8>%%`CeUkCr-IaFOS>o'JZGIKB5"%%7s\_tW9m;XQK^X8l9rHDO^hu7#XS+6eG_2]lq[ID$B,?@T!4[Oe@?'@/k(7h_<*PKVB\r%B#FaFCRl*McA6moG*C9$b`bbJFOlK%IR59(8#bHm%-K%c@mp^MK2/G/H@tAaj*ALH*`c5@8Ul0pjl1?=dr\U!T_gV`_aS)*H1A$L\r%*QoL2J.A!f>\j0aOa50]4?cAJ*chU>p_IpFjrliN.P?cej`*lS1$A+`cE;:FceYKN164G^8'9mJ:D+Nl`t`:23(,Ep?J'_!f38$3\r%-W!q&L>-"W@c3?.]l)eU_iVgP9s6#qOhASsFtn:D=*ZtC^bcK#<ro@t1r_)&!$74tZhskL*&t2AoV_S_I"6RT+OPG6+jB[H]6+"H\r%r-S)&4688k)arX@XO.p&>QW/&=s`=i^lSI&)MCmVn^Ve.$e1XKJ.t%\-P5SD9d.X'cMMAA%?\u0fck-WTTT_l8Dl:s$W2@&!0=#e\r%B/[df?M>_d:H4bT,L>T_qJreNmuPrm.QV6QaNo@JQY1@,UmHiHTA^mVjVe!`jn[ZSo=((LTC(b)Z]W,^?678&4QrT\rq>p\mH+/u\r%bObb@Qfh1"N;Z!*jafK)?+MXQg<e"F#eGMqQY1kuUX-[J5aA/po^])%cW)Vo&d1jaC\g-G^V)aZH[3=tj/;81\9!pa\GX'sA/!Gj\r%>V2(`7E;^F\JXMQbh8n&.EHWTa;;'W$;q3s6E!^<<aSf:GNK.In0aSG?[d0eo@oTZ%8Mr:W?rrn;U1*jS'0^3BB?T&UZILO4I<4b\r%Iu_FppMPSJe,AQ[1ZjbS8o-/E*[>)ODVA[/X^?X7cC:)YIOQE(_;@?m2G:"dGO$Wa,?n&=nC_IAF]:t*RE=+nH4j9_GVXI$rIQ-D\r%o:'N?^LRbE]0/"2l?A<u44rE9*qj&+0r77uPkEE-]0=c@7d0*68;:PYNV7^C%+s0.nn0eiD_09m*TQcIUXAbml\kYSKod!>:RPR@\r%.SKVj\'$&<@ntSL`;:3N_$A/)K:g^OHBscjQ;^&B72mnAFa0o%A<K,TFFXE%&F*)r<asoN"T0ua&DWmR3mp]B&/jj`S`V2rmt1r(\r%??=Q2Z=Zau8ZN16/U_D)MC0137gsYTq^Cf$"&A:t*R!ujnut,ML".1M=,ZIQ]+AZ##G4S-"g$=F<gL!+41]ZuVVh/:+8s&JjYq/:\r%<=+G&ndSU1dMkiO!HHg$BguVD;O:tuQ^S0-%%f7-/U_m7,4tGNB^*F49'I5`aO2I0^"Tda@Ao%]Hp]2-OdpB(So9F5/8-qJl^4jZ\r%q5c3I=?/+qHJIr>S+ltScR7LXcAIaaqk\_[TR105&(RYTVTfNBYBE3.HnAaJ6"Ipg073H0ZKP0=IqLjJ<_?&h^Y7P1+EN=NIJ$(T\r%YS4C+#utlqO0@uS)rM[pR=9U_ab:Q0!SW;BUmHg1FB:*1GSK"hd)#0#e<2:T6L3@h\_3^i]pD4gVA$*qZPW)75).o?ckA9(-OXcB\r%3`sl;S@W2U!!bi?PFb[m]o69uRJGAHSlW7Nh3b^Pa_$`4'u#"g/WQ-sJQqC$i*Imo^`7e:S%R\^]^fGro+0%_j7:r"R4KE/?EWH5\r%.O,a/WM!a7%9?_f$.4C<W*X0(Vg%U1RHV\<p+TU\XO!IW-a3[Pd>V]3K^r2cOc,rrW7Q<Vr"=U%&dj_Fc7bM,d0*.SFce#lZGl.Z\r%Gr3ka5fi4_e'eH5\IZ0V%<nnbgg:M^MnegF8+.7&klE9q[?jk_#QWDAQ6Qd6L]+"dM`ueDq-L@d7L"*Vd>4W@6cpD\WQHS&k-1@;\r%K6I5,VD$P>HLX;mCQb0s;/3gqCX\l"V4g9)aKd2>@*MAlDPHpeIUq_@Hif+.L"/Y:ZF<\Y(orX%SJ\FKq-o!6Ket`6Ih#A8ifeH@\r%1c7N+R`@hdBJu.0c<ZqskKuU)4dDf(dDT(,SJgO?m++P!-07hpFgiD;)S#>'D05*#eNEYQ5qd3LZHhhS9G3Dp>)gVf/Y8o;^K/7M\r%k3cHf/'^hgD]SF0RP1mZq:4b`(09+I-FDu3(ACi@Osb9<c6p'h7EYGkY'D%#Xm:3#>%;&n_Qc0!M%8q+4J!&W^3OFFZdLL=WBRRi\r%T7IXLb00%"G@;,V,coom5Nd9+J0(/G3*`k#p+`m_,^Qo/SeXDSq$aH?<n+.eHo,_*V0FSe(nE-Q8M6N[Wl[$1))NWJkGdS:'(qhP\r%+&\F7]f>`q<M$M-E9"V'D>4+P1F6gWa5Q]DHV>`0?K,5bR.'Y.1!:NO[%Hd)W2-cO,.bhOr"`b&'^)]_Z0jX,2,Q-+YQGbV,B+C)\r%YQH*r@r7-Wm6PWtXCYog@nqq!Tmme+"7rIu7Z/rs19_65Bc6B(%*Xq]/`WCb&Q][+YPJ49"SV9ha>EaDLncVQkW56<'moSVA>=&M\r%5&qKeK\[["K9%"l*e?C9]GU0#\U*.mg+q8`,#uOKg9M]F,l#A2#9PtUB>/nui$4#^7tO*n&:F-F9._WAqbb71E=9uHgeD.k<q)6h\r%fH]<&P(JbKV[Q"VL'`Y3i1ifo9i\cj.T^[abHXS,Y&rAsFYeSmacV;0,?Q%o&U`Xnp?7!SQ,cA\&KYAZ;Y*FGfLJ:9Di?i2g+-HD\r%*f2BNj@Qr44;'GG=<XA0bp+t71lM]#p^"GOR]\f+8hE`(?'osCcdA_0Pp*HQ*re<2eAY#01T8VlZfW.,J(1uIm(3?'V3lg3]0/Z*\r%m)MmSI!(s6hb2lA,[UP"I_\BEoC*5+4rP]c'%Q*u0E.-Jh7@.d:Yg!`d+hNnY17NTZD#U+&+[s\)m*JV8b#,db]Pbj%e]?YfOZJl\r%^9+:T3Sbn$A]R/=g9gHN(&/KlCOV*=k.&Ssm!`tKYK_[bkc"cP`['#Ga&T!\2egog)2c-l$U-p:/jm1aEhgt-NQVl6'umd'MX$4t\r%mEjC]XR8X5c50SaG<_$NEjXBia5X]uIj@)"$=,RRZ`ZMJh]M])-fnk5Ba6]"7c="*qY-<ELSaOc`C*%+0-8NFos'Kp$Pc=ZHk(A%\r%qEr/`O::6:T%#OEg'^FF61KYhhrMDEi$)\IqGi%!,ctYR=BpR(q>s]5>AfZ=RZ6'_N1F8D.9jqdlET&JgHp[BpZ543$.hVHSV$UC\r%PnUA_8NTOG3FP.ee]?BC`h@E>=5Qo,96V.g.OX^i\r;TU0Tj2"8a[d4[=PRj^3ocu@SR#SRR0qn02gqqGut`>e'Uf-Z8a;t-.DZ,\r%28(8Wf6Te%=!W<WDX#M507hm//'>@Wqo.kT*`9ol]nEQ&B9[C)0>US$65`"?(=_V6ggbJXVOD=`koFsAs53HNNB\n/H[J[[pI6T@\r%<8"jCPX@[mI#o:[Ti8JrQpgQGkdF0bi:*';KSb'JP2S.sr$CP:UnQKiDp81SF%k-022Esr0H!m<[2<t*Vm*b^F'sMA\@s(/bGA]t\r%RXi]JYanC-"N,'d?,V%09!K7U/@4Kh+MMS8EUlr`:N>@FClN3GcA/-bNef5Ffck-Wd)dSPOb>9XnOFts<A`=cK8j+-Y[91dDH=8.\r%#-nJMZ!9e+ectWI$L#2sbGJE"YT,I1h''rn!6`45it>L4!E^tN!14qQ)fkMnL5%:tFtFHZgjR)+@CqgYi!AsVO#2<(h_(t#eB>*#\r%_k/U?*MlOdr'AJaF%RNU]4AMh8l."+(/7pWMB]j/#ks]7M[n'W]dkMIS:@jrJq=VV^QnT%.Z=(mlsj9L.*9\A]T6FA5qSDKk>]tG\r%ZO8L>>5#fnDd9V'pWu+Ge(ZnE`rA,";Yt.RA!NiS;L9`U?bhs:d%LaW7S=[Y^^VVUHr:7d3aY-hU=6S81]@)`]@Gkmq<P"!nKGG)\r%/=(&kM@\L+BX>b'51C%Q3S'aZ[!djAmF=Dm_\Trs]jJ,H^PEfcpU.fj8<*'Oa)2(<2e)4[a$m]X>SW5Ls%uUrmtj)s!>-,HVk%`_\r%RlahnDV6%DWf8pFXMMiCL#7j/=/C4A/0?i',$osX6kB--3H3f%YZmbInM&Ek&e-*he@g!!mXt>&`9ss"mb9AVfM3R>ZUO:<l`[*S\r%mZWI"RiT*1K2X\K4QJ][Oj`i&9KJgq_hHQ5:J[\r"Ao(YLZK,\Oc]d@'$/QW<&]&T=\`pg&Kg)W*Ghuj,L<n%dgo0?p%TdXVLj2n\r%-g[0c+Hq8$^4>;s&d+R"rT!\56b:Kq;n40BINP>Kar]0-2_'eDe8C``#Q+\OUW><%hbDnjj<frp2a*>R%=[bm)9@K]%@W9g$tN8=\r%\M72^kSI/L"Nb-_6gSA6LYc/l(5O8Rq>]$Fk&tK-KF1Qg$:/7uckNNHRHW-:n;#.>Vr7H!L!Ms\U"F2@%i9s^nDt9HJ2Qh3cQ?IV\r%0>K%3"5fUF,LOVk5EpIR25KjnAjIR(Gt$srb_"K@l@RH.q=^k[%MhSa[AM"(.&WAq;@>Z7\iI0oPZm^.fpl!a#/>@)Vfm2%fpku6\r%8u^?#mafR)7h0*m:))[`rW<8,SJ%n`b&)']Ya`@W8k=;[lBAp4-E+W[XT,gtp#5Ra=Aq!560QUg<?;:"#(bpYP^*h9fo"G"l\5Y\\r%7[L<;q#h)V/ISJS5c!AKn=nK3i'e@7U'+pEYq_-1]DuR\NNNia[O?j1i.NOmFg9h:cdM$]/IFWo7ZC7ZgS/)Xc_*"M@U#)C\1rkM\r%>EgVb5R*[lrDEcej#?5"%Qi#NV>)ND.=q#JF'(atcO8j)>1+8OZg*rPZLc_S_=[/!,nilmQe[/_:E"(3c\Pk)?[H@[/G?*!J;8r0\r%UE@H8d?[k:^^-A0*lRL_(Z*hXq!pCqDX>!I%k]uZJF.<48Ej^?%rFoVJ5!o/hgYPq56]pc&nLM2i-bXuf+CW;;R"+Z;F?b[6Gh"B\r%CbPe_cIU@!.AjMlS1GJ::$UB&\6dB6BZSV>%upKF[eR/bOS(F2.pe@/*uFch[B&9:8URpOCqtOGR2"5P@2n/<[MlG>]l+uF@B1Qp\r%(N9YHd*V1;Ia-7Q!eJJp>f%7[_C/i-,@&)*/Q%LVlkEXVmHFUPRP]s/H5JnQV$RE,No1PYck6D`O*\F%Y0qtdn0YOi3gD%gZed$6\r%_H*MT(GN$MfrHrD(`t5!,pXA]A!CafAu3pd>ST+&j0`0,Ji-ZB]hCnd9WV[!ag--?$?3kddKIJjC;:.n"`eHk`$KB>YgS2m?+AI-\r%b&5WRc7;W'NB9q2dU]&@K;*\"(_u./$<gefG>i2gH4hf"76.G+Tt."6XbffLBf!;R7\rZnPDs?P)_4XbR0?0Yng[`R<LY8a4,Y08\r%T2Ca*/Y;;XpV(-$N3,^9ZDuiC"f&4Wh*(*r#P?*s8s;51ekj]%IY=fXS"D9)_?PC9B%1mt"$-mie?n$GR1q"/El(lc]61!CHfAH3\r%Tai7oa#1$2.:!De)kGbBg$#?KBp@JMh`6,(l4E@>ECI`<BQqe%VTJeQ,7H/3StW"^(,RmVSfqVG^%X*9,0@;CR2:0$N]MY^/Q-PO\r%]P>.%7-?&0aVXG:Y!N;AXND&)'SRNmK[?u+0+']LDN]?9bbCS3#<1V,hG)Blpn$(?2pE\XJt##.ClE8;)/gIn-iCgAHV4Z_'&I)0\r%d7kEA&HTtG"?227G^PN`$Bq]_'k`W$-"Y\S_9Z%07+Q'"pA&t@4V(nJ:\]2oGKT^@$`J[T<6s4:>8PW?Ua\e$O84oqDe(e?"q.Kd\r%55/^p$ggBWINb@%mP]rRj]'E<ih4htMr&tC3Sgk(]*97J)([T_@1GEMCa>0gP^+(jd0pf'I_L>V$;;ng+dM+(boeq`Fcf_hL,Fr[\r%`E,0FUNs/nC@o:OMTiu&)&fq%=a-6H*[G/f[Tb-u9M/Rb[@@k;iK@0/)7IsqTUhHH)$iApQh$sK<a8BcpT-#E$k>WZR",B@$`rh%\r%C!No>.n(3[F2lDm@O2!&dnN_K],=*0i(+oVOP`9"O5'#c'h'K-,1?m]XF(uafP_YL_ZB:B<N9pj\rr7o$iEb;CWcc?:C#04mh^?7\r%4TEe/&-q,\4%hi36AE1C//s8XV/C['3GnrMi'QX!,_n?>'M&AQ*-;UWm2d1iq(>L`e%4@nfEn<Aj-V0RFr[b(7r'W6(.LqeEO<0k\r%B^pu>U2?D"D0^[:2Zl??ggrR/Kk;HqDlLlt)D#s;7.hd3AhLhRdI4\8VN^Jpo=kg4qg:F'4%5e7<p3VZ/$!c2eU"M+bsG<g'2Sbs\r%-99c*EUl+\En[&DUkaC*WD*#KSF#DuWTmrYPFV"&3'gQoDN^4^*%.Q#V'MseJ+3=sD'@$CIZBW-<%64hRVMqOEfLh*o!f+]ea4\4\r%`sM[0G*AH_k;YcmhrbJ&Ruc\*)4-]58=T'c**L0#$S/oKi+59"(=grMn'L24]:N;/RWN[,UTUK3GCF%u.1*(-[`7sm>6[>cebCW:\r%<k.Yfi_Ef!pFp:E*%=(4OUCDZ"]ru%ZV$E:L\Z^'QlU9+R8o^4+(9[-i^sk<LkOt=!S!mE250hZY)L:q+mC>p"FEjrGGX&7L#Nu_\r%LODnbWQ>2%DF(n:9cM8M\K?2MCC6'051B3NDBHjXX6gmM<&,0\)7mj:Hh^.XVu0Momhd+F%Aq*,jITPp*kp(Yr?k_;=KZi;SAa8G\r%G.s/07r\4r_p5HgZeTG<b$Z#,j<a1mP44G6[e.D^dtY(3)lSOMCS_mUlH";(_fEadQV/H)I(.[jPNKpLR)^4"ghEV:P*<u3:c!>t\r%3nkj`)2dkkdI!,G!*CnL"@Zbmi#0`1g6!*$=R6WoU)Z*Z.B!L1?"k2Mi34(+emWC1*]>rEWAo_Al2_o`*S?!3e:WnDNb13<2gSfY\r%bkC]Yeo.P<T+^0fh0GLgA<t[0UTX#Ug('2A<7N!\gVF4Z?$/ZcG0g7U=5B"G*P09>X#lKQ"*Ze3F[sl'_HJ$UF[sl'3:3'4\g(oN\r%0j0[6\jP1h0<*EDi)$8NmRZ&,7;ee:>Xa_$D8SlBA3['C?.+_D1SP$!<Hf^*#>_0$J8q-g6h_F/F[sl'ijpF)F[sl'5bXmPmRZ%A\r%c!W!$]?U2+L:SUd(nd>H<HnI0p$IQd`t`[S%R*ejGH5X3D$RHo^<gG;LTS.E\pOGPKcJrtIO>q(#a"XQq)Cf@G9h%'nL.:4G9h#1\r%>&84`ie(UQ@tGIX5tAV%JS-[1kD_"C'@k5$jjIBY2JMZgb^34GQc".?mO&D"m;oW*df]3o?<([BiQb0$50?Fi77p8Bp6!<\&ULNp\r%`:c6N]#*dT*d(L4*^j7YGNM4[1C:*N4.MPu;.l.TbD'J=Q!n>Z)YlP^XAX]jb[A-LXA\npCsBs?1]52c^;jo.?bfNOQ-IZ^_9[$[\r%[b"r$Y<nkfBfi\53lLu^:2G]o9SYqVT@MTN#EO.YS%>Qts7,s.q7*'XNl6B>l`n,5%<8mRgj3e?6TTq8@RW)Z<"TbQ=4DP4Y=%6"\r%2m,n=SH?;.2I_"RdOAQ^DBlUA+e:q:P:aiK3i#^4F\D&*]adDVd62(h[b"r$0881r$_b9!&]Q/)`("FD046<=f3r?r`/&@RZ>1bn\r%(QF`(@XB,Mp;.]R&_m3_T+S=_Zkn^fDM+K25l5ri+1['uAV&HW/4;Jb1boa.Z't-Br)'V>"eSdWBsdF7m*bX$Htg(;aqrDUD?'F=\r%5i8oohGa**=eP5C`Qoh'*ZKB"moj,fi@Gq;oK@!V]i:.F-VnBbd\Q<lZ:a"1Aac0>GG%-bBg_2i`)>V6)I1dOCH#1gE=EmU)dCp!\r%2m/k;7Gk]MoU>FXYIL1P]!eSX%A-7SN(W-!8ht/6l'ZU=+i4Um&/M2i8g2(JB2&Qd&?e:b&7HT("'.qm]i!pdIdcWb3)`q/XOQX!\r%fK\Ln1g6!",YETLBLF5uHqM[cLSlAQ9BkrRi,4tI?&jeO-PpWg+\=9^!hR3UFd$AYFdaIF/c#OUBndn@Ln5F*1dahdhI'5q)662J\r%-O\U/BGRVqMka'ccX0&Fjl1;K2#Z4e,r4[bH9X8BrER9BV+M3dB"TeTDW,1'"fF+R!H)'^*tXlD?^)_Z-a-cf1l&>cV3O_(2!]L,\r%7_\\kpc`1+2j2J@582&*#BgK7Q>Z>h<OM&0#\/i]6G5\iXNo@>X2.jJ-:p&;^..ib2jMs#5sY\6`u10kdQf>,+[m+?jb!e2.u$O7\r%9\E87>'?]SER(rbf_:bJDp*DYO*9d!aj&*Q8po"#gPi<G]-ZS_(J:t"aTUFDQ`UTiah6Yrlt[?(LV``#\EILDMkob!<$jbSUX-p]\r%9EQF+-eusB.##*N>XP!ZPgR6<inhp:gKo>Jk[2;Do"t\@B6'o=i9\ndWmU66o*%[uC:$(QI)K>Kbr$mCfrE%,EhHe<Pmd'LF<NKR\r%&,\-kCVt#QG#NZ-P]m;F0'g\4WWDkbQf4B\rr?`%/0Fe93QAd-c#V"n<.')=?41$*E\!'_jJMMa-f/>c9?=;"Z_pC-+^p'm\0X"V\r%Ij`%@\EPjQ!0^($g=)k0`RW]F(UVj2M,0?/$.M.53O[1mcndaGasp2N_!3b*SrB8<EC<NIht/b!pV-%?:]!p$H7EcUIVQ$rV7o`t\r%n,e.!^CB3_:G*gJh<YO$b'"(obIV[r6EWG@IcTfR^!*G'cRs:(LN0a?aX1@bQ2&ZHRO=jPD0N#-[u2X+h:mB9qS?.r2r0t"IrG.*\r%jMijSWE-Y($X5#?A+`GH41!=#,Ys2F"2-h(Q4`86r#8bGp0\b([trrMpk+E@arfsQ3u""nFQ(IOmA/l_c6Mp&B2BLP/@qG1C!RB"\r%Ral7QH%q3Ah:f2pb4BGP8nY)L!PD:#7@A!#F(3]!BVYcWLc\\t!;D\e5s)Zc:eYmF"Kme\6$-WiHdHoOocSX"<DX@!OYD)t!AU-&\r%S[<LdBQDtmG)O[L1k4[mU`K0npXXJ;)+g$MrKWs"%%*rY>KL$V(BKQQaRh"iL5om;hD`*OG.Wu6YhXm'o[spj(PdR"3X3,[%C:q@\r%-%;Pp:5Z#.R;u$dY<:WPkNUV":5O#I4/BJ=jb,'%b6Y+1B$@iKM`um=77s:2X^qW[`C>!.#l)0]?UdkLcJ5L_m=VJ2b^]*mqCX=`\r%SK/K:nOi8/M6AO_b("Q(emtQ9<K))%%p'<]O@8@]^Pe>d^BaiF-(M7Mf&Nk$=d*&*ck"P>=XC<qY0]9K(O@5uS&Lk)m[rqAfY)%]\r%P="g9nErqHHit0!jq;J58IG1Z@i7dOjKst)cZL==)cCA5mC1IR5*.VGYm!>\qd!:i'-n$@F5IsUOeADZ*85k($STY.S41^\3m5+%\r%_2\Fo16;FbW".WE);5)ri48Cm#)[&9kUf7E"tEo"776kPS*;s$D7EcYXW^BYV1ukcQ*49"i9Sd5H!&i/kC4TA^MoBJqVeIGOGWsa\r%N:UU-3rdrA8ZTUHq7",%:4HiL)u&fUG"SA!<t5j3MZ&h75G%OLC3K7,l`]AbnQ8GNHA?)K[WCmG;t&:t<(ah+b*h)@48Z"$cIqH*\r%;XY<C\sRgLV_r<P?0q(2-BDIlf;Ur[YRaj/ioQPVmc2*%g:4$TBT##)ol+K\9<j8K*]dffMEPVK`DQN4@Abe2Z%o.sSrJ(Gp2!f!\r%*JlpJn'e<T%hec8MQnhmS_/RoH].-DXrEVVPW"cSV)9RF`#eOk`M&<>H!K<OMs,YS4iXsDEZ8R.%(TNrDTRTn"t@"VkC=6"/akl*\r%%YF%,*&f3ui9e9h7>I+].nte*bJnZZBS>HIHOM=mq0jlkZpIBEO:NA?;^if02a;kXe^d@*7FLlP1W=0gUjr\6aS.beXu-IR(J-g#\r%)YU\oE7ff/q_C+tmP`b^Qq]%=*`,G"[T6j+VojAZVR7$e3]-ChBrt@;\W+1fLTQh@lXJ-1g?#R00]"D5B#FOL[?I&?,2'mZRi9ja\r%-YN\lEiqMU[,*Jr#CSN*.%IaWQau$YndVY81pb*Gnb;Tc2Af&gDD&r^B(B=X<.f($j./gArUn#=pF+C=[Al[gLR3bDAZ`]=;;Fb:\r%96mH+n_JVWjs-W"!f!]W"W"O5\1p2`=pdsN?dN"/.'QElb)MhkG)$C-#4&7I*>W?k2D^sSC<@>8kp]nK[6#-QH4ag=R\kDRQC?7h\r%-@/uLl7"Z,8i>q`n7nj""@_o6?6@YeC=%7%D8&I5)!-cPP53Z1<Psne\k6cen!1dq*o>>,O;f12+2YO.mN$jXiE]R3>&ZbeUmLgE\r%BIlTmie:B72s1o3+RCUY>DsJf_4"59kV-a.8`-*O8>TI]itr>#N#M2F$g%0kO]"Q%;$6-M6qU/sMG?L@`&1k:))l/F]TV1\=BeG&\r%B-FXtm*\F5[_5o]O\XeN+@UAh1D!HYH]X_'<KaQfP_t^9C'^!A1ItS!cl#b<C]IIf^'%j.I7?]VjNs6Sk[o&GDo5B2clALl@Gq4V\r%9ShB\i_LH!2^`:W\_7gJ)>Ap_!YgN.W^LQ!M(K3IEaTLFMoJ(X8IU#MX0L'gUhM2F*&]Kbku,V,mV!@bVMbM&\,>13[]]o*<I</Z\r%MO&rm40Zuu<7BO\G;T<s$/jVqgUYcCf2s^IV-\q;7B$=ET:R)\QI-ProRj1#+jF`Eop#\1"o0=Ee6d6#fZJk3^bL<^!P]G(^8+qU\r%:NDpQXO>#f3ZY\%CIl`YM'(KAScTP0KA!Dtm=tVU@afVqo^QB\H6ZdnQ@I9BT^r0s0\640:KFU?ZLUM1&QhSa2sLrSqEm\)S0o>O\r%aq$ns3/nEqmsBOt&YJrE5>GSD_pfd"h,!urrERefn;!%5n,;5-ad56ip%eBtUfS6=X#Pbh'OIKFUjfHqVd1H/+7%^TgT^/n/+u*d\r%=3c_:g>BgP[7p6=qRe&.06NbH^!oDalOr$$800GSPbsUZ`m5S7[C`a2@I'RNX1ZtaX7NsGl#B2VL@jH7,@Tt6V6SVK-:d8;X7pa!\r%*ij$Cm^$lNj4R,d6*ftOW.:pe=*sUqio;2`V)/>$Uqr58^Qsj3&q'Js;(,s<)dUMse7PJ>#sLCZVHHD90ptJ^PH!++gY_]d16(K_\r%CM6Lj@Hb:_9HYB9$q!7,kH&-?e@O't)#>-QfK;5,]V@=3"3kIo^<NSl9Bh!3fn$I7:cs/2'fA_s]S4([*+(;I\eon:7\2+joObie\r%](RO58It_X4c7hcr3R0?O&C:s\Y96<M=pMV%V/'bRe4DNQS=:Ifn&nD\NCZl0)(SSR]n]Ql=s3s^;sSSXZ(7ZO7#iFo&$BE==m'(\r%f\8QK'os=XBR";ZO-Pn7_(g%F2$Ks%9#gK\_rh,W3#OspBoI>A07U8feTRhVr`+*RZaa##pGUi"K6&k0hlH)>[j!HW:ep'pL$i-p\r%rUOp3dpSqe\'EiJ?1'66&9OaoV+n%f-'6F:nWD8GgDAAp"Hk4ZZN.ChIdc_#>FeF^39o&iib:u[2G&!#FXr`2\,oQi3ZmF.a<I5e\r%JQ0cBV(>^lq+[1&e)kRiN@ph-IWPra!/lpS1"!(_WfmYs[n,3oXS/U$\?>7mG));^X2TeA41r"Fa"b8N--(^LbGO45d+&2/D<I[s\r%mRZ'W7pXr5ZlQaSS(/PS8M-u)P-tJ37p"N/ZlPUO\lO%6^$;^a]R'SN8#"Io5?*)7_M:.!Dh5V]61945H`uqp@t,mb4,;]%_dB%/\r%mlc.n&=g]a)TP%MmGL?mPs=jDN)e%><i=0Kp;54*8EkA_Dj:qVDXh0b?AcWU$btBc%km;r^?ea!)P4[ZV-WuC:AhI[b'o\>ghH6r\r%kN,c2Ql$1fqlMtIOl]g"-/hme=@Ho1ZkEg#Pr5E\[TGsXL"R*@a:>97/>?\jJNFn,E$j=jg?[rLe#HK!DfGc:=@Y<mOkIr;;WpSj\r%8gY"]&MlNKNq3E,\AXY(V,%V-(DFNF@'C'DHaTc;.Gs>[W(9K@I0;F?KjuJUb[IgN&[([B1MP:dmHAhrn\V[jO4j5FX-)$pY<BSc\r%@UdBV($[Di@(,W\[(Cf\lJN`WhC`f#Y0[8"T+gihN'9j>Q/Dg.T$)3)o2$rb`)S=[ja!GCW:(OE/ka/n.9ER@].A);;/o_g1M6,)\r%HKDGS?EpfrZ;`rP0S;MOqF)(jj1)WtjdLmP42+<.f3i/1@]_*t[U!7Iq=<5'J[mW-\JHV/33ErNlmu8_@-*7MRE+(ul3kr^o9eiZ\r%W:)eoo2t1c664a<j@Y3fWoY[4E9TCB\/KXp-'E&^$HEmpTHu`U4r9`Ukik7OG:JGQm5\MLKr7h;J;L>S]CW#7SQe3PcC>*M"fX&0\r%hSZ4'#G('L5/(d`/$e_/G+1!sV/VmWJN:J8.2GLN0o@tJ&riAErO(-c']+7'JW#:9\L]Au_-a**1a[0P+nX#j5QL4fC4(e!r`f/3\r%)VkXp)#c0TrGZ,F+!Q7ar:TI.8HQpUih*g(]`>'eJ?YE2R3l97\aV-,j+G6EIk=j`3nB0Q5(KPT;TY"u%=n_rQ>>]/Mo8T4^&AW;\r%_(L(d$WG>.`2SJ&5ghqOSoN"tWZfY\>0Ae!SSBR40\Tc!b,L+idArq`25HdXpoe8[QUc$8Io5U/:4'+E^H&>WN14*0krq3qhrDn^\r%m*6B8IRis]82aJX`Y7n)f?N-MH!X9BdBCcKs'&AWX8u!gn0K1LZ4:5nSk<Vq'3k5El+1]nTXphiq>q---FWCik]sE@0Ni,@5V1ke\r%i-@$WQtVD[H@Ui(I#5Z,0\TB-d2BgT\/g+AbL1.M9j+.*lIBXoD='m=CMlb`%9DH#WjsRBC5&]RZ0(bcN,6Y@PHC2dNL1KoUD1jO\r%^;-V&*"=,>?6>r(nR8R/l18=S7SKHXOKFmk(u%@q,Na8BCW&>nY=]T?i9)E-1@+"bB4HKDRZDI#`PWijBX)FJU<>D0[B/\+-lA-_\r%!['\"bB&EAIbc!m$-^1?$i45SL">4phcshtOBKrLBh)hGPP#pMg#$S<'7I0!o`=Qmo-+PI\RJm@Pm6g(%[BG_<a+aJ6&0I"ZB=<9\r%NGDL&.HN20Thr#m'!NWMbjGJ"@sF6Sek#R5$E+n7rG^t+K\)8GZVh-cC^:I"gTBLS50/_ik]"umQir7+*@``*DXmQnq57mGF,Vl"\r%pRA]E\HF"AIoLpuP/eVgJ5L5TZ@HjeE&53.e]36FHedu#hbe9-1(I3g7FLm;KJD+').c_!X#'K7kX&[]<TA3t_Eip?3A.[DFHA>s\r%*mF6)paS=<Zh's^%)9dJi?/lFWYHL!hF%&kT&LkI%+5rrMhA\A,N%inG]d=O>3UE5R`gkFX$/D`R;>V`&#d9#bs(lE^f=#9'0/e$\r%Q5d,h'aWD(3c1WD@@U7X!PT)kNcnl&[N>m"1#2"=9VA-c(B].<':TiM-nVT])u(h`\gXg&.Nt5#m:L6(N:Q1SBLf%2jb5TjPS'?g\r%g4;=H6p&8QCgA!.6)Ro?++,LHCnVk($eg1jdUq.b9o.0\(X9t`26"D37[l>N],YCU(o:nVdrJD?PW(-`=a8jMc]q?fC+WT;&_.J+\r%$sDRN\g`[?6e*+,d?NqKKTd<3Zj@%&V%,HU1DR'4]aOG5`tZNWn?r&[$(\TpNEcW:)1=[u[@L#U/9EGgTHCVT=gU!NaiG!b;s8ug\r%jG,EfEWH'BARtBmKmqZ@INXnd$N0rf=L2a21c-D.lc-LNnIQHn3paLWcI#dMU"ZKCG=#K>+t>U07Wg,1lBkom\D"nt!KQ7serE:\\r%K%"H]Q/6F:/l/7EB'/;`?gKJPQuT`LVJBiqKV";0qMd]9g-bo61X5Q@\n(m4%q-plQG,s/h>#>*k3$`4^BN".Q\Mq8de7XK]S.r#\r%Ck_C)UmRFWVSA=K8ha?d7ic9$K#2K5NDAq"5T][+5Qi*dbC"H`nZZ^9'<'!l6Ai3<8L6B4)H3fLH%cN<A/@*IWthA:CdD8_U@el@\r%;l13-.JI&7h`H<U7V=t\gl/h<T//N<DLceQNOf.cXrHZ"4rCj2COJ%f"3pdhMEdNqa:mHm2V`GNf+#=3>e01Qhg:p+No[=[bV"8,\r%JL<:T4PGcTl)[eZWjKm23h8nQ[ir:D/E.&*qn'\YIG>$qO',/g>?CH4`]?Ik*AHo[)=%^s%oQtlMQop`eY/2,dfDdbV8cX#5sW"P\r%T^k&bh>2H')g7^d[\YUjF>H^k=&Lj*);=A;7]'h"1UP^.!YgW:<mp%l$qM19H7^$#S-Pk-g4^c!+\YJnHnE&nr!,#"c/F@l,E,?,\r%j<;*V_6:%@>uR"@+<C2&EF&mGKA0EABO9nRq6(-B8f8NJl/MDe6t(.pjFHlOBN/Krj6ma4+<>cQ+!P9W"4F$6P.(JVk]rl?Qo>CD\r%a/]Pb9u@nhUh'0Aoml]'DeO;TKsmlon1ITLN6j9orqa8D:`/E&(&g36qus1q3%E_9_I().S-FN&$2t"9$5ro!-hn'X[++c4;9*&%\r%Vc!u>n-"4AUSS0Fi=^XFs33BY]*YogdG@dj(IFaJ$@q(Ark_9ecTV9EO:abnIfX=$/gJIar5D=[d#+_FKU?sV]#%h<HU^>ni%OG@\r%UH>a?q#W;Oj.7orrg\4b^TbNATRacg<tsIj,rQNXJ8]/4q89Iu&Eue'3o4V,R8E"mkRA'l(QcS8!FU/(^OX$DS)#k1n/#P8)WBhS\r%M8)=-`F@B>(B+B[hiA.=TD_NA>0Q$4/$:mhKQ`,u`(`+eL;1P^b"n+/<P*Kf%(+aJ>%iKPUp06H9*jTFR5#5nq4pP@`*<`C-"oM4\r%+OJ=,$^b.5!#ThJ(UYU]E5il-Vok7Qi@<3nRrkoDNmu6?k[^-edE-53l.Fmu^6>O!R%HWNdc$o(hLU>;d(Hl8qOL".hIl6e',b\6\r%]u0-f*<0lrh8Qc8a.8dkYjjA-mNP`+Jj3;t#Cdb<F<,S958qSuD"@$Um_8Y983PoB??&-oNk:2koL9U<OQ*b`p[S$kP5CW"eOdVi\r%(W%.,:K"B"l(Zju<@EOg:)1H]AgK/=bt1anEKI>NF!L"!/(r'5NhUg1ZMmBH1ablM*cIO3I%C?>iM:(XO7A/9*K,ImRVJ0[3LCJT\r%QgEuak;pY@4qQ)q*%R!i1<d"tMRYTSgee.T@Qai7WKn5q(X:@=@>uH\^?QH\"$7p*f/GM8blC"18ojuMg0*""(PEr$c'1Ta//nu8\r%P4!+5>Kjum;W>QsAO.!F!b7e)Sh4R"kPS*fGkS7tU!&6J<4qGZ22B-iT]2GL,l8d2VYC$&28Am61f4g=+:,MRga3@0mJM=*NpbuJ\r%^3i1.RXWkXC1s5AZ+?)K<n$L=H=^o0r<!cbs3Ui-5RiMS#tQDeY]l:BKA`![``JMe2W43[N4jG[6DqYR"+L/;%Yp`2.u,ruBYpj]\r%#f]XTUfofBnP#&>$t_SVL2n>U'DhNqo_Ru9eMLd!V@i'i3`SOOe"Bhc6.OW<1lJefGS]@sY@V+_[qW-D/65?;%VO=88$5t)[,$`$\r%NN:X`8aEaR];j*ccKf.sM>u'0[Fm5n,%2<4=oR>[q+u>R(L$#5DjlZ+jR1H2AhnWq7PQ\:,9"qMmh!po*f"cjZH1J!\<]Rp2C.W4\r%T`o-a6o:QVN#ne2&CDW3e-J'G$iBW\6[Tp*@WtO-O9WVY'\AQ55T1&2&3*[G3p;!#=;eDO(W,i;?"HQN8ZY8t$rmkMa1R5HeYs\\\r%oK(MgkbS2PbPI]o[4*\C%dV6d+:X']#.uuh$drF=BQ2';YfOZpk/fm+]DH[ZBeVq35W8o[dP-Dnr7N6>*VI:PX,ArAO;=Y.n7G`P\r%$Nd,Tj$LrT(;;_$+UsgW^dcIOBc!N\TT(<B/#+;k-2jVoW<!<XbDZ^J3*6rHmZ<-AW?(V`m[*K1@6`ts%u(EaS1.SK`Obq'a#*j`\r%]YloPpldbK!]lVb5O:'7;ne<qoNfHdY/,(8V!W_[clCY6IOahQs)&e$Cefn(a@#]##(8MafARWi1(2t9*YaZW1(/0^kSK;%1(4!"\r%b_=X/gj\ca#A[/C(fagnY&o?-4gp8=7p@QpP\W-"K(]i%V_a+tjU(jX$f==Dc1fCX?TQ/)DI:2CGV!-_$-nnAJ"W8Te)BE#-G+FW\r%T%ma1'Wr`ba-4DN\8/hsC99G2@5AT:r8*!:W7>a<cjU*L0d:AfE\l4=3GKPCp-AJ87FZRHH-81K.]q+\9m>)9gB#Rq>b]4gkfrhV\r%19W1$dF,BEC0FV@4&R<3K.gV-GG)is=JMB(2(5tC47mKtAEgm'QTS"$XkJDQ7NNQAn\;K-s'..T"3hT9Xh4!q=%`Tb:S2nlgJ-q<\r%LXG];Xh5iX[bY]9jHV+DOq]Gfjk2VThe)D?38)CI#7g&H,)O0'qQMg#']86nPgF)X0n%]IT[\gkH#(+=7dC*8Js%-@M"?4]@C=f]\r%5tSUoP"b>T/p0Qri.]VV7:800I_O3KjY)1B8n$*M.LN/NnCEX'HU./%bXMJ4(84%/_;[\sC.k\:emkRFc]oNC>sk;U'7=soM]D<t\r%jrnioibj33H)sGBj;6?;#)#d)$`C_lFYuLe8J/F&g7GN4VVNFF7$pV5rO9Yh]B/CJq!sc@>]]At5iCM``#R,H?qnaq&7HRg!ijcl\r%KF$mW&AE\V&7IC;P851@`_>&2K"?o/!iEZ[/ug!M!gK;R8.9JCjr%%chRAd`jX)3E=RF4o,'kha.-V10+:D4.B&h=s4;hT[<<%E\\r%9\,=lq'DQKHhgfk*L2dcT/"d\rI-,R:;Z]gR_d!iioq"Y<r2'eU[(iQ)Qn7O/&(tAV(UJWh(cRL69kSo:$rrn1^Cge<LM7uH2nCp\r%[ifjV`1>2WTV*"nmtPumE03-qE.[g3Z3"g6k6=/QC%Nr(/o"(0_m0V1e(0[-*G!)d,>''d!XOe`lPlU#:_HnS'"u+ud]Rkj&^G_\\r%BJh:&PM>eV&0r.s\8LO$+@n<poB]XaI3_/-KMrop0(PKT!!lgka@c&]Co7OtE`O)q\,r8<HIlUL$9)>-40kD4@J.12h3jJo'X!u[\r%i#UKG=Z[?(+l8=J'G%sgWo+3::>sn5'jbh"G03#aSpg2_UE_$hDgQl9fcc+:g0_Ib9"%[t^!H6a<!+aHa`^BrM<.DsiS"Uk:Yq3#\r%+HWN+cEmVDO#8m(A34L`V![-2&US'#"F<s1RV8##bF=^_'X"!/HhE&.V^NE+_p04,SYBYf1?'&%:)Vg5Fn(E,Vu/fOO1?OjeRh2:\r%6q=[a\9:J'#CWnK_R8t=]Hc/[V&YEL:G.iC_*R,sfhO!X5l\Q"A36WP,Bubl+kruQe)$5SPhA2pb4CF*Vf;$N!D?t8T53#;OqDqe\r%hN7+=,m.-gYK1mEP/1qo<607HUi&dXon7.Z'HBMRQR?<*A_GtMTl0"ICq!I*o7UqXbWL:S)rf$ffhUM[J[4d&Co=M0O@Jr&Co9i[\r%nr.Bt-csFifhUM[@7ReLZCMnJD;tZdGt>AbOH6IdgS$]j$Qntg^-$"Q6aE8M8p'c1`:oWhA34qJ(`FgGmJ,^/U'=c+3>uG?[I"!M\r%`!+i^rhkq<Aqd!I'%p%=g4;WA/$b__[IXR7,MOYP4/?4G,MOYW)\@,),2;@=#?8fgOno"'+$1nnqd]/(+4&Jg7:8r\Tid[Z\CPGl\r%)0in1>SLeiCY]u+dL=+3%&PtF9/B1KL5gqF7>Od#3GeEjrN`]ea&9Oq;7(,kmXnH][1,?)LMIS,Ek>-<b\HPWZ,c.FG[o$>LX<:;\r%HuIfb:Td2BG6m$HNkB'0E#-s)jpoN!r&X(ZRQI<,d`o<i198k+DqZ*qf*cM#$Vi14k<r/(-dR[]k^@[3([VGihf9qLKN0u^XXJ't\r%J`W;_X.#!=$Kt4<&GD)^mAD/YAFR[T<g?Ns19aqdKAo3d;)5-p=p$jbUALcFL_(QlfUiSVK<Du8=(fFX!Uco`c8>tg,FB#^fj>Qb\r%"nWi,X7kV)SaWBKiM[siAY85MfKUu\E&NOXfCfYgY)*Ckh=rJRWc?umMtt+^4HQ^Q!^4c<$9,Y1P$B7*g-_M&.:'OrbkX?&[!@b5\r%;b^1#2>d/"U,,882+T:jO+>B'`'Cl&7CoPHie.6$(0!DRd!V/A)TVh,pj<Ib0rT-Af0\1fdm,RIj"1m#c-mA`'W0/F-f85)M_'/e\r%G8ie0@)()/]\+0sJ&R_@hU<DSKTHCG97#C<DlrJ3dm.JT?.I<Q1kJLpYA.<V)YogPRKecL)k:N<C^r8q_"g,9C)ZpI2:OHlrPaB;\r%b_=@Oh.&bR:+X+@oLGY)X>'ZCT63#3B=A!<[gJq6Q=Hu7@)l;hc<:I+CBbcX3<s2lgMbE+IbJP^+WQE`M@QVW"+D)u'cg18#HH=7\r%g2h'fkGVX#Wa67Ifu0.79l/+S#BHh</uR&T;KIkA2p]=jks=sA:&k=LQ6:aIiEOJ<aFXDT/%h>B8C=*met$]`(E\Mq)_3.&AK<Zi\r%Km!g07<A):5!=Vb0F+qB7BNDNlojSS_;cB7@ZI/+>jHiZS^BdPCq]ng@ZI-o_qDH)ME-Ef*6_BU<Qm1&mdpZ2(39mW3WCf'!52qC\r%H/_-S(epK\3sY[Yp+>ufQ[#17@igh]@)3q(NRq?'CG=6L%pgs_]#8&s!IU<`[cF4ei^'0S3Pa_iZ"5;Qhdu5Jme>(F?hq&^T?o]'\r%?Q_W.JJm)_?9h#'S7`lI:XG)Bg5iEIYP[N+_*:ua1r0lRN3j+"hug_Z&6&"-"0d??/X!=B6;M'Wg[bq;9^aZ:_$ZBAFI%&+dm"p@\r%lV@Oe0K';2221*i[YB8S,.ju!-XXYi;95GYJos^*73RHW8a7*j?ZRtgNkg]SR/JSHMbu?l_$F"e8JR:/@->sYO,ikRSMXj(LJT;S\r%9=AW^#Om%,K<T)Z7[iqH.\D69^i$V;Qr02hH;(`1ild=^f)5dKCc>^H(cT'?(;8PN_;WPS;QPe*jg8*K^->?jHcrT;*A@to0cNh$\r%:4[E3Rp^c*Esdka%O-0=0Fmqc%?PQDJT9,,&cijTh(s+5^c:Q>EDo0/#)pH;>;@tZTRmljVj[8d@%a,MSc0\W@`CK%$Q(6jGjU$f\r%B+(,bB*FeWXn1:5*,*ZmPqisni*`D5dk]>UVi&)A;WF^iYLGJW*6-_g&hYBeOl+>;&tVO,o..LH:Jn.B*gMlWMSD&(a+H-F7+3Tt\r%?:L[Ag&nJsC\Ds2XZ]Jud0@sBdFn]/$Vb[QWO2t;Z;EQ83:o\K*VIP[B:U*mYCH0n<N@Pdi^!#o<5IsW7!uDU?f>VP,bp3J_R6Ff\r%!=r5p20$FIliJ]7K4Q*PUR)Z<#2D1rDU*"6#_c)OMlZ=qNII;M6iZuKSJL`\?=5&m&,,q/"s<cS)?S/9NC=16mR3J+#MMG*YF_BL\r%OWq@T5^fabSHK&S!F^n^m:#"*DMoe"6+d2^KJphpYGnhiYf2=F4"[7"F%)WLqbIk9#*CF*_ulLSiI?u7nGVAX?&*>@+ncE(E(PPh\r%E:='7Z?%k%5.uX]f`cbAf,$+g,1*UNJPXCHLk,G=\:YDi#Oum;O3.0^Q[a6o0842!72$`:i2Z$j%m2,.ph=l8r@Xi_?@s&\*FG,I\r%Q-[TS6/VqThtsN<6:]/,YY2i]?k#bae$97EYP.o*74b"n;KH.>&gmgGm6L&]FH^FhX1u,o*P@TBSlI@i\(A%N7Rqh4rG14bD"-2o\r%ci$&RAi=C8N>Lf-_KNcL;p2QFBr(F!frLC?<I'se6)$o^<X-nLg5`bR$gMJ<^4:@<i5%q$@BE4HWgMHCF_B*NXUHXu6FDbqXUNJN\r%#h:]N[B`;W)!7WcO.ghb+*S(DKSAXe]*cL#0A:gLm.A*L$G7\MR`h_!048-ggRmnCm\iYRM27'`@4,&2E-.T"c0/-O^^Xk_9u(V\\r%QuUr@:=W$C[GKC7KjN,DWb*GrfW]7*^^2(s\T$oIK4au1OG*_U\#DJcV.q@L^K=h:dT4V;^:NL21A=#n\8g%-112i;'/F$h5C_<\\r%q&#+)GAf_4r9?>dm1uUYpk,,0'#%&40-<F;VeHke@M!#fYej^8GNG2:<-\t$L@Ls=nc<%H?LF;0ou/UE<<^%D58Ghg`YT7q*?3""\r%V;j2h'<up:rmGG*m<V3XG6K9F"hYJ+A#3NBMMSH!FL`%kLcn(#oV+Q8Vr.\;FG1XsZR-1]L1ZSugSlk5S[VF'WplL$0D!P!n'FkH\r%\!YaCcWVGU#a>>`Ra,0c$!j(h24_:P6VjP[l!P.oa.]@d*sf]^6:94i.lq[qn![]uY1YWp<\>eDjpX=#+kJ<bcFd.LE88"%fU4P^\r%J>Yef@V<ujo*+>Sm*$>j5\m/]Yqp%Fq#YXdG302pTP)`HfU4J\,/7%=UK`VH3Vbsg?KdaZ%:tTh5N^ZF\C#;/9X2b_a":-SbSbS>\r%hB%Fd47bcTeme8;$FXu"X]+T1$XMu-:ncO0(V3uY97p\d?KdOmh(C."k(PGJ5!F<-47bcT,dYjjfU4P^ctH")@V<uj_c9P@'Kbmk\r%5jI<N9<g:fIQg@<4*-.IjA'nlYqp%F@D,Hf@V<ujo*+>Sm*(`RjLV$dSK]L#@==)HFc)u*":p?9MOjRq-;`"C;s_^GG.rJQMI#KD\r%#KOTfhQK8dc1CMi-UL)O):#@7G<l[L-\Lbn<hKZMq#Y_:G$4ru[ITC45NYDpdg6q@dm\i7%O1(N^O>]$PcN]6*0)="oU?T.UMTu$\r%V7npMT$,,7mJAs"b8b(Lm8inYIZ5:hTtlk-oY+ruaeO*jSP<K2BCb-oN?)*&bL6anc8RPki)B"0pYiPM0AVkga(HHnYJ(Aq4OJ9g\r%PIC_Z"-dq]gJHHX^9tg^3Rj!;PlmO+k)_U$Ce@;UU"8uqek'.`g%0KVnuA)<E/1"(ZmU.a/=Z>a=S>!))]YpEPZMFV/Z`3&POb_I\r%0gt#PNKdLl;VOQCWC/qZ]5/p]8BOKr(2cjOkM7DK8FTlp$Dt4&34,,IA20@JMl+IW-<;n9J?3;lnK89.FBR!Mn=)"IqO5ri'<+=W\r%V,%",g!p&.K$9H_nE/**nQ"%j%<[V4"tGfq#<8/Cc:<%s\ZJ@8@G\u]cF_(Dnd#mnGR,VKcMh.::=LdHi,%hbFP6GBY9._dLfa)!\r%5rrW5B)6<hT`KD:9RCVu\C1Ru@cE#IHY%a/6-qIH<No3["q#rR`mCI5@IAUt)FE:pGS07.rMA=bJO;&D%Ob:aU[0*)r]%\E<*F*[\r%=hHJ4g_$tcg7I64dr(;80pLXtHTP67fg6VU`R/+AFZCq'9;9L%(YL-57$@rfGiaSU?:B)Es5T,$jdKE*1kQ+_gmRn(0u]*U@WNjQ\r%^\b/k%=0LpP.=6ALVe>K1!a3L5K]s6XaZXSVItf$^RH1905n&@&(4r==)cH@-)KWkkK(>!7&;,)EUYQ!N,H#>Qe]:*7<]?il\ot*\r%_.("5CI\"q%nOGLTC0;8]3(m[>4o*#O81c6SlXa%mt%#^h.jSj9?P3*<eD+&F-R-t>GPL_8:aEN@uHS*#,t:.24Sh^Ma)>@X?@Zb\r%#\Dt7KrG*7Nn1Ou>rPdJ>,pM?9F]0X#j(YL0-'#LWbhu8<B:Sc;ALL\6BekH21-6e9iX6&-E^RA2-%>nPS$m7(_'HRm`#V&:oM#;\r%,hi^<`$UhhYs(PD(P4uKXj>@D+Xf1Zq@&qEN@qWr,ck"P2)HhpA^FZ:?]D7`CkW8s0(.N6YtEOX@&Z.!5.5!_O$\,1ZcNKV.X29L\r%Ya6eTV5T09/X4_bmbjCC5g?E'mNT#)\'k-uN,ugW-<7R@l:^^s>_AOjda36+.s'\$6IJ3`[EQ*:ke3i:daZ"FHe@*6SsiPO9r*@+\r%`]-7BpDIrTkgSMd<)gZXJA,Fpc.W8F37XP$)Q"JHC'*TDe]"TiqNO'rBC@1B4EH!2DAq,s8p>J$>^1\u9T&!IgrYo107G:XKk:ec\r%m4Hsc&fB\DoRl$Qi81;l/iioSKC>","RYH?0n5qib@T(L\R0p],C\HXGLPRFr'pisARtES2HZ<!Wp#njcKQ*er!?Wlie,KBeJDUT\r%ku8I(#!<u4%=?lH3:+K9TYsPdM]tVr^tSk3<lH7iD-TcmM27mW,/5_R,>SQRo!5L2iJ_33JJUE[@f<%&csQ2"=eY'9R>$:1b6)Vt\r%b_$Hm!hd!_5mdpflQ]j-&=3=VFXDA`.C]Y,n.N7Z/!8+a%9h<SC&OmJrk;V>FeLE)SDq#3+?%SI$F01OGbC@clMN=m<F5Hb&Z?(5\r%eodaQc8VSVl5HN66V:@DE&+5rod5\t_.]U,B?"5E_d!rfXJ7-g0p!?[N>6QFPgF+`D$dnDl6>us!SYdnXI?j`h@f!]fV^%>N[%W!\r%Jj3;t#I]G9jubgEa.*e<T_.WS01hcfj%_'1lXNt/&fRa6qkK9GZ\c6ZOgruNKo^B0'<*@,!IsTrlWG#f(I&KpNEk8Vj)[&rR"X"2\r%Id&VD%TV>=E)igaD@0IE+SCd^SP!hBe>XS_Y4SejV5PO/]HB'pYn*2*K9eK";g];F<8Q$/aXThOcSj9=pnT5AAh%7MeV8EiI!'A:\r%MdDB%\\Al[s('*K)eRaf.;!Z0%7\<<@J&-$b):d/*ZE<(TW>a1c2J,K"dMID//nu8P+X=2;u-]^&eLC.K'dI0JY)VB`D!fmm:W4Y\r%7I1T.0-a)8W@J9c5le_p8WZ3^0Yjg^9^hj+lIs7W]D%$92cgX5_L:hc)<HqJM)r53)uK1,nS%c)DlSX)@bT6FaFXBr7=aaXZ63tJ\r%@r[[?`&3[s!&7;[Rt&]r9^aa-5tZ"I+?Jr%n^Za2%1:(9#LVM!Khd7.#Q/G/N<J>4!er_:jkl&i.X[?HoYg@*%#/3@\ppt!Vi/&n\r%e84m+@*Wti3@VYUF!d=[f)!rtNN?j6F>OFTnT@i!>LSDHBoT,qZu%VljI8!Z2rK]gist7/faa@F"J:ikAF+*?')ssQMI_oH_eOsV\r%4DLJ>/r/slmI@%DE;G^#ht4?=e`c>kYh%mLL?PQ0`uXU>BneWpk\p26^&\#+l(<3:BCUjR?2.&L'g08$8&LUH5K^CfnC\,P-E_l@\r%IOsF&d?c*Q5m9;S#4T;<$.XeImPQFL?D.-KW"6S\<2`!j)r71`3]iUi,Uq=X5:JT+7hMMP>p(1jE@(l+DAoWV3EB)uXWS0-+u`\6\r%6HJl7a,O-0a(fTD2Hghc8Up5QRASeRL#0m#VSW,b60EV&"Pog2)5VC<Z0Q"#l^I/2.3o^JBO,-9^Rm<"cDTTPG'\pI4eLa*ihdI;\r%_YFm&ZE%"k[U&dSR'0&r4PB"g`(O>M&SN[P9htOCC,6:u0']U'T[C$3AjKWlK'!0Mh4cn6"fF(Y%h5c>6A]C1#k>7)D'W?ohFJi5\r%QeO6^[3'7n)NiKQXOP[*X5QuupFY8;H\\V>*Ojj#<](*L9&$;KKhHG11GV/anj]G!"b+\G,$u@^NmIoTgqcb,h(kE/O,C++UP9s3\r%\cq>q7rRtkGo&F_4I$sG4lY3diJr4%2uruTI=i,'AJI6p*8hQRb30MkI-=&7\/Z)$C%lh.%(_SX:J$!liVdeJ`)ieTKjQ1>lOGan\r%(m,.a)d_Xr!O6j$M_aKgr[:PIQ>+u;#h:jOQAJ)-\Eid#&h<Jp(h&M0ZnT?n=N/W7je4-JG,l(^b9@a+?8iup3R5(d$ZMllZ8uA#\r%]NUKr:+hZ]$LY*Z+AfY.D*__gM=064Db-*Fi-!4:;Wp!V7&WO.rBVT7\paURe8irZdAI<3\NIJ%Y++55r1V%6rO^>LlEFIo.pe,#\r%<+8k)pH0jS9:/.<g4I3+pV8%I!,^$uE4A>'27LoO!_e5^qYMYqbtfaA[W5V?UOAsI\h]>q"9M`ABC2CB's#Fel)jo!/ub.plhaY^\r%\YO?Y?\!/S=$bo;/)qXr?7_+]](&P1cs_g,"h1U:6G*!o?Su&tCNPd7jlDV\>@7SIfi3>6buOQ(oI0mb6?T-T<*Gr-VhC:p=aj3N\r%(2H71c9b$9)*__\ojBP7Qo=L:;e;`g*V@OciNaY74hhn#%XO0"?/2\Yn$&)?VUtesg<I)X37]$._=.ekLKkBOaqK'r76h8D['3!I\r%p4SH*6K$hCKWc/79C1L*\cdN#TOD\?AY\T\S?L45%j<(%a]BQKMG3KAT&IQ`4'gV`6H\VUrQ3!n_s%r-[7-V\C%E4Ks+JLZGOdOJ\r%-9Yl4T.jXafmUjk4CQH$I8L&!bm4ROR(<OQ0=;K9=R>_.?U&Ob0/XTh)*'&lNF$A=4Dl=YZbB.nnLe!9qWp>h2o47TcQC#FSl"8K\r%k\ZD1!'I!m#DY7WosXsAO^?ZaBm]XR@_P8t$V<OGjeeU#(3#o;qNp+;3`Y3mZXI'`q4[,K]MLO3^=4_[LL47ddr/Uu9.`?W0`;2;\r%mV'Rp)?RXG?AT8$_OD]q"<DYQdTSf*<o^I2*:QBp+<op+W'MKW5tPiAS\qa,87O,4%r"b7BB[XOBY[k+Tc=VM<KNV[Rh&&=+K`^B\r%]ULTC#rs5"Y?(T$:A3&k`^>.ClfD4cgMN;%dBV?lrI\>K_j789<j"@2<6mkn*P/@S;R9=A2Z3[@aIsh\Fm732Cufk<6gs=E:E$L7\r%<JC=JHU\PejY2Ie7c=`J2*U&OHV9;Qdj.5#djn+2][,Qi'E/@V\C)Wn^Ft*lr=0tKYT;co?9A&)Go!M5)P;p6(i,=KXSkD1iip%U\r%``f5KDm:'#.;-Z\]lo=0m=@?i\4+hjYEMcG%Is37a?XH$akhFsMej*@:`qeNc-BhB110uH1G^c[c/*^6W+Adq!r&X):jB`k5WYng\r%rUmt&9qW`Bj3cDd4?PY03oVsX/hYjE=L9_(`^Rd`7]2.Xpe_nKWbqXLd=sPZ]J`M8382`V$EKrA_9pTDFR]+GDHl<!r,i];jM"J!\r%N]';aUH=lME&9"%)AD75Nc(3"dE?"@&;?260uq,X<`/X*5"71bRY\gNn%Fn$*2X8eD0Qir92%lueDHeHi+U$\kk4b=Mr89d.ZWRd\r%V:Xm"WoAhn#WffLL/f46g+P=qZ<5(3ZT`]Od=qXK`M#mI38+pomsm^b!.\u>+5(+BZkOJXr2ZTji+JZ35@ohGEq5WM2;$*1)Ul<H\r%gnX70<Q$1CLqN;T.ZJ`;NBHZg&kqbs=@,s-]s\dg1@P\*-mbNbn<Z*E=q$T)i@je#g6nD9K):\*g[\]m_QQU0e7bK/-Z?5\*4(@A\r%f<%jN\OBVq]Y69kjZcJL=gO&3-Vn/@F%AaLEK"!(r;bYpX(\XA=-m,!C.@Y^nA)p\P5jLeh/<lfYBn7TN#s+W4k:ZuE06b#?Sb]p\r%Zjdf'%)hT,g%dAOJU[iWTX9Yd^%^,JLTORgZl6uI6FiQ.;]kZN,Ub^d1*o%9"kbKW(S[->CgBjU$DEQLB1(,6(n*AD`TPVkFX6fT\r%KtcZVr$A?.RG32iDKJ3`gOdt2X\J8ba7$umUDLX(Ba<?Tb[SgT*d0V=p#O*l"mh6Xepbb<D^_P-`QUN.`<JUEY>bV_ci`=/cLr`7\r%7o_sCqP&GfM[sbtF=Zs0kE"8h9Tn$Yi3fFTR3XL60qY'fA^Y@ZF<Uh2oSc@$(:o`%&n;P[IEIdG&nB?+TM:iMY*+U*8J8oDY)?B;\r%HdLVpO%$gV.m<.R)sc'`4R1d%k''!"]D%P<7<<o6b2b]J@j>3B8`NbsRQZ"nN]l<[e*Yg5bmm$Bd-]L2FmR6=(MZ*[,S>pca/Dl_\r%8W64UH'/eOP/N`Pngis%-B5;8kY`a!N6-Q7-/Bhe:ot5oFc[U<'Ch+@UN*51ThLWP+&;erA?fV'VXmj:LbdYJCc:&Y/h!FlDPsIr\r%o/BJm?aFl3TtP,*JL@X4671+<q:+B?.7c5":78Jt71s*NSXbbd8X=5"o`@5DQF#nAa]K;3%,6N$ao<bLhZ[T>f[EKW1?jghT4YO8\r%:NNp3FHp&..5@5c^-BsD5*YL,jnS9YIF_W]TDicnYXA/Ki!?L*lAOrdcMTqmiJc:-:31m]nl/?@>fnu2ZVsRlXp1?P_[4W'"aCpR\r%aHcML<MGWq5,YIMTB!0Jf/LOgl$i<>)=tmdV4%')a^lm1d!Vp9])ChRVp)e6aVSof;jIldVfGdfVdrkVE6iI*[GDq_q,8\S<#`bt\r%m7a_kB@>/6mgjksgM.;S`VL!NCeBANS-#A(JrXmu>)8I;UR_6n]:m?Z9W$Q=@!=SFBX616V!?i=2)MSc:F8djhMfgJK[/V-XY6Yq\r%pn$>!R?D6Ik_sf,RoFQ:W*+A_RoJOMk_sf,RoJZlQjr-hDc6Dho8ko1cmF/Ams(%"pRkU#8VK'Z<K]kb8O]dJB$)$1o#I%RciS"e\r%cS!FeP=H$DXr3UdV]61+kdl#YS$^7heaOor-=>t'Rm>e_2u3CCbMGqpqae5N&s:U)]RuuMiJ`$nmVH"1\hL6g/SAmAEa.OU?bbVl\r%3V3\kFb!T]nN>C#ka3/<-/@/\Gr!W%@Zq#[K]7;!o6[+!SY$sjLHDQ2SRL\H<t][pHM(-qYL&,\ne]L)h]]rThH>$?K%bMuKioM:\r%ob>'if"BmXSDV0jM&#Kg;s1VD+1"[U+c_<^ULF%tp6$o"\L!^;"thLj3_Qs@8M_-1#Z^H/A/c!9n6SBV75a]CcY'9K#ot<:iJi3h\r%QEUuSB@Lk209,,G,W?l<2i#6ZmUR9b9eG..33n?0_,l*qNhU*mTApmA:/LUcp^>d8Ku[^u7^\]0Z<bh&'UA>"r)s#JEqh&t;mV3]\r%B]'j(W_O;N-6cf5n@OeU"h;\OF3nrul?93?_nNhoFXes[dMJQNR3XL6AU4G9as;fuM=+pNFfLp8^-!GFejk18PXuKt;KUW>;Q!Em\r%<;=%L<2WWo<!%>C8!ucCp%7Fc+_C4_`TfZhZ0K-TB/!mpG49o/N(Gkh(N9i0\NCZl0))^\[154GIGOi.>W>6>0Gumc-[T2Q$uX>5\r%1RU-s(H&2@5/)OpW(BSXPkX1<bGQM.iF9d9GEtEu^R.NW5&BH#/-7Q3=rYtnl=WPLI")`SFGc29QOi@bRk-BS8af92'<>uMA>W$b\r%1odhJnTPAi+ebpnjF`.]At9FB.'`C0=r/1e3<*"HFLCkgaVKTtBt\^SM)VtHkeVPG!ZO?+PRAa=Y+#Z$mG]_<G1-?s40K?Yi*Z$<\r%*04=jh/[5_H\]q7ke?Z6Hfn><n%A8K@4n)LRT!k_$dN13U@0*i+(#hHU;+^pa1Y)XP=o$T+2X@iBNR<\nEZLAdbj,H`IeghZJS7r\r%J/EQNJRO[(k^KOP#EgZUnVEe3O)6s.i`Pkdl?3cIOMDc;B65X[XhA[q+,Y2Znk6/_4c*4rlDrJ2?01]<K4fG,T_AW^NN.lBhJ.+b\r%X.f[BS<>'?kom=tfnL[`)N]pn&P3Lqerq+(,0@=G\nH$HoT1^k5nRDZBt.jG=LXpC+3Npkc2+LHKnZo_c0]F+0CQ72AF0lsCVoR]\r%$>7RVD<Z69jbIV(E[Tb%9f'1?=Bn2O\:JPGgk=Y\6=H7%GHkV\jEp7rJN3UdS+#EahN`1Xk"PI?4ai$"MKn]pOs/ZMpP7=9!9LZH\r%kdGb.#^YBE'SY+16>K(`/.!coI7m!PLXU>s#C^/[aC.Y2o^f]_D_dr^UM$2kJ!5.X`JLqE5,Ab/0cL!bk!Jkc8Mi,47'-&?3Mt<Z\r%UGe[\%"?";O2d]l`s4E32fe1?GQA&63iIs>j4(%VFmX/s@Z+->`\ECA3hs#[`bd8S/Nt6p4of@9G-4,j,eafaP[$U'W:$#GN/Om6\r%K/VL(.JYTa7H?i=&YCAW0a3%$i+f.uA;Fcl*;]KnRbY3ih>@EH1AZbrT4J':1?,j#S"Y?VPf@u[dYF23D)@<[CE48oc0^%#K3To(\r%/TgZ.@/jB'g]WO@$$]h],[q*T2B(irTMU:tUMI`3#'2Y/h:q8;[lBMbKsuhah]-Hp:cE]h1;-&`KK]g5\7l9V[u1=MDZL`WH%$<S\r%I+V&rd4q+WgE-(@:8N>G8Dl8,)j.-iR%d0[DFCKCTf\ZSh$?_586$mKS_p)XUi<J]Eo#sMSDgMU2oePHLf?6p46rlrNHA0qe?JoQ\r%0"'BK9bRX+.2ItdV'B?_HLV7n[kk2$aA1?rqbreQYh!I%G]\2Eb;G;i#ndc#7"^$d5$]4_7"]`pMo[^\.DsGa#9im*OT)=E[7kiW\r%g'/aD>-ii2ce,s2;S1G[2Gi(NchRY9rGuNDh"[-jPY-hmF"WaM8%K1^ck<6^U*'kG9PnebbY\q++:']Q*M6C$Ulsg)o2[>$Ap2jr\r%-\AXsL4\p)pMH*n_S'l2:_8D'F<>H8:@4HJL?M=A-MckCp>CB[^j6</V;30mV#p_o2<#DDP&CHSS""U"ID.`]VM0i37dRMfY+h.4\r%=l9\?kB\Y)$-3nlJJg$TYLD)3T+;q$-%9F9=.fWgC+k(B3RqduAbWC.j.4/klCVs7N"1lpOY.PW\.VI"DCJ[dEc=r[88_Z1#d50a\r%4OM4\V,PuNG3/R?iRFUI[d1C[W>4iK,kepO?#u@I>>RF38[&F#17Y3$KmW)'V_E&Q,.cX3o"jqh!PjcFqCWtt(XBu8$/BElBaX($\r%jL2$%HT)cUdJ(fJosUk"C^Tc4f7=a`@OpX;k[4)$[BeOO-TJ3/nh=s)Z*4g"%U":&f!oHp#E`i&5H?ZP=f;(<?'mO!Dsu"eZf1Th\r%rU'2bo=Vq9d$NMoqRsQsg;)`+RU&1G)3RTnNVNFO`'iDO+@n<pSBF8CgWR5i$!2Ck5pAAaXuXT?TTebShIn1EDVSlOW>gg0?-XN3\r%?"]El,KUJV2VUki[,"FX=]2#WW5WTLm-a:*Cc*-)Vp[&W:V3C1U_:m'*OQfJU_<9<[Z_t.,p?F>6*&C:<CqNQ[8eMN]omhE$![Un\r%>)d>uQ1,&([i2YUaUNEa2>$6AgO`qUkFg#>^1g=2NI)M%N!5el-emrBZJT.;kO?o_Gf1Yu[5l!U/gL8gETg-D!6@=>O8Au:9,%)N\r%jHWf)h..-E^_Jm@%5'[iKFS:hCDV)d&>XC=InM)eWe(aoHVJZ)qg`*:'?9flFH6`1%oo(ilReRsa1%c5_rFo5,_frc)N[cN$BHr5\r%\A%dt#8s<l\mHSUJ8FeD`C2-#*D'L\_DN.rL6DQT$;OE$K"F)hIYP;PQcFrG&?1?^#0IJsA#n_pZO<P.'7'ghR&%Ge!Hhj6SL1*8\r%b9s/os6)i,$BQ[9HeFO,e]HAX[G)@0:6<Yo:49Z=3k*n,:joq)Q^d%1lL)68:1,]l`cf'Xb+iZG/Q](HH39kV#R]KpGm^7\QN?tl\r%%'I,]DRoSAl3kttQ:FWJjl2hIat57R%!)!6.=1bEdA]?0IQ@(VRjYE/fnVd+Rn`h>_Jfao>f)8q5Q(2^#<tIWbTC$,YL(T+hY`N"\r%j;i\u6\f6UON]#KMAIgbKk0UUB:3,@;.>qDjtC)W4-mET]+X:mT!6ERP.<4WnUP2"`76KnY!Ona.p(#!k!B]](Yqlu*AqGs.jT0Y\r%*dGLVDu<pC'p?*qC8K!,f:GEVG2X1Z>`f@;45CR9\Pg3EY6'Pl52Ae./7A:Tm'>pY(:s@6Z-3r*"&Gap/9Bo@6WMVdQFSc/Q<&@F\r%@$rMjF)V\9`A1N_9!Ol'':-0Qa@uKMC^DlhMDZ)Y0SB%OdW`907G"89!5i$p[)PV2nHgkCW06^6Bm`OYmI>0*3k5=(4VO,AUh#AX\r%nN8$G-]qGi4ac.K$cZVt"1ll00S3n]U$`ZPfk3QY'egllmXknn046kH,#Wa?p;9NO`UDjh3Ir<(k0@u=lYI&8V?&<#J!m'#"b_*J\r%NM.KTApg9mIsadDJF1-f;;t`%SpG7[SUGtsk/hq:\<.6Ig(k"LHN@42RLO3;:LFt&l="UjSNa\I!-WYt/l#u;`bo/c"Ac31)k]P3\r%+C'>]_1<@qJ.cpJbm*t:9+`4rFJTR5JmuP)]dk\g!&<`n+Zr*8Y'&"f1P\Ic3jpmNTGr-/Wg[=l=iqmM!k^ZSR\_"48dTr>,!LT&\r%4Mhnj(_Ii<_BY_ob!85FQ;>Ni#cYg6^dh4S8&3XknI[R!DL^B35gI4%@=XE3#`nIcT"G8g+O-)Z+m8Wr[YOS8&Q#ef^dh4FW=eY4\r%']BXI]$d+d,J]r<SG),_=.3E>"O(9_n.?An&`?SC^dh4S8)Q,T@3*BL4@1/0'CcYKi=U`\_<o*gHrV*7\Rtik.6:9!!*EWO;UA5o\r%LG;'WTmMmcYk(IIB*s\"s5-W/*$,-&+R?SJS)=n:`'J.ukYR%\n-(_c*Xq!>7U%-T%s4WK5!jikPd*-HiFFKpn-C0%ClE7P%?CJj\r%e]-f"fC0&Q?upFRH[#ZS(,IcW-$TPt(B]%Q`#'P8'e028@UQS^UnO6Heq;aWK0U_cWs>%KfnB2"OoKGnRNed0A#`+ppc!Pf@fo#o\r%r;66O2:J6Mi:1I1Qa\POjdAiiZeDNaFm7TRkWqi'-C8&U++/Crh;H)&Fag&X:TGXE-/50A;R<W?IJ&h^,:RX3.kHk:BX?.h-/tiF\r%dj00b*+0k)5p%rU3>M7]]h0ejB(A:>5]n#`m(+.QP0X-S,B0h7]#7(YqB$l3_b&ZP!fs7Iqnl#DHf/>$i+Mo5IG3Y4q<R9P')6s9\r%"TGeoe&i&!,A2n;dU92W%"4f+]C)uP8UB9e/u59lPm2J=!*0iAPp)jmkd?M\Dams3$V<K\EkP@g-ua=>%I-9S8m88(4_Hrp;'=(#\r%&Fa$b;BXV*W0l_EMk-lcd\nfaLB?G7O)I\I"a;m91Crh@"^Rg:<#riPEpGko!>mlu#.t#PPM=g.M?hE&E)YFjCO4La$YNQu]D/HV\r%c7`l7?&luVp!;<oEHMKMKbb;^UC-'/KE;IU(e.YGc[U'E4.>6IYmHl]?<53N0d(K,3oCpA=N\-7,B&^O4nRSigEHsl4b]/U!nShR\r%n_+\8`qEkoYC<%>dD+t!?1+[DMOj:CN6_.ca;<dXB;YuV+:X(U)9E%V"k$d\SaclR5T8^!DUC*"$]mh:o%8-1V]=FPPTD=g_q[_n\r%h"SL3YEl]mL\^Yd+5X'T!9iha9oV2@rkL[LSpgC]QTl+RLAg)7cS,=Tma_G'Mc&QlToksH"gQ(\/)fVdr"d1/+!+GP!aGZ_V7dR*\r%OWk)OO)AnSf7(%>5HTsOhduFLDXa*&Vlt]V67mTR\+0fa.c8)q$+GW.NsG?+>70_9WWS8an`*2DBh"+F3ds1n\"%7>C9OD%9WMLu\r%]bM;0KSS2nIDI+W6BP5_>ltR"I*CqdQXar/qmRgUT:!X^Jj472*p2XO\Rr1qr=l@=EY^cbUg!iEQq7l^\"ctdHmAq=\s$EGq!t'j\r%.Z0"BjPY[g(De,Vm9(]#..D&t([r8.Z0m>;!^\'9DO?4L2o!2Hf.?RKnQ#.i-9,N'mj`k&?*s.Vgd7"=kFnA@;*iQsig$!/RBS.u\r%$SQK6<]Yuj(]*'KH0+0e]R7GDGA]T+F+3:i53:@[1UnI:q9TN']Y-qnRm>0AGOh.*"l0EuRL3M!+<8f\`JSdde_11$N&f@jhq$IU\r%-.^%:&itb<+\p[DpUeLc[>W'VqT\1Vq!/Xj=8VI1_Z\`gi3W8D3i[IE)p+L)O+-mb-!9lf),$VUmka`38Gfef678!T)L*c%H+b5s\r%n,%Aef"US&q!pD8k(B^C:UIrlcr;^+]E"cdfS;.Dcud5N+NYuCK=p%NBmW+nZa.P:8>"LlUbH?W0'c%.??=hZ-k6q:<64ok&9s_b\r%WILAl.FVlXLTOJ,h-n!"b$h?8\3aZ4=\A/&7'heE$ec-;@@W=>2RK);nWS_$qq25:q2%>eb?k">>cWn)^ZPVqI-C0a:^)[qD7/<F\r%-<*Ge2'd;9+dRtEr3?%"85-MA+LO+[V-O_OJdg!%CmW)k#gaLn)<"[[&7fGoM`dn]mE7"aiX-O&)dB+/o#b!cPk_E2FWP6'oWCeq\r%5Z7j[TJLk)hB8Wsjhn++,C*in>Ub*\.X>%F"[onEpkaDjL;tdf$<3$Qc(1,(^3-Ts61H=Bds1Z?=t"Qaa?N.d)b$jTk6+GMb/K'1\r%p#rZm0coUob0A6/f\W2iDrf:92ZD=[pL!ObJ_qiPp[u5aI!q*Hfk2AOG#N9T^+`=u@(pM'EE-l2-[X2R'>gsU>We.TTBJc(l2ktq\r%8oNhO?h!^t3?X7if]XFjqnML`;sp"u(I%QE`-XiR*`;Z$ade76XH^_D563"VR:VQ6lR.iDTNR.N0^%b`F+o:-4r=p]9ppS/?626e\r%:a3tTcHV<#-E(p%ec`9uHkibBfI6@2XeEak`kbAR,]-=(KFj)pk,e9rd;/9%fK8Q8e@D[h?NCso!ePrud!P3_<YW#pTIBL8p]%A+\r%&kF/P/'5ptn+k9+ci3/E,G`Vik*XJFoshjs=a_fC$KqqZ)@*NaE9"HLauG3\=dRae3*=q:^m>_&g!qd%mWnh7=1)*19er_<P(_1R\r%eBF(H]mS_0`g:&-qb=P\^b`L'/Xq@u1nNjfG!\g6g7J6=lIcC-hmDb?i)@DeGZahYYO9q\(u=ZS\=]C&\6,nRkLErip>3h'1RJ?%\r%l%-ZM4F:"qotF3V>B#Q+/>.:t]s?I$,6fMY$k1'J5liA.H2ZR:j&Mr&8(;93n+ponBtOf6[K^%YH[:OgX1#NW7]&T@cU-BN#\X';\r%Gdrgo05s_$n7D419`),&NlF6a=HK[[Y2$&J]P7m%JY\efq2-a/T#\k<B_kVU9C=147kkbU1O?)[QIe<r)qc>LMF`RGHsQNu_.8BE\r%n0=gc^/ahC<8cqOId;%'qE@Bks'R9<nmS@`'ONP(-(NHTcINJ/UE$LU=s]`^Y;!+`F*XaQ'"=Nss1oSRLJ8J56ShcCrCBM28Hkp5\r%l^S$?o[h(d9r,R>gnacZ2,l=O<5p[nY3,/B!L>YSRIrS,1Jg0`]68HK7Qfr#7WkT4%="=mDT#4>-f]l"faNba*17D62".'f]6@27\r%]R8<6I.>"!<Pc"/bae&Eq%/Tl\\&kT?sd.fgJHH/m#'gr[8((Q"@5M0diP\Z&ou6N9>-qND2LkQHk\c+?]ekEY$F"I?3N!m')7bQ\r%!m8(p`k(Eq@S:$4*KHl@oN<kdlVkosJp&S#oOWt#2nuBV*4uP-;oN:2<>u!ICb;f/0U9FUcO$UE(qKKa*<f@_mTBFu:'n-j/0N):\r%%kFk^Us[AHj3$8>j37q+>O/KN,pbcD?"K^T"SuqQaiq@o:=<e=*&C<3?gG&q9-\j3L[njdKc8,>S9/\#D8s2%VL<kmPSPEao[s_u\r%?OuRjH<\nGB=fRF_f?R8[6"k;Zu,'U'`,o5W9ut#9_W\MapchV4OY>';!+_EZ=?Wlf]D[ehH/[=g9EWi-*CDbj9"WXG57UlpL%k9\r%"`*-S"T?=Crh$sp2FD'Nq7T#sI";5[E%^_5j`SN<W%pODe$[]-O/bA_^0V40D2i3*-pj<]F27XN1-W:^N`[C4C.mmf6MD)$HC[_8\r%H?5RO4EBatTD,-3*E0X3k_\VIkEu'6RKQtgE!iO*<iS)nebZ60c,ojJV"d9jFF:R8qRF.uCh.rnm6t=HUWW?[XS#H"5*EM_m8tH-\r%j`ME*`"dMf*3_W,hE'dJ3>l#eTFt>Pl=_\fg56['q4.pG`^V)mV+0#3W%pPoRJ!qhO#u"YPcTqG;\M7[buc(8".I%%W%pQR1qF.^\r%@kZ`cZ(Xhb1&=-I*t>D2_&T)=:pfRh:n02b0iV)aPdnM'4Jmhj&>u,Qku3[44#dGC_XAce39eF:7@p'(F1d;L`9t]5OTWL2!^d:G\r%%)_#;Zph(t\+RtdNY+3lbk2X]ngc>D7.3bTh2)YeV2p`"bK2^0;*=4;dA(j.X*oZL&uh9NC2Hao^1_&#20g9NX0\MB9`n:c,>'3C\r%&NVoN/3COl@^g3<>M9RsUNG%WQF904$Y=IYV<tLie5^]o2n#t3=PL[bi[D5;CHGD,3f!*AfV8^fH1j@X-EnNM[I4+(,Q1-[+e.8D\r%l#O:(k$3ZM.mC4.VX0EC\p_CeeEr0Bf#^!a=3D_d&%I.k6O)ujrlXMJM!CbIJ@n$UF<Jdp#n7/q'VU2L"H`#:)9%>ufR).`R;EjS\r%du?Ptg+[SnF^&GlTnL5HeA2bqKG(#oU5($O"!sHUpEX-`>R*nm&P<>\MkqbbW><ujjBC";O'&Pmm?e\E:J#D1CpDH,/"ibaW1\fb\r%[[TXFDl0F:!MI$kW=82M7QE-1YqHmjT.I#._E.f(#QYul+<J03i^,3d\G9@f9:$/&)m)u^L7*9.dqG/sj:R8bYe,3ZqmA]Mq(nCH\r%g:tgmq/[X\9'^P+UqT9C*hQc^'>=4fBEasKeYC@oi_fMWWQF>0rc@E9pIQ1>5T+e'/u),;3fsQ9:mE.oCBP:-MCbn`)PBp0JpR#m\r%>V4\u3m[,0@+#5uHqe7ANrP-U-pmDOb$]lU7AO+UD/i?bTa97g:[?9!><1SM3Z1^[p#^(5X=jM,4&uk$o-qVfPDE#`=@[FlB78C:\r%AL>>YEOhXeUm\IVP/J]`H?(lc#PF73EUoIXXC0JP?r26f3hqtA?p4@T\e2<=&jTsfC6QJN,*g=KaH\H=:.DT-rkcb,lB.aAUDg[0\r%pT^9g<+iWKIo),?DJ]=hmBI.ZDIEc5+hZ2,X'Ip2AL]%Z<(O64oSm=3rS=,I9X(LX@.7Fc`WW>R4]+^>X.P$NdA_;2N3[59FEI"I\r%h8NCHUA&igbG_MdSk;B'(2ZH;ASmh6@m,'<[9d\,UI[^Yqe(0gaZDOerL>`FK3h&<X.KK"*kE@4XaUbUACBl/B_?FS>#;]'6Oc;j\r%?A%&C+CsVY05*#IpqHQi-Mf:E/celN6F*\*=[rsmJR%,tmm'['(RMWT`(2%\VOKF"*)6Z\H&_\W;uhR\\1705jbacq-*gbt5cBN)\r%8,))8>LWZb)A(X"kYD?i&7Cg]-F>i=+9X")1EaguJ.U%.mL"cU%3W%/XYpP0<37P&Jl!_C06-+aQagOjX\S(_:bpVdg?Obl;B"lZ\r%#\H\AU#JRRYo$5okGLmVhk#Jo'CLf5.Wloi4EhOjUEih5$eZNWmNPO'SJPQt-N!DWJLlAEgt^*Uk2EB0np<SC><a8[nC4.A[7sWX\r%bu9\5&,`"M.8Lu8PfBc>7aPD?ZD$LOe6QB4K,STu\hmonf"!V_l<(f;&_2#KlF.@`4EXeaR>e(>S#;:HE=JX'mI:mMePTGiZHQ6;\r%4*@I-9>-]`Ml49a0XO;\+DkoP?BRZ3*)_1m>0I$;V5cXHf+%*J0bmL?jjbQTYBfE*ceuV3-'Ifb]eHLo%e<7cj%SZa8JenPHT%`?\r%"psV;3cU89@??e1@)P*/;-c<$]8[iRMdW"k$-\4X"d/k,ai(hN9ld+fZYsGCFq`POiP0S)DumJM?37!YQqVfrQ/8n/-LWE/V0oCl\r%5`I<7Wtq9N_Qu?rgm(GKEurE"Lns]h\^,*0]3%L20ZTOCC@5[@hCU(J2^'=\hE4`tW](/_R&l1OU$b@#027le,G1BOHf.dXYsg7:\r%))m"(-nl\8]oAi7GCjN^>6V1LGBuSO`]JN#_9*KWb!B)5)j9O2SDCfcd?DuMRCTu+:,=sp)5P1WSS!%k1/dfZ;:M_eT\F=HSmg,#\r%C!^]GKW;h6C4G$X,R/?jRV":A-S[ku]nr[lMa=hV!cK:JemcuX*.=rf><!4+;7D2:JOg]a'Qf9$r+;[@[tARZI[OC-+Nch779@&d\r%[m3&P7,@F*e8ka'h+1DPid:T[Fj&`;-8!D1,#gLQi\Lh[1Tt\$?LrG>k1'p&NQpTSl):'pUT89C.;$MD;<HC<bU/_%M__JRPgq`r\r%?Bf_X"&+&-hk8dtQks=?h7.XBGoGs;R!En13Odf\1QrVd?JWD(TfOa#WG]/m)$of-A8+n;;omLKGjgrt)g9pu7C=FKp+:<r^'mn@\r%L@KuYo'T[0)#nh>VD]2r(Qr!eaFoORMA\DtO&Xb.k)Fkrke^X!F!;OlY@OJHKFMNZ;rBIig`:!urb;T-e+qu!"$Ntq!7g8lb_R7!\r%(YDpn,pC=b0))Z%:M=RgDrX_NSiE`OYKoT/>4U`ONF:4F7RJ)(JSFA3_MrtPqQ;Lu)$-d>+nYJg04bYD9IKeUJYk`P`[@8<Wh\.R\r%VRa=BZ(Z)[9jc?th]-5<bMM(U]tMnS\j)s;HWIa75b02,LpGj-!OD7@J101.)>)_A*=sM]:$'Z($!MNthKAhYlWRdS)]+(Y_&60]\r%1G1?M^GG<)nQ"HeCj`/>gD[:.qEPCk_@N+'i99)&riZG(Q\A;+7!S7Kp&)Qra;ms(80J._T7nm-*1b33H.+$O)QNUW+U9FR^g1:F\r%[&*Z5A]&mc7lqk1YceolAntpqF01Rq`IVOVKf3t%$cLLs;oeuFi.0`\hbIBRlpWu?2/H(+b/27e*'Z<6Rbol@+E[.\_u@PJZKLDT\r%!hYq`+LYOA.KJ53[/ZH;#`0p!AP/.^fhf&PWD%#(p(LG1R`^kLR4@iGBe$A4\iXT[dT!)#GqKWp>[5C8-;<'/17"e%G+(G&M?iQZ\r%\tFW,9pn(bT:^/cX$=G8V"\^;l%J5XEAJubQOZ/QHu<VK"p@lVGZ9VgdLW.nAe(L*"&h*JEV++r-d9?0GQ<Mg%,H3mrM6Ys@`+d<\r%%/h<UO3qu%?I,:nrp58_r-]$DC'hHC)?`!#L?S(f^7;hV0^\1P&VIZ_a$HO'VeZo1h.Ml5H+F2\[1!jr:R.XROra7L[\OE0gY<QU\r%gY7\O5]%sD^\RJZaC9IH/ukg_S."++-1lF!S\e,rEn0p%)S5"tRdd5\kkHG^7q`;/XTEuFKL;d'D\`$d1@#rGJ#gBBkc.U9CTRt2\r%EqHj-`hff2Y44'(d*FhMM#LH"l3P'K_eG\==EXXP<@\=2L(.*I#O8^*V)Sp]@Sb%(P>(qTp+s9`l&P<#bS?s0`e1P0pfV<DN+`/f\r%bPYu;ZWK-#WN:"lQaAK^Ja&DZq+YFK6V!cer78XAgqNVRK[fpsZG+HUA")O=AtJ^/lsL+'h?BdiJE7`n'ef/_r;lH]>H^0e?Gk4D\r%QUMdHhr[.5Q3YK=H.u4'eRSGt2T6j8T:"_kSJj6FG,+=hKA925EUhAQS<7m)?!c\,T4iH+G&b-&>&]td9q0n>@M$WeZS]5K68(o)\r%m\\7rL5_fX%)E*kO;jE5EkD?k>u:i+P)S/oS:W/f#5GoW`UT-rhLM@A'3.le.OAK1"Y.@Y;\%t:'u*$>jZs-jYVhG5dVM?U4`Yg*\r%3_8Q&"8&BLKcjL='?X_]P(<9'`K:L7*Rl5ICu:FNCiMON[ZKH'm'M+<6fN*W8&'%?M_#(74J\:@dJ^e)`$5T<I;(uf<"qpHhkh)m\r%ANOTABIDP;Za>p.nXY.[CXu8//F8jgC<4HWh:4uXS^W4_<b#C/dd%D=-t[aHAWaYLTALN^arXo4+Xje$2=!VBdKe@CNFmSq&DC:Y\r%P<Q:?pBq&5@o;U&]VabM,^.h%5F5kI(MoIh_hKUQ'XEV)3,HuCh!I00[4m@FT#_$[2N4A2P1Z"%7;J;/]9K@;=IX!:?@435Drc11\r%MN.!=4%AL8jg/0("'IldA+aR_-s!Z-<#rA'`Qif+a\6><9C/TAWA:8_b<]Z&VT>0sKfZ)e+J]:?35q8Z3p]mW\^Q/KM@Mc4;VZrg\r%l_HS^ASV:"<9G+"NS>f78_*8V=4C),ghpa@WC>6+k=Em,nq83S,UgP4\g[6*A@H4UDQST;QZ?0#2X(4n>4)l-Re.4RE>krTY*Qcg\r%6hBMp#."]faiEblP;n.i'ngKe9IJ*a+Vd(:*hUuMU7:(Yjr.3If$e*;R;7Kf,^rcZ+>D4m"_Y,>`50]Rr0F;D<mkIMNZX=XFgo;2\r%fXhDj%DN"AH$mNM<Lk9=cq1>QK-8Q!cqe+mJOOOoHL=d,U9/S1d05_MY8_cd4N]tb>E0)]B'VuLGj<YCb/%mgRB+'>ciP$,Jgmh?\r%NSh&K>Y=%kZAgK@^-rKM_93\JK8#XSgN`F6iHJ2`>!/aX4o-,\-FIG)r_sr7@N$);<<+DT\_C,pA',];Au(Ta$S5KAn:VfB]"k$t\r%%dL=D1#IsCOK<Hc(,e5Vo35;FljMu05'sQ3!A^#KFFckTKBcu!F?qV\g7]p-J>-`Z?!n7LYU3-YU'iNpR8#PVWI$u>/qBtJHM<..\r%>Q@?s-I;o3_$.]uPqAaM_.\luQ"4pB#<aT^TF6A4UHNNMBb<dWk9iP3=<-^JGtjt?/<9F?r;7='%'n8%R'G(-(SKSVDm[RW>`tr2\r%*f4o,Mo`!-L^bm((-PJ@m!4n<7SIsGE3:TL]"fN"5b>ndJ1e&3/m,$;>98/>!Z-A&1P%0_38YtQ?gPD\%-DnSO3k4rp\k#[ZhJh6\r%^gCPp:sNF5NZY:@Dgu,hd#7*R3_n01>nG7b";g:5e?mU,)peT7W*_D*ct54K!;r.pcirR?W!+f(4E1[5E"ai+Q(SMu.o$IX?kHYJ\r%XtD+mjJ]itnD&41,"DehfW=[K`^uBLgX^7H6?IcIE5AF:dm4cq3X,7PVSHGcB3((b@^;EdbVH5Er\7?-XN'J)p**e&L)(VBTSkZm\r%cUrLk"'r!Z83.CQPbi?\Teu8_Nb(5Kkb7.<c0jIq8r;<g9`knH[HQGFX*>X[3F-3i>k"h%2i8C"^"3BJa$.6k!pfm"obGf68rpBa\r%4++fO9\FI/4c*rHN\ler=pqM^RSm?=5It>XZEV&^J/bP^F)I5#%*JS5+^RsAl`S^bB984U;J<W?Ok]X-RkUV`%Q<jTk?@`+jcs&\\r%]$[$bGMUtWpUF1Ai+]dg'Q6q@ec?qIY.IHP>6fXhmB4@Q.GLY7/P`b8;3^N>o6`Q.ObU%U$@FjDObWjm3PO;,LYjQ/@L7-pA'7Q$\r%]k8JHXorf;+h#Gq<Y*Zod2?pZ2J5*+a7]qQL.F\(Kut*p"gYB:^7;H!K;24p05"P2\@cqYElK:4h(>VqjbuVHWaXK+@_W&J-]<s3\r%4h\Vf4,Q/Hr?\?$pP*PBE(JN[ag`GCor5c`OIn6i4"L4EKEP$ro3=aoaA3nmZ&W=0Ig5*hpU9N[?QC@G0FN,E&1Z8PYt-QurNQuu\r%;=F7^)>nPJ[QA0RLj@u`i!/&)m53Hu_VG4K>?$n=MXJ'$[__YFI+e6mgs-YjZJ>h2IN)MH[b^%H>`p$b^M9^!qhjAM<Ohb!+B<$g\r%O(@30<d]ieR+6rY%XJo#5'5:tkOPdt>*NlJh<5sPoEKYYD*@_8?/$C&PF#.&4WV%"QabRa?[jo/D7d]NP0#nQH/"m7<B=s._b#+`\r%or02OjRP@_VdeGqQhM1p60S,2]2,9mGR7Y*'3'%JNU9!Xm9!@BE:]J`d#%'u[/*aS;,@Wd#IC.hqGc`U.MG'N"=j6R3f-/`,_?M5\r%Q')8:]@FF,/-NHk?TM_BhU`\V?nl7a:dV^kGGhfYcX5^<3")=q45/emh4;uW4dZLI[6(32Ha#l&C3N9Cp:.&FV];DVFf0_]5'Q=P\r%_%9[L7:Q%qUX)NPmlL`mG6p<.%.6hUp="2/$H@t/K%\G]C4TN'r,"sL\@`bHdkV%TN4H_k\B2tJQf^4"TSCt9I\hooR\RA2HN4Or\r%FB*42'J+0"/+7SCm0tbu^0BTFebb:4U]C7f_R'R4U3ViP$DSa9?E&Pk<#C<`MA]]]Jl9IoAEe+d3%d/?H6Q9l:O?bZMNQ,q-o:8B\r%4&3go>lP@R6G?82_s"m)TYSr8!i$G+q\"q7*KD-3!'s\:`1Ta?-0bSWNck6:P<3trni1[q6['X?5j`@g?[]Hq)?5m^O?NS.hi7eV\r%J)P5krnh8SGPgFl':7;kq"_WOL"0<oe[`>i@!*5^Fmsdhrc+.=l7A[pTRo$%X0[V^e"5LKL"5QUeWj'AL)US>eYkNqf+b;]%omhJ\r%V2\10n>[UHc#C@(*`],_*]/8>(/T-E^![ci$@%TZ])2__$ta9#8[TABp^9][g.kc+?g:crj"FeI+,8>%*tc<R/>DF:]l:Qe\ppXp\r%DF!9:UI0rY;4404KrTdD:D9rnMl8[YNnISB,suIXbe`QqU?[upr_?Rd**%b8Z)"<Z4=s)m+J#hbU`pEd^?dpP:g&Q.gD@`m0_S#"\r%,XEG<c[`&9g\>BldZN$eFE9/IJ7T@,gDNJ><;eg.T_!Ah5Y!'kMgc4'b3ATp)kCY2\:Z,RoRk[84Cf;us.L*Q3rS%>ZRaZ8#Ls!"\r%QiQH<6r1A:#l<rWjne/eA6O]\fk02"NqD"?!r&5/X0VCs9MqS:E19G&aj`Xq).niq*XYI$>UR$ro;R><'!V0eOI"U.*iH+ommCh-\r%VRp#pY107/=P2VZHh&KsgljJK+V93h=*+R4rb`#?c?TX8d$kO3GuX>D4&l9CGBcoPbp#UR>EQ'aJgQ\cG+h]UT[RG'422B`JPMD#\r%FK1.<FlE1fff:IT>:Z:;ZP)53WlZN$0tdkE*,)SYr)7ZlcO-T<E&'6S[<2s_llEh:&k-!4kCIQDi1D`e?9a55^uG"fe/PEP"GMT+\r%gSar,lhhh&F8#G0ULU]3GuG#I;Xc<';+fP.8mn-Q"Y#:DU-!skKVt2LP`ktfV9'GoBBrWY4n)b@6n,*ePgCG_)TMVI$<!&O1RZok\r%V2"_OIt9`XHLW<1'BH9l^d<%gm/NfXH&"gMl_'#'A#7'l,Suqh"`DG*P-u+R@arH!#&h/SD1sJdMW7^:]a-(gZ_1mu7klP).rNS5\r%E!%Xt'GpF6lLoC"9I9]WYmhKHG&Rj*^Ne)!UVCM@#l'5$E:O;+XN*f\e'",J$p/;SGjo3'@OrF&p14=,H3*^V29;;*8IEsMihFr.\r%_%8d(.<jLQPcm>j:hX3<Vq;PKABVu`iFiA_[Z#+T_$TaERXFAhJ77*YH#P"GIdh</$l&7,Ra/]is0U.MZDuZaS+\A9l8a*uLPff9\r%?(_Iif/sjF!u*JC8u\g``C%\b1`().=1(*iY"KWd0B_XB+-k@_j0a`g.bqksLNq?IjM5-;73[Xd\d4KKj-Q"eA5sT2NFK_UJ,,#q\r%)76^?+ueNP4c(I$!%$3Z$5=<i>]HPKr)(;^LV?Ig^-5kJq.t/:6CWBk^\t`KZ-td6HIVp&ihClP'P$@14Jk"`^aT'Q@7<GZOM'.b\r%5(u,=#<d\3B=`9-T&*$@qT(@U#-8oSnBm]h,2ApDp0:p`kU'f1QNb'eB:HkDAm=G4cZBIEBFAgeVImDE?Aig1VImD]kP4KE:i)N8\r%;bX*#7^6C!\rR`i2Z[p%MR6L\c?ssH<TE_XR,FjFBQ(^t]r<Q[f@6L'9coq1-gp:Jj)SJb\IsAS0R9ZSHm\gfcdsaXq?G)o^FHpF\r%lp2S7-F.IpE-o$%Hg'[3j7[q0"=iC(^#cjC[mpSU_jr@j;Auc&JOH2!6s/LCCh"`h:-U2L(UD=%B&1gp@8_6VcsKrM[PH))Y#q>1\r%_kcR6@<]ccB3!sbCr>s?VTE%qm:gch<Of^OCp+%)PqeLH:":LGqMggSjGHE-B?hCEn68D,(af=DW^=tl2'H&C!TPZs-`k3^#E5^j\r%+)j^j!0#+kiqV^BQ%3l%Lp-o=k8WRhlmr`4L3mI#6I(D#SMgE:b,Ph/&#B2m4qj)-H:u[C>jV-i(B!9Bim!F]hMNrDb0_M['a!VL\r%D8<YR88YMX\Wf-@jm[\fpXP^h^IFf"/;9A$c!#^)(UW0-!fNb(mQZV\rns!%^]Y7VfEnJm5mpXW'-X_E,&$Z=%rf4\0g@,fKP$E^\r%#>dap4n/-d[\u(,AB_Za2:1d)B`Z:.V;bcO9dZ3,KXe!.PKPFBgf0ID*W=g#9[YZ)R%XZWjR'Pum0k;.k1EF+g6J@2$l@)Em^sH3\r%`SUL%I8E`,^CI8ti:K'tMJ$j"ZekF*qS2,pH.(`7(.8++pk)o+mc,+KRdir[rSQR&mH5fX7PEKaeN^7PH^3?/Ug"1S7.6)f(;#e7\r%*O^Z@$7n9^>^cMcE>R*3$o%'GBbBKBLHqoY4&a_q5mKa<I%&o;;u\tF2#[`YUoXB[q]O8R3MM['1IYdU?gP+q[8bgXkmA+'b)R&_\r%'+.G+2FkmSr$$g^A$TN&k-r#T5;c6J`@O6(2<IK1eA&W_#X.HRX3em_9`]NkSmkjX-JU:M7ci5qLD/F&:sLR^i3SRWBoi<&kJUWF\r%%[@gOA3+DU8'Bq\ONkT7+#T\j<.:a>/![4*a371&+<?T,aX*q)QSPI#@[L,G+-;QM5Rc,V.d<S/P1XZ$9-quB@8_e5@JUuB(a`5g\r%PA]*X]bi(r]1F./?@f,urEY[VX)f^-,GDm@5R`kA2Br!*'p1A?0`Vtgd5cF`Q@`jN8907Sjb-ABdRJ-Hl18_q_"h(,#@IVod'jl7\r%1d1?X5Tg'fLhfP_NU1_MbX30?L]CAB7P?ud.t9X@2[eUqZhXr7;Y&k,gGKCfD[E?B:@,`WncO$G%el;ZUKLs58Bqp<OBi6"`<,4T\r%.,Up8)e,upkXW*F<0DS9crs'umH^gIG[4lA?(HpYEJn#T_sB[a/SY],nYP)f5I+s-1r5/T@+p6Z"pmP=#p#n('^m!,]55Q<a%9uB\r%kkQFb7IB(>g?CGr$&?.gJTa(Kkh7EF#O3=NP"lZs[3iJgDXOMFo:74R(8n.j/9Rl4hu("c&)T<>;\e-fLWBn<HA);;$Stfk@4oa.\r%5qB5&-Qf_4`b^-4JY&-lTn3t<8tlFB]L@T)qm-=bB<&(:mLi;Zb$Kp-J]Z>Ckgd#EF0o\u_tZ@.G9&gNQK&XmXWo,.)-5q^Bjjr'\r%2g$-pU3f]eHtlU6p2)ku@81Ij;b4l)Qq'r.':>a=*C>3dmWedE#$&L]U<Fh6m,/m:6t6b%nD(M>6EK8YU=b05lp2=j"JQ89-WL18\r%E0gr0KrWn\582h)HMU>=7hW<CNDBTA[5MD+RY#29H4X@g9.n0/\/%1of7PLH`m)")<I7Sb+W>\=6&X-0+W@Ou]-t3$2*?\9=Ous$\r%!YadpRcX:m4nCXmVYO,ugd6/0IKYLY@[d&aDKFqVjABbcfoN).[2br!.boikZpq(26h/Gtd>t6f7RTb=Z6)reN@=U2B_`5ld,utT\r%&bRO<9_f8RN;\Q9nkbJBCWVW^M0<tqK<F&tr3*5aBK+>skYl2JcImss`%3d]#oJs1;33gB0&0)H#mL#VR%JgY_*8_>1gga<L;@t5\r%;SWTrB#:uI(BiA5*X:*\\Odf#EGaL@k9a]\Ba%blpeDn8.LY0\9J`5uVoAl]3aMBDcB)_^1,YT>Rl\N4>poeJCpV2NQ-[7SW@_k%\r%:Zs$=6sMlLfOjoZ_?GtTkg&X(`Hgpi6&YIXniU!s:54nMoY(@X&;Qhgr>ZXC4>fPQaEGALL',12ECDV?C8:R4,H`F!>[`DfG/P,u\r%RHS&;EK6;"<er4@*[g*k_=5HHproZMH\hF=mrrL'qreM)bKF#ApC[9n0HPZYHb4d<:Gt#BLU?Mm4:q?UpQGsq9V[*O?^W&-M8'>2\r%G-)-/=*9t)^].;#f4qDF6,L&&Z!N%u=KM9[3E:sH(>r/:Hl?I"KcamQ/e+jf-V1c&bHqH=A)Ul)^G7T`7a=YTk3EkGBu9n$OYK_:\r%^4l,U+%Oks,A>s`H/f_*]_MaQ62Ssh[;BtY-5X@81]QsBJki>t!FCm#RcU#"!`p3/V%lL(IP*9N%WS]cFo.WA-@*d1O[AF*)W_P!\r%5LX?B_0l_@HJXjgF@`Be-<blXgQZ=[i23+k/O*Ynm7cAIPI:<8:NTch1.q-[e[gQW0A:1:@:__HrN0h*iRqrr@Dl%Xna;]M'39Ep\r%4F6;J`&k15c8+eQ"KEBg?cNlXIKoaCML@^;7KguMhjOXc,F4]^M7Ud8W6N&K;"LadOgNr,],X4\gl]rVg@e%bG"6F"=G8t;i-h7'\r%F@>Hr'lO&Q0u8pC^lZ,[1&:P?`mds'@VUeEpisK;iXM-;6hKFHNaRGXK1C*U8d4'QMcZ<iUL'j_2*eHW9T>IN]Xnuk'SC"W=Zj!'\r%<3fb:FILPq1M_esN]#,bh8]j=_(8#tVkrc7ZV.:c0%.3ulE5Dk5!c=P,BFa1(+W)d/Tg_=a&OC/JInR?W8rAS\]2iHR8``$a./;%\r%?XTef],!1uqkImXVU;T":87aB]0m0]!=M<7S'nb;,_mg8B1-"lEY,)R'1::sj"O/(>j'-J:cj\0j1?J7@&Z+8NW#),!nVHljspu(\r%)E2A2DHj.G&pF)!oDV7Z.!'ZJq&eQ]V^J+fe6,0=j&Z-Q&*f(pH<fZ:BtDK!^;kqf^=_NSrikK`+jO*5Vpn9WE*V$jQr6D>E`3VN\r%&D^b'$&H31Q'Y\*8!OEJG8M^/NsZUY^DG4,dKZ&kp/Z4D-;Z]7O/8l2'I4%+15r&_.D9u-l/T6ioV"i[UIFh6IkY;gW#R^je6m^K\r%B$6Bg@04Tg5c[aK++eghJKIcX*t$h=l[/mloH@WMJ/RufJSkFeA.PhNXU$"Hf`Uh/OH822XqrP85BgZJ360X$4Z3[u3KAZ,@[:)<\r%[+>2W]A&<t0`s&H,Uf7&C:jrHOR;>VR7Xi2N+C(2)d5m=nFcKj-&3!:4C?V5Fe*+Zi>+;ZpBGM>FgDEgo?Ar(@4oj6C%G&pZ*$mg\r%0JAaIin&*-X#Ac:8"3NLlrrS@<Oa4g.@U+RS-jsHlm3O)?.l(d68*%cfG.3g).:@k6qVi?S.`C5_H4cZ?,.,^+UtI]8;o_X-ah`b\r%:S3:;`@WKXg71I:BE60t-k!VV6"PI+5R%%j+_)'\iXBR9+#,^*,%j_FqnO8Jb8JgX556R=K/5KSrX_'e>[F^ZNUP8T_[iqUl#?o-\r%Dq)A9:F*F%i!`']";(@KX@aVc?8QWr$/Q_lS3a8t=7*S=`8QL:A0@B6-uoOlp%A:Llhf;c-hI":_A-,JbJ(\62f?1LHtbRar4hdp\r%FaqSNLqR_H#<DEromD0@2]+9jqm_QK3!Zl!m;q;b0eQ.LXhTjtB=._))!E?XgZ;`[h;sf+^_8&7mO``YS:*)P^TV',P?^%JL*9cF\r%I&Rm!5j(:7BPkqWiMeYXV%p>5&[E^!;/:M2muAu7`bb2.a"X2ekGk:X;PhN4iI=[86PhCm8X5.FEUtnhVYWX;\$QjUAZ@Bd^'cGG\r%>LcFl&4p5"Qk_L1))C(cP%P,cG)!C$6A9la(g.n\/%;Y,=u#UFOK"I3X^Q3urfqJK/%=nV^XS4_Mu9fKneHJ]DP@jA$5`7Lk@_[W\r%k$T60](mnE!!W*>YmjOM";ptd]mi5JlD<%UQ*=NN4QkR/of!2Dla]-uC>7FL<BXNE(fkSjPTPNe`:-5tY![paM&:D]JMS-_+8@uj\r%*&:2L@[IUIK,OJYU9->:9'ds'K0T[I%NE?)<:8+\qd)-\mIGYRorOf2FES+oei1CRS8t7TAp%@s/"pq80.W*tb[W67a?GnfR;Pj6\r%I:,FFYUK7MC8B"!m&&\1.t)#ObBSiomXI\2D!9:\?XN\N.fl!iW2/84.eX=VVh2D>_0928g5Gu8]qiJ,^8!'^4(hYec_fdng/94N\r%/SJFVfLu4<SMTVSns<``gm.e+-YM)neOgaWSMP)96=W2l(mHudRbq)iE:/'_bIY`03+CH(cI_ZC!H.:g9e!/<r<m=$6D8QCGj'(q\r%g\J!9l@(AnoJs/c_:)^`OEQOsh,5;i7577>\-gJEcQ0Sq<UoG&jU;3fI8.'sJr.^,^P,Xhp_p8sN!VV`aj?U!*as.dqUn5cV=s'\\r%]kGA..5e0Hd:LWEU,2c=dnWlIWh'u-82N]=%c*m4dQDmd8ag@kJMrRcd7r9L5cWok]o=r-o%",J4Z9aY9e.at,$FOWW5&mCmMS]=\r%a2u:Eb8iWN%5&3@Y6/Mg@m1T"QWAq1r:E=\FD6F]R\<ih81[_,NML/#\mFTS@d,eGj=88p.$ea,b2n>#'Y57E?T[[pM*#mV[A:lm\r%g)XT*O6V]"erkugG"+t6C$?e-QaS*ddR1$f.11sRm>JEW*m.*$B^Hb:U55&0Dcs<K6p.]281,9.,4/J]!V'd68tbqCUfTF.S8MD"\r%XH[N>ldVP+/VR0MI=#Eo<sk?r(.Mb(<skW_^EA8=\*bZGe<F=;",OB4:q+Ha"d[=L=el[!6FWDp/5h<K:_jP^,1S<$^Z'bp;McTb\r%89I05WC.?"-T`H/<9L1&l\I)9m3J-`7J2LW]!0s#6RuI;p*e&[IX]R>1#*78kZ<pP!:)6J%D(KknU$6^>GHu:J7O%VeSGg7n=k3`\r%,6Auq8g^!#[tJ.D=(hq(2"ZErG+m1B!>]FW3K2.m]]pUg)dCgJOV14QcqDeq\b"\2HO5*^b&+KD9u?jJJ"Kc'PV1a04o%Vp84och\r%ps>*L;XI=(N#<2jHD*ZV0P3QU[AAf`O^L;Z7I9F@@[+Uo8"LC<?@ug(fe4\>ig1b'<6Ut.2D_,kbj*SSCn)ae&*Vcn/6,=Omk^`a\r%oN,h6BL=`73Ep$,Z3X_hb1RuTQ!=Yt*_HO\lr[r9$XLZZV5H5`IsY$(rm9V_hMo+(f0-6nho/S2l3P]sol&(V9U%`U0*:Is^@`5e\r%O%PJ@YWI6ImSE1a9^0!^cuZsImX'+PL1(Z@9QF:"@4=FPPqTGI&9&bp9akrYP\+$+O^[iL-Bi<_Kpt'DV'k(Y\$(9kWg.^WJU^MO\r%8/h:lcA7SVLn8X4C9=ShQ(l/h0/lPs2Bf\5VjTuYPpNJqABcZmG"khMA`3q$<AWr`AZXe5X#CuH(_c1Oh1%/Shq%(0OkQek@M$)f\r%_IS(M]k:_F\J/2"fHM,64\Y7Vq/,dO4C9'bgZeOSkS:9?o`fUWZhhqZH?7d!mZXY0i:EGgDs#T>0'A+$p&>jA;J",;2tQ;Dg`9U9\r%Xei&"A\4qLRmOHR"VA\#Mt]q`p&0H=4M@'ZJ];n$(U62d%C+_'?Q,O1op],O.e)^Had''$d9Z25o`rdN3'R1/T9'r3ZaE$"+&nmQ\r%Tu0%Jhnt=jbm+[GUPh;*"olUf.<q'h&VA8R%-aUXV=C5/3[8c;YV:Cc)!O==`_O-I7<GC^8L2%F*`?pS/S9J$NMP1!Q%^8d,'D,c\r%0"l7HGJ5I[mHInV5?N1)(:CRu:(1hc6C:_&EImn3'7M;U,>f0Q.u"MIp?NhRUZse9dFf/a?l_huOuch,.\%_T>Z,3-5/Fq_gNq#u\r%dM]EDF,[30AZ)kg4c2Y@/a.$4@$IYks4#i_Zbi\'S.(D5rkdDM+Pu#7X"UqH4LoM<Z98_GqZQp)*;H-npsBNni^`4q`uj_WkjH^_\r%O3c/:Yi19n,o\;PY`,5G.FuWi`i0i%.E0m\W[]f/H&d(jaZk^Q)uXQ>Yg`Rg"\C"X2uf[2(&4dlIr4?In>@Jd$#-hoAU^,$OjBNf\r%C\Qoq-AK<0.6:Rdn2rZpOXVJc,lo5l'j)IN-t\i>:Cp<5%C/4o7d7)6!HC,V^E7n7It$t!BseL76T6Fn_[,)=I(u6YT4Ji5=S>=n\r%5A=7)k(k)_BS%pF.CR>.2O<)2-'(ijI66E1f5+)<q^1Wp=cc'H:GK$VTtgp@I#_?`:^Cu=/#l\d</g6T:.,h8Jr6mBk/^-IkZ"=7\r%<I7SJ:DR`"mh81&X?Hs#b<950)N)X&D&*Z'#;AUXq[$a=+R^W0>/(8g\?5sRH,ZTb]PgTKk3M\UXM@S3kk>%qr_'!\QUL?sM8C\S\r%"[$6oD).g&.r1BsDj-_6<C"=CK*>3WHP6?Cgk.>'PCCXB&6]5ik(+t]"P<kqn322Dhp5^3-En+"`J8mRiQqe#^VTRIGL.UrTmb;H\r%oc,^5C!2BcD0D0UfmI`8DD5P>Gu*.``o7@kIM(LIV"%h/4@/a"nBV*q-_/:(dE&O\"-DDncdq$+.tM$dPnR"DfOHL/NL^fj-fj=r\r%UFg4t:R\Q:_R.)5M1_4MhoaM@=`8u3hXmcW#H)6/^-Ll6L4/##q#[qURXO-7q*JO$l=&DorPE`1cK-?cdFiEa_.<Mi(7hHk<sjA$\r%ZLu`H\4b!6PI[A8FkYo)2Roji_[k1F9L-ttXD0gF(7OJP`#K-eM?WX/2\ZWnDAaMJ:9"X>;CnL@Z88J;H/+=\8/Zlh-hSHVj\u9H\r%#/A3N=LT9qAC<6>*MELr5Z2GGL9)=*$1*GW.r*C\874XbhZ\i;EC>Dd0[AabB0[_U?t!E74TcloR025ARg-fR!t4MGSR+;A#"4%I\r%(.%\S63E.7H8Ve4fBUn@!KfM5Ptl;*D?C9m=)&TaIia8R%p9!-]Q_O;=R<DARKJ.D:9O^)7@l`=W92,Fl^Gt2gk9C%b6Q<Ng)O+@\r%j5s8X3!V"I1)*mP.lD=^L0F$Q?'R=\LSU(??'W@&lB=XQm]m?@^Lr=OBdV5$Xtco"PYEt*oG:CRe+qu!"$Ntq+MkFoe5Tgo$,]h)\r%5ZA$+#5@md1<NV67Tr4.R%\7=*RMaI_Wu))82A?m?di/Tj%"<Fg0q*$=Z!\n[dfWCZ],?g"ak^(/Y%4B,`8K]^6CdZ0V.hD#HJB6\r%f_B"+J<>XtpRorXG^!M)6f7=#^?lKgT&,qUTJq'u"O3L(hAf4ciO>`&o@p6YdXMNZc.^RIa7H($C![OHOQWODBjO^i;b\U*i\]2?\r%:u$kNSNlq]q)DgY9!>?ViS_eL"]Si1[j<;]o5+X8'=<E<%LKM[G;b-`>!fEl6et-XE8"OBF<XG$_MQ_)S<mkL:$u]X1Vrai:1tit\r%B8V,gan(q'Q9gigTkV3@nU!A=U0?M.+GXtV*=-.RSsHNYg@>ps;tYr;4%,eR<nS]qce@'4CBA^8"]5$^ACIV(M/1OG<PXlh?<i]j\r%PPu*RnA7r6\fU4Zi>o7a/j,9.2\gQ_E^4GVTkE;#qHmRdruA5GKsXH&T]#M)hUT9Q3SVf0l),?IkOi[K#,=2";"/t?CtK\eRD4j!\r%7A+B0Fmnm+i*B$Nh+4B!c6YoBaVBJET,cC*D:+5r=*cG2->EQ\#mW7[qf`pPP5IbCo*dZJRlLk?4X*2hU,0?+[.uu">a*<4jY%jg\r%p/`6*U<<%uo\LViUO8DJDH#G1qD?!COWp.I-XDO+.RPF,$>FZTG'`m^h-LKK>EQnt70EB>RSX9T!eELH7NcDroaK^t\s;k=n60He\r%M=%cbEf+VlpULQEbYYj_FJc!qB;eYW7qIS#\4$LII[qc'Jd!&jVV]<YA1;@eLT1$2/5LTI=Zs<a]%?p9)h^=O52IX(DMsT8YVV*2\r%>)!e>Kro[V80)RtG.L8+)l^^a4RgobDTlYd$P'YrUTq]G\d;D"DTZF6=5<.G=6fS-PT)DM)-?J^$tKs@Gp9W99Z-Cfa5uQJWHk5_\r%WWFUh:G(mhb\b4Fb_!OQ<-uDle_XnSDSnPYQfi,LJ_>H)UTuY%MBA5J.r06,g,6GRoJTr\-^\siS(je]F"//Rr=lSRF<e$#8^gJ$\r%NG\kW2_es`NmZ+?IPGV[,A96uB;HK@gM?B'I+%AY_eU]A$)3!u?>T.[isT7qa(HcO=#Y*?WiK'd2#A'I!iLE92fK':F^Cr>ZgI<H\r%LX*.82f0.Zc7sHZlsZS"H(IOL@"V+IGC,P6!]RMsY'fo)<iuGmm'M+:B;\O$#%f[D*qh!cfV4,RltMFHpVeD^n-2u/6"!*?pLTi0\r%)b5,Jrl,ESXdOr,41crNE$8`)0dAWH_0sO*d#tBJ%'\54"YH-Wbd\W<gW?L9kK%fJf.P"l;:XhLfhQR%@@r]MA36b#hFqrMKiGj;\r%?JrU\6ai2k?il2%)7#fd7t>@0.C,MObMao4'\Q7HZN3;D.C'u-]VNP<T57"F08\IdL<hT0aEFF^8*q2;\D=LA1lQ!b+*3<U-abgR\r%HV"pmG#E`=cLNq][ZdMRMiRSd@4W'nHQ43`8RqtKF\>>;413phL2<bLR6m0T-P[bU5FK[8:*R;&r:c4N(B?KKNfi]SGM2CGN&e>c\r%F#(&BG:QoMo:D)SG*7>K,25C#&e2.;(?J5RC_pT6YDGACF#R%[a`\<;?uoSSDc*!?pM`r:3p_248YPSUW)on<G1-5o:ldV([Zc"m\r%0!B>,4/jS0a2KL5SMW7"W5^9MmA.!)Qe.%0pE!J$m=M=mH1`nD.<_*\oB/'hWuT@_),iG/RN8se;s)a:2/%.cl9%/$ffc:0(Zb-H\r%+MLh'9Ba.;jOn7pm!tX%QY33Bf8pWCbd5c]CG%7ZWd*"BG]r+c/Xd\@PO7u.'Q6pNqZKN]0$d:nqh1Ooo1O;Wd:fEI[kd^&WG!Wp\r%F%):*7o3FToBc+iJQ+`n/XkLA.ZGLq:.qq(]X2s->+//KRp_k$Vkr(nh9n#5KV[;ZSkPJ`Vkr)9F=gLaSQ9#`]B7_rCbYfUQY33^\r%Zhon[VGQ:*mI%[UB>*Z=HWS6dm53H9U:8L:h-l"MB:-u;in=.rclK&%D^,#Ib%NZ+d')9#,P2cAK#EN:T!U^/5jP:khBV5n\_0eo\r%$"$DVE@TEl\lUFII\>5T'VT]Rhb,RU3fUsoVi7;U"Hu:<Sh(Gt.c+rhBL7\3\'_V2LXolg$,/<>)gUXh_>M;.oCQaW6fP6e/-PYk\r%YUX!hRmeYRX^sh[:Y!Lk]LAqTec_dT$#1<c>6ShKSG,3tS,/60\a^+k*ZA)hDK>Z?@ihQH*#J*,279(`"C3RkG$toM5g[I_BIC6]\r%$+mcN\@VJ89Ju8Qgc%dQ?%-:$3C]<I<qH6!V@Zmid9#^(\f;/28B%042hAQm_bq"./"IE%=R*H0FN*,9P?+:bHl%g#4hO^IU[Ol.\r%qs-8T7rI5QDo**ka3;0C*5*?K`oGL@*+&P4ru!i0hgEl**8^?pr#a,@rCkoWH^eo)ULFa,4\Ta5;XCC[@a9cm.@J.HZ%o.s9QN0C\r%p9<&a%O*:>*o9nYb2fMRdpT1P(OPCR//<hbZ@cU^8T*5M*CZR_rY!]MHc(>M>*(44cfJ/u0g%NJr"]E+[K4&=nQVZKfDZ2'beaHN\r%LMFM*^r$=N\hQ/T,+)Yj^I@u&8N[4WS4`9gKtCWU4"=cobQln`IG%AJSL*&#BUM;#k\kRpbp.)[0CWQ1:D*$+d$r5?pepeM/uU^=\r%-#Lui27pipi8+<g9-Wct<C7MV=&_aPBDF<hO7$M*Bl]5TX;D"$\OAJ<HG2?N]W6XJ_t?>@GSb+l5J#VUa:rgISnKff7Dk_l3sPuc\r%QTHmHr'>J2s!A9\eG.6.q"]AlruK!Y$[C(Y+2f,=Ad<fnJ^0G$:a+de8:6)[\*2,pHH?)%*3>QCCR2S3^(Q@6AEbZ;lIh+-[q`as\r%pcQ97ND;Y_ZCc(b;G>[d_s4ls/Ski69l-IjFg<;$AY8^m/"Q]"Y7EIqK%DA6pQ=)i5KNu6n$"Rn4V(phVCG88lPP;3$%GdhQt?1-\r%&H:>Y<F\hdl82oH#rE&:j%gVDd<J]bl1\P7X,Y_h0?(R@+a=M3]eYP*BSK3PrF@/lT2c<us&>lbi%sJ6VXV;\dS7]r&<qm;JjGlW\r%U$hI<?<"DN^i4SN'TC/(pS;+kNQSE%Hff;d:%P2t\V4+2g#-X#c22gr3TGR=Mp@F5%L*,BQ+Mcbm.X2)hEY?6>@q7CZ&Pnh<,56I\r%gRXAb"3;;r9d$)_$3iur8'SgL1bqnQ:(-H^P(Fi30Vk;!6Mp_QX^>!+&B0theBpEDPo8@=@G;n43-_ofMD3ai+:OT<(PQ9%KQ.%E\r%>"tAp'#e2:L>arF!<s@5j!%!7+cZEn-^C!7B?VEV8f+(SHW2#W?Z2ORL5Qu++kk=dXF_)E]GR1lSoG8OeM't6GZm6m&/o+4&H6P+\r%mb8kcf>S\d,kTJu!aZ[3@dj!A=P[\*4/aa5X#o1%l#_'!J@prHe_*d\VLeR@eVI+](#W"ld(QlS,Zf3U/S].KjYbbdVRfEno(/\'\r%j;P(?X;WW@gqT(>7`MlWX=1)1/Sul:>gZMp>1sHeXj*oYMmU%Y.@6C0]$o)Nd^="/pakDo(KM@No9.ZC4X7,M8;>H48'et<Z5u2^\r%,Fu4uI&8uO-E/8G>%5#2Ken"d-,t];\JuR"@)I*5J1`L0".DLXrj[A0mqK6a[&B+]!R[=JfGeY#!G,_2GMGc`K8`flE/kf0M,DCW\r%7H^$R#@B,6b$n23b=`ZeQ%>@eMT)6e%Iq4^.Van:&*pMV.&!@WJBmEA8A(?BUUSeLfA;-BMpo6)L!-M:0^9<n0*K6=.rt0?mQ]<2\r%Vae):'C8U1$C%E&ciJmm97/b*3jUsgKr]3n#u"NSe)f,FS.t9Rd/2D9Kr1DH2#E'<l[/Z=hRu*l6jPZhbBH[JnJHMS._*3J0paXV\r%%gGIZV'3HR.p.<JY'*q8lDbubNOR[`^,/.;\[Du_I<)a^D',d0'8u7?NC+FO?&Q_Y0g"tPNo3h>iS+jk8[EoJQi!Ka&n\0b"9RSp\r%MT]cA#[$QsNZlG*^,uT*('7b')I+'4>Hl[k)@3i:I]31)q9s..I2_+FiV,5EkAc?D+ZT8:Z[0jWjZR<9O3rJW3`_6b9lF![H`S5g\r%*dYOT?5j]RjC;9laE#hJ'*_^GW%Q.kq9mT7!aQ3TE"obObWP9RZAjd?!ae^*qL%8mr)aJM0&)sg"XMs!-5H$SJ4J7Ld-F*7;<b!g\r%6hfda<AUHgqC:$LX7AF(`H2TGFRF2"@Mnh+UDob[ogL+?\;6g$Gr4:*'QOF+#cZ'8:Nf[jFTB?Ch5hFi,do;[p+i_!h2?e0^!.0`\r%^DfBLD[Jh#?4o?o2s&Y+;gdBYlDa%JfGBK:CjGq\3rR:I+DW*=Fk6%?g/2ierLh8scJI>@84E&?/@hRsaR3QpK&^lMXX>m3Fnn$)\r%@$S*AG9ac0*Q,HZLOaKL5F#iAF<:5QIYJ'W'-uKkd'7Vu=bU'[qPgcbRT6jtKmD]R2QO(?!fs)/AefO%9XdT_<Oce!T"(Q?.bq$:\r%4M;4_X0@<kFJXW7.bq%EH"f+9'ZNEJOll5'Bi[BbDcRHji)O^F&gg"ch:QOE224D,9ShV&[aV<URs;>kmBUK^R:_`<UZbCX$4AeD\r%FYbpn#2!Wj&^]ZS!S`anGICY..o`JC*GniFl+bjR[c>ID-_",G<@.:V*,JXfk)7o/<f).[G-_MYB2uEDKki3caAeX/QgD)+<T!p;\r%nJE:(-;h)VIn7+kQtisbIBP?lBcWA8Yi=,L<^$?m\l5=<YoUl1^?kgTAPt3.:@Gh(r'9m&_X#/8hX08WFBhKE=32Frg;@Kmj2b^+\r%d[%I:O>+*9$mLsYRc^V/I*@6OYu]o.^A5$['WdUkS>"cNb[>6=q"g5m@%*O%qs?sL0<c=,RJCDrUZEdW7Fm<fAuHn>dnC?..F0p:\r%h3]W8F;&gr7BT,"Ra1[t-nnV[DhV2LkuEn@6T'hQoW"+g(/4%!6aNcq?a\_KLp-ErkZD7<]T%qO?]NH6a=#un@S8n9K1Jp+%K.!I\r%H%Dr(:(.;UfQ*u'k:5Xn053<tG'$g'R$kH_$k;&BG-(BbFQi1V'S=jVXZ&j2N#+^@8]B%-DD@(d3$^n$BL3hrFJTPM.QE]",ul;M\r%)lK-22:M-`WRd9JDY__Vd,\qs6Z`jtHn5b>YhB$O1Ycp`klt2mSXOs_;F/at)qEjr^&ADqi$t!!Je^]p*<_2_YYk^SW,rRb?l`2l\r%*Q7V_Z+PVB7/(6KGPoBp:LdZ@)8>`aHYU1c$\"JLDk7Db;^Z$$m3L]SI6VYJfMG!aN#,McG"lJ[fkFLGF`j&&A@'EV@pC:2;ImLG\r%m3D)9&kiq'p7LO+UuU+)pTO\H,q)!,o&-N`FE\)&+a"oa_g$0f#8$BUIKEd`K=GcML?MFD+(#k(i;$:>]H:95/t2"K*u(+9TUru-\r%$?QK$,a%/6K)\I[n\(/?*N&[<oq@o(jhTpDJKMnS(,Z@9lMESo<7b'*%C&tHR'@QQd$qeaWH$tKBo6V3?PR/LqgXq7O");)IYO6/\r%Bmd63]@CcG'?Ojfm*ZP9G2iMuaQ6.nhG8"r^$O8^IJ#Bl2D_+@%+IiF5(&:`iqDX=<QBU+kbk2f?n.HmA6/<BT56DbH9bhcX>0r+\r%["G<eA"B5)A-:+3"_PXaa9GJ0'poHAOH%%LjgT=;B9+,^\/I;[ZaU"h^q;jO"MVHR+bX[A]G_''l9n(-=,&2@FSA\?+</qm01@'(\r%'c3UqgQWg"5]!cukX>j3^g+BlU=]>&STP(@Yu.]^rC@m5iE/FL!j\L]o<(kgA9ScCgQ2lC/ejZ^7j&cN8<m]tZ@P2tBb!>'C7I=q\r%6h"9Kj5?D^Cq..?3V__[)_h;$Q@j)sZ@Qa-;:lUJD$rF2=U-JHRP)NpJ8MNPrUe@e-Ruu4RY_68`V,T%[mrkdr+9]V%m>\jA%b:)\r%iq-a&c:0`!aM:Db^.!qJpH+D]YpH!XMMf;SStcSFiXn#W69j[XT$tORBRaCKFDudt0oCGLQk[:Mk.H_8FO_Rs_+a&]U#W01&j,HN\r%7%WR3-".X*6V#'nBpUAsHS9M"e9rb2&f8#u_mHnO[69k#2fWhr[MUZm9uJ"*]Z"h)4Z_"khH.Bdlgbg"O'1(mUhUK?2(\&^;RHcF\r%/:h+q[>,dZU6==u7b]lJ>Ju`u<qKk_[N4V`IdYX."@P\Ff3tq>n*K80]^.1jp$l8)>tij*"&tk8_Jncu`;39\M*a^La2j-uO&20f\r%5h/@17t9nOUt>rO[DAM2hVAJ/rFQ_uh<1i"Zk90MK8FJMm7*HeF4ZFc_KUJ)`o?m[X0^M2PRWuU:FC@`4LVh2IH&ItFaaqnas8k9\r%gKp2<RO?p#Q63oDqBT)+hq`I/X1-V/o^S\TOT4P<OMs_,U\@:?f1^r5cND"[-6&8>Q$h-X=+CI:HAc\"YB>!5MTd$P$i,q*Kcr'T\r%YbsGYa*<9b<"D['!sWsB\ihaL%N%Jb8\YK74#MM(BEoO;XA,(.(=P0%Y_8]_i8QY3]+INl\Y;7mAV6ak_@H@ei$_cFKW3[5OSi\3\r%&892r#W9@C6_GkiT[4F]?jJT##=M?ub#;MJH>,=qE^+oXM:mbj>bEfICU=-hFHIV1*h@jUPFWErBka)E4gd-b](8JF/2P*DQgmos\r%;.r^Aa_.^+&]<UePnZ!d'dTu?(tP83dKqMFgV\FoSLs,#D&Hk@2\YU'g8Wa=<MD7M^sek.d[Jj0;4lRjRb<;l52E1im>4duAnS.S\r%5Cq7!DedI&G[%Zg^<T7:5joV@bIWh_49BK<#Pog9Ed?JrSP6sB=M4XM,hK6S+.g\)%WPo=Q2'-YDMUrO2;mC((\Su'F-ta:37q3<\r%`'[dEB9tDA>^1o0YJN:[`2/`cA9!DUpquKK2IjBY[QMp"CP(Tlq@JuKl:]I4W3>r\^-u%0S4VV4C6$UgPO(N%ot56)lZk"(:KOlr\r%cf4:&Q^ZOhbRbRQiuVKVL5C&D)re_Q?(u'n1rP)*)pH&V3lJF4+*2U]Mf:;*L3_2.Fa/]mW'?8:EJVeCc#7`\99VGPC5D0g<_/+f\r%6X7.NJt*EV6X0`#O"3Z%Q6#Zu]g-fd>Ckk&ZSB=fJ#AEk`5Xe2f8E15>h.22BuhGD>-A#`K#:(kY:8F?.1:O+6U*A]EJ!QDj<BFU\r%V$nHi:T%R`5ZFLl44g+o'oT!%GY^AV?G$X4F+Ipd"p8>u-#^L\[MeN\d'kr,XC"A4(uMBT:[3^d,[9YX^<>7V4nL#MbE+JON94S%\r%0/s7gkUO1&[MXLHHA2mb4b7273ND5N.l3rs/S],5B&@cL;(FGkpUU)T2h!tB6_8Hf2VhC&YCJZ7X?`7+K;Z=H=)Q?.d@Tb-/Ogs@\r%g3C3P-0?.Lac*qOP%m4+MHRJ[RaZ_#-_rom(G>7@nB]H%S;$R_9Ga_L2H*o,c#hq),#3:.UCa$sUJmPh@^\u+s'XC2;TtH]=20R'\r%I96/_!rj@67Md%p5pV?m?]deUq+BAkpcTrVhms8^q9A+g?rZ?+.BO/SVjN;fe@A#I[$u9E/-H8W[uB^)3&eZkl;m!jA8DLhMU+cW\r%QKj[n,5:tfdAnip!q(*Tf=m!Of:Y$[#NV`/k[?\a2e@`jTEYc241Z40L%+/<^';pB*IY618`(=-iu3ZAAC&T<ONaE=?b+H&'UY2c\r%dN)Wj()eeeK<%tpqWmf/b/%)X_@W<[:=0`O2e&8J9qjj8Jfj.$`Zk8nEFfBnA`M/3$p.c<N]$r//LR4tf6?T.ksd>>7i&@U"m0MC\r%Ouij)a/ijqR&I)Dkm`O()P7FqHm\H.ccrlt<rWd^$*`+46FXX!3Ln7'n^6!jQ/%0G1<]U)+<.nGgHY#eio=\FIQkM!1&:NiAT8f#\r%f8ksdHZU>[1?2ll=^3E4J@HY$)p@/1r1gm8\HQZ(AD,X1[]+TS\C>.U7;X;!,?t+pV)FdY@+W^bYg\Y4r]bYA#S+ZEHZ>our0r<o\r%hL6r[cmpW-;Ji\.TE//5EA_s<ag@E5$:#0/>daB,&Ypk%2`[ZS=r"d$.n"YiDq"s!@V[R][]gKuK?2%J\+/bI2q"WcHmg-QoS\r(\r%n%8c!AT6*!F(61d(u=l[gi\5CY'qnL<FQ3:%R-_[J9BUkFVb?lh)o!a+*6D@bfm5E5QpbmIu*40n1#QmH[.aP(0oK>ne5',IaG\e\r%0"g6Dp1Am<0_P!bIu8@'k[)+W\;2U"W14\m5ShRPRCZ[@:O[`bCkMD!mO$SNf<7@Zf"T,HF`eZnpZXgNk$JHKamu7JS^iq)W>gmW\r%TGu11VjR:-^G6r:AA<;i;?WAa-#/%MAU*[R4ur<_6n/%66C2,^i'Gemos)6K=;ck1)Hd16rO0pNT&\Wsnt)??)uXP(@\V&X<e'*J\r%f]I*CMB9KHcX30P5PurOL'O@72gQb)k.of";h",Jr!5AO4I_(ECHXl_(VrRd-uZ98i2M7CncS.8997F%)J"?gNRD+K"+k>%Im<iN\r%rqthudqU%NG$Zcq+%FIbp`&1um-51@.u\?^.j\n,!1lT>Ju;;HdY?HtO[\og!Uc/PVOEGP@<)s4T?*=hFJL+80O[R^rA-*9>[CU]\r%_>a;)Y)"5q!AG3BW_^2X@[**5VaQKs.3!%H#5lS6`o,[a6c>qJ-/J;N)tml>Z0gX+prEA23P6WfS/jU7-5f[%E,*Q6FjIqbLn"JY\r%KgO-G,%nuQ#Bo2;XB]J1S>PAkC\#YNc9S\26I=AO1\83pZklqo?b-5j?BT_*D_,O_7ODYHQooi]%-.JfHj>]gl14[WVP9TkI*\L-\r%m)*\<:P1ihd&D:b[>a7-N#ZfpF5FEsAI^]A^OVq0Wd,hi>L]0$_M1:J!bts=qWL]Y$bUE:a_t;fc-e%K4k]\E&a?Zbi46-SDaZF!\r%KT<Q%B0dFNAMGS?k9Q3\79L%V&tY@d<)`q_HQ@=?`#WWEpFNadn,rkSGYa(M6cUiIg7j_S^Q:iP=_uIcMnh_[Pf4Dtb=`GqTRgd4\r%\.AM/XJ!O'+Us!^S@R.$2!BpDoq>kq*BdL-.4@,UX"7T:O_UpS>R?J:bnQ]D*+$%q-#p'o8ZX2]4VQ,K@7]Kb'CPcDbWR`ERei3T\r%F9Z%1JOr%XZ'3>Mr/60Q?qb25=/VM50F[?s!NS`mg^'i.nq2kXc#eI[eDu%GS$A7gbiL.#o->JKg,:We]5V/&B3-b.,+mgYek;1R\r%)%:g_VYCS>F9\]?B^cmukmT0t*Bo*1SUnSO8Ao.C]@?,0F\'p!:fpIY]+(<@R:\0W0#'mH/#`X`D=e(>nO=,Hj#-;d\[Ri0s3\cE\r%YtBflh]=(`*s;+BgB$&(8@"8@n1ba'gKMg"jD2CpY3=mAV2''L$3R$H[+7Q9-^kP]\>0qP1F`6Q6m3F[W\C_a6?iD::89(!(8j1$\r%rC7A-,L9L<b#Q>d2'Gs8]iuJte7>&?@U'YU#@VBO^,0Q4eu>t/Shhm$e8h&c:U)5H'$BDSq(<5t3MsK+'nA'r_fpC_4*rWSDaug4\r%8L(NsS^s2h]6@!73.n+G%ALA;isabaW"?q-*G7&^U-@^?a9fl\2QSGXO;!S`$#h6WO:tO"7,^1N?B$SDg!FaS9Z:2#A2=n5:<]nk\r%Y;3/6i[&<FB!VP7eugaVXF[::0RYBJ2,9t[,!6\Fj't1edTC#;dfS6:@Fa[s!M\AmZrNTMM_4k<be+fR0D1a:A#S.8s24T9GbSMm\r%$g"51JK:He>Y&SJ;L-7aB<qF2M0)j+\G4F]J#WUJ5^Rk#KS>jkg8XCs<,$%IIoUglfYbpEr.1'R7;pu*5Q%LR;sAFT03=j$Wos"R\r%`V6+e@P,CI<.(mm.gGcTh8e<b<V;_9^t1u%n,@q`O\N_DB;Wf#7uuJ;6VEjkQ)#+,Au41pHIPCl"G)R@4VWPZ#\#R.2?.t[a=[fd\r%!sBe67@-ss=@hs.c1#k$l':0&)8:?EIn,B7*V*&;%>A>V0@b=>Uq)>+d+Nik1@=BqRd$W_NpX#RPE=TG/OmR3B&'h7m;C^@!!7>f\r%6/`PIb:10$g)\u5el-s=1OO1o1O;XR9!6-$:I)3^?4445"*Tt9+2a)DD;/-$2u-+7/-P-eOs-KhN_S#%Pid>&f^!0%priQQB-C3e\r%?$D*b/d3h]*mhar4djYXB<fo2bMYkirI.jWBAS:7?hBAIU8*ntjXGON,7%\kC#a"X4`oO4SgWNtK`hX$S.bssC4?Eo!M\0sS,suW\r%cqW^//ijlbQ&W[Lb?!5JhJ94qRcgB^h(HAqA`Q`!SX1ueG'4R[PNP5KDblZQA[o]r@pOQ&V;U&U5e_&03Rbq;jiFM0=ktgV]gI9<\r%K7$1YH\_F=<&s2HI43<<ZH,W;o1c7A>[C'=;^U&Lg1sE:P?sbdAF&@!nSPC3#YqRcH@,,@iHoZO$Gfg`rVX<0T(M`'jhQfK9Us:e\r%2ohb,I+#'FNr5f_@A1HCkf:SuO.sSAp>`u(%gei_\$4?#&m8u37u_\6Z(QFpFg5<XhGMc^mU@?),jSt%qRDSt$8kT,`Bm?TbjZ*j\r%<=6*0j+C.:X9f!%EM5$T!B%$-Rjq@.i.Z4`23(CV0ZWoD3e2ulB"d!,V@5n]QhGaUA@Has#0m%1nhn_"<..Z3Z;H$NS_52KVEAtm\r%m5A#O9R5Vt8MF?O4#LPNLpeF8Uk=Pff+^1&H&;$"H%MMf+CTNurCTQ`&jb5)"bH<4dsc!=,ds2/";7"jk^!QL-4XPfWPGYrUoQS*\r%V>?<O(XUP8(/Yr.b32M5U[qWEWEJDP5rOL0<h>Q1&qpkWL\=4SB(77Kj,BQ_<*4ELe-5Uu2)/+^R(GV=\q&sM]9gb%+9BXE-:5W(\r%8X(Z?O"IL\E3\;@IE'LaX"61iX>Tgj7?BB_Ns]D-\4Pg+")1W&8Bq$Qa\'*Ad)A<.qNnsA!X[ETjf;r4rF0FNAo#bGT(B/DX!IO+\r%mg;g_X>$MNi*macOp^"s'r%^chn8ri;RLaO6"SDC9=XX=]o/]cFg6JR;Ci98ZN08C*qI&%n3!u^FW:+o(:jfUU<;a:[3V$!aVEpN\r%ZS0PraM>/\+'ia"'JiP^UZb"kXE-8uU^_Z/btWq`V@\i"Al]6*0o]lng9XC2SRH;;M>""`]#.p54=W)R9KN)^d<C57QG\c#YiqH@\r%<Z#q[efI'=*.BNDjRH/.r-kR35jdnSE-i>/rulFMp7Lb[\H>(R@Io4<)&LS!d]SbTON7)s]P&q[nO]9)<89C'KYo2a8&8V3Fi_MH\r%=6d7kSY&u/7DdPM<o@m&s0jIA6cJs27j$TPE8XY@<22?%8'id0@!`^^OZC7:->uDjnPa)GSpfg_:D(kB(_9FTN)'b,9P8n@DVpBE\r%gMO6&.BW"A=Ji>#TuXgq)nA;-76,HYJ)on[J3u3<m<RkY\/Dm33H?DK8U9",nk7eXjJjlWr(,Xs^)`smoD%mD0ZKj)1l%o&S+K1(\r%%T2nYX",g/rDgNLoaK"sD[2'M&(BaorN2u%-r<*hAp<^#$`!*MCY\k))O[(CJf\j(kB/QqAB="O@t5Hnl[]_P<;\AmZ9UH#8feWA\r%&l5nO2dC.0'$gt(N8!&%p:tH:4>p/aO7&IKb'("/V9FqV\d9beP,NPOB^g`!o4.$eUM?;S"&@&9LF5uDRK%)-s'3"P:.XQNrWYBT\r%/;;dVg_G:PliKc2T">';DgQA7kM-gI@7YgGVWP&."'T^q!paIc=*2`ikjh2hqp>NrYSS*b5-b9.7?'/N#Mb3`jUoe*k6TuZb1qZ^\r%9Bs&&iH7d!J;SSoHXL#t%8pc^p:tW?8@Jg.5gg,YLqbl+4'#L#m,^m(;22^g[_5,3m6UFZ;%G2e[.tUr+#?K2&$5CZn*n'5Xi?hD\r%*K9br8X5aBj^83l-XCJYQ@fe#/P2md=6J_&ku(.qC)Ek)kn5eujg@_*$S:-YmVq5pljh=$HH$rs?'I,s'"W>u\nb#,[iph?r`Vj(\r%(K?e+G9n&0ZjWnXK'Sgmd4RDhM_#dKEmQF":Y!e.ZYtM<=^jTGANi.V8=%a6c]sJfh(I/nBeITAfTG@d.Q=4hQY"bE(V:CF5k^&o\r%``$#,?d*19CG=oXLuQEQ=b<PQD_<P`8LHA33f.J3Z>;M49[%'b9kD.9h;qKb"Lnk&#^KP7*'fF0838>'3;V-ugo>f.\rSj+MP:_o\r%dd3HeK$7f@@7W)1Kq=Rh1tKu?A21T''ccc!qt_'[P;lpbheKEi]>Thl`*q+c4O;<'Xkgr/#::RX,,Z?.Dfat5Ck;_WTR0c!bK8)H\r%`bi=mY^G+_m+XVW3YFq.kGq$H_-d/7B_WhBNY[_\X(RMPaBCJ!=`Hcs2uL4BO!$K*T0[@8fPI7Zh&ZgX[,^P&f#*JJ$]:+NY@Wq"\r%on)I>G':c&d+OIdM>h=K)n-<WQqk[rC<\e;AViONWNf^d]helDdH5=Jjc3(CeB:s0HYAHPCf)\dC6ItST\g%;fib#6iW?%23q%-:\r%lF\KmP[ihl%g@+lI]pPZb2R;]\qD_(k>ItgTt8O#E\7Mf+AiD):o70a>,7TV:'*ojb2#?uZ^9%d1p'RDr(XkJrduKc&6H'nJJXTA\r%_.7&&_+k,R`oY_\G-]Tc;1lab;:A=@=XNa(9W/jg4j,*G11:gj/D226A4"n+0[#,PGn=c'CR.Q61scP";XJL(>nEYO^meuWRAWkQ\r%WjH9R`f6t+NPnX>CYZ"([EK(7anD+l(mD'a>?HNSRuO5O.M#^AAiA(JW`<@Uk4]lp1=5-&1gYuA?Yjq#M`ZbB\J"%ibSI&.&LFc_\r%q+YfSbYoen1@(pBo945AbYof1)r3&H_L.s[4M@OqM0"/uWuZ?fW)EHtS%8UN<"8Hac:jjbBSoa1Pt4=ZTjjT$N(t%t<!f^Toc;j*\r%n9C)P@#?ICN[b&`D,g+&]D!%`qXkQ=3,Jgmqn.cmfP_"9]@ATP/ZJqi;/:M40sl"[)G*E6%PQFY+.mD#;),4]LW<k;7n5(#`2&U\\r%_G-<C?\'<tYKnM3R#&B1F$_@?<C.b+HVQHiDN^(t,in!ZHa9t$7bB>K.O?$e4An?ae74Mn(u`R\E<Y40&0n8UJ9PFmO@S#]JP+$F\r%+ciuDK;ro1KKR[XN'7K<Ag^&=a<`+m]d57R@UosK$\UXj:5mA3LQG"U#,(R*SWL>*a*UJIe1[[*H*laAlmWf7B0gBj9<X:QEo<Kd\r%186k$p(3Q_ae0!l"sK%,al(AWbChuU,pOm'MhF2j,pW'VXV11qQ&I\8@?HXAb/`8UkGP(cljsY6USN9"W;<S/njo%i`bfL^B1KbX\r%'9p",667Qt&+kd&66<,<9O(N%8B<#uQQa%\K9/UG`rjbP/c$h,@6s=:Th8EHs2n;YgW=oLPBoPf]K!YseM([1(g.n\d?"!jV9m95\r%$i7X8:+:jR`d2BLgs'2rT+-jKK6].a)Qp<I@%E!%TVK7`mUu](Qs54o8>!j%\AC]8@D,I[N2A+U+NI+/N(+J`+Rb6hcQu3nY423:\r%kE+>6iTS!M$*F9".hfb$(?#Vi=/='8m_.ZpcjXg"R!8aLYhT'&N[%7k"_#A?J!=99Jon!S\rO.#A4MoadDadL5YuNtBk\ZUQaS,5\r%X7T>o-eij@Bk\Z2-9Eq+Us_I%HD0Upe'^FIE^la`6U9"p8=.oY4rUI/QMNR1g'?9=lPdHc0.t)6X#B/,q86%-qIE%<RYSM:[Nhl:\r%?O%YK)m$sQDIp)&&k6?h!]"chJeW)YleQ%*HPJa*pZ<)J[%$q>5@\pJ4k$Fto^8]YR[k)@%:4SjBED8q">a3n7T"R.>P+gKECb(l\r%UT]h8$t0-I0m)S5?k_@]IK6Ni#+1+X-2^LJHuE.r@d<LX2/H,\\\*g*qW?MYe98m!I4$'-^1N_i$No`]"nu_ognZjp7M_[#KH9IM\r%\Eb@3>SIjN$<*GE/S\GB@#sj@B9>XCWl*@Bms-O)_j%Z&G'"&s$V4$M\(IS0;obanF;ZD`^diE<)`l$`R+a)pg>G/,_UN2FdO%)=\r%X&@_5:4]74!K55XN>,LK)6go/h+iP"q8rXh'9%^=AVZ8];l4O+Pg>:LZ%o^TI<:en[D!"<`GP>pZ^Pt0850hWkq^l8TPkdq$"gBW\r%`d?g&Rq+=mN7,G$fS@Z9NV9A"+<+(uEGp9ObT_LBp1lhKfnGHaN;EftO'IK_iH!5/5,S&f=VK0e(n>GJpsZMg?HlUp3n?:<T<(-?\r%UThb?B&]6&N/egcJ,JQRj4W@"]e`\<6/])?laP$S0JqQEf:\TU^XWSCacf]0;(nJ>DD5f23!\\_qfe2=hY1DB'ua?<p,7?gM2];"\r%]4<6ii@&pEq<Cla\(a#7RL#GrFQWO6g!.LMc[/R90dNqTItX"f-*Ligk^*)"@#[O]-.+hM5`+JIb*&%U(B`3bHDB'g95kuZPJB#B\r%E<Q4dQe-Nb;a:dKfCd1Xc_BB[U[=+`&^IN5o>dP;j[!e22l_C7`]tS[_m;*#nUhGFKD'7hG"/!j#Jp?jor=t!Fk&"mi?Zf4C9\@?\r%7#M?JQT36#"+K-,,b<n-"RidXA6<dPZD!-#eQc32l#Z]re5b[o7BBDJI6WJn*=k^pQ7fJ:b*-_FE#DePDp#;3*\lQD`VgSjp+2"l\r%npUnbfQh`'_.MH23YrD@Zjo8-3OWf2#GN>/R$rTW_2OX*C`Pe,L3Q1?ku?M"3d2Em*Ff)O6c[.Y[SAl4;6KcR.J(9kEYgkE:)GmR\r%^8e1Y'jUX>b8"P'0E<gm]4*i"!`']Cq*>.FG?NnZg7NOnJ:Il"\l#VXomjf7UYU:h$"(Zu99,([90tkU-gaW<-j"YPK^H!XOD0]6\r%RN.ZWn\e;<H@6j7f9.MBC;lhH1D<SsVuXG1"k:\OTV@SUZ06_8f`Y2.jT[--*oII4i-$XBV/3Jjn'8T?_,Fe)Qf4b21"k.3*_[!1\r%gnI8+XWZDfk\PT\@c>=d>Fm`S]h'MXUBB^)LY*jkp9`7Qi1\V/VdBsW@7#mD!=t2S[>8!l"!5&I.7Ma\Z:_TCV'6sOb>Q"R2h#E)\r%I,THuWX5m;^7LYLrlPfinC/+=[N]IO#.tqK&.7n;deiJ%=lIjN:56c+J)Tc7aEI%AeX,#4T%pjYfq&G_I=csgm_I/p+oL7&\9B1i\r%e)Ls_0Qd'R5571R8,o*-C(]sd'MZV!IFumO's*pVQaL8d4&M%#&+Kg2m^$.(^SCZ\jK`\g]/=(EOWa0qRE)qUo4G8WK'q&b>tA+c\r%e6PSZ89aTD[XQcZe'_N*WXH/_J5R%qJ*bZj5AgPYV5:bVj.at-$Tkpm96G*_4K:@:TC_^b((l=MI/u2cs*nH0ks;A/K0);'h5-sZ\r%TUS2JGA3=c0'^#@96CQB:?kX]Q0NBef3MR[$hO5'F;J:F4CAl7/,^\dNIFsc%g8ofj(g]n"\oHm+<@%Oa'QMYkoSpDh&\&)@$\cu\r%8pXodMh1YT;2)#qnYMCTG`mteHk!UUkbX1%ha;I<"a_4X;Sn%/CBXfb]nh1SWu;Hq6/^14%!T.1V=rJ7!44d?EYg@cP?<nIS2:70\r%cA8.>WiMUKP#qWr0L#qii*6+X??l!VFH]%\I71hs^"S+F.?:"mQP'.)Ql%m#J)rD];KAul?\ANr=!+'-nh%s-7IXU>k$pXKFXm#*\r%pUX,N*fQ!G8/iT#\_:IPXr<3bhps8nkkPdW'`JNW=;3+I=Pfe7=B**%/u-lLIOpIIM:58a:F.gT>\rr,bD2%fTk7Ak_=L*.0T)SS\r%6h`=K_'nWL9K_I#.W]ka`pN&[$'hJ`2WJt'c%I]fD-4O?($?A<L%;%+\L]VuZT]kMT:raeI[;K;Tin(UXad.idEhrCec!@u1>M?8\r%5=j<;_tsSs3>cC0:W^N,gO8oD^:5'2-*s8fCF[9EU<=*[hb8\_Ogtl&c`0=]jY[e4AC4roIMai4TcKIClnK.s:)7,iGaa7I`(=W.\r%2Ef$l.@6`Ja6I/'#8FH:O6O>T<JZi-QQ]=V-:44jQf6a.A'/A]Q&`!61Xt3<KJ#X%o98tYmIY*t`'-Pp0#Ii;3L4%^QHX":mu5f3\r%1KOP$=HUm2'pj)KL+Y-YcVWRUbQdV0%%a$cCK\uqEh#gIWteLNCuapkH@0(S6+?;mX=V"7Ue6P"YRng,"g6nkI?qfL$2RdpU&o]?\r%?Ga0&81Gmq?D"tuJYgc'cfena$gc'+?`VO;Lq,K+S%dqP=k&&j@g0QX3:u#"BaD#*Q-3r2Wea(5-&8;\c-_i)WgtuW5`>(CE%9H1\r%@Q(Zn/]be)=a$)jW'Vb1!bjALW?R`rL\@U]L;$T#oVY17aJ*\+>0Ca*dp3#lhAe]6r,e:KCRuSB2ViM",B<F1rk:C=\9W6WTbauV\r%fgEd`j4I>5/l+?-J4A28IE;2Ugk!RW?>PhqNOerU@.+b8HmNmPcrUbICBqGE:]g+&_3PpULkuu\>-Um<6_PVE=XOuB<[cJUe#hb9\r%b@7/soKo8@ZVik#MIIuu90X2L@OMqjPVcjCfQ&I#%aaP*/k@9&8p!F;qPOF;f<'/]E72/"H.SW<NE@TEThqbu.Bita4dcL[d$QC5\r%-5^XaJjjd0:2B"VK#VWCc.%9`B>oQh5/%qJ<r2'U3>-,aAb<Dls4Vg]auiZi-hbJ-c6-u26!r%Ei9\lr?H6nE=jI<@lMbiDDL,T`\r%I_aDqo/M`,q,4ZV6BCs@#U\aNi>I-7UXRQ<W^1&.Nc%'WX"IE;8fIXj/ZB+R0aC25Lq%DIqKZ9#4I;CX5>S>s_9WptrB.3"*]fK6\r%p[bc'GqQ:$"u,EI@,64kmXT.:h<!=%,2BSS_gsZkVhjT#XMoC4_g^HMObbPth7@#ZY9pe$'qWIm'"?f'hsu-9"_Lj%I\,J^`2u/Z\r%5(qdE_L*+XJYZ``IJYLI95t!Y&OW3"d8`c4%8l5aY7+;,#MlQ[1)oLBZ-(9;%UDF<OBans0;h>cV81^8@RCr-<O=-nS1IR<i*UKj\r%[!Pl/Z+_L4@4t5HH[8a.mkC3W&#5-S8:Ro_&<4>?Um+Ic$L)T\,GeA6E0E"E2c<6o$=.t`nE,e&81E(@;^/SINKd=t6?HI'na"gj\r%)1$bBK!-rti5o:5g+cTO3#V/-ZDN5IECsVaUS#!RFZl)CIJEFpaC!_/h3lRr-5D5"U*.bh[d''0";"O5l8g6Upa!ZdA)rlMj-,-X\r%^QDHXN_`Q?7b;iVP5?L0Y:EnN,bEsPPo&P/2Xcio:"^@]7:'&=I$.;RP@[VYSkhGrogodCH4>:c5';3Ujc^C!GkIVjFF97gEA8\:\r%XS='WT=galgKD?rp.:.P4Jn@.H!LU"(T6i<,[Ih/0?td)?!]Qd6t9L+4BSr4b.Oki]@AgjN_+>X+eN+3=ddlAl>*"[=\62^e0c[j\r%Ya\Ql]"3c5&(j#!\@=#eFHq7MaimYC3F)g;*+kJd:0f^c72Cl@)Un5'3L*("_[iFOa+tT,j/3=^[Oi=DGoq6m6>'=JMSY*8QgQ!j\r%RbOW>V3M>],`i)D73MO%pc!d'K*tQq9aa,GDPb`;F<?.o1rUkGmfYgnP:ueC$7a+$mlU0+K]BZJg!Ca6l^^::gr^Bi8(3R0.^Z_>\r%iUC*k'ELNkmIhN*Hl#MSrO\$:2F1d[jE`<#g!MWI@A[^i6ku!<BGsQ`4)0B&3L*(Q"<$Z.*qmsg5<8`-Q9t'#!UKWS7Y@Q]M$2s0\r%m,th_8L,uC8gNoed(/"ub:@_=XRr[:qG9FpZ/1>cl9c_[jCYpL!9X?=I42?=2sNd;^;U3JhK.%CFeY*0SkDLD??Xq4_:_^iLG@C4\r%\o^Oj("c:6Nc,M08iHI#P&Cr`)iO#.SM^R#b.P+5IS5jQ'PbL6V0i_bgP)Ym8'lhh*iu1bPSMN0q'M?*()5R"qp1?2F$4IPi1W%*\r%7N^PsN=nLC$hk1Sj<A8"_)dOM!X[$p_;4(C5Vf.+:_QCbY,Ee#oZ*2-&Lo)"BLIPcZ#CO_9J;L5G`!R@[GL3b(_M03C9>B53Wi<'\r%G#g/iV5PNlr^"jHGeaW[UD`NPL%%*ViJ635<ek_jqU9UeYOJWXQBF,CHFZ<4X+J:1ibY)N=DL>@Ys\d+8UO/aXIj.h%\jHu[CSfo\r%W8?BNA<FWAK6qQ[P>MW3YSuSjq1Xn<CmAca;%5gJ42j'VpllcY)G3M)=M(fp/Mc`/.<;L0ZOi">8RbfjnJ1I#h5S8;D+F9%>rRLH\r%^"ZDtE;qfS_K1imp"JO?_OZ0h=Kh+j?<k>7$L>)>eXPkPgqL7F=7GnM#j\l=eVgSY68F:dW*VU.7;gY^(tC.`Zu"F[P\.K6=2&:s\r%k4,i\_1nM@+KBYA96.Jk"38B4,L'c"#<hhC:lNrjY,]Q@e<Prn5-d2'-)1K>pSLL`!F4"$E::AJ==2LH/<4/@ZdGc1hK?lCE,%Bb\r%gq3"M#qCcMmbOU`22-B9Lq82`Ll'bjMc!Q*/[sG-Cp1gV/!lSFm)jM$Q&<q+'\dCJlH837#eRA_FTmf;SRGU.UTUCT$X18'/_:qd\r%8*Tm,Zs7NOn*^UqZJCn!qq02u/)-%$kZR6\]<WH"AL\kTEmti6e7_/s[%jf':&?deF_*>qf4*6p`4.T/]<WH"AWY#&#==!FcSb0C\r%(d`6,NgYs>6Fr<s6=E%Bb2ma_66WL83rktAa+Cq#T.!&TYkIn]nrFZTIN/<S;\09D4[,oD=5Ztt'LIB:"/oTJKi!RU]adCXYkEXU\r%^7A\6VE-bAr>_0UCe)N<e<M3C`_o;slhX"LT;@R.\Yq$FQQYY;G179#_jF%*[M!]dF*tTpWU*)[!TB-5.:b7"$D#:NRR.co6?$1'\r%1kdKhKLE!9m\Z)JW%3G!Yp8VXG1;em)rD6N73$FRE5-Y$gcnRm1UC0Te+c9a(&\ehH#Wg"rYkaJFc(V^^<`l%OVX*m?bP?nI38@M\r%g\mU_oRli=6NTh8Y[eCY(/hA-1U'\5DD;<1qSd&;HVW:eKersk[-*+uK9fH?88!mcDqo@?QI_"W<X+lJmb"*dRQgaRUp4k4S3i9o\r%hCB<Z]@P`Tr+)faG-)W,O`I<RA].fKZ"qT$@=PRtascmqLW6LIG_1$R\hnT4`m[D8=\?LS[Eu`M7[M-o0>6>ZM;DVf"cG2>$RR!t\r%VdPX!@-PtNd/l77pDdH8/bbOL'J.]&U.m"43FE!_)QJHd3`Oh"")3fV"E)TQ]^J.X;N5OP4`NBEIOK5f;l5TKB0O+tHA)Q)*i7Qt\r%jPRl"-M]+uCd(VPqUPQR\.+!PNn7^La9LqMYkNLB^MmXM`Jgnad#Wt`"S+UdKR*(K3=LGr%WZ'AcsHUuNbq=<8bBVb;>_@m5mo'H\r%>VhbuDVMl1H_eAa6\/1rEetj=ac:1u[?17,efZ9<KcteFrLd)^$&H8sSo(]SkUN-9@,VNNVH>Ioq\GcYTFU6Q[QX7c9PuTNDg5,>\r%<(`r]5LBf0#:&)(kgAp"!C6pJGNU@;qRf2l/6ku&*^lV(rV!lWr2E8kemq/7I9SCo4J&/e=._ffJ5Z8TeVo*AOm`,hHe5fi]!AcJ\r%J;ZZ!8s9tR]iP4L/?ffk7'RQ<s)6ac+GD):9\.nS3W%.ZCFqCF8LEm^:D9?.U3/WlGSKN[>.<i!ecfJWr58tEq@C.UrEb/J')mk'\r%>m+]9B5!ud&D,@keuSEJh&sanRnY?uH[)5B1Eh16^H+FT_m_FpL$e]U_s`ElUJHBdMHBfZ$WO(5o%btp83"6sVeJLcQe>2;i/6"H\r%.b0P*;oQR-KaA">cCh_lhUaWO=`KQ]JCJ[=!KGYCX!>%-9>!7KYa<o8HKrL#%!a(\K#!!87E:56ZUnO2iid3F[Sn>qpt*F5kC=.9\r%@7-3(7P#L@Y(+>oRTViZZi]c&PRSk#>VIK^+t5_HmB]^2Lid>M887U'$>HD4mL$WDCITSP0RbHc)NbGV@erP>V,2/](>a3T,AT^$\r%BpitZL]fW31XK?Lo[C1=`_<Mj`dt]IoJH3F?qP.+8)@PBhbN/1]hVut=a4CjP=(W]+lC^V99Q)Hgls,Lei\M;IZ$?^;YhZObdL/0\r%1IO*=!4gh7!DAUT$=f77!Z&JPAkBiM3aig7F&GhHPmZU)Pa;Z=WJR,YbfNK.l"NgUY4?QtY<>u9);&r/E8G[W(nF8^]WAq)qN[!p\r%[D=uKbXTPU*YL:hVl)8nr76n,`]7&s\Q\cREEWJa;Ne#E7Mu>o.VQ7YT@6;nWQ3e>oWb:>iE($CZot?Ce#+Ro7O/0#`35KFNCXE%\r%$"ci)7O7Mo95I/_)KRIQ>f80GeIGtB=m!A$`IDusF&@<=SYmGLJ9L6ZaJm@sVVIjHfB:s@G&9k0k)^IG/D67q>gTf+D6TCN>^5XU\r%ANOi3e/cPjN^91V#n1a,4j*E&,&7>\IBpMJ)JeE.Pj*9#^V*"0]Fh`e=W\+Sf?^>3S;$m)\&B:,5,j)RFH+u:NHQoc-#812$c9Q=\r%)Jd98$Qbb'l5:E'Tm*M1c8R<)1F:OLVU*qc_)6mlYU8h*lG87U^V@DP?u<XpR1PXt^a$d)R)T`L6._K6$Fh*]Bfhr&K5P_%)n1P%\r%J2WiH*4=iq_m;>1UU+k?;L7hUkk<_ThenSQKUF%Z4i>Z@5i)^t$%(!-aW@BBY\:4aIDhF)6DlXRcP8B*^,nOteG<fC96Sjn..-mE\r%=,_Y&[.ZG6:a"5-;%V_uRms.)EPpVl$Bn3n^FQ`4H>c-5EYP-^oNj)?DNW=T,Hm`)^b=jcp*JtoSZj0":9O)dK<DIJqt*;'Hfa\p\r%Cf&=8-Z#=/(?fT+ICn`IN*W!h5?.7HphY#Ar!4XllZ-hW)"PS(!PG%7a7&FY]f>W5aO!J/D5N2S1m0Vpo0@W@eF)Pi16O<+c8p`a\r%'=sH>[OE$*CT/X'*[,b\#-)/DcCAD5<`BKPE0$[X6d':(.X[ctY`!oABRE-B(")#om`HQ6;_X7$>H#Ki^AV/5>(g^F2I!=s:-#L>\r%Pio]ECT,!2j-\b4<8e0Kk?Z=>?@4l*cYqp$WmT\bpJqC4Sp;2;YrDk-VU-2_@jZ3?7[_&-1;O\T\HnRmd">g(F[ii4Z+GOG`i$W'\r%ijA+4FJ/.q\nb$Kn`aY!"XQak-Zt['pgbo>]/++3B`/05&ct<(=h'*`Fqs1_#?%bt+lK1<JkD_XGMqjFMnaeVF#e7Gf#\R&bU!7g\r%*^kKRNP['F?0g=:#>=Omn25en0IL(A>>ce,CVqO%pL8_&1'!qO'IJ^a>o>_EXuQg50Y0Xaj8Fs,fNb4:d3OSXcpX@&NEr8LOf*)t\r%3Jj@\,aGkBS!1dWaX=P7%XYDso`/-0l<t3WD5s-)js8a+U'uD$NOZINS-8[C&o<[o=(Fu8UVR_R?mWP6gPc*C6gK"-SAIUAX-^XB\r%Xs:56AU^p@Z9,e:ck]JhJ0kn,2&qq<\a0tu#&#4QM#gHV)p!'Q?1L?K'QMY#W'rABNhT]P-OR.GC,!hO$D.u,eUVSL]r'1JGB[I7\r%'Sk!e^GuGi'Be^Zk0f=I;"tm74[3j$S0uj%PArX_q4,fYOZAtKea7,"7"8d%q+iI-+@[s.'tp7'^".oLnSm@cW'j#*6Q:oB-??$f\r%2/pf"#f:OkGDsR0g"MV.TatPL@>,b/q"#q.rtI<\7a]A.*6/gCB`AZb]r?-!MN6>I@uSAAcL)oH,9qGOJu7!gCf=>R3XH2^G.FG8\r%W`EMZbY8p$lP>(=,qL?:_/@Td9jVj#X0YR@O/P/^E)(A3a]Kpnd-5bnFDuo2W[W*REYm(cp5rbJq4f]DVkQo`XFROk/mFn`'De44\r%9X&&u:26:4^64=6S^]Ws9nKObl#aBe[`gb&,WEO,mLl_f^#%TSXDOl!RX,H,`=2"o*[9.QiG5WE3$$g1`IoUL.aWO33D:V(68JlK\r%XY<e?FK$3Xr6hI/a"`*ti=R>2>$',ie^:oU;j#oP"2+ktU3mlo2QES-%q;\Qg/3HfUg3Kg7%pAC\<9AiKYEJ,:C*)Z5VNutdaXG<\r%dWr#u#k`U@X,iP/5'O9lD;N.XgT/Pm5,id=3'WAd]*@VuZUs]o@)^,1NJl4+JpB%lI^@[g*VcBn?fMZ>&%+5cp\V1RYcMbL6r,Pb\r%cg#?+[%i`j4'[qiKG&04giRa"7OVEd.%29CC2[N?CDdqRG`FFk?8*`0o`QqV;!C-UN)WHSFWXZ7b"FN.VEN$dY\I7opfjs^$JajU\r%?^bY<%_`cjaT:[%/jicsDq-LleqqsYQ/Gpq>RVq,DL=@NT#B$rq3XhK<e$T3@Y.tU-$7%Fec4f;P'@2g]JNG%($Kh;V,89H9@D!#\r%$g2K"&R$&J5+,ef'nlKI7aY2rU+CI&EOi.LRDKddZ14(9\H:T7m8a7,V-o%W5F$2j!hct-4)XhEch&o][khh&-.^]S3]2j^nft.T\r%%qj[s*Dt&u`$W9_PCtN?";lb&2X69*@,d'Lj*:p(U_>tglb+VV4T$d&mh^Sq+AH(%!l*AD#&2eC!*P[C#)VNu<.k?qEoB[Cd0Ku%\r%<n]A7($a1gYo6t6SE1Q>8ct'gdp)H_r?aE1@AJMHq40>MiL,-N.?SBtP+.0:@MZ?@&mC2.Zj?,i.A>SbjUi.$oKR1]b*h?Z55dT-\r%HrgqOjO;H86^*[J,%#I(F*kMDc=eCDjREBb(@-C&Qdt7<Ku.co(Yb$E:sY[dT?*oR`Ol)3\^KgknnGh^s!/ADPe,Q0WC3%eRl\0d\r%Kpg4A=5H,UJJ+-a"(u@anaPP49FsWnC25QYKp,_qD,^5S4F0B0`L7pr'RJNY*[J5,0;:DHL9`'11kjdkG!e_-Tf;=a2Mp>8UGmG3\r%R)O"+d2RPKR)Eo$dMbj<2tTc'?`)0hRP%:o2[+M[D=KHO`Y2WER?6PLCIRl-.oAgn=?Ap3LSsl-65JcDbL%8t/N<HAMRb6\]Y6q0\r%C[Ar55hu+&BPcgA.$rbhQ;*uY5[7b-T!+YHe1S`UdRQ=s6l<"kKt^X37oZOT*O?J5h-tunmYXUd@![&8?=jEOLk3[3Y*K7;aQ`K;\r%iG)M;?D(PhBXR3hS;TB;#eb,>*:3#d$#<c+osn<ZYX;8q.%U4YD72%a?O?fiJZEJG2\W`:0lU-hRfblE2Rt5Hr2KtLZj9Xp\L8C`\r%K\Lnoc%ii;G^1.LJ8Y9Kc]GSO/+a]m9f<ZqC<`r>O>mnu/X;\@jc?E%<r']JPQ`0P?mXQFF)NXBZkaXG_n)=S^sVIb[O"P-%XnVs\r%1]mPS<=n']poUg]Vl'k8AEFlq@6/U6^a$<j?g)U1\(PBWLqC]#USjL5AfKh)jOd&%',.h;VGCjoG`/>0!#ifmafcU6lPX"ti4JKb\r%s5PS\VOB!hNcPpc+Ur]um:`dK-"+J;4"rb<J^!rprfdK_FTXN_E33F_<7bWra;Q$Wi(m'k@!EY!/a$s]Q=Ig=+0jN_9fY+D&hWu`\r%pWBb=5QBm>W62A.OP@*hcr:t:b3eFJ%gT/(!BKjc:"J-Z@Y3u4b)RHGg0poV6>aiLTejZ.pKec$k)=uf^m])=79o@3l:VWV]l..t\r%?r:t&1+,,e+uqW(6Rnb8RoVTkG)gBB3S7c<7-s1ZFp'b+[.e!"DH^H_KKW@2DH^INL\(>4gpGMVoFg#fg>;_(2Qb=n<jQsFZZH`/\r%0cRNISQ[t3cHq!"/`-C3BJ)*D4a4"g/V[<j*]-LDYMFPc+V^/:e'2SaTU4E>d:+oE=V^lmMEZ]36"Z*/cD]OYRYHEO"TQ`V?5n<6\r%'`I]L%5m2XJBA'a$j@P<4VX`RU#7(Mg^lRtqd8.SAU#'qf/&kM*gBCV#i`N3flHMWCifnU4JLR"5c^Q!7("&>Hd97ie<tWsdbScF\r%(gc3D+>@WP`;M@A;^/IKVSE-747FM=_"@B9cnoWK#7N0aVAfA;PkbeRo*p.$n\-g7iFfm@cUI5EpsJoc?/t@pm=4sm2qfROh^!cu\r%5*7H(r?_j0.AkfFYqnOHmOq)FKh.P`IXenY.lUkmRJuba(Zk@^2PP)-h-5)r^YJ^bcs#0:DC`LtV6kW,L<GRrobrH"FH)]u37$)\\r%W(;]1(P<hV;23H4buO;5IbohB51bGB_b$TL]t\@Q[sb$6lf+f^YI-[^8fB?)gWsD4Hqh"Nr'GZ&V8Pqd.sT6q0-::m#IBE@R]p6d\r%m8MebGjROrol\5+1.2&4'NE-qdrDfs@IGqLb9T!]&_4a554ht>WdgpP:(<Ju-p+rW-n<%?<=:Ydk$5E0[Ns;dW*^(=hnb;S$kH.'\r%%sY]fqsn%O__ZVg9aMIZ)h'5`,I[7OHX6/HELRG;lQ7jf=9ph!K2);F.Kb8l]@jXQ+%ii>Mj&[%j0s.IVl:paGf0e$lp(J$7+L$!\r%p)aae$(Ro8jZ[`r00t$DP)O]k%1(u>]a:'0mn9a#GS/Ek0:1;^AV<*ckk1F8I3lgd5JH$9QO:s:$oCNqK%>628j^WYK+C74^-)60\r%Ij+hd5XhoFVt&Htm6T(ofM_nfX!MBSob:HlW[D&PL;*0-i&jRXXjC(K70I$0YN7"/6j,@Yi-N_R^3Qj^HsIH0a<C(=&<`s<YNhG;\r%`?6&u=%/dATj/;r*cs7JV:,HRYm4PD6b0-t/*@tMEqIm@DW-N*;ls2;]uWC7EoH]DI.s5dgub=:G44teCEZZG(OD\+)8D%::+ioD\r%Gq-.U\!KGJmWRn(5j.P,Ib5FN'7Jce3rbaXVdYqIZh_>oBg13qN>4Xl#JSHth0JVjPJUfUj:4?2Pl]e>G!tPO#Z,Yp2^n&6W*EC0\r%]O?:`=h1+`7LT,L%<pori7GKQ)p*"m\a<ju,TL*"G"(@n-1*'tn*b0'9>])'0d[5l_Qg9eY3AU,h/5eGCaWd.P&TV$,EgBQ.ga8Q\r%">cckfaBZ@FFi6fp-dk3HZ"Z!@L@H79G_6G?e(<H2&cuUB>:H@W5'XAc$iYcI[)T3gR@i.fKMR3N^-\n;l!XA"3lkhmQu.9AFcg?\r%4eLG&cJP9,o6'G>=#sO(VlicRADm@jWRE/D>">-d<nM;pY5LS^*]2*P(p@`4G^+)D(s,+'P/"rcKDXCU3[`nL`Gkq7Q*"OGo\Z;_\r%7&qUibPbo+>>r/<4Ze)iAnIa\.<Gc7JaD-b)u]#[`AN+Sf+5$:E$0N)Z,V8nPl/@dCp+hR,Y$@`#Rp$h2r1LMH\o:KR*Pj]W[YT]\r%2(n"Vk.%/[-P*7q28%.F10gN#F0?lDjH$6_4Ijp$J&GVODg'CFfl?tkJgS"2;i"$5TV&`-JFK)fMY(>D.noeVJAa9j3"4^`CJO?A\r%UhfrDDI2PfEhMPjiTA+)j&Tpo?tT81=n>-O7A(e7f4;r:NRAgc*BWghR[;pC`Q6U*$8!M.&WsB^GJrC=k8+E^0(F\(^NOhe]g?f2\r%l@c'%63XOZ%^OUpY:0=HW!A#9=3KmF>4;D3W?/D[k";HBDf8[=/bNLQl:\Ug*i'l"`_gBuK8LKAT2Q8t?tV7TUj>l-.K3,A#LV9(\r%7.4%bm_nkUFu'8_`P9.=s*qc74+)tL,SEH--Bh",]AK\3h%tqQ%(*kg9IWqO'\_AC)#qC,)9ASPE1"L\#gJ#]ND73a'mljo,F`/V\r%?u\4'bJ%%&'WR'rPd(\uZBj,i:&]j`#_.j,7=Q3Nq30I/>a3Z%"l'kA"f%5=%"j,4RW5EV42[oV5h>7%$b`T+*)#WTj&j\9@lTQM\r%pP::FJDtnCU/V1sj36l,hdC%DTn]O3<_XeR^Gep/8eo].;Ro>%WRS/S[#(&A+KK)o/&!N*"gVm?(?+HU2Rb*(T9Y2>K6o@g5*;>o\r%dnZE1o8-YbSJ3!=lNOd/'8-IhD=A50r$(>CfHqG,?bg)R;7n&]Hi0ekj*gBA]5a2L)ue@`r@ghfg@2T9pC$mQ`C)?$QMOO;mh[e0\r%n:u^FJ8XuurW:b%k9J%<a:>).BlL),@?KK%;'DPu`eP5]8IG87[f$dNeUeKnfbO',hl3"$,L":#=cdl[O4);39S/>PS%sO'r5\Xq\r%4kBdC04T0Gh1E<08.+X(_Zg<^QgIZ)Lap\=fcKAd%!7"Mc*gQ<n#!ma&uf8F9sb3'@qOIEba4],Xb-MGh`W:J0$4SS@(!pXp"hVB\r%$F/-Ll#]ihRMJIu#J]ea#/)FUS.OYA9jem%7j^gnS3i0C>r4nT3P>c!_ph'("M4F_3MS#7qYhcW[G@ER:P#IS.ohBXD5$.l1bK/,\r%AM]F_:h4u%DGEE8<O22M3210G.Q"k('bNu.a)DZF9ZU:,cd!(/r6=8D=/@b#)FXc&^59p2M\HUG:7I&E2+>oKB,k+T9LQ$e$s_Wb\r%P+7+V(qAKL$4L2qe+3@oq7:\"%(EL.WLE;ro^UEMl87/tp+i>VVOE3"(Oc]./=?dB,_D14RD@60(M-eJ[epB-Rkhh?9EqlT""'gU\r%=X%N]_@>ksQ6jAOF<5682_6!A.)*f.DHPog^@!@ebHTLXEeAO>io<s@QE2$kFtO?YLG=O*m,/kgo2.n:T*oXQg3R#Y''J%V38T34\r%ZRlS)27JqH-#(+q[B*9t3!X%g#E#Mr3!ZTsZWX.&LUp:&(65)h4.el53M3,1VI?C,>3EPtd?olp7_aN1*e;V-W5-Sd]%P!.O:CBh\r%3n1boB6gS*_i+rU>SOc6Icb<A\m]-:-hE?FY!u8Xi?Z0GU1uBuqq-`p\0$of;<sCEr5lBY/<?aei2alTdkLpT(U4$G?q"-iL+@SR\r%]Co"/?3Z'.]j[*+;1!AR:P$m=JCqoUL-+(3Re+,h7J(\Z+'F9Edc;0*.1l>W]Lu=e-seW>##4UY4SWbqGp0j0p3?.JoZaias&*U'\r%_KI8N^&YWprZTNb4Wn4m]N=QAChSDIo/Q2BZ@S@8^JYb*h<477'-A^l@MdiRo/?)2.5Wc''<L(Sm%`0/Lsc[.SRlR1mk+/iHlRIm\r%mqoM'&)k"0`bMI.`!>Tu<69K3\d-41Ktkp^&EmaDoMEVn\\_-,``BTq"9#5h*^2;ZfsYc&0>Uq.WM76D?J6kQbZ7]1_Fo:IjLnDf\r%S,T.lZQu9'*D>*o)E/gSZRBNTe&AJg/I#+]96[>MSo#`VS&PXG*/UKT!OnJ!Y'PUU.4&"XBGNc#%>JUt&!uFpO<t[q:9Z"D*WfNJ\r%*lto9<qW-Rl8`^7?'P6MfTS3lp#+R3frjsQ4hSR,9F7q'8M2&X'*ZM3jGi1B^8aT.\Zh?Eo(#j].n1'(o39jl.&6)a$-FmGJ*_e:\r%]7KEXKO/G,n,um(D<:Jm%6*q2N%X`e@mbVai)s?;3uYl+Ms@)I<iOeW<*XAf/&*YUV#*n3i(!`AH5nj8Cq*PZ%6`&pdD*3H1%`9%\r%C'Fq-UEDR0iKU#@=A_R]^?mhaR?66-:'NLckh4RQ7`Ng8U;T_1k6sLS1lCE)4[qFq;hgn/6ihfl@q?/Pm/]IbrE'u*OUJ>2jTYr;\r%p+&>7D?(Q<BFP"\3.L/*h#0FW_oll.`)]e).F%Jh87fm#,'(sjr_8bXY.5s?.e.e$1F2@b/tdnR!lFgc66Pq(]NT9uFR+Iri5O/j\r%[QHU&2S8-#'5S2"d$l_gCZd=;5GEBb0m*M=j$N0#SWESa0kcS"hL*B-k,OP2+K!]*X#rnsh@&PN_[JRa<spZ+(KH-T%Noe@(dn`s\r%lB%@Qo\0m\q1rEpg30;U;/_pM:@okAO7K8NCF'B\';(V@,et%P;\0)b&j4=F92B[&2*0n:"^W<jjElLA54Ht_rqKLPoCJd&VosTi\r%7^NrL;T![c&F5\>MTkp6"DIraIZ=h$UqM#n,+f?NO($Ocg5o<AOu'i>ISubY6eQTOf/C?#_eO@cdF<m;e>JG@OR$F?e]N%)[T!.;\r%=rj'kG/S)/oD=3NSR+Q3f"a]lj*'(+W<.&C_n`0/fId^W"D!gg9E%f%[H+!mdYS$FKd?su(XbimpBeH\?'m&P^\SPP*MI*JJ'^o7\r%L&KHKe#s^S;3F+_]b:G;db=$Fb7Y4l#<\>`,dkE-E[op$%8l?qX/0s"N_tRl`0Vb>kg7T3<RQCfa/D@<8(FS`Y@M,,S=X-#L*g$)\r%=LnieVu^0T<YqC(cmOjFV)Y90.u)ZBAB&Q,9BT@n#D9AMW!?$$e7"<K0;?b#'[L>,6Q-<1_d8r+!)-:iJ1RFt-`l1p>]GCAmegb^\r%HuCHm3`5uLq`]o<:bJcp[6Z_VYAA!(Ys(!sOdM/s,[]D[^Fsg/M.RSO7"lhn3op#sF<IQ*j3`ERU;Y*@$#g,4*4Zd6_u9sI9<oum\r%JLAO26rG4g)`&kZ_S@sWOSmNYW(4Tk*S.^s9T<a#TSP[=Ro+?+`if=&$GT.E/JIVUZ/b[Z&ZD%ppkE2J[_ro`jqBbZWIlKE^5_iH\r%j1%*<VB!1e/>UFjE_S]gVKEK"?GmDRO!Z)FX`T\YI=C=QaAi.D`mDuWcCt8s8j':T%fKEfYFjj^PIX\RW-1:n5,UN;.T=5[3gDJ`\r%j`5Lfdid_99[g-(Hh=B:Q!S]<]?#'MV'jI9"pjO?\U"no2rI@iBOJ<2.[U'C+IQHXPQOt9WFTm$;[ssj_l7\2F)H`1_/#$.djlp&\r%7L5fU._t(DD7:IX:J@VBa@NqjEUKB?,G`l,B`n37"1kXJ'57RF9gs$igIW?/:&#/#CqD(t&_j_r[a>F,6u5Ze2\HDeQ/$'82jV2o\r%#+d/ML8U00YK?<m*`HR(Va8dc6)MX3:ErH*fYc4kiG!7?Rg)fTo*#X=d;'MMf3j21MdB?=#<G-Q#%@f+HQaI7VV!fgGC$@q%BpN'\r%%:]CV5jI]J6dRh)o?V@T0b.YtPgQ"<4!;O3KF$<;@US)6PHt]@VMMC-?=$;E_"(r@>V(2C(/2>jk+cBIT]OO/`sm6N.nhuYN+=%Q\r%7d8<7HpTJtGHZ)3Lr1GC*elIIh0<D]WY0i3B[Nq-o>el8<d!U3>`st7k;KR%ULVfIZdE(F/T*]]0;kQpj;ue49kp>R-(?u(eRQRj\r%5ra?FHi3M6@tLO)*N@cbT&PE>D)P-$b#/ntb:3f#:LeK(NIZFmY.E^8;4#%?#5hAa/YA@@+<*H)\70jAj`4H$1Wdq41grX/U>#,[\r%f37p).N&?P-dliCQ5/>`O30=r&Tj93MU92QdBLI0c`>^"A.0;L(k=X"HH(K_KE9_&[$!-dSoZ,fXk<ZZZaskQD.f@dn_,`/B3^[P\r%\lL%p-?PZfJkjlYGGpohEsL$oDqr2"7ElkL!0nJT2eqjT1Uj8%+1oq9=bfJuS,r7l'`.n-Af^ge`BIB1WRfQ[rjG2[-qKngMSLdF\r%A$2^E]b`&0*C\Bp](^?Renk#d<rTa48ZC4dK7HSZV\6ctS@.XVm0be5Zj&-X&j21h:M]GKPJqGQpA%;L3;T8AMm<eC%#f!Tq[ggK\r%!5dD0>"u-@3D66IeTg8PSWG]cO#c?K&WrN?ZEUTP)QE6U1esFJUra-"9#%?j9M[0fmcu^;P3HZa23aq`)H/f$0$92EB=Fd]r2o,.\r%5q@n8!jte3R\ZFVh'uHKJMth'JK"Mi>a3,-23=_)p_L1E)VJ=$[AI"&K:M\V&+-a),dub623Hi[acd](Dqsh0o^k_[#9\)?iOg$A\r%8=s%M`D?m=ql*F4^6=Ukj66uAaJk,Z+pK$;E`aB&J:L1[RDlZS(lVq05_;Oi/,8?I';?*GrJ1QpnSkY=q'2n.*/)f)-UK\D2*HmB\r%huI#PktV]D=gKX/p*1b1eEH6\&TOHtm%Er:0]E)W'XqgFO@toI,*bL.[q!Kk$?ac;W-t!D8d`d;EWgePC9AQnA_=HoU1j_D*AuFY\r%k`gJd!C>V'RTbd@9/>bd&Md(?ZU*eX8_1@<]=fld8i?sF.7APFS('/m2TTE=Nr3:>fq;%DOU`HI\ME:$;.G7RVJj)\SOHXF]n"G=\r%Zf0Y9^=.n,CI`30+Bl]nUW^YF&Waf:K,Y6Ha/VA2T[=q%9\Z<L41S[._$"%"[AaR:N,/`[RUJ]bgI$jC1H6bO:!.X`LNcO5JWQL?\r%`j.CQAaNT3fss9^4*X$LFqn=qDp$u?5K1tF9j4=QBn,s'_%_&&XAVRUBeMp`gX#(IOCl8e2fsC@F+p6u$_,EU;huiG>lHGr4,r"V\r%lkcf;>[a__5;qq%C$]pMbUX!G_7Z;<`D2&@(ZQW]&-KC:<p3@#k+cUar,CCD9$JAX=rTn`MPtA>RU7,s*5$bL+cs,lh[OV_OgJu^\r%MtJ<p8D86-X'Lr@\[l+"8tI;0%#=C8=kM;`;R&F=\>[ZHU^^*9`^Oa!-#IVH73mN2M\/gUWO6RZa[j)Oc64&j(@6p5=gp\YekqMi\r%k^IN'ekqMi6:-JPVcZmIAl7!bnKf%e[;@1+G;DG)e6iEKMm=2:VA6r@j7ZLY;7C`bDi#'Br#VqG#TIAt+Db4&_RAdR$!qBCE\M-7\r%8pD[EQpG)>TjAdO#.\GT%XK=_@!"/.C.[^=Pki:gb*a"u.G0>q.VDqT]Ng\XXa?6ldpi.l:'R1^pYco1Rt@b,#WBBa!NgE[<t@Y6\r%]%H6/0Y<O.>KiUj0)H9[a?UOM>X5,TX?KT>CB-1:`9K]IW;rM'-WD1&TI&&dg-B@g.W,\X,PKRjW$kSkp4+a[:I+:Of]?FV`t#+G\r%3Nu[",'.(c>JbqlA.@H'<_+/@C3+b-.j?6tW+6`s.nqI#HPs.)2dM)'T*gZH8TY?)0TQfY-g;d@+Le+,>@*@gkdF"r0pfaaI-U:1\r%QSGGgX;t/4^,AQTpX"\<RUKr,Vbu#(U'koSFMFJ]kuEZm`p_8.4c5iIY=bQ#4gnqC#ftWm%W:8@3=>R#m#Ma\aJl2]f5PoE\q&%I\r%I"#3s^?.24TOq!6(1aHl?DZ4s%_CS*je<`L/f;+63bHTsA&jR]TDMAM(CXQu)@_Kh(CXOoGi&^IOb\&G7LHXRX4_)s+pB['1`XPJ\r%[It99r3i<B#",@V(F,Q>5'0X+#AOH5iriX8To5^X`^/ei^h&8H^6?nI:PWWKEu)?'dAs%h"j_$0hKK7:kY1">TaSRL[X(TETF1rV\r%3-3_Dk^l#K5Y6u&(OTp(:164MBa/%p,`1"$TZ]'uIe5TqiZk7E!uTXMg.@11S>d]f/rB'QR*W(PiC-El-B4X])\<0rM?`UD)s!*N\r%m>=\.9H)h]Gu,EdcnNrB6]%4[4b\)AB_ljtdJe!^$FJ;ldbo?U=]db[(mMIg8V>0V@YODoko.@KW2N5(=Tf>XRQ)mM9e3p[YH5&_\r%,3ORRI>:o@O`Q(37WPR<)MT42[JI/cR60WUf)`XVh:,iV?2_8%00,mEqNl^-bPY$2RNVVS3uCQg"g+)eej"\7a_oLj6i>-Xs!%KK\r%Gl3nXq3QU,Q[a"8J*G8X56#YI''BU9Y(Du"VXM9OJ,)inQabe&>1U$5J#Rr)-3\1NLRh\^ZflPP^6i;;F^c<8i(X%BVKVA`qP=K$\r%5&P+#HR+m7@lufp1Xl4u*k-?._AO.Yk(p$VVYm#<Z[R*?h(RE!,WF@Dd>+=8Eo(n$^2't+Qi!kMqTS,.ON`,R979:q(ua7_)2&aM\r%31aN7k!#iB5+Bo[)9dM0979:UrGCtDZr<KUiq4!K9R8oI++Zg*PDdg0DO/#>oq#'lP:$L$MXU:rai3!YSISCZd5Ur@,&[uF&*Qf[\r%H.)RNmKHSLUA6fp^\>ZQ>Vs`['?`Z:#SrAS0@6[ms(l+^""6,=")b3t`RbU,\:t^T<seYsMeM6ag8I\4q1`jJV&&`C^X/glcG1F8\r%s!n)O(`J0^=j`$H?+!_$lM)stc6k-A?6PGGL"M8I=qcX*K_RI)Q3]e"#An/Pr$ph-WE`=`^?ggEg%h6Q]%UJ;pl=JGDCW+B5J`fK\r%T1HDWY/(&NEI/q&<Cbb9]`d(_HPg0OdU)5;kHpRNmL>7SVU-93?Bh)Bs&Q:FQ#=<`q"5lj\3bm:&#2u9?"<*p5%Eg=D(J8fP$_l%\r%k$%fRj]^\0^jmuf\gt_N891j08'EM"3eN-lBr]f*ZClEBc0]p]iu^l;E8_g)E^.5niRTt%&j(>kE,0\`dmfln7X[NS9)$ec_QB:9\r%'.gguof9"$IXA%n:<-4Q:E;`a@U(],JZ2/o?ig+a#-u_B(Gd"j''rJ-["9X"H521582u]Zo,U/B*6hI^1k+@q@d"1N(Wan7LHp/S\r%\_Q*G%3)eB"),o8TL4Z6d1$$P%7c@k,/\8aN=i1+oLD,[%RIT-HBU(-239n+_n/-Ji#$8%?4`:#,/hhs%mo/^(gPr%VOj\]FY^<%\r%kNCgc@5?$M6CB7X8pSdiDVf,\XH#UHp/GWjSjn<\S9?]icgt++.u^>t:\S7u06EguAg^(u05a:T#AZ*"O?$$phDTYB7*(mq7aFNf\r%Wq=Hd?H(gb#Xr"=qk!PC:!2(IcfgMuCU,cQ>I%cd?G7L6&.0IBD!<h[ES6i;qg'n(#m1R>FuP!6RJ_B3ko+WU?(Wefm$8alQ#C)B\r%>b?_s@!09ar+,E*o!!:V:Ru[OkMZ;'01Mr+Jc6e741HU.RcF]8hTLHS,Z1EF[,DM='L&B)'+(/=`DtiC22eQ#((qa$oqNS4Ip_1t\r%+7MLig!2)GonR5b?RLS\i'4%ZmsEB*"'%ko7X)f?UiuLq3*CR?ljYipa#_%T1,,ib\'k18GeF88nqXu`)*^p8CXp:IBnV+5+[dqc\r%DZ3Co(_<A<V0A:d`HXW<2P#3<_s2)'O>m^I0Z?F4b*Mm&8s[MGQeg_\bg?%RRqB)fkonAh5t1p*nSO[Gf5=Q[bgV8iBh[T'4E]0a\r%--Z:%O`AsfQdTu.iK;;tJ0ZmN&qKV)Sl>#76%C6UO\H^P/CIbJ-%eeR/^7f[9pHcIW;Y8C?F&ApH8]->RNOmlTi'koXR/Kd&8%er\r%1!k:#U($3=L5VQj>_eG/.u\!:X6LA"TgV(8:R"-,m1@[V*Y./:(=>/`QiM>_0XC_7VO9b8!9pAgq$YtC5PuRg(m=jmRS:!#Md4`>\r%%NjgfDm3e3,[9&;B&U/oA^#t7X$A-[>:Uop#4IP8$H^kXaECFdODOjG*uadGFE1hS,[9jE5\H]o8@I[VgTkbG1O'85Fe*DFWrX5/\r%'WNM,[=?:a3*^=tP/`3#1j2bKhtD]Q9)ST!:Z.n!gs4iHM-lb==$G_?RIO<t=/tV3*bo,H8OaQ%)0E,bMh&cAgmm>f\,Afr4!),U\r%e5G/U,X`diRFt"i[O_-BS[%56Dk=XH*N'<V]PV]Ic(r"?cZnJ_IWHrVjtkkI]F4[ZD?mc:m.M!D/f;)`<i8gYP3[kMI!^!=mH9YM\r%ioKI;PRjsTmGar%mGb5.b0SnN>IcB*`eA_\dKq2/ZNpCMoSLEanr#fFMLP&t;U,HC\#(:0!<C&69"#k(!<BLUq8h%ia%=_/&oNoB\r%;B*!>QGs,B,(/k6,DrjAU0jRMU2Fo*>K8a*#)OPA$:!EQ5ngdW)ar(6=u)ri"#Q-coq:;u$91Qu"eg:8#S*#kTXU=5-4Zq38V?#=\r%`l.8W;iH<]g`G30aLNoBj"`iu1M)2kd)Sa\k!u;lAtR;.h]ZtN<+&6?4HYV>Mqa?h_/CJh*?&GF*(bs=bi)8cS9#!V/o(DEK)L?^\r%/Q\C?bj=)`C1an&o7L[%l-/M8+HM948PbTHD>)#?aNPEF+g`S[bflAX03:sb1ofPN_aUQ$`UO':KYr?iLC*%olk()#@_@1>]4THe\r%3W@9R_@;[6O4Opi*QORg&4W"@Lq*YKd)L_Nc6?s"i;^T$,OkAbnEmr-S4j&+XSh8pd8^^KU?SD@V&*e4#U#OQG^1,sd#6uT.6HKL\r%Fa>e)"OK!9DUl^!>['@)on_nu_;%\Po=But>P6pd^IU;%o/TVXVBFnPNrI`rJL<uQ]F;5abj9^2q-R/5hHrqJa[Y!?n0SdZ/HU3@\r%dM\o=2Nc@gas[,/\qmeNcYU.lWA"QJc54Z(6OsE`l-OSYL.=D92q+1V8^p3cN$d/^5>`AmFkT*Tp83sh\*ulO"gO8i]i@GA,`NQP\r%[=nYiogEYa@')Ah)GS_);/2NQA.l:=q%eOA+h8@^'e5%i2=!`4rJB6i2f?<;<@:Xj\os#1Wp!'`dBKY)YI\3MUcr(K_t?>AAf-1!\r%Wo/5(W>D#b)RM-_dXW1c()g1Z'BgU^<V;,l(Ep8J^4]8..bN%kcpsgDKs;u!1IZ55im*^Cc4goQGMt*/kY+S3E1;\!&Y1?W*Uhmp\r%+JLY<T`\WFP))jVTnB&8_N3+H;2oN)Q_Je.QA"+QFS\7pmG"7$;R2CCR?M&fi0cf#Id+QeK(_2\D9n,6Yk13LaVuV*,$gr7K&<F2\r%]a9Q=RG!C6U-FX+/nIZis+'.cpp]PkG/E)`!?5U'=Lp`)O9+oC5omKa2'P?95cKo:>JH;XgF.YKaWQ43M+I:>imT379HR-6+:&\;\r%!dUSSYF<'ZSC_+aiEp01+GaB5Lm(=9l3M0Oacf4%l:=GP:n2U]jH3o:j3Ko/njl%en`N>n4N`<b-`th9CS;g2Eoga&nHSsV.#%Zl\r%G**<=EihSN>.I.Qc'=0M%XV>Q*5;+rf;4ZqkR7AU2;u[7j)75aANeac(4on8^2dM,]I;qEWAa`&oP^!uU!>fnj)5M>;7u9qY4LF3\r%qCRsgFI^fgq/F'NTKaIho8ETLWcZjOGAD-q_KR-=/j$J^)EYK[_SQPqLHrV.D;]n20CQ,DoY")j)TV5Cn`7#Wq&-$Ljn6N`bC')/\r%No&<#Ao*"S6IUW+JnmTa<E4Z`TS)')GJo+n>a@`4(!qtV$\Ys6"gNg-$XqYQ)R6a$-]?KC7fTQ\p/r2C["$Y%qs;mDV9qNN_n#_o\r%^A;]\\5uY;caU*7X3IDSgm1C%WCe74_fO]PY,39_`mN%3N`420.6A_Sb_tkPZ.]tu9(HAtAZRs;f!h;B5AG5"$<k/hOSY&U/04_a\r%gU5"n&*p13%uUY$bOAG(-BZQLZ<l9c?]&\,5./N!`^K:l7)/"[n^^++YYbmsI1rrUN$c4,9mOFS`g3Dj:eRWSefuU2&8ZQnN-YVV\r%<rlUr;.Agq6l59M&6B8nRfrFnN-6P[."]j-[e=.rG:*@WI2F1q@l'[tG<!>dLHC\3ZJ[UDI#XoJRLFHgh["cJdD^0JgJo9g-%)fj\r%\:5/uB(JIBpNFmMn\,kA`=fT^h@Lg@*'<-);`<C8c"q.!(#K,&agiVY%/a?,A%V;M[J_gXl;t56bU%Fc+nYajaDci.]rPQ1Ac!@]\r%07g'M__/\T,BP*D[A0tH&Oh1$*4$CR$2EC<-@Ab)lhM6m_LQAEK)c%nQRKaYj2)VP^KLIj(:dc(*tr,qH_51mXuBQ(EW@bMn7m$K\r%WKY5"?M&i[89<;9h-bh9*]0;ar.qi)K4:H[Z7dD+]tKX+VJ5CSTprGZL8j@H-=gHF3Ua9&KF#f1(<t#EMGJ.EG;/WZaln1n@S9+o\r%+l[NS917L%r)L>cl7LNg@DqK%;\+PLhOX-XV*#<$.s=o>:mnm2Dm%LN)(X^)b(,et7<+#Rk7U6k<f"Ue;@MkQnML#93F:n>P);Uj\r%c?Lk)Ls]lc(N.;cC7^0pC?sBCd6M3J;=.9d&2V[LnCtWt4tjdr?3AG^+EoeRVY<mZnFM5\JHH`PS\j]Qj:/)t@A&ZUI`8W,pJI2W\r%4J6=u&Dt?@KkoX0=LO:r;f?CIkYWf"1Od9uj#suiQ"Ha'KD2D;G8Rp&NS\+=INd'2Y()3-o5<P/PFR%WG8U0.VXH82G8O'Z)ti18\r%9&]Orj*J,en21(@M<9T`qVj?E]R=L4,VqbFo/<!sJhr0\8+<J;V!=c#UC=jJa6n3Mpk-a?bGR@!lUF;;/**FaL\Xl)8^$)QEJ:`G\r%%f[@uXFVB)H^-I"/pGi1dinrfpeHM*Mg-nt*\pFY(cLp=mj3Y:Op0r77P4@[pWh`iWK=$r5?2X-CcV,a@*AA-b#<H7<ha`TmI>49\r%qkVk9\e5/mV"0?(oM/N/;qAFsj1CJ%H&]ZVO78(Pnf#X'f;&WOM-EIY](CO<ZVm:EXTE&JdY'ji!"_hP<Zoc^p1@t3"!B6l2'7Jk\r%/kP3sq5m:tHTq`>OtJ\WOs(-Je#L&[d.<a[A2+,mKcoENK+GW6!a9Ad:ga2YQnW2ZN)_lVq&q4O%7G[ls#atgO#=mn"g'5\B]Qoe\r%IhLJU2G\tg"I?j/'AlLer@-i^LI2uGIft,N3+uZ;,PXP)c!T[-E,6H+PXdJ4B$."PW1`7u"6mhS\q<2,Hk+t`B/E:NEOqDr!d4+p\r%.:cI*co&MLdX)N2\8"*dc+^JWE:D/iI$fUF3t'eIBs*O-'k(K8+8+&<f6@Kj5aq7?m.&PO$"hB@#BoiL<ogEP@b4=4'G7mVVUuX.\r%Q3?9OUH>mO1/[BFH%!WlY*r%g[LUl3G?Ms,(`o%"Jb+MYMfOR[gs@&KHgfdaG\Dn6`Rg>90FMI6878\&(7^GG8mq0YQ10XP3O^VF\r%]O`"Y;H*3D;t)h;+>lSP1BebA,Z7S5kpEc@&kPgNTpofG?YQ-d!Q%EhDE;#>TURjQDrq[8A2!R>WIsToSVjohn&"H:SBTDUMGFg^\r%1^QXLB[.$p<GI7>K/hmd2*,;X5!$Z+,FbCj'MW-f^H5%MSl)tZc";(?helt'cuN=H2bVOIR_^H:]o\.Id0rc91CUhX'MZh"bV5ie\r%;[.aq957p<R$1`5:JQ^Sqr"KtF5G2J`^M/HBqH4XG<RW\cA>tLbTV9VQQ)VJQQ%WK[,jTZ=8ao:_9dF-NQU(/=^:G"Hdr?DpPe,c\r%?oK24=!AsOU+@2_nH2_ArYJ!Rke)K)`?5;18ocfS`#UEb[F2\l]4)Y1D.o(WWZ;WBQ5W7m2ZR0;T]<-(6?cfh+rB.Vd4,^00sgci\r%X-VO-'G7>'+o!X"&WmtQ!mcZ_7!*LNO,2:$65N(fbunC1/#YOG+X5h7Fmert*`qdigtU'?.EAdaV`t#kkk<KG:C&8?Dp#UR=(TD=\r%X'@:5^@^+2I2n^"grK$U*<)C[^Q.6Q+7OmboZa5(.1E%HCK.#V1)LA#agrlm"[eiMa&(&/:ZbP]*fH-n4DN"Z?'MqYYr][Pa.sTh\r%,J^4XTCDD`2,qAhh5m*W-_D]M4F-h/QL65ilA&F*/TkE4C@V"Wn4RWS/2"@li"A(<Qac20KJpRoqjFURa*B3SJLbhBHM"'U.tM:.\r%Z&hMa"2[Mhmeu(3deUJ?-lt&C_;KM,.ok@>qIfEKb/;QpL^CNQ[-/h^j!AeEC7jN%01O<)RIk/dbi]5]EhNG_QcIb)ZL^sSqFEIH\r%[7oPS/kupj9dW![9;d,]VX2W_j$2;AXiTcH6Rm38c0.=ffCIQ/d)/s8M)H*\_RGh8J0^ul$/(&<Xk4@FN>#>"WY#D,rKuQ,BS3Q?\r%@p%<6/kQbh!fOFEF_Z:ZZP.Nr0_pD@kJWB"SdJDo4IjF8OEoppSK+9YE8.^uh<OdfnN.3/p&SDJ_'=>D[Q$r;[9ETh!+f*JCAHD0\r%,^H]AKpT8ER&&^?+"'jAB95a&]F!1"*Ff/S(LWJT@[2d#>(QR$-bsgEAqc?G;!&Ht@s>]FkT=,4OM9.KD,^6BjI5m,nC&bT-[D4I\r%5P)-hI@_)j]o^%g-LlT)nNVrH%j<u+NJnLIEAM]9"^dtWN^_iPY)Ha6?/tm;'n<TAhTI0M`ulbSQ:(6n]sr*T_K(&B?:H^7%I'YH\r%=B%;Tg@6lV;]JXdmP522.uc+Cor"R8l-9m<6U7[nWlE^`A^]^unQCokX.FD_FXG0l1du[2A.G(?kZO/5TaB:QnIUurTh3A)5S)+B\r%GA<u(g6L/.oMX(BE*jDBlW"f"X71-j.`/I.[N1:!l.,AVl6Z,\^IR.XSjfr0>51^l+$KGlch-`Z]"GYiNmXH:UM0-a^P,41V7sd,\r%T.O%V/:#oi+]OmHHCie-O'6d.b1k';R6A3r+IIGd]e!hmiUhTOQ@7Z>3rbaXVpT79eiqFB4,9a0AEPgNq"u3.2ZIs`c1b!@O-Peg\r%oWXbKK:h@in?f>6etX0JW"@/u0Qb9B+R"_aZ#-AOPQt#S#MMb'&`$KtLY$]!9]?oFMp!s4)b7d4H@7^b46"e\_W1`jM_aL@A)6#0\r%-uK4hU,=B%IY3qE.:9(BGZuj,8_X5aduBs$rV8A/X_e%<ig8o('G/V'!/T5].0SE,JEW,6)ZTs>U(o&Np_7QF5faq25sRp?+?[VR\r%&C;$i6t:a".Y72sNl9<0`Y@YQo0>\25U!cK13qH[SkmHn62fK"'GPYOXP26YJiMMN<7SE('Qi$Ni%tcE\'m<nWbouf>0'Sd<jf'_\r%lihGcZ)VY84:#`.2BkhDOhl[C,1&]11-F1rUY@YiK:EZtGRu5t>Pql&Wmf3)U)[)^<>!6<gnhBI#gi<7&>o9]E0D3I!":Mi]`-^\\r%Frt?<%PD8TM=pe!Td'I;OVCO^(t!>(Xk<iij;_AqhdtI1M!K_\fo$'J3;R6sU3G#G]]il=<:`tog^X[5F*_3E9@:+d6kp?:c?Uol\r%K_Up[$S_./MI:us_J5Vg4:&4uh.<krRb!GkXC:Rejeao1JoYs7g1X[='pP''Z2th23cRV@De@a381\aM%D?1U+3&5qH*P4]lD;,4\r%](TLZ2*b>)Lab"0m;Z)bLh22u+iHt2+I3JJ*"WU_EWH@'iKGZ@O^>>Gl'JN'a3&X\6/R(7!%o..;.OGH(/&YZ85p!)NB&7@KBti:\r%m&531NUpFF_%,&5=m!>TJfVLJZ%Y7qT1<8DaA11^5&@^4XD_FHZ:?pd@/qsjm)Md:^^HgGEe$8M\4l\!)d>$1#!sYq,j3pKAAT^+\r%+_K^c$th.:nQ6*E=<cLbHk.kTeIm*H_fGZ!edP+7KVpu@RK7DQ2'BHcUP1dkc4p%_OG,=d/W\F3qe[Hd6I>GYM4'IV:ClU92nls+\r%+@ji-/R[K@&<0`F#'RUJ/'7V!rB+M#Gu#):?#NNII=+Yti;FZ-/r/@r:I-EpgjEq8JrUCIBmWCLME=[GK&b2qR'U7ZL,>QKX&p:;\r%fsh7baNDdcMap`b>b`BfVccOs=SCc:Z'hA^4Q)\Y30)JM@l+-H1Eu<+hqXLBJf*:16U!D,!Fi;);;/Q]\nd&T6D10e1+<@@dcJWt\r%h4HJcs-@_W82J!toK/N`[_N]NHI0McnDmN?ml,!.kb:+DZ.1E$_->1N\t'26Y6):@,<69$_i9]dX:9WQqo&sm,TH?f;koS=k'Pbt\r%_.SW<6E;CZK`ol16OH'9OnB$P9K2<%3qepbGa(Vt4.20Cl!0>LLm(^2_7ea<rH*_N&RVDSmlO&/i40j%nYm0aYUNZ/Lm0i4-`?T0\r%F)r5eX.nW;+l-&dQ>b"bkarJr]A%X9!;7^!=o*go#sna+J\D,l[K%:<@%]*e72bJ#YX:CcF.X;"d%%&!C%Fa0dW[fZ&se;`*O`d)\r%GU(IU`nLR1-dK*Hn1O#7JA.g(8RF`C=gMA,dcq%DHia(-BtU2hECsTj:1r<.lC>^13lZ^RctL3"e6"l_7LW2YhVVG2XoLn%2>[IA\r%(o2BcM7Q,*n=%\0^?@4[)aQi(]s59O3sI.DP'*N3+/dZM"tb=XKr[TZk4Nc<B++h#&[E\7PS\n*.i)b&nZ@<*:%7!o+8Z6+H8H]r\r%!O6#0&))P+d^4:EWa'>ZIR*t[)&e*&1@1h7P$rd6FG1#B2q!e8O[OhA]>0`i@Fps-JBZa)gm6&RS\e)F7o[V-H5T'SdF2$SWBGU^\r%n2&ElI?VZ26L:Mrkod?UdpRb0-Hc2ISL.:]kK\`SZFB7K+[-jZi$k_lD1mRZ9I:?sa`E1#0><0O\YEUH3;]"k/j5he5D67Xp^]Ih\r%@8#ns5aUuK/18/#6taKJdHjNC!c3^."Pf[9)/d/7r(I.RUW'Yb2dJV(*BiELSOCe.]IciabEn;[r`'7Or4Gb)1/A)dC2)68)iBLX\r%.;BhER`@=q*:51#R*6t)*MclOZ/9<7hDQ#Pp/sWi,n0k/"-B<c@,%$5:iLE5@!e](DFf!^UNK#B/b9?B2#e$:fVFA/dhTg$B/)!"\r%lXYIf#V,fFX7>l4D#ah*UEGs#m,=V/!GNP?NGIPsj`WRNZF:p8ef9SkmdQ)#NH*PWE?>I9C+`iYR6TIQ5JsFQie,:oAh:ZI:jdBR\r%H[jj!m.tjL+#"ao%jn3,*l[o40@fFph1Sk^00MJs\p<o*Q3^B%']g^Z<d9;i;!@^A%MgMh_=AOL<MZ0*Y,gY_cZSd>m0Er;FfWQB\r%V`T.%UC3B2*sharc&Z)q[$6%eYcS[ghNT8#k^G8@%ec!X>4nGmL&?.4Q3%pkSd[/JJ0IhEWc=a4rH[E<X?+cM?g;;=U%<)GFB!u"\r%CD7S"U$89g?=,_uORPn5l^5!Y$'/`A]F3^!8WoY4+@+BGnrO#G9X$ZNiB:9L5jAZV\"ljfcAr16pQg!npnE2/"ij&2_ZJBf!hE5J\r%DN^*o0hH\Rr2T;EQTP1WQk1!ii2[LHq\J5Rc%M,K:+k)l#_M"IMB!7fNA;@kV+E@'69eJ&<-Z>^$\tqu40Cd_3A3IMMJibW=!b"g\r%2-2'-f"o!4jV.@qjdUpP-a\u5A1/.$Q"t-0Ru4h#$'ibLei13,i1kCVK_2f!!b@WPgm6J[aJ(gITi^C:fQ-2b_Kl*M6IjF>H:51$\r%!TFcQW.JrZmNMV.7Q4ECFncgYI?_i1h)`8?^WKpJ+`qc+3T6P\;]?k+ioTH"hT7'62s?+"Mf3.i-Mb\+\q-8V&)WI72e[fn`A`s$\r%DUaXk=_fp"6h"EX<7!&+ba'aB1hNd(o,uQ2+9[IjR=r5e4"ra15SSn+I8DC5a?$l-\fl'pP4e=5.J$H<nqqo#g#(e)q<3+!C'=K%\r%U+cWG;D4T:"*?AR"31JrFdQa$ZH)WgZsa?:4QOqjgi4X=./;5lpQB'dfe<-SWV;!/(#D+aYj1@g`ht?sUG!,`S><IsOC!'fVi_K3\r%r\ueZ,OE#6]P^u4i'Y5cIRR:#cXZ?[3.36i`=M!roLVIM%,]FbYH;]U#a[7Hrqmgc%D;,eo1L0rhq/J#3(2TZ=hFns_rk&QGI>,*\r%cLRt.d7Qt!m[\TV^+YSTn^j>!hQRA:,?MgF9]V)o?\f@XHkkI\\qahV%@1uDa[hf;j"6Ec$S>`(ONal-;uU+F+;rOf3%;>rOUS=W\r%\nVo'js9Sm*Z;)4"p]gV"OFjXje%B:"S<Vb?O1M\%N<X9hEko1FjMaf*E`S4%.(hsGLG=9[-ScgfhN?h6>6!N.\R%4`6FDF0j?!P\r%;%Ou(oI:3A4V%^>4Rs2ol_$1"7i@t5(hckE7Sfh<?NlTYkJ_h]*?()EH9=n,JUq.>!3$hbei0<23*0O5!T[.KDY=oDP//<o8/e%^\r%QtSNY7kuPa<')-r!`pF?Q)S2?o2$HYTpIh&C#B'/au.7?W3i6l-:9H?V_QcsSg\(@*3U1^,_P56K1q7FSd$ND@n_k&,ibVX1,Y59\r%DB-b(RU)EpZ<t!YH$q;H$g^]KfJ?4PTY$'#9bWYMd_,M//OlniXk@G/6uWTd=<O#VX.E[k:L]1$&qB<:ep@RHVO9O0bLbRdZ^Vkl\r%].6T8_riK9SZZeG)*%LK5[t\W0WgE`SADcEL\cls3.pu$V1?Pt3!3*O%+$s8B3^Z&ctL4_ppD,%UL8@X#9sId>SQ)%X?t/CKJR(U\r%oaWjcKekag8lhaW9(&Ri(TE>@XF^U#dZm/.BedsR?--\&]ko]W)N+1<#kVFUoXDMR_j!!<cB0eA2>7d[0KQb"QYZ_SkU1rl4%F(%\r%jj"PF&dZGR!Pjsq,nO`IZB7j(&G$.2WmdXE!\o0)p[K[F#eDeo'hBYYODnjGmc"jC]/tjjKeujsbAl!D;%\`3^8Y=eJ!3P%D$,h.\r%SNiIW1\dLJ05nH+[ZYr4a`?&\S4j)YN)G&"h;m:\7B\cG`<6jT'>Z7KpnU5u)'$p*o]R:!.WbER7WS*I;`Cg?JNLD[C'\pO-e1mE\r%bk-@K8#Kl92ji0e:cf`fQ$\RjT%<k30!g"Ns+1cQPGNC(F-k#.Y!VLNJ_X+Zlc5^+DQL?hW4tksleWm+>NmdRchTcX)89I"eiA^i\r%:>%_>#K^d#5YMR3e7<3GHBcU<LXjEaoV\H`IPIcXb.5;r)'Q_d]4n`p?&FWhQR88.-Sn;f5BZ8E63$NPKK`QBrW+LVF5&0%0;/A)\r%(Ic?G,7AJFn`mo35rOd.c)]m!aLHA7]K.?2Q?$RjO1R@%%V'QWp=q^mKc15,KDf>dH/-#GgqSs\@mr#2>O>?'H`Ka"ENAJ<\gWJ@\r%pSRKf`5YU?4RU:^;.VrlP349VaQ$;'5`jef2NM'Zr^/)jE#uJ,!-4Og4#b+JRE=L?#!af`2?Yc8J-6U<*=-0U!5YI!4Hqq&N*m<f\r%=\+<gb9GTaBp`9Qh$.tm1B^(U'd!fGOW=_h<^a0Ca/\"XfF!s_"4,BF@s"Y,e.b@IrZ_9lnp6N7*BN]A'U0V,ED&:SrUK(?2riu@\r%i#s^?!XDL&?0%=oo],CUL]i)D?/mH#hmXR@h]=<Id_+T\DpHAG4aKJ\')hSd...^#f:DDOqVHePRFiZf[d"'7`EeC;ZLoFt:L5+i\r%)hf;U*)siKcbn(eK,ELAX(8<YL]3I7S$*VU]:fQ)i"L#-g/iK/)a4T&^4+n#l2'"I7G/:>p?\nCZ<_Wa33g_/fb'[:V=HMb50+3Q\r%jJ"3JgJ"k<Z=Xk.nhsE_OGgCmD_o?:_)-%$hI_WSJf2Rk]Zl\N9r<S#,B#BW#(a,;P.]$R)[)e#9r!_:gpT`pVprY%BXP3_e1i(`\r%F&BB*3mMiu.ucRo`,.KmE$K9g+)B6%]Zl\N9j9noKW[!YDM'2AV`6V6g)ce[>,1(8EYqpiE/GLcUqFs:\.*V-D$Cmr&4a:4b1fUH\r%gNN"5;]ZsSi\l6\-<'E6/T([0SHB&!$?7#2+qlSR<>2j`=<:1^S%QGbI-e4uZ7'WI-#S?!ED,j\;rT^*6XiL@AkLj5T.`sZ&7BJs\r%TA/C6$irQPS)$rjnhsG+2S;Cd7G_WKgkKHj;;S_g,E2-G7fRa*Rd+),Dd!krga9X6iV]OjY#YFt<Jb?V<:jFY0'@eNh^l5=D^-KI\r%4&#-''3!q76tXJ.3QLLeZZG."rW8Qs[VJmAg(?P_r!Hq8Dsa!FedtUZkUi&I!lle9<^r4VhDm_eQtF`TYS-N*_`r+AdR^PJ^HU0M\r%Z_[cSWsYj3?"8rEN6b(q#JF&]a,nPR2S2Zs#'F$OZ#'2<\M'<ZJ#I^gW%7j>4hRkIjn1,A"_W+C#uTppCetl;qCK@*US62Ms2Dem\r%S"2/N>J:SQ<49mkqHHQ_SQKVWU"$bY!%ter%])Wn+2h&q<c:P\oiHAU4=rnF'kc$rX(BdDZ^YoYQjt=QFBV"4>PnbTF"57D)q\)4\r%REM@SNITmn*.;;-M:?),W;5er*&E!]UmPP(:`pFn*\`h%Z;%,AP=H)2pa3.1nqL[@'%6d0nZ3X[9][g)d\ul5WjSN-mmX9_V7-?h\r%<%+35H`iGo.abBZ$O]mM$!hCAOt@1`;+5j?Un$7*<1)UQ]:uEIbH?JJ<DJaJ2`42E#Tll2%mUc;/:9_Ojji[5q42DT82-`bEOmUK\r%r&(?KKj%csO\)74G^8XWTk^H$"5]C-:i?^XN2KLAaAalCD_i\WgYS26o!ZtPj/lS^\PM):C!gotjr7+H>BGB^enWUcWbu?13m'&=\r%N<@%4M[luA]0/3N>BHNhICD_%FGgWt`j\)lm,;S?_WB+)O%HhE!(N7T"+*p'fqH>"*>bR'ULP;[WOM)aeP`56LMVmoh#_m9!,pLD\r%lKHrD/nI(G)b(hM2B@C?.69@-YqnhtW,oFu6*6tB*BoJE%nr9>pl?>`GBoP1E8jV,^*radFRRsl4H/hO/us"5;][048!1=":&tn$\r%g`Br*&bnsi-H0$7dCLA/iO'HKMB/(7(on-ZT;J#C5Cek'hM"W%n.b_Cl2?EVfm.s>VHD_EY";$>dB\g?7"$$_YLP;tH3fiaqCPH1\r%9Q($1Dm>C^<t<t7%5je[K<rlSeoH4qe*\or:aSk>Y9oZFXd4\[3.ER")*DK-m>!%OXjgjLV4h;HaT..=#f4r95n*N=2j,V*+D+<V\r%Nk7`W2YaE6LbeV^*\,h=,45FsQ5\T^)U,P3CfG6/dRc<mRF*7Z*=nML'r>'PT5MND=Fb(q3.aRDLn1]=6+L`nWQ3e>AsQ5b@p"CJ\r%j$=ER`@"iq'U8>nm\pAt>m^r(NkMin[S&n4)L0MJc7@0+kff^agR-F5Nm8'h01KI$N^F<^+?"#I"2gn*gO!*G)l76CZbM9kYt39X\r%7?b_*%=7I2-YZO.)Pu\%T;($$.QCFoK.._kLX@g6&@C=#=A59]3Gm,\n&p'p[f+37W>T[9T)L?]VK7Y2)13ihMmH;b^-ojE:L(+!\r%r@nsfqb/@YiGHQn*0SKP;&U<8CsR$nT;mjQd,[@7q2]qX0fLfEcDR,=1O-R7Z2S`ieqP-"2kpcZce&e9#C,[V:S^]k?fUm%;4Y)G\r%BL[FA*Km:0jEaI1rWXf47P3k\4<4P%Mtrs7faV^hB;X]'-53//pN/ijNC,F8&tP2<0kqPJiG9niA(:"pM11Ah0ksg'-?\!$&u124\r%##<Nf1.LZ7AjJfI:ZX6B6(aotFC&L0V$HksFV_>`Bf;]TkYItN[co,c]09UMm!TL_2$h>!%TZ9b:G&NrGlrp0'*Y(SQ,EPRg@_*g\r%`dS`3[J!)j,%U0ld4>Q'eq<6V"\=XY=jVm16<03XKH,V)!e=U,Z%[[m>!49U$^rIL[9*qH1V\cu:lE8NM_\HI.\:_Qoq6]1Yi111\r%MtNaY^6pATQ.CS")iI*12LEYjdPn5FjJ"hs/T-&VcsOEBkR5uQah-uh)\9)%1\=)\dIF-Yk;]eCH9WSqOgg+(><@e()P=pB,dWF>\r%4RKKm*Ap#n-UF(*hT%CIXZ!]\d;kC,]"HV#bu.pK^sCtY-^aNVC3/>"[pOS(Y0B9,4r!2,P8cI*%XXCR^j']+%u-,6:5^<S5Rp,-\r%d$l.0A[-rF'^(]+bL=r,aV!o!n9f5U-V(Q$!5ID$W#BWrfPg8WpckZS@tMg"G`PI6P4&&fL4Ei`o3t_\n*pcTf9g(%1f9Zqe)m20\r%38<I1ZEI""]8iRLf1$`I-F@KpF"^5]-*0hY<"<"!A&_+BMcS"T1Sal:oqA!k$L8Hm*YVT#,3YSmgG!nO%M6]*kb'X;c&DC>iL@<s\r%f'2->Y"e4FY7tD]4ND(bNbqQ/>:5e6Jks#]4bF5Xe(!-$8Scf-EPk^`C1C$RoZ=."L2Kc@3Q5]s,,4>o$TOe-k=GkUkcZ'YW/6M.\r%+odtJ?\K>K(coVb%Y'c:KhaZ'l7%<fcej,m)2B8@IouUZb\T72YXb*GO[+)5G[OM<-9TG2I+P47p#3E"nb*h20=-Y%:"IQAO\fYJ\r%_aIE.D)M5[KNe9b2oh_&en^p9\W3pl!h+b!#Vr9P&/TC*?:H\a5Y4Vp>R,,64lYUK;QPTJ(ERE^fQ-2VK[,lF!bgm>h<,'9eO.kH\r%47O-7C&E.`q-Q#D<9d/=H"\+X_+E8^qe/VECB5sNW!lFt<VAWMa.0P-ZD+=.XfLr33\$jqWU@l`D5/\2XMpeJ%CDCILf>%CYJ'Mc\r%FEC/#&An[QA[gXq7Il)VA@FjFb9jns0=ssHQoEbRb.BY/N_p`)UK7J!_rufY3Os]5BH#cON&h3/!$uJC7[[^0(M++A>@S=CWV7-6\r%<hFfpPtr,EnQqdf3A6Hk:^"HoaoIA"S<jI_s,;"I$&93cQkA=pU9Z=`a4`p=Af-L;Sf/LLH<i\1b0(W*kaK#E)mgGj`E^=H@@U31\r%M+e=Qc?De[-\Bl#Z>`&0-gpc)oAZ,=:'@6l1ZF2l:=R%h.-D:`G.C[a$97S(FAYd]i'r:4T@fGkK'.UOTg:>(-R\p7M/?+3m<$MW\r%.THR3$FnSJNRi(V9hHt5bo<Xe7[r6n/Im?F>8LLi]MYM[E(?j\,GZ&*&";BOo/JKlNTJRKN=6h)NAY`RC:k/:c8%2f8B5le[HS;c\r%*rb<LB6TkDj,MQM%(c0>o1!Ic#+^1Z]TF+qiV1C"cae>X8.E\VUdUM-;F<44+#CbQQ0-$m3rs-C\n7N9K%X%_"X:hb_&f[!$`'<O\r%P^W&@>Wo_0p/6.646>bDR9bEJa#R33T*r^:H:1gFO(:l].7M8,,L]n/=1J;[=-)]EBSG+p5'Han^8@rD1L5O7a#R33S:08GZ[<<+\r%1>DN1[Y0FkCHh("6J*&3@V]kb#j'I`LLC-I%d&U\:BOrq6LU_B4g!:HUQn"@qYY2mlET,U@uBRI7s*DqU3cNUVN@Kt>SQuNK%aEG\r%c<<]5H:31e,_k5?]Sof_SCc@%'*oefbDRB3B*s#@aJ;aa.uRf#rVl[s"S?.WQbN.m[oijn)8,o1@:jd\'0T]@:S\T^R"'BQ`R28B\r%Itn7%n0,T8'UKcWiW_Z,0TYT%1&>uc`LSD4_/\ZI+fF(^%!&QiJ.GX^@1[`D$tAoP;=/UQ\kj-V6+#?[(.YF)eH4,+AmWGuMuaJ7\r%E3Bb((l9Wf5nG9>U%H[AD%M>sE@8\C$4m==8e^3noQ@8u9;0PL(O:@PRO%>_T+B=El"HCKUoPTZib<A"=t^qHd%@sHkhf#$kYKl-\r%(DRJ[qO/2Q)l)2JM_`</nG>EEg:0CL@/=M?1>;fp(5JNrGg44^DK$piiqMueH_V5C7i0RsbHt-7L@PfOSZ,%@gb3d6Y;;R.pj[o=\r%lWCRm(<hYWZ2s>5h_:ma]9qN,8X%QY_)5i(p/Ej13Z_XO`qA]r:C4.IY<<j*&'R,ja]_j8A;X8jPa,qKRtlgS].T]n/P:`1^4RJC\r%PH_d7dFd<07F"JfFX%XKa^R*n)j]tNVY3@,@i-c6[7tRkYo&35H3C_3k!Ku]4!_Bl%)&2c&ei1s`g$\tZ1Wl$<M+u!I-`HT<.Xn^\r%LgpA$c[?+R;s+K&0#u1*d2%s[0QcnEQD@a,Y;88(T]iO)V0c.1%UBe5Uhhn:jJ#0mAZOd8m!^.IPca(T_IoKS;RY:u,G2tI,\7qh\r%^Xu-#<q@t]T#gdL9^mQB$)KFid2P31c/LZ']fiMfkjAn.JPS)ge`SfTS@I\[@,:BQgYGZ/@+fg=5i*BZa[8@@krhJ1DuYV:\A#gC\r%6(lhVNM=2%rkMT2&55)Zi0GL_*c8sEh8GlhZ>YM9J28ljZ)mHF:c/T6;s9O9^Aa")4VqZpYGYt%08ho".T!@p:-/=l\n:+_beK[q\r%S9NY#U4;Pe"1dGLK:n\Ue8?'G0HF02bA8L-#n-K2:f)1#[H"eG]d)r3_<a4Q7e[XDoG=Y\&VU+m%f2$?#/*"m7^q(:+N)^#4lCth\r%NmK@i:nX<,qm);uDEs\(#7C%J(F.Wr4&?K9I)`O=;J"^8)4=Cb\L<B@gSR<H`<7ZSZ.f:nkk=HP6FW0Hi7Uh1XZd#^a>OEZ%+GNu\r%hRLf3+\b-g`)VQ(CpXS'%,`U<g:Xfp+idEBX?aiL8hsWo,\Kq3"[WDWErPlTVL>]I"[WF+;<Sos@lqpL#T<+b\L=3_-9KA_m?OcR\r%bu=2EAsIYi2L.dmP*"Nc%Nnd16Ts,?^0*$!1(`aOZ_[c.8-+TQcG1V--j&#,"0b;sMHnHB+pBCSo.Gj:+pBC3dfk#!U]<gbRm7l-\r%.6u9mKi'?3.c/sHaM^,q];'][KR-n>mjXoVp<mkcl%sis@76p"r41#oU5q]eH'f"TMt28Ym2/rlZ@SN!FTd\rSC!=5ZN^$$^0*R1\r%FOe]bL*WB8k),UiP8ln)G^5NP:E27d=7@#j7$1Z]p@_m_LD#&oia?F_]GlFCo8+8C$'\Q!^sl0DkUqGJ7kj&4S]2,Es/%`:+L(k@\r%km^N**gUPT9(B+ihF\oC.4H;t;_/)-kiSTgV0J(2[5VRL[M07trn`HJgJU.?e[[&:gU7e,hTOc3D+4AjGq#=[Q5Vb4hURpoG(A<Z\r%R2o_>:QO754P?%[nbu-\0qM#,SlI3\m(mFmnH_bW@-,uOiu+3Cbmk9X-%YCF/s)4TnLM@tmK+7T*piQ^Fe5YM/BGGB.R-`,O3=tI\r%bD6iC?--8Z4G$Hnn0Vh)nH_bW>hWXLJl4_hOl^&b*7Ohn8EOS`3A*prb[H+j6()WI<qCL1GZ[7Br"cLb`RE[DOIa4UO6+#l]#!J4\r%$thna(]6`QkfG4@)6qnD.eI+(XgW-=ko&hlAoF-R+RM(P^6UPP.FIEE<G=W[;`gS/g4)MMmaM#6M(<n=Qb1M?okJ_sHVjsmIN1;=\r%$;#OZ]2+DET41$jjmH'Bc)92EC9@ATHd;AL0Z'uE_^(1M*j\5NXC=H3[+q>VH_uVLk%B.Dh5<_P[F#CmU\iPSo-ncG=mnO3)QV+E\r%+B4!$$-$_TQ/=q&l"PcmHb1N?Z.cEDWY)>7(99$R6l?Js6dJAi(cgbYC>llN=IW^"2P+=,K=,o4[;0]N73j,J^1l>Z<8OT7,_IGr\r%rO*p)8-X7>pY(L`,8p8Q<=j_>P%'#c3//K#q&C;(i;)Z8>N+[P[14d9@lo]!@IJeUmXXnSI9Mi;/?dA+(ksCXF<s!\@udCTil?t=\r%`HH"Km!i%Go#[B]-%\CSc_/8M`o>D<_hNKrGFXg?4+j]&A.B&:l%gkoiT4CeME:qGpGTU5;%JoGiXQoDVVi8S9c&l[C*S2l3,CGb\r%A*ChPDR_>KJeksOjoEgTn6/a&q:H/L;Oo3;j\3Y8#mp"]!p._q:?%f<kGQWg*&N'JD?-$R>JLpn,@=kQ$Ihh[h++BK]F4'HWhhEV\r%JWS)),Z3XT35p0`^BmKoS7O`n?;mV/[OI[2n0qnI<L=>?`5/JXNE<S!kWmgG$<T+)'de&D:.B[pfMaPF6ks1.cAkDg,5O$sND<rN\r%V44MTNid9&%US0UCA(s6r5&n!n4g=[13-6g(X)nZ>Rc=!!D"7%)o)@F_ffNh*hE$n]knNE1%B"'KH1@cpW18X=Z?,L!/i['('7lp\r%8(i(MM6=Q^kPV'in',M_)=SEG(fqGF%GTE"XC$9p;+5*q2M/6\&jJm@+4=K.+-99RY/`525&IeT!Cc4CF4sP`0UYf13_6[R4`jf\\r%+G4?OFYg;2)(If*1`;^a4k22K/P\?hI\@fGDr?V%(I^A6>E,#dR9`4EZM3NeRI*0q9$He=,cfb!7Yr!O$B<0qdg\%LXOptM0$YLc\r%DEVaQ$pT_%W>W-hF2d(a[sc2R/4N?tR$"c!)9ubK:X!X<>P?%Wfct+U$=gXDFL!S-B/Dh-I5mu14PU$OJ/'r2P2J_EV]@bGqfM:J\r%UD"nbb]Ii.7g.Sl7oF>QWk6],^83Um3,ti7p66OHPa)e93,dS_8qM=t`jBX=&htWQ*]0CM@%N`OpP[F`K\USCkARtKQlo>MESaHe\r%A`*c3&`P/1M&Cd"dQ4coI1)eBLT@.*PRV:;1G<6s?W(2APf5@#_ZZ$lK-ZQ&91)*&Yb/QQ/^qm@)uaH:i-2,sg;0PX/k]UPMj5Ne\r%9$FZ:j5:UB73_6%9(_005c)DT!0Y0F8ck;u%`u4/&^-8$1?(<\+rTT7hI%5aON_kdf48W4,+32_F#l_TfW][IO`)P;P*P?<G85'@\r%qZ&if#UEL;k>mL&n4JCo\`@N(ghIWo-Fm;E[i/HMLm@mO<r<5<-mBs%ntoQ(L;:5teq=r8/\,%L\(Vrs;H/58-<KNr<kBb8ajmoX\r%9saIklkD?\H`H[4GM@Q,47LhuIIu1of+'L=f'fBkmNZgon\p;BqL/"p%)U(RqL/"p%-YaQHB?Wg3C$/2jW'*JS]e7cbRU./n&92.\r%RfPL$XtdP^Drc"42W9VmhDZ,EAk$D;8Ok[+hmPR%oTag&8VlE5!,(XG*6ND9?A9tPdOfG9ZQbn?"d&r7]K[Mu'6J;%Fq=n--5Xb+\r%=c2gB4iQbq)VDU[-f"HnY$EB*Y2>-G=%MLRS1,#OG3*V?k!K6J!VEs]C+LE'"4Q>h'5LA39.EB1;;RmsrgL-PC%)P+_p=F\1`IO/\r%(-b.fe%@WY'h4ad+bOLU$DYejOMNdOUa/5`q8FI^/PaUZ.VSIFh?FUTpFb=J7t6LTd9$49ihUYJ.JdAL94=GW=s"RGd7L843BY#P\r%6U@T6?'bA7Yfhb$%bddk/cV4g[Du92rh!/hA\)=EdBP(eO@kK=I[+s9rALD48fiH;qfEL1$?/k20@W*$dY'rV*aXJ,L`I#tC%G1&\r%;T<HYfr<u%R]&9$h&^$5a<\'q#_k#IJe'`G-VM^PW.=nDaC8LU!08\$8Pg)R5']bN;c*QJN<D,9SINZ8!gpc=lpqa(OCQim=/`J_\r%X%o#F>QjWaUbb\Q?;.K@#@5[4T=53l<P>V@!X$04j^GP$POL$6TjnWn[@mYC@e!-mQ2"`/T6?4?'tfljmAL"$,tTN;)\m<\5PAQ:\r%,"?!>2ZUSd/UfCs'u0.E'g1p+kVa(I+C6ed$G8s:'7Zj=+ARG!Y*)bb/a%:pq5=9Ih;J49*fI!=n>J#B9(I,bT[Q5W4^S)=L+NM3\r%+GtV%GQ;1$kX!N9YMi8soP`4t/tXs[GS4C`nL."*?'N;F2>lHVC4YsT&fQ@>)L14`;$b2:MfePKT**REG*s$9T5!-mKr"\:1>&aH\r%/o7Xn+P@@WNX+7GW^g#_e3;umfiNWTSGHN5Y6>R2,'eQn*Y\2r>N*ks4Q)Z5\*@5WkO(Z]ME)ZOL'%bCR?1/I'(Co)'/=6/V0d7e\r%Ve;@Rct!ib''IWOf2:9e@VQ<4X6"U]@515g_^3up;4G+K^3gr1e7rks3I^JTP,5Un9E&jqg>BtLP7r$rZd`Lj,FPC*N2u_LAZ=e<\r%Z8ShP&"Al4@esN^=,Mt=4?,r,7C"*$(u9N1*PY_<#PhqRP.8,fplXU^28K8.P>!T1KDh"W0,D-UP7'#tCgA],HhCn46($X=IN%MD\r%Y'[D9Ec&#*82e%Ppe$_3*Q8$'X.Y<=G8/8eMfQbK@mR#'_7ZPIm^ScAmjL(j[p0PKo8^]aJS%P&bW?0t%_pVn@c$@pm$Mu2efF)o\r%11oAlUq)@[o?KQb9C4fpY\giLg%[!Jo1fHPW_QHr@X6<km`qP.*CEUWaS'19Lu3;f+r=T3b"UPK20ORHLDm;49^bJs/3G^<IT%3s\r%Hf#5P;1g8hQW_)8J"].AA[7gb?&u$DYnFJ7C`9.@[IIXn#h2[/M'<$Y&SMn![INTq&J,PhjZ8geEhOQQkuZp2WB7o]q46jL&I8>Q\r%o&Pi!X_3jdO_+sll?&3#2`9,)\86>1DZdQ<m?2s4)q;R#WSZ".dY@1Lnc$*qf_+S"?IZZfWSW0-QK[2.IY7cni_+Fk;)dGkp.J1W\r%^M`iuD`B3"87%qeV!(Nk[2-J"P8(^PlI<[0#16/&on?.>Re2Xaoq:]JB^d;4AOVeSMKUG*'\upCC/Qm5';/#(IB5_?<hc`N`8]9S\r%Xr(JPg@#b&<2K1&HUSC?7b])<%.9,0,_?`U8"J.C"VCk]X-B+[l3V78,W#;BNs;A'1ljprE`YD;[=+Z9?mliA+G/<SX=m%%aiqk#\r%P$TEKCAdhfN^"C.7"lgCSQmXqdC/)0q0oS3J^FZ^TKX$6c"''N(FA)X1W][..")lP-jR\NlVBq\[me7p":7b8SA1LgnB*Bb3V<iL\r%6`m$b-36-UDVK/Hn68r(VKUm$`SJ*.![Q%eAiE;Y<k:P_*-4tf.Xs'\k[nMkd!nM2oX]Di>7Mf-k4Nd&QYKHf$#/FU.WK6"pHZUF\r%kiV0ENj4r^6,(r]RVj/'UL3,doFRP'aE-47-d1!D#jZcHHBY8<XMq;M,bFq/+1PoED@NWOpB@^&NEb//ES,h$9%Sl7NI#pC.(mci\r%.d/-iX(Xg?1l?4\R58!4NNj&Z@^<n9QO"?\=nKOP%sXA@PYD'>6a*1)6Bfh$c`U[o'KZ,9-U2j!;g*rUTmJY[`\p9GU(!,?15Z8O\r%(UFg8/9<fJRdcLi&lhab0$8@"Vu_b[&ubMe1fc#n9K2,-^1H&dU4F%k01fZ*U60)8D*X%g?L1A_@/E4u+S!,jNCo(t3=l:bfNs`\\r%.#<Gg[_*N7fqcsI"u3];TK=rg,9Y!XdbY%]_5sT^#RVY(is:Ga`?sf$(`,V%O]cO[6g)E^oo2BO,O$%c&B+'SK&Pu6Mo@V-b#J%n\r%`SqisC+)/lTR*_6VNB#!VH;881?cE=WP1*CABpl/ZcRJCp"3X;ITh>]e"E;Wr:pF3>sdl'ZF?##c9H%<]O-c+<S/ZM:eM&!\"VL[\r%lr;#ZGVjSA/`68SeOoc;&afo'_9+uej:Wa1'GF\Jo_U^m_ouYBQ&6urlXN+MDl:A!ne"mV4&8-MVk"#nJZ@'o"/rAU1(DNfljV0t\r%od1ZRZEp\%eP['@;:uh/$uO;#q'I'`CE)]X!N!L&-6/dD38<+adY-(O,V$(PA$2$0=X>C2ojMZVqg3tp\iNS%:U?[U[tg<*)!r2i\r%EG9"t6!pR>Ujj_dgON=b!UPn-jkpaH*3i;pQ@ihQk27ue?7\0_7/m`tgI`JK>euK:22jBfT>UI8>#JuD[L72%IBp8N2WFs%r"E42\r%Tjsl`-efSiS'nA-WTIAl89%Z>V&Q@E)rO:Z@2>$@:_MI1/kSg0%N*K_mbJ%?AP\5@#=cVbG4#eAU,A=&A?n'_6u2Xi.<\*pPDM7r\r%U%b9F;n\,u6a-lSp(Wr?+2YIS&L2"!s!22E6cu347Yp?r7$5kTgX]t<d>lK^2@!b0Gq08:>n;_[C5Zcp%no6P<<l5kLh7"m^a@@b\r%i^YV)l_Aa,Pio\Drg;toB*V-fTHG^IBoWL$iT5/\K^gU0fDRQ*$)!-c>@?a,$P'oBBRB)-l]]'4d,Uk)V+9Fi".QcF4,+eup.^`2\r%@(*#^c"Zp*bR-_[csm:K9@)KE]guIoR,IK74a;>:1_WR>Pa)4s4.UhO9F.aSci]_'s7!8p;b@`IU1Xsc*VsI/k`k_VJaD-b)_QjN\r%!i]ZJJVE#*3%e;=70*+i5%&eWpY);H>Le^lfSF.>Kl$,@_LGd_e+G6B=0H3ne52q+m<6p^q"@h[Qf]=WGk2N[N$30O]Pi]_f>=XK\r%&?+/jbG.IaSQ%XUKOb9%]%R$LZbC^c_+_W+<Sld^DAR=DmTOTu[GsQU[I+Wp-a+%fYegl4T6aF%#V:4Xl*^`\)\m/P.+]L5DFLCi\r%l$YM:bXN?HWPMGQ:C5n$<@EkKi/d;8[oZkdZHGNNXTHDnFo[f%;S[D/FYg]gI^ajJQu7[3n)hK@jWVS_j()ZD'#8R.]:sH&d;sju\r%k,2l)G<LnBYN<@"ObZH3qXMTLn(VH3j2]$UB4b1^qJIp$<3;#G^B@6j7s2C^q<%ZBE/oidlmL4bRSGJ/P8OO*I-9NMS>Zcn)gese\r%n'!:`ki<ksn$\o4M@@j"0$6(L`3TcjoC17Xo[WEBO)o5uqmcV]Er5cg3V[sL0$<RN4MJFUS_FDEdgpj'd-Y&O"r.S2G5?P>PA$o2\r%8($4H!=<(^Z'ZK&8IT(tG$o(T<dWiBZ]I/kb8?,ckFM(CL\ldCi\sqFoZNbD;8#,poABA91d;iJs0g3;K0fL'InBPV-mQ--[5?o+\r%b4bg^R89fGHf!$4oo,ct_/s[H80P3](U',3lNdD9k%S/(HdT4;Dhk['SnrVh13`]JK:9XfE2@<T?28>-iMW8`fA#"t[!RRe1KI1'\r%YtA+,lJAHE2,a#[0@["1$!kY2fs!;7pi2Yn'-5G7BnHjnI#=AL%Zh7]BY9m0VrUsmS\S8^+Y(&.WNqe2$ZEEg+TjY-Y2;3;/'Vj7\r%m](bK^^K,,#uccdh*GA>9fnGfPV:GUmUR;kS4RfPkRKd2':#R5KC3[oJal?4Ma;Q6Z9&<qh5Rd[RL-QX#IFO3dO+9l^OsXaJ#Q@n\r%-o/2K]#Aq-+!GX?6-juB/::\%P1V3Wb(5;MQfg=aD;Q-hn)Q*TY7cLq2U!MOguAk9ZVZBD;",TfYi#$_Jg;%V@SIrZnJAtGQ%5=R\r%($'ih!;QEg%0C/H]PR^4K^XQ.d[3cCeUo1T26!K<Z+A<p#',t5+S!dA,ZFS47d3sr;ZSH#`gIN_Mh*t,o+5BOB^SB0/X$4kidF':\r%a.Wtu^B2"?]/`\CE1D.*BsNpt#F\e9a6OCl/<1X!pqg]Imq0qOTB_$':Bg:)bL:o[$`9J,bO7k&/q&L`&7$'uo;/%V:]JHIhe!ib\r%Jb[G&C8U2OBp4Z.6>_KQb<87nM8RqOq/AC+AVpdiM"1Il"mO.Z/Vid2o$Q>%_@.83#GSslUqkrA9Q-msR1U^gn0b).R1Uu^PpNhi\r%1sfD\/+*&E]PA=iU*m6/oZgFs*W>d((aIUBPc\5?fL^/bA>'%<'JIs2j;mUYgWBJ-\j=U=De$:T5Q=sX.I,J%r?$C<_3MU;[XS<B\r%!];A-Os7U6C)77q'`e^9K)bk?GES%S&n[<K^?<-&XEE,tp[$q#O>;*RH(+<jqcmbJ+Cf=PeJSgkpq&MF02,gq+J58YPKaQmUc=(A\r%":GjdKUQ,,<<JH8S1+8A49Z**`&]%=@MeAB@2J6[Af*I]B?HoOmhtZ!P>t(DQGF%hYn#Hr`FOCp5UH'H(..n&1%="SF<57[^GdLW\r%!ph?fN[%>.Qf72FJt4u/F`u?:;)CU.atQ'g9QCh=nh/uVq6bGI[[ih1P2nssI`XhV?688+PYpitK-Ea"%=*/C+DK3H,][r_]XJG'\r%C>I3i./t?>DHEEpH4XDCBD-:WPje;*ZY6\hpM-\7(r"u[kg,"(J1&cq-d"dJ.tbsD4SieAm0imPAer>l`T2gj4t,WD64iXk$tu]$\r%.5UVoeo3B4=r]DGmJ,-t"<k"_Rk/l_1K>Cp+[7tD4t'FYXgpdrn3P01-aFE.59CS%qe/[m3=[&"PfRkd]VI[2Go,V5LD7N&2U$p4\r%Nil"Oq=.Y"SJscSINR%nWEr0-bE_kd,k62I3_W%nIt)LV??h_"'q`fh93k-eqo#nF[\^,d$!b"qj9C<1X>[1#DG9b7;1ZS_br6Q)\r%]@Z4<lM>N5F,2I.m`htSpc6Q2rT7PAg/*9:\-ohSq_+qka4DH8ronR(I(E7eDo@744*<1MVI25kGPDB`A0c&r@C-&GRB=L(FI%];\r%FAl$;T3kqCT2]*R,^rfMa=VUjDun5o`8TMB,&(pT5e,&Bd<02UE9b06N`)ir=o-ooS()IILoC:g-F%r!*tq"$ZmITN/U)qgMFLGF\r%EG5&<AdL^B'neA(+.!,$.lqB9+WPf74ET#769)d%oH:=0RU%c\r[,E5,#nB0E!I;+oZFA18O=h`iSWnpDr`DGK@GOL.=E,%_gQnr\r%V=YXpN;Q<4e%cquB_NsP:Rc,8LsLj@4q5_ErKpA0I2\Kjfn135.t#d_3<CntaRH@q3Jj4tD(IF=CX,H@(j"/@\D[.PNF0Os8I@<n\r%HfAW<h9ORd[<H8@dW'Ms&uui;R7M>'^'<@-R`C)n[EF4SDB(l1<,N).P3n5aOCMN.s&Ta]8t_@^jo9)>/U'rA=4m^H[@<G09F:q^\r%M[6+9N_SjSE)UbUZ5otPd@4)JF&TmE/_DLfL#_3LmiDfrYosR;i=JS&7r3?fe-4@V[c=\^2NPT5<s"br$FDqG9aQ=7S@nFQnH`Pf\r%f9Kj8agb=WIgbWl7E-Et_B7\Pg5J8mKYIM"VeYV7Fh+M2;n7W$?!pt2TX1Y%lPl>^MfgQbXj\d?8bJ'f8't2m(qWu[7`At((`@34\r%#"*SF;gRu.f#tBF?h>IIbZ@Q6jnIJFG!7ON*iF!&>BkH$4KMeYVt4K%l<5Kh<*C%<"'_-Ea+]`Kr<,Y.*X+NLQA_?pde>%*j1m6X\r%J>==-Gc4)^X3I6"nTq*Sr[Y&$(E3jk8K6gWA"<Wo8HPg!J5I3"JDnH_Yjp1$CM]di,?U.2(>O5=[mdVLC[/l*s0o(.Z;U`1k[!Ws\r%l"Ao;[)=:FUg>kaSYdNMe*6MVr%CH][/fBXng"4*E:r%23g"#^?t]F9$3of)%.rmBa\Zs%^jorLMB5j!$k08c#r:o(G<1j)^jpcs\r%;_Y(K\\-XW;DVnGB*3m)Y?sO*L*fuL(ZH@Ep)+_"[5AS8Z7t>U,,OcIVRH\@5"jad,E_GsWaTqh"@lN8?'7JS?]sMEE4[#8V^#@c\r%&'gPi7*?JqVbm&#Y^kY*[>06s3E4h%L*=1VRFa,]N+j,2Vo6<(acqM\r^s(N%.0L18](PJMOAk<<kJ[m/!YM.4q6Q1$iPkP]Bo4,\r%/<p$[\Go=:hHaCJL:nu,>uLTT1dV.+0t!jc4HirPP+DcXV.2UM]m6;sq\g!2Z]3aK"\fO_1q=l9b'?&%R]D>o3lgAh*nY'Qp_!jg\r%^P&V?U^RD(SZ#20q]3G,j876j[]M+grKc!]k8nJ;6.d+u*fe5Pa67Ss/P647S&4"$B%tuSV8[2mg)a%GaE1.YCf09l@^[AC^_VWJ\r%i@(1c88V4mCC0URjAi\M[OB$r>c=@K_BKXA$MX^]9V6Hi$>9HuU=hhKKe7&(5<T1m=qnm'C/YL7Ep_rY@YR3oh`'+T)jURG627j#\r%1R("_0ooj(R@s\P*Km0P6QLkg^9;6_-ooC_!K(h3oIMUg\8C!#gCKfq+P)==\@)$AOa++1?]9L[Je/DK1Z#L(+#]oD3-0X)O4iBV\r%F?ZY$\ZHAL>gKcO:..:EBJV<%cHd#DSjZ@T5_=?4d:]_pp9&3=Gh]K*dmX;mcgN=h&)m5SBdg6_6i[WOh'I@Qo0Gm!$kPN-oWOs2\r%TRV.4Jcg!m$9?%W,7:Qi0/)3B-3H6*?%ea)It:eGaBVV8NmU+J@2Jn.=e&59#kNK?HgS&lqQj2ZM=7:uEt7J$GkLuS;@ceikfN)=\r%`,IK$2!7Y.2X]jX:UmB=q%IN>KS+Ttm1F3bK:k3*TYL*R=:Xg[3fMCZ[?;/o@1)N!+'&oH[=M@A\/uK)htX'J3h7?s<o-;PNaXU%\r%;8ea/i9"uYH5iQW]L?c"<Md1(?dF#_TX]&CH:q7`CVhacV70Fn#sFRA8oL^"eC"04?0Nq@SpGp.=aE_@H#*'B;3]p8<Sdp>0BtUH\r%b$/sngm-_/=5Gk7]JPm)!rC>LWlj'"s$Bq999gR._XgM^'<b"=`+g^tdbF!nZpEo8U@DBrpI9_Sb+kKPYJs@QDj7O0mmkNSNhCGa\r%![j8^&W#\u4m#a>7j+Zrkgc`(N^-8Si&o3I#V'`pSBK>bWleO.o=HHbV0W-k6lkR@>H5hMk^.GPH40<53,.LAU.q5foTlNJ2ScjS\r%]qqaAKpETXV70Eh\$?pp7HlCh+O6'dlC/nknab%nhGUIrL)'cXdT\1W'I^OoQJSM6NSnqkFL&ZQDWfa6`9U^r'PF>AHDU!JoOg\g\r%V>W_+.MG:d&)CB/^KN_C1_P04Oaf\bY3.q?qk^:<^N^%.L#KD&<RNnRH0W!/-f_gsBqDp&X>_N,]?4%oIkto^eR-i4@@fMg&r#S&\r%dcRN]#2Z,FDNUj2A"0C!W]O8$D`['\)pdLV*g4&ZQAETh&"/Ws]d"^O4;?_\7!4<5hK)"!Y4L/NoJuK,2u5XZ&"5!UX$"4gbeOf*\r%i7OtZS[l:"-DVe^STUMbG1eDmWjBuL[s+^RbZ!,)&*aeX8b1C"elig:4E]T$=Hqj'p"4=)>)IOWX>"O^7:*Bs`]WqkH+>=kDa&Lp\r%##Jm4N/?h[H0Qi3P&_37YE5@]/u"\k7MA)#qCYh2@Eo0\m)hLU_NN_k*F67YCA"\O_/q6Emc_;p?,DKUXr>/Dle!u4JmRAFKECb/\r%&g3nnFA<B@BucZV";OQ=^/o[L=A_OGKMeKR\8luEOK&RARjfSh8/.mmUR-PVY7pOf(\5qA411:8fmbtPBFhQ+r'U1X.>+hOI\SJ_\r%KtAsc?'VNS&$;/alDe[^H0Epo='$\9qiRRm`uAc;!tN;^3YHi%]'1cl1Lq)BXfGW#f/nfK!?-A&*3rY'N%b3('R+.m!/OC=i:hg#\r%2sa4:0_=To^j=kUJSB<mrdVKUS&;/CVW<48,meX4G^,bp[ka9hj<t>:#A7_IMB74]-qX5nhhce>QHNi^!5X\d@A(+dH'#*I81rYG\r%*BZknTF%n/fm8`ZcnpVo/!3Rq?sc8i$_#;s1]_n>(ASC,VEW^]#3U(4R//@$p-pbp1_NM4TZ;jOFS5U/OY?jQ.04nG88ae,QThUl\r%ZgS]iV"g+#VNGO,G9.t%SC:4Mcq(l#me3f-ZY2J5.nc_Tg("Kbn*1,XpA'-4Olcs,`#et4ekYp;Fu3)%S_Klh:rLqg'Y=5lT]u5J\r%7/r\`1!3M[3]BPPh"=phakY(5FcA#bpBO^tiMN-]TlgWDk[NjoR\QgAW&ri[7=:6F/M!anqsi?c()I*)V=YpE$HFSAWG&+-p07dp\r%1_O-V!h@Rn&gi_V/&)OQeG-cWZe%1?X^0GZ]BOr?4#u#ma#S+"0al4Sh$ccCK2\4qOH)F:QNmCP4jMGd7'&X7Y&M\^efrT"ID7B`\r%cB3,.'%6T(RA>PKT>Pg7IU,i0aH1FCar]q($D'$p._np3.lk1sc;!q%rF$9!0FasE0DnUi?@?W3+a>.NG0ph[16mK]l^n#"G<2Q&\r%]S.\rQ:J&^*ac;Y90')fjEdP@*rnBR?!5>5WeB<qIte-b/8c6MNO^l@c64ol=4YeZS.`Wk0![kJ=h:2AX*&?r)KP1t%6gtlb,EgE\r%KS<@s@LWW9=.4W058kJoY.f[??,d3<,U$^u-nIjFYNsC:JX9SQK4)8e>*RlTrUO%WD,^-DERW/Rs)>E7[!UnUBWPsWUsRtnAGsZc\r%4QiQ`p\"(!9RDr=puG'\@U/%dgant3UG!>=P!\'0a%Bnk]$?rknf_nr!,R[nMj`J%<66r#nR[FMO6%iV;Ku=am148)3u)Rh\'rQP\r%G'B<p'hVr('5rZf,fIJD,Gf?s'C4ZYfHb;c5`fnUd>asPa]X9Io[&T;f>U4`G9UA>[usPn>iiSajV#3VF,?^>&e57.qHO@2[h0mr\r%I-q)>22^%>/(brkl?HDoW#a9;]uc*koFP@ed#!#r6?HH7X@,L!fI_3LgL(K#RgT-p6>Y\[Xds-b]*W^kDb.F.J1(&FPe04_Il2SJ\r%?$#"EL&:CX>,m<@:@UXO/'JWQF2#.b,+ENT4S;RX2oXLXMJe2mmCMoD68NO@k_s66\+gjCXsf+=YW&B5%9b>HYW&AF##mPLfc*g_\r%K<C+;N>j=D;5ZT^NLS=*jV$#jr^tYUfO:5TV7%oaeZd%MWohH[C/dmu0X6nP;=QJ`ar(Laj+XE,Hc]Z%b)jUr56RYcn?-"6Mr7`_\r%AS<f.gao7\]1Q]CCLak''EM"iI`C,f<t>q!,2`Y:b)TU#L02[5;Kg",2oM`.URlMS=!f0-?JcqGTd4`0'V@t]qN!-'^Ai^cS]_@I\r%m(P&`O/cIG;<DfkeBGJo'`d4aH>=Q>._g)5Wj<s=qh$pJI@Ffo]H=5@A<28-A-@9-4'o`p=@=r)hiUM56*^gB^:?^(-GBt<83-<`\r%WALuuI\A^knILq`U"PT"TS?dT<amoXMX<L%([UV0B>oc]j=("6jif8HpSCoP08W-pOc:2P3MP'o!:`&hd5&I%%(AH:B[iWE/<`9b\r%-CV3#S"Pj8CSVId;:)`ndAIf%=_`'S"n_$_kl!i=?_G$n7PU@6'J7*t2IRt>T'4W2[!@Tm^L1W!6$gG5?@^<<Faa@>H9m(VcS()N\r%V\_T6!OMR1Lg>>CK!1uk0;))o#]TG3"n_$_MKY46^OSM]5f`C,k82LC(YEABYD@M"8hZ;%IFA%FU2JMTTkO)"-u",24[fGjh(7>B\r%c5W^do!<<$W"dLoBVcW)8[kacm*&Ve_l=./YGlDe6X\XC).;=gC*brGjRk7nG-qrn"?=ugY#_hSll'9cm:sVc^n-]>i>E@l"3LAG\r%q$$ET"fa)4*p:qlc2nufnE_YqT3d%hi?5nnYoo1k(XT&rW;U0HdKU!*$P3rKc7bhd07_qHRpSFQ?D+CAoYNC6fbo*Bg^2<*A7t,k\r%HS':bOIbWWY$@:'>05'iU]&,FV4Ba66o)A7[#XtFXjPc=Z[\UD[g!AEiq5Fge`C!jpXX#m*ihAMo%%L@N2\2PV71("#CC6^o$Q$S\r%'g%'BPa;(^Bd3_:RF/?ZH>a8,&>jUmR$1g$CQ&M)o[XR0M+6Qj3-,s.TQI"bo@BFi<fE"Z^NfD%R(oV\Z&phtrUJHPGQF1U^UuEB\r%@tVBQ2/`pbXmE\Xg-5X&H>>?nKC`N!dW9-o*M/LCo%$W4I@_Sl]TN0`en>U"&>*=d)@b[/BLZOa&BF(hVim_G`rlrdiNQhQXl0m8\r%hs-t>p.n)'!78mW)p6bTNn2=k186?4T,!D;0QQb%ib2UUH>a6$ms29PEPH2Ln%cGTs$L@u0pud\+'H&&BT3K[[[Lp3bs)K[D$q"N\r%1Ho$HebP!S:=<s1!E0FU<39somZ+f]eJM"<LVUPEp+$Dqgas+14^h1I]8'MsqWC%umcil8<LaNXk\W8K/7oT+G^"TE0?hSg\&b-*\r%6(d:a0f+O5rAo0Bk(G=/P9)XI(*Mb4T0-!e%s]nYEWtm6W\=$'YO;,BNT'T^qmtRl-rb-R/&r`c8\H(W3,*B7m]J<GDRTA`a_UCX\r%=fY//4F(]>P+@`8URRHMes2]H8n$W*LUpA^=fJ,9Ff6fR(lmkH8kilnpl3M3Y1-EO)W6"B.lCn@"ZTlS8kilnJ7!]&.lETW"uouT\r%8kh^0mWn=W.KE`j5O(j8E!E[451GjtAYnj:2'Ko!\l'2Uq7kA$1Plii>h52:aX5Z+g]TV:oN[iR$e2UKe<QIt1qo1P8:r^k79tot\r%bIUSM=XdCNZ*,Z8h3Hp"pS"b>,W3NA./USR;na/\GPG!9C+:`FPA.es!K],)RG2IMAYiLMjeAoBY#K%r5fL17e5S%-aMN_D;H$^I\r%THkWE8kjaQh$V'*Y12O1JUL05l:Od")V@jZTrunPb!A+t%s=]q5E3nX&3FW3Ou6um!i(8G)mTZG2$iFb;jAU;=gQbk@NH)R-YidR\r%cN+'6X?fp[SXILK8u)5iMXs`!;*][%:tSABo,%Qcc)GPFJ=:9@Da4<2dU4tA2J-HrYp!_tJ[*><URB-q7;bk8of0G7&2PZId`tPX\r%o()1E@8tc_YY-^Z@QEr.B.r@%r?K,+9Ohk76-m7ei6,Z-!VFOY9Ohk7_,uY]RE!fM"8i#?bVZb/)HG,0`(Zr0)4_SY1b0#?I:d(0\r%>:U/)4q=IdYO4p*-t_@=R;$K@+7LrYCKu>T#a=gK(CEEO.*OM9+9k"+Nj/SodF95U1kHTu*,f>6#WZ1f%$3h-5iH;g"#?r"1P$#T\r%&4:\1.hI=[V<(NdTQPF9R+AOjYji5*e:)"`4=Q'mE5'6lQp;(kqL6?aQp?VCo%RMm2BYJ<p+Lgu0`d:ceG5Iba62!%3W;%-6k!?Z\r%,S`9E=1TouZ)bZk'kXEH#Hc,/,rkEnj7&A<4XL""">d56&JY5i_53\/W20CgAU[4:=q6esf6qmX(]HrQngZ$VQXABPH!LCThGs6F\r%s84I@%cr.#LW/rY8B7#5QW=);2:)cGQZN)XL5]gVoA@MfjefBc1t!fJ[f(d6qZrf0`q<6jjKr7IRLY%u:N/i%I2UmL;Fn.WBPL7d\r%&)GDr[qp5GSpc5""$Lt\kN:blGMs4,efGo_JhUEogFo*MK_mr0I.[pRoBN:%iE^9@dLrH\3bkbo2!EW%ERa'&8Z>WdKs,7\jY$Sg\r%<M-MG(,gtn3iH%3jV;B8qcsqQ%g/F6@i90km,NG>W!mV9h.m/-eu"ne"HV?B#KprI[[T5d1nV:AI2Cp4?+Lb_C_!$TE)Lu%+fUG*\r%;8*IQf;m0-\64&KiXL76)ZMtr4.4!^Lr#8sR9^Vb6Iqh(Mn`\;`l'c2ikAE'%A]JnF:HmKF%3b':g(J3\csaIf@s-;!o(DT#M'PR\r%s/(Tn@l76j\C#H1N;f^l:@VU*Z6^[;5@cu_W_0D#ocXSq/sc![@i]h5XLlh82<`.BXHGL#ORb6RHHZ9oRNmLpR^90V?I1HRMg9!Q\r%n_RfpM7;lmWY?'N$1/+Op]QT6B@Du7EJB!X-&LZO`J4/T2Haa%#Mt0&B%jPo!\OC@6(kWTPsW#3pi+8V^m2cV'g\"H'RC8c-1m8!\r%)M/c68Z]s])H(6QP3fLU)SmYO<Jgr>^tC?t]hG8Vn]bPa/CGth$HaYO5_Fh./^70@5._fApkR*I*AsV01_q0/pYjifc'B4/K)OdA\r%Vs)>98g76'Bf\&od8K5Qe<K+G8i&+]1F7Te[F2-FY;9D<UqD[kE3\]<N!1nh!hf:GRok2d4;]N]o[,mpZNTPKgR^f%?fkKs#.I27\r%Y.g+6bY_Yh6E2Y:pFa+%H<R;ki+j%2\dV<nTJ$tQ>D8<,^5S&_%.[esoOYj8iF"#MqY<_0W69^OWP8M33RrK5nRkOd^%PY;%)ZDR\r%'c-r?3DASr\C0VL7%Ko[=_bpBbdK]!iq;WHp"QT4/3(Te\mQnP[APOrU_o"3q0)_FN8Nc:_p3&lU"k&@1<\QV1:_kPF@MqH7\'Id\r%1=\6j_'](nT+$\re(r%"pM^d?,ZA-Vrm3+>Zs<h_c'eBsdONPX>t_4YUK<tZB:i@KAudo/-ZrE1XOu0C[,\J.]Ttdg8JkF-BOT1.\r%@pur-B*pe7o:L0&fMB))B*rDW(@fbkkU-:&Vs[[LC^qg)\E.`LB;;Wc3l^;<5)\i0@D?'Q@;H'/ojO(nXin4@,@.FVZ>Oj9K*58*\r%4WfYJII,P3h3Qnc5G!eU:l/KK)<<5,dkrfC:X@-qBMG@tCP;6<+=BQmK?@Q^.nRjO!(Tf9W7Y2GKaa>Jmb3oA_!Rqc!5\c-nm;uW\r%(GG1oMttr@47d\!8UC3W)W/_%Mnh]S$3!<5MY1C*M0FTZ]c\JEF4Utt?bqJF2LleLJa]lO+B_+'4l//H\9;)X^[YS8=30;1LOP0T\r%n_EhU2Lf)).2pjHB%sq37F;5tQbAlW)M*F5O`s;I[qKS9B\]uBke%4n@KC5qS_&2Jq^-Z",r$W^0_?VF6gmX<a:(1h?4m:_gX)t=\r%N4A',PJg/2a:&^_X<_EAH(dn7LjTT(T6s8Dq034.9$GYg^KP/[2(VZtbcn7r-o*RuN(mWbgrs43]<(Um5m+l"A-VOC]SJOdd6XP_\r%ac6C7k&3lL5m(&XY5r9:D@S<#B5gau`^a(Y+lk)ooAS`3nV&DaQ0lhV'Ui<?s,%`;Kb_S6k8W>MfaTT'2!?O231\</,S)G76gp2P\r%jWYUcGLW@E#-L.NX(W8NjkEa&_r&4>F(4pSe@",F`*N`9J0;,=p:TE%/U'I5:V1I7a`:%eTi7%tISj8K1=+jo/'M,;':uXtEH<g_\r%^^?9ZhW[eO2!ELBK_DlaO@9o4%3UbdfpE0U1QCA4a>^oB0#Q.j`NMF1796OW[\<(t+.R=jdKdQB]7V@2:B$D`MsZ79k7qV%<f[1U\r%m0_nQ>uq@jg*rd#8e5B#kJ74MQibKA[*>'3+9m"8d6btL[LT<(C[ff+Ki1/Xn#h3d_j5Ir#1K;#\Z0h+]8b(D9s<^-nH'^#&Zm5W\r%)V]Q$i]OA7Q23of8?II\^2!"keVj/Qo_ar-8N@;UGlWc<O4-LAn^0c.!'pV#_Cat8!e>fg!QCV=#QPKH7TQI6M?"b)!)QU_4[]:;\r%!s#'B(\M/e*P9^nRaDP=A1m`seZ?u)b>HNgl?\8$2U9.koaJ[[^.'s^_lN%br/,6T4c,f6URDPqWF4qtfQW?j<r4ErUREWcAa$]b\r%3:p>[b>`rJ(?[FbQ79S&-E9)PGFN4O.Ua2id']1*0bfqIBAZHfp/g#h#9JP09fT*q%0rP?geM%m:frJ7A0s;:cEtT@Y$6tgpbG,g\r%5^Y,'!1\aS=ostu*!#.9JAo7!`uG)J<'^1<!7&&#erZ!V!4Z!p_0"Wb#='1)SKE@^4)LgH]$,2KU!*Onp'3I^rlbjh;ZQ;DT%aB^\r%=[C=kUN-;Im*B1r$n-o(`gO8[HPNT5g8g9Pr&VF:k+.[fOF$dN8Jq@r.m?TG2u*\em4r-\RuraZlc5rbBI,Bkn"M3&ZQ[8s9aNeI\r%ApdWABLC[9S8-no6+B6O@:f:fP#N=,8_j?A[Mbpf_PR.%P`nDb`In&[P`q58S8R0_Upc[[&qqk1s%;a0k97BCIChf2=G`)6,+/T1\r%hs4S2//ro;AM]=qlnM`#'joU(32:3CCFk"[;-.57C#s;DZ6ui,1892fD_rebYKo0Cn8`Mmn/IYKRpk4DPE3K?YOZTQQHTg2kD$V1\r%m/BYXo'nRCX+,:5.\H-.mMiE=lqSi;'NYf!,H@r&_UZ!l5S^ROk?Ka._3mX@5S50[XC\ie"$+QB"1"mg[HH.C`_n5F_ac>L6dl4N\r%?oD]GiN7cST^6]\c>B#GF1/o$&.t>>AX[-\7M0:[)ZS1E1E.X9is2D^aosb;XW4<<:5EcsZqWfl;GL!;n<V@33f=c1#,[Ubp0lG(\r%^87H1e(?sA>m#-"FF4glr(XtG-WKo5E5t>):F/2_$=tsi4!">1B?D^l7SYmbbMJ>$2`.+MpYnC3/PNidQ5FkgNUBI+1n+7H]61d)\r%:=D/.\;?cbc+'O+S^)[GdnOMe=A:d&dS9W/ph]lZ>juR</fPRbX%##O3!-t=*Shu,=BeS&QQ`?Y+foNCrY4).IL7]O>lN?pT0;fS\r%0Agb%V'M<1O``W-rfJU(Gd4!>YToEnR&W0D+LItA^4FR'Cg)Er01cMqp7YQ0[(kLP"h,mt4l/$jqj/fF(0lAfK`Z3]2n!\NlA/K]\r%6bd3sLfSIi9EVV$k.?uY*<[+RIE;9QJB(3BWp'c\qdpA:B\(oO+K2lgGK2Xb%EsA^_'>Hp!-?MKl\!.$"Qfb*.@c$1l&)K8<*Pa:\r%Fn)S.<3m%m"q\7\UA)L+Bm^QKr&fB:L:8[W_=6gQ-Q%]sHj.EIPIKINl1I$G'cW\K3)e5'0AI:CVs@o0ehs3^]mhOp6[),hgjn79\r%#^=5@fB>-:IkU)!F7mhSE2NS=5f7O)b";5:A"g^%1a:\rLZI/8](q(ZmL`5<j_Q/j?@So69+)Z79jhd8ZYl'L2$`8)9+TiDkj#L6\r%RmT1(oE]-liHFU^n8npn^iaq+Do8a(pHPc$[-\O4;%IPG`%VC=X42d(VdGd!%e;fuO`O`Vo$.,DqOeN+63MSgE[qf+icaXVGF;>6\r%>&0:k3n%70TBJhZ^&t6Sh_]8fbcdMG*q/n$nSVC-jK"hB.D-]<+tmNKCqVHG@BfkRTfpF0Mo@Xjct8q.iI.=DKYF8a)C1!'j&:(_\r%^.AS4*0&1^Xb:YEpjA><b&?@)eIo`MD#cL\X@%MZ8%bCf'7E]t()_]--f?rRjt:N-8=VlnIVSdJp:5bD$i7HcTlkQln6<p$F($i:\r%8qBYg'.H]-f)X+`6J>]HX@DNmpb<uV?se8U/>5(]9<u^Miu\KYCNTmRIKu%9NqDQF;L8qJmY_G5K^Tha=@jA(4!jN3PIqVGZU8q7\r%[38Ng)73Lar?`h.$@6W4ou0CLEY<kJ&8G*VmkKS5on.i5hKWjP]gGC%]O#bpp[QV8G@7VX,##N6jRS(IBN:>TaE5+qoW>-JFc<P+\r%Q+g6udInF:5;'*@pC?.rgl:Z^8ot=UR7MMR2ouQ/JD7qN74UHq&fh09Qa/t.d@mGKTp-QqM%7p[hjs+q8p#lN\3&@eQ08dl$#K5"\r%X@.i:lscGsB-fUWD_\,7G#k>)ZmNtAG"7/lRlib_d33hN0[@$%/"D<ik\rOJf07OKBHRrKfia.A"$ZF+)O+OAV()26\T349=:</+\r%ccum#U#3^Hcd#.)(uSZA%]P+AE_E8;fccXE&3Z;-K\Dh^LTnYj&8LC@GL8X.o&I/4.@7=KFghCsQV]b*Ic#g-DP#7plUV9SHkmJ<\r%NcNT2J`op27(A=!/r:(9keHkF[k9q"PY!'T'mJ056`2/4*=jO^fujj=6KBFm'H=l3`[!XA&fo,p)h3)^NMQ[kZsPq\`_sWhaXde9\r%G&<EX&M@UL<2)b4[AK*-\k;:sd_`7blZT8nUJ1!^E2NDleucA86=.-NC#,F+;"M88d^gO?&[,p)GR%Qslh3!6>>ELVDQ6l#oD=[$\r%Xl=aV;cR])6!V>q-q[%&iup+_K@Au]N/')5k^)32I\0]BU!0];^)*ED2qsG,FN^QT'0$BoH9G0#KLL+PC:,*h/\Ql.&KkGXh6j\+\r%]`g3de*DEX1#11Boa];,9mSs2gcmD^e^1C*Vq,(*bp@\?gLDC);8\clTf3:^_(iOJruqpUprTItRYQT"DA?m:69TTh[ZKc38#cc0\r%E%^I1d2C]^[EH/f&&sOBRUelbQu#N8(Hh4.Sf#qS>UPS^.Gj;XY?&[Y-GK3tTEf[i:dC--A=H#F-@o2trfT):<<^OGmdn5O4'`r9\r%5(;-b^X/1;`=j.Dc.ZD\;I.W#FI5Nu%l1FgR5%D\hl]?)F\C"[&.jB5k5!lb%DNnAn6D8G;S+I:Ho@Z0Na[%Lh?6bX?MZL#I0J'F\r%8"'6.IQWN!GDJH<1&=GINM>[TiVg$6[n:s%I)_&9AuHC?[E(9[lF*(ED<gI0oQSJST\arq-7/ElHpY@>IfNfnQ#os"?Xp;9H8YNJ\r%2/Cp%IO[&,4=p2noC\[(juj436uV\^ASq';5Cl]&ZOtGIOrib<)UiL:+cC786%*[m:ne/(_S/-&a\'kqi5OnjG8+2N9eXFYJFf37\r%5sid<Pf,Nl_MX]e0[GBU,%^lrlT>G'@Kq&-1X1QV,%fcBYg%g),%_V&f$*\-XG@`5QA9J-ODY<[a.a`)p$JGG:)Ml-):-503b+-?\r%+KUA:]Q_1K&&N'@Kk;*=Gn:EEWQs8TD<qsKRKm7Y=i6fS2@mY3-jH(%6!+^TTX8@$#@RcH"3g?ZXG@`_3Qs/f_J8ZTpA*D(6!+^T\r%C6BXM4:!HHB!Dla/.]UTR$$Pd!a1s>@`D"FbJ%h,Fn-dc@Ks$X9_0C.L`(;qd1@`ZM&E?W-'C@r3ar<a`nBK?r6Jnq1WtET!\q]d\r%G;"4QV7T,OZi4uI?QWW\$DFZnY"#^I7ZjcHeI+G@;r83PEtklm;l*l7&n`P7#2V"DD5ppp)9@N\o.t#KIcaaX9mU>_d%*k_VJ9^U\r%WgQa_>lX$D'!O0r_T;Z!iFdPhHjVONP=J)9U[A!jk_k2F(?X_Q+lgDO=`"51%d]Li)Gsk!L/\[:EI>VgaOA$Er>AfODl4q5]7;\f\r%/:<GdZe**>MRS3=lbHZ&npDsJc?nA<8PJ3\:)ipIcV:'3@?hB?n2m3\,6F9YpG&8oY\WW14?$<:j4#D?j14\NMKaCFN9A4+)KbZN\r%NT\=,)OU=@]JWb&YOUC-/HP>KGs(gJqVl]>n8dto4TLE$I)"[Onb"^#_[toU,dCL.muEkLLNm^P0@t7T9hHW!a?no_/&j!jmeXEH\r%ZU-FQO09eZh\n'L5@Qe7DJbmZlg;`]fZ9]R,@m'i^=V2H(u>Qk;J:R4O3^ug*VD=t6o*ob!WPK6`+:2m$B#el[^/gI-HGorqAZ=q\r%FCq_&kU[o'F*kmX`7s5]YWUP/Xdm?.!Y)0(7+Omu:29GLfhOmiTX=H^Cq$q:[R^U8&bqT,B@/HP0\L>H@YXK=<f,$_K:'VqO-@Z/\r%Zc#O<g92'UGm6"]Y$EJ3o.2VKFOQL!Z]u00iJfXLJ`gU@aNV!/9\&f]YgBVsL%?iM$ZM[h1^[%M.HG;rbsKtFhEjTFe*(!k?!:nI\r%JBa7/Lu(Hc!,NeB#W"?16I_icL&dJB]PF/GGT(g5I$O><M$Mlg1k.a[^kSaA,p&.PBOD'(BB3b:Q*ji:dp-fYcYa7f9%AjC")Fcg\r%\8RJ*:'lBp:qfLpd4DiVI#73UQ,@Lq1Id8a"O3&11iQd?:%piISbU*#l7&/%kJ]So&da.X0VNogKa)OmnLq",`WQP]=-C(;#ioT3\r%*JMt'nT@A)Y+QFf&1n#`Hg:LIj9VBd1kp4k2n+L%(d[3HlFp1K$)`^M=eu-eC]ogqi5UO>SF,n'b>_X^h`TIAfU5K^Fua5%=IV1F\r%Z1r:jAYX^eG'UCt'"%Z/a)g&uK]uVrO'+:M72Yb/iI.)ijrr<h6_Ltn)$-tO9mOpDbJgJkS*[R5UKbobo8r;s$#m^o\D.;!=j+SH\r%2Y::r,62,Te!83pO`NB579i:^&Eq@-$KE]>J3[b%<_KV.!)#AZjrbNM:!u1!B-s[P4[f@LO9;W*m-oql?qg)`oht#O"7Ss'&aj:G\r%OWc_pc4-eO";Vm5?<<S+4Bl@?DKNpe_R2f:YP\o,/*=`I=Nl=o"nquA%q17SS8+W"rl'X8CX_d]aAcReA8SUVJ0WU"+DVXbrEHf>\r%^'%T.@]Y-aoHD<0"TRSOT6ZO+D*opUOEK`HarQ*]=@[iLOZV]I2^_"/K<k'e4nnHWFN;13l(4;$>eg#4I$Wu\Urr(G`k\`+rYHH`\r%1dE:NK/IEH3`KOJ:46mD9ld@]Hdpg\VhKH#pJkKG(EO*g4VREb=&T\^8!o;,8)P=;1kFg\M;]u!K)TS2%,`?V<C99)H)JA%-3-Z6\r%1fh^.^UQMfCV=rJ%Td"jM[t4"A7iO3IOltENgRoI/:ne;?IIi3dHH)gV[Q]^3V<5]Wq[t'Vo5u=#.k'FSMFN!1AL,J3FsUe1?b0B\r%4rJHJBEG2>``)3rA,_%H!/Ft+*%c*JQX2@H&bf8I@JYX`W1WB4J]YsD^S[V0]>*q)W03U^jHD7ekV8%a!3>b+=CH4QiQnCbB6]?f\r%31QNII?s[TLH;%-kH`H)Xn*\ckJ9b]/SUVE3R;Rj*o,Q)aD9m"lD3K?c3"s0h02+>B?oU$`Z>']GT`pZP`rN!3$#(tRlr.ZohO]J\r%=,%5$<EB4H"h-jiiJcOQ*)`:OU`%H(1!TOKb@C7(_.`Rc`,"gWS>ie2=c^G9l@,[Y$)?3_A!.8dFX=riHHL$g/E([Oqb4&f$]GLT\r%/frO,6GclrVanL"kj30\?iK.ore3DMN5-fnY)Cm;1BO0WXj=kT:M,0?I3i=/$robBN+HoWhGNpk.]/:]\:NI?KGd'o._%M*S20GW\r%;cRA5_C=NM2\l,djlTOn]r;%XW]?>eDeago*+;=0/dlob0I-)/aN24sKGf?P$p,QE7@4[cbOE,ACJK<W9"a"lO-6j8l")dF2S&^o\r%,F)+rCARiMOJQR_l@;29^T;A)3J=Z?e'2(XpJ,<mj\5q@b*,:5BDnuT09&UO`):(%/<($V:AJ[G4fUddBC5.JF8#@0b.DUR(qICO\r%__3puX!OGUoBbp3pr.#3.VoMOSGbUO'1/4"E(_KV2Z=adDs<l&N\4&LMnc0FAsh$2r5<<2A'gs&hj"[X+#]Jj-<M@!R8#M*J7HiT\r%=[@.XX/m*Ibh;65ehK[u%i_F-/rP7i2hKoNj-ZX_X@5WK(A;&V8#O\*#bf]P5;-iA;6/+>m..$M25=ms!)>EGW>S]WqI$b#AM\'*\r%305?AX8V7*j^lbohWki8+^eQg\BdR#_tA/[$?_-6*QJMK.B4?b$`&beYOBhd3Z>HGqN]R9BI_9$8SD9BlQ%EceVtfObqHQd\36Qt\r%o4]7SZ#TfD.Y^k@P.CIs1-96,UO9IfgO2[$aP]g*OX]Z+aL"W3562XJ="^YdIt.t*a=K*CSH7DQ:=^;3T$u6;^3J("s,M^D_G'4U\r%I;ZaS#@T>6RF9A/84fEFS13iaJs=7pcT'!+ZN+8I-CN;jR"c]Rruf6-jb;Uh#^N;SbURH:G8m#g7nf[fo<]O$<N-.FR-'&%e#5u1\r%KE\(#KZct]K-hn]e,h*nK-hQeUJX\<b--n"^/.Iq:,e8-^/.JFcBVW$(*U'gCpeh!_Rhu+ZoSjV9.?h<\#L#"o#E_'e/L&1A?T@+\r%SZ+&Nlk5_C1EqXL\S+n$J?SU'%3s/SfYA/PH@jK#(/mS&fqXIS9sEmcX`CUb\8$`A;gQI,+@_InJ@]6AFPc#`7'e4o_?Y&b65%37\r%.IY/NSZF^IFFe?76[G*LXXWjNX!D*ZOF>7`Y/OpehM>M,a/cI=5)?D^6K**aJ=)\qVrBH\?2qa>"L%at+7L2ZXRO3sgL:;bb'U1#\r%rcV)6W6/0AMU1UjH"<lOdT+s@-(J'Qi0;G@#'F2E%tNO4W9Bp6fA;d`#]J4rmeYmaT[u.)bu,(g'LB%h#(7P&OW8?'"]3eSWC1d4\r%6Id5_fWs[]]@;^&4mXA;nU$N)%oP\%?T%PMQo&S6q&i3_BEGJaI'f-[\NJm2GWLtWgrogT\]7qRIU5d%p?iL48OEhZ6OMr0BisI-\r%d'&=ke2Z],;4(Tg4*Zi1&BQBMKp>>lTh#[E0op>&"<oi`gX^M;1st"]:Sj%ENhK!=\LodHTD<@Y<fmlEdBi.3n:JT1U##Do]j+=a\r%^htfmUQWg:9."S?b<\V99#9:l-9cW&QO@a8JiV.t3QUMj.@B]XQbuEdZXAe(L7[9XRUFFI>V<hV\:N)$hmX6BdECX1LMDA:Br,3t\r%9J2[DYa*B\c\o,;cEgacgpJ8l.io1EZu)&H4.reKSZPkim_`em=%8,a]"j5BMH9`<n!ZL[jQqWGIcSm[ZQ;-?_n.S$n(I\]A+Mk8\r%;$N-)HeW;f5ei"5I/nUi`k>;rl8*lm))%R4k1225Wo]H0cLZZ-V4"?nXS<:=l@sGiRDEIpg%)B$oCFp4`]_l2&9rZnCe<^an`'@Q\r%kS\C0r"qLnh07l2G^b[NGhNA1RRJTaZf`^O.B]</CgNL)UmBC&;qYX9#Gl]7]li>9@]Kr>E1Vp4`YUMH\&F1Nf8g\K+RA&[@I@4V\r%IQK4ns7t^tqRZeijZ=Pb^]mRN'`O_&p1VdorNkAbCljj\U!8b_e\Se8B5+#%d./lURKWU3k9F.N&+fZKrBK8n9hlOTD=1j4O2:eD\r%m`&neAsMiab]dp[5G5H]p&EA@)k:m2;brDXCuFT^pA\gXg`<W(C&W/Fs3Lie2"eBc0plU*OibltWV]1dFOU&8khur?0j=Sf^&,ji\r%o?J2u"?:`-%m?G6S_dBG+7F/<hLVTrs*4"l,k:o]]78lM,!,`74e,BVen4qXnSlDZcJWtA%qmMm9(-`]0;tT*(4]BeQn=gG&]5LM\r%8TY\V5QtdWT=CLjbs"+ss&iS>F#X7Nc)sAAW8L@"EuAFP"_W@8E>;qJ"_YW5l9iOg$-lXoI-@V$des'VPESUk[2mS4L5`D.$>0?q\r%4+nFVn_&5g^d$V=PBLoB$U,FO;Tct2;X!g%A!Oc_GMjqAfBgu<d.3QX;VRWSqS(6gU!7fe^77T1i3Y)eO+V"c+gM8mBX8JnZhfJY\r%a$XXJnV@rDT,k0KX>Yb*:?ECaSQ92[UO":4hG-$)jc&J5'J0<qFhFW:gSgY9mhY_(d2.&.IOf($OaC(E3)+?JgaqW7]t#m:NPZk7\r%PlOH6`Y/\MJc.PKs,rn%?6./2JkRmPFKe9il*JOQa%g"8,jp\%f:#kiPoKFdQ.0O8[4;*g?<'`ih3pGf`p`IA9PKgaZ#eR05U5Ed\r%W`iH-K@;^@2_#]=E0WPHEkTKRjXW^&[\5LcC9scpYJ)=k7qcGp/r?9[qP]o@@aTr_m&a$icuKPq49A'bR!O%k:R8cR9OQ,u)<d<B\r%i5'-ZXuii[`qN4$L;<4emh=:jI_=?^A4?7*2_R"+?fStC[ZNYQA9,ANf[rs-P^2V/CTa*I&aEU5Sr73,3\31Ns,JZ>e,T:;]I?cS\r%;c_oX#?Urfn7hEIbb/0X\C8%gZ^%ZKT,\?je+&oimjGL+^Xf:FdITdCVt"mCm\Z%#kuP-2<4g!sB98Zq5mR9Cb0#e-iHf)P?eWHa\r%(bL<Vk2g;&ZQ&]U69k:1Gk:G<1'"-9U+4HYCt3,^H!ui!\1X\_!JjVG@jY6r:=b(?8?)k5m83SkY<Nl@',N$U8MhNi*'>:u:dkII\r%CZ1$4qSOGUf0o0oh0J[uI>"8HF9lXW;5SAQF5<%PhG0tjJ9Se>l/PVkQcE0ETl_8T?ZJ;,\I[b30V)Q^;@1kq5/RH[`Ndebo?suT\r%@AA]f_g4ss#b)^P>D9:Y7BjUGO0>F,*5T)IZ_.b9;bq.Jcd=gqMrb?JDBW[)_*?>06F5u/)\&&*d8_Kg+$DV&>4fTVOj(<7-n`V7\r%:QFS._$VBYH?)]9D*IXRB\jUen\Ccg*6gPI]*_4!R7gHP%&nG_29314g5aK3TD-/b&pLlp6I/brpZ/i'5OE3b$k>E\kJ;bWOVJ3_\r%9H#Ej2.#XB>E]Dl76K2%)oMN7I!)gcYki\'fWIsC6au>`I(\Qf>6e0%2>Cn&H[eW+A^K_2<*TeiW&0jdXc@(;4P3Z<4/23]$KGY*\r%-)Xhq$g5-@(+Wdn8Xi.am8U;@9Zm/UP@tF&P$H%!_tqh,#a5aCO-:mrP6U[E0i"/[9KKu:3!8L.*'`Xd?S;e6j</&sfN-8b$hYC-\r%i$)>l%b>1dWP17bB+KF;Fq!25a7=&'\+A_*iE1L!3#MJ92DH3cN#\sB?jluI.%2dfZN0/]7%9%-0t#4:C!LB?RT$oZc6jG5qm$4=\r%d!'I7_j8O$2DEA+o?J&)@1]<b?2+N>0F1U$8??6e0GfM"f4f4TF1FRD_pF9a-K(Inq4UsNP&rCZp#jLV$_*IN=e?UQi4YG@g4%9G\r%/=2$X+52lUgB[m=h:.\cbrGT.W<'r(liZ@.q-3q'pdIb=BXj;UH0@h1)ki8JaBg#$!W/[s4?c8KYNiE%';;O=GPE/O%>`?*SBb?q\r%35Z#=;dQ(l&_d#ZoHpKbfI&MB9-$JP%#HdcA..t"$#)):?&lf"rHo/8_6j9@!B)C6pR"=OmB8?MZf:;Zr"C[Zo[n>%s1rMK9=V![\r%,Om*ncFU1&)E"dK*8;cQ1fZV8)o5EXWgo\&/?.IP@H1,o6:'BX]O]*>Vklc&H$qY3],@4eqJ@sWbU+23B4Km?E(RbJB4Knjb_l66\r%S;i5DBX[Ol3*Y;>6YG=V_Ec5pC%N246hY>"VZY`&8r]sL8e`,;A/^&*CBhm;!RAUNg2Q`A=qm1cd)gE/(4<8nf<d\YG1R#oekuND\r%LqM5P_M$Z=g@)3#%a.FsaU^hNWpTMfT*BI$7@HoF.O"2"8fX%/TK"u2';B-U4\Wu8>1uBfht8.ijO'lSC^<mH.Vl2icX?dZ#@TY\\r%X+d&.Ls*hk#'R$sC@kP@Q6=s0V7\q1O*fmRmr;ODSSjbS6:8,](XR,m3=s*KgS49l)k-Vjm'A_@ZJkam#5`5^]526>X'qX&9>Ag8\r%]ZZ$i4pLn#cF[mrk-3;u>@b7O#GhYOfPEqTBRMaiO\+mFra.Q#MhcW(]5.M.bs%Wg/fRQ%>L.WJB0-[mf&eRI4ffCUL!^s-P+\jJ\r%$-p#-fu"/9g+Ls64fmP-8QrY$3F&JK&uZJF]p+&d*gZ)nL0ZA1p9=0P,Q@(=ah+;XI0dg0F5F5E>5!nW)EaA4U2)mm34M,;\e.d0\r%kdPdgF[PVOd1&ds8%/!p]_>X&f2?0ZC5\)=F0p[X+T^at0pE;!Xu)cI"R<^t^JY+i?21;W?<.[5.j^;70=i9$+;nZY.D`Vf8g&-&\r%boZn([[FK)3uj^*Rk<8WO>,<QPEHgO>b:ObjnnnAJLLBU9+k]=jp4'oKp-BGL#Q<7kkk#iO0#EOdIK>1Yq;7>A1/`(SJ"4"Van?Q\r%.(e:'8<GNS!J_\pqseQ-WeN^aWY:DeO$(0mUR1==<.Fl=5rD#sco7U'+ch*?2@6(@SCkorJTA7W87g/=(&^T$DmtOP;H"HXckt7J\r%!HlomB7YMXkk='&@O'Me&[1A%8H^?"d1C\./k&CC6j>e-r'!G&)bDImh!P5EksN):a:A+>E2/!-,;//"Q?$FE;E5]Ukkq-1rl/OP\r%J]ge#0QM=e.C=<-X(&RYCC6%cQ_G&Gph@p4VRrQ*;^s.?[JE^a&2C&&@f4)"QW#N.T\[.Vf-7._fsf\G63-6O@G>KRo,mA%T#UmP\r%TV#IC>!K%aV^I!g(&&S(Uc:li](*&r%9l!uSBmI=(ks.a`jYH_ddi6dI=Ed)n0s.R(1/TL0RU1UOKbg6_[m&397![e.is`1c4C5_\r%0HMuc81gIf^87;-)cFjlJ0U]!QSWGK/YB9<_eK(Y\,,"=l@4/]II"#4[!]1DXkq/B*:SB6-N.iW^SA8a(Yq+#*lLP1m<bng$@^Zs\r%s+mG`:F;mL@fO>eZ46%>H0H"S,']E>/XjS[cn77b.s[X3Y^Bo^[Hf'k0^nh+=>)hh+Q"Q)/Y<=;02/#%<umNZaj-c;0L.@@]!Qk%\r%eYb*L]!Qk%FeLL;]!Qhh3%ECT9?X5jpBaQd/hN^Z]Bn.HCXphhGJ=c=]056&@j+:.1^n%/!)tnA%0Q+R,&.tAq?>rFhegg\C!R^/\r%a*_Y>d/!oR#Mtf%JVtX(%M)(iLn"an\7*1Y2%=`2h,lMu>19"p2cd%pEj@EpL&ku?/6W@?[6.P`amm-giIe$DHFI0$3\^lc\)QVa\r%f7g?O*&s#=s)t7;gQhJN=5#mM.h1:*j$?g]4mqb9GBBZ-5p=bm-KS.VTdriN-i4cp(!F\[e[L_h#Z8q)]l5aj/[h`UZ>b7ZaCY7T\r%-<3F>PN@nL7OLAmUiLEGQBf&FI>3)n:!QQ/8$qi8Nq3'oi"[hMFJ5i[B28-4+7C!@LVZc!3@0p<pF.o2//;l"H8N$2Pas#C8rok(\r%;duOnZdPVbUr6;rAu/!rG-,nE[.*Fi!h;qI(k$_E%^+>3CKOb?cMe6DVuf>n^P3\Jq2ntCEl'*Q8q0=L+*9e-T@E`<k(?>2rMk$X\r%#JI.#3P5A&jm/YR>n>!_mjQ0Y"cF:Q:o19`e5-m65kn4GnrYaP7/7eVBkY_q2M*.:VYp:OQR.$fOO<+g=*]4$K3NC@^G(Gbk<">c\r%njN[JcOQteM>&_'0"I3m;i/8sVr,e1L,P!jS'T%NE9"ZT4WH[f?dn=TbgU)8Itk0"f).:V@$hLfYO:Q9+9WMS1q6CYU%^`-80ih]\r%8\,/"l=1uU4'P,*mZhklc+,rh!cb4_)3CN5pRNAI(d%!qB6koPUOuH)R!^=]Vu@,V&&L0PT1aFNHihLO.caO@SnG[H+i""+2@Uqk\r%qJW^S]5_/*IbichE9O@3%[pUma(oq!,HT,pf+^eCp\b_CHH90)JaW*h@J!.)%q*C@Sh()Mo;uX"8?A&j8s@-OK-2`-3QT2a`b&Uf\r%-K-$;(hDYuG<m3Z6QeHXho/cD2L/]OaTT[S,EJ?']_C)k_,t+JKTR/H$<Wj4$dXV>7`YaC`N3.VMN^>-hd;!F5#q+/BA4qE2793+\r%N)d&HIr*<M5gK_j?3.H6+9f)dWK1rPGfUKe1#lePLP0NJJ?`)sNKE@!%\,!,K7mMAB+)D$mWW6Qg#tP#6DO108Dj7pUEm1s8A+r(\r%p7/cQ;FRUU[sL(YdhI!ThR9,QGo@>RjoZu`=dpU@*`5(l?<r;47MKbMH9ODjU%QC&buE$VFLs(tNftJ;-RI$ud;!flXLGRgQa'DS\r%aguJ=I2NuHRD.oi]B62!TB3+,pHJK+qCGti\bCBKoso>=Q?XEg4CkM)Q-\7SrC/gI4hcD?cE;*2;uB,ISfjoZ?JE@Q*sOYoU'\7@\r%X%b+")j<G<a<H8ifD.mGEqfEh!8HVp[bs(o]/RXAiTD83b?sAg4H'XelH]o`bLui\<9<.U&7-crPLlN!kt^?S&IZVHeD5OF[`I.M\r%!'E#@h4'\p:!SDsXaA6-TkAA2LM(*qH!J\!YDbq^j&;jWb$fFJ:Mk$=;@[+i<@]F$6O-\,RX,+D-:R7(0Z0FGZ.Q?[%b.r(>*_mq\r%W7bLa5\8kI;/r!s<+buo<[8>rbd"%5(m7R+*G[&"AVR`R<o5aLR>S(oWNjGq)eMu#],GJ#Q%gJuWu>b5WIgnJY:W`m&fRUMP!/G>\r%mg4C916psJg!;edSJ":e(C"E3E(JOemDXGf=H.o(675hgA?bXR-DJpEAAGnkUL;mFIeTe4hSjm7r7-n*.>Q\I%<Et5-pmhuT6R$M\r%!RdgEMV:faKh3`uDXD,hbP6[EQN649ADM_#"97:C0KSA='IBQ5_XdTJl)"=K(DAGDNQ@.p;RVtfqR'Kk]lPM&1:4okBAZ[!*V#oE\r%>1Y<^rqL=LncC_]XD=oROil5qAG(>m:Sf5<VDX;T+EH!I2[eh.>M!!7>pDW.r[ZPm.1n6oRdaY8K0nVE@1']EhWI5;FIYZJ)L-MS\r%It1!H[dG7Go[X4Og#t<@SM9Gff5iPfKkC3fL`o#"k;Q7'pZ6H`R-_`k.Ku=3=g:eR0[Lb#o[^H3?@X7^ij(WO+kd>e)^Pbk.#>?6\r%dQ[LH`uY.fo1P1FnOZr@%YOt75<^J\#K4VlRn]]<D4h?0/m(QrfEU'fZkIYG2JDe.m8C`HIB8*E[W'Ki\FV,M1WepX4Q"Ja/.XgN\r%SZStgh,.],XL"2BaU04]_E(n(SLHqVS$:1=<i;b>Yn>R?b3IIl!%,QDgJ\U6Kpf0j(/<c$$Wb,*>JpWT$[Q5el*s'6Ga?XB(L`l:\r%X:?6*b_1,I"%[s=YYLD48Yso3M6kCF[BRqW<_&=MjZWLVJ7&:BcIG.X_p2ie!DK`AKQX_T'@=WN'@tiS(^*qJlYL-T!KNkXc;ms^\r%i"ugeC`e0-94=BnX:AYnG/?:E=WM\=BYq?A+;6_EQIS:!0Jd..XfN#+,^.$c>?N!9aNT<[[^%r>9kGZPZ^'',)DEsUSZStgDO=lY\r%XL"2BknC!X$gZ$B\ujEHFYGASf)o8sCDn9"2a:)6iD2[j>OCkupp9j*,^R'C%$0gpKAlab>;3^>q%=+^?Dd?E4Qq2tf&<l7iPBEX\r%Z4>2eKi^CLs.M@d)8?P2qH8f+LA:-cn+E7'p<$J#$a'03,CWU&UO13P?34hE_K*8YEVtR)Pe:W=8E#]U=4KX,kE5qa+4J;iYWtTW\r%GR1K,:5C<e4cV-1Y/Q-_Qs8VpXPSPBKKs8O.NHX$ZI@03h=90;gQN'`fje[sbs&o>cij!3YG9AFQL*T''Uh90c]_?3bfr5HTaRu4\r%^8[;QGol>GGRR:h!6P?2r#1,K&,)5%J_k6kFto'C"F?nL#fO:$@hg;45(q$QYR</^fS]J:D`\mIU!7FFVF^gVA9h3(]L\=ddV8k(\r%_*#CQ(2r+*VU?,@MJbaI4$N?le+Kmg)e[r?g:Y;3B1-9aLE*W+epGg>/@q=):h*;Kf8CB`Y@9Mgc",oNjIl.H;\<2/_-J5TEa0?R\r%[7AW'LrMAY>eL(3b+`l(\dl,oP-g?W9;C+eds$=ps"9s+lNs8\ancqRpKdE!=*?;+"=c8@r[[j"0CrNVOiHGoO8ekJP8$nHG-*^@\r%kI&V2qJG?hocoHH88#t\kcTi5-,/E4qWl(7r52[=&"RukBWUJ!bEHjSPo_@A;E=NG"K]lr#UL5VO=N&.;#MsfdHYs9UYBlYMc@6k\r%#YMqRL(nBmk!8T`KQ-9P7qfr3#e4`<lKI].Fs4RP-][m>D':CaFZ%\kH6[c-Pp9<-_4BpV<K:&O(Z7h_j^>=(18W-qaHYFL*u3W*\r%2f1>ddtmV%phY=X"]KU"Zg&'_Kp1rN8bL\\a>?eYqpKrm@\+GX[tgr<bF]17YOel4Fgq..GeJI<9CWt=:NVZZKi%pMVri>H+5N3X\r%Jj:eG+KUm3$KJ)Mia<!t)k?ef*#lMR8_"[9gtSBK-gJq*I`L2fnbm-EgPU%R0+SrdjFqYAB8hppElU0\illJ7>L4?`7gXnYf@8=2\r%N?*1[]=\[!iTt_'..gJj$-G17<1\RVA;^K65I$c&(7"X.IptL:rdA"US\`'Z/%.eu4jdC>K3lBlVZ<kf0g)Qr[AgrKAn9Ro"E.hc\r%:lC'2Phn>8_CGcn&nqD5$0bs=]98T`\I&fdMF5dQ]W3"MRUB,&>2YE-dRNAqQ?c*KGWB?IZAkM0#jee$$RBoe=WC%A%d^W75L9CR\r%:_E$2:>B#]Ed36Y_sBhJlG?Hq`O)m<q;K;t4gt@'2EqqM>I$,)7'H@FeQ=.?`"ulk?+NoVe`$;XaoW=9CkLub>G1\bKaduX].#K"\r%(0kkJ/*[V!l8l#KP;.@KFsG,dcT<#G+7$=/QVmaYZKMV1&>lBaZB:Y.VjeY8P(9&Jr*P"o8V>YJ0$E\01n"t7$b*d-b+bLc&SH4S\r%js.jgh_j>s;?51s1cUh,CYg*i\&2n\NR_B9$Udf]bPtVNqGr\C;^H95hOcio(+</P7n.]XA'\CHihjP\</o5pbP4LUbCtG=#XCV`\r%JWWl7$Z<pelUb0ik%Gd=mNMM!7DPgM#Ll\[-&ro,qk2B\,7o/t<1E30^_Qif^l)?E]R1/sjD&<&?uFE\jKs1mn'8\T])\bjh>*.U\r%GBKTXVj#+fa@dkYDT%f5VI#LrK!AdLFr0'n=^LL,o3-'[hdgY-6R@!gQI\,$>=15DBt70pOS6>]>FW!b#i3TD]!Y,![H1^l\)#b5\r%X[J:i+nUsoM)QM0kc(BH-!JhkoTIlcYtoE"ZmuZMiF"!7A-,3`\kp0dF-:nK@1_OBg/7jI40LiVO8@tNF9kL/;5SAQF59cA7QR*g\r%!Ig``&lJ9ZaQ)Tpd"Dn00=d[Qg]sJjdja3%Pu.G<1FrO\GIt@VFZH?h<n(>/K__*P\Ibe4d>qfDD(5OumoM8tQ4&9+A:639SCYR9\r%JJ3KZ]G4WKIL5u5WeTAb@1fkL*V>B(cJ"<H!P77GV(rQoG#@rGd;QpTqh_bJLn6JVSLYeV`_H5,D3h!^-)+K'J[U>-S**5.k>p8)\r%Vp&@r/#a`]/o>k^patp%W)_!QbNF:]>2fRt`MrV5^jG**QE]caj8N=#H[4<oq\%K-H*@;08cb9_]%#c6BAYrg[7lH?K-'LOQLAZ2\r%</&o]V[3a-!:&[#'[!o6BG>6hj0KLPUS$3bqN5JhQs<WQGQS]H`iTr#Y)d7ma+K?=m<f_q@g+tcBq\P=.NiQWfL*aM4Y*m<_6PaD\r%kE"P&!S]PH$KK/s3^'&e\&ZO^44o>YTmG6W%Ebg7/R(Xb)a,5r,<f)1Re1ha7r_[o(DWF;_8p/bK;6dU#Mm3+M%:4\PJ@[30MW6B\r%-:)k>N*1*aXForfSIAA>4pTmI34Q[e+K%j;2oFI"nt<UQGspB-4=(8bmYpP0IKeQLm6>LMFJM3HIt?_GmhYh3H*hK>n&#\UN*P(p\r%)"#/BYSX9cYVl]\-CiX-7ki;@C=OAW4YI[m,Y:_2%id9Q=uJYR-H\_j04c0"?p\//"b;#_JdHRn8]f#OEE0.)SClsb8AQ"8Y[Db/\r%"t>r-9)KH7+/E:R1pjW8<^@)>@9f-Z!bE`*FTie/3URGSS;-81S_Ma\RB-l,h$Q6]b$\_*Vu*<k<2BI;0VUD>o=bm&=KmMi%fjg`\r%b+!Q,>?Mb%Sm`1"J.j7KG89ZAC87g#S"$@J;HV_96FT/_88Js4;"Y3eXITl"SjmkS>'];YOOR24i:f=+4#o&M./Sc*.eG5@K4;p?\r%mN)^s/dDUm'7%5oC??OBSR0q0&WOhXXnT!Q@<a8UM\!J&Tt$AbYr;V)4LZoT8q#o'/\p*`[H)dW8kX]c%/5#RUhL,9c:_IFBj-,$\r%T58r#8L8<OGfK9I<K1`Y[g^q*WHt^E<B(B,,1YLWX<JYhUM&2F_,+Qi7,OgJR9a??Wa<89jc3<'2H?fr@a[q1XoH@7WZ5`>.S^7X\r%l41,j#!mI8aW4>?8-D9rG?Gi.&.gX1hgfEq<o+t4HI.H]4GhXJLMB(]&m:\R*D/)1W@FDA6(=m@/lgg\j>PO3n(af*V+VQ*r6+!J\r%XYIoJ(8OT?@Q(\JgOcM32R^UJFAgrVFos8;bSXk`E6.u2bejZZgdZgj1!%o],U\1!Qe7]qEh(V%ar"ZYgC<%oXA.5<DE#Hc:5@VB\r%HM5TXDDru!akB_-Lt2WtRbZ.6`6nRg030b*6s/VqgMhP!F1VOo/,5B[Up:?c>i%*B]*!JTH*h1'^Cp:qJP#Y-_jQn.:F/S36>':#\r%OTSQr6Mo)TXcA.)*K$cuV^#@c&$<rK;$d`bW$`!g#U!^%"@3@*"q\AE"=djb&eA59,u>10!R<DLTu2VP_2Zl\U(XD\),N]2MFoQ-\r%-%ne_Do(r;f,abkdLpHs"@GC<]C>jW"'fe,Zbt5o+"Goq2-4[G%h7kc`%<bL7g9W0RRr_J)+6<e1rXHm(=2?`eigZLl4@tR[H]En\r%80+PEcBnMSXh@9N;.SHh'Y66"`^*+p;f3S7bGJ\UL"%Y2E\M&#TL;[8FS.r$``B)t\s5m?IUA;=5o'LM&u-bVP0trG)n2Te!hL%&\r%M50)bpM.P3gm!*1gs2(4h\U0#@s4*GQnR6T[]thKqn@&3raKED,ROlr#BHZ"gs3H%TI/6"cri$/;q7BI(m9mI*Ai9]qc:>#RK_RD\r%_A_mJeIE/c3MX9Z`2I/$rBs*?J132;S;n%?="NpIp$(,*]+Y.JeLrU[@7]0hpe.>Cfd@##1G)#0Gf\2Ja,G9[qL%Wc,lln;O9+66\r%!rZnJ*K3%k8h0OQF<0o`?nt:ZEgV%FW1Q?TR[3%&f'$U0^a:+i/hVY*`:3(e9#i(I@sf<0!Yoeb$q.-]k[^Ai.AkCN\'aln\'N!3\r%]32MKFQbj"Q5BuheWLV-T,_6,"QuR2euphXKS]>_ij6hgRP<Dc+[e0SFbK;JZmfkQH@6IDdX$/o+42!8<VPNL&#gI<hnW`5p&oeM\r%eYUW9UVH.NEZIW)<Z'^t?8[CicBqrjYB;Em4i!2',O$6RC[mlH@&@F#=N9uL[On[$_ErH%StdN#CE9&^/jTNi%E9mW*^f"AhT5%3\r%,?s6)90'?%AgXF7C^D>R`gK[n[Y.M.o;,DW+cJ*I]!tB;3#]pf&h-9\5NB*4dtMt>nL%#$^%P[-/2cfMa;c:-i\l5AG(?>`gnrEP\r%rbENAdHmF^3FC&q>n4U5s'E_WS5_/H#GAWuBKIBqA0@T%f<D[uWTGaA&)_a'$g5p6Ra]1r]Z/p1'suTq]OK&Gn;D\)ls"k'B\&iK\r%1[\-oU0!7tc%n(GdbpV2TVO@!R\5<Z,n+Ln%n]1_7mg%WKA3#1+UpHJC3al%JuQ6@?hT'+c/DI)OEUSq,njY%Q]J(!3R2iFNU2sE\r%dk(-=M'hk.&FR=jN:&.eY?SaaP05gp+*_,ak\&3Gl+D-ZP6s'395'Wai[;.`YBmT^Jb4]a9EUWlRN#;83cg`7=rgDY@PtO\>[N&'\r%lqs(7.>>'qRLhUiJnh]Y0G_eXKuaW_:.RdOF1!K8Oeh0F7EAUH#EodY(*R<j*6o\4Bb<[Q6(a,d%fFCKlPs,/*+!%f?/00p>T>>!\r%07EJRk:@@Z!@Eqp)'V=)E;aeq\j6u\/MgoqC(m6Zn@X+L=Z)llp_j;Fh$DE167Q@q:%^pd(Z;Cb:#TIbLqj.q+O45[.\dr9pDreK\r%nqD%8DP1"\nmJWtKWL=KrYatRr;HOgni&_dO94AEh4T%0Ff_'FFJI,kNj3KIkQ[[/<BK\C?J5<^<JYYj@k9fPA$:Xof"Lp='^#Vs\r%Njuqn*pCTm!o@2A*0qHSp,GS(?Z\j%E"[_+/uKj5]QtN:c6pOh=2e$S.bRJq6C*,BI^ZK3"T8-iet9#<XB96<K='glr>pq_II,PS\r%IWB`JrHKqEL/WKORjQPfi[Bh\V1?%AoI%QI<0A;/KPhh93?_QF<*Va02m'CX&1=[pjRdAJB\k?fF^M)Soc]ts.$cOl(YhcS#m`.3\r%66E//(DU^"h,XhB#8c/dQ2G6Rmq&+[^b<N+%Gbqh(?,^1biR#WrG&YK9h.c?SIHb='l;N4Rc86"<,0$J.?qG2kb`N^*YmYDMB7J8\r%'Fp<-`2CPq87FaUduZoNP,*AO$r.oCa'8O^m5@9n4@$oWN9S6RFU[93h1SukIpYdbXmu"WnM<@_>K]aB1"(#VD%D\l[_XmOn7(T>\r%[39GaTCT!L?&EAh?UK%CLJh*A^/jZ5IYtQ!juWX7qH?g')_/i\9`%Ygg/'Xq\!K9XET#UXZmrD?9d>`^_6WDp[7[<^h_-PX:p#n[\r%5s;_-S,/?qIQ@'-^W]?5Ig1?6>(`rYkI:Rigt;iH<%irc8^um#de5WU*1m"'i=41YRLYs.iJl'i&(PEdQG#C3qbXEe@@Fc[C#i73\r%R(9))h"bSSdU=krIAg27CX=`S[L^n<QUkol@F^-JQ+7*TO)5u=<TY2FK]l@dL697.rf`DipS%QggOF<H0S/Y_Mm@CGWg^I6.:SJO\r%r+f?nA-1P$7@G5Eo@S6IA?nP_"b#bM3[M9ja2"B*o#%Ua^:>^$GAH4q+Xa$HU=JdQPEGMM/NK4g0OGL&K;ZatJ]\lkR0<@d#A"n?\r%L47[W+.orY3qsST>@q,n85hrJ.nH0o7%,Sl>4K@(KLfn1SDU8UKYga[4Nd?$,2^te#Ym!]$_qJK,:c`!KLfl$VE3F,S6"@cUCL$;\r%[`X_=BR8L$mL\GMUNt(!l&L2%f#"Yd-Km4im+<5"!h>T&C!mu8ZmJ]u8IKSB@]n2><p"FT1e/HYIFX63!NXOI,Y8s(m\kG*eU/4G\r%K/k;NPKMKf/Y"iAJi$&fe=6Wt";6(,AE5&95kZPWB,.XB.L:"==Ts7")geP<]tF;Kja&9;f't!<Ql5SfGJ"5!ZbU_RQ$P1V0E+d$\r%lJD;NOdTj=RA(jE(7BH6Qn>nAS4$t<nLp`@qY+@[?_Tlh,c>\]s5mZFOl6!lMUilKM69Z0@OEnB`L5-5m;"qGj48nIk#56qqh3fE\r%4!aFQEE8F"p\o#BUCK&hAMr-0V]\CB@P*N_8C_9Pa+Jg>Pt/2YQSht+m53D3fZ/YUi)eJ(qj.>EOUOqD.[KT8aiFs0:N\W"84M/'\r%\>dBnY5'Om'B!,LYtuV^UW^Y5P1_q#iCVW(@aI6WUcHpB_uRuuU,g`6%#:jN`ANHK:m0-I-G[0o_l76?8[3G"-7QipV[H:C3)k0O\r%Y3U&>W772d(jWP8bSZ`&\cab!KL86@'0l-k@M!uk*Ot5L`.7,bA`+I1M#$XN2/IfKMkV?d?iAW,]7.s/&-F]sR8\iscb``pKAQM!\r%/YUBVA87^aC(S9I#lV%gP4jt:@RDa_L`sosd"@_'DdI+*^,=9erk^aIR'$/pp3NA^RJN/]DhRML2OVtV`S,=SN'>sNRK%;(';Co*\r%ABZc$8X3/P-=;SjN+]cHkbER,j.SP[jUj)/AC%_oICdf=UA_]]7;Q0Q4tBsh6$ns=:^GJg(@]JKOpm=ic:Tj:,HG!'s-.'(_,/OB\r%q55L%]l/"tpmL<K]46NDL3F#\c3j$TZ"Kk\(^G9,"/O^qleTraW0qQ1>Dn1<"."T9rH@3oGuB.d@VCU)'>M:TcfoKJk:TtQ-hlBq\r%/bm:9U\P_@r!iQZ01FOP(W4'kig8,D#_!XSqM\e*MTYr"r,VSGp+Lmj(Vfm+?[TdFoA\BZa"QX<oA.T%q7d-K>WtQO:lt-:V1BcB\r%iKl:m^PIm))mnMhAT5dpXL/VNh,_tGe5!?!GoCNXdRX&o5VCfB(;e_RWj]6Z3S.""(8%u:DF&WSQ<8\$^lf82h=2hs<^^lkN4-)<\r%=re-&$cs"P>:j_ug8Lf&`ujNnrS^djdr)@@74GTLmGVE+n;E,JncQhgpP[l>isUZ?<GF-Pbi5'QK,B9)gi[s@JXCsJ!l,T`K:`$q\r%QHVQ),O8e75(a\/p%]4!C]Z>9L2dQMAccF@s,4W77ddF]q$^_+)%f&`(e((`1Ph0C$Vf">lS6)DhipOf'N\m/JQ-fAaQTLW.s#Ff\r%8#mq1>T&*`+#4uM9ck#_6j?#;06W]t4n"?r0Rp?Y?#PPh`=<Q#JJ.570K9kDDi!r&%YJi*<YT\'\&7FZl*;JP(HW&$C)@@6^=Zio\r%nJM`i^=Zj0)0[\Q@H;SK_R)dnFr9T+di2bDZ,6]F5m/NX(jm\E*RTcc#((VhLkra#9R4DJ/0]`0`F+Ml`=@O4Cg8lEOc.;Fb[I@m\r%17]FTQt$[@i(SkB?U0S*RW7I#LfnV'pD(V3/(<bf)m:@gh.&oAN%]>kkSc,l@XPGuaQV/'*1;L$7WEH/f=H840ei42BWIOA;1TR0\r%[\UuL2Om$1&0pq-d:FpdF`;[/0q3m7"79SNI!iY[(m6^`mi]X.)=\0SBIf%6+D)M+p]4j^]t`q!B+8<X#Cb@VcPj_)/7&4U5tlg8\r%EqLA;b`ufP'B#rsrD"K4[#)Nl>mFORM*XhNCTI[OLd?jC<@U?Kh)bja^,p4%*'d28R`@G3Y`=Rq>\O%Lm4`!YY(*K8',(I0M@8Rb\r%d;6\W+7>H6n4le(AmuOr_qfoD8$lf9/A3nj'>jpqF$':KUU.Fpo8e_opR#5C)+,`?hGpe=-DP'[(>%?!M)"M@^+h>P/MeH9R(Gc^\r%@F45f93[NS4=OE'P;*ImKBL3#RZ'ZhR:67p&>)rZ)8fi;X'SX4]sA%m_^NVfROl<.Qn6&+7['qa-6j"$2Io5.'ZYG/<[Mk?GRc&f\r%ho/l@bb>ME^O9\F[Acfn+DojiH[bIoNu'U15mI1uphP!m.hBe/jsY;!]b$@&)>6<"*&.I.MQI`-Aj9BYVN'1_;!a`;*3SSh@'(]<\r%]@,n(A*B1g!RjR/7nKRb@Jj&eaUGBIj>U]t))P%7G/hlZalLrS]$;/ha%(SbkW35;Q"9['^ToZ8WtP]nA(7&(oM1d(G;1CpP"`&U\r%p!3pHCkCr+n]qMohNa,H'fJf(gg<X#7(5o.FN,)&)#m!7Z7j<ik^n?nm.5RX/utNsC(?*8,-ln0RO*%n#\^pe49$W'0iLC7^\Y4M\r%UE:FJ@<VK%_nfI?a,^0CqQ\.n^\T\&$2gFBO'.`br2Uq:=$QD^IZ0\Dm,C7'+5;\!U4o%<s1OTp47m$p@QjG9`=ogGon)eUd*%p!\r%F:3OI]b)l#S\(0[7;N+]kdU$lfph7^4X(Y,QrR'B@&2A?G0B/qZ:`C3Lt:,nFP:U^W`d?;CRaYsd@8Ij7^r<]h`"g3s$Ha7H+S`!\r%gIf5Kg"8?d[$/7W81*$(XoI8>g&\AS0\@pZ74U0I1\drVN`K`tBAfa'f!:$E%Lr5(_95?sn"T`>mI[Xm.Q^hOpa%9!OI'-h(0.R5\r%s&EC_f:Z)`,/6!jalg:Y+I"OR-0=Kd\smpT@jm!Gcb2/a&_*D$46MtZ;0Uq-)pt:7q;K>AlZtO>Y.gdbe$oW=PP?q]XgdGZU"WFC\r%Lg\@R\G8,j"f"l>Vnn@=l8oht%[+ZT,i&P\k[T11cj[6oMqooHqO;POHOCm#KnKJ#,N"Z1'#mIlX\YLUQrUg^7bhuk7&>mslo>qR\r%GiJX&hB]G>2(^hH4f8hU#1K4OehLO"d+CRG2R9`^/KFqWd`QpeOcD/e7E_8>r=6J];p;8p_hfrNR&L/-bu2#61#Na0G\RT5cPl6X\r%&^]ieqn+:o(1&cU8<TFuS\dl"+.8#EE80tZLrGTup\tg@KD35t/;@%$h4o:J(F-rk=$r:F+*&/T4LObk2pW62,Op\6C=;QONt0><\r%$<`rQ<REa]TQ-]K\g^<N0dm<gFrBXNP(mJF.K]4`])Cc5bqsA](h[:gm+ZsNoMU.=MM[[\7c[&H.IT(,I]]n)4(n-`$$sQ[83%RO\r%7p[(=9G4Tm3Ss2`G!rBB7UZs4#@*WU)-E)jKk*\G\Oo0q8aW\-pi@;$3#TM@3`bB['IemdTQp?\S,n%@!LmVqb2,horJ*37h2uDb\r%F\LfpT_2\R[p\L.elFr$[1s7OI^K2NSaBnpI99,$VAiNDI.Jag3E,9$B4ON>!^He3!Wo3k=gKSq#C@=E"<%G"2(=bc<iKaOkcFLa\r%JHu7;bjR>;_mBS417)O+5k&/g.SEQ[r7'g(WGJ^uf]$in4))^I7S1d[dfr]2na]Xt<lC]oi$!!&60eQ4Nh(Eu:$\tfe\i>OF7hS0\r%$##^k#J]e)b#?]'oB<\BHC<`cA\3)5)*7Zo(?ao#;1-Ii,En[AE33/D_bd(tr>@^0m#nDN?iC/`?fX_#MQMQRAWm%OMEfXXqW8GX\r%6+`Ym-^q$-?e)=Hj<K%-#Mg@DW.9?WU7AEG2/WcTJ2?=u6mi."TN.Y84"e>Z7cNKJa!KA(lPL)dE=$f!?]n,sf)!Qc^%F/U,Xe#H\r%[YI1"5Q=[^7S$q^e#Z8n/n#:VP?8=Z*,eo.'q:Se6gmX$Vd'1<eos'uX3[u=gZY]I%[pUma(s>II'5d(_):?If6tEPjuW=</Q?uY\r%]b#TimfT4#N[K`:kB"!W2oA-pV>O>^jLt3,3!YhEkJ_4i)*rcj4I%IDA=NbGA;6F)_CY?A'&nH5d>a$A%cUlmMP$^r"M-d[4ads!\r%'B&e((=MUV^b73(Nb=.]i!;T.B8?Y,N%RmA"iLG<$;G"A%E*gFN>g[9J[_#Z^QQ1fV&Y7sNkL@k83P,o2RhD2$[AV]e^m$RXH!Co\r%'m>=s_8c+BpIcN@5g52Z&&nB?Y`<qp)5;NG!O1?VSBL3["b#Y&Ak1H+TY#eBlfOprrng`-U`Pb-/Qa/s$Kj=dLA7."8qU(Is!n,+\r%OgWctNZ^f,V\iHAmi1#hl$hhsrNr6a3dRi!e^3Yn8_K@NT#>8u<"?Xcj),LgP"ZUc&Qpuhof>`el(%$p<lY<\pD=7t4%gG#A``DY\r%+7s,Mi:CtY+^:E(?D^?m_r.H!/7c@'<Y#\0ZW;'(Lni"535Hhmr-m&B?\"[_*-E=hogJj&^%1?I0ODh(6L$]<pH_R,;MS?#9eS's\r%#Q<`2_HAP,/MqirGD2pN[dq#Gj&16iI2sZR4TmTZmjlF#Kh8rs^,ThHXmW?dr7PoXQ'9hX2Zc]O)C$g#-)*.>:=m,\fB'$h9][2X\r%]ZHo8[pIAMK22+4ZEQjQK;hT/fmTPXK@=&+4^B)0WB+/[C@\]d5%m$4DQdOfGNL-&gp]E,DO"P3K41am*o*4(a(XTu4bZ,t%#,]K\r%Dt%DW?oYpq*fNL*2rN"okeFk0@.srNr6aaB>(JlhC#iR?]"_jXnQNG"?lqje6;)]I3um&W`p.ugm,]`FdIMX$2EN"I:QNtF8<nGS\r%rfQr4J4:HugI]RpO$e#>ET8.-&l?`)G3$@,m(q79LaMCr]p+D;@NY+.]15)]fLLDah4btn?jTPDWLeh,SXeum>uae&-btif/(4a"\r%UjA\bI:\Zj.Fkc'8hs=.jP@5(<0-8pR].@0]$\hj^/-sFp0_0&4kTW9BG4<-"!Qe7eIu>DK:GdMW!HM`+Qjp;s'+K6'+3/#%k)DD\r%rHPeb`'NQ5%3%^YeqA4HR_oehS>p#abh`kg[r6X!KTgg7kD^$u3Nf+(rD=gD\,grB!:8,CTlmu0`':4Aq_,6;i1J[$gFSC&4q>$>\r%qD?e&J'IQJY2B1N/^6MM`Hl3S/r$4FI]8#gG"jO6*P/-rlYFAuBTPO<o-o7i27,!C2p/br07p5%2nCVr2g,=G#O[G2ictAM9SQUd\r%['necEFKR;JH*b:%(3FBV%-mUa%@3h4?hlq[DQnJcW5HA^6a;pfup2<D/iu>o]Z%6&41)Qij2\#-B>qZ=bKtY/TK9"hZrR!O3l3I\r%>o`7(pT^k<BUp'3S[=TS7l_W8h^FP!C$7hndQq#LI;NJ2Eu(nn6<I<W'KYIW+_X@ZjV!(CHnU<7Bs/b?5Gq4i,M27VgZIFrP+E)S\r%nJp3jF^i*$@<=ro.^*]NMm)6?g=,KW4#T+:U]b":(^]-Nq?NCVpd3Q&?I1o`e^pkDVbS5>Lg*5Vm-?ZJ9?c=4<++2M@56[$lT;)j\r%Hh?ZWrt(.re]Z\1V1&IJiFaC(fp5Rl)UiNpXkrBP+&iq&bL2\N>_demD,\tYRU5TKfp#+,oA`hDk"8t$g<8O#$k`(t;6bBZN)dg0\r%!2j#frIdf$ZI)hLQ_4sr_41b/FCIdZJC,/QqD4"6"o3(!gI<Z+^YVl?f3[ei']K(?<Sn:D$.\UXNL&.%)r[I'oc5m>`k'=7L`SK0\r%c\UF'=/Q8ObqKV(adT10i?/PddAPV:TX10@9$@f`md#q=XZ:hedg$+ZI<91QmXij@kpcJLA/GaBG2g?_Xc5GJ@Smqb+9csFGV]EW\r%acb;K2fGI(=XF"8p,BVi,WIS!HCXh.&)`#/>+K]9J_c0r0cZ-S!GBOE).AZ<YYmli^r_YW@4'V'dnA&Tf$XGa^#>gTXY@uW*W5OR\r%0\b<6GKMQc.cHAg>dpEL9htK+ksoKEmfQ6bkTU!f59CE\;?%HGpKJl!PS]KG<clOsI5NBcHYAfjH57X]Jf,cqL#Aa.H36pt(;Kgf\r%;[E#jGML(O]O-;=00WTY[R!H)la<(7KYjC(bZNuD\T(J,)qP&(o^\+%:[#(K<X7=betrXO8CCTjB.p]*#lB$4`FitATi=(@^JcR)\r%fmT:=GU%=FAC5AqQ;=a,:aP"+OSAUq-d//E\VEtMf[d[gh'_Fr_pu\s"@HAp/U!c')JnZs[AKYbOJr%1c&kUr%*iEu*'.q`\TW8-\r%>()5DJ$f:[XK(KC27GLl[u6&p3t/:@Vd(UQrmK;]1\a4B4I&Db8a<!@Ir0s,?6;aNKD[$.r2U16=0+)+UI,IAmjT9L'bObcjPFn]\r%Vj;pA>'[cG"8#DUOhBNLA6@n[:L!+#Borr9$RLHWVi"m.ahXfkU(;Rs##kdKShD>@YZXI%lmXAOqh(&2)7Al'U#EJj5GCS1FBcDK\r%DO1'hnCC$inLMS&kFE5Bk"*16]ZNn&jK4%5F]^oLQ<FRH*&hGgQe-Uu\GFATdB)r5iJ]?97!m.5<j&ufA-/9$68\"UBSS,rLAB0s\r%0#b$/%C;b;UT6p4Z'A(nF2Op2n$FXl3,Cq4(2r9qR'i2&CU2J&A(tL8Xn(?W#hoBS:Vu$m5o06=!&ms&oTP9UG4HeZGTM&Ij&ijE\r%IkLKBNh9>^ps2*jf&T$t9jOc%IuP4$lG7!a65Z-1@)Us[h'W04MS!tV[X[$a:B/hj%J4[s+&Z6tCA5*_C\.ZJ/"Wb[O:#l[]DGVI\r%4Z"Njnl0C[+HR>UX"?mfJoE]Z/nC7n]k<BAONFW1[[*_O(S46/W</SkT'BoR,M=H_U".SD--:BI/M0P=N()@;?V?PG[E1X+&n\-$\r%[p4m$*8tC3W\c!nI^r(f54P3ElAdFQbC8mXb?4]R102oe,R/Ou?Cb?FbXkHD24Z`6]q@:jBIbCpL64Kq*W)p'5'52Zi4)eAda;*g\r%:L70f8nh$-7sXUYe.<B]^DW\%]TLI$EBm`fhrhdCV%<j!rlT66GAEPWOlG\QOOT8canSgEM:%<YiEQaL;HjKfc<EX-9A5Gk[XODQ\r%2r3gkTl!@6)u7r-0FP:ad,&8m^E4O3`:1cV>Q$2*6GCJP_Fp@5FP'Gs]Y0L%&P,"On.2!q!WloM%Q`t(&V.5o"MP(ZiG\!^+AL_%\r%FSpCH#NuKTcjc6+B=*_tHoNmm#u,iK#q+&@':N?1'2G.`-?LWYKN%4+NM+;3,tLst-V8*$>_4e7a)#-emCMmmDg^GQD`jpMW9JAV\r%0lkjE$a;MNR(<:T`Nd8"5ZbHqk2CZG4@[V-L`FY:'JXV?G9M"j*lB^QTq?^)]_QdY3QK4O$'BSVD!N![8Rga#6KAOmeYWng!(RbK\r%kF;lrMf.Ia:rLH&U7:H\7Q3r+%7('(Qi(X3_@S#$Hca#40U]COj^1C$]6s`=5-9[U;eFYA/K->?-1m6KZu1Q7,,C*i2rO$`X*o(q\r%T*=PZAfXiQ9M2IN%/sG"#n]OZSk@!_K-'U'D,TId1Zak75*r6hUmZ6/-$`%H,L)GTkG.oR3QFh(bK(l+:.?":;rpP+j`$D\BfeMj\r%I,5YdYsR64=@Fb',C-<Es0;=\lVZ\9qsY3Y*+0m4J^@MW[j464"DILW-NV'a$#=Rp^\=AhfY=GLD3`oA`SE<6R<N8GB:bnCbI/\J\r%??_B[$E1pmGOMDtgY,AWFsRk?F'>.CKWAMNGW[9DTAE&Hk3oI2S]ALSO\lJ(h;"_?T:h'Ym:$tRYgFOc$.^CcrbtTEJ%:#\O;dsu\r%1*b+IT+;<m.*CS7,]-gl\V[AsVUdYtARI"%"G>gtenqYi^+G2toIRFs?+H$*;R"0%\&J?E:]3qL-kW`RNOMuP6r#G!aDI4gos\8p\r%Ski[U6pmo)]?QKa.S.GAVr8pnMfO0^q",Lm._$3)D*]WcGtOi!.b)&;1r,0Yop%*4GUQYr;QO.p"^:;]fp3cr-jE!D+eE5HM'*P'\r%W=Vl,.trU@.b(QT$;uF+<r2OEKN''Z"lP\2YJ4F_%oRrocpaOB!E+J*l[!30i/e<<XI*id4E^)'\G:K7;PGm\'?1=%E5_!A+;INH\r%Z$%9*-:J5S&==oOdp%H(TYLt*XBL<WTVV^\^KjA63gupt4$9=UKrat!9e.+RT9'Q3-DU\D.Y+,'hgN%pKcJ:<5Uq"7,(`03nD:S4\r%o(h/^EoHTXh*I,0o"9AI@Pn2Bq4;EPKXC#I5H(bY+&qTLYUn;H%c0%A@q+nN]5+b_"Q5$CfI3]NUX//A`5^Y0%OsB*I2cYqa/:FN\r%D+J%3=HOEGY2:*39u/HOc0'#eF<R6/gp0r/j\gZYgTKd-L's_4[q`Jc)kkL7+f<F-7"`+&qX*a$MuD)Q8H(jN"o%cdm+dr&m-NL8\r%H#n*)Ac(p"\c1rP(r:ZXT*2K-S>h+o0<^G'DGGoaZI,]N&jQ1VBYQ+S49!QTq9ONcc[KTOIX1m=J+F3*0DDGYr<@Z7S[7V=@_]Q?\r%^UGQI^-'.ofRCX\T<"pc_ftTtn`Qk<88YJBT8'/7+5QKF,V@CJmb@oNTY%)`2YVMPfC"J(/;L?3W:c/*OE@99II0Q[gXai8FQ(.!\r%h<7+Og%@0I"Ztr)NN:Gm=/S3SFa_][nCql=?dLp+XMhSaJmZkeSZL''ke$$X7U56bMqi7K>O7]JDN+VK07P2FZM6,@rSgKcdXJ/S\r%ZoL;HAZ\u0Ab"aZ62P5Bo@JKcbCB6/J+cN.p'YoY[8Vmrm"cV4WHI=;`I:s;ZWFMl).:5'SuB2R]BQ7pMmZ^aBX"-Em1-F*mb`X!\r%X03<&dbMi5e_2%O/)K/c@Bkf[fqDG>_\oT,@VlnIOBYj>>A'^R\WHaGnj$\L\aoROeQ'/fYdZBfeREB]6L/Et#R7POg9OoKNgKTE\r%D9mi:/_4M_G/"cm`S)l^^@\a8o\%E'lJC45-a0.pCAV[_9].dl45(+>\iE5;XOq45CQE8]%ZQ"jMQ25)U";E'4ei"\&c1;Hctd+m\r%YCZYhT\%8,H+'(3KjO?NY?e_]D=QHn%)P-m$bV5E:Ha8grm5G?@jIqsT<OtYLL(oGXQ'=f_ohf[ctd+mY7^?dPODMm[u.iAjiTP#\r%%LGHORs8<jDEl?.hlHu(H!O;kLO\0Ar1sMi(XB2@RCi87,K9DchBr[noDQX`F6TM!`(.a3_Do*0be_7>,d[">Z\).[-$/5J8bDQI\r%f7j7kQiHE=s6Q*Pi\/bt^PitYJY,tmrYL([0E1NLr8k]-UAsm$rNEEgl1YouB$QUUjnso<%;(+7Qk*KJ:L,_C_e8Y,o6\+Koe#?V\r%I;(C8)Q3k`C@,K+5\`Id_0U8(BmI_PJBt5q`#DEb'\)><.cP)qR>N4SjpoFj-7`dc!4rgO7GElAQo7,7Ai+cJ7RE*+">`(]k3rAp\r%BNVNoE".d\UMoKr'ffa'N.r66$"ihRCl'(dajo+&g&cGFF!2ZB3dh":!b*!]oOMWpc45<P=$Aj`]B2J?Ftf\rpX;\r-f5tg;u$%6\r%\\Ua/WK.KH@R*/h3A;H%[rH&\epcFAr3;a;[oXLc0uIVqc"A^R]hNGMF=Q,#g4>N;Y`5=*fa(&@R6f?*&VC^AX<oodN#:j*d'!aN\r%[HE_l0mL^.J4qI_$sKj02o3mS0AZZo#.j,E)F\*H[qGVfTqb(dJFeiR"K,*B#$,QQ-9-u/0dQM6BnFe^&i2>uY6dsWPq[KI850%!\r%3(:5_o-QGVWpPe21e&.K7P/T+X"[QfS48VXcsV,4S;6!*M8[2$p4HKNNPlqh?lMgCgdk+'m@nMEk0(f]@*@CtN5*\0kXZ-IQ:!s(\r%-]Z-hN9c:;'T#+>()AjRB-UlMB4NN4lpqQENXc4qSi@?=1E4>t5<'931YWmB\9TD#bcHfCZknRMIAq8/g8j9fX<`jr,\//)F\??P\r%>H-\-d'QuWjMqZQDrlDo8q,3QMH^#Q.eudCd<<\UAC_:?-4!bB2r6.m)=li0LrJ;;r36'gOUS>P^\r!?m%p8FfANR)>Q531V=&a1\r%c[I;uajRM:G@0XDlk_%\0q%u<9blB2EPk2BBtrI#qm]r/V&kEipY.?1nP.a5c[P]9Ieh<=C!1s.J+e9MceC*nZZC:g/8jfCrtbKC\r%kKU=Bq!$nb62&Lm"h>pD/S"P#S:2K;UeKK2:KJBo6>O8n*[Kiu!KNE]%hX:B:7$muQ<K*^MkiIO7c/Sna.,qH$[!`V5nTXrgOELi\r%%NbYa0nL!i)QX$3eqt%Ag4]o*eqt%q1Ksr,laQ$j))9XOfS^CbdYNId\:A+l+=X&qj)j0l-&E$iIoX\L*g1QW:LZCWA7_rqG*C"O\r%?EA)*b@!nP`nnHp+M&-d8\)3k![a%TOHaP:Ip,Gg1DLJm<>*tW<U^YWM$uJMpPD6A9Hl9aX#>8Xng(O?g-rb%Z?IC[-]s[,XPG-W\r%O>"KjX%]$O2D[f4:%KVc`$$k+\_Be%6gTg;<oTK<A=0!*%$if8a9#o-NK?P_S:?Kh5E1iI[bkN-V,<r@9HrL7Wpo<FWSG(0l^g/0\r%J%H[SM%&k$mh5tn6rnEQEd$qfIc^1\l8?-Ai^)9WM%&aiT,JF6`Nr[qYF(0q]c:lu1VGXWR#e)QRcF+g2Y?I5m>L!$A[[JK!utMq\r%O"c(MT_nU%[\m8*ZR<LHXRX9*=HaVNo+fdq[B>f_,<BfQ$`uA'ITcM#IuNKMIEc^.Hh5:V#j0^kbA6\B1rNa?s-E].+)<*Nm)muh\r%oB03Sb9*4.prgs@W"gS`IXQLY,*C8EDPM+(5pEWMWO8YkK1&1e3^h:R\WVPN\p?M#R)eR[ZdCAs.%]2M<HH>:hmR1>fP^7)[>5gO\r%P*tR^iS(MHi*G,iQrYaUYUmePG;Z[:E;,oTQrYaUg_Zk2VA2b$nlh+/]lYMm#-0^V>GaPV"tbbi396@ZY<//@qt98PQuX$KZ/M=j\r%Um?u(pt9Qj^ZqgjV]J_GF'WCa=P]VH//dIFKe5*k,m0*(bK\3p[`%:\$OWMKqo\);GJSaEl4SL>BN8ra]RW"rIj\^1qtRa+Hac)P\r%P3Fp#Da([h4/9iZfp-J_?=&Bp<>RQ5;ar^,Dd8W5lII!8nnRmsd2MrZi[PGk\ahb0YT4a?^T\C;Ma_"RbNGfNEV]OdU[DIMVWRu]\r%8:6jh//atH6\UT8Ope>6[r*3&9%(>*3?o/u7?_:[Qn'T-)#dWXr8Zme_\S2d^'`<D^R./equ4:X23D?a#/5-Rh=c'hB%,iXh<hWB\r%dDk.V3&uAC4m=na(3sJ0AWGaaX"0O/@dP*_S"E<KQ,8Cq[-,j4[9QsbR64cF]k+dS&*IfnkoE[g[r]32Qs@<8b3SEcOc>b!;gGlq\r%H1>8`Ws*F]42?l=bCce4Rc><8T</%1Q+0K4pU/%_bL`\Lqo7q@LRY?Ro&&%W?>k>jB#4t'miJ*.?2f<FXJUtd(Zt_M/aU@;II2QV\r%^r;AB%da2fo;b*)htUfqQS*`B2u%L#]lru;R;%Diqa_d&pGBdsIKW@7a)>F;]g73qb0\;Nhb!QP/ZOK7UO@I"Qe1#@hCkODh;5lt\r%5-r:9c(SEgoAJs&eQ;$%Og"iZ%5@D*=0[kTjndTsQX=>b[[oV9--ZidoqVE.g2KK'o(_Lu#4CBXe`H#:Gnf[*_1&r(o'>#Tg7.Ek\r%d0tAg**rLAo[g9^=8+YW?[;u_AcBT*khWSOOaM0;h*-5q2Ul6OS<^d?K9)n+]^[urQHTMIP?Z"5GZB7.*5;*P>OO5Y599ii]*`r[\r%Y=:bN)cl<k!2K)$*>@KU&MVNF20to:be'r0*ut8Bff?URISe#=2Sdmkp`0&>#64DYpQaRZ\#Z=TU\Hq-pc,b\&L?,Ra0g<*H`>XT\r%qTMWejG/qiI/P]a.Q;gANun5-:BjGE#JIP>lc"SAi53gQA2n-/?:S@?Q=&+F'f0^Jmr#3k-f;nra$ZL-8/7u'oc,HcN-AVCI-OhK\r%hE:T'f*A@j>ai;HH,SL>],"+VJ@92Z0<>7;"hj@']d:*n?+W8@%f#Tq^3b1lVEr^7`r==d-4Crh=R)*>Ke(^gkGrm>MMhj$<_N"t\r%#R&^&^h@jp#R"2c/FgbcN>)7WbJR"+r#"(CW&034:LCcMB3g;QF6O\pkJ5-fg;OFs,h=#B>'mdNi<tAqJ!i:lc]+\-lhY-TMEZJp\r%>*]O,Y2=&e1@FO6I;@i6mZgNjnQ@N.ies2A7eIc\E=eEYrpgdaaM[r!YHol2j3IFBW\cDkqetoj+5ie.V3\g.=1D,ck['gl1Og9B\r%brMYE?rFhlq\N<u>=N*"gs6d#goYJjaP$isO850d\Wofh54:^B`It#3`"!IA0Va!sjs>LX-N(hPqZeKocjn'7G+N.>q!1Rj<hQGB\r%0C%JfT"V/L03u.Y&Bjk7;U("`J$K`L)9n!5Zo]NQF6P3f2SrQpn-&-,(-["`;s_8E\I-pKIPu4+`gtL9+.QlfN.&Pt.i\'=fgcS6\r%qQo4Y=uZ_(Fa$j1XmBZ5"Zn@QJL@31e$9Pf]3fh[g,!27K*=&C1aC$.Gs`e\p15MfP0&Y"i%SiaN+p53^UsGdA+R\5o1-.`cK9P6\r%2;DP7B".f?\\/StG#3>i]C=,$_oI2rYj0Vo/q/ITf=pY@]lVQ`Nc,qFh0s]qjm;9\f((t#(N3TF>8NKo6;b?*'!'*O]sf^AAI*o&\r%24YOaClkRlZ+6`M</KN3ge'._NcGgA6r<`*q;[rkIogO%*0/g4cHb`Wo1L#E+5V?L0#pP$cBGd2r,C]6e&A4b[[50@(N*jZo5&&d\r%mJb*u&j3BO@+?fFhYd=iaaBQOcK1M'2Eopr0Lo>o.G'o8M=pdm+u^S1cT:Tff@RG`FZYtcpO7SOoC!Dkja<XUR:L!QbS5n#214M7\r%3ILHb2E*Jje`b,cV.U=JhCl$:?G$+!rgQb((=d4G)lfBq[DBH!K?&nVbi"M1h`P6F[!TR"\t\VdqXQ7G]DLa`/bAYl\8hI"#oR5Q\r%hqqRCTj=_CkSNPlQZ'tiraJiDAi@;/Rfhta6"'J'02+@Fq"d+T@=j5D-I(]q?+]=L)J6?qbc@@gb=Y$U5'hkpq<G\Y$Qms/D0bH7\r%%c+ka[=\WG*9(a--iFlacm'8s9GJ?8!%Y<P`6[Jan>\M]7o`=)6BQ0"q"$Z1B+Y'pi>(.WX81Z+kK"Jk"n;KMK?C&O](.l<hS;7F\r%.m\,E-X3[eGkhdh#1+F<(+XO@Z,:F6gHSC*3GK^AMm)SS=hgK1S>Eoli!GpYNJ!]R$T@T6qba<=f3c9BD30h9dJ<H_/\6,sB]J^@\r%'pCJ:5.Q0M\%N]n]j6rSXM.*opZ^hcnYI&@9o!5#?]P[bG?)@UG9-n(\/XNC.$B<<r:R2]3AfAQ3lqJJnD:?>m//is!Zh2S`3TLo\r%o(-EQ,Bq>-lgr03eXV#Wqms\\M@Jn_1F0B,%ij8n/"`Fuh@PV@Z(b-[R9:"Ap?qd3fn]iOAG$ggo6F3%qnS>B356[R]6e<733k-;\r%PM,Tj\p\tukVgGC(GF,&T'OTT-`F@f9=LuuaXV>S+"no6eo!X;Io2@lr<Jta(EA!aF5%Z"q*f>>;7R(+A5hulDo6V^=[B;lEMZ`U\r%0'CQGnR6J4I[MdqYism-P7-ucd$O6DmEsh;c5WbX,5Lj<"SD*m9OGCo1V7_@nE0?9lDN067Y2&(E(H>Q5C8h^3e-e(oTqdH(gQ?=\r%qMYh3p<15Kgj9$eg5EWoV/:l0Qr5`n]lsX$HKQ@i?l$u2c("0NcY]lPM"upjOMPs]oAdflT>d.CEr.VrkeH2^?e>&3mJPbkH^j3l\r%?To9I5PK<X+:R@m%5'@F&;7=P%?gp'l5`.T5o@ff)slGl&VQk6a.HQF_AKh5F+bZpZ!Ye)^\,$$&B6P]=TCXorZ]*;0F78piZJZ1\r%k'5ZV&>lpL8m=RuZhk+4JhTjhb7b+h5Z>NRN&M%&1t\3E#kKDUFRMs;KL*PP]7Y_i.$:.Y]%M*8VUfIUV'$3?95:'mehdXg1YXYn\r%FBQf9fLfs$KL$-jr;:HU5o;7m:[fJ8elT0TUR$KckdAEFr%\QLZBZQV^^0D>lPJL0pMPMLfpO5o;di)$)MBR!qZD$rJ[9EA1V1-3\r%I;(qXB))O0:!S?f,\N0(kMNgdJ]VM9qa-L+!_i=aAGoPY@'\%PXW@62_rY)kA>EOTo'r;XV-Z;0"-Z_@qW=R@5CI2:!gDa:m>^_,\r%ir+LpZj2ubA[EW<^A,AKCH'#`;e8>)9RE(aQ"%1D5J/:p=_acb1U8<*mJ3]H$s#SMJ1VYfP,W10^m5kqOu^\:G*>ET[i_a-firrM\r%-[l35hS2@:qq4NYgRp"ks5*QGJ+)u1EBH4^1T[lG9N\2.e3T\]1ou=ho<JuH@3i`"&J(>mcS[Z:C7SMQmFr8PJ4g3\het6i?HQTi\r%KsJR5GV/e<J.#KT32gakE^%_Y/:p_BOe4i7X%G_[ege*]%^nc6`PtOV*6f+%:W;Wif3]=O<m;9Z#?mkrCZoe@><RF`'4s@6)^1_`\r%r;;NUCA7T`q<<g_J3$B.-9nrX:\>hWOb-Ub<0JDOe%6asp:"ce;LL303hal[*Q5Gl[7@@1Y?(3?Cf+3W5'*sX_A-)DX\7pu`S:DU\r%654?W%'O)FdRa)b<7N:S&]G\/_t2Kp"G7"0S.)@hKo"`>"FPEuD[[/OD]tj"K4B.9@&eIHG_9LNUK%^3O5f[H*q5Fu+Ve"P\("QZ\r%.&?^R["PprpE".'*On!L]!G5J0$I`c$eb,,1Q09+[4?_KbcaIEk%A8?;Q?4jZHEgs_"/pgmdp6#?cuCcdeW=s2MBcJNP^%H[0+kk\r%;`N'@[`RW@X\Qgu-G/jt=p#H3i[rfVkNRfeM;B+uo?GL>P+K2Z;Jgq]*:8jTl^HM+>._:b;_C1'&motEs4J<kB9+E+]0e*J2ZnDK\r%Zob&7%.e$S:H%(RGC*9iC\<%Z\8`<&G>GF.k4ka>dG;1]F['7+"gTk1XP@J]@kdLDXIQZfEL;"r<_a_2)Dbas2N1M)gKFa*pXaQc\r%cEE2"1!TplkmqiK2F_EC%a?:Ni*98t/(^!!%S^>=2m?>I3\4O&f.Kl<"8oN"?/m^"j'jb>G'Pe6cNos$<11TeCbKn0f_P&G:!K5g\r%-lTH:p:DDieb\(5-2DHEf$,_;YH?f"XJU%0qN#E,mapV,2;hC-.UD8dEG+nGQgOp5Npj-=/EeCjE4!$Tep\W'+m;g?C'!,ekBV_5\r%bp]Rk#4V>EZ>]bs_8)n%>>F%)@5)Zb9VD@mrI@O"`5VC&gP#mHH,<#q-RZeSZJNg;9u*Vl?=3\RA[#L$51m*mF[!JY25NUl=lTDQ\r%h]!g(Ff3s`P8J3U)$ptIH@e>I4$sRW+2W5N@u8X4r[!BLTPEB;'"b32D[\n$QF"VdD1@r-aY5Dk(2IA[W+$$84ZZbRrNI^"e;:R<\r%L\fG4.+ICs*Y>S+'jkHRX@0O`?=!`ap\fM<I50N#NHRk;4hYnAV!l_9`C'Kr:cka@Ma>#SfMq1ik@J,aQj%>pq#e#Bh:b!G*DnJn\r%59/:uSVJHGZ3SE%1l@d-?L'RgTi'T=:2_/nD#fG4Zc,Be)kqY`;&^O:>rH5&((VcA)]AbS^j&D)GP7CTm;?NZP3C/hfEWYs`[=Nn\r%1Y(\b>#)]I>_TG7*K<B+G`kQ(G"dR;:hWIL-4?)^LV$o/0[iABh9;rh58]K*f@<qM8\7?]4=FGH#5\DG=G;4n7kf]G9=k9Xo7#Th\r%(p_*foRlkcmXSM"mS)(lm1*X0@to+EUtqI*_%qU.*VA]Ae*aH47>ZK??J8]b:(nf"mYp>o@`rJ0LdY)t_.aAU@!GFb#jd3+(>h)c\r%G;H#^i'c3&1UE9iUdi<eTSfED=9W-;&)]&BB+0E@?kG__n3SYAKaMh2$nnt#>_&%)L)4%05+%aT"LLCj&Mmo3L5CkV_:T!fB1#Bf\r%Ali@+K2T;u>#mg!p-F7S5d/QVp&TOo(&C4CfE[X$>bE1GLODEGZ4""i!qq2]KrY<@LW2Nn3kc7*?m,0Za%<KGN*!h'7NE';!7;]T\r%bF=qGCWb0[-GhtAqkS-7`m!eJGuKo;:%daW)Ar?ZU@+j&B2))ppX0&o#;]-3<*Ru[Kaon*hUEfR;cR.2fMHoHcs@hloRtr9@NUQW\r%<H`ELK5l452TJ"KBor'I55%:qM7#s:C'FJ7Z(M>1'njCe5jXL31Bt][pci+?e/8)@T2[Q+?m!%1E1GF00Wa/IMa83>r0*DmN.?>,\r%3m;8@mj(2d$Lse>+:Ru()l)Dg+nbrN98S,E*qhm.,7g4o5S0g2KgYKbp4>!fmCNqZ"+i4F<j.Q%KGgb$A7Fm-Yf0iQl;iKjFmWY4\r%+H3o2kkO,p9U.Mg0RY`WJd,X1m9VhW&8$g2QVJNR1"dT5/I,^aY2ubi@8&#DCcMc"q"d*=R#or*-<K0R0]k,6p;*+Z;B#gKG^a[K\r%fEYLIHR[>Qg;?+AR2q5d&-i#^i\)P#3#VEU:X)E\Q43GhmD3cMD98%+VCmm5B^CA>fnn108$HN9l:jVnZt-m]X&jc=/ZnCeGBRgK\r%#3>c&^k.Cf0ufhJ"L)9m8;s$-"'1QiLH9N&LAE.hi)#2h`0?'p/e7PfOVi'h:VOQh`89s0k6=Fc9K0sP%e[%sN0C(q66rGZ<S$'s\r%B&ZA*i%294OdN/hOFon`-kc.>:%LnL]asSI85)1AEo]b"jsi3i?uI*C_/-'I($rg^1&%8e)ceEC8gL:4'5pjdhE2E,1Tm_0a:4.(\r%0MO(MRg0aAAgb^P)`861qr4_c%i^AAWe%#^m*-b0Y'77T8.8%o+[qI4f7$I7M#mLmK0qdE&d.SBh0crMg?8X+R4&n4C*]\G>r4ql\r%G^aT<lU.o0Vbm=91&I<?SOcTNQ]J:Ijl>_jO:bF&,jRpYOo#6E[H(>h41d*\2tiu.N>Qk'[$!nMd;-Z/kf`Skjk4EamNU5sd*5`P\r%@a#_]Jl)b0@PHEF%iFu\7SL5QI>sULNngcL;rs'o1h-1<eUtnH2`@kc?SVWsas$:6!t?*(.K.@S^s)YPd82-U^DU_#8.8ZnI@>]k\r%N5QFa`L,:bUUC6Cmq!L*YD8)]0t8l()r=7.M&DVU(+'ZHLi%R/JbG)A@'tF6-kb"8@RD=ooo.&@+u*4"d\dsr^dq.Km:)5Lb]_7k\r%>t(i@Rt1d&`)O1t!!R`?85)"-ZU&JBMfRCt$oD?;V@Acr6-(W@bs2A#@PEG5:G^@JOdLH<H977VRG#=!5c[H"o8+\H1UDM!JbCUL\r%=TGStfoCH(qaWF,#;FUbBM0qogT7&>_[3uc*??\Z;$/$tb:r0<6!\*b:M`>s"QfPCI?@[TC;Knk=t;8o_i\/,a,RSU(QS'/1.,g/\r%/@BNtg3eQ54kbjDCmP(2Bj#P!kL,MsgU`Zrbk;4o$<RU5i:cqr[K9LH+<TnOZo)#5b_M`$.Uf99YGVnEkXq3dMkJW+FL"N+?HhW$\r%fhkVA-OIX,4a@akkV7ZC<>pk=)tu5m%2abl>#Bc*d""D!X'LZ+KR%S+FXH;CkND^H@:j+e"Yk&rfb6Y3AOD&'DO/l3+H49q(sqba\r%iZQGN=_[th0\BC6:G^@K6'ukUJhXnR)]XO1B2jm(KV<5:EF=G=WRh6[Mi!$>YC6nt[LF71+n+VS0Z&g$0_Ls:G(MEda2WZBDA6/+\r%T&.S9'b(Yi@&NJ-0Z(YX0Ne!1(6%`"&Zb.]T"I8%q.l-9%%OSObs;.1@Dnnm\.1"Qeu_e6J=4M0_F=gJ:^5<l0[T]PMnjfVqHU1/\r%)GgngQbc;R.$OIHB4@)sSGPdXVLN4/Xhc*DXS(TI<O)>jnr>ZOdANl!b_MUJ9kX)#P7?s'K/_P@5(7qH$1!8MA12eD(hE-SQ4/3q\r%6Qq(PZXiEopK01.1uOZNR@a>]J<l,t-3G9c+#I-98Bf:o.rAj4Bf%0GVgh4`0Th`jfte[p_aIs-/1G*G(1/<kV:]<a=@N<<6g\?Y\r%:+6hWPDu012G#.u36]0uTYhs.)m`0^6t-A%=?p7Lnm)[f#T>$&1GaWK4]*IoCq[E'S)VKk3eE*C`5!7+TOj0'M*[)V&BG01h9a/2\r%mb\U59I.X*PZj!`i//!/#T>$&6_&Wk8'irP)!!B'3eE*C`1X#P:e/kd^gmVc@Gd*<@=ZI3_NffaLrB'4]ZhWTUB$KTk@-Y4=[6@M\r%36D,laT;O-Jc.@\N/`A0E*rH,P6EdP9Ws"EqOUAi`.4FA@c*A@JB8-?Cs,;,5CY5W&X,]INa@5G1O!s@jeY)2ca)Bg(On*1Hrte0\r%g70%e9;Z-OjApU-HaWFFK%7Sdr=0P37H0&D(i]6,5J(/>\TR.GEfaQ)Z@?A"s75Fa)S(7"Hf`Z/h<;mroJRX,Lr:RphE5&UAi4@2\r%>R7CY7W!^epGVQL^`4N;AW^0:DLjgX!G7XG^@QM[G5'^G<uZ+/^>>X2e0KG8qq==0qQ^>2B]U.;n`9,LNk[/B*3/?-,Yp>t5.U45\r%>"Kts&IZ/MjSof6h`LjXkOjc30C+DH\L\@pcMc&K="b%BGE/<AJb^]HOhH#5_N2`YB,CUIo'#H9c1KW@\Z9r'ZPOBphEb*0HPNW.\r%;B`*u`k-=G*#n8_?NXL4Ttahb']0;-^g,Xggq-DsiZ,VF5%`GQSerrh>8s3L,ZcmBgj"-S7*tEW-e^4BB]f#]#G!E="BqE&@;Wr5\r%d\eS_aT\'0($<a,R*@>@<W'U?MlHB[$d$WZ5S#_#i`ccNbKJr^k/rVGk4<[D]!_1jp>e@YmuQu-e(!uod+*pDHjg.\0GD<b`,('W\r%=u8Z;qR=Aq13uaHfdo1/o4@;ej3D8#jhOZL7,dc8Tl]-AoFjV*5N\#u)i6-+YMZfArDmun1lO>"Q][ue'@Xo/"S@CFj%JTg*=B;7\r%8pk@InrGXZm(_[m33Y&Q+:cu^9;mmT"3^l=@5.gf"RLsQ=5hG)HjR,r=bLK"eB7`.a5[&UQRUQ0+&36i_;8PFoqcGZkK]*U1P[hg\r%:(nU_9mWH?G1GB[V`SAXVn-s6qYWpZAj9P1U#msW"ieoaqe5]iW4CZTQD9N<GH]/Co:L3LGO]=jI<m9uS\;63e%T%KDdTM+=$Bu<\r%E$IERn5H9nG;$c">.K,)(?TNUh%Gcgj54\H1X^G$(U!eu4hV51i%,k@UmosWY>GZION?H>_.hC#a8#JNBS+^3"V,RrSU3lOS)?+Y\r%d]gH+X<op%(hr(u^S*.&lT^`srftg.P4)gYijD#*lhTO!-emtO4=,cbY3[4B#2/oiZ0Z0(oI&'NJA$'uYLP;hedaFt$@!J&MXT[c\r%p[>i0A'u(6&uiVqLYiR:G4u)dfl,0\XrlJJSS`;HSa;cIGNP,8mh`Ii^HZqIDEaFoBrf"oIJ<uop[Cq-Hbt*OhHg,&>kQ<fO7/6L\r%^O(>%#G)olLZU'im!GeV5B9&.MSHlHnh*Q"dE9=@pYku-[gSNs"26N2$.Re=o?"R-^@W%knN0T_C[X*/f#Kbno?Dp>:XeU5;gI0O\r%U(ck@m7Z^jRUNZ4&Ua3@bp%\GpgAIGmD@%NamkENpL(2-04NQ/q46QT5PD.:]1]"o-93;gh:`%-l1VZJSHV%Rir"LNF#JO,X8h&5\r%piuV2271M3I>3h@2a6.#8aT9>!LG$NBle:fA:&e"`f6fVlR+>OnR%h3)VbLqbFdkeYNrf]^\p"`P:+]((&?fAHQa;S08hLHb5&MN\r%n'?Eq?JU&2g!%n<`J)9(/7#E)8^_&88@\'`2Zh@5cNp/YK.Ensr^)?l^7"k5o3hN27Z7J1ddo)+qA7goaE):7Y,_.F?d,_5;u.N+\r%FT]DWl=kf$m!NFVn+S)Y\u<pRQ(b4k=Z?ITS",i*&PHC,Gds?H55g<Q6Vh'2,Ota.iTg""B?+e3`T;lok'ZrDhs@NaZG-?YouY&1\r%VlM>706Gh75Mq=?4[4JqHZ8UrqpfTY@hjE<@fHH*@fH!K\nSgpo9U9NJYr3eFo0G(o?T]C]QC&BMF"\RQ64DSIsQ,7an!9i]a[S(\r%.R)+rgYYTt<>02OJ!D&,VN&3+D==CfGs7bu%9Co4Xj&BBm\f3tX1>PYMt6W=f?F\QQ_3El=-5UO?<c*R^V7+^pA4G\/#A6jF5cl6\r%2s;3qI/XT>SfC;OBNJDfXaU4hp#5cED^TJI*o("Ms)e/7moN;H0qZAPDKYp,qnncdn%UO2MraQuHPj*a@<WM%Z'UM`>a4nbRaK#U\r%O<k9Qb#n+g/Z!b[/!NJ11/Hj5n)JU"Xk_EiEG'/MLYem!k<5pV.o/e2aWtuBpi%l9>qce\K%B[.Tp1)Jn`Im<hr.j!5(39UQ@4[H\r%Z]?00+25magc5/rS_9Q8?U,XeMV/dM[m/R0r`IkZ`V8m'\SisHn/(2@XtCf%gT^Cpp2`'nDj8!X]d*P[+X<.#F"kq"kF5QP>"GnW\r%j?aHH^%M9bqX(3N4g90SnfjL)qEt#JM\i33#3@0`C\7A3j3O2:00]/H?-:'3Ao7(A\R%IGKE/L=N-cFE_(r[WlP+%$O7Akp_'/3i\r%/q7,prFUNWo!Ng_l1;p71%que"qhdZ%r.UVk*`u-p!r5<C]#&opZK!Y^IK+*XL7KMm!O(^`oZAr*M/5e]=mb(jQE!.HN$4H@1I2<\r%mY6-l5Q#J@]^^2$J'YICqnBf\p.OB5?n01qXial&Xm$_:h`eKSV<6(p$_Lih2kGWNHsTfq^Au7Bo'U;Youu3pbF:HI?[^poe>l5d\r%^1M-k(VcQFif&S\(2SQVW+CCOh1-%(>9WQ'"3=:^pds`W@WfuBn%)6-h\l[)<#q"Wf:<D^h5\s&gX=Xcp$2-Pr'>d`59)kCjS`0C\r%ZMaTb"14a5HJgtUGqT"Uft-hOdlF2^Jk17o,4Y!9qU).Mk@V#(f7,o9iSU!K3o;M_ml,$KfC,;9p^@epdnMM_\)oUJI\dgrUc_4?\r%;^cO+r8Rpf^=C-q^dpY=a&"A-?6:<llTr+i5BlVtoV92#?GF.[H2btLB?)%AD#!V]dNu7*^TTeHHN)pT]B%$0eXm)=^3TW(%kcOa\r%Y<R#l^YmiE@[_bBmXm:*p]f$hb7@hSZQJm<]Q^S\r>R1R@'`#R":=kc&11MH0.#BK$eq.X(O*#G4kNjoSVn#e(>eD+>'oo&dI41R\r%+-5TBn)2%`BP[.)cR9c?=*q=ZN9%(m\FXh.)ergQSG%3rroVIjmnk@Vn%aSR]_lJjrZHQ?aSG:"p=JcZrjZY;;gu7Tr`,QV/A+JK\r%r]T=7S*PiZIG7LuSgJAQ(&NrAp\rb'UOt)`\`ClthjDg^gR+DK?]hOSDRmC,_9&!/Jmr34oC!C0?\5&bqJG9ak=<RgJ5pJjbcgm4\r%2geLfc8fVEIQ98<E$^"A]t*q%!_7&/h=Hq'Qf%8f,=bPgX'Y]'Y0AMM8A-1bgT>B9*e!s9a.(uDT,`:W#%kt.:`b'J55Ba3ij\4q\r%5CNO^h>?)j^LkD%o5=d3id]GTN0)^1)9;5>N7@:pbWLkJ,8SRH^Wk!:]s@@tGk:P(j3QVtmJZn=1J:8bG.[YH`o`\c1M5uX(qY0-\r%*hF^)$_uZV$YL5`*'E37RHVj5r9r>=^s1J[^e]/eU.tjk.!U:A5F?qmmD/r:hu]%A,g"uj,*&BWV&s0C;LW1XrU1W\dC^d\q1%@i\r%S++=^1SUZ97&VpAF%2e4IHKYWkfa9ZZj/CdP3JCX.S\2.bp8-D*NbSbKJ"JtSTU0U,nT<uqX;B,q_KVE+*hcoF@6H\cMUHuH.pBH\r%>WIjE&Y6s7duI6SWue>@]=eIlm0]F'4>F(,ilm\T?QVKrrq>;4lr\qUm2^Vfna467rs-;3R/G+Ej6sb^\"kS$biEF!(X>-i3qF1@\r%rgt'3i=@_96,_emB:jSk3V+'%ZTHCFc#m!t7r`DL*2mf5^R\4GPJn!S>73Pg-cK5']Zt#Y.(_XIaAaNfYjZChF;uYc@[@bqT!6DO\r%`,TuoA:J!r,11YErq&\E7!6p7MU0@7aA*`<pf.^X;0gB">t3;;!uE)>?0ilkWuHL[fq?$HG[HWM]-:dWeTQZ(+WC.>EUT+CSp0h;\r%4=>7;\Q$ATAAGb@?cXL6eTkZn>^uV9P%c+j5GdY(a@+U9Kp;@X,tZmS3Ym\.Ff<++OuQ0eb%L3Bm0jFgZIEqr"+FfEdguK&:)[q,\r%X@'cVXj.Q,7q_JYP)rok)udC9e!\4<`"SN6H'0WQ+d-duU(.I'7$ef5W-]O&K7">XW]Q&.jVa3!+AZKALGP-5XHPbZe1RYNQIJco\r%U"UC^<&VY_7OsjO<mW(T?+ENFF2O99Kudd/h_opX8K,KSWGs*0,k!.HB8h-ro?a]%c\kPg7W>sCI-t@6^O8.!^V7GU*it;*hiIMN\r%kQ:be.cl,t8)9rLVanlB>1jTRq`#8O5ugEC.P;fBUH7IpQ(9`JELg:Wd%*2\o2;fhE?]EddS#QG/Vg\4M)I6sQ5WEOfJJ2h`GLm&\r%K[g,m^EfB@T#1)LQB[#f,Z4Y$Q]*`lP]6E5BIP#:59W3IJrPf^3jkJ#pm-rL#6gTRdnV58*m\)7Eg`cBAlR1Z7ZfB>s.-[TBIcjQ\r%m&A.c_.$EV-cj^a96.TkHU9ob4Z=J]QjLlS"IFp,g9$.>2460@qAG.[2c'k6TSO'pP7o]LW/a:"iUVrM,QaIO:E<Y7U`RA.R[a@.\r%#MCV@*fcc3Z_R]_;,*1C!7e:UVK(nDM*-FbaL!HEpeWIf4;46ZR)n"s','+-;1t+hM@$9@Z7+7%,:Du3U+?q[S<+X!T2q@)-eM6B\r%-Ti&9PFR^9:8Q1",:6q8l]."Q-u)%AYh9oSkP+%r^N`#7];$r8XI'P?F*9;n+bj26PDBMcjW.SD=%l.e9ON]0P@miI&F9gSlM0Lp\r%LOlf[-=d1:1fh.3-6u-<:'M'ioS<fu,WP"N<n<-7&Bc35P=R`T_AQS"$/Z/h-mu=J4@!CpXH&BpC+^hi.#Dn[1,WMB+%X>,ElA/B\r%ATL0"]+kuq-kd8c$)U<g.$+N\ab;5mA.$M\KPF"Pf\&:JBD6N/KRH0NRQYjc3K];u!B3i`L4;UT8;T`d8Y.3]PnG"$;UeuAN6:75\r%S\\)B?V5ReW:m$?:-ksq*P53993A,D'iQA(n<#J7*n3dg/T`@tUWeu9I&rSGSf(:#8dI.6(c'La-6h^<1eG3IJ-G4+Be6/O:*_99\r%,oUhC\=?+*6rZLkNgsKER@Nb?0NE-;JJUijOh,R"K417%MURTUYd8DrcgL&=$2]C'1jeY&EahST>C-DuJHOb#r>*'i+$ErGU5E"h\r%s+LN3TEGruPb@$/eTU/p0`9F@Jj<ZdH5o4d<p47Xo*ij.Lg3:^0bMP>ako(d>:7;*9b@[T4,I"Th?97Ia?)FT;Ms)eTU=n?ZCtRm\r%"T?)<Ge+<bR&o7*4'<i+>VM6e]rRO?=jU/B;0f@K@[^uV.TSpKh?d@f`FcYN*g%3lQCHF&n,9KN!,abm.=`(p5)lHR^=4B_$K#m(\r%P&-l[L\Y?(,Yb0u1,8VQh*dIO$\-1[4uoQ-Y[qgSg"<HGJuSU$A;jt"R2`dH%+`KH))4lP)WCKUKNCH871Krb;^Y]%=Q_s$b1p/+\r%,BM,CF5g"f-d*d7MQt_QTotY"m<WE4Y13\sUQ^m^([%aZC#`AuTF>65TVW]MC3?0S-l[+,KiD43Eju^Q6j$6&-d=q-1ETa&b:_a(\r%/tY??'[0uqiD&6QlI99tr`aI^`30<3/,nTNM(FCjM/m6iJ4Bt!"(^q<Nu0bL*l6VEN&b!5k;cu`K1b-"%lncYc3g_L@D2T?#dE8]\r%'U>:*51Z;?cOAdY8coHNGY6f%_2AG<02;9br$6ETQq.;4po'`ae1RYnY+NdkW-/A0Q-JgQHlQ&&k\,uRTnUsJGp'IY'f?3hT&c"o\r%8YpEa6;'bPUIB7(<LBW&A.`=\ql,.skV4m07Z41V]Oa5(Uccjp46=s'l7'rD)>/SqVrf>%T.opPW3XcGQm1g`TEPYUi0t[WW#(9W\r%)cht(POB$W#2()p^u2"J-/ThdQc-9RUloE7X45rJcO?_`6_4geSK3SFqDi*R$Y%U.3s9p<((G\jI##pO:p]4E'^MOsF3!\YH"K%d\r%*D2)7q"XeTIluOiFqggjW#4);'dSkhYrPQ8_5LXpM?u+AC=IB<n5J]_%F^k:]0ulQYNlruo::Y!Im25/2t?Kl"[(f92p5Y9R0kN6\r%fK=#TjF]YPE'?=SG,\%1;aO*XiS,T+Q7&E%,"uN!M-WlpfGIrCAQSbBp>T]#1*QX1Zn/+cm"jY18I'-Nej)W2JC#4!eC0GYjFWsX\r%LIKa(/qM4IeN-RH1P0pB)eFaQpf"%,Tt'MI_dg"./.*\tUm!&jQl&bn,oCo*0X;pe-tUn,hF`#<oJ`NA"s[AU.MI-T'[BsT<f`ka\r%oKCm4n9T\F2r=be'I$IQ%POL>BS+L3^hBMG$hh9,bf>SZ0LTMc:DJ0YUo<*JV]AYjn=JtQfkCB?I.Y?+GB1&IYm*"mR[C58T8o`=\r%A`\M1pIq#ia]U\M1)XIQpCbN3%/DmVq"WVIeO59s1Vo`;9KRO$`UjE?GbhF91SGiR!*$0Z@!<UTi/Fd+KPuTDPS63Vk^g^+P.Dl[\r%R9<UK$'i>QBd'BF9].-eTlO4.-k,sMC$^]`2V*`lcNI/m-5>UKa<YiFKG$;tDcrC8+stt/SFNq43b#rg@@"L"/N'Jon/5[Kf'a$N\r%DjWpd`,PoL!<iV.Qr(#OR7WpQ@_rbG7'N#)M;sI"?]fhb@R=SuFdAo-Qr#j36n2)5,UW#Cig:LIM$`)PSMW8Sj]5(EYuXPCAiNL>\r%0jFmNBOa?LG9dJk/g`7Y-PL(ac;]T+HmDi.&kN5h035&&,cZu-7.a_H<<=Aa3-QWh=$UFm0qruL(?@h?3G8-\NfJ4cO2hL3LCPaR\r%FDr0C)BQ8U6oq,8dRg3)3mn&X_kcT>Z8<m4m)<;j\?b(SMM;74Y1$(TU&htO:`c?YMF7P1;Q_h?MM=*N4!LF$.jc20==Y:P1Rr&[\r%k:#3B#r\)Y2^6\QBZNTsTm`IMaT*Yn-cnd9b(^<U6`jk[ap'cT8dEZF;^EM`STcglO)j;K,2ifZU=,'PYd8DJcgL%R#lB:&1jeY&\r%,%=(k8%4OBf&Om[RYkt!#KCVS?qd:PR:hg80uPOqo7R>ur7#bA@*.&od:XTVd:,P`M6LZR3#0oIM)n4u=X!!sb#Mp5Mm>IOGKDV(\r%O.F5s;b;NYG7r#QG.eP_<O*iR0oX`YXs:sP6`qZZf=R%[YO>W7C1u3\_'paBMg4/-5'aLnWn2:#OccakkS>:9-n,`<BV&Tq0;kP*\r%%]`qag4'EuQGuM42H!6(XR;fW7Wse@E*Xa3:7e6XY8Z-f:,#]*O\SiV22[5<#ZsTR-_+&o1]sGH:]Mt)igj=_+H01<?X:07>f,,!\r%GasHPd>E:756R9RaW.]XTLPJC':(pE[d0JmWg6_;q?n3f<+KA!dN"nc@E@G-1?p$\<_*"no5#/XR?gFM=d5:5@ifcW`r()Qpl^Xu\r%)[`I-Y*"UBV^icl.@Iu@kg\E0pnCJ;4l;ff(jpBepHs?_bDT7mrY1Y:r\9QEGu^0@c]L_*`5SIZ)O;<@3H/l,`9q\[$qD0?0RF:!\r%%K7?]42Q'3^QX$Sr%T[1pntp,%?:UAMDtgZ"&H;q(mZ*>3BVLRB!!<QYbTEj%SN?6:55CP;%5K8;cn:d^-0BVpt1arH*0BVH3)P3\r%p81_98Ma%l_7]amVs8b6-`m<fHGbWojjYOWo/0+a;H5OJWGI<`?3$c`#!iN69uN8@I`.'ti^g(+A`WtSMdbpNQ9'aAVco9Z-TRQD\r%;YI!m2Y>"1d/%/(gF*j<XgC46gj!;X+NBV(o0W35`fmrkG&8TEX$V*o`fk%e;pBG+!Mq8F9Fr?sd^#I>g`T&qZ9]Df0bPef%ALIF\r%O`GZ%8o*uSG'D"`_l<'#P@X=-4S,3I7k1Kd6&Z^mK+&:oH%aiTRCd"Hh4Q#d.1+ke+O:Io\j<?!5t;$ihVgIZ%2&Yq]DoncY'EKZ\r%Df/l$Jil[Xh7P^?AFV0s\X,:!?JM/HQr]#c$d)<u0.ouJ%]\;_'\1&jb*@6K)q@PZC*?KuMrS;a<6I)8.7U`+n8Rb_)k4a7-W/se\r%`T]pMN\l=>.1'e+,N4/Vb(E06@'(&#092*q_HOY[VCJ[$ki,b-"L+!6?quhZ>0;c0Zh$Es];H=nZ;8P3Zf_gdq2gQThjS(>ZjK7"\r%dB4+(^9!^KM".!-jWq8hU6Q#NE\DE;0qgc,DeifK7pm!t3ZoaqEj3S?':5.'.?T5t=f,\2.08e1FQP>-_8f_.iL/X]e)H,6`D*_C\r%Y\0Vb.T]/3%Ek#2;iM5LP),BDK`o6pkJBrOj$Tr-n6A1P1.%aW?6tGMA;#sUfnj:;>*0D5G/j4N4ZV+IT$W"(g<l3)[`$1<;`18-\r%(_5[fM2]e*m2un<,9mKP3DUYBc\P77fZUtHZ&:8*_ZgVs,@h^817>^?63FR]j@MO([?pARZ7*t-63;C\>ZBZ:+lSB^KS48udkiB)\r%/[<\a6KX\.=%_[%/ffPm+sl`@UdPTO9*p7Vc>t:;0u:k51#\O.Wl,#aMe`l9Y*b;i#*VTeP=!N+kDZ%hdh*8e$2J9.gd/otB^NPQ\r%HqD3`r?m^?fNgC4\Plq3$/iAV0k*Nt&FALbin..<S4L]qbTm:i-BcT<&mAn?7mqZ\U]`kZ=UJ]9KU*6]6VU,@TiO^/-9+^m@^rag\r%U4(!_?E>rl^d]]>/25;F7S"emkTj%3=%H`5L!"N"$4/WA$45#];^E[p4]B=;R>od*f7Iiig(=s@G),J>HTFL14s;#mSpRu/.(u.<\r%Smi',=m1W<K7n\o3"ejRBMN]69Y-@Y4H_&ac&)Aj:2mdqTAa+15ho[:<Ku=GrSc6;qZHF9SKq"d%4^e?@V:=D)ARO]CbL/lS8NHG\r%:LUA>"^bXeC:W)h)J"U;JsAgBc.t#?K!li[+f182,]9"!2oFm/6c6g)JT_=rh</0[\N@a.6$=Z:Z/]Vqh&S7p8Sd2pVOp;fY'i[/\r%),BoF'#X%sa..GMhDYH%CC=t0UgHt7!])b`cRMO,Y7`'8bJITR-&ubYUjo\lRSG*H]fLkXO_?_uknF:Ri/'^gLm2q^NC7?SEQ?94\r%51Z/ASf(;Nh!fG)#\e0e>'(s`B/+HP__SA_F3Ll;hH5.NK3usL%7GQd,?o5(bRHJ]RN%h)VTR]8'UTQ&c6tJ-;?;*JLt\i^A@$=Z\r%K&+m12s_4KdHnD62)fUahjZO'O\?HFC(O74_RGR$[>lLj2c6`g6'XDum4smD]b?ng/8^SMc-q<AV<UYc'q*/$+A(?nFC7p"5t1)p\r%R`6u2.J84r(OM#4l=P:J*_S(mI:,s6*&Iho*Ko\Bgkog-<&jdi2+k1o5$`eRCF_n0cS,TZO;MF<mhr).R1^N7+?q0SCMBb7*)WH`\r%MnMN%p$YKi';%X97?UL8(ap+3]8RbM@M0R<,[;r,@2<Wnc\S"NMCJhS4fE6W8V#V?j$Gt'R[Q-,`PAYFl;M868R&&]1>FnrUFBgu\r%)KfNeo"`$b/G_mn\-`X-906^%.a:B7$j[nKUY5iHRHgMn)Ef@g75cd;%ar:?4Vs`bJfG:32,1BI3N)rIdGS(ni5ZFY_BK%FTM4<0\r%8Nl/UKh#%6e=(RP$5]7Z\O@Dh;lY.k8`GtoNBh&2MN)P/Bi:$)Oub?Y4K,aNpjSXNHud(E/W&Gn@ll]9rh2j<\YIGEM_D_QnSk`h\r%ee4OY'*BG5:?orV]<N`>edCc^XqDCNX^j)TbRBChZm.dQQ&/[&K:c>2^^Z[OBS#V;h%h5W!Z#`OV.drd.ZO!IRi9\9'7pTTU_O>a\r%N`EuoUMqY$fK^r+4BJ/LCe3;TkRm=N*GMOrQuE%h#5BTTWD8@j^dh;-6*.B/!HC5TTI.cS33]Y]3-]&&-K-'YQPpnpG/T#h0XjZo\r%8Ls@_c-D\?^F/4@jV-eEBM7_;,>P8V-BjJ:VS9Gn-9*l92$*<b;oge:b_b=3R[Xrl_h)hll'MsplVH-*BG+ViZV#.\JS'PVg59>F\r%/:iKc=L_gB$'7ACiYoXlap"r=_+u(U%&]k71kES!Jf^;XRh`h[^f,J&C]0d7*2Y)U'*=W0Jf(G<U.%`eo9!&dqlW.X1TfK?.A7DT\r%J>RBb*(sBc8^WN3&]M#6Lk@aO30pQ&h2Wbh6^](b]md!BY`<4G#j03:Cr'1<R'e&lmHe)`Z?nWQfK:=Or:&+"3_U#.BY2LZRN,qh\r%+ECR]>C0Y>_fQ]9P=c=c>]t4Re`<stqU5U&B]=O%\%#PF"^K!!lmMF>#`L\f;T'bCK,?.qQOH+2s5?Sm)#fbX_J,Zb=t&U)ROJC-\r%5[(;r6lFUD@ecnnlA-'K9A980^!EWg2B+),d[V@>hm/#,pSOuC<?VuRI`@e<,%.CDWAN4cp>.oW0!a+MC#?qUf^mtg#OHn-s,=>^\r%(EWmMjht7CBgMe#cJEMT\Mne(7(!3EJOu5:.GGd9oV+<g2\B^QX#A^KNC0bTL/G"*A2DpCLO7'.e[GaR4jJdB04VJgkI%4+COj%X\r%8r;9Q37MDQ:i/g?$P%K<2J87m:"GF29oP(UWeIfa_eF:01:H9*f%:k@"iks_+_t;7%iK$JpVgIYcIhaB;meJGJ]^FnWN!oN$5imc\r%NfZ:&!]!4!Muu[DP:h7$M6\P75@d&C+0E18)"o[Qg8NhIJu.[n&7tX]&@#(l&gn1ZRC4P2_rI^GN(=tN5mVXu,!7W<nPKDLC1Pq?\r%q.[b>[bMi\WS<VRT_/Y"jde@c^kAqp=d0b)8O\o#,F)#Y-S),'=_uH7P7B#4RCrto7#Du0[ZJN),!/@c!:&[uY'5W"_NP./25u,C\r%,ok:-d&9Se#^R_5%^C_h2W/qP3g$#)=.%pO'BrcTHQ,e$ltiGU9!(]ZnR?%\Hi8%<DA;Dse-.\@Np-9!E*h!5"&fs)O:ePRI+n@]\r%K&AC0AYMTp/>"=K*`hoGBO*fN@Y1'!fGNA/8X6p;C51u)lP0KH)Mf[+m#Y$M6Hl+H@U$dLe$DOg:I0h'Ns+>bKN"0t&ag^nZ$_Tp\r%1Rod!BfnN>G3g=T>U0T6R..OX^\.ppgko>mC6qj*"["\*aNi_AZ5Eu`;?9SAM.BL,]>M[!iXQ\\L7^_b8/Mc75k*pAhaF;YEN7Qk\r%KE;/WL9p5>%BOXHh$!*><`t9-Ik^n3L>s-(NNbT$Ed^4\*aIUE@ftjE0QA(JT1WRZ'/cq6K!L_KmNpT1pW;gP3,u9l$ZjP]#1U`k\r%W;\>9Fe95IUQdH_q$__PSY9I9B"OTPA.KMe?2'8"g2hR8RW:T_!@JXCqJia1W)b6L)skY+-CB:JU;]`R>X"IH7J"/]/S>@MabB=0\r%PpX7JP[a_2rdU6Gk9Z7iN]fVbnVOIi6D2aL0lp'dP\L_@K^hp+`%EFS3C5)&^')():ULiU1]jm$SfHAc2fO#oY2Q(1&R8TSK@(g_\r%5fDWu`RGlq1'5iP$R-ItT8f["T]T2Dbn0)8S2B;c@nAZ,f.m.7h>[gf2H%KUk^_A2cn);t>u&pIg<&p(S<@Uk5F'Kt5P*@dgQ&p>\r%A+4l:K8q97`2V-F1(TAJV8+ucoDrI,EeKb8H9\g6OmWb+,monC(kW,Gi!m'qVNN7H85_9nnrS'S9pbqK(`<^Im[1iHdIF*llP2ac\r%J9Sq.(W%A2e/Pchnr+R\FkD:TUK(&-DQk&]a%^WdUSqq[i#;b+!WA95;'_)&hCs`6-W.7.Uk:poFMe4qU)9Gc$H*,7W=F/CWJRqo\r%j%[s29bYnNn7T6S(k\!GTYYN5(Y(aC(;S,S<6:>V)G6X)JA4sS.bkIJ.'>#$BdDYK&lT%$-3]]g68LM/\u*sc(m?*W(b.6]::qeW\r%D5CrDOX7qCaEPSk>TeD,#5?Q1S.]e]"HtU&hZ-GKn6#t-UXb&hO!Yl+_ELeqq(<L7VnaP2FUfq*W".:ZB(/aP%"HScSbY0b5=crg\r%k@+9!NWt@/+cj8HM5-Q=(X:-Ea0]8%QIP+5N)ErFe0VNgb4!tB.r$im9=6RGL8:]-'n19O212G+^#gn;CA_,=1p.."'q7rW/I6*V\r%+eG3'2*m3Uc?V$H&C`2I,b$ou$#1%/3?!]*#\l2kdO;7+C=JDT\i(fkl8a,:F\Pbdr/P>0;Yqmh2&L#r13m/'@uYLCFAXP[Xh]+@\r%<Etm?_#CQP:^`Fi+ef-`Zu[O9KEb-,Nhh]qWoDW&C,ieq6mX#,+"O>NVuqED\rp6+WsV\Crfj5@XP=.FcH;OlA5&JL4"o.0d#Op)\r%DX2fAR\XPjI1P"1;L9n7VGgC9%+2th/#Z+8/#O[qCZJoD"L<er0Ag]RBKiNIaWMi$n7%B6cC/%.87=E,dIZ_aPZ0U/Y5g,p@Hg;j\r%/0'#!J]T&'/J`t=e3HcHGVIs)B?ElF&TsrqpJ@laQr.($mPR0NE2;I)6ru-fMILhNF<omA;)X_#76NG#M,RAhN(oM1a./lgBGY1E\r%9'-hq7-=JZfDDQ-3CQ@XZq&IK[1#bmjZ4h'QC1M_Lh4FZo821pbU)Pbrh&6`-.(g3Nb]\57,1iU)$nHF[T$imZPi[?a!42-;Cf*d\r%nsT_e&KR&N^+i=?6fZ6*>Z&O!J:54N;^>E>!]$m7D%+m^pi][6Og>3tl=h*NBQ1tY%F4?J$&fZ;9\t@%XDp]El-qG<AL7kp:3ZjX\r%D?uCFD)''2#,<8=LL^bsYXTuel:?p9N2jQ:A:WSBYXUjZ:3GP7^hCH4NN-2:J2Nd/+K0&[0X0J18m*.M%:G1Pp0<L1[=D6[b(#S^\r%@0(0)A0rml>JPKU+q>RE!nOlGVQ0s2J/)al3EFQ42h3cWQ7*Q;CB.j/i.Th)"uh&iL;#F:CBcJA&Lp(be=SFF\ZfPEgr_^uadE^I\r%/=R#/0=ARjCY="i[:i6MX\sD[DK[3RGNN^Jah3fCEWUu.o/X%,_Qd:LH*"8K"?#!:S&ZLB5q4'go*BIX'qWt&C`X<b=a3t!T2up>\r%AE-f%cK@'T`]UF"3L'f&.l%H"BK!$tS^"O]k$ur(`j6SRc"fp)_Vuntc,7#U(S91(CgLWKF5pD7>X"8s*ZCWnCT0C`ENF15%i,XK\r%U"`uHE&9l4dB^dS;e_n!>@@%@$bd"p.V&'a@KQ:RL<]TQFt]?Q_pTK;lr1dbAVLcDFL\hEO"fnR`7I@4H3r@bPN9/bqRj[c7.T%:\r%BCruW&;)U=l157_o]^u;cKIQ20:MPp$9a[W$];-C=6P2?^amKp64]AU9^]gfqE/`-P`kDnUIWXpV#$`"oQffb7;[T9USl[p`h=2T\r%T>u?A6jf:0@j,H!4M%6:GtE.iREOe?g`*Nl>LDX(4"&rOcKO6N_Io%1<qL\8d$8_K4>>1bdHJoTo0%tX6cY-manM/)+bNq22tblI\r%24p?o\6"hNoXTs4B6Hm22\sQAHcSNVI(RS#Pp<4j`%aV^;<[F\_M?JS0U0Q-`eLeoiX?6,@H5Qubcst[K'DB=ESsA'4;Wn-\4V72\r%9`M;l6tZ6^OfZ[!5Gko?P$iCL*q0Gs:9j.%=Yu$:=X&q"f^&K8*Wc*n_2/<L`OS[-?4#84@Otj/C)N:V<AoK%b'i1p3"_p,aCJ%$\r%k/XD1X,PHGOQ>$TUFgU^<iJQ(TC*KjND\RL_m(_$[M$eB=f?eBXVd9?90M?8Krm[,cTc9Z,'nW8OaooV&fG7d-sbC\R)`9-]thYI\r%U!BTkaYuS+a<ECV,=Rc]Kq>::D]2]iY4t'F=;H5VbRitmRgAMVd9L$sq['%.$0Wc],O`$49GK2R=,F1aO_cmdN7>!l1br@@]&!bm\r%r%b=GbH+lLk,cWQGG=4kQB][<(,`R2H.^n._`oVgc39,cRr]``j5uZM,NO"P5P7u*M.3^LKVHmS<_9+7N\_bGkY`VR:+T/J>=o%e\r%=B'\Q0.#%K;+r-H?:bjK*Y]d]d$7"<_n67@o2;;"*=`3T)n_C@oFELF`c*@[-&U*L@Ud]898VS]W85(>7#5__7%cm`''U5R@haLV\r%Psd>nB::Zed$7"<a/k(^o1G_o70heRLTVoN1&3TqgoVhg's%[+LTVnS4/QQhRT1!>ke]1Xkg5S_3^K*sM*SC>U);aG]JtD:P/pMZ\r%/M$!rJ7[i.b*f]/_,"pIP0!5KrWfW0.aI87LMU_)9Qtq@PGl^)@mr.ol>XYHo&"Cjd6eo&WT.d=4'@$<*2PUAph,Sg%<Lg=`UQ$4\r%Wg7DRL4g9;*9fi"6j$V[,a3@MUVJ+bLC"ePe+P++!Au@b-;i0u*VM'N)"_i^f6;X^YU&N*QR`^GBPO3,Kc1,HV3f6&OBfX\$7s4)\r%PKD2Ec>X,Vi:+H='=<2;)9RZ'B<E>E4Y'D_JpROc%@(pi+8)5Y@-p<=U8#WH]njt^9[`ea>#g^]JpPM;ZE,_^C6k\"aHW=>B?2=M\r%!>A89e3GZ2AQdm,]VfGuJOV')HV^WhJ`=:Pb7g6c2$D1I0Q]lLjA_P!#*fa51-D'V_K()TT)g+q$X%5Ddo4VD-sP1$Ounre+Zg"a\r%09/uQ%V7i#hWq)9RN[U:ren/Db>.W,"6uk+I+ah,^"2n'5BTYU(EKg1+f<D:G0JmBY-K<q*A]\o[rGA91Q5h`Noc9=cOBh%`sd.,\r%.[W-Cjq0=L@$68>c!)[Lg[,DulDZaT;YY&7Gi*MbUt>sje9;+@b[=L;5q31bbbVO`r3tUO8MdaN1=n5_mp%\#%.BQTZQ/ZQ0f-@M\r%#2>f//<AP)bbU'MN+iZ[@jY1^]XZ&t$1+$N;$LWHm^d"./PKVC$a,m+/:gJ_Z0RiMF^gM0>&__s;.e6l*7mjk.Pp`<#k",&KE>bL\r%B!,bn"^N9-KdOW!1Ds4*B2Qo0K<6,&;eZm"1R$dANaY/m1BSC+]Xdr-NgV`E"=c!.<fV#K$>22*jd+&W[[k61D94NmGo6R6P@MW(\r%O@S/_Cg&gd;(nfg0uG7dMs`Amc(b)?IbQhGQcWS!BiMTF8^11CRA:=a&o/dN98R533d=85-)c)Y//-OL1LdJZjr(Et:^>=&[=Xi[\r%`%jV!4=/QNC7Z'],^&U@==^@r8h?1U_,FgFUuj,2<`4]JM7&M8Vo1>^*BYX68SXP(CF+,uPZT93=\`cZWW,L]//)'CPr"!3=?.1M\r%Q>(D[kG:pZksGYNPfIbQat&0!.?7pXC`_>a,\cOE11OC-.<QS+??!fXE0iP350]%Hh#a4pJD9$QlEY^13CuXY:gS*.[/89TM-HFB\r%h5B"Xo$SDMDkp74Or<n-@h#l_k%!c#<i^2W0.Sh=;;o&J##@p]+QN#q,`<GJiRp?K-IktqO?%sJ'Nf_@ffT<,a;U:EL-7FC5g]Y&\r%LC[\K8+3[-i1gJ0hB1_JI[/a4V>G6("tKM7nG-&#B:;=JaGM6ocW&<N$Eqe!_F_og4`E[Xn[>.;.qRN9%\lh8ONC3N.D/!Ni''_3\r%_lUY`&N2pl6_Du7Or4"8(k%Rdk2pOEo9q_u`\+%,E.s+IhDdKi:Le+/1(L4[k&hs.Ji!6[#"BZcCRO.WR*R$?UJDQN8PR&YfB4B_\r%eP&PJE(42X13M.C#Y[**#n>5D;uFoM*#Vi@KdoF!In$(!e_D+TB)63:5)Z'ScPnOXnD(J7H#lILMR01&DZ:R")bZ$nqoD[0pm,"7\r%:L%(MLh!;Mq>)"(Q4apnP5%6?=^u6b;PMh'%'4Nn[-B'*/8m9k0`"tK5).@QJ@?t\.ncjM.49[FC-j1*^uK[nfYgYPBk,'$g(XeL\r%$r`>LJ?lqfND0gZ\u1Ms,P$RHp3JrGbT$jF]K3FACr;b%1i6`4$at:!)dDmPgXt/`]T%n`L4<*]6S(#h)]La_Si/Kcb.AYG)>r"5\r%aDlb-H.poh,&XNBNKg"m2R,g,CL\TcVi;/@Z+W%R;Y@K'M+--))]Pb=D/A-jXgPErb1"?W(0Q!$Co$K9@fnZ+YDnOkSi/J]/8\U.\r%Cp8Z/Vi=E0]g1=e@mc7=lYUHI)7A)97OF]b2K6]$g;ZT3:E(649:e%"N9W*6j_JAdR5_(@ja.jEK+g5Yk95o!&)#I\RVigH/lA_o\r%bpBbTK,sc)],YdXm%p:?NWYKpbU:OYFmq:I<`3.g-l:CLgXoUoc!6uJ:^:oK;[I4$&`nU*GT.SPW0p;C$gQYeCojFE/l=7#K=A+b\r%,W51LE_.:aNK'4QbU(CXFm(_A<`1`?.$rH"gXn2OD1/-P;MT1#_^)Y_M)%[$8(uTL@DuApk%S>cLdB%fQ*61,BAR?ZIDNduA`XK`\r%o2<@N(l5'YN'7DW@#tXGUR0UQV5sn3biaQ58WgNnCiI;I<;X&=k;1N-<=RarjA"0-,WqiWe!QNV-H>6U)+R)3i:m?a#A0(Ji#Q6C\r%iF`6](nT.<8HEPE3B\@I:(k#;mhi)24r37WZ2si(*CWeX_&5CFou/XsXYE9uF_4m./MMJShmlE0F+c@G=;DY3i>FdfcUX,!nbF#(\r%O3[_9N,Kf'h92YlEV.XYp*ntl0NXYSan9p=_TF!c"R#@XoAg1NKIc\^5>sD\#gMQ:-H_`'),-[CoGIa.&tI8Ub`ahW1:TX]]XI%R\r%'qESX9U%&rA2&]Y:7F(714o+C!GeY@UVp$n@4h)F8OdAW0/-8+BTg1gHA1JPU5b]))#Jqs#,?ieoGSml81+_Hd:8nUQFf`3E'm$*\r%b1]BiL-)8D/<V`6!N&PAOV(opa"Q8E:GGTt@ROi);[U3.F`6K5nZ2IlPFrrJ)t,WJ\S]Ua`^bC:=]<qAV\XS>?#MXCJaK5W;K0(W\r%C-ft\[>-_RP!]kr04h2o077V=?V7adK5k8X#W&mrB7Vs#qA@&(ZYFeP<7F91AXF5fG)[pNPeC$["#`M$L8#sua_#4<fBgU?nSI_T\r%3>"BDNF:Ot?/^OP97.7/oGti]ek*jB_4aWE7t%);;Y2KY#%NM8bZVb=e4_U^+fF>!TIQhu<$\akO^G:K8/P9IA>s!`ULI#XhVP1H\r%B/apE%gZoGpK.-.>MWZ^B7BBH35eAuU':9n#rF:JGTP"eM)1D&r.FrTL#%ZI7$H&X92_i),N^>f.RlQLb"^t*QjjA##Xg2Y$qo<$\r%\/J!N9Lc$&$+.PrcdChtF-gKV?!M3&'Z"o=9MNhuF),'9.Z&m]j$REumZ-@H=NoFhf'`io9L\U"8DA1TEKF<uE$:B>DUP94`\:l0\r%1"[j2V3Arc)n<9#lMHa0=flLJ<nR(m?S%3($R_8;@OJ6X)t,?%34:L8N2?f@NT;`pc<,S\l._O=Ck.<MEjdW[=R?LI+<)Dt?1,)d\r%lc8`G`Jb+k\-%q0)680o1qPCNYujFQ@C=g.k:Fg)g:lK$(;TfpUj^("`qi>(e\4/K$hgiN,3KA.=5q`^(epMD`^Tn_c4EX;b7O&3\r%bNEh6PRJ&(\@9Wn1!G<U<bFm5XDZ;q9:F$9fgu+&`JhM!4]P]k@u5SO(q&':b7iQdQTW[KRYlg(JJG4q>@VApCH/`W)EVH:i0Gh_\r%Xg(Q^NT@9FcIhaBe$h3#61D!be7rbM>I5neYslAaQA`#!'t:MR_e<k%*,;a?CrU5+/RRRCA,2iTd_90NA'\pde^h+E(c?I.PV-<2\r%,.3)6Hk@#QL#l%I(Ftrl(YQlegX1rc[ooKbXW=jKPqkprc@h!JSKs^W<]#R`nr`WWWYp0?HE-\jjbeFq*+H0-'iX2:>qe]k?V2*R\r%#F;HOmgH$nqdPD*?gNHrC0*OFfp@RDnr`WOm#:V(T"]WPGQZh>LKNn9`=^dDQQ4E+Q\p:_JP!8.e\4#MEaKZg>"(>X[Fu?_FS;P?\r%M!i@T?0mOCQ_(4*naJp6<>%[38fhnd?Fa0R1ZQs<R:kEg*in:E2Z)iF);"12MPh5&k1@=qs)plM3XsSOaR"q$.>O!#8Y0/GTgLB3\r%1T%(nOB/?3B6O2j\nj4j(72gpkd]JrW1"m>l`C`&Pl<\OKU#YeT'Mj06-1=<mD)+@dZR]nVFO'r6nB9[8PY]d6a%!%\@3\m-%V"j\r%`u+sf]p$>=cXgo]F(?gDaks@jZ1kr0MJ9Ref%D!3XnJWTZ@'V!.I1kG.2;Tn;L%c7Yr'0PS6BfiSZuAf9$B>#;i+X@P.tHdA'\pd\r%hptaNa4VA#XgY)>Zu!]S60i>],o?BmUftiSCD`%JNC,95P0I)\GU7'pXf3SJ44:iP3FgBN:Y"#i-u(n"\r`XeejXjK;;7oDK;W#5\r%">N>@GD_t,rE1BrrCJOUTuqQ=fRKCe21ZMD7hO6;/8`BbT`K^H"Pb9!*'[,&`#]cXG.N4nOI-(t63:BtQ()0G^iFr<hHiU,WC%@D\r%cT36uhLs7],><Fmpm*WY7Q8PLKPU@Dd:!+5:n'dVJMe3r08=Zb'(dD"!YA=i,slJok\6o4KLDn(bk@kplCqRma<Q>M)"*E(M9%+l\r%bZt4D^a#50:Os5deD;b7*Ml&IOePD#_]-J;-,!`a4"7$6"MA)HeD<`iNOhkDPXT@#/F&#m-Lb\"/s:m#.YTRM?b0ZN1cl7_*Z4`B\r%J@:kEWsKXY%G^0-n/R\>+@*(VBcJ`qd>,XaFAcZ%iKm(QPJp*K>q.@>QW*DcA6@C:jYQ\2CkgdlV6PP*0P<dN90ZsKUlZ@)UZbfX\r%;S*E='UaATB*LTNc@F7=Rltg+;(n^MW5XX?:Y*N&ia17,'RI]G*7Zg@Hp<mj[W1;+@poaP&LRK#(a2En3;<RNV$)V[+qSh[.r(DL\r%6#;)]/C<*^1\dqcL4.2ZCA<m;j^\MjSfg9;q7)s8.B)Z%@f!$t#-`IZ5Ln&`hs=J@5VE1ROML-Ne0+SWBrn@,D#I(J=d%:&l)cKM\r%CpKEGP8UpE`as52U60=gLM)>j6!obBNf:afM"$**1qjpkCu`j-g>u9O-e6>B-L_Z$ohEe76ol;@V9*PKFQmO`.)9SNAL-YEa!QKS\r%(+o\4!c*]eKIM/V:2)T<=CBc(C?j;XL49j4$J=t&.Ma+5?k/T&FE0Y(+_AGe]+,SJ1C:Jm/O21EQY<QU>1/%B7Z.A4eZ(-[*,9a*\r%qFTYlYSWs<ej`jn+$KI/nhm88U3p=[J0Kt6^]8G">:QYb/YLeY`Fj(4^dhqe2p(h0=m1fOOgNYbc`A?q19c\4MM^ZRFXW)1<&4j/\r%*E5k#Peo^5ZjR4l.?/heTEauN9*E4/$+,`f%Q2Z:%KlR=nZ8#*.7,nUfS3)maAmnfNdKh:+)Bu<B8.jtX"#=.I8-kRb=^S8="T\o\r%:cj5p33HL\69<1U3ZKBHiPA>7auZOT=$^hdZ1btuX3T?iY52c*-co@'`CZ3)c/`U\ac>SIX,Ld^.%A"Fm$4V3-J7t3<CZ)5;Lr9)\r%&TtY,WI4=t^<u)?R`mR!d$Y#KSJ,Tu^&`hP+?C1?#DA"uiOg@Ra0^BsLLY%;q=0IN?BV5'0J=mGE#qW>k9uFJ9r,?fED=#SC_B.X\r%XeG>GS?E7eQl6r!\0IM=6lD^\jp">7Fui?/3#<m2,$Ek(b65aK,j9sg?BUCS46o9Xn\*k08HJjPSW;1ij<Jn@:1lRb7Uh.bUB!TL\r%`7j_R-mmG5psugg]-GXF&d;Q>!\'j$V=)IffFUML9R\VuVHP%dl`234.5H?a%8=h7T9_L2']nBhc/F9bkk0Wk,"`G!WYV-V.i+CH\r%MD/jtIU?sAX\a3ePTp#@;'A>($+qFT'[`WV:In\AgOu>+1nSg,6sLqg4(?')\O<ACn.P-]Fa%L4"^uXkf)VtenO5"<OfU7u2A-\.\r%ef8/Ie41M17e4)u-a]"j2sQsP7Uf#&D'ZP"")Xi=^^YU+U^VKIer#FicQtWXAg<GHQqa]BUnZ@K,Cp`jZ&tQ]Q&Xjo@9RIm6tWUV\r%8>,6pCa;L3k"mpdQT2.-PRVgf2#4(?6!nPB,:Vl`OUs%=f1+b0Xc;D0i?)VUagBYh;A_deZ&q#2aZ2G6Qe5dm.7><FZ&q#rZ'"NS\r%la;ilp!;A`$?]KG4kZ3^KQ%`u]WbK>gIM\EF\u6lQ&VRn.3LJ`95#89iOWWT`DYA[$A7tSdqK>0,:T-;Od*joD'XfiF$V-GE"`No\r%9kg#8'1idT;.6__[ZN6K/i"3#[?2.)(F?q/s+IhC,W[^hMl!_A'I">BQ/lf78=2j]$VK0TCa=^,Ht4doi&25%.C-0[.N:r&E`$"B\r%/>6o+@e=39=;+7LE)@T$=W8]NN)@?bHqS6".9oK,amgIXOUT,B8PMqke';N!:08t^$$HM;22mq[*5(>hbbRiP1,Fd/;eG02.Ea7d\r%.o:Z4EQt;$1rPq31Uc!\LG'N$PO(==16WEHM"R-,T[gM`-HXbI-DA:9`F]_aD5N1/$SsRFope.(X/.Ua&g(o6,gQnJ@OC=Z;-7DS\r%:'+_)P=:jaaR(6GjX-+\_+u(5RP`g5e)W%OKSV"_P^pGhYZE6^P@?'V2V;*T:9l+HQ.0mJ5KZID3Ts48k'@:J(1=tB\fO15AR^\E\r%i2?:;8aln7qPeMen6o;:9EM'''2*q[Atp7:'[.it%LUNA2j4e/NY&$j0U"=AfL69)1QrMD7hO,u"?2N0dHel4P),NoUs^_;4h-o5\r%eUGLqcHRU<mi.`_[bu=l`^3<"n7Qp-Jh7/:X4skB1o:m!IQt<*'UA(i2j*#fTMeU;">c204%lRL/A-h8_2-BW.Zgk]&jjuZ*NM(l\r%,b7=,G!@pJ1b>IoE)FNB8/a^5X]*h@17_TZdY<aWiF@ZV>#])YC%rNq)9Y6R,8kBgepM1dA*^cS-7kDi"?V7.)T5+._fJOI_a^r[\r%O;gblSoQ'48QfX90mW&\Nh(1QWEu(<9H'V9DA"a^/K-F/fKp"RP7Tu<8rNgim3GZs8Y$6--g;UX.BW55@jo;WK27#XI>`j."E9!d\r%Vj:V=-.]`j"@5kZP/.G]=F)HHUN]!i9f-Sf?'4!i&CFm5o78>m)GsO/R)<FbBQS%$g/<X@lZQl.B`lE5gm[`>.p?r]-qZ:>UjX+B\r%A'\pd<O"/mWJXUcU2eN137MDQ;JlEY=$/&ad+l=N,%X(Jk9K#m;Uk,o6`]p8;6,sm1KH#dpGS]S^,PhOe67]iZu9Gem!8'agDd6T\r%P@heehDj"oDh+\n@(9M49GXJ*cJE)Co4's^<@_5>NC0c?L/G":A2@7:NqZ!S=Ee]Q.<V*18!\('BC'p4WS3h\pfa1V@)l3.e2_#r\r%Q2c]a)1b7kif#[Z,aU<mJJGr;#pl)ULK<3ajbuI$-B-6/n.VNlF3[n9>gCD[nlIATm!7utg>Nr_jBKO#e^djJBNNu07_UgIO0Of^\r%^U&:)BP_T,C9`q<`bNIEBB4DL3?oKbhm&]VkImd3D_-\%Hc)f4hH8':=57gc^,M@=Z&od9Z[9T'Ci:;.Z'&qCC;hc;jEkAsUGL?4\r%@l\&FHV`2K[)*[qQL'N#\ssA33C4Q:cA2pA,W8B'S?X7uS<4=5q&N0XH:W-jLG>e;iGh87`gJM8/YX(lXCr)Rj<O'(fGT%mHE&mU\r%AW4p[37MDM.`TOF]OHiFel6IEO"AtTh&;&JD%37@$cs`s(;/XbcIPsBOcQk&@qY.RmHNAoMEa()j%tZ9WV@ZAn;8k[>>oMr5#PB2\r%=`03dWj[XZX+b't<XW6=7;$Bc[ci`&?cLCDo@d-N23X^X[9_3eGM32>+!gjhTkP6.b9Z8KLaYcALaq\`6e0g"8Vkhb+Jd&u:/D"u\r%4B$@['bS+\`=&;E7`n-fb+T[45S1-%n+tu3K2#Tm_gRuui<lk-Wt;5e7FVp:#tn9`8Ok8qM+5!rb#BE_6P5n6-$TdCp!XNZa2TNi\r%Uh8*X<Wl9=W2MK?7'Mr8g>u9S'lemZT>=<71Gh`B*[T.HBp(,-,EpWh!7\6cE%E7)QU/).k,O,,kH2a9fUGU6)RZ*o*u2SOYW5KO\r%@L.J#\5lJ(O\':I>#MsB2$`*)e#DFbpo/E@>71aE6:Cdmb=dj8C3`BN$^kUpE(4mu+5Hp,^uK+#,)cQ:JqtJ&>licP.B2a\^`lDB\r%EB/C(V:le*K$HcU>e89a7`1mXdNl#5d.m"$A1iOd%OtSi@=#0]/Xq%l(W;D811ag)j=ho+M7b*4H,cf3PlG<Q>aWlJAMQsCnZc-[\r%q.?!0Z"N[8R+Po:?;,#e.Mm&I#![68Z'Pk(a;d-KM[M\;Z,ME'23Ng/Su_lg!mcT^RD<<@;'rG*Q&.CWK:gjBn5sQD(L`9f#X"TG\r%`CD^6+8lF#[LrXQd0RVt:KD(D$-MF3R*_:XOSMhR=Wsuq'!]i;q&kk@X:RtY#*qa?6.;a-Bm0Vk5;*rs;SlI$.:NW@fF4nWJ9OE*\r%=%j3Yn#[7=SX0Xe(fN@4*FYd`d"JM\dY)h:)_8)4fIGW,Tp$bcWhN?9O^DeKfV7s#B5iYT7gst9'-.<PU4O%S3F^'c<>q4]RO0*r\r%2If,s9$jB9V!(,M5K,sU=^+d5JNg`JBpBGjCJ3b8&'eb&+@$7W.8NW7mts)8%MaHVVMT$lqe=c4;q=u9H"*/PT#O''&WS68M5a0j\r%FCl:'PI:nPP*0cp6[&@pQaW_7Q.BIL2Na?e8E@(n;Roc21\dqmL3hS)kpBRgRtHVbCG@dmdomPm%!nm_gDkM^<-f+F6Y,j.Pr=U3\r%Q;(qM%T[Zag?>cO<8?]A\Q%r6*DN%d*m<!<\#0960B30D6>F@]&sQRQHjs;EQ\anU^fgr\,JrZ3coJsfK,oZBKm5s]<+:\"]Ki\_\r%bU*jF6aT-6.lNM:MjnT$"4,R%VOPJM#=P8P0kO`!N$o&"Y*(:;!/r6?jp&^D0g)PTks,m!=s>>5i>C]8hgp`/A9sEU*OUI*$$aK-\r%O]q:.+B+L/`tXYfYnn&.:k4E@KbN(jntaM#`.$L=9d/:G2VFK"OWHjSPqiOe/N'(1>p-;u%C7h1)Y&qh^cZXo0t!PJLEO5h6':1J\r%$%@P.=t!>C&Fb]KL:j0+f]IAH&/fnQ!l9+Ma=f9cp+*ME;46nS2hYg7:spScMTE)BHF$*BOr,WCZ\6UPQm-3]($CC9V(K+@:j(Uq\r%AX$SbfF35/SKSCc4E*!UcTn\)TFuHc^q)h_AoYbg?&+=4B<h!(Z5NR>42XIBn<#(R'jRN5<t>d2KPr!8F\!45XJ]2qLe(gC`FXWB\r%6BrG/"]/c]^RGK2fR[@N0YF5/n;_O&f/l9JLKC6(DA%FV4[85gfQIA3Ua&?nW1@Hj4@#+Bgb>6?^jiGjju4Z@1qOD.]fV@L'L02E\r%5`JC+*P:OL),>T1MAIDuM;8P/D07Y'plS(qXN*Ga=><;%6*S_218&9:TEc_SC/e^N.cWY[6S0W%YZt\,+al+MBN10M@g<()>9;:\\r%"[ai\:Q,I-PUd%f/;[p=E`l8OS;Q,Vn7GriJX=H\+1"=(0j31]6b:TF'&CUOMuK_^G.!B3?/2eAL.=.UbT_q"8le_tN2D`+,R(kA\r%7Z.q4:6AE7@<4]!asl,(\GV2?eaTi:"_T/cj-a=Z@W!%u$<&gM6M%u,o;8epE%e1r:.<3Q$<@@/m0nFnS"W^'c'KA'IS!m/*-7fF\r%J`(JeRjK%YpnX>u$ipKo._M5_3DFSin0to-r.7P(p?W1kiNIs<;p>H]:2Ke[e1?O#0V*l8;jiN^'H>`$'[nM1?&+<Q]r5IbSJh?)\r%4$slm9[gB@`Kli13RmU4MD&Qs0B8(/1o'Wh9thMV_N.4)pnLtKG1hBhRWbOQG#VFb3tP[8>uA"`pJKTPT'[pZEOMXRUqRjc[&#gY\r%S$8I2&tD^44&k'fj/6YH;,WtP^f$E(&-QeR5Ln'+Ulnpd0BC^Oia&h>_>_o'A58+iLQ[OmVD)#U>_7MG(]6a50ni*%2+A@X$)8P^\r%.\4>5@_upc7d[+O@lHP1Kke!a"L]/)1P?f+8rX-Q,\c%*$-KEF"q"."@*-9sR!$:?lQi>b/5S($7gVGZX<<r8SkNr;9?e!JZ!Hf,\r%Vf0\G(Pp3JQ98TZKiBXe&e$%m-*+=N'Q"D?INXJ%TI*K'JP0bIi)G40cgg?_&Q-;Ino6(A,^)"s*Kc:N\KZ27OgR0UQ[=SUnhH-8\r%@]igtm0P6*c_%$V3Y,oY)tN=n<'*Cpr6psK]:SrO(2UT>8dl2p:c\iVS?Oi54GRp4Ff]\:pdV2_n<"'OGAFSFl7"IREpV2C'5/u7\r%O@H&GVkF$eRW+`g@[@Z]a+GLg]BjPkO^6hbU5OZt3pc+;3`-:W;%R(Q*N^<8->;otd4rh&C_64KlT>d!<mJg2ap2A_=<_P!ip)"k\r%L*sDlaO-0H`2b/Y`5+:Ml<'!@<l?U<Jgsp;]tN2o[$MT_5)SnNSQ>H9,>KdC5f&_:;F]H0&$9MmA.u;mEu5,t1Aj_'hl`J;(U&cr\r%B/_<7ZPs5]T_ZV'_L%+*nj^e$BSL8S4buR!dN2WGB1jJRns^W#ChZM9<V9;_Sjnt^+\`G87St:5&l2eu``A.bqESc6;NhTTJYo%`\r%!\s1II#S8g3GcEsR<7@r@+TVqWGBoDiT&.$cWlQ6[m\B1*Z3ZL;hKg[l"%Z@J<7J)6K[A+bqi#ipLqkce(G)p40(Qg#T9ZiPSU;"\r%1Fgk=faN>pj=57+RF7*&m6".?!ctAAQh_&=lI\_9p@,/F9!nR"9!f:Olr.a\?):!5.+b<j[;*')[a_(#'246,/QGan8m>"n$B<S+\r%fJ.sA_MlXeAi>:63j(C.bJbK/GktUr:Cq@\*Zo*BaKSi"1QE'J:BM@1\N8j[[552<W-o?WP>l9V0po^MK#Hs(P&^pDb!N@:0rJ1Y\r%Ra9oip?:$>!IYCg.as\DQ0ZUk`[)>!1YPaIe?7iZ)BkW2G0LeaWRkqoR"F[@=/APO>Mu9:WFC3[1m@1VW`:(/099,=q==/mfb.L#\r%'sIsEcR+bu&]f*P'Q#:a/8B<pV@CH7+q^$<g61CG&PSSXe\2nr?/$u<5YFW'B%5E(D2B>=JT3K">@JHq!LN`m2/\LI*@32KfR+dn\r%gK3X,&\F"Co]k^V+,sPgVP['d7Cf?Gg@dh"Sm;r16Hq.W'$"(Z#NkeVXCV&Ni3o=h9*I)84B.]o?`;Vm%7,ap[5kBHCc51W$?kmg\r%;kdW7Kr#A!3L+0P?7/j.&kb^\18;pc;N8,OH\q+[B''"XQ!n#4h"\3%_4/JY=J[u5\Lq$a=X.O1M@F)o>U\0NTITV)cdi%@[2LRN\r%dlc2.26YN0;q6FP75/2;'>`l\hqh]--/-Pc]G*rN7hU!]&LWk\:f^2W(tQod<]!"G8b8W)<i,3#aZQ^_l"]$)U9ba$ehc2C?[!$C\r%?/A8*$k.64.1o.+,4218;LBMW5/^#A/<$$V]`RaUB#IX"Otk-Fa-n!jBrN@fC1<\?E_#Fn7j_YVFQ'UVKfrM0\q3TdT,8A`<pI_k\r%811bRp"1Paa)T5=;r[,9>(O&fZkhSZR[EfDja<&qm]j\g2JE27'I>2on&7o'h[bY&'jM>JY:FdY,mMJoRKE(H7KWO"\a-I9kdVmg\r%<pjj<<:9Ff1\dpM*;4!M\8nZdiBCd@*V,;3J#]'5R4&m\J2"MRkUF7c`Kk1R9i0Go,UG()b"a.%'F(MX"*]V04$M1$XY:\%k&b4`\r%3dieXM+JjI`Xm1]2[\)d\MV!)#$b1Jd(Y+cj](NS--XQc)>mGl6R02eW*/*&QCZ52J<'kV8jX9uXe%5gi1gI)W$rZ8_n;qdXG%Z$\r%.nD)0?-i3D,YJ-Tnss#!So^Ek65D[B\L:C"8nutO,5s'$mrb0=r)>aF@1F,&Um*^?nrb5Q>$ceI#faYl@$R*@g/@b1-75aj^ZcHk\r%E:P:X*Y*+fCKj_8h5uNt:0N&/HkX.l4$t5/HQ:h[T!XrmcBlRPZgi_tWP7M)6:JD^VJHE)KFuHW$p^]0N#E$f>O/6']JJo05V7N6\r%A4<u6ME40SSZig\['D;j24>jTig#L7imfj&["qd7Hk\a'23-&;Wf'qOjau"-i2;Sc?K7+bU#+:X$0>qPYi<H`Y:1YGp;g;nP0)=I\r%li0iQ'hhKO,jOqXrr:)eQX*a;j@\nLnfQ.F'*0JrpLC.9+fY]F6U1Z=6%Ej4$CRYW2P@g'HdHKH#jrWn4QtP5d/n3#hfWXTL6HMu\r%pom1L6MJF%$<9d"C7(dBr(;!,:].6>JR=UX=kH)UL$I)NU\]hqT'VOj/o3U:g'07^!t-u;K7F7E9)bt+Tn+TN^-\Z;Id%W*k:[g=\r%\i:oK^/T`CONX5_0L:JWWIqPHCK`BFE$N=PdP&UuPnlP;!J)LgW6'G]"$NmH(0K^ZNXI/A?jrI#2GO%)(qnr3UPJS:4qFi?85%hh\r%-8f57Q:6YO\;gEBbfOA*aZltUU,+`(Jmg'[foum/>H?ViKgub5?MMH`K-*GjTg/nC'0d)++daJX:W+3Fm)jc&TfJ:npRG0:%n'-/\r%hM1_88#<jne]T<;cm("1Qbr>iH6P%o+VeqQ<5024Z#0mHW:-#+9.aE_&Y)10p/'9io!sue3g'XRil,"Aa?i]t$W=k^Po;irXZ=%c\r%e"7a,W]<pNQkZU$$'St/R2Td?SYH!.9]:=Sc$+JA;WGXiP'T3)^80W'T?`dt"WhrX0@>dJa39k_<,J8i9,KYNlcthpRE_'rT$<U$\r%=Z'QTe8U]K;CSsJ;KfDBP+[,5,W3fnSb&\ck7ZS9g>3hgeNZirC7%_^<(SrQHF!SNe9%[SflS\?flTfZMX+4NF7aahPfmmSUsNP]\r%<;^RDUsKdP9?"Jc[>ph2AIPbfo!3YS<,@/Qc]]05/nLP=nDn0RCoQ>4M'jrk[Zk3`j:[IGjjU&X5:k/6S!ks@gs'`CQc7E"bVZZ%\r%Z)X]p)>gR2?<0jg$:O<Y9jVAAP]OCO[uuc=/esnHd,[VkQSQM732&<@\l;MUanp(dPegk<1UP><9*NkrH1I],9,YB^C6P"7e"m*J\r%,IbdQ9UBe=]8X'Z@_.6'_r/o,3*e!<=)I0Fa%oBqf]Uub5SiFiCO@645rC5b%<HX5FNM9m$p%n0Uc;4GQP?L#l&oXdR2BX=SYA4?\r%Qi-SU?f$V8?;FZfR4bJJUS^]L4oFPd.Jqe?.@%fJ9;pD54C,h>nbD@spJ7@(U_$V"5kL*b>FnV5])G^t3/g:SLDmM_?n`+S:;JA9\r%\A/ce^S:Hj!ATHjjsV^mqdnB"m%1^bYfZJoMcWYl^;%/+[/:X1"n6`WF9rVGV*k$a)A\lFg`n/[<)WrR*I+\4^>0t'ILggLOU,57\r%iX3X-&FbD;q37:;[<\9LibcgA2):Le$5TtC'&EA$0M4'^T*WXP0JCsfLZ\s[`pFNX6g,/!O7>d"3Ab&S^t/Qr;FO^a]ZBid_&%G+\r%-@1+\9YPKf#*2E)j4M3RQCC0CD9A!:Wr_F@cj[W9)\[a;=;\GM,bms6UuM(^57^q[m3ZDjp\-4cSql34.1=Wl#Z:AR&O-s<3aF9f\r%cF<;"l"2?Ag0k8XA)Se%!:NMR*<I45QV8rX@c?uCG[faE1d*Po2q+7NBDWAYcLrf\JoNV6nGT(n#<f?!'QFBH2o2S>jV,N@01=b<\r%fop3D,*!IE0sGQSofBDs!mH5L*K'V,dY/WW*;N"kGXLp%MAMqi`kSZbN_0arXq?5o;f7`j=0om400ZL3GPrD=h?UFGEB$RFdl#?H\r%WSt1!7"-7F$]iX/.RKUF1g_r;HCJVO[5+XeOm[^@#.']T$c%8*bJ1n*o%RH`h.-kuiQbrp>RPH;A(>h/Zu2(X\n)@R1Urm#,LCfF\r%.eEC0Pg;bf(7lqXBhrp;5Mf#l^p%9RfN@]Tb56lo6q&I.F0oj4nEb&?lb/;P1O>g5P?Mp2i(ZcWg[tXsGTRek)7X#2:k5s@W_2,\\r%k,7B&EU.K@"Z'c%g?`_Z;)='hYB1j]5_8(YTu!.Rs)3D'>?6=M[i[p1@.[>.6h<GX:PPon)cs_#=ucn2S"K5&/RQN]Y=h?d)TM^1\r%qRG8NSo\&:$=7=b1+,/Nf1Ffq#'kD+"jal8_8d7F[m&NI?-H@9rbQj#pQ>qY709UXGH=oZD^><bZJKlp"]$)c'qrd`n;iB33Kmt^\r%X5D^)/[+2A\Dag:g&4RaNq4oP[)->CU3=36RNGbiY<JgFnm@$e).T-U1WGW%o2uj,@L6WJ\`+)R9]p?F^g@C_NKe6tn;4pZT>0<0\r%6^Jp+6SW+T_SfBX3Pr:AS6+ssDg_Cqoms(4PY6J:HV:Q'ddR(S@W:8$:o-J^;;<J-/ZjW'k]%n,N:G?7r,aUd32$*YU0GX?(dqrh\r%j@r39;5fcg?`[=+PUb8%W+XT.rS5<fV`5$QM$n7BKi,E'\-:!41P6iI/RO%]h&sC>QimffT&Xh6Dd.3;D37a;:S$=N\CU1@>h.Yj\r%MQ=>?OW`r2ni@g^`DmqjA6d[@L'k#na&.DQ.b>oGBA;a^*#2Xo0'BaclFVQEoSkCUmneps^H"*XjL4h2s/oE/]?q>jB\AJ_GuutP\r%BLQ/#;lEkEPR=;GmY/PMgph=Zd$7\q!BsjLFA(3ph<!2sh%At-^O\J^/bsDF&5_lF5)hksD`l0uHX0!h40.=^&o'Y(GSTr[G0Rhs\r%2dP-1b?R4"rG>3I9EZC3WcC8nIC;;0L*!sW6=4J?0Jsphr5q+MMhj-a(T\glr4ST/hl1T.5G.:[?=uUl)slQ=,i"[Q;=UeK*/SR*\r%NA'@/<6-TJ-"Gg"0N?7H+-$\S<P]aK4r[kMgSh&P]ZkG9YIl^"V"bm4!jNUOc9CKY!WK2i7E_1Mj.`8"O)'WfknF2j!o2?@J"uq6\r%%oq0pIp5V1$6eeB<(+"ie_Y1aQLA@&p\H$(:2adI_6_j<N3Kfjgpf9NBY%=_a&m(W_td'rEE(&@_Yf]m7T_N4XXmZN(`ucoV,Ru/\r%Sd`s>G7UmLU8s`4E*]`V5jslO#Y6Y8.l=k"6[HS@/1f()1I#qEBeiIHfD25a>][1A;5%$74Z_*XSk"K<:W=4A3]bdUi$Camc$?6Y\r%X*Yj%BM#HMB0BC(aR,o[X1=f$s/dlMP\pMhYN/)Q1ZHZO('\.YkUt5dR(/PZ5r%6.b/cH6>)uj!jHcJ2P?K7H:p27(r>aY,b\/@;\r%kEY@lk'b5'4WhPEItqt:fDdV@r\knLL%4UdB`M'F&mbSLn%+ljaI'3f_7P6Ji=5=Q2:/I<Qo=s@?iHUf=%e6RVsW7-4q??WbSO_2\r%2q-$Li:+O3r'gQX])<rVbNn?.h^"\Q#>7A5O6ZEpD"^5u\!ZE2;GX0ST'kne]!3.A1@F@3Tf(G+_.8P;WaH0KqnEYJ7/cE3@E9B]\r%H-sAfi&*:(NpfV;oaAD1%%I7]=<(q-]<-]*92qXT5T,.`h??l$GO$-DNV+rR,>qZn#FKS9Q^Q]$'!&51!1qN>^[5BPSm]%$GY[D?\r%S9="qf9FZ;`>PW!i/;7,hp$BQ.dK#Vo$Ji)pLoZg<)/"b_crA<Q;Z@?N&TG['l"c%.hKE=Y`9EkM>\Do($qaeLF5L6:>;4>'m<Y\\r%`*6"dUsR\6<:&K]2XX]3H=pSj@If\*rC:Dd1Yt]_pC^MO72E'/_7MR$Es5oK#O`#D!BSUrmeG%S$7bYlh0[FdLFF"#;8j6Tp:Q"O\r%WHI^55uV[j`Fl?b=jJcVf$<-Ig2X+!An[i0'BkjO8Pb1mK&.629&B-0Uk1%omJm0Ol^g)17<`t>*lb7Z-l]pqG%D)IIm!oY2@=UD\r%/>F1BlBp@lnJ"sRn,;hQU!6q,7.sRF/<+JO@JngU`#Me"@'+[M]k-X8K)t=*a6j:%<<h>#AN-34@bj6bQbY6upVFq*Z'Ph_Y4>lb\r%*P<mV@qKm1!>7,ZK$+#[?VE0Rh>I]JLDs1n6cMi`9aEp"#(K6?^q0dsCJ^Ep5r&E:HZVGUX<2HfkJM%)#%;eB60NCCrQ5&XA%$Y6\r%EHo/T[SKW4?3/TGm+*t/pWItG`c==RAprG@rp$o:8*Cm+Idgm\5&"_[`Sj#tn:bO<?dYSM^9[!<l@?'j3j]Rt3B@:j42O.`M%6NK\r%E,TR9(@WbPJid8U*8M_-:!P/gN;6dd>GoNb8#ulf&qj`(>TdH]n2@MPQ\s5p<"WEFSmdg*&,oeMCM/iknt>-dqA^t];kQO#b'XQA\r%j1KTE+-o^fB5&b9eFoGSf:S'/K5'%a/\$[J8dKh3[u+ZVVEu%QSq>:.%/dR;c6<$-N^5roK=gM3Np32D=i>[pIM'WaKrs:3=r2;u\r%*)(?2^lj^g"]R4[QqtOA&8o88JHNau<rL!?kARlJW^"!&b5mke'3Et*B@u^eI1`Io'EY$D0,7-Q$>%6)U14K1<SS_Z;fHq;&LOCu\r%%LL\@;p*VD:osd2"e9JopKM&c7ML$nmoMdI.`HcBmX;jRhX69qqY6$D@^R:^jtcE]On)N!is_sFiOM;jZNrOlB5Qd0E5<IE:k+CK\r%\1'\X6c>]r[@ef\9YoNscbTXCH%1rl?aagY\2mOiYKfPiX)pPb;)&^f]IOO0GM5.Ieh]u;s'64q/&4h:A7"r/dG_gKbBU)t7=@4A\r%=!35rD4=#=Vk>g69*6lT=9fB$QDWF+^mK,W`[KbNJOj)mZ$KL6;c&ms\$Rr26L,Gq**s&83Dbj)NRFL>6Z2@=_t71#``$i$eaK=&\r%c%#PZdQ[X.GT1eF/b;Ra?_3GVXi2#&4?L</G6MHO7Zt?,ANg9_q)6kFMYuFiQl91NL(:8qD6,VaY!AF+GSW[!XCmnUId_]70CsO/\r%T\P/KB*u0$@PSO::<cqZCntH^<!Vk1"C=mY[CP+@$B"YK_:274HTCi1:;&KME[^5jE<;tD08eAXkl(!s"]TD<bbsCefD>Z-AG+JJ\r%iAH39B,mMHZrT[q2HpSPZAsZ#VSaacSthoJ;d>ZgD@!.DA'2<7Ueuu=F:E;5Da62'l!Cr:ppa5k^!5]c%KO>0qaQA1'cGY/TfX_m\r%3o-D9Qp$OG@`cN*4p;0Pq"O0,^aZce&FoH,bNe(%fa>,T2Xmk7ju&GTgoP.U14G./h"NQ,\hYqQn6!#Lp^p"/KI-DfUWFp2C2V=!\r%mr1OIrXZ_fph\2.LK4<iWbU9mnG(_-k95^\gCEn;JQOK2EmjUfs#1B<]Ck'24ccm_<<tfjp.t_YIqa*@^H-o?&]9cL3JG#$!c3&E\r%k&M;d\,sY(/+Y4"Rf`RG7<g,rRTIVJ+#0iK(]pE]XF@j]Veokt%Bihuod7Y*$LW>UYMtl`n+G4[bkH=IrnJUjD]HZ@6UpufRQOgS\r%IAafE=&jt-8XN;O2_8'8@4]g]_0_*`P'e@7br8mk(%=D;2;UZ1V_7+1Ya[iee5nm0HNuDtMVWX=g_L]/.GB,U=M0PE$VImqMcJuo\r%lM\4,:RaZ,#J<pU0eXnqo6@4G270SHQEkaJ:$\9?%?"!Zmo&V`hpL-RTP&%\i$r5gT:>Ah8)RN,?Mg1c;s;=dlYn#Ppft'qi>)g_\r%E'Qd!q?<_)L*iM\9A*;>f[kOT_t'DtjIR*D18DZ_MK8(&o?D&fVlPH"P#h0T:]*R]Nn7:I1a>.GdR)]?j\%U5qfHQ&C0g[7p'S,N\r%Yoi@g#4m-GF'n"lGg2o>a`AA,SL>I!p86A&jlnYT3C0-1_7`5k4(!"F;*]6`BPDPGM$bu+M'ZG`-a61I`&dHWbo)rTo;I3f<*@0R\r%P8_a-$1j^G=[)%O]H[OA@094`Qn4R8o7^iZS)c.pBa:)GGjTlu,>4u0MBsSa>_saHSY&7Q;oKBpTX&M/i<Y`GPq0VQ+0#3fCEH6e\r%L=1Z+Ar5&9X1l<>Q[HX_G^U:&mqJ(Q@:fe`"ui_O+Tu@?"o#=@e#`1<Q>j*LL:X5g#6>`]`*A$DW(AGcRh_B2Gjc#W]5!e]AVDIC\r%24R8PhaqkgTP$FDb"3#AGTt(FX74gq`"UcK&"PQJ6qB!7j!.F"ZAL%W2-c"en=IONqD=Wh>XDHX)@mtuWEd&aouM\4Uj]h]C@tK!\r%R&+5=2P$4PUF[[Jj;_h%BVGe%0)`])OTpLQPkc$K8JJ\_qL_1%kA.oMN^SF7<_!tDKnpr*!^kW%OXOTMHZQ%;OXO13721q(:0i)?\r%c>r@Y4e#9m`'-pEE8fYXp8JiO$M][kN-@l(7$1lS(jXY!&VV^8Lgj9"V2-=`1iPi2nRdu)LN%oGY._PqjM2AW1gQ3tqAqH*3*uBX\r%q):t?I"HdSQfbNiGOMBUFohhQY'MM?3cteK'8(N[rEo4E`>@`=_kQT0U-<7e7j"ZJVbq/_1S46"^&f*0%2V8QP#$=T,NV"57qoIO\r%7K.:Xq.9Sk_@RFAGrDTRZ?Tc,Lo9Zl\T&h`R=]&TnDL2Y^!H&3h^=@sg]+oHFI7d@r]C%Fi3K18/]D44R@E_$fBoAlUOVc7dQ.5]\r%JVD":X-W2j/U/]r:&50uZ2PpuiiNH='u+2HX-1@!5jPl=5Es*%VNDsBNSlU6<0&Bd%1N'p/2,[*&C8:gnde#D22mR/'1Nm4KK3%B\r%W9Bs0_ZD1IJP4!NblNd3;$]fD=N1uRGr9BKc%aSqpJhgVIS@N3[KI,T0!oZ5^BtM=5dEcl`f&l?_/@SMa&L%kWlYOtXE1K)Z"1uD\r%0c1]N'Q+*gfbho%EId"U2ACc]_HbkgH;bGdmG7&N"5gp&6o;]pgl,b9Ks@a;JmjDhp;StY>^7e:rRPr(6C:p)-+f*Zrt6YC]+&&]\r%C_UY%o$,mQg8n!T%193JEhNMoOG3[PmlNdC7,=u2lFA2*[P3rTJPp!b$>ZENnu,V9@9*_B?>F`F6#-6`:rb+JZM'[H9MPb@!3X9+\r%D\Kb&dL0,Yil$jAVI)&=RXb=GJRkD:n/q/G5Q?A'mpGU7hf^*/`]S;bLk"DNaF:l;+nK>*1;[rkP%MG_Pr/Boc@kOKE$rnZY<sK)\r%r@Xq7mrg1MrEcu(AH/N:C%aVo97-D[SP/i$G.X+7SaLYToC![6.#_cRc2?%?r*,5=*JC1tB_&>g,*RdLL]7h_pclO_QsBFZhtp9]\r%s7nnO5m$.u!6r/pe3*t$ndEO6!![Lg7j#<e+$r=il*4b.>KO!:9X;Rd;<<0^._]O\S*OJkode#S0LdSZb4Q>"U@-:r&D#jfc1)?7\r%Gph>9&6_%+hqS]MmItF7a5OjFbHFf->XBH;2CM=UY`Q<Vct?!R`Y6nVkn%%F.m0&t0O0mh!R.uP']jBA[1G;JO$f9n>=nBFKPbX/\r%[iD7[M8.?uE!W5/,]PdGefE$<9((gB,Bra020\YBP-\R*lOddI=F95eg$ipUK*L/^n@QJg^"q<0bC+=e"S.RYG;S*1pfk^a&8$l"\r%:`K7rLV=H*N-+O,c1&d7[mrA96f2@LrN,Eto_5mVR/uVKB(dPN:_Y^0,)#E/,@pe),9cr@.s\qfFsbI_[l\<t],_5iDLUMARf.-%\r%6M;M2Q"IecYr)@6Y3!e):$9skGIj.7p@gV8p/11"1$r3$m:>A:qWg]7h=\HaoYR"'&+L%R#olZioLbFBCK@b1qe[inC+5(46=$:N\r%Z7o/bIU':L<H,`Wf(W6qs"pKg_8>Z!Cq=%glp#TY*8Uf3LVDC(MS=lBnCm$_L;%S%WDWCQJF,Zmh93,3:@3CTYj/6<.3c2PqgWcI\r%+/Ws/d#JGmW(^8XfFlX8\7uOe^[Hu`70*E/EA`m)2oGFLfS1>;:-t5!BHk&9[+TplI"(N*5G.R9h`&=a=oN+o+ZR)S2^(/5?Vqhf\r%'*@`1Z>nYpk[j4h$4b`aG[h-,s/AW7kAJqbaqf1Y/iY%jD2UsCQ/ak4`rZOTa!nN7(@#OM(pBJ[agMp$$@;SJ$G'XVrGVM-JMm+4\r%0Og0MpLt'A%"JjpADAA9+:=0RrQr![TXGUA`9>^+Z\dgSDEpF2]eCbE=cS@/HA1^[4I_Y,$U1c9YCPeQ"P\gjV\NJ&m@%FkeR+5,\r%14bX4EK7tYW=Ag,7f/;H'-;GbU7V='Lp*>6%<EK+66R2$i+t8S\$_hC/Yje$8lOppWEBCS66nfR0%F]dZAWO=I$p2d,4LcW<_=:B\r%8>45=#jSS[TTsCb[%8T3L3<iKSY:Z(Z2%]`<,>;]^I\kL<E'Em8HnF8aucN,?DmG`9e/bkDo(q1F&Y<YZ/Hg]LD`8cY)_?rl<o-e\r%CEi)6Cc0F6<Q!_ij)B*/8Yo-/+1kdBTJ24U#8q-tmGJfa;7%l3S0q143][mOhA1"kki*7%HP<e7LU(9YWSA;`Cr9BZW#AqRTK9`/\r%OQ-]`Tsgk`3(0\TD`?\^70THm)@i>f^A@8(B3-[*rTqg8)7rG59=i2k'M-;ZllpmN-t='=`tr.n4Z'.rg`Dp++s59$&L%Z'belrH\r%cm:gXo7WSVlIA&9:N:+8Th(*4%l:e"%4?AICQ4'E%s-IXS[L%]P4"%TW&#a4s(:%a/I_ZM>BJc%n+EUO7W%+,#1BDA*NfIE`0f=&\r%eKO.)5V^730WJlTUJf"!q/tYCkpNOn3Zu4X:cS59Y!^RBe$-I:"uIdGX(=kR0%\JhRf";Pi@=7C<]XJMX5V:0M/[:bKZJ;GRc*A'\r%4G]<h&G5=rM(Z4;9u:\uZQ%sd>!jBb3?8%2KP15Odi,BR2BfpRY2Y,R)`NRc#^V/3LT<<'m>g3_%A"dpiBa\X.'6<OqVquG^HBEZ\r%^V7KkM-u,$$PDRKhHlto%(_0R\t:X)1`q'Cm25&]X*.a'0"U2b5Sm_6A"X30<mem^L,8)2^CH*eW-/Scd8`92_\QO"@pk3h[::<e\r%>u\mS;SeX>6<$$'=bqgP&S.SN(\b+1mJ]PJ@jnJ+V.;<mFlP9`QsCB0O=[u_`]t;FULPDSKdp8&29aJ(A22h&r;lEubn_M[E>c1r\r%kmblQ,2T$H6C/FqR+6.*>C>lHVU*4C#.j$X*S7!C0"j!d72PD0pd1;^^6mDh.DG"$(^",e.?-^i6Ii4U5bS9eW"uD]$=,a(=FE87\r%#flL)QeE;OU.]V;I%aBU%'#%B\sk?b\%VflL<%(G?,P\`I*iZg#/9:>*WocJZAL:^24V5poppfp'cJ+q?ZZa<lgR>Ei#)6`CNp88\r%U!!dM9PV'O?XPYpWp#<YLJW])>rdCg%TL9(;["%`O!%aK+j@-CnJ?$@pfD[7/<]OBV;N6*;8iW&0Z4(E>-HsZPUfigih;f!J@uP#\r%Y2_$OBu@<2LVj520OIiF)MGto9B_O+\#pt^E'bPigqki[^A'g\\a;iS'D%+gGW:mL"qq=#+snU]hH*7!%p'C4E+b<;B]uoJ<]5n3\r%O9kObTD&l!k-8HMfiO&@N=[5nX<(*U)]7qdUpa,C+S8a6[2IG8%^D>*!uU.(&S>"%Pf;c52$Ipc,n,6F?n>H>;@lLn>6#"Uq^nf7\r%]-*!J?!OW4(;QH<oJJ[6Zru/_-8=g>Q%h=lPQD94R2IcO&U8sFW0u'?bctEpR-_d'^BTKV9\_>2rT(i;=H*+;\0Ru;&Jhq-V7kKS\r%d01^N:[b19;E(He.)K/'"G1R(aHHc:S=MNF54`"*(ktc2f'olOPpG8LZhi'dd!E@d(Y[T%H2"Onf:`TiIQ`C71iup[^<cSR\V;D3\r%[eCdLG64F$[B@A>:`4<.+DD:$:`Jnh#J;N'g\rJ-S*LI\)4C(8rnpSV,]4-7Of*Rdq(/d`TG%M<POpSus'tm+s&dk<b]aWtJbL;a\r%rVhGnT0:7$^[4CWq-G`&b]iprZJXt>Rdj]k6K\0Y8Mf8i:H%gX*p(NC4eL0HGC,VKmW\Mmp*oA%/F=,,m9A_Fpkd+qr"V50:653-\r%\g$:3>E2p8f7Ug2O:m>AO5DU-WC_V!Z!SRFIBkD613d)gLQGhp'"tp0HiFIqEDZ[di!Zadj2N80>3T]9d:iKu-c@$]<W6Aea,h,=\r%C?H#Q/4giNj@Y\2PQ3O>#iB:eEK"KEWkqnuDHoT^7Sc]H#Z^'2(sWc:?.Fc;jW+c$2,cp(-m'nV0qK[7#[AKM4G4RORSH3Unb/T8\r%$k_SQ6m3_l8:O7A`J)aKKN('l+=3nFje+99l3tF^_YQVe4H!mBeTD'_/Gia/EjNs_@Y\PsbrlQ_a6):opLm*,fb%fX))5`p&_gdJ\r%#F'IgY[k?2k$MB&0ron/qB^AT\Y:+_81I<\%_^HS2hG_Z/9XW[TkMlJc7=1HG2!i?hPW)u,lnPunZ$-4O\URK%Xg\2+VN%_W'[.C\r%gDNM0QCW"0VP;bc#Q.NJm*p59I(/hmqu-MHbU4Im!Ir^V2"TO0K^AI1O_2>VPE>Hd?dd/BHP<^Bj\ONL^INRTJ((=&?bY9qZu4Xc\r%=5'V-lWMr>\D+L:5Om@Qll/M%06.W<Vb$RXEclVH&+^%"H92F2nCTHI!37eYThE7Akg41(.:G2!,[3?bi@a.9WsfU7`;W`d&N<A/\r%=IPuTGQdsNeIdR\P*9?$VNWB7q)hjk&)c-@,LE5E9CW468<.PeLr0H<?u'K=6bZG6[BgpZc2P#K,K?,6%1mGo>dse9eHPl,`Z5V/\r%0`Uid#=Q_kB,-r=3YEcP8sXp^NsF[*<?6(UJpZ8Gjoe-<`0?0;WZrM=@%aAs7f]reJYH.7V!NM5_mOS@]"SI>"MD%EAR'+dY,(2b\r%#1X<FY#$.4B3U2U#1X;.3KKT=?E9)WdJL;&CVAQ,3oUJT)Iolg<(@)il[Wk?qK+0C/fFdCKtaKG%]UbUr=8rS&>e='`InJ<X5U(a\r%,J&q(?psaO7T]>HaGp\rkQ2tr3u!"/Z-lW>L9]0<7u":Cb,V^%WSph4OVq.O8_Oo-&=3bST"@,KNX2Y-7pL&46cr8qe1aBm%8XP[\r%@"Qh64q,"I0TCTc[4>2/&\VGP6!5&nqBB:@9:*hGSuA49HZZLULl+tc\fs=<Os);?<MC]f5ZOO'.MeT*E3<M6GXjDqOm%Vh,)%Z6\r%,1-hH>pQ-h\r4/`M!gs."m>T@J">u?>]`C.O@#<+O@Y,i*YQj4h*WAIU:Y):_ms(6?HZ&jI.m2?c&qe\p:,O>,B9]_7slm^p/^M-\r%lS%R`g@FRJWK/o,U'^=+\2%fZFEGkLM$3tr7TBn=<,-Y6bp.]kB4e^:8-IgE(\A-),98p/M-L`^,2R+^<"VN>KH'1te3tS"QH<&l\r%a/k"Odld3+Bc]lf,fU/lG['M$RNih943^,,6R"A?jUao+&Sc!eG#T970WU"SbNXFY_j/Y4P]d;[02,<eW;k8m6Sq;BW@2-o`b1$p\r%Dq1aUaUqf\:gNkVUqj?".58Hdq-0URU=_eHM^Vr9;;h[a_]7LY(-e6UhA&O;=bu(YA]R4168Vi$ieSoh>uo$U;T"o5&RWSrCD98q\r%=,>kWA[k&06Sqkd`=YfZWi2YL8Hi1i$Df_VW'[J5*'b7MG4GP=e_XY)Ms/$0/u=Ff=\JRL.cTb3ar7r*9bjBRU8^JQMA0#!F*'?@\r%V!l"@ja&///!So3<ObApKda*#H6\:tL9d@#Ai6+#($W.*g*43B9bsH^EZ).o[1H%JU,Sh"6BtPe0ra,0Ca$A1ROpr)is<(i[4;:i\r%FC5L,5ZLq5[1eJ?g=U%SOcO&];$G?`+hAkd/JP406.IYZGI'a9d><RUNG,a3[?8Y:KkQ0R[LfhYbndmlYf3Dm;q^.l9>F3M7Pn>*\r%g;mjX6F9'9>DV!hAd_U>Z,NMn9<eZbGA*]^jc:XB6Ii5d^Rt[+E8+>P!oB]-([&CXm''Z.,eZ1L]hE/d'Kin7/SfGbL[>Ej[;GF;\r%]%(bQV?^E-BWSf)N^-8h\"DKO-B]>lH2*$<UPYcObS]m*?Pk(PHJ/1sJua`Si$!A9\Z,[oOt<4T7$KHU#d!ffK._fu9oMN%?4*qO\r%E8K"t9["uHY@8PF3kiUYW"C]_`KN%Td=;'_UE5#7gU(/i1fQU26s.G;'uX9:#6lN"_ZO;<X]q?<#8Np]VY5+f%6\2T?O_ta)C]-?\r%>MNg2kVOT[[\,]JXSj3$f,@R_'-8@W=,C%/)nrH%#*0!`cso.B`%:g+^`pN&M#L\b$7"l`Z=Cn;bS#l2<[4h=Iu86822>ds(14U_\r%F^3@9^(9peJ%N;RYoT<$ld2a'_Wsn_Z+W:=$\!H27QoVcpjbBFmm:M"j-D'.'>&DZo[Z_9h/OCJG_:)LCI<AlLuuS*!P\P<)Wjt,\r%N0YFiZ6jB@NMgTKJsU/gWo,1%N9+o\n9s"2CP/7'P&s9RI-7tnF,dUm`SP'NALNk/gCQ&mnse_;`3/'`0nk<cbGBUcNdiT!Eoo\,\r%^=S4'q$1ejlmIhS$%LEh2#H+SUtP3[-d@+L6Qu=;>Y;?[m8V1+"1Q_FG<;*<q_qeRZet(Rg?[M\?J9%se%rD0Ei4h`J*CT<I*`[1\r%fc+`NTEZ3cJ5BO'aYk2K:ba)B_ZjJ]M?3P7=rLNVm`fLVVT+Auo/.uu]or!^!aQl0J#`'j(P^BF`$)diCW%YN>\GBjQ9$*gk]@Id\r%?[8<;5L=`"1tO%sp/S+21&]MP0tpYdMJl"L8I7-H(o&E(_P.?HHqS.t?;hJGn=lYS,fDYe<l_\*#4CeP89ChWo.h7.+dVq0W[JJ,\r%C?n>P6q8CeG<)_'LG2N7>ro\g'IL-IZ".AtgpdV5E2!4R*+C*qHtPTO'#\N?<ARL.[_H(tn;'c#P3*q+]O;kg]f@"c_V5Z6()eo>\r%Tb6%rgC\!,U@o:Ec)1MY]+&*^hU:l/[5>ifoS0Br"@V^e)E0>]pJ&%]o+1S(YaSL("Jj:g$ZBaLo@R+jo;u+.2>\N)4_5">nZ.R"\r%aP+-oI@m'W1q&+IPOJ:E_V;$tC%uQn6M;M2&[J#gOsg0%=46GZ4-O9kgRU1uh$sVU5B&'rI(*#tq[_ISZet.PT'Y?V/^8aJF(qgr\r%[sMgr`D-Ze^<)ouB)\X1eGO9/ZGCa>kf8ksp1i!9JCAV_mT+nL!`oNe\?lcH;OfCk3Br0DU+.i-\[H>u*LKW;3*#W][Q1cQ8*'1K\r%p`Z@R%c09cXsQq2PC,t&hXpts]'KYRAC)ZI65NPq/dGJF/Qm1=gsXQHG#C4#m:>sI[Ml:uquM6u4R\FY;]"kb,Z?&%,g"'J/kI^C\r%T2fj9m"_-;6bW+jHp![CYj=lYT&/t0qE]*kBUdrg<'Me>_/O6fr<NnE+1%jMeW4&15-<dI\eLn-J]G;f%8(mJ;3*4iQ-P:9eIR?d\r%;>l$D)hLn0VkX$=.HB+90W9HmUA&@*f6Y''q@O.Idh5.#O,a^M+5;T8?-#;W4)iFq#9Fj/qE`@2a#;(e"@M(e,M4KUXQG<'+f4V#\r%H:XfhHUp_Wk[oX\LMhi5Y;/pBY<rg7;>ecC7@3BDAQ$@DJfjf2G4<P(+$O>)%[o'YIWTZCr4iD^`c/jL29\ot_mA8kE4?j"8%fG*\r%@:#J!RgX]/[<%&%<H?L\p]=a6G/!QMCYX""gIIDK.Pb#^MTAcX3co$bJfd$1'u:D$L!FEm=0!IWUK+Nfn3_D]J4hr%X*"gkeE&lK\r%%bfu-LAmT?E,tuk::+=ZpS%IS^a8s.V)jA1l!b`%s)bN,Tn=[LSD-@"[Ec[fLHd.^=?1ZN0<U\sVtEoQWbI^L@UO,^Y.jn:^0_gs\r%H5s*\@4L,[1Fdf0Cs`!^3KIVj:I)C80<$.amq&FKfClGEqG?a]mEs=fe$VW4"+pNAC[qS%m6M3+k!?u(@YY[*`+LrtR8d%E9r_%D\r%*]E"4\)^%rO,fg&<$BC(2WA#*cApU"gsAP+%u^=@Oeo$(2-_T06A]5TPjE8dV9<[ki$$5a(([5"HQ4)@E((R%#p5s+FD4$rdN>CF\r%e`A6)osL=H)JtP\%SFX6qg!lM)(<BM?oL1FBS(EZo$HG?=rs"R#>sL-j<.VIRN,:071PM"c6S293o"#9je94NZoftY%3icb\Y3ea\r%BPPm_Kc29Q>_sA`QA8:hP1<Z1%D$S"p'Mh1]b9_ZV$1-u%?k@dc`!PMSq3ujndoOIbmpEO_&<uCi=iGZ)XtuM.G>f")jGNd<Ob=D\r%D^]L"g)Z%iFBRRW=Uh9(**t.`/^j(6j<3.sQQZT2hU(=+g)ZV&FBN%-8I_"q#8+dKll\&%#I&i\>kr_47s7_r;l'Y'bRTiEY)h3Y\r%RUb#:1cC"-7&*-%6*Nf_@e^)mAqqJ!3/CUjAd?`K\-tHTdY;?=dH]*FTZSa-R+-()4+(ZIGDT@UAd?`K\-tHTdY;?=dH]*FTZ[[(\r%9PV'O4-9Ao+pO1S3.MiFjiZ*]3YDNR9ber39fdNAgYSQ?fW5\NW%ZG$0,*Y*REjR;;60l'Thj'j;3p5MFK=@+Ymt"E.SWQ(TeS@7\r%jrc-SkC$?sgj.3^hrEu$i>cScHCrkt9s"L.1UY1g]Jhc-AKCQ&I%.#'gThr2L%[;.bD\mZXn8YQ$ra2,c#eN;/t'MOooadA1?QCE\r%8!EHI]##?3pBT'#i0ppkZhB1m9,TF>A\=D\\BMsp`o?Kn>XY=nJP0$9[meN1b\B<=Y;YL`LA>HN#WACG:QprZ^Vf"V[es7+K&<8s\r%4-8c?*@Y3`:`#R4:i<_Pk"WmbZ<fR][\Xubd3ZuE6B:^VY-6cfg7D`lRe)dMop"P@==h-rA9joT]iEnTZL&8+lFV%Yr-G)PNaOJX\r%molKPC*,1E6!.WAS+X+1_#E#gD.6%bFW7Z;V(0L3EM]@X1CfZFKiflL11oc15%-1DXge(G@R=e^MgKDqC`=TNqW_0%@=2Ri/r@3,\r%1bYPWZOV9E%uGPnT/0LKKf1t]X/?&0nl\k7nJ`8Q'E'iTV[rRCnec#RKCBDa#MJS?+(YB;5p"uDI7Q0Oj$h&]"$b6#GBsn-rkOjW\r%qn:j^RIBhsc$m,lH*DeMV_n#$?D[>N?GFoXh/:Qe5/l?lAc@OYWR!k;&m[H"U-=R>M#*dY$>qQp+m`u?ED_L>r-gG]/rB(0'jN?Y\r%PK>0DgW`aE<srX0'one+TH;_,&;g[5NY)V_FGguOH$&B`1p4:fe(1d7]p22'XBo>M7(kf&N<P"b7Rm%LM#(R=qhf"i&`^f=`7cSi\r%'4Y$T.*47`Rr.5KJk:Z@K.^T&2iJT4o<d1k/ifX105r;?rKpPEnHCVYSO?"#-^h('bu#rMU*Xfk/S5!pLA;$"8snM/At(4WBIHqq\r%3$Aq(1J_S_-oNT"ZaeH$%n)O/KQt#XQ9^S2&*S-GNHNLP+R6RUF7:lYCQ6[PXf-'U*H`\n(:;XT)&p&-OJ&P:\J]%Sfp(U-DI\rP\r%PJl+#ISUi-0Lmb;.J/9R3jqXY7PptCMq+0]/VcY;!R[.dCPMh,ehM2l0L+>RKsdU\H)OBX>W7thQ?sO:n=aYoJ\Om*2K&N7)Ajco\r%!<#&iGL\B40[OYPj+e0>VrGChcQIVMf-'\`IKRi-T&U-,ds!YGS_g,En+Ii6^Y=AtlaM9Jg$SGVc$6E6g!"YdOpCT&I7Z6Pm7l:R\r%hsF4n8$LaCZu:#h:RQ^d.toJ>dphE!65:%9*\:9Qn`K2$aiQiah)+X*[Djos;1tAi:/Z'=MY6eh=/POeE4it[('Rqk?R"ODhZeL'\r%070>BE2lk@b_6SQEHjUpI#(flW8QYeqFcUE%"-$<2":T/?)[mp`"IY3:YFc5Ked"@'A2B#Ek[MI7B%Eb?b9)a\?&M\/U=Wh!&NGr\r%3s8[Ao+$=-om)=c(VS/]:KFK_SCCa<)4&;Ved(M?)!H=-2_5G*'stnYe&TS'S'2#d8*b2J:^*HhVfdh^W1oWl:M[J+P_)G(Ql+dN\r%3^3mMfNN5@6&-aSW'[7PKITZKf7\_7+B2b^qT=s*To*1K5-<aHDmp*SfLh("PT_ZB'S6f]'n&WF/jLOG'?6\KOY)2`7;Mq%8HBro\r%o]Sc@MI+,!Pq$klM'drE,,J8D]Sf1X@VA7JV&7o0;AIe$.O$aDLJ$0ucpOWG*JV_4JhseaU3W<cqPdL!S[Jeaa$Hamcp=_L=GT'a\r%+5.B.MCGQ@Gh/lKgT_2><afd\1UaI3`@B@L&WOqA&1(!>"hOJbaNejsA^@bmT8?RHkZ"6KU/N?rTu'_S=!?P%;QEWVkcBAWPO7Zt\r%anCYB.Wc1-\u(6NDF4)ZkZ+Q&l>dWNK-p<TG#3IT41nh$6?eNaCH>#I-?KKL@"mkgdAtVW1o]Eo*dXqgnF:($p=Rn84E0dq`JUPc\r%?TkR$)\f5/i8sHhkWSoRi;^H,q]5SFF?Yc-2pM?`0/fMF"Wm7iAr*PP%!&^/>%"Q`n?0TjfZE!Xq%OP7s*Sm5m8'pHqm]#A2bp-6\r%%h^Ek?7FKgAf#MQSO@t&^2H!EGA;K,aL!V-/.O!_)8\CANC;b!hu8dP(F<(tmMa!L-4qtD42\YsHat6_Ru&q:-j+],_Th#3]tWE=\r%/n>BX;n)5"K.#ge@#M=cf,?3cc2oke'][*^9Nq0e-%3F+mZiY)M-1qb>J`Q#qm=.Lf9bFSf4N5?%d7k)2Cu3gi5pD)/IF4$C_<6V\r%1R=JtD\s4*bp:?49&c/9ol1*no./pL'GGBk3<4eB_V5oH^nR($[o'AP.3DH3J=+JI'&$@sZm[)*H.bR=VTPnCla!/F!N)8E_FJm%\r%l"Rt]Bc`qd'tDBgX&D>6nJ4jmg8um,]74Z["a?0I:L;m`WkUtEnj!O18!@t:f-,hL%N^s;#>tO?\:n>U5RONeOM\s6<)Rs(#Pi')\r%ceo6X3;:n'?qnJ4bTU5H(+cW8iaEQr$eEf-+-+GF0;tV^$PWCfnU`XD_`YJ19ahc7_:BXC$b^<:lK*$>drW^,X[?6F0'7l<q;H%r\r%;Rql**6^8($6mFs0WW5M<d&HL)AEf\k#64X1JFZsa!hSZROH,1AY96cH8HKVj#Yrq9l`0oW1cNff&/,f2VWd'FBP;m=Uh;"_s?Rd\r%7m6/>\4n;F`=F#a_AGtZ&3jQdN:h'6#]K5I@]CY=W3V:(-8f%c+rkKP]4<cf^mA+W($Z?n:mGhJY9#\8KsXXB<io\$']7BVG\=/E\r%p"InC6kQ`Fe(]<o$?,GClF8OD6/_rX4p?-D`D:6+^t49A!Y>SdU-NE2)m7*mfV4UI(jQ1;0pKt/j9\gen\h5X1O7tO\U#u+i5Ka3\r%qa[66%UL!2bmX%E2@5bON'%\,R?*[p'Mk[5MC0`.>`'m1&4*TJ%m5D11ZqXGi<cJgH[bY/JL@7A]!Q5FHT^h5KC)HQIU&U$P+Jfe\r%>cKJERg0XZ\a%S?<*IZ4?pRBNMT8+q4(8\;k0)7C1'Gl4fEWFlLJSR$efe"R6KjV-jbt#K>$RV;RIZt;ItFM(l0,RC4(.QOTiA]>\r%][*Z4Q<ajaMn(//\nJu:dRFn#M5Ji,el[F<FRB?l&fE156*Y=)"T<lZJs`VSL2rYtKMekOc.skOL%M:KB`mTHA_nS-+JuokDb:a_\r%EfHA.3kn'ZEf@N13Y)=si/`EVWX7mMT].Oj,\rDOFCJi1\JUg80/SFQ0%^g4$1169aJo2r#.&6Er:^"Nr+]ac"JKE4jT<*mm1FFW\r%(Eo,N<=kT#J`RLcb(U2IA14k>i;[^lm\UjJZ.i3N_\"AD.gK#K7*tW[<J)M;_Ou)SQ*;\Yn8a)Ree!E1/c56r243=,&*9O`#&>W?\r%M5eOR];Qm\A;8fVNSEA"\Cf8(iE*r1))R^276f]!DZqQY>7-*SE1kUARO+R*!":N)Y+E5/^^t<YD?D(pY9=sUO[lgDK:!#%"ueKh\r%.(!4WSe"3f6(_%'g^mGAZtS,W3U?rCY?.C8(ZkWNq_WdNI<=`g(uFKmd!3$0@,iWd0Z*9=#IN=S*nY_8K4*`1/qQi:lu`qW][KTJ\r%nSUk5`]IJFU[_R6Jq*AUGJU`b*!VJKI4g.:[%0s%qXL/U"%$?en7.-K^_JS-,/Krr6K9F]V^"$EX,2Rn"Ck69kGD:7@h7UrV]4]W\r%8?Kfr%5&7eCBDWqiVE+^dK=Z9@O8J(o>(S)p8Ws/9?"PK;fUT31GOVcjXSdD*l2H9XdmON&qkl+&+cORm)jTNE/&M/oXlTFn5ci7\r%Ql,LZpR1j!aco;f]$*BYlSm\O'P[@%<W^BSrCqi2aYA1/93Dot4H8ndGhJ[=7kjG,N+cp*'#HYnp^O7arRpsD=anq#1__WGa<(#c\r%Gibs#(<+cQXU\RZf1FAV!W=-()$TVQ_VK-X2M?NVSkT6/_14\rJhMc[>DT_Q]h`FReE\]RER01h*oouq(HunSMD#&1<IoQ<T:HaQ\r%NV>Pp!0:\F&c?Qs.3p`NbLUo!dj##J%WY1dT3,GNHP1p,S0d8XFH3c>hBH:!XF!I2lamDj'On8>Rc0INUu8Km*PBT5TpOD:XUGis\r%`#,6j-+^#`P?A'%VG:U/dQs42@d]u2:@i_$=nSSK;GFd,>JRiPSZAhYHIqk3<)q9X-`o+J7`=9;l7lA#U]qNj9&niPFQ0)*)23c"\r%5$XDf2(Hf)f#,CN_sIhRn`ol*r/<d?KC0(9[]uoc:^+!-6Yf:.:T,D#T9.k?K[s[;0V[RO-f\-h]hjLLB@?==s5l,j]k915U2)<W\r%JbtVcco^VD4q-7W0tWrT]6%]0C,ib^?>#ESMaS59dZ$%BN@sH>?XZDcHkkC'.#cY=jDj:>(*7T/4]cTC#JE<9q>#L-jHRs<24>=;\r%`EcPm@j`kPHOI#AKXY-O?ME29[CnbepgI3pX"aF/OWoUq]e//JK6UV$+]+S&5r!l\#Z^_-0$E8(4G[ViPbj!j4Z-$NX/+lDM^#f8\r%:-@6.o3*s7P`7.!Tk(<JaC\n1k38l;SM\t&WHetTBO\2CVre;1G%T!b>6c`02kVOr;tF0Ka"0?.Mc2(Ph-1Qa/"N0pR;T1%R#<mu\r%Vof<j5]WG`rLRa`b>pl\2rp8Y-KjX!$IiWO5$JsR*;eFBgA(O>iKE7abmZ`K:V1cR$41DC3P(h%p.Y3EcHt%qcnk;H_[ScJ:3/eK\r%d*pdC8d[LNbg5@)G\l*BAE[`JO:8hGYX?a@e*J1pHC>msd7t2cq^^'HAE[`VfQ-,7TEhH#4MG4WiCc)#0!!C-oWUH%4!'m'h=Kkf\r%4\.c.G4->L<1munU\b@,1,JiZ6p8d+P,NRBMNBYVbn6,;Vb'4A'pb6;E%4R%SB0M"o`glKM0ddIM4S<<n3g(%)gF]9'r%)FE%.[J\r%.;tY(,]2rTY0aR,##OO!(TN1hZpNC8`U]PeG\g-!:TGH0U8R)^I%aBU%'#%B\t:X);?ohbo`i._o(B.Q(HpMjTSoDF2pd7.X6="j\r%_l7`tE*db7f,NqJkNcE//pat^5SlRjDkIJD<p4!j_klRkB>+gsdBi!GTaOl4+om<,FJ2m:8h9Ns\p1'epnp&$XNB*&0<VcePd0CD\r%_%V)]_B**0ZOnXJb<El]+Bu&G##2<U+[gf.m2EdsL/QG/r;,%'dY@E_6<>A.&NEAR""5+CQ5l97-/kG0eE:E%&IF`8ZT^%s$f38N\r%(J?!S(,+9uo`!df-VpXc!2L9k"Ju0*]ioZm%_bkr8qZ=qLd6H?Bu91Qr(o"3O%2:]Q>REn?f\2&g-?KV-BVfh+S6="U/VMO"jQ*>\r%U5TG2;IIFZeRcD=%"Er6[pjlQ#qFF;]G(Cm%NtsUR3@BlCbt0IPsQ916[]6J++]cc@X:_Eo0KXHZDF$+O%R=nJhMXpn59&L&XYD,\r%Ls)J!Jqg+-TVkG:MR(]icqfEf_r3b&>^Q@AGQkG05S'P36?M^^Th):;gPaR`XXLGJ^C"^fdu*m2"GXE,K"t#-m@bF,QmFOT51<<Z\r%&;E\NVKg&cQ_UB@K\B5(gVEFu8CFnmoHP!`,eVMb8,?MZQ?3_5X1@H5)&g3p-!-Nah1JFh:P&AG\@btU2B$%b=[>/&,7eK;(Y]uU\r%\!Lif>Q'tR%K<$h.*t-t^.[W>^<HSi@5ktPf+<nt&6rnG&)ZIZjUb0M!lI*J!ZLP$$>fY$(In0_c[`I9I01GWoF>]Mb<MZa?4Xl\\r%4+.5Mn+@<0]@0P<)SbA_pa>P&'l:P/>O]G`k:cT\gZ^Gi?g`aWK_1Z8Fp1#a;rEPcX?*],@6HO/7q=QsB(TDDcV*9%BB)oh#k9OZ\r%6]\.!a)uqX;@'>&/O^I/hFaA[#ce>oi7U\TfHg;o]RfN)7in5Xn/VMa9Ub@LJsbs'!,]0rbTXn<o&GtU)]KSgM4hG1?d:>QnqL1>\r%`]90G][+etc63=R3VM3cO/Kc'9d4Z_:\XE*?%GO'@(.>:OD3V"74gZZ&3tU6M8,0)M,6h$T8bLhjX05D5R?kZ_KMr*6Z^4h(gi"C\r%6B/-=,,AjU4Ai;G#_C1ghVmCJ,XNr,T@Rt\f@uJp?,>9YX`Z[]:r'h\E#Zi1-]%FP5_fRs9;VOFH4jY%r0T0o)orS)RkTG`q,Oa,\r%Fmhl8T^Ek\0(5DaMf<@LQ7t;*6GTW1&kN/SUI;Bnoe=d)AXptZ3&Q[L]G<F(1l]lDikZSEXO@FY<,%#gd&Ei-L4mAr:fY>1)BkIj\r%48CS+&\:[!OioS>:bR02Yci"=]&8q=dY7.\)sUk;6ZQuQTaF+$\0;@;dK!8Y.QN/3#aHAr'lQ8RT:>ip?69>VSjTH&7\_KF7V)S"\r%hGH:dWd@\TU$@S>%4?AI:L/mXZ3>@e.<J,tob9[I6]sg8HUr/_FUpW:E,l2s4pq.+%\]@#Ju+A^0.)SREX;&Jn+'4jY<R]L=uTCL\r%g#"jjqR#=]3J>eQlC8frp(L9c&B9=,M&S)<qZ7K'2ii+Wn"ng@c68,Xej`/bIjBfRK9s\'N"G9.Q64Xu#e?@@9G`X!8&EGC%q%1X\r%o0h2HAb_?,_AMgiB6?QO@0b-(rTQn(0fe#2$UYCI27$IJU^P0J*K?6DpR1iBc>lKC*aWgp;irhGoQBYZ*5Yf-b):u4M4nBR9mT>R\r%<(-u?76a!,lb@Wuh)dL.4qP7OK2D)i,RZ*BY!AZ\D*LPb1W,g+hWGc0MA[[ln1)X).=d9n,_JoJK.biF@:F[81E;liXtg7t25gr#\r%X)N]%!%Mk_)2*ke<)FfoM>`^\6"LTWG3Bfl#EXSf/IoO*g>Ar15ugmX9?G"%:G6q4VO'rIT-=N*.B&cK7MQN6)Wp74HC2n`Ij0A=\r%nUnt+]F$s'lp&H#.Xt8l`)*m``2n\L8\uL<AhNn3RNs/.n1l74fmfG:,_&XsKIX$9@T(+?GXCuj'MkZ4^&s`hf<,BEd"*cJ"'&bq\r%f<WBdCiaf:[^frEBss*c6-U/P<P4u>R%sQ3i[:S&<;)tsMk3(V)7#@Z5>;oV4fHIhQPHfne8Qm?*1Ugtfn5_E,^]#9A0JL5ROf_2\r%:m6S_X2naJ_kkF@ZLB\R81*4+A>*a>ra4$'/5u^O@6rcqMc[r;s)_md:%"[&UlU.K#6UQj8o8:;K/ma_gTj+"#<2898U>UpLTtm]\r%"<cV5N;`*T"3IhV$&GbTdB]@=(G_$G(ks$D?Lg99^K?en[C?]6LY;je>@mVTTZ-MgGc;:M^c9(7U\bQ-M`=-.%,=Xq\P(!Bp^<d`\r%QHjVE]LhF_6Js?CSsDm1ECYGe<Qf"d7l8_[RXM.D;>L>[FMef#SrHs>FCL$P'N9@'M)6R<YCN*$K^m25@X*_3>JiEe=Th'.J_rm5\r%ru+#UL++PSEHV=jrDeNZ0H3.2q#mmYY\a(hJ44o'n6870$6s>R'EH79-"GsA`faoWe[/a=TJpYHbm;9?(W,AG.W-Q(Qlp3l\%:[`\r%:Vi`Ekf0IgS$8nQJd!fg(=YG7*_SP\m3@?u"J2_im+-D3).5r4lo'$$'T7,)j8hAl;k(2@r5o'3WA%p4abDL:LMn3QF#HG&6R;)i\r%:i!BAIh<NMmlr8&NATKKdNu^ceD>/Id.W7I>AULeEip+iE)RC;p5]l6#.(!-%%:#Gp?<h$Tq&j-ruh4A%mp!eI0c6:]Z:ccSf_\/\r%]0-JRn+S-QI()$Xq[`TrZet.IRf-QbZC11S.SobVqNY[-gU"9Tg[/5!khG9+g'>1;^W\q6'/KXa40n31[^]+c$UR(V/cguh(b55p\r%%iJkAI^bmQQGe'T$C423T.I.bEf5W8HjT'q.KR29+l!\q^He.+p$^,.r\VT/dJW;")1Rt3\8)`[VY%MPQ-^b?`9XHXKHALHo,F)#\r%BR);*H`8Q3ARYSu4A>!D91/S1UhkbtP2.A:C:IfCUPgul9Ic7*$R_4]PikUabiPHEQ+c7,Aq"od@la=]7/(q"mFW]):siR8+if]h\r%OjI,>5L"2D:^<aSS`:P,hJ)>oOQ4tdhOfc\Q%Z'@)+0!W"l\X3j60-fBS%#N<K<h@QfL+mpjK3"SYtO.L'7P4gG%bLp9OF,%@;CS\r%P2dC0F:2E"X`GIDW,irf@=37lRcGk$")g3HaH.*+C-/r2+e(2'*9</_ZbC71UZre`bG[HlUT8a>-TLBloNXlA#QZS66<&-&)BpZG\r%;2p^3lo%CH'qC`Lk['1`I[o9YF,&qX#t'#K#Bb?&YjJV;O`?D]$D,]c@Id2qV[qI?5$OQF\p8UsSm3[C9d:pInI'I/jC7SLs5^EQ\r%Ta?`/r"Ns9!891BFnjY=)g1r/di3G*q.+kjC6j3p:3C]*UZrX!Y36]o:"4S9ac3lQ,e6cr`N4f84(rdrhSI<n\q:,jdQq)Lim9nQ\r%[;kE&T%Z0rcZ97;GL,SRWh40Zca"fsc496"g#9*X``QS0Q8`P/YJ5[u]$7nU[WcJ5I?*pJbXPOSNUF!:_Z1.o=cG?&+a<JHhn.""\r%8'L>o;L__[10Op(QW3O;ak4GQA26K%%r[`>[!F&D2)C^VBb<l@aIbfeM><R;bKP0.LKA"Ag'GG/Al(iA@gC?*60bG*2Pusdc468$\r%grtPL72qqq@uLq+1V_AK1<Bp2W&VfbUo+rFfF`CfGRlncSEU9IC3^J39Oq+6"WY[6I/MWEmfL7JC4(FhF%mukk5e.WlqUh/pA<#!\r%$/!K*HY.8iB.bY\ONb\E0S-#@.OL8$7E#D0UbKX'r)>"&2Q'hl/h/>IR>Y/*!m*Q(>bEhg'cH50SI?k==!@a3\L;:@'+*9SJQ+6#\r%]jl\A="0$,X?m_e_=FsVF)5$lA/KJF:`5/HYq)o$Ikc<PG149<QM2&\MM_pDVW(S]60/t67SoM1M@t#6iIk>CVinp5l0OS4W(B91\r%'e_o]P%U^r5r'04/*O9*$^2J]`=%k"-bQ+8#1kY`Y$CdL5t?)pm8Khb?-3Y^Y0LgDp"6p#aX@jHOGlS9#Jh;rLuB#OQQ=:G$=KjW\r%7*Q3)1\!6]+F/[0*$d=;PCk?caC.uaM<#66_.i8!RAe4n1(u<.%['nla[%Zq2*'m+64T1t/k$85ihsj`Oou:<#?A<TpO\FdT\?;9\r%$i221]Jqo5>=VkEE]04R\i;)od:>:%2dU95d*Y6#L*X\t\=#"r9JjTUH@_S12)&qtgPL[2O-*mohH.7IK-m#EFRVQ15"405hIkD@\r%925%ebBC^55FCd,WBNQtnd(rGkP>RjaGDj7jUJ8n3edN`ed6p`kJr_lP<A26,J4`%Pc6m:X?5_:g+-dA&V]qhAfn-dbZIPS+fsZ`\r%1#k#n[lQml',?<m"'eA6Y7rrYQ31,#e6Du](6`O&0t^3+./[#RAG\@sYG^AM6R2A+igHhG1()XOW8iUKN\Um`Q!X`C0W%g'2/>Ar\r%16ua7j&i)0C94[VR,+k0c'6k^_8cHubaDcmR`*kPEcoRk[Nc'Vn()kJQ>s1=7q4/iY?[h\S#;DrF3=`&KC6Po:t)O\Tbk!$GLp^,\r%!g]igK?"?/op`AZ,r$0.M#>gZSYmhdk-Vhni+iG.otOZXg<J8fK8!g?NjZ-!GjMJo\5ui"eo4RAf>J2VG\01HET"PU[/*%+]RQU(\r%?i7nI_qPF7qVbBPW<C2>(MWY^5=5&cGS7<Spl[$&9lJJHp\L(c^>#EEr<GN_g$eVaAH.3fC%f/%9=*OC>9<.gp+FU=[sr,\J$4WA\r%?c?=ndltq1?=s2AT:)QI+'BrJ+[Mbj=2][@_u)$^=GK/'T2K?DU.9h-I_\\S+mPOsE9`.21G-V##KC4uSF7P>?Qm'tb[&3uE9PC=\r%:)KAf5(KQoo>/qiV5ZNNk!I/%FIcZ0iT>mciC,2QajrA7#B[$)Rd#2bGE4O7n/j/n@T_I89FN98:G]7^n340B4.e/JHP],PO7aTa\r%c\EIm5XK?ZkTefal-kjgS<J_n;66N+qMYU3`NqTdTs'fq59!rZj%Q<;)>M!qE.1@AZPE(k4KV+H6D$`6,kRL\&OD4_6D$j5)bV(_\r%qKgil["_5ehO`),CW3o\.B03-mKog*qYE084'tX$nr1BfDHh3P?YfS$]E]8`ni0rdfWD?GdAK&rEqa\EW/SI`h6WsM%F*P2pP)`@\r%PeP>"&XANW#)VF5WDOj.oe;e6E+Vie2!+4s5$KfGNB'M"djLg6ksLeA@M=[ffm?Xs=7Da/LW'>=L5)Kf>@GrVSZD@X5.0%G;-@"&\r%l$Hd1Mq?_XDN@T=]cNZmVh._GQ\;&:AtB>r-*9sp:s&!$n`H&&WEDf[YP$pYIB$ck\tit<<hARrQ.ICsUXK!<?d'uZ\VFK=3%n(n\r%dleu?RNCa>H+JVRYtoM(jRqaIHF?&KIpSc+r*7nJk]N=1dmTJRa'ES`8*(6U,6CGKqBL<IIfQemDqk6krrZQQ,P"R8J,'Jj=0-Q4\r%A&RJL3mdC9Ko`1q"hbF[J^=Y.(%8_c.4Foiq,Wi8@oFu>;muAj`4^P=>&Djir?p.DG7K&8;;^`En-?(BrEK#MPJ97u&tpSXpGPm-\r%%AP]ZK1&XqJG0(t^cOpcQ2)-\k3nk<Ma*YVo,G(_!`"TbpBB[n6lWlcb&P;J8"h:P\q270Ip%*(_;`ZiE'kd,5Z*Nl:g323AUV5A\r%ei/d2c9+jgO$.:W)a#o';IIhf]I)/ohUc0i'l?h3ffeY/q@6<+fHf6r1R8u;MQj?ET4pWWL&"WO5!GWD%9GScpRCmB&mhDo)]O#`\r%!IC1K_*J2Si4@rjWcFcTRu*q)W#l<Z?l(AtJ#N)*d]1j/oZ(UH_tS%;I"rqQ8(euS[Jl0].$9:O&;>a\#uQL#LdH[0$-IW&mO!g`\r%bgueg8OURY496NPb@Ot7-a60a*b!t5mpKDPO@Pm=AJJ!7C,hD)b-;c"r5JkuP_eW?:I("YZLo$.$/.(bIN)B5_YE_Bj9R35.,rqV\r%;@I"(`)2A:?jIRkbrMC+@0ii;qgA(XJK_OO^5Sll?-<fLHg-:R"C$X:KJi!0C)dN]O8d'O3-^."-;_-,CbIfeT=fLF2sLjfcl'q+\r%2_Ku/(ZGYAD[LW_#"sf!j;J^i85[>7ch:ua6[6;lo$P8Rh!^&JTEP`&esK:;6OPS8i&r#R$T;/]7[b,m8`>A[q3?2u!&[gk#$*u$\r%rBMr@:C=f'@33c;W1A<SROTf3>tYFGP;C*lSZr^h!/&NoEn5>?'-7uB_nqMP]'EG+1Meujr8aRbm`iOHF//n3CeWt`;[$t,9J".f\r%63l)qS'T@iCnOB-)beK%A:nekh0m_LhKhB6Xm#icoJO\Td"0O*<jEUpP$"d:Q[oWG8YLcnq3C0Z)ts&a%W$t\]W1*"3fpq<O&lkA\r%:;/Y]'p[pq7gC^@dq7neX4&f`GL&JAN0eORJ<hEbom"u]nfgLm9>7)(&\Kg*q="R!eZ^SNo/FU92ih0j*n/ZQ$P^o;'HB6/TBmm(\r%`fUlb/j-X;q'&+rioqaK;UNL0P6##p;H-*RdgFA`O?Zs)>e.$T?XN<mq2,%,5]9IEiESTTDNU]3$2srfqa<V).A3=PY&Qhh.aD%u\r%TcOlZ-nqKPdQgYU+[jTC$#TCf3fpPZ\7!bG3t0Cer=4H99_-)F(be5cpG@X9Z'W."CH2-+^@d[9Unri!?Jd%+q:Y]'Ga,,S?q*."\r%8nn0l7NL=sNO,%6"oqQ4M<*=ZPJB&Fm3skRE?=]qH!SAJJS^)L_nGDb>/R1sO^kG:59%'Hl#P%`.F?XdK9-8OUYjX(Qu(^cWC$?o\r%>ZA@V/gc%Qb9WoM:PMXO3=^+N'>@Y*M,60Gl36W4lV"qCh[VG#d)8"FDGGa`jaF.N2FsNkeS$&KB:lp;m1S\U<?1)X\I;hX"i&3h\r%#qWPMn_RS*C2o22Y1Kb,CRroR9o;7dQ_B<[d]BG1Tn>D7]R*n#;h*U)MZ^PL@mn,u$k[:(k&&W[5t*-W8lnAJ'idV3;Sf=;oUdaM\r%>]uj!DI19i`&n/)5TVZNSeB3CK$+o$Y#4tADVe7mR&XSTWZ'S'rSKM45(X;-(&>Y^h_^2t6,"1a6m'"<*J./;0*TK\bGO&1H04&E\r%\_#+1db2SB7i]h[T&5:.%S.>G,TsK@ZtMc2V">@Y7s%"R"+oPF*KX$23;8q_po/>mjMYOG3_6Iih1N2#UGden*-sq(6e=;&r#$jh\r%c_fn!9)>Ob#mXDVD6mNZ7DKZ:iW>^b04F2aH:CS<c[b>8IkO/R9[$<#S9Jj=g3YZ+Z=psmQM@87\`D&,o_K2]GE,.?BB.p0qS$sI\r%h`HkiodSRb_2?-'qX=WZX*>C5EnoSoi=gTjh?ObiL9bjg6Oe*9C3]Jdh]>,AIsN=Y3nahdN.\E`!"Ac-+70a6m,K%9,W7221r>`!\r%LK`YT=uC4-j[3FU/-M-HngUe7%;5+^V.98dIQMp#GdPejLdDN9ic1G4TC!<am%20CdIB>4;Rlg.E=@mIF/T>emGonL7IeutoSBp_\r%Y-`3C)g/4GI%RH!1%C!h%A$M7#XHb%LH21(MUF<JaKD0?K&fg3>Gnk?j_8gNL$I).+6c=sYNA,Zh':6r-e*r>+^.SU(,*MDo6^XC\r%-reTG<%nLM;oL#:4cV".FF;MTi!P7NppfO7*Nm1)d94/6/"A2=eo0IR<E=+YUkVfDq]1(n*$$H4W),p%I+n$E6kPkQK;Jr;Z&E<'\r%1eXcfSKj_CYJh&,-SmW>"CX[UZZh09KW8=gI"dR`d2T%[Tn?#&_0sY/]edhlo]A'UH`%O'RN>r!ds]r\$RREtN2PTOC+);mSS-\4\r%dDQT@g&Eh/&8BfUN1=9oa^nFB:m<(+Kb0i8:X'qDp**:Fg)?'M!uD=epU^hU?r@o6f@,E2;W-SaRLsY`:'hU*.rg0CT$GYr9$!#g\r%h]4ug;R^mq_6ei]Q:XZahP5Ze?_Vl[+[+bf?[f7PpYfOFphq^2mD,EZ_"?MR&>onm\&^@tXniB8o5t<:]MCIZ2m&@$1<_=Q;UB4s\r%rFeF9j7XMLJQri1^Vp*_;RS3&>hkQ;$Z3W5C:.3%hIlP[*qQ_E%FgZD`q`,bq>'5O>4Iq<0ZQt\O871spAmDTR%Hm.GZ:0QdqE.$\r%ND[`OF';3mYL?*Hgg5HJ2Z"_Zq7UoIo]^VjiXll2+(&>n3mAV]qnB5+XAe_,$H6e4n8=hY]E^jD]U'$!PoGb^rY16cMmq'JXfm`I\r%h-_[YT@Rt\;cFN^JL=Ndi/Ioo\J#O%s"2$f!P-!7a/@BCqMCeFi9`gVZ:-pap>j$W+'p=$kDkmk'fqm4"n+859>+DoSJj]gjGL?(\r%K:)fqFRX)H*]t&(Y8Z2Nnu@=4^[_4n`HqVb,:j713p<@YTto3<f`1W\"K6an('[.NI&+e155j!"hp0)1=Ze#>55507C,kn];gNkO\r%h<m`2`5e+H'6-=&(YiN[K2.$T2-T4\A*,GD@?.?+[c:.93BlX0-E*M1!r<8K)39jpFo'3GkKlLB'p!+28"MI)0rH\/V89,0ik]'4\r%+lcF6FULhWC?'oMe=dL2*>1+c?s"<D;s9U2ThG5c>`.g'FNg\M]h`E'pWQ&'WFJEa07t3j8AHMl<&!jPL9Z6l)5o$X]*FCOTs0mO\r%S7h//qo6A,ls1?$pi`f2oo0#SoSqtcgXnI_$p8@%q?CW+*B$go0JPf&F,iJ$1qR4AA^#)-0*D&1>C!Ups*Eb?;qlN!OaX.n?>obU\r%;4Bd$3q*\4Q\sBM6k`\=Pk6;2FrHH=4*i!qJoLdcWeNM`28$IuOFL;P'!H&crrBACLk6Tg98N\?'e\6ao^#:_<0p:0?7j)rU$[+o\r%#fhNSDJLXHjU>]`/tJe.[+0-XY(8f\fAO-Y7*:Z8Wf7UoFlu1>Ql_tOG?3q\4mOM*^^3\f8D3+?&S<2+j3S]J/L;L>Z5Bt/)Y\Y`\r%_j0p*@"MfqMMD#f&X*?=DPC)?VB'n@Z(igL-`)!*@%"2\=(nP";OEp:Ubkm_(/u+LGXL.;5B#Tnh,+*1l6=X6eUO#>*5'E4nM542\r%((+'STPBjh]@eD+k`I)[=)>f1ZA$?s.nm1Y%U3>)cuG"\i?A1X[`4F]FBN%18I_T'`U!/Pc]/uR8jXiD=)=",ra"43?A'l8i;kiU\r%7Ikhqlp):`;DH.sq5&naH;*tO1NAj3TWp2!`kr`c&;@,iq0kU7U/2:uK`umc-sgJ<9Sd0NI^=BLYFk1Mm8NKSRt))#l<P7`QVelM\r%<+A-,%1%451%HenkAR'bg,_C8it?OV35?^G[7'M(%ZfH?ZM/&Bb811CdSKUb2moFV9%r'G7s!<<P[R$K4,[HsS,KXPqsP&/rrZ_%\r%m^3hMLZ98l&r-I39h6[h@p-H@F[T$_X:BJp/VRZUj(3$Y70Q\($H<)$da5]8.@]jNBD74j)U@3B[PPnrPtP1SKCk8ml<kX0P7YF#\r%^YqI(+M;UU./0^.%YQL&OA5DuS?4o->b.Vth08qPaS4:Wg&&.2C[J-*g@]F;^]^jB#!PN0;4-Y+>buuK[g/qT3Rn0/,W34=&mKlV\r%6\319J00aieffUf`LSb^WkjZ7YKPd8'jU(dU6]=/O"`en"?\^sL6j!/YL(#oBH,<rD\qa%6W\rfDN[72*EiKZjsLq^en&io5Coqg\r%;g4/uERt^i4H"eaK<.j_Gd2o3U.2?5]1.Ei2d>-]%<GM!YjE4$XC\XN^0mCE@_&'?U->HjQpl1Vl$e-a?bmQa.9)!`0Y;$4fItUj\r%OjL=JN(u;#69u&DlKqt7F[=LbPu)33N+!$=knuIA:#OEGd#6LH(j%XKm!VpN\Jnm3S[;nXEGUWmH,ne+fTOObeZn>`co_/a1j0@D\r%HZA2=m[QiPkOsr5!=a_"0>i-A./dmfo'>f;eVTmL9<msPKmcHls..]gV.pJ$opXZ2D..DI&96i@_:`;m<q3n![9BXs=]e_e;fMJ?\r%F.BnW"-q("Qk)&Ves[c#_FW']B;sQfGajtffiOUo`_1b_B%H)?.eCURe3p2&*!c7,[iDmL*nH]A:(qROk;$hsfHLP/268P0N4Z&H\r%%r9ChUoZ:HbceCnN2Ph?m5`8qZ\;40)10S&UoI[cN!7]]`mQaofs-f8bC@6^Z:MG%"kS47''B[pAZf#d/1YPQ]!=*u685"(pLRo`\r%7)58aW\UG"7`&^/G[c)=WmE;ZH"h6j(q^lO.YQ6*2:IGIM)WQ['kBb*US]`Af'5Gs8'i`Ll>tGm/i;lnSc3GSTm[(4TQS8b@J[&j\r%R4#lt"h:LY$(eYb0G>p>mCUO$9Q[Q.66/m80l0jZ#WN?B!70Lh^t$Y.o!!c)0RT`T@C:ZZ$MNk>BB*J[%mH+BKOJ[nBLGn['t.Q`\r%*p'd]D7?H$G^]ioK.Oi#?eWY^>&0at0D?j_bkR3%JTNbXl:rB9+Ap6Dj+`V$4VU^E1lD)CHsV3=X/EXP?EZL!2Cq!$Zai8914?+,\r%HmI@%jWj,8?DLW&8,NX_ql/*ja%<RV==0K(T=hK(:;4QYn7K,uZ?0IC]CMB]+2WZG63%O6SPF@fXVlj]kWSoRi;YnLOOF/[_8'F,\r%RqD]k(RUfun1/`0:Q1]3%>HSc^Ri:1#^RT>P&;RKR`26Ek,?f!T5Sl%9]L2&8,7)I43@fK2uW)jqX-3t9WDC/_WS\=K^hNKolUbr\r%hA&4:1Pm3=1N\g0%aUSYUW%uD2.gp,A\;pU"E^^=QM(/S[!1T:Sc]V?H!KgC&9rO1ORT1&_V_#ZB?St-$TpnVF"JC9V:>i:;1o*K\r%DG`bWCY,MjkY)?NT?_12EHMe(/dJTJ@JUht*T:hQ3s*LdH<eJ/W*#a+YO>U"D_a3RRZq^@3Qhj`n2jf(GpQ6&K[,UB)E0Iee,g`K\r%=C!Y!LVOhf^?/W,lH#V:_Zm8JiR=(0`/\@TL.@\Iq1(FVnu;=SBn[%n5Ku+UAJ,f-P\o?n+bp!<Ksc0jJj'iV#*8L1j9!OU5$hZW\r%#fQ3=fZO]0X4e(o#*7quM@FQu#*4Ot/#M30Kc*!bbgO.21B[,c]k(jI^^RfU0Z0uH;jlTe8G?!%U-Og:bWF&X*Z+Xi^_^YX/2kVt\r%+UH=$Gl)P6k(+Lo=WrPl%@87Dn%pY9grC%Jn@5>;.k4;q-O3qfEqb0Gj?W,(W6h83$bDWDB)3aEOi*B3h-+iT./SfZ0e%,K.(#5?\r%G4Q&V>Tebs^g;&[5<3Q\0!i#b9cD+SL!u"TmR$8j9o=eaZsj89(SIWdZ@aX-fO7[qRI!`\Aqq5=AMS6TG"</T(2*Q!fE%K&lGKt0\r%5-gZ71il[XTSa(84PO5#)BsimdGWDK71FJB;+ek_K@I#.I0W8K:lSD-"^T=[PH"+c]^U#5m93i;3SZABKIU;!%fbk!0VkpB"(M$.\r%m%-'3j=)hY7F91D9W*+YVV3ql0#J(LU`-?SGp+MaZR*YS(K=PV$^2LSjFnsqeA](^;nODKWR/;.@VkQ2l\0SW3-S"A`fV*7!\Wst\r%LEZq.<g[;n_kj:TUH!J:Cg][@\CGF?B)Ndd%B=I1mfa`b6+'LR(A(=EGTh]&M0g$\_!k-h6q_*qH-_"-/sBuO^@DV#7oM^u9?_5#\r%]+T1,X's[a(iKJIVSo5u-9/Y-Q@-81Z")7<[t-npG`WS?-*TS#jbNgLC[!-uRl0igU4P*29iXXNdg?T;B)]hXrcrR[2[eRkrkKFW\r%[^=dl4N?Q/EI#cNgB2Tj&,]1(X)/`U`^>t2l*r+7Q)E(Za@n&4'fBe:/J]Or2lpO!rIMufk$<";6%>YV)g$MejtcAroI#iB7tJ-@\r%[,M"?q@Ho<YB]"8@`IE36jtDo3!*>slW0o:GgHZBBQ.)`Z&i4%baY+>Ms.#DZO'13=f:=3U[V(<P5KA@hK-:lRWVmI/,`blQM!bH\r%$VdiI5,H>&]==Qo2&._oXB?p`)<@K%c7u[E:$>XY\Et_gZVJm&Xd+TYdK@_5?4u^N-#@q=]&b?1<@aiY>6A;2HX^oS`a%A,\OLEo\r%:F/`tQ4!ocY<6"kC:\O?Og4:tDs>l0V(1'7VMoiMhHGWbcWD`lh4p/@%<BDVQB([aJSn+J]knQ5=;0GqUYQ+^$R0\oNW$_(?^69N\r%TQ+2R:#YPQHUu*8@%!"*KG&PG5c^eealN>p%c^VC(eXO[ou!,TcK:c!D;_`Jk4o8[o?[FZP5/2WhmZn45Q/XXM)9U`)^4hONeGV(\r%Y2fn=e!W&ih<q)lmr^$hrdd^Vp:Hk&fmhp\Rf.-EZJ"\h/J%Pn4-sQogV'ug^Y?T3Y@=\nC#@uh-SteRnZ0O*#$fD;rPu\;"(,s/\r%);nkFqj7>7J,+$Pa8bs(Om0(=lbEJrp]"fRrGTLOkPo5^9ES&l5m=EI"/3<-ilW#A[YI6k#4fqH1q"[fS(V.@a$9gR[cC">m>P6f\r%:1J^uiABDcp(U9rUA&@*LP4.6TBRAD22Han;!A7f'qe[u.(I-)T_El-qsY;UhA8*t53dN^J88V2mYFuG56QBHSqOs$NB;`hM9>Lc\r%pLsf_qM5c(?m)Wd;+6su.5o[Ve1:4!cA8::E[Me(i9dBKYE.OBCaUM)UFFV`35I5SEgVA,)D,l=n$<A(ol;e?T7S*i*$CP'F<96?\r%_;O^":8*/;W/ToGV,j8fci]!q+cPN2D-Tl9(k:,D[D/PH\"XY5K&Z""S66$]V,fcB_h$c%I*=qoKgN]=To1tC^5G+N?I?ppd#O@[\r%iqWWRX$SHr<(J4'*3U80T%&Co+%FCREYp4Nk%@<WphpEploh;!ij^;MYKuUA?og/sRlrU`2Y=.Ki#,3QjK5SeJgmYc>=skK##?'q\r%N9G91"oJdOc%aqEijZ'?5op<$4f<W9$`OJu,u^1TQaV>6"hJq%Fmjn'4c7,RifZ3aF]@)22*n2dFb)-ch1AORa;C+%+AiVAFA+a#\r%5;eW1>hT^&">qRPLO,eH"C9JB!V^AK)aX3/56OdTW"+E_'rUY3m%A"gF8I?bP_KjiFQI+*b$Fb&TPOBOj5#0kOfgd%T#0AWn"58k\r%*4542qe'AfD?lI$5+mCa4#!2Dp?jOA?G=L9/e(9'`;'O:6OS#BU6!,@&_j#i5S;?(&lp]B'^Q>e`pG^Oa--+];iSB*5]k^%Mj><8\r%3j'/\$kTUd&s@+LGS(E?TMHh44GP&ed=mVaVA'XZ%%c1(V_Ink5J['N!Q;Y2jn(mkL!ijLTU8bM;#:h)R;*X@q=Po>]n0X]rW(A\\r%/_k4OOT7TMBsfW/Gs/K"br5Ao*m3Tsa;LqjeQ+HmqB;/oWP\kn%E.%"_CTU9@KU=i))2pLS*[Qm_pn6T#n*_/;tAKR%H5!`buR)9\r%<uj$Y\^;>%J[]tq'Z4F8@\e45qCd$H5YZ*lYSfOGD[VnrEEqG6WVdME91/8CjcsJsD!nL\`u5dhe[?90[Xoskb^Ea/YmP9a]^RVA\r%P+MLoDXF=+M'#K>8;?PMO2a7nGpsP9\#Hn(X$/u;.fOBJL@Q*sGOG:%rMfa]RCd/%?ACi/4'`'E4unT-n3+8.N-@@DB"ur?OSNeW\r%dB*)Q%l3#/5aq@@(XfC/4-:ofpY8:qhs3heCZ"GMg'=k:RC)F$[l^",emImIKXX`'4^BlBYZ<p?Ej<q0/t]=]f,#7#WunfP!6N,k\r%*m)19RrPF56ICPIc+SdZZmes0$k_@eXPf"ONUi<-:J$r)8no"cUK=@%]p69,CKMYRmbQNoIsSH@K&^Y(eJ\<^:,%49`XGC;htEX#\r%S1jtZ!7)DmU*akdUN>r@!hGq`e2O4GDC@+*WM87TYImX]=>(umkC:1C[!(s.8hVg-pqhTrQl/(:S9uS&OhR#:o1"-aahn"YMoSE@\r%Fu]o\RIu#n[clotDS\ZIhN*7(?_C<7S!aTQ-a2)8TaR](X+W+.,%.H^.Th?^]2@dD)p0()\u`ZCn0ie6CH++)+hUim=X8+*P-ll;\r%]aJ+fo^'L!;6%u8[S>t;F_k9J\eHD5gQn]8Cjr@b"HeXVZF,.GS`o8\;AZE39,g&%AX1sd+/LShBn[%n5L3O1?:+'A289'Qejs'p\r%Y#)tNb0t-*Z%AuaNpc(fn(gmQ>l$dLKh,QUKe&C,L#NFcIA+/[.,2:A<l:nAEU5:$9):kqKh,QUL+>[%6?@iO?YI#IAJJKEC:Fs`\r%M"HCq$RJ2\!+"gB'`eS$dY5bIkgG'cV2O#<,G3B&C^k,&?&3$FV@/NtcubsX71?2N3P(\4_IW64'4MfI/jp-.1416C(7HmE$q'W?\r%/h;<(WSpgj3&p/*`%X#TL`"-CpnE[LBY"a0$r%O9<3aEKrM@S%PU/.hFE*0_\3_ZHcG+uV;lJiX_Leq%MRZn$,JF)8f#V95V@`8*\r%bnLLbS=jVaU\gJ=7qIlP*^_`;aCAJ0.7DrX1PNn[BVs-fKde?+SB2K&\-[#74GIGTOiOs?;i%r;V@&I+cr?^].^#/gE%/((Ta=F/\r%,$&[d>H$6j!sgsYKkd;2/a/[On`$/35J:`CNBfsYI80AQJW+d&M]2gTpf86(7k'BMd&i$k+!QBaGU4+d7GTqW8i++3j^ukVIYBCl\r%gn<NO/uFM9\m`4Jkd0$A<OO%-2!!GZDV/hVWaibO070>BE&%.u&&d65f7X-R=i4rr2K$!<,?b*O/9/f6@F;ttJM?*/%fLsuq;ttf\r%A&4,58Ck%4#TP7*]K_jd46j_c,'n`,_3`ed:NJY:D"8&,JZj=gCu+A%s%d<c\NLtQ8LkYk,;Fnn#VMfe[_*?-W%ILU'%VL@@!F+B\r%6'^=P6N'p6S$dKS.sQ9=F9MeVhXY.rhYljZMik3]Biq_(4LD@=3VnJAL8kP!KGSd)Z,8c7)d;/u,`FMfWK@BUS?VD*WeLTo*8S(.\r%etH<'b&>.7bo*bDjk563kFY@-8$?C;/4Nc<egC7K9%#144JVjkK\@A(//cfnGuG=&>XEdMHiT3]PSN5&>A/[7B".O%$P*Q]s-7rX\r%jCXlZXk_M3FgV?f_nPWE=!_qB[cD&l&5E*PGkTHO[Z7gjH[GP)9hAmO^J4&5b<o&Z<1MTW+26\U3_2;U*t@,n5fij*(IIg/-h;r*\r%ksh-?:.Na6pUUtms1k$Zqn;D#bs-1rc$m,pg$JGoPpcJ'ge'B[kucZOhsFV$#I3$o[-r"4H^TBF-VAROGN@a#r<]tZpiF_u@@di*\r%p`U0Q+2(n4C=BHFUk3An`(RVqmT=fAU>%88bCXEA..&aFDATE<"OXpLI9OP1U)gSh5>1IsH@7a79$n-_RB[6j*D:9^<0A2J[phs^\r%Ad;\fkj#,"d>QkZ'jU&L'$ZGu0YJdd6*nK)JpS&POR,g%$H8$UD_CR:?W$.qQrXWX_5Q#6bMHkH>jKp``=?9]'XB2s;!\a8;!cg=\r%oB@_5U:1_.Aq&*Y*SgR'_Pk]k%,F2f+44-,<>@TM/eW"2h*hZVgdNF>0f27n3HR%kHBjW@"ZQ'=l$=Af5Z's]S35Pu.bG=C([U)7\r%AmM150$Vek6*Q!FWss1_m$NCIr`QIX0<mBS&F:7;Z$d8OctfNd<NDo>c1(tKGjTVAmd-N<\ipbnclm*.f0lDY\=k.q0%cj";Glf-\r%!U6D3Es2g.la2i:MB09\"C9JD?#`5UO=5;9*YQR)h*]L'SD-?gog\=haU[,mK!+>\Oke;He0R1u#Dm&Jm\!,TkP!8,f4Qbbm&14l\r%?1PEnC(9'78ZN#/>AL46j9leV`,3\k.*n@![McP_W8W\QN#*mBa`rFRKX&OA.jTT!T2!lWj^hB9]bsXM1hDV$R+n?L@]Y_HF'CKg\r%Fg;?o?SVcn'nEXJQ;$iG7Ej3.MQE3Y8?7'B@S0c"3P8f>).OiE[cU[MCJMb/PtZ(?C6MG""/Q>\KNd%XN/TPTg-(^S4tX'D8l4I+\r%;mKS!B]LS*f1IQ[bVk`'XjdTq[TBNaSbo]:Xd"ukC$4@,8niamg.LT39'`8`)#Pl\Lp_BR#F&7\)<4.lZi00p%:**^j^2NmQ*ho9\r%IM3l)[7&0@2C,mdO[AfOhPq`G[7&/#Ll7g_j_^ZPW-3sM.,,O"V'*onVpO$c;u;a36i-X-Tr\pa=%Dr8\ZLl%=Bcf:IDnFJRQbd8\r%%H$P>aSl8h6M;'Onq=dB8=KK`=$l$k30Rshf:A$!IYZ@qGIs)O^Y>`Lr<I6%ao3m4dTXE?[C![&lWi/bg[/>$(V/#2beNb7\fP`%\r%SXuP@nYClP>1]P#$6Ql%2i]`+k1GdKd[J_3;0rXem)dgU]/IHaRmaS$/u._ee*^JPp[OV&GDNC,Xnbq$L/#`WKo]/Y8t$[Fe!3)/\r%$-Zre*(hu@G>Kd97`)!ADJ8+M5q.]k\[VmKfj@n6,>Srl<fSg4I2DLpjO#QEol/g1(O]q2qcY?-S^tKWm:090M"klG.e>(SdEt82\r%UDEcc:gLsYPoAN'W0gHC&'0&r#Sp>3AX)lOk]LE!WlM/lC)UYH\=p0d!Zi(T\Z:2[[gLF)Vm*@iFVh$'?p#>&"q)%9fYFi".7BC&\r%UN)Z]Au4b.NV%?mn#-Qe?`e`ES,&mY.7>*Wrg0h2)Y>mJHAJF'?]*A:E!-?12Pnnn9b16-UUp*<WH\&_Rlg(`bFd5T:dh#,4-Z5d\r%W1jDp_]7K,'_Y%\ZpiG20nj:e>_OSj,)7?LV<O\06C7(-0rs5+U6qc!XX"79oM@q!MB5hB$BaAq6m7.'RO`J_iJL29Qf8>aoMAed\r%`&/%_$=1:7rX'[U6DQ\bBn`_OMWKF2r`H<7i=4$H,2Js'6D98O<"3njs.j+uAb$Ld*h"TId,Qll+`\Qk/4@iPPD(J:A21(A<3eJc\r%s%2iF'Np6^a&U3TX)VgU&2b!C'rn3/`O#N>QpQH\1fJL5N?a6G.T`3K^k!h3o2K.P/u8l`>UIh35+f)LbsTs5k]UX.:oGQ@<Pog4\r%:D;WL7TlnVTkQjC4>&u7U;`g?6I\+S9rP?a'9`bu?$uK'0b6\dU?-A0RLgVPbnD;_Tm8tk'r%)FE%.Xq8IWiX,-,\d<N+W:qcDuH\r%(93(gZpNXpMa-+iRAlRWQL_75eD-B^H'FJ1YoUF*.%bAo1crDOS,IXV&)B(%DQQ`m*FF>4Rl8?4^up$Mg"%k[Z-X4Mp;;f`-%E/W\r%4[:/]Sg.ehi[l(5Q9Jh%p9OF,%9Jb`^ge[tc!)Ca6LoLV)_'.,-U]cp9KM<G:3^mj@:d@O+AKoU5jL*>$LM)]Xt6s?0)`%k\=n.i\r%%\i\0KcUUZ2#FZ9XQ6YT!/idGA%ShaoK!#LoNo7AV^=#&0.JbIgdW-ai?C`]/"3ldA+G"9eQ/pQ*.Z+`0ZrfPaS+3sgBo^0QleXs\r%/_a2ToEf!]l*?>3FeXdQ*XXZh0ubjJ7Uo14k58i7_'=O+9*m,O(Q@/9m;18(mbAGGn@#%?XRj\W'2*7<LZ&%^IP^@.m5^2gchnCi\r%KJTr)9>!-p'r+E:&DMYODPIpcBir?+IYN";F5\dbJqL9Aq*i130AProSYRD;O$PU<Sk0R[;sU<>d2len(k>_1=^u<i`j(ookcqOa\r%8#Ga9aREQGAtq$@k!8-h[hGaE&NbX[,m;(8aRIs\A+nIPP]"Oc?Sm#:`ut8-5(cS%]uC0R[bi5)%m3@ghs!4koks4ap:L8nZek(8\r%aF:<'Bu[ctaJ8-LI\cr/h4CFqn+J&EaR8XHm1\:>:T!%BR6hqd9iZ?M'&Y3\8UqUr+OZ*Q*T6Hda@E0/O5@%i7IS\4QH+3A/FZ-u\r%>7%XFF:>A#*j,aS$+5-]*Z)_@A'B!&n%g<RN8^JEn/T>mW9ZHuQa6@"%4A34P_7:C5$a:oXGTQJnEE=["rS"nD8q!oZ+Huc&Ec$T\r%<C0Hc,tSV&,/*2g>/@VR/jqCh,^<fBa&,;O=)_C%j[U='Krtt"_+.^BP_'4hAbHs:Q;L2KQbC]p\CSh<+cui0cCi&lKL@j^#`83D\r%I(DLpk^X?TI8P9/Llr%QhrdimU_js5hUDdPX5U?V,.`h'1IUu"6<EoDOqQ10&CD'F%Y\5$XE6$*4]FgB6k:"]W^b.;rM`sErq3/0\r%Vck:TGh*THZpZr9BSkYj#plonfoRY]m%:[RE&T#rG4eU#F2n-n''EFB3qUm7O7G[qj9opDkdPbKG]Iim:aM5I//<+q<8*$kL8]2m\r%&fH;LXs>b*V3;83PsMXX%lURk&fE`$ThB]F'*9%4W%3]54k,`bL)tZDi+/C9fA]E'Psg?:;Ws8Rl9ZU\%rFo_6O.`[OeICS(&Yi6\r%^$DsL\WJ64"SE8f&'_%1SIk4UeLsf^P)V"o,;!Q)0q08lm[D^GA6gI9c/.-!Hau3LJ0P/A1*[EoRE%A@<mC!7!!KIm%YnD_]L(5@\r%84H)^d;TbdU,T5Pk5s8U8@EhFglh@GZ)G=u>$?VGVP:>6c1;I?_46ik3SH0*;<7etr!eIUlj\cGUs"asI_^rZFLd'eIj9FF6Bjek\r%1JKK1A/JW1\I-fW#;[lNFc,RG3HgRG-`M*&.[YuioXK^F1mRD^"]:$]ZC)UIZ(MP-bsHV%i=/l?;IoqX-2R4r=U17W\1qDpp.S*6\r%;VP(^pSu,"N/V_C%MuB4[nXn?HS,cZi5.f,+cr[B3CZ'br,%H@*H$c]-#SX74jC9Udc.!K1FmG9ORpI<%;pJ-TqUQ53pLX3ShNg?\r%@T@nNPF0nTod'mq-,m'jg07aqUd1JnZF'CuX(h/@bL[;+:o:Tb9R0:O."A!U"X0m4dalaE>BViemaa64HOT0ZieKsBn'MZan"Ck'\r%rsfr6ofH.6$su_!ErE,)KW<oq961!5e:ajZ5u2P"bnMJUhb6tIrZ+sL;?(gNP.SGrZK.;*86bYngItoDESO5pqT!to*"hEs%Lp_i\r%,U1jYOOt=4_I`1soWG#g-KC!3]9Y5Hai57j"%7HAUh;,\5=3]LkufP$Ehq!08orBYYPu^5&a>#()u91Nf7]<t_t,'GkoP[d87r<@\r%Xj=e\`t5MS>f@Oa>%gkpB\KUi@6c88H'*EADHX'Bd4'"oWS>9?LCmYlOVtgF`4;6'LbL"i&UmuX%Mc0o9W[R9a<2j$WqHoI6DW%f\r%cpSHpi2H`%^6"*s>0$lO<+"h-!@7FX&O\lB%;>.hRg:2QI@1?bjF$DB1"$t+,^2)T-<LN\g`V-=`>,@(4OK&h%@A1M6:>>IE>OUP\r%@Ye"UfmXne$4(_[jQho!PuA6Vge4Q7E$8CH=DXB^7@i]sjht#JEPPn&PdZLjo-iN<+[e/WN(M70G3UG$k,4C-/;+9^c$R].hs9a/\r%_XQpJ@UFW"''b*(M&Imt;0`XPI__t-_9GY_9:YtXUPEe@;5/iY%$RX+5<+k*d6fmWi+4F&kdBnZ-F'nX?O7h&0SpE,jE6hX$3/C,\r%M%W(Li=i:DitIt!?A_OC!$[@te6!bRn-RZ*Vu5nF%A,&"6CQ=;*Qfb:(`kk/>e`c;#p7%[7#;Soq#gdM946;^i+>0X`JW[Sa<;"b\r%.$6l'LJa;O*t=tnO[C$V_9+N&d:qR-N$;NAF,pVJdP-Ok461N$`>nfNi=dM^8Acfi;8srKoj<SLPW0YQ9?`M\p0\N0D,0ci#9+FU\r%43%`8/rsQU[un*VLM1$1;*oYL(/\OoE#-:*aphJG0"@<<F:<jE&2g7l&LD25l`c0XoV5h,-#,ug,$8!f,!%;<oe(7?+Daa(OG62g\r%\08&n,"gLKL.@KD+UsK?AJp]q[.$suU'0E4>b]1+fRloJ`]<9rT55?5m2n"+HG,>9>^:/Rj]!0>2aj0cA#Hg[)IsL0S4kIO)R?+g\r%NtHC=SQjaa[1BC+iD/T@f08;%63k'p.;qLKpSN*#6_arIBru#T.=18;n7p?2SB5*q>$9)%A!;uS@g&Ce1)a#W6Hmp-#@]tH%'<bY\r%K>)dXcoEE,K':u*@bY:XSFD8]RVEWQ)jcDhE>5PU!n@I-C&0ku#+b/qL5Cut;li\(!2@7]*AGKdTbB%e^e7qL&j\e,.;S,#1$4'7\r%=Sb^]LBEnR+NP.ldS-+rQVWm/b'T[UfJ+k@KLYQG.,bMAJ_DPTY+9D#=\1-L?C`c?/HQ.)b`)@&)c6<rR_Oijd>42EQdc(N-"?K,\r%ZCY9_?P\n-RBP*E)+5gQp1MBq4Qnoh%@W;HMci4;]OJnQC2<HG8Jp]F&Zas;]@W^V9<E'Y3fQrJ@]lhERWH8<Y"ZBa&qg9(ns%&>\r%U#ebM41q#Y7?f-/54+W&"g`gB]ctq^B-m)ee&U6`S+`g3?dUQ,X&<fmP;2H2"-c/Nm;bI3EFdcS'm%JpibS9:5KZU)919-D:.M8Z\r%*L)6BGA,)9^7(MOqO?_@Y.p6r;"Zn`9!5psWaPdPkXr"mRBkoMRq^'?r^uI=lYiUQH29HuR(Rc(e!PM22cH.D@=Ml7%m!D:?S2[d\r%E/5e'/6[tldj(1^kp&sA7M;NMosD8s,hQhh-0'5,i]]`1?sdDe>XF4(qaJHZidm>bmEfb-W`I8";'[f/`_$fK/f;lS9U+0hk?&QE\r%$d_T;RZ]DM!c'M\c"Y+$L,(KMUGHC(b^.R$&0eaU7`m"kNTV0\64>)40rBV#AR;^)MeGpVELqhc*_kTb#$+gJRJ,r%(DqS:cJ417\r%&n9p2^pje^?CK55\VMT7ITnQH_&%Q20Q4HW1ZmlSAs-#WDrZ:89ZstWi^SaKF3Aojq@pnO&OHt;>;0*rYq"hCBOX@]Q5EJWbsH<+\r%-8n7/-73;?Lp0#'<QM#qOAfh(68TEhAn&]3BPre>XcSI>2(!>Z6u/0#[DGrUUH4Br9=m=XqH?bu;_jLl+?E0k.oj[0Z^BMl/,Nc<\r%Z`kO3<?\hmOrkI,Y"(kk^P@bErAt8keaJT_1OLc/ajmk`P?`Ml6)".!OHa""1JskBGEA(pIk+sLeMi\X7K&Li-.h$H?LmH$-8>6h\r%CaLn4XDT@?rNgrY`a'0ZqMH*)UYM!MPsASu#k2!$<&Qs4ETs!e6c=&H6:rfcM!+"Q=uPBN<NtFEOTd)'G8b]DLEtPoD]%apEc0TV\r%kpbT*f/ajKkYc9=l6QUO8".tY:\RENBT$R53`B4.`q&?8R0'?c+6aM&'oL*8noS2R:C!]-(88I(!#t.7Ri!H,^71eO#+VRC^7,s]\r%mrHjb%k"4?WS>:R6R(64&#"m4&)k<cL`.[+8;&G@7KH'^Z0(K$6TLlLP&c.`+$m^V*Nis/@jiK4CXH(iJ_,e5=+VLq[t%<^Tpq."\r%'`ZHJ1+B1G&NMlp,U.Y?H,ZL4-HCAD^c9r!7''rq]`qeYE_AqkXe\b`*Y4*0;'$@TmcUL'\LR[i5s0q10JPC-&TdtX'Di>+PMG=s\r%h$.1C,%@lH-2(cR6kp`V6o?/tduP.=Yj"YH?Y?F`&Ik5#;Bd=USPi+dNO#Ybb^bL!?B6^]B0\l[J':,fD%dJcU-'PB9M/!eln%j=\r%+(Y$\!>0lg_/@'p^-!M^<.R,R&@!/cZ-f7$P\J<6nA@o_?lf)EMq9PP_0:T$jC2g,LIe7!U*5jq91VH'Ph(qP>U\trnD&8+@U2+*\r%+X%Hn!\nf<$C-F%I"?$'7(tuF,U-ThAHP_6+;M*C<ui=pOY785LFc8]BZO8RKLFl/<'ql#"mRr6g_C1Jr>k>a#PFWd3qDFC#hK#Q\r%5T+l6N>d3oi.i&7$l"1nXmq0ss(RnY511NTqm7YN<r:,X/'nD5miRj;W/e#PdAuX%=3slu#+*!Q::u-1=R1IO0#Z)M0j+@j;.Os=\r%&,0n=/$Z2Dm(S,Z^9R\KhbdGLFGEVoMFO;\Csh/:$p?HraB8)MG%t4EUU>euS'#rf*Cd2h]Ko9hnZM_U'`(6rNdIMaG^E)jOVR9V\r%;Nbka?0Jh>%CrM>$Of&iN<$CXl5:hgdi,%X)*;h3;ANA8E<2;-lQ!%D@`Rj"BOrIO0;@N7;PAMH5S:p?T=qieqIFdik`UK92U+)T\r%$<^l;UEJBjN*Fe/0C[uGb=X#r5+J<f$VtlO$9d;>JW<c#!QRn@`h_/L/HdCo.u]4>#tYO$m$38Tg(Z+#d#usS;CP0X`=ut[QCBs.\r%,ekcYd`S2n/\I7A'eG&2ed>#Yr67oB0Y@d)kaTD.N`Nf4]Nmh4g/!SSe,9]ians+N=0sE)Y=EKo?%DD7aRqKFP.SUV(W[huookDW\r%#P?Q*!j`,4mSL14$u3`bY`V$B?51-P\:[8?Es`#l\V!54-r8lN(%-TXZ4W9:EUJ?SGKDV@i=;q?isqUqT#_rM%Ijkq>$2^9U`?84\r%k1fu,%>6R,(ZGqW,t_:^R=hoO"4?J5@1KAPjUKE00?"igO3&)nZNdr$9HFk\n%]fUgPjVuYiQ7lEu5%M(Tusu^>O?a[laE&ouk`G\r%I)/aCAB_noq#]D@UN`6F1G#k`>&aRZjpN2pfRA4a3XgUH#]&Q1(A!!K2q.*^"mf,ZPfrlS'f+tDja;WEAUL3#_Gg9I^@=IJ(FEdm\r%k'Y#*dgG1JIMokM?(t"V%:el[Ua/89A)LoKBBZ_l;QKod6QGI3L,E)?FJP#s47EI*32?3_D7Kc7+"LXE_;+!-[E+dPY@#*6i=6th\r%:B>kO)0bR(Q+GKU0e>,5>&aRZjpnk+\H[$YbZ.2WJ.6_lb"Pi+q*NlQ.gn:@B3O`]AXKi$^?#j+/E752(7rVgG)l"q3t^aSC)"r6\r%U5'&m(Tl<J%N)B3#Y[h-\O4<Z/4n1(\-"Bg\O39KQf8JeK@NiI)TEdOJ[;/R4$.Bdei9H!'lCJ`lQ7W_d?WMGMJ#CK.N0;=a"Ln"\r%%uoD/*Y(a1'#5&Xb3$iDODJr0@/`"18*:YB3V+-m+uAX7,n-ZdE_-jB5]hQuG?W*TF!fS/;gV\<;a5l,1RJH*hI1pF;X!(Co$jfA\r%@Y&lb7!!ZEX;nQm=W`f5(9UU#7SW]nI!d/tZDAhjcPZIZ<U;6e%Oh`N;\H7',hql*A+JKWhko*2<A:C1n[0._`i)ko:m*WQKG6U[\r%QAYK;3B*?=?m07g0ZA_(HQZa#GaC)ke3TIT>Lm$u5b1aH'2lq7*//+8kgLBI+\a8_s6%M>kSM12#Z]AoN,kW?G?hF\+Uk!J/!MQ2\r%8k7bSUgUU06'3(M.7Q_BjBPn98%XFhfGT@)pKYS:E!`#sQ?O=/,l3oAW_719`;u>XrS\TP.a5:N._SrKUr70\Amd8DCE'Y-b-`fI\r%,=ehq47?Lk>cb=jF?QCFY"d:n#dXPD--\'=PU"Cu2pXKf_'T^,#3RiXF(IB#Q&)$8(!BfGAWGdsd1k35\`4m0K9JNO_RB3<1<k7L\r%UGb*jom"o*V.3FYb\LN8T,lttGr580#iTu(&ZU<c*MN<M9!Z7ad?7a_1H!;I2q&GAIg8EaeMkqkWdb7Ran7UAQ!AepAN?g+R^V;R\r%S#K&Ps/ko>+,[07-D/hj1o>cPT,=p_*@4FEK1UV&*?k\[X/],Z97c^I6Ni$uJVGMuZsqt!r_*&Z<N0+*^D*MQ#7M?DZ+Yi>%C`O;\r%-s]H:](M]^asgUd!BAO,EtQuM%pr)!BFH(Tq\W@@)tHkb-k]l4@s9Lh)NLR+"uSn%X*d=o7khuO,DR1&?#jMUAP]uD?L&"'idd.$\r%\OFtC;FD662Dp@mUgc.b+0,g3G)kE6\\X`q[gCs;$'44eH]k`U?EVCOec]@qR4HTp:YcdmCO.jmUd:D=7O/M3&K/[qVWu+X/f">I\r%TlijigIKRdM@LeLWsb=H)<mDj:WAeVpHKpuSQljoRpqMM\dc<<4/]ns-SX/W>p>&TjjCuC=e^M.?Qs1<-+/3NO+=296u9IiK.jT/\r%.,moE]PO@97hXLsnVpG(2B/LA^bbpLI4m29(`R2L22L?+a7&,CcW5.bS5'ZO.XGPPYSt%:f_!Tl>3M`oL$[4opDu.Jn0hAuWs`7e\r%^+iSV&-d]^EL0E66%k!+L*(&s</*0!.43&*ml)'0_4&l5O.Vo)Dep(_k3^BHdu'0J:5r.C]&:G>qM8%/FD>?0Zu)VfAc8P'U\Rph\r%BQm=%UuW[^Xg7W!ka;$_3[>NhAqAB3JnZ"Ako:&3=eJLl:L9a\Ai%=M;k3uI1b2PQ0e3ql2[;LCo+al)EOo;HJD(K25k,TS2"9Q@\r%l<NdA=J9l(8!$Sl^-%u+=FB2T\Qs8a609BoF+p&^SM'TTS:T"H`^O0*B&a6$O20^A\ip7SN04!/iY*iAiVnKB+]$qjHNrZEp\"@B\r%bVAj1/q:jHPARH;#L6]&LqKUm>O9nl[!,f9?.7MM6f>R>#Hbd_W-.Df=O>'7citcF$"Y^\dFuH0X"XKLS)ER'BU)5O:5pW06(`!5\r%<;ceK-M%jV[@W&NUY<(=K,B3'_Q]WC/NhMIbO96\>WiBJ[QLOq)Ge5%5'pkA+/!``KUu`#=$6khUG8ko.r-l$@^:@E[.$so?e$OM\r%@b<nMqSo_BTY't3>0QbYds\g%-Mh6mIca;E938JLICE4\+)Vh[pU(@2*e9bf<6mkU0,Vhk")FTkDW_fH[1]XVKq)LLhnk`=(Y(='\r%o8Dm<aS>um>PU^cKkKt77AQ%$Hj_sLW4ms=__6mc+D2M@[udqS>*O#bAc7s)(=fmU1Q18Y[g0+8NAKR$^m7nu5=/\dU163;]?P>A\r%9oHXGJS%)sS5WBo6I%"sb'3u'ToX*R'YR'4O75'gS>(<K^'pp<^4MkR<,Y.L.<sOg.69%CPuI%=%%;G\E_]KF%:=ig<*qr:.]Ts$\r%B,.L!it\+#?A_lb^HKjnWpegdgk)rZ3']o:I_g?O8lp*g^UR!`ZDPV,fCUfsL7DUMmm>;Q(s4f?CS?f,k8+YgBiY*B3PVNlLG-Ou\r%WqRY!(Y/PIo*\m5nr$6N:ZWBSa0_lGLR_^Ns212^(Y*koo8Dm`aS>uibP4N(KpUd8eWZ'cMs:b]#JXZK1Cd7/Q=$j;ZI0InaY0fb\r%Vg]ISEf:C#]CO*(bQSSgo]m2USYI7.h6h0l%54Aq$\M3K_:>h,W?UdN6Wl?)-:L9`cV*K[c>ikTbV(5P[#IqlE@-6hN4KJP=%/r(\r%UMc0j;gQ$pWk/s.FW5Q_#>+;;9=)u)OZ'`UTa&?VAAXg41drUIQm6$?6QO%,Ti/_@@VpL\3\RJj;Dsl3>L\KXf5FUTJngM7SBb!a\r%L,.:<FO<HL3^$tpGdL52F-BYKW3\[;ggX)N_Mh-D_a%U_BJg;ikJnE-AO+in`:@<_*%0,.9Zi`gTJ@0m;OBZY:mEjAKGg%=K8CYu\r%9UNr4(`AWT-VN@*,\:&u)"knGc(7-DI&_#A]'a/e^iC!PXLP6n6H+W&'?`It$g2*$D+\Y8[UDYKdN+>c?,'ZBXn8>5]k!XA&nS.5\r%D#rH`,q8:*@%n,mmp%H-;c^&kSeVk1_;nB";?mj>X-_t2'%&(#cL[SW!d2RW"lphVPnkdMIF>:C=PiU'D0]/[j]BXTkHmB`q?3B9\r%@8g1i4h^1?</]\5C,qPin!,e:`LpFTY'Y><+6=6j,ohTq5rttD*Q3TqGK@f+?UmA%oo14BfA9+fW;7NF,hLpG8>uA*Ua4RL9MBL*\r%c/`D4IiUhseMiYU4SRTd8j3[<a@\Xi)[T1;Hp?'pP"q*1,bPKl$lpP^C%&?D`rs-K&N#a7&g,@N4g/j^DqVpA3>rV=fg`:^S)KG;\r%'q:a"9<m/AgC]oJd8RN*-Ta]h]KAYe*%peomd(<Q.DfS2>p5'gR[d[WITK(7lc?(E=%IuCQBK\410;Opp=*m9[>n(+Kf&SC&?TbR\r%+dENILo>,P+W38X&^k&Z:m]CRX!8m=c>.,t8'"U%e8=0P-FYs$.O3;f+dg7]ZD*='jLh%UmbV"#(le$AZ>i+Me9r]<lge`Y_/f81\r%>.3q#Nf_Ku<L64i6jt*K7+DgRksfZ<jLqMMX6c&8`Q7dFEJ&*$#qoNW8Z.9?qE`j$f'W5.6,Iof(jh*V<KG1P2L^bOa9Fk<lNc*5\r%=URke80B^P7GiO]#H?pQl`KIL6#qr66^_i!H9>M!#A[!l50DT>aj&+[OBaKAkSVFKpb?g*[/*(/ag=)qEliFV^iQ'Vm%[H+17(MF\r%5SY<G5h1pXY>B@pj==1m+o)If>'TTN>rV!cmKq"%W1mdfW&c^)-*!PuI#4jR,[[9@$Vt*'Fmd0uj65j!fFiJV"$@`h=aK]U<"?=6\r%+h^&Y1c0'sVu&e!)^e).)Q,;&RRe5kX!WI:rOJgaM,p^Z`t6qh*6g(JZ8Z=?Oa$!n]016#RPWPU(>DQsbUjV(CYB`mX(e^U0&Q%*\r%)'tePCOPLX=jY/-1;_j5$[\1(nH)lu=D<D"*br#d]ceWuEbM&mGXE8=fp57\QSF(o",t[9hN4_3p+1h?)?o-tdAbm91JQ6?c6g`b\r%)%u#SaemF"eJE61T=q>VOV(3`=J_!-AEp(QXj^d%Yh8aCHKqs.;?ggbV(eVk)8=BRDM\PQ`>'"q5fIQDa\W"iD@#df'p=nq-ng"X\r%_/_19_0lO2Am^2PlE\L!7<Nq;b^uOI/[-#ek]US.:kRlp$H\])FbP2\Al0Qd3O>ZeOITIXZB\R7)L*a<f\'TAH9sB!;&pfeKio*S\r%7a<Na+!g"aXCu/[bPEm2.B4I8k7klcE=YN9)eYDMJdn3J*fmrf6cZKhgRPoX[&E`D^0CON3LcrgO.8ouPVE<l66G%--M0[3nQ%kF\r%c6fP5jNFcalG^it7.l2nCk@qSCnfCo1YG/LHItE!OGln50?@4''@hf!o82`8anZ&m>8]l-KpUd5eX;M?MX$;5#HM771\/l=L0:`%\r%ZI0.%at32SPe;>"Pe>OLOY_p\m`:e"6Q'*9/bIHXbi5>T\>g2fB,9#(nn"1WF^a@TU,kS\B#2VjB$k>NWQ\i7BO''mOthm[!r4=i\r%UA?N`Al1]63O@XT/$nHHn5@K)H4k71;8!S9?l#hd7fF:Z0FQH!<go`JR)R,75.sctUE(KMQ,gjP%Zg]DmWLKYAnWsED`f$nJ@YXh\r%*eqMb,]Ia%l/4u3#FS0h(FNi(Zc>P^]-P*JVUD=)WS>4hGo0`7aj>*DTTiA97?[c%;be`/SO(R-)aL]g<bEu-QudM/.G._'*@FF)\r%F^>\5n3Jo@7SGP&ehDRl.p(4kpn_[O3=;g!U<3(*#XM#Ane!-%.2H?D2(9sj>0nD%LmUE0W/CX9$#GKlUa\_@(oa,X)_5u$4Vpe%\r%_),,Yi0U+tKn,P\-R+GLV^3%:fDq,!'_>BO/5*je_2#7H;/N]8pA2F4iYVtpo)LQb0e$3#MOl=G&WK'CHn(MhG7eFca43;W9ug8>\r%aUB('3*-<?9Qq&;HW)XYiB`gA"Z59MeRI71M;T4A/'H)&4=1l?r,.>8@oi30eNPuQjk:h';/K!;kOORW1;H?faLb*4+l*f?:7!D&\r%=#WIRMeQHa1imMSDF2PbjVX:BI<nRr-/j)V@eJMrg7][SO*Dd3\`64'XU&W]Q&`@0ojm()OS^!7@"4@bhUh05I[$I5Q[E=k1BF3G\r%gIVZOmh([<Hn?5Xe[H0S>^[hGagF&@'<8g<SE/t)#n#5?9N($,)i;_3qF\&VlYe+$H1EkWQ@'[\&smta2j9U-.=\5(+e9jGLdi-Y\r%(ck(]ZVeUE6MDTTrM?]ZTZ=u8RUAkeMhuqS(5@`spZP!jAgTC4Q1$_:7!\*1GLHrXDXtIV67h2E/YjC9ha;a&+l@'KC+8&lU8Ml2\r%:NhGN4.@2S/*;S]>p2Ro.1]G=$VAiBW4W!;Z7@/>+2o6Q'3WOS*fVg`.=:>;n657+ea"qLQn[Q9C.:Ne;.>'u\'C'D*T@Nbhj/5[\r%>&VL?22[`oonG#/:YcdmCO3$?A<<1\>5HehZCm19AD,@+GB9h1N$'!h.$@N]'mIaKJ*gI\a++]%-l\ei/\J/H,[[>3prM'CTqg4q\r%q*X_%'\>k3N=*DD:9!Z?I&Br!8A8#)=gh6i/NhQ,;I;A%^Y9nEhjioXZ>k[OB]BX1,!?LLm,:cEkbG55V*ee/Q_9l0Z(c2M9r+fT\r%&BVmUNYY3iH9PX8a,5?cT4_0Enn)6Qa@8.#kRd!#p1A,oe)Ckj8>jEIZB7nK%6W7)93lbr)!qgd/.b1(/5U=uCf[LE6T-Gog``.%\r%lEp'A-+\!J1YNkT=X&S1=eap"fITm>LMW9T\3i/Ie7mm`9=3!DG\(L.SJ+AjF/+e%g`a?2!<P-L>+h0_-Q<C/_E%I7G=[MK.JdLf\r%JJSHYE`foGJ;8d8P^Aij81eV!MV*@B[d_H-OKi;)5'2FJS!sh+LK)m3Z*%g.(,PhFm1"3hPh5;hmraE8=useNcb1J0G\Y$--^-\A\r%C@s2]Win6IP7P')/tS/."7m$Q,t'AWO;32P`DU\deEC`P[nP7q6KX;_2?P4tE/->arfOUBB3M%OS^!IY/#:2S1G0U%pd/$Rfdg93\r%))Xjt$qW<XS0;rDSSm4([<Ae210J+/>'MK#[,P$jgX/mf<pl;V^cbpG[1VoqCpqGL.A:ZFf?RVES'nCi]_(#lbAt,GZJ=&J\[X22\r%7T"OS3MTtijU&#7(Ym4_*bqrb]HA._;7n#YLJ\a5`eI>)0?AlFYd03bFBWo=UY+71\[Xp`N2$)5^(-p**>oe[;&g_u5#I4n2R0@`\r%;I#qU6?4\5HR8*r,YHg]lIQP)/>>*d2MEYBQphEZ*%^hY**h863K#<bNgrNlY]9hH]aJ^i&\#<7NqS!>=@D\0HlWu"*#KV1;*5s?\r%(;\-K(=?jTR4L\kS27[b5W10fpcuP'M^U3:%?Do4O:@7YAJp]q[.$suU,Wg,/lDNYpL"ZBEDHA`-Q>NPqo;@9?4UT]@X-a;Z#ALW\r%ii:';7IbN]N.QVG-a;lAE%@[p%h69R]H8(^;7muXLJ\cK`J.5(n&L/[Yd03bFBWo=UY%U+<cNV*(e*tEHlY[Rg_Uo!;&g\t7`!5&\r%7aYr/V&2X@,ijoYp`f.B-u.e4oWq=ON2$$,QY*p;a!a-#kNN-i+79%UXun%kEduRg@c"&"Jm?]bN@q`Aj!Aeb@0ZmKjY6"`nVr+,\r%nh,KG%&=V1+46Rt5["<pVcU>#dA>p'>Q<7O++^.s%AL-Lpk;FF4(*j_(emIEX>aR=Sj!^\4TLkdBiYZ>qLqa<p=bb\E4T_7=Gn)R\r%2pLF]D5pl<1bb2OYAr%m*JD6TbW)"EI,N9e5!gBf=H`c_(/\J)%[\GK;,W/Lo?KD89I9t"_+(`02SS3bSPTu981!kH!$gN0_G$Cj\r%`6)U5M5NKC-u9cd8pWFGLZ2/5#)ldMa=sW2ZXm'>1258FF/_UP!iG.apf\X:21HQ'!b"jJ-++"2@IrRNT%j1O#U>&J3S1-m?\Hu/\r%bSX$fT')W=%R,>Jdd"C+'uQ]hbM!k5AL*3k_MH`^kO"3'>]$V16F7%6+m.J_(i%&aXt2HtEg+b3nq)SfAP=J,^-]2]2U+4YSt#IH\r%'$:QIGFD-.T9W@u3GY&[D::D.o1*2(UAs$#FQt:O&5=bs>H1rR-SCBP'4*D[o#,tDT&`Ce6$A(jiHL@qWdb6sU&#d-Ee^bD-Frtb\r%E^KHf+=Of"As,LRmiX*jrarI!lYe+$\c-3hZDbO$\E*Kja\,sSXTU!>^9&Y-T?5>GVLR0hkmL'qbS05KEZd`)#_G?%39Ot;`Wa3N\r%'rMsA&Ed+aRWg(bFrGV2Vd.R7B;?iB\2?7hIJ85J8T$[T';7'S9^+`+(iR6g)`j]H$i0B]Q[hp=X&DMgI[!VKV4GIq`oP$blIOkA\r%b]-/h:Uk&Ljin4)#"ROo$u1<eO3PoX6l.tH[_8,pU8Ml2:Hjl?(M.pVM0uDnWn,8RKi*iuC1?;Uh!H)E>YgQj&/>!I3esB?Tp82F\r%>'sCefi,)*f5e#F?E1dp2!Y$]j1D=2=5-7qlfu+)d1O*noPN\iop\D!-fB/m(J+?uMskC4Hg8'/>16]'=1(BP+dZ(H(,+3qEo5EY\r%US$t:=?KAFd"TFm0f6VF\c8gP;?[W@H?Qu+2Xm`LX3D7l-e2gc.QVs6Wp=EKO4d16ksb\\B;60]dq5?hf2]O^=AcM(3Xn4%F&hSq\r%\Z-s9)%@%bkA!Grk:4\JKH$,ZNK<?.PdRab>Qp^Q\)NX<Z_A))/q\sccdbK@cVUKk04(ZFd(u1HD=?aD4V.9mjjGSFLPVkIoor+I\r%eT[::Vq$!VMl4`&T'CI]iY-]@q#W9ma9#Af;nbTKGEo@.oj-Z0e7mm`9CrAE<PCj0*O8)`o9:n*oj-ZP<..jD&p7B&ne/(p?/>;F\r%]^I-ZmiJrbYi;D##WDp70T]=CpiQFB[Dj9irhj=V:IotCn^F(7=m\.T1u*G.]K5k#4XsiJZY8;4XD3Ga%!"[/1)Q7'C=Oq=.Y#3J\r%-/?3b&Jc7uc<%kEdlI(3?]tK<`ga=`E,%nDU@:>M104KP*"6T-Fip_._-29Cb4MudNa.u@`no<O).VpA$Ujo=>25W*^7LVlZ%GoS\r%G/909V3_[#jI.X4+*V(UF^4V,+8)+MUPB:19q8$"(I3p>)X/<;V6\33[X]_0>%s2iIq$s?+KPM?(QDa^Oe/\.a77PH5YEMBS?Lk-\r%K,Vb,]dBs_mt.r.rtP/LCVX_d"lu;M!Mg.Z[<`X"e\>aLjeF;H`CEoo2LnuE$h@0NcMYQ`e)Bkd[F'Laggl=M/;.\,gZTAC\aVu'\r%XV81>'d!=f:jkW*Q=;W2&+!s][@<D;Dq;^@&9@u%9,Ig<7*s<r"sFYn9TX9$ECRNmBR3)m&>ZF5'BAWq'LA*2`8^B_`!Ea65#i`*\r%R4#a$Vh38i@t$2UKX6`6]GNNp)t4gjg&^sTBSEDfbr$05JINL&GA]]God%JkjB2p^9Xt!($MK/bmmsh\=TFFKV[a$"#p9_WSCTSA\r%&q^]>6A>M?1Va(.DZkXiku:Df+D-:7#X1Q<U7<>BbZpDGeI\+Z)^ZA+qPI(42b#I>"j/\IC:/;s#YQC?kCcU4`RL[4^<RB.d;6TD\r%d&,+-'WRNCgiEU\ehR\#Kt/[)pD2)J,ipogR)V\I#\f]=Bnjt[h7L3En0C=S:iPh+oG\qqcn(Ogi,#D`@RhIfH$'d6?!\>&G8c([\r%<K8CB1Ek"6Y"/SH=Xd/&8RHQp+gn4CR!C&mg+`pL6RM7=.=<$ZE1;6.LpeHp9'c9Y+bQK1M"BTC>VCmmj^UK7F:J;.ZCF'#@;0r4\r%Au^Vjb;AAk'#V?mc:C4*0&#ak0JIH9=I@!dEhk\Tc:aJrm>Sa(I&tL]qL#Zf#(M5#4&ecc*mrqthp,e`bS[t9Y/cpAI.aBjs8&R#\r%(cU@-2i+22rMl,A.4L7aC/V!@-fq^dr<C_[TFW*m;uLm\UGmQ0-jPL."f_\lP,D<5+f4u--Bbd+)Yh!ROt@E=ct'(DhntX0d<s"^\r%Fn*99!JU-dM35351nD^@P-J2rNu7W!Lk]p^$&q\?"R'nlC%.i$4;g]Hd+Q?]:?%TI+$;!AR8tYU'Ebf[M)*,UmqFO<6sY>k5hKY:\r%:,MU$_!-d[1+NTI:->-\'m`m^"\E]l[B_3a@GlWjXs-mWr16m7,4#^gd:,=9VmS3jJW]Y7Q[0"a3p_34k)duJQl[F8F2.htc6aT^\r%1NGDD<+EEoTQi/P4IaVAl,UU8\&t.Jhr>MD/HZ9`(/?sf.L2M_E[\:#UpqV:`ss&gUmqj4r2e@=HmC`.,jSWlG)L<R+8J&23Sr-%\r%S882>-0\&>TIgrH"S&U0gn@6]7F_&35Cmga`-6e%TU-P92^,NIJY,:[;2=n"OKs8\pH\Y7`0!<.O!Egc_/97uM&aXQ:]_Y(dW'gH\r%!AkbV4WO+0mfCakFA2ad)&8_74eOo,+HO<Bbs32"YK'Q#D%X4O:GsN7.58R[VV^eb#qIb&HY?uKdtr[`ajZ+*])p,X?Hn3[_nHqN\r%;)St!(lCtl)14nGS5)3GIcTuT51($6&h+UsI1DIA!!C0gO7M+ORRSJX^<^VXK,`?8=38pRKE(H&s7u6+0E5,<_.M):S#-n<;lAU.\r%91(U$4X4A80K:RS>=K`=>Y!^a^f*FcFcD!0NTs!Y70-rcg#j!6^@j9I=Sjt<A=N5%[&",>_rsoi6]hoSpL\B*mpT<tI%]QL3J6RC\r%B'Aslgao6]qd'JN(nUk46__SNcfY`)nNB$<9.hT.Ho&:QpY_!"FF\8CLY9l1/uMLVm,uKf1LkcZ9d_5b1HGT^%]Ab_MI'6q(H(i\\r%1bc'C?;l%nME\lus-[,c<Ea'kWX@L\/TC3D6uBTj6A+@[[5*`q!mM3H'g>r@JRQ-C85`Da>A0/*T9!&XTIDD52b\.`U*]>A]\5])\r%=APA]Y-u-MHmH@a='K?[ajTDkV5PtR\4JY#YI;fVSX2np/SYY.A.lVslRar"3Uq"'obQbK7<a[[H4,^6C7"+)elsP`H:0\iPE>GQ\r%0Sen-aRp;U.6uAbDhLQ!JP8h4,:-Dr@(91IqX1DociIDlKkrR^0^A;K0OAgo0m8KJVU8Z,";%%?XLZ\kR]DXdX(X,Ia3,Sp;RKYK\r%Jam!>9^9Ni]$O>QA>Sgb$OqGOia1T4$S<@pdZ,SgZfXSYI!X8Hd9L@D[N\5A%u]QO7PT1PoS5kVTd%2ULOj!<W%Kog1(pIpl9[r3\r%r>[kjZg'lPHZdR(3NFdZN]RYL2](!J?M5qU,-JLR!EFtbUo%qY?!uS?1?DuV$Oe_aj$:<:a-&&6&F!;ACjEp.e^&@SgPp*=^-i!u\r%FO<"`\Q(*.m#OgKmpip!FcTXS,9`nM7M2)<0sL;DC4WtKn:!qcWPGUNgkZ;[:%ZL\K0M+Ffh6%C^g*F](OMHc$0!kHQeF95'[4D<\r%HWEDgZa.o%cPSX=B0RbA&:@)%4?73KZY0R5P!bkUa06MC^WP[R%XE$hJ0B*;*9GR@Q]-_1C/jK*W&NLrqd3R.pq&A:E0F'u2D>IF\r%a7*rcZDL49%u$p(\cX>eB-YRmF#02t2tC`:qkDQk>lIn2pDBIDVI%OA1:Y6rO=5fjgY&)_qO[JDql]l;7S0lQluO'"@sBJY?g#lu\r%K0+Gk*G&iZGo>KJmdWGEPihX[Lm_P_-EGS-biT?%n3-F7,D?dQ*e@aT_q,Qn$?J]AjRAn^3BhF`6a$/r7`X\"WIF-?\W<3Kk=8a!\r%_j\em@icj'8MkD-TpAN*,G'FH7l,DL+C#]d-AFMMl<UVp?Y=TO438P45a?cpj:)n"MbpXe=l>@0FJU@[Zd`7BG6XO.f3-qeb\n<!\r%e^),TIlutm',>_h8O)r/]4KDl-+*!JZjl]_3;:t65(J-2eme^"j`P67,Vc<f&*a$l@B9mq%md$gA`M9mBJVsJF]&5tUd-I&4IjWl\r%IDhf*,H\m4m"YS'97XOD[Cc51SRU)WMIi%.#C[345Una+E$[gQFSm+n@*h2`%Y6b3CT(3aPA)^+ONNVk<i&<0%*qV=_#qFg;XcAm\r%ES=+76#%P&.6F,ZUNP0#%g'If?mmIj$uGH6LJjAcPtDQe?:PF7LV!<F;RA]`]HY>$7VYT)p&i&7(D-E_^?N-e'7-s#JcdtAT$<@&\r%4QqpKVR$MkQm<W/TbuS#Z\P$g@&Q?G2?p=Il$Jfq&R?e9Kc:nRp:<;k!#K\J3[HOo9g0[`8'RR?'*i#*4ui)t?*I@:lHBHh!([\N\r%Ad9+Q$HPX9*E@,-kM3c^f'5IS`r3-&52A1*LbXX_,OPe,>%0<]M2k"riDr5h;Kdn:"qt<RbFRdB1H>A\.!N;pnJ-"umo`bSoC3Q7\r%o_5per^#!(q(BAqP450ZlN3j5-i\\gX+I#qZtW9)QO,]-aAGc9PF^BJeLjrRYIgb_oAN^:ISj<d\Y-'Dd(1BAqjQ)Ra\mA]gT*Xs\r%H;?_C(+:3V(D%@FgM7:o9MeE#Y5lBu!AV\"KokBj8YA[nY;Wq6&7ilL'bF>W&n7'ZCPHk(QeYnm3M5)5H"/S>^%.6<7%m`?i-LRA\r%?L%U<s2^Zjcs/AXoLqbmY:YReL'^FhY8I&fjY,iYp=a].,e$k=-G$l'Ph^L?A]mc'95^p[7IA;VI<'\RC!\o+$d%cNV@23d$&Zjl\r%'uOOFgFIel'$9Okbh[F+9q2c:B-g(r\(;&MRO5SYno?Y!^#BsTXh!NdMXB^h=7s]&'uN)1cFGAL[o\cb=:'l,m1kCADQepqg*O5[\r%li]S89Q%$p$-t3!amCrEQOn7cc+QBO=09r(GT$Rm^$6T&0it.nZim*-1X-NB]cmUV5><c@]k/NC$b_'LV6nR&O=1`>H^`_rBqK!-\r%Bk.5kT,3jL?I=5OB?2@-=.OC0bXX(l]u"<u[!)sB[G[!8Zq3j0;<=3'1@IDcU?U.pTZpFH\$g"r)oRDT+.SIDqqYR5,f;gKWnCbO\r%$]'aT,X>D"2U*FD/mpdoWFI`/@NaB@WUuK^X*6j1rMP@!XJ1Akae:PHA&V5JO:RM<C'IHB`+NnQ?Hd3X0$('U#^ZN<^H-QKh(M`R\r%L?9V)?fCB12apO$4Y0YUoaID382&r0?OSK6.-o7#LA/k6l)!Q_S*V`2?PlU'4ce@N#buu.pZX!:<bL?X8*JY`D1M7@?9;"LhQsL\\r%H-[<el?OBLTn?LOQY:9+OrP?u%,g>8#,i(QM^/dFnAIUCJR_:RC\9;^X09u+9@r^9habYe[RA\L's?dgD>DuiOPrf:m&l6A:9?oi\r%@NEkX2Yq%?'X67K_P`%ubmruhX?+s*4RAh9Xi,BXp8IS:IJsQLr*e+&hQIZA^R'$#%OpC`,huDo1O37U\\im@CRr[E/I!LUa`E#a\r%&P+WFKnk)P-K0Ti"Qo!E=Q--B<1W[<SXm*)riZQIg6ds&[Q^.]."SXTFNVWXA&(n)2G8&N1$$PIE3B/hM3k[tNa:,n/La<D[!+\)\r%qmL&MR&nASi$!>^U?n-RE[cMQ?a0t]<IX?[G!]]qI<r'^K/O>pL#KW$RN"OF[jeZjB%b^3\:X\#0SK`"C'J`j#*+g8[umds-_;3"\r%(A6n1+6fEbW`D];;%<K.-AJ<V1)SQdqiksQW[V>G])nQ@.#!D!/8:GdrBA@B5iq;9D6f\-8$git49$),3.3mWQd)f.)/@Q!8]nBr\r%p<hU23aHb'0Uh-coWuA=ZcnLkS]jQGYo]ntf!cs"?M.uDnQ@lFIo8OI<'qE5(8$7.\l(4:"g'iUP*g48gD68o&'F(J>tVGFC/Ds<\r%3cALH;,1%i^`ARACc*SqEuS$H`Xjg-,8iCAJM'9.c9oC7Kll6U5p%FfN,?DAp<sho3:HC>_WTe)gCnZc@VSXB^?-V1#9P=?Lq3j)\r%'4?nKNu&L%+a`M)I\fKKhP91VZNr?HHkFrVZjrA9:DR!_Y97WWf9%sTOu,'.?6=3n;,2@a:aq8>-aMUL$%;A?^"Q9>DO'^gcHDOC\r%(3&.e^IH_jOK./6V?W(pYG-K((aL7"7iH^8DSQnj6#\.ec4dD<"`*dR1(_T&]*gq$r4lPMJi7NVp9XlX$$58YQkM30kpr.;<5OIM\r%()aZs=a=[,B(aM'2QIfPcVXe93*6u]<UYO/=4r(ja)oZXT7:@s<JGg=88NBqR4GfE3ZF-W$eFlk[[?!]"]$+K93SB?_<pQ9c";FC\r%3a[6V(qS"]`))ne]$:JlYg.%:DdQ"[GJJKPMri33C`S2F8YtW/Q*!-)*pHug/3G3YlI:2)QC^,YA])q(pekS660f4<hjb!%[l9Hk\r%MKFp>YVLq43:W0_,ld(,YPRil!UU=F>^>VJ8ohR!a]u*$:R0s%%lr7KEZ5K'3X<Z8MHgZ,1m:fln3`EA`O>>YWVu`@/I*eKhR<`j\r%J9r:f\CWd/'0*SS@\O*i:'o\].:j_.'W6j6g_MUgOHgO-2-N?-S2)<4?U7j&0t3H'5_'qaS72k=Mo('%#S#\8>]U+s'*n[HZc4\*\r%X>Yf_F,%E+)n3e*?EBYR0WPC]_gigU&;7Y`9)8Oh%Y"(pgB`]GH#$QAV*Z=p!/rAHJ@-i/dO@n#1@2?)B&hCAr/pH_E`"<u3VE3r\r%qf%0f4Dn)q0URF,LaFE)*6-V(.SucQMC<Nq&-b/$!L[)i-o"n%]#QEB_l*H+G2N*=6+jnOq<)c^IeSU>^AH+LJSZqXBEIfq+UC47\r%GD6jP@-c/o%)dl=HTYbY_#gooV(rgn3#mf@1lqW?`QD;fj9jUTFqSi>d&6_H<k_5VIB*`"n6J#nQoG\Q!Q(g6dA?&?Qo5Q&-\tM7\r%nP5i$RfPN*7:hCEX>+)gArPYUHprS(GaV6(CFNBQW2QPSJr(9H,F;5!P-84B#,IDeJP&QP4"^9Ac/1#WILkIKi>*l=!dlt0%/tdV\r%cS6UFN">VbTXLUC]?j8?#tQ%01rU2Ol!ot0GqoS6dL)DJ"edOmi]K[[7musuWJ_R]9-hW5(t@:6e=W4!79a!VhB\1u$&tdN5AIGP\r%2dW;i+qCd3kQN;A[8A-c3VUDD!oO3nPX;756!mB',u>ZHo%t9Q9*D8X&1'$g5[$*]6G_Wh(j'0bbREG+LD1N1PX0)"mDuTK@hO'>\r%[d"XL"u^5uEM[NQk]HBrQ,1nH^<pJbhAKhGM53kc%S8MV`sDlD7s^'aRen]\1-+oJ"+gf;Q6)3O_38J9+pXIUF7ChQ#p>$F/cC=]\r%Le=j(^qU6]j&3h00asaULh,gq7Tt^5]S0,h*I'#4JRW61g/:5hpF9cr)Ca<]A>bE^8V*&_LVe:Z&iHd.p%7QM)hZljYUon]9Qo]?\r%hWMsp<8p^+57/9UU1,C`@Iu:F/huNH0COdB6#X@&[M8/]1V8+[7*qk))ABYC5IM7KmfW0t9.PgGO^_QbMoj7q_DmnqMTpCGQpo>7\r%70Khq`l&qHf`ir9mObt;iDMp@LOGC!<U!DU?2uRUd=+d72ng$5n,&HY^7`k-o/2BgB4;I<8H.!HPCI:=S/O[uVHCKuOP4,Jd"o6M\r%OY]"g\Q)%3'#aeOI"c;\'=0GJ59NR-4!DT5Xbae9MSpqnL?W&!G<oraRH+EK4uNN<0tdF7S6?;/J8Wlb37nL;J5d25P?T;!%Z[!@\r%gM[f=PGC:%/fja(;TqsR>Uk@nJUNB!-ePJ=Iir)i/4XXIbF0O/-oTKPNJH:r[iW0]OCPAHi0E>X>UgF0N+bt3"o0l+e_)Za2S&Q:\r%QPaJo#oI"5n2CQsI9V'Bq\E'k*HR&LN%#8DApU1nIlIWEPBjRTdtC>CM6]"<2(cd270/B6.X<+brPCgNGmZ-(Q,r7\?8#!`>4Y>.\r%&6@=2q\[n))MAG+h8!2E&H?JKD$n!"0ops/0mSa,kG]rb5bZr!N3dH[df]f1;0Ps2<L+8;jtXY-\[`lceRX_0CLe^e\Q.sK:A)dE\r%jM>k'0;R'GEWTR3Z@8If";KZZPCupi%*P4!g1t8-?7BIOWRp.I"9hL;2CVj2'bl0SO[=e3>m_:q1#.OT*fdm@WJr2sRr`^#M0_FS\r%:.):'Pp,%fF[W3Ik]*eh,PL!DG*?GjL:<;)+G7^/.VQ*n1)^FS!0U2iMZQjDVO!W='F^5/nWgO,Qs*SE^]bTT3uNuP?Q,Z_4ct//\r%#+-N3$dF83L00<MMkp\7fQ,PjgaC0VUl>('-HKSrF[_1D,0*MBq"2Y8X?'ULfg$bHl3iR/NrJ<_>%07&M/\1Nk5)rq5=L]qQo>!c\r%PVMeC1;Pq_`[_=t#c?<0JX6_b-1J!eE"X?b0OR"tanbde@F,0g@^RN+^PhrrqRmc_I02Q]SC1%ZkVsm=_Z88`fS9p!dQ/mPbtI>b\r%D&Y_gr.LeYU2PITW=pW<kY+T&FeZQCJUXhnLFl<SH/4gLAZo>-%[:NB,H>3'j$XXCXJf+]XD$;LrkbbW1iBVX0Et=e^rWaM_amJq\r%!\C0V0h%gP=A4Fl4RfXfaD9I+a1$-r41_S9^L,tiaoIBoTh*7W0XNY]8H<HsR9cbN<0Wb!1djpp_5Gp&X;o6$&<;l!#$&7Q_+^4u\r%CGX4D?`g,\3X6k/D9?;DotZBIV#B7`\<f6B6b'++6_:7L(p)]gM>!f*U*3@(l7^,Ol6Qk0FKB2Z@$nM-UJ'++Q,M$fkfV!j#M4]D\r%Ri<2ZT;)k^!eraZ'c"?1bm;(5ePc"@WjYk=p;%)FSpOi^p%!gM7n8__ohq.h#iik;`7:oY)1M7q7A/7\Ie?T*V!IQM=+/u,f.&Sa\r%Sq#`bB6=WNrLo(:;(C@:U/nqVK>Y_g&`;FkVBQ:(i8Ft:>f*1U9>hPj5HN84DZ.R9Q.h[mY<V>jD0aqXIOeX@"<p%VI3,$>0RD//\r%7]^aS=tNVt-+JB;P9>O+n\d_sk$TaA^;1fKps+$I[Q7ZVl?=8h"_8<nbko]5=6hsq&dt"'KQlUmhk*R%>W-r>n#Jd-Y4e$Rq[JFT\r%R+(V3>6jLLd'FA)k40Xp^8$f.#3UT_j[(^.:BaUW4nWQ>5k+q?i9M>ad-;dcqs6kDm$O$_0Y!2rSdUj=lYsA$4q8GIK<.]m:1"rD\r%RY^a,iNO"5$NY+>hD*GnLbe:k_?>6*^k`:*UW`K^Rqrks0m0;='TOVOHn4Kb9DR+=?3%h\I8ik;[M^eh<3W#ihg=u<Q"qR=L1E`?\r%@CX<J.nL\3WYr/cGt53"AA5=Mqn_Cqq(ER4ejdd;FEPQa(.!HnM&i?rHT7rp-NUb.#\n>YL_a?u-$3Lg!fHmW*88Y_`LsDZgJ23B\r%.u0EG\6.+H9/_;CVGB7)Pk?ZnqI@FrNhZ^`c//.Cpt@g,aGf1oL"dt7Xl%ti%%U0![pf@j1X[X#1fq[\;'r&:YK8rKlE]0keVIgO\r%JbPXd0@b'$B'9)Gg$X%F_YDCp*5i&adjR%06^ihLgJc6^f[Di&0'kb*PUB\M(TeJ<j[.r9oMTIuUnXM,E]&^=W4$Ue;.G;0,4p+S\r%HT1Qu5e7.FcQHWrTuLd)pfM_!+I^cH[,5V@M)T_(,&lg)3dqlg40C+]!]7LQGQhHTiu$5W_h)3bn4mWm,@!)$9L2:FJ8-ecd^t*8\r%E!kPM%Bt:BA+'b!\&gu>9'XNlQhrjZO;ur_FfKq9G=KmYZ.;TtUE14]0]M&@GA9m!#t(u^q4N6N"():\m!lL[XO3;l628;a/1k?A\r%AO[(BWj*E-.15\CXtZ3M`PukWd)bVqm7h5_[56OfQlP&53,iWj$S$#[D[gI.gelD?f*iTg;+TH)Qm-'(<U3.>\jc,"T9_K0U%")Q\r%X)m8L3%u\Yalr<S>uK$'Pk+-<d'_R-VFQd@Gh$MM&!G<(39G,jRdM5uis^@4N[lJTB'G40hWrI`0eQWM7aJM?1sEF(d8/Ur"_a+;\r%.82NE5+qKt6P<dGB5*u39Ae,:4PI_U3\@uO<Ps4Xc:4)&C8a%f_;Pd#jetSjBGq]nFAfonYp(%)bE*`^`[$R/!kEtW%m=S/U62BT\r%-M`_bM:.*jj0LEc<bi#r7jP8(p-?7g)ojXn4>P)Ri9%.P1<dpNUfPWI]U$R>H!T.(?G$3b[)J4^L?g1tX83^;LNqV(cZi_A\uqZ@\r%'VT<r]uANH9mbJZ>]/lj/VZ)th@]T''Rf\Sfmj%c#1KDqs3j41kL9J$VgnOdrPtAAr1DkqrSPBgpdb,Fp[A(g"S;M_s8'W/M+#4)\r%rpnm>eCQq_bE)\qQQIt#Kq7bCJ,F*\>Q!)[s8C8.Uqcjc0XP1A9$Bs,\*neDGqSg>TDn(^rX=;Uj,a62`ufd,o64Q8oS%%0KPAXE\r%r9Zhas7-(saUa/LI6bRE^]1e#s8=&=jeolhnV;$Ir:-u"N+Gj4pZ&`4qU:MiDuZ0=r:&NLJ,#r!rqkT%qt$HZo%+seK*+,TVoA*"\r%eaJ"En.l`S\c;5uYV=h3pn.2h?i@]fn:PTS?iTga^&?!\?iLjeU4=3\%rX.FkaM90'SjHHCNSq+?hSr?+$;hOZl99e]M;l7GPL_.\r%]qOXuhYqR.5Q9WV*45ImX3[]WkE=%A[.diHeG%VCj/F]eM\#B*Ct;BUIP1gg*_1[%d-`$ja+"#TpmOpq\#ZVkM!qTO57-kn&>jFm\r%nJ2%/^70`T++&;r!FG-MKDlp=p%-Pf-lsN/$@U:X@mBE)r:Z<e*5qU(XIk+>L;d*g0#I'CI#n4gT(r#B&g+LTfW1Wup+FS$G#CFB\r%eG%VC4&Fh;OkN*LO1kB]W:0Q]h1>F6KD$A`GmE'X9C[&LhIEa<)VTN]"5[G-2]U?Af[8`YDr3/0TYAHQr>a=2@B;Y_qAS`3@u"PY\r%n+#<_\it<CnNAer-R$4e5,^Q"^@1&(^rN#f:Or=>\.AF_m+"luJ'VU>lt5Y^Ib:/2]D?+H]M\oQ8AW>qrPVZ[&UA0t.NArkn$/Lg\r%csOIP!`lTGmcYe-a(G8q`-6E\2l"WkIQ7&m%`Hs>Q4M#BrPZ'e&__.>_=pbh*'8HWlDkGVMdrr>B'T6nNshbtn+NEha.C#!rq:De\r%YbX`DC?NGQr3-6D?/cBq2?(D,mi'*!L[sUM^AF';Mm'5US+G*panR,E<*KuV)n_cD[Yb]$;u5ct?`Z$N$p8OVqakO^_;nbl/m,0(\r%^PY7D:4VLg^DJ&A5tBL]/%C`t&XHI?&gj]9kL#8eI0==LW6X^JdO9>&U_kfXp[\%`,<`L-%M;(iEK`C@lY!*0%gps::uGh^mh7GU\r%:ui^FoeR9>LP0J-aR?C1p[P#`8'(U<Z[QB[.ir(a-k6F!Z).2h^P;mMfW:^4rlPKA0ch&(f[RN0?una+3;2Vb-G\V,0pLP66%Y/7\r%]pgCE'SeWlZ!fjQ*I^6VrG[S/a-PT&UtZu#n?H%Z1\oj4%tW#b#PgNkoIf4V*9!-B^&"/=n*Y@4aeRu@^rN>/K`EdS5TBq%fW1X$\r%!'ePur7rD>pt4/AGr>0+/ZooqO0jqWl&o]>&MEG&h.ql@W_In/gouc"pE7`$k$>`If508\Rd85#F_0tO%b?mm7+K[n<sEc]bI>,l\r%CKgP*O6_/[5'0gId-D'JhH6u!l<a?_i7Xfp^0oL<l1AKG,Eu"1?^u7^)>bQAY`+!,_&DHd<UYND@in8=i@,TWr*U*:BINu=(]6PP\r%/u:S&*ulj$KeD2-GNT'cI\71Mmb#s76pFf+X;jjYA$^V2qRaAf1IjYh..FL@pRo=eHAo%[!$?R\FU@P)]Y=sIHYhsF*"NfFBFYr.\r%CtR'%K-(YU-A7!U+'X%-_^fG^#[k\brP\>Pn`mWFkJ9H6O"J$QrEVCE+8#<[XIk@K4s0h,\K2_)pt4*.:uE9J4WG12fW;8LJTjm8\r%>'phj)LQAe;8*:e;F>Q-;n7`p02L"rqRkp3>mN!%T@Kq0(nm!Ii)CN"P':'"9!rlH0=\9m?L&&Ah9g2$m'XQrMTW!m]oF,jS"XnO\r%iU)a">-./"h:\0!?*H:sSX(3g^j!5af&t(cfk\(2f=(9i2RM)f$/bScmsGfc"DZ"OpQB%qmIbVBL+W;_$3RtgIpD^[fG'MEL>:e/\r%Sa-h^TD\!OJ:JTu#e+eil.[e.<fks?d,eoqXVP?3c:01`n`r]sM^:-AnX41L=5M69(+Fki]"3/;'Y:V2+'m7c6R]HLMCAms5kBs7\r%#)_-DJ,>s.Y`mFQ:UJ,95oK@hm0ijH9GSqh!hL7-V3jY)Lm?[WN)flA.P:M?%q#@:V/q&O,kAdfrVF,jI.ueGrk=m@RZjAYr1e^^\r%DmX5C<-hG]nU.[[9\t&M6dieF0EJ>.-O+=d-YER5V0WqgeScHB?HY5:C*$3%D[,rJ@[NC6?GM)!SgOd+Z@XG6=uRm?AEs%s]aNEV\r%2\&BG\91';XJW2@$LW.!*`C_.dN1$;RJl"iUD8Q?G3nCQ7'p):i/7$31-n\],=19n-rWa,$.t#MGu=bW_>)[RU]N=F;lb,Y/Ni:l\r%rk^7!/6e;*?q\NprX<UWTdATM/R:J^a-Q^YDs8Wh-7tl.Tj#a;K:%V(m;8hSN!\&"?#UHiJs5^9eeG;J3?>3c36*\gReBOPJun4r\r%\NBNW076P[ldfVF'Oio7>f<G6Lb3P6_1jn*0ZiN9?'%\O/m,0Xi(`_rXQa+da!#n[`WX?F+cP[6Tf]^T076DWM(c+]U<8geQ'9Y%\r%@4Vgt/>uV<Jt)OuIL':Y4^6Bf1EFO2of1D(S&<(4l-cgu[e)5#97OaF*r4f+ONFF-NAd41Vi:0?-LE5>Z`-_n:q6tbg++#)Gmo>j\r%#@ft8e8^paMa9eD^TAt@W(Y2!f[@P(/U\jr>3"=U`=M?%p8dJAkO!]kX#h\Q:ffdu\c(f>e((pBnL7siPI"T/8J<Ie[85E+3#V$m\r%"]#PS#LIgWE^6b`"^1NQ/O&X5^1O-9!A]KE!C!\7@<B5GCR>L1.sU'HOH\%C0&NLK&$(ssLcambPJHAiq6^puLV.[^LDQ%reA?9S\r%+*m&/\NBNW076P[8QS$\&\)Gnk[hYuArO&BX/6`@i>ecueXC:?C*)tkW>9c_&"[m5h\Y?F9*;DhltVRTb@=>_,#9t3MC,?X-d<Lk\r%8\f/L[?`VA*`QmWi(<W.VOiQHpc-![J0cZ7(m]:.fH"2m(VZ`<b`UcD,biVgPr&:d+Ql>b7Scq)7TJ'ZC?7><]>r]kb[F7fSDhf0\r%Q7f#**j*+;f[@%$+7iYR?fSOL\gtT12n`6E`Q5mCFr%n3a1bS`*(;qlY;D3q9fa,599d6e-XlO>D?`lFHk0]/GLB[.$aT',LYCE4\r%'<mg)-T'&#MJlC]8ZRC,?l>K(/<+BK:CMX&DXoO/:eUI6aJuFgH+c_rq8[b[ERI2N2_"Y=A2#tm(Es`R($nmS=GJ#X:VG(sHPifq\r%7a:lSiD"E'_&gJJ_<G9#G`1uEOUWq7]44Y:_Y<\DPR>i-4"2H(S1f-ui^-HN?^`^pKBBa.Ca3;5N(K*>#@BO;n>G2;%gm)kQinFV\r%qN^i=%s!ie[<sErkq1peptq&)PWCsD)a=Z?@Ro#_Goc8834^cZNZR49HKj'&>P]/MV/Ok'ms8K42/a6n4/Ctq]GY1)4R&OU5.!A_\r%%T]X5\Lp%b1e92rV&oR!36X%tT,nY^kMj$6p@L"c:Hr'Ca-b;VZ"$J,./"J[.LNct[Z)_!.#btdV;B%QNW]3:9Z^U3ZT4I'*H;LJ\r%4oIuHWT`1U;aQ`i@n<ECX,NrklT3ZVB(VahDt<BP57[+Z?q-3^;S@>CN]m=Khp\d)_NT$2b.,G,01/EepTDK26BmJDXp`h'CKT)=\r%*gmcuIh!6:*9WZ!;&=g_NFl&./(:c$?g5:(<H49U'ocL19/G(:TXeeRgr>X$PPe1T,K%lJKKfWEH;GlO,Q$<%VdG94<M`r39;K%t\r%/.)??F.Q:+$Z9HEmP4'A&Td_T8&s#*8Ts`n@$)8Oh6El-iHtDJ736)=o'JAcL<]aB^o%>5:EuXGp`ob/&)Us<-DP`:]MYO0@6ORn\r%>'jR3PWtKO>fSp36$!_/0E%aL[&'$3D4pB^[D>l4`'EYE'YI'^<-%@I`[ZJQILP,qQ>AD-\i$<s:=pFF0aRcSlk:aI[0r;Chll+$\r%*CKL^54a^-k\#6ZS#?912sBI3?a)TWHMZ).f])>f[%!d[WuM4G9c;Z`&Jif&7(EAj(oS`sXmB+QfC!(Knd9%0XhK,:g#(Nj3X!&t\r%Qq9hE_I_5*Oofjl%%\<7XdVQj8OG^Dmt.Y;$>9C`UWOgu1EV9t1GQbOp*hDBes"Z><:IgkD*9G\aR9)=H5C,Bf8.]_P+7Ru9o"u'\r%)'ikd+FC1WE'C`&6NT+sF3Hfq:fFmbXis9$2Mc9Q7X''[0@5@KH>W?b0,<9-'L(8tXnEM!_^/O>]6Z('T'JgSUW^?b1[u#])&8BU\r%(q_Xu5m.Pd)2"GAk.<5'M1a2Oar3n.;lb,Y>5^qdd9Crfpo?97U-@@W8?HJrFmj0!?9:-_g_H.bVVAqp+"j,Q/l#Fb]XOqL`FNM8\r%'g-IiRRuP%54RoDYZAM]$(\dXY0%YAp(-WF*V"XXl:J8%S8mdEhX`dk((tP!?CK4lAFs:C&`5M!6<92M=fpNa[k-UP]]1oZAgK[#\r%r&A45A%Z3+]#-i=CF3QMJr5bpK;EC%;+7GHI0ECd`14$Rj^U>Qmt.tDXU?$E6^CS$U71JSN#/)))*'ie`d8Mdo1SDd'Ve';(b#j1\r%oKl;V8^5U\K/ul>,AX!6eeV:?c0`iBCY&6tKSor#VA/<aNjEcNXf'Zp</=\EENKSYFm'/V6X],W6*2fI[5QA8C]-,\F1XBkRYC,'\r%1(NK;$QkZ4#d.)KS)R#6=e@.GMl:RfQD(2\Kk6aq.r1i>eeV:_h8_)/LUWCCMg8Tc]hET>&muiLPLTjCV6kQS7cR*VBd`.NW8NMb\r%8t.85S[5oPp%rE>?j64WjaG(<V;q3U(\tbA=ddD#[e!*_CaC&ekq0,)HF6TE;P_Zd[A#%/.Np.<Ub#YfZ%4OKlE;AEgFZ6'/7Q-/\r%6Ur]"^/Zn2kOL(L>J>]tbGT^1f*0-jjkHA!ER"(A0B0k5]+?!-aRX=[$I\/a,hd6Z@N+=gXO\sX/KcF1[=04R7SFnE=4*'RVYZ18\r%_4AMD.m&G5h&/*CDXnjec^("8PS;?r66G#Q:[cB6]dC_s,7^N`DK0Y,4lu:m>JZ&e<`F9EY`EZGWTkX9c/M4-$VA$3NH[<Q%;rH]\r%07]"W)WN1kct\u2e-\+PZdeH=gIUW'YQS_Wo%L3dTR;(QDL!U$NH-eoka&"_"*[#;mV5:-72t5h>3M_#8a?!LHu%='&L-Ka`nt0e\r%b3$IJJt/Vl<-MEJO)?2A%oEYOLIeCGdNf8HW<Pnb0F^=U;GSnnf+?F=Emcu"mU=k+ksHL?Hg,PE,,Vi`:i8@P##,J&H-m1%/+@Bm\r%,9(T2>#A$QCC>Q4,;FTT;r%Ce$WccNUW@l%Pg=ht"Z\;KW:$fr+5KC[+*/&ZZj.MWK%KFHUQjl"X9r`39'pi\IZja=8PE#))0M7=\r%-]Z(:SiC/X]Du'I20AL7X>)j,hLA7Z'9!sGVOkFdgt;d@5]_+m3n6>h16apjZ53<#V?b92;.nH2DC9Dq:5^X+^I-oU5j;-i.bj\h\r%Nt2uQq"B-!U$O56eF-i#?7-h8s6+#e)ZQIQX7U`<l_M!uE[mZo:'Rhu@+Err,X^6H,\s*7DL.k$b[NcsFn.SiIE_"fJ?,J)lAYR/\r%%&$"e:HA)Z.&4,MKg*))qEF%YjI2_uOS[i15.R6\648uB"6,(7#/'uJGXd0#b%NABToX)d_%/9nH&-=6I%5%bLj$)@T$cK[Td:H!\r%BJ;dk[:Lr^d7lIm0oPj`46WMgoT,od`V^]:"a:`#>FY><2Fd)^_S&q7cl0,q5\g`XB^eC=%K:>[nA9j-5JqZDe7A&4eQB6rZnZEa\r%poNJVCX(KbTXBJ2'_ihd#J\"f*96'QoVs&q?d*9+c52\<CtVnuI<<YA^<=RlS+pc6LES&9;+`*ONfMQubg<aUmKIHdgi;;3Ydu]*\r%^OXlN<q+Rn/EXecDO8>T0&l;5kg"IHRB1JlN/Ptp_aTj;PJGP[%DV8)XG%BooJ%]#&*0J:`MR'K'V@qu7@`?7E^h!#8e3MnfTon<\r%;:`T&0)?-)B]3d>b>Gt'4D6,^AZNoi-<n`Pno^ubo[-C6$#K5gip@uI@`5CPBg^Q%9Y3.XS;kg-_a\Y):aOUHbWa0Q=M[HKZ^;9n\r%hn7!L@@\(lLSSO4#QCj[EnqpeW#HT#lW\)`Wk&+2S/r5#@$bO3Mfct6is+9gs)0/a>+com#4i&9guKZm(MdaO)0fV`NWgr@HPif2\r%)k@&0dr'>Ej\mZn>dU^X+KOKq@2Ql][!K0M#V'QROh-J/d<@fM!N$[2?A3>&SiDO%"Z'8\GJRI2`T1sf?*9QBF'#7842Vc1M)WRD\r%"1Fcq$F8pGg4'72-!IafC>pm,.fK5"J.SW#Lb,RQDh%YRY?ueYp0[gkfC,s"iCh[!/pBg+HgaQPXp6R8'!*W=ag0,]SQbO$6+3Mq\r%H5E[5="NsopXqFelV?HJ7aSXXlK=qPC[7gWl^Z>'+2U>j1RNZ!MA18AY8=pCK6t:V.NHq'%rZarH@=ViDF:TD;6i^dqYH,L.5Z%X\r%glY$b?m^S'ls.[`+;<UBFI+^7%5(ji70kOqFas?B-gLpEl[eu:kAYTqhqd"uebj;ZXM-2HE[]W6f<;.8Xp^%_H4p#.54?""-t1dE\r%4#)]__G[oPf%MWtjs<14YM]!uNO2PIE+bULTtdffDscAP4*.)5fQ1[X6M:lGR9h8Q/@I>B`]'E1ncP!@iC/[*G35WFP,I(IHEin\\r%I7G,r%lYR*Rr7[$'kGb-Fljp1h'eS+Y$1*`VUa#'%X(V?UR-:d^ih#gkLa"\Fe?]+1?XFRPll-%=%F^m+`HT;c5PKWj2-UYb=)uY\r%d;s`T.U@=tf$CbWq,Xe7ImgL%a,f]lG0#pfi3p1&"NhXr6a")"Cn'a]Dqjhd&DV-9r]&iOh7Zk@,1lo*Yo>M=qsG#<bmJ:A^0Urh\r%(q`5o%X+VVgs:0m2n4R*"8UY2#u[+HPD[Jo.SS,[1IEN".<HJha`jN2mA"aq'o#EnM*>MmkTG*:iHI1r)B,3tX!p":;cVDu=[1#?\r%;&I5QYL`*9)qOWn*`hj3M:96t]etsQ>uR>K%8LkaY_p:h/LgK6XFqg/:.PQs**r#'8^4\)2CJdDQGKh;`E`K\DJ.u)YqB_G/#@Os\r%@WfHCH37:urHGMu\K3DZ'A'?X_lRs'dRpQ!V6lg<0&3oh<lm$uB+74(*0jAr0dtOjYSR'`CLKY,.^dh*\CYpEO[jhZok,L!..;M4\r%SD?2.1SV#LU=XT+&]P.k`lE6j'lEg(+(oLeer4:C4i*tIpT^S^MI,5r%lF`q)Sc!OHM3U9O4aC"QiIk#BTHLdgMJCp'LGc3a01QT\r%(02ughS*-ZI;b-Q1STc4^A#\$SWboUg:CF6I;b,f*t^kchtuI#c,lCdD&$*[*ku$QV.%D_@DI*KpoS8B(HQZqdjuJ&"[pt6k(5Mg\r%=^]HoN4@W4gC%\3@Dttrg\:]Qn',Qa7T<79p\m.aF0]CG>PETMn',S/,@W(iH[hR!3E\/4XaW$pR;#/-1[Hsmbl1,'k+8%3*obPo\r%PO(m],eA8GBj4VFd8P[42gI^ZRWo3g['m2Jj1292YLdtn*82!)PkD^ScL.4():;JtLgJt!EG.h[:u:sG3.#_PAjfk:,WE(+Nm5d%\r%ic*G&nW))RHX"+[\a,ErWoc>H+8aKT&G>+KC'B`W2Q&-/3B7[TOlI'X>?J.km<5qOm!D*8RLrPaot<T8m[U?rd<=fcm!D*8pkTd0\r%qq`E-DbelBBIic:[&,bl*$%j?Ka-c.kUO`pd3!FRIb'Hq.jaTU*CaSHS1H"TBL]p:hY7"/HZQK)6sEr3H@<gG"Z(E?mFd:Fb50s:\r%B6R,%N+cu@qp!p!A*l*JYI(&Qgp7[(8$]kSSlSG6*Hg1$K>$-sB]^ao3FH[kQ?gbh_`k_SPEcjAKXK/s=UQa?KbRb;7Bc;7pZ+[k\r%..;P5T\W1B0r2<:b[%F@/b`d#WbBlUr]#7GZ=ZL/h^pI#:HlA4.JW*6b/_mOF*E)aN,Gt*\C:2<Ha45`[-;peS@ppc1SW-oYtj1\\r%m`@su:u:sG34j7;Ajd/2$h(&c14(L63c+g;rmZ(=h;6rFhMpXak2BK"YOlA4[4O0eBZ#g7OHVtGY_MQ=;:`UQ;moiome"3O`Qa2G\r%b5:$;B6R,%N+fhFZ0ZhTMtr/Yg@W'CcJG(m(fAp8?!Q=,c0-W9ihJ"P+%Lh)h>(20]$2!'S\@%qR#e2?:#Gj.m*3Y@&T*gd3dkpk\r%EAO>@o"Ok=fq"<a,C6_N7*dr(geG4Mo*7G+G'1[Vg!a':XWDi8[b$r1Wnr`cH+WB_b[B#iFI:FYZXrM-D4$fP%Vg^()g*66/Z^t>\r%RoP-4^,N.,),W\FhtuI#cH2LeD&66=I;`4L+&PIr^A#\$S!,]S)PJAANMBqLc0,MWa3buMGCESOc>QaAFSajuG!;XX2LY%TZSs7I\r%7^Q<#l1DYtmELFob5:$;B6R,%N+f8rdd4cp3+-hDIT-$lAonc)`mGlLDgp8rDR3NBdrud/PS5B[C^2eL]]]5jG%Y@1GW%cK/pe)G\r%EQ1[!g+s@=dAH6c;0M)3c#=_@/C\`.q,"6LqOq5Oa\ahU,1sk4YSeV8KK(DSXfJRS$=5+WF/()BV.]"KUW/$;g.4/eg-Qlm/Zc5.\r%hCdAU09pHGKKel>(V1J]7=!d+$[m-WLc0$"BJ-]C\^]J0;+oN$W1Xqs<*SR]XG&MV)POE<FX0",OVPV,=.?sR1YLK(0AYolVRr;K\r%0f5hqRrV";UnT]0`Y!2/<)HDC<:FX#d@5mE>X2F"CQ)N-^\?![U)?fgS'?a=b55LLkbB(eZrO>9ZY=`:MQ_`c=OmED@le^1Q3I&,\r%C&9Va@utN/c8K5UXY$VW_X6K[b:WDSde70!lT8mUO)>oaAldfWiGY&`US9rfmEi=XdDK)R25Aj-]i`SJ[nA5KdG"1q^P?YGc(g8f\r%H=8p+&s$AQUHPGgi1]Al*EoGRTT)o&S=bC)c5a6G50@&2Etc08F#G8CdO$&57=!d+$[m-OLtl#P]kZ#<($Yl[jn6[cTpr>=^pctk\r%O.j]k5s'.r.Jmdq@EfF&GFi,YWGe-3+%'2g=UTY"gP@aP%<c@YgSNG.!clXd:s#W!$,&Kd\$0I4gO8XY1]6XgC+o[VoplE&4`o_?\r%bQs3lW^FM0=T$g`Rb#>b18f;Fc<s"+Pgbg^V-L>=qe0hSc0cRef%=r/Au-!8K"U-OINRB(S?5-0WpOh$D/ere]WUcA\fJulJ%N)\\r%(olYmUQfC1ZB*QPei3igY<$>deDGZ_AUS2Co[.M#g<?BT1]6XgC+p7Qa%?.a7Eu($[BO72gS74hBDC5XeR0RVlT5c,]BI6H4kbE6\r%X>Qk\g&-jW4Q3Qk/'?$89f_$E-jn\LEt7o&2s:$n50@&2@m7HZ&[6!ffSGnYJrQ_']^N7^5.Y`%S+U7P)+</V;O5136j:7`U=qpU\r%AM'u$dA,Nr6Us'jnha^_eCnO!(WVuMa0G>U]dTW0S!/b@TQ`:Qeo#u"nb^Vo`qnaJ_Sk<ah"?GY<@:1lOZP5Qi0(@BHgq=79t<Eo\r%+$(-ND<"iZEJdVTo%V"R#m3%$lr:6_""FD/d?MdZOOa=:@&'VJTl3fJPSa6:"%2Q,bGbY?4CJfai8g\mQ#G4W9WP$?neHI\d:YF,\r%?;11:#1sp'XTFc+@atN`2"#rUWNAT"J*4JD+"[cJS@_fpeNoJ/QK.lM_r!dhA'\5T_\b9`]FuJ_`b=u+NLL'P)QlRa0Ql5-nAITe\r%KlP3GXOXp*Wt%cE"8isiFnW%p]X.70!]o8k*keUk['3s?E,K4L%\om'#DXb;^`!O_lOY6sUHofsjatBd)R)--[/uVs@atO3U`YhR\r%9i>0d)Fe2+B4!5%<%YdnjiYA2CWiu3D5P)t3(?3*9nA*6C`,D?BEn`H_QhB#Leg;g=/V^u<h]>iHjZC[USISu3,9iX#+pJKnL7l-\r%ar!`dbH^%@X<P^rg%_)sPs*Da?3(phX4=gi6h<'LAn%&mE^l**IZf79Y9G:U:8H&_"sl%aFIN4I,]_pbq<-<A;1biQrG$ntIeb!+\r%iXFkWnJWC<Xe:ZP4$tA2p5oFHcHK\`FD7ieXj5l6@;".&_2^ite6])dMA*godr?9c@uT-lb$D4tJH^56:KhLR4bCCB!\.4^30A`t\r%,Q+%[HI>hOOFmjpA"*2M$q=@.B](/%f$FfHBo>gPbREIk='c#.nSdKc6#iFX@*KL;Ujk(/1G!80#+*/7:3,QrGuFa=<miSF_>I(5\r%^0@g?`O'Y!>g3O)Q+J0>rB5piR'a3"q9Y)*%k.sh^sH4pQ+LG+bs*I"Yjs'=PXZ&#4sWFA:dO<Bbs#6F2^8Ar&h-C7S%/[,caWs3\r%QRmc)boTodno)06%m*C?Ai(5bE=`6N)V]H6&m?7LIMIj/h)iV17C_\qaLe@\TbfU9Y?s<@T?=e<At9V6%YPk@gu_!@XP#9MK@m-J\r%G"*"D[@=k/0]9<XmG9B:s--C_\;p&qZPV!B^rj@$Y;M9'[li)$C%Yt$Te4o_?m)e"`nQeg0U*.Sej:J79JX1?R#dTq=nCk9Lee_3\r%M9hq5E-JP%M47Z+BUpm766G#EO,L@GY<7jQ"@rX=\Xc6I"sVHdbp,U/N3O/pkiR0W.\aqF$#tmNgu$pObMT_6ll<]0CAe?J;atgP\r%^Od_:"en3%P_o7&JeB`lhR;?Iqt0"MmAnoiXX;8G)9n.$!OlgMW)$8ZT6d-t3"E>X+S"\'rlDm!AN`S;5a$UjK=;<^]*fiePm$kp\r%ShK3f`?K?h]n..F(^!9tU/"%LLFYKiJhdAX.Uj(nLU)AfcqZ$7lIEV]7aSJLFUTeOBMWri=Ag'?K0d;S>;?tnQq':COM`0Tr:VZr\r%..qQ>Cr<>LE7p4u[O#`BR3'H7CmTaO?L?'$gChCukofe<bG_:GJF8DfD7DeL\CpGpL1Q&S>VjuQYu@RcB:e?10kHM^-5n`C/uUK<\r%*BY[B[:-AFW;)d2q.`dc#:PCI>,I4%.L%\E,5^h6mIC\#^[;d@O9gC,aEaFh5OC/aBZ0*d'ubI40Y18[rnb'R6HBiVTNSK99mY:H\r%$eCQ5=0:)iVd-eM@Hj;#<Xu.Gb.6_CETO"aXIPWW[rT,t=h.90T5isTV*I7P3RihtlH5f7hK%_BFe+fXA]r5=)YfOIVefV@S:[7-\r%Mlp<M"(5"OWc/n#iZ5s^O`\9*Lo:JQh<LV8OE`\tlr&:&!!*s9\J[2*@XFFYD(,0K5^o'B_F78/;Hk`!l8J.2-X>['in7]qrZ3X3\r%U;8XgKLsKSI)_G9+NXBP:/["A\da&P)-6kmHka2R/OR=CTj#b;J+smbER=o*Sk(j=T9<5YpgN-[8GnDBVf2cD6Q6C"\"5!VK1]YD\r%jW?2!M?oT;]S?Lfk$Y'GA(]BdKLRIl>8!PuI29bt(@`BfcZTc_-BK_6RKh`'&UpQPUPc*]?W5"%$8a'p?qQ'0;1JOPY6b!^9mbtd\r%r7<*or;=NLJ^-eP[O]h$Bk9-fGLDMUq*rRGde^566$EpHQtT+GFL,L.dphpkE&:?9DfD:dqR#mp>oDq'Fh0/-#?)OGN;E3J7\1We\r%!p'$9C=:hFlN(+Lk'T=fSlBNm"/'r5b&T=@=Up23ZWGm3Ess/aq1?dj"1tLj3\/l?os1K*Ofs1uY5+Br#qOG*pS(*89Iqj#-'edr\r%Eh9Z7"@DEmrmq)JDuTN-VsjW`LVLL:J,.Wurm1'4q1l`bbBO!Wit$Y8o$9OKpYUFEqsKMp`6%u:cgWl3s883*IY+d$nFk<Qrq(,b\r%5aAnTYC?.'J+p^,q>UIkO1S0~>\r%AI9_PrivateDataEnd\r
\ No newline at end of file
index 06c89c1..20892e3 100644 (file)
Binary files a/doc/img/prog_flow.png and b/doc/img/prog_flow.png differ
diff --git a/ecore-cocoa.pc.in b/ecore-cocoa.pc.in
new file mode 100644 (file)
index 0000000..91fc4ee
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: ecore-cocoa
+Description: E core library, Cocoa module
+@pkgconfig_requires_private@: @requirements_ecore_cocoa@
+Version: @VERSION@
+Libs: -L${libdir} -lecore_cocoa
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-con.manifest b/ecore-con.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index c0ad576..9b188aa 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-con
 Description: E core library, Con module
-Requires: ecore @requirements_ecore_con@
+@pkgconfig_requires_private@: @requirements_ecore_con@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_con
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
index 2d11077..0235eb8 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-config
 Description: E core library, Config module
-Requires: ecore @requirements_ecore_config@
+@pkgconfig_requires_private@: @requirements_ecore_config@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_config
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
index 4262972..9eb104a 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-directfb
 Description: E core library, DirectFB module
-Requires: ecore @requirements_ecore_directfb@
+@pkgconfig_requires_private@: @requirements_ecore_directfb@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_directfb
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-evas.manifest b/ecore-evas.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index 164b863..155abbe 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-evas
 Description: E core library, Evas module
-Requires: ecore @requirements_ecore_evas@
+@pkgconfig_requires_private@: @requirements_ecore_evas@
 Version: @VERSION@
-Libs: -L${libdir} -lecore_evas @ecore_evas_libs@
-Cflags: -I${includedir}
+Libs: -L${libdir} @ecore_evas_libs@
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-fb.manifest b/ecore-fb.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index 6402ce4..4e70c48 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-fb
 Description: E core library, FB module
-Requires: ecore @requirements_ecore_fb@
+@pkgconfig_requires_private@: @requirements_ecore_fb@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_fb
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-file.manifest b/ecore-file.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index 2dde219..833ff1e 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-file
 Description: E core library, File module
-Requires: ecore @requirements_ecore_file@
+@pkgconfig_requires_private@: @requirements_ecore_file@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_file
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-imf-evas.manifest b/ecore-imf-evas.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index 0ce11d5..23451c8 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-imf-evas
 Description: E core library, IMF Evas module
-Requires: ecore-imf evas
+@pkgconfig_requires_private@: @requirements_ecore_imf_evas@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_imf_evas
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-imf.manifest b/ecore-imf.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index 7a98b8c..cc155ed 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-imf
 Description: E core library, IMF module
-Requires: ecore
+@pkgconfig_requires_private@: @requirements_ecore_imf@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_imf
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-input-evas.manifest b/ecore-input-evas.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
diff --git a/ecore-input-evas.pc.in b/ecore-input-evas.pc.in
new file mode 100644 (file)
index 0000000..f95325c
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: ecore-input-evas
+Description: E core library, Input module Evas extension
+@pkgconfig_requires_private@: @requirements_ecore_input_evas@
+Version: @VERSION@
+Libs: -L${libdir} -lecore_input_evas
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-input.manifest b/ecore-input.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
diff --git a/ecore-input.pc.in b/ecore-input.pc.in
new file mode 100644 (file)
index 0000000..b670b71
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: ecore-input
+Description: E core library, Input module
+@pkgconfig_requires_private@: @requirements_ecore_input@
+Version: @VERSION@
+Libs: -L${libdir} -lecore_input
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-ipc.manifest b/ecore-ipc.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index 2dc4beb..d66f404 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-ipc
 Description: E core library, IPC module
-Requires: ecore-con @requirements_ecore_ipc@
+@pkgconfig_requires_private@: @requirements_ecore_ipc@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_ipc
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-psl1ght.pc.in b/ecore-psl1ght.pc.in
new file mode 100644 (file)
index 0000000..e81f4e8
--- /dev/null
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: ecore-psl1ght
+Description: E core library, PSL1GHT module
+@pkgconfig_requires_private@: @requirements_ecore_psl1ght@
+Version: @VERSION@
+Libs: -L${libdir} -lecore_psl1ght
+Libs.private: -lio -lsysutil -lgem -lcamera -lspurs
+Cflags: -I${includedir}/ecore-@VMAJ@
index bba6f88..78170c1 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@
 
 Name: ecore-sdl
 Description: E core library, SDL module
-Requires: ecore @requirements_ecore_sdl@
+@pkgconfig_requires_private@: @requirements_ecore_sdl@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_sdl
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-wayland.pc.in b/ecore-wayland.pc.in
new file mode 100644 (file)
index 0000000..f4f5cf3
--- /dev/null
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: ecore-wayland
+Description: E core library, Wayland module
+@pkgconfig_requires_private@: @requirements_ecore_wayland@
+Version: @VERSION@
+Libs: -L${libdir} -lecore_wayland
+Libs.private: -lwayland-client
+Cflags: -I${includedir}/ecore-@VMAJ@
index 9d403ff..ac5ab32 100644 (file)
@@ -5,7 +5,8 @@ includedir=@includedir@
 
 Name: ecore-win32
 Description: E core library, Win32 module
+@pkgconfig_requires_private@: @requirements_ecore_win32@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_win32
-Libs.private: @ddraw_libs@ @direct3d_libs@
-Cflags: -I${includedir}
+Libs.private: @WIN32_LIBS@
+Cflags: -I${includedir}/ecore-@VMAJ@
index a8275f8..c937e88 100644 (file)
@@ -5,7 +5,8 @@ includedir=@includedir@
 
 Name: ecore-wince
 Description: E core library, WinCE module
+@pkgconfig_requires_private@: @requirements_ecore_wince@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_wince
 Libs.private: @WIN32_LIBS@
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
diff --git a/ecore-x.manifest b/ecore-x.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index e134720..a02b42b 100644 (file)
@@ -5,8 +5,8 @@ includedir=@includedir@
 
 Name: ecore-x
 Description: E core library, X module
-Requires: @requirements_ecore_x@
+@pkgconfig_requires_private@: @requirements_ecore_x@
 Version: @VERSION@
 Libs: -L${libdir} -lecore_x
-Libs.private: @x_libs@ @Xcursor_libs@ @XRENDER_LIBS@ @XPRINT_LIBS@ @XINERAMA_LIBS@ @XRANDR_LIBS@ @XFIXES_LIBS@ @XDAMAGE_LIBS@ @XSS_LIBS@ @ecore_txt_libs@
-Cflags: -I${includedir} @have_ecore_x_xcb_define@
+Libs.private: @x_libs@ @ecore_x_libs_private@
+Cflags: -I${includedir}/ecore-@VMAJ@ @have_ecore_x_xcb_define@
index cd68143..db67e7a 100644 (file)
@@ -5,8 +5,8 @@ includedir=@includedir@
 
 Name: ecore
 Description: Ecore event abstraction library
-Requires:
+@pkgconfig_requires_private@: @requirements_ecore@
 Version: @VERSION@
-Libs: -L${libdir} -lecore
+Libs: -L${libdir} -lecore @EINA_LIBS@
 Libs.private: -lm
-Cflags: -I${includedir}
+Cflags: -I${includedir}/ecore-@VMAJ@
index 78a0ce9..d70bfb5 100644 (file)
 %define ac_with_lib_ecore_imf       --%{?with_lib_ecore_imf:en}%{!?with_lib_ecore_imf:dis}able-ecore-imf
 %define ac_with_lib_ecore_sdl       --%{?with_lib_ecore_sdl:en}%{!?with_lib_ecore_sdl:dis}able-ecore-sdl
 
+%{!?_rel:%{expand:%%global _rel 0.r%(svnversion | sed 's/[^0-9].*$//' || echo 0000)}}
+
 Summary: Enlightened Core X interface library
 Name: @PACKAGE@
 Version: @VERSION@
-Release: 0.%(date '+%Y%m%d')
+Release: %{_rel}
 License: BSD
 Group: User Interface/X
 Source: %{name}-%{version}.tar.gz
@@ -46,7 +48,7 @@ URL: http://www.enlightenment.org
 Packager: %{?_packager:%{_packager}}%{!?_packager:Michael Jennings <mej@eterm.org>}
 Vendor: %{?_vendorinfo:%{_vendorinfo}}%{!?_vendorinfo:The Enlightenment Project (http://www.enlightenment.org/)}
 Distribution: %{?_distribution:%{_distribution}}%{!?_distribution:%{_vendor}}
-#BuildSuggests: xorg-x11-devel, XFree86-devel, libX11-devel
+#BuildSuggests: xorg-x11-devel, XFree86-devel, libX11-devel, c-ares-devel
 BuildRequires: libjpeg-devel, openssl-devel %{?breq_lib_ecore_directfb}
 BuildRequires: curl-devel, evas-devel, eet-devel %{?breq_lib_ecore_sdl}
 BuildRoot: %{_tmppath}/%{name}-%{version}-root
@@ -62,20 +64,12 @@ Summary: Ecore headers and development libraries.
 Group: Development/Libraries
 Requires: %{name} = %{version}
 Requires: curl-devel, openssl-devel, evas-devel, eet-devel
-Requires: ecore-bin, ecore-con, ecore-config, ecore-evas, ecore-file, ecore-ipc, ecore-job, ecore-txt
+Requires: ecore-con, ecore-evas, ecore-file, ecore-ipc
 Requires: ecore-x %{?with_lib_ecore_fb:ecore-fb} %{?with_lib_ecore_directfb:ecore-directfb}
 
 %description devel
 Ecore development files
 
-%package bin
-Summary: Tools that support Ecore
-Group: Development/Libraries
-Requires: %{name} = %{version}
-
-%description bin
-Tools that support Ecore
-
 %package con
 Summary: Ecore Connection Library
 Group: Development/Libraries
@@ -84,14 +78,6 @@ Requires: %{name} = %{version}
 %description con
 Ecore Connection Library
 
-%package config
-Summary: Ecore Enlightened Property Library
-Group: Development/Libraries
-Requires: %{name} = %{version}
-
-%description config
-Ecore Enlightened Property Library
-
 %if %{with lib_ecore_directfb}
 %package directfb
 Summary: Ecore DirectFB system functions
@@ -135,29 +121,21 @@ Requires: %{name} = %{version}
 Ecore IMF functions
 %endif
 
-%package ipc
-Summary: Ecore inter-process communication functions
+%package input
+Summary: Ecore input functions
 Group: Development/Libraries
 Requires: %{name} = %{version}
 
-%description ipc
-Ecore inter-process communication functions
+%description input
+Ecore input functions
 
-%package job
-Summary: Ecore job dealing functions
-Group: Development/Libraries
-Requires: %{name} = %{version}
-
-%description job
-Ecore job dealing functions
-
-%package txt
-Summary: Ecore text encoding conversion functions
+%package ipc
+Summary: Ecore inter-process communication functions
 Group: Development/Libraries
 Requires: %{name} = %{version}
 
-%description txt
-Ecore text encoding conversion functions
+%description ipc
+Ecore inter-process communication functions
 
 %package x
 Summary: Ecore functions for dealing with the X Windows System
@@ -168,7 +146,7 @@ Requires: %{name} = %{version}
 Ecore functions for dealing with the X Windows System
 
 %prep
-%setup -q -n %{name}-%{version}
+%setup -q
 
 %build
 CFLAGS="-I/usr/kerberos/include -I/usr/X11R6/include/X11/extensions"
@@ -184,6 +162,7 @@ export CFLAGS LDFLAGS
 
 %install
 %{__make} %{?mflags_install} DESTDIR=$RPM_BUILD_ROOT install
+%{find_lang} %{name}
 
 %post
 /sbin/ldconfig || :
@@ -194,52 +173,46 @@ export CFLAGS LDFLAGS
 %clean
 test "x$RPM_BUILD_ROOT" != "x/" && rm -rf $RPM_BUILD_ROOT
 
-%files
+%files -f %{name}.lang
 %defattr(-, root, root)
 %doc AUTHORS COPYING* README*
-%{_libdir}/libecore.so.*
+%{_libdir}/libecore*.so.*
 
 %files devel
 %defattr(-, root, root)
 %doc doc/html
 %{_libdir}/*.so
+%{_libdir}/ecore/immodules/*.so
+%{_libdir}/ecore/immodules/*.la
 %{_libdir}/*.la
 %{_libdir}/*.a
 %{_libdir}/pkgconfig/*
 #%{_datadir}/aclocal/*
-%{_includedir}/*.h
-
-%files bin
-%defattr(-, root, root)
-%{_bindir}/ecore_config
+%{_includedir}/ecore-1/*.h
 
 %files con
 %defattr(-, root, root)
-%{_libdir}/libecore_con.so.*
-
-%files config
-%defattr(-, root, root)
-%{_libdir}/libecore_config.so.*
+%{_libdir}/libecore_con*.so.*
 
 %if %{with lib_ecore_directfb}
 %files directfb
 %defattr(-, root, root)
-%{_libdir}/libecore_directfb.so.*
+%{_libdir}/libecore_directfb*.so.*
 %endif
 
 %files evas
 %defattr(-, root, root)
-%{_libdir}/libecore_evas.so.*
+%{_libdir}/libecore_evas*.so.*
 
 %if %{with lib_ecore_fb}
 %files fb
 %defattr(-, root, root)
-%{_libdir}/libecore_fb.so.*
+%{_libdir}/libecore_fb*.so.*
 %endif
 
 %files file
 %defattr(-, root, root)
-%{_libdir}/libecore_file.so.*
+%{_libdir}/libecore_file*.so.*
 
 %if %{with lib_ecore_imf}
 %files imf
@@ -247,18 +220,14 @@ test "x$RPM_BUILD_ROOT" != "x/" && rm -rf $RPM_BUILD_ROOT
 %{_libdir}/libecore_imf*.so.*
 %endif
 
-%files ipc
+%files input
 %defattr(-, root, root)
-%{_libdir}/libecore_ipc.so.*
+%{_libdir}/libecore_input*.so.*
 
-%files job
-%defattr(-, root, root)
-%{_libdir}/libecore_job.so.*
-
-%files txt
+%files ipc
 %defattr(-, root, root)
-%{_libdir}/libecore_txt.so.*
+%{_libdir}/libecore_ipc*.so.*
 
 %files x
 %defattr(-, root, root)
-%{_libdir}/libecore_x.so.*
+%{_libdir}/libecore_x*.so.*
index 46c1a42..23479a9 100644 (file)
@@ -1,14 +1,47 @@
+dnl Copyright (C) 2004-2008 Kim Woelders
+dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+dnl Originally snatched from somewhere...
+
+dnl Macro for checking if the compiler supports __attribute__
+
+dnl Usage: AC_C___ATTRIBUTE__
+dnl call AC_DEFINE for HAVE___ATTRIBUTE__ and __UNUSED__
+dnl if the compiler supports __attribute__, HAVE___ATTRIBUTE__ is
+dnl defined to 1 and __UNUSED__ is defined to __attribute__((unused))
+dnl otherwise, HAVE___ATTRIBUTE__ is not defined and __UNUSED__ is
+dnl defined to nothing.
 
 AC_DEFUN([AC_C___ATTRIBUTE__],
 [
-  AC_MSG_CHECKING(for __attribute__)
-  AC_CACHE_VAL(ac_cv___attribute__, [
-  AC_TRY_COMPILE([#include <stdlib.h>],
-  [int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }],
-  ac_cv___attribute__=yes, ac_cv___attribute__=no)])
-  if test "$ac_cv___attribute__" = "yes"; then
-    AC_DEFINE(HAVE___ATTRIBUTE__, 1, [Define to 1 if your compiler has __attribute__])
-  fi
-  AC_MSG_RESULT($ac_cv___attribute__)
+
+AC_MSG_CHECKING([for __attribute__])
+
+AC_CACHE_VAL([ac_cv___attribute__],
+   [AC_TRY_COMPILE(
+       [
+#include <stdlib.h>
+
+int func(int x);
+int foo(int x __attribute__ ((unused)))
+{
+   exit(1);
+}
+       ],
+       [],
+       [ac_cv___attribute__="yes"],
+       [ac_cv___attribute__="no"]
+    )])
+
+AC_MSG_RESULT($ac_cv___attribute__)
+
+if test "x${ac_cv___attribute__}" = "xyes" ; then
+   AC_DEFINE([HAVE___ATTRIBUTE__], [1], [Define to 1 if your compiler has __attribute__])
+   AC_DEFINE([__UNUSED__], [__attribute__((unused))], [Macro declaring a function argument to be unused])
+  else
+    AC_DEFINE([__UNUSED__], [], [Macro declaring a function argument to be unused])
+fi
+
 ])
 
+dnl End of ac_attribute.m4
diff --git a/m4/ac_path_generic.m4 b/m4/ac_path_generic.m4
new file mode 100644 (file)
index 0000000..d427241
--- /dev/null
@@ -0,0 +1,137 @@
+dnl @synopsis AC_PATH_GENERIC(LIBRARY [, MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl
+dnl Runs a LIBRARY-config script and defines LIBRARY_CFLAGS and LIBRARY_LIBS
+dnl
+dnl The script must support `--cflags' and `--libs' args.
+dnl If MINIMUM-VERSION is specified, the script must also support the
+dnl `--version' arg.
+dnl If the `--with-library-[exec-]prefix' arguments to ./configure are given,
+dnl it must also support `--prefix' and `--exec-prefix'.
+dnl (In other words, it must be like gtk-config.)
+dnl
+dnl For example:
+dnl
+dnl    AC_PATH_GENERIC(Foo, 1.0.0)
+dnl
+dnl would run `foo-config --version' and check that it is at least 1.0.0
+dnl
+dnl If so, the following would then be defined:
+dnl
+dnl    FOO_CFLAGS to `foo-config --cflags`
+dnl    FOO_LIBS   to `foo-config --libs`
+dnl
+dnl At present there is no support for additional "MODULES" (see AM_PATH_GTK)
+dnl (shamelessly stolen from gtk.m4 and then hacked around a fair amount)
+dnl
+dnl @author Angus Lees <gusl@cse.unsw.edu.au>
+
+AC_DEFUN([AC_PATH_GENERIC],
+[dnl
+dnl we're going to need uppercase, lowercase and user-friendly versions of the
+dnl string `LIBRARY'
+pushdef([UP], translit([$1], [a-z], [A-Z]))dnl
+pushdef([DOWN], translit([$1], [A-Z], [a-z]))dnl
+
+dnl
+dnl Get the cflags and libraries from the LIBRARY-config script
+dnl
+AC_ARG_WITH(DOWN-prefix,
+        [  --with-]DOWN[-prefix=PFX       Prefix where $1 is installed (optional)],
+        DOWN[]_config_prefix="$withval", DOWN[]_config_prefix="")
+AC_ARG_WITH(DOWN-exec-prefix,
+        [  --with-]DOWN[-exec-prefix=PFX  Exec prefix where $1 is installed (optional)],
+        DOWN[]_config_exec_prefix="$withval", DOWN[]_config_exec_prefix="")
+
+  if test x$DOWN[]_config_exec_prefix != x ; then
+     DOWN[]_config_args="$DOWN[]_config_args --exec-prefix=$DOWN[]_config_exec_prefix"
+     if test x${UP[]_CONFIG+set} != xset ; then
+       UP[]_CONFIG=$DOWN[]_config_exec_prefix/bin/DOWN-config
+     fi
+  fi
+  if test x$DOWN[]_config_prefix != x ; then
+     DOWN[]_config_args="$DOWN[]_config_args --prefix=$DOWN[]_config_prefix"
+     if test x${UP[]_CONFIG+set} != xset ; then
+       UP[]_CONFIG=$DOWN[]_config_prefix/bin/DOWN-config
+     fi
+  fi
+
+  AC_PATH_PROG(UP[]_CONFIG, DOWN-config, no)
+  ifelse([$2], ,
+     AC_MSG_CHECKING(for $1),
+     AC_MSG_CHECKING(for $1 - version >= $2)
+  )
+  no_[]DOWN=""
+  if test "$UP[]_CONFIG" = "no" ; then
+     no_[]DOWN=yes
+  else
+     UP[]_CFLAGS="`$UP[]_CONFIG $DOWN[]_config_args --cflags`"
+     UP[]_LIBS="`$UP[]_CONFIG $DOWN[]_config_args --libs`"
+     ifelse([$2], , ,[
+        DOWN[]_config_major_version=`$UP[]_CONFIG $DOWN[]_config_args \
+         --version | sed 's/[[^0-9]]*\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\1/'`
+        DOWN[]_config_minor_version=`$UP[]_CONFIG $DOWN[]_config_args \
+         --version | sed 's/[[^0-9]]*\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\2/'`
+        DOWN[]_config_micro_version=`$UP[]_CONFIG $DOWN[]_config_args \
+         --version | sed 's/[[^0-9]]*\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\3/'`
+        DOWN[]_wanted_major_version="regexp($2, [\<\([0-9]*\)], [\1])"
+        DOWN[]_wanted_minor_version="regexp($2, [\<\([0-9]*\)\.\([0-9]*\)], [\2])"
+        DOWN[]_wanted_micro_version="regexp($2, [\<\([0-9]*\).\([0-9]*\).\([0-9]*\)], [\3])"
+
+        # Compare wanted version to what config script returned.
+        # If I knew what library was being run, i'd probably also compile
+        # a test program at this point (which also extracted and tested
+        # the version in some library-specific way)
+        if test "$DOWN[]_config_major_version" -lt \
+                        "$DOWN[]_wanted_major_version" \
+          -o \( "$DOWN[]_config_major_version" -eq \
+                        "$DOWN[]_wanted_major_version" \
+            -a "$DOWN[]_config_minor_version" -lt \
+                        "$DOWN[]_wanted_minor_version" \) \
+          -o \( "$DOWN[]_config_major_version" -eq \
+                        "$DOWN[]_wanted_major_version" \
+            -a "$DOWN[]_config_minor_version" -eq \
+                        "$DOWN[]_wanted_minor_version" \
+            -a "$DOWN[]_config_micro_version" -lt \
+                        "$DOWN[]_wanted_micro_version" \) ; then
+          # older version found
+          no_[]DOWN=yes
+          echo -n "*** An old version of $1 "
+          echo -n "($DOWN[]_config_major_version"
+          echo -n ".$DOWN[]_config_minor_version"
+          echo    ".$DOWN[]_config_micro_version) was found."
+          echo -n "*** You need a version of $1 newer than "
+          echo -n "$DOWN[]_wanted_major_version"
+          echo -n ".$DOWN[]_wanted_minor_version"
+          echo    ".$DOWN[]_wanted_micro_version."
+          echo "***"
+          echo "*** If you have already installed a sufficiently new version, this error"
+          echo "*** probably means that the wrong copy of the DOWN-config shell script is"
+          echo "*** being found. The easiest way to fix this is to remove the old version"
+          echo "*** of $1, but you can also set the UP[]_CONFIG environment to point to the"
+          echo "*** correct copy of DOWN-config. (In this case, you will have to"
+          echo "*** modify your LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf"
+          echo "*** so that the correct libraries are found at run-time)"
+        fi
+     ])
+  fi
+  if test "x$no_[]DOWN" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$3], , :, [$3])
+  else
+     AC_MSG_RESULT(no)
+     if test "$UP[]_CONFIG" = "no" ; then
+       echo "*** The DOWN-config script installed by $1 could not be found"
+       echo "*** If $1 was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the UP[]_CONFIG environment variable to the"
+       echo "*** full path to DOWN-config."
+     fi
+     UP[]_CFLAGS=""
+     UP[]_LIBS=""
+     ifelse([$4], , :, [$4])
+  fi
+  AC_SUBST(UP[]_CFLAGS)
+  AC_SUBST(UP[]_LIBS)
+
+  popdef([UP])
+  popdef([DOWN])
+])
index 41fb8c1..a15120c 100644 (file)
@@ -1,4 +1,4 @@
-dnl use: ECORE_CHECK_X_EXTENSION(Foo, header, lib, func)
+dnl use: ECORE_CHECK_X_EXTENSION(Foo, header, lib, func, want)
 AC_DEFUN([ECORE_CHECK_X_EXTENSION],
 [
 pushdef([UP], translit([$1], [a-z], [A-Z]))dnl
@@ -8,24 +8,29 @@ UP[]_CFLAGS=""
 UP[]_LIBS=""
 use_[]DOWN="no"
 
-SAVE_CFLAGS=$CFLAGS
-CFLAGS="$x_cflags $x_includes"
-AC_CHECK_HEADER(X11/extensions/$2,
-  [
-   AC_CHECK_LIB($3, $4,
-     [
-      AC_DEFINE(ECORE_[]UP, 1, [Build support for $1])
-      UP[]_LIBS="-l$3"
-      use_[]DOWN="yes"
-     ],
-     [ use_[]DOWN="no" ],
-     [ $x_libs ]
-   )
-  ],
-  [ use_[]DOWN="no" ],
-  [ #include <X11/Xlib.h> ]
-)
-CFLAGS=$SAVE_CFLAGS
+if test "x$5" != "xno"; then
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$x_cflags $x_includes"
+  AC_CHECK_HEADER(X11/extensions/$2,
+    [
+     AC_CHECK_LIB($3, $4,
+       [
+        AC_DEFINE(ECORE_[]UP, 1, [Build support for $1])
+        UP[]_LIBS="-l$3"
+        use_[]DOWN="yes"
+       ],
+       [ use_[]DOWN="no" ],
+       [ $x_libs ]
+     )
+    ],
+    [ use_[]DOWN="no" ],
+    [ #include <X11/Xlib.h> ]
+  )
+  CFLAGS=$SAVE_CFLAGS
+else
+  use_[]DOWN="no"
+  AC_MSG_NOTICE([$1 support disabled])
+fi
 
 AC_SUBST(UP[]_CFLAGS)
 AC_SUBST(UP[]_LIBS)
index 8859c52..01c4e0e 100644 (file)
@@ -1,99 +1,97 @@
-dnl use: ECORE_CHECK_MODULE(Foo, default-enabled[, dependancy[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]])
+dnl use: ECORE_CHECK_MODULE(Foo, default-enabled, description[, dependency[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]])
 AC_DEFUN([ECORE_CHECK_MODULE],
 [
-pushdef([UP], translit([$1], [a-z], [A-Z]))dnl
-pushdef([DOWN], translit([$1], [A-Z], [a-z]))dnl
+m4_pushdef([UP], m4_translit([[$1]], [-a-z], [_A-Z]))dnl
+m4_pushdef([DOWN], m4_translit([[$1]], [-A-Z], [_a-z]))dnl
 
-have_ecore_[]DOWN="no"
-ecore_[]DOWN[]_cflags=""
-ecore_[]DOWN[]_libs=""
+have_ecore_[]m4_defn([DOWN])=no
+ecore_[]m4_defn([DOWN])[]_cflags=
+ecore_[]m4_defn([DOWN])[]_libs=
+want_module=$2
 
-ifelse("x$2", "xno",
-[
-  AC_ARG_ENABLE(ecore-[]DOWN,
-    AC_HELP_STRING(
-      [--enable-ecore-[]DOWN],
-      [enable the ecore_[]DOWN module. [[default=disabled]]]
-    ),
-    [ want_ecore_[]DOWN=$enableval ],
-    [ want_ecore_[]DOWN=no ])
-],
-[
-  AC_ARG_ENABLE(ecore-[]DOWN,
-    AC_HELP_STRING(
-      [--disable-ecore-[]DOWN],
-      [disable the ecore_[]DOWN module. [[default=enabled]]]
-    ),
-    [ want_ecore_[]DOWN=$enableval ],
-    [ want_ecore_[]DOWN=yes ])
-])
+AC_ARG_ENABLE(ecore-$1,
+   [AC_HELP_STRING(
+       [--enable-ecore-$1],
+       [enable the ecore_]m4_defn([DOWN])[ module])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_module="yes"
+    else
+       want_module="no"
+    fi
+   ],
+   [])
+
+AC_MSG_CHECKING([whether Ecore_$3 module is to be built])
 
-AC_MSG_CHECKING(whether ecore_[]DOWN module is to be built)
-
-if test "x$want_ecore_[]DOWN" = "xyes" ; then
-  if test "x$3" = "x" -o "x$3" = "xyes" ; then
-    AC_DEFINE(BUILD_ECORE_[]UP, 1, [Build Ecore_$1 Module])
-    have_ecore_[]DOWN="yes"
-    ecore_[]DOWN[]_libs="-lecore_[]DOWN"
-    AC_MSG_RESULT([yes])
-  else
-    AC_MSG_RESULT([no (dependancy failed)])
-  fi
+if test "x${want_module}" = "xyes" ; then
+   if test "x$4" = "x" || test "x$4" = "xyes" ; then
+      AC_DEFINE([BUILD_ECORE_]m4_defn([UP]), [1], [Build Ecore_$3 Module])
+      have_ecore_[]m4_defn([DOWN])="yes"
+      ecore_[]m4_defn([DOWN])[]_libs="-lecore_[]m4_defn([DOWN])"
+      AC_MSG_RESULT([yes])
+   else
+      AC_MSG_RESULT([no (dependency failed)])
+   fi
 else
-  AC_MSG_RESULT([no])
+   AC_MSG_RESULT([no])
 fi
 
-AM_CONDITIONAL(BUILD_ECORE_[]UP, test "x$have_ecore_[]DOWN" = "xyes")
+AM_CONDITIONAL([BUILD_ECORE_]UP, [test "x$have_ecore_]DOWN[" = "xyes"])
 
-if test "x$have_ecore_[]DOWN" = "xyes" ; then
-  ifelse([$4], , :, [$4])
-else
-  ifelse([$5], , :, [$5])
-fi
+AS_IF([test "x$have_ecore_[]m4_defn([DOWN])" = "xyes"], [$5], [$6])
 
-AC_SUBST(ecore_[]DOWN[]_cflags)
-AC_SUBST(ecore_[]DOWN[]_libs)
+AC_SUBST(ecore_[]m4_defn([DOWN])[]_cflags)
+AC_SUBST(ecore_[]m4_defn([DOWN])[]_libs)
 
-popdef([UP])
-popdef([DOWN])
+m4_popdef([UP])
+m4_popdef([DOWN])
 ])
 
-dnl use: ECORE_EVAS_CHECK_MODULE(foo-bar, want, description, backend[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
-AC_DEFUN([ECORE_EVAS_CHECK_MODULE],
+dnl use: ECORE_EVAS_CHECK_MODULE_FULL(foo-bar, evas-module, want, description, backend[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_EVAS_CHECK_MODULE_FULL],
 [
-pushdef([UP], translit([$1], [-a-z], [_A-Z]))dnl
-pushdef([DOWN], translit([$1], [-A-Z], [_a-z]))dnl
+m4_pushdef([UP], m4_translit([[$1]], [-a-z], [_A-Z]))dnl
+m4_pushdef([DOWN], m4_translit([[$1]], [-A-Z], [_a-z]))dnl
 
-have_ecore_evas_[]DOWN="no"
-want_module="$2"
+have_ecore_evas_[]m4_defn([DOWN])="no"
+want_module="$3"
 
-AC_ARG_ENABLE(ecore-$1,
-  AC_HELP_STRING(
-    [--enable-ecore-evas-$1],
-    [enable $3 support in the ecore_evas module.]
-  ),
-  [ want_module=$enableval ]
-)
-AC_MSG_CHECKING(whether ecore_evas $3 support is to be built)
-AC_MSG_RESULT($want_module)
-
-if test "x$4" = "xyes" -a \
-        "x$have_ecore_evas" = "xyes" -a \
-        "x$want_module" = "xyes" ; then
-  PKG_CHECK_MODULES(EVAS_[]UP, evas-$1,
-    [
-     AC_DEFINE(BUILD_ECORE_EVAS_[]UP, 1, [Support for $3 Engine in Ecore_Evas])
-     have_ecore_evas_[]DOWN="yes";
-    ]
-  )
-fi
+AC_ARG_ENABLE(ecore-evas-$1,
+   [AC_HELP_STRING(
+       [--enable-ecore-evas-$1],
+       [enable $4 support in the ecore_evas module.])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       want_module="yes"
+    else
+       want_module="no"
+    fi
+   ],
+   [])
 
-if test "x$have_ecore_evas_[]DOWN" = "xyes" ; then
-  ifelse([$5], , :, [$5])
-else
-  ifelse([$6], , :, [$6])
+AC_MSG_CHECKING([whether ecore_evas $4 support is to be built])
+AC_MSG_RESULT([${want_module}])
+
+if test "x$5" = "xyes" && \
+   test "x$have_ecore_evas" = "xyes" && \
+   test "x$want_module" = "xyes" ; then
+   PKG_CHECK_EXISTS([evas-$2],
+      [
+       AC_DEFINE([BUILD_ECORE_EVAS_]m4_defn([UP]), [1], [Support for $4 Engine in Ecore_Evas])
+       have_ecore_evas_[]m4_defn([DOWN])="yes"
+      ])
 fi
 
-popdef([UP])
-popdef([DOWN])
+AC_MSG_CHECKING([whether ecore_evas $4 support is built])
+AC_MSG_RESULT([$have_ecore_evas_]m4_defn([DOWN]))
+
+AS_IF([test "x$have_ecore_evas_[]m4_defn([DOWN])" = "xyes"], [$6], [$7])
+
+m4_popdef([UP])
+m4_popdef([DOWN])
 ])
+
+dnl use: ECORE_EVAS_CHECK_MODULE(foo-bar, want, description, backend[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_EVAS_CHECK_MODULE],
+[ECORE_EVAS_CHECK_MODULE_FULL([$1], [$1], [$2], [$3], [$4], [$5], [$6])])
diff --git a/m4/ecore_check_options.m4 b/m4/ecore_check_options.m4
new file mode 100644 (file)
index 0000000..d20adca
--- /dev/null
@@ -0,0 +1,331 @@
+dnl use: ECORE_CHECK_POLL(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_POLL],
+[
+_ecore_want_poll=$1
+_ecore_have_poll="no"
+
+AC_ARG_ENABLE(poll,
+   [AC_HELP_STRING([--disable-poll], [disable poll in the ecore_file module])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_poll="yes"
+    else
+       _ecore_want_poll="no"
+    fi
+   ])
+
+AC_MSG_CHECKING(whether polling is to be used for filemonitoring)
+AC_MSG_RESULT(${_ecore_want_poll})
+
+if test "x${_ecore_want_poll}" = "xyes" ; then
+   AC_DEFINE([HAVE_POLL], [1], [ File monitoring with polling ])
+   _ecore_have_poll="yes"
+fi
+
+if test "x${_ecore_have_poll}" = "xyes" ; then
+   m4_default([$2], [:])
+else
+   m4_default([$3], [:])
+fi
+])
+
+dnl use: ECORE_CHECK_INOTIFY(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_INOTIFY],
+[
+_ecore_want_inotify=$1
+_ecore_have_inotify="no"
+
+dnl We need to check if the right inotify version is accessible
+_ecore_want_inotify="yes"
+AC_ARG_ENABLE(inotify,
+   [AC_HELP_STRING([--disable-inotify], [disable inotify in the ecore_file module])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_inotify="yes"
+    else
+       _ecore_want_inotify="no"
+    fi
+   ])
+
+AC_MSG_CHECKING(whether inotify is to be used for filemonitoring)
+AC_MSG_RESULT($_ecore_want_inotify)
+
+dnl It is hard to find a good test on how to check the correct
+dnl inotify version. They changed the headers a lot.
+dnl in kernel 2.6.13 __NR_inotify_init was added to the defined syscalls
+dnl in asm/unistd.h and IN_MOVE_SELF was added to linux/inotify.h
+dnl so with this check you need a very new kernel and kernel-headers!
+
+if test "x${_ecore_want_inotify}" = "xyes" ; then
+   AC_CHECK_LIB([c], [inotify_init],
+      [
+       AC_DEFINE(HAVE_INOTIFY, 1, [ File monitoring with Inotify ])
+       AC_DEFINE(HAVE_SYS_INOTIFY, 1, [ File monitoring with Inotify - sys/inotify.h ])
+       _ecore_have_inotify="yes"
+      ],
+      [
+       AC_TRY_COMPILE(
+          [
+           #include <asm/unistd.h>
+           #include <linux/inotify.h>
+          ],
+          [int a = __NR_inotify_init; int b = IN_MOVE_SELF;],
+          [
+           AC_DEFINE([HAVE_INOTIFY], [1], [ File monitoring with Inotify ])
+           _ecore_have_inotify="yes"
+          ],
+          [_ecore_have_inotify="no"])
+      ])
+fi
+
+if test "x$_ecore_have_inotify" = "xyes" ; then
+   m4_default([$2], [:])
+else
+   m4_default([$3], [:])
+fi
+])
+dnl use: ECORE_CHECK_NOTIFY_WIN32(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_NOTIFY_WIN32],
+[
+_ecore_want_notify_win32=$1
+_ecore_have_notify_win32="no"
+
+AC_ARG_ENABLE(notify-win32,
+   [AC_HELP_STRING([--disable-notify-win32], [disable Windows notification in the ecore_file module])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_notify_win32="yes"
+    else
+       _ecore_want_notify_win32="no"
+    fi
+   ])
+
+AC_MSG_CHECKING(whether Windows notification is to be used for filemonitoring)
+AC_MSG_RESULT(${_ecore_want_notify_win32})
+
+if test "x${_ecore_want_notify_win32}" = "xyes" ; then
+   AC_DEFINE([HAVE_NOTIFY_WIN32], [1], [ File monitoring with Windows notification ])
+   _ecore_have_notify_win32="yes"
+fi
+
+if test "x${_ecore_have_notify_win32}" = "xyes" ; then
+   m4_default([$2], [:])
+else
+   m4_default([$3], [:])
+fi
+])
+
+dnl use: ECORE_CHECK_CURL(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_CURL],
+[
+_ecore_want_curl=$1
+_ecore_have_curl="no"
+
+AC_ARG_ENABLE([curl],
+   [AC_HELP_STRING([--disable-curl], [disable curl support])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_curl="yes"
+    else
+       _ecore_want_curl="no"
+    fi
+   ])
+
+if test "x${_ecore_want_curl}" = "xyes" ; then
+   PKG_CHECK_MODULES(CURL, libcurl,
+      [
+       AC_DEFINE(HAVE_CURL, 1, [ Downloading with CURL ])
+       _ecore_have_curl="yes"
+      ],
+      [_ecore_have_curl="no"])
+fi
+
+if test "x$_ecore_have_curl" = "xyes" ; then
+   m4_default([$2], [:])
+else
+   m4_default([$3], [:])
+fi
+])
+
+dnl use: ECORE_CHECK_GNUTLS(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_GNUTLS],
+[
+_ecore_want_gnutls=$1
+_ecore_have_gnutls="no"
+
+AC_ARG_ENABLE([gnutls],
+   [AC_HELP_STRING([--disable-gnutls], [disable gnutls support])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_gnutls="yes"
+    else
+       _ecore_want_gnutls="no"
+    fi
+   ])
+
+if test "x${_ecore_want_gnutls}" = "xyes" -o "x${_ecore_want_gnutls}" = "xauto" ; then
+   PKG_CHECK_MODULES([TLS], [gnutls >= 2.10.2],
+      [
+       AC_DEFINE([USE_GNUTLS], [1], [Use GnuTLS])
+       _ecore_have_gnutls="yes"
+      ],
+      [_ecore_have_gnutls="no"])
+   # for ecore_con_ssl.c
+   PKG_CHECK_MODULES([TLS2], [gnutls >= 2.10.2],
+      [AC_DEFINE(USE_GNUTLS2, 1, [Use GnuTLS 2 or higher])],
+      [dummy="no"])
+   if test "x$_ecore_have_gnutls" = "xyes";then
+     AC_PATH_GENERIC([libgcrypt], [], [_ecore_have_gnutls="yes"], [_ecore_have_gnutls="no"])
+        if test "x${_ecore_have_gnutls}" = "xyes" ; then
+           TLS_CFLAGS="${TLS_CFLAGS} ${LIBGCRYPT_CFLAGS}"
+           TLS_LIBS="${TLS_LIBS} ${LIBGCRYPT_LIBS}"
+        fi
+   fi
+
+fi
+
+if test "x$_ecore_have_gnutls" = "xyes" ; then
+  ifelse([$2], , :, [$2])
+else
+  ifelse([$3], , :, [$3])
+fi
+])
+
+dnl use: ECORE_CHECK_OPENSSL(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_OPENSSL],
+[
+_ecore_want_openssl=$1
+_ecore_have_openssl="no"
+
+AC_ARG_ENABLE(openssl,
+  [AC_HELP_STRING([--disable-openssl], [disable openssl support])],
+  [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_openssl="yes"
+    else
+       _ecore_want_openssl="no"
+    fi
+  ])
+
+if test "x${_ecore_have_gnutls}" = "xyes";then
+  _ecore_want_openssl=no
+fi
+
+if test "x${_ecore_want_openssl}" = "xyes" -o "x${_ecore_want_openssl}" = "xauto"; then
+   PKG_CHECK_MODULES([SSL],
+      [openssl],
+      [
+       AC_DEFINE(USE_OPENSSL, 1, [Use OpenSSL])
+       _ecore_have_openssl="yes"
+      ],
+      [_ecore_have_openssl="no"])
+fi
+
+if test "x$_ecore_have_openssl" = "xyes" ; then
+   m4_default([$2], [:])
+else
+   m4_default([$3], [:])
+fi
+])
+
+dnl use: ECORE_CHECK_TSLIB(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_TSLIB],
+[
+_tslib_requirement=""
+_ecore_want_tslib=$1
+_ecore_have_tslib="no"
+TSLIB_LIBS=""
+TSLIB_CFLAGS=""
+
+AC_ARG_ENABLE([tslib],
+   [AC_HELP_STRING([--disable-tslib],
+       [disable the tslib support in ecore (currently ecore-fb).
+        @<:@default=detect@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_tslib="yes"
+    else
+       _ecore_want_tslib="no"
+    fi
+   ])
+
+if test "x${_ecore_want_tslib}" = "xyes" -o "x${_ecore_want_tslib}" = "xauto" ; then
+   PKG_CHECK_MODULES([TSLIB], [tslib-1.0],
+     [
+      AC_DEFINE(HAVE_TSLIB, 1, [Build Ecore_FB Touchscreen Code])
+      _ecore_have_tslib="yes"
+      _tslib_requirement="tslib-1.0"
+     ],[
+      PKG_CHECK_MODULES([TSLIB], [tslib],
+        [
+         AC_DEFINE(HAVE_TSLIB, 1, [Build Ecore_FB Touchscreen Code])
+         _ecore_have_tslib="yes"
+         _tslib_requirement="tslib"
+        ],[
+         AC_CHECK_HEADER([tslib.h],
+           [
+            AC_CHECK_LIB([ts], [ts_open], 
+              [
+               TSLIB_LIBS="-lts" 
+               TSLIB_CFLAGS=""
+               AC_DEFINE(HAVE_TSLIB, 1, [Build Ecore_FB Touchscreen Code])
+               _ecore_have_tslib="yes"
+              ],[
+               AC_CHECK_LIB([tslib], [ts_open],
+                 [
+                  TSLIB_LIBS="-ltslib"
+                  TSLIB_CFLAGS=""
+                  AC_DEFINE(HAVE_TSLIB, 1, [Build Ecore_FB Touchscreen Code])
+                  _ecore_have_tslib="yes"
+                 ],[
+                  _ecore_have_tslib="no"
+                 ])
+              ])
+           ])
+        ])
+     ])
+fi
+
+AC_SUBST(TSLIB_LIBS)
+AC_SUBST(TSLIB_CFLAGS)
+
+if test "x$_ecore_have_tslib" = "xyes" ; then
+   m4_default([$2], [:])
+else
+   m4_default([$3], [:])
+fi
+])
+
+dnl use: ECORE_CHECK_CARES(default-enabled[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+AC_DEFUN([ECORE_CHECK_CARES],
+[
+_ecore_want_cares=$1
+_ecore_have_cares="no"
+
+AC_ARG_ENABLE(cares,
+  [AC_HELP_STRING([--disable-cares], [disable cares support])],
+  [
+    if test "x${enableval}" = "xyes" ; then
+       _ecore_want_cares="yes"
+    else
+       _ecore_want_cares="no"
+    fi
+  ])
+
+if test "x${_ecore_want_cares}" = "xyes" -o "x${_ecore_want_cares}" = "xauto" ; then
+   PKG_CHECK_MODULES([CARES], [libcares >= 1.6.1],
+     [_ecore_have_cares="yes"],
+     [_ecore_have_cares="no"])
+fi
+
+if test "x${_ecore_have_cares}" = "xyes" ; then
+   AC_DEFINE([HAVE_CARES], [1], [Build Ecore_Con_Info with c-ares support])
+fi
+
+if test "x$_ecore_have_cares" = "xyes" ; then
+   m4_default([$2], [:])
+else
+   m4_default([$3], [:])
+fi
+])
diff --git a/m4/efl_compiler.m4 b/m4/efl_compiler.m4
new file mode 100644 (file)
index 0000000..5f17be4
--- /dev/null
@@ -0,0 +1,56 @@
+dnl Copyright (C) 2012 Vincent Torri <vincent dot torri at gmail dot com>
+dnl This code is public domain and can be freely used or copied.
+
+dnl Macro that check if compiler of linker flags are available
+
+
+dnl Macro that checks for a compiler flag availability
+dnl
+dnl EFL_CHECK_COMPILER_FLAG(EFL, FLAG[, ACTION-IF-FOUND[ ,ACTION-IF-NOT-FOUND]])
+dnl AC_SUBST : EFL_CFLAGS (EFL being replaced by its value)
+dnl AM_CONDITIONAL : EFL_HAVE_FLAG (FLAG being replaced by its value)
+
+AC_DEFUN([EFL_CHECK_COMPILER_FLAG],
+[
+m4_pushdef([UPEFL], m4_translit([[$1]], [-a-z], [_A-Z]))
+m4_pushdef([UP], m4_translit([[$2]], [-a-z], [_A-Z]))
+
+dnl store in options -Wfoo if -Wno-foo is passed
+option=m4_bpatsubst([[$2]], [-Wno-], [-W])
+
+CFLAGS_save="${CFLAGS}"
+CFLAGS="${CFLAGS} ${option}"
+
+AC_LANG_PUSH([C])
+AC_MSG_CHECKING([whether the compiler supports $2])
+
+AC_COMPILE_IFELSE(
+   [AC_LANG_PROGRAM([[]])],
+   [have_flag="yes"],
+   [have_flag="no"])
+AC_MSG_RESULT([${have_flag}])
+
+CFLAGS="${CFLAGS_save}"
+AC_LANG_POP([C])
+
+if test "x${have_flag}" = "xyes" ; then
+   UPEFL[_CFLAGS]="${UPEFL[_CFLAGS]} [$2]"
+fi
+AC_ARG_VAR(UPEFL[_CFLAGS], [preprocessor flags for $2])
+AC_SUBST(UPEFL[_CFLAGS])
+
+AM_CONDITIONAL([EFL_HAVE]UP, [test "x${have_flag}" = "xyes"])
+
+m4_popdef([UP])
+m4_popdef([UPEFL])
+])
+
+dnl Macro that iterates over a sequence of white separated flags
+dnl and that call EFL_CHECK_COMPILER_FLAG() for each of these flags
+dnl
+dnl EFL_CHECK_COMPILER_FLAGS(EFL, FLAGS)
+
+AC_DEFUN([EFL_CHECK_COMPILER_FLAGS],
+[
+m4_foreach_w([flag], [$2], [EFL_CHECK_COMPILER_FLAG([$1], m4_defn([flag]))])
+])
diff --git a/m4/efl_compiler_flag.m4 b/m4/efl_compiler_flag.m4
new file mode 100644 (file)
index 0000000..25c285d
--- /dev/null
@@ -0,0 +1,57 @@
+dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr>
+dnl                and Albin Tonnerre <albin dot tonnerre at gmail dot com>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that checks if a compiler flag is supported by the compiler.
+
+dnl Usage: EFL_COMPILER_FLAG(flag)
+dnl flag is added to CFLAGS if supported.
+
+AC_DEFUN([EFL_COMPILER_FLAG],
+[
+
+CFLAGS_save="${CFLAGS}"
+CFLAGS="${CFLAGS} $1"
+  
+AC_LANG_PUSH([C])
+AC_MSG_CHECKING([whether the compiler supports $1])
+
+AC_COMPILE_IFELSE(
+   [AC_LANG_PROGRAM([[]])],
+   [have_flag="yes"],
+   [have_flag="no"])
+AC_MSG_RESULT([${have_flag}])
+
+if test "x${have_flag}" = "xno" ; then
+   CFLAGS="${CFLAGS_save}"
+fi
+AC_LANG_POP([C])
+
+])
+
+dnl Macro that checks if a linker flag is supported by the compiler.
+
+dnl Usage: EFL_LINKER_FLAG(flag)
+dnl flag is added to LDFLAGS if supported (will be passed to ld anyway).
+
+AC_DEFUN([EFL_LINKER_FLAG],
+[
+
+LDFLAGS_save="${LDFLAGS}"
+LDFLAGS="${LDFLAGS} $1"
+  
+AC_LANG_PUSH([C])
+AC_MSG_CHECKING([whether the compiler supports $1])
+
+AC_LINK_IFELSE(
+   [AC_LANG_PROGRAM([[]])],
+   [have_flag="yes"],
+   [have_flag="no"])
+AC_MSG_RESULT([${have_flag}])
+
+if test "x${have_flag}" = "xno" ; then
+   LDFLAGS="${LDFLAGS_save}"
+fi
+AC_LANG_POP([C])
+
+])
diff --git a/m4/efl_coverage.m4 b/m4/efl_coverage.m4
new file mode 100644 (file)
index 0000000..85d0321
--- /dev/null
@@ -0,0 +1,62 @@
+dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if coverage support is wanted and, if yes, if
+dnl lcov is available.
+
+dnl Usage: EFL_CHECK_COVERAGE(tests [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl The parameter 'tests' is used if a dependency is needed. If set to "yes",
+dnl the dependency is available.
+dnl Defines EFL_COVERAGE_CFLAGS and EFL_COVERAGE_LIBS variables
+dnl Defines the automake conditionnal EFL_ENABLE_COVERAGE
+
+AC_DEFUN([EFL_CHECK_COVERAGE],
+[
+
+dnl configure option
+
+AC_ARG_ENABLE([coverage],
+   [AC_HELP_STRING([--enable-coverage], [enable coverage profiling instrumentation @<:@default=disabled@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_coverage="yes"
+    else
+       _efl_enable_coverage="no"
+    fi
+   ],
+   [_efl_enable_coverage="no"])
+
+AC_MSG_CHECKING([whether to use profiling instrumentation])
+AC_MSG_RESULT([$_efl_enable_coverage])
+
+dnl lcov check
+
+if test "x$_efl_enable_coverage" = "xyes" && test ! "x$1" = "xyes" ; then
+   AC_MSG_WARN([Coverage report requested but tests not being built, disable profiling instrumentation.])
+   AC_MSG_WARN([Run configure with --enable-tests])
+   _efl_enable_coverage="no"
+fi
+
+if test "x$_efl_enable_coverage" = "xyes" ; then
+   AC_CHECK_PROG(have_lcov, [lcov], [yes], [no])
+   if test "x$have_lcov" = "xyes" ; then
+      EFL_COVERAGE_CFLAGS="-fprofile-arcs -ftest-coverage"
+      EFL_COVERAGE_LIBS="-lgcov"
+# remove any optimisation flag and force debug symbols
+      EFL_DEBUG_CFLAGS="-g -O0 -DDEBUG"
+   else
+      AC_MSG_WARN([lcov is not found, disable profiling instrumentation])
+      _efl_enable_coverage="no"
+   fi
+fi
+
+dnl Substitution
+AC_SUBST(EFL_COVERAGE_CFLAGS)
+AC_SUBST(EFL_COVERAGE_LIBS)
+
+AM_CONDITIONAL(EFL_ENABLE_COVERAGE, test "x${_efl_enable_coverage}" = "xyes")
+
+AS_IF([test "x$_efl_enable_coverage" = "xyes"], [$2], [$3])
+])
+
+dnl End of efl_coverage.m4
diff --git a/m4/efl_doxygen.m4 b/m4/efl_doxygen.m4
new file mode 100644 (file)
index 0000000..d83ed68
--- /dev/null
@@ -0,0 +1,97 @@
+dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if doxygen is available or not.
+
+dnl EFL_CHECK_DOXYGEN([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for the doxygen program
+dnl Defines efl_doxygen
+dnl Defines the automake conditionnal EFL_BUILD_DOC
+dnl
+AC_DEFUN([EFL_CHECK_DOXYGEN],
+[
+
+dnl
+dnl Disable the build of the documentation
+dnl
+AC_ARG_ENABLE([doc],
+   [AC_HELP_STRING(
+       [--disable-doc],
+       [Disable documentation build @<:@default=enabled@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       efl_enable_doc="yes"
+    else
+       efl_enable_doc="no"
+    fi
+   ],
+   [efl_enable_doc="yes"])
+
+AC_MSG_CHECKING([whether to build documentation])
+AC_MSG_RESULT([${efl_enable_doc}])
+
+if test "x${efl_enable_doc}" = "xyes" ; then
+
+dnl Specify the file name, without path
+
+   efl_doxygen="doxygen"
+
+   AC_ARG_WITH([doxygen],
+      [AC_HELP_STRING(
+          [--with-doxygen=FILE],
+          [doxygen program to use @<:@default=doxygen@:>@])],
+
+dnl Check the given doxygen program.
+
+      [efl_doxygen=${withval}
+       AC_CHECK_PROG([efl_have_doxygen],
+          [${efl_doxygen}],
+          [yes],
+          [no])
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program you specified:"
+          echo "${efl_doxygen}"
+          echo "was not found.  Please check the path and make sure "
+          echo "the program exists and is executable."
+          AC_MSG_WARN([no doxygen detected. Documentation will not be built])
+       fi
+      ],
+      [AC_CHECK_PROG([efl_have_doxygen],
+          [${efl_doxygen}],
+          [yes],
+          [no])
+       if test "x${efl_have_doxygen}" = "xno" ; then
+          echo "WARNING:"
+          echo "The doxygen program was not found in your execute path."
+          echo "You may have doxygen installed somewhere not covered by your path."
+          echo ""
+          echo "If this is the case make sure you have the packages installed, AND"
+          echo "that the doxygen program is in your execute path (see your"
+          echo "shell manual page on setting the \$PATH environment variable), OR"
+          echo "alternatively, specify the program to use with --with-doxygen."
+          AC_MSG_WARN([no doxygen detected. Documentation will not be built])
+       fi
+      ])
+fi
+
+dnl
+dnl Substitution
+dnl
+AC_SUBST([efl_doxygen])
+
+if ! test "x${efl_have_doxygen}" = "xyes" ; then
+   efl_enable_doc="no"
+fi
+
+AM_CONDITIONAL(EFL_BUILD_DOC, test "x${efl_enable_doc}" = "xyes")
+
+if test "x${efl_enable_doc}" = "xyes" ; then
+  m4_default([$1], [:])
+else
+  m4_default([$2], [:])
+fi
+
+])
+
+dnl End of efl_doxygen.m4
diff --git a/m4/efl_examples.m4 b/m4/efl_examples.m4
new file mode 100644 (file)
index 0000000..2a809ad
--- /dev/null
@@ -0,0 +1,63 @@
+dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if building examples is wanted.
+
+dnl Usage: EFL_CHECK_BUILD_EXAMPLES([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Defines the automake conditionnal EFL_ENABLE_BUILD_EXAMPLES
+
+AC_DEFUN([EFL_CHECK_BUILD_EXAMPLES],
+[
+
+dnl configure option
+
+AC_ARG_ENABLE([build-examples],
+   [AC_HELP_STRING([--enable-build-examples], [enable building examples @<:@default=disabled@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_build_examples="yes"
+    else
+       _efl_enable_build_examples="no"
+    fi
+   ],
+   [_efl_enable_build_examples="no"])
+
+AC_MSG_CHECKING([whether examples are built])
+AC_MSG_RESULT([${_efl_enable_build_examples}])
+
+AM_CONDITIONAL(EFL_BUILD_EXAMPLES, test "x${_efl_enable_build_examples}" = "xyes")
+
+AS_IF([test "x$_efl_enable_build_examples" = "xyes"], [$1], [$2])
+])
+
+
+dnl Macro that check if installing examples is wanted.
+
+dnl Usage: EFL_CHECK_INSTALL_EXAMPLES([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Defines the automake conditionnal EFL_ENABLE_INSTALL_EXAMPLES
+
+AC_DEFUN([EFL_CHECK_INSTALL_EXAMPLES],
+[
+
+dnl configure option
+
+AC_ARG_ENABLE([install-examples],
+   [AC_HELP_STRING([--enable-install-examples], [enable installing example source files @<:@default=disabled@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_install_examples="yes"
+    else
+       _efl_enable_install_examples="no"
+    fi
+   ],
+   [_efl_enable_install_examples="no"])
+
+AC_MSG_CHECKING([whether examples are installed])
+AC_MSG_RESULT([${_efl_enable_install_examples}])
+
+AM_CONDITIONAL(EFL_INSTALL_EXAMPLES, test "x${_efl_enable_install_examples}" = "xyes")
+
+AS_IF([test "x$_efl_enable_install_examples" = "xyes"], [$1], [$2])
+])
+
+dnl End of efl_examples.m4
diff --git a/m4/efl_gettimeofday.m4 b/m4/efl_gettimeofday.m4
new file mode 100644 (file)
index 0000000..9b767e5
--- /dev/null
@@ -0,0 +1,48 @@
+dnl Copyright (C) 2011 Cedric Bail <cedric.bail@free.fr>
+dnl This code is public domain and can be freely used or copied.
+
+dnl Macro that check for gettimeofday definition
+
+dnl Usage: EFL_CHECK_GETTIMEOFDAY(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND])
+dnl Define EFL_HAVE_GETTIMEOFDAY
+
+AC_DEFUN([EFL_CHECK_GETTIMEOFDAY],
+[
+
+_efl_have_gettimeofday="no"
+
+AC_LINK_IFELSE(
+   [AC_LANG_PROGRAM([[
+#include <stdlib.h>
+#include <sys/time.h>
+                   ]],
+                   [[
+int res;
+res = gettimeofday(NULL, NULL);
+                   ]])],
+   [_efl_have_gettimeofday="yes"],
+   [_efl_have_gettimeofday="no"])
+
+if test "x${_efl_have_gettimeofday}" = "xno" -a "x${enable_exotic}" = "xyes"; then
+   SAVE_LIBS="${LIBS}"
+   SAVE_CFLAGS="${CFLAGS}"
+   LIBS="${LIBS} ${EXOTIC_LIBS}"
+   CFLAGS="${CFLAGS} ${EXOTIC_CFLAGS}"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[
+#include <Exotic.h>
+                      ]],
+                      [[
+int res;
+res = gettimeofday(NULL, NULL);
+                      ]])],
+      [_efl_have_gettimeofday="yes"],
+      [_efl_have_gettimeofday="no"])
+fi
+
+if test "x${_efl_have_gettimeofday}" = "xyes"; then
+   AC_DEFINE([EFL_HAVE_GETTIMEOFDAY], [1], [Defined if gettimeofday is available.])
+fi
+
+AS_IF([test "x${_efl_have_gettimeofday}" = "xyes"], [$1], [$2])
+])
diff --git a/m4/efl_path_max.m4 b/m4/efl_path_max.m4
new file mode 100644 (file)
index 0000000..f57bfd2
--- /dev/null
@@ -0,0 +1,36 @@
+dnl Check for PATH_MAX in limits.h, and define a default value if not found
+dnl This is a workaround for systems not providing PATH_MAX, like GNU/Hurd
+
+dnl EFL_CHECK_PATH_MAX([DEFAULT_VALUE_IF_NOT_FOUND])
+dnl
+dnl If PATH_MAX is not defined in <limits.h>, defines it
+dnl to DEFAULT_VALUE_IF_NOT_FOUND if it exists, or fallback
+dnl to using 4096
+
+AC_DEFUN([EFL_CHECK_PATH_MAX],
+[
+
+default_max=m4_default([$1], "4096")
+AC_LANG_PUSH([C])
+
+AC_MSG_CHECKING([for PATH_MAX in limits.h])
+AC_COMPILE_IFELSE(
+   [AC_LANG_PROGRAM(
+       [[
+#include <limits.h>
+       ]],
+       [[
+int i = PATH_MAX;
+       ]])],
+   [AC_MSG_RESULT([yes])],
+   [
+    AC_DEFINE_UNQUOTED([PATH_MAX],
+       [${default_max}],
+       [default value since PATH_MAX is not defined])
+    AC_MSG_RESULT([no: using ${default_max}])
+   ])
+
+AC_LANG_POP([C])
+
+])
+dnl end of efl_path_max.m4
diff --git a/m4/efl_shm_open.m4 b/m4/efl_shm_open.m4
new file mode 100644 (file)
index 0000000..0bf1b0b
--- /dev/null
@@ -0,0 +1,69 @@
+dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if shm_open function is available or not.
+
+dnl Usage: EFL_CHECK_SHM_OPEN([, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Call AC_SUBST(EFL_SHM_OPEN_LIBS)
+dnl Define HAVE_SHM_OPEN to 1if shm_open is available
+
+AC_DEFUN([EFL_CHECK_SHM_OPEN],
+[
+_efl_have_shm_open="no"
+
+dnl Check is shm_open is in libc
+
+AC_MSG_CHECKING([for shm_open in libc])
+AC_LINK_IFELSE(
+   [AC_LANG_PROGRAM(
+       [[
+#include <sys/mman.h>
+#include <sys/stat.h>        /* For mode constants */
+#include <fcntl.h>           /* For O_* constants */
+       ]],
+       [[
+int fd;
+
+fd = shm_open("/dev/null", O_RDONLY, S_IRWXU | S_IRWXG | S_IRWXO);
+       ]])],
+   [_efl_have_shm_open="yes"],
+   [_efl_have_shm_open="no"])
+
+AC_MSG_RESULT([${_efl_have_shm_open}])
+
+if test "x$_efl_have_shm_open" = "xno" ; then
+   AC_MSG_CHECKING([for shm_open in librt])
+
+   LIBS_save="${LIBS}"
+   LIBS="${LIBS} -lrt"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+          [[
+#include <sys/mman.h>
+#include <sys/stat.h>        /* For mode constants */
+#include <fcntl.h>           /* For O_* constants */
+          ]],
+          [[
+int fd;
+
+fd = shm_open("/dev/null", O_RDONLY, S_IRWXU | S_IRWXG | S_IRWXO);
+          ]])],
+      [
+       EFL_SHM_OPEN_LIBS="-lrt"
+       _efl_have_shm_open="yes"],
+      [_efl_have_shm_open="no"])
+
+   LIBS="${LIBS_save}"
+
+   AC_MSG_RESULT([${_efl_have_shm_open}])
+fi
+
+AC_SUBST([EFL_SHM_OPEN_LIBS])
+
+if test "x$_efl_have_shm_open" = "xyes" ; then
+   AC_DEFINE([HAVE_SHM_OPEN], [1], [Define to 1 if you have the `shm_open' function.])
+fi
+
+AS_IF([test "x$_efl_have_shm_open" = "xyes"], [$1], [$2])
+
+])
diff --git a/m4/efl_tests.m4 b/m4/efl_tests.m4
new file mode 100644 (file)
index 0000000..3a4dfe2
--- /dev/null
@@ -0,0 +1,43 @@
+dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
+dnl That code is public domain and can be freely used or copied.
+
+dnl Macro that check if tests programs are wanted and if yes, if
+dnl the Check library is available.
+
+dnl Usage: EFL_CHECK_TESTS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Define the automake conditionnal EFL_ENABLE_TESTS
+
+AC_DEFUN([EFL_CHECK_TESTS],
+[
+
+dnl configure option
+
+AC_ARG_ENABLE([tests],
+   [AC_HELP_STRING([--enable-tests], [enable tests @<:@default=disabled@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_tests="yes"
+    else
+       _efl_enable_tests="no"
+    fi
+   ],
+   [_efl_enable_tests="no"])
+
+AC_MSG_CHECKING([whether tests are built])
+AC_MSG_RESULT([${_efl_enable_tests}])
+
+AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+
+if test "x${_efl_enable_tests}" = "xyes" ; then
+   PKG_CHECK_MODULES([CHECK],
+      [check >= 0.9.5],
+      [dummy="yes"],
+      [_efl_enable_tests="no"])
+fi
+
+AM_CONDITIONAL(EFL_ENABLE_TESTS, test "x${_efl_enable_tests}" = "xyes")
+
+AS_IF([test "x$_efl_enable_tests" = "xyes"], [$1], [$2])
+])
+
+dnl End of efl_tests.m4
diff --git a/m4/efl_threads.m4 b/m4/efl_threads.m4
new file mode 100644 (file)
index 0000000..33d15a3
--- /dev/null
@@ -0,0 +1,206 @@
+dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr>
+dnl rwlock code added by Mike Blumenkrantz <mike at zentific dot com>
+dnl This code is public domain and can be freely used or copied.
+
+dnl Macro that check if POSIX or Win32 threads library is available or not.
+
+dnl Usage: EFL_CHECK_THREADS(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND])
+dnl Call AC_SUBST(EFL_PTHREAD_CFLAGS)
+dnl Call AC_SUBST(EFL_PTHREAD_LIBS)
+dnl Defines EFL_HAVE_POSIX_THREADS or EFL_HAVE_WIN32_THREADS, and EFL_HAVE_THREADS
+
+AC_DEFUN([EFL_CHECK_THREADS],
+[
+
+dnl configure option
+
+AC_ARG_ENABLE([posix-threads],
+   [AC_HELP_STRING([--disable-posix-threads], [enable POSIX threads code @<:@default=auto@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_posix_threads="yes"
+    else
+       _efl_enable_posix_threads="no"
+    fi
+   ],
+   [_efl_enable_posix_threads="auto"])
+
+AC_MSG_CHECKING([whether to build POSIX threads code])
+AC_MSG_RESULT([${_efl_enable_posix_threads}])
+
+AC_ARG_ENABLE([win32-threads],
+   [AC_HELP_STRING([--disable-win32-threads], [enable Win32 threads code @<:@default=no@:>@])],
+   [
+    if test "x${enableval}" = "xyes" ; then
+       _efl_enable_win32_threads="yes"
+    else
+       _efl_enable_win32_threads="no"
+    fi
+   ],
+   [_efl_enable_win32_threads="no"])
+
+AC_MSG_CHECKING([whether to build Windows threads code])
+AC_MSG_RESULT([${_efl_enable_win32_threads}])
+
+dnl
+dnl * no  + no
+dnl * yes + no  : win32: error,    other : pthread
+dnl * yes + yes : win32 : wthread, other : pthread
+dnl * no  + yes : win32 : wthread, other : error
+
+if  test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_enable_win32_threads}" = "xyes" ; then
+   case "$host_os" in
+      mingw*)
+         _efl_enable_posix_threads=no
+         ;;
+      *)
+         _efl_enable_win32_threads=no
+         ;;
+   esac
+fi
+
+if  test "x${_efl_enable_win32_threads}" = "xyes" ; then
+   case "$host_os" in
+      mingw*)
+         ;;
+      *)
+         AC_MSG_ERROR([Win32 threads support requested but non Windows system found.])
+         ;;
+   esac
+fi
+
+if  test "x${_efl_enable_posix_threads}" = "xyes" ; then
+   case "$host_os" in
+      mingw*)
+         AC_MSG_ERROR([POSIX threads support requested but Windows system found.])
+         ;;
+      *)
+         ;;
+   esac
+fi
+
+dnl check if the compiler supports POSIX threads
+
+case "$host_os" in
+   mingw*)
+      ;;
+   solaris*)
+      _efl_threads_cflags="-mt"
+      _efl_threads_libs="-mt"
+      ;;
+   *)
+      _efl_threads_cflags="-pthread"
+      _efl_threads_libs="-pthread"
+      ;;
+esac
+
+_efl_have_posix_threads="no"
+_efl_have_win32_threads="no"
+
+if test "x${_efl_enable_posix_threads}" = "xyes" || test "x${_efl_enable_posix_threads}" = "xauto" ; then
+
+   SAVE_CFLAGS=${CFLAGS}
+   CFLAGS="${CFLAGS} ${_efl_threads_cflags}"
+   SAVE_LIBS=${LIBS}
+   LIBS="${LIBS} ${_efl_threads_libs}"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[
+#include <pthread.h>
+                       ]],
+                       [[
+pthread_t id;
+id = pthread_self();
+                       ]])],
+      [_efl_have_posix_threads="yes"],
+      [_efl_have_posix_threads="no"])
+   CFLAGS=${SAVE_CFLAGS}
+   LIBS=${SAVE_LIBS}
+
+fi
+
+AC_MSG_CHECKING([whether system support POSIX threads])
+AC_MSG_RESULT([${_efl_have_posix_threads}])
+if test "$x{_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads}" = "xno"; then
+   AC_MSG_ERROR([POSIX threads support requested but not found.])
+fi
+
+EFL_PTHREAD_CFLAGS=""
+EFL_PTHREAD_LIBS=""
+if test "x${_efl_have_posix_threads}" = "xyes" ; then
+   EFL_PTHREAD_CFLAGS=${_efl_threads_cflags}
+   EFL_PTHREAD_LIBS=${_efl_threads_libs}
+fi
+
+AC_SUBST(EFL_PTHREAD_CFLAGS)
+AC_SUBST(EFL_PTHREAD_LIBS)
+
+_efl_enable_debug_threads="no"
+AC_ARG_ENABLE([debug-threads],
+   [AC_HELP_STRING([--enable-debug-threads], [disable assert when you forgot to call eina_threads_init])],
+   [_efl_enable_debug_threads="${enableval}"])
+
+have_debug_threads="no"
+if test "x${_efl_have_posix_threads}" = "xyes" -a "x${_efl_enable_debug_threads}" = "xyes"; then
+   have_debug_threads="yes"
+   AC_DEFINE([EFL_DEBUG_THREADS], [1], [Assert when forgot to call eina_threads_init])
+fi
+
+if test "x${_efl_have_posix_threads}" = "xyes" ; then
+   AC_DEFINE([EFL_HAVE_POSIX_THREADS], [1], [Define to mention that POSIX threads are supported])
+fi
+
+if test "x${_efl_enable_win32_threads}" = "xyes" ; then
+   _efl_have_win32_threads="yes"
+   AC_DEFINE([EFL_HAVE_WIN32_THREADS], [1], [Define to mention that Win32 threads are supported])
+fi
+
+if test "x${_efl_have_posix_threads}" = "xyes" || test "x${_efl_have_win32_threads}" = "xyes" ; then
+   AC_DEFINE([EFL_HAVE_THREADS], [1], [Define to mention that POSIX or Win32 threads are supported])
+fi
+
+AS_IF([test "x$_efl_have_posix_threads" = "xyes" || test "x$_efl_have_win32_threads" = "xyes"], [$1], [$2])
+])
+
+dnl Usage: EFL_CHECK_SPINLOCK(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND])
+dnl Defines EFL_HAVE_POSIX_THREADS_SPINLOCK
+AC_DEFUN([EFL_CHECK_SPINLOCK],
+[
+
+dnl check if the compiler supports pthreads spinlock
+
+_efl_have_posix_threads_spinlock="no"
+
+if test "x${_efl_have_posix_threads}" = "xyes" ; then
+
+   SAVE_CFLAGS=${CFLAGS}
+   CFLAGS="${CFLAGS} ${EFL_PTHREAD_CFLAGS}"
+   SAVE_LIBS=${LIBS}
+   LIBS="${LIBS} ${EFL_PTHREAD_LIBS}"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[
+#include <pthread.h>
+                       ]],
+                       [[
+pthread_spinlock_t lock;
+int res;
+res = pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
+                       ]])],
+      [_efl_have_posix_threads_spinlock="yes"],
+      [_efl_have_posix_threads_spinlock="no"])
+   CFLAGS=${SAVE_CFLAGS}
+   LIBS=${SAVE_LIBS}
+
+fi
+
+AC_MSG_CHECKING([whether to build POSIX threads spinlock code])
+AC_MSG_RESULT([${_efl_have_posix_threads_spinlock}])
+if test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads_spinlock}" = "xno" ; then
+   AC_MSG_WARN([POSIX threads support requested but spinlocks are not supported])
+fi
+
+if test "x${_efl_have_posix_threads_spinlock}" = "xyes" ; then
+   AC_DEFINE([EFL_HAVE_POSIX_THREADS_SPINLOCK], [1], [Define to mention that POSIX threads spinlocks are supported])
+fi
+AS_IF([test "x$_efl_have_posix_threads_spinlock" = "xyes"], [$1], [$2])
+])
+
diff --git a/packaging/ecore.changes b/packaging/ecore.changes
new file mode 100644 (file)
index 0000000..a716b5b
--- /dev/null
@@ -0,0 +1,3 @@
+* Fri Jan 18 2013 Anas Nashif <anas.nashif@intel.com> accepted/trunk/20130117.015224@eb8e0c9
+- devel requires sub-packages and other spec fixes
+
diff --git a/packaging/ecore.spec b/packaging/ecore.spec
new file mode 100644 (file)
index 0000000..f53f848
--- /dev/null
@@ -0,0 +1,311 @@
+Name:       ecore
+Summary:    Enlightened Core X interface library
+Version:    1.7.1+svn.77580+build01r01
+Release:    1
+Group:      System/Libraries
+License:    BSD
+URL:        http://www.enlightenment.org
+Source0:    %{name}-%{version}.tar.gz
+BuildRequires:  gettext-tools
+BuildRequires:  pkgconfig(eina)
+BuildRequires:  pkgconfig(eet)
+BuildRequires:  pkgconfig(evas)
+BuildRequires:  pkgconfig(glib-2.0)
+BuildRequires:  pkgconfig(xcursor)
+BuildRequires:  pkgconfig(xrender)
+BuildRequires:  pkgconfig(xinerama)
+BuildRequires:  pkgconfig(xrandr)
+BuildRequires:  pkgconfig(xext)
+BuildRequires:  pkgconfig(xi)
+BuildRequires:  pkgconfig(xfixes)
+BuildRequires:  pkgconfig(xcomposite)
+BuildRequires:  pkgconfig(xdamage)
+BuildRequires:  pkgconfig(xextproto)
+BuildRequires:  pkgconfig(xtst)
+BuildRequires:  curl-devel
+BuildRequires:  libjpeg-devel
+BuildRequires:  pkgconfig(xgesture)
+
+
+%description
+Core abstraction layer for enlightenment DR 0.17 This is the core event abstraction layer and X abstraction layer that makes
+ doing selections, Xdnd, general X stuff, and event loops, timeouts and idle
+ handlers fast, optimized, and convenient. It's a separate library so anyone
+ can make use of the work put into Ecore to make this job easy for
+ applications.
+
+
+
+%package devel
+Summary:    Enlightened Core X interface library (devel)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+Requires:   ecore-file
+Requires:   ecore-evas
+Requires:   ecore-fb
+Requires:   ecore-imf
+Requires:   ecore-imf-evas
+Requires:   ecore-input
+Requires:   ecore-input-evas
+Requires:   ecore-ipc
+Requires:   ecore-x
+Requires:   ecore-con
+
+%description devel
+Core abstraction layer for enlightenment (devel)
+
+%package tools
+Summary:    Enlightened Core X interface library (bin)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+Provides:   %{name}-bin
+Obsoletes:  %{name}-bin
+
+%description tools
+Core abstraction layer for enlightenment (tools)
+
+%package con
+Summary:    Enlightened Core X interface library (con)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description con
+Core abstraction layer for enlightenment (con)
+
+%package evas
+Summary:    Enlightened Core X interface library (evas)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description evas
+Core abstraction layer for enlightenment (evas)
+
+%package file
+Summary:    Enlightened Core X interface library (file)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description file
+Core abstraction layer for enlightenment (file)
+
+%package imf
+Summary:    Enlightened Core X interface library (imf)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description imf
+Core abstraction layer for enlightenment (imf)
+
+%package imf-evas
+Summary:    Enlightened Core X interface library (imf-evas)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description imf-evas
+Core abstraction layer for enlightenment (imf-evas)
+
+%package input
+Summary:    Enlightened Core X interface library (input)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description input
+Core abstraction layer for enlightenment (input)
+
+%package input-evas
+Summary:    Enlightened Core X interface library (input-evas)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description input-evas
+Core abstraction layer for enlightenment (input-evas)
+
+%package ipc
+Summary:    Enlightened Core X interface library (ipc)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description ipc
+Core abstraction layer for enlightenment (ipc)
+
+%package x
+Summary:    Enlightened Core X interface library (x)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description x
+Core abstraction layer for enlightenment (x)
+
+%package fb
+Summary:    Enlightened Core X interface library (fb)
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description fb
+Core abstraction layer for enlightenment (fb)
+
+
+%prep
+%setup -q
+
+
+%build
+export CFLAGS+=" -fvisibility=hidden -fPIC"
+export LDFLAGS+=" -fvisibility=hidden -Wl,--hash-style=both -Wl,--as-needed"
+
+%autogen
+%configure --disable-static \
+       --enable-ecore-fb \
+       --enable-dependency-tracking \
+       --disable-ecore-directfb \
+       --enable-ecore-evas-fb \
+       --disable-rpath \
+       --disable-openssl \
+       --disable-gnutls \
+       --disable-tslib \
+       --enable-simple-x11 \
+       --enable-ecore-evas-opengl-x11 \
+       --disable-ecore-evas-xrender-x11 \
+       --enable-curl \
+       --enable-glib-integration-always \
+       --enable-ecore-x-gesture \
+       --disable-xim \
+       --disable-ecore-imf-xim \
+       --disable-ecore-imf-scim
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+%make_install
+mkdir -p %{buildroot}/usr/share/license
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name}
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%post con -p /sbin/ldconfig
+
+%postun con -p /sbin/ldconfig
+
+%post evas -p /sbin/ldconfig
+
+%postun evas -p /sbin/ldconfig
+
+
+%post file -p /sbin/ldconfig
+
+%postun file -p /sbin/ldconfig
+
+
+%post imf -p /sbin/ldconfig
+
+%postun imf -p /sbin/ldconfig
+
+
+%post imf-evas -p /sbin/ldconfig
+
+%postun imf-evas -p /sbin/ldconfig
+
+
+%post input -p /sbin/ldconfig
+
+%postun input -p /sbin/ldconfig
+
+
+%post input-evas -p /sbin/ldconfig
+
+%postun input-evas -p /sbin/ldconfig
+
+
+%post ipc -p /sbin/ldconfig
+
+%postun ipc -p /sbin/ldconfig
+
+
+%post x -p /sbin/ldconfig
+
+%postun x -p /sbin/ldconfig
+
+
+%post fb -p /sbin/ldconfig
+
+%postun fb -p /sbin/ldconfig
+
+%files 
+%defattr(-,root,root,-)
+%{_libdir}/libecore.so.*
+/usr/share/locale/*
+/usr/share/license/%{name}
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/ecore-1/*.h
+%{_libdir}/pkgconfig/ecore*.pc
+%{_libdir}/libecore.so
+%{_libdir}/libecore_con.so
+%{_libdir}/libecore_evas.so
+%{_libdir}/libecore_file.so
+%{_libdir}/libecore_imf.so
+%{_libdir}/libecore_imf_evas.so
+%{_libdir}/libecore_input.so
+%{_libdir}/libecore_input_evas.so
+%{_libdir}/libecore_ipc.so
+%{_libdir}/libecore_x.so
+%{_libdir}/libecore_fb.so
+
+%files tools
+%defattr(-,root,root,-)
+#/usr/bin/ecore_test
+
+%files con
+%defattr(-,root,root,-)
+%{_libdir}/libecore_con.so.*
+%manifest %{name}-con.manifest
+
+%files evas
+%defattr(-,root,root,-)
+%{_libdir}/libecore_evas.so.*
+%manifest %{name}-evas.manifest
+
+%files file
+%defattr(-,root,root,-)
+%{_libdir}/libecore_file.so.*
+%manifest %{name}-file.manifest
+
+%files imf
+%defattr(-,root,root,-)
+%{_libdir}/libecore_imf.so.*
+%manifest %{name}-imf.manifest
+
+%files imf-evas
+%defattr(-,root,root,-)
+%{_libdir}/libecore_imf_evas.so.*
+%manifest %{name}-imf-evas.manifest
+
+%files input
+%defattr(-,root,root,-)
+%{_libdir}/libecore_input.so.*
+%manifest %{name}-input.manifest
+
+%files input-evas
+%defattr(-,root,root,-)
+%{_libdir}/libecore_input_evas.so.*
+%manifest %{name}-input-evas.manifest
+
+%files ipc
+%defattr(-,root,root,-)
+%{_libdir}/libecore_ipc.so.*
+%manifest %{name}-ipc.manifest
+
+%files x
+%defattr(-,root,root,-)
+%{_libdir}/libecore_x.so.*
+%manifest %{name}-x.manifest
+
+%files fb
+%defattr(-,root,root,-)
+%{_libdir}/libecore_fb.so.*
+%manifest %{name}-fb.manifest
+
diff --git a/po/ChangeLog b/po/ChangeLog
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644 (file)
index 0000000..c58c323
--- /dev/null
@@ -0,0 +1,2 @@
+cs de el fr it ko nl pt sl
+
diff --git a/po/Makevars b/po/Makevars
new file mode 100644 (file)
index 0000000..22837ab
--- /dev/null
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --from-code=UTF-8 --foreign-user
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Enlightenment development team
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = enlightenment-devel@lists.sourceforge.net
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644 (file)
index 0000000..5014aa2
--- /dev/null
@@ -0,0 +1 @@
+src/lib/ecore/ecore_getopt.c
diff --git a/po/cs.po b/po/cs.po
new file mode 100644 (file)
index 0000000..2d3ec63
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,174 @@
+# ecore czech translation
+# quaker66@gmail.com
+# Vít Pelčák <vit@pelcak.org>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: ecore\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2011-10-23 01:28+0100\n"
+"Last-Translator: Daniel Kolesa <quaker66@gmail.com>\n"
+"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Verze:"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Použití:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s [volby]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Licence:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Typ: "
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Výchozí: "
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Možnosti: "
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Volby:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "CHYBA: neznámá volba --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "CHYBA: neznámá volba -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "CHYBA: "
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "hodnota nemá nastaven pointer.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "neznámá boolean hodnota %s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "neznámý číselný formát %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "neznámá volba \"%s\". Možné hodnoty jsou: "
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "chybějící parametr k připojení.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "nemůžu parsovat hodnotu.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "chybějící parametr.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "chybějící callback funkce!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "nebyla definována verze.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "nebyl definován copyright.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "nebyla definována licence.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "CHYBA: neznámá volba --%s, ignoruji.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "CHYBA: volba --%s vyžaduje argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "CHYBA: neznámá volba -%c, ignoruji.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "CHYBA: volba -%c vyžaduje argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "CHYBA: nebyl poskytnut parser.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "CHYBA: nebyly poskytnuty hodnoty.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "CHYBA: nebyly poskytnuty argumenty.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "CHYBA: nalezeny neplatné volby."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr " Viz --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr " Viz -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "CHYBA: neplatná hodnota geometrie '%s'\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "CHYBA: neplatná hodnota velikosti '%s'\n"
diff --git a/po/de.po b/po/de.po
new file mode 100644 (file)
index 0000000..b00169e
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,175 @@
+# Translation of ecore to German
+# Copyright (C) 2000 Carsten Haitzler and others.
+# This file is distributed under the same license as the ecore package.
+# Chris Leick <c.leick@vollbio.de>, 2009.
+# Fabian Nowak <timystery@arcor.de>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ecore 0.9.9.063-2\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2010-01-03 21:52+GMT\n"
+"Last-Translator: Fabian Nowak <timystery@arcor.de>\n"
+"Language-Team: German <debian-l10n-german@lists.debian.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Version:"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Aufruf:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s [Optionen]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Lizenz:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Typ: "
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Standard: "
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Auswahlmöglichkeiten: "
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "FEHLER: Unbekannte Option --%s\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "FEHLER: Unbekannte Option -%c\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "FEHLER: "
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "kein Zeiger auf Wert gesetzt\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "unbekannter boolescher Wert %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "ungültiges Zahlenformat %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "ungültige Auswahl \"%s\". Gültige Werte sind: "
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "fehlender Parameter zum Anhängen.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "Wert kann nicht ausgewertet werden.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "fehlender Parameter.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "fehlende Rückruffunktion!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "es wurde keine Version angegeben.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "es wurde kein Copyright angegeben.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "es wurde keine Lizenz angegeben.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "FEHLER: Unbekannte Option --%s, ignoriert\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "FEHLER: Option --%s benötigt ein Argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "FEHLER: Unbekannte Option -%c, ignoriert\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "FEHLER: Option -%c benötigt ein Argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "FEHLER: Kein Parser bereitgestellt.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "FEHLER: Keine Werte bereitgestellt.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "FEHLER: Keine Argumente bereitgestellt.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "FEHLER: Ungültige Optionen gefunden."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr " Siehe --%s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr " Siehe -%c\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "FEHLER: Falscher Geometriewert \"%s\"\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "FEHLER: Falscher Größenwert \"%s\"\n"
diff --git a/po/el.po b/po/el.po
new file mode 100644 (file)
index 0000000..f0dc8fb
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,205 @@
+# Greek translation for Ecore.
+# This file is put in the public domain.
+# ragecryx <ragecryx@yahoo.gr>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Ecore\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2011-11-20 22:42+0200\n"
+"Last-Translator: George Rizopoulos <george.rizopoulos.1@gmail.com>\n"
+"Language-Team: Greek\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Έκδοση:"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Χρήση:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s [επιλογές]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Πνευματικά δικαιώματα:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Άδεια:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Τύπος:"
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Προκαθορισμένο:"
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Επιλογές:"
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "ΣΦΑΛΜΑ: άγνωστη επιλογή --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "ΣΦΑΛΜΑ: άγνωστη επιλογή -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "ΣΦΑΛΜΑ:"
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "η τιμή δεν έχει δείκτη ορισμένο.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "άγνωστη τιμή boolean %s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "άγνωστη μορφή αριθμού %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "μη έγκυρη επιλογή \"%s\". Οι έγκυρες τιμές είναι: "
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "ελλιπής παράμετρος προς επισύναψη.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "αδυναμία ανάλυσης τιμών.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "ελλιπής παράμετρος.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "λείπει η λειτουργία επανάκλησης!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "δεν έχει οριστεί έκδοση.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "δεν έχουν οριστεί πνευματικά δικαιώματα.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "δεν έχει οριστεί άδεια.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "ΣΦΑΛΜΑ:άγνωστη επιλογή --%s, αγνοήθηκε.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "ΣΦΑΛΜΑ: η επιλογή --%s απαιτεί παραμέτρους!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "ΣΦΑΛΜΑ: άγνωστη επιλογή -%c, αγνοήθηκε.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "ΣΦAΛΜΑ: η επιλογή -%c απαιτεί μία παράμετρο!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+#, fuzzy
+msgid "ERROR: no parser provided.\n"
+msgstr "ΣΦΑΛΜΑ:δεν παρέχεται αναλυτής.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "ΣΦΑΛΜΑ:δεν έχουν δοθεί τιμές.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "ΣΦΑΛΜΑ:δεν έχουν δοθεί παράμετροι.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "ΣΦΑΛΜΑ: βρέθηκαν μη έγκυρες επιλογές."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr " Δείτε --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr " Δείτε -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "ΣΦΑΛΜΑ: μη έγκυρη γεωμετρική τιμή '%s'\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "ΣΦΑΛΜΑ: μη έγκυρη τιμή μεγέθους '%s'\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "   "
+#~ msgstr ""
+#~ "\n"
+#~ "   "
+
+#~ msgid "true"
+#~ msgstr "true"
+
+#~ msgid "false"
+#~ msgstr "false"
+
+#~ msgid "f"
+#~ msgstr "f"
+
+#~ msgid "no"
+#~ msgstr "no"
+
+#~ msgid "off"
+#~ msgstr "off"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "yes"
+#~ msgstr "yes"
+
+#~ msgid "on"
+#~ msgstr "on"
diff --git a/po/fr.po b/po/fr.po
new file mode 100644 (file)
index 0000000..8d7f719
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,208 @@
+# French translation for Ecore.
+# This file is put in the public domain.
+# batden <batden@orange.fr>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Ecore\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2010-07-11 11:01+0400\n"
+"Last-Translator: batden <batden@orange.fr>\n"
+"Language-Team: Enlightenment French Team <pourunmondesansgourou@gmail.com>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n>1;\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: FRANCE\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Version :"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Usage :"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s [options]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Copyright :"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Licence :"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Type : "
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Par défaut :"
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Choix :"
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "ERREUR : option inconnue --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "ERREUR : option inconnue -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "ERREUR :"
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "la valeur n'a aucun pointeur défini.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "valeur booléenne inconnue %s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "format du nombre non valide %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "choix non valide « %s ». Les valeurs valides sont : "
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "paramètre manquant à ajouter.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "analyse de la valeur impossible.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "paramètre manquant.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "fonction de rappel manquante !\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "aucune version n'est définie.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "aucun copyright n'est défini.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "aucune licence n'est définie.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "ERREUR : option inconnue --%s, non prise en compte.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "ERREUR : l'option --%s requiert un argument !\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "ERREUR : option inconnue -%c, non prise en compte.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "ERREUR : l'option -%c requiert un argument !\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "ERREUR : aucun analyseur n'est fourni.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "ERREUR : aucune valeur n'est fournie.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "ERREUR : aucun argument n'est fourni.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "ERREUR : options non valides détectées."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr " Voir --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr " Voir -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "ERREUR : valeur géométrique incorrecte « %s »\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "ERREUR : valeur de taille incorrecte « %s »\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "   "
+#~ msgstr ""
+#~ "\n"
+#~ "   "
+
+#~ msgid "true"
+#~ msgstr "true"
+
+#~ msgid "false"
+#~ msgstr "false"
+
+#~ msgid "f"
+#~ msgstr "f"
+
+#~ msgid "no"
+#~ msgstr "no"
+
+#~ msgid "off"
+#~ msgstr "off"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "yes"
+#~ msgstr "yes"
+
+#~ msgid "on"
+#~ msgstr "on"
diff --git a/po/it.po b/po/it.po
new file mode 100644 (file)
index 0000000..ae044da
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,204 @@
+# Italian translation for Ecore.
+# This file is put in the public domain.
+# Massimo Maiurana <maiurana@gmail.com>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Ecore\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2009-10-27 19:36+0100\n"
+"Last-Translator: quaker66 <quaker66@gmail.com>\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Versione:"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Uso:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s [opzioni]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Licenza:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Tipo: "
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Predefinito:"
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Scelte:"
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "ERRORE: opzione sconosciuta --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "ERRORE: opzione sconosciuta -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "ERRORE:"
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "il valore non ha puntatori impostati.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "valore booleano sconosciuto %s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "formato numero non valido %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "scelta non valida \"%s\". I valori ammessi sono: "
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "parametro da appendere mancante.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "impossibile il parsing del valore.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "parametro mancante.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "funzione callback mancante!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "nessuna versione definita.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "nessun copyright definito.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "nessuna licenza definita.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "ERRORE: opzione sconosciuta --%s, ignorata.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "ERRORE: l'opzione --%s richiede un argomento!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "ERRORE: opzione sconosciuta -%c, ignorata.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "ERRORE: l'opzione -%c richiede un argomento!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "ERRORE: nessun parser fornito.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "ERRORE: nessun valore fornito.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "ERRORE: nessun argomento fornito.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "ERRORE: trovate opzioni non valide."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr " Vedere --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr " Vedere -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "ERRORE: valore geometrico non corretto '%s'\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "ERRORE: valore dimensione non corretto '%s'\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "   "
+#~ msgstr ""
+#~ "\n"
+#~ "   "
+
+#~ msgid "true"
+#~ msgstr "vero"
+
+#~ msgid "false"
+#~ msgstr "falso"
+
+#~ msgid "f"
+#~ msgstr "f"
+
+#~ msgid "no"
+#~ msgstr "no"
+
+#~ msgid "off"
+#~ msgstr "off"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "yes"
+#~ msgstr "sì"
+
+#~ msgid "on"
+#~ msgstr "on"
diff --git a/po/ko.po b/po/ko.po
new file mode 100644 (file)
index 0000000..abc5e37
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,185 @@
+# Korean translation for the Enlightenment ecore.
+# Copyright (C) 2000-2012 Enlightenment development team
+# This file is distributed under the same license as the Enlightenment package.
+# Seong-ho Cho <darkcircle.0426@gmail.com>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Enlightenment Ecore 1.7.0\n"
+"Report-Msgid-Bugs-To: Enlightenment-Devel <enlightenment-devel@lists.sourceforge.net>\n"
+"POT-Creation-Date: 2012-08-30 22:29+0900\n"
+"PO-Revision-Date: 2012-08-30 22:50+0900\n"
+"Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
+"Language-Team: Enlightenment-Intl <enlightenment-intl@lists.sourceforge.net>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-Language: Korean\n"
+"X-Poedit-Country: KOREA, REPUBLIC OF\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "버전:"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "사용법:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s <옵션>\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "저작권 정보:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "라이선스:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "형식: "
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "기본값: "
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "선택: "
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "옵션:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "오류: 알 수 없는 옵션 --%s 입니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "오류: 알 수 없는 옵션 -%c 입니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "오류: "
+
+#: src/lib/ecore/ecore_getopt.c:931
+#: src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084
+#: src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116
+#: src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283
+#: src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "값에 포인터 집합이 없습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963
+#: src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "알 수 없는 부울린 값 %s 입니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014
+#: src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "잘못된 숫자 형식 %s 입니다\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "잘못된 선택 \"%s\" 입니다. 유효한 값은 다음과 같습니다: "
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "붙일 매개변수가 빠졌습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "값을 해석할 수 없습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "매개변수가 빠졌습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "콜백 함수가 빠졌습니다!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "정의한 버전이 없습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "정의한 저작권 정보가 없습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "정의한 라이선스가 없습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "오류: 알 수 없는 --%s 옵션을 무시합니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "오류: --%s 옵션에 인자가 필요합니다!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "오류: 알 수 없는 -%c 옵션을 무시합니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "오류: -%c 옵션에 인자가 필요합니다!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "오류: 해석 프로그램이 존재하지 않습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "오류: 값이 존재하지 않습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "인자가 존재하지 않습니다.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "오류: 잘못된 옵션이 있습니다."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr " --%s을(를) 참조하십시오.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr " -%c을(를) 참조하십시오.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "오류: '%s' 값의 좌표가 올바르지 않습니다\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "오류: '%s' 값의 크기가 올바르지 않습니다\n"
+
diff --git a/po/nl.po b/po/nl.po
new file mode 100644 (file)
index 0000000..4dc3b6e
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,175 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Ecore\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2011-09-03 15:48+0100\n"
+"Last-Translator: Heimen Stoffels <vistausss@gmail.com>\n"
+"Language-Team:  <vistausss@gmail.com>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: NL\n"
+"X-Poedit-Country: Nederland\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Versie:"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Gebruik:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s [opties]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Licentie:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Type:"
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Standaard:"
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Keuzes:"
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Opties:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "FOUT: onbekende optie --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "FOUT: onbekende optie -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "FOUT:"
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "waarde heeft geen pointer ingsteld.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "onbekende boolean-waarde %s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "ongeldig nummerformaat %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "ongeldige keuze \"%s\". Geldige waardes zijn:"
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "parameter om toe te wijzen ontbreekt.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "kon waarde niet doorvoeren.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "paramater ontbreekt.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "ontbrekende terugroep-functie!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "geen versie was gedefinieerd.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "geen copyright was gedefinieerd.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "geen licentie was gedefinieerd.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "FOUT: onbekende optie --%s, genegeerd.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "FOUT: optie --%s vereist een argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "FOUT: onbekende opties -%c, genegeerd.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "FOUT: optie -%c vereist een argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "FOUT: geen doorvoerder beschikbaar gesteld.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "FOUT: geen waarden beschikbaar gesteld.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "FOUT: geen argumenten beschibaar gesteld.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "FOUT: ongeldige opties gevonden."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr "Zie --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr "Zie -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "Fout: foutieve wiskundige waarde '%s'\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "FOUT: foutieve grootte-waarden '%s'\n"
diff --git a/po/pt.po b/po/pt.po
new file mode 100644 (file)
index 0000000..01475f8
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,176 @@
+# Portuguese translation for ecore
+# This file is distributed under the same license as the enlightenment package.
+# Sérgio Marques <smarquespt@gmail.com>, 2010
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ecore\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2012-08-23 00:30+0100\n"
+"Last-Translator: Sérgio Marques <smarquespt@gmail.com>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Poedit-Language: Portuguese\n"
+"X-Poedit-Country: Portugal\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Versão:"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Utilização:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s [opções]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Direitos de autor:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Licença:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Tipo:"
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Padrão:"
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Escolhas:"
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Opções:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "ERRO: opção desconhecida --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "ERRO: opção desconhecida -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "ERRO: "
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "o valor não está definido.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "valor booleano desconhecido %s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "formato numérico inválido %s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "escolha inválida \"%s\". O valores possíveis são:"
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "faltam os parâmetros a anexar.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "incapaz de processar o valor.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "parâmetro em falta.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "função de invocação em falta!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "nenhuma versão definida.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "direitos de autor não definidos.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "licença não definida.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "ERRO: opção desconhecida --%s, ignorada.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "ERRO: a opção --%s requer um argumento!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "ERRO: opção desconhecida --%c, ignorada.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "ERRO: a opção --%c requer um argumento!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "ERRO: nenhum processador fornecido.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "ERRO: nenhum valor fornecido.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "ERRO: nenhum argumento fornecido.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "ERRO: encontradas opções inválidas."
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr "Consulte --%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr "Consulte -%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "ERRO: valor geométrico incorreto \"%s\"\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "ERRO: tamanho incorreto \"%s\"\n"
diff --git a/po/sl.po b/po/sl.po
new file mode 100644 (file)
index 0000000..e5224d5
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,175 @@
+# Slovenian translation of ecore.
+# This file is put in the public domain.
+# r1to <renato.rener@gmail.com>, 2011.
+# , fuzzy
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ecore 1.0\n"
+"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n"
+"POT-Creation-Date: 2012-08-27 19:14+0900\n"
+"PO-Revision-Date: 2011-02-24 16:54+0100\n"
+"Last-Translator: r1to <renato.rener@gmail.com>\n"
+"Language-Team: Slovenian <sl@li.org>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/lib/ecore/ecore_getopt.c:95
+msgid "Version:"
+msgstr "Različica"
+
+#: src/lib/ecore/ecore_getopt.c:104
+msgid "Usage:"
+msgstr "Uporaba:"
+
+#: src/lib/ecore/ecore_getopt.c:109
+#, c-format
+msgid "%s [options]\n"
+msgstr "%s·[možnosti]\n"
+
+#: src/lib/ecore/ecore_getopt.c:264
+msgid "Copyright:"
+msgstr "Avtorstvo:"
+
+#: src/lib/ecore/ecore_getopt.c:276
+msgid "License:"
+msgstr "Licenca:"
+
+#: src/lib/ecore/ecore_getopt.c:457
+msgid "Type: "
+msgstr "Vrsta:·"
+
+#: src/lib/ecore/ecore_getopt.c:533
+msgid "Default: "
+msgstr "Privzeto:·"
+
+#: src/lib/ecore/ecore_getopt.c:560
+msgid "Choices: "
+msgstr "Izbire:·"
+
+#: src/lib/ecore/ecore_getopt.c:661
+msgid "Options:\n"
+msgstr "Možnosti:\n"
+
+#: src/lib/ecore/ecore_getopt.c:788
+#, c-format
+msgid "ERROR: unknown option --%s.\n"
+msgstr "NAPAKA:·Neznana možnost·--%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:790
+#, c-format
+msgid "ERROR: unknown option -%c.\n"
+msgstr "NAPAKA:·neznana možnost·-%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:848
+msgid "ERROR: "
+msgstr "NAPAKA:"
+
+#: src/lib/ecore/ecore_getopt.c:931 src/lib/ecore/ecore_getopt.c:1068
+#: src/lib/ecore/ecore_getopt.c:1084 src/lib/ecore/ecore_getopt.c:1099
+#: src/lib/ecore/ecore_getopt.c:1116 src/lib/ecore/ecore_getopt.c:1163
+#: src/lib/ecore/ecore_getopt.c:1283 src/lib/ecore/ecore_getopt.c:1324
+msgid "value has no pointer set.\n"
+msgstr "vrednost nima nastavljenega kazalnika.\n"
+
+#: src/lib/ecore/ecore_getopt.c:963 src/lib/ecore/ecore_getopt.c:1183
+#, c-format
+msgid "unknown boolean value %s.\n"
+msgstr "neznana Boolova vrednost·%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1014 src/lib/ecore/ecore_getopt.c:1271
+#, c-format
+msgid "invalid number format %s\n"
+msgstr "napačen·format števila·%s\n"
+
+#: src/lib/ecore/ecore_getopt.c:1129
+#, c-format
+msgid "invalid choice \"%s\". Valid values are: "
+msgstr "napačna izbira·\"%s\".·Pravilne izbire so:·"
+
+#: src/lib/ecore/ecore_getopt.c:1157
+msgid "missing parameter to append.\n"
+msgstr "manjka·parameter·za dodajo.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1261
+msgid "could not parse value.\n"
+msgstr "vrednosti ni bilo možno razčleniti.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1318
+msgid "missing parameter.\n"
+msgstr "manjkajoči·parameter.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1331
+msgid "missing callback function!\n"
+msgstr "manjkajoča povratno-zasilna funkcija !\n"
+
+#: src/lib/ecore/ecore_getopt.c:1360
+msgid "no version was defined.\n"
+msgstr "definirana ni bila nobena različica.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1377
+msgid "no copyright was defined.\n"
+msgstr "definirano ni bilo nobeno avtorstvo.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1394
+msgid "no license was defined.\n"
+msgstr "definirana ni bila nobena licenca.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1469
+#, c-format
+msgid "ERROR: unknown option --%s, ignored.\n"
+msgstr "NAPAKA:·neznana možnost·--%s,·prezrto.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1502
+#, c-format
+msgid "ERROR: option --%s requires an argument!\n"
+msgstr "NAPAKA:·možnost·--%s·zahteva argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1544
+#, c-format
+msgid "ERROR: unknown option -%c, ignored.\n"
+msgstr "NAPAKA:·neznana možnost·-%c,·prezrto.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1582
+#, c-format
+msgid "ERROR: option -%c requires an argument!\n"
+msgstr "NAPAKA:·možnost·-%c zahteva argument!\n"
+
+#: src/lib/ecore/ecore_getopt.c:1793
+msgid "ERROR: no parser provided.\n"
+msgstr "NAPAKA:·ni podan razčlenjevalnik.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1798
+msgid "ERROR: no values provided.\n"
+msgstr "NAPAKA::·ni podanih vrednosti.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1807
+msgid "ERROR: no arguments provided.\n"
+msgstr "NAPAKA::·ni podanih argumentov.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1833
+msgid "ERROR: invalid options found."
+msgstr "NAPAKA::·najdene nepravilne možnosti"
+
+#: src/lib/ecore/ecore_getopt.c:1839
+#, c-format
+msgid " See --%s.\n"
+msgstr "·Glej·--%s.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1841
+#, c-format
+msgid " See -%c.\n"
+msgstr "·Glej·-%c.\n"
+
+#: src/lib/ecore/ecore_getopt.c:1887
+#, c-format
+msgid "ERROR: incorrect geometry value '%s'\n"
+msgstr "NAPAKA::·nepravilna geometrijska vrednost·'%s'\n"
+
+#: src/lib/ecore/ecore_getopt.c:1919
+#, c-format
+msgid "ERROR: incorrect size value '%s'\n"
+msgstr "NAPAKA::·nepravilna vrednost velikosti·'%s'\n"
index a8590b2..b8dab4f 100644 (file)
@@ -1,3 +1,26 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-SUBDIRS = lib bin
+SUBDIRS = lib bin tests examples modules
+
+if BUILD_ECORE_X_XCB
+  MAINTAINERCLEANFILES += ecore_xcb_keysym_table.h ecore_xcb_keysym_table_h
+  CLEANFILES = ecore_xcb_keysym_table.h ecore_xcb_keysym_table_h
+
+  SUBDIRS += util
+
+  BUILT_SOURCES=ecore_xcb_keysym_table.h
+
+  #
+  # Building ecore_xcb_keysym_table.h requires the makekeys utility
+  #
+
+  ecore_xcb_keysym_table.h: $(KEYSYMDEFS) $(top_builddir)/src/util/makekeys$(EXEEXT)
+         $(top_builddir)/src/util/makekeys $(KEYSYMDEFS) > ecore_xcb_keysym_table_h
+         mv -f ecore_xcb_keysym_table_h ./lib/ecore_x/xcb/$@
+
+  $(top_builddir)/src/util/makekeys$(EXEEXT): force
+         cd util && $(MAKE)
+
+  force:
+
+endif
index bc2c0dd..79110e4 100644 (file)
@@ -8,6 +8,10 @@ ECORE_CONFIG_PROG =
 ECORE_CONFIG_LIB =
 endif
 
+if EFL_ENABLE_TESTS
+ECORE_TEST_PROG = ecore_test
+endif
+
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
 -I$(top_srcdir)/src/lib/ecore_config \
@@ -16,9 +20,9 @@ AM_CPPFLAGS = \
 -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 -DPACKAGE_LIB_DIR=\"$(libdir)\" \
 -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
-@EET_CFLAGS@
+@EINA_CFLAGS@ @EVAS_CFLAGS@
 
-bin_PROGRAMS = $(ECORE_CONFIG_PROG)
+bin_PROGRAMS = $(ECORE_CONFIG_PROG) $(ECORE_TEST_PROG)
 
 ecore_config_SOURCES = \
 ecore_config.c
@@ -27,10 +31,21 @@ ecore_config_LDADD = \
 $(ECORE_CONFIG_LIB) \
 $(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la \
 $(top_builddir)/src/lib/ecore_con/libecore_con.la \
-$(top_builddir)/src/lib/ecore/libecore.la
+$(top_builddir)/src/lib/ecore/libecore.la \
+@EINA_LIBS@ @EVAS_LIBS@
 
 ecore_config_DEPENDENCIES = \
 $(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la \
 $(top_builddir)/src/lib/ecore_con/libecore_con.la \
 $(top_builddir)/src/lib/ecore/libecore.la \
 $(ECORE_CONFIG_LIB)
+
+ecore_test_SOURCES = \
+ecore_test.c
+
+ecore_test_LDADD = \
+$(top_builddir)/src/lib/ecore/libecore.la \
+@EINA_LIBS@ @EVAS_LIBS@
+
+ecore_test_DEPENDENCIES = \
+$(top_builddir)/src/lib/ecore/libecore.la
index e3ef78c..b4973d9 100644 (file)
@@ -10,7 +10,6 @@
 #include <getopt.h>
 #include <Eet.h>
 #include "Ecore_Config.h"
-#include "Ecore_Data.h"
 #include "ecore_config_private.h"
 
 // strcmp for paths - for sorting folders before files
@@ -37,8 +36,8 @@ pathcmp(const char *s1, const char *s2)
    // order folders before files
    s1d = strchr(s1, '/');
    s2d = strchr(s2, '/');
-   if (s1d != NULL && s2d == NULL) return -1;
-   if (s1d == NULL && s2d != NULL) return  1;
+   if (s1d && !s2d) return -1;
+   if (!s1d && s2d) return  1;
 
    return strcmp(s1, s2);
 }
@@ -48,7 +47,7 @@ del(const char *key)
 {
    Ecore_Config_Prop *e;
    e = ecore_config_get(key);
-   if(e == NULL) return -1;
+   if(!e) return -1;
 
    ecore_config_dst(e);
    return 0;
@@ -62,7 +61,7 @@ get(const char *key)
 
    if (!(e = ecore_config_get(key)))
      {
-       fprintf(stderr, "No such property\n");
+       EINA_LOG_ERR("No such property");
        return -1;
      }
      
@@ -92,7 +91,7 @@ get(const char *key)
           temp = ecore_config_theme_get(key);
           break;
        default:
-          fprintf(stderr, "Property has unrecognized type");
+          EINA_LOG_ERR("Property has unrecognized type");
           return -1;
      }
    if(temp)
@@ -106,19 +105,9 @@ get(const char *key)
 static int
 list(const char *file)
 {
-   char *key;
-
-   Eet_File *ef;
    Ecore_Config_Prop *e;
-   Ecore_Sheap *keys;
-
-   // Get number of keys and create heap for sort
-   ef = eet_open(file, EET_FILE_MODE_READ);
-   if (!ef) return -1;
-
-   keys = ecore_sheap_new(ECORE_COMPARE_CB(pathcmp), eet_num_entries(ef));
-
-   eet_close(ef);
+   Eina_List *keys = NULL;
+   char *key;
 
    e = __ecore_config_bundle_local->data;
 
@@ -126,18 +115,17 @@ list(const char *file)
      {
        // don't show system settings
        if( !(e->flags & ECORE_CONFIG_FLAG_SYSTEM) )
-          ecore_sheap_insert(keys, e->key);
+          keys = eina_list_append(keys, e->key);
      }
    while((e = e->next));
+   keys = eina_list_sort(keys, -1, EINA_COMPARE_CB(pathcmp));
 
-   while((key = ecore_sheap_extract(keys)))
+   EINA_LIST_FREE(keys, key)
      {
        printf("%-28s\t", key);
        get(key);
      }
 
-   ecore_sheap_destroy(keys);
-
    return 0;
 }
 
@@ -175,7 +163,7 @@ main(int argc, char * const argv[])
    float f;
    
    file = key = prog = NULL;
-
+   eina_init();
    prog = strdup(argv[0]);
 
    if(argc < 4)
@@ -270,12 +258,12 @@ main(int argc, char * const argv[])
    if(cmd == 's' && type == -1)
      usage_and_exit(prog, 2, "You need to specify a command!");
 
-   if(cmd != 'a' && key == NULL)
+   if(cmd != 'a' && !key)
      usage_and_exit(prog, 2, "You need to specify key!");
    
    if(ecore_config_init("econfig") != ECORE_CONFIG_ERR_SUCC)
      {
-       fprintf(stderr, "Couldn't init ecore_config!");
+       EINA_LOG_ERR("Couldn't init ecore_config!");
        return 1;
      }
 
@@ -313,7 +301,7 @@ main(int argc, char * const argv[])
           if (list(file)) ret = 1;
           break;
        default:
-          printf("Unhandled command '%c'\n", cmd);
+          EINA_LOG_ERR("Unhandled command '%c'", cmd);
      }
 
    ecore_config_shutdown();
@@ -323,7 +311,7 @@ main(int argc, char * const argv[])
 
    if(file)
      free(file);
-
+   eina_shutdown();
    return ret;
 }
 #else
diff --git a/src/bin/ecore_test.c b/src/bin/ecore_test.c
new file mode 100644 (file)
index 0000000..851b2dd
--- /dev/null
@@ -0,0 +1,109 @@
+#include "config.h"
+
+#include <Ecore.h>
+#include <assert.h>
+#include <unistd.h>
+
+const char *called = NULL;
+
+static const char *idler_str = "idler";
+static const char *idle_enterer_str = "idler_enterer";
+static const char *idle_exiter_str = "idler_exiter";
+static const char *timer1_str = "timer 1";
+static const char *timer2_str = "timer 2";
+static const char *pipe_read_str = "pipe read";
+
+int count;
+Ecore_Pipe *the_pipe;
+
+Eina_Bool timer_one(void *data __UNUSED__)
+{
+   fprintf(stderr, "timer 1\n");
+   assert(called == pipe_read_str);
+   called = timer1_str;
+   ecore_pipe_write(the_pipe, "b", 1);
+
+   count++;
+   if (count == 10)
+     {
+       ecore_main_loop_quit();
+       return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+Eina_Bool timer_two(void *data __UNUSED__)
+{
+   fprintf(stderr, "timer 2\n");
+   assert(called == timer1_str);
+   called = timer2_str;
+
+   return EINA_TRUE;
+}
+
+Eina_Bool idle_enterer_one(void *data __UNUSED__)
+{
+   fprintf(stderr, "idle enterer!\n");
+   switch (count)
+   {
+   default:
+     assert(called == timer2_str);
+     break;
+   case 1:
+     assert(called == timer1_str);
+     break;
+   case 0:
+     assert(called == NULL);
+   }
+   called = idle_enterer_str;
+   return EINA_TRUE;
+}
+
+Eina_Bool idler_one(void *data __UNUSED__)
+{
+   fprintf(stderr, "idler!\n");
+   assert(called == idle_enterer_str);
+   called = idler_str;
+   if (count == 0)
+     ecore_timer_add(0.0, timer_two, NULL);
+   return EINA_TRUE;
+}
+
+Eina_Bool idle_exiter_one(void *data __UNUSED__)
+{
+   fprintf(stderr, "idle exiter!\n");
+   assert(called == idler_str);
+   called = idle_exiter_str;
+   return EINA_TRUE;
+}
+
+void pipe_read(void *data __UNUSED__, void *buffer __UNUSED__, unsigned int nbyte __UNUSED__)
+{
+   fprintf(stderr, "pipe read\n");
+   assert(called == idle_exiter_str);
+   called = pipe_read_str;
+}
+
+int main(int argc __UNUSED__, char **argv __UNUSED__)
+{
+   assert(1 == ecore_init());
+
+   the_pipe = ecore_pipe_add(&pipe_read, NULL);
+   assert(the_pipe != NULL);
+   assert(EINA_TRUE == ecore_pipe_write(the_pipe, "a", 1));
+
+   assert(NULL != ecore_timer_add(0.0, timer_one, NULL));
+
+   assert(NULL != ecore_idle_enterer_add(&idle_enterer_one, NULL));
+   assert(NULL != ecore_idler_add(&idler_one, NULL));
+   assert(NULL != ecore_idle_exiter_add(&idle_exiter_one, NULL));
+
+   ecore_main_loop_begin();
+
+   /* glib main loop exits on an idle enterer */
+   assert(called == idle_enterer_str);
+
+   assert(0 == ecore_shutdown());
+   return 0;
+}
diff --git a/src/examples/Makefile.am b/src/examples/Makefile.am
new file mode 100644 (file)
index 0000000..00ea91d
--- /dev/null
@@ -0,0 +1,117 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+examplesdir = $(datadir)/$(PACKAGE)/examples
+
+filesdir = $(datadir)/$(PACKAGE)/examples
+files_DATA =
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_evas \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_srcdir)/src/lib/ecore_con \
+-DPACKAGE_EXAMPLES_DIR=\"$(datadir)/$(PACKAGE)/examples\" \
+@GLIB_CFLAGS@ @EVIL_CFLAGS@ @EVAS_CFLAGS@ @EINA_CFLAGS@ @WIN32_CPPFLAGS@ @EFL_ECORE_BUILD@
+
+ECOREBASELDADD = \
+       $(top_builddir)/src/lib/ecore/libecore.la \
+       $(top_builddir)/src/lib/ecore_evas/libecore_evas.la \
+       @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @EVAS_LIBS@ @GLIB_LIBS@ @WIN32_LIBS@ @LTLIBINTL@ @EFL_PTHREAD_LIBS@ @rt_libs@ -lm
+
+
+LDADD = \
+       $(ECOREBASELDADD)
+
+SRCS = \
+       ecore_animator_example.c \
+       ecore_fd_handler_example.c \
+       ecore_poller_example.c \
+       ecore_event_example_01.c \
+       ecore_event_example_02.c \
+       ecore_idler_example.c \
+       ecore_timer_example.c \
+       ecore_time_functions_example.c \
+       ecore_job_example.c \
+       ecore_con_lookup_example.c \
+       ecore_con_url_headers_example.c \
+       ecore_con_url_download_example.c \
+       ecore_con_url_cookies_example.c \
+       ecore_con_server_simple_example.c \
+       ecore_con_server_http_example.c \
+       ecore_con_client_simple_example.c \
+       ecore_client_bench.c \
+       ecore_server_bench.c \
+       ecore_con_client_example.c \
+       ecore_con_server_example.c \
+       ecore_fd_handler_gnutls_example.c \
+       ecore_file_download_example.c \
+       ecore_pipe_simple_example.c \
+       ecore_pipe_gstreamer_example.c \
+       ecore_thread_example.c \
+       ecore_evas_callbacks.c \
+       ecore_evas_window_sizes_example.c \
+       ecore_evas_object_example.c \
+       ecore_evas_basics_example.c \
+       ecore_evas_buffer_example_01.c \
+       ecore_evas_buffer_example_02.c \
+        ecore_evas_ews_example.c \
+        ecore_exe_example.c \
+        ecore_exe_example_child.c
+
+EXTRA_DIST = $(SRCS) \
+       $(srcdir)/red.png
+
+examples_PROGRAMS =
+
+if EFL_INSTALL_EXAMPLES
+files_DATA += $(SRCS) \
+       $(srcdir)/red.png
+endif
+
+if EFL_BUILD_EXAMPLES
+examples_PROGRAMS += \
+       ecore_animator_example \
+       ecore_fd_handler_example \
+       ecore_poller_example \
+       ecore_event_example_01 \
+       ecore_event_example_02 \
+       ecore_idler_example \
+       ecore_job_example \
+       ecore_timer_example \
+       ecore_time_functions_example \
+       ecore_pipe_simple_example \
+       ecore_con_lookup_example \
+       ecore_con_url_headers_example \
+       ecore_con_url_download_example \
+       ecore_con_url_cookies_example \
+       ecore_con_server_simple_example \
+       ecore_con_server_http_example \
+       ecore_con_client_simple_example \
+       ecore_thread_example \
+       ecore_evas_callbacks \
+       ecore_evas_window_sizes_example \
+       ecore_evas_object_example \
+       ecore_evas_basics_example \
+       ecore_evas_buffer_example_01 \
+       ecore_evas_buffer_example_02 \
+       ecore_evas_ews_example \
+       ecore_client_bench \
+        ecore_server_bench \
+        ecore_exe_example \
+        ecore_exe_example_child
+
+ecore_con_lookup_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_con_url_headers_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_con_url_download_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_con_url_cookies_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_con_server_simple_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_con_server_http_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_con_client_simple_example_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_evas_window_sizes_example_LDADD = $(ECOREBASELDADD) @EVAS_LIBS@ $(top_builddir)/src/lib/ecore_evas/libecore_evas.la
+ecore_evas_buffer_example_01_LDADD = $(ECOREBASELDADD) @EVAS_LIBS@ $(top_builddir)/src/lib/ecore_evas/libecore_evas.la
+ecore_evas_buffer_example_02_LDADD = $(ECOREBASELDADD) @EVAS_LIBS@ $(top_builddir)/src/lib/ecore_evas/libecore_evas.la
+ecore_client_bench_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+ecore_server_bench_LDADD = $(ECOREBASELDADD) $(top_builddir)/src/lib/ecore_con/libecore_con.la
+
+endif
diff --git a/src/examples/ecore_animator_example.c b/src/examples/ecore_animator_example.c
new file mode 100644 (file)
index 0000000..545d48a
--- /dev/null
@@ -0,0 +1,117 @@
+//Compile with:
+//gcc -g -Wall `pkg-config --cflags --libs ecore-evas` -o ecore_animator_example ecore_animator_example.c
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+
+static Eina_Bool _advance_frame(void *data, double pos);
+static Eina_Bool _advance_frame2(void *data, double pos);
+static Eina_Bool _advance_frame3(void *data);
+static Eina_Bool _start_second_anim(void *data);
+static Eina_Bool _freeze_third_anim(void *data);
+static Eina_Bool _thaw_third_anim(void *data);
+
+int
+main(int argc, char *argv[])
+{
+   Evas_Object *rect, *bg, *rect2;
+   Ecore_Evas *ee;
+   Evas *evas;
+   Ecore_Animator *anim;
+
+   ecore_evas_init();
+
+   ee = ecore_evas_new(NULL, 0, 0, 300, 400, NULL);
+   ecore_evas_show(ee);
+   evas = ecore_evas_get(ee);
+
+   bg = evas_object_rectangle_add(evas);
+   evas_object_resize(bg, 300, 400);
+   evas_object_show(bg);
+
+   rect = evas_object_rectangle_add(evas);
+   evas_object_color_set(rect, 0, 0, 255, 255);
+   evas_object_resize(rect, 50, 50);
+   evas_object_show(rect);
+
+   rect2 = evas_object_rectangle_add(evas);
+   evas_object_color_set(rect2, 0, 55, 0, 255);
+   evas_object_resize(rect2, 50, 50);
+   evas_object_show(rect2);
+
+   ecore_animator_frametime_set(1. / 50);
+   ecore_animator_timeline_add(5, _advance_frame, rect);
+
+   anim = ecore_animator_add(_advance_frame3, rect2);
+
+   ecore_timer_add(10, _start_second_anim, rect);
+   ecore_timer_add(5, _freeze_third_anim, anim);
+   ecore_timer_add(10, _thaw_third_anim, anim);
+   ecore_main_loop_begin();
+
+   evas_object_del(rect);
+   ecore_evas_free(ee);
+   ecore_animator_del(anim);
+   ecore_evas_shutdown();
+
+   return 0;
+}
+
+static Eina_Bool
+_advance_frame(void *data, double pos)
+{
+   double frame = pos;
+   frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_SPRING, 1.2, 15);
+
+   evas_object_resize(data, 50 * (1 + frame), 50 * (1 + frame));
+   evas_object_move(data, 100 * frame, 100 * frame);
+   evas_object_color_set(data, 255 * frame, 0, 255 * (1 - frame), 255);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_start_second_anim(void *data)
+{
+   ecore_animator_frametime_set(1. / 10);
+   ecore_animator_timeline_add(20, _advance_frame2, data);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_advance_frame2(void *data, double pos)
+{
+   double frame = pos;
+   frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 1.2, 50);
+
+   evas_object_resize(data, 100 - (50 * frame), 100 - (50 * frame));
+   evas_object_move(data, 100 * (1 - frame), 100 * (1 - frame));
+   evas_object_color_set(data, 255 * (1 - frame), 0, 255 * frame, 255);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_advance_frame3(void *data)
+{
+   static int x = 0;
+
+   if (x >= 250)
+     x = 0;
+   evas_object_move(data, ++x, 350);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_freeze_third_anim(void *data)
+{
+   ecore_animator_freeze(data);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_thaw_third_anim(void *data)
+{
+   ecore_animator_thaw(data);
+   return EINA_FALSE;
+}
+
diff --git a/src/examples/ecore_client_bench.c b/src/examples/ecore_client_bench.c
new file mode 100644 (file)
index 0000000..dc550ee
--- /dev/null
@@ -0,0 +1,79 @@
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+/* Ecore_Con client example
+ * 2010 Mike Blumenkrantz
+ */
+
+#define NUM_CLIENTS 30000
+
+static Eina_Counter *counter;
+static int add = 0;
+static int del = 0;
+
+Eina_Bool
+_add(void *data, int type, Ecore_Con_Event_Server_Add *ev)
+{
+   ++add;
+   printf("Connection #%i!\n", add);
+   if (add == NUM_CLIENTS)
+     ecore_main_loop_quit();
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data, int type, Ecore_Con_Event_Server_Add *ev)
+{
+   ++del;
+   printf("Connection lost! #%i!\n", del);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_spawn(void *data)
+{
+   int x;
+
+   for (x = 0; x < NUM_CLIENTS; x++)
+     {
+//        printf("Creating connection %i\n", x);
+        if (!ecore_con_server_connect(ECORE_CON_REMOTE_NODELAY, "127.0.0.1", 8080, NULL))
+          {
+             printf("CRITICAL ERROR!\n"
+                    "Could not create connection #%i!\n", x);
+             exit(1);
+          }
+     }
+   printf("***Job done***\n");
+}
+
+int
+main(void)
+{
+   double done;
+   eina_init();
+   ecore_init();
+   ecore_con_init();
+
+   eina_log_domain_level_set("ecore_con", EINA_LOG_LEVEL_ERR);
+   eina_log_domain_level_set("eina", EINA_LOG_LEVEL_ERR);
+   counter = eina_counter_new("client");
+   eina_counter_start(counter);
+   done = ecore_time_get();
+
+   ecore_job_add(_spawn, NULL);
+
+/* set event handler for server connect */
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb)_del, NULL);
+
+/* start client */
+   ecore_main_loop_begin();
+   eina_counter_stop(counter, 1);
+   printf("\nTime elapsed for %i connections: %f seconds\n%s", NUM_CLIENTS, ecore_time_get() - done, eina_counter_dump(counter));
+   return 0;
+}
+
diff --git a/src/examples/ecore_con_client_example.c b/src/examples/ecore_con_client_example.c
new file mode 100644 (file)
index 0000000..c6ab50d
--- /dev/null
@@ -0,0 +1,92 @@
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+/* Ecore_Con client example
+ * 2010 Mike Blumenkrantz
+ */
+
+/* comment if not using gnutls */
+static void
+tls_log_func(int level, const char *str)
+{
+   fprintf(stderr, "|<%d>| %s", level, str);
+}
+
+Eina_Bool
+_add(void *data, int type, Ecore_Con_Event_Server_Add *ev)
+{
+   printf("Server with ip %s connected!\n", ecore_con_server_ip_get(ev->server));
+   ecore_con_server_send(ev->server, "hello!", 6);
+   ecore_con_server_flush(ev->server);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data, int type, Ecore_Con_Event_Server_Del *ev)
+{
+   printf("Lost server with ip %s!\n", ecore_con_server_ip_get(ev->server));
+   ecore_main_loop_quit();
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_data(void *data, int type, Ecore_Con_Event_Server_Data *ev)
+{
+   char fmt[128];
+
+   snprintf(fmt, sizeof(fmt),
+            "Received %i bytes from server:\n"
+            ">>>>>\n"
+            "%%.%is\n"
+            ">>>>>\n",
+            ev->size, ev->size);
+
+   printf(fmt, ev->data);
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main()
+{
+   Ecore_Con_Server *svr;
+   Eina_Iterator *it;
+   const char *ca;
+
+   eina_init();
+   ecore_init();
+   ecore_con_init();
+
+/* comment if not using gnutls */
+   gnutls_global_set_log_level(9);
+   gnutls_global_set_log_function(tls_log_func);
+
+   if (!(it = eina_file_ls("/etc/ssl/certs")))
+     exit(1);
+
+   if (!(svr = ecore_con_server_connect(ECORE_CON_REMOTE_TCP | ECORE_CON_USE_MIXED, "www.verisign.com", 443, NULL)))
+     exit(1);
+
+   /* add all the CAs */
+   EINA_ITERATOR_FOREACH(it, ca)
+     {
+        if (!ecore_con_ssl_server_cafile_add(svr, ca))
+          printf("Could not load CA: %s!\n", ca);
+        eina_stringshare_del(ca);
+     }
+
+   eina_iterator_free(it);
+   ecore_con_ssl_server_verify(svr);
+
+/* set event handler for server connect */
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
+/* set event handler for server disconnect */
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
+/* set event handler for receiving server data */
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
+
+/* start client */
+   ecore_main_loop_begin();
+}
+
diff --git a/src/examples/ecore_con_client_simple_example.c b/src/examples/ecore_con_client_simple_example.c
new file mode 100644 (file)
index 0000000..fe852b7
--- /dev/null
@@ -0,0 +1,126 @@
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# define __UNUSED__
+#endif
+
+struct _Server
+{
+   int sdata;
+};
+
+Eina_Bool
+_add(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Server_Add *ev)
+{
+   char welcome[] = "hello! - sent from the client";
+   struct _Server *server = malloc(sizeof(*server));
+   server->sdata = 0;
+
+   ecore_con_server_data_set(ev->server, server);
+   printf("Server with ip %s, name %s, port %d, connected = %d!\n",
+          ecore_con_server_ip_get(ev->server),
+          ecore_con_server_name_get(ev->server),
+          ecore_con_server_port_get(ev->server),
+          ecore_con_server_connected_get(ev->server));
+   ecore_con_server_send(ev->server, welcome, sizeof(welcome));
+   ecore_con_server_flush(ev->server);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Server_Del *ev)
+{
+   if (!ev->server)
+     {
+        printf("Failed to establish connection to the server.\nExiting.\n");
+        ecore_main_loop_quit();
+        return ECORE_CALLBACK_RENEW;
+     }
+
+   struct _Server *server = ecore_con_server_data_get(ev->server);
+
+   printf("Lost server with ip %s!\n", ecore_con_server_ip_get(ev->server));
+
+   if (server)
+     {
+        printf("Total data received from this server: %d\n", server->sdata);
+        free(server);
+     }
+
+   ecore_con_server_del(ev->server);
+
+   ecore_main_loop_quit();
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_data(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Server_Data *ev)
+{
+   char fmt[128];
+   struct _Server *server = ecore_con_server_data_get(ev->server);
+
+   snprintf(fmt, sizeof(fmt),
+            "Received %i bytes from server:\n"
+            ">>>>>\n"
+            "%%.%is\n"
+            ">>>>>\n",
+            ev->size, ev->size);
+
+   printf(fmt, ev->data);
+
+   server->sdata += ev->size;
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(int argc, const char *argv[])
+{
+   Ecore_Con_Server *svr;
+   const char *address;
+   int port = 8080;
+
+   if (argc < 2)
+     {
+        printf("wrong usage. Command syntax is:\n");
+        printf("\tecore_con_client_simple_example <address> [port]\n");
+        exit(1);
+     }
+
+   address = argv[1];
+
+   if (argc > 2)
+     port = atoi(argv[2]);
+
+   eina_init();
+   ecore_init();
+   ecore_con_init();
+
+   if (!(svr = ecore_con_server_connect(ECORE_CON_REMOTE_TCP, address, port, NULL)))
+     {
+        printf("could not connect to the server: %s, port %d.\n",
+               address, port);
+        exit(2);
+     }
+
+   /* set event handler for server connect */
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
+   /* set event handler for server disconnect */
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
+   /* set event handler for receiving server data */
+   ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
+
+   /* start client */
+   ecore_main_loop_begin();
+
+   ecore_con_init();
+   ecore_init();
+   eina_init();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_con_lookup_example.c b/src/examples/ecore_con_lookup_example.c
new file mode 100644 (file)
index 0000000..1a47d0b
--- /dev/null
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+static void
+_lookup_done_cb(const char *canonname, const char *ip, struct sockaddr *addr, int addrlen, void *data)
+{
+   printf("canonname = %s\n", canonname);
+   printf("ip = %s\n", ip);
+   printf("addr = %p\n", addr);
+   printf("addrlen = %d\n", addrlen);
+}
+
+int
+main(int argc, const char *argv[])
+{
+   if (argc < 2)
+     {
+        printf("need one parameter: <address>\n");
+        return -1;
+     }
+
+   ecore_init();
+   ecore_con_init();
+
+   if (!ecore_con_lookup(argv[1], _lookup_done_cb, NULL))
+     {
+        printf("error when trying to start lookup for %s\n", argv[1]);
+        goto end;
+     }
+
+   ecore_main_loop_begin();
+
+end:
+   ecore_con_shutdown();
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_con_server_example.c b/src/examples/ecore_con_server_example.c
new file mode 100644 (file)
index 0000000..7333521
--- /dev/null
@@ -0,0 +1,81 @@
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+/* Ecore_Con server example
+ * 2010 Mike Blumenkrantz
+ */
+
+/* comment if not using gnutls */
+static void
+tls_log_func(int level, const char *str)
+{
+   fprintf(stderr, "|<%d>| %s", level, str);
+}
+
+Eina_Bool
+_add(void *data, int type, Ecore_Con_Event_Client_Add *ev)
+{
+   printf("Client with ip %s connected!\n", ecore_con_client_ip_get(ev->client));
+   ecore_con_client_send(ev->client, "hello!", 6);
+//   ecore_con_client_flush(ev->client);
+   ecore_con_client_timeout_set(ev->client, 5);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data, int type, Ecore_Con_Event_Client_Del *ev)
+{
+   printf("Lost client with ip %s!\n", ecore_con_client_ip_get(ev->client));
+   ecore_main_loop_quit();
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_data(void *data, int type, Ecore_Con_Event_Client_Data *ev)
+{
+   char fmt[128];
+
+   snprintf(fmt, sizeof(fmt),
+            "Received %i bytes from client:\n"
+            ">>>>>\n"
+            "%%.%is\n"
+            ">>>>>\n",
+            ev->size, ev->size);
+
+   printf(fmt, ev->data);
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main()
+{
+   Ecore_Con_Server *svr;
+   eina_init();
+   ecore_init();
+   ecore_con_init();
+
+/* comment if not using gnutls */
+   gnutls_global_set_log_level(9);
+   gnutls_global_set_log_function(tls_log_func);
+
+/* to use a PEM certificate with TLS and SSL3, uncomment the lines below */
+   if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP | ECORE_CON_USE_TLS | ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT, "127.0.0.1", 8080, NULL)))
+/* to use simple tcp with ssl/tls, use this line */
+//   if (!ecore_con_server_add(ECORE_CON_REMOTE_TCP | ECORE_CON_USE_SSL3, "127.0.0.1", 8080, NULL))
+     exit(1);
+
+   ecore_con_ssl_server_cert_add(svr, "server.pem");
+   ecore_con_ssl_server_privkey_add(svr, "server.pem");
+/* set event handler for client connect */
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
+/* set event handler for client disconnect */
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
+/* set event handler for receiving client data */
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
+
+/* start server */
+   ecore_main_loop_begin();
+}
+
diff --git a/src/examples/ecore_con_server_http_example.c b/src/examples/ecore_con_server_http_example.c
new file mode 100644 (file)
index 0000000..a106ba1
--- /dev/null
@@ -0,0 +1,136 @@
+#include <stdio.h>
+#include <sys/time.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# define __UNUSED__
+#endif
+
+static const char response_template[] =
+  "HTTP/1.0 200 OK\r\n"
+  "Server: Ecore_Con custom server\r\n"
+  "Content-Length: %zd\r\n"
+  "Content-Type: text/html; charset=UTF-8\r\n"
+  "Set-Cookie: MYCOOKIE=1; path=/; expires=%s\r\n"
+  "Set-Cookie: SESSIONCOOKIE=1; path=/\r\n"
+  "\r\n"
+  "%s";
+
+struct _Client
+{
+   int sdata;
+};
+
+Eina_Bool
+_add(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Add *ev)
+{
+   struct _Client *client = malloc(sizeof(*client));
+   client->sdata = 0;
+   static char buf[4096];
+   char welcome[] = "Welcome to Ecore_Con server!";
+   time_t t;
+
+   printf("Client with ip %s, port %d, connected = %d!\n",
+          ecore_con_client_ip_get(ev->client),
+          ecore_con_client_port_get(ev->client),
+          ecore_con_client_connected_get(ev->client));
+
+   ecore_con_client_data_set(ev->client, client);
+
+   t = time(NULL);
+   t += 60 * 60 * 24;
+   snprintf(buf, sizeof(buf), response_template, sizeof(welcome) - 1, ctime(&t), welcome);
+
+   ecore_con_client_send(ev->client, buf, strlen(buf));
+   ecore_con_client_flush(ev->client);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Del *ev)
+{
+   struct _Client *client;
+
+   if (!ev->client)
+     return ECORE_CALLBACK_RENEW;
+
+   client = ecore_con_client_data_get(ev->client);
+
+   printf("Lost client with ip %s!\n", ecore_con_client_ip_get(ev->client));
+   printf("Total data received from this client: %d\n", client->sdata);
+   printf("Client was connected for %0.3f seconds.\n",
+          ecore_con_client_uptime_get(ev->client));
+
+   if (client)
+     free(client);
+
+   ecore_con_client_del(ev->client);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_data(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Data *ev)
+{
+   char fmt[128];
+   struct _Client *client = ecore_con_client_data_get(ev->client);
+
+   snprintf(fmt, sizeof(fmt),
+            "\nReceived %i bytes from client %s port %d:\n"
+            ">>>>>\n"
+            "%%.%is\n"
+            ">>>>>\n\n",
+            ev->size, ecore_con_client_ip_get(ev->client),
+            ecore_con_client_port_get(ev->client), ev->size);
+
+   printf(fmt, ev->data);
+
+   client->sdata += ev->size;
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(void)
+{
+   Ecore_Con_Server *svr;
+   Ecore_Con_Client *cl;
+   const Eina_List *clients, *l;
+
+   eina_init();
+   ecore_init();
+   ecore_con_init();
+
+   if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
+     exit(1);
+
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
+   ecore_con_server_client_limit_set(svr, 3, 0);
+
+   ecore_main_loop_begin();
+
+   clients = ecore_con_server_clients_get(svr);
+   printf("Clients still connected to this server when exiting: %d\n",
+          eina_list_count(clients));
+   EINA_LIST_FOREACH(clients, l, cl)
+     {
+        printf("%s\n", ecore_con_client_ip_get(cl));
+        free(ecore_con_client_data_get(cl));
+     }
+
+   printf("Server was up for %0.3f seconds\n",
+          ecore_con_server_uptime_get(svr));
+
+   ecore_con_shutdown();
+   ecore_shutdown();
+   eina_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_con_server_simple_example.c b/src/examples/ecore_con_server_simple_example.c
new file mode 100644 (file)
index 0000000..13dd953
--- /dev/null
@@ -0,0 +1,133 @@
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# define __UNUSED__
+#endif
+
+struct _Client
+{
+   int sdata;
+};
+
+Eina_Bool
+_add(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Add *ev)
+{
+   char welcome[] = "hello! - sent from the server";
+   Ecore_Con_Server *srv;
+   Ecore_Con_Client *cl;
+   const Eina_List *clients, *l;
+
+   struct _Client *client = malloc(sizeof(*client));
+   client->sdata = 0;
+
+   printf("Client with ip %s, port %d, connected = %d!\n",
+          ecore_con_client_ip_get(ev->client),
+          ecore_con_client_port_get(ev->client),
+          ecore_con_client_connected_get(ev->client));
+
+   ecore_con_client_send(ev->client, welcome, sizeof(welcome));
+   ecore_con_client_flush(ev->client);
+
+   ecore_con_client_timeout_set(ev->client, 6);
+
+   ecore_con_client_data_set(ev->client, client);
+
+   srv = ecore_con_client_server_get(ev->client);
+   printf("Clients connected to this server:\n");
+   clients = ecore_con_server_clients_get(srv);
+   EINA_LIST_FOREACH(clients, l, cl)
+     printf("%s\n", ecore_con_client_ip_get(cl));
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Del *ev)
+{
+   struct _Client *client;
+
+   if (!ev->client)
+     return ECORE_CALLBACK_RENEW;
+
+   client = ecore_con_client_data_get(ev->client);
+
+   printf("Lost client with ip %s!\n", ecore_con_client_ip_get(ev->client));
+   printf("Total data received from this client: %d\n", client->sdata);
+   printf("Client was connected for %0.3f seconds.\n",
+          ecore_con_client_uptime_get(ev->client));
+
+   if (client)
+     free(client);
+
+   ecore_con_client_del(ev->client);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_data(void *data __UNUSED__, int type __UNUSED__, Ecore_Con_Event_Client_Data *ev)
+{
+   char fmt[128];
+   struct _Client *client = ecore_con_client_data_get(ev->client);
+
+   snprintf(fmt, sizeof(fmt),
+            "Received %i bytes from client %s port %d:\n"
+            ">>>>>\n"
+            "%%.%is\n"
+            ">>>>>\n",
+            ev->size, ecore_con_client_ip_get(ev->client),
+            ecore_con_client_port_get(ev->client), ev->size);
+
+   printf(fmt, ev->data);
+
+   client->sdata += ev->size;
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(void)
+{
+   Ecore_Con_Server *svr;
+   Ecore_Con_Client *cl;
+   const Eina_List *clients, *l;
+
+   eina_init();
+   ecore_init();
+   ecore_con_init();
+
+   if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
+     exit(1);
+
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, (Ecore_Event_Handler_Cb)_data, NULL);
+
+   ecore_con_server_timeout_set(svr, 10);
+   ecore_con_server_client_limit_set(svr, 3, 0);
+
+   ecore_main_loop_begin();
+
+   clients = ecore_con_server_clients_get(svr);
+   printf("Clients connected to this server when exiting: %d\n",
+          eina_list_count(clients));
+   EINA_LIST_FOREACH(clients, l, cl)
+     {
+        printf("%s\n", ecore_con_client_ip_get(cl));
+        free(ecore_con_client_data_get(cl));
+     }
+
+   printf("Server was up for %0.3f seconds\n",
+          ecore_con_server_uptime_get(svr));
+
+   ecore_con_shutdown();
+   ecore_shutdown();
+   eina_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_con_url_cookies_example.c b/src/examples/ecore_con_url_cookies_example.c
new file mode 100644 (file)
index 0000000..09c7b70
--- /dev/null
@@ -0,0 +1,123 @@
+#include <stdio.h>
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# define __UNUSED__
+#endif
+
+#define COOKIEJAR "cookies.jar"
+
+static Eina_Bool
+_url_data_cb(void *data __UNUSED__, int type __UNUSED__, void *event_info)
+{
+   Ecore_Con_Event_Url_Data *url_data = event_info;
+   int i;
+
+   printf("\nData received from server:\n>>>>>\n");
+   for (i = 0; i < url_data->size; i++)
+     printf("%c", url_data->data[i]);
+   printf("\n>>>>>>\n\n");
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_url_complete_cb(void *data __UNUSED__, int type __UNUSED__, void *event_info)
+{
+   Ecore_Con_Event_Url_Complete *url_complete = event_info;
+   const Eina_List *headers, *l;
+   char *str;
+
+   printf("\n");
+   printf("download completed with status code: %d\n", url_complete->status);
+
+   headers = ecore_con_url_response_headers_get(url_complete->url_con);
+
+   printf("response headers:\n");
+   EINA_LIST_FOREACH(headers, l, str)
+     printf("header: %s", str);
+
+   ecore_con_url_cookies_jar_write(url_complete->url_con);
+
+   ecore_main_loop_quit();
+
+   return EINA_TRUE;
+}
+
+int
+main(int argc, const char *argv[])
+{
+   Ecore_Con_Url *ec_url = NULL;
+   char cmd = '\0';
+   Eina_Bool r;
+
+   if (argc < 2)
+     {
+        printf("need at least one parameter: <url> [command]\n");
+        return -1;
+     }
+
+   if (argc > 2)
+     cmd = argv[2][0];
+
+   ecore_init();
+   ecore_con_init();
+   ecore_con_url_init();
+
+   ec_url = ecore_con_url_new(argv[1]);
+   if (!ec_url)
+     {
+        printf("error when creating ecore con url object.\n");
+        goto end;
+     }
+
+   ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA, _url_data_cb, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _url_complete_cb, NULL);
+
+   ecore_con_url_additional_header_add(ec_url, "User-Agent", "Ecore_Con client");
+
+   ecore_con_url_cookies_init(ec_url);
+   if (cmd != 'c' && cmd != 's')
+     ecore_con_url_cookies_file_add(ec_url, COOKIEJAR);
+   ecore_con_url_cookies_jar_file_set(ec_url, COOKIEJAR);
+
+   switch (cmd)
+     {
+      case 'c': // clear
+        printf("Cleaning previously set cookies.\n");
+        ecore_con_url_cookies_clear(ec_url);
+        break;
+
+      case 's': // clear session
+        printf("Cleaning previously set session cookies.\n");
+        ecore_con_url_cookies_session_clear(ec_url);
+        break;
+
+      case 'i': // ignore session
+        printf("Ignoring old session cookies.\n");
+        ecore_con_url_cookies_ignore_old_session_set(ec_url, EINA_TRUE);
+     }
+
+   r = ecore_con_url_get(ec_url);
+   if (!r)
+     {
+        printf("could not realize request.\n");
+        goto free_ec_url;
+     }
+
+   ecore_main_loop_begin();
+
+free_ec_url:
+   ecore_con_url_free(ec_url);
+end:
+   ecore_con_url_shutdown();
+   ecore_con_shutdown();
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_con_url_download_example.c b/src/examples/ecore_con_url_download_example.c
new file mode 100644 (file)
index 0000000..2f95db4
--- /dev/null
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+struct _request
+{
+   long size;
+};
+
+static Eina_Bool
+_url_progress_cb(void *data, int type, void *event_info)
+{
+   Ecore_Con_Event_Url_Progress *url_progress = event_info;
+   float percent;
+
+   if (url_progress->down.total > 0)
+     {
+        struct _request *req = ecore_con_url_data_get(url_progress->url_con);
+        req->size = url_progress->down.now;
+
+        percent = (url_progress->down.now / url_progress->down.total) * 100;
+        printf("Total of download complete: %0.1f (%0.0f)%%\n",
+               percent, url_progress->down.now);
+     }
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_url_complete_cb(void *data, int type, void *event_info)
+{
+   Ecore_Con_Event_Url_Complete *url_complete = event_info;
+
+   struct _request *req = ecore_con_url_data_get(url_complete->url_con);
+   int nbytes = ecore_con_url_received_bytes_get(url_complete->url_con);
+
+   printf("\n");
+   printf("download completed with status code: %d\n", url_complete->status);
+   printf("Total size of downloaded file: %ld bytes\n", req->size);
+   printf("Total size of downloaded file: %ld bytes "
+          "(from received_bytes_get)\n", nbytes);
+   ecore_main_loop_quit();
+
+   return EINA_TRUE;
+}
+
+int
+main(int argc, const char *argv[])
+{
+   Ecore_Con_Url *ec_url = NULL;
+   struct _request *req;
+   int fd;
+   const char *filename = "downloadedfile.dat";
+
+   if (argc < 2)
+     {
+        printf("need one parameter: <url>\n");
+        return -1;
+     }
+
+   fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0644);
+
+   if (fd == -1)
+     {
+        printf("error: could not open file for writing: \"%s\"\n",
+               filename);
+        return -1;
+     }
+
+   ecore_init();
+   ecore_con_init();
+   ecore_con_url_init();
+
+   ec_url = ecore_con_url_new(argv[1]);
+   if (!ec_url)
+     {
+        printf("error when creating ecore con url object.\n");
+        goto end;
+     }
+
+   req = malloc(sizeof(*req));
+   req->size = 0;
+   ecore_con_url_data_set(ec_url, req);
+
+   ecore_con_url_fd_set(ec_url, fd);
+
+   ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _url_progress_cb, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _url_complete_cb, NULL);
+
+   if (!ecore_con_url_get(ec_url))
+     {
+        printf("could not realize request.\n");
+        goto free_ec_url;
+     }
+
+   ecore_main_loop_begin();
+
+free_ec_url:
+   free(req);
+   ecore_con_url_free(ec_url);
+end:
+
+   close(fd);
+   ecore_con_url_shutdown();
+   ecore_con_shutdown();
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_con_url_headers_example.c b/src/examples/ecore_con_url_headers_example.c
new file mode 100644 (file)
index 0000000..fb05df3
--- /dev/null
@@ -0,0 +1,106 @@
+#include <stdio.h>
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+static Eina_Bool
+_url_data_cb(void *data, int type, void *event_info)
+{
+   Ecore_Con_Event_Url_Data *url_data = event_info;
+   int i;
+
+   for (i = 0; i < url_data->size; i++)
+     printf("%c", url_data->data[i]);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_url_complete_cb(void *data, int type, void *event_info)
+{
+   Ecore_Con_Event_Url_Complete *url_complete = event_info;
+   const Eina_List *headers, *l;
+   char *str;
+
+   printf("\n");
+   printf("download completed with status code: %d\n", url_complete->status);
+
+   headers = ecore_con_url_response_headers_get(url_complete->url_con);
+
+   EINA_LIST_FOREACH(headers, l, str)
+     printf("header: %s\n", str);
+
+   ecore_main_loop_quit();
+
+   return EINA_TRUE;
+}
+
+int
+main(int argc, const char *argv[])
+{
+   Ecore_Con_Url *ec_url = NULL;
+   const char *type;
+   Eina_Bool r;
+
+   if (argc < 3)
+     {
+        printf("need at least two parameters: < POST|GET >  <url1>\n");
+        return -1;
+     }
+
+   type = argv[1];
+
+   if (strcmp(type, "POST") && (strcmp(type, "GET")))
+     {
+        printf("only POST or GET are supported by this example.\n");
+        return -1;
+     }
+
+   ecore_init();
+   ecore_con_init();
+   ecore_con_url_init();
+
+   // check if requests are being pipelined, and set them if not:
+   if (!ecore_con_url_pipeline_get())
+     ecore_con_url_pipeline_set(EINA_TRUE);
+
+   ec_url = ecore_con_url_custom_new(argv[2], type);
+   if (!ec_url)
+     {
+        printf("error when creating ecore con url object.\n");
+        goto end;
+     }
+
+   ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA, _url_data_cb, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _url_complete_cb, NULL);
+
+   ecore_con_url_additional_header_add(ec_url, "User-Agent", "blablabla");
+   ecore_con_url_verbose_set(ec_url, EINA_TRUE);
+
+   ecore_con_url_httpauth_set(ec_url, "user", "password", EINA_FALSE);
+
+   ecore_con_url_time(ec_url, ECORE_CON_URL_TIME_IFMODSINCE, 0);
+
+   if (!strcmp(type, "GET"))
+     r = ecore_con_url_get(ec_url);
+   else
+     r = ecore_con_url_post(ec_url, NULL, 0, NULL);
+
+   if (!r)
+     {
+        printf("could not realize request.\n");
+        goto free_ec_url;
+     }
+
+   ecore_main_loop_begin();
+
+free_ec_url:
+   ecore_con_url_free(ec_url);
+end:
+   ecore_con_url_shutdown();
+   ecore_con_shutdown();
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_evas_basics_example.c b/src/examples/ecore_evas_basics_example.c
new file mode 100644 (file)
index 0000000..b62c64a
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+ * Ecore example illustrating the basics of ecore evas usage.
+ *
+ * You'll need at least one Evas engine built for it (excluding the
+ * buffer one). See stdout/stderr for output.
+ *
+ * @verbatim
+ * gcc -o ecore_evas_basics_example ecore_evas_basics_example.c `pkg-config --libs --cflags ecore-evas`
+ * @endverbatim
+ */
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <unistd.h>
+
+static Eina_Bool
+_stdin_cb(void *data, Ecore_Fd_Handler *handler)
+{
+   Eina_List *l;
+   Ecore_Evas *ee;
+   char c;
+
+   scanf("%c", &c);
+   if (c == 'h')
+     EINA_LIST_FOREACH(ecore_evas_ecore_evas_list_get(), l, ee)
+       ecore_evas_hide(ee);
+   else if (c == 's')
+     EINA_LIST_FOREACH(ecore_evas_ecore_evas_list_get(), l, ee)
+       ecore_evas_show(ee);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_on_delete(Ecore_Evas *ee)
+{
+   free(ecore_evas_data_get(ee, "key"));
+   ecore_main_loop_quit();
+}
+
+int
+main(void)
+{
+   Ecore_Evas *ee;
+   Evas *canvas;
+   Evas_Object *bg;
+   Eina_List *engines, *l;
+   char *data;
+
+   if (ecore_evas_init() <= 0)
+     return 1;
+
+   engines = ecore_evas_engines_get();
+   printf("Available engines:\n");
+   EINA_LIST_FOREACH(engines, l, data)
+     printf("%s\n", data);
+   ecore_evas_engines_free(engines);
+
+   ee = ecore_evas_new(NULL, 0, 0, 200, 200, NULL);
+   ecore_evas_title_set(ee, "Ecore Evas basics Example");
+   ecore_evas_show(ee);
+
+   data = malloc(sizeof(char) * 6);
+   sprintf(data, "%s", "hello");
+   ecore_evas_data_set(ee, "key", data);
+   ecore_evas_callback_delete_request_set(ee, _on_delete);
+
+   printf("Using %s engine!\n", ecore_evas_engine_name_get(ee));
+
+   canvas = ecore_evas_get(ee);
+   if (ecore_evas_ecore_evas_get(canvas) == ee)
+     printf("Everything is sane!\n");
+
+   bg = evas_object_rectangle_add(canvas);
+   evas_object_color_set(bg, 0, 0, 255, 255);
+   evas_object_resize(bg, 200, 200);
+   evas_object_show(bg);
+   ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE);
+
+   ecore_main_fd_handler_add(STDIN_FILENO, ECORE_FD_READ, _stdin_cb, NULL, NULL, NULL);
+
+   ecore_main_loop_begin();
+
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_evas_buffer_example_01.c b/src/examples/ecore_evas_buffer_example_01.c
new file mode 100644 (file)
index 0000000..a060a0a
--- /dev/null
@@ -0,0 +1,121 @@
+/**
+ * Simple Ecore_Evas example on the Evas buffer engine wrapper
+ * functions.
+ *
+ * You must have Evas compiled with the buffer engine.
+ *
+ * Compile with:
+ *
+ * @verbatim
+ * gcc -o evas-buffer-simple evas-buffer-simple.c `pkg-config --libs --cflags evas evas-software-buffer`
+ * @endverbatim
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+
+#include "config.h"
+#else
+#define __UNUSED__
+#endif
+
+#include <Ecore_Evas.h>
+#include <stdio.h>
+
+#define WIDTH  (320)
+#define HEIGHT (240)
+
+static Ecore_Evas *ee;
+
+/* support function to save scene as PPM image */
+static void
+_scene_save(Evas *canvas,
+            const char *dest)
+{
+   const unsigned int *pixels, *pixels_end;
+   int width, height;
+   FILE *f;
+
+   evas_output_size_get(canvas, &width, &height);
+
+   f = fopen(dest, "wb+");
+   if (!f)
+     {
+        fprintf(stderr, "ERROR: could not open for writing '%s': %s\n",
+                dest, strerror(errno));
+        return;
+     }
+
+   pixels = ecore_evas_buffer_pixels_get(ee);
+   pixels_end = pixels + (width * height);
+
+   /* PPM P6 format is dead simple to write: */
+   fprintf(f, "P6\n%d %d\n255\n", width, height);
+   for (; pixels < pixels_end; pixels++)
+     {
+        int r, g, b;
+
+        r = ((*pixels) & 0xff0000) >> 16;
+        g = ((*pixels) & 0x00ff00) >> 8;
+        b = (*pixels) & 0x0000ff;
+
+        fprintf(f, "%c%c%c", r, g, b);
+     }
+
+   fclose(f);
+   printf("Saved scene as '%s'\n", dest);
+}
+
+int
+main(void)
+{
+   Evas *canvas;
+   Evas_Object *bg, *r1, *r2, *r3;
+
+   ecore_evas_init();
+
+   ee = ecore_evas_buffer_new(WIDTH, HEIGHT);
+   if (!ee) goto error;
+
+   canvas = ecore_evas_get(ee);
+
+   bg = evas_object_rectangle_add(canvas);
+   evas_object_color_set(bg, 255, 255, 255, 255); /* white bg */
+   evas_object_move(bg, 0, 0); /* at origin */
+   evas_object_resize(bg, WIDTH, HEIGHT); /* covers full canvas */
+   evas_object_show(bg);
+
+   r1 = evas_object_rectangle_add(canvas);
+   evas_object_color_set(r1, 255, 0, 0, 255); /* 100% opaque red */
+   evas_object_move(r1, 10, 10);
+   evas_object_resize(r1, 100, 100);
+   evas_object_show(r1);
+
+   r2 = evas_object_rectangle_add(canvas);
+   evas_object_color_set(r2, 0, 128, 0, 128); /* 50% opaque green */
+   evas_object_move(r2, 10, 10);
+   evas_object_resize(r2, 50, 50);
+   evas_object_show(r2);
+
+   r3 = evas_object_rectangle_add(canvas);
+   evas_object_color_set(r3, 0, 128, 0, 255); /* 100% opaque dark green */
+   evas_object_move(r3, 60, 60);
+   evas_object_resize(r3, 50, 50);
+   evas_object_show(r3);
+
+   ecore_evas_manual_render(ee);
+   _scene_save(canvas, "/tmp/evas-buffer-simple-render.ppm");
+
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+
+   return 0;
+
+error:
+   fprintf(stderr, "You got to have at least one Evas engine built"
+                   " and linked up to ecore-evas for this example to run"
+                   " properly.\n");
+   ecore_evas_shutdown();
+   return -1;
+}
+
diff --git a/src/examples/ecore_evas_buffer_example_02.c b/src/examples/ecore_evas_buffer_example_02.c
new file mode 100644 (file)
index 0000000..360faa2
--- /dev/null
@@ -0,0 +1,126 @@
+/**
+ * Simple Ecore_Evas example on the Evas buffer engine wrapper
+ * functions.
+ *
+ * You must have Evas compiled with the buffer engine.
+ *
+ * Compile with:
+ *
+ * @verbatim
+ * gcc -o evas-buffer-simple evas-buffer-simple.c `pkg-config --libs --cflags evas evas-software-buffer`
+ * @endverbatim
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+
+#include "config.h"
+#else
+#define __UNUSED__
+#define PACKAGE_EXAMPLES_DIR "."
+#endif
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <stdio.h>
+
+#define WIDTH  (320)
+#define HEIGHT (240)
+
+static Ecore_Evas *ee;
+static const char *border_img_path = PACKAGE_EXAMPLES_DIR "/red.png";
+
+static void
+_on_destroy(Ecore_Evas *ee __UNUSED__)
+{
+   ecore_main_loop_quit();
+}
+
+int
+main(void)
+{
+   Evas *canvas, *sub_canvas;
+   Evas_Object *bg, *r1, *r2, *r3; /* "sub" canvas objects */
+   Evas_Object *border, *img; /* canvas objects */
+   Ecore_Evas *sub_ee;
+
+   ecore_evas_init();
+
+   /* this will give you a window with an Evas canvas under the first
+    * engine available */
+   ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
+   if (!ee) goto error;
+
+   ecore_evas_size_min_set(ee, WIDTH, HEIGHT);
+   ecore_evas_size_max_set(ee, WIDTH, HEIGHT);
+
+   ecore_evas_callback_delete_request_set(ee, _on_destroy);
+   ecore_evas_title_set(ee, "Ecore_Evas buffer (image) example");
+   ecore_evas_show(ee);
+
+   canvas = ecore_evas_get(ee);
+
+   bg = evas_object_rectangle_add(canvas);
+   evas_object_color_set(bg, 255, 255, 255, 255); /* white bg */
+   evas_object_move(bg, 0, 0); /* at origin */
+   evas_object_resize(bg, WIDTH, HEIGHT); /* covers full canvas */
+   evas_object_show(bg);
+
+   /* this is a border around the image containing a scene of another
+    * canvas */
+   border = evas_object_image_filled_add(canvas);
+   evas_object_image_file_set(border, border_img_path, NULL);
+   evas_object_image_border_set(border, 3, 3, 3, 3);
+   evas_object_image_border_center_fill_set(border, EVAS_BORDER_FILL_NONE);
+
+   evas_object_move(border, WIDTH / 6, HEIGHT / 6);
+   evas_object_resize(border, (2 * WIDTH) / 3, (2 * HEIGHT) / 3);
+   evas_object_show(border);
+
+   img = ecore_evas_object_image_new(ee);
+   evas_object_image_filled_set(img, EINA_TRUE);
+   evas_object_image_size_set(
+     img, ((2 * WIDTH) / 3) - 6, ((2 * HEIGHT) / 3) - 6);
+   sub_ee = ecore_evas_object_ecore_evas_get(img);
+   sub_canvas = ecore_evas_object_evas_get(img);
+
+   evas_object_move(img, (WIDTH / 6) + 3, (HEIGHT / 6) + 3);
+
+   /* apply the same size on both! */
+   evas_object_resize(img, ((2 * WIDTH) / 3) - 6, ((2 * HEIGHT) / 3) - 6);
+   ecore_evas_resize(sub_ee, ((2 * WIDTH) / 3) - 6, ((2 * HEIGHT) / 3) - 6);
+
+   r1 = evas_object_rectangle_add(sub_canvas);
+   evas_object_color_set(r1, 255, 0, 0, 255); /* 100% opaque red */
+   evas_object_move(r1, 10, 10);
+   evas_object_resize(r1, 100, 100);
+   evas_object_show(r1);
+
+   r2 = evas_object_rectangle_add(sub_canvas);
+   evas_object_color_set(r2, 0, 128, 0, 128); /* 50% opaque green */
+   evas_object_move(r2, 10, 10);
+   evas_object_resize(r2, 50, 50);
+   evas_object_show(r2);
+
+   r3 = evas_object_rectangle_add(sub_canvas);
+   evas_object_color_set(r3, 0, 128, 0, 255); /* 100% opaque dark green */
+   evas_object_move(r3, 60, 60);
+   evas_object_resize(r3, 50, 50);
+   evas_object_show(r3);
+
+   evas_object_show(img);
+   ecore_main_loop_begin();
+
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+
+   return 0;
+
+error:
+   fprintf(stderr, "You got to have at least one Evas engine built"
+                   " and linked up to ecore-evas for this example to run"
+                   " properly.\n");
+   ecore_evas_shutdown();
+   return -1;
+}
+
diff --git a/src/examples/ecore_evas_callbacks.c b/src/examples/ecore_evas_callbacks.c
new file mode 100644 (file)
index 0000000..3e42da1
--- /dev/null
@@ -0,0 +1,128 @@
+/**
+ * Ecore example illustrating ecore evas callbacks.
+ *
+ * You'll need at least one Evas engine built for it (excluding the
+ * buffer one). See stdout/stderr for output.
+ *
+ * @verbatim
+ * gcc -o ecore_evas_callbacks ecore_evas_callbacks.c `pkg-config --libs --cflags ecore-evas`
+ * @endverbatim
+ */
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+
+static void
+_destroy(Ecore_Evas *ee)
+{
+   printf("destroy\n");
+   ecore_main_loop_quit();
+}
+
+static void
+_delete(Ecore_Evas *ee)
+{
+   printf("delete\n");
+   ecore_main_loop_quit();
+}
+
+static void
+_focus_in(Ecore_Evas *ee)
+{
+   printf("focus_in\n");
+}
+
+static void
+_focus_out(Ecore_Evas *ee)
+{
+   printf("focus_out\n");
+}
+
+static void
+_hide(Ecore_Evas *ee)
+{
+   printf("hide\n");
+}
+
+static void
+_mouse_in(Ecore_Evas *ee)
+{
+   printf("mouse_in\n");
+}
+
+static void
+_show(Ecore_Evas *ee)
+{
+   printf("show\n");
+}
+
+static void
+_mouse_out(Ecore_Evas *ee)
+{
+   printf("mouse_out\n");
+}
+
+static void
+_move(Ecore_Evas *ee)
+{
+   printf("move\n");
+}
+
+static void
+_post_render(Ecore_Evas *ee)
+{
+   printf("post_render\n");
+}
+
+static void
+_pre_free(Ecore_Evas *ee)
+{
+   printf("pre_free\n");
+}
+
+static void
+_pre_render(Ecore_Evas *ee)
+{
+   printf("pre_render\n");
+}
+
+static void
+_resize(Ecore_Evas *ee)
+{
+   printf("resize\n");
+}
+
+int
+main(void)
+{
+   Ecore_Evas *ee;
+
+   ecore_evas_init();
+
+   ee = ecore_evas_new(NULL, 0, 0, 200, 100, NULL);
+   ecore_evas_title_set(ee, "Ecore Evas Callbacks Example");
+   ecore_evas_show(ee);
+
+   //callbacks
+   ecore_evas_callback_delete_request_set(ee, _delete);
+   ecore_evas_callback_destroy_set(ee, _destroy);
+   ecore_evas_callback_focus_in_set(ee, _focus_in);
+   ecore_evas_callback_focus_out_set(ee, _focus_out);
+   ecore_evas_callback_hide_set(ee, _hide);
+   ecore_evas_callback_mouse_in_set(ee, _mouse_in);
+   ecore_evas_callback_mouse_out_set(ee, _mouse_out);
+   ecore_evas_callback_move_set(ee, _move);
+   ecore_evas_callback_post_render_set(ee, _post_render);
+   ecore_evas_callback_pre_free_set(ee, _pre_free);
+   ecore_evas_callback_pre_render_set(ee, _pre_render);
+   ecore_evas_callback_resize_set(ee, _resize);
+   ecore_evas_callback_show_set(ee, _show);
+
+   ecore_main_loop_begin();
+
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_evas_ews_example.c b/src/examples/ecore_evas_ews_example.c
new file mode 100644 (file)
index 0000000..1209ffd
--- /dev/null
@@ -0,0 +1,269 @@
+/**
+ * Ecore example illustrating the ews of ecore evas usage.
+ *
+ * You'll need at least one Evas engine built for it (excluding the
+ * buffer one). See stdout/stderr for output.
+ *
+ * @verbatim
+ * gcc -o ecore_evas_ews_example ecore_evas_ews_example.c `pkg-config --libs --cflags ecore-evas`
+ * @endverbatim
+ */
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <ctype.h>
+
+static Eina_Bool
+_wm_win_add(void *data, int type, void *event_info)
+{
+   Ecore_Evas *ee = event_info;
+   printf("WM: new window=%p\n", ee);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_wm_win_move(void *data, int type, void *event_info)
+{
+   Ecore_Evas *ee = event_info;
+   int x, y;
+   ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
+   printf("WM: window=%p moved to %d,%d\n", ee, x, y);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_wm_win_resize(void *data, int type, void *event_info)
+{
+   Ecore_Evas *ee = event_info;
+   int w, h;
+   ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+   printf("WM: window=%p resized to %dx%d\n", ee, w, h);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_wm_win_show(void *data, int type, void *event_info)
+{
+   Ecore_Evas *ee = event_info;
+   printf("WM: show window=%p\n", ee);
+   return EINA_TRUE;
+}
+
+static void
+optional_ews_window_manager_setup(void)
+{
+   ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_ADD, _wm_win_add, NULL);
+   ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_MOVE, _wm_win_move, NULL);
+   ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_RESIZE, _wm_win_resize, NULL);
+   ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_SHOW, _wm_win_show, NULL);
+
+   /* one may use any known unique identifier, like an app function pointer */
+   ecore_evas_ews_manager_set(optional_ews_window_manager_setup);
+}
+
+static void
+optional_ews_setup(void)
+{
+   Evas_Object *bg;
+   Evas *e;
+
+   ecore_evas_ews_setup(0, 0, 800, 600); /* "screen" size */
+   e = ecore_evas_ews_evas_get(); /* forces "screen" to be allocated */
+
+   bg = evas_object_rectangle_add(e);
+   evas_object_color_set(bg, 128, 32, 32, 255);
+   ecore_evas_ews_background_set(bg);
+}
+
+static Eina_Bool
+_stdin_cb(void *data, Ecore_Fd_Handler *handler)
+{
+   const Eina_List *l;
+   Ecore_Evas *ee;
+   char c = getchar();
+
+   if (c == EOF)
+     {
+        ecore_main_loop_quit();
+        return EINA_FALSE;
+     }
+
+   switch (c) {
+      case 'h':
+        printf("hide all windows\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_hide(ee);
+        break;
+
+      case 's':
+        printf("show all windows\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_show(ee);
+        break;
+
+      case 'l':
+        printf("move all windows left\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          {
+             int x, y;
+             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
+             ecore_evas_move(ee, x - 10, y);
+          }
+        break;
+
+      case 'r':
+        printf("move all windows right\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          {
+             int x, y;
+             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
+             ecore_evas_move(ee, x + 10, y);
+          }
+        break;
+
+      case 't':
+        printf("move all windows top\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          {
+             int x, y;
+             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
+             ecore_evas_move(ee, x, y - 10);
+          }
+        break;
+
+      case 'b':
+        printf("move all windows bottom\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          {
+             int x, y;
+             ecore_evas_geometry_get(ee, &x, &y, NULL, NULL);
+             ecore_evas_move(ee, x, y + 10);
+          }
+        break;
+
+      case 'S':
+        printf("make all windows smaller\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          {
+             int w, h;
+             ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+             ecore_evas_resize(ee, w - 10, h - 10);
+          }
+        break;
+
+      case 'B':
+        printf("make all windows bigger\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          {
+             int w, h;
+             ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+             ecore_evas_resize(ee, w + 10, h + 10);
+          }
+        break;
+
+      case 'm':
+        printf("make all windows unmaximized\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_maximized_set(ee, EINA_FALSE);
+        break;
+
+      case 'M':
+        printf("make all windows maximized\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_maximized_set(ee, EINA_TRUE);
+        break;
+
+      case 'i':
+        printf("make all windows uniconified\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_iconified_set(ee, EINA_FALSE);
+        break;
+
+      case 'I':
+        printf("make all windows iconified\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_iconified_set(ee, EINA_TRUE);
+        break;
+
+      case 'f':
+        printf("make all windows unfullscreen\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_fullscreen_set(ee, EINA_FALSE);
+        break;
+
+      case 'F':
+        printf("make all windows fullscreen\n");
+        EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee)
+          ecore_evas_fullscreen_set(ee, EINA_TRUE);
+        break;
+
+      case 'q':
+        printf("quit\n");
+        ecore_main_loop_quit();
+        break;
+
+      default:
+        if (!isspace(c))
+          printf("Unknown command: %c\n", c);
+     }
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_on_delete(Ecore_Evas *ee)
+{
+   free(ecore_evas_data_get(ee, "key"));
+   ecore_main_loop_quit();
+}
+
+int
+main(void)
+{
+   Ecore_Evas *ee;
+   Evas *canvas;
+   Evas_Object *bg;
+
+   if (ecore_evas_init() <= 0)
+     return 1;
+
+   optional_ews_setup();
+   optional_ews_window_manager_setup();
+
+   /* everything should look similar to ecore_evas_basic_example */
+   ee = ecore_evas_ews_new(0, 0, 200, 200);
+   ecore_evas_title_set(ee, "Ecore Evas EWS Example");
+   ecore_evas_show(ee);
+
+   ecore_evas_data_set(ee, "key", strdup("hello"));
+   ecore_evas_callback_delete_request_set(ee, _on_delete);
+
+   printf("Using %s engine!\n", ecore_evas_engine_name_get(ee));
+
+   canvas = ecore_evas_get(ee);
+   if (ecore_evas_ecore_evas_get(canvas) == ee)
+     printf("Everything is sane!\n");
+
+   bg = evas_object_rectangle_add(canvas);
+   evas_object_color_set(bg, 0, 0, 255, 255);
+   evas_object_resize(bg, 200, 200);
+   evas_object_show(bg);
+   ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE);
+
+   /* moving the window should move it in the screen */
+   ecore_evas_move(ee, 50, 50);
+
+   ecore_main_fd_handler_add(STDIN_FILENO,
+                             ECORE_FD_READ | ECORE_FD_ERROR,
+                             _stdin_cb,
+                             NULL, NULL, NULL);
+
+   ecore_main_loop_begin();
+
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_evas_object_example.c b/src/examples/ecore_evas_object_example.c
new file mode 100644 (file)
index 0000000..38e4c4b
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * Ecore example illustrating ecore evas object usage.
+ *
+ * You'll need at least one Evas engine built for it (excluding the
+ * buffer one). See stdout/stderr for output.
+ *
+ * @verbatim
+ * gcc -o ecore_evas_object_example ecore_evas_object_example.c `pkg-config --libs --cflags ecore-evas`
+ * @endverbatim
+ */
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+
+int
+main(void)
+{
+   Ecore_Evas *ee;
+   Evas_Object *bg, *cursor, *obj;
+   int layer, x, y;
+
+   ecore_evas_init();
+
+   ee = ecore_evas_new(NULL, 0, 0, 200, 200, NULL);
+   ecore_evas_title_set(ee, "Ecore Evas Object Example");
+   ecore_evas_show(ee);
+
+   bg = evas_object_rectangle_add(ecore_evas_get(ee));
+   evas_object_color_set(bg, 0, 0, 255, 255);
+   evas_object_resize(bg, 200, 200);
+   evas_object_show(bg);
+   ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE);
+
+   if (bg == ecore_evas_object_associate_get(ee))
+     printf("Association worked!\n");
+
+   cursor = evas_object_rectangle_add(ecore_evas_get(ee));
+   evas_object_color_set(cursor, 0, 255, 0, 255);
+   evas_object_resize(cursor, 5, 10);
+   ecore_evas_object_cursor_set(ee, cursor, 0, 1, 1);
+
+   ecore_evas_cursor_get(ee, &obj, &layer, &x, &y);
+   if (obj == cursor && layer == 0 && x == 1 && y == 1)
+     printf("Set cursor worked!\n");
+
+   ecore_main_loop_begin();
+
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_evas_window_sizes_example.c b/src/examples/ecore_evas_window_sizes_example.c
new file mode 100644 (file)
index 0000000..ceb601c
--- /dev/null
@@ -0,0 +1,204 @@
+/**
+ * Simple @c Ecore_Evas example illustrating how to deal with window
+ * sizes
+ *
+ * You'll need at least one engine built for it (excluding the buffer
+ * one). See stdout/stderr for output.
+ *
+ * @verbatim
+ * gcc -o evas-smart-object evas-smart-object.c `pkg-config --libs --cflags evas ecore ecore-evas`
+ * @endverbatim
+ */
+
+#ifdef HAVE_CONFIG_H
+
+#include "config.h"
+#else
+#define __UNUSED__
+#endif
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+
+#define WIDTH  (300)
+#define HEIGHT (300)
+
+static Ecore_Evas *ee;
+static Evas_Object *text, *bg;
+static Eina_Bool min_set = EINA_FALSE;
+static Eina_Bool max_set = EINA_FALSE;
+static Eina_Bool base_set = EINA_FALSE;
+static Eina_Bool step_set = EINA_FALSE;
+
+static const char commands[] = \
+  "commands are:\n"
+  "\tm - impose a minumum size to the window\n"
+  "\tx - impose a maximum size to the window\n"
+  "\tb - impose a base size to the window\n"
+  "\ts - impose a step size (different than 1 px) to the window\n"
+  "\th - print help\n";
+
+/* to inform current window's size */
+static void
+_canvas_resize_cb(Ecore_Evas *ee)
+{
+   int w, h;
+   char buf[1024];
+
+   ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+   snprintf(buf, sizeof(buf), "%d x %d", w, h);
+   evas_object_text_text_set(text, buf);
+   evas_object_move(text, (w - 150) / 2, (h - 50) / 2);
+
+   evas_object_resize(bg, w, h);
+}
+
+static void
+_on_destroy(Ecore_Evas *ee __UNUSED__)
+{
+   ecore_main_loop_quit();
+}
+
+static void
+_on_keydown(void *data __UNUSED__,
+            Evas *evas __UNUSED__,
+            Evas_Object *o __UNUSED__,
+            void *einfo)
+{
+   Evas_Event_Key_Down *ev = einfo;
+
+   if (strcmp(ev->keyname, "h") == 0) /* print help */
+     {
+        fprintf(stdout, commands);
+        return;
+     }
+
+   if (strcmp(ev->keyname, "m") == 0) /* impose a minimum size on the window */
+     {
+        min_set = !min_set;
+
+        if (min_set)
+          {
+             ecore_evas_size_min_set(ee, WIDTH / 2, HEIGHT / 2);
+             fprintf(stdout, "Imposing a minimum size of %d x %d\n",
+                     WIDTH / 2, HEIGHT / 2);
+          }
+        else
+          {
+             ecore_evas_size_min_set(ee, 0, 0);
+             fprintf(stdout, "Taking off minimum size restriction from the"
+                             " window\n");
+          }
+        return;
+     }
+
+   if (strcmp(ev->keyname, "x") == 0) /* impose a maximum size on the window */
+     {
+        max_set = !max_set;
+
+        if (max_set)
+          {
+             ecore_evas_size_max_set(ee, WIDTH * 2, HEIGHT * 2);
+             fprintf(stdout, "Imposing a maximum size of %d x %d\n",
+                     WIDTH * 2, HEIGHT * 2);
+          }
+        else
+          {
+             ecore_evas_size_max_set(ee, 0, 0);
+             fprintf(stdout, "Taking off maximum size restriction from the"
+                             " window\n");
+          }
+        return;
+     }
+
+   if (strcmp(ev->keyname, "b") == 0) /* impose a base size on the window */
+     {
+        base_set = !base_set;
+
+        if (base_set)
+          {
+             ecore_evas_size_base_set(ee, WIDTH * 2, HEIGHT * 2);
+             fprintf(stdout, "Imposing a base size of %d x %d\n",
+                     WIDTH * 2, HEIGHT * 2);
+          }
+        else
+          {
+             ecore_evas_size_base_set(ee, 0, 0);
+             fprintf(stdout, "Taking off base size restriction from the"
+                             " window\n");
+          }
+        return;
+     }
+
+   if (strcmp(ev->keyname, "s") == 0) /* impose a step size on the window */
+     {
+        step_set = !step_set;
+
+        if (step_set)
+          {
+             ecore_evas_size_step_set(ee, 40, 40);
+             fprintf(stdout, "Imposing a step size of %d x %d\n", 40, 40);
+          }
+        else
+          {
+             ecore_evas_size_step_set(ee, 0, 0);
+             fprintf(stdout, "Taking off step size restriction from the"
+                             " window\n");
+          }
+        return;
+     }
+}
+
+int
+main(void)
+{
+   Evas *evas;
+
+   if (!ecore_evas_init())
+     return EXIT_FAILURE;
+
+   /* this will give you a window with an Evas canvas under the first
+    * engine available */
+   ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
+   if (!ee) goto error;
+
+   ecore_evas_callback_delete_request_set(ee, _on_destroy);
+   ecore_evas_title_set(ee, "Ecore_Evas window sizes example");
+   ecore_evas_callback_resize_set(ee, _canvas_resize_cb);
+   ecore_evas_show(ee);
+
+   evas = ecore_evas_get(ee);
+
+   bg = evas_object_rectangle_add(evas);
+   evas_object_color_set(bg, 255, 255, 255, 255);  /* white bg */
+   evas_object_move(bg, 0, 0);  /* at canvas' origin */
+   evas_object_resize(bg, WIDTH, HEIGHT);  /* covers full canvas */
+   evas_object_show(bg);
+
+   evas_object_focus_set(bg, EINA_TRUE);
+   evas_object_event_callback_add(
+     bg, EVAS_CALLBACK_KEY_DOWN, _on_keydown, NULL);
+
+   text = evas_object_text_add(evas);
+   evas_object_color_set(text, 0, 0, 0, 255);
+   evas_object_resize(text, 150, 50);
+   evas_object_text_font_set(text, "Sans", 20);
+   evas_object_show(text);
+
+   _canvas_resize_cb(ee);
+   fprintf(stdout, commands);
+   ecore_main_loop_begin();
+
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+
+   return 0;
+
+error:
+   fprintf(stderr, "You got to have at least one Evas engine built"
+                   " and linked up to ecore-evas for this example to run"
+                   " properly.\n");
+   ecore_evas_shutdown();
+   return -1;
+}
+
diff --git a/src/examples/ecore_event_example_01.c b/src/examples/ecore_event_example_01.c
new file mode 100644 (file)
index 0000000..64a5be8
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Compile with:
+ * gcc -g -Wall `pkg-config --cflags --libs ecore` -o ecore_event_example ecore_event_example.c
+ */
+
+#include <Ecore.h>
+
+static Eina_Bool
+_quitter(void *data, int ev_type, void *event)
+{
+   printf("Leaving already?\n");
+   ecore_main_loop_quit();
+   return ECORE_CALLBACK_DONE;
+}
+
+int
+main(int argc, char **argv)
+{
+   ecore_init();
+
+   ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, _quitter, NULL);
+   ecore_main_loop_begin();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_event_example_02.c b/src/examples/ecore_event_example_02.c
new file mode 100644 (file)
index 0000000..a8eccf3
--- /dev/null
@@ -0,0 +1,89 @@
+#include <Ecore.h>
+#include <unistd.h>
+
+struct context   // helper struct to give some context to the callbacks
+{
+   const char          *str1, *str2;
+   Ecore_Event_Handler *handler1;
+   Ecore_Event_Handler *handler2;
+};
+
+static _event_type = 0; // a new type of event will be defined and stored here
+
+static Eina_Bool
+_event_handler1_cb(void *data, int type, void *event)
+{
+   int *number = event;
+   const char *str = data;
+
+   printf("event_handler1: number=%d, data=\"%s\".\n", *number, str);
+
+   if ((*number % 2) == 0)
+     return ECORE_CALLBACK_DONE;
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_event_handler2_cb(void *data, int type, void *event) // event callback
+{
+   struct context *ctxt = data;
+   int *number = event;
+
+   printf("event_handler2: number=%d.\n", *number);
+
+   if (*number == 5)
+     {
+        const char *old = NULL;
+        old = ecore_event_handler_data_set(ctxt->handler1, (void *)ctxt->str2);
+        printf("changed handler1 data from \"%s\" to \"%s\".\n",
+               old, ctxt->str2);
+     }
+   else if (*number >= 10)
+     {
+        printf("finish main loop.\n");
+        ecore_main_loop_quit();
+     }
+
+   return ECORE_CALLBACK_DONE; // same as EINA_FALSE
+}
+
+int
+main(int argc, char **argv)
+{
+   struct context ctxt = {0};
+   int i;
+   ctxt.str1 = "dataone";
+   ctxt.str2 = "datatwo";
+
+   if (!ecore_init())
+     {
+        printf("ERROR: Cannot init Ecore!\n");
+        return -1;
+     }
+
+   _event_type = ecore_event_type_new();
+
+   ctxt.handler1 = ecore_event_handler_add(_event_type,
+                                           _event_handler1_cb,
+                                           ctxt.str1);
+   ctxt.handler2 = ecore_event_handler_add(_event_type,
+                                           _event_handler2_cb,
+                                           &ctxt);
+
+   for (i = 0; i <= 15; i++)
+     {
+        int *event_data = malloc(sizeof(*event_data));
+        *event_data = i;
+        ecore_event_add(_event_type, event_data, NULL, NULL);
+     }
+
+   printf("start the main loop.\n");
+
+   ecore_main_loop_begin();
+
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_exe_example.c b/src/examples/ecore_exe_example.c
new file mode 100644 (file)
index 0000000..8d0dedc
--- /dev/null
@@ -0,0 +1,100 @@
+/**
+   Compile with gcc -o ecore_exe_example ecore_exe_example.c `pkg-config --cflags --libs ecore`
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <Ecore.h>
+
+#define BUFFER_SIZE 1024
+
+static Eina_Bool
+_msg_from_child_handler(void *data, int type, void *event)
+{
+   Ecore_Exe_Event_Data *dataFromProcess = (Ecore_Exe_Event_Data *)event;
+   char msg[BUFFER_SIZE];
+
+   if (dataFromProcess->size >= (BUFFER_SIZE - 1))
+     {
+        fprintf(stdout, "Data too big for bugger. error\n");
+        return ECORE_CALLBACK_DONE;
+     }
+   
+   strncpy(msg, dataFromProcess->data, dataFromProcess->size);
+   msg[dataFromProcess->size] = 0;
+       
+   if (strcmp(msg, "quit") == 0)
+     {
+        fprintf(stdout, "My child said to me, QUIT!\n");
+        ecore_main_loop_quit();
+     }
+   else
+     fprintf(stdout, "I received a message from my child: %s\n", msg);
+
+   return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_sendMessage(void *data)
+{
+   static int numberOfMessages = 0;
+   Ecore_Exe *childHandle = (Ecore_Exe *)data;
+   char msg[BUFFER_SIZE];
+
+   sprintf(msg, " Message: %d\n", numberOfMessages);
+   numberOfMessages++;
+
+   if (ecore_exe_send(childHandle, msg, strlen(msg)) != EINA_TRUE)
+     fprintf(stderr, "Could not send my name to the child\n");
+   else
+     fprintf(stdout,
+             "I'm the father and I sent this message to the child: %s\n", msg);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(int argc, char **argv)
+{
+   pid_t childPid;
+   Ecore_Exe *childHandle;
+
+   if (!ecore_init())
+     goto exit;
+
+   childHandle = ecore_exe_pipe_run("./ecore_exe_example_child",
+                                    ECORE_EXE_PIPE_WRITE |
+                                    ECORE_EXE_PIPE_READ_LINE_BUFFERED |
+                                    ECORE_EXE_PIPE_READ, NULL);
+
+   if (childHandle == NULL)
+     {
+        fprintf(stderr, "Could not create a child process!\n");
+        goto ecore_shutdown;
+     }
+
+   childPid = ecore_exe_pid_get(childHandle);
+
+   if (childPid == -1)
+     fprintf(stderr, "Could not retrive the PID!\n");
+   else
+     fprintf(stdout, "The child process has PID:%d\n", childPid);
+
+   ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _msg_from_child_handler, NULL);
+   ecore_timer_add(1, _sendMessage, childHandle);
+
+   ecore_main_loop_begin();
+
+   ecore_exe_free(childHandle); //This will not affect the child process
+
+   ecore_shutdown();
+
+   return EXIT_SUCCESS;
+
+ecore_shutdown:
+   ecore_shutdown();
+
+exit:
+   return EXIT_FAILURE;
+}
+
diff --git a/src/examples/ecore_exe_example_child.c b/src/examples/ecore_exe_example_child.c
new file mode 100644 (file)
index 0000000..0d5b469
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+   Compile with gcc -o ecore_exe_example_child ecore_exe_example_child.c `pkg-config --cflags --libs ecore`
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <Ecore.h>
+
+#define BUFFER_SIZE 1024
+
+static Eina_Bool
+_fd_handler_cb(void *data, Ecore_Fd_Handler
+               *fd_handler)
+{
+   static int numberOfMessages = 0;
+   char message[BUFFER_SIZE];
+
+   fgets(message, BUFFER_SIZE, stdin);
+
+   numberOfMessages++;
+
+   if (numberOfMessages < 3)
+     {
+        fprintf(stdout, "My father sent this message to me:%s\n", message);
+        fflush(stdout);
+        return ECORE_CALLBACK_RENEW;
+     }
+   else
+     {
+        fprintf(stdout, "quit\n");
+        fflush(stdout);
+        ecore_main_loop_quit();
+        return ECORE_CALLBACK_DONE;
+     }
+}
+
+int
+main(int argc, char **argv)
+{
+   if (!ecore_init())
+     goto error;
+
+   ecore_main_fd_handler_add(STDIN_FILENO,
+                             ECORE_FD_READ,
+                             _fd_handler_cb,
+                             NULL, NULL, NULL);
+   ecore_main_loop_begin();
+
+   ecore_shutdown();
+
+   return EXIT_SUCCESS;
+
+error:
+   return EXIT_FAILURE;
+}
+
diff --git a/src/examples/ecore_fd_handler_example.c b/src/examples/ecore_fd_handler_example.c
new file mode 100644 (file)
index 0000000..381d101
--- /dev/null
@@ -0,0 +1,89 @@
+#include <Ecore.h>
+#include <unistd.h>
+
+struct context
+{
+   Ecore_Fd_Handler *handler;
+   Ecore_Timer      *timer;
+};
+
+static void
+_fd_prepare_cb(void *data, Ecore_Fd_Handler *handler)
+{
+   printf("prepare_cb called.\n");
+}
+
+static Eina_Bool
+_fd_handler_cb(void *data, Ecore_Fd_Handler *handler)
+{
+   struct context *ctxt = data;
+   char buf[1024];
+   size_t nbytes;
+   int fd;
+
+   if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR))
+     {
+        printf("An error has occurred. Stop watching this fd and quit.\n");
+        ecore_main_loop_quit();
+        ctxt->handler = NULL;
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   fd = ecore_main_fd_handler_fd_get(handler);
+   nbytes = read(fd, buf, sizeof(buf));
+   if (nbytes == 0)
+     {
+        printf("Nothing to read, exiting...\n");
+        ecore_main_loop_quit();
+        ctxt->handler = NULL;
+        return ECORE_CALLBACK_CANCEL;
+     }
+   buf[nbytes - 1] = '\0';
+
+   printf("Read %zd bytes from input: \"%s\"\n", nbytes - 1, buf);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_timer_cb(void *data)
+{
+   printf("Timer expired after 5 seconds...\n");
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(int argc, char **argv)
+{
+   struct context ctxt = {0};
+
+   if (!ecore_init())
+     {
+        printf("ERROR: Cannot init Ecore!\n");
+        return -1;
+     }
+
+   ctxt.handler = ecore_main_fd_handler_add(STDIN_FILENO,
+                                            ECORE_FD_READ | ECORE_FD_ERROR,
+                                            _fd_handler_cb,
+                                            &ctxt, NULL, NULL);
+   ecore_main_fd_handler_prepare_callback_set(ctxt.handler, _fd_prepare_cb, &ctxt);
+   ctxt.timer = ecore_timer_add(5, _timer_cb, &ctxt);
+
+   printf("Starting the main loop. Type anything and hit <enter> to "
+          "activate the fd_handler callback, or CTRL+d to shutdown.\n");
+
+   ecore_main_loop_begin();
+
+   if (ctxt.handler)
+     ecore_main_fd_handler_del(ctxt.handler);
+
+   if (ctxt.timer)
+     ecore_timer_del(ctxt.timer);
+
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_fd_handler_gnutls_example.c b/src/examples/ecore_fd_handler_gnutls_example.c
new file mode 100644 (file)
index 0000000..5635b13
--- /dev/null
@@ -0,0 +1,203 @@
+#include <Ecore.h>
+#include <fcntl.h>
+#include <netinet/tcp.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <unistd.h>
+#include <gnutls/gnutls.h>
+
+/* Ecore_Fd_Handler example
+ * 2010 Mike Blumenkrantz
+ * compile with gcc $(pkgconfig --cflags --libs gnutls ecore)
+ */
+
+#define print(...) fprintf(stderr, "line %i: ", __LINE__); fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n")
+
+static int done = 0;
+
+static void
+tls_log_func(int level, const char *str)
+{
+   fprintf(stderr, "|<%d>| %s", level, str);
+}
+
+static const char *
+SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_description_t status)
+{
+   switch (status)
+     {
+      case GNUTLS_HANDSHAKE_HELLO_REQUEST:
+        return "Hello request";
+
+      case GNUTLS_HANDSHAKE_CLIENT_HELLO:
+        return "Client hello";
+
+      case GNUTLS_HANDSHAKE_SERVER_HELLO:
+        return "Server hello";
+
+      case GNUTLS_HANDSHAKE_CERTIFICATE_PKT:
+        return "Certificate packet";
+
+      case GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE:
+        return "Server key exchange";
+
+      case GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST:
+        return "Certificate request";
+
+      case GNUTLS_HANDSHAKE_SERVER_HELLO_DONE:
+        return "Server hello done";
+
+      case GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY:
+        return "Certificate verify";
+
+      case GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE:
+        return "Client key exchange";
+
+      case GNUTLS_HANDSHAKE_FINISHED:
+        return "Finished";
+
+      case GNUTLS_HANDSHAKE_SUPPLEMENTAL:
+        return "Supplemental";
+     }
+   return NULL;
+}
+
+/* Connects to the peer and returns a socket
+ * descriptor.
+ */
+static int
+tcp_connect(void)
+{
+   const char *PORT = "443";
+   const char *SERVER = "69.58.181.89"; //verisign.com
+   int err, sd;
+   int flag = 1, curstate = 0;
+   struct sockaddr_in sa;
+
+   /* sets some fd options such as nonblock */
+   sd = socket(AF_INET, SOCK_STREAM, 0);
+   fcntl(sd, F_SETFL, O_NONBLOCK);
+   fcntl(sd, F_SETFD, FD_CLOEXEC);
+   setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate));
+
+   setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int));
+
+   memset(&sa, '\0', sizeof (sa));
+   sa.sin_family = AF_INET;
+   sa.sin_port = htons(atoi(PORT));
+   inet_pton(AF_INET, SERVER, &sa.sin_addr);
+
+   /* connects to server
+    */
+   err = connect(sd, (struct sockaddr *)&sa, sizeof (sa));
+   if ((err < 0) && (errno != EINPROGRESS))
+     {
+        print("Connect error\n");
+        exit(1);
+     }
+
+   return sd;
+}
+
+/* closes the given socket descriptor.
+ */
+static void
+tcp_close(int sd)
+{
+   shutdown(sd, SHUT_RDWR);     /* no more receptions */
+   close(sd);
+}
+
+static Eina_Bool
+_process_data(gnutls_session_t client, Ecore_Fd_Handler *fd_handler)
+{
+   static int ret, lastret;
+   static unsigned int count = 0;
+
+   if (!done)
+     {
+        lastret = ret;
+        ret = gnutls_handshake(client);
+        count++;
+        if (gnutls_record_get_direction(client))
+          ecore_main_fd_handler_active_set(fd_handler, ECORE_FD_WRITE);
+        else
+          ecore_main_fd_handler_active_set(fd_handler, ECORE_FD_READ);
+        /* avoid printing messages infinity times */
+        if (lastret != ret)
+          {
+             print("gnutls returned with: %s - %s", gnutls_strerror_name(ret), gnutls_strerror(ret));
+             if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED) || (ret == GNUTLS_E_FATAL_ALERT_RECEIVED))
+               print("Also received alert: %s", gnutls_alert_get_name(gnutls_alert_get(client)));
+             print("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(client)));
+             print("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(client)));
+          }
+
+        if (gnutls_error_is_fatal(ret))
+          {
+             print("yarrr this be an error!");
+             exit(1);
+          }
+     }
+   if (ret == GNUTLS_E_SUCCESS)
+     {
+        done = 1;
+        print("Handshake successful in %u handshake calls!", count);
+        ecore_main_loop_quit();
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(void)
+{
+   /* credentials */
+   gnutls_anon_client_credentials_t c_anoncred;
+   gnutls_certificate_credentials_t c_certcred;
+
+   gnutls_session_t client;
+   int sd;
+
+   /* General init. */
+   gnutls_global_init();
+   ecore_init();
+   gnutls_global_set_log_function(tls_log_func);
+   gnutls_global_set_log_level(6);
+
+   /* Init client */
+   gnutls_anon_allocate_client_credentials(&c_anoncred);
+   gnutls_certificate_allocate_credentials(&c_certcred);
+   gnutls_init(&client, GNUTLS_CLIENT);
+   /* set very specific priorities */
+   gnutls_priority_set_direct(client, "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0", NULL);
+   gnutls_credentials_set(client, GNUTLS_CRD_ANON, c_anoncred);
+   gnutls_credentials_set(client, GNUTLS_CRD_CERTIFICATE, c_certcred);
+   gnutls_server_name_set(client, GNUTLS_NAME_DNS, "www.verisign.com", strlen("www.verisign.com"));
+
+   /* connect to the peer
+    */
+   sd = tcp_connect();
+
+   /* associate gnutls with socket */
+   gnutls_transport_set_ptr(client, (gnutls_transport_ptr_t)sd);
+   /* add a callback for data being available for send/receive on socket */
+   if (!ecore_main_fd_handler_add(sd, ECORE_FD_READ | ECORE_FD_WRITE, (Ecore_Fd_Cb)_process_data, client, NULL, NULL))
+     {
+        print("could not create fd handler!");
+        exit(1);
+     }
+   /* begin main loop */
+   ecore_main_loop_begin();
+
+   gnutls_bye(client, GNUTLS_SHUT_RDWR);
+
+   gnutls_deinit(client);
+
+   tcp_close(sd);
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_file_download_example.c b/src/examples/ecore_file_download_example.c
new file mode 100644 (file)
index 0000000..42cff6c
--- /dev/null
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_File.h>
+
+/*
+ * ecore_file_download() example
+ *
+ * compile with:
+ * gcc ecore_file_download_example.c `pkg-config --libs --cflags ecore-file` \
+ *     -o ecore_file_download_example
+ *
+ */
+
+#define URL      "http://www.kernel.org/pub/linux/kernel/v1.0/linux-1.0.tar.gz"
+#define DST      "linux-1.0.tar.gz"
+#define DST_MIME "[x-gzip]linux-1.0.tar.gz"
+
+void
+completion_cb(void *data, const char *file, int status)
+{
+   printf("Done (status: %d)\n", status);
+   ecore_main_loop_quit();
+}
+
+int
+progress_cb(void *data, const char *file,
+            long int dltotal, long int dlnow,
+            long int ultotal, long int ulnow)
+{
+   printf("Progress: %ld/%ld\n", dlnow, dltotal);
+   return ECORE_FILE_PROGRESS_CONTINUE; //  continue the download
+}
+
+int
+main(void)
+{
+   double start;
+   Eina_Hash *headers;
+
+   eina_init();
+   ecore_init();
+   ecore_file_init();
+
+   if (ecore_file_exists(DST))
+     ecore_file_unlink(DST);
+
+   start = ecore_time_get();
+
+   if (ecore_file_download(URL, DST, completion_cb, progress_cb, NULL, NULL))
+     {
+        printf("Download started successfully:\n  URL: %s\n  DEST: %s\n", URL, DST);
+        ecore_main_loop_begin();
+        printf("\nTime elapsed: %f seconds\n", ecore_time_get() - start);
+        printf("Downloaded %lld bytes\n", ecore_file_size(DST));
+     }
+   else
+     {
+        printf("Error, can't start download\n");
+        goto done;
+     }
+
+   headers = eina_hash_string_small_new(NULL);
+   eina_hash_add(headers, "Content-type", "application/x-gzip");
+
+   if (ecore_file_download_full(URL, DST_MIME, completion_cb, progress_cb, NULL, NULL, headers))
+     {
+        printf("Download started successfully:\n  URL: %s\n  DEST: %s\n", URL, DST_MIME);
+        ecore_main_loop_begin();
+        printf("\nTime elapsed: %f seconds\n", ecore_time_get() - start);
+        printf("Downloaded %lld bytes\n", ecore_file_size(DST));
+     }
+   else
+     {
+        printf("Error, can't start download\n");
+        goto done;
+     }
+
+done:
+   if (headers) eina_hash_free(headers);
+   ecore_file_shutdown();
+   ecore_shutdown();
+   eina_shutdown();
+   return 0;
+}
+
diff --git a/src/examples/ecore_idler_example.c b/src/examples/ecore_idler_example.c
new file mode 100644 (file)
index 0000000..11b3397
--- /dev/null
@@ -0,0 +1,115 @@
+#include <Ecore.h>
+#include <unistd.h>
+
+struct context   // helper struct to give some context to the callbacks
+{
+   int                  count;
+   Ecore_Idle_Enterer  *enterer;
+   Ecore_Idler         *idler;
+   Ecore_Idle_Exiter   *exiter;
+   Ecore_Event_Handler *handler;
+   Ecore_Timer         *timer;
+};
+
+static _event_type = 0; // a new type of event will be defined and stored here
+
+static Eina_Bool
+_enterer_cb(void *data) // the idle enterer callback
+{
+   printf("IDLE ENTERER: Ecore entering in idle state.\n");
+
+   return ECORE_CALLBACK_RENEW; // same as EINA_TRUE
+}
+
+static Eina_Bool
+_exiter_cb(void *data) // the idle exiter callback
+{
+   printf("IDLE EXITER: Ecore exiting idle state.\n");
+
+   return ECORE_CALLBACK_RENEW; // same as EINA_TRUE
+}
+
+static Eina_Bool
+_idler_cb(void *data) // the idler callback - ran while the mainloop is idle
+{
+   struct context *ctxt = data;
+   printf("IDLER: executing idler callback while in idle state.\n");
+
+   ctxt->count++;
+
+   /* each 10 times that the callback gets called, generate an event that
+    * will wake up the main loop, triggering idle enterers, exiters, etc. */
+   if ((ctxt->count % 10) == 0)
+     ecore_event_add(_event_type, NULL, NULL, NULL);
+
+   return ECORE_CALLBACK_RENEW; // same as EINA_TRUE
+}
+
+static Eina_Bool
+_event_handler_cb(void *data, int type, void *event) // event callback
+{
+   struct context *ctxt = data;
+
+   printf("EVENT: processing callback for the event received.\n");
+
+   if (ctxt->count > 100)
+     {
+        ecore_idle_enterer_del(ctxt->enterer);
+        ecore_idle_exiter_del(ctxt->exiter);
+        ecore_idler_del(ctxt->idler);
+
+        ctxt->enterer = NULL;
+        ctxt->exiter = NULL;
+        ctxt->idler = NULL;
+
+        if (ctxt->timer)
+          {
+             ecore_timer_del(ctxt->timer);
+             ctxt->timer = NULL;
+          }
+
+        ecore_main_loop_quit();
+     }
+
+   return ECORE_CALLBACK_DONE; // same as EINA_FALSE
+}
+
+static Eina_Bool
+_timer_cb(void *data)
+{
+   struct context *ctxt = data;
+   printf("TIMER: timer callback called.\n");
+
+   if (ctxt->timer)
+     ctxt->timer = NULL;
+
+   return ECORE_CALLBACK_CANCEL; // same as EINA_FALSE
+}
+
+int
+main(int argc, char **argv)
+{
+   struct context ctxt = {0};
+
+   if (!ecore_init())
+     {
+        printf("ERROR: Cannot init Ecore!\n");
+        return -1;
+     }
+
+   _event_type = ecore_event_type_new();
+
+   ctxt.enterer = ecore_idle_enterer_add(_enterer_cb, &ctxt);
+   ctxt.exiter = ecore_idle_exiter_add(_exiter_cb, &ctxt);
+   ctxt.idler = ecore_idler_add(_idler_cb, &ctxt);
+   ctxt.handler = ecore_event_handler_add(_event_type,
+                                          _event_handler_cb,
+                                          &ctxt);
+   ctxt.timer = ecore_timer_add(0.0005, _timer_cb, &ctxt);
+
+   ecore_main_loop_begin();
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_imf_example.c b/src/examples/ecore_imf_example.c
new file mode 100644 (file)
index 0000000..c2d02a0
--- /dev/null
@@ -0,0 +1,571 @@
+/**
+ * Ecore example illustrating how to use ecore imf.
+ *
+ * @verbatim
+ * gcc -o ecore_imf_example ecore_imf_example.c `pkg-config --cflags --libs ecore evas ecore-evas ecore-imf ecore-imf-evas`
+ * @endverbatim
+ */
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <Ecore_IMF.h>
+#include <Ecore_IMF_Evas.h>
+#include <Evas.h>
+#include <stdio.h>
+
+typedef struct _Entry Entry;
+
+struct _Entry
+{
+   Evas_Object           *rect;
+   Evas_Object           *txt_obj;
+   Evas_Textblock_Style  *txt_style;
+   Evas_Textblock_Cursor *cursor;
+   Evas_Textblock_Cursor *preedit_start;
+   Evas_Textblock_Cursor *preedit_end;
+   Ecore_IMF_Context     *imf_context;
+   Eina_Bool              have_preedit : 1;
+};
+
+static void
+_mouse_up_cb(void *data, Evas *e, Evas_Object *o, void *event_info)
+{
+   Entry *en = data;
+   if (!en) return;
+
+   evas_object_focus_set(en->rect, EINA_TRUE);
+}
+
+static void
+_entry_focus_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Entry *en = data;
+   if (!en) return;
+
+   if (en->imf_context)
+     ecore_imf_context_focus_in(en->imf_context);
+}
+
+static void
+_entry_focus_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Entry *en = data;
+   if (!en) return;
+
+   if (en->imf_context)
+     {
+        ecore_imf_context_reset(en->imf_context);
+        ecore_imf_context_focus_out(en->imf_context);
+     }
+}
+
+static void
+_canvas_focus_in_cb(void *data, Evas *e, void *event_info)
+{
+   Evas_Object *obj = evas_focus_get(e);
+   if (obj)
+     _entry_focus_in_cb(obj, NULL, NULL, NULL);
+}
+
+static void
+_canvas_focus_out_cb(void *data, Evas *e, void *event_info)
+{
+   Evas_Object *obj = evas_focus_get(e);
+   if (obj)
+     _entry_focus_out_cb(obj, NULL, NULL, NULL);
+}
+
+static void
+_imf_cursor_info_set(Entry *en)
+{
+   Evas_Coord x, y, w, h;
+   Evas_Coord cx, cy, cw, ch; // cursor geometry
+   int cursor_pos; // cursor position in chars (Not bytes)
+
+   if (!en) return;
+
+   // get cursor geometry
+   evas_object_geometry_get(en->txt_obj, &x, &y, &w, &h);
+   evas_textblock_cursor_geometry_get(en->cursor, &cx, &cy, &cw, &ch, NULL, EVAS_TEXTBLOCK_CURSOR_BEFORE);
+
+   // get cursor position
+   cursor_pos = evas_textblock_cursor_pos_get(en->cursor);
+
+   ecore_imf_context_cursor_position_set(en->imf_context, cursor_pos);
+   ecore_imf_context_cursor_location_set(en->imf_context, x + cx, y + cy, cw, ch);
+}
+
+static void
+_preedit_del(Entry *en)
+{
+   if (!en || !en->have_preedit) return;
+   if (!en->preedit_start || !en->preedit_end) return;
+   if (!evas_textblock_cursor_compare(en->preedit_start, en->preedit_end)) return;
+
+   /* delete the preedit characters */
+   evas_textblock_cursor_range_delete(en->preedit_start, en->preedit_end);
+}
+
+static void
+_preedit_clear(Entry *en)
+{
+   if (en->preedit_start)
+     {
+        evas_textblock_cursor_free(en->preedit_start);
+        en->preedit_start = NULL;
+     }
+
+   if (en->preedit_end)
+     {
+        evas_textblock_cursor_free(en->preedit_end);
+        en->preedit_end = NULL;
+     }
+
+   en->have_preedit = EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos)
+{
+   /* This callback will be called when the Input Method Context module requests the surrounding context. */
+   Entry *en = data;
+   const char *str;
+
+   if (!en) return;
+
+   str = evas_object_textblock_text_markup_get(en->txt_obj);
+   *text = str ? strdup(str) : strdup("");
+
+   /* get the current position of cursor */
+   if (cursor_pos)
+     *cursor_pos = evas_textblock_cursor_pos_get(en->cursor);
+
+   return EINA_TRUE;
+}
+
+static void
+_ecore_imf_event_delete_surrounding_cb(void *data, Ecore_IMF_Context *ctx, void *event_info)
+{
+   /* called when the input method needs to delete all or part of the context surrounding the cursor */
+   Entry *en = data;
+   Ecore_IMF_Event_Delete_Surrounding *ev = event_info;
+   Evas_Textblock_Cursor *del_start, *del_end;
+   int cursor_pos;
+
+   if (!en) return;
+
+   cursor_pos = evas_textblock_cursor_pos_get(en->cursor);
+
+   del_start = evas_object_textblock_cursor_new(en->txt_obj);
+   evas_textblock_cursor_pos_set(del_start, cursor_pos + ev->offset);
+
+   del_end = evas_object_textblock_cursor_new(en->txt_obj);
+   evas_textblock_cursor_pos_set(del_end, cursor_pos + ev->offset + ev->n_chars);
+
+   /* implement function to delete character(s) from 'cursor_pos+ev->offset' cursor position to 'cursor_pos + ev->offset + ev->n_chars' */
+   evas_textblock_cursor_range_delete(del_start, del_end);
+
+   evas_textblock_cursor_free(del_start);
+   evas_textblock_cursor_free(del_end);
+}
+
+static void
+_ecore_imf_event_commit_cb(void *data, Ecore_IMF_Context *ctx, void *event_info)
+{
+   Entry *en = data;
+   char *commit_str = (char *)event_info;
+   if (!en) return;
+
+   /* delete preedit string */
+   _preedit_del(en);
+   _preedit_clear(en);
+
+   printf("commit string : %s\n", commit_str);
+
+   evas_object_textblock_text_markup_prepend(en->cursor, commit_str);
+
+   /* notify cursor information */
+   _imf_cursor_info_set(en);
+
+   return;
+}
+
+static void
+_ecore_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx, void *event_info)
+{
+   /* example how to get preedit string */
+   Entry *en = data;
+   char *preedit_string;
+   int cursor_pos;
+   Eina_List *attrs = NULL;
+   Eina_List *l;
+   Ecore_IMF_Preedit_Attr *attr;
+   Ecore_IMF_Context *imf_context = ctx;
+   int preedit_start_pos, preedit_end_pos;
+   int i;
+   Eina_Bool preedit_end_state = EINA_FALSE;
+
+   if (!en) return;
+
+   /* get preedit string, attributes */
+   ecore_imf_context_preedit_string_with_attributes_get(imf_context, &preedit_string, &attrs, &cursor_pos);
+   printf("preedit string : %s\n", preedit_string);
+
+   if (!strcmp(preedit_string, ""))
+     preedit_end_state = EINA_TRUE;
+
+   /* delete preedit */
+   _preedit_del(en);
+
+   preedit_start_pos = evas_textblock_cursor_pos_get(en->cursor);
+
+   /* insert preedit character(s) */
+   if (strlen(preedit_string) > 0)
+     {
+        if (attrs)
+          {
+             EINA_LIST_FOREACH(attrs, l, attr)
+               {
+                  if (attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB1) // style type
+                    {
+                       /* apply appropriate style such as underline */
+                    }
+                  else if (attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB2 || attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB3)
+                    {
+                       /* apply appropriate style such as underline */
+                    }
+               }
+
+             /* insert code to display preedit string in your editor */
+             evas_object_textblock_text_markup_prepend(en->cursor, preedit_string);
+          }
+     }
+
+   if (!preedit_end_state)
+     {
+        /* set preedit start cursor */
+        if (!en->preedit_start)
+          en->preedit_start = evas_object_textblock_cursor_new(en->txt_obj);
+        evas_textblock_cursor_copy(en->cursor, en->preedit_start);
+
+        /* set preedit end cursor */
+        if (!en->preedit_end)
+          en->preedit_end = evas_object_textblock_cursor_new(en->txt_obj);
+        evas_textblock_cursor_copy(en->cursor, en->preedit_end);
+
+        preedit_end_pos = evas_textblock_cursor_pos_get(en->cursor);
+
+        for (i = 0; i < (preedit_end_pos - preedit_start_pos); i++)
+          {
+             evas_textblock_cursor_char_prev(en->preedit_start);
+          }
+
+        en->have_preedit = EINA_TRUE;
+
+        /* set cursor position */
+        evas_textblock_cursor_pos_set(en->cursor, preedit_start_pos + cursor_pos);
+     }
+
+   /* notify cursor information */
+   _imf_cursor_info_set(en);
+
+   EINA_LIST_FREE(attrs, attr)
+     free(attr);
+
+   free(preedit_string);
+}
+
+static void
+_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Entry *en = data;
+   Evas_Event_Key_Down *ev = event_info;
+   Eina_Bool control, alt, shift;
+   Eina_Bool multiline;
+   Eina_Bool cursor_changed;
+   if (!en) return;
+   if (!ev->key) return;
+
+   if (en->imf_context)
+     {
+        Ecore_IMF_Event_Key_Down ecore_ev;
+        ecore_imf_evas_event_key_down_wrap(ev, &ecore_ev);
+        if (ecore_imf_context_filter_event(en->imf_context,
+                                           ECORE_IMF_EVENT_KEY_DOWN,
+                                           (Ecore_IMF_Event *)&ecore_ev))
+          return;
+     }
+
+   control = evas_key_modifier_is_set(ev->modifiers, "Control");
+   alt = evas_key_modifier_is_set(ev->modifiers, "Alt");
+   shift = evas_key_modifier_is_set(ev->modifiers, "Shift");
+
+   if ((!strcmp(ev->keyname, "Escape")) ||
+       (!strcmp(ev->keyname, "Return")) || (!strcmp(ev->keyname, "KP_Enter")))
+     ecore_imf_context_reset(en->imf_context);
+
+   if (!strcmp(ev->key, "BackSpace"))
+     {
+        if (evas_textblock_cursor_char_prev(en->cursor))
+          evas_textblock_cursor_char_delete(en->cursor);
+
+        return;
+     }
+   else if (!strcmp(ev->key, "Delete") ||
+            (!strcmp(ev->key, "KP_Delete") && !ev->string))
+     {
+        // FILLME
+     }
+   else if ((control) && (!strcmp(ev->key, "v")))
+     {
+        // ctrl + v
+        // FILLME
+     }
+   else if ((control) && (!strcmp(ev->key, "a")))
+     {
+        // ctrl + a
+        // FILLME
+     }
+   else if ((control) && (!strcmp(ev->key, "A")))
+     {
+        // ctrl + A
+        // FILLME
+     }
+   else if ((control) && ((!strcmp(ev->key, "c") || (!strcmp(ev->key, "Insert")))))
+     {
+        // ctrl + c
+        // FILLME
+     }
+   else if ((control) && ((!strcmp(ev->key, "x") || (!strcmp(ev->key, "m")))))
+     {
+        // ctrl + x
+        // FILLME
+     }
+   else if ((control) && (!strcmp(ev->key, "z")))
+     {
+        // ctrl + z (undo)
+        // FILLME
+     }
+   else if ((control) && (!strcmp(ev->key, "y")))
+     {
+        // ctrl + y (redo)
+        // FILLME
+     }
+   else if ((!strcmp(ev->key, "Return")) || (!strcmp(ev->key, "KP_Enter")))
+     {
+        // FILLME
+     }
+   else
+     {
+        if (ev->string)
+          {
+             printf("key down string : %s\n", ev->string);
+             evas_object_textblock_text_markup_prepend(en->cursor, ev->string);
+          }
+     }
+
+   /* notify cursor information */
+   _imf_cursor_info_set(en);
+}
+
+static void
+_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Entry *en = data;
+   Evas_Event_Key_Up *ev = event_info;
+
+   if (!en) return;
+
+   if (en->imf_context)
+     {
+        Ecore_IMF_Event_Key_Up ecore_ev;
+
+        ecore_imf_evas_event_key_up_wrap(ev, &ecore_ev);
+        if (ecore_imf_context_filter_event(en->imf_context,
+                                           ECORE_IMF_EVENT_KEY_UP,
+                                           (Ecore_IMF_Event *)&ecore_ev))
+          return;
+     }
+}
+
+static void
+create_input_field(Evas *evas, Entry *en, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
+{
+   if (!en) return;
+
+   /* create background for text input field */
+   en->rect = evas_object_rectangle_add(evas);
+   evas_object_color_set(en->rect, 150, 150, 150, 255); /* gray */
+   evas_object_move(en->rect, x, y);
+   evas_object_resize(en->rect, w, h);
+   evas_object_show(en->rect);
+
+   /* create text object for displaying text */
+   en->txt_obj = evas_object_textblock_add(evas);
+   evas_object_color_set(en->txt_obj, 0, 0, 0, 255);
+   evas_object_pass_events_set(en->txt_obj, EINA_TRUE);
+   evas_object_move(en->txt_obj, x, y);
+   evas_object_resize(en->txt_obj, w, h);
+   evas_object_show(en->txt_obj);
+
+   /* set style on textblock */
+   static const char *style_buf =
+     "DEFAULT='font=Sans font_size=30 color=#000 text_class=entry'"
+     "newline='br'"
+     "b='+ font=Sans:style=bold'";
+   en->txt_style = evas_textblock_style_new();
+   evas_textblock_style_set(en->txt_style, style_buf);
+   evas_object_textblock_style_set(en->txt_obj, en->txt_style);
+
+   /* create cursor */
+   en->cursor = evas_object_textblock_cursor_new(en->txt_obj);
+
+   /* create input context */
+   const char *default_id = ecore_imf_context_default_id_get();
+   if (!default_id)
+     return;
+
+   en->imf_context = ecore_imf_context_add(default_id);
+   ecore_imf_context_client_window_set(en->imf_context, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
+   ecore_imf_context_client_canvas_set(en->imf_context, evas);
+
+   evas_object_event_callback_add(en->rect, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, en);
+   evas_object_event_callback_add(en->rect, EVAS_CALLBACK_KEY_UP, _key_up_cb, en);
+   evas_object_event_callback_add(en->rect, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, en);
+   evas_object_event_callback_add(en->rect, EVAS_CALLBACK_FOCUS_IN, _entry_focus_in_cb, en);
+   evas_object_event_callback_add(en->rect, EVAS_CALLBACK_FOCUS_OUT, _entry_focus_out_cb, en);
+
+   en->have_preedit = EINA_FALSE;
+   en->preedit_start = NULL;
+   en->preedit_end = NULL;
+
+   /* register retrieve surrounding callback */
+   ecore_imf_context_retrieve_surrounding_callback_set(en->imf_context, _ecore_imf_retrieve_surrounding_cb, en);
+
+   /* register commit event callback */
+   ecore_imf_context_event_callback_add(en->imf_context, ECORE_IMF_CALLBACK_COMMIT, _ecore_imf_event_commit_cb, en);
+
+   /* register preedit changed event handler */
+   ecore_imf_context_event_callback_add(en->imf_context, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, _ecore_imf_event_preedit_changed_cb, en);
+
+   /* register surrounding delete event callback */
+   ecore_imf_context_event_callback_add(en->imf_context, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, _ecore_imf_event_delete_surrounding_cb, en);
+}
+
+static void
+delete_input_field(Entry *en)
+{
+   if (!en) return;
+
+   if (en->rect)
+     {
+        evas_object_del(en->rect);
+        en->rect = NULL;
+     }
+
+   if (en->cursor)
+     {
+        evas_textblock_cursor_free(en->cursor);
+        en->cursor = NULL;
+     }
+
+   if (en->preedit_start)
+     {
+        evas_textblock_cursor_free(en->preedit_start);
+        en->preedit_start = NULL;
+     }
+
+   if (en->preedit_end)
+     {
+        evas_textblock_cursor_free(en->preedit_end);
+        en->preedit_end = NULL;
+     }
+
+   if (en->txt_obj)
+     {
+        evas_object_del(en->txt_obj);
+        en->txt_obj = NULL;
+     }
+
+   if (en->txt_style)
+     {
+        evas_textblock_style_free(en->txt_style);
+        en->txt_style = NULL;
+     }
+
+   if (en->imf_context)
+     {
+        ecore_imf_context_del(en->imf_context);
+        en->imf_context = NULL;
+     }
+}
+
+int
+main(int argc, char *argv[])
+{
+   Ecore_Evas *ee;
+   Evas *evas;
+   Entry en1, en2;
+
+   if (!ecore_evas_init())
+     {
+        fprintf(stderr, "failed to call ecore_evas_init()\n");
+        return EXIT_FAILURE;
+     }
+
+   ecore_imf_init();
+
+   // create a new window, with size=480x800 and default engine
+   ee = ecore_evas_new(NULL, 0, 0, 480, 800, NULL);
+
+   if (!ee)
+     {
+        fprintf(stderr, "failed to call ecore_evas_new\n");
+        return EXIT_FAILURE;
+     }
+
+   ecore_evas_show(ee);
+
+   // get the canvas off just-created window
+   evas = ecore_evas_get(ee);
+   if (!evas)
+     {
+        fprintf(stderr, "failed to ccall ecore_evas_get\n");
+        return EXIT_FAILURE;
+     }
+
+   // create input field rectangle
+   Evas_Object *bg = evas_object_rectangle_add(evas);
+   evas_object_move(bg, 0, 0);
+   evas_object_resize(bg, 480, 800);
+   evas_object_color_set(bg, 255, 255, 255, 255);
+   evas_object_show(bg);
+
+   evas_event_callback_add(evas, EVAS_CALLBACK_CANVAS_FOCUS_IN, _canvas_focus_in_cb, NULL);
+   evas_event_callback_add(evas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, _canvas_focus_out_cb, NULL);
+
+   // create input field 1
+   create_input_field(evas, &en1, 40, 60, 400, 80);
+
+   // create input field 2
+   create_input_field(evas, &en2, 40, 180, 400, 80);
+
+   // give focus to input field 1
+   evas_object_focus_set(en1.rect, EINA_TRUE);
+
+   ecore_main_loop_begin(); // begin mainloop
+
+   delete_input_field(&en1); // delete input field 1
+   delete_input_field(&en2); // delete input field 2
+
+   evas_event_callback_del_full(evas, EVAS_CALLBACK_CANVAS_FOCUS_IN, _canvas_focus_in_cb, NULL);
+   evas_event_callback_del_full(evas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, _canvas_focus_out_cb, NULL);
+
+   ecore_evas_free(ee);
+
+   ecore_imf_shutdown();
+   ecore_evas_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_job_example.c b/src/examples/ecore_job_example.c
new file mode 100644 (file)
index 0000000..561a851
--- /dev/null
@@ -0,0 +1,50 @@
+#include <Ecore.h>
+#include <unistd.h>
+
+static void
+_job_print_cb(void *data)
+{
+   char *str = data;
+
+   printf("%s\n", str);
+}
+
+static void
+_job_quit_cb(void *data)
+{
+   ecore_main_loop_quit();
+}
+
+int
+main(int argc, char **argv)
+{
+   Ecore_Job *job1, *job2, *job3, *job_quit;
+   char *str1 = "Job 1 started.";
+   char *str2 = "Job 2 started.";
+   char *str3 = "Job 3 started.";
+
+   if (!ecore_init())
+     {
+        printf("ERROR: Cannot init Ecore!\n");
+        return -1;
+     }
+
+   job1 = ecore_job_add(_job_print_cb, str1);
+   job2 = ecore_job_add(_job_print_cb, str2);
+   job3 = ecore_job_add(_job_print_cb, str3);
+
+   job_quit = ecore_job_add(_job_quit_cb, NULL);
+   printf("Created jobs 1, 2, 3 and quit.\n");
+
+   if (job2)
+     {
+        char *str;
+        str = ecore_job_del(job2);
+        job2 = NULL;
+        printf("Deleted job 2. Its data was: \"%s\"\n", str);
+     }
+
+   ecore_main_loop_begin();
+   ecore_shutdown();
+}
+
diff --git a/src/examples/ecore_pipe_gstreamer_example.c b/src/examples/ecore_pipe_gstreamer_example.c
new file mode 100644 (file)
index 0000000..072aade
--- /dev/null
@@ -0,0 +1,190 @@
+#include <gst/gst.h>
+#include <Ecore.h>
+
+static int nbr = 0;
+
+static GstElement *_buid_pipeline(gchar *filename, Ecore_Pipe *pipe);
+
+static void        new_decoded_pad_cb(GstElement *demuxer,
+                                      GstPad *new_pad,
+                                      gpointer user_data);
+
+static void
+handler(void *data, void *buf, unsigned int len)
+{
+   GstBuffer *buffer = *((GstBuffer **)buf);
+
+   printf("handler : %p\n", buffer);
+   printf("frame  : %d %p %lld %p\n", nbr++, data, (long long)GST_BUFFER_DURATION(buffer), buffer);
+   gst_buffer_unref(buffer);
+}
+
+static void
+handoff(GstElement *object,
+        GstBuffer *arg0,
+        GstPad *arg1,
+        gpointer user_data)
+{
+   Ecore_Pipe *pipe;
+
+   pipe = (Ecore_Pipe *)user_data;
+   printf("handoff : %p\n", arg0);
+   gst_buffer_ref(arg0);
+   ecore_pipe_write(pipe, &arg0, sizeof(arg0));
+}
+
+int
+main(int argc, char *argv[])
+{
+   GstElement *pipeline;
+   char *filename;
+   Ecore_Pipe *pipe;
+
+   gst_init(&argc, &argv);
+
+   if (!ecore_init())
+     {
+        gst_deinit();
+        return 0;
+     }
+
+   pipe = ecore_pipe_add(handler);
+   if (!pipe)
+     {
+        ecore_shutdown();
+        gst_deinit();
+        return 0;
+     }
+
+   if (argc < 2)
+     {
+        g_print("usage: %s file.avi\n", argv[0]);
+        ecore_pipe_del(pipe);
+        ecore_shutdown();
+        gst_deinit();
+        return 0;
+     }
+   filename = argv[1];
+
+   pipeline = _buid_pipeline(filename, pipe);
+   if (!pipeline)
+     {
+        g_print("Error during the pipeline building\n");
+        ecore_pipe_del(pipe);
+        ecore_shutdown();
+        gst_deinit();
+        return -1;
+     }
+
+   gst_element_set_state(pipeline, GST_STATE_PLAYING);
+
+   ecore_main_loop_begin();
+
+   ecore_pipe_del(pipe);
+   ecore_shutdown();
+   gst_deinit();
+
+   return 0;
+}
+
+static void
+new_decoded_pad_cb(GstElement *demuxer,
+                   GstPad *new_pad,
+                   gpointer user_data)
+{
+   GstElement *decoder;
+   GstPad *pad;
+   GstCaps *caps;
+   gchar *str;
+
+   caps = gst_pad_get_caps(new_pad);
+   str = gst_caps_to_string(caps);
+
+   if (g_str_has_prefix(str, "video/"))
+     {
+        decoder = GST_ELEMENT(user_data);
+
+        pad = gst_element_get_pad(decoder, "sink");
+        if (GST_PAD_LINK_FAILED(gst_pad_link(new_pad, pad)))
+          {
+             g_warning("Failed to link %s:%s to %s:%s", GST_DEBUG_PAD_NAME(new_pad),
+                       GST_DEBUG_PAD_NAME(pad));
+          }
+     }
+   g_free(str);
+   gst_caps_unref(caps);
+}
+
+static GstElement
+_buid_pipeline(gchar *filename, Ecore_Pipe *pipe)
+{
+   GstElement *pipeline;
+   GstElement *filesrc;
+   GstElement *demuxer;
+   GstElement *decoder;
+   GstElement *sink;
+   GstStateChangeReturn res;
+
+   pipeline = gst_pipeline_new("pipeline");
+   if (!pipeline)
+     return NULL;
+
+   filesrc = gst_element_factory_make("filesrc", "filesrc");
+   if (!filesrc)
+     {
+        printf("no filesrc");
+        goto failure;
+     }
+   g_object_set(G_OBJECT(filesrc), "location", filename, NULL);
+
+   demuxer = gst_element_factory_make("oggdemux", "demuxer");
+   if (!demuxer)
+     {
+        printf("no demux");
+        goto failure;
+     }
+
+   decoder = gst_element_factory_make("theoradec", "decoder");
+   if (!decoder)
+     {
+        printf("no dec");
+        goto failure;
+     }
+
+   g_signal_connect(demuxer, "pad-added",
+                    G_CALLBACK(new_decoded_pad_cb), decoder);
+
+   sink = gst_element_factory_make("fakesink", "sink");
+   if (!sink)
+     {
+        printf("no sink");
+        goto failure;
+     }
+   g_object_set(G_OBJECT(sink), "sync", EINA_TRUE, NULL);
+   g_object_set(G_OBJECT(sink), "signal-handoffs", EINA_TRUE, NULL);
+   g_signal_connect(sink, "handoff",
+                    G_CALLBACK(handoff), pipe);
+
+   gst_bin_add_many(GST_BIN(pipeline),
+                    filesrc, demuxer, decoder, sink, NULL);
+
+   if (!gst_element_link(filesrc, demuxer))
+     goto failure;
+   if (!gst_element_link(decoder, sink))
+     goto failure;
+
+   res = gst_element_set_state(pipeline, GST_STATE_PAUSED);
+   if (res == GST_STATE_CHANGE_FAILURE)
+     goto failure;
+
+   res = gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+   if (res != GST_STATE_CHANGE_SUCCESS)
+     goto failure;
+
+   return pipeline;
+
+failure:
+   gst_object_unref(GST_OBJECT(pipeline));
+   return NULL;
+}
+
diff --git a/src/examples/ecore_pipe_simple_example.c b/src/examples/ecore_pipe_simple_example.c
new file mode 100644 (file)
index 0000000..67bd4e7
--- /dev/null
@@ -0,0 +1,67 @@
+//Compile with:
+//gcc -g -Wall `pkg-config --cflags --libs ecore` -o ecore_pipe_simple_example ecore_pipe_simple_example.c
+
+#include <unistd.h>
+#include <Ecore.h>
+
+static void
+do_lengthy_task(Ecore_Pipe *pipe)
+{
+   int i, j;
+   char *buffer;
+   for (i = 0; i < 20; i++)
+     {
+        sleep(1);
+        buffer = malloc(sizeof(char) * i);
+        for (j = 0; j < i; j++)
+          buffer[j] = 'a' + j;
+        ecore_pipe_write(pipe, buffer, i);
+        free(buffer);
+     }
+   ecore_pipe_write(pipe, "close", 5);
+}
+
+static void
+handler(void *data, void *buf, unsigned int len)
+{
+   char *str = malloc(sizeof(char) * len + 1);
+   memcpy(str, buf, len);
+   str[len] = '\0';
+   printf("received %d bytes\n", len);
+   printf("content: %s\n", (const char *)str);
+   free(str);
+   if (len && !strncmp(buf, "close", len < 5 ? len : 5))
+     {
+        printf("close requested\n");
+        ecore_main_loop_quit();
+     }
+}
+
+int
+main(int argc, char *argv[])
+{
+   Ecore_Pipe *pipe;
+   pid_t child_pid;
+
+   ecore_init();
+
+   pipe = ecore_pipe_add(handler, NULL);
+
+   child_pid = fork();
+   if (!child_pid)
+     {
+        ecore_pipe_read_close(pipe);
+        do_lengthy_task(pipe);
+     }
+   else
+     {
+        ecore_pipe_write_close(pipe);
+        ecore_main_loop_begin();
+     }
+
+   ecore_pipe_del(pipe);
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_poller_example.c b/src/examples/ecore_poller_example.c
new file mode 100644 (file)
index 0000000..0e246de
--- /dev/null
@@ -0,0 +1,49 @@
+#include <Ecore.h>
+#include <unistd.h>
+
+static double _initial_time = 0;
+
+static Eina_Bool
+_poller_print_cb(void *data)
+{
+   char *str = data;
+   printf("Ecore Poller '%s' callback called after %0.3f seconds.\n",
+          str, ecore_time_get() - _initial_time);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(int argc, char **argv)
+{
+   double interval = 0.3; // tick each 0.3 seconds
+   Ecore_Poller *poller1, *poller2;
+   char *str1 = "poller1";
+   char *str2 = "poller2";
+
+   if (!ecore_init())
+     {
+        printf("ERROR: Cannot init Ecore!\n");
+        return -1;
+     }
+
+   _initial_time = ecore_time_get();
+
+   ecore_poller_poll_interval_set(ECORE_POLLER_CORE, interval);
+
+   poller1 = ecore_poller_add(ECORE_POLLER_CORE, 4, _poller_print_cb, str1);
+   poller2 = ecore_poller_add(ECORE_POLLER_CORE, 8, _poller_print_cb, str2);
+
+   ecore_main_loop_begin();
+
+   printf("changing poller2 interval to 16\n");
+
+   ecore_poller_poller_interval_set(poller2, 16);
+   ecore_main_loop_begin();
+
+   ecore_poller_del(poller1);
+   ecore_poller_del(poller2);
+
+   ecore_shutdown();
+}
+
diff --git a/src/examples/ecore_server_bench.c b/src/examples/ecore_server_bench.c
new file mode 100644 (file)
index 0000000..1f9b63a
--- /dev/null
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+/* Ecore_Con server example
+ * 2010 Mike Blumenkrantz
+ */
+
+static Ecore_Con_Server *svr;
+static int add;
+static int del;
+
+Eina_Bool
+_add(void *data, int type, Ecore_Con_Event_Client_Add *ev)
+{
+   ++add;
+//   printf ("%s ", ecore_con_client_ip_get(ev->client));
+   printf("Client #%i!\n", add);
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data, int type, Ecore_Con_Event_Client_Del *ev)
+{
+   ++del;
+   printf("Disconnected #%i!\n", del);
+   if (add == del)
+     ecore_main_loop_quit();
+   return ECORE_CALLBACK_RENEW;
+}
+
+int
+main(int argc, const char *argv[])
+{
+   ecore_init();
+   ecore_con_init();
+   ecore_app_args_set(argc, argv);
+   eina_log_domain_level_set("ecore_con", EINA_LOG_LEVEL_ERR);
+   eina_log_domain_level_set("eina", EINA_LOG_LEVEL_ERR);
+
+/* to use a PEM certificate with TLS and SSL3, uncomment the lines below */
+//   if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_NODELAY | ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT, "127.0.0.1", 8080, NULL)))
+
+/* to use simple tcp with ssl/tls, use this line */
+   svr = ecore_con_server_add(ECORE_CON_REMOTE_NODELAY, "127.0.0.1", 8080, NULL);
+   if (!svr)
+     exit(1);
+
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL);
+   ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL);
+
+/* start server */
+   ecore_main_loop_begin();
+   if (add && del)
+     {
+        printf("Restarting server after %i connections\n", add);
+        add = del = 0;
+        ecore_con_server_del(svr);
+        ecore_app_restart();
+     }
+   return 0;
+}
+
diff --git a/src/examples/ecore_thread_example.c b/src/examples/ecore_thread_example.c
new file mode 100644 (file)
index 0000000..f02d007
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * gcc -o ecore_thread_example ecore_thread_example.c `pkg-config --cflags --libs ecore`
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <Ecore.h>
+#include <Ecore_Getopt.h>
+
+typedef struct
+{
+   Ecore_Thread  *thread_3;
+   int            msgs_received;
+   int            max_msgs;
+   Eina_Lock      mutex;
+   Eina_Condition condition;
+} App_Data;
+
+typedef struct
+{
+   Eina_List *list;
+} Thread_Data;
+
+typedef struct
+{
+   char     *name;
+   char     *base;
+   Eina_Lock mutex;
+} Feedback_Thread_Data;
+
+typedef struct
+{
+   int        all_done;
+   Eina_List *list;
+} App_Msg;
+
+static void
+_local_data_free(void *data)
+{
+   Thread_Data *td = data;
+   char *str;
+
+   EINA_LIST_FREE(td->list, str)
+     {
+        printf("Freeing string: %s\n", str);
+        free(str);
+     }
+   free(td);
+}
+
+static void
+_short_job(void *data, Ecore_Thread *th)
+{
+   Thread_Data *td;
+   int i;
+
+   td = ecore_thread_local_data_find(th, "data");
+   if (!td)
+     {
+        td = calloc(1, sizeof(Thread_Data));
+        if (!td)
+          {
+             ecore_thread_cancel(th);
+             return;
+          }
+        ecore_thread_local_data_add(th, "data", td, _local_data_free,
+                                    EINA_FALSE);
+     }
+
+   for (i = 0; i < 10; i++)
+     {
+        char buf[200];
+
+        if (ecore_thread_check(th))
+          {
+             ecore_thread_local_data_del(th, "data");
+             break;
+          }
+
+        snprintf(buf, sizeof(buf), "Thread %p: String number %d", th, i);
+        td->list = eina_list_append(td->list, strdup(buf));
+        sleep(1);
+     }
+}
+
+static void
+_feedback_job(void *data, Ecore_Thread *th)
+{
+   time_t t;
+   int i, count;
+   Feedback_Thread_Data *ftd = NULL;
+   DIR *dir;
+   App_Msg *msg;
+
+   count = (int)ecore_thread_global_data_find("count");
+   for (i = 0; i < count; i++)
+     {
+        char buf[32];
+        snprintf(buf, sizeof(buf), "data%d", i);
+        ftd = ecore_thread_global_data_find(buf);
+        if (!ftd)
+          continue;
+        if (eina_lock_take_try(&ftd->mutex))
+          break;
+        else
+          ftd = NULL;
+     }
+   if (!ftd)
+     return;
+
+   dir = opendir(ftd->base);
+   if (!dir)
+     goto the_end;
+
+   msg = calloc(1, sizeof(App_Msg));
+
+   t = time(NULL);
+   while (time(NULL) < t + 2)
+     {
+        struct dirent entry, *result;
+
+        if (readdir_r(dir, &entry, &result))
+          break;
+        if (!result)
+          break;
+
+        if (strlen(result->d_name) >= 10)
+          msg->list = eina_list_append(msg->list,
+                                       strdup(result->d_name));
+     }
+
+   closedir(dir);
+   ecore_thread_feedback(th, msg);
+
+the_end:
+   ecore_thread_global_data_del(ftd->name);
+   free(ftd->name);
+   free(ftd->base);
+   eina_lock_release(&ftd->mutex);
+   eina_lock_free(&ftd->mutex);
+   free(ftd);
+   ecore_thread_reschedule(th);
+}
+
+static void
+_out_of_pool_job(void *data, Ecore_Thread *th)
+{
+   App_Data *ad = data;
+   App_Msg *msg;
+
+   while (1)
+     {
+        int msgs;
+        eina_condition_wait(&ad->condition);
+        msgs = ad->msgs_received;
+        eina_lock_release(&ad->mutex);
+        if (msgs == ad->max_msgs)
+          {
+             msg = calloc(1, sizeof(App_Msg));
+             msg->all_done = 1;
+             ecore_thread_feedback(th, msg);
+             return;
+          }
+     }
+}
+
+static void
+_print_status(void)
+{
+   int active, pending_total, pending_feedback, pending_short, available;
+
+   active = ecore_thread_active_get();
+   pending_total = ecore_thread_pending_total_get();
+   pending_feedback = ecore_thread_pending_feedback_get();
+   pending_short = ecore_thread_pending_get();
+   available = ecore_thread_available_get();
+
+   printf("Status:\n\t* Active threads: %d\n"
+          "\t* Available threads: %d\n"
+          "\t* Pending short jobs: %d\n"
+          "\t* Pending feedback jobs: %d\n"
+          "\t* Pending total: %d\n", active, available, pending_short,
+          pending_feedback, pending_total);
+}
+
+static void
+_feedback_job_msg_cb(void *data, Ecore_Thread *th, void *msg_data)
+{
+   App_Data *ad = data;
+   App_Msg *msg = msg_data;
+   char *str;
+
+   if (msg->all_done)
+     {
+        ecore_main_loop_quit();
+        free(msg);
+        return;
+     }
+
+   _print_status();
+
+   if (!msg->list)
+     printf("Received an empty list from thread %p\n", th);
+   else
+     {
+        int i = 0;
+        printf("Received %d elements from threads %p (printing first 5):\n",
+               eina_list_count(msg->list), th);
+        EINA_LIST_FREE(msg->list, str)
+          {
+             if (i <= 5)
+               printf("\t%s\n", str);
+             free(str);
+             i++;
+          }
+     }
+
+   eina_lock_take(&ad->mutex);
+   ad->msgs_received++;
+   eina_condition_signal(&ad->condition);
+   eina_lock_release(&ad->mutex);
+
+   free(msg);
+}
+
+static void
+_thread_end_cb(void *data, Ecore_Thread *th)
+{
+   App_Data *ad = data;
+
+   printf("Normal termination for thread %p.\n", th);
+   if (th == ad->thread_3)
+     ad->thread_3 = NULL;
+}
+
+static void
+_thread_cancel_cb(void *data, Ecore_Thread *th)
+{
+   App_Data *ad = data;
+
+   printf("Thread %p got cancelled.\n", th);
+   if (th == ad->thread_3)
+     ad->thread_3 = NULL;
+}
+
+static Eina_Bool
+_cancel_timer_cb(void *data)
+{
+   App_Data *ad = data;
+
+   if (ad->thread_3 && !ecore_thread_check(ad->thread_3))
+     ecore_thread_cancel(ad->thread_3);
+
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_status_timer_cb(void *data)
+{
+   _print_status();
+
+   return EINA_TRUE;
+}
+
+static const Ecore_Getopt optdesc = {
+   "ecore_thread_example",
+   NULL,
+   "0.0",
+   "(C) 2011 Enlightenment",
+   "Public domain?",
+   "Example program for Ecore_Thread",
+   0,
+   {
+      ECORE_GETOPT_STORE_INT('t', "threads", "Max number of threads to run"),
+      ECORE_GETOPT_STORE_INT('m', "msgs", "Max number of messages to receive"),
+      ECORE_GETOPT_APPEND_METAVAR('p', "path", "Add path for feedback job",
+                                  "STRING", ECORE_GETOPT_TYPE_STR),
+      ECORE_GETOPT_HELP('h', "help"),
+      ECORE_GETOPT_SENTINEL
+   }
+};
+
+int
+main(int argc, char *argv[])
+{
+   int i, max_threads = 0, max_msgs = 0;
+   Eina_Bool opt_quit = EINA_FALSE;
+   Eina_List *path_list = NULL;
+   App_Data appdata;
+   Ecore_Getopt_Value values[] = {
+      ECORE_GETOPT_VALUE_INT(max_threads),
+      ECORE_GETOPT_VALUE_INT(max_msgs),
+      ECORE_GETOPT_VALUE_LIST(path_list),
+      ECORE_GETOPT_VALUE_BOOL(opt_quit),
+      ECORE_GETOPT_VALUE_NONE
+   };
+
+   ecore_init();
+
+   i = ecore_thread_max_get();
+   printf("Initial max threads: %d\n", i);
+
+   memset(&appdata, 0, sizeof(App_Data));
+   appdata.max_msgs = 1;
+
+   if (ecore_getopt_parse(&optdesc, values, argc, argv) < 0)
+     {
+        printf("Argument parsing failed\n");
+        return 1;
+     }
+
+   if (opt_quit)
+     return 0;
+
+   if (max_threads)
+     {
+        ecore_thread_max_set(max_threads);
+        printf("Max threads: %d\n", ecore_thread_max_get());
+     }
+   if (max_msgs)
+     appdata.max_msgs = max_msgs;
+
+   if (!path_list)
+     {
+        Feedback_Thread_Data *ftd;
+        ecore_thread_global_data_add("count", (void *)3, NULL, EINA_FALSE);
+        ftd = calloc(1, sizeof(Feedback_Thread_Data));
+        ftd->name = strdup("data0");
+        ftd->base = strdup("/usr/bin");
+        eina_lock_new(&ftd->mutex);
+        ecore_thread_global_data_add(ftd->name, ftd, NULL, EINA_TRUE);
+        ftd = calloc(1, sizeof(Feedback_Thread_Data));
+        ftd->name = strdup("data1");
+        ftd->base = strdup("/usr/lib");
+        eina_lock_new(&ftd->mutex);
+        ecore_thread_global_data_add(ftd->name, ftd, NULL, EINA_TRUE);
+        ftd = calloc(1, sizeof(Feedback_Thread_Data));
+        ftd->name = strdup("data2");
+        ftd->base = strdup("/usr/share");
+        eina_lock_new(&ftd->mutex);
+        ecore_thread_global_data_add(ftd->name, ftd, NULL, EINA_TRUE);
+     }
+   else
+     {
+        Feedback_Thread_Data *ftd;
+        char *str;
+        ecore_thread_global_data_add("count",
+                                     (void *)eina_list_count(path_list), NULL,
+                                     EINA_FALSE);
+        i = 0;
+        EINA_LIST_FREE(path_list, str)
+          {
+             char buf[32];
+             snprintf(buf, sizeof(buf), "data%d", i);
+             ftd = calloc(1, sizeof(Feedback_Thread_Data));
+             ftd->name = strdup(buf);
+             ftd->base = strdup(str);
+             eina_lock_new(&ftd->mutex);
+             ecore_thread_global_data_add(ftd->name, ftd, NULL, EINA_TRUE);
+             free(str);
+             i++;
+          }
+     }
+
+   eina_lock_new(&appdata.mutex);
+   eina_condition_new(&appdata.condition, &appdata.mutex);
+
+   ecore_thread_feedback_run(_out_of_pool_job, _feedback_job_msg_cb, NULL,
+                             NULL, &appdata, EINA_TRUE);
+
+   ecore_thread_run(_short_job, _thread_end_cb, _thread_cancel_cb, &appdata);
+   ecore_thread_feedback_run(_feedback_job, _feedback_job_msg_cb,
+                             _thread_end_cb, _thread_cancel_cb, &appdata,
+                             EINA_FALSE);
+   appdata.thread_3 = ecore_thread_run(_short_job, _thread_end_cb,
+                                       _thread_cancel_cb, &appdata);
+   ecore_thread_feedback_run(_feedback_job, _feedback_job_msg_cb,
+                             _thread_end_cb, _thread_cancel_cb, &appdata,
+                             EINA_FALSE);
+
+   ecore_timer_add(1.0, _cancel_timer_cb, &appdata);
+   ecore_timer_add(2.0, _status_timer_cb, NULL);
+
+   _print_status();
+
+   ecore_main_loop_begin();
+
+   eina_condition_free(&appdata.condition);
+   eina_lock_free(&appdata.mutex);
+
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/ecore_time_functions_example.c b/src/examples/ecore_time_functions_example.c
new file mode 100644 (file)
index 0000000..d742c8b
--- /dev/null
@@ -0,0 +1,34 @@
+#include <Ecore.h>
+#include <unistd.h>
+
+static Eina_Bool
+_timer_cb(void *data)
+{
+   printf("ecore time: %0.3f\n", ecore_time_get());
+   printf("loop time: %0.3f\n", ecore_loop_time_get());
+   printf("unix time: %0.3f\n", ecore_time_unix_get());
+   printf("\nSleep for 1 second...\n\n");
+   sleep(1);
+   printf("ecore time: %0.3f\n", ecore_time_get());
+   printf("loop time: %0.3f\n", ecore_loop_time_get());
+   printf("unix time: %0.3f\n", ecore_time_unix_get());
+
+   ecore_main_loop_quit();
+
+   return EINA_FALSE;
+}
+
+int
+main(int argc, char **argv)
+{
+   if (!ecore_init())
+     {
+        printf("ERROR: Cannot init Ecore!\n");
+        return -1;
+     }
+
+   ecore_timer_add(0.1, _timer_cb, NULL);
+   ecore_main_loop_begin();
+   ecore_shutdown();
+}
+
diff --git a/src/examples/ecore_timer_example.c b/src/examples/ecore_timer_example.c
new file mode 100644 (file)
index 0000000..bafeacb
--- /dev/null
@@ -0,0 +1,187 @@
+#include <Ecore.h>
+#include <unistd.h>
+
+#define TIMEOUT_1 1.0 // interval for timer1
+#define TIMEOUT_2 3.0 // timer2 - delay timer1
+#define TIMEOUT_3 8.2 // timer3 - pause timer1
+#define TIMEOUT_4 11.0 // timer4 - resume timer1
+#define TIMEOUT_5 14.0 // timer5 - change interval of timer1
+#define TIMEOUT_6 18.0 // top timer1 and start timer7 and timer8 with changed precision
+#define TIMEOUT_7 1.1 // interval for timer7
+#define TIMEOUT_8 1.2 // interval for timer8
+#define DELAY_1   3.0 // delay time for timer1 - used by timer2
+#define INTERVAL1 2.0 // new interval for timer1 - used by timer5
+
+static double _initial_time = 0;
+
+struct context   // helper struct to give some context to the callbacks
+{
+   Ecore_Timer *timer1;
+   Ecore_Timer *timer2;
+   Ecore_Timer *timer3;
+   Ecore_Timer *timer4;
+   Ecore_Timer *timer5;
+   Ecore_Timer *timer6;
+   Ecore_Timer *timer7;
+   Ecore_Timer *timer8;
+};
+
+static double
+_get_current_time(void)
+{
+   return ecore_time_get() - _initial_time;
+}
+
+static Eina_Bool
+_timer1_cb(void *data)
+{
+   printf("Timer1 expired after %0.3f seconds.\n", _get_current_time());
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_timer2_cb(void *data)
+{
+   struct context *ctxt = data;
+   printf("Timer2 expired after %0.3f seconds. "
+          "Adding delay of %0.3f seconds to timer1.\n",
+          _get_current_time(), DELAY_1);
+
+   ecore_timer_delay(ctxt->timer1, DELAY_1);
+
+   ctxt->timer2 = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_timer3_cb(void *data)
+{
+   struct context *ctxt = data;
+   printf("Timer3 expired after %0.3f seconds. "
+          "Freezing timer1.\n", _get_current_time());
+
+   ecore_timer_freeze(ctxt->timer1);
+
+   ctxt->timer3 = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_timer4_cb(void *data)
+{
+   struct context *ctxt = data;
+   printf("Timer4 expired after %0.3f seconds. "
+          "Resuming timer1, which has %0.3f seconds left to expire.\n",
+          _get_current_time(), ecore_timer_pending_get(ctxt->timer1));
+
+   ecore_timer_thaw(ctxt->timer1);
+
+   ctxt->timer4 = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_timer5_cb(void *data)
+{
+   struct context *ctxt = data;
+   double interval = ecore_timer_interval_get(ctxt->timer1);
+
+   printf("Timer5 expired after %0.3f seconds. "
+          "Changing interval of timer1 from %0.3f to %0.3f seconds.\n",
+          _get_current_time(), interval, INTERVAL1);
+
+   ecore_timer_interval_set(ctxt->timer1, INTERVAL1);
+
+   ctxt->timer5 = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_timer7_cb(void *data)
+{
+   struct context *ctxt = data;
+   printf("Timer7 expired after %0.3f seconds.\n", _get_current_time());
+
+   ctxt->timer7 = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_timer8_cb(void *data)
+{
+   struct context *ctxt = data;
+   printf("Timer8 expired after %0.3f seconds.\n", _get_current_time());
+
+   ctxt->timer8 = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_timer6_cb(void *data)
+{
+   struct context *ctxt = data;
+   printf("Timer6 expired after %0.3f seconds.\n", _get_current_time());
+
+   printf("Stopping timer1.\n");
+
+   ecore_timer_del(ctxt->timer1);
+   ctxt->timer1 = NULL;
+
+   printf("Starting timer7 (%0.3fs) and timer8 (%0.3fs).\n",
+          TIMEOUT_7, TIMEOUT_8);
+
+   ctxt->timer7 = ecore_timer_add(TIMEOUT_7, _timer7_cb, ctxt);
+   ctxt->timer8 = ecore_timer_add(TIMEOUT_8, _timer8_cb, ctxt);
+
+   ecore_timer_precision_set(0.2);
+
+   ctxt->timer6 = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+int
+main(int argc, char **argv)
+{
+   struct context ctxt = {0};
+
+   if (!ecore_init())
+     {
+        printf("ERROR: Cannot init Ecore!\n");
+        return -1;
+     }
+
+   _initial_time = ecore_time_get();
+
+   ctxt.timer1 = ecore_timer_add(TIMEOUT_1, _timer1_cb, &ctxt);
+   ctxt.timer2 = ecore_timer_add(TIMEOUT_2, _timer2_cb, &ctxt);
+   ctxt.timer3 = ecore_timer_add(TIMEOUT_3, _timer3_cb, &ctxt);
+   ctxt.timer4 = ecore_timer_add(TIMEOUT_4, _timer4_cb, &ctxt);
+   ctxt.timer5 = ecore_timer_add(TIMEOUT_5, _timer5_cb, &ctxt);
+   ctxt.timer6 = ecore_timer_add(TIMEOUT_6, _timer6_cb, &ctxt);
+
+   printf("start the main loop.\n");
+
+   ecore_main_loop_begin();
+
+   if (ctxt.timer1)
+     ecore_timer_del(ctxt.timer1);
+   if (ctxt.timer2)
+     ecore_timer_del(ctxt.timer2);
+   if (ctxt.timer3)
+     ecore_timer_del(ctxt.timer3);
+   if (ctxt.timer4)
+     ecore_timer_del(ctxt.timer4);
+   if (ctxt.timer5)
+     ecore_timer_del(ctxt.timer5);
+   if (ctxt.timer6)
+     ecore_timer_del(ctxt.timer6);
+   if (ctxt.timer7)
+     ecore_timer_del(ctxt.timer7);
+   if (ctxt.timer8)
+     ecore_timer_del(ctxt.timer8);
+
+   ecore_shutdown();
+
+   return 0;
+}
+
diff --git a/src/examples/red.png b/src/examples/red.png
new file mode 100644 (file)
index 0000000..dd03528
Binary files /dev/null and b/src/examples/red.png differ
index 67efd6c..d43ad75 100644 (file)
@@ -1,19 +1,75 @@
 ## Process this file with automake to produce Makefile.in
-SUBDIRS = \
-ecore \
-ecore_job \
-ecore_txt \
-ecore_fb \
-ecore_directfb \
-ecore_con \
-ecore_x \
-ecore_win32 \
-ecore_wince \
-ecore_sdl \
-ecore_ipc \
-ecore_evas \
-ecore_config \
-ecore_file \
-ecore_desktop \
-ecore_imf \
-ecore_imf_evas
+MAINTAINERCLEANFILES = Makefile.in
+SUBDIRS = ecore
+
+if BUILD_ECORE_INPUT
+SUBDIRS += ecore_input
+endif
+
+if BUILD_ECORE_INPUT_EVAS
+SUBDIRS += ecore_input_evas
+endif
+
+if BUILD_ECORE_FB
+SUBDIRS += ecore_fb
+endif
+
+if BUILD_ECORE_DIRECTFB
+SUBDIRS += ecore_directfb
+endif
+
+if BUILD_ECORE_CON
+SUBDIRS += ecore_con
+endif
+
+if BUILD_ECORE_X
+SUBDIRS += ecore_x
+endif
+
+if BUILD_ECORE_WIN32
+SUBDIRS += ecore_win32
+endif
+
+if BUILD_ECORE_WINCE
+SUBDIRS += ecore_wince
+endif
+
+if BUILD_ECORE_SDL
+SUBDIRS += ecore_sdl
+endif
+
+if BUILD_ECORE_PSL1GHT
+SUBDIRS += ecore_psl1ght
+endif
+
+if BUILD_ECORE_COCOA
+SUBDIRS += ecore_cocoa
+endif
+
+if BUILD_ECORE_WAYLAND
+SUBDIRS += ecore_wayland
+endif
+
+if BUILD_ECORE_IPC
+SUBDIRS += ecore_ipc
+endif
+
+if BUILD_ECORE_EVAS
+SUBDIRS += ecore_evas
+endif
+
+if BUILD_ECORE_CONFIG
+SUBDIRS += ecore_config
+endif
+
+if BUILD_ECORE_FILE
+SUBDIRS += ecore_file
+endif
+
+if BUILD_ECORE_IMF
+SUBDIRS += ecore_imf
+endif
+
+if BUILD_ECORE_IMF_EVAS
+SUBDIRS += ecore_imf_evas
+endif
index b79a9cd..d47c24d 100644 (file)
@@ -1,6 +1,333 @@
+/**
+   @brief Ecore Library Public API Calls
+
+   These routines are used for Ecore Library interaction
+ */
+
+/**
+
+   @mainpage Ecore
+
+   @version 1.7
+   @date 2000-2012
+
+   Please see the @ref authors page for contact details.
+
+   @section intro Introduction
+
+   Ecore is a library of convenience functions. A brief explanation of how to use
+   it can be found in @ref Ecore_Main_Loop_Page.
+
+   The Ecore library provides the following modules:
+   @li @ref Ecore_Main_Loop_Group
+   @li @ref Ecore_File_Group
+   @li @ref Ecore_Con_Group
+   @li @ref Ecore_Evas_Group
+   @li @ref Ecore_FB_Group
+   @li @ref Ecore_IMF_Lib_Group
+   @li @ref Ecore_IMF_Context_Group
+   @li @ref Ecore_IMF_Context_Module_Group
+   @li @ref Ecore_IMF_Evas_Group
+   @li @link Ecore_Ipc.h    Ecore_IPC - Inter Process Communication functions. @endlink
+   @li @link Ecore_X.h      Ecore_X - X Windows System wrapper. @endlink
+   @li @ref Ecore_Win32_Group
+   @li @ref Ecore_WinCE_Group
+
+   For more info on Ecore usage, there are these @ref Examples.
+
+   @section compiling How to compile using Ecore?
+   pkgconfig (.pc) files are installed for every ecore module.
+   Thus, to compile using any of them, you can use something like the following:
+
+@verbatim
+gcc *.c $(pkg-config ecore ecore-$x ecore-$y [...] --cflags --libs)
+@endverbatim
+
+   @section install How is it installed?
+
+   Suggested configure options for ecore for a Linux desktop X display
+   with OpenGL and Software support, communication (networking) and
+   IPC (inter process communication):
+
+@verbatim
+./configure \
+    --enable-ecore-con \
+    --enable-ecore-ipc \
+    --enable-ecore-file \
+    --enable-ecore-input \
+    --enable-ecore-input-evas \
+    --enable-ecore-x \
+    --enable-ecore-evas \
+    --enable-ecore-evas-software-buffer \
+    --enable-ecore-evas-software-x11 \
+    --enable-ecore-evas-opengl-x11
+make
+sudo make install
+@endverbatim
+
+ */
+
+/**
+   @page authors Authors
+   @author Carsten Haitzler <raster@rasterman.com>
+   @author Tom Gilbert <tom@linuxbrit.co.uk>
+   @author Burra <burra@colorado.edu>
+   @author Chris Ross <chris@darkrock.co.uk>
+   @author Term <term@twistedpath.org>
+   @author Tilman Sauerbeck <tilman@code-monkey.de>
+   @author Ibukun Olumuyiwa <ibukun@computer.org>
+   @author Yuri <da2001@hotmail.ru>
+   @author Nicholas Curran <quasar@bigblue.net.au>
+   @author Howell Tam <pigeon@pigeond.net>
+   @author Nathan Ingersoll <rbdpngn@users.sourceforge.net>
+   @author Andrew Elcock <andy@elcock.org>
+   @author Kim Woelders <kim@woelders.dk>
+   @author Sebastian Dransfeld <sebastid@tango.flipp.net>
+   @author Simon Poole <simon.armlinux@themalago.net>
+   @author Jorge Luis Zapata Muga <jorgeluis.zapata@gmail.com>
+   @author dan sinclair <zero@everburning.com>
+   @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
+   @author David 'onefang' Seikel <onefang@gmail.com>
+   @author Hisham 'CodeWarrior' Mardam Bey <hisham@hisham.cc>
+   @author Brian 'rephorm' Mattern <rephorm@rephorm.com>
+   @author Tim Horton <hortont424@gmail.com>
+   @author Arnaud de Turckheim 'quarium' <quarium@gmail.com>
+   @author Matt Barclay <mbarclay@gmail.com>
+   @author Peter Wehrfritz <peter.wehrfritz@web.de>
+   @author Albin "Lutin" Tonnerre <albin.tonnerre@gmail.com>
+   @author Vincent Torri <vincent.torri@gmail.com>
+   @author Lars Munch <lars@segv.dk>
+   @author Andre Dieb <andre.dieb@gmail.com>
+   @author Mathieu Taillefumier <mathieu.taillefumier@free.fr>
+   @author Rui Miguel Silva Seabra <rms@1407.org>
+   @author Samsung Electronics
+   @author Samsung SAIT
+   @author Nicolas Aguirre <aguirre.nicolas@gmail.com>
+   @author Brett Nash <nash@nash.id.au>
+   @author Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
+   @author Leif Middelschulte <leif.middelschulte@gmail.com>
+   @author Mike McCormack <mj.mccormack@samsung.com>
+   @author Sangho Park <gouache95@gmail.com>
+   @author Jihoon Kim <jihoon48.kim@samsung.com> <imfine98@gmail.com>
+   @author PnB <Poor.NewBie@gmail.com>
+   @author Daniel Juyung Seo <seojuyung2@gmail.com> <juyung.seo@samsung.com>
+   @author Christopher 'devilhorns' Michael <cpmichael1@comcast.net>
+   @author ChunEon Park <hermet@hermet.pe.kr>
+   @author xlopez@igalia.com
+   @author Rafael Antognolli <antognolli@profusion.mobi>
+   @author Kim Yunhan <spbear@gmail.com>
+   @author Youness Alaoui <kakaroto@kakaroto.homelinux.net>
+   @author Bluezery <ohpowel@gmail.com>
+   @author Doyoun Kang <wayofmine@gmail.com> <doyoun.kang@samsung.com>
+   @author Haifeng Deng <haifeng.deng@samsung.com>
+   @author Jérémy Zurcher <jeremy@asynk.ch>
+   @author Vikram Narayanan <vikram186@gmail.com>
+
+   Please contact <enlightenment-devel@lists.sourceforge.net> to get in
+   contact with the developers and maintainers.
+ */
+
+/**
+ * @page Ecore_Main_Loop_Page The Ecore Main Loop
+ *
+ * @section intro What is Ecore?
+ *
+ * Ecore is a clean and tiny event loop library with many modules to do lots of
+ * convenient things for a programmer, to save time and effort. It's small and
+ * lean, designed to work from embedded systems all the way up to large and
+ * powerful multi-cpu workstations. The main loop has a number of primitives to
+ * be used with its main loop. It serializes all the primitives and allows for
+ * great responsiveness without the need for threads(or any other concurrency).
+ *
+ * @subsection timers Timers
+ *
+ * Timers serve two main purposes: doing something at a specified time and
+ * repeatedly doing something with a set interval.
+ * @see Ecore_Timer_Group
+ *
+ * @subsection poolers Poolers
+ *
+ * Poolers allow for pooling to be centralized into a single place therefore
+ * alleviating the need for different parts of the program to wake up at
+ * different times to do pooling, thereby making the code simpler and more
+ * efficient.
+ * @see Ecore_Poller_Group
+ *
+ * @subsection idler Idlers
+ *
+ * There are three types of idlers, enterers, idlers(proper) and exiters, they
+ * are called, respectively, when the program is about to enter an idle state,
+ * when the program is idle and when the program is leaving an idle state. Idler
+ * enterers are usually a good place to update the program state. Proper idlers
+ * are the appropriate place to do heavy computational tasks thereby using what
+ * would otherwise be wasted CPU cycles. Exiters are the perfect place to do
+ * anything your program should do just before processing events(also timers,
+ * poolers, file descriptor handlers and animators)
+ * @see Ecore_Idle_Group
+ *
+ * @subsection fd_handler File descriptor handlers
+ *
+ * File descriptor handlers allow you to monitor when there is data available to
+ * read on file descriptors, when writing will not block or if there was an
+ * error. Any valid file descriptor can be used with this API, regardless of if
+ * was gotten with an OS specific API or from ecore.
+ * @see Ecore_FD_Handler_Group
+ *
+ * @subsection animators Animators
+ *
+ * Ecore provides a facility called animators, so named since the intended use
+ * was in animations, that facilitates knowing what percentage of a given
+ * interval has elapsed. This is perfect for performing animations, but is not
+ * limited to that use, it can, for example, also be used to create a progress
+ * bar.
+ * @see Ecore_Animator_Group
+ *
+ * @subsection ev_handlers Event handlers
+ *
+ * Event handlers are, arguably, the most important feature of the ecore main
+ * loop, they are what allows the programmer to easily handle user interaction.
+ * Events however are not only things the user does, events can represent
+ * anything for which a type is created.
+ * @see Ecore_Event_Group
+ *
+ * All of these primitives are discussed in more detail in their respective
+ * pages linked above.
+ *
+ * Here is a diagram of the main loop flow of a simple program:
+ *
+ * @image html  prog_flow.png
+ * @image latex prog_flow.eps width=\textwidth
+ *
+ *
+ *
+ * @section work How does Ecore work?
+ *
+ * Ecore is very easy to learn and use. All the function calls are designed to
+ * be easy to remember, explicit in describing what they do, and heavily
+ * name-spaced. Ecore programs can start and be very simple.
+ *
+ * For example:
+ *
+ * @code
+ * #include <Ecore.h>
+ *
+ * int
+ * main(int argc, const char **argv)
+ * {
+ *    ecore_init();
+ *    ecore_app_args_set(argc, argv);
+ *    ecore_main_loop_begin();
+ *    ecore_shutdown();
+ *    return 0;
+ * }
+ * @endcode
+ *
+ * This program is very simple and doesn't check for errors, but it does start up
+ * and begin a main loop waiting for events or timers to tick off. This program
+ * doesn't set up any, but now we can expand on this simple program a little
+ * more by adding some event handlers and timers.
+ *
+ * @code
+ * #include <Ecore.h>
+ *
+ * Ecore_Timer         *timer1     = NULL;
+ * Ecore_Event_Handler *handler1   = NULL;
+ * double               start_time = 0.0;
+ *
+ * int
+ * timer_func(void *data)
+ * {
+ *    printf("Tick timer. Sec: %3.2f\n", ecore_time_get() - start_time);
+ *    return 1;
+ * }
+ *
+ * int
+ * exit_func(void *data, int ev_type, void *ev)
+ * {
+ *    Ecore_Event_Signal_Exit *e;
+ *
+ *    e = (Ecore_Event_Signal_Exit *)ev;
+ *    if (e->interrupt)      printf("Exit: interrupt\n");
+ *    else if (e->quit)      printf("Exit: quit\n");
+ *    else if (e->terminate) printf("Exit: terminate\n");
+ *    ecore_main_loop_quit();
+ *    return 1;
+ * }
+ *
+ * int
+ * main(int argc, const char **argv)
+ * {
+ *    ecore_init();
+ *    ecore_app_args_set(argc, argv);
+ *    start_time = ecore_time_get();
+ *    handler1 = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, exit_func, NULL);
+ *    timer1 = ecore_timer_add(0.5, timer_func, NULL);
+ *    ecore_main_loop_begin();
+ *    ecore_shutdown();
+ *    return 0;
+ * }
+ * @endcode
+ *
+ * In the previous example, we initialize our application and get the time at
+ * which our program has started so we can calculate an offset. We set
+ * up a timer to tick off in 0.5 seconds, and since it returns 1, will
+ * keep ticking off every 0.5 seconds until it returns 0, or is deleted
+ * by hand. An event handler is set up to call a function -
+ * exit_func(),
+ * whenever an event of type ECORE_EVENT_SIGNAL_EXIT is received (CTRL-C
+ * on the command line will cause such an event to happen). If this event
+ * occurs it tells you what kind of exit signal was received, and asks
+ * the main loop to quit when it is finished by calling
+ * ecore_main_loop_quit().
+ *
+ * The handles returned by ecore_timer_add() and
+ * ecore_event_handler_add() are
+ * only stored here as an example. If you don't need to address the timer or
+ * event handler again you don't need to store the result, so just call the
+ * function, and don't assign the result to any variable.
+ *
+ * This program looks slightly more complex than needed to do these simple
+ * things, but in principle, programs don't get any more complex. You add more
+ * event handlers, for more events, will have more timers and such, BUT it all
+ * follows the same principles as shown in this example.
+ *
+ */
+
+/*
+   @page Ecore_Config_Page The Enlightened Property Library
+
+   The Enlightened Property Library (Ecore_Config) is an abstraction
+   from the complexities of writing your own configuration. It provides
+   many features using the Enlightenment 17 development libraries.
+
+   To use the library, you:
+   @li Set the default values of your properties.
+   @li Load the configuration from a file.  You must set the default values
+    first, so that the library knows the correct type of each argument.
+
+   The following examples show how to use the Enlightened Property Library:
+   @li @link config_basic_example.c config_basic_example.c @endlink
+   @li @link config_listener_example.c config_listener_example.c @endlink
+
+ */
+
+/**
+   @page X_Window_System_Page X Window System
+
+   The Ecore library includes a wrapper for handling the X window system.
+   This page briefly explains what the X window system is and various terms
+   that are used.
+ */
+
 #ifndef _ECORE_H
 #define _ECORE_H
 
+#ifdef _MSC_VER
+# include <Evil.h>
+#endif
+
+#include <Eina.h>
+
 #ifdef EAPI
 # undef EAPI
 #endif
 # endif
 #endif /* ! _WIN32 */
 
+#ifdef _WIN32
+# include <winsock2.h>
+#elif defined (__FreeBSD__) || defined (__OpenBSD__)
+# include <sys/select.h>
+# include <signal.h>
+#elif defined (__ANDROID__)
+# include <sys/select.h>
+#else
+# include <sys/time.h>
+# if !defined (EXOTIC_NO_SIGNAL)
+#  include <signal.h>
+# endif
+#endif
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup Ecore_Init_Group Ecore initialization, shutdown functions and reset on fork.
+ *
+ * @{
+ */
+
+EAPI int ecore_init(void);
+EAPI int ecore_shutdown(void);
+/**
+ * @}
+ */
+
 /**
- * @file Ecore.h
- * @brief The file that provides the program utility, main loop and timer
- *        functions.
+ * @defgroup Ecore_Main_Loop_Group Ecore main loop
+ *
+ * This group discusses functions that are acting on Ecore's main loop itself or
+ * on events and infrastructure directly linked to it. Most programs only need
+ * to start and end the main loop, the rest of the function discussed here are
+ * meant to be used in special situations, and with great care.
  *
- * This header provides the Ecore event handling loop.  For more
- * details, see @ref Ecore_Main_Loop_Group.
+ * For details on the usage of ecore's main loop and how it interacts with other
+ * ecore facilities see: @ref Ecore_Main_Loop_Page.
  *
- * For the main loop to be of any use, you need to be able to add events
- * and event handlers.  Events for file descriptor events are covered in
- * @ref Ecore_FD_Handler_Group.
+ * @{
+ */
+
+#define ECORE_VERSION_MAJOR 1
+#define ECORE_VERSION_MINOR 8
+
+typedef struct _Ecore_Version
+{
+   int major;
+   int minor;
+   int micro;
+   int revision;
+} Ecore_Version;
+
+EAPI extern Ecore_Version *ecore_version;
+
+#define ECORE_CALLBACK_CANCEL  EINA_FALSE /**< Return value to remove a callback */
+#define ECORE_CALLBACK_RENEW   EINA_TRUE /**< Return value to keep a callback */
+
+#define ECORE_CALLBACK_PASS_ON EINA_TRUE /**< Return value to pass event to next handler */
+#define ECORE_CALLBACK_DONE    EINA_FALSE /**< Return value to stop event handling */
+
+/**
+ * @typedef Ecore_Task_Cb Ecore_Task_Cb
+ * A callback run for a task (timer, idler, poller, animator, etc)
+ */
+typedef Eina_Bool (*Ecore_Task_Cb)(void *data);
+
+/**
+ * @typedef Ecore_Select_Function
+ * A function which can be used to replace select() in the main loop
+ */
+typedef int (*Ecore_Select_Function)(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
+
+EAPI void ecore_main_loop_iterate(void);
+
+EAPI void ecore_main_loop_select_func_set(Ecore_Select_Function func);
+EAPI Ecore_Select_Function ecore_main_loop_select_func_get(void);
+
+EAPI Eina_Bool ecore_main_loop_glib_integrate(void);
+EAPI void ecore_main_loop_glib_always_integrate_disable(void);
+
+EAPI void ecore_main_loop_begin(void);
+EAPI void ecore_main_loop_quit(void);
+
+/**
+ * @typedef Ecore_Cb Ecore_Cb
+ * A generic callback called as a hook when a certain point in
+ * execution is reached.
+ */
+typedef void (*Ecore_Cb)(void *data);
+
+/**
+ * @typedef Ecore_Data_Cb Ecore_Data_Cb
+ * A callback which is used to return data to the main function
+ */
+typedef void *(*Ecore_Data_Cb)(void *data);
+
+/**
+ * Add a function to be called by ecore_fork_reset()
+ * 
+ * This queues @p func to be called (and passed @p data as its argument) when
+ * ecore_fork_reset() is called. This allows other libraries and subsystems
+ * to also reset their internal state after a fork.
+ * 
+ * @since 1.7
+ */
+EAPI Eina_Bool ecore_fork_reset_callback_add(Ecore_Cb func, const void *data);
+
+/**
+ * This removes the callback specified
+ * 
+ * This deletes the callback added by ecore_fork_reset_callback_add() using
+ * the function and data pointer to specify which to remove.
+ * 
+ * @since 1.7
+ */
+EAPI Eina_Bool ecore_fork_reset_callback_del(Ecore_Cb func, const void *data);
+       
+/**
+ * Reset the ecore internal state after a fork
+ * 
+ * Ecore maintains internal data that can be affected by the fork() system call
+ * which creates a duplicate of the current process. This also duplicates
+ * file descriptors which is problematic in that these file descriptors still
+ * point to their original sources. This function makes ecore reset internal
+ * state (e.g. pipes used for signalling between threads) so they function
+ * correctly afterwards.
+ * 
+ * It is highly suggested that you call this function after any fork()
+ * system call inside the child process if you intend to use ecore features
+ * after this point and not call any exec() family functions. Not doing so
+ * will cause possible misbehaviour.
+ * 
+ * @since 1.7
+ */
+EAPI void ecore_fork_reset(void);
+
+/**
+ * @brief Call callback asynchronously in the main loop.
+ * @since 1.1.0
  *
- * Time functions are covered in @ref Ecore_Time_Group.
+ * @param callback The callback to call in the main loop
+ * @param data The data to give to that call back
  *
- * There is also provision for callbacks for when the loop enters or
- * exits an idle state. See @ref Idle_Group for more information.
+ * For all calls that need to happen in the main loop (most EFL functions do),
+ * this helper function provides the infrastructure needed to do it safely
+ * by avoiding dead lock, race condition and properly wake up the main loop.
  *
- * Functions are also provided for spawning child processes using fork.
- * See @ref Ecore_Exe_Basic_Group and @ref Ecore_Exe_Signal_Group for
- * more details.
+ * Remember after that function call, you should never touch again the @p data
+ * in the thread, it is owned by the main loop and your callback should take
+ * care of freeing it if necessary.
  */
+EAPI void ecore_main_loop_thread_safe_call_async(Ecore_Cb callback, void *data);
 
-#ifndef _ECORE_PRIVATE_H
-#include <sys/types.h>
-#include <signal.h>
-#endif
+/**
+ * @brief Call callback synchronously in the main loop.
+ * @since 1.1.0
+ *
+ * @param callback The callback to call in the main loop
+ * @param data The data to give to that call back
+ * @return the value returned by the callback in the main loop
+ *
+ * For all calls that need to happen in the main loop (most EFL functions do),
+ * this helper function provides the infrastructure needed to do it safely
+ * by avoiding dead lock, race condition and properly wake up the main loop.
+ *
+ * Remember this function will block until the callback is executed in the
+ * main loop. It can take time and you have no guaranty about the timeline.
+ */
+EAPI void *ecore_main_loop_thread_safe_call_sync(Ecore_Data_Cb callback, void *data);
 
-#ifndef TRUE
-#define TRUE 1
-#endif
+/**
+ * @brief This function suspend the main loop in a know state
+ * @since 1.1.0
+ *
+ * @result the number of time ecore_thread_main_loop_begin() has been called
+ * in this thread, if the main loop was suspended correctly. If not, it return @c -1.
+ *
+ * This function suspend the main loop in a know state, this let you
+ * use any EFL call you want after it return. Be carefully, the main loop
+ * is blocked until you call ecore_thread_main_loop_end(). This is
+ * the only sane way to achieve pseudo thread safety.
+ *
+ * Notice that until the main loop is blocked, the thread is blocked
+ * and their is noway around that.
+ *
+ * We still advise you, when possible, to use ecore_main_loop_thread_safe_call_async()
+ * as it will not block the thread nor the main loop.
+ */
+EAPI int ecore_thread_main_loop_begin(void);
 
-#ifndef FALSE
-#define FALSE 0
-#endif
+/**
+ * @brief Unlock the main loop.
+ * @since 1.1.0
+ *
+ * @result the number of time ecore_thread_main_loop_end() need to be called before
+ * the main loop is unlocked again. @c -1 will be returned if you are trying to unlock
+ * when there wasn't enough call to ecore_thread_main_loop_begin().
+ *
+ * After a call to ecore_thread_main_loop_begin(), you need to absolutely
+ * call ecore_thread_main_loop_end(), or you application will stay frozen.
+ */
+EAPI int ecore_thread_main_loop_end(void);
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+/**
+ * @}
+ */
 
-#define ECORE_CALLBACK_CANCEL 0 /**< Return value to remove a callback */
-#define ECORE_CALLBACK_RENEW 1  /**< Return value to keep a callback */
+/**
+ * @defgroup Ecore_Event_Group Ecore Event functions
+ *
+ * Ecore events provide two main features that are of use to those using ecore:
+ * creating events and being notified of events. Those two will usually be used
+ * in different contexts, creating events is mainly done by libraries wrapping
+ * some system functionality while being notified of events is mainly a
+ * necessity of applications.
+ *
+ * For a program to be notified of events it's interested in it needs to have a
+ * function to process the event and to register that function as the callback
+ * to the event, that's all:
+ * @code
+ * ecore_event_handler_add(EVENT_TYPE, _my_event_handler, some_data);
+ * ...
+ * static Eina_Bool
+ * _my_event_handler(void *data, int type, void *event)
+ * {
+ *    //data is some_data
+ *    //event is provided by whoever created the event
+ *    //Do really cool stuff with event
+ * }
+ * @endcode
+ *
+ * One very important thing to note here is the @c EVENT_TYPE, to register a
+ * handler for an event you must know its type before hand. Ecore provides
+ * the following events which are emitted in response to POSIX
+ * signals(https://en.wikipedia.org/wiki/Signal_%28computing%29):
+ * @li @b ECORE_EVENT_SIGNAL_USER
+ * @li @b ECORE_EVENT_SIGNAL_HUP
+ * @li @b ECORE_EVENT_SIGNAL_POWER
+ * @li @b ECORE_EVENT_SIGNAL_EXIT
+ *
+ * @warning Don't override these using the @c signal or @c sigaction calls.
+ * These, however, aren't the only signals one can handle. Many
+ * libraries(including ecore modules) have their own signals that can be
+ * listened for and handled, to do that one only needs to know the type of the
+ * event. This information can be found on the documentation of the library
+ * emitting the signal, so, for example, for events related to windowing one
+ * would look in @ref Ecore_Evas_Group.
+ *
+ * Examples of libraries that integrate into ecore's main loop by providing
+ * events are @ref Ecore_Con_Group, @ref Ecore_Evas_Group and @ref
+ * Ecore_Exe_Group, amongst others. This usage can be divided into two parts,
+ * setup and adding events. The setup is very simple, all that needs doing is
+ * getting a type id for the event:
+ * @code
+ * int MY_EV_TYPE = ecore_event_type_new();
+ * @endcode
+ * @note This variable should be declared in the header since it'll be needed by
+ * anyone wishing to register a handler to your event.
+ *
+ * The complexity of adding of an event to the queue depends on whether that
+ * event sends uses @c event, if it doesn't it a one-liner:
+ * @code
+ * ecore_event_add(MY_EV_TYPE, NULL, NULL, NULL);
+ * @endcode
+ * The usage when an @c event is needed is not that much more complex and can be
+ * seen in @ref ecore_event_add.
+ *
+ * Examples that deals with events:
+ * @li @ref ecore_event_example_01_c
+ * @li @ref ecore_event_example_02_c
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
 
 #define ECORE_EVENT_NONE            0
 #define ECORE_EVENT_SIGNAL_USER     1 /**< User signal event */
@@ -77,229 +643,1975 @@ extern "C" {
 #define ECORE_EVENT_SIGNAL_REALTIME 5 /**< Realtime signal event */
 #define ECORE_EVENT_COUNT           6
 
-   EAPI extern int ECORE_EXE_EVENT_ADD; /**< A child process has been added */
-   EAPI extern int ECORE_EXE_EVENT_DEL; /**< A child process has been deleted (it exited, naming consistant with the rest of ecore). */
-   EAPI extern int ECORE_EXE_EVENT_DATA; /**< Data from a child process. */
-   EAPI extern int ECORE_EXE_EVENT_ERROR; /**< Errors from a child process. */
-
-#ifndef _ECORE_PRIVATE_H
-   enum _Ecore_Fd_Handler_Flags
-     {
-       ECORE_FD_READ = 1, /**< Fd Read mask */
-       ECORE_FD_WRITE = 2, /**< Fd Write mask */
-       ECORE_FD_ERROR = 4 /**< Fd Error mask */
-     };
-   typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags;
-
-   enum _Ecore_Exe_Flags /* flags for executing a child with its stdin and/or stdout piped back */
-     {
-       ECORE_EXE_PIPE_READ = 1, /**< Exe Pipe Read mask */
-       ECORE_EXE_PIPE_WRITE = 2, /**< Exe Pipe Write mask */
-       ECORE_EXE_PIPE_ERROR = 4, /**< Exe Pipe error mask */
-       ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, /**< Reads are buffered until a newline and delivered 1 event per line */
-       ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, /**< Errors are buffered until a newline and delivered 1 event per line */
-       ECORE_EXE_PIPE_AUTO = 32, /**< stdout and stderr are buffered automatically */
-       ECORE_EXE_RESPAWN = 64, /**< FIXME: Exe is restarted if it dies */
-       ECORE_EXE_USE_SH = 128, /**< Use /bin/sh to run the command. */
-       ECORE_EXE_NOT_LEADER = 256 /**< Do not use setsid() to have the executed process be its own session leader */
-     };
-   typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
-
-   enum _Ecore_Poller_Type /* Poller types */
-     {
-       ECORE_POLLER_CORE = 0 /**< The core poller interval */
-     };
-   typedef enum _Ecore_Poller_Type Ecore_Poller_Type;
-
-#ifndef _WIN32
-   typedef void Ecore_Exe; /**< A handle for spawned processes */
-#endif
-   typedef void Ecore_Timer; /**< A handle for timers */
-   typedef void Ecore_Idler; /**< A handle for idlers */
-   typedef void Ecore_Idle_Enterer; /**< A handle for idle enterers */
-   typedef void Ecore_Idle_Exiter; /**< A handle for idle exiters */
-   typedef void Ecore_Fd_Handler; /**< A handle for Fd hanlders */
-   typedef void Ecore_Event_Handler; /**< A handle for an event handler */
-   typedef void Ecore_Event_Filter; /**< A handle for an event filter */
-   typedef void Ecore_Event; /**< A handle for an event */
-   typedef void Ecore_Animator; /**< A handle for animators */
-   typedef void Ecore_Poller; /**< A handle for pollers */
-#endif
-   typedef struct _Ecore_Event_Signal_User     Ecore_Event_Signal_User; /**< User signal event */
-   typedef struct _Ecore_Event_Signal_Hup      Ecore_Event_Signal_Hup; /**< Hup signal event */
-   typedef struct _Ecore_Event_Signal_Exit     Ecore_Event_Signal_Exit; /**< Exit signal event */
-   typedef struct _Ecore_Event_Signal_Power    Ecore_Event_Signal_Power; /**< Power signal event */
-   typedef struct _Ecore_Event_Signal_Realtime Ecore_Event_Signal_Realtime; /**< Realtime signal event */
-   typedef struct _Ecore_Exe_Event_Add         Ecore_Exe_Event_Add; /**< Spawned Exe add event */
-   typedef struct _Ecore_Exe_Event_Del         Ecore_Exe_Event_Del; /**< Spawned Exe exit event */
-   typedef struct _Ecore_Exe_Event_Data_Line   Ecore_Exe_Event_Data_Line; /**< Lines from a child process */
-   typedef struct _Ecore_Exe_Event_Data        Ecore_Exe_Event_Data; /**< Data from a child process */
-
-   struct _Ecore_Event_Signal_User /** User signal event */
-     {
-       int   number; /**< The signal number. Either 1 or 2 */
-       void *ext_data; /**< Extension data - not used */
-
-#ifndef _WIN32
-       siginfo_t data; /**< Signal info */
-#endif
-     };
+typedef struct _Ecore_Win32_Handler         Ecore_Win32_Handler;    /**< A handle for HANDLE handlers on Windows */
+typedef struct _Ecore_Event_Handler         Ecore_Event_Handler;    /**< A handle for an event handler */
+typedef struct _Ecore_Event_Filter          Ecore_Event_Filter;    /**< A handle for an event filter */
+typedef struct _Ecore_Event                 Ecore_Event;    /**< A handle for an event */
+typedef struct _Ecore_Event_Signal_User     Ecore_Event_Signal_User;    /**< User signal event */
+typedef struct _Ecore_Event_Signal_Hup      Ecore_Event_Signal_Hup;    /**< Hup signal event */
+typedef struct _Ecore_Event_Signal_Exit     Ecore_Event_Signal_Exit;    /**< Exit signal event */
+typedef struct _Ecore_Event_Signal_Power    Ecore_Event_Signal_Power;    /**< Power signal event */
+typedef struct _Ecore_Event_Signal_Realtime Ecore_Event_Signal_Realtime;    /**< Realtime signal event */
+
+/**
+ * @typedef Ecore_Filter_Cb
+ * A callback used for filtering events from the main loop.
+ */
+typedef Eina_Bool (*Ecore_Filter_Cb)(void *data, void *loop_data, int type, void *event);
+
+/**
+ * @typedef Ecore_End_Cb Ecore_End_Cb
+ * This is the callback which is called at the end of a function,
+ * usually for cleanup purposes.
+ */
+typedef void (*Ecore_End_Cb)(void *user_data, void *func_data);
+
+/**
+ * @typedef Ecore_Event_Handler_Cb Ecore_Event_Handler_Cb
+ * A callback used by the main loop to handle events of a specified
+ * type.
+ */
+typedef Eina_Bool (*Ecore_Event_Handler_Cb)(void *data, int type, void *event);
 
-   struct _Ecore_Event_Signal_Hup /** Hup signal event */
-     {
-       void *ext_data; /**< Extension data - not used */
+struct _Ecore_Event_Signal_User    /** User signal event */
+{
+   int       number;  /**< The signal number. Either 1 or 2 */
+   void     *ext_data;  /**< Extension data - not used */
 
-#ifndef _WIN32
-       siginfo_t data; /**< Signal info */
+#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL)
+   siginfo_t data; /**< Signal info */
 #endif
-     };
+};
 
-   struct _Ecore_Event_Signal_Exit /** Exit request event */
-     {
-       unsigned int   interrupt : 1; /**< Set if the exit request was an interrupt  signal*/
-       unsigned int   quit      : 1; /**< set if the exit request was a quit signal */
-       unsigned int   terminate : 1; /**< Set if the exit request was a terminate singal */
-       void          *ext_data;        /**< Extension data - not used */
+struct _Ecore_Event_Signal_Hup    /** Hup signal event */
+{
+   void     *ext_data;  /**< Extension data - not used */
 
-#ifndef _WIN32
-       siginfo_t data; /**< Signal info */
+#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL)
+   siginfo_t data; /**< Signal info */
 #endif
-     };
+};
 
-   struct _Ecore_Event_Signal_Power /** Power event */
-     {
-       void *ext_data; /**< Extension data - not used */
+struct _Ecore_Event_Signal_Exit    /** Exit request event */
+{
+   Eina_Bool interrupt : 1; /**< Set if the exit request was an interrupt  signal*/
+   Eina_Bool quit      : 1; /**< set if the exit request was a quit signal */
+   Eina_Bool terminate : 1; /**< Set if the exit request was a terminate signal */
+   void     *ext_data; /**< Extension data - not used */
 
-#ifndef _WIN32
-       siginfo_t data; /**< Signal info */
+#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL)
+   siginfo_t data; /**< Signal info */
 #endif
-     };
+};
 
-   struct _Ecore_Event_Signal_Realtime /** Realtime event */
-     {
-       int num; /**< The realtime signal's number */
+struct _Ecore_Event_Signal_Power    /** Power event */
+{
+   void     *ext_data;  /**< Extension data - not used */
 
-#ifndef _WIN32
-       siginfo_t data; /**< Signal info */
+#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL)
+   siginfo_t data; /**< Signal info */
 #endif
-     };
-
-#ifndef _WIN32
-   struct _Ecore_Exe_Event_Add /** Process add event */
-     {
-       Ecore_Exe *exe; /**< The handle to the added process */
-       void      *ext_data; /**< Extension data - not used */
-     };
-
-   struct _Ecore_Exe_Event_Del /** Process exit event */
-     {
-       pid_t         pid; /**< The process ID of the process that exited */
-       int           exit_code; /**< The exit code of the process */
-       Ecore_Exe    *exe; /**< The handle to the exited process, or NULL if not found */
-       int           exit_signal; /** < The signal that caused the process to exit */
-       unsigned int  exited    : 1; /** < set to 1 if the process exited of its own accord */
-       unsigned int  signalled : 1; /** < set to 1 id the process exited due to uncaught signal */
-       void         *ext_data; /**< Extension data - not used */
-       siginfo_t     data; /**< Signal info */
-     };
-
-   struct _Ecore_Exe_Event_Data_Line /**< Lines from a child process */
-      {
-         char *line;
-        int   size;
-      };
-
-   struct _Ecore_Exe_Event_Data /** Data from a child process event */
-     {
-       Ecore_Exe *exe; /**< The handle to the process */
-       void *data; /**< the raw binary data from the child process that was recieved */
-       int   size; /**< the size of this data in bytes */
-       Ecore_Exe_Event_Data_Line *lines; /**< an array of line data if line buffered, the last one has it's line member set to NULL */
-     };
+};
+
+struct _Ecore_Event_Signal_Realtime    /** Realtime event */
+{
+   int       num; /**< The realtime signal's number */
+
+#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL)
+   siginfo_t data; /**< Signal info */
 #endif
+};
+
+/**
+ * @brief Add an event handler.
+ * @param type The type of the event this handler will get called for
+ * @param func The function to call when the event is found in the queue
+ * @param data A data pointer to pass to the called function @p func
+ * @return A new Event handler, or @c NULL on failure.
+ *
+ * Add an event handler to the list of handlers. This will, on success, return
+ * a handle to the event handler object that was created, that can be used
+ * later to remove the handler using ecore_event_handler_del(). The @p type
+ * parameter is the integer of the event type that will trigger this callback
+ * to be called. The callback @p func is called when this event is processed
+ * and will be passed the event type, a pointer to the private event
+ * structure that is specific to that event type, and a data pointer that is
+ * provided in this call as the @p data parameter.
+ *
+ * When the callback @p func is called, it must return 1 or 0. If it returns
+ * 1 (or ECORE_CALLBACK_PASS_ON), It will keep being called as per normal, for
+ * each handler set up for that event type. If it returns 0 (or
+ * ECORE_CALLBACK_DONE), it will cease processing handlers for that particular
+ * event, so all handler set to handle that event type that have not already
+ * been called, will not be.
+ */
+EAPI Ecore_Event_Handler *ecore_event_handler_add(int type, Ecore_Event_Handler_Cb func, const void *data);
+/**
+ * @brief Delete an event handler.
+ * @param event_handler Event handler handle to delete
+ * @return Data passed to handler
+ *
+ * Delete a specified event handler from the handler list. On success this will
+ * delete the event handler and return the pointer passed as @p data when the
+ * handler was added by ecore_event_handler_add(). On failure @c NULL will be
+ * returned. Once a handler is deleted it will no longer be called.
+ */
+EAPI void *ecore_event_handler_del(Ecore_Event_Handler *event_handler);
+/**
+ * @brief Add an event to the event queue.
+ * @param type The event type to add to the end of the event queue
+ * @param ev The data structure passed as @c event to event handlers
+ * @param func_free The function to be called to free @a ev
+ * @param data The data pointer to be passed to the free function
+ * @return A Handle for that event on success, otherwise NULL
+ *
+ * If it succeeds, an event of type @a type will be added to the queue for
+ * processing by event handlers added by ecore_event_handler_add(). The @a ev
+ * parameter will be passed as the @c event parameter of the handler. When the
+ * event is no longer needed, @a func_free will be called and passed @a ev for
+ * cleaning up. If @p func_free is NULL, free() will be called with the private
+ * structure pointer.
+ */
+EAPI Ecore_Event *ecore_event_add(int type, void *ev, Ecore_End_Cb func_free, void *data);
+/**
+ * @brief Delete an event from the queue.
+ * @param event The event handle to delete
+ * @return The data pointer originally set for the event free function
+ *
+ * This deletes the event @p event from the event queue, and returns the
+ * @p data parameter originally set when adding it with ecore_event_add(). This
+ * does not immediately call the free function, and it may be called later on
+ * cleanup, and so if the free function depends on the data pointer to work,
+ * you should defer cleaning of this till the free function is called later.
+ */
+EAPI void *ecore_event_del(Ecore_Event *event);
+/**
+ * @brief Get the data associated with an #Ecore_Event_Handler
+ * @param eh The event handler
+ * @return The data
+ *
+ * This function returns the data previously associated with @p eh by
+ * ecore_event_handler_add().
+ */
+EAPI void *ecore_event_handler_data_get(Ecore_Event_Handler *eh);
+/**
+ * @brief Set the data associated with an #Ecore_Event_Handler
+ * @param eh The event handler
+ * @param data The data to associate
+ * @return The previous data
+ *
+ * This function sets @p data to @p eh and returns the old data pointer
+ * which was previously associated with @p eh by ecore_event_handler_add().
+ */
+EAPI void *ecore_event_handler_data_set(Ecore_Event_Handler *eh, const void *data);
+/**
+ * @brief Allocate a new event type id sensibly and return the new id.
+ * @return A new event type id.
+ *
+ * This function allocates a new event type id and returns it. Once an event
+ * type has been allocated it can never be de-allocated during the life of
+ * the program. There is no guarantee of the contents of this event ID, or how
+ * it is calculated, except that the ID will be unique to the current instance
+ * of the process.
+ */
+EAPI int ecore_event_type_new(void);
+/**
+ * @brief Add a filter the current event queue.
+ *
+ * @param func_start Function to call just before filtering and return data
+ * @param func_filter Function to call on each event
+ * @param func_end Function to call after the queue has been filtered
+ * @param data Data to pass to the filter functions
+ * @return A filter handle on success, @c NULL otherwise.
+ *
+ * Adds a callback to filter events from the event queue. Filters are called on
+ * the queue just before Event handler processing to try and remove redundant
+ * events. Just as processing is about to start @a func_start is called and
+ * passed the @a data pointer, the return value of this functions is passed to
+ * @a func_filter as loop_data. @a func_filter is also passed @a data and the
+ * event type and event structure. If this @a func_filter returns
+ * @c EINA_FALSE, the event is removed from the queue, if it returns
+ * @c EINA_TRUE, the event is kept. When processing is finished @p func_end is
+ * called and is passed the loop_data(returned by @c func_start) and @p data
+ * pointer to clean up.
+ */
+EAPI Ecore_Event_Filter *ecore_event_filter_add(Ecore_Data_Cb func_start, Ecore_Filter_Cb func_filter, Ecore_End_Cb func_end, const void *data);
+/**
+ * @brief Delete an event filter.
+ * @param ef The event filter handle
+ * @return The data set for the filter on success, @c NULL otherwise.
+ *
+ * Delete a filter that has been added by its @p ef handle.
+ */
+EAPI void *ecore_event_filter_del(Ecore_Event_Filter *ef);
+/**
+ * @brief Return the current event type being handled.
+ * @return The current event type being handled if inside a handler callback,
+ * ECORE_EVENT_NONE otherwise
+ *
+ * If the program is currently inside an Ecore event handler callback this
+ * will return the type of the current event being processed.
+ *
+ * This is useful when certain Ecore modules such as Ecore_Evas "swallow"
+ * events and not all the original information is passed on. In special cases
+ * this extra information may be useful or needed and using this call can let
+ * the program know if the event type being handled is one it wants to get more
+ * information about.
+ */
+EAPI int ecore_event_current_type_get(void);
+/**
+ * @brief Return the current event type pointer handled.
+ * @return The current event pointer being handled if inside a handler callback,
+ * @c NULL otherwise.
+ *
+ * If the program is currently inside an Ecore event handler callback this
+ * will return the pointer of the current event being processed.
+ *
+ * This is useful when certain Ecore modules such as Ecore_Evas "swallow"
+ * events and not all the original information is passed on. In special cases
+ * this extra information may be useful or needed and using this call can let
+ * the program access the event data if the type of the event is handled by
+ * the program.
+ */
+EAPI void *ecore_event_current_event_get(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Exe_Group Process Spawning Functions
+ *
+ * This module is responsible for managing portable processes using Ecore.
+ * With this module you're able to spawn processes and you also can pause,
+ * quit your spawned processes.
+ * An interaction between your process and those spawned is possible
+ * using pipes or signals.
+ *
+ * Example
+ * @li @ref Ecore_exe_simple_example_c
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+/** Inherit priority from parent process */
+#define ECORE_EXE_PRIORITY_INHERIT 9999
 
-   EAPI int  ecore_init(void);
-   EAPI int  ecore_shutdown(void);
-
-   EAPI void ecore_app_args_set(int argc, const char **argv);
-   EAPI void ecore_app_args_get(int *argc, char ***argv);
-   EAPI void ecore_app_restart(void);
-
-   EAPI Ecore_Event_Handler *ecore_event_handler_add(int type, int (*func) (void *data, int type, void *event), const void *data);
-   EAPI void                *ecore_event_handler_del(Ecore_Event_Handler *event_handler);
-   EAPI Ecore_Event         *ecore_event_add(int type, void *ev, void (*func_free) (void *data, void *ev), void *data);
-   EAPI void                *ecore_event_del(Ecore_Event *event);
-   EAPI int                  ecore_event_type_new(void);
-   EAPI Ecore_Event_Filter  *ecore_event_filter_add(void * (*func_start) (void *data), int (*func_filter) (void *data, void *loop_data, int type, void *event), void (*func_end) (void *data, void *loop_data), const void *data);
-   EAPI void                *ecore_event_filter_del(Ecore_Event_Filter *ef);
-   EAPI int                  ecore_event_current_type_get(void);
-   EAPI void                *ecore_event_current_event_get(void);
-
-
-#ifndef _WIN32
-   EAPI Ecore_Exe  *ecore_exe_run(const char *exe_cmd, const void *data);
-   EAPI Ecore_Exe  *ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data);
-   EAPI int         ecore_exe_send(Ecore_Exe *exe, void *data, int size);
-   EAPI void        ecore_exe_close_stdin(Ecore_Exe *exe);
-   EAPI void        ecore_exe_auto_limits_set(Ecore_Exe *exe, int start_bytes, int end_bytes, int start_lines, int end_lines);
-   EAPI Ecore_Exe_Event_Data *ecore_exe_event_data_get(Ecore_Exe *exe, Ecore_Exe_Flags flags);
-   EAPI void        ecore_exe_event_data_free(Ecore_Exe_Event_Data *data);
-   EAPI void       *ecore_exe_free(Ecore_Exe *exe);
-   EAPI pid_t       ecore_exe_pid_get(Ecore_Exe *exe);
-   EAPI void        ecore_exe_tag_set(Ecore_Exe *exe, const char *tag);
-   EAPI char       *ecore_exe_tag_get(Ecore_Exe *exe);
-   EAPI char       *ecore_exe_cmd_get(Ecore_Exe *exe);
-   EAPI void       *ecore_exe_data_get(Ecore_Exe *exe);
-   EAPI void        ecore_exe_pause(Ecore_Exe *exe);
-   EAPI void        ecore_exe_continue(Ecore_Exe *exe);
-   EAPI void        ecore_exe_interrupt(Ecore_Exe *exe);
-   EAPI void        ecore_exe_quit(Ecore_Exe *exe);
-   EAPI void        ecore_exe_terminate(Ecore_Exe *exe);
-   EAPI void        ecore_exe_kill(Ecore_Exe *exe);
-   EAPI void        ecore_exe_signal(Ecore_Exe *exe, int num);
-   EAPI void        ecore_exe_hup(Ecore_Exe *exe);
+EAPI extern int ECORE_EXE_EVENT_ADD;     /**< A child process has been added */
+EAPI extern int ECORE_EXE_EVENT_DEL;     /**< A child process has been deleted (it exited, naming consistent with the rest of ecore). */
+EAPI extern int ECORE_EXE_EVENT_DATA;    /**< Data from a child process. */
+EAPI extern int ECORE_EXE_EVENT_ERROR;    /**< Errors from a child process. */
+
+/**
+ * @enum _Ecore_Exe_Flags
+ * Flags for executing a child with its stdin and/or stdout piped back.
+ */
+enum _Ecore_Exe_Flags    /* flags for executing a child with its stdin and/or stdout piped back */
+{
+   ECORE_EXE_NONE = 0, /**< No exe flags at all */
+   ECORE_EXE_PIPE_READ = 1, /**< Exe Pipe Read mask */
+   ECORE_EXE_PIPE_WRITE = 2, /**< Exe Pipe Write mask */
+   ECORE_EXE_PIPE_ERROR = 4, /**< Exe Pipe error mask */
+   ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, /**< Reads are buffered until a newline and split 1 line per Ecore_Exe_Event_Data_Line */
+   ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, /**< Errors are buffered until a newline and split 1 line per Ecore_Exe_Event_Data_Line */
+   ECORE_EXE_PIPE_AUTO = 32, /**< stdout and stderr are buffered automatically */
+   ECORE_EXE_RESPAWN = 64, /**< FIXME: Exe is restarted if it dies */
+   ECORE_EXE_USE_SH = 128, /**< Use /bin/sh to run the command. */
+   ECORE_EXE_NOT_LEADER = 256, /**< Do not use setsid() to have the executed process be its own session leader */
+   ECORE_EXE_TERM_WITH_PARENT = 512 /**< Makes child receive SIGTERM when parent dies. */
+};
+typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
+
+/**
+ * @enum _Ecore_Exe_Win32_Priority
+ * Defines the priority of the proccess.
+ */
+enum _Ecore_Exe_Win32_Priority
+{
+   ECORE_EXE_WIN32_PRIORITY_IDLE, /**< Idle priority, for monitoring the system */
+   ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL, /**< Below default priority */
+   ECORE_EXE_WIN32_PRIORITY_NORMAL, /**< Default priority */
+   ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL, /**< Above default priority */
+   ECORE_EXE_WIN32_PRIORITY_HIGH, /**< High priority, use with care as other threads in the system will not get processor time */
+   ECORE_EXE_WIN32_PRIORITY_REALTIME     /**< Realtime priority, should be almost never used as it can interrupt system threads that manage mouse input, keyboard input, and background disk flushing */
+};
+typedef enum _Ecore_Exe_Win32_Priority Ecore_Exe_Win32_Priority;
+
+typedef struct _Ecore_Exe              Ecore_Exe; /**< A handle for spawned processes */
+
+/**
+ * @typedef Ecore_Exe_Cb Ecore_Exe_Cb
+ * A callback to run with the associated @ref Ecore_Exe, usually
+ * for cleanup purposes.
+ */
+typedef void                            (*Ecore_Exe_Cb)(void *data, const Ecore_Exe *exe);
+
+typedef struct _Ecore_Exe_Event_Add       Ecore_Exe_Event_Add; /**< Spawned Exe add event */
+typedef struct _Ecore_Exe_Event_Del       Ecore_Exe_Event_Del; /**< Spawned Exe exit event */
+typedef struct _Ecore_Exe_Event_Data_Line Ecore_Exe_Event_Data_Line; /**< Lines from a child process */
+typedef struct _Ecore_Exe_Event_Data      Ecore_Exe_Event_Data; /**< Data from a child process */
+
+struct _Ecore_Exe_Event_Add    /** Process add event */
+{
+   Ecore_Exe *exe; /**< The handle to the added process */
+   void      *ext_data; /**< Extension data - not used */
+};
+
+struct _Ecore_Exe_Event_Del    /** Process exit event */
+{
+   pid_t      pid; /**< The process ID of the process that exited */
+   int        exit_code; /**< The exit code of the process */
+   Ecore_Exe *exe; /**< The handle to the exited process, or @c NULL if not found */
+   int        exit_signal; /** < The signal that caused the process to exit */
+   Eina_Bool  exited    : 1; /** < set to 1 if the process exited of its own accord */
+   Eina_Bool  signalled : 1; /** < set to 1 id the process exited due to uncaught signal */
+   void      *ext_data; /**< Extension data - not used */
+#if !defined (_WIN32) && !defined (__lv2ppu__) && !defined (EXOTIC_NO_SIGNAL)
+   siginfo_t  data; /**< Signal info */
 #endif
+};
+
+struct _Ecore_Exe_Event_Data_Line    /**< Lines from a child process */
+{
+   char *line; /**< The bytes of a line of buffered data */
+   int   size; /**< The size of the line buffer in bytes */
+};
+
+struct _Ecore_Exe_Event_Data    /** Data from a child process event */
+{
+   Ecore_Exe                 *exe; /**< The handle to the process */
+   void                      *data; /**< the raw binary data from the child process that was received */
+   int                        size; /**< the size of this data in bytes */
+   Ecore_Exe_Event_Data_Line *lines; /**< an array of line data if line buffered, the last one has it's line member set to @c NULL */
+};
+
+EAPI void ecore_exe_run_priority_set(int pri);
+EAPI int ecore_exe_run_priority_get(void);
+EAPI Ecore_Exe *ecore_exe_run(const char *exe_cmd, const void *data);
+EAPI Ecore_Exe *ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data);
+EAPI void ecore_exe_callback_pre_free_set(Ecore_Exe *exe, Ecore_Exe_Cb func);
+EAPI Eina_Bool ecore_exe_send(Ecore_Exe *exe, const void *data, int size);
+EAPI void ecore_exe_close_stdin(Ecore_Exe *exe);
+EAPI void ecore_exe_auto_limits_set(Ecore_Exe *exe, int start_bytes, int end_bytes, int start_lines, int end_lines);
+EAPI Ecore_Exe_Event_Data *ecore_exe_event_data_get(Ecore_Exe *exe, Ecore_Exe_Flags flags);
+EAPI void ecore_exe_event_data_free(Ecore_Exe_Event_Data *data);
+EAPI void *ecore_exe_free(Ecore_Exe *exe);
+EAPI pid_t ecore_exe_pid_get(const Ecore_Exe *exe);
+EAPI void ecore_exe_tag_set(Ecore_Exe *exe, const char *tag);
+EAPI const char *ecore_exe_tag_get(const Ecore_Exe *exe);
+EAPI const char *ecore_exe_cmd_get(const Ecore_Exe *exe);
+EAPI void *ecore_exe_data_get(const Ecore_Exe *exe);
+EAPI void *ecore_exe_data_set(Ecore_Exe *exe, void *data);
+EAPI Ecore_Exe_Flags ecore_exe_flags_get(const Ecore_Exe *exe);
+EAPI void ecore_exe_pause(Ecore_Exe *exe);
+EAPI void ecore_exe_continue(Ecore_Exe *exe);
+EAPI void ecore_exe_interrupt(Ecore_Exe *exe);
+EAPI void ecore_exe_quit(Ecore_Exe *exe);
+EAPI void ecore_exe_terminate(Ecore_Exe *exe);
+EAPI void ecore_exe_kill(Ecore_Exe *exe);
+EAPI void ecore_exe_signal(Ecore_Exe *exe, int num);
+EAPI void ecore_exe_hup(Ecore_Exe *exe);
 
-   EAPI Ecore_Idler *ecore_idler_add(int (*func) (void *data), const void *data);
-   EAPI void        *ecore_idler_del(Ecore_Idler *idler);
-
-   EAPI Ecore_Idle_Enterer *ecore_idle_enterer_add(int (*func) (void *data), const void *data);
-   EAPI Ecore_Idle_Enterer *ecore_idle_enterer_before_add(int (*func) (void *data), const void *data);
-   EAPI void               *ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
-
-   EAPI Ecore_Idle_Exiter *ecore_idle_exiter_add(int (*func) (void *data), const void *data);
-   EAPI void              *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
-
-   EAPI void              ecore_main_loop_iterate(void);
-   EAPI void              ecore_main_loop_begin(void);
-   EAPI void              ecore_main_loop_quit(void);
-   EAPI Ecore_Fd_Handler *ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, int (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data, int (*buf_func) (void *buf_data, Ecore_Fd_Handler *fd_handler), const void *buf_data);
-   EAPI void              ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, void (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data);
-   EAPI void             *ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler);
-   EAPI int               ecore_main_fd_handler_fd_get(Ecore_Fd_Handler *fd_handler);
-   EAPI int               ecore_main_fd_handler_active_get(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags);
-   EAPI void              ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags);
-
-   EAPI double ecore_time_get(void);
-
-   EAPI Ecore_Timer *ecore_timer_add(double in, int (*func) (void *data), const void *data);
-   EAPI void        *ecore_timer_del(Ecore_Timer *timer);
-   EAPI void         ecore_timer_interval_set(Ecore_Timer *timer, double in);
-   EAPI void         ecore_timer_freeze(Ecore_Timer *timer);
-   EAPI void         ecore_timer_thaw(Ecore_Timer *timer);
-   EAPI void         ecore_timer_delay(Ecore_Timer *timer, double add);
-   EAPI double       ecore_timer_pending_get(Ecore_Timer *timer);
-
-   EAPI Ecore_Animator *ecore_animator_add(int (*func) (void *data), const void *data);
-   EAPI void           *ecore_animator_del(Ecore_Animator *animator);
-   EAPI void            ecore_animator_frametime_set(double frametime);
-   EAPI double          ecore_animator_frametime_get(void);
-
-   EAPI void          ecore_poller_poll_interval_set(Ecore_Poller_Type type, double poll_time);
-   EAPI double        ecore_poller_poll_interval_get(Ecore_Poller_Type type);
-   EAPI Ecore_Poller *ecore_poller_add(Ecore_Poller_Type type, int interval, int (*func) (void *data), const void *data);
-   EAPI void         *ecore_poller_del(Ecore_Poller *poller);
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_FD_Handler_Group File Descriptor Handling Functions
+ *
+ * @brief Functions that deal with file descriptor handlers.
+ *
+ * File descriptor handlers facilitate reading, writing and checking for errors
+ * without blocking the program or doing expensive pooling. This can be used to
+ * monitor a socket, pipe, or other stream for which an FD can be had.
+ *
+ * @warning File descriptor handlers can't be used to monitor for file creation,
+ * modification or deletion, see @ref Ecore_File_Group for this.
+ *
+ * One common FD to be monitored is the standard input(stdin), monitoring it for
+ * reading requires a single call:
+ * @code
+ * static Eina_Bool
+ * _my_cb_func(void *data, Ecore_Fd_Handler *handler)
+ * {
+ *    char c;
+ *    scanf("%c", &c); //Guaranteed not to block
+ *    ... do stuff with c ...
+ * }
+ * ecore_main_fd_handler_add(STDIN_FILENO, ECORE_FD_READ, _my_cb_func, NULL, NULL, NULL);
+ * @endcode
+ *
+ * When using a socket, pipe or other stream it's important to remember that
+ * errors may occur and as such to monitor not only for reading/writing but also
+ * for errors using the @ref ECORE_FD_ERROR flag.
+ *
+ * Example of use of a file descriptor handler:
+ * @li @ref ecore_fd_handler_example_c
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+typedef struct _Ecore_Fd_Handler Ecore_Fd_Handler; /**< A handle for Fd handlers */
 
+/**
+ * @enum _Ecore_Fd_Handler_Flags
+ * What to monitor the file descriptor for: reading, writing or error.
+ */
+enum _Ecore_Fd_Handler_Flags
+{
+   ECORE_FD_READ = 1, /**< Fd Read mask */
+   ECORE_FD_WRITE = 2, /**< Fd Write mask */
+   ECORE_FD_ERROR = 4 /**< Fd Error mask */
+};
+typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags;
+
+/**
+ * @typedef Ecore_Fd_Cb Ecore_Fd_Cb
+ * A callback used by an @ref Ecore_Fd_Handler.
+ */
+typedef Eina_Bool (*Ecore_Fd_Cb)(void *data, Ecore_Fd_Handler *fd_handler);
+
+/**
+ * @typedef Ecore_Fd_Prep_Cb Ecore_Fd_Prep_Cb
+ * A callback used by an @ref Ecore_Fd_Handler.
+ */
+typedef void (*Ecore_Fd_Prep_Cb)(void *data, Ecore_Fd_Handler *fd_handler);
+
+/**
+ * @typedef Ecore_Win32_Handle_Cb Ecore_Win32_Handle_Cb
+ * A callback used by an @ref Ecore_Win32_Handler.
+ */
+typedef Eina_Bool (*Ecore_Win32_Handle_Cb)(void *data, Ecore_Win32_Handler *wh);
+
+/**
+ * @brief Adds a callback for activity on the given file descriptor.
+ *
+ * @param fd The file descriptor to watch.
+ * @param flags To monitor it for reading use @c ECORE_FD_READ, for writing @c
+ * ECORE_FD_WRITE, and for error @c ECORE_FD_ERROR. Values by |(ored).
+ * @param func The callback function.
+ * @param data The data to pass to the callback.
+ * @param buf_func The function to call to check if any data has been buffered
+ * and already read from the fd. May be @c NULL.
+ * @param buf_data The data to pass to the @p buf_func function.
+ * @return A fd handler handle on success, @c NULL otherwise.
+ *
+ * @a func will be called during the execution of @ref Ecore_Main_Loop_Page
+ * when the file descriptor is available for reading, writing, or there has been
+ * an error(depending on the given @a flags).
+ *
+ * When @a func returns ECORE_CALLBACK_CANCEL, it indicates that the
+ * handler should be marked for deletion (identical to calling @ref
+ * ecore_main_fd_handler_del).
+ *
+ * @warning @a buf_func is meant for @b internal use only and should be @b
+ * avoided.
+ *
+ * The return value of @a buf_func has a different meaning, when it returns
+ * ECORE_CALLBACK_CANCEL, it indicates that @a func @b shouldn't be called, and
+ * when it returns ECORE_CALLBACK_RENEW it indicates @a func should be called.
+ * The return value of @a buf_func will not cause the FD handler to be deleted.
+ *
+ * @a buf_func is called during event loop handling to check if data that has
+ * been read from the file descriptor is in a buffer and is available to read.
+ * Some systems, notably xlib, handle their own buffering, and would otherwise
+ * not work with select(). These systems should use a @a buf_func. This is a
+ * most annoying hack, only ecore_x uses it, so refer to that for an example.
+ *
+ * @warning This function should @b not be used for monitoring "normal" files, like text files.
+ *
+ */
+EAPI Ecore_Fd_Handler *ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, Ecore_Fd_Cb func, const void *data, Ecore_Fd_Cb buf_func, const void *buf_data);
+
+/**
+ * @brief Adds a callback for activity on the given file descriptor.
+ *
+ * @param fd The file descriptor to watch.
+ * @param flags To monitor it for reading use @c ECORE_FD_READ, for writing @c
+ * ECORE_FD_WRITE, and for error @c ECORE_FD_ERROR. Values by |(ored).
+ * @param func The callback function.
+ * @param data The data to pass to the callback.
+ * @param buf_func The function to call to check if any data has been buffered
+ * and already read from the fd. May be @c NULL.
+ * @param buf_data The data to pass to the @p buf_func function.
+ * @return A fd handler handle on success, @c NULL otherwise.
+ *
+ * This function is identical to ecore_main_fd_handler_add, except that it supports regular files.
+ * @warning This function should ONLY be called with ECORE_FD_ERROR, otherwise it will call the fd
+ * handler constantly.
+ * @warning Do not use this function unless you know what you are doing.
+ *
+ * @since 1.7
+ */
+EAPI Ecore_Fd_Handler *ecore_main_fd_handler_file_add(int fd, Ecore_Fd_Handler_Flags flags, Ecore_Fd_Cb func, const void *data, Ecore_Fd_Cb buf_func, const void *buf_data);
+
+/**
+ * @brief Set the prepare callback with data for a given #Ecore_Fd_Handler
+ *
+ * @param fd_handler The fd handler
+ * @param func The prep function
+ * @param data The data to pass to the prep function
+ *
+ * This function will be called prior to any fd handler's callback function
+ * (even the other fd handlers), before entering the main loop select function.
+ *
+ * @note Once a prepare callback is set for a fd handler, it cannot be changed.
+ * You need to delete the fd handler and create a new one, to set another
+ * callback.
+ * @note You probably don't need this function. It is only necessary for very
+ * uncommon cases that need special behavior.
+ */
+EAPI void ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Prep_Cb func, const void *data);
+/**
+ * @brief Marks an FD handler for deletion.
+ * @param fd_handler The FD handler.
+ * @return The data pointer set using @ref ecore_main_fd_handler_add, for
+ * @a fd_handler on success, @c NULL otherwise.
+ * This function marks an fd handler to be deleted during an iteration of the
+ * main loop. It does NOT close the associated fd!
+ *
+ * @warning If the underlying fd is already closed ecore may complain if the
+ * main loop is using epoll internally, and also in some rare cases this may
+ * cause crashes and instability. Remember to delete your fd handlers before the
+ * fds they listen to are closed.
+ */
+EAPI void *ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler);
+/**
+ * @brief Retrieves the file descriptor that the given handler is handling.
+ * @param fd_handler The given FD handler.
+ * @return The file descriptor the handler is watching.
+ */
+EAPI int ecore_main_fd_handler_fd_get(Ecore_Fd_Handler *fd_handler);
+/**
+ * @brief Gets which flags are active on an FD handler.
+ * @param fd_handler The given FD handler.
+ * @param flags The flags, @c ECORE_FD_READ, @c ECORE_FD_WRITE or
+ * @c ECORE_FD_ERROR to query.
+ * @return @c EINA_TRUE if any of the given flags are active, @c EINA_FALSE
+ * otherwise.
+ */
+EAPI Eina_Bool ecore_main_fd_handler_active_get(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags);
+/**
+ * @brief Set what active streams the given FD handler should be monitoring.
+ * @param fd_handler The given FD handler.
+ * @param flags The flags to be watching.
+ */
+EAPI void ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags);
+
+EAPI Ecore_Win32_Handler *ecore_main_win32_handler_add(void *h, Ecore_Win32_Handle_Cb func, const void *data);
+EAPI void *ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Poller_Group Ecore Poll functions
+ *
+ * Ecore poller provides infrastructure for the creation of pollers. Pollers
+ * are, in essence, callbacks that share a single timer per type. Because not
+ * all pollers need to be called at the same frequency the user may specify the
+ * frequency in ticks(each expiration of the shared timer is called a tick, in
+ * ecore poller parlance) for each added poller. Ecore pollers should only be
+ * used when the poller doesn't have specific requirements on the exact times
+ * to poll.
+ *
+ * This architecture means that the main loop is only woken up once to handle
+ * all pollers of that type, this will save power as the CPU has more of a
+ * chance to go into a low power state the longer it is asleep for, so this
+ * should be used in situations where power usage is a concern.
+ *
+ * For now only 1 core poller type is supported: ECORE_POLLER_CORE, the default
+ * interval for ECORE_POLLER_CORE is 0.125(or 1/8th) second.
+ *
+ * The creation of a poller is extremely simple and only requires one line:
+ * @code
+ * ecore_poller_add(ECORE_POLLER_CORE, 1, my_poller_function, NULL);
+ * @endcode
+ * This sample creates a poller to call @c my_poller_function at every tick with
+ * @c NULL as data.
+ *
+ * Example:
+ * @li @ref ecore_poller_example_c
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+/**
+ * @enum _Ecore_Poller_Type
+ * Defines the frequency of ticks for the poller.
+ */
+enum _Ecore_Poller_Type    /* Poller types */
+{
+   ECORE_POLLER_CORE = 0 /**< The core poller interval */
+};
+typedef enum _Ecore_Poller_Type Ecore_Poller_Type;
+
+typedef struct _Ecore_Poller    Ecore_Poller; /**< A handle for pollers */
+
+/**
+ * @brief Sets the time(in seconds) between ticks for the given poller type.
+ * @param type The poller type to adjust.
+ * @param poll_time The time(in seconds) between ticks of the timer.
+ *
+ * This will adjust the time between ticks of the given timer type defined by
+ * @p type to the time period defined by @p poll_time.
+ */
+EAPI void ecore_poller_poll_interval_set(Ecore_Poller_Type type, double poll_time);
+/**
+ * @brief Gets the time(in seconds) between ticks for the given poller type.
+ * @param type The poller type to query.
+ * @return The time in seconds between ticks of the poller timer.
+ *
+ * This will get the time between ticks of the specified poller timer.
+ */
+EAPI double ecore_poller_poll_interval_get(Ecore_Poller_Type type);
+/**
+ * @brief Changes the polling interval rate of @p poller.
+ * @param poller The Ecore_Poller to change the interval of.
+ * @param interval The tick interval to set; must be a power of 2 and <= 32768.
+ * @return Returns true on success, false on failure.
+ *
+ * This allows the changing of a poller's polling interval. It is useful when
+ * you want to alter a poll rate without deleting and re-creating a poller.
+ */
+EAPI Eina_Bool ecore_poller_poller_interval_set(Ecore_Poller *poller, int interval);
+/**
+ * @brief Gets the polling interval rate of @p poller.
+ * @param poller The Ecore_Poller to change the interval of.
+ * @return Returns the interval, in ticks, that @p poller polls at.
+ *
+ * This returns a poller's polling interval, or 0 on error.
+ */
+EAPI int ecore_poller_poller_interval_get(Ecore_Poller *poller);
+/**
+ * @brief Creates a poller to call the given function at a particular tick interval.
+ * @param type The ticker type to attach the poller to. Must be ECORE_POLLER_CORE.
+ * @param interval The poll interval.
+ * @param func The poller function.
+ * @param data Data to pass to @a func when it is called.
+ * @return A poller object on success, @c NULL otherwise.
+ *
+ * This function adds @a func as a poller callback that will be called every @a
+ * interval ticks together with other pollers of type @a type. @a func will be
+ * passed the @p data pointer as a parameter.
+ *
+ * The @p interval must be between 1 and 32768 inclusive, and must be a power of
+ * 2 (i.e. 1, 2, 4, 8, 16, ... 16384, 32768). The exact tick in which @a func
+ * will be called is undefined, as only the interval between calls can be
+ * defined. Ecore will endeavor to keep pollers synchronized and to call as
+ * many in 1 wakeup event as possible. If @a interval is not a power of two, the
+ * closest power of 2 greater than @a interval will be used.
+ *
+ * When the poller @p func is called, it must return a value of either
+ * ECORE_CALLBACK_RENEW(or 1) or ECORE_CALLBACK_CANCEL(or 0). If it
+ * returns 1, it will be called again at the next tick, or if it returns
+ * 0 it will be deleted automatically making any references/handles for it
+ * invalid.
+ */
+EAPI Ecore_Poller *ecore_poller_add(Ecore_Poller_Type type, int interval, Ecore_Task_Cb func, const void *data);
+/**
+ * @brief Delete the specified poller from the timer list.
+ * @param poller The poller to delete.
+ * @return The data pointer set for the timer when @ref ecore_poller_add was
+ * called on success, @c NULL otherwise.
+ *
+ * @note @a poller must be a valid handle. If the poller function has already
+ * returned 0, the handle is no longer valid (and does not need to be deleted).
+ */
+EAPI void *ecore_poller_del(Ecore_Poller *poller);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Animator_Group Ecore Animator functions
+ *
+ * @brief Ecore animators are a helper to simplify creating
+ * animations.
+ *
+ * Creating an animation is as simple as saying for how long it
+ * should be run and having a callback that does the animation,
+ * something like this:
+ * @code
+ * static Eina_Bool
+ * _do_animation(void *data, double pos)
+ * {
+ *    evas_object_move(data, 100 * pos, 100 * pos);
+ *    ... do some more animating ...
+ * }
+ * ...
+ *ecore_animator_timeline_add(2, _do_animation, my_evas_object);
+ * @endcode
+ * In the sample above we create an animation to move
+ * @c my_evas_object from position (0,0) to (100,100) in 2 seconds.
+ *
+ * If your animation will run for an unspecified amount of time you
+ * can use ecore_animator_add(), which is like using
+ *ecore_timer_add() with the interval being the
+ * @ref ecore_animator_frametime_set "framerate". Note that this has
+ * tangible benefits to creating a timer for each animation in terms
+ * of performance.
+ *
+ * For a more detailed example that show several animation see
+ * @ref tutorial_ecore_animator.
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+typedef struct _Ecore_Animator Ecore_Animator; /**< A handle for animators */
+
+/**
+ * @enum _Ecore_Pos_Map
+ * Defines the position mappings for the animation.
+ */
+enum _Ecore_Pos_Map    /* Position mappings */
+{
+   ECORE_POS_MAP_LINEAR, /**< Linear 0.0 -> 1.0 */
+   ECORE_POS_MAP_ACCELERATE, /**< Start slow then speed up */
+   ECORE_POS_MAP_DECELERATE, /**< Start fast then slow down */
+   ECORE_POS_MAP_SINUSOIDAL, /**< Start slow, speed up then slow down at end */
+   ECORE_POS_MAP_ACCELERATE_FACTOR, /**< Start slow then speed up, v1 being a power factor, 0.0 being linear, 1.0 being normal accelerate, 2.0 being much more pronounced accelerate (squared), 3.0 being cubed, etc. */
+   ECORE_POS_MAP_DECELERATE_FACTOR, /**< Start fast then slow down, v1 being a power factor, 0.0 being linear, 1.0 being normal decelerate, 2.0 being much more pronounced decelerate (squared), 3.0 being cubed, etc. */
+   ECORE_POS_MAP_SINUSOIDAL_FACTOR, /**< Start slow, speed up then slow down at end, v1 being a power factor, 0.0 being linear, 1.0 being normal sinusoidal, 2.0 being much more pronounced sinusoidal (squared), 3.0 being cubed, etc. */
+   ECORE_POS_MAP_DIVISOR_INTERP, /**< Start at gradient * v1, interpolated via power of v2 curve */
+   ECORE_POS_MAP_BOUNCE, /**< Start at 0.0 then "drop" like a ball bouncing to the ground at 1.0, and bounce v2 times, with decay factor of v1 */
+   ECORE_POS_MAP_SPRING /**< Start at 0.0 then "wobble" like a spring rest position 1.0, and wobble v2 times, with decay factor of v1 */
+};
+typedef enum _Ecore_Pos_Map Ecore_Pos_Map;
+
+/**
+ * @enum _Ecore_Animator_Source
+ * Defines the timing sources for animators.
+ */
+enum _Ecore_Animator_Source    /* Timing sources for animators */
+{
+   ECORE_ANIMATOR_SOURCE_TIMER, /**< The default system clock/timer based animator that ticks every "frametime" seconds */
+   ECORE_ANIMATOR_SOURCE_CUSTOM /**< A custom animator trigger that you need to call ecore_animator_trigger() to make it tick */
+};
+typedef enum _Ecore_Animator_Source Ecore_Animator_Source;
+
+/**
+ * @typedef Ecore_Timeline_Cb Ecore_Timeline_Cb
+ * A callback run for a task (animators with runtimes)
+ */
+typedef Eina_Bool (*Ecore_Timeline_Cb)(void *data, double pos);
+
+/**
+ * @brief Add an animator to call @p func at every animation tick during main
+ * loop execution.
+ *
+ * @param func The function to call when it ticks off
+ * @param data The data to pass to the function
+ * @return A handle to the new animator
+ *
+ * This function adds a animator and returns its handle on success and @c NULL
+ * on failure. The function @p func will be called every N seconds where N is
+ * the @p frametime interval set by ecore_animator_frametime_set(). The
+ * function will be passed the @p data pointer as its parameter.
+ *
+ * When the animator @p func is called, it must return a value of either 1 or
+ * 0. If it returns 1 (or ECORE_CALLBACK_RENEW), it will be called again at
+ * the next tick, or if it returns 0 (or ECORE_CALLBACK_CANCEL) it will be
+ * deleted automatically making any references/handles for it invalid.
+ *
+ * @note The default @p frametime value is 1/30th of a second.
+ *
+ * @see ecore_animator_timeline_add()
+ * @see ecore_animator_frametime_set()
+ */
+EAPI Ecore_Animator *ecore_animator_add(Ecore_Task_Cb func, const void *data);
+/**
+ * @brief Add a animator that runs for a limited time
+ *
+ * @param runtime The time to run in seconds
+ * @param func The function to call when it ticks off
+ * @param data The data to pass to the function
+ * @return A handle to the new animator
+ *
+ * This function is just like ecore_animator_add() except the animator only
+ * runs for a limited time specified in seconds by @p runtime. Once the
+ * runtime the animator has elapsed (animator finished) it will automatically
+ * be deleted. The callback function @p func can return ECORE_CALLBACK_RENEW
+ * to keep the animator running or ECORE_CALLBACK_CANCEL ro stop it and have
+ * it be deleted automatically at any time.
+ *
+ * The @p func will ALSO be passed a position parameter that will be in value
+ * from 0.0 to 1.0 to indicate where along the timeline (0.0 start, 1.0 end)
+ * the animator run is at. If the callback wishes not to have a linear
+ * transition it can "map" this value to one of several curves and mappings
+ * via ecore_animator_pos_map().
+ *
+ * @note The default @p frametime value is 1/30th of a second.
+ *
+ * @see ecore_animator_add()
+ * @see ecore_animator_pos_map()
+ * @since 1.1.0
+ */
+EAPI Ecore_Animator *ecore_animator_timeline_add(double runtime, Ecore_Timeline_Cb func, const void *data);
+/**
+ * @brief Delete the specified animator from the animator list.
+ *
+ * @param animator The animator to delete
+ * @return The data pointer set for the animator on add
+ *
+ * Delete the specified @p animator from the set of animators that are
+ * executed during main loop execution. This function returns the data
+ * parameter that was being passed to the callback on success, or @c NULL on
+ * failure. After this call returns the specified animator object @p animator
+ * is invalid and should not be used again. It will not get called again after
+ * deletion.
+ */
+EAPI void *ecore_animator_del(Ecore_Animator *animator);
+/**
+ * @brief Suspend the specified animator.
+ *
+ * @param animator The animator to delete
+ *
+ * The specified @p animator will be temporarily removed from the set of
+ * animators that are executed during main loop.
+ *
+ * @warning Freezing an animator doesn't freeze accounting of how long that
+ * animator has been running. Therefore if the animator was created with
+ *ecore_animator_timeline_add() the @p pos argument given to the callback
+ * will increase as if the animator hadn't been frozen and the animator may
+ * have it's execution halted if @p runtime elapsed.
+ */
+EAPI void ecore_animator_freeze(Ecore_Animator *animator);
+/**
+ * @brief Restore execution of the specified animator.
+ *
+ * @param animator The animator to delete
+ *
+ * The specified @p animator will be put back in the set of animators that are
+ * executed during main loop.
+ */
+EAPI void ecore_animator_thaw(Ecore_Animator *animator);
+/**
+ * @brief Set the animator call interval in seconds.
+ *
+ * @param frametime The time in seconds in between animator ticks.
+ *
+ * This function sets the time interval (in seconds) between animator ticks.
+ * At every tick the callback of every existing animator will be called.
+ *
+ * @warning Too small a value may cause performance issues and too high a
+ * value may cause your animation to seem "jerky".
+ *
+ * @note The default @p frametime value is 1/30th of a second.
+ */
+EAPI void ecore_animator_frametime_set(double frametime);
+/**
+ * @brief Get the animator call interval in seconds.
+ *
+ * @return The time in second in between animator ticks.
+ *
+ * This function retrieves the time in seconds between animator ticks.
+ *
+ * @see ecore_animator_frametime_set()
+ */
+EAPI double ecore_animator_frametime_get(void);
+/**
+ * @brief Maps an input position from 0.0 to 1.0 along a timeline to a
+ * position in a different curve.
+ *
+ * @param pos The input position to map
+ * @param map The mapping to use
+ * @param v1 A parameter use by the mapping (pass 0.0 if not used)
+ * @param v2 A parameter use by the mapping (pass 0.0 if not used)
+ * @return The mapped value
+ *
+ * Takes an input position (0.0 to 1.0) and maps to a new position (normally
+ * between 0.0 and 1.0, but it may go above/below 0.0 or 1.0 to show that it
+ * has "overshot" the mark) using some interpolation (mapping) algorithm.
+ *
+ * This function useful to create non-linear animations. It offers a variety
+ * of possible animation curves to be used:
+ * @li ECORE_POS_MAP_LINEAR - Linear, returns @p pos
+ * @li ECORE_POS_MAP_ACCELERATE - Start slow then speed up
+ * @li ECORE_POS_MAP_DECELERATE - Start fast then slow down
+ * @li ECORE_POS_MAP_SINUSOIDAL - Start slow, speed up then slow down at end
+ * @li ECORE_POS_MAP_ACCELERATE_FACTOR - Start slow then speed up, v1 being a
+ * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_ACCELERATE, 2.0
+ * being much more pronounced accelerate (squared), 3.0 being cubed, etc.
+ * @li ECORE_POS_MAP_DECELERATE_FACTOR - Start fast then slow down, v1 being a
+ * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_DECELERATE, 2.0
+ * being much more pronounced decelerate (squared), 3.0 being cubed, etc.
+ * @li ECORE_POS_MAP_SINUSOIDAL_FACTOR - Start slow, speed up then slow down
+ * at end, v1 being a power factor, 0.0 being linear, 1.0 being
+ * ECORE_POS_MAP_SINUSOIDAL, 2.0 being much more pronounced sinusoidal
+ * (squared), 3.0 being cubed, etc.
+ * @li ECORE_POS_MAP_DIVISOR_INTERP - Start at gradient * v1, interpolated via
+ * power of v2 curve
+ * @li ECORE_POS_MAP_BOUNCE - Start at 0.0 then "drop" like a ball bouncing to
+ * the ground at 1.0, and bounce v2 times, with decay factor of v1
+ * @li ECORE_POS_MAP_SPRING - Start at 0.0 then "wobble" like a spring rest
+ * position 1.0, and wobble v2 times, with decay factor of v1
+ * @note When not listed v1 and v2 have no effect.
+ *
+ * @image html ecore-pos-map.png
+ * @image latex ecore-pos-map.eps width=\textwidth
+ *
+ * One way to use this would be:
+ * @code
+ * double pos; // input position in a timeline from 0.0 to 1.0
+ * double out; // output position after mapping
+ * int x1, y1, x2, y2; // x1 & y1 are start position, x2 & y2 are end position
+ * int x, y; // x & y are the calculated position
+ *
+ * out = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 1.8, 7);
+ * x = (x1 * out) + (x2 * (1.0 - out));
+ * y = (y1 * out) + (y2 * (1.0 - out));
+ * move_my_object_to(myobject, x, y);
+ * @endcode
+ * This will make an animation that bounces 7 each times diminishing by a
+ * factor of 1.8.
+ *
+ * @see _Ecore_Pos_Map
+ *
+ * @since 1.1.0
+ */
+EAPI double ecore_animator_pos_map(double pos, Ecore_Pos_Map map, double v1, double v2);
+/**
+ * @brief Set the source of animator ticks for the mainloop
+ *
+ * @param source The source of animator ticks to use
+ *
+ * This sets the source of animator ticks. When an animator is active the
+ * mainloop will "tick" over frame by frame calling all animators that are
+ * registered until none are. The mainloop will tick at a given rate based
+ * on the animator source. The default source is the system clock timer
+ * source - ECORE_ANIMATOR_SOURCE_TIMER. This source uses the system clock
+ * to tick over every N seconds (specified by ecore_animator_frametime_set(),
+ * with the default being 1/30th of a second unless set otherwise). You can
+ * set a custom tick source by setting the source to
+ * ECORE_ANIMATOR_SOURCE_CUSTOM and then drive it yourself based on some input
+ * tick source (like another application via ipc, some vertical blanking
+ * interrupt interrupt etc.) using
+ *ecore_animator_custom_source_tick_begin_callback_set() and
+ *ecore_animator_custom_source_tick_end_callback_set() to set the functions
+ * that will be called to start and stop the ticking source, which when it
+ * gets a "tick" should call ecore_animator_custom_tick() to make the "tick" over 1
+ * frame.
+ */
+EAPI void ecore_animator_source_set(Ecore_Animator_Source source);
+/**
+ * @brief Get the animator source currently set.
+ *
+ * @return The current animator source
+ *
+ * This gets the current animator source.
+ *
+ * @see ecore_animator_source_set()
+ */
+EAPI Ecore_Animator_Source ecore_animator_source_get(void);
+/**
+ * @brief Set the function that begins a custom animator tick source
+ *
+ * @param func The function to call when ticking is to begin
+ * @param data The data passed to the tick begin function as its parameter
+ *
+ * The Ecore Animator infrastructure handles tracking if animators are needed
+ * or not and which ones need to be called and when, but when the tick source
+ * is custom, you have to provide a tick source by calling
+ *ecore_animator_custom_tick() to indicate a frame tick happened. In order
+ * to allow the source of ticks to be dynamically enabled or disabled as
+ * needed, the @p func when set is called to enable the tick source to
+ * produce tick events that call ecore_animator_custom_tick(). If @p func
+ * is @c NULL then no function is called to begin custom ticking.
+ *
+ * @see ecore_animator_source_set()
+ * @see ecore_animator_custom_source_tick_end_callback_set()
+ * @see ecore_animator_custom_tick()
+ */
+EAPI void ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func, const void *data);
+/**
+ * @brief Set the function that ends a custom animator tick source
+ *
+ * @param func The function to call when ticking is to end
+ * @param data The data passed to the tick end function as its parameter
+ *
+ * This function is a matching pair to the function set by
+ * ecore_animator_custom_source_tick_begin_callback_set() and is called
+ * when ticking is to stop. If @p func is @c NULL then no function will be
+ * called to stop ticking. For more information please see
+ * ecore_animator_custom_source_tick_begin_callback_set().
+ *
+ * @see ecore_animator_source_set()
+ * @see ecore_animator_custom_source_tick_begin_callback_set()
+ * @see ecore_animator_custom_tick()
+ */
+EAPI void ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func, const void *data);
+/**
+ * @brief Trigger a custom animator tick
+ *
+ * When animator source is set to ECORE_ANIMATOR_SOURCE_CUSTOM, then calling
+ * this function triggers a run of all animators currently registered with
+ * Ecore as this indicates a "frame tick" happened. This will do nothing if
+ * the animator source(set by ecore_animator_source_set()) is not set to
+ * ECORE_ANIMATOR_SOURCE_CUSTOM.
+ *
+ * @see ecore_animator_source_set()
+ * @see ecore_animator_custom_source_tick_begin_callback_set
+ * @see ecore_animator_custom_source_tick_end_callback_set()()
+ */
+EAPI void ecore_animator_custom_tick(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Time_Group Ecore time functions
+ *
+ * These are function to retrieve time in a given format.
+ *
+ * Examples:
+ * @li @ref ecore_time_functions_example_c
+ * @{
+ */
+EAPI double ecore_time_get(void);
+EAPI double ecore_time_unix_get(void);
+EAPI double ecore_loop_time_get(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Timer_Group Ecore Timer functions
+ *
+ * Ecore provides very flexible timer functionality. The basic usage of timers,
+ * to call a certain function at a certain interval can be achieved with a
+ * single line:
+ * @code
+ * Eina_Bool my_func(void *data) {
+ *    do_funky_stuff_with_data(data);
+ *    return EINA_TRUE;
+ * }
+ * ecore_timer_add(interval_in_seconds, my_func, data_given_to_function);
+ * @endcode
+ * @note If the function was to be executed only once simply return
+ * @c EINA_FALSE instead.
+ *
+ * An example that shows the usage of a lot of these:
+ * @li @ref ecore_timer_example_c
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+typedef struct _Ecore_Timer Ecore_Timer; /**< A handle for timers */
+
+EAPI Ecore_Timer *ecore_timer_add(double in, Ecore_Task_Cb func, const void *data);
+EAPI Ecore_Timer *ecore_timer_loop_add(double in, Ecore_Task_Cb func, const void *data);
+EAPI void *ecore_timer_del(Ecore_Timer *timer);
+EAPI void ecore_timer_interval_set(Ecore_Timer *timer, double in);
+EAPI double ecore_timer_interval_get(Ecore_Timer *timer);
+EAPI void ecore_timer_freeze(Ecore_Timer *timer);
+EAPI void ecore_timer_thaw(Ecore_Timer *timer);
+EAPI void ecore_timer_delay(Ecore_Timer *timer, double add);
+EAPI void ecore_timer_reset(Ecore_Timer *timer);
+EAPI double ecore_timer_pending_get(Ecore_Timer *timer);
+EAPI double ecore_timer_precision_get(void);
+EAPI void ecore_timer_precision_set(double precision);
+EAPI char *ecore_timer_dump(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Idle_Group Ecore Idle functions
+ *
+ * The idler functionality in Ecore allows for callbacks to be called when the
+ * program isn't handling @ref Ecore_Event_Group "events", @ref Ecore_Timer_Group
+ * "timers" or @ref Ecore_FD_Handler_Group "fd handlers".
+ *
+ * There are three types of idlers: Enterers, Idlers(proper) and Exiters. They
+ * are called, respectively, when the program is about to enter an idle state,
+ * when the program is in an idle state and when the program has just left an
+ * idle state and will begin processing @ref Ecore_Event_Group "events", @ref
+ * Ecore_Timer_Group "timers" or @ref Ecore_FD_Handler_Group "fd handlers".
+ *
+ * Enterer callbacks are good for updating your program's state, if
+ * it has a state engine.  Once all of the enterer handlers are
+ * called, the program will enter a "sleeping" state.
+ *
+ * Idler callbacks are called when the main loop has called all
+ * enterer handlers.  They are useful for interfaces that require
+ * polling and timers would be too slow to use.
+ *
+ * Exiter callbacks are called when the main loop wakes up from an idle state.
+ *
+ * If no idler callbacks are specified, then the process literally
+ * goes to sleep.  Otherwise, the idler callbacks are called
+ * continuously while the loop is "idle", using as much CPU as is
+ * available to the process.
+ *
+ * @note Idle state doesn't mean that the @b program is idle, but
+ * that the <b>main loop</b> is idle. It doesn't have any timers,
+ * events, fd handlers or anything else to process (which in most
+ * <em>event driven</em> programs also means that the @b program is
+ * idle too, but it's not a rule). The program itself may be doing
+ * a lot of processing in the idler, or in another thread, for
+ * example.
+ *
+ * Example with functions that deal with idle state:
+ *
+ * @li @ref ecore_idler_example_c
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+typedef struct _Ecore_Idler        Ecore_Idler; /**< A handle for idlers */
+typedef struct _Ecore_Idle_Enterer Ecore_Idle_Enterer; /**< A handle for idle enterers */
+typedef struct _Ecore_Idle_Exiter  Ecore_Idle_Exiter; /**< A handle for idle exiters */
+
+/**
+ * Add an idler handler.
+ * @param  func The function to call when idling.
+ * @param  data The data to be passed to this @p func call.
+ * @return A idler handle if successfully added, @c NULL otherwise.
+ *
+ * Add an idler handle to the event loop, returning a handle on
+ * success and @c NULL otherwise. The function @p func will be called
+ * repeatedly while no other events are ready to be processed, as
+ * long as it returns @c 1 (or ECORE_CALLBACK_RENEW). A return of @c 0
+ * (or ECORE_CALLBACK_CANCEL) deletes the idler.
+ *
+ * Idlers are useful for progressively prossessing data without blocking.
+ */
+EAPI Ecore_Idler *ecore_idler_add(Ecore_Task_Cb func, const void *data);
+
+/**
+ * Delete an idler callback from the list to be executed.
+ * @param  idler The handle of the idler callback to delete
+ * @return The data pointer passed to the idler callback on success, @c NULL
+ *         otherwise.
+ */
+EAPI void *ecore_idler_del(Ecore_Idler *idler);
+
+EAPI Ecore_Idle_Enterer *ecore_idle_enterer_add(Ecore_Task_Cb func, const void *data);
+EAPI Ecore_Idle_Enterer *ecore_idle_enterer_before_add(Ecore_Task_Cb func, const void *data);
+EAPI void *ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
+
+EAPI Ecore_Idle_Exiter *ecore_idle_exiter_add(Ecore_Task_Cb func, const void *data);
+EAPI void *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Thread_Group Ecore Thread functions
+ *
+ * Facilities to run heavy tasks in different threads to avoid blocking
+ * the main loop.
+ *
+ * The EFL is, for the most part, not thread safe. This means that if you
+ * have some task running in another thread and you have, for example, an
+ * Evas object to show the status progress of this task, you cannot update
+ * the object from within the thread. This can only be done from the main
+ * thread, the one running the main loop. This problem can be solved
+ * by running a thread that sends messages to the main one using an
+ * @ref Ecore_Pipe_Group "Ecore_Pipe", but when you need to handle other
+ * things like cancelling the thread, your code grows in complexity and gets
+ * much harder to maintain.
+ *
+ * Ecore Thread is here to solve that problem. It is @b not a simple wrapper
+ * around standard POSIX threads (or the equivalent in other systems) and
+ * it's not meant to be used to run parallel tasks throughout the entire
+ * duration of the program, especially when these tasks are performance
+ * critical, as Ecore manages these tasks using a pool of threads based on
+ * system configuration.
+ *
+ * What Ecore Thread does, is make it a lot easier to dispatch a worker
+ * function to perform some heavy task and then get the result once it
+ * completes, without blocking the application's UI. In addition, cancelling
+ * and rescheduling comes practically for free and the developer needs not
+ * worry about how many threads are launched, since Ecore will schedule
+ * them according to the number of processors the system has and maximum
+ * amount of concurrent threads set for the application.
+ *
+ * At the system level, Ecore will start a new thread on an as-needed basis
+ * until the maximum set is reached. When no more threads can be launched,
+ * new worker functions will be queued in a waiting list until a thread
+ * becomes available. This way, system threads will be shared throughout
+ * different worker functions, but running only one at a time. At the same
+ * time, a worker function that is rescheduled may be run on a different
+ * thread the next time.
+ *
+ * The ::Ecore_Thread handler has two meanings, depending on what context
+ * it is on. The one returned when starting a worker with any of the
+ * functions ecore_thread_run() or ecore_thread_feedback_run() is an
+ * identifier of that specific instance of the function and can be used from
+ * the main loop with the ecore_thread_cancel() and ecore_thread_check()
+ * functions. This handler must not be shared with the worker function
+ * function running in the thread. This same handler will be the one received
+ * on the @c end, @c cancel and @c feedback callbacks.
+ *
+ * The worker function, that's the one running in the thread, also receives
+ * an ::Ecore_Thread handler that can be used with ecore_thread_cancel() and
+ *ecore_thread_check(), sharing the flag with the main loop. But this
+ * handler is also associated with the thread where the function is running.
+ * This has strong implications when working with thread local data.
+ *
+ * There are two kinds of worker threads Ecore handles: simple, or short,
+ * workers and feedback workers.
+ *
+ * The first kind is for simple functions that perform a
+ * usually small but time consuming task. Ecore will run this function in
+ * a thread as soon as one becomes available and notify the calling user of
+ * its completion once the task is done.
+ *
+ * The following image shows the flow of a program running four tasks on
+ * a pool of two threads.
+ *
+ * @image html ecore_thread.png
+ * @image rtf ecore_thread.png
+ * @image latex ecore_thread.eps width=\textwidth
+ *
+ * For larger tasks that may require continuous communication with the main
+ * program, the feedback workers provide the same functionality plus a way
+ * for the function running in the thread to send messages to the main
+ * thread.
+ *
+ * The next diagram omits some details shown in the previous one regarding
+ * how threads are spawned and tasks are queued, but illustrates how feedback
+ * jobs communicate with the main loop and the special case of threads
+ * running out of pool.
+ *
+ * @image html ecore_thread_feedback.png
+ * @image rtf ecore_thread_feedback.png
+ * @image latex ecore_thread_feedback.eps width=\textwidth
+ *
+ * See an overview example in @ref ecore_thread_example_c.
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+typedef struct _Ecore_Thread Ecore_Thread; /**< A handle for threaded jobs */
+
+/**
+ * @typedef Ecore_Thread_Cb Ecore_Thread_Cb
+ * A callback used by Ecore_Thread helper.
+ */
+typedef void (*Ecore_Thread_Cb)(void *data, Ecore_Thread *thread);
+/**
+ * @typedef Ecore_Thread_Notify_Cb Ecore_Thread_Notify_Cb
+ * A callback used by the main loop to receive data sent by an
+ * @ref Ecore_Thread_Group.
+ */
+typedef void (*Ecore_Thread_Notify_Cb)(void *data, Ecore_Thread *thread, void *msg_data);
+
+/**
+ * Schedule a task to run in a parallel thread to avoid locking the main loop
+ *
+ * @param func_blocking The function that should run in another thread.
+ * @param func_end Function to call from main loop when @p func_blocking
+ * completes its task successfully (may be NULL)
+ * @param func_cancel Function to call from main loop if the thread running
+ * @p func_blocking is cancelled or fails to start (may be NULL)
+ * @param data User context data to pass to all callbacks.
+ * @return A new thread handler, or @c NULL on failure.
+ *
+ * This function will try to create a new thread to run @p func_blocking in,
+ * or if the maximum number of concurrent threads has been reached, will
+ * add it to the pending list, where it will wait until a thread becomes
+ * available. The return value will be an ::Ecore_Thread handle that can
+ * be used to cancel the thread before its completion.
+ *
+ * @note This function should always return immediately, but in the rare
+ * case that Ecore is built with no thread support, @p func_blocking will
+ * be called here, actually blocking the main loop.
+ *
+ * Once a thread becomes available, @p func_blocking will be run in it until
+ * it finishes, then @p func_end is called from the thread containing the
+ * main loop to inform the user of its completion. While in @p func_blocking,
+ * no functions from the EFL can be used, except for those from Eina that are
+ * marked to be thread-safe. Even for the latter, caution needs to be taken
+ * if the data is shared across several threads.
+ *
+ * @p func_end will be called from the main thread when @p func_blocking ends,
+ * so here it's safe to use anything from the EFL freely.
+ *
+ * The thread can also be cancelled before its completion calling
+ *ecore_thread_cancel(), either from the main thread or @p func_blocking.
+ * In this case, @p func_cancel will be called, also from the main thread
+ * to inform of this happening. If the thread could not be created, this
+ * function will be called and it's @c thread parameter will be NULL. It's
+ * also safe to call any EFL function here, as it will be running in the
+ * main thread.
+ *
+ * Inside @p func_blocking, it's possible to call ecore_thread_reschedule()
+ * to tell Ecore that this function should be called again.
+ *
+ * Be aware that no assumptions can be made about the order in which the
+ * @p func_end callbacks for each task will be called. Once the function is
+ * running in a different thread, it's the OS that will handle its running
+ * schedule, and different functions may take longer to finish than others.
+ * Also remember that just starting several tasks together doesn't mean they
+ * will be running at the same time. Ecore will schedule them based on the
+ * number of threads available for the particular system it's running in,
+ * so some of the jobs started may be waiting until another one finishes
+ * before it can execute its own @p func_blocking.
+ *
+ * @see ecore_thread_feedback_run()
+ * @see ecore_thread_cancel()
+ * @see ecore_thread_reschedule()
+ * @see ecore_thread_max_set()
+ */
+EAPI Ecore_Thread *ecore_thread_run(Ecore_Thread_Cb func_blocking, Ecore_Thread_Cb func_end, Ecore_Thread_Cb func_cancel, const void *data);
+/**
+ * Launch a thread to run a task that can talk back to the main thread
+ *
+ * @param func_heavy The function that should run in another thread.
+ * @param func_notify Function that receives the data sent from the thread
+ * @param func_end Function to call from main loop when @p func_heavy
+ * completes its task successfully
+ * @param func_cancel Function to call from main loop if the thread running
+ * @p func_heavy is cancelled or fails to start
+ * @param data User context data to pass to all callback.
+ * @param try_no_queue If you want to run outside of the thread pool.
+ * @return A new thread handler, or @c NULL on failure.
+ *
+ * See ecore_thread_run() for a general description of this function.
+ *
+ * The difference with the above is that ecore_thread_run() is meant for
+ * tasks that don't need to communicate anything until they finish, while
+ * this function is provided with a new callback, @p func_notify, that will
+ * be called from the main thread for every message sent from @p func_heavy
+ * with ecore_thread_feedback().
+ *
+ * Like with ecore_thread_run(), a new thread will be launched to run
+ * @p func_heavy unless the maximum number of simultaneous threads has been
+ * reached, in which case the function will be scheduled to run whenever a
+ * running task ends and a thread becomes free. But if @p try_no_queue is
+ * set, Ecore will first try to launch a thread outside of the pool to run
+ * the task. If it fails, it will revert to the normal behaviour of using a
+ * thread from the pool as if @p try_no_queue had not been set.
+ *
+ * Keep in mind that Ecore handles the thread pool based on the number of
+ * CPUs available, but running a thread outside of the pool doesn't count for
+ * this, so having too many of them may have drastic effects over the
+ * program's performance.
+ *
+ * @see ecore_thread_feedback()
+ * @see ecore_thread_run()
+ * @see ecore_thread_cancel()
+ * @see ecore_thread_reschedule()
+ * @see ecore_thread_max_set()
+ */
+EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy, Ecore_Thread_Notify_Cb func_notify,
+                                             Ecore_Thread_Cb func_end, Ecore_Thread_Cb func_cancel,
+                                             const void *data, Eina_Bool try_no_queue);
+/**
+ * Cancel a running thread.
+ *
+ * @param thread The thread to cancel.
+ * @return Will return @c EINA_TRUE if the thread has been cancelled,
+ *         @c EINA_FALSE if it is pending.
+ *
+ * This function can be called both in the main loop or in the running thread.
+ *
+ * This function cancels a running thread. If @p thread can be immediately
+ * cancelled (it's still pending execution after creation or rescheduling),
+ * then the @c cancel callback will be called, @p thread will be freed and
+ * the function will return @c EINA_TRUE.
+ *
+ * If the thread is already running, then this function returns @c EINA_FALSE
+ * after marking the @p thread as pending cancellation. For the thread to
+ * actually be terminated, it needs to return from the user function back
+ * into Ecore control. This can happen in several ways:
+ * @li The function ends and returns normally. If it hadn't been cancelled,
+ * @c func_end would be called here, but instead @c func_cancel will happen.
+ * @li The function returns after requesting to be rescheduled with
+ * ecore_thread_reschedule().
+ * @li The function is prepared to leave early by checking if
+ * ecore_thread_check() returns @c EINA_TRUE.
+ *
+ * The user function can cancel itself by calling ecore_thread_cancel(), but
+ * it should always use the ::Ecore_Thread handle passed to it and never
+ * share it with the main loop thread by means of shared user data or any
+ * other way.
+ *
+ * @p thread will be freed and should not be used again if this function
+ * returns @c EINA_TRUE or after the @c func_cancel callback returns.
+ *
+ * @see ecore_thread_check()
+ */
+EAPI Eina_Bool ecore_thread_cancel(Ecore_Thread *thread);
+/**
+ * Checks if a thread is pending cancellation
+ *
+ * @param thread The thread to test.
+ * @return @c EINA_TRUE if the thread is pending cancellation,
+ *         @c EINA_FALSE if it is not.
+ *
+ * This function can be called both in the main loop or in the running thread.
+ *
+ * When ecore_thread_cancel() is called on an already running task, the
+ * thread is marked as pending cancellation. This function returns @c EINA_TRUE
+ * if this mark is set for the given @p thread and can be used from the
+ * main loop thread to check if a still active thread has been cancelled,
+ * or from the user function running in the thread to check if it should
+ * stop doing what it's doing and return early, effectively cancelling the
+ * task.
+ *
+ * @see ecore_thread_cancel()
+ */
+EAPI Eina_Bool ecore_thread_check(Ecore_Thread *thread);
+/**
+ * Sends data from the worker thread to the main loop
+ *
+ * @param thread The current ::Ecore_Thread context to send data from
+ * @param msg_data Data to be transmitted to the main loop
+ * @return @c EINA_TRUE if @p msg_data was successfully sent to main loop,
+ *         @c EINA_FALSE if anything goes wrong.
+ *
+ * You should use this function only in the @c func_heavy call.
+ *
+ * Only the address to @p msg_data will be sent and once this function
+ * returns @c EINA_TRUE, the job running in the thread should never touch the
+ * contents of it again. The data sent should be malloc()'ed or something
+ * similar, as long as it's not memory local to the thread that risks being
+ * overwritten or deleted once it goes out of scope or the thread finishes.
+ *
+ * Care must be taken that @p msg_data is properly freed in the @c func_notify
+ * callback set when creating the thread.
+ *
+ * @see ecore_thread_feedback_run()
+ */
+EAPI Eina_Bool ecore_thread_feedback(Ecore_Thread *thread, const void *msg_data);
+/**
+ * Asks for the function in the thread to be called again at a later time
+ *
+ * @param thread The current ::Ecore_Thread context to rescheduled
+ * @return @c EINA_TRUE if the task was successfully rescheduled,
+ *         @c EINA_FALSE if anything goes wrong.
+ *
+ * This function should be called only from the same function represented
+ * by @p thread.
+ *
+ * Calling this function will mark the thread for a reschedule, so as soon
+ * as it returns, it will be added to the end of the list of pending tasks.
+ * If no other tasks are waiting or there are sufficient threads available,
+ * the rescheduled task will be launched again immediately.
+ *
+ * This should never return @c EINA_FALSE, unless it was called from the wrong
+ * thread or with the wrong arguments.
+ *
+ * The @c func_end callback set when the thread is created will not be
+ * called until the function in the thread returns without being rescheduled.
+ * Similarly, if the @p thread is cancelled, the reschedule will not take
+ * effect.
+ */
+EAPI Eina_Bool ecore_thread_reschedule(Ecore_Thread *thread);
+/**
+ * Gets the number of active threads running jobs
+ *
+ * @return Number of active threads running jobs
+ *
+ * This returns the number of threads currently running jobs of any type
+ * through the Ecore_Thread API.
+ *
+ * @note Jobs started through the ecore_thread_feedback_run() function with
+ * the @c try_no_queue parameter set to @c EINA_TRUE will not be accounted for
+ * in the return of this function unless the thread creation fails and it
+ * falls back to using one from the pool.
+ */
+EAPI int ecore_thread_active_get(void);
+/**
+ * Gets the number of short jobs waiting for a thread to run
+ *
+ * @return Number of pending threads running "short" jobs
+ *
+ * This returns the number of tasks started with ecore_thread_run() that are
+ * pending, waiting for a thread to become available to run them.
+ */
+EAPI int ecore_thread_pending_get(void);
+/**
+ * Gets the number of feedback jobs waiting for a thread to run
+ *
+ * @return Number of pending threads running "feedback" jobs
+ *
+ * This returns the number of tasks started with ecore_thread_feedback_run()
+ * that are pending, waiting for a thread to become available to run them.
+ */
+EAPI int ecore_thread_pending_feedback_get(void);
+/**
+ * Gets the total number of pending jobs
+ *
+ * @return Number of pending threads running jobs
+ *
+ * Same as the sum of ecore_thread_pending_get() and
+ *ecore_thread_pending_feedback_get().
+ */
+EAPI int ecore_thread_pending_total_get(void);
+/**
+ * Gets the maximum number of threads that can run simultaneously
+ *
+ * @return Max possible number of Ecore_Thread's running concurrently
+ *
+ * This returns the maximum number of Ecore_Thread's that may be running at
+ * the same time. If this number is reached, new jobs started by either
+ *ecore_thread_run() or ecore_thread_feedback_run() will be added to the
+ * respective pending queue until one of the running threads finishes its
+ * task and becomes available to run a new one.
+ *
+ * By default, this will be the number of available CPUs for the
+ * running program (as returned by eina_cpu_count()), or 1 if this value
+ * could not be fetched.
+ *
+ * @see ecore_thread_max_set()
+ * @see ecore_thread_max_reset()
+ */
+EAPI int ecore_thread_max_get(void);
+/**
+ * Sets the maximum number of threads allowed to run simultaneously
+ *
+ * @param num The new maximum
+ *
+ * This sets a new value for the maximum number of concurrently running
+ * Ecore_Thread's. It @b must an integer between 1 and (16 * @c x), where @c x
+ * is the number for CPUs available.
+ *
+ * @see ecore_thread_max_get()
+ * @see ecore_thread_max_reset()
+ */
+EAPI void ecore_thread_max_set(int num);
+/**
+ * Resets the maximum number of concurrently running threads to the default
+ *
+ * This resets the value returned by ecore_thread_max_get() back to its
+ * default.
+ *
+ * @see ecore_thread_max_get()
+ * @see ecore_thread_max_set()
+ */
+EAPI void ecore_thread_max_reset(void);
+/**
+ * Gets the number of threads available for running tasks
+ *
+ * @return The number of available threads
+ *
+ * Same as doing ecore_thread_max_get() - ecore_thread_active_get().
+ *
+ * This function may return a negative number only in the case the user
+ * changed the maximum number of running threads while other tasks are
+ * running.
+ */
+EAPI int ecore_thread_available_get(void);
+/**
+ * Adds some data to a hash local to the thread
+ *
+ * @param thread The thread context the data belongs to
+ * @param key The name under which the data will be stored
+ * @param value The data to add
+ * @param cb Function to free the data when removed from the hash
+ * @param direct If true, this will not copy the key string (like
+ * eina_hash_direct_add())
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
+ *
+ * Ecore Thread has a mechanism to share data across several worker functions
+ * that run on the same system thread. That is, the data is stored per
+ * thread and for a worker function to have access to it, it must be run
+ * by the same thread that stored the data.
+ *
+ * When there are no more workers pending, the thread will be destroyed
+ * along with the internal hash and any data left in it will be freed with
+ * the @p cb function given.
+ *
+ * This set of functions is useful to share things around several instances
+ * of a function when that thing is costly to create and can be reused, but
+ * may only be used by one function at a time.
+ *
+ * For example, if you have a program doing requisitions to a database,
+ * these requisitions can be done in threads so that waiting for the
+ * database to respond doesn't block the UI. Each of these threads will
+ * run a function, and each function will be dependent on a connection to
+ * the database, which may not be able to handle more than one request at
+ * a time so for each running function you will need one connection handle.
+ * The options then are:
+ * @li Each function opens a connection when it's called, does the work and
+ * closes the connection when it finishes. This may be costly, wasting a lot
+ * of time on resolving hostnames, negotiating permissions and allocating
+ * memory.
+ * @li Open the connections in the main loop and pass it to the threads
+ * using the data pointer. Even worse, it's just as costly as before and now
+ * it may even be kept with connections open doing nothing until a thread
+ * becomes available to run the function.
+ * @li Have a way to share connection handles, so that each instance of the
+ * function can check if an available connection exists, and if it doesn't,
+ * create one and add it to the pool. When no more connections are needed,
+ * they are all closed.
+ *
+ * The last option is the most efficient, but it requires a lot of work to
+ * implement properly. Using thread local data helps to achieve the same
+ * result while avoiding doing all the tracking work on your code. The way
+ * to use it would be, at the worker function, to ask for the connection
+ * with ecore_thread_local_data_find() and if it doesn't exist, then open
+ * a new one and save it with ecore_thread_local_data_add(). Do the work and
+ * forget about the connection handle, when everything is done the function
+ * just ends. The next worker to run on that thread will check if a
+ * connection exists and find that it does, so the process of opening a
+ * new one has been spared. When no more workers exist, the thread is
+ * destroyed and the callback used when saving the connection will be called
+ * to close it.
+ *
+ * This function adds the data @p value to the thread data under the given
+ * @p key.
+ * No other value in the hash may have the same @p key. If you need to
+ * change the value under a @p key, or you don't know if one exists already,
+ * you can use ecore_thread_local_data_set().
+ *
+ * Neither @p key nor @p value may be @c NULL and @p key will be copied in the
+ * hash, unless @p direct is set, in which case the string used should not
+ * be freed until the data is removed from the hash.
+ *
+ * The @p cb function will be called when the data in the hash needs to be
+ * freed, be it because it got deleted with ecore_thread_local_data_del() or
+ * because @p thread was terminated and the hash destroyed. This parameter
+ * may be NULL, in which case @p value needs to be manually freed after
+ * removing it from the hash with either ecore_thread_local_data_del() or
+ * ecore_thread_local_data_set(), but it's very unlikely that this is what
+ * you want.
+ *
+ * This function, and all of the others in the @c ecore_thread_local_data
+ * family of functions, can only be called within the worker function running
+ * in the thread. Do not call them from the main loop or from a thread
+ * other than the one represented by @p thread.
+ *
+ * @see ecore_thread_local_data_set()
+ * @see ecore_thread_local_data_find()
+ * @see ecore_thread_local_data_del()
+ */
+EAPI Eina_Bool ecore_thread_local_data_add(Ecore_Thread *thread, const char *key, void *value,
+                                           Eina_Free_Cb cb, Eina_Bool direct);
+/**
+ * Sets some data in the hash local to the given thread
+ *
+ * @param thread The thread context the data belongs to
+ * @param key The name under which the data will be stored
+ * @param value The data to add
+ * @param cb Function to free the data when removed from the hash
+ *
+ * If no data exists in the hash under the @p key, this function adds
+ * @p value in the hash under the given @p key and returns NULL.
+ * The key itself is copied.
+ *
+ * If the hash already contains something under @p key, the data will be
+ * replaced by @p value and the old value will be returned.
+ *
+ * @c NULL will also be returned if either @p key or @p value are @c NULL, or
+ * if an error occurred.
+ *
+ * This function, and all of the others in the @c ecore_thread_local_data
+ * family of functions, can only be called within the worker function running
+ * in the thread. Do not call them from the main loop or from a thread
+ * other than the one represented by @p thread.
+ *
+ * @see ecore_thread_local_data_add()
+ * @see ecore_thread_local_data_del()
+ * @see ecore_thread_local_data_find()
+ */
+EAPI void *ecore_thread_local_data_set(Ecore_Thread *thread, const char *key, void *value, Eina_Free_Cb cb);
+/**
+ * Gets data stored in the hash local to the given thread
+ *
+ * @param thread The thread context the data belongs to
+ * @param key The name under which the data is stored
+ * @return The value under the given key, or @c NULL on error.
+ *
+ * Finds and return the data stored in the shared hash under the key @p key.
+ *
+ * This function, and all of the others in the @c ecore_thread_local_data
+ * family of functions, can only be called within the worker function running
+ * in the thread. Do not call them from the main loop or from a thread
+ * other than the one represented by @p thread.
+ *
+ * @see ecore_thread_local_data_add()
+ * @see ecore_thread_local_data_wait()
+ */
+EAPI void *ecore_thread_local_data_find(Ecore_Thread *thread, const char *key);
+/**
+ * Deletes from the thread's hash the data corresponding to the given key
+ *
+ * @param thread The thread context the data belongs to
+ * @param key The name under which the data is stored
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
+ *
+ * If there's any data stored associated with @p key in the global hash,
+ * this function will remove it from it and return @c EINA_TRUE. If no data
+ * exists or an error occurs, it returns @c EINA_FALSE.
+ *
+ * If the data was added to the hash with a free function, then it will
+ * also be freed after removing it from the hash, otherwise it requires
+ * to be manually freed by the user, which means that if no other reference
+ * to it exists before calling this function, it will result in a memory
+ * leak.
+ *
+ * This function, and all of the others in the @c ecore_thread_local_data
+ * family of functions, can only be called within the worker function running
+ * in the thread. Do not call them from the main loop or from a thread
+ * other than the one represented by @p thread.
+ *
+ * @see ecore_thread_local_data_add()
+ */
+EAPI Eina_Bool ecore_thread_local_data_del(Ecore_Thread *thread, const char *key);
+
+/**
+ * Adds some data to a hash shared by all threads
+ *
+ * @param key The name under which the data will be stored
+ * @param value The data to add
+ * @param cb Function to free the data when removed from the hash
+ * @param direct If true, this will not copy the key string (like
+ * eina_hash_direct_add())
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
+ *
+ * Ecore Thread keeps a hash that can be used to share data across several
+ * threads, including the main loop one, without having to manually handle
+ * mutexes to do so safely.
+ *
+ * This function adds the data @p value to this hash under the given @p key.
+ * No other value in the hash may have the same @p key. If you need to
+ * change the value under a @p key, or you don't know if one exists already,
+ * you can use ecore_thread_global_data_set().
+ *
+ * Neither @p key nor @p value may be @c NULL and @p key will be copied in the
+ * hash, unless @p direct is set, in which case the string used should not
+ * be freed until the data is removed from the hash.
+ *
+ * The @p cb function will be called when the data in the hash needs to be
+ * freed, be it because it got deleted with ecore_thread_global_data_del() or
+ * because Ecore Thread was shut down and the hash destroyed. This parameter
+ * may be NULL, in which case @p value needs to be manually freed after
+ * removing it from the hash with either ecore_thread_global_data_del() or
+ *ecore_thread_global_data_set().
+ *
+ * Manually freeing any data that was added to the hash with a @p cb function
+ * is likely to produce a segmentation fault, or any other strange
+ * happenings, later on in the program.
+ *
+ * @see ecore_thread_global_data_del()
+ * @see ecore_thread_global_data_set()
+ * @see ecore_thread_global_data_find()
+ */
+EAPI Eina_Bool ecore_thread_global_data_add(const char *key, void *value, Eina_Free_Cb cb, Eina_Bool direct);
+/**
+ * Sets some data in the hash shared by all threads
+ *
+ * @param key The name under which the data will be stored
+ * @param value The data to add
+ * @param cb Function to free the data when removed from the hash
+ *
+ * If no data exists in the hash under the @p key, this function adds
+ * @p value in the hash under the given @p key and returns NULL.
+ * The key itself is copied.
+ *
+ * If the hash already contains something under @p key, the data will be
+ * replaced by @p value and the old value will be returned.
+ *
+ * @c NULL will also be returned if either @p key or @p value are @c NULL, or
+ * if an error occurred.
+ *
+ * @see ecore_thread_global_data_add()
+ * @see ecore_thread_global_data_del()
+ * @see ecore_thread_global_data_find()
+ */
+EAPI void *ecore_thread_global_data_set(const char *key, void *value, Eina_Free_Cb cb);
+/**
+ * Gets data stored in the hash shared by all threads
+ *
+ * @param key The name under which the data is stored
+ * @return The value under the given key, or @c NULL on error.
+ *
+ * Finds and return the data stored in the shared hash under the key @p key.
+ *
+ * Keep in mind that the data returned may be used by more than one thread
+ * at the same time and no reference counting is done on it by Ecore.
+ * Freeing the data or modifying its contents may require additional
+ * precautions to be considered, depending on the application's design.
+ *
+ * @see ecore_thread_global_data_add()
+ * @see ecore_thread_global_data_wait()
+ */
+EAPI void *ecore_thread_global_data_find(const char *key);
+/**
+ * Deletes from the shared hash the data corresponding to the given key
+ *
+ * @param key The name under which the data is stored
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
+ *
+ * If there's any data stored associated with @p key in the global hash,
+ * this function will remove it from it and return @c EINA_TRUE. If no data
+ * exists or an error occurs, it returns @c EINA_FALSE.
+ *
+ * If the data was added to the hash with a free function, then it will
+ * also be freed after removing it from the hash, otherwise it requires
+ * to be manually freed by the user, which means that if no other reference
+ * to it exists before calling this function, it will result in a memory
+ * leak.
+ *
+ * Note, also, that freeing data that other threads may be using will result
+ * in a crash, so appropriate care must be taken by the application when
+ * that possibility exists.
+ *
+ * @see ecore_thread_global_data_add()
+ */
+EAPI Eina_Bool ecore_thread_global_data_del(const char *key);
+/**
+ * Gets data stored in the shared hash, or wait for it if it doesn't exist
+ *
+ * @param key The name under which the data is stored
+ * @param seconds The amount of time in seconds to wait for the data.
+ * @return The value under the given key, or @c NULL on error.
+ *
+ * Finds and return the data stored in the shared hash under the key @p key.
+ *
+ * If there's nothing in the hash under the given @p key, the function
+ * will block and wait up to @p seconds seconds for some other thread to
+ * add it with either ecore_thread_global_data_add() or
+ * ecore_thread_global_data_set(). If after waiting there's still no data
+ * to get, @c NULL will be returned.
+ *
+ * If @p seconds is 0, then no waiting will happen and this function works
+ * like ecore_thread_global_data_find(). If @p seconds is less than 0, then
+ * the function will wait indefinitely.
+ *
+ * Keep in mind that the data returned may be used by more than one thread
+ * at the same time and no reference counting is done on it by Ecore.
+ * Freeing the data or modifying its contents may require additional
+ * precautions to be considered, depending on the application's design.
+ *
+ * @see ecore_thread_global_data_add()
+ * @see ecore_thread_global_data_find()
+ */
+EAPI void *ecore_thread_global_data_wait(const char *key, double seconds);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Pipe_Group Pipe wrapper
+ *
+ * These functions wrap the pipe / write / read functions to easily
+ * integrate its use into ecore's main loop.
+ *
+ * The ecore_pipe_add() function creates file descriptors (sockets
+ * on Windows) and attach a handle to the ecore main loop. That
+ * handle is called when data is read in the pipe. To write data in
+ * the pipe, just call ecore_pipe_write(). When you are done, just
+ * call ecore_pipe_del().
+ *
+ * For examples see here:
+ * @li @ref tutorial_ecore_pipe_gstreamer_example
+ * @li @ref tutorial_ecore_pipe_simple_example
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+typedef struct _Ecore_Pipe Ecore_Pipe; /**< A handle for pipes */
+
+/**
+ * @typedef Ecore_Pipe_Cb Ecore_Pipe_Cb
+ * The callback that data written to the pipe is sent to.
+ */
+typedef void (*Ecore_Pipe_Cb)(void *data, void *buffer, unsigned int nbyte);
+
+EAPI Ecore_Pipe *ecore_pipe_add(Ecore_Pipe_Cb handler, const void *data);
+EAPI void *ecore_pipe_del(Ecore_Pipe *p);
+EAPI Eina_Bool ecore_pipe_write(Ecore_Pipe *p, const void *buffer, unsigned int nbytes);
+EAPI void ecore_pipe_write_close(Ecore_Pipe *p);
+EAPI void ecore_pipe_read_close(Ecore_Pipe *p);
+EAPI void ecore_pipe_thaw(Ecore_Pipe *p);
+EAPI void ecore_pipe_freeze(Ecore_Pipe *p);
+EAPI int ecore_pipe_wait(Ecore_Pipe *p, int message_count, double wait);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Job_Group Ecore Job functions
+ *
+ * You can queue jobs that are to be done by the main loop when the
+ * current event is dealt with.
+ *
+ * Jobs are processed by the main loop similarly to events. They
+ * also will be executed in the order in which they were added.
+ *
+ * A good use for them is when you don't want to execute an action
+ * immediately, but want to give the control back to the main loop
+ * so that it will call your job callback when jobs start being
+ * processed (and if there are other jobs added before yours, they
+ * will be processed first). This also gives the chance to other
+ * actions in your program to cancel the job before it is started.
+ *
+ * Examples of using @ref Ecore_Job :
+ * @li @ref ecore_job_example_c
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+typedef struct _Ecore_Job Ecore_Job;    /**< A job handle */
+
+EAPI Ecore_Job *ecore_job_add(Ecore_Cb func, const void *data);
+EAPI void *ecore_job_del(Ecore_Job *job);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Application_Group Ecore Application functions
+ *
+ * @{
+ */
+
+EAPI void ecore_app_args_set(int argc, const char **argv);
+EAPI void ecore_app_args_get(int *argc, char ***argv);
+EAPI void ecore_app_restart(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Throttle_Group Ecore Throttle functions
+ *
+ * @ingroup Ecore_Main_Loop_Group
+ *
+ * @{
+ */
+
+EAPI void ecore_throttle_adjust(double amount);
+EAPI double ecore_throttle_get(void);
+
+/**
+ * @}
+ */
 
 #ifdef __cplusplus
 }
diff --git a/src/lib/ecore/Ecore_Getopt.h b/src/lib/ecore/Ecore_Getopt.h
new file mode 100644 (file)
index 0000000..0a11787
--- /dev/null
@@ -0,0 +1,419 @@
+#ifndef _ECORE_GETOPT_H
+#define _ECORE_GETOPT_H
+
+#include <stdio.h>
+#include <Eina.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_ECORE_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_ECORE_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+/**
+ * @file Ecore_Getopt.h
+ * @brief Contains powerful getopt replacement.
+ *
+ * This replacement handles both short (-X) or long options (--ABC)
+ * options, with various actions supported, like storing one value and
+ * already converting to required type, counting number of
+ * occurrences, setting true or false values, show help, license,
+ * copyright and even support user-defined callbacks.
+ *
+ * It is provided a set of C Pre Processor macros so definition is
+ * straightforward.
+ *
+ * Values will be stored elsewhere indicated by an array of pointers
+ * to values, it is given in separate to parser description so you can
+ * use multiple values with the same parser.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+   ECORE_GETOPT_ACTION_STORE,
+   ECORE_GETOPT_ACTION_STORE_CONST,
+   ECORE_GETOPT_ACTION_STORE_TRUE,
+   ECORE_GETOPT_ACTION_STORE_FALSE,
+   ECORE_GETOPT_ACTION_CHOICE,
+   ECORE_GETOPT_ACTION_APPEND,
+   ECORE_GETOPT_ACTION_COUNT,
+   ECORE_GETOPT_ACTION_CALLBACK,
+   ECORE_GETOPT_ACTION_HELP,
+   ECORE_GETOPT_ACTION_VERSION,
+   ECORE_GETOPT_ACTION_COPYRIGHT,
+   ECORE_GETOPT_ACTION_LICENSE
+} Ecore_Getopt_Action;
+
+typedef enum {
+   ECORE_GETOPT_TYPE_STR,
+   ECORE_GETOPT_TYPE_BOOL,
+   ECORE_GETOPT_TYPE_SHORT,
+   ECORE_GETOPT_TYPE_INT,
+   ECORE_GETOPT_TYPE_LONG,
+   ECORE_GETOPT_TYPE_USHORT,
+   ECORE_GETOPT_TYPE_UINT,
+   ECORE_GETOPT_TYPE_ULONG,
+   ECORE_GETOPT_TYPE_DOUBLE
+} Ecore_Getopt_Type;
+
+typedef enum {
+   ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO = 0,
+   ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES = 1,
+   ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL = 3
+} Ecore_Getopt_Desc_Arg_Requirement;
+
+typedef union _Ecore_Getopt_Value          Ecore_Getopt_Value;
+
+typedef struct _Ecore_Getopt_Desc_Store    Ecore_Getopt_Desc_Store;
+typedef struct _Ecore_Getopt_Desc_Callback Ecore_Getopt_Desc_Callback;
+typedef struct _Ecore_Getopt_Desc          Ecore_Getopt_Desc;
+typedef struct _Ecore_Getopt               Ecore_Getopt;
+
+union _Ecore_Getopt_Value
+{
+   char          **strp;
+   unsigned char  *boolp;
+   short          *shortp;
+   int            *intp;
+   long           *longp;
+   unsigned short *ushortp;
+   unsigned int   *uintp;
+   unsigned long  *ulongp;
+   double         *doublep;
+   Eina_List     **listp;
+   void          **ptrp;
+};
+
+struct _Ecore_Getopt_Desc_Store
+{
+   Ecore_Getopt_Type                 type; /**< type of data being handled */
+   Ecore_Getopt_Desc_Arg_Requirement arg_req;
+   union
+   {
+      const char    *strv;
+      Eina_Bool      boolv;
+      short          shortv;
+      int            intv;
+      long           longv;
+      unsigned short ushortv;
+      unsigned int   uintv;
+      unsigned long  ulongv;
+      double         doublev;
+   } def;
+};
+
+struct _Ecore_Getopt_Desc_Callback
+{
+   Eina_Bool                         (*func)(const Ecore_Getopt *parser,
+                                             const Ecore_Getopt_Desc *desc,
+                                             const char *str,
+                                             void *data,
+                                             Ecore_Getopt_Value *storage);
+   const void                       *data;
+   Ecore_Getopt_Desc_Arg_Requirement arg_req;
+   const char                       *def;
+};
+
+struct _Ecore_Getopt_Desc
+{
+   char                shortname; /**< used with a single dash */
+   const char         *longname; /**< used with double dashes */
+   const char         *help; /**< used by --help/ecore_getopt_help() */
+   const char         *metavar; /**< used by ecore_getopt_help() with nargs > 0 */
+
+   Ecore_Getopt_Action action;   /**< define how to handle it */
+   union
+   {
+      const Ecore_Getopt_Desc_Store    store;
+      const void                      *store_const;
+      const char *const               *choices; /* NULL terminated. */
+      const Ecore_Getopt_Type          append_type;
+      const Ecore_Getopt_Desc_Callback callback;
+      const void                      *dummy;
+   } action_param;
+};
+
+struct _Ecore_Getopt
+{
+   const char             *prog; /**< to be used when ecore_app_args_get() fails */
+   const char             *usage; /**< usage example, %prog is replaced */
+   const char             *version; /**< if exists, --version will work */
+   const char             *copyright; /**< if exists, --copyright will work */
+   const char             *license; /**< if exists, --license will work */
+   const char             *description; /**< long description, possible multiline */
+   Eina_Bool               strict : 1; /**< fail on errors */
+   const Ecore_Getopt_Desc descs[];   /* NULL terminated. */
+};
+
+#define ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, type, arg_requirement, default_value) \
+  {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_STORE,                                         \
+   {.store = {type, arg_requirement, default_value}}}
+
+#define ECORE_GETOPT_STORE(shortname, longname, help, type)      \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, NULL, type, \
+                          ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES, {})
+
+#define ECORE_GETOPT_STORE_STR(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_STR)
+#define ECORE_GETOPT_STORE_BOOL(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_BOOL)
+#define ECORE_GETOPT_STORE_SHORT(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_SHORT)
+#define ECORE_GETOPT_STORE_INT(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_INT)
+#define ECORE_GETOPT_STORE_LONG(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_LONG)
+#define ECORE_GETOPT_STORE_USHORT(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_USHORT)
+#define ECORE_GETOPT_STORE_UINT(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_UINT)
+#define ECORE_GETOPT_STORE_ULONG(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_ULONG)
+#define ECORE_GETOPT_STORE_DOUBLE(shortname, longname, help) \
+  ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_DOUBLE)
+
+#define ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, type) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, type,          \
+                          ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES, {})
+
+#define ECORE_GETOPT_STORE_METAVAR_STR(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_STR)
+#define ECORE_GETOPT_STORE_METAVAR_BOOL(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_BOOL)
+#define ECORE_GETOPT_STORE_METAVAR_SHORT(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_SHORT)
+#define ECORE_GETOPT_STORE_METAVAR_INT(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_INT)
+#define ECORE_GETOPT_STORE_METAVAR_LONG(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_LONG)
+#define ECORE_GETOPT_STORE_METAVAR_USHORT(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_USHORT)
+#define ECORE_GETOPT_STORE_METAVAR_UINT(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_UINT)
+#define ECORE_GETOPT_STORE_METAVAR_ULONG(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_ULONG)
+#define ECORE_GETOPT_STORE_METAVAR_DOUBLE(shortname, longname, help, metavar) \
+  ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_DOUBLE)
+
+#define ECORE_GETOPT_STORE_DEF(shortname, longname, help, type, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, NULL, type,               \
+                          ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL,          \
+                          default_value)
+
+#define ECORE_GETOPT_STORE_DEF_STR(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                          \
+                         ECORE_GETOPT_TYPE_STR,                              \
+                         {.strv = default_value})
+#define ECORE_GETOPT_STORE_DEF_BOOL(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                           \
+                         ECORE_GETOPT_TYPE_BOOL,                              \
+                         {.boolv = default_value})
+#define ECORE_GETOPT_STORE_DEF_SHORT(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                            \
+                         ECORE_GETOPT_TYPE_SHORT,                              \
+                         {.shortv = default_value})
+#define ECORE_GETOPT_STORE_DEF_INT(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                          \
+                         ECORE_GETOPT_TYPE_INT,                              \
+                         {.intv = default_value})
+#define ECORE_GETOPT_STORE_DEF_LONG(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                           \
+                         ECORE_GETOPT_TYPE_LONG,                              \
+                         {.longv = default_value})
+#define ECORE_GETOPT_STORE_DEF_USHORT(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                             \
+                         ECORE_GETOPT_TYPE_USHORT,                              \
+                         {.ushortv = default_value})
+#define ECORE_GETOPT_STORE_DEF_UINT(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                           \
+                         ECORE_GETOPT_TYPE_UINT,                              \
+                         {.uintv = default_value})
+#define ECORE_GETOPT_STORE_DEF_ULONG(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                            \
+                         ECORE_GETOPT_TYPE_ULONG,                              \
+                         {.ulongv = default_value})
+#define ECORE_GETOPT_STORE_DEF_DOUBLE(shortname, longname, help, default_value) \
+  ECORE_GETOPT_STORE_DEF(shortname, longname, help,                             \
+                         ECORE_GETOPT_TYPE_DOUBLE,                              \
+                         {.doublev = default_value})
+
+#define ECORE_GETOPT_STORE_FULL_STR(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                           \
+                          ECORE_GETOPT_TYPE_STR,                                                        \
+                          arg_requirement,                                                              \
+                          {.strv = default_value})
+#define ECORE_GETOPT_STORE_FULL_BOOL(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                            \
+                          ECORE_GETOPT_TYPE_BOOL,                                                        \
+                          arg_requirement,                                                               \
+                          {.boolv = default_value})
+#define ECORE_GETOPT_STORE_FULL_SHORT(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                             \
+                          ECORE_GETOPT_TYPE_SHORT,                                                        \
+                          arg_requirement,                                                                \
+                          {.shortv = default_value})
+#define ECORE_GETOPT_STORE_FULL_INT(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                           \
+                          ECORE_GETOPT_TYPE_INT,                                                        \
+                          arg_requirement,                                                              \
+                          {.intv = default_value})
+#define ECORE_GETOPT_STORE_FULL_LONG(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                            \
+                          ECORE_GETOPT_TYPE_LONG,                                                        \
+                          arg_requirement,                                                               \
+                          {.longv = default_value})
+#define ECORE_GETOPT_STORE_FULL_USHORT(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                              \
+                          ECORE_GETOPT_TYPE_USHORT,                                                        \
+                          arg_requirement,                                                                 \
+                          {.ushortv = default_value})
+#define ECORE_GETOPT_STORE_FULL_UINT(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                            \
+                          ECORE_GETOPT_TYPE_UINT,                                                        \
+                          arg_requirement,                                                               \
+                          {.uintv = default_value})
+#define ECORE_GETOPT_STORE_FULL_ULONG(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                             \
+                          ECORE_GETOPT_TYPE_ULONG,                                                        \
+                          arg_requirement,                                                                \
+                          {.ulongv = default_value})
+#define ECORE_GETOPT_STORE_FULL_DOUBLE(shortname, longname, help, metavar, arg_requirement, default_value) \
+  ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar,                                              \
+                          ECORE_GETOPT_TYPE_DOUBLE,                                                        \
+                          arg_requirement,                                                                 \
+                          {.doublev = default_value})
+
+#define ECORE_GETOPT_STORE_CONST(shortname, longname, help, value)   \
+  {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_CONST, \
+   {.store_const = value}}
+#define ECORE_GETOPT_STORE_TRUE(shortname, longname, help)          \
+  {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_TRUE, \
+   {.dummy = NULL}}
+#define ECORE_GETOPT_STORE_FALSE(shortname, longname, help)          \
+  {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_FALSE, \
+   {.dummy = NULL}}
+
+#define ECORE_GETOPT_CHOICE(shortname, longname, help, choices_array) \
+  {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_CHOICE,       \
+   {.choices = choices_array}}
+#define ECORE_GETOPT_CHOICE_METAVAR(shortname, longname, help, metavar, choices_array) \
+  {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_CHOICE,                     \
+   {.choices = choices_array}}
+
+#define ECORE_GETOPT_APPEND(shortname, longname, help, sub_type) \
+  {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_APPEND,  \
+   {.append_type = sub_type}}
+#define ECORE_GETOPT_APPEND_METAVAR(shortname, longname, help, metavar, type) \
+  {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_APPEND,            \
+   {.append_type = type}}
+
+#define ECORE_GETOPT_COUNT(shortname, longname, help)          \
+  {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_COUNT, \
+   {.dummy = NULL}}
+
+#define ECORE_GETOPT_CALLBACK_FULL(shortname, longname, help, metavar, callback_func, callback_data, argument_requirement, default_value) \
+  {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_CALLBACK,                                                                      \
+   {.callback = {callback_func, callback_data,                                                                                            \
+                 argument_requirement, default_value}}}
+#define ECORE_GETOPT_CALLBACK_NOARGS(shortname, longname, help, callback_func, callback_data) \
+  ECORE_GETOPT_CALLBACK_FULL(shortname, longname, help, NULL,                                 \
+                             callback_func, callback_data,                                    \
+                             ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO,                            \
+                             NULL)
+#define ECORE_GETOPT_CALLBACK_ARGS(shortname, longname, help, metavar, callback_func, callback_data) \
+  ECORE_GETOPT_CALLBACK_FULL(shortname, longname, help, metavar,                                     \
+                             callback_func, callback_data,                                           \
+                             ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES,                                  \
+                             NULL)
+
+#define ECORE_GETOPT_HELP(shortname, longname)      \
+  {shortname, longname, "show this message.", NULL, \
+   ECORE_GETOPT_ACTION_HELP,                        \
+   {.dummy = NULL}}
+
+#define ECORE_GETOPT_VERSION(shortname, longname)      \
+  {shortname, longname, "show program version.", NULL, \
+   ECORE_GETOPT_ACTION_VERSION,                        \
+   {.dummy = NULL}}
+
+#define ECORE_GETOPT_COPYRIGHT(shortname, longname) \
+  {shortname, longname, "show copyright.", NULL,    \
+   ECORE_GETOPT_ACTION_COPYRIGHT,                   \
+   {.dummy = NULL}}
+
+#define ECORE_GETOPT_LICENSE(shortname, longname) \
+  {shortname, longname, "show license.", NULL,    \
+   ECORE_GETOPT_ACTION_LICENSE,                   \
+   {.dummy = NULL}}
+
+#define ECORE_GETOPT_SENTINEL {0, NULL, NULL, NULL, 0, {.dummy = NULL}}
+
+#define ECORE_GETOPT_VALUE_STR(val)      {.strp = &(val)}
+#define ECORE_GETOPT_VALUE_BOOL(val)     {.boolp = &(val)}
+#define ECORE_GETOPT_VALUE_SHORT(val)    {.shortp = &(val)}
+#define ECORE_GETOPT_VALUE_INT(val)      {.intp = &(val)}
+#define ECORE_GETOPT_VALUE_LONG(val)     {.longp = &(val)}
+#define ECORE_GETOPT_VALUE_USHORT(val)   {.ushortp = &(val)}
+#define ECORE_GETOPT_VALUE_UINT(val)     {.uintp = &(val)}
+#define ECORE_GETOPT_VALUE_ULONG(val)    {.ulongp = &(val)}
+#define ECORE_GETOPT_VALUE_DOUBLE(val)   {.doublep = &(val)}
+#define ECORE_GETOPT_VALUE_PTR(val)      {.ptrp = &(val)}
+#define ECORE_GETOPT_VALUE_PTR_CAST(val) {.ptrp = (void **)&(val)}
+#define ECORE_GETOPT_VALUE_LIST(val)     {.listp = &(val)}
+#define ECORE_GETOPT_VALUE_NONE {.ptrp = NULL}
+
+EAPI void
+ecore_getopt_help(FILE *fp,
+                  const Ecore_Getopt *info);
+
+EAPI Eina_Bool
+ ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser);
+EAPI int
+ ecore_getopt_parse(const Ecore_Getopt *parser,
+                   Ecore_Getopt_Value *values,
+                   int argc,
+                   char **argv);
+
+EAPI Eina_List *ecore_getopt_list_free(Eina_List *list);
+
+/* helper functions to be used with ECORE_GETOPT_CALLBACK_*() */
+EAPI Eina_Bool
+ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser,
+                                     const Ecore_Getopt_Desc *desc,
+                                     const char *str,
+                                     void *data,
+                                     Ecore_Getopt_Value *storage);
+EAPI Eina_Bool
+ecore_getopt_callback_size_parse(const Ecore_Getopt *parser,
+                                 const Ecore_Getopt_Desc *desc,
+                                 const char *str,
+                                 void *data,
+                                 Ecore_Getopt_Value *storage);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _ECORE_GETOPT_H */
index 4c692bb..6f14387 100644 (file)
@@ -1,38 +1,69 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-AM_CFLAGS = @WIN32_CFLAGS@
+AM_CPPFLAGS = @GLIB_CFLAGS@ @EVIL_CFLAGS@ @EINA_CFLAGS@ @WIN32_CPPFLAGS@ @EFL_ECORE_BUILD@
+AM_CFLAGS = @WIN32_CFLAGS@ @EFL_PTHREAD_CFLAGS@
 
 lib_LTLIBRARIES = libecore.la
-include_HEADERS = \
+includes_HEADERS = \
 Ecore.h \
-Ecore_Data.h \
-Ecore_Str.h
+Ecore_Getopt.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_la_SOURCES = \
 ecore.c \
-ecore_app.c \
+ecore_alloc.c \
 ecore_anim.c \
+ecore_app.c \
 ecore_events.c \
-ecore_exe.c \
-ecore_hash.c \
+ecore_getopt.c \
 ecore_idle_enterer.c \
 ecore_idle_exiter.c \
 ecore_idler.c \
-ecore_list.c \
+ecore_job.c \
 ecore_main.c \
-ecore_path.c \
-ecore_plugin.c \
-ecore_sheap.c \
-ecore_signal.c \
-ecore_str.c \
-ecore_strbuf.c \
-ecore_strings.c \
+ecore_pipe.c \
+ecore_poll.c \
 ecore_time.c \
 ecore_timer.c \
-ecore_tree.c \
-ecore_value.c \
-ecore_poll.c \
-ecore_private.h
+ecore_thread.c \
+ecore_glib.c \
+ecore_throttle.c
+
+if ECORE_HAVE_WIN32
+
+libecore_la_SOURCES += ecore_exe_win32.c
+
+else
+
+if ECORE_HAVE_WINCE
+
+libecore_la_SOURCES += ecore_exe_wince.c
+
+else
+
+if ECORE_HAVE_PS3
+
+libecore_la_SOURCES += ecore_exe_ps3.c
+
+else
+
+if ECORE_HAVE_EXOTIC
+
+libecore_la_SOURCES +=
+
+else
+
+libecore_la_SOURCES += ecore_signal.c ecore_exe.c
+
+endif
+
+endif
+
+endif
+
+endif
+
+libecore_la_LIBADD = @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @GLIB_LIBS@ @WIN32_LIBS@ @LTLIBINTL@ @EFL_PTHREAD_LIBS@ @rt_libs@ -lm
+libecore_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ @EFL_PTHREAD_LIBS@
 
-libecore_la_LIBADD = @dlopen_libs@ @EVIL_LIBS@ @WIN32_LIBS@ -lm
-libecore_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
+EXTRA_DIST = ecore_private.h
index 7ac32fa..0df319b 100644 (file)
@@ -1,8 +1,18 @@
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#ifndef _MSC_VER
+# include <unistd.h>
+#endif
+
 #ifdef HAVE_LOCALE_H
 # include <locale.h>
 #endif
 # include <langinfo.h>
 #endif
 
-#include "Ecore.h"
-#include "ecore_private.h"
+#ifdef HAVE_SYS_MMAN_H
+# include <sys/mman.h>
+#endif
 
 #ifdef HAVE_EVIL
 # include <Evil.h>
 #endif
+#include <Eina.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+#if HAVE_MALLINFO
+#include <malloc.h>
+
+static Ecore_Version _version = { VERS_MAJ, VERS_MIN, VERS_MIC, VERS_REV };
+EAPI Ecore_Version *ecore_version = &_version;
+
+#define KEEP_MAX(Global, Local) \
+  if (Global < (Local))         \
+    Global = Local;
+
+static Eina_Bool _ecore_memory_statistic(void *data);
+static int _ecore_memory_max_total = 0;
+static int _ecore_memory_max_free = 0;
+static pid_t _ecore_memory_pid = 0;
+#endif
 
 static const char *_ecore_magic_string_get(Ecore_Magic m);
 static int _ecore_init_count = 0;
-
+int _ecore_log_dom = -1;
 int _ecore_fps_debug = 0;
 
+typedef struct _Ecore_Safe_Call Ecore_Safe_Call;
+struct _Ecore_Safe_Call
+{
+   union {
+      Ecore_Cb      async;
+      Ecore_Data_Cb sync;
+   } cb;
+   void          *data;
+
+   Eina_Lock      m;
+   Eina_Condition c;
+
+   int            current_id;
+
+   Eina_Bool      sync : 1;
+   Eina_Bool      suspend : 1;
+};
+
+static void _ecore_main_loop_thread_safe_call(Ecore_Safe_Call *order);
+static void _thread_safe_cleanup(void *data);
+static void _thread_callback(void        *data,
+                             void        *buffer,
+                             unsigned int nbyte);
+static Eina_List *_thread_cb = NULL;
+static Ecore_Pipe *_thread_call = NULL;
+static Eina_Lock _thread_safety;
+static const int wakeup = 42;
+
+static int _thread_loop = 0;
+static Eina_Lock _thread_mutex;
+static Eina_Condition _thread_cond;
+static Eina_Lock _thread_feedback_mutex;
+static Eina_Condition _thread_feedback_cond;
+
+static Eina_Lock _thread_id_lock;
+static int _thread_id = -1;
+static int _thread_id_max = 0;
+static int _thread_id_update = 0;
+
+Eina_Lock _ecore_main_loop_lock;
+int _ecore_main_lock_count;
+
 /** OpenBSD does not define CODESET
  * FIXME ??
  */
@@ -32,6 +105,12 @@ int _ecore_fps_debug = 0;
 #endif
 
 /**
+ * @addtogroup Ecore_Init_Group
+ *
+ * @{
+ */
+
+/**
  * Set up connections, signal handlers, sockets etc.
  * @return 1 or greater on success, 0 otherwise
  *
@@ -56,29 +135,83 @@ int _ecore_fps_debug = 0;
 EAPI int
 ecore_init(void)
 {
-   if (++_ecore_init_count == 1)
-     {
+   if (++_ecore_init_count != 1)
+     return _ecore_init_count;
+
 #ifdef HAVE_LOCALE_H
-       setlocale(LC_CTYPE, "");
+   setlocale(LC_CTYPE, "");
+#endif
+   /*
+      if (strcmp(nl_langinfo(CODESET), "UTF-8"))
+      {
+        WRN("Not a utf8 locale!");
+      }
+    */
+#ifdef HAVE_EVIL
+   if (!evil_init())
+     return --_ecore_init_count;
 #endif
-       /*
-       if (strcmp(nl_langinfo(CODESET), "UTF-8"))
-         {
-            printf("WARNING: not a utf8 locale!\n");
-         }
-        */
-       if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1;
-       if (_ecore_fps_debug) _ecore_fps_debug_init();
-       _ecore_signal_init();
-       _ecore_exe_init();
+   if (!eina_init())
+     goto shutdown_evil;
+   _ecore_log_dom = eina_log_domain_register("ecore", ECORE_DEFAULT_LOG_COLOR);
+   if (_ecore_log_dom < 0)
+     {
+        EINA_LOG_ERR("Ecore was unable to create a log domain.");
+        goto shutdown_log_dom;
      }
+   if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1;
+   if (_ecore_fps_debug) _ecore_fps_debug_init();
+   if (!ecore_mempool_init()) goto shutdown_mempool;
+   _ecore_main_loop_init();
+   _ecore_signal_init();
+#ifndef HAVE_EXOTIC
+   _ecore_exe_init();
+#endif
+   _ecore_thread_init();
+   _ecore_glib_init();
+   _ecore_job_init();
+   _ecore_time_init();
+
+   eina_lock_new(&_thread_mutex);
+   eina_condition_new(&_thread_cond, &_thread_mutex);
+   eina_lock_new(&_thread_feedback_mutex);
+   eina_condition_new(&_thread_feedback_cond, &_thread_feedback_mutex);
+   _thread_call = ecore_pipe_add(_thread_callback, NULL);
+   eina_lock_new(&_thread_safety);
+
+   eina_lock_new(&_thread_id_lock);
+
+   eina_lock_new(&_ecore_main_loop_lock);
+
+#if HAVE_MALLINFO
+   if (getenv("ECORE_MEM_STAT"))
+     {
+        _ecore_memory_pid = getpid();
+        ecore_animator_add(_ecore_memory_statistic, NULL);
+     }
+#endif
+
+#if defined(GLIB_INTEGRATION_ALWAYS)
+   if (_ecore_glib_always_integrate) ecore_main_loop_glib_integrate();
+#endif
 
    return _ecore_init_count;
+
+shutdown_mempool:
+   ecore_mempool_shutdown();
+shutdown_log_dom:
+   eina_shutdown();
+shutdown_evil:
+#ifdef HAVE_EVIL
+   evil_shutdown();
+#endif
+   return --_ecore_init_count;
 }
 
 /**
  * Shut down connections, signal handlers sockets etc.
  *
+ * @return 0 if ecore shuts down, greater than 0 otherwise.
  * This function shuts down all things set up in ecore_init() and cleans up all
  * event queues, handlers, filters, timers, idlers, idle enterers/exiters
  * etc. set up after ecore_init() was called.
@@ -89,46 +222,353 @@ ecore_init(void)
 EAPI int
 ecore_shutdown(void)
 {
-   if (--_ecore_init_count)
-      return _ecore_init_count;
-
-   if (_ecore_fps_debug) _ecore_fps_debug_shutdown();
-   _ecore_poller_shutdown();
-   _ecore_animator_shutdown();
-   _ecore_exe_shutdown();
-   _ecore_idle_enterer_shutdown();
-   _ecore_idle_exiter_shutdown();
-   _ecore_idler_shutdown();
-   _ecore_timer_shutdown();
-   _ecore_event_shutdown();
-   _ecore_main_shutdown();
-   _ecore_signal_shutdown();
+     Ecore_Pipe *p;
+   /*
+    * take a lock here because _ecore_event_shutdown() does callbacks
+    */
+     _ecore_lock();
+     if (_ecore_init_count <= 0)
+       {
+          ERR("Init count not greater than 0 in shutdown.");
+          _ecore_unlock();
+          return 0;
+       }
+     if (--_ecore_init_count != 0)
+       goto unlock;
+   
+     if (_ecore_fps_debug) _ecore_fps_debug_shutdown();
+     _ecore_poller_shutdown();
+     _ecore_animator_shutdown();
+     _ecore_glib_shutdown();
+     _ecore_job_shutdown();
+     _ecore_thread_shutdown();
 
-   return _ecore_init_count;
+   /* this looks horrible - a hack for now, but something to note. as
+    * we delete the _thread_call pipe a thread COULD be doing
+    * ecore_pipe_write() or what not to it at the same time - we
+    * must ensure all possible users of this _thread_call are finished
+    * and exited before we delete it here */
+   /*
+    * ok - this causes other valgrind complaints regarding glib aquiring
+    * locks internally. so fix bug a or bug b. let's leave the original
+    * bug in then and leave this as a note for now
+    */
+   /*
+    * It should be fine now as we do wait for thread to shutdown before
+    * we try to destroy the pipe.
+    */
+     p = _thread_call;
+     _thread_call = NULL;
+     ecore_pipe_wait(p, 1, 0.1);
+     ecore_pipe_del(p);
+     eina_lock_free(&_thread_safety);
+     eina_condition_free(&_thread_cond);
+     eina_lock_free(&_thread_mutex);
+     eina_condition_free(&_thread_feedback_cond);
+     eina_lock_free(&_thread_feedback_mutex);
+     eina_lock_free(&_thread_id_lock);
+
+
+#ifndef HAVE_EXOTIC
+     _ecore_exe_shutdown();
+#endif
+     _ecore_idle_enterer_shutdown();
+     _ecore_idle_exiter_shutdown();
+     _ecore_idler_shutdown();
+     _ecore_timer_shutdown();
+     _ecore_event_shutdown();
+     _ecore_main_shutdown();
+     _ecore_signal_shutdown();
+     _ecore_main_loop_shutdown();
+
+#if HAVE_MALLINFO
+     if (getenv("ECORE_MEM_STAT"))
+       {
+          _ecore_memory_statistic(NULL);
+
+          ERR("[%i] Memory MAX total: %i, free: %i",
+              _ecore_memory_pid,
+              _ecore_memory_max_total,
+              _ecore_memory_max_free);
+       }
+#endif
+     ecore_mempool_shutdown();
+     eina_log_domain_unregister(_ecore_log_dom);
+     _ecore_log_dom = -1;
+     eina_shutdown();
+#ifdef HAVE_EVIL
+     evil_shutdown();
+#endif
+unlock:
+     _ecore_unlock();
+
+     return _ecore_init_count;
+}
+
+struct _Ecore_Fork_Cb
+{
+   Ecore_Cb func;
+   void *data;
+   Eina_Bool delete_me : 1;
+};
+
+typedef struct _Ecore_Fork_Cb Ecore_Fork_Cb;
+
+static int fork_cbs_walking = 0;
+static Eina_List *fork_cbs = NULL;
+
+EAPI Eina_Bool
+ecore_fork_reset_callback_add(Ecore_Cb func, const void *data)
+{
+   Ecore_Fork_Cb *fcb;
+   
+   fcb = calloc(1, sizeof(Ecore_Fork_Cb));
+   if (!fcb) return EINA_FALSE;
+   fcb->func = func;
+   fcb->data = (void *)data;
+   fork_cbs = eina_list_append(fork_cbs, fcb);
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+ecore_fork_reset_callback_del(Ecore_Cb func, const void *data)
+{
+   Eina_List *l;
+   Ecore_Fork_Cb *fcb;
+
+   EINA_LIST_FOREACH(fork_cbs, l, fcb)
+     {
+        if ((fcb->func == func) && (fcb->data == data))
+          {
+             if (!fork_cbs_walking)
+               {
+                  fork_cbs = eina_list_remove_list(fork_cbs, l);
+                  free(fcb);
+               }
+             else
+               fcb->delete_me = EINA_TRUE;
+             return EINA_TRUE;
+          }
+     }
+   return EINA_FALSE;
+}
+
+EAPI void
+ecore_fork_reset(void)
+{
+   Eina_List *l, *ln;
+   Ecore_Fork_Cb *fcb;
+   
+   eina_lock_take(&_thread_safety);
+
+   ecore_pipe_del(_thread_call);
+   _thread_call = ecore_pipe_add(_thread_callback, NULL);
+   /* If there was something in the pipe, trigger a wakeup again */
+   if (_thread_cb) ecore_pipe_write(_thread_call, &wakeup, sizeof (int));
+
+   eina_lock_release(&_thread_safety);
+
+   // should this be done withing the eina lock stuff?
+   
+   fork_cbs_walking++;
+   EINA_LIST_FOREACH(fork_cbs, l, fcb)
+     {
+        fcb->func(fcb->data);
+     }
+   fork_cbs_walking--;
+   
+   EINA_LIST_FOREACH_SAFE(fork_cbs, l, ln, fcb)
+     {
+        if (fcb->delete_me)
+          {
+             fork_cbs = eina_list_remove_list(fork_cbs, l);
+             free(fcb);
+          }
+     }
+}
+
+/**
+ * @}
+ */
+
+EAPI void
+ecore_main_loop_thread_safe_call_async(Ecore_Cb callback,
+                                       void    *data)
+{
+   Ecore_Safe_Call *order;
+
+   if (!callback) return;
+
+   if (eina_main_loop_is())
+     {
+        callback(data);
+        return;
+     }
+
+   order = malloc(sizeof (Ecore_Safe_Call));
+   if (!order) return;
+
+   order->cb.async = callback;
+   order->data = data;
+   order->sync = EINA_FALSE;
+   order->suspend = EINA_FALSE;
+
+   _ecore_main_loop_thread_safe_call(order);
+}
+
+EAPI void *
+ecore_main_loop_thread_safe_call_sync(Ecore_Data_Cb callback,
+                                      void         *data)
+{
+   Ecore_Safe_Call *order;
+   void *ret;
+
+   if (!callback) return NULL;
+
+   if (eina_main_loop_is())
+     {
+        return callback(data);
+     }
+
+   order = malloc(sizeof (Ecore_Safe_Call));
+   if (!order) return NULL;
+
+   order->cb.sync = callback;
+   order->data = data;
+   eina_lock_new(&order->m);
+   eina_condition_new(&order->c, &order->m);
+   order->sync = EINA_TRUE;
+   order->suspend = EINA_FALSE;
+
+   _ecore_main_loop_thread_safe_call(order);
+
+   eina_lock_take(&order->m);
+   eina_condition_wait(&order->c);
+   eina_lock_release(&order->m);
+
+   ret = order->data;
+
+   order->sync = EINA_FALSE;
+   order->cb.async = _thread_safe_cleanup;
+   order->data = order;
+
+   _ecore_main_loop_thread_safe_call(order);
+
+   return ret;
+}
+
+EAPI int
+ecore_thread_main_loop_begin(void)
+{
+   Ecore_Safe_Call *order;
+
+   if (eina_main_loop_is())
+     {
+        return ++_thread_loop;
+     }
+
+   order = malloc(sizeof (Ecore_Safe_Call));
+   if (!order) return -1;
+
+   eina_lock_take(&_thread_id_lock);
+   order->current_id = ++_thread_id_max;
+   if (order->current_id < 0)
+     {
+        _thread_id_max = 0;
+        order->current_id = ++_thread_id_max;
+     }
+   eina_lock_release(&_thread_id_lock);
+
+   eina_lock_new(&order->m);
+   eina_condition_new(&order->c, &order->m);
+   order->suspend = EINA_TRUE;
+
+   _ecore_main_loop_thread_safe_call(order);
+
+   eina_lock_take(&order->m);
+   while (order->current_id != _thread_id)
+     eina_condition_wait(&order->c);
+   eina_lock_release(&order->m);
+
+   eina_main_loop_define();
+
+   _thread_loop = 1;
+
+   return EINA_TRUE;
+}
+
+EAPI int
+ecore_thread_main_loop_end(void)
+{
+   int current_id;
+
+   if (_thread_loop == 0)
+     {
+        ERR("the main loop is not locked ! No matching call to ecore_thread_main_loop_begin().");
+        return -1;
+     }
+
+   /* until we unlock the main loop, this thread has the main loop id */
+   if (!eina_main_loop_is())
+     {
+        ERR("Not in a locked thread !");
+        return -1;
+     }
+
+   _thread_loop--;
+   if (_thread_loop > 0)
+     return _thread_loop;
+
+   current_id = _thread_id;
+
+   eina_lock_take(&_thread_mutex);
+   _thread_id_update = _thread_id;
+   eina_condition_broadcast(&_thread_cond);
+   eina_lock_release(&_thread_mutex);
+
+   eina_lock_take(&_thread_feedback_mutex);
+   while (current_id == _thread_id && _thread_id != -1)
+     eina_condition_wait(&_thread_feedback_cond);
+   eina_lock_release(&_thread_feedback_mutex);
+
+   return 0;
+}
+
+EAPI void
+ecore_print_warning(const char *function __UNUSED__,
+                    const char *sparam __UNUSED__)
+{
+   WRN("***** Developer Warning ***** :\n"
+       "\tThis program is calling:\n\n"
+       "\t%s();\n\n"
+       "\tWith the parameter:\n\n"
+       "\t%s\n\n"
+       "\tbeing NULL. Please fix your program.", function, sparam);
+   if (getenv("ECORE_ERROR_ABORT")) abort();
 }
 
 EAPI void
-_ecore_magic_fail(void *d, Ecore_Magic m, Ecore_Magic req_m, const char *fname)
+_ecore_magic_fail(const void *d,
+                  Ecore_Magic m,
+                  Ecore_Magic req_m,
+                  const char *fname __UNUSED__)
 {
-   fprintf(stderr,
-          "\n"
-          "*** ECORE ERROR: Ecore Magic Check Failed!!!\n"
-          "*** IN FUNCTION: %s()\n", fname);
+   ERR("\n"
+       "*** ECORE ERROR: Ecore Magic Check Failed!!!\n"
+       "*** IN FUNCTION: %s()", fname);
    if (!d)
-     fprintf(stderr, "  Input handle pointer is NULL!\n");
+     ERR("  Input handle pointer is NULL!");
    else if (m == ECORE_MAGIC_NONE)
-     fprintf(stderr, "  Input handle has already been freed!\n");
+     ERR("  Input handle has already been freed!");
    else if (m != req_m)
-     fprintf(stderr, "  Input handle is wrong type\n"
-                    "    Expected: %08x - %s\n"
-                    "    Supplied: %08x - %s\n",
-            (unsigned int)req_m, _ecore_magic_string_get(req_m),
-            (unsigned int)m, _ecore_magic_string_get(m));
-   fprintf(stderr,
-          "*** NAUGHTY PROGRAMMER!!!\n"
-          "*** SPANK SPANK SPANK!!!\n"
-          "*** Now go fix your code. Tut tut tut!\n"
-          "\n");
+     ERR("  Input handle is wrong type\n"
+         "    Expected: %08x - %s\n"
+         "    Supplied: %08x - %s",
+         (unsigned int)req_m, _ecore_magic_string_get(req_m),
+         (unsigned int)m, _ecore_magic_string_get(m));
+   ERR("*** NAUGHTY PROGRAMMER!!!\n"
+       "*** SPANK SPANK SPANK!!!\n"
+       "*** Now go fix your code. Tut tut tut!");
    if (getenv("ECORE_ERROR_ABORT")) abort();
 }
 
@@ -138,36 +578,48 @@ _ecore_magic_string_get(Ecore_Magic m)
    switch (m)
      {
       case ECORE_MAGIC_NONE:
-       return "None (Freed Object)";
-       break;
+        return "None (Freed Object)";
+        break;
+
       case ECORE_MAGIC_EXE:
-       return "Ecore_Exe (Executable)";
-       break;
+        return "Ecore_Exe (Executable)";
+        break;
+
       case ECORE_MAGIC_TIMER:
-       return "Ecore_Timer (Timer)";
-       break;
+        return "Ecore_Timer (Timer)";
+        break;
+
       case ECORE_MAGIC_IDLER:
-       return "Ecore_Idler (Idler)";
-       break;
+        return "Ecore_Idler (Idler)";
+        break;
+
       case ECORE_MAGIC_IDLE_ENTERER:
-       return "Ecore_Idle_Enterer (Idler Enterer)";
-       break;
+        return "Ecore_Idle_Enterer (Idler Enterer)";
+        break;
+
       case ECORE_MAGIC_IDLE_EXITER:
-       return "Ecore_Idle_Exiter (Idler Exiter)";
-       break;
+        return "Ecore_Idle_Exiter (Idler Exiter)";
+        break;
+
       case ECORE_MAGIC_FD_HANDLER:
-       return "Ecore_Fd_Handler (Fd Handler)";
-       break;
+        return "Ecore_Fd_Handler (Fd Handler)";
+        break;
+
+      case ECORE_MAGIC_WIN32_HANDLER:
+        return "Ecore_Win32_Handler (Win32 Handler)";
+        break;
+
       case ECORE_MAGIC_EVENT_HANDLER:
-       return "Ecore_Event_Handler (Event Handler)";
-       break;
+        return "Ecore_Event_Handler (Event Handler)";
+        break;
+
       case ECORE_MAGIC_EVENT:
-       return "Ecore_Event (Event)";
-       break;
+        return "Ecore_Event (Event)";
+        break;
+
       default:
-       return "<UNKNOWN>";
-     };
-   return "<UNKNOWN>";
+        return "<UNKNOWN>";
+     }
 }
 
 /* fps debug calls - for debugging how much time your app actually spends */
@@ -181,9 +633,9 @@ unsigned int *_ecore_fps_runtime_mmap = NULL;
 void
 _ecore_fps_debug_init(void)
 {
-   char  buf[4096];
-   char *tmp;
-   int   pid;
+   char buf[PATH_MAX];
+   const char *tmp;
+   int pid;
 
    _ecore_fps_debug_init_count++;
    if (_ecore_fps_debug_init_count > 1) return;
@@ -191,27 +643,47 @@ _ecore_fps_debug_init(void)
 #ifndef HAVE_EVIL
    tmp = "/tmp";
 #else
-   tmp = (char *)evil_tmpdir_get ();
+   tmp = evil_tmpdir_get ();
 #endif /* HAVE_EVIL */
    pid = (int)getpid();
    snprintf(buf, sizeof(buf), "%s/.ecore_fps_debug-%i", tmp, pid);
    _ecore_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
    if (_ecore_fps_debug_fd < 0)
      {
-       unlink(buf);
-       _ecore_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
+        unlink(buf);
+        _ecore_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
      }
    if (_ecore_fps_debug_fd >= 0)
      {
-       unsigned int zero = 0;
-
-       write(_ecore_fps_debug_fd, &zero, sizeof(unsigned int));
-       _ecore_fps_runtime_mmap = mmap(NULL, sizeof(unsigned int),
-                                      PROT_READ | PROT_WRITE,
-                                      MAP_SHARED,
-                                      _ecore_fps_debug_fd, 0);
-       if (_ecore_fps_runtime_mmap == MAP_FAILED)
-         _ecore_fps_runtime_mmap = NULL;
+        unsigned int zero = 0;
+        char *buf2 = (char *)&zero;
+        ssize_t todo = sizeof(unsigned int);
+
+        while (todo > 0)
+          {
+             ssize_t r = write(_ecore_fps_debug_fd, buf2, todo);
+             if (r > 0)
+               {
+                  todo -= r;
+                  buf2 += r;
+               }
+             else if ((r < 0) && (errno == EINTR))
+               continue;
+             else
+               {
+                  ERR("could not write to file '%s' fd %d: %s",
+                      tmp, _ecore_fps_debug_fd, strerror(errno));
+                  close(_ecore_fps_debug_fd);
+                  _ecore_fps_debug_fd = -1;
+                  return;
+               }
+          }
+        _ecore_fps_runtime_mmap = mmap(NULL, sizeof(unsigned int),
+                                       PROT_READ | PROT_WRITE,
+                                       MAP_SHARED,
+                                       _ecore_fps_debug_fd, 0);
+        if (_ecore_fps_runtime_mmap == MAP_FAILED)
+          _ecore_fps_runtime_mmap = NULL;
      }
 }
 
@@ -222,25 +694,25 @@ _ecore_fps_debug_shutdown(void)
    if (_ecore_fps_debug_init_count > 0) return;
    if (_ecore_fps_debug_fd >= 0)
      {
-       char buf[4096];
-        char *tmp;
-        int   pid;
+        char buf[4096];
+        const char *tmp;
+        int pid;
 
 #ifndef HAVE_EVIL
-   tmp = "/tmp";
+        tmp = "/tmp";
 #else
-   tmp = (char *)evil_tmpdir_get ();
+        tmp = (char *)evil_tmpdir_get ();
 #endif /* HAVE_EVIL */
-   pid = (int)getpid();
-       snprintf(buf, sizeof(buf), "%s/.ecore_fps_debug-%i", tmp, pid);
-       unlink(buf);
-       if (_ecore_fps_runtime_mmap)
-         {
-            munmap(_ecore_fps_runtime_mmap, sizeof(int));
-            _ecore_fps_runtime_mmap = NULL;
-         }
-       close(_ecore_fps_debug_fd);
-       _ecore_fps_debug_fd = -1;
+        pid = (int)getpid();
+        snprintf(buf, sizeof(buf), "%s/.ecore_fps_debug-%i", tmp, pid);
+        unlink(buf);
+        if (_ecore_fps_runtime_mmap)
+          {
+             munmap(_ecore_fps_runtime_mmap, sizeof(int));
+             _ecore_fps_runtime_mmap = NULL;
+          }
+        close(_ecore_fps_debug_fd);
+        _ecore_fps_debug_fd = -1;
      }
 }
 
@@ -250,15 +722,133 @@ _ecore_fps_debug_runtime_add(double t)
    if ((_ecore_fps_debug_fd >= 0) &&
        (_ecore_fps_runtime_mmap))
      {
-       unsigned int tm;
-
-       tm = (unsigned int)(t * 1000000.0);
-       /* i know its not 100% theoretically guaranteed, but i'd say a write */
-       /* of an int could be considered atomic for all practical purposes */
-       /* oh and since this is cumulative, 1 second = 1,000,000 ticks, so */
-       /* this can run for about 4294 seconds becore looping. if you are */
-       /* doing performance testing in one run for over an hour... well */
-       /* time to restart or handle a loop condition :) */
-       *(_ecore_fps_runtime_mmap) += tm;
+        unsigned int tm;
+
+        tm = (unsigned int)(t * 1000000.0);
+        /* i know its not 100% theoretically guaranteed, but i'd say a write */
+        /* of an int could be considered atomic for all practical purposes */
+        /* oh and since this is cumulative, 1 second = 1,000,000 ticks, so */
+        /* this can run for about 4294 seconds becore looping. if you are */
+        /* doing performance testing in one run for over an hour... well */
+        /* time to restart or handle a loop condition :) */
+        *(_ecore_fps_runtime_mmap) += tm;
+     }
+}
+
+#if HAVE_MALLINFO
+static Eina_Bool
+_ecore_memory_statistic(__UNUSED__ void *data)
+{
+   struct mallinfo mi;
+   static int uordblks = 0;
+   static int fordblks = 0;
+   Eina_Bool changed = EINA_FALSE;
+
+   mi = mallinfo();
+
+#define HAS_CHANGED(Global, Local) \
+  if (Global != Local)             \
+    {                              \
+       Global = Local;             \
+       changed = EINA_TRUE;        \
+    }
+
+   HAS_CHANGED(uordblks, mi.uordblks);
+   HAS_CHANGED(fordblks, mi.fordblks);
+
+   if (changed)
+     ERR("[%i] Memory total: %i, free: %i",
+         _ecore_memory_pid,
+         mi.uordblks,
+         mi.fordblks);
+
+   KEEP_MAX(_ecore_memory_max_total, mi.uordblks);
+   KEEP_MAX(_ecore_memory_max_free, mi.fordblks);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+#endif
+
+static void
+_ecore_main_loop_thread_safe_call(Ecore_Safe_Call *order)
+{
+   Eina_Bool count;
+
+   eina_lock_take(&_thread_safety);
+
+   count = _thread_cb ? 0 : 1;
+   _thread_cb = eina_list_append(_thread_cb, order);
+   if (count) ecore_pipe_write(_thread_call, &wakeup, sizeof (int));
+
+   eina_lock_release(&_thread_safety);
+}
+
+static void
+_thread_safe_cleanup(void *data)
+{
+   Ecore_Safe_Call *call = data;
+
+   eina_condition_free(&call->c);
+   eina_lock_free(&call->m);
+}
+
+void
+_ecore_main_call_flush(void)
+{
+   Ecore_Safe_Call *call;
+   Eina_List *callback;
+
+   eina_lock_take(&_thread_safety);
+   callback = _thread_cb;
+   _thread_cb = NULL;
+   eina_lock_release(&_thread_safety);
+
+   EINA_LIST_FREE(callback, call)
+     {
+        if (call->suspend)
+          {
+             eina_lock_take(&_thread_mutex);
+
+             eina_lock_take(&call->m);
+             _thread_id = call->current_id;
+             eina_condition_broadcast(&call->c);
+             eina_lock_release(&call->m);
+
+             while (_thread_id_update != _thread_id)
+               eina_condition_wait(&_thread_cond);
+             eina_lock_release(&_thread_mutex);
+
+             eina_main_loop_define();
+
+             eina_lock_take(&_thread_feedback_mutex);
+
+             _thread_id = -1;
+
+             eina_condition_broadcast(&_thread_feedback_cond);
+             eina_lock_release(&_thread_feedback_mutex);
+
+             _thread_safe_cleanup(call);
+             free(call);
+          }
+        else if (call->sync)
+          {
+             call->data = call->cb.sync(call->data);
+             eina_condition_broadcast(&call->c);
+          }
+        else
+          {
+             call->cb.async(call->data);
+             free(call);
+          }
      }
 }
+
+static void
+_thread_callback(void        *data __UNUSED__,
+                 void        *buffer __UNUSED__,
+                 unsigned int nbyte __UNUSED__)
+{
+   _ecore_main_call_flush();
+}
+
diff --git a/src/lib/ecore/ecore_alloc.c b/src/lib/ecore/ecore_alloc.c
new file mode 100644 (file)
index 0000000..58aa131
--- /dev/null
@@ -0,0 +1,132 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include <Eina.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+typedef struct _Ecore_Mempool Ecore_Mempool;
+struct _Ecore_Mempool
+{
+   const char *name;
+   Eina_Mempool *mp;
+   size_t size;
+};
+
+#define GENERIC_ALLOC_FREE(TYPE, Type)                                  \
+  extern size_t _ecore_sizeof_##TYPE;                                   \
+  Ecore_Mempool Type##_mp = { #TYPE,  NULL, 0 };                        \
+  TYPE *                                                                \
+  Type##_calloc(unsigned int num)                                       \
+  {                                                                     \
+     return eina_mempool_calloc(Type##_mp.mp,                           \
+                                num * _ecore_sizeof_##TYPE);            \
+  }                                                                     \
+  void                                                                  \
+  Type##_mp_free(TYPE *e)                                               \
+  {                                                                     \
+     eina_mempool_free(Type##_mp.mp, e);                                \
+  }
+
+GENERIC_ALLOC_FREE(Ecore_Animator, ecore_animator);
+GENERIC_ALLOC_FREE(Ecore_Event_Handler, ecore_event_handler);
+GENERIC_ALLOC_FREE(Ecore_Event_Filter, ecore_event_filter);
+GENERIC_ALLOC_FREE(Ecore_Event, ecore_event);
+GENERIC_ALLOC_FREE(Ecore_Idle_Exiter, ecore_idle_exiter);
+GENERIC_ALLOC_FREE(Ecore_Idle_Enterer, ecore_idle_enterer);
+GENERIC_ALLOC_FREE(Ecore_Idler, ecore_idler);
+GENERIC_ALLOC_FREE(Ecore_Job, ecore_job);
+GENERIC_ALLOC_FREE(Ecore_Timer, ecore_timer);
+GENERIC_ALLOC_FREE(Ecore_Poller, ecore_poller);
+GENERIC_ALLOC_FREE(Ecore_Pipe, ecore_pipe);
+GENERIC_ALLOC_FREE(Ecore_Fd_Handler, ecore_fd_handler);
+#ifdef _WIN32
+GENERIC_ALLOC_FREE(Ecore_Win32_Handler, ecore_win32_handler);
+#endif
+
+static Ecore_Mempool *mempool_array[] = {
+  &ecore_animator_mp,
+  &ecore_event_handler_mp,
+  &ecore_event_filter_mp,
+  &ecore_event_mp,
+  &ecore_idle_exiter_mp,
+  &ecore_idle_enterer_mp,
+  &ecore_idler_mp,
+  &ecore_job_mp,
+  &ecore_timer_mp,
+  &ecore_poller_mp,
+  &ecore_pipe_mp,
+  &ecore_fd_handler_mp,
+#ifdef _WIN32
+  &ecore_win32_handler_mp
+#endif
+};
+
+Eina_Bool
+ecore_mempool_init(void)
+{
+   const char *choice;
+   unsigned int i;
+
+#define MP_SIZE_INIT(TYPE, Type) \
+   Type##_mp.size = _ecore_sizeof_##TYPE
+
+   MP_SIZE_INIT(Ecore_Animator, ecore_animator);
+   MP_SIZE_INIT(Ecore_Event_Handler, ecore_event_handler);
+   MP_SIZE_INIT(Ecore_Event_Filter, ecore_event_filter);
+   MP_SIZE_INIT(Ecore_Event, ecore_event);
+   MP_SIZE_INIT(Ecore_Idle_Exiter, ecore_idle_exiter);
+   MP_SIZE_INIT(Ecore_Idle_Enterer, ecore_idle_enterer);
+   MP_SIZE_INIT(Ecore_Idler, ecore_idler);
+   MP_SIZE_INIT(Ecore_Job, ecore_job);
+   MP_SIZE_INIT(Ecore_Timer, ecore_timer);
+   MP_SIZE_INIT(Ecore_Poller, ecore_poller);
+   MP_SIZE_INIT(Ecore_Pipe, ecore_pipe);
+   MP_SIZE_INIT(Ecore_Fd_Handler, ecore_fd_handler);
+#ifdef _WIN32
+   MP_SIZE_INIT(Ecore_Win32_Handler, ecore_win32_handler);
+#endif
+#undef MP_SIZE_INIT
+
+   choice = getenv("EINA_MEMPOOL");
+   if ((!choice) || (!choice[0]))
+     choice = "chained_mempool";
+
+   for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
+     {
+     retry:
+        mempool_array[i]->mp = eina_mempool_add(choice, mempool_array[i]->name, NULL, mempool_array[i]->size, 16);
+        if (!mempool_array[i]->mp)
+          {
+             if (!(!strcmp(choice, "pass_through")))
+               {
+                  ERR("Falling back to pass through ! Previously tried '%s' mempool.", choice);
+                  choice = "pass_through";
+                  goto retry;
+               }
+             else
+               {
+                  ERR("Impossible to allocate mempool '%s' !", choice);
+                  return EINA_FALSE;
+               }
+          }
+     }
+   return EINA_TRUE;
+}
+
+void
+ecore_mempool_shutdown(void)
+{
+   unsigned int i;
+
+   for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
+     {
+        eina_mempool_del(mempool_array[i]->mp);
+        mempool_array[i]->mp = NULL;
+     }
+}
+
index 7c24813..67bf8b1 100644 (file)
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <math.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
+
+struct _Ecore_Animator
+{
+   EINA_INLIST;
+                     ECORE_MAGIC;
+
+   Ecore_Task_Cb     func;
+   void             *data;
+
+   double            start, run;
+   Ecore_Timeline_Cb run_func;
+   void             *run_data;
+
+   Eina_Bool         delete_me : 1;
+   Eina_Bool         suspended : 1;
+   Eina_Bool         just_added : 1;
+};
 
-static int _ecore_animator(void *data);
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Animator);
 
-static Ecore_Timer    *timer = NULL;
-static int             animators_delete_me = 0;
+static Eina_Bool _ecore_animator_run(void *data);
+static Eina_Bool _ecore_animator(void *data);
+
+static int animators_delete_me = 0;
 static Ecore_Animator *animators = NULL;
-static double          animators_frametime = 1.0 / 30.0;
-
-/**
- * Add a animator to tick off at every animaton tick during main loop execution.
- * @param func The function to call when it ticks off
- * @param data The data to pass to the function
- * @return A handle to the new animator
- * @ingroup Ecore_Animator_Group
- * 
- * This function adds a animator and returns its handle on success and NULL on
- * failure. The function @p func will be called every N seconds where N is the
- * frametime interval set by ecore_animator_frametime_set(). The function will
- * be passed the @p data pointer as its parameter.
- * 
- * When the animator @p func is called, it must return a value of either 1 or 0. 
- * If it returns 1 (or ECORE_CALLBACK_RENEW), it will be called again at the 
- * next tick, or if it returns 0 (or ECORE_CALLBACK_CANCEL) it will be deleted 
- * automatically making any references/handles for it invalid.
- */
-EAPI Ecore_Animator *
-ecore_animator_add(int (*func) (void *data), const void *data)
+static double animators_frametime = 1.0 / 30.0;
+
+static Ecore_Animator_Source src = ECORE_ANIMATOR_SOURCE_TIMER;
+static Ecore_Timer *timer = NULL;
+static int ticking = 0;
+static Ecore_Cb begin_tick_cb = NULL;
+static const void *begin_tick_data = NULL;
+static Ecore_Cb end_tick_cb = NULL;
+static const void *end_tick_data = NULL;
+
+static void
+_begin_tick(void)
+{
+   if (ticking) return;
+   ticking = 1;
+   switch (src)
+     {
+      case ECORE_ANIMATOR_SOURCE_TIMER:
+        if (!timer)
+          {
+             double t_loop = ecore_loop_time_get();
+             double sync_0 = 0.0;
+             double d = -fmod(t_loop - sync_0, animators_frametime);
+
+             timer = _ecore_timer_loop_add(animators_frametime,
+                                           _ecore_animator, NULL);
+             _ecore_timer_delay(timer, d);
+          }
+        break;
+
+      case ECORE_ANIMATOR_SOURCE_CUSTOM:
+        if (begin_tick_cb) begin_tick_cb((void *)begin_tick_data);
+        break;
+
+      default:
+        break;
+     }
+}
+
+static void
+_end_tick(void)
+{
+   if (!ticking) return;
+   ticking = 0;
+   switch (src)
+     {
+      case ECORE_ANIMATOR_SOURCE_TIMER:
+        if (timer)
+          {
+             _ecore_timer_del(timer);
+             timer = NULL;
+          }
+        break;
+
+      case ECORE_ANIMATOR_SOURCE_CUSTOM:
+        if (end_tick_cb) end_tick_cb((void *)end_tick_data);
+        break;
+
+      default:
+        break;
+     }
+}
+
+static Eina_Bool
+_do_tick(void)
 {
    Ecore_Animator *animator;
-   
-   if (!func) return NULL;
-   animator = calloc(1, sizeof(Ecore_Animator));
-   if (!animator) return NULL;
+
+   EINA_INLIST_FOREACH(animators, animator)
+     {
+        animator->just_added = EINA_FALSE;
+     }
+   EINA_INLIST_FOREACH(animators, animator)
+     {
+        if ((!animator->delete_me) && 
+            (!animator->suspended) && 
+            (!animator->just_added))
+          {
+             if (!_ecore_call_task_cb(animator->func, animator->data))
+               {
+                  animator->delete_me = EINA_TRUE;
+                  animators_delete_me++;
+               }
+          }
+        else animator->just_added = EINA_FALSE;
+     }
+   if (animators_delete_me)
+     {
+        Ecore_Animator *l;
+        for (l = animators; l; )
+          {
+             animator = l;
+             l = (Ecore_Animator *)EINA_INLIST_GET(l)->next;
+             if (animator->delete_me)
+               {
+                  animators = (Ecore_Animator *)
+                    eina_inlist_remove(EINA_INLIST_GET(animators),
+                                       EINA_INLIST_GET(animator));
+                  ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE);
+                  ecore_animator_mp_free(animator);
+                  animators_delete_me--;
+                  if (animators_delete_me == 0) break;
+               }
+          }
+     }
+   if (!animators)
+     {
+        _end_tick();
+        return ECORE_CALLBACK_CANCEL;
+     }
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Ecore_Animator *
+_ecore_animator_add(Ecore_Task_Cb func,
+                    const void   *data)
+{
+   Ecore_Animator *animator = NULL;
+
+   if (!func) return animator;
+   animator = ecore_animator_calloc(1);
+   if (!animator) return animator;
    ECORE_MAGIC_SET(animator, ECORE_MAGIC_ANIMATOR);
    animator->func = func;
    animator->data = (void *)data;
-   animators = _ecore_list2_append(animators, animator);
-   if (!timer)
-     timer = ecore_timer_add(animators_frametime, _ecore_animator, NULL);
+   animator->just_added = EINA_TRUE;
+   animators = (Ecore_Animator *)eina_inlist_append(EINA_INLIST_GET(animators), EINA_INLIST_GET(animator));
+   _begin_tick();
+   return animator;
+}
+
+EAPI Ecore_Animator *
+ecore_animator_add(Ecore_Task_Cb func,
+                   const void   *data)
+{
+   Ecore_Animator *animator;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   animator = _ecore_animator_add(func, data);
+   _ecore_unlock();
+
    return animator;
 }
 
-/**
- * Delete the specified animator from the animator list.
- * @param animator The animator to delete
- * @return The data pointer set for the animator
- * @ingroup Ecore_Animator_Group
- * 
- * Delete the specified @p aqnimator from the set of animators that are executed
- * during main loop execution. This function returns the data parameter that
- * was being passed to the callback on success, or NULL on failure. After this
- * call returns the specified animator object @p animator is invalid and should not
- * be used again. It will not get called again after deletion.
- */
+EAPI Ecore_Animator *
+ecore_animator_timeline_add(double            runtime,
+                            Ecore_Timeline_Cb func,
+                            const void       *data)
+{
+   Ecore_Animator *animator;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (runtime <= 0.0) runtime = 0.0;
+   animator = _ecore_animator_add(_ecore_animator_run, NULL);
+   animator->data = animator;
+   animator->run_func = func;
+   animator->run_data = (void *)data;
+   animator->start = ecore_loop_time_get();
+   animator->run = runtime;
+   _ecore_unlock();
+   return animator;
+}
+
+static double
+_pos_map_sin(double in)
+{
+   return eina_f32p32_double_to(eina_f32p32_sin(eina_f32p32_double_from(in)));
+}
+
+#if 0
+static double
+_pos_map_cos(double in)
+{
+   return eina_f32p32_double_to(eina_f32p32_cos(eina_f32p32_double_from(in)));
+}
+#endif
+
+static double
+_pos_map_accel_factor(double pos,
+                      double v1)
+{
+   int i, fact = (int)v1;
+   double p, o1 = pos, o2, v;
+   p = 1.0 - _pos_map_sin((M_PI / 2.0) + ((pos * M_PI) / 2.0));
+   o2 = p;
+   for (i = 0; i < fact; i++)
+     {
+        o1 = o2;
+        o2 = o2 * p;
+     }
+   v = v1 - (double)fact;
+   pos = (v * o2) + ((1.0 - v) * o1);
+   return pos;
+}
+
+static double
+_pos_map_pow(double pos,
+             double divis,
+             int    p)
+{
+   double v = 1.0;
+   int i;
+   for (i = 0; i < p; i++) v *= pos;
+   return ((pos * divis) * (1.0 - v)) + (pos * v);
+}
+
+static double
+_pos_map_spring(double pos,
+                int    bounces,
+                double decfac)
+{
+   int segnum, segpos, b1, b2;
+   double len, decay, decpos, p2;
+   if (bounces < 0) bounces = 0;
+   p2 = _pos_map_pow(pos, 0.5, 3);
+   len = (M_PI / 2.0) + ((double)bounces * M_PI);
+   segnum = (bounces * 2) + 1;
+   segpos = 2 * (((int)(p2 * segnum) + 1) / 2);
+   b1 = segpos;
+   b2 = segnum + 1;
+   if (b1 < 0) b1 = 0;
+   decpos = (double)b1 / (double)b2;
+   decay = _pos_map_accel_factor(1.0 - decpos, decfac);
+   return _pos_map_sin((M_PI / 2.0) + (p2 * len)) * decay;
+}
+
+#define DBL_TO(Fp) eina_f32p32_double_to(Fp)
+#define DBL_FROM(D) eina_f32p32_double_from(D)
+#define INT_FROM(I) eina_f32p32_int_from(I)
+#define SIN(Fp) eina_f32p32_sin(Fp)
+#define COS(Fp) eina_f32p32_cos(Fp)
+#define ADD(A, B) eina_f32p32_add(A, B)
+#define SUB(A, B) eina_f32p32_sub(A, B)
+#define MUL(A, B) eina_f32p32_mul(A, B)
+
+EAPI double
+ecore_animator_pos_map(double        pos,
+                       Ecore_Pos_Map map,
+                       double        v1,
+                       double        v2)
+{
+   /* purely functional - locking not required */
+    if (pos > 1.0) pos = 1.0;
+    else if (pos < 0.0)
+      pos = 0.0;
+    switch (map)
+      {
+       case ECORE_POS_MAP_LINEAR:
+         return pos;
+
+       case ECORE_POS_MAP_ACCELERATE:
+        /* pos = 1 - sin(Pi / 2 + pos * Pi / 2); */
+        pos = DBL_TO(SUB(INT_FROM(1), SIN(ADD((EINA_F32P32_PI >> 1), MUL(DBL_FROM(pos), (EINA_F32P32_PI >> 1))))));
+         return pos;
+
+       case ECORE_POS_MAP_DECELERATE:
+        /* pos = sin(pos * Pi / 2); */
+        pos = DBL_TO(SIN(MUL(DBL_FROM(pos), (EINA_F32P32_PI >> 1))));
+         return pos;
+
+       case ECORE_POS_MAP_SINUSOIDAL:
+        /* pos = (1 - cos(pos * Pi)) / 2 */
+        pos = DBL_TO((SUB(INT_FROM(1), COS(MUL(DBL_FROM(pos), EINA_F32P32_PI)))) >> 1);
+         return pos;
+
+       case ECORE_POS_MAP_ACCELERATE_FACTOR:
+         pos = _pos_map_accel_factor(pos, v1);
+         return pos;
+
+       case ECORE_POS_MAP_DECELERATE_FACTOR:
+         pos = 1.0 - _pos_map_accel_factor(1.0 - pos, v1);
+         return pos;
+
+       case ECORE_POS_MAP_SINUSOIDAL_FACTOR:
+         if (pos < 0.5) pos = _pos_map_accel_factor(pos * 2.0, v1) / 2.0;
+         else pos = 1.0 - (_pos_map_accel_factor((1.0 - pos) * 2.0, v1) / 2.0);
+         return pos;
+
+       case ECORE_POS_MAP_DIVISOR_INTERP:
+         pos = _pos_map_pow(pos, v1, (int)v2);
+         return pos;
+
+       case ECORE_POS_MAP_BOUNCE:
+         pos = _pos_map_spring(pos, (int)v2, v1);
+         if (pos < 0.0) pos = -pos;
+         pos = 1.0 - pos;
+         return pos;
+
+       case ECORE_POS_MAP_SPRING:
+         pos = 1.0 - _pos_map_spring(pos, (int)v2, v1);
+         return pos;
+
+       default:
+         return pos;
+      }
+    return pos;
+}
+
 EAPI void *
 ecore_animator_del(Ecore_Animator *animator)
 {
+   void *data = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
    if (!ECORE_MAGIC_CHECK(animator, ECORE_MAGIC_ANIMATOR))
      {
-       ECORE_MAGIC_FAIL(animator, ECORE_MAGIC_ANIMATOR,
-                        "ecore_animator_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(animator, ECORE_MAGIC_ANIMATOR,
+                         "ecore_animator_del");
+        goto unlock;
      }
-   if (animator->delete_me) return animator->data;
-   animator->delete_me = 1;
+   if (animator->delete_me)
+     {
+        data = animator->data;
+        goto unlock;
+     }
+   animator->delete_me = EINA_TRUE;
    animators_delete_me++;
-   return animator->data;
+   if (animator->run_func)
+     data = animator->run_data;
+   else
+     data = animator->data;
+unlock:
+   _ecore_unlock();
+   return data;
 }
 
-/**
- * Set the animator call interval in seconds.
- * @param frametime The time in seconds in between animator ticks.
- * 
- * This function sets the time interval (in seconds) inbetween animator ticks.
- */
 EAPI void
 ecore_animator_frametime_set(double frametime)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
    if (frametime < 0.0) frametime = 0.0;
-   if (animators_frametime == frametime) return;
+   if (animators_frametime == frametime) goto unlock;
    animators_frametime = frametime;
-   if (timer)
-     {
-       ecore_timer_del(timer);
-       timer = NULL;
-     }
-   if (animators)
-     timer = ecore_timer_add(animators_frametime, _ecore_animator, NULL);
+   _end_tick();
+   if (animators) _begin_tick();
+unlock:
+   _ecore_unlock();
 }
 
-/**
- * Get the animator call interval in seconds.
- * @return The time in second in between animator ticks.
- * 
- * this function retrieves the time inbetween animator ticks, in seconds.
- */
 EAPI double
 ecore_animator_frametime_get(void)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0.0);
    return animators_frametime;
 }
 
-void
-_ecore_animator_shutdown(void)
+EAPI void
+ecore_animator_freeze(Ecore_Animator *animator)
 {
-   if (timer)
-     {
-       ecore_timer_del(timer);
-       timer = NULL;
-     } 
-   while (animators)
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+   if (!ECORE_MAGIC_CHECK(animator, ECORE_MAGIC_ANIMATOR))
      {
-       Ecore_Animator *animator;
-       
-       animator = animators;
-       animators = _ecore_list2_remove(animators, animator);
-       ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE);
-       free(animator);
+        ECORE_MAGIC_FAIL(animator, ECORE_MAGIC_ANIMATOR,
+                         "ecore_animator_del");
+        goto unlock;
      }
+   if (animator->delete_me) goto unlock;
+   animator->suspended = EINA_TRUE;
+unlock:
+   _ecore_unlock();
 }
 
-static int
-_ecore_animator(void *data __UNUSED__)
+EAPI void
+ecore_animator_thaw(Ecore_Animator *animator)
 {
-   Ecore_List2 *l;
-
-   for (l = (Ecore_List2 *)animators; l;)
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+   if (!ECORE_MAGIC_CHECK(animator, ECORE_MAGIC_ANIMATOR))
      {
-       Ecore_Animator *animator;
-       
-       animator = (Ecore_Animator *)l;
-       l = l->next;
-       if (!animator->delete_me)
-         {
-            if (!animator->func(animator->data))
-              {
-                 animator->delete_me = 1;
-                 animators_delete_me++;
-              }
-         }
+        ECORE_MAGIC_FAIL(animator, ECORE_MAGIC_ANIMATOR,
+                         "ecore_animator_del");
+        goto unlock;
      }
-   if (animators_delete_me)
+   if (animator->delete_me) goto unlock;
+   animator->suspended = EINA_FALSE;
+unlock:
+   _ecore_unlock();
+}
+
+EAPI void
+ecore_animator_source_set(Ecore_Animator_Source source)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+   src = source;
+   _end_tick();
+   if (animators) _begin_tick();
+   _ecore_unlock();
+}
+
+EAPI Ecore_Animator_Source
+ecore_animator_source_get(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   return src;
+}
+
+EAPI void
+ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb    func,
+                                                     const void *data)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+   begin_tick_cb = func;
+   begin_tick_data = data;
+   _end_tick();
+   if (animators) _begin_tick();
+   _ecore_unlock();
+}
+
+EAPI void
+ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb    func,
+                                                   const void *data)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+   end_tick_cb = func;
+   end_tick_data = data;
+   _end_tick();
+   if (animators) _begin_tick();
+   _ecore_unlock();
+}
+
+EAPI void
+ecore_animator_custom_tick(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+   if (src == ECORE_ANIMATOR_SOURCE_CUSTOM) _do_tick();
+   _ecore_unlock();
+}
+
+void
+_ecore_animator_shutdown(void)
+{
+   _end_tick();
+   while (animators)
      {
-       for (l = (Ecore_List2 *)animators; l;)
-         {
-            Ecore_Animator *animator;
-            
-            animator = (Ecore_Animator *)l;
-            l = l->next;
-            if (animator->delete_me)
-              {
-                 animators = _ecore_list2_remove(animators, animator);
-                 ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE);
-                 free(animator);
-                 animators_delete_me--;
-                 if (animators_delete_me == 0) break;
-              }
-         }
+        Ecore_Animator *animator;
+
+        animator = animators;
+        animators = (Ecore_Animator *)eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animators));
+        ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE);
+        ecore_animator_mp_free(animator);
      }
-   if (!animators)
+}
+
+static Eina_Bool
+_ecore_animator_run(void *data)
+{
+   Ecore_Animator *animator = data;
+   double pos = 0.0, t;
+   Eina_Bool run_ret;
+
+   t = ecore_loop_time_get();
+   if (animator->run > 0.0)
      {
-       timer = NULL;
-       return 0;
+        pos = (t - animator->start) / animator->run;
+        if (pos > 1.0) pos = 1.0;
+        else if (pos < 0.0)
+          pos = 0.0;
      }
-   return 1;
+   run_ret = animator->run_func(animator->run_data, pos);
+   if (t >= (animator->start + animator->run)) run_ret = EINA_FALSE;
+   return run_ret;
+}
+
+static Eina_Bool
+_ecore_animator(void *data __UNUSED__)
+{
+   Eina_Bool r;
+   _ecore_lock();
+   r = _do_tick();
+   _ecore_unlock();
+   return r;
 }
+
index 5f11809..6e73da0 100644 (file)
@@ -1,20 +1,45 @@
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#ifndef _MSC_VER
+# include <unistd.h>
+#else
+# include <process.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
 #include "Ecore.h"
+#include "ecore_private.h"
 
 static int app_argc = 0;
 static char **app_argv = NULL;
 
 /**
+ * @addtogroup Ecore_Application_Group
+ *
+ * @{
+ */
+
+/**
  * Set up the programs command-line arguments.
  * @param argc The same as passed as argc to the programs main() function
  * @param argv The same as passed as argv to the programs main() function
- * 
+ *
  * A call to this function will store the programs command-line arguments
  * for later use by ecore_app_restart() or ecore_app_args_get().
  */
 EAPI void
-ecore_app_args_set(int argc, const char **argv)
+ecore_app_args_set(int          argc,
+                   const char **argv)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+
    if ((argc < 1) ||
        (!argv)) return;
    app_argc = argc;
@@ -25,7 +50,7 @@ ecore_app_args_set(int argc, const char **argv)
  * Return the programs stored command-line arguments.
  * @param argc A pointer to the return value to hold argc
  * @param argv A pointer to the return value to hold argv
- * 
+ *
  * When called, this funciton returns the arguments for the program stored by
  * ecore_app_args_set(). The integer pointed to by @p argc will be filled, if
  * the pointer is not NULL, and the string array pointer @p argv will be filled
@@ -33,15 +58,18 @@ ecore_app_args_set(int argc, const char **argv)
  * same set by ecore_app_args_set().
  */
 EAPI void
-ecore_app_args_get(int *argc, char ***argv)
+ecore_app_args_get(int    *argc,
+                   char ***argv)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+
    if (argc) *argc = app_argc;
    if (argv) *argv = app_argv;
 }
 
 /**
  * Restart the program executable with the command-line arguments stored.
- * 
+ *
  * This function will restart & re-execute this program in place of itself
  * using the command-line arguments stored by ecore_app_args_set(). This is
  * an easy way for a program to restart itself for cleanup purposes,
@@ -50,12 +78,19 @@ ecore_app_args_get(int *argc, char ***argv)
 EAPI void
 ecore_app_restart(void)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+#ifdef HAVE_EXECVP
    char *args[4096];
    int i;
-   
+
    if ((app_argc < 1) || (!app_argv)) return;
    if (app_argc >= 4096) return;
    for (i = 0; i < app_argc; i++) args[i] = app_argv[i];
    args[i] = NULL;
    execvp(app_argv[0], args);
+#endif
 }
+
+/**
+ * @}
+ */
index c33b244..bbfa7a9 100644 (file)
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
 
-static int                  events_num = 0;
-static Ecore_Event         *events = NULL;
+static int inpurge = 0;
+
+struct _Ecore_Event_Handler
+{
+   EINA_INLIST;
+                          ECORE_MAGIC;
+   int                    type;
+   Ecore_Event_Handler_Cb func;
+   void                  *data;
+   int                    references;
+   Eina_Bool              delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Event_Handler);
+
+struct _Ecore_Event_Filter
+{
+   EINA_INLIST;
+                   ECORE_MAGIC;
+   Ecore_Data_Cb   func_start;
+   Ecore_Filter_Cb func_filter;
+   Ecore_End_Cb    func_end;
+   void           *loop_data;
+   void           *data;
+   int             references;
+   Eina_Bool       delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Event_Filter);
+
+struct _Ecore_Event
+{
+   EINA_INLIST;
+                ECORE_MAGIC;
+   int          type;
+   void        *event;
+   Ecore_End_Cb func_free;
+   void        *data;
+   int          references;
+   Eina_Bool    delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Event);
+
+static int events_num = 0;
+static Ecore_Event *events = NULL;
+static Ecore_Event *event_current = NULL;
+static Ecore_Event *purge_events = NULL;
 
 static Ecore_Event_Handler **event_handlers = NULL;
-static int                   event_handlers_num = 0;
-static int                   event_handlers_alloc_num = 0;
-static Ecore_List2_Data     *event_handlers_delete_list = NULL;
-
-static Ecore_Event_Filter  *event_filters = NULL;
-static int                  event_filters_delete_me = 0;
-
-static int                  event_id_max = ECORE_EVENT_COUNT;
-
-static int                  ecore_raw_event_type = ECORE_EVENT_NONE;
-static void                *ecore_raw_event_event =  NULL;
-
-
-/**
- * Add an event handler.
- * @param type The type of the event this handler will get called for
- * @param func The function to call when the event is found in the queue
- * @param data A data pointer to pass to the called function @p func
- * @return A new Event handler, or NULL on failure
- * 
- * Add an event handler to the list of handlers. This will, on success, return
- * a handle to the event handler object that was created, that can be used
- * later to remove the handler using ecore_event_handler_del(). The @p type 
- * parameter is the iteger of the event type that will trigger this callback
- * to be called. The callback @p func is called when this event is processed
- * and will be passed the event type, a pointer to the private event
- * structure that is specific to that event type, and a data pointer that is 
- * provided in this call as the @p data parameter.
- * 
- * When the callback @p func is called, it must return 1 or 0. If it returns 
- * 1 (or ECORE_CALLBACK_RENEW), It will keep being called as per normal, for 
- * each handler set up for that event type. If it returns 0 (or 
- * ECORE_CALLBACK_CANCEL), it will cease processing handlers for that particular
- * event, so all handler set to handle that event type that have not already 
- * been called, will not be.
- */
+static Ecore_Event_Handler *event_handler_current = NULL;
+static int event_handlers_num = 0;
+static int event_handlers_alloc_num = 0;
+static Eina_List *event_handlers_delete_list = NULL;
+
+static Ecore_Event_Handler *event_handlers_add_list = NULL;
+
+static Ecore_Event_Filter *event_filters = NULL;
+static Ecore_Event_Filter *event_filter_current = NULL;
+static Ecore_Event *event_filter_event_current = NULL;
+static int event_filters_delete_me = 0;
+static int event_id_max = ECORE_EVENT_COUNT;
+static int ecore_raw_event_type = ECORE_EVENT_NONE;
+static void *ecore_raw_event_event = NULL;
+
+static void  _ecore_event_purge_deleted(void);
+static void *_ecore_event_del(Ecore_Event *event);
+
 EAPI Ecore_Event_Handler *
-ecore_event_handler_add(int type, int (*func) (void *data, int type, void *event), const void *data)
+ecore_event_handler_add(int                    type,
+                        Ecore_Event_Handler_Cb func,
+                        const void            *data)
 {
-   Ecore_Event_Handler *eh;
+   Ecore_Event_Handler *eh = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
 
-   if (!func) return NULL;
-   if ((type <= ECORE_EVENT_NONE) || (type >= event_id_max)) return NULL;
-   eh = calloc(1, sizeof(Ecore_Event_Handler));
-   if (!eh) return NULL;
+   if (!func) goto unlock;
+   if ((type <= ECORE_EVENT_NONE) || (type >= event_id_max)) goto unlock;
+   eh = ecore_event_handler_calloc(1);
+   if (!eh) goto unlock;
    ECORE_MAGIC_SET(eh, ECORE_MAGIC_EVENT_HANDLER);
    eh->type = type;
    eh->func = func;
    eh->data = (void *)data;
    if (type >= (event_handlers_num - 1))
      {
-       int p_alloc_num;
-       
-       p_alloc_num = event_handlers_alloc_num;
-       event_handlers_num = type + 1;
-       if (event_handlers_num > event_handlers_alloc_num)
-         {
-            Ecore_Event_Handler **new_handlers;
-            int i;
-            
-            event_handlers_alloc_num = ((event_handlers_num + 16) / 16) * 16;
-            new_handlers = realloc(event_handlers, event_handlers_alloc_num * sizeof(Ecore_Event_Handler *));
-            if (!new_handlers)
-              {
-                 free(eh);
-                 return NULL;
-              }
-            event_handlers = new_handlers;
-            for (i = p_alloc_num; i < event_handlers_alloc_num; i++)
-              event_handlers[i] = NULL;
-         }
+        int p_alloc_num;
+
+        p_alloc_num = event_handlers_alloc_num;
+        event_handlers_num = type + 1;
+        if (event_handlers_num > event_handlers_alloc_num)
+          {
+             Ecore_Event_Handler **new_handlers;
+             int i;
+
+             event_handlers_alloc_num = ((event_handlers_num + 16) / 16) * 16;
+             new_handlers = realloc(event_handlers, event_handlers_alloc_num * sizeof(Ecore_Event_Handler *));
+             if (!new_handlers)
+               {
+                  ecore_event_handler_mp_free(eh);
+                  goto unlock;
+               }
+             event_handlers = new_handlers;
+             for (i = p_alloc_num; i < event_handlers_alloc_num; i++)
+               event_handlers[i] = NULL;
+          }
      }
-   event_handlers[type] = _ecore_list2_append(event_handlers[type], eh);
+   if (ecore_raw_event_type == type)
+     event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh));
+   else if (type < event_handlers_alloc_num)
+     event_handlers[type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[type]), EINA_INLIST_GET(eh));
+
+unlock:
+   _ecore_unlock();
    return eh;
 }
 
-/**
- * Delete an event handler.
- * @param event_handler Event handler handle to delete
- * @return Data passed to handler
- * 
- * Delete a specified event handler from the handler list. On success this will
- * delete the event handler and return the pointer passed as @p data when the
- * handler was added by ecore_event_handler_add(). On failure NULL will be
- * returned. Once a handler is deleted it will no longer be called.
- */
 EAPI void *
 ecore_event_handler_del(Ecore_Event_Handler *event_handler)
 {
-   Ecore_List2_Data *node;
-   
-   if (!ECORE_MAGIC_CHECK(event_handler, ECORE_MAGIC_EVENT_HANDLER)) 
+   void *data = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!ECORE_MAGIC_CHECK(event_handler, ECORE_MAGIC_EVENT_HANDLER))
      {
-       ECORE_MAGIC_FAIL(event_handler, ECORE_MAGIC_EVENT_HANDLER,
-                        "ecore_event_handler_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(event_handler, ECORE_MAGIC_EVENT_HANDLER,
+                         "ecore_event_handler_del");
+        goto unlock;
      }
-   event_handler->delete_me = 1;
-   node = calloc(1, sizeof(Ecore_List2_Data));
-   node->data = event_handler;
-   event_handlers_delete_list = _ecore_list2_append(event_handlers_delete_list, node);
-   return event_handler->data;
+   data = _ecore_event_handler_del(event_handler);
+unlock:
+   _ecore_unlock();
+
+   return data;
+}
+
+EAPI void *
+ecore_event_handler_data_get(Ecore_Event_Handler *eh)
+{
+   void *data = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER))
+     {
+        ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_get");
+        goto unlock;
+     }
+   data = eh->data;
+unlock:
+   _ecore_unlock();
+   return data;
 }
 
-static void 
-_ecore_event_generic_free (void *data __UNUSED__, void *event)
+EAPI void *
+ecore_event_handler_data_set(Ecore_Event_Handler *eh,
+                             const void          *data)
 {
-   free (event);
+   void *old = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER))
+     {
+        ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_set");
+        goto unlock;
+     }
+   old = eh->data;
+   eh->data = (void *)data;
+unlock:
+   _ecore_unlock();
+
+   return old;
+}
+
+static void
+_ecore_event_generic_free(void *data __UNUSED__,
+                          void *event)
+{ /* DO NOT MEMPOOL FREE THIS */
+   free(event);
 }
 
-/**
- * Add an event to the event queue.
- * @param type The event type to add to the end of the event queue
- * @param ev The private data structure for this event type
- * @param func_free The function to be called to free this private structure
- * @param data The data pointer to be passed to the free function
- * @return A Handle for that event
- * 
- * On success this function returns a handle to an event on the event queue, or
- * NULL if it fails. If it succeeds, an event of type @p type will be added
- * to the queue for processing by event handlers added by 
- * ecore_event_handler_add(). The @p ev parameter will be a pointer to the event
- * private data that is specific to that event type. When the event is no
- * longer needed, @p func_free will be called and passed the private structure
- * pointer for cleaning up. If @p func_free is NULL, free() will be called
- * with the private structure pointer.
- * func_free is passed @p data as its data parameter.
- */
 EAPI Ecore_Event *
-ecore_event_add(int type, void *ev, void (*func_free) (void *data, void *ev), void *data)
+ecore_event_add(int          type,
+                void        *ev,
+                Ecore_End_Cb func_free,
+                void        *data)
 {
-/*   if (!ev) return NULL;*/
-   if (type <= ECORE_EVENT_NONE) return NULL;
-   if (type >= event_id_max) return NULL;
+   Ecore_Event *event = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+
+/*   if (!ev) goto unlock; */
+   if (type <= ECORE_EVENT_NONE) goto unlock;
+   if (type >= event_id_max) goto unlock;
    if ((ev) && (!func_free)) func_free = _ecore_event_generic_free;
-   return _ecore_event_add(type, ev, func_free, data);
+   event = _ecore_event_add(type, ev, func_free, data);
+unlock:
+   _ecore_unlock();
+   return event;
 }
 
-/**
- * Delete an event from the queue.
- * @param event The event handle to delete
- * @return The data pointer originally set for the event free function
- * 
- * This deletes the event @p event from the event queue, and returns the
- * @p data parameer originally set when adding it with ecore_event_add(). This
- * does not immediately call the free function, and it may be called later on
- * cleanup, and so if the free function depends on the data pointer to work,
- * you should defer cleaning of this till the free function is called later.
- */
 EAPI void *
 ecore_event_del(Ecore_Event *event)
 {
-   if (!ECORE_MAGIC_CHECK(event, ECORE_MAGIC_EVENT)) 
+   void *data = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!ECORE_MAGIC_CHECK(event, ECORE_MAGIC_EVENT))
      {
-       ECORE_MAGIC_FAIL(event, ECORE_MAGIC_EVENT, "ecore_event_del");  
-       return NULL;
+        ECORE_MAGIC_FAIL(event, ECORE_MAGIC_EVENT, "ecore_event_del");
+        goto unlock;
      }
+   EINA_SAFETY_ON_TRUE_GOTO(event->delete_me, unlock);
    event->delete_me = 1;
-   return event->data;
+   data = event->data;
+unlock:
+   _ecore_unlock();
+   return data;
 }
 
-/**
- * Allocate a new event type id sensibly and return the new id.
- * @return A new event type id.
- * 
- * This function allocates a new event type id and returns it. Once an event 
- * type has been allocated it can never be de-allocated during the life of
- * the program. There is no guarantee of the contents of this event ID, or how
- * it is calculated, except that the ID will be unique to the current instance
- * of the process.
- */
 EAPI int
 ecore_event_type_new(void)
 {
-   event_id_max++;
-   return event_id_max - 1;
+   int id;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   _ecore_lock();
+   id = event_id_max++;
+   _ecore_unlock();
+
+   return id;
 }
 
-/**
- * Add a filter the current event queue.
- * @param func_start Function to call just before filtering and return data
- * @param func_filter Function to call on each event
- * @param func_end Function to call after the queu has been filtered
- * @param data Data to pass to the filter functions
- * @return A filter handle
- * 
- * This adds a filter to call callbacks to loop through the event queue and 
- * filter events out of the queue. On failure NULL is returned. On success a
- * Filter handle is returned. Filters are called on the queue just before
- * Event handler processing to try and remove redundant events. Just as
- * processing starts @p func_start is called and passed the @p data pointer.
- * This function returns a pointer that is used as loop_data that is now passed to
- * @p func_filter as loop_data. @p func_filter is also passed @p data and the
- * event type and private event structure. If this callback returns 0, the
- * event is removed from the queue. If it returns 1, the event is kept. When
- * processing is finished @p func_end is called and is passed the loop_data
- * and @p data pointer to clean up.
- */
 EAPI Ecore_Event_Filter *
-ecore_event_filter_add(void * (*func_start) (void *data), int (*func_filter) (void *data, void *loop_data, int type, void *event), void (*func_end) (void *data, void *loop_data), const void *data)
+ecore_event_filter_add(Ecore_Data_Cb   func_start,
+                       Ecore_Filter_Cb func_filter,
+                       Ecore_End_Cb    func_end,
+                       const void     *data)
 {
-   Ecore_Event_Filter *ef;
-   
-   if (!func_filter) return NULL;
-   ef = calloc(1, sizeof(Ecore_Event_Filter));
-   if (!ef) return NULL;
+   Ecore_Event_Filter *ef = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!func_filter) goto unlock;
+   ef = ecore_event_filter_calloc(1);
+   if (!ef) goto unlock;
    ECORE_MAGIC_SET(ef, ECORE_MAGIC_EVENT_FILTER);
    ef->func_start = func_start;
    ef->func_filter = func_filter;
    ef->func_end = func_end;
    ef->data = (void *)data;
-   event_filters = _ecore_list2_append(event_filters, ef);
+   event_filters = (Ecore_Event_Filter *)eina_inlist_append(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(ef));
+unlock:
+   _ecore_unlock();
    return ef;
 }
 
-/**
- * Delete an event filter.
- * @param ef The event filter handle
- * @return The data set for the filter
- * 
- * Delete a filter that has been added by its @p ef handle. On success this
- * will return the data pointer set when this filter was added. On failure
- * NULL is returned.
- */
 EAPI void *
 ecore_event_filter_del(Ecore_Event_Filter *ef)
-{   
+{
+   void *data = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
    if (!ECORE_MAGIC_CHECK(ef, ECORE_MAGIC_EVENT_FILTER))
      {
-       ECORE_MAGIC_FAIL(ef, ECORE_MAGIC_EVENT_FILTER, "ecore_event_filter_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(ef, ECORE_MAGIC_EVENT_FILTER, "ecore_event_filter_del");
+        goto unlock;
      }
+   EINA_SAFETY_ON_TRUE_GOTO(ef->delete_me, unlock);
    ef->delete_me = 1;
    event_filters_delete_me = 1;
-   return ef->data;
+   data = ef->data;
+unlock:
+   _ecore_unlock();
+
+   return data;
 }
 
-/**
- * Return the current event type being handled.
- * @return The current event type being handled if inside a handler callback
- * 
- * If the program is currently inside an Ecore event handler callback this
- * will return the type of the current event being processed. If Ecore is
- * not inside an event handler, ECORE_EVENT_NONE is returned.
- * 
- * This is useful when certain Ecore modules such as Ecore_Evas "swallow"
- * events and not all the original information is passed on. In special cases
- * this extra information may be useful or needed and using this call can let
- * the program know if the event type being handled is one it wants to get more
- * information about.
- */
 EAPI int
 ecore_event_current_type_get(void)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
    return ecore_raw_event_type;
 }
 
-/**
- * Return the current event type pointer handled.
- * @return The current event pointer being handled if inside a handler callback
- * 
- * If the program is currently inside an Ecore event handler callback this
- * will return the pointer of the current event being processed. If Ecore is
- * not inside an event handler, NULL will be returned.
- * 
- * This is useful when certain Ecore modules such as Ecore_Evas "swallow"
- * events and not all the original information is passed on. In special cases
- * this extra information may be useful or needed and using this call can let
- * the program access the event data if the type of the event is handled by
- * the program.
- */
 EAPI void *
 ecore_event_current_event_get(void)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    return ecore_raw_event_event;
 }
 
+EAPI void *
+_ecore_event_handler_del(Ecore_Event_Handler *event_handler)
+{
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(event_handler->delete_me, NULL);
+   event_handler->delete_me = 1;
+   event_handlers_delete_list = eina_list_append(event_handlers_delete_list, event_handler);
+   return event_handler->data;
+}
+
 void
 _ecore_event_shutdown(void)
 {
    int i;
-   
+   Ecore_Event_Handler *eh;
+   Ecore_Event_Filter *ef;
+
    while (events) _ecore_event_del(events);
+   event_current = NULL;
    for (i = 0; i < event_handlers_num; i++)
      {
-       while (event_handlers[i])
-         {
-            Ecore_Event_Handler *eh;
-            
-            eh = event_handlers[i];
-            event_handlers[i] = _ecore_list2_remove(event_handlers[i], eh);
-            ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
-            free(eh);
-         }
-     }
-   while (event_handlers_delete_list)
-     {
-       Ecore_List2_Data *ehd;
-       
-       ehd = event_handlers_delete_list;
-       event_handlers_delete_list = _ecore_list2_remove(event_handlers_delete_list, ehd);
-       free(ehd);
+        while ((eh = event_handlers[i]))
+          {
+             event_handlers[i] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[i]), EINA_INLIST_GET(event_handlers[i]));
+             ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
+             if (!eh->delete_me) ecore_event_handler_mp_free(eh);
+          }
      }
+   EINA_LIST_FREE(event_handlers_delete_list, eh)
+     ecore_event_handler_mp_free(eh);
    if (event_handlers) free(event_handlers);
    event_handlers = NULL;
    event_handlers_num = 0;
    event_handlers_alloc_num = 0;
-   while (event_filters)
+   while ((ef = event_filters))
      {
-       Ecore_Event_Filter *ef;
-       
-       ef = event_filters;
-       event_filters = _ecore_list2_remove(event_filters, ef);   
-       ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
-       free(ef);
+        event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(event_filters));
+        ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
+        ecore_event_filter_mp_free(ef);
      }
    event_filters_delete_me = 0;
+   event_filter_current = NULL;
+   event_filter_event_current = NULL;
 }
 
 int
 _ecore_event_exist(void)
 {
-   if (events) return 1;
+   Ecore_Event *e;
+   EINA_INLIST_FOREACH(events, e)
+     if (!e->delete_me) return 1;
    return 0;
 }
 
 Ecore_Event *
-_ecore_event_add(int type, void *ev, void (*func_free) (void *data, void *ev), void *data)
+_ecore_event_add(int          type,
+                 void        *ev,
+                 Ecore_End_Cb func_free,
+                 void        *data)
 {
    Ecore_Event *e;
-   
-   e = calloc(1, sizeof(Ecore_Event));
+
+   e = ecore_event_calloc(1);
    if (!e) return NULL;
    ECORE_MAGIC_SET(e, ECORE_MAGIC_EVENT);
    e->type = type;
    e->event = ev;
    e->func_free = func_free;
    e->data = data;
-   events = _ecore_list2_append(events, e);
-   events_num++;
+   if (inpurge > 0)
+     {
+        purge_events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(e));
+        events_num++;
+     }
+   else
+     {
+        events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
+        events_num++;
+     }
    return e;
 }
 
@@ -352,113 +388,227 @@ void *
 _ecore_event_del(Ecore_Event *event)
 {
    void *data;
-   
+
    data = event->data;
-   if (event->func_free) event->func_free(event->data, event->event);
-   events = _ecore_list2_remove(events, event);
+   if (event->func_free) _ecore_call_end_cb(event->func_free, event->data, event->event);
+   events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(events), EINA_INLIST_GET(event));
    ECORE_MAGIC_SET(event, ECORE_MAGIC_NONE);
-   free(event);
+   ecore_event_mp_free(event);
    events_num--;
    return data;
 }
 
-void
-_ecore_event_call(void)
+static void
+_ecore_event_purge_deleted(void)
 {
-   Ecore_List2 *l, *ll;
-   Ecore_Event *e;
-   Ecore_Event_Filter *ef;
-   Ecore_Event_Handler *eh;
-   Ecore_List2_Data *ehd;
-   int handle_count;
+   Ecore_Event *itr = events;
 
-   for (l = (Ecore_List2 *)event_filters; l; l = l->next)
+   inpurge++;
+   while (itr)
      {
-       ef = (Ecore_Event_Filter *)l;
-       if (!ef->delete_me)
-         {
-            if (ef->func_start)
-              ef->loop_data = ef->func_start(ef->data);
-            for (ll = (Ecore_List2 *)events; ll; ll = ll->next)
-              {
-                 e = (Ecore_Event *)ll;
-                 if (!ef->func_filter(ef->loop_data, ef->data,
-                                      e->type, e->event))
-                   {
-//                    printf("FILTER SAID TO DEL ev %p\n", e->event);
-                      ecore_event_del(e);
-                   }
-              }
-            if (ef->func_end)
-              ef->func_end(ef->data, ef->loop_data);
-         }
+        Ecore_Event *next = (Ecore_Event *)EINA_INLIST_GET(itr)->next;
+        if ((!itr->references) && (itr->delete_me))
+          _ecore_event_del(itr);
+        itr = next;
+     }
+   inpurge--;
+   while (purge_events)
+     {
+        Ecore_Event *e = purge_events;
+        purge_events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(purge_events));
+        events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
+     }
+}
+
+static inline void
+_ecore_event_filters_apply()
+{
+   if (!event_filter_current)
+     {
+        /* regular main loop, start from head */
+         event_filter_current = event_filters;
+     }
+   else
+     {
+        /* recursive main loop, continue from where we were */
+         event_filter_current = (Ecore_Event_Filter *)EINA_INLIST_GET(event_filter_current)->next;
+     }
+
+   while (event_filter_current)
+     {
+        Ecore_Event_Filter *ef = event_filter_current;
+
+        if (!ef->delete_me)
+          {
+             ef->references++;
+
+             if (ef->func_start)
+               ef->loop_data = _ecore_call_data_cb(ef->func_start, ef->data);
+
+             if (!event_filter_event_current)
+               {
+     /* regular main loop, start from head */
+                   event_filter_event_current = events;
+               }
+             else
+               {
+     /* recursive main loop, continue from where we were */
+                   event_filter_event_current = (Ecore_Event *)EINA_INLIST_GET(event_filter_event_current)->next;
+               }
+
+             while (event_filter_event_current)
+               {
+                  Ecore_Event *e = event_filter_event_current;
+
+                  if (!_ecore_call_filter_cb(ef->func_filter, ef->data,
+                                             ef->loop_data, e->type, e->event))
+                    {
+                       ecore_event_del(e);
+                    }
+
+                  if (event_filter_event_current) /* may have changed in recursive main loops */
+                    event_filter_event_current = (Ecore_Event *)EINA_INLIST_GET(event_filter_event_current)->next;
+               }
+             if (ef->func_end)
+               _ecore_call_end_cb(ef->func_end, ef->data, ef->loop_data);
+
+             ef->references--;
+          }
+
+        if (event_filter_current) /* may have changed in recursive main loops */
+          event_filter_current = (Ecore_Event_Filter *)EINA_INLIST_GET(event_filter_current)->next;
      }
    if (event_filters_delete_me)
      {
-       for (l = (Ecore_List2 *)event_filters; l;)
-         {
-            ef = (Ecore_Event_Filter *)l;
-            l = l->next;
-            if (ef->delete_me)
-              {
-                 event_filters = _ecore_list2_remove(event_filters, ef);
-                 ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
-                 free(ef);
-              }
-         }
-       event_filters_delete_me = 0;
+        int deleted_in_use = 0;
+        Ecore_Event_Filter *l;
+        for (l = event_filters; l; )
+          {
+             Ecore_Event_Filter *ef = l;
+             l = (Ecore_Event_Filter *)EINA_INLIST_GET(l)->next;
+             if (ef->delete_me)
+               {
+                  if (ef->references)
+                    {
+                       deleted_in_use++;
+                       continue;
+                    }
+
+                  event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(ef));
+                  ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
+                  ecore_event_filter_mp_free(ef);
+               }
+          }
+        if (!deleted_in_use)
+          event_filters_delete_me = 0;
      }
-//   printf("EVENT BATCH...\n");
-   for (l = (Ecore_List2 *)events; l; l = l->next)
+}
+
+void
+_ecore_event_call(void)
+{
+   Eina_List *l, *l_next;
+   Ecore_Event_Handler *eh;
+
+   _ecore_event_filters_apply();
+
+   if (!event_current)
      {
-       e = (Ecore_Event *)l;
-       if (!e->delete_me)
-         {
-            handle_count = 0;
-            ecore_raw_event_type = e->type;
-            ecore_raw_event_event = e->event;
-//          printf("HANDLE ev type %i, %p\n", e->type, e->event);
-            if ((e->type >= 0) && (e->type < event_handlers_num))
-              {
-                 for (ll = (Ecore_List2 *)event_handlers[e->type]; ll; ll = ll->next)
-                   {
-                      eh = (Ecore_Event_Handler *)ll;
-                      if (!eh->delete_me)
-                        {
-                           handle_count++;
-                           if (!eh->func(eh->data, e->type, e->event))
-                             break;  /* 0 == "call no further handlers" */
-                        }
-                   }
-              }
-            /* if no handlers were set for EXIT signal - then default is */
-            /* to quit the main loop */
-            if ((e->type == ECORE_EVENT_SIGNAL_EXIT) && (handle_count == 0))
-              ecore_main_loop_quit();
-         }
+        /* regular main loop, start from head */
+         event_current = events;
+         event_handler_current = NULL;
      }
-//   printf("EVENT BATCH DONE\n");
+
+   while (event_current)
+     {
+        Ecore_Event *e = event_current;
+        int handle_count = 0;
+
+        if (e->delete_me)
+          {
+             event_current = (Ecore_Event *)EINA_INLIST_GET(event_current)->next;
+             continue;
+          }
+
+        ecore_raw_event_type = e->type;
+        ecore_raw_event_event = e->event;
+        e->references++;
+        if ((e->type >= 0) && (e->type < event_handlers_num))
+          {
+             if (!event_handler_current)
+               {
+     /* regular main loop, start from head */
+                   event_handler_current = event_handlers[e->type];
+               }
+             else
+               {
+     /* recursive main loop, continue from where we were */
+                   event_handler_current = (Ecore_Event_Handler *)EINA_INLIST_GET(event_handler_current)->next;
+               }
+
+             while ((event_handler_current) && (!e->delete_me))
+               {
+                  eh = event_handler_current;
+                  if (!eh->delete_me)
+                    {
+                       Eina_Bool ret;
+
+                       handle_count++;
+
+                       eh->references++;
+                       ret = _ecore_call_handler_cb(eh->func, eh->data, e->type, e->event);
+                       eh->references--;
+
+                       if (!ret)
+                         {
+                            event_handler_current = NULL;
+                            break;  /* 0 == "call no further handlers" */
+                         }
+                    }
+
+                  if (event_handler_current) /* may have changed in recursive main loops */
+                    event_handler_current = (Ecore_Event_Handler *)EINA_INLIST_GET(event_handler_current)->next;
+               }
+          }
+        while (event_handlers_add_list)
+          {
+             eh = event_handlers_add_list;
+             event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh));
+             event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh));
+          }
+        /* if no handlers were set for EXIT signal - then default is */
+        /* to quit the main loop */
+        if ((e->type == ECORE_EVENT_SIGNAL_EXIT) && (handle_count == 0))
+          ecore_main_loop_quit();
+        e->references--;
+        e->delete_me = 1;
+
+        if (event_current) /* may have changed in recursive main loops */
+          event_current = (Ecore_Event *)EINA_INLIST_GET(event_current)->next;
+     }
+
    ecore_raw_event_type = ECORE_EVENT_NONE;
    ecore_raw_event_event = NULL;
-   
-   while (events) _ecore_event_del(events);
-   while (event_handlers_delete_list)
+
+   _ecore_event_purge_deleted();
+
+   EINA_LIST_FOREACH_SAFE(event_handlers_delete_list, l, l_next, eh)
      {
-       ehd = event_handlers_delete_list;
-       eh = ehd->data;
-       event_handlers[eh->type] = _ecore_list2_remove(event_handlers[eh->type], eh);
-       event_handlers_delete_list = _ecore_list2_remove(event_handlers_delete_list, ehd);
-       ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
-       free(eh);
-       free(ehd);
+        if (eh->references) continue;
+
+        event_handlers_delete_list = eina_list_remove_list(event_handlers_delete_list, l);
+
+        event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh));
+        ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
+        ecore_event_handler_mp_free(eh);
      }
 }
 
-EAPI void *
+void *
 _ecore_event_signal_user_new(void)
 {
    Ecore_Event_Signal_User *e;
-   
+
    e = calloc(1, sizeof(Ecore_Event_Signal_User));
    return e;
 }
@@ -467,7 +617,7 @@ void *
 _ecore_event_signal_hup_new(void)
 {
    Ecore_Event_Signal_Hup *e;
-   
+
    e = calloc(1, sizeof(Ecore_Event_Signal_Hup));
    return e;
 }
@@ -476,7 +626,7 @@ void *
 _ecore_event_signal_exit_new(void)
 {
    Ecore_Event_Signal_Exit *e;
-   
+
    e = calloc(1, sizeof(Ecore_Event_Signal_Exit));
    return e;
 }
@@ -485,7 +635,7 @@ void *
 _ecore_event_signal_power_new(void)
 {
    Ecore_Event_Signal_Power *e;
-   
+
    e = calloc(1, sizeof(Ecore_Event_Signal_Power));
    return e;
 }
@@ -495,3 +645,4 @@ _ecore_event_signal_realtime_new(void)
 {
    return calloc(1, sizeof(Ecore_Event_Signal_Realtime));
 }
+
index ed32bce..7cc4b0f 100644 (file)
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 #include <errno.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#ifdef HAVE_SYS_PRCTL_H
+# include <sys/prctl.h>
+#endif
+
 #ifdef HAVE_SYS_WAIT_H
 # include <sys/wait.h>
-#endif /* HAVE_SYS_WAIT_H */
-#include "ecore_private.h"
+#endif
+
 #include "Ecore.h"
+#include "ecore_private.h"
 
-#ifndef _WIN32
+/* FIXME: Getting respawn to work
+ *
+ * There is no way that we can do anything about the internal state info of
+ * an external exe.  The same can be said about the state of user code.  User
+ * code in this context means the code that is using ecore_exe to manage exe's
+ * for it.
+ *
+ * Document that the exe must be respawnable, in other words, there is no
+ * state that it cannot regenerate by just killing it and starting it again.
+ * This includes state that the user code knows about, as the respawn is
+ * transparent to that code.  On the other hand, maybe a respawn event might
+ * be useful, or maybe resend the currently non existent add event.  For
+ * consistancy with ecore_con, an add event is good anyway.
+ *
+ * The Ecore_exe structure is reused for respawning, so that the (opaque)
+ * pointer held by the user remains valid.  This means that the Ecore_Exe
+ * init and del functions may need to be split into two parts each to avoid
+ * duplicating code - common code part, and the rest.  This implies that
+ * the unchanging members mentioned next should NEVER change.
+ *
+ * These structure members don't need to change -
+ *   __list_data       - we stay on the list
+ *   ECORE_MAGIC       - this is a constant
+ *   data              - passed in originally
+ *   cmd               - passed in originally
+ *   flags             - passed in originally
+ *
+ * These structure members need to change -
+ *   tag               - state that must be regenerated, zap it
+ *   pid               - it will be different
+ *   child_fd_write    - it will be different
+ *   child_fd_read     - it will be different
+ *   child_fd_error    - it will be different
+ *   write_fd_handler  - we cannot change the fd used by a handler, this changes coz the fd changes.
+ *   read_fd_handler   - we cannot change the fd used by a handler, this changes coz the fd changes.
+ *   error_fd_handler  - we cannot change the fd used by a handler, this changes coz the fd changes.
+ *
+ * Hmm, the read, write, and error buffers could be tricky.
+ * They are not atomic, and could be in a semi complete state.
+ * They fall into the "state must be regenerated" mentioned above.
+ * A respawn/add event should take care of it.
+ *
+ * These structure members need to change -
+ *   write_data_buf    - state that must be regenerated, zap it
+ *   write_data_size   - state that must be regenerated, zap it
+ *   write_data_offset - state that must be regenerated, zap it
+ *   read_data_buf     - state that must be regenerated, zap it
+ *   read_data_size    - state that must be regenerated, zap it
+ *   error_data_buf    - state that must be regenerated, zap it
+ *   error_data_size   - state that must be regenerated, zap it
+ *   close_write       - state that must be regenerated, zap it
+ *
+ * There is the problem that an exe that fell over and needs respawning
+ * might keep falling over, keep needing to be respawned, and tie up system
+ * resources with the constant respawning.  An exponentially increasing
+ * timeout (with maximum timeout) between respawns should take care of that.
+ * Although this is not a "contention for a resource" problem, the exe falling
+ * over may be, so a random element added to the timeout may help, and won't
+ * hurt.  The user code may need to be informed that a timeout is in progress.
+ */
+
+struct _Ecore_Exe
+{
+   EINA_INLIST;
+                     ECORE_MAGIC;
+   pid_t             pid;
+   void             *data;
+   char             *tag, *cmd;
+   Ecore_Exe_Flags   flags;
+   Ecore_Fd_Handler *write_fd_handler; /* the fd_handler to handle write to child - if this was used, or NULL if not */
+   Ecore_Fd_Handler *read_fd_handler; /* the fd_handler to handle read from child - if this was used, or NULL if not */
+   Ecore_Fd_Handler *error_fd_handler; /* the fd_handler to handle errors from child - if this was used, or NULL if not */
+   void             *write_data_buf; /* a data buffer for data to write to the child -
+                                      * realloced as needed for more data and flushed when the fd handler says writes are possible
+                                      */
+   int               write_data_size; /* the size in bytes of the data buffer */
+   int               write_data_offset; /* the offset in bytes in the data buffer */
+   void             *read_data_buf; /* data read from the child awating delivery to an event */
+   int               read_data_size; /* data read from child in bytes */
+   void             *error_data_buf; /* errors read from the child awating delivery to an event */
+   int               error_data_size; /* errors read from child in bytes */
+   int               child_fd_write; /* fd to write TO to send data to the child */
+   int               child_fd_read; /* fd to read FROM when child has sent us (the parent) data */
+   int               child_fd_error; /* fd to read FROM when child has sent us (the parent) errors */
+   int               child_fd_write_x; /* fd to write TO to send data to the child */
+   int               child_fd_read_x; /* fd to read FROM when child has sent us (the parent) data */
+   int               child_fd_error_x; /* fd to read FROM when child has sent us (the parent) errors */
+   Eina_Bool         close_stdin : 1;
+
+   int               start_bytes, end_bytes, start_lines, end_lines; /* Number of bytes/lines to auto pipe at start/end of stdout/stderr. */
+
+   Ecore_Timer      *doomsday_clock; /* The Timer of Death.  Muahahahaha. */
+   void             *doomsday_clock_dead; /* data for the doomsday clock */
+
+   Ecore_Exe_Cb      pre_free_cb;
+};
 
 /* TODO: Something to let people build a command line and does auto escaping -
  *
  * cmd = ecore_exe_comand_parameter_append(cmd, "firefox");
  * cmd = ecore_exe_comand_parameter_append(cmd, "http://www.foo.com/bar.html?baz=yes");
  * each parameter appended is one argument, and it gets escaped, quoted, and
- * appended with a preceeding space.  The first is the command off course.
+ * appended with a preceding space.  The first is the command off course.
  */
 
 struct _ecore_exe_dead_exe
 {
-   pid_t               pid;
-   char               *cmd;
+   pid_t pid;
+   char *cmd;
 };
 
-static inline void  _ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags);
-
-static int          _ecore_exe_data_generic_handler(void *data,
-                                                   Ecore_Fd_Handler *
-                                                   fd_handler,
-                                                   Ecore_Exe_Flags flags);
-static int          _ecore_exe_data_error_handler(void *data,
-                                                 Ecore_Fd_Handler *
-                                                 fd_handler);
-static int          _ecore_exe_data_read_handler(void *data,
-                                                Ecore_Fd_Handler * fd_handler);
-static int          _ecore_exe_data_write_handler(void *data,
-                                                 Ecore_Fd_Handler *
-                                                 fd_handler);
-static void         _ecore_exe_flush(Ecore_Exe * exe);
-static void         _ecore_exe_event_exe_data_free(void *data __UNUSED__,
-                                                  void *ev);
-static Ecore_Exe   *_ecore_exe_is_it_alive(pid_t pid);
-static int          _ecore_exe_make_sure_its_dead(void *data);
-static int          _ecore_exe_make_sure_its_really_dead(void *data);
+static inline void _ecore_exe_exec_it(const char     *exe_cmd,
+                                      Ecore_Exe_Flags flags);
+static Eina_Bool   _ecore_exe_data_generic_handler(void             *data,
+                                                   Ecore_Fd_Handler *fd_handler,
+                                                   Ecore_Exe_Flags   flags);
+static Eina_Bool            _ecore_exe_data_error_handler(void             *data,
+                                                          Ecore_Fd_Handler *fd_handler);
+static Eina_Bool            _ecore_exe_data_read_handler(void             *data,
+                                                         Ecore_Fd_Handler *fd_handler);
+static Eina_Bool            _ecore_exe_data_write_handler(void             *data,
+                                                          Ecore_Fd_Handler *fd_handler);
+static void                 _ecore_exe_flush(Ecore_Exe *exe);
+static void                 _ecore_exe_event_exe_data_free(void *data __UNUSED__,
+                                                           void *ev);
+static Ecore_Exe           *_ecore_exe_is_it_alive(pid_t pid);
+static Eina_Bool            _ecore_exe_make_sure_its_dead(void *data);
+static Eina_Bool            _ecore_exe_make_sure_its_really_dead(void *data);
 static Ecore_Exe_Event_Add *_ecore_exe_event_add_new(void);
-static void         _ecore_exe_event_add_free(void *data, void *ev);
-static void         _ecore_exe_dead_attach(Ecore_Exe *exe);
+static void                 _ecore_exe_event_add_free(void *data,
+                                                      void *ev);
+static void                 _ecore_exe_dead_attach(Ecore_Exe *exe);
 
-EAPI int            ECORE_EXE_EVENT_ADD = 0;
-EAPI int            ECORE_EXE_EVENT_DEL = 0;
-EAPI int            ECORE_EXE_EVENT_DATA = 0;
-EAPI int            ECORE_EXE_EVENT_ERROR = 0;
+EAPI int ECORE_EXE_EVENT_ADD = 0;
+EAPI int ECORE_EXE_EVENT_DEL = 0;
+EAPI int ECORE_EXE_EVENT_DATA = 0;
+EAPI int ECORE_EXE_EVENT_ERROR = 0;
 
-static Ecore_Exe   *exes = NULL;
-static const char  *shell = NULL;
+static Ecore_Exe *exes = NULL;
+static const char *shell = NULL;
 
 /* FIXME: This errno checking stuff should be put elsewhere for everybody to use.
  * For now it lives here though, just to make testing easier.
  */
-static int          _ecore_exe_check_errno(int result, const char *file, int line);
+static int _ecore_exe_check_errno(int         result,
+                                  const char *file,
+                                  int         line);
 
-#define E_IF_NO_ERRNO(result, foo, ok) \
-  while (((ok) = _ecore_exe_check_errno( (result) = (foo), __FILE__, __LINE__)) == -1)   sleep(1); \
-  if (ok)
+#define E_IF_NO_ERRNO(result, foo, ok)                                                           \
+  while (((ok) = _ecore_exe_check_errno((result) = (foo), __FILE__, __LINE__)) == -1) sleep(1);  \
+          if (ok)
 
 #define E_NO_ERRNO(result, foo, ok) \
-  while (((ok) = _ecore_exe_check_errno( (result) = (foo), __FILE__, __LINE__)) == -1)   sleep(1)
+  while (((ok) = _ecore_exe_check_errno((result) = (foo), __FILE__, __LINE__)) == -1) sleep(1)
 
 #define E_IF_NO_ERRNO_NOLOOP(result, foo, ok) \
-  if (((ok) = _ecore_exe_check_errno( (result) = (foo), __FILE__, __LINE__)))
+  if (((ok) = _ecore_exe_check_errno((result) = (foo), __FILE__, __LINE__)))
 
 static int
-_ecore_exe_check_errno(int result, const char *file, int line)
+_ecore_exe_check_errno(int         result,
+                       const char *file __UNUSED__,
+                       int         line __UNUSED__)
 {
-   int                 saved_errno = errno;
+   int saved_errno = errno;
 
    if (result == -1)
-     {
-       perror("*** errno reports ");
+   {
+      perror("*** errno reports ");
 /* What is currently supported -
  *
  *   pipe
@@ -135,120 +250,136 @@ _ecore_exe_check_errno(int result, const char *file, int line)
  *        // Something failed, cleanup.
  *     }
  */
-       switch (saved_errno)
-         {
-         case EACCES:
-         case EAGAIN:
-         case EINTR:
-            {                  /* Not now, try later. */
-               fprintf(stderr, "*** Must try again in %s @%u.\n", file, line);
-               result = -1;
-               break;
-            }
-
-         case EMFILE:
-         case ENFILE:
-         case ENOLCK:
-            {                  /* Low on resources. */
-               fprintf(stderr, "*** Low on resources in %s @%u.\n", file,
-                       line);
-               result = 0;
-               break;
-            }
-
-         case EIO:
-            {                  /* I/O error. */
-               fprintf(stderr, "*** I/O error in %s @%u.\n", file, line);
-               result = 0;
-               break;
-            }
-
-         case EFAULT:
-         case EBADF:
-         case EINVAL:
-         case EROFS:
-         case EISDIR:
-         case EDEADLK:
-         case EPERM:
-         case EBUSY:
-            {                  /* Programmer fucked up. */
-               fprintf(stderr,
-                       "*** NAUGHTY PROGRAMMER!!!\n"
-                       "*** SPANK SPANK SPANK!!!\n"
-                       "*** Now go fix your code in %s @%u. Tut tut tut!\n"
-                       "\n", file, line);
-               result = 0;
-               break;
-            }
-
-         default:
-            {                  /* Unsupported errno code, please add this one. */
-               fprintf(stderr,
-                       "*** NAUGHTY PROGRAMMER!!!\n"
-                       "*** SPANK SPANK SPANK!!!\n"
-                       "*** Unsupported errno code %d, please add this one.\n"
-                       "*** Now go fix your code in %s @%u, from %s @%u. Tut tut tut!\n"
-                       "\n", saved_errno, __FILE__, __LINE__, file, line);
-               result = 0;
-               break;
-            }
-         }
-     }
-   else                                /* Everything is fine. */
-      result = 1;
+      switch (saved_errno)
+      {
+       case EACCES:
+       case EAGAIN:
+       case EINTR:
+         { /* Not now, try later. */
+            ERR("*** Must try again in %s @%u.", file, line);
+            result = -1;
+            break;
+         }
+
+       case EMFILE:
+       case ENFILE:
+       case ENOLCK:
+         { /* Low on resources. */
+            ERR("*** Low on resources in %s @%u.", file,
+                line);
+            result = 0;
+            break;
+         }
+
+       case EIO:
+         { /* I/O error. */
+            ERR("*** I/O error in %s @%u.", file, line);
+            result = 0;
+            break;
+         }
+
+       case EFAULT:
+       case EBADF:
+       case EINVAL:
+       case EROFS:
+       case EISDIR:
+       case EDEADLK:
+       case EPERM:
+       case EBUSY:
+         { /* Programmer fucked up. */
+            ERR("*** NAUGHTY PROGRAMMER!!!\n"
+                "*** SPANK SPANK SPANK!!!\n"
+                "*** Now go fix your code in %s @%u. Tut tut tut!",
+                file, line);
+            result = 0;
+            break;
+         }
+
+       default:
+         { /* Unsupported errno code, please add this one. */
+            ERR("*** NAUGHTY PROGRAMMER!!!\n"
+                "*** SPANK SPANK SPANK!!!\n"
+                "*** Unsupported errno code %d, please add this one.\n"
+                "*** Now go fix your code in %s @%u, from %s @%u. Tut tut tut!",
+                saved_errno, __FILE__, __LINE__, file, line);
+            result = 0;
+            break;
+         }
+      }
+   }
+   else /* Everything is fine. */
+     result = 1;
 
    errno = saved_errno;
    return result;
 }
 
 /**
- * @defgroup Ecore_Exe_Basic_Group Process Spawning Functions
+ * @addtogroup Ecore_Exe_Group
+ *
+ * @{
+ */
+
+static int run_pri = ECORE_EXE_PRIORITY_INHERIT;
+
+/**
+ * Sets the priority at which to launch processes
+ *
+ * This sets the priority of processes run by ecore_exe_run() and
+ * ecore_exe_pipe_run().
+ * @li On Windows, the child process is created by default with the
+ * @ref ECORE_EXE_WIN32_PRIORITY_NORMAL priority, unless the calling
+ * process is in @ref ECORE_EXE_WIN32_PRIORITY_IDLE or
+ * @ref ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL priority. In that case, the
+ * child process inherits this priority.
+ * @li On other platforms, if set to @ref ECORE_EXE_PRIORITY_INHERIT child
+ * processes inherits the priority of their parent. This is the default.
  *
- * Functions that deal with spawned processes.
+ * @param   pri value a Ecore_Exe_Win32_Priority value on Windows, -20
+ * to 19 or @ref ECORE_EXE_PRIORITY_INHERIT on other OS.
  */
+EAPI void
+ecore_exe_run_priority_set(int pri)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   run_pri = pri;
+}
+
+/**
+ * Gets the priority at which to launch processes
+ *
+ * This gets ths priority of launched processes. See
+ * ecore_exe_run_priority_set() for details. This just returns the value set
+ * by this call.
+ *
+ * @return the value set by ecore_exe_run_priority_set()
+ */
+EAPI int
+ecore_exe_run_priority_get(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   return run_pri;
+}
 
 /**
  * Spawns a child process.
  *
  * This is now just a thin wrapper around ecore_exe_pipe_run()
+ * @note When you use this function you will have no permissions
+ * to write or read on the pipe that connects you with the spwaned process.
+ * If you need to do that use ecore_exe_pipe_run() with the
+ * appropriated flags.
  *
  * @param   exe_cmd The command to run with @c /bin/sh.
  * @param   data    Data to attach to the returned process handle.
  * @return  A process handle to the spawned process.
- * @ingroup Ecore_Exe_Basic_Group
  */
-EAPI Ecore_Exe     *
-ecore_exe_run(const char *exe_cmd, const void *data)
+EAPI Ecore_Exe *
+ecore_exe_run(const char *exe_cmd,
+              const void *data)
 {
-/* I'm just being paranoid again, leaving in the original code in case there is a problem. */
-#if 0
-   Ecore_Exe          *exe;
-   pid_t               pid;
-
-   if (!exe_cmd)
-      return NULL;
-   pid = fork();
-   if (pid)
-     {
-       exe = calloc(1, sizeof(Ecore_Exe));
-       if (!exe)
-         {
-            kill(pid, SIGKILL);
-            return NULL;
-         }
-       ECORE_MAGIC_SET(exe, ECORE_MAGIC_EXE);
-       exe->pid = pid;
-       exe->data = (void *)data;
-       exe->cmd = strdup(exe_cmd);
-       exes = _ecore_list2_append(exes, exe);
-       return exe;
-     }
-   _ecore_exe_exec_it(exe_cmd, 0);
-   exit(127);
-   return NULL;
-#else
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    return ecore_exe_pipe_run(exe_cmd, 0, data);
-#endif
 }
 
 /**
@@ -275,28 +406,30 @@ ecore_exe_run(const char *exe_cmd, const void *data)
  * @param   flags   The flag parameters for how to deal with inter-process I/O
  * @param   data    Data to attach to the returned process handle.
  * @return  A process handle to the spawned process.
- * @ingroup Ecore_Exe_Basic_Group
  */
-EAPI Ecore_Exe     *
-ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data)
+EAPI Ecore_Exe *
+ecore_exe_pipe_run(const char     *exe_cmd,
+                   Ecore_Exe_Flags flags,
+                   const void     *data)
 {
-   Ecore_Exe          *exe = NULL;
-   int                 statusPipe[2] = { -1, -1 };
-   int                 errorPipe[2] = { -1, -1 };
-   int                 readPipe[2] = { -1, -1 };
-   int                 writePipe[2] = { -1, -1 };
-   int                 n = 0;
-   int                 ok = 1;
-   int                 result;
-
+   Ecore_Exe *exe = NULL;
+   int statusPipe[2] = { -1, -1 };
+   int errorPipe[2] = { -1, -1 };
+   int readPipe[2] = { -1, -1 };
+   int writePipe[2] = { -1, -1 };
+   int n = 0;
+   int ok = 1;
+   int result;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!exe_cmd) return NULL;
    exe = calloc(1, sizeof(Ecore_Exe));
-   if (exe == NULL) return NULL;
+   if (!exe) return NULL;
 
    if ((flags & ECORE_EXE_PIPE_AUTO) && (!(flags & ECORE_EXE_PIPE_ERROR))
        && (!(flags & ECORE_EXE_PIPE_READ)))
      /* We need something to auto pipe. */
-     flags |= ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR; 
+     flags |= ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR;
 
    exe->child_fd_error = -1;
    exe->child_fd_read = -1;
@@ -307,252 +440,298 @@ ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data)
 
    /*  Create some pipes. */
    if (ok)
-     {
-       E_IF_NO_ERRNO_NOLOOP(result, pipe(statusPipe), ok)
-         {
-         }
-     }
+   {
+      E_IF_NO_ERRNO_NOLOOP(result, pipe(statusPipe), ok)
+      {
+      }
+   }
    if (ok && (flags & ECORE_EXE_PIPE_ERROR))
-     {
-       E_IF_NO_ERRNO_NOLOOP(result, pipe(errorPipe), ok)
-         {
-            exe->child_fd_error = errorPipe[0];
-            exe->child_fd_error_x = errorPipe[1];
-         }
-     }
+   {
+      E_IF_NO_ERRNO_NOLOOP(result, pipe(errorPipe), ok)
+      {
+         exe->child_fd_error = errorPipe[0];
+         exe->child_fd_error_x = errorPipe[1];
+      }
+   }
    if (ok && (flags & ECORE_EXE_PIPE_READ))
-     {
-       E_IF_NO_ERRNO_NOLOOP(result, pipe(readPipe), ok)
-         {
-            exe->child_fd_read = readPipe[0];
-            exe->child_fd_read_x = readPipe[1];
-         }
-     }
+   {
+      E_IF_NO_ERRNO_NOLOOP(result, pipe(readPipe), ok)
+      {
+         exe->child_fd_read = readPipe[0];
+         exe->child_fd_read_x = readPipe[1];
+      }
+   }
    if (ok && (flags & ECORE_EXE_PIPE_WRITE))
-     {
-       E_IF_NO_ERRNO_NOLOOP(result, pipe(writePipe), ok)
-         {
-            exe->child_fd_write = writePipe[1];
-            exe->child_fd_write_x = writePipe[0];
-         }
-     }
+   {
+      E_IF_NO_ERRNO_NOLOOP(result, pipe(writePipe), ok)
+      {
+         exe->child_fd_write = writePipe[1];
+         exe->child_fd_write_x = writePipe[0];
+      }
+   }
    if (ok)
-     {
-       pid_t               pid = 0;
-       volatile int        vfork_exec_errno = 0;
-       
-       /* FIXME: I should double check this.  After a quick look around, this is already done, but via a more modern method. */
-       /* signal(SIGPIPE, SIG_IGN);    We only want EPIPE on errors */
-       pid = fork();
-       
-       if (pid == -1)
-         {
-            fprintf(stderr, "Failed to fork process\n");
-            pid = 0;
-         }
-       else if (pid == 0)      /* child */
-         {
-            /* dup2 STDERR, STDIN, and STDOUT.  dup2() allegedly closes the
-             * second pipe if it's open. On the other hand, there was the
-             * Great FD Leak Scare of '06, so let's be paranoid. */
-            if (ok && (flags & ECORE_EXE_PIPE_ERROR))
-              {
-                 E_NO_ERRNO(result, close(STDERR_FILENO), ok);
-                 E_NO_ERRNO(result, dup2(errorPipe[1], STDERR_FILENO), ok);
-              }
-            if (ok && (flags & ECORE_EXE_PIPE_READ))
-              {
-                 E_NO_ERRNO(result, close(STDOUT_FILENO), ok);
-                 E_NO_ERRNO(result, dup2(readPipe[1], STDOUT_FILENO), ok);
-              }
-            if (ok && (flags & ECORE_EXE_PIPE_WRITE))
-              {
-                 E_NO_ERRNO(result, close(STDIN_FILENO), ok);
-                 E_NO_ERRNO(result, dup2(writePipe[0], STDIN_FILENO), ok);
-              }
-
-            if (ok)
-              {
-                 /* Setup the status pipe. */
-                 E_NO_ERRNO(result, close(statusPipe[0]), ok);
-                 E_IF_NO_ERRNO(result, fcntl(statusPipe[1], F_SETFD, FD_CLOEXEC), ok)  /* close on exec shows sucess */
-                   {
-                      /* Run the actual command. */
-                      _ecore_exe_exec_it(exe_cmd, flags); /* no return */
-                   }
-              }
-
-            /* Something went 'orribly wrong. */
-            vfork_exec_errno = errno;
-
-            /* Close the pipes. */
-            if (flags & ECORE_EXE_PIPE_ERROR)
-              E_NO_ERRNO(result, close(errorPipe[1]), ok);
-            if (flags & ECORE_EXE_PIPE_READ)
-              E_NO_ERRNO(result, close(readPipe[1]), ok);
-            if (flags & ECORE_EXE_PIPE_WRITE)
-              E_NO_ERRNO(result, close(writePipe[0]), ok);
-            E_NO_ERRNO(result, close(statusPipe[1]), ok);
-            
-            _exit(-1);
-         }
-       else                    /* parent */
-         {
-            /* Close the unused pipes. */
-            E_NO_ERRNO(result, close(statusPipe[1]), ok);
-
-            /* FIXME: after having a good look at the current e fd 
-             * handling, investigate fcntl(dataPipe[x], F_SETSIG, ...) */
-            /* FIXME: above F_SETSIG etc. - this is async SIGIO based IO
-             * which is also linux specific so we probably don't want to
-             * do this as long as select() is working fine. the only time
-             * we really want to think of SIGIO async IO is when it all
-             * actually works basically everywhere and we can turn all 
-             * IO into DMA async activities (i.e. you do a read() then
-             * the read is complete not on return but when you get a
-             * SIGIO - the read() just starts the transfer and it is
-             * completed in the background by DMA (or whatever mechanism
-             * the kernel choses)) */
-
-            /* Wait for it to start executing. */
-            /* FIXME: this doesn't seem very nice - we sit and block
-             * waiting on a child process... even though it's just
-             * the segment between the fork() and the exec) it just feels
-             * wrong */
-            for (;;)
-              {
-                 char                buf;
-                 
-                 E_NO_ERRNO(result, read(statusPipe[0], &buf, 1), ok);
-                 if (result == 0)
-                   {
-                      if (vfork_exec_errno != 0)
-                        {
-                           n = vfork_exec_errno;
-                           fprintf(stderr, "Could not start \"%s\"\n",
-                                   exe_cmd);
-                           pid = 0;
-                        }
-                      break;
-                   }
-              }
-
-            /* Close the status pipe. */
-            E_NO_ERRNO(result, close(statusPipe[0]), ok);
-         }
-
-       if (pid)
-         {
-            /* Setup the exe structure. */
-            ECORE_MAGIC_SET(exe, ECORE_MAGIC_EXE);
-            exe->start_bytes = -1;
-            exe->end_bytes = -1;
-            exe->start_lines = -1;
-            exe->end_lines = -1;
-            exe->pid = pid;
-            exe->flags = flags;
-            exe->data = (void *)data;
-            if ((exe->cmd = strdup(exe_cmd)))
-              {
-                 if (flags & ECORE_EXE_PIPE_ERROR)
-                   { /* Setup the error stuff. */
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_error, F_SETFL,
-                                          O_NONBLOCK), ok) {}
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_error, F_SETFD,
-                                          FD_CLOEXEC), ok) {}
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_error_x, F_SETFD,
-                                          FD_CLOEXEC), ok) {}
-                      {
-                         exe->error_fd_handler =
-                            ecore_main_fd_handler_add(exe->child_fd_error,
-                                                      ECORE_FD_READ,
-                                                      _ecore_exe_data_error_handler,
-                                                      exe, NULL, NULL);
-                         if (exe->error_fd_handler == NULL)
-                            ok = 0;
-                      }
-                   }
-                 if (ok && (flags & ECORE_EXE_PIPE_READ))
-                   { /* Setup the read stuff. */
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_read, F_SETFL,
-                                          O_NONBLOCK), ok) {}
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_read, F_SETFD,
-                                          FD_CLOEXEC), ok) {}
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_read_x, F_SETFD,
-                                          FD_CLOEXEC), ok) {}
-                      {
-                         exe->read_fd_handler =
-                            ecore_main_fd_handler_add(exe->child_fd_read,
-                                                      ECORE_FD_READ,
-                                                      _ecore_exe_data_read_handler,
-                                                      exe, NULL, NULL);
-                         if (exe->read_fd_handler == NULL)
-                            ok = 0;
-                      }
-                   }
-                 if (ok && (flags & ECORE_EXE_PIPE_WRITE))
-                   {           /* Setup the write stuff. */
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_write, F_SETFL,
-                                          O_NONBLOCK), ok) {}
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_write, F_SETFD,
-                                          FD_CLOEXEC), ok) {}
-                      E_IF_NO_ERRNO(result,
-                                    fcntl(exe->child_fd_write_x, F_SETFD,
-                                          FD_CLOEXEC), ok) {}
-                      {
-                         exe->write_fd_handler =
-                            ecore_main_fd_handler_add(exe->child_fd_write,
-                                                      ECORE_FD_WRITE,
-                                                      _ecore_exe_data_write_handler,
-                                                      exe, NULL, NULL);
-                         if (exe->write_fd_handler)
-                            ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);        /* Nothing to write to start with. */
-                         else
-                            ok = 0;
-                      }
-                   }
-                 
-                 exes = _ecore_list2_append(exes, exe);
-                 n = 0;
-              }
-            else
-              ok = 0;
-         }
-       else
-         ok = 0;
-     }
-
-   if (!ok)
-     { /* Something went wrong, so pull down everything. */
-       if (exe->pid) ecore_exe_terminate(exe);
-       IF_FN_DEL(ecore_exe_free, exe);
-     }
+   {
+      pid_t pid = 0;
+      volatile int vfork_exec_errno = 0;
+
+      /* FIXME: I should double check this.  After a quick look around, this is already done, but via a more modern method. */
+      /* signal(SIGPIPE, SIG_IGN);    We only want EPIPE on errors */
+      pid = fork();
+
+      if (pid == -1)
+      {
+         ERR("Failed to fork process");
+         pid = 0;
+      }
+      else if (pid == 0) /* child */
+      {
+         if (run_pri != ECORE_EXE_PRIORITY_INHERIT)
+         {
+#ifdef PRIO_PROCESS            
+            if ((run_pri >= -20) && (run_pri <= 19))
+              setpriority(PRIO_PROCESS, 0, run_pri);
+#else
+#warning "Your OS/libc does not provide PRIO_PROCESS (and possibly setpriority())"
+#warning "This is a POSIX-1.2001 standard and it is highly encouraged that you"
+#warning "Have support for this"
+#endif
+         }
+         /* dup2 STDERR, STDIN, and STDOUT.  dup2() allegedly closes the
+          * second pipe if it's open. On the other hand, there was the
+          * Great FD Leak Scare of '06, so let's be paranoid. */
+         if (ok && (flags & ECORE_EXE_PIPE_ERROR))
+         {
+            E_NO_ERRNO(result, close(STDERR_FILENO), ok);
+            E_NO_ERRNO(result, dup2(errorPipe[1], STDERR_FILENO), ok);
+         }
+         if (ok && (flags & ECORE_EXE_PIPE_READ))
+         {
+            E_NO_ERRNO(result, close(STDOUT_FILENO), ok);
+            E_NO_ERRNO(result, dup2(readPipe[1], STDOUT_FILENO), ok);
+         }
+         if (ok && (flags & ECORE_EXE_PIPE_WRITE))
+         {
+            E_NO_ERRNO(result, close(STDIN_FILENO), ok);
+            E_NO_ERRNO(result, dup2(writePipe[0], STDIN_FILENO), ok);
+         }
+
+         if (ok)
+         {
+            /* Setup the status pipe. */
+             E_NO_ERRNO(result, close(statusPipe[0]), ok);
+             E_IF_NO_ERRNO(result, fcntl(statusPipe[1], F_SETFD, FD_CLOEXEC), ok) /* close on exec shows success */
+             {
+                /* Run the actual command. */
+                 _ecore_exe_exec_it(exe_cmd, flags); /* no return */
+             }
+         }
+
+         /* Something went 'orribly wrong. */
+         vfork_exec_errno = errno;
+
+         /* Close the pipes. */
+         if (flags & ECORE_EXE_PIPE_ERROR)
+           E_NO_ERRNO(result, close(errorPipe[1]), ok);
+         if (flags & ECORE_EXE_PIPE_READ)
+           E_NO_ERRNO(result, close(readPipe[1]), ok);
+         if (flags & ECORE_EXE_PIPE_WRITE)
+           E_NO_ERRNO(result, close(writePipe[0]), ok);
+         E_NO_ERRNO(result, close(statusPipe[1]), ok);
+
+         _exit(-1);
+      }
+      else   /* parent */
+      {
+         /* Close the unused pipes. */
+          E_NO_ERRNO(result, close(statusPipe[1]), ok);
+
+          /* FIXME: after having a good look at the current e fd
+           * handling, investigate fcntl(dataPipe[x], F_SETSIG, ...) */
+          /* FIXME: above F_SETSIG etc. - this is async SIGIO based IO
+           * which is also linux specific so we probably don't want to
+           * do this as long as select() is working fine. the only time
+           * we really want to think of SIGIO async IO is when it all
+           * actually works basically everywhere and we can turn all
+           * IO into DMA async activities (i.e. you do a read() then
+           * the read is complete not on return but when you get a
+           * SIGIO - the read() just starts the transfer and it is
+           * completed in the background by DMA (or whatever mechanism
+           * the kernel choses)) */
+
+          /* Wait for it to start executing. */
+          /* FIXME: this doesn't seem very nice - we sit and block
+           * waiting on a child process... even though it's just
+           * the segment between the fork() and the exec) it just feels
+           * wrong */
+          for (;; )
+          {
+             char buf;
+
+             E_NO_ERRNO(result, read(statusPipe[0], &buf, 1), ok);
+             if (result == 0)
+             {
+                if (vfork_exec_errno != 0)
+                {
+                   n = vfork_exec_errno;
+                   ERR("Could not start \"%s\"", exe_cmd);
+                   pid = 0;
+                }
+                break;
+             }
+          }
+
+          /* Close the status pipe. */
+          E_NO_ERRNO(result, close(statusPipe[0]), ok);
+      }
+
+      if (pid)
+      {
+         /* Setup the exe structure. */
+          ECORE_MAGIC_SET(exe, ECORE_MAGIC_EXE);
+          exe->start_bytes = -1;
+          exe->end_bytes = -1;
+          exe->start_lines = -1;
+          exe->end_lines = -1;
+          exe->pid = pid;
+          exe->flags = flags;
+          exe->data = (void *)data;
+          if ((exe->cmd = strdup(exe_cmd)))
+          {
+             if (flags & ECORE_EXE_PIPE_ERROR) /* Setup the error stuff. */
+             {
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_error, F_SETFL,
+                                    O_NONBLOCK), ok) {
+                }
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_error, F_SETFD,
+                                    FD_CLOEXEC), ok) {
+                }
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_error_x, F_SETFD,
+                                    FD_CLOEXEC), ok) {
+                }
+                {
+                   exe->error_fd_handler =
+                     ecore_main_fd_handler_add(exe->child_fd_error,
+                                               ECORE_FD_READ,
+                                               _ecore_exe_data_error_handler,
+                                               exe, NULL, NULL);
+                   if (!exe->error_fd_handler)
+                     ok = 0;
+                }
+             }
+             if (ok && (flags & ECORE_EXE_PIPE_READ)) /* Setup the read stuff. */
+             {
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_read, F_SETFL,
+                                    O_NONBLOCK), ok) {
+                }
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_read, F_SETFD,
+                                    FD_CLOEXEC), ok) {
+                }
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_read_x, F_SETFD,
+                                    FD_CLOEXEC), ok) {
+                }
+                {
+                   exe->read_fd_handler =
+                     ecore_main_fd_handler_add(exe->child_fd_read,
+                                               ECORE_FD_READ,
+                                               _ecore_exe_data_read_handler,
+                                               exe, NULL, NULL);
+                   if (!exe->read_fd_handler)
+                     ok = 0;
+                }
+             }
+             if (ok && (flags & ECORE_EXE_PIPE_WRITE)) /* Setup the write stuff. */
+             {
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_write, F_SETFL,
+                                    O_NONBLOCK), ok) {
+                }
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_write, F_SETFD,
+                                    FD_CLOEXEC), ok) {
+                }
+                E_IF_NO_ERRNO(result,
+                              fcntl(exe->child_fd_write_x, F_SETFD,
+                                    FD_CLOEXEC), ok) {
+                }
+                {
+                   exe->write_fd_handler =
+                     ecore_main_fd_handler_add(exe->child_fd_write,
+                                               ECORE_FD_WRITE,
+                                               _ecore_exe_data_write_handler,
+                                               exe, NULL, NULL);
+                   if (exe->write_fd_handler)
+                     ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);  /* Nothing to write to start with. */
+                   else
+                     ok = 0;
+                }
+             }
+
+             exes = (Ecore_Exe *)eina_inlist_append(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
+             n = 0;
+          }
+          else
+            ok = 0;
+      }
+      else
+        ok = 0;
+   }
+
+   if (!ok) /* Something went wrong, so pull down everything. */
+   {
+      if (exe->pid) ecore_exe_terminate(exe);
+      IF_FN_DEL(ecore_exe_free, exe);
+   }
    else
-     {
-       Ecore_Exe_Event_Add *e;
-       
-       e = _ecore_exe_event_add_new();
-       e->exe = exe;
-       if (e) /* Send the event. */
-         ecore_event_add(ECORE_EXE_EVENT_ADD, e,
-                         _ecore_exe_event_add_free, NULL);
-       /* printf("Running as %d for %s.\n", exe->pid, exe->cmd); */
-     }
-   
+   {
+      Ecore_Exe_Event_Add *e;
+
+      e = _ecore_exe_event_add_new();
+      e->exe = exe;
+      if (e) /* Send the event. */
+        ecore_event_add(ECORE_EXE_EVENT_ADD, e,
+                        _ecore_exe_event_add_free, NULL);
+      /* INF("Running as %d for %s.\n", exe->pid, exe->cmd); */
+   }
+
    errno = n;
    return exe;
 }
 
 /**
- * Sends data to the given child process which it recieves on stdin.
+ * Defines a function to be called before really freeing the handle data.
+ *
+ * This might be useful for language bindings such as Python and Perl
+ * that need to deallocate wrappers associated with this handle.
+ *
+ * This handle should never be modified by this call. It should be
+ * considered informative only. All getters are valid when the given
+ * function is called back.
+ *
+ * @param exe The child process to attach the pre_free function.
+ * @param func The function to call before @a exe is freed.
+ */
+EAPI void
+ecore_exe_callback_pre_free_set(Ecore_Exe   *exe,
+                                Ecore_Exe_Cb func)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE,
+                       "ecore_exe_callback_pre_free_set");
+      return;
+   }
+   exe->pre_free_cb = func;
+}
+
+/**
+ * Sends data to the given child process which it receives on stdin.
  *
  * This function writes to a child processes standard in, with unlimited
  * buffering. This call will never block. It may fail if the system runs out
@@ -561,63 +740,89 @@ ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data)
  * @param exe  The child process to send to
  * @param data The data to send
  * @param size The size of the data to send, in bytes
- * @return 1 if successful, 0 on failure.
- * @ingroup Ecore_Exe_Basic_Group
+ * @return @c EINA_TRUE if successful, @c EINA_FALSE on failure.
  */
-EAPI int
-ecore_exe_send(Ecore_Exe * exe, void *data, int size)
+EAPI Eina_Bool
+ecore_exe_send(Ecore_Exe  *exe,
+               const void *data,
+               int         size)
 {
-   void               *buf;
+   void *buf;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(EINA_FALSE);
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_send");
+      return EINA_FALSE;
+   }
+
+   if (exe->close_stdin)
+   {
+      ERR("Ecore_Exe %p stdin is closed! Cannot send %d bytes from %p",
+          exe, size, data);
+      return EINA_FALSE;
+   }
+
+   if (exe->child_fd_write == -1)
+   {
+      ERR("Ecore_Exe %p created without ECORE_EXE_PIPE_WRITE! "
+          "Cannot send %d bytes from %p", exe, size, data);
+      return EINA_FALSE;
+   }
 
    buf = realloc(exe->write_data_buf, exe->write_data_size + size);
-   if (buf == NULL) return 0;
+   if (!buf) return EINA_FALSE;
 
    exe->write_data_buf = buf;
    memcpy((char *)exe->write_data_buf + exe->write_data_size, data, size);
    exe->write_data_size += size;
 
    if (exe->write_fd_handler)
-      ecore_main_fd_handler_active_set(exe->write_fd_handler, ECORE_FD_WRITE);
+     ecore_main_fd_handler_active_set(exe->write_fd_handler, ECORE_FD_WRITE);
 
-   return 1;
+   return EINA_TRUE;
 }
 
 /**
  * The stdin of the given child process will close when the write buffer is empty.
  *
  * @param exe  The child process
- * @ingroup Ecore_Exe_Basic_Group
  */
 EAPI void
-ecore_exe_close_stdin(Ecore_Exe * exe)
+ecore_exe_close_stdin(Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_close_stdin");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_close_stdin");
+      return;
+   }
    exe->close_stdin = 1;
 }
 
 /**
- * Sets the auto pipe limits for the given process handle
+ * Sets the auto pipe limits for the given process handle. On Windows
+ * this function does nothing.
  *
  * @param   exe The given process handle.
  * @param   start_bytes limit of bytes at start of output to buffer.
  * @param   end_bytes limit of bytes at end of output to buffer.
  * @param   start_lines limit of lines at start of output to buffer.
  * @param   end_lines limit of lines at end of output to buffer.
- * @ingroup Ecore_Exe_Basic_Group
  */
 EAPI void
-ecore_exe_auto_limits_set(Ecore_Exe * exe, int start_bytes, int end_bytes,
-                         int start_lines, int end_lines)
+ecore_exe_auto_limits_set(Ecore_Exe *exe,
+                          int        start_bytes,
+                          int        end_bytes,
+                          int        start_lines,
+                          int        end_lines)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_auto_limits_set");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_auto_limits_set");
+      return;
+   }
    /* FIXME: sanitize the input. */
    exe->start_bytes = start_bytes;
    exe->end_bytes = end_bytes;
@@ -658,7 +863,7 @@ ecore_exe_auto_limits_set(Ecore_Exe * exe, int start_bytes, int end_bytes,
     * Spank programmer for freeing the event data if it came from the event system, as that autofrees.
     * Spank the programmer if they try to set the limits bigger than what has been gathered & ignored already, coz they just lost data.
     * Spank onefang and raster for opening this can of worms.
-    * Should we have seperate out/err limits?
+    * Should we have separate out/err limits?
     * Should we remove from the internal buffer the data that was delivered already?
     * If so, what to do about limits, start, and end?  They could loose their meaning.
     */
@@ -669,129 +874,130 @@ ecore_exe_auto_limits_set(Ecore_Exe * exe, int start_bytes, int end_bytes,
  *
  * @param   exe The given process handle.
  * @param   flags   Is this a ECORE_EXE_PIPE_READ or ECORE_EXE_PIPE_ERROR?
- * @ingroup Ecore_Exe_Basic_Group
+ * @return The event data.
  */
 EAPI Ecore_Exe_Event_Data *
-ecore_exe_event_data_get(Ecore_Exe * exe, Ecore_Exe_Flags flags)
+ecore_exe_event_data_get(Ecore_Exe      *exe,
+                         Ecore_Exe_Flags flags)
 {
    Ecore_Exe_Event_Data *e = NULL;
-   int                 is_buffered = 0;
-   unsigned char      *inbuf;
-   int                 inbuf_num;
+   int is_buffered = 0;
+   unsigned char *inbuf;
+   int inbuf_num;
 
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_event_data_get");
-       return NULL;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_event_data_get");
+      return NULL;
+   }
 
    /* Sort out what sort of event we are. */
    if (flags & ECORE_EXE_PIPE_READ)
-     {
-       flags = ECORE_EXE_PIPE_READ;
-       if (exe->flags & ECORE_EXE_PIPE_READ_LINE_BUFFERED)
-          is_buffered = 1;
-     }
+   {
+      flags = ECORE_EXE_PIPE_READ;
+      if (exe->flags & ECORE_EXE_PIPE_READ_LINE_BUFFERED)
+        is_buffered = 1;
+   }
    else
-     {
-       flags = ECORE_EXE_PIPE_ERROR;
-       if (exe->flags & ECORE_EXE_PIPE_ERROR_LINE_BUFFERED)
-          is_buffered = 1;
-     }
+   {
+      flags = ECORE_EXE_PIPE_ERROR;
+      if (exe->flags & ECORE_EXE_PIPE_ERROR_LINE_BUFFERED)
+        is_buffered = 1;
+   }
 
    /* Get the data. */
    if (flags & ECORE_EXE_PIPE_READ)
-     {
-       inbuf = exe->read_data_buf;
-       inbuf_num = exe->read_data_size;
-       exe->read_data_buf = NULL;
-       exe->read_data_size = 0;
-     }
+   {
+      inbuf = exe->read_data_buf;
+      inbuf_num = exe->read_data_size;
+      exe->read_data_buf = NULL;
+      exe->read_data_size = 0;
+   }
    else
-     {
-       inbuf = exe->error_data_buf;
-       inbuf_num = exe->error_data_size;
-       exe->error_data_buf = NULL;
-       exe->error_data_size = 0;
-     }
+   {
+      inbuf = exe->error_data_buf;
+      inbuf_num = exe->error_data_size;
+      exe->error_data_buf = NULL;
+      exe->error_data_size = 0;
+   }
 
    e = calloc(1, sizeof(Ecore_Exe_Event_Data));
    if (e)
-     {
-       e->exe = exe;
-       e->data = inbuf;
-       e->size = inbuf_num;
-
-       if (is_buffered)
-         {                     /* Deal with line buffering. */
-            int                 max = 0;
-            int                 count = 0;
-            int                 i;
-            int                 last = 0;
-            char               *c;
-
-            c = (char *)inbuf;
-            for (i = 0; i < inbuf_num; i++)    /* Find the lines. */
-              {
-                 if (inbuf[i] == '\n')
-                   {
-                      if (count >= max)
-                        {
-                           /* In testing, the lines seem to arrive in batches of 500 to 1000 lines at most, roughly speaking. */
-                           max += 10;  /* FIXME: Maybe keep track of the largest number of lines ever sent, and add half that many instead of 10. */
-                           e->lines = realloc(e->lines, sizeof(Ecore_Exe_Event_Data_Line) * (max + 1));        /* Allow room for the NULL termination. */
-                        }
-                      /* raster said to leave the line endings as line endings, however -
-                       * This is line buffered mode, we are not dealing with binary here, but lines.
-                       * If we are not dealing with binary, we must be dealing with ASCII, unicode, or some other text format.
-                       * Thus the user is most likely gonna deal with this text as strings.
-                       * Thus the user is most likely gonna pass this data to str functions.
-                       * rasters way - the endings are always gonna be '\n';  onefangs way - they will always be '\0'
-                       * We are handing them the string length as a convenience.
-                       * Thus if they really want it in raw format, they can e->lines[i].line[e->lines[i].size - 1] = '\n'; easily enough.
-                       * In the default case, we can do this conversion quicker than the user can, as we already have the index and pointer.
-                       * Let's make it easy on them to use these as standard C strings.
-                       *
-                       * onefang is proud to announce that he has just set a new personal record for the
-                       * most over documentation of a simple assignment statement.  B-)
-                       */
-                      inbuf[i] = '\0';
-                      e->lines[count].line = c;
-                      e->lines[count].size = i - last;
-                      last = i + 1;
-                      c = (char *)&inbuf[last];
-                      count++;
-                   }
-              }
-            if (count == 0)    /* No lines to send, cancel the event. */
-              {
-                 _ecore_exe_event_exe_data_free(NULL, e);
-                 e = NULL;
-              }
-            else               /* NULL terminate the array, so that people know where the end is. */
-              {
-                 e->lines[count].line = NULL;
-                 e->lines[count].size = 0;
-              }
-            if (i > last)      /* Partial line left over, save it for next time. */
-              {
-                 if (e)
-                    e->size = last;
-                 if (flags & ECORE_EXE_PIPE_READ)
-                   {
-                      exe->read_data_size = i - last;
-                      exe->read_data_buf = malloc(exe->read_data_size);
-                      memcpy(exe->read_data_buf, c, exe->read_data_size);
-                   }
-                 else
-                   {
-                      exe->error_data_size = i - last;
-                      exe->error_data_buf = malloc(exe->error_data_size);
-                      memcpy(exe->error_data_buf, c, exe->error_data_size);
-                   }
-              }
-         }
-     }
+   {
+      e->exe = exe;
+      e->data = inbuf;
+      e->size = inbuf_num;
+
+      if (is_buffered) /* Deal with line buffering. */
+      {
+         int max = 0;
+         int count = 0;
+         int i;
+         int last = 0;
+         char *c;
+
+         c = (char *)inbuf;
+         for (i = 0; i < inbuf_num; i++) /* Find the lines. */
+         {
+            if (inbuf[i] == '\n')
+            {
+               if (count >= max)
+               {
+                  /* In testing, the lines seem to arrive in batches of 500 to 1000 lines at most, roughly speaking. */
+                   max += 10; /* FIXME: Maybe keep track of the largest number of lines ever sent, and add half that many instead of 10. */
+                   e->lines = realloc(e->lines, sizeof(Ecore_Exe_Event_Data_Line) * (max + 1)); /* Allow room for the NULL termination. */
+               }
+               /* raster said to leave the line endings as line endings, however -
+                * This is line buffered mode, we are not dealing with binary here, but lines.
+                * If we are not dealing with binary, we must be dealing with ASCII, unicode, or some other text format.
+                * Thus the user is most likely gonna deal with this text as strings.
+                * Thus the user is most likely gonna pass this data to str functions.
+                * rasters way - the endings are always gonna be '\n';  onefangs way - they will always be '\0'
+                * We are handing them the string length as a convenience.
+                * Thus if they really want it in raw format, they can e->lines[i].line[e->lines[i].size - 1] = '\n'; easily enough.
+                * In the default case, we can do this conversion quicker than the user can, as we already have the index and pointer.
+                * Let's make it easy on them to use these as standard C strings.
+                *
+                * onefang is proud to announce that he has just set a new personal record for the
+                * most over documentation of a simple assignment statement.  B-)
+                */
+               inbuf[i] = '\0';
+               e->lines[count].line = c;
+               e->lines[count].size = i - last;
+               last = i + 1;
+               c = (char *)&inbuf[last];
+               count++;
+            }
+         }
+         if (i > last) /* Partial line left over, save it for next time. */
+         {
+            if (count != 0) e->size = last;
+            if (flags & ECORE_EXE_PIPE_READ)
+            {
+               exe->read_data_size = i - last;
+               exe->read_data_buf = malloc(exe->read_data_size);
+               memcpy(exe->read_data_buf, c, exe->read_data_size);
+            }
+            else
+            {
+               exe->error_data_size = i - last;
+               exe->error_data_buf = malloc(exe->error_data_size);
+               memcpy(exe->error_data_buf, c, exe->error_data_size);
+            }
+         }
+         if (count == 0) /* No lines to send, cancel the event. */
+         {
+            _ecore_exe_event_exe_data_free(NULL, e);
+            e = NULL;
+         }
+         else /* NULL terminate the array, so that people know where the end is. */
+         {
+            e->lines[count].line = NULL;
+            e->lines[count].size = 0;
+         }
+      }
+   }
 
    return e;
 }
@@ -801,19 +1007,22 @@ ecore_exe_event_data_get(Ecore_Exe * exe, Ecore_Exe_Flags flags)
  *
  * @param   exe The given process handle.
  * @param   tag The string tag to set on the process handle.
- * @ingroup Ecore_Exe_Basic_Group
  */
 EAPI void
-ecore_exe_tag_set(Ecore_Exe * exe, const char *tag)
+ecore_exe_tag_set(Ecore_Exe  *exe,
+                  const char *tag)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_set");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_set");
+      return;
+   }
    IF_FREE(exe->tag);
    if (tag)
-      exe->tag = strdup(tag);
+     exe->tag = strdup(tag);
+   else
+     exe->tag = NULL;
 }
 
 /**
@@ -823,17 +1032,19 @@ ecore_exe_tag_set(Ecore_Exe * exe, const char *tag)
  * else on this @p exe.
  *
  * @param   exe The given process handle.
- * @return  The string attached to @p exe.
- * @ingroup Ecore_Exe_Basic_Group
+ * @return The string attached to @p exe. It is a handle to existing
+ *         internal string and should not be modified, use
+ *         ecore_exe_tag_set() to change it. It might be @c NULL.
  */
-EAPI char          *
-ecore_exe_tag_get(Ecore_Exe * exe)
+EAPI const char *
+ecore_exe_tag_get(const Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_get");
-       return NULL;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_get");
+      return NULL;
+   }
    return exe->tag;
 }
 
@@ -846,58 +1057,61 @@ ecore_exe_tag_get(Ecore_Exe * exe)
  * @param   exe The given process handle.
  * @return  The data attached to the handle when @ref ecore_exe_run was
  *          called.
- * @ingroup Ecore_Exe_Basic_Group
  */
-EAPI void          *
-ecore_exe_free(Ecore_Exe * exe)
+EAPI void *
+ecore_exe_free(Ecore_Exe *exe)
 {
-   void               *data;
-   int                 ok = 0;
-   int                 result;
+   void *data;
+   int ok = 0;
+   int result;
 
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_free");
-       return NULL;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_free");
+      return NULL;
+   }
 
    data = exe->data;
 
+   if (exe->pre_free_cb)
+     exe->pre_free_cb(data, exe);
+
    if (exe->doomsday_clock)
-     {
-       struct _ecore_exe_dead_exe *dead;
-
-       ecore_timer_del(exe->doomsday_clock);
-       exe->doomsday_clock = NULL;
-       dead = exe->doomsday_clock_dead;
-       if (dead)
-         {
-            IF_FREE(dead->cmd);
-            free(dead);
-            exe->doomsday_clock_dead = NULL;
-         }
-     }
+   {
+      struct _ecore_exe_dead_exe *dead;
+
+      ecore_timer_del(exe->doomsday_clock);
+      exe->doomsday_clock = NULL;
+      dead = exe->doomsday_clock_dead;
+      if (dead)
+      {
+         IF_FREE(dead->cmd);
+         free(dead);
+         exe->doomsday_clock_dead = NULL;
+      }
+   }
    IF_FN_DEL(ecore_main_fd_handler_del, exe->write_fd_handler);
    IF_FN_DEL(ecore_main_fd_handler_del, exe->read_fd_handler);
    IF_FN_DEL(ecore_main_fd_handler_del, exe->error_fd_handler);
    if (exe->child_fd_write_x != -1)
-      E_NO_ERRNO(result, close(exe->child_fd_write_x), ok);
+     E_NO_ERRNO(result, close(exe->child_fd_write_x), ok);
    if (exe->child_fd_read_x != -1)
-      E_NO_ERRNO(result, close(exe->child_fd_read_x), ok);
+     E_NO_ERRNO(result, close(exe->child_fd_read_x), ok);
    if (exe->child_fd_error_x != -1)
-      E_NO_ERRNO(result, close(exe->child_fd_error_x), ok);
+     E_NO_ERRNO(result, close(exe->child_fd_error_x), ok);
    if (exe->child_fd_write != -1)
-      E_NO_ERRNO(result, close(exe->child_fd_write), ok);
+     E_NO_ERRNO(result, close(exe->child_fd_write), ok);
    if (exe->child_fd_read != -1)
-      E_NO_ERRNO(result, close(exe->child_fd_read), ok);
+     E_NO_ERRNO(result, close(exe->child_fd_read), ok);
    if (exe->child_fd_error != -1)
-      E_NO_ERRNO(result, close(exe->child_fd_error), ok);
+     E_NO_ERRNO(result, close(exe->child_fd_error), ok);
    IF_FREE(exe->write_data_buf);
    IF_FREE(exe->read_data_buf);
    IF_FREE(exe->error_data_buf);
    IF_FREE(exe->cmd);
 
-   exes = _ecore_list2_remove(exes, exe);
+   exes = (Ecore_Exe *)eina_inlist_remove(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
    ECORE_MAGIC_SET(exe, ECORE_MAGIC_NONE);
    IF_FREE(exe->tag);
    free(exe);
@@ -908,11 +1122,11 @@ ecore_exe_free(Ecore_Exe * exe)
  * Frees the given event data.
  *
  * @param   e The given event data.
- * @ingroup Ecore_Exe_Basic_Group
  */
 EAPI void
-ecore_exe_event_data_free(Ecore_Exe_Event_Data * e)
+ecore_exe_event_data_free(Ecore_Exe_Event_Data *e)
 {
+   if (!e) return;
    IF_FREE(e->lines);
    IF_FREE(e->data);
    free(e);
@@ -922,104 +1136,142 @@ ecore_exe_event_data_free(Ecore_Exe_Event_Data * e)
  * Retrieves the process ID of the given spawned process.
  * @param   exe Handle to the given spawned process.
  * @return  The process ID on success.  @c -1 otherwise.
- * @ingroup Ecore_Exe_Basic_Group
  */
-EAPI                pid_t
-ecore_exe_pid_get(Ecore_Exe * exe)
+EAPI pid_t
+ecore_exe_pid_get(const Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pid_get");
-       return -1;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pid_get");
+      return -1;
+   }
    return exe->pid;
 }
 
 /**
  * Retrieves the command of the given spawned process.
  * @param   exe Handle to the given spawned process.
- * @return  The command on success.  NULL otherwise.
- * @ingroup Ecore_Exe_Basic_Group
+ * @return The command on success, @c NULL otherwise. This string is the
+ *         pointer to the internal value and must not be modified in
+ *         any way.
  */
-EAPI char          *
-ecore_exe_cmd_get(Ecore_Exe * exe)
+EAPI const char *
+ecore_exe_cmd_get(const Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_cmd_get");
-       return NULL;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_cmd_get");
+      return NULL;
+   }
    return exe->cmd;
 }
 
 /**
  * Retrieves the data attached to the given process handle.
  * @param   exe The given process handle.
- * @return  The data pointer attached to @p exe.
- * @ingroup Ecore_Exe_Basic_Group
+ * @return The data pointer attached to @p exe Given to
+ *         ecore_exe_run() or ecore_exe_pipe_run()
  */
-EAPI void          *
-ecore_exe_data_get(Ecore_Exe * exe)
+EAPI void *
+ecore_exe_data_get(const Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
-       return NULL;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
+      return NULL;
+   }
    return exe->data;
 }
 
 /**
- * @defgroup Ecore_Exe_Signal_Group Spawned Process Signal Functions
- *
- * Functions that send signals to spawned processes.
+ * Sets the data attached to the given process handle.
+ * @param   exe The given process handle.
+ * @param   data The pointer to attach
+ * @return The data pointer previously attached to @p exe with
+ *         ecore_exe_run(), ecore_exe_pipe_run(), or ecore_exe_data_set()
+ * @since 1.1
+ */
+EAPI void *
+ecore_exe_data_set(Ecore_Exe *exe,
+                   void      *data)
+{
+   void *ret;
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, __func__);
+      return NULL;
+   }
+   ret = exe->data;
+   exe->data = data;
+   return ret;
+}
+
+/**
+ * Retrieves the flags attached to the given process handle.
+ * @param   exe The given process handle.
+ * @return  The flags attached to @p exe.
  */
+EAPI Ecore_Exe_Flags
+ecore_exe_flags_get(const Ecore_Exe *exe)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
+      return 0;
+   }
+   return exe->flags;
+}
 
 /**
  * Pauses the given process by sending it a @c SIGSTOP signal.
  * @param   exe Process handle to the given process.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_pause(Ecore_Exe * exe)
+ecore_exe_pause(Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pause");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pause");
+      return;
+   }
    kill(exe->pid, SIGSTOP);
 }
 
 /**
  * Continues the given paused process by sending it a @c SIGCONT signal.
  * @param   exe Process handle to the given process.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_continue(Ecore_Exe * exe)
+ecore_exe_continue(Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_continue");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_continue");
+      return;
+   }
    kill(exe->pid, SIGCONT);
 }
 
 /**
  * Sends the given spawned process a interrupt (@c SIGINT) signal.
  * @param   exe Process handle to the given process.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_interrupt(Ecore_Exe * exe)
+ecore_exe_interrupt(Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_interrupt");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_interrupt");
+      return;
+   }
    _ecore_exe_dead_attach(exe);
    kill(exe->pid, SIGINT);
 }
@@ -1027,16 +1279,16 @@ ecore_exe_interrupt(Ecore_Exe * exe)
 /**
  * Sends the given spawned process a quit (@c SIGQUIT) signal.
  * @param   exe Process handle to the given process.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_quit(Ecore_Exe * exe)
+ecore_exe_quit(Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_quit");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_quit");
+      return;
+   }
    _ecore_exe_dead_attach(exe);
    kill(exe->pid, SIGQUIT);
 }
@@ -1044,48 +1296,48 @@ ecore_exe_quit(Ecore_Exe * exe)
 /**
  * Sends the given spawned process a terminate (@c SIGTERM) signal.
  * @param   exe Process handle to the given process.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_terminate(Ecore_Exe * exe)
+ecore_exe_terminate(Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_terminate");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_terminate");
+      return;
+   }
    _ecore_exe_dead_attach(exe);
-   printf("Sending TERM signal to %s (%d).\n", exe->cmd, exe->pid);
+   INF("Sending TERM signal to %s (%d).", exe->cmd, exe->pid);
    kill(exe->pid, SIGTERM);
 }
 
 /**
  * Kills the given spawned process by sending it a @c SIGKILL signal.
  * @param   exe Process handle to the given process.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_kill(Ecore_Exe * exe)
+ecore_exe_kill(Ecore_Exe *exe)
 {
    struct _ecore_exe_dead_exe *dead;
 
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_kill");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_kill");
+      return;
+   }
 
    dead = calloc(1, sizeof(struct _ecore_exe_dead_exe));
    if (dead)
-     {
-       dead->pid = exe->pid;
-       dead->cmd = strdup(exe->cmd);
-       IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
-       exe->doomsday_clock =
-          ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead, dead);
-     }
-
-   printf("Sending KILL signal to %s (%d).\n", exe->cmd, exe->pid);
+   {
+      dead->pid = exe->pid;
+      dead->cmd = strdup(exe->cmd);
+      IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
+      exe->doomsday_clock =
+        ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead, dead);
+   }
+
+   INF("Sending KILL signal to %s (%d).", exe->cmd, exe->pid);
    kill(exe->pid, SIGKILL);
 }
 
@@ -1094,44 +1346,49 @@ ecore_exe_kill(Ecore_Exe * exe)
  * @param   exe Process handle to the given process.
  * @param   num The number user signal to send.  Must be either 1 or 2, or
  *              the signal will be ignored.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_signal(Ecore_Exe * exe, int num)
+ecore_exe_signal(Ecore_Exe *exe,
+                 int        num)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_signal");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_signal");
+      return;
+   }
    if (num == 1)
-      kill(exe->pid, SIGUSR1);
+     kill(exe->pid, SIGUSR1);
    else if (num == 2)
-      kill(exe->pid, SIGUSR2);
+     kill(exe->pid, SIGUSR2);
 }
 
 /**
  * Sends a @c SIGHUP signal to the given spawned process.
  * @param   exe Process handle to the given process.
- * @ingroup Ecore_Exe_Signal_Group
  */
 EAPI void
-ecore_exe_hup(Ecore_Exe * exe)
+ecore_exe_hup(Ecore_Exe *exe)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-     {
-       ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_hup");
-       return;
-     }
+   {
+      ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_hup");
+      return;
+   }
    kill(exe->pid, SIGHUP);
 }
 
-static Ecore_Exe   *
+/**
+ * @}
+ */
+
+static Ecore_Exe *
 _ecore_exe_is_it_alive(pid_t pid)
 {
-   Ecore_Exe          *exe = NULL;
+   Ecore_Exe *exe = NULL;
 
-   /* FIXME: There is no nice, safe, OS independant way to tell if a
+   /* FIXME: There is no nice, safe, OS independent way to tell if a
     * particular PID is still alive.  I have written code to do so
     * for my urunlevel busybox applet (http://urunlevel.sourceforge.net/),
     * but it's for linux only, and still not guaranteed.
@@ -1155,70 +1412,69 @@ _ecore_exe_is_it_alive(pid_t pid)
     */
    exe = _ecore_exe_find(pid);
    if (exe)
-     {
-       if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
-          exe = NULL;
-     }
+   {
+      if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+        exe = NULL;
+   }
 
    return exe;
 }
 
-static int
+static Eina_Bool
 _ecore_exe_make_sure_its_dead(void *data)
 {
    struct _ecore_exe_dead_exe *dead;
 
    dead = data;
    if (dead)
-     {
-       Ecore_Exe          *exe = NULL;
-
-       if ((exe = _ecore_exe_is_it_alive(dead->pid)) != NULL)
-         {
-            if (dead->cmd)
-               printf("Sending KILL signal to alledgedly dead %s (%d).\n",
-                      dead->cmd, dead->pid);
-            else
-               printf("Sending KILL signal to alledgedly dead PID %d.\n",
-                      dead->pid);
-            exe->doomsday_clock =
-               ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead,
-                               dead);
-            kill(dead->pid, SIGKILL);
-         }
-       else
-         {
-            IF_FREE(dead->cmd);
-            free(dead);
-         }
-     }
-   return 0;
+   {
+      Ecore_Exe *exe = NULL;
+
+      if ((exe = _ecore_exe_is_it_alive(dead->pid)))
+      {
+         if (dead->cmd)
+           INF("Sending KILL signal to allegedly dead %s (%d).",
+               dead->cmd, dead->pid);
+         else
+           INF("Sending KILL signal to allegedly dead PID %d.",
+               dead->pid);
+         exe->doomsday_clock =
+           ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead,
+                           dead);
+         kill(dead->pid, SIGKILL);
+      }
+      else
+      {
+         IF_FREE(dead->cmd);
+         free(dead);
+      }
+   }
+   return ECORE_CALLBACK_CANCEL;
 }
 
-static int
+static Eina_Bool
 _ecore_exe_make_sure_its_really_dead(void *data)
 {
    struct _ecore_exe_dead_exe *dead;
 
    dead = data;
    if (dead)
-     {
-       Ecore_Exe          *exe = NULL;
-
-       if ((exe = _ecore_exe_is_it_alive(dead->pid)) != NULL)
-         {
-            printf
-               ("RUN!  The zombie wants to eat your brains!  And your CPU!\n");
-            if (dead->cmd)
-               printf("%s (%d) is not really dead.\n", dead->cmd, dead->pid);
-            else
-               printf("PID %d is not really dead.\n", dead->pid);
-            exe->doomsday_clock = NULL;
-         }
-       IF_FREE(dead->cmd);
-       free(dead);
-     }
-   return 0;
+   {
+      Ecore_Exe *exe = NULL;
+
+      if ((exe = _ecore_exe_is_it_alive(dead->pid)))
+      {
+         ERR("RUN!  The zombie wants to eat your brains!  And your CPU!");
+         if (dead->cmd)
+           INF("%s (%d) is not really dead.", dead->cmd, dead->pid);
+         else
+           INF("PID %d is not really dead.", dead->pid);
+         exe->doomsday_clock = NULL;
+      }
+      IF_FREE(dead->cmd);
+      free(dead);
+   }
+   return ECORE_CALLBACK_CANCEL;
 }
 
 void
@@ -1234,32 +1490,43 @@ void
 _ecore_exe_shutdown(void)
 {
    while (exes)
-      ecore_exe_free(exes);
+     ecore_exe_free(exes);
 }
 
-Ecore_Exe          *
+Ecore_Exe *
 _ecore_exe_find(pid_t pid)
 {
-   Ecore_List2        *l;
-
-   for (l = (Ecore_List2 *) exes; l; l = l->next)
-     {
-       Ecore_Exe          *exe;
+   Ecore_Exe *exe;
 
-       exe = (Ecore_Exe *) l;
-       if (exe->pid == pid)
-          return exe;
-     }
+   EINA_INLIST_FOREACH(exes, exe)
+   {
+      if (exe->pid == pid)
+        return exe;
+   }
    return NULL;
 }
 
+Ecore_Timer *
+_ecore_exe_doomsday_clock_get(Ecore_Exe *exe)
+{
+   return exe->doomsday_clock;
+}
+
+void
+_ecore_exe_doomsday_clock_set(Ecore_Exe   *exe,
+                              Ecore_Timer *dc)
+{
+   exe->doomsday_clock = dc;
+}
+
 static inline void
-_ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags)
+_ecore_exe_exec_it(const char     *exe_cmd,
+                   Ecore_Exe_Flags flags)
 {
-   char                use_sh = 1;
-   char               *buf = NULL;
-   char              **args = NULL;
-   int                 save_errno = 0;
+   char use_sh = 1;
+   char *buf = NULL;
+   char **args = NULL;
+   int save_errno = 0;
 
    /* So what is this doing?
     *
@@ -1268,78 +1535,92 @@ _ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags)
     * If we don't find them, we can call the exe directly.
     */
    if (!strpbrk(exe_cmd, "|&;<>()$`\\\"'*?#"))
-     {
-       char               *token;
-       char                pre_command = 1;
-       int                 num_tokens = 0;
-
-       if (!(buf = strdup(exe_cmd)))
-          return;
-
-       token = strtok(buf, " \t\n\v");
-       while (token)
-         {
-            if (token[0] == '~')
-              break;
-            if (pre_command)
-              {
-                 if (token[0] == '[')
-                   break;
-                 if (strchr(token, '='))
-                   break;
-                 else
-                   pre_command = 0;
-              }
-            num_tokens++;
-            token = strtok(NULL, " \t\n\v");
-         }
-       IF_FREE(buf);
-       if ((!token) && (num_tokens))
-         {
-            int                 i = 0;
-
-            if (!(buf = strdup(exe_cmd)))
-              return;
-
-            token = strtok(buf, " \t\n\v");
-            use_sh = 0;
-            if (!(args = (char **)calloc(num_tokens + 1, sizeof(char *))))
-              {
-                 IF_FREE(buf);
-                 return;
-              }
-            for (i = 0; i < num_tokens; i++)
-              {
-                 if (token)
-                   args[i] = token;
-                 token = strtok(NULL, " \t\n\v");
-              }
-            args[num_tokens] = NULL;
-         }
-     }
+   {
+      char *token;
+      char pre_command = 1;
+      int num_tokens = 0;
+
+      if (!(buf = strdup(exe_cmd)))
+        return;
+
+      token = strtok(buf, " \t\n\v");
+      while (token)
+      {
+         if (token[0] == '~')
+           break;
+         if (pre_command)
+         {
+            if (token[0] == '[')
+              break;
+            if (strchr(token, '='))
+              break;
+            else
+              pre_command = 0;
+         }
+         num_tokens++;
+         token = strtok(NULL, " \t\n\v");
+      }
+      IF_FREE(buf);
+      if ((!token) && (num_tokens))
+      {
+         int i = 0;
+
+         if (!(buf = strdup(exe_cmd)))
+           return;
+
+         token = strtok(buf, " \t\n\v");
+         use_sh = 0;
+         if (!(args = (char **)calloc(num_tokens + 1, sizeof(char *))))
+         {
+            IF_FREE(buf);
+            return;
+         }
+         for (i = 0; i < num_tokens; i++)
+         {
+            if (token)
+              args[i] = token;
+            token = strtok(NULL, " \t\n\v");
+         }
+         args[num_tokens] = NULL;
+      }
+   }
+
+#ifdef HAVE_SYS_PRCTL_H
+   if ((flags & ECORE_EXE_TERM_WITH_PARENT))
+   {
+      prctl(PR_SET_PDEATHSIG, SIGTERM);
+   }
+#endif
 
    if (!(flags & ECORE_EXE_NOT_LEADER)) setsid();
    if ((flags & ECORE_EXE_USE_SH))
-     {
-       errno = 0;
-       execl("/bin/sh", "/bin/sh", "-c", exe_cmd, (char *)NULL);
-     }
-   else if (use_sh)
-     {                         /* We have to use a shell to run this. */
-       if (shell == NULL)
-         {                     /* Find users preferred shell. */
-            shell = getenv("SHELL");
-            if (shell == 0)
-              shell = "/bin/sh";
-         }
-       errno = 0;
-       execl(shell, shell, "-c", exe_cmd, (char *)NULL);
-     }
+   {
+      errno = 0;
+      execl("/bin/sh", "/bin/sh", "-c", exe_cmd, (char *)NULL);
+   }
+   else if (use_sh) /* We have to use a shell to run this. */
+   {
+      if (!shell) /* Find users preferred shell. */
+      {
+         shell = getenv("SHELL");
+         if (!shell)
+           shell = "/bin/sh";
+      }
+      errno = 0;
+      execl(shell, shell, "-c", exe_cmd, (char *)NULL);
+   }
    else
-     {                         /* We can run this directly. */
-       errno = 0;
-       execvp(args[0], args);
-     }
+   { /* We can run this directly. */
+      if (!args)
+      {
+         IF_FREE(buf);
+         IF_FREE(args);
+         ERR("arg[0] is NULL!");
+         return;
+      }
+      errno = 0;
+      execvp(args[0], args);
+   }
 
    save_errno = errno;
    IF_FREE(buf);
@@ -1348,226 +1629,223 @@ _ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags)
    return;
 }
 
-static int
-_ecore_exe_data_generic_handler(void *data, Ecore_Fd_Handler * fd_handler,
-                               Ecore_Exe_Flags flags)
+static Eina_Bool
+_ecore_exe_data_generic_handler(void             *data,
+                                Ecore_Fd_Handler *fd_handler,
+                                Ecore_Exe_Flags   flags)
 {
-   Ecore_Exe          *exe;
-   int                 child_fd;
-   int                 is_buffered = 0;
-   int                 event_type;
+   Ecore_Exe *exe;
+   int child_fd;
+   int event_type;
 
    exe = data;
 
    /* Sort out what sort of handler we are. */
    if (flags & ECORE_EXE_PIPE_READ)
-     {
-       flags = ECORE_EXE_PIPE_READ;
-       event_type = ECORE_EXE_EVENT_DATA;
-       child_fd = exe->child_fd_read;
-       if (exe->flags & ECORE_EXE_PIPE_READ_LINE_BUFFERED)
-          is_buffered = 1;
-     }
+   {
+      flags = ECORE_EXE_PIPE_READ;
+      event_type = ECORE_EXE_EVENT_DATA;
+      child_fd = exe->child_fd_read;
+   }
    else
-     {
-       flags = ECORE_EXE_PIPE_ERROR;
-       event_type = ECORE_EXE_EVENT_ERROR;
-       child_fd = exe->child_fd_error;
-       if (exe->flags & ECORE_EXE_PIPE_ERROR_LINE_BUFFERED)
-          is_buffered = 1;
-     }
+   {
+      flags = ECORE_EXE_PIPE_ERROR;
+      event_type = ECORE_EXE_EVENT_ERROR;
+      child_fd = exe->child_fd_error;
+   }
 
    if ((fd_handler)
        && (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)))
-     {
-       unsigned char      *inbuf;
-       int                 inbuf_num;
-
-       /* Get any left over data from last time. */
-       if (flags & ECORE_EXE_PIPE_READ)
-         {
-            inbuf = exe->read_data_buf;
-            inbuf_num = exe->read_data_size;
-            exe->read_data_buf = NULL;
-            exe->read_data_size = 0;
-         }
-       else
-         {
-            inbuf = exe->error_data_buf;
-            inbuf_num = exe->error_data_size;
-            exe->error_data_buf = NULL;
-            exe->error_data_size = 0;
-         }
-
-       for (;;)
-         {
-            int                 num, lost_exe;
-            char                buf[READBUFSIZ];
-
-            lost_exe = 0;
-            errno = 0;
-            if ((num = read(child_fd, buf, READBUFSIZ)) < 1)
-              /* FIXME: SPEED/SIZE TRADE OFF - add a smaller READBUFSIZE 
-               * (currently 64k) to inbuf, use that instead of buf, and
-               * save ourselves a memcpy(). */
-              {
-                 lost_exe = ((errno == EIO) ||
-                             (errno == EBADF) ||
-                             (errno == EPIPE) ||
-                             (errno == EINVAL) || (errno == ENOSPC));
-                 if ((errno != EAGAIN) && (errno != EINTR))
-                    perror("_ecore_exe_generic_handler() read problem ");
-              }
-            if (num > 0)
-              {                /* data got read. */
-                 inbuf = realloc(inbuf, inbuf_num + num);
-                 memcpy(inbuf + inbuf_num, buf, num);
-                 inbuf_num += num;
-              }
-            else
-              {                /* No more data to read. */
-                 if (inbuf)
-                   {
-                      Ecore_Exe_Event_Data *e;
-
-                      /* Stash the data away for later. */
-                      if (flags & ECORE_EXE_PIPE_READ)
-                        {
-                           exe->read_data_buf = inbuf;
-                           exe->read_data_size = inbuf_num;
-                        }
-                      else
-                        {
-                           exe->error_data_buf = inbuf;
-                           exe->error_data_size = inbuf_num;
-                        }
-
-                      if (!(exe->flags & ECORE_EXE_PIPE_AUTO))
-                        {
-                           e = ecore_exe_event_data_get(exe, flags);
-                           if (e)      /* Send the event. */
-                              ecore_event_add(event_type, e,
-                                              _ecore_exe_event_exe_data_free,
-                                              NULL);
-                        }
-                   }
-                 if (lost_exe)
-                   {
-                      if (flags & ECORE_EXE_PIPE_READ)
-                        {
-                           if (exe->read_data_size)
-                              printf
-                                 ("There are %d bytes left unsent from the dead exe %s.\n",
-                                  exe->read_data_size, exe->cmd);
-                        }
-                      else
-                        {
-                           if (exe->error_data_size)
-                              printf
-                                 ("There are %d bytes left unsent from the dead exe %s.\n",
-                                  exe->error_data_size, exe->cmd);
-                        }
-                      /* Thought about this a bit.  If the exe has actually
-                       * died, this won't do any harm as it must have died
-                       * recently and the pid has not had a chance to recycle.
-                       * It is also a paranoid catchall, coz the usual ecore_signal
-                       * mechenism should kick in.  But let's give it a good
-                       * kick in the head anyway.
-                       */
-                      ecore_exe_terminate(exe);
-                   }
-                 break;
-              }
-         }
-     }
-
-   return 1;
+   {
+      unsigned char *inbuf;
+      int inbuf_num;
+
+      /* Get any left over data from last time. */
+      if (flags & ECORE_EXE_PIPE_READ)
+      {
+         inbuf = exe->read_data_buf;
+         inbuf_num = exe->read_data_size;
+         exe->read_data_buf = NULL;
+         exe->read_data_size = 0;
+      }
+      else
+      {
+         inbuf = exe->error_data_buf;
+         inbuf_num = exe->error_data_size;
+         exe->error_data_buf = NULL;
+         exe->error_data_size = 0;
+      }
+
+      for (;; )
+      {
+         int num, lost_exe;
+         char buf[READBUFSIZ];
+
+         lost_exe = 0;
+         errno = 0;
+         if ((num = read(child_fd, buf, READBUFSIZ)) < 1)
+         {
+            /* FIXME: SPEED/SIZE TRADE OFF - add a smaller READBUFSIZE
+             * (currently 64k) to inbuf, use that instead of buf, and
+             * save ourselves a memcpy(). */
+              lost_exe = ((errno == EIO) ||
+                          (errno == EBADF) ||
+                          (errno == EPIPE) ||
+                          (errno == EINVAL) || (errno == ENOSPC));
+              if ((errno != EAGAIN) && (errno != EINTR))
+                perror("_ecore_exe_generic_handler() read problem ");
+         }
+         if (num > 0) /* data got read. */
+         {
+            inbuf = realloc(inbuf, inbuf_num + num);
+            memcpy(inbuf + inbuf_num, buf, num);
+            inbuf_num += num;
+         }
+         else
+         { /* No more data to read. */
+            if (inbuf)
+            {
+               Ecore_Exe_Event_Data *e;
+
+               /* Stash the data away for later. */
+               if (flags & ECORE_EXE_PIPE_READ)
+               {
+                  exe->read_data_buf = inbuf;
+                  exe->read_data_size = inbuf_num;
+               }
+               else
+               {
+                  exe->error_data_buf = inbuf;
+                  exe->error_data_size = inbuf_num;
+               }
+
+               if (!(exe->flags & ECORE_EXE_PIPE_AUTO))
+               {
+                  e = ecore_exe_event_data_get(exe, flags);
+                  if (e) /* Send the event. */
+                    ecore_event_add(event_type, e,
+                                    _ecore_exe_event_exe_data_free,
+                                    NULL);
+               }
+            }
+            if (lost_exe)
+            {
+               if (flags & ECORE_EXE_PIPE_READ)
+               {
+                  if (exe->read_data_size)
+                    INF("There are %d bytes left unsent from the dead exe %s.",
+                        exe->read_data_size, exe->cmd);
+               }
+               else
+               {
+                  if (exe->error_data_size)
+                    INF("There are %d bytes left unsent from the dead exe %s.",
+                        exe->error_data_size, exe->cmd);
+               }
+               /* Thought about this a bit.  If the exe has actually
+                * died, this won't do any harm as it must have died
+                * recently and the pid has not had a chance to recycle.
+                * It is also a paranoid catchall, coz the usual ecore_signal
+                * mechenism should kick in.  But let's give it a good
+                * kick in the head anyway.
+                */
+               ecore_exe_terminate(exe);
+            }
+            break;
+         }
+      }
+   }
+
+   return ECORE_CALLBACK_RENEW;
 }
 
-static int
-_ecore_exe_data_error_handler(void *data, Ecore_Fd_Handler * fd_handler)
+static Eina_Bool
+_ecore_exe_data_error_handler(void             *data,
+                              Ecore_Fd_Handler *fd_handler)
 {
    return _ecore_exe_data_generic_handler(data, fd_handler,
-                                         ECORE_EXE_PIPE_ERROR);
+                                          ECORE_EXE_PIPE_ERROR);
 }
 
-static int
-_ecore_exe_data_read_handler(void *data, Ecore_Fd_Handler * fd_handler)
+static Eina_Bool
+_ecore_exe_data_read_handler(void             *data,
+                             Ecore_Fd_Handler *fd_handler)
 {
    return _ecore_exe_data_generic_handler(data, fd_handler,
-                                         ECORE_EXE_PIPE_READ);
+                                          ECORE_EXE_PIPE_READ);
 }
 
-static int
-_ecore_exe_data_write_handler(void *data, Ecore_Fd_Handler * fd_handler __UNUSED__)
+static Eina_Bool
+_ecore_exe_data_write_handler(void             *data,
+                              Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
-   Ecore_Exe          *exe;
+   Ecore_Exe *exe;
 
    exe = data;
-   if ((exe->write_fd_handler)
-       &&
+   if ((exe->write_fd_handler) &&
        (ecore_main_fd_handler_active_get
-       (exe->write_fd_handler, ECORE_FD_WRITE)))
-      _ecore_exe_flush(exe);
+          (exe->write_fd_handler, ECORE_FD_WRITE)))
+     _ecore_exe_flush(exe);
 
    /* If we have sent all there is to send, and we need to close the pipe, then close it. */
    if ((exe->close_stdin == 1)
        && (exe->write_data_size == exe->write_data_offset))
-     {
-       int                 ok = 0;
-       int                 result;
-
-       printf("Closing stdin for %s\n", exe->cmd);
-       /* if (exe->child_fd_write != -1)  E_NO_ERRNO(result, fsync(exe->child_fd_write), ok);   This a) doesn't work, and b) isn't needed. */
-       IF_FN_DEL(ecore_main_fd_handler_del, exe->write_fd_handler);
-       if (exe->child_fd_write != -1)
-          E_NO_ERRNO(result, close(exe->child_fd_write), ok);
-       exe->child_fd_write = -1;
-       IF_FREE(exe->write_data_buf);
-     }
-
-   return 1;
+   {
+      int ok = 0;
+      int result;
+
+      INF("Closing stdin for %s", exe->cmd);
+      /* if (exe->child_fd_write != -1)  E_NO_ERRNO(result, fsync(exe->child_fd_write), ok);   This a) doesn't work, and b) isn't needed. */
+      IF_FN_DEL(ecore_main_fd_handler_del, exe->write_fd_handler);
+      if (exe->child_fd_write != -1)
+        E_NO_ERRNO(result, close(exe->child_fd_write), ok);
+      exe->child_fd_write = -1;
+      IF_FREE(exe->write_data_buf);
+   }
+
+   return ECORE_CALLBACK_RENEW;
 }
 
 static void
-_ecore_exe_flush(Ecore_Exe * exe)
+_ecore_exe_flush(Ecore_Exe *exe)
 {
-   int                 count;
+   int count;
 
    /* check whether we need to write anything at all. */
    if ((exe->child_fd_write == -1) || (!exe->write_data_buf))
-      return;
+     return;
    if (exe->write_data_size == exe->write_data_offset)
-      return;
+     return;
 
    count = write(exe->child_fd_write,
-                (char *)exe->write_data_buf + exe->write_data_offset,
-                exe->write_data_size - exe->write_data_offset);
+                 (char *)exe->write_data_buf + exe->write_data_offset,
+                 exe->write_data_size - exe->write_data_offset);
    if (count < 1)
-     {
-       if (errno == EIO || errno == EBADF || errno == EPIPE || errno == EINVAL || errno == ENOSPC)     /* we lost our exe! */
-         {
-            ecore_exe_terminate(exe);
-            if (exe->write_fd_handler)
-               ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
-         }
-     }
+   {
+      if (errno == EIO || errno == EBADF || errno == EPIPE || errno == EINVAL || errno == ENOSPC) /* we lost our exe! */
+      {
+         ecore_exe_terminate(exe);
+         if (exe->write_fd_handler)
+           ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
+      }
+   }
    else
-     {
-       exe->write_data_offset += count;
-       if (exe->write_data_offset >= exe->write_data_size)
-         {                     /* Nothing left to write, clean up. */
-            exe->write_data_size = 0;
-            exe->write_data_offset = 0;
-            IF_FREE(exe->write_data_buf);
-            if (exe->write_fd_handler)
-               ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
-         }
-     }
+   {
+      exe->write_data_offset += count;
+      if (exe->write_data_offset >= exe->write_data_size) /* Nothing left to write, clean up. */
+      {
+         exe->write_data_size = 0;
+         exe->write_data_offset = 0;
+         IF_FREE(exe->write_data_buf);
+         if (exe->write_fd_handler)
+           ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
+      }
+   }
 }
 
 static void
-_ecore_exe_event_exe_data_free(void *data __UNUSED__, void *ev)
+_ecore_exe_event_exe_data_free(void *data __UNUSED__,
+                               void *ev)
 {
    Ecore_Exe_Event_Data *e;
 
@@ -1585,7 +1863,8 @@ _ecore_exe_event_add_new(void)
 }
 
 static void
-_ecore_exe_event_add_free(void *data __UNUSED__, void *ev)
+_ecore_exe_event_add_free(void *data __UNUSED__,
+                          void *ev)
 {
    Ecore_Exe_Event_Add *e;
 
@@ -1593,7 +1872,7 @@ _ecore_exe_event_add_free(void *data __UNUSED__, void *ev)
    free(e);
 }
 
-void               *
+void *
 _ecore_exe_event_del_new(void)
 {
    Ecore_Exe_Event_Del *e;
@@ -1603,13 +1882,14 @@ _ecore_exe_event_del_new(void)
 }
 
 void
-_ecore_exe_event_del_free(void *data __UNUSED__, void *ev)
+_ecore_exe_event_del_free(void *data __UNUSED__,
+                          void *ev)
 {
    Ecore_Exe_Event_Del *e;
 
    e = ev;
    if (e->exe)
-      ecore_exe_free(e->exe);
+     ecore_exe_free(e->exe);
    free(e);
 }
 
@@ -1621,14 +1901,13 @@ _ecore_exe_dead_attach(Ecore_Exe *exe)
    if (exe->doomsday_clock_dead) return;
    dead = calloc(1, sizeof(struct _ecore_exe_dead_exe));
    if (dead)
-     {
-       dead->pid = exe->pid;
-       dead->cmd = strdup(exe->cmd);
-       IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
-       exe->doomsday_clock =
-          ecore_timer_add(10.0, _ecore_exe_make_sure_its_dead, dead);
-       exe->doomsday_clock_dead = dead;
-     }
+   {
+      dead->pid = exe->pid;
+      dead->cmd = strdup(exe->cmd);
+      IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
+      exe->doomsday_clock =
+        ecore_timer_add(10.0, _ecore_exe_make_sure_its_dead, dead);
+      exe->doomsday_clock_dead = dead;
+   }
 }
 
-#endif
diff --git a/src/lib/ecore/ecore_exe_ps3.c b/src/lib/ecore/ecore_exe_ps3.c
new file mode 100644 (file)
index 0000000..1ef1e81
--- /dev/null
@@ -0,0 +1,20 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_ESCAPE
+# include <Escape.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+void
+_ecore_exe_init(void)
+{
+}
+
+void
+_ecore_exe_shutdown(void)
+{
+}
diff --git a/src/lib/ecore/ecore_exe_win32.c b/src/lib/ecore/ecore_exe_win32.c
new file mode 100644 (file)
index 0000000..1f5cb4e
--- /dev/null
@@ -0,0 +1,1055 @@
+/*
+ * TODO:
+ * - manage I/O pipes (several ones, and stdin)
+ * - manage SetConsoleCtrlHandler ?
+ * - the child process seems to still run after the DEL event
+ * - add log messages
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <process.h>
+
+#define ECORE_EXE_WIN32_TIMEOUT 3000
+
+typedef enum
+{
+   ECORE_EXE_WIN32_SIGINT,
+   ECORE_EXE_WIN32_SIGQUIT,
+   ECORE_EXE_WIN32_SIGTERM,
+   ECORE_EXE_WIN32_SIGKILL
+} Ecore_Exe_Win32_Signal;
+
+struct _Ecore_Exe
+{
+   EINA_INLIST;
+                          ECORE_MAGIC;
+
+   HANDLE                 process2;
+   HANDLE                 process; /* CloseHandle */
+   HANDLE                 process_thread;
+   DWORD                  process_id;
+   DWORD                  thread_id;
+   void                  *data;
+   char                  *tag;
+   char                  *cmd;
+   Ecore_Exe_Flags        flags;
+   Ecore_Exe_Win32_Signal sig;
+   Ecore_Win32_Handler   *h_close;
+   struct
+   {
+      HANDLE      child_pipe;
+      HANDLE      child_pipe_x;
+      Ecore_Pipe *p;
+      HANDLE      thread;
+      void       *data_buf;
+      int         data_size;
+   } pipe_read;
+   struct
+   {
+      HANDLE               child_pipe;
+      HANDLE               child_pipe_x;
+      HANDLE               thread;
+      Ecore_Win32_Handler *h;
+      void                *data_buf;
+      int                  data_size;
+   } pipe_write;
+   struct
+   {
+      HANDLE      child_pipe;
+      HANDLE      child_pipe_x;
+      Ecore_Pipe *p;
+      HANDLE      thread;
+      void       *data_buf;
+      int         data_size;
+   } pipe_error;
+   Eina_Bool    close_stdin : 1;
+   Eina_Bool    is_suspended : 1;
+
+   Ecore_Exe_Cb pre_free_cb;
+};
+
+static Ecore_Exe *exes = NULL;
+
+static int           _ecore_exe_win32_pipes_set(Ecore_Exe *exe);
+static void          _ecore_exe_win32_pipes_close(Ecore_Exe *exe);
+
+static BOOL CALLBACK _ecore_exe_enum_windows_procedure(HWND   window,
+                                                       LPARAM data);
+static void          _ecore_exe_event_add_free(void *data,
+                                               void *ev);
+static void          _ecore_exe_event_del_free(void *data,
+                                               void *ev);
+static void          _ecore_exe_event_exe_data_free(void *data,
+                                                    void *ev);
+static int           _ecore_exe_win32_pipe_thread_generic_cb(void           *data,
+                                                             Ecore_Exe_Flags flags);
+static DWORD WINAPI  _ecore_exe_win32_pipe_thread_read_cb(void *data);
+static DWORD WINAPI  _ecore_exe_win32_pipe_thread_error_cb(void *data);
+static Eina_Bool     _ecore_exe_close_cb(void                *data,
+                                         Ecore_Win32_Handler *wh);
+static void          _ecore_exe_pipe_read_cb(void        *data,
+                                             void        *buf,
+                                             unsigned int size);
+static int  _ecore_exe_pipe_write_cb(void                *data,
+                                     Ecore_Win32_Handler *wh);
+static void _ecore_exe_pipe_error_cb(void        *data,
+                                     void        *buf,
+                                     unsigned int size);
+
+EAPI int ECORE_EXE_EVENT_ADD = 0;
+EAPI int ECORE_EXE_EVENT_DEL = 0;
+EAPI int ECORE_EXE_EVENT_DATA = 0;
+EAPI int ECORE_EXE_EVENT_ERROR = 0;
+
+void
+_ecore_exe_init(void)
+{
+   ECORE_EXE_EVENT_ADD = ecore_event_type_new();
+   ECORE_EXE_EVENT_DEL = ecore_event_type_new();
+   ECORE_EXE_EVENT_DATA = ecore_event_type_new();
+   ECORE_EXE_EVENT_ERROR = ecore_event_type_new();
+}
+
+void
+_ecore_exe_shutdown(void)
+{
+   while (exes)
+     ecore_exe_free(exes);
+}
+
+static int run_pri = NORMAL_PRIORITY_CLASS;
+
+EAPI void
+ecore_exe_run_priority_set(int pri)
+{
+   switch (pri)
+     {
+      case ECORE_EXE_WIN32_PRIORITY_IDLE:
+        run_pri = IDLE_PRIORITY_CLASS;
+        break;
+
+      case ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL:
+        run_pri = BELOW_NORMAL_PRIORITY_CLASS;
+        break;
+
+      case ECORE_EXE_WIN32_PRIORITY_NORMAL:
+        run_pri = NORMAL_PRIORITY_CLASS;
+        break;
+
+      case ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL:
+        run_pri = ABOVE_NORMAL_PRIORITY_CLASS;
+        break;
+
+      case ECORE_EXE_WIN32_PRIORITY_HIGH:
+        run_pri = HIGH_PRIORITY_CLASS;
+        break;
+
+      case ECORE_EXE_WIN32_PRIORITY_REALTIME:
+        run_pri = REALTIME_PRIORITY_CLASS;
+        break;
+
+      default:
+        break;
+     }
+}
+
+EAPI int
+ecore_exe_run_priority_get(void)
+{
+   switch (run_pri)
+     {
+      case IDLE_PRIORITY_CLASS:
+        return ECORE_EXE_WIN32_PRIORITY_IDLE;
+
+      case BELOW_NORMAL_PRIORITY_CLASS:
+        return ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL;
+
+      case NORMAL_PRIORITY_CLASS:
+        return ECORE_EXE_WIN32_PRIORITY_NORMAL;
+
+      case ABOVE_NORMAL_PRIORITY_CLASS:
+        return ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL;
+
+      case HIGH_PRIORITY_CLASS:
+        return ECORE_EXE_WIN32_PRIORITY_HIGH;
+
+      case REALTIME_PRIORITY_CLASS:
+        return ECORE_EXE_WIN32_PRIORITY_REALTIME;
+
+      /* default should not be reached */
+      default:
+        return ECORE_EXE_WIN32_PRIORITY_NORMAL;
+     }
+}
+
+EAPI Ecore_Exe *
+ecore_exe_run(const char *exe_cmd,
+              const void *data)
+{
+   return ecore_exe_pipe_run(exe_cmd, 0, data);
+}
+
+EAPI Ecore_Exe *
+ecore_exe_pipe_run(const char     *exe_cmd,
+                   Ecore_Exe_Flags flags,
+                   const void     *data)
+{
+   STARTUPINFO si;
+   PROCESS_INFORMATION pi;
+   Ecore_Exe_Event_Add *e;
+   Ecore_Exe *exe;
+   char *ret = NULL;
+
+   exe = calloc(1, sizeof(Ecore_Exe));
+   if (!exe)
+     return NULL;
+
+   if ((flags & ECORE_EXE_PIPE_AUTO) && (!(flags & ECORE_EXE_PIPE_ERROR))
+       && (!(flags & ECORE_EXE_PIPE_READ)))
+     /* We need something to auto pipe. */
+     flags |= ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR;
+
+   exe->flags = flags;
+   if (exe->flags & ECORE_EXE_PIPE_READ)
+     if (!_ecore_exe_win32_pipes_set(exe))
+       goto free_exe;
+
+   if (exe->flags & ECORE_EXE_PIPE_WRITE)
+     if (!_ecore_exe_win32_pipes_set(exe))
+       goto close_pipes;
+
+   if (exe->flags & ECORE_EXE_PIPE_ERROR)
+     if (!_ecore_exe_win32_pipes_set(exe))
+       goto close_pipes;
+
+   if ((exe->flags & ECORE_EXE_USE_SH) ||
+       ((ret = strrstr(exe_cmd, ".bat")) && (ret[4] == '\0')))
+     {
+        char buf[PATH_MAX];
+        snprintf(buf, PATH_MAX, "cmd.exe /c %s", exe_cmd);
+        exe->cmd = strdup(buf);
+     }
+   else
+     exe->cmd = strdup(exe_cmd);
+
+   if (!exe->cmd)
+     goto close_pipes;
+
+   ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
+
+   ZeroMemory(&si, sizeof(STARTUPINFO));
+   si.cb = sizeof(STARTUPINFO);
+   si.hStdOutput = exe->pipe_read.child_pipe_x;
+   si.hStdInput = exe->pipe_write.child_pipe;
+   si.hStdError = exe->pipe_error.child_pipe_x;
+   si.dwFlags |= STARTF_USESTDHANDLES;
+
+   /* FIXME: gerer la priorite */
+
+   if (!CreateProcess(NULL, exe->cmd, NULL, NULL, EINA_TRUE,
+                      run_pri | CREATE_SUSPENDED, NULL, NULL, &si, &pi))
+     goto free_exe_cmd;
+
+   /* be sure that the child process is running */
+   /* FIXME: This does not work if the child is an EFL-based app */
+   /* if (WaitForInputIdle(pi.hProcess, INFINITE) == WAIT_FAILED) */
+   /*   goto free_exe_cmd; */
+
+   ECORE_MAGIC_SET(exe, ECORE_MAGIC_EXE);
+   exe->process = pi.hProcess;
+   exe->process_thread = pi.hThread;
+   exe->process_id = pi.dwProcessId;
+   exe->thread_id = pi.dwThreadId;
+   exe->data = (void *)data;
+
+   if (!(exe->process2 = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_SUSPEND_RESUME | PROCESS_TERMINATE | SYNCHRONIZE,
+                                     EINA_FALSE, pi.dwProcessId)))
+     goto close_thread;
+
+   exe->h_close = ecore_main_win32_handler_add(exe->process2, _ecore_exe_close_cb, exe);
+   if (!exe->h_close) goto close_process2;
+
+   if (ResumeThread(exe->process_thread) == ((DWORD)-1))
+     goto close_process2;
+
+   exes = (Ecore_Exe *)eina_inlist_append(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
+
+   e = (Ecore_Exe_Event_Add *)calloc(1, sizeof(Ecore_Exe_Event_Add));
+   if (!e) goto delete_h_close;
+
+   e->exe = exe;
+   ecore_event_add(ECORE_EXE_EVENT_ADD, e,
+                   _ecore_exe_event_add_free, NULL);
+
+   return exe;
+
+delete_h_close:
+   ecore_main_win32_handler_del(exe->h_close);
+close_process2:
+   CloseHandle(exe->process2);
+close_thread:
+   CloseHandle(exe->process_thread);
+   CloseHandle(exe->process);
+free_exe_cmd:
+   free(exe->cmd);
+close_pipes:
+   _ecore_exe_win32_pipes_close(exe);
+free_exe:
+   free(exe);
+   return NULL;
+}
+
+EAPI void
+ecore_exe_callback_pre_free_set(Ecore_Exe   *exe,
+                                Ecore_Exe_Cb func)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE,
+                         "ecore_exe_callback_pre_free_set");
+        return;
+     }
+   exe->pre_free_cb = func;
+}
+
+EAPI Eina_Bool
+ecore_exe_send(Ecore_Exe  *exe,
+               const void *data,
+               int         size)
+{
+   void *buf;
+
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_send");
+        return 0;
+     }
+
+   if (exe->close_stdin)
+     {
+        ERR("Ecore_Exe %p stdin is closed! Cannot send %d bytes from %p",
+            exe, size, data);
+        return 0;
+     }
+
+   if (!exe->pipe_write.child_pipe)
+     {
+        ERR("Ecore_Exe %p created without ECORE_EXE_PIPE_WRITE! "
+            "Cannot send %d bytes from %p", exe, size, data);
+        return 0;
+     }
+
+   buf = realloc(exe->pipe_write.data_buf, exe->pipe_write.data_size + size);
+   if (!buf) return 0;
+
+   exe->pipe_write.data_buf = buf;
+   memcpy((char *)exe->pipe_write.data_buf + exe->pipe_write.data_size, data, size);
+   exe->pipe_write.data_size += size;
+
+   /* if (exe->pipe_write.) */
+   /*    ecore_main_fd_handler_active_set(exe->pipe_write.h, ECORE_FD_WRITE); */
+
+   return 1;
+}
+
+EAPI void
+ecore_exe_close_stdin(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_close_stdin");
+        return;
+     }
+   exe->close_stdin = 1;
+}
+
+/* Not used on Windows */
+EAPI void
+ecore_exe_auto_limits_set(Ecore_Exe *exe __UNUSED__,
+                          int        start_bytes __UNUSED__,
+                          int        end_bytes __UNUSED__,
+                          int        start_lines __UNUSED__,
+                          int        end_lines __UNUSED__)
+{
+}
+
+EAPI Ecore_Exe_Event_Data *
+ecore_exe_event_data_get(Ecore_Exe      *exe,
+                         Ecore_Exe_Flags flags)
+{
+   Ecore_Exe_Event_Data *e = NULL;
+   unsigned char *inbuf;
+   int inbuf_num;
+
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_event_data_get");
+        return NULL;
+     }
+
+   /* Sort out what sort of event we are, */
+   /* And get the data. */
+   if (flags & ECORE_EXE_PIPE_READ)
+     {
+        inbuf = exe->pipe_read.data_buf;
+        inbuf_num = exe->pipe_read.data_size;
+        exe->pipe_read.data_buf = NULL;
+        exe->pipe_read.data_size = 0;
+     }
+   else
+     {
+        inbuf = exe->pipe_error.data_buf;
+        inbuf_num = exe->pipe_error.data_size;
+        exe->pipe_error.data_buf = NULL;
+        exe->pipe_error.data_size = 0;
+     }
+
+   e = calloc(1, sizeof(Ecore_Exe_Event_Data));
+   if (e)
+     {
+        e->exe = exe;
+        e->data = inbuf;
+        e->size = inbuf_num;
+     }
+
+   return e;
+}
+
+EAPI void
+ecore_exe_event_data_free(Ecore_Exe_Event_Data *e)
+{
+   if (!e) return;
+   IF_FREE(e->lines);
+   IF_FREE(e->data);
+   free(e);
+}
+
+EAPI void *
+ecore_exe_free(Ecore_Exe *exe)
+{
+   void *data;
+
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_free");
+        return NULL;
+     }
+
+   data = exe->data;
+
+   if (exe->pre_free_cb)
+     exe->pre_free_cb(data, exe);
+
+   CloseHandle(exe->process2);
+   CloseHandle(exe->process_thread);
+   CloseHandle(exe->process);
+   free(exe->cmd);
+   _ecore_exe_win32_pipes_close(exe);
+   exes = (Ecore_Exe *)eina_inlist_remove(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
+   ECORE_MAGIC_SET(exe, ECORE_MAGIC_NONE);
+   if (exe->tag) free(exe->tag);
+   free(exe);
+
+   return data;
+}
+
+EAPI pid_t
+ecore_exe_pid_get(const Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pid_get");
+        return -1;
+     }
+   return exe->process_id;
+}
+
+EAPI void
+ecore_exe_tag_set(Ecore_Exe  *exe,
+                  const char *tag)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_set");
+        return;
+     }
+   IF_FREE(exe->tag);
+   if (tag)
+     exe->tag = strdup(tag);
+}
+
+EAPI const char *
+ecore_exe_tag_get(const Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_get");
+        return NULL;
+     }
+   return exe->tag;
+}
+
+EAPI const char *
+ecore_exe_cmd_get(const Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_cmd_get");
+        return NULL;
+     }
+   return exe->cmd;
+}
+
+EAPI void *
+ecore_exe_data_get(const Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
+        return NULL;
+     }
+   return exe->data;
+}
+
+EAPI Ecore_Exe_Flags
+ecore_exe_flags_get(const Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
+        return 0;
+     }
+   return exe->flags;
+}
+
+EAPI void
+ecore_exe_pause(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pause");
+        return;
+     }
+
+   if (exe->is_suspended)
+     return;
+
+   if (SuspendThread(exe->process_thread) != (DWORD)-1)
+     exe->is_suspended = 1;
+}
+
+EAPI void
+ecore_exe_continue(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_continue");
+        return;
+     }
+
+   if (!exe->is_suspended)
+     return;
+
+   if (ResumeThread(exe->process_thread) != (DWORD)-1)
+     exe->is_suspended = 0;
+}
+
+EAPI void
+ecore_exe_interrupt(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_interrupt");
+        return;
+     }
+
+   CloseHandle(exe->process_thread);
+   CloseHandle(exe->process);
+   exe->sig = ECORE_EXE_WIN32_SIGINT;
+   while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
+}
+
+EAPI void
+ecore_exe_quit(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_quit");
+        return;
+     }
+
+   CloseHandle(exe->process_thread);
+   CloseHandle(exe->process);
+   exe->sig = ECORE_EXE_WIN32_SIGQUIT;
+   while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
+}
+
+EAPI void
+ecore_exe_terminate(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_terminate");
+        return;
+     }
+
+/*    CloseHandle(exe->thread); */
+   CloseHandle(exe->process);
+   exe->sig = ECORE_EXE_WIN32_SIGTERM;
+   while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
+}
+
+EAPI void
+ecore_exe_kill(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_kill");
+        return;
+     }
+
+   CloseHandle(exe->process_thread);
+   CloseHandle(exe->process);
+   exe->sig = ECORE_EXE_WIN32_SIGKILL;
+   while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
+}
+
+EAPI void
+ecore_exe_signal(Ecore_Exe *exe,
+                 int        num __UNUSED__)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_signal");
+        return;
+     }
+
+   /* does nothing */
+}
+
+EAPI void
+ecore_exe_hup(Ecore_Exe *exe)
+{
+   if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
+     {
+        ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_hup");
+        return;
+     }
+
+   /* does nothing */
+}
+
+/* FIXME: manage error mode */
+static int
+_ecore_exe_win32_pipe_thread_generic_cb(void           *data,
+                                        Ecore_Exe_Flags flags)
+{
+#define BUFSIZE 2048
+   char buf[BUFSIZE];
+   Ecore_Exe *exe;
+   char *current_buf = NULL;
+   HANDLE child_pipe;
+   Ecore_Pipe *ecore_pipe;
+   Ecore_Exe_Event_Data *event;
+   DWORD size;
+   DWORD current_size = 0;
+   BOOL res;
+
+   exe = (Ecore_Exe *)data;
+
+   /* Sort out what sort of handler we are. */
+   /* And get any left over data from last time. */
+   if ((exe->flags & ECORE_EXE_PIPE_READ) && (flags == ECORE_EXE_PIPE_READ))
+     {
+        child_pipe = exe->pipe_read.child_pipe;
+        ecore_pipe = exe->pipe_read.p;
+        flags = ECORE_EXE_PIPE_READ;
+     }
+   else if ((exe->flags & ECORE_EXE_PIPE_ERROR) && (flags == ECORE_EXE_PIPE_ERROR))
+     {
+        child_pipe = exe->pipe_error.child_pipe;
+        ecore_pipe = exe->pipe_error.p;
+        flags = ECORE_EXE_PIPE_ERROR;
+     }
+   else
+     return 0;
+
+   while (1)
+     {
+        if (!PeekNamedPipe(child_pipe, buf, sizeof(buf), &size, &current_size, NULL))
+          continue;
+        if (size == 0)
+          continue;
+        current_buf = (char *)malloc(current_size);
+        if (!current_buf)
+          continue;
+        res = ReadFile(child_pipe, current_buf, current_size, &size, NULL);
+        if (!res || (size == 0))
+          {
+             free(current_buf);
+             current_buf = NULL;
+             continue;
+          }
+        if (current_size != size)
+          {
+             free(current_buf);
+             current_buf = NULL;
+             continue;
+          }
+        current_size = size;
+
+        if (flags == ECORE_EXE_PIPE_READ)
+          {
+             exe->pipe_read.data_buf = current_buf;
+             exe->pipe_read.data_size = current_size;
+          }
+        else
+          {
+             exe->pipe_error.data_buf = current_buf;
+             exe->pipe_error.data_size = current_size;
+          }
+
+        event = ecore_exe_event_data_get(exe, flags);
+        if (event)
+          ecore_pipe_write(ecore_pipe, &event, sizeof(event));
+
+        current_buf = NULL;
+        current_size = 0;
+     }
+
+   return 1;
+}
+
+static DWORD WINAPI
+_ecore_exe_win32_pipe_thread_read_cb(void *data)
+{
+   return _ecore_exe_win32_pipe_thread_generic_cb(data, ECORE_EXE_PIPE_READ);
+}
+
+static DWORD WINAPI
+_ecore_exe_win32_pipe_thread_error_cb(void *data)
+{
+   return _ecore_exe_win32_pipe_thread_generic_cb(data, ECORE_EXE_PIPE_ERROR);
+}
+
+static int
+_ecore_exe_win32_pipes_set(Ecore_Exe *exe)
+{
+   SECURITY_ATTRIBUTES sa;
+   HANDLE child_pipe;
+   HANDLE child_pipe_x;
+
+   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+   sa.bInheritHandle = EINA_TRUE;
+   sa.lpSecurityDescriptor = NULL;
+
+   if (!CreatePipe(&child_pipe, &child_pipe_x, &sa, 0))
+     return 0;
+   if (exe->flags & ECORE_EXE_PIPE_WRITE)
+     {
+        if (!SetHandleInformation(child_pipe_x, HANDLE_FLAG_INHERIT, 0))
+          goto close_pipe;
+     }
+   else
+     {
+        if (!SetHandleInformation(child_pipe, HANDLE_FLAG_INHERIT, 0))
+          goto close_pipe;
+     }
+
+   if (exe->flags & ECORE_EXE_PIPE_READ)
+     {
+        exe->pipe_read.child_pipe = child_pipe;
+        exe->pipe_read.child_pipe_x = child_pipe_x;
+        exe->pipe_read.p = ecore_pipe_add(_ecore_exe_pipe_read_cb, exe);
+        exe->pipe_read.thread = CreateThread(NULL, 0,
+                                             _ecore_exe_win32_pipe_thread_read_cb,
+                                             exe, 0, NULL);
+     }
+   else if (exe->flags & ECORE_EXE_PIPE_WRITE)
+     {
+        exe->pipe_write.child_pipe = child_pipe;
+        exe->pipe_write.child_pipe_x = child_pipe_x;
+/*         exe->pipe_write.thread = CreateThread(NULL, 0, */
+/*                                              _ecore_exe_win32_pipe_thread_cb, */
+/*                                              exe, 0, NULL); */
+     }
+   else
+     {
+        exe->pipe_error.child_pipe = child_pipe;
+        exe->pipe_error.child_pipe_x = child_pipe_x;
+        exe->pipe_error.p = ecore_pipe_add(_ecore_exe_pipe_error_cb, exe);
+        exe->pipe_error.thread = CreateThread(NULL, 0,
+                                              _ecore_exe_win32_pipe_thread_error_cb,
+                                              exe, 0, NULL);
+     }
+
+   return 1;
+
+close_pipe:
+   CloseHandle(child_pipe);
+   CloseHandle(child_pipe_x);
+
+   return 0;
+}
+
+static void
+_ecore_exe_win32_pipes_close(Ecore_Exe *exe)
+{
+   if (exe->flags & ECORE_EXE_PIPE_READ)
+     {
+        if (exe->pipe_read.child_pipe)
+          {
+             CloseHandle(exe->pipe_read.child_pipe);
+             exe->pipe_read.child_pipe = NULL;
+          }
+        if (exe->pipe_read.child_pipe_x)
+          {
+             CloseHandle(exe->pipe_read.child_pipe_x);
+             exe->pipe_read.child_pipe_x = NULL;
+          }
+     }
+
+   if (exe->flags & ECORE_EXE_PIPE_WRITE)
+     {
+        if (exe->pipe_write.child_pipe)
+          {
+             CloseHandle(exe->pipe_write.child_pipe);
+             exe->pipe_write.child_pipe = NULL;
+          }
+        if (exe->pipe_write.child_pipe_x)
+          {
+             CloseHandle(exe->pipe_write.child_pipe_x);
+             exe->pipe_write.child_pipe_x = NULL;
+          }
+     }
+
+   if (exe->flags & ECORE_EXE_PIPE_ERROR)
+     {
+        if (exe->pipe_error.child_pipe)
+          {
+             CloseHandle(exe->pipe_error.child_pipe);
+             exe->pipe_error.child_pipe = NULL;
+          }
+        if (exe->pipe_error.child_pipe_x)
+          {
+             CloseHandle(exe->pipe_error.child_pipe_x);
+             exe->pipe_error.child_pipe_x = NULL;
+          }
+     }
+}
+
+static DWORD WINAPI
+_ecore_exe_thread_procedure(LPVOID data __UNUSED__)
+{
+   GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
+   GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0);
+   return 1;
+}
+
+static BOOL CALLBACK
+_ecore_exe_enum_windows_procedure(HWND   window,
+                                  LPARAM data)
+{
+   Ecore_Exe *exe;
+   DWORD thread_id;
+
+   exe = (Ecore_Exe *)data;
+   thread_id = GetWindowThreadProcessId(window, NULL);
+
+   if (thread_id == exe->thread_id)
+     {
+        /* Ctrl-C or Ctrl-Break */
+         if (CreateRemoteThread(exe->process, NULL, 0,
+                                (LPTHREAD_START_ROUTINE)_ecore_exe_thread_procedure, NULL,
+                                0, NULL))
+           {
+              printf ("remote thread\n");
+              return EINA_FALSE;
+           }
+
+         if ((exe->sig == ECORE_EXE_WIN32_SIGINT) ||
+             (exe->sig == ECORE_EXE_WIN32_SIGQUIT))
+           {
+              printf ("int or quit\n");
+              return EINA_FALSE;
+           }
+
+         /* WM_CLOSE message */
+         PostMessage(window, WM_CLOSE, 0, 0);
+         if (WaitForSingleObject(exe->process, ECORE_EXE_WIN32_TIMEOUT) == WAIT_OBJECT_0)
+           {
+              printf ("CLOSE\n");
+              return EINA_FALSE;
+           }
+
+         /* WM_QUIT message */
+         PostMessage(window, WM_QUIT, 0, 0);
+         if (WaitForSingleObject(exe->process, ECORE_EXE_WIN32_TIMEOUT) == WAIT_OBJECT_0)
+           {
+              printf ("QUIT\n");
+              return EINA_FALSE;
+           }
+
+         /* Exit process */
+         if (CreateRemoteThread(exe->process, NULL, 0,
+                                (LPTHREAD_START_ROUTINE)ExitProcess, NULL,
+                                0, NULL))
+           {
+              printf ("remote thread 2\n");
+              return EINA_FALSE;
+           }
+
+         if (exe->sig == ECORE_EXE_WIN32_SIGTERM)
+           {
+              printf ("term\n");
+              return EINA_FALSE;
+           }
+
+         TerminateProcess(exe->process, 0);
+
+         return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+_ecore_exe_event_add_free(void *data __UNUSED__,
+                          void *ev)
+{
+   Ecore_Exe_Event_Add *e;
+
+   e = (Ecore_Exe_Event_Add *)ev;
+   free(e);
+}
+
+static void
+_ecore_exe_event_del_free(void *data __UNUSED__,
+                          void *ev)
+{
+   Ecore_Exe_Event_Del *e;
+
+   e = (Ecore_Exe_Event_Del *)ev;
+   if (e->exe)
+     ecore_exe_free(e->exe);
+   free(e);
+}
+
+static void
+_ecore_exe_event_exe_data_free(void *data __UNUSED__,
+                               void *ev)
+{
+   Ecore_Exe_Event_Data *e;
+
+   e = (Ecore_Exe_Event_Data *)ev;
+   ecore_exe_event_data_free(e);
+}
+
+static Eina_Bool
+_ecore_exe_close_cb(void                *data,
+                    Ecore_Win32_Handler *wh __UNUSED__)
+{
+   Ecore_Exe_Event_Del *e;
+   Ecore_Exe *exe;
+   DWORD exit_code = 0;
+
+   e = calloc(1, sizeof(Ecore_Exe_Event_Del));
+   if (!e) return 0;
+
+   exe = (Ecore_Exe *)data;
+
+   if (GetExitCodeProcess(exe->process2, &exit_code))
+     {
+        e->exit_code = exit_code;
+        e->exited = 1;
+     }
+   else
+     {
+        char *msg;
+
+        msg = evil_last_error_get();
+        printf("%s\n", msg);
+        free(msg);
+     }
+   e->pid = exe->process_id;
+   e->exe = exe;
+
+   ecore_event_add(ECORE_EXE_EVENT_DEL, e,
+                   _ecore_exe_event_del_free, NULL);
+
+   return 0;
+}
+
+static void
+_ecore_exe_pipe_read_cb(void        *data,
+                        void        *buf,
+                        unsigned int size)
+{
+   Ecore_Exe_Event_Data *e;
+
+   e = *((Ecore_Exe_Event_Data **)buf);
+   if (e)
+     ecore_event_add(ECORE_EXE_EVENT_DATA, e,
+                     _ecore_exe_event_exe_data_free,
+                     NULL);
+}
+
+static int
+_ecore_exe_pipe_write_cb(void                *data,
+                         Ecore_Win32_Handler *wh __UNUSED__)
+{
+   char buf[READBUFSIZ];
+   Ecore_Exe *exe;
+   DWORD num_exe;
+   BOOL res;
+
+   exe = (Ecore_Exe *)data;
+
+   res = WriteFile(exe->pipe_write.child_pipe_x, buf, READBUFSIZ, &num_exe, NULL);
+   if (!res || num_exe == 0)
+     {
+        /* FIXME: what to do here ?? */
+     }
+
+   if (exe->close_stdin == 1)
+     {
+        if (exe->pipe_write.h)
+          {
+             ecore_main_win32_handler_del(exe->pipe_write.h);
+             exe->pipe_write.h = NULL;
+          }
+        exe->pipe_write.h = NULL;
+        CloseHandle(exe->pipe_write.child_pipe);
+        exe->pipe_write.child_pipe = NULL;
+     }
+
+   return 1;
+}
+
+static void
+_ecore_exe_pipe_error_cb(void        *data,
+                         void        *buf,
+                         unsigned int size)
+{
+   Ecore_Exe_Event_Data *e;
+
+   e = *((Ecore_Exe_Event_Data **)buf);
+   if (e)
+     ecore_event_add(ECORE_EXE_EVENT_ERROR, e,
+                     _ecore_exe_event_exe_data_free,
+                     NULL);
+}
+
diff --git a/src/lib/ecore/ecore_exe_wince.c b/src/lib/ecore/ecore_exe_wince.c
new file mode 100644 (file)
index 0000000..c07fcbe
--- /dev/null
@@ -0,0 +1,21 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+void
+_ecore_exe_init(void)
+{
+}
+
+void
+_ecore_exe_shutdown(void)
+{
+}
+
diff --git a/src/lib/ecore/ecore_getopt.c b/src/lib/ecore/ecore_getopt.c
new file mode 100644 (file)
index 0000000..64f5f9c
--- /dev/null
@@ -0,0 +1,1927 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca(size_t);
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#ifdef ENABLE_NLS
+# include <libintl.h>
+#else
+# define gettext(x)          (x)
+# define dgettext(domain, x) (x)
+#endif
+
+#define _(x)                 dgettext("ecore", x)
+
+#ifdef _WIN32_WCE
+# include <Evil.h>
+#endif
+
+#ifdef HAVE_EXOTIC
+# include <Exotic.h>
+#endif
+
+#include "Ecore.h"
+#include "Ecore_Getopt.h"
+
+static const char *prog = NULL;
+static char **_argv = NULL;
+static int _argc = 0;
+static int cols = 80;
+static int helpcol = 80 / 3;
+
+static void
+_ecore_getopt_help_print_replace_program(FILE               *fp,
+                                         const Ecore_Getopt *parser __UNUSED__,
+                                         const char         *text)
+{
+   do
+     {
+        const char *d = strchr(text, '%');
+
+        if (!d)
+          {
+             fputs(text, fp);
+             break;
+          }
+
+        if (fwrite(text, 1, d - text, fp) != (size_t)(d - text))
+          return;
+        d++;
+        if (strncmp(d, "prog", sizeof("prog") - 1) == 0)
+          {
+             fputs(prog ? prog : "???", fp);
+             d += sizeof("prog") - 1;
+          }
+        else
+          {
+             if (d[0] == '%')
+               d++;
+             fputc('%', fp);
+          }
+
+        text = d;
+     }
+   while (text[0] != '\0');
+
+   fputc('\n', fp);
+}
+
+static void
+_ecore_getopt_version(FILE               *fp,
+                      const Ecore_Getopt *parser)
+{
+   fputs(_("Version:"), fp);
+   fputc(' ', fp);
+   _ecore_getopt_help_print_replace_program(fp, parser, parser->version);
+}
+
+static void
+_ecore_getopt_help_usage(FILE               *fp,
+                         const Ecore_Getopt *parser)
+{
+   fputs(_("Usage:"), fp);
+   fputc(' ', fp);
+
+   if (!parser->usage)
+     {
+        fprintf(fp, _("%s [options]\n"), prog);
+        return;
+     }
+
+   _ecore_getopt_help_print_replace_program(fp, parser, gettext(parser->usage));
+}
+
+static int
+_ecore_getopt_help_line(FILE       *fp,
+                        const int   base,
+                        const int   total,
+                        int         used,
+                        const char *text,
+                        int         len)
+{
+   int linebreak = 0;
+   do
+     {
+        /* process line considering spaces (new line and tabs are spaces!) */
+         while ((used < total) && (len > 0))
+           {
+              const char *space = NULL;
+              int i, todo;
+
+              todo = total - used;
+              if (todo > len)
+                todo = len;
+
+              for (i = 0; i < todo; i++)
+                if (isspace((unsigned char)text[i]))
+                  {
+                     space = text + i;
+                     break;
+                  }
+
+              if (space)
+                {
+                   i = fwrite(text, 1, i, fp);
+                   i++;
+                   text += i;
+                   len -= i;
+                   used += i;
+
+                   if (linebreak)
+                     {
+                        linebreak = 0;
+                        continue;
+                     }
+
+                   if (space[0] == '\n')
+                     break;
+                   else if (space[0] == '\t')
+                     {
+                        int c;
+
+                        used--;
+                        c = ((used / 8) + 1) * 8;
+                        if (c < total)
+                          {
+                             for (; used < c; used++)
+                               fputc(' ', fp);
+                          }
+                        else
+                          {
+                             text--;
+                             len++;
+                             break;
+                          }
+                     }
+                   else if (used < total)
+                     fputc(space[0], fp);
+                }
+              else
+                {
+                   i = fwrite(text, 1, i, fp);
+                   text += i;
+                   len -= i;
+                   used += i;
+                }
+              linebreak = 0;
+           }
+         if (len <= 0)
+           break;
+         linebreak = 1;
+         fputc('\n', fp);
+         for (used = 0; used < base; used++)
+           fputc(' ', fp);
+     }
+   while (1);
+
+   return used;
+}
+
+static void
+_ecore_getopt_help_description(FILE               *fp,
+                               const Ecore_Getopt *parser)
+{
+   const char *p, *prg, *ver;
+   int used, prglen, verlen;
+
+   p = gettext(parser->description);
+   if (!p)
+     return;
+
+   fputc('\n', fp);
+
+   prg = prog ? prog : "???";
+   ver = parser->version ? parser->version : "???";
+
+   prglen = strlen(prg);
+   verlen = strlen(ver);
+
+   used = 0;
+
+   do
+     {
+        const char *d = strchr(p, '%');
+
+        if (!d)
+          {
+             _ecore_getopt_help_line(fp, 0, cols, used, p, strlen(p));
+             break;
+          }
+
+        used = _ecore_getopt_help_line(fp, 0, cols, used, p, d - p);
+        d++;
+        if (strncmp(d, "prog", sizeof("prog") - 1) == 0)
+          {
+             used = _ecore_getopt_help_line(fp, 0, cols, used, prg, prglen);
+             d += sizeof("prog") - 1;
+          }
+        else if (strncmp(d, "version", sizeof("version") - 1) == 0)
+          {
+             used = _ecore_getopt_help_line(fp, 0, cols, used, ver, verlen);
+             d += sizeof("version") - 1;
+          }
+        else
+          {
+             if (d[0] == '%')
+               d++;
+             used = _ecore_getopt_help_line(fp, 0, cols, used, "%", 1);
+          }
+
+        p = d;
+     }
+   while (p[0] != '\0');
+
+   fputs("\n\n", fp);
+}
+
+static void
+_ecore_getopt_copyright(FILE               *fp,
+                        const Ecore_Getopt *parser)
+{
+   const char *txt = gettext(parser->copyright);
+   fputs(_("Copyright:"), fp);
+   fputs("\n   ", fp);
+   _ecore_getopt_help_line
+     (fp, 3, cols, 3, txt, strlen(txt));
+   fputc('\n', fp);
+}
+
+static void
+_ecore_getopt_license(FILE               *fp,
+                      const Ecore_Getopt *parser)
+{
+   const char *txt = gettext(parser->license);
+   fputs(_("License:"), fp);
+   fputs("\n   ", fp);
+   _ecore_getopt_help_line
+     (fp, 3, cols, 3, txt, strlen(txt));
+   fputc('\n', fp);
+}
+
+static Ecore_Getopt_Desc_Arg_Requirement
+_ecore_getopt_desc_arg_requirement(const Ecore_Getopt_Desc *desc)
+{
+   switch (desc->action)
+     {
+      case ECORE_GETOPT_ACTION_STORE:
+        return desc->action_param.store.arg_req;
+
+      case ECORE_GETOPT_ACTION_STORE_CONST:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
+
+      case ECORE_GETOPT_ACTION_STORE_TRUE:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
+
+      case ECORE_GETOPT_ACTION_STORE_FALSE:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
+
+      case ECORE_GETOPT_ACTION_CHOICE:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES;
+
+      case ECORE_GETOPT_ACTION_APPEND:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES;
+
+      case ECORE_GETOPT_ACTION_COUNT:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
+
+      case ECORE_GETOPT_ACTION_CALLBACK:
+        return desc->action_param.callback.arg_req;
+
+      case ECORE_GETOPT_ACTION_HELP:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
+
+      case ECORE_GETOPT_ACTION_VERSION:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
+
+      default:
+        return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
+     }
+}
+
+static void
+_ecore_getopt_help_desc_setup_metavar(const Ecore_Getopt_Desc *desc,
+                                      char                    *metavar,
+                                      int                     *metavarlen,
+                                      int                      maxsize)
+{
+   if (desc->metavar)
+     {
+        const char *txt = gettext(desc->metavar);
+        *metavarlen = strlen(txt);
+        if (*metavarlen > maxsize - 1)
+          *metavarlen = maxsize - 1;
+
+        memcpy(metavar, txt, *metavarlen);
+        metavar[*metavarlen] = '\0';
+     }
+   else if (desc->longname)
+     {
+        int i;
+
+        *metavarlen = strlen(desc->longname);
+        if (*metavarlen > maxsize - 1)
+          *metavarlen = maxsize - 1;
+
+        for (i = 0; i < *metavarlen; i++)
+          metavar[i] = toupper((int) desc->longname[i]);
+        metavar[i] = '\0';
+     }
+}
+
+static int
+_ecore_getopt_help_desc_show_arg(FILE                             *fp,
+                                 Ecore_Getopt_Desc_Arg_Requirement requirement,
+                                 const char                       *metavar,
+                                 int                               metavarlen)
+{
+   int used;
+
+   if (requirement == ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
+     return 0;
+
+   used = 0;
+
+   if (requirement == ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL)
+     {
+        fputc('[', fp);
+        used++;
+     }
+
+   if (requirement != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
+     {
+        fputc('=', fp);
+        fputs(metavar, fp);
+        used += metavarlen + 1;
+     }
+
+   if (requirement == ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL)
+     {
+        fputc(']', fp);
+        used++;
+     }
+
+   return used;
+}
+
+static int
+_ecore_getopt_help_desc_store(FILE                    *fp,
+                              const int                base,
+                              const int                total,
+                              int                      used,
+                              const Ecore_Getopt_Desc *desc)
+{
+   const Ecore_Getopt_Desc_Store *store = &desc->action_param.store;
+   char buf[64];
+   const char *str;
+   size_t len;
+
+   fputc('\n', fp);
+   for (used = 0; used < base; used++)
+     fputc(' ', fp);
+
+   switch (store->type)
+     {
+      case ECORE_GETOPT_TYPE_STR:
+        str = "STR";
+        len = sizeof("STR") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_BOOL:
+        str = "BOOL";
+        len = sizeof("BOOL") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_SHORT:
+        str = "SHORT";
+        len = sizeof("SHORT") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_INT:
+        str = "INT";
+        len = sizeof("INT") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_LONG:
+        str = "LONG";
+        len = sizeof("LONG") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_USHORT:
+        str = "USHORT";
+        len = sizeof("USHORT") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_UINT:
+        str = "UINT";
+        len = sizeof("UINT") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_ULONG:
+        str = "ULONG";
+        len = sizeof("ULONG") - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_DOUBLE:
+        str = "DOUBLE";
+        len = sizeof("DOUBLE") - 1;
+        break;
+
+      default:
+        str = "???";
+        len = sizeof("???") - 1;
+     }
+
+   used = _ecore_getopt_help_line
+       (fp, base, total, used, _("Type: "), strlen(_("Type: ")));
+   used = _ecore_getopt_help_line(fp, base, total, used, str, len);
+
+   if (store->arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES)
+     goto end;
+
+   used = _ecore_getopt_help_line
+       (fp, base, total, used, ". ", sizeof(". ") - 1);
+
+   switch (store->type)
+     {
+      case ECORE_GETOPT_TYPE_STR:
+        str = store->def.strv;
+        len = str ? strlen(str) : 0;
+        break;
+
+      case ECORE_GETOPT_TYPE_BOOL:
+        str = store->def.boolv ? "true" : "false";
+        len = strlen(str);
+        break;
+
+      case ECORE_GETOPT_TYPE_SHORT:
+        str = buf;
+        len = snprintf(buf, sizeof(buf), "%hd", store->def.shortv);
+        if (len > sizeof(buf) - 1)
+          len = sizeof(buf) - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_INT:
+        str = buf;
+        len = snprintf(buf, sizeof(buf), "%d", store->def.intv);
+        if (len > sizeof(buf) - 1)
+          len = sizeof(buf) - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_LONG:
+        str = buf;
+        len = snprintf(buf, sizeof(buf), "%ld", store->def.longv);
+        if (len > sizeof(buf) - 1)
+          len = sizeof(buf) - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_USHORT:
+        str = buf;
+        len = snprintf(buf, sizeof(buf), "%hu", store->def.ushortv);
+        if (len > sizeof(buf) - 1)
+          len = sizeof(buf) - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_UINT:
+        str = buf;
+        len = snprintf(buf, sizeof(buf), "%u", store->def.uintv);
+        if (len > sizeof(buf) - 1)
+          len = sizeof(buf) - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_ULONG:
+        str = buf;
+        len = snprintf(buf, sizeof(buf), "%lu", store->def.ulongv);
+        if (len > sizeof(buf) - 1)
+          len = sizeof(buf) - 1;
+        break;
+
+      case ECORE_GETOPT_TYPE_DOUBLE:
+        str = buf;
+        len = snprintf(buf, sizeof(buf), "%f", store->def.doublev);
+        if (len > sizeof(buf) - 1)
+          len = sizeof(buf) - 1;
+        break;
+
+      default:
+        str = "???";
+        len = sizeof("???") - 1;
+     }
+
+   used = _ecore_getopt_help_line
+       (fp, base, total, used, _("Default: "), strlen(_("Default: ")));
+   used = _ecore_getopt_help_line(fp, base, total, used, str, len);
+
+end:
+   return _ecore_getopt_help_line(fp, base, total, used, ".", 1);
+}
+
+static int
+_ecore_getopt_help_desc_choices(FILE                    *fp,
+                                const int                base,
+                                const int                total,
+                                int                      used,
+                                const Ecore_Getopt_Desc *desc)
+{
+   const char *const *itr;
+   const char sep[] = ", ";
+   const int seplen = sizeof(sep) - 1;
+
+   if (used > 0)
+     {
+        fputc('\n', fp);
+        used = 0;
+     }
+   for (; used < base; used++)
+     fputc(' ', fp);
+
+   used = _ecore_getopt_help_line
+       (fp, base, total, used, _("Choices: "), strlen(_("Choices: ")));
+
+   for (itr = desc->action_param.choices; *itr; itr++)
+     {
+        used = _ecore_getopt_help_line
+            (fp, base, total, used, *itr, strlen(*itr));
+        if (itr[1])
+          used = _ecore_getopt_help_line(fp, base, total, used, sep, seplen);
+     }
+
+   return _ecore_getopt_help_line(fp, base, total, used, ".", 1);
+}
+
+static void
+_ecore_getopt_help_desc(FILE                    *fp,
+                        const Ecore_Getopt_Desc *desc)
+{
+   Ecore_Getopt_Desc_Arg_Requirement arg_req;
+   char metavar[32] = "ARG";
+   int metavarlen = 3;
+   int used;
+
+   arg_req = _ecore_getopt_desc_arg_requirement(desc);
+   if (arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
+     _ecore_getopt_help_desc_setup_metavar
+       (desc, metavar, &metavarlen, sizeof(metavar));
+
+   fputs("  ", fp);
+   used = 2;
+
+   if (desc->shortname)
+     {
+        fputc('-', fp);
+        fputc(desc->shortname, fp);
+        used += 2;
+        used += _ecore_getopt_help_desc_show_arg
+            (fp, arg_req, metavar, metavarlen);
+     }
+
+   if (desc->shortname && desc->longname)
+     {
+        fputs(", ", fp);
+        used += 2;
+     }
+
+   if (desc->longname)
+     {
+        int namelen = strlen(desc->longname);
+
+        fputs("--", fp);
+        fputs(desc->longname, fp);
+        used += 2 + namelen;
+        used += _ecore_getopt_help_desc_show_arg
+            (fp, arg_req, metavar, metavarlen);
+     }
+
+   if (!desc->help)
+     goto end;
+
+   if (used + 3 >= helpcol)
+     {
+        fputc('\n', fp);
+        used = 0;
+     }
+
+   for (; used < helpcol; used++)
+     fputc(' ', fp);
+
+   used = _ecore_getopt_help_line
+       (fp, helpcol, cols, used, desc->help, strlen(desc->help));
+
+   switch (desc->action)
+     {
+      case ECORE_GETOPT_ACTION_STORE:
+        _ecore_getopt_help_desc_store(fp, helpcol, cols, used, desc);
+        break;
+
+      case ECORE_GETOPT_ACTION_CHOICE:
+        _ecore_getopt_help_desc_choices(fp, helpcol, cols, used, desc);
+        break;
+
+      default:
+        break;
+     }
+
+end:
+   fputc('\n', fp);
+}
+
+static Eina_Bool
+_ecore_getopt_desc_is_sentinel(const Ecore_Getopt_Desc *desc)
+{
+   return (desc->shortname == '\0') && (!desc->longname);
+}
+
+static void
+_ecore_getopt_help_options(FILE               *fp,
+                           const Ecore_Getopt *parser)
+{
+   const Ecore_Getopt_Desc *desc;
+
+   fputs(_("Options:\n"), fp);
+
+   for (desc = parser->descs; !_ecore_getopt_desc_is_sentinel(desc); desc++)
+     _ecore_getopt_help_desc(fp, desc);
+
+   fputc('\n', fp);
+}
+
+/**
+ * Show nicely formatted help message for the given parser.
+ *
+ * @param fp The file the message will be printed on.
+ * @param parser The parser to be used.
+ */
+EAPI void
+ecore_getopt_help(FILE               *fp,
+                  const Ecore_Getopt *parser)
+{
+   const char *var;
+
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   if (!parser) return;
+
+   if (_argc < 1)
+     {
+        ecore_app_args_get(&_argc, &_argv);
+        if ((_argc > 0) && (_argv[0]))
+          prog = _argv[0];
+        else
+          prog = parser->prog;
+     }
+
+   var = getenv("COLUMNS");
+   if (var)
+     {
+        cols = atoi(var);
+        if (cols < 20)
+          cols = 20;
+
+        helpcol = cols / 3;
+     }
+
+   _ecore_getopt_help_usage(fp, parser);
+   _ecore_getopt_help_description(fp, parser);
+   _ecore_getopt_help_options(fp, parser);
+}
+
+static const Ecore_Getopt_Desc *
+_ecore_getopt_parse_find_long(const Ecore_Getopt *parser,
+                              const char         *name)
+{
+   const Ecore_Getopt_Desc *desc = parser->descs;
+   const char *p = strchr(name, '=');
+   int len = 0;
+
+   if (p)
+     len = p - name;
+
+   for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
+     {
+        if (!desc->longname)
+          continue;
+
+        if (p)
+          {
+             if ((strncmp(name, desc->longname, len) == 0) &&
+                 (desc->longname[len] == '\0'))
+               return desc;
+          }
+        else
+          {
+             if (strcmp(name, desc->longname) == 0)
+               return desc;
+          }
+     }
+
+   return NULL;
+}
+
+static const Ecore_Getopt_Desc *
+_ecore_getopt_parse_find_short(const Ecore_Getopt *parser,
+                               char                name)
+{
+   const Ecore_Getopt_Desc *desc = parser->descs;
+   for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
+     if (name == desc->shortname)
+       return desc;
+   return NULL;
+}
+
+static int
+_ecore_getopt_parse_find_nonargs_base(const Ecore_Getopt *parser,
+                                      int                 argc,
+                                      char              **argv)
+{
+   char **nonargs;
+   int src, dst, used, base;
+
+   nonargs = alloca(sizeof(char *) * argc);
+   src = 1;
+   dst = 1;
+   used = 0;
+   base = 0;
+   while (src < argc)
+     {
+        const Ecore_Getopt_Desc *desc;
+        Ecore_Getopt_Desc_Arg_Requirement arg_req;
+        char *arg = argv[src];
+
+        if (arg[0] != '-')
+          goto found_nonarg;
+
+        if (arg[1] == '-')
+          {
+             if (arg[2] == '\0') /* explicit end of options, "--" */
+               {
+                  base = 1;
+                  break;
+               }
+             desc = _ecore_getopt_parse_find_long(parser, arg + 2);
+          }
+        else
+          desc = _ecore_getopt_parse_find_short(parser, arg[1]);
+
+        if (!desc)
+          {
+             if (arg[1] == '-')
+               fprintf(stderr, _("ERROR: unknown option --%s.\n"), arg + 2);
+             else
+               fprintf(stderr, _("ERROR: unknown option -%c.\n"), arg[1]);
+             if (parser->strict)
+               {
+                  memmove(argv + dst, nonargs, used * sizeof(char *));
+                  return -1;
+               }
+             else
+               goto found_nonarg;
+          }
+
+        if (src != dst)
+          argv[dst] = argv[src];
+        src++;
+        dst++;
+
+        arg_req = _ecore_getopt_desc_arg_requirement(desc);
+        if (arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
+          continue;
+
+        if (strchr(arg, '='))
+          continue;
+
+        if ((src >= argc) || (argv[src][0] == '-'))
+          continue;
+
+        if (src != dst)
+          argv[dst] = argv[src];
+        src++;
+        dst++;
+        continue;
+
+found_nonarg:
+        nonargs[used] = arg;
+        used++;
+        src++;
+     }
+
+   if (!base) /* '--' not found */
+     base = dst;
+   else
+     {
+        base = dst;
+        if (src != dst)
+          argv[dst] = argv[src];
+        dst++;
+     }
+
+   memmove(argv + dst, nonargs, used * sizeof(char *));
+   return base;
+}
+
+static void
+_ecore_getopt_desc_print_error(const Ecore_Getopt_Desc *desc,
+                               const char              *fmt,
+                               ...)
+{
+   va_list ap;
+
+   fputs(_("ERROR: "), stderr);
+
+   if (desc->shortname)
+     {
+        fputc('-', stderr);
+        fputc(desc->shortname, stderr);
+     }
+
+   if (desc->shortname && desc->longname)
+     fputs(", ", stderr);
+
+   if (desc->longname)
+     {
+        fputs("--", stderr);
+        fputs(desc->longname, stderr);
+     }
+
+   fputs(": ", stderr);
+
+   va_start(ap, fmt);
+   vfprintf(stderr, fmt, ap);
+   va_end(ap);
+}
+
+static Eina_Bool
+_ecore_getopt_parse_bool(const char *str,
+                         Eina_Bool  *v)
+{
+   if ((strcmp(str, "0") == 0) ||
+       (strcasecmp(str, "f") == 0) ||
+       (strcasecmp(str, "false") == 0) ||
+       (strcasecmp(str, "no") == 0) ||
+       (strcasecmp(str, "off") == 0)
+       )
+     {
+        *v = EINA_FALSE;
+        return EINA_TRUE;
+     }
+   else if ((strcmp(str, "1") == 0) ||
+            (strcasecmp(str, "t") == 0) ||
+            (strcasecmp(str, "true") == 0) ||
+            (strcasecmp(str, "yes") == 0) ||
+            (strcasecmp(str, "on") == 0)
+            )
+     {
+        *v = EINA_TRUE;
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_long(const char *str,
+                         long int   *v)
+{
+   char *endptr = NULL;
+   *v = strtol(str, &endptr, 0);
+   return endptr > str;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_double(const char *str,
+                           double     *v)
+{
+   char *endptr = NULL;
+   *v = strtod(str, &endptr);
+   return endptr > str;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_store(const Ecore_Getopt      *parser __UNUSED__,
+                          const Ecore_Getopt_Desc *desc,
+                          Ecore_Getopt_Value      *value,
+                          const char              *arg_val)
+{
+   const Ecore_Getopt_Desc_Store *store = &desc->action_param.store;
+   long int v;
+   double d;
+   Eina_Bool b;
+
+   if (!value->ptrp)
+     {
+        _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+        return EINA_FALSE;
+     }
+
+   switch (store->arg_req)
+     {
+      case ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO:
+        goto use_optional;
+
+      case ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL:
+        if (!arg_val)
+          goto use_optional;
+
+      case ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES:
+        break;
+     }
+
+   switch (store->type)
+     {
+      case ECORE_GETOPT_TYPE_STR:
+        *value->strp = (char *)arg_val;
+        return EINA_TRUE;
+
+      case ECORE_GETOPT_TYPE_BOOL:
+        if (_ecore_getopt_parse_bool(arg_val, &b))
+          {
+             *value->boolp = b;
+             return EINA_TRUE;
+          }
+        else
+          {
+             _ecore_getopt_desc_print_error
+               (desc, _("unknown boolean value %s.\n"), arg_val);
+             return EINA_FALSE;
+          }
+
+      case ECORE_GETOPT_TYPE_SHORT:
+        if (!_ecore_getopt_parse_long(arg_val, &v))
+          goto error;
+        *value->shortp = v;
+        return EINA_TRUE;
+
+      case ECORE_GETOPT_TYPE_INT:
+        if (!_ecore_getopt_parse_long(arg_val, &v))
+          goto error;
+        *value->intp = v;
+        return EINA_TRUE;
+
+      case ECORE_GETOPT_TYPE_LONG:
+        if (!_ecore_getopt_parse_long(arg_val, &v))
+          goto error;
+        *value->longp = v;
+        return EINA_TRUE;
+
+      case ECORE_GETOPT_TYPE_USHORT:
+        if (!_ecore_getopt_parse_long(arg_val, &v))
+          goto error;
+        *value->ushortp = v;
+        return EINA_TRUE;
+
+      case ECORE_GETOPT_TYPE_UINT:
+        if (!_ecore_getopt_parse_long(arg_val, &v))
+          goto error;
+        *value->uintp = v;
+        return EINA_TRUE;
+
+      case ECORE_GETOPT_TYPE_ULONG:
+        if (!_ecore_getopt_parse_long(arg_val, &v))
+          goto error;
+        *value->ulongp = v;
+        return EINA_TRUE;
+
+      case ECORE_GETOPT_TYPE_DOUBLE:
+        if (!_ecore_getopt_parse_double(arg_val, &d))
+          goto error;
+        *value->doublep = d;
+        break;
+     }
+
+   return EINA_TRUE;
+
+error:
+   _ecore_getopt_desc_print_error
+     (desc, _("invalid number format %s\n"), arg_val);
+   return EINA_FALSE;
+
+use_optional:
+   switch (store->type)
+     {
+      case ECORE_GETOPT_TYPE_STR:
+        *value->strp = (char *)store->def.strv;
+        break;
+
+      case ECORE_GETOPT_TYPE_BOOL:
+        *value->boolp = store->def.boolv;
+        break;
+
+      case ECORE_GETOPT_TYPE_SHORT:
+        *value->shortp = store->def.shortv;
+        break;
+
+      case ECORE_GETOPT_TYPE_INT:
+        *value->intp = store->def.intv;
+        break;
+
+      case ECORE_GETOPT_TYPE_LONG:
+        *value->longp = store->def.longv;
+        break;
+
+      case ECORE_GETOPT_TYPE_USHORT:
+        *value->ushortp = store->def.ushortv;
+        break;
+
+      case ECORE_GETOPT_TYPE_UINT:
+        *value->uintp = store->def.uintv;
+        break;
+
+      case ECORE_GETOPT_TYPE_ULONG:
+        *value->ulongp = store->def.ulongv;
+        break;
+
+      case ECORE_GETOPT_TYPE_DOUBLE:
+        *value->doublep = store->def.doublev;
+        break;
+     }
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_store_const(const Ecore_Getopt      *parser __UNUSED__,
+                                const Ecore_Getopt_Desc *desc,
+                                Ecore_Getopt_Value      *val,
+                                const char              *arg_val __UNUSED__)
+{
+   if (!val->ptrp)
+     {
+        _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+        return EINA_FALSE;
+     }
+
+   *val->ptrp = (void *)desc->action_param.store_const;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_store_true(const Ecore_Getopt      *parser __UNUSED__,
+                               const Ecore_Getopt_Desc *desc,
+                               Ecore_Getopt_Value      *val,
+                               const char              *arg_val __UNUSED__)
+{
+   if (!val->boolp)
+     {
+        _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+        return EINA_FALSE;
+     }
+   *val->boolp = EINA_TRUE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_store_false(const Ecore_Getopt      *parser __UNUSED__,
+                                const Ecore_Getopt_Desc *desc,
+                                Ecore_Getopt_Value      *val,
+                                const char              *arg_val __UNUSED__)
+{
+   if (!val->boolp)
+     {
+        _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+        return EINA_FALSE;
+     }
+   *val->boolp = EINA_FALSE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_choice(const Ecore_Getopt      *parser __UNUSED__,
+                           const Ecore_Getopt_Desc *desc,
+                           Ecore_Getopt_Value      *val,
+                           const char              *arg_val)
+{
+   const char *const *pchoice;
+
+   if (!val->strp)
+     {
+        _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+        return EINA_FALSE;
+     }
+
+   pchoice = desc->action_param.choices;
+   for (; *pchoice; pchoice++)
+     if (strcmp(*pchoice, arg_val) == 0)
+       {
+          *val->strp = (char *)*pchoice;
+          return EINA_TRUE;
+       }
+
+   _ecore_getopt_desc_print_error
+     (desc, _("invalid choice \"%s\". Valid values are: "), arg_val);
+
+   pchoice = desc->action_param.choices;
+   for (; *pchoice; pchoice++)
+     {
+        fputs(*pchoice, stderr);
+        if (pchoice[1])
+          fputs(", ", stderr);
+     }
+
+   fputs(".\n", stderr);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_append(const Ecore_Getopt      *parser __UNUSED__,
+                           const Ecore_Getopt_Desc *desc,
+                           Ecore_Getopt_Value      *val,
+                           const char              *arg_val)
+{
+   void *data;
+   long int v;
+   double d;
+   Eina_Bool b;
+
+   if (!arg_val)
+     {
+        _ecore_getopt_desc_print_error
+          (desc, _("missing parameter to append.\n"));
+        return EINA_FALSE;
+     }
+
+   if (!val->listp)
+     {
+        _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+        return EINA_FALSE;
+     }
+
+   switch (desc->action_param.append_type)
+     {
+      case ECORE_GETOPT_TYPE_STR:
+        data = strdup(arg_val);
+        break;
+
+      case ECORE_GETOPT_TYPE_BOOL:
+      {
+         if (_ecore_getopt_parse_bool(arg_val, &b))
+           {
+              data = malloc(sizeof(Eina_Bool));
+              if (data)
+                *(Eina_Bool *)data = b;
+           }
+         else
+           {
+              _ecore_getopt_desc_print_error(desc, _("unknown boolean value %s.\n"), arg_val);
+              return EINA_FALSE;
+           }
+      }
+      break;
+
+      case ECORE_GETOPT_TYPE_SHORT:
+      {
+         if (!_ecore_getopt_parse_long(arg_val, &v))
+           goto error;
+         data = malloc(sizeof(short));
+         if (data)
+           *(short *)data = (short)v;
+      }
+      break;
+
+      case ECORE_GETOPT_TYPE_INT:
+      {
+         if (!_ecore_getopt_parse_long(arg_val, &v))
+           goto error;
+         data = malloc(sizeof(int));
+         if (data)
+           *(int *)data = (int)v;
+      }
+      break;
+
+      case ECORE_GETOPT_TYPE_LONG:
+      {
+         if (!_ecore_getopt_parse_long(arg_val, &v))
+           goto error;
+         data = malloc(sizeof(long));
+         if (data)
+           *(long *)data = v;
+      }
+      break;
+
+      case ECORE_GETOPT_TYPE_USHORT:
+      {
+         if (!_ecore_getopt_parse_long(arg_val, &v))
+           goto error;
+         data = malloc(sizeof(unsigned short));
+         if (data)
+           *(unsigned short *)data = (unsigned short)v;
+      }
+      break;
+
+      case ECORE_GETOPT_TYPE_UINT:
+      {
+         if (!_ecore_getopt_parse_long(arg_val, &v))
+           goto error;
+         data = malloc(sizeof(unsigned int));
+         if (data)
+           *(unsigned int *)data = (unsigned int)v;
+      }
+      break;
+
+      case ECORE_GETOPT_TYPE_ULONG:
+      {
+         if (!_ecore_getopt_parse_long(arg_val, &v))
+           goto error;
+         data = malloc(sizeof(unsigned long));
+         if (data)
+           *(unsigned long *)data = v;
+      }
+      break;
+
+      case ECORE_GETOPT_TYPE_DOUBLE:
+      {
+         if (!_ecore_getopt_parse_double(arg_val, &d))
+           goto error;
+         data = malloc(sizeof(double));
+         if (data)
+           *(double *)data = d;
+      }
+      break;
+
+      default:
+      {
+         _ecore_getopt_desc_print_error(desc, _("could not parse value.\n"));
+         return EINA_FALSE;
+      }
+     }
+
+   *val->listp = eina_list_append(*val->listp, data);
+   return EINA_TRUE;
+
+error:
+   _ecore_getopt_desc_print_error
+     (desc, _("invalid number format %s\n"), arg_val);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_count(const Ecore_Getopt      *parser __UNUSED__,
+                          const Ecore_Getopt_Desc *desc,
+                          Ecore_Getopt_Value      *val,
+                          const char              *arg_val __UNUSED__)
+{
+   if (!val->intp)
+     {
+        _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+        return EINA_FALSE;
+     }
+
+   (*val->intp)++;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_callback(const Ecore_Getopt      *parser,
+                             const Ecore_Getopt_Desc *desc,
+                             Ecore_Getopt_Value      *val,
+                             const char              *arg_val)
+{
+   const Ecore_Getopt_Desc_Callback *cb = &desc->action_param.callback;
+
+   switch (cb->arg_req)
+     {
+      case ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO:
+        arg_val = cb->def;
+        break;
+
+      case ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL:
+        if (!arg_val)
+          arg_val = cb->def;
+        break;
+
+      case ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES:
+        break;
+     }
+
+   if (cb->arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
+     {
+        if ((!arg_val) || (arg_val[0] == '\0'))
+          {
+             _ecore_getopt_desc_print_error(desc, _("missing parameter.\n"));
+             return EINA_FALSE;
+          }
+
+        if (!val->ptrp)
+          {
+             _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
+             return EINA_FALSE;
+          }
+     }
+
+   if (!cb->func)
+     {
+        _ecore_getopt_desc_print_error(desc, _("missing callback function!\n"));
+        return EINA_FALSE;
+     }
+
+   return cb->func(parser, desc, arg_val, (void *)cb->data, val);
+}
+
+static Eina_Bool
+_ecore_getopt_parse_help(const Ecore_Getopt      *parser,
+                         const Ecore_Getopt_Desc *desc __UNUSED__,
+                         Ecore_Getopt_Value      *val,
+                         const char              *arg_val __UNUSED__)
+{
+   if (val->boolp)
+     (*val->boolp) = EINA_TRUE;
+   ecore_getopt_help(stdout, parser);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_version(const Ecore_Getopt      *parser,
+                            const Ecore_Getopt_Desc *desc,
+                            Ecore_Getopt_Value      *val,
+                            const char              *arg_val __UNUSED__)
+{
+   if (val->boolp)
+     (*val->boolp) = EINA_TRUE;
+   if (!parser->version)
+     {
+        _ecore_getopt_desc_print_error(desc, _("no version was defined.\n"));
+        return EINA_FALSE;
+     }
+   _ecore_getopt_version(stdout, parser);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_copyright(const Ecore_Getopt      *parser,
+                              const Ecore_Getopt_Desc *desc,
+                              Ecore_Getopt_Value      *val,
+                              const char              *arg_val __UNUSED__)
+{
+   if (val->boolp)
+     (*val->boolp) = EINA_TRUE;
+   if (!parser->copyright)
+     {
+        _ecore_getopt_desc_print_error(desc, _("no copyright was defined.\n"));
+        return EINA_FALSE;
+     }
+   _ecore_getopt_copyright(stdout, parser);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_license(const Ecore_Getopt      *parser,
+                            const Ecore_Getopt_Desc *desc,
+                            Ecore_Getopt_Value      *val,
+                            const char              *arg_val __UNUSED__)
+{
+   if (val->boolp)
+     (*val->boolp) = EINA_TRUE;
+   if (!parser->license)
+     {
+        _ecore_getopt_desc_print_error(desc, _("no license was defined.\n"));
+        return EINA_FALSE;
+     }
+   _ecore_getopt_license(stdout, parser);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_desc_handle(const Ecore_Getopt      *parser,
+                          const Ecore_Getopt_Desc *desc,
+                          Ecore_Getopt_Value      *value,
+                          const char              *arg_val)
+{
+   switch (desc->action)
+     {
+      case ECORE_GETOPT_ACTION_STORE:
+        return _ecore_getopt_parse_store(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_STORE_CONST:
+        return _ecore_getopt_parse_store_const(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_STORE_TRUE:
+        return _ecore_getopt_parse_store_true(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_STORE_FALSE:
+        return _ecore_getopt_parse_store_false(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_CHOICE:
+        return _ecore_getopt_parse_choice(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_APPEND:
+        return _ecore_getopt_parse_append(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_COUNT:
+        return _ecore_getopt_parse_count(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_CALLBACK:
+        return _ecore_getopt_parse_callback(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_HELP:
+        return _ecore_getopt_parse_help(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_VERSION:
+        return _ecore_getopt_parse_version(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_COPYRIGHT:
+        return _ecore_getopt_parse_copyright(parser, desc, value, arg_val);
+
+      case ECORE_GETOPT_ACTION_LICENSE:
+        return _ecore_getopt_parse_license(parser, desc, value, arg_val);
+
+      default:
+        return EINA_FALSE;
+     }
+}
+
+static Eina_Bool
+_ecore_getopt_parse_arg_long(const Ecore_Getopt *parser,
+                             Ecore_Getopt_Value *values,
+                             int                 argc __UNUSED__,
+                             char              **argv,
+                             int                *idx,
+                             int                *nonargs,
+                             const char         *arg)
+{
+   const Ecore_Getopt_Desc *desc;
+   Ecore_Getopt_Desc_Arg_Requirement arg_req;
+   const char *arg_val;
+   int desc_idx;
+   Ecore_Getopt_Value *value;
+   Eina_Bool ret;
+
+   desc = _ecore_getopt_parse_find_long(parser, arg);
+   if (!desc)
+     {
+        fprintf(stderr, _("ERROR: unknown option --%s, ignored.\n"), arg);
+        if (parser->strict)
+          return EINA_FALSE;
+
+        (*idx)++;
+        return EINA_TRUE;
+     }
+
+   (*idx)++;
+
+   arg_req = _ecore_getopt_desc_arg_requirement(desc);
+   if (arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
+     {
+        arg_val = strchr(arg, '=');
+        if (arg_val)
+          arg_val++;
+        else
+          {
+             if ((*idx < *nonargs) && (argv[*idx][0] != '-'))
+               {
+                  arg_val = argv[*idx];
+                  (*idx)++;
+               }
+             else
+               arg_val = NULL;
+          }
+
+        if (arg_val && arg_val[0] == '\0')
+          arg_val = NULL;
+
+        if ((!arg_val) && (arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES))
+          {
+             fprintf
+               (stderr, _("ERROR: option --%s requires an argument!\n"), arg);
+             if (parser->strict)
+               return EINA_FALSE;
+             return EINA_TRUE;
+          }
+     }
+   else
+     arg_val = NULL;
+
+   desc_idx = desc - parser->descs;
+   value = values + desc_idx;
+   ret = _ecore_getopt_desc_handle(parser, desc, value, arg_val);
+   if ((!ret) && parser->strict)
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_arg_short(const Ecore_Getopt *parser,
+                              Ecore_Getopt_Value *values,
+                              int                 argc __UNUSED__,
+                              char              **argv,
+                              int                *idx,
+                              int                *nonargs,
+                              const char         *arg)
+{
+   int run = 1;
+   while (run && (arg[0] != '\0'))
+     {
+        int opt = arg[0];
+        const Ecore_Getopt_Desc *desc;
+        Ecore_Getopt_Desc_Arg_Requirement arg_req;
+        const char *arg_val;
+        int desc_idx;
+        Ecore_Getopt_Value *value;
+        Eina_Bool ret;
+
+        desc = _ecore_getopt_parse_find_short(parser, arg[0]);
+        if (!desc)
+          {
+             fprintf
+               (stderr, _("ERROR: unknown option -%c, ignored.\n"), arg[0]);
+             if (parser->strict)
+               return EINA_FALSE;
+
+             arg++;
+             continue;
+          }
+
+        arg++;
+
+        arg_req = _ecore_getopt_desc_arg_requirement(desc);
+        if (arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
+          {
+             (*idx)++;
+             run = 0;
+
+             if (arg[0] == '=')
+               arg_val = arg + 1;
+             else if (arg[0] != '\0')
+               arg_val = arg;
+             else
+               {
+                  if ((*idx < *nonargs) && (argv[*idx][0] != '-'))
+                    {
+                       arg_val = argv[*idx];
+                       (*idx)++;
+                    }
+                  else
+                    arg_val = NULL;
+               }
+
+             if (arg_val && arg_val[0] == '\0')
+               arg_val = NULL;
+
+             if ((!arg_val) &&
+                 (arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES))
+               {
+                  fprintf
+                    (stderr, _("ERROR: option -%c requires an argument!\n"),
+                    opt);
+                  if (parser->strict)
+                    return EINA_FALSE;
+                  return EINA_TRUE;
+               }
+          }
+        else
+          arg_val = NULL;
+
+        desc_idx = desc - parser->descs;
+        value = values + desc_idx;
+        ret = _ecore_getopt_desc_handle(parser, desc, value, arg_val);
+        if ((!ret) && parser->strict)
+          return EINA_FALSE;
+     }
+
+   if (run)
+     (*idx)++;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_getopt_parse_arg(const Ecore_Getopt *parser,
+                        Ecore_Getopt_Value *values,
+                        int                 argc,
+                        char              **argv,
+                        int                *idx,
+                        int                *nonargs)
+{
+   char *arg = argv[*idx];
+
+   if (arg[0] != '-')
+     {
+        char **dst, **src, **src_end;
+
+        dst = argv + *idx;
+        src = dst + 1;
+        src_end = src + *nonargs - *idx - 1;
+
+        for (; src < src_end; src++, dst++)
+          *dst = *src;
+
+        *dst = arg;
+        (*nonargs)--;
+        return EINA_TRUE;
+     }
+
+   if (arg[1] == '-')
+     return _ecore_getopt_parse_arg_long(parser, values, argc, argv, idx, nonargs, arg + 2);
+   else
+     return _ecore_getopt_parse_arg_short(parser, values, argc, argv, idx, nonargs, arg + 1);
+}
+
+static const Ecore_Getopt_Desc *
+_ecore_getopt_parse_find_short_other(const Ecore_Getopt      *parser,
+                                     const Ecore_Getopt_Desc *orig)
+{
+   const Ecore_Getopt_Desc *desc = parser->descs;
+   const char c = orig->shortname;
+
+   for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
+     {
+        if (desc == orig)
+          return NULL;
+
+        if (c == desc->shortname)
+          return desc;
+     }
+
+   return NULL;
+}
+
+static const Ecore_Getopt_Desc *
+_ecore_getopt_parse_find_long_other(const Ecore_Getopt      *parser,
+                                    const Ecore_Getopt_Desc *orig)
+{
+   const Ecore_Getopt_Desc *desc = parser->descs;
+   const char *name = orig->longname;
+
+   for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
+     {
+        if (desc == orig)
+          return NULL;
+
+        if (desc->longname && (strcmp(name, desc->longname) == 0))
+          return desc;
+     }
+
+   return NULL;
+}
+
+/**
+ * Check parser for duplicate entries, print them out.
+ *
+ * @return @c EINA_TRUE if there are duplicates, @c EINA_FALSE otherwise.
+ * @param parser The parser to be checked.
+ */
+EAPI Eina_Bool
+ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser)
+{
+   const Ecore_Getopt_Desc *desc = parser->descs;
+   for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
+     {
+        if (desc->shortname)
+          {
+             const Ecore_Getopt_Desc *other;
+             other = _ecore_getopt_parse_find_short_other(parser, desc);
+             if (other)
+               {
+                  _ecore_getopt_desc_print_error(desc, "short name -%c already exists.", desc->shortname);
+
+                  if (other->longname)
+                    fprintf(stderr, " Other is --%s.\n", other->longname);
+                  else
+                    fputc('\n', stderr);
+                  return EINA_TRUE;
+               }
+          }
+
+        if (desc->longname)
+          {
+             const Ecore_Getopt_Desc *other;
+             other = _ecore_getopt_parse_find_long_other(parser, desc);
+             if (other)
+               {
+                  _ecore_getopt_desc_print_error(desc, "long name --%s already exists.", desc->longname);
+
+                  if (other->shortname)
+                    fprintf(stderr, " Other is -%c.\n", other->shortname);
+                  else
+                    fputc('\n', stderr);
+                  return EINA_TRUE;
+               }
+          }
+     }
+   return EINA_FALSE;
+}
+
+static const Ecore_Getopt_Desc *
+_ecore_getopt_find_help(const Ecore_Getopt *parser)
+{
+   const Ecore_Getopt_Desc *desc = parser->descs;
+   for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
+     if (desc->action == ECORE_GETOPT_ACTION_HELP)
+       return desc;
+   return NULL;
+}
+
+/**
+ * Parse command line parameters.
+ *
+ * Walks the command line parameters and parse them based on @a parser
+ * description, doing actions based on @c parser->descs->action, like
+ * showing help text, license, copyright, storing values in values and
+ * so on.
+ *
+ * It is expected that values is of the same size than @c parser->descs,
+ * options that do not need a value it will be left untouched.
+ *
+ * All values are expected to be initialized before use. Options with
+ * action @c ECORE_GETOPT_ACTION_STORE and non required arguments
+ * (others than @c ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES), are expected
+ * to provide a value in @c def to be used.
+ *
+ * The following actions will store @c 1 on value as a boolean
+ * (@c value->boolp) if it's not @c NULL to indicate these actions were
+ * executed:
+ *   - @c ECORE_GETOPT_ACTION_HELP
+ *   - @c ECORE_GETOPT_ACTION_VERSION
+ *   - @c ECORE_GETOPT_ACTION_COPYRIGHT
+ *   - @c ECORE_GETOPT_ACTION_LICENSE
+ *
+ * Just @c ECORE_GETOPT_ACTION_APPEND will allocate memory and thus
+ * need to be freed. For consistency between all of appended subtypes,
+ * @c eina_list->data will contain an allocated memory with the value,
+ * that is, for @c ECORE_GETOPT_TYPE_STR it will contain a copy of the
+ * argument, @c ECORE_GETOPT_TYPE_INT a pointer to an allocated
+ * integer and so on.
+ *
+ * If parser is in strict mode (see @c Ecore_Getopt->strict), then any
+ * error will abort parsing and @c -1 is returned. Otherwise it will try
+ * to continue as far as possible.
+ *
+ * This function may reorder @a argv elements.
+ *
+ * Translation of help strings (description), metavar, usage, license
+ * and copyright may be translated, standard/global gettext() call
+ * will be applied on them if ecore was compiled with such support.
+ *
+ * @param parser description of how to work.
+ * @param values where to store values, it is assumed that this is a vector
+ *        of the same size as @c parser->descs. Values should be previously
+ *        initialized.
+ * @param argc how many elements in @a argv. If not provided it will be
+ *        retrieved with ecore_app_args_get().
+ * @param argv command line parameters.
+ *
+ * @return index of first non-option parameter or -1 on error.
+ */
+EAPI int
+ecore_getopt_parse(const Ecore_Getopt *parser,
+                   Ecore_Getopt_Value *values,
+                   int                 argc,
+                   char              **argv)
+{
+   int i, nonargs;
+
+   if (!parser)
+     {
+        fputs(_("ERROR: no parser provided.\n"), stderr);
+        return -1;
+     }
+   if (!values)
+     {
+        fputs(_("ERROR: no values provided.\n"), stderr);
+        return -1;
+     }
+
+   if ((argc < 1) || (!argv))
+     ecore_app_args_get(&argc, &argv);
+
+   if (argc < 1)
+     {
+        fputs(_("ERROR: no arguments provided.\n"), stderr);
+        return -1;
+     }
+
+   if (argv[0])
+     prog = argv[0];
+   else
+     prog = parser->prog;
+
+   nonargs = _ecore_getopt_parse_find_nonargs_base(parser, argc, argv);
+   if (nonargs < 0)
+     goto error;
+
+   if (nonargs > argc)
+     nonargs = argc;
+
+   i = 1;
+   while (i < nonargs)
+     if (!_ecore_getopt_parse_arg(parser, values, argc, argv, &i, &nonargs))
+       goto error;
+
+   return nonargs;
+
+error:
+   {
+      const Ecore_Getopt_Desc *help;
+      fputs(_("ERROR: invalid options found."), stderr);
+
+      help = _ecore_getopt_find_help(parser);
+      if (!help)
+        fputc('\n', stderr);
+      else if (help->longname)
+        fprintf(stderr, _(" See --%s.\n"), help->longname);
+      else
+        fprintf(stderr, _(" See -%c.\n"), help->shortname);
+   }
+
+   return -1;
+}
+
+/**
+ * Utility to free list and nodes allocated by @a ECORE_GETOPT_ACTION_APPEND.
+ *
+ * @param list pointer to list to be freed.
+ * @return always @c NULL, so you can easily make your list head @c NULL.
+ */
+EAPI Eina_List *
+ecore_getopt_list_free(Eina_List *list)
+{
+   void *data;
+
+   EINA_LIST_FREE(list, data)
+     free(data);
+   return NULL;
+}
+
+/**
+ * Helper ecore_getopt callback to parse geometry (x:y:w:h).
+ *
+ * @param parser This parameter isn't in use.
+ * @param desc This parameter isn't in use.
+ * @param str Geometry value
+ * @param data This parameter isn't in use.
+ * @param storage must be a pointer to @c Eina_Rectangle and will be used to
+ * store the four values passed in the given string.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on incorrect geometry value.
+ *
+ * @c callback_data value is ignored, you can safely use @c NULL.
+ */
+EAPI Eina_Bool
+ecore_getopt_callback_geometry_parse(const Ecore_Getopt      *parser __UNUSED__,
+                                     const Ecore_Getopt_Desc *desc __UNUSED__,
+                                     const char              *str,
+                                     void                    *data __UNUSED__,
+                                     Ecore_Getopt_Value      *storage)
+{
+   Eina_Rectangle *v = (Eina_Rectangle *)storage->ptrp;
+
+   if (sscanf(str, "%d:%d:%d:%d", &v->x, &v->y, &v->w, &v->h) != 4)
+     {
+        fprintf(stderr, _("ERROR: incorrect geometry value '%s'\n"), str);
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+/**
+ * Helper ecore_getopt callback to parse geometry size (WxH).
+ *
+ * @param parser This parameter isn't in use.
+ * @param desc This parameter isn't in use.
+ * @param str size value
+ * @param data This parameter isn't in use.
+ * @param storage must be a pointer to @c Eina_Rectangle and will be used to
+ * store the two values passed in the given string and @c 0 in the x and y
+ * fields.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on incorrect size value.
+ *
+ * @c callback_data value is ignored, you can safely use @c NULL.
+ */
+EAPI Eina_Bool
+ecore_getopt_callback_size_parse(const Ecore_Getopt      *parser __UNUSED__,
+                                 const Ecore_Getopt_Desc *desc __UNUSED__,
+                                 const char              *str,
+                                 void                    *data __UNUSED__,
+                                 Ecore_Getopt_Value      *storage)
+{
+   Eina_Rectangle *v = (Eina_Rectangle *)storage->ptrp;
+
+   if (sscanf(str, "%dx%d", &v->w, &v->h) != 2)
+     {
+        fprintf(stderr, _("ERROR: incorrect size value '%s'\n"), str);
+        return EINA_FALSE;
+     }
+   v->x = 0;
+   v->y = 0;
+
+   return EINA_TRUE;
+}
+
diff --git a/src/lib/ecore/ecore_glib.c b/src/lib/ecore/ecore_glib.c
new file mode 100644 (file)
index 0000000..a4db0ab
--- /dev/null
@@ -0,0 +1,342 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+#ifdef HAVE_GLIB
+#include <glib.h>
+
+static Eina_Bool _ecore_glib_active = EINA_FALSE;
+static Ecore_Select_Function _ecore_glib_select_original;
+static GCond *_ecore_glib_cond = NULL;
+static GPollFD *_ecore_glib_fds = NULL;
+static size_t _ecore_glib_fds_size = 0;
+static const size_t ECORE_GLIB_FDS_INITIAL = 128;
+static const size_t ECORE_GLIB_FDS_STEP = 8;
+static const size_t ECORE_GLIB_FDS_MAX_FREE = 256;
+
+static Eina_Bool
+_ecore_glib_fds_resize(size_t size)
+{
+   void *tmp = realloc(_ecore_glib_fds, sizeof(GPollFD) * size);
+
+   if (!tmp)
+     {
+        ERR("Could not realloc from %zu to %zu buckets.",
+            _ecore_glib_fds_size, size);
+        return EINA_FALSE;
+     }
+
+   _ecore_glib_fds = tmp;
+   _ecore_glib_fds_size = size;
+   return EINA_TRUE;
+}
+
+static int
+_ecore_glib_context_query(GMainContext *ctx,
+                          int           priority,
+                          int          *p_timer)
+{
+   int reqfds;
+
+   if (_ecore_glib_fds_size == 0)
+     {
+        if (!_ecore_glib_fds_resize(ECORE_GLIB_FDS_INITIAL)) return -1;
+     }
+
+   while (1)
+     {
+        size_t size;
+
+        reqfds = g_main_context_query
+            (ctx, priority, p_timer, _ecore_glib_fds, _ecore_glib_fds_size);
+        if (reqfds <= (int)_ecore_glib_fds_size) break;
+
+        size = (1 + reqfds / ECORE_GLIB_FDS_STEP) * ECORE_GLIB_FDS_STEP;
+        if (!_ecore_glib_fds_resize(size)) return -1;
+     }
+
+   if (reqfds + ECORE_GLIB_FDS_MAX_FREE < _ecore_glib_fds_size)
+     {
+        size_t size;
+
+        size = (1 + reqfds / ECORE_GLIB_FDS_MAX_FREE) * ECORE_GLIB_FDS_MAX_FREE;
+        _ecore_glib_fds_resize(size);
+     }
+
+   return reqfds;
+}
+
+static int
+_ecore_glib_context_poll_from(const GPollFD *pfds,
+                              int            count,
+                              fd_set        *rfds,
+                              fd_set        *wfds,
+                              fd_set        *efds)
+{
+   const GPollFD *itr = pfds, *itr_end = pfds + count;
+   int glib_fds = -1;
+
+   for (; itr < itr_end; itr++)
+     {
+        if (glib_fds < itr->fd)
+          glib_fds = itr->fd;
+
+        if (itr->events & G_IO_IN)
+          FD_SET(itr->fd, rfds);
+        if (itr->events & G_IO_OUT)
+          FD_SET(itr->fd, wfds);
+        if (itr->events & (G_IO_HUP | G_IO_ERR))
+          FD_SET(itr->fd, efds);
+     }
+
+   return glib_fds + 1;
+}
+
+static int
+_ecore_glib_context_poll_to(GPollFD      *pfds,
+                            int           count,
+                            const fd_set *rfds,
+                            const fd_set *wfds,
+                            const fd_set *efds,
+                            int           ready)
+{
+   GPollFD *itr = pfds, *itr_end = pfds + count;
+
+   for (; (itr < itr_end) && (ready > 0); itr++)
+     {
+        itr->revents = 0;
+        if (FD_ISSET(itr->fd, rfds) && (itr->events & G_IO_IN))
+          {
+             itr->revents |= G_IO_IN;
+             ready--;
+          }
+        if (FD_ISSET(itr->fd, wfds) && (itr->events & G_IO_OUT))
+          {
+             itr->revents |= G_IO_OUT;
+             ready--;
+          }
+        if (FD_ISSET(itr->fd, efds) && (itr->events & (G_IO_HUP | G_IO_ERR)))
+          {
+             itr->revents |= G_IO_ERR;
+             ready--;
+          }
+     }
+   return ready;
+}
+
+static int
+_ecore_glib_select__locked(GMainContext   *ctx,
+                           int             ecore_fds,
+                           fd_set         *rfds,
+                           fd_set         *wfds,
+                           fd_set         *efds,
+                           struct timeval *ecore_timeout)
+{
+   int priority, maxfds, glib_fds, reqfds, reqtimeout, ret;
+   struct timeval *timeout, glib_timeout;
+
+   g_main_context_prepare(ctx, &priority);
+   reqfds = _ecore_glib_context_query(ctx, priority, &reqtimeout);
+   if (reqfds < 0) goto error;
+
+   glib_fds = _ecore_glib_context_poll_from
+       (_ecore_glib_fds, reqfds, rfds, wfds, efds);
+
+   if (reqtimeout == -1)
+     timeout = ecore_timeout;
+   else
+     {
+        glib_timeout.tv_sec = reqtimeout / 1000;
+        glib_timeout.tv_usec = (reqtimeout % 1000) * 1000;
+
+        if (!ecore_timeout || timercmp(ecore_timeout, &glib_timeout, >))
+          timeout = &glib_timeout;
+        else
+          timeout = ecore_timeout;
+     }
+
+   maxfds = (ecore_fds >= glib_fds) ? ecore_fds : glib_fds;
+   ret = _ecore_glib_select_original(maxfds, rfds, wfds, efds, timeout);
+
+   ret = _ecore_glib_context_poll_to
+       (_ecore_glib_fds, reqfds, rfds, wfds, efds, ret);
+
+   if (g_main_context_check(ctx, priority, _ecore_glib_fds, reqfds))
+     g_main_context_dispatch(ctx);
+
+   return ret;
+
+error:
+   return _ecore_glib_select_original
+            (ecore_fds, rfds, wfds, efds, ecore_timeout);
+}
+
+static int
+_ecore_glib_select(int             ecore_fds,
+                   fd_set         *rfds,
+                   fd_set         *wfds,
+                   fd_set         *efds,
+                   struct timeval *ecore_timeout)
+{
+   GStaticMutex lock = G_STATIC_MUTEX_INIT;
+   GMutex *mutex = g_static_mutex_get_mutex(&lock);
+   GMainContext *ctx = g_main_context_default();
+   int ret;
+
+   if (g_main_context_acquire(ctx))
+     {
+        if (mutex) g_mutex_lock(mutex);
+     }
+   else
+     {
+        if (!_ecore_glib_cond)
+          _ecore_glib_cond = g_cond_new();
+
+        while (!g_main_context_wait(ctx, _ecore_glib_cond, mutex))
+          g_thread_yield();
+     }
+
+   ret = _ecore_glib_select__locked
+       (ctx, ecore_fds, rfds, wfds, efds, ecore_timeout);
+
+   if (mutex) g_mutex_unlock(mutex);
+   g_main_context_release(ctx);
+   g_static_mutex_free(&lock);
+
+   return ret;
+}
+
+#endif
+
+void
+_ecore_glib_init(void)
+{
+}
+
+void
+_ecore_glib_shutdown(void)
+{
+#ifdef HAVE_GLIB
+   if (!_ecore_glib_active) return;
+   _ecore_glib_active = EINA_FALSE;
+
+   if (ecore_main_loop_select_func_get() == _ecore_glib_select)
+     ecore_main_loop_select_func_set(_ecore_glib_select_original);
+
+   if (_ecore_glib_fds)
+     {
+        free(_ecore_glib_fds);
+        _ecore_glib_fds = NULL;
+     }
+   _ecore_glib_fds_size = 0;
+
+   if (_ecore_glib_cond)
+     {
+        g_cond_free(_ecore_glib_cond);
+        _ecore_glib_cond = NULL;
+     }
+#endif
+}
+
+/**
+ * @addtogroup Ecore_Main_Loop_Group
+ *
+ * @}
+ */
+
+/**
+ * Request ecore to integrate GLib's main loop.
+ *
+ * This will add a small overhead during every main loop interaction
+ * by checking glib's default main context (used by its main loop). If
+ * it have events to be checked (timers, file descriptors or idlers),
+ * then these will be polled alongside with Ecore's own events, then
+ * dispatched before Ecore's. This is done by calling
+ * ecore_main_loop_select_func_set().
+ *
+ * This will cooperate with previously set
+ * ecore_main_loop_select_func_set() by calling the old
+ * function. Similarly, if you want to override
+ * ecore_main_loop_select_func_set() after main loop is integrated,
+ * call the new select function set by this call (get it by calling
+ * ecore_main_loop_select_func_get() right after
+ * ecore_main_loop_glib_integrate()).
+ *
+ * This is useful to use GMainLoop libraries, like GTK, GUPnP,
+ * LibSoup, GConf and more. Adobe Flash plugin and other plugins
+ * systems depend on this as well.
+ *
+ * Once initialized/integrated, it will be valid until Ecore is
+ * completely shut down.
+ *
+ * Example of use:
+ * @code
+ *
+ * int main(void)
+ * {
+ *    ecore_init();
+ *    ecore_main_loop_glib_integrate();
+ *
+ *    // some code here
+ *
+ *    ecore_main_loop_begin();
+ *
+ *    ecore_shutdown();
+ *
+ *    return 0;
+ * }
+ *
+ * @endcode
+ *
+ * @note This is only available if Ecore was compiled with GLib support.
+ * @note You don't need to call this function if Ecore was compiled with
+ * --enable-glib-integration-always.
+ *
+ * @return @c EINA_TRUE on success of @c EINA_FALSE if it failed,
+ *         likely no GLib support in Ecore.
+ */
+EAPI Eina_Bool
+ecore_main_loop_glib_integrate(void)
+{
+#ifdef HAVE_GLIB
+   void *func;
+
+   if (_ecore_glib_active) return EINA_TRUE;
+   func = ecore_main_loop_select_func_get();
+   if (func == _ecore_glib_select) return EINA_TRUE;
+   _ecore_glib_select_original = func;
+   ecore_main_loop_select_func_set(_ecore_glib_select);
+   _ecore_glib_active = EINA_TRUE;
+   return EINA_TRUE;
+#else
+   fputs("ERROR: no glib support in ecore.\n", stderr);
+   return EINA_FALSE;
+#endif
+}
+
+Eina_Bool _ecore_glib_always_integrate = 1;
+
+/**
+ * Disable always integrating glib
+ *
+ * If ecore is compiled with --enable-glib-integration-always (to always
+ * call ecore_main_loop_glib_integrate() when ecore_init() is called), then
+ * calling this before calling ecore_init() will disable the integration.
+ * This is for apps that explicitly do not want this to happen for whatever
+ * reasons they may have.
+ */
+EAPI void
+ecore_main_loop_glib_always_integrate_disable(void)
+{
+   _ecore_glib_always_integrate = 0;
+}
+
+/**
+ * @}
+ */
index 7c9d03f..73e72cb 100644 (file)
@@ -1,8 +1,35 @@
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
+
+struct _Ecore_Idle_Enterer
+{
+   EINA_INLIST;
+                 ECORE_MAGIC;
+   Ecore_Task_Cb func;
+   void         *data;
+   int           references;
+   Eina_Bool     delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Idle_Enterer);
 
 static Ecore_Idle_Enterer *idle_enterers = NULL;
-static int                 idle_enterers_delete_me = 0;
+static Ecore_Idle_Enterer *idle_enterer_current = NULL;
+static int idle_enterers_delete_me = 0;
+
+static void *
+_ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
+
+/**
+ * @addtogroup Ecore_Idle_Group
+ *
+ * @{
+ */
 
 /**
  * Add an idle enterer handler.
@@ -10,20 +37,28 @@ static int                 idle_enterers_delete_me = 0;
  * @param   data The data to be passed to the @p func call
  * @return  A handle to the idle enterer callback if successful.  Otherwise,
  *          NULL is returned.
- * @ingroup Idle_Group
+ * @note The function func will be called every time the main loop is entering
+ * idle state, as long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
+ * (or ECORE_CALLBACK_CANCEL) deletes the idle enterer.
  */
 EAPI Ecore_Idle_Enterer *
-ecore_idle_enterer_add(int (*func) (void *data), const void *data)
+ecore_idle_enterer_add(Ecore_Task_Cb func,
+                       const void   *data)
 {
-   Ecore_Idle_Enterer *ie;
+   Ecore_Idle_Enterer *ie = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
 
-   if (!func) return NULL;
-   ie = calloc(1, sizeof(Ecore_Idle_Enterer));
-   if (!ie) return NULL;
+   if (!func) goto unlock;
+   ie = ecore_idle_enterer_calloc(1);
+   if (!ie) goto unlock;
    ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER);
    ie->func = func;
    ie->data = (void *)data;
-   idle_enterers = _ecore_list2_append(idle_enterers, ie);
+   idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_append(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
+unlock:
+   _ecore_unlock();
    return ie;
 }
 
@@ -33,20 +68,28 @@ ecore_idle_enterer_add(int (*func) (void *data), const void *data)
  * @param   data The data to be passed to the @p func call
  * @return  A handle to the idle enterer callback if successful.  Otherwise,
  *          NULL is returned.
- * @ingroup Idle_Group
+ * @note The function func will be called every time the main loop is entering
+ * idle state, as long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
+ * (or ECORE_CALLBACK_CANCEL) deletes the idle enterer.
  */
 EAPI Ecore_Idle_Enterer *
-ecore_idle_enterer_before_add(int (*func) (void *data), const void *data)
+ecore_idle_enterer_before_add(Ecore_Task_Cb func,
+                              const void   *data)
 {
-   Ecore_Idle_Enterer *ie;
+   Ecore_Idle_Enterer *ie = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
 
-   if (!func) return NULL;
-   ie = calloc(1, sizeof(Ecore_Idle_Enterer));
-   if (!ie) return NULL;
+   if (!func) goto unlock;
+   ie = ecore_idle_enterer_calloc(1);
+   if (!ie) goto unlock;
    ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER);
    ie->func = func;
    ie->data = (void *)data;
-   idle_enterers = _ecore_list2_prepend(idle_enterers, ie);
+   idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_prepend(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
+unlock:
+   _ecore_unlock();
    return ie;
 }
 
@@ -55,17 +98,33 @@ ecore_idle_enterer_before_add(int (*func) (void *data), const void *data)
  * @param   idle_enterer The idle enterer to delete
  * @return  The data pointer passed to the idler enterer callback on success.
  *          NULL otherwise.
- * @ingroup Idle_Group
  */
 EAPI void *
 ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
 {
+   void *data;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(idle_enterer, ECORE_MAGIC_IDLE_ENTERER))
      {
-       ECORE_MAGIC_FAIL(idle_enterer, ECORE_MAGIC_IDLE_ENTERER,
-                        "ecore_idle_enterer_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(idle_enterer, ECORE_MAGIC_IDLE_ENTERER,
+                         "ecore_idle_enterer_del");
+        return NULL;
      }
+   _ecore_lock();
+   data = _ecore_idle_enterer_del(idle_enterer);
+   _ecore_unlock();
+   return data;
+}
+
+/**
+ * @}
+ */
+
+static void *
+_ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
+{
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(idle_enterer->delete_me, NULL);
    idle_enterer->delete_me = 1;
    idle_enterers_delete_me = 1;
    return idle_enterer->data;
@@ -74,49 +133,72 @@ ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
 void
 _ecore_idle_enterer_shutdown(void)
 {
-   while (idle_enterers)
+   Ecore_Idle_Enterer *ie;
+   while ((ie = idle_enterers))
      {
-       Ecore_Idle_Enterer *ie;
-       
-       ie = idle_enterers;
-       idle_enterers = _ecore_list2_remove(idle_enterers, ie);
-       ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
-       free(ie);
+        idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(idle_enterers));
+        ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
+        ecore_idle_enterer_mp_free(ie);
      }
    idle_enterers_delete_me = 0;
+   idle_enterer_current = NULL;
 }
 
 void
 _ecore_idle_enterer_call(void)
 {
-   Ecore_List2 *l;
-   
-   for (l = (Ecore_List2 *)idle_enterers; l; l = l->next)
+   if (!idle_enterer_current)
      {
-       Ecore_Idle_Enterer *ie;
-       
-       ie = (Ecore_Idle_Enterer *)l;
-       if (!ie->delete_me)
-         {
-            if (!ie->func(ie->data)) ecore_idle_enterer_del(ie);
-         }
+        /* regular main loop, start from head */
+         idle_enterer_current = idle_enterers;
+     }
+   else
+     {
+        /* recursive main loop, continue from where we were */
+         idle_enterer_current =
+           (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next;
+     }
+
+   while (idle_enterer_current)
+     {
+        Ecore_Idle_Enterer *ie = (Ecore_Idle_Enterer *)idle_enterer_current;
+        if (!ie->delete_me)
+          {
+             ie->references++;
+             if (!_ecore_call_task_cb(ie->func, ie->data))
+               {
+                  if (!ie->delete_me) _ecore_idle_enterer_del(ie);
+               }
+             ie->references--;
+          }
+        if (idle_enterer_current) /* may have changed in recursive main loops */
+          idle_enterer_current =
+            (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next;
      }
    if (idle_enterers_delete_me)
      {
-       for (l = (Ecore_List2 *)idle_enterers; l;)
-         {
-            Ecore_Idle_Enterer *ie;
-            
-            ie = (Ecore_Idle_Enterer *)l;
-            l = l->next;
-            if (ie->delete_me)
-              {
-                 idle_enterers = _ecore_list2_remove(idle_enterers, ie);
-                 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
-                 free(ie);
-              }
-         }
-       idle_enterers_delete_me = 0;
+        Ecore_Idle_Enterer *l;
+        int deleted_idler_enterers_in_use = 0;
+
+        for (l = idle_enterers; l; )
+          {
+             Ecore_Idle_Enterer *ie = l;
+             l = (Ecore_Idle_Enterer *)EINA_INLIST_GET(l)->next;
+             if (ie->delete_me)
+               {
+                  if (ie->references)
+                    {
+                       deleted_idler_enterers_in_use++;
+                       continue;
+                    }
+
+                  idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
+                  ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
+                  ecore_idle_enterer_mp_free(ie);
+               }
+          }
+        if (!deleted_idler_enterers_in_use)
+          idle_enterers_delete_me = 0;
      }
 }
 
@@ -126,3 +208,4 @@ _ecore_idle_enterer_exist(void)
    if (idle_enterers) return 1;
    return 0;
 }
+
index b9d4128..0086bb6 100644 (file)
@@ -1,28 +1,62 @@
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
+
+struct _Ecore_Idle_Exiter
+{
+   EINA_INLIST;
+                 ECORE_MAGIC;
+   Ecore_Task_Cb func;
+   void         *data;
+   int           references;
+   Eina_Bool     delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Idle_Exiter);
 
 static Ecore_Idle_Exiter *idle_exiters = NULL;
-static int                idle_exiters_delete_me = 0;
+static Ecore_Idle_Exiter *idle_exiter_current = NULL;
+static int idle_exiters_delete_me = 0;
+
+static void *
+_ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
+
+/**
+ * @addtogroup Ecore_Idle_Group
+ *
+ * @{
+ */
 
 /**
  * Add an idle exiter handler.
  * @param func The function to call when exiting an idle state.
  * @param data The data to be passed to the @p func call
  * @return A handle to the idle exiter callback on success.  NULL otherwise.
- * @ingroup Idle_Group
+ * @note The function func will be called every time the main loop is exiting
+ * idle state, as long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
+ * (or ECORE_CALLBACK_CANCEL) deletes the idle exiter.
  */
 EAPI Ecore_Idle_Exiter *
-ecore_idle_exiter_add(int (*func) (void *data), const void *data)
+ecore_idle_exiter_add(Ecore_Task_Cb func,
+                      const void   *data)
 {
-   Ecore_Idle_Exiter *ie;
+   Ecore_Idle_Exiter *ie = NULL;
 
-   if (!func) return NULL;
-   ie = calloc(1, sizeof(Ecore_Idle_Exiter));
-   if (!ie) return NULL;
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!func) goto unlock;
+   ie = ecore_idle_exiter_calloc(1);
+   if (!ie) goto unlock;
    ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_EXITER);
    ie->func = func;
    ie->data = (void *)data;
-   idle_exiters = _ecore_list2_append(idle_exiters, ie);
+   idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_append(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
+unlock:
+   _ecore_unlock();
    return ie;
 }
 
@@ -31,17 +65,33 @@ ecore_idle_exiter_add(int (*func) (void *data), const void *data)
  * @param idle_exiter The idle exiter to delete
  * @return The data pointer that was being being passed to the handler if
  *         successful.  NULL otherwise.
- * @ingroup Idle_Group
  */
 EAPI void *
 ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
 {
+   void *data;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(idle_exiter, ECORE_MAGIC_IDLE_EXITER))
      {
-       ECORE_MAGIC_FAIL(idle_exiter, ECORE_MAGIC_IDLE_EXITER,
-                        "ecore_idle_exiter_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(idle_exiter, ECORE_MAGIC_IDLE_EXITER,
+                         "ecore_idle_exiter_del");
+        return NULL;
      }
+   _ecore_lock();
+   data = _ecore_idle_exiter_del(idle_exiter);
+   _ecore_unlock();
+   return data;
+}
+
+/**
+ * @}
+ */
+
+static void *
+_ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
+{
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(idle_exiter->delete_me, NULL);
    idle_exiter->delete_me = 1;
    idle_exiters_delete_me = 1;
    return idle_exiter->data;
@@ -50,49 +100,73 @@ ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
 void
 _ecore_idle_exiter_shutdown(void)
 {
-   while (idle_exiters)
+   Ecore_Idle_Exiter *ie;
+   while ((ie = idle_exiters))
      {
-       Ecore_Idle_Exiter *ie;
-       
-       ie = idle_exiters;
-       idle_exiters = _ecore_list2_remove(idle_exiters, ie);
-       ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
-       free(ie);
+        idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(idle_exiters));
+        ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
+        ecore_idle_exiter_mp_free(ie);
      }
    idle_exiters_delete_me = 0;
+   idle_exiter_current = NULL;
 }
 
 void
 _ecore_idle_exiter_call(void)
 {
-   Ecore_List2 *l;
-   
-   for (l = (Ecore_List2 *)idle_exiters; l; l = l->next)
+   if (!idle_exiter_current)
+     {
+        /* regular main loop, start from head */
+         idle_exiter_current = idle_exiters;
+     }
+   else
      {
-       Ecore_Idle_Exiter *ie;
-       
-       ie = (Ecore_Idle_Exiter *)l;
-       if (!ie->delete_me)
-         {
-            if (!ie->func(ie->data)) ecore_idle_exiter_del(ie);
-         }
+        /* recursive main loop, continue from where we were */
+         idle_exiter_current =
+           (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
+     }
+
+   while (idle_exiter_current)
+     {
+        Ecore_Idle_Exiter *ie = (Ecore_Idle_Exiter *)idle_exiter_current;
+        if (!ie->delete_me)
+          {
+             ie->references++;
+             if (!_ecore_call_task_cb(ie->func, ie->data))
+               {
+                  if (!ie->delete_me) _ecore_idle_exiter_del(ie);
+               }
+             ie->references--;
+          }
+        if (idle_exiter_current) /* may have changed in recursive main loops */
+          idle_exiter_current =
+            (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
      }
    if (idle_exiters_delete_me)
      {
-       for (l = (Ecore_List2 *)idle_exiters; l;)
-         {
-            Ecore_Idle_Exiter *ie;
-            
-            ie = (Ecore_Idle_Exiter *)l;
-            l = l->next;
-            if (ie->delete_me)
-              {
-                 idle_exiters = _ecore_list2_remove(idle_exiters, ie);
-                 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
-                 free(ie);
-              }
-         }
-       idle_exiters_delete_me = 0;
+        Ecore_Idle_Exiter *l;
+        int deleted_idler_exiters_in_use = 0;
+
+        for (l = idle_exiters; l; )
+          {
+             Ecore_Idle_Exiter *ie = l;
+
+             l = (Ecore_Idle_Exiter *)EINA_INLIST_GET(l)->next;
+             if (ie->delete_me)
+               {
+                  if (ie->references)
+                    {
+                       deleted_idler_exiters_in_use++;
+                       continue;
+                    }
+
+                  idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
+                  ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
+                  ecore_idle_exiter_mp_free(ie);
+               }
+          }
+        if (!deleted_idler_exiters_in_use)
+          idle_exiters_delete_me = 0;
      }
 }
 
@@ -102,3 +176,4 @@ _ecore_idle_exiter_exist(void)
    if (idle_exiters) return 1;
    return 0;
 }
+
index ff2dd7e..62998b6 100644 (file)
@@ -1,55 +1,81 @@
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
+
+struct _Ecore_Idler
+{
+   EINA_INLIST;
+                 ECORE_MAGIC;
+   Ecore_Task_Cb func;
+   void         *data;
+   int           references;
+   Eina_Bool     delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Idler);
 
 static Ecore_Idler *idlers = NULL;
-static int          idlers_delete_me = 0;
+static Ecore_Idler *idler_current = NULL;
+static int idlers_delete_me = 0;
+
+static void *
+_ecore_idler_del(Ecore_Idler *idler);
 
-/**
- * Add an idler handler.
- * @param  func The function to call when idling.
- * @param  data The data to be passed to this @p func call.
- * @return A idler handle if successfully added.  NULL otherwise.
- * @ingroup Idle_Group
- *
- * Add an idler handle to the event loop, returning a handle on success and
- * NULL otherwise.  The function @p func will be called repeatedly while
- * no other events are ready to be processed, as long as it returns 1 
- * (or ECORE_CALLBACK_RENEW). A return of 0 (or ECORE_CALLBACK_CANCEL) deletes 
- * the idler.
- *
- * Idlers are useful for progressively prossessing data without blocking.
- */
 EAPI Ecore_Idler *
-ecore_idler_add(int (*func) (void *data), const void *data)
+ecore_idler_add(Ecore_Task_Cb func,
+                const void   *data)
 {
-   Ecore_Idler *ie;
+   Ecore_Idler *ie = NULL;
 
-   if (!func) return NULL;
-   ie = calloc(1, sizeof(Ecore_Idler));
-   if (!ie) return NULL;
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!func) goto unlock;
+   ie = ecore_idler_calloc(1);
+   if (!ie) goto unlock;
    ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLER);
    ie->func = func;
    ie->data = (void *)data;
-   idlers = _ecore_list2_append(idlers, ie);
+   idlers = (Ecore_Idler *)eina_inlist_append(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie));
+unlock:
+   _ecore_unlock();
    return ie;
 }
 
-/**
- * Delete an idler callback from the list to be executed.
- * @param  idler The handle of the idler callback to delete
- * @return The data pointer passed to the idler callback on success.  NULL
- *         otherwise.
- * @ingroup Idle_Group
- */
 EAPI void *
 ecore_idler_del(Ecore_Idler *idler)
 {
+   void *data = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(idler, ECORE_MAGIC_IDLER))
      {
-       ECORE_MAGIC_FAIL(idler, ECORE_MAGIC_IDLER,
-                        "ecore_idler_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(idler, ECORE_MAGIC_IDLER,
+                         "ecore_idler_del");
+        return NULL;
      }
+
+   _ecore_lock();
+   data = _ecore_idler_del(idler);
+   _ecore_unlock();
+   return data;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+static void *
+_ecore_idler_del(Ecore_Idler *idler)
+{
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(idler->delete_me, NULL);
    idler->delete_me = 1;
    idlers_delete_me = 1;
    return idler->data;
@@ -58,49 +84,69 @@ ecore_idler_del(Ecore_Idler *idler)
 void
 _ecore_idler_shutdown(void)
 {
-   while (idlers)
+   Ecore_Idler *ie;
+   while ((ie = idlers))
      {
-       Ecore_Idler *ie;
-       
-       ie = idlers;
-       idlers = _ecore_list2_remove(idlers, ie);
-       ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
-       free(ie);
+        idlers = (Ecore_Idler *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(idlers));
+        ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
+        ecore_idler_mp_free(ie);
      }
    idlers_delete_me = 0;
+   idler_current = NULL;
 }
 
 int
-_ecore_idler_call(void)
+_ecore_idler_all_call(void)
 {
-   Ecore_List2 *l;
+   if (!idler_current)
+     {
+        /* regular main loop, start from head */
+         idler_current = idlers;
+     }
+   else
+     {
+        /* recursive main loop, continue from where we were */
+         idler_current = (Ecore_Idler *)EINA_INLIST_GET(idler_current)->next;
+     }
 
-   for (l = (Ecore_List2 *)idlers; l; l = l->next)
+   while (idler_current)
      {
-       Ecore_Idler *ie;
-       
-       ie = (Ecore_Idler *)l;
-       if (!ie->delete_me)
-         {
-            if (!ie->func(ie->data)) ecore_idler_del(ie);
-         }
+        Ecore_Idler *ie = (Ecore_Idler *)idler_current;
+        if (!ie->delete_me)
+          {
+             ie->references++;
+             if (!_ecore_call_task_cb(ie->func, ie->data))
+               {
+                  if (!ie->delete_me) _ecore_idler_del(ie);
+               }
+             ie->references--;
+          }
+        if (idler_current) /* may have changed in recursive main loops */
+          idler_current = (Ecore_Idler *)EINA_INLIST_GET(idler_current)->next;
      }
    if (idlers_delete_me)
      {
-       for (l = (Ecore_List2 *)idlers; l;)
-         {
-            Ecore_Idler *ie;
-            
-            ie = (Ecore_Idler *)l;
-            l = l->next;
-            if (ie->delete_me)
-              {
-                 idlers = _ecore_list2_remove(idlers, ie);
-                 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
-                 free(ie);
-              }
-         }
-       idlers_delete_me = 0;
+        Ecore_Idler *l;
+        int deleted_idlers_in_use = 0;
+        for (l = idlers; l; )
+          {
+             Ecore_Idler *ie = l;
+             l = (Ecore_Idler *)EINA_INLIST_GET(l)->next;
+             if (ie->delete_me)
+               {
+                  if (ie->references)
+                    {
+                       deleted_idlers_in_use++;
+                       continue;
+                    }
+
+                  idlers = (Ecore_Idler *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie));
+                  ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
+                  ecore_idler_mp_free(ie);
+               }
+          }
+        if (!deleted_idlers_in_use)
+          idlers_delete_me = 0;
      }
    if (idlers) return 1;
    return 0;
@@ -112,3 +158,4 @@ _ecore_idler_exist(void)
    if (idlers) return 1;
    return 0;
 }
+
diff --git a/src/lib/ecore/ecore_job.c b/src/lib/ecore/ecore_job.c
new file mode 100644 (file)
index 0000000..93852a3
--- /dev/null
@@ -0,0 +1,125 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+static Eina_Bool _ecore_job_event_handler(void *data,
+                                          int   type,
+                                          void *ev);
+static void _ecore_job_event_free(void *data,
+                                  void *ev);
+
+static int ecore_event_job_type = 0;
+static Ecore_Event_Handler *_ecore_job_handler = NULL;
+
+struct _Ecore_Job
+{
+   ECORE_MAGIC;
+   Ecore_Event *event;
+   Ecore_Cb     func;
+   void        *data;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Job);
+
+void
+_ecore_job_init(void)
+{
+   ecore_event_job_type = ecore_event_type_new();
+   _ecore_job_handler = ecore_event_handler_add(ecore_event_job_type, _ecore_job_event_handler, NULL);
+}
+
+void
+_ecore_job_shutdown(void)
+{
+   _ecore_event_handler_del(_ecore_job_handler);
+   _ecore_job_handler = NULL;
+}
+
+/**
+ * @addtogroup Ecore_Job_Group
+ *
+ * @{
+ */
+
+/**
+ * Add a job to the event queue.
+ * @param   func The function to call when the job gets handled.
+ * @param   data Data pointer to be passed to the job function when the job is
+ *               handled.
+ * @return  The handle of the job.  @c NULL is returned if the job could not be
+ *          added to the queue.
+ * @note    Once the job has been executed, the job handle is invalid.
+ */
+EAPI Ecore_Job *
+ecore_job_add(Ecore_Cb    func,
+              const void *data)
+{
+   Ecore_Job *job;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   if (!func) return NULL;
+
+   job = ecore_job_calloc(1);
+   if (!job) return NULL;
+   ECORE_MAGIC_SET(job, ECORE_MAGIC_JOB);
+   job->event = ecore_event_add(ecore_event_job_type, job, _ecore_job_event_free, NULL);
+   if (!job->event)
+     {
+        ecore_job_mp_free(job);
+        return NULL;
+     }
+   job->func = func;
+   job->data = (void *)data;
+   return job;
+}
+
+/**
+ * Delete a queued job that has not yet been executed.
+ * @param   job  Handle of the job to delete.
+ * @return  The data pointer that was to be passed to the job.
+ */
+EAPI void *
+ecore_job_del(Ecore_Job *job)
+{
+   void *data;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_JOB))
+     {
+        ECORE_MAGIC_FAIL(job, ECORE_MAGIC_JOB,
+                         "ecore_job_del");
+        return NULL;
+     }
+   data = job->data;
+   ECORE_MAGIC_SET(job, ECORE_MAGIC_NONE);
+   ecore_event_del(job->event);
+   return data;
+}
+
+/**
+ * @}
+ */
+
+static Eina_Bool
+_ecore_job_event_handler(void *data __UNUSED__,
+                         int   type __UNUSED__,
+                         void *ev)
+{
+   Ecore_Job *job;
+
+   job = ev;
+   job->func(job->data);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_ecore_job_event_free(void *data __UNUSED__,
+                      void *job)
+{
+   ecore_job_mp_free(job);
+}
+
index 4ba6856..a3b4245 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
 #ifdef _WIN32
+# define WIN32_LEAN_AND_MEAN
 # include <winsock2.h>
+# undef WIN32_LEAN_AND_MEAN
+# ifndef USER_TIMER_MINIMUM
+#  define USER_TIMER_MINIMUM 0x0a
+# endif
 #endif
 
+#ifdef __SUNPRO_C
+# include <ieeefp.h>
+# include <string.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
 #include <math.h>
-#include <sys/time.h>
 #include <sys/types.h>
-#include <unistd.h>
 #include <errno.h>
+#include <fcntl.h>
+
+#ifndef _MSC_VER
+# include <sys/time.h>
+# include <unistd.h>
+#else
+# include <float.h>
+#endif
+
+#ifdef HAVE_ISFINITE
+# define ECORE_FINITE(t)  isfinite(t)
+#else
+# ifdef _MSC_VER
+#  define ECORE_FINITE(t) _finite(t)
+# else
+#  define ECORE_FINITE(t) finite(t)
+# endif
+#endif
 
-#define FIX_HZ 1
+//#define FIX_HZ 1
 
 #ifdef FIX_HZ
-# include <sys/param.h>
+# ifndef _MSC_VER
+#  include <sys/param.h>
+# endif
 # ifndef HZ
 #  define HZ 100
 # endif
 #endif
 
-#include "ecore_private.h"
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
 #include "Ecore.h"
+#include "ecore_private.h"
+
+#ifdef HAVE_SYS_EPOLL_H
+# define HAVE_EPOLL   1
+# include <sys/epoll.h>
+#else
+
+# define HAVE_EPOLL   0
+# define EPOLLIN      1
+# define EPOLLPRI     2
+# define EPOLLOUT     4
+# define EPOLLERR     8
+
+#define EPOLL_CTL_ADD 1
+#define EPOLL_CTL_DEL 2
+#define EPOLL_CTL_MOD 3
+
+typedef union epoll_data {
+   void    *ptr;
+   int      fd;
+   uint32_t u32;
+   uint64_t u64;
+} epoll_data_t;
+
+struct epoll_event
+{
+   uint32_t     events;
+   epoll_data_t data;
+};
+
+static inline int
+epoll_create(int size __UNUSED__)
+{
+   return -1;
+}
+
+static inline int
+epoll_wait(int                 epfd __UNUSED__,
+           struct epoll_event *events __UNUSED__,
+           int                 maxevents __UNUSED__,
+           int                 timeout __UNUSED__)
+{
+   return -1;
+}
+
+static inline int
+epoll_ctl(int                 epfd __UNUSED__,
+          int                 op __UNUSED__,
+          int                 fd __UNUSED__,
+          struct epoll_event *event __UNUSED__)
+{
+   return -1;
+}
+
+#endif
+
+#ifdef HAVE_SYS_TIMERFD_H
+#include <sys/timerfd.h>
+#else
+/* fallback code if we don't have real timerfd - reduces number of ifdefs  */
+#ifndef CLOCK_MONOTONIC
+#define CLOCK_MONOTONIC 0 /* bogus value */
+#endif
+#ifndef TFD_NONBLOCK
+#define TFD_NONBLOCK    0 /* bogus value */
+#endif
+static inline int
+timerfd_create(int clockid __UNUSED__,
+               int flags __UNUSED__)
+{
+   return -1;
+}
+
+static inline int
+timerfd_settime(int                      fd __UNUSED__,
+                int                      flags __UNUSED__,
+                const struct itimerspec *new_value __UNUSED__,
+                struct itimerspec       *old_value __UNUSED__)
+{
+   return -1;
+}
+
+#endif /* HAVE_SYS_TIMERFD_H */
+
+#ifdef USE_G_MAIN_LOOP
+# include <glib.h>
+#endif
+
+#define NS_PER_SEC (1000.0 * 1000.0 * 1000.0)
 
+struct _Ecore_Fd_Handler
+{
+   EINA_INLIST;
+                          ECORE_MAGIC;
+   Ecore_Fd_Handler      *next_ready;
+   int                    fd;
+   Ecore_Fd_Handler_Flags flags;
+   Ecore_Fd_Cb            func;
+   void                  *data;
+   Ecore_Fd_Cb            buf_func;
+   void                  *buf_data;
+   Ecore_Fd_Prep_Cb       prep_func;
+   void                  *prep_data;
+   int                    references;
+   Eina_Bool              read_active : 1;
+   Eina_Bool              write_active : 1;
+   Eina_Bool              error_active : 1;
+   Eina_Bool              delete_me : 1;
+   Eina_Bool              file : 1;
+#if defined(USE_G_MAIN_LOOP)
+   GPollFD                gfd;
+#endif
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Fd_Handler);
+
+#ifdef _WIN32
+struct _Ecore_Win32_Handler
+{
+   EINA_INLIST;
+                         ECORE_MAGIC;
+   HANDLE                h;
+   Ecore_Win32_Handle_Cb func;
+   void                 *data;
+   int                   references;
+   Eina_Bool             delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Win32_Handler);
+#endif
+
+#ifndef USE_G_MAIN_LOOP
 static int  _ecore_main_select(double timeout);
+#endif
+static void _ecore_main_prepare_handlers(void);
 static void _ecore_main_fd_handlers_cleanup(void);
+#ifndef _WIN32
+# ifndef USE_G_MAIN_LOOP
+static void _ecore_main_fd_handlers_bads_rem(void);
+# endif
+#endif
 static void _ecore_main_fd_handlers_call(void);
 static int  _ecore_main_fd_handlers_buf_call(void);
+#ifndef USE_G_MAIN_LOOP
 static void _ecore_main_loop_iterate_internal(int once_only);
+#endif
+
+#ifdef _WIN32
+static int _ecore_main_win32_select(int             nfds,
+                                    fd_set         *readfds,
+                                    fd_set         *writefds,
+                                    fd_set         *exceptfds,
+                                    struct timeval *timeout);
+static void _ecore_main_win32_handlers_cleanup(void);
+#endif
 
-static int               in_main_loop = 0;
-static int               do_quit = 0;
+static int in_main_loop = 0;
+static int do_quit = 0;
 static Ecore_Fd_Handler *fd_handlers = NULL;
-static int               fd_handlers_delete_me = 0;
+static Ecore_Fd_Handler *fd_handler_current = NULL;
+static Eina_List *fd_handlers_with_prep = NULL;
+static Eina_List *file_fd_handlers = NULL;
+static Eina_List *fd_handlers_with_buffer = NULL;
+static Eina_List *fd_handlers_to_delete = NULL;
+
+/* single linked list of ready fdhs, terminated by loop to self */
+static Ecore_Fd_Handler *fd_handlers_to_call;
+static Ecore_Fd_Handler *fd_handlers_to_call_current;
+
+#ifdef _WIN32
+static Ecore_Win32_Handler *win32_handlers = NULL;
+static Ecore_Win32_Handler *win32_handler_current = NULL;
+static Eina_Bool win32_handlers_delete_me = EINA_FALSE;
+#endif
+
+#ifdef _WIN32
+Ecore_Select_Function main_loop_select = _ecore_main_win32_select;
+#else
+# if !defined EXOTIC_NO_SELECT
+#  ifdef HAVE_SYS_SELECT_H
+#   include <sys/select.h>
+#  endif
+Ecore_Select_Function main_loop_select = select;
+# else
+Ecore_Select_Function main_loop_select = NULL;
+# endif
+#endif
+
+#ifndef USE_G_MAIN_LOOP
+static double t1 = 0.0;
+static double t2 = 0.0;
+#endif
+
+static int timer_fd = -1;
+static int epoll_fd = -1;
+static pid_t epoll_pid;
+
+#ifdef USE_G_MAIN_LOOP
+static GPollFD ecore_epoll_fd;
+static GPollFD ecore_timer_fd;
+static GSource *ecore_glib_source;
+static guint ecore_glib_source_id;
+static GMainLoop *ecore_main_loop;
+static gboolean ecore_idling;
+static gboolean _ecore_glib_idle_enterer_called;
+static gboolean ecore_fds_ready;
+#endif
+
+Eina_Bool
+_ecore_fd_close_on_exec(int fd)
+{
+#ifdef HAVE_EXECVP
+   int flags;
+
+   flags = fcntl(fd, F_GETFD);
+   if (flags == -1)
+     return EINA_FALSE;
+
+   flags |= FD_CLOEXEC;
+   if (fcntl(fd, F_SETFD, flags) == -1)
+     return EINA_FALSE;
+   return EINA_TRUE;
+#else
+   (void) fd;
+   return EINA_FALSE;
+#endif
+}
+
+static inline void
+_ecore_fd_valid(void)
+{
+   if (HAVE_EPOLL && epoll_fd >= 0)
+     {
+        if (fcntl(epoll_fd, F_GETFD) < 0)
+          {
+             ERR("arghhh you caught me! report a backtrace to edevel!");
+             pause();
+          }
+     }
+}
+
+static inline void
+_ecore_try_add_to_call_list(Ecore_Fd_Handler *fdh)
+{
+   /* check if this fdh is already in the list */
+   if (fdh->next_ready)
+     return;
+   if (fdh->read_active || fdh->write_active || fdh->error_active)
+     {
+        /*
+         * make sure next_ready is non-null by pointing to ourselves
+         * use that to indicate this fdh is in the ready list
+         * insert at the head of the list to avoid trouble
+         */
+        fdh->next_ready = fd_handlers_to_call ? fd_handlers_to_call : fdh;
+        fd_handlers_to_call = fdh;
+     }
+}
 
-static double            t1 = 0.0;
-static double            t2 = 0.0;
+static inline int
+_ecore_get_epoll_fd(void)
+{
+   if (epoll_pid && epoll_pid != getpid())
+     {
+        /* forked! */
+        _ecore_main_loop_shutdown();
+     }
+   if (epoll_pid == 0 && epoll_fd < 0)
+     {
+        _ecore_main_loop_init();
+     }
+   return epoll_fd;
+}
+
+static inline int
+_ecore_epoll_add(int   efd,
+                 int   fd,
+                 int   events,
+                 void *ptr)
+{
+   struct epoll_event ev;
+
+   memset(&ev, 0, sizeof (ev));
+   ev.events = events;
+   ev.data.ptr = ptr;
+   INF("adding poll on %d %08x", fd, events);
+   return epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev);
+}
+
+static inline int
+_ecore_poll_events_from_fdh(Ecore_Fd_Handler *fdh)
+{
+   int events = 0;
+   if (fdh->flags & ECORE_FD_READ) events |= EPOLLIN;
+   if (fdh->flags & ECORE_FD_WRITE) events |= EPOLLOUT;
+   if (fdh->flags & ECORE_FD_ERROR) events |= EPOLLERR | EPOLLPRI;
+   return events;
+}
+
+#ifdef USE_G_MAIN_LOOP
+static inline int
+_gfd_events_from_fdh(Ecore_Fd_Handler *fdh)
+{
+   int events = 0;
+   if (fdh->flags & ECORE_FD_READ) events |= G_IO_IN;
+   if (fdh->flags & ECORE_FD_WRITE) events |= G_IO_OUT;
+   if (fdh->flags & ECORE_FD_ERROR) events |= G_IO_ERR;
+   return events;
+}
+
+#endif
+
+static inline int
+_ecore_main_fdh_poll_add(Ecore_Fd_Handler *fdh)
+{
+   int r = 0;
+
+   if ((!fdh->file) && HAVE_EPOLL && epoll_fd >= 0)
+     {
+        r = _ecore_epoll_add(_ecore_get_epoll_fd(), fdh->fd,
+                             _ecore_poll_events_from_fdh(fdh), fdh);
+     }
+   else
+     {
+#ifdef USE_G_MAIN_LOOP
+        fdh->gfd.fd = fdh->fd;
+        fdh->gfd.events = _gfd_events_from_fdh(fdh);
+        fdh->gfd.revents = 0;
+        INF("adding gpoll on %d %08x", fdh->fd, fdh->gfd.events);
+        g_source_add_poll(ecore_glib_source, &fdh->gfd);
+#endif
+     }
+   return r;
+}
+
+static inline void
+_ecore_main_fdh_poll_del(Ecore_Fd_Handler *fdh)
+{
+   if ((!fdh->file) && HAVE_EPOLL && epoll_fd >= 0)
+     {
+        struct epoll_event ev;
+        int efd = _ecore_get_epoll_fd();
+
+        memset(&ev, 0, sizeof (ev));
+        INF("removing poll on %d", fdh->fd);
+        /* could get an EBADF if somebody closed the FD before removing it */
+        if ((epoll_ctl(efd, EPOLL_CTL_DEL, fdh->fd, &ev) < 0))
+          {
+             if (errno == EBADF)
+               {
+                  WRN("fd %d was closed, can't remove from epoll - reinit!",
+                      fdh->fd);
+                  _ecore_main_loop_shutdown();
+                  _ecore_main_loop_init();
+               }
+             else
+               {
+                  ERR("Failed to delete epoll fd %d! (errno=%d)", fdh->fd, errno);
+               }
+          }
+     }
+   else
+     {
+#ifdef USE_G_MAIN_LOOP
+        fdh->gfd.fd = fdh->fd;
+        fdh->gfd.events = _gfd_events_from_fdh(fdh);
+        fdh->gfd.revents = 0;
+        INF("adding gpoll on %d %08x", fdh->fd, fdh->gfd.events);
+        g_source_add_poll(ecore_glib_source, &fdh->gfd);
+#endif
+     }
+}
+
+static inline int
+_ecore_main_fdh_poll_modify(Ecore_Fd_Handler *fdh)
+{
+   int r = 0;
+   if ((!fdh->file) && HAVE_EPOLL && epoll_fd >= 0)
+     {
+        struct epoll_event ev;
+        int efd = _ecore_get_epoll_fd();
+
+        memset(&ev, 0, sizeof (ev));
+        ev.events = _ecore_poll_events_from_fdh(fdh);
+        ev.data.ptr = fdh;
+        INF("modifing epoll on %d to %08x", fdh->fd, ev.events);
+        r = epoll_ctl(efd, EPOLL_CTL_MOD, fdh->fd, &ev);
+     }
+   else
+     {
+#ifdef USE_G_MAIN_LOOP
+        fdh->gfd.fd = fdh->fd;
+        fdh->gfd.events = _gfd_events_from_fdh(fdh);
+        fdh->gfd.revents = 0;
+        INF("modifing gpoll on %d to %08x", fdh->fd, fdh->gfd.events);
+#endif
+     }
+   return r;
+}
+
+static inline int
+_ecore_main_fdh_epoll_mark_active(void)
+{
+   struct epoll_event ev[32];
+   int i, ret;
+   int efd = _ecore_get_epoll_fd();
+
+   memset(&ev, 0, sizeof (ev));
+   ret = epoll_wait(efd, ev, sizeof(ev) / sizeof(struct epoll_event), 0);
+   if (ret < 0)
+     {
+        if (errno == EINTR) return -1;
+        ERR("epoll_wait failed %d", errno);
+        return -1;
+     }
+
+   for (i = 0; i < ret; i++)
+     {
+        Ecore_Fd_Handler *fdh;
+
+        fdh = ev[i].data.ptr;
+        if (!ECORE_MAGIC_CHECK(fdh, ECORE_MAGIC_FD_HANDLER))
+          {
+             ECORE_MAGIC_FAIL(fdh, ECORE_MAGIC_FD_HANDLER,
+                              "_ecore_main_fdh_epoll_mark_active");
+             continue;
+          }
+        if (fdh->delete_me)
+          {
+             ERR("deleted fd in epoll");
+             continue;
+          }
+
+        if (ev[i].events & EPOLLIN)
+          fdh->read_active = EINA_TRUE;
+        if (ev[i].events & EPOLLOUT)
+          fdh->write_active = EINA_TRUE;
+        if (ev[i].events & EPOLLERR)
+          fdh->error_active = EINA_TRUE;
+
+        _ecore_try_add_to_call_list(fdh);
+     }
+
+   return ret;
+}
+
+#ifdef USE_G_MAIN_LOOP
+
+static inline int
+_ecore_main_fdh_glib_mark_active(void)
+{
+   Ecore_Fd_Handler *fdh;
+   int ret = 0;
+
+   /* call the prepare callback for all handlers */
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
+     {
+        if (fdh->delete_me)
+          continue;
+
+        if (fdh->gfd.revents & G_IO_IN)
+          fdh->read_active = EINA_TRUE;
+        if (fdh->gfd.revents & G_IO_OUT)
+          fdh->write_active = EINA_TRUE;
+        if (fdh->gfd.revents & G_IO_ERR)
+          fdh->error_active = EINA_TRUE;
+
+        _ecore_try_add_to_call_list(fdh);
+
+        if (fdh->gfd.revents & (G_IO_IN | G_IO_OUT | G_IO_ERR)) ret++;
+     }
+
+   return ret;
+}
+
+/* like we are about to enter main_loop_select in  _ecore_main_select */
+static gboolean
+_ecore_main_gsource_prepare(GSource *source __UNUSED__,
+                            gint    *next_time)
+{
+   gboolean ready = FALSE;
+
+   _ecore_lock();
+   in_main_loop++;
+
+   if (!ecore_idling && !_ecore_glib_idle_enterer_called)
+     {
+        _ecore_time_loop_time = ecore_time_get();
+        _ecore_timer_expired_timers_call(_ecore_time_loop_time);
+        _ecore_timer_cleanup();
+
+        _ecore_idle_enterer_call();
+        _ecore_throttle();
+        _ecore_glib_idle_enterer_called = FALSE;
+
+        if (fd_handlers_with_buffer)
+          _ecore_main_fd_handlers_buf_call();
+     }
+
+   _ecore_signal_received_process();
+
+   /* don't check fds if somebody quit */
+   if (g_main_loop_is_running(ecore_main_loop))
+     {
+        /* only set idling state in dispatch */
+         if (ecore_idling && !_ecore_idler_exist() && !_ecore_event_exist())
+           {
+              if (_ecore_timers_exists())
+                {
+                   int r = -1;
+                   double t = _ecore_timer_next_get();
+                   if (timer_fd >= 0 && t > 0.0)
+                     {
+                        struct itimerspec ts;
+
+                        ts.it_interval.tv_sec = 0;
+                        ts.it_interval.tv_nsec = 0;
+                        ts.it_value.tv_sec = t;
+                        ts.it_value.tv_nsec = fmod(t * NS_PER_SEC, NS_PER_SEC);
+
+     /* timerfd cannot sleep for 0 time */
+                        if (ts.it_value.tv_sec || ts.it_value.tv_nsec)
+                          {
+                             r = timerfd_settime(timer_fd, 0, &ts, NULL);
+                             if (r < 0)
+                               {
+                                  ERR("timer set returned %d (errno=%d)", r, errno);
+                                  close(timer_fd);
+                                  timer_fd = -1;
+                               }
+                             else
+                               INF("sleeping for %ld s %06ldus",
+                                   ts.it_value.tv_sec,
+                                   ts.it_value.tv_nsec / 1000);
+                          }
+                     }
+                   if (r == -1)
+                     {
+                        *next_time = ceil(t * 1000.0);
+                        if (t == 0.0)
+                          ready = TRUE;
+                     }
+                }
+              else
+                *next_time = -1;
+           }
+         else
+           {
+              *next_time = 0;
+              if (_ecore_event_exist())
+                ready = TRUE;
+           }
+
+         if (fd_handlers_with_prep)
+           _ecore_main_prepare_handlers();
+     }
+   else
+     ready = TRUE;
+
+   in_main_loop--;
+   INF("leave, timeout = %d", *next_time);
+   _ecore_unlock();
+
+   /* ready if we're not running (about to quit) */
+   return ready;
+}
+
+static gboolean
+_ecore_main_gsource_check(GSource *source __UNUSED__)
+{
+   gboolean ret = FALSE;
+
+   _ecore_lock();
+   in_main_loop++;
+
+   /* check if old timers expired */
+   if (ecore_idling && !_ecore_idler_exist() && !_ecore_event_exist())
+     {
+        if (timer_fd >= 0)
+          {
+             uint64_t count = 0;
+             int r = read(timer_fd, &count, sizeof count);
+             if (r == -1 && errno == EAGAIN)
+               ;
+             else if (r == sizeof count)
+               ret = TRUE;
+             else
+               {
+     /* unexpected things happened... fail back to old way */
+                   ERR("timer read returned %d (errno=%d)", r, errno);
+                   close(timer_fd);
+                   timer_fd = -1;
+               }
+          }
+     }
+   else
+     ret = TRUE;
+
+   /* check if fds are ready */
+   if (HAVE_EPOLL && epoll_fd >= 0)
+     ecore_fds_ready = (_ecore_main_fdh_epoll_mark_active() > 0);
+   else
+     ecore_fds_ready = (_ecore_main_fdh_glib_mark_active() > 0);
+   _ecore_main_fd_handlers_cleanup();
+   if (ecore_fds_ready)
+     ret = TRUE;
+
+   /* check timers after updating loop time */
+   if (!ret && _ecore_timers_exists())
+     ret = (0.0 == _ecore_timer_next_get());
+
+   in_main_loop--;
+   _ecore_unlock();
+
+   return ret;
+}
+
+/* like we just came out of main_loop_select in  _ecore_main_select */
+static gboolean
+_ecore_main_gsource_dispatch(GSource    *source __UNUSED__,
+                             GSourceFunc callback __UNUSED__,
+                             gpointer    user_data __UNUSED__)
+{
+   gboolean events_ready, timers_ready, idlers_ready;
+   double next_time;
+
+   _ecore_lock();
+   _ecore_time_loop_time = ecore_time_get();
+   _ecore_timer_enable_new();
+   next_time = _ecore_timer_next_get();
+
+   events_ready = _ecore_event_exist();
+   timers_ready = _ecore_timers_exists() && (0.0 == next_time);
+   idlers_ready = _ecore_idler_exist();
+
+   in_main_loop++;
+   INF("enter idling=%d fds=%d events=%d timers=%d (next=%.2f) idlers=%d",
+       ecore_idling, ecore_fds_ready, events_ready,
+       timers_ready, next_time, idlers_ready);
+
+   if (ecore_idling && events_ready)
+     {
+        _ecore_idle_exiter_call();
+        ecore_idling = 0;
+     }
+   else if (!ecore_idling && !events_ready)
+     {
+        ecore_idling = 1;
+     }
+
+   if (ecore_idling)
+     {
+        _ecore_idler_all_call();
+
+        events_ready = _ecore_event_exist();
+
+        if (ecore_fds_ready || events_ready || timers_ready)
+          {
+             _ecore_idle_exiter_call();
+             ecore_idling = 0;
+          }
+     }
+
+   /* process events */
+   if (!ecore_idling)
+     {
+        _ecore_main_fd_handlers_call();
+        if (fd_handlers_with_buffer)
+          _ecore_main_fd_handlers_buf_call();
+        _ecore_signal_received_process();
+        _ecore_event_call();
+        _ecore_main_fd_handlers_cleanup();
+
+        _ecore_timer_expired_timers_call(_ecore_time_loop_time);
+        _ecore_timer_cleanup();
+
+        _ecore_idle_enterer_call();
+        _ecore_throttle();
+        _ecore_glib_idle_enterer_called = TRUE;
+
+        if (fd_handlers_with_buffer)
+          _ecore_main_fd_handlers_buf_call();
+     }
+
+   in_main_loop--;
+   _ecore_unlock();
+
+   return TRUE; /* what should be returned here? */
+}
+
+static void
+_ecore_main_gsource_finalize(GSource *source __UNUSED__)
+{
+}
+
+static GSourceFuncs ecore_gsource_funcs =
+{
+   .prepare = _ecore_main_gsource_prepare,
+   .check = _ecore_main_gsource_check,
+   .dispatch = _ecore_main_gsource_dispatch,
+   .finalize = _ecore_main_gsource_finalize,
+};
+
+#endif
+
+void
+_ecore_main_loop_init(void)
+{
+   epoll_fd = epoll_create(1);
+   if (epoll_fd < 0)
+     WRN("Failed to create epoll fd!");
+   epoll_pid = getpid();
+   _ecore_fd_close_on_exec(epoll_fd);
+
+   /* add polls on all our file descriptors */
+   Ecore_Fd_Handler *fdh;
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
+     {
+        if (fdh->delete_me)
+          continue;
+        _ecore_epoll_add(epoll_fd, fdh->fd,
+                         _ecore_poll_events_from_fdh(fdh), fdh);
+        _ecore_main_fdh_poll_add(fdh);
+     }
+
+   /* setup for the g_main_loop only integration */
+#ifdef USE_G_MAIN_LOOP
+   ecore_glib_source = g_source_new(&ecore_gsource_funcs, sizeof (GSource));
+   if (!ecore_glib_source)
+     CRIT("Failed to create glib source for epoll!");
+   else
+     {
+        g_source_set_priority(ecore_glib_source, G_PRIORITY_HIGH_IDLE + 20);
+        if (HAVE_EPOLL && epoll_fd >= 0)
+          {
+             /* epoll multiplexes fds into the g_main_loop */
+              ecore_epoll_fd.fd = epoll_fd;
+              ecore_epoll_fd.events = G_IO_IN;
+              ecore_epoll_fd.revents = 0;
+              g_source_add_poll(ecore_glib_source, &ecore_epoll_fd);
+          }
+
+        /* timerfd gives us better than millisecond accuracy in g_main_loop */
+        timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
+        if (timer_fd < 0)
+          WRN("failed to create timer fd!");
+        else
+          {
+             _ecore_fd_close_on_exec(timer_fd);
+             ecore_timer_fd.fd = timer_fd;
+             ecore_timer_fd.events = G_IO_IN;
+             ecore_timer_fd.revents = 0;
+             g_source_add_poll(ecore_glib_source, &ecore_timer_fd);
+          }
+
+        ecore_glib_source_id = g_source_attach(ecore_glib_source, NULL);
+        if (ecore_glib_source_id <= 0)
+          CRIT("Failed to attach glib source to default context");
+     }
+#endif
+}
+
+void
+_ecore_main_loop_shutdown(void)
+{
+#ifdef USE_G_MAIN_LOOP
+   if (ecore_glib_source)
+     {
+        g_source_destroy(ecore_glib_source);
+        ecore_glib_source = NULL;
+     }
+#endif
+
+   if (epoll_fd >= 0)
+     {
+        close(epoll_fd);
+        epoll_fd = -1;
+     }
+   epoll_pid = 0;
+
+   if (timer_fd >= 0)
+     {
+        close(timer_fd);
+        timer_fd = -1;
+     }
+}
+
+void *
+_ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
+{
+   if (fd_handler->delete_me)
+     {
+        ERR("fdh %p deleted twice", fd_handler);
+        return NULL;
+     }
+
+   _ecore_main_fdh_poll_del(fd_handler);
+   fd_handler->delete_me = EINA_TRUE;
+   fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fd_handler);
+   if (fd_handler->prep_func && fd_handlers_with_prep)
+     fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler);
+   if (fd_handler->buf_func && fd_handlers_with_buffer)
+     fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fd_handler);
+   return fd_handler->data;
+}
 
 /**
- * @defgroup Ecore_Main_Loop_Group Main Loop Functions
- *
- * These functions control the Ecore event handling loop.  This loop is
- * designed to work on embedded systems all the way to large and
- * powerful mutli-cpu workstations.
- *
- * It serialises all system signals and events into a single event
- * queue, that can be easily processed without needing to worry about
- * concurrency.  A properly written, event-driven program using this
- * kind of programming does not need threads.  It makes the program very
- * robust and easy to follow.
- *
- * Here is an example of simple program and its basic event loop flow:
- * @image html prog_flow.png
+ * @addtogroup Ecore_Main_Loop_Group
  *
- * For examples of setting up and using a main loop, see
- * @ref event_handler_example.c and @ref timer_example.c.
+ * @{
  */
 
 /**
  * Runs a single iteration of the main loop to process everything on the
  * queue.
- * @ingroup Ecore_Main_Loop_Group
+ *
+ * It does everything that is already done inside an @c Ecore main loop, like
+ * checking for expired timers, idlers, etc. But it will do it only once and
+ * return, instead of keep watching for new events.
+ *
+ * DO NOT use this function unless you are the person God comes to ask for
+ * advice when He has trouble managing the Universe.
+ *
+ * @see ecore_main_loop_iterate_may_block()
  */
 EAPI void
 ecore_main_loop_iterate(void)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+#ifndef USE_G_MAIN_LOOP
+   _ecore_lock();
+   _ecore_time_loop_time = ecore_time_get();
    _ecore_main_loop_iterate_internal(1);
+   _ecore_unlock();
+#else
+   g_main_context_iteration(NULL, 0);
+#endif
+}
+
+/**
+ * Runs a single iteration of the main loop to process everything on the
+ * queue with block/non-blocking status.
+ *
+ * @param may_block A flag if the main loop has a possibility of blocking.
+ * (@c EINA_TRUE = may block/@c EINA_FALSE = non block)
+ *
+ * This is an extension API for ecore_main_loop_iterate() with additional
+ * parameter. It does everything that is already done inside an
+ * @c Ecore main loop, like checking for expired timers, idlers, etc. But it
+ * will do it only once and return, instead of keep watching for new events.
+ *
+ * DO NOT use this function unless you are the person God comes to ask for
+ * advice when He has trouble managing the Universe.
+ *
+ * @see ecore_main_loop_iterate()
+ */
+EAPI int
+ecore_main_loop_iterate_may_block(int may_block)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+#ifndef USE_G_MAIN_LOOP
+   _ecore_lock();
+   _ecore_time_loop_time = ecore_time_get();
+in_main_loop++;
+   _ecore_main_loop_iterate_internal(!may_block);
+in_main_loop--;
+   _ecore_unlock();
+   return _ecore_event_exist();
+#else
+   return g_main_context_iteration(NULL, may_block);
+#endif
 }
 
 /**
  * Runs the application main loop.
  *
- * This function will not return until @ref ecore_main_loop_quit is called.
+ * This function will not return until @ref ecore_main_loop_quit is called. It
+ * will check for expired timers, idlers, file descriptors being watched by fd
+ * handlers, etc. Once everything is done, before entering again on idle state,
+ * any callback set as @c Idle_Enterer will be called.
  *
- * @ingroup Ecore_Main_Loop_Group
+ * Each main loop iteration is done by calling ecore_main_loop_iterate()
+ * internally.
+ *
+ * The polling (select) function used can be changed with
+ * ecore_main_loop_select_func_set().
+ *
+ * The function used to check for file descriptors, events, and that has a
+ * timeout for the timers can be changed using
+ * ecore_main_loop_select_func_set().
  */
 EAPI void
 ecore_main_loop_begin(void)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+#ifndef USE_G_MAIN_LOOP
+   _ecore_lock();
    in_main_loop++;
-   for (;do_quit == 0;) _ecore_main_loop_iterate_internal(0);
+   _ecore_time_loop_time = ecore_time_get();
+   while (do_quit == 0) _ecore_main_loop_iterate_internal(0);
    do_quit = 0;
    in_main_loop--;
+   _ecore_unlock();
+#else
+   if (!do_quit)
+     {
+        if (!ecore_main_loop)
+          ecore_main_loop = g_main_loop_new(NULL, FALSE);
+        g_main_loop_run(ecore_main_loop);
+     }
+   do_quit = 0;
+#endif
 }
 
 /**
  * Quits the main loop once all the events currently on the queue have
  * been processed.
- * @ingroup Ecore_Main_Loop_Group
+ *
+ * This function returns immediately, but will mark the ecore_main_loop_begin()
+ * function to return at the end of the current main loop iteration.
  */
 EAPI void
 ecore_main_loop_quit(void)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    do_quit = 1;
+#ifdef USE_G_MAIN_LOOP
+   if (ecore_main_loop)
+     g_main_loop_quit(ecore_main_loop);
+#endif
 }
 
 /**
- * @defgroup Ecore_FD_Handler_Group File Event Handling Functions
+ * Sets the function to use when monitoring multiple file descriptors,
+ * and waiting until one of more of the file descriptors before ready
+ * for some class of I/O operation.
  *
- * Functions that deal with file descriptor handlers.
+ * This function will be used instead of the system call select and
+ * could possible be used to integrate the Ecore event loop with an
+ * external event loop.
+ *
+ * @warning you don't know how to use, don't even try to use it.
+ *
+ * @param func The function to be used.
  */
+EAPI void
+ecore_main_loop_select_func_set(Ecore_Select_Function func)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   main_loop_select = func;
+}
 
 /**
- * Adds a callback for activity on the given file descriptor.
- *
- * @p func will be called during the execution of @ref ecore_main_loop_begin
- * when the file descriptor is available for reading, or writing, or both.
- *
- * Normally the return value from the @p func is "zero means this handler is
- * finished and can be deleted" as is usual for handler callbacks.  However,
- * if the @p buf_func is supplied, then the return value from the @p func is 
- * "non zero means the handler should be called again in a tight loop".
- *
- * @p buf_func is called during event loop handling to check if data that has
- * been read from the file descriptor is in a buffer and is available to
- * read.  Some systems (notably xlib) handle their own buffering, and would
- * otherwise not work with select().  These systems should use a @p buf_func.
- * This is a most annoying hack, only ecore_x uses it, so refer to that for
- * an example.  NOTE - @p func should probably return "one" always if 
- * @p buf_func is used, to avoid confusion with the other return value 
- * semantics.
+ * Gets the select function set by ecore_select_func_set(),
+ * or the native select function if none was set.
  *
- * @param   fd       The file descriptor to watch.
- * @param   flags    To watch it for read (@c ECORE_FD_READ) and/or
- *                   (@c ECORE_FD_WRITE) write ability.  @c ECORE_FD_ERROR
- *
- * @param   func     The callback function.
- * @param   data     The data to pass to the callback.
- * @param   buf_func The function to call to check if any data has been
- *                   buffered and already read from the fd.  Can be @c NULL.
- * @param   buf_data The data to pass to the @p buf_func function.
- * @return  A fd handler handle if successful.  @c NULL otherwise.
- * @ingroup Ecore_FD_Handler_Group
  */
+EAPI Ecore_Select_Function
+ecore_main_loop_select_func_get(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   return main_loop_select;
+}
+
 EAPI Ecore_Fd_Handler *
-ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, int (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data, int (*buf_func) (void *buf_data, Ecore_Fd_Handler *fd_handler), const void *buf_data)
+ecore_main_fd_handler_add(int                    fd,
+                          Ecore_Fd_Handler_Flags flags,
+                          Ecore_Fd_Cb            func,
+                          const void            *data,
+                          Ecore_Fd_Cb            buf_func,
+                          const void            *buf_data)
 {
-   Ecore_Fd_Handler *fdh;
+   Ecore_Fd_Handler *fdh = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
 
-   if ((fd < 0) ||
-       (flags == 0) ||
-       (!func)) return NULL;
-   fdh = calloc(1, sizeof(Ecore_Fd_Handler));
-   if (!fdh) return NULL;
+   if ((fd < 0) || (flags == 0) || (!func)) goto unlock;
+
+   fdh = ecore_fd_handler_calloc(1);
+   if (!fdh) goto unlock;
    ECORE_MAGIC_SET(fdh, ECORE_MAGIC_FD_HANDLER);
+   fdh->next_ready = NULL;
    fdh->fd = fd;
    fdh->flags = flags;
-   fdh->read_active = 0;
-   fdh->write_active = 0;
-   fdh->error_active = 0;
-   fdh->delete_me = 0;
+   if (_ecore_main_fdh_poll_add(fdh) < 0)
+     {
+        int err = errno;
+        ERR("Failed to add poll on fd %d (errno = %d: %s)!", fd, err, strerror(err));
+        ecore_fd_handler_mp_free(fdh);
+        fdh = NULL;
+        goto unlock;
+     }
+   fdh->read_active = EINA_FALSE;
+   fdh->write_active = EINA_FALSE;
+   fdh->error_active = EINA_FALSE;
+   fdh->delete_me = EINA_FALSE;
    fdh->func = func;
    fdh->data = (void *)data;
    fdh->buf_func = buf_func;
+   if (buf_func)
+     fd_handlers_with_buffer = eina_list_append(fd_handlers_with_buffer, fdh);
    fdh->buf_data = (void *)buf_data;
-   fd_handlers = _ecore_list2_append(fd_handlers, fdh);
+   fd_handlers = (Ecore_Fd_Handler *)
+     eina_inlist_append(EINA_INLIST_GET(fd_handlers),
+                        EINA_INLIST_GET(fdh));
+unlock:
+   _ecore_unlock();
+
    return fdh;
 }
 
-/**
- * Deletes the given FD handler.
- * @param   fd_handler The given FD handler.
- * @return  The data pointer set using @ref ecore_main_fd_handler_add,
- *          for @p fd_handler on success.  @c NULL otherwise.
- * @ingroup Ecore_FD_Handler_Group
- */
+EAPI Ecore_Fd_Handler *
+ecore_main_fd_handler_file_add(int                    fd,
+                               Ecore_Fd_Handler_Flags flags,
+                               Ecore_Fd_Cb            func,
+                               const void            *data,
+                               Ecore_Fd_Cb            buf_func,
+                               const void            *buf_data)
+{
+   Ecore_Fd_Handler *fdh = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+
+   if ((fd < 0) || (flags == 0) || (!func)) goto unlock;
+
+   fdh = ecore_fd_handler_calloc(1);
+   if (!fdh) goto unlock;
+   ECORE_MAGIC_SET(fdh, ECORE_MAGIC_FD_HANDLER);
+   fdh->next_ready = NULL;
+   fdh->fd = fd;
+   fdh->flags = flags;
+   fdh->file = EINA_TRUE;
+   if (_ecore_main_fdh_poll_add(fdh) < 0)
+     {
+        int err = errno;
+        ERR("Failed to add poll on fd %d (errno = %d: %s)!", fd, err, strerror(err));
+        ecore_fd_handler_mp_free(fdh);
+        fdh = NULL;
+        goto unlock;
+     }
+   fdh->read_active = EINA_FALSE;
+   fdh->write_active = EINA_FALSE;
+   fdh->error_active = EINA_FALSE;
+   fdh->delete_me = EINA_FALSE;
+   fdh->func = func;
+   fdh->data = (void *)data;
+   fdh->buf_func = buf_func;
+   if (buf_func)
+     fd_handlers_with_buffer = eina_list_append(fd_handlers_with_buffer, fdh);
+   fdh->buf_data = (void *)buf_data;
+   fd_handlers = (Ecore_Fd_Handler *)
+     eina_inlist_append(EINA_INLIST_GET(fd_handlers),
+                        EINA_INLIST_GET(fdh));
+   file_fd_handlers = eina_list_append(file_fd_handlers, fdh);
+unlock:
+   _ecore_unlock();
+
+   return fdh;
+}
+
+#ifdef _WIN32
+EAPI Ecore_Win32_Handler *
+ecore_main_win32_handler_add(void                 *h,
+                             Ecore_Win32_Handle_Cb func,
+                             const void           *data)
+{
+   Ecore_Win32_Handler *wh;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   if (!h || !func) return NULL;
+
+   wh = ecore_win32_handler_calloc(1);
+   if (!wh) return NULL;
+   ECORE_MAGIC_SET(wh, ECORE_MAGIC_WIN32_HANDLER);
+   wh->h = (HANDLE)h;
+   wh->delete_me = EINA_FALSE;
+   wh->func = func;
+   wh->data = (void *)data;
+   win32_handlers = (Ecore_Win32_Handler *)
+     eina_inlist_append(EINA_INLIST_GET(win32_handlers),
+                        EINA_INLIST_GET(wh));
+   return wh;
+}
+
+#else
+EAPI Ecore_Win32_Handler *
+ecore_main_win32_handler_add(void                 *h __UNUSED__,
+                             Ecore_Win32_Handle_Cb func __UNUSED__,
+                             const void           *data __UNUSED__)
+{
+   return NULL;
+}
+
+#endif
+
+EAPI void *
+ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
+{
+   void *ret = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+
+   if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
+     {
+        ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
+                         "ecore_main_fd_handler_del");
+        goto unlock;
+     }
+   ret = _ecore_main_fd_handler_del(fd_handler);
+unlock:
+   _ecore_unlock();
+   return ret;
+}
+
+#ifdef _WIN32
 EAPI void *
-ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
+ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler)
 {
-   if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   if (!ECORE_MAGIC_CHECK(win32_handler, ECORE_MAGIC_WIN32_HANDLER))
      {
-       ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
-                        "ecore_main_fd_handler_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(win32_handler, ECORE_MAGIC_WIN32_HANDLER,
+                         "ecore_main_win32_handler_del");
+        return NULL;
      }
-   fd_handler->delete_me = 1;
-   fd_handlers_delete_me = 1;
-   return fd_handler->data;
+   win32_handler->delete_me = EINA_TRUE;
+   win32_handlers_delete_me = EINA_TRUE;
+   return win32_handler->data;
+}
+
+#else
+EAPI void *
+ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler __UNUSED__)
+{
+   return NULL;
 }
 
+#endif
+
 EAPI void
-ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, void (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data)
+ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler,
+                                           Ecore_Fd_Prep_Cb  func,
+                                           const void       *data)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+
    if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
      {
-       ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
-                        "ecore_main_fd_handler_prepare_callback_set");
-       return;
+        ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
+                         "ecore_main_fd_handler_prepare_callback_set");
+        goto unlock;
      }
    fd_handler->prep_func = func;
-   fd_handler->prep_data = (void *) data;
+   fd_handler->prep_data = (void *)data;
+   if ((!fd_handlers_with_prep) ||
+       (fd_handlers_with_prep && (!eina_list_data_find(fd_handlers_with_prep, fd_handler))))
+     /* FIXME: THIS WILL NOT SCALE WITH LOTS OF PREP FUNCTIONS!!! */
+     fd_handlers_with_prep = eina_list_append(fd_handlers_with_prep, fd_handler);
+unlock:
+   _ecore_unlock();
 }
 
-/**
- * Retrieves the file descriptor that the given handler is handling.
- * @param   fd_handler The given FD handler.
- * @return  The file descriptor the handler is watching.
- * @ingroup Ecore_FD_Handler_Group
- */
 EAPI int
 ecore_main_fd_handler_fd_get(Ecore_Fd_Handler *fd_handler)
 {
+   int fd = -1;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(-1);
+   _ecore_lock();
+
    if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
      {
-       ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
-                        "ecore_main_fd_handler_fd_get");
-       return -1;
+        ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
+                         "ecore_main_fd_handler_fd_get");
+        goto unlock;
      }
-   return fd_handler->fd;
+   fd = fd_handler->fd;
+unlock:
+   _ecore_unlock();
+   return fd;
 }
 
-/**
- * Return if read, write or error, or a combination thereof, is active on the
- * file descriptor of the given FD handler.
- * @param   fd_handler The given FD handler.
- * @param   flags      The flags, @c ECORE_FD_READ, @c ECORE_FD_WRITE or
- *                     @c ECORE_FD_ERROR to query.
- * @return  @c 1 if any of the given flags are active. @c 0 otherwise.
- * @ingroup Ecore_FD_Handler_Group
- */
-EAPI int
-ecore_main_fd_handler_active_get(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags)
+EAPI Eina_Bool
+ecore_main_fd_handler_active_get(Ecore_Fd_Handler      *fd_handler,
+                                 Ecore_Fd_Handler_Flags flags)
 {
-   int ret;
+   int ret = EINA_FALSE;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(EINA_FALSE);
+   _ecore_lock();
 
    if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
      {
-       ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
-                        "ecore_main_fd_handler_active_get");
-       return 0;
+        ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
+                         "ecore_main_fd_handler_active_get");
+        goto unlock;
      }
-   ret = 0;
-   if ((flags & ECORE_FD_READ) && (fd_handler->read_active)) ret = 1;
-   if ((flags & ECORE_FD_WRITE) && (fd_handler->write_active)) ret = 1;
-   if ((flags & ECORE_FD_ERROR) && (fd_handler->error_active)) ret = 1;
+   if ((flags & ECORE_FD_READ) && (fd_handler->read_active)) ret = EINA_TRUE;
+   if ((flags & ECORE_FD_WRITE) && (fd_handler->write_active)) ret = EINA_TRUE;
+   if ((flags & ECORE_FD_ERROR) && (fd_handler->error_active)) ret = EINA_TRUE;
+unlock:
+   _ecore_unlock();
    return ret;
 }
 
-/**
- * Set what active streams the given FD handler should be monitoring.
- * @param   fd_handler The given FD handler.
- * @param   flags      The flags to be watching.
- * @ingroup Ecore_FD_Handler_Group
- */
 EAPI void
-ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags)
+ecore_main_fd_handler_active_set(Ecore_Fd_Handler      *fd_handler,
+                                 Ecore_Fd_Handler_Flags flags)
 {
+   int ret;
+
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+
    if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
      {
-       ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
-                        "ecore_main_fd_handler_active_set");
-       return;
+        ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
+                         "ecore_main_fd_handler_active_set");
+        goto unlock;
      }
    fd_handler->flags = flags;
+   ret = _ecore_main_fdh_poll_modify(fd_handler);
+   if (ret < 0)
+     {
+        ERR("Failed to mod epoll fd %d: %s!", fd_handler->fd, strerror(ret));
+     }
+unlock:
+   _ecore_unlock();
 }
 
+/**
+ * @}
+ */
+
 void
 _ecore_main_shutdown(void)
 {
    if (in_main_loop)
      {
-       fprintf(stderr,
-               "\n"
-               "*** ECORE WARINING: Calling ecore_shutdown() while still in the main loop.\n"
-               "***                 Program may crash or behave strangely now.\n");
-       return;
+        ERR("\n"
+            "*** ECORE WARNING: Calling ecore_shutdown() while still in the main loop.\n"
+            "***                 Program may crash or behave strangely now.");
+        return;
      }
    while (fd_handlers)
      {
-       Ecore_Fd_Handler *fdh;
+        Ecore_Fd_Handler *fdh;
+
+        fdh = fd_handlers;
+        fd_handlers = (Ecore_Fd_Handler *)eina_inlist_remove(EINA_INLIST_GET(fd_handlers),
+                                                             EINA_INLIST_GET(fdh));
+        ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
+        ecore_fd_handler_mp_free(fdh);
+     }
+   if (fd_handlers_with_buffer)
+     fd_handlers_with_buffer = eina_list_free(fd_handlers_with_buffer);
+   if (fd_handlers_with_prep)
+     fd_handlers_with_prep = eina_list_free(fd_handlers_with_prep);
+   if (fd_handlers_to_delete)
+     fd_handlers_to_delete = eina_list_free(fd_handlers_to_delete);
+   if (file_fd_handlers)
+     file_fd_handlers = eina_list_free(file_fd_handlers);
+
+   fd_handlers_to_call = NULL;
+   fd_handlers_to_call_current = NULL;
+   fd_handlers_to_delete = NULL;
+   fd_handler_current = NULL;
+
+#ifdef _WIN32
+   while (win32_handlers)
+     {
+        Ecore_Win32_Handler *wh;
+
+        wh = win32_handlers;
+        win32_handlers = (Ecore_Win32_Handler *)eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
+                                                                   EINA_INLIST_GET(wh));
+        ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
+        ecore_win32_handler_mp_free(wh);
+     }
+   win32_handlers_delete_me = EINA_FALSE;
+   win32_handler_current = NULL;
+#endif
+}
+
+static void
+_ecore_main_prepare_handlers(void)
+{
+   Ecore_Fd_Handler *fdh;
+   Eina_List *l, *l2;
 
-       fdh = fd_handlers;
-       fd_handlers = _ecore_list2_remove(fd_handlers, fdh);
-       ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
-       free(fdh);
+   /* call the prepare callback for all handlers with prep functions */
+   EINA_LIST_FOREACH_SAFE(fd_handlers_with_prep, l, l2, fdh)
+     {
+        if (!fdh)
+          {
+             fd_handlers_with_prep = eina_list_remove_list(l, fd_handlers_with_prep);
+             continue;
+          }
+        if (!fdh->delete_me && fdh->prep_func)
+          {
+             fdh->references++;
+             _ecore_call_prep_cb(fdh->prep_func, fdh->prep_data, fdh);
+             fdh->references--;
+          }
+        else
+          fd_handlers_with_prep = eina_list_remove_list(fd_handlers_with_prep, l);
      }
-   fd_handlers_delete_me = 0;
 }
 
+#ifndef USE_G_MAIN_LOOP
 static int
 _ecore_main_select(double timeout)
 {
    struct timeval tv, *t;
-   fd_set         rfds, wfds, exfds;
-   int            max_fd;
-   int            ret;
-   Ecore_List2    *l;
+   fd_set rfds, wfds, exfds;
+   Ecore_Fd_Handler *fdh;
+   Eina_List *l;
+   int max_fd;
+   int ret;
 
    t = NULL;
-   if ((!finite(timeout)) || (timeout == 0.0))  /* finite() tests for NaN, too big, too small, and infinity.  */
+   if ((!ECORE_FINITE(timeout)) || (timeout == 0.0)) /* finite() tests for NaN, too big, too small, and infinity.  */
      {
-       tv.tv_sec = 0;
-       tv.tv_usec = 0;
-       t = &tv;
+        tv.tv_sec = 0;
+        tv.tv_usec = 0;
+        t = &tv;
      }
    else if (timeout > 0.0)
      {
-       int sec, usec;
+        int sec, usec;
 
 #ifdef FIX_HZ
-       timeout += (0.5 / HZ);
-       sec = (int)timeout;
-       usec = (int)((timeout - (double)sec) * 1000000);
+        timeout += (0.5 / HZ);
+        sec = (int)timeout;
+        usec = (int)((timeout - (double)sec) * 1000000);
 #else
-       sec = (int)timeout;
-       usec = (int)((timeout - (double)sec) * 1000000);
+        sec = (int)timeout;
+        usec = (int)((timeout - (double)sec) * 1000000);
 #endif
-       tv.tv_sec = sec;
-       tv.tv_usec = usec;
-       t = &tv;
+        tv.tv_sec = sec;
+        tv.tv_usec = usec;
+        t = &tv;
      }
    max_fd = 0;
    FD_ZERO(&rfds);
@@ -321,373 +1407,709 @@ _ecore_main_select(double timeout)
    FD_ZERO(&exfds);
 
    /* call the prepare callback for all handlers */
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
-     {
-       Ecore_Fd_Handler *fdh;
-
-       fdh = (Ecore_Fd_Handler *)l;
+   if (fd_handlers_with_prep)
+     _ecore_main_prepare_handlers();
 
-       if (!fdh->delete_me && fdh->prep_func)
-               fdh->prep_func (fdh->prep_data, fdh);
+   if (!HAVE_EPOLL || epoll_fd < 0)
+     {
+        EINA_INLIST_FOREACH(fd_handlers, fdh)
+          {
+             if (!fdh->delete_me)
+               {
+                  if (fdh->flags & ECORE_FD_READ)
+                    {
+                       FD_SET(fdh->fd, &rfds);
+                       if (fdh->fd > max_fd) max_fd = fdh->fd;
+                    }
+                  if (fdh->flags & ECORE_FD_WRITE)
+                    {
+                       FD_SET(fdh->fd, &wfds);
+                       if (fdh->fd > max_fd) max_fd = fdh->fd;
+                    }
+                  if (fdh->flags & ECORE_FD_ERROR)
+                    {
+                       FD_SET(fdh->fd, &exfds);
+                       if (fdh->fd > max_fd) max_fd = fdh->fd;
+                    }
+               }
+          }
      }
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
+   else
      {
-       Ecore_Fd_Handler *fdh;
-
-       fdh = (Ecore_Fd_Handler *)l;
-       if (fdh->flags & ECORE_FD_READ)
-         {
-            FD_SET(fdh->fd, &rfds);
-            if (fdh->fd > max_fd) max_fd = fdh->fd;
-         }
-       if (fdh->flags & ECORE_FD_WRITE)
-         {
-            FD_SET(fdh->fd, &wfds);
-            if (fdh->fd > max_fd) max_fd = fdh->fd;
-         }
-       if (fdh->flags & ECORE_FD_ERROR)
-         {
-            FD_SET(fdh->fd, &exfds);
-            if (fdh->fd > max_fd) max_fd = fdh->fd;
-         }
+        /* polling on the epoll fd will wake when an fd in the epoll set is active */
+         max_fd = _ecore_get_epoll_fd();
+         FD_SET(max_fd, &rfds);
      }
+   EINA_LIST_FOREACH(file_fd_handlers, l, fdh)
+     if (!fdh->delete_me)
+       {
+          if (fdh->flags & ECORE_FD_READ)
+            {
+               FD_SET(fdh->fd, &rfds);
+               if (fdh->fd > max_fd) max_fd = fdh->fd;
+            }
+          if (fdh->flags & ECORE_FD_WRITE)
+            {
+               FD_SET(fdh->fd, &wfds);
+               if (fdh->fd > max_fd) max_fd = fdh->fd;
+            }
+          if (fdh->flags & ECORE_FD_ERROR)
+            {
+               FD_SET(fdh->fd, &exfds);
+               if (fdh->fd > max_fd) max_fd = fdh->fd;
+            }
+          if (fdh->fd > max_fd) max_fd = fdh->fd;
+       }
    if (_ecore_signal_count_get()) return -1;
-   ret = select(max_fd + 1, &rfds, &wfds, &exfds, t);
+
+   _ecore_unlock();
+   ret = main_loop_select(max_fd + 1, &rfds, &wfds, &exfds, t);
+   _ecore_lock();
+
+   _ecore_time_loop_time = ecore_time_get();
    if (ret < 0)
      {
-       if (errno == EINTR) return -1;
+#ifndef _WIN32
+        if (errno == EINTR) return -1;
+        else if (errno == EBADF)
+          _ecore_main_fd_handlers_bads_rem();
+#endif
      }
    if (ret > 0)
      {
-       for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
-         {
-            Ecore_Fd_Handler *fdh;
-
-            fdh = (Ecore_Fd_Handler *)l;
-            if (!fdh->delete_me)
-              {
-                 if (FD_ISSET(fdh->fd, &rfds))
-                   fdh->read_active = 1;
-                 if (FD_ISSET(fdh->fd, &wfds))
-                   fdh->write_active = 1;
-                 if (FD_ISSET(fdh->fd, &exfds))
-                   fdh->error_active = 1;
-              }
-         }
-       _ecore_main_fd_handlers_cleanup();
-       return 1;
+        if (HAVE_EPOLL && epoll_fd >= 0)
+          _ecore_main_fdh_epoll_mark_active();
+        else
+          {
+             EINA_INLIST_FOREACH(fd_handlers, fdh)
+               {
+                  if (!fdh->delete_me)
+                    {
+                       if (FD_ISSET(fdh->fd, &rfds))
+                         fdh->read_active = EINA_TRUE;
+                       if (FD_ISSET(fdh->fd, &wfds))
+                         fdh->write_active = EINA_TRUE;
+                       if (FD_ISSET(fdh->fd, &exfds))
+                         fdh->error_active = EINA_TRUE;
+                       _ecore_try_add_to_call_list(fdh);
+                    }
+               }
+          }
+        EINA_LIST_FOREACH(file_fd_handlers, l, fdh)
+          {
+             if (!fdh->delete_me)
+               {
+                  if (FD_ISSET(fdh->fd, &rfds))
+                    fdh->read_active = EINA_TRUE;
+                  if (FD_ISSET(fdh->fd, &wfds))
+                    fdh->write_active = EINA_TRUE;
+                  if (FD_ISSET(fdh->fd, &exfds))
+                    fdh->error_active = EINA_TRUE;
+                  _ecore_try_add_to_call_list(fdh);
+               }
+          }
+        _ecore_main_fd_handlers_cleanup();
+#ifdef _WIN32
+        _ecore_main_win32_handlers_cleanup();
+#endif
+        return 1;
      }
    return 0;
 }
 
+#endif
+
+#ifndef _WIN32
+# ifndef USE_G_MAIN_LOOP
 static void
-_ecore_main_fd_handlers_cleanup(void)
+_ecore_main_fd_handlers_bads_rem(void)
 {
-   Ecore_List2 *l;
+   Ecore_Fd_Handler *fdh;
+   Eina_Inlist *l;
+   int found = 0;
 
-   if (!fd_handlers_delete_me) return;
-   for (l = (Ecore_List2 *)fd_handlers; l;)
+   ERR("Removing bad fds");
+   for (l = EINA_INLIST_GET(fd_handlers); l; )
      {
-       Ecore_Fd_Handler *fdh;
+        fdh = (Ecore_Fd_Handler *)l;
+        l = l->next;
+        errno = 0;
 
-       fdh = (Ecore_Fd_Handler *)l;
-       l = l->next;
-       if (fdh->delete_me)
-         {
-            fd_handlers = _ecore_list2_remove(fd_handlers, fdh);
-            ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
-            free(fdh);
-         }
+        if ((fcntl(fdh->fd, F_GETFD) < 0) && (errno == EBADF))
+          {
+             ERR("Found bad fd at index %d", fdh->fd);
+             if (fdh->flags & ECORE_FD_ERROR)
+               {
+                  ERR("Fd set for error! calling user");
+                  fdh->references++;
+                  if (!_ecore_call_fd_cb(fdh->func, fdh->data, fdh))
+                    {
+                       ERR("Fd function err returned 0, remove it");
+                       if (!fdh->delete_me)
+                         {
+                            fdh->delete_me = EINA_TRUE;
+                            fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
+                         }
+                       found++;
+                    }
+                  fdh->references--;
+               }
+             else
+               {
+                  ERR("Problematic fd found at %d! setting it for delete", fdh->fd);
+                  if (!fdh->delete_me)
+                    {
+                       fdh->delete_me = EINA_TRUE;
+                       fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
+                    }
+
+                  found++;
+               }
+          }
+     }
+   if (found == 0)
+     {
+#  ifdef HAVE_GLIB
+        ERR("No bad fd found. Maybe a foreign fd from glib?");
+#  else
+        ERR("No bad fd found. EEEK!");
+#  endif
      }
-   fd_handlers_delete_me = 0;
+   _ecore_main_fd_handlers_cleanup();
 }
 
+# endif
+#endif
+
 static void
-_ecore_main_fd_handlers_call(void)
+_ecore_main_fd_handlers_cleanup(void)
 {
-   Ecore_List2    *l;
+   Ecore_Fd_Handler *fdh;
+   Eina_List *l, *l2;
 
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
+   if (!fd_handlers_to_delete) return;
+   EINA_LIST_FOREACH_SAFE(fd_handlers_to_delete, l, l2, fdh)
      {
-       Ecore_Fd_Handler *fdh;
-
-       fdh = (Ecore_Fd_Handler *)l;
-       if (!fdh->delete_me)
-         {
-            if ((fdh->read_active) ||
-                (fdh->write_active) ||
-                (fdh->error_active))
-              {
-                 if (!fdh->func(fdh->data, fdh))
-                   {
-                      fdh->delete_me = 1;
-                      fd_handlers_delete_me = 1;
-                   }
-                 fdh->read_active = 0;
-                 fdh->write_active = 0;
-                 fdh->error_active = 0;
-              }
-         }
+        if (!fdh)
+          {
+             fd_handlers_to_delete = eina_list_remove_list(l, fd_handlers_to_delete);
+             continue;
+          }
+        /* fdh->delete_me should be set for all fdhs at the start of the list */
+        if (fdh->references)
+          continue;
+        if (fdh->buf_func && fd_handlers_with_buffer)
+          fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fdh);
+        if (fdh->prep_func && fd_handlers_with_prep)
+          fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fdh);
+        fd_handlers = (Ecore_Fd_Handler *)
+          eina_inlist_remove(EINA_INLIST_GET(fd_handlers), EINA_INLIST_GET(fdh));
+        if (fdh->file)
+          file_fd_handlers = eina_list_remove(file_fd_handlers, fdh);
+        ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
+        ecore_fd_handler_mp_free(fdh);
+        fd_handlers_to_delete = eina_list_remove_list(fd_handlers_to_delete, l);
      }
 }
 
-static int
-_ecore_main_fd_handlers_buf_call(void)
+#ifdef _WIN32
+static void
+_ecore_main_win32_handlers_cleanup(void)
 {
-   Ecore_List2    *l;
-   int ret;
+   Ecore_Win32_Handler *wh;
+   Eina_Inlist *l;
+   int deleted_in_use = 0;
 
-   ret = 0;
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
-     {
-       Ecore_Fd_Handler *fdh;
-
-       fdh = (Ecore_Fd_Handler *)l;
-       if (!fdh->delete_me)
-         {
-            if (fdh->buf_func)
-              {
-                 if (fdh->buf_func(fdh->buf_data, fdh))
-                   {
-                      ret |= fdh->func(fdh->data, fdh);
-                      fdh->read_active = 1;
-                   }
-              }
-         }
+   if (!win32_handlers_delete_me) return;
+   for (l = EINA_INLIST_GET(win32_handlers); l; )
+     {
+        wh = (Ecore_Win32_Handler *)l;
+
+        l = l->next;
+        if (wh->delete_me)
+          {
+             if (wh->references)
+               {
+                  deleted_in_use++;
+                  continue;
+               }
+
+             win32_handlers = (Ecore_Win32_Handler *)
+               eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
+                                  EINA_INLIST_GET(wh));
+             ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
+             ecore_win32_handler_mp_free(wh);
+          }
      }
-   return ret;
+   if (!deleted_in_use) win32_handlers_delete_me = EINA_FALSE;
 }
 
-static int
-_ecore_main_win32_message(double timeout)
+#endif
+
+static void
+_ecore_main_fd_handlers_call(void)
 {
-#ifdef _WIN32
-   MSG msg;
+   /* grab a new list */
+    if (!fd_handlers_to_call_current)
+      {
+         fd_handlers_to_call_current = fd_handlers_to_call;
+         fd_handlers_to_call = NULL;
+      }
 
-   if (!finite(timeout))
-     timeout = 0.0;
+    while (fd_handlers_to_call_current)
+      {
+         Ecore_Fd_Handler *fdh = fd_handlers_to_call_current;
 
-   if (timeout < 0.0)
-     {
-       for (;;)
-         {
-            if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
-              return 1;
-         }
-     }
-   else
-     {
-        double start;
-        double t;
+         if (!fdh->delete_me)
+           {
+              if ((fdh->read_active) ||
+                  (fdh->write_active) ||
+                  (fdh->error_active))
+                {
+                   fdh->references++;
+                   if (!_ecore_call_fd_cb(fdh->func, fdh->data, fdh))
+                     {
+                        if (!fdh->delete_me)
+                          {
+                             fdh->delete_me = EINA_TRUE;
+                             fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
+                          }
+                     }
+                   fdh->references--;
+                   _ecore_fd_valid();
 
-        start = ecore_time_get();
-        while ((t = ecore_time_get()) < (start + timeout))
-          {
-             if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
-               return 1;
-          }
-     }
-#endif /* _WIN32 */
+                   fdh->read_active = EINA_FALSE;
+                   fdh->write_active = EINA_FALSE;
+                   fdh->error_active = EINA_FALSE;
+                }
+           }
 
-   return 0;
+         /* stop when we point to ourselves */
+         if (fdh->next_ready == fdh)
+           {
+              fdh->next_ready = NULL;
+              fd_handlers_to_call_current = NULL;
+              break;
+           }
+
+         fd_handlers_to_call_current = fdh->next_ready;
+         fdh->next_ready = NULL;
+      }
 }
 
 static int
-_ecore_main_win32_message_buf_call(void)
+_ecore_main_fd_handlers_buf_call(void)
 {
-#ifdef _WIN32
-   MSG msg;
+   Ecore_Fd_Handler *fdh;
+   Eina_List *l, *l2;
    int ret;
 
    ret = 0;
-   if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+   EINA_LIST_FOREACH_SAFE(fd_handlers_with_buffer, l, l2, fdh)
      {
-        if ((msg.message & 0xffff) < 0xC000)
+        if (!fdh)
           {
-             TranslateMessage(&msg);
-             DispatchMessage(&msg);
+             fd_handlers_with_buffer = eina_list_remove_list(l, fd_handlers_with_buffer);
+             continue;
           }
-        ret = 1;
+        if ((!fdh->delete_me) && fdh->buf_func)
+          {
+             fdh->references++;
+             if (_ecore_call_fd_cb(fdh->buf_func, fdh->buf_data, fdh))
+               {
+                  ret |= _ecore_call_fd_cb(fdh->func, fdh->data, fdh);
+                  fdh->read_active = EINA_TRUE;
+                  _ecore_try_add_to_call_list(fdh);
+               }
+             fdh->references--;
+          }
+        else
+          fd_handlers_with_buffer = eina_list_remove_list(fd_handlers_with_buffer, l);
      }
-
    return ret;
-#else
-   return 0;
-#endif /* _WIN32 */
+}
+
+#ifndef USE_G_MAIN_LOOP
+
+enum {
+   SPIN_MORE,
+   SPIN_RESTART,
+   LOOP_CONTINUE
+};
+
+static int
+_ecore_main_loop_spin_core(void)
+{
+   /* as we are spinning we need to update loop time per spin */
+    _ecore_time_loop_time = ecore_time_get();
+    /* call all idlers, which returns false if no more idelrs exist */
+    if (!_ecore_idler_all_call()) return SPIN_RESTART;
+    /* sneaky - drop through or if checks - the first one to succeed
+     * drops through and returns "continue" so further ones dont run */
+    if ((_ecore_main_select(0.0) > 0) || (_ecore_event_exist()) ||
+        (_ecore_signal_count_get() > 0) || (do_quit))
+      return LOOP_CONTINUE;
+    /* default - spin more */
+    return SPIN_MORE;
+}
+
+static int
+_ecore_main_loop_spin_no_timers(void)
+{
+   /* if we have idlers we HAVE to spin and handle everything
+    * in a polling way - spin in a tight polling loop */
+     for (;; )
+       {
+          int action = _ecore_main_loop_spin_core();
+          if (action != SPIN_MORE) return action;
+          /* if an idler has added a timer then we need to go through
+           * the start of the spin cycle again to handle cases properly */
+          if (_ecore_timers_exists()) return SPIN_RESTART;
+       }
+     /* just contiune handling events etc. */
+     return LOOP_CONTINUE;
+}
+
+static int
+_ecore_main_loop_spin_timers(void)
+{
+   /* if we have idlers we HAVE to spin and handle everything
+    * in a polling way - spin in a tight polling loop */
+     for (;; )
+       {
+          int action = _ecore_main_loop_spin_core();
+          if (action != SPIN_MORE) return action;
+          /* if next timer expires now or in the past - stop spinning and
+           * continue the mainloop walk as our "select" timeout has
+           * expired now */
+          if (_ecore_timer_next_get() <= 0.0) return LOOP_CONTINUE;
+       }
+     /* just contiune handling events etc. */
+     return LOOP_CONTINUE;
+}
+
+static void
+_ecore_fps_marker_1(void)
+{
+   if (!_ecore_fps_debug) return;
+   t2 = ecore_time_get();
+   if ((t1 > 0.0) && (t2 > 0.0)) _ecore_fps_debug_runtime_add(t2 - t1);
+}
+
+static void
+_ecore_fps_marker_2(void)
+{
+   if (!_ecore_fps_debug) return;
+   t1 = ecore_time_get();
 }
 
 static void
 _ecore_main_loop_iterate_internal(int once_only)
 {
-   double next_time;
-   int    have_event = 0;
-   int    have_signal;
-   int    have_msg = 0;
+   double next_time = -1.0;
 
    in_main_loop++;
    /* expire any timers */
-     {
-       double now;
+   _ecore_timer_expired_timers_call(_ecore_time_loop_time);
+   _ecore_timer_cleanup();
 
-       now = ecore_time_get();
-       while (_ecore_timer_call(now));
-       _ecore_timer_cleanup();
-     }
-   /* any timers re-added as a result of these are allowed to go */
-   _ecore_timer_enable_new();
    /* process signals into events .... */
-   while (_ecore_signal_count_get()) _ecore_signal_call();
+   _ecore_signal_received_process();
+   /* if as a result of timers/animators or signals we have accumulated
+    * events, then instantly handle them */
    if (_ecore_event_exist())
      {
-       have_event = 1;
-       have_signal = 1;
-       have_msg = 1;
-       _ecore_main_select(0.0);
-       _ecore_main_win32_message(0.0);
-       goto process_events;
+        /* but first conceptually enter an idle state */
+        _ecore_idle_enterer_call();
+        _ecore_throttle();
+        /* now quickly poll to see which input fd's are active */
+        _ecore_main_select(0.0);
+        /* allow newly queued timers to expire from now on */
+        _ecore_timer_enable_new();
+        /* go straight to processing the events we had queued */
+        goto process_all;
+     }
+
+   if (once_only)
+     {
+        /* in once_only mode we should quickly poll for inputs, signals
+         * if we got any events or signals, allow new timers to process.
+         * use bitwise or to force both conditions to be tested and
+         * merged together */
+        if (_ecore_main_select(0.0) | _ecore_signal_count_get())
+          {
+             _ecore_timer_enable_new();
+             goto process_all;
+          }
      }
-   /* call idle enterers ... */
-   if (!once_only)
-     _ecore_idle_enterer_call();
    else
      {
-       have_event = have_signal = have_msg = 0;
-
-       if (_ecore_main_select(0.0) > 0) have_event = 1;
-
-       if (_ecore_main_win32_message(0.0) > 0) have_msg = 1;
-       if (_ecore_signal_count_get() > 0) have_signal = 1;
-
-       if (have_signal || have_event || have_msg)
-         goto process_events;
+        /* call idle enterers ... */
+        _ecore_idle_enterer_call();
+        _ecore_throttle();
      }
 
    /* if these calls caused any buffered events to appear - deal with them */
-   while (_ecore_main_fd_handlers_buf_call());
-   while (_ecore_main_win32_message_buf_call());
+   if (fd_handlers_with_buffer)
+     _ecore_main_fd_handlers_buf_call();
 
-   /* if ther are any - jump to processing them */
+   /* if there are any (buffered fd handling may generate them)
+    * then jump to processing them */
    if (_ecore_event_exist())
      {
-       have_event = 1;
-       have_signal = 1;
-       have_msg = 1;
-       _ecore_main_select(0.0);
-       _ecore_main_win32_message(0.0);
-       goto process_events;
+        _ecore_main_select(0.0);
+        _ecore_timer_enable_new();
+        goto process_all;
      }
+
    if (once_only)
      {
-       _ecore_idle_enterer_call();
-       in_main_loop--;
-       return;
+        /* in once_only mode enter idle here instead and then return */
+        _ecore_idle_enterer_call();
+        _ecore_throttle();
+        _ecore_timer_enable_new();
+        goto done;
      }
 
-   if (_ecore_fps_debug)
-     {
-       t2 = ecore_time_get();
-       if ((t1 > 0.0) && (t2 > 0.0))
-         _ecore_fps_debug_runtime_add(t2 - t1);
-     }
-   start_loop:
+   _ecore_fps_marker_1();
+
+   /* start of the sleeping or looping section */
+start_loop: /***************************************************************/
+   /* any timers re-added as a result of these are allowed to go */
+   _ecore_timer_enable_new();
+   /* if we have been asked to quit the mainloop then exit at this point */
    if (do_quit)
      {
-       in_main_loop--;
-       return;
+        _ecore_timer_enable_new();
+        goto done;
      }
    if (!_ecore_event_exist())
      {
-       /* init flags */
-       have_event = have_signal = have_msg = 0;
-       next_time = _ecore_timer_next_get();
-       /* no timers */
-       if (next_time < 0)
-         {
-            /* no idlers */
-            if (!_ecore_idler_exist())
-              {
-                 if (_ecore_main_select(-1.0) > 0) have_event = 1;
-                 if (_ecore_main_win32_message(-1.0) > 0) have_msg = 1;
-                 if (_ecore_signal_count_get() > 0) have_signal = 1;
-              }
-            /* idlers */
-            else
-              {
-                 for (;;)
-                   {
-                      if (!_ecore_idler_call()) goto start_loop;
-                      if (_ecore_event_exist()) break;
-                      if (_ecore_main_select(0.0) > 0) have_event = 1;
-                      if (_ecore_main_win32_message(0.0) > 0) have_msg = 1;
-                      if (_ecore_signal_count_get() > 0) have_signal = 1;
-                      if (have_event || have_signal || have_msg) break;
-                      next_time = _ecore_timer_next_get();
-                      if (next_time >= 0) goto start_loop;
-                      if (do_quit) break;
-                   }
-              }
-         }
-       /* timers */
-       else
-         {
-            /* no idlers */
-            if (!_ecore_idler_exist())
-              {
-                 if (_ecore_main_select(next_time) > 0) have_event = 1;
-                 if (_ecore_main_win32_message(next_time) > 0) have_msg = 1;
-                 if (_ecore_signal_count_get() > 0) have_signal = 1;
-              }
-            /* idlers */
-            else
-              {
-                 for (;;)
-                   {
-                      double cur_time, t;
-
-                      if (!_ecore_idler_call()) goto start_loop;
-                      if (_ecore_event_exist()) break;
-                      if (_ecore_main_select(0.0) > 0) have_event = 1;
-                      if (_ecore_main_win32_message(0.0) > 0) have_msg = 1;
-                      if (_ecore_signal_count_get() > 0) have_signal = 1;
-                      if (have_event || have_signal || have_msg) break;
-                      cur_time = ecore_time_get();
-                      t = ecore_time_get() - cur_time;
-                      if (t >= next_time) break;
-                      next_time = _ecore_timer_next_get();
-                      if (next_time < 0) goto start_loop;
-                      if (do_quit) break;
-                   }
-              }
-         }
-     }
-   if (_ecore_fps_debug)
-     {
-       t1 = ecore_time_get();
+        /* init flags */
+        next_time = _ecore_timer_next_get();
+        /* no idlers */
+        if (!_ecore_idler_exist())
+          {
+             /* sleep until timeout or forever (-1.0) waiting for on fds */
+             _ecore_main_select(next_time);
+          }
+        else
+          {
+             int action = LOOP_CONTINUE;
+
+             /* no timers - spin */
+             if (next_time < 0) action = _ecore_main_loop_spin_no_timers();
+             /* timers - spin */
+             else action = _ecore_main_loop_spin_timers();
+             if (action == SPIN_RESTART) goto start_loop;
+          }
      }
+   _ecore_fps_marker_2();
+
+   /* actually wake up and deal with input, events etc. */
+process_all: /***********************************************************/
+
    /* we came out of our "wait state" so idle has exited */
-   if (!once_only)
-     _ecore_idle_exiter_call();
+   if (!once_only) _ecore_idle_exiter_call();
    /* call the fd handler per fd that became alive... */
    /* this should read or write any data to the monitored fd and then */
    /* post events onto the ecore event pipe if necessary */
-   process_events:
-   if (have_event) _ecore_main_fd_handlers_call();
-   do
-     {
-       /* process signals into events .... */
-       while (_ecore_signal_count_get()) _ecore_signal_call();
-       /* handle events ... */
-       _ecore_event_call();
-       _ecore_main_fd_handlers_cleanup();
-     }
-   while (_ecore_main_fd_handlers_buf_call());
-   if (have_msg) _ecore_main_win32_message_buf_call();
-   while (_ecore_main_win32_message_buf_call());
-/* ok - too much optimising. let's call idle enterers more often. if we
- * have events that place more events or jobs etc. on the event queue
- * we may never get to call an idle enterer
+   _ecore_main_fd_handlers_call();
+   if (fd_handlers_with_buffer) _ecore_main_fd_handlers_buf_call();
+   /* process signals into events .... */
+   _ecore_signal_received_process();
+   /* handle events ... */
+   _ecore_event_call();
+   _ecore_main_fd_handlers_cleanup();
+
    if (once_only)
- */
-     _ecore_idle_enterer_call();
+     {
+        /* if in once_only mode handle idle exiting */
+        _ecore_idle_enterer_call();
+        _ecore_throttle();
+     }
+
+done: /*******************************************************************/
    in_main_loop--;
 }
+
+#endif
+
+#ifdef _WIN32
+static int
+_ecore_main_win32_select(int             nfds __UNUSED__,
+                         fd_set         *readfds,
+                         fd_set         *writefds,
+                         fd_set         *exceptfds,
+                         struct timeval *tv)
+{
+   HANDLE objects[MAXIMUM_WAIT_OBJECTS];
+   int sockets[MAXIMUM_WAIT_OBJECTS];
+   Ecore_Fd_Handler *fdh;
+   Ecore_Win32_Handler *wh;
+   unsigned int objects_nbr = 0;
+   unsigned int handles_nbr = 0;
+   unsigned int events_nbr = 0;
+   DWORD result;
+   DWORD timeout;
+   MSG msg;
+   unsigned int i;
+   int res;
+
+   /* Create an event object per socket */
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
+     {
+        WSAEVENT event;
+        long network_event;
+
+        network_event = 0;
+        if (readfds)
+          {
+             if (FD_ISSET(fdh->fd, readfds))
+               network_event |= FD_READ;
+          }
+        if (writefds)
+          {
+             if (FD_ISSET(fdh->fd, writefds))
+               network_event |= FD_WRITE;
+          }
+        if (exceptfds)
+          {
+             if (FD_ISSET(fdh->fd, exceptfds))
+               network_event |= FD_OOB;
+          }
+
+        if (network_event)
+          {
+             event = WSACreateEvent();
+             WSAEventSelect(fdh->fd, event, network_event);
+             objects[objects_nbr] = event;
+             sockets[events_nbr] = fdh->fd;
+             events_nbr++;
+             objects_nbr++;
+          }
+     }
+
+   /* store the HANDLEs in the objects to wait for */
+   EINA_INLIST_FOREACH(win32_handlers, wh)
+     {
+        objects[objects_nbr] = wh->h;
+        handles_nbr++;
+        objects_nbr++;
+     }
+
+   /* Empty the queue before waiting */
+   while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+     {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+     }
+
+   /* Wait for any message sent or posted to this queue */
+   /* or for one of the passed handles be set to signaled. */
+   if (!tv)
+     timeout = INFINITE;
+   else
+     timeout = (DWORD)((tv->tv_sec * 1000.0) + (tv->tv_usec / 1000.0));
+
+   if (timeout == 0) return 0;
+
+   result = MsgWaitForMultipleObjects(objects_nbr, (const HANDLE *)objects, EINA_FALSE,
+                                      timeout, QS_ALLINPUT);
+
+   if (readfds)
+     FD_ZERO(readfds);
+   if (writefds)
+     FD_ZERO(writefds);
+   if (exceptfds)
+     FD_ZERO(exceptfds);
+
+   /* The result tells us the type of event we have. */
+   if (result == WAIT_FAILED)
+     {
+        char *m;
+
+        m = evil_last_error_get();
+        ERR("%s", m);
+        free(m);
+        res = -1;
+     }
+   else if (result == WAIT_TIMEOUT)
+     {
+        /* ERR("time out\n"); */
+         res = 0;
+     }
+   else if (result == (WAIT_OBJECT_0 + objects_nbr))
+     {
+        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+          {
+             TranslateMessage(&msg);
+             DispatchMessage(&msg);
+          }
+
+        res = 0;
+     }
+   else if ((result >= 0) && (result < WAIT_OBJECT_0 + events_nbr))
+     {
+        WSANETWORKEVENTS network_event;
+
+        WSAEnumNetworkEvents(sockets[result], objects[result], &network_event);
+
+        if ((network_event.lNetworkEvents & FD_READ) && readfds)
+          FD_SET(sockets[result], readfds);
+        if ((network_event.lNetworkEvents & FD_WRITE) && writefds)
+          FD_SET(sockets[result], writefds);
+        if ((network_event.lNetworkEvents & FD_OOB) && exceptfds)
+          FD_SET(sockets[result], exceptfds);
+
+        res = 1;
+     }
+   else if ((result >= (WAIT_OBJECT_0 + events_nbr)) &&
+            (result < (WAIT_OBJECT_0 + objects_nbr)))
+     {
+        if (!win32_handler_current)
+          {
+             /* regular main loop, start from head */
+              win32_handler_current = win32_handlers;
+          }
+        else
+          {
+             /* recursive main loop, continue from where we were */
+              win32_handler_current = (Ecore_Win32_Handler *)EINA_INLIST_GET(win32_handler_current)->next;
+          }
+
+        while (win32_handler_current)
+          {
+             wh = win32_handler_current;
+
+             if (objects[result - WAIT_OBJECT_0] == wh->h)
+               {
+                  if (!wh->delete_me)
+                    {
+                       wh->references++;
+                       if (!wh->func(wh->data, wh))
+                         {
+                            wh->delete_me = EINA_TRUE;
+                            win32_handlers_delete_me = EINA_TRUE;
+                         }
+                       wh->references--;
+                    }
+               }
+             if (win32_handler_current) /* may have changed in recursive main loops */
+               win32_handler_current = (Ecore_Win32_Handler *)EINA_INLIST_GET(win32_handler_current)->next;
+          }
+        res = 1;
+     }
+   else
+     {
+        ERR("unknown result...\n");
+        res = -1;
+     }
+
+   /* Remove event objects again */
+   for (i = 0; i < events_nbr; i++) WSACloseEvent(objects[i]);
+
+   return res;
+}
+
+#endif
diff --git a/src/lib/ecore/ecore_pipe.c b/src/lib/ecore/ecore_pipe.c
new file mode 100644 (file)
index 0000000..0acfc6c
--- /dev/null
@@ -0,0 +1,691 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <math.h>
+
+#ifdef HAVE_ISFINITE
+# define ECORE_FINITE(t)  isfinite(t)
+#else
+# ifdef _MSC_VER
+#  define ECORE_FINITE(t) _finite(t)
+# else
+#  define ECORE_FINITE(t) finite(t)
+# endif
+#endif
+
+#define FIX_HZ 1
+
+#ifdef FIX_HZ
+# ifndef _MSC_VER
+#  include <sys/param.h>
+# endif
+# ifndef HZ
+#  define HZ 100
+# endif
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#ifdef HAVE_ESCAPE
+# include <Escape.h>
+#endif
+
+#ifdef HAVE_EXOTIC
+# include <Exotic.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+/* How of then we should retry to write to the pipe */
+#define ECORE_PIPE_WRITE_RETRY 6
+
+/*
+ * On Windows, pipe() is implemented with sockets.
+ * Contrary to Linux, Windows uses different functions
+ * for sockets and fd's: write() is for fd's and send
+ * is for sockets. So I need to put some win32 code
+ * here. I can't think of a solution where the win32
+ * code is in Evil and not here.
+ */
+
+#ifdef _WIN32
+
+# include <winsock2.h>
+
+# define pipe_write(fd, buffer, size) send((fd), (char *)(buffer), size, 0)
+# define pipe_read(fd, buffer, size)  recv((fd), (char *)(buffer), size, 0)
+# define pipe_close(fd)               closesocket(fd)
+# define PIPE_FD_INVALID INVALID_SOCKET
+# define PIPE_FD_ERROR   SOCKET_ERROR
+
+#else
+
+# include <unistd.h>
+# include <fcntl.h>
+
+# define pipe_write(fd, buffer, size) write((fd), buffer, size)
+# define pipe_read(fd, buffer, size)  read((fd), buffer, size)
+# define pipe_close(fd)               close(fd)
+# define PIPE_FD_INVALID -1
+# define PIPE_FD_ERROR   -1
+
+#endif /* ! _WIN32 */
+
+#include <Ecore.h>
+#include "ecore_private.h"
+
+struct _Ecore_Pipe
+{
+                     ECORE_MAGIC;
+   int               fd_read;
+   int               fd_write;
+   Ecore_Fd_Handler *fd_handler;
+   const void       *data;
+   Ecore_Pipe_Cb     handler;
+   unsigned int      len;
+   int               handling;
+   size_t            already_read;
+   void             *passed_data;
+   int               message;
+   Eina_Bool         delete_me : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Pipe);
+
+static Eina_Bool _ecore_pipe_read(void             *data,
+                                  Ecore_Fd_Handler *fd_handler);
+
+/**
+ * @addtogroup Ecore_Pipe_Group
+ *
+ * @{
+ */
+
+/**
+ * Create two file descriptors (sockets on Windows). Add
+ * a callback that will be called when the file descriptor that
+ * is listened receives data. An event is also put in the event
+ * queue when data is received.
+ *
+ * @param handler The handler called when data is received.
+ * @param data    Data to pass to @p handler when it is called.
+ * @return        A newly created Ecore_Pipe object if successful.
+ *                @c NULL otherwise.
+ */
+EAPI Ecore_Pipe *
+ecore_pipe_add(Ecore_Pipe_Cb handler,
+               const void   *data)
+{
+   Ecore_Pipe *p;
+   int fds[2];
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   if (!handler) return NULL;
+
+   p = ecore_pipe_calloc(1);
+   if (!p) return NULL;
+
+   if (pipe(fds))
+     {
+        ecore_pipe_mp_free(p);
+        return NULL;
+     }
+
+   ECORE_MAGIC_SET(p, ECORE_MAGIC_PIPE);
+   p->fd_read = fds[0];
+   p->fd_write = fds[1];
+   p->handler = handler;
+   p->data = data;
+
+   _ecore_fd_close_on_exec(fds[0]);
+   _ecore_fd_close_on_exec(fds[1]);
+
+   fcntl(p->fd_read, F_SETFL, O_NONBLOCK);
+   p->fd_handler = ecore_main_fd_handler_add(p->fd_read,
+                                             ECORE_FD_READ,
+                                             _ecore_pipe_read,
+                                             p,
+                                             NULL, NULL);
+   return p;
+}
+
+/**
+ * Free an Ecore_Pipe object created with ecore_pipe_add().
+ *
+ * @param p The Ecore_Pipe object to be freed.
+ * @return The pointer to the private data
+ */
+EAPI void *
+ecore_pipe_del(Ecore_Pipe *p)
+{
+   void *data;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
+     {
+        ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_del");
+        return NULL;
+     }
+   p->delete_me = EINA_TRUE;
+   if (p->handling > 0) return (void *)p->data;
+   if (p->fd_handler) _ecore_main_fd_handler_del(p->fd_handler);
+   if (p->fd_read != PIPE_FD_INVALID) pipe_close(p->fd_read);
+   if (p->fd_write != PIPE_FD_INVALID) pipe_close(p->fd_write);
+   data = (void *)p->data;
+   ecore_pipe_mp_free(p);
+   return data;
+}
+
+/**
+ * Close the read end of an Ecore_Pipe object created with ecore_pipe_add().
+ *
+ * @param p The Ecore_Pipe object.
+ */
+EAPI void
+ecore_pipe_read_close(Ecore_Pipe *p)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
+     {
+        ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_read_close");
+        return;
+     }
+   if (p->fd_handler)
+     {
+        _ecore_main_fd_handler_del(p->fd_handler);
+        p->fd_handler = NULL;
+     }
+   if (p->fd_read != PIPE_FD_INVALID)
+     {
+        pipe_close(p->fd_read);
+        p->fd_read = PIPE_FD_INVALID;
+     }
+}
+
+/**
+ * Stop monitoring if necessary the pipe for reading. See ecore_pipe_thaw()
+ * for monitoring it again.
+ *
+ * @param p The Ecore_Pipe object.
+ * @since 1.1
+ */
+EAPI void
+ecore_pipe_freeze(Ecore_Pipe *p)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
+     {
+        ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_read_freeze");
+        return;
+     }
+   if (p->fd_handler)
+     {
+        _ecore_main_fd_handler_del(p->fd_handler);
+        p->fd_handler = NULL;
+     }
+}
+
+/**
+ * Start monitoring again the pipe for reading. See ecore_pipe_freeze() for
+ * stopping the monitoring activity. This will not work if
+ * ecore_pipe_read_close() was previously called on the same pipe.
+ *
+ * @param p The Ecore_Pipe object.
+ * @since 1.1
+ */
+EAPI void
+ecore_pipe_thaw(Ecore_Pipe *p)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
+     {
+        ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_read_thaw");
+        return;
+     }
+   if (!p->fd_handler && p->fd_read != PIPE_FD_INVALID)
+     {
+        p->fd_handler = ecore_main_fd_handler_add(p->fd_read,
+                                                  ECORE_FD_READ,
+                                                  _ecore_pipe_read,
+                                                  p,
+                                                  NULL, NULL);
+     }
+}
+
+/**
+ * @brief Wait from another thread on the read side of a pipe.
+ *
+ * @param p The pipe to watch on.
+ * @param message_count The minimal number of message to wait before exiting.
+ * @param wait The amount of time in second to wait before exiting.
+ * @return the number of message catched during that wait call.
+ * @since 1.1
+ *
+ * Negative value for @p wait means infite wait.
+ */
+EAPI int
+ecore_pipe_wait(Ecore_Pipe *p,
+                int         message_count,
+                double      wait)
+{
+   struct timeval tv, *t;
+   fd_set rset;
+   double end = 0.0;
+   double timeout;
+   int ret;
+   int total = 0;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(-1);
+   if (p->fd_read == PIPE_FD_INVALID)
+     return -1;
+
+   FD_ZERO(&rset);
+   FD_SET(p->fd_read, &rset);
+
+   if (wait >= 0.0)
+     end = ecore_loop_time_get() + wait;
+   timeout = wait;
+
+   while (message_count > 0 && (timeout > 0.0 || wait <= 0.0))
+     {
+        if (wait >= 0.0)
+          {
+             /* finite() tests for NaN, too big, too small, and infinity.  */
+              if ((!ECORE_FINITE(timeout)) || (timeout == 0.0))
+                {
+                   tv.tv_sec = 0;
+                   tv.tv_usec = 0;
+                }
+              else if (timeout > 0.0)
+                {
+                   int sec, usec;
+#ifdef FIX_HZ
+                   timeout += (0.5 / HZ);
+                   sec = (int)timeout;
+                   usec = (int)((timeout - (double)sec) * 1000000);
+#else
+                   sec = (int)timeout;
+                   usec = (int)((timeout - (double)sec) * 1000000);
+#endif
+                   tv.tv_sec = sec;
+                   tv.tv_usec = usec;
+                }
+              t = &tv;
+          }
+        else
+          {
+             t = NULL;
+          }
+
+        ret = main_loop_select(p->fd_read + 1, &rset, NULL, NULL, t);
+
+        if (ret > 0)
+          {
+             _ecore_pipe_read(p, NULL);
+             message_count -= p->message;
+             total += p->message;
+             p->message = 0;
+          }
+        else if (ret == 0)
+          {
+             break;
+          }
+        else if (errno != EINTR)
+          {
+             close(p->fd_read);
+             p->fd_read = PIPE_FD_INVALID;
+             break;
+          }
+
+        if (wait >= 0.0)
+          timeout = end - ecore_loop_time_get();
+     }
+
+   return total;
+}
+
+/**
+ * Close the write end of an Ecore_Pipe object created with ecore_pipe_add().
+ *
+ * @param p The Ecore_Pipe object.
+ */
+EAPI void
+ecore_pipe_write_close(Ecore_Pipe *p)
+{
+   if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
+     {
+        ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_write_close");
+        return;
+     }
+   if (p->fd_write != PIPE_FD_INVALID)
+     {
+        pipe_close(p->fd_write);
+        p->fd_write = PIPE_FD_INVALID;
+     }
+}
+
+/**
+ * Write on the file descriptor the data passed as parameter.
+ *
+ * @param p      The Ecore_Pipe object.
+ * @param buffer The data to write into the pipe.
+ * @param nbytes The size of the @p buffer in bytes
+ * @return       @c EINA_TRUE on a successful write, @c EINA_FALSE on error.
+ */
+EAPI Eina_Bool
+ecore_pipe_write(Ecore_Pipe  *p,
+                 const void  *buffer,
+                 unsigned int nbytes)
+{
+   ssize_t ret;
+   size_t already_written = 0;
+   int retry = ECORE_PIPE_WRITE_RETRY;
+
+   if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
+     {
+        ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_write");
+        return EINA_FALSE;
+     }
+
+   if (p->delete_me) return EINA_FALSE;
+
+   if (p->fd_write == PIPE_FD_INVALID) return EINA_FALSE;
+
+   /* First write the len into the pipe */
+   do
+     {
+        ret = pipe_write(p->fd_write, &nbytes, sizeof(nbytes));
+        if (ret == sizeof(nbytes))
+          {
+             retry = ECORE_PIPE_WRITE_RETRY;
+             break;
+          }
+        else if (ret > 0)
+          {
+             /* XXX What should we do here? */
+              ERR("The length of the data was not written complete"
+                  " to the pipe");
+              return EINA_FALSE;
+          }
+        else if (ret == PIPE_FD_ERROR && errno == EPIPE)
+          {
+             pipe_close(p->fd_write);
+             p->fd_write = PIPE_FD_INVALID;
+             return EINA_FALSE;
+          }
+        else if (ret == PIPE_FD_ERROR && errno == EINTR)
+          /* try it again */
+          ;
+        else
+          {
+             ERR("An unhandled error (ret: %zd errno: %d)"
+                 "occurred while writing to the pipe the length",
+                 ret, errno);
+          }
+     }
+   while (retry--);
+
+   if (retry != ECORE_PIPE_WRITE_RETRY) return EINA_FALSE;
+
+   /* and now pass the data to the pipe */
+   do
+     {
+        ret = pipe_write(p->fd_write,
+                         ((unsigned char *)buffer) + already_written,
+                         nbytes - already_written);
+
+        if (ret == (ssize_t)(nbytes - already_written))
+          return EINA_TRUE;
+        else if (ret >= 0)
+          {
+             already_written -= ret;
+             continue;
+          }
+        else if (ret == PIPE_FD_ERROR && errno == EPIPE)
+          {
+             pipe_close(p->fd_write);
+             p->fd_write = PIPE_FD_INVALID;
+             return EINA_FALSE;
+          }
+        else if (ret == PIPE_FD_ERROR && errno == EINTR)
+          /* try it again */
+          ;
+        else
+          {
+             ERR("An unhandled error (ret: %zd errno: %d)"
+                 "occurred while writing to the pipe the length",
+                 ret, errno);
+          }
+     }
+   while (retry--);
+
+   return EINA_FALSE;
+}
+
+/**
+ * @}
+ */
+
+/* Private function */
+static void
+_ecore_pipe_unhandle(Ecore_Pipe *p)
+{
+   p->handling--;
+   if (p->delete_me)
+     {
+        ecore_pipe_del(p);
+     }
+}
+
+static Eina_Bool
+_ecore_pipe_read(void             *data,
+                 Ecore_Fd_Handler *fd_handler __UNUSED__)
+{
+   Ecore_Pipe *p = (Ecore_Pipe *)data;
+   int i;
+
+   p->handling++;
+   for (i = 0; i < 16; i++)
+     {
+        ssize_t ret;
+
+        /* if we already have read some data we don't need to read the len
+         * but to finish the already started job
+         */
+        if (p->len == 0)
+          {
+             /* read the len of the passed data */
+              ret = pipe_read(p->fd_read, &p->len, sizeof(p->len));
+
+     /* catch the non error case first */
+              /* read amount ok - nothing more to do */
+              if (ret == sizeof(p->len))
+                ;
+              else if (ret > 0)
+                {
+     /* we got more data than we asked for - definite error */
+                    ERR("Only read %i bytes from the pipe, although"
+                        " we need to read %i bytes.",
+                        (int)ret, (int)sizeof(p->len));
+                    _ecore_pipe_unhandle(p);
+                    return ECORE_CALLBACK_CANCEL;
+                }
+              else if (ret == 0)
+                {
+     /* we got no data */
+                    if (i == 0)
+                      {
+     /* no data on first try through means an error */
+                          if (!p->delete_me)
+                            p->handler((void *)p->data, NULL, 0);
+                          if (p->passed_data) free(p->passed_data);
+                          p->passed_data = NULL;
+                          p->already_read = 0;
+                          p->len = 0;
+                          p->message++;
+                          pipe_close(p->fd_read);
+                          p->fd_read = PIPE_FD_INVALID;
+                          p->fd_handler = NULL;
+                          _ecore_pipe_unhandle(p);
+                          return ECORE_CALLBACK_CANCEL;
+                      }
+                    else
+                      {
+     /* no data after first loop try is ok */
+                          _ecore_pipe_unhandle(p);
+                          return ECORE_CALLBACK_RENEW;
+                      }
+                }
+#ifndef _WIN32
+              else if ((ret == PIPE_FD_ERROR) &&
+                       ((errno == EINTR) || (errno == EAGAIN)))
+                {
+                   return ECORE_CALLBACK_RENEW;
+                }
+              else
+                {
+                   ERR("An unhandled error (ret: %i errno: %i [%s])"
+                       "occurred while reading from the pipe the length",
+                       (int)ret, errno, strerror(errno));
+                   return ECORE_CALLBACK_RENEW;
+                }
+#else
+              else /* ret == PIPE_FD_ERROR is the only other case on Windows */
+                {
+                   if (WSAGetLastError() != WSAEWOULDBLOCK)
+                     {
+                        if (!p->delete_me)
+                          p->handler((void *)p->data, NULL, 0);
+                        if (p->passed_data) free(p->passed_data);
+                        p->passed_data = NULL;
+                        p->already_read = 0;
+                        p->len = 0;
+                        p->message++;
+                        pipe_close(p->fd_read);
+                        p->fd_read = PIPE_FD_INVALID;
+                        p->fd_handler = NULL;
+                        _ecore_pipe_unhandle(p);
+                        return ECORE_CALLBACK_CANCEL;
+                     }
+                }
+#endif
+          }
+
+        /* if somehow we got less than or equal to 0 we got an errnoneous
+         * messages so call callback with null and len we got. this case should
+         * never happen */
+        if (p->len == 0)
+          {
+             if (!p->delete_me)
+               p->handler((void *)p->data, NULL, 0);
+             /* reset all values to 0 */
+             if (p->passed_data) free(p->passed_data);
+             p->passed_data = NULL;
+             p->already_read = 0;
+             p->len = 0;
+             p->message++;
+             _ecore_pipe_unhandle(p);
+             return ECORE_CALLBACK_RENEW;
+          }
+
+        /* we dont have a buffer to hold the data, so alloc it */
+        if (!p->passed_data)
+          {
+             p->passed_data = malloc(p->len);
+             /* alloc failed - error case */
+             if (!p->passed_data)
+               {
+                  if (!p->delete_me)
+                    p->handler((void *)p->data, NULL, 0);
+     /* close the pipe */
+                  p->already_read = 0;
+                  p->len = 0;
+                  p->message++;
+                  pipe_close(p->fd_read);
+                  p->fd_read = PIPE_FD_INVALID;
+                  p->fd_handler = NULL;
+                  _ecore_pipe_unhandle(p);
+                  return ECORE_CALLBACK_CANCEL;
+               }
+          }
+
+        /* and read the passed data */
+        ret = pipe_read(p->fd_read,
+                        ((unsigned char *)p->passed_data) + p->already_read,
+                        p->len - p->already_read);
+
+        /* catch the non error case first */
+        /* if we read enough data to finish the message/buffer */
+        if (ret == (ssize_t)(p->len - p->already_read))
+          {
+             if (!p->delete_me)
+               p->handler((void *)p->data, p->passed_data, p->len);
+             free(p->passed_data);
+             /* reset all values to 0 */
+             p->passed_data = NULL;
+             p->already_read = 0;
+             p->len = 0;
+             p->message++;
+          }
+        else if (ret > 0)
+          {
+             /* more data left to read */
+              p->already_read += ret;
+              _ecore_pipe_unhandle(p);
+              return ECORE_CALLBACK_RENEW;
+          }
+        else if (ret == 0)
+          {
+             /* 0 bytes to read - could be more to read next select wake up */
+              _ecore_pipe_unhandle(p);
+              return ECORE_CALLBACK_RENEW;
+          }
+#ifndef _WIN32
+        else if ((ret == PIPE_FD_ERROR) &&
+                 ((errno == EINTR) || (errno == EAGAIN)))
+          {
+             _ecore_pipe_unhandle(p);
+             return ECORE_CALLBACK_RENEW;
+          }
+        else
+          {
+             ERR("An unhandled error (ret: %zd errno: %d)"
+                 "occurred while reading from the pipe the data",
+                 ret, errno);
+             _ecore_pipe_unhandle(p);
+             return ECORE_CALLBACK_RENEW;
+          }
+#else
+        else /* ret == PIPE_FD_ERROR is the only other case on Windows */
+          {
+             if (WSAGetLastError() != WSAEWOULDBLOCK)
+               {
+                  if (!p->delete_me)
+                    p->handler((void *)p->data, NULL, 0);
+                  if (p->passed_data) free(p->passed_data);
+                  p->passed_data = NULL;
+                  p->already_read = 0;
+                  p->len = 0;
+                  p->message++;
+                  pipe_close(p->fd_read);
+                  p->fd_read = PIPE_FD_INVALID;
+                  p->fd_handler = NULL;
+                  _ecore_pipe_unhandle(p);
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             else
+               break;
+          }
+#endif
+     }
+
+   _ecore_pipe_unhandle(p);
+   return ECORE_CALLBACK_RENEW;
+}
+
index 74eee7f..089212e 100644 (file)
@@ -1,54 +1,71 @@
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
 
-static Ecore_Timer    *timer = NULL;
-static int             min_interval = -1;
-static int             interval_incr = 0;
-static int             at_tick = 0;
-static int             just_added_poller = 0;
-static int             poller_delete_count = 0;
-static int             poller_walking = 0;
-static double          poll_interval = 0.125;
-static double          poll_cur_interval = 0.0;
-static double          last_tick = 0.0;
-static Ecore_Poller   *pollers[16] = 
+struct _Ecore_Poller
 {
-   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
-   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
+   EINA_INLIST;
+   ECORE_MAGIC;
+   int           ibit;
+   unsigned char delete_me : 1;
+   Ecore_Task_Cb func;
+   void         *data;
 };
-static unsigned short  poller_counters[16] = 
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Poller);
+
+static Ecore_Timer *timer = NULL;
+static int min_interval = -1;
+static int interval_incr = 0;
+static int at_tick = 0;
+static int just_added_poller = 0;
+static int poller_delete_count = 0;
+static int poller_walking = 0;
+static double poll_interval = 0.125;
+static double poll_cur_interval = 0.0;
+static double last_tick = 0.0;
+static Ecore_Poller *pollers[16] =
 {
-   0,0,0,0,0,0,0,0,
-   0,0,0,0,0,0,0,0
+   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+static unsigned short poller_counters[16] =
+{
+   0, 0, 0, 0, 0, 0, 0, 0,
+   0, 0, 0, 0, 0, 0, 0, 0
 };
 
-static void _ecore_poller_next_tick_eval(void);
-static int _ecore_poller_cb_timer(void *data);
+static void      _ecore_poller_next_tick_eval(void);
+static Eina_Bool _ecore_poller_cb_timer(void *data);
 
 static void
 _ecore_poller_next_tick_eval(void)
 {
    int i;
    double interval;
-   
+
    min_interval = -1;
    for (i = 0; i < 15; i++)
      {
-       if (pollers[i])
-         {
-            min_interval = i;
-            break;
-         }
+        if (pollers[i])
+          {
+             min_interval = i;
+             break;
+          }
      }
    if (min_interval < 0)
      {
-       /* no pollers */
-       if (timer)
-         {
-            ecore_timer_del(timer);
-            timer = NULL;
-         }
-       return;
+        /* no pollers */
+         if (timer)
+           {
+              ecore_timer_del(timer);
+              timer = NULL;
+           }
+         return;
      }
    interval_incr = (1 << min_interval);
    interval = interval_incr * poll_interval;
@@ -58,101 +75,99 @@ _ecore_poller_next_tick_eval(void)
     * callback will adjust the timer interval at the end anyway */
    if (at_tick)
      {
-       if (!timer)
-         timer = ecore_timer_add(interval, _ecore_poller_cb_timer, NULL);
+        if (!timer)
+          timer = ecore_timer_add(interval, _ecore_poller_cb_timer, NULL);
      }
    else
      {
-       double t;
-       
-       if (!timer)
-         timer = ecore_timer_add(interval, _ecore_poller_cb_timer, NULL);
-       else
-         {
-            t = ecore_time_get();
-            if (interval != poll_cur_interval)
-              {
-                 t -= last_tick; /* time since we last ticked */
-                 /* delete the timer and reset it to tick off in the new
-                  * time interval. at the tick this will be adjusted */
-                 ecore_timer_del(timer);
-                 timer = ecore_timer_add(interval - t, 
-                                         _ecore_poller_cb_timer, NULL);
-              }
-         }
+        double t;
+
+        if (!timer)
+          timer = ecore_timer_add(interval, _ecore_poller_cb_timer, NULL);
+        else
+          {
+             t = ecore_time_get();
+             if (interval != poll_cur_interval)
+               {
+                  t -= last_tick; /* time since we last ticked */
+     /* delete the timer and reset it to tick off in the new
+      * time interval. at the tick this will be adjusted */
+                  ecore_timer_del(timer);
+                  timer = ecore_timer_add(interval - t,
+                                          _ecore_poller_cb_timer, NULL);
+               }
+          }
      }
    poll_cur_interval = interval;
 }
 
-static int
-_ecore_poller_cb_timer(void *data)
+static Eina_Bool
+_ecore_poller_cb_timer(void *data __UNUSED__)
 {
    int i;
-   Ecore_List2 *l;
-   Ecore_Poller *poller;
+   Ecore_Poller *poller, *l;
    int changes = 0;
 
    at_tick++;
    last_tick = ecore_time_get();
-   /* we have 16 counters - each incriments every time the poller counter
-    * "ticks". it incriments by the minimum interval (which can be 1, 2, 4,
+   /* we have 16 counters - each increments every time the poller counter
+    * "ticks". it increments by the minimum interval (which can be 1, 2, 4,
     * 7, 16 etc. up to 32768) */
    for (i = 0; i < 15; i++)
      {
-       poller_counters[i] += interval_incr;
-       /* wrap back to 0 if we exceed out loop count for the counter */
-       if (poller_counters[i] >= (1 << i)) poller_counters[i] = 0;
+        poller_counters[i] += interval_incr;
+        /* wrap back to 0 if we exceed out loop count for the counter */
+        if (poller_counters[i] >= (1 << i)) poller_counters[i] = 0;
      }
-   
+
    just_added_poller = 0;
    /* walk the pollers now */
    poller_walking++;
    for (i = 0; i < 15; i++)
      {
-       /* if the counter is @ 0 - this means that counter "went off" this
-        * tick interval, so run all pollers hooked to that counter */
-       if (poller_counters[i] == 0)
-         {
-            for (l = (Ecore_List2 *)pollers[i]; l; l = l->next)
-              {
-                 poller = (Ecore_Poller *)l;
-                 if (!poller->delete_me)
-                   {
-                      if (!poller->func(poller->data))
-                        {
-                           if (!poller->delete_me)
-                             {
-                                poller->delete_me = 1;
-                                poller_delete_count++;
-                             }
-                        }
-                   }
-              }
-         }
+        /* if the counter is @ 0 - this means that counter "went off" this
+         * tick interval, so run all pollers hooked to that counter */
+          if (poller_counters[i] == 0)
+            {
+               EINA_INLIST_FOREACH(pollers[i], poller)
+                 {
+                    if (!poller->delete_me)
+                      {
+                         if (!poller->func(poller->data))
+                           {
+                              if (!poller->delete_me)
+                                {
+                                   poller->delete_me = 1;
+                                   poller_delete_count++;
+                                }
+                           }
+                      }
+                 }
+            }
      }
    poller_walking--;
-       
+
    /* handle deletes afterwards */
    if (poller_delete_count > 0)
      {
-       /* FIXME: walk all pollers and remove deleted ones */
-       for (i = 0; i < 15; i++)
-         {
-             for (l = (Ecore_List2 *)pollers[i]; l;)
-              {
-                  poller = (Ecore_Poller *)l;
-                 l = l->next;
-                 if (poller->delete_me)
-                   {
-                      pollers[poller->ibit] = _ecore_list2_remove(pollers[poller->ibit], poller);
-                      free(poller);
-                      poller_delete_count--;
-                      changes++;
-                      if (poller_delete_count <= 0) break;
-                   }
-              }
-            if (poller_delete_count <= 0) break;
-         }
+        /* FIXME: walk all pollers and remove deleted ones */
+         for (i = 0; i < 15; i++)
+           {
+              for (l = pollers[i]; l; )
+                {
+                   poller = l;
+                   l = (Ecore_Poller *)EINA_INLIST_GET(l)->next;
+                   if (poller->delete_me)
+                     {
+                        pollers[i] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[i]), EINA_INLIST_GET(poller));
+                        ecore_poller_mp_free(poller);
+                        poller_delete_count--;
+                        changes++;
+                        if (poller_delete_count <= 0) break;
+                     }
+                }
+              if (poller_delete_count <= 0) break;
+           }
      }
    /* if we deleted or added any pollers, then we need to re-evaluate our
     * minimum poll interval */
@@ -161,116 +176,56 @@ _ecore_poller_cb_timer(void *data)
 
    just_added_poller = 0;
    poller_delete_count = 0;
-   
+
    at_tick--;
-   
+
    /* if the timer was deleted then there is no point returning 1 - ambiguous
-    * if we do as it im plies "keep running me" but we have been deleted 
+    * if we do as it implies keep running me" but we have been deleted
     * anyway */
-   if (!timer) return 0;
+   if (!timer) return ECORE_CALLBACK_CANCEL;
 
    /* adjust interval */
    ecore_timer_interval_set(timer, poll_cur_interval);
-   return 1;
+   return ECORE_CALLBACK_RENEW;
 }
 
-/**
- * @defgroup Ecore_Poll_Group Ecore Poll Functions
- *
- * These functions are for the need to poll information, but provide a shared
- * abstracted API to pool such polling to minimise wakeup and ensure all the
- * polling happens in as few spots as possible areound a core poll interval.
- * For now only 1 core poller type is supprted: ECORE_POLLER_CORE
- */
-
-
-/**
- * Sets the time between ticks (in seconds) for the given ticker clock.
- * @param   type The ticker type to adjust
- * @param   poll_time The time (in seconds) between ticks of the clock
- * @ingroup Ecore_Poller_Group
- * 
- * This will adjust the time between ticks of the given ticker type defined
- * by @p type to the time period defined by @p poll_time.
- */
 EAPI void
-ecore_poller_poll_interval_set(Ecore_Poller_Type type, double poll_time)
+ecore_poller_poll_interval_set(Ecore_Poller_Type type __UNUSED__,
+                               double            poll_time)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+
+   if (poll_time < 0.0)
+     {
+        ERR("Poll time %f less than zero, ignored", poll_time);
+        return;
+     }
+
    poll_interval = poll_time;
    _ecore_poller_next_tick_eval();
 }
 
-/**
- * Gets the time between ticks (in seconds) for the fiven ticker clock.
- * @param   type The ticker type to query
- * @return  The time in seconds between ticks of the ticker clock
- * @ingroup Ecore_Poller_Group
- * 
- * This will get the time between ticks of the specifider ticker clock.
- */
 EAPI double
-ecore_poller_poll_interval_get(Ecore_Poller_Type type)
+ecore_poller_poll_interval_get(Ecore_Poller_Type type __UNUSED__)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0.0);
    return poll_interval;
 }
 
-/**
- * Creates a poller to call the given function at a particular tick interval.
- * @param   type The ticker type to attach the poller to
- * @param   interval The poll interval
- * @param   func The given function.  If @p func returns 1, the poller is
- *               rescheduled for the next tick interval.
- * @param   data Data to pass to @p func when it is called.
- * @return  A poller object on success.  @c NULL on failure.
- * @ingroup Ecore_Poller_Group
- *
- * This function adds a poller callback that is to be called regularly
- * along with all other poller callbacks so the pollers are synchronized with
- * all other pollers running off the same poller type and at the same tick
- * interval. This should be used for polling things when polling is desired
- * or required, and you do not have specific requirements on the exact times
- * to poll and want to avoid extra process wakeups for polling. This will
- * save power as the CPU has more of a chance to go into a low power state
- * the longer it is asleep for, so this should be used if you are at all
- * power conscious.
- * 
- * The @p type parameter defines the poller tick type (there is a virtual
- * clock ticking all the time - though ecore avoids making it tick when
- * there will not be any work to do at that tick point). There is only one
- * ticker at the moment - that is ECORE_POLLER_CORE. This is here for future
- * expansion if multiple clocks with different frequencies are really required.
- * The default time between ticks for the ECORE_POLLER_CORE ticker is 0.125
- * seconds.
- * 
- * The @p interval is the number of ticker ticks that will pass by in between
- * invocations of the @p func callback. This must be between 1 and 32768
- * inclusive, and must be a power of 2 (i.e. 1, 2, 4, 8, 16, ... 16384, 32768).
- * If it is 1, then the function will be called every tick. if it is 2, then it
- * will be called every 2nd tick, if it is 8, then every 8th tick etc. Exactly
- * which tick is undefined, as only the interval between calls can be defined.
- * Ecore will endeavour to keep pollers synchronised and to call as many in
- * 1 wakeup event as possible.
- * 
- * This function adds a poller and returns its handle on success and NULL on
- * failure. The function @p func will be called at tick intervals described
- * above. The function will be passed the @p data pointer as its parameter.
- * 
- * When the poller @p func is called, it must return a value of either 
- * 1 (or ECORE_CALLBACK_RENEW) or 0 (or ECORE_CALLBACK_CANCEL). If it 
- * returns 1, it will be called again at the next tick, or if it returns
- * 0 it will be deleted automatically making any references/handles for it
- * invalid.
- */
 EAPI Ecore_Poller *
-ecore_poller_add(Ecore_Poller_Type type, int interval, int (*func) (void *data), const void *data)
+ecore_poller_add(Ecore_Poller_Type type __UNUSED__,
+                 int               interval,
+                 Ecore_Task_Cb     func,
+                 const void       *data)
 {
    Ecore_Poller *poller;
    int ibit;
-   
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!func) return NULL;
    if (interval < 1) interval = 1;
-   
-   poller = calloc(1, sizeof(Ecore_Poller));
+
+   poller = ecore_poller_calloc(1);
    if (!poller) return NULL;
    ECORE_MAGIC_SET(poller, ECORE_MAGIC_POLLER);
    /* interval MUST be a power of 2, so enforce it */
@@ -278,16 +233,16 @@ ecore_poller_add(Ecore_Poller_Type type, int interval, int (*func) (void *data),
    ibit = -1;
    while (interval != 0)
      {
-       ibit++;
-       interval >>= 1;
+        ibit++;
+        interval >>= 1;
      }
    /* only allow up to 32768 - i.e. ibit == 15, so limit it */
    if (ibit > 15) ibit = 15;
-   
+
    poller->ibit = ibit;
    poller->func = func;
    poller->data = (void *)data;
-   pollers[poller->ibit] = _ecore_list2_prepend(pollers[poller->ibit], poller);
+   pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_prepend(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
    if (poller_walking)
      just_added_poller++;
    else
@@ -295,59 +250,111 @@ ecore_poller_add(Ecore_Poller_Type type, int interval, int (*func) (void *data),
    return poller;
 }
 
-/**
- * Delete the specified poller from the timer list.
- * @param   poller The poller to delete.
- * @return  The data pointer set for the timer when @ref ecore_poller_add was
- *          called.  @c NULL is returned if the function is unsuccessful.
- * @ingroup Ecore_Poller_Group
- *
- * Note: @p poller must be a valid handle. If the poller function has already
- * returned 0, the handle is no longer valid (and does not need to be delete).
- */
+EAPI Eina_Bool
+ecore_poller_poller_interval_set(Ecore_Poller *poller,
+                                 int           interval)
+{
+   int ibit;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(EINA_FALSE);
+   if (!ECORE_MAGIC_CHECK(poller, ECORE_MAGIC_POLLER))
+     {
+        ECORE_MAGIC_FAIL(poller, ECORE_MAGIC_POLLER,
+                         "ecore_poller_poller_interval_set");
+        return EINA_FALSE;
+     }
+
+   /* interval MUST be a power of 2, so enforce it */
+   if (interval < 1) interval = 1;
+   ibit = -1;
+   while (interval != 0)
+     {
+        ibit++;
+        interval >>= 1;
+     }
+   /* only allow up to 32768 - i.e. ibit == 15, so limit it */
+   if (ibit > 15) ibit = 15;
+   /* if interval specified is the same as interval set, return true without wasting time */
+   if (poller->ibit == ibit)
+     return EINA_TRUE;
+   pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
+   poller->ibit = ibit;
+   pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_prepend(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
+   if (poller_walking)
+     just_added_poller++;
+   else
+     _ecore_poller_next_tick_eval();
+   return EINA_TRUE;
+}
+
+EAPI int
+ecore_poller_poller_interval_get(Ecore_Poller *poller)
+{
+   int ibit, interval = 1;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   if (!ECORE_MAGIC_CHECK(poller, ECORE_MAGIC_POLLER))
+     {
+        ECORE_MAGIC_FAIL(poller, ECORE_MAGIC_POLLER,
+                         "ecore_poller_poller_interval_get");
+        return 0;
+     }
+
+   ibit = poller->ibit;
+   while (ibit != 0)
+     {
+        ibit--;
+        interval <<= 1;
+     }
+   return interval;
+}
+
 EAPI void *
 ecore_poller_del(Ecore_Poller *poller)
 {
    void *data;
-   
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
    if (!ECORE_MAGIC_CHECK(poller, ECORE_MAGIC_POLLER))
      {
-       ECORE_MAGIC_FAIL(poller, ECORE_MAGIC_POLLER,
-                        "ecore_poller_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(poller, ECORE_MAGIC_POLLER,
+                         "ecore_poller_del");
+        return NULL;
      }
    /* we are walking the poller list - a bad idea to remove from it while
     * walking it, so just flag it as delete_me and come back to it after
     * the loop has finished */
    if (poller_walking > 0)
      {
-       poller_delete_count++;
-       poller->delete_me = 1;
-       return poller->data;
+        poller_delete_count++;
+        poller->delete_me = 1;
+        return poller->data;
      }
    /* not in loop so safe - delete immediately */
    data = poller->data;
-   pollers[poller->ibit] = _ecore_list2_remove(pollers[poller->ibit], poller);
-   free(poller);
+   pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
+   ecore_poller_mp_free(poller);
    _ecore_poller_next_tick_eval();
    return data;
 }
 
+/**
+ * @}
+ */
+
 void
 _ecore_poller_shutdown(void)
 {
    int i;
-   Ecore_List2 *l;
    Ecore_Poller *poller;
-   
+
    for (i = 0; i < 15; i++)
      {
-       for (l = (Ecore_List2 *)pollers[i]; l;)
-         {
-            poller = (Ecore_Poller *)l;
-            l = l->next;
-            pollers[poller->ibit] = _ecore_list2_remove(pollers[poller->ibit], poller);
-            free(poller);
-         }
+        while ((poller = pollers[i]))
+          {
+             pollers[i] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[i]), EINA_INLIST_GET(pollers[i]));
+             ecore_poller_mp_free(poller);
+          }
      }
 }
+
index 50ae9b9..6c4543c 100644 (file)
 #ifndef _ECORE_PRIVATE_H
 #define _ECORE_PRIVATE_H
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
+#include <assert.h>
+
+extern int _ecore_log_dom;
+#ifdef  _ECORE_DEFAULT_LOG_DOM
+# undef _ECORE_DEFAULT_LOG_DOM
 #endif
+#define _ECORE_DEFAULT_LOG_DOM _ecore_log_dom
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <signal.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <dirent.h>
-
-#ifdef HAVE_SYS_MMAN_H
-# include <sys/mman.h>
+#ifdef ECORE_DEFAULT_LOG_COLOR
+# undef ECORE_DEFAULT_LOG_COLOR
 #endif
+#define ECORE_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
 
-#ifdef EAPI
-# undef EAPI
+#ifdef ERR
+# undef ERR
 #endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
 
-#ifdef _WIN32
-# ifdef EFL_ECORE_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_ECORE_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __GNUC__
-# if __GNUC__ >= 4
-// BROKEN in gcc 4 on amd64
-//#  pragma GCC visibility push(hidden)
-# endif
+#ifdef DBG
+# undef DBG
 #endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
 
-#if HAVE___ATTRIBUTE__
-# define __UNUSED__ __attribute__((unused))
-#else
-# define __UNUSED__
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
 #endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
 
 #ifndef PATH_MAX
 # define PATH_MAX 4096
 #endif
 
 #ifndef MIN
-# define MIN(x, y) (((x) > (y)) ? (y) : (x))
+# define MIN(x, y)          (((x) > (y)) ? (y) : (x))
 #endif
 
 #ifndef MAX
-# define MAX(x, y) (((x) > (y)) ? (x) : (y))
+# define MAX(x, y)          (((x) > (y)) ? (x) : (y))
 #endif
 
 #ifndef ABS
-# define ABS(x) ((x) < 0 ? -(x) : (x))
+# define ABS(x)             ((x) < 0 ? -(x) : (x))
 #endif
 
 #ifndef CLAMP
 # define CLAMP(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x)))
 #endif
 
-#define READBUFSIZ 65536
-
-#define ECORE_MAGIC_NONE            0x1234fedc
-#define ECORE_MAGIC_EXE             0xf7e812f5
-#define ECORE_MAGIC_TIMER           0xf7d713f4
-#define ECORE_MAGIC_IDLER           0xf7c614f3
-#define ECORE_MAGIC_IDLE_ENTERER    0xf7b515f2
-#define ECORE_MAGIC_IDLE_EXITER     0xf7601afd
-#define ECORE_MAGIC_FD_HANDLER      0xf7a416f1
-#define ECORE_MAGIC_EVENT_HANDLER   0xf79317f0
-#define ECORE_MAGIC_EVENT_FILTER    0xf78218ff
-#define ECORE_MAGIC_EVENT           0xf77119fe
-#define ECORE_MAGIC_ANIMATOR        0xf7643ea5
-#define ECORE_MAGIC_POLLER          0xf7568127
-
-#define ECORE_MAGIC                 Ecore_Magic  __magic
-
-#define ECORE_MAGIC_SET(d, m)       (d)->__magic = (m)
-#define ECORE_MAGIC_CHECK(d, m)     ((d) && ((d)->__magic == (m)))
-#define ECORE_MAGIC_FAIL(d, m, fn)  _ecore_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
+#define EVAS_FRAME_QUEUING        1 /* for test */
+
+#define READBUFSIZ                65536
+
+#define ECORE_MAGIC_NONE          0x1234fedc
+#define ECORE_MAGIC_EXE           0xf7e812f5
+#define ECORE_MAGIC_TIMER         0xf7d713f4
+#define ECORE_MAGIC_IDLER         0xf7c614f3
+#define ECORE_MAGIC_IDLE_ENTERER  0xf7b515f2
+#define ECORE_MAGIC_IDLE_EXITER   0xf7601afd
+#define ECORE_MAGIC_FD_HANDLER    0xf7a416f1
+#define ECORE_MAGIC_EVENT_HANDLER 0xf79317f0
+#define ECORE_MAGIC_EVENT_FILTER  0xf78218ff
+#define ECORE_MAGIC_EVENT         0xf77119fe
+#define ECORE_MAGIC_ANIMATOR      0xf7643ea5
+#define ECORE_MAGIC_POLLER        0xf7568127
+#define ECORE_MAGIC_PIPE          0xf7458226
+#define ECORE_MAGIC_WIN32_HANDLER 0xf7e8f1a3
+#define ECORE_MAGIC_JOB           0x76543210
+
+typedef unsigned int Ecore_Magic;
+#define ECORE_MAGIC               Ecore_Magic __magic
+
+#define ECORE_MAGIC_SET(d, m)      (d)->__magic = (m)
+#define ECORE_MAGIC_CHECK(d, m)    ((d) && ((d)->__magic == (m)))
+#define ECORE_MAGIC_FAIL(d, m, fn) _ecore_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
 
 /* undef the following, we want our version */
 #undef FREE
-#define FREE(ptr) free(ptr); ptr = NULL;
+#define FREE(ptr)                  free(ptr); ptr = NULL;
 
 #undef IF_FREE
-#define IF_FREE(ptr) if (ptr) free(ptr); ptr = NULL;
+#define IF_FREE(ptr)               if (ptr) free(ptr); ptr = NULL;
 
 #undef IF_FN_DEL
-#define IF_FN_DEL(_fn, ptr) if (ptr) { _fn(ptr); ptr = NULL; }
+#define IF_FN_DEL(_fn, ptr)        if (ptr) { _fn(ptr); ptr = NULL; }
 
-inline void ecore_print_warning(const char *function, const char *sparam);
+EAPI void
+ecore_print_warning(const char *function,
+                    const char *sparam);
 
 /* convenience macros for checking pointer parameters for non-NULL */
 #undef CHECK_PARAM_POINTER_RETURN
 #define CHECK_PARAM_POINTER_RETURN(sparam, param, ret) \
-     if (!(param)) \
-        { \
-           ecore_print_warning(__FUNCTION__, sparam); \
-           return ret; \
-        }
+  if (!(param))                                        \
+    {                                                  \
+       ecore_print_warning(__FUNCTION__, sparam);      \
+       return ret;                                     \
+    }
 
 #undef CHECK_PARAM_POINTER
-#define CHECK_PARAM_POINTER(sparam, param) \
-     if (!(param)) \
-        { \
-           ecore_print_warning(__FUNCTION__, sparam); \
-           return; \
-        }
+#define CHECK_PARAM_POINTER(sparam, param)        \
+  if (!(param))                                   \
+    {                                             \
+       ecore_print_warning(__FUNCTION__, sparam); \
+       return;                                    \
+    }
+
+EAPI void _ecore_magic_fail(const void *d,
+                            Ecore_Magic m,
+                            Ecore_Magic req_m,
+                            const char *fname);
+
+void         _ecore_time_init(void);
+
+Ecore_Timer *_ecore_timer_loop_add(double in,
+                                   Ecore_Task_Cb func,
+                                   const void *data);
+void        *_ecore_timer_del(Ecore_Timer *timer);
+void         _ecore_timer_delay(Ecore_Timer *timer,
+                                double add);
+void         _ecore_timer_shutdown(void);
+void         _ecore_timer_cleanup(void);
+void         _ecore_timer_enable_new(void);
+double       _ecore_timer_next_get(void);
+void         _ecore_timer_expired_timers_call(double when);
+int          _ecore_timers_exists(void);
+
+int          _ecore_timer_expired_call(double when);
+
+void         _ecore_idler_shutdown(void);
+int          _ecore_idler_all_call(void);
+int          _ecore_idler_exist(void);
+
+void         _ecore_idle_enterer_shutdown(void);
+void         _ecore_idle_enterer_call(void);
+int          _ecore_idle_enterer_exist(void);
+
+void         _ecore_idle_exiter_shutdown(void);
+void         _ecore_idle_exiter_call(void);
+int          _ecore_idle_exiter_exist(void);
+
+void         _ecore_event_shutdown(void);
+int          _ecore_event_exist(void);
+Ecore_Event *_ecore_event_add(int type,
+                              void *ev,
+                              Ecore_End_Cb func_free,
+                              void *data);
+void         _ecore_event_call(void);
+void        *_ecore_event_handler_del(Ecore_Event_Handler *event_handler);
+
+Ecore_Timer *_ecore_exe_doomsday_clock_get(Ecore_Exe *exe);
+void         _ecore_exe_doomsday_clock_set(Ecore_Exe *exe,
+                                           Ecore_Timer *dc);
+
+void      *_ecore_event_signal_user_new(void);
+void      *_ecore_event_signal_hup_new(void);
+void      *_ecore_event_signal_exit_new(void);
+void      *_ecore_event_signal_power_new(void);
+void      *_ecore_event_signal_realtime_new(void);
+
+void      *_ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler);
+
+Eina_Bool _ecore_fd_close_on_exec(int fd);
+
+void       _ecore_main_shutdown(void);
+
+#if defined (_WIN32) || defined (__lv2ppu__) || defined (HAVE_EXOTIC)
+static inline void _ecore_signal_shutdown(void) { }
 
-typedef unsigned int              Ecore_Magic;
+static inline void _ecore_signal_init(void) { }
 
-typedef struct _Ecore_List2       Ecore_List2;
-typedef struct _Ecore_List2_Data  Ecore_List2_Data;
+static inline void _ecore_signal_received_process(void) { }
 
-struct _Ecore_List2
-{
-   Ecore_List2  *next, *prev;
-   Ecore_List2  *last;
-};
+static inline int _ecore_signal_count_get(void) { return 0; }
 
-struct _Ecore_List2_Data
-{
-   Ecore_List2   __list_data;
-   void *data;
-};
-
-#ifndef _ECORE_H
-enum _Ecore_Fd_Handler_Flags
-{
-   ECORE_FD_READ = 1,
-   ECORE_FD_WRITE = 2,
-   ECORE_FD_ERROR = 4
-};
-typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags;
-enum _Ecore_Exe_Flags
-{
-   ECORE_EXE_PIPE_READ = 1,
-   ECORE_EXE_PIPE_WRITE = 2,
-   ECORE_EXE_PIPE_ERROR = 4,
-   ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8,
-   ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16,
-   ECORE_EXE_PIPE_AUTO = 32,
-   ECORE_EXE_RESPAWN = 64,
-   ECORE_EXE_USE_SH = 128,
-   ECORE_EXE_NOT_LEADER = 256
-   /* FIXME: Getting respawn to work
-    *
-    * There is no way that we can do anything about the internal state info of
-    * an external exe.  The same can be said about the state of user code.  User
-    * code in this context means the code that is using ecore_exe to manage exe's
-    * for it.
-    *
-    * Document that the exe must be respawnable, in other words, there is no
-    * state that it cannot regenerate by just killing it and starting it again.
-    * This includes state that the user code knows about, as the respawn is
-    * transparent to that code.  On the other hand, maybe a respawn event might
-    * be useful, or maybe resend the currently non existant add event.  For
-    * consistancy with ecore_con, an add event is good anyway.
-    *
-    * The Ecore_exe structure is reused for respawning, so that the (opaque)
-    * pointer held by the user remains valid.  This means that the Ecore_Exe
-    * init and del functions may need to be split into two parts each to avoid
-    * duplicating code - common code part, and the rest.  This implies that
-    * the unchanging members mentioned next should NEVER change.
-    *
-    * These structure members don't need to change -
-    *   __list_data       - we stay on the list
-    *   ECORE_MAGIC       - this is a constant
-    *   data              - passed in originally
-    *   cmd               - passed in originally
-    *   flags             - passed in originally
-    *
-    * These structure members need to change -
-    *   tag               - state that must be regenerated, zap it
-    *   pid               - it will be different
-    *   child_fd_write    - it will be different
-    *   child_fd_read     - it will be different
-    *   child_fd_error    - it will be different
-    *   write_fd_handler  - we cannot change the fd used by a handler, this changes coz the fd changes.
-    *   read_fd_handler   - we cannot change the fd used by a handler, this changes coz the fd changes.
-    *   error_fd_handler  - we cannot change the fd used by a handler, this changes coz the fd changes.
-    *
-    * Hmm, the read, write, and error buffers could be tricky.
-    * They are not atomic, and could be in a semi complete state.
-    * They fall into the "state must be regenerated" mentioned above.
-    * A respawn/add event should take care of it.
-    *
-    * These structure members need to change -
-    *   write_data_buf    - state that must be regenerated, zap it
-    *   write_data_size   - state that must be regenerated, zap it
-    *   write_data_offset - state that must be regenerated, zap it
-    *   read_data_buf     - state that must be regenerated, zap it
-    *   read_data_size    - state that must be regenerated, zap it
-    *   error_data_buf    - state that must be regenerated, zap it
-    *   error_data_size   - state that must be regenerated, zap it
-    *   close_write       - state that must be regenerated, zap it
-    *
-    * There is the problem that an exe that fell over and needs respawning
-    * might keep falling over, keep needing to be respawned, and tie up system
-    * resources with the constant respawning.  An exponentially increasing
-    * timeout (with maximum timeout) between respawns should take care of that.
-    * Although this is not a "contention for a resource" problem, the exe falling
-    * over may be, so a random element added to the timeout may help, and won't
-    * hurt.  The user code may need to be informed that a timeout is in progress.
-    */
-};
-typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
-enum _Ecore_Poller_Type
-{
-   ECORE_POLLER_CORE = 0
-};
-typedef enum _Ecore_Poller_Type Ecore_Poller_Type;
+static inline void _ecore_signal_call(void) { }
 
-#ifndef _WIN32
-typedef struct _Ecore_Exe           Ecore_Exe;
+#else
+void _ecore_signal_shutdown(void);
+void _ecore_signal_init(void);
+void _ecore_signal_received_process(void);
+int  _ecore_signal_count_get(void);
+void _ecore_signal_call(void);
 #endif
-typedef struct _Ecore_Timer         Ecore_Timer;
-typedef struct _Ecore_Idler         Ecore_Idler;
-typedef struct _Ecore_Idle_Enterer  Ecore_Idle_Enterer;
-typedef struct _Ecore_Idle_Exiter   Ecore_Idle_Exiter;
-typedef struct _Ecore_Fd_Handler    Ecore_Fd_Handler;
-typedef struct _Ecore_Event_Handler Ecore_Event_Handler;
-typedef struct _Ecore_Event_Filter  Ecore_Event_Filter;
-typedef struct _Ecore_Event         Ecore_Event;
-typedef struct _Ecore_Animator      Ecore_Animator;
-typedef struct _Ecore_Poller        Ecore_Poller;
 
+void       _ecore_exe_init(void);
+void       _ecore_exe_shutdown(void);
 #ifndef _WIN32
-struct _Ecore_Exe
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   pid_t        pid;
-   void        *data;
-   char        *tag;
-   char        *cmd;
-   Ecore_Exe_Flags  flags;
-   Ecore_Fd_Handler *write_fd_handler; /* the fd_handler to handle write to child - if this was used, or NULL if not */
-   Ecore_Fd_Handler *read_fd_handler; /* the fd_handler to handle read from child - if this was used, or NULL if not */
-   Ecore_Fd_Handler *error_fd_handler; /* the fd_handler to handle errors from child - if this was used, or NULL if not */
-   void        *write_data_buf; /* a data buffer for data to write to the child -
-                                 * realloced as needed for more data and flushed when the fd handler says writes are possible
-                                */
-   int          write_data_size; /* the size in bytes of the data buffer */
-   int          write_data_offset; /* the offset in bytes in the data buffer */
-   void        *read_data_buf; /* data read from the child awating delivery to an event */
-   int          read_data_size; /* data read from child in bytes */
-   void        *error_data_buf; /* errors read from the child awating delivery to an event */
-   int          error_data_size; /* errors read from child in bytes */
-   int          child_fd_write;        /* fd to write TO to send data to the child */
-   int          child_fd_read; /* fd to read FROM when child has sent us (the parent) data */
-   int          child_fd_error;        /* fd to read FROM when child has sent us (the parent) errors */
-   int          child_fd_write_x;      /* fd to write TO to send data to the child */
-   int          child_fd_read_x;       /* fd to read FROM when child has sent us (the parent) data */
-   int          child_fd_error_x;      /* fd to read FROM when child has sent us (the parent) errors */
-   int          close_stdin;
-
-   int start_bytes, end_bytes, start_lines, end_lines; /* Number of bytes/lines to auto pipe at start/end of stdout/stderr. */
-
-   Ecore_Timer *doomsday_clock; /* The Timer of Death.  Muahahahaha. */
-   void        *doomsday_clock_dead; /* data for the doomsday clock */
-};
+Ecore_Exe *_ecore_exe_find(pid_t pid);
+void      *_ecore_exe_event_del_new(void);
+void       _ecore_exe_event_del_free(void *data,
+                                     void *ev);
 #endif
 
-struct _Ecore_Timer
-{
-   Ecore_List2     __list_data;
-   ECORE_MAGIC;
-   double          in;
-   double          at;
-   double          pending;
-   unsigned char   delete_me : 1;
-   unsigned char   just_added : 1;
-   unsigned char   frozen : 1;
-   int           (*func) (void *data);
-   void           *data;
-};
-
-struct _Ecore_Idler
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   int          delete_me : 1;
-   int        (*func) (void *data);
-   void        *data;
-};
-
-struct _Ecore_Idle_Enterer
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   int          delete_me : 1;
-   int        (*func) (void *data);
-   void        *data;
-};
-
-struct _Ecore_Idle_Exiter
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   int          delete_me : 1;
-   int        (*func) (void *data);
-   void        *data;
-};
-
-struct _Ecore_Fd_Handler
-{
-   Ecore_List2               __list_data;
-   ECORE_MAGIC;
-   int                      fd;
-   Ecore_Fd_Handler_Flags   flags;
-   int                      read_active : 1;
-   int                      write_active : 1;
-   int                      error_active : 1;
-   int                      delete_me : 1;
-   int                    (*func) (void *data, Ecore_Fd_Handler *fd_handler);
-   void                    *data;
-   int                    (*buf_func) (void *data, Ecore_Fd_Handler *fd_handler);
-   void                    *buf_data;
-   void                   (*prep_func) (void *data, Ecore_Fd_Handler *fd_handler);
-   void                    *prep_data;
-};
-
-struct _Ecore_Event_Handler
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   int          type;
-   int          delete_me : 1;
-   int        (*func) (void *data, int type, void *event);
-   void        *data;
-};
-
-struct _Ecore_Event_Filter
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   int          delete_me : 1;
-   void *     (*func_start) (void *data);
-   int        (*func_filter) (void *data, void *loop_data, int type, void *event);
-   void       (*func_end) (void *data, void *loop_data);
-   void        *loop_data;
-   void        *data;
-};
-
-struct _Ecore_Event
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   int          type;
-   void        *event;
-   int          delete_me : 1;
-   void       (*func_free) (void *data, void *ev);
-   void        *data;
-};
-
-struct _Ecore_Animator
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   signed char  delete_me : 1;
-   int        (*func) (void *data);
-   void        *data;
-};
-
-struct _Ecore_Poller
-{
-   Ecore_List2   __list_data;
-   ECORE_MAGIC;
-   int          ibit;
-   signed char  delete_me : 1;
-   int        (*func) (void *data);
-   void        *data;
-};
+void _ecore_animator_shutdown(void);
 
-#endif
+void _ecore_poller_shutdown(void);
 
-EAPI void          _ecore_magic_fail(void *d, Ecore_Magic m, Ecore_Magic req_m, const char *fname);
+void _ecore_fps_debug_init(void);
+void _ecore_fps_debug_shutdown(void);
+void _ecore_fps_debug_runtime_add(double t);
 
-void          _ecore_timer_shutdown(void);
-void          _ecore_timer_cleanup(void);
-void          _ecore_timer_enable_new(void);
-double        _ecore_timer_next_get(void);
-int           _ecore_timer_call(double when);
+void _ecore_thread_init(void);
+void _ecore_thread_shutdown(void);
 
-void          _ecore_idler_shutdown(void);
-int           _ecore_idler_call(void);
-int           _ecore_idler_exist(void);
+void _ecore_glib_init(void);
+void _ecore_glib_shutdown(void);
 
-void          _ecore_idle_enterer_shutdown(void);
-void          _ecore_idle_enterer_call(void);
-int           _ecore_idle_enterer_exist(void);
+void _ecore_job_init(void);
+void _ecore_job_shutdown(void);
 
-void          _ecore_idle_exiter_shutdown(void);
-void          _ecore_idle_exiter_call(void);
-int           _ecore_idle_exiter_exist(void);
+void _ecore_main_loop_init(void);
+void _ecore_main_loop_shutdown(void);
 
-void          _ecore_event_shutdown(void);
-int           _ecore_event_exist(void);
-Ecore_Event  *_ecore_event_add(int type, void *ev, void (*func_free) (void *data, void *ev), void *data);
-void         *_ecore_event_del(Ecore_Event *event);
-void          _ecore_event_call(void);
+void _ecore_throttle(void);
 
-EAPI void         *_ecore_event_signal_user_new(void);
-void         *_ecore_event_signal_hup_new(void);
-void         *_ecore_event_signal_exit_new(void);
-void         *_ecore_event_signal_power_new(void);
-void         *_ecore_event_signal_realtime_new(void);
+void _ecore_main_call_flush(void);
 
-void          _ecore_main_shutdown(void);
+extern int _ecore_main_lock_count;
+extern Eina_Lock _ecore_main_loop_lock;
 
-#ifdef _WIN32
-static inline void _ecore_signal_shutdown(void) { }
-static inline void _ecore_signal_init(void) { }
-static inline int  _ecore_signal_count_get(void) { return 0; }
-static inline void _ecore_signal_call(void) { }
+static inline void
+_ecore_lock(void)
+{
+#ifdef HAVE_THREAD_SAFETY
+   eina_lock_take(&_ecore_main_loop_lock);
 #else
-void          _ecore_signal_shutdown(void);
-void          _ecore_signal_init(void);
-int           _ecore_signal_count_get(void);
-void          _ecore_signal_call(void);
+   /* at least check we're not being called from a thread */
+   EINA_MAIN_LOOP_CHECK_RETURN;
 #endif
+   _ecore_main_lock_count++;
+   /* assert(_ecore_main_lock_count == 1); */
+}
 
-#ifdef _WIN32
-static inline void _ecore_exe_init(void) { }
-static inline void _ecore_exe_shutdown(void) { }
-#else
-void          _ecore_exe_init(void);
-void          _ecore_exe_shutdown(void);
-Ecore_Exe    *_ecore_exe_find(pid_t pid);
-void         *_ecore_exe_event_del_new(void);
-void          _ecore_exe_event_del_free(void *data, void *ev);
+static inline void
+_ecore_unlock(void)
+{
+   _ecore_main_lock_count--;
+   /* assert(_ecore_main_lock_count == 0); */
+#ifdef HAVE_THREAD_SAFETY
+   eina_lock_release(&_ecore_main_loop_lock);
 #endif
+}
+
+/*
+ * Callback wrappers all assume that ecore _ecore_lock has been called
+ */
+static inline Eina_Bool
+_ecore_call_task_cb(Ecore_Task_Cb func,
+                    void *data)
+{
+   Eina_Bool r;
 
-void          _ecore_animator_shutdown(void);
+   _ecore_unlock();
+   r = func(data);
+   _ecore_lock();
 
-void          _ecore_poller_shutdown(void);
+   return r;
+}
 
-EAPI void         *_ecore_list2_append           (void *in_list, void *in_item);
-EAPI void         *_ecore_list2_prepend          (void *in_list, void *in_item);
-EAPI void         *_ecore_list2_append_relative  (void *in_list, void *in_item, void *in_relative);
-EAPI void         *_ecore_list2_prepend_relative (void *in_list, void *in_item, void *in_relative);
-EAPI void         *_ecore_list2_remove           (void *in_list, void *in_item);
-EAPI void         *_ecore_list2_find             (void *in_list, void *in_item);
+static inline void *
+_ecore_call_data_cb(Ecore_Data_Cb func,
+                    void *data)
+{
+   void *r;
+
+   _ecore_unlock();
+   r = func(data);
+   _ecore_lock();
+
+   return r;
+}
+
+static inline void
+_ecore_call_end_cb(Ecore_End_Cb func,
+                   void *user_data,
+                   void *func_data)
+{
+   _ecore_unlock();
+   func(user_data, func_data);
+   _ecore_lock();
+}
+
+static inline Eina_Bool
+_ecore_call_filter_cb(Ecore_Filter_Cb func,
+                      void *data,
+                      void *loop_data,
+                      int type,
+                      void *event)
+{
+   Eina_Bool r;
+
+   _ecore_unlock();
+   r = func(data, loop_data, type, event);
+   _ecore_lock();
 
-void          _ecore_fps_debug_init(void);
-void          _ecore_fps_debug_shutdown(void);
-void          _ecore_fps_debug_runtime_add(double t);
+   return r;
+}
 
+static inline Eina_Bool
+_ecore_call_handler_cb(Ecore_Event_Handler_Cb func,
+                       void *data,
+                       int type,
+                       void *event)
+{
+   Eina_Bool r;
+
+   _ecore_unlock();
+   r = func(data, type, event);
+   _ecore_lock();
 
+   return r;
+}
+
+static inline void
+_ecore_call_prep_cb(Ecore_Fd_Prep_Cb func,
+                    void *data,
+                    Ecore_Fd_Handler *fd_handler)
+{
+   _ecore_unlock();
+   func(data, fd_handler);
+   _ecore_lock();
+}
+
+static inline Eina_Bool
+_ecore_call_fd_cb(Ecore_Fd_Cb func,
+                  void *data,
+                  Ecore_Fd_Handler *fd_handler)
+{
+   Eina_Bool r;
+
+   _ecore_unlock();
+   r = func(data, fd_handler);
+   _ecore_lock();
+
+   return r;
+}
+
+extern int _ecore_fps_debug;
+extern double _ecore_time_loop_time;
+extern Eina_Bool _ecore_glib_always_integrate;
+extern Ecore_Select_Function main_loop_select;
+
+Eina_Bool ecore_mempool_init(void);
+void ecore_mempool_shutdown(void);
+#define GENERIC_ALLOC_FREE_HEADER(TYPE, Type) \
+  TYPE *Type##_calloc(unsigned int);          \
+  void Type##_mp_free(TYPE *e);
+#define GENERIC_ALLOC_SIZE_DECLARE(TYPE)      \
+  size_t _ecore_sizeof_##TYPE = sizeof (TYPE);
+
+GENERIC_ALLOC_FREE_HEADER(Ecore_Animator, ecore_animator);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Handler, ecore_event_handler);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Filter, ecore_event_filter);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Event, ecore_event);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Exiter, ecore_idle_exiter);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Enterer, ecore_idle_enterer);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Idler, ecore_idler);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Job, ecore_job);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Timer, ecore_timer);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Poller, ecore_poller);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Pipe, ecore_pipe);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Fd_Handler, ecore_fd_handler);
+#ifdef _WIN32
+GENERIC_ALLOC_FREE_HEADER(Ecore_Win32_Handler, ecore_win32_handler);
+#endif
 
-extern int    _ecore_fps_debug;
+#undef GENERIC_ALLOC_FREE_HEADER
 
 #endif
index 4c555c6..05fe3b7 100644 (file)
@@ -1,37 +1,56 @@
-#ifndef _WIN32
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <signal.h>
 #include <unistd.h>
 #include <assert.h>
-#include "ecore_private.h"
+
 #include "Ecore.h"
+#include "ecore_private.h"
 
 /* make mono happy - this is evil though... */
 #undef SIGPWR
 /* valgrind in some versions/setups uses SIGRT's... hmmm */
-#undef SIGRTMIN
 
 typedef void (*Signal_Handler)(int sig, siginfo_t *si, void *foo);
 
-static void _ecore_signal_callback_set(int sig, Signal_Handler func);
-static void _ecore_signal_callback_ignore(int sig, siginfo_t *si, void *foo);
-static void _ecore_signal_callback_sigchld(int sig, siginfo_t *si, void *foo);
-static void _ecore_signal_callback_sigusr1(int sig, siginfo_t *si, void *foo);
-static void _ecore_signal_callback_sigusr2(int sig, siginfo_t *si, void *foo);
-static void _ecore_signal_callback_sighup(int sig, siginfo_t *si, void *foo);
-static void _ecore_signal_callback_sigquit(int sig, siginfo_t *si, void *foo);
-static void _ecore_signal_callback_sigint(int sig, siginfo_t *si, void *foo);
-static void _ecore_signal_callback_sigterm(int sig, siginfo_t *si, void *foo);
+static void _ecore_signal_callback_set(int            sig,
+                                       Signal_Handler func);
+static void _ecore_signal_callback_ignore(int        sig,
+                                          siginfo_t *si,
+                                          void      *foo);
+static void _ecore_signal_callback_sigchld(int        sig,
+                                           siginfo_t *si,
+                                           void      *foo);
+static void _ecore_signal_callback_sigusr1(int        sig,
+                                           siginfo_t *si,
+                                           void      *foo);
+static void _ecore_signal_callback_sigusr2(int        sig,
+                                           siginfo_t *si,
+                                           void      *foo);
+static void _ecore_signal_callback_sighup(int        sig,
+                                          siginfo_t *si,
+                                          void      *foo);
+static void _ecore_signal_callback_sigquit(int        sig,
+                                           siginfo_t *si,
+                                           void      *foo);
+static void _ecore_signal_callback_sigint(int        sig,
+                                          siginfo_t *si,
+                                          void      *foo);
+static void _ecore_signal_callback_sigterm(int        sig,
+                                           siginfo_t *si,
+                                           void      *foo);
 #ifdef SIGPWR
-static void _ecore_signal_callback_sigpwr(int sig, siginfo_t *si, void *foo);
+static void _ecore_signal_callback_sigpwr(int        sig,
+                                          siginfo_t *si,
+                                          void      *foo);
 #endif
 
-#ifdef SIGRTMIN
-static void _ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo);
-#endif
-
-static int _ecore_signal_exe_exit_delay(void *data);
+static Eina_Bool _ecore_signal_exe_exit_delay(void *data);
 
 //#define MAXSIGQ 256 // 32k
 #define MAXSIGQ 64 // 8k
@@ -47,9 +66,6 @@ static volatile sig_atomic_t sigterm_count = 0;
 #ifdef SIGPWR
 static volatile sig_atomic_t sigpwr_count = 0;
 #endif
-#ifdef SIGRTMIN
-static volatile sig_atomic_t *sigrt_count = NULL;
-#endif
 
 static volatile siginfo_t sigchld_info[MAXSIGQ];
 static volatile siginfo_t sigusr1_info[MAXSIGQ];
@@ -61,28 +77,21 @@ static volatile siginfo_t sigterm_info[MAXSIGQ];
 #ifdef SIGPWR
 static volatile siginfo_t sigpwr_info[MAXSIGQ];
 #endif
-#ifdef SIGRTMIN
-static volatile siginfo_t *sigrt_info[MAXSIGQ];
-#endif
 
 void
 _ecore_signal_shutdown(void)
 {
-#ifdef SIGRTMIN
-   int i, num = SIGRTMAX - SIGRTMIN;
-#endif
-
-   _ecore_signal_callback_set(SIGPIPE, (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGALRM, (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGCHLD, (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGUSR1, (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGUSR2, (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGHUP,  (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGQUIT, (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGINT,  (Signal_Handler) SIG_DFL);
-   _ecore_signal_callback_set(SIGTERM, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGPIPE, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGALRM, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGCHLD, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGUSR1, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGUSR2, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGHUP, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGQUIT, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGINT, (Signal_Handler)SIG_DFL);
+   _ecore_signal_callback_set(SIGTERM, (Signal_Handler)SIG_DFL);
 #ifdef SIGPWR
-   _ecore_signal_callback_set(SIGPWR, (Signal_Handler) SIG_DFL);
+   _ecore_signal_callback_set(SIGPWR, (Signal_Handler)SIG_DFL);
    sigpwr_count = 0;
 #endif
    sigchld_count = 0;
@@ -93,64 +102,29 @@ _ecore_signal_shutdown(void)
    sigint_count = 0;
    sigterm_count = 0;
    sig_count = 0;
-
-#ifdef SIGRTMIN
-   for (i = 0; i < num; i++)
-     {
-       _ecore_signal_callback_set(SIGRTMIN + i, (Signal_Handler) SIG_DFL);
-       sigrt_count[i] = 0;
-     }
-
-   if (sigrt_count)
-     {
-       free((sig_atomic_t *) sigrt_count);
-       sigrt_count = NULL;
-     }
-
-   for (i = 0; i < MAXSIGQ; i++)
-     {
-       if (sigrt_info[i])
-         {
-            free((siginfo_t *) sigrt_info[i]);
-            sigrt_info[i] = NULL;
-         }
-     }
-#endif
 }
 
 void
 _ecore_signal_init(void)
 {
-#ifdef SIGRTMIN
-   int i, num = SIGRTMAX - SIGRTMIN;
-#endif
-
    _ecore_signal_callback_set(SIGPIPE, _ecore_signal_callback_ignore);
    _ecore_signal_callback_set(SIGALRM, _ecore_signal_callback_ignore);
    _ecore_signal_callback_set(SIGCHLD, _ecore_signal_callback_sigchld);
    _ecore_signal_callback_set(SIGUSR1, _ecore_signal_callback_sigusr1);
    _ecore_signal_callback_set(SIGUSR2, _ecore_signal_callback_sigusr2);
-   _ecore_signal_callback_set(SIGHUP,  _ecore_signal_callback_sighup);
+   _ecore_signal_callback_set(SIGHUP, _ecore_signal_callback_sighup);
    _ecore_signal_callback_set(SIGQUIT, _ecore_signal_callback_sigquit);
-   _ecore_signal_callback_set(SIGINT,  _ecore_signal_callback_sigint);
+   _ecore_signal_callback_set(SIGINT, _ecore_signal_callback_sigint);
    _ecore_signal_callback_set(SIGTERM, _ecore_signal_callback_sigterm);
 #ifdef SIGPWR
-   _ecore_signal_callback_set(SIGPWR,  _ecore_signal_callback_sigpwr);
+   _ecore_signal_callback_set(SIGPWR, _ecore_signal_callback_sigpwr);
 #endif
+}
 
-#ifdef SIGRTMIN
-   sigrt_count = calloc(1, sizeof(sig_atomic_t) * num);
-   assert(sigrt_count);
-
-   for (i = 0; i < MAXSIGQ; i++)
-     {
-       sigrt_info[i] = calloc(1, sizeof(siginfo_t) * num);
-       assert(sigrt_info[i]);
-     }
-
-   for (i = 0; i < num; i++)
-      _ecore_signal_callback_set(SIGRTMIN + i, _ecore_signal_callback_sigrt);
-#endif
+void
+_ecore_signal_received_process(void)
+{
+   while (_ecore_signal_count_get()) _ecore_signal_call();
 }
 
 int
@@ -159,15 +133,20 @@ _ecore_signal_count_get(void)
    return sig_count;
 }
 
+static void
+_ecore_signal_generic_free(void *data __UNUSED__,
+                           void *event)
+{
+   free(event);
+}
+
 void
 _ecore_signal_call(void)
 {
-#ifdef SIGRTMIN
-   int i, num = SIGRTMAX - SIGRTMIN;
-#endif
    volatile sig_atomic_t n;
    sigset_t oldset, newset;
-   
+   int tot;
+
    if (sig_count == 0) return;
    sigemptyset(&newset);
    sigaddset(&newset, SIGPIPE);
@@ -182,259 +161,260 @@ _ecore_signal_call(void)
 #ifdef SIGPWR
    sigaddset(&newset, SIGPWR);
 #endif
-#ifdef SIGRTMIN
-   for (i = 0; i < num; i++)
-     sigaddset(&newset, SIGRTMIN + i);
-#endif   
    sigprocmask(SIG_BLOCK, &newset, &oldset);
    if (sigchld_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGCHLD in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sigchld_count, MAXSIGQ);
+     WRN("%i SIGCHLD in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sigchld_count, MAXSIGQ);
+   tot = sigchld_count + sigusr1_count + sigusr2_count +
+     sighup_count + sigquit_count + sigint_count + sigterm_count
+#ifdef SIGPWR
+     + sigpwr_count
+#endif
+     ;
+   
+   if (sig_count != tot)
+     {
+        ERR("sig_count (%i) != actual totals (%i) ", sig_count, tot);
+        sig_count = tot;
+     }
+   
    for (n = 0; n < sigchld_count; n++)
      {
-       pid_t pid;
-       int status;
-
-       while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
-         {
-            Ecore_Exe_Event_Del *e;
-
-            /* FIXME: If this process is set respawn, respawn with a suitable backoff
-             * period for those that need too much respawning.
-             */
-            e = _ecore_exe_event_del_new();
-            if (e)
-              {
-                 if (WIFEXITED(status))
-                   {
-                      e->exit_code = WEXITSTATUS(status);
-                      e->exited = 1;
-                   }
-                 else if (WIFSIGNALED(status))
-                   {
-                      e->exit_signal = WTERMSIG(status);
-                      e->signalled = 1;
-                   }
-                 e->pid = pid;
-                 e->exe = _ecore_exe_find(pid);
-
-                 if ((n < MAXSIGQ) && (sigchld_info[n].si_signo))
-                   e->data = sigchld_info[n]; /* No need to clone this. */
-
-                  if ((e->exe) && (e->exe->flags & (ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR)))
-                     {
-                       /* We want to report the Last Words of the exe, so delay this event.
-                        * This is twice as relevant for stderr.
-                        * There are three possibilities here -
-                        *  1 There are no Last Words.
-                        *  2 There are Last Words, they are not ready to be read.
-                        *  3 There are Last Words, they are ready to be read.
-                        *
-                        * For 1 we don't want to delay, for 3 we want to delay.
-                        * 2 is the problem.  If we check for data now and there
-                        * is none, then there is no way to differentiate 1 and 2.
-                        * If we don't delay, we may loose data, but if we do delay,
-                        * there may not be data and the exit event never gets sent.
-                        *
-                        * Any way you look at it, there has to be some time passed
-                        * before the exit event gets sent.  So the strategy here is
-                        * to setup a timer event that will send the exit event after
-                        * an arbitrary, but brief, time.
-                        *
-                        * This is probably paranoid, for the less paraniod, we could
-                        * check to see for Last Words, and only delay if there are any.
-                        * This has it's own set of problems.
-                        */
-                        IF_FN_DEL(ecore_timer_del, e->exe->doomsday_clock);
-                        e->exe->doomsday_clock = ecore_timer_add(0.1, _ecore_signal_exe_exit_delay, e);
-                     }
-                 else
-                   {
-                      _ecore_event_add(ECORE_EXE_EVENT_DEL, e,
-                                  _ecore_exe_event_del_free, NULL);
-                   }
-              }
-         }
-       sig_count--;
+        pid_t pid;
+        int status;
+
+        while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
+          {
+             Ecore_Exe_Event_Del *e;
+
+             /* FIXME: If this process is set respawn, respawn with a suitable backoff
+              * period for those that need too much respawning.
+              */
+             e = _ecore_exe_event_del_new();
+             if (e)
+               {
+                  if (WIFEXITED(status))
+                    {
+                       e->exit_code = WEXITSTATUS(status);
+                       e->exited = 1;
+                    }
+                  else if (WIFSIGNALED(status))
+                    {
+                       e->exit_signal = WTERMSIG(status);
+                       e->signalled = 1;
+                    }
+                  e->pid = pid;
+                  e->exe = _ecore_exe_find(pid);
+
+                  if ((n < MAXSIGQ) && (sigchld_info[n].si_signo))
+                    e->data = sigchld_info[n];  /* No need to clone this. */
+
+                  if ((e->exe) && (ecore_exe_flags_get(e->exe) & (ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR)))
+                    {
+     /* We want to report the Last Words of the exe, so delay this event.
+      * This is twice as relevant for stderr.
+      * There are three possibilities here -
+      *  1 There are no Last Words.
+      *  2 There are Last Words, they are not ready to be read.
+      *  3 There are Last Words, they are ready to be read.
+      *
+      * For 1 we don't want to delay, for 3 we want to delay.
+      * 2 is the problem.  If we check for data now and there
+      * is none, then there is no way to differentiate 1 and 2.
+      * If we don't delay, we may loose data, but if we do delay,
+      * there may not be data and the exit event never gets sent.
+      *
+      * Any way you look at it, there has to be some time passed
+      * before the exit event gets sent.  So the strategy here is
+      * to setup a timer event that will send the exit event after
+      * an arbitrary, but brief, time.
+      *
+      * This is probably paranoid, for the less paraniod, we could
+      * check to see for Last Words, and only delay if there are any.
+      * This has it's own set of problems.
+      */
+                         Ecore_Timer *doomsday_clock;
+
+                         doomsday_clock = _ecore_exe_doomsday_clock_get(e->exe);
+                         IF_FN_DEL(ecore_timer_del, doomsday_clock);
+                         _ecore_unlock();
+                         doomsday_clock = ecore_timer_add
+                             (0.1, _ecore_signal_exe_exit_delay, e);
+                         _ecore_lock();
+                         _ecore_exe_doomsday_clock_set(e->exe, doomsday_clock);
+                    }
+                  else
+                    {
+                       _ecore_event_add(ECORE_EXE_EVENT_DEL, e,
+                                        _ecore_exe_event_del_free, NULL);
+                    }
+               }
+          }
+        sig_count--;
      }
    sigchld_count = 0;
-   
+
    if (sigusr1_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGUSR1 in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sigusr1_count, MAXSIGQ);
+     WRN("%i SIGUSR1 in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sigusr1_count, MAXSIGQ);
    for (n = 0; n < sigusr1_count; n++)
      {
-       Ecore_Event_Signal_User *e;
+        Ecore_Event_Signal_User *e;
 
-       e = _ecore_event_signal_user_new();
-       if (e)
-         {
-            e->number = 1;
+        e = _ecore_event_signal_user_new();
+        if (e)
+          {
+             e->number = 1;
 
-            if ((n < MAXSIGQ) && (sigusr1_info[n].si_signo))
-              e->data = sigusr1_info[n];
+             if ((n < MAXSIGQ) && (sigusr1_info[n].si_signo))
+               e->data = sigusr1_info[n];
 
-            ecore_event_add(ECORE_EVENT_SIGNAL_USER, e, NULL, NULL);
-         }
-       sig_count--;
+             _ecore_event_add(ECORE_EVENT_SIGNAL_USER, e,
+                              _ecore_signal_generic_free, NULL);
+          }
+        sig_count--;
      }
    sigusr1_count = 0;
-   
+
    if (sigusr2_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGUSR2 in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sigusr2_count, MAXSIGQ);
+     WRN("%i SIGUSR2 in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sigusr2_count, MAXSIGQ);
    for (n = 0; n < sigusr2_count; n++)
      {
-       Ecore_Event_Signal_User *e;
+        Ecore_Event_Signal_User *e;
 
-       e = _ecore_event_signal_user_new();
-       if (e)
-         {
-            e->number = 2;
+        e = _ecore_event_signal_user_new();
+        if (e)
+          {
+             e->number = 2;
 
-            if ((n < MAXSIGQ) && (sigusr2_info[n].si_signo))
-              e->data = sigusr2_info[n];
+             if ((n < MAXSIGQ) && (sigusr2_info[n].si_signo))
+               e->data = sigusr2_info[n];
 
-            ecore_event_add(ECORE_EVENT_SIGNAL_USER, e, NULL, NULL);
-         }
-       sig_count--;
+             _ecore_event_add(ECORE_EVENT_SIGNAL_USER, e,
+                              _ecore_signal_generic_free, NULL);
+          }
+        sig_count--;
      }
    sigusr2_count = 0;
-   
+
    if (sighup_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGHUP in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sighup_count, MAXSIGQ);
+     WRN("%i SIGHUP in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sighup_count, MAXSIGQ);
    for (n = 0; n < sighup_count; n++)
      {
-       Ecore_Event_Signal_Hup *e;
-
-       e = _ecore_event_signal_hup_new();
-       if (e)
-         {
-            if ((n < MAXSIGQ) && (sighup_info[n].si_signo))
-              e->data = sighup_info[n];
-
-            ecore_event_add(ECORE_EVENT_SIGNAL_HUP, e, NULL, NULL);
-         }
-       sig_count--;
+        Ecore_Event_Signal_Hup *e;
+
+        e = _ecore_event_signal_hup_new();
+        if (e)
+          {
+             if ((n < MAXSIGQ) && (sighup_info[n].si_signo))
+               e->data = sighup_info[n];
+
+             _ecore_event_add(ECORE_EVENT_SIGNAL_HUP, e,
+                              _ecore_signal_generic_free, NULL);
+          }
+        sig_count--;
      }
    sighup_count = 0;
-   
+
    if (sigquit_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGQUIT in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sigquit_count, MAXSIGQ);
+     WRN("%i SIGQUIT in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sigquit_count, MAXSIGQ);
    for (n = 0; n < sigquit_count; n++)
      {
-       Ecore_Event_Signal_Exit *e;
+        Ecore_Event_Signal_Exit *e;
 
-       e = _ecore_event_signal_exit_new();
-       if (e)
-         {
-            e->quit = 1;
+        e = _ecore_event_signal_exit_new();
+        if (e)
+          {
+             e->quit = 1;
 
-            if ((n < MAXSIGQ) && (sigquit_info[n].si_signo))
-              e->data = sigquit_info[n];
+             if ((n < MAXSIGQ) && (sigquit_info[n].si_signo))
+               e->data = sigquit_info[n];
 
-            ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL);
-         }
-       sig_count--;
+             _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
+                              _ecore_signal_generic_free, NULL);
+          }
+        sig_count--;
      }
    sigquit_count = 0;
 
    if (sigint_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGINT in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sigint_count, MAXSIGQ);
+     WRN("%i SIGINT in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sigint_count, MAXSIGQ);
    for (n = 0; n < sigint_count; n++)
      {
-       Ecore_Event_Signal_Exit *e;
+        Ecore_Event_Signal_Exit *e;
 
-       e = _ecore_event_signal_exit_new();
-       if (e)
-         {
-            e->interrupt = 1;
+        e = _ecore_event_signal_exit_new();
+        if (e)
+          {
+             e->interrupt = 1;
 
-            if ((n < MAXSIGQ) && (sigint_info[n].si_signo))
-              e->data = sigint_info[n];
+             if ((n < MAXSIGQ) && (sigint_info[n].si_signo))
+               e->data = sigint_info[n];
 
-            ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL);
-         }
-       sig_count--;
+             _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
+                              _ecore_signal_generic_free, NULL);
+          }
+        sig_count--;
      }
    sigint_count = 0;
-   
+
    if (sigterm_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGTERM in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sigterm_count, MAXSIGQ);
+     WRN("%i SIGTERM in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sigterm_count, MAXSIGQ);
    for (n = 0; n < sigterm_count; n++)
      {
-       Ecore_Event_Signal_Exit *e;
+        Ecore_Event_Signal_Exit *e;
 
-       e = _ecore_event_signal_exit_new();
-       if (e)
-         {
-            e->terminate = 1;
+        e = _ecore_event_signal_exit_new();
+        if (e)
+          {
+             e->terminate = 1;
 
-            if ((n < MAXSIGQ) && (sigterm_info[n].si_signo))
-              e->data = sigterm_info[n];
+             if ((n < MAXSIGQ) && (sigterm_info[n].si_signo))
+               e->data = sigterm_info[n];
 
-            ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL);
-         }
-       sig_count--;
+             _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
+                              _ecore_signal_generic_free, NULL);
+          }
+        sig_count--;
      }
    sigterm_count = 0;
-   
+
 #ifdef SIGPWR
    if (sigpwr_count > MAXSIGQ)
-     printf("ECORE WARNING. %i SIGPWR in queue. max queue size %i. losing "
-           "siginfo for extra signals.\n", sigpwr_count, MAXSIGQ);
+     WRN("%i SIGPWR in queue. max queue size %i. losing "
+         "siginfo for extra signals.", sigpwr_count, MAXSIGQ);
    for (n = 0; n < sigpwr_count; n++)
      {
-       Ecore_Event_Signal_Power *e;
-
-       e = _ecore_event_signal_power_new();
-       if (e)
-         {
-            if ((n < MAXSIGQ) && (sigpwr_info[n].si_signo))
-              e->data = sigpwr_info[n];
-
-            ecore_event_add(ECORE_EVENT_SIGNAL_POWER, e, NULL, NULL);
-         }
-       sig_count--;
+        Ecore_Event_Signal_Power *e;
+
+        e = _ecore_event_signal_power_new();
+        if (e)
+          {
+             if ((n < MAXSIGQ) && (sigpwr_info[n].si_signo))
+               e->data = sigpwr_info[n];
+
+             _ecore_event_add(ECORE_EVENT_SIGNAL_POWER, e,
+                              _ecore_signal_generic_free, NULL);
+          }
+        sig_count--;
      }
    sigpwr_count = 0;
 #endif
-
-#ifdef SIGRTMIN
-   for (i = 0; i < num; i++)
-     {
-       if (sigrt_count[i] > MAXSIGQ)
-         printf("ECORE WARNING. %i SIGRT%i in queue. max queue size %i. losing "
-                "siginfo for extra signals.\n", i + 1, sigrt_count[i], MAXSIGQ);
-       for (n = 0; n < sigrt_count[i]; n++)
-         {
-            Ecore_Event_Signal_Realtime *e;
-
-            if ((e = _ecore_event_signal_realtime_new()))
-              {
-                 e->num = i;
-
-                 if ((n < MAXSIGQ) && (sigrt_info[n][i].si_signo))
-                   e->data = sigrt_info[n][i];
-
-                 ecore_event_add(ECORE_EVENT_SIGNAL_REALTIME, e, NULL, NULL);
-              }
-            sig_count--;
-         }
-       sigrt_count[i] = 0;
-     }
-#endif
+   sig_count = 0;
+   
    sigprocmask(SIG_SETMASK, &oldset, NULL);
 }
 
 static void
-_ecore_signal_callback_set(int sig, Signal_Handler func)
+_ecore_signal_callback_set(int            sig,
+                           Signal_Handler func)
 {
-   struct sigaction  sa;
+   struct sigaction sa;
 
    sa.sa_sigaction = func;
    sa.sa_flags = SA_RESTART | SA_SIGINFO;
@@ -443,21 +423,25 @@ _ecore_signal_callback_set(int sig, Signal_Handler func)
 }
 
 static void
-_ecore_signal_callback_ignore(int sig __UNUSED__, siginfo_t *si __UNUSED__, void *foo __UNUSED__)
+_ecore_signal_callback_ignore(int        sig __UNUSED__,
+                              siginfo_t *si __UNUSED__,
+                              void      *foo __UNUSED__)
 {
 }
 
 static void
-_ecore_signal_callback_sigchld(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sigchld(int        sig __UNUSED__,
+                               siginfo_t *si,
+                               void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
    n = sigchld_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sigchld_info[n] = *si;
-       else
-         sigchld_info[n].si_signo = 0;
+        if (si)
+          sigchld_info[n] = *si;
+        else
+          sigchld_info[n].si_signo = 0;
      }
 
    sigchld_count++;
@@ -465,96 +449,108 @@ _ecore_signal_callback_sigchld(int sig __UNUSED__, siginfo_t *si, void *foo __UN
 }
 
 static void
-_ecore_signal_callback_sigusr1(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sigusr1(int        sig __UNUSED__,
+                               siginfo_t *si,
+                               void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
-   n = sigchld_count;
+   n = sigusr1_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sigusr1_info[n] = *si;
-       else
-         sigusr1_info[n].si_signo = 0;
+        if (si)
+          sigusr1_info[n] = *si;
+        else
+          sigusr1_info[n].si_signo = 0;
      }
    sigusr1_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigusr2(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sigusr2(int        sig __UNUSED__,
+                               siginfo_t *si,
+                               void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
-   n = sigchld_count;
+   n = sigusr2_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sigusr2_info[n] = *si;
-       else
-         sigusr2_info[n].si_signo = 0;
+        if (si)
+          sigusr2_info[n] = *si;
+        else
+          sigusr2_info[n].si_signo = 0;
      }
    sigusr2_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sighup(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sighup(int        sig __UNUSED__,
+                              siginfo_t *si,
+                              void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
-   n = sigchld_count;
+   n = sighup_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sighup_info[n] = *si;
-       else
-         sighup_info[n].si_signo = 0;
+        if (si)
+          sighup_info[n] = *si;
+        else
+          sighup_info[n].si_signo = 0;
      }
    sighup_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigquit(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sigquit(int        sig __UNUSED__,
+                               siginfo_t *si,
+                               void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
-   n = sigchld_count;
+   n = sigquit_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sigquit_info[n] = *si;
-       else
-         sigquit_info[n].si_signo = 0;
+        if (si)
+          sigquit_info[n] = *si;
+        else
+          sigquit_info[n].si_signo = 0;
      }
    sigquit_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigint(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sigint(int        sig __UNUSED__,
+                              siginfo_t *si,
+                              void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
-   n = sigchld_count;
+   n = sigint_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sigint_info[n] = *si;
-       else
-         sigint_info[n].si_signo = 0;
+        if (si)
+          sigint_info[n] = *si;
+        else
+          sigint_info[n].si_signo = 0;
      }
    sigint_count++;
    sig_count++;
 }
 
 static void
-_ecore_signal_callback_sigterm(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sigterm(int        sig __UNUSED__,
+                               siginfo_t *si,
+                               void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
-   n = sigchld_count;
+   n = sigterm_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sigterm_info[n] = *si;
-       else
-         sigterm_info[n].si_signo = 0;
+        if (si)
+          sigterm_info[n] = *si;
+        else
+          sigterm_info[n].si_signo = 0;
      }
    sigterm_count++;
    sig_count++;
@@ -562,41 +558,26 @@ _ecore_signal_callback_sigterm(int sig __UNUSED__, siginfo_t *si, void *foo __UN
 
 #ifdef SIGPWR
 static void
-_ecore_signal_callback_sigpwr(int sig __UNUSED__, siginfo_t *si, void *foo __UNUSED__)
+_ecore_signal_callback_sigpwr(int        sig __UNUSED__,
+                              siginfo_t *si,
+                              void      *foo __UNUSED__)
 {
    volatile sig_atomic_t n;
-   n = sigchld_count;
+   n = sigpwr_count;
    if (n < MAXSIGQ)
      {
-       if (si)
-         sigpwr_info[n] = *si;
-       else
-         sigpwr_info[n].si_signo = 0;
+        if (si)
+          sigpwr_info[n] = *si;
+        else
+          sigpwr_info[n].si_signo = 0;
      }
    sigpwr_count++;
    sig_count++;
 }
-#endif
 
-#ifdef SIGRTMIN
-static void
-_ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo __UNUSED__)
-{
-   volatile sig_atomic_t n;
-   n = sigchld_count;
-   if (n < MAXSIGQ)
-     {
-       if (si)
-         sigrt_info[n][sig - SIGRTMIN] = *si;
-       else
-         sigrt_info[n][sig - SIGRTMIN].si_signo = 0;
-     }
-   sigrt_count[sig - SIGRTMIN]++;
-   sig_count++;
-}
 #endif
 
-static int
+static Eina_Bool
 _ecore_signal_exe_exit_delay(void *data)
 {
    Ecore_Exe_Event_Del *e;
@@ -604,10 +585,10 @@ _ecore_signal_exe_exit_delay(void *data)
    e = data;
    if (e)
      {
-       e->exe->doomsday_clock = NULL;
-       _ecore_event_add(ECORE_EXE_EVENT_DEL, e,
-                        _ecore_exe_event_del_free, NULL);
+        _ecore_exe_doomsday_clock_set(e->exe, NULL);
+        _ecore_event_add(ECORE_EXE_EVENT_DEL, e,
+                         _ecore_exe_event_del_free, NULL);
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
-#endif
+
diff --git a/src/lib/ecore/ecore_thread.c b/src/lib/ecore/ecore_thread.c
new file mode 100644 (file)
index 0000000..5c6880b
--- /dev/null
@@ -0,0 +1,1611 @@
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <sys/time.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+#ifdef EFL_HAVE_THREADS
+
+# define LK(x) Eina_Lock x
+# define LKI(x) eina_lock_new(&(x))
+# define LKD(x) eina_lock_free(&(x))
+# define LKL(x) eina_lock_take(&(x))
+# define LKU(x) eina_lock_release(&(x))
+
+# define CD(x) Eina_Condition x
+# define CDI(x, m) eina_condition_new(&(x), &(m))
+# define CDD(x) eina_condition_free(&(x))
+# define CDB(x) eina_condition_broadcast(&(x))
+# define CDW(x, t) eina_condition_timedwait(&(x), t)
+
+# define LRWK(x) Eina_RWLock x
+# define LRWKI(x) eina_rwlock_new(&(x));
+# define LRWKD(x) eina_rwlock_free(&(x));
+# define LRWKWL(x) eina_rwlock_take_write(&(x));
+# define LRWKRL(x) eina_rwlock_take_read(&(x));
+# define LRWKU(x) eina_rwlock_release(&(x));
+
+# ifdef EFL_HAVE_POSIX_THREADS
+#  include <pthread.h>
+#  ifdef __linux__
+#   include <sched.h>
+#   include <sys/resource.h>
+#   include <unistd.h>
+#   include <sys/syscall.h>
+#   include <errno.h>
+#  endif
+
+#  define PH(x)        pthread_t x
+#  define PHE(x, y)    pthread_equal(x, y)
+#  define PHS()        pthread_self()
+#  define PHC(x, f, d) pthread_create(&(x), NULL, (void *)f, d)
+#  define PHJ(x)       pthread_join(x, NULL)
+#  define PHA(x)       pthread_cancel(x)
+
+# else /* EFL_HAVE_WIN32_THREADS */
+
+#  define WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+#  undef WIN32_LEAN_AND_MEAN
+
+typedef struct
+{
+   HANDLE thread;
+   void  *val;
+} win32_thread;
+
+static Eina_List    *_ecore_thread_win32_threads = NULL;
+static Eina_Lock     _ecore_thread_win32_lock;
+
+#  define PH(x)     win32_thread * x
+#  define PHE(x, y) ((x) == (y))
+
+static win32_thread *
+_ecore_thread_win32_self()
+{
+   win32_thread *t;
+   Eina_List *l;
+
+   LKL(_ecore_thread_win32_lock);
+   EINA_LIST_FOREACH(_ecore_thread_win32_threads, l, t)
+     if (t->thread == GetCurrentThread())
+       {
+          LKU(_ecore_thread_win32_lock);
+          return t;
+       }
+
+   LKU(_ecore_thread_win32_lock);
+   return NULL;
+}
+
+#  define PHS()     _ecore_thread_win32_self()
+
+static int
+_ecore_thread_win32_create(win32_thread         **x,
+                           LPTHREAD_START_ROUTINE f,
+                           void                  *d)
+{
+   win32_thread *t;
+
+   t = (win32_thread *)calloc(1, sizeof(win32_thread));
+   if (!t)
+     return -1;
+
+   LKL(_ecore_thread_win32_lock);
+   (t)->thread = CreateThread(NULL, 0, f, d, 0, NULL);
+   if (!t->thread)
+     {
+        free(t);
+        LKU(_ecore_thread_win32_lock);
+        return -1;
+     }
+   t->val = d;
+   *x = t;
+   _ecore_thread_win32_threads = eina_list_append(_ecore_thread_win32_threads, t);
+   LKU(_ecore_thread_win32_lock);
+
+   return 0;
+}
+
+#  define PHC(x, f, d) _ecore_thread_win32_create(&(x), (LPTHREAD_START_ROUTINE)f, d)
+
+static int
+_ecore_thread_win32_join(win32_thread *x,
+                         void        **res)
+{
+   if (!PHE(x, PHS()))
+     {
+        WaitForSingleObject(x->thread, INFINITE);
+        CloseHandle(x->thread);
+     }
+   if (res) *res = x->val;
+   _ecore_thread_win32_threads = eina_list_remove(_ecore_thread_win32_threads, x);
+   free(x);
+
+   return 0;
+}
+
+#  define PHJ(x) _ecore_thread_win32_join(x, NULL)
+#  define PHA(x)    TerminateThread(x->thread, 0)
+
+# endif
+
+#endif
+
+typedef struct _Ecore_Pthread_Worker Ecore_Pthread_Worker;
+typedef struct _Ecore_Pthread        Ecore_Pthread;
+typedef struct _Ecore_Thread_Data    Ecore_Thread_Data;
+
+struct _Ecore_Thread_Data
+{
+   void        *data;
+   Eina_Free_Cb cb;
+};
+
+struct _Ecore_Pthread_Worker
+{
+   union {
+      struct
+      {
+         Ecore_Thread_Cb func_blocking;
+      } short_run;
+      struct
+      {
+         Ecore_Thread_Cb        func_heavy;
+         Ecore_Thread_Notify_Cb func_notify;
+
+         Ecore_Pthread_Worker  *direct_worker;
+
+         int                    send;
+         int                    received;
+      } feedback_run;
+      struct {
+         Ecore_Thread_Cb func_main;
+         Ecore_Thread_Notify_Cb func_notify;
+
+         Ecore_Pipe            *send;
+         Ecore_Pthread_Worker  *direct_worker;
+
+         struct {
+            int send;
+            int received;
+         } from, to;
+      } message_run;
+   } u;
+
+   Ecore_Thread_Cb func_cancel;
+   Ecore_Thread_Cb func_end;
+#ifdef EFL_HAVE_THREADS
+                   PH(self);
+   Eina_Hash      *hash;
+                   CD(cond);
+                   LK(mutex);
+#endif
+
+   const void     *data;
+
+   int cancel;
+
+#ifdef EFL_HAVE_THREADS
+   LK(cancel_mutex);
+#endif
+
+   Eina_Bool message_run : 1;
+   Eina_Bool feedback_run : 1;
+   Eina_Bool kill : 1;
+   Eina_Bool reschedule : 1;
+   Eina_Bool no_queue : 1;
+};
+
+#ifdef EFL_HAVE_THREADS
+typedef struct _Ecore_Pthread_Notify Ecore_Pthread_Notify;
+struct _Ecore_Pthread_Notify
+{
+   Ecore_Pthread_Worker *work;
+   const void *user_data;
+};
+
+typedef void *(*Ecore_Thread_Sync_Cb)(void* data, Ecore_Thread *thread);
+
+typedef struct _Ecore_Pthread_Message Ecore_Pthread_Message;
+struct _Ecore_Pthread_Message
+{
+   union {
+      Ecore_Thread_Cb async;
+      Ecore_Thread_Sync_Cb sync;
+   } u;
+
+   const void *data;
+
+   int code;
+
+   Eina_Bool callback : 1;
+   Eina_Bool sync : 1;
+};
+
+#endif
+
+static int _ecore_thread_count_max = 0;
+
+#ifdef EFL_HAVE_THREADS
+
+static void _ecore_thread_handler(void *data);
+
+static int _ecore_thread_count = 0;
+
+static Eina_List *_ecore_running_job = NULL;
+static Eina_List *_ecore_pending_job_threads = NULL;
+static Eina_List *_ecore_pending_job_threads_feedback = NULL;
+static LK(_ecore_pending_job_threads_mutex);
+static LK(_ecore_running_job_mutex);
+
+static Eina_Hash *_ecore_thread_global_hash = NULL;
+static LRWK(_ecore_thread_global_hash_lock);
+static LK(_ecore_thread_global_hash_mutex);
+static CD(_ecore_thread_global_hash_cond);
+
+static Eina_Bool have_main_loop_thread = 0;
+
+static Eina_Trash *_ecore_thread_worker_trash = NULL;
+static int _ecore_thread_worker_count = 0;
+
+static void                 *_ecore_thread_worker(void *);
+static Ecore_Pthread_Worker *_ecore_thread_worker_new(void);
+
+static PH(get_main_loop_thread) (void)
+{
+   static PH(main_loop_thread);
+   static pid_t main_loop_pid;
+   pid_t pid = getpid();
+
+   if (pid != main_loop_pid)
+     {
+        main_loop_pid = pid;
+        main_loop_thread = PHS();
+        have_main_loop_thread = 1;
+     }
+
+   return main_loop_thread;
+}
+
+static void
+_ecore_thread_worker_free(Ecore_Pthread_Worker *worker)
+{
+   LKD(worker->cancel_mutex);
+   CDD(worker->cond);
+   LKD(worker->mutex);
+
+   if (_ecore_thread_worker_count > ((_ecore_thread_count_max + 1) * 16))
+     {
+        _ecore_thread_worker_count--;
+        free(worker);
+        return;
+     }
+
+   eina_trash_push(&_ecore_thread_worker_trash, worker);
+}
+
+static void
+_ecore_thread_data_free(void *data)
+{
+   Ecore_Thread_Data *d = data;
+
+   if (d->cb) d->cb(d->data);
+   free(d);
+}
+
+static void
+_ecore_thread_join(PH(thread))
+{
+   PHJ(thread);
+}
+
+static void
+_ecore_thread_kill(Ecore_Pthread_Worker *work)
+{
+   if (work->cancel)
+     {
+        if (work->func_cancel)
+          work->func_cancel((void *)work->data, (Ecore_Thread *)work);
+     }
+   else
+     {
+        if (work->func_end)
+          work->func_end((void *)work->data, (Ecore_Thread *)work);
+     }
+
+   if (work->feedback_run)
+     {
+        if (work->u.feedback_run.direct_worker)
+          _ecore_thread_worker_free(work->u.feedback_run.direct_worker);
+     }
+   if (work->hash)
+     eina_hash_free(work->hash);
+   _ecore_thread_worker_free(work);
+}
+
+static void
+_ecore_thread_handler(void *data)
+{
+   Ecore_Pthread_Worker *work = data;
+
+   if (work->feedback_run)
+     {
+        if (work->u.feedback_run.send != work->u.feedback_run.received)
+          {
+             work->kill = EINA_TRUE;
+             return;
+          }
+     }
+
+   _ecore_thread_kill(work);
+}
+
+#if 0
+static void
+_ecore_nothing_handler(void *data __UNUSED__, void *buffer __UNUSED__, unsigned int nbyte __UNUSED__)
+{
+}
+#endif
+
+static void
+_ecore_notify_handler(void *data)
+{
+   Ecore_Pthread_Notify *notify = data;
+   Ecore_Pthread_Worker *work = notify->work;
+   void *user_data = (void*) notify->user_data;
+
+   work->u.feedback_run.received++;
+
+   if (work->u.feedback_run.func_notify)
+     work->u.feedback_run.func_notify((void *)work->data, (Ecore_Thread *)work, user_data);
+
+   /* Force reading all notify event before killing the thread */
+   if (work->kill && work->u.feedback_run.send == work->u.feedback_run.received)
+     {
+        _ecore_thread_kill(work);
+     }
+
+   free(notify);
+}
+
+static void
+_ecore_message_notify_handler(void *data)
+{
+   Ecore_Pthread_Notify *notify = data;
+   Ecore_Pthread_Worker *work = notify->work;
+   Ecore_Pthread_Message *user_data = (void *) notify->user_data;
+   Eina_Bool delete = EINA_TRUE;
+
+   work->u.message_run.from.received++;
+
+   if (!user_data->callback)
+     {
+        if (work->u.message_run.func_notify)
+          work->u.message_run.func_notify((void *) work->data, (Ecore_Thread *) work, (void *) user_data->data);
+     }
+   else
+     {
+        if (user_data->sync)
+          {
+             user_data->data = user_data->u.sync((void*) user_data->data, (Ecore_Thread *) work);
+             user_data->callback = EINA_FALSE;
+             user_data->code = INT_MAX;
+             ecore_pipe_write(work->u.message_run.send, &user_data, sizeof (Ecore_Pthread_Message *));
+
+             delete = EINA_FALSE;
+          }
+        else
+          {
+             user_data->u.async((void*) user_data->data, (Ecore_Thread *) work);
+          }
+     }
+
+   if (delete)
+     {
+        free(user_data);
+     }
+
+   /* Force reading all notify event before killing the thread */
+   if (work->kill && work->u.message_run.from.send == work->u.message_run.from.received)
+     {
+        _ecore_thread_kill(work);
+     }
+   free(notify);
+}
+
+static void
+_ecore_short_job(PH(thread))
+{
+   Ecore_Pthread_Worker *work;
+   int cancel;
+
+   LKL(_ecore_pending_job_threads_mutex);
+   
+   if (!_ecore_pending_job_threads)
+     {
+        LKU(_ecore_pending_job_threads_mutex);
+        return;
+     }
+   
+   work = eina_list_data_get(_ecore_pending_job_threads);
+   _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads,
+                                                      _ecore_pending_job_threads);
+   LKU(_ecore_pending_job_threads_mutex);
+
+   LKL(_ecore_running_job_mutex);
+   _ecore_running_job = eina_list_append(_ecore_running_job, work);
+   LKU(_ecore_running_job_mutex);
+   
+   LKL(work->cancel_mutex);
+   cancel = work->cancel;
+   LKU(work->cancel_mutex);
+   work->self = thread;
+   if (!cancel)
+     work->u.short_run.func_blocking((void *) work->data, (Ecore_Thread*) work);
+
+   LKL(_ecore_running_job_mutex);
+   _ecore_running_job = eina_list_remove(_ecore_running_job, work);
+   LKU(_ecore_running_job_mutex);
+   
+   if (work->reschedule)
+     {
+        work->reschedule = EINA_FALSE;
+        
+        LKL(_ecore_pending_job_threads_mutex);
+        _ecore_pending_job_threads = eina_list_append(_ecore_pending_job_threads, work);
+        LKU(_ecore_pending_job_threads_mutex);
+     }
+   else
+     {
+        ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
+     }
+}
+
+static void
+_ecore_feedback_job(PH(thread))
+{
+   Ecore_Pthread_Worker *work;
+   int cancel;
+   
+   LKL(_ecore_pending_job_threads_mutex);
+   
+   if (!_ecore_pending_job_threads_feedback)
+     {
+        LKU(_ecore_pending_job_threads_mutex);
+        return;
+     }
+   
+   work = eina_list_data_get(_ecore_pending_job_threads_feedback);
+   _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback,
+                                                               _ecore_pending_job_threads_feedback);
+   LKU(_ecore_pending_job_threads_mutex);
+   LKL(_ecore_running_job_mutex);
+   _ecore_running_job = eina_list_append(_ecore_running_job, work);
+   LKU(_ecore_running_job_mutex);
+   
+   LKL(work->cancel_mutex);
+   cancel = work->cancel;
+   LKU(work->cancel_mutex);
+   work->self = thread;
+   if (!cancel)
+     work->u.feedback_run.func_heavy((void *) work->data, (Ecore_Thread *) work);
+
+   LKL(_ecore_running_job_mutex);
+   _ecore_running_job = eina_list_remove(_ecore_running_job, work);
+   LKU(_ecore_running_job_mutex);
+
+   if (work->reschedule)
+     {
+        work->reschedule = EINA_FALSE;
+        
+        LKL(_ecore_pending_job_threads_mutex);
+        _ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, work);
+        LKU(_ecore_pending_job_threads_mutex);
+     }
+   else
+     {
+        ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
+     }
+}
+
+static void *
+_ecore_direct_worker(Ecore_Pthread_Worker *work)
+{
+#ifdef EFL_POSIX_THREADS
+   pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+#endif
+
+   eina_sched_prio_drop();
+
+   work->self = PHS();
+   if (work->message_run)
+     work->u.message_run.func_main((void *) work->data, (Ecore_Thread *) work);
+   else
+     work->u.feedback_run.func_heavy((void *) work->data, (Ecore_Thread *) work);
+
+   ecore_main_loop_thread_safe_call_async(_ecore_thread_handler, work);
+
+   ecore_main_loop_thread_safe_call_async((Ecore_Cb) _ecore_thread_join, 
+                                         (void*) PHS());
+
+   return NULL;
+}
+
+static void *
+_ecore_thread_worker(void *data __UNUSED__)
+{
+#ifdef EFL_POSIX_THREADS
+   pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+#endif
+
+   eina_sched_prio_drop();
+
+restart:
+   _ecore_short_job(PHS());
+   _ecore_feedback_job(PHS());
+
+   /* FIXME: Check if there is feedback running task todo, and switch to feedback run handler. */
+
+   LKL(_ecore_pending_job_threads_mutex);
+   if (_ecore_pending_job_threads || _ecore_pending_job_threads_feedback)
+     {
+        LKU(_ecore_pending_job_threads_mutex);
+        goto restart;
+     }
+   LKU(_ecore_pending_job_threads_mutex);
+
+   /* Sleep a little to prevent premature death */
+#ifdef _WIN32
+   Sleep(1); /* around 50ms */
+#else
+   usleep(50);
+#endif
+
+   LKL(_ecore_pending_job_threads_mutex);
+   if (_ecore_pending_job_threads || _ecore_pending_job_threads_feedback)
+     {
+        LKU(_ecore_pending_job_threads_mutex);
+        goto restart;
+     }
+   _ecore_thread_count--;
+
+   ecore_main_loop_thread_safe_call_async((Ecore_Cb) _ecore_thread_join,
+                                         (void*) PHS());
+   LKU(_ecore_pending_job_threads_mutex);
+
+   return NULL;
+}
+
+#endif
+
+static Ecore_Pthread_Worker *
+_ecore_thread_worker_new(void)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Pthread_Worker *result;
+
+   result = eina_trash_pop(&_ecore_thread_worker_trash);
+
+   if (!result) 
+     {
+       result = calloc(1, sizeof(Ecore_Pthread_Worker));
+       _ecore_thread_worker_count++;
+     }
+
+   LKI(result->cancel_mutex);
+   LKI(result->mutex);
+   CDI(result->cond, result->mutex);
+
+   return result;
+#else
+   return malloc(sizeof (Ecore_Pthread_Worker));
+#endif
+}
+
+void
+_ecore_thread_init(void)
+{
+   _ecore_thread_count_max = eina_cpu_count();
+   if (_ecore_thread_count_max <= 0)
+     _ecore_thread_count_max = 1;
+
+#ifdef EFL_HAVE_THREADS
+# ifdef EFL_HAVE_WIN32_THREADS
+   LKI(_ecore_thread_win32_lock);
+# endif
+   LKI(_ecore_pending_job_threads_mutex);
+   LRWKI(_ecore_thread_global_hash_lock);
+   LKI(_ecore_thread_global_hash_mutex);
+   LKI(_ecore_running_job_mutex);
+   CDI(_ecore_thread_global_hash_cond, _ecore_thread_global_hash_mutex);
+#endif
+}
+
+void
+_ecore_thread_shutdown(void)
+{
+   /* FIXME: If function are still running in the background, should we kill them ? */
+#ifdef EFL_HAVE_THREADS
+    Ecore_Pthread_Worker *work;
+    Eina_List *l;
+    Eina_Bool test;
+    int iteration = 0;
+
+    LKL(_ecore_pending_job_threads_mutex);
+
+    EINA_LIST_FREE(_ecore_pending_job_threads, work)
+      {
+         if (work->func_cancel)
+           work->func_cancel((void *)work->data, (Ecore_Thread *) work);
+         free(work);
+      }
+
+    EINA_LIST_FREE(_ecore_pending_job_threads_feedback, work)
+      {
+         if (work->func_cancel)
+           work->func_cancel((void *)work->data, (Ecore_Thread *) work);
+         free(work);
+      }
+
+    LKU(_ecore_pending_job_threads_mutex);
+    LKL(_ecore_running_job_mutex);
+
+    EINA_LIST_FOREACH(_ecore_running_job, l, work)
+      ecore_thread_cancel((Ecore_Thread*) work);
+
+    LKU(_ecore_running_job_mutex);
+
+    do
+      {
+        LKL(_ecore_pending_job_threads_mutex);
+        if (_ecore_thread_count > 0)
+          {
+             test = EINA_TRUE;
+          }
+        else
+          {
+             test = EINA_FALSE;
+          }
+        LKU(_ecore_pending_job_threads_mutex);
+        iteration++;
+        if (test) usleep(50000);
+      }
+    while (test == EINA_TRUE && iteration < 20);
+
+    if (iteration == 20 && _ecore_thread_count > 0)
+      {
+        ERR("%i of the child thread are still running after 1s. This can lead to a segv. Sorry.", _ecore_thread_count);
+      }
+
+    if (_ecore_thread_global_hash)
+      eina_hash_free(_ecore_thread_global_hash);
+    have_main_loop_thread = 0;
+
+    while ((work = eina_trash_pop(&_ecore_thread_worker_trash)))
+      {
+         free(work);
+      }
+
+    LKD(_ecore_pending_job_threads_mutex);
+    LRWKD(_ecore_thread_global_hash_lock);
+    LKD(_ecore_thread_global_hash_mutex);
+    LKD(_ecore_running_job_mutex);
+    CDD(_ecore_thread_global_hash_cond);
+# ifdef EFL_HAVE_WIN32_THREADS
+   LKU(_ecore_thread_win32_lock);
+# endif
+#endif
+}
+
+EAPI Ecore_Thread *
+ecore_thread_run(Ecore_Thread_Cb func_blocking,
+                 Ecore_Thread_Cb func_end,
+                 Ecore_Thread_Cb func_cancel,
+                 const void     *data)
+{
+   Ecore_Pthread_Worker *work;
+   Eina_Bool tried = EINA_FALSE;
+#ifdef EFL_HAVE_THREADS
+   PH(thread);
+#endif
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   
+   if (!func_blocking) return NULL;
+
+   work = _ecore_thread_worker_new();
+   if (!work)
+     {
+        if (func_cancel)
+          func_cancel((void *)data, NULL);
+        return NULL;
+     }
+
+   work->u.short_run.func_blocking = func_blocking;
+   work->func_end = func_end;
+   work->func_cancel = func_cancel;
+   work->cancel = EINA_FALSE;
+   work->feedback_run = EINA_FALSE;
+   work->message_run = EINA_FALSE;
+   work->kill = EINA_FALSE;
+   work->reschedule = EINA_FALSE;
+   work->no_queue = EINA_FALSE;
+   work->data = data;
+
+#ifdef EFL_HAVE_THREADS
+   work->self = 0;
+   work->hash = NULL;
+
+   LKL(_ecore_pending_job_threads_mutex);
+   _ecore_pending_job_threads = eina_list_append(_ecore_pending_job_threads, work);
+
+   if (_ecore_thread_count == _ecore_thread_count_max)
+     {
+        LKU(_ecore_pending_job_threads_mutex);
+        return (Ecore_Thread *)work;
+     }
+
+   LKU(_ecore_pending_job_threads_mutex);
+
+   /* One more thread could be created. */
+   eina_threads_init();
+
+   LKL(_ecore_pending_job_threads_mutex);
+
+ retry:
+   if (PHC(thread, _ecore_thread_worker, NULL) == 0)
+     {
+        _ecore_thread_count++;
+       LKU(_ecore_pending_job_threads_mutex);
+        return (Ecore_Thread *)work;
+     }
+   if (!tried)
+     {
+       _ecore_main_call_flush();
+       tried = EINA_TRUE;
+       goto retry;
+     }
+
+   if (_ecore_thread_count == 0)
+     {
+        _ecore_pending_job_threads = eina_list_remove(_ecore_pending_job_threads, work);
+
+        if (work->func_cancel)
+          work->func_cancel((void *) work->data, (Ecore_Thread *) work);
+
+        CDD(work->cond);
+        LKD(work->mutex);
+        LKD(work->cancel_mutex);
+        free(work);
+        work = NULL;
+     }
+   LKU(_ecore_pending_job_threads_mutex);
+
+   eina_threads_shutdown();
+
+   return (Ecore_Thread *)work;
+#else
+   /*
+      If no thread and as we don't want to break app that rely on this
+      facility, we will lock the interface until we are done.
+    */
+   do {
+        /* Handle reschedule by forcing it here. That would mean locking the app,
+         * would be better with an idler, but really to complex for a case where
+         * thread should really exist.
+         */
+          work->reschedule = EINA_FALSE;
+
+          func_blocking((void *)data, (Ecore_Thread *)work);
+          if (work->cancel == EINA_FALSE) func_end((void *)data, (Ecore_Thread *)work);
+          else func_cancel((void *)data, (Ecore_Thread *)work);
+     } while (work->reschedule == EINA_TRUE);
+
+   free(work);
+
+   return NULL;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_thread_cancel(Ecore_Thread *thread)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Pthread_Worker *volatile work = (Ecore_Pthread_Worker *)thread;
+   Eina_List *l;
+   int cancel;
+
+   if (!work)
+     return EINA_TRUE;
+   LKL(work->cancel_mutex);
+   cancel = work->cancel;
+   LKU(work->cancel_mutex);
+   if (cancel)
+     return EINA_FALSE;
+
+   if (work->feedback_run)
+     {
+        if (work->kill)
+          return EINA_TRUE;
+        if (work->u.feedback_run.send != work->u.feedback_run.received)
+          goto on_exit;
+     }
+
+   LKL(_ecore_pending_job_threads_mutex);
+
+   if ((have_main_loop_thread) &&
+       (PHE(get_main_loop_thread(), PHS())))
+     {
+        if (!work->feedback_run)
+          EINA_LIST_FOREACH(_ecore_pending_job_threads, l, work)
+            {
+               if ((void *)work == (void *)thread)
+                 {
+                    _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads, l);
+
+                    LKU(_ecore_pending_job_threads_mutex);
+
+                    if (work->func_cancel)
+                      work->func_cancel((void *)work->data, (Ecore_Thread *)work);
+                    free(work);
+
+                    return EINA_TRUE;
+                 }
+            }
+        else
+          EINA_LIST_FOREACH(_ecore_pending_job_threads_feedback, l, work)
+            {
+               if ((void *)work == (void *)thread)
+                 {
+                    _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback, l);
+
+                    LKU(_ecore_pending_job_threads_mutex);
+
+                    if (work->func_cancel)
+                      work->func_cancel((void *)work->data, (Ecore_Thread *)work);
+                    free(work);
+
+                    return EINA_TRUE;
+                 }
+            }
+     }
+
+   LKU(_ecore_pending_job_threads_mutex);
+
+   work = (Ecore_Pthread_Worker *)thread;
+
+   /* Delay the destruction */
+ on_exit:
+   LKL(work->cancel_mutex);
+   work->cancel = EINA_TRUE;
+   LKU(work->cancel_mutex);
+
+   return EINA_FALSE;
+#else
+   (void) thread;
+   return EINA_TRUE;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_thread_check(Ecore_Thread *thread)
+{
+   Ecore_Pthread_Worker *volatile worker = (Ecore_Pthread_Worker *) thread;
+   int cancel;
+
+   if (!worker) return EINA_TRUE;
+#ifdef EFL_HAVE_THREADS
+   LKL(worker->cancel_mutex);
+#endif
+   cancel = worker->cancel;
+   /* FIXME: there is an insane bug driving me nuts here. I don't know if
+    it's a race condition, some cache issue or some alien attack on our software.
+    But ecore_thread_check will only work correctly with a printf, all the volatile,
+    lock and even usleep don't help here... */
+   /* fprintf(stderr, "wc: %i\n", cancel); */
+#ifdef EFL_HAVE_THREADS
+   LKU(worker->cancel_mutex);
+#endif
+   return cancel;
+}
+
+EAPI Ecore_Thread *
+ecore_thread_feedback_run(Ecore_Thread_Cb        func_heavy,
+                          Ecore_Thread_Notify_Cb func_notify,
+                          Ecore_Thread_Cb        func_end,
+                          Ecore_Thread_Cb        func_cancel,
+                          const void            *data,
+                          Eina_Bool              try_no_queue)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Pthread_Worker *worker;
+   Eina_Bool tried = EINA_FALSE;
+   PH(thread);
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   
+   if (!func_heavy) return NULL;
+
+   worker = _ecore_thread_worker_new();
+   if (!worker) goto on_error;
+
+   worker->u.feedback_run.func_heavy = func_heavy;
+   worker->u.feedback_run.func_notify = func_notify;
+   worker->hash = NULL;
+   worker->func_cancel = func_cancel;
+   worker->func_end = func_end;
+   worker->data = data;
+   worker->cancel = EINA_FALSE;
+   worker->message_run = EINA_FALSE;
+   worker->feedback_run = EINA_TRUE;
+   worker->kill = EINA_FALSE;
+   worker->reschedule = EINA_FALSE;
+   worker->self = 0;
+
+   worker->u.feedback_run.send = 0;
+   worker->u.feedback_run.received = 0;
+
+   worker->u.feedback_run.direct_worker = NULL;
+
+   if (try_no_queue)
+     {
+        PH(t);
+
+        worker->u.feedback_run.direct_worker = _ecore_thread_worker_new();
+        worker->no_queue = EINA_TRUE;
+
+        eina_threads_init();
+
+     retry_direct:
+        if (PHC(t, _ecore_direct_worker, worker) == 0)
+          return (Ecore_Thread *)worker;
+       if (!tried)
+         {
+            _ecore_main_call_flush();
+            tried = EINA_TRUE;
+            goto retry_direct;
+         }
+
+        if (worker->u.feedback_run.direct_worker)
+          {
+             _ecore_thread_worker_free(worker->u.feedback_run.direct_worker);
+             worker->u.feedback_run.direct_worker = NULL;
+          }
+
+        eina_threads_shutdown();
+     }
+
+   worker->no_queue = EINA_FALSE;
+
+   LKL(_ecore_pending_job_threads_mutex);
+   _ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, worker);
+
+   if (_ecore_thread_count == _ecore_thread_count_max)
+     {
+        LKU(_ecore_pending_job_threads_mutex);
+        return (Ecore_Thread *)worker;
+     }
+
+   LKU(_ecore_pending_job_threads_mutex);
+
+   /* One more thread could be created. */
+   eina_threads_init();
+
+   LKL(_ecore_pending_job_threads_mutex);
+ retry:
+   if (PHC(thread, _ecore_thread_worker, NULL) == 0)
+     {
+        _ecore_thread_count++;
+       LKU(_ecore_pending_job_threads_mutex);
+        return (Ecore_Thread *)worker;
+     }
+   if (!tried)
+     {
+        _ecore_main_call_flush();
+       tried = EINA_TRUE;
+       goto retry;
+     }
+   LKU(_ecore_pending_job_threads_mutex);
+
+   eina_threads_shutdown();
+
+on_error:
+   LKL(_ecore_pending_job_threads_mutex);
+   if (_ecore_thread_count == 0)
+     {
+        _ecore_pending_job_threads_feedback = eina_list_remove(_ecore_pending_job_threads_feedback,
+                                                               worker);
+
+        if (func_cancel) func_cancel((void *)data, NULL);
+
+        if (worker)
+          {
+             CDD(worker->cond);
+             LKD(worker->mutex);
+             free(worker);
+             worker = NULL;
+          }
+     }
+   LKU(_ecore_pending_job_threads_mutex);
+
+   return (Ecore_Thread *)worker;
+#else
+   Ecore_Pthread_Worker worker;
+
+   (void)try_no_queue;
+
+   /*
+      If no thread and as we don't want to break app that rely on this
+      facility, we will lock the interface until we are done.
+    */
+   worker.u.feedback_run.func_heavy = func_heavy;
+   worker.u.feedback_run.func_notify = func_notify;
+   worker.u.feedback_run.send = 0;
+   worker.u.feedback_run.received = 0;
+   worker.func_cancel = func_cancel;
+   worker.func_end = func_end;
+   worker.data = data;
+   worker.cancel = EINA_FALSE;
+   worker.feedback_run = EINA_TRUE;
+   worker.message_run = EINA_FALSE;
+   worker.kill = EINA_FALSE;
+
+   do {
+        worker.reschedule = EINA_FALSE;
+
+        func_heavy((void *)data, (Ecore_Thread *)&worker);
+
+        if (worker.cancel) func_cancel((void *)data, (Ecore_Thread *)&worker);
+        else func_end((void *)data, (Ecore_Thread *)&worker);
+     } while (worker.reschedule == EINA_TRUE);
+
+   return NULL;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_thread_feedback(Ecore_Thread *thread,
+                      const void   *data)
+{
+   Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
+
+   if (!worker) return EINA_FALSE;
+
+#ifdef EFL_HAVE_THREADS
+   if (!PHE(worker->self, PHS())) return EINA_FALSE;
+
+   if (worker->feedback_run)
+     {
+        Ecore_Pthread_Notify *notify;
+
+        notify = malloc(sizeof (Ecore_Pthread_Notify));
+        if (!notify) return EINA_FALSE;
+
+        notify->user_data = data;
+        notify->work = worker;
+        worker->u.feedback_run.send++;
+
+        ecore_main_loop_thread_safe_call_async(_ecore_notify_handler, notify);
+     }
+   else if (worker->message_run)
+     {
+        Ecore_Pthread_Message *msg;
+        Ecore_Pthread_Notify *notify;
+
+        msg = malloc(sizeof (Ecore_Pthread_Message));
+        if (!msg) return EINA_FALSE;
+        msg->data = data;
+        msg->callback = EINA_FALSE;
+        msg->sync = EINA_FALSE;
+
+        notify = malloc(sizeof (Ecore_Pthread_Notify));
+        if (!notify)
+          {
+             free(msg);
+             return EINA_FALSE;
+          }
+        notify->work = worker;
+        notify->user_data = msg;
+
+        worker->u.message_run.from.send++;
+        ecore_main_loop_thread_safe_call_async(_ecore_message_notify_handler, notify);
+     }
+   else
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+#else
+   worker->u.feedback_run.func_notify((void *)worker->data, thread, (void *)data);
+
+   return EINA_TRUE;
+#endif
+}
+
+#if 0
+EAPI Ecore_Thread *
+ecore_thread_message_run(Ecore_Thread_Cb func_main,
+                        Ecore_Thread_Notify_Cb func_notify,
+                        Ecore_Thread_Cb func_end,
+                        Ecore_Thread_Cb func_cancel,
+                        const void *data)
+{
+#ifdef EFL_HAVE_THREADS
+  Ecore_Pthread_Worker *worker;
+  PH(t);
+
+  if (!func_main) return NULL;
+
+  worker = _ecore_thread_worker_new();
+  if (!worker) return NULL;
+
+  worker->u.message_run.func_main = func_main;
+  worker->u.message_run.func_notify = func_notify;
+  worker->u.message_run.direct_worker = _ecore_thread_worker_new();
+  worker->u.message_run.send = ecore_pipe_add(_ecore_nothing_handler, worker);
+  worker->u.message_run.from.send = 0;
+  worker->u.message_run.from.received = 0;
+  worker->u.message_run.to.send = 0;
+  worker->u.message_run.to.received = 0;
+
+  ecore_pipe_freeze(worker->u.message_run.send);
+
+  worker->func_cancel = func_cancel;
+  worker->func_end = func_end;
+  worker->hash = NULL;
+  worker->data = data;
+
+  worker->cancel = EINA_FALSE;
+  worker->message_run = EINA_TRUE;
+  worker->feedback_run = EINA_FALSE;
+  worker->kill = EINA_FALSE;
+  worker->reschedule = EINA_FALSE;
+  worker->no_queue = EINA_FALSE;
+  worker->self = 0;
+
+  eina_threads_init();
+
+  if (PHC(t, _ecore_direct_worker, worker) == 0)
+    return (Ecore_Thread*) worker;
+
+  eina_threads_shutdown();
+
+  if (worker->u.message_run.direct_worker) _ecore_thread_worker_free(worker->u.message_run.direct_worker);
+  if (worker->u.message_run.send) ecore_pipe_del(worker->u.message_run.send);
+
+  CDD(worker->cond);
+  LKD(worker->mutex);
+#else
+  /* Note: This type of thread can't and never will work without thread support */
+  WRN("ecore_thread_message_run called, but threads disable in Ecore, things will go wrong. Starting now !");
+# warning "You disabled threads support in ecore, I hope you know what you are doing !"
+#endif
+
+  func_cancel((void *) data, NULL);
+
+  return NULL;
+}
+#endif
+
+EAPI Eina_Bool
+ecore_thread_reschedule(Ecore_Thread *thread)
+{
+   Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
+
+   if (!worker) return EINA_FALSE;
+
+#ifdef EFL_HAVE_THREADS
+   if (!PHE(worker->self, PHS())) return EINA_FALSE;
+#endif
+
+   worker->reschedule = EINA_TRUE;
+   return EINA_TRUE;
+}
+
+EAPI int
+ecore_thread_active_get(void)
+{
+#ifdef EFL_HAVE_THREADS
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   return _ecore_thread_count;
+#else
+   return 0;
+#endif
+}
+
+EAPI int
+ecore_thread_pending_get(void)
+{
+#ifdef EFL_HAVE_THREADS
+   int ret;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   LKL(_ecore_pending_job_threads_mutex);
+   ret = eina_list_count(_ecore_pending_job_threads);
+   LKU(_ecore_pending_job_threads_mutex);
+   return ret;
+#else
+   return 0;
+#endif
+}
+
+EAPI int
+ecore_thread_pending_feedback_get(void)
+{
+#ifdef EFL_HAVE_THREADS
+   int ret;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   LKL(_ecore_pending_job_threads_mutex);
+   ret = eina_list_count(_ecore_pending_job_threads_feedback);
+   LKU(_ecore_pending_job_threads_mutex);
+   return ret;
+#else
+   return 0;
+#endif
+}
+
+EAPI int
+ecore_thread_pending_total_get(void)
+{
+#ifdef EFL_HAVE_THREADS
+   int ret;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   LKL(_ecore_pending_job_threads_mutex);
+   ret = eina_list_count(_ecore_pending_job_threads) + eina_list_count(_ecore_pending_job_threads_feedback);
+   LKU(_ecore_pending_job_threads_mutex);
+   return ret;
+#else
+   return 0;
+#endif
+}
+
+EAPI int
+ecore_thread_max_get(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
+   return _ecore_thread_count_max;
+}
+
+EAPI void
+ecore_thread_max_set(int num)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   if (num < 1) return;
+   /* avoid doing something hilarious by blocking dumb users */
+   if (num > (16 * eina_cpu_count())) num = 16 * eina_cpu_count();
+
+   _ecore_thread_count_max = num;
+}
+
+EAPI void
+ecore_thread_max_reset(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_thread_count_max = eina_cpu_count();
+}
+
+EAPI int
+ecore_thread_available_get(void)
+{
+#ifdef EFL_HAVE_THREADS
+   int ret;
+
+   LKL(_ecore_pending_job_threads_mutex);
+   ret = _ecore_thread_count_max - _ecore_thread_count;
+   LKU(_ecore_pending_job_threads_mutex);
+   return ret;
+#else
+   return 0;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_thread_local_data_add(Ecore_Thread *thread,
+                            const char   *key,
+                            void         *value,
+                            Eina_Free_Cb  cb,
+                            Eina_Bool     direct)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
+   Ecore_Thread_Data *d;
+   Eina_Bool ret;
+#endif
+
+   if ((!thread) || (!key) || (!value))
+     return EINA_FALSE;
+#ifdef EFL_HAVE_THREADS
+   if (!PHE(worker->self, PHS())) return EINA_FALSE;
+
+   if (!worker->hash)
+     worker->hash = eina_hash_string_small_new(_ecore_thread_data_free);
+
+   if (!worker->hash)
+     return EINA_FALSE;
+
+   if (!(d = malloc(sizeof(Ecore_Thread_Data))))
+     return EINA_FALSE;
+
+   d->data = value;
+   d->cb = cb;
+
+   if (direct)
+     ret = eina_hash_direct_add(worker->hash, key, d);
+   else
+     ret = eina_hash_add(worker->hash, key, d);
+   CDB(worker->cond);
+   return ret;
+#else
+   (void) cb;
+   (void) direct;
+   return EINA_FALSE;
+#endif
+}
+
+EAPI void *
+ecore_thread_local_data_set(Ecore_Thread *thread,
+                            const char   *key,
+                            void         *value,
+                            Eina_Free_Cb  cb)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
+   Ecore_Thread_Data *d, *r;
+   void *ret;
+#endif
+
+   if ((!thread) || (!key) || (!value))
+     return NULL;
+#ifdef EFL_HAVE_THREADS
+   if (!PHE(worker->self, PHS())) return NULL;
+
+   if (!worker->hash)
+     worker->hash = eina_hash_string_small_new(_ecore_thread_data_free);
+
+   if (!worker->hash)
+     return NULL;
+
+   if (!(d = malloc(sizeof(Ecore_Thread_Data))))
+     return NULL;
+
+   d->data = value;
+   d->cb = cb;
+
+   r = eina_hash_set(worker->hash, key, d);
+   CDB(worker->cond);
+   ret = r->data;
+   free(r);
+   return ret;
+#else
+   (void) cb;
+   return NULL;
+#endif
+}
+
+EAPI void *
+ecore_thread_local_data_find(Ecore_Thread *thread,
+                             const char   *key)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
+   Ecore_Thread_Data *d;
+#endif
+
+   if ((!thread) || (!key))
+     return NULL;
+#ifdef EFL_HAVE_THREADS
+   if (!PHE(worker->self, PHS())) return NULL;
+
+   if (!worker->hash)
+     return NULL;
+
+   d = eina_hash_find(worker->hash, key);
+   if (d)
+     return d->data;
+   return NULL;
+#else
+   return NULL;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_thread_local_data_del(Ecore_Thread *thread,
+                            const char   *key)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
+#endif
+
+   if ((!thread) || (!key))
+     return EINA_FALSE;
+#ifdef EFL_HAVE_THREADS
+   if (!PHE(worker->self, PHS())) return EINA_FALSE;
+
+   if (!worker->hash)
+     return EINA_FALSE;
+   return eina_hash_del_by_key(worker->hash, key);
+#else
+   return EINA_TRUE;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_thread_global_data_add(const char  *key,
+                             void        *value,
+                             Eina_Free_Cb cb,
+                             Eina_Bool    direct)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Thread_Data *d;
+   Eina_Bool ret;
+#endif
+
+   if ((!key) || (!value))
+     return EINA_FALSE;
+#ifdef EFL_HAVE_THREADS
+   LRWKWL(_ecore_thread_global_hash_lock);
+   if (!_ecore_thread_global_hash)
+     _ecore_thread_global_hash = eina_hash_string_small_new(_ecore_thread_data_free);
+   LRWKU(_ecore_thread_global_hash_lock);
+
+   if (!(d = malloc(sizeof(Ecore_Thread_Data))))
+     return EINA_FALSE;
+
+   d->data = value;
+   d->cb = cb;
+
+   if (!_ecore_thread_global_hash)
+     return EINA_FALSE;
+   LRWKWL(_ecore_thread_global_hash_lock);
+   if (direct)
+     ret = eina_hash_direct_add(_ecore_thread_global_hash, key, d);
+   else
+     ret = eina_hash_add(_ecore_thread_global_hash, key, d);
+   LRWKU(_ecore_thread_global_hash_lock);
+   CDB(_ecore_thread_global_hash_cond);
+   return ret;
+#else
+   (void) cb;
+   (void) direct;
+   return EINA_TRUE;
+#endif
+}
+
+EAPI void *
+ecore_thread_global_data_set(const char  *key,
+                             void        *value,
+                             Eina_Free_Cb cb)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Thread_Data *d, *r;
+   void *ret;
+#endif
+
+   if ((!key) || (!value))
+     return NULL;
+#ifdef EFL_HAVE_THREADS
+   LRWKWL(_ecore_thread_global_hash_lock);
+   if (!_ecore_thread_global_hash)
+     _ecore_thread_global_hash = eina_hash_string_small_new(_ecore_thread_data_free);
+   LRWKU(_ecore_thread_global_hash_lock);
+
+   if (!_ecore_thread_global_hash)
+     return NULL;
+
+   if (!(d = malloc(sizeof(Ecore_Thread_Data))))
+     return NULL;
+
+   d->data = value;
+   d->cb = cb;
+
+   LRWKWL(_ecore_thread_global_hash_lock);
+   r = eina_hash_set(_ecore_thread_global_hash, key, d);
+   LRWKU(_ecore_thread_global_hash_lock);
+   CDB(_ecore_thread_global_hash_cond);
+
+   ret = r->data;
+   free(r);
+   return ret;
+#else
+   (void) cb;
+   return NULL;
+#endif
+}
+
+EAPI void *
+ecore_thread_global_data_find(const char *key)
+{
+#ifdef EFL_HAVE_THREADS
+   Ecore_Thread_Data *ret;
+#endif
+
+   if (!key)
+     return NULL;
+#ifdef EFL_HAVE_THREADS
+   if (!_ecore_thread_global_hash) return NULL;
+
+   LRWKRL(_ecore_thread_global_hash_lock);
+   ret = eina_hash_find(_ecore_thread_global_hash, key);
+   LRWKU(_ecore_thread_global_hash_lock);
+   if (ret)
+     return ret->data;
+   return NULL;
+#else
+   return NULL;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_thread_global_data_del(const char *key)
+{
+#ifdef EFL_HAVE_THREADS
+   Eina_Bool ret;
+#endif
+
+   if (!key)
+     return EINA_FALSE;
+#ifdef EFL_HAVE_THREADS
+   if (!_ecore_thread_global_hash)
+     return EINA_FALSE;
+
+   LRWKWL(_ecore_thread_global_hash_lock);
+   ret = eina_hash_del_by_key(_ecore_thread_global_hash, key);
+   LRWKU(_ecore_thread_global_hash_lock);
+   return ret;
+#else
+   return EINA_TRUE;
+#endif
+}
+
+EAPI void *
+ecore_thread_global_data_wait(const char *key,
+                              double      seconds)
+{
+#ifdef EFL_HAVE_THREADS
+   double tm = 0;
+   Ecore_Thread_Data *ret = NULL;
+#endif
+
+   if (!key)
+     return NULL;
+#ifdef EFL_HAVE_THREADS
+   if (!_ecore_thread_global_hash)
+     return NULL;
+   if (seconds > 0)
+     tm = ecore_time_get() + seconds;
+
+   while (1)
+     {
+        LRWKRL(_ecore_thread_global_hash_lock);
+        ret = eina_hash_find(_ecore_thread_global_hash, key);
+        LRWKU(_ecore_thread_global_hash_lock);
+        if ((ret) || (!seconds) || ((seconds > 0) && (tm <= ecore_time_get())))
+          break;
+        LKL(_ecore_thread_global_hash_mutex);
+        CDW(_ecore_thread_global_hash_cond, tm);
+        LKU(_ecore_thread_global_hash_mutex);
+     }
+   if (ret) return ret->data;
+   return NULL;
+#else
+   (void) seconds;
+   return NULL;
+#endif
+}
+
diff --git a/src/lib/ecore/ecore_throttle.c b/src/lib/ecore/ecore_throttle.c
new file mode 100644 (file)
index 0000000..de0a43e
--- /dev/null
@@ -0,0 +1,101 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+static int throttle_val = 0;
+
+/**
+ * @addtogroup Ecore_Throttle_Group Ecore Throttle functions
+ *
+ * @{
+ */
+
+/**
+ * Increase throttle amount
+ *
+ * This will increase or decrease (if @p amount is positive or negative) the
+ * amount of "voluntary throttling" ecore will do to its main loop while
+ * running. This is intended to be used to limit animations and wakeups when
+ * in a strict power management state. The higher the current throttle value
+ * (which can be retrieved by ecore_throttle_get() ), the more throttling
+ * takes place. If the current throttle value is 0, then no throttling takes
+ * place at all.
+ *
+ * The value represents how long the ecore main loop will sleep (in seconds)
+ * before it goes into a fully idle state waiting for events, input or
+ * timing events to wake it up. For example, if the current throttle level
+ * is 0.5, then after every time the main loop cycles and goes into idle
+ * affter processing all events, the main loop will explicitly sleep for 0.5
+ * seconds before sitting and waiting for incoming events or timeouts, thus
+ * preventing animation, async IO and network handling etc. for that period
+ * of time. Of course these events, data and timeouts will be buffered,
+ * thus not losing anything, simply delaying when they get handled by the
+ * throttle value.
+ *
+ * Example:
+ * @code
+ * void enter_powersave(void) {
+ *    ecore_throttle_adjust(0.2);
+ *    printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
+ * }
+ *
+ * void enter_deep_powersave(void) {
+ *    ecore_throttle_adjust(0.5);
+ *    printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
+ * }
+ *
+ * void exit_powersave(void) {
+ *    ecore_throttle_adjust(-0.2);
+ *    printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
+ * }
+ *
+ * void exit_deep_powersave(void) {
+ *    ecore_throttle_adjust(-0.5);
+ *    printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
+ * }
+ * @endcode
+ *
+ * @param   amount Amount (in seconds) to adjust by
+ */
+EAPI void
+ecore_throttle_adjust(double amount)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   int adj = amount * 1000000.0;
+   throttle_val += adj;
+   if (throttle_val < 0) throttle_val = 0;
+}
+
+/**
+ * Get current throttle level
+ *
+ * This gets the current throttling level, which can be adjusted by
+ * ecore_throttle_adjust(). The value is in seconds. Please see
+ * ecore_throttle_adjust() for more information.
+ *
+ * @return  The current throttle level
+ */
+EAPI double
+ecore_throttle_get(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0.0);
+   return (double)throttle_val / 1000000.0;
+}
+
+/**
+ * @}
+ */
+
+void
+_ecore_throttle(void)
+{
+   if (throttle_val <= 0) return;
+   usleep(throttle_val);
+}
+
index ca7db2c..0eeb1d6 100644 (file)
@@ -1,30 +1,93 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#include <stdlib.h>
+
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
 
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#if defined(__APPLE__) && defined(__MACH__)
+# include <mach/mach_time.h>
+#endif
+
 #include "Ecore.h"
 #include "ecore_private.h"
 
-/* FIXME: clock_gettime() is an option... */
+#include <time.h>
+
+#if defined (HAVE_CLOCK_GETTIME) || defined (EXOTIC_PROVIDE_CLOCK_GETTIME)
+static clockid_t _ecore_time_clock_id = -1;
+#elif defined(__APPLE__) && defined(__MACH__)
+static double _ecore_time_clock_conversion = 1e-9;
+#endif
+double _ecore_time_loop_time = -1.0;
+
+/**
+ * @addtogroup Ecore_Time_Group
+ *
+ * @{
+ */
 
 /**
  * Retrieves the current system time as a floating point value in seconds.
- * @return  The number of seconds since 12.00AM 1st January 1970.
- * @ingroup Ecore_Time_Group
+ *
+ * This uses a monotonic clock and thus never goes back in time while
+ * machine is live (even if user changes time or timezone changes,
+ * however it may be reset whenever the machine is restarted).
+ *
+ * @see ecore_loop_time_get().
+ * @see ecore_time_unix_get().
+ *
+ * @return The number of seconds. Start time is not defined (it may be
+ *         when the machine was booted, unix time, etc), all it is
+ *         defined is that it never goes backwards (unless you got big critical
+ *         messages when the application started).
  */
 EAPI double
 ecore_time_get(void)
 {
+#if defined (HAVE_CLOCK_GETTIME) || defined (EXOTIC_PROVIDE_CLOCK_GETTIME) 
+   struct timespec t;
+
+   if (EINA_UNLIKELY(_ecore_time_clock_id < 0))
+     return ecore_time_unix_get();
+
+   if (EINA_UNLIKELY(clock_gettime(_ecore_time_clock_id, &t)))
+     {
+        CRIT("Cannot get current time.");
+        /* Try to at least return the latest value retrieved*/
+        return _ecore_time_loop_time;
+     }
+
+   return (double)t.tv_sec + (((double)t.tv_nsec) / 1000000000.0);
+#elif defined(HAVE_EVIL)
+   return evil_time_get();
+#elif defined(__APPLE__) && defined(__MACH__)
+   return _ecore_time_clock_conversion * (double)mach_absolute_time();
+#else
+   return ecore_time_unix_get();
+#endif
+}
+
+/**
+ * Retrieves the current UNIX time as a floating point value in seconds.
+ *
+ * @see ecore_time_get().
+ * @see ecore_loop_time_get().
+ *
+ * @return  The number of seconds since 12.00AM 1st January 1970.
+ */
+EAPI double
+ecore_time_unix_get(void)
+{
 #ifdef HAVE_GETTIMEOFDAY
-   struct timeval      timev;
+   struct timeval timev;
 
    gettimeofday(&timev, NULL);
    return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
@@ -32,3 +95,90 @@ ecore_time_get(void)
 # error "Your platform isn't supported yet"
 #endif
 }
+
+/**
+ * Retrieves the time at which the last loop stopped waiting for timeouts or
+ * events.
+ *
+ * This gets the time that the main loop ceased waiting for timouts and/or
+ * events to come in or for signals or any other interrupt source. This should
+ * be considered a reference point for all time based activity that should
+ * calculate its timepoint from the return of ecore_loop_time_get(). Use this
+ * UNLESS you absolutely must get the current actual timepoint - then use
+ * ecore_time_get(). Note that this time is meant to be used as relative to
+ * other times obtained on this run. If you need absolute time references, use
+ * ecore_time_unix_get() instead.
+ *
+ * This function can be called before any loop has ever been run, but either
+ * ecore_init() or ecore_time_get() must have been called once.
+ *
+ * @return The number of seconds. Start time is not defined (it may be
+ *         when the machine was booted, unix time, etc), all it is
+ *         defined is that it never goes backwards (unless you got big critical
+ *         messages when the application started).
+ */
+EAPI double
+ecore_loop_time_get(void)
+{
+   return _ecore_time_loop_time;
+}
+
+/**
+ * @}
+ */
+
+/**********************   Internal methods   ********************************/
+
+/* TODO: Documentation says "All  implementations  support  the  system-wide
+ * real-time clock, which is identified by CLOCK_REALTIME. Check if the fallback
+ * to unix time (without specifying the resolution) might be removed
+ */
+void
+_ecore_time_init(void)
+{
+#if defined (HAVE_CLOCK_GETTIME) || defined (EXOTIC_PROVIDE_CLOCK_GETTIME)
+   struct timespec t;
+
+   if (_ecore_time_clock_id != -1) return;
+
+   if (!clock_gettime(CLOCK_MONOTONIC, &t))
+     {
+        _ecore_time_clock_id = CLOCK_MONOTONIC;
+        DBG("using CLOCK_MONOTONIC.");
+     }
+   else if (!clock_gettime(CLOCK_REALTIME, &t))
+     {
+        /* may go backwards */
+         _ecore_time_clock_id = CLOCK_REALTIME;
+         WRN("CLOCK_MONOTONIC not available. Fallback to CLOCK_REALTIME.");
+     }
+   else
+     {
+        _ecore_time_clock_id = -2;
+        CRIT("Cannot get a valid clock_gettime() clock id! "
+             "Fallback to unix time.");
+     }
+#else
+# ifndef HAVE_EVIL
+#  if defined(__APPLE__) && defined(__MACH__)
+   mach_timebase_info_data_t info;
+   kern_return_t err = mach_timebase_info(&info);
+   if (err == 0)
+     {
+        _ecore_time_clock_conversion = 1e-9 * (double)info.numer / (double)info.denom;
+     }
+   else
+     {
+        WRN("Unable to get timebase info. Fallback to nanoseconds.");
+     }
+#  else
+#  warning "Your platform isn't supported yet"
+   CRIT("Platform does not support clock_gettime. "
+        "Fallback to unix time.");
+#  endif
+# endif
+#endif
+
+   _ecore_time_loop_time = ecore_time_get();
+}
+
index 93fce30..343c89f 100644 (file)
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
 
-static void _ecore_timer_set(Ecore_Timer *timer, double at, double in, int (*func) (void *data), void *data);
+#ifdef WANT_ECORE_TIMER_DUMP
+# include <string.h>
+# include <execinfo.h>
+# define ECORE_TIMER_DEBUG_BT_NUM 64
+typedef void (*Ecore_Timer_Bt_Func)();
+#endif
 
-static int          timers_added = 0;
-static int          timers_delete_me = 0;
+struct _Ecore_Timer
+{
+   EINA_INLIST;
+                       ECORE_MAGIC;
+   double              in;
+   double              at;
+   double              pending;
+   Ecore_Task_Cb       func;
+   void               *data;
+
+#ifdef WANT_ECORE_TIMER_DUMP
+   Ecore_Timer_Bt_Func timer_bt[ECORE_TIMER_DEBUG_BT_NUM];
+   int                 timer_bt_num;
+#endif
+
+   int                 references;
+   unsigned char       delete_me : 1;
+   unsigned char       just_added : 1;
+   unsigned char       frozen : 1;
+};
+GENERIC_ALLOC_SIZE_DECLARE(Ecore_Timer);
+
+static void _ecore_timer_set(Ecore_Timer  *timer,
+                             double        at,
+                             double        in,
+                             Ecore_Task_Cb func,
+                             void         *data);
+#ifdef WANT_ECORE_TIMER_DUMP
+static int _ecore_timer_cmp(const void *d1,
+                            const void *d2);
+#endif
+
+static int timers_added = 0;
+static int timers_delete_me = 0;
 static Ecore_Timer *timers = NULL;
+static Ecore_Timer *timer_current = NULL;
 static Ecore_Timer *suspended = NULL;
-static double       last_check = 0.0;
+static double last_check = 0.0;
+static double precision = 10.0 / 1000000.0;
 
 /**
- * @defgroup Ecore_Time_Group Ecore Time Functions
+ * @addtogroup Ecore_Timer_Group
  *
- * Functions that deal with time.  These functions include those that simply
- * retrieve it in a given format, and those that create events based on it.
+ * @{
  */
 
 /**
+ * Retrieves the current precision used by timer infrastructure.
+ * @return Current precision.
+ * @see ecore_timer_precision_set()
+ */
+EAPI double
+ecore_timer_precision_get(void)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0.0);
+   return precision;
+}
+
+/**
+ * @brief Sets the precision to be used by timer infrastructure.
+ *
+ * @param value allowed introduced timeout delay, in seconds.
+ *
+ * This sets the precision for @b all timers. The precision determines how much
+ * of an difference from the requested interval is acceptable. One common reason
+ * to use this function is to @b increase the allowed timeout and thus @b
+ * decrease precision of the timers, this is because less precise the timers
+ * result in the system waking up less often and thus consuming less resources.
+ *
+ * Be aware that kernel may delay delivery even further, these delays
+ * are always possible due other tasks having higher priorities or
+ * other scheduler policies.
+ *
+ * Example:
+ *  We have 2 timers, one that expires in a 2.0s and another that
+ *  expires in 2.1s, if precision is 0.1s, then the Ecore will request
+ *  for the next expire to happen in 2.1s and not 2.0s and another one
+ *  of 0.1 as it would before.
+ *
+ * @note Ecore is smart enough to see if there are timers in the
+ * precision range, if it does not, in our example if no second timer
+ * in (T + precision) existed, then it would use the minimum timeout.
+ */
+EAPI void
+ecore_timer_precision_set(double value)
+{
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+
+   if (value < 0.0)
+     {
+        ERR("Precision %f less than zero, ignored", value);
+        goto unlock;
+     }
+   precision = value;
+
+unlock:
+   _ecore_unlock();
+}
+
+/**
  * Creates a timer to call the given function in the given period of time.
  * @param   in   The interval in seconds.
  * @param   func The given function.  If @p func returns 1, the timer is
  *               rescheduled for the next interval @p in.
  * @param   data Data to pass to @p func when it is called.
  * @return  A timer object on success.  @c NULL on failure.
- * @ingroup Ecore_Time_Group
  *
  * This function adds a timer and returns its handle on success and NULL on
- * failure. The function @p func will be called every @in@ seconds. The
+ * failure. The function @p func will be called every @p in seconds. The
  * function will be passed the @p data pointer as its parameter.
- * 
- * When the timer @p func is called, it must return a value of either 1 
- * (or ECORE_CALLBACK_RENEW) or 0 (or ECORE_CALLBACK_CANCEL). 
+ *
+ * When the timer @p func is called, it must return a value of either 1
+ * (or ECORE_CALLBACK_RENEW) or 0 (or ECORE_CALLBACK_CANCEL).
  * If it returns 1, it will be called again at the next tick, or if it returns
  * 0 it will be deleted automatically making any references/handles for it
  * invalid.
  */
 EAPI Ecore_Timer *
-ecore_timer_add(double in, int (*func) (void *data), const void *data)
+ecore_timer_add(double        in,
+                Ecore_Task_Cb func,
+                const void   *data)
 {
    double now;
-   Ecore_Timer *timer;
+   Ecore_Timer *timer = NULL;
 
-   if (!func) return NULL;
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   if (!func) goto unlock;
    if (in < 0.0) in = 0.0;
-   timer = calloc(1, sizeof(Ecore_Timer));
-   if (!timer) return NULL;
+   timer = ecore_timer_calloc(1);
+   if (!timer) goto unlock;
    ECORE_MAGIC_SET(timer, ECORE_MAGIC_TIMER);
    now = ecore_time_get();
+
+#ifdef WANT_ECORE_TIMER_DUMP
+   timer->timer_bt_num = backtrace((void **)(timer->timer_bt),
+                                   ECORE_TIMER_DEBUG_BT_NUM);
+#endif
+
    _ecore_timer_set(timer, now + in, in, func, (void *)data);
+unlock:
+   _ecore_unlock();
+   return timer;
+}
+
+/**
+ * Creates a timer to call the given function in the given period of time.
+ * @param   in   The interval in seconds from current loop time.
+ * @param   func The given function.  If @p func returns 1, the timer is
+ *               rescheduled for the next interval @p in.
+ * @param   data Data to pass to @p func when it is called.
+ * @return  A timer object on success.  @c NULL on failure.
+ *
+ * This is the same as ecore_timer_add(), but "now" is the time from
+ * ecore_loop_time_get() not ecore_time_get() as ecore_timer_add() uses. See
+ * ecore_timer_add() for more details.
+ */
+EAPI Ecore_Timer *
+ecore_timer_loop_add(double        in,
+                     Ecore_Task_Cb func,
+                     const void   *data)
+{
+   Ecore_Timer *timer;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+   timer = _ecore_timer_loop_add(in, func, data);
+   _ecore_unlock();
+
    return timer;
 }
 
@@ -56,7 +193,6 @@ ecore_timer_add(double in, int (*func) (void *data), const void *data)
  * @param   timer The timer to delete.
  * @return  The data pointer set for the timer when @ref ecore_timer_add was
  *          called.  @c NULL is returned if the function is unsuccessful.
- * @ingroup Ecore_Time_Group
  *
  * Note: @p timer must be a valid handle. If the timer function has already
  * returned 0, the handle is no longer valid (and does not need to be delete).
@@ -64,16 +200,23 @@ ecore_timer_add(double in, int (*func) (void *data), const void *data)
 EAPI void *
 ecore_timer_del(Ecore_Timer *timer)
 {
+   void *data = NULL;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
+   _ecore_lock();
+
    if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
-       ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
-                        "ecore_timer_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+                         "ecore_timer_del");
+        goto unlock;
      }
-   if (timer->delete_me) return timer->data;
-   timers_delete_me++;
-   timer->delete_me = 1;
-   return timer->data;
+
+   data = _ecore_timer_del(timer);
+
+unlock:
+   _ecore_unlock();
+   return data;
 }
 
 /**
@@ -82,203 +225,475 @@ ecore_timer_del(Ecore_Timer *timer)
  *
  * @param   timer The timer to change.
  * @param   in    The interval in seconds.
- * @ingroup Ecore_Time_Group
  */
 EAPI void
-ecore_timer_interval_set(Ecore_Timer *timer, double in)
+ecore_timer_interval_set(Ecore_Timer *timer,
+                         double       in)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+   if (in < 0.0) in = 0.0;
    if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
-       ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
-                        "ecore_timer_interval_set");
-       return;
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+                         "ecore_timer_interval_set");
+        goto unlock;
      }
    timer->in = in;
+unlock:
+   _ecore_unlock();
+}
+
+/**
+ * Get the interval the timer ticks on.
+ *
+ * @param   timer The timer to retrieve the interval from
+ * @return  The interval on success. -1 on failure.
+ */
+EAPI double
+ecore_timer_interval_get(Ecore_Timer *timer)
+{
+   double interval;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0.0);
+   _ecore_lock();
+
+   if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
+     {
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+                         "ecore_timer_interval_get");
+        interval = -1.0;
+        goto unlock;
+     }
+
+   interval = timer->in;
+unlock:
+   _ecore_unlock();
+   return interval;
 }
 
 /**
- * Add some delay for the next occurence of a timer.
+ * Add some delay for the next occurrence of a timer.
  * This doesn't affect the interval of a timer.
  *
  * @param   timer The timer to change.
- * @param   add   The dalay to add to the next iteration.
- * @ingroup Ecore_Time_Group
+ * @param   add   The delay to add to the next iteration.
  */
 EAPI void
-ecore_timer_delay(Ecore_Timer *timer, double add)
+ecore_timer_delay(Ecore_Timer *timer,
+                  double       add)
 {
+   EINA_MAIN_LOOP_CHECK_RETURN;
    if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
-       ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
-                        "ecore_timer_delay");
-       return;
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+                         "ecore_timer_delay");
+        return;
      }
 
-   if (timer->frozen)
+   _ecore_lock();
+   _ecore_timer_delay(timer, add);
+   _ecore_unlock();
+}
+
+/**
+ * Reset a timer to its full interval
+ * This doesn't affect the interval of a timer
+ * @param timer The timer
+ * @since 1.2
+ * @note This is equivalent to (but faster than)
+ * @code
+ * ecore_timer_delay(timer, ecore_timer_interval_get(timer) - ecore_timer_pending_get(timer));
+ * @endcode
+ */
+EAPI void
+ecore_timer_reset(Ecore_Timer *timer)
+{
+   double now, add;
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
-       timer->pending += add;
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+                         __func__);
+        return;
      }
+   _ecore_lock();
+   now = ecore_time_get();
+
+   if (timer->frozen)
+     add = timer->pending;
    else
-     {
-       timers = _ecore_list2_remove(timers, timer);
-       _ecore_timer_set(timer, timer->at + add, timer->in, timer->func, timer->data);
-     }
+     add = timer->at - now;
+   _ecore_timer_delay(timer, timer->in - add);
+   _ecore_unlock();
 }
 
 /**
  * Get the pending time regarding a timer.
  *
- * @param      timer The timer to learn from.
- * @ingroup    Ecore_Time_Group
+ * @param        timer The timer to learn from.
+ * @return The pending time.
+ * @ingroup        Ecore_Timer_Group
  */
 EAPI double
 ecore_timer_pending_get(Ecore_Timer *timer)
 {
-   double      now;
+   double now;
+   double ret = 0.0;
+
+   EINA_MAIN_LOOP_CHECK_RETURN_VAL(0.0);
+   _ecore_lock();
 
    if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
-       ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
-                        "ecore_timer_pending_get");
-       return 0;
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+                         "ecore_timer_pending_get");
+        goto unlock;
      }
 
    now = ecore_time_get();
 
    if (timer->frozen)
-     return timer->pending;
-   return timer->at - now;
+     ret = timer->pending;
+   else
+     ret = timer->at - now;
+unlock:
+   _ecore_unlock();
+   return ret;
 }
 
 /**
+ * Pauses a running timer.
+ *
+ * @param timer The timer to be paused.
+ *
+ * The timer callback won't be called while the timer is paused. The remaining
+ * time until the timer expires will be saved, so the timer can be resumed with
+ * that same remaining time to expire, instead of expiring instantly.  Use
+ * ecore_timer_thaw() to resume it.
  *
+ * @note Nothing happens if the timer was already paused.
  *
+ * @see ecore_timer_thaw()
  */
 EAPI void
 ecore_timer_freeze(Ecore_Timer *timer)
 {
    double now;
 
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+
    if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
-       ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
                          "ecore_timer_freeze");
-        return ;
+        goto unlock;
      }
 
    /* Timer already frozen */
    if (timer->frozen)
-     return ;
+     goto unlock;
 
-   timers = _ecore_list2_remove(timers, timer);
-   suspended = _ecore_list2_prepend(suspended, timer);
+   timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
+   suspended = (Ecore_Timer *)eina_inlist_prepend(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
 
    now = ecore_time_get();
 
    timer->pending = timer->at - now;
    timer->at = 0.0;
    timer->frozen = 1;
+unlock:
+   _ecore_unlock();
 }
 
+/**
+ * Resumes a frozen (paused) timer.
+ *
+ * @param timer The timer to be resumed.
+ *
+ * The timer will be resumed from its previous relative position in time. That
+ * means, if it had X seconds remaining until expire when it was paused, it will
+ * be started now with those same X seconds remaining to expire again. But
+ * notice that the interval time won't be touched by this call or by
+ * ecore_timer_freeze().
+ *
+ * @see ecore_timer_freeze()
+ */
 EAPI void
 ecore_timer_thaw(Ecore_Timer *timer)
 {
    double now;
 
+   EINA_MAIN_LOOP_CHECK_RETURN;
+   _ecore_lock();
+
    if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
-       ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
+        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
                          "ecore_timer_thaw");
-        return ;
+        goto unlock;
      }
 
    /* Timer not frozen */
    if (!timer->frozen)
-     return ;
+     goto unlock;
 
-   suspended = _ecore_list2_remove(suspended, timer);
+   suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
    now = ecore_time_get();
 
    _ecore_timer_set(timer, timer->pending + now, timer->in, timer->func, timer->data);
+unlock:
+   _ecore_unlock();
+}
+
+EAPI char *
+ecore_timer_dump(void)
+{
+#ifdef WANT_ECORE_TIMER_DUMP
+   Eina_Strbuf *result;
+   char *out;
+   Ecore_Timer *tm;
+   Eina_List *tmp = NULL;
+   int living_timer = 0;
+   int unknow_timer = 0;
+
+   EINA_MAIN_LOOP_CHECK_RETURN(NULL);
+   _ecore_lock();
+   result = eina_strbuf_new();
+
+   EINA_INLIST_FOREACH(timers, tm)
+     tmp = eina_list_sorted_insert(tmp, _ecore_timer_cmp, tm);
+
+   EINA_LIST_FREE(tmp, tm)
+     {
+        char **strings;
+        int j;
+
+        if (!tm->frozen && !tm->delete_me)
+          living_timer++;
+
+        strings = backtrace_symbols((void **)tm->timer_bt, tm->timer_bt_num);
+        if (tm->timer_bt_num <= 0 || strings == NULL)
+          {
+             unknow_timer++;
+             continue;
+          }
+
+        eina_strbuf_append_printf(result, "*** timer: %f ***\n", tm->in);
+        if (tm->frozen)
+          eina_strbuf_append(result, "FROZEN\n");
+        if (tm->delete_me)
+          eina_strbuf_append(result, "DELETED\n");
+        for (j = 0; j < tm->timer_bt_num; j++)
+          eina_strbuf_append_printf(result, "%s\n", strings[j]);
+
+        free(strings);
+     }
+
+   eina_strbuf_append_printf(result, "\n***\nThere is %i living timer.\nWe did lost track of %i timers.\n", living_timer, unknow_timer);
+
+   out = eina_strbuf_string_steal(result);
+   eina_strbuf_free(result);
+   _ecore_unlock();
+
+   return out;
+#else
+   return NULL;
+#endif
+}
+
+/**
+ * @}
+ */
+
+Ecore_Timer *
+_ecore_timer_loop_add(double        in,
+                      Ecore_Task_Cb func,
+                      const void   *data)
+{
+   double now;
+   Ecore_Timer *timer = NULL;
+
+   if (!func) return timer;
+   if (in < 0.0) in = 0.0;
+   timer = ecore_timer_calloc(1);
+   if (!timer) return timer;
+   ECORE_MAGIC_SET(timer, ECORE_MAGIC_TIMER);
+   now = ecore_loop_time_get();
+
+#ifdef WANT_ECORE_TIMER_DUMP
+   timer->timer_bt_num = backtrace((void **)(timer->timer_bt),
+                                   ECORE_TIMER_DEBUG_BT_NUM);
+#endif
+   _ecore_timer_set(timer, now + in, in, func, (void *)data);
+   return timer;
+}
+
+EAPI void
+_ecore_timer_delay(Ecore_Timer *timer,
+                   double       add)
+{
+   if (timer->frozen)
+     {
+        timer->pending += add;
+     }
+   else
+     {
+        timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
+        _ecore_timer_set(timer, timer->at + add, timer->in, timer->func, timer->data);
+     }
+}
+
+void *
+_ecore_timer_del(Ecore_Timer *timer)
+{
+   if (timer->frozen && !timer->references)
+     {
+        void *data = timer->data;
+
+        suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
+
+        if (timer->delete_me)
+          timers_delete_me--;
+
+        ecore_timer_mp_free(timer);
+        return data;
+     }
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(timer->delete_me, NULL);
+   timer->delete_me = 1;
+   timers_delete_me++;
+   return timer->data;
 }
 
 void
 _ecore_timer_shutdown(void)
 {
-   while (timers)
+   Ecore_Timer *timer;
+
+   while ((timer = timers))
      {
-       Ecore_Timer *timer;
-       
-       timer = timers;
-       timers = _ecore_list2_remove(timers, timer);
-       ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
-       free(timer);
+        timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timers));
+        ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
+        ecore_timer_mp_free(timer);
      }
 
-   while (suspended)
+   while ((timer = suspended))
      {
-        Ecore_Timer *timer;
-
-        timer = suspended;
-        suspended = _ecore_list2_remove(suspended, timer);
+        suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(suspended));
         ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
-        free(timer);
+        ecore_timer_mp_free(timer);
      }
+
+   timer_current = NULL;
 }
 
 void
 _ecore_timer_cleanup(void)
 {
-   Ecore_List2 *l;
+   Ecore_Timer *l;
+   int in_use = 0, todo = timers_delete_me, done = 0;
 
    if (!timers_delete_me) return;
-   for (l = (Ecore_List2 *)timers; l;)
+   for (l = timers; l; )
+     {
+        Ecore_Timer *timer = l;
+
+        l = (Ecore_Timer *)EINA_INLIST_GET(l)->next;
+        if (timer->delete_me)
+          {
+             if (timer->references)
+               {
+                  in_use++;
+                  continue;
+               }
+             timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
+             ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
+             ecore_timer_mp_free(timer);
+             timers_delete_me--;
+             done++;
+             if (timers_delete_me == 0) return;
+          }
+     }
+   for (l = suspended; l; )
      {
-       Ecore_Timer *timer;
-       
-       timer = (Ecore_Timer *)l;
-       l = l->next;
-       if (timer->delete_me)
-         {
-            timers = _ecore_list2_remove(timers, timer);
-            ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
-            free(timer);
-            timers_delete_me--;
-            if (timers_delete_me == 0) return;
-         }
+        Ecore_Timer *timer = l;
+
+        l = (Ecore_Timer *)EINA_INLIST_GET(l)->next;
+        if (timer->delete_me)
+          {
+             if (timer->references)
+               {
+                  in_use++;
+                  continue;
+               }
+             suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
+             ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
+             ecore_timer_mp_free(timer);
+             timers_delete_me--;
+             done++;
+             if (timers_delete_me == 0) return;
+          }
      }
-   for (l = (Ecore_List2 *)suspended; l;)
+
+   if ((!in_use) && (timers_delete_me))
      {
-       Ecore_Timer *timer;
-       
-       timer = (Ecore_Timer *)l;
-       l = l->next;
-       if (timer->delete_me)
-         {
-            suspended = _ecore_list2_remove(suspended, timer);
-            ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
-            free(timer);
-            timers_delete_me--;
-            if (timers_delete_me == 0) return;
-         }
+        ERR("%d timers to delete, but they were not found!"
+            "Stats: todo=%d, done=%d, pending=%d, in_use=%d. "
+            "reset counter.",
+            timers_delete_me, todo, done, todo - done, in_use);
+        timers_delete_me = 0;
      }
-   timers_delete_me = 0;
 }
 
 void
 _ecore_timer_enable_new(void)
 {
-   Ecore_List2 *l;   
+   Ecore_Timer *timer;
 
    if (!timers_added) return;
    timers_added = 0;
-   for (l = (Ecore_List2 *)timers; l; l = l->next)
+   EINA_INLIST_FOREACH(timers, timer) timer->just_added = 0;
+}
+
+int
+_ecore_timers_exists(void)
+{
+   Ecore_Timer *timer = timers;
+
+   while ((timer) && (timer->delete_me))
+     timer = (Ecore_Timer *)EINA_INLIST_GET(timer)->next;
+
+   return !!timer;
+}
+
+static inline Ecore_Timer *
+_ecore_timer_first_get(void)
+{
+   Ecore_Timer *timer = timers;
+
+   while ((timer) && ((timer->delete_me) || (timer->just_added)))
+     timer = (Ecore_Timer *)EINA_INLIST_GET(timer)->next;
+
+   return timer;
+}
+
+static inline Ecore_Timer *
+_ecore_timer_after_get(Ecore_Timer *base)
+{
+   Ecore_Timer *timer = (Ecore_Timer *)EINA_INLIST_GET(base)->next;
+   Ecore_Timer *valid_timer = NULL;
+   double maxtime = base->at + precision;
+
+   while ((timer) && (timer->at < maxtime))
      {
-       Ecore_Timer *timer;
-       
-       timer = (Ecore_Timer *)l;
-       timer->just_added = 0;
+        if (!((timer->delete_me) || (timer->just_added)))
+          valid_timer = timer;
+        timer = (Ecore_Timer *)EINA_INLIST_GET(timer)->next;
      }
+
+   return valid_timer;
 }
 
 double
@@ -286,79 +701,117 @@ _ecore_timer_next_get(void)
 {
    double now;
    double in;
-   Ecore_Timer *timer;
-   
-   if (!timers) return -1;
-   now = ecore_time_get();
-   timer = (Ecore_Timer *)timers;
-   while ((timer) && ((timer->delete_me) || (timer->just_added)))
-     timer = (Ecore_Timer *)((Ecore_List2 *)timer)->next;
-   if (!timer) return -1;
-   in = timer->at - now;
+   Ecore_Timer *first, *second;
+
+   first = _ecore_timer_first_get();
+   if (!first) return -1;
+
+   second = _ecore_timer_after_get(first);
+   if (second) first = second;
+
+   now = ecore_loop_time_get();
+   in = first->at - now;
    if (in < 0) in = 0;
    return in;
-}  
+}
 
-int
-_ecore_timer_call(double when)
+static inline void
+_ecore_timer_reschedule(Ecore_Timer *timer,
+                        double       when)
 {
-   Ecore_List2 *l;   
-   Ecore_Timer *timer;
+   if ((timer->delete_me) || (timer->frozen)) return;
+
+   timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
+
+   /* if the timer would have gone off more than 15 seconds ago,
+    * assume that the system hung and set the timer to go off
+    * timer->in from now. this handles system hangs, suspends
+    * and more, so ecore will only "replay" the timers while
+    * the system is suspended if it is suspended for less than
+    * 15 seconds (basically). this also handles if the process
+    * is stopped in a debugger or IO and other handling gets
+    * really slow within the main loop.
+    */
+   if ((timer->at + timer->in) < (when - 15.0))
+     _ecore_timer_set(timer, when + timer->in, timer->in, timer->func, timer->data);
+   else
+     _ecore_timer_set(timer, timer->at + timer->in, timer->in, timer->func, timer->data);
+}
+
+/* assume that we hold the ecore lock when entering this function */
+void
+_ecore_timer_expired_timers_call(double when)
+{
+   /* call the first expired timer until no expired timers exist */
+    while (_ecore_timer_expired_call(when)) ;
+}
 
+/* assume that we hold the ecore lock when entering this function */
+int
+_ecore_timer_expired_call(double when)
+{
    if (!timers) return 0;
    if (last_check > when)
      {
-       /* User set time backwards */
-       for (l = (Ecore_List2 *)timers; l; l = l->next)
-         {
-            timer = (Ecore_Timer *)l;
-            timer->at -= (last_check - when);
-         }
+        Ecore_Timer *timer;
+        /* User set time backwards */
+        EINA_INLIST_FOREACH(timers, timer) timer->at -= (last_check - when);
      }
    last_check = when;
-   for (l = (Ecore_List2 *)timers; l; l = l->next)
+
+   if (!timer_current)
      {
-       timer = (Ecore_Timer *)l;
-       if ((timer->at <= when) &&
-           (timer->just_added == 0) &&
-           (timer->delete_me == 0))
-         {
-            timers = _ecore_list2_remove(timers, timer);
-            _ecore_timer_call(when);
-            if ((!timer->delete_me) && (timer->func(timer->data)))
-              {
-                 /* if the timer would have gone off more than 15 seconds ago,
-                  * assume that the system hung and set the timer to go off
-                  * timer->in from now. this handles system hangs, suspends
-                  * and more, so ecore will only "replay" the timers while
-                  * the system is suspended if it is suspended for less than
-                  * 15 seconds (basically). this also handles if the process
-                  * is stopped in a debugger or IO and other handling gets
-                  * really slow within the main loop.
-                  */
-                 if (!timer->delete_me)
-                   {
-                      if ((timer->at + timer->in) < (when - 15.0))
-                        _ecore_timer_set(timer, when + timer->in, timer->in, timer->func, timer->data);
-                      else
-                        _ecore_timer_set(timer, timer->at + timer->in, timer->in, timer->func, timer->data);
-                   }
-                 else
-                   free(timer);
-              }
-            else
-              free(timer);
-            return 1;
-         }
+        /* regular main loop, start from head */
+         timer_current = timers;
+     }
+   else
+     {
+        /* recursive main loop, continue from where we were */
+         Ecore_Timer *timer_old = timer_current;
+         timer_current = (Ecore_Timer *)EINA_INLIST_GET(timer_current)->next;
+         _ecore_timer_reschedule(timer_old, when);
+     }
+
+   while (timer_current)
+     {
+        Ecore_Timer *timer = timer_current;
+
+        if (timer->at > when)
+          {
+             timer_current = NULL; /* ended walk, next should restart. */
+             return 0;
+          }
+
+        if ((timer->just_added) || (timer->delete_me))
+          {
+             timer_current = (Ecore_Timer *)EINA_INLIST_GET(timer_current)->next;
+             continue;
+          }
+
+        timer->references++;
+        if (!_ecore_call_task_cb(timer->func, timer->data))
+          {
+             if (!timer->delete_me) _ecore_timer_del(timer);
+          }
+        timer->references--;
+
+        if (timer_current) /* may have changed in recursive main loops */
+          timer_current = (Ecore_Timer *)EINA_INLIST_GET(timer_current)->next;
+
+        _ecore_timer_reschedule(timer, when);
      }
    return 0;
-}  
+}
 
 static void
-_ecore_timer_set(Ecore_Timer *timer, double at, double in, int (*func) (void *data), void *data)
+_ecore_timer_set(Ecore_Timer  *timer,
+                 double        at,
+                 double        in,
+                 Ecore_Task_Cb func,
+                 void         *data)
 {
-   Ecore_List2 *l;
-   
+   Ecore_Timer *t2;
+
    timers_added = 1;
    timer->at = at;
    timer->in = in;
@@ -369,17 +822,26 @@ _ecore_timer_set(Ecore_Timer *timer, double at, double in, int (*func) (void *da
    timer->pending = 0.0;
    if (timers)
      {
-       for (l = ((Ecore_List2 *)(timers))->last; l; l = l->prev)
-         {
-            Ecore_Timer *t2;
-            
-            t2 = (Ecore_Timer *)l;
-            if (timer->at > t2->at)
-              {
-                 timers = _ecore_list2_append_relative(timers, timer, t2);
-                 return;
-              }
-         }
+        EINA_INLIST_REVERSE_FOREACH(EINA_INLIST_GET(timers), t2)
+          {
+             if (timer->at > t2->at)
+               {
+                  timers = (Ecore_Timer *)eina_inlist_append_relative(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer), EINA_INLIST_GET(t2));
+                  return;
+               }
+          }
      }
-   timers = _ecore_list2_prepend(timers, timer);
+   timers = (Ecore_Timer *)eina_inlist_prepend(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
+}
+
+#ifdef WANT_ECORE_TIMER_DUMP
+static int
+_ecore_timer_cmp(const void *d1,
+                 const void *d2)
+{
+   const Ecore_Timer *t1 = d1;
+   const Ecore_Timer *t2 = d2;
+
+   return (int)((t1->in - t2->in) * 100);
 }
+#endif
diff --git a/src/lib/ecore_cocoa/Ecore_Cocoa.h b/src/lib/ecore_cocoa/Ecore_Cocoa.h
new file mode 100644 (file)
index 0000000..51c8ead
--- /dev/null
@@ -0,0 +1,147 @@
+#ifndef __ECORE_COCOA_H__
+#define __ECORE_COCOA_H__
+
+/*
+ * DO NOT USE THIS HEADER. IT IS WORK IN PROGRESS. IT IS NOT FINAL AND
+ * THE API MAY CHANGE.
+ */
+
+#ifndef ECORE_COCOA_WIP_GNSIDNQI
+# warning "You are using a work in progress API. This API is not stable"
+# warning "and is subject to change. You use this at your own risk."
+#endif
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef __GNUC__
+# if __GNUC__ >= 4
+#  define EAPI __attribute__ ((visibility("default")))
+# else
+#  define EAPI
+# endif
+#else
+# define EAPI
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _Ecore_Cocoa_Window Ecore_Cocoa_Window;
+
+EAPI extern int ECORE_COCOA_EVENT_GOT_FOCUS;
+EAPI extern int ECORE_COCOA_EVENT_LOST_FOCUS;
+EAPI extern int ECORE_COCOA_EVENT_RESIZE;
+EAPI extern int ECORE_COCOA_EVENT_EXPOSE;
+
+typedef struct _Ecore_Cocoa_Event_Video_Resize Ecore_Cocoa_Event_Video_Resize;
+struct _Ecore_Cocoa_Event_Video_Resize
+{
+   int             w;
+   int             h;
+};
+
+
+/* Core */
+
+EAPI int  ecore_cocoa_init(void);
+EAPI int  ecore_cocoa_shutdown(void);
+EAPI void ecore_cocoa_feed_events(void);
+
+/* Window */
+
+EAPI Ecore_Cocoa_Window *ecore_cocoa_window_new(int x,
+                                                int y,
+                                                int width,
+                                                int height);
+
+EAPI void ecore_cocoa_window_free(Ecore_Cocoa_Window *window);
+
+EAPI void *ecore_cocoa_window_hwnd_get(Ecore_Cocoa_Window *window);
+
+EAPI void ecore_cocoa_window_move(Ecore_Cocoa_Window *window,
+                                  int                 x,
+                                  int                 y);
+
+EAPI void ecore_cocoa_window_resize(Ecore_Cocoa_Window *window,
+                                    int                 width,
+                                    int                 height);
+
+EAPI void ecore_cocoa_window_move_resize(Ecore_Cocoa_Window *window,
+                                         int                 x,
+                                         int                 y,
+                                         int                 width,
+                                         int                 height);
+
+EAPI void ecore_cocoa_window_geometry_get(Ecore_Cocoa_Window *window,
+                                          int                *x,
+                                          int                *y,
+                                          int                *width,
+                                          int                *height);
+
+EAPI void ecore_cocoa_window_size_get(Ecore_Cocoa_Window *window,
+                                      int                *width,
+                                      int                *height);
+
+EAPI void ecore_cocoa_window_size_min_set(Ecore_Cocoa_Window *window,
+                                          unsigned int        min_width,
+                                          unsigned int        min_height);
+
+EAPI void ecore_cocoa_window_size_min_get(Ecore_Cocoa_Window *window,
+                                          unsigned int       *min_width,
+                                          unsigned int       *min_height);
+
+EAPI void ecore_cocoa_window_size_max_set(Ecore_Cocoa_Window *window,
+                                          unsigned int        max_width,
+                                          unsigned int        max_height);
+
+EAPI void ecore_cocoa_window_size_max_get(Ecore_Cocoa_Window *window,
+                                          unsigned int       *max_width,
+                                          unsigned int       *max_height);
+
+EAPI void ecore_cocoa_window_size_base_set(Ecore_Cocoa_Window *window,
+                                           unsigned int        base_width,
+                                           unsigned int        base_height);
+
+EAPI void ecore_cocoa_window_size_base_get(Ecore_Cocoa_Window *window,
+                                           unsigned int       *base_width,
+                                           unsigned int       *base_height);
+
+EAPI void ecore_cocoa_window_size_step_set(Ecore_Cocoa_Window *window,
+                                           unsigned int        step_width,
+                                           unsigned int        step_height);
+
+EAPI void ecore_cocoa_window_size_step_get(Ecore_Cocoa_Window *window,
+                                           unsigned int       *step_width,
+                                           unsigned int       *step_height);
+
+EAPI void ecore_cocoa_window_show(Ecore_Cocoa_Window *window);
+
+EAPI void ecore_cocoa_window_hide(Ecore_Cocoa_Window *window);
+
+EAPI void ecore_cocoa_window_raise(Ecore_Cocoa_Window *window);
+
+EAPI void ecore_cocoa_window_lower(Ecore_Cocoa_Window *window);
+
+EAPI void ecore_cocoa_window_title_set(Ecore_Cocoa_Window *window,
+                                       const char         *title);
+
+EAPI void ecore_cocoa_window_focus_set(Ecore_Cocoa_Window *window);
+
+EAPI void ecore_cocoa_window_iconified_set(Ecore_Cocoa_Window *window,
+                                           int                 on);
+
+EAPI void ecore_cocoa_window_borderless_set(Ecore_Cocoa_Window *window,
+                                            int                 on);
+
+EAPI void ecore_cocoa_window_view_set(Ecore_Cocoa_Window *window,
+                                     void *view);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h b/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h
new file mode 100644 (file)
index 0000000..7068bc2
--- /dev/null
@@ -0,0 +1,285 @@
+#ifndef ECORE_COCOA_KEYS_H__
+#define ECORE_COCOA_KEYS_H__
+
+struct _ecore_cocoa_keys_s
+{
+   int         code;
+   const char  *name;
+   const char  *compose;
+};
+
+static const struct _ecore_cocoa_keys_s keystable[] =
+{
+
+{ 0,                         "0x00",         "" },
+{ 0,                         "First",        "" },
+{ 3,                         "Return",       "\015" },
+{ 8,                         "BackSpace",    "\010" },
+{ 9,                         "Tab",          "\011" },
+{ 12,                        "Clear",        "" },
+{ 13,                        "Return",       "\015" },
+{ 19,                        "Pause",        "" },
+{ 25,                        "BackTab",        ""},
+{ 27,                        "Escape",       "" },
+{ 32,                        "space",        " " },
+{ 33,                        "exclam",       "!" },
+{ 34,                        "quotedbl",     "\"" },
+{ 35,                        "numbersign",   "#" },
+{ 36,                        "dollar",       "$" },
+{ 37,                        "percent",      "%%" },
+{ 38,                        "ampersand",    "&" },
+{ 39,                        "apostrophe",   "'" },
+{ 40,                        "parenleft",    "(" },
+{ 41,                        "parenright",   ")" },
+{ 42,                        "asterisk",     "*" },
+{ 43,                        "plus",         "+" },
+{ 44,                        "comma",        "," },
+{ 45,                        "minus",        "-" },
+{ 46,                        "period",       "." },
+{ 47,                        "slash",        "/" },
+{ 48,                        "0",            "0" },
+{ 49,                        "1",            "1" },
+{ 50,                        "2",            "2" },
+{ 51,                        "3",            "3" },
+{ 52,                        "4",            "4" },
+{ 53,                        "5",            "5" },
+{ 54,                        "6",            "6" },
+{ 55,                        "7",            "7" },
+{ 56,                        "8",            "8" },
+{ 57,                        "9",            "9" },
+{ 58,                        "colon",        ";" },
+{ 59,                        "semicolon",    ";" },
+{ 60,                        "less",         "<" },
+{ 61,                        "equal",        "=" },
+{ 62,                        "greater",      ">" },
+{ 63,                        "question",     "?" },
+{ 64,                        "at",           "@" },
+
+{ 91,                        "bracketleft",  "[" },
+{ 92,                        "backslash",    "\\" },
+{ 93,                        "bracketright", "]" },
+{ 94,                        "asciicircumm", "^" },
+{ 95,                        "underscore",   "_" },
+{ 96,                        "backquote",    "`" },
+{ 97,                        "a",            "a" },
+{ 98,                        "b",            "b" },
+{ 99,                        "c",            "c" },
+{ 100,                       "d",            "d" },
+{ 101,                       "e",            "e" },
+{ 102,                       "f",            "f" },
+{ 103,                       "g",            "g" },
+{ 104,                       "h",            "h" },
+{ 105,                       "i",            "i" },
+{ 106,                       "j",            "j" },
+{ 107,                       "k",            "k" },
+{ 108,                       "l",            "l" },
+{ 109,                       "m",            "m" },
+{ 110,                       "n",            "n" },
+{ 111,                       "o",            "o" },
+{ 112,                       "p",            "p" },
+{ 113,                       "q",            "q" },
+{ 114,                       "r",            "r" },
+{ 115,                       "s",            "s" },
+{ 116,                       "t",            "t" },
+{ 117,                       "u",            "u" },
+{ 118,                       "v",            "v" },
+{ 119,                       "w",            "w" },
+{ 120,                       "x",            "x" },
+{ 121,                       "y",            "y" },
+{ 122,                       "z",            "z" },
+{ 123,                       "braceleft",    "" },
+{ 124,                       "pipe",         "" },
+{ 125,                       "braceright",   "" },
+{ 127,                       "Delete",       "\177" },
+{ 126,                       "asciitilde",   "~" },
+
+{ 160,                       "w0",           "" }, 
+{ 161,                       "w1",           "" },
+{ 162,                       "w2",           "" },
+{ 163,                       "w3",           "" },
+{ 164,                       "w4",           "" },
+{ 165,                       "w5",           "" },
+{ 166,                       "w6",           "" },
+{ 167,                       "w7",           "" },
+{ 168,                       "w8",           "" },
+{ 169,                       "w9",           "" },
+{ 170,                       "w10",          "" },
+{ 171,                       "w11",          "" },
+{ 172,                       "w12",          "" },
+{ 173,                       "w13",          "" },
+{ 174,                       "w14",          "" },
+{ 175,                       "w15",          "" },
+{ 176,                       "w16",          "" },
+{ 177,                       "w17",          "" },
+{ 178,                       "w18",          "" },
+{ 179,                       "w19",          "" },
+{ 180,                       "w20",          "" },
+{ 181,                       "w21",          "" },
+{ 182,                       "w22",          "" },
+{ 183,                       "w23",          "" },
+{ 184,                       "w24",          "" },
+{ 185,                       "w25",          "" },
+{ 186,                       "w26",          "" },
+{ 187,                       "w27",          "" },
+{ 188,                       "w28",          "" },
+{ 189,                       "w29",          "" },
+{ 190,                       "w30",          "" },
+{ 191,                       "w31",          "" },
+{ 192,                       "w32",          "" },
+{ 193,                       "w33",          "" },
+{ 194,                       "w34",          "" },
+{ 195,                       "w35",          "" },
+{ 196,                       "w36",          "" },
+{ 197,                       "w37",          "" },
+{ 198,                       "w38",          "" },
+{ 199,                       "w39",          "" },
+{ 200,                       "w40",          "" },
+{ 201,                       "w41",          "" },
+{ 202,                       "w42",          "" },
+{ 203,                       "w43",          "" },
+{ 204,                       "w44",          "" },
+{ 205,                       "w45",          "" },
+{ 206,                       "w46",          "" },
+{ 207,                       "w47",          "" },
+{ 208,                       "w48",          "" },
+{ 209,                       "w49",          "" },
+{ 210,                       "w50",          "" },
+{ 211,                       "w51",          "" },
+{ 212,                       "w52",          "" },
+{ 213,                       "w53",          "" },
+{ 214,                       "w54",          "" },
+{ 215,                       "w55",          "" },
+{ 216,                       "w56",          "" },
+{ 217,                       "w57",          "" },
+{ 218,                       "w58",          "" },
+{ 219,                       "w59",          "" },
+{ 220,                       "w60",          "" },
+{ 221,                       "w61",          "" },
+{ 222,                       "w62",          "" },
+{ 223,                       "w63",          "" },
+{ 224,                       "w64",          "" },
+{ 225,                       "w65",          "" },
+{ 226,                       "w66",          "" },
+{ 227,                       "w67",          "" },
+{ 228,                       "w68",          "" },
+{ 229,                       "w69",          "" },
+{ 230,                       "w70",          "" },
+{ 231,                       "w71",          "" },
+{ 232,                       "w72",          "" },
+{ 233,                       "w73",          "" },
+{ 234,                       "w74",          "" },
+{ 235,                       "w75",          "" },
+{ 236,                       "w76",          "" },
+{ 237,                       "w77",          "" },
+{ 238,                       "w78",          "" },
+{ 239,                       "w79",          "" },
+{ 240,                       "w80",          "" },
+{ 241,                       "w81",          "" },
+{ 242,                       "w82",          "" },
+{ 243,                       "w83",          "" },
+{ 244,                       "w84",          "" },
+{ 245,                       "w85",          "" },
+{ 246,                       "w86",          "" },
+{ 247,                       "w87",          "" },
+{ 248,                       "w88",          "" },
+{ 249,                       "w89",          "" },
+{ 250,                       "w90",          "" },
+{ 251,                       "w91",          "" },
+{ 252,                       "w92",          "" },
+{ 253,                       "w93",          "" },
+{ 254,                       "w94",          "" },
+{ 255,                       "w95",          "" },
+
+{ 256,                       "KP0",          "0" },
+{ 257,                       "KP1",          "1" },
+{ 258,                       "KP2",          "2" },
+{ 259,                       "KP3",          "3" },
+{ 260,                       "KP4",          "4" },
+{ 261,                       "KP5",          "5" },
+{ 262,                       "KP6",          "6" },
+{ 263,                       "KP7",          "7" },
+{ 264,                       "KP8",          "8" },
+{ 265,                       "KP9",          "9" },
+{ 266,                       "period",       "." },
+{ 267,                       "KP_Divide",    "/" },
+{ 268,                       "KP_Multiply",  "*" },
+{ 269,                       "KP_Minus",     "-" },
+{ 270,                       "KP_Plus",      "+" },
+{ 271,                       "KP_Enter",     "\015" },
+{ 272,                       "KP_Equals",    "=" },
+
+{ NSUpArrowFunctionKey,      "Up",           "" },
+{ NSDownArrowFunctionKey,    "Down",         "" },
+{ NSRightArrowFunctionKey,   "Right",        "" },
+{ NSLeftArrowFunctionKey,    "Left",         "" },
+{ NSInsertFunctionKey,       "Insert",       "" },
+{ NSHomeFunctionKey,         "Home",         "" },
+{ NSEndFunctionKey,          "End",          "" },
+{ NSPageUpFunctionKey,       "Page_Up",      "" },
+{ NSPageDownFunctionKey,     "Page_Down",    "" },
+
+{ NSF1FunctionKey,           "F1",           "" },
+{ NSF2FunctionKey,           "F2",           "" },
+{ NSF3FunctionKey,           "F3",           "" },
+{ NSF4FunctionKey,           "F4",           "" },
+{ NSF5FunctionKey,           "F5",           "" },
+{ NSF6FunctionKey,           "F6",           "" },
+{ NSF7FunctionKey,           "F7",           "" },
+{ NSF8FunctionKey,           "F8",           "" },
+{ NSF9FunctionKey,           "F9",           "" },
+{ NSF10FunctionKey,          "F10",          "" },
+{ NSF11FunctionKey,          "F11",          "" },
+{ NSF12FunctionKey,          "F12",          "" },
+{ NSF13FunctionKey,          "F13",          "" },
+{ NSF14FunctionKey,          "F14",          "" },
+{ NSF15FunctionKey,          "F15",          "" },
+{ NSF16FunctionKey,          "F16",          "" },
+{ NSF17FunctionKey,          "F17",          "" },
+{ NSF18FunctionKey,          "F18",          "" },
+{ NSF19FunctionKey,          "F19",          "" },
+{ NSF20FunctionKey,          "F20",          "" },
+{ NSF21FunctionKey,          "F21",          "" },
+{ NSF22FunctionKey,          "F22",          "" },
+{ NSF23FunctionKey,          "F23",          "" },
+{ NSF24FunctionKey,          "F24",          "" },
+{ NSF25FunctionKey,          "F25",          "" },
+{ NSF26FunctionKey,          "F26",          "" },
+{ NSF27FunctionKey,          "F27",          "" },
+{ NSF28FunctionKey,          "F28",          "" },
+{ NSF29FunctionKey,          "F29",          "" },
+{ NSF30FunctionKey,          "F30",          "" },
+{ NSF31FunctionKey,          "F31",          "" },
+{ NSF32FunctionKey,          "F32",          "" },
+{ NSF33FunctionKey,          "F33",          "" },
+{ NSF34FunctionKey,          "F34",          "" },
+{ NSF35FunctionKey,          "F35",          "" },
+
+{ NSClearLineFunctionKey,    "Num_Lock",     "" },
+{ 301,                       "Caps_Lock",    "" },
+{ NSScrollLockFunctionKey,   "Scroll_Lock",  "" },
+{ 303,                       "Shift_R",      "" },
+{ 304,                       "Shift_L",      "" },
+{ 305,                       "Control_R",    "" },
+{ 306,                       "Control_L",    "" },
+{ 307,                       "Alt_R",        "" },
+{ 308,                       "Alt_L",        "" },
+{ 309,                       "Meta_R",       "" },
+{ 310,                       "Meta_L",       "" },
+{ 311,                       "Super_L",      "" },
+{ 312,                       "Super_R",      "" },
+
+{ NSModeSwitchFunctionKey,   "Mode",         "" },
+{ 314,                       "Compose",      "" },
+
+{ NSHelpFunctionKey,         "Help",         "" },
+{ NSPrintFunctionKey,        "Print",        "" },
+{ NSSysReqFunctionKey,       "SysReq",       "" },
+{ NSBreakFunctionKey,        "Break",        "" },
+{ NSMenuFunctionKey,         "Menu",         "" },
+{ 320,                       "Power",        "" },
+{ 321,                       "Euro",         "" },
+{ NSUndoFunctionKey,         "Undo",         "" }
+
+};
+
+#endif  /* ECORE_COCOA_KEYS_H__ */
diff --git a/src/lib/ecore_cocoa/Makefile.am b/src/lib/ecore_cocoa/Makefile.am
new file mode 100644 (file)
index 0000000..4ac7b11
--- /dev/null
@@ -0,0 +1,29 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_input \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
+
+lib_LTLIBRARIES = libecore_cocoa.la
+includes_HEADERS = \
+Ecore_Cocoa.h \
+Ecore_Cocoa_Keys.h
+includesdir = $(includedir)/ecore-@VMAJ@
+
+libecore_cocoa_la_SOURCES = \
+ecore_cocoa.m \
+ecore_cocoa_window.m
+
+libecore_cocoa_la_LIBADD = \
+$(top_builddir)/src/lib/ecore/libecore.la \
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+@EVAS_LIBS@ \
+@EINA_LIBS@
+
+libecore_cocoa_la_LDFLAGS = @cocoa_ldflags@ -version-info @version_info@ @release_info@
+
+EXTRA_DIST = ecore_cocoa_private.h
diff --git a/src/lib/ecore_cocoa/ecore_cocoa.m b/src/lib/ecore_cocoa/ecore_cocoa.m
new file mode 100644 (file)
index 0000000..3f6023a
--- /dev/null
@@ -0,0 +1,283 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Cocoa/Cocoa.h>
+
+#include <Eina.h>
+
+#include <Ecore.h>
+#include <ecore_private.h>
+#include <Ecore_Input.h>
+
+#include "Ecore_Cocoa.h"
+#include "Ecore_Cocoa_Keys.h"
+
+
+EAPI int ECORE_COCOA_EVENT_GOT_FOCUS = 0;
+EAPI int ECORE_COCOA_EVENT_LOST_FOCUS = 0;
+EAPI int ECORE_COCOA_EVENT_RESIZE = 0;
+EAPI int ECORE_COCOA_EVENT_EXPOSE = 0;
+
+static int _ecore_cocoa_init_count = 0;
+
+static int old_flags;
+
+EAPI int
+ecore_cocoa_init(void)
+{
+   if (++_ecore_cocoa_init_count != 1)
+     return _ecore_cocoa_init_count;
+
+   if (!ecore_event_init())
+     return --_ecore_cocoa_init_count;
+
+   NSApplicationLoad();
+
+   ECORE_COCOA_EVENT_GOT_FOCUS  = ecore_event_type_new();
+   ECORE_COCOA_EVENT_LOST_FOCUS = ecore_event_type_new();
+   ECORE_COCOA_EVENT_RESIZE     = ecore_event_type_new();
+   ECORE_COCOA_EVENT_EXPOSE     = ecore_event_type_new();
+
+   return _ecore_cocoa_init_count;
+}
+
+/**
+ * Shuts down the Ecore_Cocoa library.
+ * @return  @c The number of times the system has been initialised without
+ *             being shut down.
+ * @ingroup Ecore_Cocoa_Library_Group
+ */
+EAPI int
+ecore_cocoa_shutdown(void)
+{
+   if (--_ecore_cocoa_init_count != 0)
+     return _ecore_cocoa_init_count;
+
+   ecore_event_shutdown();
+
+   return _ecore_cocoa_init_count;
+}
+
+EAPI void
+ecore_cocoa_feed_events(void)
+{
+   NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0.001];
+   NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
+                                       untilDate:date
+                                          inMode:NSDefaultRunLoopMode
+                                         dequeue:YES];
+   [date release];
+   if (!event) return; // SDL loops until null; maybe we should do that too. or not.
+
+   unsigned int time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);
+
+   switch([event type])
+   {
+      case NSMouseMoved:
+      case NSLeftMouseDragged:
+      case NSRightMouseDragged:
+      case NSOtherMouseDragged:
+      {
+         Ecore_Event_Mouse_Move * ev = calloc(1, sizeof(Ecore_Event_Mouse_Move));
+         if (!ev) return;
+         ev->x = [event locationInWindow].x;
+         ev->y = [event locationInWindow].y;
+         ev->root.x = ev->x;
+         ev->root.y = ev->y;
+         ev->timestamp = time;
+         ev->window = [event window];
+         ev->modifiers = 0; /* FIXME: keep modifier around. */
+
+         ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
+
+         [NSApp sendEvent:event]; // pass along mouse events, for window manager
+         break;
+      }
+      case NSLeftMouseDown:
+      case NSRightMouseDown:
+      case NSOtherMouseDown:
+      {
+         Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+         if (!ev) return;
+         ev->x = [event locationInWindow].x;
+         ev->y = [event locationInWindow].y;
+         ev->root.x = ev->x;
+         ev->root.y = ev->y;
+         ev->timestamp = time;
+         ev->buttons = [event buttonNumber] + 1; // Apple indexes buttons from 0
+
+         if ([event clickCount] == 2)
+            ev->double_click = 1;
+         else
+            ev->double_click = 0;
+
+         if ([event clickCount] >= 3)
+            ev->triple_click = 1;
+         else
+            ev->triple_click = 0;
+
+         ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
+
+         [NSApp sendEvent:event]; // pass along mouse events, for window manager
+         break;
+      }
+      case NSLeftMouseUp:
+      case NSRightMouseUp:
+      case NSOtherMouseUp:
+      {
+         Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+         if (!ev) return;
+         ev->x = [event locationInWindow].x;
+         ev->y = [event locationInWindow].y;
+         ev->root.x = ev->x;
+         ev->root.y = ev->y;
+         ev->timestamp = time;
+         ev->buttons = [event buttonNumber] + 1; // Apple indexes buttons from 0
+
+         if ([event clickCount] == 2)
+            ev->double_click = 1;
+         else
+            ev->double_click = 0;
+
+         if ([event clickCount] >= 3)
+            ev->triple_click = 1;
+         else
+            ev->triple_click = 0;
+
+         ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
+
+         [NSApp sendEvent:event]; // pass along mouse events, for window manager
+         break;
+      }
+      case NSKeyDown:
+      {
+         Ecore_Event_Key *ev;
+         unsigned int     i;
+
+         ev = calloc(1, sizeof (Ecore_Event_Key));
+         if (!ev) return;
+         ev->timestamp = time;
+
+         for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_cocoa_keys_s); ++i)
+         {
+            if (keystable[i].code == tolower([[event charactersIgnoringModifiers] characterAtIndex:0]))
+            {
+               ev->keyname = keystable[i].name;
+               ev->string = keystable[i].compose;
+
+               ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
+               return;
+            }
+         }
+
+         break;
+      }
+      case NSKeyUp:
+      {
+         Ecore_Event_Key *ev;
+         unsigned int     i;
+
+         ev = calloc(1, sizeof (Ecore_Event_Key));
+         if (!ev) return;
+         ev->timestamp = time;
+
+         for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_cocoa_keys_s); ++i)
+         {
+            if (keystable[i].code == tolower([[event charactersIgnoringModifiers] characterAtIndex:0]))
+            {
+               ev->keyname = keystable[i].name;
+               ev->string = keystable[i].compose;
+
+               ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
+               return;
+            }
+         }
+
+         break;
+      }
+      case NSFlagsChanged:
+      {
+         int flags = [event modifierFlags];
+
+         Ecore_Event_Key *evDown = NULL;
+         Ecore_Event_Key *evUp = NULL;
+
+         evDown = calloc(1, sizeof (Ecore_Event_Key));
+         if (!evDown) return;
+
+         evUp = calloc(1, sizeof (Ecore_Event_Key));
+         if (!evUp)
+           {
+              free(evDown);
+              return;
+           }
+
+         // Turn special key flags on
+         if (flags & NSShiftKeyMask)
+            evDown->keyname = "Shift_L";
+         else if (flags & NSControlKeyMask)
+            evDown->keyname = "Control_L";
+         else if (flags & NSAlternateKeyMask)
+            evDown->keyname = "Alt_L";
+         else if (flags & NSCommandKeyMask)
+            evDown->keyname = "Super_L";
+         else if (flags & NSAlphaShiftKeyMask)
+            evDown->keyname = "Caps_Lock";
+
+         if (evDown->keyname)
+         {
+            evDown->timestamp = time;
+            evDown->string = "";
+            ecore_event_add(ECORE_EVENT_KEY_DOWN, evDown, NULL, NULL);
+            old_flags = flags;
+            break;
+         }
+
+         int changed_flags = flags ^ old_flags;
+
+         // Turn special key flags off
+         if (changed_flags & NSShiftKeyMask)
+            evUp->keyname = "Shift_L";
+         else if (changed_flags & NSControlKeyMask)
+            evUp->keyname = "Control_L";
+         else if (changed_flags & NSAlternateKeyMask)
+            evUp->keyname = "Alt_L";
+         else if (changed_flags & NSCommandKeyMask)
+            evUp->keyname = "Super_L";
+         else if (changed_flags & NSAlphaShiftKeyMask)
+            evUp->keyname = "Caps_Lock";
+
+         if (evUp->keyname)
+         {
+            evUp->timestamp = time;
+            evUp->string = "";
+            ecore_event_add(ECORE_EVENT_KEY_UP, evUp, NULL, NULL);
+            old_flags = flags;
+            break;
+         }
+
+         break;
+      }
+      case NSAppKitDefined:
+      {
+         if ([event subtype] == NSApplicationActivatedEventType)
+            ecore_event_add(ECORE_COCOA_EVENT_GOT_FOCUS, NULL, NULL, NULL);
+         else if ([event subtype] == NSApplicationDeactivatedEventType)
+            ecore_event_add(ECORE_COCOA_EVENT_LOST_FOCUS, NULL, NULL, NULL);
+         [NSApp sendEvent:event]; // pass along AppKit events, for window manager
+         break;
+      }
+      case NSScrollWheel:
+      {
+         break;
+      }
+      default:
+      {
+         [NSApp sendEvent:event];
+         break;
+      }
+   }
+
+   [event release];
+}
diff --git a/src/lib/ecore_cocoa/ecore_cocoa_private.h b/src/lib/ecore_cocoa/ecore_cocoa_private.h
new file mode 100644 (file)
index 0000000..0b4cf31
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _ECORE_COCOA_PRIVATE_H\r
+#define _ECORE_COCOA_PRIVATE_H\r
+\r
+struct _Ecore_Cocoa_Window\r
+{\r
+   NSWindow *window;\r
+   unsigned int borderless : 1;\r
+};\r
+\r
+\r
+#endif\r
diff --git a/src/lib/ecore_cocoa/ecore_cocoa_window.m b/src/lib/ecore_cocoa/ecore_cocoa_window.m
new file mode 100644 (file)
index 0000000..2091a69
--- /dev/null
@@ -0,0 +1,163 @@
+#ifdef HAVE_CONFIG_H\r
+# include <config.h>\r
+#endif\r
+\r
+#include <Cocoa/Cocoa.h>\r
+\r
+#include "Ecore_Cocoa.h"\r
+#include "ecore_cocoa_private.h"\r
+\r
+Ecore_Cocoa_Window *\r
+ecore_cocoa_window_new(int x,\r
+                      int y,\r
+                      int width,\r
+                      int height)\r
+{\r
+  Ecore_Cocoa_Window *w;\r
+\r
+  NSWindow *window = [[NSWindow alloc]\r
+             initWithContentRect:NSMakeRect(x, y, width, height)\r
+             styleMask:(NSTitledWindowMask |\r
+                       NSClosableWindowMask |\r
+                        NSResizableWindowMask |\r
+                        NSMiniaturizableWindowMask)\r
+             backing:NSBackingStoreBuffered\r
+             defer:NO\r
+             screen:nil\r
+            ];\r
+\r
+  if (!window)\r
+    return NULL;\r
+\r
+  [window setBackgroundColor:[NSColor whiteColor]];\r
+\r
+  w = calloc(1, sizeof(Ecore_Cocoa_Window));\r
+  w->window = window;\r
+  w->borderless = 0;\r
+\r
+  return w;\r
+}\r
+\r
+void\r
+ecore_cocoa_window_free(Ecore_Cocoa_Window *window)\r
+{\r
+  if (!window)\r
+    return;\r
+\r
+  [window->window release];\r
+  free(window);\r
+}\r
+\r
+void\r
+ecore_cocoa_window_move(Ecore_Cocoa_Window *window,\r
+                       int                 x,\r
+                       int                 y)\r
+{\r
+  NSRect win_frame;\r
+\r
+  if (!window)\r
+    return;\r
+\r
+  win_frame = [window->window frame];\r
+  win_frame.origin.x = x;\r
+  win_frame.origin.y = y;\r
+\r
+  [window->window setFrame:win_frame display:YES];\r
+}\r
+\r
+void\r
+ecore_cocoa_window_resize(Ecore_Cocoa_Window *window,\r
+                         int                 width,\r
+                         int                 height)\r
+{\r
+  if (!window)\r
+    return;\r
+\r
+  NSRect win_frame;\r
+\r
+  if (!window)\r
+    return;\r
+\r
+  win_frame = [window->window frame];\r
+  win_frame.size.height = height;\r
+  win_frame.size.width = width;\r
+\r
+  [window->window setFrame:win_frame display:YES];\r
+}\r
+\r
+void\r
+ecore_cocoa_window_move_resize(Ecore_Cocoa_Window *window,\r
+                              int                 x,\r
+                              int                 y,\r
+                              int                 width,\r
+                              int                 height)\r
+{\r
+  if (!window)\r
+    return;\r
+\r
+  NSRect win_frame;\r
+\r
+  if (!window)\r
+    return;\r
+\r
+  win_frame = [window->window frame];\r
+  win_frame.size.height = height;\r
+  win_frame.size.width = width;\r
+  win_frame.origin.x = x;\r
+  win_frame.origin.y = y;\r
+\r
+  [window->window setFrame:win_frame display:YES];\r
+}\r
+\r
+void\r
+ecore_cocoa_window_title_set(Ecore_Cocoa_Window *window, const char *title)\r
+{\r
+  if (!window || !title)\r
+    return;\r
+\r
+  [window->window setTitle:[NSString stringWithUTF8String:title]];\r
+}\r
+\r
+void\r
+ecore_cocoa_window_show(Ecore_Cocoa_Window *window)\r
+{\r
+  if (!window || [window->window isVisible])\r
+    {\r
+      printf("Window(%p) is not visible\n", window->window);\r
+      return;\r
+    }\r
+\r
+  [window->window makeKeyAndOrderFront:NSApp];\r
+}\r
+\r
+void\r
+ecore_cocoa_window_hide(Ecore_Cocoa_Window *window)\r
+{\r
+  if (!window || ![window->window isVisible])\r
+    return;\r
+\r
+  [window->window orderOut:NSApp];\r
+}\r
+\r
+void\r
+ecore_cocoa_window_borderless_set(Ecore_Cocoa_Window *window,\r
+                                  int                 on)\r
+{\r
+  if (!window)\r
+    return;\r
+\r
+  if (on)\r
+    [window->window setContentBorderThickness:0.0\r
+           forEdje:NSMinXEdge | NSMinYEdge | NSMaxXEdge | NSMaxYEdge];\r
+}\r
+\r
+void\r
+ecore_cocoa_window_view_set(Ecore_Cocoa_Window *window,\r
+                           void *view)\r
+{\r
+  if (!window || !view)\r
+    return;\r
+\r
+  [[window->window contentView] addSubview:view];\r
+\r
+}\r
index 35c2de7..0a832fc 100644 (file)
@@ -1,15 +1,26 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
 #ifndef _ECORE_CON_H
 #define _ECORE_CON_H
 
+#include <time.h>
+#include <libgen.h>
+#ifdef _WIN32
+# include <ws2tcpip.h>
+#else
+# include <netdb.h>
+#endif
+#include <Eina.h>
+
 #ifdef EAPI
-#undef EAPI
+# undef EAPI
 #endif
-#ifdef _MSC_VER
-# ifdef BUILDING_DLL
-#  define EAPI __declspec(dllexport)
+
+#ifdef _WIN32
+# ifdef EFL_ECORE_CON_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif
 # else
 #  define EAPI __declspec(dllimport)
 # endif
 # endif
 #endif
 
-#include <time.h>
-#include <libgen.h>
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
-#include <Ecore_Data.h>
-
 /**
- * @file Ecore_Con.h
- * @brief Sockets functions.
+ * @defgroup Ecore_Con_Group Ecore_Con - Connection functions
  *
  * The Ecore Connection Library ( @c Ecore_Con ) provides simple mechanisms
  * for communications between programs using reliable sockets.  It saves
- * the programmer from having to worry about file descripters and waiting
+ * the programmer from having to worry about file descriptors and waiting
  * for incoming connections.
  *
  * There are two main objects in the @c Ecore_Con library: the @c
  * Ecore_Con_Server and the @c Ecore_Con_Client.
  *
- * The @c Ecore_Con_Server represents a server that can be connected to.  
- * It is used regardless of whether the program is acting as a server or 
+ * The @c Ecore_Con_Server represents a server that can be connected to.
+ * It is used regardless of whether the program is acting as a server or
  * client itself.
  *
- * To create a listening server, call @c ecore_con_server_add().
+ * To create a listening server call @c ecore_con_server_add(), optionally using
+ * an ECORE_CON_USE_* encryption type OR'ed with the type for encryption.
  *
  * To connect to a server, call @c ecore_con_server_connect().  Data can
  * then be sent to the server using the @c ecore_con_server_send().
- * 
- * Whenever a client connection is made to an @c Ecore_Con_Server, a
- * @c ECORE_CON_CLIENT_ADD event is emitted.  Any event callbacks that are
- * called receive a @c Ecore_Con_Client object, which represents a
- * connection that that particular client.
  *
  * Functions are described in the following groupings:
  * @li @ref Ecore_Con_Lib_Group
  * @li @ref Ecore_Con_Server_Group
  * @li @ref Ecore_Con_Client_Group
  * @li @ref Ecore_Con_Url_Group
+ *
+ * Events are described in @ref Ecore_Con_Events_Group.
+ */
+
+
+/**
+ * @defgroup Ecore_Con_Events_Group Ecore Connection Events Functions
+ *
+ * @li ECORE_CON_CLIENT_ADD: Whenever a client connection is made to an
+ * @c Ecore_Con_Server, an event of this type is emitted, allowing the
+ * retrieval of the client's ip with @ref ecore_con_client_ip_get and
+ * associating data with the client using ecore_con_client_data_set.
+ * @li ECORE_CON_EVENT_CLIENT_DEL: Whenever a client connection to an
+ * @c Ecore_Con_Server, an event of this type is emitted.  The contents of
+ * the data with this event are variable, but if the client object in the data
+ * is non-null, it must be freed with @ref ecore_con_client_del.
+ * @li ECORE_CON_EVENT_SERVER_ADD: Whenever a server object is created
+ * with @ref ecore_con_server_connect, an event of this type is emitted,
+ * allowing for data to be serialized and sent to the server using
+ * @ref ecore_con_server_send. At this point, the http handshake has
+ * occurred.
+ * @li ECORE_CON_EVENT_SERVER_DEL: Whenever a server object is destroyed,
+ * usually by the server connection being refused or dropped, an event of this
+ * type is emitted.  The contents of the data with this event are variable,
+ * but if the server object in the data is non-null, it must be freed
+ * with @ref ecore_con_server_del.
+ * @li ECORE_CON_EVENT_CLIENT_DATA: Whenever a client connects to your server
+ * object and sends data, an event of this type is emitted.  The data will contain both
+ * the size and contents of the message sent by the client.  It should be noted that
+ * data within this object is transient, so it must be duplicated in order to be
+ * retained.  This event will continue to occur until the client has stopped sending its
+ * message, so a good option for storing this data is an Eina_Strbuf.  Once the message has
+ * been received in full, the client object must be freed with ecore_con_client_free.
+ * @li ECORE_CON_EVENT_SERVER_DATA: Whenever your server object connects to its destination
+ * and receives data, an event of this type is emitted.  The data will contain both
+ * the size and contents of the message sent by the server.  It should be noted that
+ * data within this object is transient, so it must be duplicated in order to be
+ * retained.  This event will continue to occur until the server has stopped sending its
+ * message, so a good option for storing this data is an Eina_Strbuf.  Once the message has
+ * been received in full, the server object must be freed with ecore_con_server_free.
+ *
+ */
+
+/**
+ * @defgroup Ecore_Con_Buffer Ecore Connection Buffering
+ * 
+ * As Ecore_Con works on an event driven design, as data arrives, events will
+ * be produced containing the data that arrived. It is up to the user of
+ * Ecore_Con to either parse as they go, append to a file to later parse the
+ * whole file in one go, or append to memory to parse or handle leter.
+ * 
+ * To help with this Eina has some handy API's. The Eina_Binbuf and 
+ * Eina_Strbuf APIs, abstract dynamic buffer management and make it trivial 
+ * to handle buffers at runtime, without having to manage them. Eina_Binbuf 
+ * makes it possible to create, expand, reset and slice a blob of memory - 
+ * all via API. No system calls, no pointer manipulations and no size 
+ * calculation.
+ * 
+ * Additional functions include adding content at specified byte positions in 
+ * the buffer, escaping the inputs, find and replace strings. This provides 
+ * extreme flexibility to play around, with a dynamic blob of memory.
+ * 
+ * It is good to free it (using eina_binbuf_free()) after using it.
+ * 
+ * Eina_Binbuf compliments Ecore_Con use cases, where dynamic sizes of data
+ * arrive from the network (think http download in chunks). Using
+ * Eina_Binbuf provides enough flexibility to handle data as it arrives and
+ * to defer its processing until desired, without having to think about
+ * where to store the temporary data and how to manage its size.
+ * 
+ * An example of how to use these with Ecore_Con follows.
+ * 
+ * @code
+ * #include <Eina.h>
+ * #include <Ecore.h>
+ * #include <Ecore_Con.h>
+ * 
+ * static Eina_Bool
+ * data_callback(void *data, int type, void *event)
+ * {
+ *    Ecore_Con_Event_Url_Data *url_data = event;
+ *    if ( url_data->size > 0)
+ *      {
+ *         // append data as it arrives - don't worry where or how it gets stored.
+ *         // Also don't worry about size, expanding, reallocing etc.
+ *         // just keep appending - size is automatically handled.
+ * 
+ *         eina_binbuf_append_length(data, url_data->data, url_data->size);
+ * 
+ *         fprintf(stderr, "Appended %d \n", url_data->size);
+ *      }
+ *    return EINA_TRUE;
+ * }
+ * 
+ * 
+ * 
+ * static Eina_Bool
+ * completion_callback(void *data, int type, void *event)
+ * {
+ *    Ecore_Con_Event_Url_Complete *url_complete = event;
+ *    printf("download completed with status code: %d\n", url_complete->status);
+ * 
+ *    // get the data back from Eina_Binbuf
+ *    char *ptr = eina_binbuf_string_get(data);
+ *    size_t size = eina_binbuf_length_get(data);
+ * 
+ *    // process data as required (write to file)
+ *    fprintf(stderr, "Size of data = %d bytes\n", size);
+ *    int fd = open("./elm.png", O_CREAT);
+ *    write(fd, ptr, size);
+ *    close(fd);
+ *   
+ *    // free it when done.
+ *    eina_binbuf_free(data);
+ * 
+ *    ecore_main_loop_quit();
+ * 
+ *    return EINA_TRUE;
+ * }
+ * 
+ * 
+ * int
+ * main(int argc, char **argv)
+ * {
+ * 
+ *    const char *url = "http://www.enlightenment.org/p/index/d/logo.png";
+ * 
+ *    ecore_init();
+ *    ecore_con_init();
+ *    ecore_con_url_init();
+ *   
+ * 
+ *    // This is single additional line to manage dynamic network data.
+ *    Eina_Binbuf *data = eina_binbuf_new();
+ *    Ecore_Con_Url *url_con = ecore_con_url_new(url);
+ * 
+ *    ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE,
+ *                                                       completion_callback,
+ *                                                       data);
+ *    ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA,
+ *                                                       data_callback,
+ *                                                       data);
+ *    ecore_con_url_get(url_con);
+ * 
+ *    ecore_main_loop_begin();
+ *    return 0;
+ * }
+ * @endcode
  */
 
 #ifdef __cplusplus
 extern "C" {
 #endif
-   
-   typedef struct _Ecore_Con_Server Ecore_Con_Server; /**< A connection handle */
-   typedef struct _Ecore_Con_Client Ecore_Con_Client; /**< A connection handle */
-   typedef struct _Ecore_Con_Url    Ecore_Con_Url;
-   
-   typedef enum _Ecore_Con_Type
-     {
-       ECORE_CON_LOCAL_USER,
-       ECORE_CON_LOCAL_SYSTEM,
-       ECORE_CON_LOCAL_ABSTRACT,
-       ECORE_CON_REMOTE_SYSTEM,
-       ECORE_CON_USE_SSL2 = (1 << 4),
-       ECORE_CON_USE_SSL3 = (1 << 5),
-       ECORE_CON_USE_TLS  = (1 << 6)
-     } Ecore_Con_Type;
 #define ECORE_CON_USE_SSL ECORE_CON_USE_SSL2
+#define ECORE_CON_REMOTE_SYSTEM ECORE_CON_REMOTE_TCP
 
-   typedef enum _Ecore_Con_Url_Time
-     {
-       ECORE_CON_URL_TIME_NONE = 0,
-       ECORE_CON_URL_TIME_IFMODSINCE,
-       ECORE_CON_URL_TIME_IFUNMODSINCE,
-       ECORE_CON_URL_TIME_LASTMOD
-     } Ecore_Con_Url_Time;
-
-   typedef struct _Ecore_Con_Event_Client_Add  Ecore_Con_Event_Client_Add;
-   typedef struct _Ecore_Con_Event_Client_Del  Ecore_Con_Event_Client_Del;
-   typedef struct _Ecore_Con_Event_Server_Add  Ecore_Con_Event_Server_Add;
-   typedef struct _Ecore_Con_Event_Server_Del  Ecore_Con_Event_Server_Del;
-   typedef struct _Ecore_Con_Event_Client_Data Ecore_Con_Event_Client_Data;
-   typedef struct _Ecore_Con_Event_Server_Data Ecore_Con_Event_Server_Data;
-   typedef struct _Ecore_Con_Event_Url_Data Ecore_Con_Event_Url_Data;
-   typedef struct _Ecore_Con_Event_Url_Complete Ecore_Con_Event_Url_Complete;
-   typedef struct _Ecore_Con_Event_Url_Progress Ecore_Con_Event_Url_Progress;
-
-   struct _Ecore_Con_Event_Client_Add
-     {
-       Ecore_Con_Client *client;
-     };
-
-   struct _Ecore_Con_Event_Client_Del
-     {
-       Ecore_Con_Client *client;
-     };
-
-   struct _Ecore_Con_Event_Server_Add
-     {
-       Ecore_Con_Server *server;
-     };
-
-   struct _Ecore_Con_Event_Server_Del
-     {
-       Ecore_Con_Server *server;
-     };
-   
-   struct _Ecore_Con_Event_Client_Data
-     {
-       Ecore_Con_Client *client;
-       void             *data;
-       int               size;
-     };
-   
-   struct _Ecore_Con_Event_Server_Data
-     {
-       Ecore_Con_Server *server;
-       void             *data;
-       int               size;
-     };
-   
-   struct _Ecore_Con_Event_Url_Data
-     {
-       Ecore_Con_Url    *url_con;
-       int               size;
-       unsigned char     data[1];
-     };
-        
-   struct _Ecore_Con_Event_Url_Complete
-     {
-       Ecore_Con_Url    *url_con;
-       int               status;
-     };
-
-   struct _Ecore_Con_Event_Url_Progress
-     {
-       Ecore_Con_Url    *url_con;
-       struct {
-          double         total;
-          double         now;
-       } down;
-       struct {
-          double         total;
-          double         now;
-       } up;
-     };
-
-   EAPI extern int ECORE_CON_EVENT_CLIENT_ADD;
-   EAPI extern int ECORE_CON_EVENT_CLIENT_DEL;
-   EAPI extern int ECORE_CON_EVENT_SERVER_ADD;
-   EAPI extern int ECORE_CON_EVENT_SERVER_DEL;
-   EAPI extern int ECORE_CON_EVENT_CLIENT_DATA;
-   EAPI extern int ECORE_CON_EVENT_SERVER_DATA;
-   EAPI extern int ECORE_CON_EVENT_URL_DATA;
-   EAPI extern int ECORE_CON_EVENT_URL_COMPLETE;
-   EAPI extern int ECORE_CON_EVENT_URL_PROGRESS;
-   
-   EAPI int               ecore_con_init(void);
-   EAPI int               ecore_con_shutdown(void);
-   
-   EAPI Ecore_Con_Server *ecore_con_server_add(Ecore_Con_Type type, const char *name, int port, const void *data);
-   
-   EAPI Ecore_Con_Server *ecore_con_server_connect(Ecore_Con_Type type, const char *name, int port, const void *data);
-   EAPI void             *ecore_con_server_del(Ecore_Con_Server *svr);
-   EAPI void             *ecore_con_server_data_get(Ecore_Con_Server *svr);
-   EAPI int               ecore_con_server_connected_get(Ecore_Con_Server *svr);
-   EAPI Ecore_List       *ecore_con_server_clients_get(Ecore_Con_Server *svr);
-   EAPI int               ecore_con_server_send(Ecore_Con_Server *svr, const void *data, int size);
-   EAPI void              ecore_con_server_client_limit_set(Ecore_Con_Server *svr, int client_limit, char reject_excess_clients);
-   EAPI char             *ecore_con_server_ip_get(Ecore_Con_Server *svr);
-   EAPI void              ecore_con_server_flush(Ecore_Con_Server *svr);
-   
-   EAPI int               ecore_con_client_send(Ecore_Con_Client *cl, const void *data, int size);
-   EAPI Ecore_Con_Server *ecore_con_client_server_get(Ecore_Con_Client *cl);
-   EAPI void             *ecore_con_client_del(Ecore_Con_Client *cl);
-   EAPI void              ecore_con_client_data_set(Ecore_Con_Client *cl, const void *data);
-   EAPI void             *ecore_con_client_data_get(Ecore_Con_Client *cl);
-   EAPI char             *ecore_con_client_ip_get(Ecore_Con_Client *cl);
-   EAPI void              ecore_con_client_flush(Ecore_Con_Client *cl);
-   
-   EAPI int               ecore_con_ssl_available_get(void);
-
-   EAPI int               ecore_con_url_init(void);
-   EAPI int               ecore_con_url_shutdown(void);
-   EAPI Ecore_Con_Url    *ecore_con_url_new(const char *url);
-   EAPI void              ecore_con_url_destroy(Ecore_Con_Url *url_con);
-   EAPI void              ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data);
-   EAPI void             *ecore_con_url_data_get(Ecore_Con_Url *url_con);
-   EAPI int               ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url);
-   EAPI void             ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd);
-   EAPI int              ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con);
-   EAPI int               ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *content_type);
-   EAPI void              ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, time_t tm);
-
-#ifdef HAVE_NETDB_H
-   EAPI int               ecore_con_dns_lookup(const char *name,
-                                              void (*done_cb)(void *data, struct hostent *hostent),
-                                              void *data);
-#endif
-                                              
-   EAPI int              ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, char *filename, char *user, char *pass, char *upload_dir);
-   EAPI void             ecore_con_url_verbose_set(Ecore_Con_Url *url_con, int verbose);
-   EAPI void             ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, int use_epsv);
+
+/**
+ * @typedef Ecore_Con_Server
+ * A connection handle to a server
+ * @ingroup Ecore_Con_Server_Group
+ */
+typedef struct _Ecore_Con_Server Ecore_Con_Server;
+
+/**
+ * @typedef Ecore_Con_Client
+ * A connection handle to a client
+ * @ingroup Ecore_Con_Client_Group
+ */
+typedef struct _Ecore_Con_Client Ecore_Con_Client;
+
+/**
+ * @typedef Ecore_Con_Socks
+ * An object representing a SOCKS proxy
+ * @ingroup Ecore_Con_Socks_Group
+ * @since 1.2
+ */
+typedef struct Ecore_Con_Socks Ecore_Con_Socks;
+
+/**
+ * @typedef Ecore_Con_Url
+ * A handle to an http upload/download object
+ * @ingroup Ecore_Con_Url_Group
+ */
+typedef struct _Ecore_Con_Url Ecore_Con_Url;
+
+
+/**
+ * @addtogroup Ecore_Con_Events_Group
+ * @{
+ */
+
+/**
+ * @typedef Ecore_Con_Event_Client_Add
+ * Used as the @p data param for the corresponding event
+ */
+typedef struct _Ecore_Con_Event_Client_Add Ecore_Con_Event_Client_Add;
+
+/**
+ * @typedef Ecore_Con_Event_Client_Upgrade
+ * Used as the @p data param for the corresponding event
+ * @since 1.1
+ */
+typedef struct _Ecore_Con_Event_Client_Upgrade Ecore_Con_Event_Client_Upgrade;
+
+/**
+ * @typedef Ecore_Con_Event_Client_Del
+ * Used as the @p data param for the corresponding event
+ */
+typedef struct _Ecore_Con_Event_Client_Del Ecore_Con_Event_Client_Del;
+
+/**
+ * @typedef Ecore_Con_Event_Client_Error
+ * Used as the @p data param for the corresponding event
+ * @since 1.1
+ */
+typedef struct _Ecore_Con_Event_Client_Error Ecore_Con_Event_Client_Error;
+
+/**
+ * @typedef Ecore_Con_Event_Server_Add
+ * Used as the @p data param for the corresponding event
+ */
+typedef struct _Ecore_Con_Event_Server_Add Ecore_Con_Event_Server_Add;
+
+/**
+ * @typedef Ecore_Con_Event_Server_Upgrade
+ * Used as the @p data param for the corresponding event
+ * @since 1.1
+ */
+typedef struct _Ecore_Con_Event_Server_Upgrade Ecore_Con_Event_Server_Upgrade;
+
+/**
+ * @typedef Ecore_Con_Event_Server_Del
+ * Used as the @p data param for the corresponding event
+ */
+typedef struct _Ecore_Con_Event_Server_Del Ecore_Con_Event_Server_Del;
+
+/**
+ * @typedef Ecore_Con_Event_Server_Error
+ * Used as the @p data param for the corresponding event
+ * @since 1.1
+ */
+typedef struct _Ecore_Con_Event_Server_Error Ecore_Con_Event_Server_Error;
+
+/**
+ * @typedef Ecore_Con_Event_Client_Data
+ * Used as the @p data param for the corresponding event
+ */
+typedef struct _Ecore_Con_Event_Client_Data Ecore_Con_Event_Client_Data;
+
+/**
+ * @typedef Ecore_Con_Event_Server_Data
+ * Used as the @p data param for the corresponding event
+ */
+typedef struct _Ecore_Con_Event_Server_Data Ecore_Con_Event_Server_Data;
+
+/**
+ * @typedef Ecore_Con_Event_Client_Write
+ * Used as the @p data param for the corresponding event
+ * @since 1.1
+ */
+typedef struct _Ecore_Con_Event_Client_Write Ecore_Con_Event_Client_Write;
+
+/**
+ * @typedef Ecore_Con_Event_Server_Write
+ * Used as the @p data param for the corresponding event
+ * @since 1.1
+ */
+typedef struct _Ecore_Con_Event_Server_Write Ecore_Con_Event_Server_Write;
+
+/**
+ * @typedef Ecore_Con_Event_Proxy_Bind
+ * Used as the @p data param for the corresponding event
+ * @since 1.2
+ */
+typedef struct _Ecore_Con_Event_Proxy_Bind Ecore_Con_Event_Proxy_Bind;
+
+/**
+ * @typedef Ecore_Con_Event_Url_Data
+ * Used as the @p data param for the corresponding event
+ * @ingroup Ecore_Con_Url_Group
+ */
+typedef struct _Ecore_Con_Event_Url_Data Ecore_Con_Event_Url_Data;
+
+/**
+ * @typedef Ecore_Con_Event_Url_Complete
+ * Used as the @p data param for the corresponding event
+ * @ingroup Ecore_Con_Url_Group
+ */
+typedef struct _Ecore_Con_Event_Url_Complete Ecore_Con_Event_Url_Complete;
+
+/**
+ * @typedef Ecore_Con_Event_Url_Progress
+ * Used as the @p data param for the corresponding event
+ * @ingroup Ecore_Con_Url_Group
+ */
+typedef struct _Ecore_Con_Event_Url_Progress Ecore_Con_Event_Url_Progress;
+
+/**
+ * @struct _Ecore_Con_Event_Client_Add
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_ADD event
+ */
+struct _Ecore_Con_Event_Client_Add
+{
+   Ecore_Con_Client *client; /** the client that connected */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Client_Upgrade
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_UPGRADE event
+ * @since 1.1
+ */
+struct _Ecore_Con_Event_Client_Upgrade
+{
+   Ecore_Con_Client *client; /** the client that completed handshake */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Client_Del
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_DEL event
+ */
+struct _Ecore_Con_Event_Client_Del
+{
+   Ecore_Con_Client *client; /** the client that was lost */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Client_Error
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_ERROR event
+ */
+struct _Ecore_Con_Event_Client_Error
+{
+   Ecore_Con_Client *client; /** the client for which an error occurred */
+   char *error; /**< the error string describing what happened */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Server_Add
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_ADD event
+ */
+struct _Ecore_Con_Event_Server_Add
+{
+   Ecore_Con_Server *server; /** the server that was connected to */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Server_Upgrade
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_UPGRADE event
+ * @since 1.1
+ */
+struct _Ecore_Con_Event_Server_Upgrade
+{
+   Ecore_Con_Server *server; /** the server that was connected to */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Server_Del
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_DEL event
+ */
+struct _Ecore_Con_Event_Server_Del
+{
+   Ecore_Con_Server *server; /** the client that was lost */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Server_Error
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_ERROR event
+ */
+struct _Ecore_Con_Event_Server_Error
+{
+   Ecore_Con_Server *server; /** the server for which an error occurred */
+   char *error; /**< the error string describing what happened */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Client_Data
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_DATA event
+ */
+struct _Ecore_Con_Event_Client_Data
+{
+   Ecore_Con_Client *client; /**< the client that connected */
+   void *data;               /**< the data that the client sent */
+   int size;                 /**< the length of the data sent */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Server_Data
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_DATA event
+ */
+struct _Ecore_Con_Event_Server_Data
+{
+   Ecore_Con_Server *server; /**< the server that was connected to */
+   void *data;               /**< the data that the server sent */
+   int size;                 /**< the length of the data sent */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Client_Write
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_WRITE event
+ */
+struct _Ecore_Con_Event_Client_Write
+{
+   Ecore_Con_Client *client; /**< the client that connected */
+   int size;                 /**< the length of the data sent */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Server_Write
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_WRITE event
+ */
+struct _Ecore_Con_Event_Server_Write
+{
+   Ecore_Con_Server *server; /**< the server that was connected to */
+   int size;                 /**< the length of the data sent */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Proxy_Bind
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_PROXY_BIND event
+ * @ingroup Ecore_Con_Socks_Group
+ * @since 1.2
+ */
+struct _Ecore_Con_Event_Proxy_Bind
+{
+   Ecore_Con_Server *server; /**< the server object connected to the proxy */
+   const char *ip;           /**< the proxy-bound ip address */
+   int port;                 /**< the proxy-bound port */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Url_Data
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_URL_DATA event
+ * @ingroup Ecore_Con_Url_Group
+ */
+struct _Ecore_Con_Event_Url_Data
+{
+   Ecore_Con_Url *url_con; /**< a pointer to the connection object */
+   int size; /**< the size of the current received data (in bytes) */
+   unsigned char data[1]; /**< the data received on this event */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Url_Complete
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_URL_COMPLETE event
+ * @ingroup Ecore_Con_Url_Group
+ */
+struct _Ecore_Con_Event_Url_Complete
+{
+   Ecore_Con_Url *url_con; /**< a pointer to the connection object */
+   int status; /**< HTTP status code of the operation (200, 404, 401, etc.) */
+};
+
+/**
+ * @struct _Ecore_Con_Event_Url_Progress
+ * Used as the @p data param for the @ref ECORE_CON_EVENT_URL_PROGRESS event
+ * @ingroup Ecore_Con_Url_Group
+ */
+struct _Ecore_Con_Event_Url_Progress
+{
+   Ecore_Con_Url *url_con; /**< a pointer to the connection object */
+   struct
+   {
+      double total; /**< total size of the downloading data (in bytes) */
+      double now; /**< current size of the downloading data (in bytes) */
+   } down; /**< download info */
+   struct
+   {
+      double total; /**< total size of the uploading data (in bytes) */
+      double now; /**< current size of the uploading data (in bytes) */
+   } up; /**< upload info */
+};
+
+/** A client has connected to the server */
+EAPI extern int ECORE_CON_EVENT_CLIENT_ADD;
+/** A client has disconnected from the server */
+EAPI extern int ECORE_CON_EVENT_CLIENT_DEL;
+/** A client experienced an error
+ * @since 1.1
+ */
+EAPI extern int ECORE_CON_EVENT_CLIENT_ERROR;
+/** A client connection has been upgraded to SSL
+ * @since 1.1
+ */
+EAPI extern int ECORE_CON_EVENT_CLIENT_UPGRADE;
+/** A server was created */
+EAPI extern int ECORE_CON_EVENT_SERVER_ADD;
+/** A server connection was lost */
+EAPI extern int ECORE_CON_EVENT_SERVER_DEL;
+/** A server experienced an error
+ * @since 1.1
+ */
+EAPI extern int ECORE_CON_EVENT_SERVER_ERROR;
+/** A server connection has been upgraded to SSL
+ * @since 1.1
+ */
+EAPI extern int ECORE_CON_EVENT_SERVER_UPGRADE;
+/** A server connection has sent data to its client
+ * @since 1.1
+ */
+EAPI extern int ECORE_CON_EVENT_CLIENT_WRITE;
+/** A server connection object has sent data
+ * @since 1.1
+ */
+EAPI extern int ECORE_CON_EVENT_SERVER_WRITE;
+/** A client connected to the server has sent data */
+EAPI extern int ECORE_CON_EVENT_CLIENT_DATA;
+/** A server connection object has data */
+EAPI extern int ECORE_CON_EVENT_SERVER_DATA;
+/** A server connection has successfully negotiated an ip:port binding
+ * @since 1.2
+ */
+EAPI extern int ECORE_CON_EVENT_PROXY_BIND;
+/** A URL object has data */
+EAPI extern int ECORE_CON_EVENT_URL_DATA;
+/** A URL object has completed its transfer to and from the server and can be reused */
+EAPI extern int ECORE_CON_EVENT_URL_COMPLETE;
+/** A URL object has made progress in its transfer */
+EAPI extern int ECORE_CON_EVENT_URL_PROGRESS;
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Con_Lib_Group Ecore Connection Library Functions
+ *
+ * Utility functions that set up and shut down the Ecore Connection
+ * library.
+ *
+ * There's also ecore_con_lookup() that can be used to make simple asynchronous
+ * DNS lookups.
+ *
+ * A simple example of how to use these functions:
+ * @li @ref ecore_con_lookup_example_c
+ *
+ * @{
+ */
+
+/**
+ * @typedef Ecore_Con_Dns_Cb
+ * A callback type for use with @ref ecore_con_lookup.
+ */
+typedef void (*Ecore_Con_Dns_Cb)(const char *canonname,
+                                 const char *ip,
+                                 struct sockaddr *addr,
+                                 int addrlen,
+                                 void *data);
+
+/**
+ * @typedef Ecore_Con_Type
+ * @enum _Ecore_Con_Type
+ * Types for an ecore_con client/server object.  A correct way to set this type is
+ * with an ECORE_CON_$TYPE, optionally OR'ed with an ECORE_CON_$USE if encryption is desired,
+ * and LOAD_CERT if the previously loaded certificate should be used.
+ * @code
+ * ECORE_CON_REMOTE_TCP | ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT
+ * @endcode
+ * @ingroup Ecore_Con_Server_Group
+ */
+typedef enum _Ecore_Con_Type
+{
+   /** Socket in ~/.ecore */
+   ECORE_CON_LOCAL_USER = 0,
+   /** Socket in /tmp */
+   ECORE_CON_LOCAL_SYSTEM = 1,
+   /** Abstract socket */
+   ECORE_CON_LOCAL_ABSTRACT = 2,
+   /** Remote server using TCP */
+   ECORE_CON_REMOTE_TCP = 3,
+   /** Remote multicast server */
+   ECORE_CON_REMOTE_MCAST = 4,
+   /** Remote server using UDP */
+   ECORE_CON_REMOTE_UDP = 5,
+   /** Remote broadcast using UDP */
+   ECORE_CON_REMOTE_BROADCAST = 6,
+   /** Remote connection sending packets immediately */
+   ECORE_CON_REMOTE_NODELAY = 7,
+   /** Remote connection sending data in large chunks
+    * @note Only available on Linux
+    * @since 1.2
+    */
+   ECORE_CON_REMOTE_CORK = 8,
+   /** Use SSL2: UNSUPPORTED. **/
+   ECORE_CON_USE_SSL2 = (1 << 4),
+   /** Use SSL3 */
+   ECORE_CON_USE_SSL3 = (1 << 5),
+   /** Use TLS */
+   ECORE_CON_USE_TLS = (1 << 6),
+   /** Use both TLS and SSL3 */
+   ECORE_CON_USE_MIXED = ECORE_CON_USE_SSL3 | ECORE_CON_USE_TLS,
+   /** Attempt to use the loaded certificate */
+   ECORE_CON_LOAD_CERT = (1 << 7),
+   /** Disable all types of proxy on the server
+    * @note Only functional for clients
+    * @since 1.2
+    */
+   ECORE_CON_NO_PROXY = (1 << 8)
+} Ecore_Con_Type;
+
+/**
+ * Initialises the Ecore_Con library.
+ * @return  Number of times the library has been initialised without being
+ *          shut down.
+ *
+ * @note This function already calls ecore_init() internally, so you don't need
+ * to call it explicitly.
+ */
+EAPI int               ecore_con_init(void);
+
+/**
+ * Shuts down the Ecore_Con library.
+ * @return  Number of times the library has been initialised without being
+ *          shut down.
+ * @note This function already calls ecore_shutdown() internally, so you don't
+ * need to call it explicitly unless you called ecore_init() explicitly too.
+ */
+EAPI int               ecore_con_shutdown(void);
+
+/**
+ * Do an asynchronous DNS lookup.
+ *
+ * @param name IP address or server name to translate.
+ * @param done_cb Callback to notify when done.
+ * @param data User data to be given to done_cb.
+ * @return @c EINA_TRUE if the request did not fail to be set up, @c EINA_FALSE
+ * if it failed.
+ *
+ * This function performs a DNS lookup on the hostname specified by @p name,
+ * then calls @p done_cb with the result and the @p data given as parameter.
+ * The result will be given to the @p done_cb as follows:
+ * @li @c canonname - the canonical name of the address
+ * @li @c ip - the resolved ip address
+ * @li @c addr - a pointer to the socket address
+ * @li @c addrlen - the length of the socket address, in bytes
+ * @li @c data - the data pointer given as parameter to ecore_con_lookup()
+ */
+EAPI Eina_Bool         ecore_con_lookup(const char *name,
+                                            Ecore_Con_Dns_Cb done_cb,
+                                            const void *data);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Con_SSL_Group Ecore Connection SSL Functions
+ *
+ * @{
+ */
+EAPI int               ecore_con_ssl_available_get(void);
+EAPI Eina_Bool         ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr, const char *cert);
+EAPI Eina_Bool         ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr, const char *key_file);
+EAPI Eina_Bool         ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr, const char *crl_file);
+EAPI Eina_Bool         ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr, const char *ca_file);
+EAPI void              ecore_con_ssl_server_verify(Ecore_Con_Server *svr);
+EAPI void              ecore_con_ssl_server_verify_basic(Ecore_Con_Server *svr);
+EAPI void              ecore_con_ssl_server_verify_name_set(Ecore_Con_Server *svr, const char *name);
+EAPI const char       *ecore_con_ssl_server_verify_name_get(Ecore_Con_Server *svr);
+EAPI Eina_Bool         ecore_con_ssl_server_upgrade(Ecore_Con_Server *svr, Ecore_Con_Type compl_type);
+EAPI Eina_Bool         ecore_con_ssl_client_upgrade(Ecore_Con_Client *cl, Ecore_Con_Type compl_type);
+
+/**
+ * @}
+ */
+
+EAPI Ecore_Con_Socks *ecore_con_socks4_remote_add(const char *ip, int port, const char *username);
+EAPI Eina_Bool        ecore_con_socks4_remote_exists(const char *ip, int port, const char *username);
+EAPI void             ecore_con_socks4_remote_del(const char *ip, int port, const char *username);
+EAPI Ecore_Con_Socks *ecore_con_socks5_remote_add(const char *ip, int port, const char *username, const char *password);
+EAPI Eina_Bool        ecore_con_socks5_remote_exists(const char *ip, int port, const char *username, const char *password);
+EAPI void             ecore_con_socks5_remote_del(const char *ip, int port, const char *username, const char *password);
+EAPI void             ecore_con_socks_lookup_set(Ecore_Con_Socks *ecs, Eina_Bool enable);
+EAPI Eina_Bool        ecore_con_socks_lookup_get(Ecore_Con_Socks *ecs);
+EAPI void             ecore_con_socks_bind_set(Ecore_Con_Socks *ecs, Eina_Bool is_bind);
+EAPI Eina_Bool        ecore_con_socks_bind_get(Ecore_Con_Socks *ecs);
+EAPI unsigned int     ecore_con_socks_version_get(Ecore_Con_Socks *ecs);
+EAPI void             ecore_con_socks_remote_del(Ecore_Con_Socks *ecs);
+EAPI void             ecore_con_socks_apply_once(Ecore_Con_Socks *ecs);
+EAPI void             ecore_con_socks_apply_always(Ecore_Con_Socks *ecs);
+
+/**
+ * @defgroup Ecore_Con_Server_Group Ecore Connection Server Functions
+ *
+ * This group of functions is applied to an @ref Ecore_Con_Server object. It
+ * doesn't mean that they should be used in the server application, but on the
+ * server object. In fact, most of them should be used in the client
+ * application, when retrieving information or sending data.
+ *
+ * Setting up a server is very simple: you just need to start it with
+ * ecore_con_server_add() and setup some callbacks to the events
+ * @ref ECORE_CON_EVENT_CLIENT_ADD, @ref ECORE_CON_EVENT_CLIENT_DEL and
+ * @ref ECORE_CON_EVENT_CLIENT_DATA, that will be called when a client is
+ * communicating with the server:
+ *
+ * @code
+ * if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
+ *   exit(1);
+ *
+ * ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, _add_cb, NULL);
+ * ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, _del_cb, NULL);
+ * ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, _data_cb, NULL);
+ *
+ * ecore_main_loop_begin();
+ * @endcode
+ *
+ * The function ecore_con_server_connect() can be used to write a client that
+ * connects to a server. The resulting code will be very similar to the server
+ * code:
+ *
+ * @code
+ * if (!(svr = ecore_con_server_connect(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
+ *   exit(1);
+ *
+ * ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _add_cb, NULL);
+ * ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _del_cb, NULL);
+ * ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _data_cb, NULL);
+ *
+ * ecore_main_loop_begin();
+ * @endcode
+ *
+ * After these two pieces of code are executed, respectively, in the server and
+ * client code, the server will be up and running and the client will try to
+ * connect to it. The connection, with its subsequent messages being sent from
+ * server to client and client to server, can be represented in the following
+ * sequence diagram:
+ *
+ * @htmlonly
+ * <img src="ecore_con-client-server.png" style="max-width: 400px"/>
+ * <a href="ecore_con-client-server.png">Full size</a>
+ * @endhtmlonly
+ *
+ * @image rtf ecore_con-client-server.png
+ * @image latex ecore_con-client-server.eps width=\textwidth
+ *
+ * Please notice the important difference between these two codes: the first is
+ * used for writing a @b server, while the second should be used for writing a
+ * @b client.
+ *
+ * A reference for the @c client functions can be found at @ref
+ * Ecore_Con_Client_Group.
+ *
+ * Examples of usage for this API can be found here:
+ * @li @ref ecore_con_server_simple_example_c
+ * @li @ref ecore_con_client_simple_example_c
+ *
+ * @{
+ */
+
+/**
+ * Creates a server to listen for connections.
+ *
+ * @param  type The connection type.
+ * @param  name       Name to associate with the socket.  It is used when
+ *                    generating the socket name of a Unix socket, or for
+ *                    determining what host to listen on for TCP sockets.
+ *                    @c NULL will not be accepted.
+ * @param  port       Number to identify socket.  When a Unix socket is used,
+ *                    it becomes part of the socket name.  When a TCP socket
+ *                    is used, it is used as the TCP port.
+ * @param  data       Data to associate with the created Ecore_Con_Server
+ *                    object.
+ * @return A new Ecore_Con_Server.
+ *
+ * The socket on which the server listens depends on the connection
+ * type:
+ * @li If @a type is @c ECORE_CON_LOCAL_USER, the server will listen on
+ *     the Unix socket "~/.ecore/[name]/[port]".
+ * @li If @a type is @c ECORE_CON_LOCAL_SYSTEM, the server will listen
+ *     on Unix socket "/tmp/.ecore_service|[name]|[port]".
+ * @li If @a type is @c ECORE_CON_REMOTE_TCP, the server will listen
+ *     on TCP port @c port.
+ *
+ * More information about the @p type can be found at @ref _Ecore_Con_Type.
+ *
+ * The @p data parameter can be fetched later using ecore_con_server_data_get()
+ * or changed with ecore_con_server_data_set().
+ */
+EAPI Ecore_Con_Server *ecore_con_server_add(Ecore_Con_Type type,
+                                            const char *name, int port,
+                                            const void *data);
+
+/**
+ * Creates a connection to the specified server and returns an associated object.
+ *
+ * @param  type The connection type.
+ * @param  name       Name used when determining what socket to connect to.
+ *                    It is used to generate the socket name when the socket
+ *                    is a Unix socket.  It is used as the hostname when
+ *                    connecting with a TCP socket.
+ * @param  port       Number to identify the socket to connect to.  Used when
+ *                    generating the socket name for a Unix socket, or as the
+ *                    TCP port when connecting to a TCP socket.
+ * @param  data       Data to associate with the created Ecore_Con_Server
+ *                    object.
+ * @return A new Ecore_Con_Server.
+ *
+ * The socket to which the connection is made depends on the connection type:
+ * @li If @a type is @c ECORE_CON_LOCAL_USER, the function will
+ *     connect to the server at the Unix socket
+ *     "~/.ecore/[name]/[port]".
+ * @li If @a type is @c ECORE_CON_LOCAL_SYSTEM, the function will
+ *     connect to the server at the Unix socket
+ *     "/tmp/.ecore_service|[name]|[port]".
+ * @li If @a type is @c ECORE_CON_REMOTE_TCP, the function will
+ *     connect to the server at the TCP port "[name]:[port]".
+ *
+ * More information about the @p type can be found at @ref _Ecore_Con_Type.
+ *
+ * This function won't block. It will either succeed, or fail due to invalid
+ * parameters, failed memory allocation, etc., returning @c NULL on that case.
+ *
+ * However, even if this call returns a valid @ref Ecore_Con_Server, the
+ * connection will only be successfully completed if an event of type
+ * @ref ECORE_CON_EVENT_SERVER_ADD is received. If it fails to complete, an
+ * @ref ECORE_CON_EVENT_SERVER_DEL will be received.
+ *
+ * The @p data parameter can be fetched later using ecore_con_server_data_get()
+ * or changed with ecore_con_server_data_set().
+ */
+EAPI Ecore_Con_Server *ecore_con_server_connect(Ecore_Con_Type type,
+                                                const char *name, int port,
+                                                const void *data);
+/**
+ * Closes the connection and frees the given server.
+ *
+ * @param   svr The given server.
+ * @return  Data associated with the server when it was created.
+ *
+ * All the clients connected to this server will be disconnected.
+ *
+ * @see ecore_con_server_add, ecore_con_server_connect
+ */
+EAPI void *            ecore_con_server_del(Ecore_Con_Server *svr);
+
+/**
+ * Retrieves the data associated with the given server.
+ *
+ * @param   svr The given server.
+ * @return  The associated data.
+ *
+ * @see ecore_con_server_data_set()
+ */
+EAPI void *            ecore_con_server_data_get(Ecore_Con_Server *svr);
+/**
+ * Sets the data associated with the given server.
+ *
+ * @param svr The given server.
+ * @param data The data to associate with @p svr
+ * @return  The previously associated data, if any.
+ *
+ * @see ecore_con_server_data_get()
+ */
+EAPI void *            ecore_con_server_data_set(Ecore_Con_Server *svr,
+                                                 void *data);
+/**
+ * Retrieves whether the given server is currently connected.
+ *
+ * @param   svr The given server.
+ * @return @c EINA_TRUE if the server is connected, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool         ecore_con_server_connected_get(Ecore_Con_Server *svr);
+/**
+ * Retrieves the current list of clients.
+ *
+ * @param   svr The given server.
+ * @return  The list of clients on this server.
+ *
+ * Each node in the returned list points to an @ref Ecore_Con_Client. This list
+ * cannot be modified or freed. It can also change if new clients are connected
+ * or disconnected, and will become invalid when the server is deleted/freed.
+ */
+EAPI const Eina_List * ecore_con_server_clients_get(Ecore_Con_Server *svr);
+
+/**
+ * Retrieves the name of server.
+ *
+ * @param   svr The given server.
+ * @return  The name of the server.
+ *
+ * The name returned is the name used to connect on this server.
+ */
+EAPI const char *      ecore_con_server_name_get(Ecore_Con_Server *svr);
+
+/**
+ * Retrieves the server port in use.
+ *
+ * @param   svr The given server.
+ * @return  The server port in use.
+ *
+ * The port where the server is listening for connections.
+ */
+EAPI int               ecore_con_server_port_get(Ecore_Con_Server *svr);
+/**
+ * @brief Check how long a server has been connected
+ *
+ * @param svr The server to check
+ * @return The total time, in seconds, that the server has been
+ * connected/running
+ *
+ * This function is used to find out the time that has been elapsed since
+ * ecore_con_server_add() succeeded.
+ */
+EAPI double            ecore_con_server_uptime_get(Ecore_Con_Server *svr);
+/**
+ * Sends the given data to the given server.
+ *
+ * @param   svr  The given server.
+ * @param   data The given data.
+ * @param   size Length of the data, in bytes, to send.
+ * @return  The number of bytes sent.  @c 0 will be returned if there is an
+ *          error.
+ *
+ * This function will send the given data to the server as soon as the program
+ * is back to the main loop. Thus, this function returns immediately
+ * (non-blocking). If the data needs to be sent @b now, call
+ * ecore_con_server_flush() after this one.
+ *
+ * @see ecore_con_client_send()
+ * @see ecore_con_server_flush()
+ */
+EAPI int               ecore_con_server_send(Ecore_Con_Server *svr,
+                                             const void *data,
+                                             int size);
+/**
+ * Sets a limit on the number of clients that can be handled concurrently
+ * by the given server, and a policy on what to do if excess clients try to
+ * connect.
+ *
+ * @param   svr           The given server.
+ * @param   client_limit  The maximum number of clients to handle
+ *                        concurrently.  -1 means unlimited (default).  0
+ *                        effectively disables the server.
+ * @param   reject_excess_clients  Set to 1 to automatically disconnect
+ *                        excess clients as soon as they connect if you are
+ *                        already handling client_limit clients.  Set to 0
+ *                        (default) to just hold off on the "accept()"
+ *                        system call until the number of active clients
+ *                        drops. This causes the kernel to queue up to 4096
+ *                        connections (or your kernel's limit, whichever is
+ *                        lower).
+ *
+ * Beware that if you set this once ecore is already running, you may
+ * already have pending CLIENT_ADD events in your event queue.  Those
+ * clients have already connected and will not be affected by this call.
+ * Only clients subsequently trying to connect will be affected.
+ */
+EAPI void              ecore_con_server_client_limit_set(Ecore_Con_Server *svr,
+                                                         int client_limit,
+                                                         char reject_excess_clients);
+/**
+ * Gets the IP address of a server that has been connected to.
+ *
+ * @param   svr           The given server.
+ * @return  A pointer to an internal string that contains the IP address of
+ *          the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
+ *          This string should not be modified or trusted to stay valid after
+ *          deletion for the @p svr object. If no IP is known @c NULL is
+ *          returned.
+ */
+EAPI const char *      ecore_con_server_ip_get(Ecore_Con_Server *svr);
+/**
+ * Flushes all pending data to the given server.
+ *
+ * @param   svr           The given server.
+ *
+ * This function will block until all data is sent to the server.
+ *
+ * @see ecore_con_server_send()
+ * @see ecore_con_client_flush()
+ */
+EAPI void              ecore_con_server_flush(Ecore_Con_Server *svr);
+/**
+ * Set the default time after which an inactive client will be disconnected
+ *
+ * @param svr The server object
+ * @param timeout The timeout, in seconds, to disconnect after
+ *
+ * This function is used by the server to set the default idle timeout on
+ * clients. If the any of the clients becomes idle for a time higher than this
+ * value, it will be disconnected. A value of < 1 disables the idle timeout.
+ *
+ * This timeout is not affected by the one set by
+ * ecore_con_client_timeout_set(). A client will be disconnected whenever the
+ * client or the server timeout is reached. That means, the lower timeout value
+ * will be used for that client if ecore_con_client_timeout_set() is used on it.
+ *
+ * @see ecore_con_server_timeout_get()
+ * @see ecore_con_client_timeout_set()
+ */
+EAPI void              ecore_con_server_timeout_set(Ecore_Con_Server *svr, double timeout);
+/**
+ * Get the default time after which an inactive client will be disconnected
+ *
+ * @param svr The server object
+ * @return The timeout, in seconds, to disconnect after
+ *
+ * This function is used to get the idle timeout for clients.  A value of < 1
+ * means the idle timeout is disabled.
+ *
+ * @see ecore_con_server_timeout_set()
+ * @see ecore_con_client_timeout_get()
+ */
+EAPI double            ecore_con_server_timeout_get(Ecore_Con_Server *svr);
+
+/**
+ * Get the fd that the server is connected to
+ *
+ * @param svr The server object
+ * @return The fd, or -1 on failure
+ *
+ * This function returns the fd which is used by the underlying server connection.
+ * It should not be tampered with unless you REALLY know what you are doing.
+ * @note This function is only valid for servers created with ecore_con_server_connect()
+ * @warning Seriously. Don't use this unless you know what you are doing.
+ * @since 1.1
+ */
+EAPI int               ecore_con_server_fd_get(Ecore_Con_Server *svr);
+
+/**
+ * Get the fd that the client is connected to
+ *
+ * @param cl The client object
+ * @return The fd, or -1 on failure
+ *
+ * This function returns the fd which is used by the underlying client connection.
+ * It should not be tampered with unless you REALLY know what you are doing.
+ * @since 1.1
+ */
+EAPI int               ecore_con_client_fd_get(Ecore_Con_Client *cl);
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Con_Client_Group Ecore Connection Client Functions
+ *
+ * Functions to communicate with and/or set options on a client.
+ *
+ * This set of functions, as explained in @ref Ecore_Con_Server_Group, is used
+ * to send data to a client, or to set options and get information about this
+ * client. Most of them should be used on the server, applied on the client
+ * object.
+ *
+ * If you need to implement a client, the way to connect to a server is
+ * described in @ref Ecore_Con_Server_Group.
+ *
+ * An example of usage of these functions can be found at:
+ * @li @ref ecore_con_client_simple_example_c
+ *
+ * @{
+ */
+
+/**
+ * Sends the given data to the given client.
+ *
+ * @param   cl   The given client.
+ * @param   data The given data.
+ * @param   size Length of the data, in bytes, to send.
+ * @return  The number of bytes sent.  @c 0 will be returned if there is an
+ *          error.
+ *
+ * This function will send the given data to the client as soon as the program
+ * is back to the main loop. Thus, this function returns immediately
+ * (non-blocking). If the data needs to be sent @b now, call
+ * ecore_con_client_flush() after this one.
+ *
+ * @see ecore_con_server_send()
+ * @see ecore_con_client_flush()
+ */
+EAPI int               ecore_con_client_send(Ecore_Con_Client *cl,
+                                             const void *data,
+                                             int size);
+/**
+ * Retrieves the server representing the socket the client has
+ * connected to.
+ *
+ * @param   cl The given client.
+ * @return  The server that the client connected to.
+ */
+EAPI Ecore_Con_Server *ecore_con_client_server_get(Ecore_Con_Client *cl);
+/**
+ * Closes the connection and frees memory allocated to the given client.
+ *
+ * @param   cl The given client.
+ * @return  Data associated with the client.
+ */
+EAPI void *            ecore_con_client_del(Ecore_Con_Client *cl);
+/**
+ * Sets the data associated with the given client to @p data.
+ *
+ * @param   cl   The given client.
+ * @param   data What to set the data to.
+ */
+EAPI void              ecore_con_client_data_set(Ecore_Con_Client *cl,
+                                                 const void       *data);
+/**
+ * Retrieves the data associated with the given client.
+ *
+ * @param   cl The given client.
+ * @return  The data associated with @p cl.
+ */
+EAPI void *            ecore_con_client_data_get(Ecore_Con_Client *cl);
+
+/**
+ * Gets the IP address of a client that has connected.
+ *
+ * @param   cl            The given client.
+ * @return  A pointer to an internal string that contains the IP address of
+ *          the connected client in the form "XXX.YYY.ZZZ.AAA" IP notation.
+ *
+ * The returned string should not be modified, freed or trusted to stay valid
+ * after deletion for the @p cl object. If no IP is known @c NULL is returned.
+ */
+EAPI const char *      ecore_con_client_ip_get(Ecore_Con_Client *cl);
+/**
+ * Flushes all pending data to the given client.
+ *
+ * @param   cl            The given client.
+ *
+ * This function will block until all data is sent to the server.
+ *
+ * @see ecore_con_client_send()
+ * @see ecore_con_server_flush()
+ */
+EAPI void              ecore_con_client_flush(Ecore_Con_Client *cl);
+/**
+ * @brief Check how long a client has been connected
+ *
+ * @param cl The client to check
+ * @return The total time, in seconds, that the client has been connected to
+ * the server
+ *
+ * This function is used to find out how long a client has been connected for.
+ */
+EAPI double            ecore_con_client_uptime_get(Ecore_Con_Client *cl);
+/**
+ * Get the default time after which the client will be disconnected when
+ * inactive
+ *
+ * @param cl The client object
+ * @return The timeout, in seconds, to disconnect after
+ *
+ * This function is used to get the idle timeout for a client.  A value of < 1
+ * means the idle timeout is disabled.
+ *
+ * @see ecore_con_client_timeout_set()
+ */
+EAPI double            ecore_con_client_timeout_get(Ecore_Con_Client *cl);
+/**
+ * Set the time after which the client will be disconnected when inactive
+ *
+ * @param cl The client object
+ * @param timeout The timeout, in seconds, to disconnect after
+ *
+ * This function is used by the server to set the idle timeout on a specific
+ * client. If the client becomes idle for a time higher than this value, it will
+ * be disconnected. A value of < 1 disables the idle timeout.
+ *
+ * This timeout is not affected by the one set by
+ * ecore_con_server_timeout_set(). A client will be disconnected whenever the
+ * client or the server timeout is reached. That means, the lower timeout value
+ * will be used for that client if ecore_con_server_timeout_set() is used on the
+ * server.
+ *
+ * @see ecore_con_client_timeout_get()
+ * @see ecore_con_server_timeout_set()
+ */
+EAPI void              ecore_con_client_timeout_set(Ecore_Con_Client *cl, double timeout);
+/**
+ * Returns whether the client is still connected
+ *
+ * @param   cl The given client.
+ * @return @c EINA_TRUE if connected, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool         ecore_con_client_connected_get(Ecore_Con_Client *cl);
+/**
+ * @brief Return the port that the client has connected to
+ *
+ * @param cl The client
+ * @return The port that @p cl has connected to, or -1 on error
+ * Use this function to return the port on which a given client has connected.
+ */
+EAPI int               ecore_con_client_port_get(Ecore_Con_Client *cl);
+
+
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Con_Url_Group Ecore URL Connection Functions
+ *
+ * Utility functions that set up, use and shut down the Ecore URL
+ * Connection library.
+ *
+ * These functions are a shortcut to make it easy to perform http requests
+ * (POST, GET, etc).
+ *
+ * Brief usage:
+ * 1. Create an Ecore_Con_Url object with ecore_con_url_new(url);
+ * 2. Register to receive the #ECORE_CON_EVENT_URL_COMPLETE event
+ *    (and optionally the #ECORE_CON_EVENT_URL_DATA and
+ *    #ECORE_CON_EVENT_URL_PROGRESS event to receive
+ *    the response, e.g. for HTTP/FTP downloads)
+ * 3. Perform the operation with ecore_con_url_get(...);
+ *
+ * Note that it is good to reuse @ref Ecore_Con_Url objects wherever possible,
+ * but bear in mind that each one can only perform one operation at a time.  You
+ * need to wait for the #ECORE_CON_EVENT_URL_COMPLETE event before re-using or
+ * destroying the object.
+ *
+ * If it's necessary to change the @ref Ecore_Con_Url object url, use
+ * ecore_con_url_url_set().
+ *
+ * Simple Usage 1 (HTTP GET):
+ * @code
+ *   ecore_con_url_url_set(url_con, "http://www.google.com");
+ *   ecore_con_url_get(url_con);
+ * @endcode
+ *
+ * Simple usage 2 (HTTP POST):
+ * @code
+ *   ecore_con_url_url_set(url_con, "http://www.example.com/post_handler.cgi");
+ *   ecore_con_url_post(url_con, data, data_length, "multipart/form-data");
+ * @endcode
+ *
+ * Simple Usage 3 (FTP download):
+ * @code
+ *   fd = creat(filename, 0644)
+ *   ecore_con_url_url_set(url_con, "ftp://ftp.example.com/pub/myfile");
+ *   ecore_con_url_fd_set(url_con, fd);
+ *   ecore_con_url_get(url_con);
+ * @endcode
+ *
+ * Simple Usage 4 (FTP upload as ftp://ftp.example.com/file):
+ * @code
+ *   ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
+ *   ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass", NULL);
+ * @endcode
+ *
+ * Simple Usage 5 (FTP upload as ftp://ftp.example.com/dir/file):
+ * @code
+ *   ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
+ *   ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass","dir");
+ * @endcode
+ *
+ * These are complete examples for the API:
+ * @li @ref ecore_con_url_download_example.c "Downloading a file"
+ * @li @ref ecore_con_url_headers_example.c "Setting many options for the connection"
+ *
+ * @{
+ */
+
+/**
+ * @typedef Ecore_Con_Url_Time
+ * @enum _Ecore_Con_Url_Time
+ * The type of condition to use when making an HTTP request dependent on time,
+ * so that headers such as "If-Modified-Since" are used.
+ */
+typedef enum _Ecore_Con_Url_Time
+{
+   /**
+    * Do not place time restrictions on the HTTP requests.
+    */
+   ECORE_CON_URL_TIME_NONE = 0,
+   /**
+    * Add the "If-Modified-Since" HTTP header, so that the request is performed
+    * by the server only if the target has been modified since the time value
+    * passed to it in the request.
+    */
+   ECORE_CON_URL_TIME_IFMODSINCE,
+   /**
+    * Add the "If-Unmodified-Since" HTTP header, so that the request is
+    * performed by the server only if the target has NOT been modified since
+    * the time value passed to it in the request.
+    */
+   ECORE_CON_URL_TIME_IFUNMODSINCE
+} Ecore_Con_Url_Time;
+
+/**
+ * @typedef Ecore_Con_Url_Http_Version
+ * @enum _Ecore_Con_Url_Http_Version
+ * The http version to use
+ * @since 1.2
+ */
+typedef enum _Ecore_Con_Url_Http_Version
+{
+   /**
+    * HTTP version 1.0
+    * @since 1.2
+    */
+   ECORE_CON_URL_HTTP_VERSION_1_0,
+   /**
+    * HTTP version 1.1 (default)
+    * @since 1.2
+    */
+   ECORE_CON_URL_HTTP_VERSION_1_1
+} Ecore_Con_Url_Http_Version;
+
+/**
+ * Change the HTTP version used for the request
+ * @param url_con Connection object through which the request will be sent.
+ * @param version The version to be used
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure to change version.
+ * @since 1.2
+ * @see ecore_con_url_pipeline_get()
+ */
+EAPI Eina_Bool         ecore_con_url_http_version_set(Ecore_Con_Url *url_con, Ecore_Con_Url_Http_Version version);
+   
+/**
+ * Initialises the Ecore_Con_Url library.
+ * @return Number of times the library has been initialised without being
+ *          shut down.
+ *
+ * @note This function doesn't call ecore_con_init(). You still need to call it
+ * explicitly before calling this one.
+ */
+EAPI int               ecore_con_url_init(void);
+
+/**
+ * Shuts down the Ecore_Con_Url library.
+ * @return  Number of calls that still uses Ecore_Con_Url
+ *
+ * @note This function doesn't call ecore_con_shutdown(). You still need to call
+ * it explicitly after calling this one.
+ */
+EAPI int               ecore_con_url_shutdown(void);
+
+/**
+ * Enable or disable HTTP 1.1 pipelining.
+ * @param enable @c EINA_TRUE will turn it on, @c EINA_FALSE will disable it.
+ *
+ * Pipelining allows to send one request after another one, without having to
+ * wait for the reply of the first request. The respective replies are received
+ * in the order that the requests were sent.
+ *
+ * Enabling this feature will be valid for all requests done using @c
+ * ecore_con_url.
+ *
+ * See http://en.wikipedia.org/wiki/HTTP_pipelining for more info.
+ *
+ * @see ecore_con_url_pipeline_get()
+ */
+EAPI void              ecore_con_url_pipeline_set(Eina_Bool enable);
+/**
+ * Is HTTP 1.1 pipelining enable ?
+ * @return @c EINA_TRUE if it is enable.
+ *
+ * @see ecore_con_url_pipeline_set()
+ */
+EAPI Eina_Bool         ecore_con_url_pipeline_get(void);
+
+/**
+ * Creates and initializes a new Ecore_Con_Url connection object.
+ *
+ * @param url URL that will receive requests. Can be changed using
+ *            ecore_con_url_url_set.
+ *
+ * @return @c NULL on error, a new Ecore_Con_Url on success.
+ *
+ * Creates and initializes a new Ecore_Con_Url connection object that can be
+ * used for sending requests.
+ *
+ * @see ecore_con_url_custom_new()
+ * @see ecore_con_url_url_set()
+ */
+EAPI Ecore_Con_Url *   ecore_con_url_new(const char *url);
+/**
+ * Creates a custom connection object.
+ *
+ * @param url URL that will receive requests
+ * @param custom_request Custom request (e.g. GET, POST, HEAD, PUT, etc)
+ *
+ * @return @c NULL on error, a new Ecore_Con_Url on success.
+ *
+ * Creates and initializes a new Ecore_Con_Url for a custom request (e.g. HEAD,
+ * SUBSCRIBE and other obscure HTTP requests). This object should be used like
+ * one created with ecore_con_url_new().
+ *
+ * @see ecore_con_url_new()
+ * @see ecore_con_url_url_set()
+ */
+EAPI Ecore_Con_Url *   ecore_con_url_custom_new(const char *url,
+                                                const char *custom_request);
+/**
+ * Destroys a Ecore_Con_Url connection object.
+ *
+ * @param url_con Connection object to free.
+ *
+ * @see ecore_con_url_new()
+ */
+EAPI void              ecore_con_url_free(Ecore_Con_Url *url_con);
+/**
+ * Sets the URL to send the request to.
+ *
+ * @param url_con Connection object through which the request will be sent.
+ * @param url URL that will receive the request
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on error.
+ */
+EAPI Eina_Bool         ecore_con_url_url_set(Ecore_Con_Url *url_con,
+                                             const char *url);
+/**
+ * Gets the URL to send the request to.
+ *
+ * @param url_con Connection object through which the request will be sent.
+ * @return URL that will receive the request, @c NULL on failure. URL is
+ * stringshared.
+ * @since 1.1
+ */
+EAPI const char       *ecore_con_url_url_get(Ecore_Con_Url *url_con);
+/**
+ * Associates data with a connection object.
+ *
+ * @param url_con Connection object to associate data.
+ * @param data Data to be set.
+ *
+ * Associates data with a connection object, which can be retrieved later with
+ * ecore_con_url_data_get()).
+ *
+ * @see ecore_con_url_data_get()
+ */
+EAPI void              ecore_con_url_data_set(Ecore_Con_Url *url_con,
+                                              void *data);
+/**
+ * Retrieves data associated with a Ecore_Con_Url connection object.
+ *
+ * @param url_con Connection object to retrieve data from.
+ *
+ * @return Data associated with the given object.
+ *
+ * Retrieves data associated with a Ecore_Con_Url connection object (previously
+ * set with ecore_con_url_data_set()).
+ *
+ * @see ecore_con_url_data_set()
+ */
+EAPI void *            ecore_con_url_data_get(Ecore_Con_Url *url_con);
+/**
+ * Adds an additional header to the request connection object.
+ *
+ * @param url_con Connection object
+ * @param key Header key
+ * @param value Header value
+ *
+ * Adds an additional header (User-Agent, Content-Type, etc.) to the request
+ * connection object. This addition will be valid for only one
+ * ecore_con_url_get() or ecore_con_url_post() call.
+ *
+ * Some functions like ecore_con_url_time() also add headers to the request.
+ *
+ * @see ecore_con_url_get()
+ * @see ecore_con_url_post()
+ * @see ecore_con_url_additional_headers_clear()
+ */
+EAPI void              ecore_con_url_additional_header_add(Ecore_Con_Url *url_con,
+                                                           const char *key,
+                                                           const char *value);
+/**
+ * Cleans additional headers.
+ *
+ * @param url_con Connection object to clean additional headers.
+ *
+ * Cleans additional headers associated with a connection object (previously
+ * added with ecore_con_url_additional_header_add()).
+ *
+ * @see ecore_con_url_additional_header_add()
+ * @see ecore_con_url_get()
+ * @see ecore_con_url_post()
+ */
+EAPI void              ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con);
+/**
+ * Retrieves headers from last request sent.
+ *
+ * @param url_con Connection object to retrieve response headers from.
+ *
+ * Retrieves a list containing the response headers. This function should be
+ * used after an ECORE_CON_EVENT_URL_COMPLETE event (headers should normally be
+ * ready at that time).
+ *
+ * @return List of response headers. This list must not be modified by the user.
+ */
+EAPI const Eina_List * ecore_con_url_response_headers_get(Ecore_Con_Url *url_con);
+/**
+ * Setup a file for receiving response data.
+ *
+ * @param url_con Connection object to set file
+ * @param fd File descriptor associated with the file. A negative value will
+ * unset any previously set fd.
+ *
+ * Sets up a file to have response data written into. Note that
+ * ECORE_CON_EVENT_URL_DATA events will not be emitted if a file has been set to
+ * receive the response data.
+ *
+ * This call can be used to easily setup a file where the downloaded data will
+ * be saved.
+ */
+EAPI void              ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd);
+/**
+ * Retrieves the number of bytes received.
+ *
+ * Retrieves the number of bytes received on the last request of the given
+ * connection object.
+ *
+ * @param url_con Connection object which the request was sent on.
+ *
+ * @return Number of bytes received on request.
+ *
+ * @see ecore_con_url_get()
+ * @see ecore_con_url_post()
+ */
+EAPI int               ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con);
+/**
+ * Sets url_con to use http auth, with given username and password, "safely" or not.
+ *
+ * @param url_con Connection object to perform a request on, previously created
+ *    with ecore_con_url_new() or ecore_con_url_custom_new().
+ * @param username Username to use in authentication
+ * @param password Password to use in authentication
+ * @param safe Whether to use "safer" methods (eg, NOT http basic auth)
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on error.
+ *
+ * @attention Requires libcurl >= 7.19.1 to work, otherwise will always return
+ * @c 0.
+ */
+EAPI Eina_Bool         ecore_con_url_httpauth_set(Ecore_Con_Url *url_con,
+                                                  const char *username,
+                                                  const char *password,
+                                                  Eina_Bool safe);
+/**
+ * Sends a get request.
+ *
+ * @param url_con Connection object to perform a request on, previously created
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on error.
+ *
+ * The request is performed immediately, but you need to setup event handlers
+ * for #ECORE_CON_EVENT_URL_DATA, #ECORE_CON_EVENT_URL_COMPLETE or
+ * #ECORE_CON_EVENT_URL_PROGRESS to get more information about its result.
+ *
+ * @see ecore_con_url_custom_new()
+ * @see ecore_con_url_additional_headers_clear()
+ * @see ecore_con_url_additional_header_add()
+ * @see ecore_con_url_data_set()
+ * @see ecore_con_url_data_get()
+ * @see ecore_con_url_response_headers_get()
+ * @see ecore_con_url_time()
+ * @see ecore_con_url_post()
+ */
+EAPI Eina_Bool         ecore_con_url_get(Ecore_Con_Url *url_con);
+/**
+ * Sends a post request.
+ *
+ * @param url_con Connection object to perform a request on, previously created
+ *                with ecore_con_url_new() or ecore_con_url_custom_new().
+ * @param data    Payload (data sent on the request). Can be @c NULL.
+ * @param length  Payload length. If @c -1, rely on automatic length
+ *                calculation via @c strlen() on @p data.
+ * @param content_type Content type of the payload (e.g. text/xml). Can be @c
+ * NULL.
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on error.
+ *
+ * The request starts immediately, but you need to setup event handlers
+ * for #ECORE_CON_EVENT_URL_DATA, #ECORE_CON_EVENT_URL_COMPLETE or
+ * #ECORE_CON_EVENT_URL_PROGRESS to get more information about its result.
+ *
+ * This call won't block your main loop.
+ *
+ * @see ecore_con_url_custom_new()
+ * @see ecore_con_url_additional_headers_clear()
+ * @see ecore_con_url_additional_header_add()
+ * @see ecore_con_url_data_set()
+ * @see ecore_con_url_data_get()
+ * @see ecore_con_url_response_headers_get()
+ * @see ecore_con_url_time()
+ * @see ecore_con_url_get()
+ */
+EAPI Eina_Bool         ecore_con_url_post(Ecore_Con_Url *url_con,
+                                          const void *data, long length,
+                                          const char *content_type);
+/**
+ * Sets whether HTTP requests should be conditional, dependent on
+ * modification time.
+ *
+ * @param url_con   Ecore_Con_Url to act upon.
+ * @param time_condition Condition to use for HTTP requests.
+ * @param timestamp Time since 1 Jan 1970 to use in the condition.
+ *
+ * This function may set the header "If-Modified-Since" or
+ * "If-Unmodified-Since", depending on the value of @p time_condition, with the
+ * value @p timestamp.
+ *
+ * @sa ecore_con_url_get()
+ * @sa ecore_con_url_post()
+ */
+EAPI void              ecore_con_url_time(Ecore_Con_Url *url_con,
+                                          Ecore_Con_Url_Time time_condition,
+                                          double timestamp);
+
+/**
+ * @brief Uploads a file to an ftp site.
+ *
+ * @param url_con The Ecore_Con_Url object to send with
+ * @param filename The path to the file to send
+ * @param user The username to log in with
+ * @param pass The password to log in with
+ * @param upload_dir The directory to which the file should be uploaded
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * Upload @p filename to an ftp server set in @p url_con using @p user
+ * and @p pass to directory @p upload_dir
+ */
+EAPI Eina_Bool         ecore_con_url_ftp_upload(Ecore_Con_Url *url_con,
+                                                const char *filename,
+                                                const char *user,
+                                                const char *pass,
+                                                const char *upload_dir);
+/**
+ * Toggle libcurl's verbose output.
+ *
+ * @param url_con Ecore_Con_Url instance which will be acted upon.
+ * @param verbose Whether or not to enable libcurl's verbose output.
+ *
+ * If @p verbose is @c EINA_TRUE, libcurl will output a lot of verbose
+ * information about its operations, which is useful for
+ * debugging. The verbose information will be sent to stderr.
+ */
+EAPI void              ecore_con_url_verbose_set(Ecore_Con_Url *url_con,
+                                                 Eina_Bool verbose);
+/**
+ * Enable or disable EPSV extension
+ * @param url_con  The Ecore_Con_Url instance which will be acted upon.
+ * @param use_epsv Boolean to enable/disable the EPSV extension.
+ */
+EAPI void              ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con,
+                                                      Eina_Bool use_epsv);
+
+/**
+ * Enables the cookie engine for subsequent HTTP requests.
+ *
+ * @param url_con Ecore_Con_Url instance which will be acted upon.
+ *
+ * After this function is called, cookies set by the server in HTTP responses
+ * will be parsed and stored, as well as sent back to the server in new HTTP
+ * requests.
+ *
+ * @note Even though this function is called @c ecore_con_url_cookies_init(),
+ * there is no symmetrical shutdown operation.
+ */
+EAPI void              ecore_con_url_cookies_init(Ecore_Con_Url *url_con);
+/**
+ * Controls whether session cookies from previous sessions shall be loaded.
+ *
+ * @param url_con Ecore_Con_Url instance which will be acted upon.
+ * @param ignore  If @c EINA_TRUE, ignore session cookies when loading cookies
+ *                from files. If @c EINA_FALSE, all cookies will be loaded.
+ *
+ * Session cookies are cookies with no expire date set, which usually means
+ * they are removed after the current session is closed.
+ *
+ * By default, when Ecore_Con_Url loads cookies from a file, all cookies are
+ * loaded, including session cookies, which, most of the time, were supposed
+ * to be loaded and valid only for that session.
+ *
+ * If @p ignore is set to @c EINA_TRUE, when Ecore_Con_Url loads cookies from
+ * the files passed to @c ecore_con_url_cookies_file_add(), session cookies
+ * will not be loaded.
+ *
+ * @see ecore_con_url_cookies_file_add()
+ */
+EAPI void              ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_con,
+                                                                    Eina_Bool ignore);
+/**
+ * Clears currently loaded cookies.
+ * @param url_con      Ecore_Con_Url instance which will be acted upon.
+ *
+ * The cleared cookies are removed and will not be sent in subsequent HTTP
+ * requests, nor will they be written to the cookiejar file set via
+ * @c ecore_con_url_cookies_jar_file_set().
+ *
+ * @note This function will initialize the cookie engine if it has not been
+ *       initialized yet.
+ * @note The cookie files set by ecore_con_url_cookies_file_add() aren't loaded
+ *       immediately, just when the request is started. Thus, if you ask to
+ *       clear the cookies, but has a file already set by that function, the
+ *       cookies will then be loaded and you will have old cookies set. In order
+ *       to don't have any old cookie set, you need to don't call
+ *       ecore_con_url_cookies_file_add() ever on the @p url_con handler, and
+ *       call this function to clear any cookie set by a previous request on
+ *       this handler.
+ *
+ * @see ecore_con_url_cookies_session_clear()
+ * @see ecore_con_url_cookies_ignore_old_session_set()
+ */
+EAPI void              ecore_con_url_cookies_clear(Ecore_Con_Url *url_con);
+/**
+ * Clears currently loaded session cookies.
+ *
+ * @param url_con      Ecore_Con_Url instance which will be acted upon.
+ *
+ * Session cookies are cookies with no expire date set, which usually means
+ * they are removed after the current session is closed.
+ *
+ * The cleared cookies are removed and will not be sent in subsequent HTTP
+ * requests, nor will they be written to the cookiejar file set via
+ * @c ecore_con_url_cookies_jar_file_set().
+ *
+ * @note This function will initialize the cookie engine if it has not been
+ *       initialized yet.
+ * @note The cookie files set by ecore_con_url_cookies_file_add() aren't loaded
+ *       immediately, just when the request is started. Thus, if you ask to
+ *       clear the session cookies, but has a file already set by that function,
+ *       the session cookies will then be loaded and you will have old cookies
+ *       set.  In order to don't have any old session cookie set, you need to
+ *       don't call ecore_con_url_cookies_file_add() ever on the @p url_con
+ *       handler, and call this function to clear any session cookie set by a
+ *       previous request on this handler. An easier way to don't use old
+ *       session cookies is by using the function
+ *       ecore_con_url_cookies_ignore_old_session_set().
+ *
+ * @see ecore_con_url_cookies_clear()
+ * @see ecore_con_url_cookies_ignore_old_session_set()
+ */
+EAPI void              ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_con);
+/**
+ * Adds a file to the list of files from which to load cookies.
+ *
+ * @param url_con   Ecore_Con_Url instance which will be acted upon.
+ * @param file_name Name of the file that will be added to the list.
+ *
+ * Files must contain cookies defined according to two possible formats:
+ *
+ * @li HTTP-style header ("Set-Cookie: ...").
+ * @li <a href="http://www.cookiecentral.com/faq/#3.5">Netscape/Mozilla cookie data format.</a>
+ *
+ * Cookies will only be @b read from this file. If you want to save cookies to a
+ * file, use ecore_con_url_cookies_jar_file_set(). Also notice that this
+ * function supports the both types of cookie file cited above, while
+ * ecore_con_url_cookies_jar_file_set() will save only in the Netscape/Mozilla's
+ * format.
+ *
+ * Please notice that the file will not be read immediately, but rather added
+ * to a list of files that will be loaded and parsed at a later time.
+ *
+ * @note This function will initialize the cookie engine if it has not been
+ *       initialized yet.
+ *
+ * @see ecore_con_url_cookies_ignore_old_session_set()
+ * @see ecore_con_url_cookies_jar_file_set()
+ */
+EAPI void              ecore_con_url_cookies_file_add(Ecore_Con_Url *url_con,
+                                                      const char * const file_name);
+/**
+ * Sets the name of the file to which all current cookies will be written when
+ * either cookies are flushed or Ecore_Con is shut down.
+ *
+ * @param url_con        Ecore_Con_Url instance which will be acted upon.
+ * @param cookiejar_file File to which the cookies will be written.
+ *
+ * @return @c EINA_TRUE is the file name has been set successfully,
+ *         @c EINA_FALSE otherwise.
+ *
+ * Cookies are written following Netscape/Mozilla's data format, also known as
+ * cookie-jar.
+ *
+ * Cookies will only be @b saved to this file. If you need to read cookies from
+ * a file, use ecore_con_url_cookies_file_add() instead.
+ *
+ * @note This function will initialize the cookie engine if it has not been
+ *       initialized yet.
+ *
+ * @see ecore_con_url_cookies_jar_write()
+ */
+EAPI Eina_Bool         ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con,
+                                                          const char * const cookiejar_file);
+/**
+ * Writes all current cookies to the cookie jar immediately.
+ *
+ * @param url_con Ecore_Con_Url instance which will be acted upon.
+ *
+ * A cookie-jar file must have been previously set by
+ * @c ecore_con_url_jar_file_set, otherwise nothing will be done.
+ *
+ * @note This function will initialize the cookie engine if it has not been
+ *       initialized yet.
+ *
+ * @see ecore_con_url_cookies_jar_file_set()
+ */
+EAPI void              ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_con);
+
+EAPI void              ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con,
+                                                         Eina_Bool verify);
+EAPI int               ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con,
+                                                const char *ca_path);
+
+/**
+ * Set HTTP proxy to use.
+ *
+ * The parameter should be a char * to a zero terminated string holding
+ * the host name or dotted IP address. To specify port number in this string,
+ * append :[port] to the end of the host name.
+ * The proxy string may be prefixed with [protocol]:// since any such prefix
+ * will be ignored.
+ * The proxy's port number may optionally be specified with the separate option.
+ * If not specified, libcurl will default to using port 1080 for proxies.
+ *
+ * @param url_con Connection object that will use the proxy.
+ * @param proxy Porxy string or @c NULL to disable
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on error.
+ * @since 1.2
+ */
+EAPI Eina_Bool ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy);
+
+/**
+ * Set zero terminated username to use for proxy.
+ *
+ * if socks protocol is used for proxy, protocol should be socks5 and above.
+ *
+ * @param url_con Connection object that will use the proxy.
+ * @param username Username string.
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on error.
+ *
+ * @see ecore_con_url_proxy_set()
+ *
+ * @since 1.2
+ */
+EAPI Eina_Bool ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username);
+
+/**
+ * Set zero terminated password to use for proxy.
+ *
+ * if socks protocol is used for proxy, protocol should be socks5 and above.
+ *
+ * @param url_con Connection object that will use the proxy.
+ * @param password Password string.
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on error.
+ *
+ * @see ecore_con_url_proxy_set()
+ *
+ * @since 1.2
+ */
+EAPI Eina_Bool ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password);
+
+/**
+ * Set timeout in seconds.
+ *
+ * the maximum time in seconds that you allow the ecore con url transfer
+ * operation to take. Normally, name lookups can take a considerable time
+ * and limiting operations to less than a few minutes risk aborting perfectly
+ * normal operations.
+ *
+ * @param url_con Connection object that will use the timeout.
+ * @param timeout time in seconds.
+ *
+ * @see ecore_con_url_cookies_jar_file_set()
+ *
+ * @since 1.2
+ */
+EAPI void ecore_con_url_timeout_set(Ecore_Con_Url *url_con, double timeout);
+
+/**
+ * Get the returned HTTP STATUS code
+ *
+ * This is used to, at any time, try to return the status code for a transmission.
+ * @param url_con Connection object
+ * @return A valid HTTP STATUS code, or 0 on failure
+ *
+ * @since 1.2
+ */
+EAPI int ecore_con_url_status_code_get(Ecore_Con_Url *url_con);
+/**
+ * @}
+ */
 
 #ifdef __cplusplus
 }
diff --git a/src/lib/ecore_con/Ecore_Con_Eet.h b/src/lib/ecore_con/Ecore_Con_Eet.h
new file mode 100644 (file)
index 0000000..bdf0d2d
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef _ECORE_CON_EET
+# define _ECORE_CON_EET
+
+#include <Eet.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_ECORE_CON_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI __declspec(dllimport)
+# endif
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif
+
+typedef struct _Ecore_Con_Eet Ecore_Con_Eet;
+typedef struct _Ecore_Con_Reply Ecore_Con_Reply;
+
+typedef void (*Ecore_Con_Eet_Data_Cb)(void *data, Ecore_Con_Reply *reply, const char *protocol_name, void *value);
+typedef void (*Ecore_Con_Eet_Raw_Data_Cb)(void *data, Ecore_Con_Reply *reply, const char *protocol_name, const char *section, void *value, size_t length);
+typedef Eina_Bool (*Ecore_Con_Eet_Client_Cb)(void *data, Ecore_Con_Reply *reply, Ecore_Con_Client *conn);
+typedef Eina_Bool (*Ecore_Con_Eet_Server_Cb)(void *data, Ecore_Con_Reply *reply, Ecore_Con_Server *conn);
+
+EAPI Ecore_Con_Eet *ecore_con_eet_server_new(Ecore_Con_Server *server);
+EAPI Ecore_Con_Eet *ecore_con_eet_client_new(Ecore_Con_Server *server);
+EAPI void ecore_con_eet_server_free(Ecore_Con_Eet *ece);
+
+EAPI void ecore_con_eet_register(Ecore_Con_Eet *ece, const char *name, Eet_Data_Descriptor *edd);
+
+EAPI void ecore_con_eet_data_callback_add(Ecore_Con_Eet *ece, const char *name, Ecore_Con_Eet_Data_Cb func, const void *data);
+EAPI void ecore_con_eet_data_callback_del(Ecore_Con_Eet *ece, const char *name);
+
+EAPI void ecore_con_eet_raw_data_callback_add(Ecore_Con_Eet *ece, const char *name, Ecore_Con_Eet_Raw_Data_Cb func, const void *data);
+EAPI void ecore_con_eet_raw_data_callback_del(Ecore_Con_Eet *ece, const char *name);
+
+EAPI void ecore_con_eet_client_connect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data);
+EAPI void ecore_con_eet_client_connect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data);
+
+EAPI void ecore_con_eet_client_disconnect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data);
+EAPI void ecore_con_eet_client_disconnect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data);
+
+EAPI void ecore_con_eet_server_connect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data);
+EAPI void ecore_con_eet_server_connect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data);
+
+EAPI void ecore_con_eet_server_disconnect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data);
+EAPI void ecore_con_eet_server_disconnect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data);
+
+EAPI void ecore_con_eet_data_set(Ecore_Con_Eet *ece, const void *data);
+EAPI void *ecore_con_eet_data_get(Ecore_Con_Eet *ece);
+
+EAPI Ecore_Con_Eet *ecore_con_eet_reply(Ecore_Con_Reply *reply);
+EAPI void ecore_con_eet_send(Ecore_Con_Reply *reply, const char *protocol_name, void *value);
+EAPI void ecore_con_eet_raw_send(Ecore_Con_Reply *reply, const char *protocol_name, const char *section, void *value, unsigned int length);
+
+#endif
index aa2e9b8..ce656f7 100644 (file)
@@ -5,33 +5,55 @@ AM_CPPFLAGS = \
 -I$(top_builddir)/src/lib/ecore_con \
 -I$(top_srcdir)/src/lib/ecore \
 -I$(top_srcdir)/src/lib/ecore_con \
-@SSL_CFLAGS@ @CURL_CFLAGS@
-
-if BUILD_ECORE_CON
+@EFL_ECORE_CON_BUILD@ \
+@SSL_CFLAGS@ \
+@CURL_CFLAGS@ \
+@EVIL_CFLAGS@ \
+@EINA_CFLAGS@ \
+@TLS_CFLAGS@ \
+@CARES_CFLAGS@ \
+@EET_CFLAGS@ \
+@WIN32_CPPFLAGS@
 
 lib_LTLIBRARIES = libecore_con.la
-include_HEADERS = \
-Ecore_Con.h
+includes_HEADERS = Ecore_Con.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_con_la_SOURCES = \
 ecore_con.c \
-ecore_con_dns.c \
+ecore_con_socks.c \
+ecore_con_ssl.c \
 ecore_con_url.c \
-ecore_con_private.h
+ecore_con_alloc.c
 
-libecore_con_la_LIBADD = \
-$(top_builddir)/src/lib/ecore/libecore.la \
-@SSL_LIBS@ @CURL_LIBS@
+libecore_con_la_CFLAGS = @WIN32_CFLAGS@
 
-libecore_con_la_LDFLAGS = -version-info @version_info@
+if ECORE_HAVE_WIN32
+libecore_con_la_SOURCES += ecore_con_local_win32.c
+else
+libecore_con_la_SOURCES += ecore_con_local.c
+endif
 
-libecore_con_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la
+if HAVE_CARES
+libecore_con_la_SOURCES += ecore_con_ares.c
+else
+if HAVE_IPV6
+libecore_con_la_CFLAGS += @ECORE_CON_CFLAGS@
+libecore_con_la_SOURCES += ecore_con_dns.c dns.c dns.h
+else
+libecore_con_la_SOURCES += ecore_con_info.c
+endif
+endif
 
+if ECORE_HAVE_EET
+libecore_con_la_SOURCES += ecore_con_eet.c
+includes_HEADERS += Ecore_Con_Eet.h
 endif
 
-EXTRA_DIST = \
-ecore_con.c \
-ecore_con_dns.c \
-ecore_con_url.c \
-ecore_con_private.h
+libecore_con_la_LIBADD = \
+$(top_builddir)/src/lib/ecore/libecore.la \
+@SSL_LIBS@ @CURL_LIBS@ @EINA_LIBS@ @EVIL_LIBS@ @TLS_LIBS@ @CARES_LIBS@ @WIN32_LIBS@ @EET_LIBS@
+
+libecore_con_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
+
+EXTRA_DIST = ecore_con_private.h
diff --git a/src/lib/ecore_con/dns.c b/src/lib/ecore_con/dns.c
new file mode 100644 (file)
index 0000000..b92a315
--- /dev/null
@@ -0,0 +1,7878 @@
+/* ==========================================================================
+ * dns.c - Recursive, Reentrant DNS Resolver.
+ * --------------------------------------------------------------------------
+ * Copyright (c) 2008, 2009, 2010  William Ahern
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to permit
+ * persons to whom the Software is furnished to do so, subject to the
+ * following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ==========================================================================
+ */
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if !defined(__FreeBSD__)
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE  600
+#endif
+
+#undef _BSD_SOURCE
+#define _BSD_SOURCE
+
+#undef _DARWIN_C_SOURCE
+#define _DARWIN_C_SOURCE
+
+#undef _NETBSD_SOURCE
+#define _NETBSD_SOURCE
+#endif
+
+#include <stddef.h>            /* offsetof() */
+#include <stdint.h>            /* uint32_t */
+#include <stdlib.h>            /* malloc(3) realloc(3) free(3) rand(3) random(3) arc4random(3) */
+#include <stdio.h>             /* FILE fopen(3) fclose(3) getc(3) rewind(3) */
+
+#include <string.h>            /* memcpy(3) strlen(3) memmove(3) memchr(3) memcmp(3) strchr(3) strsep(3) strcspn(3) */
+#include <strings.h>           /* strcasecmp(3) strncasecmp(3) */
+
+#include <ctype.h>             /* isspace(3) isdigit(3) */
+
+#include <time.h>              /* time_t time(2) */
+
+#include <signal.h>            /* sig_atomic_t */
+
+#include <errno.h>             /* errno EINVAL ENOENT */
+
+#undef NDEBUG
+#include <assert.h>            /* assert(3) */
+
+#if _WIN32
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <sys/types.h>         /* FD_SETSIZE socklen_t */
+#include <sys/select.h>                /* FD_ZERO FD_SET fd_set select(2) */
+#include <sys/socket.h>                /* AF_INET AF_INET6 AF_UNIX struct sockaddr struct sockaddr_in struct sockaddr_in6 socket(2) */
+
+#if defined(AF_UNIX)
+#include <sys/un.h>            /* struct sockaddr_un */
+#endif
+
+#include <fcntl.h>             /* F_SETFD F_GETFL F_SETFL O_NONBLOCK fcntl(2) */
+
+#include <unistd.h>            /* gethostname(3) close(2) */
+
+#include <poll.h>              /* POLLIN POLLOUT */
+
+#include <netinet/in.h>                /* struct sockaddr_in struct sockaddr_in6 */
+
+#include <arpa/inet.h>         /* inet_pton(3) inet_ntop(3) htons(3) ntohs(3) */
+
+#include <netdb.h>             /* struct addrinfo */
+#endif
+
+#include "dns.h"
+
+
+/*
+ * S T A N D A R D  M A C R O S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef MIN
+#define MIN(a, b)      (((a) < (b))? (a) : (b))
+#endif
+
+
+#ifndef MAX
+#define MAX(a, b)      (((a) > (b))? (a) : (b))
+#endif
+
+
+#ifndef lengthof
+#define lengthof(a)    (sizeof (a) / sizeof (a)[0])
+#endif
+
+#ifndef endof
+#define endof(a)       (&(a)[lengthof((a))])
+#endif
+
+
+/*
+ * D E B U G  M A C R O S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+int dns_debug = 0;
+
+#if DNS_DEBUG
+
+#undef DNS_DEBUG
+#define DNS_DEBUG dns_debug
+
+#define DNS_SAY_(fmt, ...) \
+       do { if (DNS_DEBUG > 0) fprintf(stderr, fmt "%.1s", __func__, __LINE__, __VA_ARGS__); } while (0)
+#define DNS_SAY(...) DNS_SAY_("@@ (%s:%d) " __VA_ARGS__, "\n")
+#define DNS_HAI DNS_SAY("HAI")
+
+#define DNS_SHOW_(P, fmt, ...) do {                                    \
+       if (DNS_DEBUG > 1) {                                            \
+       fprintf(stderr, "@@ BEGIN * * * * * * * * * * * *\n");          \
+       fprintf(stderr, "@@ " fmt "%.0s\n", __VA_ARGS__);               \
+       dns_p_dump((P), stderr);                                        \
+       fprintf(stderr, "@@ END * * * * * * * * * * * * *\n\n");        \
+       }                                                               \
+} while (0)
+
+#define DNS_SHOW(...)  DNS_SHOW_(__VA_ARGS__, "")
+
+#else /* !DNS_DEBUG */
+
+#undef DNS_DEBUG
+#define DNS_DEBUG 0
+
+#define DNS_SAY(...)
+#define DNS_HAI
+#define DNS_SHOW(...)
+
+#endif /* DNS_DEBUG */
+
+
+/*
+ * V E R S I O N  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+const char *dns_vendor(void) {
+       return DNS_VENDOR;
+} /* dns_vendor() */
+
+
+int dns_v_rel(void) {
+       return DNS_V_REL;
+} /* dns_v_rel() */
+
+
+int dns_v_abi(void) {
+       return DNS_V_ABI;
+} /* dns_v_abi() */
+
+
+int dns_v_api(void) {
+       return DNS_V_API;
+} /* dns_v_api() */
+
+
+/*
+ * E R R O R  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#if _WIN32
+
+#define DNS_EINTR      WSAEINTR
+#define DNS_EINPROGRESS        WSAEINPROGRESS
+#define DNS_EISCONN    WSAEISCONN
+#define DNS_EWOULDBLOCK        WSAEWOULDBLOCK
+#define DNS_EALREADY   WSAEALREADY
+#define DNS_EAGAIN     EAGAIN
+#define DNS_ETIMEDOUT  WSAETIMEDOUT
+
+#define dns_syerr()    ((int)GetLastError())
+#define dns_soerr()    ((int)WSAGetLastError())
+
+#else
+
+#define DNS_EINTR      EINTR
+#define DNS_EINPROGRESS        EINPROGRESS
+#define DNS_EISCONN    EISCONN
+#define DNS_EWOULDBLOCK        EWOULDBLOCK
+#define DNS_EALREADY   EALREADY
+#define DNS_EAGAIN     EAGAIN
+#define DNS_ETIMEDOUT  ETIMEDOUT
+
+#define dns_syerr()    errno
+#define dns_soerr()    errno
+
+#endif
+
+
+const char *dns_strerror(int error) {
+       switch (error) {
+       case DNS_ENOBUFS:
+               return "DNS packet buffer too small";
+       case DNS_EILLEGAL:
+               return "Illegal DNS RR name or data";
+       case DNS_EORDER:
+               return "Attempt to push RR out of section order";
+       case DNS_ESECTION:
+               return "Invalid section specified";
+       case DNS_EUNKNOWN:
+               return "Unknown DNS error";
+       default:
+               return strerror(error);
+       } /* switch() */
+} /* dns_strerror() */
+
+
+/*
+ * A T O M I C  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+static unsigned dns_atomic_inc(dns_atomic_t *i) {
+       return (*i)++;
+} /* dns_atomic_inc() */
+
+
+static unsigned dns_atomic_dec(dns_atomic_t *i) {
+       return (*i)--;
+} /* dns_atomic_dec() */
+
+
+/*
+ * C R Y P T O  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * P R N G 
+ */
+
+#ifndef DNS_RANDOM
+#if defined(HAVE_ARC4RANDOM)   \
+ || defined(__OpenBSD__)       \
+ || defined(__FreeBSD__)       \
+ || defined(__NetBSD__)                \
+ || defined(__APPLE__)
+#define DNS_RANDOM     arc4random
+#elif __linux
+#define DNS_RANDOM     random
+#else
+#define DNS_RANDOM     rand
+#endif
+#endif
+
+#define DNS_RANDOM_arc4random  1
+#define DNS_RANDOM_random      2
+#define DNS_RANDOM_rand                3
+#define DNS_RANDOM_RAND_bytes  4
+
+#define DNS_RANDOM_OPENSSL     (DNS_RANDOM_RAND_bytes == DNS_PP_XPASTE(DNS_RANDOM_, DNS_RANDOM))
+
+#if DNS_RANDOM_OPENSSL
+#include <openssl/rand.h>
+#endif
+
+static unsigned dns_random_(void) {
+#if DNS_RANDOM_OPENSSL
+       unsigned r;
+
+       assert(1 == RAND_bytes((unsigned char *)&r, sizeof r));
+
+       return r;
+#else
+       return DNS_RANDOM();
+#endif
+} /* dns_random_() */
+
+unsigned (*dns_random)(void) __attribute__((weak))     = &dns_random_;
+
+
+/*
+ * P E R M U T A T I O N  G E N E R A T O R
+ */
+
+#define DNS_K_TEA_KEY_SIZE     16
+#define DNS_K_TEA_BLOCK_SIZE   8
+#define DNS_K_TEA_CYCLES       32
+#define DNS_K_TEA_MAGIC                0x9E3779B9U
+
+struct dns_k_tea {
+       uint32_t key[DNS_K_TEA_KEY_SIZE / sizeof (uint32_t)];
+       unsigned cycles;
+}; /* struct dns_k_tea */
+
+
+static void dns_k_tea_init(struct dns_k_tea *tea, uint32_t key[], unsigned cycles) {
+       memcpy(tea->key, key, sizeof tea->key);
+
+       tea->cycles     = (cycles)? cycles : DNS_K_TEA_CYCLES;
+} /* dns_k_tea_init() */
+
+
+static void dns_k_tea_encrypt(struct dns_k_tea *tea, uint32_t v[], uint32_t *w) {
+       uint32_t y, z, sum, n;
+
+       y       = v[0];
+       z       = v[1];
+       sum     = 0;
+
+       for (n = 0; n < tea->cycles; n++) {
+               sum     += DNS_K_TEA_MAGIC;
+               y       += ((z << 4) + tea->key[0]) ^ (z + sum) ^ ((z >> 5) + tea->key[1]);
+               z       += ((y << 4) + tea->key[2]) ^ (y + sum) ^ ((y >> 5) + tea->key[3]);
+       }
+
+       w[0]    = y;
+       w[1]    = z;
+
+       return /* void */;
+} /* dns_k_tea_encrypt() */
+
+
+/*
+ * Permutation generator, based on a Luby-Rackoff Feistel construction.
+ *
+ * Specifically, this is a generic balanced Feistel block cipher using TEA
+ * (another block cipher) as the pseudo-random function, F. At best it's as
+ * strong as F (TEA), notwithstanding the seeding. F could be AES, SHA-1, or
+ * perhaps Bernstein's Salsa20 core; I am naively trying to keep things
+ * simple.
+ *
+ * The generator can create a permutation of any set of numbers, as long as
+ * the size of the set is an even power of 2. This limitation arises either
+ * out of an inherent property of balanced Feistel constructions, or by my
+ * own ignorance. I'll tackle an unbalanced construction after I wrap my
+ * head around Schneier and Kelsey's paper.
+ *
+ * CAVEAT EMPTOR. IANAC.
+ */
+#define DNS_K_PERMUTOR_ROUNDS  8
+
+struct dns_k_permutor {
+       unsigned stepi, length, limit;
+       unsigned shift, mask, rounds;
+
+       struct dns_k_tea tea;
+}; /* struct dns_k_permutor */
+
+
+static inline unsigned dns_k_permutor_powof(unsigned n) {
+       unsigned m, i = 0;
+
+       for (m = 1; m < n; m <<= 1, i++)
+               ;;
+
+       return i;
+} /* dns_k_permutor_powof() */
+
+static void dns_k_permutor_init(struct dns_k_permutor *p, unsigned low, unsigned high) {
+       uint32_t key[DNS_K_TEA_KEY_SIZE / sizeof (uint32_t)];
+       unsigned width, i;
+
+       p->stepi        = 0;
+
+       p->length       = (high - low) + 1;
+       p->limit        = high;
+
+       width           = dns_k_permutor_powof(p->length);
+       width           += width % 2;
+
+       p->shift        = width / 2;
+       p->mask         = (1U << p->shift) - 1;
+       p->rounds       = DNS_K_PERMUTOR_ROUNDS;
+
+       for (i = 0; i < lengthof(key); i++)
+               key[i]  = dns_random();
+
+       dns_k_tea_init(&p->tea, key, 0);
+
+       return /* void */;
+} /* dns_k_permutor_init() */
+
+
+static unsigned dns_k_permutor_F(struct dns_k_permutor *p, unsigned k, unsigned x) {
+       uint32_t in[DNS_K_TEA_BLOCK_SIZE / sizeof (uint32_t)], out[DNS_K_TEA_BLOCK_SIZE / sizeof (uint32_t)];
+
+       memset(in, '\0', sizeof in);
+
+       in[0]   = k;
+       in[1]   = x;
+
+       dns_k_tea_encrypt(&p->tea, in, out);
+
+       return p->mask & out[0];
+} /* dns_k_permutor_F() */
+
+
+static unsigned dns_k_permutor_E(struct dns_k_permutor *p, unsigned n) {
+       unsigned l[2], r[2];
+       unsigned i;
+
+       i       = 0;
+       l[i]    = p->mask & (n >> p->shift);
+       r[i]    = p->mask & (n >> 0);
+
+       do {
+               l[(i + 1) % 2]  = r[i % 2];
+               r[(i + 1) % 2]  = l[i % 2] ^ dns_k_permutor_F(p, i, r[i % 2]);
+
+               i++;
+       } while (i < p->rounds - 1);
+
+       return ((l[i % 2] & p->mask) << p->shift) | ((r[i % 2] & p->mask) << 0);
+} /* dns_k_permutor_E() */
+
+static unsigned dns_k_permutor_step(struct dns_k_permutor *p) {
+       unsigned n;
+
+       do {
+               n       = dns_k_permutor_E(p, p->stepi++);
+       } while (n >= p->length);
+
+       return n + (p->limit + 1 - p->length);
+} /* dns_k_permutor_step() */
+
+
+/*
+ * Simple permutation box. Useful for shuffling rrsets from an iterator.
+ * Uses AES s-box to provide good diffusion.
+ *
+ * Seems to pass muster under runs test.
+ *
+ * $ for i in 0 1 2 3 4 5 6 7 8 9; do ./dns shuffle-16 > /tmp/out; done
+ * $ R -q -f /dev/stdin 2>/dev/null <<-EOF | awk '/p-value/{ print $8 }'
+ *     library(lawstat)
+ *     runs.test(scan(file="/tmp/out"))
+ * EOF
+ */
+static unsigned short dns_k_shuffle16(unsigned short n, unsigned s) {
+       static const unsigned char sbox[256] =
+       { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
+         0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
+         0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+         0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+         0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
+         0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+         0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
+         0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+         0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+         0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
+         0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
+         0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+         0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
+         0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
+         0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+         0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
+         0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
+         0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+         0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
+         0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
+         0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+         0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
+         0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
+         0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+         0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
+         0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
+         0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+         0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
+         0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
+         0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+         0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
+         0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
+       unsigned char a, b;
+       unsigned i;
+
+       a = 0xff & (n >> 0);
+       b = 0xff & (n >> 8);
+
+       for (i = 0; i < 4; i++) {
+               a ^= 0xff & s;
+               a = sbox[a] ^ b;
+               b = sbox[b] ^ a;
+               s >>= 8;
+       }
+
+       return ((0xff00 & (a << 8)) | (0x00ff & (b << 0)));
+} /* dns_k_shuffle16() */
+
+
+/*
+ * U T I L I T Y  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Monotonic Time
+ *
+ */
+static time_t dns_now(void) {
+       /* XXX: Assumes sizeof (time_t) <= sizeof (sig_atomic_t) */
+       static volatile sig_atomic_t last, tick;
+       volatile sig_atomic_t tmp_last, tmp_tick;
+       time_t now;
+
+       time(&now);
+
+       tmp_last        = last;
+
+       if (now > tmp_last) {
+               tmp_tick        = tick;
+               tmp_tick        += now - tmp_last;
+               tick            = tmp_tick;
+       }
+
+       last    = now;
+
+       return tick;
+} /* dns_now() */
+
+static time_t dns_elapsed(time_t from) {
+       time_t now      = dns_now();
+
+       return (now > from)? now - from : 0;
+} /* dns_elpased() */
+
+
+static size_t dns_af_len(int af) {
+       static const size_t table[AF_MAX]       = {
+               [AF_INET6]      = sizeof (struct sockaddr_in6),
+               [AF_INET]       = sizeof (struct sockaddr_in),
+#if defined(AF_UNIX) && !defined(_WIN32)
+               [AF_UNIX]       = sizeof (struct sockaddr_un),
+#endif
+       };
+
+       return table[af];
+} /* dns_af_len() */
+
+#define dns_sa_len(sa)         dns_af_len(dns_sa_family(sa))
+
+
+#define DNS_SA_NOPORT  &dns_sa_noport
+static unsigned short dns_sa_noport;
+
+unsigned short *dns_sa_port(int af, void *sa) {
+       switch (af) {
+       case AF_INET6:
+               return &((struct sockaddr_in6 *)sa)->sin6_port;
+       case AF_INET:
+               return &((struct sockaddr_in *)sa)->sin_port;
+       default:
+               return DNS_SA_NOPORT;
+       }
+} /* dns_sa_port() */
+
+
+void *dns_sa_addr(int af, void *sa) {
+       switch (af) {
+       case AF_INET6:
+               return &((struct sockaddr_in6 *)sa)->sin6_addr;
+       case AF_INET:
+               return &((struct sockaddr_in *)sa)->sin_addr;
+       default:
+               return 0;
+       }
+} /* dns_sa_addr() */
+
+
+#if _WIN32
+static int dns_inet_pton(int af, const void *src, void *dst) {
+       union { struct sockaddr_in sin; struct sockaddr_in6 sin6; } u;
+
+       u.sin.sin_family        = af;
+
+       if (0 != WSAStringToAddressA((void *)src, af, (void *)0, (struct sockaddr *)&u, &(int){ sizeof u }))
+               return -1;
+
+       switch (af) {
+       case AF_INET6:
+               *(struct in6_addr *)dst = u.sin6.sin6_addr;
+
+               return 1;
+       case AF_INET:
+               *(struct in_addr *)dst  = u.sin.sin_addr;
+
+               return 1;
+       default:
+               return 0;
+       }
+} /* dns_inet_pton() */
+
+const char *dns_inet_ntop(int af, const void *src, void *dst, unsigned long lim) {
+       union { struct sockaddr_in sin; struct sockaddr_in6 sin6; } u;
+
+       /* NOTE: WSAAddressToString will print .sin_port unless zeroed. */
+       memset(&u, 0, sizeof u);
+
+       u.sin.sin_family        = af;
+
+       switch (af) {
+       case AF_INET6:
+               u.sin6.sin6_addr        = *(struct in6_addr *)src;
+               break;
+       case AF_INET:
+               u.sin.sin_addr          = *(struct in_addr *)src;
+
+               break;
+       default:
+               return 0;
+       }
+
+       if (0 != WSAAddressToStringA((struct sockaddr *)&u, dns_sa_len(&u), (void *)0, dst, &lim))
+               return 0;
+
+       return dst;
+} /* dns_inet_ntop() */
+#endif
+
+
+size_t dns_strlcpy(char *dst, const char *src, size_t lim) {
+       char *d         = dst;
+       char *e         = &dst[lim];
+       const char *s   = src;
+
+       if (d < e) {
+               do {
+                       if ('\0' == (*d++ = *s++))
+                               return s - src - 1;
+               } while (d < e);
+
+               d[-1]   = '\0';
+       }
+
+       while (*s++ != '\0')
+               ;;
+
+       return s - src - 1;
+} /* dns_strlcpy() */
+
+
+size_t dns_strlcat(char *dst, const char *src, size_t lim) {
+       char *d = memchr(dst, '\0', lim);
+       char *e = &dst[lim];
+       const char *s = src;
+       const char *p;
+
+       if (d && d < e) {
+               do {
+                       if ('\0' == (*d++ = *s++))
+                               return d - dst - 1;
+               } while (d < e);
+
+               d[-1] = '\0';
+       }
+
+       p = s;
+
+       while (*s++ != '\0')
+               ;;
+
+       return lim + (s - p - 1);
+} /* dns_strlcat() */
+
+
+#if _WIN32
+
+static char *dns_strsep(char **sp, const char *delim) {
+       char *p;
+
+       if (!(p = *sp))
+               return 0;
+
+       *sp += strcspn(p, delim);
+
+       if (**sp != '\0') {
+               **sp = '\0';
+               ++*sp;
+       } else
+               *sp = NULL;
+
+       return p;
+} /* dns_strsep() */
+
+#else
+#define dns_strsep(...)        strsep(__VA_ARGS__)
+#endif
+
+
+#if _WIN32
+#define strcasecmp(...)                _stricmp(__VA_ARGS__)
+#define strncasecmp(...)       _strnicmp(__VA_ARGS__)
+#endif
+
+
+static int dns_poll(int fd, short events, int timeout) {
+       fd_set rset, wset;
+
+       if (!events)
+               return 0;
+
+       assert(fd >= 0 && fd < FD_SETSIZE);
+
+       FD_ZERO(&rset);
+       FD_ZERO(&wset);
+
+       if (events & DNS_POLLIN)
+               FD_SET(fd, &rset);
+
+       if (events & DNS_POLLOUT)
+               FD_SET(fd, &wset);
+
+       select(fd + 1, &rset, &wset, 0, (timeout >= 0)? &(struct timeval){ timeout, 0 } : NULL);
+
+       return 0;
+} /* dns_poll() */
+
+
+/*
+ * P A C K E T  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+unsigned dns_p_count(struct dns_packet *P, enum dns_section section) {
+       unsigned count;
+
+       switch (section) {
+       case DNS_S_QD:
+               return ntohs(dns_header(P)->qdcount);
+       case DNS_S_AN:
+               return ntohs(dns_header(P)->ancount);
+       case DNS_S_NS:
+               return ntohs(dns_header(P)->nscount);
+       case DNS_S_AR:
+               return ntohs(dns_header(P)->arcount);
+       default:
+               count = 0;
+
+               if (section & DNS_S_QD)
+                       count += ntohs(dns_header(P)->qdcount);
+               if (section & DNS_S_AN)
+                       count += ntohs(dns_header(P)->ancount);
+               if (section & DNS_S_NS)
+                       count += ntohs(dns_header(P)->nscount);
+               if (section & DNS_S_AR)
+                       count += ntohs(dns_header(P)->arcount);
+
+               return count;
+       }
+} /* dns_p_count() */
+
+
+struct dns_packet *dns_p_init(struct dns_packet *P, size_t size) {
+       if (!P)
+               return 0;
+
+       assert(size >= offsetof(struct dns_packet, data) + 12);
+
+       memset(P, 0, sizeof *P);
+       P->size = size - offsetof(struct dns_packet, data);
+       P->end  = 12;
+
+       memset(P->data, '\0', 12);
+
+       return P;
+} /* dns_p_init() */
+
+
+static unsigned short dns_p_qend(struct dns_packet *P) {
+       unsigned short qend     = 12;
+       unsigned i, count       = dns_p_count(P, DNS_S_QD);
+
+       for (i = 0; i < count && qend < P->end; i++) {
+               if (P->end == (qend = dns_d_skip(qend, P)))
+                       goto invalid;
+
+               if (P->end - qend < 4)
+                       goto invalid;
+
+               qend    += 4;
+       }
+
+       return MIN(qend, P->end);
+invalid:
+       return P->end;
+} /* dns_p_qend() */
+
+
+struct dns_packet *dns_p_make(size_t len, int *error) {
+       struct dns_packet *P;
+       size_t size = dns_p_calcsize(len);
+
+       if (!(P = dns_p_init(malloc(size), size)))
+               *error = dns_syerr();
+
+       return P;
+} /* dns_p_make() */
+
+
+int dns_p_grow(struct dns_packet **P) {
+       struct dns_packet *tmp;
+       size_t size;
+       int error;
+
+       if (!*P) {
+               if (!(*P = dns_p_make(DNS_P_QBUFSIZ, &error)))
+                       return error;
+
+               return 0;
+       }
+
+       size = dns_p_sizeof(*P);
+       size |= size >> 1;
+       size |= size >> 2;
+       size |= size >> 4;
+       size |= size >> 8;
+       size++;
+
+       if (size > 65536)
+               return DNS_ENOBUFS;
+
+       if (!(tmp = realloc(*P, dns_p_calcsize(size))))
+               return dns_syerr();
+
+       tmp->size = size;
+       *P = tmp;
+
+       return 0;
+} /* dns_p_grow() */
+
+
+struct dns_packet *dns_p_copy(struct dns_packet *P, const struct dns_packet *P0) {
+       if (!P)
+               return 0;
+
+       P->end  = MIN(P->size, P0->end);
+
+       memcpy(P->data, P0->data, P->end);
+
+       return P;
+} /* dns_p_copy() */
+
+
+struct dns_packet *dns_p_merge(struct dns_packet *A, enum dns_section Amask, struct dns_packet *B, enum dns_section Bmask, int *error_) {
+       size_t bufsiz = MIN(65535, ((A)? A->end : 0) + ((B)? B->end : 0));
+       struct dns_packet *M;
+       enum dns_section section;
+       struct dns_rr rr, mr;
+       int error, copy;
+
+       if (!A && B) {
+               A = B;
+               Amask = Bmask;
+               B = 0;
+       }
+
+merge:
+       if (!(M = dns_p_make(bufsiz, &error)))
+               goto error;
+
+       for (section = DNS_S_QD; (DNS_S_ALL & section); section <<= 1) {
+               if (A && (section & Amask)) {
+                       dns_rr_foreach(&rr, A, .section = section) {
+                               if ((error = dns_rr_copy(M, &rr, A)))
+                                       goto error;
+                       }
+               }
+
+               if (B && (section & Bmask)) {
+                       dns_rr_foreach(&rr, B, .section = section) {
+                               copy = 1;
+
+                               dns_rr_foreach(&mr, M, .type = rr.type, .section = DNS_S_ALL) {
+                                       if (!(copy = dns_rr_cmp(&rr, B, &mr, M)))
+                                               break;
+                               }
+
+                               if (copy && (error = dns_rr_copy(M, &rr, B)))
+                                       goto error;
+                       }
+               }
+       }
+
+       return M;
+error:
+       free(M); M = 0;
+
+       if (error == DNS_ENOBUFS && bufsiz < 65535) {
+               bufsiz = MIN(65535, bufsiz * 2);
+
+               goto merge;
+       }
+
+       *error_ = error;
+
+       return 0;
+} /* dns_p_merge() */
+
+
+static unsigned short dns_l_skip(unsigned short, const unsigned char *, size_t);
+
+void dns_p_dictadd(struct dns_packet *P, unsigned short dn) {
+       unsigned short lp, lptr, i;
+
+       lp      = dn;
+
+       while (lp < P->end) {
+               if (0xc0 == (0xc0 & P->data[lp]) && P->end - lp >= 2 && lp != dn) {
+                       lptr    = ((0x3f & P->data[lp + 0]) << 8)
+                               | ((0xff & P->data[lp + 1]) << 0);
+
+                       for (i = 0; i < lengthof(P->dict) && P->dict[i]; i++) {
+                               if (P->dict[i] == lptr) {
+                                       P->dict[i]      = dn;
+
+                                       return;
+                               }
+                       }
+               }
+
+               lp      = dns_l_skip(lp, P->data, P->end);
+       }
+
+       for (i = 0; i < lengthof(P->dict); i++) {
+               if (!P->dict[i]) {
+                       P->dict[i]      = dn;
+
+                       break;
+               }
+       }
+} /* dns_p_dictadd() */
+
+
+int dns_p_push(struct dns_packet *P, enum dns_section section, const void *dn, size_t dnlen, enum dns_type type, enum dns_class class, unsigned ttl, const void *any) {
+       size_t end = P->end;
+       int error;
+
+       if ((error = dns_d_push(P, dn, dnlen)))
+               goto error;
+
+       if (P->size - P->end < 4)
+               goto nobufs;
+
+       P->data[P->end++] = 0xff & (type >> 8);
+       P->data[P->end++] = 0xff & (type >> 0);
+
+       P->data[P->end++] = 0xff & (class >> 8);
+       P->data[P->end++] = 0xff & (class >> 0);
+
+       if (section == DNS_S_QD)
+               goto update;
+
+       if (P->size - P->end < 6)
+               goto nobufs;
+
+       P->data[P->end++] = 0x7f & (ttl >> 24);
+       P->data[P->end++] = 0xff & (ttl >> 16);
+       P->data[P->end++] = 0xff & (ttl >> 8);
+       P->data[P->end++] = 0xff & (ttl >> 0);
+
+       if ((error = dns_any_push(P, (union dns_any *)any, type)))
+               goto error;
+
+update:
+       switch (section) {
+       case DNS_S_QD:
+               if (dns_p_count(P, DNS_S_AN|DNS_S_NS|DNS_S_AR))
+                       goto order;
+
+               if (!P->qd.base && (error = dns_p_study(P)))
+                       goto error;
+
+               dns_header(P)->qdcount = htons(ntohs(dns_header(P)->qdcount) + 1);
+
+               P->qd.end  = P->end;
+               P->an.base = P->end;
+               P->an.end  = P->end;
+               P->ns.base = P->end;
+               P->ns.end  = P->end;
+               P->ar.base = P->end;
+               P->ar.end  = P->end;
+
+               break;
+       case DNS_S_AN:
+               if (dns_p_count(P, DNS_S_NS|DNS_S_AR))
+                       goto order;
+
+               if (!P->an.base && (error = dns_p_study(P)))
+                       goto error;
+
+               dns_header(P)->ancount = htons(ntohs(dns_header(P)->ancount) + 1);
+
+               P->an.end  = P->end;
+               P->ns.base = P->end;
+               P->ns.end  = P->end;
+               P->ar.base = P->end;
+               P->ar.end  = P->end;
+
+               break;
+       case DNS_S_NS:
+               if (dns_p_count(P, DNS_S_AR))
+                       goto order;
+
+               if (!P->ns.base && (error = dns_p_study(P)))
+                       goto error;
+
+               dns_header(P)->nscount = htons(ntohs(dns_header(P)->nscount) + 1);
+
+               P->ns.end  = P->end;
+               P->ar.base = P->end;
+               P->ar.end  = P->end;
+
+               break;
+       case DNS_S_AR:
+               if (!P->ar.base && (error = dns_p_study(P)))
+                       goto error;
+
+               dns_header(P)->arcount = htons(ntohs(dns_header(P)->arcount) + 1);
+
+               P->ar.end = P->end;
+
+               break;
+       default:
+               error = DNS_ESECTION;
+
+               goto error;
+       } /* switch() */
+
+       return 0;
+nobufs:
+       error = DNS_ENOBUFS;
+
+       goto error;
+order:
+       error = DNS_EORDER;
+
+       goto error;
+error:
+       P->end = end;
+
+       return error;
+} /* dns_p_push() */
+
+
+static void dns_p_dump3(struct dns_packet *P, struct dns_rr_i *I, FILE *fp) {
+       enum dns_section section;
+       struct dns_rr rr;
+       int error;
+       union dns_any any;
+       char pretty[sizeof any * 2];
+       size_t len;
+
+       fputs(";; [HEADER]\n", fp);
+       fprintf(fp, ";;     qr : %s(%d)\n", (dns_header(P)->qr)? "RESPONSE" : "QUERY", dns_header(P)->qr);
+       fprintf(fp, ";; opcode : %s(%d)\n", dns_stropcode(dns_header(P)->opcode), dns_header(P)->opcode);
+       fprintf(fp, ";;     aa : %s(%d)\n", (dns_header(P)->aa)? "AUTHORITATIVE" : "NON-AUTHORITATIVE", dns_header(P)->aa);
+       fprintf(fp, ";;     tc : %s(%d)\n", (dns_header(P)->tc)? "TRUNCATED" : "NOT-TRUNCATED", dns_header(P)->tc);
+       fprintf(fp, ";;     rd : %s(%d)\n", (dns_header(P)->rd)? "RECURSION-DESIRED" : "RECURSION-NOT-DESIRED", dns_header(P)->rd);
+       fprintf(fp, ";;     ra : %s(%d)\n", (dns_header(P)->ra)? "RECURSION-ALLOWED" : "RECURSION-NOT-ALLOWED", dns_header(P)->ra);
+       fprintf(fp, ";;  rcode : %s(%d)\n", dns_strrcode(dns_header(P)->rcode), dns_header(P)->rcode);
+
+       section = 0;
+
+       while (dns_rr_grep(&rr, 1, I, P, &error)) {
+               if (section != rr.section)
+                       fprintf(fp, "\n;; [%s:%d]\n", dns_strsection(rr.section), dns_p_count(P, rr.section));
+
+               if ((len = dns_rr_print(pretty, sizeof pretty, &rr, P, &error)))
+                       fprintf(fp, "%s\n", pretty);
+
+               section = rr.section;
+       }
+} /* dns_p_dump3() */
+
+
+void dns_p_dump(struct dns_packet *P, FILE *fp) {
+       dns_p_dump3(P, dns_rr_i_new(P, .section = 0), fp);
+} /* dns_p_dump() */
+
+
+static void dns_s_unstudy(struct dns_s_memo *m)
+       { m->base = 0; m->end = 0; }
+
+static void dns_p_unstudy(struct dns_packet *P) {
+       dns_s_unstudy(&P->qd);
+       dns_s_unstudy(&P->an);
+       dns_s_unstudy(&P->ns);
+       dns_s_unstudy(&P->ar);
+} /* dns_p_unstudy() */
+
+static int dns_s_study(struct dns_s_memo *m, enum dns_section section, unsigned base, struct dns_packet *P) {
+       unsigned short count, rp;
+
+       count = dns_p_count(P, section);
+
+       for (rp = base; count && rp < P->end; count--)
+               rp = dns_rr_skip(rp, P);
+
+       m->base = base;
+       m->end  = rp;
+
+       return 0;
+} /* dns_s_study() */
+
+int dns_p_study(struct dns_packet *P) {
+       int error;
+
+       if ((error = dns_s_study(&P->qd, DNS_S_QD, 12, P)))
+               goto error;
+
+       if ((error = dns_s_study(&P->an, DNS_S_AN, P->qd.end, P)))
+               goto error;
+
+       if ((error = dns_s_study(&P->ns, DNS_S_NS, P->an.end, P)))
+               goto error;
+
+       if ((error = dns_s_study(&P->ar, DNS_S_AR, P->ns.end, P)))
+               goto error;
+
+       return 0;
+error:
+       dns_p_unstudy(P);
+
+       return error;
+} /* dns_p_study() */
+
+
+/*
+ * D O M A I N  N A M E  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef DNS_D_MAXPTRS
+#define DNS_D_MAXPTRS  127     /* Arbitrary; possible, valid depth is something like packet size / 2 + fudge. */
+#endif
+
+static size_t dns_l_expand(unsigned char *dst, size_t lim, unsigned short src, unsigned short *nxt, const unsigned char *data, size_t end) {
+       unsigned short len;
+       unsigned nptrs  = 0;
+
+retry:
+       if (src >= end)
+               goto invalid;
+
+       switch (0x03 & (data[src] >> 6)) {
+       case 0x00:
+               len     = (0x3f & (data[src++]));
+
+               if (end - src < len)
+                       goto invalid;
+
+               if (lim > 0) {
+                       memcpy(dst, &data[src], MIN(lim, len));
+
+                       dst[MIN(lim - 1, len)]  = '\0';
+               }
+
+               *nxt    = src + len;
+
+               return len;
+       case 0x01:
+               goto invalid;
+       case 0x02:
+               goto invalid;
+       case 0x03:
+               if (++nptrs > DNS_D_MAXPTRS)
+                       goto invalid;
+
+               if (end - src < 2)
+                       goto invalid;
+
+               src     = ((0x3f & data[src + 0]) << 8)
+                       | ((0xff & data[src + 1]) << 0);
+
+               goto retry;
+       } /* switch() */
+
+       /* NOT REACHED */
+invalid:
+       *nxt    = end;
+
+       return 0;
+} /* dns_l_expand() */
+
+
+static unsigned short dns_l_skip(unsigned short src, const unsigned char *data, size_t end) {
+       unsigned short len;
+
+       if (src >= end)
+               goto invalid;
+
+       switch (0x03 & (data[src] >> 6)) {
+       case 0x00:
+               len     = (0x3f & (data[src++]));
+
+               if (end - src < len)
+                       goto invalid;
+
+               return (len)? src + len : end;
+       case 0x01:
+               goto invalid;
+       case 0x02:
+               goto invalid;
+       case 0x03:
+               return end;
+       } /* switch() */
+
+       /* NOT REACHED */
+invalid:
+       return end;
+} /* dns_l_skip() */
+
+
+size_t dns_d_trim(void *dst_, size_t lim, const void *src_, size_t len, int flags) {
+       unsigned char *dst = dst_;
+       const unsigned char *src = src_;
+       size_t dp = 0, sp = 0;
+       int lc;
+
+       /* trim any leading dot(s) */
+       while (sp < len && src[sp] == '.')
+               sp++;
+
+       for (lc = 0; sp < len; lc = src[sp]) {
+               if (dp < lim)
+                       dst[dp] = src[sp];
+
+               sp++;
+               dp++;
+
+               /* trim extra dot(s) */
+               while (sp < len && src[sp] == '.')
+                       sp++;
+       }
+
+       if ((flags & DNS_D_ANCHOR) && lc != '.') {
+               if (dp < lim)
+                       dst[dp] = '.';
+
+               dp++;
+       }
+
+       if (lim > 0)
+               dst[MIN(dp, lim - 1)] = '\0';
+
+       return dp;
+} /* dns_d_trim() */
+
+
+char *dns_d_init(void *dst, size_t lim, const void *src, size_t len, int flags) {
+       if (flags & DNS_D_TRIM) {
+               dns_d_trim(dst, lim, src, len, flags);
+       } if (flags & DNS_D_ANCHOR) {
+               dns_d_anchor(dst, lim, src, len);
+       } else {
+               memmove(dst, src, MIN(lim, len));
+
+               if (lim > 0)
+                       ((char *)dst)[MIN(len, lim - 1)]        = '\0';
+       }
+
+       return dst;
+} /* dns_d_init() */
+
+
+size_t dns_d_anchor(void *dst, size_t lim, const void *src, size_t len) {
+       if (len == 0)
+               return 0;
+
+       memmove(dst, src, MIN(lim, len));
+
+       if (((const char *)src)[len - 1] != '.') {
+               if (len < lim)
+                       ((char *)dst)[len]      = '.';
+               len++;
+       }
+
+       if (lim > 0)
+               ((char *)dst)[MIN(lim - 1, len)]        = '\0';
+
+       return len;
+} /* dns_d_anchor() */
+
+
+size_t dns_d_cleave(void *dst, size_t lim, const void *src, size_t len) {
+       const char *dot;
+
+       /* XXX: Skip any leading dot. Handles cleaving root ".". */
+       if (len == 0 || !(dot = memchr((const char *)src + 1, '.', len - 1)))
+               return 0;
+
+       len     -= dot - (const char *)src;
+
+       /* XXX: Unless root, skip the label's trailing dot. */
+       if (len > 1) {
+               src     = ++dot;
+               len--;
+       } else
+               src     = dot;
+
+       memmove(dst, src, MIN(lim, len));
+
+       if (lim > 0)
+               ((char *)dst)[MIN(lim - 1, len)]        = '\0';
+
+       return len;
+} /* dns_d_cleave() */
+
+
+size_t dns_d_comp(void *dst_, size_t lim, const void *src_, size_t len, struct dns_packet *P, int *error __UNUSED__) {
+       struct { unsigned char *b; size_t p, x; } dst, src;
+       unsigned char ch        = '.';
+
+       dst.b   = dst_;
+       dst.p   = 0;
+       dst.x   = 1;
+
+       src.b   = (unsigned char *)src_;
+       src.p   = 0;
+       src.x   = 0;
+
+       while (src.x < len) {
+               ch      = src.b[src.x];
+
+               if (ch == '.') {
+                       if (dst.p < lim)
+                               dst.b[dst.p]    = (0x3f & (src.x - src.p));
+
+                       dst.p   = dst.x++;
+                       src.p   = ++src.x;
+               } else {
+                       if (dst.x < lim)
+                               dst.b[dst.x]    = ch;
+
+                       dst.x++;
+                       src.x++;
+               }
+       } /* while() */
+
+       if (src.x > src.p) {
+               if (dst.p < lim)
+                       dst.b[dst.p]    = (0x3f & (src.x - src.p));
+
+               dst.p   = dst.x;
+       }
+
+       if (dst.p > 1) {
+               if (dst.p < lim)
+                       dst.b[dst.p]    = 0x00;
+
+               dst.p++;
+       }
+
+#if 1
+       if (dst.p < lim) {
+               struct { unsigned char label[DNS_D_MAXLABEL + 1]; size_t len; unsigned short p, x, y; } a, b;
+               unsigned i;
+
+               a.p     = 0;
+
+               while ((a.len = dns_l_expand(a.label, sizeof a.label, a.p, &a.x, dst.b, lim))) {
+                       for (i = 0; i < lengthof(P->dict) && P->dict[i]; i++) {
+                               b.p     = P->dict[i];
+
+                               while ((b.len = dns_l_expand(b.label, sizeof b.label, b.p, &b.x, P->data, P->end))) {
+                                       a.y     = a.x;
+                                       b.y     = b.x;
+
+                                       while (a.len && b.len && 0 == strcasecmp((char *)a.label, (char *)b.label)) {
+                                               a.len = dns_l_expand(a.label, sizeof a.label, a.y, &a.y, dst.b, lim);
+                                               b.len = dns_l_expand(b.label, sizeof b.label, b.y, &b.y, P->data, P->end);
+                                       }
+
+                                       if (a.len == 0 && b.len == 0 && b.p <= 0x3fff) {
+                                               dst.b[a.p++]    = 0xc0
+                                                               | (0x3f & (b.p >> 8));
+                                               dst.b[a.p++]    = (0xff & (b.p >> 0));
+
+                                               return a.p;
+                                       }
+
+                                       b.p     = b.x;
+                               } /* while() */
+                       } /* for() */
+
+                       a.p     = a.x;
+               } /* while() */
+       } /* if () */
+#endif
+
+       return dst.p;
+} /* dns_d_comp() */
+
+
+unsigned short dns_d_skip(unsigned short src, struct dns_packet *P) {
+       unsigned short len;
+
+       while (src < P->end) {
+               switch (0x03 & (P->data[src] >> 6)) {
+               case 0x00:      /* FOLLOWS */
+                       len     = (0x3f & P->data[src++]);
+
+                       if (0 == len) {
+/* success ==> */              return src;
+                       } else if (P->end - src > len) {
+                               src     += len;
+
+                               break;
+                       } else
+                               goto invalid;
+
+                       /* NOT REACHED */
+               case 0x01:      /* RESERVED */
+                       goto invalid;
+               case 0x02:      /* RESERVED */
+                       goto invalid;
+               case 0x03:      /* POINTER */
+                       if (P->end - src < 2)
+                               goto invalid;
+
+                       src     += 2;
+
+/* success ==> */      return src;
+               } /* switch() */
+       } /* while() */
+
+invalid:
+//assert(0);
+       return P->end;
+} /* dns_d_skip() */
+
+
+#include <stdio.h>
+
+size_t dns_d_expand(void *dst, size_t lim, unsigned short src, struct dns_packet *P, int *error) {
+       size_t dstp     = 0;
+       unsigned nptrs  = 0;
+       unsigned char len;
+
+       while (src < P->end) {
+               switch ((0x03 & (P->data[src] >> 6))) {
+               case 0x00:      /* FOLLOWS */
+                       len     = (0x3f & P->data[src]);
+
+                       if (0 == len) {
+                               if (dstp == 0) {
+                                       if (dstp < lim)
+                                               ((unsigned char *)dst)[dstp]    = '.';
+
+                                       dstp++;
+                               }
+
+                               /* NUL terminate */
+                               if (lim > 0)
+                                       ((unsigned char *)dst)[MIN(dstp, lim - 1)]      = '\0';
+
+/* success ==> */              return dstp;
+                       }
+
+                       src++;
+
+                       if (P->end - src < len)
+                               goto toolong;
+
+                       if (dstp < lim)
+                               memcpy(&((unsigned char *)dst)[dstp], &P->data[src], MIN(len, lim - dstp));
+
+                       src     += len;
+                       dstp    += len;
+
+                       if (dstp < lim)
+                               ((unsigned char *)dst)[dstp]    = '.';
+
+                       dstp++;
+
+                       nptrs   = 0;
+
+                       continue;
+               case 0x01:      /* RESERVED */
+                       goto reserved;
+               case 0x02:      /* RESERVED */
+                       goto reserved;
+               case 0x03:      /* POINTER */
+                       if (++nptrs > DNS_D_MAXPTRS)
+                               goto toolong;
+
+                       if (P->end - src < 2)
+                               goto toolong;
+
+                       src     = ((0x3f & P->data[src + 0]) << 8)
+                               | ((0xff & P->data[src + 1]) << 0);
+
+                       continue;
+               } /* switch() */
+       } /* while() */
+
+toolong:
+       *error  = DNS_EILLEGAL;
+
+       if (lim > 0)
+               ((unsigned char *)dst)[MIN(dstp, lim - 1)]      = '\0';
+
+       return 0;
+reserved:
+       *error  = DNS_EILLEGAL;
+
+       if (lim > 0)
+               ((unsigned char *)dst)[MIN(dstp, lim - 1)]      = '\0';
+
+       return 0;
+} /* dns_d_expand() */
+
+
+int dns_d_push(struct dns_packet *P, const void *dn, size_t len) {
+       size_t lim      = P->size - P->end;
+       unsigned dp     = P->end;
+       int error;
+
+       len     = dns_d_comp(&P->data[dp], lim, dn, len, P, &error);
+
+       if (len == 0)
+               return error;
+       if (len > lim)
+               return DNS_ENOBUFS;
+
+       P->end  += len;
+
+       dns_p_dictadd(P, dp);
+
+       return 0;
+} /* dns_d_push() */
+
+
+size_t dns_d_cname(void *dst, size_t lim, const void *dn, size_t len, struct dns_packet *P, int *error_) {
+       char host[DNS_D_MAXNAME + 1];
+       struct dns_rr_i i;
+       struct dns_rr rr;
+       unsigned depth;
+       int error;
+
+       if (sizeof host <= dns_d_anchor(host, sizeof host, dn, len))
+               { error = ENAMETOOLONG; goto error; }
+
+       for (depth = 0; depth < 7; depth++) {
+               dns_rr_i_init(memset(&i, 0, sizeof i), P);
+
+               i.section       = DNS_S_ALL & ~DNS_S_QD;
+               i.name          = host;
+               i.type          = DNS_T_CNAME;
+
+               if (!dns_rr_grep(&rr, 1, &i, P, &error))
+                       break;
+
+               if ((error = dns_cname_parse((struct dns_cname *)host, &rr, P)))
+                       goto error;
+       }
+
+       return dns_strlcpy(dst, host, lim);
+error:
+       *error_ = error;
+
+       return 0;
+} /* dns_d_cname() */
+
+
+/*
+ * R E S O U R C E  R E C O R D  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+int dns_rr_copy(struct dns_packet *P, struct dns_rr *rr, struct dns_packet *Q) {
+       unsigned char dn[DNS_D_MAXNAME + 1];
+       union dns_any any;
+       size_t len;
+       int error;
+
+       if (!(len = dns_d_expand(dn, sizeof dn, rr->dn.p, Q, &error)))
+               return error;
+       else if (len >= sizeof dn)
+               return DNS_EILLEGAL;
+
+       if (rr->section != DNS_S_QD && (error = dns_any_parse(dns_any_init(&any, sizeof any), rr, Q)))
+               return error;
+
+       return dns_p_push(P, rr->section, dn, len, rr->type, rr->class, rr->ttl, &any);
+} /* dns_rr_copy() */
+
+
+int dns_rr_parse(struct dns_rr *rr, unsigned short src, struct dns_packet *P) {
+       unsigned short p        = src;
+
+       if (src >= P->end)
+               goto invalid;
+
+       rr->dn.p        = p;
+       rr->dn.len      = (p = dns_d_skip(p, P)) - rr->dn.p;
+
+       if (P->end - p < 4)
+               goto invalid;
+
+       rr->type        = ((0xff & P->data[p + 0]) << 8)
+                       | ((0xff & P->data[p + 1]) << 0);
+
+       rr->class       = ((0xff & P->data[p + 2]) << 8)
+                       | ((0xff & P->data[p + 3]) << 0);
+
+       p       += 4;
+
+       if (src < dns_p_qend(P)) {
+               rr->section     = DNS_S_QUESTION;
+
+               rr->ttl         = 0;
+               rr->rd.p        = 0;
+               rr->rd.len      = 0;
+
+               return 0;
+       }
+
+       if (P->end - p < 4)
+               goto invalid;
+
+       rr->ttl         = ((0x7f & P->data[p + 0]) << 24)
+                       | ((0xff & P->data[p + 1]) << 16)
+                       | ((0xff & P->data[p + 2]) << 8)
+                       | ((0xff & P->data[p + 3]) << 0);
+
+       p       += 4;
+
+       if (P->end - p < 2)
+               goto invalid;
+
+       rr->rd.len      = ((0xff & P->data[p + 0]) << 8)
+                       | ((0xff & P->data[p + 1]) << 0);
+       rr->rd.p        = p + 2;
+
+       p       += 2;
+
+       if (P->end - p < rr->rd.len)
+               goto invalid;
+
+       return 0;
+invalid:
+//assert(0);
+       return DNS_EILLEGAL;
+} /* dns_rr_parse() */
+
+
+static unsigned short dns_rr_len(const unsigned short src, struct dns_packet *P) {
+       unsigned short rp, rdlen;
+
+       rp      = dns_d_skip(src, P);
+
+       if (P->end - rp < 4)
+               return P->end - src;
+
+       rp      += 4;   /* TYPE, CLASS */
+
+       if (rp <= dns_p_qend(P))
+               return rp - src;
+
+       if (P->end - rp < 6)
+               return P->end - src;
+
+       rp      += 6;   /* TTL, RDLEN */
+
+       rdlen   = ((0xff & P->data[rp - 2]) << 8)
+               | ((0xff & P->data[rp - 1]) << 0);
+
+       if (P->end - rp < rdlen)
+               return P->end - src;
+
+       rp      += rdlen;
+
+       return rp - src;
+} /* dns_rr_len() */
+
+
+unsigned short dns_rr_skip(unsigned short src, struct dns_packet *P) {
+       return src + dns_rr_len(src, P);
+} /* dns_rr_skip() */
+
+
+static enum dns_section dns_rr_section(unsigned short src, struct dns_packet *P) {
+       enum dns_section section;
+       unsigned count, ind;
+       unsigned short rp;
+
+       if (src >= P->qd.base && src < P->qd.end)
+               return DNS_S_QD;
+       if (src >= P->an.base && src < P->an.end)
+               return DNS_S_AN;
+       if (src >= P->ns.base && src < P->ns.end)
+               return DNS_S_NS;
+       if (src >= P->ar.base && src < P->ar.end)
+               return DNS_S_AR;
+
+       /* NOTE: Possibly bad memoization. Try it the hard-way. */
+
+       for (rp = 12, ind = 0; rp < src && rp < P->end; ind++)
+               rp = dns_rr_skip(rp, P);
+
+       section = DNS_S_QD;
+       count   = dns_p_count(P, section);
+
+       while (ind >= count && section <= DNS_S_AR) {
+               section <<= 1;
+               count += dns_p_count(P, section);
+       }
+
+       return DNS_S_ALL & section;
+} /* dns_rr_section() */
+
+
+static enum dns_type dns_rr_type(unsigned short src, struct dns_packet *P) {
+       struct dns_rr rr;
+       int error;
+
+       if ((error = dns_rr_parse(&rr, src, P)))
+               return 0;
+
+       return rr.type;
+} /* dns_rr_type() */
+
+
+int dns_rr_cmp(struct dns_rr *r0, struct dns_packet *P0, struct dns_rr *r1, struct dns_packet *P1) {
+       char host0[DNS_D_MAXNAME + 1], host1[DNS_D_MAXNAME + 1];
+       union dns_any any0, any1;
+       int cmp, error;
+       size_t len;
+
+       if ((cmp = r0->type - r1->type))
+               return cmp;
+
+       if ((cmp = r0->class - r1->class))
+               return cmp;
+
+       /*
+        * FIXME: Do label-by-label comparison to handle illegally long names?
+        */
+
+       if (!(len = dns_d_expand(host0, sizeof host0, r0->dn.p, P0, &error))
+       ||  len >= sizeof host0)
+               return -1;
+
+       if (!(len = dns_d_expand(host1, sizeof host1, r1->dn.p, P1, &error))
+       ||  len >= sizeof host1)
+               return 1;
+
+       if ((cmp = strcasecmp(host0, host1)))
+               return cmp;
+
+       if (DNS_S_QD & (r0->section | r1->section)) {
+               if (r0->section == r1->section)
+                       return 0;
+
+               return (r0->section == DNS_S_QD)? -1 : 1;
+       }
+
+       if ((error = dns_any_parse(&any0, r0, P0)))
+               return -1;
+
+       if ((error = dns_any_parse(&any1, r1, P1)))
+               return 1;
+
+       return dns_any_cmp(&any0, r0->type, &any1, r1->type);
+} /* dns_rr_cmp() */
+
+
+static _Bool dns_rr_exists(struct dns_rr *rr0, struct dns_packet *P0, struct dns_packet *P1) {
+       struct dns_rr rr1;
+
+       dns_rr_foreach(&rr1, P1, .section = rr0->section, .type = rr0->type) {
+               if (0 == dns_rr_cmp(rr0, P0, &rr1, P1))
+                       return 1;
+       }
+
+       return 0;
+} /* dns_rr_exists() */
+
+
+static unsigned short dns_rr_offset(struct dns_rr *rr) {
+       return rr->dn.p;
+} /* dns_rr_offset() */
+
+
+static _Bool dns_rr_i_match(struct dns_rr *rr, struct dns_rr_i *i, struct dns_packet *P) {
+       if (i->section && !(rr->section & i->section))
+               return 0;
+
+       if (i->type && rr->type != i->type && i->type != DNS_T_ALL)
+               return 0;
+
+       if (i->class && rr->class != i->class && i->class != DNS_C_ANY)
+               return 0;
+
+       if (i->name) {
+               char dn[DNS_D_MAXNAME + 1];
+               size_t len;
+               int error;
+
+               if (!(len = dns_d_expand(dn, sizeof dn, rr->dn.p, P, &error))
+               ||  len >= sizeof dn)
+                       return 0;
+
+               if (0 != strcasecmp(dn, i->name))
+                       return 0;
+       }
+
+       if (i->data && i->type && rr->section > DNS_S_QD) {
+               union dns_any rd;
+               int error;
+
+               if ((error = dns_any_parse(&rd, rr, P)))
+                       return 0;
+
+               if (0 != dns_any_cmp(&rd, rr->type, i->data, i->type))
+                       return 0;
+       }
+
+       return 1;
+} /* dns_rr_i_match() */
+
+
+static unsigned short dns_rr_i_start(struct dns_rr_i *i, struct dns_packet *P) {
+       unsigned short rp;
+       struct dns_rr r0, rr;
+       int error;
+
+       if ((i->section & DNS_S_QD) && P->qd.base)
+               rp = P->qd.base;
+       else if ((i->section & DNS_S_AN) && P->an.base)
+               rp = P->an.base;
+       else if ((i->section & DNS_S_NS) && P->ns.base)
+               rp = P->ns.base;
+       else if ((i->section & DNS_S_AR) && P->ar.base)
+               rp = P->ar.base;
+       else
+               rp = 12;
+
+       for (rp = 12; rp < P->end; rp = dns_rr_skip(rp, P)) {
+               if ((error = dns_rr_parse(&rr, rp, P)))
+                       continue;
+
+               rr.section = dns_rr_section(rp, P);
+
+               if (!dns_rr_i_match(&rr, i, P))
+                       continue;
+
+               r0 = rr;
+
+               goto lower;
+       }
+
+       return P->end;
+lower:
+       if (i->sort == &dns_rr_i_packet)
+               return dns_rr_offset(&r0);
+
+       while ((rp = dns_rr_skip(rp, P)) < P->end) {
+               if ((error = dns_rr_parse(&rr, rp, P)))
+                       continue;
+
+               rr.section = dns_rr_section(rp, P);
+
+               if (!dns_rr_i_match(&rr, i, P))
+                       continue;
+
+               if (i->sort(&rr, &r0, i, P) < 0)
+                       r0 = rr;
+       }
+
+       return dns_rr_offset(&r0);
+} /* dns_rr_i_start() */
+
+
+static unsigned short dns_rr_i_skip(unsigned short rp, struct dns_rr_i *i, struct dns_packet *P) {
+       struct dns_rr r0, r1, rr;
+       int error;
+
+       if ((error = dns_rr_parse(&r0, rp, P)))
+               return P->end;
+
+       r0.section = dns_rr_section(rp, P);
+
+       rp = (i->sort == &dns_rr_i_packet)? dns_rr_skip(rp, P) : 12;
+
+       for (; rp < P->end; rp = dns_rr_skip(rp, P)) {
+               if ((error = dns_rr_parse(&rr, rp, P)))
+                       continue;
+
+               rr.section = dns_rr_section(rp, P);
+
+               if (!dns_rr_i_match(&rr, i, P))
+                       continue;
+
+               if (i->sort(&rr, &r0, i, P) <= 0)
+                       continue;
+
+               r1 = rr;
+
+               goto lower;
+       }
+
+       return P->end;
+lower:
+       if (i->sort == &dns_rr_i_packet)
+               return dns_rr_offset(&r1);
+
+       while ((rp = dns_rr_skip(rp, P)) < P->end) {
+               if ((error = dns_rr_parse(&rr, rp, P)))
+                       continue;
+
+               rr.section = dns_rr_section(rp, P);
+
+               if (!dns_rr_i_match(&rr, i, P))
+                       continue;
+
+               if (i->sort(&rr, &r0, i, P) <= 0)
+                       continue;
+
+               if (i->sort(&rr, &r1, i, P) >= 0)
+                       continue;
+
+               r1 = rr;
+       }
+
+       return dns_rr_offset(&r1);
+} /* dns_rr_i_skip() */
+
+
+int dns_rr_i_packet(struct dns_rr *a, struct dns_rr *b, struct dns_rr_i *i __UNUSED__, struct dns_packet *P __UNUSED__) {
+       return (int)a->dn.p - (int)b->dn.p;
+} /* dns_rr_i_packet() */
+
+
+int dns_rr_i_order(struct dns_rr *a, struct dns_rr *b, struct dns_rr_i *i __UNUSED__, struct dns_packet *P) {
+       int cmp;
+
+       if ((cmp = a->section - b->section))
+               return cmp;
+
+       if (a->type != b->type)
+               return (int)a->dn.p - (int)b->dn.p;
+
+       return dns_rr_cmp(a, P, b, P);
+} /* dns_rr_i_order() */
+
+
+int dns_rr_i_shuffle(struct dns_rr *a, struct dns_rr *b, struct dns_rr_i *i, struct dns_packet *P __UNUSED__) {
+       int cmp;
+
+       while (!i->state.regs[0])
+               i->state.regs[0]        = dns_random();
+
+       if ((cmp = a->section - b->section))
+               return cmp;
+
+       return dns_k_shuffle16(a->dn.p, i->state.regs[0]) - dns_k_shuffle16(b->dn.p, i->state.regs[0]);
+} /* dns_rr_i_shuffle() */
+
+
+struct dns_rr_i *dns_rr_i_init(struct dns_rr_i *i, struct dns_packet *P __UNUSED__) {
+       static const struct dns_rr_i i_initializer;
+
+       i->state        = i_initializer.state;
+       i->saved        = i->state;
+
+       return i;
+} /* dns_rr_i_init() */
+
+
+unsigned dns_rr_grep(struct dns_rr *rr, unsigned lim, struct dns_rr_i *i, struct dns_packet *P, int *error_) {
+       unsigned count  = 0;
+       int error;
+
+       switch (i->state.exec) {
+       case 0:
+               if (!i->sort)
+                       i->sort = &dns_rr_i_packet;
+
+               i->state.next   = dns_rr_i_start(i, P);
+               i->state.exec++;
+
+               /* FALL THROUGH */
+       case 1:
+               while (count < lim && i->state.next < P->end) {
+                       if ((error = dns_rr_parse(rr, i->state.next, P)))
+                               goto error;
+
+                       rr->section     = dns_rr_section(i->state.next, P);
+
+                       rr++;
+                       count++;
+                       i->state.count++;
+
+                       i->state.next   = dns_rr_i_skip(i->state.next, i, P);
+               } /* while() */
+
+               break;
+       } /* switch() */
+
+       return count;
+error:
+       *error_ = error;
+
+       return count;
+} /* dns_rr_grep() */
+
+
+static size_t dns__printchar(void *dst, size_t lim, size_t cp, unsigned char ch) {
+       if (cp < lim)
+               ((unsigned char *)dst)[cp]      = ch;
+
+       return 1;
+} /* dns__printchar() */
+
+
+static size_t dns__printstring(void *dst, size_t lim, size_t cp, const void *src, size_t len) {
+       if (cp < lim)
+               memcpy(&((unsigned char *)dst)[cp], src, MIN(len, lim - cp));
+
+       return len;
+} /* dns__printstring() */
+
+#define dns__printstring5(a, b, c, d, e)       dns__printstring((a), (b), (c), (d), (e))
+#define dns__printstring4(a, b, c, d)          dns__printstring((a), (b), (c), (d), strlen((d)))
+#define dns__printstring(...)                  DNS_PP_CALL(DNS_PP_XPASTE(dns__printstring, DNS_PP_NARG(__VA_ARGS__)), __VA_ARGS__)
+
+
+static void dns__printnul(void *dst, size_t lim, size_t off) {
+       if (lim > 0)
+               ((unsigned char *)dst)[MIN(off, lim - 1)]       = '\0';
+} /* dns__printnul() */
+
+
+static size_t dns__print10(void *dst, size_t lim, size_t off, unsigned n, unsigned pad) {
+       unsigned char tmp[32];
+       unsigned dp     = off;
+       unsigned cp     = 0;
+       unsigned d      = 1000000000;
+       unsigned ch;
+
+       pad     = MAX(1, pad);
+       
+       while (d) {
+               if ((ch = n / d) || cp > 0) {
+                       n       -= ch * d;
+
+                       tmp[cp] = '0' + ch;
+
+                       cp++;
+               }
+
+               d       /= 10;
+       }
+
+       while (cp < pad) {
+               dp      += dns__printchar(dst, lim, dp, '0');
+               pad--;
+       }
+
+       dp      += dns__printstring(dst, lim, dp, tmp, cp);
+
+       return dp - off;
+} /* dns__print10() */
+
+
+size_t dns_rr_print(void *dst, size_t lim, struct dns_rr *rr, struct dns_packet *P, int *error_) {
+       union dns_any any;
+       size_t cp, n, rdlen;
+       void *rd;
+       int error;
+
+       cp      = 0;
+
+       if (rr->section == DNS_S_QD)
+               cp      += dns__printchar(dst, lim, cp, ';');
+
+       if (!(n = dns_d_expand(&((unsigned char *)dst)[cp], (cp < lim)? lim - cp : 0, rr->dn.p, P, &error)))
+               goto error;
+
+       cp      += n;
+
+       if (rr->section != DNS_S_QD) {
+               cp      += dns__printchar(dst, lim, cp, ' ');
+               cp      += dns__print10(dst, lim, cp, rr->ttl, 0);
+       }
+
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__printstring(dst, lim, cp, dns_strclass(rr->class), strlen(dns_strclass(rr->class)));
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__printstring(dst, lim, cp, dns_strtype(rr->type), strlen(dns_strtype(rr->type)));
+
+       if (rr->section == DNS_S_QD)
+               goto epilog;
+
+       cp      += dns__printchar(dst, lim, cp, ' ');
+
+       if ((error = dns_any_parse(dns_any_init(&any, sizeof any), rr, P)))
+               goto error;
+
+       if (cp < lim) {
+               rd      = &((unsigned char *)dst)[cp];
+               rdlen   = lim - cp;
+       } else {
+               rd      = 0;
+               rdlen   = 0;
+       }
+
+       cp      += dns_any_print(rd, rdlen, &any, rr->type);
+
+epilog:
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+error:
+       *error_ = error;
+
+       return 0;
+} /* dns_rr_print() */
+
+
+int dns_a_parse(struct dns_a *a, struct dns_rr *rr, struct dns_packet *P) {
+       unsigned long addr;
+
+       if (rr->rd.len != 4)
+               return DNS_EILLEGAL;
+
+       addr    = ((0xff & P->data[rr->rd.p + 0]) << 24)
+               | ((0xff & P->data[rr->rd.p + 1]) << 16)
+               | ((0xff & P->data[rr->rd.p + 2]) << 8)
+               | ((0xff & P->data[rr->rd.p + 3]) << 0);
+
+       a->addr.s_addr  = htonl(addr);
+
+       return 0;
+} /* dns_a_parse() */
+
+
+int dns_a_push(struct dns_packet *P, struct dns_a *a) {
+       unsigned long addr;
+
+       if (P->size - P->end < 6)
+               return DNS_ENOBUFS;
+
+       P->data[P->end++]       = 0x00;
+       P->data[P->end++]       = 0x04;
+
+       addr    = ntohl(a->addr.s_addr);
+
+       P->data[P->end++]       = 0xff & (addr >> 24);
+       P->data[P->end++]       = 0xff & (addr >> 16);
+       P->data[P->end++]       = 0xff & (addr >> 8);
+       P->data[P->end++]       = 0xff & (addr >> 0);
+
+       return 0;
+} /* dns_a_push() */
+
+
+size_t dns_a_arpa(void *dst, size_t lim, const struct dns_a *a) {
+       unsigned long a4        = ntohl(a->addr.s_addr);
+       size_t cp               = 0;
+       unsigned i;
+
+       for (i = 4; i > 0; i--) {
+               cp      += dns__print10(dst, lim, cp, (0xff & a4), 0);
+               cp      += dns__printchar(dst, lim, cp, '.');
+               a4      >>= 8;
+       }
+
+       cp      += dns__printstring(dst, lim, cp, "in-addr.arpa.");
+
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+} /* dns_a_arpa() */
+
+
+int dns_a_cmp(const struct dns_a *a, const struct dns_a *b) {
+       if (ntohl(a->addr.s_addr) < ntohl(b->addr.s_addr))
+               return -1;
+       if (ntohl(a->addr.s_addr) > ntohl(b->addr.s_addr))
+               return 1;
+
+       return 0;
+} /* dns_a_cmp() */
+
+
+size_t dns_a_print(void *dst, size_t lim, struct dns_a *a) {
+       char addr[INET_ADDRSTRLEN + 1]  = "0.0.0.0";
+       size_t len;
+
+       dns_inet_ntop(AF_INET, &a->addr, addr, sizeof addr);
+
+       dns__printnul(dst, lim, (len = dns__printstring(dst, lim, 0, addr)));
+
+       return len;
+} /* dns_a_print() */
+
+
+int dns_aaaa_parse(struct dns_aaaa *aaaa, struct dns_rr *rr, struct dns_packet *P) {
+       if (rr->rd.len != sizeof aaaa->addr.s6_addr)
+               return DNS_EILLEGAL;
+
+       memcpy(aaaa->addr.s6_addr, &P->data[rr->rd.p], sizeof aaaa->addr.s6_addr);
+
+       return 0;
+} /* dns_aaaa_parse() */
+
+
+int dns_aaaa_push(struct dns_packet *P, struct dns_aaaa *aaaa) {
+       if (P->size - P->end < 2 + sizeof aaaa->addr.s6_addr)
+               return DNS_ENOBUFS;
+
+       P->data[P->end++]       = 0x00;
+       P->data[P->end++]       = 0x10;
+
+       memcpy(&P->data[P->end], aaaa->addr.s6_addr, sizeof aaaa->addr.s6_addr);
+
+       P->end  += sizeof aaaa->addr.s6_addr;
+
+       return 0;
+} /* dns_aaaa_push() */
+
+
+int dns_aaaa_cmp(const struct dns_aaaa *a, const struct dns_aaaa *b) {
+       unsigned i;
+       int cmp;
+
+       for (i = 0; i < lengthof(a->addr.s6_addr); i++) {
+               if ((cmp = (a->addr.s6_addr[i] - b->addr.s6_addr[i])))
+                       return cmp;
+       }
+
+       return 0;
+} /* dns_aaaa_cmp() */
+
+
+size_t dns_aaaa_arpa(void *dst, size_t lim, const struct dns_aaaa *aaaa) {
+       static const unsigned char hex[16]      = "0123456789abcdef";
+       size_t cp               = 0;
+       unsigned nyble;
+       int i, j;
+
+       for (i = sizeof aaaa->addr.s6_addr - 1; i >= 0; i--) {
+               nyble   = aaaa->addr.s6_addr[i];
+
+               for (j = 0; j < 2; j++) {
+                       cp      += dns__printchar(dst, lim, cp, hex[0x0f & nyble]);
+                       cp      += dns__printchar(dst, lim, cp, '.');
+                       nyble   >>= 4;
+               }
+       }
+
+       cp      += dns__printstring(dst, lim, cp, "ip6.arpa.");
+
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+} /* dns_aaaa_arpa() */
+
+
+size_t dns_aaaa_print(void *dst, size_t lim, struct dns_aaaa *aaaa) {
+       char addr[INET6_ADDRSTRLEN + 1] = "::";
+       size_t len;
+
+       dns_inet_ntop(AF_INET6, &aaaa->addr, addr, sizeof addr);
+
+       dns__printnul(dst, lim, (len = dns__printstring(dst, lim, 0, addr)));
+
+       return len;
+} /* dns_aaaa_print() */
+
+
+int dns_mx_parse(struct dns_mx *mx, struct dns_rr *rr, struct dns_packet *P) {
+       size_t len;
+       int error;
+
+       if (rr->rd.len < 3)
+               return DNS_EILLEGAL;
+
+       mx->preference  = (0xff00 & (P->data[rr->rd.p + 0] << 8))
+                       | (0x00ff & (P->data[rr->rd.p + 1] << 0));
+
+       if (!(len = dns_d_expand(mx->host, sizeof mx->host, rr->rd.p + 2, P, &error)))
+               return error;
+       else if (len >= sizeof mx->host)
+               return DNS_EILLEGAL;
+
+       return 0;
+} /* dns_mx_parse() */
+
+
+int dns_mx_push(struct dns_packet *P, struct dns_mx *mx) {
+       size_t end, len;
+       int error;
+
+       if (P->size - P->end < 5)
+               return DNS_ENOBUFS;
+
+       end     = P->end;
+       P->end  += 2;
+
+       P->data[P->end++]       = 0xff & (mx->preference >> 8);
+       P->data[P->end++]       = 0xff & (mx->preference >> 0);
+
+       if ((error = dns_d_push(P, mx->host, strlen(mx->host))))
+               goto error;
+
+       len     = P->end - end - 2;
+
+       P->data[end + 0]        = 0xff & (len >> 8);
+       P->data[end + 1]        = 0xff & (len >> 0);
+
+       return 0;
+error:
+       P->end  = end;
+
+       return error;
+} /* dns_mx_push() */
+
+
+int dns_mx_cmp(const struct dns_mx *a, const struct dns_mx *b) {
+       int cmp;
+
+       if ((cmp = a->preference - b->preference))
+               return cmp;
+
+       return strcasecmp(a->host, b->host);
+} /* dns_mx_cmp() */
+
+
+size_t dns_mx_print(void *dst, size_t lim, struct dns_mx *mx) {
+       size_t cp       = 0;
+
+       cp      += dns__print10(dst, lim, cp, mx->preference, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__printstring(dst, lim, cp, mx->host, strlen(mx->host));
+
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+} /* dns_mx_print() */
+
+
+size_t dns_mx_cname(void *dst, size_t lim, struct dns_mx *mx) {
+       return dns_strlcpy(dst, mx->host, lim);
+} /* dns_mx_cname() */
+
+
+int dns_ns_parse(struct dns_ns *ns, struct dns_rr *rr, struct dns_packet *P) {
+       size_t len;
+       int error;
+
+       if (!(len = dns_d_expand(ns->host, sizeof ns->host, rr->rd.p, P, &error)))
+               return error;
+       else if (len >= sizeof ns->host)
+               return DNS_EILLEGAL;
+
+       return 0;
+} /* dns_ns_parse() */
+
+
+int dns_ns_push(struct dns_packet *P, struct dns_ns *ns) {
+       size_t end, len;
+       int error;
+
+       if (P->size - P->end < 3)
+               return DNS_ENOBUFS;
+
+       end     = P->end;
+       P->end  += 2;
+
+       if ((error = dns_d_push(P, ns->host, strlen(ns->host))))
+               goto error;
+
+       len     = P->end - end - 2;
+
+       P->data[end + 0]        = 0xff & (len >> 8);
+       P->data[end + 1]        = 0xff & (len >> 0);
+
+       return 0;
+error:
+       P->end  = end;
+
+       return error;
+} /* dns_ns_push() */
+
+
+int dns_ns_cmp(const struct dns_ns *a, const struct dns_ns *b) {
+       return strcasecmp(a->host, b->host);
+} /* dns_ns_cmp() */
+
+
+size_t dns_ns_print(void *dst, size_t lim, struct dns_ns *ns) {
+       size_t cp;
+
+       cp      = dns__printstring(dst, lim, 0, ns->host, strlen(ns->host));
+
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+} /* dns_ns_print() */
+
+
+size_t dns_ns_cname(void *dst, size_t lim, struct dns_ns *ns) {
+       return dns_strlcpy(dst, ns->host, lim);
+} /* dns_ns_cname() */
+
+
+int dns_cname_parse(struct dns_cname *cname, struct dns_rr *rr, struct dns_packet *P) {
+       return dns_ns_parse((struct dns_ns *)cname, rr, P);
+} /* dns_cname_parse() */
+
+
+int dns_cname_push(struct dns_packet *P, struct dns_cname *cname) {
+       return dns_ns_push(P, (struct dns_ns *)cname);
+} /* dns_cname_push() */
+
+
+int dns_cname_cmp(const struct dns_cname *a, const struct dns_cname *b) {
+       return strcasecmp(a->host, b->host);
+} /* dns_cname_cmp() */
+
+
+size_t dns_cname_print(void *dst, size_t lim, struct dns_cname *cname) {
+       return dns_ns_print(dst, lim, (struct dns_ns *)cname);
+} /* dns_cname_print() */
+
+
+size_t dns_cname_cname(void *dst, size_t lim, struct dns_cname *cname) {
+       return dns_strlcpy(dst, cname->host, lim);
+} /* dns_cname_cname() */
+
+
+int dns_soa_parse(struct dns_soa *soa, struct dns_rr *rr, struct dns_packet *P) {
+       struct { void *dst; size_t lim; } dn[] =
+               { { soa->mname, sizeof soa->mname },
+                 { soa->rname, sizeof soa->rname } };
+       unsigned *ts[] =
+               { &soa->serial, &soa->refresh, &soa->retry, &soa->expire, &soa->minimum };
+       unsigned short rp;
+       unsigned i, j, n;
+       int error;
+
+       /* MNAME / RNAME */
+       if ((rp = rr->rd.p) >= P->end)
+               return DNS_EILLEGAL;
+
+       for (i = 0; i < lengthof(dn); i++) {
+               if (!(n = dns_d_expand(dn[i].dst, dn[i].lim, rp, P, &error)))
+                       return error;
+               else if (n >= dn[i].lim)
+                       return DNS_EILLEGAL;
+
+               if ((rp = dns_d_skip(rp, P)) >= P->end)
+                       return DNS_EILLEGAL;
+       }
+
+       /* SERIAL / REFRESH / RETRY / EXPIRE / MINIMUM */
+       for (i = 0; i < lengthof(ts); i++) {
+               for (j = 0; j < 4; j++, rp++) {
+                       if (rp >= P->end)
+                               return DNS_EILLEGAL;
+
+                       *ts[i]  <<= 8;
+                       *ts[i]  |= (0xff & P->data[rp]);
+               }
+       }
+
+       return 0;
+} /* dns_soa_parse() */
+
+
+int dns_soa_push(struct dns_packet *P, struct dns_soa *soa) {
+       void *dn[]      = { soa->mname, soa->rname };
+       unsigned ts[]   = { (0xffffffff & soa->serial),
+                           (0x7fffffff & soa->refresh),
+                           (0x7fffffff & soa->retry),
+                           (0x7fffffff & soa->expire),
+                           (0xffffffff & soa->minimum) };
+       unsigned i, j;
+       size_t end, len;
+       int error;
+
+       end     = P->end;
+
+       if ((P->end += 2) >= P->size)
+               goto toolong;
+
+       /* MNAME / RNAME */
+       for (i = 0; i < lengthof(dn); i++) {
+               if ((error = dns_d_push(P, dn[i], strlen(dn[i]))))
+                       goto error;
+       }
+
+       /* SERIAL / REFRESH / RETRY / EXPIRE / MINIMUM */
+       for (i = 0; i < lengthof(ts); i++) {
+               if ((P->end += 4) >= P->size)
+                       goto toolong;
+
+               for (j = 1; j <= 4; j++) {
+                       P->data[P->end - j]     = (0xff & ts[i]);
+                       ts[i]                   >>= 8;
+               }
+       }
+
+       len                     = P->end - end - 2;
+       P->data[end + 0]        = (0xff & (len >> 8));
+       P->data[end + 1]        = (0xff & (len >> 0));
+
+       return 0;
+toolong:
+       error   = DNS_ENOBUFS;
+
+       /* FALL THROUGH */
+error:
+       P->end  = end;
+
+       return error;
+} /* dns_soa_push() */
+
+
+int dns_soa_cmp(const struct dns_soa *a, const struct dns_soa *b) {
+       int cmp;
+       
+       if ((cmp = strcasecmp(a->mname, b->mname)))
+               return cmp;
+
+       if ((cmp = strcasecmp(a->rname, b->rname)))
+               return cmp;
+
+       if (a->serial > b->serial)
+               return -1;
+       else if (a->serial < b->serial)
+               return 1;
+
+       if (a->refresh > b->refresh)
+               return -1;
+       else if (a->refresh < b->refresh)
+               return 1;
+
+       if (a->retry > b->retry)
+               return -1;
+       else if (a->retry < b->retry)
+               return 1;
+
+       if (a->expire > b->expire)
+               return -1;
+       else if (a->expire < b->expire)
+               return 1;
+
+       if (a->minimum > b->minimum)
+               return -1;
+       else if (a->minimum < b->minimum)
+               return 1;
+
+       return 0;
+} /* dns_soa_cmp() */
+
+
+size_t dns_soa_print(void *dst, size_t lim, struct dns_soa *soa) {
+       size_t cp       = 0;
+
+       cp      += dns__printstring(dst, lim, cp, soa->mname, strlen(soa->mname));
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__printstring(dst, lim, cp, soa->rname, strlen(soa->rname));
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__print10(dst, lim, cp, soa->serial, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__print10(dst, lim, cp, soa->refresh, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__print10(dst, lim, cp, soa->retry, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__print10(dst, lim, cp, soa->expire, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__print10(dst, lim, cp, soa->minimum, 0);
+
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+} /* dns_soa_print() */
+
+
+int dns_srv_parse(struct dns_srv *srv, struct dns_rr *rr, struct dns_packet *P) {
+       unsigned short rp;
+       unsigned i;
+       size_t n;
+       int error;
+
+       memset(srv, '\0', sizeof *srv);
+
+       rp      = rr->rd.p;
+
+       if (P->size - P->end < 6)
+               return DNS_EILLEGAL;
+
+       for (i = 0; i < 2; i++, rp++) {
+               srv->priority   <<= 8;
+               srv->priority   |= (0xff & P->data[rp]);
+       }
+
+       for (i = 0; i < 2; i++, rp++) {
+               srv->weight     <<= 8;
+               srv->weight     |= (0xff & P->data[rp]);
+       }
+
+       for (i = 0; i < 2; i++, rp++) {
+               srv->port       <<= 8;
+               srv->port       |= (0xff & P->data[rp]);
+       }
+
+       if (!(n = dns_d_expand(srv->target, sizeof srv->target, rp, P, &error)))
+               return error;
+       else if (n >= sizeof srv->target)
+               return DNS_EILLEGAL;
+
+       return 0;
+} /* dns_srv_parse() */
+
+
+int dns_srv_push(struct dns_packet *P, struct dns_srv *srv) {
+       size_t end, len;
+       int error;
+
+       end     = P->end;
+
+       if (P->size - P->end < 2)
+               goto toolong;
+
+       P->end  += 2;
+
+       if (P->size - P->end < 6)
+               goto toolong;
+
+       P->data[P->end++]       = 0xff & (srv->priority >> 8);
+       P->data[P->end++]       = 0xff & (srv->priority >> 0);
+
+       P->data[P->end++]       = 0xff & (srv->weight >> 8);
+       P->data[P->end++]       = 0xff & (srv->weight >> 0);
+
+       P->data[P->end++]       = 0xff & (srv->port >> 8);
+       P->data[P->end++]       = 0xff & (srv->port >> 0);
+
+       if (0 == (len = dns_d_comp(&P->data[P->end], P->size - P->end, srv->target, strlen(srv->target), P, &error)))
+               goto error;
+       else if (P->size - P->end < len)
+               goto toolong;
+
+       P->end  += len;
+
+       if (P->end > 65535)
+               goto toolong;
+
+       len     = P->end - end - 2;
+
+       P->data[end + 0]        = 0xff & (len >> 8);
+       P->data[end + 1]        = 0xff & (len >> 0);
+
+       return 0;
+toolong:
+       error   = DNS_ENOBUFS;
+
+       /* FALL THROUGH */
+error:
+       P->end  = end;
+
+       return error;
+} /* dns_srv_push() */
+
+
+int dns_srv_cmp(const struct dns_srv *a, const struct dns_srv *b) {
+       int cmp;
+       
+       if ((cmp = a->priority - b->priority))
+               return cmp;
+
+       /*
+        * FIXME: We need some sort of random seed to implement the dynamic
+        * weighting required by RFC 2782.
+        */
+       if ((cmp = a->weight - b->weight))
+               return cmp;
+
+       if ((cmp = a->port - b->port))
+               return cmp;
+
+       return strcasecmp(a->target, b->target);
+} /* dns_srv_cmp() */
+
+
+size_t dns_srv_print(void *dst, size_t lim, struct dns_srv *srv) {
+       size_t cp       = 0;
+
+       cp      += dns__print10(dst, lim, cp, srv->priority, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__print10(dst, lim, cp, srv->weight, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__print10(dst, lim, cp, srv->port, 0);
+       cp      += dns__printchar(dst, lim, cp, ' ');
+       cp      += dns__printstring(dst, lim, cp, srv->target, strlen(srv->target));
+
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+} /* dns_srv_print() */
+
+
+size_t dns_srv_cname(void *dst, size_t lim, struct dns_srv *srv) {
+       return dns_strlcpy(dst, srv->target, lim);
+} /* dns_srv_cname() */
+
+
+int dns_ptr_parse(struct dns_ptr *ptr, struct dns_rr *rr, struct dns_packet *P) {
+       return dns_ns_parse((struct dns_ns *)ptr, rr, P);
+} /* dns_ptr_parse() */
+
+
+int dns_ptr_push(struct dns_packet *P, struct dns_ptr *ptr) {
+       return dns_ns_push(P, (struct dns_ns *)ptr);
+} /* dns_ptr_push() */
+
+
+size_t dns_ptr_qname(void *dst, size_t lim, int af, void *addr) {
+       unsigned len    = (af == AF_INET6)
+                       ? dns_aaaa_arpa(dst, lim, addr)
+                       : dns_a_arpa(dst, lim, addr);
+
+       dns__printnul(dst, lim, len);
+
+       return len;
+} /* dns_ptr_qname() */
+
+
+int dns_ptr_cmp(const struct dns_ptr *a, const struct dns_ptr *b) {
+       return strcasecmp(a->host, b->host);
+} /* dns_ptr_cmp() */
+
+
+size_t dns_ptr_print(void *dst, size_t lim, struct dns_ptr *ptr) {
+       return dns_ns_print(dst, lim, (struct dns_ns *)ptr);
+} /* dns_ptr_print() */
+
+
+size_t dns_ptr_cname(void *dst, size_t lim, struct dns_ptr *ptr) {
+       return dns_strlcpy(dst, ptr->host, lim);
+} /* dns_ptr_cname() */
+
+
+int dns_sshfp_parse(struct dns_sshfp *fp, struct dns_rr *rr, struct dns_packet *P) {
+       unsigned p = rr->rd.p, pe = rr->rd.p + rr->rd.len;
+
+       if (pe - p < 2)
+               return DNS_EILLEGAL;
+
+       fp->algo = P->data[p++];
+       fp->type = P->data[p++];
+
+       switch (fp->type) {
+       case DNS_SSHFP_SHA1:
+               if (pe - p < sizeof fp->digest.sha1)
+                       return DNS_EILLEGAL;
+
+               memcpy(fp->digest.sha1, &P->data[p], sizeof fp->digest.sha1);
+
+               break;
+       default:
+               break;
+       } /* switch() */
+
+       return 0;
+} /* dns_sshfp_parse() */
+
+
+int dns_sshfp_push(struct dns_packet *P, struct dns_sshfp *fp) {
+       unsigned p = P->end, pe = P->size, n;
+
+       if (pe - p < 4)
+               return DNS_ENOBUFS;
+
+       p += 2;
+       P->data[p++] = 0xff & fp->algo;
+       P->data[p++] = 0xff & fp->type;
+
+       switch (fp->type) {
+       case DNS_SSHFP_SHA1:
+               if (pe - p < sizeof fp->digest.sha1)
+                       return DNS_ENOBUFS;
+
+               memcpy(&P->data[p], fp->digest.sha1, sizeof fp->digest.sha1);
+               p += sizeof fp->digest.sha1;
+
+               break;
+       default:
+               return DNS_EILLEGAL;
+       } /* switch() */
+
+       n = p - P->end - 2;
+       P->data[P->end++] = 0xff & (n >> 8);
+       P->data[P->end++] = 0xff & (n >> 0);
+       P->end = p;
+
+       return 0;
+} /* dns_sshfp_push() */
+
+
+int dns_sshfp_cmp(const struct dns_sshfp *a, const struct dns_sshfp *b) {
+       int cmp;
+
+       if ((cmp = a->algo - b->algo) || (cmp - a->type - b->type))
+               return cmp;
+
+       switch (a->type) {
+       case DNS_SSHFP_SHA1:
+               return memcmp(a->digest.sha1, b->digest.sha1, sizeof a->digest.sha1);
+       default:
+               return 0;
+       } /* switch() */
+
+       /* NOT REACHED */
+} /* dns_sshfp_cmp() */
+
+
+size_t dns_sshfp_print(void *dst, size_t lim, struct dns_sshfp *fp) {
+       static const unsigned char hex[16] = "0123456789abcdef";
+       size_t i, p = 0;
+
+       p += dns__print10(dst, lim, p, fp->algo, 0);
+       p += dns__printchar(dst, lim, p, ' ');
+       p += dns__print10(dst, lim, p, fp->type, 0);
+       p += dns__printchar(dst, lim, p, ' ');
+
+       switch (fp->type) {
+       case DNS_SSHFP_SHA1:
+               for (i = 0; i < sizeof fp->digest.sha1; i++) {
+                       p += dns__printchar(dst, lim, p, hex[0x0f & (fp->digest.sha1[i] >> 4)]);
+                       p += dns__printchar(dst, lim, p, hex[0x0f & (fp->digest.sha1[i] >> 0)]);
+               }
+
+               break;
+       default:
+               p += dns__printchar(dst, lim, p, '0');
+
+               break;
+       } /* switch() */
+
+       dns__printnul(dst, lim, p);
+
+       return p;
+} /* dns_sshfp_print() */
+
+
+struct dns_txt *dns_txt_init(struct dns_txt *txt, size_t size) {
+       assert(size > offsetof(struct dns_txt, data));
+
+       txt->size       = size - offsetof(struct dns_txt, data);
+       txt->len        = 0;
+
+       return txt;
+} /* dns_txt_init() */
+
+
+int dns_txt_parse(struct dns_txt *txt, struct dns_rr *rr, struct dns_packet *P) {
+       struct { unsigned char *b; size_t p, end; } dst, src;
+       unsigned n;
+
+       dst.b   = txt->data;
+       dst.p   = 0;
+       dst.end = txt->size;
+
+       src.b   = P->data;
+       src.p   = rr->rd.p;
+       src.end = src.p + rr->rd.len;
+
+       while (src.p < src.end) {
+               n       = 0xff & P->data[src.p++];
+
+               if (src.end - src.p < n || dst.end - dst.p < n)
+                       return DNS_EILLEGAL;
+
+               memcpy(&dst.b[dst.p], &src.b[src.p], n);
+
+               dst.p   += n;
+               src.p   += n;
+       }
+
+       txt->len        = dst.p;
+
+       return 0;
+} /* dns_txt_parse() */
+
+
+int dns_txt_push(struct dns_packet *P, struct dns_txt *txt) {
+       struct { unsigned char *b; size_t p, end; } dst, src;
+       unsigned n;
+
+       dst.b   = P->data;
+       dst.p   = P->end;
+       dst.end = P->size;
+
+       src.b   = txt->data;
+       src.p   = 0;
+       src.end = txt->len;
+
+       if (dst.end - dst.p < 2)
+               return DNS_ENOBUFS;
+
+       n       = txt->len + ((txt->len + 254) / 255);
+
+       dst.b[dst.p++]  = 0xff & (n >> 8);
+       dst.b[dst.p++]  = 0xff & (n >> 0);
+
+       while (src.p < src.end) {
+               n       = MIN(255, src.end - src.p);
+
+               if (dst.p >= dst.end)
+                       return DNS_ENOBUFS;
+
+               dst.b[dst.p++]  = n;
+
+               if (dst.end - dst.p < n)
+                       return DNS_ENOBUFS;
+
+               memcpy(&dst.b[dst.p], &src.b[src.p], n);
+
+               dst.p   += n;
+               src.p   += n;
+       }
+
+       P->end  = dst.p;
+
+       return 0;
+} /* dns_txt_push() */
+
+
+int dns_txt_cmp(const struct dns_txt *a __UNUSED__, const struct dns_txt *b __UNUSED__) {
+       return -1;
+} /* dns_txt_cmp() */
+
+
+size_t dns_txt_print(void *dst_, size_t lim, struct dns_txt *txt) {
+       struct { unsigned char *b; size_t p, end; } dst, src;
+       unsigned ch;
+
+       dst.b   = dst_;
+       dst.end = lim;
+       dst.p   = 0;
+
+       src.b   = txt->data;
+       src.end = txt->len;
+       src.p   = 0;
+
+       dst.p   += dns__printchar(dst.b, dst.end, dst.p, '"');
+
+       while (src.p < src.end) {
+               ch      = src.b[src.p];
+
+               if (0 == (src.p++ % 255) && src.p != 1) {
+                       dst.p   += dns__printchar(dst.b, dst.end, dst.p, '"');
+                       dst.p   += dns__printchar(dst.b, dst.end, dst.p, ' ');
+                       dst.p   += dns__printchar(dst.b, dst.end, dst.p, '"');
+               }
+
+               if (ch < 32 || ch > 126 || ch == '"' || ch == '\\') {
+                       dst.p   += dns__printchar(dst.b, dst.end, dst.p, '\\');
+                       dst.p   += dns__print10(dst.b, dst.end, dst.p, ch, 3);
+               } else {
+                       dst.p   += dns__printchar(dst.b, dst.end, dst.p, ch);
+               }
+       }
+
+       dst.p   += dns__printchar(dst.b, dst.end, dst.p, '"');
+
+       dns__printnul(dst.b, dst.end, dst.p);
+
+       return dst.p;
+} /* dns_txt_print() */
+
+
+static const struct {
+       enum dns_type type;
+       const char *name;
+       int (*parse)();
+       int (*push)();
+       int (*cmp)();
+       size_t (*print)();
+       size_t (*cname)();
+} dns_rrtypes[]        = {
+       { DNS_T_A,      "A",      &dns_a_parse,      &dns_a_push,      &dns_a_cmp,      &dns_a_print,      0                },
+       { DNS_T_AAAA,   "AAAA",   &dns_aaaa_parse,   &dns_aaaa_push,   &dns_aaaa_cmp,   &dns_aaaa_print,   0                },
+       { DNS_T_MX,     "MX",     &dns_mx_parse,     &dns_mx_push,     &dns_mx_cmp,     &dns_mx_print,     &dns_mx_cname    },
+       { DNS_T_NS,     "NS",     &dns_ns_parse,     &dns_ns_push,     &dns_ns_cmp,     &dns_ns_print,     &dns_ns_cname    },
+       { DNS_T_CNAME,  "CNAME",  &dns_cname_parse,  &dns_cname_push,  &dns_cname_cmp,  &dns_cname_print,  &dns_cname_cname },
+       { DNS_T_SOA,    "SOA",    &dns_soa_parse,    &dns_soa_push,    &dns_soa_cmp,    &dns_soa_print,    0                },
+       { DNS_T_SRV,    "SRV",    &dns_srv_parse,    &dns_srv_push,    &dns_srv_cmp,    &dns_srv_print,    &dns_srv_cname   },
+       { DNS_T_PTR,    "PTR",    &dns_ptr_parse,    &dns_ptr_push,    &dns_ptr_cmp,    &dns_ptr_print,    &dns_ptr_cname   },
+       { DNS_T_TXT,    "TXT",    &dns_txt_parse,    &dns_txt_push,    &dns_txt_cmp,    &dns_txt_print,    0                },
+       { DNS_T_SPF,    "SPF",    &dns_txt_parse,    &dns_txt_push,    &dns_txt_cmp,    &dns_txt_print,    0                },
+       { DNS_T_SSHFP,  "SSHFP",  &dns_sshfp_parse,  &dns_sshfp_push,  &dns_sshfp_cmp,  &dns_sshfp_print,  0                },
+}; /* dns_rrtypes[] */
+
+
+union dns_any *dns_any_init(union dns_any *any, size_t size) {
+       return (union dns_any *)dns_txt_init(&any->rdata, size);
+} /* dns_any_init() */
+
+
+int dns_any_parse(union dns_any *any, struct dns_rr *rr, struct dns_packet *P) {
+       unsigned i;
+
+       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+               if (dns_rrtypes[i].type == rr->type)
+                       return dns_rrtypes[i].parse(any, rr, P);
+       }
+
+       if (rr->rd.len > any->rdata.size)
+               return DNS_EILLEGAL;
+
+       memcpy(any->rdata.data, &P->data[rr->rd.p], rr->rd.len);
+       any->rdata.len  = rr->rd.len;
+
+       return 0;
+} /* dns_any_parse() */
+
+
+int dns_any_push(struct dns_packet *P, union dns_any *any, enum dns_type type) {
+       unsigned i;
+
+       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+               if (dns_rrtypes[i].type == type)
+                       return dns_rrtypes[i].push(P, any);
+       }
+
+       if (P->size - P->end < any->rdata.len + 2)
+               return DNS_ENOBUFS;
+
+       P->data[P->end++]       = 0xff & (any->rdata.len >> 8);
+       P->data[P->end++]       = 0xff & (any->rdata.len >> 0);
+
+       memcpy(&P->data[P->end], any->rdata.data, any->rdata.len);
+       P->end  += any->rdata.len;
+
+       return 0;
+} /* dns_any_push() */
+
+
+int dns_any_cmp(const union dns_any *a, enum dns_type x, const union dns_any *b, enum dns_type y) {
+       unsigned i;
+       int cmp;
+
+       if ((cmp = x - y))
+               return cmp;
+
+       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+               if (dns_rrtypes[i].type == x)
+                       return dns_rrtypes[i].cmp(a, b);
+       }
+
+       return -1;
+} /* dns_any_cmp() */
+
+
+size_t dns_any_print(void *dst_, size_t lim, union dns_any *any, enum dns_type type) {
+       struct { unsigned char *b; size_t p, end; } dst, src;
+       unsigned i, ch;
+
+       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+               if (dns_rrtypes[i].type == type)
+                       return dns_rrtypes[i].print(dst_, lim, any);
+       }
+
+       dst.b   = dst_;
+       dst.end = lim;
+       dst.p   = 0;
+
+       src.b   = any->rdata.data;
+       src.end = any->rdata.len;
+       src.p   = 0;
+
+       dst.p   += dns__printchar(dst.b, dst.end, dst.p, '"');
+
+       while (src.p < src.end) {
+               ch      = src.b[src.p++];
+
+               dst.p   += dns__printchar(dst.b, dst.end, dst.p, '\\');
+               dst.p   += dns__print10(dst.b, dst.end, dst.p, ch, 3);
+       }
+
+       dst.p   += dns__printchar(dst.b, dst.end, dst.p, '"');
+
+       dns__printnul(dst.b, dst.end, dst.p);
+
+       return dst.p;
+} /* dns_any_print() */
+
+
+size_t dns_any_cname(void *dst, size_t lim, union dns_any *any, enum dns_type type) {
+       unsigned i;
+
+       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+               if (dns_rrtypes[i].type == type)
+                       return (dns_rrtypes[i].cname)? dns_rrtypes[i].cname(dst, lim, any) : 0;
+       }
+
+       return 0;
+} /* dns_any_cname() */
+
+
+/*
+ * H O S T S  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_hosts {
+       struct dns_hosts_entry {
+               char host[DNS_D_MAXNAME + 1];
+               char arpa[73 + 1];
+
+               int af;
+
+               union {
+                       struct in_addr a4;
+                       struct in6_addr a6;
+               } addr;
+
+               _Bool alias;
+
+               struct dns_hosts_entry *next;
+       } *head, **tail;
+
+       dns_atomic_t refcount;
+}; /* struct dns_hosts */
+
+
+struct dns_hosts *dns_hosts_open(int *error) {
+       static const struct dns_hosts hosts_initializer = { .refcount = 1 };
+       struct dns_hosts *hosts;
+
+       if (!(hosts = malloc(sizeof *hosts)))
+               goto syerr;
+
+       *hosts  = hosts_initializer;
+
+       hosts->tail     = &hosts->head;
+
+       return hosts;
+syerr:
+       *error  = dns_syerr();
+
+       free(hosts);
+
+       return 0;
+} /* dns_hosts_open() */
+
+
+void dns_hosts_close(struct dns_hosts *hosts) {
+       struct dns_hosts_entry *ent, *xnt;
+
+       if (!hosts || 1 != dns_hosts_release(hosts))
+               return;
+
+       for (ent = hosts->head; ent; ent = xnt) {
+               xnt     = ent->next;
+
+               free(ent);
+       }
+
+       free(hosts);
+
+       return;
+} /* dns_hosts_close() */
+
+
+unsigned dns_hosts_acquire(struct dns_hosts *hosts) {
+       return dns_atomic_inc(&hosts->refcount);
+} /* dns_hosts_acquire() */
+
+
+unsigned dns_hosts_release(struct dns_hosts *hosts) {
+       return dns_atomic_dec(&hosts->refcount);
+} /* dns_hosts_release() */
+
+
+struct dns_hosts *dns_hosts_mortal(struct dns_hosts *hosts) {
+       if (hosts)
+               dns_hosts_release(hosts);
+
+       return hosts;
+} /* dns_hosts_mortal() */
+
+
+struct dns_hosts *dns_hosts_local(int *error_) {
+       struct dns_hosts *hosts;
+       int error;
+
+       if (!(hosts = dns_hosts_open(&error)))
+               goto error;
+               
+       if ((error = dns_hosts_loadpath(hosts, "/etc/hosts")))
+               goto error;
+
+       return hosts;
+error:
+       *error_ = error;
+
+       dns_hosts_close(hosts);
+
+       return 0;
+} /* dns_hosts_local() */
+
+
+#define dns_hosts_issep(ch)    (isspace(ch))
+#define dns_hosts_iscom(ch)    ((ch) == '#' || (ch) == ';')
+
+int dns_hosts_loadfile(struct dns_hosts *hosts, FILE *fp) {
+       struct dns_hosts_entry ent;
+       char word[MAX(INET6_ADDRSTRLEN, DNS_D_MAXNAME) + 1];
+       unsigned wp, wc, skip;
+       int ch, error;
+
+       rewind(fp);
+
+       do {
+               memset(&ent, '\0', sizeof ent);
+               wc      = 0;
+               skip    = 0;
+
+               do {
+                       memset(word, '\0', sizeof word);
+                       wp      = 0;
+
+                       while (EOF != (ch = fgetc(fp)) && ch != '\n') {
+                               skip    |= !!dns_hosts_iscom(ch);
+
+                               if (skip)
+                                       continue;
+
+                               if (dns_hosts_issep(ch))
+                                       break;
+
+                               if (wp < sizeof word - 1)
+                                       word[wp]        = ch;
+                               wp++;
+                       }
+
+                       if (!wp)
+                               continue;
+
+                       wc++;
+
+                       switch (wc) {
+                       case 0:
+                               break;
+                       case 1:
+                               ent.af  = (strchr(word, ':'))? AF_INET6 : AF_INET;
+                               skip    = (1 != dns_inet_pton(ent.af, word, &ent.addr));
+
+                               break;
+                       default:
+                               if (!wp)
+                                       break;
+
+                               dns_d_anchor(ent.host, sizeof ent.host, word, wp);
+
+                               if ((error = dns_hosts_insert(hosts, ent.af, &ent.addr, ent.host, (wc > 2))))
+                                       return error;
+
+                               break;
+                       } /* switch() */
+               } while (ch != EOF && ch != '\n');
+       } while (ch != EOF);
+
+       return 0;
+} /* dns_hosts_loadfile() */
+
+
+int dns_hosts_loadpath(struct dns_hosts *hosts, const char *path) {
+       FILE *fp;
+       int error;
+
+       if (!(fp = fopen(path, "r")))
+               return dns_syerr();
+
+       error   = dns_hosts_loadfile(hosts, fp);
+
+       fclose(fp);
+
+       return error;
+} /* dns_hosts_loadpath() */
+
+
+int dns_hosts_dump(struct dns_hosts *hosts, FILE *fp) {
+       struct dns_hosts_entry *ent, *xnt;
+       char addr[INET6_ADDRSTRLEN + 1];
+       unsigned i;
+
+       for (ent = hosts->head; ent; ent = xnt) {
+               xnt     = ent->next;
+
+               dns_inet_ntop(ent->af, &ent->addr, addr, sizeof addr);
+
+               fputs(addr, fp);
+
+               for (i = strlen(addr); i < INET_ADDRSTRLEN; i++)
+                       fputc(' ', fp);
+
+               fputc(' ', fp);
+
+               fputs(ent->host, fp);
+               fputc('\n', fp);
+       }
+
+       return 0;
+} /* dns_hosts_dump() */
+
+
+int dns_hosts_insert(struct dns_hosts *hosts, int af, const void *addr, const void *host, _Bool alias) {
+       struct dns_hosts_entry *ent;
+       int error;
+
+       if (!(ent = malloc(sizeof *ent)))
+               goto syerr;
+
+       dns_d_anchor(ent->host, sizeof ent->host, host, strlen(host));
+
+       switch ((ent->af = af)) {
+       case AF_INET6:
+               memcpy(&ent->addr.a6, addr, sizeof ent->addr.a6);
+
+               dns_aaaa_arpa(ent->arpa, sizeof ent->arpa, addr);
+
+               break;
+       case AF_INET:
+               memcpy(&ent->addr.a4, addr, sizeof ent->addr.a4);
+
+               dns_a_arpa(ent->arpa, sizeof ent->arpa, addr);
+
+               break;
+       default:
+               error   = EINVAL;
+
+               goto error;
+       } /* switch() */
+
+       ent->alias      = alias;
+
+       ent->next       = 0;
+       *hosts->tail    = ent;
+       hosts->tail     = &ent->next;
+
+       return 0;
+syerr:
+       error   = dns_syerr();
+error:
+       free(ent);
+
+       return error;
+} /* dns_hosts_insert() */
+
+
+struct dns_packet *dns_hosts_query(struct dns_hosts *hosts, struct dns_packet *Q, int *error_) {
+       struct dns_packet *P    = dns_p_new(512);
+       struct dns_packet *A    = 0;
+       struct dns_rr rr;
+       struct dns_hosts_entry *ent;
+       int error, af;
+       char qname[DNS_D_MAXNAME + 1];
+       size_t qlen;
+
+       if ((error = dns_rr_parse(&rr, 12, Q)))
+               goto error;
+
+       if (!(qlen = dns_d_expand(qname, sizeof qname, rr.dn.p, Q, &error)))
+               goto error;
+       else if (qlen >= sizeof qname)
+               goto toolong;
+
+       if ((error = dns_p_push(P, DNS_S_QD, qname, qlen, rr.type, rr.class, 0, 0)))
+               goto error;
+
+       switch (rr.type) {
+       case DNS_T_PTR:
+               for (ent = hosts->head; ent; ent = ent->next) {
+                       if (ent->alias || 0 != strcasecmp(qname, ent->arpa))
+                               continue;
+
+                       if ((error = dns_p_push(P, DNS_S_AN, qname, qlen, rr.type, rr.class, 0, ent->host)))
+                               goto error;
+               }
+
+               break;
+       case DNS_T_AAAA:
+               af      = AF_INET6;
+
+               goto loop;
+       case DNS_T_A:
+               af      = AF_INET;
+
+loop:          for (ent = hosts->head; ent; ent = ent->next) {
+                       if (ent->af != af || 0 != strcasecmp(qname, ent->host))
+                               continue;
+
+                       if ((error = dns_p_push(P, DNS_S_AN, qname, qlen, rr.type, rr.class, 0, &ent->addr)))
+                               goto error;
+               }
+
+               break;
+       default:
+               break;
+       } /* switch() */
+
+
+       if (!(A = dns_p_copy(dns_p_make(P->end, &error), P)))
+               goto error;
+
+       return A;
+toolong:
+       error = DNS_EILLEGAL;
+error:
+       *error_ = error;
+
+       free(A);
+
+       return 0;
+} /* dns_hosts_query() */
+
+
+/*
+ * R E S O L V . C O N F  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_resolv_conf *dns_resconf_open(int *error) {
+       static const struct dns_resolv_conf resconf_initializer
+               = { .lookup = "bf", .options = { .ndots = 1, .timeout = 5, .attempts = 2, .tcp = DNS_RESCONF_TCP_ENABLE, },
+                   .iface = { .ss_family = AF_INET }, };
+       struct dns_resolv_conf *resconf;
+       struct sockaddr_in *sin;
+
+       if (!(resconf = malloc(sizeof *resconf)))
+               goto syerr;
+
+       *resconf = resconf_initializer;
+
+       sin = (struct sockaddr_in *)&resconf->nameserver[0];
+       sin->sin_family      = AF_INET;
+       sin->sin_addr.s_addr = INADDR_ANY;
+       sin->sin_port        = htons(53);
+#if defined(SA_LEN)
+       sin->sin_len         = sizeof *sin;
+#endif
+
+       if (0 != gethostname(resconf->search[0], sizeof resconf->search[0]))
+               goto syerr;
+
+       dns_d_anchor(resconf->search[0], sizeof resconf->search[0], resconf->search[0], strlen(resconf->search[0]));
+       dns_d_cleave(resconf->search[0], sizeof resconf->search[0], resconf->search[0], strlen(resconf->search[0]));
+
+       /*
+        * XXX: If gethostname() returned a string without any label
+        *      separator, then search[0][0] should be NUL.
+        */
+
+       dns_resconf_acquire(resconf);
+
+       return resconf;
+syerr:
+       *error  = dns_syerr();
+
+       free(resconf);
+
+       return 0;
+} /* dns_resconf_open() */
+
+
+void dns_resconf_close(struct dns_resolv_conf *resconf) {
+       if (!resconf || 1 != dns_resconf_release(resconf))
+               return /* void */;
+
+       free(resconf);
+} /* dns_resconf_close() */
+
+
+unsigned dns_resconf_acquire(struct dns_resolv_conf *resconf) {
+       return dns_atomic_inc(&resconf->_.refcount);
+} /* dns_resconf_acquire() */
+
+
+unsigned dns_resconf_release(struct dns_resolv_conf *resconf) {
+       return dns_atomic_dec(&resconf->_.refcount);
+} /* dns_resconf_release() */
+
+
+struct dns_resolv_conf *dns_resconf_mortal(struct dns_resolv_conf *resconf) {
+       if (resconf)
+               dns_resconf_release(resconf);
+
+       return resconf;
+} /* dns_resconf_mortal() */
+
+
+struct dns_resolv_conf *dns_resconf_local(int *error_) {
+       struct dns_resolv_conf *resconf;
+       int error;
+
+       if (!(resconf = dns_resconf_open(&error)))
+               goto error;
+
+       if ((error = dns_resconf_loadpath(resconf, "/etc/resolv.conf")))
+               goto error;
+
+       return resconf;
+error:
+       *error_ = error;
+
+       dns_resconf_close(resconf);
+
+       return 0;
+} /* dns_resconf_local() */
+
+
+struct dns_resolv_conf *dns_resconf_root(int *error_) {
+       struct dns_resolv_conf *resconf;
+       int error;
+
+       if (!(resconf = dns_resconf_open(&error)))
+               goto error;
+
+       if ((error = dns_resconf_loadpath(resconf, "/etc/resolv.conf")))
+               goto error;
+
+       resconf->options.recurse        = 1;
+
+       return resconf;
+error:
+       *error_ = error;
+
+       dns_resconf_close(resconf);
+
+       return 0;
+} /* dns_resconf_root() */
+
+
+enum dns_resconf_keyword {
+       DNS_RESCONF_NAMESERVER,
+       DNS_RESCONF_DOMAIN,
+       DNS_RESCONF_SEARCH,
+       DNS_RESCONF_LOOKUP,
+       DNS_RESCONF_FILE,
+       DNS_RESCONF_BIND,
+       DNS_RESCONF_CACHE,
+       DNS_RESCONF_OPTIONS,
+       DNS_RESCONF_EDNS0,
+       DNS_RESCONF_NDOTS,
+       DNS_RESCONF_TIMEOUT,
+       DNS_RESCONF_ATTEMPTS,
+       DNS_RESCONF_ROTATE,
+       DNS_RESCONF_RECURSE,
+       DNS_RESCONF_SMART,
+       DNS_RESCONF_TCP,
+       DNS_RESCONF_TCPx,
+       DNS_RESCONF_INTERFACE,
+       DNS_RESCONF_ZERO,
+       DNS_RESCONF_ONE,
+       DNS_RESCONF_ENABLE,
+       DNS_RESCONF_ONLY,
+       DNS_RESCONF_DISABLE,
+}; /* enum dns_resconf_keyword */ 
+
+static enum dns_resconf_keyword dns_resconf_keyword(const char *word) {
+       static const char *words[]      = {
+               [DNS_RESCONF_NAMESERVER]        = "nameserver",
+               [DNS_RESCONF_DOMAIN]            = "domain",
+               [DNS_RESCONF_SEARCH]            = "search",
+               [DNS_RESCONF_LOOKUP]            = "lookup",
+               [DNS_RESCONF_FILE]              = "file",
+               [DNS_RESCONF_BIND]              = "bind",
+               [DNS_RESCONF_CACHE]             = "cache",
+               [DNS_RESCONF_OPTIONS]           = "options",
+               [DNS_RESCONF_EDNS0]             = "edns0",
+               [DNS_RESCONF_ROTATE]            = "rotate",
+               [DNS_RESCONF_RECURSE]           = "recurse",
+               [DNS_RESCONF_SMART]             = "smart",
+               [DNS_RESCONF_TCP]               = "tcp",
+               [DNS_RESCONF_INTERFACE]         = "interface",
+               [DNS_RESCONF_ZERO]              = "0",
+               [DNS_RESCONF_ONE]               = "1",
+               [DNS_RESCONF_ENABLE]            = "enable",
+               [DNS_RESCONF_ONLY]              = "only",
+               [DNS_RESCONF_DISABLE]           = "disable",
+       };
+       unsigned i;
+
+       for (i = 0; i < lengthof(words); i++) {
+               if (words[i] && 0 == strcasecmp(words[i], word))
+                       return i;
+       }
+
+       if (0 == strncasecmp(word, "ndots:", sizeof "ndots:" - 1))
+               return DNS_RESCONF_NDOTS;
+
+       if (0 == strncasecmp(word, "timeout:", sizeof "timeout:" - 1))
+               return DNS_RESCONF_TIMEOUT;
+
+       if (0 == strncasecmp(word, "attempts:", sizeof "attempts:" - 1))
+               return DNS_RESCONF_ATTEMPTS;
+
+       if (0 == strncasecmp(word, "tcp:", sizeof "tcp:" - 1))
+               return DNS_RESCONF_TCPx;
+
+       return -1;
+} /* dns_resconf_keyword() */
+
+
+/** OpenBSD-style "[1.2.3.4]:53" nameserver syntax */
+static int dns_resconf_pton(struct sockaddr_storage *ss, const char *src) {
+       struct { char buf[128], *p; } addr = { "", addr.buf };
+       unsigned short port = 0;
+       int ch, af = AF_INET;
+
+       while ((ch = *src++)) {
+               switch (ch) {
+               case ' ':
+                       /* FALL THROUGH */
+               case '\t':
+                       break;
+               case '[':
+                       break;
+               case ']':
+                       while ((ch = *src++)) {
+                               if (isdigit((unsigned char)ch)) {
+                                       port *= 10;
+                                       port += ch - '0';
+                               }
+                       }
+
+                       goto inet;
+               case ':':
+                       af = AF_INET6;
+
+                       /* FALL THROUGH */
+               default:
+                       if (addr.p < endof(addr.buf) - 1)
+                               *addr.p++ = ch;
+
+                       break;
+               } /* switch() */
+       } /* while() */
+inet:
+
+       switch (dns_inet_pton(af, addr.buf, dns_sa_addr(af, ss))) {
+       case -1:
+               return errno;
+       case 0:
+               return EINVAL;
+       } /* switch() */
+
+       port = (!port)? 53 : port;
+       *dns_sa_port(af, ss) = htons(port);
+       dns_sa_family(ss) = af;
+
+       return 0;
+} /* dns_resconf_pton() */
+
+#define dns_resconf_issep(ch)  (isspace(ch) || (ch) == ',')
+#define dns_resconf_iscom(ch)  ((ch) == '#' || (ch) == ';')
+
+int dns_resconf_loadfile(struct dns_resolv_conf *resconf, FILE *fp) {
+       unsigned sa_count       = 0;
+       char words[6][DNS_D_MAXNAME + 1];
+       unsigned wp, wc, i, j, n;
+       int ch, error;
+
+       rewind(fp);
+
+       do {
+               memset(words, '\0', sizeof words);
+               wp      = 0;
+               wc      = 0;
+
+               while (EOF != (ch = getc(fp)) && ch != '\n') {
+                       if (dns_resconf_issep(ch)) {
+                               if (wp > 0) {
+                                       wp      = 0;
+
+                                       if (++wc >= lengthof(words))
+                                               goto skip;
+                               }
+                       } else if (dns_resconf_iscom(ch)) {
+skip:
+                               do {
+                                       ch      = getc(fp);
+                               } while (ch != EOF && ch != '\n');
+
+                               break;
+                       } else {
+                               dns__printchar(words[wc], sizeof words[wc], wp, ch);
+                               wp++;
+                       }
+               }
+
+               if (wp > 0)
+                       wc++;
+
+               if (wc < 2)
+                       continue;
+
+               switch (dns_resconf_keyword(words[0])) {
+               case DNS_RESCONF_NAMESERVER:
+                       if (sa_count >= lengthof(resconf->nameserver))
+                               continue;
+
+                       if ((error = dns_resconf_pton(&resconf->nameserver[sa_count], words[1])))
+                               continue;
+
+                       sa_count++;
+
+                       break;
+               case DNS_RESCONF_DOMAIN:
+               case DNS_RESCONF_SEARCH:
+                       memset(resconf->search, '\0', sizeof resconf->search);
+
+                       for (i = 1, j = 0; i < wc && j < lengthof(resconf->search); i++, j++)
+                               dns_d_anchor(resconf->search[j], sizeof resconf->search[j], words[i], strlen(words[i]));
+
+                       break;
+               case DNS_RESCONF_LOOKUP:
+                       for (i = 1, j = 0; i < wc && j < lengthof(resconf->lookup); i++) {
+                               switch (dns_resconf_keyword(words[i])) {
+                               case DNS_RESCONF_FILE:
+                                       resconf->lookup[j++]    = 'f';
+
+                                       break;
+                               case DNS_RESCONF_BIND:
+                                       resconf->lookup[j++]    = 'b';
+
+                                       break;
+                               case DNS_RESCONF_CACHE:
+                                       resconf->lookup[j++]    = 'c';
+
+                                       break;
+                               default:
+                                       break;
+                               } /* switch() */
+                       } /* for() */
+
+                       break;
+               case DNS_RESCONF_OPTIONS:
+                       for (i = 1; i < wc; i++) {
+                               switch (dns_resconf_keyword(words[i])) {
+                               case DNS_RESCONF_EDNS0:
+                                       resconf->options.edns0  = 1;
+
+                                       break;
+                               case DNS_RESCONF_NDOTS:
+                                       for (j = sizeof "ndots:" - 1, n = 0; isdigit((int)words[i][j]); j++) {
+                                               n       *= 10;
+                                               n       += words[i][j] - '0';
+                                       } /* for() */
+
+                                       resconf->options.ndots  = n;
+
+                                       break;
+                               case DNS_RESCONF_TIMEOUT:
+                                       for (j = sizeof "timeout:" - 1, n = 0; isdigit((int)words[i][j]); j++) {
+                                               n       *= 10;
+                                               n       += words[i][j] - '0';
+                                       } /* for() */
+
+                                       resconf->options.timeout        = n;
+
+                                       break;
+                               case DNS_RESCONF_ATTEMPTS:
+                                       for (j = sizeof "attempts:" - 1, n = 0; isdigit((int)words[i][j]); j++) {
+                                               n       *= 10;
+                                               n       += words[i][j] - '0';
+                                       } /* for() */
+
+                                       resconf->options.attempts       = n;
+
+                                       break;
+                               case DNS_RESCONF_ROTATE:
+                                       resconf->options.rotate         = 1;
+
+                                       break;
+                               case DNS_RESCONF_RECURSE:
+                                       resconf->options.recurse        = 1;
+
+                                       break;
+                               case DNS_RESCONF_SMART:
+                                       resconf->options.smart          = 1;
+
+                                       break;
+                               case DNS_RESCONF_TCP:
+                                       resconf->options.tcp            = DNS_RESCONF_TCP_ONLY;
+
+                                       break;
+                               case DNS_RESCONF_TCPx:
+                                       switch (dns_resconf_keyword(&words[i][sizeof "tcp:" - 1])) {
+                                       case DNS_RESCONF_ENABLE:
+                                               resconf->options.tcp    = DNS_RESCONF_TCP_ENABLE;
+
+                                               break;
+                                       case DNS_RESCONF_ONE:
+                                       case DNS_RESCONF_ONLY:
+                                               resconf->options.tcp    = DNS_RESCONF_TCP_ONLY;
+
+                                               break;
+                                       case DNS_RESCONF_ZERO:
+                                       case DNS_RESCONF_DISABLE:
+                                               resconf->options.tcp    = DNS_RESCONF_TCP_DISABLE;
+
+                                               break;
+                                       default:
+                                               break;
+                                       } /* switch() */
+
+                                       break;
+                               default:
+                                       break;
+                               } /* switch() */
+                       } /* for() */
+
+                       break;
+               case DNS_RESCONF_INTERFACE:
+                       for (i = 0, n = 0; isdigit((int)words[2][i]); i++) {
+                               n       *= 10;
+                               n       += words[2][i] - '0';
+                       }
+
+                       dns_resconf_setiface(resconf, words[1], n);
+
+                       break;
+               default:
+                       break;
+               } /* switch() */
+       } while (ch != EOF);
+
+       return 0;
+} /* dns_resconf_loadfile() */
+
+
+int dns_resconf_loadpath(struct dns_resolv_conf *resconf, const char *path) {
+       FILE *fp;
+       int error;
+
+       if (!(fp = fopen(path, "r")))
+               return dns_syerr();
+
+       error   = dns_resconf_loadfile(resconf, fp);
+
+       fclose(fp);
+
+       return error;
+} /* dns_resconf_loadpath() */
+
+
+int dns_resconf_setiface(struct dns_resolv_conf *resconf, const char *addr, unsigned short port) {
+       int af  = (strchr(addr, ':'))? AF_INET6 : AF_INET;
+
+       if (1 != dns_inet_pton(af, addr, dns_sa_addr(af, &resconf->iface)))
+               return dns_soerr();
+
+       *dns_sa_port(af, &resconf->iface)       = htons(port);
+       resconf->iface.ss_family                = af;
+
+       return 0;
+} /* dns_resconf_setiface() */
+
+
+size_t dns_resconf_search(void *dst, size_t lim, const void *qname, size_t qlen, struct dns_resolv_conf *resconf, dns_resconf_i_t *state) {
+       unsigned srchi          = 0xff & (*state >> 8);
+       unsigned ndots          = 0xff & (*state >> 16);
+       unsigned slen, len      = 0;
+       const char *qp, *qe;
+
+//     assert(0xff > lengthof(resconf->search));
+
+       switch (0xff & *state) {
+       case 0:
+               qp      = qname;
+               qe      = qp + qlen;
+
+               while ((qp = memchr(qp, '.', qe - qp)))
+                       { ndots++; qp++; }
+
+               ++*state;
+
+               if (ndots >= resconf->options.ndots) {
+                       len     = dns_d_anchor(dst, lim, qname, qlen);
+
+                       break;
+               }
+
+               /* FALL THROUGH */
+       case 1:
+               if (srchi < lengthof(resconf->search) && (slen = strlen(resconf->search[srchi]))) {
+                       len     = dns__printstring(dst, lim, 0, qname, qlen);
+                       len     = dns_d_anchor(dst, lim, dst, len);
+                       len     += dns__printstring(dst, lim, len, resconf->search[srchi], slen);
+
+                       srchi++;
+
+                       break;
+               }
+
+               ++*state;
+
+               /* FALL THROUGH */
+       case 2:
+               ++*state;
+
+               if (ndots < resconf->options.ndots) {
+                       len     = dns_d_anchor(dst, lim, qname, qlen);
+
+                       break;
+               }
+
+               /* FALL THROUGH */
+       default:
+               break;
+       } /* switch() */
+
+       dns__printnul(dst, lim, len);
+
+       *state  = ((0xff & *state) << 0)
+               | ((0xff & srchi) << 8)
+               | ((0xff & ndots) << 16);
+
+       return len;
+} /* dns_resconf_search() */
+
+
+int dns_resconf_dump(struct dns_resolv_conf *resconf, FILE *fp) {
+       unsigned i;
+       int af;
+
+       for (i = 0; i < lengthof(resconf->nameserver) && (af = resconf->nameserver[i].ss_family) != AF_UNSPEC; i++) {
+               char addr[INET6_ADDRSTRLEN + 1] = "[INVALID]";
+               unsigned short port;
+
+               dns_inet_ntop(af, dns_sa_addr(af, &resconf->nameserver[i]), addr, sizeof addr);
+               port = ntohs(*dns_sa_port(af, &resconf->nameserver[i]));
+
+               if (port == 53)
+                       fprintf(fp, "nameserver %s\n", addr);
+               else
+                       fprintf(fp, "nameserver [%s]:%hu\n", addr, port);
+       }
+
+
+       fprintf(fp, "search");
+
+       for (i = 0; i < lengthof(resconf->search) && resconf->search[i][0]; i++)
+               fprintf(fp, " %s", resconf->search[i]);
+
+       fputc('\n', fp);
+
+
+       fprintf(fp, "lookup");
+
+       for (i = 0; i < lengthof(resconf->lookup) && resconf->lookup[i]; i++) {
+               switch (resconf->lookup[i]) {
+               case 'b':
+                       fprintf(fp, " bind"); break;
+               case 'f':
+                       fprintf(fp, " file"); break;
+               case 'c':
+                       fprintf(fp, " cache"); break;
+               }
+       }
+
+       fputc('\n', fp);
+
+
+       fprintf(fp, "options ndots:%u timeout:%u attempts:%u", resconf->options.ndots, resconf->options.timeout, resconf->options.attempts);
+
+       if (resconf->options.edns0)
+               fprintf(fp, " edns0");
+       if (resconf->options.rotate)
+               fprintf(fp, " rotate");
+       if (resconf->options.recurse)
+               fprintf(fp, " recurse");
+       if (resconf->options.smart)
+               fprintf(fp, " smart");
+
+       fputc('\n', fp);
+
+
+       if ((af = resconf->iface.ss_family) != AF_UNSPEC) {
+               char addr[INET6_ADDRSTRLEN + 1] = "[INVALID]";
+
+               dns_inet_ntop(af, dns_sa_addr(af, &resconf->iface), addr, sizeof addr);
+
+               fprintf(fp, "interface %s %hu\n", addr, ntohs(*dns_sa_port(af, &resconf->iface)));
+       }
+
+       return 0;
+} /* dns_resconf_dump() */
+
+
+/*
+ * H I N T  S E R V E R  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_hints_soa {
+       unsigned char zone[DNS_D_MAXNAME + 1];
+       
+       struct {
+               struct sockaddr_storage ss;
+               unsigned priority;
+       } addrs[16];
+
+       unsigned count;
+
+       struct dns_hints_soa *next;
+}; /* struct dns_hints_soa */
+
+
+struct dns_hints {
+       dns_atomic_t refcount;
+
+       struct dns_hints_soa *head;
+}; /* struct dns_hints */
+
+
+struct dns_hints *dns_hints_open(struct dns_resolv_conf *resconf __UNUSED__, int *error) {
+       static const struct dns_hints H_initializer;
+       struct dns_hints *H;
+
+       if (!(H = malloc(sizeof *H)))
+               goto syerr;
+
+       *H      = H_initializer;
+
+       dns_hints_acquire(H);
+
+       return H;
+syerr:
+       *error  = dns_syerr();
+
+       free(H);
+
+       return 0;
+} /* dns_hints_open() */
+
+
+void dns_hints_close(struct dns_hints *H) {
+       struct dns_hints_soa *soa, *nxt;
+
+       if (!H || 1 != dns_hints_release(H))
+               return /* void */;
+
+       for (soa = H->head; soa; soa = nxt) {
+               nxt     = soa->next;
+
+               free(soa);
+       }
+
+       free(H);
+
+       return /* void */;
+} /* dns_hints_close() */
+
+
+unsigned dns_hints_acquire(struct dns_hints *H) {
+       return dns_atomic_inc(&H->refcount);
+} /* dns_hints_acquire() */
+
+
+unsigned dns_hints_release(struct dns_hints *H) {
+       return dns_atomic_dec(&H->refcount);
+} /* dns_hints_release() */
+
+
+struct dns_hints *dns_hints_mortal(struct dns_hints *hints) {
+       if (hints)
+               dns_hints_release(hints);
+
+       return hints;
+} /* dns_hints_mortal() */
+
+
+struct dns_hints *dns_hints_local(struct dns_resolv_conf *resconf, int *error_) {
+       struct dns_hints *hints         = 0;
+       int error;
+
+       if (resconf)
+               dns_resconf_acquire(resconf);
+       else if (!(resconf = dns_resconf_local(&error)))
+               goto error;
+
+       if (!(hints = dns_hints_open(resconf, &error)))
+               goto error;
+
+       error   = 0;
+
+       if (0 == dns_hints_insert_resconf(hints, ".", resconf, &error) && error)
+               goto error;
+
+       dns_resconf_close(resconf);
+
+       return hints;
+error:
+       *error_ = error;
+
+       dns_resconf_close(resconf);
+       dns_hints_close(hints);
+
+       return 0;
+} /* dns_hints_local() */
+
+
+struct dns_hints *dns_hints_root(struct dns_resolv_conf *resconf, int *error_) {
+       static const struct {
+               int af;
+               char addr[INET6_ADDRSTRLEN];
+       } root_hints[] = {
+               { AF_INET,      "198.41.0.4"            },      /* A.ROOT-SERVERS.NET. */
+               { AF_INET6,     "2001:503:ba3e::2:30"   },      /* A.ROOT-SERVERS.NET. */
+               { AF_INET,      "192.228.79.201"        },      /* B.ROOT-SERVERS.NET. */
+               { AF_INET,      "192.33.4.12"           },      /* C.ROOT-SERVERS.NET. */
+               { AF_INET,      "128.8.10.90"           },      /* D.ROOT-SERVERS.NET. */
+               { AF_INET,      "192.203.230.10"        },      /* E.ROOT-SERVERS.NET. */
+               { AF_INET,      "192.5.5.241"           },      /* F.ROOT-SERVERS.NET. */
+               { AF_INET6,     "2001:500:2f::f"        },      /* F.ROOT-SERVERS.NET. */
+               { AF_INET,      "192.112.36.4"          },      /* G.ROOT-SERVERS.NET. */
+               { AF_INET,      "128.63.2.53"           },      /* H.ROOT-SERVERS.NET. */
+               { AF_INET6,     "2001:500:1::803f:235"  },      /* H.ROOT-SERVERS.NET. */
+               { AF_INET,      "192.36.148.17"         },      /* I.ROOT-SERVERS.NET. */
+               { AF_INET,      "192.58.128.30"         },      /* J.ROOT-SERVERS.NET. */
+               { AF_INET6,     "2001:503:c27::2:30"    },      /* J.ROOT-SERVERS.NET. */
+       };
+       struct dns_hints *hints         = 0;
+       struct sockaddr_storage ss;
+       unsigned i;
+       int error, af;
+
+       if (!(hints = dns_hints_open(resconf, &error)))
+               goto error;
+
+       for (i = 0; i < lengthof(root_hints); i++) {
+               af      = root_hints[i].af;
+
+               if (1 != dns_inet_pton(af, root_hints[i].addr, dns_sa_addr(af, &ss)))
+                       goto soerr;
+
+               *dns_sa_port(af, &ss)   = htons(53);
+               ss.ss_family            = af;
+
+               if ((error = dns_hints_insert(hints, ".", (struct sockaddr *)&ss, 1)))
+                       goto error;
+       }
+
+       return hints;
+soerr:
+       error   = dns_soerr();
+
+       goto error;
+error:
+       *error_ = error;
+
+       dns_hints_close(hints);
+
+       return 0;
+} /* dns_hints_root() */
+
+
+static struct dns_hints_soa *dns_hints_fetch(struct dns_hints *H, const char *zone) {
+       struct dns_hints_soa *soa;
+
+       for (soa = H->head; soa; soa = soa->next) {
+               if (0 == strcasecmp(zone, (char *)soa->zone))
+                       return soa;
+       }
+
+       return 0;
+} /* dns_hints_fetch() */
+
+
+int dns_hints_insert(struct dns_hints *H, const char *zone, const struct sockaddr *sa, unsigned priority) {
+       static const struct dns_hints_soa soa_initializer;
+       struct dns_hints_soa *soa;
+       unsigned i;
+
+       if (!(soa = dns_hints_fetch(H, zone))) {
+               if (!(soa = malloc(sizeof *soa)))
+                       return dns_syerr();
+
+               *soa    = soa_initializer;
+
+               dns__printstring(soa->zone, sizeof soa->zone, 0, zone);
+
+               soa->next       = H->head;
+               H->head         = soa;
+       }
+
+       i       = soa->count % lengthof(soa->addrs);
+
+       memcpy(&soa->addrs[i].ss, sa, dns_sa_len(sa));
+
+       soa->addrs[i].priority  = MAX(1, priority);
+
+       if (soa->count < lengthof(soa->addrs))
+               soa->count++;
+
+       return 0;
+} /* dns_hints_insert() */
+
+
+unsigned dns_hints_insert_resconf(struct dns_hints *H, const char *zone, const struct dns_resolv_conf *resconf, int *error_) {
+       unsigned i, n, p;
+       int error;
+
+       for (i = 0, n = 0, p = 1; i < lengthof(resconf->nameserver) && resconf->nameserver[i].ss_family != AF_UNSPEC; i++, n++) {
+               if ((error = dns_hints_insert(H, zone, (struct sockaddr *)&resconf->nameserver[i], p)))
+                       goto error;
+
+               p       += !resconf->options.rotate;
+       }
+
+       return n;
+error:
+       *error_ = error;
+
+       return n;
+} /* dns_hints_insert_resconf() */
+
+
+static int dns_hints_i_cmp(unsigned a, unsigned b, struct dns_hints_i *i, struct dns_hints_soa *soa) {
+       int cmp;
+
+       if ((cmp = soa->addrs[a].priority - soa->addrs[b].priority))
+               return cmp;
+
+       return dns_k_shuffle16(a, i->state.seed) - dns_k_shuffle16(b, i->state.seed);
+} /* dns_hints_i_cmp() */
+
+
+static unsigned dns_hints_i_start(struct dns_hints_i *i, struct dns_hints_soa *soa) {
+       unsigned p0, p;
+
+       p0      = 0;
+
+       for (p = 1; p < soa->count; p++) {
+               if (dns_hints_i_cmp(p, p0, i, soa) < 0)
+                       p0      = p;
+       }
+
+       return p0;
+} /* dns_hints_i_start() */
+
+
+static unsigned dns_hints_i_skip(unsigned p0, struct dns_hints_i *i, struct dns_hints_soa *soa) {
+       unsigned pZ, p;
+
+       for (pZ = 0; pZ < soa->count; pZ++) {
+               if (dns_hints_i_cmp(pZ, p0, i, soa) > 0)
+                       goto cont;
+       }
+
+       return soa->count;
+cont:
+       for (p = pZ + 1; p < soa->count; p++) {
+               if (dns_hints_i_cmp(p, p0, i, soa) <= 0)
+                       continue;
+
+               if (dns_hints_i_cmp(p, pZ, i, soa) >= 0)
+                       continue;
+
+               pZ      = p;
+       }
+
+
+       return pZ;
+} /* dns_hints_i_skip() */
+
+
+struct dns_hints_i *dns_hints_i_init(struct dns_hints_i *i, struct dns_hints *hints) {
+       static const struct dns_hints_i i_initializer;
+       struct dns_hints_soa *soa;
+
+       i->state        = i_initializer.state;
+
+       do {
+               i->state.seed   = dns_random();
+       } while (0 == i->state.seed);
+
+       if ((soa = dns_hints_fetch(hints, i->zone))) {
+               i->state.next   = dns_hints_i_start(i, soa);
+       }
+
+       return i;
+} /* dns_hints_i_init() */
+
+
+unsigned dns_hints_grep(struct sockaddr **sa, socklen_t *sa_len, unsigned lim, struct dns_hints_i *i, struct dns_hints *H) {
+       struct dns_hints_soa *soa;
+       unsigned n;
+
+       if (!(soa = dns_hints_fetch(H, i->zone)))
+               return 0;
+
+       n       = 0;
+
+       while (i->state.next < soa->count && n < lim) {
+               *sa     = (struct sockaddr *)&soa->addrs[i->state.next].ss;
+               *sa_len = dns_sa_len(*sa);
+
+               sa++;
+               sa_len++;
+               n++;
+
+               i->state.next   = dns_hints_i_skip(i->state.next, i, soa);
+       }
+
+       return n;
+} /* dns_hints_grep() */
+
+
+struct dns_packet *dns_hints_query(struct dns_hints *hints, struct dns_packet *Q, int *error_) {
+       struct dns_packet *A, *P;
+       struct dns_rr rr;
+       char zone[DNS_D_MAXNAME + 1];
+       size_t zlen;
+       struct dns_hints_i i;
+       struct sockaddr *sa;
+       socklen_t slen;
+       int error;
+
+       if (!dns_rr_grep(&rr, 1, dns_rr_i_new(Q, .section = DNS_S_QUESTION), Q, &error))
+               goto error;
+
+       if (!(zlen = dns_d_expand(zone, sizeof zone, rr.dn.p, Q, &error)))
+               goto error;
+       else if (zlen >= sizeof zone)
+               goto toolong;
+
+       P                       = dns_p_new(512);
+       dns_header(P)->qr       = 1;
+
+       if ((error = dns_rr_copy(P, &rr, Q)))
+               goto error;
+
+       if ((error = dns_p_push(P, DNS_S_AUTHORITY, ".", strlen("."), DNS_T_NS, DNS_C_IN, 0, "hints.local.")))
+               goto error;
+
+       do {
+               i.zone  = zone;
+
+               dns_hints_i_init(&i, hints);
+
+               while (dns_hints_grep(&sa, &slen, 1, &i, hints)) {
+                       int af          = sa->sa_family;
+                       int rtype       = (af == AF_INET6)? DNS_T_AAAA : DNS_T_A;
+
+                       if ((error = dns_p_push(P, DNS_S_ADDITIONAL, "hints.local.", strlen("hints.local."), rtype, DNS_C_IN, 0, dns_sa_addr(af, sa))))
+                               goto error;
+               }
+       } while ((zlen = dns_d_cleave(zone, sizeof zone, zone, zlen)));
+
+       if (!(A = dns_p_copy(dns_p_make(P->end, &error), P)))
+               goto error;
+
+       return A;
+toolong:
+       error = DNS_EILLEGAL;
+error:
+       *error_ = error;
+
+       return 0;
+} /* dns_hints_query() */
+
+
+/** ugly hack to support specifying ports other than 53 in resolv.conf. */
+static unsigned short dns_hints_port(struct dns_hints *hints, int af, void *addr) {
+       struct dns_hints_soa *soa;
+       unsigned short port;
+       unsigned i;
+
+       for (soa = hints->head; soa; soa = soa->next) {
+               for (i = 0; i < soa->count; i++) {
+                       if (af != soa->addrs[i].ss.ss_family)
+                               continue;
+
+                       if (memcmp(addr, dns_sa_addr(af, &soa->addrs[i].ss), (af == AF_INET6)? sizeof (struct in6_addr) : sizeof (struct in_addr)))
+                               continue;
+
+                       port = *dns_sa_port(af, &soa->addrs[i].ss);
+
+                       return (port)? port : htons(53);
+               }
+       }
+
+       return htons(53);
+} /* dns_hints_port() */
+
+
+int dns_hints_dump(struct dns_hints *hints, FILE *fp) {
+       struct dns_hints_soa *soa;
+       char addr[INET6_ADDRSTRLEN];
+       unsigned i;
+       int af;
+
+       for (soa = hints->head; soa; soa = soa->next) {
+               fprintf(fp, "ZONE \"%s\"\n", soa->zone);
+
+               for (i = 0; i < soa->count; i++) {
+                       af      = soa->addrs[i].ss.ss_family;
+                       if (!dns_inet_ntop(af, dns_sa_addr(af, &soa->addrs[i].ss), addr, sizeof addr))
+                               return dns_soerr();
+
+                       fprintf(fp, "\t(%d) [%s]:%hu\n", (int)soa->addrs[i].priority, addr, ntohs(*dns_sa_port(af, &soa->addrs[i].ss)));
+               }
+       }
+
+       return 0;
+} /* dns_hints_dump() */
+
+
+/*
+ * C A C H E  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+static dns_atomic_t dns_cache_acquire(struct dns_cache *cache __UNUSED__) {
+       return 0;
+} /* dns_cache_acquire() */
+
+
+static dns_atomic_t dns_cache_release(struct dns_cache *cache __UNUSED__) {
+       return 0;
+} /* dns_cache_release() */
+
+
+static struct dns_packet *dns_cache_query(struct dns_packet *query __UNUSED__, struct dns_cache *cache __UNUSED__, int *error __UNUSED__) {
+       return 0;
+} /* dns_cache_submit() */
+
+
+static int dns_cache_submit(struct dns_packet *query __UNUSED__, struct dns_cache *cache __UNUSED__) {
+       return 0;
+} /* dns_cache_submit() */
+
+
+static int dns_cache_check(struct dns_cache *cache __UNUSED__) {
+       return 0;
+} /* dns_cache_check() */
+
+
+static struct dns_packet *dns_cache_fetch(struct dns_cache *cache __UNUSED__, int *error __UNUSED__) {
+       return 0;
+} /* dns_cache_fetch() */
+
+
+static int dns_cache_pollfd(struct dns_cache *cache __UNUSED__) {
+       return -1;
+} /* dns_cache_pollfd() */
+
+
+static short dns_cache_events(struct dns_cache *cache __UNUSED__) {
+       return 0;
+} /* dns_cache_events() */
+
+
+static void dns_cache_clear(struct dns_cache *cache __UNUSED__) {
+       return;
+} /* dns_cache_clear() */
+
+
+struct dns_cache *dns_cache_init(struct dns_cache *cache) {
+       static const struct dns_cache c_init = {
+               .acquire = &dns_cache_acquire,
+               .release = &dns_cache_release,
+               .query   = &dns_cache_query,
+               .submit  = &dns_cache_submit,
+               .check   = &dns_cache_check,
+               .fetch   = &dns_cache_fetch,
+               .pollfd  = &dns_cache_pollfd,
+               .events  = &dns_cache_events,
+               .clear   = &dns_cache_clear,
+       };
+
+       *cache = c_init;
+
+       return cache;
+} /* dns_cache_init() */
+
+
+void dns_cache_close(struct dns_cache *cache) {
+       if (cache)
+               cache->release(cache);
+} /* dns_cache_close() */
+
+
+/*
+ * S O C K E T  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+static void dns_socketclose(int *fd) {
+       if (*fd != -1) {
+#if _WIN32
+               closesocket(*fd);
+#else
+               close(*fd);
+#endif
+               *fd     = -1;
+       }
+} /* dns_socketclose() */
+
+
+#define DNS_SO_MAXTRY  7
+
+static int dns_socket(struct sockaddr *local, int type, int *error_) {
+       int error, fd   = -1;
+#if defined(O_NONBLOCK)
+       int flags;
+#elif defined(FIONBIO)
+       unsigned long opt;
+#endif
+
+       if (-1 == (fd = socket(local->sa_family, type, 0)))
+               goto soerr;
+
+#if defined(F_SETFD)
+       if (-1 == fcntl(fd, F_SETFD, 1))
+               goto syerr;
+#endif
+
+#if defined(O_NONBLOCK)
+       if (-1 == (flags = fcntl(fd, F_GETFL)))
+               goto syerr;
+
+       if (-1 == fcntl(fd, F_SETFL, flags | O_NONBLOCK))
+               goto syerr;
+#elif defined(FIONBIO)
+       opt     = 1;
+
+       if (0 != ioctlsocket(fd, FIONBIO, &opt))
+               goto soerr;
+#endif
+
+       if (local->sa_family != AF_INET && local->sa_family != AF_INET6)
+               return fd;
+
+       if (type != SOCK_DGRAM)
+               return fd;
+
+       if (*dns_sa_port(local->sa_family, local) == 0) {
+               struct sockaddr_storage tmp;
+               unsigned i, port;
+
+               memcpy(&tmp, local, dns_sa_len(local));
+
+               for (i = 0; i < DNS_SO_MAXTRY; i++) {
+                       port    = 1025 + (dns_random() % 64510);
+
+                       *dns_sa_port(tmp.ss_family, &tmp)       = htons(port);
+
+                       if (0 == bind(fd, (struct sockaddr *)&tmp, dns_sa_len(&tmp)))
+                               return fd;
+               }
+       }
+       
+       if (0 == bind(fd, local, dns_sa_len(local)))
+               return fd;
+
+       /* FALL THROUGH */
+soerr:
+       error   = dns_soerr();
+
+       goto error;
+syerr:
+       error   = dns_syerr();
+
+       goto error;
+error:
+       *error_ = error;
+
+       dns_socketclose(&fd);
+
+       return -1;
+} /* dns_socket() */
+
+
+enum {
+       DNS_SO_UDP_INIT = 1,
+       DNS_SO_UDP_CONN,
+       DNS_SO_UDP_SEND,
+       DNS_SO_UDP_RECV,
+       DNS_SO_UDP_DONE,
+
+       DNS_SO_TCP_INIT,
+       DNS_SO_TCP_CONN,
+       DNS_SO_TCP_SEND,
+       DNS_SO_TCP_RECV,
+       DNS_SO_TCP_DONE,
+};
+
+struct dns_socket {
+       struct dns_options opts;
+
+       int udp;
+       int tcp;
+
+       int *old;
+       unsigned onum, olim;
+
+       int type;
+
+       struct sockaddr_storage local, remote;
+
+       struct dns_k_permutor qids;
+
+       struct dns_stat stat;
+
+       /*
+        * NOTE: dns_so_reset() zeroes everything from here down.
+        */
+       int state;
+
+       unsigned short qid;
+       char qname[DNS_D_MAXNAME + 1];
+       size_t qlen;
+       enum dns_type qtype;
+       enum dns_class qclass;
+
+       struct dns_packet *query;
+       size_t qout;
+
+       time_t began;
+
+       struct dns_packet *answer;
+       size_t alen, apos;
+}; /* struct dns_socket() */
+
+
+/*
+ * NOTE: Actual closure delayed so that kqueue(2) and epoll(2) callers have
+ * a chance to recognize a state change after installing a persistent event
+ * and where sequential descriptors with the same integer value returned
+ * from _pollfd() would be ambiguous. See dns_so_closefds().
+ */
+static int dns_so_closefd(struct dns_socket *so, int *fd) {
+       int error;
+
+       if (*fd == -1)
+               return 0;
+
+       if (so->opts.closefd.cb) {
+               if ((error = so->opts.closefd.cb(fd, so->opts.closefd.arg))) {
+                       return error;
+               } else if (*fd == -1)
+                       return 0;
+       }
+
+       if (!(so->onum < so->olim)) {
+               unsigned olim = MAX(4, so->olim * 2);
+               void *old;
+
+               if (!(old = realloc(so->old, sizeof so->old[0] * olim)))
+                       return dns_syerr();
+
+               so->old  = old;
+               so->olim = olim;
+       }
+
+       so->old[so->onum++] = *fd;
+       *fd = -1;
+
+       return 0;
+} /* dns_so_closefd() */
+
+
+#define DNS_SO_CLOSE_UDP 0x01
+#define DNS_SO_CLOSE_TCP 0x02
+#define DNS_SO_CLOSE_OLD 0x04
+#define DNS_SO_CLOSE_ALL (DNS_SO_CLOSE_UDP|DNS_SO_CLOSE_TCP|DNS_SO_CLOSE_OLD)
+
+static void dns_so_closefds(struct dns_socket *so, int which) {
+       if (DNS_SO_CLOSE_UDP & which)
+               dns_socketclose(&so->udp);
+       if (DNS_SO_CLOSE_TCP & which)
+               dns_socketclose(&so->tcp);
+       if (DNS_SO_CLOSE_OLD & which) {
+               unsigned i;
+               for (i = 0; i < so->onum; i++)
+                       dns_socketclose(&so->old[i]);
+               so->onum = 0;
+               free(so->old);
+               so->old  = 0;
+               so->olim = 0;
+       }
+} /* dns_so_closefds() */
+
+
+static void dns_so_destroy(struct dns_socket *);
+
+static struct dns_socket *dns_so_init(struct dns_socket *so, const struct sockaddr *local, int type, const struct dns_options *opts, int *error) {
+       static const struct dns_socket so_initializer = { .opts = DNS_OPTS_INITIALIZER, .udp = -1, .tcp = -1, };
+
+       *so             = so_initializer;
+       so->type        = type;
+
+       if (opts)
+               so->opts = *opts;
+
+       if (local)
+               memcpy(&so->local, local, dns_sa_len(local));
+
+       if (-1 == (so->udp = dns_socket((struct sockaddr *)&so->local, SOCK_DGRAM, error)))
+               goto error;
+
+       dns_k_permutor_init(&so->qids, 1, 65535);
+
+       return so;
+error:
+       dns_so_destroy(so);
+
+       return 0;       
+} /* dns_so_init() */
+
+
+struct dns_socket *dns_so_open(const struct sockaddr *local, int type, const struct dns_options *opts, int *error) {
+       struct dns_socket *so;
+
+       if (!(so = malloc(sizeof *so)))
+               goto syerr;
+
+       if (!dns_so_init(so, local, type, opts, error))
+               goto error;
+
+       return so;
+syerr:
+       *error  = dns_syerr();
+error:
+       dns_so_close(so);
+
+       return 0;       
+} /* dns_so_open() */
+
+
+static void dns_so_destroy(struct dns_socket *so) {
+       dns_so_reset(so);
+       dns_so_closefds(so, DNS_SO_CLOSE_ALL);
+} /* dns_so_destroy() */
+
+
+void dns_so_close(struct dns_socket *so) {
+       if (!so)
+               return;
+
+       dns_so_destroy(so);
+
+       free(so);
+} /* dns_so_close() */
+
+
+void dns_so_reset(struct dns_socket *so) {
+       free(so->answer);
+
+       memset(&so->state, '\0', sizeof *so - offsetof(struct dns_socket, state));
+} /* dns_so_reset() */
+
+
+unsigned short dns_so_mkqid(struct dns_socket *so) {
+       return dns_k_permutor_step(&so->qids);
+} /* dns_so_mkqid() */
+
+
+#define DNS_SO_MINBUF  768
+
+static int dns_so_newanswer(struct dns_socket *so, size_t len) {
+       size_t size     = offsetof(struct dns_packet, data) + MAX(len, DNS_SO_MINBUF);
+       void *p;
+
+       if (!(p = realloc(so->answer, size)))
+               return dns_syerr();
+
+       so->answer      = dns_p_init(p, size);
+
+       return 0;
+} /* dns_so_newanswer() */
+
+
+int dns_so_submit(struct dns_socket *so, struct dns_packet *Q, struct sockaddr *host) {
+       struct dns_rr rr;
+       int error       = -1;
+
+       dns_so_reset(so);
+
+       if ((error = dns_rr_parse(&rr, 12, Q)))
+               goto error;
+
+       if (!(so->qlen = dns_d_expand(so->qname, sizeof so->qname, rr.dn.p, Q, &error)))
+               goto error;
+       /*
+        * NOTE: don't bail if expansion is too long; caller may be
+        * intentionally sending long names. However, we won't be able to
+        * verify it on return.
+        */
+
+       so->qtype       = rr.type;
+       so->qclass      = rr.class;
+
+       if ((error = dns_so_newanswer(so, DNS_SO_MINBUF)))
+               goto syerr;
+
+       memcpy(&so->remote, host, dns_sa_len(host));
+
+       so->query       = Q;
+       so->qout        = 0;
+       so->began       = dns_now();
+
+       if (dns_header(so->query)->qid == 0)
+               dns_header(so->query)->qid      = dns_so_mkqid(so);
+
+       so->qid         = dns_header(so->query)->qid;
+       so->state       = (so->type == SOCK_STREAM)? DNS_SO_TCP_INIT : DNS_SO_UDP_INIT;
+
+       so->stat.queries++;
+
+       return 0;
+syerr:
+       error   = dns_syerr();
+error:
+       dns_so_reset(so);
+
+       return error;
+} /* dns_so_submit() */
+
+
+static int dns_so_verify(struct dns_socket *so, struct dns_packet *P) {
+       char qname[DNS_D_MAXNAME + 1];
+       size_t qlen;
+       struct dns_rr rr;
+       int error       = -1;
+
+       if (so->qid != dns_header(so->answer)->qid)
+               return DNS_EUNKNOWN;
+
+       if (!dns_p_count(so->answer, DNS_S_QD))
+               return DNS_EUNKNOWN;
+
+       if (0 != dns_rr_parse(&rr, 12, so->answer))
+               return DNS_EUNKNOWN;
+
+       if (rr.type != so->qtype || rr.class != so->qclass)
+               return DNS_EUNKNOWN;
+
+       if (!(qlen = dns_d_expand(qname, sizeof qname, rr.dn.p, P, &error)))
+               return error;
+       else if (qlen >= sizeof qname || qlen != so->qlen)
+               return DNS_EUNKNOWN;
+
+       if (0 != strcasecmp(so->qname, qname))
+               return DNS_EUNKNOWN;
+
+       return 0;
+} /* dns_so_verify() */
+
+
+static int dns_so_tcp_send(struct dns_socket *so) {
+       unsigned char *qsrc;
+       size_t qend;
+       long n;
+
+       so->query->data[-2] = 0xff & (so->query->end >> 8);
+       so->query->data[-1] = 0xff & (so->query->end >> 0);
+
+       qsrc = &so->query->data[-2] + so->qout;
+       qend = so->query->end + 2;
+
+       while (so->qout < qend) {
+               if (0 > (n = send(so->tcp, (void *)&qsrc[so->qout], qend - so->qout, 0)))
+                       return dns_soerr();
+
+               so->qout += n;
+               so->stat.tcp.sent.bytes += n;
+       }
+
+       so->stat.tcp.sent.count++;
+
+       return 0;
+} /* dns_so_tcp_send() */
+
+
+static int dns_so_tcp_recv(struct dns_socket *so) {
+       unsigned char *asrc;
+       size_t aend, alen;
+       int error;
+       long n;
+
+       aend = so->alen + 2;
+
+       while (so->apos < aend) {
+               asrc = &so->answer->data[-2];
+
+               if (0 > (n = recv(so->tcp, (void *)&asrc[so->apos], aend - so->apos, 0)))
+                       return dns_soerr();
+               else if (n == 0)
+                       return DNS_EUNKNOWN;    /* FIXME */
+
+               so->apos += n;
+               so->stat.tcp.rcvd.bytes += n;
+
+               if (so->alen == 0 && so->apos >= 2) {
+                       alen = ((0xff & so->answer->data[-2]) << 8)
+                            | ((0xff & so->answer->data[-1]) << 0);
+
+                       if ((error = dns_so_newanswer(so, alen)))
+                               return error;
+
+                       so->alen = alen;
+                       aend = alen + 2;
+               }
+       }
+
+       so->answer->end = so->alen;
+       so->stat.tcp.rcvd.count++;
+
+       return 0;
+} /* dns_so_tcp_recv() */
+
+
+int dns_so_check(struct dns_socket *so) {
+       int error;
+       long n;
+
+retry:
+       switch (so->state) {
+       case DNS_SO_UDP_INIT:
+               so->state++;
+       case DNS_SO_UDP_CONN:
+               if (0 != connect(so->udp, (struct sockaddr *)&so->remote, dns_sa_len(&so->remote)))
+                       goto soerr;
+
+               so->state++;
+       case DNS_SO_UDP_SEND:
+               if (0 > (n = send(so->udp, (void *)so->query->data, so->query->end, 0)))
+                       goto soerr;
+
+               so->stat.udp.sent.bytes += n;
+               so->stat.udp.sent.count++;
+
+               so->state++;
+       case DNS_SO_UDP_RECV:
+               if (0 > (n = recv(so->udp, (void *)so->answer->data, so->answer->size, 0)))
+                       goto soerr;
+
+               so->stat.udp.rcvd.bytes += n;
+               so->stat.udp.rcvd.count++;
+
+               if ((so->answer->end = n) < 12)
+                       goto trash;
+
+               if ((error = dns_so_verify(so, so->answer)))
+                       goto trash;
+
+               so->state++;
+       case DNS_SO_UDP_DONE:
+               if (!dns_header(so->answer)->tc || so->type == SOCK_DGRAM)
+                       return 0;
+
+               so->state++;
+       case DNS_SO_TCP_INIT:
+               if ((error = dns_so_closefd(so, &so->tcp)))
+                       goto error;
+
+               if (-1 == (so->tcp = dns_socket((struct sockaddr *)&so->local, SOCK_STREAM, &error)))
+                       goto error;
+
+               so->state++;
+       case DNS_SO_TCP_CONN:
+               if (0 != connect(so->tcp, (struct sockaddr *)&so->remote, dns_sa_len(&so->remote))) {
+                       if (dns_soerr() != DNS_EISCONN)
+                               goto soerr;
+               }
+
+               so->state++;
+       case DNS_SO_TCP_SEND:
+               if ((error = dns_so_tcp_send(so)))
+                       goto error;
+
+               so->state++;
+       case DNS_SO_TCP_RECV:
+               if ((error = dns_so_tcp_recv(so)))
+                       goto error;
+
+               so->state++;
+       case DNS_SO_TCP_DONE:
+               if ((error = dns_so_closefd(so, &so->tcp)))
+                       goto error;
+
+               if (so->answer->end < 12)
+                       return DNS_EILLEGAL;
+
+               if ((error = dns_so_verify(so, so->answer)))
+                       goto error;
+
+               return 0;
+       default:
+               error   = DNS_EUNKNOWN;
+
+               goto error;
+       } /* switch() */
+
+trash:
+       goto retry;
+soerr:
+       error   = dns_soerr();
+
+       goto error;
+error:
+       switch (error) {
+       case DNS_EINTR:
+               goto retry;
+       case DNS_EINPROGRESS:
+               /* FALL THROUGH */
+       case DNS_EALREADY:
+               /* FALL THROUGH */
+#if DNS_EWOULDBLOCK != DNS_EAGAIN
+       case DNS_EWOULDBLOCK:
+               /* FALL THROUGH */
+#endif
+               error   = DNS_EAGAIN;
+
+               break;
+       } /* switch() */
+
+       return error;
+} /* dns_so_check() */
+
+
+struct dns_packet *dns_so_fetch(struct dns_socket *so, int *error) {
+       struct dns_packet *answer;
+
+       switch (so->state) {
+       case DNS_SO_UDP_DONE:
+       case DNS_SO_TCP_DONE:
+               answer          = so->answer;
+               so->answer      = 0;
+
+               return answer;
+       default:
+               *error  = DNS_EUNKNOWN;
+
+               return 0;
+       }
+} /* dns_so_fetch() */
+
+
+struct dns_packet *dns_so_query(struct dns_socket *so, struct dns_packet *Q, struct sockaddr *host, int *error_) {
+       struct dns_packet *A;
+       int error;
+
+       if (!so->state) {
+               if ((error = dns_so_submit(so, Q, host)))
+                       goto error;
+       }
+
+       if ((error = dns_so_check(so)))
+               goto error;
+
+       if (!(A = dns_so_fetch(so, &error)))
+               goto error;
+
+       dns_so_reset(so);
+
+       return A;
+error:
+       *error_ = error;
+
+       return 0;
+} /* dns_so_query() */
+
+
+time_t dns_so_elapsed(struct dns_socket *so) {
+       return dns_elapsed(so->began);
+} /* dns_so_elapsed() */
+
+
+void dns_so_clear(struct dns_socket *so) {
+       dns_so_closefds(so, DNS_SO_CLOSE_OLD);
+} /* dns_so_clear() */
+
+
+static int dns_so_events2(struct dns_socket *so, enum dns_events type) {
+       int events = 0;
+
+       switch (so->state) {
+       case DNS_SO_UDP_CONN:
+       case DNS_SO_UDP_SEND:
+               events |= DNS_POLLOUT;
+
+               break;
+       case DNS_SO_UDP_RECV:
+               events |= DNS_POLLIN;
+
+               break;
+       case DNS_SO_TCP_CONN:
+       case DNS_SO_TCP_SEND:
+               events |= DNS_POLLOUT;
+
+               break;
+       case DNS_SO_TCP_RECV:
+               events |= DNS_POLLIN;
+
+               break;
+       } /* switch() */
+
+       switch (type) {
+       case DNS_LIBEVENT:
+               return DNS_POLL2EV(events);
+       default:
+               return events;
+       } /* switch() */
+} /* dns_so_events2() */
+
+
+int dns_so_events(struct dns_socket *so) {
+       return dns_so_events2(so, so->opts.events);
+} /* dns_so_events() */
+
+
+int dns_so_pollfd(struct dns_socket *so) {
+       switch (so->state) {
+       case DNS_SO_UDP_CONN:
+       case DNS_SO_UDP_SEND:
+       case DNS_SO_UDP_RECV:
+               return so->udp;
+       case DNS_SO_TCP_CONN:
+       case DNS_SO_TCP_SEND:
+       case DNS_SO_TCP_RECV:
+               return so->tcp;
+       } /* switch() */
+
+       return -1;
+} /* dns_so_pollfd() */
+
+
+int dns_so_poll(struct dns_socket *so, int timeout) {
+       return dns_poll(dns_so_pollfd(so), dns_so_events2(so, DNS_SYSPOLL), timeout);
+} /* dns_so_poll() */
+
+
+const struct dns_stat *dns_so_stat(struct dns_socket *so) {
+       return &so->stat;
+} /* dns_so_stat() */
+
+
+/*
+ * R E S O L V E R  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+enum dns_res_state {
+       DNS_R_INIT,
+       DNS_R_GLUE,
+       DNS_R_SWITCH,           /* (B)IND, (F)ILE, (C)ACHE */
+
+       DNS_R_FILE,             /* Lookup in local hosts database */
+
+       DNS_R_CACHE,            /* Lookup in application cache */
+       DNS_R_SUBMIT,
+       DNS_R_CHECK,
+       DNS_R_FETCH,
+
+       DNS_R_BIND,             /* Lookup in the network */
+       DNS_R_SEARCH,
+       DNS_R_HINTS,
+       DNS_R_ITERATE,
+       DNS_R_FOREACH_NS,
+       DNS_R_RESOLV0_NS,       /* Prologue: Setup next frame and recurse */
+       DNS_R_RESOLV1_NS,       /* Epilog: Inspect answer */
+       DNS_R_FOREACH_A,
+       DNS_R_QUERY_A,
+       DNS_R_CNAME0_A,
+       DNS_R_CNAME1_A,
+
+       DNS_R_FINISH,
+       DNS_R_SMART0_A,
+       DNS_R_SMART1_A,
+       DNS_R_DONE,
+       DNS_R_SERVFAIL,
+}; /* enum dns_res_state */
+
+
+#define DNS_R_MAXDEPTH 8
+#define DNS_R_ENDFRAME (DNS_R_MAXDEPTH - 1)
+
+struct dns_resolver {
+       struct dns_socket so;
+
+       struct dns_resolv_conf *resconf;
+       struct dns_hosts *hosts;
+       struct dns_hints *hints;
+       struct dns_cache *cache;
+
+       dns_atomic_t refcount;
+
+       /* Reset zeroes everything below here. */
+
+       char qname[DNS_D_MAXNAME + 1];
+       size_t qlen;
+
+       enum dns_type qtype;
+       enum dns_class qclass;
+
+       time_t began;
+
+       dns_resconf_i_t search;
+
+       struct dns_rr_i smart;
+
+       struct dns_res_frame {
+               enum dns_res_state state;
+
+               int error;
+               int which;      /* (B)IND, (F)ILE; index into resconf->lookup */
+
+               unsigned attempts;
+
+               struct dns_packet *query, *answer, *hints;
+
+               struct dns_rr_i hints_i, hints_j;
+               struct dns_rr hints_ns, ans_cname;
+       } stack[DNS_R_MAXDEPTH];
+
+       unsigned sp;
+}; /* struct dns_resolver */
+
+
+static int dns_res_tcp2type(int tcp) {
+       switch (tcp) {
+       case DNS_RESCONF_TCP_ONLY:
+               return SOCK_STREAM;
+       case DNS_RESCONF_TCP_DISABLE:
+               return SOCK_DGRAM;
+       default:
+               return 0;
+       }
+} /* dns_res_tcp2type() */
+
+struct dns_resolver *dns_res_open(struct dns_resolv_conf *resconf, struct dns_hosts *hosts, struct dns_hints *hints, struct dns_cache *cache, const struct dns_options *opts, int *error_) {
+       static const struct dns_resolver R_initializer
+               = { .refcount = 1, };
+       struct dns_resolver *R  = 0;
+       int type, error;
+
+       /*
+        * Grab ref count early because the caller may have passed us a mortal
+        * reference, and we want to do the right thing if we return early
+        * from an error.
+        */ 
+       if (resconf)
+               dns_resconf_acquire(resconf);
+       if (hosts)
+               dns_hosts_acquire(hosts);
+       if (hints)
+               dns_hints_acquire(hints);
+       if (cache)
+               dns_cache_acquire(cache);
+
+       /*
+        * Don't try to load it ourselves because a NULL object might be an
+        * error from, say, dns_resconf_root(), and loading
+        * dns_resconf_local() by default would create undesirable surpises.
+        */
+       if (!resconf || !hosts || !hints)
+               goto error;
+
+       if (!(R = malloc(sizeof *R)))
+               goto syerr;
+
+       *R      = R_initializer;
+       type    = dns_res_tcp2type(resconf->options.tcp);
+
+       if (!dns_so_init(&R->so, (struct sockaddr *)&resconf->iface, type, opts, &error))
+               goto error;
+
+       R->resconf      = resconf;
+       R->hosts        = hosts;
+       R->hints        = hints;
+       R->cache        = cache;
+
+       return R;
+syerr:
+       error   = dns_syerr();
+error:
+       *error_ = error;
+
+       dns_res_close(R);
+
+       dns_resconf_close(resconf);
+       dns_hosts_close(hosts);
+       dns_hints_close(hints);
+       dns_cache_close(cache);
+
+       return 0;
+} /* dns_res_open() */
+
+
+struct dns_resolver *dns_res_stub(const struct dns_options *opts, int *error) {
+       struct dns_resolv_conf *resconf = 0;
+       struct dns_hosts *hosts         = 0;
+       struct dns_hints *hints         = 0;
+       struct dns_resolver *res        = 0;
+
+       if (!(resconf = dns_resconf_local(error)))
+               goto epilog;
+
+       if (!(hosts = dns_hosts_local(error)))
+               goto epilog;
+
+       if (!(hints = dns_hints_local(resconf, error)))
+               goto epilog;
+
+       if (!(res = dns_res_open(resconf, hosts, hints, NULL, opts, error)))
+               goto epilog;
+
+epilog:
+       dns_resconf_close(resconf);
+       dns_hosts_close(hosts);
+       dns_hints_close(hints);
+
+       return res;
+} /* dns_res_stub() */
+
+
+static void dns_res_reset_frame(struct dns_resolver *R __UNUSED__, struct dns_res_frame *frame) {
+       free(frame->query);
+       free(frame->answer);
+       free(frame->hints);
+
+       memset(frame, '\0', sizeof *frame);
+} /* dns_res_reset_frame() */
+
+
+void dns_res_reset(struct dns_resolver *R) {
+       unsigned i;
+
+       dns_so_reset(&R->so);
+
+       for (i = 0; i < lengthof(R->stack); i++)
+               dns_res_reset_frame(R, &R->stack[i]);
+
+       memset(&R->qname, '\0', sizeof *R - offsetof(struct dns_resolver, qname));
+} /* dns_res_reset() */
+
+
+void dns_res_close(struct dns_resolver *R) {
+       if (!R || 1 < dns_res_release(R))
+               return;
+
+       dns_res_reset(R);
+
+       dns_so_destroy(&R->so);
+
+       dns_hints_close(R->hints);
+       dns_hosts_close(R->hosts);
+       dns_resconf_close(R->resconf);
+       dns_cache_close(R->cache);
+
+       free(R);
+} /* dns_res_close() */
+
+
+unsigned dns_res_acquire(struct dns_resolver *R) {
+       return dns_atomic_inc(&R->refcount);
+} /* dns_res_acquire() */
+
+
+unsigned dns_res_release(struct dns_resolver *R) {
+       return dns_atomic_dec(&R->refcount);
+} /* dns_res_release() */
+
+
+struct dns_resolver *dns_res_mortal(struct dns_resolver *res) {
+       if (res)
+               dns_res_release(res);
+       return res;
+} /* dns_res_mortal() */
+
+
+static struct dns_packet *dns_res_merge(struct dns_packet *P0, struct dns_packet *P1, int *error_) {
+       size_t bufsiz   = P0->end + P1->end;
+       struct dns_packet *P[3] = { P0, P1, 0 };
+       struct dns_rr rr[3];
+       int error, copy, i;
+       enum dns_section section;
+
+retry:
+       if (!(P[2] = dns_p_make(bufsiz, &error)))
+               goto error;
+
+       dns_rr_foreach(&rr[0], P[0], .section = DNS_S_QD) {
+               if ((error = dns_rr_copy(P[2], &rr[0], P[0])))
+                       goto error;
+       }
+
+       for (section = DNS_S_AN; (DNS_S_ALL & section); section <<= 1) {
+               for (i = 0; i < 2; i++) {
+                       dns_rr_foreach(&rr[i], P[i], .section = section) {
+                               copy    = 1;
+
+                               dns_rr_foreach(&rr[2], P[2], .type = rr[i].type, .section = (DNS_S_ALL & ~DNS_S_QD)) {
+                                       if (0 == dns_rr_cmp(&rr[i], P[i], &rr[2], P[2])) {
+                                               copy    = 0;
+
+                                               break;
+                                       }
+                               }
+
+                               if (copy && (error = dns_rr_copy(P[2], &rr[i], P[i]))) {
+                                       if (error == DNS_ENOBUFS && bufsiz < 65535) {
+                                               free(P[2]); P[2] = 0;
+
+                                               bufsiz  = MAX(65535, bufsiz * 2);
+
+                                               goto retry;
+                                       }
+
+                                       goto error;
+                               }
+                       } /* foreach(rr) */
+               } /* foreach(packet) */
+       } /* foreach(section) */
+
+       return P[2];
+error:
+       *error_ = error;
+
+       free(P[2]);
+
+       return 0;
+} /* dns_res_merge() */
+
+
+static struct dns_packet *dns_res_glue(struct dns_resolver *R, struct dns_packet *Q) {
+       struct dns_packet *P    = dns_p_new(512);
+       char qname[DNS_D_MAXNAME + 1];
+       size_t qlen;
+       enum dns_type qtype;
+       struct dns_rr rr;
+       unsigned sp;
+       int error;
+
+       if (!(qlen = dns_d_expand(qname, sizeof qname, 12, Q, &error))
+       ||  qlen >= sizeof qname)
+               return 0;
+
+       if (!(qtype = dns_rr_type(12, Q)))
+               return 0;
+
+       if ((error = dns_p_push(P, DNS_S_QD, qname, strlen(qname), qtype, DNS_C_IN, 0, 0)))
+               return 0;
+
+       for (sp = 0; sp <= R->sp; sp++) {
+               if (!R->stack[sp].answer)
+                       continue;
+
+               dns_rr_foreach(&rr, R->stack[sp].answer, .name = qname, .type = qtype, .section = (DNS_S_ALL & ~DNS_S_QD)) {
+                       rr.section      = DNS_S_AN;
+
+                       if ((error = dns_rr_copy(P, &rr, R->stack[sp].answer)))
+                               return 0;
+               }
+       }
+
+       if (dns_p_count(P, DNS_S_AN) > 0)
+               goto copy;
+
+       /* Otherwise, look for a CNAME */
+       for (sp = 0; sp <= R->sp; sp++) {
+               if (!R->stack[sp].answer)
+                       continue;
+
+               dns_rr_foreach(&rr, R->stack[sp].answer, .name = qname, .type = DNS_T_CNAME, .section = (DNS_S_ALL & ~DNS_S_QD)) {
+                       rr.section      = DNS_S_AN;
+
+                       if ((error = dns_rr_copy(P, &rr, R->stack[sp].answer)))
+                               return 0;
+               }
+       }
+
+       if (!dns_p_count(P, DNS_S_AN))
+               return 0;
+
+copy:
+       return dns_p_copy(dns_p_make(P->end, &error), P);
+} /* dns_res_glue() */
+
+
+static struct dns_packet *dns_res_mkquery(struct dns_resolver *R, const char *qname, enum dns_type qtype, enum dns_class qclass, int *error_) {
+       struct dns_packet *Q    = 0;
+       int error;
+
+       if (!(Q = dns_p_init(malloc(DNS_P_QBUFSIZ), DNS_P_QBUFSIZ)))
+               goto syerr;
+
+       if ((error = dns_p_push(Q, DNS_S_QD, qname, strlen(qname), qtype, qclass, 0, 0)))
+               goto error;
+
+       dns_header(Q)->rd       = !R->resconf->options.recurse;
+
+       return Q;
+syerr:
+       error   = dns_syerr();
+error:
+       free(Q);
+
+       *error_ = error;
+
+       return 0;
+} /* dns_res_mkquery() */
+
+
+/*
+ * Sort NS records by three criteria:
+ *
+ *     1) Whether glue is present.
+ *     2) Whether glue record is original or of recursive lookup.
+ *     3) Randomly shuffle records which share the above criteria.
+ *
+ * NOTE: Assumes only NS records passed, AND ASSUMES no new NS records will
+ *       be added during an iteration.
+ *
+ * FIXME: Only groks A glue, not AAAA glue.
+ */
+static int dns_res_nameserv_cmp(struct dns_rr *a, struct dns_rr *b, struct dns_rr_i *i, struct dns_packet *P) {
+       _Bool glued[2]  = { 0 };
+       struct dns_ns ns;
+       struct dns_rr x, y;
+       int cmp, error;
+
+       if (!(error = dns_ns_parse(&ns, a, P)))
+               if (!(glued[0] = !!dns_rr_grep(&x, 1, dns_rr_i_new(P, .section = (DNS_S_ALL & ~DNS_S_QD), .name = ns.host, .type = DNS_T_A), P, &error)))
+                       x.dn.p  = 0;
+
+       if (!(error = dns_ns_parse(&ns, b, P)))
+               if (!(glued[1] = !!dns_rr_grep(&y, 1, dns_rr_i_new(P, .section = (DNS_S_ALL & ~DNS_S_QD), .name = ns.host, .type = DNS_T_A), P, &error)))
+                       y.dn.p  = 0;
+
+       if ((cmp = glued[1] - glued[0]))
+               return cmp;
+       else if ((cmp = (dns_rr_offset(&y) < i->args[0]) - (dns_rr_offset(&x) < i->args[0])))
+               return cmp;
+       else
+               return dns_rr_i_shuffle(a, b, i, P);
+} /* dns_res_nameserv_cmp() */
+
+
+#define goto(sp, i)    \
+       do { R->stack[(sp)].state = (i); goto exec; } while (0)
+
+static int dns_res_exec(struct dns_resolver *R) {
+       struct dns_res_frame *F;
+       struct dns_packet *P;
+       char host[DNS_D_MAXNAME + 1];
+       size_t len;
+       struct dns_rr rr;
+       struct sockaddr_in sin;
+       int error;
+
+exec:
+
+       F       = &R->stack[R->sp];
+
+       switch (F->state) {
+       case DNS_R_INIT:
+               F->state++;
+       case DNS_R_GLUE:
+               if (R->sp == 0)
+                       goto(R->sp, DNS_R_SWITCH);
+
+               assert(F->query);
+
+               if (!(F->answer = dns_res_glue(R, F->query)))
+                       goto(R->sp, DNS_R_SWITCH);
+
+               if (!(len = dns_d_expand(host, sizeof host, 12, F->query, &error)))
+                       goto error;
+               else if (len >= sizeof host)
+                       goto toolong;
+
+               dns_rr_foreach(&rr, F->answer, .name = host, .type = dns_rr_type(12, F->query), .section = DNS_S_AN) {
+                       goto(R->sp, DNS_R_FINISH);
+               }
+
+               dns_rr_foreach(&rr, F->answer, .name = host, .type = DNS_T_CNAME, .section = DNS_S_AN) {
+                       F->ans_cname    = rr;
+
+                       goto(R->sp, DNS_R_CNAME0_A);
+               }
+
+               F->state++;
+       case DNS_R_SWITCH:
+               while (F->which < (int)sizeof R->resconf->lookup) {
+                       switch (R->resconf->lookup[F->which++]) {
+                       case 'b': case 'B':
+                               goto(R->sp, DNS_R_BIND);
+                       case 'f': case 'F':
+                               goto(R->sp, DNS_R_FILE);
+                       case 'c': case 'C':
+                               if (R->cache)
+                                       goto(R->sp, DNS_R_CACHE);
+
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+               goto(R->sp, DNS_R_SERVFAIL);    /* FIXME: Right behavior? */
+       case DNS_R_FILE:
+               if (R->sp > 0) {
+                       free(F->answer);
+
+                       if (!(F->answer = dns_hosts_query(R->hosts, F->query, &error)))
+                               goto error;
+
+                       if (dns_p_count(F->answer, DNS_S_AN) > 0)
+                               goto(R->sp, DNS_R_FINISH);
+
+                       free(F->answer); F->answer = 0;
+               } else {
+                       R->search       = 0;
+
+                       while ((len = dns_resconf_search(host, sizeof host, R->qname, R->qlen, R->resconf, &R->search))) {
+/*
+ * FIXME: Some sort of bug, either with this code or with GCC 3.3.5 on
+ * OpenBSD 4.4, overwites the stack guard. If the bug is in this file, it
+ * appears to be localized somewhere around here. It can also be mitigated
+ * in dns_hosts_query(). In any event, the bug manifests only when using
+ * compound literals. alloca(), malloc(), calloc(), etc, all work fine. 
+ * Valgrind (tested on Linux) cannot detect any issues, but stack issues are
+ * not Valgrind's forte. Neither can I spot anything in the assembly, but
+ * that's not my forte.
+ */
+#if __OpenBSD__ && __GNUC__
+                               struct dns_packet *query        = __builtin_alloca(DNS_P_QBUFSIZ);
+
+                               dns_p_init(query, DNS_P_QBUFSIZ);
+#else
+                               struct dns_packet *query        = dns_p_new(DNS_P_QBUFSIZ);
+#endif
+
+                               if ((error = dns_p_push(query, DNS_S_QD, host, len, R->qtype, R->qclass, 0, 0)))
+                                       goto error;
+
+                               free(F->answer);
+
+                               if (!(F->answer = dns_hosts_query(R->hosts, query, &error)))
+                                       goto error;
+
+                               if (dns_p_count(F->answer, DNS_S_AN) > 0)
+                                       goto(R->sp, DNS_R_FINISH);
+
+                               free(F->answer); F->answer = 0;
+                       }
+               }
+
+               goto(R->sp, DNS_R_SWITCH);
+       case DNS_R_CACHE:
+               error = 0;
+
+               if (!F->query && !(F->query = dns_res_mkquery(R, R->qname, R->qtype, R->qclass, &error)))
+                       goto error;
+
+               free(F->answer);
+
+               if ((F->answer = R->cache->query(F->query, R->cache, &error))) {
+                       if (dns_p_count(F->answer, DNS_S_AN) > 0)
+                               goto(R->sp, DNS_R_FINISH);
+
+                       free(F->answer); F->answer = 0;
+
+                       goto(R->sp, DNS_R_SWITCH);
+               } else if (error)
+                       goto error;
+
+               F->state++;
+       case DNS_R_SUBMIT:
+               if ((error = R->cache->submit(F->query, R->cache)))
+                       goto error;
+
+               F->state++;
+       case DNS_R_CHECK:
+               if ((error = R->cache->check(R->cache)))
+                       goto error;
+
+               F->state++;
+       case DNS_R_FETCH:
+               error = 0;
+
+               free(F->answer);
+
+               if ((F->answer = R->cache->fetch(R->cache, &error))) {
+                       if (dns_p_count(F->answer, DNS_S_AN) > 0)
+                               goto(R->sp, DNS_R_FINISH);
+
+                       free(F->answer); F->answer = 0;
+
+                       goto(R->sp, DNS_R_SWITCH);
+               } else if (error)
+                       goto error;
+
+               goto(R->sp, DNS_R_SWITCH);
+       case DNS_R_BIND:
+               if (R->sp > 0) {
+                       assert(F->query);
+
+                       goto(R->sp, DNS_R_HINTS);
+               }
+
+               R->search       = 0;
+
+               F->state++;
+       case DNS_R_SEARCH:
+               if (!(len = dns_resconf_search(host, sizeof host, R->qname, R->qlen, R->resconf, &R->search)))
+                       goto(R->sp, DNS_R_SWITCH);
+
+               if (!(P = dns_p_make(DNS_P_QBUFSIZ, &error)))
+                       goto error;
+
+               dns_header(P)->rd       = !R->resconf->options.recurse;
+
+               free(F->query); F->query = P;
+
+               if ((error = dns_p_push(F->query, DNS_S_QD, host, len, R->qtype, R->qclass, 0, 0)))
+                       goto error;
+
+               F->state++;
+       case DNS_R_HINTS:
+               if (!(F->hints = dns_hints_query(R->hints, F->query, &error)))
+                       goto error;
+
+               F->state++;
+       case DNS_R_ITERATE:
+               dns_rr_i_init(&F->hints_i, F->hints);
+
+               F->hints_i.section      = DNS_S_AUTHORITY;
+               F->hints_i.type         = DNS_T_NS;
+               F->hints_i.sort         = &dns_res_nameserv_cmp;
+               F->hints_i.args[0]      = F->hints->end;
+
+               F->state++;
+       case DNS_R_FOREACH_NS:
+               dns_rr_i_save(&F->hints_i);
+
+               /* Load our next nameserver host. */
+               if (!dns_rr_grep(&F->hints_ns, 1, &F->hints_i, F->hints, &error)) {
+                       if (++F->attempts < R->resconf->options.attempts)
+                               goto(R->sp, DNS_R_ITERATE);
+
+                       goto(R->sp, DNS_R_SWITCH);
+               }
+
+               dns_rr_i_init(&F->hints_j, F->hints);
+
+               /* Assume there are glue records */
+               goto(R->sp, DNS_R_FOREACH_A);
+       case DNS_R_RESOLV0_NS:
+               /* Have we reached our max depth? */
+               if (&F[1] >= endof(R->stack))
+                       goto(R->sp, DNS_R_FOREACH_NS);
+
+               dns_res_reset_frame(R, &F[1]);
+
+               if (!(F[1].query = dns_p_make(DNS_P_QBUFSIZ, &error)))
+                       goto error;
+
+               if ((error = dns_ns_parse((struct dns_ns *)host, &F->hints_ns, F->hints)))
+                       goto error;
+
+               if ((error = dns_p_push(F[1].query, DNS_S_QD, host, strlen(host), DNS_T_A, DNS_C_IN, 0, 0)))
+                       goto error;
+
+               F->state++;
+
+               goto(++R->sp, DNS_R_INIT);
+       case DNS_R_RESOLV1_NS:
+               if (!(len = dns_d_expand(host, sizeof host, 12, F[1].query, &error)))
+                       goto error;
+               else if (len >= sizeof host)
+                       goto toolong;
+
+               dns_rr_foreach(&rr, F[1].answer, .name = host, .type = DNS_T_A, .section = (DNS_S_ALL & ~DNS_S_QD)) {
+                       rr.section      = DNS_S_AR;
+
+                       if ((error = dns_rr_copy(F->hints, &rr, F[1].answer)))
+                               goto error;
+
+                       dns_rr_i_rewind(&F->hints_i);   /* Now there's glue. */
+               }
+
+               goto(R->sp, DNS_R_FOREACH_NS);
+       case DNS_R_FOREACH_A:
+               /*
+                * NOTE: Iterator initialized in DNS_R_FOREACH_NS because
+                * this state is re-entrant, but we need to reset
+                * .name to a valid pointer each time.
+                */
+               if ((error = dns_ns_parse((struct dns_ns *)host, &F->hints_ns, F->hints)))
+                       goto error;
+
+               F->hints_j.name         = host;
+               F->hints_j.type         = DNS_T_A;
+               F->hints_j.section      = DNS_S_ALL & ~DNS_S_QD;
+
+               if (!dns_rr_grep(&rr, 1, &F->hints_j, F->hints, &error)) {
+                       if (!dns_rr_i_count(&F->hints_j))
+                               goto(R->sp, DNS_R_RESOLV0_NS);
+
+                       goto(R->sp, DNS_R_FOREACH_NS);
+               }
+
+               sin.sin_family  = AF_INET;
+
+               if ((error = dns_a_parse((struct dns_a *)&sin.sin_addr, &rr, F->hints)))
+                       goto error;
+
+               if (R->sp == 0)
+                       sin.sin_port = dns_hints_port(R->hints, AF_INET, (struct sockaddr *)&sin.sin_addr);
+               else
+                       sin.sin_port = htons(53);
+
+               if (DNS_DEBUG) {
+                       char addr[INET_ADDRSTRLEN + 1];
+                       dns_a_print(addr, sizeof addr, (struct dns_a *)&sin.sin_addr);
+                       DNS_SHOW(F->query, "ASKING: %s/%s @ DEPTH: %u)", host, addr, R->sp);
+               }
+
+               if ((error = dns_so_submit(&R->so, F->query, (struct sockaddr *)&sin)))
+                       goto error;
+
+               F->state++;
+       case DNS_R_QUERY_A:
+               if (dns_so_elapsed(&R->so) >= (time_t)R->resconf->options.timeout)
+                       goto(R->sp, DNS_R_FOREACH_A);
+
+               if ((error = dns_so_check(&R->so)))
+                       goto error;
+
+               free(F->answer);
+
+               if (!(F->answer = dns_so_fetch(&R->so, &error)))
+                       goto error;
+
+               if (DNS_DEBUG) {
+                       DNS_SHOW(F->answer, "ANSWER @ DEPTH: %u)", R->sp);
+               }
+
+               if ((error = dns_rr_parse(&rr, 12, F->query)))
+                       goto error;
+
+               if (!(len = dns_d_expand(host, sizeof host, rr.dn.p, F->query, &error)))
+                       goto error;
+               else if (len >= sizeof host)
+                       goto toolong;
+
+               dns_rr_foreach(&rr, F->answer, .section = DNS_S_AN, .name = host, .type = rr.type) {
+                       goto(R->sp, DNS_R_FINISH);      /* Found */
+               }
+
+               dns_rr_foreach(&rr, F->answer, .section = DNS_S_AN, .name = host, .type = DNS_T_CNAME) {
+                       F->ans_cname    = rr;
+
+                       goto(R->sp, DNS_R_CNAME0_A);
+               }
+
+               if (!R->resconf->options.recurse)
+                       goto(R->sp, DNS_R_SWITCH);
+
+               dns_rr_foreach(&rr, F->answer, .section = DNS_S_NS, .type = DNS_T_NS) {
+                       free(F->hints);
+
+                       F->hints        = F->answer;
+                       F->answer       = 0;
+
+                       goto(R->sp, DNS_R_ITERATE);
+               }
+
+               /* XXX: Should this go further up? */
+               if (dns_header(F->answer)->aa)
+                       goto(R->sp, DNS_R_FINISH);
+
+               goto(R->sp, DNS_R_FOREACH_A);
+       case DNS_R_CNAME0_A:
+               if (&F[1] >= endof(R->stack))
+                       goto(R->sp, DNS_R_FINISH);
+
+               if ((error = dns_cname_parse((struct dns_cname *)host, &F->ans_cname, F->answer)))
+                       goto error;
+
+               dns_res_reset_frame(R, &F[1]);
+
+               if (!(F[1].query = dns_p_make(DNS_P_QBUFSIZ, &error)))
+                       goto error;
+
+               if ((error = dns_p_push(F[1].query, DNS_S_QD, host, strlen(host), dns_rr_type(12, F->query), DNS_C_IN, 0, 0)))
+                       goto error;
+
+               F->state++;
+
+               goto(++R->sp, DNS_R_INIT);
+       case DNS_R_CNAME1_A:
+               if (!(P = dns_res_merge(F->answer, F[1].answer, &error)))
+                       goto error;
+
+               free(F->answer); F->answer = P;
+
+               goto(R->sp, DNS_R_FINISH);
+       case DNS_R_FINISH:
+               assert(F->answer);
+
+               if (!R->resconf->options.smart || R->sp > 0)
+                       goto(R->sp, DNS_R_DONE);
+
+               R->smart.section        = DNS_S_AN;
+               R->smart.type           = R->qtype;
+
+               dns_rr_i_init(&R->smart, F->answer);
+
+               F->state++;
+       case DNS_R_SMART0_A:
+               if (&F[1] >= endof(R->stack))
+                       goto(R->sp, DNS_R_DONE);
+
+               while (dns_rr_grep(&rr, 1, &R->smart, F->answer, &error)) {
+                       union {
+                               struct dns_ns ns;
+                               struct dns_mx mx;
+                               struct dns_srv srv;
+                       } rd;
+                       const char *qname;
+                       enum dns_type qtype;
+                       enum dns_class qclass;
+
+                       switch (rr.type) {
+                       case DNS_T_NS:
+                               if ((error = dns_ns_parse(&rd.ns, &rr, F->answer)))
+                                       goto error;
+
+                               qname   = rd.ns.host;
+                               qtype   = DNS_T_A;
+                               qclass  = DNS_C_IN;
+
+                               break;
+                       case DNS_T_MX:
+                               if ((error = dns_mx_parse(&rd.mx, &rr, F->answer)))
+                                       goto error;
+
+                               qname   = rd.mx.host;
+                               qtype   = DNS_T_A;
+                               qclass  = DNS_C_IN;
+
+                               break;
+                       case DNS_T_SRV:
+                               if ((error = dns_srv_parse(&rd.srv, &rr, F->answer)))
+                                       goto error;
+
+                               qname   = rd.srv.target;
+                               qtype   = DNS_T_A;
+                               qclass  = DNS_C_IN;
+
+                               break;
+                       default:
+                               continue;
+                       } /* switch() */
+
+                       dns_res_reset_frame(R, &F[1]);
+
+                       if (!(F[1].query = dns_res_mkquery(R, qname, qtype, qclass, &error)))
+                               goto error;
+
+                       F->state++;
+
+                       goto(++R->sp, DNS_R_INIT);
+               } /* while() */
+
+               /*
+                * NOTE: SMTP specification says to fallback to A record.
+                *
+                * XXX: Should we add a mock MX answer?
+                */
+               if (R->qtype == DNS_T_MX && R->smart.state.count == 0) {
+                       dns_res_reset_frame(R, &F[1]);
+
+                       if (!(F[1].query = dns_res_mkquery(R, R->qname, DNS_T_A, DNS_C_IN, &error)))
+                               goto error;
+
+                       R->smart.state.count++;
+                       F->state++;
+
+                       goto(++R->sp, DNS_R_INIT);
+               }
+
+               goto(R->sp, DNS_R_DONE);
+       case DNS_R_SMART1_A:
+               assert(F[1].answer);
+
+               /*
+                * FIXME: For CNAME chains (which are typically illegal in
+                * this context), we should rewrite the record host name
+                * to the original smart qname. All the user cares about
+                * is locating that A/AAAA record.
+                */
+               dns_rr_foreach(&rr, F[1].answer, .section = DNS_S_AN, .type = DNS_T_A) {
+                       rr.section      = DNS_S_AR;
+
+                       if (dns_rr_exists(&rr, F[1].answer, F->answer))
+                               continue;
+
+                       while ((error = dns_rr_copy(F->answer, &rr, F[1].answer))) {
+                               if (error != DNS_ENOBUFS)
+                                       goto error;
+                               if ((error = dns_p_grow(&F->answer)))
+                                       goto error;
+                       }
+               }
+
+               goto(R->sp, DNS_R_SMART0_A);
+       case DNS_R_DONE:
+               assert(F->answer);
+
+               if (R->sp > 0)
+                       goto(--R->sp, F[-1].state);
+
+               break;
+       case DNS_R_SERVFAIL:
+               free(F->answer);
+
+               if (!(F->answer = dns_p_make(DNS_P_QBUFSIZ, &error)))
+                       goto error;
+
+               dns_header(F->answer)->qr       = 1;
+               dns_header(F->answer)->rcode    = DNS_RC_SERVFAIL;
+
+               if ((error = dns_p_push(F->answer, DNS_S_QD, R->qname, strlen(R->qname), R->qtype, R->qclass, 0, 0)))
+                       goto error;
+
+               goto(R->sp, DNS_R_DONE);
+       default:
+               error   = EINVAL;
+
+               goto error;
+       } /* switch () */
+
+       return 0;
+toolong:
+       error = DNS_EILLEGAL;
+error:
+       return error;
+} /* dns_res_exec() */
+
+#undef goto
+
+
+void dns_res_clear(struct dns_resolver *R) {
+       switch (R->stack[R->sp].state) {
+       case DNS_R_CHECK:
+               return R->cache->clear(R->cache);
+       default:
+               return dns_so_clear(&R->so);
+       }
+} /* dns_res_clear() */
+
+
+static int dns_res_events2(struct dns_resolver *R, enum dns_events type) {
+       int events;
+
+       switch (R->stack[R->sp].state) {
+       case DNS_R_CHECK:
+               events = R->cache->events(R->cache);
+
+               return (type == DNS_LIBEVENT)? DNS_POLL2EV(events) : events;
+       default:
+               return dns_so_events2(&R->so, type);
+       }
+} /* dns_res_events2() */
+
+
+int dns_res_events(struct dns_resolver *R) {
+       return dns_res_events2(R, R->so.opts.events);
+} /* dns_res_events() */
+
+
+int dns_res_pollfd(struct dns_resolver *R) {
+       switch (R->stack[R->sp].state) {
+       case DNS_R_CHECK:
+               return R->cache->pollfd(R->cache);
+       default:
+               return dns_so_pollfd(&R->so);
+       }
+} /* dns_res_pollfd() */
+
+
+time_t dns_res_elapsed(struct dns_resolver *R) {
+       return dns_elapsed(R->began);
+} /* dns_res_elapsed() */
+
+
+int dns_res_poll(struct dns_resolver *R, int timeout) {
+       return dns_poll(dns_res_pollfd(R), dns_res_events2(R, DNS_SYSPOLL), timeout);
+} /* dns_res_poll() */
+
+
+int dns_res_submit(struct dns_resolver *R, const char *qname, enum dns_type qtype, enum dns_class qclass) {
+       dns_res_reset(R);
+
+       /* Don't anchor; that can conflict with searchlist generation. */
+       dns_d_init(R->qname, sizeof R->qname, qname, (R->qlen = strlen(qname)), 0);
+
+       R->qtype        = qtype;
+       R->qclass       = qclass;
+
+       R->began        = dns_now();
+
+       return 0;
+} /* dns_res_submit() */
+
+
+int dns_res_check(struct dns_resolver *R) {
+       int error;
+
+       if ((error = dns_res_exec(R)))
+               return error;
+
+       return 0;
+} /* dns_res_check() */
+
+
+struct dns_packet *dns_res_fetch(struct dns_resolver *R, int *error) {
+       struct dns_packet *answer;
+
+       if (R->stack[0].state != DNS_R_DONE) {
+               *error  = DNS_EUNKNOWN;
+
+               return 0;
+       }
+
+       answer                  = R->stack[0].answer;
+       R->stack[0].answer      = 0;
+
+       return answer;
+} /* dns_res_fetch() */
+
+
+struct dns_packet *dns_res_query(struct dns_resolver *res, const char *qname, enum dns_type qtype, enum dns_class qclass, int timeout, int *error_) {
+       int error;
+
+       if ((error = dns_res_submit(res, qname, qtype, qclass)))
+               goto error;
+
+       while ((error = dns_res_check(res))) {
+               if (dns_res_elapsed(res) > timeout)
+                       error = DNS_ETIMEDOUT;
+
+               if (error != DNS_EAGAIN)
+                       goto error;
+
+               if ((error = dns_res_poll(res, 1)))
+                       goto error;
+       }
+
+       return dns_res_fetch(res, error_);
+error:
+       *error_ = error;
+
+       return 0;
+} /* dns_res_query() */
+
+
+const struct dns_stat *dns_res_stat(struct dns_resolver *res) {
+       return dns_so_stat(&res->so);
+} /* dns_res_stat() */
+
+
+/*
+ * A D D R I N F O  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_addrinfo {
+       struct addrinfo hints;
+       struct dns_resolver *res;
+
+       char qname[DNS_D_MAXNAME + 1];
+       enum dns_type qtype;
+       unsigned short qport, port;
+
+       struct dns_packet *answer;
+       struct dns_packet *glue;
+
+       struct dns_rr_i i, g;
+       struct dns_rr rr;
+
+       char cname[DNS_D_MAXNAME + 1];
+
+       int state;
+}; /* struct dns_addrinfo */
+
+
+struct dns_addrinfo *dns_ai_open(const char *host, const char *serv, enum dns_type qtype, const struct addrinfo *hints, struct dns_resolver *res, int *error_) {
+       static const struct dns_addrinfo ai_initializer;
+       struct dns_addrinfo *ai;
+       int error;
+
+       if (!res)
+               return 0;
+
+       dns_res_acquire(res);
+
+       if (!(ai = malloc(sizeof *ai)))
+               goto syerr;
+
+       *ai             = ai_initializer;
+       ai->hints       = *hints;
+
+       ai->res         = res;
+       res             = 0;
+
+       if (sizeof ai->qname <= dns_strlcpy(ai->qname, host, sizeof ai->qname))
+               { error = ENAMETOOLONG; goto error; }
+
+       ai->qtype       = qtype;
+       ai->qport       = 0;
+
+       if (serv) {
+               while (isdigit((unsigned char)*serv)) {
+                       ai->qport       *= 10;
+                       ai->qport       += *serv++ - '0';
+               }
+       }
+
+       ai->port        = ai->qport;
+
+       return ai;
+syerr:
+       error   = dns_syerr();
+error:
+       *error_ = error;
+
+       dns_ai_close(ai);
+       dns_res_close(res);
+
+       return 0;
+} /* dns_ai_open() */
+
+
+void dns_ai_close(struct dns_addrinfo *ai) {
+       if (!ai)
+               return;
+
+       dns_res_close(ai->res);
+
+       if (ai->answer != ai->glue)
+               free(ai->glue);
+
+       free(ai->answer);
+       free(ai);
+} /* dns_ai_close() */
+
+
+static int dns_ai_setent(struct addrinfo **ent, union dns_any *any, enum dns_type type, struct dns_addrinfo *ai) {
+       struct sockaddr *saddr;
+       struct sockaddr_in sin;
+       struct sockaddr_in6 sin6;
+       const char *cname;
+       size_t clen;
+
+       switch (type) {
+       case DNS_T_A:
+               saddr   = memset(&sin, '\0', sizeof sin);
+
+               sin.sin_family  = AF_INET;
+               sin.sin_port    = htons(ai->port);
+
+               memcpy(&sin.sin_addr, any, sizeof sin.sin_addr);
+
+               break;
+       case DNS_T_AAAA:
+               saddr   = memset(&sin6, '\0', sizeof sin6);
+
+               sin6.sin6_family        = AF_INET6;
+               sin6.sin6_port          = htons(ai->port);
+
+               memcpy(&sin6.sin6_addr, any, sizeof sin6.sin6_addr);
+
+               break;
+       default:
+               return EINVAL;
+       } /* switch() */
+
+       if (ai->hints.ai_flags & AI_CANONNAME) {
+               cname   = (*ai->cname)? ai->cname : ai->qname;
+               clen    = strlen(cname);
+       } else {
+               cname   = NULL;
+               clen    = 0;
+       }
+
+       if (!(*ent = malloc(sizeof **ent + dns_sa_len(saddr) + ((ai->hints.ai_flags & AI_CANONNAME)? clen + 1 : 0))))
+               return dns_syerr();
+
+       memset(*ent, '\0', sizeof **ent);
+
+       (*ent)->ai_family       = saddr->sa_family;
+       (*ent)->ai_socktype     = ai->hints.ai_socktype;
+       (*ent)->ai_protocol     = ai->hints.ai_protocol;
+
+       (*ent)->ai_addr         = memcpy((unsigned char *)*ent + sizeof **ent, saddr, dns_sa_len(saddr));
+       (*ent)->ai_addrlen      = dns_sa_len(saddr);
+
+       if (ai->hints.ai_flags & AI_CANONNAME)
+               (*ent)->ai_canonname    = memcpy((unsigned char *)*ent + sizeof **ent + dns_sa_len(saddr), cname, clen + 1);
+
+       return 0;
+} /* dns_ai_setent() */
+
+
+enum dns_ai_state {
+       DNS_AI_S_INIT,
+       DNS_AI_S_NUMERIC,
+       DNS_AI_S_SUBMIT,
+       DNS_AI_S_CHECK,
+       DNS_AI_S_FETCH,
+       DNS_AI_S_FOREACH_I,
+       DNS_AI_S_FOREACH_G,
+       DNS_AI_S_SUBMIT_G,
+       DNS_AI_S_CHECK_G,
+       DNS_AI_S_FETCH_G,
+       DNS_AI_S_DONE,
+}; /* enum dns_ai_state */
+
+#define dns_ai_goto(which)     do { ai->state = (which); goto exec; } while (0)
+
+int dns_ai_nextent(struct addrinfo **ent, struct dns_addrinfo *ai) {
+       struct dns_packet *ans, *glue;
+       struct dns_rr rr;
+       char qname[DNS_D_MAXNAME + 1];
+       union dns_any any;
+       size_t len;
+       int error;
+
+       *ent = 0;
+
+exec:
+
+       switch (ai->state) {
+       case DNS_AI_S_INIT:
+               ai->state++;
+       case DNS_AI_S_NUMERIC:
+               if (1 == dns_inet_pton(AF_INET, ai->qname, &any.a)) {
+                       ai->state = DNS_AI_S_DONE;
+
+                       return dns_ai_setent(ent, &any, DNS_T_A, ai);
+               }
+
+               if (1 == dns_inet_pton(AF_INET6, ai->qname, &any.aaaa)) {
+                       ai->state = DNS_AI_S_DONE;
+
+                       return dns_ai_setent(ent, &any, DNS_T_AAAA, ai);
+               }
+
+               if (ai->hints.ai_flags & AI_NUMERICHOST)
+                       dns_ai_goto(DNS_AI_S_DONE);
+
+               ai->state++;
+       case DNS_AI_S_SUBMIT:
+               if ((error = dns_res_submit(ai->res, ai->qname, ai->qtype, DNS_C_IN)))
+                       return error;
+
+               ai->state++;
+       case DNS_AI_S_CHECK:
+               if ((error = dns_res_check(ai->res)))
+                       return error;
+
+               ai->state++;
+       case DNS_AI_S_FETCH:
+               if (!(ai->answer = dns_res_fetch(ai->res, &error)))
+                       return error;
+
+               if ((error = dns_p_study(ai->answer)))
+                       return error;
+
+               ai->glue = ai->answer;
+
+               dns_rr_i_init(&ai->i, ai->answer);
+
+               ai->i.section = DNS_S_AN;
+               ai->i.type    = ai->qtype;
+               ai->i.sort    = &dns_rr_i_order;
+
+               ai->state++;
+       case DNS_AI_S_FOREACH_I:
+               /* Search generator may have changed our qname. */
+               if (!(len = dns_d_expand(qname, sizeof qname, 12, ai->answer, &error)))
+                       return error;
+               else if (len >= sizeof qname)
+                       return DNS_EILLEGAL;
+
+               if (!dns_d_cname(ai->cname, sizeof ai->cname, qname, strlen(qname), ai->answer, &error))
+                       return error;
+
+               ai->i.name = ai->cname;
+
+               if (!dns_rr_grep(&rr, 1, &ai->i, ai->answer, &error))
+                       dns_ai_goto(DNS_AI_S_DONE);
+
+               if ((error = dns_any_parse(&any, &rr, ai->answer)))
+                       return error;
+
+               ai->port = ai->qport;
+
+               switch (rr.type) {
+               case DNS_T_A:
+               case DNS_T_AAAA:
+                       return dns_ai_setent(ent, &any, rr.type, ai);
+               default:
+                       if (!dns_any_cname(ai->cname, sizeof ai->cname, &any, rr.type))
+                               dns_ai_goto(DNS_AI_S_FOREACH_I);
+
+                       /*
+                        * Find the "real" canonical name. Some authorities
+                        * publish aliases where an RFC defines a canonical
+                        * name. We trust that the resolver followed any
+                        * CNAME chains on it's own, regardless of whether
+                        * the "smart" option is enabled.
+                        */
+                       if (!dns_d_cname(ai->cname, sizeof ai->cname, ai->cname, strlen(ai->cname), ai->answer, &error))
+                               return error;
+
+                       if (rr.type == DNS_T_SRV)
+                               ai->port = any.srv.port;
+
+                       break;
+               } /* switch() */
+
+               dns_rr_i_init(&ai->g, ai->glue);
+
+               ai->g.section = DNS_S_ALL & ~DNS_S_QD;
+               ai->g.name    = ai->cname;
+               ai->g.type    = (ai->hints.ai_family == AF_INET6)? DNS_T_AAAA : DNS_T_A;
+
+               ai->state++;
+       case DNS_AI_S_FOREACH_G:
+               if (!dns_rr_grep(&rr, 1, &ai->g, ai->glue, &error)) {
+                       if (dns_rr_i_count(&ai->g) > 0)
+                               dns_ai_goto(DNS_AI_S_FOREACH_I);
+                       else
+                               dns_ai_goto(DNS_AI_S_SUBMIT_G);
+               }
+
+               if ((error = dns_any_parse(&any, &rr, ai->glue)))
+                       return error;
+
+               return dns_ai_setent(ent, &any, rr.type, ai);
+       case DNS_AI_S_SUBMIT_G:
+               if (dns_rr_grep(&rr, 1, dns_rr_i_new(ai->glue, .section = DNS_S_QD, .name = ai->g.name, .type = ai->g.type), ai->glue, &error))
+                       dns_ai_goto(DNS_AI_S_FOREACH_I);
+
+               if ((error = dns_res_submit(ai->res, ai->g.name, ai->g.type, DNS_C_IN)))
+                       return error;
+
+               ai->state++;
+       case DNS_AI_S_CHECK_G:
+               if ((error = dns_res_check(ai->res)))
+                       return error;
+
+               ai->state++;
+       case DNS_AI_S_FETCH_G:
+               if (!(ans = dns_res_fetch(ai->res, &error)))
+                       return error;
+
+               dns_p_study(ans);
+
+               glue = dns_p_merge(ai->glue, DNS_S_ALL, ans, DNS_S_ALL, &error);
+
+               free(ans);
+
+               if (!glue)
+                       return error;
+
+               if (ai->glue != ai->answer)
+                       free(ai->glue);
+
+               ai->glue = glue;
+
+               dns_rr_i_init(&ai->g, ai->glue);
+
+               /* ai->g.name should already point to ai->cname */
+               if (!dns_d_cname(ai->cname, sizeof ai->cname, ai->cname, strlen(ai->cname), ai->glue, &error))
+                       dns_ai_goto(DNS_AI_S_FOREACH_I);
+
+               /* NOTE: Keep all the other iterator filters */
+
+               dns_ai_goto(DNS_AI_S_FOREACH_G);
+       case DNS_AI_S_DONE:
+               return ENOENT;
+       default:
+               return EINVAL;
+       } /* switch() */
+} /* dns_ai_nextent() */
+
+
+time_t dns_ai_elapsed(struct dns_addrinfo *ai) {
+       return dns_res_elapsed(ai->res);
+} /* dns_ai_elapsed() */
+
+
+void dns_ai_clear(struct dns_addrinfo *ai) {
+       return dns_res_clear(ai->res);
+} /* dns_ai_clear() */
+
+
+int dns_ai_events(struct dns_addrinfo *ai) {
+       return dns_res_events(ai->res);
+} /* dns_ai_events() */
+
+
+int dns_ai_pollfd(struct dns_addrinfo *ai) {
+       return dns_res_pollfd(ai->res);
+} /* dns_ai_pollfd() */
+
+
+int dns_ai_poll(struct dns_addrinfo *ai, int timeout) {
+       return dns_res_poll(ai->res, timeout);
+} /* dns_ai_poll() */
+
+
+size_t dns_ai_print(void *dst, size_t lim, struct addrinfo *ent, struct dns_addrinfo *ai) {
+       char addr[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
+       size_t cp       = 0;
+
+       cp      += dns__printstring(dst, lim, cp, "[ ");
+       cp      += dns__printstring(dst, lim, cp, ai->qname);
+       cp      += dns__printstring(dst, lim, cp, " IN ");
+       cp      += dns__printstring(dst, lim, cp, dns_strtype(ai->qtype));
+       cp      += dns__printstring(dst, lim, cp, " ]\n");
+
+       cp      += dns__printstring(dst, lim, cp, ".ai_family    = ");
+
+       switch (ent->ai_family) {
+       case AF_INET:
+               cp      += dns__printstring(dst, lim, cp, "AF_INET");
+               break;
+       case AF_INET6:
+               cp      += dns__printstring(dst, lim, cp, "AF_INET6");
+               break;
+       default:
+               cp      += dns__print10(dst, lim, cp, ent->ai_family, 0);
+               break;
+       }
+
+       cp      += dns__printchar(dst, lim, cp, '\n');
+
+       cp      += dns__printstring(dst, lim, cp, ".ai_socktype  = ");
+
+       switch (ent->ai_socktype) {
+       case SOCK_STREAM:
+               cp      += dns__printstring(dst, lim, cp, "SOCK_STREAM");
+               break;
+       case SOCK_DGRAM:
+               cp      += dns__printstring(dst, lim, cp, "SOCK_DGRAM");
+               break;
+       default:
+               cp      += dns__print10(dst, lim, cp, ent->ai_socktype, 0);
+               break;
+       }
+
+       cp      += dns__printchar(dst, lim, cp, '\n');
+
+       cp      += dns__printstring(dst, lim, cp, ".ai_addr      = [");
+
+       dns_inet_ntop(dns_sa_family(ent->ai_addr), dns_sa_addr(dns_sa_family(ent->ai_addr), ent->ai_addr), addr, sizeof addr);
+
+       cp      += dns__printstring(dst, lim, cp, addr);
+       cp      += dns__printstring(dst, lim, cp, "]:");
+
+       cp      += dns__print10(dst, lim, cp, ntohs(*dns_sa_port(dns_sa_family(ent->ai_addr), ent->ai_addr)), 0);
+       cp      += dns__printchar(dst, lim, cp, '\n');
+
+       cp      += dns__printstring(dst, lim, cp, ".ai_canonname = ");
+       cp      += dns__printstring(dst, lim, cp, (ent->ai_canonname)? ent->ai_canonname : "[NULL]");
+       cp      += dns__printchar(dst, lim, cp, '\n');
+
+       dns__printnul(dst, lim, cp);
+
+       return cp;
+} /* dns_ai_print() */
+
+
+const struct dns_stat *dns_ai_stat(struct dns_addrinfo *ai) {
+       return dns_res_stat(ai->res);
+} /* dns_ai_stat() */
+
+
+/*
+ * M I S C E L L A N E O U S  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+static const struct {
+       char name[16];
+       enum dns_section type;
+} dns_sections[] = {
+       { "QUESTION",   DNS_S_QUESTION },
+       { "QD",         DNS_S_QUESTION },
+       { "ANSWER",     DNS_S_ANSWER },
+       { "AN",         DNS_S_ANSWER },
+       { "AUTHORITY",  DNS_S_AUTHORITY },
+       { "NS",         DNS_S_AUTHORITY },
+       { "ADDITIONAL", DNS_S_ADDITIONAL },
+       { "AR",         DNS_S_ADDITIONAL },
+};
+
+const char *(dns_strsection)(enum dns_section section, void *dst, size_t lim) {
+       unsigned i, p = 0;
+
+       for (i = 0; i < lengthof(dns_sections); i++) {
+               if (dns_sections[i].type & section) {
+                       if (p > 0)
+                               p += dns__printchar(dst, lim, p, '|');
+
+                       p += dns__printstring(dst, lim, p, dns_sections[i].name);
+
+                       section &= ~dns_sections[i].type;
+               }
+       }
+
+       if (!p)
+               p += dns__print10(dst, lim, 0, (0xffff & section), 0);
+
+       dns__printnul(dst, lim, p);
+
+       return dst;
+} /* dns_strsection() */
+
+
+enum dns_section dns_isection(const char *src) {
+       enum dns_section section = 0;
+       char sbuf[128];
+       char *name, *next;
+       unsigned i;
+
+       dns_strlcpy(sbuf, src, sizeof sbuf);
+       next = sbuf;
+
+       while ((name = dns_strsep(&next, "|+, \t"))) {
+               for (i = 0; i < lengthof(dns_sections); i++) {
+                       if (!strcasecmp(dns_sections[i].name, name)) {
+                               section |= dns_sections[i].type;
+                               break;
+                       }
+               }
+       }
+
+       return section;
+} /* dns_isection() */
+
+
+static const struct {
+       char name[8];
+       enum dns_class type;
+} dns_classes[] = {
+       { "IN", DNS_C_IN },
+};
+
+const char *(dns_strclass)(enum dns_class type, void *dst, size_t lim) {
+       unsigned i;
+
+       for (i = 0; i < lengthof(dns_classes); i++) {
+               if (dns_classes[i].type == type) {
+                       dns__printnul(dst, lim, dns__printstring(dst, lim, 0, dns_classes[i].name));
+
+                       return dst;
+               }
+       }
+
+       dns__printnul(dst, lim, dns__print10(dst, lim, 0, (0xffff & type), 0));
+
+       return dst;
+} /* dns_strclass() */
+
+
+enum dns_class dns_iclass(const char *name) {
+       unsigned i;
+
+       for (i = 0; i < lengthof(dns_classes); i++) {
+               if (!strcasecmp(dns_classes[i].name, name))
+                       return dns_classes[i].type;
+       }
+
+       return 0;
+} /* dns_iclass() */
+
+
+const char *(dns_strtype)(enum dns_type type, void *dst, size_t lim) {
+       unsigned i;
+
+       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+               if (dns_rrtypes[i].type == type) {
+                       dns__printnul(dst, lim, dns__printstring(dst, lim, 0, dns_rrtypes[i].name));
+
+                       return dst;
+               }
+       }
+
+       dns__printnul(dst, lim, dns__print10(dst, lim, 0, (0xffff & type), 0));
+
+       return dst;
+} /* dns_strtype() */
+
+
+enum dns_type dns_itype(const char *type) {
+       unsigned i;
+
+       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+               if (!strcasecmp(dns_rrtypes[i].name, type))
+                       return dns_rrtypes[i].type;
+       }
+
+       return 0;
+} /* dns_itype() */
+
+
+static char dns_opcodes[16][16] = {
+       [DNS_OP_QUERY]  = "QUERY",
+       [DNS_OP_IQUERY] = "IQUERY",
+       [DNS_OP_STATUS] = "STATUS",
+       [DNS_OP_NOTIFY] = "NOTIFY",
+       [DNS_OP_UPDATE] = "UPDATE",
+};
+
+const char *dns_stropcode(enum dns_opcode opcode) {
+       opcode &= 0xf;
+
+       if ('\0' == dns_opcodes[opcode][0])
+               dns__printnul(dns_opcodes[opcode], sizeof dns_opcodes[opcode], dns__print10(dns_opcodes[opcode], sizeof dns_opcodes[opcode], 0, opcode, 0));
+
+       return dns_opcodes[opcode];
+} /* dns_stropcode() */
+
+
+enum dns_opcode dns_iopcode(const char *name) {
+       unsigned opcode;
+
+       for (opcode = 0; opcode < lengthof(dns_opcodes); opcode++) {
+               if (!strcasecmp(name, dns_opcodes[opcode]))
+                       return opcode;
+       }
+
+       return lengthof(dns_opcodes) - 1;
+} /* dns_iopcode() */
+
+
+static char dns_rcodes[16][16] = {
+       [DNS_RC_NOERROR]  = "NOERROR",
+       [DNS_RC_FORMERR]  = "FORMERR",
+       [DNS_RC_SERVFAIL] = "SERVFAIL",
+       [DNS_RC_NXDOMAIN] = "NXDOMAIN",
+       [DNS_RC_NOTIMP]   = "NOTIMP",
+       [DNS_RC_REFUSED]  = "REFUSED",
+       [DNS_RC_YXDOMAIN] = "YXDOMAIN",
+       [DNS_RC_YXRRSET]  = "YXRRSET",
+       [DNS_RC_NXRRSET]  = "NXRRSET",
+       [DNS_RC_NOTAUTH]  = "NOTAUTH",
+       [DNS_RC_NOTZONE]  = "NOTZONE",
+};
+
+const char *dns_strrcode(enum dns_rcode rcode) {
+       rcode &= 0xf;
+
+       if ('\0' == dns_rcodes[rcode][0])
+               dns__printnul(dns_rcodes[rcode], sizeof dns_rcodes[rcode], dns__print10(dns_rcodes[rcode], sizeof dns_rcodes[rcode], 0, rcode, 0));
+
+       return dns_rcodes[rcode];
+} /* dns_strrcode() */
+
+
+enum dns_rcode dns_ircode(const char *name) {
+       unsigned rcode;
+
+       for (rcode = 0; rcode < lengthof(dns_rcodes); rcode++) {
+               if (!strcasecmp(name, dns_rcodes[rcode]))
+                       return rcode;
+       }
+
+       return lengthof(dns_rcodes) - 1;
+} /* dns_ircode() */
+
+
+/*
+ * C O M M A N D - L I N E / R E G R E S S I O N  R O U T I N E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#if DNS_MAIN
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <ctype.h>
+
+#if _WIN32
+#include <getopt.h>
+#endif
+
+#if !_WIN32
+#include <err.h>
+#endif
+
+
+struct {
+       struct {
+               const char *path[8];
+               unsigned count;
+       } resconf;
+
+       struct {
+               const char *path[8];
+               unsigned count;
+       } hosts;
+
+       struct {
+               const char *path[8];
+               unsigned count;
+       } cache;
+
+       const char *qname;
+       enum dns_type qtype;
+
+       int (*sort)();
+
+       int verbose;
+} MAIN = {
+       .sort   = &dns_rr_i_packet,
+};
+
+
+void hexdump(const unsigned char *src, size_t len, FILE *fp) {
+       static const unsigned char hex[]        = "0123456789abcdef";
+       static const unsigned char tmpl[]       = "                                                    |                |\n";
+       unsigned char ln[sizeof tmpl];
+       const unsigned char *sp, *se;
+       unsigned char *h, *g;
+       unsigned i, n;
+
+       sp      = src;
+       se      = sp + len;
+
+       while (sp < se) {
+               memcpy(ln, tmpl, sizeof ln);
+
+               h       = &ln[2];
+               g       = &ln[53];
+
+               for (n = 0; n < 2; n++) {
+                       for (i = 0; i < 8 && se - sp > 0; i++, sp++) {
+                               h[0]    = hex[0x0f & (*sp >> 4)];
+                               h[1]    = hex[0x0f & (*sp >> 0)];
+                               h       += 3;
+
+                               *g++    = (isgraph(*sp))? *sp : '.';
+                       }
+
+                       h++;
+               }
+
+               fputs((char *)ln, fp);
+       }
+
+       return /* void */;
+} /* hexdump() */
+
+
+static void panic(const char *fmt, ...) {
+       va_list ap;
+
+       va_start(ap, fmt);
+
+#if _WIN32
+       vfprintf(stderr, fmt, ap);
+
+       exit(EXIT_FAILURE);
+#else
+       verrx(EXIT_FAILURE, fmt, ap);
+#endif
+} /* panic() */
+
+#define panic_(fn, ln, fmt, ...)       \
+       panic(fmt "%0s", (fn), (ln), __VA_ARGS__)
+#define panic(...)                     \
+       panic_(__func__, __LINE__, "(%s:%d) " __VA_ARGS__, "")
+
+
+static void *grow(unsigned char *p, size_t size) {
+       void *tmp;
+
+       if (!(tmp = realloc(p, size)))
+               panic("realloc(%zu): %s", size, dns_strerror(errno));
+
+       return tmp;
+} /* grow() */
+
+
+static size_t add(size_t a, size_t b) {
+       if (~a < b)
+               panic("%zu + %zu: integer overflow", a, b);
+
+       return a + b;
+} /* add() */
+
+
+static size_t append(unsigned char **dst, size_t osize, const void *src, size_t len) {
+       size_t size = add(osize, len);
+
+       *dst = grow(*dst, size);
+       memcpy(*dst + osize, src, len);
+
+       return size;
+} /* append() */
+
+
+static size_t slurp(unsigned char **dst, size_t osize, FILE *fp, const char *path) {
+       size_t size = osize;
+       unsigned char buf[1024];
+       size_t count;
+
+       while ((count = fread(buf, 1, sizeof buf, fp)))
+               size = append(dst, size, buf, count);
+
+       if (ferror(fp))
+               panic("%s: %s", path, dns_strerror(errno));
+
+       return size;
+} /* slurp() */
+
+
+static struct dns_resolv_conf *resconf(void) {
+       static struct dns_resolv_conf *resconf;
+       const char *path;
+       unsigned i;
+       int error;
+
+       if (resconf)
+               return resconf;
+
+       if (!(resconf = dns_resconf_open(&error)))
+               panic("dns_resconf_open: %s", dns_strerror(error));
+
+       if (!MAIN.resconf.count)
+               MAIN.resconf.path[MAIN.resconf.count++] = "/etc/resolv.conf";
+
+       for (i = 0; i < MAIN.resconf.count; i++) {
+               path    = MAIN.resconf.path[i];
+
+               if (0 == strcmp(path, "-"))
+                       error   = dns_resconf_loadfile(resconf, stdin);
+               else
+                       error   = dns_resconf_loadpath(resconf, path);
+
+               if (error)
+                       panic("%s: %s", path, dns_strerror(error));
+       }
+
+       return resconf;
+} /* resconf() */
+
+
+static struct dns_hosts *hosts(void) {
+       static struct dns_hosts *hosts;
+       const char *path;
+       unsigned i;
+       int error;
+
+       if (hosts)
+               return hosts;
+
+       if (!MAIN.hosts.count) {
+               MAIN.hosts.path[MAIN.hosts.count++]     = "/etc/hosts";
+
+               /* Explicitly test dns_hosts_local() */
+               if (!(hosts = dns_hosts_local(&error)))
+                       panic("%s: %s", "/etc/hosts", dns_strerror(error));
+
+               return hosts;
+       }
+
+       if (!(hosts = dns_hosts_open(&error)))
+               panic("dns_hosts_open: %s", dns_strerror(error));
+
+       for (i = 0; i < MAIN.hosts.count; i++) {
+               path    = MAIN.hosts.path[i];
+
+               if (0 == strcmp(path, "-"))
+                       error   = dns_hosts_loadfile(hosts, stdin);
+               else
+                       error   = dns_hosts_loadpath(hosts, path);
+               
+               if (error)
+                       panic("%s: %s", path, dns_strerror(error));
+       }
+
+       return hosts;
+} /* hosts() */
+
+
+#if DNS_CACHE
+#include "cache.h"
+
+struct dns_cache *cache(void) {
+       static struct cache *cache;
+       const char *path;
+       unsigned i;
+       int error;
+
+       if (cache)
+               return cache_resi(cache);
+       if (!MAIN.cache.count)
+               return NULL;
+
+       if (!(cache = cache_open(&error)))
+               panic("%s: %s", MAIN.cache.path[0], dns_strerror(error));
+
+       for (i = 0; i < MAIN.cache.count; i++) {
+               path = MAIN.cache.path[i];
+
+               if (!strcmp(path, "-")) {
+                       if ((error = cache_loadfile(cache, stdin, NULL, 0)))
+                               panic("%s: %s", path, dns_strerror(error));
+               } else if ((error = cache_loadpath(cache, path, NULL, 0)))
+                       panic("%s: %s", path, dns_strerror(error));
+       }
+
+       return cache_resi(cache);
+} /* cache() */
+#else
+struct dns_cache *cache(void) { return NULL; }
+#endif
+
+
+static void print_packet(struct dns_packet *P, FILE *fp) {
+       dns_p_dump3(P, dns_rr_i_new(P, .sort = MAIN.sort), fp);
+
+       if (MAIN.verbose > 2)
+               hexdump(P->data, P->end, fp);
+} /* print_packet() */
+
+
+static int parse_packet(int argc, char *argv[]) {
+       struct dns_packet *P    = dns_p_new(512);
+       struct dns_packet *Q    = dns_p_new(512);
+       enum dns_section section;
+       struct dns_rr rr;
+       int error;
+       union dns_any any;
+       char pretty[sizeof any * 2];
+       size_t len;
+
+       P->end  = fread(P->data, 1, P->size, stdin);
+
+       fputs(";; [HEADER]\n", stdout);
+       fprintf(stdout, ";;     qr : %s(%d)\n", (dns_header(P)->qr)? "QUERY" : "RESPONSE", dns_header(P)->qr);
+       fprintf(stdout, ";; opcode : %s(%d)\n", dns_stropcode(dns_header(P)->opcode), dns_header(P)->opcode);
+       fprintf(stdout, ";;     aa : %s(%d)\n", (dns_header(P)->aa)? "AUTHORITATIVE" : "NON-AUTHORITATIVE", dns_header(P)->aa);
+       fprintf(stdout, ";;     tc : %s(%d)\n", (dns_header(P)->tc)? "TRUNCATED" : "NOT-TRUNCATED", dns_header(P)->tc);
+       fprintf(stdout, ";;     rd : %s(%d)\n", (dns_header(P)->rd)? "RECURSION-DESIRED" : "RECURSION-NOT-DESIRED", dns_header(P)->rd);
+       fprintf(stdout, ";;     ra : %s(%d)\n", (dns_header(P)->ra)? "RECURSION-ALLOWED" : "RECURSION-NOT-ALLOWED", dns_header(P)->ra);
+       fprintf(stdout, ";;  rcode : %s(%d)\n", dns_strrcode(dns_header(P)->rcode), dns_header(P)->rcode);
+
+       section = 0;
+
+       dns_rr_foreach(&rr, P, .sort = MAIN.sort) {
+               if (section != rr.section)
+                       fprintf(stdout, "\n;; [%s:%d]\n", dns_strsection(rr.section), dns_p_count(P, rr.section));
+
+               if ((len = dns_rr_print(pretty, sizeof pretty, &rr, P, &error)))
+                       fprintf(stdout, "%s\n", pretty);
+
+               dns_rr_copy(Q, &rr, P);
+
+               section = rr.section;
+       }
+
+       fputs("; ; ; ; ; ; ; ;\n\n", stdout);
+
+       section = 0;
+
+#if 0
+       dns_rr_foreach(&rr, Q, .name = "ns8.yahoo.com.") {
+#else
+       struct dns_rr rrset[32];
+       struct dns_rr_i *rri    = dns_rr_i_new(Q, .name = dns_d_new("ns8.yahoo.com", DNS_D_ANCHOR), .sort = MAIN.sort);
+       unsigned rrcount        = dns_rr_grep(rrset, lengthof(rrset), rri, Q, &error);
+       unsigned i;
+
+       for (i = 0; i < rrcount; i++) {
+               rr      = rrset[i];
+#endif
+               if (section != rr.section)
+                       fprintf(stdout, "\n;; [%s:%d]\n", dns_strsection(rr.section), dns_p_count(Q, rr.section));
+
+               if ((len = dns_rr_print(pretty, sizeof pretty, &rr, Q, &error)))
+                       fprintf(stdout, "%s\n", pretty);
+
+               section = rr.section;
+       }
+
+       if (MAIN.verbose > 1) {
+               fprintf(stderr, "orig:%zu\n", P->end);
+               hexdump(P->data, P->end, stdout);
+
+               fprintf(stderr, "copy:%zu\n", Q->end);
+               hexdump(Q->data, Q->end, stdout);
+       }
+
+       return 0;
+} /* parse_packet() */
+
+
+static int parse_domain(int argc, char *argv[]) {
+       char *dn;
+
+       dn      = (argc > 1)? argv[1] : "f.l.google.com";
+
+       printf("[%s]\n", dn);
+
+       dn      = dns_d_new(dn);
+
+       do {
+               puts(dn);
+       } while (dns_d_cleave(dn, strlen(dn) + 1, dn, strlen(dn)));
+
+       return 0;
+} /* parse_domain() */
+
+
+static int expand_domain(int argc, char *argv[]) {
+       unsigned short rp = 0;
+       unsigned char *src = NULL;
+       unsigned char *dst;
+       struct dns_packet *pkt;
+       size_t lim = 0, len;
+       int error;
+
+       if (argv[1])
+               rp = atoi(argv[1]);
+
+       len = slurp(&src, 0, stdin, "-");
+
+       if (!(pkt = dns_p_make(len, &error)))
+               panic("malloc(%zu): %s", len, dns_strerror(error));
+
+       memcpy(pkt->data, src, len);
+       pkt->end = len;
+
+       lim = 1;
+       dst = grow(NULL, lim);
+
+       while (lim <= (len = dns_d_expand(dst, lim, rp, pkt, &error))) {
+               lim = add(len, 1);
+               dst = grow(dst, lim);
+       }
+
+       if (!len)
+               panic("expand: %s", dns_strerror(error));
+
+       fwrite(dst, 1, len, stdout);
+       fflush(stdout);
+
+       free(src);
+       free(dst);
+       free(pkt);
+
+       return 0;
+} /* expand_domain() */
+
+
+static int show_resconf(int argc, char *argv[]) {
+       unsigned i;
+
+       resconf();      /* load it */
+
+       fputs("; SOURCES\n", stdout);
+
+       for (i = 0; i < MAIN.resconf.count; i++)
+               fprintf(stdout, ";   %s\n", MAIN.resconf.path[i]);
+
+       fputs(";\n", stdout);
+
+       dns_resconf_dump(resconf(), stdout);
+
+       return 0;
+} /* show_resconf() */
+
+
+static int show_hosts(int argc, char *argv[]) {
+       unsigned i;
+
+       hosts();
+
+       fputs("# SOURCES\n", stdout);
+
+       for (i = 0; i < MAIN.hosts.count; i++)
+               fprintf(stdout, "#   %s\n", MAIN.hosts.path[i]);
+
+       fputs("#\n", stdout);
+
+       dns_hosts_dump(hosts(), stdout);
+
+       return 0;
+} /* show_hosts() */
+
+
+static int query_hosts(int argc, char *argv[]) {
+       struct dns_packet *Q    = dns_p_new(512);
+       struct dns_packet *A;
+       char qname[DNS_D_MAXNAME + 1];
+       size_t qlen;
+       int error;
+
+       if (!MAIN.qname)
+               MAIN.qname      = (argc > 1)? argv[1] : "localhost";
+       if (!MAIN.qtype)
+               MAIN.qtype      = DNS_T_A;
+
+       hosts();
+
+       if (MAIN.qtype == DNS_T_PTR && !strstr(MAIN.qname, "arpa")) {
+               union { struct in_addr a; struct in6_addr a6; } addr;
+               int af  = (strchr(MAIN.qname, ':'))? AF_INET6 : AF_INET;
+
+               if (1 != dns_inet_pton(af, MAIN.qname, &addr))
+                       panic("%s: %s", MAIN.qname, dns_strerror(error));
+
+               qlen    = dns_ptr_qname(qname, sizeof qname, af, &addr);
+       } else
+               qlen    = dns__printstring(qname, sizeof qname, 0, MAIN.qname);
+
+       if ((error = dns_p_push(Q, DNS_S_QD, qname, qlen, MAIN.qtype, DNS_C_IN, 0, 0)))
+               panic("%s: %s", qname, dns_strerror(error));
+
+       if (!(A = dns_hosts_query(hosts(), Q, &error)))
+               panic("%s: %s", qname, dns_strerror(error));
+
+       print_packet(A, stdout);
+
+       free(A);
+
+       return 0;
+} /* query_hosts() */
+
+
+static int search_list(int argc, char *argv[]) {
+       const char *qname       = (argc > 1)? argv[1] : "f.l.google.com";
+       unsigned long i         = 0;
+       char name[DNS_D_MAXNAME + 1];
+
+       printf("[%s]\n", qname);
+
+       while (dns_resconf_search(name, sizeof name, qname, strlen(qname), resconf(), &i))
+               puts(name);
+
+       return 0;
+} /* search_list() */
+
+
+int permute_set(int argc, char *argv[]) {
+       unsigned lo, hi, i;
+       struct dns_k_permutor p;
+
+       hi      = (--argc > 0)? atoi(argv[argc]) : 8;
+       lo      = (--argc > 0)? atoi(argv[argc]) : 0;
+
+       fprintf(stderr, "[%u .. %u]\n", lo, hi);
+
+       dns_k_permutor_init(&p, lo, hi);
+
+       for (i = lo; i <= hi; i++)
+               fprintf(stdout, "%u\n", dns_k_permutor_step(&p));
+//             printf("%u -> %u -> %u\n", i, dns_k_permutor_E(&p, i), dns_k_permutor_D(&p, dns_k_permutor_E(&p, i)));
+
+       return 0;
+} /* permute_set() */
+
+
+int shuffle_16(int argc, char *argv[]) {
+       unsigned n, r;
+
+       if (--argc > 0) {
+               n = 0xffff & atoi(argv[argc]);
+               r = (--argc > 0)? (unsigned)atoi(argv[argc]) : dns_random();
+
+               fprintf(stdout, "%hu\n", dns_k_shuffle16(n, r));
+       } else {
+               r = dns_random();
+
+               for (n = 0; n < 65536; n++)
+                       fprintf(stdout, "%hu\n", dns_k_shuffle16(n, r));
+       }
+
+       return 0;
+} /* shuffle_16() */
+
+
+int dump_random(int argc, char *argv[]) {
+       unsigned char b[32];
+       unsigned i, j, n, r;
+
+       n       = (argc > 1)? atoi(argv[1]) : 32;
+
+       while (n) {
+               i       = 0;
+
+               do {
+                       r       = dns_random();
+
+                       for (j = 0; j < sizeof r && i < n && i < sizeof b; i++, j++) {
+                               b[i]    = 0xff & r;
+                               r       >>= 8;
+                       }
+               } while (i < n && i < sizeof b);
+
+               hexdump(b, i, stdout);
+
+               n       -= i;
+       }
+
+       return 0;
+} /* dump_random() */
+
+
+static int send_query(int argc, char *argv[]) {
+       struct dns_packet *A, *Q        = dns_p_new(512);
+       char host[INET6_ADDRSTRLEN + 1];
+       struct sockaddr_storage ss;
+       struct dns_socket *so;
+       int error, type;
+
+       if (argc > 1) {
+               ss.ss_family    = (strchr(argv[1], ':'))? AF_INET6 : AF_INET;
+               
+               if (1 != dns_inet_pton(ss.ss_family, argv[1], dns_sa_addr(ss.ss_family, &ss)))
+                       panic("%s: invalid host address", argv[1]);
+
+               *dns_sa_port(ss.ss_family, &ss) = htons(53);
+       } else
+               memcpy(&ss, &resconf()->nameserver[0], dns_sa_len(&resconf()->nameserver[0]));
+
+       if (!dns_inet_ntop(ss.ss_family, dns_sa_addr(ss.ss_family, &ss), host, sizeof host))
+               panic("bad host address, or none provided");
+
+       if (!MAIN.qname)
+               MAIN.qname      = "ipv6.google.com";
+       if (!MAIN.qtype)
+               MAIN.qtype      = DNS_T_AAAA;
+
+       if ((error = dns_p_push(Q, DNS_S_QD, MAIN.qname, strlen(MAIN.qname), MAIN.qtype, DNS_C_IN, 0, 0)))
+               panic("dns_p_push: %s", dns_strerror(error));
+
+       dns_header(Q)->rd       = 1;
+
+       if (strstr(argv[0], "udp"))
+               type    = SOCK_DGRAM;
+       else if (strstr(argv[0], "tcp"))
+               type    = SOCK_STREAM;
+       else
+               type    = dns_res_tcp2type(resconf()->options.tcp);
+
+       fprintf(stderr, "querying %s for %s IN %s\n", host, MAIN.qname, dns_strtype(MAIN.qtype));
+
+       if (!(so = dns_so_open((struct sockaddr *)&resconf()->iface, type, dns_opts(), &error)))
+               panic("dns_so_open: %s", dns_strerror(error));
+
+       while (!(A = dns_so_query(so, Q, (struct sockaddr *)&ss, &error))) {
+               if (error != EAGAIN)
+                       panic("dns_so_query: %s (%d)", dns_strerror(error), error);
+               if (dns_so_elapsed(so) > 10)
+                       panic("query timed-out");
+
+               dns_so_poll(so, 1);
+       }
+
+       print_packet(A, stdout);
+
+       dns_so_close(so);
+
+       return 0;
+} /* send_query() */
+
+
+static int print_arpa(int argc, char *argv[]) {
+       const char *ip  = (argc > 1)? argv[1] : "::1";
+       int af          = (strchr(ip, ':'))? AF_INET6 : AF_INET;
+       union { struct in_addr a4; struct in6_addr a6; } addr;
+       char host[DNS_D_MAXNAME + 1];
+
+       if (1 != dns_inet_pton(af, ip, &addr) || 0 == dns_ptr_qname(host, sizeof host, af, &addr))
+               panic("%s: invalid address", ip);
+
+       fprintf(stdout, "%s\n", host);
+
+       return 0;
+} /* print_arpa() */
+
+
+static int show_hints(int argc, char *argv[]) {
+       struct dns_hints *(*load)(struct dns_resolv_conf *, int *);
+       const char *which, *how, *who;
+       struct dns_hints *hints;
+       int error;
+
+       which   = (argc > 1)? argv[1] : "local";
+       how     = (argc > 2)? argv[2] : "plain";
+       who     = (argc > 3)? argv[3] : "google.com";
+
+       load    = (0 == strcmp(which, "local"))
+               ? &dns_hints_local
+               : &dns_hints_root;
+
+       if (!(hints = load(resconf(), &error)))
+               panic("%s: %s", argv[0], dns_strerror(error));
+
+       if (0 == strcmp(how, "plain")) {
+               dns_hints_dump(hints, stdout);
+       } else {
+               struct dns_packet *query, *answer;
+
+               query   = dns_p_new(512);
+
+               if ((error = dns_p_push(query, DNS_S_QUESTION, who, strlen(who), DNS_T_A, DNS_C_IN, 0, 0)))
+                       panic("%s: %s", who, dns_strerror(error));
+
+               if (!(answer = dns_hints_query(hints, query, &error)))
+                       panic("%s: %s", who, dns_strerror(error));
+
+               print_packet(answer, stdout);
+
+               free(answer);
+       }
+
+       dns_hints_close(hints);
+
+       return 0;
+} /* show_hints() */
+
+
+static int resolve_query(int argc, char *argv[]) {
+       struct dns_hints *(*hints)()    = (strstr(argv[0], "recurse"))? &dns_hints_root : &dns_hints_local;
+       struct dns_resolver *R;
+       struct dns_packet *ans;
+       const struct dns_stat *st;
+       int error;
+
+       if (!MAIN.qname)
+               MAIN.qname      = "www.google.com";
+       if (!MAIN.qtype)        
+               MAIN.qtype      = DNS_T_A;
+
+       resconf()->options.recurse      = (0 != strstr(argv[0], "recurse"));
+
+       if (!(R = dns_res_open(resconf(), hosts(), dns_hints_mortal(hints(resconf(), &error)), cache(), dns_opts(), &error)))
+               panic("%s: %s", MAIN.qname, dns_strerror(error));
+
+       if ((error = dns_res_submit(R, MAIN.qname, MAIN.qtype, DNS_C_IN)))
+               panic("%s: %s", MAIN.qname, dns_strerror(error));
+
+       while ((error = dns_res_check(R))) {
+               if (error != EAGAIN)
+                       panic("dns_res_check: %s (%d)", dns_strerror(error), error);
+               if (dns_res_elapsed(R) > 30)
+                       panic("query timed-out");
+
+               dns_res_poll(R, 1);
+       }
+
+       ans = dns_res_fetch(R, &error);
+       print_packet(ans, stdout);
+       free(ans);
+
+       st = dns_res_stat(R);
+       putchar('\n');
+       printf(";; queries:  %zu\n", st->queries);
+       printf(";; udp sent: %zu in %zu bytes\n", st->udp.sent.count, st->udp.sent.bytes);
+       printf(";; udp rcvd: %zu in %zu bytes\n", st->udp.rcvd.count, st->udp.rcvd.bytes);
+       printf(";; tcp sent: %zu in %zu bytes\n", st->tcp.sent.count, st->tcp.sent.bytes);
+       printf(";; tcp rcvd: %zu in %zu bytes\n", st->tcp.rcvd.count, st->tcp.rcvd.bytes);
+
+       dns_res_close(R);
+
+       return 0;
+} /* resolve_query() */
+
+
+static int resolve_addrinfo(int argc, char *argv[]) {
+       struct dns_hints *(*hints)()    = (strstr(argv[0], "recurse"))? &dns_hints_root : &dns_hints_local;
+       struct dns_resolver *res        = 0;
+       struct dns_addrinfo *ai         = 0;
+       struct addrinfo ai_hints        = { .ai_family = PF_UNSPEC, .ai_socktype = SOCK_STREAM, .ai_flags = AI_CANONNAME };
+       struct addrinfo *ent;
+       char pretty[512];
+       int error;
+
+       if (!MAIN.qname)
+               MAIN.qname      = "www.google.com";
+       if (!MAIN.qtype)        
+               MAIN.qtype      = DNS_T_A;
+
+       resconf()->options.recurse      = (0 != strstr(argv[0], "recurse"));
+
+       if (!(res = dns_res_open(resconf(), hosts(), dns_hints_mortal(hints(resconf(), &error)), cache(), dns_opts(), &error)))
+               panic("%s: %s", MAIN.qname, dns_strerror(error));
+
+       if (!(ai = dns_ai_open(MAIN.qname, "80", MAIN.qtype, &ai_hints, res, &error)))
+               panic("%s: %s", MAIN.qname, dns_strerror(error));
+
+       do {
+               switch (error = dns_ai_nextent(&ent, ai)) {
+               case 0:
+                       dns_ai_print(pretty, sizeof pretty, ent, ai);
+
+                       fputs(pretty, stdout);
+
+                       free(ent);
+
+                       break;
+               case ENOENT:
+                       break;
+               case EAGAIN:
+                       if (dns_ai_elapsed(ai) > 30)
+                               panic("query timed-out");
+
+                       dns_ai_poll(ai, 1);
+
+                       break;
+               default:
+                       panic("dns_ai_nextent: %s (%d)", dns_strerror(error), error);
+               }
+       } while (error != ENOENT);
+
+       dns_res_close(res);
+       dns_ai_close(ai);
+
+       return 0;
+} /* resolve_addrinfo() */
+
+
+static int echo_port(int argc, char *argv[]) {
+       union {
+               struct sockaddr sa;
+               struct sockaddr_in sin;
+       } port;
+       int fd;
+       
+       memset(&port, 0, sizeof port);
+       port.sin.sin_family = AF_INET;
+       port.sin.sin_port = htons(5354);
+       port.sin.sin_addr.s_addr = inet_addr("127.0.0.1");
+
+       if (-1 == (fd = socket(PF_INET, SOCK_DGRAM, 0)))
+               panic("socket: %s", strerror(errno));
+
+       if (0 != bind(fd, &port.sa, sizeof port.sa))
+               panic("127.0.0.1:5353: %s", dns_strerror(errno));
+
+       for (;;) {
+               struct dns_packet *pkt = dns_p_new(512);
+               struct sockaddr_storage ss;
+               socklen_t slen = sizeof ss;
+               ssize_t count;
+#if defined(MSG_WAITALL) /* MinGW issue */
+               int rflags = MSG_WAITALL;
+#else
+               int rflags = 0;
+#endif
+
+               count = recvfrom(fd, (char *)pkt->data, pkt->size, rflags, (struct sockaddr *)&ss, &slen);
+
+
+               if (!count || count < 0)
+                       panic("recvfrom: %s", strerror(errno));
+
+               pkt->end = count;
+
+               dns_p_dump(pkt, stdout);
+
+               (void)sendto(fd, (char *)pkt->data, pkt->end, 0, (struct sockaddr *)&ss, slen);
+       }
+
+       return 0;
+} /* echo_port() */
+
+
+static int isection(int argc, char *argv[]) {
+       const char *name = (argv[1])? argv[1] : "";
+       int type;
+
+       type = dns_isection(name);
+       name = dns_strsection(type);
+
+       printf("%s (%d)\n", name, type);
+
+       return 0;
+} /* isection() */
+
+
+static int iclass(int argc, char *argv[]) {
+       const char *name = (argv[1])? argv[1] : "";
+       int type;
+
+       type = dns_iclass(name);
+       name = dns_strclass(type);
+
+       printf("%s (%d)\n", name, type);
+
+       return 0;
+} /* iclass() */
+
+
+static int itype(int argc, char *argv[]) {
+       const char *name = (argv[1])? argv[1] : "";
+       int type;
+
+       type = dns_itype(name);
+       name = dns_strtype(type);
+
+       printf("%s (%d)\n", name, type);
+
+       return 0;
+} /* itype() */
+
+
+static int iopcode(int argc, char *argv[]) {
+       const char *name = (argv[1])? argv[1] : "";
+       int type;
+
+       type = dns_iopcode(name);
+       name = dns_stropcode(type);
+
+       printf("%s (%d)\n", name, type);
+
+       return 0;
+} /* iopcode() */
+
+
+static int ircode(int argc, char *argv[]) {
+       const char *name = (argv[1])? argv[1] : "";
+       int type;
+
+       type = dns_ircode(name);
+       name = dns_strrcode(type);
+
+       printf("%s (%d)\n", name, type);
+
+       return 0;
+} /* ircode() */
+
+
+#define SIZE1(x) { DNS_PP_STRINGIFY(x), sizeof (x) }
+#define SIZE2(x, ...) SIZE1(x), SIZE1(__VA_ARGS__)
+#define SIZE3(x, ...) SIZE1(x), SIZE2(__VA_ARGS__)
+#define SIZE4(x, ...) SIZE1(x), SIZE3(__VA_ARGS__)
+#define SIZE(...) DNS_PP_CALL(DNS_PP_XPASTE(SIZE, DNS_PP_NARG(__VA_ARGS__)), __VA_ARGS__)
+
+static int sizes(int argc, char *argv[]) {
+       static const struct { const char *name; size_t size; } type[] = {
+               SIZE(struct dns_header, struct dns_packet, struct dns_rr, struct dns_rr_i),
+               SIZE(struct dns_a, struct dns_aaaa, struct dns_mx, struct dns_ns),
+               SIZE(struct dns_cname, struct dns_soa, struct dns_ptr, struct dns_srv),
+               SIZE(struct dns_sshfp, struct dns_txt, union dns_any),
+               SIZE(struct dns_resolv_conf, struct dns_hosts, struct dns_hints, struct dns_hints_i),
+               SIZE(struct dns_options, struct dns_socket, struct dns_resolver, struct dns_addrinfo),
+               SIZE(struct dns_cache),
+       };
+       unsigned i, max;
+
+       for (i = 0, max = 0; i < lengthof(type); i++)
+               max = MAX(max, strlen(type[i].name));
+
+       for (i = 0; i < lengthof(type); i++)
+               printf("%*s : %zu\n", max, type[i].name, type[i].size);
+
+       return 0;
+} /* sizes() */
+
+
+static const struct { const char *cmd; int (*run)(); const char *help; } cmds[] = {
+       { "parse-packet",       &parse_packet,          "parse binary packet from stdin" },
+       { "parse-domain",       &parse_domain,          "anchor and iteratively cleave domain" },
+       { "expand-domain",      &expand_domain,         "expand domain at offset NN in packet from stdin" },
+       { "show-resconf",       &show_resconf,          "show resolv.conf data" },
+       { "show-hosts",         &show_hosts,            "show hosts data" },
+       { "query-hosts",        &query_hosts,           "query A, AAAA or PTR in hosts data" },
+       { "search-list",        &search_list,           "generate query search list from domain" },
+       { "permute-set",        &permute_set,           "generate random permutation -> (0 .. N or N .. M)" },
+       { "shuffle-16",         &shuffle_16,            "simple 16-bit permutation" },
+       { "dump-random",        &dump_random,           "generate random bytes" },
+       { "send-query",         &send_query,            "send query to host" },
+       { "send-query-udp",     &send_query,            "send udp query to host" },
+       { "send-query-tcp",     &send_query,            "send tcp query to host" },
+       { "print-arpa",         &print_arpa,            "print arpa. zone name of address" },
+       { "show-hints",         &show_hints,            "print hints: show-hints [local|root] [plain|packet]" },
+       { "resolve-stub",       &resolve_query,         "resolve as stub resolver" },
+       { "resolve-recurse",    &resolve_query,         "resolve as recursive resolver" },
+       { "addrinfo-stub",      &resolve_addrinfo,      "resolve through getaddrinfo clone" },
+       { "addrinfo-recurse",   &resolve_addrinfo,      "resolve through getaddrinfo clone" },
+/*     { "resolve-nameinfo",   &resolve_query,         "resolve as recursive resolver" }, */
+       { "echo",               &echo_port,             "server echo mode, for nmap fuzzing" },
+       { "isection",           &isection,              "parse section string" },
+       { "iclass",             &iclass,                "parse class string" },
+       { "itype",              &itype,                 "parse type string" },
+       { "iopcode",            &iopcode,               "parse opcode string" },
+       { "ircode",             &ircode,                "parse rcode string" },
+       { "sizes",              &sizes,                 "print data structure sizes" },
+};
+
+
+static void print_usage(const char *progname, FILE *fp) {
+       static const char *usage        = 
+               " [OPTIONS] COMMAND [ARGS]\n"
+               "  -c PATH   Path to resolv.conf\n"
+               "  -l PATH   Path to local hosts\n"
+               "  -z PATH   Path to zone cache\n"
+               "  -q QNAME  Query name\n"
+               "  -t QTYPE  Query type\n"
+               "  -s HOW    Sort records\n"
+               "  -v        Be more verbose (-vv show packets; -vvv hexdump packets)\n"
+               "  -V        Print version info\n"
+               "  -h        Print this usage message\n"
+               "\n";
+       unsigned i, n, m;
+
+       fputs(progname, fp);
+       fputs(usage, fp);
+
+       for (i = 0, m = 0; i < lengthof(cmds); i++) {
+               if (strlen(cmds[i].cmd) > m)
+                       m       = strlen(cmds[i].cmd);
+       }
+
+       for (i = 0; i < lengthof(cmds); i++) {
+               fprintf(fp, "  %s  ", cmds[i].cmd);
+
+               for (n = strlen(cmds[i].cmd); n < m; n++)
+                       putc(' ', fp);
+
+               fputs(cmds[i].help, fp);
+               putc('\n', fp);
+       }
+
+       fputs("\nReport bugs to William Ahern <william@25thandClement.com>\n", fp);
+} /* print_usage() */
+
+
+static void print_version(const char *progname, FILE *fp) {
+       fprintf(fp, "%s (dns.c) %.8X\n", progname, dns_v_rel());
+       fprintf(fp, "vendor  %s\n", dns_vendor());
+       fprintf(fp, "release %.8X\n", dns_v_rel());
+       fprintf(fp, "abi     %.8X\n", dns_v_abi());
+       fprintf(fp, "api     %.8X\n", dns_v_api());
+} /* print_version() */
+
+
+int main(int argc, char **argv) {
+       extern int optind;
+       extern char *optarg;
+       const char *progname    = argv[0];
+       unsigned i;
+       int ch;
+
+       while (-1 != (ch = getopt(argc, argv, "q:t:c:l:z:s:vVh"))) {
+               switch (ch) {
+               case 'c':
+                       assert(MAIN.resconf.count < lengthof(MAIN.resconf.path));
+
+                       MAIN.resconf.path[MAIN.resconf.count++] = optarg;
+
+                       break;
+               case 'l':
+                       assert(MAIN.hosts.count < lengthof(MAIN.hosts.path));
+
+                       MAIN.hosts.path[MAIN.hosts.count++]     = optarg;
+
+                       break;
+               case 'z':
+                       assert(MAIN.cache.count < lengthof(MAIN.cache.path));
+
+                       MAIN.cache.path[MAIN.cache.count++]     = optarg;
+
+                       break;
+               case 'q':
+                       MAIN.qname      = optarg;
+
+                       break;
+               case 't':
+                       for (i = 0; i < lengthof(dns_rrtypes); i++) {
+                               if (0 == strcasecmp(dns_rrtypes[i].name, optarg))
+                                       { MAIN.qtype = dns_rrtypes[i].type; break; }
+                       }
+
+                       if (MAIN.qtype)
+                               break;
+
+                       for (i = 0; isdigit((int)optarg[i]); i++) {
+                               MAIN.qtype      *= 10;
+                               MAIN.qtype      += optarg[i] - '0';
+                       }
+
+                       if (!MAIN.qtype)
+                               panic("%s: invalid query type", optarg);
+
+                       break;
+               case 's':
+                       if (0 == strcasecmp(optarg, "packet"))
+                               MAIN.sort       = &dns_rr_i_packet;
+                       else if (0 == strcasecmp(optarg, "shuffle"))
+                               MAIN.sort       = &dns_rr_i_shuffle;
+                       else if (0 == strcasecmp(optarg, "order"))
+                               MAIN.sort       = &dns_rr_i_order;
+                       else
+                               panic("%s: invalid sort method", optarg);
+
+                       break;
+               case 'v':
+                       dns_debug = ++MAIN.verbose;
+
+                       break;
+               case 'V':
+                       print_version(progname, stdout);
+
+                       return 0;
+               case 'h':
+                       print_usage(progname, stdout);
+
+                       return 0;
+               default:
+                       print_usage(progname, stderr);
+
+                       return EXIT_FAILURE;
+               } /* switch() */
+       } /* while() */
+
+       argc    -= optind;
+       argv    += optind;
+
+       for (i = 0; i < lengthof(cmds) && argv[0]; i++) {
+               if (0 == strcmp(cmds[i].cmd, argv[0]))
+                       return cmds[i].run(argc, argv);
+       }
+
+       print_usage(progname, stderr);
+
+       return EXIT_FAILURE;
+} /* main() */
+
+
+#endif /* DNS_MAIN */
diff --git a/src/lib/ecore_con/dns.h b/src/lib/ecore_con/dns.h
new file mode 100644 (file)
index 0000000..2b7315f
--- /dev/null
@@ -0,0 +1,1074 @@
+/* ==========================================================================
+ * dns.h - Recursive, Reentrant DNS Resolver.
+ * --------------------------------------------------------------------------
+ * Copyright (c) 2009, 2010  William Ahern
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to permit
+ * persons to whom the Software is furnished to do so, subject to the
+ * following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ==========================================================================
+ */
+#ifndef DNS_H
+#define DNS_H
+
+#include <stddef.h>            /* size_t offsetof() */
+#include <stdio.h>             /* FILE */
+
+#include <string.h>            /* strlen(3) */
+
+#include <time.h>              /* time_t */
+
+#if _WIN32
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <sys/types.h>         /* socklen_t */
+#include <sys/socket.h>                /* struct socket */
+
+#include <poll.h>              /* POLLIN POLLOUT */
+
+#include <netinet/in.h>                /* struct in_addr struct in6_addr */
+
+#include <netdb.h>             /* struct addrinfo */
+#endif
+
+
+/*
+ * V E R S I O N
+ *
+ * Vendor: Entity for which versions numbers are relevant. (If forking
+ * change DNS_VENDOR to avoid confusion.)
+ *
+ * Three versions:
+ *
+ * REL Official "release"--bug fixes, new features, etc.
+ * ABI Changes to existing object sizes or parameter types.
+ * API Changes that might effect application source.
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define DNS_VENDOR "william@25thandClement.com"
+
+#define DNS_V_REL  0x20110117
+#define DNS_V_ABI  0x20100709
+#define DNS_V_API  0x20100709
+
+
+const char *dns_vendor(void);
+
+int dns_v_rel(void);
+int dns_v_abi(void);
+int dns_v_api(void);
+
+
+/*
+ * E R R O R S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+enum dns_errno {
+       DNS_ENOBUFS     = -(('d' << 24) | ('n' << 16) | ('s' << 8) | 64),
+       DNS_EILLEGAL,
+       DNS_EORDER,
+       DNS_ESECTION,
+       DNS_EUNKNOWN,
+}; /* dns_errno */
+
+const char *dns_strerror(int);
+
+extern int dns_debug;
+
+
+/*
+ * E V E N T S  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#if defined(POLLIN)
+#define DNS_POLLIN POLLIN
+#else
+#define DNS_POLLIN  1
+#endif
+
+#if defined(POLLOUT)
+#define DNS_POLLOUT POLLOUT
+#else
+#define DNS_POLLOUT 2
+#endif
+
+
+/*
+ * See Application Interface below for configuring libevent bitmasks instead
+ * of poll(2) bitmasks.
+ */
+#define DNS_EVREAD  2
+#define DNS_EVWRITE 4
+
+
+#define DNS_POLL2EV(set) \
+       (((set) & DNS_POLLIN)? DNS_EVREAD : 0) | (((set) & DNS_POLLOUT)? DNS_EVWRITE : 0)
+
+#define DNS_EV2POLL(set) \
+       (((set) & DNS_EVREAD)? DNS_POLLIN : 0) | (((set) & DNS_EVWRITE)? DNS_POLLOUT : 0)
+
+
+/*
+ * E N U M E R A T I O N  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+enum dns_section {
+       DNS_S_QD                = 0x01,
+#define DNS_S_QUESTION         DNS_S_QD
+
+       DNS_S_AN                = 0x02,
+#define DNS_S_ANSWER           DNS_S_AN
+
+       DNS_S_NS                = 0x04,
+#define DNS_S_AUTHORITY                DNS_S_NS
+
+       DNS_S_AR                = 0x08,
+#define DNS_S_ADDITIONAL       DNS_S_AR
+
+       DNS_S_ALL               = 0x0f
+}; /* enum dns_section */
+
+
+enum dns_class {
+       DNS_C_IN        = 1,
+
+       DNS_C_ANY       = 255
+}; /* enum dns_class */
+
+
+enum dns_type {
+       DNS_T_A         = 1,
+       DNS_T_NS        = 2,
+       DNS_T_CNAME     = 5,
+       DNS_T_SOA       = 6,
+       DNS_T_PTR       = 12,
+       DNS_T_MX        = 15,
+       DNS_T_TXT       = 16,
+       DNS_T_AAAA      = 28,
+       DNS_T_SRV       = 33,
+       DNS_T_SSHFP     = 44,
+       DNS_T_SPF       = 99,
+
+       DNS_T_ALL       = 255
+}; /* enum dns_type */
+
+
+enum dns_opcode {
+       DNS_OP_QUERY    = 0,
+       DNS_OP_IQUERY   = 1,
+       DNS_OP_STATUS   = 2,
+       DNS_OP_NOTIFY   = 4,
+       DNS_OP_UPDATE   = 5,
+}; /* dns_opcode */
+
+
+enum dns_rcode {
+       DNS_RC_NOERROR  = 0,
+       DNS_RC_FORMERR  = 1,
+       DNS_RC_SERVFAIL = 2,
+       DNS_RC_NXDOMAIN = 3,
+       DNS_RC_NOTIMP   = 4,
+       DNS_RC_REFUSED  = 5,
+       DNS_RC_YXDOMAIN = 6,
+       DNS_RC_YXRRSET  = 7,
+       DNS_RC_NXRRSET  = 8,
+       DNS_RC_NOTAUTH  = 9,
+       DNS_RC_NOTZONE  = 10,
+}; /* dns_rcode */
+
+
+/*
+ * NOTE: These string functions need a small buffer in case the literal
+ * integer value needs to be printed and returned. UNLESS this buffer is
+ * SPECIFIED, the returned string has ONLY BLOCK SCOPE.
+ */
+#define DNS_STRMAXLEN 47 /* "QUESTION|ANSWER|AUTHORITY|ADDITIONAL" */
+
+const char *dns_strsection(enum dns_section, void *, size_t);
+#define dns_strsection3(a, b, c) \
+                               dns_strsection((a), (b), (c))
+#define dns_strsection1(a)     dns_strsection((a), (char [DNS_STRMAXLEN + 1]){ 0 }, DNS_STRMAXLEN + 1)
+#define dns_strsection(...)    DNS_PP_CALL(DNS_PP_XPASTE(dns_strsection, DNS_PP_NARG(__VA_ARGS__)), __VA_ARGS__)
+
+enum dns_section dns_isection(const char *);
+
+const char *dns_strclass(enum dns_class, void *, size_t);
+#define dns_strclass3(a, b, c) dns_strclass((a), (b), (c))
+#define dns_strclass1(a)       dns_strclass((a), (char [DNS_STRMAXLEN + 1]){ 0 }, DNS_STRMAXLEN + 1)
+#define dns_strclass(...)      DNS_PP_CALL(DNS_PP_XPASTE(dns_strclass, DNS_PP_NARG(__VA_ARGS__)), __VA_ARGS__)
+
+enum dns_class dns_iclass(const char *);
+
+const char *dns_strtype(enum dns_type, void *, size_t);
+#define dns_strtype3(a, b, c)  dns_strtype((a), (b), (c))
+#define dns_strtype1(a)                dns_strtype((a), (char [DNS_STRMAXLEN + 1]){ 0 }, DNS_STRMAXLEN + 1)
+#define dns_strtype(...)       DNS_PP_CALL(DNS_PP_XPASTE(dns_strtype, DNS_PP_NARG(__VA_ARGS__)), __VA_ARGS__)
+
+enum dns_type dns_itype(const char *);
+
+const char *dns_stropcode(enum dns_opcode);
+
+enum dns_opcode dns_iopcode(const char *);
+
+const char *dns_strrcode(enum dns_rcode);
+
+enum dns_rcode dns_ircode(const char *);
+
+
+/*
+ * A T O M I C  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+typedef unsigned long dns_atomic_t;
+
+
+/*
+ * C R Y P T O  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+extern unsigned (*dns_random)(void);
+
+
+/*
+ * P A C K E T  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_header {
+               unsigned qid:16;
+
+#if BYTE_ORDER == BIG_ENDIAN
+               unsigned qr:1;
+               unsigned opcode:4;
+               unsigned aa:1;
+               unsigned tc:1;
+               unsigned rd:1;
+
+               unsigned ra:1;
+               unsigned unused:3;
+               unsigned rcode:4;
+#else
+               unsigned rd:1;
+               unsigned tc:1;
+               unsigned aa:1;
+               unsigned opcode:4;
+               unsigned qr:1;
+
+               unsigned rcode:4;
+               unsigned unused:3;
+               unsigned ra:1;
+#endif
+
+               unsigned qdcount:16;
+               unsigned ancount:16;
+               unsigned nscount:16;
+               unsigned arcount:16;
+}; /* struct dns_header */
+
+#define dns_header(p)  (&(p)->header)
+
+
+#ifndef DNS_P_QBUFSIZ
+#define DNS_P_QBUFSIZ  dns_p_calcsize(256 + 4)
+#endif
+
+#ifndef DNS_P_DICTSIZE
+#define DNS_P_DICTSIZE 16
+#endif
+
+struct dns_packet {
+       unsigned short dict[DNS_P_DICTSIZE];
+
+       struct dns_s_memo {
+               unsigned short base, end;
+       } qd, an, ns, ar;
+
+       struct { struct dns_packet *cqe_next, *cqe_prev; } cqe;
+
+       size_t size, end;
+
+       int:16; /* tcp padding */
+
+       union {
+               struct dns_header header;
+               unsigned char data[1];
+       };
+}; /* struct dns_packet */
+
+#define dns_p_calcsize(n)      (offsetof(struct dns_packet, data) + DNS_PP_MAX(12, (n)))
+
+#define dns_p_sizeof(P)                dns_p_calcsize((P)->end)
+
+/** takes size of maximum desired payload */
+#define dns_p_new(n)           (dns_p_init((struct dns_packet *)&(union { unsigned char b[dns_p_calcsize((n))]; struct dns_packet p; }){ { 0 } }, dns_p_calcsize((n))))
+
+/** takes size of entire packet structure as allocated */
+struct dns_packet *dns_p_init(struct dns_packet *, size_t);
+
+/** takes size of maximum desired payload */
+struct dns_packet *dns_p_make(size_t, int *);
+
+int dns_p_grow(struct dns_packet **);
+
+struct dns_packet *dns_p_copy(struct dns_packet *, const struct dns_packet *);
+
+#define dns_p_opcode(P)                (dns_header(P)->opcode)
+
+#define dns_p_rcode(P)         (dns_header(P)->rcode)
+
+unsigned dns_p_count(struct dns_packet *, enum dns_section);
+
+int dns_p_push(struct dns_packet *, enum dns_section, const void *, size_t, enum dns_type, enum dns_class, unsigned, const void *);
+
+void dns_p_dictadd(struct dns_packet *, unsigned short);
+
+struct dns_packet *dns_p_merge(struct dns_packet *, enum dns_section, struct dns_packet *, enum dns_section, int *);
+
+void dns_p_dump(struct dns_packet *, FILE *);
+
+int dns_p_study(struct dns_packet *);
+
+
+/*
+ * D O M A I N  N A M E  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define DNS_D_MAXLABEL 63      /* + 1 '\0' */
+#define DNS_D_MAXNAME  255     /* + 1 '\0' */
+
+#define DNS_D_ANCHOR   1       /* anchor domain w/ root "." */
+#define DNS_D_CLEAVE   2       /* cleave sub-domain */
+#define DNS_D_TRIM     4       /* remove superfluous dots */ 
+
+#define dns_d_new3(a, b, f)    dns_d_init(&(char[DNS_D_MAXNAME + 1]){ 0 }, DNS_D_MAXNAME + 1, (a), (b), (f))
+#define dns_d_new2(a, f)       dns_d_new3((a), strlen((a)), (f))
+#define dns_d_new1(a)          dns_d_new3((a), strlen((a)), DNS_D_ANCHOR)
+#define dns_d_new(...)         DNS_PP_CALL(DNS_PP_XPASTE(dns_d_new, DNS_PP_NARG(__VA_ARGS__)), __VA_ARGS__)
+
+char *dns_d_init(void *, size_t, const void *, size_t, int);
+
+size_t dns_d_anchor(void *, size_t, const void *, size_t);
+
+size_t dns_d_cleave(void *, size_t, const void *, size_t);
+
+size_t dns_d_comp(void *, size_t, const void *, size_t, struct dns_packet *, int *);
+
+size_t dns_d_expand(void *, size_t, unsigned short, struct dns_packet *, int *);
+
+unsigned short dns_d_skip(unsigned short, struct dns_packet *);
+
+int dns_d_push(struct dns_packet *, const void *, size_t);
+
+size_t dns_d_cname(void *, size_t, const void *, size_t, struct dns_packet *, int *error);
+
+
+/*
+ * R E S O U R C E  R E C O R D  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_rr {
+       enum dns_section section;
+
+       struct {
+               unsigned short p;
+               unsigned short len;
+       } dn;
+
+       enum dns_type type;
+       enum dns_class class;
+       unsigned ttl;
+
+       struct {
+               unsigned short p;
+               unsigned short len;
+       } rd;
+}; /* struct dns_rr */
+
+
+int dns_rr_copy(struct dns_packet *, struct dns_rr *, struct dns_packet *);
+
+int dns_rr_parse(struct dns_rr *, unsigned short, struct dns_packet *);
+
+unsigned short dns_rr_skip(unsigned short, struct dns_packet *);
+
+int dns_rr_cmp(struct dns_rr *, struct dns_packet *, struct dns_rr *, struct dns_packet *);
+
+size_t dns_rr_print(void *, size_t, struct dns_rr *, struct dns_packet *, int *);
+
+
+#define dns_rr_i_new(P, ...)           dns_rr_i_init(&(struct dns_rr_i){ 0, __VA_ARGS__ }, (P))
+
+struct dns_rr_i {
+       enum dns_section section;
+       const void *name;
+       enum dns_type type;
+       enum dns_class class;
+       const void *data;
+
+       int follow;
+
+       int (*sort)();
+       unsigned args[2];
+
+       struct {
+               unsigned short next;
+               unsigned short count;
+
+               unsigned exec;
+               unsigned regs[2];
+       } state, saved;
+}; /* struct dns_rr_i */
+
+int dns_rr_i_packet(struct dns_rr *, struct dns_rr *, struct dns_rr_i *, struct dns_packet *);
+
+int dns_rr_i_order(struct dns_rr *, struct dns_rr *, struct dns_rr_i *, struct dns_packet *);
+
+int dns_rr_i_shuffle(struct dns_rr *, struct dns_rr *, struct dns_rr_i *, struct dns_packet *);
+
+struct dns_rr_i *dns_rr_i_init(struct dns_rr_i *, struct dns_packet *);
+
+#define dns_rr_i_save(i)       ((i)->saved = (i)->state)
+#define dns_rr_i_rewind(i)     ((i)->state = (i)->saved)
+#define dns_rr_i_count(i)      ((i)->state.count)
+
+unsigned dns_rr_grep(struct dns_rr *, unsigned, struct dns_rr_i *, struct dns_packet *, int *);
+
+#define dns_rr_foreach_(rr, P, ...)    \
+       for (struct dns_rr_i DNS_PP_XPASTE(i, __LINE__) = *dns_rr_i_new((P), __VA_ARGS__); dns_rr_grep((rr), 1, &DNS_PP_XPASTE(i, __LINE__), (P), &(int){ 0 }); )
+
+#define dns_rr_foreach(...)    dns_rr_foreach_(__VA_ARGS__)
+
+
+/*
+ * A  R E S O U R C E  R E C O R D
+ */
+
+struct dns_a {
+       struct in_addr addr;
+}; /* struct dns_a */
+
+int dns_a_parse(struct dns_a *, struct dns_rr *, struct dns_packet *);
+
+int dns_a_push(struct dns_packet *, struct dns_a *);
+
+int dns_a_cmp(const struct dns_a *, const struct dns_a *);
+
+size_t dns_a_print(void *, size_t, struct dns_a *);
+
+
+/*
+ * AAAA  R E S O U R C E  R E C O R D
+ */
+
+struct dns_aaaa {
+       struct in6_addr addr;
+}; /* struct dns_aaaa */
+
+int dns_aaaa_parse(struct dns_aaaa *, struct dns_rr *, struct dns_packet *);
+
+int dns_aaaa_push(struct dns_packet *, struct dns_aaaa *);
+
+int dns_aaaa_cmp(const struct dns_aaaa *, const struct dns_aaaa *);
+
+size_t dns_aaaa_print(void *, size_t, struct dns_aaaa *);
+
+
+/*
+ * MX  R E S O U R C E  R E C O R D
+ */
+
+struct dns_mx {
+       unsigned short preference;
+       char host[DNS_D_MAXNAME + 1];
+}; /* struct dns_mx */
+
+int dns_mx_parse(struct dns_mx *, struct dns_rr *, struct dns_packet *);
+
+int dns_mx_push(struct dns_packet *, struct dns_mx *);
+
+int dns_mx_cmp(const struct dns_mx *, const struct dns_mx *);
+
+size_t dns_mx_print(void *, size_t, struct dns_mx *);
+
+size_t dns_mx_cname(void *, size_t, struct dns_mx *);
+
+
+/*
+ * NS  R E S O U R C E  R E C O R D
+ */
+
+struct dns_ns {
+       char host[DNS_D_MAXNAME + 1];
+}; /* struct dns_ns */
+
+int dns_ns_parse(struct dns_ns *, struct dns_rr *, struct dns_packet *);
+
+int dns_ns_push(struct dns_packet *, struct dns_ns *);
+
+int dns_ns_cmp(const struct dns_ns *, const struct dns_ns *);
+
+size_t dns_ns_print(void *, size_t, struct dns_ns *);
+
+size_t dns_ns_cname(void *, size_t, struct dns_ns *);
+
+
+/*
+ * CNAME  R E S O U R C E  R E C O R D
+ */
+
+struct dns_cname {
+       char host[DNS_D_MAXNAME + 1];
+}; /* struct dns_cname */
+
+int dns_cname_parse(struct dns_cname *, struct dns_rr *, struct dns_packet *);
+
+int dns_cname_push(struct dns_packet *, struct dns_cname *);
+
+int dns_cname_cmp(const struct dns_cname *, const struct dns_cname *);
+
+size_t dns_cname_print(void *, size_t, struct dns_cname *);
+
+size_t dns_cname_cname(void *, size_t, struct dns_cname *);
+
+
+/*
+ * SOA  R E S O U R C E  R E C O R D
+ */
+
+struct dns_soa {
+       char mname[DNS_D_MAXNAME + 1];
+       char rname[DNS_D_MAXNAME + 1];
+       unsigned serial, refresh, retry, expire, minimum;
+}; /* struct dns_soa */
+
+int dns_soa_parse(struct dns_soa *, struct dns_rr *, struct dns_packet *);
+
+int dns_soa_push(struct dns_packet *, struct dns_soa *);
+
+int dns_soa_cmp(const struct dns_soa *, const struct dns_soa *);
+
+size_t dns_soa_print(void *, size_t, struct dns_soa *);
+
+
+/*
+ * PTR  R E S O U R C E  R E C O R D
+ */
+
+struct dns_ptr {
+       char host[DNS_D_MAXNAME + 1];
+}; /* struct dns_ptr */
+
+int dns_ptr_parse(struct dns_ptr *, struct dns_rr *, struct dns_packet *);
+
+int dns_ptr_push(struct dns_packet *, struct dns_ptr *);
+
+int dns_ptr_cmp(const struct dns_ptr *, const struct dns_ptr *);
+
+size_t dns_ptr_print(void *, size_t, struct dns_ptr *);
+
+size_t dns_ptr_cname(void *, size_t, struct dns_ptr *);
+
+
+/*
+ * SRV  R E S O U R C E  R E C O R D
+ */
+
+struct dns_srv {
+       unsigned short priority;
+       unsigned short weight;
+       unsigned short port;
+       char target[DNS_D_MAXNAME + 1];
+}; /* struct dns_srv */
+
+int dns_srv_parse(struct dns_srv *, struct dns_rr *, struct dns_packet *);
+
+int dns_srv_push(struct dns_packet *, struct dns_srv *);
+
+int dns_srv_cmp(const struct dns_srv *, const struct dns_srv *);
+
+size_t dns_srv_print(void *, size_t, struct dns_srv *);
+
+size_t dns_srv_cname(void *, size_t, struct dns_srv *);
+
+
+/*
+ * SSHFP  R E S O U R C E  R E C O R D
+ */
+
+struct dns_sshfp {
+       enum dns_sshfp_key {
+               DNS_SSHFP_RSA = 1,
+               DNS_SSHFP_DSA = 2,
+       } algo;
+
+       enum dns_sshfp_digest {
+               DNS_SSHFP_SHA1 = 1,
+       } type;
+
+       union {
+               unsigned char sha1[20];
+       } digest;
+}; /* struct dns_sshfp */
+
+int dns_sshfp_parse(struct dns_sshfp *, struct dns_rr *, struct dns_packet *);
+
+int dns_sshfp_push(struct dns_packet *, struct dns_sshfp *);
+
+int dns_sshfp_cmp(const struct dns_sshfp *, const struct dns_sshfp *);
+
+size_t dns_sshfp_print(void *, size_t, struct dns_sshfp *);
+
+
+/*
+ * TXT  R E S O U R C E  R E C O R D
+ */
+
+#ifndef DNS_TXT_MINDATA
+#define DNS_TXT_MINDATA        1024
+#endif
+
+struct dns_txt {
+       size_t size, len;
+       unsigned char data[DNS_TXT_MINDATA];
+}; /* struct dns_txt */
+
+struct dns_txt *dns_txt_init(struct dns_txt *, size_t);
+
+int dns_txt_parse(struct dns_txt *, struct dns_rr *, struct dns_packet *);
+
+int dns_txt_push(struct dns_packet *, struct dns_txt *);
+
+int dns_txt_cmp(const struct dns_txt *, const struct dns_txt *);
+
+size_t dns_txt_print(void *, size_t, struct dns_txt *);
+
+
+/*
+ * ANY  R E S O U R C E  R E C O R D
+ */
+
+union dns_any {
+       struct dns_a a;
+       struct dns_aaaa aaaa;
+       struct dns_mx mx;
+       struct dns_ns ns;
+       struct dns_cname cname;
+       struct dns_soa soa;
+       struct dns_ptr ptr;
+       struct dns_srv srv;
+       struct dns_sshfp sshfp;
+       struct dns_txt txt, spf, rdata;
+}; /* union dns_any */
+
+#define DNS_ANY_INIT(any) { .rdata = { .size = sizeof *(any) } }
+
+union dns_any *dns_any_init(union dns_any *, size_t);
+
+int dns_any_parse(union dns_any *, struct dns_rr *, struct dns_packet *);
+
+int dns_any_push(struct dns_packet *, union dns_any *, enum dns_type);
+
+int dns_any_cmp(const union dns_any *, enum dns_type, const union dns_any *, enum dns_type);
+
+size_t dns_any_print(void *, size_t, union dns_any *, enum dns_type);
+
+size_t dns_any_cname(void *, size_t, union dns_any *, enum dns_type);
+
+
+/*
+ * H O S T S  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_hosts;
+
+struct dns_hosts *dns_hosts_open(int *);
+
+void dns_hosts_close(struct dns_hosts *);
+
+unsigned dns_hosts_acquire(struct dns_hosts *);
+
+unsigned dns_hosts_release(struct dns_hosts *);
+
+struct dns_hosts *dns_hosts_mortal(struct dns_hosts *);
+
+struct dns_hosts *dns_hosts_local(int *);
+
+int dns_hosts_loadfile(struct dns_hosts *, FILE *);
+
+int dns_hosts_loadpath(struct dns_hosts *, const char *);
+
+int dns_hosts_dump(struct dns_hosts *, FILE *);
+
+int dns_hosts_insert(struct dns_hosts *, int, const void *, const void *, _Bool);
+
+struct dns_packet *dns_hosts_query(struct dns_hosts *, struct dns_packet *, int *);
+
+
+/*
+ * R E S O L V . C O N F  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_resolv_conf {
+       struct sockaddr_storage nameserver[3];
+
+       char search[4][DNS_D_MAXNAME + 1];
+
+       /* (f)ile, (b)ind, (c)ache */
+       char lookup[3];
+
+       struct {
+               _Bool edns0;
+
+               unsigned ndots;
+
+               unsigned timeout;
+
+               unsigned attempts;
+
+               _Bool rotate;
+
+               _Bool recurse;
+
+               _Bool smart;
+
+               enum {
+                       DNS_RESCONF_TCP_ENABLE,
+                       DNS_RESCONF_TCP_ONLY,
+                       DNS_RESCONF_TCP_DISABLE,
+               } tcp;
+       } options;
+
+       struct sockaddr_storage iface;
+
+       struct { /* PRIVATE */
+               dns_atomic_t refcount;
+       } _;
+}; /* struct dns_resolv_conf */
+
+struct dns_resolv_conf *dns_resconf_open(int *);
+
+void dns_resconf_close(struct dns_resolv_conf *);
+
+unsigned dns_resconf_acquire(struct dns_resolv_conf *);
+
+unsigned dns_resconf_release(struct dns_resolv_conf *);
+
+struct dns_resolv_conf *dns_resconf_mortal(struct dns_resolv_conf *);
+
+struct dns_resolv_conf *dns_resconf_local(int *);
+
+struct dns_resolv_conf *dns_resconf_root(int *);
+
+int dns_resconf_loadfile(struct dns_resolv_conf *, FILE *);
+
+int dns_resconf_loadpath(struct dns_resolv_conf *, const char *);
+
+int dns_resconf_dump(struct dns_resolv_conf *, FILE *);
+
+int dns_resconf_setiface(struct dns_resolv_conf *, const char *, unsigned short);
+
+typedef unsigned long dns_resconf_i_t;
+
+size_t dns_resconf_search(void *, size_t, const void *, size_t, struct dns_resolv_conf *, dns_resconf_i_t *);
+
+
+/*
+ * H I N T  S E R V E R  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_hints;
+
+struct dns_hints *dns_hints_open(struct dns_resolv_conf *, int *);
+
+void dns_hints_close(struct dns_hints *);
+
+unsigned dns_hints_acquire(struct dns_hints *);
+
+unsigned dns_hints_release(struct dns_hints *);
+
+struct dns_hints *dns_hints_mortal(struct dns_hints *);
+
+int dns_hints_insert(struct dns_hints *, const char *, const struct sockaddr *, unsigned);
+
+unsigned dns_hints_insert_resconf(struct dns_hints *, const char *, const struct dns_resolv_conf *, int *);
+
+struct dns_hints *dns_hints_local(struct dns_resolv_conf *, int *);
+
+struct dns_hints *dns_hints_root(struct dns_resolv_conf *, int *);
+
+
+struct dns_hints_i {
+       const char *zone;
+
+       struct {
+               unsigned next;
+               unsigned seed;
+       } state;
+}; /* struct dns_hints_i */
+
+#define dns_hints_i_new(...)   (&(struct dns_hints_i){ __VA_ARGS__ })
+
+unsigned dns_hints_grep(struct sockaddr **, socklen_t *, unsigned, struct dns_hints_i *, struct dns_hints *);
+
+
+/*
+ * C A C H E  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_cache {
+       void *state;
+
+       dns_atomic_t (*acquire)(struct dns_cache *);
+       dns_atomic_t (*release)(struct dns_cache *);
+
+       struct dns_packet *(*query)(struct dns_packet *, struct dns_cache *, int *);
+
+       int (*submit)(struct dns_packet *, struct dns_cache *);
+       int (*check)(struct dns_cache *);
+       struct dns_packet *(*fetch)(struct dns_cache *, int *);
+
+       int (*pollfd)(struct dns_cache *);
+       short (*events)(struct dns_cache *);
+       void (*clear)(struct dns_cache *);
+
+       union {
+               long i;
+               void *p;
+       } arg[3];
+}; /* struct dns_cache */
+
+
+struct dns_cache *dns_cache_init(struct dns_cache *);
+
+void dns_cache_close(struct dns_cache *);
+
+
+/*
+ * A P P L I C A T I O N  I N T E R F A C E
+ *
+ * Options to change the behavior of the API. Applies across all the
+ * different components.
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define DNS_OPTS_INITIALIZER_ { 0, 0 }, 0
+#define DNS_OPTS_INITIALIZER  { DNS_OPTS_INITIALIZER_ }
+#define DNS_OPTS_INIT(...)    { DNS_OPTS_INITIALIZER_, __VA_ARGS__ }
+
+#define dns_opts(...) (&(struct dns_options)DNS_OPTS_INIT(__VA_ARGS__))
+
+struct dns_options {
+       /*
+        * If the callback closes *fd, it must set it to -1. Otherwise, the
+        * descriptor is queued and lazily closed at object destruction or
+        * by an explicit call to _clear(). This allows safe use of
+        * kqueue(2), epoll(2), et al -style persistent events.
+        */
+       struct {
+               void *arg;
+               int (*cb)(int *fd, void *arg);
+       } closefd;
+
+       /* bitmask for _events() routines */
+       enum dns_events {
+               DNS_SYSPOLL,
+               DNS_LIBEVENT,
+       } events;
+}; /* struct dns_options */
+
+
+/*
+ * S T A T S  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_stat {
+       size_t queries;
+
+       struct {
+               struct {
+                       size_t count, bytes;
+               } sent, rcvd;
+       } udp, tcp;
+}; /* struct dns_stat */
+
+
+/*
+ * S O C K E T  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_socket;
+
+struct dns_socket *dns_so_open(const struct sockaddr *, int, const struct dns_options *, int *error);
+
+void dns_so_close(struct dns_socket *);
+
+void dns_so_reset(struct dns_socket *);
+
+unsigned short dns_so_mkqid(struct dns_socket *so);
+
+struct dns_packet *dns_so_query(struct dns_socket *, struct dns_packet *, struct sockaddr *, int *);
+
+int dns_so_submit(struct dns_socket *, struct dns_packet *, struct sockaddr *);
+
+int dns_so_check(struct dns_socket *);
+
+struct dns_packet *dns_so_fetch(struct dns_socket *, int *);
+
+time_t dns_so_elapsed(struct dns_socket *);
+
+void dns_so_clear(struct dns_socket *);
+
+int dns_so_events(struct dns_socket *);
+
+int dns_so_pollfd(struct dns_socket *);
+
+int dns_so_poll(struct dns_socket *, int);
+
+const struct dns_stat *dns_so_stat(struct dns_socket *);
+
+
+/*
+ * R E S O L V E R  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_resolver;
+
+struct dns_resolver *dns_res_open(struct dns_resolv_conf *, struct dns_hosts *hosts, struct dns_hints *, struct dns_cache *, const struct dns_options *, int *);
+
+struct dns_resolver *dns_res_stub(const struct dns_options *, int *);
+
+void dns_res_reset(struct dns_resolver *);
+
+void dns_res_close(struct dns_resolver *);
+
+unsigned dns_res_acquire(struct dns_resolver *);
+
+unsigned dns_res_release(struct dns_resolver *);
+
+struct dns_resolver *dns_res_mortal(struct dns_resolver *);
+
+int dns_res_submit(struct dns_resolver *, const char *, enum dns_type, enum dns_class);
+
+int dns_res_check(struct dns_resolver *);
+
+struct dns_packet *dns_res_fetch(struct dns_resolver *, int *);
+
+time_t dns_res_elapsed(struct dns_resolver *);
+
+void dns_res_clear(struct dns_resolver *);
+
+int dns_res_events(struct dns_resolver *);
+
+int dns_res_pollfd(struct dns_resolver *);
+
+int dns_res_poll(struct dns_resolver *, int);
+
+struct dns_packet *dns_res_query(struct dns_resolver *, const char *, enum dns_type, enum dns_class, int, int *);
+
+const struct dns_stat *dns_res_stat(struct dns_resolver *);
+
+
+/*
+ * A D D R I N F O  I N T E R F A C E
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+struct dns_addrinfo;
+
+struct dns_addrinfo *dns_ai_open(const char *, const char *, enum dns_type, const struct addrinfo *, struct dns_resolver *, int *);
+
+void dns_ai_close(struct dns_addrinfo *);
+
+int dns_ai_nextent(struct addrinfo **, struct dns_addrinfo *);
+
+size_t dns_ai_print(void *, size_t, struct addrinfo *, struct dns_addrinfo *);
+
+time_t dns_ai_elapsed(struct dns_addrinfo *);
+
+void dns_ai_clear(struct dns_addrinfo *);
+
+int dns_ai_events(struct dns_addrinfo *);
+
+int dns_ai_pollfd(struct dns_addrinfo *);
+
+int dns_ai_poll(struct dns_addrinfo *, int);
+
+const struct dns_stat *dns_ai_stat(struct dns_addrinfo *);
+
+void *dns_sa_addr(int af, void *sa);
+unsigned short *dns_sa_port(int af, void *sa);
+#if _WIN32
+const char *dns_inet_ntop(int af, const void *src, void *dst, unsigned long lim);
+#else
+#define dns_inet_pton(...)     inet_pton(__VA_ARGS__)
+#define dns_inet_ntop(...)     inet_ntop(__VA_ARGS__)
+#endif
+#define dns_sa_family(sa)      (((struct sockaddr *)(sa))->sa_family)
+/*
+ * U T I L I T Y  I N T E R F A C E S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+size_t dns_strlcpy(char *, const char *, size_t);
+
+size_t dns_strlcat(char *, const char *, size_t);
+
+
+/*
+ * M A C R O  M A G I C S
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define DNS_PP_MAX(a, b) (((a) > (b))? (a) : (b))
+#define DNS_PP_NARG_(a, b, c, d, e, f, g, h, i, j, k, N,...) N
+#define DNS_PP_NARG(...)       DNS_PP_NARG_(__VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+#define DNS_PP_CALL(F, ...)    F(__VA_ARGS__)
+#define DNS_PP_PASTE(x, y)     x##y
+#define DNS_PP_XPASTE(x, y)    DNS_PP_PASTE(x, y)
+#define DNS_PP_STRINGIFY_(s)   #s
+#define DNS_PP_STRINGIFY(s)    DNS_PP_STRINGIFY_(s)
+#define DNS_PP_D1  0
+#define DNS_PP_D2  1
+#define DNS_PP_D3  2
+#define DNS_PP_D4  3
+#define DNS_PP_D5  4
+#define DNS_PP_D6  5
+#define DNS_PP_D7  6
+#define DNS_PP_D8  7
+#define DNS_PP_D9  8
+#define DNS_PP_D10 9
+#define DNS_PP_D11 10
+#define DNS_PP_DEC(N) DNS_PP_XPASTE(DNS_PP_D, N)
+
+#endif /* DNS_H */
index 8bebde0..ab57378 100644 (file)
@@ -1,17 +1,41 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
 #include <sys/stat.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <sys/un.h>
 #include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#ifdef HAVE_NETINET_TCP_H
+# include <netinet/tcp.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
 
-#include <config.h>
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+
+#ifdef HAVE_SYS_UN_H
+# include <sys/un.h>
+#endif
+
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
 
-#if USE_OPENSSL
-#include <time.h>
+#ifdef HAVE_EVIL
+# include <Evil.h>
 #endif
 
 #include "Ecore.h"
 #include "Ecore_Con.h"
 #include "ecore_con_private.h"
 
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_WINSOCK2_H
-# include <winsock2.h>
-#endif
+static Eina_Bool _ecore_con_client_timer(Ecore_Con_Client *cl);
+static void      _ecore_con_cl_timer_update(Ecore_Con_Client *cl);
+static Eina_Bool _ecore_con_server_timer(Ecore_Con_Server *svr);
+static void      _ecore_con_server_timer_update(Ecore_Con_Server *svr);
+
+static void      _ecore_con_cb_tcp_connect(void           *data,
+                                           Ecore_Con_Info *info);
+static void      _ecore_con_cb_udp_connect(void           *data,
+                                           Ecore_Con_Info *info);
+static void      _ecore_con_cb_tcp_listen(void           *data,
+                                          Ecore_Con_Info *info);
+static void      _ecore_con_cb_udp_listen(void           *data,
+                                          Ecore_Con_Info *info);
+
+static void      _ecore_con_server_free(Ecore_Con_Server *svr);
+static void      _ecore_con_client_free(Ecore_Con_Client *cl);
+
+static void      _ecore_con_cl_read(Ecore_Con_Server *svr);
+static Eina_Bool _ecore_con_svr_tcp_handler(void             *data,
+                                            Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_con_cl_handler(void             *data,
+                                       Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_con_cl_udp_handler(void             *data,
+                                           Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_con_svr_udp_handler(void             *data,
+                                            Ecore_Fd_Handler *fd_handler);
+
+static void      _ecore_con_svr_cl_read(Ecore_Con_Client *cl);
+static Eina_Bool _ecore_con_svr_cl_handler(void             *data,
+                                           Ecore_Fd_Handler *fd_handler);
 
-static void _ecore_con_cb_dns_lookup(void *data, struct hostent *he);
-static void _ecore_con_server_free(Ecore_Con_Server *svr);
-static void _ecore_con_client_free(Ecore_Con_Client *cl);
-static int _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler);
 static void _ecore_con_server_flush(Ecore_Con_Server *svr);
 static void _ecore_con_client_flush(Ecore_Con_Client *cl);
-static void _ecore_con_event_client_add_free(void *data, void *ev);
-static void _ecore_con_event_client_del_free(void *data, void *ev);
-static void _ecore_con_event_client_data_free(void *data, void *ev);
-static void _ecore_con_event_server_add_free(void *data, void *ev);
-static void _ecore_con_event_server_del_free(void *data, void *ev);
-static void _ecore_con_event_server_data_free(void *data, void *ev);
+
+static void _ecore_con_event_client_add_free(Ecore_Con_Server *svr,
+                                             void *ev);
+static void _ecore_con_event_client_del_free(Ecore_Con_Server *svr,
+                                             void *ev);
+static void _ecore_con_event_client_data_free(Ecore_Con_Server *svr,
+                                              void *ev);
+static void _ecore_con_event_server_add_free(void *data,
+                                             void *ev);
+static void _ecore_con_event_server_del_free(void *data,
+                                             void *ev);
+static void _ecore_con_event_server_data_free(void *data,
+                                              void *ev);
+static void _ecore_con_event_server_error_free(void *data,
+                                               Ecore_Con_Event_Server_Error *e);
+static void _ecore_con_event_client_error_free(Ecore_Con_Server *svr,
+                                               Ecore_Con_Event_Client_Error *e);
+static void _ecore_con_event_server_write_free(void *data,
+                                               Ecore_Con_Event_Server_Write *e);
+static void _ecore_con_event_client_write_free(Ecore_Con_Server *svr,
+                                               Ecore_Con_Event_Client_Write *e);
+
+static void _ecore_con_lookup_done(void           *data,
+                                   Ecore_Con_Info *infos);
+
+static const char * _ecore_con_pretty_ip(struct sockaddr *client_addr);
+
+
+void
+_ecore_con_client_kill(Ecore_Con_Client *cl)
+{
+   if (cl->delete_me)
+     DBG("Multi kill request for client %p", cl);
+   else
+     {
+        ecore_con_event_client_del(cl);
+        if (cl->buf) return;
+     }
+   INF("Lost client %s", (cl->ip) ? cl->ip : "");
+   if (cl->fd_handler)
+     ecore_main_fd_handler_del(cl->fd_handler);
+
+   cl->fd_handler = NULL;
+}
+
+void
+_ecore_con_server_kill(Ecore_Con_Server *svr)
+{
+   if (svr->delete_me)
+     DBG("Multi kill request for svr %p", svr);
+   else
+     ecore_con_event_server_del(svr);
+
+   if (svr->fd_handler)
+     ecore_main_fd_handler_del(svr->fd_handler);
+
+   svr->fd_handler = NULL;
+}
+
+#define _ecore_con_server_kill(svr) do { \
+   DBG("KILL %p", (svr)); \
+   _ecore_con_server_kill((svr)); \
+} while (0)
+
+#define _ecore_con_client_kill(cl) do { \
+   DBG("KILL %p", (cl)); \
+   _ecore_con_client_kill((cl)); \
+} while (0)
 
 EAPI int ECORE_CON_EVENT_CLIENT_ADD = 0;
 EAPI int ECORE_CON_EVENT_CLIENT_DEL = 0;
@@ -47,936 +151,1142 @@ EAPI int ECORE_CON_EVENT_SERVER_ADD = 0;
 EAPI int ECORE_CON_EVENT_SERVER_DEL = 0;
 EAPI int ECORE_CON_EVENT_CLIENT_DATA = 0;
 EAPI int ECORE_CON_EVENT_SERVER_DATA = 0;
+EAPI int ECORE_CON_EVENT_CLIENT_WRITE = 0;
+EAPI int ECORE_CON_EVENT_SERVER_WRITE = 0;
+EAPI int ECORE_CON_EVENT_CLIENT_ERROR = 0;
+EAPI int ECORE_CON_EVENT_SERVER_ERROR = 0;
+EAPI int ECORE_CON_EVENT_PROXY_BIND = 0;
+
+static Eina_List *servers = NULL;
+static int _ecore_con_init_count = 0;
+static int _ecore_con_event_count = 0;
+int _ecore_con_log_dom = -1;
+Ecore_Con_Socks *_ecore_con_proxy_once = NULL;
+Ecore_Con_Socks *_ecore_con_proxy_global = NULL;
+
+EAPI int
+ecore_con_init(void)
+{
+   if (++_ecore_con_init_count != 1)
+     return _ecore_con_init_count;
+
+#ifdef HAVE_EVIL
+   if (!evil_init())
+     return --_ecore_con_init_count;
 
-static Ecore_List *servers = NULL;
-static int init_count = 0;
-#if USE_OPENSSL
-static int ssl_init_count = 0;
 #endif
 
-#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
-#define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
+   if (!ecore_init())
+     return --_ecore_con_init_count;
 
-/**
- * @defgroup Ecore_Con_Lib_Group Ecore Connection Library Functions
- *
- * Utility functions that set up and shut down the Ecore Connection
- * library.
- */
+   _ecore_con_log_dom = eina_log_domain_register
+       ("ecore_con", ECORE_CON_DEFAULT_LOG_COLOR);
+   if (_ecore_con_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for Ecore Con.");
+        ecore_shutdown();
+        return --_ecore_con_init_count;
+     }
 
-/**
- * Initialises the Ecore_Con library.
- * @return  Number of times the library has been initialised without being
- *          shut down.
- * @ingroup Ecore_Con_Lib_Group
- */
-EAPI int
-ecore_con_init(void)
-{
-   if (++init_count != 1) return init_count;
+   ecore_con_mempool_init();
 
-   ecore_init();
    ECORE_CON_EVENT_CLIENT_ADD = ecore_event_type_new();
    ECORE_CON_EVENT_CLIENT_DEL = ecore_event_type_new();
    ECORE_CON_EVENT_SERVER_ADD = ecore_event_type_new();
    ECORE_CON_EVENT_SERVER_DEL = ecore_event_type_new();
    ECORE_CON_EVENT_CLIENT_DATA = ecore_event_type_new();
    ECORE_CON_EVENT_SERVER_DATA = ecore_event_type_new();
+   ECORE_CON_EVENT_CLIENT_WRITE = ecore_event_type_new();
+   ECORE_CON_EVENT_SERVER_WRITE = ecore_event_type_new();
+   ECORE_CON_EVENT_CLIENT_ERROR = ecore_event_type_new();
+   ECORE_CON_EVENT_SERVER_ERROR = ecore_event_type_new();
+   ECORE_CON_EVENT_PROXY_BIND = ecore_event_type_new();
 
-   /* TODO Remember return value, if it fails, use gethostbyname() */
-   ecore_con_dns_init();
 
-   servers = ecore_list_new();
+   eina_magic_string_set(ECORE_MAGIC_CON_SERVER, "Ecore_Con_Server");
+   eina_magic_string_set(ECORE_MAGIC_CON_CLIENT, "Ecore_Con_Client");
+   eina_magic_string_set(ECORE_MAGIC_CON_URL, "Ecore_Con_Url");
+
+   /* TODO Remember return value, if it fails, use gethostbyname() */
+   ecore_con_socks_init();
+   ecore_con_ssl_init();
+   ecore_con_info_init();
 
-   return init_count;
+   return _ecore_con_init_count;
 }
 
-/**
- * Shuts down the Ecore_Con library.
- * @return  Number of times the library has been initialised without being
- *          shut down.
- * @ingroup Ecore_Con_Lib_Group
- */
 EAPI int
 ecore_con_shutdown(void)
 {
-   if (--init_count != 0) return init_count;
+   Eina_List *l, *l2;
+   Ecore_Con_Server *svr;
+
+   if (--_ecore_con_init_count != 0)
+     return _ecore_con_init_count;
 
-   while (!ecore_list_empty_is(servers))
-     _ecore_con_server_free(ecore_list_first_remove(servers));
-   ecore_list_destroy(servers);
-   servers = NULL;
+   EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
+     {
+        Ecore_Con_Event_Server_Add *ev;
+
+        svr->delete_me = EINA_TRUE;
+        INF("svr %p is dead", svr);
+        /* some pointer hacks here to prevent double frees if people are being stupid */
+        EINA_LIST_FREE(svr->event_count, ev)
+          ev->server = NULL;
+        _ecore_con_server_free(svr);
+     }
 
-   ecore_con_dns_shutdown();
+   ecore_con_socks_shutdown();
+   if (!_ecore_con_event_count) ecore_con_mempool_shutdown();
 
+   ecore_con_info_shutdown();
+   ecore_con_ssl_shutdown();
+   eina_log_domain_unregister(_ecore_con_log_dom);
+   _ecore_con_log_dom = -1;
    ecore_shutdown();
+#ifdef HAVE_EVIL
+   evil_shutdown();
+#endif
+
+   return _ecore_con_init_count;
+}
+
+EAPI Eina_Bool
+ecore_con_lookup(const char      *name,
+                 Ecore_Con_Dns_Cb done_cb,
+                 const void      *data)
+{
+   Ecore_Con_Server *svr;
+   Ecore_Con_Lookup *lk;
+   struct addrinfo hints;
+
+   if (!name || !done_cb)
+     return EINA_FALSE;
+
+   svr = calloc(1, sizeof(Ecore_Con_Server));
+   if (!svr)
+     return EINA_FALSE;
+
+   lk = malloc(sizeof (Ecore_Con_Lookup));
+   if (!lk)
+     {
+        free(svr);
+        return EINA_FALSE;
+     }
+
+   lk->done_cb = done_cb;
+   lk->data = data;
 
-   return init_count;
+   svr->name = strdup(name);
+   if (!svr->name)
+     goto on_error;
+
+   svr->type = ECORE_CON_REMOTE_TCP;
+   svr->port = 1025;
+   svr->data = lk;
+   svr->created = EINA_TRUE;
+   svr->reject_excess_clients = EINA_FALSE;
+   svr->client_limit = -1;
+   svr->clients = NULL;
+   svr->ppid = getpid();
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+   hints.ai_family = AF_UNSPEC;
+   hints.ai_socktype = SOCK_STREAM;
+   hints.ai_flags = AI_CANONNAME;
+   hints.ai_protocol = IPPROTO_TCP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   if (ecore_con_info_get(svr, _ecore_con_lookup_done, svr,
+                          &hints))
+     return EINA_TRUE;
+
+   free(svr->name);
+on_error:
+   free(lk);
+   free(svr);
+   return EINA_FALSE;
 }
 
 /**
- * @defgroup Ecore_Con_Server_Group Ecore Connection Server Functions
+ * @addtogroup Ecore_Con_Server_Group Ecore Connection Server Functions
  *
  * Functions that operate on Ecore server objects.
+ *
+ * @{
  */
 
 /**
- * Creates a server to listen for connections.
- *
- * The socket on which the server listens depends on the connection
- * type:
- * @li If @a compl_type is @c ECORE_CON_LOCAL_USER, the server will listen on
- *     the Unix socket "~/.ecore/[name]/[port]".
- * @li If @a compl_type is @c ECORE_CON_LOCAL_SYSTEM, the server will listen
- *     on Unix socket "/tmp/.ecore_service|[name]|[port]".
- * @li If @a compl_type is @c ECORE_CON_REMOTE_SYSTEM, the server will listen
- *     on TCP port @c port.
- *
- * @param  compl_type The connection type.
- * @param  name       Name to associate with the socket.  It is used when
- *                    generating the socket name of a Unix socket.  Though
- *                    it is not used for the TCP socket, it still needs to
- *                    be a valid character array.  @c NULL will not be
- *                    accepted.
- * @param  port       Number to identify socket.  When a Unix socket is used,
- *                    it becomes part of the socket name.  When a TCP socket
- *                    is used, it is used as the TCP port.
- * @param  data       Data to associate with the created Ecore_Con_Server
- *                    object.
- * @return A new Ecore_Con_Server.
- * @ingroup Ecore_Con_Server_Group
+ * @example ecore_con_server_example.c
+ * Shows how to write a simple server using the Ecore_Con library.
  */
+
 EAPI Ecore_Con_Server *
-ecore_con_server_add(Ecore_Con_Type compl_type, const char *name, int port,
-                    const void *data)
+ecore_con_server_add(Ecore_Con_Type compl_type,
+                     const char    *name,
+                     int            port,
+                     const void    *data)
 {
-   Ecore_Con_Server   *svr;
-   Ecore_Con_Type      type;
-   struct sockaddr_in  socket_addr;
-   struct sockaddr_un  socket_unix;
-   struct linger       lin;
-   char                buf[4096];
+   Ecore_Con_Server *svr;
+   Ecore_Con_Type type;
+
+   if (port < 0 || !name)
+     return NULL;  /* local  user   socket: FILE:   ~/.ecore/[name]/[port] */
 
-   if (port < 0) return NULL;
-   /* local  user   socket: FILE:   ~/.ecore/[name]/[port] */
    /* local  system socket: FILE:   /tmp/.ecore_service|[name]|[port] */
    /* remote system socket: TCP/IP: [name]:[port] */
    svr = calloc(1, sizeof(Ecore_Con_Server));
-   if (!svr) return NULL;
-
-   type = compl_type;
-#if USE_OPENSSL
-   /* unset the SSL flag for the following checks */
-   type &= ECORE_CON_TYPE;
-#endif
-
-   if ((type == ECORE_CON_LOCAL_USER) || (type == ECORE_CON_LOCAL_SYSTEM) ||
-       (type == ECORE_CON_LOCAL_ABSTRACT))
-     {
-       const char *homedir;
-       struct stat st;
-       mode_t pmode, mask;
-       int socket_unix_len;
-
-       if (!name) goto error;
-       mask = S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH;
-
-       if (type == ECORE_CON_LOCAL_USER)
-         {
-            homedir = getenv("HOME");
-            if (!homedir) homedir = getenv("TMP");
-            if (!homedir) homedir = "/tmp";
-            mask = S_IRUSR | S_IWUSR | S_IXUSR;
-            snprintf(buf, sizeof(buf), "%s/.ecore", homedir);
-            if (stat(buf, &st) < 0) mkdir(buf, mask);
-            snprintf(buf, sizeof(buf), "%s/.ecore/%s", homedir, name);
-            if (stat(buf, &st) < 0) mkdir(buf, mask);
-            snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, name, port);
-            mask = S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH;
-         }
-       else if (type == ECORE_CON_LOCAL_SYSTEM)
-         {
-            mask = 0;
-            if (name[0] == '/')
-              {
-                 if (port >= 0)
-                   snprintf(buf, sizeof(buf), "%s|%i", name, port);
-                 else
-                   snprintf(buf, sizeof(buf), "%s", name);
-              }
-            else
-              snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", name, port);
-         }
-       else if (type == ECORE_CON_LOCAL_ABSTRACT)
-         strncpy(buf, name, sizeof(buf));
-       pmode = umask(mask);
-       start:
-       svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
-       if (svr->fd < 0)
-         {
-            umask(pmode);
-            goto error;
-         }
-       if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
-         {
-            umask(pmode);
-            goto error;
-         }
-       if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
-         {
-            umask(pmode);
-            goto error;
-         }
-       lin.l_onoff = 1;
-       lin.l_linger = 0;
-       if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0)
-         {
-            umask(pmode);
-            goto error;
-         }
-       socket_unix.sun_family = AF_UNIX;
-       if (type == ECORE_CON_LOCAL_ABSTRACT)
-         {
-#ifdef HAVE_ABSTRACT_SOCKET
-            /* . is a placeholder */
-            snprintf(socket_unix.sun_path, sizeof(socket_unix.sun_path), ".%s", name);
-            /* first char null indicates abstract namespace */
-            socket_unix.sun_path[0] = '\0';
-            socket_unix_len = LENGTH_OF_ABSTRACT_SOCKADDR_UN(&socket_unix, name);
-#else
-            fprintf(stderr, "Your system does not support abstract sockets!\n");
-            umask(pmode);
-            goto error;
-#endif
-         }
-       else
-         {
-            strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
-            socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
-         }
-       if (bind(svr->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
-         {
-            if (connect(svr->fd, (struct sockaddr *)&socket_unix,
-                        socket_unix_len) < 0)
-              {
-                 if ((type == ECORE_CON_LOCAL_USER) || 
-                     (type == ECORE_CON_LOCAL_SYSTEM))
-                   {
-                      if (unlink(buf) < 0)
-                        {
-                           umask(pmode);
-                           goto error;
-                        }
-                      else
-                        goto start;
-                   }
-                 else
-                   {
-                      umask(pmode);
-                      goto error;
-                   }
-              }
-            else
-              {
-                 umask(pmode);
-                 goto error;
-              }
-         }
-       if (listen(svr->fd, 4096) < 0)
-         {
-            umask(pmode);
-            goto error;
-         }
-       svr->path = strdup(buf);
-       if (!svr->path)
-         {
-            umask(pmode);
-            goto error;
-         }
-       svr->fd_handler = 
-         ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
-                                   _ecore_con_svr_handler, svr, NULL, NULL);
-       umask(pmode);
-       if (!svr->fd_handler) goto error;
-     }
-   else if (type == ECORE_CON_REMOTE_SYSTEM)
-     {
-       svr->fd = socket(AF_INET, SOCK_STREAM, 0);
-       if (svr->fd < 0) goto error;
-       if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
-       if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
-       lin.l_onoff = 1;
-       lin.l_linger = 0;
-       if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0) goto error;
-       socket_addr.sin_family = AF_INET;
-       socket_addr.sin_port = htons(port);
-       socket_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-       if (bind(svr->fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)) < 0) goto error;
-       if (listen(svr->fd, 4096) < 0) goto error;
-       svr->fd_handler = 
-         ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
-                                   _ecore_con_svr_handler, svr, NULL, NULL);
-       if (!svr->fd_handler) goto error;
-     }
-
-#if USE_OPENSSL
-   if (compl_type & ECORE_CON_SSL)
-     {
-       if (!ssl_init_count)
-         {
-            SSL_library_init();
-            SSL_load_error_strings();
-         }
-       ssl_init_count++;
-
-       switch (compl_type & ECORE_CON_SSL)
-         {
-          case ECORE_CON_USE_SSL2:
-             if (!(svr->ssl_ctx = SSL_CTX_new(SSLv2_client_method())))
-               goto error;
-             break;
-          case ECORE_CON_USE_SSL3:
-             if (!(svr->ssl_ctx = SSL_CTX_new(SSLv3_client_method())))
-               goto error;
-             break;
-          case ECORE_CON_USE_TLS:
-             if (!(svr->ssl_ctx = SSL_CTX_new(TLSv1_client_method())))
-               goto error;
-             break;
-         }
-
-       if (!(svr->ssl = SSL_new(svr->ssl_ctx)))
-         goto error;
-
-       SSL_set_fd(svr->ssl, svr->fd);
-     }
-#endif
+   if (!svr)
+     return NULL;
 
    svr->name = strdup(name);
-   if (!svr->name) goto error;
-   svr->type = type;
+   if (!svr->name)
+     goto error;
+
+   svr->type = compl_type;
    svr->port = port;
    svr->data = (void *)data;
-   svr->created = 1;
-   svr->reject_excess_clients = 0;
+   svr->created = EINA_TRUE;
+   svr->use_cert = (compl_type & ECORE_CON_SSL & ECORE_CON_LOAD_CERT) == ECORE_CON_LOAD_CERT;
+   svr->reject_excess_clients = EINA_FALSE;
    svr->client_limit = -1;
-   svr->clients = ecore_list_new();
+   svr->clients = NULL;
    svr->ppid = getpid();
-   ecore_list_append(servers, svr);
+   if (ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL))
+     goto error;
+
+   type = compl_type & ECORE_CON_TYPE;
+
+   if ((type == ECORE_CON_LOCAL_USER) ||
+       (type == ECORE_CON_LOCAL_SYSTEM) ||
+       (type == ECORE_CON_LOCAL_ABSTRACT))
+     /* Local */
+#ifdef _WIN32
+     if (!ecore_con_local_listen(svr))
+       goto error;
+#else
+     if (!ecore_con_local_listen(svr, _ecore_con_svr_tcp_handler, svr))
+       goto error;
+#endif
+
+   if ((type == ECORE_CON_REMOTE_TCP) ||
+       (type == ECORE_CON_REMOTE_NODELAY) ||
+       (type == ECORE_CON_REMOTE_CORK))
+     {
+        /* TCP */
+         if (!ecore_con_info_tcp_listen(svr, _ecore_con_cb_tcp_listen,
+                                        svr))
+           goto error;
+     }
+   else if ((type == ECORE_CON_REMOTE_MCAST) ||
+            (type == ECORE_CON_REMOTE_UDP))
+     /* UDP and MCAST */
+     if (!ecore_con_info_udp_listen(svr, _ecore_con_cb_udp_listen,
+                                    svr))
+       goto error;
+
+   servers = eina_list_append(servers, svr);
    ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER);
+
    return svr;
 
-   error:
-   if (svr->name) free(svr->name);
-   if (svr->path) free(svr->path);
-   if (svr->fd >= 0) close(svr->fd);
-   if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler);
-   if (svr->write_buf) free(svr->write_buf);
-   if (svr->ip) free(svr->ip);
-#if USE_OPENSSL
-   if (svr->ssl) SSL_free(svr->ssl);
-   if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx);
-#endif
+error:
+   if (svr->name)
+     free(svr->name);
+
+   if (svr->path)
+     free(svr->path);
+
+
+   if (svr->fd_handler)
+     ecore_main_fd_handler_del(svr->fd_handler);
+
+   if (svr->fd > 0)
+     close(svr->fd);
+
+   if (svr->buf)
+     eina_binbuf_free(svr->buf);
+
+   if (svr->ip)
+     eina_stringshare_del(svr->ip);
+
+   ecore_con_ssl_server_shutdown(svr);
    free(svr);
    return NULL;
 }
 
-/**
- * Creates a server object to represent the server listening at the
- * given port.
- *
- * The socket to which the server connects depends on the connection type:
- * @li If @a compl_type is @c ECORE_CON_LOCAL_USER, the function will
- *     connect to the server listening on the Unix socket
- *     "~/.ecore/[name]/[port]".
- * @li If @a compl_type is @c ECORE_CON_LOCAL_SYSTEM, the function will
- *     connect to the server listening on the Unix socket
- *     "/tmp/.ecore_service|[name]|[port]".
- * @li If @a compl_type is @c ECORE_CON_REMOTE_SYSTEM, the function will
- *     connect to the server listening on the TCP port "[name]:[port]".
- *
- * @param  compl_type The connection type.
- * @param  name       Name used when determining what socket to connect to.
- *                    It is used to generate the socket name when the socket
- *                    is a Unix socket.  It is used as the hostname when
- *                    connecting with a TCP socket.
- * @param  port       Number to identify the socket to connect to.  Used when
- *                    generating the socket name for a Unix socket, or as the
- *                    TCP port when connecting to a TCP socket.
- * @param  data       Data to associate with the created Ecore_Con_Server
- *                    object.
- * @return A new Ecore_Con_Server.
- * @ingroup Ecore_Con_Server_Group
- */
 EAPI Ecore_Con_Server *
-ecore_con_server_connect(Ecore_Con_Type compl_type, const char *name, int port,
-                        const void *data)
+ecore_con_server_connect(Ecore_Con_Type compl_type,
+                         const char    *name,
+                         int            port,
+                         const void    *data)
 {
-   Ecore_Con_Server   *svr;
-   Ecore_Con_Type      type;
-   struct sockaddr_un  socket_unix;
-   int                 curstate = 0;
-   char                buf[4096];
+   Ecore_Con_Server *svr;
+   Ecore_Con_Type type;
 
-   if (!name) return NULL;
+   if ((!name) || (!name[0]))
+     return NULL;
    /* local  user   socket: FILE:   ~/.ecore/[name]/[port] */
    /* local  system socket: FILE:   /tmp/.ecore_service|[name]|[port] */
    /* remote system socket: TCP/IP: [name]:[port] */
    svr = calloc(1, sizeof(Ecore_Con_Server));
-   if (!svr) return NULL;
-
-   type = compl_type;
-#if USE_OPENSSL
-   /* unset the SSL flag for the following checks */
-   type &= ECORE_CON_TYPE;
-#endif
-   if ((type == ECORE_CON_REMOTE_SYSTEM) && (port < 0)) return NULL;
-
-   if ((type == ECORE_CON_LOCAL_USER) || (type == ECORE_CON_LOCAL_SYSTEM) ||
-       (type == ECORE_CON_LOCAL_ABSTRACT))
-     {
-       const char *homedir;
-       int socket_unix_len;
-
-       if (type == ECORE_CON_LOCAL_USER)
-         {
-            homedir = getenv("HOME");
-            if (!homedir) homedir = getenv("TMP");
-            if (!homedir) homedir = "/tmp";
-            snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, name, port);
-         }
-       else if (type == ECORE_CON_LOCAL_SYSTEM)
-         {
-            if (port < 0)
-              {
-                 if (name[0] == '/')
-                   strncpy(buf, name, sizeof(buf));
-                 else
-                   snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s", name);
-              }
-            else
-              {
-                 if (name[0] == '/')
-                   snprintf(buf, sizeof(buf), "%s|%i", name, port);
-                 else
-                   snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", name, port);
-              }
-         }
-       else if (type == ECORE_CON_LOCAL_ABSTRACT)
-         strncpy(buf, name, sizeof(buf));
-
-       svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
-       if (svr->fd < 0) goto error;
-       if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
-       if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
-       if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0) goto error;
-       socket_unix.sun_family = AF_UNIX;
-
-       if (type == ECORE_CON_LOCAL_ABSTRACT)
-         {
-#ifdef HAVE_ABSTRACT_SOCKETS
-            /* copy name insto sun_path, prefixed by null to indicate abstract namespace */
-            snprintf(socket_unix.sun_path, sizeof(socket_unix.sun_path), ".%s", name);
-            socket_unix.sun_path[0] = '\0';
-            socket_unix_len = LENGTH_OF_ABSTRACT_SOCKADDR_UN(&socket_unix, name);
-#else
-            fprintf(stderr, "Your system does not support abstract sockets!\n");
-            goto error;
-#endif
-         }
-       else
-         {
-            strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
-            socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
-         }
-
-       if (connect(svr->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) goto error;
-       svr->path = strdup(buf);
-       if (!svr->path) goto error;
-       svr->fd_handler = 
-         ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
-                                   _ecore_con_cl_handler, svr, NULL, NULL);
-       if (!svr->fd_handler) goto error;
-
-       if (!svr->delete_me)
-         {
-            /* we got our server! */
-            Ecore_Con_Event_Server_Add *e;
-
-            e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
-            if (e)
-              {
-                 svr->event_count++;
-                 e->server = svr;
-                 ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
-                                 _ecore_con_event_server_add_free, NULL);
-              }
-         }
-     }
+   if (!svr)
+     return NULL;
 
    svr->name = strdup(name);
-   if (!svr->name) goto error;
+   if (!svr->name)
+     goto error;
+
    svr->type = compl_type;
    svr->port = port;
    svr->data = (void *)data;
-   svr->created = 0;
-   svr->reject_excess_clients = 0;
+   svr->created = EINA_FALSE;
+   svr->use_cert = (compl_type & ECORE_CON_SSL & ECORE_CON_LOAD_CERT) == ECORE_CON_LOAD_CERT;
+   svr->disable_proxy = (compl_type & ECORE_CON_SUPER_SSL & ECORE_CON_NO_PROXY) == ECORE_CON_NO_PROXY;
+   svr->reject_excess_clients = EINA_FALSE;
+   svr->clients = NULL;
    svr->client_limit = -1;
-   svr->clients = ecore_list_new();
-   ecore_list_append(servers, svr);
-   ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER);
 
-   if (type == ECORE_CON_REMOTE_SYSTEM)
+   type = compl_type & ECORE_CON_TYPE;
+
+   if ((!svr->disable_proxy) && (type > ECORE_CON_LOCAL_ABSTRACT))
      {
-       if (!ecore_con_dns_lookup(svr->name, _ecore_con_cb_dns_lookup, svr))
-         goto error;
+        /* never use proxies on local connections */
+        if (_ecore_con_proxy_once)
+          svr->ecs = _ecore_con_proxy_once;
+        else if (_ecore_con_proxy_global)
+          svr->ecs = _ecore_con_proxy_global;
+        _ecore_con_proxy_once = NULL;
+        if (svr->ecs)
+          {
+             if ((!svr->ecs->lookup) &&
+                 (!ecore_con_lookup(svr->name, (Ecore_Con_Dns_Cb)ecore_con_socks_dns_cb, svr)))
+               goto error;
+             if (svr->ecs->lookup)
+               svr->ecs_state = ECORE_CON_PROXY_STATE_RESOLVED;
+          }
      }
+   EINA_SAFETY_ON_TRUE_GOTO(ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL), error);
 
-   return svr;
+   EINA_SAFETY_ON_TRUE_GOTO(((type == ECORE_CON_REMOTE_TCP) ||
+        (type == ECORE_CON_REMOTE_NODELAY) ||
+        (type == ECORE_CON_REMOTE_CORK) ||
+        (type == ECORE_CON_REMOTE_UDP) ||
+        (type == ECORE_CON_REMOTE_BROADCAST)) &&
+       (port < 0), error);
 
-   error:
-   if (svr->name) free(svr->name);
-   if (svr->path) free(svr->path);
-   if (svr->fd >= 0) close(svr->fd);
-   if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler);
-#if USE_OPENSSL
-   if (svr->ssl) SSL_free(svr->ssl);
-   if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx);
+   if ((type == ECORE_CON_LOCAL_USER) ||
+       (type == ECORE_CON_LOCAL_SYSTEM) ||
+       (type == ECORE_CON_LOCAL_ABSTRACT))
+     /* Local */
+#ifdef _WIN32
+     EINA_SAFETY_ON_FALSE_GOTO(ecore_con_local_connect(svr, _ecore_con_cl_handler), error);
+#else
+     EINA_SAFETY_ON_FALSE_GOTO(ecore_con_local_connect(svr, _ecore_con_cl_handler, svr), error);
 #endif
+
+   if ((type == ECORE_CON_REMOTE_TCP) ||
+       (type == ECORE_CON_REMOTE_NODELAY) ||
+       (type == ECORE_CON_REMOTE_CORK))
+     {
+        /* TCP */
+         EINA_SAFETY_ON_FALSE_GOTO(ecore_con_info_tcp_connect(svr, _ecore_con_cb_tcp_connect, svr), error);
+     }
+   else if ((type == ECORE_CON_REMOTE_UDP) || (type == ECORE_CON_REMOTE_BROADCAST))
+     /* UDP and MCAST */
+     EINA_SAFETY_ON_FALSE_GOTO(ecore_con_info_udp_connect(svr, _ecore_con_cb_udp_connect, svr), error);
+
+   servers = eina_list_append(servers, svr);
+   ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER);
+
+   return svr;
+
+error:
+   if (svr->name)
+     free(svr->name);
+
+   if (svr->path)
+     free(svr->path);
+
+   if (svr->fd_handler)
+     ecore_main_fd_handler_del(svr->fd_handler);
+
+   if (svr->fd > 0)
+     close(svr->fd);
+
+   ecore_con_ssl_server_shutdown(svr);
    free(svr);
    return NULL;
 }
 
-/**
- * Closes the connection and frees the given server.
- * @param   svr The given server.
- * @return  Data associated with the server when it was created.
- * @ingroup Ecore_Con_Server_Group
- */
-EAPI void *
-ecore_con_server_del(Ecore_Con_Server *svr)
+EAPI void
+ecore_con_server_timeout_set(Ecore_Con_Server *svr,
+                             double            timeout)
 {
-   void *data;
-
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_set");
+        return;
      }
-   data = svr->data;
-   svr->data = NULL;
-   svr->delete_me = 1;
-   if (svr->event_count > 0)
+
+   if (svr->created)
+     svr->client_disconnect_time = timeout;
+   else
+     svr->disconnect_time = timeout;
+}
+
+EAPI double
+ecore_con_server_timeout_get(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       if (svr->fd_handler)
-         {
-            ecore_main_fd_handler_del(svr->fd_handler);
-            svr->fd_handler = NULL;
-         }
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_get");
+        return 0;
      }
-   else
+
+   return svr->created ? svr->client_disconnect_time : svr->disconnect_time;
+}
+
+EAPI void *
+ecore_con_server_del(Ecore_Con_Server *svr)
+{
+   if (!svr) return NULL;
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       _ecore_con_server_free(svr);
-       if (ecore_list_goto(servers, svr)) ecore_list_remove(servers);
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_del");
+        return NULL;
      }
-   return data;
+
+   if (svr->delete_me)
+     return NULL;
+
+   _ecore_con_server_kill(svr);
+   return svr->data;
 }
 
-/**
- * Retrieves the data associated with the given server.
- * @param   svr The given server.
- * @return  The associated data.
- * @ingroup Ecore_Con_Server_Group
- */
 EAPI void *
 ecore_con_server_data_get(Ecore_Con_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_data_get");
+        return NULL;
      }
+
    return svr->data;
 }
 
-/**
- * Retrieves whether the given server is currently connected.
- * @todo Check that this function does what the documenter believes it does.
- * @param   svr The given server.
- * @return  @c 1 if the server is connected.  @c 0 otherwise.
- * @ingroup Ecore_Con_Server_Group
- */
-EAPI int
+EAPI void *
+ecore_con_server_data_set(Ecore_Con_Server *svr,
+                          void             *data)
+{
+   void *ret = NULL;
+
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_data_get");
+        return NULL;
+     }
+
+   ret = svr->data;
+   svr->data = data;
+   return ret;
+}
+
+EAPI Eina_Bool
 ecore_con_server_connected_get(Ecore_Con_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_connected_get");
-       return 0;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_connected_get");
+        return EINA_FALSE;
      }
-   if (svr->connecting) return 0;
-   return 1;
+
+   if (svr->connecting)
+     return EINA_FALSE;
+
+   return EINA_TRUE;
 }
 
-/**
- * Retrieves the current list of clients.
- * @param   svr The given server.
- * @return  The list of clients on this server.
- * @ingroup Ecore_Con_Server_Group
- */
-EAPI Ecore_List *
+EAPI const Eina_List *
 ecore_con_server_clients_get(Ecore_Con_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_clients_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
+                         "ecore_con_server_clients_get");
+        return NULL;
      }
+
    return svr->clients;
 }
 
-/**
- * Sends the given data to the given server.
- * @param   svr  The given server.
- * @param   data The given data.
- * @param   size Length of the data, in bytes, to send.
- * @return  The number of bytes sent.  @c 0 will be returned if there is an
- *          error.
- * @ingroup Ecore_Con_Server_Group
- */
+EAPI const char *
+ecore_con_server_name_get(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
+                         "ecore_con_server_name_get");
+        return NULL;
+     }
+
+   return svr->name;
+}
+
+EAPI int
+ecore_con_server_port_get(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
+                         "ecore_con_server_port_get");
+        return -1;
+     }
+   return svr->port;
+}
+
 EAPI int
-ecore_con_server_send(Ecore_Con_Server *svr, const void *data, int size)
+ecore_con_server_send(Ecore_Con_Server *svr,
+                      const void       *data,
+                      int               size)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_send");
-       return 0;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_send");
+        return 0;
      }
-   if (svr->dead) return 0;
-   if (!data) return 0;
-   if (size < 1) return 0;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(svr->delete_me, 0);
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0);
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0);
+
    if (svr->fd_handler)
      ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
-   if (svr->write_buf)
-     {
-       unsigned char *newbuf;
 
-       newbuf = realloc(svr->write_buf, svr->write_buf_size + size);
-       if (newbuf) svr->write_buf = newbuf;
-       else return 0;
-       memcpy(svr->write_buf + svr->write_buf_size, data, size);
-       svr->write_buf_size += size;
-     }
-   else
+   if (!svr->buf)
      {
-       svr->write_buf = malloc(size);
-       if (!svr->write_buf) return 0;
-       svr->write_buf_size = size;
-       memcpy(svr->write_buf, data, size);
+        svr->buf = eina_binbuf_new();
+        EINA_SAFETY_ON_NULL_RETURN_VAL(svr->buf, 0);
+#ifdef TCP_CORK
+        if ((svr->fd >= 0) && ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK))
+          {
+             int state = 1;
+             if (setsockopt(svr->fd, IPPROTO_TCP, TCP_CORK, (char *)&state, sizeof(int)) < 0)
+               /* realistically this isn't anything serious so we can just log and continue */
+               ERR("corking failed! %s", strerror(errno));
+          }
+#endif
      }
+   eina_binbuf_append_length(svr->buf, data, size);
+
    return size;
 }
 
-/**
- * Sets a limit on the number of clients that can be handled concurrently
- * by the given server, and a policy on what to do if excess clients try to
- * connect.
- * Beware that if you set this once ecore is already running, you may
- * already have pending CLIENT_ADD events in your event queue.  Those
- * clients have already connected and will not be affected by this call.
- * Only clients subsequently trying to connect will be affected.
- * @param   svr           The given server.
- * @param   client_limit  The maximum number of clients to handle
- *                        concurrently.  -1 means unlimited (default).  0
- *                        effectively disables the server.
- * @param   reject_excess_clients  Set to 1 to automatically disconnect
- *                        excess clients as soon as they connect if you are
- *                        already handling client_limit clients.  Set to 0
- *                        (default) to just hold off on the "accept()"
- *                        system call until the number of active clients
- *                        drops. This causes the kernel to queue up to 4096
- *                        connections (or your kernel's limit, whichever is
- *                        lower).
- * @ingroup Ecore_Con_Server_Group
- */
 EAPI void
-ecore_con_server_client_limit_set(Ecore_Con_Server *svr, int client_limit, char reject_excess_clients)
+ecore_con_server_client_limit_set(Ecore_Con_Server *svr,
+                                  int               client_limit,
+                                  char              reject_excess_clients)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_client_limit_set");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
+                         "ecore_con_server_client_limit_set");
+        return;
      }
+
    svr->client_limit = client_limit;
    svr->reject_excess_clients = reject_excess_clients;
 }
 
-/**
- * Gets the IP address of a server that has been connected to.
- *
- * @param   svr           The given server.
- * @return  A pointer to an internal string that contains the IP address of
- *          the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
- *          This string should not be modified or trusted to stay valid after
- *          deletion for the @p svr object. If no IP is known NULL is returned.
- * @ingroup Ecore_Con_Server_Group
- */
-EAPI char *
+EAPI const char *
 ecore_con_server_ip_get(Ecore_Con_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_ip_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_ip_get");
+        return NULL;
      }
+
    return svr->ip;
 }
 
-/**
- * Flushes all pending data to the given server. Will return when done.
- *
- * @param   svr           The given server.
- * @ingroup Ecore_Con_Server_Group
- */
+EAPI double
+ecore_con_server_uptime_get(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_uptime_get");
+        return -1;
+     }
+
+   return ecore_time_get() - svr->start_time;
+}
+
 EAPI void
 ecore_con_server_flush(Ecore_Con_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_flush");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_flush");
+        return;
      }
+
    _ecore_con_server_flush(svr);
 }
 
 /**
- * @defgroup Ecore_Con_Client_Group Ecore Connection Client Functions
+ * @}
+ */
+
+/**
+ * @addtogroup Ecore_Con_Client_Group Ecore Connection Client Functions
  *
  * Functions that operate on Ecore connection client objects.
+ *
+ * @{
  */
 
 /**
- * Sends the given data to the given client.
- * @param   cl   The given client.
- * @param   data The given data.
- * @param   size Length of the data, in bytes, to send.
- * @return  The number of bytes sent.  @c 0 will be returned if there is an
- *          error.
- * @ingroup Ecore_Con_Client_Group
+ * @example ecore_con_client_example.c
+ * Shows how to write a simple client that connects to the example server.
  */
+
 EAPI int
-ecore_con_client_send(Ecore_Con_Client *cl, const void *data, int size)
+ecore_con_client_send(Ecore_Con_Client *cl,
+                      const void       *data,
+                      int               size)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_send");
-       return 0;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_send");
+        return 0;
      }
-   if (cl->dead) return 0;
-   if (!data) return 0;
-   if (size < 1) return 0;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(cl->delete_me, 0);
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0);
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0);
+
    if (cl->fd_handler)
      ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
-   if (cl->buf)
-     {
-       unsigned char *newbuf;
 
-       newbuf = realloc(cl->buf, cl->buf_size + size);
-       if (newbuf) cl->buf = newbuf;
-       else return 0;
-       memcpy(cl->buf + cl->buf_size, data, size);
-       cl->buf_size += size;
-     }
-   else
+   if (cl->host_server && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP))
+     sendto(cl->host_server->fd, data, size, 0, (struct sockaddr *)cl->client_addr,
+            cl->client_addr_len);
+   else if (!cl->buf)
      {
-       cl->buf = malloc(size);
-       if (!cl->buf) return 0;
-       cl->buf_size = size;
-       memcpy(cl->buf, data, size);
+        cl->buf = eina_binbuf_new();
+        EINA_SAFETY_ON_NULL_RETURN_VAL(cl->buf, 0);
+#ifdef TCP_CORK
+        if ((cl->fd >= 0) && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK))
+          {
+             int state = 1;
+             if (setsockopt(cl->fd, IPPROTO_TCP, TCP_CORK, (char *)&state, sizeof(int)) < 0)
+               /* realistically this isn't anything serious so we can just log and continue */
+               ERR("corking failed! %s", strerror(errno));
+          }
+#endif
      }
+   eina_binbuf_append_length(cl->buf, data, size);
+
    return size;
 }
 
-/**
- * Retrieves the server representing the socket the client has
- * connected to.
- * @param   cl The given client.
- * @return  The server that the client connected to.
- * @ingroup Ecore_Con_Client_Group
- */
 EAPI Ecore_Con_Server *
 ecore_con_client_server_get(Ecore_Con_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_server_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
+                         "ecore_con_client_server_get");
+        return NULL;
      }
-   return cl->server;
+
+   return cl->host_server;
 }
 
-/**
- * Closes the connection and frees memory allocated to the given client.
- * @param   cl The given client.
- * @return  Data associated with the client.
- * @ingroup Ecore_Con_Client_Group
- */
-EAPI void *
-ecore_con_client_del(Ecore_Con_Client *cl)
+EAPI Eina_Bool
+ecore_con_client_connected_get(Ecore_Con_Client *cl)
 {
-   void *data;
+   if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
+     {
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
+                         "ecore_con_client_connected_get");
+        return EINA_FALSE;
+     }
+
+   return !cl->delete_me;
+}
 
+EAPI void
+ecore_con_client_timeout_set(Ecore_Con_Client *cl,
+                             double            timeout)
+{
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
+                         "ecore_con_client_timeout_set");
+        return;
      }
-   data = cl->data;
-   cl->data = NULL;
-   cl->delete_me = 1;
-   if (cl->event_count > 0)
+
+   cl->disconnect_time = timeout;
+
+   _ecore_con_cl_timer_update(cl);
+}
+
+EAPI double
+ecore_con_client_timeout_get(Ecore_Con_Client *cl)
+{
+   if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       if (cl->fd_handler)
-         {
-            ecore_main_fd_handler_del(cl->fd_handler);
-            cl->fd_handler = NULL;
-         }
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_timeout_get");
+        return 0;
      }
-   else
+
+   return cl->disconnect_time;
+}
+
+EAPI void *
+ecore_con_client_del(Ecore_Con_Client *cl)
+{
+   if (!cl) return NULL;
+   if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       if (ecore_list_goto(cl->server->clients, cl))
-         ecore_list_remove(cl->server->clients);
-       _ecore_con_client_free(cl);
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_del");
+        return NULL;
      }
-   return data;
+
+   _ecore_con_client_kill(cl);
+   return cl->data;
 }
 
-/**
- * Sets the data associated with the given client to @p data.
- * @param   cl   The given client.
- * @param   data What to set the data to.
- * @ingroup Ecore_Con_Client_Group
- */
 EAPI void
-ecore_con_client_data_set(Ecore_Con_Client *cl, const void *data)
+ecore_con_client_data_set(Ecore_Con_Client *cl,
+                          const void       *data)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_data_set");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_data_set");
+        return;
      }
+
    cl->data = (void *)data;
 }
 
-/**
- * Retrieves the data associated with the given client.
- * @param   cl The given client.
- * @return  The data associated with @p cl.
- * @ingroup Ecore_Con_Client_Group
- */
 EAPI void *
 ecore_con_client_data_get(Ecore_Con_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_data_get");
+        return NULL;
      }
+
    return cl->data;
 }
 
-/**
- * Gets the IP address of a cleint that has connected.
- *
- * @param   cl            The given client.
- * @return  A pointer to an internal string that contains the IP address of
- *          the connected client in the form "XXX.YYY.ZZZ.AAA" IP notation.
- *          This string should not be modified or trusted to stay valid after
- *          deletion for the @p cl object. If no IP is known NULL is returned.
- * @ingroup Ecore_Con_Client_Group
- */
-EAPI char *
+EAPI const char *
 ecore_con_client_ip_get(Ecore_Con_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_ip_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_ip_get");
+        return NULL;
      }
+   if (!cl->ip)
+     cl->ip = _ecore_con_pretty_ip(cl->client_addr);
+
    return cl->ip;
 }
 
-/**
- * Flushes all pending data to the given client. Will return when done.
- *
- * @param   cl            The given client.
- * @ingroup Ecore_Con_Client_Group
- */
+EAPI int
+ecore_con_client_port_get(Ecore_Con_Client *cl)
+{
+   if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
+     {
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_port_get");
+        return -1;
+     }
+   if (cl->client_addr->sa_family == AF_INET)
+     return ((struct sockaddr_in*)cl->client_addr)->sin_port;
+#ifdef HAVE_IPV6
+   return ((struct sockaddr_in6*)cl->client_addr)->sin6_port;
+#else
+   return -1;
+#endif
+}
+
+EAPI double
+ecore_con_client_uptime_get(Ecore_Con_Client *cl)
+{
+   if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
+     {
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_uptime_get");
+        return -1;
+     }
+
+   return ecore_time_get() - cl->start_time;
+}
+
 EAPI void
 ecore_con_client_flush(Ecore_Con_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_flush");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_flush");
+        return;
      }
+
    _ecore_con_client_flush(cl);
 }
 
+EAPI int
+ecore_con_server_fd_get(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
+        return -1;
+     }
+   if (svr->created) return -1;
+   if (svr->delete_me) return -1;
+   return ecore_main_fd_handler_fd_get(svr->fd_handler);
+}
+
+EAPI int
+ecore_con_client_fd_get(Ecore_Con_Client *cl)
+{
+   if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
+     {
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, __func__);
+        return -1;
+     }
+   return ecore_main_fd_handler_fd_get(cl->fd_handler);
+}
+
 /**
- * Returns if SSL support is available
- * @return  1 if SSL is available, 0 if it is not.
- * @ingroup Ecore_Con_Client_Group
+ * @}
  */
-EAPI int
-ecore_con_ssl_available_get(void)
+
+void
+ecore_con_event_proxy_bind(Ecore_Con_Server *svr)
 {
-#if USE_OPENSSL
-   return 1;
-#else
-   return 0;
-#endif
+    Ecore_Con_Event_Proxy_Bind *e;
+    int ev = ECORE_CON_EVENT_PROXY_BIND;
+
+    e = ecore_con_event_proxy_bind_alloc();
+    EINA_SAFETY_ON_NULL_RETURN(e);
+
+    svr->event_count = eina_list_append(svr->event_count, e);
+    _ecore_con_server_timer_update(svr);
+    e->server = svr;
+    e->ip = svr->proxyip;
+    e->port = svr->proxyport;
+    ecore_event_add(ev, e,
+                    _ecore_con_event_server_add_free, NULL);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_server_add(Ecore_Con_Server *svr)
+{
+    /* we got our server! */
+    Ecore_Con_Event_Server_Add *e;
+    int ev = ECORE_CON_EVENT_SERVER_ADD;
+
+    e = ecore_con_event_server_add_alloc();
+    EINA_SAFETY_ON_NULL_RETURN(e);
+
+    svr->connecting = EINA_FALSE;
+    svr->start_time = ecore_time_get();
+    svr->event_count = eina_list_append(svr->event_count, e);
+    _ecore_con_server_timer_update(svr);
+    e->server = svr;
+    if (svr->upgrade) ev = ECORE_CON_EVENT_SERVER_UPGRADE;
+    ecore_event_add(ev, e,
+                    _ecore_con_event_server_add_free, NULL);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_server_del(Ecore_Con_Server *svr)
+{
+    Ecore_Con_Event_Server_Del *e;
+
+    svr->delete_me = EINA_TRUE;
+    INF("svr %p is dead", svr);
+    e = ecore_con_event_server_del_alloc();
+    EINA_SAFETY_ON_NULL_RETURN(e);
+
+    svr->event_count = eina_list_append(svr->event_count, e);
+    _ecore_con_server_timer_update(svr);
+    e->server = svr;
+    if (svr->ecs)
+      {
+         svr->ecs_state = svr->ecs->lookup ? ECORE_CON_PROXY_STATE_RESOLVED : ECORE_CON_PROXY_STATE_DONE;
+         eina_stringshare_replace(&svr->proxyip, NULL);
+         svr->proxyport = 0;
+      }
+    ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
+                    _ecore_con_event_server_del_free, NULL);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_server_write(Ecore_Con_Server *svr, int num)
+{
+   Ecore_Con_Event_Server_Write *e;
+
+   e = ecore_con_event_server_write_alloc();
+   EINA_SAFETY_ON_NULL_RETURN(e);
+
+   INF("Wrote %d bytes", num);
+   svr->event_count = eina_list_append(svr->event_count, e);
+   e->server = svr;
+   e->size = num;
+   ecore_event_add(ECORE_CON_EVENT_SERVER_WRITE, e,
+                   (Ecore_End_Cb)_ecore_con_event_server_write_free, NULL);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num, Eina_Bool duplicate)
+{
+   Ecore_Con_Event_Server_Data *e;
+
+   e = ecore_con_event_server_data_alloc();
+   EINA_SAFETY_ON_NULL_RETURN(e);
+
+   svr->event_count = eina_list_append(svr->event_count, e);
+   _ecore_con_server_timer_update(svr);
+   e->server = svr;
+   if (duplicate)
+     {
+        e->data = malloc(num);
+        if (!e->data)
+          {
+             ERR("server data allocation failure !");
+             _ecore_con_event_server_data_free(NULL, e);
+             return;
+          }
+        memcpy(e->data, buf, num);
+     }
+   else
+     e->data = buf;
+   e->size = num;
+   ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
+                   _ecore_con_event_server_data_free, NULL);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_client_add(Ecore_Con_Client *cl)
+{
+   Ecore_Con_Event_Client_Add *e;
+   int ev = ECORE_CON_EVENT_CLIENT_ADD;
+
+   e = ecore_con_event_client_add_alloc();
+   EINA_SAFETY_ON_NULL_RETURN(e);
+
+   cl->event_count = eina_list_append(cl->event_count, e);
+   cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
+   _ecore_con_cl_timer_update(cl);
+   e->client = cl;
+   if (cl->upgrade) ev = ECORE_CON_EVENT_CLIENT_UPGRADE;
+   ecore_event_add(ev, e,
+                   (Ecore_End_Cb)_ecore_con_event_client_add_free, cl->host_server);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_client_del(Ecore_Con_Client *cl)
+{
+    Ecore_Con_Event_Client_Del *e;
+
+    if (!cl) return;
+    cl->delete_me = EINA_TRUE;
+    INF("cl %p is dead", cl);
+    e = ecore_con_event_client_del_alloc();
+    EINA_SAFETY_ON_NULL_RETURN(e);
+    cl->event_count = eina_list_append(cl->event_count, e);
+
+    cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
+    _ecore_con_cl_timer_update(cl);
+    e->client = cl;
+    ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
+                    (Ecore_End_Cb)_ecore_con_event_client_del_free, cl->host_server);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_client_write(Ecore_Con_Client *cl, int num)
+{
+   Ecore_Con_Event_Client_Write *e;
+
+   e = ecore_con_event_client_write_alloc();
+   EINA_SAFETY_ON_NULL_RETURN(e);
+
+   cl->event_count = eina_list_append(cl->event_count, e);
+   cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
+   e->client = cl;
+   e->size = num;
+   ecore_event_add(ECORE_CON_EVENT_CLIENT_WRITE, e,
+                   (Ecore_End_Cb)_ecore_con_event_client_write_free, cl->host_server);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, Eina_Bool duplicate)
+{
+   Ecore_Con_Event_Client_Data *e;
+
+   e = ecore_con_event_client_data_alloc();
+   EINA_SAFETY_ON_NULL_RETURN(e);
+
+   cl->event_count = eina_list_append(cl->event_count, e);
+   cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
+   _ecore_con_cl_timer_update(cl);
+   e->client = cl;
+   if (duplicate)
+     {
+        e->data = malloc(num);
+        if (!e->data)
+          {
+             ERR("client data allocation failure !");
+             _ecore_con_event_client_data_free(cl->host_server, e);
+             return;
+          }
+        memcpy(e->data, buf, num);
+     }
+   else
+     e->data = buf;
+   e->size = num;
+   ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
+                   (Ecore_End_Cb)_ecore_con_event_client_data_free, cl->host_server);
+   _ecore_con_event_count++;
+}
+
+
+void
+ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info)
+{
+   svr->infos = eina_list_remove(svr->infos, info);
+}
+
+void
+_ecore_con_event_server_error(Ecore_Con_Server *svr, char *error, Eina_Bool duplicate)
+{
+   Ecore_Con_Event_Server_Error *e;
+
+   e = ecore_con_event_server_error_alloc();
+   EINA_SAFETY_ON_NULL_RETURN(e);
+
+   e->server = svr;
+   e->error = duplicate ? strdup(error) : error;
+   ERR("%s", error);
+   svr->event_count = eina_list_append(svr->event_count, e);
+   ecore_event_add(ECORE_CON_EVENT_SERVER_ERROR, e, (Ecore_End_Cb)_ecore_con_event_server_error_free, NULL);
+   _ecore_con_event_count++;
+}
+
+void
+ecore_con_event_client_error(Ecore_Con_Client *cl, const char *error)
+{
+   Ecore_Con_Event_Client_Error *e;
+
+   e = ecore_con_event_client_error_alloc();
+   EINA_SAFETY_ON_NULL_RETURN(e);
+
+   e->client = cl;
+   e->error = strdup(error);
+// givving errors like this is not a good thing - MAYBET his belongs in debug... but not err.   
+//   ERR("%s", error);
+   cl->event_count = eina_list_append(cl->event_count, e);
+   cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
+   ecore_event_add(ECORE_CON_EVENT_CLIENT_ERROR, e, (Ecore_End_Cb)_ecore_con_event_client_error_free, cl->host_server);
+   _ecore_con_event_count++;
 }
 
 static void
 _ecore_con_server_free(Ecore_Con_Server *svr)
 {
+   Ecore_Con_Client *cl;
    double t_start, t;
 
-   ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
+   if (svr->event_count) return;
+
+   while (svr->infos)
+     {
+        ecore_con_info_data_clear(svr->infos->data);
+        svr->infos = eina_list_remove_list(svr->infos, svr->infos);
+     }
+
    t_start = ecore_time_get();
-   while ((svr->write_buf) && (!svr->dead))
-     {
-       _ecore_con_server_flush(svr);
-       t = ecore_time_get();
-       if ((t - t_start) > 0.5)
-         {
-            printf("ECORE_CON: EEK - stuck in _ecore_con_server_free() trying\n"
-                   "  to flush data out from the server, and have been for\n"
-                   "  %1.1f seconds. This is taking too long. Aborting flush.\n",
-                   (t - t_start));
-            break;
-         }
-     }
-   if (svr->write_buf) free(svr->write_buf);
-   while (!ecore_list_empty_is(svr->clients))
-     _ecore_con_client_free(ecore_list_first_remove(svr->clients));
-   ecore_list_destroy(svr->clients);
-   if ((svr->created) && (svr->path) && (svr->ppid == getpid())) 
-     unlink(svr->path);
-   if (svr->fd >= 0) close(svr->fd);
-#if USE_OPENSSL
-   if (svr->ssl)
+   while (svr->buf && (!svr->delete_me))
      {
-       SSL_shutdown(svr->ssl);
-       SSL_free(svr->ssl);
+        _ecore_con_server_flush(svr);
+        t = ecore_time_get();
+        if ((t - t_start) > 0.5)
+          {
+             WRN("ECORE_CON: EEK - stuck in _ecore_con_server_free() trying\n"
+                 "  to flush data out from the server, and have been for\n"
+                 "  %1.1f seconds. This is taking too long. Aborting flush.",
+                 (t - t_start));
+             break;
+          }
      }
-   if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx);
+
+#ifdef _WIN32
+   ecore_con_local_win32_server_del(svr);
 #endif
-   if (svr->name) free(svr->name);
-   if (svr->path) free(svr->path);
-   if (svr->ip) free(svr->ip);
-   if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler);
+   if (svr->event_count) return;
+   ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
+
+   if (svr->buf)
+     eina_binbuf_free(svr->buf);
+
+   EINA_LIST_FREE(svr->clients, cl)
+     {
+        Ecore_Con_Event_Server_Add *ev;
+
+        /* some pointer hacks here to prevent double frees if people are being stupid */
+        EINA_LIST_FREE(cl->event_count, ev)
+          ev->server = NULL;
+        cl->delete_me = EINA_TRUE;
+        INF("cl %p is dead", cl);
+        _ecore_con_client_free(cl);
+     }
+   if ((svr->created) && (svr->path) && (svr->ppid == getpid()))
+     unlink(svr->path);
+
+   ecore_con_ssl_server_shutdown(svr);
+   free(svr->name);
+
+   free(svr->path);
+
+   eina_stringshare_del(svr->ip);
+   eina_stringshare_del(svr->verify_name);
+
+   if (svr->ecs_buf) eina_binbuf_free(svr->ecs_buf);
+   if (svr->ecs_recvbuf) eina_binbuf_free(svr->ecs_recvbuf);
+
+   if (svr->fd_handler)
+     ecore_main_fd_handler_del(svr->fd_handler);
+
+   if (svr->fd > 0)
+     close(svr->fd);
+
+   if (svr->until_deletion)
+     ecore_timer_del(svr->until_deletion);
+
+   servers = eina_list_remove(servers, svr);
+   svr->data = NULL;
    free(svr);
 }
 
@@ -985,702 +1295,1345 @@ _ecore_con_client_free(Ecore_Con_Client *cl)
 {
    double t_start, t;
 
-   ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
+   if (cl->event_count) return;
+
    t_start = ecore_time_get();
-   while ((cl->buf) && (!cl->dead))
-     {
-       _ecore_con_client_flush(cl);
-       t = ecore_time_get();
-       if ((t - t_start) > 0.5)
-         {
-            printf("ECORE_CON: EEK - stuck in _ecore_con_client_free() trying\n"
-                   "  to flush data out from the client, and have been for\n"
-                   "  %1.1f seconds. This is taking too long. Aborting flush.\n",
-                   (t - t_start));
-            break;
-         }
-     }
-   if (cl->buf) free(cl->buf);
-   if (cl->fd >= 0) close(cl->fd);
-   if (cl->fd_handler) ecore_main_fd_handler_del(cl->fd_handler);
-   if (cl->ip) free(cl->ip);
+   while ((cl->buf) && (!cl->delete_me))
+     {
+        _ecore_con_client_flush(cl);
+        t = ecore_time_get();
+        if ((t - t_start) > 0.5)
+          {
+             WRN("EEK - stuck in _ecore_con_client_free() trying\n"
+                 "  to flush data out from the client, and have been for\n"
+                 "  %1.1f seconds. This is taking too long. Aborting flush.",
+                 (t - t_start));
+             break;
+          }
+     }
+   cl->host_server->clients = eina_list_remove(cl->host_server->clients, cl);
+
+#ifdef _WIN32
+   ecore_con_local_win32_client_del(cl);
+#endif
+
+   if (cl->event_count) return;
+   ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
+
+   if (cl->buf) eina_binbuf_free(cl->buf);
+
+   if (cl->host_server->type & ECORE_CON_SSL)
+     ecore_con_ssl_client_shutdown(cl);
+
+   if (cl->fd_handler)
+     ecore_main_fd_handler_del(cl->fd_handler);
+
+   if (cl->fd > 0)
+     close(cl->fd);
+
+   free(cl->client_addr);
+   cl->client_addr = NULL;
+
+   if (cl->until_deletion)
+     ecore_timer_del(cl->until_deletion);
+
+   eina_stringshare_del(cl->ip);
+   cl->data = NULL;
    free(cl);
+   return;
 }
 
-static int
-_ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
+static Eina_Bool
+_ecore_con_server_timer(Ecore_Con_Server *svr)
 {
-   Ecore_Con_Server   *svr;
-   int                 new_fd;
-   struct sockaddr_in  incoming;
-   size_t              size_in;
+   ecore_con_server_del(svr);
 
-   svr = data;
-   if (svr->dead) return 1;
-   if (svr->delete_me) return 1;
-   if ((svr->client_limit >= 0) && (!svr->reject_excess_clients))
+   svr->until_deletion = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_ecore_con_server_timer_update(Ecore_Con_Server *svr)
+{
+   if (svr->disconnect_time)
      {
-       if (ecore_list_count(svr->clients) >= svr->client_limit) return 1;
+        if (svr->disconnect_time > 0)
+          {
+             if (svr->until_deletion)
+               ecore_timer_interval_set(svr->until_deletion, svr->disconnect_time);
+             else
+               svr->until_deletion = ecore_timer_add(svr->disconnect_time, (Ecore_Task_Cb)_ecore_con_server_timer, svr);
+          }
+        else if (svr->until_deletion)
+          {
+             ecore_timer_del(svr->until_deletion);
+             svr->until_deletion = NULL;
+          }
      }
-   /* a new client */
-   size_in = sizeof(struct sockaddr_in);
-   new_fd = accept(svr->fd, (struct sockaddr *)&incoming, (socklen_t *)&size_in);
-   if (new_fd >= 0)
-     {
-       Ecore_Con_Client *cl;
-       char buf[64];
-       uint32_t ip;
-
-       if ((svr->client_limit >= 0) && (svr->reject_excess_clients))
-         {
-            close(new_fd);
-            return 1;
-         }
-
-       cl = calloc(1, sizeof(Ecore_Con_Client));
-       if (!cl)
-         {
-            close(new_fd);
-            return 1;
-         }
-       fcntl(new_fd, F_SETFL, O_NONBLOCK);
-       fcntl(new_fd, F_SETFD, FD_CLOEXEC);
-       cl->fd = new_fd;
-       cl->server = svr;
-       cl->fd_handler = 
-         ecore_main_fd_handler_add(cl->fd, ECORE_FD_READ,
-                                   _ecore_con_svr_cl_handler, cl, NULL, NULL);
-       ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
-       ecore_list_append(svr->clients, cl);
-       if (!svr->path)
-         {
-            ip = incoming.sin_addr.s_addr;
-            snprintf(buf, sizeof(buf),
-                     "%i.%i.%i.%i",
-                     (ip      ) & 0xff,
-                     (ip >> 8 ) & 0xff,
-                     (ip >> 16) & 0xff,
-                     (ip >> 24) & 0xff);
-            cl->ip = strdup(buf);
-         }
-       if (!cl->delete_me)
-         {
-            Ecore_Con_Event_Client_Add *e;
-
-            e = calloc(1, sizeof(Ecore_Con_Event_Client_Add));
-            if (e)
-              {
-                 cl->event_count++;
-                 e->client = cl;
-                 ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, e,
-                                 _ecore_con_event_client_add_free, NULL);
-              }
-         }
-     }
-   return 1;
-}
-
-#if USE_OPENSSL
-/* Tries to connect an Ecore_Con_Server to an SSL host.
- * Returns 1 on success, -1 on fatal errors and 0 if the caller
- * should try again later.
- */
-static int
-svr_try_connect_ssl(Ecore_Con_Server *svr)
+   else
+     {
+        if (svr->until_deletion)
+          {
+             ecore_timer_del(svr->until_deletion);
+             svr->until_deletion = NULL;
+          }
+     }
+}
+
+static Eina_Bool
+_ecore_con_client_timer(Ecore_Con_Client *cl)
+{
+   ecore_con_client_del(cl);
+
+   cl->until_deletion = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_ecore_con_cl_timer_update(Ecore_Con_Client *cl)
+{
+   if (cl->disconnect_time)
+     {
+        if (cl->disconnect_time > 0)
+          {
+             if (cl->until_deletion)
+               ecore_timer_interval_set(cl->until_deletion, cl->disconnect_time);
+             else
+               cl->until_deletion = ecore_timer_add(cl->disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl);
+          }
+        else if (cl->until_deletion)
+          {
+             ecore_timer_del(cl->until_deletion);
+             cl->until_deletion = NULL;
+          }
+     }
+   else
+     {
+        if (cl->host_server->client_disconnect_time > 0)
+          {
+             if (cl->until_deletion)
+               ecore_timer_interval_set(cl->until_deletion, cl->host_server->client_disconnect_time);
+             else
+               cl->until_deletion = ecore_timer_add(cl->host_server->client_disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl);
+          }
+        else if (cl->until_deletion)
+          {
+             ecore_timer_del(cl->until_deletion);
+             cl->until_deletion = NULL;
+          }
+     }
+}
+
+static void
+_ecore_con_cb_tcp_listen(void           *data,
+                         Ecore_Con_Info *net_info)
 {
-   int res, ssl_err, flag = 0;
+   Ecore_Con_Server *svr;
+   struct linger lin;
+   const char *memerr = NULL;
+
+   svr = data;
 
-   if (!ssl_init_count)
+   errno = 0;
+   if (!net_info) /* error message has already been handled */
      {
-       SSL_library_init();
-       SSL_load_error_strings();
+        svr->delete_me = EINA_TRUE;
+        goto error;
      }
-   ssl_init_count++;
 
-   res = SSL_connect(svr->ssl);
-   if (res == 1) return 1;
-   ssl_err = SSL_get_error(svr->ssl, res);
+   svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
+                    net_info->info.ai_protocol);
+   if (svr->fd < 0) goto error;
+   if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+   if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
 
-   if (ssl_err == SSL_ERROR_NONE) return 1;
-   if (ssl_err == SSL_ERROR_WANT_READ)       flag = ECORE_FD_READ;
-   else if (ssl_err == SSL_ERROR_WANT_WRITE) flag = ECORE_FD_WRITE;
-   else return -1;
-   if (svr->fd_handler)
+   lin.l_onoff = 1;
+   lin.l_linger = 0;
+   if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin,
+                  sizeof(struct linger)) < 0)
+     goto error;
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY)
      {
-       if (flag) ecore_main_fd_handler_active_set(svr->fd_handler, flag);
+#ifdef HAVE_NETINET_TCP_H
+        int flag = 1;
+
+        if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag,
+                       sizeof(int)) < 0)
+#endif
+          {
+             goto error;
+          }
      }
-   return 0;
+
+   if (bind(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0)
+     goto error;
+
+   if (listen(svr->fd, 4096) < 0) goto error;
+
+   svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
+                                               _ecore_con_svr_tcp_handler, svr, NULL, NULL);
+   if (!svr->fd_handler)
+     {
+        memerr = "Memory allocation failure";
+        goto error;
+     }
+
+   return;
+
+error:
+   if (errno || memerr) ecore_con_event_server_error(svr, memerr ?: strerror(errno));
+   ecore_con_ssl_server_shutdown(svr);
+   _ecore_con_server_kill(svr);
 }
-#endif
 
 static void
-kill_server(Ecore_Con_Server *svr)
+_ecore_con_cb_udp_listen(void           *data,
+                         Ecore_Con_Info *net_info)
 {
-   if (!svr->delete_me)
+   Ecore_Con_Server *svr;
+   Ecore_Con_Type type;
+   struct ip_mreq mreq;
+#ifdef HAVE_IPV6
+   struct ipv6_mreq mreq6;
+#endif
+   const int on = 1;
+   const char *memerr = NULL;
+
+   svr = data;
+   type = svr->type;
+   type &= ECORE_CON_TYPE;
+
+   errno = 0;
+   if (!net_info) /* error message has already been handled */
      {
-       Ecore_Con_Event_Server_Del *e;
+        svr->delete_me = EINA_TRUE;
+        goto error;
+     }
+
+   svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
+                    net_info->info.ai_protocol);
+   if (svr->fd < 0) goto error;
 
-       e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
-       if (e)
-         {
-            svr->event_count++;
-            e->server = svr;
-            ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
-                            _ecore_con_event_server_del_free, NULL);
-         }
+   if (type == ECORE_CON_REMOTE_MCAST)
+     {
+        if (net_info->info.ai_family == AF_INET)
+          {
+             if (!inet_pton(net_info->info.ai_family, net_info->ip,
+                            &mreq.imr_multiaddr))
+               goto error;
+
+             mreq.imr_interface.s_addr = htonl(INADDR_ANY);
+             if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+                            (const void *)&mreq, sizeof(mreq)) != 0)
+               goto error;
+          }
+#ifdef HAVE_IPV6
+        else if (net_info->info.ai_family == AF_INET6)
+          {
+             if (!inet_pton(net_info->info.ai_family, net_info->ip,
+                            &mreq6.ipv6mr_multiaddr))
+               goto error;
+             mreq6.ipv6mr_interface = htonl(INADDR_ANY);
+             if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+                            (const void *)&mreq6, sizeof(mreq6)) != 0)
+               goto error;
+          }
+#endif
      }
 
-   svr->dead = 1;
-   if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler);
-   svr->fd_handler = NULL;
+   if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)) != 0)
+     goto error;
+   if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+   if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+
+   if (bind(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0)
+     goto error;
+
+   svr->fd_handler =
+     ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
+                               _ecore_con_svr_udp_handler, svr, NULL, NULL);
+   if (!svr->fd_handler)
+     {
+        memerr = "Memory allocation failure";
+        goto error;
+     }
+
+   svr->ip = eina_stringshare_add(net_info->ip);
+
+   return;
+
+error:
+   if (errno || memerr) ecore_con_event_server_error(svr, memerr ?: strerror(errno));
+   ecore_con_ssl_server_shutdown(svr);
+   _ecore_con_server_kill(svr);
 }
 
 static void
-_ecore_con_cb_dns_lookup(void *data, struct hostent *he)
+_ecore_con_cb_tcp_connect(void           *data,
+                          Ecore_Con_Info *net_info)
 {
-   Ecore_Con_Server   *svr;
-   struct sockaddr_in  socket_addr;
-   int                 curstate = 0;
-   char                buf[64];
-   uint32_t            ip;
+   Ecore_Con_Server *svr;
+   int res;
+   int curstate = 0;
+   const char *memerr = NULL;
 
    svr = data;
 
-   if (!he) goto error;
-   svr->fd = socket(AF_INET, SOCK_STREAM, 0);
+   errno = 0;
+   if (!net_info) /* error message has already been handled */
+     {
+        svr->delete_me = EINA_TRUE;
+        goto error;
+     }
+
+   svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
+                    net_info->info.ai_protocol);
    if (svr->fd < 0) goto error;
+
    if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
    if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
-   if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0) 
+
+   if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate)) < 0)
      goto error;
-   socket_addr.sin_family = AF_INET;
-   socket_addr.sin_port = htons(svr->port);
-   memcpy((struct in_addr *)&socket_addr.sin_addr,
-         he->h_addr, sizeof(struct in_addr));
-   if (connect(svr->fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)) < 0)
-     {
-       if (errno != EINPROGRESS)
-         goto error;
-       svr->connecting = 1;
-       svr->fd_handler = 
-         ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE,
-                                   _ecore_con_cl_handler, svr, NULL, NULL);
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY)
+     {
+#ifdef HAVE_NETINET_TCP_H
+        int flag = 1;
+
+        if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0)
+#endif
+          {
+             goto error;
+          }
+     }
+
+   res = connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen);
+#ifdef _WIN32
+   if (res == SOCKET_ERROR)
+     {
+        if (WSAGetLastError() != WSAEINPROGRESS)
+          {
+             char *err;
+             err = evil_format_message(WSAGetLastError());
+             _ecore_con_event_server_error(svr, err, EINA_FALSE);
+             ecore_con_ssl_server_shutdown(svr);
+             _ecore_con_server_kill(svr);
+             return;
+          }
+
+#else
+   if (res < 0)
+     {
+        if (errno != EINPROGRESS) goto error;
+#endif
+        svr->connecting = EINA_TRUE;
+        svr->fd_handler =
+          ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE,
+                                    _ecore_con_cl_handler, svr, NULL, NULL);
      }
    else
-     svr->fd_handler = 
-     ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
-                              _ecore_con_cl_handler, svr, NULL, NULL);
-
-   if (!svr->fd_handler) goto error;
-   ip = socket_addr.sin_addr.s_addr;
-   snprintf(buf, sizeof(buf),
-           "%i.%i.%i.%i",
-           (ip      ) & 0xff,
-           (ip >> 8 ) & 0xff,
-           (ip >> 16) & 0xff,
-           (ip >> 24) & 0xff);
-   svr->ip = strdup(buf);
-
-#if USE_OPENSSL
+     svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
+                                                 _ecore_con_cl_handler, svr, NULL, NULL);
+
    if (svr->type & ECORE_CON_SSL)
      {
-       if (!ssl_init_count)
-         {
-            SSL_library_init();
-            SSL_load_error_strings();
-         }
-       ssl_init_count++;
-
-       switch (svr->type & ECORE_CON_SSL)
-         {
-          case ECORE_CON_USE_SSL2:
-             if (!(svr->ssl_ctx = SSL_CTX_new(SSLv2_client_method())))
-               goto error;
-             break;
-          case ECORE_CON_USE_SSL3:
-             if (!(svr->ssl_ctx = SSL_CTX_new(SSLv3_client_method())))
-               goto error;
-             break;
-          case ECORE_CON_USE_TLS:
-             if (!(svr->ssl_ctx = SSL_CTX_new(TLSv1_client_method())))
-               goto error;
-             break;
-         }
-
-       if (!(svr->ssl = SSL_new(svr->ssl_ctx)))
-         goto error;
-
-       SSL_set_fd(svr->ssl, svr->fd);
+        svr->handshaking = EINA_TRUE;
+        svr->ssl_state = ECORE_CON_SSL_STATE_INIT;
+        DBG("%s ssl handshake", svr->ecs_state ? "Queuing" : "Beginning");
+        if ((!svr->ecs_state) && ecore_con_ssl_server_init(svr))
+          goto error;
      }
-#endif
+
+   if (!svr->fd_handler)
+     {
+        memerr = "Memory allocation failure";
+        goto error;
+     }
+
+   if ((!svr->ecs) || (svr->ecs->lookup))
+     svr->ip = eina_stringshare_add(net_info->ip);
+
+   return;
+
+error:
+   if (errno || memerr) ecore_con_event_server_error(svr, memerr ?: strerror(errno));
+   ecore_con_ssl_server_shutdown(svr);
+   _ecore_con_server_kill(svr);
+}
+
+static void
+_ecore_con_cb_udp_connect(void           *data,
+                          Ecore_Con_Info *net_info)
+{
+   Ecore_Con_Server *svr;
+   int curstate = 0;
+   int broadcast = 1;
+   const char *memerr = NULL;
+   svr = data;
+
+   errno = 0;
+   if (!net_info) /* error message has already been handled */
+     {
+        svr->delete_me = EINA_TRUE;
+        goto error;
+     }
+
+   svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
+                    net_info->info.ai_protocol);
+   if (svr->fd < 0) goto error;
+   if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+   if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_BROADCAST)
+     {
+        if (setsockopt(svr->fd, SOL_SOCKET, SO_BROADCAST,
+                       (const void *)&broadcast,
+                       sizeof(broadcast)) < 0)
+          {
+             goto error;
+          }
+     }
+   if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR,
+                  (const void *)&curstate, sizeof(curstate)) < 0)
+     goto error;
+
+   if (connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0)
+     goto error;
+
+   svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE,
+                                               _ecore_con_cl_udp_handler, svr, NULL, NULL);
+
+   if (!svr->fd_handler)
+     {
+        memerr = "Memory allocation failure";
+        goto error;
+     }
+
+   if ((!svr->ecs) || (svr->ecs->lookup))
+     svr->ip = eina_stringshare_add(net_info->ip);
 
    return;
 
-   error:
-   kill_server(svr);
+error:
+   if (errno || memerr) ecore_con_event_server_error(svr, memerr ?: strerror(errno));
+   ecore_con_ssl_server_shutdown(svr);
+   _ecore_con_server_kill(svr);
 }
 
-static int
+static Ecore_Con_State
 svr_try_connect_plain(Ecore_Con_Server *svr)
 {
+   int res;
    int so_err = 0;
-   unsigned int size = sizeof(int);
+   socklen_t size = sizeof(int);
+
+   res = getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, (void *)&so_err, &size);
+#ifdef _WIN32
+   if (res == SOCKET_ERROR)
+     so_err = WSAGetLastError();
+
+   if ((so_err == WSAEINPROGRESS) && !svr->delete_me)
+     return ECORE_CON_INPROGRESS;
 
-   if (getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, &so_err, &size) < 0)
-     so_err = -1;
+#else
+   if (res < 0)
+     so_err = errno;
+
+   if ((so_err == EINPROGRESS) && !svr->delete_me)
+     return ECORE_CON_INPROGRESS;
+
+#endif
 
-   if (so_err != 0)
+   if (so_err)
      {
-       /* we lost our server! */
-       kill_server(svr);
+        /* we lost our server! */
+        ecore_con_event_server_error(svr, strerror(so_err));
+        ERR("Connection lost: %s", strerror(so_err));
+        _ecore_con_server_kill(svr);
+        return ECORE_CON_DISCONNECTED;
      }
+
+   if ((!svr->delete_me) && (!svr->handshaking) && svr->connecting)
+     {
+         if (svr->ecs)
+           {
+              if (ecore_con_socks_svr_init(svr))
+                return ECORE_CON_INPROGRESS;
+           }
+         else
+           ecore_con_event_server_add(svr);
+     }
+
+   if (svr->fd_handler && (!svr->buf))
+     ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+
+   if (!svr->delete_me)
+     return ECORE_CON_CONNECTED;
    else
+     return ECORE_CON_DISCONNECTED;
+}
+
+static const char *
+_ecore_con_pretty_ip(struct sockaddr *client_addr)
+{
+#ifndef HAVE_IPV6
+   char ipbuf[INET_ADDRSTRLEN + 1];
+#else
+   char ipbuf[INET6_ADDRSTRLEN + 1];
+#endif
+   int family = client_addr->sa_family;
+   void *src;
+
+   switch(family)
+     {
+       case AF_INET:
+          src = &(((struct sockaddr_in *)client_addr)->sin_addr);
+          break;
+#ifdef HAVE_IPV6
+       case AF_INET6:
+          src = &(((struct sockaddr_in6 *)client_addr)->sin6_addr);
+
+          if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)src))
+            {
+               family = AF_INET;
+               src = (char*)src + 12;
+            }
+          break;
+#endif
+       default:
+          return eina_stringshare_add("0.0.0.0");
+    }
+
+   if (!inet_ntop(family, src, ipbuf, sizeof(ipbuf)))
+     return eina_stringshare_add("0.0.0.0");
+
+   ipbuf[sizeof(ipbuf) - 1] = 0;
+   return eina_stringshare_add(ipbuf);
+}
+
+static Eina_Bool
+_ecore_con_svr_tcp_handler(void                        *data,
+                           Ecore_Fd_Handler *fd_handler __UNUSED__)
+{
+   Ecore_Con_Server *svr;
+   Ecore_Con_Client *cl = NULL;
+   unsigned char client_addr[256];
+   unsigned int client_addr_len;
+   const char *clerr = NULL;
+
+   svr = data;
+   if (svr->delete_me)
+     return ECORE_CALLBACK_RENEW;
+
+   if ((svr->client_limit >= 0) && (!svr->reject_excess_clients) &&
+       (svr->client_count >= (unsigned int)svr->client_limit))
+     return ECORE_CALLBACK_RENEW;
+
+   /* a new client */
+
+   cl = calloc(1, sizeof(Ecore_Con_Client));
+   if (!cl)
+     {
+        ecore_con_event_server_error(svr, "Memory allocation failure when attempting to add a new client");
+        return ECORE_CALLBACK_RENEW;
+     }
+   cl->host_server = svr;
+
+   client_addr_len = sizeof(client_addr);
+   memset(&client_addr, 0, client_addr_len);
+   cl->fd = accept(svr->fd, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr_len);
+   if (cl->fd < 0) goto error;
+   if ((svr->client_limit >= 0) && (svr->reject_excess_clients) &&
+       (svr->client_count >= (unsigned int)svr->client_limit))
      {
-       if (!svr->delete_me)
-         {
-            /* we got our server! */
-            Ecore_Con_Event_Server_Add *e;
+        clerr = "Maximum client limit reached";
+        goto error;
+     }
+
+   if (fcntl(cl->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+   if (fcntl(cl->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+   cl->fd_handler = ecore_main_fd_handler_add(cl->fd, ECORE_FD_READ,
+                                              _ecore_con_svr_cl_handler, cl, NULL, NULL);
+   if (!cl->fd_handler) goto error;
+   ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
+
+   if ((!svr->upgrade) && (svr->type & ECORE_CON_SSL))
+     {
+        cl->handshaking = EINA_TRUE;
+        cl->ssl_state = ECORE_CON_SSL_STATE_INIT;
+        if (ecore_con_ssl_client_init(cl))
+          goto error;
+     }
 
-            svr->connecting = 0;
-            e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
-            if (e)
-              {
-                 svr->event_count++;
-                 e->server = svr;
-                 ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
-                                 _ecore_con_event_server_add_free, NULL);
-              }
-         }
-       if (svr->fd_handler)
-         {
-            if (!svr->write_buf)
-              ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
-         }
+   cl->client_addr = malloc(client_addr_len);
+   if (!cl->client_addr)
+     {
+        clerr = "Memory allocation failure when attempting to add a new client";
+        goto error;
      }
-   return (!svr->dead);
+   cl->client_addr_len = client_addr_len;
+   memcpy(cl->client_addr, &client_addr, client_addr_len);
+
+   svr->clients = eina_list_append(svr->clients, cl);
+   svr->client_count++;
+
+   if ((!cl->delete_me) && (!cl->handshaking))
+     ecore_con_event_client_add(cl);
+
+   return ECORE_CALLBACK_RENEW;
+
+error:
+   if (cl->fd_handler) ecore_main_fd_handler_del(cl->fd_handler);
+   if (cl->fd >= 0) close(cl->fd);
+   {
+      Ecore_Event *ev;
+
+      EINA_LIST_FREE(cl->event_count, ev)
+        {
+           svr->event_count = eina_list_remove(svr->event_count, ev);
+           ecore_event_del(ev);
+        }
+   }
+   free(cl);
+   if (clerr || errno) ecore_con_event_server_error(svr, clerr ?: strerror(errno));
+   return ECORE_CALLBACK_RENEW;
 }
 
-/* returns 1 on success, 0 on failure */
-static int svr_try_connect(Ecore_Con_Server *svr)
+static void
+_ecore_con_cl_read(Ecore_Con_Server *svr)
 {
-#if USE_OPENSSL
-   if (!svr->ssl)
+   int num = 0;
+   Eina_Bool lost_server = EINA_TRUE;
+   unsigned char buf[READBUFSIZ];
+
+   DBG("svr=%p", svr);
+
+   /* only possible with non-ssl connections */
+   if (svr->connecting && (svr_try_connect_plain(svr) != ECORE_CON_CONNECTED))
+      return;
+
+   if (svr->handshaking && (!svr->ecs_state))
      {
-#endif
-       return svr_try_connect_plain(svr);
-#if USE_OPENSSL
+        DBG("Continuing ssl handshake");
+        if (!ecore_con_ssl_server_init(svr))
+           lost_server = EINA_FALSE;
+        _ecore_con_server_timer_update(svr);
+     }
+
+   if (svr->ecs_state || !(svr->type & ECORE_CON_SSL))
+     {
+        errno = 0;
+        num = read(svr->fd, buf, sizeof(buf));
+        /* 0 is not a valid return value for a tcp socket */
+        if ((num > 0) || ((num < 0) && (errno == EAGAIN)))
+           lost_server = EINA_FALSE;
+        else if (num < 0)
+          ecore_con_event_server_error(svr, strerror(errno));
      }
    else
-     switch (svr_try_connect_ssl(svr)) {
-      case 1:
-       return svr_try_connect_plain(svr);
-      case -1:
-       kill_server(svr);
-       return 0;
-      default:
-       return 0;
+     {
+        num = ecore_con_ssl_server_read(svr, buf, sizeof(buf));
+        /* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
+        if (num >= 0)
+           lost_server = EINA_FALSE;
      }
+
+   if ((!svr->delete_me) && (num > 0))
+     {
+        if (svr->ecs_state)
+          ecore_con_socks_read(svr, buf, num);
+        else
+          ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
+     }
+
+   if (lost_server)
+      _ecore_con_server_kill(svr);
+}
+
+static Eina_Bool
+_ecore_con_cl_handler(void             *data,
+                      Ecore_Fd_Handler *fd_handler)
+{
+   Ecore_Con_Server *svr;
+   Eina_Bool want_read, want_write;
+
+   svr = data;
+   if (svr->delete_me)
+     return ECORE_CALLBACK_RENEW;
+
+   if (svr->delete_me)
+     return ECORE_CALLBACK_RENEW;
+
+   want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ);
+   want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE);
+
+   if ((!svr->ecs_state) && svr->handshaking && (want_read || want_write))
+     {
+        DBG("Continuing ssl handshake: preparing to %s...", want_read ? "read" : "write");
+#ifdef ISCOMFITOR
+        if (want_read)
+          {
+             char buf[READBUFSIZ];
+             ssize_t len;
+             len = recv(svr->fd, buf, sizeof(buf), MSG_DONTWAIT | MSG_PEEK);
+             DBG("%zu bytes in buffer", len);
+          }
 #endif
+        if (ecore_con_ssl_server_init(svr))
+          {
+             ERR("ssl handshaking failed!");
+             svr->handshaking = EINA_FALSE;
+          }
+        else if (!svr->ssl_state)
+          ecore_con_event_server_add(svr);
+        return ECORE_CALLBACK_RENEW;
+     }
+   if (svr->ecs && svr->ecs_state && (svr->ecs_state < ECORE_CON_PROXY_STATE_READ) && (!svr->ecs_buf))
+     {
+        if (svr->ecs_state < ECORE_CON_PROXY_STATE_INIT)
+          {
+             INF("PROXY STATE++");
+             svr->ecs_state++;
+          }
+        if (ecore_con_socks_svr_init(svr)) return ECORE_CALLBACK_RENEW;
+     }
+   if (want_read)
+     _ecore_con_cl_read(svr);
+   else if (want_write) /* only possible with non-ssl connections */
+     {
+        if (svr->connecting && (!svr_try_connect_plain(svr)) && (!svr->ecs_state))
+          return ECORE_CALLBACK_RENEW;
+
+        _ecore_con_server_flush(svr);
+     }
+
+   return ECORE_CALLBACK_RENEW;
 }
 
+static Eina_Bool
+_ecore_con_cl_udp_handler(void             *data,
+                          Ecore_Fd_Handler *fd_handler)
+{
+   unsigned char buf[READBUFSIZ];
+   int num;
+   Ecore_Con_Server *svr;
+   Eina_Bool want_read, want_write;
+
+   want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ);
+   want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE);
+
+   svr = data;
+   if (svr->delete_me || ((!want_read) && (!want_write)))
+     return ECORE_CALLBACK_RENEW;
+
+   if (want_write)
+     {
+        _ecore_con_server_flush(svr);
+        return ECORE_CALLBACK_RENEW;
+     }
+
+   num = read(svr->fd, buf, READBUFSIZ);
+
+   if ((!svr->delete_me) && (num > 0))
+     ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
+
+   if (num < 0 && (errno != EAGAIN) && (errno != EINTR))
+     {
+        ecore_con_event_server_error(svr, strerror(errno));
+        _ecore_con_server_kill(svr);
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
 
-static int
-_ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
+static Eina_Bool
+_ecore_con_svr_udp_handler(void             *data,
+                           Ecore_Fd_Handler *fd_handler)
 {
-   Ecore_Con_Server   *svr;
-#if USE_OPENSSL
-   int ssl_err = SSL_ERROR_NONE;
-#endif
+   unsigned char buf[READBUFSIZ];
+   unsigned char client_addr[256];
+   socklen_t client_addr_len = sizeof(client_addr);
+   int num;
+   Ecore_Con_Server *svr;
+   Ecore_Con_Client *cl = NULL;
 
    svr = data;
-   if (svr->dead) return 1;
-   if (svr->delete_me) return 1;
-   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
+
+   if (svr->delete_me)
+     return ECORE_CALLBACK_RENEW;
+
+   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
      {
-       unsigned char *inbuf = NULL;
-       int            inbuf_num = 0;
+        _ecore_con_client_flush(cl);
+        return ECORE_CALLBACK_RENEW;
+     }
 
-       if (svr->connecting && !svr_try_connect(svr))
-          return 1;
+   if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
+     return ECORE_CALLBACK_RENEW;
 
-       for (;;)
-         {
-            int num, lost_server;
-            char buf[READBUFSIZ];
+#ifdef _WIN32
+   num = fcntl(svr->fd, F_SETFL, O_NONBLOCK);
+   if (num >= 0)
+     num = recvfrom(svr->fd, (char *)buf, sizeof(buf), 0,
+                (struct sockaddr *)&client_addr,
+                &client_addr_len);
 
-            lost_server = 0;
-#if USE_OPENSSL
-            if (!svr->ssl)
-              {
-#endif
-                 if ((num = read(svr->fd, buf, READBUFSIZ)) < 1)
-                   {
-                      lost_server = ((errno == EIO) ||
-                                     (errno == EBADF) ||
-                                     (errno == EPIPE) ||
-                                     (errno == EINVAL) ||
-                                     (errno == ENOSPC) ||
-                                     (num == 0));
-                      /* is num == 0 is right - when the server closes us
-                       * off we will get this (as this is called when select
-                       * tells us there is data to read!)
-                       */
-                   }
-#if USE_OPENSSL
-              }
-            else
-              {
-                 num = SSL_read(svr->ssl, buf, READBUFSIZ);
-                 if (num < 1)
-                   {
-                      ssl_err = SSL_get_error(svr->ssl, num);
-                      lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
-                      if (ssl_err == SSL_ERROR_SYSCALL)
-                        {
-                           if (num == 0) lost_server = 1;
-                           else
-                             {
-                                lost_server = ((errno == EIO) ||
-                                               (errno == EBADF) ||
-                                               (errno == EPIPE) ||
-                                               (errno == EINVAL) ||
-                                               (errno == ENOSPC) ||
-                                               (errno == ECONNRESET));
-                             }
-                        }
-                   }
-                 else
-                   ssl_err = SSL_ERROR_NONE;
-              }
-#endif
-            if (num < 1)
-              {
-                 if (inbuf)
-                   {
-                      if (!svr->delete_me)
-                        {
-                           Ecore_Con_Event_Server_Data *e;
-
-                           e = calloc(1, sizeof(Ecore_Con_Event_Server_Data));
-                           if (e)
-                             {
-                                svr->event_count++;
-                                e->server = svr;
-                                e->data = inbuf;
-                                e->size = inbuf_num;
-                                ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
-                                                _ecore_con_event_server_data_free,
-                                                NULL);
-                             }
-                        }
-                   }
-                 if (lost_server)
-                   {
-                      /* we lost our server! */
-                      kill_server(svr);
-                      return 1;
-                   }
-                 break;
-              }
-            else
-              {
-                 inbuf = realloc(inbuf, inbuf_num + num);
-                 memcpy(inbuf + inbuf_num, buf, num);
-                 inbuf_num += num;
-              }
-         }
-
-#if USE_OPENSSL
-       if (svr->fd_handler)
-         {
-            if (svr->ssl && ssl_err == SSL_ERROR_WANT_READ)
-              ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
-            else if (svr->ssl && ssl_err == SSL_ERROR_WANT_WRITE)
-              ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
-         }
+#else
+   num = recvfrom(svr->fd, buf, sizeof(buf), MSG_DONTWAIT,
+              (struct sockaddr *)&client_addr,
+              &client_addr_len);
 #endif
+
+   if (num < 0 && (errno != EAGAIN) && (errno != EINTR))
+     {
+        ecore_con_event_server_error(svr, strerror(errno));
+        if (!svr->delete_me)
+          ecore_con_event_client_del(NULL);
+        _ecore_con_server_kill(svr);
+        return ECORE_CALLBACK_CANCEL;
      }
-   else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
+
+
+/* Create a new client for use in the client data event */
+   cl = calloc(1, sizeof(Ecore_Con_Client));
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cl, ECORE_CALLBACK_RENEW);
+
+   cl->host_server = svr;
+   cl->client_addr = malloc(client_addr_len);
+   if (!cl->client_addr)
+     {
+        free(cl);
+        return ECORE_CALLBACK_RENEW;
+     }
+   cl->client_addr_len = client_addr_len;
+
+   memcpy(cl->client_addr, &client_addr, client_addr_len);
+   ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
+   svr->clients = eina_list_append(svr->clients, cl);
+   svr->client_count++;
+
+   ecore_con_event_client_add(cl);
+   ecore_con_event_client_data(cl, buf, num, EINA_TRUE);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_ecore_con_svr_cl_read(Ecore_Con_Client *cl)
+{
+   int num = 0;
+   Eina_Bool lost_client = EINA_TRUE;
+   unsigned char buf[READBUFSIZ];
+
+   DBG("cl=%p", cl);
+
+   if (cl->handshaking)
+     {
+        /* add an extra handshake attempt just before read, even though
+         * read also attempts to handshake, to try to finish sooner
+         */
+        if (ecore_con_ssl_client_init(cl))
+          lost_client = EINA_FALSE;
+
+        _ecore_con_cl_timer_update(cl);
+     }
+
+   if (!(cl->host_server->type & ECORE_CON_SSL) && (!cl->upgrade))
+     {
+        num = read(cl->fd, buf, sizeof(buf));
+        /* 0 is not a valid return value for a tcp socket */
+        if ((num > 0) || ((num < 0) && ((errno == EAGAIN) || (errno == EINTR))))
+          lost_client = EINA_FALSE;
+        else if (num < 0)
+          ecore_con_event_client_error(cl, strerror(errno));
+     }
+   else
      {
-       if (svr->connecting && !svr_try_connect (svr))
-          return 1;
-       _ecore_con_server_flush(svr);
+        num = ecore_con_ssl_client_read(cl, buf, sizeof(buf));
+        /* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
+        if (num >= 0)
+          lost_client = EINA_FALSE;
      }
 
-   return 1;
+   if ((!cl->delete_me) && (num > 0))
+     ecore_con_event_client_data(cl, buf, num, EINA_TRUE);
+
+   if (lost_client) _ecore_con_client_kill(cl);
 }
 
-static int
-_ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
+static Eina_Bool
+_ecore_con_svr_cl_handler(void             *data,
+                          Ecore_Fd_Handler *fd_handler)
 {
-   Ecore_Con_Client   *cl;
+   Ecore_Con_Client *cl;
 
    cl = data;
-   if (cl->dead) return 1;
-   if (cl->delete_me) return 1;
-   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
-     {
-       unsigned char *inbuf = NULL;
-       int            inbuf_num = 0;
-
-       for (;;)
-         {
-            char buf[65536];
-            int num;
-
-            errno = 0;
-            num = read(cl->fd, buf, 65536);
-            if (num < 1)
-              {
-                 if (inbuf)
-                   {
-                      if (!cl->delete_me)
-                        {
-                           Ecore_Con_Event_Client_Data *e;
-
-                           e = calloc(1, sizeof(Ecore_Con_Event_Client_Data));
-                           if (e)
-                             {
-                                cl->event_count++;
-                                e->client = cl;
-                                e->data = inbuf;
-                                e->size = inbuf_num;
-                                ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
-                                                _ecore_con_event_client_data_free,
-                                                NULL);
-                             }
-                        }
-                   }
-                 if ((errno == EIO) ||  (errno == EBADF) ||
-                     (errno == EPIPE) || (errno == EINVAL) ||
-                     (errno == ENOSPC) || (num == 0)/* is num == 0 right? */)
-                   {
-                      if (!cl->delete_me)
-                        {
-                           /* we lost our client! */
-                           Ecore_Con_Event_Client_Del *e;
-
-                           e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
-                           if (e)
-                             {
-                                cl->event_count++;
-                                e->client = cl;
-                                ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
-                                                _ecore_con_event_client_del_free,
-                                                NULL);
-                             }
-                        }
-                      cl->dead = 1;
-                      if (cl->fd_handler)
-                        ecore_main_fd_handler_del(cl->fd_handler);
-                      cl->fd_handler = NULL;
-                   }
-                 break;
-              }
-            else
-              {
-                 inbuf = realloc(inbuf, inbuf_num + num);
-                 memcpy(inbuf + inbuf_num, buf, num);
-                 inbuf_num += num;
-              }
-         }
+   if (cl->delete_me)
+     return ECORE_CALLBACK_RENEW;
+
+   if (cl->handshaking && ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ | ECORE_FD_WRITE))
+     {
+        if (ecore_con_ssl_client_init(cl))
+          {
+             ERR("ssl handshaking failed!");
+             _ecore_con_client_kill(cl);
+             return ECORE_CALLBACK_RENEW;
+          }
+        else if (!cl->ssl_state)
+          ecore_con_event_client_add(cl);
      }
+   else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
+     _ecore_con_svr_cl_read(cl);
+
    else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
      _ecore_con_client_flush(cl);
-   return 1;
+
+   return ECORE_CALLBACK_RENEW;
 }
 
 static void
 _ecore_con_server_flush(Ecore_Con_Server *svr)
 {
-   int count, num, lost_server = 0;
-#if USE_OPENSSL
-   int ssl_err = SSL_ERROR_NONE;
+   int count, num;
+   size_t buf_len, buf_offset;
+   const unsigned char *buf;
+
+   DBG("(svr=%p,buf=%p)", svr, svr->buf);
+#ifdef _WIN32
+   if (ecore_con_local_win32_server_flush(svr))
+     return;
 #endif
 
-   if (!svr->write_buf) return;
+   if ((!svr->buf) && (!svr->ecs_buf) && svr->fd_handler)
+     {
+        ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+        return;
+     }
+
+   buf = svr->buf ? eina_binbuf_string_get(svr->buf) : eina_binbuf_string_get(svr->ecs_buf);
+   buf_len = svr->buf ? eina_binbuf_length_get(svr->buf) : eina_binbuf_length_get(svr->ecs_buf);
+   buf_offset = svr->buf ? svr->write_buf_offset : svr->ecs_buf_offset;
+   num = buf_len - buf_offset;
 
    /* check whether we need to write anything at all.
-       * we must not write zero bytes with SSL_write() since it
-       * causes undefined behaviour
-       */
-   if (svr->write_buf_size == svr->write_buf_offset)
-      return;
-
-   num = svr->write_buf_size - svr->write_buf_offset;
-#if USE_OPENSSL
-   if (!svr->ssl)
+    * we must not write zero bytes with SSL_write() since it
+    * causes undefined behaviour
+    */
+   /* we thank Tommy[D] for needing to check negative buffer sizes
+    * here because his system is amazing.
+    */
+   if (num <= 0) return;
+
+   if ((!svr->ecs_state) && svr->handshaking)
      {
-#endif
-       count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num);
-       if (count < 1)
-         lost_server = (errno == EIO || errno == EBADF ||
-                        errno == EPIPE || errno == EINVAL || errno == ENOSPC);
-#if USE_OPENSSL
+        DBG("Continuing ssl handshake");
+        if (ecore_con_ssl_server_init(svr))
+          _ecore_con_server_kill(svr);
+        _ecore_con_server_timer_update(svr);
+        return;
      }
+
+   if (svr->ecs_state || (!(svr->type & ECORE_CON_SSL)))
+     count = write(svr->fd, buf + buf_offset, num);
    else
+     count = ecore_con_ssl_server_write(svr, buf + buf_offset, num);
+
+   if (count < 0)
      {
-       count = SSL_write(svr->ssl, svr->write_buf + svr->write_buf_offset, num);
+         if ((errno != EAGAIN) && (errno != EINTR))
+           {
+              ecore_con_event_server_error(svr, strerror(errno));
+              _ecore_con_server_kill(svr);
+           }
+         return;
+     }
 
-       if (count < 1)
-         {
-            ssl_err = SSL_get_error(svr->ssl, count);
-            lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
-         }
+   if (count && (!svr->ecs_state)) ecore_con_event_server_write(svr, count);
+   if (svr->ecs_buf)
+     buf_offset = svr->ecs_buf_offset += count;
+   else
+     buf_offset = svr->write_buf_offset += count;
+   if (buf_offset >= buf_len)
+     {
+        if (svr->ecs_buf)
+          {
+             svr->ecs_buf_offset = 0;
+             eina_binbuf_free(svr->ecs_buf);
+             svr->ecs_buf = NULL;
+             INF("PROXY STATE++");
+             svr->ecs_state++;
+          }
+        else
+          {
+             svr->write_buf_offset = 0;
+             eina_binbuf_free(svr->buf);
+             svr->buf = NULL;
+#ifdef TCP_CORK
+             if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK)
+               {
+                  int state = 0;
+                  if (setsockopt(svr->fd, IPPROTO_TCP, TCP_CORK, (char *)&state, sizeof(int)) < 0)
+                    /* realistically this isn't anything serious so we can just log and continue */
+                    ERR("uncorking failed! %s", strerror(errno));
+               }
+#endif
+          }
+        if (svr->fd_handler)
+          ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
      }
+   else if ((count < num) && svr->fd_handler)
+     ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+}
+
+static void
+_ecore_con_client_flush(Ecore_Con_Client *cl)
+{
+   int num = 0, count = 0;
+
+#ifdef _WIN32
+   if (ecore_con_local_win32_client_flush(cl))
+     return;
 #endif
 
-   if (lost_server)
+   if (!cl->buf && cl->fd_handler)
      {
-       /* we lost our server! */
-       kill_server(svr);
-       return;
+        ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+        return;
      }
 
-   if (count < 1)
+   if (cl->handshaking)
      {
-#if USE_OPENSSL
-       if (svr->fd_handler)
-         {
-            if (svr->ssl && ssl_err == SSL_ERROR_WANT_READ)
-              ecore_main_fd_handler_active_set(svr->fd_handler,
-                                               ECORE_FD_READ);
-            else if (svr->ssl && ssl_err == SSL_ERROR_WANT_WRITE)
-              ecore_main_fd_handler_active_set(svr->fd_handler,
-                                               ECORE_FD_WRITE);
-         }
-#endif
-       return;
+        if (ecore_con_ssl_client_init(cl))
+          count = -1;
+
+        _ecore_con_cl_timer_update(cl);
      }
 
-   svr->write_buf_offset += count;
-   if (svr->write_buf_offset >= svr->write_buf_size)
+   if (!count)
      {
-       svr->write_buf_size = 0;
-       svr->write_buf_offset = 0;
-       free(svr->write_buf);
-       svr->write_buf = NULL;
-       if (svr->fd_handler)
-         ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+        if (!cl->buf) return;
+        num = eina_binbuf_length_get(cl->buf) - cl->buf_offset;
+        if (num <= 0) return;
+        if (!(cl->host_server->type & ECORE_CON_SSL) && (!cl->upgrade))
+          count = write(cl->fd, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num);
+        else
+          count = ecore_con_ssl_client_write(cl, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num);
      }
-}
 
-static void
-_ecore_con_client_flush(Ecore_Con_Client *cl)
-{
-   int count, num;
+   if (count < 0)
+     {
+        if ((errno != EAGAIN) && (errno != EINTR) && (!cl->delete_me))
+          {
+              ecore_con_event_client_error(cl, strerror(errno));
+              _ecore_con_client_kill(cl);
+          }
+
+        return;
+     }
 
-   if (!cl->buf) return;
-   num = cl->buf_size - cl->buf_offset;
-   count = write(cl->fd, cl->buf + cl->buf_offset, num);
-   if (count < 1)
-     {
-       if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) ||
-           (errno == EINVAL) || (errno == ENOSPC))
-         {
-            if (!cl->delete_me)
-              {
-                 /* we lost our client! */
-                 Ecore_Con_Event_Client_Del *e;
-
-                 e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
-                 if (e)
-                   {
-                      cl->event_count++;
-                      e->client = cl;
-                      ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
-                                      _ecore_con_event_client_del_free, NULL);
-                   }
-                 cl->dead = 1;
-                 if (cl->fd_handler)
-                   ecore_main_fd_handler_del(cl->fd_handler);
-                 cl->fd_handler = NULL;
-              }
-         }
-       return;
-     }
-   cl->buf_offset += count;
-   if (cl->buf_offset >= cl->buf_size)
-     {
-       cl->buf_size = 0;
-       cl->buf_offset = 0;
-       free(cl->buf);
-       cl->buf = NULL;
-       if (cl->fd_handler)
-         ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+   if (count) ecore_con_event_client_write(cl, count);
+   cl->buf_offset += count, num -= count;
+   if (cl->buf_offset >= eina_binbuf_length_get(cl->buf))
+     {
+        cl->buf_offset = 0;
+        eina_binbuf_free(cl->buf);
+        cl->buf = NULL;
+#ifdef TCP_CORK
+        if ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_CORK)
+          {
+             int state = 0;
+             if (setsockopt(cl->fd, IPPROTO_TCP, TCP_CORK, (char *)&state, sizeof(int)) < 0)
+               /* realistically this isn't anything serious so we can just log and continue */
+               ERR("uncorking failed! %s", strerror(errno));
+          }
+#endif
+        if (cl->fd_handler)
+          ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
      }
+   else if (cl->fd_handler && (num >= 0))
+     ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
 }
 
 static void
-_ecore_con_event_client_add_free(void *data __UNUSED__, void *ev)
+_ecore_con_event_client_add_free(Ecore_Con_Server *svr,
+                                 void      *ev)
 {
    Ecore_Con_Event_Client_Add *e;
 
    e = ev;
-   e->client->event_count--;
-   if ((e->client->event_count == 0) && (e->client->delete_me))
-     ecore_con_client_del(e->client);
-   free(e);
+   if (e->client)
+     {
+        Eina_Bool svrfreed = EINA_FALSE;
+        
+        e->client->event_count = eina_list_remove(e->client->event_count, e);
+        if (e->client->host_server)
+          {
+             e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
+             if ((!svr->event_count) && (svr->delete_me))
+               {
+                  _ecore_con_server_free(svr);
+                  svrfreed = EINA_TRUE;
+               }
+          }
+        if (!svrfreed)
+          {
+             if ((!e->client->event_count) && (e->client->delete_me))
+               ecore_con_client_del(e->client);
+          }
+     }
+
+   ecore_con_event_client_add_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
 }
 
 static void
-_ecore_con_event_client_del_free(void *data __UNUSED__, void *ev)
+_ecore_con_event_client_del_free(Ecore_Con_Server *svr,
+                                 void      *ev)
 {
    Ecore_Con_Event_Client_Del *e;
 
    e = ev;
-   e->client->event_count--;
-   if ((e->client->event_count == 0) && (e->client->delete_me))
-     ecore_con_client_del(e->client);
-   free(e);
+   if (e->client)
+     {
+        Eina_Bool svrfreed = EINA_FALSE;
+        
+        e->client->event_count = eina_list_remove(e->client->event_count, e);
+        if (e->client->host_server)
+          {
+             e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
+             if ((!svr->event_count) && (svr->delete_me))
+               {
+                  _ecore_con_server_free(svr);
+                  svrfreed = EINA_TRUE;
+               }
+          }
+        if (!svrfreed)
+          {
+             if (!e->client->event_count)
+               _ecore_con_client_free(e->client);
+          }
+     }
+   ecore_con_event_client_del_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
 }
 
 static void
-_ecore_con_event_client_data_free(void *data __UNUSED__, void *ev)
+_ecore_con_event_client_write_free(Ecore_Con_Server *svr,
+                                   Ecore_Con_Event_Client_Write *e)
+{
+   if (e->client)
+     {
+        Eina_Bool svrfreed = EINA_FALSE;
+        
+        e->client->event_count = eina_list_remove(e->client->event_count, e);
+        if (e->client->host_server)
+          {
+             e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
+             if ((!svr->event_count) && (svr->delete_me))
+               {
+                  _ecore_con_server_free(svr);
+                  svrfreed = EINA_TRUE;
+               }
+          }
+        if (!svrfreed)
+          {
+             if (((!e->client->event_count) && (e->client->delete_me)) ||
+                 ((e->client->host_server &&
+                   ((e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP ||
+                       (e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST))))
+               ecore_con_client_del(e->client);
+          }
+     }
+   ecore_con_event_client_write_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
+}
+
+static void
+_ecore_con_event_client_data_free(Ecore_Con_Server *svr,
+                                  void      *ev)
 {
    Ecore_Con_Event_Client_Data *e;
 
    e = ev;
-   e->client->event_count--;
-   if (e->data) free(e->data);
-   if ((e->client->event_count == 0) && (e->client->delete_me))
-     ecore_con_client_del(e->client);
-   free(e);
+   if (e->client)
+     {
+        Eina_Bool svrfreed = EINA_FALSE;
+        
+        e->client->event_count = eina_list_remove(e->client->event_count, e);
+        if (e->client->host_server)
+          {
+             e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
+          }
+        if ((!svr->event_count) && (svr->delete_me))
+          {
+             _ecore_con_server_free(svr);
+             svrfreed = EINA_TRUE;
+          }
+        if (!svrfreed)
+          {
+             if (((!e->client->event_count) && (e->client->delete_me)) ||
+                 ((e->client->host_server &&
+                   ((e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP ||
+                       (e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST))))
+               ecore_con_client_del(e->client);
+          }
+     }
+   free(e->data);
+   ecore_con_event_client_data_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
 }
 
 static void
-_ecore_con_event_server_add_free(void *data __UNUSED__, void *ev)
+_ecore_con_event_server_add_free(void *data __UNUSED__,
+                                 void      *ev)
 {
    Ecore_Con_Event_Server_Add *e;
 
    e = ev;
-   e->server->event_count--;
-   if ((e->server->event_count == 0) && (e->server->delete_me))
-     ecore_con_server_del(e->server);
-   free(e);
+   if (e->server)
+     {
+        e->server->event_count = eina_list_remove(e->server->event_count, ev);
+        if ((!e->server->event_count) && (e->server->delete_me))
+          _ecore_con_server_free(e->server);
+     }
+   ecore_con_event_server_add_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
 }
 
 static void
-_ecore_con_event_server_del_free(void *data __UNUSED__, void *ev)
+_ecore_con_event_server_del_free(void *data __UNUSED__,
+                                 void      *ev)
 {
    Ecore_Con_Event_Server_Del *e;
 
    e = ev;
-   e->server->event_count--;
-   if ((e->server->event_count == 0) && (e->server->delete_me))
-     ecore_con_server_del(e->server);
-   free(e);
+   if (e->server)
+     {
+        e->server->event_count = eina_list_remove(e->server->event_count, ev);
+        if (!e->server->event_count)
+          _ecore_con_server_free(e->server);
+     }
+   ecore_con_event_server_del_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
+}
+
+static void
+_ecore_con_event_server_write_free(void *data __UNUSED__,
+                                   Ecore_Con_Event_Server_Write *e)
+{
+   if (e->server)
+     {
+        e->server->event_count = eina_list_remove(e->server->event_count, e);
+        if ((!e->server->event_count) && (e->server->delete_me))
+          _ecore_con_server_free(e->server);
+     }
+
+   ecore_con_event_server_write_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
 }
 
 static void
-_ecore_con_event_server_data_free(void *data __UNUSED__, void *ev)
+_ecore_con_event_server_data_free(void *data __UNUSED__,
+                                  void      *ev)
 {
    Ecore_Con_Event_Server_Data *e;
 
    e = ev;
-   e->server->event_count--;
-   if (e->data) free(e->data);
-   if ((e->server->event_count == 0) && (e->server->delete_me))
-     ecore_con_server_del(e->server);
-   free(e);
+   if (e->server)
+     {
+        e->server->event_count = eina_list_remove(e->server->event_count, ev);
+        if ((!e->server->event_count) && (e->server->delete_me))
+          _ecore_con_server_free(e->server);
+     }
+
+   free(e->data);
+   ecore_con_event_server_data_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
+}
+
+
+static void
+_ecore_con_event_server_error_free(void *data __UNUSED__, Ecore_Con_Event_Server_Error *e)
+{
+   if (e->server)
+     {
+        e->server->event_count = eina_list_remove(e->server->event_count, e);
+        if ((!e->server->event_count) && (e->server->delete_me))
+          _ecore_con_server_free(e->server);
+     }
+   free(e->error);
+   ecore_con_event_server_error_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
 }
+
+static void
+_ecore_con_event_client_error_free(Ecore_Con_Server *svr, Ecore_Con_Event_Client_Error *e)
+{
+   if (e->client)
+     {
+        Eina_Bool svrfreed = EINA_FALSE;
+        
+        if (eina_list_data_find(svr->clients, e->client))
+          {
+             e->client->event_count = eina_list_remove(e->client->event_count, e);
+             if ((!e->client->event_count) && (e->client->delete_me))
+               {
+                  _ecore_con_client_free(e->client);
+                  svrfreed = EINA_TRUE;
+               }
+          }
+        svr->event_count = eina_list_remove(svr->event_count, e);
+        if (!svrfreed)
+          {
+             if ((!svr->event_count) && (svr->delete_me))
+               _ecore_con_server_free(svr);
+          }
+     }
+   free(e->error);
+   ecore_con_event_client_error_free(e);
+   _ecore_con_event_count--;
+   if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
+     ecore_con_mempool_shutdown();
+}
+
+static void
+_ecore_con_lookup_done(void           *data,
+                       Ecore_Con_Info *infos)
+{
+   Ecore_Con_Server *svr;
+   Ecore_Con_Lookup *lk;
+
+   svr = data;
+   lk = svr->data;
+
+   if (infos)
+     lk->done_cb(infos->info.ai_canonname, infos->ip,
+                 infos->info.ai_addr, infos->info.ai_addrlen,
+                 (void *)lk->data);
+   else
+     lk->done_cb(NULL, NULL, NULL, 0, (void *)lk->data);
+
+   free(svr->name);
+   free(lk);
+   free(svr);
+}
+
diff --git a/src/lib/ecore_con/ecore_con_alloc.c b/src/lib/ecore_con/ecore_con_alloc.c
new file mode 100644 (file)
index 0000000..324d47d
--- /dev/null
@@ -0,0 +1,101 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+#include "Ecore_Con.h"
+#include "ecore_con_private.h"
+
+typedef struct _Ecore_Con_Mempool Ecore_Con_Mempool;
+struct _Ecore_Con_Mempool
+{
+   const char *name;
+   Eina_Mempool *mp;
+   size_t size;
+};
+
+#define GENERIC_ALLOC_FREE(TYPE, Type)                                  \
+  Ecore_Con_Mempool Type##_mp = { #TYPE,  NULL, sizeof (TYPE) };        \
+                                                                        \
+  TYPE *                                                                \
+  Type##_alloc(void)                                                    \
+  {                                                                     \
+     return eina_mempool_malloc(Type##_mp.mp, sizeof (TYPE));           \
+  }                                                                     \
+                                                                        \
+  void                                                                  \
+  Type##_free(TYPE *e)                                                  \
+  {                                                                     \
+     eina_mempool_free(Type##_mp.mp, e);                                \
+  }
+
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Add, ecore_con_event_client_add);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Del, ecore_con_event_client_del);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Write, ecore_con_event_client_write);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Data, ecore_con_event_client_data);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Error, ecore_con_event_server_error);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Error, ecore_con_event_client_error);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Add, ecore_con_event_server_add);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Del, ecore_con_event_server_del);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Write, ecore_con_event_server_write);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Data, ecore_con_event_server_data);
+GENERIC_ALLOC_FREE(Ecore_Con_Event_Proxy_Bind, ecore_con_event_proxy_bind);
+
+static Ecore_Con_Mempool *mempool_array[] = {
+  &ecore_con_event_client_add_mp,
+  &ecore_con_event_client_del_mp,
+  &ecore_con_event_client_write_mp,
+  &ecore_con_event_client_data_mp,
+  &ecore_con_event_server_error_mp,
+  &ecore_con_event_client_error_mp,
+  &ecore_con_event_server_add_mp,
+  &ecore_con_event_server_del_mp,
+  &ecore_con_event_server_write_mp,
+  &ecore_con_event_server_data_mp,
+  &ecore_con_event_proxy_bind_mp
+};
+
+void
+ecore_con_mempool_init(void)
+{
+   const char *choice;
+   unsigned int i;
+
+   choice = getenv("EINA_MEMPOOL");
+   if (!choice || !choice[0])
+     choice = "chained_mempool";
+
+   for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
+     {
+     retry:
+        mempool_array[i]->mp = eina_mempool_add(choice, mempool_array[i]->name, NULL, mempool_array[i]->size, 16);
+        if (!mempool_array[i]->mp)
+          {
+             if (!(!strcmp(choice, "pass_through")))
+               {
+                  ERR("Falling back to pass through ! Previously tried '%s' mempool.", choice);
+                  choice = "pass_through";
+                  goto retry;
+               }
+             else
+               {
+                  ERR("Impossible to allocate mempool '%s' !", choice);
+                  return ;
+               }
+          }
+     }
+}
+
+void
+ecore_con_mempool_shutdown(void)
+{
+   unsigned int i;
+
+   for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
+     {
+        eina_mempool_del(mempool_array[i]->mp);
+        mempool_array[i]->mp = NULL;
+     }
+}
+
diff --git a/src/lib/ecore_con/ecore_con_ares.c b/src/lib/ecore_con/ecore_con_ares.c
new file mode 100644 (file)
index 0000000..5dfe70b
--- /dev/null
@@ -0,0 +1,628 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/*
+ * This version of ecore_con_info use c-ares to provide asynchronous dns lookup.
+ *
+ * Note: It doesn't fork nor does it use libc getaddrinfo.
+ * http://c-ares.haxx.se/docs.html
+ */
+
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#include <ares.h>
+
+#include "Ecore.h"
+#include "Ecore_Con.h"
+#include "ecore_con_private.h"
+
+typedef struct _Ecore_Con_FD    Ecore_Con_FD;
+typedef struct _Ecore_Con_CAres Ecore_Con_CAres;
+
+struct _Ecore_Con_FD
+{
+   Ecore_Fd_Handler *handler;
+   Ecore_Timer      *timer;
+   int               fd;
+};
+
+struct _Ecore_Con_CAres
+{
+   Ecore_Con_Server *svr;
+   Ecore_Con_Info_Cb done_cb;
+   void             *data;
+   struct addrinfo   hints;
+   Ecore_Con_Info   *result;
+
+   union {
+      struct in_addr  v4;
+#ifdef HAVE_IPV6
+      struct in6_addr v6;
+#endif
+   } addr;
+
+   Eina_Bool byaddr : 1;
+   Eina_Bool isv6 : 1;
+};
+
+static ares_channel info_channel;
+static int info_init = 0;
+static Eina_List *info_fds = NULL;
+
+static void _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
+                                          int              status,
+                                          int              timeouts,
+                                          char            *node,
+                                          char            *service);
+static void _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
+                                         int              status,
+                                         int              timeouts,
+                                         struct hostent  *hostent);
+static Eina_Bool _ecore_con_info_cares_fd_cb(Ecore_Con_FD     *ecf,
+                            Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_con_info_cares_timeout_cb(void *data);
+
+static void
+_ecore_con_info_cares_state_cb(void *data,
+                               ares_socket_t fd,
+                               int readable,
+                               int writable);
+static int
+_ecore_con_info_fds_search(const Ecore_Con_FD *fd1,
+                           const Ecore_Con_FD *fd2);
+
+int
+ecore_con_info_init(void)
+{
+   struct ares_options opts;
+
+   if (!info_init)
+     {
+        if (ares_library_init(ARES_LIB_INIT_ALL))
+          return 0;
+
+        opts.lookups = "fb"; /* hosts file then dns */
+        opts.sock_state_cb = _ecore_con_info_cares_state_cb;
+
+        if (ares_init_options(&info_channel, &opts,
+            ARES_OPT_LOOKUPS | ARES_OPT_SOCK_STATE_CB) != ARES_SUCCESS)
+          {
+             ares_library_cleanup();
+             return 0;
+          }
+     }
+
+   info_init++;
+   return info_init;
+}
+
+int
+ecore_con_info_shutdown(void)
+{
+   info_init--;
+   if (info_init == 0)
+     {
+        /* Cancel all ongoing request */
+         ares_cancel(info_channel);
+         ares_destroy(info_channel);
+
+         /* Shutdown ares */
+         ares_library_cleanup();
+     }
+
+   return info_init;
+}
+
+int
+ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
+                           Ecore_Con_Info_Cb done_cb,
+                           void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_STREAM;
+   hints.ai_flags = AI_CANONNAME;
+   hints.ai_protocol = IPPROTO_TCP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
+                          Ecore_Con_Info_Cb done_cb,
+                          void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_STREAM;
+   hints.ai_flags = AI_PASSIVE;
+   hints.ai_protocol = IPPROTO_TCP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_udp_connect(Ecore_Con_Server *svr,
+                           Ecore_Con_Info_Cb done_cb,
+                           void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = AI_CANONNAME;
+   hints.ai_protocol = IPPROTO_UDP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_udp_listen(Ecore_Con_Server *svr,
+                          Ecore_Con_Info_Cb done_cb,
+                          void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = AI_PASSIVE;
+   hints.ai_protocol = IPPROTO_UDP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
+                            Ecore_Con_Info_Cb done_cb,
+                            void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = 0;
+   hints.ai_protocol = IPPROTO_UDP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+static Eina_Bool
+_ecore_con_info_ares_getnameinfo(Ecore_Con_CAres *arg,
+                                 int              addrtype,
+                                 const char      *name,
+                                 struct sockaddr *addr,
+                                 int              addrlen)
+{
+   int length = 0;
+
+   if (name)
+     length = strlen(name) + 1;
+   else
+     length = 1;
+
+   arg->result = malloc(sizeof(Ecore_Con_Info) + length);
+   if (!arg->result)
+     return EINA_FALSE;
+
+   /* FIXME: What to do when hint is not set ? */
+   arg->result->info.ai_flags = arg->hints.ai_flags;
+   arg->result->info.ai_socktype = arg->hints.ai_socktype;
+   arg->result->info.ai_protocol = arg->hints.ai_protocol;
+
+   arg->result->info.ai_family = addrtype;
+   arg->result->info.ai_addrlen = addrlen;
+   arg->result->info.ai_addr = addr;
+   arg->result->info.ai_canonname = (char *)(arg->result + 1);
+
+   if (!name)
+     *arg->result->info.ai_canonname = '\0';
+   else
+     strcpy(arg->result->info.ai_canonname, name);
+
+   arg->result->info.ai_next = NULL;
+
+   ares_getnameinfo(
+     info_channel, addr, addrlen,
+     ARES_NI_NUMERICSERV | ARES_NI_NUMERICHOST |
+     ARES_NI_LOOKUPSERVICE | ARES_NI_LOOKUPHOST,
+     (ares_nameinfo_callback)_ecore_con_info_ares_nameinfo, arg);
+
+   return EINA_TRUE;
+}
+
+EAPI int
+ecore_con_info_get(Ecore_Con_Server *svr,
+                   Ecore_Con_Info_Cb done_cb,
+                   void             *data,
+                   struct addrinfo  *hints)
+{
+   Ecore_Con_CAres *cares;
+#ifdef HAVE_IPV6
+   int ai_family = AF_INET6;
+#else
+   int ai_family = AF_INET;
+#endif
+
+   cares = calloc(1, sizeof(Ecore_Con_CAres));
+   if (!cares)
+     return 0;
+
+   cares->svr = svr;
+   cares->done_cb = done_cb;
+   cares->data = data;
+
+   if (hints)
+     {
+        ai_family = hints->ai_family;
+        memcpy(&cares->hints, hints, sizeof(struct addrinfo));
+     }
+
+   if (inet_pton(AF_INET, svr->ecs ? svr->ecs->ip : svr->name, &cares->addr.v4) == 1)
+     {
+        cares->byaddr = EINA_TRUE;
+        cares->isv6 = EINA_FALSE;
+        ares_gethostbyaddr(info_channel, &cares->addr.v4,
+                           sizeof(cares->addr.v4),
+                           AF_INET,
+                           (ares_host_callback)_ecore_con_info_ares_host_cb,
+                           cares);
+     }
+#ifdef HAVE_IPV6
+   else if (inet_pton(AF_INET6, svr->ecs ? svr->ecs->ip : svr->name, &cares->addr.v6) == 1)
+     {
+        cares->byaddr = EINA_TRUE;
+        cares->isv6 = EINA_TRUE;
+        ares_gethostbyaddr(info_channel, &cares->addr.v6,
+                           sizeof(cares->addr.v6),
+                           AF_INET6,
+                           (ares_host_callback)_ecore_con_info_ares_host_cb,
+                           cares);
+     }
+#endif
+   else
+     {
+        cares->byaddr = EINA_FALSE;
+        ares_gethostbyname(info_channel, svr->ecs ? svr->ecs->ip : svr->name, ai_family,
+                           (ares_host_callback)_ecore_con_info_ares_host_cb,
+                           cares);
+     }
+
+   svr->infos = eina_list_append(svr->infos, cares);
+   return 1;
+}
+
+void
+ecore_con_info_data_clear(void *info)
+{
+   Ecore_Con_CAres *cares = info;
+   if (cares) cares->data = NULL;
+}
+
+static Eina_Bool
+_ecore_con_info_cares_timeout_cb(void *data __UNUSED__)
+{
+   ares_process_fd(info_channel, ARES_SOCKET_BAD, ARES_SOCKET_BAD);
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_ecore_con_info_cares_fd_cb(Ecore_Con_FD     *ecf,
+                            Ecore_Fd_Handler *fd_handler)
+{
+   ares_socket_t read_fd, write_fd;
+
+   read_fd = write_fd = ARES_SOCKET_BAD;
+
+   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
+     read_fd = ecf->fd;
+   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
+     write_fd = ecf->fd;
+
+   ares_process_fd(info_channel, read_fd, write_fd);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static int
+_ecore_con_info_fds_search(const Ecore_Con_FD *fd1,
+                           const Ecore_Con_FD *fd2)
+{
+   return fd1->fd - fd2->fd;
+}
+
+static void
+_ecore_con_info_cares_state_cb(void *data __UNUSED__,
+                               ares_socket_t fd,
+                               int readable,
+                               int writable)
+{
+   int flags = 0;
+   Ecore_Con_FD *search = NULL, *ecf = NULL;
+
+   search = eina_list_search_unsorted(info_fds,
+            (Eina_Compare_Cb)_ecore_con_info_fds_search, &ecf);
+
+   if (!(readable | writable))
+     {
+        ares_process_fd(info_channel, ARES_SOCKET_BAD, ARES_SOCKET_BAD);
+        if (search)
+          {
+             info_fds = eina_list_remove(info_fds, search);
+             ecore_timer_del(search->timer);
+             ecore_main_fd_handler_del(search->handler);
+             free(search);
+          }
+        return;
+     }
+
+   if (!search)
+     {
+        search = malloc(sizeof(Ecore_Con_FD));
+        EINA_SAFETY_ON_NULL_RETURN(search);
+
+        search->fd = fd;
+        search->handler = ecore_main_fd_handler_add(fd, ECORE_FD_WRITE | ECORE_FD_READ,
+            (Ecore_Fd_Cb)_ecore_con_info_cares_fd_cb, search, NULL, NULL);
+        /* c-ares default timeout is 5 seconds */
+        search->timer = ecore_timer_add(5, _ecore_con_info_cares_timeout_cb, NULL);
+        info_fds = eina_list_append(info_fds, search);
+     }
+
+   if (readable) flags |= ECORE_FD_READ;
+   if (writable) flags |= ECORE_FD_WRITE;
+   ecore_main_fd_handler_active_set(search->handler, flags);
+}
+
+static void
+_ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
+                             int              status,
+                             int              timeouts  __UNUSED__,
+                             struct hostent  *hostent)
+{
+   struct sockaddr *addr;
+   int addrlen;
+
+   /* Found something ? */
+   switch (status)
+     {
+      case ARES_SUCCESS:
+        if (!hostent->h_addr_list[0])
+          {
+             ERR("No IP found");
+             goto on_error;
+          }
+
+        switch (hostent->h_addrtype)
+          {
+           case AF_INET:
+           {
+              struct sockaddr_in *addri;
+
+              addrlen = sizeof(struct sockaddr_in);
+              addri = malloc(addrlen);
+
+              if (!addri)
+                goto on_mem_error;
+
+              addri->sin_family = AF_INET;
+              addri->sin_port = htons(arg->svr->ecs ? arg->svr->ecs->port : arg->svr->port);
+
+              memcpy(&addri->sin_addr.s_addr,
+                     hostent->h_addr_list[0], sizeof(struct in_addr));
+
+              addr = (struct sockaddr *)addri;
+              break;
+           }
+#ifdef HAVE_IPV6
+           case AF_INET6:
+           {
+              struct sockaddr_in6 *addri6;
+
+              addrlen = sizeof(struct sockaddr_in6);
+              addri6 = malloc(addrlen);
+
+              if (!addri6)
+                goto on_mem_error;
+
+              addri6->sin6_family = AF_INET6;
+              addri6->sin6_port = htons(arg->svr->ecs ? arg->svr->ecs->port : arg->svr->port);
+              addri6->sin6_flowinfo = 0;
+              addri6->sin6_scope_id = 0;
+
+              memcpy(&addri6->sin6_addr.s6_addr,
+                     hostent->h_addr_list[0], sizeof(struct in6_addr));
+
+              addr = (struct sockaddr *)addri6;
+              break;
+           }
+#endif
+           default:
+             ERR("Unknown addrtype %i", hostent->h_addrtype);
+             goto on_error;
+          }
+
+        if (!_ecore_con_info_ares_getnameinfo(arg, hostent->h_addrtype,
+                                              hostent->h_name,
+                                              addr, addrlen))
+          goto on_error;
+
+        break;
+
+      case ARES_ENOTFOUND: /* address notfound */
+        if (arg->byaddr)
+          {
+#ifdef HAVE_IPV6
+             /* This happen when host doesn't have a reverse. */
+              if (arg->isv6)
+                {
+                   struct sockaddr_in6 *addri6;
+
+                   addrlen = sizeof(struct sockaddr_in6);
+                   addri6 = malloc(addrlen);
+
+                   if (!addri6)
+                     goto on_mem_error;
+
+                   addri6->sin6_family = AF_INET6;
+                   addri6->sin6_port = htons(arg->svr->ecs ? arg->svr->ecs->port : arg->svr->port);
+                   addri6->sin6_flowinfo = 0;
+                   addri6->sin6_scope_id = 0;
+
+                   memcpy(&addri6->sin6_addr.s6_addr,
+                          &arg->addr.v6, sizeof(struct in6_addr));
+
+                   addr = (struct sockaddr *)addri6;
+                }
+              else
+#endif
+                {
+                   struct sockaddr_in *addri;
+
+                   addrlen = sizeof(struct sockaddr_in);
+                   addri = malloc(addrlen);
+
+                   if (!addri)
+                     goto on_mem_error;
+
+                   addri->sin_family = AF_INET;
+                   addri->sin_port = htons(arg->svr->ecs ? arg->svr->ecs->port : arg->svr->port);
+
+                   memcpy(&addri->sin_addr.s_addr,
+                          &arg->addr.v4, sizeof(struct in_addr));
+
+                   addr = (struct sockaddr *)addri;
+                }
+
+              if (!_ecore_con_info_ares_getnameinfo(arg,
+#ifdef HAVE_IPV6
+                                                    arg->isv6 ? AF_INET6 :
+#endif
+                                                    AF_INET,
+                                                    NULL, addr,
+                                                    addrlen))
+                goto on_error;
+
+              break;
+          }
+
+      case ARES_ENOTIMP: /* unknown family */
+      case ARES_EBADNAME: /* not a valid internet address */
+      case ARES_ENOMEM: /* not enough memory */
+      case ARES_EDESTRUCTION: /* request canceled, shuting down */
+      case ARES_ENODATA: /* no data returned */
+      case ARES_ECONNREFUSED: /* connection refused */
+      case ARES_ETIMEOUT: /* connection timed out */
+        ecore_con_event_server_error(arg->svr, ares_strerror(status));
+        goto on_error;
+
+      default:
+        ERR("Unknown status returned by c-ares: %i assuming error", status);
+        ecore_con_event_server_error(arg->svr, ares_strerror(status));
+        goto on_error;
+     }
+
+   return;
+
+on_mem_error:
+   ERR("Not enough memory");
+
+on_error:
+   if (arg->data)
+     {
+        ecore_con_server_infos_del(arg->data, arg);
+        arg->done_cb(arg->data, NULL);
+     }
+   free(arg);
+}
+
+static void
+_ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
+                              int              status,
+                              int              timeouts __UNUSED__,
+                              char            *node,
+                              char            *service)
+{
+   switch (status)
+     {
+      case ARES_SUCCESS:
+        if (node)
+          strcpy(arg->result->ip, node);
+        else
+          *arg->result->ip = '\0';
+
+        if (service)
+          strcpy(arg->result->service, service);
+        else
+          *arg->result->service = '\0';
+
+        if (arg->data) arg->done_cb(arg->data, arg->result);
+        break;
+
+      case ARES_ENOTIMP:
+      case ARES_ENOTFOUND:
+      case ARES_ENOMEM:
+      case ARES_EDESTRUCTION:
+      case ARES_EBADFLAGS:
+        ecore_con_event_server_error(arg->svr, ares_strerror(status));
+        if (arg->data) arg->done_cb(arg->data, NULL);
+        break;
+     }
+
+   free(arg->result->info.ai_addr);
+   free(arg->result);
+   if (arg->data) ecore_con_server_infos_del(arg->data, arg);
+   free(arg);
+}
+
index e9c64de..3671576 100644 (file)
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-/* 
- * Simple dns lookup
- *
- * http://www.faqs.org/rfcs/rfc1035.html
- * man resolv.conf
- *
- * And a sneakpeek at ares, ftp://athena-dist.mit.edu/pub/ATHENA/ares/
- */
-/*
- * TODO
- * * Check env LOCALDOMAIN to override search
- * * Check env RES_OPTIONS to override options
+ * This version of ecore_con_info uses dns.c to provide asynchronous dns lookup.
  *
- * * Read /etc/host.conf
- * * host.conf env
- *   RESOLV_HOST_CONF, RESOLV_SERV_ORDER
- * * Check /etc/hosts
- *
- * * Caching
- *   We should store all names returned when CNAME, might have different ttl.
- *   Check against search and hostname when querying cache?
- * * Remember all querys and delete them on shutdown
- *
- * * Need more buffer overflow checks.
+ * dns.c is written by William Ahern:
+ * http://25thandclement.com/~william/projects/dns.c.html
  */
-#include "ecore_private.h"
+
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef HAVE_ERRNO_H
+# include <errno.h> /* for EAGAIN */
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+# include <errno.h>
+#endif
+
+#include "dns.h"
+
 #include "Ecore.h"
+#include "Ecore_Con.h"
 #include "ecore_con_private.h"
 
-#include <ctype.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#include <netdb.h>
+typedef struct dns_addrinfo dns_addrinfo;
+typedef struct dns_resolv_conf dns_resolv_conf;
+typedef struct dns_resolver dns_resolver;
+typedef struct dns_hosts       dns_hosts;
 
-typedef struct _CB_Data CB_Data;
+typedef struct _Ecore_Con_DNS Ecore_Con_DNS;
 
-struct _CB_Data
+struct _Ecore_Con_DNS
 {
-   Ecore_List2 __list_data;
-   void (*cb_done) (void *data, struct hostent *hostent);
-   void *data;
+   Ecore_Con_Server *svr;
+   Ecore_Con_Info_Cb done_cb;
+   void             *data;
+   dns_addrinfo     *ai;
+   dns_resolver     *resolv;
+   struct addrinfo   hints;
    Ecore_Fd_Handler *fdh;
-   pid_t pid;
-   Ecore_Event_Handler *handler;
-   int fd2;
+   Ecore_Timer      *timer;
 };
 
-static void _ecore_con_dns_readdata(CB_Data *cbdata);
-static void _ecore_con_dns_slave_free(CB_Data *cbdata);
-static int _ecore_con_dns_data_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_con_dns_exit_handler(void *data, int type __UNUSED__, void *event);
+static int _ecore_con_dns_init = 0;
+static dns_resolv_conf *resconf = NULL;
+static dns_hosts *hosts = NULL;
 
-static int dns_init = 0;
-static Ecore_List2 *dns_slaves = NULL;
-  
-int
-ecore_con_dns_init(void)
+static void
+_ecore_con_dns_free(Ecore_Con_DNS *dns)
 {
-   dns_init++;
-   return dns_init;
+   if (dns->svr->infos) dns->svr->infos = eina_list_remove(dns->svr->infos, dns);
+   if (dns->timer) ecore_timer_del(dns->timer);
+   if (dns->fdh) ecore_main_fd_handler_del(dns->fdh);
+   dns_res_close(dns_res_mortal(dns->resolv));
+   free(dns);
 }
 
-int
-ecore_con_dns_shutdown(void)
+static Eina_Bool
+_dns_addrinfo_get(Ecore_Con_DNS *dns, const char *addr, int port)
 {
-   dns_init--;
-   if (dns_init == 0)
-     {
-       while (dns_slaves) _ecore_con_dns_slave_free((CB_Data *)dns_slaves);
-     }
-   return dns_init;
+   int error = 0;
+   char service[NI_MAXSERV];
+
+   snprintf(service, sizeof(service), "%d", port);
+   dns->ai = dns_ai_open(addr, service, DNS_T_A, (const struct addrinfo *)&dns->hints, dns->resolv, &error);
+   return error;
 }
 
-int
-ecore_con_dns_lookup(const char *name,
-                    void (*done_cb) (void *data, struct hostent *hostent),
-                    void *data)
+static int
+_ecore_con_dns_check(Ecore_Con_DNS *dns)
 {
-   CB_Data *cbdata;
-   int fd[2];
-   
-   if (pipe(fd) < 0) return 0;
-   cbdata = calloc(1, sizeof(CB_Data));
-   if (!cbdata)
-     {
-       close(fd[0]);
-       close(fd[1]);
-       return 0;
-     }
-   cbdata->cb_done = done_cb;
-   cbdata->data = data;
-   cbdata->fd2 = fd[1];
-   if (!(cbdata->fdh = ecore_main_fd_handler_add(fd[0], ECORE_FD_READ, 
-                                                _ecore_con_dns_data_handler,
-                                                cbdata,
-                                                NULL, NULL)))
-     {
-       free(cbdata);
-       close(fd[0]);
-       close(fd[1]);
-       return 0;
-     }
-                            
-   if ((cbdata->pid = fork()) == 0)
-     {
-       struct hostent *he;
-       
-       /* CHILD */
-       he = gethostbyname(name);
-       if (he)
-         {
-            struct in_addr addr;
-            
-            memcpy((struct in_addr *)&addr, he->h_addr,
-                   sizeof(struct in_addr));
-            write(fd[1], &(addr.s_addr), sizeof(in_addr_t));
-         }
-       close(fd[1]);
-# ifdef __USE_ISOC99
-       _Exit(0);
-# else 
-       _exit(0);
-# endif        
-     }
-   /* PARENT */
-   cbdata->handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_dns_exit_handler, cbdata);
-   if (!cbdata->handler)
+   struct addrinfo *ent = NULL;
+   int error = 0;
+   error = dns_ai_nextent(&ent, dns->ai);
+
+   switch (error)
      {
-       ecore_main_fd_handler_del(cbdata->fdh);
-       free(cbdata);
-       close(fd[0]);
-       close(fd[1]);
-       return 0;
+      case 0:
+        break;
+      case EAGAIN:
+        return 1;
+      default:
+        ERR("resolve failed: %s", dns_strerror(error));
+        goto error;
      }
-   dns_slaves = _ecore_list2_append(dns_slaves, cbdata);
-   return 1;
+
+   {
+      Ecore_Con_Info result = {0, .ip = {0}, .service = {0}};
+#if 0
+      char pretty[512];
+      dns_ai_print(pretty, sizeof(pretty), ent, dns->ai);
+      printf("%s\n", pretty);
+#endif
+      result.size = 0;
+      dns_inet_ntop(dns_sa_family(ent->ai_addr), dns_sa_addr(dns_sa_family(ent->ai_addr), ent->ai_addr), result.ip, sizeof(result.ip));
+      snprintf(result.service, sizeof(result.service), "%u", ntohs(*dns_sa_port(dns_sa_family(ent->ai_addr), ent->ai_addr)));
+      memcpy(&result.info, ent, sizeof(result.info));
+      if (dns->fdh) ecore_main_fd_handler_del(dns->fdh);
+      dns->fdh = NULL;
+      dns->done_cb(dns->data, &result);
+      free(ent);
+      _ecore_con_dns_free(dns);
+   }
+
+   return 0;
+error:
+   dns->done_cb(dns->data, NULL);
+   _ecore_con_dns_free(dns);
+   return -1;
 }
 
-static void
-_ecore_con_dns_readdata(CB_Data *cbdata)
+static Eina_Bool
+_dns_fd_cb(Ecore_Con_DNS *dns, Ecore_Fd_Handler *fdh __UNUSED__)
 {
-   struct hostent he;
-   struct in_addr addr;
-   char *addr2;
-   ssize_t size;
-
-   size = read(ecore_main_fd_handler_fd_get(cbdata->fdh), &(addr.s_addr),
-              sizeof(in_addr_t));
-   if (size == sizeof(in_addr_t))
+   if (_ecore_con_dns_check(dns) != 1) return ECORE_CALLBACK_RENEW;
+   if (ecore_main_fd_handler_fd_get(dns->fdh) != dns_ai_pollfd(dns->ai))
      {
-       addr2 = (char *)&addr;
-       he.h_addrtype = AF_INET;
-       he.h_length = sizeof(in_addr_t);
-       he.h_addr_list = &addr2;
-       cbdata->cb_done(cbdata->data, &he);
+        ecore_main_fd_handler_del(dns->fdh);
+        dns->fdh = ecore_main_fd_handler_add(dns_ai_pollfd(dns->ai), dns_ai_events(dns->ai), (Ecore_Fd_Cb)_dns_fd_cb, dns, NULL, NULL);
      }
    else
-     cbdata->cb_done(cbdata->data, NULL);
-   cbdata->cb_done = NULL;
+     ecore_main_fd_handler_active_set(dns->fdh, dns_ai_events(dns->ai));
+   return ECORE_CALLBACK_RENEW;
 }
 
-static void
-_ecore_con_dns_slave_free(CB_Data *cbdata)
+static Eina_Bool
+_dns_timer_cb(Ecore_Con_DNS *dns)
 {
-   dns_slaves = _ecore_list2_remove(dns_slaves, cbdata);
-   close(ecore_main_fd_handler_fd_get(cbdata->fdh));
-   close(cbdata->fd2);
-   ecore_main_fd_handler_del(cbdata->fdh);
-   ecore_event_handler_del(cbdata->handler);
-   free(cbdata);
+   dns->done_cb(dns->data, NULL);
+   _ecore_con_dns_free(dns);
+   dns->timer = NULL;
+   return EINA_FALSE;
 }
 
-static int
-_ecore_con_dns_data_handler(void *data, Ecore_Fd_Handler *fd_handler)
+int
+ecore_con_info_init(void)
 {
-   CB_Data *cbdata;
+   int err;
+   if (_ecore_con_dns_init) return ++_ecore_con_dns_init;
 
-   cbdata = data;
-   if (cbdata->cb_done)
+   resconf = dns_resconf_local(&err);
+   if (!resconf)
      {
-       if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
-         _ecore_con_dns_readdata(cbdata);
-       else
-         {
-            cbdata->cb_done(cbdata->data, NULL);
-            cbdata->cb_done = NULL;
-         }
+        ERR("resconf_open: %s", dns_strerror(err));
+        return 0;
      }
-   _ecore_con_dns_slave_free(cbdata);
-   return 0;
+   hosts = dns_hosts_local(&err);
+   if (!hosts)
+     {
+        ERR("hosts_open: %s", dns_strerror(err));
+        dns_resconf_close(resconf);
+        resconf = NULL;
+        return 0;
+     }
+   /* this is super slow don't do it */
+   //resconf->options.recurse = 1;
+   return ++_ecore_con_dns_init;
 }
 
-static int
-_ecore_con_dns_exit_handler(void *data, int type __UNUSED__, void *event)
+int
+ecore_con_info_shutdown(void)
 {
-   CB_Data *cbdata;
-   Ecore_Exe_Event_Del *ev;
-   
-   ev = event;
-   cbdata = data;
-   if (cbdata->pid != ev->pid) return 1;
+   if (!_ecore_con_dns_init) return 0;
+   if (--_ecore_con_dns_init) return _ecore_con_dns_init;
+   dns_resconf_close(resconf);
+   resconf = NULL;
+   dns_hosts_close(hosts);
+   hosts = NULL;
    return 0;
-   _ecore_con_dns_slave_free(cbdata);
+}
+
+void
+ecore_con_info_data_clear(void *info)
+{
+   Ecore_Con_DNS *dns = info;
+   if (dns) dns->data = NULL;
+}
+
+int
+ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
+                           Ecore_Con_Info_Cb done_cb,
+                           void *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_STREAM;
+   hints.ai_flags = AI_CANONNAME;
+   hints.ai_protocol = IPPROTO_TCP;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
+                          Ecore_Con_Info_Cb done_cb,
+                          void *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_STREAM;
+   hints.ai_flags = AI_PASSIVE;
+   hints.ai_protocol = IPPROTO_TCP;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_udp_connect(Ecore_Con_Server *svr,
+                           Ecore_Con_Info_Cb done_cb,
+                           void *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = AI_CANONNAME;
+   hints.ai_protocol = IPPROTO_UDP;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_udp_listen(Ecore_Con_Server *svr,
+                          Ecore_Con_Info_Cb done_cb,
+                          void *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = AI_PASSIVE;
+   hints.ai_protocol = IPPROTO_UDP;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
+                            Ecore_Con_Info_Cb done_cb,
+                            void *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+#ifdef HAVE_IPV6
+   hints.ai_family = AF_INET6;
+#else
+   hints.ai_family = AF_INET;
+#endif
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_protocol = IPPROTO_UDP;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+EAPI int
+ecore_con_info_get(Ecore_Con_Server *svr,
+                   Ecore_Con_Info_Cb done_cb,
+                   void *data,
+                   struct addrinfo *hints)
+{
+   Ecore_Con_DNS *dns;
+   int error = 0;
+
+   dns = calloc(1, sizeof(Ecore_Con_DNS));
+   if (!dns) return 0;
+
+   dns->svr = svr;
+   dns->done_cb = done_cb;
+   dns->data = data;
+
+   if (hints)
+     memcpy(&dns->hints, hints, sizeof(struct addrinfo));
+
+   if (!(dns->resolv = dns_res_open(resconf, hosts, dns_hints_mortal(dns_hints_local(resconf, &error)), NULL, dns_opts(), &error)))
+     {
+        ERR("res_open: %s", dns_strerror(error));
+        goto reserr;
+
+     }
+
+   error = _dns_addrinfo_get(dns, svr->ecs ? svr->ecs->ip : svr->name, dns->svr->ecs ? dns->svr->ecs->port : dns->svr->port);
+   if (error && (error != EAGAIN))
+     {
+        ERR("resolver: %s", dns_strerror(error));
+        goto seterr;
+     }
+
+   switch (_ecore_con_dns_check(dns))
+     {
+      case 0:
+        break;
+      case 1:
+        dns->fdh = ecore_main_fd_handler_add(dns_ai_pollfd(dns->ai), dns_ai_events(dns->ai), (Ecore_Fd_Cb)_dns_fd_cb, dns, NULL, NULL);
+        svr->infos = eina_list_append(svr->infos, dns);
+        dns->timer = ecore_timer_add(5.0, (Ecore_Task_Cb)_dns_timer_cb, dns);
+        break;
+      default:
+        return 0;
+     }
+
+   return 1;
+seterr:
+   if (dns->resolv) dns_res_close(dns_res_mortal(dns->resolv));
+reserr:
+   free(dns);
    return 0;
 }
+
diff --git a/src/lib/ecore_con/ecore_con_eet.c b/src/lib/ecore_con/ecore_con_eet.c
new file mode 100644 (file)
index 0000000..ece348e
--- /dev/null
@@ -0,0 +1,796 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Eina.h>
+
+#include "Ecore_Con_Eet.h"
+
+#define ECORE_CON_EET_RAW_MAGIC 0xDEAD007
+
+typedef struct _Ecore_Con_Eet_Data Ecore_Con_Eet_Data;
+typedef struct _Ecore_Con_Eet_Raw_Data Ecore_Con_Eet_Raw_Data;
+typedef struct _Ecore_Con_Eet_Client Ecore_Con_Eet_Client;
+typedef struct _Ecore_Con_Eet_Server Ecore_Con_Eet_Server;
+
+struct _Ecore_Con_Reply
+{
+   Ecore_Con_Eet *ece;
+   Ecore_Con_Client *client;
+
+   Eet_Connection *econn;
+
+   char *buffer_section;
+   unsigned char *buffer;
+   unsigned int buffer_length;
+   unsigned int buffer_current;
+   Ecore_Con_Eet_Raw_Data *buffer_handler;
+};
+
+struct _Ecore_Con_Eet_Data
+{
+   Ecore_Con_Eet_Data_Cb func;
+   const char *name;
+   const void *data;
+};
+
+struct _Ecore_Con_Eet_Raw_Data
+{
+   Ecore_Con_Eet_Raw_Data_Cb func;
+   const char *name;
+   const void *data;
+};
+
+struct _Ecore_Con_Eet_Client
+{
+   Ecore_Con_Eet_Client_Cb func;
+   const void *data;
+};
+
+struct _Ecore_Con_Eet_Server
+{
+   Ecore_Con_Eet_Server_Cb func;
+   const void *data;
+};
+
+struct _Ecore_Con_Eet
+{
+   Ecore_Con_Server *server;
+
+   Ecore_Event_Handler *handler_add;
+   Ecore_Event_Handler *handler_del;
+   Ecore_Event_Handler *handler_data;
+
+   Eet_Data_Descriptor *edd;
+   Eet_Data_Descriptor *matching;
+
+   Eina_Hash *data_callbacks;
+   Eina_Hash *raw_data_callbacks;
+
+   union {
+      struct {
+         Eina_List *connections;
+         Eina_List *client_connect_callbacks;
+         Eina_List *client_disconnect_callbacks;
+      } server;
+      struct {
+         Ecore_Con_Reply *r;
+         Eina_List *server_connect_callbacks;
+         Eina_List *server_disconnect_callbacks;
+      } client;
+   } u;
+
+   const void *data;
+
+   Eina_Bool client : 1;
+};
+
+static void
+_ecore_con_eet_data_free(void *data)
+{
+   Ecore_Con_Eet_Data *eced = data;
+
+   eina_stringshare_del(eced->name);
+   free(eced);
+}
+
+static void
+_ecore_con_eet_raw_data_free(void *data)
+{
+   Ecore_Con_Eet_Raw_Data *eced = data;
+
+   eina_stringshare_del(eced->name);
+   free(eced);
+}
+static void
+_ecore_con_eet_reply_cleanup(Ecore_Con_Reply *n)
+{
+   if (n->buffer_handler) free(n->buffer);
+   n->buffer = NULL;
+   n->buffer_handler = NULL;
+   free(n->buffer_section);
+   n->buffer_section = NULL;
+}
+
+typedef struct _Ecore_Con_Eet_Protocol Ecore_Con_Eet_Protocol;
+struct _Ecore_Con_Eet_Protocol {
+   const char *type;
+   void *data;
+};
+
+static const char *
+_ecore_con_eet_data_type_get(const void *data, Eina_Bool *unknow EINA_UNUSED)
+{
+   const Ecore_Con_Eet_Protocol *p = data;
+
+   return p->type;
+}
+
+static Eina_Bool
+_ecore_con_eet_data_type_set(const char *type, void *data, Eina_Bool unknow EINA_UNUSED)
+{
+   Ecore_Con_Eet_Protocol *p = data;
+
+   p->type = type;
+   return EINA_TRUE;
+}
+
+static void
+_ecore_con_eet_data_descriptor_setup(Ecore_Con_Eet *ece)
+{
+   Eet_Data_Descriptor_Class eddc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Ecore_Con_Eet_Protocol);
+   ece->edd = eet_data_descriptor_stream_new(&eddc);
+
+   eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
+   eddc.func.type_get = _ecore_con_eet_data_type_get;
+   eddc.func.type_set = _ecore_con_eet_data_type_set;
+   ece->matching = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_VARIANT(ece->edd, Ecore_Con_Eet_Protocol, "data", data, type, ece->matching);
+}
+
+/* Dealing with a server listening to connection */
+static Eina_Bool
+_ecore_con_eet_read_cb(const void *eet_data, size_t size, void *user_data)
+{
+   Ecore_Con_Reply *n = user_data;
+   Ecore_Con_Eet_Protocol *protocol;
+   Ecore_Con_Eet_Data *cb;
+
+   protocol = eet_data_descriptor_decode(n->ece->edd, eet_data, size);
+   if (!protocol) return EINA_TRUE;
+
+   cb = eina_hash_find(n->ece->data_callbacks, protocol->type);
+   if (!cb) return EINA_TRUE; /* Should I report unknow protocol communication ? */
+
+   cb->func((void*)cb->data, n, cb->name, protocol->data);
+
+   eina_stringshare_del(protocol->type);
+   free(protocol);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_con_eet_server_write_cb(const void *data, size_t size, void *user_data)
+{
+   Ecore_Con_Reply *n = user_data;
+
+   if (ecore_con_client_send(n->client, data, size) != (int) size)
+     return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_con_eet_client_write_cb(const void *data, size_t size, void *user_data)
+{
+   Ecore_Con_Reply *n = user_data;
+
+   if (ecore_con_server_send(n->ece->server, data, size) != (int) size)
+     return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_con_eet_server_connected(void *data, int type EINA_UNUSED, Ecore_Con_Event_Client_Add *ev)
+{
+   Ecore_Con_Eet_Client *ecec;
+   Eina_List *ll;
+   Ecore_Con_Eet *r = data;
+   Ecore_Con_Reply *n;
+
+   if (ecore_con_client_server_get(ev->client) != r->server)
+     return EINA_TRUE;
+
+   n = calloc(1, sizeof (Ecore_Con_Reply));
+   if (!n) return EINA_TRUE;
+
+   n->client = ev->client;
+   n->ece = r;
+   n->econn = eet_connection_new(_ecore_con_eet_read_cb, _ecore_con_eet_server_write_cb, n);
+   ecore_con_client_data_set(n->client, n);
+
+   EINA_LIST_FOREACH(r->u.server.client_connect_callbacks, ll, ecec)
+     if (!ecec->func((void*) ecec->data, n, n->client))
+       {
+          eet_connection_close(n->econn, NULL);
+          free(n);
+          return EINA_TRUE;
+       }
+
+   r->u.server.connections = eina_list_append(r->u.server.connections, n);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_con_eet_server_disconnected(void *data, int type EINA_UNUSED, Ecore_Con_Event_Client_Del *ev)
+{
+   Ecore_Con_Eet *r = data;
+   Ecore_Con_Reply *n;
+   Eina_List *l;
+
+   if (ecore_con_client_server_get(ev->client) != r->server)
+     return EINA_TRUE;
+
+   EINA_LIST_FOREACH(r->u.server.connections, l, n)
+     if (n->client == ev->client)
+       {
+          Ecore_Con_Eet_Client *ecec;
+          Eina_List *ll;
+
+          EINA_LIST_FOREACH(r->u.server.client_disconnect_callbacks, ll, ecec)
+            ecec->func((void*) ecec->data, n, n->client);
+
+          eet_connection_close(n->econn, NULL);
+          free(n);
+          r->u.server.connections = eina_list_remove_list(r->u.server.connections, l);
+          return EINA_TRUE;
+       }
+
+   return EINA_TRUE;
+}
+
+static void
+_ecore_con_eet_raw_data_push(Ecore_Con_Reply *n, void *data, int size)
+{
+   if (n->buffer_handler)
+     memcpy(n->buffer + n->buffer_current, data, size);
+   n->buffer_current += size;
+
+   if (n->buffer_current == n->buffer_length)
+     {
+        if (n->buffer_handler)
+          n->buffer_handler->func((void*) n->buffer_handler->data, n, n->buffer_handler->name, n->buffer_section, n->buffer, n->buffer_length);
+        _ecore_con_eet_reply_cleanup(n);
+     }
+}
+
+static void
+_ecore_con_eet_data(Ecore_Con_Reply *n, void *data, unsigned int size)
+{
+   /* FIXME: Enforce detection of attack and kill connection on that case */
+   if (n->buffer)
+     {
+        if (n->buffer_current + size > n->buffer_length)
+          {
+             _ecore_con_eet_reply_cleanup(n);
+             return ;
+          }
+
+        _ecore_con_eet_raw_data_push(n, data, size);
+        return ;
+     }
+   else if (eet_connection_empty(n->econn) && size > (int) (4 * sizeof (unsigned int) + 2))
+     {
+        unsigned int *tmp = data;
+        size -= 4 * sizeof (unsigned int) + 2;
+
+        if (ntohl(tmp[0]) == ECORE_CON_EET_RAW_MAGIC)
+          {
+             unsigned int protocol_length = ntohl(tmp[1]);
+             unsigned int section_length = ntohl(tmp[2]);
+             unsigned int data_length = ntohl(tmp[3]);
+
+             if (protocol_length > 1 && section_length > 1 && protocol_length + section_length <= size && data_length < 10 * 1024 * 1024)
+               {
+                  char *buffer = (char*) &tmp[4];
+                  char *protocol;
+                  char *section;
+
+                  protocol = buffer;
+                  section = buffer + protocol_length;
+
+                  if (protocol[protocol_length - 1] == '\0' &&
+                      section[section_length - 1] == '\0')
+                    {
+                       size -= protocol_length + section_length;
+                       buffer = section + section_length;
+
+                       n->buffer_handler = eina_hash_find(n->ece->raw_data_callbacks, protocol);
+                       n->buffer_section = strdup(section);
+                       n->buffer_length = data_length;
+                       n->buffer_current = 0;
+                       if (n->buffer_handler)
+                         n->buffer = malloc(sizeof (data_length));
+                       else
+                         n->buffer = (void*) 1;
+                       if (n->buffer)
+                         {
+                            _ecore_con_eet_raw_data_push(n, buffer, size);
+                            return ;
+                         }
+                       _ecore_con_eet_reply_cleanup(n);
+
+                       size += protocol_length + section_length;
+                    }
+               }
+          }
+
+        size += 4 * sizeof (unsigned int) + 2;
+     }
+
+   eet_connection_received(n->econn, data, size);
+}
+
+static Eina_Bool
+_ecore_con_eet_server_data(void *data, int type EINA_UNUSED, Ecore_Con_Event_Client_Data *ev)
+{
+   Ecore_Con_Eet *r = data;
+   Ecore_Con_Reply *n;
+
+   if (ecore_con_client_server_get(ev->client) != r->server)
+     return EINA_TRUE;
+
+   n = ecore_con_client_data_get(ev->client);
+
+   _ecore_con_eet_data(n, ev->data, ev->size);
+
+   return EINA_TRUE;
+}
+
+/* Dealing connection to a server */
+
+static Eina_Bool
+_ecore_con_eet_client_connected(void *data, int type EINA_UNUSED, Ecore_Con_Event_Server_Add *ev)
+{
+   Ecore_Con_Eet_Server *eces;
+   Ecore_Con_Eet *r = data;
+   Ecore_Con_Reply *n;
+   Eina_List *ll;
+
+   /* Client did connect */
+   if (r->server != ev->server) return EINA_TRUE;
+   if (r->u.client.r) return EINA_TRUE;
+
+   n = calloc(1, sizeof (Ecore_Con_Reply));
+   if (!n) return EINA_TRUE;
+
+   n->client = NULL;
+   n->ece = r;
+   n->econn = eet_connection_new(_ecore_con_eet_read_cb, _ecore_con_eet_client_write_cb, n);
+
+   EINA_LIST_FOREACH(r->u.client.server_connect_callbacks, ll, eces)
+     if (!eces->func((void*) eces->data, n, n->ece->server))
+       {
+          eet_connection_close(n->econn, NULL);
+          free(n);
+          return EINA_TRUE;
+       }
+
+   r->u.client.r = n;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_con_eet_client_disconnected(void *data, int type EINA_UNUSED, Ecore_Con_Event_Server_Del *ev)
+{
+   Ecore_Con_Eet *r = data;
+   Ecore_Con_Eet_Server *eces;
+   Eina_List *ll;
+
+   if (r->server != ev->server) return EINA_TRUE;
+   if (!r->u.client.r) return EINA_TRUE;
+
+   /* Client disconnected */
+   EINA_LIST_FOREACH(r->u.client.server_disconnect_callbacks, ll, eces)
+     eces->func((void*) eces->data, r->u.client.r, r->server);
+
+   eet_connection_close(r->u.client.r->econn, NULL);
+   free(r->u.client.r);
+   r->u.client.r = NULL;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_con_eet_client_data(void *data, int type EINA_UNUSED, Ecore_Con_Event_Server_Data *ev)
+{
+   Ecore_Con_Eet *r = data;
+
+   if (r->server != ev->server) return EINA_TRUE;
+   if (!r->u.client.r) return EINA_TRUE;
+
+   /* Got some data */
+   _ecore_con_eet_data(r->u.client.r, ev->data, ev->size);
+
+   return EINA_TRUE;
+}
+
+/**************
+ * Global API *
+ **************/
+
+EAPI Ecore_Con_Eet *
+ecore_con_eet_server_new(Ecore_Con_Server *server)
+{
+   Ecore_Con_Eet *r;
+
+   if (!server) return NULL;
+
+   r = calloc(1, sizeof (Ecore_Con_Eet));
+   if (!r) return NULL;
+
+   r->server = server;
+   r->handler_add = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
+                                            (Ecore_Event_Handler_Cb)_ecore_con_eet_server_connected, r);
+   r->handler_del = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
+                                            (Ecore_Event_Handler_Cb)_ecore_con_eet_server_disconnected, r);
+   r->handler_data = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
+                                             (Ecore_Event_Handler_Cb)_ecore_con_eet_server_data, r);
+   r->data_callbacks = eina_hash_stringshared_new(_ecore_con_eet_data_free);
+   r->raw_data_callbacks = eina_hash_stringshared_new(_ecore_con_eet_raw_data_free);
+
+   _ecore_con_eet_data_descriptor_setup(r);
+
+   return r;
+}
+
+EAPI Ecore_Con_Eet *
+ecore_con_eet_client_new(Ecore_Con_Server *server)
+{
+   Ecore_Con_Eet *r;
+
+   if (!server) return NULL;
+
+   r = calloc(1, sizeof (Ecore_Con_Eet));
+   if (!r) return NULL;
+
+   r->client = EINA_TRUE;
+   r->server = server;
+   r->handler_add = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
+                                            (Ecore_Event_Handler_Cb)_ecore_con_eet_client_connected, r);
+   r->handler_del = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
+                                            (Ecore_Event_Handler_Cb)_ecore_con_eet_client_disconnected, r);
+   r->handler_data = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
+                                             (Ecore_Event_Handler_Cb)_ecore_con_eet_client_data, r);
+   r->data_callbacks = eina_hash_stringshared_new(_ecore_con_eet_data_free);
+   r->raw_data_callbacks = eina_hash_stringshared_new(_ecore_con_eet_raw_data_free);
+
+   _ecore_con_eet_data_descriptor_setup(r);
+
+   return r;
+}
+
+EAPI void
+ecore_con_eet_server_free(Ecore_Con_Eet *r)
+{
+   if (!r) return ;
+
+   eet_data_descriptor_free(r->edd);
+   eet_data_descriptor_free(r->matching);
+   eina_hash_free(r->data_callbacks);
+   eina_hash_free(r->raw_data_callbacks);
+
+   if (r->client)
+     {
+        Ecore_Con_Eet_Server *s;
+
+        if (r->u.client.r)
+          {
+             _ecore_con_eet_reply_cleanup(r->u.client.r);
+             eet_connection_close(r->u.client.r->econn, NULL);
+             free(r->u.client.r);
+          }
+        EINA_LIST_FREE(r->u.client.server_connect_callbacks, s)
+          free(s);
+        EINA_LIST_FREE(r->u.client.server_disconnect_callbacks, s)
+          free(s);
+     }
+   else
+     {
+        Ecore_Con_Reply *n;
+        Ecore_Con_Eet_Client *c;
+
+        EINA_LIST_FREE(r->u.server.connections, n)
+          {
+             _ecore_con_eet_reply_cleanup(n);
+             eet_connection_close(n->econn, NULL);
+             free(n);
+          }
+        EINA_LIST_FREE(r->u.server.client_connect_callbacks, c)
+          free(c);
+        EINA_LIST_FREE(r->u.server.client_disconnect_callbacks, c)
+          free(c);
+     }
+
+   ecore_event_handler_del(r->handler_add);
+   ecore_event_handler_del(r->handler_del);
+   ecore_event_handler_del(r->handler_data);
+   free(r);
+}
+
+EAPI void
+ecore_con_eet_register(Ecore_Con_Eet *ece, const char *name, Eet_Data_Descriptor *edd)
+{
+   if (!ece) return ;
+
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(ece->matching, name, edd);
+}
+
+EAPI void
+ecore_con_eet_data_callback_add(Ecore_Con_Eet *ece, const char *name, Ecore_Con_Eet_Data_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Data *eced;
+
+   if (!ece) return ;
+
+   eced = calloc(1, sizeof (Ecore_Con_Eet_Data));;
+   if (!eced) return ;
+
+   eced->func = func;
+   eced->data = data;
+   eced->name = eina_stringshare_add(name);
+
+   eina_hash_direct_add(ece->data_callbacks, eced->name, eced);
+}
+
+EAPI void
+ecore_con_eet_data_callback_del(Ecore_Con_Eet *ece, const char *name)
+{
+   if (!ece) return ;
+   eina_hash_del(ece->data_callbacks, name, NULL);
+}
+
+EAPI void
+ecore_con_eet_raw_data_callback_add(Ecore_Con_Eet *ece, const char *name, Ecore_Con_Eet_Raw_Data_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Raw_Data *eced;
+
+   if (!ece) return ;
+
+   eced = calloc(1, sizeof (Ecore_Con_Eet_Raw_Data));;
+   if (!eced) return ;
+
+   eced->func = func;
+   eced->data = data;
+   eced->name = eina_stringshare_add(name);
+
+   eina_hash_direct_add(ece->raw_data_callbacks, eced->name, eced);   
+}
+
+EAPI void
+ecore_con_eet_raw_data_callback_del(Ecore_Con_Eet *ece, const char *name)
+{
+   if (!ece) return ;
+
+   if (ece->client && ece->u.client.r->buffer_handler && !strcmp(ece->u.client.r->buffer_handler->name, name))
+     {
+        ece->u.client.r->buffer_handler = NULL;
+        free(ece->u.client.r->buffer);
+        ece->u.client.r->buffer = (void*) 1;
+     }
+   eina_hash_del(ece->raw_data_callbacks, name, NULL);
+}
+
+EAPI void
+ecore_con_eet_client_connect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Client *c;
+
+   if (!ece || !func) return ;
+
+   c = calloc(1, sizeof (Ecore_Con_Eet_Client));
+   if (!c) return ;
+
+   c->func = func;
+   c->data = data;
+
+   ece->u.server.client_connect_callbacks = eina_list_append(ece->u.server.client_connect_callbacks, c);
+}
+
+EAPI void
+ecore_con_eet_client_connect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Client *c;
+   Eina_List *l;
+
+   if (!ece || !func) return ;
+
+   EINA_LIST_FOREACH(ece->u.server.client_connect_callbacks, l, c)
+     if (c->func == func && c->data == data)
+       {
+          ece->u.server.client_connect_callbacks = eina_list_remove_list(ece->u.server.client_connect_callbacks, l);
+          free(c);
+          return ;
+       }
+}
+
+EAPI void
+ecore_con_eet_client_disconnect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Client *c;
+
+   if (!ece || !func) return ;
+
+   c = calloc(1, sizeof (Ecore_Con_Eet_Client));
+   if (!c) return ;
+
+   c->func = func;
+   c->data = data;
+
+   ece->u.server.client_connect_callbacks = eina_list_append(ece->u.server.client_disconnect_callbacks, c);
+}
+
+EAPI void
+ecore_con_eet_client_disconnect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Client_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Client *c;
+   Eina_List *l;
+
+   if (!ece || !func) return ;
+
+   EINA_LIST_FOREACH(ece->u.server.client_disconnect_callbacks, l, c)
+     if (c->func == func && c->data == data)
+       {
+          ece->u.server.client_disconnect_callbacks = eina_list_remove_list(ece->u.server.client_disconnect_callbacks,
+                                                                            l);
+          free(c);
+          return ;
+       }
+}
+
+EAPI void
+ecore_con_eet_server_connect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Server *s;
+
+   if (!ece || !func) return ;
+
+   s = calloc(1, sizeof (Ecore_Con_Eet_Server));
+   if (!s) return ;
+
+   s->func = func;
+   s->data = data;
+
+   ece->u.client.server_connect_callbacks = eina_list_append(ece->u.client.server_connect_callbacks, s);
+}
+
+EAPI void
+ecore_con_eet_server_connect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Server *s;
+   Eina_List *l;
+
+   if (!ece || !func) return ;
+
+   EINA_LIST_FOREACH(ece->u.client.server_connect_callbacks, l, s)
+     if (s->func == func && s->data == data)
+       {
+          ece->u.client.server_connect_callbacks = eina_list_remove_list(ece->u.client.server_connect_callbacks, l);
+          free(s);
+          return ;
+       }
+}
+
+EAPI void
+ecore_con_eet_server_disconnect_callback_add(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Server *s;
+
+   if (!ece || !func) return ;
+
+   s = calloc(1, sizeof (Ecore_Con_Eet_Server));
+   if (!s) return ;
+
+   s->func = func;
+   s->data = data;
+
+   ece->u.client.server_disconnect_callbacks = eina_list_append(ece->u.client.server_disconnect_callbacks, s);
+}
+
+EAPI void
+ecore_con_eet_server_disconnect_callback_del(Ecore_Con_Eet *ece, Ecore_Con_Eet_Server_Cb func, const void *data)
+{
+   Ecore_Con_Eet_Server *s;
+   Eina_List *l;
+
+   if (!ece || !func) return ;
+
+   EINA_LIST_FOREACH(ece->u.client.server_disconnect_callbacks, l, s)
+     if (s->func == func && s->data == data)
+       {
+          ece->u.client.server_disconnect_callbacks = eina_list_remove_list(ece->u.client.server_disconnect_callbacks, l);
+          free(s);
+          return ;
+       }
+}
+
+EAPI void
+ecore_con_eet_data_set(Ecore_Con_Eet *ece, const void *data)
+{
+   if (!ece) return;
+
+   ece->data = data;
+}
+
+EAPI void *
+ecore_con_eet_data_get(Ecore_Con_Eet *ece)
+{
+   if (!ece) return NULL;
+   return (void*) ece->data;
+}
+
+EAPI Ecore_Con_Eet *
+ecore_con_eet_reply(Ecore_Con_Reply *reply)
+{
+   if (!reply) return NULL;
+   return reply->ece;
+}
+
+EAPI void
+ecore_con_eet_send(Ecore_Con_Reply *reply, const char *name, void *value)
+{
+   Ecore_Con_Eet_Protocol protocol;
+
+   if (!reply) return ;
+
+   protocol.type = name;
+   protocol.data = value;
+
+   eet_connection_send(reply->econn, reply->ece->edd, &protocol, NULL);
+}
+
+EAPI void
+ecore_con_eet_raw_send(Ecore_Con_Reply *reply, const char *protocol_name, const char *section, void *value, unsigned int length)
+{
+   unsigned int protocol[4];
+   unsigned int protocol_length;
+   unsigned int section_length;
+   unsigned int size;
+   char *tmp;
+
+   if (!reply) return ;
+   if (!protocol_name) return ;
+   if (!section) return ;
+
+   protocol_length = strlen(protocol_name) + 1;
+   if (protocol_length == 1) return ;
+   section_length = strlen(section) + 1;
+
+   protocol[0] = htonl(ECORE_CON_EET_RAW_MAGIC);
+   protocol[1] = htonl(protocol_length);
+   protocol[2] = htonl(section_length);
+   protocol[3] = htonl(length);
+
+   size = sizeof (protocol) + protocol_length + section_length;
+   tmp = alloca(size);
+   memcpy(tmp, protocol, sizeof (protocol));
+   memcpy(tmp + sizeof (protocol), protocol, protocol_length);
+   memcpy(tmp + sizeof (protocol) + protocol_length, section, section_length);
+
+   if (reply->client)
+     {
+        ecore_con_client_send(reply->client, tmp, size);
+        ecore_con_client_send(reply->client, value, length);
+     }
+   else
+     {
+        ecore_con_server_send(reply->ece->server, tmp, size);
+        ecore_con_server_send(reply->ece->server, value, length);
+     }
+}
+
diff --git a/src/lib/ecore_con/ecore_con_info.c b/src/lib/ecore_con/ecore_con_info.c
new file mode 100644 (file)
index 0000000..f51eb26
--- /dev/null
@@ -0,0 +1,472 @@
+/*
+ * getaddrinfo with callback
+ *
+ * man getaddrinfo
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca(size_t);
+#endif
+
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <ctype.h>
+#ifdef __OpenBSD__
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
+#include <errno.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+#include "ecore_con_private.h"
+
+typedef struct _CB_Data CB_Data;
+
+struct _CB_Data
+{
+                        EINA_INLIST;
+   Ecore_Con_Info_Cb    cb_done;
+   void                *data;
+   Ecore_Fd_Handler    *fdh;
+   pid_t                pid;
+   Ecore_Event_Handler *handler;
+   int                  fd2;
+};
+
+static void      _ecore_con_info_readdata(CB_Data *cbdata);
+static void      _ecore_con_info_slave_free(CB_Data *cbdata);
+static Eina_Bool _ecore_con_info_data_handler(void             *data,
+                                              Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_con_info_exit_handler(void    *data,
+                                              int type __UNUSED__,
+                                              void    *event);
+
+static int info_init = 0;
+static CB_Data *info_slaves = NULL;
+
+int
+ecore_con_info_init(void)
+{
+   info_init++;
+   return info_init;
+}
+
+int
+ecore_con_info_shutdown(void)
+{
+   info_init--;
+   if (info_init == 0)
+     while (info_slaves) _ecore_con_info_slave_free(info_slaves);
+
+   return info_init;
+}
+
+int
+ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
+                           Ecore_Con_Info_Cb done_cb,
+                           void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+   hints.ai_family = AF_UNSPEC;
+   hints.ai_socktype = SOCK_STREAM;
+   hints.ai_flags = AI_CANONNAME;
+   hints.ai_protocol = IPPROTO_TCP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
+                          Ecore_Con_Info_Cb done_cb,
+                          void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+   hints.ai_family = AF_UNSPEC;
+   hints.ai_socktype = SOCK_STREAM;
+   hints.ai_flags = AI_PASSIVE;
+   hints.ai_protocol = IPPROTO_TCP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_udp_connect(Ecore_Con_Server *svr,
+                           Ecore_Con_Info_Cb done_cb,
+                           void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+   hints.ai_family = AF_UNSPEC;
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = AI_CANONNAME;
+   hints.ai_protocol = IPPROTO_UDP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_udp_listen(Ecore_Con_Server *svr,
+                          Ecore_Con_Info_Cb done_cb,
+                          void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+   hints.ai_family = AF_UNSPEC;
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = AI_PASSIVE;
+   hints.ai_protocol = IPPROTO_UDP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+int
+ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
+                            Ecore_Con_Info_Cb done_cb,
+                            void             *data)
+{
+   struct addrinfo hints;
+
+   memset(&hints, 0, sizeof(struct addrinfo));
+   hints.ai_family = AF_UNSPEC;
+   hints.ai_socktype = SOCK_DGRAM;
+   hints.ai_flags = 0;
+   hints.ai_protocol = IPPROTO_UDP;
+   hints.ai_canonname = NULL;
+   hints.ai_next = NULL;
+   hints.ai_addr = NULL;
+
+   return ecore_con_info_get(svr, done_cb, data, &hints);
+}
+
+Eina_Bool
+_ecore_fd_close_on_exec(int fd)
+{
+#ifdef HAVE_EXECVP
+   int flags;
+
+   flags = fcntl(fd, F_GETFD);
+   if (flags == -1)
+     return EINA_FALSE;
+
+   flags |= FD_CLOEXEC;
+   if (fcntl(fd, F_SETFD, flags) == -1)
+     return EINA_FALSE;
+   return EINA_TRUE;
+#else
+   (void) fd;
+   return EINA_FALSE;
+#endif
+}
+
+EAPI int
+ecore_con_info_get(Ecore_Con_Server *svr,
+                   Ecore_Con_Info_Cb done_cb,
+                   void             *data,
+                   struct addrinfo  *hints)
+{
+   CB_Data *cbdata;
+   int fd[2];
+
+   if (pipe(fd) < 0)
+     {
+        ecore_con_event_server_error(svr, strerror(errno));
+        return 0;
+     }
+
+   _ecore_fd_close_on_exec(fd[0]);
+   _ecore_fd_close_on_exec(fd[1]);
+
+   cbdata = calloc(1, sizeof(CB_Data));
+   if (!cbdata)
+     {
+        close(fd[0]);
+        close(fd[1]);
+        return 0;
+     }
+
+   cbdata->cb_done = done_cb;
+   cbdata->data = data;
+   cbdata->fd2 = fd[1];
+   if (!(cbdata->fdh = ecore_main_fd_handler_add(fd[0], ECORE_FD_READ,
+                                                 _ecore_con_info_data_handler,
+                                                 cbdata,
+                                                 NULL, NULL)))
+     {
+        ecore_con_event_server_error(svr, "Memory allocation failure");
+        free(cbdata);
+        close(fd[0]);
+        close(fd[1]);
+        return 0;
+     }
+
+   if ((cbdata->pid = fork()) == 0)
+     {
+        Ecore_Con_Info *container;
+        struct addrinfo *result = NULL;
+        char service[NI_MAXSERV] = {0};
+        char hbuf[NI_MAXHOST] = {0};
+        char sbuf[NI_MAXSERV] = {0};
+        unsigned char *tosend = NULL;
+        int tosend_len;
+        int canonname_len = 0;
+
+        eina_convert_itoa(svr->ecs ? svr->ecs->port : svr->port, service);
+        /* CHILD */
+        if (!getaddrinfo(svr->ecs ? svr->ecs->ip : svr->name, service, hints, &result) && result)
+          {
+             if (result->ai_canonname)
+               canonname_len = strlen(result->ai_canonname) + 1;
+
+             tosend_len = sizeof(Ecore_Con_Info) + result->ai_addrlen +
+               canonname_len;
+
+             tosend = alloca(tosend_len);
+             memset(tosend, 0, tosend_len);
+
+             container = (Ecore_Con_Info *)tosend;
+             container->size = tosend_len;
+
+             memcpy(&container->info,
+                    result,
+                    sizeof(struct addrinfo));
+             memcpy(tosend + sizeof(Ecore_Con_Info),
+                    result->ai_addr,
+                    result->ai_addrlen);
+             if (result->ai_canonname) /* FIXME: else... */
+               memcpy(tosend + sizeof(Ecore_Con_Info) + result->ai_addrlen,
+                      result->ai_canonname,
+                      canonname_len);
+
+             if (!getnameinfo(result->ai_addr, result->ai_addrlen,
+                              hbuf, sizeof(hbuf), sbuf, sizeof(sbuf),
+                              NI_NUMERICHOST | NI_NUMERICSERV))
+               {
+                  memcpy(container->ip, hbuf, sizeof(container->ip));
+                  memcpy(container->service, sbuf, sizeof(container->service));
+               }
+
+             if (write(fd[1], tosend, tosend_len) < 0) perror("write");
+          }
+
+        if (result)
+          freeaddrinfo(result);
+
+        if (write(fd[1], "", 1) < 0) perror("write");
+        close(fd[1]);
+#if defined(__USE_ISOC99) && !defined(__UCLIBC__)
+        _Exit(0);
+#else
+        _exit(0);
+#endif
+     }
+
+   /* PARENT */
+   cbdata->handler =
+     ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_info_exit_handler,
+                             cbdata);
+   close(fd[1]);
+   if (!cbdata->handler)
+     {
+        ecore_main_fd_handler_del(cbdata->fdh);
+        free(cbdata);
+        close(fd[0]);
+        return 0;
+     }
+
+   info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET(
+                                                 info_slaves),
+                                               EINA_INLIST_GET(cbdata));
+   svr->infos = eina_list_append(svr->infos, cbdata);
+   return 1;
+}
+
+void
+ecore_con_info_data_clear(void *info)
+{
+   CB_Data *cbdata = info;
+   cbdata->data = NULL;
+}
+
+static void
+_ecore_con_info_readdata(CB_Data *cbdata)
+{
+   Ecore_Con_Info container;
+   Ecore_Con_Info *recv_info;
+   unsigned char *torecv;
+   int torecv_len;
+
+   ssize_t size;
+
+   size = read(ecore_main_fd_handler_fd_get(cbdata->fdh), &container,
+               sizeof(Ecore_Con_Info));
+   if (size == sizeof(Ecore_Con_Info))
+     {
+        torecv_len = container.size;
+        torecv = malloc(torecv_len);
+
+        memcpy(torecv, &container, sizeof(Ecore_Con_Info));
+
+        size = read(ecore_main_fd_handler_fd_get(cbdata->fdh),
+                    torecv + sizeof(Ecore_Con_Info),
+                    torecv_len - sizeof(Ecore_Con_Info));
+        if ((size > 0) &&
+            ((size_t)size == torecv_len - sizeof(Ecore_Con_Info)))
+          {
+             recv_info = (Ecore_Con_Info *)torecv;
+
+             recv_info->info.ai_addr =
+               (struct sockaddr *)(torecv + sizeof(Ecore_Con_Info));
+             if ((size_t)torecv_len !=
+                 (sizeof(Ecore_Con_Info) + recv_info->info.ai_addrlen))
+               recv_info->info.ai_canonname = (char *)
+                 (torecv + sizeof(Ecore_Con_Info) + recv_info->info.ai_addrlen);
+             else
+               recv_info->info.ai_canonname = NULL;
+
+             recv_info->info.ai_next = NULL;
+
+             if (cbdata->data)
+               {
+                  cbdata->cb_done(cbdata->data, recv_info);
+                  ecore_con_server_infos_del(cbdata->data, cbdata);
+               }
+
+             free(torecv);
+          }
+        else
+          {
+             if (cbdata->data)
+               {
+                  cbdata->cb_done(cbdata->data, NULL);
+                  ecore_con_server_infos_del(cbdata->data, cbdata);
+               }
+          }
+     }
+   else
+     {
+        if (cbdata->data)
+          {
+             ecore_con_event_server_error(cbdata->data, strerror(errno));
+             cbdata->cb_done(cbdata->data, NULL);
+             ecore_con_server_infos_del(cbdata->data, cbdata);
+          }
+     }
+
+   cbdata->cb_done = NULL;
+}
+
+static void
+_ecore_con_info_slave_free(CB_Data *cbdata)
+{
+   info_slaves = (CB_Data *)eina_inlist_remove(EINA_INLIST_GET(info_slaves),
+                                               EINA_INLIST_GET(cbdata));
+   ecore_main_fd_handler_del(cbdata->fdh);
+   ecore_event_handler_del(cbdata->handler);
+   close(ecore_main_fd_handler_fd_get(cbdata->fdh));
+   if (cbdata->data) ecore_con_server_infos_del(cbdata->data, cbdata);
+   free(cbdata);
+}
+
+static Eina_Bool
+_ecore_con_info_data_handler(void             *data,
+                             Ecore_Fd_Handler *fd_handler)
+{
+   CB_Data *cbdata;
+
+   cbdata = data;
+   if (cbdata->cb_done)
+     {
+        if (ecore_main_fd_handler_active_get(fd_handler,
+                                             ECORE_FD_READ))
+          _ecore_con_info_readdata(cbdata);
+        else
+          {
+             if (cbdata->data)
+               {
+                  cbdata->cb_done(cbdata->data, NULL);
+                  cbdata->cb_done = NULL;
+                  ecore_con_server_infos_del(cbdata->data, cbdata);
+               }
+          }
+     }
+
+   _ecore_con_info_slave_free(cbdata);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_ecore_con_info_exit_handler(void    *data,
+                             int type __UNUSED__,
+                             void    *event)
+{
+   CB_Data *cbdata;
+   Ecore_Exe_Event_Del *ev;
+
+   ev = event;
+   cbdata = data;
+   if (cbdata->pid != ev->pid)
+     return ECORE_CALLBACK_RENEW;
+
+   return ECORE_CALLBACK_CANCEL; /* FIXME: Woot ??? */
+   _ecore_con_info_slave_free(cbdata);
+   return ECORE_CALLBACK_CANCEL;
+}
+
diff --git a/src/lib/ecore_con/ecore_con_local.c b/src/lib/ecore_con/ecore_con_local.c
new file mode 100644 (file)
index 0000000..ac97fb1
--- /dev/null
@@ -0,0 +1,325 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_ERRNO_H
+# include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+
+#ifdef HAVE_SYS_UN_H
+# include <sys/un.h>
+#endif
+
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+
+#include <Ecore.h>
+#include <ecore_private.h>
+
+#include "Ecore_Con.h"
+#include "ecore_con_private.h"
+
+#define LENGTH_OF_SOCKADDR_UN(s)                (strlen((s)->sun_path) +                 \
+                                                 (size_t)(((struct sockaddr_un *)NULL)-> \
+                                                          sun_path))
+#define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 +            \
+                                                 (size_t)(((struct sockaddr_un \
+                                                            *)NULL)->sun_path))
+
+static int _ecore_con_local_init_count = 0;
+
+int
+ecore_con_local_init(void)
+{
+   if (++_ecore_con_local_init_count != 1)
+     return _ecore_con_local_init_count;
+
+   return _ecore_con_local_init_count;
+}
+
+int
+ecore_con_local_shutdown(void)
+{
+   if (--_ecore_con_local_init_count != 0)
+     return _ecore_con_local_init_count;
+
+   return _ecore_con_local_init_count;
+}
+
+int
+ecore_con_local_connect(Ecore_Con_Server *svr,
+                        Eina_Bool (*cb_done)(void *data, Ecore_Fd_Handler *fd_handler),
+                        void *data __UNUSED__)
+{
+#ifndef HAVE_LOCAL_SOCKETS
+   return 0;
+#else
+   char buf[4096];
+   struct sockaddr_un socket_unix;
+   int curstate = 0;
+   const char *homedir;
+   int socket_unix_len;
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
+     {
+        homedir = getenv("HOME");
+        if (!homedir)
+          homedir = getenv("TMP");
+
+        if (!homedir)
+          homedir = "/tmp";
+
+        snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, svr->name,
+                 svr->port);
+     }
+   else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
+     {
+        if (svr->port < 0)
+          {
+             if (svr->name[0] == '/')
+               strncpy(buf, svr->name, sizeof(buf));
+             else
+               snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s", svr->name);
+          }
+        else
+          {
+             if (svr->name[0] ==
+                 '/')
+               snprintf(buf, sizeof(buf), "%s|%i", svr->name,
+                        svr->port);
+             else
+               snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i",
+                        svr->name,
+                        svr->port);
+          }
+     }
+   else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     strncpy(buf, svr->name,
+             sizeof(buf));
+
+   svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+   if (svr->fd < 0)
+     return 0;
+
+   if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
+     return 0;
+
+   if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
+     return 0;
+
+   if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate,
+                  sizeof(curstate)) < 0)
+     return 0;
+
+   socket_unix.sun_family = AF_UNIX;
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     {
+#ifdef HAVE_ABSTRACT_SOCKETS
+        /* copy name insto sun_path, prefixed by null to indicate abstract namespace */
+        snprintf(socket_unix.sun_path, sizeof(socket_unix.sun_path), ".%s",
+                 svr->name);
+        socket_unix.sun_path[0] = '\0';
+        socket_unix_len = LENGTH_OF_ABSTRACT_SOCKADDR_UN(&socket_unix,
+                                                         svr->name);
+#else
+        WRN("Your system does not support abstract sockets!");
+        return 0;
+#endif
+     }
+   else
+     {
+        strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+        socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+     }
+
+   if (connect(svr->fd, (struct sockaddr *)&socket_unix,
+               socket_unix_len) < 0)
+     {
+        ERR("local connection failed: %s", strerror(errno));
+        return 0;
+     }
+
+   svr->path = strdup(buf);
+   if (!svr->path)
+     return 0;
+
+   if (svr->type & ECORE_CON_SSL)
+     ecore_con_ssl_server_init(svr);
+
+   svr->fd_handler =
+     ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
+                               cb_done, svr, NULL, NULL);
+   if (!svr->fd_handler)
+     return 0;
+
+   if (!svr->delete_me) ecore_con_event_server_add(svr);
+
+   return 1;
+#endif
+}
+
+int
+ecore_con_local_listen(
+  Ecore_Con_Server *svr,
+  Eina_Bool         (*
+                     cb_listen)(void *data,
+                                Ecore_Fd_Handler *
+                                fd_handler),
+  void *data
+  __UNUSED__)
+{
+#ifdef HAVE_LOCAL_SOCKETS
+   char buf[4096];
+   struct sockaddr_un socket_unix;
+   struct linger lin;
+   mode_t pmode;
+   const char *homedir;
+   struct stat st;
+   mode_t mask;
+   int socket_unix_len;
+
+   mask = S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH;
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
+     {
+        homedir = getenv("HOME");
+        if (!homedir)
+          homedir = getenv("TMP");
+
+        if (!homedir)
+          homedir = "/tmp";
+
+        mask = S_IRUSR | S_IWUSR | S_IXUSR;
+        snprintf(buf, sizeof(buf), "%s/.ecore", homedir);
+        if (stat(buf, &st) < 0)
+          mkdir(buf, mask);
+
+        snprintf(buf, sizeof(buf), "%s/.ecore/%s", homedir, svr->name);
+        if (stat(buf, &st) < 0)
+          mkdir(buf, mask);
+
+        snprintf(buf,
+                 sizeof(buf),
+                 "%s/.ecore/%s/%i",
+                 homedir,
+                 svr->name,
+                 svr->port);
+        mask = S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH;
+     }
+   else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
+     {
+        mask = 0;
+        if (svr->name[0] == '/')
+          {
+             if (svr->port >= 0)
+               snprintf(buf,
+                        sizeof(buf),
+                        "%s|%i",
+                        svr->name,
+                        svr->port);
+             else
+               snprintf(buf,
+                        sizeof(buf),
+                        "%s",
+                        svr->name);
+          }
+        else
+          snprintf(buf,
+                   sizeof(buf),
+                   "/tmp/.ecore_service|%s|%i",
+                   svr->name,
+                   svr->port);
+     }
+   else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     strncpy(buf, svr->name,
+             sizeof(buf));
+
+   pmode = umask(mask);
+start:
+   svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+   if (svr->fd < 0)
+     goto error_umask;
+
+   if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
+     goto error_umask;
+
+   if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
+     goto error_umask;
+
+   lin.l_onoff = 1;
+   lin.l_linger = 0;
+   if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin,
+                  sizeof(struct linger)) < 0)
+     goto error_umask;
+
+   socket_unix.sun_family = AF_UNIX;
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     {
+#ifdef HAVE_ABSTRACT_SOCKETS
+        /* . is a placeholder */
+        snprintf(socket_unix.sun_path, sizeof(socket_unix.sun_path), ".%s",
+                 svr->name);
+        /* first char null indicates abstract namespace */
+        socket_unix.sun_path[0] = '\0';
+        socket_unix_len = LENGTH_OF_ABSTRACT_SOCKADDR_UN(&socket_unix,
+                                                         svr->name);
+#else
+        ERR("Your system does not support abstract sockets!");
+        goto error_umask;
+#endif
+     }
+   else
+     {
+        strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+        socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+     }
+
+   if (bind(svr->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
+     {
+        if ((((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER) ||
+             ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)) &&
+            (connect(svr->fd, (struct sockaddr *)&socket_unix,
+                     socket_unix_len) < 0) &&
+            (unlink(buf) >= 0))
+          goto start;
+        else
+          goto error_umask;
+     }
+
+   if (listen(svr->fd, 4096) < 0)
+     goto error_umask;
+
+   svr->path = strdup(buf);
+   if (!svr->path)
+     goto error_umask;
+
+   svr->fd_handler =
+     ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
+                               cb_listen, svr, NULL, NULL);
+   umask(pmode);
+   if (!svr->fd_handler)
+     goto error;
+
+   return 1;
+
+error_umask:
+   umask(pmode);
+error:
+#endif /* HAVE_LOCAL_SOCKETS */
+   return 0;
+}
+
diff --git a/src/lib/ecore_con/ecore_con_local_win32.c b/src/lib/ecore_con/ecore_con_local_win32.c
new file mode 100644 (file)
index 0000000..2b7e5c5
--- /dev/null
@@ -0,0 +1,754 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <process.h>
+
+#include <Evil.h>
+#include <Ecore.h>
+
+#include "Ecore_Con.h"
+#include "ecore_con_private.h"
+
+#define BUFSIZE 512
+
+
+static int _ecore_con_local_init_count = 0;
+
+int
+ecore_con_local_init(void)
+{
+   if (++_ecore_con_local_init_count != 1)
+     return _ecore_con_local_init_count;
+
+   return _ecore_con_local_init_count;
+}
+
+int
+ecore_con_local_shutdown(void)
+{
+   if (--_ecore_con_local_init_count != 0)
+     return _ecore_con_local_init_count;
+
+   return _ecore_con_local_init_count;
+}
+
+
+static Eina_Bool
+_ecore_con_local_win32_server_read_client_handler(void *data, Ecore_Win32_Handler *wh)
+{
+  Ecore_Con_Client *cl;
+  void *buf;
+  DWORD n;
+  Eina_Bool broken_pipe = EINA_FALSE;
+
+  cl = (Ecore_Con_Client *)data;
+
+  if (!ResetEvent(cl->host_server->event_read))
+    return ECORE_CALLBACK_RENEW;
+
+  buf = malloc(cl->host_server->nbr_bytes);
+  if (!buf)
+    return ECORE_CALLBACK_RENEW;
+
+  if (ReadFile(cl->host_server->pipe, buf, cl->host_server->nbr_bytes, &n, NULL))
+    {
+       if (!cl->delete_me)
+         ecore_con_event_client_data(cl, buf, cl->host_server->nbr_bytes, EINA_FALSE);
+       cl->host_server->want_write = 1;
+    }
+  else
+    {
+      if (GetLastError() == ERROR_BROKEN_PIPE)
+        broken_pipe = EINA_TRUE;
+    }
+
+  if (broken_pipe)
+    {
+#if 0
+       char *msg;
+
+       msg = evil_last_error_get();
+       if (msg)
+         {
+            ecore_con_event_client_error(cl, msg);
+            free(msg);
+         }
+#endif
+       _ecore_con_client_kill(cl);
+       return ECORE_CALLBACK_CANCEL;
+    }
+
+  if (cl->host_server->want_write)
+    ecore_con_local_win32_client_flush(cl);
+
+   ecore_main_win32_handler_del(wh);
+
+  return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_ecore_con_local_win32_server_peek_client_handler(void *data, Ecore_Win32_Handler *wh)
+{
+   Ecore_Con_Client *cl;
+#if 0
+   char *msg;
+#endif
+
+   cl = (Ecore_Con_Client *)data;
+
+   if (!ResetEvent(cl->host_server->event_peek))
+     return ECORE_CALLBACK_RENEW;
+
+#if 0
+   msg = evil_last_error_get();
+   if (msg)
+     {
+        ecore_con_event_server_error(cl->host_server, msg);
+        free(msg);
+     }
+#endif
+   _ecore_con_server_kill(cl->host_server);
+   return ECORE_CALLBACK_CANCEL;
+
+   ecore_main_win32_handler_del(wh);
+
+   return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_ecore_con_local_win32_client_peek_server_handler(void *data, Ecore_Win32_Handler *wh)
+{
+   Ecore_Con_Server *svr;
+#if 0
+   char *msg;
+#endif
+
+   svr = (Ecore_Con_Server *)data;
+
+   if (!ResetEvent(svr->event_peek))
+     return ECORE_CALLBACK_RENEW;
+#if 0
+   msg = evil_last_error_get();
+   if (msg)
+     {
+        ecore_con_event_server_error(svr, msg);
+        free(msg);
+     }
+#endif
+   _ecore_con_server_kill(svr);
+   return ECORE_CALLBACK_CANCEL;
+
+   ecore_main_win32_handler_del(wh);
+
+   return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_ecore_con_local_win32_client_read_server_handler(void *data, Ecore_Win32_Handler *wh)
+{
+  Ecore_Con_Server *svr;
+  void *buf;
+  DWORD n;
+  Eina_Bool broken_pipe = EINA_FALSE;
+
+  svr = (Ecore_Con_Server *)data;
+
+  if (!ResetEvent(svr->event_read))
+    return ECORE_CALLBACK_RENEW;
+
+  buf = malloc(svr->nbr_bytes);
+  if (!buf)
+    return ECORE_CALLBACK_RENEW;
+
+  if (ReadFile(svr->pipe, buf, svr->nbr_bytes, &n, NULL))
+    {
+       if (!svr->delete_me)
+         ecore_con_event_server_data(svr, buf, svr->nbr_bytes, EINA_FALSE);
+       svr->want_write = 1;
+    }
+  else
+    {
+      if (GetLastError() == ERROR_BROKEN_PIPE)
+        broken_pipe = EINA_TRUE;
+    }
+
+  if (broken_pipe)
+    {
+#if 0
+       char *msg;
+
+       msg = evil_last_error_get();
+       if (msg)
+         {
+            ecore_con_event_server_error(svr, msg);
+            free(msg);
+         }
+#endif
+       _ecore_con_server_kill(svr);
+       return ECORE_CALLBACK_CANCEL;
+    }
+
+  if (svr->want_write)
+    ecore_con_local_win32_server_flush(svr);
+
+   ecore_main_win32_handler_del(wh);
+
+  return ECORE_CALLBACK_DONE;
+}
+
+/* thread to read data sent by the server to the client */
+static unsigned int __stdcall
+_ecore_con_local_win32_client_read_server_thread(void *data)
+{
+   Ecore_Con_Server *svr;
+   DWORD nbr_bytes = 0;
+
+   svr = (Ecore_Con_Server *)data;
+
+   svr->read_stopped = EINA_FALSE;
+
+   while (!svr->read_stop)
+     {
+        if (PeekNamedPipe(svr->pipe, NULL, 0, NULL, &nbr_bytes, NULL))
+          {
+             if (nbr_bytes <= 0)
+               continue;
+
+             svr->nbr_bytes = nbr_bytes;
+             if (!SetEvent(svr->event_read))
+               continue;
+          }
+        else
+          {
+             if (GetLastError() == ERROR_BROKEN_PIPE)
+               {
+                  if (!SetEvent(svr->event_peek))
+                    continue;
+                  break;
+               }
+          }
+     }
+
+   printf(" ### %s\n", __FUNCTION__);
+   svr->read_stopped = EINA_TRUE;
+   _endthreadex(0);
+   return 0;
+}
+
+/* thread to read data sent by the client to the server */
+static unsigned int __stdcall
+_ecore_con_local_win32_server_read_client_thread(void *data)
+{
+   Ecore_Con_Client *cl;
+   DWORD nbr_bytes = 0;
+
+   cl = (Ecore_Con_Client *)data;
+
+   cl->host_server->read_stopped = EINA_FALSE;
+
+   while (!cl->host_server->read_stop)
+     {
+        if (PeekNamedPipe(cl->host_server->pipe, NULL, 0, NULL, &nbr_bytes, NULL))
+          {
+             if (nbr_bytes <= 0)
+               continue;
+
+             cl->host_server->nbr_bytes = nbr_bytes;
+             if (!SetEvent(cl->host_server->event_read))
+               continue;
+          }
+        else
+          {
+             if (GetLastError() == ERROR_BROKEN_PIPE)
+               {
+                  if (!SetEvent(cl->host_server->event_peek))
+                    continue;
+                  break;
+               }
+          }
+     }
+
+   printf(" ### %s\n", __FUNCTION__);
+   cl->host_server->read_stopped = EINA_TRUE;
+   _endthreadex(0);
+   return 0;
+}
+
+static Eina_Bool
+_ecore_con_local_win32_client_add(void *data, Ecore_Win32_Handler *wh)
+{
+   Ecore_Con_Client *cl = NULL;
+   Ecore_Con_Server *svr;
+   Ecore_Win32_Handler *handler_read;
+   Ecore_Win32_Handler *handler_peek;
+
+   svr = (Ecore_Con_Server *)data;
+
+   if (!svr->pipe)
+     return ECORE_CALLBACK_CANCEL;
+
+   if (svr->delete_me)
+     return ECORE_CALLBACK_CANCEL;
+
+   if ((svr->client_limit >= 0) && (!svr->reject_excess_clients) &&
+       (svr->client_count >= (unsigned int)svr->client_limit))
+     return ECORE_CALLBACK_CANCEL;
+
+   cl = calloc(1, sizeof(Ecore_Con_Client));
+   if (!cl)
+     {
+        ERR("allocation failed");
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   cl->host_server = svr;
+   ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
+
+   cl->host_server->event_read = CreateEvent(NULL, TRUE, FALSE, NULL);
+   if (!cl->host_server->event_read)
+     {
+        ERR("Can not create event read");
+        goto free_cl;
+     }
+
+   handler_read = ecore_main_win32_handler_add(cl->host_server->event_read,
+                                               _ecore_con_local_win32_server_read_client_handler,
+                                               cl);
+   if (!handler_read)
+     {
+        ERR("Can not create handler read");
+        goto close_event_read;
+     }
+
+   cl->host_server->event_peek = CreateEvent(NULL, TRUE, FALSE, NULL);
+   if (!cl->host_server->event_peek)
+     {
+        ERR("Can not create event peek");
+        goto del_handler_read;
+     }
+
+   handler_peek = ecore_main_win32_handler_add(cl->host_server->event_peek,
+                                               _ecore_con_local_win32_server_peek_client_handler,
+                                               cl);
+   if (!handler_peek)
+     {
+        ERR("Can not create handler peek");
+        goto close_event_peek;
+     }
+
+   cl->host_server->read_stopped = EINA_TRUE;
+   cl->host_server->thread_read = (HANDLE)_beginthreadex(NULL, 0, _ecore_con_local_win32_server_read_client_thread, cl, CREATE_SUSPENDED, NULL);
+   if (!cl->host_server->thread_read)
+     {
+        ERR("Can not launch thread");
+        goto del_handler_peek;
+     }
+
+   svr->clients = eina_list_append(svr->clients, cl);
+   svr->client_count++;
+
+   if (!cl->delete_me)
+     ecore_con_event_client_add(cl);
+
+   ecore_main_win32_handler_del(wh);
+
+   ResumeThread(cl->host_server->thread_read);
+   return ECORE_CALLBACK_DONE;
+
+ del_handler_peek:
+   ecore_main_win32_handler_del(handler_peek);
+ close_event_peek:
+   CloseHandle(cl->host_server->event_peek);
+ del_handler_read:
+   ecore_main_win32_handler_del(handler_read);
+ close_event_read:
+   CloseHandle(cl->host_server->event_read);
+ free_cl:
+   free(cl);
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static unsigned int __stdcall
+_ecore_con_local_win32_listening(void *data)
+{
+   Ecore_Con_Server *svr;
+   BOOL res;
+
+   svr = (Ecore_Con_Server *)data;
+
+   while (1)
+     {
+        res = ConnectNamedPipe(svr->pipe, NULL);
+        if (!res)
+          {
+             ERR("Opening the connection to the client failed");
+             CloseHandle(svr->pipe);
+             svr->pipe = NULL;
+          }
+        break;
+     }
+
+   DBG("Client connected");
+
+   printf(" ### %s\n", __FUNCTION__);
+   _endthreadex(0);
+   return 0;
+}
+
+Eina_Bool
+ecore_con_local_listen(Ecore_Con_Server *svr)
+{
+   char buf[256];
+   HANDLE thread_listening;
+   Ecore_Win32_Handler *handler;
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     {
+        ERR("Your system does not support abstract sockets!");
+        return EINA_FALSE;
+     }
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
+     snprintf(buf, sizeof(buf), "\\\\.\\pipe\\%s", svr->name);
+   else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
+     {
+        const char *computername;
+
+        computername = getenv("CoMPUTERNAME");
+        snprintf(buf, sizeof(buf), "\\\\%s\\pipe\\%s", computername, svr->name);
+     }
+
+   svr->path = strdup(buf);
+   if (!svr->path)
+     {
+        ERR("Allocation failed");
+        return EINA_FALSE;
+     }
+
+   /*
+    * synchronuous
+    * block mode
+    * wait mode
+    */
+   svr->pipe = CreateNamedPipe(svr->path,
+                               PIPE_ACCESS_DUPLEX,
+                               PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
+                               PIPE_UNLIMITED_INSTANCES,
+                               BUFSIZE,
+                               BUFSIZE,
+                               5000,
+                               NULL);
+   if (svr->pipe == INVALID_HANDLE_VALUE)
+     {
+        ERR("Creation of the named pipe failed");
+        goto free_path;
+     }
+
+   /*
+    * We use ConnectNamedPipe() to wait for a client to connect.
+    * As the function is blocking, to let the main loop continuing
+    * its iterations, we call ConnectNamedPipe() in a thread
+    */
+   thread_listening = (HANDLE)_beginthreadex(NULL, 0, _ecore_con_local_win32_listening, svr, CREATE_SUSPENDED, NULL);
+   if (!thread_listening)
+     {
+        ERR("Creation of the listening thread failed");
+        goto close_pipe;
+     }
+
+   handler = ecore_main_win32_handler_add(thread_listening,
+                                          _ecore_con_local_win32_client_add,
+                                          svr);
+   if (!handler)
+     {
+        ERR("Creation of the client add handler failed");
+        goto del_handler;
+     }
+
+   svr->read_stopped = EINA_TRUE;
+   ResumeThread(thread_listening);
+
+   return EINA_TRUE;
+
+ del_handler:
+   ecore_main_win32_handler_del(handler);
+ close_pipe:
+   CloseHandle(svr->pipe);
+ free_path:
+   free(svr->path);
+   svr->path = NULL;
+
+   return EINA_FALSE;
+}
+
+void
+ecore_con_local_win32_server_del(Ecore_Con_Server *svr)
+{
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     return;
+
+   if (((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_USER) &&
+       ((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_SYSTEM))
+     return;
+
+   svr->read_stop = 1;
+   while (!svr->read_stopped)
+     Sleep(100);
+
+   if (svr->event_peek)
+     CloseHandle(svr->event_peek);
+   svr->event_peek = NULL;
+   if (svr->event_read)
+     CloseHandle(svr->event_read);
+   svr->event_read = NULL;
+   free(svr->path);
+   svr->path = NULL;
+   if (svr->pipe)
+     CloseHandle(svr->pipe);
+   svr->pipe = NULL;
+}
+
+void
+ecore_con_local_win32_client_del(Ecore_Con_Client *cl)
+{
+   if ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     return;
+
+   if (((cl->host_server->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_USER) &&
+       ((cl->host_server->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_SYSTEM))
+     return;
+
+   cl->host_server->read_stop = 1;
+   while (!cl->host_server->read_stopped)
+     Sleep(100);
+
+   if (cl->host_server->event_peek)
+     CloseHandle(cl->host_server->event_peek);
+   cl->host_server->event_peek = NULL;
+   if (cl->host_server->event_read)
+     CloseHandle(cl->host_server->event_read);
+   cl->host_server->event_read = NULL;
+   free(cl->host_server->path);
+   cl->host_server->path = NULL;
+   if (cl->host_server->pipe)
+     CloseHandle(cl->host_server->pipe);
+   cl->host_server->pipe = NULL;
+}
+
+Eina_Bool
+ecore_con_local_connect(Ecore_Con_Server *svr,
+                        Eina_Bool (*cb_done)(void *data,
+                                             Ecore_Fd_Handler *fd_handler))
+{
+   char buf[256];
+   Ecore_Win32_Handler *handler_read;
+   Ecore_Win32_Handler *handler_peek;
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     {
+        ERR("Your system does not support abstract sockets!");
+        return EINA_FALSE;
+     }
+
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
+     snprintf(buf, sizeof(buf), "\\\\.\\pipe\\%s", svr->name);
+   else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
+     {
+        const char *computername;
+
+        computername = getenv("COMPUTERNAME");
+        snprintf(buf, sizeof(buf), "\\\\%s\\pipe\\%s", computername, svr->name);
+     }
+
+   while (1)
+     {
+        svr->pipe = CreateFile(buf,
+                               GENERIC_READ | GENERIC_WRITE,
+                               0,
+                               NULL,
+                               OPEN_EXISTING,
+                               0,
+                               NULL);
+        if (svr->pipe != INVALID_HANDLE_VALUE)
+          break;
+
+        /* if pipe not busy, we exit */
+        if (GetLastError() != ERROR_PIPE_BUSY)
+          {
+             ERR("Connection to a server failed");
+             return EINA_FALSE;
+        }
+
+        /* pipe busy, so we wait for it */
+        if (!WaitNamedPipe(buf, NMPWAIT_WAIT_FOREVER))
+          {
+             ERR("Can not wait for a server");
+             goto close_pipe;
+          }
+     }
+
+   svr->path = strdup(buf);
+   if (!svr->path)
+     {
+        ERR("Allocation failed");
+        goto close_pipe;
+     }
+
+   svr->event_read = CreateEvent(NULL, TRUE, FALSE, NULL);
+   if (!svr->event_read)
+     {
+        ERR("Can not create event read");
+        goto free_path;
+     }
+
+   handler_read = ecore_main_win32_handler_add(svr->event_read,
+                                               _ecore_con_local_win32_client_read_server_handler,
+                                               svr);
+   if (!handler_read)
+     {
+        ERR("Can not create handler read");
+        goto close_event_read;
+     }
+
+   svr->event_peek = CreateEvent(NULL, TRUE, FALSE, NULL);
+   if (!svr->event_peek)
+     {
+        ERR("Can not create event peek");
+        goto del_handler_read;
+     }
+
+   handler_peek = ecore_main_win32_handler_add(svr->event_peek,
+                                               _ecore_con_local_win32_client_peek_server_handler,
+                                               svr);
+   if (!handler_peek)
+     {
+        ERR("Can not create handler peek");
+        goto close_event_peek;
+     }
+
+   svr->thread_read = (HANDLE)_beginthreadex(NULL, 0, _ecore_con_local_win32_client_read_server_thread, svr, CREATE_SUSPENDED, NULL);
+   if (!svr->thread_read)
+     {
+        ERR("Can not launch thread");
+        goto del_handler_peek;
+     }
+
+   if (!svr->delete_me) ecore_con_event_server_add(svr);
+
+   ResumeThread(svr->thread_read);
+
+   return EINA_TRUE;
+
+ del_handler_peek:
+   ecore_main_win32_handler_del(handler_peek);
+ close_event_peek:
+   CloseHandle(svr->event_peek);
+ del_handler_read:
+   ecore_main_win32_handler_del(handler_read);
+ close_event_read:
+   CloseHandle(svr->event_read);
+ free_path:
+   free(svr->path);
+   svr->path = NULL;
+ close_pipe:
+   CloseHandle(svr->pipe);
+
+   return EINA_FALSE;
+}
+
+Eina_Bool
+ecore_con_local_win32_server_flush(Ecore_Con_Server *svr)
+{
+   int num;
+   BOOL res;
+   DWORD written;
+
+   /* This check should never be true */
+   if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
+     return EINA_TRUE;
+
+   if (((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_USER) &&
+       ((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_SYSTEM))
+     return EINA_FALSE;
+
+   num = eina_binbuf_length_get(svr->buf) - svr->write_buf_offset;
+   if (num <= 0) return EINA_TRUE;
+
+   res = WriteFile(svr->pipe, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num, &written, NULL);
+   if (!res)
+     {
+        char *msg;
+
+        msg = evil_last_error_get();
+        if (msg)
+          {
+             ecore_con_event_server_error(svr, msg);
+             free(msg);
+          }
+        _ecore_con_server_kill(svr);
+     }
+
+   svr->write_buf_offset += written;
+   if (svr->write_buf_offset >= eina_binbuf_length_get(svr->buf))
+     {
+        svr->write_buf_offset = 0;
+        eina_binbuf_free(svr->buf);
+        svr->buf = NULL;
+        svr->want_write = 0;
+     }
+   else if (written < (DWORD)num)
+     svr->want_write = 1;
+
+   return EINA_TRUE;
+}
+
+Eina_Bool
+ecore_con_local_win32_client_flush(Ecore_Con_Client *cl)
+{
+   Ecore_Con_Type type;
+   int num;
+   BOOL res;
+   DWORD written;
+
+   type = cl->host_server->type & ECORE_CON_TYPE;
+
+   /* This check should never be true */
+   if (type == ECORE_CON_LOCAL_ABSTRACT)
+     return EINA_TRUE;
+
+   if ((type != ECORE_CON_LOCAL_USER) &&
+       (type != ECORE_CON_LOCAL_SYSTEM))
+     return EINA_FALSE;
+
+   num = eina_binbuf_length_get(cl->buf) - cl->buf_offset;
+   if (num <= 0) return EINA_TRUE;
+
+   res = WriteFile(cl->host_server->pipe, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num, &written, NULL);
+   if (!res)
+     {
+        char *msg;
+
+        msg = evil_last_error_get();
+        if (msg)
+          {
+             ecore_con_event_client_error(cl, msg);
+             free(msg);
+          }
+        _ecore_con_client_kill(cl);
+     }
+
+   cl->buf_offset += written;
+   if (cl->buf_offset >= eina_binbuf_length_get(cl->buf))
+     {
+        cl->buf_offset = 0;
+        eina_binbuf_free(cl->buf);
+        cl->buf = NULL;
+        cl->host_server->want_write = 0;
+     }
+   else if (written < (DWORD)num)
+     cl->host_server->want_write = 1;
+
+   return EINA_TRUE;
+}
index d5d9258..26e9970 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef _ECORE_CON_PRIVATE_H
 #define _ECORE_CON_PRIVATE_H
 
+#include "ecore_private.h"
 #include "Ecore_Con.h"
-#include "Ecore_Data.h"
 
 #define ECORE_MAGIC_CON_SERVER             0x77665544
 #define ECORE_MAGIC_CON_CLIENT             0x77556677
 
 #define ECORE_CON_TYPE 0x0f
 #define ECORE_CON_SSL  0xf0
+#define ECORE_CON_SUPER_SSL  0xf00
 
-#if USE_OPENSSL
-#include <openssl/ssl.h>
+#if USE_GNUTLS
+# include <gnutls/gnutls.h>
+#elif USE_OPENSSL
+# include <openssl/ssl.h>
 #endif
 #ifdef HAVE_CURL
 #include <curl/curl.h>
 
 #define READBUFSIZ 65536
 
+extern int _ecore_con_log_dom;
+
+#ifdef ECORE_CON_DEFAULT_LOG_COLOR
+#undef ECORE_LOG_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_CON_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_con_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_con_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_con_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_con_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_con_log_dom, __VA_ARGS__)
+
+typedef struct _Ecore_Con_Lookup Ecore_Con_Lookup;
+typedef struct _Ecore_Con_Info Ecore_Con_Info;
+typedef struct Ecore_Con_Socks Ecore_Con_Socks_v4;
+typedef struct Ecore_Con_Socks_v5 Ecore_Con_Socks_v5;
+typedef void (*Ecore_Con_Info_Cb)(void *data, Ecore_Con_Info *infos);
+
+typedef enum _Ecore_Con_State
+{
+   ECORE_CON_CONNECTED,
+   ECORE_CON_DISCONNECTED,
+   ECORE_CON_INPROGRESS
+} Ecore_Con_State;
+
+typedef enum _Ecore_Con_Ssl_Error
+{
+   ECORE_CON_SSL_ERROR_NONE = 0,
+   ECORE_CON_SSL_ERROR_NOT_SUPPORTED,
+   ECORE_CON_SSL_ERROR_INIT_FAILED,
+   ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED,
+   ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED
+} Ecore_Con_Ssl_Error;
+
+typedef enum _Ecore_Con_Ssl_Handshake
+{
+   ECORE_CON_SSL_STATE_DONE = 0,
+   ECORE_CON_SSL_STATE_HANDSHAKING,
+   ECORE_CON_SSL_STATE_INIT
+} Ecore_Con_Ssl_State;
+
+typedef enum Ecore_Con_Proxy_State
+{  /* named PROXY instead of SOCKS in case some handsome and enterprising
+    * developer decides to add HTTP CONNECT support
+    */
+   ECORE_CON_PROXY_STATE_DONE = 0,
+   ECORE_CON_PROXY_STATE_RESOLVED,
+   ECORE_CON_PROXY_STATE_INIT,
+   ECORE_CON_PROXY_STATE_READ,
+   ECORE_CON_PROXY_STATE_AUTH,
+   ECORE_CON_PROXY_STATE_REQUEST,
+   ECORE_CON_PROXY_STATE_CONFIRM,
+} Ecore_Con_Proxy_State;
+
 struct _Ecore_Con_Client
 {
    ECORE_MAGIC;
-   int               fd;
-   Ecore_Con_Server *server;
-   void             *data;
+   int fd;
+   Ecore_Con_Server *host_server;
+   void *data;
    Ecore_Fd_Handler *fd_handler;
-   int               buf_size;
-   int               buf_offset;
-   unsigned char    *buf;
-   char             *ip;
-   int               event_count;
-   char              dead : 1;
-   char              delete_me : 1;
+   unsigned int buf_offset;
+   Eina_Binbuf *buf;
+   const char *ip;
+   Eina_List *event_count;
+   struct sockaddr *client_addr;
+   int client_addr_len;
+   double start_time;
+   Ecore_Timer *until_deletion;
+   double disconnect_time;
+#if USE_GNUTLS
+   gnutls_datum_t session_ticket;
+   gnutls_session_t session;
+#elif USE_OPENSSL
+   SSL *ssl;
+   int ssl_err;
+#endif
+   Ecore_Con_Ssl_State ssl_state;
+   Eina_Bool handshaking : 1;
+   Eina_Bool upgrade : 1; /* STARTTLS queued */
+   Eina_Bool delete_me : 1; /* del event has been queued */
 };
 
 struct _Ecore_Con_Server
 {
    ECORE_MAGIC;
-   int               fd;
-   Ecore_Con_Type    type;
-   char             *name;
-   int               port;
-   char             *path;
-   void             *data;
+   int fd;
+   Ecore_Con_Type type;
+   char *name;
+   int port;
+   char *path;
+   void *data;
    Ecore_Fd_Handler *fd_handler;
-   Ecore_List       *clients;
-   int               write_buf_size;
-   int               write_buf_offset;
-   unsigned char    *write_buf;
-   int               event_count;
-   int               client_limit;
-   pid_t             ppid;
-#if USE_OPENSSL
-   SSL_CTX          *ssl_ctx;
-   SSL              *ssl;
+   Eina_List *clients;
+   unsigned int client_count;
+   Eina_Binbuf *buf;
+   unsigned int write_buf_offset;
+   Eina_List *infos;
+   Eina_List *event_count;
+   int client_limit;
+   pid_t ppid;
+   /* socks */
+   Ecore_Con_Socks *ecs;
+   Ecore_Con_Proxy_State ecs_state;
+   int ecs_addrlen;
+   unsigned char ecs_addr[16];
+   unsigned int ecs_buf_offset;
+   Eina_Binbuf *ecs_buf;
+   Eina_Binbuf *ecs_recvbuf;
+   const char *proxyip;
+   int proxyport;
+   /* endsocks */
+   const char *verify_name;
+#if USE_GNUTLS
+   gnutls_session_t session;
+   gnutls_anon_client_credentials_t anoncred_c;
+   gnutls_anon_server_credentials_t anoncred_s;
+   gnutls_psk_client_credentials_t pskcred_c;
+   gnutls_psk_server_credentials_t pskcred_s;
+   gnutls_certificate_credentials_t cert;
+   char *cert_file;
+   gnutls_dh_params_t dh_params;
+#elif USE_OPENSSL
+   SSL_CTX *ssl_ctx;
+   SSL *ssl;
+   int ssl_err;
+#endif
+   double start_time;
+   Ecore_Timer *until_deletion;
+   double disconnect_time;
+   double client_disconnect_time;
+   const char *ip;
+   Eina_Bool created : 1; /* @c EINA_TRUE if server is our listening server */
+   Eina_Bool connecting : 1; /* @c EINA_FALSE if just initialized or connected */
+   Eina_Bool handshaking : 1; /* @c EINA_TRUE if server is ssl handshaking */
+   Eina_Bool upgrade : 1;  /* STARTTLS queued */
+   Eina_Bool disable_proxy : 1; /* proxy should never be used with this connection */
+   Eina_Bool ssl_prepared : 1;
+   Eina_Bool use_cert : 1; /* @c EINA_TRUE if using certificate auth */
+   Ecore_Con_Ssl_State ssl_state; /* current state of ssl handshake on the server */
+   Eina_Bool verify : 1; /* @c EINA_TRUE if certificates will be verified */
+   Eina_Bool verify_basic : 1; /* @c EINA_TRUE if certificates will be verified only against the hostname */
+   Eina_Bool reject_excess_clients : 1;
+   Eina_Bool delete_me : 1; /* del event has been queued */
+#ifdef _WIN32
+   Eina_Bool want_write : 1;
+   Eina_Bool read_stop : 1;
+   Eina_Bool read_stopped : 1;
+   HANDLE pipe;
+   HANDLE thread_read;
+   HANDLE event_read;
+   HANDLE event_peek;
+   DWORD nbr_bytes;
 #endif
-   char             *ip;
-   char              dead : 1;
-   char              created : 1;
-   char              connecting : 1;
-   char              reject_excess_clients : 1;
-   char              delete_me : 1;
 };
 
 #ifdef HAVE_CURL
 struct _Ecore_Con_Url
 {
    ECORE_MAGIC;
-   CURL              *curl_easy;
+   CURL *curl_easy;
    struct curl_slist *headers;
-   char              *url;
+   Eina_List *additional_headers;
+   Eina_List *response_headers;
+   const char *url;
+   long proxy_type;
+   int status;
+
+   Ecore_Timer *timer;
+
+   Ecore_Con_Url_Time time_condition;
+   double timestamp;
+   void *data;
+   
+   void *post_data;
 
-   Ecore_Con_Url_Time condition;
-   time_t             time;
-   void              *data;
+   int received;
+   int write_fd;
 
-   Ecore_Fd_Handler  *fd_handler;
-   int               fd;
-   int               flags;
+   unsigned int event_count;
+   Eina_Bool dead : 1;
+   Eina_Bool multi : 1;
+};
+#endif
 
-   int               received;
-   int               write_fd;
+struct _Ecore_Con_Info
+{
+   unsigned int size;
+   struct addrinfo info;
+   char ip[NI_MAXHOST];
+   char service[NI_MAXSERV];
+};
 
-   unsigned char      active : 1;
+struct _Ecore_Con_Lookup
+{
+   Ecore_Con_Dns_Cb done_cb;
+   const void *data;
 };
+
+#define ECORE_CON_SOCKS_CAST_ELSE(X) \
+   Ecore_Con_Socks_v4 *v4 = NULL; \
+   Ecore_Con_Socks_v5 *v5 = NULL; \
+   if ((X) && ((X)->version == 4)) \
+     v4 = (Ecore_Con_Socks_v4*)(X); \
+   else if ((X) && ((X)->version == 5)) \
+     v5 = (Ecore_Con_Socks_v5*)(X); \
+   else
+
+struct Ecore_Con_Socks /* v4 */
+{
+   unsigned char version;
+
+   const char *ip;
+   int port;
+   const char *username;
+   unsigned int ulen;
+   Eina_Bool lookup : 1;
+   Eina_Bool bind : 1;
+};
+
+struct Ecore_Con_Socks_v5
+{
+   unsigned char version;
+
+   const char *ip;
+   int port;
+   const char *username;
+   unsigned int ulen;
+   Eina_Bool lookup : 1;
+   Eina_Bool bind : 1;
+   /* v5 only */
+   unsigned char method;
+   const char *password;
+   unsigned int plen;
+};
+
+extern Ecore_Con_Socks *_ecore_con_proxy_once;
+extern Ecore_Con_Socks *_ecore_con_proxy_global;
+void ecore_con_socks_init(void);
+void ecore_con_socks_shutdown(void);
+Eina_Bool ecore_con_socks_svr_init(Ecore_Con_Server *svr);
+void ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num);
+void ecore_con_socks_dns_cb(const char *canonname, const char *ip, struct sockaddr *addr, int addrlen, Ecore_Con_Server *svr);
+/* from ecore_con.c */
+void ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info);
+void ecore_con_event_proxy_bind(Ecore_Con_Server *svr);
+void ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num, Eina_Bool duplicate);
+void ecore_con_event_server_del(Ecore_Con_Server *svr);
+#define ecore_con_event_server_error(svr, error) _ecore_con_event_server_error((svr), (char*)(error), EINA_TRUE)
+void _ecore_con_event_server_error(Ecore_Con_Server *svr, char *error, Eina_Bool duplicate);
+void ecore_con_event_client_add(Ecore_Con_Client *cl);
+void ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, Eina_Bool duplicate);
+void ecore_con_event_client_del(Ecore_Con_Client *cl);
+void ecore_con_event_client_error(Ecore_Con_Client *cl, const char *error);
+void _ecore_con_server_kill(Ecore_Con_Server *svr);
+void _ecore_con_client_kill(Ecore_Con_Client *cl);
+/* from ecore_local_win32.c */
+#ifdef _WIN32
+Eina_Bool ecore_con_local_listen(Ecore_Con_Server *svr);
+Eina_Bool ecore_con_local_connect(Ecore_Con_Server *svr,
+                            Eina_Bool (*cb_done)(void *data,
+                                                 Ecore_Fd_Handler *fd_handler));
+Eina_Bool ecore_con_local_win32_server_flush(Ecore_Con_Server *svr);
+Eina_Bool ecore_con_local_win32_client_flush(Ecore_Con_Client *cl);
+void      ecore_con_local_win32_server_del(Ecore_Con_Server *svr);
+void      ecore_con_local_win32_client_del(Ecore_Con_Client *cl);
+#else
+/* from ecore_local.c */
+int ecore_con_local_init(void);
+int ecore_con_local_shutdown(void);
+int ecore_con_local_connect(Ecore_Con_Server *svr,
+                            Eina_Bool (*cb_done)(
+                               void *data,
+                               Ecore_Fd_Handler *fd_handler),
+                            void *data);
+int ecore_con_local_listen(Ecore_Con_Server *svr,
+                           Eina_Bool (*cb_listen)(
+                              void *data,
+                              Ecore_Fd_Handler *fd_handler),
+                           void *data);
 #endif
 
-/* from ecore_con_dns.c */
-int ecore_con_dns_init(void);
-int ecore_con_dns_shutdown(void);
+/* from ecore_con_info.c */
+int                 ecore_con_info_init(void);
+int                 ecore_con_info_shutdown(void);
+int                 ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
+                                               Ecore_Con_Info_Cb done_cb,
+                                               void *data);
+int                 ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
+                                              Ecore_Con_Info_Cb done_cb,
+                                              void *data);
+int                 ecore_con_info_udp_connect(Ecore_Con_Server *svr,
+                                               Ecore_Con_Info_Cb done_cb,
+                                               void *data);
+int                 ecore_con_info_udp_listen(Ecore_Con_Server *svr,
+                                              Ecore_Con_Info_Cb done_cb,
+                                              void *data);
+int                 ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
+                                                Ecore_Con_Info_Cb done_cb,
+                                                void *data);
+void                ecore_con_info_data_clear(void *info);
+
+void ecore_con_event_server_add(Ecore_Con_Server *svr);
+
+
+/* from ecore_con_ssl.c */
+Ecore_Con_Ssl_Error ecore_con_ssl_init(void);
+Ecore_Con_Ssl_Error ecore_con_ssl_shutdown(void);
+Ecore_Con_Ssl_Error ecore_con_ssl_server_prepare(Ecore_Con_Server *svr, int ssl_type);
+Ecore_Con_Ssl_Error ecore_con_ssl_server_init(Ecore_Con_Server *svr);
+Ecore_Con_Ssl_Error ecore_con_ssl_server_shutdown(Ecore_Con_Server *svr);
+int                 ecore_con_ssl_server_read(Ecore_Con_Server *svr,
+                                              unsigned char *buf,
+                                              int size);
+int                 ecore_con_ssl_server_write(Ecore_Con_Server *svr,
+                                               const unsigned char *buf,
+                                               int size);
+Ecore_Con_Ssl_Error ecore_con_ssl_client_init(Ecore_Con_Client *svr);
+Ecore_Con_Ssl_Error ecore_con_ssl_client_shutdown(Ecore_Con_Client *svr);
+int                 ecore_con_ssl_client_read(Ecore_Con_Client *svr,
+                                              unsigned char *buf,
+                                              int size);
+int                 ecore_con_ssl_client_write(Ecore_Con_Client *svr,
+                                               const unsigned char *buf,
+                                               int size);
+
+int                 ecore_con_info_get(Ecore_Con_Server *svr,
+                                       Ecore_Con_Info_Cb done_cb,
+                                       void *data,
+                                       struct addrinfo *hints);
+
+
+#define GENERIC_ALLOC_FREE_HEADER(TYPE, Type) \
+  TYPE *Type##_alloc(void);                  \
+  void Type##_free(TYPE *e);
+
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Add, ecore_con_event_client_add);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Del, ecore_con_event_client_del);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Write, ecore_con_event_client_write);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Data, ecore_con_event_client_data);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Error, ecore_con_event_server_error);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Error, ecore_con_event_client_error);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Add, ecore_con_event_server_add);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Del, ecore_con_event_server_del);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Write, ecore_con_event_server_write);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Data, ecore_con_event_server_data);
+GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Proxy_Bind, ecore_con_event_proxy_bind);
+
+void ecore_con_mempool_init(void);
+void ecore_con_mempool_shutdown(void);
+
+#undef GENERIC_ALLOC_FREE_HEADER
+
 #endif
diff --git a/src/lib/ecore_con/ecore_con_socks.c b/src/lib/ecore_con/ecore_con_socks.c
new file mode 100644 (file)
index 0000000..e609a6a
--- /dev/null
@@ -0,0 +1,940 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+
+#ifdef HAVE_NETINET_TCP_H
+# include <netinet/tcp.h>
+#endif
+
+#ifdef HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+
+/* if net/if.h is not found or if an older versions of net/if.h is provided
+   which does not define IF_NAMESIZE. We must define it ourselves */
+#ifndef IF_NAMESIZE
+#  ifdef IFNAMSIZ
+#    define IF_NAMESIZE IFNAMSIZ
+#  else
+#    define IF_NAMESIZE 16
+#  endif
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_SYS_UN_H
+# include <sys/un.h>
+#endif
+
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+#include "Ecore_Con.h"
+#include "ecore_con_private.h"
+
+/* http://tools.ietf.org/html/rfc1928
+          o  X'00' NO AUTHENTICATION REQUIRED
+          o  X'01' GSSAPI
+          o  X'02' USERNAME/PASSWORD
+          o  X'03' to X'7F' IANA ASSIGNED
+          o  X'80' to X'FE' RESERVED FOR PRIVATE METHODS
+          o  X'FF' NO ACCEPTABLE METHODS
+*/
+#define ECORE_CON_SOCKS_V5_METHOD_NONE 0
+#define ECORE_CON_SOCKS_V5_METHOD_GSSAPI 1
+#define ECORE_CON_SOCKS_V5_METHOD_USERPASS 2
+
+static int ECORE_CON_SOCKS_V5_METHODS[] =
+{
+   ECORE_CON_SOCKS_V5_METHOD_NONE,
+//   ECORE_CON_SOCKS_V5_METHOD_GSSAPI, TODO
+   ECORE_CON_SOCKS_V5_METHOD_USERPASS
+};
+
+#define ECORE_CON_SOCKS_V5_TOTAL_METHODS sizeof(ECORE_CON_SOCKS_V5_METHODS)
+
+#define _ecore_con_server_kill(svr) do { \
+   DBG("KILL %p", (svr)); \
+   _ecore_con_server_kill((svr)); \
+} while (0)
+
+Eina_List *ecore_con_socks_proxies = NULL;
+
+static Ecore_Con_Socks *
+_ecore_con_socks_find(unsigned char version, const char *ip, int port, const char *username, size_t ulen, const char *password, size_t plen)
+{
+   Eina_List *l;
+   Ecore_Con_Socks_v5 *ecs;
+
+   if (!ecore_con_socks_proxies) return NULL;
+
+   EINA_LIST_FOREACH(ecore_con_socks_proxies, l, ecs)
+     {
+        if (ecs->version != version) continue;
+        if (strcmp(ecs->ip, ip)) continue;
+        if ((port != -1) && (port != ecs->port)) continue;
+        if (ulen != ecs->ulen) continue;
+        if (username && strcmp(ecs->username, username)) continue;
+        if (version == 5)
+          {
+             if (plen != ecs->plen) continue;
+             if (password && strcmp(ecs->password, password)) continue;
+          }
+        return (Ecore_Con_Socks*)ecs;
+     }
+   return NULL;
+}
+
+static void
+_ecore_con_socks_free(Ecore_Con_Socks *ecs)
+{
+   ECORE_CON_SOCKS_CAST_ELSE(ecs) return;
+
+   if (_ecore_con_proxy_once == ecs) _ecore_con_proxy_once = NULL;
+   if (_ecore_con_proxy_global == ecs) _ecore_con_proxy_global = NULL;
+   eina_stringshare_del(ecs->ip);
+   eina_stringshare_del(ecs->username);
+   free(ecs);
+}
+
+static Eina_Bool
+_ecore_con_socks_svr_init_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4)
+{
+   size_t addrlen, buflen, ulen = 1;
+   unsigned char *sbuf;
+
+   addrlen = v4->lookup ? strlen(svr->name) + 1 : 0;
+   if (v4->username) ulen += v4->ulen;
+   buflen = sizeof(char) * (8  + ulen + addrlen);
+   sbuf = malloc(buflen);
+   if (!sbuf)
+     {
+        ecore_con_event_server_error(svr, "Memory allocation failure!");
+        _ecore_con_server_kill(svr);
+        return EINA_FALSE;
+     }
+   /* http://en.wikipedia.org/wiki/SOCKS */
+   sbuf[0] = 4;
+   sbuf[1] = v4->bind ? 2 : 1;
+   sbuf[2] = svr->port >> 8;
+   sbuf[3] = svr->port & 0xff;
+   if (addrlen)
+     {
+        sbuf[4] = sbuf[5] = sbuf[6] = 0;
+        sbuf[7] = 1;
+     }
+   else
+     /* SOCKSv4 only handles IPV4, so addrlen is always 4 */
+     memcpy(sbuf + 4, svr->ecs_addr, 4);
+   if (v4->username)
+     memcpy(sbuf + 8, v4->username, ulen);
+   else
+     sbuf[8] = 0;
+   if (addrlen) memcpy(sbuf + 8 + ulen, svr->name, addrlen);
+
+   svr->ecs_buf = eina_binbuf_manage_new_length(sbuf, buflen);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_con_socks_svr_init_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5)
+{
+   size_t buflen;
+   unsigned int x;
+   unsigned char *sbuf;
+
+   if (v5->username)
+     buflen = sizeof(char) * (2  + ECORE_CON_SOCKS_V5_TOTAL_METHODS);
+   else
+     buflen = 3;
+   sbuf = malloc(buflen);
+   if (!sbuf)
+     {
+        ecore_con_event_server_error(svr, "Memory allocation failure!");
+        _ecore_con_server_kill(svr);
+        return EINA_FALSE;
+     }
+   /* http://en.wikipedia.org/wiki/SOCKS
+    * http://tools.ietf.org/html/rfc1928
+    */
+   sbuf[0] = 5;
+   if (v5->username)
+     {
+       sbuf[1] = ECORE_CON_SOCKS_V5_TOTAL_METHODS;
+       for (x = 2; x < 2 + ECORE_CON_SOCKS_V5_TOTAL_METHODS; x++)
+         sbuf[x] = ECORE_CON_SOCKS_V5_METHODS[x - 2];
+     }
+   else
+     {
+        sbuf[1] = 1;
+        sbuf[2] = ECORE_CON_SOCKS_V5_METHOD_NONE;
+     }
+
+   svr->ecs_buf = eina_binbuf_manage_new_length(sbuf, buflen);
+   return EINA_TRUE;
+}
+
+#define ECORE_CON_SOCKS_READ(EXACT) \
+          if (num < EXACT) \
+            { \
+               if (!svr->ecs_recvbuf) svr->ecs_recvbuf = eina_binbuf_new(); \
+               if (!svr->ecs_recvbuf) goto error; \
+               eina_binbuf_append_length(svr->ecs_recvbuf, buf, num); \
+               /* the slowest connection on earth */ \
+               if (eina_binbuf_length_get(svr->ecs_recvbuf) != EXACT) return; \
+               data = eina_binbuf_string_get(svr->ecs_recvbuf); \
+            } \
+          else if (num > EXACT) goto error; \
+          else \
+            data = buf
+
+static void
+_ecore_con_socks_read_v4(Ecore_Con_Server *svr, Ecore_Con_Socks_v4 *v4 __UNUSED__, const unsigned char *buf, unsigned int num)
+{
+   const unsigned char *data;
+   DBG("SOCKS: %d bytes", num);
+   ECORE_CON_SOCKS_READ(8);
+
+/* http://ufasoft.com/doc/socks4_protocol.htm */
+   if (data[0]) goto error;
+   switch (data[1])
+     {
+      case 90:
+        /* success! */
+        break;
+      case 91:
+        ecore_con_event_server_error(svr, "proxy request rejected or failed");
+        goto error;
+      case 92:
+        ecore_con_event_server_error(svr, "proxying SOCKS server could not perform authentication");
+        goto error;
+      case 93:
+        ecore_con_event_server_error(svr, "proxy request authentication rejected");
+        goto error;
+      default:
+        ecore_con_event_server_error(svr, "garbage data from proxy");
+        goto error;
+     }
+   if (svr->ecs->bind)
+     {
+        unsigned int nport;
+        char naddr[IF_NAMESIZE];
+
+        memcpy(&nport, &data[2], 2);
+        svr->proxyport = ntohl(nport);
+
+        if (!inet_ntop(AF_INET, &data[4], naddr, sizeof(naddr))) goto error;
+        svr->proxyip = eina_stringshare_add(naddr);
+        ecore_con_event_proxy_bind(svr);
+     }
+   svr->ecs_state = ECORE_CON_PROXY_STATE_DONE;
+   INF("PROXY CONNECTED");
+   if (svr->ecs_recvbuf) eina_binbuf_free(svr->ecs_recvbuf);
+   svr->ecs_recvbuf = NULL;
+   svr->ecs_buf_offset = svr->ecs_addrlen = 0;
+   memset(svr->ecs_addr, 0, sizeof(svr->ecs_addr));
+   if (!svr->ssl_state)
+     ecore_con_event_server_add(svr);
+   if (svr->ssl_state || (svr->buf && eina_binbuf_length_get(svr->buf)))
+     ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
+   return;
+error:
+   _ecore_con_server_kill(svr);
+}
+
+static Eina_Bool
+_ecore_con_socks_auth_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5)
+{
+   size_t size;
+   unsigned char *data;
+   switch (v5->method)
+     {
+        case ECORE_CON_SOCKS_V5_METHOD_NONE:
+          svr->ecs_state = ECORE_CON_PROXY_STATE_REQUEST;
+          return EINA_TRUE;
+        case ECORE_CON_SOCKS_V5_METHOD_GSSAPI:
+          return EINA_TRUE;
+        case ECORE_CON_SOCKS_V5_METHOD_USERPASS:
+          if (!v5->username) return EINA_FALSE;
+          if (!v5->password) v5->plen = 1;
+          /* http://tools.ietf.org/html/rfc1929 */
+          size = sizeof(char) * (3 + v5->ulen + v5->plen);
+          data = malloc(size);
+          if (!data) break;
+          data[0] = 1;
+          data[1] = v5->ulen;
+          memcpy(&data[2], v5->username, v5->ulen);
+          data[1 + v5->ulen] = v5->plen;
+          if (v5->password)
+            memcpy(&data[2 + v5->ulen], v5->password, v5->plen);
+          else
+            data[2 + v5->ulen] = 0;
+          svr->ecs_buf = eina_binbuf_manage_new_length(data, size);
+          return EINA_TRUE;
+        default:
+          break;
+     }
+   return EINA_FALSE;
+}
+
+static void
+_ecore_con_socks_read_v5(Ecore_Con_Server *svr, Ecore_Con_Socks_v5 *v5, const unsigned char *buf, unsigned int num)
+{
+   const unsigned char *data;
+
+   DBG("SOCKS: %d bytes", num);
+   switch (svr->ecs_state)
+     {
+
+        case ECORE_CON_PROXY_STATE_READ:
+          ECORE_CON_SOCKS_READ(2);
+          /* http://en.wikipedia.org/wiki/SOCKS */
+          if (data[0] != 5) goto error;
+          if (data[1] == 0xFF)
+            {
+               ecore_con_event_server_error(svr, "proxy authentication methods rejected");
+               goto error;
+            }
+          v5->method = data[1];
+          if (!_ecore_con_socks_auth_v5(svr, v5)) goto error;
+          if (svr->ecs_state == ECORE_CON_PROXY_STATE_REQUEST)
+            {
+               /* run again to skip auth reading */
+               _ecore_con_socks_read_v5(svr, v5, NULL, 0);
+               return;
+            }
+          ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+          svr->ecs_state = ECORE_CON_PROXY_STATE_AUTH;
+          break;
+        case ECORE_CON_PROXY_STATE_AUTH:
+          ECORE_CON_SOCKS_READ(2);
+          switch (v5->method)
+            {
+             case ECORE_CON_SOCKS_V5_METHOD_NONE:
+               CRIT("HOW DID THIS HAPPEN?????????");
+               goto error;
+             case ECORE_CON_SOCKS_V5_METHOD_GSSAPI:
+               /* TODO: this */
+               break;
+             case ECORE_CON_SOCKS_V5_METHOD_USERPASS:
+               if (data[0] != 1)
+                 {
+                    ecore_con_event_server_error(svr, "protocol error");
+                    goto error; /* wrong version */
+                 }
+               if (data[1])
+                 {
+                    ecore_con_event_server_error(svr, "proxy request authentication rejected");
+                    goto error;
+                 }
+             default:
+               break;
+            }
+        case ECORE_CON_PROXY_STATE_REQUEST:
+          {
+             size_t addrlen, buflen;
+             unsigned char *sbuf;
+             addrlen = v5->lookup ? strlen(svr->name) + 1 : (unsigned int)svr->ecs_addrlen;
+             buflen = sizeof(char) * (6 + addrlen);
+             sbuf = malloc(buflen);
+             if (!sbuf)
+               {
+                  ecore_con_event_server_error(svr, "Memory allocation failure!");
+                  goto error;
+               }
+              sbuf[0] = 5;
+              sbuf[1] = v5->bind ? 2 : 1; /* TODO: 0x03 for UDP port association */
+              sbuf[2] = 0;
+              if (v5->lookup) /* domain name */
+                {
+                   sbuf[3] = 3;
+                   sbuf[4] = addrlen - 1;
+                   memcpy(sbuf + 5, svr->name, addrlen - 1);
+                }
+              else
+                {
+                   sbuf[3] = (svr->ecs_addrlen == 4) ? 1 : 4;
+                   memcpy(sbuf + 4, svr->ecs_addr, addrlen);
+                }
+              sbuf[addrlen + 4] = svr->port >> 8;
+              sbuf[addrlen + 5] = svr->port & 0xff;
+
+              svr->ecs_buf = eina_binbuf_manage_new_length(sbuf, buflen);
+              ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+              break;
+          }
+        case ECORE_CON_PROXY_STATE_CONFIRM:
+          {
+             /* this is ugly because we have to read an exact number of bytes,
+              * but we don't know what that number is until we've already read
+              * at least 5 bytes to determine the length of the unknown stream.
+              * yep.
+              */
+             size_t to_read, len = svr->ecs_recvbuf ? eina_binbuf_length_get(svr->ecs_recvbuf) : 0;
+             if (num + len < 5)
+               {
+                  /* guarantees we get called again */
+                  ECORE_CON_SOCKS_READ(5);
+               }
+             if (len >= 5)
+               {
+                  data = eina_binbuf_string_get(svr->ecs_recvbuf);
+                  data += 3;
+               }
+             else
+               data = buf + 3 - len;
+             switch (data[0])
+               {
+                  case 1:
+                    to_read = 4;
+                    break;
+                  case 3:
+                    to_read = data[1] + 1;
+                    break;
+                  case 4:
+                    to_read = 16;
+                    /* lazy debugging stub comment */
+                    break;
+                  default:
+                    ecore_con_event_server_error(svr, "protocol error");
+                    goto error;
+               }
+             /* at this point, we finally know exactly how much we need to read */
+             ECORE_CON_SOCKS_READ(6 + to_read);
+
+             if (data[0] != 5)
+               {
+                  ecore_con_event_server_error(svr, "protocol error");
+                  goto error; /* wrong version */
+               }
+             switch (data[1])
+               {
+                  case 0:
+                    break;
+                  case 1:
+                    ecore_con_event_server_error(svr, "general proxy failure");
+                    goto error;
+                  case 2:
+                    ecore_con_event_server_error(svr, "connection not allowed by ruleset");
+                    goto error;
+                  case 3:
+                    ecore_con_event_server_error(svr, "network unreachable");
+                    goto error;
+                  case 4:
+                    ecore_con_event_server_error(svr, "host unreachable");
+                    goto error;
+                  case 5:
+                    ecore_con_event_server_error(svr, "connection refused by destination host");
+                    goto error;
+                  case 6:
+                    ecore_con_event_server_error(svr, "TTL expired");
+                    goto error;
+                  case 7:
+                    ecore_con_event_server_error(svr, "command not supported / protocol error");
+                    goto error;
+                  case 8:
+                    ecore_con_event_server_error(svr, "address type not supported");
+                  default:
+                    goto error;
+               }
+             if (data[2])
+               {
+                  ecore_con_event_server_error(svr, "protocol error");
+                  goto error;
+               }
+             memset(svr->ecs_addr, 0, sizeof(svr->ecs_addr));
+             if (!svr->ssl_state)
+               ecore_con_event_server_add(svr);
+             if (svr->ssl_state || (svr->buf && eina_binbuf_length_get(svr->buf)))
+               ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
+             svr->ecs_buf_offset = svr->ecs_addrlen = 0;
+             svr->ecs_state = ECORE_CON_PROXY_STATE_DONE;
+             INF("PROXY CONNECTED");
+             break;
+          }
+      default:
+        break;
+     }
+   if (svr->ecs_recvbuf) eina_binbuf_free(svr->ecs_recvbuf);
+   svr->ecs_recvbuf = NULL;
+   
+   return;
+error:
+   _ecore_con_server_kill(svr);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
+void
+ecore_con_socks_shutdown(void)
+{
+   Ecore_Con_Socks *ecs;
+   EINA_LIST_FREE(ecore_con_socks_proxies, ecs)
+     _ecore_con_socks_free(ecs);
+   _ecore_con_proxy_once = NULL;
+   _ecore_con_proxy_global = NULL;
+}
+
+void
+ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num)
+{
+   ECORE_CON_SOCKS_CAST_ELSE(svr->ecs) return;
+
+   if (svr->ecs_state < ECORE_CON_PROXY_STATE_READ) return;
+
+   if (v4) _ecore_con_socks_read_v4(svr, v4, buf, (unsigned int)num);
+   else _ecore_con_socks_read_v5(svr, v5, buf, (unsigned int)num);
+}
+
+Eina_Bool
+ecore_con_socks_svr_init(Ecore_Con_Server *svr)
+{
+   ECORE_CON_SOCKS_CAST_ELSE(svr->ecs) return EINA_FALSE;
+
+   if (!svr->ip) return EINA_FALSE;
+   if (svr->ecs_buf) return EINA_FALSE;
+   if (svr->ecs_state != ECORE_CON_PROXY_STATE_INIT) return EINA_FALSE;
+   ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+   if (v4) return _ecore_con_socks_svr_init_v4(svr, v4);
+   return _ecore_con_socks_svr_init_v5(svr, v5);
+}
+
+void
+ecore_con_socks_dns_cb(const char *canonname __UNUSED__, const char *ip, struct sockaddr *addr, int addrlen __UNUSED__, Ecore_Con_Server *svr)
+{
+   svr->ip = eina_stringshare_add(ip);
+   svr->ecs_state++;
+   if (addr->sa_family == AF_INET)
+     {
+        memcpy(svr->ecs_addr, &((struct sockaddr_in *)addr)->sin_addr.s_addr, 4);
+        svr->ecs_addrlen = 4;
+     }
+#ifdef HAVE_IPV6
+   else
+     {
+        memcpy(svr->ecs_addr, &((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr, 16);
+        svr->ecs_addrlen = 16;
+     }
+#endif
+   ecore_con_socks_svr_init(svr);
+}
+
+void
+ecore_con_socks_init(void)
+{
+   const char *socks;
+   char *h, *p, *l, *u = NULL;
+   char buf[512];
+   int port, lookup = 0;
+   Eina_Bool v5 = EINA_FALSE;
+   Ecore_Con_Socks *ecs;
+   unsigned char addr[sizeof(struct in_addr)];
+#ifdef HAVE_IPV6
+   unsigned char addr6[sizeof(struct in6_addr)];
+#endif
+
+   /* ECORE_CON_SOCKS_V4=[user@]host-port:[1|0] */
+   socks = getenv("ECORE_CON_SOCKS_V4");
+   if (!socks)
+     {
+        /* ECORE_CON_SOCKS_V5=[user@]host-port:[1|0] */
+        socks = getenv("ECORE_CON_SOCKS_V5");
+        v5 = EINA_TRUE;
+     }
+   if ((!socks) || (!socks[0]) || (strlen(socks) > 512)) return;
+   strncpy(buf, socks, sizeof(buf));
+   h = strchr(buf, '@');
+   /* username */
+   if (h && (h - buf > 0)) *h++ = 0, u = buf;
+   else h = buf;
+
+   /* host ip; I ain't resolvin shit here */
+   p = strchr(h, '-');
+   if (!p) return;
+   *p++ = 0;
+   if (!inet_pton(AF_INET, h, addr))
+#ifdef HAVE_IPV6
+     {
+        if (!v5) return;
+        if (!inet_pton(AF_INET6, h, addr6))
+          return;
+     }
+#else
+     return;
+#endif
+
+   errno = 0;
+   port = strtol(p, &l, 10);
+   if (errno || (port < 0) || (port > 65535)) return;
+   if (l && (l[0] == ':'))
+     lookup = (l[1] == '1');
+   if (v5)
+     ecs = ecore_con_socks5_remote_add(h, port, u, NULL);
+   else
+     ecs = ecore_con_socks4_remote_add(h, port, u);
+   if (!ecs) return;
+   ecore_con_socks_lookup_set(ecs, lookup);
+   ecore_con_socks_apply_always(ecs);
+   INF("Added global proxy server %s%s%s:%d - DNS lookup %s",
+       u ?: "", u ? "@" : "", h, port, lookup ? "ENABLED" : "DISABLED");
+}
+
+/////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @defgroup Ecore_Con_Socks_Group Ecore Connection SOCKS functions
+ * @{
+ */
+
+/**
+ * Add a SOCKS v4 proxy to the proxy list
+ *
+ * Use this to create (or return, if previously added) a SOCKS proxy
+ * object which can be used by any ecore_con servers.
+ * @param ip The ip address of the proxy (NOT DOMAIN NAME. IP ADDRESS.)
+ * @param port The port to connect to on the proxy
+ * @param username The username to use for the proxy (OPTIONAL)
+ * @return An allocated proxy object, or NULL on failure
+ * @note This object NEVER needs to be explicitly freed.
+ * @since 1.2
+ */
+EAPI Ecore_Con_Socks *
+ecore_con_socks4_remote_add(const char *ip, int port, const char *username)
+{
+   Ecore_Con_Socks *ecs;
+   size_t ulen = 0;
+
+   if ((!ip) || (!ip[0]) || (port < 0) || (port > 65535)) return NULL;
+
+   if (username)
+     {
+        ulen = strlen(username);
+        /* max length for protocol */
+        if ((!ulen) || (ulen > 255)) return NULL;
+     }
+   ecs = _ecore_con_socks_find(4, ip, port, username, ulen, NULL, 0);
+   if (ecs) return ecs;
+
+   ecs = calloc(1, sizeof(Ecore_Con_Socks_v4));
+   if (!ecs) return NULL;
+
+   ecs->version = 4;
+   ecs->ip = eina_stringshare_add(ip);
+   ecs->port = port;
+   ecs->username = eina_stringshare_add(username);
+   ecs->ulen = ulen;
+   ecore_con_socks_proxies = eina_list_append(ecore_con_socks_proxies, ecs);
+   return ecs;
+}
+
+/**
+ * Find a SOCKS v4 proxy in the proxy list
+ *
+ * Use this to determine if a SOCKS proxy was previously added by checking
+ * the proxy list against the parameters given.
+ * @param ip The ip address of the proxy (NOT DOMAIN NAME. IP ADDRESS.)
+ * @param port The port to connect to on the proxy, or -1 to match the first proxy with @p ip
+ * @param username The username used for the proxy (OPTIONAL)
+ * @return true only if a proxy exists matching the given params
+ * @note This function matches slightly more loosely than ecore_con_socks4_remote_add(), and
+ * ecore_con_socks4_remote_add() should be used to return the actual object.
+ * @since 1.2
+ */
+EAPI Eina_Bool
+ecore_con_socks4_remote_exists(const char *ip, int port, const char *username)
+{
+   if ((!ip) || (!ip[0]) || (port < -1) || (port > 65535) || (username && (!username[0])))
+     return EINA_FALSE;
+   return !!_ecore_con_socks_find(4, ip, port, username, username ? strlen(username) : 0, NULL, 0);
+}
+
+/**
+ * Remove a SOCKS v4 proxy from the proxy list and delete it
+ *
+ * Use this to remove a SOCKS proxy from the proxy list by checking
+ * the list against the parameters given. The proxy will then be deleted.
+ * @param ip The ip address of the proxy (NOT DOMAIN NAME. IP ADDRESS.)
+ * @param port The port to connect to on the proxy, or -1 to match the first proxy with @p ip
+ * @param username The username used for the proxy (OPTIONAL)
+ * @note This function matches in the same way as ecore_con_socks4_remote_exists().
+ * @warning Be aware that deleting a proxy which is being used WILL ruin your life.
+ * @since 1.2
+ */
+EAPI void
+ecore_con_socks4_remote_del(const char *ip, int port, const char *username)
+{
+   Ecore_Con_Socks_v4 *v4;
+
+   if ((!ip) || (!ip[0]) || (port < -1) || (port > 65535) || (username && (!username[0]))) return;
+   if (!ecore_con_socks_proxies) return;
+
+   v4 = (Ecore_Con_Socks_v4*)_ecore_con_socks_find(4, ip, port, username, username ? strlen(username) : 0, NULL, 0);
+   if (!v4) return;
+   ecore_con_socks_proxies = eina_list_remove(ecore_con_socks_proxies, v4);
+   _ecore_con_socks_free((Ecore_Con_Socks*)v4);
+}
+/**
+ * Add a SOCKS v5 proxy to the proxy list
+ *
+ * Use this to create (or return, if previously added) a SOCKS proxy
+ * object which can be used by any ecore_con servers.
+ * @param ip The ip address of the proxy (NOT DOMAIN NAME. IP ADDRESS.)
+ * @param port The port to connect to on the proxy
+ * @param username The username to use for the proxy (OPTIONAL)
+ * @param password The password to use for the proxy (OPTIONAL)
+ * @return An allocated proxy object, or NULL on failure
+ * @note This object NEVER needs to be explicitly freed.
+ * @since 1.2
+ */
+EAPI Ecore_Con_Socks *
+ecore_con_socks5_remote_add(const char *ip, int port, const char *username, const char *password)
+{
+   Ecore_Con_Socks_v5 *ecs5;
+   size_t ulen = 0, plen = 0;
+
+   if ((!ip) || (!ip[0]) || (port < 0) || (port > 65535)) return NULL;
+
+   if (username)
+     {
+        ulen = strlen(username);
+        /* max length for protocol */
+        if ((!ulen) || (ulen > 255)) return NULL;
+     }
+   if (password)
+     {
+        plen = strlen(password);
+        /* max length for protocol */
+        if ((!plen) || (plen > 255)) return NULL;
+     }
+   ecs5 = (Ecore_Con_Socks_v5*)_ecore_con_socks_find(5, ip, port, username, ulen, password, plen);
+   if (ecs5) return (Ecore_Con_Socks*)ecs5;
+
+   ecs5 = calloc(1, sizeof(Ecore_Con_Socks_v5));
+   if (!ecs5) return NULL;
+
+   ecs5->version = 5;
+   ecs5->ip = eina_stringshare_add(ip);
+   ecs5->port = port;
+   ecs5->username = eina_stringshare_add(username);
+   ecs5->ulen = ulen;
+   ecs5->password = eina_stringshare_add(password);
+   ecs5->plen = plen;
+   ecore_con_socks_proxies = eina_list_append(ecore_con_socks_proxies, ecs5);
+   return (Ecore_Con_Socks*)ecs5;
+}
+
+/**
+ * Find a SOCKS v5 proxy in the proxy list
+ *
+ * Use this to determine if a SOCKS proxy was previously added by checking
+ * the proxy list against the parameters given.
+ * @param ip The ip address of the proxy (NOT DOMAIN NAME. IP ADDRESS.)
+ * @param port The port to connect to on the proxy, or -1 to match the first proxy with @p ip
+ * @param username The username used for the proxy (OPTIONAL)
+ * @param password The password used for the proxy (OPTIONAL)
+ * @return true only if a proxy exists matching the given params
+ * @note This function matches slightly more loosely than ecore_con_socks5_remote_add(), and
+ * ecore_con_socks5_remote_add() should be used to return the actual object.
+ * @since 1.2
+ */
+EAPI Eina_Bool
+ecore_con_socks5_remote_exists(const char *ip, int port, const char *username, const char *password)
+{
+   if ((!ip) || (!ip[0]) || (port < -1) || (port > 65535) || (username && (!username[0])) || (password && (!password[0])))
+     return EINA_FALSE;
+   return !!_ecore_con_socks_find(5, ip, port, username, username ? strlen(username) : 0, password, password ? strlen(password) : 0);
+}
+
+/**
+ * Remove a SOCKS v5 proxy from the proxy list and delete it
+ *
+ * Use this to remove a SOCKS proxy from the proxy list by checking
+ * the list against the parameters given. The proxy will then be deleted.
+ * @param ip The ip address of the proxy (NOT DOMAIN NAME. IP ADDRESS.)
+ * @param port The port to connect to on the proxy, or -1 to match the first proxy with @p ip
+ * @param username The username used for the proxy (OPTIONAL)
+ * @param password The password used for the proxy (OPTIONAL)
+ * @note This function matches in the same way as ecore_con_socks4_remote_exists().
+ * @warning Be aware that deleting a proxy which is being used WILL ruin your life.
+ * @since 1.2
+ */
+EAPI void
+ecore_con_socks5_remote_del(const char *ip, int port, const char *username, const char *password)
+{
+   Ecore_Con_Socks_v5 *v5;
+
+   if ((!ip) || (!ip[0]) || (port < -1) || (port > 65535) || (username && (!username[0])) || (password && (!password[0])))
+     return;
+   if (!ecore_con_socks_proxies) return;
+
+   v5 = (Ecore_Con_Socks_v5*)_ecore_con_socks_find(5, ip, port, username, username ? strlen(username) : 0, password, password ? strlen(password) : 0);
+   if (!v5) return;
+   ecore_con_socks_proxies = eina_list_remove(ecore_con_socks_proxies, v5);
+   _ecore_con_socks_free((Ecore_Con_Socks*)v5);
+}
+
+/**
+ * Set DNS lookup mode on an existing SOCKS proxy
+ *
+ * According to RFC, SOCKS v4 does not require that a proxy perform
+ * its own DNS lookups for addresses. SOCKS v4a specifies the protocol
+ * for this. SOCKS v5 allows DNS lookups.
+ * If you want to enable remote DNS lookup and are sure that your
+ * proxy supports it, use this function.
+ * @param ecs The proxy object
+ * @param enable If true, the proxy will perform the dns lookup
+ * @note By default, this setting is DISABLED.
+ * @since 1.2
+ */
+EAPI void
+ecore_con_socks_lookup_set(Ecore_Con_Socks *ecs, Eina_Bool enable)
+{
+   ECORE_CON_SOCKS_CAST_ELSE(ecs) return;
+   ecs->lookup = !!enable;
+}
+
+/**
+ * Get DNS lookup mode on an existing SOCKS proxy
+ *
+ * According to RFC, SOCKS v4 does not require that a proxy perform
+ * its own DNS lookups for addresses. SOCKS v4a specifies the protocol
+ * for this. SOCKS v5 allows DNS lookups.
+ * This function returns whether lookups are enabled on a proxy object.
+ * @param ecs The proxy object
+ * @return If true, the proxy will perform the dns lookup
+ * @note By default, this setting is DISABLED.
+ * @since 1.2
+ */
+EAPI Eina_Bool
+ecore_con_socks_lookup_get(Ecore_Con_Socks *ecs)
+{
+   ECORE_CON_SOCKS_CAST_ELSE(ecs) return EINA_FALSE;
+   return ecs->lookup;
+}
+
+/**
+ * Enable bind mode on a SOCKS proxy
+ *
+ * Use this function to enable binding a remote port for use with a remote server.
+ * For more information, see http://ufasoft.com/doc/socks4_protocol.htm
+ * @param ecs The proxy object
+ * @param is_bind If true, the connection established will be a port binding
+ * @warning Be aware that changing the operation mode of an active proxy may result in undefined behavior
+ * @since 1.2
+ */
+EAPI void
+ecore_con_socks_bind_set(Ecore_Con_Socks *ecs, Eina_Bool is_bind)
+{
+   EINA_SAFETY_ON_NULL_RETURN(ecs);
+   ecs->bind = !!is_bind;
+}
+
+/**
+ * Return bind mode of a SOCKS proxy
+ *
+ * Use this function to return bind mode of a proxy (binding a remote port for use with a remote server).
+ * For more information, see http://ufasoft.com/doc/socks4_protocol.htm
+ * @param ecs The proxy object
+ * @return If true, the connection established will be a port binding
+ * @since 1.2
+ */
+EAPI Eina_Bool
+ecore_con_socks_bind_get(Ecore_Con_Socks *ecs)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ecs, EINA_FALSE);
+   return ecs->bind;
+}
+
+/**
+ * Return SOCKS version of a SOCKS proxy
+ *
+ * Use this function to return the SOCKS protocol version of a proxy
+ * @param ecs The proxy object
+ * @return 0 on error, else 4/5
+ * @since 1.2
+ */
+EAPI unsigned int
+ecore_con_socks_version_get(Ecore_Con_Socks *ecs)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ecs, 0);
+   return ecs->version;
+}
+
+/**
+ * Remove a SOCKS v4 proxy from the proxy list and delete it
+ *
+ * Use this to remove a SOCKS proxy from the proxy list by directly deleting the object given.
+ * @param ecs The proxy object to delete
+ * @warning Be aware that deleting a proxy which is being used WILL ruin your life.
+ * @since 1.2
+ */
+EAPI void
+ecore_con_socks_remote_del(Ecore_Con_Socks *ecs)
+{
+   EINA_SAFETY_ON_NULL_RETURN(ecs);
+   if (!ecore_con_socks_proxies) return;
+
+   ecore_con_socks_proxies = eina_list_remove(ecore_con_socks_proxies, ecs);
+   _ecore_con_socks_free(ecs);
+}
+
+/**
+ * Set a proxy object to be used with the next server created with ecore_con_server_connect()
+ *
+ * This function sets a proxy for the next ecore_con connection. After the next server is created,
+ * the proxy will NEVER be applied again unless explicitly enabled.
+ * @param ecs The proxy object
+ * @see ecore_con_socks_apply_always()
+ * @since 1.2
+ */
+EAPI void
+ecore_con_socks_apply_once(Ecore_Con_Socks *ecs)
+{
+   _ecore_con_proxy_once = ecs;
+}
+
+/**
+ * Set a proxy object to be used with all servers created with ecore_con_server_connect()
+ *
+ * This function sets a proxy for all ecore_con connections. It will always be used.
+ * @param ecs The proxy object
+ * @see ecore_con_socks_apply_once()
+ * @since 1.2
+ * @note ecore-con supports setting this through environment variables like so:
+ *   ECORE_CON_SOCKS_V4=[user@]server-port:lookup
+ *   ECORE_CON_SOCKS_V5=[user@]server-port:lookup
+ * user is the OPTIONAL string that would be passed to the proxy as the username
+ * server is the IP_ADDRESS of the proxy server
+ * port is the port to connect to on the proxy server
+ * lookup is 1 if the proxy should perform all DNS lookups, otherwise 0 or omitted
+ */
+EAPI void
+ecore_con_socks_apply_always(Ecore_Con_Socks *ecs)
+{
+   _ecore_con_proxy_global = ecs;
+}
+/** @} */
diff --git a/src/lib/ecore_con/ecore_con_ssl.c b/src/lib/ecore_con/ecore_con_ssl.c
new file mode 100644 (file)
index 0000000..1027dbb
--- /dev/null
@@ -0,0 +1,2115 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if USE_GNUTLS
+# include <gnutls/gnutls.h>
+# include <gnutls/x509.h>
+# include <gcrypt.h>
+#elif USE_OPENSSL
+# include <openssl/ssl.h>
+# include <openssl/err.h>
+# include <openssl/dh.h>
+#endif
+
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+
+#include <sys/stat.h>
+#include "Ecore.h"
+#include "ecore_con_private.h"
+
+EAPI int ECORE_CON_EVENT_CLIENT_UPGRADE = 0;
+EAPI int ECORE_CON_EVENT_SERVER_UPGRADE = 0;
+
+static int _init_con_ssl_init_count = 0;
+
+#ifdef USE_GNUTLS
+# ifdef EINA_HAVE_THREADS
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+# endif
+
+static int _client_connected = 0;
+
+# define SSL_SUFFIX(ssl_func) ssl_func ## _gnutls
+# define _ECORE_CON_SSL_AVAILABLE 1
+
+#elif USE_OPENSSL
+
+# define SSL_SUFFIX(ssl_func) ssl_func ## _openssl
+# define _ECORE_CON_SSL_AVAILABLE 2
+
+#else
+# define SSL_SUFFIX(ssl_func) ssl_func ## _none
+# define _ECORE_CON_SSL_AVAILABLE 0
+
+#endif
+
+#if USE_GNUTLS
+static void
+_gnutls_print_errors(void *conn, int type, int ret)
+{
+   char buf[1024];
+
+   if (!ret) return;
+
+   snprintf(buf, sizeof(buf), "GNUTLS error: %s - %s", gnutls_strerror_name(ret), gnutls_strerror(ret));
+   if (type == ECORE_CON_EVENT_CLIENT_ERROR)
+     ecore_con_event_client_error(conn, buf);
+   else
+     ecore_con_event_server_error(conn, buf);
+}
+
+static void
+_gnutls_print_session(const gnutls_datum_t *cert_list, unsigned int cert_list_size)
+{
+   char *c = NULL;
+   gnutls_x509_crt_t crt;
+   unsigned int x;
+
+   if (!eina_log_domain_level_check(_ecore_con_log_dom, EINA_LOG_LEVEL_DBG)) return;
+   for (x = 0; x < cert_list_size; x++)
+     {
+        gnutls_x509_crt_init(&crt);
+        gnutls_x509_crt_import(crt, &cert_list[x], GNUTLS_X509_FMT_DER);
+        gnutls_x509_crt_print(crt, GNUTLS_CRT_PRINT_FULL, (gnutls_datum_t*)&c);
+        INF("CERTIFICATE:\n%s", c);
+        gnutls_free(c);
+        gnutls_x509_crt_deinit(crt);
+        crt = NULL;
+     }
+}
+
+#ifdef ISCOMFITOR
+static void
+_gnutls_log_func(int         level,
+                 const char *str)
+{
+   char buf[128];
+   strncat(buf, str, strlen(str) - 1);
+   DBG("|<%d>| %s", level, buf);
+}
+#endif
+
+static const char *
+SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_description_t status)
+{
+   switch (status)
+     {
+      case GNUTLS_HANDSHAKE_HELLO_REQUEST:
+        return "Hello request";
+
+      case GNUTLS_HANDSHAKE_CLIENT_HELLO:
+        return "Client hello";
+
+      case GNUTLS_HANDSHAKE_SERVER_HELLO:
+        return "Server hello";
+
+      case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET:
+        return "New session ticket";
+
+      case GNUTLS_HANDSHAKE_CERTIFICATE_PKT:
+        return "Certificate packet";
+
+      case GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE:
+        return "Server key exchange";
+
+      case GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST:
+        return "Certificate request";
+
+      case GNUTLS_HANDSHAKE_SERVER_HELLO_DONE:
+        return "Server hello done";
+
+      case GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY:
+        return "Certificate verify";
+
+      case GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE:
+        return "Client key exchange";
+
+      case GNUTLS_HANDSHAKE_FINISHED:
+        return "Finished";
+
+      case GNUTLS_HANDSHAKE_SUPPLEMENTAL:
+        return "Supplemental";
+     }
+   return NULL;
+}
+
+#elif USE_OPENSSL
+
+static void
+_openssl_print_verify_error(int error)
+{
+   switch (error)
+     {
+#define ERROR(X) \
+  case (X): \
+    ERR("%s", #X); \
+    break
+#ifdef X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT
+      ERROR(X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT);
+#endif
+#ifdef X509_V_ERR_UNABLE_TO_GET_CRL
+      ERROR(X509_V_ERR_UNABLE_TO_GET_CRL);
+#endif
+#ifdef X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE
+      ERROR(X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE);
+#endif
+#ifdef X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE
+      ERROR(X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE);
+#endif
+#ifdef X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY
+      ERROR(X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY);
+#endif
+#ifdef X509_V_ERR_CERT_SIGNATURE_FAILURE
+      ERROR(X509_V_ERR_CERT_SIGNATURE_FAILURE);
+#endif
+#ifdef X509_V_ERR_CRL_SIGNATURE_FAILURE
+      ERROR(X509_V_ERR_CRL_SIGNATURE_FAILURE);
+#endif
+#ifdef X509_V_ERR_CERT_NOT_YET_VALID
+      ERROR(X509_V_ERR_CERT_NOT_YET_VALID);
+#endif
+#ifdef X509_V_ERR_CERT_HAS_EXPIRED
+      ERROR(X509_V_ERR_CERT_HAS_EXPIRED);
+#endif
+#ifdef X509_V_ERR_CRL_NOT_YET_VALID
+      ERROR(X509_V_ERR_CRL_NOT_YET_VALID);
+#endif
+#ifdef X509_V_ERR_CRL_HAS_EXPIRED
+      ERROR(X509_V_ERR_CRL_HAS_EXPIRED);
+#endif
+#ifdef X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD
+      ERROR(X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD);
+#endif
+#ifdef X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD
+      ERROR(X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD);
+#endif
+#ifdef X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD
+      ERROR(X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD);
+#endif
+#ifdef X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD
+      ERROR(X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD);
+#endif
+#ifdef X509_V_ERR_OUT_OF_MEM
+      ERROR(X509_V_ERR_OUT_OF_MEM);
+#endif
+#ifdef X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
+      ERROR(X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT);
+#endif
+#ifdef X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
+      ERROR(X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN);
+#endif
+#ifdef X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
+      ERROR(X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY);
+#endif
+#ifdef X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
+      ERROR(X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE);
+#endif
+#ifdef X509_V_ERR_CERT_CHAIN_TOO_LONG
+      ERROR(X509_V_ERR_CERT_CHAIN_TOO_LONG);
+#endif
+#ifdef X509_V_ERR_CERT_REVOKED
+      ERROR(X509_V_ERR_CERT_REVOKED);
+#endif
+#ifdef X509_V_ERR_INVALID_CA
+      ERROR(X509_V_ERR_INVALID_CA);
+#endif
+#ifdef X509_V_ERR_PATH_LENGTH_EXCEEDED
+      ERROR(X509_V_ERR_PATH_LENGTH_EXCEEDED);
+#endif
+#ifdef X509_V_ERR_INVALID_PURPOSE
+      ERROR(X509_V_ERR_INVALID_PURPOSE);
+#endif
+#ifdef X509_V_ERR_CERT_UNTRUSTED
+      ERROR(X509_V_ERR_CERT_UNTRUSTED);
+#endif
+#ifdef X509_V_ERR_CERT_REJECTED
+      ERROR(X509_V_ERR_CERT_REJECTED);
+#endif
+      /* These are 'informational' when looking for issuer cert */
+#ifdef X509_V_ERR_SUBJECT_ISSUER_MISMATCH
+      ERROR(X509_V_ERR_SUBJECT_ISSUER_MISMATCH);
+#endif
+#ifdef X509_V_ERR_AKID_SKID_MISMATCH
+      ERROR(X509_V_ERR_AKID_SKID_MISMATCH);
+#endif
+#ifdef X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH
+      ERROR(X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH);
+#endif
+#ifdef X509_V_ERR_KEYUSAGE_NO_CERTSIGN
+      ERROR(X509_V_ERR_KEYUSAGE_NO_CERTSIGN);
+#endif
+
+#ifdef X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER
+      ERROR(X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER);
+#endif
+#ifdef X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION
+      ERROR(X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION);
+#endif
+#ifdef X509_V_ERR_KEYUSAGE_NO_CRL_SIGN
+      ERROR(X509_V_ERR_KEYUSAGE_NO_CRL_SIGN);
+#endif
+#ifdef X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION
+      ERROR(X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION);
+#endif
+#ifdef X509_V_ERR_INVALID_NON_CA
+      ERROR(X509_V_ERR_INVALID_NON_CA);
+#endif
+#ifdef X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED
+      ERROR(X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED);
+#endif
+#ifdef X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE
+      ERROR(X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE);
+#endif
+#ifdef X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED
+      ERROR(X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED);
+#endif
+
+#ifdef X509_V_ERR_INVALID_EXTENSION
+      ERROR(X509_V_ERR_INVALID_EXTENSION);
+#endif
+#ifdef X509_V_ERR_INVALID_POLICY_EXTENSION
+      ERROR(X509_V_ERR_INVALID_POLICY_EXTENSION);
+#endif
+#ifdef X509_V_ERR_NO_EXPLICIT_POLICY
+      ERROR(X509_V_ERR_NO_EXPLICIT_POLICY);
+#endif
+#ifdef X509_V_ERR_DIFFERENT_CRL_SCOPE
+      ERROR(X509_V_ERR_DIFFERENT_CRL_SCOPE);
+#endif
+#ifdef X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE
+      ERROR(X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE);
+#endif
+
+#ifdef X509_V_ERR_UNNESTED_RESOURCE
+      ERROR(X509_V_ERR_UNNESTED_RESOURCE);
+#endif
+
+#ifdef X509_V_ERR_PERMITTED_VIOLATION
+      ERROR(X509_V_ERR_PERMITTED_VIOLATION);
+#endif
+#ifdef X509_V_ERR_EXCLUDED_VIOLATION
+      ERROR(X509_V_ERR_EXCLUDED_VIOLATION);
+#endif
+#ifdef X509_V_ERR_SUBTREE_MINMAX
+      ERROR(X509_V_ERR_SUBTREE_MINMAX);
+#endif
+#ifdef X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE
+      ERROR(X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE);
+#endif
+#ifdef X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX
+      ERROR(X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX);
+#endif
+#ifdef X509_V_ERR_UNSUPPORTED_NAME_SYNTAX
+      ERROR(X509_V_ERR_UNSUPPORTED_NAME_SYNTAX);
+#endif
+#ifdef X509_V_ERR_CRL_PATH_VALIDATION_ERROR
+      ERROR(X509_V_ERR_CRL_PATH_VALIDATION_ERROR);
+#endif
+
+      /* The application is not happy */
+#ifdef X509_V_ERR_APPLICATION_VERIFICATION
+      ERROR(X509_V_ERR_APPLICATION_VERIFICATION);
+#endif
+     }
+#undef ERROR
+}
+
+static void
+_openssl_print_errors(void *conn, int type)
+{
+   char buf[1024];
+   do
+     {
+        unsigned long err;
+
+        err = ERR_get_error();
+        if (!err) break;
+        snprintf(buf, sizeof(buf), "OpenSSL error: %s", ERR_reason_error_string(err));
+        if (type == ECORE_CON_EVENT_CLIENT_ERROR)
+          ecore_con_event_client_error(conn, buf);
+        else
+          ecore_con_event_server_error(conn, buf);
+
+     } while (1);
+}
+
+static Eina_Bool
+_openssl_name_verify(const char *name, const char *svrname)
+{
+   if (name[0] == '*')
+     {
+        /* we allow *.domain.TLD with a wildcard, but nothing else */
+        const char *p, *s;
+
+        EINA_SAFETY_ON_TRUE_RETURN_VAL((name[1] != '.') || (!name[2]), EINA_FALSE);
+        p = strchr(name + 1, '*');
+        EINA_SAFETY_ON_TRUE_RETURN_VAL(!!p, EINA_FALSE);
+        /* verify that we have a domain of at least *.X.TLD and not *.TLD */
+        p = strchr(name + 2, '.');
+        EINA_SAFETY_ON_TRUE_RETURN_VAL(!p, EINA_FALSE);
+        s = strchr(svrname, '.');
+        EINA_SAFETY_ON_TRUE_RETURN_VAL(!s, EINA_FALSE);
+        /* same as above for the stored name */
+        EINA_SAFETY_ON_TRUE_RETURN_VAL(!strchr(s + 1, '.'), EINA_FALSE);
+        if (strcasecmp(s, name + 1))
+          {
+             ERR("%s != %s", s, name + 1);
+             return EINA_FALSE;
+          }
+     }
+   else
+     if (strcasecmp(name, svrname))
+       {
+          ERR("%s != %s", name, svrname);
+          return EINA_FALSE;
+       }
+   return EINA_TRUE;
+}
+
+static void
+_openssl_print_session(SSL *ssl)
+{
+   /* print session info into DBG */
+   SSL_SESSION *s;
+   STACK_OF(X509) *sk;
+   BIO *b;
+   char log[4096], *p;
+   int x;
+
+   if (!eina_log_domain_level_check(_ecore_con_log_dom, EINA_LOG_LEVEL_DBG)) return;
+
+   memset(log, 0, sizeof(log));
+   b = BIO_new(BIO_s_mem());
+   sk = SSL_get_peer_cert_chain(ssl);
+   if (sk)
+     {
+        DBG("CERTIFICATES:");
+        for (x = 0; x < sk_X509_num(sk); x++)
+          {
+             p = X509_NAME_oneline(X509_get_subject_name(sk_X509_value(sk, x)), log, sizeof(log));
+             DBG("%2d s:%s", x, p);
+             p = X509_NAME_oneline(X509_get_issuer_name(sk_X509_value(sk, x)), log, sizeof(log));
+             DBG("   i:%s", p);
+             PEM_write_X509(stderr, sk_X509_value(sk, x));
+          }
+     }
+   s = SSL_get_session(ssl);
+   SSL_SESSION_print(b, s);
+   fprintf(stderr, "\n");
+   while (BIO_read(b, log, sizeof(log)) > 0)
+     fprintf(stderr, "%s", log);
+
+   BIO_free(b);
+}
+
+#endif
+
+#define SSL_ERROR_CHECK_GOTO_ERROR(X)                                           \
+  do                                                                            \
+    {                                                                           \
+       if ((X))                                                                 \
+         {                                                                      \
+            ERR("Error at %s:%s:%d!", __FILE__, __PRETTY_FUNCTION__, __LINE__); \
+            goto error;                                                         \
+         }                                                                      \
+    }                                                                           \
+  while (0)
+
+static Ecore_Con_Ssl_Error
+                           SSL_SUFFIX(_ecore_con_ssl_init) (void);
+static Ecore_Con_Ssl_Error
+                           SSL_SUFFIX(_ecore_con_ssl_shutdown) (void);
+
+static Eina_Bool           SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (Ecore_Con_Server * svr, const char *ca_file);
+static Eina_Bool           SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (Ecore_Con_Server * svr, const char *crl_file);
+static Eina_Bool           SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (Ecore_Con_Server * svr, const char *cert);
+static Eina_Bool           SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (Ecore_Con_Server * svr, const char *key_file);
+
+static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_prepare) (Ecore_Con_Server * svr, int ssl_type);
+static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_init) (Ecore_Con_Server * svr);
+static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (Ecore_Con_Server *svr);
+static int SSL_SUFFIX(_ecore_con_ssl_server_read) (Ecore_Con_Server *svr, unsigned char *buf, int size);
+static int SSL_SUFFIX(_ecore_con_ssl_server_write) (Ecore_Con_Server *svr, const unsigned char *buf, int size);
+
+static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_client_init) (Ecore_Con_Client * cl);
+static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_client_shutdown) (Ecore_Con_Client *cl);
+static int SSL_SUFFIX(_ecore_con_ssl_client_read) (Ecore_Con_Client * cl,
+                                        unsigned char *buf, int size);
+static int SSL_SUFFIX(_ecore_con_ssl_client_write) (Ecore_Con_Client * cl,
+                                         const unsigned char *buf, int size);
+
+/*
+ * General SSL API
+ */
+
+Ecore_Con_Ssl_Error
+ecore_con_ssl_init(void)
+{
+   if (!_init_con_ssl_init_count++)
+     {
+        SSL_SUFFIX(_ecore_con_ssl_init) ();
+#if _ECORE_CON_SSL_AVAILABLE != 0
+        ECORE_CON_EVENT_CLIENT_UPGRADE = ecore_event_type_new();
+        ECORE_CON_EVENT_SERVER_UPGRADE = ecore_event_type_new();
+#endif
+     }
+
+   return _init_con_ssl_init_count;
+}
+
+Ecore_Con_Ssl_Error
+ecore_con_ssl_shutdown(void)
+{
+   if (!--_init_con_ssl_init_count)
+     SSL_SUFFIX(_ecore_con_ssl_shutdown) ();
+
+   return _init_con_ssl_init_count;
+}
+
+Ecore_Con_Ssl_Error
+ecore_con_ssl_server_prepare(Ecore_Con_Server *svr,
+                             int               ssl_type)
+{
+   if (!ssl_type)
+     return ECORE_CON_SSL_ERROR_NONE;
+   return SSL_SUFFIX(_ecore_con_ssl_server_prepare) (svr, ssl_type);
+}
+
+Ecore_Con_Ssl_Error
+ecore_con_ssl_server_init(Ecore_Con_Server *svr)
+{
+   if (!(svr->type & ECORE_CON_SSL))
+     return ECORE_CON_SSL_ERROR_NONE;
+   return SSL_SUFFIX(_ecore_con_ssl_server_init) (svr);
+}
+
+Ecore_Con_Ssl_Error
+ecore_con_ssl_server_shutdown(Ecore_Con_Server *svr)
+{
+   if (!(svr->type & ECORE_CON_SSL))
+     return ECORE_CON_SSL_ERROR_NONE;
+   return SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (svr);
+}
+
+int
+ecore_con_ssl_server_read(Ecore_Con_Server *svr,
+                          unsigned char    *buf,
+                          int               size)
+{
+   return SSL_SUFFIX(_ecore_con_ssl_server_read) (svr, buf, size);
+}
+
+int
+ecore_con_ssl_server_write(Ecore_Con_Server *svr,
+                           const unsigned char *buf,
+                           int               size)
+{
+   return SSL_SUFFIX(_ecore_con_ssl_server_write) (svr, buf, size);
+}
+
+Ecore_Con_Ssl_Error
+ecore_con_ssl_client_init(Ecore_Con_Client *cl)
+{
+   if (!(cl->host_server->type & ECORE_CON_SSL))
+     return ECORE_CON_SSL_ERROR_NONE;
+   return SSL_SUFFIX(_ecore_con_ssl_client_init) (cl);
+}
+
+Ecore_Con_Ssl_Error
+ecore_con_ssl_client_shutdown(Ecore_Con_Client *cl)
+{
+   if (!(cl->host_server->type & ECORE_CON_SSL))
+     return ECORE_CON_SSL_ERROR_NONE;
+   return SSL_SUFFIX(_ecore_con_ssl_client_shutdown) (cl);
+}
+
+int
+ecore_con_ssl_client_read(Ecore_Con_Client *cl,
+                          unsigned char    *buf,
+                          int               size)
+{
+   return SSL_SUFFIX(_ecore_con_ssl_client_read) (cl, buf, size);
+}
+
+int
+ecore_con_ssl_client_write(Ecore_Con_Client *cl,
+                           const unsigned char *buf,
+                           int               size)
+{
+   return SSL_SUFFIX(_ecore_con_ssl_client_write) (cl, buf, size);
+}
+
+/**
+ * Returns if SSL support is available
+ * @return 1 if SSL is available and provided by gnutls, 2 if provided by openssl,
+ * 0 if it is not available.
+ * @ingroup Ecore_Con_Client_Group
+ */
+EAPI int
+ecore_con_ssl_available_get(void)
+{
+   return _ECORE_CON_SSL_AVAILABLE;
+}
+
+/**
+ * @addtogroup Ecore_Con_SSL_Group Ecore Connection SSL Functions
+ *
+ * Functions that operate on Ecore connection objects pertaining to SSL.
+ *
+ * @{
+ */
+
+/**
+ * @brief Enable certificate verification on a server object
+ *
+ * Call this function on a server object before main loop has started
+ * to enable verification of certificates against loaded certificates.
+ * @param svr The server object
+ */
+EAPI void
+ecore_con_ssl_server_verify(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_verify");
+        return;
+     }
+   svr->verify = EINA_TRUE;
+}
+
+/**
+ * @brief Enable hostname-based certificate verification on a server object
+ *
+ * Call this function on a server object before main loop has started
+ * to enable verification of certificates using ONLY their hostnames.
+ * @param svr The server object
+ * @note This function has no effect when used on a listening server created by
+ * ecore_con_server_add
+ * @since 1.1
+ */
+EAPI void
+ecore_con_ssl_server_verify_basic(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
+        return;
+     }
+   svr->verify_basic = EINA_TRUE;
+}
+
+/**
+ * @brief Set the hostname to verify against in certificate verification
+ *
+ * Sometimes the certificate hostname will not match the hostname that you are
+ * connecting to, and will instead match a different name. An example of this is
+ * that if you connect to talk.google.com to use Google Talk, you receive Google's
+ * certificate for gmail.com. This certificate should be trusted, and so you must call
+ * this function with "gmail.com" as @p name.
+ * See RFC2818 for more details.
+ * @param svr The server object
+ * @param name The hostname to verify against
+ * @since 1.2
+ */
+EAPI void
+ecore_con_ssl_server_verify_name_set(Ecore_Con_Server *svr, const char *name)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
+        return;
+     }
+   eina_stringshare_replace(&svr->verify_name, name);
+}
+
+/**
+ * @brief Get the hostname to verify against in certificate verification
+ *
+ * This function returns the name which will be used to validate the SSL certificate
+ * common name (CN) or alt name (subjectAltName). It will default to the @p name
+ * param in ecore_con_server_connect(), but can be changed with ecore_con_ssl_server_verify_name_set().
+ * @param svr The server object
+ * @return The hostname which will be used
+ * @since 1.2
+ */
+EAPI const char *
+ecore_con_ssl_server_verify_name_get(Ecore_Con_Server *svr)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
+        return NULL;
+     }
+   return svr->verify_name ?: svr->name;
+}
+
+/**
+ * @brief Add an ssl certificate for use in ecore_con functions.
+ *
+ * Use this function to add a SSL PEM certificate.
+ * Simply specify the cert here to use it in the server object for connecting or listening.
+ * If there is an error loading the certificate, an error will automatically be logged.
+ * @param svr The server object
+ * @param cert The path to the certificate.
+ * @return @c EINA_FALSE if the file cannot be loaded, otherwise @c EINA_TRUE.
+ */
+
+EAPI Eina_Bool
+ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr,
+                              const char       *cert)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_cert_add");
+        return EINA_FALSE;
+     }
+
+   if (!svr->ssl_prepared)
+     {
+        svr->use_cert = EINA_TRUE;
+        svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT;
+        if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL))
+          return EINA_FALSE;
+     }
+
+   return SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (svr, cert);
+}
+
+/**
+ * @brief Add an ssl CA file for use in ecore_con functions.
+ *
+ * Use this function to add a SSL PEM CA file.
+ * Simply specify the file here to use it in the server object for connecting or listening.
+ * If there is an error loading the CAs, an error will automatically be logged.
+ * @param svr The server object
+ * @param ca_file The path to the CA file.
+ * @return @c EINA_FALSE if the file cannot be loaded, otherwise @c EINA_TRUE.
+ * @note since 1.2, this function can load directores
+ */
+
+EAPI Eina_Bool
+ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr,
+                                const char       *ca_file)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_cafile_add");
+        return EINA_FALSE;
+     }
+
+   if (!svr->ssl_prepared)
+     {
+        svr->use_cert = EINA_TRUE;
+        svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT;
+        if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL))
+          return EINA_FALSE;
+     }
+
+   return SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (svr, ca_file);
+}
+
+/**
+ * @brief Add an ssl private key for use in ecore_con functions.
+ *
+ * Use this function to add a SSL PEM private key
+ * Simply specify the key file here to use it in the server object for connecting or listening.
+ * If there is an error loading the key, an error will automatically be logged.
+ * @param svr The server object
+ * @param key_file The path to the key file.
+ * @return @c EINA_FALSE if the file cannot be loaded, otherwise @c EINA_TRUE.
+ */
+
+EAPI Eina_Bool
+ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr,
+                                 const char       *key_file)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_privkey_add");
+        return EINA_FALSE;
+     }
+
+   if (!svr->ssl_prepared)
+     {
+        svr->use_cert = EINA_TRUE;
+        svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT;
+        if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL))
+          return EINA_FALSE;
+     }
+
+   return SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (svr, key_file);
+}
+
+/**
+ * @brief Add an ssl CRL for use in ecore_con functions.
+ *
+ * Use this function to add a SSL PEM CRL file
+ * Simply specify the CRL file here to use it in the server object for connecting or listening.
+ * If there is an error loading the CRL, an error will automatically be logged.
+ * @param svr The server object
+ * @param crl_file The path to the CRL file.
+ * @return @c EINA_FALSE if the file cannot be loaded, otherwise @c EINA_TRUE.
+ */
+
+EAPI Eina_Bool
+ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr,
+                             const char       *crl_file)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_crl_add");
+        return EINA_FALSE;
+     }
+
+   if (!svr->ssl_prepared)
+     {
+        svr->use_cert = EINA_TRUE;
+        svr->type |= ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT;
+        if (ecore_con_ssl_server_prepare(svr, svr->type & ECORE_CON_SSL))
+          return EINA_FALSE;
+     }
+
+   return SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (svr, crl_file);
+}
+
+/**
+ * @brief Upgrade a connection to a specified level of encryption
+ *
+ * Use this function to begin an SSL handshake on a connection (STARTTLS or similar).
+ * Once the upgrade has been completed, an ECORE_CON_EVENT_SERVER_UPGRADE event will be emitted.
+ * The connection should be treated as disconnected until the next event.
+ * @param svr The server object
+ * @param ssl_type The SSL connection type (ONLY).
+ * @return @c EINA_FALSE if the connection cannot be upgraded, otherwise @c EINA_TRUE.
+ * @note This function is NEVER to be used on a server object created with ecore_con_server_add
+ * @warning Setting a wrong value for @p compl_type WILL mess up your program.
+ * @since 1.1
+ */
+
+EAPI Eina_Bool
+ecore_con_ssl_server_upgrade(Ecore_Con_Server *svr, Ecore_Con_Type ssl_type)
+{
+   if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
+     {
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
+        return EINA_FALSE;
+     }
+#if _ECORE_CON_SSL_AVAILABLE == 0
+   return EINA_FALSE;
+#endif
+
+   if (!svr->ssl_prepared)
+     {
+        if (ecore_con_ssl_server_prepare(svr, ssl_type))
+          return EINA_FALSE;
+     }
+   if (!svr->use_cert)
+     svr->type |= ssl_type;
+   svr->upgrade = EINA_TRUE;
+   svr->handshaking = EINA_TRUE;
+   svr->ssl_state = ECORE_CON_SSL_STATE_INIT;
+   return !SSL_SUFFIX(_ecore_con_ssl_server_init) (svr);
+}
+
+/**
+ * @brief Upgrade a connection to a specified level of encryption
+ *
+ * Use this function to begin an SSL handshake on a connection (STARTTLS or similar).
+ * Once the upgrade has been completed, an ECORE_CON_EVENT_CLIENT_UPGRADE event will be emitted.
+ * The connection should be treated as disconnected until the next event.
+ * @param cl The client object
+ * @param ssl_type The SSL connection type (ONLY).
+ * @return @c EINA_FALSE if the connection cannot be upgraded, otherwise @c EINA_TRUE.
+ * @warning Setting a wrong value for @p compl_type WILL mess up your program.
+ * @since 1.1
+ */
+
+EAPI Eina_Bool
+ecore_con_ssl_client_upgrade(Ecore_Con_Client *cl, Ecore_Con_Type ssl_type)
+{
+   if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
+     {
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, __func__);
+        return EINA_FALSE;
+     }
+#if _ECORE_CON_SSL_AVAILABLE == 0
+   return EINA_FALSE;
+#endif
+
+   if (!cl->host_server->ssl_prepared)
+     {
+        if (ecore_con_ssl_server_prepare(cl->host_server, ssl_type))
+          return EINA_FALSE;
+     }
+   if (!cl->host_server->use_cert)
+     cl->host_server->type |= ssl_type;
+   cl->upgrade = EINA_TRUE;
+   cl->host_server->upgrade = EINA_TRUE;
+   cl->handshaking = EINA_TRUE;
+   cl->ssl_state = ECORE_CON_SSL_STATE_INIT;
+   return SSL_SUFFIX(_ecore_con_ssl_client_init) (cl);
+}
+
+/**
+ * @}
+ */
+
+#if USE_GNUTLS
+
+/*
+ * GnuTLS
+ */
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_init_gnutls(void)
+{
+#ifdef EINA_HAVE_THREADS
+   if (gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread))
+     WRN("YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!");
+#endif
+   if (gnutls_global_init())
+     return ECORE_CON_SSL_ERROR_INIT_FAILED;
+
+#ifdef ISCOMFITOR
+   if (eina_log_domain_level_check(_ecore_con_log_dom, EINA_LOG_LEVEL_DBG))
+     {
+        gnutls_global_set_log_level(9);
+        gnutls_global_set_log_function(_gnutls_log_func);
+     }
+#endif
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_shutdown_gnutls(void)
+{
+   gnutls_global_deinit();
+
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_prepare_gnutls(Ecore_Con_Server *svr,
+                                     int               ssl_type)
+{
+   int ret;
+
+   if (ssl_type & ECORE_CON_USE_SSL2)
+     return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
+
+   switch (ssl_type)
+     {
+      case ECORE_CON_USE_SSL3:
+      case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
+      case ECORE_CON_USE_TLS:
+      case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
+      case ECORE_CON_USE_MIXED:
+      case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
+        break;
+
+      default:
+        return ECORE_CON_SSL_ERROR_NONE;
+     }
+
+   SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_allocate_credentials(&svr->cert));
+
+   if (svr->use_cert)
+     {
+        if  (svr->created)
+          {
+             SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_dh_params_init(&svr->dh_params));
+             INF("Generating DH params");
+             SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_dh_params_generate2(svr->dh_params, 1024));
+
+             SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_anon_allocate_server_credentials(&svr->anoncred_s));
+             /* TODO: implement PSK */
+             //  SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_server_credentials(&svr->pskcred_s));
+
+             gnutls_anon_set_server_dh_params(svr->anoncred_s, svr->dh_params);
+             gnutls_certificate_set_dh_params(svr->cert, svr->dh_params);
+             //gnutls_psk_set_server_dh_params(svr->pskcred_s, svr->dh_params);
+             INF("DH params successfully generated and applied!");
+          }
+      else
+        {
+           //SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_client_credentials(&svr->pskcred_c));
+             SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_anon_allocate_client_credentials(&svr->anoncred_c));
+        }
+     }
+
+   svr->ssl_prepared = EINA_TRUE;
+   return ECORE_CON_SSL_ERROR_NONE;
+
+error:
+   _gnutls_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR, ret);
+   _ecore_con_ssl_server_shutdown_gnutls(svr);
+   return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
+}
+
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_init_gnutls(Ecore_Con_Server *svr)
+{
+   const gnutls_datum_t *cert_list;
+   unsigned int iter, cert_list_size;
+   gnutls_x509_crt_t cert = NULL;
+   const char *priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0";
+   int ret = 0;
+
+   switch (svr->ssl_state)
+     {
+      case ECORE_CON_SSL_STATE_DONE:
+        return ECORE_CON_SSL_ERROR_NONE;
+
+      case ECORE_CON_SSL_STATE_INIT:
+        if (svr->type & ECORE_CON_USE_SSL2) /* not supported because of security issues */
+          return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
+
+        switch (svr->type & ECORE_CON_SSL)
+          {
+           case ECORE_CON_USE_SSL3:
+           case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
+             priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1";
+             break;
+
+           case ECORE_CON_USE_TLS:
+           case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
+             priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0";
+             break;
+
+           case ECORE_CON_USE_MIXED:
+           case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
+             break;
+
+           default:
+             return ECORE_CON_SSL_ERROR_NONE;
+          }
+
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_init(&svr->session, GNUTLS_CLIENT));
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_enable_client(svr->session));
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_server_name_set(svr->session, GNUTLS_NAME_DNS, svr->name, strlen(svr->name)));
+        INF("Applying priority string: %s", priority);
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_priority_set_direct(svr->session, priority, NULL));
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_CERTIFICATE, svr->cert));
+        // SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_PSK, svr->pskcred_c));
+        if (!svr->use_cert)
+          SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_ANON, svr->anoncred_c));
+
+        gnutls_dh_set_prime_bits(svr->session, 512);
+        gnutls_transport_set_ptr(svr->session, (gnutls_transport_ptr_t)((intptr_t)svr->fd));
+        svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+
+      case ECORE_CON_SSL_STATE_HANDSHAKING:
+        if (!svr->session)
+          {
+             DBG("Server was previously lost, going to error condition");
+             goto error;
+          }
+        ret = gnutls_handshake(svr->session);
+        DBG("calling gnutls_handshake(): returned with '%s'", gnutls_strerror_name(ret));
+        SSL_ERROR_CHECK_GOTO_ERROR(gnutls_error_is_fatal(ret));
+        if (!ret)
+          {
+             svr->handshaking = EINA_FALSE;
+             svr->ssl_state = ECORE_CON_SSL_STATE_DONE;
+          }
+        else
+          {
+             if (gnutls_record_get_direction(svr->session))
+               ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+             else
+               ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+             return ECORE_CON_SSL_ERROR_NONE;
+          }
+
+      default:
+        break;
+     }
+
+   if ((!svr->verify) && (!svr->verify_basic))
+     /* not verifying certificates, so we're done! */
+     return ECORE_CON_SSL_ERROR_NONE;
+   if (svr->verify)
+     {
+        /* use CRL/CA lists to verify */
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_verify_peers2(svr->session, &iter));
+        if (iter & GNUTLS_CERT_INVALID)
+          ERR("The certificate is not trusted.");
+        else if (iter & GNUTLS_CERT_SIGNER_NOT_FOUND)
+          ERR("The certificate hasn't got a known issuer.");
+        else if (iter & GNUTLS_CERT_REVOKED)
+          ERR("The certificate has been revoked.");
+        else if (iter & GNUTLS_CERT_EXPIRED)
+          ERR("The certificate has expired");
+        else if (iter & GNUTLS_CERT_NOT_ACTIVATED)
+          ERR("The certificate is not yet activated");
+
+        if (iter)
+          goto error;
+     }
+   if (gnutls_certificate_type_get(svr->session) != GNUTLS_CRT_X509)
+     {
+        ERR("Warning: PGP certificates are not yet supported!");
+        goto error;
+     }
+
+   SSL_ERROR_CHECK_GOTO_ERROR(!(cert_list = gnutls_certificate_get_peers(svr->session, &cert_list_size)));
+   SSL_ERROR_CHECK_GOTO_ERROR(!cert_list_size);
+
+   _gnutls_print_session(cert_list, cert_list_size);
+
+   SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_init(&cert));
+   SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER));
+
+   SSL_ERROR_CHECK_GOTO_ERROR(!gnutls_x509_crt_check_hostname(cert, svr->verify_name ?: svr->name));
+   gnutls_x509_crt_deinit(cert);
+   DBG("SSL certificate verification succeeded!");
+   return ECORE_CON_SSL_ERROR_NONE;
+
+error:
+   _gnutls_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR, ret);
+   if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED) || (ret == GNUTLS_E_FATAL_ALERT_RECEIVED))
+     ERR("Also received alert: %s", gnutls_alert_get_name(gnutls_alert_get(svr->session)));
+   if (svr->session && (svr->ssl_state != ECORE_CON_SSL_STATE_DONE))
+     {
+        ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(svr->session)));
+        ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(svr->session)));
+     }
+   if (cert)
+     gnutls_x509_crt_deinit(cert);
+   _ecore_con_ssl_server_shutdown_gnutls(svr);
+   return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_cafile_add_gnutls(Ecore_Con_Server *svr,
+                                        const char       *ca_file)
+{
+   struct stat st;
+   Eina_Iterator *it;
+   const char *file;
+   Eina_Bool error = EINA_FALSE;
+
+   if (stat(ca_file, &st)) return EINA_FALSE;
+   if (S_ISDIR(st.st_mode))
+     {
+        it = eina_file_ls(ca_file);
+        SSL_ERROR_CHECK_GOTO_ERROR(!it);
+        EINA_ITERATOR_FOREACH(it, file)
+          {
+             if (!error)
+               {
+                  if (gnutls_certificate_set_x509_trust_file(svr->cert, file, GNUTLS_X509_FMT_PEM) < 1)
+                    error++;
+               }
+             eina_stringshare_del(file);
+          }
+        eina_iterator_free(it);
+     }
+   else
+     SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_trust_file(svr->cert, ca_file,
+                                                                       GNUTLS_X509_FMT_PEM) < 1);
+
+   return !error;
+error:
+   ERR("Could not load CA file!");
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_crl_add_gnutls(Ecore_Con_Server *svr,
+                                     const char       *crl_file)
+{
+   SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_crl_file(svr->cert, crl_file,
+                                                                   GNUTLS_X509_FMT_PEM) < 1);
+
+   return EINA_TRUE;
+error:
+   ERR("Could not load CRL file!");
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_privkey_add_gnutls(Ecore_Con_Server *svr,
+                                         const char       *key_file)
+{
+   SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_key_file(svr->cert, svr->cert_file, key_file,
+                                                                   GNUTLS_X509_FMT_PEM));
+
+   return EINA_TRUE;
+error:
+   ERR("Could not load certificate/key file!");
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_cert_add_gnutls(Ecore_Con_Server *svr,
+                                      const char       *cert_file)
+{
+   if (!(svr->cert_file = strdup(cert_file)))
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_shutdown_gnutls(Ecore_Con_Server *svr)
+{
+   if (svr->session)
+     {
+        gnutls_bye(svr->session, GNUTLS_SHUT_RDWR);
+        gnutls_deinit(svr->session);
+     }
+
+   free(svr->cert_file);
+   svr->cert_file = NULL;
+   if (svr->cert)
+     gnutls_certificate_free_credentials(svr->cert);
+   svr->cert = NULL;
+
+   if ((svr->type & ECORE_CON_SSL) && svr->created)
+     {
+        if (svr->dh_params)
+          {
+             gnutls_dh_params_deinit(svr->dh_params);
+             svr->dh_params = NULL;
+          }
+        if (svr->anoncred_s)
+          gnutls_anon_free_server_credentials(svr->anoncred_s);
+        //  if (svr->pskcred_s)
+        //   gnutls_psk_free_server_credentials(svr->pskcred_s);
+
+        svr->anoncred_s = NULL;
+        svr->pskcred_s = NULL;
+     }
+   else if (svr->type & ECORE_CON_SSL)
+     {
+        if (svr->anoncred_c)
+          gnutls_anon_free_client_credentials(svr->anoncred_c);
+        // if (svr->pskcred_c)
+        // gnutls_psk_free_client_credentials(svr->pskcred_c);
+
+        svr->anoncred_c = NULL;
+        svr->pskcred_c = NULL;
+     }
+
+   svr->session = NULL;
+
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static int
+_ecore_con_ssl_server_read_gnutls(Ecore_Con_Server *svr,
+                                  unsigned char    *buf,
+                                  int               size)
+{
+   int num;
+
+   if (svr->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
+     {
+        DBG("Continuing gnutls handshake");
+        if (!_ecore_con_ssl_server_init_gnutls(svr))
+          return 0;
+        return -1;
+     }
+
+   num = gnutls_record_recv(svr->session, buf, size);
+   if (num > 0)
+     return num;
+
+   if (num == GNUTLS_E_REHANDSHAKE)
+     {
+        WRN("Rehandshake request ignored");
+        return 0;
+
+        svr->handshaking = EINA_TRUE;
+        svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+        if (!_ecore_con_ssl_server_init_gnutls(svr))
+          return 0;
+     }
+   else if ((!gnutls_error_is_fatal(num)) && (num != GNUTLS_E_SUCCESS))
+     return 0;
+
+   return -1;
+}
+
+static int
+_ecore_con_ssl_server_write_gnutls(Ecore_Con_Server *svr,
+                                   const unsigned char *buf,
+                                   int               size)
+{
+   int num;
+
+   if (svr->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
+     {
+        DBG("Continuing gnutls handshake");
+        if (!_ecore_con_ssl_server_init_gnutls(svr))
+          return 0;
+        return -1;
+     }
+
+   num = gnutls_record_send(svr->session, buf, size);
+   if (num > 0)
+     return num;
+
+   if (num == GNUTLS_E_REHANDSHAKE)
+     {
+        WRN("Rehandshake request ignored");
+        return 0;
+/* this is only partly functional I think? */
+        svr->handshaking = EINA_TRUE;
+        svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+        if (!_ecore_con_ssl_server_init_gnutls(svr))
+          return 0;
+     }
+   else if (!gnutls_error_is_fatal(num))
+     return 0;
+
+   return -1;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_client_init_gnutls(Ecore_Con_Client *cl)
+{
+   const gnutls_datum_t *cert_list;
+   unsigned int iter, cert_list_size;
+   const char *priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0";
+   int ret = 0;
+
+   switch (cl->ssl_state)
+     {
+      case ECORE_CON_SSL_STATE_DONE:
+        return ECORE_CON_SSL_ERROR_NONE;
+
+      case ECORE_CON_SSL_STATE_INIT:
+        if (cl->host_server->type & ECORE_CON_USE_SSL2) /* not supported because of security issues */
+          return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
+
+        switch (cl->host_server->type & ECORE_CON_SSL)
+          {
+           case ECORE_CON_USE_SSL3:
+           case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
+             priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1";
+             break;
+
+           case ECORE_CON_USE_TLS:
+           case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
+             priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0";
+             break;
+
+           case ECORE_CON_USE_MIXED:
+           case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
+             break;
+
+           default:
+             return ECORE_CON_SSL_ERROR_NONE;
+          }
+
+        _client_connected++;
+
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_init(&cl->session, GNUTLS_SERVER));
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_key_generate(&cl->session_ticket));
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_enable_server(cl->session, &cl->session_ticket));
+        INF("Applying priority string: %s", priority);
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_priority_set_direct(cl->session, priority, NULL));
+        SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_CERTIFICATE, cl->host_server->cert));
+        //  SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_PSK, cl->host_server->pskcred_s));
+        if (!cl->host_server->use_cert)
+          SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_ANON, cl->host_server->anoncred_s));
+
+        gnutls_certificate_server_set_request(cl->session, GNUTLS_CERT_REQUEST);
+
+        gnutls_dh_set_prime_bits(cl->session, 2048);
+        gnutls_transport_set_ptr(cl->session, (gnutls_transport_ptr_t)((intptr_t)cl->fd));
+        cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+
+      case ECORE_CON_SSL_STATE_HANDSHAKING:
+        if (!cl->session)
+          {
+             DBG("Client was previously lost, going to error condition");
+             goto error;
+          }
+        DBG("calling gnutls_handshake()");
+        ret = gnutls_handshake(cl->session);
+        SSL_ERROR_CHECK_GOTO_ERROR(gnutls_error_is_fatal(ret));
+
+        if (!ret)
+          {
+             cl->handshaking = EINA_FALSE;
+             cl->ssl_state = ECORE_CON_SSL_STATE_DONE;
+          }
+        else
+          {
+             if (gnutls_record_get_direction(cl->session))
+               ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
+             else
+               ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+             return ECORE_CON_SSL_ERROR_NONE;
+          }
+
+      default:
+        break;
+     }
+
+   if (!cl->host_server->verify)
+     /* not verifying certificates, so we're done! */
+     return ECORE_CON_SSL_ERROR_NONE;
+   /* use CRL/CA lists to verify */
+   SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_verify_peers2(cl->session, &iter));
+   if (iter & GNUTLS_CERT_INVALID)
+     ERR("The certificate is not trusted.");
+   else if (iter & GNUTLS_CERT_SIGNER_NOT_FOUND)
+     ERR("The certificate hasn't got a known issuer.");
+   else if (iter & GNUTLS_CERT_REVOKED)
+     ERR("The certificate has been revoked.");
+   else if (iter & GNUTLS_CERT_EXPIRED)
+     ERR("The certificate has expired");
+   else if (iter & GNUTLS_CERT_NOT_ACTIVATED)
+     ERR("The certificate is not yet activated");
+
+   if (iter)
+     goto error;
+   if (gnutls_certificate_type_get(cl->session) != GNUTLS_CRT_X509)
+     {
+        ERR("Warning: PGP certificates are not yet supported!");
+        goto error;
+     }
+
+   SSL_ERROR_CHECK_GOTO_ERROR(!(cert_list = gnutls_certificate_get_peers(cl->session, &cert_list_size)));
+   SSL_ERROR_CHECK_GOTO_ERROR(!cert_list_size);
+
+   _gnutls_print_session(cert_list, cert_list_size);
+/*
+   gnutls_x509_crt_t cert = NULL;
+   SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_init(&cert));
+   SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER));
+
+   SSL_ERROR_CHECK_GOTO_ERROR(!gnutls_x509_crt_check_hostname(cert, cl->host_server->name));
+   gnutls_x509_crt_deinit(cert);
+*/
+   DBG("SSL certificate verification succeeded!");
+   return ECORE_CON_SSL_ERROR_NONE;
+
+error:
+   _gnutls_print_errors(cl, ECORE_CON_EVENT_CLIENT_ERROR, ret);
+   if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED) || (ret == GNUTLS_E_FATAL_ALERT_RECEIVED))
+     ERR("Also received alert: %s", gnutls_alert_get_name(gnutls_alert_get(cl->session)));
+   if (cl->session && (cl->ssl_state != ECORE_CON_SSL_STATE_DONE))
+     {
+        ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(cl->session)));
+        ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(cl->session)));
+     }
+/*
+   if (cert)
+     gnutls_x509_crt_deinit(cert);
+*/
+   _ecore_con_ssl_client_shutdown_gnutls(cl);
+   return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_client_shutdown_gnutls(Ecore_Con_Client *cl)
+{
+   if (cl->session)
+     {
+        gnutls_bye(cl->session, GNUTLS_SHUT_RDWR);
+        gnutls_deinit(cl->session);
+        gnutls_free(cl->session_ticket.data);
+        cl->session_ticket.data = NULL;
+     }
+
+   cl->session = NULL;
+
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static int
+_ecore_con_ssl_client_read_gnutls(Ecore_Con_Client *cl,
+                                  unsigned char    *buf,
+                                  int               size)
+{
+   int num;
+
+   if (cl->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
+     {
+        if (!_ecore_con_ssl_client_init_gnutls(cl))
+          return 0;
+        return -1;
+     }
+
+   num = gnutls_record_recv(cl->session, buf, size);
+   if (num > 0)
+     return num;
+
+   if (num == GNUTLS_E_REHANDSHAKE)
+     {
+        WRN("Rehandshake request ignored");
+        return 0;
+        cl->handshaking = EINA_TRUE;
+        cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+        if (!_ecore_con_ssl_client_init_gnutls(cl))
+          return 0;
+        WRN("Rehandshake request ignored");
+        return 0;
+     }
+   else if ((!gnutls_error_is_fatal(num)) && (num != GNUTLS_E_SUCCESS))
+     return 0;
+
+   return -1;
+}
+
+static int
+_ecore_con_ssl_client_write_gnutls(Ecore_Con_Client *cl,
+                                   const unsigned char *buf,
+                                   int               size)
+{
+   int num;
+
+   if (cl->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
+     {
+        if (!_ecore_con_ssl_client_init_gnutls(cl))
+          return 0;
+        return -1;
+     }
+
+   num = gnutls_record_send(cl->session, buf, size);
+   if (num > 0)
+     return num;
+
+   if (num == GNUTLS_E_REHANDSHAKE)
+     {
+        WRN("Rehandshake request ignored");
+        return 0;
+        cl->handshaking = EINA_TRUE;
+        cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+        if (!_ecore_con_ssl_client_init_gnutls(cl))
+          return 0;
+     }
+   else if (!gnutls_error_is_fatal(num))
+     return 0;
+
+   return -1;
+}
+
+#elif USE_OPENSSL && !USE_GNUTLS
+
+/*
+ * OpenSSL
+ */
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_init_openssl(void)
+{
+   SSL_library_init();
+   SSL_load_error_strings();
+   OpenSSL_add_all_algorithms();
+
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_shutdown_openssl(void)
+{
+   ERR_free_strings();
+   EVP_cleanup();
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *svr,
+                                      int               ssl_type)
+{
+   long options;
+   int dh = 0;
+
+   if (ssl_type & ECORE_CON_USE_SSL2)
+     return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
+
+   switch (ssl_type)
+     {
+      case ECORE_CON_USE_SSL3:
+      case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
+        if (!svr->created)
+          SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_client_method())));
+        else
+          SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_server_method())));
+        break;
+
+      case ECORE_CON_USE_TLS:
+      case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
+        if (!svr->created)
+          SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_client_method())));
+        else
+          SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_server_method())));
+        break;
+
+      case ECORE_CON_USE_MIXED:
+      case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
+        if (!svr->created)
+          SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_client_method())));
+        else
+          SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_server_method())));
+        options = SSL_CTX_get_options(svr->ssl_ctx);
+        SSL_CTX_set_options(svr->ssl_ctx, options | SSL_OP_NO_SSLv2 | SSL_OP_SINGLE_DH_USE);
+        break;
+
+      default:
+        svr->ssl_prepared = EINA_TRUE;
+        return ECORE_CON_SSL_ERROR_NONE;
+     }
+
+   if ((!svr->use_cert) && svr->created)
+     {
+        DH *dh_params;
+        INF("Generating DH params");
+        SSL_ERROR_CHECK_GOTO_ERROR(!(dh_params = DH_new()));
+        SSL_ERROR_CHECK_GOTO_ERROR(!DH_generate_parameters_ex(dh_params, 1024, DH_GENERATOR_5, NULL));
+        SSL_ERROR_CHECK_GOTO_ERROR(!DH_check(dh_params, &dh));
+        SSL_ERROR_CHECK_GOTO_ERROR((dh & DH_CHECK_P_NOT_PRIME) || (dh & DH_CHECK_P_NOT_SAFE_PRIME));
+        SSL_ERROR_CHECK_GOTO_ERROR(!DH_generate_key(dh_params));
+        SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_tmp_dh(svr->ssl_ctx, dh_params));
+        DH_free(dh_params);
+        INF("DH params successfully generated and applied!");
+        SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_cipher_list(svr->ssl_ctx, "aNULL:!eNULL:!LOW:!EXPORT:@STRENGTH"));
+     }
+   else if (!svr->use_cert)
+     SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_cipher_list(svr->ssl_ctx, "aNULL:!eNULL:!LOW:!EXPORT:!ECDH:RSA:AES:!PSK:@STRENGTH"));
+
+   svr->ssl_prepared = EINA_TRUE;
+   return ECORE_CON_SSL_ERROR_NONE;
+
+error:
+   if (dh)
+     {
+        if (dh & DH_CHECK_P_NOT_PRIME)
+          ERR("openssl error: dh_params could not generate a prime!");
+        else
+          ERR("openssl error: dh_params could not generate a safe prime!");
+     }
+   else
+     _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
+   _ecore_con_ssl_server_shutdown_openssl(svr);
+   return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_init_openssl(Ecore_Con_Server *svr)
+{
+   int ret = -1;
+
+   switch (svr->ssl_state)
+     {
+      case ECORE_CON_SSL_STATE_DONE:
+        return ECORE_CON_SSL_ERROR_NONE;
+
+      case ECORE_CON_SSL_STATE_INIT:
+        SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl = SSL_new(svr->ssl_ctx)));
+
+        SSL_ERROR_CHECK_GOTO_ERROR(!SSL_set_fd(svr->ssl, svr->fd));
+        SSL_set_connect_state(svr->ssl);
+        svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+
+      case ECORE_CON_SSL_STATE_HANDSHAKING:
+        if (!svr->ssl)
+          {
+             DBG("Server was previously lost, going to error condition");
+             goto error;
+          }
+        ret = SSL_do_handshake(svr->ssl);
+        svr->ssl_err = SSL_get_error(svr->ssl, ret);
+        SSL_ERROR_CHECK_GOTO_ERROR((svr->ssl_err == SSL_ERROR_SYSCALL) || (svr->ssl_err == SSL_ERROR_SSL));
+
+        if (ret == 1)
+          {
+             svr->handshaking = EINA_FALSE;
+             svr->ssl_state = ECORE_CON_SSL_STATE_DONE;
+          }
+        else
+          {
+             if (svr->ssl_err == SSL_ERROR_WANT_READ)
+               ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+             else if (svr->ssl_err == SSL_ERROR_WANT_WRITE)
+               ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+             return ECORE_CON_SSL_ERROR_NONE;
+          }
+
+      default:
+        break;
+     }
+
+   _openssl_print_session(svr->ssl);
+   if ((!svr->verify) && (!svr->verify_basic))
+     /* not verifying certificates, so we're done! */
+     return ECORE_CON_SSL_ERROR_NONE;
+
+   {
+      X509 *cert;
+      SSL_set_verify(svr->ssl, SSL_VERIFY_PEER, NULL);
+      /* use CRL/CA lists to verify */
+      cert = SSL_get_peer_certificate(svr->ssl);
+      if (cert)
+        {
+           char *c;
+           int clen;
+           int name = 0;
+
+           if (svr->verify)
+             {
+               int err;
+
+               err = SSL_get_verify_result(svr->ssl);
+               _openssl_print_verify_error(err);
+               SSL_ERROR_CHECK_GOTO_ERROR(err);
+             }
+           clen = X509_NAME_get_text_by_NID(X509_get_subject_name(cert), NID_subject_alt_name, NULL, 0);
+           if (clen > 0)
+             name = NID_subject_alt_name;
+           else
+             clen = X509_NAME_get_text_by_NID(X509_get_subject_name(cert), NID_commonName, NULL, 0);
+           SSL_ERROR_CHECK_GOTO_ERROR(clen < 1);
+           if (!name) name = NID_commonName;
+           c = alloca(++clen);
+           X509_NAME_get_text_by_NID(X509_get_subject_name(cert), name, c, clen);
+           INF("CERT NAME: %s\n", c);
+           SSL_ERROR_CHECK_GOTO_ERROR(!_openssl_name_verify(c, svr->verify_name ?: svr->name));
+        }
+   }
+
+   DBG("SSL certificate verification succeeded!");
+
+   return ECORE_CON_SSL_ERROR_NONE;
+
+error:
+   _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
+   _ecore_con_ssl_server_shutdown_openssl(svr);
+   return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_cafile_add_openssl(Ecore_Con_Server *svr,
+                                         const char       *ca_file)
+{
+   struct stat st;
+
+   if (stat(ca_file, &st)) return EINA_FALSE;
+   if (S_ISDIR(st.st_mode))
+     SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_load_verify_locations(svr->ssl_ctx, NULL, ca_file));
+   else
+     SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_load_verify_locations(svr->ssl_ctx, ca_file, NULL));
+   return EINA_TRUE;
+
+error:
+   _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_crl_add_openssl(Ecore_Con_Server *svr,
+                                      const char       *crl_file)
+{
+   X509_STORE *st;
+   X509_LOOKUP *lu;
+   static Eina_Bool flag = EINA_FALSE;
+
+   SSL_ERROR_CHECK_GOTO_ERROR(!(st = SSL_CTX_get_cert_store(svr->ssl_ctx)));
+   SSL_ERROR_CHECK_GOTO_ERROR(!(lu = X509_STORE_add_lookup(st, X509_LOOKUP_file())));
+   SSL_ERROR_CHECK_GOTO_ERROR(X509_load_crl_file(lu, crl_file, X509_FILETYPE_PEM) < 1);
+   if (!flag)
+     {
+        X509_STORE_set_flags(st, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
+        flag = EINA_TRUE;
+     }
+
+   return EINA_TRUE;
+
+error:
+   _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_privkey_add_openssl(Ecore_Con_Server *svr,
+                                          const char       *key_file)
+{
+   FILE *fp = NULL;
+   EVP_PKEY *privkey = NULL;
+
+   if (!(fp = fopen(key_file, "r")))
+     goto error;
+
+   SSL_ERROR_CHECK_GOTO_ERROR(!(privkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL)));
+
+   fclose(fp);
+   fp = NULL;
+   SSL_ERROR_CHECK_GOTO_ERROR(SSL_CTX_use_PrivateKey(svr->ssl_ctx, privkey) < 1);
+   SSL_ERROR_CHECK_GOTO_ERROR(SSL_CTX_check_private_key(svr->ssl_ctx) < 1);
+
+   return EINA_TRUE;
+
+error:
+   if (fp)
+     fclose(fp);
+   _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_cert_add_openssl(Ecore_Con_Server *svr,
+                                       const char       *cert_file)
+{
+   FILE *fp = NULL;
+   X509 *cert = NULL;
+
+   if (!(fp = fopen(cert_file, "r")))
+     goto error;
+
+   SSL_ERROR_CHECK_GOTO_ERROR(!(cert = PEM_read_X509(fp, NULL, NULL, NULL)));
+
+   fclose(fp);
+   fp = NULL;
+   SSL_ERROR_CHECK_GOTO_ERROR(SSL_CTX_use_certificate(svr->ssl_ctx, cert) < 1);
+
+   return EINA_TRUE;
+
+error:
+   if (fp)
+     fclose(fp);
+   _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
+   return EINA_FALSE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_shutdown_openssl(Ecore_Con_Server *svr)
+{
+   if (svr->ssl)
+     {
+        if (!SSL_shutdown(svr->ssl))
+          SSL_shutdown(svr->ssl);
+
+        SSL_free(svr->ssl);
+     }
+
+   if (svr->ssl_ctx)
+     SSL_CTX_free(svr->ssl_ctx);
+
+   svr->ssl = NULL;
+   svr->ssl_ctx = NULL;
+   svr->ssl_err = SSL_ERROR_NONE;
+
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static int
+_ecore_con_ssl_server_read_openssl(Ecore_Con_Server *svr,
+                                   unsigned char    *buf,
+                                   int               size)
+{
+   int num;
+
+   if (!svr->ssl) return -1;
+   num = SSL_read(svr->ssl, buf, size);
+   svr->ssl_err = SSL_get_error(svr->ssl, num);
+
+   if (svr->fd_handler)
+     {
+        if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_READ)
+          ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+        else if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_WRITE)
+          ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+     }
+
+   if ((svr->ssl_err == SSL_ERROR_ZERO_RETURN) ||
+       (svr->ssl_err == SSL_ERROR_SYSCALL) ||
+       (svr->ssl_err == SSL_ERROR_SSL))
+     return -1;
+
+   if (num < 0)
+     return 0;
+
+   return num;
+}
+
+static int
+_ecore_con_ssl_server_write_openssl(Ecore_Con_Server *svr,
+                                    const unsigned char *buf,
+                                    int               size)
+{
+   int num;
+
+   num = SSL_write(svr->ssl, buf, size);
+   svr->ssl_err = SSL_get_error(svr->ssl, num);
+
+   if (svr->fd_handler)
+     {
+        if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_READ)
+          ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+        else if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_WRITE)
+          ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
+     }
+
+   if ((svr->ssl_err == SSL_ERROR_ZERO_RETURN) ||
+       (svr->ssl_err == SSL_ERROR_SYSCALL) ||
+       (svr->ssl_err == SSL_ERROR_SSL))
+     return -1;
+
+   if (num < 0)
+     return 0;
+
+   return num;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_client_init_openssl(Ecore_Con_Client *cl)
+{
+   int ret = -1;
+   switch (cl->ssl_state)
+     {
+      case ECORE_CON_SSL_STATE_DONE:
+        return ECORE_CON_SSL_ERROR_NONE;
+
+      case ECORE_CON_SSL_STATE_INIT:
+        SSL_ERROR_CHECK_GOTO_ERROR(!(cl->ssl = SSL_new(cl->host_server->ssl_ctx)));
+
+        SSL_ERROR_CHECK_GOTO_ERROR(!SSL_set_fd(cl->ssl, cl->fd));
+        SSL_set_accept_state(cl->ssl);
+        cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
+
+      case ECORE_CON_SSL_STATE_HANDSHAKING:
+         if (!cl->ssl)
+          {
+             DBG("Client was previously lost, going to error condition");
+             goto error;
+          }
+        ret = SSL_do_handshake(cl->ssl);
+        cl->ssl_err = SSL_get_error(cl->ssl, ret);
+        SSL_ERROR_CHECK_GOTO_ERROR((cl->ssl_err == SSL_ERROR_SYSCALL) || (cl->ssl_err == SSL_ERROR_SSL));
+        if (ret == 1)
+          {
+             cl->handshaking = EINA_FALSE;
+             cl->ssl_state = ECORE_CON_SSL_STATE_DONE;
+          }
+        else
+          {
+             if (cl->ssl_err == SSL_ERROR_WANT_READ)
+               ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+             else if (cl->ssl_err == SSL_ERROR_WANT_WRITE)
+               ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
+             return ECORE_CON_SSL_ERROR_NONE;
+          }
+
+      default:
+        break;
+     }
+
+   _openssl_print_session(cl->ssl);
+   if (!cl->host_server->verify)
+     /* not verifying certificates, so we're done! */
+     return ECORE_CON_SSL_ERROR_NONE;
+   SSL_set_verify(cl->ssl, SSL_VERIFY_PEER, NULL);
+   /* use CRL/CA lists to verify */
+   if (SSL_get_peer_certificate(cl->ssl))
+     {
+        int err;
+
+        err = SSL_get_verify_result(cl->ssl);
+        _openssl_print_verify_error(err);
+        SSL_ERROR_CHECK_GOTO_ERROR(err);
+     }
+
+   return ECORE_CON_SSL_ERROR_NONE;
+
+error:
+   _openssl_print_errors(cl, ECORE_CON_EVENT_CLIENT_ERROR);
+   _ecore_con_ssl_client_shutdown_openssl(cl);
+   return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_client_shutdown_openssl(Ecore_Con_Client *cl)
+{
+   if (cl->ssl)
+     {
+        if (!SSL_shutdown(cl->ssl))
+          SSL_shutdown(cl->ssl);
+
+        SSL_free(cl->ssl);
+     }
+
+   cl->ssl = NULL;
+   cl->ssl_err = SSL_ERROR_NONE;
+
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static int
+_ecore_con_ssl_client_read_openssl(Ecore_Con_Client *cl,
+                                   unsigned char    *buf,
+                                   int               size)
+{
+   int num;
+
+   if (!cl->ssl) return -1;
+   num = SSL_read(cl->ssl, buf, size);
+   cl->ssl_err = SSL_get_error(cl->ssl, num);
+
+   if (cl->fd_handler)
+     {
+        if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_READ)
+          ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+        else if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_WRITE)
+          ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
+     }
+
+   if ((cl->ssl_err == SSL_ERROR_ZERO_RETURN) ||
+       (cl->ssl_err == SSL_ERROR_SYSCALL) ||
+       (cl->ssl_err == SSL_ERROR_SSL))
+     return -1;
+
+   if (num < 0)
+     return 0;
+
+   return num;
+}
+
+static int
+_ecore_con_ssl_client_write_openssl(Ecore_Con_Client *cl,
+                                    const unsigned char *buf,
+                                    int               size)
+{
+   int num;
+
+   num = SSL_write(cl->ssl, buf, size);
+   cl->ssl_err = SSL_get_error(cl->ssl, num);
+
+   if (cl->fd_handler)
+     {
+        if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_READ)
+          ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
+        else if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_WRITE)
+          ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
+     }
+
+   if ((cl->ssl_err == SSL_ERROR_ZERO_RETURN) ||
+       (cl->ssl_err == SSL_ERROR_SYSCALL) ||
+       (cl->ssl_err == SSL_ERROR_SSL))
+     return -1;
+
+   if (num < 0)
+     return 0;
+
+   return num;
+}
+
+#else
+
+/*
+ * No Ssl
+ */
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_init_none(void)
+{
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_shutdown_none(void)
+{
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_prepare_none(Ecore_Con_Server *svr __UNUSED__,
+                                   int ssl_type          __UNUSED__)
+{
+   return ECORE_CON_SSL_ERROR_NONE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_init_none(Ecore_Con_Server *svr __UNUSED__)
+{
+   return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_cafile_add_none(Ecore_Con_Server *svr __UNUSED__,
+                                      const char *ca_file   __UNUSED__)
+{
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_cert_add_none(Ecore_Con_Server *svr __UNUSED__,
+                                    const char *cert_file __UNUSED__)
+{
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_privkey_add_none(Ecore_Con_Server *svr __UNUSED__,
+                                       const char *key_file  __UNUSED__)
+{
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_ecore_con_ssl_server_crl_add_none(Ecore_Con_Server *svr __UNUSED__,
+                                   const char *crl_file  __UNUSED__)
+{
+   return EINA_FALSE;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_server_shutdown_none(Ecore_Con_Server *svr __UNUSED__)
+{
+   return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
+}
+
+static int
+_ecore_con_ssl_server_read_none(Ecore_Con_Server *svr __UNUSED__,
+                                unsigned char *buf    __UNUSED__,
+                                int size              __UNUSED__)
+{
+   return -1;
+}
+
+static int
+_ecore_con_ssl_server_write_none(Ecore_Con_Server *svr __UNUSED__,
+                                 const unsigned char *buf __UNUSED__,
+                                 int size              __UNUSED__)
+{
+   return -1;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_client_init_none(Ecore_Con_Client *cl __UNUSED__)
+{
+   return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
+}
+
+static Ecore_Con_Ssl_Error
+_ecore_con_ssl_client_shutdown_none(Ecore_Con_Client *cl __UNUSED__)
+{
+   return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
+}
+
+static int
+_ecore_con_ssl_client_read_none(Ecore_Con_Client *cl __UNUSED__,
+                                unsigned char *buf   __UNUSED__,
+                                int size             __UNUSED__)
+{
+   return -1;
+}
+
+static int
+_ecore_con_ssl_client_write_none(Ecore_Con_Client *cl __UNUSED__,
+                                 const unsigned char *buf __UNUSED__,
+                                 int size             __UNUSED__)
+{
+   return -1;
+}
+
+#endif
index 7527f58..419cfca 100644 (file)
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-/*
  * For info on how to use libcurl, see:
  * http://curl.haxx.se/libcurl/c/libcurl-tutorial.html
  */
 
 /*
- * Brief usage:
- * 1. Create an Ecore_Con_Url object
- * 2. Register to receive the ECORE_CON_EVENT_URL_COMPLETE event
- *    (and optionally the ECORE_CON_EVENT_URL_DATA event to receive
- *    the response, e.g. for HTTP/FTP downloads)
- * 3. Set the URL with ecore_con_url_url_set(...);
- * 4. Perform the operation with ecore_con_url_send(...);
- *
- * Note that it is good to reuse Ecore_Con_Url objects wherever possible, but
- * bear in mind that each one can only perform one operation at a time.
- * You need to wait for the ECORE_CON_EVENT_URL_COMPLETE event before re-using
- * or destroying the object.
- * 
- * Example Usage 1 (HTTP GET):
- *   ecore_con_url_url_set(url_con, "http://www.google.com");
- *   ecore_con_url_send(url_con, NULL, 0, NULL);
- *
- * Example usage 2 (HTTP POST):
- *   ecore_con_url_url_set(url_con, "http://www.example.com/post_handler.cgi");
- *   ecore_con_url_send(url_con, data, data_length, "multipart/form-data");
- *
- * Example Usage 3 (FTP download):
- *   ecore_con_url_url_set(url_con, "ftp://ftp.example.com/pub/myfile");
- *   ecore_con_url_send(url_con, NULL, 0, NULL);
- *
- * Example Usage 4 (FTP upload as ftp://ftp.example.com/file):
- *   ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
- *   ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass", NULL);
- *
- * Example Usage 5 (FTP upload as ftp://ftp.example.com/dir/file):
- *   ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
- *   ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass","dir");
- *
- * FIXME: Support more CURL features: Authentication, Progress callbacks and more...
+ * FIXME: Support more CURL features...
  */
-#include "Ecore.h"
-#include "ecore_private.h"
-#include "Ecore_Con.h"
-#include "ecore_con_private.h"
 
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <unistd.h>
 
-/**
- * @defgroup Ecore_Con_Url_Group Ecore URL Connection Functions
- *
- * Utility functions that set up, use and shut down the Ecore URL 
- * Connection library.
- * FIXME: write detailed description
- */
+#ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+
+#ifdef HAVE_ESCAPE
+# include <Escape.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+#include "Ecore_Con.h"
+#include "ecore_con_private.h"
+
+#define CURL_MIN_TIMEOUT 100
 
 int ECORE_CON_EVENT_URL_DATA = 0;
 int ECORE_CON_EVENT_URL_COMPLETE = 0;
 int ECORE_CON_EVENT_URL_PROGRESS = 0;
 
 #ifdef HAVE_CURL
-static int _ecore_con_url_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_con_url_perform(Ecore_Con_Url *url_con);
-static size_t _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp);
-static int _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
-static size_t _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream);
-static void _ecore_con_event_url_free(void *data __UNUSED__, void *ev);
-static int _ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match);
-
-static Ecore_Idler     *_fd_idler_handler = NULL;
-static Ecore_List      *_url_con_list = NULL;
-static CURLM           *curlm = NULL;
-static fd_set           _current_fd_set;
-static int              init_count = 0;
-
-struct _Ecore_Con_Url_Event
-{
-  int    type;
-  void  *ev;
-};
-typedef struct _Ecore_Con_Url_Event Ecore_Con_Url_Event;
-
-static int
-_url_complete_idler_cb(void *data)
-{
-   Ecore_Con_Url_Event *lev;
-
-   lev = data;
-
-   ecore_event_add(lev->type, lev->ev, _ecore_con_event_url_free, NULL);
-   free(lev);
-
-   return 0;
-}
-
-static void
-_url_complete_push_event(int type, void *ev)
-{
-   Ecore_Con_Url_Event *lev;
-
-   lev = malloc(sizeof(Ecore_Con_Url_Event));
-   lev->type = type;
-   lev->ev = ev;
-
-   ecore_idler_add(_url_complete_idler_cb, lev);
-}
-
+static void      _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg);
+static void      _ecore_con_url_multi_remove(Ecore_Con_Url *url_con);
+static Eina_Bool _ecore_con_url_perform(Ecore_Con_Url *url_con);
+static size_t    _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream);
+static size_t    _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp);
+static int       _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
+static size_t    _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream);
+static void      _ecore_con_event_url_free(Ecore_Con_Url *url_con, void *ev);
+static Eina_Bool _ecore_con_url_timer(void *data);
+static Eina_Bool _ecore_con_url_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_con_url_timeout_cb(void *data);
+static void      _ecore_con_url_status_get(Ecore_Con_Url *url_con);
+
+static Eina_List *_url_con_list = NULL;
+static Eina_List *_fd_hd_list = NULL;
+static CURLM *_curlm = NULL;
+static int _init_count = 0;
+static Ecore_Timer *_curl_timer = NULL;
+static Eina_Bool pipelining = EINA_FALSE;
+Ecore_Idler *_curl_idler;
 #endif
 
 /**
- * Initialises the Ecore_Con_Url library.
- * @return Number of times the library has been initialised without being
- *          shut down.
- * @ingroup Ecore_Con_Url_Group
+ * @addtogroup Ecore_Con_Url_Group Ecore URL Connection Functions
+ *
+ * @{
  */
+
 EAPI int
 ecore_con_url_init(void)
 {
 #ifdef HAVE_CURL
-   if (!ECORE_CON_EVENT_URL_DATA)
-     {
-       ECORE_CON_EVENT_URL_DATA = ecore_event_type_new();
-       ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new();
-       ECORE_CON_EVENT_URL_PROGRESS = ecore_event_type_new();
-     }
+   long ms;
+   if (++_init_count > 1) return _init_count;
+
+   ECORE_CON_EVENT_URL_DATA = ecore_event_type_new();
+   ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new();
+   ECORE_CON_EVENT_URL_PROGRESS = ecore_event_type_new();
 
-   if (!_url_con_list)
+   // curl_global_init() is not thread safe!
+   if (curl_global_init(CURL_GLOBAL_ALL)) return --_init_count;
+
+   _curlm = curl_multi_init();
+   if (!_curlm)
      {
-       _url_con_list = ecore_list_new();
-       if (!_url_con_list) return 0;
+        curl_global_cleanup();
+        return --_init_count;
      }
 
-   if (!curlm)
-     {
-       FD_ZERO(&_current_fd_set);
-       if (curl_global_init(CURL_GLOBAL_NOTHING))
-         {
-            ecore_list_destroy(_url_con_list);
-            _url_con_list = NULL;
-            return 0;
-         }
+   curl_multi_timeout(_curlm, &ms);
+   if (ms >= CURL_MIN_TIMEOUT || ms <= 0) ms = CURL_MIN_TIMEOUT;
 
-       curlm = curl_multi_init();
-       if (!curlm)
-         {
-            ecore_list_destroy(_url_con_list);
-            _url_con_list = NULL;
-            return 0;
-         }
-     }
-   init_count++;
-   return 1;
+   _curl_timer = ecore_timer_add((double)ms / 1000, _ecore_con_url_timer, NULL);
+   ecore_timer_freeze(_curl_timer);
+   _curl_idler = NULL;
+
+   return _init_count;
 #else
    return 0;
 #endif
 }
 
-/**
- * Shuts down the Ecore_Con_Url library.
- * @return  Number of calls that still uses Ecore_Con_Url
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI int
 ecore_con_url_shutdown(void)
 {
 #ifdef HAVE_CURL
+   Ecore_Con_Url *url_con;
+   Ecore_Fd_Handler *fd_handler;
+   if (_init_count == 0) return 0;
+   --_init_count;
+   if (_init_count) return _init_count;
 
-   if (!init_count)
-     return 0;
-
-   init_count--;
-   if (_url_con_list)
+   if (_curl_timer)
      {
-       if (!ecore_list_empty_is(_url_con_list))
-         {
-            Ecore_Con_Url *url_con;
-            while ((url_con = ecore_list_first(_url_con_list)))
-              {
-                 ecore_con_url_destroy(url_con);
-              }
-         }
-       ecore_list_destroy(_url_con_list);
-       _url_con_list = NULL;
+        ecore_timer_del(_curl_timer);
+        _curl_timer = NULL;
      }
 
-   if (curlm)
+   if (_curl_idler) ecore_idler_del(_curl_idler);
+   _curl_idler = NULL;
+
+   EINA_LIST_FREE(_url_con_list, url_con)
+     ecore_con_url_free(url_con);
+   EINA_LIST_FREE(_fd_hd_list, fd_handler)
+     ecore_main_fd_handler_del(fd_handler);
+
+   if (_curlm)
      {
-       curl_multi_cleanup(curlm);
-       curlm = NULL;
+        curl_multi_cleanup(_curlm);
+        _curlm = NULL;
      }
-
    curl_global_cleanup();
+   return 0;
 #endif
    return 1;
 }
 
-/**
- * Creates and initializes a new Ecore_Con_Url.
- * @return  NULL on error, a new Ecore_Con_Url on success.
- * @ingroup Ecore_Con_Url_Group
- */
+EAPI void
+ecore_con_url_pipeline_set(Eina_Bool enable)
+{
+#ifdef HAVE_CURL
+   if (enable == pipelining) return;
+   curl_multi_setopt(_curlm, CURLMOPT_PIPELINING, !!enable);
+   pipelining = enable;
+#else
+   return;
+   (void)enable;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_con_url_pipeline_get(void)
+{
+#ifdef HAVE_CURL
+   return pipelining;
+#endif
+   return EINA_FALSE;
+}
+
+extern Ecore_Con_Socks *_ecore_con_proxy_global;
+
 EAPI Ecore_Con_Url *
 ecore_con_url_new(const char *url)
 {
 #ifdef HAVE_CURL
    Ecore_Con_Url *url_con;
+   CURLcode ret;
 
-   if (!init_count) return NULL;
+   if (!_init_count)
+     return NULL;
 
    url_con = calloc(1, sizeof(Ecore_Con_Url));
-   if (!url_con) return NULL;
+   if (!url_con)
+     return NULL;
+
+   url_con->write_fd = -1;
 
    url_con->curl_easy = curl_easy_init();
    if (!url_con->curl_easy)
      {
-       free(url_con);
-       return NULL;
+        free(url_con);
+        return NULL;
      }
 
    ECORE_MAGIC_SET(url_con, ECORE_MAGIC_CON_URL);
 
-   ecore_con_url_url_set(url_con, url);
+   if (!ecore_con_url_url_set(url_con, url))
+     {
+        ecore_con_url_free(url_con);
+        return NULL;
+     }
+
+   // Read socks proxy
+   url_con->proxy_type = -1;
+   if (_ecore_con_proxy_global && _ecore_con_proxy_global->ip &&
+       (_ecore_con_proxy_global->version == 4 ||
+        _ecore_con_proxy_global->version == 5))
+     {
+        char proxy[256];
+        char host[256];
+
+        if (_ecore_con_proxy_global->version == 5)
+          {
+             if (_ecore_con_proxy_global->lookup)
+                snprintf(host, sizeof(host), "socks5h://%s",
+                         _ecore_con_proxy_global->ip);
+             else snprintf(host, sizeof(host), "socks5://%s",
+                           _ecore_con_proxy_global->ip);
+          }
+        else if (_ecore_con_proxy_global->version == 4)
+          {
+             if (_ecore_con_proxy_global->lookup)
+                snprintf(host, sizeof(host), "socks4a://%s",
+                         _ecore_con_proxy_global->ip);
+             else snprintf(host, sizeof(host), "socks4://%s",
+                           _ecore_con_proxy_global->ip);
+          }
+
+        if (_ecore_con_proxy_global->port > 0 &&
+            _ecore_con_proxy_global->port <= 65535)
+           snprintf(proxy, sizeof(proxy), "%s:%d", host,
+                    _ecore_con_proxy_global->port);
+        else snprintf(proxy, sizeof(proxy), "%s", host);
+
+        ecore_con_url_proxy_set(url_con, proxy);
+        ecore_con_url_proxy_username_set(url_con,
+                                         _ecore_con_proxy_global->username);
+     }
+
+   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate");
+   if (ret != CURLE_OK)
+     {
+        ERR("Could not set CURLOPT_ENCODING to \"gzip,deflate\": %s",
+            curl_easy_strerror(ret));
+        ecore_con_url_free(url_con);
+        return NULL;
+     }
 
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION, _ecore_con_url_data_cb);
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
+                    _ecore_con_url_data_cb);
    curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con);
 
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, _ecore_con_url_progress_cb);
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
+                    _ecore_con_url_progress_cb);
    curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, FALSE);
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
+
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION,
+                    _ecore_con_url_header_cb);
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con);
 
    /*
     * FIXME: Check that these timeouts are sensible defaults
     * FIXME: Provide a means to change these timeouts
     */
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_FORBID_REUSE, 1);
    curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300);
    curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
 
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate");
+   return url_con;
+#else
+   return NULL;
+   url = NULL;
+#endif
+}
+
+EAPI Ecore_Con_Url *
+ecore_con_url_custom_new(const char *url,
+                         const char *custom_request)
+{
+#ifdef HAVE_CURL
+   Ecore_Con_Url *url_con;
+   CURLcode ret;
+
+   if (!url)
+     return NULL;
 
-   url_con->fd = -1;
-   url_con->write_fd = -1;
+   if (!custom_request)
+     return NULL;
+
+   url_con = ecore_con_url_new(url);
+
+   if (!url_con)
+     return NULL;
+
+   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request);
+   if (ret != CURLE_OK)
+     {
+        ERR("Could not set a custom request string: %s",
+            curl_easy_strerror(ret));
+        ecore_con_url_free(url_con);
+        return NULL;
+     }
 
    return url_con;
 #else
    return NULL;
    url = NULL;
+   custom_request = NULL;
 #endif
 }
 
-/**
- * Frees the Ecore_Con_Url.
- * @return  FIXME: To be documented. 
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI void
-ecore_con_url_destroy(Ecore_Con_Url *url_con)
+ecore_con_url_free(Ecore_Con_Url *url_con)
 {
 #ifdef HAVE_CURL
+   char *s;
+
    if (!url_con) return;
+
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_destroy");
-       return;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_free");
+        return;
      }
 
-   ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
-   if (url_con->fd_handler)
-     {
-       ecore_main_fd_handler_del(url_con->fd_handler);
-       url_con->fd = -1;
-     }
    if (url_con->curl_easy)
      {
-       if (url_con->active)
-         {
-            if (ecore_list_find(_url_con_list, ecore_direct_compare, url_con) == url_con)
-              ecore_list_remove(_url_con_list);
-            url_con->active = 0;
-
-            curl_multi_remove_handle(curlm, url_con->curl_easy);
-         }
-       curl_easy_cleanup(url_con->curl_easy);
+        // FIXME : How can we delete curl_easy's fds ?? (Curl do not give this info.)
+        // This cause "Failed to delete epoll fd xx!" error messages
+        curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL);
+        curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_TRUE);
+
+        if (url_con->multi)
+          {
+             _ecore_con_url_multi_remove(url_con);
+             _url_con_list = eina_list_remove(_url_con_list, url_con);
+          }
+
+        curl_easy_cleanup(url_con->curl_easy);
      }
+   if (url_con->timer) ecore_timer_del(url_con->timer);
+
+   url_con->curl_easy = NULL;
+   url_con->timer = NULL;
+   url_con->dead = EINA_TRUE;
+   if (url_con->event_count) return;
+   ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
+
    curl_slist_free_all(url_con->headers);
-   free(url_con->url);
+   EINA_LIST_FREE(url_con->additional_headers, s)
+     free(s);
+   EINA_LIST_FREE(url_con->response_headers, s)
+     free(s);
+   eina_stringshare_del(url_con->url);
+   if (url_con->post_data) free(url_con->post_data);
    free(url_con);
 #else
    return;
-   url_con = NULL;
+   (void)url_con;
+#endif
+}
+
+EAPI const char *
+ecore_con_url_url_get(Ecore_Con_Url *url_con)
+{
+#ifdef HAVE_CURL
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
+        return NULL;
+     }
+   return url_con->url;
+#else
+   return NULL;
+   (void)url_con;
 #endif
 }
 
-/**
- * FIXME: To be documented.
- * @return  FIXME: To be documented.
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI int
+ecore_con_url_status_code_get(Ecore_Con_Url *url_con)
+{
+#ifdef HAVE_CURL
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
+        return 0;
+     }
+
+   if (url_con->status) return url_con->status;
+   _ecore_con_url_status_get(url_con);
+   return url_con->status;
+#else
+   return -1;
+   (void)url_con;
+#endif
+}
+
+EAPI Eina_Bool
 ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url)
 {
 #ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_url_set");
-       return 0;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_url_set");
+        return EINA_FALSE;
      }
 
-   if (url_con->active) return 0;
+   if (url_con->dead) return EINA_FALSE;
+   eina_stringshare_replace(&url_con->url, url);
 
-   free(url_con->url);
-   url_con->url = NULL;
-   if (url)
-     url_con->url = strdup(url);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, url_con->url);
-   return 1;
+   if (url_con->url)
+     curl_easy_setopt(url_con->curl_easy, CURLOPT_URL,
+                      url_con->url);
+   else
+     curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, "");
+
+   return EINA_TRUE;
 #else
-   return 0;
-   url_con = NULL;
-   url = NULL;
+   return EINA_FALSE;
+   (void)url;
+   (void)url_con;
 #endif
 }
 
-/**
- * FIXME: To be documented.
- * @return  FIXME: To be documented.
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI void
 ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data)
 {
 #ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_set");
-       return;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_set");
+        return;
      }
 
    url_con->data = data;
@@ -350,19 +430,65 @@ ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data)
 #endif
 }
 
-/**
- * FIXME: To be documented.
- * @return  FIXME: To be documented.
- * @ingroup Ecore_Con_Url_Group
- */
+EAPI void
+ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, const char *value)
+{
+#ifdef HAVE_CURL
+   char *tmp;
+
+   if (url_con->dead) return;
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_additional_header_add");
+        return;
+     }
+
+   if (url_con->dead) return;
+   tmp = malloc(strlen(key) + strlen(value) + 3);
+   if (!tmp)
+     return;
+
+   sprintf(tmp, "%s: %s", key, value);
+   url_con->additional_headers = eina_list_append(url_con->additional_headers,
+                                                  tmp);
+#else
+   return;
+   url_con = NULL;
+   key = NULL;
+   value = NULL;
+#endif
+}
+
+EAPI void
+ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con)
+{
+#ifdef HAVE_CURL
+   char *s;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_additional_headers_clear");
+        return;
+     }
+
+   EINA_LIST_FREE(url_con->additional_headers, s)
+     free(s);
+#else
+   return;
+   url_con = NULL;
+#endif
+}
+
 EAPI void *
 ecore_con_url_data_get(Ecore_Con_Url *url_con)
 {
 #ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_get");
+        return NULL;
      }
 
    return url_con->data;
@@ -372,287 +498,886 @@ ecore_con_url_data_get(Ecore_Con_Url *url_con)
 #endif
 }
 
-/**
- * FIXME: To be documented.
- * @return  FIXME: To be documented.
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI void
-ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, time_t tm)
+ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, double timestamp)
 {
 #ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_time");
-       return;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_time");
+        return;
      }
 
-   url_con->condition = condition;
-   url_con->time = tm;
+   if (url_con->dead) return;
+   url_con->time_condition = condition;
+   url_con->timestamp = timestamp;
 #else
    return;
-   url_con = NULL;
-   condition = 0;
-   tm = 0;
+   (void)url_con;
+   (void)condition;
+   (void)timestamp;
 #endif
 }
 
-/**
- * FIXME: To be documented.
- * @return  FIXME: To be documented.
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI void
 ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd)
 {
 #ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_set");
-       return ;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_set");
+        return;
      }
+
+   if (url_con->dead) return;
    url_con->write_fd = fd;
-#endif   
+#else
+   return;
+   (void)url_con;
+   (void)fd;
+#endif
 }
 
-/**
- * FIXME: To be documented.
- * @return  FIXME: To be documented.
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI int
 ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con)
 {
 #ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_received_bytes_get");
-       return -1;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_received_bytes_get");
+        return -1;
      }
 
    return url_con->received;
-#endif   
+#else
    return 0;
+   (void)url_con;
+#endif
 }
 
-/**
- * FIXME: To be documented.
- * @return  FIXME: To be documented.
- * @ingroup Ecore_Con_Url_Group
- */
-EAPI int
-ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *content_type)
+EAPI const Eina_List *
+ecore_con_url_response_headers_get(Ecore_Con_Url *url_con)
+{
+#ifdef HAVE_CURL
+   return url_con->response_headers;
+#else
+   return NULL;
+   (void)url_con;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const char *password, Eina_Bool safe)
+{
+#ifdef HAVE_CURL
+   CURLcode ret;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_httpauth_set");
+        return EINA_FALSE;
+     }
+
+   if (url_con->dead) return EINA_FALSE;
+# if LIBCURL_VERSION_NUM >= 0x071301
+   if ((username) && (password))
+     {
+        if (safe)
+          curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
+                           CURLAUTH_ANYSAFE);
+        else
+          curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
+
+        ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
+        if (ret != CURLE_OK)
+          {
+             ERR("Could not set username for HTTP authentication: %s",
+                 curl_easy_strerror(ret));
+             return EINA_FALSE;
+          }
+
+        ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
+        if (ret != CURLE_OK)
+          {
+             ERR("Could not set password for HTTP authentication: %s",
+                 curl_easy_strerror(ret));
+             return EINA_FALSE;
+          }
+
+        return EINA_TRUE;
+     }
+# endif
+#else
+   return EINA_FALSE;
+   (void)url_con;
+   (void)username;
+   (void)password;
+   (void)safe;
+#endif
+
+   return EINA_FALSE;
+}
+
+#define MODE_AUTO 0
+#define MODE_GET  1
+#define MODE_POST 2
+
+static Eina_Bool
+_ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long length, const char *content_type)
 {
 #ifdef HAVE_CURL
-   char tmp[256];
+   Eina_List *l;
+   const char *s;
+   char tmp[512];
 
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_send");
-       return 0;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_send");
+        return EINA_FALSE;
      }
 
-   if (url_con->active) return 0;
-   if (!url_con->url) return 0;
+   if (!url_con->url) return EINA_FALSE;
+   if (url_con->dead) return EINA_FALSE;
+
+   /* Free response headers from previous send() calls */
+   EINA_LIST_FREE(url_con->response_headers, s)
+     free((char *)s);
+   url_con->response_headers = NULL;
+   url_con->status = 0;
 
    curl_slist_free_all(url_con->headers);
    url_con->headers = NULL;
 
-   if (data)
+   if ((mode == MODE_POST) || (mode == MODE_AUTO))
      {
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data);
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length);
-
-       if (content_type && (strlen(content_type) < 200))
-         {
-            sprintf(tmp, "Content-type: %s", content_type);
-            url_con->headers = curl_slist_append(url_con->headers, tmp);
-         }
-       sprintf(tmp, "Content-length: %d", length);
-       url_con->headers = curl_slist_append(url_con->headers, tmp);
+        if (url_con->post_data) free(url_con->post_data);
+        url_con->post_data = NULL;
+        if ((data) && (length > 0))
+          {
+             url_con->post_data = malloc(length);
+             if (url_con->post_data)
+               {
+                  memcpy(url_con->post_data, data, length);
+                  if ((content_type) && (strlen(content_type) < 450))
+                    {
+                       snprintf(tmp, sizeof(tmp), "Content-Type: %s", content_type);
+                       url_con->headers = curl_slist_append(url_con->headers, tmp);
+                    }
+                  curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, url_con->post_data);
+                  curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length);
+               }
+             else
+               return EINA_FALSE;
+          }
+        else curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, 0);
+        if (mode == MODE_POST)
+          curl_easy_setopt(url_con->curl_easy, CURLOPT_POST, 1);
      }
 
-   switch (url_con->condition)
+   switch (url_con->time_condition)
      {
       case ECORE_CON_URL_TIME_NONE:
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE);
-        break;
+        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
+                         CURL_TIMECOND_NONE);
+        break;
+
       case ECORE_CON_URL_TIME_IFMODSINCE:
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, url_con->time);
-        break;
+        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
+                         CURL_TIMECOND_IFMODSINCE);
+        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
+                         (long)url_con->timestamp);
+        break;
+
       case ECORE_CON_URL_TIME_IFUNMODSINCE:
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFUNMODSINCE);
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, url_con->time);
-        break;
-      case ECORE_CON_URL_TIME_LASTMOD:
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, CURL_TIMECOND_LASTMOD);
-        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, url_con->time);
-        break;
+        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
+                         CURL_TIMECOND_IFUNMODSINCE);
+        curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
+                         (long)url_con->timestamp);
+        break;
      }
 
+   /* Additional headers */
+   EINA_LIST_FOREACH(url_con->additional_headers, l, s)
+     url_con->headers = curl_slist_append(url_con->headers, s);
+
    curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, url_con->headers);
 
+   url_con->received = 0;
+
    return _ecore_con_url_perform(url_con);
 #else
-   return 0;
-   url_con = NULL;
-   data = NULL;
-   length = 0;
-   content_type = NULL;
+   return EINA_FALSE;
+   (void)url_con;
+   (void)mode;
+   (void)data;
+   (void)length;
+   (void)content_type;
 #endif
 }
 
-/**
- * Makes a FTP upload
- * @return  FIXME: To be more documented.
- * @ingroup Ecore_Con_Url_Group
- */
-EAPI int 
-ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, char *filename, char *user, char *pass, char *upload_dir)
+EAPI Eina_Bool
+ecore_con_url_get(Ecore_Con_Url *url_con)
+{
+   return _ecore_con_url_send(url_con, MODE_GET, NULL, 0, NULL);
+}
+
+EAPI Eina_Bool
+ecore_con_url_post(Ecore_Con_Url *url_con, const void *data, long length, const char *content_type)
+{
+   return _ecore_con_url_send(url_con, MODE_POST, data, length, content_type);
+}
+
+EAPI Eina_Bool
+ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const char *user, const char *pass, const char *upload_dir)
 {
 #ifdef HAVE_CURL
    char url[4096];
    char userpwd[4096];
    FILE *fd;
    struct stat file_info;
-       
+   CURLcode ret;
+
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ftp_upload");
-       return 0;
-     }
-     
-   if (url_con->active) return 0;
-   if (!url_con->url) return 0;
-   if (filename)
-     {
-       if (stat(filename, &file_info)) return 0;
-       fd = fopen(filename, "rb");
-       if (upload_dir)
-          snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url, upload_dir, basename(filename));
-       else
-          snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url, basename(filename));
-       snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size);
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION, _ecore_con_url_read_cb);
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
-       ecore_con_url_url_set(url_con, url);
-
-       return _ecore_con_url_perform(url_con);
+        ECORE_MAGIC_FAIL(url_con,
+                         ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_ftp_upload");
+        return EINA_FALSE;
+     }
+
+   if (url_con->dead) return EINA_FALSE;
+   if (!url_con->url) return EINA_FALSE;
+   if ((!filename) || (!filename[0])) return EINA_FALSE;
+
+   if (stat(filename, &file_info))
+     return EINA_FALSE;
+
+   snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
+   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
+   if (ret != CURLE_OK)
+     {
+        ERR("Could not set username and password for FTP upload: %s",
+            curl_easy_strerror(ret));
+        return EINA_FALSE;
      }
+
+   char tmp[PATH_MAX];
+   snprintf(tmp, PATH_MAX, "%s", filename);
+
+   if (upload_dir)
+     snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url,
+              upload_dir, basename(tmp));
    else
-       return 0;
+     snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
+              basename(tmp));
+
+   if (!ecore_con_url_url_set(url_con, url))
+     return EINA_FALSE;
+
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
+                    (curl_off_t)file_info.st_size);
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION,
+                    _ecore_con_url_read_cb);
+
+   fd = fopen(filename, "rb");
+   if (!fd)
+     {
+        ERR("Could not open \"%s\" for FTP upload", filename);
+        return EINA_FALSE;
+     }
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
+
+   return _ecore_con_url_perform(url_con);
 #else
-   return 0;
-   url_con = NULL;
-   filename = NULL;
-   user = NULL;
-   pass = NULL;
-   upload_dir = NULL;
-#endif   
+   return EINA_FALSE;
+   (void)url_con;
+   (void)filename;
+   (void)user;
+   (void)pass;
+   (void)upload_dir;
+#endif
 }
 
-/**
- * Enable or disable libcurl verbose output, useful for debug
- * @return  FIXME: To be more documented.
- * @ingroup Ecore_Con_Url_Group
- */
 EAPI void
-ecore_con_url_verbose_set(Ecore_Con_Url *url_con, int verbose)
+ecore_con_url_cookies_init(Ecore_Con_Url *url_con)
 {
 #ifdef HAVE_CURL
+   if (!url_con)
+     return;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_cookies_init");
+        return;
+     }
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, "");
+#else
+   return;
+   (void)url_con;
+#endif
+}
+
+EAPI void
+ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_con, Eina_Bool ignore)
+{
+#ifdef HAVE_CURL
+   if (!url_con)
+     return;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_cookies_ignore_old_session_set");
+        return;
+     }
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore);
+#else
+   return;
+   (void)url_con;
+   (void)ignore;
+#endif
+}
+
+EAPI void
+ecore_con_url_cookies_clear(Ecore_Con_Url *url_con)
+{
+#ifdef HAVE_CURL
+   if (!url_con)
+     return;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_cookies_clear");
+        return;
+     }
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL");
+#else
+   return;
+   (void)url_con;
+#endif
+}
+
+EAPI void
+ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_con)
+{
+#ifdef HAVE_CURL
+   if (!url_con)
+     return;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_cookies_session_clear");
+        return;
+     }
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS");
+#else
+   return;
+   (void)url_con;
+#endif
+}
+
+EAPI void
+ecore_con_url_cookies_file_add(Ecore_Con_Url *url_con, const char *const file_name)
+{
+#ifdef HAVE_CURL
+   if (!url_con)
+     return;
+
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_verbose_set");
-       return;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_cookies_file_add");
+        return;
      }
-     
-   if (url_con->active) return;
-   if (!url_con->url) return;
-   if (verbose == TRUE) 
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, 1);
-   else 
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, 0);
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name);
+#else
+   return;
+   (void)url_con;
+   (void)file_name;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con, const char *const cookiejar_file)
+{
+#ifdef HAVE_CURL
+   CURLcode ret;
+
+   if (!url_con)
+     return EINA_FALSE;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_cookies_jar_file_set");
+        return EINA_FALSE;
+     }
+
+   if (url_con->dead) return EINA_FALSE;
+   ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR,
+                          cookiejar_file);
+   if (ret != CURLE_OK)
+     {
+        ERR("Setting the cookie-jar name failed: %s",
+            curl_easy_strerror(ret));
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+   (void)url_con;
+   (void)cookiejar_file;
+#endif
+}
+
+EAPI void
+ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_con)
+{
+#ifdef HAVE_CURL
+   if (!url_con)
+     return;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_cookies_jar_write");
+        return;
+     }
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH");
+#else
+   return;
+   (void)url_con;
+#endif
+}
+
+EAPI void
+ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose)
+{
+#ifdef HAVE_CURL
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_verbose_set");
+        return;
+     }
+
+   if (!url_con->url)
+     return;
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose);
+#else
+   return;
+   (void)url_con;
+   (void)verbose;
+#endif
+}
+
+EAPI void
+ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv)
+{
+#ifdef HAVE_CURL
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_ftp_use_epsv_set");
+        return;
+     }
+
+   if (!url_con->url)
+     return;
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, (int)use_epsv);
+#else
+   return;
+   (void)url_con;
+   (void)use_epsv;
 #endif
 }
 
 /**
- * Enable or disable EPSV extension
- * @return  FIXME: To be more documented.
- * @ingroup Ecore_Con_Url_Group
+ * Toggle libcurl's verify peer's certificate option.
+ *
+ * If @p verify is @c EINA_TRUE, libcurl will verify
+ * the authenticity of the peer's certificate, otherwise
+ * it will not. Default behavior of libcurl is to check
+ * peer's certificate.
+ *
+ * @param url_con Ecore_Con_Url instance which will be acted upon.
+ * @param verify Whether or not libcurl will check peer's certificate.
+ * @since 1.1.0
  */
 EAPI void
-ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, int use_epsv)
+ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con, Eina_Bool verify)
 {
 #ifdef HAVE_CURL
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ftp_use_epsv_set");
-       return;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
+                         "ecore_con_url_ssl_verify_peer_set");
+        return;
      }
-     
-   if (url_con->active) return;
-   if (!url_con->url) return;
-   if (use_epsv == TRUE) 
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, 1);
-   else 
-       curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, 0);
+
+   if (!url_con->url)
+     return;
+
+   if (url_con->dead) return;
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, (int)verify);
+#else
+   return;
+   (void)url_con;
+   (void)verify;
 #endif
 }
 
+/**
+ * Set a custom CA to trust for SSL/TLS connections.
+ *
+ * Specify the path of a file (in PEM format) containing one or more
+ * CA certificate(s) to use for the validation of the server certificate.
+ *
+ * This function can also disable CA validation if @p ca_path is @c NULL.
+ * However, the server certificate still needs to be valid for the connection
+ * to succeed (i.e., the certificate must concern the server the
+ * connection is made to).
+ *
+ * @param url_con Connection object that will use the custom CA.
+ * @param ca_path Path to a CA certificate(s) file or @c NULL to disable
+ *                CA validation.
+ *
+ * @return  @c 0 on success. When cURL is used, non-zero return values
+ *          are equal to cURL error codes.
+ */
+EAPI int
+ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con, const char *ca_path)
+{
+   int res = -1;
+
 #ifdef HAVE_CURL
-static int
-_ecore_con_url_suspend_fd_handler(void)
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ssl_ca_set");
+        return -1;
+     }
+
+   if (!url_con->url) return -1;
+   if (url_con->dead) return -1;
+   if (ca_path == NULL)
+     res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 0);
+   else
+     {
+        res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 1);
+        if (!res)
+          res = curl_easy_setopt(url_con->curl_easy, CURLOPT_CAINFO, ca_path);
+     }
+#else
+   return -1;
+   (void)url_con;
+   (void)ca_path;
+#endif
+
+   return res;
+}
+
+EAPI Eina_Bool
+ecore_con_url_http_version_set(Ecore_Con_Url *url_con, Ecore_Con_Url_Http_Version version)
+{
+#ifdef HAVE_CURL
+   int res = -1;
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_http_version_set");
+        return EINA_FALSE;
+     }
+   if (url_con->dead) return EINA_FALSE;
+   switch (version)
+     {
+      case ECORE_CON_URL_HTTP_VERSION_1_0:
+        res = curl_easy_setopt(url_con->curl_easy,
+                               CURLOPT_HTTP_VERSION,
+                               CURL_HTTP_VERSION_1_0);
+        break;
+
+      case ECORE_CON_URL_HTTP_VERSION_1_1:
+        res = curl_easy_setopt(url_con->curl_easy,
+                               CURLOPT_HTTP_VERSION,
+                               CURL_HTTP_VERSION_1_1);
+        break;
+
+      default:
+        break;
+     }
+   if (res != CURLE_OK)
+     {
+        ERR("curl http version setting failed: %s", curl_easy_strerror(res));
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+#else
+   (void)url_con;
+   (void)version;
+   return EINA_FALSE;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy)
+{
+#ifdef HAVE_CURL
+   int res = -1;
+   curl_version_info_data *vers = NULL;
+
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_set");
+        return EINA_FALSE;
+     }
+
+   if (!url_con->url) return EINA_FALSE;
+   if (url_con->dead) return EINA_FALSE;
+
+   if (!proxy) res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, "");
+   else
+     {
+        // before curl version 7.21.7, socks protocol:// prefix is not supported
+        // (e.g. socks4://, socks4a://, socks5:// or socks5h://, etc.)
+        vers = curl_version_info(CURLVERSION_NOW);
+        if (vers->version_num < 0x71507)
+          {
+             url_con->proxy_type = CURLPROXY_HTTP;
+             if (strstr(proxy, "socks4a"))
+               url_con->proxy_type = CURLPROXY_SOCKS4A;
+             else if (strstr(proxy, "socks4"))
+               url_con->proxy_type = CURLPROXY_SOCKS4;
+             else if (strstr(proxy, "socks5h"))
+               url_con->proxy_type = CURLPROXY_SOCKS5_HOSTNAME;
+             else if (strstr(proxy, "socks5"))
+               url_con->proxy_type = CURLPROXY_SOCKS5;
+             res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXYTYPE,
+                                    url_con->proxy_type);
+             if (res != CURLE_OK)
+               {
+                  ERR("curl proxy type setting failed: %s",
+                      curl_easy_strerror(res));
+                  url_con->proxy_type = -1;
+                  return EINA_FALSE;
+               }
+          }
+        res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, proxy);
+     }
+   if (res != CURLE_OK)
+     {
+        ERR("curl proxy setting failed: %s", curl_easy_strerror(res));
+        url_con->proxy_type = -1;
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+   (void)url_con;
+   (void)proxy;
+#endif
+}
+
+EAPI void
+ecore_con_url_timeout_set(Ecore_Con_Url *url_con, double timeout)
 {
-   Ecore_Con_Url       *url_con;
-   int                  deleted = 0;
+#ifdef HAVE_CURL
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_timeout_set");
+        return;
+     }
 
-   if (!_url_con_list)
-     return 0;
+   if (url_con->dead) return;
+   if (!url_con->url || timeout < 0) return;
+   if (url_con->timer) ecore_timer_del(url_con->timer);
+   url_con->timer = ecore_timer_add(timeout, _ecore_con_url_timeout_cb, url_con);
+#else
+   return;
+   (void)url_con;
+   (void)timeout;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username)
+{
+#ifdef HAVE_CURL
+   int res = -1;
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_username_set");
+        return EINA_FALSE;
+     }
 
-   ecore_list_first_goto(_url_con_list);
-   while ((url_con = ecore_list_current(_url_con_list)))
+   if (url_con->dead) return EINA_FALSE;
+   if (!url_con->url) return EINA_FALSE;
+   if ((!username) || (!username[0])) return EINA_FALSE;
+   if (url_con->proxy_type == CURLPROXY_SOCKS4 || url_con->proxy_type == CURLPROXY_SOCKS4A)
      {
-       if (url_con->active && url_con->fd_handler)
-         {
-            ecore_main_fd_handler_del(url_con->fd_handler);
-            url_con->fd_handler = NULL;
-            deleted++;
-         }
-       ecore_list_next(_url_con_list);
+        ERR("Proxy type should be socks5 and above");
+        return EINA_FALSE;
      }
 
-   return deleted;
+   res = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
+   if (res != CURLE_OK)
+     {
+        ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res));
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+   (void)url_con;
+   (void)username;
+#endif
 }
 
-static int
-_ecore_con_url_restart_fd_handler(void)
+EAPI Eina_Bool
+ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password)
+{
+#ifdef HAVE_CURL
+   int res = -1;
+   if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
+     {
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_password_set");
+        return EINA_FALSE;
+     }
+   if (!url_con->url) return EINA_FALSE;
+   if (url_con->dead) return EINA_FALSE;
+   if (!password) return EINA_FALSE;
+   if (url_con->proxy_type == CURLPROXY_SOCKS4 || url_con->proxy_type == CURLPROXY_SOCKS4A)
+     {
+        ERR("Proxy type should be socks5 and above");
+        return EINA_FALSE;
+     }
+
+   res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
+   if (res != CURLE_OK)
+     {
+        ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res));
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+   (void)url_con;
+   (void)password;
+#endif
+}
+
+/**
+ * @}
+ */
+
+#ifdef HAVE_CURL
+static void
+_ecore_con_url_status_get(Ecore_Con_Url *url_con)
+{
+   long status = 0;
+
+   if (!url_con->curl_easy) return;
+   if (!curl_easy_getinfo(url_con->curl_easy, CURLINFO_RESPONSE_CODE, &status))
+     url_con->status = status;
+   else
+     url_con->status = 0;
+}
+
+static void
+_ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg)
 {
-   Ecore_Con_Url       *url_con;
-   int                  activated = 0;
+   Ecore_Con_Event_Url_Complete *e;
+   int status = url_con->status;
 
-   if (!_url_con_list)
-     return 0;
+   e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete));
+   if (!e) return;
 
-   ecore_list_first_goto(_url_con_list);
-   while ((url_con = ecore_list_current(_url_con_list)))
+   if (!curlmsg)
      {
-       if (url_con->fd_handler == NULL
-           && url_con->fd != -1)
-         {
-            url_con->fd_handler = ecore_main_fd_handler_add(url_con->fd,
-                                                            url_con->flags,
-                                                            _ecore_con_url_fd_handler,
-                                                            NULL, NULL, NULL);
-            activated++;
-         }
-       ecore_list_next(_url_con_list);
+        ERR("Event completed without CURL message handle. Shouldn't happen");
      }
+   else if ((curlmsg->msg == CURLMSG_DONE) &&
+            (curlmsg->data.result == CURLE_OPERATION_TIMEDOUT) &&
+            (!curlmsg->easy_handle))
+     {
+        /* easy_handle is set to NULL on timeout messages */
+        status = 408; /* Request Timeout */
+     }
+   else if (curlmsg->data.result == CURLE_OK)
+     {
+        if (!status)
+          {
+             _ecore_con_url_status_get(url_con);
+             status = url_con->status;
+          }
+     }
+   else
+     {
+        ERR("Curl message have errors: %d (%s)",
+          curlmsg->data.result, curl_easy_strerror(curlmsg->data.result));
+     }
+
+   e->status = status;
+   e->url_con = url_con;
 
-   return activated;
+   url_con->event_count++;
+   ecore_event_add(ECORE_CON_EVENT_URL_COMPLETE, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
+}
+
+static void
+_ecore_con_url_multi_remove(Ecore_Con_Url *url_con)
+{
+   CURLMcode ret;
+
+   ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
+   url_con->multi = EINA_FALSE;
+   if (ret != CURLM_OK) ERR("curl_multi_remove_handle failed: %s", curl_multi_strerror(ret));
+}
+
+static Eina_Bool
+_ecore_con_url_timeout_cb(void *data)
+{
+   Ecore_Con_Url *url_con = data;
+   CURLMsg timeout_msg;
+
+   if (!url_con) return ECORE_CALLBACK_CANCEL;
+   if (!url_con->curl_easy) return ECORE_CALLBACK_CANCEL;
+
+   _ecore_con_url_multi_remove(url_con);
+   _url_con_list = eina_list_remove(_url_con_list, url_con);
+
+   curl_slist_free_all(url_con->headers);
+   url_con->headers = NULL;
+
+   url_con->timer = NULL;
+
+   timeout_msg.msg = CURLMSG_DONE;
+   timeout_msg.easy_handle = NULL;
+   timeout_msg.data.result = CURLE_OPERATION_TIMEDOUT;
+
+   _ecore_con_url_event_url_complete(url_con, &timeout_msg);
+   return ECORE_CALLBACK_CANCEL;
 }
 
 static size_t
@@ -664,266 +1389,288 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp)
 
    url_con = (Ecore_Con_Url *)userp;
 
-   if (!url_con) return -1;
+   if (!url_con)
+     return -1;
+
    if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
      {
-       ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_cb");
-       return -1;
+        ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_cb");
+        return -1;
      }
 
    url_con->received += real_size;
 
+   INF("reading from %s", url_con->url);
    if (url_con->write_fd < 0)
      {
-       e = malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) * (real_size - 1));
-       if (e)
-         {
-            e->url_con = url_con;
-            e->size = real_size;
-            memcpy(e->data, buffer, real_size);
-            ecore_event_add(ECORE_CON_EVENT_URL_DATA, e,
-                            _ecore_con_event_url_free, NULL);
-         }
+        e =
+          malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) *
+                 (real_size - 1));
+        if (e)
+          {
+             e->url_con = url_con;
+             e->size = real_size;
+             memcpy(e->data, buffer, real_size);
+             url_con->event_count++;
+             ecore_event_add(ECORE_CON_EVENT_URL_DATA, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
+          }
      }
    else
      {
-       ssize_t count = 0;
-       size_t  total_size = real_size;
-       size_t  offset = 0;
-
-       while (total_size > 0)
-         {
-            count = write(url_con->write_fd, (char*) buffer + offset, total_size);
-            if (count < 0)
-              {
-                 if (errno != EAGAIN && errno != EINTR)
-                   return -1;
-              }
-            else
-              {
-                 total_size -= count;
-                 offset += count;
-              }
-         }
+        ssize_t count = 0;
+        size_t total_size = real_size;
+        size_t offset = 0;
+
+        while (total_size > 0)
+          {
+             count = write(url_con->write_fd,
+                           (char *)buffer + offset,
+                           total_size);
+             if (count < 0)
+               {
+                  if (errno != EAGAIN && errno != EINTR)
+                    return -1;
+               }
+             else
+               {
+                  total_size -= count;
+                  offset += count;
+               }
+          }
      }
 
    return real_size;
 }
 
-#define ECORE_CON_URL_TRANSMISSION(Transmit, Event, Url_con, Total, Now) \
-{ \
-   Ecore_Con_Event_Url_Progress *e; \
-   if ((Total != 0) || (Now != 0)) \
-     { \
-       e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress)); \
-       if (e) \
-         { \
-            e->url_con = url_con; \
-            e->total = Total; \
-            e->now = Now; \
-            ecore_event_add(Event, e, _ecore_con_event_url_free, NULL); \
-         } \
-     } \
+static size_t
+_ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream)
+{
+   size_t real_size = size * nitems;
+   Ecore_Con_Url *url_con = stream;
+
+   char *header = malloc(sizeof(char) * (real_size + 1));
+   if (!header)
+     return real_size;
+
+   memcpy(header, ptr, real_size);
+   header[real_size] = '\0';
+
+   url_con->response_headers = eina_list_append(url_con->response_headers,
+                                                header);
+
+   return real_size;
 }
 
 static int
 _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
 {
-   Ecore_Con_Event_Url_Progress        *e;
-   Ecore_Con_Url               *url_con;
+   Ecore_Con_Event_Url_Progress *e;
+   Ecore_Con_Url *url_con;
 
    url_con = clientp;
 
-   e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress));
+   e = malloc(sizeof(Ecore_Con_Event_Url_Progress));
    if (e)
      {
-       e->url_con = url_con;
-       e->down.total = dltotal;
-       e->down.now = dlnow;
-       e->up.total = ultotal;
-       e->up.now = ulnow;
-       ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, _ecore_con_event_url_free, NULL);
+        e->url_con = url_con;
+        e->down.total = dltotal;
+        e->down.now = dlnow;
+        e->up.total = ultotal;
+        e->up.now = ulnow;
+        url_con->event_count++;
+        ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con);
      }
 
    return 0;
 }
 
-static size_t 
+static size_t
 _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream)
 {
    size_t retcode = fread(ptr, size, nitems, stream);
-   if (ferror((FILE*)stream)) {
-       fclose(stream);
-       return CURL_READFUNC_ABORT;
-   } else if ((retcode == 0) || (retcode < nitems)) {
-       fclose((FILE*)stream);
-       return 0;
-   }
-   fprintf(stderr, "*** We read %d bytes from file\n", retcode);
+
+   if (ferror((FILE *)stream))
+     {
+        fclose(stream);
+        return CURL_READFUNC_ABORT;
+     }
+   else if (retcode == 0)
+     {
+        fclose((FILE *)stream);
+        return 0;
+     }
+
+#ifdef _WIN32
+   INF("*** We read %Iu bytes from file", retcode);
+#else
+   INF("*** We read %zu bytes from file", retcode);
+#endif
    return retcode;
 }
 
-static int
-_ecore_con_url_perform(Ecore_Con_Url *url_con)
+static void
+_ecore_con_url_info_read(void)
 {
-   fd_set read_set, write_set, exc_set;
-   double start;
-   int fd_max;
-   int fd;
-   int flags;
-   int still_running;
-   int completed_immediately = 0;
-
-   ecore_list_append(_url_con_list, url_con);
-
-   start = ecore_time_get();
-   url_con->active = 1;
-   curl_multi_add_handle(curlm, url_con->curl_easy);
-   /* This one can't be stopped, or the download never start. */
-   while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM);
-
-   completed_immediately =  _ecore_con_url_process_completed_jobs(url_con);
-
-   if (!completed_immediately)
-     {
-       /* url_con still active -- set up an fd_handler */
-       FD_ZERO(&read_set);
-       FD_ZERO(&write_set);
-       FD_ZERO(&exc_set);
-
-       /* Stupid curl, why can't I get the fd to the current added job? */
-       curl_multi_fdset(curlm, &read_set, &write_set, &exc_set, &fd_max);
-       for (fd = 0; fd <= fd_max; fd++)
-         {
-            if (!FD_ISSET(fd, &_current_fd_set))
-              {
-                 flags = 0;
-                 if (FD_ISSET(fd, &read_set)) flags |= ECORE_FD_READ;
-                 if (FD_ISSET(fd, &write_set)) flags |= ECORE_FD_WRITE;
-                 if (FD_ISSET(fd, &exc_set)) flags |= ECORE_FD_ERROR;
-                 if (flags)
-                   {
-                      FD_SET(fd, &_current_fd_set);
-                      url_con->fd = fd;
-                      url_con->flags = flags;
-                      url_con->fd_handler = ecore_main_fd_handler_add(fd, flags,
-                                                                      _ecore_con_url_fd_handler,
-                                                                      NULL, NULL, NULL);
-                      break;
-                   }
-              }
-         }
-       if (!url_con->fd_handler)
-         {
-            /* Failed to set up an fd_handler */
-            curl_multi_remove_handle(curlm, url_con->curl_easy);
-            url_con->active = 0;
-            url_con->fd = -1;
-            return 0;
-         }
+   CURLMsg *curlmsg;
+   int n_remaining;
+
+   while ((curlmsg = curl_multi_info_read(_curlm, &n_remaining)))
+     {
+        Eina_List *l, *ll;
+        Ecore_Con_Url *url_con = NULL;
+        DBG("Curl message: %d", curlmsg->msg);
+
+        if (curlmsg->msg == CURLMSG_DONE)
+          {
+             EINA_LIST_FOREACH_SAFE(_url_con_list, l, ll, url_con)
+               {
+                  if (curlmsg->easy_handle == url_con->curl_easy)
+                    _ecore_con_url_event_url_complete(url_con, curlmsg);
+               }
+        }
      }
+}
 
-   return 1;
+static void
+_ecore_con_url_curl_clear(void)
+{
+   Ecore_Fd_Handler *fdh;
+   Ecore_Con_Url *url_con;
+
+   EINA_LIST_FREE(_fd_hd_list, fdh) ecore_main_fd_handler_del(fdh);
+   EINA_LIST_FREE(_url_con_list, url_con) _ecore_con_url_multi_remove(url_con);
 }
 
-static int
-_ecore_con_url_idler_handler(void *data)
+static Eina_Bool
+_ecore_con_url_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
-   double      start;
-   int         done = 1;
-   int         still_running;
+   Ecore_Fd_Handler *fdh;
+   long ms;
+
+   EINA_LIST_FREE(_fd_hd_list, fdh) ecore_main_fd_handler_del(fdh);
+
+   curl_multi_timeout(_curlm, &ms);
+   if (ms >= CURL_MIN_TIMEOUT || ms <= 0) ms = CURL_MIN_TIMEOUT;
+
+   ecore_timer_interval_set(_curl_timer, (double)ms / 1000);
+
+   if (!_curl_timer)
+     _curl_idler = ecore_idler_add(_ecore_con_url_timer, NULL);
 
-   start = ecore_time_get();
-   while (curl_multi_perform(curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
-     /* make this 1/20th of a second to keep interactivity high */
-     if ((ecore_time_get() - start) > 0.2)
-       {
-         done = 0;
-         break;
-       }
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_ecore_con_url_fdset(void)
+{
+   CURLMcode ret;
+   fd_set read_set, write_set, exc_set;
+   int fd, fd_max;
 
-   _ecore_con_url_process_completed_jobs(NULL);
+   FD_ZERO(&read_set);
+   FD_ZERO(&write_set);
+   FD_ZERO(&exc_set);
 
-   if (done)
+   ret = curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set, &fd_max);
+   if (ret != CURLM_OK)
      {
-       _ecore_con_url_restart_fd_handler();
-       _fd_idler_handler = NULL;
-       return 0;
+        ERR("curl_multi_fdset failed: %s", curl_multi_strerror(ret));
+        return;
      }
 
-   return 1;
+   for (fd = 0; fd <= fd_max; fd++)
+     {
+        int flags = 0;
+        if (FD_ISSET(fd, &read_set)) flags |= ECORE_FD_READ;
+        if (FD_ISSET(fd, &write_set)) flags |= ECORE_FD_WRITE;
+        if (FD_ISSET(fd, &exc_set)) flags |= ECORE_FD_ERROR;
+        if (flags)
+          {
+             // FIXME: Who is owner (easy_handle) of this fd?? (Curl do not give this info.)
+             // This cause "Failed to delete epoll fd xx!" error messages
+             Ecore_Fd_Handler *fd_handler;
+             fd_handler = ecore_main_fd_handler_add(fd, flags,
+                                                    _ecore_con_url_fd_handler,
+                                                    NULL, NULL, NULL);
+             if (fd_handler)
+                _fd_hd_list = eina_list_append(_fd_hd_list, fd_handler);
+          }
+     }
 }
 
-static int
-_ecore_con_url_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
+static Eina_Bool
+_ecore_con_url_timer(void *data __UNUSED__)
 {
-   _ecore_con_url_suspend_fd_handler();
+   Ecore_Fd_Handler *fdh;
+   int still_running;
+   CURLMcode ret;
 
-   if (_fd_idler_handler == NULL)
-     _fd_idler_handler = ecore_idler_add(_ecore_con_url_idler_handler, NULL);
+   EINA_LIST_FREE(_fd_hd_list, fdh) ecore_main_fd_handler_del(fdh);
+   _ecore_con_url_info_read();
 
-   return 1;
+   ret = curl_multi_perform(_curlm, &still_running);
+   if (ret == CURLM_CALL_MULTI_PERFORM)
+     {
+        DBG("curl_multi_perform() again immediately");
+        return ECORE_CALLBACK_RENEW;
+     }
+   else if (ret != CURLM_OK)
+     {
+        ERR("curl_multi_perform() failed: %s", curl_multi_strerror(ret));
+        _ecore_con_url_curl_clear();
+        ecore_timer_freeze(_curl_timer);
+        if (_curl_idler) ecore_idler_del(_curl_idler);
+        _curl_idler = NULL;
+     }
+
+   if (still_running)
+     {
+        long ms;
+        _ecore_con_url_fdset();
+        curl_multi_timeout(_curlm, &ms);
+        DBG("multiperform is still running: %d, timeout: %ld", still_running, ms);
+        if (ms >= CURL_MIN_TIMEOUT || ms <= 0) ms = CURL_MIN_TIMEOUT;
+        ecore_timer_interval_set(_curl_timer, (double)ms / 1000);
+     }
+   else
+     {
+        DBG("multiperform ended");
+        _ecore_con_url_info_read();
+        _ecore_con_url_curl_clear();
+        ecore_timer_freeze(_curl_timer);
+        if (_curl_idler) ecore_idler_del(_curl_idler);
+        _curl_idler = NULL;
+     }
+
+   return ECORE_CALLBACK_RENEW;
 }
 
-static int
-_ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match)
+static Eina_Bool
+_ecore_con_url_perform(Ecore_Con_Url *url_con)
 {
-   Ecore_Con_Url *url_con;
-   CURLMsg *curlmsg;
-   int n_remaining;
-   int job_matched = 0;
-
-   /* Loop jobs and check if any are done */
-   while ((curlmsg = curl_multi_info_read(curlm, &n_remaining)) != NULL)
-     {
-       if (curlmsg->msg != CURLMSG_DONE) continue;
-
-       /* find the job which is done */
-       ecore_list_first_goto(_url_con_list);
-       while ((url_con = ecore_list_current(_url_con_list)))
-         {
-            if (curlmsg->easy_handle == url_con->curl_easy)
-              {
-                 /* We have found the completed job in our job list */
-                 if (url_con_to_match && (url_con == url_con_to_match)) {
-                      job_matched = 1;
-                 }
-                 if (url_con->fd != -1)
-                   {
-                      FD_CLR(url_con->fd, &_current_fd_set);
-                      if (url_con->fd_handler)
-                        ecore_main_fd_handler_del(url_con->fd_handler);
-                      url_con->fd = -1;
-                      url_con->fd_handler = NULL;
-                   }
-                 ecore_list_remove(_url_con_list);
-                 url_con->active = 0;
-                   {
-                      Ecore_Con_Event_Url_Complete *e;
-                      e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete));
-                      if (e)
-                        {
-                           e->url_con = url_con;
-
-                           e->status = 0;
-                           curl_easy_getinfo(curlmsg->easy_handle, CURLINFO_RESPONSE_CODE, &e->status);
-
-                           _url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e);
-                        }
-                   }
-                 curl_multi_remove_handle(curlm, url_con->curl_easy);
-                 break;
-              }
-            ecore_list_next(_url_con_list);
-         }
-     }
-   return job_matched;
+   CURLMcode ret;
+
+   ret = curl_multi_add_handle(_curlm, url_con->curl_easy);
+   if (ret != CURLM_OK)
+     {
+        ERR("curl_multi_add_handle() failed: %s", curl_multi_strerror(ret));
+        return EINA_FALSE;
+     }
+
+   url_con->multi = EINA_TRUE;
+   _url_con_list = eina_list_append(_url_con_list, url_con);
+   ecore_timer_thaw(_curl_timer);
+
+   return EINA_TRUE;
 }
 
 static void
-_ecore_con_event_url_free(void *data __UNUSED__, void *ev)
+_ecore_con_event_url_free(Ecore_Con_Url *url_con, void *ev)
 {
    free(ev);
+   url_con->event_count--;
+   if (url_con->dead && (!url_con->event_count))
+     ecore_con_url_free(url_con);
 }
 
 #endif
index 541233d..c459351 100644 (file)
@@ -10,12 +10,12 @@ AM_CPPFLAGS = \
 -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 -DPACKAGE_LIB_DIR=\"$(libdir)\" \
 -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
-@EVAS_CFLAGS@ @EET_CFLAGS@
+@EVAS_CFLAGS@ \
+@EET_CFLAGS@ \
+@EINA_CFLAGS@
 
 CLEANFILES = $(DB)
 
-if BUILD_ECORE_CONFIG
-
 #DB = system.db
 #$(DB): Makefile
 #      edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /e/theme/name str "winter"
@@ -24,65 +24,39 @@ if BUILD_ECORE_CONFIG
 #      edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /apps/web/email str `which thunderbird 2>/dev/null || which mozilla 2>/dev/null || which kmail 2>/dev/null || which sylpheed 2>/dev/null || which evolution 2>/dev/null`
 
 lib_LTLIBRARIES = libecore_config.la
-include_HEADERS = \
-Ecore_Config.h
 
-libecore_config_la_LDFLAGS = -version-info @version_info@
+includes_HEADERS = Ecore_Config.h
+includesdir = $(includedir)/ecore-@VMAJ@
+
+libecore_config_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
 
 #config_DATA = $(DB)
 #configdir = $(pkgdatadir)
 
-if BUILD_ECORE_IPC
-
 libecore_config_la_SOURCES = \
 ecore_config.c \
-ecore_config_ipc_main.c \
-ecore_config_ipc_ecore.c \
 ecore_config_util.c \
 ecore_config_storage.c \
 ecore_config_extra.c \
-ecore_config_db.c \
-ecore_config_private.h
+ecore_config_db.c
 
 libecore_config_la_LIBADD = \
 $(top_builddir)/src/lib/ecore/libecore.la \
-$(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la \
 @EET_LIBS@ \
+@EINA_LIBS@ \
 @EVAS_LIBS@
 
-libecore_config_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la \
-$(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la
-
-else
-
-libecore_config_la_SOURCES = \
-ecore_config.c \
-ecore_config_util.c \
-ecore_config_storage.c \
-ecore_config_extra.c \
-ecore_config_db.c \
-ecore_config_private.h
-
-libecore_config_la_LIBADD = \
-$(top_builddir)/src/lib/ecore/libecore.la \
-@EET_LIBS@ \
-@EVAS_LIBS@
+if BUILD_ECORE_IPC
 
-libecore_config_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la
+libecore_config_la_SOURCES += \
+ecore_config_ipc_main.c \
+ecore_config_ipc_ecore.c
 
-endif
+libecore_config_la_LIBADD += $(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la
 
 endif
 
 EXTRA_DIST = \
-Ecore_Config.h \
-ecore_config.c \
-ecore_config_ipc_ecore.c \
-ecore_config_ipc_main.c \
 ecore_config_ipc.h \
-ecore_config_util.c \
-ecore_config_util.h \
-ecore_config_storage.c
-
+ecore_config_private.h \
+ecore_config_util.h
index 275eefd..e81538e 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <string.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <unistd.h>
 
 #include "Ecore_Config.h"
-#include "config.h"
 #include "ecore_config_private.h"
 #include "ecore_config_ipc.h"
 
 #include "ecore_config_util.h"
-
+int  _ecore_config_log_dom = -1;
 int                  DEBUG = 0;
 EAPI Ecore_Config_Server *__ecore_config_server_global = NULL;
 EAPI Ecore_Config_Server *__ecore_config_server_local = NULL;
@@ -53,8 +56,8 @@ ecore_config_dst(Ecore_Config_Prop * e)
    Ecore_Config_Listener_List *l;
 
    p = NULL;
-   c = e;
    t = __ecore_config_bundle_local;
+   c = t->data;
 
    if (!e || !e->key)
       return NULL;
@@ -202,7 +205,7 @@ _ecore_config_int_get(Ecore_Config_Prop *e)
 /**
  * Returns the specified property as a float.
  * @param   key The property key.
- * @return  The float value of the property.  The function returns 0.0 if the 
+ * @return  The float value of the property.  The function returns 0.0 if the
  *          property is not a float or is not set.
  * @ingroup Ecore_Config_Get_Group
  */
@@ -329,7 +332,7 @@ ecore_config_as_string_get(const char *key)
    val = NULL;
    r = NULL;
    if (!(e = ecore_config_get(key)))
-      E(0, "no such property, \"%s\"...\n", key);
+      ERR("no such property, \"%s\"...", key);
    else
      {
        switch (e->type)
@@ -384,15 +387,13 @@ ecore_config_bound(Ecore_Config_Prop * e)
      {
        if ((e->val < e->lo))
          {
-            E(0,
-              "ecore_config_bounds(\"%s\",%ld): value out of range; adjusted to %ld...\n",
+           WRN("ecore_config_bounds(\"%s\",%ld): value out of range; adjusted to %ld...",
               e->key, e->val, e->lo);
             e->val = e->lo;
          }
        else if ((e->val > e->hi))
          {
-            E(0,
-              "ecore_config_bounds(\"%s\",%ld): value out of range; adjusted to %ld...\n",
+           WRN("ecore_config_bounds(\"%s\",%ld): value out of range; adjusted to %ld...",
               e->key, e->val, e->hi);
             e->val = e->hi;
          }
@@ -408,14 +409,12 @@ ecore_config_bound(Ecore_Config_Prop * e)
        if (v != e->val)
          {
             if (e->type == ECORE_CONFIG_FLT)
-               E(0,
-                 "ecore_config_bound(\"%s\"): float value %f not a multiple of %f, adjusted to %f...\n",
+              WRN("ecore_config_bound(\"%s\"): float value %f not a multiple of %f, adjusted to %f...",
                  e->key, ((double)e->val) / ECORE_CONFIG_FLOAT_PRECISION,
                  ((double)e->step) / ECORE_CONFIG_FLOAT_PRECISION,
                  ((double)v) / ECORE_CONFIG_FLOAT_PRECISION);
             else
-               E(0,
-                 "ecore_config_bound(\"%s\"): integer value %ld not a multiple of %ld, adjusted to %ld...\n",
+              WRN("ecore_config_bound(\"%s\"): integer value %ld not a multiple of %ld, adjusted to %ld...",
                  e->key, e->val, e->step, v);
             ret = ECORE_CONFIG_ERR_SUCC;
             e->val = v;
@@ -442,7 +441,6 @@ ecore_config_type_guess(const char *key, const char *val)
 {
    Ecore_Config_Prop  *p;
    char               *l;
-   long                v;
 
    l = NULL;
 
@@ -453,7 +451,7 @@ ecore_config_type_guess(const char *key, const char *val)
       return ECORE_CONFIG_NIL;
    if (val[0] == '#')
       return ECORE_CONFIG_RGB;
-   v = strtol(val, &l, 10);
+   strtol(val, &l, 10);
    if (*l)
      {
        float               f;
@@ -528,7 +526,7 @@ ecore_config_typed_add(const char *key, const void *val, int type)
 
    if (!(e = calloc(1, sizeof(Ecore_Config_Prop))))
      {
-       error = ECORE_CONFIG_ERR_OOM;
+       return ECORE_CONFIG_ERR_OOM;
      }
    else if (!(e->key = strdup(key)))
      {
@@ -671,9 +669,8 @@ ecore_config_typed_set(const char *key, const void *val, int type)
      }
    else
      {
-       E(0,
-         "ecore_config_typed_set(\"%s\"): ecore_config_typed_val() failed: %d\n",
-         key, ret);
+       ERR("ecore_config_typed_set(\"%s\"): ecore_config_typed_val() failed: %d",
+           key, ret);
      }
 
    return ret;
@@ -1151,8 +1148,8 @@ ecore_config_theme_default(const char *key, const char *val)
 EAPI int
 ecore_config_struct_create(const char *key)
 {
-   printf("WARNING: you are using ecore_config structures. These are very young");
-   printf(" and not complete - you have been warned");
+   WRN("you are using ecore_config structures. These are very young");
+   WRN(" and not complete - you have been warned");
 
    return ecore_config_typed_default(key, NULL, ECORE_CONFIG_SCT);
 }
@@ -1160,13 +1157,13 @@ ecore_config_struct_create(const char *key)
 static int
 _ecore_config_struct_append(Ecore_Config_Prop *sct, Ecore_Config_Prop *add)
 {
-   Evas_List *l;
+   Eina_List *l;
 
    if (!sct || !add || sct->type != ECORE_CONFIG_SCT)
      return ECORE_CONFIG_ERR_IGNORED;
 
    l = sct->data;
-   sct->data = evas_list_append(l, add);
+   sct->data = eina_list_append(l, add);
    add->parent = sct;
 
    return ECORE_CONFIG_ERR_SUCC;
@@ -1188,7 +1185,7 @@ _ecore_config_struct_typed_add(const char *key, const char *name, const void *va
    ret = _ecore_config_struct_append(ecore_config_get(key),
                                      ecore_config_get(subkey));
    free(subkey);
-   return ret;   
+   return ret;
 }
 
 /**
@@ -1253,7 +1250,7 @@ ecore_config_struct_argb_add(const char *key, const char *name, int a, int r,
                              int g, int b)
 {
    long argb;
-  
+
    __ecore_argb_to_long(a, r, g, b, &argb);
    return _ecore_config_struct_typed_add(key, name, &argb, ECORE_CONFIG_RGB);
 }
@@ -1301,7 +1298,7 @@ EAPI int
 ecore_config_struct_get(const char *key, void *data)
 {
    Ecore_Config_Prop *e, *f;
-   Evas_List *l;
+   Eina_List *l;
    unsigned char *ptr;
    long argb;
 
@@ -1345,9 +1342,9 @@ ecore_config_struct_get(const char *key, void *data)
               ptr += sizeof(int);
             break;
             default:
-              printf("ARGH - STRUCT coding not implemented yet\n");
+              WRN("ARGH - STRUCT coding not implemented yet");
          }
-       l = evas_list_next(l);
+       l = eina_list_next(l);
      }
    return ECORE_CONFIG_ERR_SUCC;
 }
@@ -1385,13 +1382,13 @@ ecore_config_listen(const char *name, const char *key,
 
        if (ret != ECORE_CONFIG_ERR_SUCC)
          {
-            E(0, "ecore_config_listen: ecore_config_add(\"%s\") failed: %d\n",
-              key, ret);
+            ERR("ecore_config_listen: ecore_config_add(\"%s\") failed: %d",
+                key, ret);
             return ret;
          }
        if (!(e = ecore_config_get(key)))
          {
-            E(0, "ecore_config_listen: list of properties corrupted!?\n");
+            ERR("ecore_config_listen: list of properties corrupted!?");
             return ECORE_CONFIG_ERR_FAIL;
          }
      }
@@ -1399,8 +1396,7 @@ ecore_config_listen(const char *name, const char *key,
    for (l = e->listeners; l; l = l->next)
       if (!strcmp(l->name, name) || (l->listener == listener))
        {
-          E(1,
-            "ecore_config_listen: %s is already listening for changes of %s...\n",
+          ERR("ecore_config_listen: %s is already listening for changes of %s...",
             name, key);
           return ECORE_CONFIG_ERR_IGNORED;
        }
@@ -1408,7 +1404,7 @@ ecore_config_listen(const char *name, const char *key,
    if (!(l = malloc(sizeof(Ecore_Config_Listener_List))))
       return ECORE_CONFIG_ERR_OOM;
 
-   E(1, "registering listener \"%s\" for \"%s\" (%d)...\n", name, key, e->type);
+   ERR("registering listener \"%s\" for \"%s\" (%d)...", name, key, e->type);
 
    memset(l, 0, sizeof(Ecore_Config_Listener_List));
 
@@ -1455,7 +1451,7 @@ ecore_config_deaf(const char *name, const char *key,
    for (p = NULL, l = e->listeners; l; p = l)
      {
        Ecore_Config_Listener_List *nl;
-       
+
        nl = l->next;
        if ((name && !strcmp(l->name, name)) || (l->listener == listener))
          {
@@ -1632,7 +1628,6 @@ ecore_config_init_global(const char *name)
    char               *p;
    int global;
    char               *buf;
-   global = 0;
 
    if ((p = getenv("HOME")))
      {                         /* debug-only ### FIXME */
@@ -1641,7 +1636,7 @@ ecore_config_init_global(const char *name)
        snprintf(buf, PATH_MAX, "%s/.ecore/%s/.global", p, name);
        global = creat(buf, S_IRWXU);
 
-       if (global)
+       if (global >= 0)
           close(global);
 
        free(buf);
@@ -1675,6 +1670,13 @@ ecore_config_init(const char *name)
 {
    char                *path;
    Ecore_Config_Prop   *list;
+   _ecore_config_log_dom = eina_log_domain_register
+     ("ecore_config", ECORE_CONFIG_DEFAULT_LOG_COLOR);
+   if(_ecore_config_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Ecore config module.");
+       return -1;
+     }
    _ecore_config_system_init_no_load();
 
    __ecore_config_app_name = strdup(name);
@@ -1767,7 +1769,7 @@ _ecore_config_system_init_no_load(void)
 
    /* set up a simple default path */
    ecore_config_string_default("/e/themes/search_path", PACKAGE_DATA_DIR "../ewl/themes");
-   
+
    return ECORE_CONFIG_ERR_SUCC;
 }
 
@@ -1787,7 +1789,7 @@ _ecore_config_system_load(void)
          {
             snprintf(buf, PATH_MAX, "%s/.e/config.eet", p);
             if (ecore_config_file_load(buf) != 0) {
-               /* even if this file (system.eet) dosen't exist we can 
+               /* even if this file (system.eet) doesn't exist we can
                 * continue without it as it isn't striclty necessary.
                */
                ecore_config_file_load(PACKAGE_DATA_DIR "/system.eet");
@@ -1831,6 +1833,8 @@ ecore_config_system_shutdown(void)
    free(__ecore_config_bundle_local);
    free(__ecore_config_server_local);
    free(__ecore_config_server_global);
+   eina_log_domain_unregister(_ecore_config_log_dom);
+   _ecore_config_log_dom = -1;
    return ret;
 }
 
@@ -1857,7 +1861,7 @@ __ecore_argbstr_to_long(const char *argb, long *v)
 
    if(*l)
      {
-       E(0, "ecore_config_val: value \"%s\" not a valid hexadecimal RGB value?\n", argb);
+       ERR("ecore_config_val: value \"%s\" not a valid hexadecimal RGB value?", argb);
        return NULL;
      }
 
index 712ebbb..6238958 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 #include <locale.h>
 
+#include <Eet.h>
+
 #include "Ecore_Config.h"
 #include "ecore_config_private.h"
 #include "ecore_config_util.h"
-#include <Eet.h>
 
 struct _Ecore_Config_DB_File
 {
@@ -24,7 +29,7 @@ _ecore_config_db_open_read(const char *file)
 {
    Eet_File *ef;
    Ecore_Config_DB_File *db;
-   
+
    eet_init();
    db = malloc(sizeof(Ecore_Config_DB_File));
    if (!db) return NULL;
@@ -43,7 +48,7 @@ _ecore_config_db_open_write(const char *file)
 {
    Eet_File *ef;
    Ecore_Config_DB_File *db;
-   
+
    eet_init();
    db = malloc(sizeof(Ecore_Config_DB_File));
    if (!db) return NULL;
@@ -71,7 +76,7 @@ _ecore_config_db_keys_get(Ecore_Config_DB_File *db, int *num_ret)
    char **keys;
    int key_count;
    int i;
-   
+
    keys = eet_list(db->ef, (char*)"*", &key_count);
    if (!keys)
      {
@@ -89,7 +94,7 @@ _ecore_config_db_key_type_get(Ecore_Config_DB_File *db, const char *key)
 {
    char *data;
    int size;
-   
+
    data = eet_read(db->ef, (char*)key, &size);
    if (data)
      {
@@ -113,9 +118,8 @@ _ecore_config_db_read(Ecore_Config_DB_File *db, const char *key)
 {
    char *data, *value;
    int size;
-   Ecore_Config_Prop *prop;
    Ecore_Config_Type type;
-   
+
    data = eet_read(db->ef, (char*)key, &size);
    if (data)
      {
@@ -139,12 +143,11 @@ _ecore_config_db_read(Ecore_Config_DB_File *db, const char *key)
             free(data);
             return 0;
          }
-   
+
        type = data[0];
        value = data + l + 1;
-       prop = ecore_config_get(key);
-       
-       switch (type) 
+
+       switch (type)
          {
             case ECORE_CONFIG_INT:
             case ECORE_CONFIG_BLN:
@@ -163,7 +166,7 @@ _ecore_config_db_read(Ecore_Config_DB_File *db, const char *key)
                  prev_locale = setlocale(LC_NUMERIC, "C");
                  tmp = atof(value);
                  if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
-              
+
                  ecore_config_typed_set(key, (void *)&tmp, type);
                  break;
               }
@@ -175,10 +178,10 @@ _ecore_config_db_read(Ecore_Config_DB_File *db, const char *key)
               ecore_config_typed_set(key, (void *)value, type);
               break;
             case ECORE_CONFIG_SCT:
-              printf("loading struct %s\n", key);
+              INF("loading struct %s", key);
               break;
             default:
-              E(0, "Type %d not handled\n", type);
+              WRN("Type %d not handled", type);
          }
        free(data);
        return 1;
@@ -192,13 +195,13 @@ _ecore_config_db_key_data_get(Ecore_Config_DB_File *db, const char *key, int *si
 {
    char *data;
    int size;
-   
+
    data = eet_read(db->ef, (char*)key, &size);
    if (data)
      {
        int l;
        char *dat;
-       
+
        if (size <= 2)
          {
             free(data);
@@ -232,10 +235,10 @@ _ecore_config_db_write(Ecore_Config_DB_File *db, Ecore_Config_Prop *e)
    char *val = NULL;
    char *r = NULL;
    int num;
-   
+
    prev_locale = setlocale(LC_NUMERIC, "C");
 
-   switch (e->type) 
+   switch (e->type)
      {
        case ECORE_CONFIG_INT:
           esprintf(&val, "%i", _ecore_config_int_get(e));
@@ -246,7 +249,7 @@ _ecore_config_db_write(Ecore_Config_DB_File *db, Ecore_Config_Prop *e)
        case ECORE_CONFIG_FLT:
           esprintf(&val, "%16.16f", _ecore_config_float_get(e));
           break;
-       case ECORE_CONFIG_STR: 
+       case ECORE_CONFIG_STR:
           val = _ecore_config_string_get(e);
           break;
        case ECORE_CONFIG_THM:
@@ -256,14 +259,14 @@ _ecore_config_db_write(Ecore_Config_DB_File *db, Ecore_Config_Prop *e)
           val = _ecore_config_argbstr_get(e);
           break;
        default:
-          E(0, "Type %d not handled\n", e->type);
+          WRN("Type %d not handled", e->type);
      }
 
    if (prev_locale)
      {
        setlocale(LC_NUMERIC, prev_locale);
      }
-   
+
    if(val)
      {
        num = esprintf(&r, "%c%c%s%c", (char) e->type, 0, val, 0);
@@ -280,7 +283,7 @@ _ecore_config_db_key_data_set(Ecore_Config_DB_File *db, const char *key, void *d
 {
    char *buf;
    int num;
-   
+
    num = 1 + 1 + data_size + 1;
    buf = malloc(num);
    if (!buf) return;
index 7981363..a134952 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -7,9 +11,7 @@
 
 #include "Ecore_Config.h"
 #include "Ecore.h"
-
-#include "config.h"
-
+#include "ecore_config_private.h"
 typedef struct __Ecore_Config_Arg_Callback _Ecore_Config_Arg_Callback;
 struct __Ecore_Config_Arg_Callback
 {
@@ -401,7 +403,7 @@ ecore_config_theme_search_path_get(void)
  * should be called @b after @ref ecore_config_load to allow a user to
  * override the default search path.
  *
- * @param  path The given 
+ * @param  path The given
  * @return @c ECORE_CONFIG_ERR_SUCC on success.  @c ECORE_CONFIG_ERR_FAIL
  *         will be returned if @p path already exists in the search path.
  *         @c ECORE_CONFIG_ERR_FAIL is returned if @p path is @c NULL.
@@ -420,8 +422,8 @@ ecore_config_theme_search_path_append(const char *path)
    loc = strstr(search_path, path);
    len = strlen(path);
    search_len = strlen(search_path);
-   
-   if (loc == NULL || (loc != search_path && *(loc - 1) != '|') || 
+
+   if (!loc || (loc != search_path && *(loc - 1) != '|') ||
        (loc != (search_path + search_len - len) && *(loc + len - 1) != '|'))
      {
        new_search_path = malloc(search_len + len + 2); /* 2 = \0 + | */
@@ -475,9 +477,9 @@ ecore_config_theme_with_path_from_name_get(char *name)
         file = malloc(strlen(search_path_tmp) + strlen(name) + 6);
            /* 6 = / + .edj + \0 */
 
-        snprintf(file, strlen(search_path_tmp) + strlen(name) + 6, 
+        snprintf(file, strlen(search_path_tmp) + strlen(name) + 6,
                       "%s/%s.edj", search_path_tmp, name);
-       
+
         if (stat(file, &st) == 0)
           {
               free(search_path);
@@ -525,9 +527,9 @@ ecore_config_args_display(void)
    _Ecore_Config_Arg_Callback *callbacks;
 
    if (__ecore_config_app_description)
-      printf("%s\n\n", __ecore_config_app_description);
-   printf("Supported Options:\n");
-   printf(" -h, --help\t       Print this text\n");
+      ERR("%s\n\n", __ecore_config_app_description);
+   ERR("Supported Options:");
+   ERR(" -h, --help\t       Print this text");
    if (!__ecore_config_bundle_local)
       return;
    props = __ecore_config_bundle_local->data;
@@ -539,7 +541,7 @@ ecore_config_args_display(void)
             props = props->next;
             continue;
          }
-       printf(" %c%c%c --%s\t%s %s\n", props->short_opt ? '-' : ' ',
+       INF(" %c%c%c --%s\t%s %s", props->short_opt ? '-' : ' ',
               props->short_opt ? props->short_opt : ' ',
               props->short_opt ? ',' : ' ',
               props->long_opt ? props->long_opt : props->key,
@@ -552,7 +554,7 @@ ecore_config_args_display(void)
    callbacks = _ecore_config_arg_callbacks;
    while (callbacks)
      {
-        printf(" %c%c%c --%s\t%s %s\n", callbacks->short_opt ? '-' : ' ',
+        INF(" %c%c%c --%s\t%s %s", callbacks->short_opt ? '-' : ' ',
               callbacks->short_opt ? callbacks->short_opt : ' ',
               callbacks->short_opt ? ',' : ' ',
               callbacks->long_opt ? callbacks->long_opt : "",
@@ -571,16 +573,16 @@ ecore_config_parse_set(Ecore_Config_Prop * prop, char *arg, char *opt,
    if (!arg)
      {
        if (opt)
-          printf("Missing expected argument for option --%s\n", opt);
+          ERR("Missing expected argument for option --%s", opt);
        else
-          printf("Missing expected argument for option -%c\n", opt2);
+          ERR("Missing expected argument for option -%c", opt2);
        return ECORE_CONFIG_PARSE_EXIT;
      }
    else
      {
        ecore_config_set(prop->key, arg);
        prop->flags |= ECORE_CONFIG_FLAG_CMDLN;
-     }   
+     }
    return ECORE_CONFIG_PARSE_CONTINUE;
 }
 
@@ -646,7 +648,7 @@ ecore_config_args_parse(void)
 
        if (*arg != '-')
          {
-            printf("Unexpected attribute \"%s\"\n", arg);
+            ERR("Unexpected attribute \"%s\"", arg);
             nextarg++;
             continue;
          }
@@ -687,7 +689,7 @@ ecore_config_args_parse(void)
                  callback = _ecore_config_arg_callbacks;
                  while (callback)
                    {
-                      if ((callback->long_opt && 
+                      if ((callback->long_opt &&
                            !strcmp(long_opt, callback->long_opt)))
                         {
                            found = 1;
@@ -695,11 +697,11 @@ ecore_config_args_parse(void)
                              {
                                 callback->func(NULL, callback->data);
                              }
-                           else 
+                           else
                              {
                                 if (!argv[++nextarg])
                                   {
-                                     printf("Missing expected argument for option --%s\n", long_opt);
+                                     ERR("Missing expected argument for option --%s", long_opt);
                                      return ECORE_CONFIG_PARSE_EXIT;
                                   }
                                   callback->func(argv[nextarg], callback->data);
@@ -711,8 +713,8 @@ ecore_config_args_parse(void)
               }
             if (!found)
               {
-                 printf("Unrecognised option \"%s\"\n", long_opt);
-                 printf("Try using -h or --help for more information.\n\n");
+                 ERR("Unrecognised option \"%s\"", long_opt);
+                 ERR("Try using -h or --help for more information.\n");
                  return ECORE_CONFIG_PARSE_EXIT;
               }
          }
@@ -762,7 +764,7 @@ ecore_config_args_parse(void)
                                        {
                                           if (!argv[++nextarg])
                                             {
-                                               printf("Missing expected argument for option -%c\n", short_opt);
+                                               ERR("Missing expected argument for option -%c", short_opt);
                                                return ECORE_CONFIG_PARSE_EXIT;
                                             }
                                           callback->func(argv[nextarg], callback->data);
@@ -774,9 +776,8 @@ ecore_config_args_parse(void)
                         }
                       if (!found)
                         {
-                           printf("Unrecognised option '%c'\n", short_opt);
-                           printf
-                              ("Try using -h or --help for more information.\n\n");
+                           ERR("Unrecognised option '%c'", short_opt);
+                           ERR("Try using -h or --help for more information.\n");
                            return ECORE_CONFIG_PARSE_EXIT;
                         }
                    }
index 44fa9d0..b1622f3 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 /* by Azundris, with thanks to Corey Donohoe <atmos@atmos.org> */
 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
 
 #include <Ecore.h>
+#include "ecore_private.h"
 #include <Ecore_Ipc.h>
 
-#include "ecore_private.h"
 #include "ecore_config_ipc.h"
 #include "ecore_config_util.h"
 #include "ecore_config_private.h"
 
 #include "Ecore_Config.h"
-#include "config.h"
 
 
 /*****************************************************************************/
@@ -42,7 +45,7 @@ _ecore_config_ipc_ecore_string_get(char **m, char **r)
    *r = q;
    q += l;
    *m = q;
-   E(1, "IPC/eCore: got string-%d \"%s\"\n", l, *r);
+   WRN("IPC/eCore: got string-%d \"%s\"", l, *r);
    return ECORE_CONFIG_ERR_SUCC;
 }
 
@@ -54,7 +57,7 @@ _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long se
    int                    key_count, x;
    estring               *s;
    int                    f;
-   char                   buf[PATH_MAX], *p;   
+   char                   buf[PATH_MAX], *p;
    // char             *data;                  UNUSED
    Ecore_Config_Type      type;
 
@@ -118,7 +121,7 @@ _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long se
          }
        free(keys);
      }
-   
+
    return estring_disown(s);
 }
 
@@ -132,7 +135,7 @@ _ecore_config_ipc_ecore_send(Ecore_Ipc_Event_Client_Data * e, int code,
    int                 len = reply ? strlen(reply) + 1 : 0;
 
    our_ref++;
-   E(1, "IPC/eCore: replying [0,0] %d IRT %d => %d {\"%s\":%d}\n", our_ref,
+   WRN("IPC/eCore: replying [0,0] %d IRT %d => %d {\"%s\":%d}", our_ref,
      e->ref, code, reply ? reply : "", len);
    return ecore_ipc_client_send(e->client, 0, 0, our_ref, e->ref, code, reply,
                                len);
@@ -151,10 +154,9 @@ _ecore_config_ipc_ecore_handle_request(Ecore_Ipc_Server * server,
 
    srv = _ecore_config_server_convert(server);
    serial = e->minor;
-   ret = ECORE_CONFIG_ERR_FAIL;
    r = NULL;
    m = (char *)e->data;
-   E(1, "IPC/eCore: client sent: [%d,%d] #%d (%d) @ %p\n", e->major, e->minor,
+   INF("IPC/eCore: client sent: [%d,%d] #%d (%d) @ %p", e->major, e->minor,
      e->ref, e->size, server);
 
    switch (e->major)
@@ -229,7 +231,7 @@ _ecore_config_ipc_ecore_handle_request(Ecore_Ipc_Server * server,
 
 /*****************************************************************************/
 
-static int
+static Eina_Bool
 _ecore_config_ipc_client_add(void *data, int type __UNUSED__, void *event)
 {
    Ecore_Ipc_Server  **server;
@@ -239,13 +241,13 @@ _ecore_config_ipc_client_add(void *data, int type __UNUSED__, void *event)
    e = (Ecore_Ipc_Event_Client_Data *) event;
 
    if (*server != ecore_ipc_client_server_get(e->client))
-      return 1;
+      return EINA_TRUE;
 
-   E(1, "IPC/eCore: Client connected. @ %p\n", server);
-   return 1;
+   INF("IPC/eCore: Client connected. @ %p", server);
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_config_ipc_client_del(void *data, int type __UNUSED__, void *event)
 {
    Ecore_Ipc_Server  **server;
@@ -255,13 +257,13 @@ _ecore_config_ipc_client_del(void *data, int type __UNUSED__, void *event)
    e = (Ecore_Ipc_Event_Client_Data *) event;
 
    if (*server != ecore_ipc_client_server_get(e->client))
-      return 1;
+      return EINA_TRUE;
 
-   E(1, "IPC/eCore: Client disconnected. @ %p\n", server);
-   return 1;
+   INF("IPC/eCore: Client disconnected. @ %p", server);
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_config_ipc_client_sent(void *data, int type __UNUSED__, void *event)
 {
    Ecore_Ipc_Server  **server;
@@ -271,10 +273,10 @@ _ecore_config_ipc_client_sent(void *data, int type __UNUSED__, void *event)
    e = (Ecore_Ipc_Event_Client_Data *) event;
 
    if (*server != ecore_ipc_client_server_get(e->client))
-      return 1;
+      return EINA_TRUE;
 
    _ecore_config_ipc_ecore_handle_request(*server, e);
-   return 1;
+   return EINA_TRUE;
 }
 
 /*****************************************************************************/
@@ -311,7 +313,7 @@ _ecore_config_ipc_ecore_init(const char *pipe_name, void **data)
 
             if (!stat(socket, &st))
               {
-                 E(0, "IPC/eCore: pipe \"%s\" already exists!?\n", socket);
+                 INF("IPC/eCore: pipe \"%s\" already exists!?", socket);
 /*      if(unlink(buf))
        E(0,"IPC/eCore: could not remove pipe \"%s\": %d\n",buf,errno); }}*/
                  port++;
@@ -330,9 +332,9 @@ _ecore_config_ipc_ecore_init(const char *pipe_name, void **data)
    ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
                           _ecore_config_ipc_client_sent, server);
 
-   if (server)
+   if (*server)
      {
-       E(1, "IPC/eCore: Server is listening on %s.\n", pipe_name);
+       INF("IPC/eCore: Server is listening on %s.", pipe_name);
      }
 
    return ECORE_CONFIG_ERR_SUCC;
@@ -357,6 +359,7 @@ _ecore_config_ipc_ecore_exit(void **data)
      }
 
    ecore_ipc_shutdown();
+   ecore_shutdown();
 
    return ret;
 }
index 5d6a18a..35bd783 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 /* ############## bad */
 #define HAVE_EVAS2
 
@@ -15,7 +19,6 @@
 #include "ecore_config_util.h"
 #include "ecore_config_ipc.h"
 
-#include "config.h"
 #include "ecore_config_private.h"
 
 static Ecore_Config_Server *__ecore_config_servers;
@@ -86,12 +89,9 @@ _ecore_config_ipc_prop_desc(Ecore_Config_Server * srv, const long serial,
                            const char *key)
 {
 #ifdef HAVE_EVAS2
-   Ecore_Config_Bundle *theme;
    Ecore_Config_Prop  *e;
 
-   theme = ecore_config_bundle_by_serial_get(srv, serial);
    e = ecore_config_get(key);
-
    if (e)
      {
        estring            *s = estring_new(512);
@@ -111,11 +111,8 @@ _ecore_config_ipc_prop_get(Ecore_Config_Server * srv, const long serial,
 {
 #ifdef HAVE_EVAS2
    char               *ret;
-   Ecore_Config_Bundle *theme;
 
-   ret = NULL;
-   theme = ecore_config_bundle_by_serial_get(srv, serial);
-   if ((ret = ecore_config_as_string_get( /*theme, */ key)))
+   if ((ret = ecore_config_as_string_get(key)))
       return ret;
 #endif
    return strdup("<undefined>");
@@ -131,8 +128,8 @@ _ecore_config_ipc_prop_set(Ecore_Config_Server * srv, const long serial,
 
    theme = ecore_config_bundle_by_serial_get(srv, serial);
    ret = ecore_config_set(key, (char *)val);
-   E(1, "ipc.prop.set(%s->%s,\"%s\") => %d\n", theme ? theme->identifier : "",
-     key, val, ret);
+   ERR("ipc.prop.set(%s->%s,\"%s\") => %d\n", theme ? theme->identifier : "",
+       key, val, ret);
    return ret;
 #else
    return ECORE_CONFIG_ERR_NOTSUPP;
@@ -208,7 +205,7 @@ _ecore_config_ipc_bundle_label_find(Ecore_Config_Server * srv,
    return ns ? ecore_config_bundle_serial_get(ns) : -1;
 }
 
-static int
+static Eina_Bool
 _ecore_config_ipc_poll(void *data __UNUSED__)
 {
    Ecore_Config_Server *s;
@@ -220,7 +217,7 @@ _ecore_config_ipc_poll(void *data __UNUSED__)
         s = s->next;
      }
 
-   return 1;
+   return EINA_TRUE;
 }
 
 int
@@ -254,15 +251,14 @@ _ecore_config_ipc_init(const char *pipe_name)
    ret_srv = NULL;
    list = NULL;
 
-   list = malloc(sizeof(Ecore_Config_Server));
-   memset(list, 0, sizeof(Ecore_Config_Server));
+   list = calloc(1, sizeof(Ecore_Config_Server));
    if ((ret = _ecore_config_ipc_ecore_init(pipe_name, &list->server)) != ECORE_CONFIG_ERR_SUCC)
      {
-       E(2, "_ecore_config_ipc_init: failed to register %s, code %d\n",
+       ERR("_ecore_config_ipc_init: failed to register %s, code %d",
          pipe_name, ret);
      }
 
-   E(2, "_ecore_config_ipc_init: registered \"%s\"...\n", pipe_name);
+   ERR("_ecore_config_ipc_init: registered \"%s\"...", pipe_name);
 
    list->name = strdup(pipe_name);
    list->next = __ecore_config_servers;
@@ -273,7 +269,7 @@ _ecore_config_ipc_init(const char *pipe_name)
 
    if (!ipc_timer)
      ipc_timer = ecore_timer_add(100, _ecore_config_ipc_poll, NULL);
-   
+
    return ret_srv;
 }
 /*****************************************************************************/
index 3beee54..b97f695 100644 (file)
@@ -1,15 +1,40 @@
 #ifndef _ECORE_CONFIG_PRIVATE_H
 # define _ECORE_CONFIG_PRIVATE_H
+#ifdef ECORE_CONFIG_DEFAULT_LOG_COLOR
+# undef ECORE_CONFIG_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_CONFIG_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+ /* eina_log related things */
+extern int _ecore_config_log_dom;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_config_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_config_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_config_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_config_log_dom, __VA_ARGS__)
 
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_config_log_dom, __VA_ARGS__)
 /* debug */
 extern int               DEBUG;
-#ifdef __sgi
-# define D
-# define E
-#else
-# define D(fmt,args...) do { if(DEBUG>=0) fprintf(stderr,fmt,## args); } while(0);
-# define E(lvl,args...) do { if(DEBUG>=(lvl)) fprintf(stderr,## args); } while(0)
-#endif
 
 typedef struct _Ecore_Config_DB_File Ecore_Config_DB_File;
 
@@ -39,6 +64,7 @@ int                   _ecore_config_ipc_ecore_init(const char *pipe_name, void *
 int                   _ecore_config_ipc_ecore_exit(void **data);
 int                   _ecore_config_ipc_ecore_poll(void **data);
 
+#include "Ecore.h"
 #include "ecore_private.h"
 
 #endif
index 104dd18..d059645 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -76,10 +80,10 @@ ecore_config_file_load(const char *file)
    db = _ecore_config_db_open_read(file);
    if (!db)
      {
-       E(0, "Cannot open database from file %s!\n", file);
+       ERR("Cannot open database from file %s!", file);
        return ECORE_CONFIG_ERR_NODATA;
      }
-   key_count = 0;   
+   key_count = 0;
    keys = _ecore_config_db_keys_get(db, &key_count);
    if (keys)
      {
@@ -146,7 +150,7 @@ ecore_config_file_save(const char *file)
    db = _ecore_config_db_open_write(file);
    if (!db)
      {
-       E(0, "Cannot open database from file %s!\n", file);
+       ERR("Cannot open database from file %s!", file);
        return ECORE_CONFIG_ERR_FAIL;
      }
 
index 6ee17c3..6156936 100644 (file)
@@ -1,11 +1,17 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 /* azundris */
 
 #include <sys/types.h>
 #include <stdlib.h>            /* malloc(), free() */
+#include <stdio.h>
 #include <string.h>            /* str...() */
 
 #include <stdarg.h>            /* varargs in sprintf/appendf */
 
+#include "Ecore.h"
 #include "ecore_private.h"
 
 #include "Ecore_Config.h"
index 7f9e898..3b94816 100644 (file)
@@ -1,34 +1,27 @@
 #ifndef _ECORE_DIRECTFB_H
 #define _ECORE_DIRECTFB_H
 
-#ifdef EAPI
-#undef EAPI
-#endif
-#ifdef _MSC_VER
-# ifdef BUILDING_DLL
-#  define EAPI __declspec(dllexport)
-# else
-#  define EAPI __declspec(dllimport)
-# endif
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif
+#include <Eina.h>
 
-#include <Ecore_Data.h>
 #include <directfb.h>
 
+#ifdef EAPI
+# undef EAPI
+#endif /* ifdef EAPI */
+
+#ifdef __GNUC__
+# if __GNUC__ >= 4
+#  define EAPI __attribute__ ((visibility("default")))
+# else /* if __GNUC__ >= 4 */
+#  define EAPI
+# endif /* if __GNUC__ >= 4 */
+#else /* ifdef __GNUC__ */
+# define EAPI
+#endif /* ifdef __GNUC__ */
 
 #ifdef __cplusplus
 extern "C" {
-#endif
+#endif /* ifdef __cplusplus */
 
 EAPI extern int ECORE_DIRECTFB_EVENT_POSITION;
 EAPI extern int ECORE_DIRECTFB_EVENT_SIZE;
@@ -45,148 +38,144 @@ EAPI extern int ECORE_DIRECTFB_EVENT_ENTER;
 EAPI extern int ECORE_DIRECTFB_EVENT_LEAVE;
 EAPI extern int ECORE_DIRECTFB_EVENT_WHEEL;
 
-       
-
 #ifndef _ECORE_DIRECTFB_WINDOW_PREDEF
-typedef struct _Ecore_DirectFB_Window                  Ecore_DirectFB_Window;
-#endif
-typedef struct _Ecore_DirectFB_Cursor                  Ecore_DirectFB_Cursor;
-
-typedef struct _Ecore_DirectFB_Event_Key_Down          Ecore_DirectFB_Event_Key_Down; 
-typedef struct _Ecore_DirectFB_Event_Key_Up            Ecore_DirectFB_Event_Key_Up;
-typedef struct _Ecore_DirectFB_Event_Button_Down       Ecore_DirectFB_Event_Button_Down;
-typedef struct _Ecore_DirectFB_Event_Button_Up         Ecore_DirectFB_Event_Button_Up;
-typedef struct _Ecore_DirectFB_Event_Motion            Ecore_DirectFB_Event_Motion;
-typedef struct _Ecore_DirectFB_Event_Enter             Ecore_DirectFB_Event_Enter;
-typedef struct _Ecore_DirectFB_Event_Leave             Ecore_DirectFB_Event_Leave;
-typedef struct _Ecore_DirectFB_Event_Wheel             Ecore_DirectFB_Event_Wheel;
-typedef struct _Ecore_DirectFB_Event_Got_Focus         Ecore_DirectFB_Event_Got_Focus;
-typedef struct _Ecore_DirectFB_Event_Lost_Focus                Ecore_DirectFB_Event_Lost_Focus;
-
+typedef struct _Ecore_DirectFB_Window              Ecore_DirectFB_Window;
+#endif /* ifndef _ECORE_DIRECTFB_WINDOW_PREDEF */
+typedef struct _Ecore_DirectFB_Cursor              Ecore_DirectFB_Cursor;
+
+typedef struct _Ecore_DirectFB_Event_Key_Down      Ecore_DirectFB_Event_Key_Down;
+typedef struct _Ecore_DirectFB_Event_Key_Up        Ecore_DirectFB_Event_Key_Up;
+typedef struct _Ecore_DirectFB_Event_Button_Down   Ecore_DirectFB_Event_Button_Down;
+typedef struct _Ecore_DirectFB_Event_Button_Up     Ecore_DirectFB_Event_Button_Up;
+typedef struct _Ecore_DirectFB_Event_Motion        Ecore_DirectFB_Event_Motion;
+typedef struct _Ecore_DirectFB_Event_Enter         Ecore_DirectFB_Event_Enter;
+typedef struct _Ecore_DirectFB_Event_Leave         Ecore_DirectFB_Event_Leave;
+typedef struct _Ecore_DirectFB_Event_Wheel         Ecore_DirectFB_Event_Wheel;
+typedef struct _Ecore_DirectFB_Event_Got_Focus     Ecore_DirectFB_Event_Got_Focus;
+typedef struct _Ecore_DirectFB_Event_Lost_Focus    Ecore_DirectFB_Event_Lost_Focus;
 
 /* this struct is to keep windows data (id, window itself and surface) in memory as every call
  * to DirectFB for this values (e.g window->GetSurface(window,&surface)) will increment the
- * reference count, then we will have to release N times the data, so better we just ask for 
- them once */
+ * reference count, then we will have to release N times the data, so better we just ask for
  them once */
 struct _Ecore_DirectFB_Window
 {
-       DFBWindowID             id;
-       IDirectFBWindow         *window;
-       IDirectFBSurface        *surface;
-       Ecore_DirectFB_Cursor   *cursor;
-       
+   DFBWindowID            id;
+   IDirectFBWindow       *window;
+   IDirectFBSurface      *surface;
+   Ecore_DirectFB_Cursor *cursor;
 };
 
 struct _Ecore_DirectFB_Cursor
 {
-       IDirectFBSurface        *surface;
-       int                     hot_x;
-       int                     hot_y;
-
+   IDirectFBSurface *surface;
+   int               hot_x;
+   int               hot_y;
 };
 
 struct _Ecore_DirectFB_Event_Key_Down /** DirectFB Key Down event */
 {
-       char   *name; /**< The name of the key that was released */
-       char   *string; /**< The logical symbol of the key that was pressed */
-       char   *key_compose; /**< The UTF-8 string conversion if any */
-       unsigned int time;
-       DFBWindowID win;
+   char        *name; /**< The name of the key that was released */
+   char        *string; /**< The logical symbol of the key that was pressed */
+   char        *key_compose; /**< The UTF-8 string conversion if any */
+   unsigned int time;
+   DFBWindowID  win;
 };
-   
+
 struct _Ecore_DirectFB_Event_Key_Up /** DirectFB Key Up event */
 {
-       char   *name; /**< The name of the key that was released */
-       char   *string; /**< The logical symbol of the key that was pressed */
-       char   *key_compose; /**< The UTF-8 string conversion if any */
-       unsigned int time;
-       DFBWindowID win;
+   char        *name; /**< The name of the key that was released */
+   char        *string; /**< The logical symbol of the key that was pressed */
+   char        *key_compose; /**< The UTF-8 string conversion if any */
+   unsigned int time;
+   DFBWindowID  win;
 };
 
 struct _Ecore_DirectFB_Event_Button_Down
 {
-       int button;
-       int modifiers;
-       int x, y;
-       unsigned int time;
-       int double_click : 1;
-       int triple_click : 1;
-       DFBWindowID win;
+   int          button;
+   int          modifiers;
+   int          x, y;
+   unsigned int time;
+   int          double_click : 1;
+   int          triple_click : 1;
+   DFBWindowID  win;
 };
 struct _Ecore_DirectFB_Event_Button_Up
 {
-       int button;
-       int modifiers;
-       int x, y;
-       unsigned int time;
-       DFBWindowID win;
+   int          button;
+   int          modifiers;
+   int          x, y;
+   unsigned int time;
+   DFBWindowID  win;
+   int          double_click : 1;
+   int          triple_click : 1;
 };
 struct _Ecore_DirectFB_Event_Motion
 {
-       int modifiers;
-       int x, y;
-       unsigned int time;
-       DFBWindowID win;
+   int          modifiers;
+   int          x, y;
+   unsigned int time;
+   DFBWindowID  win;
 };
 
 struct _Ecore_DirectFB_Event_Enter
 {
-       int modifiers;
-       int x, y;
-       unsigned int time;
-       DFBWindowID win;
+   int          modifiers;
+   int          x, y;
+   unsigned int time;
+   DFBWindowID  win;
 };
 
 struct _Ecore_DirectFB_Event_Leave
 {
-       int modifiers;
-       int x, y;
-       unsigned int time;
-       DFBWindowID win;
+   int          modifiers;
+   int          x, y;
+   unsigned int time;
+   DFBWindowID  win;
 };
 
 struct _Ecore_DirectFB_Event_Wheel
 {
-       int direction;
-       int z;
-       int modifiers;
-       unsigned int time;
-       DFBWindowID win;
+   int          direction;
+   int          z;
+   int          modifiers;
+   unsigned int time;
+   DFBWindowID  win;
 };
 
 struct _Ecore_DirectFB_Event_Got_Focus
 {
-       unsigned int time;
-       DFBWindowID win;
+   unsigned int time;
+   DFBWindowID  win;
 };
 
 struct _Ecore_DirectFB_Event_Lost_Focus
 {
-       unsigned int time;
-       DFBWindowID win;
+   unsigned int time;
+   DFBWindowID  win;
 };
 
 /* main functions */
-EAPI int ecore_directfb_init(const char *name);
-EAPI int ecore_directfb_shutdown(void);
-EAPI IDirectFB * ecore_directfb_interface_get(void);
-/* window operations */
-EAPI Ecore_DirectFB_Window * ecore_directfb_window_new(int x, int y, int w, int h);
-EAPI void ecore_directfb_window_del(Ecore_DirectFB_Window *window);
-EAPI void ecore_directfb_window_move(Ecore_DirectFB_Window *window, int x, int y);
-EAPI void ecore_directfb_window_resize(Ecore_DirectFB_Window *window, int w, int h);
-EAPI void ecore_directfb_window_focus(Ecore_DirectFB_Window *window);
-EAPI void ecore_directfb_window_show(Ecore_DirectFB_Window *window);
-EAPI void ecore_directfb_window_hide(Ecore_DirectFB_Window *window);
-EAPI void ecore_directfb_window_shaped_set(Ecore_DirectFB_Window *window, int set);
-EAPI void ecore_directfb_window_fullscreen_set(Ecore_DirectFB_Window *window, int set);
-EAPI void ecore_directfb_window_size_get(Ecore_DirectFB_Window *window, int *w, int *h);
-EAPI void ecore_directfb_window_cursor_show(Ecore_DirectFB_Window *window, int show);
-
+EAPI int                    ecore_directfb_init(const char *name);
+EAPI int                    ecore_directfb_shutdown(void);
+EAPI IDirectFB *            ecore_directfb_interface_get(void);
 
+/* window operations */
+EAPI Ecore_DirectFB_Window *ecore_directfb_window_new(int x, int y, int w, int h);
+EAPI void                   ecore_directfb_window_free(Ecore_DirectFB_Window *window);
+EAPI void                   ecore_directfb_window_move(Ecore_DirectFB_Window *window, int x, int y);
+EAPI void                   ecore_directfb_window_resize(Ecore_DirectFB_Window *window, int w, int h);
+EAPI void                   ecore_directfb_window_focus(Ecore_DirectFB_Window *window);
+EAPI void                   ecore_directfb_window_show(Ecore_DirectFB_Window *window);
+EAPI void                   ecore_directfb_window_hide(Ecore_DirectFB_Window *window);
+EAPI void                   ecore_directfb_window_shaped_set(Ecore_DirectFB_Window *window, Eina_Bool set);
+EAPI void                   ecore_directfb_window_fullscreen_set(Ecore_DirectFB_Window *window, Eina_Bool set);
+EAPI void                   ecore_directfb_window_size_get(Ecore_DirectFB_Window *window, int *w, int *h);
+EAPI void                   ecore_directfb_window_cursor_show(Ecore_DirectFB_Window *window, Eina_Bool show);
 
 #ifdef __cplusplus
 }
-#endif
+#endif /* ifdef __cplusplus */
 
-#endif
+#endif /* ifndef _ECORE_DIRECTFB_H */
index a2f693b..8142d33 100644 (file)
@@ -3,13 +3,11 @@ MAINTAINERCLEANFILES = Makefile.in
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
 -I$(top_builddir)/src/lib/ecore \
-@DIRECTFB_CFLAGS@
-
-if BUILD_ECORE_DIRECTFB
+@DIRECTFB_CFLAGS@ @EINA_CFLAGS@
 
 lib_LTLIBRARIES = libecore_directfb.la
-include_HEADERS = \
-Ecore_DirectFB.h
+includes_HEADERS = Ecore_DirectFB.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_directfb_la_SOURCES = \
 ecore_directfb.c \
@@ -18,15 +16,14 @@ ecore_directfb_private.h
 
 libecore_directfb_la_LIBADD = \
 $(top_builddir)/src/lib/ecore/libecore.la \
-@DIRECTFB_LIBS@
+@DIRECTFB_LIBS@ \
+@EINA_LIBS@
 
-libecore_directfb_la_LDFLAGS = -version-info @version_info@
+libecore_directfb_la_LDFLAGS = -version-info @version_info@ @release_info@
 
 libecore_directfb_la_DEPENDENCIES = \
 $(top_builddir)/src/lib/ecore/libecore.la
 
-endif
-
 EXTRA_DIST = \
 Ecore_DirectFB.h \
 ecore_directfb.c \
index ce4bb76..7c56b5d 100644 (file)
@@ -1,8 +1,15 @@
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdio.h>
+#include <string.h>
+
 #include "Ecore_DirectFB.h"
 #include "ecore_directfb_private.h"
 #include "ecore_directfb_keys.h"
 #include "Ecore.h"
+#include "ecore_private.h"
 
 /* ecore_directfb */
 /******************/
 /* with this you can create windows of directfb and handle events through ecore
  * TODO:
  * - handle all event types
- * - 
+ * -
  * */
+int _ecore_directfb_log_dom = -1;
 
-static int _ecore_directfb_key_symbols_count = sizeof(_ecore_directfb_key_symbols)/sizeof(Ecore_DirectFB_Key_Symbols);
 static int _ecore_directfb_init_count = 0;
 
 static int _window_event_fd = 0;
@@ -38,20 +45,17 @@ EAPI int ECORE_DIRECTFB_EVENT_ENTER = 0;
 EAPI int ECORE_DIRECTFB_EVENT_LEAVE = 0;
 EAPI int ECORE_DIRECTFB_EVENT_WHEEL = 0;
 
-
 static Ecore_Fd_Handler *_window_event_fd_handler_handle = NULL;
 static Ecore_Fd_Handler *_input_event_fd_handler_handle = NULL;
 
 /* this hash is to store all the possible key names for fast lookup */
-static Ecore_Hash *_ecore_directfb_key_symbols_hash = NULL;
-
-
-static IDirectFB *_dfb = NULL;                 // the main interface
-static IDirectFBEventBuffer *_window_event;    // the main event buffer (all windows are attached to this)
-static IDirectFBEventBuffer *_input_event;     // the main event buffer (all windows are attached to this)
-static IDirectFBDisplayLayer *_layer;          // the main layer
-static DFBResult _err;                         // usefull for DFBCHECK
+static Eina_Hash *_ecore_directfb_key_symbols_hash = NULL;
 
+static IDirectFB *_dfb = NULL; // the main interface
+static IDirectFBEventBuffer *_window_event;     // the main event buffer (all windows are attached to this)
+static IDirectFBEventBuffer *_input_event; // the main event buffer (all windows are attached to this)
+static IDirectFBDisplayLayer *_layer; // the main layer
+static DFBResult _err; // useful for DFBCHECK
 
 /*******************/
 /* local functions */
@@ -60,15 +64,21 @@ static DFBResult _err;                              // usefull for DFBCHECK
 /* free ecore directfb events functions */
 /****************************************/
 
-static void 
+static void
 _ecore_directfb_event_free_key_down(void *data __UNUSED__, void *ev)
 {
    Ecore_DirectFB_Event_Key_Up *e;
-   
+
    e = ev;
-   if(e->name) free(e->name);
-   if (e->string) free(e->string);
-   if (e->key_compose) free(e->key_compose);
+   if(e->name)
+      free(e->name);
+
+   if (e->string)
+      free(e->string);
+
+   if (e->key_compose)
+      free(e->key_compose);
+
    free(e);
 }
 
@@ -76,671 +86,672 @@ static void
 _ecore_directfb_event_free_key_up(void *data __UNUSED__, void *ev)
 {
    Ecore_DirectFB_Event_Key_Up *e;
-   
-   e = ev;
-   if(e->name) free(e->name);
-   if (e->string) free(e->string);
-   if (e->key_compose) free(e->key_compose);
-   free(e);
-}
 
+   e = ev;
+   if(e->name)
+      free(e->name);
 
-/* helpers */
-/***********/
-int
-_ecore_directfb_hash_compare(void *key1, void *key2)
-{
-       if(*(unsigned int*)key1 == *(unsigned int*)key2)
-               return 0;
-       else
-               return 1;
+   if (e->string)
+      free(e->string);
 
-}
+   if (e->key_compose)
+      free(e->key_compose);
 
-unsigned int _ecore_directfb_hash_create(void *key)
-{
-       return *(unsigned int*)key % ecore_prime_table[_ecore_directfb_key_symbols_hash->size];
+   free(e);
 }
 
-
 /* directfb window input events handler */
 /****************************************/
 
 static void
 _ecore_directfb_event_handle_motion(DFBEvent *evt)
 {
-
-       Ecore_DirectFB_Event_Motion *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Motion));
-
-       switch(evt->clazz)
-       {
-               case DFEC_INPUT:
-                       e->modifiers = 0;
-                       switch(evt->input.axis)
-                       {
-                               case DIAI_X:
-                                       e->x = _cursor_x = evt->input.axisabs;
-                                       e->y = _cursor_y;
-                                       break;
-                               case DIAI_Y:
-                                       e->y = _cursor_y = evt->input.axisabs;
-                                       e->x = _cursor_x;
-                                       break;
-                               case DIAI_Z:
-                                       //_ecore_directfb_event_handle_wheel(evt);
-                                       return;
-                               default:
-                                       return;
-                       }
-                       e->win = _ecore_directfb_fullscreen_window_id;
-                       e->time = 0;
-                       break;
-             
-               case DFEC_WINDOW:
-                       e->modifiers = 0;
-                       e->x = evt->window.x;
-                       e->y = evt->window.y;
-                       e->win = evt->window.window_id;
-                       e->time = 0;
-                       break;
-               default:
-                       break;
-       }
-       ecore_event_add(ECORE_DIRECTFB_EVENT_MOTION, e, NULL, NULL);
+   Ecore_DirectFB_Event_Motion *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Motion));
+
+   switch(evt->clazz)
+     {
+      case DFEC_INPUT:
+         e->modifiers = 0;
+         switch(evt->input.axis)
+           {
+            case DIAI_X:
+               e->x = _cursor_x = evt->input.axisabs;
+               e->y = _cursor_y;
+               break;
+
+            case DIAI_Y:
+               e->y = _cursor_y = evt->input.axisabs;
+               e->x = _cursor_x;
+               break;
+
+            case DIAI_Z:
+               //_ecore_directfb_event_handle_wheel(evt);
+               return;
+
+            default:
+               return;
+           }
+         e->win = _ecore_directfb_fullscreen_window_id;
+         e->time = 0;
+         break;
+
+      case DFEC_WINDOW:
+         e->modifiers = 0;
+         e->x = evt->window.x;
+         e->y = evt->window.y;
+         e->win = evt->window.window_id;
+         e->time = 0;
+         break;
+
+      default:
+         break;
+     }
+   ecore_event_add(ECORE_DIRECTFB_EVENT_MOTION, e, NULL, NULL);
 }
+
 static void
 _ecore_directfb_event_handle_key_down(DFBEvent *evt)
 {
-
-       Ecore_DirectFB_Event_Key_Down *e;
-       unsigned int key_symbol;
-       struct keymap *k;
-       
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Down));
-       
-       switch(evt->clazz)
-       {
-               case DFEC_INPUT:
-                       key_symbol = evt->input.key_symbol;
-                       k = ecore_hash_get(_ecore_directfb_key_symbols_hash, &key_symbol);
-
-                       if(!k) 
-                       {
-                               printf("error en el numero, %0X\n", evt->input.key_symbol);
-                               return;
-                       }
-                       e->name = strdup(k->name);
-                       e->string = strdup(k->string);
-                       e->key_compose = NULL;
-                       e->win = _ecore_directfb_fullscreen_window_id;
-                       e->time = 0;
-                       break;
-             
-               case DFEC_WINDOW:
-                       key_symbol = evt->window.key_symbol;
-                       k = ecore_hash_get(_ecore_directfb_key_symbols_hash, &key_symbol);
-
-                       if(!k) 
-                       {
-                               printf("error en el numero, %0X\n", evt->window.key_symbol);
-                               return;
-                       }
-                       e->name = strdup(k->name);
-                       e->string = strdup(k->string);
-                       e->key_compose = NULL;
-                       e->win = evt->window.window_id;
-                       e->time = 0;
-                       break;
-               default:
-                       break;
-       }
-                               
-       ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, e, _ecore_directfb_event_free_key_down, NULL);
+   Ecore_DirectFB_Event_Key_Down *e;
+   unsigned int key_symbol;
+   struct keymap *k;
+
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Down));
+
+   switch(evt->clazz)
+     {
+      case DFEC_INPUT:
+         key_symbol = evt->input.key_symbol;
+         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
+
+         if(!k)
+           {
+              ERR("Symbol %0X of class DFEC_INPUT not found.", evt->input.key_symbol);
+              return;
+           }
+
+         e->name = strdup(k->name);
+         e->string = strdup(k->string);
+         e->key_compose = NULL;
+         e->win = _ecore_directfb_fullscreen_window_id;
+         e->time = 0;
+         break;
+
+      case DFEC_WINDOW:
+         key_symbol = evt->window.key_symbol;
+         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
+
+         if(!k)
+           {
+              ERR("Symbol %0X of class DFEC_WINDOW not found.", evt->window.key_symbol);
+              return;
+           }
+
+         e->name = strdup(k->name);
+         e->string = strdup(k->string);
+         e->key_compose = NULL;
+         e->win = evt->window.window_id;
+         e->time = 0;
+         break;
+
+      default:
+         break;
+     }
+
+   ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, e, _ecore_directfb_event_free_key_down, NULL);
 }
+
 static void
 _ecore_directfb_event_handle_key_up(DFBEvent *evt)
 {
-       Ecore_DirectFB_Event_Key_Up *e;
-       unsigned int key_symbol;
-       struct keymap *k;
-       
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Up));
-       
-       switch(evt->clazz)
-       {
-               case DFEC_INPUT:
-                       key_symbol = evt->input.key_symbol;
-                       k = ecore_hash_get(_ecore_directfb_key_symbols_hash, &key_symbol);
-
-                       
-                       if(!k) 
-                       {
-                               printf("error en el numero, %0X\n", evt->input.key_symbol);
-                               return;
-                       }
-                       e->name = strdup(k->name);
-                       e->string = strdup(k->string);
-                       e->key_compose = NULL;
-                       e->win = _ecore_directfb_fullscreen_window_id;
-                       e->time = 0;
-                       break;
-             
-               case DFEC_WINDOW:
-                       key_symbol = evt->window.key_symbol;
-                       k = ecore_hash_get(_ecore_directfb_key_symbols_hash, &key_symbol);
-
-                       if(!k) 
-                       {
-                               printf("error en el numero, %0X\n", evt->window.key_symbol);
-                               return;
-                       }
-                       e->name = strdup(k->name);
-                       e->string = strdup(k->string);
-                       e->key_compose = NULL;
-                       e->win = evt->window.window_id;
-                       e->time = 0;
-                       break;
-               default:
-                       break;
-       }
-       ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_UP, e, _ecore_directfb_event_free_key_up, NULL);
-
+   Ecore_DirectFB_Event_Key_Up *e;
+   unsigned int key_symbol;
+   struct keymap *k;
+
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Up));
+
+   switch(evt->clazz)
+     {
+      case DFEC_INPUT:
+         key_symbol = evt->input.key_symbol;
+         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
+
+         if(!k)
+           {
+              ERR("Symbol %0X of class DFEC_INPUT not found.", evt->input.key_symbol);
+              return;
+           }
+
+         e->name = strdup(k->name);
+         e->string = strdup(k->string);
+         e->key_compose = NULL;
+         e->win = _ecore_directfb_fullscreen_window_id;
+         e->time = 0;
+         break;
+
+      case DFEC_WINDOW:
+         key_symbol = evt->window.key_symbol;
+         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
+
+         if(!k)
+           {
+              ERR("Symbol %0X of class DFEC_WINDOW not found.", evt->window.key_symbol);
+              return;
+           }
+
+         e->name = strdup(k->name);
+         e->string = strdup(k->string);
+         e->key_compose = NULL;
+         e->win = evt->window.window_id;
+         e->time = 0;
+         break;
+
+      default:
+         break;
+     }
+   ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_UP, e, _ecore_directfb_event_free_key_up, NULL);
 }
 
 static void
 _ecore_directfb_event_handle_button_down(DFBEvent *evt)
 {
-       Ecore_DirectFB_Event_Button_Down *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Down));
-
-       switch(evt->clazz)
-       {
-               case DFEC_INPUT:
-                       e->button = evt->input.button + 1;
-                       e->modifiers = 0;
-                       DFBCHECK(_layer->GetCursorPosition(_layer,&e->x,&e->y));
-                       e->x = _cursor_x;
-                       e->y = _cursor_y;
-                       e->win = _ecore_directfb_fullscreen_window_id;
-                       e->time = 0;
-                       
-                       break;
-             
-               case DFEC_WINDOW:
-                       e->button = evt->window.button + 1;
-                       e->modifiers = 0;
-                       e->x = evt->window.x;
-                       e->y = evt->window.y;
-                       e->win = evt->window.window_id;
-                       e->time = 0;
-                       break;
-               default:
-                       break;
-       }
-                       
-       ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_DOWN, e, NULL, NULL);
-
+   Ecore_DirectFB_Event_Button_Down *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Down));
+
+   switch(evt->clazz)
+     {
+      case DFEC_INPUT:
+         e->button = evt->input.button + 1;
+         e->modifiers = 0;
+         DFBCHECK(_layer->GetCursorPosition(_layer,&e->x,&e->y));
+         e->x = _cursor_x;
+         e->y = _cursor_y;
+         e->win = _ecore_directfb_fullscreen_window_id;
+         e->time = 0;
+
+         break;
+
+      case DFEC_WINDOW:
+         e->button = evt->window.button + 1;
+         e->modifiers = 0;
+         e->x = evt->window.x;
+         e->y = evt->window.y;
+         e->win = evt->window.window_id;
+         e->time = 0;
+         break;
+
+      default:
+         break;
+     }
+
+   ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_DOWN, e, NULL, NULL);
 }
 
 static void
 _ecore_directfb_event_handle_button_up(DFBEvent *evt)
 {
-       Ecore_DirectFB_Event_Button_Up *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Up));
-
-       switch(evt->clazz)
-       {
-               case DFEC_INPUT:
-                       e->button = evt->input.button + 1;
-                       e->modifiers = 0;
-                       e->x = _cursor_x;
-                       e->y = _cursor_y; 
-                       e->win = _ecore_directfb_fullscreen_window_id;
-                       e->time = 0;
-                       
-                       break;
-             
-               case DFEC_WINDOW:
-                       e->button = evt->window.button + 1;
-                       e->modifiers = 0;
-                       e->x = evt->window.x;
-                       e->y = evt->window.y;
-                       e->win = evt->window.window_id;
-                       e->time = 0;
-                       break;
-               default:
-                       break;
-       }
-       ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_UP, e, NULL, NULL);
-
+   Ecore_DirectFB_Event_Button_Up *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Up));
+
+   switch(evt->clazz)
+     {
+      case DFEC_INPUT:
+         e->button = evt->input.button + 1;
+         e->modifiers = 0;
+         e->x = _cursor_x;
+         e->y = _cursor_y;
+         e->win = _ecore_directfb_fullscreen_window_id;
+         e->time = 0;
+
+         break;
+
+      case DFEC_WINDOW:
+         e->button = evt->window.button + 1;
+         e->modifiers = 0;
+         e->x = evt->window.x;
+         e->y = evt->window.y;
+         e->win = evt->window.window_id;
+         e->time = 0;
+         break;
+
+      default:
+         break;
+     }
+   ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_UP, e, NULL, NULL);
 }
 
 static void
 _ecore_directfb_event_handle_enter(DFBWindowEvent *evt)
 {
-       Ecore_DirectFB_Event_Enter *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Enter));
+   Ecore_DirectFB_Event_Enter *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Enter));
 
-       e->modifiers = 0;
-       e->x = evt->x;
-       e->y = evt->y;
-       e->win = evt->window_id;
-       e->time = 0;
-                       
-       ecore_event_add(ECORE_DIRECTFB_EVENT_ENTER, e, NULL, NULL);
+   e->modifiers = 0;
+   e->x = evt->x;
+   e->y = evt->y;
+   e->win = evt->window_id;
+   e->time = 0;
 
+   ecore_event_add(ECORE_DIRECTFB_EVENT_ENTER, e, NULL, NULL);
 }
 
 static void
 _ecore_directfb_event_handle_leave(DFBWindowEvent *evt)
 {
-       Ecore_DirectFB_Event_Leave *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Leave));
+   Ecore_DirectFB_Event_Leave *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Leave));
 
-       e->modifiers = 0;
-       e->x = evt->x;
-       e->y = evt->y;
-       e->win = evt->window_id;
-       e->time = 0;
-                       
-       ecore_event_add(ECORE_DIRECTFB_EVENT_LEAVE, e, NULL, NULL);
+   e->modifiers = 0;
+   e->x = evt->x;
+   e->y = evt->y;
+   e->win = evt->window_id;
+   e->time = 0;
 
+   ecore_event_add(ECORE_DIRECTFB_EVENT_LEAVE, e, NULL, NULL);
 }
 
 static void
 _ecore_directfb_event_handle_wheel(DFBWindowEvent *evt)
 {
-       Ecore_DirectFB_Event_Wheel *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Wheel));
-
-       // currently there's no direction (only up/down);
-       e->direction = 0;
-       e->z = evt->step;
-       e->modifiers = 0;
-       e->win = evt->window_id;
-       e->time = 0;
-                       
-       ecore_event_add(ECORE_DIRECTFB_EVENT_WHEEL, e, NULL, NULL);
+   Ecore_DirectFB_Event_Wheel *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Wheel));
 
+   // currently there's no direction (only up/down);
+   e->direction = 0;
+   e->z = evt->step;
+   e->modifiers = 0;
+   e->win = evt->window_id;
+   e->time = 0;
+
+   ecore_event_add(ECORE_DIRECTFB_EVENT_WHEEL, e, NULL, NULL);
 }
 
 static void
 _ecore_directfb_event_handle_got_focus(DFBWindowEvent *evt)
 {
-       Ecore_DirectFB_Event_Got_Focus *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Got_Focus));
+   Ecore_DirectFB_Event_Got_Focus *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Got_Focus));
 
-       e->win = evt->window_id;
-       e->time = 0;
-                       
-       ecore_event_add(ECORE_DIRECTFB_EVENT_GOT_FOCUS, e, NULL, NULL);
+   e->win = evt->window_id;
+   e->time = 0;
 
+   ecore_event_add(ECORE_DIRECTFB_EVENT_GOT_FOCUS, e, NULL, NULL);
 }
 
 static void
 _ecore_directfb_event_handle_lost_focus(DFBWindowEvent *evt)
 {
-       Ecore_DirectFB_Event_Lost_Focus *e;
-       e = calloc(1, sizeof(Ecore_DirectFB_Event_Lost_Focus));
+   Ecore_DirectFB_Event_Lost_Focus *e;
+   e = calloc(1, sizeof(Ecore_DirectFB_Event_Lost_Focus));
 
-       e->win = evt->window_id;
-       e->time = 0;
-                       
-       ecore_event_add(ECORE_DIRECTFB_EVENT_LOST_FOCUS, e, NULL, NULL);
+   e->win = evt->window_id;
+   e->time = 0;
 
+   ecore_event_add(ECORE_DIRECTFB_EVENT_LOST_FOCUS, e, NULL, NULL);
 }
 
-
 /* inputs and windows fds handlers */
 /***********************************/
 /* TODO fix this to handle windows and input events (fullscreen/window mode)
  * in fullscreen theres no window_id so get the id from a global var (only one fullscreen
  * window at a time */
 
-
-static int
+static Eina_Bool
 _ecore_directfb_input_event_fd_handler(void *data __UNUSED__,Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
-       DFBEvent evt;
-       int v = 0;
-               
-       v = read(_input_event_fd, &evt, sizeof(DFBEvent));
-       if (v < 0) return 1;
-       if (v < 1) return 1;
-       
-       /* we are getting duplicate events, only parse if we are in fullscreen */
-       //if(_ecore_directfb_fullscreen_window_id == 0) break;
-       if(evt.input.type == DIET_KEYPRESS)
-               _ecore_directfb_event_handle_key_down(&evt);
-       if(evt.input.type == DIET_KEYRELEASE)
-               _ecore_directfb_event_handle_key_up(&evt);
-       if(evt.input.type == DIET_BUTTONPRESS)
-               _ecore_directfb_event_handle_button_down(&evt);
-       if(evt.input.type == DIET_BUTTONRELEASE)
-               _ecore_directfb_event_handle_button_up(&evt);
-       if(evt.input.type == DIET_AXISMOTION)
-               _ecore_directfb_event_handle_motion(&evt);
-
-       return 1;
+   DFBEvent evt;
+   int v = 0;
+
+   v = read(_input_event_fd, &evt, sizeof(DFBEvent));
+   if (v < 0)
+      return EINA_TRUE;
+
+   if (v < 1)
+      return EINA_TRUE;
+
+   /* we are getting duplicate events, only parse if we are in fullscreen */
+   //if(_ecore_directfb_fullscreen_window_id == 0) break;
+   if(evt.input.type == DIET_KEYPRESS)
+      _ecore_directfb_event_handle_key_down(&evt);
+
+   if(evt.input.type == DIET_KEYRELEASE)
+      _ecore_directfb_event_handle_key_up(&evt);
+
+   if(evt.input.type == DIET_BUTTONPRESS)
+      _ecore_directfb_event_handle_button_down(&evt);
+
+   if(evt.input.type == DIET_BUTTONRELEASE)
+      _ecore_directfb_event_handle_button_up(&evt);
+
+   if(evt.input.type == DIET_AXISMOTION)
+      _ecore_directfb_event_handle_motion(&evt);
+
+   return EINA_TRUE;
 }
-       
-static int
+
+static Eina_Bool
 _ecore_directfb_window_event_fd_handler(void *data __UNUSED__,Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
-       DFBEvent evt;
-       int v = 0;
-               
-       v = read(_window_event_fd, &evt, sizeof(DFBEvent));
-       if (v < 0) return 1;
-       if (v < 1) return 1;
-                       
-       if(evt.window.type & DWET_POSITION)
-               printf("position\n");
-       if(evt.window.type & DWET_SIZE)
-               printf("size\n");
-       if(evt.window.type & DWET_CLOSE)
-               printf("close\n");
-       if(evt.window.type & DWET_DESTROYED)
-               printf("destroyed\n");
-       if(evt.window.type & DWET_GOTFOCUS)
-               _ecore_directfb_event_handle_got_focus(&evt.window);
-       if(evt.window.type & DWET_LOSTFOCUS)
-               _ecore_directfb_event_handle_lost_focus(&evt.window);
-       if(evt.window.type & DWET_KEYDOWN)
-               _ecore_directfb_event_handle_key_down(&evt);
-       if(evt.window.type & DWET_KEYUP)
-               _ecore_directfb_event_handle_key_up(&evt);
-       if(evt.window.type & DWET_BUTTONDOWN)
-               _ecore_directfb_event_handle_button_down(&evt);
-       if(evt.window.type & DWET_BUTTONUP)
-               _ecore_directfb_event_handle_button_up(&evt);
-       if(evt.window.type & DWET_MOTION)
-               _ecore_directfb_event_handle_motion(&evt);
-       if(evt.window.type & DWET_ENTER)
-               _ecore_directfb_event_handle_enter(&evt.window);
-       if(evt.window.type & DWET_LEAVE)
-               _ecore_directfb_event_handle_leave(&evt.window);
-       if(evt.window.type & DWET_WHEEL)
-               _ecore_directfb_event_handle_wheel(&evt.window);
-       return 1;
+   DFBEvent evt;
+   int v = 0;
+
+   v = read(_window_event_fd, &evt, sizeof(DFBEvent));
+   if (v < 0)
+      return EINA_TRUE;
+
+   if (v < 1)
+      return EINA_TRUE;
+
+   if(evt.window.type & DWET_POSITION)
+      INF("position");
+
+   if(evt.window.type & DWET_SIZE)
+      INF("size");
+
+   if(evt.window.type & DWET_CLOSE)
+      INF("close");
+
+   if(evt.window.type & DWET_DESTROYED)
+      INF("destroyed");
+
+   if(evt.window.type & DWET_GOTFOCUS)
+      _ecore_directfb_event_handle_got_focus(&evt.window);
+
+   if(evt.window.type & DWET_LOSTFOCUS)
+      _ecore_directfb_event_handle_lost_focus(&evt.window);
+
+   if(evt.window.type & DWET_KEYDOWN)
+      _ecore_directfb_event_handle_key_down(&evt);
+
+   if(evt.window.type & DWET_KEYUP)
+      _ecore_directfb_event_handle_key_up(&evt);
+
+   if(evt.window.type & DWET_BUTTONDOWN)
+      _ecore_directfb_event_handle_button_down(&evt);
+
+   if(evt.window.type & DWET_BUTTONUP)
+      _ecore_directfb_event_handle_button_up(&evt);
+
+   if(evt.window.type & DWET_MOTION)
+      _ecore_directfb_event_handle_motion(&evt);
+
+   if(evt.window.type & DWET_ENTER)
+      _ecore_directfb_event_handle_enter(&evt.window);
+
+   if(evt.window.type & DWET_LEAVE)
+      _ecore_directfb_event_handle_leave(&evt.window);
+
+   if(evt.window.type & DWET_WHEEL)
+      _ecore_directfb_event_handle_wheel(&evt.window);
+
+   return EINA_TRUE;
 }
-       
+
 /* api functions */
 /*****************/
 
-
 EAPI IDirectFB *
 ecore_directfb_interface_get(void)
 {
-       return _dfb;
+   return _dfb;
 }
 
-
-
 EAPI Ecore_DirectFB_Window *
 ecore_directfb_window_new(int x, int y, int w, int h)
 {
-       Ecore_DirectFB_Window *window;
-       IDirectFBWindow *dfb_window;
-       IDirectFBSurface *dfb_surface = NULL;
-       DFBWindowDescription desc;
-       DFBWindowID id;
-       
-       memset(&desc, 0, sizeof(DFBWindowDescription));
-       desc.flags = (DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS);
-       desc.posx = x;
-       desc.posy = y;
-       desc.width = w;
-       desc.height = h;
-       desc.caps = DWCAPS_ALPHACHANNEL;
-       
-       DFBCHECK(_layer->CreateWindow(_layer, &desc, &dfb_window));
-       
-       dfb_window->AttachEventBuffer(dfb_window, _window_event);
-       dfb_window->SetOptions(dfb_window,DWOP_NONE);
-       dfb_window->SetOpacity(dfb_window, 0xFF);
-       
-       DFBCHECK(dfb_window->GetID(dfb_window, &id));
-       DFBCHECK(dfb_window->GetSurface(dfb_window,&dfb_surface));
-       
-       window = malloc(sizeof(Ecore_DirectFB_Window)); 
-       window->id = id;
-       window->window = dfb_window;
-       window->surface = dfb_surface;
-       window->cursor = NULL;
-
-       return window;
+   Ecore_DirectFB_Window *window;
+   IDirectFBWindow *dfb_window;
+   IDirectFBSurface *dfb_surface = NULL;
+   DFBWindowDescription desc;
+   DFBWindowID id;
+
+   memset(&desc, 0, sizeof(DFBWindowDescription));
+   desc.flags = (DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS);
+   desc.posx = x;
+   desc.posy = y;
+   desc.width = w;
+   desc.height = h;
+   desc.caps = DWCAPS_ALPHACHANNEL;
+
+   DFBCHECK(_layer->CreateWindow(_layer, &desc, &dfb_window));
+
+   dfb_window->AttachEventBuffer(dfb_window, _window_event);
+   dfb_window->SetOptions(dfb_window,DWOP_NONE);
+   dfb_window->SetOpacity(dfb_window, 0xFF);
+
+   DFBCHECK(dfb_window->GetID(dfb_window, &id));
+   DFBCHECK(dfb_window->GetSurface(dfb_window,&dfb_surface));
+
+   window = malloc(sizeof(Ecore_DirectFB_Window));
+   window->id = id;
+   window->window = dfb_window;
+   window->surface = dfb_surface;
+   window->cursor = NULL;
+
+   return window;
 }
 
 EAPI void
-ecore_directfb_window_del(Ecore_DirectFB_Window *ecore_window)
+ecore_directfb_window_free(Ecore_DirectFB_Window *ecore_window)
 {
-       DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
-       DFBCHECK(ecore_window->window->Release(ecore_window->window));
-       free(ecore_window);
+   DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
+   DFBCHECK(ecore_window->window->Release(ecore_window->window));
+   free(ecore_window);
 }
 
-
 EAPI void
 ecore_directfb_window_move(Ecore_DirectFB_Window *ecore_window, int x, int y)
 {
-       DFBCHECK(ecore_window->window->MoveTo(ecore_window->window, x, y));
+   DFBCHECK(ecore_window->window->MoveTo(ecore_window->window, x, y));
 }
 
 EAPI void
 ecore_directfb_window_resize(Ecore_DirectFB_Window *ecore_window, int w, int h)
 {
-       DFBCHECK(ecore_window->window->Resize(ecore_window->window, w, h));
+   DFBCHECK(ecore_window->window->Resize(ecore_window->window, w, h));
 }
 
-EAPI void 
+EAPI void
 ecore_directfb_window_focus(Ecore_DirectFB_Window *ecore_window)
-{      
-       DFBCHECK(ecore_window->window->RequestFocus(ecore_window->window));     
+{
+   DFBCHECK(ecore_window->window->RequestFocus(ecore_window->window));
 }
 
-EAPI void 
+EAPI void
 ecore_directfb_window_hide(Ecore_DirectFB_Window *ecore_window)
 {
-       DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window,0));
-
+   DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window, 0));
 }
 
 EAPI void
 ecore_directfb_window_show(Ecore_DirectFB_Window *ecore_window)
 {
-       DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window, 0xFF));
+   DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window, 0xFF));
 }
 
 EAPI void
-ecore_directfb_window_shaped_set(Ecore_DirectFB_Window *ecore_window, int set)
+ecore_directfb_window_shaped_set(Ecore_DirectFB_Window *ecore_window, Eina_Bool set)
 {
-       DFBWindowOptions opts;
-       
-       DFBCHECK(ecore_window->window->GetOptions(ecore_window->window, &opts));
-       if(set)
-       {
-               opts |= DWOP_SHAPED;
-               opts |= DWOP_ALPHACHANNEL;
-               DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
-       }
-       else
-       {
-               opts &= ~DWOP_SHAPED;
-               opts &= ~DWOP_ALPHACHANNEL;
-               DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
-       }
+   DFBWindowOptions opts;
+
+   DFBCHECK(ecore_window->window->GetOptions(ecore_window->window, &opts));
+   if(set)
+     {
+        opts |= DWOP_SHAPED;
+        opts |= DWOP_ALPHACHANNEL;
+        DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
+     }
+   else
+     {
+        opts &= ~DWOP_SHAPED;
+        opts &= ~DWOP_ALPHACHANNEL;
+        DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
+     }
 }
 
 EAPI void
-ecore_directfb_window_cursor_show(Ecore_DirectFB_Window *ecore_window, int show)
+ecore_directfb_window_cursor_show(Ecore_DirectFB_Window *ecore_window, Eina_Bool show)
 {
-       if(!show)
-       {
-               /* create an empty cursor and set it */
-               IDirectFBSurface *cursor;
-               DFBSurfaceDescription desc;
-                       
-               memset(&desc, 0, sizeof(DFBSurfaceDescription));
-               desc.flags = (DSDESC_HEIGHT | DSDESC_WIDTH | DSDESC_PIXELFORMAT);
-               desc.width = 1;
-               desc.height = 1;
-               desc.pixelformat = DSPF_A1;
-                       
-               DFBCHECK(_dfb->CreateSurface(_dfb,&desc,&cursor));
-               DFBCHECK(cursor->Clear(cursor,0,0,0,0));
-               DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor, 0, 0));
-       }
-       else
-       {
-               /* we already have a cursor surface so set it*/
-               if(ecore_window->cursor)
-               {
-                       DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, ecore_window->cursor->surface, ecore_window->cursor->hot_x, ecore_window->cursor->hot_y));
-               }
-               /* or just set the default directfb cursor */
-               else
-               {
-                       DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
-               }
-                       
-       }
+   if(!show)
+     {
+        /* create an empty cursor and set it */
+        IDirectFBSurface *cursor;
+        DFBSurfaceDescription desc;
+
+        memset(&desc, 0, sizeof(DFBSurfaceDescription));
+        desc.flags = (DSDESC_HEIGHT | DSDESC_WIDTH | DSDESC_PIXELFORMAT);
+        desc.width = 1;
+        desc.height = 1;
+        desc.pixelformat = DSPF_A1;
+
+        DFBCHECK(_dfb->CreateSurface(_dfb,&desc,&cursor));
+        DFBCHECK(cursor->Clear(cursor,0,0,0,0));
+        DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor, 0, 0));
+     }
+   else
+     {
+        /* we already have a cursor surface so set it*/
+        if(ecore_window->cursor)
+          {
+             DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, ecore_window->cursor->surface, ecore_window->cursor->hot_x, ecore_window->cursor->hot_y));
+          }
+        /* or just set the default directfb cursor */
+        else
+          {
+             DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
+          }
+     }
 }
 
 EAPI void
 ecore_directfb_window_cursor_set(Ecore_DirectFB_Window *ecore_window, Ecore_DirectFB_Cursor *cursor)
 {
-       if( (!cursor) && (ecore_window->cursor))
-       {
-               ecore_window->cursor = NULL;
-               DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
-               return;
-       }
-       if(cursor)      
-       {
-               ecore_window->cursor = cursor;
-               DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor->surface, cursor->hot_x, cursor->hot_y));
-               
-       }
-
+   if((!cursor) && (ecore_window->cursor))
+     {
+        ecore_window->cursor = NULL;
+        DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
+        return;
+     }
+
+   if(cursor)
+     {
+        ecore_window->cursor = cursor;
+        DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor->surface, cursor->hot_x, cursor->hot_y));
+     }
 }
 
-EAPI void 
-ecore_directfb_window_fullscreen_set(Ecore_DirectFB_Window *ecore_window, int on)
+EAPI void
+ecore_directfb_window_fullscreen_set(Ecore_DirectFB_Window *ecore_window, Eina_Bool on)
 {
-       // always release the surface (we are going to get a new one in both cases)
-       DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
-       if(on)
-       {
-               DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_EXCLUSIVE));
-               DFBCHECK(_layer->GetSurface(_layer,&ecore_window->surface));
-               DFBCHECK(_dfb->CreateInputEventBuffer(_dfb, DICAPS_ALL, DFB_FALSE, &_input_event));
-               DFBCHECK(_input_event->CreateFileDescriptor(_input_event,&_input_event_fd));
-               /* the event of axismove sends one axis at a time, so we must store both */
-               DFBCHECK(_layer->GetCursorPosition(_layer,&_cursor_x,&_cursor_y));
-               
-               _input_event_fd_handler_handle = ecore_main_fd_handler_add(_input_event_fd,ECORE_FD_READ,_ecore_directfb_input_event_fd_handler, NULL,NULL,NULL);
-               _ecore_directfb_fullscreen_window_id = ecore_window->id;
-       }
-       else
-       {
-               DFBCHECK(_input_event->Release(_input_event));  
-               DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_SHARED));
-               DFBCHECK(ecore_window->window->GetSurface(ecore_window->window, &ecore_window->surface));
-               ecore_main_fd_handler_del(_input_event_fd_handler_handle);
-               _ecore_directfb_fullscreen_window_id = 0;
-       }
-               
+   // always release the surface (we are going to get a new one in both cases)
+   DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
+   if(on)
+     {
+        DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_EXCLUSIVE));
+        DFBCHECK(_layer->GetSurface(_layer,&ecore_window->surface));
+        DFBCHECK(_dfb->CreateInputEventBuffer(_dfb, DICAPS_ALL, DFB_FALSE, &_input_event));
+        DFBCHECK(_input_event->CreateFileDescriptor(_input_event,&_input_event_fd));
+        /* the event of axismove sends one axis at a time, so we must store both */
+        DFBCHECK(_layer->GetCursorPosition(_layer,&_cursor_x,&_cursor_y));
+
+        _input_event_fd_handler_handle = ecore_main_fd_handler_add(_input_event_fd,ECORE_FD_READ,_ecore_directfb_input_event_fd_handler, NULL,NULL,NULL);
+        _ecore_directfb_fullscreen_window_id = ecore_window->id;
+     }
+   else
+     {
+        ecore_main_fd_handler_del(_input_event_fd_handler_handle);
+        DFBCHECK(_input_event->Release(_input_event));
+        DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_SHARED));
+        DFBCHECK(ecore_window->window->GetSurface(ecore_window->window, &ecore_window->surface));
+        _ecore_directfb_fullscreen_window_id = 0;
+     }
 }
 
 EAPI void
 ecore_directfb_window_size_get(Ecore_DirectFB_Window *ecore_window, int *w, int *h)
 {
-       DFBCHECK(ecore_window->surface->GetSize(ecore_window->surface,w,h));
-       return;
+   DFBCHECK(ecore_window->surface->GetSize(ecore_window->surface,w,h));
+   return;
 }
 
 EAPI int
-ecore_directfb_init(const char *name)
+ecore_directfb_init(const char *name __UNUSED__)
 {
-       int i = 0;
-       
-       _ecore_directfb_init_count++;
-       if (_ecore_directfb_init_count > 1) return _ecore_directfb_init_count;
-       
-       DFBCHECK(DirectFBInit(NULL,NULL));
-       DFBCHECK(DirectFBCreate(&_dfb));
-       
-       DFBCHECK(_dfb->GetDisplayLayer(_dfb, DLID_PRIMARY, &_layer));
-       DFBCHECK(_layer->SetCooperativeLevel(_layer, DLSCL_SHARED));
-       
-       
-       /* window events and fd */
-       DFBCHECK(_dfb->CreateEventBuffer(_dfb, &_window_event));
-       DFBCHECK(_window_event->CreateFileDescriptor(_window_event,&_window_event_fd));
-       _window_event_fd_handler_handle = ecore_main_fd_handler_add(_window_event_fd,ECORE_FD_READ,_ecore_directfb_window_event_fd_handler, NULL,NULL,NULL);
-       
-       /* register ecore directfb events */
-       ECORE_DIRECTFB_EVENT_POSITION   = ecore_event_type_new();
-       ECORE_DIRECTFB_EVENT_SIZE = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_CLOSE = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_DESTROYED = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_GOT_FOCUS = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_LOST_FOCUS = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_KEY_DOWN = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_KEY_UP = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_BUTTON_DOWN = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_BUTTON_UP = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_MOTION = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_ENTER = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_LEAVE = ecore_event_type_new();;
-       ECORE_DIRECTFB_EVENT_WHEEL = ecore_event_type_new();;
-
-       /* create the hash table for the keynames */
-       _ecore_directfb_key_symbols_hash = ecore_hash_new(_ecore_directfb_hash_create,_ecore_directfb_hash_compare);
-       for(i=0; i<_ecore_directfb_key_symbols_count; i++)
-       {
-               struct keymap *k;
-               k = malloc(sizeof(struct keymap));
-               k->name = _ecore_directfb_key_symbols[i].name;
-               k->string = _ecore_directfb_key_symbols[i].string;
-               ecore_hash_set(_ecore_directfb_key_symbols_hash, &_ecore_directfb_key_symbols[i].id, k);
-       }
-       /* create the hash for the windows(key = windowid, val = Ecore_DirectFB_Window struct) */
-       return _ecore_directfb_init_count;
+   int i = 0;
+
+   if (++_ecore_directfb_init_count != 1)
+      return _ecore_directfb_init_count;
+
+   _ecore_directfb_log_dom = eina_log_domain_register
+     ("ecore_directfb", ECORE_DIRECTFB_DEFAULT_LOG_COLOR);
+   if(_ecore_directfb_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for the Ecore directFB module.");
+        return _ecore_directfb_init_count--;
+     }
+
+   DFBCHECK(DirectFBInit(NULL,NULL));
+   DFBCHECK(DirectFBCreate(&_dfb));
+
+   DFBCHECK(_dfb->GetDisplayLayer(_dfb, DLID_PRIMARY, &_layer));
+   DFBCHECK(_layer->SetCooperativeLevel(_layer, DLSCL_SHARED));
+
+   /* window events and fd */
+   DFBCHECK(_dfb->CreateEventBuffer(_dfb, &_window_event));
+   DFBCHECK(_window_event->CreateFileDescriptor(_window_event,&_window_event_fd));
+   _window_event_fd_handler_handle = ecore_main_fd_handler_add(_window_event_fd,ECORE_FD_READ,_ecore_directfb_window_event_fd_handler, NULL,NULL,NULL);
+
+   /* register ecore directfb events */
+   ECORE_DIRECTFB_EVENT_POSITION = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_SIZE = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_CLOSE = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_DESTROYED = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_GOT_FOCUS = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_LOST_FOCUS = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_KEY_DOWN = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_KEY_UP = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_BUTTON_DOWN = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_BUTTON_UP = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_MOTION = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_ENTER = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_LEAVE = ecore_event_type_new();
+   ECORE_DIRECTFB_EVENT_WHEEL = ecore_event_type_new();
+
+   /* create the hash table for the keynames */
+   _ecore_directfb_key_symbols_hash = eina_hash_int32_new(free);
+   for(i = 0; i < _ecore_directfb_key_symbols_count; i++)
+     {
+        struct keymap *k;
+        k = malloc(sizeof(struct keymap));
+        k->name = _ecore_directfb_key_symbols[i].name;
+        k->string = _ecore_directfb_key_symbols[i].string;
+        eina_hash_add(_ecore_directfb_key_symbols_hash, &_ecore_directfb_key_symbols[i].id, k);
+     }
+   /* create the hash for the windows(key = windowid, val = Ecore_DirectFB_Window struct) */
+   return _ecore_directfb_init_count;
 }
 
 EAPI int
 ecore_directfb_shutdown(void)
 {
-       int i;
-
-       _ecore_directfb_init_count--;
-       if (_ecore_directfb_init_count > 0) return _ecore_directfb_init_count;
-       if (_ecore_directfb_init_count < 0)
-       {
-               _ecore_directfb_init_count = 0;
-               return 0;
-       }
-       ecore_main_fd_handler_del(_window_event_fd_handler_handle);
-       /* free the key symbol names hash */
-       for(i=0; i<_ecore_directfb_key_symbols_count; i++)
-       {
-               struct keymap *k;
-               k = ecore_hash_get(_ecore_directfb_key_symbols_hash, &_ecore_directfb_key_symbols[i].id);
-               ecore_hash_remove(_ecore_directfb_key_symbols_hash, &_ecore_directfb_key_symbols[i].id);
-               free(k);
-       }
-       
-       if(_ecore_directfb_fullscreen_window_id)
-       {
-               DFBCHECK(_input_event->Release(_input_event));  
-               ecore_main_fd_handler_del(_input_event_fd_handler_handle);
-       }
-       DFBCHECK(_window_event->Release(_window_event));        
-       DFBCHECK(_layer->Release(_layer));
-       DFBCHECK(_dfb->Release(_dfb));
-       
-       return 1;
+   if (--_ecore_directfb_init_count != 0)
+      return _ecore_directfb_init_count;
+
+   ecore_main_fd_handler_del(_window_event_fd_handler_handle);
+   eina_hash_free(_ecore_directfb_key_symbols_hash);
+
+   if(_ecore_directfb_fullscreen_window_id)
+     {
+        DFBCHECK(_input_event->Release(_input_event));
+        ecore_main_fd_handler_del(_input_event_fd_handler_handle);
+     }
+
+   DFBCHECK(_window_event->Release(_window_event));
+   DFBCHECK(_layer->Release(_layer));
+   DFBCHECK(_dfb->Release(_dfb));
+   eina_log_domain_unregister(_ecore_directfb_log_dom);
+   _ecore_directfb_log_dom = -1;
+   return _ecore_directfb_init_count;
 }
+
index e24d715..19cca46 100644 (file)
-typedef struct _Ecore_DirectFB_Key_Symbols Ecore_DirectFB_Key_Symbols;
+typedef struct _Ecore_DirectFB_Key_Symbols   Ecore_DirectFB_Key_Symbols;
 struct _Ecore_DirectFB_Key_Symbols
 {
-       char *string;
-       char *name;
-       unsigned int id;
-} _ecore_directfb_key_symbols[] = {
-       {"\010", "BackSpace",DIKS_BACKSPACE},
-       {"\011", "Tab", DIKS_TAB},
-       {"\015", "Return", DIKS_RETURN},
-       {"", "Cancel", DIKS_CANCEL},
-       {"", "Escape", DIKS_ESCAPE},
-       {" ", "space", DIKS_SPACE},
-       {"!", "exclam", DIKS_EXCLAMATION_MARK},
-       {"\"", "quotedbl", DIKS_QUOTATION},
-       {"#", "numbersign", DIKS_NUMBER_SIGN},
-       {"$", "dollar", DIKS_DOLLAR_SIGN},
-       {"%", "percent", DIKS_PERCENT_SIGN},
-       {"&", "ampersand", DIKS_AMPERSAND},
-       {"'", "apostrophe", DIKS_APOSTROPHE},
-       {"(", "parenleft", DIKS_PARENTHESIS_LEFT},
-       {")", "parenright", DIKS_PARENTHESIS_RIGHT},
-       {"*", "asterisk", DIKS_ASTERISK},
-       {"+", "plus", DIKS_PLUS_SIGN},
-       {",", "comma", DIKS_COMMA},
-       {"-", "minus", DIKS_MINUS_SIGN},
-       {".", "period", DIKS_PERIOD},
-       {"/", "slash", DIKS_SLASH},
-       {"0", "0", DIKS_0},
-       {"1", "1", DIKS_1},
-       {"2", "2", DIKS_2},
-       {"3", "3", DIKS_3},
-       {"4", "4", DIKS_4},
-       {"5", "5", DIKS_5},
-       {"6", "6", DIKS_6},
-       {"7", "7", DIKS_7},
-       {"8", "8", DIKS_8},
-       {"9", "9", DIKS_9},
-       {":", "colon", DIKS_COLON},
-       {";", "semicolon", DIKS_SEMICOLON},
-       {"<", "less", DIKS_LESS_THAN_SIGN},
-       {"=", "equal", DIKS_EQUALS_SIGN},
-       {">", "greater", DIKS_GREATER_THAN_SIGN},
-       {"?", "question", DIKS_QUESTION_MARK},
-       {"@", "at", DIKS_AT},
-       {"A", "A", DIKS_CAPITAL_A },
-       {"B", "B", DIKS_CAPITAL_B },
-       {"C", "C", DIKS_CAPITAL_C },
-       {"D", "D", DIKS_CAPITAL_D },
-       {"E", "E", DIKS_CAPITAL_E },
-       {"F", "F", DIKS_CAPITAL_F },
-       {"G", "G", DIKS_CAPITAL_G },
-       {"H", "H", DIKS_CAPITAL_H },
-       {"I", "I", DIKS_CAPITAL_I },
-       {"J", "J", DIKS_CAPITAL_J },
-       {"K", "K", DIKS_CAPITAL_K },
-       {"L", "L", DIKS_CAPITAL_L },
-       {"M", "M", DIKS_CAPITAL_M },
-       {"N", "N", DIKS_CAPITAL_N },
-       {"O", "O", DIKS_CAPITAL_O },
-       {"P", "P", DIKS_CAPITAL_P },
-       {"Q", "Q", DIKS_CAPITAL_Q },
-       {"R", "R", DIKS_CAPITAL_R },
-       {"S", "S", DIKS_CAPITAL_S },
-       {"T", "T", DIKS_CAPITAL_T },
-       {"U", "U", DIKS_CAPITAL_U },
-       {"V", "V", DIKS_CAPITAL_V },
-       {"W", "W", DIKS_CAPITAL_W },
-       {"X", "X", DIKS_CAPITAL_X },
-       {"Y", "Y", DIKS_CAPITAL_Y },
-       {"Z", "Z", DIKS_CAPITAL_Z },
-       {"[", "bracketleft", DIKS_SQUARE_BRACKET_LEFT },
-       {"\\", "backslash", DIKS_BACKSLASH },
-       {"]", "bracketright", DIKS_SQUARE_BRACKET_RIGHT },
-       {"^", "asciicircum", DIKS_CIRCUMFLEX_ACCENT },
-       {"_", "underscore", DIKS_UNDERSCORE },
-       {"`", "grave", DIKS_GRAVE_ACCENT},
-       {"a", "a", DIKS_SMALL_A },
-       {"b","b", DIKS_SMALL_B },
-       {"c","c", DIKS_SMALL_C },
-       {"d","d", DIKS_SMALL_D },
-       {"e","e", DIKS_SMALL_E },
-       {"f","f", DIKS_SMALL_F },
-       {"g","g", DIKS_SMALL_G },
-       {"h","h", DIKS_SMALL_H },
-       {"i","i", DIKS_SMALL_I },
-       {"j","j", DIKS_SMALL_J },
-       {"k","k", DIKS_SMALL_K },
-       {"l","l", DIKS_SMALL_L },
-       {"m","m", DIKS_SMALL_M },
-       {"n","n", DIKS_SMALL_N },
-       {"o", "o", DIKS_SMALL_O },
-       {"p", "p", DIKS_SMALL_P },
-       {"q", "q", DIKS_SMALL_Q },
-       {"r", "r", DIKS_SMALL_R },
-       {"s", "s", DIKS_SMALL_S },
-       {"t", "t", DIKS_SMALL_T },
-       {"u", "u", DIKS_SMALL_U },
-       {"v", "v", DIKS_SMALL_V },
-       {"w", "w", DIKS_SMALL_W },
-       {"x", "x", DIKS_SMALL_X },
-       {"y", "y", DIKS_SMALL_Y },
-       {"z", "z", DIKS_SMALL_Z },
-       {"{", "braceleft",DIKS_CURLY_BRACKET_LEFT },
-       {"|", "bar", DIKS_VERTICAL_BAR },
-       {"}", "braceright", DIKS_CURLY_BRACKET_RIGHT },
-       {"~", "asciitilde", DIKS_TILDE },
-       {"\177", "Delete", DIKS_DELETE },
-       {"", "Left", DIKS_CURSOR_LEFT },
-       {"", "Right", DIKS_CURSOR_RIGHT},
-       {"", "Up", DIKS_CURSOR_UP},
-       {"", "Down", DIKS_CURSOR_DOWN},
-       {"", "Insert", DIKS_INSERT},
-       {"", "Home", DIKS_HOME},
-       {"", "End", DIKS_END},
-       {"", "Page_Up", DIKS_PAGE_UP},
-       {"", "Page_Down", DIKS_PAGE_DOWN},
-       {"", "Print", DIKS_PRINT},
-       {"", "Pause", DIKS_PAUSE},
-       /* ok */
-       {"", "Select",DIKS_SELECT},
-       /* goto */
-       {"", "Clear", DIKS_CLEAR},
-       /* power */
-       /* power 2 */
-       /* option */
-       {"", "Menu",DIKS_MENU},
-       {"", "Help",DIKS_HELP},
-       /* info */
-       /* time */
-       /* vendor */
-       /* archive */
-       /* program */
-       /* channel */
-       /* favorites */
-       /* hasta next */
-       {"", "Next",DIKS_NEXT},
-       {"", "Begin",DIKS_BEGIN},
-       /* digits */
-       /* teen */
-       /* twen */
-       {"", "Break", DIKS_BREAK},
-       /* exit */
-       /* setup */
-       {"", "upleftcorner", DIKS_CURSOR_LEFT_UP },
-       {"", "lowleftcorner", DIKS_CURSOR_LEFT_DOWN },
-       {"", "uprightcorner", DIKS_CURSOR_UP_RIGHT },
-       {"", "lowrightcorner",DIKS_CURSOR_DOWN_RIGHT },
-       {"", "F1",DIKS_F1},
-       {"", "F2",DIKS_F2},
-       {"", "F3",DIKS_F3},
-       {"", "F4",DIKS_F4},
-       {"", "F5",DIKS_F5},
-       {"", "F6",DIKS_F6},
-       {"", "F7",DIKS_F7},
-       {"", "F8",DIKS_F8},
-       {"", "F9",DIKS_F9},
-       {"", "F10",DIKS_F10},
-       {"", "F11",DIKS_F11},
-       {"", "F12",DIKS_F12},
-       /* this are only mapped to one, not left right */
-       {"", "Shift_L", DIKS_SHIFT},
-       /*{"Shift_R",0xFFE2},*/
-       {"", "Control_L", DIKS_CONTROL},
-       /*{"Control_R",0xFFE4},*/
-       {"", "Meta_L", DIKS_META},
-       /* {"Meta_R",0xFFE8},*/
-       {"", "Alt_L", DIKS_ALT},
-       {"", "Alt_R", DIKS_ALTGR},
-       {"", "Super_L", DIKS_SUPER},
-       /*{"Super_R",0xFFEC},*/
-       {"", "Hyper_L", DIKS_HYPER},
-       /*{"Hyper_R",0xFFEE},*/
-               
-       {"", "Caps_Lock", DIKS_CAPS_LOCK},
-       {"", "Num_Lock", DIKS_NUM_LOCK},
-       {"", "Scroll_Lock", DIKS_SCROLL_LOCK},
-       /* not included the dead keys */
-       /* not included the custom keys */
-       {"", "VoidSymbol", DIKS_NULL}
+   char        *string;
+   char        *name;
+   unsigned int id;
 };
+
+static const Ecore_DirectFB_Key_Symbols _ecore_directfb_key_symbols[] = {
+   {"\010", "BackSpace",DIKS_BACKSPACE},
+   {"\011", "Tab", DIKS_TAB},
+   {"\015", "Return", DIKS_RETURN},
+   {"", "Cancel", DIKS_CANCEL},
+   {"", "Escape", DIKS_ESCAPE},
+   {" ", "space", DIKS_SPACE},
+   {"!", "exclam", DIKS_EXCLAMATION_MARK},
+   {"\"", "quotedbl", DIKS_QUOTATION},
+   {"#", "numbersign", DIKS_NUMBER_SIGN},
+   {"$", "dollar", DIKS_DOLLAR_SIGN},
+   {"%", "percent", DIKS_PERCENT_SIGN},
+   {"&", "ampersand", DIKS_AMPERSAND},
+   {"'", "apostrophe", DIKS_APOSTROPHE},
+   {"(", "parenleft", DIKS_PARENTHESIS_LEFT},
+   {")", "parenright", DIKS_PARENTHESIS_RIGHT},
+   {"*", "asterisk", DIKS_ASTERISK},
+   {"+", "plus", DIKS_PLUS_SIGN},
+   {",", "comma", DIKS_COMMA},
+   {"-", "minus", DIKS_MINUS_SIGN},
+   {".", "period", DIKS_PERIOD},
+   {"/", "slash", DIKS_SLASH},
+   {"0", "0", DIKS_0},
+   {"1", "1", DIKS_1},
+   {"2", "2", DIKS_2},
+   {"3", "3", DIKS_3},
+   {"4", "4", DIKS_4},
+   {"5", "5", DIKS_5},
+   {"6", "6", DIKS_6},
+   {"7", "7", DIKS_7},
+   {"8", "8", DIKS_8},
+   {"9", "9", DIKS_9},
+   {":", "colon", DIKS_COLON},
+   {";", "semicolon", DIKS_SEMICOLON},
+   {"<", "less", DIKS_LESS_THAN_SIGN},
+   {"=", "equal", DIKS_EQUALS_SIGN},
+   {">", "greater", DIKS_GREATER_THAN_SIGN},
+   {"?", "question", DIKS_QUESTION_MARK},
+   {"@", "at", DIKS_AT},
+   {"A", "A", DIKS_CAPITAL_A },
+   {"B", "B", DIKS_CAPITAL_B },
+   {"C", "C", DIKS_CAPITAL_C },
+   {"D", "D", DIKS_CAPITAL_D },
+   {"E", "E", DIKS_CAPITAL_E },
+   {"F", "F", DIKS_CAPITAL_F },
+   {"G", "G", DIKS_CAPITAL_G },
+   {"H", "H", DIKS_CAPITAL_H },
+   {"I", "I", DIKS_CAPITAL_I },
+   {"J", "J", DIKS_CAPITAL_J },
+   {"K", "K", DIKS_CAPITAL_K },
+   {"L", "L", DIKS_CAPITAL_L },
+   {"M", "M", DIKS_CAPITAL_M },
+   {"N", "N", DIKS_CAPITAL_N },
+   {"O", "O", DIKS_CAPITAL_O },
+   {"P", "P", DIKS_CAPITAL_P },
+   {"Q", "Q", DIKS_CAPITAL_Q },
+   {"R", "R", DIKS_CAPITAL_R },
+   {"S", "S", DIKS_CAPITAL_S },
+   {"T", "T", DIKS_CAPITAL_T },
+   {"U", "U", DIKS_CAPITAL_U },
+   {"V", "V", DIKS_CAPITAL_V },
+   {"W", "W", DIKS_CAPITAL_W },
+   {"X", "X", DIKS_CAPITAL_X },
+   {"Y", "Y", DIKS_CAPITAL_Y },
+   {"Z", "Z", DIKS_CAPITAL_Z },
+   {"[", "bracketleft", DIKS_SQUARE_BRACKET_LEFT },
+   {"\\", "backslash", DIKS_BACKSLASH },
+   {"]", "bracketright", DIKS_SQUARE_BRACKET_RIGHT },
+   {"^", "asciicircum", DIKS_CIRCUMFLEX_ACCENT },
+   {"_", "underscore", DIKS_UNDERSCORE },
+   {"`", "grave", DIKS_GRAVE_ACCENT},
+   {"a", "a", DIKS_SMALL_A },
+   {"b","b", DIKS_SMALL_B },
+   {"c","c", DIKS_SMALL_C },
+   {"d","d", DIKS_SMALL_D },
+   {"e","e", DIKS_SMALL_E },
+   {"f","f", DIKS_SMALL_F },
+   {"g","g", DIKS_SMALL_G },
+   {"h","h", DIKS_SMALL_H },
+   {"i","i", DIKS_SMALL_I },
+   {"j","j", DIKS_SMALL_J },
+   {"k","k", DIKS_SMALL_K },
+   {"l","l", DIKS_SMALL_L },
+   {"m","m", DIKS_SMALL_M },
+   {"n","n", DIKS_SMALL_N },
+   {"o", "o", DIKS_SMALL_O },
+   {"p", "p", DIKS_SMALL_P },
+   {"q", "q", DIKS_SMALL_Q },
+   {"r", "r", DIKS_SMALL_R },
+   {"s", "s", DIKS_SMALL_S },
+   {"t", "t", DIKS_SMALL_T },
+   {"u", "u", DIKS_SMALL_U },
+   {"v", "v", DIKS_SMALL_V },
+   {"w", "w", DIKS_SMALL_W },
+   {"x", "x", DIKS_SMALL_X },
+   {"y", "y", DIKS_SMALL_Y },
+   {"z", "z", DIKS_SMALL_Z },
+   {"{", "braceleft",DIKS_CURLY_BRACKET_LEFT },
+   {"|", "bar", DIKS_VERTICAL_BAR },
+   {"}", "braceright", DIKS_CURLY_BRACKET_RIGHT },
+   {"~", "asciitilde", DIKS_TILDE },
+   {"\177", "Delete", DIKS_DELETE },
+   {"", "Left", DIKS_CURSOR_LEFT },
+   {"", "Right", DIKS_CURSOR_RIGHT},
+   {"", "Up", DIKS_CURSOR_UP},
+   {"", "Down", DIKS_CURSOR_DOWN},
+   {"", "Insert", DIKS_INSERT},
+   {"", "Home", DIKS_HOME},
+   {"", "End", DIKS_END},
+   {"", "Page_Up", DIKS_PAGE_UP},
+   {"", "Page_Down", DIKS_PAGE_DOWN},
+   {"", "Print", DIKS_PRINT},
+   {"", "Pause", DIKS_PAUSE},
+   /* ok */
+   {"", "Select",DIKS_SELECT},
+   /* goto */
+   {"", "Clear", DIKS_CLEAR},
+   /* power */
+   /* power 2 */
+   /* option */
+   {"", "Menu",DIKS_MENU},
+   {"", "Help",DIKS_HELP},
+   /* info */
+   /* time */
+   /* vendor */
+   /* archive */
+   /* program */
+   /* channel */
+   /* favorites */
+   /* hasta next */
+   {"", "Next",DIKS_NEXT},
+   {"", "Begin",DIKS_BEGIN},
+   /* digits */
+   /* teen */
+   /* twen */
+   {"", "Break", DIKS_BREAK},
+   /* exit */
+   /* setup */
+   {"", "upleftcorner", DIKS_CURSOR_LEFT_UP },
+   {"", "lowleftcorner", DIKS_CURSOR_LEFT_DOWN },
+   {"", "uprightcorner", DIKS_CURSOR_UP_RIGHT },
+   {"", "lowrightcorner",DIKS_CURSOR_DOWN_RIGHT },
+   {"", "F1",DIKS_F1},
+   {"", "F2",DIKS_F2},
+   {"", "F3",DIKS_F3},
+   {"", "F4",DIKS_F4},
+   {"", "F5",DIKS_F5},
+   {"", "F6",DIKS_F6},
+   {"", "F7",DIKS_F7},
+   {"", "F8",DIKS_F8},
+   {"", "F9",DIKS_F9},
+   {"", "F10",DIKS_F10},
+   {"", "F11",DIKS_F11},
+   {"", "F12",DIKS_F12},
+   /* this are only mapped to one, not left right */
+   {"", "Shift_L", DIKS_SHIFT},
+   /*{"Shift_R",0xFFE2},*/
+   {"", "Control_L", DIKS_CONTROL},
+   /*{"Control_R",0xFFE4},*/
+   {"", "Meta_L", DIKS_META},
+   /* {"Meta_R",0xFFE8},*/
+   {"", "Alt_L", DIKS_ALT},
+   {"", "Alt_R", DIKS_ALTGR},
+   {"", "Super_L", DIKS_SUPER},
+   /*{"Super_R",0xFFEC},*/
+   {"", "Hyper_L", DIKS_HYPER},
+   /*{"Hyper_R",0xFFEE},*/
+
+   {"", "Caps_Lock", DIKS_CAPS_LOCK},
+   {"", "Num_Lock", DIKS_NUM_LOCK},
+   {"", "Scroll_Lock", DIKS_SCROLL_LOCK},
+   /* not included the dead keys */
+   /* not included the custom keys */
+   {"", "VoidSymbol", DIKS_NULL}
+};
+static int _ecore_directfb_key_symbols_count = sizeof(_ecore_directfb_key_symbols) / sizeof(Ecore_DirectFB_Key_Symbols);
index fc9ef5e..ed34587 100644 (file)
@@ -1,15 +1,52 @@
+#ifndef _ECORE_DIRECTFB_PRIVATE_H
+#define _ECORE_DIRECTFB_PRIVATE_H
+/* eina_log related things */
+
+extern int _ecore_directfb_log_dom;
+
+#ifdef ECORE_DIRECTFB_DEFAULT_LOG_COLOR
+#undef ECORE_DIRECTFB_DEFAULT_LOG_COLOR
+#endif /* ifdef ECORE_DIRECTFB_DEFAULT_LOG_COLOR */
+#define ECORE_DIRECTFB_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif /* ifdef ERR */
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_directfb_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif /* ifdef DBG */
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_directfb_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif /* ifdef INF */
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_directfb_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif /* ifdef WRN */
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_directfb_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif /* ifdef CRIT */
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_directfb_log_dom, __VA_ARGS__)
+
 /* macro for a safe call to DirectFB functions */
-#define DFBCHECK(x...) \
-     {                                                                 \
-          _err = x;                                                    \
-          if (_err != DFB_OK) {                                        \
-               fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ );  \
-               DirectFBErrorFatal( #x, _err );                         \
-          }                                                            \
-     }
+#define DFBCHECK(x ...)\
+   {\
+      _err = x;\
+      if (_err != DFB_OK) {\
+           CRIT("%s <%d>:\n\t", __FILE__, __LINE__ );\
+           DirectFBErrorFatal( # x, _err );\
+        }\
+   }
 
 struct keymap
 {
-       char *name;
-       char *string;
+   char *name;
+   char *string;
 };
+#endif /* ifndef _ECORE_DIRECTFB_PRIVATE_H */
index e8125b0..8a93180 100644 (file)
@@ -1,10 +1,10 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifndef _ECORE_EVAS_H
 #define _ECORE_EVAS_H
 
+#include <Evas.h>
+#include <Ecore_Getopt.h>
+#include <Ecore_Input.h>
+
 #ifdef EAPI
 # undef EAPI
 #endif
 /**
  * @file Ecore_Evas.h
  * @brief Evas wrapper functions
+ *
+ * The following is a list of example that partially exemplify Ecore_Evas's API:
+ * @li @ref ecore_evas_callbacks_example_c
+ * @li @ref ecore_evas_object_example_c
+ * @li @ref ecore_evas_basics_example_c
+ * @li @ref Ecore_Evas_Window_Sizes_Example_c
+ * @li @ref Ecore_Evas_Buffer_Example_01_c
+ * @li @ref Ecore_Evas_Buffer_Example_02_c
  */
 
 /* FIXME:
  * - dfb back-end ??? (dfb's threads make this REALLY HARD)
  */
 
-#include <Evas.h>
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+/**
+ * @defgroup Ecore_Evas_Group Ecore_Evas wrapper/helper set of functions
+ *
+ * Ecore evas is a set of functions that makes it easy to tie together ecore's
+ * main loop and input handling to evas. As such it's a natural base for EFL
+ * applications. While this combination makes it easy to create the basic
+ * aspects all applications need, for normal applications(ones with buttons,
+ * checkboxes and layouts) one should consider using Elementary.
+ *
+ * Ecore evas is extremely well suited for applications that are not based on
+ * widgets. It has a main loop that delivers events, does basic window handling
+ * and leaves all of the drawing up to the user. This works very well if used
+ * in conjunction with Edje or if doing custom drawing as, for example, is done
+ * in games.
+ *
+ * This is a list of examples of these functions:
+ * @li @ref ecore_evas_basics_example_c
+ * @li @ref ecore_evas_object_example_c
+ * @li @ref ecore_evas_callbacks_example_c
+ * @li @ref Ecore_Evas_Window_Sizes_Example_c
+ * @li @ref Ecore_Evas_Buffer_Example_01_c
+ * @li @ref Ecore_Evas_Buffer_Example_02_c
+ *
+ * @{
+ */
+
 /* these are dummy and just tell u what API levels ecore_evas supports - not if
  * the actual support is compiled in. you need to query for that separately.
  */
@@ -63,26 +95,39 @@ extern "C" {
 #define HAVE_ECORE_EVAS_X11_16 1
 #define HAVE_ECORE_EVAS_DIRECTFB 1
 #define HAVE_ECORE_EVAS_WIN32 1
+#define HAVE_ECORE_EVAS_COCOA 1
 #define HAVE_ECORE_EVAS_SDL 1
 #define HAVE_ECORE_EVAS_WINCE 1
+#define HAVE_ECORE_EVAS_EWS 1
+#define HAVE_ECORE_EVAS_PSL1GHT 1
+#define HAVE_ECORE_EVAS_WAYLAND_SHM 1
+#define HAVE_ECORE_EVAS_WAYLAND_EGL 1
 
 typedef enum _Ecore_Evas_Engine_Type
 {
    ECORE_EVAS_ENGINE_SOFTWARE_BUFFER,
-   ECORE_EVAS_ENGINE_SOFTWARE_X11,
+   ECORE_EVAS_ENGINE_SOFTWARE_XLIB,
    ECORE_EVAS_ENGINE_XRENDER_X11,
    ECORE_EVAS_ENGINE_OPENGL_X11,
    ECORE_EVAS_ENGINE_SOFTWARE_XCB,
    ECORE_EVAS_ENGINE_XRENDER_XCB,
+   ECORE_EVAS_ENGINE_SOFTWARE_GDI,
    ECORE_EVAS_ENGINE_SOFTWARE_DDRAW,
    ECORE_EVAS_ENGINE_DIRECT3D,
    ECORE_EVAS_ENGINE_OPENGL_GLEW,
-   ECORE_EVAS_ENGINE_SDL,
+   ECORE_EVAS_ENGINE_OPENGL_COCOA,
+   ECORE_EVAS_ENGINE_SOFTWARE_SDL,
    ECORE_EVAS_ENGINE_DIRECTFB,
    ECORE_EVAS_ENGINE_SOFTWARE_FB,
+   ECORE_EVAS_ENGINE_SOFTWARE_8_X11,
    ECORE_EVAS_ENGINE_SOFTWARE_16_X11,
    ECORE_EVAS_ENGINE_SOFTWARE_16_DDRAW,
    ECORE_EVAS_ENGINE_SOFTWARE_16_WINCE,
+   ECORE_EVAS_ENGINE_OPENGL_SDL,
+   ECORE_EVAS_ENGINE_EWS,
+   ECORE_EVAS_ENGINE_PSL1GHT,
+   ECORE_EVAS_ENGINE_WAYLAND_SHM,
+   ECORE_EVAS_ENGINE_WAYLAND_EGL
 } Ecore_Evas_Engine_Type;
 
 typedef enum _Ecore_Evas_Avoid_Damage_Type
@@ -92,6 +137,14 @@ typedef enum _Ecore_Evas_Avoid_Damage_Type
    ECORE_EVAS_AVOID_DAMAGE_BUILT_IN = 2
 } Ecore_Evas_Avoid_Damage_Type;
 
+typedef enum _Ecore_Evas_Object_Associate_Flags
+{
+  ECORE_EVAS_OBJECT_ASSOCIATE_BASE  = 0,
+  ECORE_EVAS_OBJECT_ASSOCIATE_STACK = 1 << 0,
+  ECORE_EVAS_OBJECT_ASSOCIATE_LAYER = 1 << 1,
+  ECORE_EVAS_OBJECT_ASSOCIATE_DEL = 1 << 2
+} Ecore_Evas_Object_Associate_Flags;
+
 #ifndef _ECORE_X_H
 #define _ECORE_X_WINDOW_PREDEF
 typedef unsigned int Ecore_X_Window;
@@ -103,193 +156,2118 @@ typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window;
 #endif
 
 #ifndef __ECORE_WIN32_H__
-typedef void Ecore_Win32_Window;
+typedef struct _Ecore_Win32_Window Ecore_Win32_Window;
 #endif
 
 #ifndef __ECORE_WINCE_H__
-typedef void Ecore_WinCE_Window;
+typedef struct _Ecore_WinCE_Window Ecore_WinCE_Window;
+#endif
+
+#ifndef __ECORE_COCOA_H__
+typedef struct _Ecore_Cocoa_Window Ecore_Cocoa_Window;
 #endif
 
 #ifndef _ECORE_EVAS_PRIVATE_H
 /* basic data types */
 typedef struct _Ecore_Evas Ecore_Evas;
+typedef void   (*Ecore_Evas_Event_Cb) (Ecore_Evas *ee); /**< Callback used for several ecore evas events @since 1.2 */
+#endif
+
+#ifndef _ECORE_WAYLAND_H_
+#define _ECORE_WAYLAND_WINDOW_PREDEF
+typedef struct _Ecore_Wl_Window Ecore_Wl_Window;
 #endif
 
 /* module setup/shutdown calls */
 
 EAPI int         ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine);
 
+/**
+ * @brief Init the Ecore_Evas system.
+ *
+ * @return How many times the lib has been initialized, 0 indicates failure.
+ *
+ * Set up the Evas wrapper system. Init Evas and Ecore libraries.
+ *
+ * @see ecore_evas_shutdown()
+ */
 EAPI int         ecore_evas_init(void);
+/**
+ * @brief Shut down the Ecore_Evas system.
+ *
+ * @return 0 if ecore evas is fully shut down, or > 0 if it still being used.
+ *
+ * This closes the Evas wrapper system down. Shut down Evas and Ecore libraries.
+ *
+ * @see ecore_evas_init()
+ */
 EAPI int         ecore_evas_shutdown(void);
 
-/* engine/target specific init calls */
-EAPI Ecore_Evas     *ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window  ecore_evas_software_x11_window_get(Ecore_Evas *ee);
-EAPI Ecore_X_Window  ecore_evas_software_x11_subwindow_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, int on);
-EAPI int             ecore_evas_software_x11_direct_resize_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
-
-EAPI Ecore_Evas     *ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window  ecore_evas_gl_x11_window_get(Ecore_Evas *ee);
-EAPI Ecore_X_Window  ecore_evas_gl_x11_subwindow_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, int on);
-EAPI int             ecore_evas_gl_x11_direct_resize_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
-
-EAPI Ecore_Evas     *ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window  ecore_evas_xrender_x11_window_get(Ecore_Evas *ee);
-EAPI Ecore_X_Window  ecore_evas_xrender_x11_subwindow_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, int on);
-EAPI int             ecore_evas_xrender_x11_direct_resize_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
-
-EAPI Ecore_Evas     *ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window  ecore_evas_software_x11_16_window_get(Ecore_Evas *ee);
-EAPI Ecore_X_Window  ecore_evas_software_x11_16_subwindow_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, int on);
-EAPI int             ecore_evas_software_x11_16_direct_resize_get(Ecore_Evas *ee);
-EAPI void            ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
-
-EAPI Ecore_Evas     *ecore_evas_fb_new(char *disp_name, int rotation, int w, int h);
-
-EAPI Ecore_Evas     *ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h);
-EAPI Ecore_DirectFB_Window *ecore_evas_directfb_window_get(Ecore_Evas *ee);
-
-EAPI Ecore_Evas     *ecore_evas_buffer_new(int w, int h);
-EAPI const int      *ecore_evas_buffer_pixels_get(Ecore_Evas *ee);
-
-EAPI Evas_Object    *ecore_evas_object_image_new(Ecore_Evas *ee_target);
-
-EAPI Ecore_Evas     *ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
-                                                   int                 x,
-                                                   int                 y,
-                                                   int                 width,
-                                                   int                 height);
-
-EAPI Ecore_Evas     *ecore_evas_software_ddraw_16_new(Ecore_Win32_Window *parent,
-                                                      int                 x,
-                                                      int                 y,
-                                                      int                 width,
-                                                      int                 height);
-
-EAPI Ecore_Evas     *ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
-                                             int                 x,
-                                             int                 y,
-                                             int                 width,
-                                             int                 height);
-
-EAPI Ecore_Evas *ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
-                                        int                 x,
-                                        int                 y,
-                                        int                 width,
-                                        int                 height);
-
-EAPI Ecore_Win32_Window *ecore_evas_win32_window_get(Ecore_Evas *ee);
-
-EAPI Ecore_Evas     *ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha);
-
-EAPI Ecore_Evas     *ecore_evas_software_wince_new(Ecore_WinCE_Window *parent,
-                                                   int                 x,
-                                                   int                 y,
-                                                   int                 width,
-                                                   int                 height);
-
-EAPI Ecore_Evas     *ecore_evas_software_wince_fb_new(Ecore_WinCE_Window *parent,
-                                                      int                 x,
-                                                      int                 y,
-                                                      int                 width,
-                                                      int                 height);
-
-EAPI Ecore_Evas     *ecore_evas_software_wince_gapi_new(Ecore_WinCE_Window *parent,
-                                                        int                 x,
-                                                        int                 y,
-                                                        int                 width,
-                                                        int                 height);
-
-EAPI Ecore_Evas     *ecore_evas_software_wince_ddraw_new(Ecore_WinCE_Window *parent,
-                                                         int                 x,
-                                                         int                 y,
-                                                         int                 width,
-                                                         int                 height);
+EAPI void        ecore_evas_app_comp_sync_set(Eina_Bool do_sync);
+EAPI Eina_Bool   ecore_evas_app_comp_sync_get(void);
 
-EAPI Ecore_WinCE_Window *ecore_evas_software_wince_window_get(Ecore_Evas *ee);
+/**
+ * @brief Returns a list of supported engines names.
+ *
+ * @return Newly allocated list with engines names. Engines names
+ * strings are internal and should be considered constants, do not
+ * free or modify them, to free the list use ecore_evas_engines_free().
+ */
+EAPI Eina_List  *ecore_evas_engines_get(void);
+/**
+ * @brief Free list returned by ecore_evas_engines_get()
+ *
+ * @param engines list with engines names
+ */
+EAPI void        ecore_evas_engines_free(Eina_List *engines);
+/**
+ * @brief Creates a new Ecore_Evas based on engine name and common parameters.
+ *
+ * @param engine_name engine name as returned by
+ *        ecore_evas_engines_get() or @c NULL to use environment variable
+ *        ECORE_EVAS_ENGINE, that can be undefined and in this case
+ *        this call will try to find the first working engine.
+ * @param x horizontal position of window (not supported in all engines)
+ * @param y vertical position of window (not supported in all engines)
+ * @param w width of window
+ * @param h height of window
+ * @param extra_options string with extra parameter, dependent on engines
+ *        or @ NULL. String is usually in the form: 'key1=value1;key2=value2'.
+ *        Pay attention that when getting that from shell commands, most
+ *        consider ';' as the command terminator, so you need to escape
+ *        it or use quotes.
+ *
+ * @return Ecore_Evas instance or @c NULL if creation failed.
+ */
+EAPI Ecore_Evas *ecore_evas_new(const char *engine_name, int x, int y, int w, int h, const char *extra_options);
+/**
+ * @brief Set whether an Ecore_Evas has an alpha channel or not.
+ *
+ * @param ee The Ecore_Evas to shape
+ * @param alpha @c EINA_TRUE to enable the alpha channel, @c EINA_FALSE to
+ * disable it
+ *
+ * This function allows you to make an Ecore_Evas translucent using an
+ * alpha channel. See ecore_evas_shaped_set() for details. The difference
+ * between a shaped window and a window with an alpha channel is that an
+ * alpha channel supports multiple levels of transparency, as opposed to
+ * the 1 bit transparency of a shaped window (a pixel is either opaque, or
+ * it's transparent).
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_alpha_set(Ecore_Evas *ee, Eina_Bool alpha);
+/**
+ * @brief Query whether an Ecore_Evas has an alpha channel.
+ * @param ee The Ecore_Evas to query.
+ * @return @c EINA_TRUE if ee has an alpha channel, @c EINA_FALSE if it does
+ * not.
+ *
+ * This function returns @c EINA_TRUE if @p ee has an alpha channel, and
+ * @c EINA_FALSE if it does not.
+ *
+ * @see ecore_evas_alpha_set()
+ */
+EAPI Eina_Bool   ecore_evas_alpha_get(const Ecore_Evas *ee);
+/**
+ * @brief Set whether an Ecore_Evas has an transparent window or not.
+ *
+ * @param ee The Ecore_Evas to shape
+ * @param transparent @c EINA_TRUE to enable the transparent window,
+ * @c EINA_FALSE to disable it
+ *
+ * This function sets some translucency options, for more complete support see
+ * ecore_evas_alpha_set().
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_alpha_set()
+ */
+EAPI void        ecore_evas_transparent_set(Ecore_Evas *ee, Eina_Bool transparent);
+/**
+ * @brief  Query whether an Ecore_Evas is transparent.
+ *
+ * @param ee The Ecore_Evas to query.
+ * @return @c EINA_TRUE if ee is transparent, @c EINA_FALSE if it isn't.
+ *
+ * @see ecore_evas_transparent_set()
+ */
+EAPI Eina_Bool   ecore_evas_transparent_get(const Ecore_Evas *ee);
+/**
+ * @brief  Get the geometry of an Ecore_Evas.
+ *
+ * @param ee The Ecore_Evas whose geometry y
+ * @param x A pointer to an int to place the x coordinate in
+ * @param y A pointer to an int to place the y coordinate in
+ * @param w A pointer to an int to place the w size in
+ * @param h A pointer to an int to place the h size in
+ *
+ * This function takes four pointers to (already allocated) ints, and places
+ * the geometry of @p ee in them. If any of the parameters is not desired you
+ * may pass @c NULL on them.
+ *
+ * @code
+ * int x, y, w, h;
+ * ecore_evas_geometry_get(ee, &x, &y, &w, &h);
+ * @endcode
+ *
+ * @see ecore_evas_new()
+ * @see ecore_evas_resize()
+ * @see ecore_evas_move()
+ * @see ecore_evas_move_resize()
+ */
+EAPI void        ecore_evas_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
+/**
+ * @brief  Get the geometry which an Ecore_Evas was latest recently requested.
+ *
+ * @param ee The Ecore_Evas whose geometry y
+ * @param x A pointer to an int to place the x coordinate in
+ * @param y A pointer to an int to place the y coordinate in
+ * @param w A pointer to an int to place the w size in
+ * @param h A pointer to an int to place the h size in
+ *
+ * This function takes four pointers to (already allocated) ints, and places
+ * the geometry which @p ee was latest recently requested . If any of the
+ * parameters is not desired you may pass @c NULL on them.
+ * This function can represent recently requested geometry.
+ * ecore_evas_geometry_get function returns the value is updated after engine
+ * finished request. By comparison, ecore_evas_request_geometry_get returns
+ * recently requested value.
+ *
+ * @code
+ * int x, y, w, h;
+ * ecore_evas_request_geometry_get(ee, &x, &y, &w, &h);
+ * @endcode
+ *
+ * @since 1.1
+ */
+EAPI void        ecore_evas_request_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
+/**
+ * @brief Set the focus of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas
+ * @param on @c EINA_TRUE for focus, @c EINA_FALSE to defocus.
+ *
+ * This function focuses @p ee if @p on is @c EINA_TRUE, or unfocuses @p ee if
+ * @p on is @c EINA_FALSE.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_focus_set(Ecore_Evas *ee, Eina_Bool on);
+/**
+ * @brief Query whether an Ecore_Evas' window is focused or not.
+ *
+ * @param ee The Ecore_Evas to set
+ * @return @c EINA_TRUE if @p ee if focused, @c EINA_FALSE if not.
+ *
+ * @see ecore_evas_focus_set()
+ */
+EAPI Eina_Bool   ecore_evas_focus_get(const Ecore_Evas *ee);
+/**
+ * @brief Iconify or uniconify an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas
+ * @param on @c EINA_TRUE to iconify, @c EINA_FALSE to uniconify.
+ *
+ * This function iconifies @p ee if @p on is @c EINA_TRUE, or uniconifies @p ee
+ * if @p on is @c EINA_FALSE.
+ *
+ * @note Iconify and minimize are synonyms.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_iconified_set(Ecore_Evas *ee, Eina_Bool on);
+/**
+ * @brief Query whether an Ecore_Evas' window is iconified or not.
+ *
+ * @param ee The Ecore_Evas to set
+ * @return @c EINA_TRUE if @p ee is iconified, @c EINA_FALSE if not.
+ *
+ * @note Iconify and minimize are synonyms.
+ *
+ * @see ecore_evas_iconified_set()
+ */
+EAPI Eina_Bool   ecore_evas_iconified_get(const Ecore_Evas *ee);
+/**
+ * @brief Set whether an Ecore_Evas' window is borderless or not.
+ *
+ * @param ee The Ecore_Evas
+ * @param on @c EINA_TRUE for borderless, @c EINA_FALSE for bordered.
+ *
+ * This function makes @p ee borderless if @p on is @c EINA_TRUE, or bordered
+ * if @p on is @c EINA_FALSE.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_borderless_set(Ecore_Evas *ee, Eina_Bool on);
+/**
+ * @brief Query whether an Ecore_Evas' window is borderless or not.
+ *
+ * @param ee The Ecore_Evas to set
+ * @return @c EINA_TRUE if @p ee is borderless, @c EINA_FALSE if not.
+ *
+ * @see ecore_evas_borderless_set()
+ */
+EAPI Eina_Bool   ecore_evas_borderless_get(const Ecore_Evas *ee);
+/**
+ * @brief Set whether or not an Ecore_Evas' window is fullscreen.
+ *
+ * @param ee The Ecore_Evas
+ * @param on @c EINA_TRUE fullscreen, @c EINA_FALSE not.
+ *
+ * This function causes @p ee to be fullscreen if @p on is @c EINA_TRUE, or
+ * not if @p on is @c EINA_FALSE.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_fullscreen_set(Ecore_Evas *ee, Eina_Bool on);
+/**
+ * @brief Query whether an Ecore_Evas' window is fullscreen or not.
+ *
+ * @param ee The Ecore_Evas to set
+ * @return @c EINA_TRUE if @p ee is fullscreen, @c EINA_FALSE if not.
+ *
+ * @see ecore_evas_fullscreen_set()
+ */
+EAPI Eina_Bool   ecore_evas_fullscreen_get(const Ecore_Evas *ee);
+/**
+ * @brief Set another window that this window is a group member of
+ *
+ * @param ee The Ecore_Evas
+ * @param ee_group The other group member
+ *
+ * If @p ee_group is @c NULL, @p ee is removed from the group, otherwise it is
+ * added. Note that if you free the @p ee_group canvas before @p ee, then
+ * getting the group canvas with ecore_evas_window_group_get() will return
+ * an invalid handle.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.2
+ */
+EAPI void        ecore_evas_window_group_set(Ecore_Evas *ee, const Ecore_Evas *ee_group);
+/**
+ * @brief Get the canvas group set.
+ *
+ * This returns the handle set by ecore_evas_window_group_set().
+ *
+ * @param ee The Ecore_Evas to set
+ * @return The Canvas group handle
+ *
+ * @see ecore_evas_window_group_set()
+ * @since 1.2
+ */
+EAPI const Ecore_Evas *ecore_evas_window_group_get(const Ecore_Evas *ee);
+/**
+ * @brief Set the aspect ratio of a canvas window
+ *
+ * @param ee The Ecore_Evas
+ * @param aspect The aspect ratio (width divided by height), or 0 to disable
+ *
+ * This sets the desired aspect ratio of a canvas window
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.2
+ */
+EAPI void        ecore_evas_aspect_set(Ecore_Evas *ee, double aspect);
+/**
+ * @brief Get the aspect ratio of a canvas window
+ *
+ * This returns the value set by ecore_evas_aspect_set().
+ *
+ * @param ee The Ecore_Evas to set
+ * @return The aspect ratio
+ *
+ * @see ecore_evas_aspect_set()
+ * @since 1.2
+ */
+EAPI double      ecore_evas_aspect_get(const Ecore_Evas *ee);
+/**
+ * @brief Set The urgent hint flag
+ *
+ * @param ee The Ecore_Evas
+ * @param urgent The urgent state flag
+ *
+ * This sets the "urgent" state hint on a window so the desktop environment
+ * can highlight it somehow.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.2
+ */
+EAPI void        ecore_evas_urgent_set(Ecore_Evas *ee, Eina_Bool urgent);
+/**
+ * @brief Get the urgent state on the cavas window
+ *
+ * This returns the value set by ecore_evas_urgent_set()
+ *
+ * @param ee The Ecore_Evas to set
+ * @return The urgent state set
+ *
+ * @see ecore_evas_urgent_set()
+ * @since 1.2
+ */
+EAPI Eina_Bool   ecore_evas_urgent_get(const Ecore_Evas *ee);
+/**
+ * @brief Set the modal state flag on the canvas window
+ *
+ * @param ee The Ecore_Evas
+ * @param modal The modal hint flag
+ *
+ * This hints if the window should be modal (eg if it is also transient
+ * for another window, the other window will maybe be denied focus by
+ * the desktop window manager).
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.2
+ */
+EAPI void        ecore_evas_modal_set(Ecore_Evas *ee, Eina_Bool modal);
+/**
+ * @brief Get The modal flag
+ *
+ * This returns the value set by ecore_evas_modal_set().
+ *
+ * @param ee The Ecore_Evas to set
+ * @return The modal flag
+ *
+ * @see ecore_evas_modal_set()
+ * @since 1.2
+ */
+EAPI Eina_Bool   ecore_evas_modal_get(const Ecore_Evas *ee);
+/**
+ * @brief Set the "i demand attention" flag on a canvas window
+ *
+ * @param ee The Ecore_Evas
+ * @param demand The flag state to set
+ *
+ * A window may demand attention now (eg you must enter a password before
+ * continuing), and so it may flag a window with this.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.2
+ */
+EAPI void        ecore_evas_demand_attention_set(Ecore_Evas *ee, Eina_Bool demand);
+/**
+ * @brief Get the "i demand attention" flag
+ *
+ * This returns the value set by ecore_evas_demand_attention_set().
+ *
+ * @param ee The Ecore_Evas to set
+ * @return The "i demand attention" flag.
+ *
+ * @see ecore_evas_demand_attention_set()
+ * @since 1.2
+ */
+EAPI Eina_Bool   ecore_evas_demand_attention_get(const Ecore_Evas *ee);
+/**
+ * @brief Set the "focus skip" flag
+ *
+ * @param ee The Ecore_Evas
+ * @param skip The "focus skip" state to set.
+ *
+ * A window may not want to accept focus, be in the taskbar, pager etc.
+ * sometimes (example for a small notification window that hovers around
+ * a taskbar or panel, or hovers around a window until some activity
+ * dismisses it).
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.2
+ */
+EAPI void        ecore_evas_focus_skip_set(Ecore_Evas *ee, Eina_Bool skip);
+/**
+ * @brief Get the "focus skip" flag
+ *
+ * This returns the value set by ecore_evas_focus_skip_set().
+ *
+ * @param ee The Ecore_Evas to set
+ * @return The "focus skip" flag.
+ *
+ * @see ecore_evas_focus_skip_set()
+ * @since 1.2
+ */
+EAPI Eina_Bool   ecore_evas_focus_skip_get(const Ecore_Evas *ee);
 
-/* generic manipulation calls */
-EAPI Ecore_Evas *ecore_evas_ecore_evas_get(Evas *e);
-EAPI void        ecore_evas_free(Ecore_Evas *ee);
-EAPI void       *ecore_evas_data_get(Ecore_Evas *ee, const char *key);
-EAPI void        ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data);
-EAPI void        ecore_evas_callback_resize_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_move_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_show_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_hide_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_destroy_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_focus_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_focus_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_sticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_unsticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_mouse_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_mouse_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_pre_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI void        ecore_evas_callback_post_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-EAPI Evas       *ecore_evas_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_move(Ecore_Evas *ee, int x, int y);
-EAPI void        ecore_evas_managed_move(Ecore_Evas *ee, int x, int y);
-EAPI void        ecore_evas_resize(Ecore_Evas *ee, int w, int h);
-EAPI void        ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h);
-EAPI void        ecore_evas_geometry_get(Ecore_Evas *ee, int *x, int *y, int *w, int *h);
-EAPI void        ecore_evas_rotation_set(Ecore_Evas *ee, int rot);
-EAPI int         ecore_evas_rotation_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_shaped_set(Ecore_Evas *ee, int shaped);
-EAPI int         ecore_evas_shaped_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_alpha_set(Ecore_Evas *ee, int alpha);
-EAPI int         ecore_evas_alpha_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_show(Ecore_Evas *ee);
-EAPI void        ecore_evas_hide(Ecore_Evas *ee);
-EAPI int         ecore_evas_visibility_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_raise(Ecore_Evas *ee);
-EAPI void        ecore_evas_lower(Ecore_Evas *ee);
-EAPI void        ecore_evas_activate(Ecore_Evas *ee);
-EAPI void        ecore_evas_title_set(Ecore_Evas *ee, const char *t);
-EAPI const char *ecore_evas_title_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
-EAPI void        ecore_evas_name_class_get(Ecore_Evas *ee, const char **n, const char **c);
-EAPI void        ecore_evas_size_min_set(Ecore_Evas *ee, int w, int h);
-EAPI void        ecore_evas_size_min_get(Ecore_Evas *ee, int *w, int *h);
-EAPI void        ecore_evas_size_max_set(Ecore_Evas *ee, int w, int h);
-EAPI void        ecore_evas_size_max_get(Ecore_Evas *ee, int *w, int *h);
-EAPI void        ecore_evas_size_base_set(Ecore_Evas *ee, int w, int h);
-EAPI void        ecore_evas_size_base_get(Ecore_Evas *ee, int *w, int *h);
+/**
+ * @brief Set if this evas should ignore @b all events.
+ *
+ * @param ee The Ecore_Evas whose window's to ignore events.
+ * @param ignore The Ecore_Evas new ignore state.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_ignore_events_set(Ecore_Evas *ee, Eina_Bool ignore);
+/**
+ * @brief Returns the ignore state of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas whose window's ignore events state is returned.
+ * @return The Ecore_Evas window's ignore state.
+ *
+ * @see ecore_evas_ignore_events_set()
+ */
+EAPI Eina_Bool   ecore_evas_ignore_events_get(const Ecore_Evas *ee);
+/**
+ * @brief Query whether an Ecore_Evas' window is visible or not.
+ *
+ * @param ee The Ecore_Evas to query.
+ * @return 1 if visible, 0 if not.
+ *
+ * This function queries @p ee and returns 1 if it is visible, and 0 if not.
+ *
+ * @see ecore_evas_show()
+ * @see ecore_evas_hide()
+ */
+EAPI int         ecore_evas_visibility_get(const Ecore_Evas *ee);
+/**
+ * @brief Set the layer of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas
+ * @param layer The layer to put @p ee on.
+ *
+ * This function moves @p ee to the layer @p layer.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_lower()
+ * @see ecore_evas_raise()
+ */
+EAPI void        ecore_evas_layer_set(Ecore_Evas *ee, int layer);
+/**
+ * @brief Get the layer of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas to set
+ * @return the layer @p ee's window is on.
+ *
+ * @see ecore_evas_layer_set()
+ * @see ecore_evas_lower()
+ * @see ecore_evas_raise()
+ */
+EAPI int         ecore_evas_layer_get(const Ecore_Evas *ee);
+/**
+ * @brief Maximize (or unmaximize) an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas
+ * @param on @c EINA_TRUE to maximize, @c EINA_FALSE to unmaximize.
+ *
+ * This function maximizes @p ee if @p on is @c EINA_TRUE, or unmaximizes @p ee
+ * if @p on is @c EINA_FALSE.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_maximized_set(Ecore_Evas *ee, Eina_Bool on);
+/**
+ * @brief Query whether an Ecore_Evas' window is maximized or not.
+ *
+ * @param ee The Ecore_Evas to set
+ * @return @c EINA_TRUE if @p ee is maximized, @c EINA_FALSE if not.
+ *
+ * @see ecore_evas_maximized_set()
+ */
+EAPI Eina_Bool   ecore_evas_maximized_get(const Ecore_Evas *ee);
+/**
+ * @brief Set Ecore_Evas's window profile list.
+ *
+ * @param ee The Ecore_Evas
+ * @param profiles The profile name list
+ * @param num_profiles The number of profile names
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.7.0
+ */
+EAPI void        ecore_evas_profiles_set(Ecore_Evas *ee, const char **profiles, unsigned int num_profiles);
+/**
+ * @brief Get Ecore_Evas's window profile name.
+ *
+ * @param ee The Ecore_Evas
+ * @return The profile name
+ *
+ * @since 1.7.0
+ */
+EAPI const char *ecore_evas_profile_get(const Ecore_Evas *ee);
+/**
+ * @brief Move an Ecore_Evas.
+ *
+ * @param ee The Ecore_Evas to move
+ * @param x The x coordinate to move to
+ * @param y The y coordinate to move to
+ *
+ * This moves @p ee to the screen coordinates (@p x, @p y)
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_new()
+ * @see ecore_evas_resize()
+ * @see ecore_evas_move_resize()
+ */
+EAPI void        ecore_evas_move(Ecore_Evas *ee, int x, int y);
+/**
+ * @brief Resize an Ecore_Evas.
+ *
+ * @param ee The Ecore_Evas to move
+ * @param w The w coordinate to resize to
+ * @param h The h coordinate to resize to
+ *
+ * This resizes @p ee to @p w x @p h.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_new()
+ * @see ecore_evas_move()
+ * @see ecore_evas_move_resize()
+ */
+EAPI void        ecore_evas_resize(Ecore_Evas *ee, int w, int h);
+/**
+ * @brief Move and resize an Ecore_Evas
+ *
+ * @param ee The Ecore_Evas to move and resize
+ * @param x The x coordinate to move to
+ * @param y The y coordinate to move to
+ * @param w The w coordinate to resize to
+ * @param h The h coordinate to resize to
+ *
+ * This moves @p ee to the screen coordinates (@p x, @p y) and  resizes
+ * it to @p w x @p h.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_new()
+ * @see ecore_evas_move()
+ * @see ecore_evas_resize()
+ */
+EAPI void        ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h);
+/**
+ * @brief Set the rotation of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas
+ * @param rot the angle (in degrees) of rotation.
+ *
+ * The allowed values of @p rot depend on the engine being used. Most only
+ * allow multiples of 90.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_rotation_with_resize_set()
+ */
+EAPI void        ecore_evas_rotation_set(Ecore_Evas *ee, int rot);
+/**
+ * @brief Set the rotation of an Ecore_Evas' window
+ *
+ * @param ee The Ecore_Evas
+ * @param rot the angle (in degrees) of rotation.
+ *
+ * Like ecore_evas_rotation_set(), but it also resizes the window's contents so
+ * that they fit inside the current window geometry.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_rotation_set()
+ */
+EAPI void        ecore_evas_rotation_with_resize_set(Ecore_Evas *ee, int rot);
+/**
+ * @brief Get the rotation of an Ecore_Evas' window
+ *
+ * @param ee The Ecore_Evas
+ * @return the angle (in degrees) of rotation.
+ *
+ * @see ecore_evas_rotation_set()
+ * @see ecore_evas_rotation_with_resize_set()
+ */
+EAPI int         ecore_evas_rotation_get(const Ecore_Evas *ee);
+/**
+ * @brief Raise an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas to raise.
+ *
+ * This functions raises the Ecore_Evas to the front.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_lower()
+ * @see ecore_evas_layer_set()
+ */
+EAPI void        ecore_evas_raise(Ecore_Evas *ee);
+/**
+ * @brief Lower an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas to raise.
+ *
+ * This functions lowers the Ecore_Evas to the back.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ *
+ * @see ecore_evas_raise()
+ * @see ecore_evas_layer_set()
+ */
+EAPI void        ecore_evas_lower(Ecore_Evas *ee);
+/**
+ * @brief Set the title of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas whose title you wish to set.
+ * @param t The title
+ *
+ * This function sets the title of @p ee to @p t.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_title_set(Ecore_Evas *ee, const char *t);
+/**
+ * @brief Get the title of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas whose title you wish to get.
+ * @return The title of @p ee.
+ *
+ * This function returns the title of @p ee.
+ *
+ * @see ecore_evas_title_set()
+ */
+EAPI const char *ecore_evas_title_get(const Ecore_Evas *ee);
+/**
+ * @brief Set the name and class of an Ecore_Evas' window.
+ *
+ * @param ee the Ecore_Evas
+ * @param n the name
+ * @param c the class
+ *
+ * This function sets the name of @p ee to @p n, and its class to @p c. The
+ * meaning of @p name and @p class depends on the underlying windowing system.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI void        ecore_evas_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
+/**
+ * @brief Get the name and class of an Ecore_Evas' window
+ *
+ * This function gets the name of @p ee into @p n, and its class into
+ * @p c.
+ *
+ * @param ee The Ecore_Evas to query.
+ * @param n A pointer to a string to place the name in.
+ * @param c A pointer to a string to place the class in.
+ * @see ecore_evas_name_class_set()
+ */
+EAPI void        ecore_evas_name_class_get(const Ecore_Evas *ee, const char **n, const char **c);
+/**
+ * @brief Returns a pointer to the underlying window.
+ *
+ * @param ee The Ecore_Evas whose window is desired.
+ * @return A pointer to the underlying window.
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ */
+EAPI Ecore_Window ecore_evas_window_get(const Ecore_Evas *ee);
+
+
+/* engine/target specific init calls */
+EAPI Ecore_Evas     *ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window  ecore_evas_software_x11_window_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
+EAPI Eina_Bool       ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
+
+#define ECORE_EVAS_GL_X11_OPT_NONE         0
+#define ECORE_EVAS_GL_X11_OPT_INDIRECT     1
+#define ECORE_EVAS_GL_X11_OPT_VSYNC        2
+#define ECORE_EVAS_GL_X11_OPT_SWAP_MODE    3 
+#define ECORE_EVAS_GL_X11_OPT_LAST         4
+
+#define ECORE_EVAS_GL_X11_SWAP_MODE_AUTO   0
+#define ECORE_EVAS_GL_X11_SWAP_MODE_FULL   1
+#define ECORE_EVAS_GL_X11_SWAP_MODE_COPY   2
+#define ECORE_EVAS_GL_X11_SWAP_MODE_DOUBLE 3
+#define ECORE_EVAS_GL_X11_SWAP_MODE_TRIPLE 4
+   
+EAPI Ecore_Evas     *ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_Evas     *ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h, const int *opt);
+EAPI Ecore_X_Window  ecore_evas_gl_x11_window_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
+EAPI Eina_Bool       ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
+EAPI void            ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e));
+
+EAPI Ecore_Evas     *ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window  ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
+EAPI Eina_Bool       ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
+
+EAPI Ecore_Evas     *ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window  ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee);
+EAPI Ecore_X_Window  ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
+EAPI Eina_Bool       ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
+
+EAPI Ecore_Evas     *ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window  ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
+EAPI Eina_Bool       ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee);
+EAPI void            ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
+
+EAPI Ecore_Evas     *ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h);
+
+EAPI Ecore_Evas     *ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h);
+EAPI Ecore_DirectFB_Window *ecore_evas_directfb_window_get(const Ecore_Evas *ee);
+
+
+EAPI Ecore_Evas     *ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame);
+EAPI Ecore_Evas     *ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame);
+EAPI void            ecore_evas_wayland_resize(Ecore_Evas *ee, int location);
+EAPI void            ecore_evas_wayland_move(Ecore_Evas *ee, int x, int y);
+
+EAPI void            ecore_evas_wayland_pointer_set(Ecore_Evas *ee, int hot_x, int hot_y);
+EAPI void            ecore_evas_wayland_type_set(Ecore_Evas *ee, int type);
+EAPI Ecore_Wl_Window *ecore_evas_wayland_window_get(const Ecore_Evas *ee);
+
+/**
+ * @brief Create a new @c Ecore_Evas canvas bound to the Evas
+ * @b buffer engine
+ *
+ * @param w The width of the canvas, in pixels
+ * @param h The height of the canvas, in pixels
+ * @return A new @c Ecore_Evas instance or @c NULL, on failure
+ *
+ * This creates a new buffer canvas wrapper, with image data array
+ * @b bound to the ARGB format, 8 bits per pixel.
+ *
+ * This function will allocate the needed pixels array with canonical
+ * @c malloc(). If you wish a custom function to allocate it, consider
+ * using ecore_evas_buffer_allocfunc_new(), instead.
+ *
+ * @note This function actually is a wrapper on
+ * ecore_evas_buffer_allocfunc_new(), using the same @a w and @a h
+ * arguments and canonical @c malloc() and @c free() to the memory
+ * allocation and freeing functions. See that function's documentation
+ * for more details.
+ */
+EAPI Ecore_Evas     *ecore_evas_buffer_new(int w, int h);
+
+/**
+ * @brief Create a new @c Ecore_Evas canvas bound to the Evas
+ * @b buffer engine, giving custom allocation and freeing functions for
+ * the canvas memory region
+ *
+ * @param w The width of the canvas, in canvas units
+ * @param h The height of the canvas, in canvas units
+ * @param alloc_func Function to be called to allocate the memory
+ * needed for the new buffer canvas. @a data will be passed the same
+ * value as the @p data of this function, while @a size will be passed
+ * @p w times @p h times @c sizeof(int).
+ * @param free_func Function to be called to free the memory used by
+ * the new buffer canvas. @a data will be passed the same value as the
+ * @p data of this function, while @a pix will be passed the canvas
+ * memory pointer.
+ * @param data Custom data to be passed to the allocation and freeing
+ * functions
+ * @return A new @c Ecore_Evas instance or @c NULL, on failure
+ *
+ * This creates a new buffer canvas wrapper, with image data array
+ * @b bound to the ARGB format, 8 bits per pixel.
+ *
+ * This function is useful when one wants an @c Ecore_Evas buffer
+ * canvas with a custom allocation function, like one getting memory
+ * chunks from a memory pool, for example.
+ *
+ * On any resizing of this @c Ecore_Evas buffer canvas, its image data
+ * will be @b freed, to be allocated again with the new size.
+ *
+ * @note @p w and @p h sizes have to greater or equal to 1. Otherwise,
+ * they'll be interpreted as 1, exactly.
+ *
+ * @see ecore_evas_buffer_new()
+ */
+EAPI Ecore_Evas     *ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data);
+
+/**
+ * @brief Grab a pointer to the actual pixels array of a given
+ * @c Ecore_Evas @b buffer canvas/window.
+ *
+ * @param ee An @c Ecore_Evas handle
+ * @return A pointer to the internal pixels array of @p ee
+ *
+ * Besides returning a pointer to the actual pixel array of the given
+ * canvas, this call will force a <b>rendering update on @p ee</b>,
+ * first.
+ *
+ * A common use case for this call is to create an image object, from
+ * @b another canvas, to have as data @p ee's contents, thus
+ * snapshoting the canvas. For that case, one can also use the
+ * ecore_evas_object_image_new() helper function.
+ */
+EAPI const void     *ecore_evas_buffer_pixels_get(Ecore_Evas *ee);
+
+/**
+ * @brief Create a new @c Ecore_Evas canvas bound to the Evas
+ * @b ews (Ecore + Evas Single Process Windowing System) engine
+ *
+ * EWS is a simple single process windowing system. The backing store
+ * is also an @c Ecore_Evas that can be setup with
+ * ecore_evas_ews_setup() and retrieved with
+ * ecore_evas_ews_ecore_evas_get(). It will allow window management
+ * using events prefixed with @c ECORE_EVAS_EVENT_EWS_.
+ *
+ * The EWS windows (returned by this function or
+ * ecore_evas_new("ews"...)) will all be software buffer windows
+ * automatic rendered to the backing store.
+ *
+ * @param x horizontal position of window, in pixels
+ * @param y vertical position of window, in pixels
+ * @param w The width of the canvas, in pixels
+ * @param h The height of the canvas, in pixels
+ * @return A new @c Ecore_Evas instance or @c NULL, on failure
+ *
+ * @see ecore_evas_ews_setup()
+ * @see ecore_evas_ews_ecore_evas_get()
+ *
+ * @since 1.1
+ */
+EAPI Ecore_Evas     *ecore_evas_ews_new(int x, int y, int w, int h);
+
+
+/**
+ * Returns the backing store image object that represents the given
+ * window in EWS.
+ * @return The evas object of EWS backing store.
+ *
+ * @note This should not be modified anyhow, but may be helpful to
+ *       determine stacking and geometry of it for window managers
+ *       that decorate windows.
+ *
+ * @param ee The Ecore_Evas from which to get the backing store.
+ * @see ecore_evas_ews_manager_set()
+ * @see ecore_evas_ews_evas_get()
+ * @since 1.1
+ */
+EAPI Evas_Object *ecore_evas_ews_backing_store_get(const Ecore_Evas *ee);
+
+/**
+ * Calls the window to be deleted (freed), but can let user decide to
+ * forbid it by using ecore_evas_callback_delete_request_set()
+ *
+ * @param ee The Ecore_Evas for which window will be deleted.
+ * @since 1.1
+ */
+EAPI void ecore_evas_ews_delete_request(Ecore_Evas *ee);
+
+/**
+ * @brief Create an Evas image object with image data <b>bound to an
+ * own, internal @c Ecore_Evas canvas wrapper</b>
+ *
+ * @param ee_target @c Ecore_Evas to have the canvas receiving the new
+ * image object
+ * @return A handle to the new image object
+ *
+ * This will create a @b special Evas image object. The image's pixel
+ * array will get bound to the same image data array of an @b internal
+ * @b buffer @c Ecore_Evas canvas. The user of this function is, then,
+ * supposed to grab that @c Ecore_Evas handle, with
+ * ecore_evas_object_ecore_evas_get(), and use its canvas to render
+ * whichever contents he/she wants, @b independently of the contents
+ * of the canvas owned by @p ee_target. Those contents will reflect on
+ * the canvas of @p ee, though, being exactly the image data of the
+ * object returned by this function.
+ *
+ * This is a helper function for the scenario of one wanting to grab a
+ * buffer canvas' contents (with ecore_evas_buffer_pixels_get()) to be
+ * used on another canvas, for whichever reason. The most common goal
+ * of this setup is to @b save an image file with a whole canvas as
+ * contents, which could not be achieved by using an image file within
+ * the target canvas.
+ *
+ * @warning Always resize the returned image and its underlying
+ * @c Ecore_Evas handle accordingly. They must be kept with same sizes
+ * for things to work as expected. Also, you @b must issue
+ * @c evas_object_image_size_set() on the image with that same size. If
+ * the image is to be shown in a canvas bound to an engine different
+ * than the buffer one, then you must also set this image's @b fill
+ * properties accordingly.
+ *
+ * @note The image returned will always be bound to the
+ * @c EVAS_COLORSPACE_ARGB8888 colorspace, always.
+ *
+ * @note Use ecore_evas_object_evas_get() to grab the image's internal
+ * own canvas directly.
+ *
+ * @note If snapshoting this image's internal canvas, remember to
+ * flush its internal @c Ecore_Evas firstly, with
+ * ecore_evas_manual_render().
+ */
+EAPI Evas_Object    *ecore_evas_object_image_new(Ecore_Evas *ee_target);
+
+/**
+ * @brief Retrieve the internal @c Ecore_Evas handle of an image
+ * object created via ecore_evas_object_image_new()
+ *
+ * @param obj A handle to an image object created via
+ * ecore_evas_object_image_new()
+ * @return The underlying @c Ecore_Evas handle in @p obj
+ */
+EAPI Ecore_Evas     *ecore_evas_object_ecore_evas_get(Evas_Object *obj);
+
+/**
+ * @brief Retrieve the canvas bound to the internal @c Ecore_Evas
+ * handle of an image object created via ecore_evas_object_image_new()
+ *
+ * @param obj A handle to an image object created via
+ * ecore_evas_object_image_new()
+ * @return A handle to @p obj's underlying @c Ecore_Evas's canvas
+ */
+EAPI Evas           *ecore_evas_object_evas_get(Evas_Object *obj);
+
+EAPI Ecore_Evas     *ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
+                                                 int                 x,
+                                                 int                 y,
+                                                 int                 width,
+                                                 int                 height);
+
+EAPI Ecore_Evas     *ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
+                                                   int                 x,
+                                                   int                 y,
+                                                   int                 width,
+                                                   int                 height);
+
+EAPI Ecore_Evas     *ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
+                                                      int                 x,
+                                                      int                 y,
+                                                      int                 width,
+                                                      int                 height);
+
+EAPI Ecore_Evas     *ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
+                                             int                 x,
+                                             int                 y,
+                                             int                 width,
+                                             int                 height);
+
+EAPI Ecore_Evas *ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
+                                        int                 x,
+                                        int                 y,
+                                        int                 width,
+                                        int                 height);
+
+EAPI Ecore_Win32_Window *ecore_evas_win32_window_get(const Ecore_Evas *ee);
+
+EAPI Ecore_Evas     *ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha);
+EAPI Ecore_Evas     *ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha);
+EAPI Ecore_Evas     *ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe);
+
+EAPI Ecore_Evas     *ecore_evas_software_wince_new(Ecore_WinCE_Window *parent,
+                                                   int                 x,
+                                                   int                 y,
+                                                   int                 width,
+                                                   int                 height);
+
+EAPI Ecore_Evas     *ecore_evas_software_wince_fb_new(Ecore_WinCE_Window *parent,
+                                                      int                 x,
+                                                      int                 y,
+                                                      int                 width,
+                                                      int                 height);
+
+EAPI Ecore_Evas     *ecore_evas_software_wince_gapi_new(Ecore_WinCE_Window *parent,
+                                                        int                 x,
+                                                        int                 y,
+                                                        int                 width,
+                                                        int                 height);
+
+EAPI Ecore_Evas     *ecore_evas_software_wince_ddraw_new(Ecore_WinCE_Window *parent,
+                                                         int                 x,
+                                                         int                 y,
+                                                         int                 width,
+                                                         int                 height);
+
+EAPI Ecore_Evas     *ecore_evas_software_wince_gdi_new(Ecore_WinCE_Window *parent,
+                                                       int                 x,
+                                                       int                 y,
+                                                       int                 width,
+                                                       int                 height);
+
+EAPI Ecore_WinCE_Window *ecore_evas_software_wince_window_get(const Ecore_Evas *ee);
+
+EAPI Ecore_Evas *ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent,
+                                     int x,
+                                     int y,
+                                     int w,
+                                     int h);
+
+EAPI Ecore_Evas *ecore_evas_psl1ght_new(const char* name, int w, int h);
+
+
+/* generic manipulation calls */
+/**
+ * @brief Get the engine name used by this Ecore_Evas(window).
+ *
+ * @param ee Ecore_Evas whose engine's name is desired.
+ * @return A string that can(usually) be used in ecore_evas_new()
+ *
+ * @see ecore_evas_free()
+ */
+EAPI const char *ecore_evas_engine_name_get(const Ecore_Evas *ee);
+/**
+ * @brief Return the Ecore_Evas for this Evas
+ *
+ * @param e The Evas to get the Ecore_Evas from
+ * @return The Ecore_Evas that holds this Evas, or @c NULL if not held by one.
+ *
+ * @warning Only use on Evas' created with ecore evas!
+ */
+EAPI Ecore_Evas *ecore_evas_ecore_evas_get(const Evas *e);
+/**
+ * @brief Free an Ecore_Evas
+ *
+ * @param ee The Ecore_Evas to free
+ *
+ * This frees up any memory used by the Ecore_Evas.
+ */
+EAPI void        ecore_evas_free(Ecore_Evas *ee);
+/**
+ * @brief Retrieve user data associated with an Ecore_Evas.
+ *
+ * @param ee The Ecore_Evas to retrieve the user data from.
+ * @param key The key which the user data to be retrieved is associated with.
+ *
+ * This function retrieves user specific data that has been stored within an
+ * Ecore_Evas structure with ecore_evas_data_set().
+ *
+ * @returns @c NULL on error or no data found, A pointer to the user data on
+ *     success.
+ *
+ * @see ecore_evas_data_set()
+ */
+EAPI void       *ecore_evas_data_get(const Ecore_Evas *ee, const char *key);
+/**
+ * @brief Store user data in an Ecore_Evas structure.
+ *
+ * @param ee The Ecore_Evas to store the user data in.
+ * @param key A unique string to associate the user data against. Cannot
+ * be NULL.
+ * @param data A pointer to the user data to store.
+ *
+ * This function associates the @p data with a @p key which is stored by
+ * the Ecore_Evas @p ee. Be aware that a call to ecore_evas_free() will
+ * not free any memory for the associated user data, this is the responsibility
+ * of the caller.
+ *
+ * @see ecore_evas_callback_pre_free_set()
+ * @see ecore_evas_free()
+ * @see ecore_evas_data_get()
+ */
+EAPI void        ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data);
+/**
+ * Set a callback for Ecore_Evas resize events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee is resized.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_resize_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas move events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee is moved.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_move_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas show events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee is shown.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_show_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas hide events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee is hidden.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_hide_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas delete request events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee gets a delete request.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas destroy events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee is destroyed.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_destroy_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas focus in events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee gets focus.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_focus_in_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas focus out events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee loses focus.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_focus_out_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas sticky events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee becomes sticky.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_sticky_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas un-sticky events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee becomes un-sticky.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_unsticky_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas mouse in events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever the mouse enters @p ee.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_mouse_in_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas mouse out events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever the mouse leaves @p ee.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_mouse_out_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas pre render events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called just before the evas in @p ee is rendered.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_pre_render_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas mouse post render events.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called just after the evas in @p ee is rendered.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_post_render_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas pre-free event.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+ *
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called just before the instance @p ee is freed.
+ *
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_pre_free_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+/**
+ * Set a callback for Ecore_Evas state changes.
+ * @param ee The Ecore_Evas to set callbacks on
+ * @param func The function to call
+
+ * A call to this function will set a callback on an Ecore_Evas, causing
+ * @p func to be called whenever @p ee changes state.
+ *
+ * @since 1.2
+ * @warning If and when this function is called depends on the underlying
+ * windowing system.
+ */
+EAPI void        ecore_evas_callback_state_change_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+
+/**
+ * Get an Ecore_Evas's Evas
+ * @param ee The Ecore_Evas whose Evas you wish to get
+ * @return The Evas wrapped by @p ee
+ *
+ * This function returns the Evas contained within @p ee.
+ */
+EAPI Evas       *ecore_evas_get(const Ecore_Evas *ee);
+
+/**
+ * Provide Managed move co-ordinates for an Ecore_Evas
+ * @param ee The Ecore_Evas to move
+ * @param x The x coordinate to set as the managed location
+ * @param y The y coordinate to set as the managed location
+ *
+ * This sets the managed geometry position of the @p ee to (@p x, @p y)
+ */
+EAPI void        ecore_evas_managed_move(Ecore_Evas *ee, int x, int y);
+
+/**
+ * Set whether an Ecore_Evas is shaped or not.
+ *
+ * @param ee The Ecore_Evas to shape.
+ * @param shaped @c EINA_TRUE to shape, @c EINA_FALSE to not.
+ *
+ * This function allows one to make an Ecore_Evas shaped to the contents of the
+ * evas. If @p shaped is @c EINA_TRUE, @p ee will be transparent in parts of
+ * the evas that contain no objects. If @p shaped is @c EINA_FALSE, then @p ee
+ * will be rectangular, and parts with no data will show random framebuffer
+ * artifacting. For non-shaped Ecore_Evases, it is recommended to cover the
+ * entire evas with a background object.
+ */
+EAPI void        ecore_evas_shaped_set(Ecore_Evas *ee, Eina_Bool shaped);
+
+/**
+ * Query whether an Ecore_Evas is shaped or not.
+ *
+ * @param ee The Ecore_Evas to query.
+ * @return @c EINA_TRUE if shaped, @c EINA_FALSE if not.
+ *
+ * This function returns @c EINA_TRUE if @p ee is shaped, and @c EINA_FALSE if not.
+ */
+EAPI Eina_Bool   ecore_evas_shaped_get(const Ecore_Evas *ee);
+/**
+ * @brief Show an Ecore_Evas' window
+ *
+ * @param ee The Ecore_Evas to show.
+ *
+ * This function makes @p ee visible.
+ */
+EAPI void        ecore_evas_show(Ecore_Evas *ee);
+/**
+ * @brief Hide an Ecore_Evas' window
+ *
+ * @param ee The Ecore_Evas to hide.
+ *
+ * This function makes @p ee hidden(not visible).
+ */
+EAPI void        ecore_evas_hide(Ecore_Evas *ee);
+
+/**
+ * Activate (set focus to, via the window manager) an Ecore_Evas' window.
+ * @param ee The Ecore_Evas to activate.
+ *
+ * This functions activates the Ecore_Evas.
+ */
+EAPI void        ecore_evas_activate(Ecore_Evas *ee);
+
+
+/**
+ * Set the minimum size of a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w The minimum width
+ * @param h The minimum height
+ *
+ * This function sets the minimum size of @p ee to be @p w x @p h.
+ * One won't be able to resize that window to dimensions smaller than
+ * the ones set.
+ *
+ * @note When base sizes are set, via ecore_evas_size_base_set(),
+ * they'll be used to calculate a window's minimum size, instead of
+ * those set by this function.
+ *
+ * @see ecore_evas_size_min_get()
+ */
+EAPI void        ecore_evas_size_min_set(Ecore_Evas *ee, int w, int h);
+
+/**
+ * Get the minimum size set for a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w A pointer to an int to place the minimum width in.
+ * @param h A pointer to an int to place the minimum height in.
+ *
+ * @note Use @c NULL pointers on the size components you're not
+ * interested in: they'll be ignored by the function.
+ *
+ * @see ecore_evas_size_min_set() for more details
+ */
+EAPI void        ecore_evas_size_min_get(const Ecore_Evas *ee, int *w, int *h);
+
+/**
+ * Set the maximum size of a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w The maximum width
+ * @param h The maximum height
+ *
+ * This function sets the maximum size of @p ee to be @p w x @p h.
+ * One won't be able to resize that window to dimensions bigger than
+ * the ones set.
+ *
+ * @see ecore_evas_size_max_get()
+ */
+EAPI void        ecore_evas_size_max_set(Ecore_Evas *ee, int w, int h);
+
+/**
+ * Get the maximum size set for a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w A pointer to an int to place the maximum width in.
+ * @param h A pointer to an int to place the maximum height in.
+ *
+ * @note Use @c NULL pointers on the size components you're not
+ * interested in: they'll be ignored by the function.
+ *
+ * @see ecore_evas_size_max_set() for more details
+ */
+EAPI void        ecore_evas_size_max_get(const Ecore_Evas *ee, int *w, int *h);
+
+/**
+ * Set the base size for a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w The base width
+ * @param h The base height
+ *
+ * This function sets the @b base size of @p ee to be @p w x @p h.
+ * When base sizes are set, they'll be used to calculate a window's
+ * @b minimum size, instead of those set by ecore_evas_size_min_get().
+ *
+ * @see ecore_evas_size_base_get()
+ */
+EAPI void        ecore_evas_size_base_set(Ecore_Evas *ee, int w, int h);
+
+/**
+ * Get the base size set for a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w A pointer to an int to place the base width in.
+ * @param h A pointer to an int to place the base height in.
+ *
+ * @note Use @c NULL pointers on the size components you're not
+ * interested in: they'll be ignored by the function.
+ *
+ * @see ecore_evas_size_base_set() for more details
+ */
+EAPI void        ecore_evas_size_base_get(const Ecore_Evas *ee, int *w, int *h);
+
+/**
+ * Set the "size step" for a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w The step width
+ * @param h The step height
+ *
+ * This function sets the size steps of @p ee to be @p w x @p h. This
+ * limits the size of this @c Ecore_Evas window to be @b always an
+ * integer multiple of the step size, for each axis.
+ */
 EAPI void        ecore_evas_size_step_set(Ecore_Evas *ee, int w, int h);
-EAPI void        ecore_evas_size_step_get(Ecore_Evas *ee, int *w, int *h);
+
+/**
+ * Get the "size step" set for a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas window's handle
+ * @param w A pointer to an int to place the step width in.
+ * @param h A pointer to an int to place the step height in.
+ *
+ * @note Use @c NULL pointers on the size components you're not
+ * interested in: they'll be ignored by the function.
+ *
+ * @see ecore_evas_size_base_set() for more details
+ */
+EAPI void        ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h);
+
+/**
+ * @brief Set the cursor of an Ecore_Evas.
+ *
+ * @param ee The Ecore_Evas
+ * @param file  The path to an image file for the cursor.
+ * @param layer The layer in which the cursor will appear.
+ * @param hot_x The x coordinate of the cursor's hot spot.
+ * @param hot_y The y coordinate of the cursor's hot spot.
+ *
+ * This function makes the mouse cursor over @p ee be the image specified by
+ * @p file. The actual point within the image that the mouse is at is specified
+ * by @p hot_x and @p hot_y, which are coordinates with respect to the top left
+ * corner of the cursor image.
+ *
+ * @note This function creates an object from the image and uses
+ * ecore_evas_object_cursor_set().
+ *
+ * @see ecore_evas_object_cursor_set()
+ */
 EAPI void        ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, int hot_y);
+/**
+ * @brief Get information about an Ecore_Evas' cursor
+ *
+ * @param ee The Ecore_Evas to set
+ * @param obj A pointer to an Evas_Object to place the cursor Evas_Object.
+ * @param layer A pointer to an int to place the cursor's layer in.
+ * @param hot_x A pointer to an int to place the cursor's hot_x coordinate in.
+ * @param hot_y A pointer to an int to place the cursor's hot_y coordinate in.
+ *
+ * This function queries information about an Ecore_Evas' cursor.
+ *
+ * @see ecore_evas_cursor_set()
+ * @see ecore_evas_object_cursor_set()
+ */
+EAPI void        ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y);
+/**
+ * @brief Set the cursor of an Ecore_Evas
+ *
+ * @param ee The Ecore_Evas
+ *
+ * @param obj The Evas_Object which will be the cursor.
+ * @param layer The layer in which the cursor will appear.
+ * @param hot_x The x coordinate of the cursor's hot spot.
+ * @param hot_y The y coordinate of the cursor's hot spot.
+ *
+ * This function makes the mouse cursor over @p ee be the object specified by
+ * @p obj. The actual point within the object that the mouse is at is specified
+ * by @p hot_x and @p hot_y, which are coordinates with respect to the top left
+ * corner of the cursor object.
+ *
+ * @see ecore_evas_cursor_set()
+ */
 EAPI void        ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
-EAPI void        ecore_evas_cursor_get(Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y);
-EAPI void        ecore_evas_layer_set(Ecore_Evas *ee, int layer);
-EAPI int         ecore_evas_layer_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_focus_set(Ecore_Evas *ee, int on);
-EAPI int         ecore_evas_focus_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_iconified_set(Ecore_Evas *ee, int on);
-EAPI int         ecore_evas_iconified_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_borderless_set(Ecore_Evas *ee, int on);
-EAPI int         ecore_evas_borderless_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_override_set(Ecore_Evas *ee, int on);
-EAPI int         ecore_evas_override_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_maximized_set(Ecore_Evas *ee, int on);
-EAPI int         ecore_evas_maximized_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_fullscreen_set(Ecore_Evas *ee, int on);
-EAPI int         ecore_evas_fullscreen_get(Ecore_Evas *ee);
+
+/**
+ * Tell the WM whether or not to ignore an Ecore_Evas' window
+ *
+ * @param ee The Ecore_Evas.
+ * @param on @c EINA_TRUE to ignore, @c EINA_FALSE to not.
+ *
+ * This function causes the window manager to ignore @p ee if @p on is
+ * @c EINA_TRUE, or not ignore @p ee if @p on is @c EINA_FALSE.
+ */
+EAPI void        ecore_evas_override_set(Ecore_Evas *ee, Eina_Bool on);
+
+/**
+ * Query whether an Ecore_Evas' window is overridden or not
+ *
+ * @param ee The Ecore_Evas to set.
+ * @return @c EINA_TRUE if @p ee is overridden, @c EINA_FALSE if not.
+ */
+EAPI Eina_Bool   ecore_evas_override_get(const Ecore_Evas *ee);
+
+/**
+ * Set whether or not an Ecore_Evas' window should avoid damage
+ *
+ * @param ee The Ecore_Evas
+ * @param on The type of the damage management
+ *
+ * This option causes updates of the Ecore_Evas to be done on a pixmap, and
+ * then copied to the window, or the pixmap used directly on the window,
+ * depending on the setting. Possible options are:
+ *
+ * @li @ref ECORE_EVAS_AVOID_DAMAGE_NONE - every expose event triggers a new
+ * damage and consequently render of the affected area. The rendering of things
+ * happens directly on the window;
+ *
+ * @li @ref ECORE_EVAS_AVOID_DAMAGE_EXPOSE - there's a pixmap where everything
+ * is rendered into, and then copied to the window. On expose events, there's
+ * no need to render things again, just to copy the exposed region to the
+ * window;
+ *
+ * @li @ref ECORE_EVAS_AVOID_DAMAGE_BUILT_IN - there's the same pixmap as the
+ * previous one, but it is set as a "background pixmap" of the window.  The
+ * rendered things appear directly on the window, with no need to copy
+ * anything, but would stay stored on the pixmap, so there's no need to render
+ * things again on expose events. This option can be faster than the previous
+ * one, but may lead to artifacts during resize of the window.
+ */
 EAPI void        ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on);
-EAPI Ecore_Evas_Avoid_Damage_Type ecore_evas_avoid_damage_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_withdrawn_set(Ecore_Evas *ee, int withdrawn);
-EAPI int         ecore_evas_withdrawn_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_sticky_set(Ecore_Evas *ee, int sticky);
-EAPI int         ecore_evas_sticky_get(Ecore_Evas *ee);
-EAPI void        ecore_evas_ignore_events_set(Ecore_Evas *ee, int ignore);
-EAPI int         ecore_evas_ignore_events_get(Ecore_Evas *ee);
-EAPI void       *ecore_evas_window_get(Ecore_Evas *ee);
+
+/**
+ * Query whether an Ecore_Evas' window avoids damage or not
+ * @param ee The Ecore_Evas to set
+ * @return The type of the damage management
+ *
+ */
+EAPI Ecore_Evas_Avoid_Damage_Type ecore_evas_avoid_damage_get(const Ecore_Evas *ee);
+
+/**
+ * Set the withdrawn state of an Ecore_Evas' window.
+ * @param ee The Ecore_Evas whose window's withdrawn state is set.
+ * @param withdrawn The Ecore_Evas window's new withdrawn state.
+ *
+ */
+EAPI void        ecore_evas_withdrawn_set(Ecore_Evas *ee, Eina_Bool withdrawn);
+
+/**
+ * Returns the withdrawn state of an Ecore_Evas' window.
+ * @param ee The Ecore_Evas whose window's withdrawn state is returned.
+ * @return The Ecore_Evas window's withdrawn state.
+ *
+ */
+EAPI Eina_Bool   ecore_evas_withdrawn_get(const Ecore_Evas *ee);
+
+/**
+ * Set the sticky state of an Ecore_Evas window.
+ *
+ * @param ee The Ecore_Evas whose window's sticky state is set.
+ * @param sticky The Ecore_Evas window's new sticky state.
+ *
+ */
+EAPI void        ecore_evas_sticky_set(Ecore_Evas *ee, Eina_Bool sticky);
+
+/**
+ * Returns the sticky state of an Ecore_Evas' window.
+ *
+ * @param ee The Ecore_Evas whose window's sticky state is returned.
+ * @return The Ecore_Evas window's sticky state.
+ *
+ */
+EAPI Eina_Bool   ecore_evas_sticky_get(const Ecore_Evas *ee);
+EAPI void        ecore_evas_manual_render_set(Ecore_Evas *ee, Eina_Bool manual_render);
+EAPI Eina_Bool   ecore_evas_manual_render_get(const Ecore_Evas *ee);
+
+/**
+ * @brief Registers an @c Ecore_Evas to receive events through ecore_input_evas.
+ *
+ * @param ee The @c Ecore_Evas handle.
+ *
+ * This function calls ecore_event_window_register() with the @p ee as its @c
+ * id argument, @c window argument, and uses its @c Evas too. It is useful when
+ * no @c window information is available on a given @c Ecore_Evas backend.
+ *
+ * @see ecore_evas_input_event_unregister()
+ * @since 1.1
+ */
+EAPI void        ecore_evas_input_event_register(Ecore_Evas *ee);
+/**
+ * @brief Unregisters an @c Ecore_Evas receiving events through ecore_input_evas.
+ *
+ * @param ee The @c Ecore_Evas handle.
+ *
+ * @see ecore_evas_input_event_register()
+ * @since 1.1
+ */
+EAPI void        ecore_evas_input_event_unregister(Ecore_Evas *ee);
+
+/**
+ * @brief Force immediate rendering on a given @c Ecore_Evas window
+ *
+ * @param ee An @c Ecore_Evas handle
+ *
+ * Use this call to forcefully flush the @p ee's canvas rendering
+ * pipeline, thus bring its window to an up to date state.
+ */
+EAPI void        ecore_evas_manual_render(Ecore_Evas *ee);
+EAPI void        ecore_evas_comp_sync_set(Ecore_Evas *ee, Eina_Bool do_sync);
+EAPI Eina_Bool   ecore_evas_comp_sync_get(const Ecore_Evas *ee);
+
+/**
+ * @brief Get geometry of screen associated with this Ecore_Evas.
+ *
+ * @param ee The Ecore_Evas whose window's to query container screen geometry.
+ * @param x where to return the horizontal offset value. May be @c NULL.
+ * @param y where to return the vertical offset value. May be @c NULL.
+ * @param w where to return the width value. May be @c NULL.
+ * @param h where to return the height value. May be @c NULL.
+ *
+ * @since 1.1
+ */
+EAPI void        ecore_evas_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
+
+/**
+ * @brief Get the dpi of the screen the Ecore_Evas is primarily on.
+ *
+ * @param ee The Ecore_Evas whose window's to query.
+ * @param xdpi Pointer to integer to store horizontal DPI. May be @c NULL.
+ * @param ydpi Pointer to integer to store vertical DPI. May be @c NULL.
+ *
+ * @since 1.7
+ */
+EAPI void        ecore_evas_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi);
+
+EAPI void        ecore_evas_draw_frame_set(Ecore_Evas *ee, Eina_Bool draw_frame);
+EAPI Eina_Bool   ecore_evas_draw_frame_get(const Ecore_Evas *ee);
+
+/**
+ * @brief Associate the given object to this ecore evas.
+ *
+ * @param ee The Ecore_Evas to associate to @a obj
+ * @param obj The object to associate to @a ee
+ * @param flags The association flags.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * Association means that operations on one will affect the other, for
+ * example moving the object will move the window, resize the object will
+ * also affect the ecore evas window, hide and show applies as well.
+ *
+ * This is meant to simplify development, since you often need to associate
+ * these events with your "base" objects, background or bottom-most object.
+ *
+ * Be aware that some methods might not be what you would like, deleting
+ * either the window or the object will delete the other. If you want to
+ * change that behavior, let's say to hide window when it's closed, you
+ * must use ecore_evas_callback_delete_request_set() and set your own code,
+ * like ecore_evas_hide(). Just remember that if you override delete_request
+ * and still want to delete the window/object, you must do that yourself.
+ *
+ * Since we now define delete_request, deleting windows will not quit
+ * main loop, if you wish to do so, you should listen for EVAS_CALLBACK_FREE
+ * on the object, that way you get notified and you can call
+ * ecore_main_loop_quit().
+ *
+ * Flags can be OR'ed of:
+ * @li ECORE_EVAS_OBJECT_ASSOCIATE_BASE (or 0): to listen to basic events
+ *     like delete, resize and move, but no stacking or layer are used.
+ * @li ECORE_EVAS_OBJECT_ASSOCIATE_STACK: stacking operations will act
+ *     on the Ecore_Evas, not the object. So evas_object_raise() will
+ *     call ecore_evas_raise(). Relative operations (stack_above, stack_below)
+ *     are still not implemented.
+ * @li ECORE_EVAS_OBJECT_ASSOCIATE_LAYER: stacking operations will act
+ *     on the Ecore_Evas, not the object. So evas_object_layer_set() will
+ *     call ecore_evas_layer_set().
+ * @li ECORE_EVAS_OBJECT_ASSOCIATE_DEL: the object delete will delete the
+ *     ecore_evas as well as delete_requests on the ecore_evas will delete
+ *     etc.
+ */
+EAPI Eina_Bool    ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags);
+/**
+ * @brief Cancel the association set with ecore_evas_object_associate().
+ *
+ * @param ee The Ecore_Evas to dissociate from @a obj
+ * @param obj The object to dissociate from @a ee
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool    ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj);
+/**
+ * @brief Get the object associated with @p ee
+ *
+ * @param ee The Ecore_Evas to get the object from.
+ * @return The associated object, or @c NULL if there is no associated object.
+ */
+EAPI Evas_Object *ecore_evas_object_associate_get(const Ecore_Evas *ee);
+
+/* helper function to be used with ECORE_GETOPT_CALLBACK_*() */
+EAPI unsigned char ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage);
+
+/**
+ * @brief Get a list of all the ecore_evases.
+ *
+ * @return A list of ecore_evases.
+ *
+ * The returned list of ecore evases is only valid until the canvases are
+ * destroyed (and should not be cached for instance). The list can be freed by
+ * just deleting the list.
+ */
+EAPI Eina_List   *ecore_evas_ecore_evas_list_get(void);
+
+/* specific calls to an x11 environment ecore_evas */
+EAPI void           ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win);
+EAPI Ecore_X_Window ecore_evas_x11_leader_get(Ecore_Evas *ee);
+EAPI void           ecore_evas_x11_leader_default_set(Ecore_Evas *ee);
+EAPI void           ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h);
+EAPI void           ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h);
+EAPI void           ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h);
+EAPI void           ecore_evas_x11_shape_input_empty(Ecore_Evas *ee);
+EAPI void           ecore_evas_x11_shape_input_reset(Ecore_Evas *ee);
+EAPI void           ecore_evas_x11_shape_input_apply(Ecore_Evas *ee);
+
+/**
+ * @defgroup Ecore_Evas_Ews Ecore_Evas Single Process Windowing System.
+ *
+ * These are global scope functions to manage the EWS to be used by
+ * ecore_evas_ews_new().
+ *
+ * @since 1.1
+ * @{
+ */
+
+/**
+ * Sets the engine to be used by the backing store engine.
+ *
+ * @param engine The engine to be set.
+ * @param options The options of the engine to be set.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE if ews is already in use.
+ * @since 1.1
+ */
+EAPI Eina_Bool ecore_evas_ews_engine_set(const char *engine, const char *options);
+
+/**
+ * Reconfigure the backing store used.
+ *
+ * @param x The X coordinate to be used.
+ * @param y The Y coordinate to be used.
+ * @param w The width of the Ecore_Evas to setup.
+ * @param h The height of the Ecore_Evas to setup.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ * @since 1.1
+ */
+EAPI Eina_Bool ecore_evas_ews_setup(int x, int y, int w, int h);
+
+/**
+ * Return the internal backing store in use.
+ *
+ * @return The internal backing store in use.
+ * @note this will forced it to be created, making future calls to
+ * ecore_evas_ews_engine_set() void.
+ *
+ * @see ecore_evas_ews_evas_get()
+ * @since 1.1
+ */
+EAPI Ecore_Evas *ecore_evas_ews_ecore_evas_get(void);
+
+/**
+ * Return the internal backing store in use.
+ *
+ * @return The internal backing store in use.
+ * @note this will forced it to be created, making future calls to
+ * ecore_evas_ews_engine_set() void.
+ *
+ * @see ecore_evas_ews_ecore_evas_get()
+ * @since 1.1
+ */
+EAPI Evas *ecore_evas_ews_evas_get(void);
+
+/**
+ * Get the current background.
+ */
+EAPI Evas_Object *ecore_evas_ews_background_get(void);
+
+/**
+ * Set the current background, must be created at evas ecore_evas_ews_evas_get()
+ *
+ * It will be kept at lowest layer (EVAS_LAYER_MIN) and below
+ * everything else. You can set any object, default is a black
+ * rectangle.
+ *
+ * @note previous object will be deleted!
+ * @param o The Evas_Object for which to set the background.
+ */
+EAPI void ecore_evas_ews_background_set(Evas_Object *o);
+
+/**
+ * Return all Ecore_Evas* created by EWS.
+ *
+ * @return An eina list of Ecore_evases.
+ e @note Do not change the returned list or its contents.
+ * @since 1.1
+ */
+EAPI const Eina_List *ecore_evas_ews_children_get(void);
+
+/**
+ * Set the identifier of the manager taking care of internal windows.
+ *
+ * The ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE event is issued. Consider
+ * handling it to know if you should stop handling events yourself
+ * (ie: another manager took over)
+ *
+ * @param manager any unique identifier address.
+ *
+ * @see ecore_evas_ews_manager_get()
+ * @since 1.1
+ */
+EAPI void        ecore_evas_ews_manager_set(const void *manager);
+
+/**
+ * Get the identifier of the manager taking care of internal windows.
+ *
+ * @return the value set by ecore_evas_ews_manager_set()
+ * @since 1.1
+ */
+EAPI const void *ecore_evas_ews_manager_get(void);
+
+EAPI extern int ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE; /**< manager was changed @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_ADD; /**< window was created @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_DEL; /**< window was deleted, pointer is already invalid but may be used as reference for further cleanup work. @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_RESIZE; /**< window was resized @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_MOVE; /**< window was moved @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_SHOW; /**< window become visible @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_HIDE; /**< window become hidden @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_FOCUS; /**< window was focused @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_UNFOCUS; /**< window lost focus @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_RAISE; /**< window was raised @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_LOWER; /**< window was lowered @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_ACTIVATE; /**< window was activated @since 1.1 */
+
+EAPI extern int ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE; /**< window minimized/iconified changed @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE; /**< window maximized changed @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_LAYER_CHANGE; /**< window layer changed @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE; /**< window fullscreen changed @since 1.1 */
+EAPI extern int ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE; /**< some other window property changed (title, name, class, alpha, transparent, shaped...) @since 1.1 */
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup Ecore_Evas_Extn External plug/socket infrastructure to remote canvases
+ *
+ * These functions allow 1 process to create a "socket" was pluged into which another
+ * process can create a "plug" remotely to plug into.
+ * Socket can provides content for several plugs.
+ * This is best for small sized objects (about the size range
+ * of a small icon up to a few large icons). Sine the plug is actually an
+ * image object, you can fetch the pixel data
+ *
+ * @since 1.2
+ * @{
+ */
+
+EAPI extern int ECORE_EVAS_EXTN_CLIENT_ADD; /**< this event is received when a plug has connected to an extn socket @since 1.2 */
+EAPI extern int ECORE_EVAS_EXTN_CLIENT_DEL; /**< this event is received when a plug has disconnected from an extn socket @since 1.2 */
+
+/**
+ * @brief Create a new Ecore_Evas canvas for the new external ecore evas socket
+ *
+ * @param w The width of the canvas, in pixels
+ * @param h The height of the canvas, in pixels
+ * @return A new @c Ecore_Evas instance or @c NULL, on failure
+ *
+ * This creates a new extn_socket canvas wrapper, with image data array
+ * @b bound to the ARGB format, 8 bits per pixel.
+ *
+ * If creation is successful, an Ecore_Evas handle is returned or @c NULL if
+ * creation fails. Also focus, show, hide etc. callbacks will also be called
+ * if the plug object is shown, or already visible on connect, or if it is
+ * hidden later, focused or unfocused.
+ *
+ * This function has to be flowed by ecore_evas_extn_socket_listen(),
+ * for starting ecore ipc service.
+ *
+ * @code
+ * Eina_Bool res = EINA_FALSE;
+ * Ecore_Evas *ee = ecore_evas_extn_socket_new(1, 1);
+ *
+ * res = ecore_evas_extn_socket_listen("svcname", 1, EINA_FALSE);
+ * if (!res) return;
+ * ecore_evas_resize(ee, 240, 400);
+ * @endcode
+ *
+ * or
+ *
+ * @code
+ * Eina_Bool res = EINA_FALSE;
+ * Ecore_Evas *ee = ecore_evas_extn_socket_new(240, 400);
+ *
+ * res = ecore_evas_extn_socket_listen("svcname", 1, EINA_FALSE);
+ * if (!res) return;
+ * @endcode
+ *
+ * When a client(plug) connects, you will get the ECORE_EVAS_EXTN_CLIENT_ADD event
+ * in the ecore event queue, with event_info being the image object pointer
+ * passed as a void pointer. When a client disconnects you will get the
+ * ECORE_EVAS_EXTN_CLIENT_DEL event.
+ *
+ * You can set up event handles for these events as follows:
+ *
+ * @code
+ * static void client_add_cb(void *data, int event, void *event_info)
+ * {
+ *   Evas_Object *obj = event_info;
+ *   printf("client added to image object %p\n", obj);
+ *   evas_object_show(obj);
+ * }
+ *
+ * static void client_del_cb(void *data, int event, void *event_info)
+ * {
+ *   Evas_Object *obj = event_info;
+ *   printf("client deleted from image object %p\n", obj);
+ *   evas_object_hide(obj);
+ * }
+ *
+ * void setup(void)
+ * {
+ *   ecore_event_handler_add(ECORE_EVAS_EXTN_CLIENT_ADD,
+ *                           client_add_cb, NULL);
+ *   ecore_event_handler_add(ECORE_EVAS_EXTN_CLIENT_DEL,
+ *                           client_del_cb, NULL);
+ * }
+ * @endcode
+ *
+ * Note that events come in later after the event happened. You may want to be
+ * careful as data structures you had associated with the image object
+ * may have been freed after deleting, but the object may still be around
+ * awating cleanup and thus still be valid.You can change the size with something like:
+ *
+ * @see ecore_evas_extn_socket_listen()
+ * @see ecore_evas_extn_plug_new()
+ * @see ecore_evas_extn_plug_object_data_lock()
+ * @see ecore_evas_extn_plug_object_data_unlock()
+ *
+ * @since 1.2
+ */
+EAPI Ecore_Evas *ecore_evas_extn_socket_new(int w, int h);
+
+/**
+ * @brief Create a socket to provide the service for external ecore evas
+ * socket.
+ *
+ * @param ee The Ecore_Evas.
+ * @param svcname The name of the service to be advertised. ensure that it is
+ * unique (when combined with @p svcnum) otherwise creation may fail.
+ * @param svcnum A number (any value, @c 0 being the common default) to
+ * differentiate multiple instances of services with the same name.
+ * @param svcsys A boolean that if true, specifies to create a system-wide
+ * service all users can connect to, otherwise the service is private to the
+ * user ide that created the service.
+ * @return @c EINA_TRUE if creation is successful, @c EINA_FALSE if it does
+ * not.
+ *
+ * This creates socket specified by @p svcname, @p svcnum and @p svcsys. If
+ * creation is successful, @c EINA_TRUE is returned or @c EINA_FALSE if
+ * creation fails.
+ *
+ * @see ecore_evas_extn_socket_new()
+ * @see ecore_evas_extn_plug_new()
+ * @see ecore_evas_extn_plug_object_data_lock()
+ * @see ecore_evas_extn_plug_object_data_unlock()
+ *
+ * @since 1.2
+ */
+EAPI Eina_Bool ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys);
+
+/**
+ * @brief Lock the pixel data so the socket cannot change it
+ *
+ * @param obj The image object returned by ecore_evas_extn_plug_new() to lock
+ *
+ * You may need to get the image pixel data with evas_object_image_data_get()
+ * from the image object, but need to ensure that it does not change while
+ * you are using the data. This function lets you set an advisory lock on the
+ * image data so the external plug process will not render to it or alter it.
+ *
+ * You should only hold the lock for just as long as you need to read out the
+ * image data or otherwise deal with it, and then unlock it with
+ * ecore_evas_extn_plug_object_data_unlock(). Keeping a lock over more than
+ * 1 iteration of the main ecore loop will be problematic, so avoid it. Also
+ * forgetting to unlock may cause the socket process to freeze and thus create
+ * odd behavior.
+ *
+ * @see ecore_evas_extn_plug_new()
+ * @see ecore_evas_extn_plug_object_data_unlock()
+ *
+ * @since 1.2
+ */
+EAPI void ecore_evas_extn_plug_object_data_lock(Evas_Object *obj);
+
+/**
+ * @brief Unlock the pixel data so the socket can change it again.
+ *
+ * @param obj The image object returned by ecore_evas_extn_plug_new() to unlock
+ *
+ * This unlocks after an advisor lock has been taken by
+ * ecore_evas_extn_plug_object_data_lock().
+ *
+ * @see ecore_evas_extn_plug_new()
+ * @see ecore_evas_extn_plug_object_data_lock()
+ *
+ * @since 1.2
+ */
+EAPI void ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj);
+
+/**
+ * @brief Create a new external ecore evas plug
+ *
+ * @param ee_target The Ecore_Evas containing the canvas in which the new image object will live.
+ * @return An evas image object that will contain the image output of a socket.
+ *
+ * This creates an image object that will contain the output of another
+ * processes socket canvas when it connects. All input will be sent back to
+ * this process as well, effectively swallowing or placing the socket process
+ * in the canvas of the plug process in place of the image object. The image
+ * object by default is created to be filled (equivalent of
+ * evas_object_image_filled_add() on creation) so image content will scale
+ * to fill the image unless otherwise reconfigured. The Ecore_Evas size
+ * of the plug is the master size and determines size in pixels of the
+ * plug canvas. You can change the size with something like:
+ *
+ * @code
+ * Eina_Bool res = EINA_FALSE;
+ * Evas_Object *obj = ecore_evas_extn_plug_new(ee);
+ *
+ * res = ecore_evas_extn_plug_connect("svcname", 1, EINA_FALSE);
+ * if (!res) return;
+ * ecore_evas_resize(ee, 240, 400);
+ * @endcode
+ *
+ * @see ecore_evas_extn_socket_new()
+ * @see ecore_evas_extn_plug_connect()
+ * @since 1.2
+ */
+EAPI Evas_Object *ecore_evas_extn_plug_new(Ecore_Evas *ee_target);
+
+/**
+ * @brief Connect an external ecore evas plug to service provided by external
+ * ecore evas socket.
+ *
+ * @param obj The Ecore_Evas containing the canvas in which the new image
+ * object will live.
+ * @param svcname The service name to connect to set up by the socket.
+ * @param svcnum The service number to connect to (set up by socket).
+ * @param svcsys Boolean to set if the service is a system one or not (set up
+ * by socket).
+ * @return @c EINA_TRUE if creation is successful, @c EINA_FALSE if it does
+ * not.
+ *
+ * @see ecore_evas_extn_plug_new()
+ *
+ * @since 1.2
+ */
+EAPI Eina_Bool ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
 
 #ifdef __cplusplus
 }
index 0a37748..db77449 100644 (file)
@@ -1,8 +1,8 @@
 MAINTAINERCLEANFILES = Makefile.in
 
 if BUILD_ECORE_X
-ECORE_X_INC = -I$(top_srcdir)/src/lib/ecore_x
-ECORE_X_LIB = $(top_builddir)/src/lib/ecore_x/libecore_x.la
+ECORE_X_INC = -I$(top_srcdir)/src/lib/ecore_x @x_cflags@
+ECORE_X_LIB = $(top_builddir)/src/lib/ecore_x/libecore_x.la @x_libs@
 else
 ECORE_X_INC =
 ECORE_X_LIB =
@@ -35,9 +35,19 @@ endif
 if BUILD_ECORE_SDL
 ECORE_SDL_INC = -I$(top_srcdir)/src/lib/ecore_sdl @SDL_CFLAGS@
 ECORE_SDL_LIB = $(top_builddir)/src/lib/ecore_sdl/libecore_sdl.la
+ECORE_SDL_LIBADD = @SDL_LIBS@ $(ECORE_SDL_LIB)
 else
 ECORE_SDL_INC =
 ECORE_SDL_LIB =
+ECORE_SDL_LIBADD =
+endif
+
+if BUILD_ECORE_COCOA
+ECORE_COCOA_INC = -I$(top_srcdir)/src/lib/ecore_cocoa
+ECORE_COCOA_LIB = $(top_builddir)/src/lib/ecore_cocoa/libecore_cocoa.la
+else
+ECORE_COCOA_INC =
+ECORE_COCOA_LIB =
 endif
 
 if BUILD_ECORE_WINCE
@@ -48,37 +58,84 @@ ECORE_WINCE_INC =
 ECORE_WINCE_LIB =
 endif
 
+if BUILD_ECORE_PSL1GHT
+ECORE_PSL1GHT_INC = -I$(top_srcdir)/src/lib/ecore_psl1ght
+ECORE_PSL1GHT_LIB = $(top_builddir)/src/lib/ecore_psl1ght/libecore_psl1ght.la
+else
+ECORE_PSL1GHT_INC =
+ECORE_PSL1GHT_LIB =
+endif
+
+if BUILD_ECORE_WAYLAND
+ECORE_WAYLAND_INC = -I$(top_srcdir)/src/lib/ecore_wayland @WAYLAND_CFLAGS@
+ECORE_WAYLAND_LIB = $(top_builddir)/src/lib/ecore_wayland/libecore_wayland.la
+ECORE_WAYLAND_LIBADD = @WAYLAND_LIBS@ $(ECORE_WAYLAND_LIB)
+else
+ECORE_WAYLAND_INC =
+ECORE_WAYLAND_LIB =
+ECORE_WAYLAND_LIBADD =
+endif
+
+if BUILD_ECORE_IPC
+ECORE_IPC_INC= \
+-I$(top_srcdir)/src/lib/ecore_ipc \
+-I$(top_builddir)/src/lib/ecore_ipc
+
+ECORE_IPC_LIB=$(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la
+endif
+
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
 -I$(top_srcdir)/src/lib/ecore_evas \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_srcdir)/src/lib/ecore_input_evas \
 -I$(top_builddir)/src/lib/ecore \
 -I$(top_builddir)/src/lib/ecore_evas \
+-I$(top_builddir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore_input_evas \
+@EFL_ECORE_EVAS_BUILD@ \
 $(ECORE_X_INC) \
 $(ECORE_FB_INC) \
 $(ECORE_DIRECTFB_INC) \
 $(ECORE_WIN32_INC) \
 $(ECORE_SDL_INC) \
+$(ECORE_COCOA_INC) \
 $(ECORE_WINCE_INC) \
+$(ECORE_PSL1GHT_INC) \
+$(ECORE_WAYLAND_INC) \
+$(ECORE_IPC_INC) \
 @EVAS_CFLAGS@ \
-@XCB_CFLAGS@
+@EINA_CFLAGS@ \
+@EVIL_CFLAGS@ \
+@WAYLAND_EGL_CFLAGS@
 
 AM_CFLAGS = @WIN32_CFLAGS@
 
-if BUILD_ECORE_EVAS
-
 lib_LTLIBRARIES = libecore_evas.la
-include_HEADERS = \
-Ecore_Evas.h
+includes_HEADERS = Ecore_Evas.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_evas_la_SOURCES = \
 ecore_evas.c \
+ecore_evas_util.c \
 ecore_evas_x.c \
 ecore_evas_fb.c \
 ecore_evas_buffer.c \
 ecore_evas_directfb.c \
 ecore_evas_win32.c \
 ecore_evas_sdl.c \
-ecore_evas_wince.c
+ecore_evas_cocoa.c \
+ecore_evas_wince.c \
+ecore_evas_ews.c \
+ecore_evas_psl1ght.c \
+ecore_evas_wayland_shm.c \
+ecore_evas_wayland_egl.c \
+ecore_evas_extn.c
+
+if BUILD_ECORE_WAYLAND
+libecore_evas_la_SOURCES += \
+ecore_evas_wayland_common.c
+endif
 
 libecore_evas_la_LIBADD = \
 $(ECORE_X_LIB) \
@@ -86,25 +143,23 @@ $(ECORE_FB_LIB) \
 $(ECORE_DIRECTFB_LIB) \
 $(ECORE_WIN32_LIB) \
 $(ECORE_SDL_LIB) \
+$(ECORE_SDL_LIBADD) \
+$(ECORE_COCOA_LIB) \
 $(ECORE_WINCE_LIB) \
+$(ECORE_IPC_LIB) \
+$(ECORE_PSL1GHT_LIB) \
+$(ECORE_WAYLAND_LIB) \
+$(ECORE_WAYLAND_LIBADD) \
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+$(top_builddir)/src/lib/ecore_input_evas/libecore_input_evas.la \
 $(top_builddir)/src/lib/ecore/libecore.la \
 @EVAS_LIBS@ \
-@XCB_LIBS@ \
-@SDL_LIBS@ \
-@EVIL_LIBS@
-
-libecore_evas_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
+@EINA_LIBS@ \
+@EVIL_LIBS@ \
+@EFL_SHM_OPEN_LIBS@ \
+@WAYLAND_EGL_LIBS@
 
-libecore_evas_la_DEPENDENCIES = \
-$(ECORE_X_LIB) \
-$(ECORE_FB_LIB) \
-$(ECORE_DIRECTFB_LIB) \
-$(ECORE_WIN32_LIB) \
-$(ECORE_SDL_LIB) \
-$(ECORE_WINCE_LIB) \
-$(top_builddir)/src/lib/ecore/libecore.la
-
-endif
+libecore_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
 
 EXTRA_DIST = \
 ecore_evas_private.h
index c49b916..541c51b 100644 (file)
@@ -1,19 +1,77 @@
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifndef _MSC_VER
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_MMAN_H
+# include <sys/mman.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
 #include "Ecore.h"
 #include "ecore_private.h"
+#include "Ecore_Input.h"
+
 #include "ecore_evas_private.h"
 #include "Ecore_Evas.h"
 
+Eina_Bool _ecore_evas_app_comp_sync = 1;
+int _ecore_evas_log_dom = -1;
 static int _ecore_evas_init_count = 0;
+static Ecore_Fd_Handler *_ecore_evas_async_events_fd = NULL;
+static Eina_Bool _ecore_evas_async_events_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
+
+static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
+static Ecore_Evas *ecore_evases = NULL;
+static int _ecore_evas_fps_debug = 0;
+
+static Eina_Bool
+_ecore_evas_idle_enter(void *data __UNUSED__)
+{
+   Ecore_Evas *ee;
+   double t1 = 0.0;
+   double t2 = 0.0;
+   int rend = 0;
+
+   if (!ecore_evases) return ECORE_CALLBACK_RENEW;
+   if (_ecore_evas_fps_debug)
+     {
+        t1 = ecore_time_get();
+     }
+   EINA_INLIST_FOREACH(ecore_evases, ee)
+     {
+        if (!ee->manual_render)
+          {
+             if (ee->engine.func->fn_render)
+               rend |= ee->engine.func->fn_render(ee);
+          }
+     }
+   if (_ecore_evas_fps_debug)
+     {
+        t2 = ecore_time_get();
+        if (rend)
+          _ecore_evas_fps_debug_rendertime_add(t2 - t1);
+     }
+   return ECORE_CALLBACK_RENEW;
+}
 
 /**
- * Query if a particular renginering engine target has support
+ * Query if a particular rendering engine target has support
  * @param  engine The engine to check support for
- * @return 1 if the particualr engine is supported, 0 if it is not
+ * @return 1 if the particular engine is supported, 0 if it is not
  *
  * Query if engine @param engine is supported by ecore_evas. 1 is returned if
  * it is, and 0 is returned if it is not supported.
@@ -24,1307 +82,1654 @@ ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine)
    switch (engine)
      {
       case ECORE_EVAS_ENGINE_SOFTWARE_BUFFER:
-#ifdef BUILD_ECORE_EVAS_BUFFER
-       return 1;
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
-      case ECORE_EVAS_ENGINE_SOFTWARE_X11:
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
-       return 1;
+      case ECORE_EVAS_ENGINE_SOFTWARE_XLIB:
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_XLIB
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_XRENDER_X11:
-#ifdef BUILD_ECORE_EVAS_XRENDER_X11
-       return 1;
-#else
-       return 0;
-#endif
+        return EINA_FALSE;
       case ECORE_EVAS_ENGINE_OPENGL_X11:
 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_SOFTWARE_XCB:
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_XRENDER_XCB:
-#ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-       return 1;
+        return EINA_FALSE;
+      case ECORE_EVAS_ENGINE_SOFTWARE_GDI:
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_SOFTWARE_DDRAW:
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_DIRECT3D:
 #ifdef BUILD_ECORE_EVAS_DIRECT3D
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_OPENGL_GLEW:
 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
-     case ECORE_EVAS_ENGINE_SDL:
-#ifdef BUILD_ECORE_EVAS_SDL
-        return 1;
+     case ECORE_EVAS_ENGINE_SOFTWARE_SDL:
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
+        return EINA_TRUE;
 #else
-        return 0;
+        return EINA_FALSE;
+#endif
+     case ECORE_EVAS_ENGINE_OPENGL_SDL:
+#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
+        return EINA_TRUE;
+#else
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_DIRECTFB:
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_SOFTWARE_FB:
 #ifdef BUILD_ECORE_EVAS_FB
-       return 1;
+        return EINA_TRUE;
+#else
+        return EINA_FALSE;
+#endif
+
+          case ECORE_EVAS_ENGINE_SOFTWARE_8_X11:
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
 
       case ECORE_EVAS_ENGINE_SOFTWARE_16_X11:
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_SOFTWARE_16_DDRAW:
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
 #endif
       case ECORE_EVAS_ENGINE_SOFTWARE_16_WINCE:
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-       return 1;
+        return EINA_TRUE;
 #else
-       return 0;
+        return EINA_FALSE;
+#endif
+      case ECORE_EVAS_ENGINE_OPENGL_COCOA:
+#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
+        return EINA_TRUE;
+#else
+        return EINA_FALSE;
+#endif
+      case ECORE_EVAS_ENGINE_EWS:
+#ifdef BUILD_ECORE_EVAS_EWS
+        return EINA_TRUE;
+#else
+        return EINA_FALSE;
+#endif
+     case ECORE_EVAS_ENGINE_PSL1GHT:
+#ifdef BUILD_ECORE_EVAS_PSL1GHT
+        return EINA_TRUE;
+#else
+        return EINA_FALSE;
+#endif
+     case ECORE_EVAS_ENGINE_WAYLAND_SHM:
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+        return EINA_TRUE;
+#else
+        return EINA_FALSE;
+#endif
+     case ECORE_EVAS_ENGINE_WAYLAND_EGL:
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+        return EINA_TRUE;
+#else
+        return EINA_FALSE;
 #endif
       default:
-       return 0;
-       break;
+        return EINA_FALSE;
      };
-   return 0;
 }
 
-/**
- * Init the Evas system.
- * @return greater than 0 on success, 0 on failure
- *
- * Set up the Evas wrapper system.
- */
+static void
+_ecore_evas_fork_cb(void *data __UNUSED__)
+{
+   int fd;
+   
+   if (_ecore_evas_async_events_fd)
+     ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
+   fd = evas_async_events_fd_get();
+   if (fd >= 0)
+     _ecore_evas_async_events_fd = 
+     ecore_main_fd_handler_add(fd, ECORE_FD_READ,
+                               _ecore_evas_async_events_fd_handler, NULL,
+                               NULL, NULL);
+}
+
 EAPI int
 ecore_evas_init(void)
 {
-   if (_ecore_evas_init_count == 0)
-     evas_init ();
-   return ++_ecore_evas_init_count;
+   int fd;
+
+   if (++_ecore_evas_init_count != 1)
+     return _ecore_evas_init_count;
+
+   if (!evas_init())
+     return --_ecore_evas_init_count;
+
+   if (!ecore_init())
+     goto shutdown_evas;
+
+   _ecore_evas_log_dom = eina_log_domain_register
+     ("ecore_evas", ECORE_EVAS_DEFAULT_LOG_COLOR);
+   if(_ecore_evas_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for Ecore_Evas.");
+        goto shutdown_ecore;
+     }
+
+   ecore_fork_reset_callback_add(_ecore_evas_fork_cb, NULL);
+   fd = evas_async_events_fd_get();
+   if (fd >= 0)
+     _ecore_evas_async_events_fd = 
+     ecore_main_fd_handler_add(fd, ECORE_FD_READ,
+                               _ecore_evas_async_events_fd_handler, NULL,
+                               NULL, NULL);
+
+   ecore_evas_idle_enterer =
+     ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL);
+   if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
+   if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
+
+#ifdef BUILD_ECORE_EVAS_EWS
+   _ecore_evas_ews_events_init();
+#endif
+
+   _ecore_evas_extn_init();
+
+   if (getenv("ECORE_EVAS_COMP_NOSYNC"))
+      _ecore_evas_app_comp_sync = 0;
+   return _ecore_evas_init_count;
+
+ shutdown_ecore:
+   ecore_shutdown();
+ shutdown_evas:
+   evas_shutdown();
+
+   return --_ecore_evas_init_count;
 }
 
-/**
- * Shut down the Evas system.
- * @return 0 if ecore evas is fully shut down, or > 0 if it still needs to be shut down
- *
- * This closes the Evas system down.
- */
 EAPI int
 ecore_evas_shutdown(void)
 {
-   _ecore_evas_init_count--;
-   if (_ecore_evas_init_count == 0)
-     {
+   if (--_ecore_evas_init_count != 0)
+     return _ecore_evas_init_count;
+
+   while (ecore_evases) _ecore_evas_free(ecore_evases);
+
+   _ecore_evas_extn_shutdown();
+
+   if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
+   ecore_idle_enterer_del(ecore_evas_idle_enterer);
+   ecore_evas_idle_enterer = NULL;
+
 #ifdef BUILD_ECORE_EVAS_X11
-       while (_ecore_evas_x_shutdown());
+   while (_ecore_evas_x_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_WIN32
-       while (_ecore_evas_win32_shutdown());
+   while (_ecore_evas_win32_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_FB
-       while (_ecore_evas_fb_shutdown());
+   while (_ecore_evas_fb_shutdown());
+#endif
+#ifdef BUILD_ECORE_EVAS_EWS
+   while (_ecore_evas_ews_shutdown());
 #endif
-#ifdef BUILD_ECORE_EVAS_BUFFER
-       while (_ecore_evas_buffer_shutdown());
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
+   while (_ecore_evas_buffer_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
-       while (_ecore_evas_directfb_shutdown());
+   while (_ecore_evas_directfb_shutdown());
 #endif
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-       while (_ecore_evas_wince_shutdown());
+   while (_ecore_evas_wince_shutdown());
 #endif
-       evas_shutdown();
-     }
-   if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+
+   if (_ecore_evas_async_events_fd)
+     ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
+   
+   ecore_fork_reset_callback_del(_ecore_evas_fork_cb, NULL);
+
+   eina_log_domain_unregister(_ecore_evas_log_dom);
+   _ecore_evas_log_dom = -1;
+   ecore_shutdown();
+   evas_shutdown();
+
    return _ecore_evas_init_count;
 }
 
-/**
- * Return the Ecore_Evas for this Evas
- *
- * @param e The Evas to get the Ecore_Evas from
- * @return The Ecore_Evas that holds this Evas
- */
+EAPI void
+ecore_evas_app_comp_sync_set(Eina_Bool do_sync)
+{
+   _ecore_evas_app_comp_sync = do_sync;
+}
+
+EAPI Eina_Bool
+ecore_evas_app_comp_sync_get(void)
+{
+   return _ecore_evas_app_comp_sync;
+}
+
+struct ecore_evas_engine {
+   const char *name;
+   Ecore_Evas *(*constructor)(int x, int y, int w, int h, const char *extra_options);
+};
+
+/* inline is just to avoid need to ifdef around it */
+static inline const char *
+_ecore_evas_parse_extra_options_str(const char *extra_options, const char *key, char **value)
+{
+   int len = strlen(key);
+
+   while (extra_options)
+     {
+        const char *p;
+
+        if (strncmp(extra_options, key, len) != 0)
+          {
+             extra_options = strchr(extra_options, ';');
+             if (extra_options)
+               extra_options++;
+             continue;
+          }
+
+        extra_options += len;
+        p = strchr(extra_options, ';');
+        if (p)
+          {
+             len = p - extra_options;
+             *value = malloc(len + 1);
+             memcpy(*value, extra_options, len);
+             (*value)[len] = '\0';
+             extra_options = p + 1;
+          }
+        else
+          {
+             *value = strdup(extra_options);
+             extra_options = NULL;
+          }
+     }
+   return extra_options;
+}
+
+/* inline is just to avoid need to ifdef around it */
+static inline const char *
+_ecore_evas_parse_extra_options_uint(const char *extra_options, const char *key, unsigned int *value)
+{
+   int len = strlen(key);
+
+   while (extra_options)
+     {
+        const char *p;
+
+        if (strncmp(extra_options, key, len) != 0)
+          {
+             extra_options = strchr(extra_options, ';');
+             if (extra_options)
+               extra_options++;
+             continue;
+          }
+
+        extra_options += len;
+        *value = strtol(extra_options, NULL, 0);
+
+        p = strchr(extra_options, ';');
+        if (p)
+          extra_options = p + 1;
+        else
+          extra_options = NULL;
+     }
+   return extra_options;
+}
+
+/* inline is just to avoid need to ifdef around it */
+static inline const char *
+_ecore_evas_parse_extra_options_x(const char *extra_options, char **disp_name, unsigned int *parent)
+{
+   _ecore_evas_parse_extra_options_str(extra_options, "display=", disp_name);
+   _ecore_evas_parse_extra_options_uint(extra_options, "parent=", parent);
+   return extra_options;
+}
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+static Ecore_Evas *
+_ecore_evas_constructor_software_x11(int x, int y, int w, int h, const char *extra_options)
+{
+   unsigned int parent = 0;
+   char *disp_name = NULL;
+   Ecore_Evas *ee;
+
+   _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
+   ee = ecore_evas_software_x11_new(disp_name, parent, x, y, w, h);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
+static Ecore_Evas *
+_ecore_evas_constructor_cocoa(int x, int y, int w, int h, const char *extra_options)
+{
+   char *name = NULL;
+   Ecore_Evas *ee;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
+   ee = ecore_evas_cocoa_new(NULL, x, y, w, h);
+   free(name);
+
+   if (ee) ecore_evas_move(ee, x, y);
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+static Ecore_Evas *
+_ecore_evas_constructor_opengl_x11(int x, int y, int w, int h, const char *extra_options)
+{
+   Ecore_X_Window parent = 0;
+   char *disp_name = NULL;
+   Ecore_Evas *ee;
+
+   _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
+   ee = ecore_evas_gl_x11_new(disp_name, parent, x, y, w, h);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
+static Ecore_Evas *
+_ecore_evas_constructor_software_8_x11(int x, int y, int w, int h, const char *extra_options)
+{
+   Ecore_X_Window parent = 0;
+   char *disp_name = NULL;
+   Ecore_Evas *ee;
+
+   _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
+   ee = ecore_evas_software_x11_8_new(disp_name, parent, x, y, w, h);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
+static Ecore_Evas *
+_ecore_evas_constructor_software_16_x11(int x, int y, int w, int h, const char *extra_options)
+{
+   Ecore_X_Window parent = 0;
+   char *disp_name = NULL;
+   Ecore_Evas *ee;
+
+   _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
+   ee = ecore_evas_software_x11_16_new(disp_name, parent, x, y, w, h);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
+static Ecore_Evas *
+_ecore_evas_constructor_sdl(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
+{
+   Ecore_Evas *ee;
+   unsigned int fullscreen = 0, hwsurface = 0, noframe = 0, alpha = 0;
+   char *name = NULL;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
+   _ecore_evas_parse_extra_options_uint(extra_options, "fullscreen=", &fullscreen);
+   _ecore_evas_parse_extra_options_uint(extra_options, "hwsurface=", &hwsurface);
+   _ecore_evas_parse_extra_options_uint(extra_options, "noframe=", &noframe);
+   _ecore_evas_parse_extra_options_uint(extra_options, "alpha=", &alpha);
+
+   ee = ecore_evas_sdl_new(name, w, h, fullscreen, hwsurface, noframe, alpha);
+   free(name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
+static Ecore_Evas *
+_ecore_evas_constructor_opengl_sdl(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
+{
+   Ecore_Evas *ee;
+   unsigned int fullscreen = 0, noframe = 0;
+   char *name = NULL;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
+   _ecore_evas_parse_extra_options_uint(extra_options, "fullscreen=", &fullscreen);
+   _ecore_evas_parse_extra_options_uint(extra_options, "noframe=", &noframe);
+
+   ee = ecore_evas_gl_sdl_new(name, w, h, fullscreen, noframe);
+   free(name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_DIRECTFB
+static Ecore_Evas *
+_ecore_evas_constructor_directfb(int x, int y, int w, int h, const char *extra_options)
+{
+   Ecore_Evas *ee;
+   char *disp_name = NULL;
+   unsigned int windowed = 1;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
+   _ecore_evas_parse_extra_options_uint(extra_options, "windowed=", &windowed);
+
+   ee = ecore_evas_directfb_new(disp_name, windowed, x, y, w, h);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_FB
+static Ecore_Evas *
+_ecore_evas_constructor_fb(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
+{
+   Ecore_Evas *ee;
+   char *disp_name = NULL;
+   unsigned int rotation = 0;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
+   _ecore_evas_parse_extra_options_uint(extra_options, "rotation=", &rotation);
+
+   ee = ecore_evas_fb_new(disp_name, rotation, w, h);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+
+#ifdef BUILD_ECORE_EVAS_PSL1GHT
+static Ecore_Evas *
+_ecore_evas_constructor_psl1ght(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
+{
+   Ecore_Evas *ee;
+   char *name = NULL;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
+   ee = ecore_evas_psl1ght_new(name, w, h);
+   free(name);
+
+   if (ee) ecore_evas_move(ee, x, y);
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+static Ecore_Evas *
+_ecore_evas_constructor_wayland_shm(int x, int y, int w, int h, const char *extra_options)
+{
+   char *disp_name = NULL;
+   unsigned int frame = 1, parent = 0;
+   Ecore_Evas *ee;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
+   _ecore_evas_parse_extra_options_uint(extra_options, "frame=", &frame);
+   _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent);
+   ee = ecore_evas_wayland_shm_new(disp_name, parent, x, y, w, h, frame);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+static Ecore_Evas *
+_ecore_evas_constructor_wayland_egl(int x, int y, int w, int h, const char *extra_options)
+{
+   char *disp_name = NULL;
+   unsigned int frame = 1, parent = 0;
+   Ecore_Evas *ee;
+
+   _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
+   _ecore_evas_parse_extra_options_uint(extra_options, "frame=", &frame);
+   _ecore_evas_parse_extra_options_uint(extra_options, "parent=", &parent);
+   ee = ecore_evas_wayland_egl_new(disp_name, parent, x, y, w, h, frame);
+   free(disp_name);
+
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+static Ecore_Evas *
+_ecore_evas_constructor_software_gdi(int x, int y, int w, int h, const char *extra_options)
+{
+   return ecore_evas_software_gdi_new(NULL, x, y, w, h);
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
+static Ecore_Evas *
+_ecore_evas_constructor_software_ddraw(int x, int y, int w, int h, const char *extra_options)
+{
+   return ecore_evas_software_ddraw_new(NULL, x, y, w, h);
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_DIRECT3D
+static Ecore_Evas *
+_ecore_evas_constructor_direct3d(int x, int y, int w, int h, const char *extra_options)
+{
+   return ecore_evas_direct3d_new(NULL, x, y, w, h);
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
+static Ecore_Evas *
+_ecore_evas_constructor_opengl_glew(int x, int y, int w, int h, const char *extra_options)
+{
+   return ecore_evas_gl_glew_new(NULL, x, y, w, h);
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
+static Ecore_Evas *
+_ecore_evas_constructor_software_16_ddraw(int x, int y, int w, int h, const char *extra_options)
+{
+   return ecore_evas_software_16_ddraw_new(NULL, x, y, w, h);
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
+static Ecore_Evas *
+_ecore_evas_constructor_software_16_wince(int x, int y, int w, int h, const char *extra_options __UNUSED__)
+{
+   return ecore_evas_software_wince_new(NULL, x, y, w, h);
+}
+
+static Ecore_Evas *
+_ecore_evas_constructor_software_16_wince_fb(int x, int y, int w, int h, const char *extra_options __UNUSED__)
+{
+   return ecore_evas_software_wince_fb_new(NULL, x, y, w, h);
+}
+
+static Ecore_Evas *
+_ecore_evas_constructor_software_16_wince_gapi(int x, int y, int w, int h, const char *extra_options __UNUSED__)
+{
+   return ecore_evas_software_wince_gapi_new(NULL, x, y, w, h);
+}
+
+static Ecore_Evas *
+_ecore_evas_constructor_software_16_wince_gdi(int x, int y, int w, int h, const char *extra_options __UNUSED__)
+{
+   return ecore_evas_software_wince_gdi_new(NULL, x, y, w, h);
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
+static Ecore_Evas *
+_ecore_evas_constructor_buffer(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options __UNUSED__)
+{
+   return ecore_evas_buffer_new(w, h);
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_EWS
+static Ecore_Evas *
+_ecore_evas_constructor_ews(int x, int y, int w, int h, const char *extra_options __UNUSED__)
+{
+   return ecore_evas_ews_new(x, y, w, h);
+}
+#endif
+
+/* note: keep sorted by priority, highest first */
+static const struct ecore_evas_engine _engines[] = {
+  /* unix */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+  {"software_x11", _ecore_evas_constructor_software_x11},
+#endif
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+  {"opengl_x11", _ecore_evas_constructor_opengl_x11},
+#endif
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
+  {"software_8_x11", _ecore_evas_constructor_software_8_x11},
+#endif
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
+  {"software_16_x11", _ecore_evas_constructor_software_16_x11},
+#endif
+#ifdef BUILD_ECORE_EVAS_DIRECTFB
+  {"directfb", _ecore_evas_constructor_directfb},
+#endif
+#ifdef BUILD_ECORE_EVAS_FB
+  {"fb", _ecore_evas_constructor_fb},
+#endif
+
+  /* windows */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+  {"software_gdi", _ecore_evas_constructor_software_gdi},
+#endif
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
+  {"software_ddraw", _ecore_evas_constructor_software_ddraw},
+#endif
+#ifdef BUILD_ECORE_EVAS_DIRECT3D
+  {"direct3d", _ecore_evas_constructor_direct3d},
+#endif
+#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
+  {"opengl_glew", _ecore_evas_constructor_opengl_glew},
+#endif
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
+  {"software_16_ddraw", _ecore_evas_constructor_software_16_ddraw},
+#endif
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
+  {"software_16_wince", _ecore_evas_constructor_software_16_wince},
+  {"software_16_wince_fb", _ecore_evas_constructor_software_16_wince_fb},
+  {"software_16_wince_gapi", _ecore_evas_constructor_software_16_wince_gapi},
+  {"software_16_wince_gdi", _ecore_evas_constructor_software_16_wince_gdi},
+#endif
+
+  /* Apple */
+#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
+  {"opengl_cocoa", _ecore_evas_constructor_cocoa},
+#endif
+
+  /* PS3 support */
+#ifdef BUILD_ECORE_EVAS_PSL1GHT
+  {"psl1ght", _ecore_evas_constructor_psl1ght},
+#endif
+
+   /* Wayland */
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+  {"wayland_shm", _ecore_evas_constructor_wayland_shm},
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+  {"wayland_egl", _ecore_evas_constructor_wayland_egl},
+#endif
+
+   /* Last chance to have a window */
+#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
+  {"opengl_sdl", _ecore_evas_constructor_opengl_sdl},
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
+  {"sdl", _ecore_evas_constructor_sdl},
+#endif
+
+  /* independent */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
+  {"buffer", _ecore_evas_constructor_buffer},
+#endif
+
+#ifdef BUILD_ECORE_EVAS_EWS
+  {"ews", _ecore_evas_constructor_ews},
+#endif
+  {NULL, NULL}
+};
+
+EAPI Eina_List *
+ecore_evas_engines_get(void)
+{
+   const struct ecore_evas_engine *itr;
+   Eina_List *lst = NULL;
+
+   for (itr = _engines; itr->name; itr++)
+     lst = eina_list_append(lst, itr->name);
+
+   return lst;
+}
+
+EAPI void
+ecore_evas_engines_free(Eina_List *engines)
+{
+   eina_list_free(engines);
+}
+
+static Ecore_Evas *
+_ecore_evas_new_auto_discover(int x, int y, int w, int h, const char *extra_options)
+{
+   const struct ecore_evas_engine *itr;
+
+   DBG("auto discover engine");
+
+   for (itr = _engines; itr->constructor; itr++)
+     {
+        Ecore_Evas *ee = itr->constructor(x, y, w, h, extra_options);
+        if (ee)
+          {
+             INF("auto discovered '%s'", itr->name);
+             return ee;
+          }
+     }
+
+   WRN("could not auto discover.");
+   return NULL;
+}
+
 EAPI Ecore_Evas *
-ecore_evas_ecore_evas_get(Evas *e)
+ecore_evas_new(const char *engine_name, int x, int y, int w, int h, const char *extra_options)
 {
-   return evas_data_attach_get(e);
+   const struct ecore_evas_engine *itr;
+
+   if (!engine_name)
+     {
+        engine_name = getenv("ECORE_EVAS_ENGINE");
+        if (engine_name)
+          DBG("no engine_name provided, using ECORE_EVAS_ENGINE='%s'",
+              engine_name);
+     }
+   if (!engine_name)
+     return _ecore_evas_new_auto_discover(x, y, w, h, extra_options);
+
+   for (itr = _engines; itr->name; itr++)
+     if (strcmp(itr->name, engine_name) == 0)
+       {
+          INF("using engine '%s', extra_options=%s",
+              engine_name, extra_options ? extra_options : "(null)");
+          return itr->constructor(x, y, w, h, extra_options);
+       }
+
+   WRN("unknown engine '%s'", engine_name);
+   return NULL;
+}
+
+EAPI const char *
+ecore_evas_engine_name_get(const Ecore_Evas *ee)
+{
+   if (!ee)
+     return NULL;
+   return ee->driver;
+}
+
+EAPI Ecore_Evas *
+ecore_evas_ecore_evas_get(const Evas *e)
+{
+   Ecore_Evas *ee = evas_data_attach_get(e);
+   if (!ee) return NULL;
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, "ecore_evas_ecore_evas_get");
+        return NULL;
+     }
+   return ee;
 }
 
-/**
- * Free an Ecore_Evas
- * @param ee The Ecore_Evas to free
- *
- * This frees up any memory used by the Ecore_Evas.
- */
 EAPI void
 ecore_evas_free(Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_free");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_free");
+        return;
      }
    _ecore_evas_free(ee);
    return;
 }
 
-/**
- * Retrieve user data associated with an Ecore_Evas.
- * @param ee The Ecore_Evas to retrieve the user data from.
- * @param key The key which the user data to be retrieved is associated with.
- *
- * This function retrieves user specific data that has been stored within an
- * Ecore_Evas structure with ecore_evas_data_set().
- *
- * @returns NULL on error or no data found, A pointer to the user data on
- *     success.
- *
- * @see ecore_evas_data_set
- */
 EAPI void *
-ecore_evas_data_get(Ecore_Evas *ee, const char *key)
+ecore_evas_data_get(const Ecore_Evas *ee, const char *key)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_data_get");
+        return NULL;
      }
 
    if (!key) return NULL;
+   if (!ee->data) return NULL;
 
-   return evas_hash_find(ee->data, key);
+   return eina_hash_find(ee->data, key);
 }
 
-/**
- * Store user data in an Ecore_Evas structure.
- *
- * @param eeThe Ecore_Evas to store the user data in.
- * @param keyA unique string to associate the user data against. Cannot
- * be NULL.
- * @param dataA pointer to the user data to store.
- *
- * This function associates the @p data with a @p key which is stored by
- * the Ecore_Evas @p ee. Be aware that a call to ecore_evas_free() will
- * not free any memory for the associated user data, this is the responsibility
- * of the caller.
- *
- * @see ecore_evas_free
- */
 EAPI void
 ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_data_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_data_set");
+        return;
      }
 
    if (!key) return;
 
-   ee->data = evas_hash_del(ee->data, key, NULL);
+   if (ee->data)
+     eina_hash_del(ee->data, key, NULL);
    if (data)
-     ee->data = evas_hash_add(ee->data, key, data);
+     {
+       if (!ee->data)
+         ee->data = eina_hash_string_superfast_new(NULL);
+       eina_hash_add(ee->data, key, data);
+     }
 }
 
 #define IFC(_ee, _fn)  if (_ee->engine.func->_fn) {_ee->engine.func->_fn
 #define IFE            return;}
 
-/**
- * Set a callback for Ecore_Evas resize events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee is resized.
- */
 EAPI void
-ecore_evas_callback_resize_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_resize_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_resize_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_resize_set");
+        return;
      }
    IFC(ee, fn_callback_resize_set) (ee, func);
    IFE;
    ee->func.fn_resize = func;
 }
 
-/**
- * Set a callback for Ecore_Evas move events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee is moved.
- */
 EAPI void
-ecore_evas_callback_move_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_move_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_move_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_move_set");
+        return;
      }
    IFC(ee, fn_callback_move_set) (ee, func);
    IFE;
    ee->func.fn_move = func;
 }
 
-/**
- * Set a callback for Ecore_Evas show events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee is shown.
- */
 EAPI void
-ecore_evas_callback_show_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_show_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_show_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_show_set");
+        return;
      }
    IFC(ee, fn_callback_show_set) (ee, func);
    IFE;
    ee->func.fn_show = func;
 }
 
-/**
- * Set a callback for Ecore_Evas hide events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee is hidden.
- */
 EAPI void
-ecore_evas_callback_hide_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_hide_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_hide_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_hide_set");
+        return;
      }
    IFC(ee, fn_callback_hide_set) (ee, func);
    IFE;
    ee->func.fn_hide = func;
 }
 
-/**
- * Set a callback for Ecore_Evas delete request events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee gets a delete request.
- */
 EAPI void
-ecore_evas_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_delete_request_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_delete_request_set");
+        return;
      }
    IFC(ee, fn_callback_delete_request_set) (ee, func);
    IFE;
    ee->func.fn_delete_request = func;
 }
 
-/**
- * Set a callback for Ecore_Evas destroy events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee is destroyed.
- */
 EAPI void
-ecore_evas_callback_destroy_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_destroy_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_destroy_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_destroy_set");
+        return;
      }
    IFC(ee, fn_callback_destroy_set) (ee, func);
    IFE;
    ee->func.fn_destroy = func;
 }
 
-/**
- * Set a callback for Ecore_Evas focus in events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee gets focus.
- */
 EAPI void
-ecore_evas_callback_focus_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_focus_in_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_focus_in_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_focus_in_set");
+        return;
      }
    IFC(ee, fn_callback_focus_in_set) (ee, func);
    IFE;
    ee->func.fn_focus_in = func;
 }
 
-/**
- * Set a callback for Ecore_Evas focus out events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee loses focus.
- */
 EAPI void
-ecore_evas_callback_focus_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_focus_out_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_focus_out_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_focus_out_set");
+        return;
      }
    IFC(ee, fn_callback_focus_out_set) (ee, func);
    IFE;
    ee->func.fn_focus_out = func;
 }
 
-/**
- * Set a callback for Ecore_Evas sticky events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee becomes sticky.
- */
 EAPI void
-ecore_evas_callback_sticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_sticky_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_sticky_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_sticky_set");
+        return;
      }
    IFC(ee, fn_callback_sticky_set) (ee, func);
    IFE;
    ee->func.fn_sticky = func;
 }
 
-/**
- * Set a callback for Ecore_Evas un-sticky events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever @p ee becomes un-sticky.
- */
 EAPI void
-ecore_evas_callback_unsticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_unsticky_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_unsticky_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_unsticky_set");
+        return;
      }
    IFC(ee, fn_callback_unsticky_set) (ee, func);
    IFE;
    ee->func.fn_unsticky = func;
 }
 
-/**
- * Set a callback for Ecore_Evas mouse in events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever the mouse enters @p ee.
- */
 EAPI void
-ecore_evas_callback_mouse_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_mouse_in_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_mouse_in_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_mouse_in_set");
+        return;
      }
    IFC(ee, fn_callback_mouse_in_set) (ee, func);
    IFE;
    ee->func.fn_mouse_in = func;
 }
 
-/**
- * Set a callback for Ecore_Evas mouse out events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called whenever the mouse leaves @p ee.
- */
 EAPI void
-ecore_evas_callback_mouse_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_mouse_out_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_mouse_out_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_mouse_out_set");
+        return;
      }
    IFC(ee, fn_callback_mouse_out_set) (ee, func);
    IFE;
    ee->func.fn_mouse_out = func;
 }
 
-/**
- * Set a callback for Ecore_Evas mouse pre render events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called just before the evas in @p ee is rendered.
- */
 EAPI void
-ecore_evas_callback_pre_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_pre_render_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_pre_render_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_pre_render_set");
+        return;
      }
    IFC(ee, fn_callback_pre_render_set) (ee, func);
    IFE;
    ee->func.fn_pre_render = func;
 }
 
-/**
- * Set a callback for Ecore_Evas mouse post render events.
- * @param ee The Ecore_Evas to set callbacks on
- * @param func The function to call
-
- * A call to this function will set a callback on an Ecore_Evas, causing
- * @p func to be called just after the evas in @p ee is rendered.
- */
 EAPI void
-ecore_evas_callback_post_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
+ecore_evas_callback_post_render_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_callback_post_render_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_post_render_set");
+        return;
      }
    IFC(ee, fn_callback_post_render_set) (ee, func);
    IFE;
    ee->func.fn_post_render = func;
 }
 
-/**
- * Get an Ecore_Evas's Evas
- * @param ee The Ecore_Evas whose Evas you wish to get
- * @return The Evas wrapped by @p ee
- *
- * This function returns the Evas contained within @p ee.
- */
+EAPI void
+ecore_evas_callback_pre_free_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_pre_free_set");
+        return;
+     }
+   ee->func.fn_pre_free = func;
+}
+
+EAPI void
+ecore_evas_callback_state_change_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_callback_state_change_set");
+        return;
+     }
+   ee->func.fn_state_change = func;
+}
+
 EAPI Evas *
-ecore_evas_get(Ecore_Evas *ee)
+ecore_evas_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_get");
+        return NULL;
      }
    return ee->evas;
 }
 
-/**
- * Move an Ecore_Evas
- * @param ee The Ecore_Evas to move
- * @param x The x coordinate to move to
- * @param y The y coordinate to move to
- *
- * This moves @p ee to the screen coordinates (@p x, @p y)
- */
 EAPI void
 ecore_evas_move(Ecore_Evas *ee, int x, int y)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_move");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_move");
+        return;
      }
+   if (ee->prop.fullscreen) return;
    IFC(ee, fn_move) (ee, x, y);
    IFE;
 }
 
-/**
- * Provide Managed move co-ordinates for an Ecore_Evas
- * @param ee The Ecore_Evas to move
- * @param x The x coordinate to set as the managed location
- * @param y The y coordinate to set as the managed location
- *
- * This sets the managed geometry position of the @p ee to (@p x, @p y)
- */
 EAPI void
 ecore_evas_managed_move(Ecore_Evas *ee, int x, int y)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_move");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_move");
+        return;
      }
    IFC(ee, fn_managed_move) (ee, x, y);
    IFE;
 }
 
-/**
- * Resize an Ecore_Evas
- * @param ee The Ecore_Evas to move
- * @param w The w coordinate to resize to
- * @param h The h coordinate to resize to
- *
- * This resizes @p ee to @p w x @p h
- */
 EAPI void
 ecore_evas_resize(Ecore_Evas *ee, int w, int h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_resize");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_resize");
+        return;
      }
+   if (ee->prop.fullscreen) return;
    if (w < 1) w = 1;
    if (h < 1) h = 1;
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       IFC(ee, fn_resize) (ee, h, w);
-       IFE;
+        IFC(ee, fn_resize) (ee, h, w);
+        IFE;
      }
    else
      {
-       IFC(ee, fn_resize) (ee, w, h);
-       IFE;
+        IFC(ee, fn_resize) (ee, w, h);
+        IFE;
      }
 }
 
-/**
- * Resize an Ecore_Evas
- * @param ee The Ecore_Evas to move
- * @param x The x coordinate to move to
- * @param y The y coordinate to move to
- * @param w The w coordinate to resize to
- * @param h The h coordinate to resize to
- *
- * This moves @p ee to the screen coordinates (@p x, @p y) and  resizes
- * it to @p w x @p h.
- *
- */
 EAPI void
 ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_move_resize");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_move_resize");
+        return;
      }
+   if (ee->prop.fullscreen) return;
    if (w < 1) w = 1;
    if (h < 1) h = 1;
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       IFC(ee, fn_move_resize) (ee, x, y, h, w);
-       IFE;
+        IFC(ee, fn_move_resize) (ee, x, y, h, w);
+        IFE;
      }
    else
      {
-       IFC(ee, fn_move_resize) (ee, x, y, w, h);
-       IFE;
+        IFC(ee, fn_move_resize) (ee, x, y, w, h);
+        IFE;
      }
 }
 
-/**
- * Get the geometry of an Ecore_Evas
- * @param ee The Ecore_Evas whose geometry y
- * @param x A pointer to an int to place the x coordinate in
- * @param y A pointer to an int to place the y coordinate in
- * @param w A pointer to an int to place the w size in
- * @param h A pointer to an int to place the h size in
- *
- * This function takes four pointers to (already allocated) ints, and places
- * the geometry of @p ee in them.
- *
- * @code
- * int x, y, w, h;
- * ecore_evas_geometry_get(ee, &x, &y, &w, &h);
- * @endcode
- *
- */
 EAPI void
-ecore_evas_geometry_get(Ecore_Evas *ee, int *x, int *y, int *w, int *h)
+ecore_evas_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_geometry_get");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_geometry_get");
+        return;
      }
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       if (x) *x = ee->x;
-       if (y) *y = ee->y;
-       if (w) *w = ee->h;
-       if (h) *h = ee->w;
+        if (x) *x = ee->x;
+        if (y) *y = ee->y;
+        if (w) *w = ee->h;
+        if (h) *h = ee->w;
      }
    else
      {
-       if (x) *x = ee->x;
-       if (y) *y = ee->y;
-       if (w) *w = ee->w;
-       if (h) *h = ee->h;
+        if (x) *x = ee->x;
+        if (y) *y = ee->y;
+        if (w) *w = ee->w;
+        if (h) *h = ee->h;
+     }
+}
+
+EAPI void
+ecore_evas_request_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_request_geometry_get");
+        return;
+     }
+   if ((ee->rotation == 90) || (ee->rotation == 270))
+     {
+        if (x) *x = ee->req.x;
+        if (y) *y = ee->req.y;
+        if (w) *w = ee->req.h;
+        if (h) *h = ee->req.w;
+     }
+   else
+     {
+        if (x) *x = ee->req.x;
+        if (y) *y = ee->req.y;
+        if (w) *w = ee->req.w;
+        if (h) *h = ee->req.h;
      }
 }
 
-/**
- * Set the rotation of an Ecore_Evas' window
- *
- * @param ee The Ecore_Evas
- * @param rot the angle (in degrees) of rotation.
- *
- * The allowed values of @p rot depend on the engine being used. Most only
- * allow multiples of 90.
- */
 EAPI void
 ecore_evas_rotation_set(Ecore_Evas *ee, int rot)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_rotation_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_rotation_set");
+        return;
      }
    rot = rot % 360;
    while (rot < 0) rot += 360;
    while (rot >= 360) rot -= 360;
-   IFC(ee, fn_rotation_set) (ee, rot);
+   IFC(ee, fn_rotation_set) (ee, rot, 0);
+   /* make sure everything gets redrawn */
+   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+   evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+   IFE;
+}
+
+EAPI void
+ecore_evas_rotation_with_resize_set(Ecore_Evas *ee, int rot)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_rotation_set");
+        return;
+     }
+   rot = rot % 360;
+   while (rot < 0) rot += 360;
+   while (rot >= 360) rot -= 360;
+   IFC(ee, fn_rotation_set) (ee, rot, 1);
+   /* make sure everything gets redrawn */
+   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+   evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
    IFE;
 }
 
-/**
- * Set the rotation of an Ecore_Evas' window
- *
- * @param ee The Ecore_Evas
- * @return the angle (in degrees) of rotation.
- *
- */
 EAPI int
-ecore_evas_rotation_get(Ecore_Evas *ee)
+ecore_evas_rotation_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_rotation_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_rotation_get");
+        return 0;
      }
    return ee->rotation;
 }
 
-/**
- * Set whether an Ecore_Evas is shaped or not.
- * @param ee The Ecore_Evas to shape
- * @param shaped 1 to shape, 0 to not
- *
- * This function allows one to make an Ecore_Evas shaped to the contents of the
- * evas. If @p shaped is 1, @p ee will be transparent in parts of the evas that
- * contain no objects. If @p shaped is 0, then @p ee will be rectangular, and
- * and parts with no data will show random framebuffer artifacting. For
- * non-shaped Ecore_Evases, it is recommend to cover the entire evas with a
- * background object.
- */
 EAPI void
-ecore_evas_shaped_set(Ecore_Evas *ee, int shaped)
+ecore_evas_shaped_set(Ecore_Evas *ee, Eina_Bool shaped)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_shaped_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_shaped_set");
+        return;
      }
    IFC(ee, fn_shaped_set) (ee, shaped);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas is shaped or not.
- * @param ee The Ecore_Evas to query.
- * @return 1 if shaped, 0 if not.
- *
- * This function returns 1 if @p ee is shaped, and 0 if not.
- */
-EAPI int
-ecore_evas_shaped_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_shaped_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_shaped_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_shaped_get");
+        return EINA_FALSE;
      }
-   return ee->shaped ? 1:0;
+   return ee->shaped ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Set whether an Ecore_Evas has an alpha channel or not.
- * @param ee The Ecore_Evas to shape
- * @param alpha 1 to enable the alpha channel, 0 to disable it
- *
- * This function allows you to make an Ecore_Evas translucent using an
- * alpha channel. See ecore_evas_shaped_set() for details. The difference
- * between a shaped window and a window with an alpha channel is that an
- * alpha channel supports multiple levels of transpararency, as opposed to
- * the 1 bit transparency of a shaped window (a pixel is either opaque, or
- * it's transparent).
- */
 EAPI void
-ecore_evas_alpha_set(Ecore_Evas *ee, int alpha)
+ecore_evas_alpha_set(Ecore_Evas *ee, Eina_Bool alpha)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_alpha_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_alpha_set");
+        return;
      }
    IFC(ee, fn_alpha_set) (ee, alpha);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas has an alpha channel.
- * @param ee The Ecore_Evas to query.
- * @return 1 if ee has an alpha channel, 0 if it does not.
- *
- * This function returns 1 if @p ee has an alpha channel, and 0 if
- * it does not.
- */
-EAPI int
-ecore_evas_alpha_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_alpha_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_alpha_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_alpha_get");
+        return EINA_FALSE;
      }
-   return ee->alpha ? 1:0;
+   return ee->alpha ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_transparent_set(Ecore_Evas *ee, Eina_Bool transparent)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_transparent_set");
+        return;
+     }
+   IFC(ee, fn_transparent_set) (ee, transparent);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_transparent_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_transparent_get");
+        return EINA_FALSE;
+     }
+   return ee->transparent ? EINA_TRUE : 0;
 }
 
-/**
- * Show an Ecore_Evas' window
- * @param ee The Ecore_Evas to show.
- *
- * This function makes @p ee visible.
- */
 EAPI void
 ecore_evas_show(Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_show");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_show");
+        return;
      }
    IFC(ee, fn_show) (ee);
    IFE;
 }
 
-/**
- * Hide an Ecore_Evas' window
- * @param ee The Ecore_Evas to show.
- *
- * This function makes @p ee hidden.
- */
 EAPI void
 ecore_evas_hide(Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_hide");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_hide");
+        return;
      }
    IFC(ee, fn_hide) (ee);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas' window is visible or not.
- * @param ee The Ecore_Evas to query.
- * @return 1 if visible, 0 if not.
- *
- * This function queries @p ee and returns 1 if it is visible, and 0 if not.
- */
-EAPI int
-ecore_evas_visibility_get(Ecore_Evas *ee)
+ EAPI int
+ecore_evas_visibility_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_visibility_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_visibility_get");
+        return 0;
      }
    return ee->visible ? 1:0;
 }
 
-/**
- * Raise and Ecore_Evas' window.
- * @param ee The Ecore_Evas to raise.
- *
- * This functions raises the Ecore_Evas to the front.
- */
 EAPI void
 ecore_evas_raise(Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_raise");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_raise");
+        return;
      }
    IFC(ee, fn_raise) (ee);
    IFE;
 }
 
-/**
- * Lower an Ecore_Evas' window.
- * @param ee The Ecore_Evas to raise.
- *
- * This functions lowers the Ecore_Evas to the back.
- */
 EAPI void
 ecore_evas_lower(Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_lower");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_lower");
+        return;
      }
    IFC(ee, fn_lower) (ee);
    IFE;
 }
 
-/**
- * Activate (set focus to, via the window manager) an Ecore_Evas' window.
- * @param ee The Ecore_Evas to activate.
- *
- * This functions activates the Ecore_Evas.
- */
 EAPI void
 ecore_evas_activate(Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_activate");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_activate");
+        return;
      }
    IFC(ee, fn_activate) (ee);
    IFE;
 }
 
-/**
- * Set the title of an Ecore_Evas' window
- * @param ee The Ecore_Evas whose title you wish to set.
- * @param t The title
- *
- * This function sets the title of @p ee to @p t.
- */
 EAPI void
 ecore_evas_title_set(Ecore_Evas *ee, const char *t)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_title_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_title_set");
+        return;
      }
    IFC(ee, fn_title_set) (ee, t);
    IFE;
 }
 
-/**
- * Get the title of an Ecore_Evas' window
- * @param ee The Ecore_Evas whose title you wish to get.
- * @return The title of @p ee.
- *
- * This function returns the title of @p ee.
- */
 EAPI const char *
-ecore_evas_title_get(Ecore_Evas *ee)
+ecore_evas_title_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_title_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_title_get");
+        return NULL;
      }
    return ee->prop.title;
 }
 
-/**
- * Set the name and class of an Ecore_Evas' window
- * @param ee the Ecore_Evas
- * @param n the name
- * @param c the class
- *
- * This function sets the name of @p ee to @p n, and its class to @p c.
- */
 EAPI void
 ecore_evas_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_name_class_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_name_class_set");
+        return;
      }
    IFC(ee, fn_name_class_set) (ee, n, c);
    IFE;
 }
 
-/**
- * Get the name and class of an Ecore_Evas' window
- * @p ee The Ecore_Evas to query
- * @p n A pointer to a string to place the name in.
- * @p c A pointer to a string to place the class in.
- *
- * This function gets puts the name of @p ee into @p n, and its class into
- * @p c.
- */
 EAPI void
-ecore_evas_name_class_get(Ecore_Evas *ee, const char **n, const char **c)
+ecore_evas_name_class_get(const Ecore_Evas *ee, const char **n, const char **c)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_name_class_get");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_name_class_get");
+        return;
      }
    if (n) *n = ee->prop.name;
    if (c) *c = ee->prop.clas;
 }
 
-/**
- * Set the min size of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @param w The minimum width
- * @param h The minimum height
- *
- * This function sets the minimum size of @p ee to @p w x @p h.
- */
 EAPI void
 ecore_evas_size_min_set(Ecore_Evas *ee, int w, int h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_min_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_min_set");
+        return;
      }
    if (w < 0) w = 0;
    if (h < 0) h = 0;
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       IFC(ee, fn_size_min_set) (ee, h, w);
-       IFE;
+        IFC(ee, fn_size_min_set) (ee, h, w);
+        IFE;
      }
    else
      {
-       IFC(ee, fn_size_min_set) (ee, w, h);
-       IFE;
+        IFC(ee, fn_size_min_set) (ee, w, h);
+        IFE;
      }
 }
 
-/**
- * Get the min size of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @param w A pointer to an int to place the min width in.
- * @param h A pointer to an int to place the min height in.
- *
- * This function puts the minimum size of @p ee into @p w and @p h.
- */
 EAPI void
-ecore_evas_size_min_get(Ecore_Evas *ee, int *w, int *h)
+ecore_evas_size_min_get(const Ecore_Evas *ee, int *w, int *h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_min_get");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_min_get");
+        return;
      }
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       if (w) *w = ee->prop.min.h;
-       if (h) *h = ee->prop.min.w;
+        if (w) *w = ee->prop.min.h;
+        if (h) *h = ee->prop.min.w;
      }
    else
      {
-       if (w) *w = ee->prop.min.w;
-       if (h) *h = ee->prop.min.h;
+        if (w) *w = ee->prop.min.w;
+        if (h) *h = ee->prop.min.h;
      }
 }
 
-/**
- * Set the max size of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @param w The maximum width
- * @param h The maximum height
- *
- * This function sets the maximum size of @p ee to @p w x @p h.
- */
 EAPI void
 ecore_evas_size_max_set(Ecore_Evas *ee, int w, int h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_max_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_max_set");
+        return;
      }
    if (w < 0) w = 0;
    if (h < 0) h = 0;
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       IFC(ee, fn_size_max_set) (ee, h, w);
-       IFE;
+        IFC(ee, fn_size_max_set) (ee, h, w);
+        IFE;
      }
    else
      {
-       IFC(ee, fn_size_max_set) (ee, w, h);
-       IFE;
+        IFC(ee, fn_size_max_set) (ee, w, h);
+        IFE;
      }
 }
 
-/**
- * Get the max size of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @param w A pointer to an int to place the max width in.
- * @param h A pointer to an int to place the max height in.
- *
- * This function puts the maximum size of @p ee into @p w and @p h.
- */
 EAPI void
-ecore_evas_size_max_get(Ecore_Evas *ee, int *w, int *h)
+ecore_evas_size_max_get(const Ecore_Evas *ee, int *w, int *h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_max_get");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_max_get");
+        return;
      }
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       if (w) *w = ee->prop.max.h;
-       if (h) *h = ee->prop.max.w;
+        if (w) *w = ee->prop.max.h;
+        if (h) *h = ee->prop.max.w;
      }
    else
      {
-       if (w) *w = ee->prop.max.w;
-       if (h) *h = ee->prop.max.h;
+        if (w) *w = ee->prop.max.w;
+        if (h) *h = ee->prop.max.h;
      }
 }
 
-/**
- * Set the base size of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @param w The base width
- * @param h The base height
- *
- * This function sets the base size of @p ee to @p w x @p h.
- */
 EAPI void
 ecore_evas_size_base_set(Ecore_Evas *ee, int w, int h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_base_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_base_set");
+        return;
      }
    if (w < 0) w = 0;
    if (h < 0) h = 0;
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       IFC(ee, fn_size_base_set) (ee, h, w);
-       IFE;
+        IFC(ee, fn_size_base_set) (ee, h, w);
+        IFE;
      }
    else
      {
-       IFC(ee, fn_size_base_set) (ee, w, h);
-       IFE;
+        IFC(ee, fn_size_base_set) (ee, w, h);
+        IFE;
      }
 }
 
-/**
- * Get the base size of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @param w A pointer to an int to place the base width in.
- * @param h A pointer to an int to place the base height in.
- *
- * This function puts the base size of @p ee into @p w and @p h.
- */
 EAPI void
-ecore_evas_size_base_get(Ecore_Evas *ee, int *w, int *h)
+ecore_evas_size_base_get(const Ecore_Evas *ee, int *w, int *h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_base_get");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_base_get");
+        return;
      }
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       if (w) *w = ee->prop.base.h;
-       if (h) *h = ee->prop.base.w;
+        if (w) *w = ee->prop.base.h;
+        if (h) *h = ee->prop.base.w;
      }
    else
      {
-       if (w) *w = ee->prop.base.w;
-       if (h) *h = ee->prop.base.h;
+        if (w) *w = ee->prop.base.w;
+        if (h) *h = ee->prop.base.h;
      }
 }
 
-/**
- * Set the step size of an Ecore_Evas
- * @param ee The Ecore_Evas to set
- * @param w The step width
- * @param h The step height
- *
- * This function sets the step size of @p ee to @p w x @p h. This limits the
- * size of an Ecore_Evas to always being an integer multiple of the step size.
- */
 EAPI void
 ecore_evas_size_step_set(Ecore_Evas *ee, int w, int h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_step_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_step_set");
+        return;
      }
    if (w < 0) w = 0;
    if (h < 0) h = 0;
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       IFC(ee, fn_size_step_set) (ee, h, w);
-       IFE;
+        IFC(ee, fn_size_step_set) (ee, h, w);
+        IFE;
      }
    else
      {
-       IFC(ee, fn_size_step_set) (ee, w, h);
-       IFE;
+        IFC(ee, fn_size_step_set) (ee, w, h);
+        IFE;
      }
 }
 
-/**
- * Get the step size of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @param w A pointer to an int to place the step width in.
- * @param h A pointer to an int to place the step height in.
- *
- * This function puts the step size of @p ee into @p w and @p h.
- */
 EAPI void
-ecore_evas_size_step_get(Ecore_Evas *ee, int *w, int *h)
+ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_size_step_get");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_size_step_get");
+        return;
      }
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       if (w) *w = ee->prop.step.h;
-       if (h) *h = ee->prop.step.w;
+        if (w) *w = ee->prop.step.h;
+        if (h) *h = ee->prop.step.w;
      }
    else
      {
-       if (w) *w = ee->prop.step.w;
-       if (h) *h = ee->prop.step.h;
+        if (w) *w = ee->prop.step.w;
+        if (h) *h = ee->prop.step.h;
      }
 }
 
-/**
- * Set the cursor of an Ecore_Evas
- * @param ee The Ecore_Evas
- * @param file  The path to an image file for the cursor
- * @param layer
- * @param hot_x The x coordinate of the cursor's hot spot
- * @param hot_y The y coordinate of the cursor's hot spot
- *
- * This function makes the mouse cursor over @p ee be the image specified by
- * @p file. The actual point within the image that the mouse is at is specified
- * by @p hot_x and @p hot_y, which are coordinates with respect to the top left
- * corner of the cursor image.
- */
 EAPI void
 ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, int hot_y)
 {
@@ -1332,9 +1737,9 @@ ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, in
 
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_cursor_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_cursor_set");
+        return;
      }
 
    if (file)
@@ -1352,50 +1757,27 @@ ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, in
    IFE;
 }
 
-/**
- * Set the cursor of an Ecore_Evas
- * @param ee The Ecore_Evas
- * @param obj The Evas_Object for the cursor
- * @param layer
- * @param hot_x The x coordinate of the cursor's hot spot
- * @param hot_y The y coordinate of the cursor's hot spot
- * 
- * This function makes the mouse cursor over @p ee be the image specified by
- * @p file. The actual point within the image that the mouse is at is specified
- * by @p hot_x and @p hot_y, which are coordinates with respect to the top left
- * corner of the cursor image.
- */
 EAPI void
 ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_cursor_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_cursor_set");
+        return;
      }
    IFC(ee, fn_object_cursor_set) (ee, obj, layer, hot_x, hot_y);
    IFE;
 }
 
-/**
- * Get information about an Ecore_Evas' cursor
- * @param ee The Ecore_Evas to set
- * @param obj A pointer to an Evas_Object to place the cursor Evas_Object.
- * @param layer A pointer to an int to place the cursor's layer in..
- * @param hot_x A pointer to an int to place the cursor's hot_x coordinate in.
- * @param hot_y A pointer to an int to place the cursor's hot_y coordinate in.
- *
- * This function queries information about an Ecore_Evas' cursor.
- */
 EAPI void
-ecore_evas_cursor_get(Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y)
+ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_cursor_get");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_cursor_get");
+        return;
      }
    if (obj) *obj = ee->prop.cursor.object;
    if (layer) *layer = ee->prop.cursor.layer;
@@ -1403,447 +1785,593 @@ ecore_evas_cursor_get(Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x,
    if (hot_y) *hot_y = ee->prop.cursor.hot.y;
 }
 
-/**
- * Set the layer of an Ecore_Evas' window
- * @param ee The Ecore_Evas
- * @param layer The layer to put @p ee on.
- *
- * This function moves @p ee to the layer @p layer.
- */
 EAPI void
 ecore_evas_layer_set(Ecore_Evas *ee, int layer)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_layer_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_layer_set");
+        return;
      }
    IFC(ee, fn_layer_set) (ee, layer);
    IFE;
 }
 
-/**
- * Get the layer of an Ecore_Evas' window
- * @param ee The Ecore_Evas to set
- * @return the layer @p ee's window is on.
- *
- */
 EAPI int
-ecore_evas_layer_get(Ecore_Evas *ee)
+ecore_evas_layer_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_layer_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_layer_get");
+        return 0;
      }
    return ee->prop.layer;
 }
 
-/**
- * Set the focus of an Ecore_Evas' window
- * @param ee The Ecore_Evas
- * @param on 1 for focus, 0 to defocus.
- *
- * This function focuses @p ee if @p on is 1, or defocuses @p ee if @p on is 0.
- */
 EAPI void
-ecore_evas_focus_set(Ecore_Evas *ee, int on)
+ecore_evas_focus_set(Ecore_Evas *ee, Eina_Bool on)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_focus_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_focus_set");
+        return;
      }
    IFC(ee, fn_focus_set) (ee, on);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas' window is focused or not
- * @param ee The Ecore_Evas to set
- * @return 1 if @p ee if focused, 0 if not.
- *
- */
-EAPI int
-ecore_evas_focus_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_focus_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_focus_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.focused ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_iconified_set(Ecore_Evas *ee, Eina_Bool on)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_iconified_set");
+        return;
+     }
+   IFC(ee, fn_iconified_set) (ee, on);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_iconified_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_iconified_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.iconified ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_borderless_set(Ecore_Evas *ee, Eina_Bool on)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_borderless_set");
+        return;
+     }
+   IFC(ee, fn_borderless_set) (ee, on);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_borderless_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_borderless_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.borderless ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_override_set(Ecore_Evas *ee, Eina_Bool on)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_override_set");
+        return;
+     }
+   IFC(ee, fn_override_set) (ee, on);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_override_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_override_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.override ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_maximized_set(Ecore_Evas *ee, Eina_Bool on)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_maximized_set");
+        return;
+     }
+   IFC(ee, fn_maximized_set) (ee, on);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_maximized_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_maximized_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.maximized ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_profiles_set(Ecore_Evas *ee, const char **profiles, unsigned int num_profiles)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_profiles_set");
+        return;
+     }
+   IFC(ee, fn_profiles_set) (ee, profiles, num_profiles);
+   IFE;
+}
+
+EAPI const char *
+ecore_evas_profile_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_profile_get");
+        return NULL;
+     }
+   return ee->prop.profile;
+}
+
+EAPI void
+ecore_evas_fullscreen_set(Ecore_Evas *ee, Eina_Bool on)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_fullscreen_set");
+        return;
+     }
+   IFC(ee, fn_fullscreen_set) (ee, on);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_fullscreen_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_fullscreen_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.fullscreen ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_avoid_damage_set");
+        return;
+     }
+   IFC(ee, fn_avoid_damage_set) (ee, on);
+   IFE;
+}
+
+EAPI Ecore_Evas_Avoid_Damage_Type
+ecore_evas_avoid_damage_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_avoid_damage_get");
+        return ECORE_EVAS_AVOID_DAMAGE_NONE;
+     }
+   return ee->prop.avoid_damage;
+}
+
+EAPI void
+ecore_evas_withdrawn_set(Ecore_Evas *ee, Eina_Bool withdrawn)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_withdrawn_set");
+        return;
+     }
+
+   IFC(ee, fn_withdrawn_set) (ee, withdrawn);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_withdrawn_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_withdrawn_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.withdrawn ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_sticky_set(Ecore_Evas *ee, Eina_Bool sticky)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_sticky_set");
+        return;
+     }
+
+   IFC(ee, fn_sticky_set) (ee, sticky);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_sticky_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_sticky_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.sticky ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_evas_window_group_set(Ecore_Evas *ee, const Ecore_Evas *ee_group)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return;
+     }
+
+   IFC(ee, fn_window_group_set) (ee, ee_group);
+   IFE;
+}
+
+EAPI const Ecore_Evas *
+ecore_evas_window_group_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return EINA_FALSE;
+     }
+   return ee->prop.group_ee;
+}
+
+EAPI void
+ecore_evas_aspect_set(Ecore_Evas *ee, double aspect)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return;
+     }
+
+   IFC(ee, fn_aspect_set) (ee, aspect);
+   IFE;
+}
+
+EAPI double
+ecore_evas_aspect_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return EINA_FALSE;
+     }
+   return ee->prop.aspect;
+}
+
+EAPI void
+ecore_evas_urgent_set(Ecore_Evas *ee, Eina_Bool urgent)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return;
+     }
+
+   IFC(ee, fn_urgent_set) (ee, urgent);
+   IFE;
+}
+
+EAPI Eina_Bool
+ecore_evas_urgent_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_focus_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return EINA_FALSE;
      }
-   return ee->prop.focused ? 1:0;
+   return ee->prop.urgent ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Iconify or uniconify an Ecore_Evas' window
- * @param ee The Ecore_Evas
- * @param on 1 to iconify, 0 to uniconify.
- *
- * This function iconifies @p ee if @p on is 1, or uniconifies @p ee if @p on
- * is 0.
- */
 EAPI void
-ecore_evas_iconified_set(Ecore_Evas *ee, int on)
+ecore_evas_modal_set(Ecore_Evas *ee, Eina_Bool modal)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_iconified_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return;
      }
-   IFC(ee, fn_iconified_set) (ee, on);
+
+   IFC(ee, fn_modal_set) (ee, modal);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas' window is iconified or not
- * @param ee The Ecore_Evas to set
- * @return 1 if @p ee is iconified, 0 if not.
- *
- */
-EAPI int
-ecore_evas_iconified_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_modal_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_iconified_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return EINA_FALSE;
      }
-   return ee->prop.iconified ? 1:0;
+   return ee->prop.modal ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Set whether an Ecore_Evas' window is borderless or not
- * @param ee The Ecore_Evas
- * @param on 1 for borderless, 0 for bordered.
- *
- * This function makes @p ee borderless if @p on is 1, or bordered if @p on
- * is 0.
- */
 EAPI void
-ecore_evas_borderless_set(Ecore_Evas *ee, int on)
+ecore_evas_demand_attention_set(Ecore_Evas *ee, Eina_Bool demand)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_borderless_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return;
      }
-   IFC(ee, fn_borderless_set) (ee, on);
+
+   IFC(ee, fn_demands_attention_set) (ee, demand);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas' window is borderless or not
- * @param ee The Ecore_Evas to set
- * @return 1 if @p ee is borderless, 0 if not.
- *
- */
-EAPI int
-ecore_evas_borderless_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_demand_attention_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_borderless_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return EINA_FALSE;
      }
-   return ee->prop.borderless ? 1:0;
+   return ee->prop.demand_attention ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Tell the WM whether or not to ignore an Ecore_Evas' window
- * @param ee The Ecore_Evas
- * @param on 1 to ignore, 0 to not.
- *
- * This function causes the window manager to ignore @p ee if @p on is 1,
- * or not ignore @p ee if @p on is 0.
- */
 EAPI void
-ecore_evas_override_set(Ecore_Evas *ee, int on)
+ecore_evas_focus_skip_set(Ecore_Evas *ee, Eina_Bool skip)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_override_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return;
      }
-   IFC(ee, fn_override_set) (ee, on);
+
+   IFC(ee, fn_focus_skip_set) (ee, skip);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas' window is overridden or not
- * @param ee The Ecore_Evas to set
- * @return 1 if @p ee is overridden, 0 if not.
- *
- */
-EAPI int
-ecore_evas_override_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_focus_skip_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_override_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "XXX");
+        return EINA_FALSE;
      }
-   return ee->prop.override ? 1:0;
+   return ee->prop.focus_skip ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Maximize (or unmaximize) an Ecore_Evas' window
- * @param ee The Ecore_Evas
- * @param on 1 to maximize, 0 to unmaximize.
- *
- * This function maximizes @p ee if @p on is 1, or unmaximizes @p ee
- * if @p on is 0.
- */
 EAPI void
-ecore_evas_maximized_set(Ecore_Evas *ee, int on)
+ecore_evas_ignore_events_set(Ecore_Evas *ee, Eina_Bool ignore)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_maximized_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_ignore_events_set");
+        return;
      }
-   IFC(ee, fn_maximized_set) (ee, on);
+
+   IFC(ee, fn_ignore_events_set) (ee, ignore);
    IFE;
 }
 
-/**
- * Query whether an Ecore_Evas' window is maximized or not
- * @param ee The Ecore_Evas to set
- * @return 1 if @p ee is maximized, 0 if not.
- *
- */
-EAPI int
-ecore_evas_maximized_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_ignore_events_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_maximized_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_ignore_events_get");
+        return EINA_FALSE;
      }
-   return ee->prop.maximized ? 1:0;
+   return ee->ignore_events ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Set whether or not an Ecore_Evas' window is fullscreen
- * @param ee The Ecore_Evas
- * @param on 1 fullscreen, 0 not.
- *
- * This function causes @p ee to be fullscreen if @p on is 1,
- * or not if @p on is 0.
- */
 EAPI void
-ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
+ecore_evas_manual_render_set(Ecore_Evas *ee, Eina_Bool manual_render)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_fullscreen_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_manual_render_set");
+        return;
      }
-   IFC(ee, fn_fullscreen_set) (ee, on);
-   IFE;
+   ee->manual_render = manual_render;
 }
 
-/**
- * Query whether an Ecore_Evas' window is fullscreen or not
- * @param ee The Ecore_Evas to set
- * @return 1 if @p ee is fullscreen, 0 if not.
- *
- */
-EAPI int
-ecore_evas_fullscreen_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_manual_render_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_fullscreen_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_manual_render_get");
+        return EINA_FALSE;
      }
-   return ee->prop.fullscreen ? 1:0;
+   return ee->manual_render ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Set whether or not an Ecore_Evas' window should avoid damage
- *
- * @param ee The Ecore_Evas
- * @param on 1 to avoid damage, 0 to not
- *
- * This function causes @p ee to be drawn to a pixmap to avoid recalculations.
- * On expose events it will copy from the pixmap to the window.
- */
 EAPI void
-ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on)
+ecore_evas_manual_render(Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_avoid_damage_set");
-       return;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_manual_render");
+        return;
      }
-   IFC(ee, fn_avoid_damage_set) (ee, on);
-   IFE;
+   if (ee->engine.func->fn_render)
+     ee->engine.func->fn_render(ee);
 }
 
-/**
- * Query whether an Ecore_Evas' window avoids damage or not
- * @param ee The Ecore_Evas to set
- * @return 1 if @p ee avoids damage, 0 if not.
- *
- */
-EAPI Ecore_Evas_Avoid_Damage_Type
-ecore_evas_avoid_damage_get(Ecore_Evas *ee)
+EAPI void
+ecore_evas_comp_sync_set(Ecore_Evas *ee, Eina_Bool do_sync)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-                        "ecore_evas_avoid_damage_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_comp_sync_set");
+        return;
      }
-   return ee->prop.avoid_damage;
+   ee->no_comp_sync = !do_sync;
 }
 
-/**
- * Set the withdrawn state of an Ecore_Evas' window.
- * @param ee The Ecore_Evas whose window's withdrawn state is set.
- * @param withdrawn The Ecore_Evas window's new withdrawn state.
- *
- */
-EAPI void
-ecore_evas_withdrawn_set(Ecore_Evas *ee, int withdrawn)
+EAPI Eina_Bool
+ecore_evas_comp_sync_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
-   {
-      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-         "ecore_evas_withdrawn_set");
-      return;
-   }
-
-   IFC(ee, fn_withdrawn_set) (ee, withdrawn);
-   IFE;
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_comp_sync_get");
+        return EINA_FALSE;
+     }
+   return !ee->no_comp_sync;
 }
 
-/**
- * Returns the withdrawn state of an Ecore_Evas' window.
- * @param ee The Ecore_Evas whose window's withdrawn state is returned.
- * @return The Ecore_Evas window's withdrawn state.
- *
- */
-EAPI int
-ecore_evas_withdrawn_get(Ecore_Evas *ee)
+EAPI Ecore_Window
+ecore_evas_window_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
    {
       ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-         "ecore_evas_withdrawn_get");
+         "ecore_evas_window_get");
       return 0;
-   } else
-      return ee->prop.withdrawn ? 1:0;
+   }
+
+   return ee->prop.window;
 }
 
-/**
- * Set the sticky state of an Ecore_Evas window.
- *
- * @param ee The Ecore_Evas whose window's sticky state is set.
- * @param sticky The Ecore_Evas window's new sticky state.
- *
- */
 EAPI void
-ecore_evas_sticky_set(Ecore_Evas *ee, int sticky)
+ecore_evas_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
 {
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
-   {
-      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-         "ecore_evas_sticky_set");
-      return;
-   }
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_screen_geometry_get");
+        return;
+     }
 
-   IFC(ee, fn_sticky_set) (ee, sticky);
+   IFC(ee, fn_screen_geometry_get) (ee, x, y, w, h);
    IFE;
 }
 
-/**
- * Returns the sticky state of an Ecore_Evas' window.
- *
- * @param ee The Ecore_Evas whose window's sticky state is returned.
- * @return The Ecore_Evas window's sticky state.
- *
- */
-EAPI int
-ecore_evas_sticky_get(Ecore_Evas *ee)
-{
-   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
-   {
-      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-         "ecore_evas_sticky_get");
-      return 0;
-   } else
-      return ee->prop.sticky ? 1:0;
-}
-
-/**
- * Set if this evas should ignore events
- *
- * @param ee The Ecore_Evas whose window's to ignore events
- * @param sticky The Ecore_Evas new ignore state
- *
- */
 EAPI void
-ecore_evas_ignore_events_set(Ecore_Evas *ee, int ignore)
+ecore_evas_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi)
 {
+   if (xdpi) *xdpi = 0;
+   if (ydpi) *ydpi = 0;
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
-   {
-      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-         "ecore_evas_ignore_events_set");
-      return;
-   }
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_screen_geometry_get");
+        return;
+     }
 
-   IFC(ee, fn_ignore_events_set) (ee, ignore);
+   IFC(ee, fn_screen_dpi_get) (ee, xdpi, ydpi);
    IFE;
 }
 
-/**
- * Returns the ignore state of an Ecore_Evas' window.
- *
- * @param ee The Ecore_Evas whose window's ignore events state is returned.
- * @return The Ecore_Evas window's ignore state.
- *
- */
-EAPI int
-ecore_evas_ignore_events_get(Ecore_Evas *ee)
+EAPI void
+ecore_evas_draw_frame_set(Ecore_Evas *ee, Eina_Bool draw_frame)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
-   {
-      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-         "ecore_evas_ignore_events_get");
-      return 0;
-   } else
-      return ee->ignore_events ? 1 : 0;
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, "ecore_evas_draw_frame_set");
+        return;
+     }
+   ee->prop.draw_frame = draw_frame;
 }
 
-EAPI void *
-ecore_evas_window_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_draw_frame_get(const Ecore_Evas *ee)
 {
    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
-   {
-      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
-         "ecore_evas_window_get");
-      return NULL;
-   }
-
-   if (ee->engine.func->fn_window_get) return ee->engine.func->fn_window_get(ee);
-   return NULL;
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, "ecore_evas_draw_frame_get");
+        return EINA_FALSE;
+     }
+   return ee->prop.draw_frame;
 }
 
 /* fps debug calls - for debugging how much time your app actually spends */
@@ -1857,27 +2385,54 @@ void
 _ecore_evas_fps_debug_init(void)
 {
    char buf[4096];
+   const char *tmp;
 
    _ecore_evas_fps_debug_init_count++;
    if (_ecore_evas_fps_debug_init_count > 1) return;
-   snprintf(buf, sizeof(buf), "/tmp/.ecore_evas_fps_debug-%i", (int)getpid());
+
+#ifndef HAVE_EVIL
+   tmp = "/tmp";
+#else
+   tmp = evil_tmpdir_get ();
+#endif /* HAVE_EVIL */
+   snprintf(buf, sizeof(buf), "%s/.ecore_evas_fps_debug-%i", tmp, (int)getpid());
    _ecore_evas_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
    if (_ecore_evas_fps_debug_fd < 0)
      {
-       unlink(buf);
-       _ecore_evas_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
+        unlink(buf);
+        _ecore_evas_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
      }
    if (_ecore_evas_fps_debug_fd >= 0)
      {
-       unsigned int zero = 0;
-
-       write(_ecore_evas_fps_debug_fd, &zero, sizeof(unsigned int));
-       _ecore_evas_fps_rendertime_mmap = mmap(NULL, sizeof(unsigned int),
-                                              PROT_READ | PROT_WRITE,
-                                              MAP_SHARED,
-                                              _ecore_evas_fps_debug_fd, 0);
-       if (_ecore_evas_fps_rendertime_mmap == MAP_FAILED)
-         _ecore_evas_fps_rendertime_mmap = NULL;
+        unsigned int zero = 0;
+        char *buf2 = (char *)&zero;
+        ssize_t todo = sizeof(unsigned int);
+
+        while (todo > 0)
+          {
+             ssize_t r = write(_ecore_evas_fps_debug_fd, buf2, todo);
+             if (r > 0)
+               {
+                  todo -= r;
+                  buf2 += r;
+               }
+             else if ((r < 0) && (errno == EINTR))
+               continue;
+             else
+               {
+                  ERR("could not write to file '%s' fd %d: %s",
+                      buf, _ecore_evas_fps_debug_fd, strerror(errno));
+                  close(_ecore_evas_fps_debug_fd);
+                  _ecore_evas_fps_debug_fd = -1;
+                  return;
+               }
+          }
+        _ecore_evas_fps_rendertime_mmap = mmap(NULL, sizeof(unsigned int),
+                                               PROT_READ | PROT_WRITE,
+                                               MAP_SHARED,
+                                               _ecore_evas_fps_debug_fd, 0);
+        if (_ecore_evas_fps_rendertime_mmap == MAP_FAILED)
+          _ecore_evas_fps_rendertime_mmap = NULL;
      }
 }
 
@@ -1888,69 +2443,115 @@ _ecore_evas_fps_debug_shutdown(void)
    if (_ecore_evas_fps_debug_init_count > 0) return;
    if (_ecore_evas_fps_debug_fd >= 0)
      {
-       char buf[4096];
+        char buf[4096];
 
-       snprintf(buf, sizeof(buf), "/tmp/.ecore_evas_fps_debug-%i", (int)getpid());
-       unlink(buf);
-       if (_ecore_evas_fps_rendertime_mmap)
-         {
-            munmap(_ecore_evas_fps_rendertime_mmap, sizeof(int));
-            _ecore_evas_fps_rendertime_mmap = NULL;
-         }
-       close(_ecore_evas_fps_debug_fd);
-       _ecore_evas_fps_debug_fd = -1;
+        snprintf(buf, sizeof(buf), "/tmp/.ecore_evas_fps_debug-%i", (int)getpid());
+        unlink(buf);
+        if (_ecore_evas_fps_rendertime_mmap)
+          {
+             munmap(_ecore_evas_fps_rendertime_mmap, sizeof(int));
+             _ecore_evas_fps_rendertime_mmap = NULL;
+          }
+        close(_ecore_evas_fps_debug_fd);
+        _ecore_evas_fps_debug_fd = -1;
      }
 }
 
 void
 _ecore_evas_fps_debug_rendertime_add(double t)
 {
-   if ((_ecore_evas_fps_debug_fd >= 0) &&
-       (_ecore_evas_fps_rendertime_mmap))
+   static double rtime = 0.0;
+   static double rlapse = 0.0;
+   static int frames = 0;
+   static int flapse = 0;
+   double tim;
+
+   tim = ecore_time_get();
+   rtime += t;
+   frames++;
+   if (rlapse == 0.0)
+     {
+        rlapse = tim;
+        flapse = frames;
+     }
+   else if ((tim - rlapse) >= 0.5)
      {
-       unsigned int tm;
+        printf("FRAME: %i, FPS: %3.1f, RTIME %3.0f%%\n",
+               frames,
+               (frames - flapse) / (tim - rlapse),
+               (100.0 * rtime) / (tim - rlapse)
+               );
+        rlapse = tim;
+        flapse = frames;
+        rtime = 0.0;
+     }
+}
+
+void
+_ecore_evas_register(Ecore_Evas *ee)
+{
+   ee->registered = 1;
+   ecore_evases = (Ecore_Evas *)eina_inlist_prepend
+     (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
+}
+
+void
+_ecore_evas_ref(Ecore_Evas *ee)
+{
+   ee->refcount++;
+}
 
-       tm = (unsigned int)(t * 1000000.0);
-       /* i know its not 100% theoretically guaranteed, but i'd say a write */
-       /* of an int could be considered atomic for all practical purposes */
-       /* oh and since this is cumulative, 1 second = 1,000,000 ticks, so */
-       /* this can run for about 4294 seconds becore looping. if you are */
-       /* doing performance testing in one run for over an hour... well */
-       /* time to restart or handle a loop condition :) */
-       *(_ecore_evas_fps_rendertime_mmap) += tm;
+void
+_ecore_evas_unref(Ecore_Evas *ee)
+{
+   ee->refcount--;
+   if (ee->refcount == 0)
+     {
+        if (ee->deleted) _ecore_evas_free(ee);
      }
+   else if (ee->refcount < -1)
+     ERR("Ecore_Evas %p->refcount=%d < 0", ee, ee->refcount);
 }
 
 void
 _ecore_evas_free(Ecore_Evas *ee)
 {
-   ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
+   ee->deleted = EINA_TRUE;
+   if (ee->refcount > 0) return;
+
+   if (ee->func.fn_pre_free) ee->func.fn_pre_free(ee);
    while (ee->sub_ecore_evas)
      {
-       _ecore_evas_free(ee->sub_ecore_evas->data);
+        _ecore_evas_free(ee->sub_ecore_evas->data);
      }
-   if (ee->data) evas_hash_free(ee->data);
-   if (ee->name) free(ee->name);
-   if (ee->prop.title) free(ee->prop.title);
-   if (ee->prop.name) free(ee->prop.name);
-   if (ee->prop.clas) free(ee->prop.clas);
-   if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
-   if (ee->evas) evas_free(ee->evas);
+   if (ee->data) eina_hash_free(ee->data);
    ee->data = NULL;
-   ee->driver = NULL;
+   if (ee->name) free(ee->name);
    ee->name = NULL;
+   if (ee->prop.title) free(ee->prop.title);
    ee->prop.title = NULL;
+   if (ee->prop.name) free(ee->prop.name);
    ee->prop.name = NULL;
+   if (ee->prop.clas) free(ee->prop.clas);
    ee->prop.clas = NULL;
+   if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
    ee->prop.cursor.object = NULL;
+   if (ee->evas) evas_free(ee->evas);
    ee->evas = NULL;
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
+   ee->driver = NULL;
    if (ee->engine.idle_flush_timer)
      ecore_timer_del(ee->engine.idle_flush_timer);
    if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee);
+   if (ee->registered)
+     {
+        ecore_evases = (Ecore_Evas *)eina_inlist_remove
+          (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
+     }
    free(ee);
 }
 
-static int
+static Eina_Bool
 _ecore_evas_cb_idle_flush(void *data)
 {
    Ecore_Evas *ee;
@@ -1958,7 +2559,15 @@ _ecore_evas_cb_idle_flush(void *data)
    ee = (Ecore_Evas *)data;
    evas_render_idle_flush(ee->evas);
    ee->engine.idle_flush_timer = NULL;
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_ecore_evas_async_events_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
+{
+   evas_async_events_process();
+
+   return ECORE_CALLBACK_RENEW;
 }
 
 void
@@ -1967,6 +2576,305 @@ _ecore_evas_idle_timeout_update(Ecore_Evas *ee)
    if (ee->engine.idle_flush_timer)
      ecore_timer_del(ee->engine.idle_flush_timer);
    ee->engine.idle_flush_timer = ecore_timer_add(IDLE_FLUSH_TIME,
-                                                _ecore_evas_cb_idle_flush,
-                                                ee);
+                                                 _ecore_evas_cb_idle_flush,
+                                                 ee);
+}
+
+void
+_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
+{
+   ee->mouse.x = x;
+   ee->mouse.y = y;
+   if (ee->prop.cursor.object)
+     {
+        evas_object_show(ee->prop.cursor.object);
+        if (ee->rotation == 0)
+          evas_object_move(ee->prop.cursor.object,
+                           x - ee->prop.cursor.hot.x,
+                           y - ee->prop.cursor.hot.y);
+        else if (ee->rotation == 90)
+          evas_object_move(ee->prop.cursor.object,
+                           ee->h - y - 1 - ee->prop.cursor.hot.x,
+                           x - ee->prop.cursor.hot.y);
+        else if (ee->rotation == 180)
+          evas_object_move(ee->prop.cursor.object,
+                           ee->w - x - 1 - ee->prop.cursor.hot.x,
+                           ee->h - y - 1 - ee->prop.cursor.hot.y);
+        else if (ee->rotation == 270)
+          evas_object_move(ee->prop.cursor.object,
+                           y - ee->prop.cursor.hot.x,
+                           ee->w - x - 1 - ee->prop.cursor.hot.y);
+     }
+   if (ee->rotation == 0)
+     evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
+   else if (ee->rotation == 90)
+     evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
+   else if (ee->rotation == 180)
+     evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
+   else if (ee->rotation == 270)
+     evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
+}
+
+void
+_ecore_evas_mouse_multi_move_process(Ecore_Evas *ee, int device,
+                                     int x, int y,
+                                     double radius,
+                                     double radius_x, double radius_y,
+                                     double pressure,
+                                     double angle,
+                                     double mx, double my,
+                                     unsigned int timestamp)
+{
+   if (ee->rotation == 0)
+      evas_event_feed_multi_move(ee->evas, device,
+                                 x, y,
+                                 radius,
+                                 radius_x, radius_y,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 mx, my,
+                                 timestamp, NULL);
+   else if (ee->rotation == 90)
+      evas_event_feed_multi_move(ee->evas, device,
+                                 ee->h - y - 1, x,
+                                 radius,
+                                 radius_y, radius_x,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 ee->h - my - 1, mx,
+                                 timestamp, NULL);
+   else if (ee->rotation == 180)
+      evas_event_feed_multi_move(ee->evas, device,
+                                 ee->w - x - 1, ee->h - y - 1,
+                                 radius,
+                                 radius_x, radius_y,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 ee->w - mx - 1, ee->h - my - 1,
+                                 timestamp, NULL);
+   else if (ee->rotation == 270)
+      evas_event_feed_multi_move(ee->evas, device,
+                                 y, ee->w - x - 1,
+                                 radius,
+                                 radius_y, radius_x,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 my, ee->w - mx - 1,
+                                 timestamp, NULL);
+}
+
+void
+_ecore_evas_mouse_multi_down_process(Ecore_Evas *ee, int device,
+                                     int x, int y,
+                                     double radius,
+                                     double radius_x, double radius_y,
+                                     double pressure,
+                                     double angle,
+                                     double mx, double my,
+                                     Evas_Button_Flags flags,
+                                     unsigned int timestamp)
+{
+   if (ee->rotation == 0)
+      evas_event_feed_multi_down(ee->evas, device,
+                                 x, y,
+                                 radius,
+                                 radius_x, radius_y,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 mx, my,
+                                 flags, timestamp, NULL);
+   else if (ee->rotation == 90)
+      evas_event_feed_multi_down(ee->evas, device,
+                                 ee->h - y - 1, x,
+                                 radius,
+                                 radius_y, radius_x,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 ee->h - my - 1, mx,
+                                 flags, timestamp, NULL);
+   else if (ee->rotation == 180)
+      evas_event_feed_multi_down(ee->evas, device,
+                                 ee->w - x - 1, ee->h - y - 1,
+                                 radius,
+                                 radius_x, radius_y,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 ee->w - mx - 1, ee->h - my - 1,
+                                 flags, timestamp, NULL);
+   else if (ee->rotation == 270)
+      evas_event_feed_multi_down(ee->evas, device,
+                                 y, ee->w - x - 1,
+                                 radius,
+                                 radius_y, radius_x,
+                                 pressure,
+                                 angle - ee->rotation,
+                                 my, ee->w - mx - 1,
+                                 flags, timestamp, NULL);
+}
+
+void
+_ecore_evas_mouse_multi_up_process(Ecore_Evas *ee, int device,
+                                   int x, int y,
+                                   double radius,
+                                   double radius_x, double radius_y,
+                                   double pressure,
+                                   double angle,
+                                   double mx, double my,
+                                   Evas_Button_Flags flags,
+                                   unsigned int timestamp)
+{
+   if (ee->rotation == 0)
+      evas_event_feed_multi_up(ee->evas, device,
+                               x, y,
+                               radius,
+                               radius_x, radius_y,
+                               pressure,
+                               angle - ee->rotation,
+                               mx, my,
+                               flags, timestamp, NULL);
+   else if (ee->rotation == 90)
+      evas_event_feed_multi_up(ee->evas, device,
+                               ee->h - y - 1, x,
+                               radius,
+                               radius_y, radius_x,
+                               pressure,
+                               angle - ee->rotation,
+                               ee->h - my - 1, mx,
+                               flags, timestamp, NULL);
+   else if (ee->rotation == 180)
+      evas_event_feed_multi_up(ee->evas, device,
+                               ee->w - x - 1, ee->h - y - 1,
+                               radius,
+                               radius_x, radius_y,
+                               pressure,
+                               angle - ee->rotation,
+                               ee->w - mx - 1, ee->h - my - 1,
+                               flags, timestamp, NULL);
+   else if (ee->rotation == 270)
+      evas_event_feed_multi_up(ee->evas, device,
+                               y, ee->w - x - 1,
+                               radius,
+                               radius_y, radius_x,
+                               pressure,
+                               angle - ee->rotation,
+                               my, ee->w - mx - 1,
+                               flags, timestamp, NULL);
+}
+
+EAPI Eina_List *
+ecore_evas_ecore_evas_list_get(void)
+{
+   Ecore_Evas *ee;
+   Eina_List *l = NULL;
+
+   EINA_INLIST_FOREACH(ecore_evases, ee)
+     {
+        l = eina_list_append(l, ee);
+     }
+
+   return l;
+}
+
+EAPI void
+ecore_evas_input_event_register(Ecore_Evas *ee)
+{
+   ecore_event_window_register((Ecore_Window)ee, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+}
+
+EAPI void
+ecore_evas_input_event_unregister(Ecore_Evas *ee)
+{
+   ecore_event_window_unregister((Ecore_Window)ee);
+}
+
+#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined (BUILD_ECORE_EVAS_WAYLAND_EGL)
+EAPI void
+ecore_evas_wayland_resize(Ecore_Evas *ee, int location)
+{
+   if (!ee) return;
+   if (!strcmp(ee->driver, "wayland_shm"))
+     {
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+        _ecore_evas_wayland_shm_resize(ee, location);
+#endif
+     }
+   else if (!strcmp(ee->driver, "wayland_egl"))
+     {
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+        _ecore_evas_wayland_egl_resize(ee, location);
+#endif
+     }
+}
+
+EAPI void 
+ecore_evas_wayland_move(Ecore_Evas *ee, int x, int y)
+{
+   if (!ee) return;
+   if (!strncmp(ee->driver, "wayland", 7))
+     {
+        if (ee->engine.wl.win)
+          {
+             ee->engine.wl.win->moving = EINA_TRUE;
+             ecore_wl_window_move(ee->engine.wl.win, x, y);
+          }
+     }
+}
+
+EAPI void
+ecore_evas_wayland_type_set(Ecore_Evas *ee, int type)
+{
+   if (!ee) return;
+   ecore_wl_window_type_set(ee->engine.wl.win, type);
+}
+
+EAPI Ecore_Wl_Window *
+ecore_evas_wayland_window_get(const Ecore_Evas *ee)
+{
+   if (!(!strncmp(ee->driver, "wayland", 7)))
+     return NULL;
+
+   return ee->engine.wl.win;
+}
+
+EAPI void
+ecore_evas_wayland_pointer_set(Ecore_Evas *ee __UNUSED__, int hot_x __UNUSED__, int hot_y __UNUSED__)
+{
+
+}
+
+#else
+EAPI void
+ecore_evas_wayland_resize(Ecore_Evas *ee __UNUSED__, int location __UNUSED__)
+{
+
+}
+
+EAPI void 
+ecore_evas_wayland_move(Ecore_Evas *ee __UNUSED__, int x __UNUSED__, int y __UNUSED__)
+{
+
 }
+
+EAPI void
+ecore_evas_wayland_type_set(Ecore_Evas *ee __UNUSED__, int type __UNUSED__)
+{
+
+}
+
+EAPI Ecore_Wl_Window *
+ecore_evas_wayland_window_get(const Ecore_Evas *ee __UNUSED__)
+{
+   return NULL;
+}
+
+EAPI void
+ecore_evas_wayland_pointer_set(Ecore_Evas *ee __UNUSED__, int hot_x __UNUSED__, int hot_y __UNUSED__)
+{
+
+}
+
+#endif
index c1df0fe..77ee8c1 100644 (file)
@@ -1,62 +1,56 @@
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
-#include "Ecore.h"
+// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
+#include <stdlib.h>
+
+#include <Ecore.h>
 #include "ecore_private.h"
+#include <Ecore_Input.h>
+
 #include "ecore_evas_private.h"
 #include "Ecore_Evas.h"
 
-#ifdef BUILD_ECORE_EVAS_BUFFER
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
 static int _ecore_evas_init_count = 0;
 
-static int _ecore_evas_fps_debug = 0;
-
-static Ecore_Evas *ecore_evases = NULL;
-
-static void
-_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
-{
-   ee->mouse.x = x;
-   ee->mouse.y = y;
-   evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
-}
-
 static int
 _ecore_evas_buffer_init(void)
 {
    _ecore_evas_init_count++;
-   if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
-   if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
-   if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
    return _ecore_evas_init_count;
 }
 
 static void
 _ecore_evas_buffer_free(Ecore_Evas *ee)
 {
-   ecore_evases = _ecore_list2_remove(ecore_evases, ee);
-   _ecore_evas_buffer_shutdown();
    if (ee->engine.buffer.image)
      {
-       Ecore_Evas *ee2;
+        Ecore_Evas *ee2;
 
-       ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
-       evas_object_del(ee->engine.buffer.image);
-       ee2->sub_ecore_evas = evas_list_remove(ee2->sub_ecore_evas, ee);
+        ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
+        evas_object_del(ee->engine.buffer.image);
+        ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
      }
    else
-     free(ee->engine.buffer.pixels);
+     {
+        ee->engine.buffer.free_func(ee->engine.buffer.data,
+                                    ee->engine.buffer.pixels);
+     }
+   _ecore_evas_buffer_shutdown();
 }
 
 static void
 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
 {
    Evas_Engine_Info_Buffer *einfo;
+   int stride = 0;
 
    if (w < 1) w = 1;
    if (h < 1) h = 1;
+   ee->req.w = w;
+   ee->req.h = h;
    if ((w == ee->w) && (h == ee->h)) return;
    ee->w = w;
    ee->h = h;
@@ -66,154 +60,226 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
 
    if (ee->engine.buffer.image)
      {
-       ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
+        ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
+        stride = evas_object_image_stride_get(ee->engine.buffer.image);
      }
    else
      {
-       if (ee->engine.buffer.pixels) free(ee->engine.buffer.pixels);
-       ee->engine.buffer.pixels = malloc(ee->w * ee->h * sizeof(int));
+        if (ee->engine.buffer.pixels)
+          ee->engine.buffer.free_func(ee->engine.buffer.data,
+                                      ee->engine.buffer.pixels);
+        ee->engine.buffer.pixels =
+          ee->engine.buffer.alloc_func(ee->engine.buffer.data,
+                                       ee->w * ee->h * sizeof(int));
+        stride = ee->w * sizeof(int);
      }
 
    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
    if (einfo)
      {
-       einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
-       einfo->info.dest_buffer = ee->engine.buffer.pixels;
-       einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
-       einfo->info.use_color_key = 0;
-       einfo->info.alpha_threshold = 0;
-       einfo->info.func.new_update_region = NULL;
-       einfo->info.func.free_update_region = NULL;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        if (ee->alpha)
+          einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+        else
+          einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+        einfo->info.dest_buffer = ee->engine.buffer.pixels;
+        einfo->info.dest_buffer_row_bytes = stride;
+        einfo->info.use_color_key = 0;
+        einfo->info.alpha_threshold = 0;
+        einfo->info.func.new_update_region = NULL;
+        einfo->info.func.free_update_region = NULL;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
      }
+   if (ee->engine.buffer.image)
+      evas_object_image_data_set(ee->engine.buffer.image, ee->engine.buffer.pixels);
    if (ee->func.fn_resize) ee->func.fn_resize(ee);
 }
 
+static void
+_ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
+{
+   _ecore_evas_resize(ee, w, h);
+}
+
 int
 _ecore_evas_buffer_shutdown(void)
 {
    _ecore_evas_init_count--;
-   if (_ecore_evas_init_count == 0)
-     {
-       while (ecore_evases)
-         {
-            _ecore_evas_free((Ecore_Evas *)ecore_evases);
-         }
-       if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
-     }
    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
    return _ecore_evas_init_count;
 }
 
-void
+static void
+_ecore_evas_show(Ecore_Evas *ee)
+{
+   if (ee->engine.buffer.image) return;
+   if (ee->prop.focused) return;
+   ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+}
+
+int
 _ecore_evas_buffer_render(Ecore_Evas *ee)
 {
-   Evas_List *updates, *l, *ll;
+   Eina_List *updates = NULL, *l, *ll;
+   Ecore_Evas *ee2;
+   int rend = 0;
 
-   for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
      {
-       Ecore_Evas *ee2;
-
-       ee2 = ll->data;
-       if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
-       _ecore_evas_buffer_render(ee2);
-       if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+           rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
      }
    if (ee->engine.buffer.image)
      {
-       int w, h;
+        int w, h;
 
-       evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
-       if ((w != ee->w) || (h != ee->h))
-         _ecore_evas_resize(ee, w, h);
+        evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
+        if ((w != ee->w) || (h != ee->h))
+           _ecore_evas_resize(ee, w, h);
+        ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
+     }
+   if (ee->engine.buffer.pixels)
+     {
+        updates = evas_render_updates(ee->evas);
      }
-   updates = evas_render_updates(ee->evas);
    if (ee->engine.buffer.image)
      {
-       for (l = updates; l; l = l->next)
-         {
-            Evas_Rectangle *r;
-
-            r = l->data;
-            if (ee->engine.buffer.image)
-              evas_object_image_data_update_add(ee->engine.buffer.image,
-                                                r->x, r->y, r->w, r->h);
-         }
+        Eina_Rectangle *r;
+
+        evas_object_image_data_set(ee->engine.buffer.image, ee->engine.buffer.pixels);
+        EINA_LIST_FOREACH(updates, l, r)
+           evas_object_image_data_update_add(ee->engine.buffer.image,
+                                             r->x, r->y, r->w, r->h);
      }
    if (updates)
      {
-       evas_render_updates_free(updates);
-       _ecore_evas_idle_timeout_update(ee);
+        evas_render_updates_free(updates);
+        _ecore_evas_idle_timeout_update(ee);
      }
+
+   return updates ? 1 : rend;
 }
 
+// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
 static void
 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
 {
-   Evas_Coord xx, yy, fx, fy, fw, fh;
+   Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
 
-   evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, NULL, NULL);
+   evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
    evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
 
    if (fw < 1) fw = 1;
-   xx = (*x - xx) - fx;
-   while (xx < 0) xx += fw;
-   while (xx > fw) xx -= fw;
-   *x = (ee->w * xx) / fw;
-
    if (fh < 1) fh = 1;
-   yy = (*y - yy) - fy;
-   while (yy < 0) yy += fh;
-   while (yy > fh) yy -= fh;
-   *y = (ee->h * yy) / fh;
+
+   if (evas_object_map_get(ee->engine.buffer.image) &&
+       evas_object_map_enable_get(ee->engine.buffer.image))
+     {
+        fx = 0; fy = 0;
+        fw = ee->w; fh = ee->h;
+        ww = ee->w; hh = ee->h;
+     }
+   
+   if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
+     {
+        *x = (ee->w * (*x - xx)) / fw;
+        *y = (ee->h * (*y - yy)) / fh;
+     }
+   else
+     {
+        xx = (*x - xx) - fx;
+        while (xx < 0) xx += fw;
+        while (xx > fw) xx -= fw;
+        *x = (ee->w * xx) / fw;
+
+        yy = (*y - yy) - fy;
+        while (yy < 0) yy += fh;
+        while (yy > fh) yy -= fh;
+        *y = (ee->h * yy) / fh;
+     }
+}
+
+static void
+_ecore_evas_buffer_transfer_modifiers_locks(Evas *e, Evas *e2)
+{
+   const char *mods[] = 
+     { "Shift", "Control", "Alt", "Meta", "Hyper", "Super", NULL };
+   const char *locks[] = 
+     { "Scroll_Lock", "Num_Lock", "Caps_Lock", NULL };
+   int i;
+   
+   for (i = 0; mods[i]; i++)
+     {
+        if (evas_key_modifier_is_set(evas_key_modifier_get(e), mods[i]))
+          evas_key_modifier_on(e2, mods[i]);
+        else
+          evas_key_modifier_off(e2, mods[i]);
+     }
+   for (i = 0; locks[i]; i++)
+     {
+        if (evas_key_lock_is_set(evas_key_lock_get(e), locks[i]))
+          evas_key_lock_on(e2, locks[i]);
+        else
+          evas_key_lock_off(e2, locks[i]);
+     }
 }
 
 static void
-_ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_ecore_evas_buffer_cb_mouse_in(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Ecore_Evas *ee;
    Evas_Event_Mouse_In *ev;
 
    ee = data;
    ev = event_info;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
 }
 
 static void
-_ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_ecore_evas_buffer_cb_mouse_out(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Ecore_Evas *ee;
    Evas_Event_Mouse_Out *ev;
 
    ee = data;
    ev = event_info;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
 }
 
 static void
-_ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_ecore_evas_buffer_cb_mouse_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Ecore_Evas *ee;
    Evas_Event_Mouse_Down *ev;
 
    ee = data;
    ev = event_info;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
 }
 
 static void
-_ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_ecore_evas_buffer_cb_mouse_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Ecore_Evas *ee;
    Evas_Event_Mouse_Up *ev;
 
    ee = data;
    ev = event_info;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
 }
 
 static void
-_ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_ecore_evas_buffer_cb_mouse_move(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Ecore_Evas *ee;
    Evas_Event_Mouse_Move *ev;
@@ -224,21 +290,86 @@ _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *ob
    x = ev->cur.canvas.x;
    y = ev->cur.canvas.y;
    _ecore_evas_buffer_coord_translate(ee, &x, &y);
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
 }
 
 static void
-_ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Ecore_Evas *ee;
    Evas_Event_Mouse_Wheel *ev;
 
    ee = data;
    ev = event_info;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
 }
 
 static void
+_ecore_evas_buffer_cb_multi_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee;
+   Evas_Event_Multi_Down *ev;
+   Evas_Coord x, y, xx, yy;
+   double xf, yf;
+
+   ee = data;
+   ev = event_info;
+   x = ev->canvas.x;
+   y = ev->canvas.y;
+   xx = x;
+   yy = y;
+   _ecore_evas_buffer_coord_translate(ee, &x, &y);
+   xf = (ev->canvas.xsub - (double)xx) + (double)x;
+   yf = (ev->canvas.ysub - (double)yy) + (double)y;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
+   evas_event_feed_multi_down(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_buffer_cb_multi_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee;
+   Evas_Event_Multi_Up *ev;
+   Evas_Coord x, y, xx, yy;
+   double xf, yf;
+
+   ee = data;
+   ev = event_info;
+   x = ev->canvas.x;
+   y = ev->canvas.y;
+   xx = x;
+   yy = y;
+   _ecore_evas_buffer_coord_translate(ee, &x, &y);
+   xf = (ev->canvas.xsub - (double)xx) + (double)x;
+   yf = (ev->canvas.ysub - (double)yy) + (double)y;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
+   evas_event_feed_multi_up(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_buffer_cb_multi_move(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee;
+   Evas_Event_Multi_Move *ev;
+   Evas_Coord x, y, xx, yy;
+   double xf, yf;
+
+   ee = data;
+   ev = event_info;
+   x = ev->cur.canvas.x;
+   y = ev->cur.canvas.y;
+   xx = x;
+   yy = y;
+   _ecore_evas_buffer_coord_translate(ee, &x, &y);
+   xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
+   yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
+   evas_event_feed_multi_move(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->timestamp, NULL);
+}
+
+static void
 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Ecore_Evas *ee;
@@ -255,42 +386,7 @@ _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__,
 
    ee = data;
    ev = event_info;
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
-     evas_key_modifier_on(e, "Shift");
-   else
-     evas_key_modifier_off(e, "Shift");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
-     evas_key_modifier_on(e, "Control");
-   else
-     evas_key_modifier_off(e, "Control");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
-     evas_key_modifier_on(e, "Alt");
-   else
-     evas_key_modifier_off(e, "Alt");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
-     evas_key_modifier_on(e, "Meta");
-   else
-     evas_key_modifier_off(e, "Meta");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
-     evas_key_modifier_on(e, "Hyper");
-   else
-     evas_key_modifier_off(e, "Hyper");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
-     evas_key_modifier_on(e, "Super");
-   else
-     evas_key_modifier_off(e, "Super");
-   if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
-     evas_key_lock_on(e, "Scroll_Lock");
-   else
-     evas_key_lock_off(e, "Scroll_Lock");
-   if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
-     evas_key_lock_on(e, "Num_Lock");
-   else
-     evas_key_lock_off(e, "Num_Lock");
-   if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
-     evas_key_lock_on(e, "Caps_Lock");
-   else
-     evas_key_lock_off(e, "Caps_Lock");
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
 }
 
@@ -302,42 +398,7 @@ _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, v
 
    ee = data;
    ev = event_info;
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
-     evas_key_modifier_on(e, "Shift");
-   else
-     evas_key_modifier_off(e, "Shift");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
-     evas_key_modifier_on(e, "Control");
-   else
-     evas_key_modifier_off(e, "Control");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
-     evas_key_modifier_on(e, "Alt");
-   else
-     evas_key_modifier_off(e, "Alt");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
-     evas_key_modifier_on(e, "Meta");
-   else
-     evas_key_modifier_off(e, "Meta");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
-     evas_key_modifier_on(e, "Hyper");
-   else
-     evas_key_modifier_off(e, "Hyper");
-   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
-     evas_key_modifier_on(e, "Super");
-   else
-     evas_key_modifier_off(e, "Super");
-   if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
-     evas_key_lock_on(e, "Scroll_Lock");
-   else
-     evas_key_lock_off(e, "Scroll_Lock");
-   if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
-     evas_key_lock_on(e, "Num_Lock");
-   else
-     evas_key_lock_off(e, "Num_Lock");
-   if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
-     evas_key_lock_on(e, "Caps_Lock");
-   else
-     evas_key_lock_off(e, "Caps_Lock");
+   _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
 }
 
@@ -348,6 +409,7 @@ _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj
 
    ee = data;
    ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
 }
 
@@ -358,6 +420,7 @@ _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj
 
    ee = data;
    ee->prop.focused = 0;
+   evas_focus_out(ee->evas);
    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
 }
 
@@ -381,7 +444,30 @@ _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UN
    if (ee->func.fn_hide) ee->func.fn_hide(ee);
 }
 
-static const Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
+static void
+_ecore_evas_buffer_alpha_set(Ecore_Evas *ee, int alpha)
+{
+   if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
+   ee->alpha = alpha;
+   if (ee->engine.buffer.image)
+      evas_object_image_alpha_set(ee->engine.buffer.image, ee->alpha);
+   else
+     {
+        Evas_Engine_Info_Buffer *einfo;
+        
+        einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             if (ee->alpha)
+               einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+             else
+               einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+             evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+          }
+     }
+}
+
+static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
 {
    _ecore_evas_buffer_free,
      NULL,
@@ -401,8 +487,10 @@ static const Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
      NULL,
      NULL,
      _ecore_evas_resize,
+     _ecore_evas_move_resize,
      NULL,
      NULL,
+     _ecore_evas_show,
      NULL,
      NULL,
      NULL,
@@ -425,26 +513,52 @@ static const Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
      NULL,
      NULL,
      NULL,
+     _ecore_evas_buffer_alpha_set,
+     NULL, //transparent
+     NULL, // profiles_set
+
      NULL,
      NULL,
      NULL,
-     NULL
+     NULL,
+     NULL,
+     NULL,
+
+     _ecore_evas_buffer_render,
+     NULL, // screen_geometry_get
+     NULL  // screen_dpi_get
 };
 #endif
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
+static void *
+_ecore_evas_buffer_pix_alloc(void *data __UNUSED__, int size)
+{
+   return malloc(size);
+}
+
+static void
+_ecore_evas_buffer_pix_free(void *data __UNUSED__, void *pix)
+{
+   free(pix);
+}
+
 EAPI Ecore_Evas *
 ecore_evas_buffer_new(int w, int h)
 {
-#ifdef BUILD_ECORE_EVAS_BUFFER
+    return ecore_evas_buffer_allocfunc_new
+     (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data)
+{
+// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
    Evas_Engine_Info_Buffer *einfo;
    Ecore_Evas *ee;
    int rmethod;
 
+   if ((!alloc_func) || (!free_func)) return NULL;
    rmethod = evas_render_method_lookup("buffer");
    if (!rmethod) return NULL;
    ee = calloc(1, sizeof(Ecore_Evas));
@@ -455,6 +569,9 @@ ecore_evas_buffer_new(int w, int h)
    _ecore_evas_buffer_init();
 
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
+   ee->engine.buffer.alloc_func = alloc_func;
+   ee->engine.buffer.free_func = free_func;
+   ee->engine.buffer.data = (void *)data;
 
    ee->driver = "buffer";
 
@@ -464,6 +581,8 @@ ecore_evas_buffer_new(int w, int h)
    ee->visible = 1;
    ee->w = w;
    ee->h = h;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 0;
    ee->prop.max.h = 0;
@@ -483,19 +602,32 @@ ecore_evas_buffer_new(int w, int h)
    evas_output_size_set(ee->evas, w, h);
    evas_output_viewport_set(ee->evas, 0, 0, w, h);
 
-   ee->engine.buffer.pixels = malloc(w * h * sizeof(int));
+   ee->engine.buffer.pixels =
+     ee->engine.buffer.alloc_func
+     (ee->engine.buffer.data, w * h * sizeof(int));
 
    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
    if (einfo)
      {
-       einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
-       einfo->info.dest_buffer = ee->engine.buffer.pixels;
-       einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
-       einfo->info.use_color_key = 0;
-       einfo->info.alpha_threshold = 0;
-       einfo->info.func.new_update_region = NULL;
-       einfo->info.func.free_update_region = NULL;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+        einfo->info.dest_buffer = ee->engine.buffer.pixels;
+        einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
+        einfo->info.use_color_key = 0;
+        einfo->info.alpha_threshold = 0;
+        einfo->info.func.new_update_region = NULL;
+        einfo->info.func.free_update_region = NULL;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
      }
    evas_key_modifier_add(ee->evas, "Shift");
    evas_key_modifier_add(ee->evas, "Control");
@@ -509,17 +641,25 @@ ecore_evas_buffer_new(int w, int h)
 
    evas_event_feed_mouse_in(ee->evas, 0, NULL);
 
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
+   _ecore_evas_register(ee);
+
+   evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
+   
    return ee;
 #else
    return NULL;
 #endif
 }
 
-EAPI const int *
+EAPI const void *
 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_BUFFER
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
+   if (!ee)
+     {
+        CRIT("Ecore_Evas is missing");
+        return NULL;
+     }
    _ecore_evas_buffer_render(ee);
    return ee->engine.buffer.pixels;
 #else
@@ -527,15 +667,35 @@ ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
 #endif
 }
 
+EAPI Evas *
+ecore_evas_object_evas_get(Evas_Object *obj)
+{
+   Ecore_Evas *ee;
+
+   ee = evas_object_data_get(obj, "Ecore_Evas");
+   if (!ee) return NULL;
+
+   return ecore_evas_get(ee);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_object_ecore_evas_get(Evas_Object *obj)
+{
+   return evas_object_data_get(obj, "Ecore_Evas");
+}
+
 EAPI Evas_Object *
 ecore_evas_object_image_new(Ecore_Evas *ee_target)
 {
-#ifdef BUILD_ECORE_EVAS_BUFFER
+// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
    Evas_Object *o;
    Evas_Engine_Info_Buffer *einfo;
    Ecore_Evas *ee;
    int rmethod;
-   int w, h;
+   int w = 1, h = 1;
+
+   if (!ee_target) return NULL;
 
    rmethod = evas_render_method_lookup("buffer");
    if (!rmethod) return NULL;
@@ -543,6 +703,10 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target)
    if (!ee) return NULL;
 
    o = evas_object_image_add(ee_target->evas);
+   evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
+   evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
+   evas_object_image_alpha_set(o, 0);
+   evas_object_image_size_set(o, w, h);
 
    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
 
@@ -552,12 +716,12 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target)
 
    ee->driver = "buffer";
 
-   w = 1;
-   h = 1;
    ee->rotation = 0;
    ee->visible = 0;
    ee->w = w;
    ee->h = h;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 0;
    ee->prop.max.h = 0;
@@ -580,60 +744,78 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target)
    ee->engine.buffer.image = o;
    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
-   evas_object_image_size_set(o, ee->w, ee->h);
-   evas_object_image_alpha_set(o, 1);
-   ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
-   evas_object_image_data_set(o, ee->engine.buffer.pixels);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_MOUSE_IN,
-                                 _ecore_evas_buffer_cb_mouse_in, ee);
+                                  EVAS_CALLBACK_MOUSE_IN,
+                                  _ecore_evas_buffer_cb_mouse_in, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_OUT,
+                                  _ecore_evas_buffer_cb_mouse_out, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_DOWN,
+                                  _ecore_evas_buffer_cb_mouse_down, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_UP,
+                                  _ecore_evas_buffer_cb_mouse_up, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_MOUSE_OUT,
-                                 _ecore_evas_buffer_cb_mouse_out, ee);
+                                  EVAS_CALLBACK_MOUSE_MOVE,
+                                  _ecore_evas_buffer_cb_mouse_move, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_MOUSE_DOWN,
-                                 _ecore_evas_buffer_cb_mouse_down, ee);
+                                  EVAS_CALLBACK_MOUSE_WHEEL,
+                                  _ecore_evas_buffer_cb_mouse_wheel, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_MOUSE_UP,
-                                 _ecore_evas_buffer_cb_mouse_up, ee);
+                                  EVAS_CALLBACK_MULTI_DOWN,
+                                  _ecore_evas_buffer_cb_multi_down, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_MOUSE_MOVE,
-                                 _ecore_evas_buffer_cb_mouse_move, ee);
+                                  EVAS_CALLBACK_MULTI_UP,
+                                  _ecore_evas_buffer_cb_multi_up, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_MOUSE_WHEEL,
-                                 _ecore_evas_buffer_cb_mouse_wheel, ee);
+                                  EVAS_CALLBACK_MULTI_MOVE,
+                                  _ecore_evas_buffer_cb_multi_move, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_FREE,
-                                 _ecore_evas_buffer_cb_free, ee);
+                                  EVAS_CALLBACK_FREE,
+                                  _ecore_evas_buffer_cb_free, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_KEY_DOWN,
-                                 _ecore_evas_buffer_cb_key_down, ee);
+                                  EVAS_CALLBACK_KEY_DOWN,
+                                  _ecore_evas_buffer_cb_key_down, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_KEY_UP,
-                                 _ecore_evas_buffer_cb_key_up, ee);
+                                  EVAS_CALLBACK_KEY_UP,
+                                  _ecore_evas_buffer_cb_key_up, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_FOCUS_IN,
-                                 _ecore_evas_buffer_cb_focus_in, ee);
+                                  EVAS_CALLBACK_FOCUS_IN,
+                                  _ecore_evas_buffer_cb_focus_in, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_FOCUS_OUT,
-                                 _ecore_evas_buffer_cb_focus_out, ee);
+                                  EVAS_CALLBACK_FOCUS_OUT,
+                                  _ecore_evas_buffer_cb_focus_out, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_SHOW,
-                                 _ecore_evas_buffer_cb_show, ee);
+                                  EVAS_CALLBACK_SHOW,
+                                  _ecore_evas_buffer_cb_show, ee);
    evas_object_event_callback_add(ee->engine.buffer.image,
-                                 EVAS_CALLBACK_HIDE,
-                                 _ecore_evas_buffer_cb_hide, ee);
+                                  EVAS_CALLBACK_HIDE,
+                                  _ecore_evas_buffer_cb_hide, ee);
    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
    if (einfo)
      {
-       einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
-       einfo->info.dest_buffer = ee->engine.buffer.pixels;
-       einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
-       einfo->info.use_color_key = 0;
-       einfo->info.alpha_threshold = 0;
-       einfo->info.func.new_update_region = NULL;
-       einfo->info.func.free_update_region = NULL;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
+        einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+        einfo->info.dest_buffer = ee->engine.buffer.pixels;
+        einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
+        einfo->info.use_color_key = 0;
+        einfo->info.alpha_threshold = 0;
+        einfo->info.func.new_update_region = NULL;
+        einfo->info.func.free_update_region = NULL;
+        evas_object_image_data_set(o, ee->engine.buffer.pixels);
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
      }
    evas_key_modifier_add(ee->evas, "Shift");
    evas_key_modifier_add(ee->evas, "Control");
@@ -645,7 +827,8 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target)
    evas_key_lock_add(ee->evas, "Num_Lock");
    evas_key_lock_add(ee->evas, "Scroll_Lock");
 
-   ee_target->sub_ecore_evas = evas_list_append(ee_target->sub_ecore_evas, ee);
+   ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
+
    return o;
 #else
    return NULL;
diff --git a/src/lib/ecore_evas/ecore_evas_cocoa.c b/src/lib/ecore_evas/ecore_evas_cocoa.c
new file mode 100644 (file)
index 0000000..96ea1d4
--- /dev/null
@@ -0,0 +1,584 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "Ecore.h"
+#include "ecore_private.h"
+#include "Ecore_Input.h"
+#include "Ecore_Input_Evas.h"
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
+#include <Ecore_Cocoa.h>
+#include <Evas_Engine_GL_Cocoa.h>
+#endif
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
+
+// FIXME: this engine has lots of problems. only 1 window at a time, drawRect looks wrong, doesnt handle resizes and more
+
+static int                      _ecore_evas_init_count = 0;
+static Ecore_Evas               *ecore_evases = NULL;
+static Ecore_Event_Handler      *ecore_evas_event_handlers[4] = {
+  NULL, NULL, NULL, NULL
+};
+static Ecore_Idle_Enterer       *ecore_evas_idle_enterer = NULL;
+static Ecore_Poller             *ecore_evas_event = NULL;
+
+static const char               *ecore_evas_cocoa_default = "EFL Cocoa";
+
+
+static int
+_ecore_evas_cocoa_render(Ecore_Evas *ee)
+{
+   int rend = 0;
+   Eina_List *updates = NULL;
+   Eina_List *ll;
+   Ecore_Evas *ee2;
+
+   DBG("Render");
+
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+     {
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+     }
+
+   if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
+   updates = evas_render_updates(ee->evas);
+   if (ee->prop.avoid_damage)
+     {
+        updates = evas_render_updates(ee->evas);
+        if (updates) evas_render_updates_free(updates);
+     }
+   else if ((ee->visible) ||
+            ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
+            ((ee->should_be_visible) && (ee->prop.override)))
+     {
+        if (ee->shaped)
+          {
+             updates = evas_render_updates(ee->evas);
+             if (updates) evas_render_updates_free(updates);
+          }
+        else
+          {
+             updates = evas_render_updates(ee->evas);
+             if (updates) evas_render_updates_free(updates);
+          }
+     }
+   else
+     evas_norender(ee->evas);
+   if (updates) rend = 1;
+   if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+
+   if (rend)
+     {
+        static int frames = 0;
+        static double t0 = 0.0;
+        double t, td;
+
+        t = ecore_time_get();
+        frames++;
+        if ((t - t0) > 1.0)
+          {
+             td = t - t0;
+             printf("FPS: %3.3f\n", (double)frames / td);
+             frames = 0;
+             t0 = t;
+          }
+     }
+
+   return rend;
+}
+
+
+static Ecore_Evas *
+_ecore_evas_cocoa_match(void)
+{
+  DBG("Match");
+  return ecore_evases;
+}
+
+static int
+_ecore_evas_cocoa_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+  Ecore_Evas                   *ee;
+
+  DBG("Got Focus");
+
+  ee = _ecore_evas_cocoa_match();
+
+  if (!ee) return ECORE_CALLBACK_PASS_ON;
+  ee->prop.focused = 1;
+  evas_focus_in(ee->evas);
+  if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+   
+  return ECORE_CALLBACK_PASS_ON;
+}
+
+static int
+_ecore_evas_cocoa_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+  Ecore_Evas                   *ee;
+
+  DBG("Lost Focus");
+
+  ee = _ecore_evas_cocoa_match();
+
+  if (!ee) return ECORE_CALLBACK_PASS_ON;
+  evas_focus_out(ee->evas);
+  ee->prop.focused = 0;
+  if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+
+  return ECORE_CALLBACK_PASS_ON;
+}
+
+static int
+_ecore_evas_cocoa_event_video_resize(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+  /*Ecore_Cocoa_Event_Video_Resize *e;
+   Ecore_Evas                   *ee;
+
+   e = event;
+   ee = _ecore_evas_cocoa_match();
+
+   if (!ee) return 1; // pass on event
+   evas_output_size_set(ee->evas, e->w, e->h);
+
+   return 0;*/
+
+  DBG("Video Resize");
+  return ECORE_CALLBACK_PASS_ON;
+}
+
+static int
+_ecore_evas_cocoa_event_video_expose(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
+{
+  Ecore_Evas                   *ee;
+  int                          w;
+  int                          h;
+
+  DBG("Video Expose");
+
+  ee = _ecore_evas_cocoa_match();
+
+  if (!ee) return ECORE_CALLBACK_PASS_ON;
+  evas_output_size_get(ee->evas, &w, &h);
+  evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
+
+  return ECORE_CALLBACK_PASS_ON;
+}
+
+static int
+_ecore_evas_idle_enter(void *data __UNUSED__)
+{
+  Ecore_Evas  *ee;
+  double       t1 = 0.;
+  double       t2 = 0.;
+
+  DBG("Idle enter");
+
+  EINA_INLIST_FOREACH(ecore_evases, ee)
+    {
+      if (ee->visible)
+       evas_render(ee->evas);
+      else
+       evas_norender(ee->evas);
+    }
+
+  return EINA_TRUE;
+}
+
+static int
+_ecore_evas_cocoa_event(void *data)
+{
+  //  ecore_cocoa_feed_events();
+
+  DBG("Cocoa Event");
+
+  return 1;
+}
+
+static int
+_ecore_evas_cocoa_init(void)
+{
+  DBG("Cocoa Init");
+  _ecore_evas_init_count++;
+  if (_ecore_evas_init_count > 1) 
+    return _ecore_evas_init_count;
+
+  ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_COCOA_EVENT_GOT_FOCUS, _ecore_evas_cocoa_event_got_focus, NULL);
+  ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_COCOA_EVENT_LOST_FOCUS, _ecore_evas_cocoa_event_lost_focus, NULL);
+  ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_COCOA_EVENT_RESIZE, _ecore_evas_cocoa_event_video_resize, NULL);
+  ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_COCOA_EVENT_EXPOSE, _ecore_evas_cocoa_event_video_expose, NULL);
+
+  ecore_event_evas_init();  
+  return _ecore_evas_init_count;
+}
+
+static int
+_ecore_evas_cocoa_shutdown(void)
+{
+  DBG("Cocoa SHutodwn");
+  _ecore_evas_init_count--;
+  if (_ecore_evas_init_count == 0)
+    {
+      int i;
+
+      while (ecore_evases) _ecore_evas_free(ecore_evases);
+
+      for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++)
+       ecore_event_handler_del(ecore_evas_event_handlers[i]);
+      ecore_event_evas_shutdown();
+      ecore_idle_enterer_del(ecore_evas_idle_enterer);
+      ecore_evas_idle_enterer = NULL;
+      ecore_poller_del(ecore_evas_event);
+      ecore_evas_event = NULL;
+
+      ecore_event_evas_shutdown();
+    }
+  if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+  return _ecore_evas_init_count;
+}
+
+static void
+_ecore_evas_cocoa_free(Ecore_Evas *ee)
+{
+  DBG("Cocoa Free");
+  ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
+  ecore_event_window_unregister(0);
+  _ecore_evas_cocoa_shutdown();
+  ecore_cocoa_shutdown();
+}
+
+static void
+_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
+{
+  DBG("Resize");
+  if ((w == ee->w) && (h == ee->h)) return;
+  ee->w = w;
+  ee->h = h;
+
+  printf("Ecore_Evas Resize %d %d\n", w, h);
+
+  ecore_cocoa_window_resize(ee->prop.window, w, h);
+
+  evas_output_size_set(ee->evas, ee->w, ee->h);
+  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+  evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+
+  if (ee->func.fn_resize) ee->func.fn_resize(ee);
+}
+
+static void
+_ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+  DBG("Move Resize");
+  if ((w == ee->w) && (h == ee->h)) return;
+  ee->w = w;
+  ee->h = h;
+
+  ecore_cocoa_window_move_resize(ee->prop.window, x, y, w, h);
+
+  evas_output_size_set(ee->evas, ee->w, ee->h);
+  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+  evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+
+  if (ee->func.fn_resize) ee->func.fn_resize(ee);
+}
+
+
+static void
+_ecore_evas_show(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+  DBG("Show");
+   ee->should_be_visible = 1;
+   if (ee->prop.avoid_damage)
+     _ecore_evas_cocoa_render(ee);
+
+   ecore_cocoa_window_show(ee->prop.window);
+   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+}
+
+
+static void
+_ecore_evas_hide(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+  DBG("Hide");
+
+   ecore_cocoa_window_hide(ee->prop.window);
+   ee->should_be_visible = 0;
+}
+
+static void
+_ecore_evas_title_set(Ecore_Evas *ee, const char *title)
+{
+   INF("ecore evas title set");
+
+   if (ee->prop.title) free(ee->prop.title);
+   ee->prop.title = NULL;
+   if (title) ee->prop.title = strdup(title);
+   ecore_cocoa_window_title_set(ee->prop.window,
+                                ee->prop.title);
+}
+
+static void
+_ecore_evas_object_cursor_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+  Ecore_Evas *ee;
+
+  DBG("Cursor DEL");
+
+  ee = data;
+  if (ee)
+    ee->prop.cursor.object = NULL;
+}
+
+static void
+_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
+{
+  int x, y;
+  DBG("Cursor Set");
+  if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
+
+  if (obj == NULL)
+    {
+      ee->prop.cursor.object = NULL;
+      ee->prop.cursor.layer = 0;
+      ee->prop.cursor.hot.x = 0;
+      ee->prop.cursor.hot.y = 0;
+      return;
+    }
+
+  ee->prop.cursor.object = obj;
+  ee->prop.cursor.layer = layer;
+  ee->prop.cursor.hot.x = hot_x;
+  ee->prop.cursor.hot.y = hot_y;
+
+  evas_pointer_output_xy_get(ee->evas, &x, &y);
+  evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
+  evas_object_move(ee->prop.cursor.object,
+                  x - ee->prop.cursor.hot.x,
+                  y - ee->prop.cursor.hot.y);
+
+  evas_object_pass_events_set(ee->prop.cursor.object, 1);
+
+  if (evas_pointer_inside_get(ee->evas))
+    evas_object_show(ee->prop.cursor.object);
+
+  evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+static int
+_ecore_evas_engine_cocoa_init(Ecore_Evas *ee)
+{
+   Evas_Engine_Info_GL_Cocoa *einfo;
+   const char                *driver;
+   int                        rmethod;
+
+   DBG("Cocoa Init");
+
+   driver = "gl_cocoa";
+
+   rmethod = evas_render_method_lookup(driver);
+   if (!rmethod)
+     return 0;
+
+   ee->driver = driver;
+   evas_output_method_set(ee->evas, rmethod);
+
+   einfo = (Evas_Engine_Info_GL_Cocoa *)evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+        /* FIXME: REDRAW_DEBUG missing for now */
+        einfo->window = ee->prop.window;
+        //einfo->info.depth = ecore_win32_screen_depth_get();
+        //einfo->info.rotation = 0;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             return 0;
+          }
+       ecore_cocoa_window_view_set(einfo->window, einfo->view);
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        return 0;
+     }
+
+   return 1;
+}
+
+static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
+  {
+    _ecore_evas_cocoa_free,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL, //move
+    NULL,
+    _ecore_evas_resize,
+    _ecore_evas_move_resize,
+    NULL, //rotation
+    NULL, //shaped
+    _ecore_evas_show,
+    _ecore_evas_hide,
+    NULL, //raise
+    NULL, //lower
+    NULL, //activate
+    _ecore_evas_title_set,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    _ecore_evas_object_cursor_set,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL, //transparent    
+    NULL, // profiles_set
+     
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+
+     NULL, // render
+     NULL,
+     NULL  // screen_dpi_get
+  };
+#endif
+
+EAPI Ecore_Evas *
+ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
+{
+#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
+  Evas_Engine_Info_GL_Cocoa *einfo;
+  Ecore_Evas           *ee;
+  int                  rmethod;
+
+  DBG("Cocoa new");
+
+  if (!ecore_cocoa_init())
+    return NULL;
+
+  ee = calloc(1, sizeof(Ecore_Evas));
+  if (!ee)
+    goto shutdown_ecore_cocoa;
+
+  ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+  _ecore_evas_cocoa_init();
+
+  ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_cocoa_engine_func;
+
+  if (w < 1) w = 1;
+  if (h < 1) h = 1;
+  ee->visible = 1;
+  ee->x = x;
+  ee->y = y;
+  ee->w = w;
+  ee->h = h;
+  ee->req.x = ee->x;
+  ee->req.y = ee->y;
+  ee->req.w = ee->w;
+  ee->req.h = ee->h;
+
+  ee->semi_sync = 1;
+
+
+  ee->prop.max.w = 32767;
+  ee->prop.max.h = 32767;
+  ee->prop.layer = 4;
+  ee->prop.request_pos = 0;
+  ee->prop.sticky = 0;
+  ee->prop.window = 0;
+
+  printf("Create New Evas\n");
+
+  ee->evas = evas_new();
+  
+  if (!ee->evas)
+    goto free_name;
+
+  evas_data_attach_set(ee->evas, ee);
+  evas_output_method_set(ee->evas, rmethod);
+  evas_output_size_set(ee->evas, w, h);
+  evas_output_viewport_set(ee->evas, 0, 0, w, h);
+
+  printf("Create New Cocoa Window\n");
+  ee->prop.window = (Ecore_Cocoa_Window*)ecore_cocoa_window_new(x, y, w, h);
+  printf("Window Created %p\n", ee->prop.window);
+  if (!ee->prop.window)
+    {
+      _ecore_evas_cocoa_shutdown();
+      free(ee);
+      return NULL;
+    }
+
+  printf("Init Evas engine cocoa\n");
+  if (!_ecore_evas_engine_cocoa_init(ee))
+    {
+      _ecore_evas_cocoa_shutdown();
+      free(ee);
+      return NULL;
+    }
+  
+  
+  ee->engine.func->fn_render = _ecore_evas_cocoa_render;
+  _ecore_evas_register(ee);
+  ecore_event_window_register(0, ee, ee->evas, NULL, NULL, NULL, NULL);
+  
+  evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
+  printf("Ecore Evas returned : %p\n", ee);
+  return ee;
+  
+ free_window:
+  /* FIXME: free window here */
+ free_evas:
+  free(ee->evas);
+ free_name:
+  free(ee->name);
+ free_ee:
+  _ecore_evas_cocoa_shutdown();
+  free(ee);
+ shutdown_ecore_cocoa:
+  ecore_cocoa_shutdown();
+  
+  return NULL;
+#else
+  ERR("Cocoa support in ecore-evas not enabled");
+  return NULL;
+  (void) parent;
+  (void) x; (void) y; (void) w; (void) h;
+#endif
+}
index 23723d9..d9fb237 100644 (file)
@@ -1,83 +1,59 @@
-#include "config.h"
-#include "Ecore.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <Ecore.h>
 #include "ecore_private.h"
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
-#include "Ecore_DirectFB.h"
+#include <Ecore_DirectFB.h>
 #endif
 
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
 
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
 static int _ecore_evas_init_count = 0;
-static int _ecore_evas_fps_debug = 0;
 static Ecore_Event_Handler *ecore_evas_event_handlers[13];
 
-static Ecore_Evas *ecore_evases = NULL;
-static Evas_Hash *ecore_evases_hash = NULL;
-
-static Ecore_Idle_Enterer *ecore_evas_directfb_idle_enterer = NULL;
+static Eina_Hash *ecore_evases_hash = NULL;
 
-static void
+static int
 _ecore_evas_directfb_render(Ecore_Evas *ee)
 {
-   Evas_List *updates, *ll;
-   
-#ifdef BUILD_ECORE_EVAS_BUFFER
-   for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
+   Eina_List *updates, *ll;
+   Ecore_Evas *ee2;
+   int rend = 0;
+
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
      {
-       Ecore_Evas *ee2;
-       
-       ee2 = ll->data;
-       if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
-       _ecore_evas_buffer_render(ee2);
-       if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
      }
-#endif
+
    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
    updates = evas_render_updates(ee->evas);
    if (updates)
      {
-       evas_render_updates_free(updates);
-       _ecore_evas_idle_timeout_update(ee);
+        evas_render_updates_free(updates);
+        _ecore_evas_idle_timeout_update(ee);
      }
    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
-}
 
-static int
-_ecore_evas_directfb_idle_enter(void *data __UNUSED__)
-{
-   Ecore_List2 *l;
-   double t1 = 0.;
-   double t2 = 0.;
-   
-   if (_ecore_evas_fps_debug)
-     {
-       t1 = ecore_time_get();
-     }
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-       
-       ee = (Ecore_Evas *)l;
-       _ecore_evas_directfb_render(ee);
-     }
-   if (_ecore_evas_fps_debug)
-     {
-       t2 = ecore_time_get();
-       _ecore_evas_fps_debug_rendertime_add(t2 - t1);
-     }
-   return 1;
+   return updates ? 1 : rend;
 }
 
 static char *
 _ecore_evas_directfb_winid_str_get(Ecore_X_Window win)
 {
-   const char *vals = "qWeRtYuIoP5-$&<~";
+   const char *vals = "qWeRtYuIoP5$&<~";
    static char id[9];
-   unsigned int val; 
+   unsigned int val;
    val = (unsigned int)win;
-   id[0] = vals[(val >> 28) & 0xf];    
+   id[0] = vals[(val >> 28) & 0xf];
    id[1] = vals[(val >> 24) & 0xf];
    id[2] = vals[(val >> 20) & 0xf];
    id[3] = vals[(val >> 16) & 0xf];
@@ -89,217 +65,179 @@ _ecore_evas_directfb_winid_str_get(Ecore_X_Window win)
    return id;
 }
 
-
 static Ecore_Evas *
 _ecore_evas_directfb_match(DFBWindowID win)
-{    
+{
    Ecore_Evas *ee;
-   
-   ee = evas_hash_find(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(win));
+
+   ee = eina_hash_find(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(win));
    return ee;
 }
-       
-static void 
-_ecore_evas_directfb_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
-{
-   ee->mouse.x = x;
-   ee->mouse.y = y;
-   
-   if (ee->prop.cursor.object)
-     {
-       evas_object_show(ee->prop.cursor.object);
-       if (ee->rotation == 0)
-         evas_object_move(ee->prop.cursor.object,x - ee->prop.cursor.hot.x,y - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 90)
-         evas_object_move(ee->prop.cursor.object,
-                           ee->h - y - 1 - ee->prop.cursor.hot.x,
-                           x - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 180)
-         evas_object_move(ee->prop.cursor.object,
-                           ee->w - x - 1 - ee->prop.cursor.hot.x,
-                           ee->h - y - 1 - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 270)
-         evas_object_move(ee->prop.cursor.object,
-                           y - ee->prop.cursor.hot.x,
-                           ee->w - x - 1 - ee->prop.cursor.hot.y);
-     }
-   if (ee->rotation == 0)
-     evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
-   else if (ee->rotation == 90)
-     evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
-   else if (ee->rotation == 180)
-     evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
-   else if (ee->rotation == 270)
-     evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
-}
 
-
-static int 
+static Eina_Bool
 _ecore_evas_directfb_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Key_Down *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
-   evas_event_feed_key_down(ee->evas, e->name, NULL, e->string, e->key_compose, e->time, NULL);
-   return 1;
+
+   if (!ee) return EINA_TRUE; /* pass on event */
+   evas_event_feed_key_down(ee->evas, e->name, e->name, e->string,
+                            e->key_compose, e->time, NULL);
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Key_Up *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
-   evas_event_feed_key_up(ee->evas, e->name, NULL, e->string, e->key_compose, e->time, NULL);
-   return 1;   
+
+   if (!ee) return EINA_TRUE; /* pass on event */
+   evas_event_feed_key_up(ee->evas, e->name, e->name, e->string,
+                          e->key_compose, e->time, NULL);
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_motion(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Motion *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
-   _ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
-   return 1;   
+
+   if (!ee) return EINA_TRUE; /* pass on event */
+   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Button_Down *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
-   // _ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
+
+   if (!ee) return EINA_TRUE; /* pass on event */
+   // _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
    evas_event_feed_mouse_down(ee->evas, e->button, EVAS_BUTTON_NONE, e->time, NULL);
-   return 1;   
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Button_Up *e;
    Evas_Button_Flags flags = EVAS_BUTTON_NONE;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
-   //_ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
+
+   if (!ee) return EINA_TRUE; /* pass on event */
+   //_ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
    evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
-   return 1;   
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_enter(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Enter *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
+
+   if (!ee) return EINA_TRUE; /* pass on event */
    evas_event_feed_mouse_in(ee->evas, e->time, NULL);
-   //_ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
-   return 1;   
+   //_ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_leave(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Leave *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
+
+   if (!ee) return EINA_TRUE; /* pass on event */
    evas_event_feed_mouse_out(ee->evas, e->time, NULL);
-   //_ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
+   //_ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
    if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
    if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
-   return 1;   
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Wheel *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
+
+   if (!ee) return EINA_TRUE; /* pass on event */
    evas_event_feed_mouse_wheel(ee->evas, e->direction, e->z, e->time, NULL);
-   return 1;   
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Got_Focus *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
+
+   if (!ee) return EINA_TRUE; /* pass on event */
    ee->prop.focused = 1;
-   return 1;   
+   return EINA_TRUE;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_directfb_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_DirectFB_Event_Lost_Focus *e;
-   
+
    e = event;
    ee = _ecore_evas_directfb_match(e->win);
-   
-   if (!ee) return 1; /* pass on event */
+
+   if (!ee) return EINA_TRUE; /* pass on event */
    ee->prop.focused = 0;
-   return 1;   
+   return EINA_TRUE;
 }
-       
+
 int
 _ecore_evas_directfb_shutdown(void)
 {
    _ecore_evas_init_count--;
    if (_ecore_evas_init_count == 0)
      {
-       int i;
-       
-       while (ecore_evases) _ecore_evas_free(ecore_evases);
-       for (i = 0; i < 8; i++)
-         ecore_event_handler_del(ecore_evas_event_handlers[i]);
-       ecore_idle_enterer_del(ecore_evas_directfb_idle_enterer);
-       ecore_evas_directfb_idle_enterer = NULL;
-       if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
+        int i;
+
+        for (i = 0; i < 8; i++)
+          ecore_event_handler_del(ecore_evas_event_handlers[i]);
      }
    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
    return _ecore_evas_init_count;
 }
-       
+
 
 
 
@@ -309,10 +247,7 @@ _ecore_evas_directfb_init(void)
 {
    _ecore_evas_init_count++;
    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
-   if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
-   ecore_evas_directfb_idle_enterer = ecore_idle_enterer_add(_ecore_evas_directfb_idle_enter, NULL);
-   if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
-   
+
    ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, _ecore_evas_directfb_event_key_down, NULL);
    ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_UP, _ecore_evas_directfb_event_key_up, NULL);
    ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_BUTTON_DOWN, _ecore_evas_directfb_event_button_down, NULL);
@@ -326,19 +261,18 @@ _ecore_evas_directfb_init(void)
    ecore_evas_event_handlers[10]  = NULL;
    ecore_evas_event_handlers[11]  = NULL;
    ecore_evas_event_handlers[12]  = NULL;
-   
+
    return _ecore_evas_init_count;
 }
 
 /* engine functions */
 /********************/
-       
+
 static void
 _ecore_evas_directfb_free(Ecore_Evas *ee)
 {
-   ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
-   ecore_directfb_window_del(ee->engine.directfb.window);
-   ecore_evases = _ecore_list2_remove(ecore_evases, ee);   
+   eina_hash_del(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
+   ecore_directfb_window_free(ee->engine.directfb.window);
    _ecore_evas_directfb_shutdown();
    ecore_directfb_shutdown();
 }
@@ -349,22 +283,24 @@ _ecore_evas_directfb_move(Ecore_Evas *ee, int x, int y)
    ecore_directfb_window_move(ee->engine.directfb.window, x, y);
 }
 
-static void 
+static void
 _ecore_evas_directfb_resize(Ecore_Evas *ee, int w, int h)
 {
+   ee->req.w = w;
+   ee->req.h = h;
    if ((w == ee->w) && (h == ee->h)) return;
    ecore_directfb_window_resize(ee->engine.directfb.window, w, h);
    ee->w = w;
    ee->h = h;
    if ((ee->rotation == 90) || (ee->rotation == 270))
      {
-       evas_output_size_set(ee->evas, ee->h, ee->w);
-       evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+        evas_output_size_set(ee->evas, ee->h, ee->w);
+        evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
      }
    else
      {
-       evas_output_size_set(ee->evas, ee->w, ee->h);
-       evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+        evas_output_size_set(ee->evas, ee->w, ee->h);
+        evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
      }
 }
 
@@ -398,25 +334,35 @@ _ecore_evas_directfb_shaped_set(Ecore_Evas *ee, int shaped)
      ecore_directfb_window_shaped_set(ee->engine.directfb.window, 1);
    else
      ecore_directfb_window_shaped_set(ee->engine.directfb.window, 0);
-   
+
+}
+
+static void
+_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = data;
+   if (ee)
+     ee->prop.cursor.object = NULL;
 }
 
 static void
 _ecore_evas_directfb_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
 {
    int x, y;
-   
+
    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
 
-   if (obj == NULL)
+   if (!obj)
      {
-       ee->prop.cursor.object = NULL;
-       ee->prop.cursor.layer = 0;
-       ee->prop.cursor.hot.x = 0;
-       ee->prop.cursor.hot.y = 0;
-       ecore_directfb_window_cursor_show(ee->engine.directfb.window, 1);
-       return;
-       
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        ecore_directfb_window_cursor_show(ee->engine.directfb.window, 1);
+        return;
+
      }
 
    ee->prop.cursor.object = obj;
@@ -432,6 +378,8 @@ _ecore_evas_directfb_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int lay
    evas_object_pass_events_set(ee->prop.cursor.object, 1);
    if (evas_pointer_inside_get(ee->evas))
      evas_object_show(ee->prop.cursor.object);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
 }
 
 static void
@@ -441,10 +389,10 @@ _ecore_evas_directfb_fullscreen_set(Ecore_Evas *ee, int on)
    int w;
    int h;
    int resized = 0;
-   
-   if (((ee->prop.fullscreen) && (on)) || ((!ee->prop.fullscreen) && (!on))) 
+
+   if (((ee->prop.fullscreen) && (on)) || ((!ee->prop.fullscreen) && (!on)))
      return;
-   
+
    if (on)
      ecore_directfb_window_fullscreen_set(ee->engine.directfb.window, 1);
    else
@@ -453,139 +401,150 @@ _ecore_evas_directfb_fullscreen_set(Ecore_Evas *ee, int on)
    ecore_directfb_window_size_get(ee->engine.directfb.window, &w, &h);
    if( (ee->w != w) || (ee->h != h))
      {
-       resized = 1;
-       ee->w = w;
-       ee->h = h;
-       if ((ee->rotation == 90) || (ee->rotation == 270))
-         {
-            evas_output_size_set(ee->evas, ee->h, ee->w);
-            evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
-         }
-       else
-         {
-            evas_output_size_set(ee->evas, ee->w, ee->h);
-            evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-         }
+        resized = 1;
+        ee->w = w;
+        ee->h = h;
+        ee->req.w = ee->w;
+        ee->req.h = ee->h;
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, ee->h, ee->w);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+          }
+        else
+          {
+             evas_output_size_set(ee->evas, ee->w, ee->h);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+          }
      }
    einfo = (Evas_Engine_Info_DirectFB *)evas_engine_info_get(ee->evas);
    if (einfo)
      {
-       einfo->info.surface = ee->engine.directfb.window->surface;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        einfo->info.surface = ee->engine.directfb.window->surface;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
      }
    ee->prop.fullscreen = on;
    if (resized)
      {
-       if(ee->func.fn_resize) ee->func.fn_resize(ee);
+        if(ee->func.fn_resize) ee->func.fn_resize(ee);
      }
 }
-#endif
 
 static void *
-_ecore_evas_directfb_window_get(Ecore_Evas *ee)
+_ecore_evas_directfb_window_get(const Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_DIRECTFB
    return ee->engine.directfb.window;
-#else
-   return 0;
-#endif
 }
+#endif
 
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
-static const Ecore_Evas_Engine_Func _ecore_directfb_engine_func =
+static Ecore_Evas_Engine_Func _ecore_directfb_engine_func =
 {
-   _ecore_evas_directfb_free,  /* free an ecore_evas */
-     NULL,                             /* cb resize */
-     NULL,                             /* cb move */
-     NULL,                             /* cb show */
-     NULL,                             /* cb hide */
-     NULL,                             /* cb delete request */
-     NULL,                             /* cb destroy */
-     NULL,                             /* cb focus in */
-     NULL,                             /* cb focus out */
+   _ecore_evas_directfb_free,        /* free an ecore_evas */
+     NULL,                                /* cb resize */
+     NULL,                                /* cb move */
+     NULL,                                /* cb show */
+     NULL,                                /* cb hide */
+     NULL,                                /* cb delete request */
+     NULL,                                /* cb destroy */
+     NULL,                                /* cb focus in */
+     NULL,                                /* cb focus out */
      NULL,                              /* cb sticky */
      NULL,                              /* cb unsticky */
-     NULL,                             /* cb mouse in */
-     NULL,                             /* cb mouse out */
-     NULL,                             /* cb pre render */
-     NULL,                             /* cb post render */
-     _ecore_evas_directfb_move,                /* move */
+     NULL,                                /* cb mouse in */
+     NULL,                                /* cb mouse out */
+     NULL,                                /* cb pre render */
+     NULL,                                /* cb post render */
+     _ecore_evas_directfb_move,                /* move */
      NULL,                              /* managed move */
-     _ecore_evas_directfb_resize,      /* resize */
-     NULL,                             /* move resize */
+     _ecore_evas_directfb_resize,        /* resize */
+     NULL,                                /* move resize */
      NULL,//_ecore_evas_directfb_rotation_set,/* rotation */
      _ecore_evas_directfb_shaped_set,   /* shaped */
-     _ecore_evas_directfb_show,                /* show */
-     _ecore_evas_directfb_hide,                /* hide */
-     NULL,                             /* raise */
-     NULL,                             /* lower */
-     NULL,                             /* activate */
-     NULL,                             /* title set */
-     NULL,                             /* name class set */
-     NULL,                             /* size min */
-     NULL,                             /* size max */
-     NULL,                             /* size base */
-     NULL,                             /* size step */
+     _ecore_evas_directfb_show,                /* show */
+     _ecore_evas_directfb_hide,                /* hide */
+     NULL,                                /* raise */
+     NULL,                                /* lower */
+     NULL,                                /* activate */
+     NULL,                                /* title set */
+     NULL,                                /* name class set */
+     NULL,                                /* size min */
+     NULL,                                /* size max */
+     NULL,                                /* size base */
+     NULL,                                /* size step */
      _ecore_evas_directfb_object_cursor_set, /* set cursor to an evas object */
-     NULL,                             /* layer set */
-     _ecore_evas_directfb_focus_set,   /* focus */
-     NULL,                             /* iconified */
-     NULL,                             /* borderless */
-     NULL,                             /* override */
-     NULL,                             /* maximized */
+     NULL,                                /* layer set */
+     _ecore_evas_directfb_focus_set,        /* focus */
+     NULL,                                /* iconified */
+     NULL,                                /* borderless */
+     NULL,                                /* override */
+     NULL,                                /* maximized */
      _ecore_evas_directfb_fullscreen_set,/* fullscreen */
-     NULL,                             /* avoid damage */
-     NULL,                             /* withdrawn */
-     NULL,                             /* sticky */
+     NULL,                                /* avoid damage */
+     NULL,                                /* withdrawn */
+     NULL,                                /* sticky */
      NULL,                              /* ignore events */
      NULL,                              /* alpha */
-     _ecore_evas_directfb_window_get    /* window_get */
+     NULL, //transparent
+     NULL, // profiles_set
+
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+
+     NULL, // render
+     NULL, // screen_geometry_get
+     NULL  // screen_dpi_get
 };
 #endif
 
 /* api */
 /*******/
 
-Ecore_DirectFB_Window *
-ecore_evas_directfb_window_get(Ecore_Evas *ee)
-{
-   return (Ecore_DirectFB_Window *) _ecore_evas_directfb_window_get(ee);
-}
-
+#ifdef BUILD_ECORE_EVAS_DIRECTFB
 EAPI Ecore_Evas *
 ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h)
 {
-#ifdef BUILD_ECORE_EVAS_DIRECTFB
    Evas_Engine_Info_DirectFB *einfo;
    Ecore_Evas *ee;
    Ecore_DirectFB_Window *window;
    int rmethod;
-   
+
    rmethod = evas_render_method_lookup("directfb");
    if (!rmethod) return NULL;
    if (!ecore_directfb_init(disp_name)) return NULL;
    ee = calloc(1, sizeof(Ecore_Evas));
    if (!ee) return NULL;
-   
+
    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
    _ecore_evas_directfb_init();
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_directfb_engine_func;
-   
+
    ee->driver = "directfb";
    if (disp_name) ee->name = strdup(disp_name);
-   
+
    if (w < 1) w = 1;
    if (h < 1) h = 1;
-   
+
    ee->rotation = 0;
    ee->visible = 1;
    ee->x = x;
    ee->y = y;
    ee->w = w;
    ee->h = h;
-   ee->prop.layer = 1; 
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
+   ee->prop.layer = 1;
    ee->prop.fullscreen = 0;
-   
+
    /* init evas here */
    ee->evas = evas_new();
    evas_data_attach_set(ee->evas, ee);
@@ -593,22 +552,55 @@ ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w
    evas_output_size_set(ee->evas, w, h);
    evas_output_viewport_set(ee->evas, 0, 0, w, h);
    einfo = (Evas_Engine_Info_DirectFB *)evas_engine_info_get(ee->evas);
-   
+
    window = ecore_directfb_window_new(x,y,w,h);
    ee->engine.directfb.window = window;
    if (einfo)
      {
-       einfo->info.dfb = ecore_directfb_interface_get();
-       einfo->info.surface = window->surface;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        einfo->info.dfb = ecore_directfb_interface_get();
+        einfo->info.surface = window->surface;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
      }
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
-   ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
-   
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
+     }
+
+   ee->engine.func->fn_render = _ecore_evas_directfb_render;
+   _ecore_evas_register(ee);
+
+   if (!ecore_evases_hash)
+     ecore_evases_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
+
    return ee;
+}
 #else
-   disp_name = NULL;
-   windowed = x = y = w = h = 0;
+EAPI Ecore_Evas *
+ecore_evas_directfb_new(const char *disp_name __UNUSED__, int windowed __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
    return NULL;
-#endif   
 }
+#endif
+
+#ifdef BUILD_ECORE_EVAS_DIRECTFB
+EAPI Ecore_DirectFB_Window *
+ecore_evas_directfb_window_get(const Ecore_Evas *ee)
+{
+   if (!(!strcmp(ee->driver, "directfb"))) return 0;
+   return (Ecore_DirectFB_Window *) _ecore_evas_directfb_window_get(ee);
+}
+#else
+EAPI Ecore_DirectFB_Window *
+ecore_evas_directfb_window_get(const Ecore_Evas *ee __UNUSED__)
+{
+  return NULL;
+}
+#endif
diff --git a/src/lib/ecore_evas/ecore_evas_ews.c b/src/lib/ecore_evas/ecore_evas_ews.c
new file mode 100644 (file)
index 0000000..d6969cf
--- /dev/null
@@ -0,0 +1,1469 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <Eina.h>
+#include <Ecore.h>
+#include "ecore_private.h"
+#include <Ecore_Input.h>
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+EAPI int ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_ADD = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_DEL = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_RESIZE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_MOVE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_SHOW = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_HIDE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_FOCUS = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_UNFOCUS = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_RAISE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_LOWER = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_ACTIVATE = 0;
+
+EAPI int ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_LAYER_CHANGE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE = 0;
+EAPI int ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = 0;
+
+#ifdef BUILD_ECORE_EVAS_EWS
+static int _ecore_evas_init_count = 0;
+
+static Ecore_Evas *_ews_ee = NULL;
+static Evas_Object *_ews_bg = NULL;
+static Eina_List *_ews_children = NULL;
+static const void *_ews_manager = NULL;
+static char *_ews_engine = NULL;
+static char *_ews_options = NULL;
+static int _ews_x = 0;
+static int _ews_y = 0;
+static int _ews_w = 1024;
+static int _ews_h = 768;
+static Eina_Bool _ews_defaults_engine = EINA_TRUE;
+static Eina_Bool _ews_defaults_geo = EINA_TRUE;
+
+static const char EWS_ENGINE_NAME[] = "ews";
+
+static void
+_ecore_evas_ews_pre_free(Ecore_Evas *ee __UNUSED__)
+{
+   DBG("EWS backing store free'd");
+   _ews_children = eina_list_free(_ews_children);
+   _ews_ee = NULL;
+   _ews_bg = NULL;
+}
+
+static void
+_ecore_evas_ews_del_request(Ecore_Evas *ee __UNUSED__)
+{
+   INF("EWS backing store deletion is forbidden!");
+}
+
+static Ecore_Evas *
+_ecore_evas_ews_ee_new(void)
+{
+   Ecore_Evas *ee = ecore_evas_new(_ews_engine, _ews_x, _ews_y, _ews_w, _ews_h,
+                                   _ews_options);
+   if (!ee)
+     ERR("Failed: ecore_evas_new(%s, %d, %d, %d, %d, %s)",
+         _ews_engine, _ews_x, _ews_y, _ews_w, _ews_h, _ews_options);
+   else
+     {
+        ecore_evas_size_min_set(ee, _ews_w, _ews_h);
+        ecore_evas_size_max_set(ee, _ews_w, _ews_h);
+        ecore_evas_callback_pre_free_set(ee, _ecore_evas_ews_pre_free);
+        ecore_evas_callback_delete_request_set(ee, _ecore_evas_ews_del_request);
+        ecore_evas_name_class_set(ee, "ecore_evas_ews", "ews");
+        ecore_evas_title_set
+          (ee, "EWS: Ecore + Evas Single Process Windowing System");
+        ecore_evas_show(ee);
+     }
+
+   return ee;
+}
+
+static void
+_ecore_evas_ews_env_setup(void)
+{
+   const char *env = getenv("ECORE_EVAS_EWS");
+   char *p, *n, *tmp;
+
+   if (_ews_defaults_engine)
+     {
+        free(_ews_engine);
+        _ews_engine = NULL;
+        free(_ews_options);
+        _ews_options = NULL;
+     }
+   if (_ews_defaults_geo)
+     {
+        _ews_x = 0;
+        _ews_y = 0;
+        _ews_w = 1024;
+        _ews_h = 768;
+     }
+
+   if ((!env) || (!*env)) return;
+
+   p = tmp = strdup(env);
+   if (!tmp) return;
+
+   n = strchr(p, ':');
+   if (n) *n = '\0';
+   if (_ews_defaults_engine) _ews_engine = strdup(p);
+   if (!n) goto end;
+
+   p = n + 1;
+   n = strchr(p, ':');
+   if (!n) goto end;
+   *n = '\0';
+   if (_ews_defaults_geo) _ews_x = atoi(p);
+
+   p = n + 1;
+   n = strchr(p, ':');
+   if (!n) goto end;
+   *n = '\0';
+   if (_ews_defaults_geo) _ews_y = atoi(p);
+
+   p = n + 1;
+   n = strchr(p, ':');
+   if (!n) goto end;
+   *n = '\0';
+   if (_ews_defaults_geo) _ews_w = atoi(p);
+
+   p = n + 1;
+   n = strchr(p, ':');
+   if (n) *n = '\0';
+   if (_ews_defaults_geo) _ews_h = atoi(p);
+   if (!n) goto end;
+
+   p = n + 1;
+   if (_ews_defaults_engine) _ews_options = strdup(p);
+
+ end:
+   free(tmp);
+}
+
+static void
+_ecore_evas_ews_event_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Evas *ee = ev;
+   _ecore_evas_unref(ee);
+}
+
+static void
+_ecore_evas_ews_event(Ecore_Evas *ee, int event)
+{
+   _ecore_evas_ref(ee);
+   ecore_event_add(event, ee, _ecore_evas_ews_event_free, NULL);
+}
+
+static void
+_ecore_evas_ews_event_free_del(void *data __UNUSED__, void *ev __UNUSED__)
+{
+   _ecore_evas_ews_shutdown();
+}
+
+static void
+_ecore_evas_ews_free(Ecore_Evas *ee)
+{
+   evas_object_del(ee->engine.ews.image);
+   _ews_ee->sub_ecore_evas = eina_list_remove(_ews_ee->sub_ecore_evas, ee);
+
+   ecore_event_add(ECORE_EVAS_EWS_EVENT_DEL, ee, _ecore_evas_ews_event_free_del, NULL);
+}
+
+static void
+_ecore_evas_ews_move(Ecore_Evas *ee, int x, int y)
+{
+   ee->req.x = x;
+   ee->req.y = y;
+
+   if ((x == ee->x) && (y == ee->y)) return;
+   ee->x = x;
+   ee->y = y;
+   evas_object_move(ee->engine.ews.image, x, y);
+   if (ee->func.fn_move) ee->func.fn_move(ee);
+
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MOVE);
+}
+
+static void
+_ecore_evas_ews_managed_move(Ecore_Evas *ee, int x, int y)
+{
+   ee->req.x = x;
+   ee->req.y = y;
+
+   if ((x == ee->x) && (y == ee->y)) return;
+   ee->x = x;
+   ee->y = y;
+   if (ee->func.fn_move) ee->func.fn_move(ee);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MOVE);
+}
+
+static void
+_ecore_evas_ews_resize_internal(Ecore_Evas *ee, int w, int h)
+{
+   Evas_Engine_Info_Buffer *einfo;
+   void *pixels;
+   int stride;
+
+   evas_output_size_set(ee->evas, w, h);
+   evas_output_viewport_set(ee->evas, 0, 0, w, h);
+   evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
+
+   evas_object_image_size_set(ee->engine.ews.image, w, h);
+   evas_object_image_fill_set(ee->engine.ews.image, 0, 0, w, h);
+   evas_object_resize(ee->engine.ews.image, w, h);
+
+   pixels = evas_object_image_data_get(ee->engine.ews.image, 1);
+   evas_object_image_data_set(ee->engine.ews.image, pixels); // refcount
+   stride = evas_object_image_stride_get(ee->engine.ews.image);
+
+   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
+   EINA_SAFETY_ON_NULL_RETURN(einfo);
+
+   einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+   einfo->info.dest_buffer = pixels;
+   einfo->info.dest_buffer_row_bytes = stride;
+   einfo->info.use_color_key = 0;
+   einfo->info.alpha_threshold = 0;
+   einfo->info.func.new_update_region = NULL;
+   einfo->info.func.free_update_region = NULL;
+   evas_object_image_data_set(ee->engine.ews.image, pixels);
+   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+     {
+        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+     }
+}
+
+static void
+_ecore_evas_ews_resize(Ecore_Evas *ee, int w, int h)
+{
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   ee->req.w = w;
+   ee->req.h = h;
+
+   if ((w == ee->w) && (h == ee->h)) return;
+   ee->w = w;
+   ee->h = h;
+   _ecore_evas_ews_resize_internal(ee, w, h);
+   if (ee->func.fn_resize) ee->func.fn_resize(ee);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_RESIZE);
+}
+
+static void
+_ecore_evas_ews_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+   _ecore_evas_ews_move(ee, x, y);
+   _ecore_evas_ews_resize(ee, w, h);
+}
+
+static void
+_ecore_evas_ews_rotation_set(Ecore_Evas *ee, int rot, int resize __UNUSED__)
+{
+   if (ee->rotation == rot) return;
+   ee->rotation = rot;
+
+   ERR("TODO: rot=%d, resize=%d", rot, resize);
+
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_shaped_set(Ecore_Evas *ee, int val)
+{
+   if (ee->shaped == val) return;
+   ee->shaped = val;
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_show(Ecore_Evas *ee)
+{
+   ee->should_be_visible = EINA_TRUE;
+   evas_object_show(ee->engine.ews.image);
+   if (ee->prop.fullscreen)
+     evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
+
+   if (ee->func.fn_show) ee->func.fn_show(ee);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_SHOW);
+}
+
+static void
+_ecore_evas_ews_hide(Ecore_Evas *ee)
+{
+   ee->should_be_visible = EINA_FALSE;
+   evas_object_hide(ee->engine.ews.image);
+
+   if (ee->func.fn_hide) ee->func.fn_hide(ee);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_HIDE);
+}
+
+static void
+_ecore_evas_ews_raise(Ecore_Evas *ee)
+{
+   evas_object_raise(ee->engine.ews.image);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_RAISE);
+}
+
+static void
+_ecore_evas_ews_lower(Ecore_Evas *ee)
+{
+   evas_object_lower(ee->engine.ews.image);
+   evas_object_lower(_ews_bg);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_LOWER);
+}
+
+static void
+_ecore_evas_ews_activate(Ecore_Evas *ee)
+{
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ACTIVATE);
+}
+
+static void
+_ecore_evas_ews_title_set(Ecore_Evas *ee, const char *t)
+{
+   if (ee->prop.title) free(ee->prop.title);
+   ee->prop.title = NULL;
+   if (t) ee->prop.title = strdup(t);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
+{
+   if (ee->prop.name) free(ee->prop.name);
+   if (ee->prop.clas) free(ee->prop.clas);
+   ee->prop.name = NULL;
+   ee->prop.clas = NULL;
+   if (n) ee->prop.name = strdup(n);
+   if (c) ee->prop.clas = strdup(c);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_size_min_set(Ecore_Evas *ee, int w, int h)
+{
+   if (w < 0) w = 0;
+   if (h < 0) h = 0;
+   if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
+   ee->prop.min.w = w;
+   ee->prop.min.h = h;
+   evas_object_size_hint_min_set(ee->engine.ews.image, w, h);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_size_max_set(Ecore_Evas *ee, int w, int h)
+{
+   if (w < 0) w = 0;
+   if (h < 0) h = 0;
+   if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
+   ee->prop.max.w = w;
+   ee->prop.max.h = h;
+   evas_object_size_hint_max_set(ee->engine.ews.image, w, h);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_size_base_set(Ecore_Evas *ee, int w, int h)
+{
+   if (w < 0) w = 0;
+   if (h < 0) h = 0;
+   if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
+   ee->prop.base.w = w;
+   ee->prop.base.h = h;
+   evas_object_size_hint_request_set(ee->engine.ews.image, w, h);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_size_step_set(Ecore_Evas *ee, int w, int h)
+{
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
+   ee->prop.step.w = w;
+   ee->prop.step.h = h;
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   ee->prop.cursor.object = NULL;
+}
+
+static void
+_ecore_evas_ews_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
+{
+   int x, y;
+
+   if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
+
+   if (!obj)
+     {
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        return;
+     }
+
+   ee->prop.cursor.object = obj;
+   ee->prop.cursor.layer = layer;
+   ee->prop.cursor.hot.x = hot_x;
+   ee->prop.cursor.hot.y = hot_y;
+   evas_pointer_output_xy_get(ee->evas, &x, &y);
+   evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
+   evas_object_move(ee->prop.cursor.object,
+                    x - ee->prop.cursor.hot.x,
+                    y - ee->prop.cursor.hot.y);
+   evas_object_pass_events_set(ee->prop.cursor.object, 1);
+   if (evas_pointer_inside_get(ee->evas))
+     evas_object_show(ee->prop.cursor.object);
+
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_DEL, _ecore_evas_ews_object_cursor_del, ee);
+
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_layer_set(Ecore_Evas *ee, int layer)
+{
+   if (layer < EVAS_LAYER_MIN + 1)
+     layer = EVAS_LAYER_MIN + 1;
+   else if (layer > EVAS_LAYER_MAX)
+     layer = EVAS_LAYER_MAX;
+
+   if (ee->prop.layer == layer) return;
+   ee->prop.layer = layer;
+   evas_object_layer_set(ee->engine.ews.image, layer);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_LAYER_CHANGE);
+}
+
+static void
+_ecore_evas_ews_focus_set(Ecore_Evas *ee, int val)
+{
+   evas_object_focus_set(ee->engine.ews.image, val);
+   ee->prop.focused = val;
+   if (val)
+     {
+        evas_focus_in(ee->evas);
+        if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+        _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_FOCUS);
+     }
+   else
+     {
+        evas_focus_out(ee->evas);
+        if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+        _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_UNFOCUS);
+     }
+}
+
+static void
+_ecore_evas_ews_iconified_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.iconified == val) return;
+   ee->prop.iconified = val;
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE);
+}
+
+static void
+_ecore_evas_ews_borderless_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.borderless == val) return;
+   ee->prop.borderless = val;
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_override_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.override == val) return;
+   if (ee->visible) evas_object_show(ee->engine.ews.image);
+   if (ee->prop.focused) evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
+   ee->prop.override = val;
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_maximized_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.maximized == val) return;
+   ee->prop.maximized = val;
+   if (val) evas_object_show(ee->engine.ews.image);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE);
+}
+
+static void
+_ecore_evas_ews_fullscreen_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.fullscreen == val) return;
+   ee->prop.fullscreen = val;
+
+   if (!val)
+     {
+        evas_object_move(ee->engine.ews.image, ee->x, ee->y);
+        evas_object_resize(ee->engine.ews.image, ee->w, ee->h);
+     }
+   else
+     {
+        Evas_Coord w, h;
+        ecore_evas_geometry_get(_ews_ee, NULL, NULL, &w, &h);
+        evas_object_move(ee->engine.ews.image, 0, 0);
+        evas_object_resize(ee->engine.ews.image, w, h);
+        evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
+     }
+
+   if (ee->should_be_visible)
+     evas_object_show(ee->engine.ews.image);
+   else
+     evas_object_hide(ee->engine.ews.image);
+
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE);
+}
+
+static void
+_ecore_evas_ews_avoid_damage_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.avoid_damage == val) return;
+   ee->prop.avoid_damage = val;
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_withdrawn_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.withdrawn == val) return;
+   ee->prop.withdrawn = val;
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_sticky_set(Ecore_Evas *ee, int val)
+{
+   if (ee->prop.sticky == val) return;
+   ee->prop.sticky = val;
+   if ((val) && (ee->func.fn_sticky)) ee->func.fn_sticky(ee);
+   else if ((!val) && (ee->func.fn_unsticky)) ee->func.fn_unsticky(ee);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_ignore_events_set(Ecore_Evas *ee, int val)
+{
+   if (ee->ignore_events == val) return;
+   ee->ignore_events = val;
+   evas_object_pass_events_set(ee->engine.ews.image, val);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_alpha_set(Ecore_Evas *ee, int val)
+{
+   if (ee->alpha == val) return;
+   ee->alpha = val;
+   evas_object_image_alpha_set(ee->engine.ews.image, val);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static void
+_ecore_evas_ews_transparent_set(Ecore_Evas *ee, int val)
+{
+   if (ee->transparent == val) return;
+   ee->transparent = val;
+   evas_object_image_alpha_set(ee->engine.ews.image, val);
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
+static int
+_ecore_evas_ews_render(Ecore_Evas *ee)
+{
+   Eina_List *updates = NULL, *l, *ll;
+   Ecore_Evas *ee2;
+   Eina_Rectangle *r;
+   int w, h, rend = 0;
+   void *pixels;
+   
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+     {
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        rend |= _ecore_evas_ews_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+     }
+
+   evas_object_image_size_get(ee->engine.ews.image, &w, &h);
+   if ((w != ee->w) || (h != ee->h))
+     ecore_evas_resize(ee, w, h);
+
+   pixels = evas_object_image_data_get(ee->engine.ews.image, 1);
+   if (pixels)
+     {
+        updates = evas_render_updates(ee->evas);
+     }
+   evas_object_image_data_set(ee->engine.ews.image, pixels);
+   
+   EINA_LIST_FOREACH(updates, l, r)
+     evas_object_image_data_update_add(ee->engine.ews.image,
+                                       r->x, r->y, r->w, r->h);
+
+   if (updates)
+     {
+        evas_render_updates_free(updates);
+        _ecore_evas_idle_timeout_update(ee);
+     }
+
+   return updates ? 1 : rend;
+}
+
+static void
+_ecore_evas_ews_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
+{
+   ecore_evas_geometry_get(_ews_ee, x, y, w, h);
+}
+
+static const Ecore_Evas_Engine_Func _ecore_ews_engine_func =
+{
+     _ecore_evas_ews_free,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     _ecore_evas_ews_move,
+     _ecore_evas_ews_managed_move,
+     _ecore_evas_ews_resize,
+     _ecore_evas_ews_move_resize,
+     _ecore_evas_ews_rotation_set,
+     _ecore_evas_ews_shaped_set,
+     _ecore_evas_ews_show,
+     _ecore_evas_ews_hide,
+     _ecore_evas_ews_raise,
+     _ecore_evas_ews_lower,
+     _ecore_evas_ews_activate,
+     _ecore_evas_ews_title_set,
+     _ecore_evas_ews_name_class_set,
+     _ecore_evas_ews_size_min_set,
+     _ecore_evas_ews_size_max_set,
+     _ecore_evas_ews_size_base_set,
+     _ecore_evas_ews_size_step_set,
+     _ecore_evas_ews_object_cursor_set,
+     _ecore_evas_ews_layer_set,
+     _ecore_evas_ews_focus_set,
+     _ecore_evas_ews_iconified_set,
+     _ecore_evas_ews_borderless_set,
+     _ecore_evas_ews_override_set,
+     _ecore_evas_ews_maximized_set,
+     _ecore_evas_ews_fullscreen_set,
+     _ecore_evas_ews_avoid_damage_set,
+     _ecore_evas_ews_withdrawn_set,
+     _ecore_evas_ews_sticky_set,
+     _ecore_evas_ews_ignore_events_set,
+     _ecore_evas_ews_alpha_set,
+     _ecore_evas_ews_transparent_set,
+     NULL, // profiles_set
+   
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+
+     _ecore_evas_ews_render,
+     _ecore_evas_ews_screen_geometry_get,
+     NULL  // screen_dpi_get
+};
+
+void
+_ecore_evas_ews_events_init(void)
+{
+   if (ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE != 0) return;
+   ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_ADD = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_DEL = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_RESIZE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_MOVE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_SHOW = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_HIDE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_FOCUS = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_UNFOCUS = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_RAISE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_LOWER = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_ACTIVATE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_LAYER_CHANGE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE = ecore_event_type_new();
+   ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = ecore_event_type_new();
+}
+
+static int
+_ecore_evas_ews_init(void)
+{
+   _ecore_evas_init_count++;
+   if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
+
+   _ecore_evas_ews_env_setup();
+
+   return _ecore_evas_init_count;
+}
+
+int
+_ecore_evas_ews_shutdown(void)
+{
+   _ecore_evas_init_count--;
+   if (_ecore_evas_init_count == 0)
+     {
+        if (_ews_ee)
+          {
+             ecore_evas_free(_ews_ee);
+             _ews_ee = NULL;
+          }
+        if (_ews_children)
+          {
+             eina_list_free(_ews_children);
+             _ews_children = NULL;
+          }
+
+        free(_ews_engine);
+        _ews_engine = NULL;
+        free(_ews_options);
+        _ews_options = NULL;
+        _ews_defaults_engine = EINA_TRUE;
+        _ews_defaults_geo = EINA_TRUE;
+
+     }
+   if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+   return _ecore_evas_init_count;
+}
+
+static void
+_ecore_evas_ews_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
+{
+   Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
+
+   evas_object_geometry_get(ee->engine.ews.image, &xx, &yy, &ww, &hh);
+   evas_object_image_fill_get(ee->engine.ews.image, &fx, &fy, &fw, &fh);
+
+   if (fw < 1) fw = 1;
+   if (fh < 1) fh = 1;
+
+   if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
+     {
+        *x = (ee->w * (*x - xx)) / fw;
+        *y = (ee->h * (*y - yy)) / fh;
+     }
+   else
+     {
+        xx = (*x - xx) - fx;
+        while (xx < 0) xx += fw;
+        while (xx > fw) xx -= fw;
+        *x = (ee->w * xx) / fw;
+
+        yy = (*y - yy) - fy;
+        while (yy < 0) yy += fh;
+        while (yy > fh) yy -= fh;
+        *y = (ee->h * yy) / fh;
+     }
+}
+
+static void
+_ecore_evas_ews_modifiers_apply(Ecore_Evas *ee, const Evas_Modifier *modifier)
+{
+   Evas *e = ee->evas;
+
+   if (evas_key_modifier_is_set(modifier, "Shift"))
+     evas_key_modifier_on(e, "Shift");
+   else evas_key_modifier_off(e, "Shift");
+
+   if (evas_key_modifier_is_set(modifier, "Control"))
+     evas_key_modifier_on(e, "Control");
+   else evas_key_modifier_off(e, "Control");
+
+   if (evas_key_modifier_is_set(modifier, "Alt"))
+     evas_key_modifier_on(e, "Alt");
+   else evas_key_modifier_off(e, "Alt");
+
+   if (evas_key_modifier_is_set(modifier, "Super"))
+     evas_key_modifier_on(e, "Super");
+   else evas_key_modifier_off(e, "Super");
+
+   if (evas_key_modifier_is_set(modifier, "Hyper"))
+     evas_key_modifier_on(e, "Hyper");
+   else evas_key_modifier_off(e, "Hyper");
+
+   if (evas_key_modifier_is_set(modifier, "Scroll_Lock"))
+     evas_key_lock_on(e, "Scroll_Lock");
+   else evas_key_lock_off(e, "Scroll_Lock");
+
+   if (evas_key_modifier_is_set(modifier, "Num_Lock"))
+     evas_key_lock_on(e, "Num_Lock");
+   else evas_key_lock_off(e, "Num_Lock");
+
+   if (evas_key_modifier_is_set(modifier, "Caps_Lock"))
+     evas_key_lock_on(e, "Caps_Lock");
+   else evas_key_lock_off(e, "Caps_Lock");
+
+   if (evas_key_modifier_is_set(modifier, "Shift_Lock"))
+     evas_key_lock_on(e, "Shift_Lock");
+   else evas_key_lock_off(e, "Shift_Lock");
+}
+
+static void
+_ecore_evas_ews_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_In *ev = event_info;
+   Evas_Coord x = ev->canvas.x;
+   Evas_Coord y = ev->canvas.y;
+   _ecore_evas_ews_coord_translate(ee, &x, &y);
+   if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
+   _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
+}
+
+static void
+_ecore_evas_ews_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Out *ev = event_info;
+   Evas_Coord x = ev->canvas.x;
+   Evas_Coord y = ev->canvas.y;
+   // TODO: consider grab mode in EWS
+   _ecore_evas_ews_coord_translate(ee, &x, &y);
+   if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
+   if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
+   _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
+}
+
+static void
+_ecore_evas_ews_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Down *ev = event_info;
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Up *ev = event_info;
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+   Evas_Coord x = ev->cur.canvas.x;
+   Evas_Coord y = ev->cur.canvas.y;
+   _ecore_evas_ews_coord_translate(ee, &x, &y);
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
+}
+
+static void
+_ecore_evas_ews_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Wheel *ev = event_info;
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Multi_Down *ev = event_info;
+   Evas_Coord x, y, xx, yy;
+   double xf, yf;
+
+   x = ev->canvas.x;
+   y = ev->canvas.y;
+   xx = x;
+   yy = y;
+   _ecore_evas_ews_coord_translate(ee, &x, &y);
+   xf = (ev->canvas.xsub - (double)xx) + (double)x;
+   yf = (ev->canvas.ysub - (double)yy) + (double)y;
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_multi_down(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Multi_Up *ev = event_info;
+   Evas_Coord x, y, xx, yy;
+   double xf, yf;
+
+   x = ev->canvas.x;
+   y = ev->canvas.y;
+   xx = x;
+   yy = y;
+   _ecore_evas_ews_coord_translate(ee, &x, &y);
+   xf = (ev->canvas.xsub - (double)xx) + (double)x;
+   yf = (ev->canvas.ysub - (double)yy) + (double)y;
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_multi_up(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Multi_Move *ev = event_info;
+   Evas_Coord x, y, xx, yy;
+   double xf, yf;
+
+   x = ev->cur.canvas.x;
+   y = ev->cur.canvas.y;
+   xx = x;
+   yy = y;
+   _ecore_evas_ews_coord_translate(ee, &x, &y);
+   xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
+   yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
+   _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
+   evas_event_feed_multi_move(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   if (ee->driver) _ecore_evas_free(ee);
+}
+
+static void
+_ecore_evas_ews_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Key_Down *ev = event_info;
+
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
+     evas_key_modifier_on(ee->evas, "Shift");
+   else
+     evas_key_modifier_off(ee->evas, "Shift");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
+     evas_key_modifier_on(ee->evas, "Control");
+   else
+     evas_key_modifier_off(ee->evas, "Control");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
+     evas_key_modifier_on(ee->evas, "Alt");
+   else
+     evas_key_modifier_off(ee->evas, "Alt");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
+     evas_key_modifier_on(ee->evas, "Meta");
+   else
+     evas_key_modifier_off(ee->evas, "Meta");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
+     evas_key_modifier_on(ee->evas, "Hyper");
+   else
+     evas_key_modifier_off(ee->evas, "Hyper");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
+     evas_key_modifier_on(ee->evas, "Super");
+   else
+     evas_key_modifier_off(ee->evas, "Super");
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
+     evas_key_lock_on(ee->evas, "Scroll_Lock");
+   else
+     evas_key_lock_off(ee->evas, "Scroll_Lock");
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
+     evas_key_lock_on(ee->evas, "Num_Lock");
+   else
+     evas_key_lock_off(ee->evas, "Num_Lock");
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
+     evas_key_lock_on(ee->evas, "Caps_Lock");
+   else
+     evas_key_lock_off(ee->evas, "Caps_Lock");
+   evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Key_Up *ev = event_info;
+
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
+     evas_key_modifier_on(ee->evas, "Shift");
+   else
+     evas_key_modifier_off(ee->evas, "Shift");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
+     evas_key_modifier_on(ee->evas, "Control");
+   else
+     evas_key_modifier_off(ee->evas, "Control");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
+     evas_key_modifier_on(ee->evas, "Alt");
+   else
+     evas_key_modifier_off(ee->evas, "Alt");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
+     evas_key_modifier_on(ee->evas, "Meta");
+   else
+     evas_key_modifier_off(ee->evas, "Meta");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
+     evas_key_modifier_on(ee->evas, "Hyper");
+   else
+     evas_key_modifier_off(ee->evas, "Hyper");
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
+     evas_key_modifier_on(ee->evas, "Super");
+   else
+     evas_key_modifier_off(ee->evas, "Super");
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
+     evas_key_lock_on(ee->evas, "Scroll_Lock");
+   else
+     evas_key_lock_off(ee->evas, "Scroll_Lock");
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
+     evas_key_lock_on(ee->evas, "Num_Lock");
+   else
+     evas_key_lock_off(ee->evas, "Num_Lock");
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
+     evas_key_lock_on(ee->evas, "Caps_Lock");
+   else
+     evas_key_lock_off(ee->evas, "Caps_Lock");
+   evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
+}
+
+static void
+_ecore_evas_ews_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   ecore_evas_focus_set(ee, EINA_TRUE);
+}
+
+static void
+_ecore_evas_ews_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   if (ee->deleted) return;
+   ecore_evas_focus_set(ee, EINA_FALSE);
+}
+
+static void
+_ecore_evas_ews_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   ecore_evas_show(ee);
+}
+
+static void
+_ecore_evas_ews_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   if (ee->deleted) return;
+   ecore_evas_hide(ee);
+}
+#endif
+
+EAPI Ecore_Evas *
+ecore_evas_ews_new(int x, int y, int w, int h)
+{
+// basically a copy of ecore_evas_buffer_new() keep in sync...
+#ifdef BUILD_ECORE_EVAS_EWS
+   Evas_Object *o;
+   Evas_Engine_Info_Buffer *einfo;
+   Ecore_Evas *ee;
+   int rmethod;
+
+   if (_ecore_evas_ews_init() < 1) return NULL;
+
+   if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
+   if (!_ews_ee)
+     {
+        ERR("Could not create EWS backing store");
+        _ecore_evas_ews_shutdown();
+        return NULL;
+     }
+
+   rmethod = evas_render_method_lookup("buffer");
+   if (!rmethod) return NULL;
+   ee = calloc(1, sizeof(Ecore_Evas));
+   if (!ee) return NULL;
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   o = evas_object_image_add(_ews_ee->evas);
+   evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
+   evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
+   evas_object_image_size_set(o, w, h);
+   evas_object_image_alpha_set(o, 1);
+
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_ews_engine_func;
+
+   ee->driver = EWS_ENGINE_NAME;
+
+   ee->x = 0;
+   ee->y = 0;
+   ee->w = w;
+   ee->h = h;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
+
+   /* init evas here */
+   ee->evas = evas_new();
+   evas_data_attach_set(ee->evas, ee);
+   evas_output_method_set(ee->evas, rmethod);
+   evas_output_size_set(ee->evas, w, h);
+   evas_output_viewport_set(ee->evas, 0, 0, w, h);
+
+   evas_object_move(o, x, y);
+   evas_object_resize(o, w, h);
+   evas_object_image_fill_set(o, 0, 0, w, h);
+
+   ee->engine.ews.image = o;
+   evas_object_data_set(ee->engine.ews.image, "Ecore_Evas", ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MOUSE_IN,
+                                  _ecore_evas_ews_cb_mouse_in, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MOUSE_OUT,
+                                  _ecore_evas_ews_cb_mouse_out, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MOUSE_DOWN,
+                                  _ecore_evas_ews_cb_mouse_down, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MOUSE_UP,
+                                  _ecore_evas_ews_cb_mouse_up, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MOUSE_MOVE,
+                                  _ecore_evas_ews_cb_mouse_move, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MOUSE_WHEEL,
+                                  _ecore_evas_ews_cb_mouse_wheel, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MULTI_DOWN,
+                                  _ecore_evas_ews_cb_multi_down, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MULTI_UP,
+                                  _ecore_evas_ews_cb_multi_up, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_MULTI_MOVE,
+                                  _ecore_evas_ews_cb_multi_move, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_FREE,
+                                  _ecore_evas_ews_cb_free, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_KEY_DOWN,
+                                  _ecore_evas_ews_cb_key_down, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_KEY_UP,
+                                  _ecore_evas_ews_cb_key_up, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_FOCUS_IN,
+                                  _ecore_evas_ews_cb_focus_in, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_FOCUS_OUT,
+                                  _ecore_evas_ews_cb_focus_out, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_SHOW,
+                                  _ecore_evas_ews_cb_show, ee);
+   evas_object_event_callback_add(ee->engine.ews.image,
+                                  EVAS_CALLBACK_HIDE,
+                                  _ecore_evas_ews_cb_hide, ee);
+   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+        void *pixels = evas_object_image_data_get(o, 1);
+        evas_object_image_data_set(o, pixels); // refcount
+        einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+        einfo->info.dest_buffer = pixels;
+        einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
+        einfo->info.use_color_key = 0;
+        einfo->info.alpha_threshold = 0;
+        einfo->info.func.new_update_region = NULL;
+        einfo->info.func.free_update_region = NULL;
+        evas_object_image_data_set(o, pixels);
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
+     }
+   evas_key_modifier_add(ee->evas, "Shift");
+   evas_key_modifier_add(ee->evas, "Control");
+   evas_key_modifier_add(ee->evas, "Alt");
+   evas_key_modifier_add(ee->evas, "Meta");
+   evas_key_modifier_add(ee->evas, "Hyper");
+   evas_key_modifier_add(ee->evas, "Super");
+   evas_key_lock_add(ee->evas, "Caps_Lock");
+   evas_key_lock_add(ee->evas, "Num_Lock");
+   evas_key_lock_add(ee->evas, "Scroll_Lock");
+
+   _ews_ee->sub_ecore_evas = eina_list_append(_ews_ee->sub_ecore_evas, ee);
+   _ews_children = eina_list_append(_ews_children, ee);
+
+   _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ADD);
+
+   return ee;
+#else
+   return NULL;
+   (void)x;
+   (void)y;
+   (void)w;
+   (void)h;
+#endif
+}
+
+EAPI Evas_Object *
+ecore_evas_ews_backing_store_get(const Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_ews_backing_store_get");
+        return NULL;
+     }
+   return ee->engine.ews.image;
+#else
+   return NULL;
+   (void)ee;
+#endif
+}
+
+EAPI void
+ecore_evas_ews_delete_request(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_ews_delete_request");
+        return;
+     }
+   if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
+   else ecore_evas_free(ee);
+#else
+   (void)ee;
+#endif
+}
+
+
+EAPI Eina_Bool
+ecore_evas_ews_engine_set(const char *engine, const char *options)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   if (_ews_ee) return EINA_FALSE;
+
+   free(_ews_engine);
+   free(_ews_options);
+
+   _ews_engine = engine ? strdup(engine) : NULL;
+   _ews_options = options ? strdup(options) : NULL;
+
+   if ((engine) && (!_ews_engine)) return EINA_FALSE;
+   if ((options) && (!_ews_options)) return EINA_FALSE;
+
+   _ews_defaults_engine = EINA_FALSE;
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+   (void)engine;
+   (void)options;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_evas_ews_setup(int x, int y, int w, int h)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   Eina_Bool ret = EINA_TRUE;
+
+   _ews_defaults_geo = EINA_FALSE;
+   _ews_x = x;
+   _ews_y = y;
+   _ews_w = w;
+   _ews_h = h;
+
+   if (!_ews_ee) return EINA_TRUE;
+
+   /* move-resize is not as implemented as move + resize */
+   ecore_evas_move(_ews_ee, x, y);
+   ecore_evas_size_min_set(_ews_ee, w, h);
+   ecore_evas_size_max_set(_ews_ee, w, h);
+   ecore_evas_resize(_ews_ee, w, h);
+
+   ecore_evas_geometry_get(_ews_ee, &x, &y, &w, &h);
+
+#define TST(n) if ((n != _ews_##n))                     \
+     {                                                  \
+        WRN("Asked %d, got %d for "#n, _ews_##n, n);    \
+        ret = EINA_FALSE;                               \
+     }
+   TST(x);
+   TST(y);
+   TST(w);
+   TST(h);
+#undef TST
+   return ret;
+#else
+   return EINA_FALSE;
+   (void)x;
+   (void)y;
+   (void)w;
+   (void)h;
+#endif
+}
+
+EAPI Ecore_Evas *
+ecore_evas_ews_ecore_evas_get(void)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
+   return _ews_ee;
+#else
+   return NULL;
+#endif
+}
+
+EAPI Evas *
+ecore_evas_ews_evas_get(void)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   return ecore_evas_get(ecore_evas_ews_ecore_evas_get());
+#else
+   return NULL;
+#endif
+}
+
+EAPI Evas_Object *
+ecore_evas_ews_background_get(void)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   return _ews_bg;
+#else
+   return NULL;
+#endif
+}
+
+#ifdef BUILD_ECORE_EVAS_EWS
+static void
+_ecore_evas_ews_background_free(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
+{
+   _ews_bg = NULL;
+   ecore_evas_ews_background_set(NULL);
+}
+#endif
+
+EAPI void
+ecore_evas_ews_background_set(Evas_Object *o)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   if ((o) && (o == _ews_bg)) return;
+
+   if (_ews_bg)
+     {
+        evas_object_del(_ews_bg);
+        _ews_bg = NULL;
+     }
+
+   if ((!o) && (_ews_ee))
+     {
+        o = evas_object_rectangle_add(ecore_evas_get(_ews_ee));
+        evas_object_color_set(o, 0, 0, 0, 255);
+     }
+
+   if (_ews_ee)
+     {
+        Evas_Coord w, h;
+        Evas *e = ecore_evas_get(_ews_ee);
+
+        if (e != evas_object_evas_get(o))
+          {
+             ERR("background not in ecore_evas_ews_evas_get() canvas!");
+             return;
+          }
+
+        evas_output_viewport_get(e, NULL, NULL, &w, &h);
+        evas_object_move(o, 0, 0);
+        evas_object_resize(o, w, h);
+        evas_object_layer_set(o, EVAS_LAYER_MIN);
+        evas_object_lower(o);
+        evas_object_show(o);
+
+        evas_object_event_callback_add
+          (o, EVAS_CALLBACK_FREE, _ecore_evas_ews_background_free, NULL);
+     }
+
+   _ews_bg = o;
+#else
+   return;
+   (void)o;
+#endif
+}
+
+
+EAPI const Eina_List *
+ecore_evas_ews_children_get(void)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   return _ews_children;
+#else
+   return NULL;
+#endif
+}
+
+EAPI void
+ecore_evas_ews_manager_set(const void *manager)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   if (_ews_manager ==  manager) return;
+   _ews_manager = manager;
+   ecore_event_add(ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE, NULL, NULL, NULL);
+#else
+   (void)manager;
+#endif
+}
+
+EAPI const void *
+ecore_evas_ews_manager_get(void)
+{
+#ifdef BUILD_ECORE_EVAS_EWS
+   return _ews_manager;
+#else
+   return NULL;
+#endif
+}
diff --git a/src/lib/ecore_evas/ecore_evas_extn.c b/src/lib/ecore_evas/ecore_evas_extn.c
new file mode 100644 (file)
index 0000000..6113539
--- /dev/null
@@ -0,0 +1,2247 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <math.h>
+#include <time.h>
+#ifdef HAVE_SYS_MMAN_H
+# include <sys/mman.h>
+#endif
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/file.h>
+#include <unistd.h>
+
+#include <Ecore.h>
+#include "ecore_private.h"
+#include <Ecore_Input.h>
+
+#ifdef BUILD_ECORE_EVAS_EXTN
+
+#include <Ecore_Ipc.h>
+
+#endif
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+
+#ifdef BUILD_ECORE_EVAS_EXTN
+///Jiyoun: This code will be modified after opensource fix lockup issue
+#define EVAS_CALLBACK_CANVAS_OBJECT_RENDER_PRE 100
+#define EVAS_CALLBACK_CANVAS_OBJECT_RENDER_POST 101
+
+typedef struct _Shmfile Shmfile;
+
+struct _Shmfile
+{
+   int fd;
+   int size;
+   void *addr;
+   const char *file;
+};
+
+static int blank = 0x00000000;
+
+static Shmfile *
+shmfile_new(const char *base, int id, int size, Eina_Bool sys)
+{
+   Shmfile *sf;
+   char file[PATH_MAX];
+
+   sf = calloc(1, sizeof(Shmfile));
+   do
+     {
+        mode_t mode;
+
+        snprintf(file, sizeof(file), "/%s-%i-%i.%i.%i",
+                 base, id, (int)time(NULL), (int)getpid(), (int)rand());
+        mode = S_IRUSR | S_IWUSR;
+        if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+        sf->fd = shm_open(file, O_RDWR | O_CREAT | O_EXCL, mode);
+     }
+   while (sf->fd < 0);
+
+   sf->file = eina_stringshare_add(file);
+   if (!sf->file)
+     {
+        close(sf->fd);
+        shm_unlink(sf->file);
+        eina_stringshare_del(sf->file);
+        free(sf);
+        return NULL;
+     }
+   sf->size = size;
+   if (ftruncate(sf->fd, size) < 0)
+     {
+        close(sf->fd);
+        shm_unlink(sf->file);
+        eina_stringshare_del(sf->file);
+        free(sf);
+        return NULL;
+     }
+   sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
+   if (sf->addr == MAP_FAILED)
+     {
+        close(sf->fd);
+        shm_unlink(sf->file);
+        eina_stringshare_del(sf->file);
+        free(sf);
+        return NULL;
+     }
+   return sf;
+}
+
+void
+shmfile_free(Shmfile *sf)
+{
+   munmap(sf->addr, sf->size);
+   close(sf->fd);
+   shm_unlink(sf->file);
+   eina_stringshare_del(sf->file);
+   free(sf);
+}
+
+static Shmfile *
+shmfile_open(const char *ref, int size, Eina_Bool sys)
+{
+   Shmfile *sf;
+   mode_t mode;
+
+   sf = calloc(1, sizeof(Shmfile));
+   mode = S_IRUSR | S_IWUSR;
+   if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+   sf->fd = shm_open(ref, O_RDWR, mode);
+   if (sf->fd < 0)
+     {
+        free(sf);
+        return NULL;
+     }
+   sf->file = eina_stringshare_add(ref);
+   if (!sf->file)
+     {
+        close(sf->fd);
+        eina_stringshare_del(sf->file);
+        free(sf);
+        return NULL;
+     }
+   sf->size = size;
+   sf->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sf->fd, 0);
+   if (sf->addr == MAP_FAILED)
+     {
+        close(sf->fd);
+        eina_stringshare_del(sf->file);
+        free(sf);
+        return NULL;
+     }
+   return sf;
+}
+
+void
+shmfile_close(Shmfile *sf)
+{
+   munmap(sf->addr, sf->size);
+   close(sf->fd);
+   eina_stringshare_del(sf->file);
+   free(sf);
+}
+
+// procotol version - change this as needed
+#define MAJOR 0x1011
+
+enum // opcodes
+{
+   OP_RESIZE,
+   OP_SHOW,
+   OP_HIDE,
+   OP_FOCUS,
+   OP_UNFOCUS,
+   OP_UPDATE,
+   OP_UPDATE_DONE,
+   OP_LOCK_FILE,
+   OP_SHM_REF,
+   OP_EV_MOUSE_IN,
+   OP_EV_MOUSE_OUT,
+   OP_EV_MOUSE_UP,
+   OP_EV_MOUSE_DOWN,
+   OP_EV_MOUSE_MOVE,
+   OP_EV_MOUSE_WHEEL,
+   OP_EV_MULTI_UP,
+   OP_EV_MULTI_DOWN,
+   OP_EV_MULTI_MOVE,
+   OP_EV_KEY_UP,
+   OP_EV_KEY_DOWN,
+   OP_EV_HOLD
+};
+
+enum
+{
+   MOD_SHIFT  = (1 << 0),
+   MOD_CTRL   = (1 << 1),
+   MOD_ALT    = (1 << 2),
+   MOD_META   = (1 << 3),
+   MOD_HYPER  = (1 << 4),
+   MOD_SUPER  = (1 << 5),
+   MOD_CAPS   = (1 << 6),
+   MOD_NUM    = (1 << 7),
+   MOD_SCROLL = (1 << 8),
+};
+
+typedef struct _Ipc_Data_Resize Ipc_Data_Resize;
+typedef struct _Ipc_Data_Update Ipc_Data_Update;
+typedef struct _Ipc_Data_Ev_Mouse_In Ipc_Data_Ev_Mouse_In;
+typedef struct _Ipc_Data_Ev_Mouse_Out Ipc_Data_Ev_Mouse_Out;
+typedef struct _Ipc_Data_Ev_Mouse_Up Ipc_Data_Ev_Mouse_Up;
+typedef struct _Ipc_Data_Ev_Mouse_Down Ipc_Data_Ev_Mouse_Down;
+typedef struct _Ipc_Data_Ev_Mouse_Move Ipc_Data_Ev_Mouse_Move;
+typedef struct _Ipc_Data_Ev_Mouse_Wheel Ipc_Data_Ev_Mouse_Wheel;
+typedef struct _Ipc_Data_Ev_Hold Ipc_Data_Ev_Hold;
+typedef struct _Ipc_Data_Ev_Multi_Up Ipc_Data_Ev_Multi_Up;
+typedef struct _Ipc_Data_Ev_Multi_Down Ipc_Data_Ev_Multi_Down;
+typedef struct _Ipc_Data_Ev_Multi_Move Ipc_Data_Ev_Multi_Move;
+typedef struct _Ipc_Data_Ev_Key_Up Ipc_Data_Ev_Key_Up;
+typedef struct _Ipc_Data_Ev_Key_Down Ipc_Data_Ev_Key_Down;
+
+struct _Ipc_Data_Resize
+{
+   int w, h;
+};
+
+struct _Ipc_Data_Update
+{
+   int x, w, y, h;
+};
+
+struct _Ipc_Data_Ev_Mouse_In
+{
+   unsigned int timestamp;
+   int mask;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Mouse_Out
+{
+   unsigned int timestamp;
+   int mask;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Mouse_Up
+{
+   int b;
+   Evas_Button_Flags flags;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Mouse_Down
+{
+   int b;
+   Evas_Button_Flags flags;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Mouse_Move
+{
+   int x, y;
+   Evas_Button_Flags flags;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Mouse_Wheel
+{
+   int direction, z;
+   Evas_Button_Flags flags;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Hold
+{
+   int hold;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Multi_Up
+{
+   Evas_Button_Flags flags;
+   int d, x, y;
+   double rad, radx, rady, pres, ang, fx, fy;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Multi_Down
+{
+   Evas_Button_Flags flags;
+   int d, x, y;
+   double rad, radx, rady, pres, ang, fx, fy;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Multi_Move
+{
+   int d, x, y;
+   double rad, radx, rady, pres, ang, fx, fy;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Key_Up
+{
+   const char *keyname, *key, *string, *compose;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+struct _Ipc_Data_Ev_Key_Down
+{
+   const char *keyname, *key, *string, *compose;
+   int mask;
+   unsigned int timestamp;
+   Evas_Event_Flags event_flags;
+};
+
+typedef struct _Extn Extn;
+
+struct _Extn
+{
+   struct {
+        Ecore_Ipc_Server *server;
+        Eina_List *clients;
+        Eina_List *handlers;
+        Eina_Bool am_server : 1;
+   } ipc;
+   struct {
+        const char *name;
+        int         num;
+        Eina_Bool   sys : 1;
+   } svc;
+   struct {
+        const char *lock;
+        int         lockfd;
+        const char *shm;
+        int         w, h;
+        Shmfile    *shmfile;
+        Eina_List  *updates;
+        Eina_Bool   have_lock : 1;
+        Eina_Bool   have_real_lock : 1;
+   } file;
+};
+
+static Eina_List *extn_ee_list = NULL;
+
+EAPI int ECORE_EVAS_EXTN_CLIENT_ADD = 0;
+EAPI int ECORE_EVAS_EXTN_CLIENT_DEL = 0;
+
+void
+_ecore_evas_extn_init(void)
+{
+   if (ECORE_EVAS_EXTN_CLIENT_ADD) return;
+   ECORE_EVAS_EXTN_CLIENT_ADD = ecore_event_type_new();
+   ECORE_EVAS_EXTN_CLIENT_DEL = ecore_event_type_new();
+}
+
+void
+_ecore_evas_extn_shutdown(void)
+{
+}
+
+static void
+_ecore_evas_extn_event_free(void *data, void *ev __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   if (ee->engine.buffer.image)
+     evas_object_unref(ee->engine.buffer.image);
+   _ecore_evas_unref(ee);
+}
+
+static void
+_ecore_evas_extn_event(Ecore_Evas *ee, int event)
+{
+   _ecore_evas_ref(ee);
+   if (ee->engine.buffer.image)
+     evas_object_ref(ee->engine.buffer.image);
+   ecore_event_add(event, ee->engine.buffer.image,
+                   _ecore_evas_extn_event_free, ee);
+}
+
+static Eina_Bool
+_ecore_evas_lock_other_have(Ecore_Evas *ee)
+{
+   Eina_List *l;
+   Ecore_Evas *ee2;
+   Extn *extn, *extn2;
+   
+   extn = ee->engine.buffer.data;
+   if (!extn) return EINA_FALSE;
+   // brute force - i know. i expect extn_ee_list to be fairly short. could
+   // be improved with a hash of lockfiles
+   EINA_LIST_FOREACH(extn_ee_list, l, ee2)
+     {
+        if (ee == ee2) continue;
+        extn2 = ee2->engine.buffer.data;
+        if (!extn2) continue;
+        if ((extn->file.lock) && (extn2->file.lock) &&
+            (!strcmp(extn->file.lock, extn2->file.lock)) &&
+            (extn2->file.have_real_lock))
+          return EINA_TRUE;
+     }
+   return EINA_FALSE;
+}
+
+static void
+_ecore_evas_socket_lock(Ecore_Evas *ee)
+{
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->file.lockfd < 0) return;
+   if (extn->file.have_lock) return;
+   extn->file.have_lock = EINA_TRUE;
+   if (_ecore_evas_lock_other_have(ee)) return;
+   flock(extn->file.lockfd, LOCK_EX);
+   extn->file.have_real_lock = EINA_TRUE;
+}
+
+static void
+_ecore_evas_socket_unlock(Ecore_Evas *ee)
+{
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->file.lockfd < 0) return;
+   if (!extn->file.have_lock) return;
+   extn->file.have_lock = EINA_FALSE;
+   if (!extn->file.have_real_lock) return;
+   flock(extn->file.lockfd, LOCK_UN);
+}
+
+static void
+_ecore_evas_extn_plug_targer_render_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   if (ee) _ecore_evas_socket_lock(ee);
+}
+
+static void
+_ecore_evas_extn_plug_targer_render_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   if (ee) _ecore_evas_socket_unlock(ee);
+}
+
+static void
+_ecore_evas_extn_plug_image_obj_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   if (ee) ecore_evas_free(ee);
+}
+
+static void
+_ecore_evas_extn_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
+{
+   Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
+
+   evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
+   evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
+
+   if (fw < 1) fw = 1;
+   if (fh < 1) fh = 1;
+
+   if (evas_object_map_get(ee->engine.buffer.image) &&
+       evas_object_map_enable_get(ee->engine.buffer.image))
+     {
+        fx = 0; fy = 0;
+        fw = ee->w; fh = ee->h;
+        ww = ee->w; hh = ee->h;
+     }
+
+   if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
+     {
+        *x = (ee->w * (*x - xx)) / fw;
+        *y = (ee->h * (*y - yy)) / fh;
+     }
+   else
+     {
+        xx = (*x - xx) - fx;
+        while (xx < 0) xx += fw;
+        while (xx > fw) xx -= fw;
+        *x = (ee->w * xx) / fw;
+
+        yy = (*y - yy) - fy;
+        while (yy < 0) yy += fh;
+        while (yy > fh) yy -= fh;
+        *y = (ee->h * yy) / fh;
+     }
+}
+
+static void
+_ecore_evas_extn_free(Ecore_Evas *ee)
+{
+   Extn *extn;
+   Ecore_Ipc_Client *client;
+
+   extn = ee->engine.buffer.data;
+   if (extn)
+     {
+        Ecore_Event_Handler *hdl;
+
+        if (extn->file.have_lock)
+          _ecore_evas_socket_unlock(ee);
+        if (extn->file.lockfd)
+          {
+             close(extn->file.lockfd);
+             if (extn->ipc.am_server)
+               {
+                  if (extn->file.lock) unlink(extn->file.lock);
+               }
+          }
+        if (extn->svc.name) eina_stringshare_del(extn->svc.name);
+        if (extn->ipc.clients)
+          {
+             EINA_LIST_FREE(extn->ipc.clients, client)
+               ecore_ipc_client_del(client);
+          }
+        if (extn->ipc.server) ecore_ipc_server_del(extn->ipc.server);
+        if (extn->file.lock) eina_stringshare_del(extn->file.lock);
+        if (extn->file.shm) eina_stringshare_del(extn->file.shm);
+        if (extn->file.shmfile)
+          {
+             if (extn->ipc.am_server)
+               shmfile_free(extn->file.shmfile);
+             else
+               shmfile_close(extn->file.shmfile);
+          }
+
+        EINA_LIST_FREE(extn->ipc.handlers, hdl)
+          ecore_event_handler_del(hdl);
+        free(extn);
+        ecore_ipc_shutdown();
+        ee->engine.buffer.data = NULL;
+     }
+   if (ee->engine.buffer.image)
+     {
+        Ecore_Evas *ee2;
+
+        evas_object_event_callback_del_full(ee->engine.buffer.image,
+                                            EVAS_CALLBACK_DEL,
+                                            _ecore_evas_extn_plug_image_obj_del,
+                                            ee);
+/*///Jiyoun: This code will be modified after opensource fix lockup issue
+        evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
+                                     EVAS_CALLBACK_RENDER_PRE,
+                                     _ecore_evas_extn_plug_targer_render_pre,
+                                     ee);
+        evas_event_callback_del_full(evas_object_evas_get(ee->engine.buffer.image),
+                                     EVAS_CALLBACK_RENDER_POST,
+                                     _ecore_evas_extn_plug_targer_render_post,
+                                     ee);
+*/
+        evas_object_event_callback_del_full(ee->engine.buffer.image,
+                                     EVAS_CALLBACK_CANVAS_OBJECT_RENDER_PRE,
+                                     _ecore_evas_extn_plug_targer_render_pre,
+                                     ee);
+        evas_object_event_callback_del_full(ee->engine.buffer.image,
+                                     EVAS_CALLBACK_CANVAS_OBJECT_RENDER_POST,
+                                     _ecore_evas_extn_plug_targer_render_post,
+                                     ee);
+        evas_object_del(ee->engine.buffer.image);
+        ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
+        if (ee2)
+          {
+             ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
+          }
+     }
+   extn_ee_list = eina_list_remove(extn_ee_list, ee);
+}
+
+static void
+_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
+{
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   ee->req.w = w;
+   ee->req.h = h;
+   if ((w == ee->w) && (h == ee->h)) return;
+   ee->w = w;
+   ee->h = h;
+
+   /*
+    * No need for it if not used later.
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   */
+   if (ee->engine.buffer.image)
+     evas_object_image_size_set(ee->engine.buffer.image, ee->w, ee->h);
+   /* Server can have many plugs, so I block resize comand from client to server *
+      if ((extn) && (extn->ipc.server))
+      {
+      Ipc_Data_Resize ipc;
+
+      ipc.w = ee->w;
+      ipc.h = ee->h;
+      ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_RESIZE, 0, 0, 0, &ipc, sizeof(ipc));
+      }*/
+   if (ee->func.fn_resize) ee->func.fn_resize(ee);
+}
+
+static void
+_ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
+{
+   _ecore_evas_resize(ee, w, h);
+}
+
+static int
+_ecore_evas_modifiers_locks_mask_get(Evas *e)
+{
+   int mask = 0;
+
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
+     mask |= MOD_SHIFT;
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
+     mask |= MOD_CTRL;
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
+     mask |= MOD_ALT;
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
+     mask |= MOD_META;
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
+     mask |= MOD_HYPER;
+   if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
+     mask |= MOD_SUPER;
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
+     mask |= MOD_SCROLL;
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
+     mask |= MOD_NUM;
+   if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
+     mask |= MOD_CAPS;
+   return mask;
+}
+
+static void
+_ecore_evas_modifiers_locks_mask_set(Evas *e, int mask)
+{
+   if (mask & MOD_SHIFT) evas_key_modifier_on (e, "Shift");
+   else                  evas_key_modifier_off(e, "Shift");
+   if (mask & MOD_CTRL)  evas_key_modifier_on (e, "Control");
+   else                  evas_key_modifier_off(e, "Control");
+   if (mask & MOD_ALT)   evas_key_modifier_on (e, "Alt");
+   else                  evas_key_modifier_off(e, "Alt");
+   if (mask & MOD_META)  evas_key_modifier_on (e, "Meta");
+   else                  evas_key_modifier_off(e, "Meta");
+   if (mask & MOD_HYPER) evas_key_modifier_on (e, "Hyper");
+   else                  evas_key_modifier_off(e, "Hyper");
+   if (mask & MOD_SUPER) evas_key_modifier_on (e, "Super");
+   else                  evas_key_modifier_off(e, "Super");
+   if (mask & MOD_SCROLL) evas_key_lock_on (e, "Scroll_Lock");
+   else                   evas_key_lock_off(e, "Scroll_Lock");
+   if (mask & MOD_NUM)    evas_key_lock_on (e, "Num_Lock");
+   else                   evas_key_lock_off(e, "Num_Lock");
+   if (mask & MOD_CAPS)   evas_key_lock_on (e, "Caps_Lock");
+   else                   evas_key_lock_off(e, "Caps_Lock");
+}
+
+static void
+_ecore_evas_extn_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_In *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Mouse_In ipc;
+
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_IN, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Out *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Mouse_Out ipc;
+
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_OUT, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Down *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+       /* We have send mouse move event before mouse down event */
+       {
+          Ipc_Data_Ev_Mouse_Move ipc_move;
+          Evas_Coord x, y;
+
+          x = ev->canvas.x;
+          y = ev->canvas.y;
+          _ecore_evas_extn_coord_translate(ee, &x, &y);
+          ipc_move.x = x;
+          ipc_move.y = y;
+          ipc_move.timestamp = ev->timestamp;
+          ipc_move.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+          ipc_move.event_flags = ev->event_flags;
+          ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc_move, sizeof(ipc_move));
+       }
+       {
+          Ipc_Data_Ev_Mouse_Down ipc;
+          ipc.b = ev->button;
+          ipc.flags = ev->flags;
+          ipc.timestamp = ev->timestamp;
+          ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+          ipc.event_flags = ev->event_flags;
+          ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
+       }
+     }
+}
+
+static void
+_ecore_evas_extn_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Up *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Mouse_Up ipc;
+
+        ipc.b = ev->button;
+        ipc.flags = ev->flags;
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_UP, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Move *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Mouse_Move ipc;
+        Evas_Coord x, y;
+
+        x = ev->cur.canvas.x;
+        y = ev->cur.canvas.y;
+        _ecore_evas_extn_coord_translate(ee, &x, &y);
+        ipc.x = x;
+        ipc.y = y;
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Mouse_Wheel *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Mouse_Wheel ipc;
+
+        ipc.direction = ev->direction;
+        ipc.z = ev->z;
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MOUSE_WHEEL, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Multi_Down *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Multi_Down ipc;
+        Evas_Coord x, y;
+
+        ipc.d = ev->device;
+        x = ev->canvas.x;
+        y = ev->canvas.y;
+        _ecore_evas_extn_coord_translate(ee, &x, &y);
+        ipc.x = x;
+        ipc.y = y;
+        ipc.rad = ev->radius;
+        ipc.radx = ev->radius_x;
+        ipc.rady = ev->radius_y;
+        ipc.pres = ev->pressure;
+        ipc.ang = ev->angle;
+        ipc.fx = ev->canvas.xsub;
+        ipc.fy = ev->canvas.ysub;
+        ipc.flags = ev->flags;
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_DOWN, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+
+static void
+_ecore_evas_extn_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Multi_Up *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Multi_Up ipc;
+        Evas_Coord x, y;
+
+        ipc.d = ev->device;
+        x = ev->canvas.x;
+        y = ev->canvas.y;
+        _ecore_evas_extn_coord_translate(ee, &x, &y);
+        ipc.x = x;
+        ipc.y = y;
+        ipc.rad = ev->radius;
+        ipc.radx = ev->radius_x;
+        ipc.rady = ev->radius_y;
+        ipc.pres = ev->pressure;
+        ipc.ang = ev->angle;
+        ipc.fx = ev->canvas.xsub;
+        ipc.fy = ev->canvas.ysub;
+        ipc.flags = ev->flags;
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_UP, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Multi_Move *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Multi_Move ipc;
+        Evas_Coord x, y;
+
+        ipc.d = ev->device;
+        x = ev->cur.canvas.x;
+        y = ev->cur.canvas.y;
+        _ecore_evas_extn_coord_translate(ee, &x, &y);
+        ipc.x = x;
+        ipc.y = y;
+        ipc.rad = ev->radius;
+        ipc.radx = ev->radius_x;
+        ipc.rady = ev->radius_y;
+        ipc.pres = ev->pressure;
+        ipc.ang = ev->angle;
+        ipc.fx = ev->cur.canvas.xsub;
+        ipc.fy = ev->cur.canvas.ysub;
+        ipc.timestamp = ev->timestamp;
+        ipc.mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_MULTI_MOVE, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = data;
+   if (ee->driver) _ecore_evas_free(ee);
+}
+
+static void
+_ecore_evas_extn_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Key_Down *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Key_Down *ipc;
+        char *st, *p;
+        int len = 0;
+
+        len = sizeof(Ipc_Data_Ev_Key_Down);
+        if (ev->key) len += strlen(ev->key) + 1;
+        if (ev->keyname) len += strlen(ev->keyname) + 1;
+        if (ev->string) len += strlen(ev->string) + 1;
+        if (ev->compose) len += strlen(ev->compose) + 1;
+        len += 1;
+        st = alloca(len);
+        ipc = (Ipc_Data_Ev_Key_Down *)st;
+        memset(st, 0, len);
+        p = st + sizeof(Ipc_Data_Ev_Key_Down);
+        if (ev->key)
+          {
+             strcpy(p, ev->key);
+             ipc->key = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        if (ev->keyname)
+          {
+             strcpy(p, ev->keyname);
+             ipc->keyname = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        if (ev->string)
+          {
+             strcpy(p, ev->string);
+             ipc->string = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        if (ev->compose)
+          {
+             strcpy(p, ev->compose);
+             ipc->compose = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        ipc->timestamp = ev->timestamp;
+        ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc->event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_DOWN, 0, 0, 0, ipc, len);
+     }
+}
+
+static void
+_ecore_evas_extn_cb_key_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Key_Up *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Key_Up *ipc;
+        char *st, *p;
+        int len = 0;
+
+        len = sizeof(Ipc_Data_Ev_Key_Up);
+        if (ev->key) len += strlen(ev->key) + 1;
+        if (ev->keyname) len += strlen(ev->keyname) + 1;
+        if (ev->string) len += strlen(ev->string) + 1;
+        if (ev->compose) len += strlen(ev->compose) + 1;
+        len += 1;
+        st = alloca(len);
+        ipc = (Ipc_Data_Ev_Key_Up *)st;
+        memset(st, 0, len);
+        p = st + sizeof(Ipc_Data_Ev_Key_Down);
+        if (ev->key)
+          {
+             strcpy(p, ev->key);
+             ipc->key = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        if (ev->keyname)
+          {
+             strcpy(p, ev->keyname);
+             ipc->keyname = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        if (ev->string)
+          {
+             strcpy(p, ev->string);
+             ipc->string = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        if (ev->compose)
+          {
+             strcpy(p, ev->compose);
+             ipc->compose = p - (long)st;
+             p += strlen(p) + 1;
+          }
+        ipc->timestamp = ev->timestamp;
+        ipc->mask = _ecore_evas_modifiers_locks_mask_get(ee->evas);
+        ipc->event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_KEY_UP, 0, 0, 0, ipc, len);
+     }
+}
+
+static void
+_ecore_evas_extn_cb_hold(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Ecore_Evas *ee = data;
+   Evas_Event_Hold *ev = event_info;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (extn->ipc.server)
+     {
+        Ipc_Data_Ev_Hold ipc;
+
+        ipc.hold = ev->hold;
+        ipc.timestamp = ev->timestamp;
+        ipc.event_flags = ev->event_flags;
+        ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_EV_HOLD, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+}
+
+static void
+_ecore_evas_extn_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+   Extn *extn;
+
+   ee = data;
+   ee->prop.focused = 1;
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (!extn->ipc.server) return;
+   ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_FOCUS, 0, 0, 0, NULL, 0);
+}
+
+static void
+_ecore_evas_extn_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+   Extn *extn;
+
+   ee = data;
+   ee->prop.focused = 0;
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (!extn->ipc.server) return;
+   ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_UNFOCUS, 0, 0, 0, NULL, 0);
+}
+
+static void
+_ecore_evas_extn_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+   Extn *extn;
+
+   ee = data;
+   ee->visible = 1;
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (!extn->ipc.server) return;
+   ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_SHOW, 0, 0, 0, NULL, 0);
+}
+
+static void
+_ecore_evas_extn_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+   Extn *extn;
+
+   ee = data;
+   ee->visible = 0;
+   extn = ee->engine.buffer.data;
+   if (!extn) return;
+   if (!extn->ipc.server) return;
+   ecore_ipc_server_send(extn->ipc.server, MAJOR, OP_HIDE, 0, 0, 0, NULL, 0);
+}
+
+static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
+{
+   _ecore_evas_extn_free,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_resize,
+   _ecore_evas_move_resize,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL, //transparent
+   NULL, // profiles_set
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+
+   NULL, // render
+   NULL, // screen_geometry_get
+   NULL  // screen_dpi_get
+};
+
+static Eina_Bool
+_ipc_server_add(void *data, int type __UNUSED__, void *event)
+{
+   Ecore_Ipc_Event_Server_Add *e = event;
+   Ecore_Evas *ee = data;
+   Extn *extn;
+
+   if (ee != ecore_ipc_server_data_get(e->server))
+     return ECORE_CALLBACK_PASS_ON;
+   if (!eina_list_data_find(extn_ee_list, ee))
+     return ECORE_CALLBACK_PASS_ON;
+   extn = ee->engine.buffer.data;
+   if (!extn) return ECORE_CALLBACK_PASS_ON;
+   //FIXME: find a way to let app know server there
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ipc_server_del(void *data, int type __UNUSED__, void *event)
+{
+   Ecore_Ipc_Event_Server_Del *e = event;
+   Ecore_Evas *ee = data;
+   Extn *extn;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return ECORE_CALLBACK_PASS_ON;
+   if (extn->ipc.server != e->server) return ECORE_CALLBACK_PASS_ON;
+   evas_object_image_data_set(ee->engine.buffer.image, NULL);
+   ee->engine.buffer.pixels = NULL;
+   if (extn->file.shmfile)
+     {
+        shmfile_close(extn->file.shmfile);
+        extn->file.shmfile = NULL;
+     }
+   if (extn->file.shm)
+     {
+        eina_stringshare_del(extn->file.shm);
+        extn->file.shm = NULL;
+     }
+   extn->ipc.server = NULL;
+   if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ipc_server_data(void *data, int type __UNUSED__, void *event)
+{
+   Ecore_Ipc_Event_Server_Data *e = event;
+   Ecore_Evas *ee = data;
+   Extn *extn;
+
+   if (ee != ecore_ipc_server_data_get(e->server))
+     return ECORE_CALLBACK_PASS_ON;
+   if (!eina_list_data_find(extn_ee_list, ee))
+     return ECORE_CALLBACK_PASS_ON;
+   extn = ee->engine.buffer.data;
+   if (!extn) return ECORE_CALLBACK_PASS_ON;
+   if (e->major != MAJOR)
+     return ECORE_CALLBACK_PASS_ON;
+   switch (e->minor)
+     {
+      case OP_UPDATE:
+         // add rect to update list
+         if (e->size >= (int)sizeof(Ipc_Data_Update))
+           {
+              Ipc_Data_Update *ipc = malloc(sizeof(Ipc_Data_Update));
+              if (ipc)
+                {
+                   memcpy(ipc, e->data, sizeof(Ipc_Data_Update));
+                   extn->file.updates = eina_list_append(extn->file.updates, ipc);
+                }
+           }
+         break;
+      case OP_UPDATE_DONE:
+         // updates finished being sent - done now. frame ready
+           {
+              Ipc_Data_Update *ipc;
+
+              EINA_LIST_FREE(extn->file.updates, ipc)
+                {
+                   if (ee->engine.buffer.image)
+                     evas_object_image_data_update_add(ee->engine.buffer.image,
+                                                       ipc->x, ipc->y,
+                                                       ipc->w, ipc->h);
+                }
+           }
+         break;
+      case OP_LOCK_FILE:
+         if ((e->data) && (e->size > 0) &&
+             (((unsigned char *)e->data)[e->size - 1] == 0))
+           {
+              if (extn->file.have_lock) _ecore_evas_socket_unlock(ee);
+              if (extn->file.lockfd) close(extn->file.lockfd);
+              if (extn->file.lock) eina_stringshare_del(extn->file.lock);
+              extn->file.lock = eina_stringshare_add(e->data);
+              extn->file.lockfd = open(extn->file.lock, O_RDONLY);
+           }
+         break;
+      case OP_SHM_REF:
+         // e->ref == w
+         // e->ref_to == h
+         // e->response == alpha
+         // e->data = shm ref string + nul byte
+         if ((e->data) && ((unsigned char *)e->data)[e->size - 1] == 0)
+           {
+              ee->engine.buffer.pixels = NULL;
+              if (extn->file.shmfile)
+                {
+                   shmfile_close(extn->file.shmfile);
+                   extn->file.shmfile = NULL;
+                }
+              if (extn->file.shm)
+                {
+                   eina_stringshare_del(extn->file.shm);
+                   extn->file.shm = NULL;
+                }
+              if ((e->ref > 0) && (e->ref_to > 0))
+                {
+                   extn->file.w = e->ref;
+                   extn->file.h = e->ref_to;
+                   extn->file.shm = eina_stringshare_add(e->data);
+                   extn->file.shmfile = shmfile_open(extn->file.shm,
+                                                     extn->file.w *
+                                                     extn->file.h * 4,
+                                                     EINA_TRUE);
+                   if (extn->file.shmfile)
+                     {
+                        ee->engine.buffer.pixels = extn->file.shmfile->addr;
+                        if (ee->engine.buffer.image)
+                          {
+                             if (e->response)
+                               evas_object_image_alpha_set(ee->engine.buffer.image,
+                                                           EINA_TRUE);
+                             else
+                               evas_object_image_alpha_set(ee->engine.buffer.image,
+                                                           EINA_FALSE);
+                             evas_object_image_size_set(ee->engine.buffer.image,
+                                                        extn->file.w,
+                                                        extn->file.h);
+                             evas_object_image_data_set(ee->engine.buffer.image,
+                                                        ee->engine.buffer.pixels);
+                             evas_object_image_data_update_add(ee->engine.buffer.image,
+                                                               0, 0,
+                                                               extn->file.w,
+                                                               extn->file.h);
+                             _ecore_evas_resize(ee,
+                                                extn->file.w,
+                                                extn->file.h);
+                          }
+                        else
+                          evas_object_image_data_set(ee->engine.buffer.image, NULL);
+                     }
+                   else
+                     evas_object_image_data_set(ee->engine.buffer.image, NULL);
+                }
+              else
+                evas_object_image_data_set(ee->engine.buffer.image, NULL);
+           }
+         break;
+      case OP_RESIZE:
+         if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
+           {
+              Ipc_Data_Resize *ipc = e->data;
+              _ecore_evas_resize(ee, ipc->w, ipc->h);
+           }
+         break;
+      default:
+         break;
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+#else
+void
+_ecore_evas_extn_init(void)
+{
+}
+
+void
+_ecore_evas_extn_shutdown(void)
+{
+}
+
+#endif /* BUILD_ECORE_EVAS_EXTN */
+
+EAPI Evas_Object *
+ecore_evas_extn_plug_new(Ecore_Evas *ee_target)
+{
+#ifdef BUILD_ECORE_EVAS_EXTN
+   Evas_Object *o;
+   Ecore_Evas *ee;
+   int w = 1, h = 1;
+
+   if (!ee_target) return NULL;
+
+   ee = calloc(1, sizeof(Ecore_Evas));
+   if (!ee) return NULL;
+
+   o = evas_object_image_filled_add(ee_target->evas);
+   /* this make problem in gl engine, so I'll block this until solve problem 
+   evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);*/
+   evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
+   evas_object_image_alpha_set(o, 1);
+   evas_object_image_size_set(o, 1, 1);
+   evas_object_image_data_set(o, &blank);
+
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_plug_engine_func;
+
+   ee->driver = "extn_plug";
+
+   ee->rotation = 0;
+   ee->visible = 0;
+   ee->w = w;
+   ee->h = h;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
+
+   ee->prop.max.w = 0;
+   ee->prop.max.h = 0;
+   ee->prop.layer = 0;
+   ee->prop.focused = 0;
+   ee->prop.borderless = 1;
+   ee->prop.override = 1;
+   ee->prop.maximized = 0;
+   ee->prop.fullscreen = 0;
+   ee->prop.withdrawn = 0;
+   ee->prop.sticky = 0;
+
+   ee->engine.buffer.image = o;
+   evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
+   evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_IN,
+                                  _ecore_evas_extn_cb_mouse_in, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_OUT,
+                                  _ecore_evas_extn_cb_mouse_out, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_DOWN,
+                                  _ecore_evas_extn_cb_mouse_down, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_UP,
+                                  _ecore_evas_extn_cb_mouse_up, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_MOVE,
+                                  _ecore_evas_extn_cb_mouse_move, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MOUSE_WHEEL,
+                                  _ecore_evas_extn_cb_mouse_wheel, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MULTI_DOWN,
+                                  _ecore_evas_extn_cb_multi_down, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MULTI_UP,
+                                  _ecore_evas_extn_cb_multi_up, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_MULTI_MOVE,
+                                  _ecore_evas_extn_cb_multi_move, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_FREE,
+                                  _ecore_evas_extn_cb_free, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_KEY_DOWN,
+                                  _ecore_evas_extn_cb_key_down, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_KEY_UP,
+                                  _ecore_evas_extn_cb_key_up, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_HOLD,
+                                  _ecore_evas_extn_cb_hold, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_FOCUS_IN,
+                                  _ecore_evas_extn_cb_focus_in, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_FOCUS_OUT,
+                                  _ecore_evas_extn_cb_focus_out, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_SHOW,
+                                  _ecore_evas_extn_cb_show, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_HIDE,
+                                  _ecore_evas_extn_cb_hide, ee);
+
+   evas_object_event_callback_add(ee->engine.buffer.image,
+                                  EVAS_CALLBACK_DEL,
+                                  _ecore_evas_extn_plug_image_obj_del, ee);
+
+
+   extn_ee_list = eina_list_append(extn_ee_list, ee);
+   ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
+
+/*///Jiyoun: This code will be modified after opensource fix lockup issue
+   evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_PRE,
+                           _ecore_evas_extn_plug_targer_render_pre, ee);
+   evas_event_callback_add(ee_target->evas, EVAS_CALLBACK_RENDER_POST,
+                           _ecore_evas_extn_plug_targer_render_post, ee);
+*/
+   evas_object_event_callback_add(ee->engine.buffer.image, EVAS_CALLBACK_CANVAS_OBJECT_RENDER_PRE,
+                           _ecore_evas_extn_plug_targer_render_pre, ee);
+   evas_object_event_callback_add(ee->engine.buffer.image, EVAS_CALLBACK_CANVAS_OBJECT_RENDER_POST,
+                           _ecore_evas_extn_plug_targer_render_post, ee);
+   return o;
+#else
+   return NULL;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys)
+{
+#ifdef BUILD_ECORE_EVAS_EXTN
+   Extn *extn;
+   Ecore_Evas *ee = NULL;
+
+   if (!obj) return EINA_FALSE;
+
+   ee = evas_object_data_get(obj, "Ecore_Evas");
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS)) return EINA_FALSE;
+
+   if (!svcname)
+     {
+        ee->engine.buffer.data = NULL;
+        return EINA_FALSE;
+     }
+
+   extn = calloc(1, sizeof(Extn));
+   if (!extn) return EINA_FALSE;
+
+   Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
+
+   ecore_ipc_init();
+   extn->svc.name = eina_stringshare_add(svcname);
+   extn->svc.num = svcnum;
+   extn->svc.sys = svcsys;
+
+   if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
+   extn->ipc.server = ecore_ipc_server_connect(ipctype, (char *)extn->svc.name,
+                                               extn->svc.num, ee);
+   if (!extn->ipc.server)
+     {
+        ee->engine.buffer.data = NULL;
+        eina_stringshare_del(extn->svc.name);
+        free(extn);
+        ecore_ipc_shutdown();
+        return EINA_FALSE;
+     }
+   ee->engine.buffer.data = extn;
+   extn->ipc.handlers = eina_list_append
+      (extn->ipc.handlers,
+       ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD,
+                               _ipc_server_add, ee));
+   extn->ipc.handlers = eina_list_append
+      (extn->ipc.handlers,
+       ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL,
+                               _ipc_server_del, ee));
+   extn->ipc.handlers = eina_list_append
+      (extn->ipc.handlers,
+       ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,
+                               _ipc_server_data, ee));
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+EAPI void
+ecore_evas_extn_plug_object_data_lock(Evas_Object *obj)
+{
+#ifdef BUILD_ECORE_EVAS_EXTN
+   Ecore_Evas *ee;
+
+   ee = ecore_evas_object_ecore_evas_get(obj);
+   if (!ee) return;
+   _ecore_evas_socket_lock(ee);
+#endif
+}
+
+EAPI void
+ecore_evas_extn_plug_object_data_unlock(Evas_Object *obj)
+{
+#ifdef BUILD_ECORE_EVAS_EXTN
+   Ecore_Evas *ee;
+
+   ee = ecore_evas_object_ecore_evas_get(obj);
+   if (!ee) return;
+   _ecore_evas_socket_unlock(ee);
+#endif
+}
+
+#ifdef BUILD_ECORE_EVAS_EXTN
+static void
+_ecore_evas_socket_resize(Ecore_Evas *ee, int w, int h)
+{
+   Extn *extn;
+   Evas_Engine_Info_Buffer *einfo;
+   int stride = 0;
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   ee->req.w = w;
+   ee->req.h = h;
+   if ((w == ee->w) && (h == ee->h)) return;
+   ee->w = w;
+   ee->h = h;
+   evas_output_size_set(ee->evas, ee->w, ee->h);
+   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+   extn = ee->engine.buffer.data;
+   if (extn)
+     {
+        if (extn->file.shmfile)
+          shmfile_free(extn->file.shmfile);
+        ee->engine.buffer.pixels = NULL;
+        extn->file.shmfile = shmfile_new(extn->svc.name, extn->svc.num,
+                                         ee->w * ee->h * 4, extn->svc.sys);
+        if (extn->file.shmfile)
+          ee->engine.buffer.pixels = extn->file.shmfile->addr;
+
+        stride = ee->w * 4;
+        einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             if (ee->alpha)
+               einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+             else
+               einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+             einfo->info.dest_buffer = ee->engine.buffer.pixels;
+             einfo->info.dest_buffer_row_bytes = stride;
+             einfo->info.use_color_key = 0;
+             einfo->info.alpha_threshold = 0;
+             einfo->info.func.new_update_region = NULL;
+             einfo->info.func.free_update_region = NULL;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+          }
+
+        if (extn->ipc.clients && extn->file.shmfile)
+          {
+             Ipc_Data_Resize ipc;
+             Eina_List *l;
+             Ecore_Ipc_Client *client;
+
+             EINA_LIST_FOREACH(extn->ipc.clients, l, client)
+                ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
+                                      ee->w, ee->h, ee->alpha,
+                                      extn->file.shmfile->file,
+                                      strlen(extn->file.shmfile->file) + 1);
+             ipc.w = ee->w;
+             ipc.h = ee->h;
+             EINA_LIST_FOREACH(extn->ipc.clients, l, client)
+                ecore_ipc_client_send(client, MAJOR, OP_RESIZE,
+                                      0, 0, 0, &ipc, sizeof(ipc));
+          }
+     }
+   if (ee->func.fn_resize) ee->func.fn_resize(ee);
+}
+
+static void
+_ecore_evas_socket_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
+{
+   _ecore_evas_socket_resize(ee, w, h);
+}
+
+int
+_ecore_evas_extn_socket_render(Ecore_Evas *ee)
+{
+   Eina_List *updates = NULL, *l, *ll;
+   Ecore_Evas *ee2;
+   int rend = 0;
+   Eina_Rectangle *r;
+   Extn *extn;
+   Ecore_Ipc_Client *client;
+
+   extn = ee->engine.buffer.data;
+   if (!extn) return rend;
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+     {
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+     }
+   if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
+
+   if (ee->engine.buffer.pixels)
+     {
+        _ecore_evas_socket_lock(ee);
+        updates = evas_render_updates(ee->evas);
+        _ecore_evas_socket_unlock(ee);
+     }
+   EINA_LIST_FOREACH(updates, l, r)
+     {
+        Ipc_Data_Update ipc;
+
+
+        ipc.x = r->x;
+        ipc.y = r->y;
+        ipc.w = r->w;
+        ipc.h = r->h;
+        EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
+           ecore_ipc_client_send(client, MAJOR, OP_UPDATE, 0, 0, 0, &ipc, sizeof(ipc));
+     }
+   if (updates)
+     {
+        evas_render_updates_free(updates);
+        _ecore_evas_idle_timeout_update(ee);
+        EINA_LIST_FOREACH(extn->ipc.clients, ll, client)
+           ecore_ipc_client_send(client, MAJOR, OP_UPDATE_DONE, 0, 0, 0, NULL, 0);
+     }
+
+   if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+   return updates ? 1 : rend;
+}
+
+static Eina_Bool
+_ipc_client_add(void *data, int type __UNUSED__, void *event)
+{
+   Ecore_Ipc_Event_Client_Add *e = event;
+   Ecore_Evas *ee = data;
+   Extn *extn;
+
+   if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
+     return ECORE_CALLBACK_PASS_ON;
+   if (!eina_list_data_find(extn_ee_list, ee))
+     return ECORE_CALLBACK_PASS_ON;
+   extn = ee->engine.buffer.data;
+   if (!extn) return ECORE_CALLBACK_PASS_ON;
+
+   extn->ipc.clients = eina_list_append(extn->ipc.clients, e->client);
+   ecore_ipc_client_send(e->client, MAJOR, OP_LOCK_FILE, 0, 0, 0, extn->file.lock, strlen(extn->file.lock) + 1);
+
+   if (extn->file.shmfile)
+     {
+        Ipc_Data_Resize ipc;
+
+        ecore_ipc_client_send(e->client, MAJOR, OP_SHM_REF,
+                              ee->w, ee->h, ee->alpha,
+                              extn->file.shmfile->file,
+                              strlen(extn->file.shmfile->file) + 1);
+        ipc.w = ee->w;
+        ipc.h = ee->h;
+
+        ecore_ipc_client_send(e->client, MAJOR, OP_RESIZE,
+                              0, 0, 0, &ipc, sizeof(ipc));
+     }
+   _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_ADD);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ipc_client_del(void *data, int type __UNUSED__, void *event)
+{
+   Ecore_Ipc_Event_Client_Del *e = event;
+   Ecore_Evas *ee = data;
+   Extn *extn;
+   extn = ee->engine.buffer.data;
+   if (!extn) return ECORE_CALLBACK_PASS_ON;
+   if (!eina_list_data_find(extn->ipc.clients, e->client)) return ECORE_CALLBACK_PASS_ON;
+
+   extn->ipc.clients = eina_list_remove(extn->ipc.clients, e->client);
+
+   _ecore_evas_extn_event(ee, ECORE_EVAS_EXTN_CLIENT_DEL);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ipc_client_data(void *data, int type __UNUSED__, void *event)
+{
+   Ecore_Ipc_Event_Client_Data *e = event;
+   Ecore_Evas *ee = data;
+   Extn *extn;
+
+   if (ee != ecore_ipc_server_data_get(ecore_ipc_client_server_get(e->client)))
+     return ECORE_CALLBACK_PASS_ON;
+   if (!eina_list_data_find(extn_ee_list, ee))
+     return ECORE_CALLBACK_PASS_ON;
+   extn = ee->engine.buffer.data;
+   if (!extn) return ECORE_CALLBACK_PASS_ON;
+   if (e->major != MAJOR)
+     return ECORE_CALLBACK_PASS_ON;
+   switch (e->minor)
+     {
+      case OP_RESIZE:
+         if ((e->data) && (e->size >= (int)sizeof(Ipc_Data_Resize)))
+           {
+
+              Ipc_Data_Resize *ipc = e->data;
+              /* create callbacke data size changed */
+              _ecore_evas_socket_resize(ee, ipc->w, ipc->h);
+           }
+         break;
+      case OP_SHOW:
+         if (!ee->visible)
+           {
+              ee->visible = 1;
+              if (ee->func.fn_show) ee->func.fn_show(ee);
+           }
+         break;
+      case OP_HIDE:
+         if (ee->visible)
+           {
+              ee->visible = 0;
+              if (ee->func.fn_hide) ee->func.fn_hide(ee);
+           }
+         break;
+      case OP_FOCUS:
+         if (!ee->prop.focused)
+           {
+              ee->prop.focused = 1;
+              evas_focus_in(ee->evas);
+              if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+           }
+         break;
+      case OP_UNFOCUS:
+         if (ee->prop.focused)
+           {
+              ee->prop.focused = 0;
+              evas_focus_out(ee->evas);
+              if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+           }
+         break;
+      case OP_EV_MOUSE_IN:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_In))
+           {
+              Ipc_Data_Ev_Mouse_In *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_mouse_in(ee->evas, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MOUSE_OUT:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Out))
+           {
+              Ipc_Data_Ev_Mouse_Out *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_mouse_out(ee->evas, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MOUSE_UP:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Up))
+           {
+              Ipc_Data_Ev_Mouse_Up *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_mouse_up(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MOUSE_DOWN:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Down))
+           {
+              Ipc_Data_Ev_Mouse_Up *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_mouse_down(ee->evas, ipc->b, ipc->flags, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MOUSE_MOVE:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Move))
+           {
+              Ipc_Data_Ev_Mouse_Move *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_mouse_move(ee->evas, ipc->x, ipc->y, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MOUSE_WHEEL:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Mouse_Wheel))
+           {
+              Ipc_Data_Ev_Mouse_Wheel *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_mouse_wheel(ee->evas, ipc->direction, ipc->z, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MULTI_UP:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Up))
+           {
+              Ipc_Data_Ev_Multi_Up *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_multi_up(ee->evas, ipc->d, ipc->x, ipc->y, ipc->rad, ipc->radx, ipc->rady, ipc->pres, ipc->ang, ipc->fx, ipc->fy, ipc->flags, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MULTI_DOWN:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Down))
+           {
+              Ipc_Data_Ev_Multi_Down *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_multi_down(ee->evas, ipc->d, ipc->x, ipc->y, ipc->rad, ipc->radx, ipc->rady, ipc->pres, ipc->ang, ipc->fx, ipc->fy, ipc->flags, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      case OP_EV_MULTI_MOVE:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Multi_Move))
+           {
+              Ipc_Data_Ev_Multi_Move *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+              evas_event_feed_multi_move(ee->evas, ipc->d, ipc->x, ipc->y, ipc->rad, ipc->radx, ipc->rady, ipc->pres, ipc->ang, ipc->fx, ipc->fy, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+
+#define STRGET(val) \
+         do { \
+              if ((ipc->val) && (ipc->val < (char *)(long)(e->size - 1))) \
+              ipc->val = ((char *)ipc) + (long)ipc->val; \
+              else \
+              ipc->val = NULL; \
+         } while (0)
+
+      case OP_EV_KEY_UP:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Up))
+           {
+              if ((e->data) && (e->size > 0) &&
+                  (((unsigned char *)e->data)[e->size - 1] == 0))
+                {
+                   Ipc_Data_Ev_Key_Up *ipc = e->data;
+                   Evas_Event_Flags flags;
+
+                   STRGET(keyname);
+                   STRGET(key);
+                   STRGET(string);
+                   STRGET(compose);
+                   flags = evas_event_default_flags_get(ee->evas);
+                   evas_event_default_flags_set(ee->evas, ipc->event_flags);
+                   _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+                   evas_event_feed_key_up(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
+                   evas_event_default_flags_set(ee->evas, flags);
+                }
+           }
+         break;
+      case OP_EV_KEY_DOWN:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Key_Down))
+           {
+              if ((e->data) && (e->size > 0) &&
+                  (((unsigned char *)e->data)[e->size - 1] == 0))
+                {
+                   Ipc_Data_Ev_Key_Down *ipc = e->data;
+                   Evas_Event_Flags flags;
+
+                   STRGET(keyname);
+                   STRGET(key);
+                   STRGET(string);
+                   STRGET(compose);
+                   flags = evas_event_default_flags_get(ee->evas);
+                   evas_event_default_flags_set(ee->evas, ipc->event_flags);
+                   _ecore_evas_modifiers_locks_mask_set(ee->evas, ipc->mask);
+                   evas_event_feed_key_down(ee->evas, ipc->keyname, ipc->key, ipc->string, ipc->compose, ipc->timestamp, NULL);
+                   evas_event_default_flags_set(ee->evas, flags);
+                }
+           }
+         break;
+      case OP_EV_HOLD:
+         if (e->size >= (int)sizeof(Ipc_Data_Ev_Hold))
+           {
+              Ipc_Data_Ev_Hold *ipc = e->data;
+              Evas_Event_Flags flags;
+
+              flags = evas_event_default_flags_get(ee->evas);
+              evas_event_default_flags_set(ee->evas, ipc->event_flags);
+              evas_event_feed_hold(ee->evas, ipc->hold, ipc->timestamp, NULL);
+              evas_event_default_flags_set(ee->evas, flags);
+           }
+         break;
+      default:
+         break;
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_ecore_evas_extn_socket_alpha_set(Ecore_Evas *ee, int alpha)
+{
+   Extn *extn;
+   Eina_List *l;
+   Ecore_Ipc_Client *client;
+
+   if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
+   ee->alpha = alpha;
+
+   extn = ee->engine.buffer.data;
+   if (extn)
+     {
+        Evas_Engine_Info_Buffer *einfo;
+
+        einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             if (ee->alpha)
+               einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+             else
+               einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+             evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+             evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
+        EINA_LIST_FOREACH(extn->ipc.clients, l, client)
+           ecore_ipc_client_send(client, MAJOR, OP_SHM_REF,
+                                 ee->w, ee->h, ee->alpha,
+                                 extn->file.shmfile->file,
+                                 strlen(extn->file.shmfile->file) + 1);
+     }
+}
+
+static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
+{
+   _ecore_evas_extn_free,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_socket_resize,
+   _ecore_evas_socket_move_resize,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_extn_socket_alpha_set,
+   NULL, //transparent
+   NULL, // profiles_set
+
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   
+   _ecore_evas_extn_socket_render, // render
+   NULL,  // screen_geometry_get
+   NULL,  // screen_dpi_get
+};
+
+#endif
+
+EAPI Ecore_Evas *
+ecore_evas_extn_socket_new(int w, int h)
+{
+#ifdef BUILD_ECORE_EVAS_EXTN
+   Evas_Engine_Info_Buffer *einfo;
+   Ecore_Evas *ee;
+   int rmethod;
+
+   rmethod = evas_render_method_lookup("buffer");
+   if (!rmethod) return NULL;
+   ee = calloc(1, sizeof(Ecore_Evas));
+   if (!ee) return NULL;
+
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_extn_socket_engine_func;
+
+   ee->driver = "extn_socket";
+
+   ee->rotation = 0;
+   ee->visible = 0;
+   ee->w = w;
+   ee->h = h;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
+
+   ee->prop.max.w = 0;
+   ee->prop.max.h = 0;
+   ee->prop.layer = 0;
+   ee->prop.focused = 0;
+   ee->prop.borderless = 1;
+   ee->prop.override = 1;
+   ee->prop.maximized = 0;
+   ee->prop.fullscreen = 0;
+   ee->prop.withdrawn = 0;
+   ee->prop.sticky = 0;
+
+   /* init evas here */
+   ee->evas = evas_new();
+   evas_data_attach_set(ee->evas, ee);
+   evas_output_method_set(ee->evas, rmethod);
+   evas_output_size_set(ee->evas, w, h);
+   evas_output_viewport_set(ee->evas, 0, 0, w, h);
+
+   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+        if (ee->alpha)
+          einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
+        else
+          einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+        einfo->info.dest_buffer = NULL;
+        einfo->info.dest_buffer_row_bytes = 0;
+        einfo->info.use_color_key = 0;
+        einfo->info.alpha_threshold = 0;
+        einfo->info.func.new_update_region = NULL;
+        einfo->info.func.free_update_region = NULL;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
+     }
+   evas_key_modifier_add(ee->evas, "Shift");
+   evas_key_modifier_add(ee->evas, "Control");
+   evas_key_modifier_add(ee->evas, "Alt");
+   evas_key_modifier_add(ee->evas, "Meta");
+   evas_key_modifier_add(ee->evas, "Hyper");
+   evas_key_modifier_add(ee->evas, "Super");
+   evas_key_lock_add(ee->evas, "Caps_Lock");
+   evas_key_lock_add(ee->evas, "Num_Lock");
+   evas_key_lock_add(ee->evas, "Scroll_Lock");
+
+   extn_ee_list = eina_list_append(extn_ee_list, ee);
+
+   _ecore_evas_register(ee);
+
+   return ee;
+#else
+   return NULL;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_evas_extn_socket_listen(Ecore_Evas *ee, const char *svcname, int svcnum, Eina_Bool svcsys)
+{
+#ifdef BUILD_ECORE_EVAS_EXTN
+   Extn *extn;
+
+   extn = calloc(1, sizeof(Extn));
+   if (!extn)
+     {
+        return EINA_FALSE;
+     }
+   else
+     {
+        Ecore_Ipc_Type ipctype = ECORE_IPC_LOCAL_USER;
+        char buf[PATH_MAX];
+
+        ecore_ipc_init();
+        extn->svc.name = eina_stringshare_add(svcname);
+        extn->svc.num = svcnum;
+        extn->svc.sys = svcsys;
+
+        snprintf(buf, sizeof(buf), "/tmp/ee-lock-XXXXXX");
+        extn->file.lockfd = mkstemp(buf);
+        if (extn->file.lockfd >= 0)
+          extn->file.lock = eina_stringshare_add(buf);
+        if ((extn->file.lockfd < 0) || (!extn->file.lock))
+          {
+             if (extn->file.lockfd)
+               {
+                  close(extn->file.lockfd);
+                  unlink(buf);
+               }
+             eina_stringshare_del(extn->svc.name);
+             if (extn->file.lock) eina_stringshare_del(extn->file.lock);
+             free(extn);
+             ecore_ipc_shutdown();
+             return EINA_FALSE;
+          }
+
+        if (extn->svc.sys) ipctype = ECORE_IPC_LOCAL_SYSTEM;
+        extn->ipc.am_server = EINA_TRUE;
+        extn->ipc.server = ecore_ipc_server_add(ipctype,
+                                                (char *)extn->svc.name,
+                                                extn->svc.num, ee);
+        if (!extn->ipc.server)
+          {
+             if (extn->file.lockfd)
+               {
+                  close(extn->file.lockfd);
+                  if (extn->file.lock) unlink(extn->file.lock);
+               }
+             eina_stringshare_del(extn->svc.name);
+             eina_stringshare_del(extn->file.lock);
+             free(extn);
+             ecore_ipc_shutdown();
+             return EINA_FALSE;
+          }
+        ee->engine.buffer.data = extn;
+        extn->ipc.handlers = eina_list_append
+           (extn->ipc.handlers,
+            ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
+                                    _ipc_client_add, ee));
+        extn->ipc.handlers = eina_list_append
+           (extn->ipc.handlers,
+            ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
+                                    _ipc_client_del, ee));
+        extn->ipc.handlers = eina_list_append
+           (extn->ipc.handlers,
+            ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
+                                    _ipc_client_data, ee));
+     }
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
index f29eaad..a8200a9 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-#include "config.h"
-#include "Ecore.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include <Ecore.h>
 #include "ecore_private.h"
-#include "ecore_evas_private.h"
-#include "Ecore_Evas.h"
 #ifdef BUILD_ECORE_EVAS_FB
-#include "Ecore_Fb.h"
-#include "ecore_fb_private.h"
+#include <Ecore_Fb.h>
+#include <ecore_fb_private.h>
 #endif
 
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
 #ifdef BUILD_ECORE_EVAS_FB
 static int _ecore_evas_init_count = 0;
 
-static int _ecore_evas_fps_debug = 0;
 static char *ecore_evas_default_display = "0";
-static Ecore_List *ecore_evas_input_devices = NULL;
-static Ecore_Evas *ecore_evases = NULL;
-static Ecore_Event_Handler *ecore_evas_event_handlers[6] = {NULL, NULL, NULL, NULL, NULL, NULL};
-static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
+static Eina_List *ecore_evas_input_devices = NULL;
+static Ecore_Event_Handler *ecore_evas_event_handlers[4] = {NULL, NULL, NULL, NULL};
 
 static void
-_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
+_ecore_evas_mouse_move_process_fb(Ecore_Evas *ee, int x, int y)
 {
    int fbw, fbh;
-   
+
    ee->mouse.x = x;
    ee->mouse.y = y;
    ecore_fb_size_get(&fbw, &fbh);
    if (ee->prop.cursor.object)
      {
-       evas_object_show(ee->prop.cursor.object);
+        evas_object_show(ee->prop.cursor.object);
         if (ee->rotation == 0)
-         evas_object_move(ee->prop.cursor.object,
-                          x - ee->prop.cursor.hot.x,
-                          y - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 90)
-         evas_object_move(ee->prop.cursor.object,
-                          (fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.x,
-                          x - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 180)
-         evas_object_move(ee->prop.cursor.object,
-                          (fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.x,
-                          (fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 270)
-         evas_object_move(ee->prop.cursor.object,
-                          y - ee->prop.cursor.hot.x,
-                          (fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.y);
+          evas_object_move(ee->prop.cursor.object,
+                           x - ee->prop.cursor.hot.x,
+                           y - ee->prop.cursor.hot.y);
+        else if (ee->rotation == 90)
+          evas_object_move(ee->prop.cursor.object,
+                           (fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.x,
+                           x - ee->prop.cursor.hot.y);
+        else if (ee->rotation == 180)
+          evas_object_move(ee->prop.cursor.object,
+                           (fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.x,
+                           (fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.y);
+        else if (ee->rotation == 270)
+          evas_object_move(ee->prop.cursor.object,
+                           y - ee->prop.cursor.hot.x,
+                           (fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.y);
      }
-   if (ee->rotation == 0)
-     evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
-   else if (ee->rotation == 90)
-     evas_event_feed_mouse_move(ee->evas, (fbh - ee->h) + ee->h - y - 1, x, timestamp, NULL);
-   else if (ee->rotation == 180)
-     evas_event_feed_mouse_move(ee->evas, (fbw - ee->w) + ee->w - x - 1, (fbh - ee->h) + ee->h - y - 1, timestamp, NULL);
-   else if (ee->rotation == 270)
-     evas_event_feed_mouse_move(ee->evas, y, (fbw - ee->w) + ee->w - x - 1, timestamp, NULL);   
 }
 
+static Ecore_Evas *fb_ee = NULL;
+
 static Ecore_Evas *
 _ecore_evas_fb_match(void)
 {
-   return ecore_evases;
+   return fb_ee;
 }
 
 static void
 _ecore_evas_fb_lose(void *data __UNUSED__)
 {
-   Ecore_List2 *l;
+   Eina_List *ll;
    Ecore_Fb_Input_Device *dev;
 
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-       
-       ee = (Ecore_Evas *)l;
-       ee->visible = 0;
-     }
-   if (ecore_evas_input_devices)
-     {
-       ecore_list_first_goto(ecore_evas_input_devices);
-       while ((dev = ecore_list_next(ecore_evas_input_devices)))
-         ecore_fb_input_device_listen(dev, 0);
-     }
+   if (fb_ee) fb_ee->visible = 0;
+
+   EINA_LIST_FOREACH(ecore_evas_input_devices, ll, dev)
+     ecore_fb_input_device_listen(dev, 0);
 }
 
 static void
 _ecore_evas_fb_gain(void *data __UNUSED__)
 {
-   Ecore_List2 *l;
+   Ecore_Evas *ee;
+   Eina_List *ll;
    Ecore_Fb_Input_Device *dev;
 
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-       
-       ee = (Ecore_Evas *)l;
-       ee->visible = 1;
-       if ((ee->rotation == 90) || (ee->rotation == 270))
-         evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
-       else
-         evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-     }
-   if (ecore_evas_input_devices)
+   if (fb_ee)
      {
-       ecore_list_first_goto(ecore_evas_input_devices);
-       while ((dev = ecore_list_next(ecore_evas_input_devices)))
-         ecore_fb_input_device_listen(dev, 1);
-     }
-}
+        ee = fb_ee;
 
-static int
-_ecore_evas_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas *ee;
-   Ecore_Fb_Event_Key_Down *e;
-   
-   e = event;
-   ee = _ecore_evas_fb_match();
-   if (!ee) return 1; /* pass on event */
-   evas_event_feed_key_down(ee->evas, e->keyname, e->keysymbol, e->key_compose, NULL, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
-   return 0; /* dont pass it on */
-}
+        ee->visible = 1;
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+        else
+          evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+     }
 
-static int
-_ecore_evas_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas *ee;
-   Ecore_Fb_Event_Key_Up *e;
-   
-   e = event;
-   ee = _ecore_evas_fb_match();
-   if (!ee) return 1; /* pass on event */
-   evas_event_feed_key_up(ee->evas, e->keyname, e->keysymbol, e->key_compose, NULL, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
-   return 0; /* dont pass it on */
+   EINA_LIST_FOREACH(ecore_evas_input_devices, ll, dev)
+     ecore_fb_input_device_listen(dev, 1);
 }
 
-static int
+static Eina_Bool
 _ecore_evas_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
-   Ecore_Fb_Event_Mouse_Button_Down *e;
-   Evas_Button_Flags flags = EVAS_BUTTON_NONE;
-   
+   Ecore_Event_Mouse_Button *e;
+
    e = event;
    ee = _ecore_evas_fb_match();
-   if (!ee) return 1; /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff));
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_down(ee->evas, e->button, flags, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
-   return 0; /* dont pass it on */
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
-   Ecore_Fb_Event_Mouse_Button_Up *e;
-   
+   Ecore_Event_Mouse_Button *e;
+
    e = event;
    ee = _ecore_evas_fb_match();
-   if (!ee) return 1; /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff));
-   evas_event_feed_mouse_up(ee->evas, e->button, EVAS_BUTTON_NONE, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
-   return 0; /* dont pass it on */
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
-   Ecore_Fb_Event_Mouse_Move *e;
-   
+   Ecore_Event_Mouse_Move *e;
+
    e = event;
    ee = _ecore_evas_fb_match();
-   if (!ee) return 1; /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff));
-   return 0; /* dont pass it on */
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
-   Ecore_Fb_Event_Mouse_Wheel *e;
-   
+   Ecore_Event_Mouse_Wheel *e;
+
    e = event;
    ee = _ecore_evas_fb_match();
-   if (!ee) return 1; /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff));
-   return 0; /* dont pass it on */
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
 static int
-_ecore_evas_idle_enter(void *data __UNUSED__)
+_ecore_evas_fb_render(Ecore_Evas *ee)
 {
-   Ecore_List2 *l;
-   double t1 = 0.;
-   double t2 = 0.;
+   int rend = 0;
 
-   if (_ecore_evas_fps_debug)
+   if (ee->visible)
      {
-       t1 = ecore_time_get();
-     }
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-       
-       ee = (Ecore_Evas *)l;
-       if (ee->visible)
-         {
-            Evas_List *updates;
-            
-#ifdef BUILD_ECORE_EVAS_BUFFER
-            Evas_List *ll;
-#endif
-            
-            if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
-#ifdef BUILD_ECORE_EVAS_BUFFER
-            for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
-              {
-                 Ecore_Evas *ee2;
-                 
-                 ee2 = ll->data;
-                 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
-                 _ecore_evas_buffer_render(ee2);
-                 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
-              }
-#endif      
-            updates = evas_render_updates(ee->evas);
-            if (updates)
-              {
-                 evas_render_updates_free(updates);
-                 _ecore_evas_idle_timeout_update(ee);
-              }
-            if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
-         }
-       else
-         evas_norender(ee->evas);
+        Eina_List *updates;
+        Eina_List *ll;
+        Ecore_Evas *ee2;
+
+        if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
+
+        EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+          {
+             if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+             if (ee2->engine.func->fn_render)
+               rend |= ee2->engine.func->fn_render(ee2);
+             if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+          }
+
+        updates = evas_render_updates(ee->evas);
+        if (updates)
+          {
+             evas_render_updates_free(updates);
+             _ecore_evas_idle_timeout_update(ee);
+             rend = 1;
+          }
+        if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
      }
-   if (_ecore_evas_fps_debug)
-     {
-       t2 = ecore_time_get();
-       _ecore_evas_fps_debug_rendertime_add(t2 - t1);
-     }
-   return 1;
+   else
+     evas_norender(ee->evas);
+   return rend;
 }
 
 static int
-_ecore_evas_fb_init(int w, int h)
+_ecore_evas_fb_init(Ecore_Evas *ee, int w, int h)
 {
+   Eina_File_Direct_Info *info;
+   Eina_Iterator *ls;
    Ecore_Fb_Input_Device *device;
    Ecore_Fb_Input_Device_Cap caps;
    int mouse_handled = 0;
-   int keyboard_handled = 0;
-   
-   DIR *input_dir;
-   struct dirent *input_entry;
-   
+
    _ecore_evas_init_count++;
    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
-   
-   if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
-   ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL);
-   if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
+
+   ecore_event_evas_init();
+
    /* register all input devices */
-   input_dir = opendir("/dev/input/");
-   if (!input_dir) return _ecore_evas_init_count;
-   
-   ecore_evas_input_devices = ecore_list_new();
-   while ((input_entry = readdir(input_dir)))
+   ls = eina_file_direct_ls("/dev/input/");
+
+   EINA_ITERATOR_FOREACH(ls, info)
      {
-       char device_path[256];
-       
-       if (strncmp(input_entry->d_name, "event", 5) != 0)
-         continue;
-       
-       snprintf(device_path, 256, "/dev/input/%s", input_entry->d_name);
-       if (!(device = ecore_fb_input_device_open(device_path)))
-         continue;
-       
-       caps = ecore_fb_input_device_cap_get(device);
-
-       if (ecore_evas_input_devices)
-         {
-            /* Mouse */
-            if (caps & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE)
-              {
-                 ecore_fb_input_device_axis_size_set(device, w, h);
-                 ecore_fb_input_device_listen(device,1);
-                 ecore_list_append(ecore_evas_input_devices, device);
-                 if (!mouse_handled)
-                   {
-                      ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_FB_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_event_mouse_button_down, NULL);
-                      ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_FB_EVENT_MOUSE_BUTTON_UP, _ecore_evas_event_mouse_button_up, NULL);
-                      ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_FB_EVENT_MOUSE_MOVE, _ecore_evas_event_mouse_move, NULL);
-                      ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_FB_EVENT_MOUSE_WHEEL, _ecore_evas_event_mouse_wheel, NULL);
-                      mouse_handled = 1;
-                   }
-              }
-            /* Keyboard */
-            else if ((caps & ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS) && !(caps & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE))
-              {
-                 ecore_fb_input_device_listen(device,1);
-                 ecore_list_append(ecore_evas_input_devices, device);
-                 if (!keyboard_handled)
-                   {
-                      ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_FB_EVENT_KEY_DOWN, _ecore_evas_event_key_down, NULL);
-                      ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_FB_EVENT_KEY_UP, _ecore_evas_event_key_up, NULL);
-                      keyboard_handled = 1;
-                   }
-              }
-         }
+        if (strncmp(info->path + info->name_start, "event", 5) != 0)
+          continue;
+
+        if (!(device = ecore_fb_input_device_open(info->path)))
+          continue;
+        ecore_fb_input_device_window_set(device, ee);
+
+        caps = ecore_fb_input_device_cap_get(device);
+
+        /* Mouse */
+#ifdef HAVE_TSLIB
+        if (caps & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE)
+#else
+        if ((caps & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE) || (caps & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE))
+#endif
+          {
+             ecore_fb_input_device_axis_size_set(device, w, h);
+             ecore_fb_input_device_listen(device,1);
+             ecore_evas_input_devices = eina_list_append(ecore_evas_input_devices, device);
+             if (!mouse_handled)
+               {
+                  ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_event_mouse_button_down, NULL);
+                  ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _ecore_evas_event_mouse_button_up, NULL);
+                  ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _ecore_evas_event_mouse_move, NULL);
+                  ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, _ecore_evas_event_mouse_wheel, NULL);
+                  mouse_handled = 1;
+               }
+          }
+        /* Keyboard */
+        else if ((caps & ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS) && !(caps & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE))
+          {
+             ecore_fb_input_device_listen(device,1);
+             ecore_evas_input_devices = eina_list_append(ecore_evas_input_devices, device);
+          }
      }
+   eina_iterator_free(ls);
+
    if (!mouse_handled)
      {
-       if (ecore_fb_ts_init())
-         {
-            ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_FB_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_event_mouse_button_down, NULL);
-            ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_FB_EVENT_MOUSE_BUTTON_UP, _ecore_evas_event_mouse_button_up, NULL);
-            ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_FB_EVENT_MOUSE_MOVE, _ecore_evas_event_mouse_move, NULL);
-            mouse_handled = 1;
-         }
+        if (ecore_fb_ts_init())
+          {
+             ecore_fb_ts_event_window_set(ee);
+             ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_event_mouse_button_down, NULL);
+             ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _ecore_evas_event_mouse_button_up, NULL);
+             ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _ecore_evas_event_mouse_move, NULL);
+             mouse_handled = 1;
+          }
      }
    return _ecore_evas_init_count;
 }
@@ -331,7 +255,8 @@ _ecore_evas_fb_init(int w, int h)
 static void
 _ecore_evas_fb_free(Ecore_Evas *ee)
 {
-   ecore_evases = _ecore_list2_remove(ecore_evases, ee);   
+   ecore_evas_input_event_unregister(ee);
+   if (fb_ee == ee) fb_ee = NULL;
    _ecore_evas_fb_shutdown();
    ecore_fb_shutdown();
 }
@@ -339,6 +264,8 @@ _ecore_evas_fb_free(Ecore_Evas *ee)
 static void
 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
 {
+   ee->req.w = w;
+   ee->req.h = h;
    if ((w == ee->w) && (h == ee->h)) return;
    ee->w = w;
    ee->h = h;
@@ -354,12 +281,14 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
        evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
      }
-   if (ee->func.fn_resize) ee->func.fn_resize(ee);     
+   if (ee->func.fn_resize) ee->func.fn_resize(ee);
 }
 
 static void
 _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
 {
+   ee->req.w = w;
+   ee->req.h = h;
    if ((w == ee->w) && (h == ee->h)) return;
    ee->w = w;
    ee->h = h;
@@ -375,15 +304,15 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int
        evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
      }
-   if (ee->func.fn_resize) ee->func.fn_resize(ee);     
+   if (ee->func.fn_resize) ee->func.fn_resize(ee);
 }
 
 static void
-_ecore_evas_rotation_set(Ecore_Evas *ee, int rotation)
+_ecore_evas_rotation_set(Ecore_Evas *ee, int rotation, int resize __UNUSED__)
 {
    Evas_Engine_Info_FB *einfo;
    int rot_dif;
-   
+
    if (ee->rotation == rotation) return;
    einfo = (Evas_Engine_Info_FB *)evas_engine_info_get(ee->evas);
    if (!einfo) return;
@@ -391,60 +320,98 @@ _ecore_evas_rotation_set(Ecore_Evas *ee, int rotation)
    if (rot_dif < 0) rot_dif = -rot_dif;
    if (rot_dif != 180)
      {
-       
-       einfo->info.rotation = rotation;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-       if (!ee->prop.fullscreen)
-         {
-            int tmp;
-            
-            tmp = ee->w;
-            ee->w = ee->h;
-            ee->h = tmp;
-         }
-       else
-         {
-            if ((rotation == 0) || (rotation == 180))
-              {
-                 evas_output_size_set(ee->evas, ee->w, ee->h);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-              }
-            else
-              {
-                 evas_output_size_set(ee->evas, ee->h, ee->w);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
-              }
-         }
-       ee->rotation = rotation;
+
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        if (!ee->prop.fullscreen)
+          {
+             int tmp;
+
+             tmp = ee->w;
+             ee->w = ee->h;
+             ee->h = tmp;
+             ee->req.w = ee->w;
+             ee->req.h = ee->h;
+          }
+        else
+          {
+             if ((rotation == 0) || (rotation == 180))
+               {
+                  evas_output_size_set(ee->evas, ee->w, ee->h);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+               }
+             else
+               {
+                  evas_output_size_set(ee->evas, ee->h, ee->w);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+               }
+          }
+        ee->rotation = rotation;
      }
    else
      {
-       einfo->info.rotation = rotation;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-       ee->rotation = rotation;
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        ee->rotation = rotation;
      }
    if ((ee->rotation == 90) || (ee->rotation == 270))
      evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
    else
      evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-   _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff));
+   _ecore_evas_mouse_move_process_fb(ee, ee->mouse.x, ee->mouse.y);
    if (ee->func.fn_resize) ee->func.fn_resize(ee);
 }
 
 static void
+_ecore_evas_show(Ecore_Evas *ee)
+{
+   if (ee->prop.focused) return;
+   ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+}
+
+static void
+_ecore_evas_hide(Ecore_Evas *ee)
+{
+   if (ee->prop.focused)
+     {
+        ee->prop.focused = 0;
+        evas_focus_out(ee->evas);
+        if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+     }
+}
+
+static void
+_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = data;
+   if (ee)
+     ee->prop.cursor.object = NULL;
+}
+
+static void
 _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
 {
    int x, y;
-   
+
    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
 
-   if (obj == NULL)
+   if (!obj)
      {
-       ee->prop.cursor.object = NULL;
-       ee->prop.cursor.layer = 0;
-       ee->prop.cursor.hot.x = 0;
-       ee->prop.cursor.hot.y = 0;
-       return;
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        return;
      }
 
    ee->prop.cursor.object = obj;
@@ -453,88 +420,90 @@ _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int h
    ee->prop.cursor.hot.y = hot_y;
    evas_pointer_output_xy_get(ee->evas, &x, &y);
    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
-   evas_object_move(ee->prop.cursor.object, 
-                   x - ee->prop.cursor.hot.x,
-                   y - ee->prop.cursor.hot.y);
+   evas_object_move(ee->prop.cursor.object,
+                    x - ee->prop.cursor.hot.x,
+                    y - ee->prop.cursor.hot.y);
    evas_object_pass_events_set(ee->prop.cursor.object, 1);
    if (evas_pointer_inside_get(ee->evas))
      evas_object_show(ee->prop.cursor.object);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
 }
 
 static void
 _ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
 {
+   Eina_List *l;
+   Ecore_Fb_Input_Device *dev;
    int resized = 0;
-   
+
    if (((ee->prop.fullscreen) && (on)) ||
        ((!ee->prop.fullscreen) && (!on))) return;
    if (on)
      {
-       int w, h;
-       
-       ee->engine.fb.real_w = ee->w;
-       ee->engine.fb.real_h = ee->h;
-       w = ee->w;
-       h = ee->h;
-       ecore_fb_size_get(&w, &h);
-       if ((w == 0) && (h == 0))
-         {
-            w = ee->w;
-            h = ee->h;
-         }
-       if ((w != ee->w) || (h != ee->h)) resized = 1;
-       ee->w = w;
-       ee->h = h;
-       evas_output_size_set(ee->evas, ee->w, ee->h);
-       evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-       evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+        int w, h;
+
+        ee->engine.fb.real_w = ee->w;
+        ee->engine.fb.real_h = ee->h;
+        w = ee->w;
+        h = ee->h;
+        ecore_fb_size_get(&w, &h);
+        if ((w == 0) && (h == 0))
+          {
+             w = ee->w;
+             h = ee->h;
+          }
+        if ((w != ee->w) || (h != ee->h)) resized = 1;
+        ee->w = w;
+        ee->h = h;
+        ee->req.w = ee->w;
+        ee->req.h = ee->h;
+        evas_output_size_set(ee->evas, ee->w, ee->h);
+        evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
      }
    else
      {
-       if ((ee->engine.fb.real_w != ee->w) || (ee->engine.fb.real_h != ee->h)) resized = 1;
-       ee->w = ee->engine.fb.real_w;
-       ee->h = ee->engine.fb.real_h;
-       evas_output_size_set(ee->evas, ee->w, ee->h);
-       evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-       evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+        if ((ee->engine.fb.real_w != ee->w) || (ee->engine.fb.real_h != ee->h)) resized = 1;
+        ee->w = ee->engine.fb.real_w;
+        ee->h = ee->engine.fb.real_h;
+        ee->req.w = ee->w;
+        ee->req.h = ee->h;
+        evas_output_size_set(ee->evas, ee->w, ee->h);
+        evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
      }
    ee->prop.fullscreen = on;
+   EINA_LIST_FOREACH(ecore_evas_input_devices, l, dev)
+     ecore_fb_input_device_axis_size_set(dev, ee->w, ee->h);
    /* rescale the input device area */
-   if (ecore_evas_input_devices)
-     {
-       Ecore_Fb_Input_Device *dev;
-       
-       ecore_list_first_goto(ecore_evas_input_devices);
-       while ((dev = ecore_list_next(ecore_evas_input_devices)))
-         ecore_fb_input_device_axis_size_set(dev, ee->w, ee->h);
-     }
    if (resized)
      {
-       if (ee->func.fn_resize) ee->func.fn_resize(ee); 
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
      }
 }
-    
+
 int
 _ecore_evas_fb_shutdown(void)
 {
    _ecore_evas_init_count--;
    if (_ecore_evas_init_count == 0)
      {
-       int i;
-   
-       while (ecore_evases) _ecore_evas_free(ecore_evases);
-       for (i = 0; i < 5; i++)
-         ecore_event_handler_del(ecore_evas_event_handlers[i]);
-       ecore_idle_enterer_del(ecore_evas_idle_enterer);
-       ecore_evas_idle_enterer = NULL;
-       if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
-       ecore_fb_ts_shutdown();
+        int i;
+
+        for (i = 0; i < 4; i++)
+          {
+             if (ecore_evas_event_handlers[i])
+               ecore_event_handler_del(ecore_evas_event_handlers[i]);
+          }
+        ecore_fb_ts_shutdown();
+        ecore_event_evas_shutdown();
      }
    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
    return _ecore_evas_init_count;
 }
 
-static const Ecore_Evas_Engine_Func _ecore_fb_engine_func =
+static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
 {
    _ecore_evas_fb_free,
      NULL,
@@ -557,8 +526,8 @@ static const Ecore_Evas_Engine_Func _ecore_fb_engine_func =
      _ecore_evas_move_resize,
      _ecore_evas_rotation_set,
      NULL,
-     NULL,
-     NULL,
+     _ecore_evas_show,
+     _ecore_evas_hide,
      NULL,
      NULL,
      NULL,
@@ -579,19 +548,36 @@ static const Ecore_Evas_Engine_Func _ecore_fb_engine_func =
      NULL,
      NULL,
      NULL,
-     NULL
+     NULL,
+     NULL,
+     NULL, //transparent
+     NULL, // profiles_set
+
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+
+     NULL, // render
+     NULL, // screen_geometry_get
+     NULL  // screen_dpi_get
 };
 #endif
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Create Ecore_Evas using fb backend.
+ * @param disp_name The name of the display to be used.
+ * @param rotation The rotation to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return The new Ecore_Evas.
  */
+#ifdef BUILD_ECORE_EVAS_FB
 EAPI Ecore_Evas *
-ecore_evas_fb_new(char *disp_name, int rotation, int w, int h)
+ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
 {
-#ifdef BUILD_ECORE_EVAS_FB
    Evas_Engine_Info_FB *einfo;
    Ecore_Evas *ee;
 
@@ -602,7 +588,7 @@ ecore_evas_fb_new(char *disp_name, int rotation, int w, int h)
 
    rmethod = evas_render_method_lookup("fb");
    if (!rmethod) return NULL;
-   
+
    if (!ecore_fb_init(disp_name)) return NULL;
    ecore_fb_callback_gain_set(_ecore_evas_fb_gain, NULL);
    ecore_fb_callback_lose_set(_ecore_evas_fb_lose, NULL);
@@ -610,11 +596,11 @@ ecore_evas_fb_new(char *disp_name, int rotation, int w, int h)
    if (!ee) return NULL;
 
    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
-   
-   _ecore_evas_fb_init(w, h);
-   
+
+   _ecore_evas_fb_init(ee, w, h);
+
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_fb_engine_func;
-   
+
    ee->driver = "fb";
    if (disp_name) ee->name = strdup(disp_name);
 
@@ -624,18 +610,20 @@ ecore_evas_fb_new(char *disp_name, int rotation, int w, int h)
    ee->visible = 1;
    ee->w = w;
    ee->h = h;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 0;
    ee->prop.max.h = 0;
    ee->prop.layer = 0;
-   ee->prop.focused = 1;
+   ee->prop.focused = 0;
    ee->prop.borderless = 1;
    ee->prop.override = 1;
    ee->prop.maximized = 1;
    ee->prop.fullscreen = 0;
    ee->prop.withdrawn = 0;
    ee->prop.sticky = 0;
-   
+
    /* init evas here */
    ee->evas = evas_new();
    evas_data_attach_set(ee->evas, ee);
@@ -653,32 +641,38 @@ ecore_evas_fb_new(char *disp_name, int rotation, int w, int h)
      }
 
    einfo = (Evas_Engine_Info_FB *)evas_engine_info_get(ee->evas);
-   if (einfo)
+   if (einfo && disp_name)
      {
-       einfo->info.virtual_terminal = 0;
-       einfo->info.device_number = strtol(disp_name, NULL, 10);
-       einfo->info.device_number = 0;
-       einfo->info.refresh = 0;
-       einfo->info.rotation = ee->rotation;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        einfo->info.virtual_terminal = 0;
+        einfo->info.device_number = strtol(disp_name, NULL, 10);
+        einfo->info.refresh = 0;
+        einfo->info.rotation = ee->rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
      }
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
-   
-   evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
+     }
+
+   ecore_evas_input_event_register(ee);
 
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
+   ee->engine.func->fn_render = _ecore_evas_fb_render;
+   _ecore_evas_register(ee);
+   fb_ee = ee;
+   evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
    return ee;
+}
 #else
-   disp_name = NULL;
-   rotation = w = h = 0;
+EAPI Ecore_Evas *
+ecore_evas_fb_new(const char *disp_name __UNUSED__, int rotation __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
    return NULL;
-#endif   
 }
+#endif
index 2fd475a..664748c 100644 (file)
@@ -1,62 +1,42 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
 #ifndef _ECORE_EVAS_PRIVATE_H
 #define _ECORE_EVAS_PRIVATE_H
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "Ecore_Data.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#ifdef HAVE_SYS_MMAN_H
-# include <sys/mman.h>
-#endif
-
 #include <Evas.h>
+#include <Ecore.h>
+#include <ecore_private.h>
+#include <Ecore_Input.h>
+#include <Ecore_Input_Evas.h>
 
 #define ECORE_MAGIC_EVAS 0x76543211
 
-#ifndef BUILD_ECORE_DIRECTFB
-# undef BUILD_ECORE_EVAS_DIRECTFB
-#endif
-
 #ifdef BUILD_ECORE_EVAS_X11
-# include "Ecore_X.h"
+# include <Ecore_X.h>
+# include <Ecore_X_Atoms.h>
 # ifdef HAVE_ECORE_X_XCB
 #  include <xcb/xcb.h>
-#  ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-#   include <Evas_Engine_Software_Xcb.h>
-#  endif
-#  ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-#   include <xcb/render.h>
-#   include <Evas_Engine_XRender_Xcb.h>
-#  endif
 # endif
 # ifdef HAVE_ECORE_X_XLIB
 #  include <X11/Xlib.h>
 #  include <X11/Xutil.h>
-#  ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
-#   include <Evas_Engine_Software_X11.h>
-#  endif
-#  ifdef BUILD_ECORE_EVAS_XRENDER_X11
-#   include <X11/extensions/Xrender.h>
-#   include <Evas_Engine_XRender_X11.h>
-#  endif
-#  ifdef BUILD_ECORE_EVAS_OPENGL_X11
-#    include <Evas_Engine_GL_X11.h>
-#  endif
-#  ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
-#   include <Evas_Engine_Software_16_X11.h>
-#  endif
 # endif
 #endif
 
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+# include <Evas_Engine_Software_X11.h>
+#endif
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+# include <Evas_Engine_GL_X11.h>
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
+# include <Evas_Engine_Software_8_X11.h>
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
+# include <Evas_Engine_Software_16_X11.h>
+#endif
+
 #ifdef BUILD_ECORE_EVAS_FB
 # include <Evas_Engine_FB.h>
 #endif
 # include "Ecore_DirectFB.h"
 #endif
 
-#ifdef BUILD_ECORE_EVAS_BUFFER
+#if defined(BUILD_ECORE_EVAS_SOFTWARE_BUFFER) || defined(BUILD_ECORE_EVAS_EWS)
 # include <Evas_Engine_Buffer.h>
 #endif
 
 #ifdef BUILD_ECORE_EVAS_WIN32
 # include "Ecore_Win32.h"
+# ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+#  include <Evas_Engine_Software_Gdi.h>
+# endif
 # ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
 #  include <Evas_Engine_Software_DDraw.h>
 # endif
 # include <Evas_Engine_Software_16_WinCE.h>
 #endif
 
+#ifdef BUILD_ECORE_EVAS_GL_COCOA
+# include "Ecore_Cocoa.h"
+# include <Evas_Engine_Gl_Cocoa.h>
+#endif
+
+#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined(BUILD_ECORE_EVAS_WAYLAND_EGL)
+# include "Ecore_Wayland.h"
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+# include <Evas_Engine_Wayland_Shm.h>
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+# include <Evas_Engine_Wayland_Egl.h>
+#endif
+
+/** Log domain macros and variables **/
+
+extern int _ecore_evas_log_dom;
+
+#ifdef ECORE_EVAS_DEFAULT_LOG_COLOR
+# undef ECORE_EVAS_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_EVAS_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_evas_log_dom, __VA_ARGS__)
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_evas_log_dom, __VA_ARGS__)
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_evas_log_dom, __VA_ARGS__)
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_evas_log_dom, __VA_ARGS__)
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_evas_log_dom, __VA_ARGS__)
+
 
 #define IDLE_FLUSH_TIME 0.5
+#ifndef _ECORE_EVAS_H
+typedef struct _Ecore_Evas Ecore_Evas;
+typedef void   (*Ecore_Evas_Event_Cb) (Ecore_Evas *ee);
+#endif
 
-typedef struct _Ecore_Evas             Ecore_Evas;
-typedef struct _Ecore_Evas_Engine      Ecore_Evas_Engine;
+typedef struct _Ecore_Evas_Engine Ecore_Evas_Engine;
 typedef struct _Ecore_Evas_Engine_Func Ecore_Evas_Engine_Func;
 
 struct _Ecore_Evas_Engine_Func
 {
-   void        (*fn_free) (Ecore_Evas *ee);
-   void        (*fn_callback_resize_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_move_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_show_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_hide_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_delete_request_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_destroy_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_focus_in_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_focus_out_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_mouse_in_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_mouse_out_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_sticky_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_unsticky_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_pre_render_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_callback_post_render_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
-   void        (*fn_move) (Ecore_Evas *ee, int x, int y);
-   void        (*fn_managed_move) (Ecore_Evas *ee, int x, int y);
-   void        (*fn_resize) (Ecore_Evas *ee, int w, int h);
-   void        (*fn_move_resize) (Ecore_Evas *ee, int x, int y, int w, int h);
-   void        (*fn_rotation_set) (Ecore_Evas *ee, int rot);
-   void        (*fn_shaped_set) (Ecore_Evas *ee, int shaped);
-   void        (*fn_show) (Ecore_Evas *ee);
-   void        (*fn_hide) (Ecore_Evas *ee);
-   void        (*fn_raise) (Ecore_Evas *ee);
-   void        (*fn_lower) (Ecore_Evas *ee);
-   void        (*fn_activate) (Ecore_Evas *ee);
-   void        (*fn_title_set) (Ecore_Evas *ee, const char *t);
-   void        (*fn_name_class_set) (Ecore_Evas *ee, const char *n, const char *c);
-   void        (*fn_size_min_set) (Ecore_Evas *ee, int w, int h);
-   void        (*fn_size_max_set) (Ecore_Evas *ee, int w, int h);
-   void        (*fn_size_base_set) (Ecore_Evas *ee, int w, int h);
-   void        (*fn_size_step_set) (Ecore_Evas *ee, int w, int h);
-   void        (*fn_object_cursor_set) (Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
-   void        (*fn_layer_set) (Ecore_Evas *ee, int layer);
-   void        (*fn_focus_set) (Ecore_Evas *ee, int on);
-   void        (*fn_iconified_set) (Ecore_Evas *ee, int on);
-   void        (*fn_borderless_set) (Ecore_Evas *ee, int on);
-   void        (*fn_override_set) (Ecore_Evas *ee, int on);
-   void        (*fn_maximized_set) (Ecore_Evas *ee, int on);
-   void        (*fn_fullscreen_set) (Ecore_Evas *ee, int on);
-   void        (*fn_avoid_damage_set) (Ecore_Evas *ee, int on);
-   void        (*fn_withdrawn_set) (Ecore_Evas *ee, int withdrawn);
-   void        (*fn_sticky_set) (Ecore_Evas *ee, int sticky);
-   void        (*fn_ignore_events_set) (Ecore_Evas *ee, int ignore);
-   void        (*fn_alpha_set) (Ecore_Evas *ee, int alpha);
-   void       *(*fn_window_get) (Ecore_Evas *ee);
+   void (*fn_free) (Ecore_Evas *ee);
+   void (*fn_callback_resize_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_move_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_show_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_hide_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_delete_request_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_destroy_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_focus_in_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_focus_out_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_mouse_in_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_mouse_out_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_sticky_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_unsticky_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_pre_render_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_callback_post_render_set) (Ecore_Evas *ee, Ecore_Evas_Event_Cb func);
+   void (*fn_move) (Ecore_Evas *ee, int x, int y);
+   void (*fn_managed_move) (Ecore_Evas *ee, int x, int y);
+   void (*fn_resize) (Ecore_Evas *ee, int w, int h);
+   void (*fn_move_resize) (Ecore_Evas *ee, int x, int y, int w, int h);
+   void (*fn_rotation_set) (Ecore_Evas *ee, int rot, int resize);
+   void (*fn_shaped_set) (Ecore_Evas *ee, int shaped);
+   void (*fn_show) (Ecore_Evas *ee);
+   void (*fn_hide) (Ecore_Evas *ee);
+   void (*fn_raise) (Ecore_Evas *ee);
+   void (*fn_lower) (Ecore_Evas *ee);
+   void (*fn_activate) (Ecore_Evas *ee);
+   void (*fn_title_set) (Ecore_Evas *ee, const char *t);
+   void (*fn_name_class_set) (Ecore_Evas *ee, const char *n, const char *c);
+   void (*fn_size_min_set) (Ecore_Evas *ee, int w, int h);
+   void (*fn_size_max_set) (Ecore_Evas *ee, int w, int h);
+   void (*fn_size_base_set) (Ecore_Evas *ee, int w, int h);
+   void (*fn_size_step_set) (Ecore_Evas *ee, int w, int h);
+   void (*fn_object_cursor_set) (Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
+   void (*fn_layer_set) (Ecore_Evas *ee, int layer);
+   void (*fn_focus_set) (Ecore_Evas *ee, int on);
+   void (*fn_iconified_set) (Ecore_Evas *ee, int on);
+   void (*fn_borderless_set) (Ecore_Evas *ee, int on);
+   void (*fn_override_set) (Ecore_Evas *ee, int on);
+   void (*fn_maximized_set) (Ecore_Evas *ee, int on);
+   void (*fn_fullscreen_set) (Ecore_Evas *ee, int on);
+   void (*fn_avoid_damage_set) (Ecore_Evas *ee, int on);
+   void (*fn_withdrawn_set) (Ecore_Evas *ee, int withdrawn);
+   void (*fn_sticky_set) (Ecore_Evas *ee, int sticky);
+   void (*fn_ignore_events_set) (Ecore_Evas *ee, int ignore);
+   void (*fn_alpha_set) (Ecore_Evas *ee, int alpha);
+   void (*fn_transparent_set) (Ecore_Evas *ee, int transparent);
+   void (*fn_profiles_set) (Ecore_Evas *ee, const char **profiles, int num_profiles);
+
+   void (*fn_window_group_set) (Ecore_Evas *ee, const Ecore_Evas *ee_group);
+   void (*fn_aspect_set) (Ecore_Evas *ee, double aspect);
+   void (*fn_urgent_set) (Ecore_Evas *ee, int urgent);
+   void (*fn_modal_set) (Ecore_Evas *ee, int modal);
+   void (*fn_demands_attention_set) (Ecore_Evas *ee, int demand);
+   void (*fn_focus_skip_set) (Ecore_Evas *ee, int skip);
+
+   int (*fn_render) (Ecore_Evas *ee);
+   void (*fn_screen_geometry_get) (const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
+   void (*fn_screen_dpi_get) (const Ecore_Evas *ee, int *xdpi, int *ydpi);
 };
 
 struct _Ecore_Evas_Engine
 {
    Ecore_Evas_Engine_Func *func;
 
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-   struct {
+/* TODO: UGLY! This should be an union or inheritance! */
+#ifdef BUILD_ECORE_EVAS_X11
+   struct 
+     {
       Ecore_X_Window win_root;
-      Ecore_X_Window win;
-      Evas_List     *win_extra;
+      Eina_List     *win_extra;
       Ecore_X_Pixmap pmap;
       Ecore_X_Pixmap mask;
       Ecore_X_GC     gc;
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-# warning [XCB] No Region code
-#else
-      Region         damages;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
+      Ecore_X_XRegion *damages;
+      Ecore_X_Sync_Counter sync_counter;
+      Ecore_X_Window leader;
+      Ecore_X_Sync_Counter netwm_sync_counter;
+      int            netwm_sync_val_hi;
+      unsigned int   netwm_sync_val_lo;
+      int            sync_val; // bigger! this will screw up at 2 billion frames (414 days of continual rendering @ 60fps)
+      int            screen_num;
       int            px, py, pw, ph;
       unsigned char  direct_resize : 1;
       unsigned char  using_bg_pixmap : 1;
       unsigned char  managed : 1;
+      unsigned char  sync_began : 1;
+      unsigned char  sync_cancel : 1;
+      unsigned char  netwm_sync_set : 1;
+      unsigned char  configure_coming : 1;
       struct {
           unsigned char modal : 1;
           unsigned char sticky : 1;
@@ -181,6 +234,7 @@ struct _Ecore_Evas_Engine
           unsigned char above : 1;
           unsigned char below : 1;
       } state;
+      Ecore_X_Window win_shaped_input;
    } x;
 #endif
 #ifdef BUILD_ECORE_EVAS_FB
@@ -189,10 +243,13 @@ struct _Ecore_Evas_Engine
       int real_h;
    } fb;
 #endif
-#ifdef BUILD_ECORE_EVAS_BUFFER
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
    struct {
       void *pixels;
       Evas_Object *image;
+      void  (*free_func) (void *data, void *pix);
+      void *(*alloc_func) (void *data, int size);
+      void *data;
    } buffer;
 #endif
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
@@ -203,39 +260,69 @@ struct _Ecore_Evas_Engine
 #ifdef BUILD_ECORE_EVAS_WIN32
    struct {
       Ecore_Win32_Window *parent;
-      Ecore_Win32_Window *window;
-     struct {
-       unsigned char fullscreen : 1;
-     } state;
+      struct {
+         unsigned char region     : 1;
+         unsigned char fullscreen : 1;
+      } state;
    } win32;
 #endif
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
    struct {
       Ecore_WinCE_Window *window;
+      struct {
+         unsigned char fullscreen : 1;
+      } state;
    } wince;
 #endif
+#ifdef BUILD_ECORE_EVAS_EWS
+   struct {
+      Evas_Object *image;
+   } ews;
+#endif
+
+#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined(BUILD_ECORE_EVAS_WAYLAND_EGL)
+   struct 
+     {
+        Ecore_Wl_Window *parent, *win;
+        Evas_Object *frame;
+
+# if defined(BUILD_ECORE_EVAS_WAYLAND_SHM)
+        struct wl_shm_pool *pool;
+        size_t pool_size;
+        void *pool_data;
+        struct wl_buffer *buffer;
+# endif
+
+     } wl;
+#endif
 
    Ecore_Timer *idle_flush_timer;
 };
 
 struct _Ecore_Evas
 {
-   Ecore_List  __list_data;
+   EINA_INLIST;
    ECORE_MAGIC;
    Evas       *evas;
    const char *driver;
    char       *name;
    int         x, y, w, h;
    short       rotation;
-   char        shaped  : 1;
-   char        visible : 1;
-   char        draw_ok : 1;
-   char        should_be_visible : 1;
-   char        alpha  : 1;
+   Eina_Bool   shaped  : 1;
+   Eina_Bool   visible : 1;
+   Eina_Bool   draw_ok : 1;
+   Eina_Bool   should_be_visible : 1;
+   Eina_Bool   alpha  : 1;
+   Eina_Bool   transparent  : 1;
+   Eina_Bool   in  : 1;
 
-   Evas_Hash  *data;
+   Eina_Hash  *data;
 
    struct {
+      int      x, y, w, h;
+   } req;
+   
+   struct {
       int      x, y;
    } mouse;
 
@@ -247,6 +334,7 @@ struct _Ecore_Evas
       char           *title;
       char           *name;
       char           *clas;
+      char           *profile;
       struct {
         int          w, h;
       } min,
@@ -261,7 +349,11 @@ struct _Ecore_Evas
         } hot;
       } cursor;
       int             layer;
+      Ecore_Window    window;
       unsigned char   avoid_damage;
+      Ecore_Evas     *group_ee;
+      Ecore_Window    group_ee_win;
+      double          aspect;
       char            focused      : 1;
       char            iconified    : 1;
       char            borderless   : 1;
@@ -271,7 +363,13 @@ struct _Ecore_Evas
       char            withdrawn    : 1;
       char            sticky       : 1;
       char            request_pos  : 1;
-   } prop;
+      char            draw_frame   : 1;
+      char            hwsurface    : 1;
+      char            urgent           : 1;
+      char            modal            : 1;
+      char            demand_attention : 1;
+      char            focus_skip       : 1;
+  } prop;
 
    struct {
       void          (*fn_resize) (Ecore_Evas *ee);
@@ -288,23 +386,36 @@ struct _Ecore_Evas
       void          (*fn_mouse_out) (Ecore_Evas *ee);
       void          (*fn_pre_render) (Ecore_Evas *ee);
       void          (*fn_post_render) (Ecore_Evas *ee);
+      void          (*fn_pre_free) (Ecore_Evas *ee);
+      void          (*fn_state_change) (Ecore_Evas *ee);
    } func;
 
    Ecore_Evas_Engine engine;
-   Evas_List *sub_ecore_evas;
+   Eina_List *sub_ecore_evas;
+
+   int refcount;
 
    unsigned char ignore_events : 1;
+   unsigned char manual_render : 1;
+   unsigned char registered : 1;
+   unsigned char no_comp_sync  : 1;
+   unsigned char semi_sync  : 1;
+   unsigned char deleted : 1;
+   int           gl_sync_draw_done; // added by gl77.lee
 };
 
+void _ecore_evas_ref(Ecore_Evas *ee);
+void _ecore_evas_unref(Ecore_Evas *ee);
+
 #ifdef BUILD_ECORE_EVAS_X11
 int _ecore_evas_x_shutdown(void);
 #endif
 #ifdef BUILD_ECORE_EVAS_FB
 int _ecore_evas_fb_shutdown(void);
 #endif
-#ifdef BUILD_ECORE_EVAS_BUFFER
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
 int _ecore_evas_buffer_shutdown(void);
-void _ecore_evas_buffer_render(Ecore_Evas *ee);
+int _ecore_evas_buffer_render(Ecore_Evas *ee);
 #endif
 #ifdef BUILD_ECORE_EVAS_DIRECTFB
 int _ecore_evas_directfb_shutdown(void);
@@ -315,11 +426,91 @@ int _ecore_evas_win32_shutdown(void);
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
 int _ecore_evas_wince_shutdown(void);
 #endif
+#ifdef BUILD_ECORE_EVAS_EWS
+void _ecore_evas_ews_events_init(void);
+int _ecore_evas_ews_shutdown(void);
+#endif
+
+#if defined(BUILD_ECORE_EVAS_WAYLAND_SHM) || defined(BUILD_ECORE_EVAS_WAYLAND_EGL)
+int  _ecore_evas_wl_common_init(void);
+int  _ecore_evas_wl_common_shutdown(void);
+void _ecore_evas_wl_common_pre_free(Ecore_Evas *ee);
+void _ecore_evas_wl_common_free(Ecore_Evas *ee);
+void _ecore_evas_wl_common_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee));
+void _ecore_evas_wl_common_move(Ecore_Evas *ee, int x, int y);
+void _ecore_evas_wl_common_raise(Ecore_Evas *ee);
+void _ecore_evas_wl_common_title_set(Ecore_Evas *ee, const char *title);
+void _ecore_evas_wl_common_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
+void _ecore_evas_wl_common_size_min_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_size_max_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_size_base_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_size_step_set(Ecore_Evas *ee, int w, int h);
+void _ecore_evas_wl_common_layer_set(Ecore_Evas *ee, int layer);
+void _ecore_evas_wl_common_iconified_set(Ecore_Evas *ee, int iconify);
+void _ecore_evas_wl_common_maximized_set(Ecore_Evas *ee, int max);
+void _ecore_evas_wl_common_fullscreen_set(Ecore_Evas *ee, int full);
+void _ecore_evas_wl_common_ignore_events_set(Ecore_Evas *ee, int ignore);
+int  _ecore_evas_wl_common_pre_render(Ecore_Evas *ee);
+int  _ecore_evas_wl_common_render_updates(Ecore_Evas *ee);
+void _ecore_evas_wl_common_post_render(Ecore_Evas *ee);
+int  _ecore_evas_wl_common_render(Ecore_Evas *ee);
+void _ecore_evas_wl_common_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
+void _ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi);
+
+Evas_Object * _ecore_evas_wl_common_frame_add(Evas *evas);
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+void _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location);
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+void _ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location);
+#endif
+#endif
 
 void _ecore_evas_fps_debug_init(void);
 void _ecore_evas_fps_debug_shutdown(void);
 void _ecore_evas_fps_debug_rendertime_add(double t);
+void _ecore_evas_register(Ecore_Evas *ee);
 void _ecore_evas_free(Ecore_Evas *ee);
 void _ecore_evas_idle_timeout_update(Ecore_Evas *ee);
+void _ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp);
+void _ecore_evas_mouse_multi_move_process(Ecore_Evas *ee, int device,
+                                          int x, int y,
+                                          double radius,
+                                          double radius_x, double radius_y,
+                                          double pressure,
+                                          double angle,
+                                          double mx, double my,
+                                          unsigned int timestamp);
+void _ecore_evas_mouse_multi_down_process(Ecore_Evas *ee, int device,
+                                          int x, int y,
+                                          double radius,
+                                          double radius_x, double radius_y,
+                                          double pressure,
+                                          double angle,
+                                          double mx, double my,
+                                          Evas_Button_Flags flags,
+                                          unsigned int timestamp);
+void _ecore_evas_mouse_multi_up_process(Ecore_Evas *ee, int device,
+                                        int x, int y,
+                                        double radius,
+                                        double radius_x, double radius_y,
+                                        double pressure,
+                                        double angle,
+                                        double mx, double my,
+                                        Evas_Button_Flags flags,
+                                        unsigned int timestamp);
+
+extern Eina_Bool _ecore_evas_app_comp_sync;
+
+void _ecore_evas_extn_init(void);
+void _ecore_evas_extn_shutdown(void);
 
 #endif
diff --git a/src/lib/ecore_evas/ecore_evas_psl1ght.c b/src/lib/ecore_evas/ecore_evas_psl1ght.c
new file mode 100644 (file)
index 0000000..98d570e
--- /dev/null
@@ -0,0 +1,515 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Ecore.h>
+#include <Ecore_Input.h>
+#include <Ecore_Input_Evas.h>
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+#ifdef BUILD_ECORE_EVAS_PSL1GHT
+#include <Ecore_Psl1ght.h>
+#include <Evas_Engine_PSL1GHT.h>
+
+static int _ecore_evas_init_count = 0;
+
+static Ecore_Evas *psl1ght_ee = NULL;
+static Ecore_Event_Handler *ecore_evas_event_handlers[5] = {
+   NULL, NULL, NULL, NULL
+};
+
+static const char *ecore_evas_psl1ght_default = "EFL PSL1GHT";
+static int _ecore_evas_fps_debug = 0;
+static Ecore_Poller *ecore_evas_event;
+
+static unsigned int
+_ecore_evas_time_get()
+{
+   return (unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff;
+}
+
+static Ecore_Evas *
+_ecore_evas_psl1ght_match(void)
+{
+   return psl1ght_ee;
+}
+
+static Eina_Bool
+_ecore_evas_psl1ght_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = _ecore_evas_psl1ght_match();
+
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   /* pass on event */
+   ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_psl1ght_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = _ecore_evas_psl1ght_match();
+
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   /* pass on event */
+   evas_focus_out(ee->evas);
+   ee->prop.focused = 0;
+   if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_psl1ght_event_video_expose(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
+{
+   Ecore_Evas *ee;
+   int w;
+   int h;
+
+   ee = _ecore_evas_psl1ght_match();
+
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   evas_output_size_get(ee->evas, &w, &h);
+   evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_psl1ght_event_key_modifiers(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Evas *ee;
+   Ecore_Psl1ght_Event_Key_Modifiers *e = event;
+
+   ee = _ecore_evas_psl1ght_match();
+
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_psl1ght_event_quit (void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = _ecore_evas_psl1ght_match();
+
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (ee->func.fn_delete_request)
+     ee->func.fn_delete_request(ee);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static int
+_ecore_evas_render(Ecore_Evas *ee)
+{
+   Eina_List *updates;
+
+   updates = evas_render_updates(ee->evas);
+   if (updates)
+     {
+        evas_render_updates_free(updates);
+        _ecore_evas_idle_timeout_update(ee);
+     }
+   return updates ? 1 : 0;
+}
+
+static int
+_ecore_evas_psl1ght_render(Ecore_Evas *ee)
+{
+   int rend = 0;
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
+   Eina_List *ll;
+   Ecore_Evas *ee2;
+
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+     {
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        rend |= _ecore_evas_buffer_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+     }
+#endif
+
+   if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
+
+   if (ee->prop.avoid_damage) rend = _ecore_evas_render(ee);
+   else if ((ee->visible) ||
+            ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
+            ((ee->should_be_visible) && (ee->prop.override)))
+     rend |= _ecore_evas_render(ee);
+   else
+     evas_norender(ee->evas);
+
+   if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+   return rend;
+}
+
+static Eina_Bool
+_ecore_evas_psl1ght_event(void *data __UNUSED__)
+{
+   ecore_psl1ght_poll_events();
+   return ECORE_CALLBACK_RENEW;
+}
+
+static int
+_ecore_evas_psl1ght_init(int w __UNUSED__, int h __UNUSED__)
+{
+   _ecore_evas_init_count++;
+   if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
+
+   _ecore_evas_fps_debug = 1;
+
+   // this is pretty bad: poller? and set poll time? pol time is meant to be
+   // adjustable for things like polling battery state, or amoutn of spare
+   // memory etc.
+   //
+   ecore_evas_event = ecore_poller_add(ECORE_POLLER_CORE, 1, _ecore_evas_psl1ght_event, NULL);
+   ecore_poller_poll_interval_set(ECORE_POLLER_CORE, 0.006);
+
+   if (_ecore_evas_fps_debug)
+     _ecore_evas_fps_debug_init();
+
+   ecore_event_evas_init();
+
+   ecore_evas_event_handlers[0] =
+       ecore_event_handler_add(ECORE_PSL1GHT_EVENT_GOT_FOCUS,
+           _ecore_evas_psl1ght_event_got_focus, NULL);
+   ecore_evas_event_handlers[1] =
+       ecore_event_handler_add(ECORE_PSL1GHT_EVENT_LOST_FOCUS,
+           _ecore_evas_psl1ght_event_lost_focus, NULL);
+   ecore_evas_event_handlers[2] =
+       ecore_event_handler_add(ECORE_PSL1GHT_EVENT_EXPOSE,
+           _ecore_evas_psl1ght_event_video_expose, NULL);
+   ecore_evas_event_handlers[3] =
+       ecore_event_handler_add(ECORE_PSL1GHT_EVENT_KEY_MODIFIERS,
+           _ecore_evas_psl1ght_event_key_modifiers, NULL);
+   ecore_evas_event_handlers[4] =
+       ecore_event_handler_add(ECORE_PSL1GHT_EVENT_QUIT,
+           _ecore_evas_psl1ght_event_quit, NULL);
+
+   return _ecore_evas_init_count;
+}
+
+static int
+_ecore_evas_psl1ght_shutdown(void)
+{
+   _ecore_evas_init_count--;
+   if (_ecore_evas_init_count == 0)
+     {
+        unsigned int i;
+
+        for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler *); i++)
+          ecore_event_handler_del(ecore_evas_event_handlers[i]);
+        ecore_event_evas_shutdown();
+        ecore_poller_del(ecore_evas_event);
+        ecore_evas_event = NULL;
+        if (_ecore_evas_fps_debug)
+          _ecore_evas_fps_debug_shutdown();
+     }
+   if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
+   return _ecore_evas_init_count;
+}
+
+static void
+_ecore_evas_psl1ght_free(Ecore_Evas *ee)
+{
+   if (psl1ght_ee == ee) psl1ght_ee = NULL;
+
+   ecore_event_window_unregister(0);
+   _ecore_evas_psl1ght_shutdown();
+   ecore_psl1ght_shutdown();
+}
+
+static void
+_ecore_evas_psl1ght_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
+{
+   ee->func.fn_delete_request = func;
+}
+
+static void
+_ecore_evas_screen_resized(Ecore_Evas *ee)
+{
+   int w, h;
+
+   /* Do not resize if the window is not fullscreen */
+   if (ee->prop.fullscreen == 0) return;
+
+   ecore_psl1ght_screen_resolution_get (&w, &h);
+
+   if (w != ee->w || h != ee->h)
+     {
+        ee->req.w = ee->w = w;
+        ee->req.h = ee->h = h;
+        evas_output_size_set(ee->evas, ee->w, ee->h);
+        evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+        ecore_psl1ght_resolution_set (w, h);
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+
+        _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                       _ecore_evas_time_get());
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+     }
+}
+
+static void
+_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
+{
+   if ((w == ee->w) && (h == ee->h)) return;
+   ee->w = w;
+   ee->h = h;
+
+   evas_output_size_set(ee->evas, ee->w, ee->h);
+
+   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+
+   ecore_psl1ght_resolution_set (w, h);
+
+   if (ee->func.fn_resize) ee->func.fn_resize(ee);
+
+   _ecore_evas_screen_resized (ee);
+}
+
+static void
+_ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
+{
+   _ecore_evas_resize (ee, w, h);
+}
+
+static void
+_ecore_evas_show(Ecore_Evas *ee)
+{
+   if (ee->prop.focused) return;
+   ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+}
+
+static void
+_ecore_evas_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
+{
+   if (x) *x = 0;
+   if (y) *y = 0;
+   ecore_psl1ght_screen_resolution_get (w, h);
+}
+
+static void
+_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = data;
+   if (ee)
+     ee->prop.cursor.object = NULL;
+}
+
+static void
+_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
+{
+   int x, y;
+
+   if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
+
+   if (!obj)
+     {
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        return;
+     }
+
+   ee->prop.cursor.object = obj;
+   ee->prop.cursor.layer = layer;
+   ee->prop.cursor.hot.x = hot_x;
+   ee->prop.cursor.hot.y = hot_y;
+   evas_pointer_output_xy_get(ee->evas, &x, &y);
+   evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
+   evas_object_move(ee->prop.cursor.object,
+                    x - ee->prop.cursor.hot.x,
+                    y - ee->prop.cursor.hot.y);
+   evas_object_pass_events_set(ee->prop.cursor.object, 1);
+   if (evas_pointer_inside_get(ee->evas))
+     evas_object_show(ee->prop.cursor.object);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
+{
+   _ecore_evas_psl1ght_free,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_psl1ght_callback_delete_request_set,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_resize,
+   _ecore_evas_move_resize,
+   NULL,
+   NULL,
+   _ecore_evas_show,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_object_cursor_set,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL, //transparent
+   NULL, // profiles_set
+
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+
+   NULL, // render
+   _ecore_evas_screen_geometry_get, // screen_geometry_get
+   NULL  // screen_dpi_get
+};
+
+EAPI Ecore_Evas *
+ecore_evas_psl1ght_new(const char *name, int w, int h)
+{
+   void *einfo;
+   Ecore_Evas *ee;
+
+   if (!name)
+     name = ecore_evas_psl1ght_default;
+
+   ee = calloc(1, sizeof(Ecore_Evas));
+   if (!ee) return NULL;
+
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_psl1ght_engine_func;
+
+   ee->driver = "psl1ght";
+   if (name) ee->name = strdup(name);
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   ee->visible = 1;
+   ee->w = w;
+   ee->h = h;
+
+   ee->prop.max.w = 0;
+   ee->prop.max.h = 0;
+   ee->prop.layer = 0;
+   ee->prop.focused = 1;
+   ee->prop.borderless = 1;
+   ee->prop.override = 1;
+   ee->prop.maximized = 1;
+   ee->prop.fullscreen = 0;
+   ee->prop.withdrawn = 0;
+   ee->prop.sticky = 0;
+   ee->prop.window = 0;
+
+   /* init evas here */
+   ee->evas = evas_new();
+   evas_data_attach_set(ee->evas, ee);
+   evas_output_method_set(ee->evas, evas_render_method_lookup("psl1ght"));
+
+   evas_output_size_set(ee->evas, w, h);
+   evas_output_viewport_set(ee->evas, 0, 0, w, h);
+
+   einfo = evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
+     }
+
+   if (!ecore_psl1ght_init(name))
+     {
+        evas_free(ee->evas);
+        if (ee->name) free(ee->name);
+        free(ee);
+        return NULL;
+     }
+   ecore_psl1ght_resolution_set (w, h);
+
+   _ecore_evas_psl1ght_init(w, h);
+
+   ecore_event_window_register(0, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+
+   ee->engine.func->fn_render = _ecore_evas_psl1ght_render;
+   _ecore_evas_register(ee);
+
+   psl1ght_ee = ee;
+
+   _ecore_evas_screen_resized (ee);
+
+   if (getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH"))
+     ecore_evas_cursor_set(ee, getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH"), EVAS_LAYER_MAX, 0, 0);
+
+   evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
+   
+   return ee;
+}
+
+#else /* BUILD_ECORE_EVAS_PSL1GHT */
+
+EAPI Ecore_Evas *
+ecore_evas_psl1ght_new(const char *name __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   ERR("OUTCH !");
+   return NULL;
+}
+
+#endif /* BUILD_ECORE_EVAS_PSL1GHT */
index 946f18e..da1ddbd 100644 (file)
-#include "config.h"
-#include "Ecore.h"
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Ecore.h>
+#include <Ecore_Input.h>
+#include <Ecore_Input_Evas.h>
+#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
+# include <Ecore_Sdl.h>
+# ifdef BUILD_ECORE_EVAS_OPENGL_SDL
+#  include <Evas_Engine_GL_SDL.h>
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
+#include <SDL/SDL.h>
+#endif
+
 #include "ecore_evas_private.h"
 #include "Ecore_Evas.h"
-#ifdef BUILD_ECORE_EVAS_SDL
-#include "Ecore_Sdl.h"
-#include "Evas_Engine_SDL.h"
-#endif
 
-#ifdef BUILD_ECORE_EVAS_SDL
+/*
+ * SDL only handle one window at a time. That's by definition, there is nothing wrong here.
+ *
+ */
+#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
 
 /* static char *ecore_evas_default_display = "0"; */
 /* static Ecore_List *ecore_evas_input_devices = NULL; */
 
 static int                      _ecore_evas_init_count = 0;
-#ifndef _WIN32
-static int                      _ecore_evas_fps_debug = 0;
-#endif /* _WIN32 */
-static Ecore_Evas               *ecore_evases = NULL;
-static Ecore_Event_Handler      *ecore_evas_event_handlers[10] = {
-   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+
+static Ecore_Evas               *sdl_ee = NULL;
+static Ecore_Event_Handler      *ecore_evas_event_handlers[4] = {
+   NULL, NULL, NULL, NULL
 };
-static Ecore_Idle_Enterer       *ecore_evas_idle_enterer = NULL;
-static Ecore_Idler              *ecore_evas_event = NULL;
 
 static const char               *ecore_evas_sdl_default = "EFL SDL";
-
-static void
-_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
-{
-   ee->mouse.x = x;
-   ee->mouse.y = y;
-   if (ee->prop.cursor.object)
-     {
-       evas_object_show(ee->prop.cursor.object);
-        evas_object_move(ee->prop.cursor.object,
-                         x - ee->prop.cursor.hot.x,
-                         y - ee->prop.cursor.hot.y);
-     }
-   evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
-}
+static int                      _ecore_evas_fps_debug = 0;
+static Ecore_Poller             *ecore_evas_event;
 
 static Ecore_Evas *
 _ecore_evas_sdl_match(void)
 {
-   return ecore_evases;
-}
-
-static int
-_ecore_evas_sdl_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Sdl_Event_Key_Down     *e;
-   Ecore_Evas                   *ee;
-
-   e = event;
-   ee = _ecore_evas_sdl_match();
-
-   if (!ee) return 1;
-   /* pass on event */
-   evas_event_feed_key_down(ee->evas, e->keyname, NULL, e->keycompose, NULL, e->time, NULL);
-
-   return 0; /* dont pass it on */
-}
-
-static int
-_ecore_evas_sdl_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Sdl_Event_Key_Up       *e;
-   Ecore_Evas                   *ee;
-
-   e = event;
-   ee = _ecore_evas_sdl_match();
-
-   if (!ee) return 1;
-   /* pass on event */
-   evas_event_feed_key_up(ee->evas, e->keyname, NULL, e->keycompose, NULL, e->time, NULL);
-
-   return 0;
-}
-
-static int
-_ecore_evas_sdl_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Sdl_Event_Mouse_Move *e;
-   Ecore_Evas *ee;
-
-   e = event;
-   ee = _ecore_evas_sdl_match();
-
-   if (!ee) return 1; /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
-
-   return 0;
-}
-
-static int
-_ecore_evas_sdl_event_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Sdl_Event_Mouse_Button_Down    *e;
-   Ecore_Evas                           *ee;
-   Evas_Button_Flags                    flags;
-
-   e = event;
-   ee = _ecore_evas_sdl_match();
-   flags = EVAS_BUTTON_NONE;
-
-   if (!ee) return 1;
-   /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_down(ee->evas, e->button, flags, e->time, NULL);
-
-   return 0;
-}
-
-static int
-_ecore_evas_sdl_event_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Sdl_Event_Mouse_Button_Up      *e;
-   Ecore_Evas                           *ee;
-   Evas_Button_Flags                    flags;
-
-   e = event;
-   ee = _ecore_evas_sdl_match();
-   flags = EVAS_BUTTON_NONE;
-
-   if (!ee) return 1;
-   /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
-
-   return 0;
+   return sdl_ee;
 }
 
-static int
-_ecore_evas_sdl_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
+static void *
+_ecore_evas_sdl_switch_buffer(void *data, void *dest __UNUSED__)
 {
-   Ecore_Sdl_Event_Mouse_Wheel  *e;
-   Ecore_Evas                   *ee;
-
-   e = event;
-   ee = _ecore_evas_sdl_match();
-
-   if (!ee) return 1; /* pass on event */
-   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
-   evas_event_feed_mouse_wheel(ee->evas, e->direction, e->wheel, e->time, NULL);
-
-   return 0;
+   SDL_Flip(data);
+   return ((SDL_Surface*)data)->pixels;
 }
 
-static int
-_ecore_evas_sdl_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_sdl_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
 {
    Ecore_Evas                   *ee;
 
    ee = _ecore_evas_sdl_match();
 
-   if (!ee) return 1;
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
    /* pass on event */
    ee->prop.focused = 1;
-
-   return 0;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
-_ecore_evas_sdl_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_sdl_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
 {
    Ecore_Evas                   *ee;
 
    ee = _ecore_evas_sdl_match();
 
-   if (!ee) return 1;
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
    /* pass on event */
    ee->prop.focused = 0;
-
-   return 0;
+   evas_focus_out(ee->evas);
+   if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_sdl_event_video_resize(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Sdl_Event_Video_Resize *e;
    Ecore_Evas                   *ee;
+   int                           rmethod;
 
    e = event;
    ee = _ecore_evas_sdl_match();
 
-   if (!ee) return 1; /* pass on event */
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+
+   rmethod = evas_output_method_get(ee->evas);
+   if (rmethod == evas_render_method_lookup("buffer"))
+     {
+        Evas_Engine_Info_Buffer *einfo;
+
+        einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+             einfo->info.switch_data = SDL_SetVideoMode(e->w, e->h, 32,
+                                                        (ee->prop.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE)
+                                                        | (ee->prop.fullscreen ? SDL_FULLSCREEN : 0)
+                                                        | (ee->alpha ? SDL_SRCALPHA : 0)
+                                                        | SDL_DOUBLEBUF);
+             if (!einfo->info.switch_data)
+               {
+                  return EINA_FALSE;
+               }
+
+             SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0);
+             SDL_FillRect(einfo->info.switch_data, NULL, 0);
+
+             einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels;
+             einfo->info.dest_buffer_row_bytes = e->w * sizeof (int);
+             einfo->info.use_color_key = 0;
+             einfo->info.alpha_threshold = 0;
+             einfo->info.func.new_update_region = NULL;
+             einfo->info.func.free_update_region = NULL;
+             einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo))
+               {
+                  return EINA_FALSE;
+               }
+          }
+     }
+
+   ee->w = e->w;
+   ee->h = e->h;
+
    evas_output_size_set(ee->evas, e->w, e->h);
+   evas_output_viewport_set(ee->evas, 0, 0, e->w, e->h);
 
-   return 0;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_sdl_event_video_expose(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
 {
    Ecore_Evas                   *ee;
@@ -204,68 +151,65 @@ _ecore_evas_sdl_event_video_expose(void *data __UNUSED__, int type __UNUSED__, v
 
    ee = _ecore_evas_sdl_match();
 
-   if (!ee) return 1;
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
    evas_output_size_get(ee->evas, &w, &h);
    evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
 
-   return 0;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
 static int
-_ecore_evas_idle_enter(void *data __UNUSED__)
+_ecore_evas_render(Ecore_Evas *ee)
 {
-   Ecore_List2  *l;
-   double       t1 = 0.;
-   double       t2 = 0.;
+   Eina_List *updates;
 
-#ifndef _WIN32
-   if (_ecore_evas_fps_debug)
+   updates = evas_render_updates(ee->evas);
+   if (updates)
      {
-       t1 = ecore_time_get();
+        evas_render_updates_free(updates);
+        _ecore_evas_idle_timeout_update(ee);
      }
-#endif /* _WIN32 */
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-
-       ee = (Ecore_Evas *)l;
-       if (ee->visible)
-         {
-            Evas_List *updates;
-            
-            if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
-
-            updates = evas_render_updates(ee->evas);
-            if (updates)
-              {
-                 evas_render_updates_free(updates);
-                 _ecore_evas_idle_timeout_update(ee);
-              }
-             if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
-         }
-       else
-         evas_norender(ee->evas);
-     }
-#ifndef _WIN32
-   if (_ecore_evas_fps_debug)
+   return updates ? 1 : 0;
+}
+
+static int
+_ecore_evas_sdl_render(Ecore_Evas *ee)
+{
+   int rend = 0;
+   Eina_List *ll;
+   Ecore_Evas *ee2;
+
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
      {
-       t2 = ecore_time_get();
-       _ecore_evas_fps_debug_rendertime_add(t2 - t1);
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
      }
-#endif /* _WIN32 */
-   return 1;
+
+   if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
+
+   if (ee->prop.avoid_damage) rend = _ecore_evas_render(ee);
+   else if ((ee->visible) ||
+            ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
+            ((ee->should_be_visible) && (ee->prop.override)))
+     rend |= _ecore_evas_render(ee);
+   else
+     evas_norender(ee->evas);
+
+   if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+   return rend;
 }
 
-static int
-_ecore_evas_sdl_event(void *data)
+static Eina_Bool
+_ecore_evas_sdl_event(void *data __UNUSED__)
 {
    ecore_sdl_feed_events();
-
-   return 1;
+   return ECORE_CALLBACK_RENEW;
 }
 
 static int
-_ecore_evas_sdl_init(int w, int h)
+_ecore_evas_sdl_init(int w __UNUSED__, int h __UNUSED__)
 {
    _ecore_evas_init_count++;
    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
@@ -273,22 +217,22 @@ _ecore_evas_sdl_init(int w, int h)
 #ifndef _WIN32
    if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
 #endif /* _WIN32 */
-   ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL);
-   ecore_evas_event = ecore_timer_add(0.008, _ecore_evas_sdl_event, NULL);
+   // this is pretty bad: poller? and set poll time? pol time is meant to be
+   // adjustable for things like polling battery state, or amoutn of spare
+   // memory etc.
+   //
+   ecore_evas_event = ecore_poller_add(ECORE_POLLER_CORE, 1, _ecore_evas_sdl_event, NULL);
+   ecore_poller_poll_interval_set(ECORE_POLLER_CORE, 0.006);
 #ifndef _WIN32
    if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
 #endif /* _WIN32 */
 
-   ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_SDL_EVENT_KEY_DOWN, _ecore_evas_sdl_event_key_down, NULL);
-   ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_SDL_EVENT_KEY_UP, _ecore_evas_sdl_event_key_up, NULL);
-   ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_sdl_event_button_down, NULL);
-   ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_SDL_EVENT_MOUSE_BUTTON_UP, _ecore_evas_sdl_event_button_up, NULL);
-   ecore_evas_event_handlers[4] = ecore_event_handler_add(ECORE_SDL_EVENT_MOUSE_MOVE, _ecore_evas_sdl_event_mouse_move, NULL);
-   ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_SDL_EVENT_MOUSE_WHEEL, _ecore_evas_sdl_event_mouse_wheel, NULL);
-   ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_SDL_EVENT_GOT_FOCUS, _ecore_evas_sdl_event_got_focus, NULL);
-   ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_SDL_EVENT_LOST_FOCUS, _ecore_evas_sdl_event_lost_focus, NULL);
-   ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_SDL_EVENT_RESIZE, _ecore_evas_sdl_event_video_resize, NULL);
-   ecore_evas_event_handlers[9] = ecore_event_handler_add(ECORE_SDL_EVENT_EXPOSE, _ecore_evas_sdl_event_video_expose, NULL);
+   ecore_event_evas_init();
+
+   ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_SDL_EVENT_GOT_FOCUS, _ecore_evas_sdl_event_got_focus, NULL);
+   ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_SDL_EVENT_LOST_FOCUS, _ecore_evas_sdl_event_lost_focus, NULL);
+   ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_SDL_EVENT_RESIZE, _ecore_evas_sdl_event_video_resize, NULL);
+   ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_SDL_EVENT_EXPOSE, _ecore_evas_sdl_event_video_expose, NULL);
 
    return _ecore_evas_init_count;
 }
@@ -299,17 +243,15 @@ _ecore_evas_sdl_shutdown(void)
    _ecore_evas_init_count--;
    if (_ecore_evas_init_count == 0)
      {
-       int i;
+        unsigned int i;
 
-       while (ecore_evases) _ecore_evas_free(ecore_evases);
         for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++)
-         ecore_event_handler_del(ecore_evas_event_handlers[i]);
-       ecore_idle_enterer_del(ecore_evas_idle_enterer);
-       ecore_evas_idle_enterer = NULL;
-        ecore_timer_del(ecore_evas_event);
+          ecore_event_handler_del(ecore_evas_event_handlers[i]);
+        ecore_event_evas_shutdown();
+        ecore_poller_del(ecore_evas_event);
         ecore_evas_event = NULL;
 #ifndef _WIN32
-       if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
+        if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
 #endif /* _WIN32 */
      }
    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
@@ -319,7 +261,9 @@ _ecore_evas_sdl_shutdown(void)
 static void
 _ecore_evas_sdl_free(Ecore_Evas *ee)
 {
-   ecore_evases = _ecore_list2_remove(ecore_evases, ee);
+   if (sdl_ee == ee) sdl_ee = NULL;
+
+   ecore_event_window_unregister(0);
    _ecore_evas_sdl_shutdown();
    ecore_sdl_shutdown();
 }
@@ -327,10 +271,48 @@ _ecore_evas_sdl_free(Ecore_Evas *ee)
 static void
 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
 {
+   int rmethod;
+
    if ((w == ee->w) && (h == ee->h)) return;
    ee->w = w;
    ee->h = h;
 
+   rmethod = evas_output_method_get(ee->evas);
+   if (rmethod == evas_render_method_lookup("buffer"))
+     {
+        Evas_Engine_Info_Buffer *einfo;
+
+        einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+             einfo->info.switch_data = SDL_SetVideoMode(w, h, 32,
+                                                        (ee->prop.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE)
+                                                        | (ee->prop.fullscreen ? SDL_FULLSCREEN : 0)
+                                                        | (ee->alpha ? SDL_SRCALPHA : 0)
+                                                        | SDL_DOUBLEBUF);
+             if (!einfo->info.switch_data)
+               {
+                  return ;
+               }
+
+             SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0);
+             SDL_FillRect(einfo->info.switch_data, NULL, 0);
+
+             einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels;
+             einfo->info.dest_buffer_row_bytes = w * sizeof (int);
+             einfo->info.use_color_key = 0;
+             einfo->info.alpha_threshold = 0;
+             einfo->info.func.new_update_region = NULL;
+             einfo->info.func.free_update_region = NULL;
+             einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo))
+               {
+                  return ;
+               }
+          }
+     }
+
    evas_output_size_set(ee->evas, ee->w, ee->h);
    evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
    evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
@@ -353,19 +335,36 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int
 }
 
 static void
+_ecore_evas_show(Ecore_Evas *ee)
+{
+   if (ee->prop.focused) return;
+   ee->prop.focused = 1;
+   evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
+}
+
+static void
+_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = data;
+   if (ee) ee->prop.cursor.object = NULL;
+}
+
+static void
 _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
 {
    int x, y;
 
    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
 
-   if (obj == NULL)
+   if (!obj)
      {
-       ee->prop.cursor.object = NULL;
-       ee->prop.cursor.layer = 0;
-       ee->prop.cursor.hot.x = 0;
-       ee->prop.cursor.hot.y = 0;
-       return;
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        return;
      }
 
    ee->prop.cursor.object = obj;
@@ -375,14 +374,16 @@ _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int h
    evas_pointer_output_xy_get(ee->evas, &x, &y);
    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
    evas_object_move(ee->prop.cursor.object,
-                   x - ee->prop.cursor.hot.x,
-                   y - ee->prop.cursor.hot.y);
+                    x - ee->prop.cursor.hot.x,
+                    y - ee->prop.cursor.hot.y);
    evas_object_pass_events_set(ee->prop.cursor.object, 1);
    if (evas_pointer_inside_get(ee->evas))
      evas_object_show(ee->prop.cursor.object);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
 }
 
-static const Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
+static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
 {
    _ecore_evas_sdl_free,
    NULL,
@@ -405,7 +406,7 @@ static const Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
    _ecore_evas_move_resize,
    NULL,
    NULL,
-   NULL,
+   _ecore_evas_show,
    NULL,
    NULL,
    NULL,
@@ -427,33 +428,36 @@ static const Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
    NULL,
    NULL,
    NULL,
-   NULL
+   NULL,
+   NULL,
+   NULL, //transparent
+   NULL, // profiles_set
+
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+
+   NULL, // render
+   NULL, // screen_geometry_get
+   NULL  // screen_dpi_get
 };
-#endif
 
-EAPI Ecore_Evas*
-ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha)
+static Ecore_Evas*
+_ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha)
 {
-#ifdef BUILD_ECORE_EVAS_SDL
-   Evas_Engine_Info_SDL *einfo;
    Ecore_Evas           *ee;
-   int                  rmethod;
 
    if (!name)
      name = ecore_evas_sdl_default;
 
-   rmethod = evas_render_method_lookup("software_sdl");
-   if (!rmethod) return NULL;
-
-   if (!ecore_sdl_init(name)) return NULL;
-
    ee = calloc(1, sizeof(Ecore_Evas));
    if (!ee) return NULL;
 
    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
 
-   _ecore_evas_sdl_init(w, h);
-
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_sdl_engine_func;
 
    ee->driver = "sdl";
@@ -475,6 +479,9 @@ ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface
    ee->prop.fullscreen = fullscreen;
    ee->prop.withdrawn = 0;
    ee->prop.sticky = 0;
+   ee->prop.window = 0;
+   ee->alpha = alpha;
+   ee->prop.hwsurface = hwsurface;
 
    /* init evas here */
    ee->evas = evas_new();
@@ -484,31 +491,167 @@ ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface
    evas_output_size_set(ee->evas, w, h);
    evas_output_viewport_set(ee->evas, 0, 0, w, h);
 
-   einfo = (Evas_Engine_Info_SDL*) evas_engine_info_get(ee->evas);
-   if (einfo)
+   if (rmethod == evas_render_method_lookup("buffer"))
      {
-        einfo->info.fullscreen = fullscreen;
-        einfo->info.hwsurface = hwsurface;
-        einfo->info.noframe = noframe;
-        einfo->info.alpha = alpha;
-        evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        Evas_Engine_Info_Buffer *einfo;
+
+        einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             SDL_Init(SDL_INIT_NOPARACHUTE);
+
+             if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
+               {
+                  ERR("SDL_Init failed with %s", SDL_GetError());
+                  SDL_Quit();
+                  return NULL;
+               }
+
+             einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
+             einfo->info.switch_data = SDL_SetVideoMode(w, h, 32,
+                                                        (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE)
+                                                        | (fullscreen ? SDL_FULLSCREEN : 0)
+                                                        | (noframe ? SDL_NOFRAME : 0)
+                                                        | (alpha ? SDL_SRCALPHA : 0)
+                                                        | SDL_DOUBLEBUF);
+             if (!einfo->info.switch_data)
+               {
+                  ERR("SDL_SetVideoMode failed !");
+                  ecore_evas_free(ee);
+                  return NULL;
+               }
+
+             SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0);
+             SDL_FillRect(einfo->info.switch_data, NULL, 0);
+
+             einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels;
+             einfo->info.dest_buffer_row_bytes = w * sizeof (int);
+             einfo->info.use_color_key = 0;
+             einfo->info.alpha_threshold = 0;
+             einfo->info.func.new_update_region = NULL;
+             einfo->info.func.free_update_region = NULL;
+             einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                  ecore_evas_free(ee);
+                  return NULL;
+               }
+          }
+        else
+          {
+             ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else if (rmethod == evas_render_method_lookup("gl_sdl"))
+     {
+#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
+        Evas_Engine_Info_GL_SDL *einfo;
+
+        einfo = (Evas_Engine_Info_GL_SDL *) evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             einfo->flags.fullscreen = fullscreen;
+             einfo->flags.noframe = noframe;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                  ecore_evas_free(ee);
+                  return NULL;
+               }
+          }
+        else
+          {
+             ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+#endif
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
      }
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
 
-   evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
+   if (!ecore_sdl_init(name))
+     {
+        evas_free(ee->evas);
+        if (ee->name) free(ee->name);
+        free(ee);
+        return NULL;
+     }
+
+   _ecore_evas_sdl_init(w, h);
+
+   ecore_event_window_register(0, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+
+   SDL_ShowCursor(SDL_ENABLE);
+
+   ee->engine.func->fn_render = _ecore_evas_sdl_render;
+   _ecore_evas_register(ee);
+
+   sdl_ee = ee;
+   return ee;
+}
+#endif
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
+EAPI Ecore_Evas*
+ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha)
+{
+   Ecore_Evas          *ee;
+   int                  rmethod;
+
+   rmethod = evas_render_method_lookup("buffer");
+   if (!rmethod) return NULL;
 
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
+   ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha);
    return ee;
+}
 #else
-   fprintf(stderr, "OUTCH !\n");
+EAPI Ecore_Evas*
+ecore_evas_sdl_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int hwsurface __UNUSED__, int noframe __UNUSED__, int alpha __UNUSED__)
+{
+   ERR("OUTCH !");
    return NULL;
+}
 #endif
+
+EAPI Ecore_Evas*
+ecore_evas_sdl16_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int hwsurface __UNUSED__, int noframe __UNUSED__, int alpha __UNUSED__)
+{
+   ERR("OUTCH !");
+   return NULL;
+}
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
+EAPI Ecore_Evas*
+ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe)
+{
+   Ecore_Evas          *ee;
+   int                  rmethod;
+
+   rmethod = evas_render_method_lookup("gl_sdl");
+   if (!rmethod) return NULL;
+
+   ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, 0, noframe, 0);
+   if (ee) ee->driver = "gl_sdl";
+   return ee;
+}
+#else
+EAPI Ecore_Evas*
+ecore_evas_gl_sdl_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int noframe __UNUSED__)
+{
+   ERR("OUTCH !");
+   return NULL;
 }
+#endif
+
diff --git a/src/lib/ecore_evas/ecore_evas_util.c b/src/lib/ecore_evas/ecore_evas_util.c
new file mode 100644 (file)
index 0000000..a860969
--- /dev/null
@@ -0,0 +1,451 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <Ecore.h>
+#include "ecore_private.h"
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+static const char ASSOCIATE_KEY[] = "__Ecore_Evas_Associate";
+
+static void _ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags);
+static void _ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj);
+
+
+static Evas_Object *
+_ecore_evas_associate_get(const Ecore_Evas *ee)
+{
+   return ecore_evas_data_get(ee, ASSOCIATE_KEY);
+}
+
+static void
+_ecore_evas_associate_set(Ecore_Evas *ee, Evas_Object *obj)
+{
+   ecore_evas_data_set(ee, ASSOCIATE_KEY, obj);
+}
+
+static void
+_ecore_evas_associate_del(Ecore_Evas *ee)
+{
+   ecore_evas_data_set(ee, ASSOCIATE_KEY, NULL);
+}
+
+static Ecore_Evas *
+_evas_object_associate_get(const Evas_Object *obj)
+{
+   return evas_object_data_get(obj, ASSOCIATE_KEY);
+}
+
+static void
+_evas_object_associate_set(Evas_Object *obj, Ecore_Evas *ee)
+{
+   evas_object_data_set(obj, ASSOCIATE_KEY, ee);
+}
+
+static void
+_evas_object_associate_del(Evas_Object *obj)
+{
+   evas_object_data_del(obj, ASSOCIATE_KEY);
+}
+
+/** Associated Events: ******************************************************/
+
+/* Interceptors Callbacks */
+
+static void
+_ecore_evas_obj_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y)
+{
+   Ecore_Evas *ee = data;
+   // FIXME: account for frame
+   ecore_evas_move(ee, x, y);
+   if (ecore_evas_override_get(ee)) evas_object_move(obj, x, y);
+}
+
+static void
+_ecore_evas_obj_intercept_raise(void *data, Evas_Object *obj __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   ecore_evas_raise(ee);
+}
+
+static void
+_ecore_evas_obj_intercept_lower(void *data, Evas_Object *obj __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   ecore_evas_lower(ee);
+}
+
+static void
+_ecore_evas_obj_intercept_stack_above(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *above __UNUSED__)
+{
+   INF("TODO: %s", __FUNCTION__);
+}
+
+static void
+_ecore_evas_obj_intercept_stack_below(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *below __UNUSED__)
+{
+   INF("TODO: %s", __FUNCTION__);
+}
+
+static void
+_ecore_evas_obj_intercept_layer_set(void *data, Evas_Object *obj __UNUSED__, int l)
+{
+   Ecore_Evas *ee = data;
+   ecore_evas_layer_set(ee, l);
+}
+
+/* Event Callbacks */
+
+static void
+_ecore_evas_obj_callback_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   ecore_evas_show(ee);
+}
+
+static void
+_ecore_evas_obj_callback_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   ecore_evas_hide(ee);
+}
+
+static void
+_ecore_evas_obj_callback_resize(void *data, Evas *e, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   Evas_Coord ow, oh, fw, fh;
+
+   evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
+   evas_output_framespace_get(e, NULL, NULL, &fw, &fh);
+   ow += fw;
+   oh += fh;
+   ecore_evas_resize(ee, ow, oh);
+}
+
+static void
+_ecore_evas_obj_callback_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   Evas_Coord w, h;
+
+   evas_object_size_hint_min_get(obj, &w, &h);
+   ecore_evas_size_min_set(ee, w, h);
+
+   evas_object_size_hint_max_get(obj, &w, &h);
+   if (w < 1) w = -1;
+   if (h < 1) h = -1;
+   ecore_evas_size_max_set(ee, w, h);
+}
+
+static void
+_ecore_evas_obj_callback_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   _ecore_evas_object_dissociate(ee, obj);
+   ecore_evas_free(ee);
+}
+
+static void
+_ecore_evas_obj_callback_del_dissociate(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   _ecore_evas_object_dissociate(ee, obj);
+}
+
+static void
+_ecore_evas_delete_request(Ecore_Evas *ee)
+{
+   Evas_Object *obj = _ecore_evas_associate_get(ee);
+   _ecore_evas_object_dissociate(ee, obj);
+   evas_object_del(obj);
+   ecore_evas_free(ee);
+}
+
+static void
+_ecore_evas_destroy(Ecore_Evas *ee)
+{
+   Evas_Object *obj = _ecore_evas_associate_get(ee);
+   if (!obj)
+     return;
+   _ecore_evas_object_dissociate(ee, obj);
+   evas_object_del(obj);
+}
+
+static void
+_ecore_evas_resize(Ecore_Evas *ee)
+{
+   Evas_Object *obj = _ecore_evas_associate_get(ee);
+   Evas_Coord w, h;
+   ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+   evas_object_resize(obj, w, h);
+}
+
+static void
+_ecore_evas_pre_free(Ecore_Evas *ee)
+{
+   Evas_Object *obj = _ecore_evas_associate_get(ee);
+   if (!obj)
+     return;
+   _ecore_evas_object_dissociate(ee, obj);
+   evas_object_del(obj);
+}
+
+static int
+_ecore_evas_object_evas_check(const char *function __UNUSED__, const Ecore_Evas *ee, const Evas_Object *obj)
+{
+   const char *name, *type;
+   Evas *e;
+
+   e = evas_object_evas_get(obj);
+   if (e == ee->evas)
+     return 1;
+
+   name = evas_object_name_get(obj);
+   type = evas_object_type_get(obj);
+
+   ERR("ERROR: %s(): object %p (name=\"%s\", type=\"%s\") evas "
+       "is not the same as this Ecore_Evas evas: %p != %p",
+       function, obj,
+       name ? name : "", type ? type : "", e, ee->evas);
+   fflush(stderr);
+   if (getenv("ECORE_ERROR_ABORT")) abort();
+
+   return 0;
+}
+
+EAPI Eina_Bool
+ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags)
+{
+   Ecore_Evas *old_ee;
+   Evas_Object *old_obj;
+
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+   {
+      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
+      return EINA_FALSE;
+   }
+
+   CHECK_PARAM_POINTER_RETURN("obj", obj, EINA_FALSE);
+   if (!_ecore_evas_object_evas_check(__FUNCTION__, ee, obj))
+     return EINA_FALSE;
+
+   old_ee = _evas_object_associate_get(obj);;
+   if (old_ee)
+     ecore_evas_object_dissociate(old_ee, obj);
+
+   old_obj = _ecore_evas_associate_get(ee);
+   if (old_obj)
+     ecore_evas_object_dissociate(ee, old_obj);
+
+   _ecore_evas_object_associate(ee, obj, flags);
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj)
+{
+   Ecore_Evas *old_ee;
+   Evas_Object *old_obj;
+
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+   {
+      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
+      return EINA_FALSE;
+   }
+
+   CHECK_PARAM_POINTER_RETURN("obj", obj, EINA_FALSE);
+   old_ee = _evas_object_associate_get(obj);
+   if (ee != old_ee) {
+      ERR("ERROR: trying to dissociate object that is not using "
+          "this Ecore_Evas: %p != %p", ee, old_ee);
+      return EINA_FALSE;
+   }
+
+   old_obj = _ecore_evas_associate_get(ee);
+   if (old_obj != obj) {
+      ERR("ERROR: trying to dissociate object that is not being "
+          "used by this Ecore_Evas: %p != %p", old_obj, obj);
+      return EINA_FALSE;
+   }
+
+   _ecore_evas_object_dissociate(ee, obj);
+
+   return EINA_TRUE;
+}
+
+EAPI Evas_Object *
+ecore_evas_object_associate_get(const Ecore_Evas *ee)
+{
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+   {
+      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
+      return NULL;
+   }
+   return _ecore_evas_associate_get(ee);
+}
+
+static void
+_ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags)
+{
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_SHOW,
+      _ecore_evas_obj_callback_show, ee);
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_HIDE,
+      _ecore_evas_obj_callback_hide, ee);
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_RESIZE,
+      _ecore_evas_obj_callback_resize, ee);
+   evas_object_event_callback_add
+     (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+      _ecore_evas_obj_callback_changed_size_hints, ee);
+   if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_DEL)
+     evas_object_event_callback_add
+       (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del, ee);
+   else
+     evas_object_event_callback_add
+       (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del_dissociate, ee);
+
+   evas_object_intercept_move_callback_add
+     (obj, _ecore_evas_obj_intercept_move, ee);
+
+   if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_STACK)
+     {
+        evas_object_intercept_raise_callback_add
+          (obj, _ecore_evas_obj_intercept_raise, ee);
+        evas_object_intercept_lower_callback_add
+          (obj, _ecore_evas_obj_intercept_lower, ee);
+        evas_object_intercept_stack_above_callback_add
+          (obj, _ecore_evas_obj_intercept_stack_above, ee);
+        evas_object_intercept_stack_below_callback_add
+          (obj, _ecore_evas_obj_intercept_stack_below, ee);
+     }
+
+   if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_LAYER)
+     evas_object_intercept_layer_set_callback_add
+       (obj, _ecore_evas_obj_intercept_layer_set, ee);
+
+   if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_DEL)
+     {
+        ecore_evas_callback_delete_request_set(ee, _ecore_evas_delete_request);
+        ecore_evas_callback_destroy_set(ee, _ecore_evas_destroy);
+     }
+   ecore_evas_callback_pre_free_set(ee, _ecore_evas_pre_free);
+   ecore_evas_callback_resize_set(ee, _ecore_evas_resize);
+
+   _evas_object_associate_set(obj, ee);
+   _ecore_evas_associate_set(ee, obj);
+}
+
+static void
+_ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj)
+{
+   evas_object_event_callback_del_full
+     (obj, EVAS_CALLBACK_SHOW,
+      _ecore_evas_obj_callback_show, ee);
+   evas_object_event_callback_del_full
+     (obj, EVAS_CALLBACK_HIDE,
+      _ecore_evas_obj_callback_hide, ee);
+   evas_object_event_callback_del_full
+     (obj, EVAS_CALLBACK_RESIZE,
+      _ecore_evas_obj_callback_resize, ee);
+   evas_object_event_callback_del_full
+     (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+      _ecore_evas_obj_callback_changed_size_hints, ee);
+   evas_object_event_callback_del_full
+     (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del, ee);
+   evas_object_event_callback_del_full
+     (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del_dissociate, ee);
+
+   evas_object_intercept_move_callback_del
+     (obj, _ecore_evas_obj_intercept_move);
+
+   evas_object_intercept_raise_callback_del
+     (obj, _ecore_evas_obj_intercept_raise);
+   evas_object_intercept_lower_callback_del
+     (obj, _ecore_evas_obj_intercept_lower);
+   evas_object_intercept_stack_above_callback_del
+     (obj, _ecore_evas_obj_intercept_stack_above);
+   evas_object_intercept_stack_below_callback_del
+     (obj, _ecore_evas_obj_intercept_stack_below);
+
+   evas_object_intercept_layer_set_callback_del
+     (obj, _ecore_evas_obj_intercept_layer_set);
+
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+   {
+      ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
+   }
+   else
+   {
+      if (ee->func.fn_delete_request == _ecore_evas_delete_request)
+        ecore_evas_callback_delete_request_set(ee, NULL);
+      if (ee->func.fn_destroy == _ecore_evas_destroy)
+        ecore_evas_callback_destroy_set(ee, NULL);
+      if (ee->func.fn_resize == _ecore_evas_resize)
+        ecore_evas_callback_resize_set(ee, NULL);
+      if (ee->func.fn_pre_free == _ecore_evas_pre_free)
+        ecore_evas_callback_pre_free_set(ee, NULL);
+
+      _ecore_evas_associate_del(ee);
+   }
+
+   _evas_object_associate_del(obj);
+}
+
+/**
+ * Helper ecore_getopt callback to list available Ecore_Evas engines.
+ *
+ * This will list all available engines except buffer, this is useful
+ * for applications to let user choose how they should create windows
+ * with ecore_evas_new().
+ *
+ * @c callback_data value is used as @c FILE* and says where to output
+ * messages, by default it is @c stdout. You can specify this value
+ * with ECORE_GETOPT_CALLBACK_FULL() or ECORE_GETOPT_CALLBACK_ARGS().
+ *
+ * If there is a boolean storage provided, then it is marked with 1
+ * when this option is executed.
+ * @param parser This parameter isn't in use.
+ * @param desc This parameter isn't in use.
+ * @param str This parameter isn't in use.
+ * @param data The data to be used.
+ * @param storage The storage to be used.
+ * @return The function always return 1.
+ */
+unsigned char
+ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc __UNUSED__, const char *str __UNUSED__, void *data, Ecore_Getopt_Value *storage)
+{
+   Eina_List  *lst, *n;
+   const char *engine;
+
+   if (!storage)
+     {
+        ERR("Storage is missing");
+        return 0;
+     }
+
+   FILE *fp = data;
+   if (!fp)
+     fp = stdout;
+
+   lst = ecore_evas_engines_get();
+
+   fputs("supported engines:\n", fp);
+   EINA_LIST_FOREACH(lst, n, engine)
+     if (strcmp(engine, "buffer") != 0)
+       fprintf(fp, "\t%s\n", engine);
+
+   ecore_evas_engines_free(lst);
+
+   if (storage->boolp)
+     *storage->boolp = 1;
+
+   return 1;
+}
diff --git a/src/lib/ecore_evas/ecore_evas_wayland_common.c b/src/lib/ecore_evas/ecore_evas_wayland_common.c
new file mode 100644 (file)
index 0000000..257fd6e
--- /dev/null
@@ -0,0 +1,657 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "ecore_evas_private.h"
+#include "Ecore_Evas.h"
+
+/* local structures */
+typedef struct _EE_Wl_Smart_Data EE_Wl_Smart_Data;
+struct _EE_Wl_Smart_Data
+{
+   Evas_Object *frame;
+   Evas_Object *text;
+   Evas_Coord x, y, w, h;
+};
+
+static Evas_Smart *_ecore_evas_wl_common_smart = NULL;
+
+/* local variables */
+
+static int _ecore_evas_wl_init_count = 0;
+static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
+
+static Eina_Bool
+_ecore_evas_wl_common_cb_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Evas *ee;
+   Ecore_Wl_Event_Mouse_In *ev;
+
+   ev = event;
+   ee = ecore_event_window_match(ev->window);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   if (!ee->in)
+     {
+        if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
+        ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
+        evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
+        ee->in = EINA_TRUE;
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_wl_common_cb_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Evas *ee;
+   Ecore_Wl_Event_Mouse_Out *ev;
+
+   ev = event;
+   ee = ecore_event_window_match(ev->window);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   if (ee->in)
+     {
+        ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
+        evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
+        if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
+        if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
+        ee->in = EINA_FALSE;
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_wl_common_cb_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Evas *ee;
+   Ecore_Wl_Event_Focus_In *ev;
+
+   ev = event;
+   ee = ecore_event_window_match(ev->win);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_wl_common_cb_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Evas *ee;
+   Ecore_Wl_Event_Focus_In *ev;
+
+   ev = event;
+   ee = ecore_event_window_match(ev->win);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   evas_focus_out(ee->evas);
+   ee->prop.focused = 0;
+   if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_evas_wl_common_cb_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Evas *ee;
+   Ecore_Wl_Event_Window_Configure *ev;
+   int nw = 0, nh = 0;
+
+   ev = event;
+   ee = ecore_event_window_match(ev->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON;
+   if (ev->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+
+   if (ee->prop.fullscreen)
+     {
+        _ecore_evas_wl_common_move(ee, ev->x, ev->y);
+        ee->engine.func->fn_resize(ee, ev->w, ev->h);
+
+        return ECORE_CALLBACK_PASS_ON;
+     }
+
+   if ((ee->x != ev->x) || (ee->y != ev->y))
+     {
+        ee->req.x = ee->x;
+        ee->req.y = ee->y;
+        if (ee->func.fn_move) ee->func.fn_move(ee);
+     }
+
+   nw = ev->w;
+   nh = ev->h;
+
+   if ((ee->prop.maximized) || (!ee->prop.fullscreen))
+     {
+        int fw = 0, fh = 0;
+
+        evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
+        nw = ev->w - fw;
+        nh = ev->h - fh;
+     }
+
+   if (ee->prop.min.w > nw) nw = ee->prop.min.w;
+   else if (nw > ee->prop.max.w) nw = ee->prop.max.w;
+   if (ee->prop.min.h > nh) nh = ee->prop.min.h;
+   else if (nh > ee->prop.max.h) nh = ee->prop.max.h;
+
+   if ((ee->w != nw) || (ee->h != nh))
+     {
+        ee->req.w = nw;
+        ee->req.h = nh;
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+int
+_ecore_evas_wl_common_init(void)
+{
+   if (++_ecore_evas_wl_init_count != 1)
+     return _ecore_evas_wl_init_count;
+
+   _ecore_evas_wl_event_hdls[0] =
+     ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN,
+                             _ecore_evas_wl_common_cb_mouse_in, NULL);
+   _ecore_evas_wl_event_hdls[1] =
+     ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT,
+                             _ecore_evas_wl_common_cb_mouse_out, NULL);
+   _ecore_evas_wl_event_hdls[2] =
+     ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN,
+                             _ecore_evas_wl_common_cb_focus_in, NULL);
+   _ecore_evas_wl_event_hdls[3] =
+     ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
+                             _ecore_evas_wl_common_cb_focus_out, NULL);
+   _ecore_evas_wl_event_hdls[4] =
+     ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE,
+                             _ecore_evas_wl_common_cb_window_configure, NULL);
+
+   ecore_event_evas_init();
+
+   return _ecore_evas_wl_init_count;
+}
+
+int
+_ecore_evas_wl_common_shutdown(void)
+{
+   unsigned int i = 0;
+
+   if (--_ecore_evas_wl_init_count != 0)
+     return _ecore_evas_wl_init_count;
+
+   for (i = 0; i < sizeof(_ecore_evas_wl_event_hdls) / sizeof(Ecore_Event_Handler *); i++)
+     {
+        if (_ecore_evas_wl_event_hdls[i])
+          ecore_event_handler_del(_ecore_evas_wl_event_hdls[i]);
+     }
+
+   ecore_event_evas_shutdown();
+
+   return _ecore_evas_wl_init_count;
+}
+
+void
+_ecore_evas_wl_common_pre_free(Ecore_Evas *ee)
+{
+   if (!ee) return;
+   if (ee->engine.wl.frame) evas_object_del(ee->engine.wl.frame);
+}
+
+void
+_ecore_evas_wl_common_free(Ecore_Evas *ee)
+{
+   if (ee->engine.wl.win) ecore_wl_window_free(ee->engine.wl.win);
+   ee->engine.wl.win = NULL;
+
+   ecore_event_window_unregister(ee->prop.window);
+   ecore_evas_input_event_unregister(ee);
+
+   _ecore_evas_wl_common_shutdown();
+   ecore_wl_shutdown();
+}
+
+void
+_ecore_evas_wl_common_resize(Ecore_Evas *ee, int w, int h)
+{
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   ee->req.w = w;
+   ee->req.h = h;
+
+   if (!ee->prop.fullscreen)
+     {
+        int fw = 0, fh = 0;
+
+        if (ee->prop.min.w > w) w = ee->prop.min.w;
+        else if (w > ee->prop.max.w) w = ee->prop.max.w;
+        if (ee->prop.min.h > h) h = ee->prop.min.h;
+        else if (h > ee->prop.max.h) h = ee->prop.max.h;
+
+        evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
+        w += fw;
+        h += fh;
+     }
+
+   if ((ee->w != w) || (ee->h != h))
+     {
+        ee->w = w;
+        ee->h = h;
+
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, h, w);
+             evas_output_viewport_set(ee->evas, 0, 0, h, w);
+          }
+        else
+          {
+             evas_output_size_set(ee->evas, w, h);
+             evas_output_viewport_set(ee->evas, 0, 0, w, h);
+          }
+
+        if (ee->prop.avoid_damage)
+          {
+             int pdam = 0;
+
+             pdam = ecore_evas_avoid_damage_get(ee);
+             ecore_evas_avoid_damage_set(ee, 0);
+             ecore_evas_avoid_damage_set(ee, pdam);
+          }
+
+        if (ee->engine.wl.frame)
+          evas_object_resize(ee->engine.wl.frame, w, h);
+     }
+}
+
+void
+_ecore_evas_wl_common_callback_resize_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
+{
+   if (!ee) return;
+   ee->func.fn_resize = func;
+}
+
+void
+_ecore_evas_wl_common_callback_move_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
+{
+   if (!ee) return;
+   ee->func.fn_move = func;
+}
+
+void
+_ecore_evas_wl_common_callback_delete_request_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
+{
+   if (!ee) return;
+   ee->func.fn_delete_request = func;
+}
+
+void
+_ecore_evas_wl_common_callback_focus_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
+{
+   if (!ee) return;
+   ee->func.fn_focus_in = func;
+}
+
+void
+_ecore_evas_wl_common_callback_focus_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
+{
+   if (!ee) return;
+   ee->func.fn_focus_out = func;
+}
+
+void
+_ecore_evas_wl_common_callback_mouse_in_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
+{
+   if (!ee) return;
+   ee->func.fn_mouse_in = func;
+}
+
+void
+_ecore_evas_wl_common_callback_mouse_out_set(Ecore_Evas *ee, void (*func)(Ecore_Evas *ee))
+{
+   if (!ee) return;
+   ee->func.fn_mouse_out = func;
+}
+
+void
+_ecore_evas_wl_common_move(Ecore_Evas *ee, int x, int y)
+{
+   if (!ee) return;
+
+   ee->req.x = x;
+   ee->req.y = y;
+
+   if ((ee->x != x) || (ee->y != y))
+     {
+        ee->x = x;
+        ee->y = y;
+        if (ee->engine.wl.win)
+          ecore_wl_window_update_location(ee->engine.wl.win, x, y);
+        if (ee->func.fn_move) ee->func.fn_move(ee);
+     }
+}
+
+static void
+_ecore_evas_wl_common_smart_add(Evas_Object *obj)
+{
+   EE_Wl_Smart_Data *sd;
+   Evas *evas;
+
+   if (!(sd = calloc(1, sizeof(EE_Wl_Smart_Data)))) return;
+
+   evas = evas_object_evas_get(obj);
+
+   sd->x = 0;
+   sd->y = 0;
+   sd->w = 1;
+   sd->h = 1;
+
+   sd->frame = evas_object_rectangle_add(evas);
+   evas_object_is_frame_object_set(sd->frame, EINA_TRUE);
+   evas_object_color_set(sd->frame, 249, 249, 249, 255);
+   evas_object_smart_member_add(sd->frame, obj);
+
+   sd->text = evas_object_text_add(evas);
+   evas_object_color_set(sd->text, 0, 0, 0, 255);
+   evas_object_text_style_set(sd->text, EVAS_TEXT_STYLE_PLAIN);
+   evas_object_text_font_set(sd->text, "Sans", 10);
+   evas_object_text_text_set(sd->text, "Smart Test");
+
+   evas_object_smart_data_set(obj, sd);
+}
+
+static void
+_ecore_evas_wl_common_smart_del(Evas_Object *obj)
+{
+   EE_Wl_Smart_Data *sd;
+
+   if (!(sd = evas_object_smart_data_get(obj))) return;
+   evas_object_del(sd->text);
+   evas_object_del(sd->frame);
+   free(sd);
+}
+
+static void
+_ecore_evas_wl_common_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
+{
+   EE_Wl_Smart_Data *sd;
+
+   if (!(sd = evas_object_smart_data_get(obj))) return;
+   if ((sd->w == w) && (sd->h == h)) return;
+   sd->w = w;
+   sd->h = h;
+   evas_object_resize(sd->frame, w, h);
+}
+
+static void
+_ecore_evas_wl_common_smart_show(Evas_Object *obj)
+{
+   EE_Wl_Smart_Data *sd;
+
+   if (!(sd = evas_object_smart_data_get(obj))) return;
+   evas_object_show(sd->frame);
+   evas_object_show(sd->text);
+}
+
+static void
+_ecore_evas_wl_common_smart_hide(Evas_Object *obj)
+{
+   EE_Wl_Smart_Data *sd;
+
+   if (!(sd = evas_object_smart_data_get(obj))) return;
+   evas_object_hide(sd->text);
+   evas_object_hide(sd->frame);
+}
+
+static void
+_ecore_evas_wl_common_smart_init(void)
+{
+   if (_ecore_evas_wl_common_smart) return;
+     {
+        static const Evas_Smart_Class sc =
+          {
+             "ecore_evas_wl_frame", EVAS_SMART_CLASS_VERSION,
+             _ecore_evas_wl_common_smart_add,
+             _ecore_evas_wl_common_smart_del,
+             NULL,
+             _ecore_evas_wl_common_smart_resize,
+             _ecore_evas_wl_common_smart_show,
+             _ecore_evas_wl_common_smart_hide,
+             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+          };
+        _ecore_evas_wl_common_smart = evas_smart_class_new(&sc);
+     }
+}
+
+Evas_Object *
+_ecore_evas_wl_common_frame_add(Evas *evas)
+{
+   _ecore_evas_wl_common_smart_init();
+   return evas_object_smart_add(evas, _ecore_evas_wl_common_smart);
+}
+
+void
+_ecore_evas_wl_common_raise(Ecore_Evas *ee)
+{
+   if ((!ee) || (!ee->visible)) return;
+   ecore_wl_window_raise(ee->engine.wl.win);
+}
+
+void
+_ecore_evas_wl_common_title_set(Ecore_Evas *ee, const char *title)
+{
+   if (!ee) return;
+   if (ee->prop.title) free(ee->prop.title);
+   ee->prop.title = NULL;
+   if (title) ee->prop.title = strdup(title);
+   if ((ee->prop.draw_frame) && (ee->engine.wl.frame))
+     {
+        EE_Wl_Smart_Data *sd;
+
+        if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return;
+        evas_object_text_text_set(sd->text, ee->prop.title);
+     }
+
+   if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
+     wl_shell_surface_set_title(ee->engine.wl.win->shell_surface,
+                                ee->prop.title);
+}
+
+void
+_ecore_evas_wl_common_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
+{
+   if (!ee) return;
+   if (ee->prop.name) free(ee->prop.name);
+   if (ee->prop.clas) free(ee->prop.clas);
+   ee->prop.name = NULL;
+   ee->prop.clas = NULL;
+   if (n) ee->prop.name = strdup(n);
+   if (c) ee->prop.clas = strdup(c);
+
+   if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
+     wl_shell_surface_set_class(ee->engine.wl.win->shell_surface,
+                                ee->prop.clas);
+}
+
+void
+_ecore_evas_wl_common_size_min_set(Ecore_Evas *ee, int w, int h)
+{
+   if (!ee) return;
+   if (w < 0) w = 0;
+   if (h < 0) h = 0;
+   if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
+   ee->prop.min.w = w;
+   ee->prop.min.h = h;
+}
+
+void
+_ecore_evas_wl_common_size_max_set(Ecore_Evas *ee, int w, int h)
+{
+   if (!ee) return;
+   if (w < 0) w = 0;
+   if (h < 0) h = 0;
+   if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
+   ee->prop.max.w = w;
+   ee->prop.max.h = h;
+}
+
+void
+_ecore_evas_wl_common_size_base_set(Ecore_Evas *ee, int w, int h)
+{
+   if (!ee) return;
+   if (w < 0) w = 0;
+   if (h < 0) h = 0;
+   if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
+   ee->prop.base.w = w;
+   ee->prop.base.h = h;
+}
+
+void
+_ecore_evas_wl_common_size_step_set(Ecore_Evas *ee, int w, int h)
+{
+   if (!ee) return;
+   if (w < 0) w = 0;
+   if (h < 0) h = 0;
+   if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
+   ee->prop.step.w = w;
+   ee->prop.step.h = h;
+}
+
+void
+_ecore_evas_wl_common_layer_set(Ecore_Evas *ee, int layer)
+{
+   if (!ee) return;
+   if (ee->prop.layer == layer) return;
+   if (layer < 1) layer = 1;
+   else if (layer > 255) layer = 255;
+   ee->prop.layer = layer;
+}
+
+void
+_ecore_evas_wl_common_iconified_set(Ecore_Evas *ee, int iconify)
+{
+   if (!ee) return;
+   if (ee->prop.iconified == iconify) return;
+   ee->prop.iconified = iconify;
+   /* FIXME: Implement this in Wayland someshow */
+}
+
+void
+_ecore_evas_wl_common_maximized_set(Ecore_Evas *ee, int max)
+{
+   if (!ee) return;
+   if (ee->prop.maximized == max) return;
+   ee->prop.maximized = max;
+   ecore_wl_window_maximized_set(ee->engine.wl.win, max);
+}
+
+void
+_ecore_evas_wl_common_fullscreen_set(Ecore_Evas *ee, int full)
+{
+   if (!ee) return;
+   if (ee->prop.fullscreen == full) return;
+   ee->prop.fullscreen = full;
+   ecore_wl_window_fullscreen_set(ee->engine.wl.win, full);
+}
+
+void
+_ecore_evas_wl_common_ignore_events_set(Ecore_Evas *ee, int ignore)
+{
+   if (!ee) return;
+   ee->ignore_events = ignore;
+   /* NB: Hmmm, may need to pass this to ecore_wl_window in the future */
+}
+
+int
+_ecore_evas_wl_common_pre_render(Ecore_Evas *ee)
+{
+   int rend = 0;
+   Eina_List *ll = NULL;
+   Ecore_Evas *ee2 = NULL;
+
+   if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
+
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+     {
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+     }
+
+   return rend;
+}
+
+int
+_ecore_evas_wl_common_render_updates(Ecore_Evas *ee)
+{
+   int rend = 0;
+   Eina_List *updates = NULL;
+
+   if ((updates = evas_render_updates(ee->evas)))
+     {
+        Eina_List *l = NULL;
+        Eina_Rectangle *r;
+
+        EINA_LIST_FOREACH(updates, l, r)
+          ecore_wl_window_damage(ee->engine.wl.win,
+                                 r->x, r->y, r->w, r->h);
+
+        ecore_wl_flush();
+
+        evas_render_updates_free(updates);
+        rend = 1;
+     }
+
+   return rend;
+}
+
+void
+_ecore_evas_wl_common_post_render(Ecore_Evas *ee)
+{
+   _ecore_evas_idle_timeout_update(ee);
+   if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
+}
+
+int
+_ecore_evas_wl_common_render(Ecore_Evas *ee)
+{
+   int rend = 0;
+
+   if (!ee) return 0;
+   if (!ee->visible)
+     {
+        evas_norender(ee->evas);
+        return 0;
+     }
+
+   rend = _ecore_evas_wl_common_pre_render(ee);
+   rend |= _ecore_evas_wl_common_render_updates(ee);
+   _ecore_evas_wl_common_post_render(ee);
+
+   return rend;
+}
+
+void
+_ecore_evas_wl_common_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
+{
+   if (x) *x = 0;
+   if (y) *y = 0;
+   ecore_wl_screen_size_get(w, h);
+}
+
+void
+_ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee __UNUSED__, int *xdpi, int *ydpi)
+{
+   int dpi = 0;
+
+   if (xdpi) *xdpi = 0;
+   if (ydpi) *ydpi = 0;
+   /* FIXME: Ideally this needs to get the DPI from a specific screen */
+   dpi = ecore_wl_dpi_get();
+   if (xdpi) *xdpi = dpi;
+   if (ydpi) *ydpi = dpi;
+}
diff --git a/src/lib/ecore_evas/ecore_evas_wayland_egl.c b/src/lib/ecore_evas/ecore_evas_wayland_egl.c
new file mode 100644 (file)
index 0000000..545c295
--- /dev/null
@@ -0,0 +1,434 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+//#define LOGFNS 1
+
+#ifdef LOGFNS
+# include <stdio.h>
+# define LOGFN(fl, ln, fn) \
+   printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
+#else
+# define LOGFN(fl, ln, fn)
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+# include <stdlib.h>
+# include <string.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+#endif
+
+#include <Eina.h>
+
+#include "Ecore_Evas.h"
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
+# include "ecore_evas_private.h"
+# include <Evas_Engine_Wayland_Egl.h>
+# include <Ecore_Wayland.h>
+
+/* local function prototypes */
+static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
+static void _ecore_evas_wl_show(Ecore_Evas *ee);
+static void _ecore_evas_wl_hide(Ecore_Evas *ee);
+static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
+static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
+
+static Ecore_Evas_Engine_Func _ecore_wl_engine_func = 
+{
+   _ecore_evas_wl_common_free,
+   _ecore_evas_wl_common_callback_resize_set,
+   _ecore_evas_wl_common_callback_move_set,
+   NULL, 
+   NULL,
+   _ecore_evas_wl_common_callback_delete_request_set,
+   NULL,
+   _ecore_evas_wl_common_callback_focus_in_set,
+   _ecore_evas_wl_common_callback_focus_out_set,
+   _ecore_evas_wl_common_callback_mouse_in_set,
+   _ecore_evas_wl_common_callback_mouse_out_set,
+   NULL, // sticky_set
+   NULL, // unsticky_set
+   NULL, // pre_render_set
+   NULL, // post_render_set
+   _ecore_evas_wl_common_move,
+   NULL, // managed_move
+   _ecore_evas_wl_resize,
+   NULL, // move_resize
+   NULL, // rotation_set
+   NULL, // shaped_set
+   _ecore_evas_wl_show,
+   _ecore_evas_wl_hide,
+   _ecore_evas_wl_common_raise,
+   NULL, // lower
+   NULL, // activate
+   _ecore_evas_wl_common_title_set,
+   _ecore_evas_wl_common_name_class_set,
+   _ecore_evas_wl_common_size_min_set,
+   _ecore_evas_wl_common_size_max_set,
+   _ecore_evas_wl_common_size_base_set,
+   _ecore_evas_wl_common_size_step_set,
+   NULL, // object_cursor_set
+   _ecore_evas_wl_common_layer_set,
+   NULL, // focus set
+   _ecore_evas_wl_common_iconified_set,
+   NULL, // borderless set
+   NULL, // override set
+   _ecore_evas_wl_common_maximized_set,
+   _ecore_evas_wl_common_fullscreen_set,
+   NULL, // func avoid_damage set
+   NULL, // func withdrawn set
+   NULL, // func sticky set
+   _ecore_evas_wl_common_ignore_events_set,
+   _ecore_evas_wl_alpha_set,
+   _ecore_evas_wl_transparent_set,
+   NULL, // func profiles set
+   NULL, // window group set
+   NULL, // aspect set
+   NULL, // urgent set
+   NULL, // modal set
+   NULL, // demand attention set
+   NULL, // focus skip set
+   _ecore_evas_wl_common_render,
+   _ecore_evas_wl_common_screen_geometry_get,
+   _ecore_evas_wl_common_screen_dpi_get
+};
+
+/* external variables */
+
+/* external functions */
+EAPI Ecore_Evas *
+ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
+{
+   Ecore_Wl_Window *p = NULL;
+   Evas_Engine_Info_Wayland_Egl *einfo;
+   Ecore_Evas *ee;
+   int method = 0, count = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(method = evas_render_method_lookup("wayland_egl")))
+     {
+        ERR("Render method lookup failed for Wayland_Egl");
+        return NULL;
+     }
+
+   count = ecore_wl_init(disp_name);
+   if (!count)
+     {
+        ERR("Failed to initialize Ecore_Wayland");
+        return NULL;
+     }
+   else if (count == 1)
+     ecore_wl_display_iterate();
+
+   if (!(ee = calloc(1, sizeof(Ecore_Evas))))
+     {
+        ERR("Failed to allocate Ecore_Evas");
+        goto ee_err;
+     }
+
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+   _ecore_evas_wl_common_init();
+
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
+
+   ee->driver = "wayland_egl";
+   if (disp_name) ee->name = strdup(disp_name);
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   ee->x = x;
+   ee->y = y;
+   ee->w = w;
+   ee->h = h;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
+   ee->rotation = 0;
+   ee->prop.max.w = 32767;
+   ee->prop.max.h = 32767;
+   ee->prop.layer = 4;
+   ee->prop.request_pos = 0;
+   ee->prop.sticky = 0;
+   ee->prop.draw_frame = frame;
+   ee->alpha = EINA_FALSE;
+
+   ee->evas = evas_new();
+   evas_data_attach_set(ee->evas, ee);
+   evas_output_method_set(ee->evas, method);
+   evas_output_size_set(ee->evas, ee->w, ee->h);
+   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+
+   /* FIXME: This needs to be set based on theme & scale */
+   if (ee->prop.draw_frame)
+     evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
+
+   if (parent)
+     p = ecore_wl_window_find(parent);
+
+   /* FIXME: Get if parent is alpha, and set */
+
+   ee->engine.wl.parent = p;
+   ee->engine.wl.win = 
+     ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW);
+   ee->prop.window = ee->engine.wl.win->id;
+
+   if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
+     {
+        einfo->info.display = ecore_wl_display_get();
+        einfo->info.destination_alpha = ee->alpha;
+        einfo->info.rotation = ee->rotation;
+        einfo->info.depth = 32;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
+             goto err;
+          }
+     }
+   else 
+     {
+        ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
+        goto err;
+     }
+
+   ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_common_pre_free);
+
+   if (ee->prop.draw_frame) 
+     {
+        ee->engine.wl.frame = _ecore_evas_wl_common_frame_add(ee->evas);
+        evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
+        evas_object_move(ee->engine.wl.frame, 0, 0);
+     }
+
+   _ecore_evas_register(ee);
+   ecore_evas_input_event_register(ee);
+
+   ecore_event_window_register(ee->prop.window, ee, ee->evas, 
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process, 
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process, 
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, 
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+
+   return ee;
+
+ err:
+   ecore_evas_free(ee);
+   _ecore_evas_wl_common_shutdown();
+
+ ee_err:
+   ecore_wl_shutdown();
+   return NULL;
+}
+
+static void 
+_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   ee->req.w = w;
+   ee->req.h = h;
+
+   if (!ee->prop.fullscreen)
+     {
+        int fw = 0, fh = 0;
+
+        if (ee->prop.min.w > w) w = ee->prop.min.w;
+        else if (w > ee->prop.max.w) w = ee->prop.max.w;
+        if (ee->prop.min.h > h) h = ee->prop.min.h;
+        else if (h > ee->prop.max.h) h = ee->prop.max.h;
+
+        evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
+        w += fw;
+        h += fh;
+     }
+
+   if ((ee->w != w) || (ee->h != h))
+     {
+        ee->w = w;
+        ee->h = h;
+
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, h, w);
+             evas_output_viewport_set(ee->evas, 0, 0, h, w);
+          }
+        else
+          {
+             evas_output_size_set(ee->evas, w, h);
+             evas_output_viewport_set(ee->evas, 0, 0, w, h);
+          }
+
+        if (ee->prop.avoid_damage)
+          {
+             int pdam = 0;
+
+             pdam = ecore_evas_avoid_damage_get(ee);
+             ecore_evas_avoid_damage_set(ee, 0);
+             ecore_evas_avoid_damage_set(ee, pdam);
+          }
+
+        if (ee->engine.wl.frame)
+          evas_object_resize(ee->engine.wl.frame, w, h);
+
+
+        if (ee->engine.wl.win)
+          {
+             ecore_wl_window_update_size(ee->engine.wl.win, w, h);
+             ecore_wl_window_buffer_attach(ee->engine.wl.win, NULL, 0, 0);
+          }
+
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+     }
+}
+
+static void 
+_ecore_evas_wl_show(Ecore_Evas *ee)
+{
+   Evas_Engine_Info_Wayland_Egl *einfo;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if ((!ee) || (ee->visible)) return;
+
+   if (ee->engine.wl.win)
+     {
+        ecore_wl_window_show(ee->engine.wl.win);
+        ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        ecore_wl_window_buffer_attach(ee->engine.wl.win, NULL, 0, 0);
+
+        if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
+          wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, 
+                                     ee->prop.clas);
+        if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
+          wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, 
+                                     ee->prop.title);
+     }
+
+   if (ee->engine.wl.frame)
+     {
+        evas_object_show(ee->engine.wl.frame);
+        evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
+     }
+
+   if (ee->engine.wl.win)
+     {
+        einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
+        if (!einfo)
+          {
+             ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
+             return;
+          }
+
+        einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win);
+        /* if (einfo->info.surface) */
+        evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        /* else */
+        /*   printf("Failed to get a Surface from Ecore_Wl\n"); */
+     }
+
+   ee->visible = 1;
+   if (ee->func.fn_show) ee->func.fn_show(ee);
+}
+
+static void 
+_ecore_evas_wl_hide(Ecore_Evas *ee)
+{
+   Evas_Engine_Info_Wayland_Egl *einfo;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if ((!ee) || (!ee->visible)) return;
+
+   einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+        einfo->info.surface = NULL;
+        evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+     }
+
+   if (ee->engine.wl.win) 
+     ecore_wl_window_hide(ee->engine.wl.win);
+
+   ee->visible = 0;
+   ee->should_be_visible = 0;
+
+   if (ee->func.fn_hide) ee->func.fn_hide(ee);
+}
+
+static void 
+_ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
+{
+   Evas_Engine_Info_Wayland_Egl *einfo;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if ((ee->alpha == alpha)) return;
+   ee->alpha = alpha;
+   if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
+     {
+        einfo->info.destination_alpha = alpha;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+     }
+}
+
+static void 
+_ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
+{
+   Evas_Engine_Info_Wayland_Egl *einfo;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if ((ee->transparent == transparent)) return;
+   ee->transparent = transparent;
+   if (!ee->visible) return;
+   if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
+     {
+        einfo->info.destination_alpha = transparent;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+     }
+}
+
+void 
+_ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if (ee->engine.wl.win) 
+     {
+        Evas_Engine_Info_Wayland_Egl *einfo;
+
+        if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
+          {
+             einfo->info.edges = location;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+
+        ee->engine.wl.win->resizing = EINA_TRUE;
+        ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
+     }
+}
+#else
+EAPI Ecore_Evas *
+ecore_evas_wayland_egl_new(const char *disp_name __UNUSED__, unsigned int parent __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, Eina_Bool frame __UNUSED__)
+{
+   return NULL;
+}
+#endif
diff --git a/src/lib/ecore_evas/ecore_evas_wayland_shm.c b/src/lib/ecore_evas/ecore_evas_wayland_shm.c
new file mode 100644 (file)
index 0000000..d2bc08a
--- /dev/null
@@ -0,0 +1,657 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+//#define LOGFNS 1
+
+#ifdef LOGFNS
+# include <stdio.h>
+# define LOGFN(fl, ln, fn) \
+   printf("-ECORE_EVAS-WL: %25s: %5i - %s\n", fl, ln, fn);
+#else
+# define LOGFN(fl, ln, fn)
+#endif
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+# include <stdlib.h>
+# include <string.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+#endif
+
+#include <Eina.h>
+
+#include "Ecore_Evas.h"
+
+#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
+# include "ecore_evas_private.h"
+# include <Evas_Engine_Wayland_Shm.h>
+# include <Ecore_Wayland.h>
+
+/* local function prototypes */
+static void _ecore_evas_wl_free(Ecore_Evas *ee);
+static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
+static void _ecore_evas_wl_move_resize(Ecore_Evas *ee, int x, int y, int w, int h);
+static void _ecore_evas_wl_show(Ecore_Evas *ee);
+static void _ecore_evas_wl_hide(Ecore_Evas *ee);
+static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
+static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
+static int  _ecore_evas_wl_render(Ecore_Evas *ee);
+
+/* SHM Only */
+static void _ecore_evas_wl_shm_pool_free(Ecore_Evas *ee);
+static void _ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size);
+static void _ecore_evas_wl_buffer_free(Ecore_Evas *ee);
+static void _ecore_evas_wl_buffer_new(Ecore_Evas *ee, int w, int h);
+
+/* Frame listener */
+static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t time);
+static const struct wl_callback_listener frame_listener =
+{
+   _ecore_evas_wl_frame_complete,
+};
+
+static Ecore_Evas_Engine_Func _ecore_wl_engine_func = 
+{
+   _ecore_evas_wl_free,
+   _ecore_evas_wl_common_callback_resize_set,
+   _ecore_evas_wl_common_callback_move_set,
+   NULL, 
+   NULL,
+   _ecore_evas_wl_common_callback_delete_request_set,
+   NULL,
+   _ecore_evas_wl_common_callback_focus_in_set,
+   _ecore_evas_wl_common_callback_focus_out_set,
+   _ecore_evas_wl_common_callback_mouse_in_set,
+   _ecore_evas_wl_common_callback_mouse_out_set,
+   NULL, // sticky_set
+   NULL, // unsticky_set
+   NULL, // pre_render_set
+   NULL, // post_render_set
+   _ecore_evas_wl_common_move,
+   NULL, // managed_move
+   _ecore_evas_wl_resize,
+   _ecore_evas_wl_move_resize,
+   NULL, // rotation_set
+   NULL, // shaped_set
+   _ecore_evas_wl_show,
+   _ecore_evas_wl_hide,
+   _ecore_evas_wl_common_raise,
+   NULL, // lower
+   NULL, // activate
+   _ecore_evas_wl_common_title_set,
+   _ecore_evas_wl_common_name_class_set,
+   _ecore_evas_wl_common_size_min_set,
+   _ecore_evas_wl_common_size_max_set,
+   _ecore_evas_wl_common_size_base_set,
+   _ecore_evas_wl_common_size_step_set,
+   NULL, // object_cursor_set
+   _ecore_evas_wl_common_layer_set,
+   NULL, // focus set
+   _ecore_evas_wl_common_iconified_set,
+   NULL, // borderless set
+   NULL, // override set
+   _ecore_evas_wl_common_maximized_set,
+   _ecore_evas_wl_common_fullscreen_set,
+   NULL, // func avoid_damage set
+   NULL, // func withdrawn set
+   NULL, // func sticky set
+   _ecore_evas_wl_common_ignore_events_set,
+   _ecore_evas_wl_alpha_set,
+   _ecore_evas_wl_transparent_set,
+   NULL, // func profiles set
+   NULL, // window group set
+   NULL, // aspect set
+   NULL, // urgent set
+   NULL, // modal set
+   NULL, // demand attention set
+   NULL, // focus skip set
+   _ecore_evas_wl_render,
+   _ecore_evas_wl_common_screen_geometry_get,
+   _ecore_evas_wl_common_screen_dpi_get
+};
+
+/* external variables */
+
+/* external functions */
+EAPI Ecore_Evas *
+ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame)
+{
+   Ecore_Wl_Window *p = NULL;
+   Evas_Engine_Info_Wayland_Shm *einfo;
+   Ecore_Evas *ee;
+   int method = 0, count = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(method = evas_render_method_lookup("wayland_shm")))
+     {
+        ERR("Render method lookup failed for Wayland_Shm");
+        return NULL;
+     }
+
+   count = ecore_wl_init(disp_name);
+   if (!count)
+     {
+        ERR("Failed to initialize Ecore_Wayland");
+        return NULL;
+     }
+   else if (count == 1)
+     ecore_wl_display_iterate();
+
+   if (!(ee = calloc(1, sizeof(Ecore_Evas))))
+     {
+        ERR("Failed to allocate Ecore_Evas");
+        goto ee_err;
+     }
+
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+   _ecore_evas_wl_common_init();
+
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wl_engine_func;
+
+   ee->driver = "wayland_shm";
+   if (disp_name) ee->name = strdup(disp_name);
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   ee->x = x;
+   ee->y = y;
+   ee->w = w;
+   ee->h = h;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
+   ee->rotation = 0;
+   ee->prop.max.w = 32767;
+   ee->prop.max.h = 32767;
+   ee->prop.layer = 4;
+   ee->prop.request_pos = 0;
+   ee->prop.sticky = 0;
+   ee->prop.draw_frame = frame;
+   ee->alpha = EINA_FALSE;
+
+   ee->evas = evas_new();
+   evas_data_attach_set(ee->evas, ee);
+   evas_output_method_set(ee->evas, method);
+   evas_output_size_set(ee->evas, ee->w, ee->h);
+   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+
+   /* FIXME: This needs to be set based on theme & scale */
+   if (ee->prop.draw_frame)
+     evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
+
+   if (parent)
+     p = ecore_wl_window_find(parent);
+
+   /* FIXME: Get if parent is alpha, and set */
+
+   ee->engine.wl.parent = p;
+   ee->engine.wl.win = 
+     ecore_wl_window_new(p, x, y, w, h, ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
+   ee->prop.window = ee->engine.wl.win->id;
+
+   if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
+     {
+        einfo->info.destination_alpha = ee->alpha;
+        einfo->info.rotation = ee->rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
+             goto err;
+          }
+     }
+   else 
+     {
+        ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
+        goto err;
+     }
+
+   ecore_evas_callback_pre_free_set(ee, _ecore_evas_wl_common_pre_free);
+
+   if (ee->prop.draw_frame) 
+     {
+        ee->engine.wl.frame = _ecore_evas_wl_common_frame_add(ee->evas);
+        evas_object_is_frame_object_set(ee->engine.wl.frame, EINA_TRUE);
+        evas_object_move(ee->engine.wl.frame, 0, 0);
+     }
+
+   _ecore_evas_register(ee);
+   ecore_evas_input_event_register(ee);
+
+   ecore_event_window_register(ee->prop.window, ee, ee->evas, 
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process, 
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process, 
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, 
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+
+   return ee;
+
+ err:
+   ecore_evas_free(ee);
+   _ecore_evas_wl_common_shutdown();
+
+ ee_err:
+   ecore_wl_shutdown();
+   return NULL;
+}
+
+static void 
+_ecore_evas_wl_free(Ecore_Evas *ee)
+{
+   _ecore_evas_wl_buffer_free(ee);
+   _ecore_evas_wl_shm_pool_free(ee);
+   _ecore_evas_wl_common_free(ee);
+}
+
+static void 
+_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
+{
+   Evas_Engine_Info_Wayland_Shm *einfo;
+   int fw = 0, fh = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+
+   ee->req.w = w;
+   ee->req.h = h;
+
+   if (!ee->prop.fullscreen)
+     {
+        int fw = 0, fh = 0;
+
+        if (ee->prop.min.w > w) w = ee->prop.min.w;
+        else if (w > ee->prop.max.w) w = ee->prop.max.w;
+        if (ee->prop.min.h > h) h = ee->prop.min.h;
+        else if (h > ee->prop.max.h) h = ee->prop.max.h;
+
+        evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
+        w += fw;
+        h += fh;
+     }
+
+   if ((ee->w != w) || (ee->h != h))
+     {
+        ee->w = w;
+        ee->h = h;
+
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, h, w);
+             evas_output_viewport_set(ee->evas, 0, 0, h, w);
+          }
+        else
+          {
+             evas_output_size_set(ee->evas, w, h);
+             evas_output_viewport_set(ee->evas, 0, 0, w, h);
+          }
+
+        if (ee->prop.avoid_damage)
+          {
+             int pdam = 0;
+
+             pdam = ecore_evas_avoid_damage_get(ee);
+             ecore_evas_avoid_damage_set(ee, 0);
+             ecore_evas_avoid_damage_set(ee, pdam);
+          }
+
+        if (ee->engine.wl.frame)
+          evas_object_resize(ee->engine.wl.frame, w, h);
+
+        _ecore_evas_wl_buffer_new(ee, w, h);
+
+        einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
+        if (!einfo)
+          {
+            ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
+            return;
+          }
+
+        einfo->info.dest = ee->engine.wl.pool_data;
+        evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+
+        if (ee->engine.wl.win)
+          {
+             ecore_wl_window_update_size(ee->engine.wl.win, w, h);
+             ecore_wl_window_buffer_attach(ee->engine.wl.win, 
+                                           ee->engine.wl.buffer, 0, 0);
+          }
+
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+     }
+}
+
+static void 
+_ecore_evas_wl_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if ((ee->x != x) || (ee->y != y))
+     _ecore_evas_wl_common_move(ee, x, y);
+   if ((ee->w != w) || (ee->h != h))
+     _ecore_evas_wl_resize(ee, w, h);
+}
+
+static void
+_ecore_evas_wl_show(Ecore_Evas *ee)
+{
+   Evas_Engine_Info_Wayland_Shm *einfo;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if ((!ee) || (ee->visible)) return;
+
+   _ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
+
+   einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
+   if (!einfo)
+     {
+        ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
+        return;
+     }
+
+   einfo->info.dest = ee->engine.wl.pool_data;
+   evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+
+   if (ee->engine.wl.win)
+     {
+        ecore_wl_window_show(ee->engine.wl.win);
+        ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        ecore_wl_window_buffer_attach(ee->engine.wl.win, 
+                                      ee->engine.wl.buffer, 0, 0);
+
+        if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
+          wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, 
+                                     ee->prop.clas);
+        if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
+          wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, 
+                                     ee->prop.title);
+     }
+
+   if (ee->engine.wl.frame)
+     {
+        evas_object_show(ee->engine.wl.frame);
+        evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
+     }
+
+   ee->visible = 1;
+   if (ee->func.fn_show) ee->func.fn_show(ee);
+}
+
+static void 
+_ecore_evas_wl_hide(Ecore_Evas *ee)
+{
+   Evas_Engine_Info_Wayland_Shm *einfo;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if ((!ee) || (!ee->visible)) return;
+
+   _ecore_evas_wl_buffer_free(ee);
+
+   munmap(ee->engine.wl.pool_data, ee->engine.wl.pool_size);
+
+   einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
+   if ((einfo) && (einfo->info.dest))
+     {
+        einfo->info.dest = NULL;
+        evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+     }
+
+   if (ee->engine.wl.win) 
+     ecore_wl_window_hide(ee->engine.wl.win);
+
+   ee->visible = 0;
+   ee->should_be_visible = 0;
+
+   if (ee->func.fn_hide) ee->func.fn_hide(ee);
+}
+
+static void 
+_ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
+{
+   Evas_Engine_Info_Wayland_Shm *einfo;
+   Ecore_Wl_Window *win = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if ((ee->alpha == alpha)) return;
+   ee->alpha = alpha;
+
+   /* FIXME: NB: We should really add a ecore_wl_window_alpha_set function
+    * but we are in API freeze, so just hack it in for now and fix when 
+    * freeze is over */
+   if ((win = ee->engine.wl.win))
+     win->alpha = alpha;
+
+   /* if (ee->engine.wl.win) */
+   /*   ecore_wl_window_transparent_set(ee->engine.wl.win, alpha); */
+
+   _ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
+
+   if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
+     {
+        einfo->info.destination_alpha = alpha;
+        einfo->info.dest = ee->engine.wl.pool_data;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+     }
+
+   if (win)
+     {
+        ecore_wl_window_update_size(win, ee->w, ee->h);
+        ecore_wl_window_buffer_attach(win, ee->engine.wl.buffer, 0, 0);
+     }
+}
+
+static void 
+_ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
+{
+   Evas_Engine_Info_Wayland_Shm *einfo;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if ((ee->transparent == transparent)) return;
+   ee->transparent = transparent;
+
+   if (ee->engine.wl.win)
+     ecore_wl_window_transparent_set(ee->engine.wl.win, transparent);
+
+   _ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
+
+   if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
+     {
+        einfo->info.destination_alpha = transparent;
+        einfo->info.dest = ee->engine.wl.pool_data;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+     }
+
+   if (ee->engine.wl.win)
+     {
+        ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        ecore_wl_window_buffer_attach(ee->engine.wl.win, 
+                                      ee->engine.wl.buffer, 0, 0);
+     }
+}
+
+static void
+_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t time __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+   Ecore_Wl_Window *win = NULL;
+
+   if (!ee) return;
+   if (!(win = ee->engine.wl.win)) return;
+
+   win->frame_callback = NULL;
+   win->frame_pending = EINA_FALSE;
+   wl_callback_destroy(callback);
+
+   if (win->surface)
+     {
+        win->frame_callback = wl_surface_frame(win->surface);
+        wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
+     }
+}
+
+static int
+_ecore_evas_wl_render(Ecore_Evas *ee)
+{
+   int rend = 0;
+   Ecore_Wl_Window *win = NULL;
+
+   if (!ee) return 0;
+   if (!ee->visible)
+     {
+        evas_norender(ee->evas);
+        return 0;
+     }
+
+   if (!(win = ee->engine.wl.win)) return 0;
+
+   rend = _ecore_evas_wl_common_pre_render(ee);
+   if (!(win->frame_pending))
+     {
+        /* FIXME - ideally have an evas_changed_get to return the value
+         * of evas->changed to avoid creating this callback and
+         * destroying it again
+         */
+
+        if (!win->frame_callback)
+          {
+             win->frame_callback = wl_surface_frame(win->surface);
+             wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
+          }
+
+        rend |= _ecore_evas_wl_common_render_updates(ee);
+        if (rend)
+           win->frame_pending = EINA_TRUE;
+     }
+   _ecore_evas_wl_common_post_render(ee);
+   return rend;
+}
+
+static void
+_ecore_evas_wl_shm_pool_free(Ecore_Evas *ee)
+{
+   if (!ee->engine.wl.pool) return;
+
+   wl_shm_pool_destroy(ee->engine.wl.pool);
+   ee->engine.wl.pool = NULL;
+   ee->engine.wl.pool_size = 0;
+   ee->engine.wl.pool_data = NULL;
+}
+
+static void
+_ecore_evas_wl_shm_pool_create(Ecore_Evas *ee, size_t size)
+{
+   struct wl_shm *shm;
+   void *data;
+   char tmp[PATH_MAX];
+   int fd;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (size <= ee->engine.wl.pool_size)
+      return;
+
+   size *= 1.5;
+   _ecore_evas_wl_shm_pool_free(ee);
+
+   if (!(shm = ecore_wl_shm_get()))
+     {
+        ERR("ecore_wl_shm_get returned NULL");
+        return;
+     }
+
+   strcpy(tmp, "/tmp/ecore-evas-wayland_shm-XXXXXX");
+   if ((fd = mkstemp(tmp)) < 0) 
+     {
+        ERR("Could not create temporary file.");
+        return;
+     }
+
+   if (ftruncate(fd, size) < 0) 
+     {
+        ERR("Could not truncate temporary file.");
+        goto end;
+     }
+
+   data = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
+   unlink(tmp);
+
+   if (data == MAP_FAILED)
+     {
+        ERR("mmap of temporary file failed.");
+        goto end;
+     }
+
+   ee->engine.wl.pool_size = size;
+   ee->engine.wl.pool_data = data;
+   ee->engine.wl.pool = wl_shm_create_pool(shm, fd, size);
+
+ end:
+   close(fd);
+}
+
+static void
+_ecore_evas_wl_buffer_free(Ecore_Evas *ee)
+{
+   if (!ee->engine.wl.buffer) return;
+
+   wl_buffer_destroy(ee->engine.wl.buffer);
+   ee->engine.wl.buffer = NULL;
+}
+
+static void 
+_ecore_evas_wl_buffer_new(Ecore_Evas *ee, int w, int h)
+{
+   unsigned int format;
+   int stride = 0;
+
+   stride = (w * sizeof(int));
+
+   _ecore_evas_wl_shm_pool_create(ee, stride * h);
+
+   if ((ee->alpha) || (ee->transparent))
+     format = WL_SHM_FORMAT_ARGB8888;
+   else
+     format = WL_SHM_FORMAT_XRGB8888;
+
+   _ecore_evas_wl_buffer_free(ee);
+   ee->engine.wl.buffer = 
+     wl_shm_pool_create_buffer(ee->engine.wl.pool, 0, w, h, stride, format);
+}
+
+void 
+_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ee) return;
+   if (ee->engine.wl.win) 
+     {
+        ee->engine.wl.win->resizing = EINA_TRUE;
+        ecore_wl_window_resize(ee->engine.wl.win, ee->w, ee->h, location);
+     }
+}
+#else
+EAPI Ecore_Evas *
+ecore_evas_wayland_shm_new(const char *disp_name __UNUSED__, unsigned int parent __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, Eina_Bool frame __UNUSED__)
+{
+   return NULL;
+}
+#endif
index b68c524..59d6ed8 100644 (file)
@@ -1,89 +1,71 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
 #include <stdlib.h> /* for NULL */
 
-#include "Ecore.h"
+#include <Ecore.h>
 #include "ecore_private.h"
 #ifdef BUILD_ECORE_EVAS_WIN32
-# include "Ecore_Win32.h"
-# include "ecore_win32_private.h"
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# undef WIN32_LEAN_AND_MEAN
+# include <Ecore_Win32.h>
+# include <ecore_win32_private.h>
 #endif /* BUILD_ECORE_EVAS_WIN32 */
 
 #include "ecore_evas_private.h"
 #include "Ecore_Evas.h"
 
-
 #ifdef BUILD_ECORE_EVAS_WIN32
 
-#define ECORE_EVAS_EVENT_COUNT 14
+#define ECORE_EVAS_EVENT_COUNT 10
 
 static int _ecore_evas_init_count = 0;
-static int _ecore_evas_fps_debug  = 0;
 
 static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
-static Ecore_Idle_Enterer  *ecore_evas_idle_enterer = NULL;
-static Ecore_Evas          *ecore_evases = NULL;
-static Evas_Hash           *ecore_evases_hash = NULL;
-
-static int _ecore_evas_win32_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event);
-
-static int _ecore_evas_win32_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
-
-static int _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
-
-static int _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
 
 /* Private functions */
 
-static void
+static int
 _ecore_evas_win32_render(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_BUFFER
-   Evas_List *ll;
-#endif
+   int rend = 0;
+   Eina_List *updates = NULL;
+   Eina_List *ll;
+   Ecore_Evas *ee2;
 
-#ifdef BUILD_ECORE_EVAS_BUFFER
-   for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
      {
-       Ecore_Evas *ee2;
-
-       ee2 = ll->data;
-       if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
-       _ecore_evas_buffer_render(ee2);
-       if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
      }
-#endif
+
    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
    if (ee->prop.avoid_damage)
      {
-        Evas_List *updates;
-
         updates = evas_render_updates(ee->evas);
         if (updates) evas_render_updates_free(updates);
      }
@@ -93,49 +75,20 @@ _ecore_evas_win32_render(Ecore_Evas *ee)
      {
         if (ee->shaped)
           {
-             Evas_List *updates;
-
              updates = evas_render_updates(ee->evas);
              if (updates) evas_render_updates_free(updates);
           }
         else
           {
-             Evas_List *updates;
-
              updates = evas_render_updates(ee->evas);
              if (updates) evas_render_updates_free(updates);
           }
      }
    else
      evas_norender(ee->evas);
+   if (updates) rend = 1;
    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
-}
-
-static int
-_ecore_evas_win32_idle_enter(void *data __UNUSED__)
-{
-   Ecore_List2 *l;
-   double       t1 = 0.0;
-   double       t2 = 0.0;
-
-   if (_ecore_evas_fps_debug)
-     {
-       t1 = ecore_time_get();
-     }
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-
-       ee = (Ecore_Evas *)l;
-       _ecore_evas_win32_render(ee);
-     }
-/*    ecore_x_flush(); */
-   if (_ecore_evas_fps_debug)
-     {
-       t2 = ecore_time_get();
-/*     _ecore_evas_fps_debug_rendertime_add(t2 - t1); */
-     }
-   return 1;
+   return rend;
 }
 
 static int
@@ -145,26 +98,18 @@ _ecore_evas_win32_init(void)
    if (_ecore_evas_init_count > 1)
      return _ecore_evas_init_count;
 
-   if (getenv("ECORE_EVAS_FPS_DEBUG"))
-     _ecore_evas_fps_debug = 1;
-
-   ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_win32_idle_enter, NULL);
-
-   ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_WIN32_EVENT_KEY_DOWN, _ecore_evas_win32_event_key_down, NULL);
-   ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_WIN32_EVENT_KEY_UP, _ecore_evas_win32_event_key_up, NULL);
-   ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_win32_event_mouse_button_down, NULL);
-   ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_UP, _ecore_evas_win32_event_mouse_button_up, NULL);
-   ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_WHEEL, _ecore_evas_win32_event_mouse_wheel, NULL);
-   ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_MOVE, _ecore_evas_win32_event_mouse_move, NULL);
-   ecore_evas_event_handlers[6]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_IN, _ecore_evas_win32_event_mouse_in, NULL);
-   ecore_evas_event_handlers[7]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_OUT, _ecore_evas_win32_event_mouse_out, NULL);
-   ecore_evas_event_handlers[8]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, _ecore_evas_win32_event_window_damage, NULL);
-   ecore_evas_event_handlers[9]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, _ecore_evas_win32_event_window_destroy, NULL);
-   ecore_evas_event_handlers[10]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_SHOW, _ecore_evas_win32_event_window_show, NULL);
-   ecore_evas_event_handlers[11]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_HIDE, _ecore_evas_win32_event_window_hide, NULL);
-   ecore_evas_event_handlers[12]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, _ecore_evas_win32_event_window_configure, NULL);
-   ecore_evas_event_handlers[13]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_win32_event_window_delete_request, NULL);
-
+   ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_IN, _ecore_evas_win32_event_mouse_in, NULL);
+   ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_OUT, _ecore_evas_win32_event_mouse_out, NULL);
+   ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, _ecore_evas_win32_event_window_focus_in, NULL);
+   ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_win32_event_window_focus_out, NULL);
+   ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, _ecore_evas_win32_event_window_damage, NULL);
+   ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, _ecore_evas_win32_event_window_destroy, NULL);
+   ecore_evas_event_handlers[6]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_SHOW, _ecore_evas_win32_event_window_show, NULL);
+   ecore_evas_event_handlers[7]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_HIDE, _ecore_evas_win32_event_window_hide, NULL);
+   ecore_evas_event_handlers[8]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, _ecore_evas_win32_event_window_configure, NULL);
+   ecore_evas_event_handlers[9]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_win32_event_window_delete_request, NULL);
+
+   ecore_event_evas_init();
    return _ecore_evas_init_count;
 }
 
@@ -174,13 +119,11 @@ _ecore_evas_win32_shutdown(void)
    _ecore_evas_init_count--;
    if (_ecore_evas_init_count == 0)
      {
-       int i;
+        int i;
 
-       while (ecore_evases) _ecore_evas_free(ecore_evases);
-       for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
-         ecore_event_handler_del(ecore_evas_event_handlers[i]);
-       ecore_idle_enterer_del(ecore_evas_idle_enterer);
-       ecore_evas_idle_enterer = NULL;
+        for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
+          ecore_event_handler_del(ecore_evas_event_handlers[i]);
+        ecore_event_evas_shutdown();
      }
 
    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
@@ -188,235 +131,99 @@ _ecore_evas_win32_shutdown(void)
    return _ecore_evas_init_count;
 }
 
-static char *
-_ecore_evas_win32_winid_str_get(Ecore_Win32_Window *window)
-{
-   static char  id[9];
-   const char  *vals = "qWeRtYuIoP5-$&<~";
-   unsigned int val;
-
-   val = (unsigned int)window;
-   id[0] = vals[(val >> 28) & 0xf];
-   id[1] = vals[(val >> 24) & 0xf];
-   id[2] = vals[(val >> 20) & 0xf];
-   id[3] = vals[(val >> 16) & 0xf];
-   id[4] = vals[(val >> 12) & 0xf];
-   id[5] = vals[(val >>  8) & 0xf];
-   id[6] = vals[(val >>  4) & 0xf];
-   id[7] = vals[(val      ) & 0xf];
-   id[8] = 0;
-
-   return id;
-}
-
-static Ecore_Evas *
-_ecore_evas_win32_match(Ecore_Win32_Window *window)
-{
-   Ecore_Evas *ee;
-
-   ee = evas_hash_find(ecore_evases_hash, _ecore_evas_win32_winid_str_get(window));
-
-   return ee;
-}
-
-static int
-_ecore_evas_win32_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                 *ee;
-   Ecore_Win32_Event_Key_Down *e;
-
-   e = event;
-   ee = _ecore_evas_win32_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   evas_event_feed_key_down(ee->evas, e->keyname, e->keysymbol, e->keycompose, NULL, e->time, NULL);
-
-   return 1;
-}
+   Ecore_Win32_Event_Mouse_In *e;
 
-static int
-_ecore_evas_win32_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas               *ee;
-   Ecore_Win32_Event_Key_Up *e;
+   INF("mouse in");
 
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   evas_event_feed_key_up(ee->evas, e->keyname, e->keysymbol, e->keycompose, NULL, e->time, NULL);
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
 
-   return 1;
-}
-
-static int
-_ecore_evas_win32_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas                          *ee;
-   Ecore_Win32_Event_Mouse_Button_Down *e;
-   Evas_Button_Flags                    flags = EVAS_BUTTON_NONE;
-
-   e = event;
-   ee = _ecore_evas_win32_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
+   if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
    /* FIXME to do */
 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_down(ee->evas, e->button, flags, e->time, NULL);
-
-   printf (" * ee event button down %f %d %d\n", e->time, e->x, e->y);
+   evas_event_feed_mouse_in(ee->evas, e->timestamp, NULL);
+   evas_focus_in(ee->evas);
+   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->timestamp);
 
    return 1;
 }
 
-static int
-_ecore_evas_win32_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   Ecore_Evas                        *ee;
-   Ecore_Win32_Event_Mouse_Button_Up *e;
-   Evas_Button_Flags                  flags = EVAS_BUTTON_NONE;
-
-   printf (" * ee event button up 0 \n");
-   e = event;
-   ee = _ecore_evas_win32_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
-
-   printf (" * ee event button up\n");
-
-   return 1;
-}
+   Ecore_Evas                  *ee;
+   Ecore_Win32_Event_Mouse_Out *e;
 
-static int
-_ecore_evas_win32_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas                    *ee;
-   Ecore_Win32_Event_Mouse_Wheel *e;
+   INF("mouse out");
 
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   evas_event_feed_mouse_wheel(ee->evas, e->direction, e->z, e->time, NULL);
-
-   return 1;
-}
-
-static void
-_ecore_evas_win32_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
-{
-   ee->mouse.x = x;
-   ee->mouse.y = y;
-   if (ee->prop.cursor.object)
-     {
-       evas_object_show(ee->prop.cursor.object);
-       if (ee->rotation == 0)
-         evas_object_move(ee->prop.cursor.object,
-                          x - ee->prop.cursor.hot.x,
-                          y - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 90)
-         evas_object_move(ee->prop.cursor.object,
-                          ee->h - y - 1 - ee->prop.cursor.hot.x,
-                          x - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 180)
-         evas_object_move(ee->prop.cursor.object,
-                          ee->w - x - 1 - ee->prop.cursor.hot.x,
-                          ee->h - y - 1 - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 270)
-         evas_object_move(ee->prop.cursor.object,
-                          y - ee->prop.cursor.hot.x,
-                          ee->w - x - 1 - ee->prop.cursor.hot.y);
-     }
-   if (ee->rotation == 0)
-     evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
-   else if (ee->rotation == 90)
-     evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
-   else if (ee->rotation == 180)
-     evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
-   else if (ee->rotation == 270)
-     evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
-}
-
-static int
-_ecore_evas_win32_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas                   *ee;
-   Ecore_Win32_Event_Mouse_Move *e;
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
 
-   e = event;
-   ee = _ecore_evas_win32_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
    /* FIXME to do */
 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
+   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->timestamp);
+
+   evas_event_feed_mouse_out(ee->evas, e->timestamp, NULL);
+   if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
+   if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
 
    return 1;
 }
 
-static int
-_ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_win32_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   Ecore_Evas                 *ee;
-   Ecore_Win32_Event_Mouse_In *e;
+   Ecore_Evas *ee;
+   Ecore_Win32_Event_Window_Focus_In *e;
 
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
-
-   if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   evas_event_feed_mouse_in(ee->evas, e->time, NULL);
-   _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
-
-   return 1;
+   ee = ecore_event_window_match((Ecore_Window)e->window);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if ((Ecore_Window)e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+
+   ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
-_ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_win32_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   Ecore_Evas                  *ee;
-   Ecore_Win32_Event_Mouse_Out *e;
+   Ecore_Evas *ee;
+   Ecore_Win32_Event_Window_Focus_Out *e;
 
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
-
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
-
-   evas_event_feed_mouse_out(ee->evas, e->time, NULL);
-   if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
-   if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
-
-   return 1;
+   ee = ecore_event_window_match((Ecore_Window)e->window);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if ((Ecore_Window)e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+
+   evas_focus_out(ee->evas);
+   ee->prop.focused = 0;
+   if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                      *ee;
    Ecore_Win32_Event_Window_Damage *e;
 
+   INF("window damage");
+
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
 
    if (ee->prop.avoid_damage)
      {
@@ -428,7 +235,6 @@ _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__
      }
    else
      {
-       printf (" * ee window event damage\n");
         if (ee->rotation == 0)
           evas_damage_rectangle_add(ee->evas,
                                     e->x,
@@ -458,34 +264,36 @@ _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                       *ee;
    Ecore_Win32_Event_Window_Destroy *e;
 
+   INF("window destroy");
+
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
    if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
    ecore_evas_free(ee);
 
-   printf (" * ee event destroy\n");
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                    *ee;
    Ecore_Win32_Event_Window_Show *e;
 
-   printf (" * ee window event show\n");
+   INF("window show");
+
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
    if (ee->visible) return 0; /* dont pass it on */
    ee->visible = 1;
    if (ee->func.fn_show) ee->func.fn_show(ee);
@@ -493,16 +301,18 @@ _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__,
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                    *ee;
    Ecore_Win32_Event_Window_Hide *e;
 
+   INF("window hide");
+
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
    if (!ee->visible) return 0; /* dont pass it on */
    ee->visible = 0;
    if (ee->func.fn_hide) ee->func.fn_hide(ee);
@@ -510,29 +320,39 @@ _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__,
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                         *ee;
    Ecore_Win32_Event_Window_Configure *e;
 
+   INF("window configure");
+
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
 
-   if ((ee->x != e->x) || (ee->y != e->y))
+   if (ee->prop.override)
      {
-        ee->x = e->x;
-        ee->y = e->y;
-        if (ee->func.fn_move) ee->func.fn_move(ee);
+        if ((ee->x != e->x) || (ee->y != e->y))
+          {
+             ee->x = e->x;
+             ee->y = e->y;
+             ee->req.x = ee->x;
+             ee->req.y = ee->y;
+
+             if (ee->func.fn_move) ee->func.fn_move(ee);
+          }
      }
 
    if ((ee->w != e->width) || (ee->h != e->height))
      {
-       printf (" * ee resize : 1\n");
         ee->w = e->width;
         ee->h = e->height;
+        ee->req.w = ee->w;
+        ee->req.h = ee->h;
+
         if ((ee->rotation == 90) || (ee->rotation == 270))
           {
              evas_output_size_set(ee->evas, ee->h, ee->w);
@@ -540,49 +360,50 @@ _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSE
           }
         else
           {
-            printf (" * ee resize : 2\n");
              evas_output_size_set(ee->evas, ee->w, ee->h);
              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
           }
         if (ee->prop.avoid_damage)
           {
+             int pdam;
+
+             pdam = ecore_evas_avoid_damage_get(ee);
              ecore_evas_avoid_damage_set(ee, 0);
-             ecore_evas_avoid_damage_set(ee, 1);
+             ecore_evas_avoid_damage_set(ee, pdam);
           }
-        /* FIXME: to do... */
-/*     if (ee->shaped) */
-/*       _ecore_evas_x_resize_shape(ee); */
+/*         if (ee->shaped) */
+/*           _ecore_evas_win32_region_border_resize(ee); */
         if ((ee->expecting_resize.w > 0) &&
             (ee->expecting_resize.h > 0))
           {
-            printf (" * ee resize : 3\n");
              if ((ee->expecting_resize.w == ee->w) &&
                  (ee->expecting_resize.h == ee->h))
-               _ecore_evas_win32_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
-                                                    ecore_win32_current_time_get());
+               _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                              ecore_win32_current_time_get());
              ee->expecting_resize.w = 0;
              ee->expecting_resize.h = 0;
           }
-        printf (" * ee resize : 4\n");
         if (ee->func.fn_resize) ee->func.fn_resize(ee);
      }
 
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                              *ee;
    Ecore_Win32_Event_Window_Delete_Request *e;
 
+   INF("window delete request");
+
    e = event;
-   ee = _ecore_evas_win32_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.win32.window) return 1;
+   if ((Ecore_Window)e->window != ee->prop.window) return 1;
    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
 
-   printf (" * ee event delete\n");
+   INF(" * ee event delete\n");
    return 1;
 }
 
@@ -592,16 +413,17 @@ _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __
 static void
 _ecore_evas_win32_free(Ecore_Evas *ee)
 {
-   ecore_win32_window_del(ee->engine.win32.window);
-   ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_win32_winid_str_get(ee->engine.win32.window), ee);
-   ecore_evases = _ecore_list2_remove(ecore_evases, ee);
+   INF("ecore evas free");
+
+   ecore_win32_window_free((struct _Ecore_Win32_Window *)ee->prop.window);
+   ecore_event_window_unregister(ee->prop.window);
    _ecore_evas_win32_shutdown();
    ecore_win32_shutdown();
 }
 
 static void
 _ecore_evas_win32_callback_delete_request_set(Ecore_Evas *ee,
-                                              void (*func) (Ecore_Evas *ee))
+                                              Ecore_Evas_Event_Cb func)
 {
    ee->func.fn_delete_request = func;
 }
@@ -609,11 +431,16 @@ _ecore_evas_win32_callback_delete_request_set(Ecore_Evas *ee,
 static void
 _ecore_evas_win32_move(Ecore_Evas *ee, int x, int y)
 {
+  INF("ecore evas move (%dx%d)", x, y);
+   ee->req.x = x;
+   ee->req.y = y;
+
    if ((x != ee->x) || (y != ee->y))
      {
         ee->x = x;
         ee->y = y;
-        ecore_win32_window_move(ee->engine.win32.window, x, y);
+        ecore_win32_window_move((struct _Ecore_Win32_Window *)ee->prop.window,
+                                x, y);
         if (ee->func.fn_move) ee->func.fn_move(ee);
      }
 }
@@ -621,12 +448,16 @@ _ecore_evas_win32_move(Ecore_Evas *ee, int x, int y)
 static void
 _ecore_evas_win32_resize(Ecore_Evas *ee, int width, int height)
 {
-  printf (" * _ecore_evas_win32_resize %d %d\n", width, height);
+   INF("ecore evas resize (%dx%d)", width, height);
+   ee->req.w = width;
+   ee->req.h = height;
+
    if ((ee->w != width) || (ee->h != height))
      {
         ee->w = width;
         ee->h = height;
-        ecore_win32_window_resize(ee->engine.win32.window, width, height);
+        ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
+                                  width, height);
         if ((ee->rotation == 90) || (ee->rotation == 270))
           {
              evas_output_size_set(ee->evas, ee->h, ee->w);
@@ -637,8 +468,16 @@ _ecore_evas_win32_resize(Ecore_Evas *ee, int width, int height)
              evas_output_size_set(ee->evas, ee->w, ee->h);
              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
           }
-        /* FIXME: damage and shape */
+        if (ee->prop.avoid_damage)
+          {
+             int pdam;
 
+             pdam = ecore_evas_avoid_damage_get(ee);
+             ecore_evas_avoid_damage_set(ee, 0);
+             ecore_evas_avoid_damage_set(ee, pdam);
+          }
+/*         if ((ee->shaped) || (ee->alpha)) */
+/*           _ecore_evas_win32_region_border_resize(ee); */
         if (ee->func.fn_resize) ee->func.fn_resize(ee);
      }
 }
@@ -646,7 +485,12 @@ _ecore_evas_win32_resize(Ecore_Evas *ee, int width, int height)
 static void
 _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int height)
 {
-  printf (" * _ecore_evas_win32_resize\n");
+   INF("ecore evas resize (%dx%d %dx%d)", x, y, width, height);
+   ee->req.x = x;
+   ee->req.y = y;
+   ee->req.w = width;
+   ee->req.h = height;
+
    if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y))
      {
         int change_size = 0;
@@ -659,7 +503,8 @@ _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int heigh
         ee->y = y;
         ee->w = width;
         ee->h = height;
-        ecore_win32_window_move_resize(ee->engine.win32.window, x, y, width, height);
+        ecore_win32_window_move_resize((struct _Ecore_Win32_Window *)ee->prop.window,
+                                       x, y, width, height);
         if ((ee->rotation == 90) || (ee->rotation == 270))
           {
              evas_output_size_set(ee->evas, ee->h, ee->w);
@@ -670,7 +515,16 @@ _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int heigh
              evas_output_size_set(ee->evas, ee->w, ee->h);
              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
           }
-        /* FIXME: damage and shape */
+        if (ee->prop.avoid_damage)
+          {
+             int pdam;
+
+             pdam = ecore_evas_avoid_damage_get(ee);
+             ecore_evas_avoid_damage_set(ee, 0);
+             ecore_evas_avoid_damage_set(ee, pdam);
+          }
+/*         if ((ee->shaped) || (ee->alpha)) */
+/*           _ecore_evas_win32_region_border_resize(ee); */
         if (change_pos)
           {
              if (ee->func.fn_move) ee->func.fn_move(ee);
@@ -683,130 +537,202 @@ _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int heigh
 }
 
 static void
-_ecore_evas_win32_rotation_set(Ecore_Evas *ee, int rotation)
+_ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
 {
    int rot_dif;
 
-   if (ee->rotation == rotation) return;
    rot_dif = ee->rotation - rotation;
    if (rot_dif < 0) rot_dif = -rot_dif;
 
-   if (!strcmp(ee->driver, "software_ddraw"))
+   if (rot_dif != 180)
+     {
+        int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
+
+        if (!ee->prop.fullscreen)
+          {
+             ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
+                                       ee->h, ee->w);
+             ee->expecting_resize.w = ee->h;
+             ee->expecting_resize.h = ee->w;
+          }
+        else
+          {
+             int w, h;
+
+             ecore_win32_window_size_get((struct _Ecore_Win32_Window *)ee->prop.window,
+                                         &w, &h);
+             ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
+                                       h, w);
+             if ((rotation == 0) || (rotation == 180))
+               {
+                  evas_output_size_set(ee->evas, ee->w, ee->h);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+               }
+             else
+               {
+                  evas_output_size_set(ee->evas, ee->h, ee->w);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+               }
+             if (ee->func.fn_resize) ee->func.fn_resize(ee);
+          }
+        ecore_evas_size_min_get(ee, &minw, &minh);
+        ecore_evas_size_max_get(ee, &maxw, &maxh);
+        ecore_evas_size_base_get(ee, &basew, &baseh);
+        ecore_evas_size_step_get(ee, &stepw, &steph);
+        ee->rotation = rotation;
+        ecore_evas_size_min_set(ee, minh, minw);
+        ecore_evas_size_max_set(ee, maxh, maxw);
+        ecore_evas_size_base_set(ee, baseh, basew);
+        ecore_evas_size_step_set(ee, steph, stepw);
+        _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                       ecore_win32_current_time_get());
+     }
+   else
+     {
+        ee->rotation = rotation;
+        _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                       ecore_win32_current_time_get());
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+     }
+
+   if ((ee->rotation == 90) || (ee->rotation == 270))
+     evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+   else
+     evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+}
+
+static void
+_ecore_evas_win32_rotation_set(Ecore_Evas *ee, int rotation, int resize)
+{
+   INF("ecore evas rotation: %s", rotation ? "yes" : "no");
+
+   if (ee->rotation == rotation) return;
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+   if (!strcmp(ee->driver, "software_gdi"))
      {
+        Evas_Engine_Info_Software_Gdi *einfo;
+
+        einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        _ecore_evas_win32_rotation_set_internal(ee, rotation);
+     }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
+
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
-       Evas_Engine_Info_Software_DDraw *einfo;
-
-       einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
-       if (!einfo) return;
-       if (rot_dif != 180)
-         {
-            int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
-
-            einfo->info.rotation = rotation;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-            if (!ee->prop.fullscreen)
-              {
-                 ecore_win32_window_resize(ee->engine.win32.window, ee->h, ee->w);
-                 ee->expecting_resize.w = ee->h;
-                 ee->expecting_resize.h = ee->w;
-              }
-            else
-              {
-                 int w, h;
-
-                 ecore_win32_window_size_get(ee->engine.win32.window, &w, &h);
-                 ecore_win32_window_resize(ee->engine.win32.window, h, w);
-                 if ((rotation == 0) || (rotation == 180))
-                   {
-                      evas_output_size_set(ee->evas, ee->w, ee->h);
-                      evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-                   }
-                 else
-                   {
-                      evas_output_size_set(ee->evas, ee->h, ee->w);
-                      evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
-                   }
-                 if (ee->func.fn_resize) ee->func.fn_resize(ee);
-              }
-            ecore_evas_size_min_get(ee, &minw, &minh);
-            ecore_evas_size_max_get(ee, &maxw, &maxh);
-            ecore_evas_size_base_get(ee, &basew, &baseh);
-            ecore_evas_size_step_get(ee, &stepw, &steph);
-            ee->rotation = rotation;
-            ecore_evas_size_min_set(ee, minh, minw);
-            ecore_evas_size_max_set(ee, maxh, maxw);
-            ecore_evas_size_base_set(ee, baseh, basew);
-            ecore_evas_size_step_set(ee, steph, stepw);
-            _ecore_evas_win32_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
-                                                  ecore_win32_current_time_get());
-         }
-       else
-         {
-            einfo->info.rotation = rotation;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-            ee->rotation = rotation;
-            _ecore_evas_win32_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
-                                                  ecore_win32_current_time_get());
-            if (ee->func.fn_resize) ee->func.fn_resize(ee);
-         }
-       if ((ee->rotation == 90) || (ee->rotation == 270))
-         evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
-       else
-         evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+   if (!strcmp(ee->driver, "software_ddraw"))
+     {
+        Evas_Engine_Info_Software_DDraw *einfo;
+
+        einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        _ecore_evas_win32_rotation_set_internal(ee, rotation);
+     }
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
+}
+
+static void
+_ecore_evas_win32_shaped_set(Ecore_Evas *ee, int shaped)
+{
+   if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
+     return;
+
+   if (!strcmp(ee->driver, "software_ddraw")) return;
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+   if (!strcmp(ee->driver, "software_gdi"))
+     {
+        Evas_Engine_Info_Software_Gdi *einfo;
+
+        einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
+        ee->shaped = shaped;
+        if (einfo)
+          {
+             ee->engine.win32.state.region = ee->shaped;
+             einfo->info.region = ee->engine.win32.state.region;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+             if (ee->shaped)
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
      }
 }
 
 static void
 _ecore_evas_win32_show(Ecore_Evas *ee)
 {
-  printf (" * ee window show\n");
+   INF("ecore evas show");
+
    ee->should_be_visible = 1;
    if (ee->prop.avoid_damage)
      _ecore_evas_win32_render(ee);
-   ecore_win32_window_show(ee->engine.win32.window);
+   ecore_win32_window_show((struct _Ecore_Win32_Window *)ee->prop.window);
 /*    if (ee->prop.fullscreen) */
-/*      ecore_win32_window_focus(ee->engine.win32.window); */
+/*      ecore_win32_window_focus(ee->prop.window); */
 }
 
 static void
 _ecore_evas_win32_hide(Ecore_Evas *ee)
 {
-   ecore_win32_window_hide(ee->engine.win32.window);
+   INF("ecore evas hide");
+
+   ecore_win32_window_hide((struct _Ecore_Win32_Window *)ee->prop.window);
    ee->should_be_visible = 0;
 }
 
 static void
 _ecore_evas_win32_raise(Ecore_Evas *ee)
 {
+   INF("ecore evas raise");
+
    if (!ee->prop.fullscreen)
-     ecore_win32_window_raise(ee->engine.win32.window);
+     ecore_win32_window_raise((struct _Ecore_Win32_Window *)ee->prop.window);
    else
-     ecore_win32_window_raise(ee->engine.win32.window);
+     ecore_win32_window_raise((struct _Ecore_Win32_Window *)ee->prop.window);
 }
 
 static void
 _ecore_evas_win32_lower(Ecore_Evas *ee)
 {
+   INF("ecore evas lower");
+
    if (!ee->prop.fullscreen)
-     ecore_win32_window_lower(ee->engine.win32.window);
+     ecore_win32_window_lower((struct _Ecore_Win32_Window *)ee->prop.window);
    else
-     ecore_win32_window_lower(ee->engine.win32.window);
+     ecore_win32_window_lower((struct _Ecore_Win32_Window *)ee->prop.window);
 }
 
 static void
 _ecore_evas_win32_activate(Ecore_Evas *ee)
 {
-   ecore_win32_window_focus_set(ee->engine.win32.window);
+   INF("ecore evas activate");
+
+   ecore_win32_window_focus((struct _Ecore_Win32_Window *)ee->prop.window);
 }
 
 static void
 _ecore_evas_win32_title_set(Ecore_Evas *ee, const char *title)
 {
+   INF("ecore evas title set");
+
    if (ee->prop.title) free(ee->prop.title);
    ee->prop.title = NULL;
    if (title) ee->prop.title = strdup(title);
-   ecore_win32_window_title_set(ee->engine.win32.window, ee->prop.title);
+   ecore_win32_window_title_set((struct _Ecore_Win32_Window *)ee->prop.window,
+                                ee->prop.title);
 }
 
 static void
@@ -817,7 +743,8 @@ _ecore_evas_win32_size_min_set(Ecore_Evas *ee, int width, int height)
    if ((ee->prop.min.w == width) && (ee->prop.min.h == height)) return;
    ee->prop.min.w = width;
    ee->prop.min.h = height;
-   ecore_win32_window_size_min_set(ee->engine.win32.window, width, height);
+   ecore_win32_window_size_min_set((struct _Ecore_Win32_Window *)ee->prop.window,
+                                   width, height);
 }
 
 static void
@@ -828,7 +755,8 @@ _ecore_evas_win32_size_max_set(Ecore_Evas *ee, int width, int height)
    if ((ee->prop.max.w == width) && (ee->prop.max.h == height)) return;
    ee->prop.max.w = width;
    ee->prop.max.h = height;
-   ecore_win32_window_size_max_set(ee->engine.win32.window, width, height);
+   ecore_win32_window_size_max_set((struct _Ecore_Win32_Window *)ee->prop.window,
+                                   width, height);
 }
 
 static void
@@ -839,7 +767,8 @@ _ecore_evas_win32_size_base_set(Ecore_Evas *ee, int width, int height)
    if ((ee->prop.base.w == width) && (ee->prop.base.h == height)) return;
    ee->prop.base.w = width;
    ee->prop.base.h = height;
-   ecore_win32_window_size_base_set(ee->engine.win32.window, width, height);
+   ecore_win32_window_size_base_set((struct _Ecore_Win32_Window *)ee->prop.window,
+                                    width, height);
 }
 
 static void
@@ -850,7 +779,8 @@ _ecore_evas_win32_size_step_set(Ecore_Evas *ee, int width, int height)
    if ((ee->prop.step.w == width) && (ee->prop.step.h == height)) return;
    ee->prop.step.w = width;
    ee->prop.step.h = height;
-   ecore_win32_window_size_step_set(ee->engine.win32.window, width, height);
+   ecore_win32_window_size_step_set((struct _Ecore_Win32_Window *)ee->prop.window,
+                                    width, height);
 }
 
 static void
@@ -863,12 +793,12 @@ _ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int ho
 
    if (obj == NULL)
      {
-       ee->prop.cursor.object = NULL;
-       ee->prop.cursor.layer = 0;
-       ee->prop.cursor.hot.x = 0;
-       ee->prop.cursor.hot.y = 0;
-       ecore_win32_window_cursor_show(ee->engine.win32.window, 1);
-       return;
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        ecore_win32_window_cursor_show(ee->prop.window, 1);
+        return;
      }
 
    ee->prop.cursor.object = obj;
@@ -876,13 +806,13 @@ _ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int ho
    ee->prop.cursor.hot.x = hot_x;
    ee->prop.cursor.hot.y = hot_y;
 
-   ecore_win32_window_cursor_show(ee->engine.win32.window, 0);
+   ecore_win32_window_cursor_show(ee->prop.window, 0);
 
    evas_pointer_output_xy_get(ee->evas, &x, &y);
    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
    evas_object_move(ee->prop.cursor.object,
-                   x - ee->prop.cursor.hot.x,
-                   y - ee->prop.cursor.hot.y);
+                    x - ee->prop.cursor.hot.x,
+                    y - ee->prop.cursor.hot.y);
    evas_object_pass_events_set(ee->prop.cursor.object, 1);
    if (evas_pointer_inside_get(ee->evas))
      evas_object_show(ee->prop.cursor.object);
@@ -892,7 +822,7 @@ _ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int ho
 static void
 _ecore_evas_win32_focus_set(Ecore_Evas *ee, int on __UNUSED__)
 {
-   ecore_win32_window_focus_set(ee->engine.win32.window);
+   ecore_win32_window_focus((struct _Ecore_Win32_Window *)ee->prop.window);
 }
 
 static void
@@ -901,7 +831,8 @@ _ecore_evas_win32_iconified_set(Ecore_Evas *ee, int on)
 /*    if (((ee->prop.borderless) && (on)) || */
 /*        ((!ee->prop.borderless) && (!on))) return; */
    ee->prop.iconified = on;
-   ecore_win32_window_iconified_set(ee->engine.win32.window, ee->prop.iconified);
+   ecore_win32_window_iconified_set((struct _Ecore_Win32_Window *)ee->prop.window,
+                                    ee->prop.iconified);
 }
 
 static void
@@ -910,39 +841,228 @@ _ecore_evas_win32_borderless_set(Ecore_Evas *ee, int on)
    if (((ee->prop.borderless) && (on)) ||
        ((!ee->prop.borderless) && (!on))) return;
    ee->prop.borderless = on;
-   ecore_win32_window_borderless_set(ee->engine.win32.window, ee->prop.borderless);
+   ecore_win32_window_borderless_set((struct _Ecore_Win32_Window *)ee->prop.window,
+                                     ee->prop.borderless);
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+   if (!strcmp(ee->driver, "software_gdi"))
+     {
+        Evas_Engine_Info_Software_Gdi *einfo;
+
+        einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+            einfo->info.borderless = ee->prop.borderless;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+             if (ee->prop.borderless)
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
+     }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
+}
+
+static void
+_ecore_evas_win32_override_set(Ecore_Evas *ee, int on)
+{
+   struct _Ecore_Win32_Window *window;
+
+   INF("ecore evas override set");
+
+   window = (struct _Ecore_Win32_Window *)ee->prop.window;
+
+   if (ee->prop.override == on) return;
+   if (ee->should_be_visible) ecore_win32_window_hide(window);
+   /* FIXME: use borderless_set for now */
+   ecore_win32_window_borderless_set(window, on);
+   if (ee->should_be_visible) ecore_win32_window_show(window);
+   if (ee->prop.focused) ecore_win32_window_focus(window);
+   ee->prop.override = on;
 }
 
 static void
 _ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on)
 {
-   if ((ee->prop.fullscreen && on) ||
-      (!ee->prop.fullscreen && !on)) return;
+   struct _Ecore_Win32_Window *window;
+
+   INF("ecore evas fullscreen set");
+
+   if ((ee->engine.win32.state.fullscreen && on) ||
+      (!ee->engine.win32.state.fullscreen && !on))
+     return;
 
    ee->engine.win32.state.fullscreen = on;
-   ecore_win32_window_fullscreen_set(ee->engine.win32.window, ee->prop.borderless);
-   /* FIXME: what to do with that code ?? */
-/*    if (ee->should_be_visible) */
-/*      ecore_x_netwm_state_request_send(ee->engine.x.win, ee->engine.x.win_root, */
-/*                                   ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on); */
-/*    else */
-/*      _ecore_evas_win32_state_update(ee); */
+   ee->prop.fullscreen = on;
+
+   window = (struct _Ecore_Win32_Window *)ee->prop.window;
+
+   if (on != 0)
+   {
+      ecore_win32_window_fullscreen_set(window, on);
+   }
+   else
+   {
+      ecore_win32_window_fullscreen_set(window, on);
+   }
+
+   /* Nothing to be done for the GDI backend at the evas level */
+
+#ifdef BUILD_ECORE_EVAS_SOFTWRE_DDRAW
+   if (strcmp(ee->driver, "software_ddraw") == 0)
+     {
+        Evas_Engine_Info_Software_DDraw *einfo;
+
+        einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ecore_evas_get(ee));
+        if (einfo)
+          {
+             einfo->info.fullscreen = !!on;
+/*           einfo->info.layered = window->shape.layered; */
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+          }
+     }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
+
+#ifdef BUILD_ECORE_EVAS_DIRECT3D
+   if (strcmp(ee->driver, "direct3d") == 0)
+     {
+        Evas_Engine_Info_Direct3D *einfo;
+
+        einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ecore_evas_get(ee));
+        if (einfo)
+          {
+             einfo->info.fullscreen = !!on;
+             einfo->info.layered = window->shape.layered;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+          }
+     }
+#endif /* BUILD_ECORE_EVAS_DIRECT3D */
 }
+static void
+_ecore_evas_win32_alpha_set(Ecore_Evas *ee, int alpha)
+{
+   alpha = !!alpha;
+   if ((ee->alpha == alpha)) return;
 
-#endif /* BUILD_ECORE_EVAS_WIN32 */
+   if (!strcmp(ee->driver, "software_gdi"))
+     {
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+        Evas_Engine_Info_Software_Gdi *einfo;
+
+        einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+
+        ee->shaped = 0;
+        ee->alpha = alpha;
+        /* ecore_win32_window_free(ee->prop.window); */
+        /* ecore_event_window_unregister(ee->prop.window); */
+        /* if (ee->alpha) */
+        /*   { */
+        /*      if (ee->prop.override) */
+        /*        ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h); */
+        /*      else */
+        /*        ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h); */
+        /*      if (!ee->engine.x.mask) */
+        /*        ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1); */
+        /*   } */
+        /* else */
+        /*   { */
+        /*      if (ee->prop.override) */
+        /*        ee->prop.window = ecore_win32_window_override_new(ee->engine.win32.win_root, */
+        /*                                                          ee->req.x, */
+        /*                                                          ee->req.y, */
+        /*                                                          ee->req.w, */
+        /*                                                          ee->req.h); */
+        /*      else */
+        /*        ee->prop.window = ecore_win32_window_new(ee->engine.win32.win_root, */
+        /*                                                 ee->req.x, */
+        /*                                                 ee->req.y, */
+        /*                                                 ee->req.w, */
+        /*                                                 ee->req.h); */
+        /*      if (ee->engine.win32.mask) ecore_x_pixmap_free(ee->engine.x.mask); */
+        /*      ee->engine.win32.mask = 0; */
+        /*      ecore_win32_window_shape_input_mask_set(ee->prop.window, 0); */
+        /*   } */
+
+        /* einfo->info.destination_alpha = alpha; */
+        einfo->info.region = alpha;
+
+//        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+//        ee->engine.x.mask = 0;
+        /* einfo->info.mask = ee->engine.win32.mask; */
+        /* einfo->info.drawable = ee->prop.window; */
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+        /* ecore_win32_window_shape_mask_set(ee->prop.window, 0); */
+        /* ecore_event_window_register(ee->prop.window, ee, ee->evas, */
+        /*                             (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process, */
+        /*                             (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process, */
+        /*                             (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, */
+        /*                             (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process); */
+        if (ee->prop.borderless)
+          ecore_win32_window_borderless_set((struct _Ecore_Win32_Window *)ee->prop.window, ee->prop.borderless);
+        if (ee->visible) ecore_win32_window_show((struct _Ecore_Win32_Window *)ee->prop.window);
+        if (ee->prop.focused) ecore_win32_window_focus((struct _Ecore_Win32_Window *)ee->prop.window);
+        if (ee->prop.title)
+          {
+             ecore_win32_window_title_set((struct _Ecore_Win32_Window *)ee->prop.window, ee->prop.title);
+             /* ecore_win32_name_set(ee->prop.window, ee->prop.title); */
+          }
+        ecore_win32_window_type_set((struct _Ecore_Win32_Window *)ee->prop.window, ECORE_WIN32_WINDOW_TYPE_NORMAL);
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
+     }
+}
 
-static void *
-_ecore_evas_win32_window_get(Ecore_Evas *ee)
+static void
+_ecore_evas_win32_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi)
 {
-#ifdef BUILD_ECORE_EVAS_WIN32
-   return ee->engine.win32.window;
-#else
-   return NULL;
-#endif /* BUILD_ECORE_EVAS_WIN32 */
+   HDC dc;
+
+   dc = GetDC(NULL);
+   if (!dc)
+     {
+        if (xdpi) *xdpi = 0;
+        if (ydpi) *ydpi = 0;
+        return;
+     }
+
+   if (xdpi) *xdpi = GetDeviceCaps(dc, LOGPIXELSX);
+   if (ydpi) *ydpi = GetDeviceCaps(dc, LOGPIXELSY);
+
+   /*
+    * Alternative (to test)
+    int width_mm;
+    int height_mm;
+    int width_px;
+    int height_px;
+
+    width_mm = GetDeviceCaps(dc, HORZSIZE);
+    height_mm = GetDeviceCaps(dc, VERTSIZE);
+    width_px = GetDeviceCaps(dc, HORZRES);
+    height_px = GetDeviceCaps(dc, VERTRES);
+
+    *xdpi = (width_px * 254) / (width_mm * 10);
+    *ydpi = (height_px * 254) / (height_mm * 10);
+
+    code with LOGPIXELS gives 96x96
+    code with the computation gives 101x77
+
+    */
+
+   ReleaseDC(NULL, dc);
 }
 
-#ifdef BUILD_ECORE_EVAS_WIN32
-static const Ecore_Evas_Engine_Func _ecore_win32_engine_func =
+static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
 {
    _ecore_evas_win32_free,
      NULL,
@@ -964,7 +1084,7 @@ static const Ecore_Evas_Engine_Func _ecore_win32_engine_func =
      _ecore_evas_win32_resize,
      _ecore_evas_win32_move_resize,
      _ecore_evas_win32_rotation_set,
-     NULL, /* _ecore_evas_x_shaped_set */
+     _ecore_evas_win32_shaped_set,
      _ecore_evas_win32_show,
      _ecore_evas_win32_hide,
      _ecore_evas_win32_raise,
@@ -981,25 +1101,80 @@ static const Ecore_Evas_Engine_Func _ecore_win32_engine_func =
      _ecore_evas_win32_focus_set,
      _ecore_evas_win32_iconified_set,
      _ecore_evas_win32_borderless_set,
-     NULL, /* _ecore_evas_x_override_set */
+     _ecore_evas_win32_override_set,
      NULL,
      _ecore_evas_win32_fullscreen_set,
      NULL, /* _ecore_evas_x_avoid_damage_set */
      NULL, /* _ecore_evas_x_withdrawn_set */
      NULL, /* _ecore_evas_x_sticky_set */
      NULL, /* _ecore_evas_x_ignore_events_set */
-     NULL, /* _ecore_evas_x_alpha_set */
-     _ecore_evas_win32_window_get
+     _ecore_evas_win32_alpha_set,
+     NULL, //transparent
+     NULL, // profiles_set
+
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+     NULL,
+
+     NULL, // render
+     NULL, // screen_geometry_get
+     _ecore_evas_win32_screen_dpi_get
 };
 
 #endif /* BUILD_ECORE_EVAS_WIN32 */
 
 /* API */
 
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
 static int
-_ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
+_ecore_evas_engine_software_gdi_init(Ecore_Evas *ee)
 {
+   Evas_Engine_Info_Software_Gdi *einfo;
+   const char                    *driver;
+   int                            rmethod;
+
+   driver = "software_gdi";
+
+   rmethod = evas_render_method_lookup(driver);
+   if (!rmethod)
+     return 0;
+
+   ee->driver = driver;
+   evas_output_method_set(ee->evas, rmethod);
+
+   einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+        /* FIXME: REDRAW_DEBUG missing for now */
+        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
+        einfo->info.depth = ecore_win32_screen_depth_get();
+        einfo->info.rotation = 0;
+        einfo->info.borderless = 0;
+        einfo->info.fullscreen = 0;
+        einfo->info.region = 0;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             return 0;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        return 0;
+     }
+
+   return 1;
+}
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
+
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
+static int
+_ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
+{
    Evas_Engine_Info_Software_DDraw *einfo;
    const char                      *driver;
    int                              rmethod;
@@ -1017,22 +1192,29 @@ _ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
    if (einfo)
      {
         /* FIXME: REDRAW_DEBUG missing for now */
-        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
+        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
         einfo->info.depth = ecore_win32_screen_depth_get();
         einfo->info.rotation = 0;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             return 0;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        return 0;
      }
 
    return 1;
-#else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
 }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
 
+#ifdef BUILD_ECORE_EVAS_DIRECT3D
 static int
 _ecore_evas_engine_direct3d_init(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_DIRECT3D
    Evas_Engine_Info_Direct3D *einfo;
    const char                *driver;
    int                        rmethod;
@@ -1050,22 +1232,29 @@ _ecore_evas_engine_direct3d_init(Ecore_Evas *ee)
    if (einfo)
      {
         /* FIXME: REDRAW_DEBUG missing for now */
-        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
+        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
         einfo->info.depth = ecore_win32_screen_depth_get();
         einfo->info.rotation = 0;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             return 0;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        return 0;
      }
 
    return 1;
-#else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
 }
+#endif /* BUILD_ECORE_EVAS_DIRECT3D */
 
+#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
 static int
 _ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
    Evas_Engine_Info_GL_Glew *einfo;
    const char               *driver;
    int                       rmethod;
@@ -1083,21 +1272,28 @@ _ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
    if (einfo)
      {
         /* FIXME: REDRAW_DEBUG missing for now */
-        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
+        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
         einfo->info.depth = ecore_win32_screen_depth_get();
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             return 0;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        return 0;
      }
 
    return 1;
-#else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_GLEW */
 }
+#endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
 
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
 static int
 _ecore_evas_engine_software_16_ddraw_init(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW
    Evas_Engine_Info_Software_DDraw *einfo;
    const char                      *driver;
    int                              rmethod;
@@ -1118,16 +1314,26 @@ _ecore_evas_engine_software_16_ddraw_init(Ecore_Evas *ee)
    if (einfo)
      {
         /* FIXME: REDRAW_DEBUG missing for now */
-        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
+        einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
         einfo->info.depth = ecore_win32_screen_depth_get();
         einfo->info.rotation = 0;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             return 0;
+          }
      }
-#else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW */
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        return 0;
+     }
+
+   return 1;
 }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
 
+#ifdef BUILD_ECORE_EVAS_WIN32
 static Ecore_Evas *
 _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
                                Ecore_Win32_Window *parent,
@@ -1136,7 +1342,6 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
                                int                 width,
                                int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_WIN32
    Ecore_Evas *ee;
 
    if (!ecore_win32_init())
@@ -1158,6 +1363,10 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
    ee->y = y;
    ee->w = width;
    ee->h = height;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 32767;
    ee->prop.max.h = 32767;
@@ -1165,6 +1374,7 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
    ee->prop.request_pos = 0;
    ee->prop.sticky = 0;
    /* FIXME: sticky to add */
+   ee->prop.window = 0;
 
    /* init evas here */
    ee->evas = evas_new();
@@ -1173,8 +1383,8 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
    evas_output_viewport_set(ee->evas, 0, 0, width, height);
 
    ee->engine.win32.parent = parent;
-   ee->engine.win32.window = ecore_win32_window_new(parent, x, y, width, height);
-   if (!ee->engine.win32.window)
+   ee->prop.window = (Ecore_Window)ecore_win32_window_new(parent, x, y, width, height);
+   if (!ee->prop.window)
      {
         _ecore_evas_win32_shutdown();
         free(ee);
@@ -1188,30 +1398,52 @@ _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
         return NULL;
      }
 
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
-
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
-   ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_win32_winid_str_get(ee->engine.win32.window), ee);
+   ee->engine.func->fn_render = _ecore_evas_win32_render;
+   _ecore_evas_register(ee);
+   ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
 
    return ee;
+}
+
+#endif /* BUILD_ECORE_EVAS_WIN32 */
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
+
+EAPI Ecore_Evas *
+ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
+                            int                 x,
+                            int                 y,
+                            int                 width,
+                            int                 height)
+{
+   return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_gdi_init,
+                                         parent,
+                                         x,
+                                         y,
+                                         width,
+                                         height);
+}
+
 #else
+
+EAPI Ecore_Evas *
+ecore_evas_software_gdi_new(Ecore_Win32_Window *parent __UNUSED__,
+                            int                 x __UNUSED__,
+                            int                 y __UNUSED__,
+                            int                 width __UNUSED__,
+                            int                 height __UNUSED__)
+{
    return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_WIN32 */
 }
 
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_GDI */
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
+
 EAPI Ecore_Evas *
 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
                               int                 x,
@@ -1219,23 +1451,31 @@ ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
                               int                 width,
                               int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_ddraw_init,
                                          parent,
                                          x,
                                          y,
                                          width,
                                          height);
+}
+
 #else
+
+EAPI Ecore_Evas *
+ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
+                              int                 x __UNUSED__,
+                              int                 y __UNUSED__,
+                              int                 width __UNUSED__,
+                              int                 height __UNUSED__)
+{
    return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
 }
 
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
+
+
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
+
 EAPI Ecore_Evas *
 ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
                                  int                 x,
@@ -1243,23 +1483,31 @@ ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
                                  int                 width,
                                  int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW
    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_16_ddraw_init,
                                          parent,
                                          x,
                                          y,
                                          width,
                                          height);
+}
+
 #else
+
+EAPI Ecore_Evas *
+ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
+                                 int                 x __UNUSED__,
+                                 int                 y __UNUSED__,
+                                 int                 width __UNUSED__,
+                                 int                 height __UNUSED__)
+{
    return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW */
 }
 
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
+
+
+#ifdef BUILD_ECORE_EVAS_DIRECT3D
+
 EAPI Ecore_Evas *
 ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
                         int                 x,
@@ -1267,23 +1515,31 @@ ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
                         int                 width,
                         int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_DIRECT3D
    return _ecore_evas_win32_new_internal(_ecore_evas_engine_direct3d_init,
                                          parent,
                                          x,
                                          y,
                                          width,
                                          height);
+}
+
 #else
+
+EAPI Ecore_Evas *
+ecore_evas_direct3d_new(Ecore_Win32_Window *parent __UNUSED__,
+                        int                 x __UNUSED__,
+                        int                 y __UNUSED__,
+                        int                 width __UNUSED__,
+                        int                 height __UNUSED__)
+{
    return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
 }
 
+#endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
+
+
+#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
+
 EAPI Ecore_Evas *
 ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
                        int                 x,
@@ -1291,30 +1547,43 @@ ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
                        int                 width,
                        int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
    return _ecore_evas_win32_new_internal(_ecore_evas_engine_opengl_glew_init,
                                          parent,
                                          x,
                                          y,
                                          width,
                                          height);
+}
+
 #else
+
+EAPI Ecore_Evas *
+ecore_evas_gl_glew_new(Ecore_Win32_Window *parent __UNUSED__,
+                       int                 x __UNUSED__,
+                       int                 y __UNUSED__,
+                       int                 width __UNUSED__,
+                       int                 height __UNUSED__)
+{
    return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
 }
 
+#endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
+
+
+#ifdef BUILD_ECORE_EVAS_WIN32
+
 EAPI Ecore_Win32_Window *
-ecore_evas_win32_window_get(Ecore_Evas *ee)
+ecore_evas_win32_window_get(const Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_WIN32
-   return (Ecore_Win32_Window *) _ecore_evas_win32_window_get(ee);
+   return (Ecore_Win32_Window *) ecore_evas_window_get(ee);
+}
+
 #else
+
+EAPI Ecore_Win32_Window *
+ecore_evas_win32_window_get(const Ecore_Evas *ee __UNUSED__)
+{
    return NULL;
-   ee = NULL;
-#endif /* BUILD_ECORE_EVAS_WIN32 */
 }
+
+#endif /* BUILD_ECORE_EVAS_WIN32 */
index 29253e4..fe0054a 100644 (file)
@@ -1,88 +1,69 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
 #include <stdlib.h> /* for NULL */
 
-#include "Ecore.h"
+#include <Ecore.h>
 #include "ecore_private.h"
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 # undef WIN32_LEAN_AND_MEAN
-# include "Ecore_WinCE.h"
-# include "ecore_wince_private.h"
+# include <Ecore_WinCE.h>
+# include <ecore_wince_private.h>
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
 
 #include "ecore_evas_private.h"
 #include "Ecore_Evas.h"
 
-
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
 
-#define ECORE_EVAS_EVENT_COUNT 12
+#define ECORE_EVAS_EVENT_COUNT 9
 
 static int _ecore_evas_init_count = 0;
-static int _ecore_evas_fps_debug  = 0;
 
 static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
-static Ecore_Idle_Enterer  *ecore_evas_idle_enterer = NULL;
-static Ecore_Evas          *ecore_evases = NULL;
-static Evas_Hash           *ecore_evases_hash = NULL;
-
-static int _ecore_evas_wince_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event);
-
-static int _ecore_evas_wince_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event);
-
-static int _ecore_evas_wince_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
 
-static int _ecore_evas_wince_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
+static Eina_Bool _ecore_evas_wince_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
 
 /* Private functions */
 
-static void
+static int
 _ecore_evas_wince_render(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_BUFFER
-   Evas_List *ll;
-#endif
+   int rend = 0;
+   Eina_List *updates = NULL;
+   Eina_List *ll;
+   Ecore_Evas *ee2;
 
-#ifdef BUILD_ECORE_EVAS_BUFFER
-   for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
      {
-       Ecore_Evas *ee2;
-
-       ee2 = ll->data;
-       if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
-       _ecore_evas_buffer_render(ee2);
-       if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
      }
-#endif
+
    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
    if (ee->prop.avoid_damage)
      {
-        Evas_List *updates;
-
         updates = evas_render_updates(ee->evas);
         if (updates) evas_render_updates_free(updates);
      }
@@ -92,48 +73,20 @@ _ecore_evas_wince_render(Ecore_Evas *ee)
      {
         if (ee->shaped)
           {
-             Evas_List *updates;
-
              updates = evas_render_updates(ee->evas);
              if (updates) evas_render_updates_free(updates);
           }
         else
           {
-             Evas_List *updates;
-
              updates = evas_render_updates(ee->evas);
              if (updates) evas_render_updates_free(updates);
           }
      }
    else
      evas_norender(ee->evas);
+   if (updates) rend = 1;
    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
-}
-
-static int
-_ecore_evas_wince_idle_enter(void *data __UNUSED__)
-{
-   Ecore_List2 *l;
-   double       t1 = 0.0;
-   double       t2 = 0.0;
-
-   if (_ecore_evas_fps_debug)
-     {
-       t1 = ecore_time_get();
-     }
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-
-       ee = (Ecore_Evas *)l;
-       _ecore_evas_wince_render(ee);
-     }
-   if (_ecore_evas_fps_debug)
-     {
-       t2 = ecore_time_get();
-       _ecore_evas_fps_debug_rendertime_add(t2 - t1);
-     }
-   return 1;
+   return rend;
 }
 
 static int
@@ -143,26 +96,17 @@ _ecore_evas_wince_init(void)
    if (_ecore_evas_init_count > 1)
      return _ecore_evas_init_count;
 
-   if (getenv("ECORE_EVAS_FPS_DEBUG"))
-     _ecore_evas_fps_debug = 1;
-
-   ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_wince_idle_enter, NULL);
-
-   ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_WINCE_EVENT_KEY_DOWN, _ecore_evas_wince_event_key_down, NULL);
-   ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_WINCE_EVENT_KEY_UP, _ecore_evas_wince_event_key_up, NULL);
-   ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_wince_event_mouse_button_down, NULL);
-   ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_BUTTON_UP, _ecore_evas_wince_event_mouse_button_up, NULL);
-   ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_MOVE, _ecore_evas_wince_event_mouse_move, NULL);
-   ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_IN, _ecore_evas_wince_event_mouse_in, NULL);
-   ecore_evas_event_handlers[6]  = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_OUT, _ecore_evas_wince_event_mouse_out, NULL);
-   ecore_evas_event_handlers[7]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, _ecore_evas_wince_event_window_damage, NULL);
-   ecore_evas_event_handlers[8]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, _ecore_evas_wince_event_window_destroy, NULL);
-   ecore_evas_event_handlers[9]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_SHOW, _ecore_evas_wince_event_window_show, NULL);
-   ecore_evas_event_handlers[10]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_HIDE, _ecore_evas_wince_event_window_hide, NULL);
-   ecore_evas_event_handlers[11]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_wince_event_window_delete_request, NULL);
-
-   if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
-
+   ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_IN, _ecore_evas_wince_event_mouse_in, NULL);
+   ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_OUT, _ecore_evas_wince_event_mouse_out, NULL);
+   ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_IN, _ecore_evas_wince_event_window_focus_in, NULL);
+   ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_wince_event_window_focus_out, NULL);
+   ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, _ecore_evas_wince_event_window_damage, NULL);
+   ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, _ecore_evas_wince_event_window_destroy, NULL);
+   ecore_evas_event_handlers[6]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_SHOW, _ecore_evas_wince_event_window_show, NULL);
+   ecore_evas_event_handlers[7]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_HIDE, _ecore_evas_wince_event_window_hide, NULL);
+   ecore_evas_event_handlers[8]  = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_wince_event_window_delete_request, NULL);
+
+   ecore_event_evas_init();
    return _ecore_evas_init_count;
 }
 
@@ -172,14 +116,11 @@ _ecore_evas_wince_shutdown(void)
    _ecore_evas_init_count--;
    if (_ecore_evas_init_count == 0)
      {
-       int i;
-
-       while (ecore_evases) _ecore_evas_free(ecore_evases);
-       for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
-         ecore_event_handler_del(ecore_evas_event_handlers[i]);
-       ecore_idle_enterer_del(ecore_evas_idle_enterer);
-       ecore_evas_idle_enterer = NULL;
-       if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
+        int i;
+
+        for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
+          ecore_event_handler_del(ecore_evas_event_handlers[i]);
+        ecore_event_evas_shutdown();
      }
 
    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
@@ -187,221 +128,98 @@ _ecore_evas_wince_shutdown(void)
    return _ecore_evas_init_count;
 }
 
-static char *
-_ecore_evas_wince_winid_str_get(Ecore_WinCE_Window *window)
-{
-   static char  id[9];
-   const char  *vals = "qWeRtYuIoP5-$&<~";
-   unsigned int val;
-
-   val = (unsigned int)window;
-   id[0] = vals[(val >> 28) & 0xf];
-   id[1] = vals[(val >> 24) & 0xf];
-   id[2] = vals[(val >> 20) & 0xf];
-   id[3] = vals[(val >> 16) & 0xf];
-   id[4] = vals[(val >> 12) & 0xf];
-   id[5] = vals[(val >>  8) & 0xf];
-   id[6] = vals[(val >>  4) & 0xf];
-   id[7] = vals[(val      ) & 0xf];
-   id[8] = 0;
-
-   return id;
-}
-
-static Ecore_Evas *
-_ecore_evas_wince_match(Ecore_WinCE_Window *window)
-{
-   Ecore_Evas *ee;
-
-   ee = evas_hash_find(ecore_evases_hash, _ecore_evas_wince_winid_str_get(window));
-
-   return ee;
-}
-
-static void
-_ecore_evas_wince_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
-{
-   ee->mouse.x = x;
-   ee->mouse.y = y;
-   if (ee->prop.cursor.object)
-     {
-       evas_object_show(ee->prop.cursor.object);
-       if (ee->rotation == 0)
-         evas_object_move(ee->prop.cursor.object,
-                          x - ee->prop.cursor.hot.x,
-                          y - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 90)
-         evas_object_move(ee->prop.cursor.object,
-                          ee->h - y - 1 - ee->prop.cursor.hot.x,
-                          x - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 180)
-         evas_object_move(ee->prop.cursor.object,
-                          ee->w - x - 1 - ee->prop.cursor.hot.x,
-                          ee->h - y - 1 - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 270)
-         evas_object_move(ee->prop.cursor.object,
-                          y - ee->prop.cursor.hot.x,
-                          ee->w - x - 1 - ee->prop.cursor.hot.y);
-     }
-   if (ee->rotation == 0)
-     evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
-   else if (ee->rotation == 90)
-     evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
-   else if (ee->rotation == 180)
-     evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
-   else if (ee->rotation == 270)
-     evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
-}
-
-static int
-_ecore_evas_wince_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_wince_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                 *ee;
-   Ecore_WinCE_Event_Key_Down *e;
-
-   e = event;
-   ee = _ecore_evas_wince_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   evas_event_feed_key_down(ee->evas, e->keyname, e->keysymbol, e->keycompose, NULL, e->time, NULL);
+   Ecore_WinCE_Event_Mouse_In *e;
 
-   return 1;
-}
-
-static int
-_ecore_evas_wince_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas               *ee;
-   Ecore_WinCE_Event_Key_Up *e;
+   INF("mouse in");
 
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   evas_event_feed_key_up(ee->evas, e->keyname, e->keysymbol, e->keycompose, NULL, e->time, NULL);
+   if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
 
-   return 1;
-}
-
-static int
-_ecore_evas_wince_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas                          *ee;
-   Ecore_WinCE_Event_Mouse_Button_Down *e;
-   Evas_Button_Flags                    flags = EVAS_BUTTON_NONE;
-
-   e = event;
-   ee = _ecore_evas_wince_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
+   if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
    /* FIXME to do */
 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   printf ("feed evas event\n");
-   evas_event_feed_mouse_down(ee->evas, e->button, flags, e->time, NULL);
-
-   printf (" * ee event button down %f %d %d\n", e->time, e->x, e->y);
+   evas_event_feed_mouse_in(ee->evas, e->time, NULL);
+   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
 
    return 1;
 }
 
-static int
-_ecore_evas_wince_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_wince_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   Ecore_Evas                        *ee;
-   Ecore_WinCE_Event_Mouse_Button_Up *e;
-   Evas_Button_Flags                  flags = EVAS_BUTTON_NONE;
+   Ecore_Evas                  *ee;
+   Ecore_WinCE_Event_Mouse_Out *e;
+
+   INF("mouse out");
 
-   printf (" * ee event button up 0 \n");
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
+   if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
+
    /* FIXME to do */
 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
+   _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
 
-   printf (" * ee event button up\n");
+   evas_event_feed_mouse_out(ee->evas, e->time, NULL);
+   if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
+   if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
 
    return 1;
 }
 
-static int
-_ecore_evas_wince_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_wince_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   Ecore_Evas                   *ee;
-   Ecore_WinCE_Event_Mouse_Move *e;
+   Ecore_Evas *ee;
+   Ecore_WinCE_Event_Window_Focus_In *e;
 
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   _ecore_evas_wince_mouse_move_process(ee, e->x, e->y, e->time);
+   ee = ecore_event_window_match(e->window);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if (e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
 
-   return 1;
+   ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
+   if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
-_ecore_evas_wince_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_wince_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   Ecore_Evas                 *ee;
-   Ecore_WinCE_Event_Mouse_In *e;
-
-   e = event;
-   ee = _ecore_evas_wince_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
-
-   if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   evas_event_feed_mouse_in(ee->evas, e->time, NULL);
-   _ecore_evas_wince_mouse_move_process(ee, e->x, e->y, e->time);
-   printf (" * ee event mouse in\n");
-
-   return 1;
-}
-
-static int
-_ecore_evas_wince_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas                  *ee;
-   Ecore_WinCE_Event_Mouse_Out *e;
+   Ecore_Evas *ee;
+   Ecore_WinCE_Event_Window_Focus_Out *e;
 
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
-
-   /* FIXME to do */
-/*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
-   _ecore_evas_wince_mouse_move_process(ee, e->x, e->y, e->time);
+   ee = ecore_event_window_match(e->window);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   if (e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
 
-   evas_event_feed_mouse_out(ee->evas, e->time, NULL);
-   if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
-   if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
-   printf (" * ee event mouse out\n");
-
-   return 1;
+   evas_focus_out(ee->evas);
+   ee->prop.focused = 0;
+   if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_wince_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                      *ee;
    Ecore_WinCE_Event_Window_Damage *e;
 
+   INF("window damage");
+
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
+   if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
 
    if (ee->prop.avoid_damage)
      {
@@ -409,7 +227,6 @@ _ecore_evas_wince_event_window_damage(void *data __UNUSED__, int type __UNUSED__
      }
    else
      {
-       printf (" * ee window event damage\n");
         if (ee->rotation == 0)
           evas_damage_rectangle_add(ee->evas,
                                     e->x,
@@ -439,34 +256,36 @@ _ecore_evas_wince_event_window_damage(void *data __UNUSED__, int type __UNUSED__
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_wince_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                       *ee;
    Ecore_WinCE_Event_Window_Destroy *e;
 
+   INF("window destroy");
+
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
+   if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
    if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
    ecore_evas_free(ee);
 
-   printf (" * ee event destroy\n");
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_wince_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                    *ee;
    Ecore_WinCE_Event_Window_Show *e;
 
-   printf (" * ee window event show\n");
+   INF("window show");
+
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
+   if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
    if (ee->visible) return 0; /* dont pass it on */
    ee->visible = 1;
    if (ee->func.fn_show) ee->func.fn_show(ee);
@@ -474,16 +293,18 @@ _ecore_evas_wince_event_window_show(void *data __UNUSED__, int type __UNUSED__,
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_wince_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                    *ee;
    Ecore_WinCE_Event_Window_Hide *e;
 
+   INF("window hide");
+
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
+   if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
    if (!ee->visible) return 0; /* dont pass it on */
    ee->visible = 0;
    if (ee->func.fn_hide) ee->func.fn_hide(ee);
@@ -491,19 +312,20 @@ _ecore_evas_wince_event_window_hide(void *data __UNUSED__, int type __UNUSED__,
    return 1;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_wince_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas                              *ee;
    Ecore_WinCE_Event_Window_Delete_Request *e;
 
+   INF("window delete request");
+
    e = event;
-   ee = _ecore_evas_wince_match(e->window);
+   ee = ecore_event_window_match((Ecore_Window)e->window);
    if (!ee) return 1; /* pass on event */
-   if (e->window != ee->engine.wince.window) return 1;
+   if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
 
-   printf (" * ee event delete\n");
    return 1;
 }
 
@@ -513,95 +335,108 @@ _ecore_evas_wince_event_window_delete_request(void *data __UNUSED__, int type __
 static void
 _ecore_evas_wince_free(Ecore_Evas *ee)
 {
-   ecore_wince_window_del(ee->engine.wince.window);
-   ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_wince_winid_str_get(ee->engine.wince.window), ee);
-   ecore_evases = _ecore_list2_remove(ecore_evases, ee);
+   INF("ecore evas free");
+
+   ecore_wince_window_free((Ecore_WinCE_Window *)ee->prop.window);
+   ecore_event_window_unregister(ee->prop.window);
    _ecore_evas_wince_shutdown();
    ecore_wince_shutdown();
 }
 
 static void
 _ecore_evas_wince_callback_delete_request_set(Ecore_Evas *ee,
-                                              void (*func) (Ecore_Evas *ee))
+                                              Ecore_Evas_Event_Cb func)
 {
    ee->func.fn_delete_request = func;
 }
 
-/* static void */
-/* _ecore_evas_wince_move(Ecore_Evas *ee, int x, int y) */
-/* { */
-/*    if ((x != ee->x) || (y != ee->y)) */
-/*      { */
-/*         ee->x = x; */
-/*         ee->y = y; */
-/*         ecore_wince_window_move(ee->engine.wince.window, x, y); */
-/*         if (ee->func.fn_move) ee->func.fn_move(ee); */
-/*      } */
-/* } */
+static void
+_ecore_evas_wince_move(Ecore_Evas *ee, int x, int y)
+{
+  INF("ecore evas move (%dx%d)", x, y);
+   ee->req.x = x;
+   ee->req.y = y;
 
-/* static void */
-/* _ecore_evas_wince_resize(Ecore_Evas *ee, int width, int height) */
-/* { */
-/*   printf (" * _ecore_evas_wince_resize %d %d\n", width, height); */
-/*    if ((ee->w != width) || (ee->h != height)) */
-/*      { */
-/*         ee->w = width; */
-/*         ee->h = height; */
-/*         ecore_wince_window_resize(ee->engine.wince.window, width, height); */
-/*         if ((ee->rotation == 90) || (ee->rotation == 270)) */
-/*           { */
-/*              evas_output_size_set(ee->evas, ee->h, ee->w); */
-/*              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); */
-/*           } */
-/*         else */
-/*           { */
-/*              evas_output_size_set(ee->evas, ee->w, ee->h); */
-/*              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); */
-/*           } */
-/*         /\* FIXME: damage and shape *\/ */
-
-/*         if (ee->func.fn_resize) ee->func.fn_resize(ee); */
-/*      } */
-/* } */
+   if ((x != ee->x) || (y != ee->y))
+     {
+        ee->x = x;
+        ee->y = y;
+        ecore_wince_window_move((Ecore_WinCE_Window *)ee->prop.window, x, y);
+        if (ee->func.fn_move) ee->func.fn_move(ee);
+     }
+}
 
-/* static void */
-/* _ecore_evas_wince_move_resize(Ecore_Evas *ee, int x, int y, int width, int height) */
-/* { */
-/*   printf (" * _ecore_evas_wince_resize\n"); */
-/*    if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y)) */
-/*      { */
-/*         int change_size = 0; */
-/*         int change_pos = 0; */
-
-/*         if ((ee->w != width) || (ee->h != height)) change_size = 1; */
-/*         if ((x != ee->x) || (y != ee->y)) change_pos = 1; */
-
-/*         ee->x = x; */
-/*         ee->y = y; */
-/*         ee->w = width; */
-/*         ee->h = height; */
-/*         ecore_wince_window_move_resize(ee->engine.wince.window, x, y, width, height); */
-/*         if ((ee->rotation == 90) || (ee->rotation == 270)) */
-/*           { */
-/*              evas_output_size_set(ee->evas, ee->h, ee->w); */
-/*              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); */
-/*           } */
-/*         else */
-/*           { */
-/*              evas_output_size_set(ee->evas, ee->w, ee->h); */
-/*              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); */
-/*           } */
-/*         /\* FIXME: damage and shape *\/ */
-/*         if (change_pos) */
-/*           { */
-/*              if (ee->func.fn_move) ee->func.fn_move(ee); */
-/*           } */
-/*         if (change_size) */
-/*           { */
-/*              if (ee->func.fn_resize) ee->func.fn_resize(ee); */
-/*           } */
-/*      } */
-/* } */
+static void
+_ecore_evas_wince_resize(Ecore_Evas *ee, int width, int height)
+{
+   INF("ecore evas resize (%dx%d)", width, height);
+   ee->req.w = width;
+   ee->req.h = height;
+
+   if ((ee->w != width) || (ee->h != height))
+     {
+        ee->w = width;
+        ee->h = height;
+        ecore_wince_window_resize((Ecore_WinCE_Window *)ee->prop.window, width, height);
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, ee->h, ee->w);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+          }
+        else
+          {
+             evas_output_size_set(ee->evas, ee->w, ee->h);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+          }
+        /* FIXME: damage and shape */
+
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+     }
+}
+
+static void
+_ecore_evas_wince_move_resize(Ecore_Evas *ee, int x, int y, int width, int height)
+{
+   INF("ecore evas resize (%dx%d %dx%d)", x, y, width, height);
+   ee->req.x = x;
+   ee->req.y = y;
+   ee->req.w = width;
+   ee->req.h = height;
+
+   if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y))
+     {
+        int change_size = 0;
+        int change_pos = 0;
+
+        if ((ee->w != width) || (ee->h != height)) change_size = 1;
+        if ((x != ee->x) || (y != ee->y)) change_pos = 1;
+
+        ee->x = x;
+        ee->y = y;
+        ee->w = width;
+        ee->h = height;
+        ecore_wince_window_move_resize((Ecore_WinCE_Window *)ee->prop.window, x, y, width, height);
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, ee->h, ee->w);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+          }
+        else
+          {
+             evas_output_size_set(ee->evas, ee->w, ee->h);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+          }
+        /* FIXME: damage and shape */
+        if (change_pos)
+          {
+             if (ee->func.fn_move) ee->func.fn_move(ee);
+          }
+        if (change_size)
+          {
+             if (ee->func.fn_resize) ee->func.fn_resize(ee);
+          }
+     }
+}
 
 /* static void */
 /* _ecore_evas_wince_rotation_set(Ecore_Evas *ee, int rotation) */
@@ -613,84 +448,87 @@ _ecore_evas_wince_callback_delete_request_set(Ecore_Evas *ee,
 /*    if (rot_dif < 0) rot_dif = -rot_dif; */
 /*    if (!strcmp(ee->driver, "software_ddraw")) */
 /*      { */
-/*     Evas_Engine_Info_Software_16_WinCE *einfo; */
-
-/*     einfo = (Evas_Engine_Info_Software_16_WinCE *)evas_engine_info_get(ee->evas); */
-/*     if (!einfo) return; */
-/*     if (rot_dif != 180) */
-/*       { */
-/*          int minw, minh, maxw, maxh, basew, baseh, stepw, steph; */
-
-/*          einfo->info.rotation = rotation; */
-/*          evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
-/*          if (!ee->prop.fullscreen) */
-/*            { */
-/*               ecore_wince_window_resize(ee->engine.wince.window, ee->h, ee->w); */
-/*               ee->expecting_resize.w = ee->h; */
-/*               ee->expecting_resize.h = ee->w; */
-/*            } */
-/*          else */
-/*            { */
-/*               int w, h; */
-
-/*               ecore_wince_window_size_get(ee->engine.wince.window, &w, &h); */
-/*               ecore_wince_window_resize(ee->engine.wince.window, h, w); */
-/*               if ((rotation == 0) || (rotation == 180)) */
-/*                 { */
-/*                    evas_output_size_set(ee->evas, ee->w, ee->h); */
-/*                    evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); */
-/*                 } */
-/*               else */
-/*                 { */
-/*                    evas_output_size_set(ee->evas, ee->h, ee->w); */
-/*                    evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); */
-/*                 } */
-/*               if (ee->func.fn_resize) ee->func.fn_resize(ee); */
-/*            } */
-/*          ecore_evas_size_min_get(ee, &minw, &minh); */
-/*          ecore_evas_size_max_get(ee, &maxw, &maxh); */
-/*          ecore_evas_size_base_get(ee, &basew, &baseh); */
-/*          ecore_evas_size_step_get(ee, &stepw, &steph); */
-/*          ee->rotation = rotation; */
-/*          ecore_evas_size_min_set(ee, minh, minw); */
-/*          ecore_evas_size_max_set(ee, maxh, maxw); */
-/*          ecore_evas_size_base_set(ee, baseh, basew); */
-/*          ecore_evas_size_step_set(ee, steph, stepw); */
-/*          _ecore_evas_wince_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, */
+/*        Evas_Engine_Info_Software_16_WinCE *einfo; */
+
+/*        einfo = (Evas_Engine_Info_Software_16_WinCE *)evas_engine_info_get(ee->evas); */
+/*        if (!einfo) return; */
+/*        if (rot_dif != 180) */
+/*          { */
+/*             int minw, minh, maxw, maxh, basew, baseh, stepw, steph; */
+
+/*             einfo->info.rotation = rotation; */
+/*             evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
+/*             if (!ee->prop.fullscreen) */
+/*               { */
+/*                  ecore_wince_window_resize(ee->prop.window, ee->h, ee->w); */
+/*                  ee->expecting_resize.w = ee->h; */
+/*                  ee->expecting_resize.h = ee->w; */
+/*               } */
+/*             else */
+/*               { */
+/*                  int w, h; */
+
+/*                  ecore_wince_window_size_get(ee->prop.window, &w, &h); */
+/*                  ecore_wince_window_resize(ee->prop.window, h, w); */
+/*                  if ((rotation == 0) || (rotation == 180)) */
+/*                    { */
+/*                       evas_output_size_set(ee->evas, ee->w, ee->h); */
+/*                       evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); */
+/*                    } */
+/*                  else */
+/*                    { */
+/*                       evas_output_size_set(ee->evas, ee->h, ee->w); */
+/*                       evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); */
+/*                    } */
+/*                  if (ee->func.fn_resize) ee->func.fn_resize(ee); */
+/*               } */
+/*             ecore_evas_size_min_get(ee, &minw, &minh); */
+/*             ecore_evas_size_max_get(ee, &maxw, &maxh); */
+/*             ecore_evas_size_base_get(ee, &basew, &baseh); */
+/*             ecore_evas_size_step_get(ee, &stepw, &steph); */
+/*             ee->rotation = rotation; */
+/*             ecore_evas_size_min_set(ee, minh, minw); */
+/*             ecore_evas_size_max_set(ee, maxh, maxw); */
+/*             ecore_evas_size_base_set(ee, baseh, basew); */
+/*             ecore_evas_size_step_set(ee, steph, stepw); */
+/*             _ecore_evas_wince_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, */
 /*                                                   ecore_wince_current_time_get()); */
-/*       } */
-/*     else */
-/*       { */
-/*          einfo->info.rotation = rotation; */
-/*          evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
-/*          ee->rotation = rotation; */
-/*          _ecore_evas_wince_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, */
+/*          } */
+/*        else */
+/*          { */
+/*             einfo->info.rotation = rotation; */
+/*             evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
+/*             ee->rotation = rotation; */
+/*             _ecore_evas_wince_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, */
 /*                                                   ecore_wince_current_time_get()); */
-/*          if (ee->func.fn_resize) ee->func.fn_resize(ee); */
-/*       } */
-/*     if ((ee->rotation == 90) || (ee->rotation == 270)) */
-/*       evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); */
-/*     else */
-/*       evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); */
+/*             if (ee->func.fn_resize) ee->func.fn_resize(ee); */
+/*          } */
+/*        if ((ee->rotation == 90) || (ee->rotation == 270)) */
+/*          evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); */
+/*        else */
+/*          evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); */
 /*      } */
 /* } */
 
 static void
 _ecore_evas_wince_show(Ecore_Evas *ee)
 {
-  printf (" * ee window show\n");
+   INF("ecore evas show");
+
    ee->should_be_visible = 1;
    if (ee->prop.avoid_damage)
      _ecore_evas_wince_render(ee);
-   ecore_wince_window_show(ee->engine.wince.window);
+   ecore_wince_window_show((Ecore_WinCE_Window *)ee->prop.window);
 /*    if (ee->prop.fullscreen) */
-/*      ecore_wince_window_focus(ee->engine.wince.window); */
+/*      ecore_wince_window_focus(ee->prop.window); */
 }
 
 static void
 _ecore_evas_wince_hide(Ecore_Evas *ee)
 {
-   ecore_wince_window_hide(ee->engine.wince.window);
+   INF("ecore evas hide");
+
+   ecore_wince_window_hide((Ecore_WinCE_Window *)ee->prop.window);
    ee->should_be_visible = 0;
 }
 
@@ -698,28 +536,30 @@ _ecore_evas_wince_hide(Ecore_Evas *ee)
 /* _ecore_evas_wince_raise(Ecore_Evas *ee) */
 /* { */
 /*    if (!ee->prop.fullscreen) */
-/*      ecore_wince_window_raise(ee->engine.wince.window); */
+/*      ecore_wince_window_raise(ee->prop.window); */
 /*    else */
-/*      ecore_wince_window_raise(ee->engine.wince.window); */
+/*      ecore_wince_window_raise(ee->prop.window); */
 /* } */
 
 /* static void */
 /* _ecore_evas_wince_lower(Ecore_Evas *ee) */
 /* { */
 /*    if (!ee->prop.fullscreen) */
-/*      ecore_wince_window_lower(ee->engine.wince.window); */
+/*      ecore_wince_window_lower(ee->prop.window); */
 /*    else */
-/*      ecore_wince_window_lower(ee->engine.wince.window); */
+/*      ecore_wince_window_lower(ee->prop.window); */
 /* } */
 
-/* static void */
-/* _ecore_evas_wince_title_set(Ecore_Evas *ee, const char *title) */
-/* { */
-/*    if (ee->prop.title) free(ee->prop.title); */
-/*    ee->prop.title = NULL; */
-/*    if (title) ee->prop.title = strdup(title); */
-/*    ecore_wince_window_title_set(ee->engine.wince.window, ee->prop.title); */
-/* } */
+static void
+_ecore_evas_wince_title_set(Ecore_Evas *ee, const char *title)
+{
+   INF("ecore evas title set");
+
+   if (ee->prop.title) free(ee->prop.title);
+   ee->prop.title = NULL;
+   if (title) ee->prop.title = strdup(title);
+   ecore_wince_window_title_set((Ecore_WinCE_Window *)ee->prop.window, ee->prop.title);
+}
 
 /* static void */
 /* _ecore_evas_wince_size_min_set(Ecore_Evas *ee, int width, int height) */
@@ -729,7 +569,7 @@ _ecore_evas_wince_hide(Ecore_Evas *ee)
 /*    if ((ee->prop.min.w == width) && (ee->prop.min.h == height)) return; */
 /*    ee->prop.min.w = width; */
 /*    ee->prop.min.h = height; */
-/*    ecore_wince_window_size_min_set(ee->engine.wince.window, width, height); */
+/*    ecore_wince_window_size_min_set(ee->prop.window, width, height); */
 /* } */
 
 /* static void */
@@ -740,7 +580,7 @@ _ecore_evas_wince_hide(Ecore_Evas *ee)
 /*    if ((ee->prop.max.w == width) && (ee->prop.max.h == height)) return; */
 /*    ee->prop.max.w = width; */
 /*    ee->prop.max.h = height; */
-/*    ecore_wince_window_size_max_set(ee->engine.wince.window, width, height); */
+/*    ecore_wince_window_size_max_set(ee->prop.window, width, height); */
 /* } */
 
 /* static void */
@@ -751,7 +591,7 @@ _ecore_evas_wince_hide(Ecore_Evas *ee)
 /*    if ((ee->prop.base.w == width) && (ee->prop.base.h == height)) return; */
 /*    ee->prop.base.w = width; */
 /*    ee->prop.base.h = height; */
-/*    ecore_wince_window_size_base_set(ee->engine.wince.window, width, height); */
+/*    ecore_wince_window_size_base_set(ee->prop.window, width, height); */
 /* } */
 
 /* static void */
@@ -762,7 +602,7 @@ _ecore_evas_wince_hide(Ecore_Evas *ee)
 /*    if ((ee->prop.step.w == width) && (ee->prop.step.h == height)) return; */
 /*    ee->prop.step.w = width; */
 /*    ee->prop.step.h = height; */
-/*    ecore_wince_window_size_step_set(ee->engine.wince.window, width, height); */
+/*    ecore_wince_window_size_step_set(ee->prop.window, width, height); */
 /* } */
 
 static void
@@ -775,12 +615,12 @@ _ecore_evas_wince_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int ho
 
    if (obj == NULL)
      {
-       ee->prop.cursor.object = NULL;
-       ee->prop.cursor.layer = 0;
-       ee->prop.cursor.hot.x = 0;
-       ee->prop.cursor.hot.y = 0;
-       ecore_wince_window_cursor_show(ee->engine.wince.window, 1);
-       return;
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        ecore_wince_window_cursor_show(ee->prop.window, 1);
+        return;
      }
 
    ee->prop.cursor.object = obj;
@@ -788,24 +628,24 @@ _ecore_evas_wince_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int ho
    ee->prop.cursor.hot.x = hot_x;
    ee->prop.cursor.hot.y = hot_y;
 
-   ecore_wince_window_cursor_show(ee->engine.wince.window, 0);
+   ecore_wince_window_cursor_show(ee->prop.window, 0);
 
    evas_pointer_output_xy_get(ee->evas, &x, &y);
    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
    evas_object_move(ee->prop.cursor.object,
-                   x - ee->prop.cursor.hot.x,
-                   y - ee->prop.cursor.hot.y);
+                    x - ee->prop.cursor.hot.x,
+                    y - ee->prop.cursor.hot.y);
    evas_object_pass_events_set(ee->prop.cursor.object, 1);
    if (evas_pointer_inside_get(ee->evas))
      evas_object_show(ee->prop.cursor.object);
 #endif
 }
 
-/* static void */
-/* _ecore_evas_wince_focus_set(Ecore_Evas *ee, int on __UNUSED__) */
-/* { */
-/*    ecore_wince_window_focus_set(ee->engine.wince.window); */
-/* } */
+static void
+_ecore_evas_wince_focus_set(Ecore_Evas *ee, int on __UNUSED__)
+{
+   ecore_wince_window_focus(ee->prop.window);
+}
 
 /* static void */
 /* _ecore_evas_wince_iconified_set(Ecore_Evas *ee, int on) */
@@ -813,7 +653,7 @@ _ecore_evas_wince_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int ho
 /* /\*    if (((ee->prop.borderless) && (on)) || *\/ */
 /* /\*        ((!ee->prop.borderless) && (!on))) return; *\/ */
 /*    ee->prop.iconified = on; */
-/*    ecore_wince_window_iconified_set(ee->engine.wince.window, ee->prop.iconified); */
+/*    ecore_wince_window_iconified_set(ee->prop.window, ee->prop.iconified); */
 /* } */
 
 /* static void */
@@ -822,100 +662,159 @@ _ecore_evas_wince_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int ho
 /*    if (((ee->prop.borderless) && (on)) || */
 /*        ((!ee->prop.borderless) && (!on))) return; */
 /*    ee->prop.borderless = on; */
-/*    ecore_wince_window_borderless_set(ee->engine.wince.window, ee->prop.borderless); */
+/*    ecore_wince_window_borderless_set(ee->prop.window, ee->prop.borderless); */
 /* } */
 
 static void
 _ecore_evas_wince_fullscreen_set(Ecore_Evas *ee, int on)
 {
-/*    if ((ee->prop.fullscreen && on) || */
-/*       (!ee->prop.fullscreen && !on)) return; */
-
-/*    ee->engine.wince.state.fullscreen = on; */
-/*    ecore_wince_window_fullscreen_set(ee->engine.wince.window, ee->prop.borderless); */
-   /* FIXME: what to do with that code ?? */
-/*    if (ee->should_be_visible) */
-/*      ecore_x_netwm_state_request_send(ee->engine.x.win, ee->engine.x.win_root, */
-/*                                   ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on); */
-/*    else */
-/*      _ecore_evas_wince_state_update(ee); */
+   Evas_Engine_Info_Software_16_WinCE *einfo;
+   struct _Ecore_WinCE_Window         *window;
+
+   INF("ecore evas fullscreen set");
+
+   if ((ee->engine.wince.state.fullscreen && on) ||
+      (!ee->engine.wince.state.fullscreen && !on))
+     return;
+
+   ee->engine.wince.state.fullscreen = on;
+   ee->prop.fullscreen = on;
+
+   window = (struct _Ecore_WinCE_Window *)ee->prop.window;
+
+   if (on != 0)
+   {
+/*       ecore_win32_window_shape_set(ee->engine.win32.window, 0, 0, NULL); */
+      ecore_wince_window_fullscreen_set((Ecore_WinCE_Window *)ee->prop.window, on);
+      ee->w = GetSystemMetrics(SM_CXSCREEN);
+      ee->h = GetSystemMetrics(SM_CYSCREEN);
+      ee->req.w = ee->w;
+      ee->req.h = ee->h;
+      evas_output_size_set(ee->evas, ee->w, ee->h);
+      evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+   }
+   else
+   {
+      int w;
+      int h;
+
+      ecore_wince_window_fullscreen_set((Ecore_WinCE_Window *)ee->prop.window, on);
+      ecore_wince_window_size_get((Ecore_WinCE_Window *)ee->prop.window, &w, &h);
+      ee->w = w;
+      ee->h = h;
+      ee->req.w = ee->w;
+      ee->req.h = ee->h;
+      evas_output_size_set(ee->evas, ee->w, ee->h);
+      evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+/*       ecore_win32_window_shape_set(window, */
+/*                                    window->shape.width, */
+/*                                    window->shape.height, */
+/*                                    window->shape.mask); */
+   }
+
+   einfo = (Evas_Engine_Info_Software_16_WinCE *)evas_engine_info_get(ecore_evas_get(ee));
+   if (einfo)
+     {
+        einfo->info.fullscreen = !!on;
+/*         einfo->info.layered = window->shape.layered; */
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+     }
 }
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
 
-static void *
-_ecore_evas_wince_window_get(Ecore_Evas *ee)
+static void
+_ecore_evas_wince_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-   return ee->engine.wince.window;
-#else
-   return NULL;
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
+   HDC dc;
+
+   dc = GetDC(NULL);
+   if (!dc)
+     {
+        if (xdpi) *xdpi = 0;
+        if (ydpi) *ydpi = 0;
+        return;
+     }
+
+   if (xdpi) *xdpi = GetDeviceCaps(dc, LOGPIXELSX);
+   if (ydpi) *ydpi = GetDeviceCaps(dc, LOGPIXELSY);
+
+   ReleaseDC(NULL, dc);
 }
 
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-static const Ecore_Evas_Engine_Func _ecore_wince_engine_func =
+static Ecore_Evas_Engine_Func _ecore_wince_engine_func =
 {
    _ecore_evas_wince_free,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     _ecore_evas_wince_callback_delete_request_set,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-     NULL,
-   NULL, //_ecore_evas_wince_move,
-     NULL,
-   NULL, //_ecore_evas_wince_resize,
-   NULL, //_ecore_evas_wince_move_resize,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_wince_callback_delete_request_set,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   _ecore_evas_wince_move,
+   NULL,
+   _ecore_evas_wince_resize,
+   _ecore_evas_wince_move_resize,
    NULL, //_ecore_evas_wince_rotation_set,
-     NULL, /* _ecore_evas_x_shaped_set */
-     _ecore_evas_wince_show,
-     _ecore_evas_wince_hide,
+   NULL, /* _ecore_evas_x_shaped_set */
+   _ecore_evas_wince_show,
+   _ecore_evas_wince_hide,
    NULL, //_ecore_evas_wince_raise,
    NULL, //_ecore_evas_wince_lower,
    NULL, //_ecore_evas_wince_activate,
-   NULL, //_ecore_evas_wince_title_set,
-     NULL, /* _ecore_evas_x_name_class_set */
+   _ecore_evas_wince_title_set,
+   NULL, /* _ecore_evas_x_name_class_set */
    NULL, //_ecore_evas_wince_size_min_set,
    NULL, //_ecore_evas_wince_size_max_set,
    NULL, //_ecore_evas_wince_size_base_set,
    NULL, //_ecore_evas_wince_size_step_set,
-     _ecore_evas_wince_cursor_set,
-     NULL, /* _ecore_evas_x_layer_set */
-   NULL, //_ecore_evas_wince_focus_set,
-     NULL, //_ecore_evas_wince_iconified_set,
-     NULL, //_ecore_evas_wince_borderless_set,
-     NULL, /* _ecore_evas_x_override_set */
-     NULL,
-     _ecore_evas_wince_fullscreen_set,
-     NULL, /* _ecore_evas_x_avoid_damage_set */
-     NULL, /* _ecore_evas_x_withdrawn_set */
-     NULL, /* _ecore_evas_x_sticky_set */
-     NULL, /* _ecore_evas_x_ignore_events_set */
-     NULL, /* _ecore_evas_x_alpha_set */
-     _ecore_evas_wince_window_get
+   _ecore_evas_wince_cursor_set,
+   NULL, /* _ecore_evas_x_layer_set */
+   _ecore_evas_wince_focus_set,
+   NULL, //_ecore_evas_wince_iconified_set,
+   NULL, //_ecore_evas_wince_borderless_set,
+   NULL, /* _ecore_evas_x_override_set */
+   NULL,
+   _ecore_evas_wince_fullscreen_set,
+   NULL, /* _ecore_evas_x_avoid_damage_set */
+   NULL, /* _ecore_evas_x_withdrawn_set */
+   NULL, /* _ecore_evas_x_sticky_set */
+   NULL, /* _ecore_evas_x_ignore_events_set */
+   NULL, /* _ecore_evas_x_alpha_set */
+   NULL, //transparent
+   NULL, // profiles_set
+
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+   NULL,
+
+   NULL, // render
+   NULL, // screen_geometry_get
+   _ecore_evas_wince_screen_dpi_get
 };
 
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
-
 /* API */
 
-
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
 static Ecore_Evas *
 ecore_evas_software_wince_new_internal(int                 backend,
                                        Ecore_WinCE_Window *parent,
                                        int                 x,
                                        int                 y,
                                        int                 width,
-                                       int                 height)
+                                       int                 height,
+                                       int                 fullscreen)
 {
    Evas_Engine_Info_Software_16_WinCE *einfo;
    Ecore_Evas                         *ee;
@@ -954,6 +853,10 @@ ecore_evas_software_wince_new_internal(int                 backend,
    ee->y = y;
    ee->w = width;
    ee->h = height;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 32767;
    ee->prop.max.h = 32767;
@@ -962,8 +865,8 @@ ecore_evas_software_wince_new_internal(int                 backend,
    ee->prop.sticky = 0;
    /* FIXME: sticky to add */
 
-   ee->engine.wince.window = ecore_wince_window_new(parent, x, y, width, height);
-   if (!ee->engine.wince.window)
+   ee->prop.window = (Ecore_Window)ecore_wince_window_new((Ecore_WinCE_Window *)parent, x, y, width, height);
+   if (!ee->prop.window)
      {
         _ecore_evas_wince_shutdown();
         free(ee);
@@ -971,6 +874,8 @@ ecore_evas_software_wince_new_internal(int                 backend,
         return NULL;
      }
 
+   ecore_wince_window_fullscreen_set((Ecore_WinCE_Window *)ee->prop.window, fullscreen);
+
    /* init evas here */
    ee->evas = evas_new();
    evas_data_attach_set(ee->evas, ee);
@@ -982,31 +887,60 @@ ecore_evas_software_wince_new_internal(int                 backend,
    if (einfo)
      {
         /* FIXME: REDRAW_DEBUG missing for now */
-        einfo->info.window = ((struct _Ecore_WinCE_Window *)ee->engine.wince.window)->window;
+        einfo->info.window = ((struct _Ecore_WinCE_Window *)ee->prop.window)->window;
+        einfo->info.width = width;
+        einfo->info.height = height;
         einfo->info.backend = backend;
         einfo->info.rotation = 0;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        einfo->info.fullscreen = fullscreen;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             _ecore_evas_wince_shutdown();
+             free(ee);
+             ecore_wince_shutdown();
+             return NULL;
+          }
 
-        ecore_wince_window_backend_set(ee->engine.wince.window, backend);
-        ecore_wince_window_suspend_set(ee->engine.wince.window, einfo->func.suspend);
-        ecore_wince_window_resume_set(ee->engine.wince.window, einfo->func.resume);
+        ecore_wince_window_backend_set((Ecore_WinCE_Window *)ee->prop.window, backend);
+        ecore_wince_window_suspend_cb_set((Ecore_WinCE_Window *)ee->prop.window, einfo->func.suspend);
+        ecore_wince_window_resume_cb_set((Ecore_WinCE_Window *)ee->prop.window, einfo->func.resume);
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        _ecore_evas_wince_shutdown();
+        free(ee);
+        ecore_wince_shutdown();
+        return NULL;
      }
 
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
-
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
-   ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_wince_winid_str_get(ee->engine.wince.window), ee);
+   ee->engine.func->fn_render = _ecore_evas_wince_render;
+   _ecore_evas_register(ee);
+   ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+   evas_focus_in(ee->evas);
 
    return ee;
 }
+
+#else
+
+static Ecore_Evas *
+ecore_evas_software_wince_new_internal(int                 backend __UNUSED__,
+                                       Ecore_WinCE_Window *parent __UNUSED__,
+                                       int                 x __UNUSED__,
+                                       int                 y __UNUSED__,
+                                       int                 width __UNUSED__,
+                                       int                 height __UNUSED__,
+                                       int                 fullscreen __UNUSED__)
+{
+   return NULL;
+}
+
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
 
 
@@ -1017,16 +951,7 @@ ecore_evas_software_wince_new(Ecore_WinCE_Window *parent,
                               int                 width,
                               int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-   return ecore_evas_software_wince_new_internal(0, parent, x, y, width, height);
-#else
-   return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
+   return ecore_evas_software_wince_new_internal(0, parent, x, y, width, height, 1);
 }
 
 EAPI Ecore_Evas *
@@ -1036,16 +961,7 @@ ecore_evas_software_wince_fb_new(Ecore_WinCE_Window *parent,
                                  int                 width,
                                  int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-   return ecore_evas_software_wince_new_internal(1, parent, x, y, width, height);
-#else
-   return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
+   return ecore_evas_software_wince_new_internal(1, parent, x, y, width, height, 1);
 }
 
 EAPI Ecore_Evas *
@@ -1055,16 +971,7 @@ ecore_evas_software_wince_gapi_new(Ecore_WinCE_Window *parent,
                                    int                 width,
                                    int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-   return ecore_evas_software_wince_new_internal(2, parent, x, y, width, height);
-#else
-   return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
+   return ecore_evas_software_wince_new_internal(2, parent, x, y, width, height, 1);
 }
 
 EAPI Ecore_Evas *
@@ -1074,24 +981,33 @@ ecore_evas_software_wince_ddraw_new(Ecore_WinCE_Window *parent,
                                     int                 width,
                                     int                 height)
 {
-#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-   return ecore_evas_software_wince_new_internal(3, parent, x, y, width, height);
-#else
-   return NULL;
-   parent = NULL;
-   x = 0;
-   y = 0;
-   width = 0;
-   height = 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
+   return ecore_evas_software_wince_new_internal(3, parent, x, y, width, height, 1);
 }
 
-EAPI Ecore_WinCE_Window *
-ecore_evas_software_wince_window_get(Ecore_Evas *ee)
+EAPI Ecore_Evas *
+ecore_evas_software_wince_gdi_new(Ecore_WinCE_Window *parent,
+                                  int                 x,
+                                  int                 y,
+                                  int                 width,
+                                  int                 height)
 {
+   return ecore_evas_software_wince_new_internal(4, parent, x, y, width, height, 0);
+}
+
 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
-   return (Ecore_WinCE_Window *) _ecore_evas_wince_window_get(ee);
+
+EAPI Ecore_WinCE_Window *
+ecore_evas_software_wince_window_get(const Ecore_Evas *ee)
+{
+   return (Ecore_WinCE_Window *) ecore_evas_window_get(ee);
+}
+
 #else
+
+EAPI Ecore_WinCE_Window *
+ecore_evas_software_wince_window_get(const Ecore_Evas *ee __UNUSED__)
+{
    return NULL;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
 }
+
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
index a3b1f01..ced4c2b 100644 (file)
@@ -1,17 +1,12 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
-# include "config.h"
+# include <config.h>
 #endif
 
-#include "Ecore.h"
-#include "ecore_private.h"
-#ifdef BUILD_ECORE_EVAS_X11
-# include "Ecore_X.h"
-# include "Ecore_X_Atoms.h"
-#endif
+#include <stdlib.h>
+#include <string.h>
+
+#include <Eina.h>
+#include <Ecore.h>
 
 #include "ecore_evas_private.h"
 #include "Ecore_Evas.h"
 #ifdef BUILD_ECORE_EVAS_X11
 static int _ecore_evas_init_count = 0;
 
-static int _ecore_evas_fps_debug = 0;
+static Ecore_Event_Handler *ecore_evas_event_handlers[13];
 
-static Ecore_Evas *ecore_evases = NULL;
-static Evas_Hash *ecore_evases_hash = NULL;
-static Ecore_Event_Handler *ecore_evas_event_handlers[18];
-static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
+static int leader_ref = 0;
+static Ecore_X_Window leader_win = 0;
 
-#ifdef HAVE_ECORE_X_XCB
-static xcb_visualtype_t *
-xcb_visualtype_get(xcb_screen_t *screen, xcb_visualid_t visual)
+static void
+_ecore_evas_x_hints_update(Ecore_Evas *ee)
 {
-   xcb_depth_iterator_t  iter_depth;
+   ecore_x_icccm_hints_set
+     (ee->prop.window,
+         !ee->prop.focus_skip /* accepts_focus */,
+         ee->prop.iconified ? ECORE_X_WINDOW_STATE_HINT_ICONIC : 
+         ee->prop.withdrawn ? ECORE_X_WINDOW_STATE_HINT_WITHDRAWN : 
+         ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
+         0 /* icon_pixmap */,
+         0 /* icon_mask */,
+         0 /* icon_window */,
+         ee->prop.group_ee_win /* window_group */,
+         ee->prop.urgent /* is_urgent */);
+}
 
-   if (!screen) return NULL;
+static void
+_ecore_evas_x_group_leader_set(Ecore_Evas *ee)
+{
+   leader_ref++;
+   if (leader_ref == 1)
+     {
+        char *id = NULL;
+
+        leader_win =
+          ecore_x_window_override_new(ee->engine.x.win_root, 1234, 5678, 1, 2);
+        ecore_x_window_defaults_set(leader_win);
+        if ((id = getenv("DESKTOP_STARTUP_ID")))
+          ecore_x_netwm_startup_id_set(leader_win,id);
+        ecore_x_icccm_client_leader_set(leader_win, leader_win);
+     }
+   ee->engine.x.leader = leader_win;
+   ecore_x_icccm_client_leader_set(ee->prop.window, leader_win);
+}
 
-   iter_depth = xcb_screen_allowed_depths_iterator(screen);
-   for (; iter_depth.rem; xcb_depth_next (&iter_depth))
+static void
+_ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
+{
+   ecore_x_window_prop_property_del(ee->prop.window,
+                                    ECORE_X_ATOM_WM_CLIENT_LEADER);
+   if (ee->engine.x.leader == leader_win)
      {
-        xcb_visualtype_iterator_t iter_vis;
+        leader_ref--;
+        if (leader_ref <= 0)
+          {
+             ecore_x_window_free(leader_win);
+             leader_win = 0;
+          }
+        ee->engine.x.leader = 0;
+     }
+}
+
+static void
+_ecore_evas_x_group_leader_update(Ecore_Evas *ee)
+{
+   if (ee->engine.x.leader)
+      ecore_x_icccm_client_leader_set(ee->prop.window, ee->engine.x.leader);
+}
+
+static void
+_ecore_evas_x_protocols_set(Ecore_Evas *ee)
+{
+   Ecore_X_Atom protos[3];
+   unsigned int num = 0, tmp = 0;
+
+   if (ee->func.fn_delete_request)
+     protos[num++] = ECORE_X_ATOM_WM_DELETE_WINDOW;
+   protos[num++] = ECORE_X_ATOM_NET_WM_PING;
+   protos[num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
+   ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
+
+   if (!ee->engine.x.netwm_sync_counter)
+     ee->engine.x.netwm_sync_counter = ecore_x_sync_counter_new(0);
+
+   tmp = ee->engine.x.netwm_sync_counter;
+   ecore_x_window_prop_card32_set(ee->prop.window,
+                                  ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
+                                  &tmp, 1);
+}
 
-        iter_vis = xcb_depth_visuals_iterator(iter_depth.data);
-        for (; iter_vis.rem; --screen, xcb_visualtype_next (&iter_vis))
+static void
+_ecore_evas_x_sync_set(Ecore_Evas *ee)
+{
+   Ecore_X_Sync_Counter sync_counter = ee->engine.x.sync_counter;
+
+   if (((ee->should_be_visible) || (ee->visible)) &&
+       ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
+           (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)))
+     {
+        if (!ee->engine.x.sync_counter)
+           ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
+     }
+   else
+     {
+        if (ee->engine.x.sync_counter)
           {
-            if (visual == iter_vis.data->visual_id)
-              return iter_vis.data;
+           ecore_x_sync_counter_free(ee->engine.x.sync_counter);
+             ee->engine.x.sync_val = 0;
           }
+        ee->engine.x.sync_counter = 0;
      }
+   if (sync_counter != ee->engine.x.sync_counter)
+   ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
+}
 
-   return NULL;
+static void
+_ecore_evas_x_sync_clear(Ecore_Evas *ee)
+{
+   if (!ee->engine.x.sync_counter) return;
+   ecore_x_sync_counter_free(ee->engine.x.sync_counter);
+   ee->engine.x.sync_val = 0;
+   ee->engine.x.sync_counter = 0;
 }
-#endif /* HAVE_ECORE_X_XCB */
 
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-# ifdef HAVE_ECORE_X_XCB
-/* noop */
-# else
+# ifdef BUILD_ECORE_EVAS_OPENGL_X11
 static Ecore_X_Window
-_ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y, int w, int h, int override)
+_ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y, int w, int h, int override, int argb, const int *opt)
 {
    Evas_Engine_Info_GL_X11 *einfo;
    Ecore_X_Window win;
@@ -64,1082 +143,1051 @@ _ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y,
    einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
    if (einfo)
      {
-       XSetWindowAttributes attr;
-       int screen;
-
-       /* FIXME: this is inefficient as its a round trip */
-       screen = DefaultScreen(ecore_x_display_get());
-       if (ScreenCount(ecore_x_display_get()) > 1)
-         {
-            Ecore_X_Window *roots;
-            int num, i;
-
-            num = 0;
-            roots = ecore_x_window_root_list(&num);
-            if (roots)
-              {
-                 XWindowAttributes at;
-
-                 if (XGetWindowAttributes(ecore_x_display_get(),
-                                          parent, &at))
-                   {
-                      for (i = 0; i < num; i++)
-                        {
-                           if (at.root == roots[i])
-                             {
-                                screen = i;
-                                break;
-                             }
-                        }
-                   }
-                 free(roots);
-              }
-         }
-       attr.backing_store = NotUseful;
-       attr.override_redirect = override;
-       attr.colormap = einfo->func.best_colormap_get(ecore_x_display_get(), screen);
-       attr.border_pixel = 0;
-       attr.background_pixmap = None;
-       attr.event_mask =
-         KeyPressMask | KeyReleaseMask |
-         ExposureMask | ButtonPressMask | ButtonReleaseMask |
-         EnterWindowMask | LeaveWindowMask |
-         PointerMotionMask | StructureNotifyMask | VisibilityChangeMask |
-         FocusChangeMask | PropertyChangeMask | ColormapChangeMask;
-       attr.bit_gravity = ForgetGravity;
-
-       win =
-         XCreateWindow(ecore_x_display_get(),
-                       parent,
-                       x, y,
-                       w, h, 0,
-                       einfo->func.best_depth_get(ecore_x_display_get(), screen),
-                       InputOutput,
-                       einfo->func.best_visual_get(ecore_x_display_get(), screen),
-                       CWBackingStore | CWColormap |
-                       CWBackPixmap | CWBorderPixel |
-                       CWBitGravity | CWEventMask |
-                       CWOverrideRedirect,
-                       &attr);
-       einfo->info.display  = ecore_x_display_get();
-       einfo->info.visual   = einfo->func.best_visual_get(ecore_x_display_get(), screen);
-       einfo->info.colormap = einfo->func.best_colormap_get(ecore_x_display_get(), screen);
-       einfo->info.drawable = win;
-       einfo->info.depth    = einfo->func.best_depth_get(ecore_x_display_get(), screen);
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        int screen;
+
+        if (opt)
+          {
+             int op;
+
+             for (op = 0; opt[op]; op++)
+               {
+                  if (opt[op] == ECORE_EVAS_GL_X11_OPT_INDIRECT)
+                    {
+                       op++;
+                       einfo->indirect = opt[op];
+                    }
+                  else if (opt[op] == ECORE_EVAS_GL_X11_OPT_VSYNC)
+                    {
+                       op++;
+                       einfo->vsync = opt[op];
+                    }
+#ifdef EVAS_ENGINE_GL_X11_SWAP_MODE_EXISTS                  
+                  else if (opt[op] == ECORE_EVAS_GL_X11_OPT_SWAP_MODE)
+                    {
+                       op++;
+                       if ((evas_version->major >= 1) &&
+                           (evas_version->minor >= 7) &&
+                           (evas_version->micro >= 99))
+                       einfo->swap_mode = opt[op];
+                    }
+#endif                  
+               }
+          }
+
+        /* FIXME: this is inefficient as its 1 or more round trips */
+        screen = ecore_x_screen_index_get(ecore_x_default_screen_get());
+        if (ecore_x_screen_count_get() > 1)
+          {
+             Ecore_X_Window *roots;
+             int num, i;
+
+             num = 0;
+             roots = ecore_x_window_root_list(&num);
+             if (roots)
+               {
+                  Ecore_X_Window root;
+
+                  root = ecore_x_window_root_get(parent);
+                  for (i = 0; i < num; i++)
+                    {
+                       if (root == roots[i])
+                         {
+                            screen = i;
+                            break;
+                         }
+                    }
+                  free(roots);
+               }
+          }
+
+        einfo->info.display = ecore_x_display_get();
+        einfo->info.screen = screen;
+
+        einfo->info.destination_alpha = argb;
+
+        einfo->info.visual = einfo->func.best_visual_get(einfo);
+        einfo->info.colormap = einfo->func.best_colormap_get(einfo);
+        einfo->info.depth = einfo->func.best_depth_get(einfo);
+
+        if ((!einfo->info.visual) ||
+            (!einfo->info.colormap) || (!einfo->info.depth))
+          {
+             WRN("OpenGL X11 init engine '%s' failed - no visual, colormap or depth.", ee->driver);
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                  return 0;
+               }
+          }
+
+        if (argb)
+          {
+             if (override)
+               win = ecore_x_window_override_argb_new(parent, x, y, w, h);
+             else
+               win = ecore_x_window_argb_new(parent, x, y, w, h);
+          }
+        else
+          {
+             if (override)
+               win = ecore_x_window_override_new(parent, x, y, w, h);
+             else
+               win = ecore_x_window_new(parent, x, y, w, h);
+          }
+
+        ecore_x_window_pixel_gravity_set(win, ECORE_X_GRAVITY_FORGET);
+
+        /* attr.backing_store = NotUseful; */
+        /* attr.override_redirect = override; */
+        /* attr.colormap = einfo->info.colormap; */
+        /* attr.border_pixel = 0; */
+        /* attr.background_pixmap = None; */
+        /* attr.event_mask = */
+        /*   KeyPressMask | KeyReleaseMask | */
+        /*   ExposureMask | ButtonPressMask | ButtonReleaseMask | */
+        /*   EnterWindowMask | LeaveWindowMask | */
+        /*   PointerMotionMask | StructureNotifyMask | VisibilityChangeMask | */
+        /*   FocusChangeMask | PropertyChangeMask | ColormapChangeMask; */
+        /* attr.bit_gravity = ForgetGravity; */
+
+        /* win = */
+        /*   XCreateWindow(einfo->info.display, parent, x, y, w, h, 0, */
+        /*                 einfo->info.depth, InputOutput, einfo->info.visual, */
+        /*                 CWBackingStore | CWColormap | CWBackPixmap | */
+        /*                 CWBorderPixel | CWBitGravity | CWEventMask | */
+        /*                 CWOverrideRedirect, &attr); */
+
+        einfo->info.drawable = win;
+
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+             ecore_x_window_free(win);
+             return 0;
+          }
      }
    else
-     {
-       win = 0;
-     }
+     win = 0;
+
    return win;
 }
-#endif /* HAVE_ECORE_X_XCB */
 #endif
 
-static void
+static int
 _ecore_evas_x_render(Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_BUFFER
-   Evas_List *ll;
-#endif
+   int rend = 0;
+   Eina_List *updates = NULL;
+   Eina_List *ll;
+   Ecore_Evas *ee2;
 
-#ifdef BUILD_ECORE_EVAS_BUFFER
-   for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
-     {
-       Ecore_Evas *ee2;
+   if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
+       (ee->engine.x.sync_counter) && (!ee->engine.x.sync_began) &&
+       (!ee->engine.x.sync_cancel))
+     return 0;
 
-       ee2 = ll->data;
-       if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
-       _ecore_evas_buffer_render(ee2);
-       if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
+   EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
+     {
+        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
+        if (ee2->engine.func->fn_render)
+          rend |= ee2->engine.func->fn_render(ee2);
+        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
      }
-#endif
+
    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
+   updates = evas_render_updates(ee->evas);
    if (ee->prop.avoid_damage)
      {
-       Evas_List *updates, *l;
-
-       updates = evas_render_updates(ee->evas);
-#if 0
-//     if (ee->w == 640)
-         {
-            for (l = updates; l; l = l->next)
-              {
-                 Evas_Rectangle *r;
-
-                 r = l->data;
-                 printf("  UP render [%p] %ix%i, [%i %i %ix%i]\n",
-                        ee, ee->w, ee->h, r->x, r->y, r->w, r->h);
-              }
-         }
-#endif
-       if (ee->engine.x.using_bg_pixmap)
-         {
-            if (updates)
-              {
-                 for (l = updates; l; l = l->next)
-                   {
-                      Evas_Rectangle *r;
-
-                      r = l->data;
-                      ecore_x_window_area_clear(ee->engine.x.win, r->x, r->y, r->w, r->h);
-                   }
-                 if ((ee->shaped) && (updates))
-                   ecore_x_window_shape_mask_set(ee->engine.x.win, ee->engine.x.mask);
-                 if ((ee->alpha) && (updates))
-                   ecore_x_window_shape_input_mask_set(ee->engine.x.win, ee->engine.x.mask);
-              }
-            if (updates)
-              {
-                 evas_render_updates_free(updates);
-                 _ecore_evas_idle_timeout_update(ee);
-              }
-         }
-       else
-         {
-#ifdef HAVE_ECORE_X_XCB
-#warning [XCB] No Region code
-#else
-            for (l = updates; l; l = l->next)
-              {
-                 Evas_Rectangle *r;
-                 XRectangle xr;
-                 Region tmpr;
-
-                 if (!ee->engine.x.damages)
-                   ee->engine.x.damages = XCreateRegion();
-                 r = l->data;
-                 tmpr = XCreateRegion();
-                 if (ee->rotation == 0)
-                   {
-                      xr.x = r->x;
-                      xr.y = r->y;
-                      xr.width = r->w;
-                      xr.height = r->h;
-                   }
-                 else if (ee->rotation == 90)
-                   {
-                      xr.x = r->y;
-                      xr.y = ee->h - r->x - r->w;
-                      xr.width = r->h;
-                      xr.height = r->w;
-                   }
-                 else if (ee->rotation == 180)
-                   {
-                      xr.x = ee->w - r->x - r->w;
-                      xr.y = ee->h - r->y - r->h;
-                      xr.width = r->w;
-                      xr.height = r->h;
-                   }
-                 else if (ee->rotation == 270)
-                   {
-                      xr.x = ee->w - r->y - r->h;
-                      xr.y = r->x;
-                      xr.width = r->h;
-                      xr.height = r->w;
-                   }
-                 XUnionRectWithRegion(&xr, ee->engine.x.damages, tmpr);
-                 XDestroyRegion(ee->engine.x.damages);
-                 ee->engine.x.damages = tmpr;
-              }
-            if (ee->engine.x.damages)
-              {
-#if 0
-//               if (ee->w == 640)
-                   printf("    --COPY PIXMAP\n");
-#endif
-                 /* if we have a damage pixmap - we can avoid exposures by
-                  * disabling them just for setting the mask */
-                 ecore_x_event_mask_set(ee->engine.x.win,
-                                        ECORE_X_EVENT_MASK_KEY_DOWN |
-                                        ECORE_X_EVENT_MASK_KEY_UP |
-                                        ECORE_X_EVENT_MASK_MOUSE_DOWN |
-                                        ECORE_X_EVENT_MASK_MOUSE_UP |
-                                        ECORE_X_EVENT_MASK_MOUSE_IN |
-                                        ECORE_X_EVENT_MASK_MOUSE_OUT |
-                                        ECORE_X_EVENT_MASK_MOUSE_MOVE |
-//                                      ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
-                                        ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
-                                        ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
-                                        ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
-                                        ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
-                                        ECORE_X_EVENT_MASK_WINDOW_COLORMAP
-                                        );
-                 if ((ee->shaped) && (updates))
-                   ecore_x_window_shape_mask_set(ee->engine.x.win, ee->engine.x.mask);
-                 /* and re-enable them again */
-                 ecore_x_event_mask_set(ee->engine.x.win,
-                                        ECORE_X_EVENT_MASK_KEY_DOWN |
-                                        ECORE_X_EVENT_MASK_KEY_UP |
-                                        ECORE_X_EVENT_MASK_MOUSE_DOWN |
-                                        ECORE_X_EVENT_MASK_MOUSE_UP |
-                                        ECORE_X_EVENT_MASK_MOUSE_IN |
-                                        ECORE_X_EVENT_MASK_MOUSE_OUT |
-                                        ECORE_X_EVENT_MASK_MOUSE_MOVE |
-                                        ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
-                                        ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
-                                        ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
-                                        ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
-                                        ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
-                                        ECORE_X_EVENT_MASK_WINDOW_COLORMAP
-                                        );
-                 XSetRegion(ecore_x_display_get(), ee->engine.x.gc, ee->engine.x.damages);
-                 /* debug rendering */
-                 /*
-                  XSetForeground(ecore_x_display_get(), ee->engine.x.gc, rand());
-                  XFillRectangle(ecore_x_display_get(), ee->engine.x.win, ee->engine.x.gc,
-                  0, 0, ee->w, ee->h);
-                  XSync(ecore_x_display_get(), False);
-                  usleep(20000);
-                  XSync(ecore_x_display_get(), False);
-                  */
-                 ecore_x_pixmap_paste(ee->engine.x.pmap, ee->engine.x.win, ee->engine.x.gc,
-                                      0, 0, ee->w, ee->h, 0, 0);
-                 XDestroyRegion(ee->engine.x.damages);
-                 ee->engine.x.damages = 0;
-              }
-#endif /* HAVE_ECORE_X_XCB */
-            if (updates)
-              {
-                 evas_render_updates_free(updates);
-                 _ecore_evas_idle_timeout_update(ee);
-              }
-         }
+        if (ee->engine.x.using_bg_pixmap)
+          {
+             if (updates)
+               {
+                  Eina_List *l = NULL;
+                  Eina_Rectangle *r;
+
+                  EINA_LIST_FOREACH(updates, l, r)
+                    ecore_x_window_area_clear(ee->prop.window,
+                                              r->x, r->y, r->w, r->h);
+                  if (ee->shaped)
+                    {
+                       ecore_x_window_shape_mask_set(ee->prop.window,
+                                                     ee->engine.x.mask);
+                    }
+                  if (ee->alpha)
+                    {
+//                     ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
+                    }
+                  _ecore_evas_idle_timeout_update(ee);
+                  rend = 1;
+               }
+          }
+        else
+          {
+             if (updates)
+               {
+                  Eina_List *l = NULL;
+                  Eina_Rectangle *r;
+
+                  EINA_LIST_FOREACH(updates, l, r)
+                    {
+                       Ecore_X_Rectangle rect;
+                       Ecore_X_XRegion *tmpr;
+
+                       if (!ee->engine.x.damages)
+                         ee->engine.x.damages = ecore_x_xregion_new();
+                       tmpr = ecore_x_xregion_new();
+                       if (ee->rotation == 0)
+                         {
+                            rect.x = r->x;
+                            rect.y = r->y;
+                            rect.width = r->w;
+                            rect.height = r->h;
+                         }
+                       else if (ee->rotation == 90)
+                         {
+                            rect.x = r->y;
+                            rect.y = ee->h - r->x - r->w;
+                            rect.width = r->h;
+                            rect.height = r->w;
+                         }
+                       else if (ee->rotation == 180)
+                         {
+                            rect.x = ee->w - r->x - r->w;
+                            rect.y = ee->h - r->y - r->h;
+                            rect.width = r->w;
+                            rect.height = r->h;
+                         }
+                       else if (ee->rotation == 270)
+                         {
+                            rect.x = ee->w - r->y - r->h;
+                            rect.y = r->x;
+                            rect.width = r->h;
+                            rect.height = r->w;
+                         }
+                       ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages,
+                                                  &rect);
+                       ecore_x_xregion_free(ee->engine.x.damages);
+                       ee->engine.x.damages = tmpr;
+                    }
+                  if (ee->engine.x.damages)
+                    {
+                       if (ee->shaped)
+                         {
+                            
+                            /* if we have a damage pixmap - we can avoid exposures by
+                             * disabling them just for setting the mask */
+                            ecore_x_event_mask_unset(ee->prop.window, ECORE_X_EVENT_MASK_WINDOW_DAMAGE);
+                            ecore_x_window_shape_mask_set(ee->prop.window,
+                                                          ee->engine.x.mask);
+                            /* and re-enable them again */
+                            ecore_x_event_mask_set(ee->prop.window, ECORE_X_EVENT_MASK_WINDOW_DAMAGE);
+                         }
+                       ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
+                       ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window,
+                                            ee->engine.x.gc, 0, 0, ee->w, ee->h,
+                                            0, 0);
+                       ecore_x_xregion_free(ee->engine.x.damages);
+                       ee->engine.x.damages = NULL;
+                    }
+                  _ecore_evas_idle_timeout_update(ee);
+                  rend = 1;
+               }
+          }
      }
    else if (((ee->visible) && (ee->draw_ok)) ||
-           ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
-           ((ee->should_be_visible) && (ee->prop.override)))
-     {
-       if (ee->shaped)
-         {
-            Evas_List *updates;
-
-            updates = evas_render_updates(ee->evas);
-            if (updates)
-              {
-                 ecore_x_window_shape_mask_set(ee->engine.x.win, ee->engine.x.mask);
-                 evas_render_updates_free(updates);
-                 _ecore_evas_idle_timeout_update(ee);
-              }
-         }
-       else
-         {
-            Evas_List *updates;
-
-            updates = evas_render_updates(ee->evas);
-            if (updates)
-              {
-#if 0
-//               if (ee->w == 640)
-                   {
-                      Evas_List *l;
-
-                      printf("RENDER [%p] [%i] %ix%i\n",
-                             ee, ee->visible, ee->w, ee->h);
-                      for (l = updates; l; l = l->next)
-                        {
-                           Evas_Rectangle *r;
-
-                           r = l->data;
-                           printf("   render [%i %i %ix%i]\n",
-                                  r->x, r->y, r->w, r->h);
-                        }
-                   }
-#endif
-                 evas_render_updates_free(updates);
-                 if (ee->alpha)
-                   ecore_x_window_shape_input_mask_set(ee->engine.x.win, ee->engine.x.mask);
-                 _ecore_evas_idle_timeout_update(ee);
-              }
-         }
+            ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
+            ((ee->should_be_visible) && (ee->prop.override)))
+     {
+        if (updates)
+          {
+             if (ee->shaped)
+               {
+                  ecore_x_window_shape_mask_set(ee->prop.window,
+                                                ee->engine.x.mask);
+               }
+             if (ee->alpha)
+               {
+//                ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
+               }
+             _ecore_evas_idle_timeout_update(ee);
+             rend = 1;
+          }
      }
    else
      evas_norender(ee->evas);
+   evas_render_updates_free(updates);
+
    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
-}
+/*
+   if (rend)
+     {
+        static int frames = 0;
+        static double t0 = 0.0;
+        double t, td;
 
-static void
-_ecore_evas_x_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
-{
-   ee->mouse.x = x;
-   ee->mouse.y = y;
-   if (ee->prop.cursor.object)
-     {
-       evas_object_show(ee->prop.cursor.object);
-       if (ee->rotation == 0)
-         evas_object_move(ee->prop.cursor.object,
-                          x - ee->prop.cursor.hot.x,
-                          y - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 90)
-         evas_object_move(ee->prop.cursor.object,
-                          ee->h - y - 1 - ee->prop.cursor.hot.x,
-                          x - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 180)
-         evas_object_move(ee->prop.cursor.object,
-                          ee->w - x - 1 - ee->prop.cursor.hot.x,
-                          ee->h - y - 1 - ee->prop.cursor.hot.y);
-       else if (ee->rotation == 270)
-         evas_object_move(ee->prop.cursor.object,
-                          y - ee->prop.cursor.hot.x,
-                          ee->w - x - 1 - ee->prop.cursor.hot.y);
+        t = ecore_time_get();
+        frames++;
+        if ((t - t0) > 1.0)
+          {
+             td = t - t0;
+             printf("FPS: %3.3f\n", (double)frames / td);
+             frames = 0;
+             t0 = t;
+          }
      }
-   if (ee->rotation == 0)
-     evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
-   else if (ee->rotation == 90)
-     evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
-   else if (ee->rotation == 180)
-     evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
-   else if (ee->rotation == 270)
-     evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
-}
-
-static char *
-_ecore_evas_x_winid_str_get(Ecore_X_Window win)
-{
-   const char *vals = "qWeRtYuIoP5-$&<~";
-   static char id[9];
-   unsigned int val;
+ */
 
-   val = (unsigned int)win;
-   id[0] = vals[(val >> 28) & 0xf];
-   id[1] = vals[(val >> 24) & 0xf];
-   id[2] = vals[(val >> 20) & 0xf];
-   id[3] = vals[(val >> 16) & 0xf];
-   id[4] = vals[(val >> 12) & 0xf];
-   id[5] = vals[(val >>  8) & 0xf];
-   id[6] = vals[(val >>  4) & 0xf];
-   id[7] = vals[(val      ) & 0xf];
-   id[8] = 0;
-   return id;
-}
-
-static Ecore_Evas *
-_ecore_evas_x_match(Ecore_X_Window win)
-{
-   Ecore_Evas *ee;
-
-   ee = evas_hash_find(ecore_evases_hash, _ecore_evas_x_winid_str_get(win));
-   return ee;
+   return rend;
 }
 
 static void
 _ecore_evas_x_resize_shape(Ecore_Evas *ee)
 {
-   if (!strcmp(ee->driver, "software_x11") || !strcmp(ee->driver, "software_xcb"))
+   if (!strcmp(ee->driver, "software_x11"))
      {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       Evas_Engine_Info_Software_Xcb *einfo;
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+        Evas_Engine_Info_Software_X11 *einfo;
 
-       einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas);
-# else
-       Evas_Engine_Info_Software_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-       if (einfo)
-         {
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-             xcb_rectangle_t     rectangle;
-            Ecore_X_GC          gc;
-             uint32_t            value_list;
-# else
-            GC gc;
-            XGCValues gcv;
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-
-            if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-            ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-             gc = xcb_generate_id(ecore_x_connection_get());
-            value_list = 0;
-             xcb_create_gc(ecore_x_connection_get(), gc, ee->engine.x.mask,
-                           XCB_GC_FOREGROUND, &value_list);
-             rectangle.x = 0;
-             rectangle.y = 0;
-             rectangle.width = ee->w;
-             rectangle.height = ee->h;
-            xcb_poly_fill_rectangle(ecore_x_connection_get(), ee->engine.x.mask, gc,
-                                     1, &rectangle);
-            xcb_free_gc(ecore_x_connection_get(), gc);
-# else
-            gcv.foreground = 0;
-            gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask,
-                           GCForeground,
-                           &gcv);
-            XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc,
-                           0, 0, ee->w, ee->h);
-            XFreeGC(ecore_x_display_get(), gc);
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-            einfo->info.mask = ee->engine.x.mask;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-            evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-         }
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 || BUILD_ECORE_EVAS_SOFTWARE_XCB */
-     }
-   else if (!strcmp(ee->driver, "xrender_x11") || !strcmp(ee->driver, "xrender_xcb"))
-     {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-       Evas_Engine_Info_XRender_Xcb *einfo;
-
-       einfo = (Evas_Engine_Info_XRender_Xcb *)evas_engine_info_get(ee->evas);
-# else
-       Evas_Engine_Info_XRender_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-       if (einfo)
-         {
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-             xcb_rectangle_t rectangle;
-            Ecore_X_GC      gc;
-             uint32_t        value_list;
-# else
-            GC gc;
-            XGCValues gcv;
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-
-            if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-            ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-             gc = xcb_generate_id(ecore_x_connection_get());
-            value_list = 0;
-            xcb_create_gc(ecore_x_connection_get(), gc, ee->engine.x.mask,
-                           XCB_GC_FOREGROUND, &value_list);
-             rectangle.x = 0;
-             rectangle.y = 0;
-             rectangle.width = ee->w;
-             rectangle.height = ee->h;
-            xcb_poly_fill_rectangle(ecore_x_connection_get(), ee->engine.x.mask, gc,
-                                     1, &rectangle);
-            xcb_free_gc(ecore_x_connection_get(), gc);
-# else
-            gcv.foreground = 0;
-            gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask,
-                           GCForeground,
-                           &gcv);
-            XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc,
-                           0, 0, ee->w, ee->h);
-            XFreeGC(ecore_x_display_get(), gc);
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-            einfo->info.mask = ee->engine.x.mask;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-            evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-
-         }
-#endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
+        einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             unsigned int foreground;
+             Ecore_X_GC gc;
+
+             if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+             ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+             foreground = 0;
+             gc = ecore_x_gc_new(ee->engine.x.mask,
+                                 ECORE_X_GC_VALUE_MASK_FOREGROUND,
+                                 &foreground);
+             ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
+                                             0, 0, ee->w, ee->h);
+             ecore_x_gc_free(gc);
+             einfo->info.mask = ee->engine.x.mask;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+             evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
      }
    else if (!strcmp(ee->driver, "software_16_x11"))
      {
 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
 # if 0 /* XXX no shaped window support for software_16_x11 */
-       Evas_Engine_Info_Software_16_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
-       if (einfo)
-         {
-            GC gc;
-            XGCValues gcv;
-
-            if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-            ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-            einfo->info.mask = ee->engine.x.mask;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-            evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-         }
+        Evas_Engine_Info_Software_16_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+             ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+             einfo->info.mask = ee->engine.x.mask;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+             evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
 # endif /* XXX no shaped window support for software_16_x11 */
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
      }
-}
-
-static void
-_ecore_evas_x_modifier_locks_update(Ecore_Evas *ee, int modifiers)
-{
-   if (modifiers & ECORE_X_MODIFIER_SHIFT)
-     evas_key_modifier_on(ee->evas, "Shift");
-   else
-     evas_key_modifier_off(ee->evas, "Shift");
-   if (modifiers & ECORE_X_MODIFIER_CTRL)
-     evas_key_modifier_on(ee->evas, "Control");
-   else
-     evas_key_modifier_off(ee->evas, "Control");
-   if (modifiers & ECORE_X_MODIFIER_ALT)
-     evas_key_modifier_on(ee->evas, "Alt");
-   else
-     evas_key_modifier_off(ee->evas, "Alt");
-   if (modifiers & ECORE_X_MODIFIER_WIN)
-     {
-       evas_key_modifier_on(ee->evas, "Super");
-       evas_key_modifier_on(ee->evas, "Hyper");
-     }
-   else
+   if (!strcmp(ee->driver, "software_8_x11"))
      {
-       evas_key_modifier_off(ee->evas, "Super");
-       evas_key_modifier_off(ee->evas, "Hyper");
-     }
-   if (modifiers & ECORE_X_LOCK_SCROLL)
-     evas_key_lock_on(ee->evas, "Scroll_Lock");
-   else
-     evas_key_lock_off(ee->evas, "Scroll_Lock");
-   if (modifiers & ECORE_X_LOCK_NUM)
-     evas_key_lock_on(ee->evas, "Num_Lock");
-   else
-     evas_key_lock_off(ee->evas, "Num_Lock");
-   if (modifiers & ECORE_X_LOCK_CAPS)
-     evas_key_lock_on(ee->evas, "Caps_Lock");
-   else
-     evas_key_lock_off(ee->evas, "Caps_Lock");
-}
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+        Evas_Engine_Info_Software_8_X11 *einfo;
 
-static int
-_ecore_evas_x_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas *ee;
-   Ecore_X_Event_Key_Down *e;
-
-   e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   evas_event_feed_key_down(ee->evas, e->keyname, e->keysymbol, e->key_compose, NULL, e->time, NULL);
-   return 1;
-}
-
-static int
-_ecore_evas_x_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas *ee;
-   Ecore_X_Event_Key_Up *e;
-
-   e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   evas_event_feed_key_up(ee->evas, e->keyname, e->keysymbol, e->key_compose, NULL, e->time, NULL);
-   return 1;
-}
-
-static int
-_ecore_evas_x_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas *ee;
-   Ecore_X_Event_Mouse_Button_Down *e;
-   Evas_Button_Flags flags = EVAS_BUTTON_NONE;
-
-   e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_down(ee->evas, e->button, flags, e->time, NULL);
-   return 1;
-}
-
-static int
-_ecore_evas_x_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas *ee;
-   Ecore_X_Event_Mouse_Button_Up *e;
-   Evas_Button_Flags flags = EVAS_BUTTON_NONE;
-
-   e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-   evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
-   return 1;
-}
-
-static int
-_ecore_evas_x_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
-{
-   Ecore_Evas *ee;
-   Ecore_X_Event_Mouse_Wheel *e;
-
-   e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   evas_event_feed_mouse_wheel(ee->evas, e->direction, e->z, e->time, NULL);
-
-   return 1;
+        einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             unsigned int foreground;
+             Ecore_X_GC gc;
+
+             if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+             ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+             foreground = 0;
+             gc = ecore_x_gc_new(ee->engine.x.mask,
+                                 ECORE_X_GC_VALUE_MASK_FOREGROUND,
+                                 &foreground);
+             ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
+                                             0, 0, ee->w, ee->h);
+             ecore_x_gc_free(gc);
+             einfo->info.mask = ee->engine.x.mask;
+             if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+               {
+                  ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+               }
+             evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
+     }
 }
 
 /* TODO: we need to make this work for all the states, not just sticky */
-static int
+static Eina_Bool
 _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Property *e;
+   int state_change = 0;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
+   ee = ecore_event_window_match(e->win);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
    if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
      {
-       unsigned int i, num;
-       Ecore_X_Window_State *state;
-       int sticky;
-
-#ifdef HAVE_ECORE_X_XCB
-        ecore_x_netwm_window_state_get_prefetch(e->win);
-#endif /* HAVE_ECORE_X_XCB */
-       sticky = 0;
-
-       /* TODO: we need to move those to the end, with if statements */
-       ee->engine.x.state.modal = 0;
-       ee->engine.x.state.maximized_v = 0;
-       ee->engine.x.state.maximized_h = 0;
-       ee->engine.x.state.shaded = 0;
-       ee->engine.x.state.skip_taskbar = 0;
-       ee->engine.x.state.skip_pager = 0;
-       ee->prop.fullscreen = 0;
-       ee->engine.x.state.fullscreen = 0;
-       ee->engine.x.state.above = 0;
-       ee->engine.x.state.below = 0;
-
-#ifdef HAVE_ECORE_X_XCB
-        ecore_x_netwm_window_state_get_fetch();
-#endif /* HAVE_ECORE_X_XCB */
-       ecore_x_netwm_window_state_get(e->win, &state, &num);
-       if (state)
-         {
-            for (i = 0; i < num; i++)
-              {
-                 switch (state[i])
-                   {
-                    case ECORE_X_WINDOW_STATE_MODAL:
-                       ee->engine.x.state.modal = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_STICKY:
-                       if (ee->prop.sticky && ee->engine.x.state.sticky)
-                         break;
-
-                       sticky = 1;
-                       ee->prop.sticky = 1;
-                       ee->engine.x.state.sticky = 1;
-                       if (ee->func.fn_sticky) ee->func.fn_sticky(ee);
-                       break;
-                    case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
-                       ee->engine.x.state.maximized_v = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
-                       ee->engine.x.state.maximized_h = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_SHADED:
-                       ee->engine.x.state.shaded = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
-                       ee->engine.x.state.skip_taskbar = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_SKIP_PAGER:
-                       ee->engine.x.state.skip_pager = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_FULLSCREEN:
-                       ee->prop.fullscreen = 1;
-                       ee->engine.x.state.fullscreen = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_ABOVE:
-                       ee->engine.x.state.above = 1;
-                       break;
-                    case ECORE_X_WINDOW_STATE_BELOW:
-                       ee->engine.x.state.below = 1;
-                       break;
-                    default:
-                       break;
-                   }
-              }
-            free(state);
-         }
-#ifdef HAVE_ECORE_X_XCB
-        ecore_xcb_reply_free();
-#endif /* HAVE_ECORE_X_XCB */
-
-       if (ee->prop.sticky && !sticky)
-         {
-            ee->prop.sticky = 0;
-            ee->engine.x.state.sticky = 0;
-            if (ee->func.fn_unsticky) ee->func.fn_unsticky(ee);
-         }
+        unsigned int i, num;
+        Ecore_X_Window_State *state;
+        struct {
+           struct {
+              unsigned char modal : 1;
+              unsigned char sticky : 1;
+              unsigned char maximized_v : 1;
+              unsigned char maximized_h : 1;
+              unsigned char shaded : 1;
+              unsigned char skip_taskbar : 1;
+              unsigned char skip_pager : 1;
+              unsigned char fullscreen : 1;
+              unsigned char above : 1;
+              unsigned char below : 1;
+           } x;
+           struct {
+              char modal : 1;
+              char maximized : 1;
+              char sticky : 1;
+              char fullscreen : 1;
+              char focus_skip : 1;
+           } prop;
+        } prev;
+        
+        prev.x.modal = ee->engine.x.state.modal;
+        prev.x.sticky = ee->engine.x.state.sticky;
+        prev.x.maximized_v = ee->engine.x.state.maximized_v;
+        prev.x.maximized_h = ee->engine.x.state.maximized_h;
+        prev.x.shaded = ee->engine.x.state.shaded;
+        prev.x.skip_taskbar = ee->engine.x.state.skip_taskbar;
+        prev.x.skip_pager = ee->engine.x.state.skip_pager;
+        prev.x.fullscreen = ee->engine.x.state.fullscreen;
+        prev.x.above = ee->engine.x.state.above;
+        prev.x.below = ee->engine.x.state.below;
+        
+        prev.prop.modal = ee->prop.modal;
+        prev.prop.maximized = ee->prop.maximized;
+        prev.prop.sticky = ee->prop.sticky;
+        prev.prop.fullscreen = ee->prop.fullscreen;
+        prev.prop.focus_skip = ee->prop.focus_skip;
+
+        ee->engine.x.state.modal        = 0;
+        ee->engine.x.state.sticky       = 0;
+        ee->engine.x.state.maximized_v  = 0;
+        ee->engine.x.state.maximized_h  = 0;
+        ee->engine.x.state.shaded       = 0;
+        ee->engine.x.state.skip_taskbar = 0;
+        ee->engine.x.state.skip_pager   = 0;
+        ee->engine.x.state.fullscreen   = 0;
+        ee->engine.x.state.above        = 0;
+        ee->engine.x.state.below        = 0;
+
+        ee->prop.modal      = 0;
+        ee->prop.maximized  = 0;
+        ee->prop.sticky     = 0;
+        ee->prop.fullscreen = 0;
+        ee->prop.focus_skip = 0;
+        
+        ecore_x_netwm_window_state_get(e->win, &state, &num);
+        if (state)
+          {
+             for (i = 0; i < num; i++)
+               {
+                  switch (state[i])
+                    {
+                     case ECORE_X_WINDOW_STATE_MODAL:
+                       ee->engine.x.state.modal = 1;
+                       ee->prop.modal = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_STICKY:
+                       ee->prop.sticky = 1;
+                       ee->engine.x.state.sticky = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
+                       ee->engine.x.state.maximized_v = 1;
+                       ee->prop.maximized = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
+                       ee->engine.x.state.maximized_h = 1;
+                       ee->prop.maximized = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_SHADED:
+                       ee->engine.x.state.shaded = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
+                       ee->engine.x.state.skip_taskbar = 1;
+                       ee->prop.focus_skip = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_SKIP_PAGER:
+                       ee->engine.x.state.skip_pager = 1;
+                       ee->prop.focus_skip = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_FULLSCREEN:
+                       ee->prop.fullscreen = 1;
+                       ee->engine.x.state.fullscreen = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_ABOVE:
+                       ee->engine.x.state.above = 1;
+                       break;
+                     case ECORE_X_WINDOW_STATE_BELOW:
+                       ee->engine.x.state.below = 1;
+                       break;
+                     default:
+                        break;
+                    }
+               }
+             free(state);
+          }
+        if (
+//                 (prev.x.modal != ee->engine.x.state.modal) ||
+            (prev.x.sticky != ee->engine.x.state.sticky) ||
+            (prev.x.maximized_v != ee->engine.x.state.maximized_v) ||
+            (prev.x.maximized_h != ee->engine.x.state.maximized_h) ||
+//                 (prev.x.shaded != ee->engine.x.state.shaded) ||
+//                 (prev.x.skip_taskbar != ee->engine.x.state.skip_taskbar) ||
+//                 (prev.x.skip_pager != ee->engine.x.state.skip_pager) ||
+            (prev.x.fullscreen != ee->engine.x.state.fullscreen) ||
+//                 (prev.x.above != ee->engine.x.state.above) ||
+//                 (prev.x.below != ee->engine.x.state.below) ||
+//                 (prev.prop.modal != ee->prop.modal) ||
+            (prev.prop.maximized != ee->prop.maximized) ||
+            (prev.prop.sticky != ee->prop.sticky) ||
+            (prev.prop.fullscreen != ee->prop.fullscreen) ||
+            (prev.prop.focus_skip != ee->prop.focus_skip))
+          state_change = 1;
      }
+   else if (e->atom == ECORE_X_ATOM_WM_STATE)
+     {
+        Ecore_X_Window_State_Hint state;
+        
+        // handle WM_STATE changes
+        state = ecore_x_icccm_state_get(e->win);
+        switch (state)
+          {
+           case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
+             if ((!ee->prop.withdrawn) || (ee->prop.iconified))
+               {
+                  state_change = 1;
+                  ee->prop.withdrawn = 1;
+                  ee->prop.iconified = 0;
+               }
+             break;
+           case ECORE_X_WINDOW_STATE_HINT_ICONIC:
+             if ((!ee->prop.iconified) || (ee->prop.withdrawn))
+               {
+                  state_change = 1;
+                  ee->prop.iconified = 1;
+                  ee->prop.withdrawn = 0;
+               }
+             break;
+           case ECORE_X_WINDOW_STATE_HINT_NORMAL:
+             if ((ee->prop.iconified) || (ee->prop.withdrawn))
+               {
+                  state_change = 1;
+                  ee->prop.iconified = 0;
+                  ee->prop.withdrawn = 0;
+               }
+             break;
+           default:
+             break;
+          }
+     }
+   else if (e->atom == ECORE_X_ATOM_E_PROFILE)
+     {
+        char *p = ecore_x_e_window_profile_get(e->win);
+        if ((p) && (ee->prop.profile))
+          {
+             if (strcmp(p, ee->prop.profile) != 0)
+               {
+                  free(ee->prop.profile);
+                  ee->prop.profile = strdup(p);
+                  state_change = 1;
+               }
+          }
+        else if ((!p) && (ee->prop.profile))
+          {
+             free(ee->prop.profile);
+             ee->prop.profile = NULL;
+             state_change = 1;
+          }
+        else if ((p) && (!ee->prop.profile))
+          {
+             ee->prop.profile = strdup(p);
+             state_change = 1;
+          }
 
-   return 1;
+        if (p)
+          free(p);
+     }
+
+   if (state_change)
+     {
+        if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_visibility_change(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Visibility_Change *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if (!ee) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
 //   printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
-   if (e->fully_obscured) ee->draw_ok = 0;
-   else ee->draw_ok = 1;
-   return 1;
+   if (e->fully_obscured)
+     {
+        /* FIXME: round trip */
+        if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
+          ee->draw_ok = 0;
+     }
+   else
+     ee->draw_ok = 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
-_ecore_evas_x_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
+static Eina_Bool
+_ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
-   Ecore_X_Event_Mouse_Move *e;
+   Ecore_X_Event_Client_Message *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   _ecore_evas_x_mouse_move_process(ee, e->x, e->y, e->time);
-   return 1;
+   if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
+   if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_BEGIN)
+     {
+        ee = ecore_event_window_match(e->data.l[0]);
+        if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+        if (e->data.l[0] != (long)ee->prop.window)
+          return ECORE_CALLBACK_PASS_ON;
+        if (!ee->engine.x.sync_began)
+          {
+             // qeue a damage + draw. work around an event re-ordering thing.
+             evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
+        ee->engine.x.sync_began = 1;
+        ee->engine.x.sync_cancel = 0;
+     }
+   else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
+     {
+        ee = ecore_event_window_match(e->data.l[0]);
+        if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+        if (e->data.l[0] != (long)ee->prop.window)
+          return ECORE_CALLBACK_PASS_ON;
+        ee->engine.x.sync_began = 0;
+        ee->engine.x.sync_cancel = 0;
+     }
+   else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
+     {
+        ee = ecore_event_window_match(e->data.l[0]);
+        if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+        if (e->data.l[0] != (long)ee->prop.window)
+          return ECORE_CALLBACK_PASS_ON;
+        ee->engine.x.sync_began = 0;
+        ee->engine.x.sync_cancel = 1;
+     }
+   else if ((e->message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
+            (e->data.l[0] == (int)ECORE_X_ATOM_NET_WM_SYNC_REQUEST))
+     {
+        ee = ecore_event_window_match(e->win);
+        if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+        ee->engine.x.netwm_sync_val_lo = (unsigned int)e->data.l[2];
+        ee->engine.x.netwm_sync_val_hi = (int)e->data.l[3];
+        ee->engine.x.netwm_sync_set = 1;
+     }
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Mouse_In *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-/*
+   ee = ecore_event_window_match(e->win);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+/*    { */
+/*       time_t t; */
+/*       char *ct; */
+
+/*       const char *modes[] = { */
+/*        "MODE_NORMAL", */
+/*        "MODE_WHILE_GRABBED", */
+/*        "MODE_GRAB", */
+/*        "MODE_UNGRAB" */
+/*       }; */
+/*       const char *details[] = { */
+/*        "DETAIL_ANCESTOR", */
+/*        "DETAIL_VIRTUAL", */
+/*        "DETAIL_INFERIOR", */
+/*        "DETAIL_NON_LINEAR", */
+/*        "DETAIL_NON_LINEAR_VIRTUAL", */
+/*        "DETAIL_POINTER", */
+/*        "DETAIL_POINTER_ROOT", */
+/*        "DETAIL_DETAIL_NONE" */
+/*       }; */
+/*       t = time(NULL); */
+/*       ct = ctime(&t); */
+/*       ct[strlen(ct) - 1] = 0; */
+/*       printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n", */
+/*             e->win, e->event_win, */
+/*             ct, */
+/*             modes[e->mode], */
+/*             details[e->detail]); */
+/*    } */
+   // disable. causes more problems than it fixes
+   //   if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
+   //       (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
+   //     return 0;
+   /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
+   if (!ee->in)
      {
-       time_t t;
-       char *ct;
-
-       const char *modes[] = {
-          "MODE_NORMAL",
-            "MODE_WHILE_GRABBED",
-            "MODE_GRAB",
-            "MODE_UNGRAB"
-       };
-       const char *details[] = {
-          "DETAIL_ANCESTOR",
-            "DETAIL_VIRTUAL",
-            "DETAIL_INFERIOR",
-            "DETAIL_NON_LINEAR",
-            "DETAIL_NON_LINEAR_VIRTUAL",
-            "DETAIL_POINTER",
-            "DETAIL_POINTER_ROOT",
-            "DETAIL_DETAIL_NONE"
-       };
-       t = time(NULL);
-       ct = ctime(&t);
-       ct[strlen(ct) - 1] = 0;
-       printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n",
-              e->win, e->event_win,
-              ct,
-              modes[e->mode],
-              details[e->detail]);
+        if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
+        ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
+        evas_event_feed_mouse_in(ee->evas, e->time, NULL);
+        _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
+        ee->in = EINA_TRUE;
      }
- */
-// disable. causes mroe problems than it fixes
-//   if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
-//       (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
-//     return 0;
-/* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
-   if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   evas_event_feed_mouse_in(ee->evas, e->time, NULL);
-   _ecore_evas_x_mouse_move_process(ee, e->x, e->y, e->time);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Mouse_Out *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-/*
+   ee = ecore_event_window_match(e->win);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
+   /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+/*    { */
+/*       time_t t; */
+/*       char *ct; */
+
+/*       const char *modes[] = { */
+/*        "MODE_NORMAL", */
+/*        "MODE_WHILE_GRABBED", */
+/*        "MODE_GRAB", */
+/*        "MODE_UNGRAB" */
+/*       }; */
+/*       const char *details[] = { */
+/*        "DETAIL_ANCESTOR", */
+/*        "DETAIL_VIRTUAL", */
+/*        "DETAIL_INFERIOR", */
+/*        "DETAIL_NON_LINEAR", */
+/*        "DETAIL_NON_LINEAR_VIRTUAL", */
+/*        "DETAIL_POINTER", */
+/*        "DETAIL_POINTER_ROOT", */
+/*        "DETAIL_DETAIL_NONE" */
+/*       }; */
+/*       t = time(NULL); */
+/*       ct = ctime(&t); */
+/*       ct[strlen(ct) - 1] = 0; */
+/*       printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n", */
+/*             e->win, e->event_win, */
+/*             ct, */
+/*             modes[e->mode], */
+/*             details[e->detail]); */
+/*    } */
+   // disable. causes more problems than it fixes
+   //   if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
+   //       (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
+   //     return 0;
+   /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
+//   printf("OUT: ee->in=%i, e->mode=%i, e->detail=%i, dount_count=%i\n",
+//          ee->in, e->mode, e->detail, evas_event_down_count_get(ee->evas));
+   if (ee->in)
      {
-       time_t t;
-       char *ct;
-
-       const char *modes[] = {
-          "MODE_NORMAL",
-            "MODE_WHILE_GRABBED",
-            "MODE_GRAB",
-            "MODE_UNGRAB"
-       };
-       const char *details[] = {
-          "DETAIL_ANCESTOR",
-            "DETAIL_VIRTUAL",
-            "DETAIL_INFERIOR",
-            "DETAIL_NON_LINEAR",
-            "DETAIL_NON_LINEAR_VIRTUAL",
-            "DETAIL_POINTER",
-            "DETAIL_POINTER_ROOT",
-            "DETAIL_DETAIL_NONE"
-       };
-       t = time(NULL);
-       ct = ctime(&t);
-       ct[strlen(ct) - 1] = 0;
-       printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n",
-              e->win, e->event_win,
-              ct,
-              modes[e->mode],
-              details[e->detail]);
+        if ((evas_event_down_count_get(ee->evas) > 0) &&
+            (!((e->mode == ECORE_X_EVENT_MODE_GRAB) &&
+               (e->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR))))
+          return ECORE_CALLBACK_PASS_ON;
+        ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
+        _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
+        if (e->mode == ECORE_X_EVENT_MODE_GRAB)
+          evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
+        evas_event_feed_mouse_out(ee->evas, e->time, NULL);
+        if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
+        if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
+        ee->in = EINA_FALSE;
      }
- */
-// disable. causes more problems than it fixes
-//   if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
-//       (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
-//     return 0;
-/* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
-   _ecore_evas_x_modifier_locks_update(ee, e->modifiers);
-   _ecore_evas_x_mouse_move_process(ee, e->x, e->y, e->time);
-   if (e->mode == ECORE_X_EVENT_MODE_GRAB)
-     evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
-   evas_event_feed_mouse_out(ee->evas, e->time, NULL);
-   if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
-   if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Focus_In *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
+   ee = ecore_event_window_match(e->win);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+//xx// filtering with these doesnt help   
+//xx//   if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) return ECORE_CALLBACK_PASS_ON;
    ee->prop.focused = 1;
+   evas_focus_in(ee->evas);
    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Focus_Out *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   if (ee->prop.fullscreen)
-     ecore_x_window_focus(ee->engine.x.win);
+   ee = ecore_event_window_match(e->win);
+   if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+//xx// filtering with these doesnt help   
+//xx//   if (e->mode == ECORE_X_EVENT_MODE_GRAB) return ECORE_CALLBACK_PASS_ON;
+
+//   if (ee->prop.fullscreen)
+//     ecore_x_window_focus(ee->prop.window);
+   evas_focus_out(ee->evas);
    ee->prop.focused = 0;
    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Damage *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if (!ee) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   if (ee->engine.x.using_bg_pixmap) return 1;
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
 //   printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
    if (ee->prop.avoid_damage)
      {
-#ifdef HAVE_ECORE_X_XCB
-# warning [XCB] No Region code
-#else
-       XRectangle xr;
-       Region tmpr;
-
-       if (!ee->engine.x.damages) ee->engine.x.damages = XCreateRegion();
-       tmpr = XCreateRegion();
-       xr.x = e->x;
-       xr.y = e->y;
-       xr.width = e->w;
-       xr.height = e->h;
-       XUnionRectWithRegion(&xr, ee->engine.x.damages, tmpr);
-       XDestroyRegion(ee->engine.x.damages);
-       ee->engine.x.damages = tmpr;
+        Ecore_X_Rectangle rect;
+        Ecore_X_XRegion *tmpr;
+
+        if (!ee->engine.x.damages)
+          ee->engine.x.damages = ecore_x_xregion_new();
+        tmpr = ecore_x_xregion_new();
+        rect.x = e->x;
+        rect.y = e->y;
+        rect.width = e->w;
+        rect.height = e->h;
+        ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
+        ecore_x_xregion_free(ee->engine.x.damages);
+        ee->engine.x.damages = tmpr;
 /* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
  *  the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
-       Ecore_X_Rectangle rect;
-       Ecore_X_Region    tmpr;
-
-       if (!ee->engine.x.damages) ee->engine.x.damages = XCreateRegion();
-       tmpr = XCreateRegion();
-       rect.x = e->x;
-       rect.y = e->y;
-       rect.width = e->w;
-       rect.height = e->h;
-       XUnionRectWithRegion(&rect, ee->engine.x.damages, tmpr);
-       XDestroyRegion(ee->engine.x.damages);
-       ee->engine.x.damages = tmpr;
+        Ecore_X_Rectangle rect;
+        Ecore_X_XRegion  *tmpr;
+
+        if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
+        tmpr = ecore_x_xregion_new();
+        rect.x = e->x;
+        rect.y = e->y;
+        rect.width = e->w;
+        rect.height = e->h;
+        ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
+        ecore_x_xregion_free(ee->engine.x.damages);
+        ee->engine.x.damages = tmpr;
  */
-#endif /* ! HAVE_ECORE_X_XCB */
      }
    else
      {
-       if (ee->rotation == 0)
-         evas_damage_rectangle_add(ee->evas,
-                                   e->x,
-                                   e->y,
-                                   e->w, e->h);
-       else if (ee->rotation == 90)
-         evas_damage_rectangle_add(ee->evas,
-                                   ee->h - e->y - e->h,
-                                   e->x,
-                                   e->h, e->w);
-       else if (ee->rotation == 180)
-         evas_damage_rectangle_add(ee->evas,
-                                   ee->w - e->x - e->w,
-                                   ee->h - e->y - e->h,
-                                   e->w, e->h);
-       else if (ee->rotation == 270)
-         evas_damage_rectangle_add(ee->evas,
-                                   e->y,
-                                   ee->w - e->x - e->w,
-                                   e->h, e->w);
+        if (ee->rotation == 0)
+          evas_damage_rectangle_add(ee->evas, e->x, e->y, e->w, e->h);
+        else if (ee->rotation == 90)
+          evas_damage_rectangle_add(ee->evas,
+                                    ee->h - e->y - e->h, e->x, e->h, e->w);
+        else if (ee->rotation == 180)
+          evas_damage_rectangle_add(ee->evas, ee->w - e->x - e->w,
+                                    ee->h - e->y - e->h, e->w, e->h);
+        else if (ee->rotation == 270)
+          evas_damage_rectangle_add(ee->evas, e->y, ee->w - e->x - e->w,
+                                    e->h, e->w);
      }
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Destroy *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if (!ee) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
    if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
+   _ecore_evas_x_sync_clear(ee);
    ecore_evas_free(ee);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Configure *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if (!ee) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   if (ee->engine.x.direct_resize) return 1;
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
 
+   ee->engine.x.configure_coming = 0;
    if ((e->from_wm) || (ee->prop.override))
      {
-       if ((ee->x != e->x) || (ee->y != e->y))
-         {
-            ee->x = e->x;
-            ee->y = e->y;
-            if (ee->func.fn_move) ee->func.fn_move(ee);
-         }
+        if ((ee->x != e->x) || (ee->y != e->y))
+          {
+             ee->x = e->x;
+             ee->y = e->y;
+             ee->req.x = ee->x;
+             ee->req.y = ee->y;
+             if (ee->func.fn_move) ee->func.fn_move(ee);
+          }
      }
    if ((ee->w != e->w) || (ee->h != e->h))
      {
-       ee->w = e->w;
-       ee->h = e->h;
-       if ((ee->rotation == 90) || (ee->rotation == 270))
-         {
-            evas_output_size_set(ee->evas, ee->h, ee->w);
-            evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
-         }
-       else
-         {
-            evas_output_size_set(ee->evas, ee->w, ee->h);
-            evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-         }
-       if (ee->prop.avoid_damage)
-         {
-            int pdam;
-
-            pdam = ecore_evas_avoid_damage_get(ee);
-            ecore_evas_avoid_damage_set(ee, 0);
-            ecore_evas_avoid_damage_set(ee, pdam);
-         }
-       if ((ee->shaped) || (ee->alpha))
-         _ecore_evas_x_resize_shape(ee);
-       if ((ee->expecting_resize.w > 0) &&
-           (ee->expecting_resize.h > 0))
-         {
-            if ((ee->expecting_resize.w == ee->w) &&
-                (ee->expecting_resize.h == ee->h))
-              _ecore_evas_x_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
-                                               ecore_x_current_time_get());
-            ee->expecting_resize.w = 0;
-            ee->expecting_resize.h = 0;
-         }
-       if (ee->func.fn_resize) ee->func.fn_resize(ee);
+        ee->w = e->w;
+        ee->h = e->h;
+        ee->req.w = ee->w;
+        ee->req.h = ee->h;
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, ee->h, ee->w);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+          }
+        else
+          {
+             evas_output_size_set(ee->evas, ee->w, ee->h);
+             evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+          }
+        if (ee->prop.avoid_damage)
+          {
+             int pdam;
+
+             pdam = ecore_evas_avoid_damage_get(ee);
+             ecore_evas_avoid_damage_set(ee, 0);
+             ecore_evas_avoid_damage_set(ee, pdam);
+          }
+        if ((ee->shaped) || (ee->alpha))
+          _ecore_evas_x_resize_shape(ee);
+        if ((ee->expecting_resize.w > 0) && (ee->expecting_resize.h > 0))
+          {
+             if ((ee->expecting_resize.w == ee->w) &&
+                 (ee->expecting_resize.h == ee->h))
+               _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                              ecore_x_current_time_get());
+             ee->expecting_resize.w = 0;
+             ee->expecting_resize.h = 0;
+          }
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
      }
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Delete_Request *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if (!ee) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Show *e;
+   static int first_map_bug = -1;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if (!ee) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   if (ee->visible) return 0; /* dont pass it on */
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   /* some GL drivers are doing buffer copy in a separate thread.
+    * we need to check whether GL driver sends SYNC_DRAW_DONE msg afger copying
+    * that are required in order to exactly render. - added by gl77.lee
+    */
+   if (ee->gl_sync_draw_done < 0)
+     {
+        if (getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"))
+           ee->gl_sync_draw_done = atoi(getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"));
+        else
+           ee->gl_sync_draw_done = 0;
+     }
+   if (first_map_bug < 0)
+     {
+        char *bug = NULL;
+
+        if ((bug = getenv("ECORE_EVAS_GL_FIRST_MAP_BUG")))
+          first_map_bug = atoi(bug);
+        else
+          first_map_bug = 0;
+     }
+   if ((first_map_bug) && (!strcmp(ee->driver, "opengl_x11")))
+     evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+   if (ee->visible) return ECORE_CALLBACK_PASS_ON;
+//   if (ee->visible) return ECORE_CALLBACK_DONE;
 //   printf("SHOW EVENT %p\n", ee);
    ee->visible = 1;
    if (ee->func.fn_show) ee->func.fn_show(ee);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
-static int
+static Eina_Bool
 _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Hide *e;
 
    e = event;
-   ee = _ecore_evas_x_match(e->win);
-   if (!ee) return 1; /* pass on event */
-   if (e->win != ee->engine.x.win) return 1;
-   if (!ee->visible) return 0; /* dont pass it on */
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   if (ee->in)
+     {
+        evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
+        evas_event_feed_mouse_out(ee->evas, e->time, NULL);
+        if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
+        if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
+        ee->in = EINA_FALSE;
+     }
+   if (!ee->visible) return ECORE_CALLBACK_PASS_ON;
+//   if (!ee->visible) return ECORE_CALLBACK_DONE;
 //   printf("HIDE EVENT %p\n", ee);
    ee->visible = 0;
    if (ee->func.fn_hide) ee->func.fn_hide(ee);
-   return 1;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
 /* FIXME, should be in idler */
@@ -1147,26 +1195,19 @@ _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void
 static void
 _ecore_evas_x_size_pos_hints_update(Ecore_Evas *ee)
 {
-# ifdef HAVE_ECORE_X_XCB
-   ecore_x_icccm_size_pos_hints_get_prefetch(ee->engine.x.win);
-   ecore_x_icccm_size_pos_hints_get_fetch();
-# endif /* HAVE_ECORE_X_XCB */
-   ecore_x_icccm_size_pos_hints_set(ee->engine.x.win,
-                                   ee->prop.request_pos /*request_pos */,
-                                   ECORE_X_GRAVITY_NW /* gravity */,
-                                   ee->prop.min.w /* min_w */,
-                                   ee->prop.min.h /* min_h */,
-                                   ee->prop.max.w /* max_w */,
-                                   ee->prop.max.h /* max_h */,
-                                   ee->prop.base.w /* base_w */,
-                                   ee->prop.base.h /* base_h */,
-                                   ee->prop.step.w /* step_x */,
-                                   ee->prop.step.h /* step_y */,
-                                   0 /* min_aspect */,
-                                   0 /* max_aspect */);
-# ifdef HAVE_ECORE_X_XCB
-   ecore_xcb_reply_free();
-# endif /* HAVE_ECORE_X_XCB */
+   ecore_x_icccm_size_pos_hints_set(ee->prop.window,
+                                    ee->prop.request_pos /*request_pos */,
+                                    ECORE_X_GRAVITY_NW /* gravity */,
+                                    ee->prop.min.w /* min_w */,
+                                    ee->prop.min.h /* min_h */,
+                                    ee->prop.max.w /* max_w */,
+                                    ee->prop.max.h /* max_h */,
+                                    ee->prop.base.w /* base_w */,
+                                    ee->prop.base.h /* base_h */,
+                                    ee->prop.step.w /* step_x */,
+                                    ee->prop.step.h /* step_y */,
+                                    ee->prop.aspect /* min_aspect */,
+                                    ee->prop.aspect /* max_aspect */);
 }
 
 /* FIXME, should be in idler */
@@ -1174,38 +1215,34 @@ static void
 _ecore_evas_x_state_update(Ecore_Evas *ee)
 {
    Ecore_X_Window_State state[10];
-   int num;
+   int num = 0;
 
-   num = 0;
-
-   /*
-   if (bd->client.netwm.state.modal)
+   if (ee->prop.modal)
      state[num++] = ECORE_X_WINDOW_STATE_MODAL;
-   */
-   if (ee->engine.x.state.sticky)
+   if (ee->prop.sticky)
      state[num++] = ECORE_X_WINDOW_STATE_STICKY;
-   /*
-   if (bd->client.netwm.state.maximized_v)
+   if (ee->prop.maximized)
      state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
-   if (bd->client.netwm.state.maximized_h)
+   if (ee->prop.maximized)
      state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
-   if (bd->client.netwm.state.shaded)
-     state[num++] = ECORE_X_WINDOW_STATE_SHADED;
-   if (bd->client.netwm.state.skip_taskbar)
+//   if (bd->client.netwm.state.shaded)
+//     state[num++] = ECORE_X_WINDOW_STATE_SHADED;
+   if (ee->prop.focus_skip)
      state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
-   if (bd->client.netwm.state.skip_pager)
+   if (ee->prop.focus_skip)
      state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
-   if (bd->client.netwm.state.hidden)
-     state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
-   */
+//   if (bd->client.netwm.state.hidden)
+//     state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
    if (ee->engine.x.state.fullscreen)
      state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
    if (ee->engine.x.state.above)
      state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
    if (ee->engine.x.state.below)
      state[num++] = ECORE_X_WINDOW_STATE_BELOW;
+   if (ee->prop.demand_attention)
+     state[num++] = ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
 
-   ecore_x_netwm_window_state_set(ee->engine.x.win, state, num);
+   ecore_x_netwm_window_state_set(ee->prop.window, state, num);
 }
 
 static void
@@ -1213,881 +1250,1217 @@ _ecore_evas_x_layer_update(Ecore_Evas *ee)
 {
    if (ee->should_be_visible)
      {
-       /* We need to send a netwm request to the wm */
-       /* FIXME: Do we have to remove old state before adding new? */
-       if (ee->prop.layer < 3)
-         {
-            if (ee->engine.x.state.above)
-              {
-                 ee->engine.x.state.above = 0;
-                 ecore_x_netwm_state_request_send(ee->engine.x.win,
-                                                  ee->engine.x.win_root,
-                                                  ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
-              }
-            if (!ee->engine.x.state.below)
-              {
-                 ee->engine.x.state.below = 1;
-                 ecore_x_netwm_state_request_send(ee->engine.x.win,
-                                                  ee->engine.x.win_root,
-                                                  ECORE_X_WINDOW_STATE_BELOW, -1, 1);
-              }
-         }
-       else if (ee->prop.layer > 5)
-         {
-            if (ee->engine.x.state.below)
-              {
-                 ee->engine.x.state.below = 0;
-                 ecore_x_netwm_state_request_send(ee->engine.x.win,
-                                                  ee->engine.x.win_root,
-                                                  ECORE_X_WINDOW_STATE_BELOW, -1, 0);
-              }
-            if (!ee->engine.x.state.above)
-              {
-                 ee->engine.x.state.above = 1;
-                 ecore_x_netwm_state_request_send(ee->engine.x.win,
-                                                  ee->engine.x.win_root,
-                                                  ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
-              }
-         }
-       else
-         {
-            if (ee->engine.x.state.below)
-              {
-                 ee->engine.x.state.below = 0;
-                 ecore_x_netwm_state_request_send(ee->engine.x.win,
-                                                  ee->engine.x.win_root,
-                                                  ECORE_X_WINDOW_STATE_BELOW, -1, 0);
-              }
-            if (ee->engine.x.state.above)
-              {
-                 ee->engine.x.state.above = 0;
-                 ecore_x_netwm_state_request_send(ee->engine.x.win,
-                                                  ee->engine.x.win_root,
-                                                  ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
-              }
-         }
+        /* We need to send a netwm request to the wm */
+        /* FIXME: Do we have to remove old state before adding new? */
+        if (ee->prop.layer < 3)
+          {
+             if (ee->engine.x.state.above)
+               {
+                  ee->engine.x.state.above = 0;
+                  ecore_x_netwm_state_request_send(ee->prop.window,
+                                                   ee->engine.x.win_root,
+                                                   ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
+               }
+             if (!ee->engine.x.state.below)
+               {
+                  ee->engine.x.state.below = 1;
+                  ecore_x_netwm_state_request_send(ee->prop.window,
+                                                   ee->engine.x.win_root,
+                                                   ECORE_X_WINDOW_STATE_BELOW, -1, 1);
+               }
+          }
+        else if (ee->prop.layer > 5)
+          {
+             if (ee->engine.x.state.below)
+               {
+                  ee->engine.x.state.below = 0;
+                  ecore_x_netwm_state_request_send(ee->prop.window,
+                                                   ee->engine.x.win_root,
+                                                   ECORE_X_WINDOW_STATE_BELOW, -1, 0);
+               }
+             if (!ee->engine.x.state.above)
+               {
+                  ee->engine.x.state.above = 1;
+                  ecore_x_netwm_state_request_send(ee->prop.window,
+                                                   ee->engine.x.win_root,
+                                                   ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
+               }
+          }
+        else
+          {
+             if (ee->engine.x.state.below)
+               {
+                  ee->engine.x.state.below = 0;
+                  ecore_x_netwm_state_request_send(ee->prop.window,
+                                                   ee->engine.x.win_root,
+                                                   ECORE_X_WINDOW_STATE_BELOW, -1, 0);
+               }
+             if (ee->engine.x.state.above)
+               {
+                  ee->engine.x.state.above = 0;
+                  ecore_x_netwm_state_request_send(ee->prop.window,
+                                                   ee->engine.x.win_root,
+                                                   ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
+               }
+          }
      }
    else
      {
-       /* Just set the state */
-       if (ee->prop.layer < 3)
-         {
-            if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
-              {
-                 ee->engine.x.state.above = 0;
-                 ee->engine.x.state.below = 1;
-                 _ecore_evas_x_state_update(ee);
-              }
-         }
-       else if (ee->prop.layer > 5)
-         {
-            if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
-              {
-                 ee->engine.x.state.above = 1;
-                 ee->engine.x.state.below = 0;
-                 _ecore_evas_x_state_update(ee);
-              }
-         }
-       else
-         {
-            if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
-              {
-                 ee->engine.x.state.above = 0;
-                 ee->engine.x.state.below = 0;
-                 _ecore_evas_x_state_update(ee);
-              }
-         }
+        /* Just set the state */
+        if (ee->prop.layer < 3)
+          {
+             if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
+               {
+                  ee->engine.x.state.above = 0;
+                  ee->engine.x.state.below = 1;
+                  _ecore_evas_x_state_update(ee);
+               }
+          }
+        else if (ee->prop.layer > 5)
+          {
+             if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
+               {
+                  ee->engine.x.state.above = 1;
+                  ee->engine.x.state.below = 0;
+                  _ecore_evas_x_state_update(ee);
+               }
+          }
+        else
+          {
+             if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
+               {
+                  ee->engine.x.state.above = 0;
+                  ee->engine.x.state.below = 0;
+                  _ecore_evas_x_state_update(ee);
+               }
+          }
      }
    /* FIXME: Set gnome layer */
 }
 
 static int
-_ecore_evas_x_idle_enter(void *data __UNUSED__)
-{
-   Ecore_List2 *l;
-   double t1 = 0.0;
-   double t2 = 0.0;
-
-   if (_ecore_evas_fps_debug)
-     {
-       t1 = ecore_time_get();
-     }
-   for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
-     {
-       Ecore_Evas *ee;
-
-       ee = (Ecore_Evas *)l;
-       _ecore_evas_x_render(ee);
-     }
-   ecore_x_flush();
-   if (_ecore_evas_fps_debug)
-     {
-       t2 = ecore_time_get();
-       _ecore_evas_fps_debug_rendertime_add(t2 - t1);
-     }
-   return 1;
-}
-
-static int
 _ecore_evas_x_init(void)
 {
    _ecore_evas_init_count++;
    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
-   if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
-   ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_x_idle_enter, NULL);
-   ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN, _ecore_evas_x_event_key_down, NULL);
-   ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_X_EVENT_KEY_UP, _ecore_evas_x_event_key_up, NULL);
-   ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_x_event_mouse_button_down, NULL);
-   ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _ecore_evas_x_event_mouse_button_up, NULL);
-   ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _ecore_evas_x_event_mouse_move, NULL);
-   ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _ecore_evas_x_event_mouse_in, NULL);
-   ecore_evas_event_handlers[6]  = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _ecore_evas_x_event_mouse_out, NULL);
-   ecore_evas_event_handlers[7]  = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _ecore_evas_x_event_window_focus_in, NULL);
-   ecore_evas_event_handlers[8]  = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_x_event_window_focus_out, NULL);
-   ecore_evas_event_handlers[9]  = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE, _ecore_evas_x_event_window_damage, NULL);
-   ecore_evas_event_handlers[10] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _ecore_evas_x_event_window_destroy, NULL);
-   ecore_evas_event_handlers[11] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _ecore_evas_x_event_window_configure, NULL);
-   ecore_evas_event_handlers[12] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_x_event_window_delete_request, NULL);
-   ecore_evas_event_handlers[13] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, _ecore_evas_x_event_window_show, NULL);
-   ecore_evas_event_handlers[14] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _ecore_evas_x_event_window_hide, NULL);
-   ecore_evas_event_handlers[15] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL, _ecore_evas_x_event_mouse_wheel, NULL);
-   ecore_evas_event_handlers[16] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _ecore_evas_x_event_property_change, NULL);
-   ecore_evas_event_handlers[17] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, _ecore_evas_x_event_visibility_change, NULL);
-   if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
+   ecore_evas_event_handlers[0] =
+     ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
+                             _ecore_evas_x_event_mouse_in, NULL);
+   ecore_evas_event_handlers[1] =
+     ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
+                             _ecore_evas_x_event_mouse_out, NULL);
+   ecore_evas_event_handlers[2] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN,
+                             _ecore_evas_x_event_window_focus_in, NULL);
+   ecore_evas_event_handlers[3] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT,
+                             _ecore_evas_x_event_window_focus_out, NULL);
+   ecore_evas_event_handlers[4] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE,
+                             _ecore_evas_x_event_window_damage, NULL);
+   ecore_evas_event_handlers[5] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY,
+                             _ecore_evas_x_event_window_destroy, NULL);
+   ecore_evas_event_handlers[6] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
+                             _ecore_evas_x_event_window_configure, NULL);
+   ecore_evas_event_handlers[7] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST,
+                             _ecore_evas_x_event_window_delete_request, NULL);
+   ecore_evas_event_handlers[8] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW,
+                             _ecore_evas_x_event_window_show, NULL);
+   ecore_evas_event_handlers[9] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE,
+                             _ecore_evas_x_event_window_hide, NULL);
+   ecore_evas_event_handlers[10] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY,
+                             _ecore_evas_x_event_property_change, NULL);
+   ecore_evas_event_handlers[11] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE,
+                             _ecore_evas_x_event_visibility_change, NULL);
+   ecore_evas_event_handlers[12] =
+     ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
+                             _ecore_evas_x_event_client_message, NULL);
+   ecore_event_evas_init();
    return _ecore_evas_init_count;
 }
 
 static void
 _ecore_evas_x_free(Ecore_Evas *ee)
 {
-   ecore_x_window_del(ee->engine.x.win);
-   if (ee->engine.x.pmap) ecore_x_pixmap_del(ee->engine.x.pmap);
-   if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-   if (ee->engine.x.gc) ecore_x_gc_del(ee->engine.x.gc);
-#ifdef HAVE_ECORE_X_XCB
-# warning [XCB] No Region code
-#else
-   if (ee->engine.x.damages) XDestroyRegion(ee->engine.x.damages);
-#endif /* ! HAVE_ECORE_X_XCB */
+   _ecore_evas_x_group_leader_unset(ee);
+   _ecore_evas_x_sync_set(ee);
+   if (ee->engine.x.win_shaped_input)
+     ecore_x_window_free(ee->engine.x.win_shaped_input);
+   ecore_x_window_free(ee->prop.window);
+   if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
+   if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+   if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
+   if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
    ee->engine.x.pmap = 0;
    ee->engine.x.mask = 0;
    ee->engine.x.gc = 0;
-#ifdef HAVE_ECORE_X_XCB
-# warning [XCB] No Region code
-#else
-   ee->engine.x.damages = 0;
-#endif /* ! HAVE_ECORE_X_XCB */
-   ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
+   ee->engine.x.damages = NULL;
+   ecore_event_window_unregister(ee->prop.window);
    while (ee->engine.x.win_extra)
      {
-       Ecore_X_Window *winp;
+        Ecore_X_Window *winp;
 
-       winp = ee->engine.x.win_extra->data;
-       ee->engine.x.win_extra = evas_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
-       ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_x_winid_str_get(*winp), ee);
-       free(winp);
+        winp = ee->engine.x.win_extra->data;
+        ee->engine.x.win_extra =
+          eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
+        ecore_event_window_unregister(*winp);
+        free(winp);
      }
-   ecore_evases = _ecore_list2_remove(ecore_evases, ee);
    _ecore_evas_x_shutdown();
    ecore_x_shutdown();
 }
 
-/* FIXME: round trip */
 static void
-_ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
-{
-#ifdef HAVE_ECORE_X_XCB
-   ecore_x_icccm_protocol_get_prefetch(ee->engine.x.win);
-   ecore_x_icccm_protocol_get_fetch();
-#endif /* HAVE_ECORE_X_XCB */
-   if (func)
-     ecore_x_icccm_protocol_set(ee->engine.x.win, ECORE_X_WM_PROTOCOL_DELETE_REQUEST, 1);
-   else
-     ecore_x_icccm_protocol_set(ee->engine.x.win, ECORE_X_WM_PROTOCOL_DELETE_REQUEST, 0);
+_ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
+{
    ee->func.fn_delete_request = func;
-#ifdef HAVE_ECORE_X_XCB
-   ecore_xcb_reply_free();
-#endif /* HAVE_ECORE_X_XCB */
+   _ecore_evas_x_protocols_set(ee);
+   _ecore_evas_x_sync_set(ee);
 }
 
 static void
 _ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
 {
+   ee->req.x = x;
+   ee->req.y = y;
    if (ee->engine.x.direct_resize)
      {
-       if (!ee->engine.x.managed)
-         {
-            if ((x != ee->x) || (y != ee->y))
-              {
-                 ee->x = x;
-                 ee->y = y;
-                 ecore_x_window_move(ee->engine.x.win, x, y);
-                 if (!ee->should_be_visible)
-                   {
-                      /* We need to request pos */
-                      ee->prop.request_pos = 1;
-                      _ecore_evas_x_size_pos_hints_update(ee);
-                   }
-                 if (ee->func.fn_move) ee->func.fn_move(ee);
-              }
-         }
+        if (!ee->engine.x.managed)
+          {
+             if ((x != ee->x) || (y != ee->y))
+               {
+                  ee->x = x;
+                  ee->y = y;
+                  ecore_x_window_move(ee->prop.window, x, y);
+                  if (!ee->should_be_visible)
+                    {
+                       /* We need to request pos */
+                       ee->prop.request_pos = 1;
+                       _ecore_evas_x_size_pos_hints_update(ee);
+                    }
+                  if (ee->func.fn_move) ee->func.fn_move(ee);
+               }
+          }
      }
    else
      {
-       ecore_x_window_move(ee->engine.x.win, x, y);
-       if (!ee->should_be_visible)
-         {
-            /* We need to request pos */
-            ee->prop.request_pos = 1;
-            _ecore_evas_x_size_pos_hints_update(ee);
-         }
-       if (!ee->engine.x.managed)
-         {
-            ee->x = x;
-            ee->y = y;
-         }
+        if (((ee->x != x) || (ee->y != y)) ||
+            (ee->engine.x.configure_coming))
+          {
+             ee->engine.x.configure_coming = 1;
+             if (!ee->engine.x.managed)
+               {
+                  ee->x = x;
+                  ee->y = y;
+               }
+             ecore_x_window_move(ee->prop.window, x, y);
+          }
+        if (!ee->should_be_visible)
+          {
+             /* We need to request pos */
+             ee->prop.request_pos = 1;
+             _ecore_evas_x_size_pos_hints_update(ee);
+          }
      }
 }
 
 static void
 _ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
 {
+   ee->req.x = x;
+   ee->req.y = y;
    if (ee->engine.x.direct_resize)
      {
-       ee->engine.x.managed = 1;
-       if ((x != ee->x) || (y != ee->y))
-         {
-            ee->x = x;
-            ee->y = y;
-            if (ee->func.fn_move) ee->func.fn_move(ee);
-         }
+        ee->engine.x.managed = 1;
+        if ((x != ee->x) || (y != ee->y))
+          {
+             ee->x = x;
+             ee->y = y;
+             if (ee->func.fn_move) ee->func.fn_move(ee);
+          }
      }
 }
 
 static void
 _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
 {
+   ee->req.w = w;
+   ee->req.h = h;
    if (ee->engine.x.direct_resize)
      {
-       if ((ee->w != w) || (ee->h != h))
-         {
-            ecore_x_window_resize(ee->engine.x.win, w, h);
-            ee->w = w;
-            ee->h = h;
-            if ((ee->rotation == 90) || (ee->rotation == 270))
-              {
-                 evas_output_size_set(ee->evas, ee->h, ee->w);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
-              }
-            else
-              {
-                 evas_output_size_set(ee->evas, ee->w, ee->h);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-              }
-            if (ee->prop.avoid_damage)
-              {
-                 int pdam;
-
-                 pdam = ecore_evas_avoid_damage_get(ee);
-                 ecore_evas_avoid_damage_set(ee, 0);
-                 ecore_evas_avoid_damage_set(ee, pdam);
-              }
-            if ((ee->shaped) || (ee->alpha))
-              _ecore_evas_x_resize_shape(ee);
-            if (ee->func.fn_resize) ee->func.fn_resize(ee);
-         }
+        if ((ee->w != w) || (ee->h != h))
+          {
+             ee->w = w;
+             ee->h = h;
+             ecore_x_window_resize(ee->prop.window, w, h);
+             if ((ee->rotation == 90) || (ee->rotation == 270))
+               {
+                  evas_output_size_set(ee->evas, ee->h, ee->w);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+               }
+             else
+               {
+                  evas_output_size_set(ee->evas, ee->w, ee->h);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+               }
+             if (ee->prop.avoid_damage)
+               {
+                  int pdam;
+
+                  pdam = ecore_evas_avoid_damage_get(ee);
+                  ecore_evas_avoid_damage_set(ee, 0);
+                  ecore_evas_avoid_damage_set(ee, pdam);
+               }
+             if ((ee->shaped) || (ee->alpha))
+               _ecore_evas_x_resize_shape(ee);
+             if (ee->func.fn_resize) ee->func.fn_resize(ee);
+          }
+     }
+   else if (((ee->w != w) || (ee->h != h)) || 
+            (ee->engine.x.configure_coming))
+     {
+        ee->engine.x.configure_coming = 1;
+        ecore_x_window_resize(ee->prop.window, w, h);
+     }
+}
+
+static void
+_ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+   ee->req.x = x;
+   ee->req.y = y;
+   ee->req.w = w;
+   ee->req.h = h;
+   if (ee->engine.x.direct_resize)
+     {
+        if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
+          {
+             int change_size = 0, change_pos = 0;
+
+             if ((ee->w != w) || (ee->h != h)) change_size = 1;
+             if (!ee->engine.x.managed)
+               {
+                  if ((x != ee->x) || (y != ee->y)) change_pos = 1;
+               }
+             ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
+             if (!ee->engine.x.managed)
+               {
+                  ee->x = x;
+                  ee->y = y;
+               }
+             ee->w = w;
+             ee->h = h;
+             if ((ee->rotation == 90) || (ee->rotation == 270))
+               {
+                  evas_output_size_set(ee->evas, ee->h, ee->w);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+               }
+             else
+               {
+                  evas_output_size_set(ee->evas, ee->w, ee->h);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+               }
+             if (ee->prop.avoid_damage)
+               {
+                  int pdam;
+
+                  pdam = ecore_evas_avoid_damage_get(ee);
+                  ecore_evas_avoid_damage_set(ee, 0);
+                  ecore_evas_avoid_damage_set(ee, pdam);
+               }
+             if ((ee->shaped) || (ee->alpha))
+               _ecore_evas_x_resize_shape(ee);
+             if (change_pos)
+               {
+                  if (ee->func.fn_move) ee->func.fn_move(ee);
+               }
+             if (change_size)
+               {
+                  if (ee->func.fn_resize) ee->func.fn_resize(ee);
+               }
+          }
+     }
+   else if (((ee->w != w) || (ee->h != h) || (ee->x != x) || (ee->y != y)) || 
+            (ee->engine.x.configure_coming))
+     {
+        ee->engine.x.configure_coming = 1;
+        ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
+        if (!ee->engine.x.managed)
+          {
+             ee->x = x;
+             ee->y = y;
+          }
      }
-   else
-     ecore_x_window_resize(ee->engine.x.win, w, h);
 }
 
-static void
-_ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
-{
-   if (ee->engine.x.direct_resize)
-     {
-       if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
-         {
-            int change_size = 0, change_pos = 0;
-
-            if ((ee->w != w) || (ee->h != h)) change_size = 1;
-            if (!ee->engine.x.managed)
-              {
-                 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
-              }
-            ecore_x_window_move_resize(ee->engine.x.win, x, y, w, h);
-            if (!ee->engine.x.managed)
-              {
-                 ee->x = x;
-                 ee->y = y;
-              }
-            ee->w = w;
-            ee->h = h;
-            if ((ee->rotation == 90) || (ee->rotation == 270))
-              {
-                 evas_output_size_set(ee->evas, ee->h, ee->w);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
-              }
-            else
-              {
-                 evas_output_size_set(ee->evas, ee->w, ee->h);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-              }
-            if (ee->prop.avoid_damage)
-              {
-                 int pdam;
-
-                 pdam = ecore_evas_avoid_damage_get(ee);
-                 ecore_evas_avoid_damage_set(ee, 0);
-                 ecore_evas_avoid_damage_set(ee, pdam);
-              }
-            if ((ee->shaped) || (ee->alpha))
-              _ecore_evas_x_resize_shape(ee);
-            if (change_pos)
-              {
-                 if (ee->func.fn_move) ee->func.fn_move(ee);
-              }
-            if (change_size)
-              {
-                 if (ee->func.fn_resize) ee->func.fn_resize(ee);
-              }
-         }
+static void
+_ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
+                                    Evas_Engine_Info *einfo)
+{
+   int rot_dif;
+
+   rot_dif = ee->rotation - rotation;
+   if (rot_dif < 0) rot_dif = -rot_dif;
+
+   if (rot_dif != 180)
+     {
+        int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
+
+        if (!evas_engine_info_set(ee->evas, einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+
+        if (!resize)
+          {
+             ee->engine.x.configure_coming = 1;
+             if (!ee->prop.fullscreen)
+               {
+                  ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
+                  ee->expecting_resize.w = ee->h;
+                  ee->expecting_resize.h = ee->w;
+                  evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
+               }
+             else
+               {
+                  int w, h;
+
+                  ecore_x_window_size_get(ee->prop.window, &w, &h);
+                  ecore_x_window_resize(ee->prop.window, h, w);
+                  if ((rotation == 0) || (rotation == 180))
+                    {
+                       evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
+                       evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
+                    }
+                  else
+                    {
+                       evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
+                       evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
+                    }
+                  if (ee->func.fn_resize) ee->func.fn_resize(ee);
+               }
+             if ((ee->rotation == 90) || (ee->rotation == 270))
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
+             else
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+          }
+        else
+          {
+             /* int w, h; */
+
+             /* ecore_x_window_size_get(ee->prop.window, &w, &h); */
+             if ((rotation == 0) || (rotation == 180))
+               {
+                  evas_output_size_set(ee->evas, ee->w, ee->h);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+               }
+             else
+               {
+                  evas_output_size_set(ee->evas, ee->h, ee->w);
+                  evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+               }
+             if (ee->func.fn_resize) ee->func.fn_resize(ee);
+             if ((ee->rotation == 90) || (ee->rotation == 270))
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+             else
+               evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+          }
+        ecore_evas_size_min_get(ee, &minw, &minh);
+        ecore_evas_size_max_get(ee, &maxw, &maxh);
+        ecore_evas_size_base_get(ee, &basew, &baseh);
+        ecore_evas_size_step_get(ee, &stepw, &steph);
+        ee->rotation = rotation;
+        ecore_evas_size_min_set(ee, minh, minw);
+        ecore_evas_size_max_set(ee, maxh, maxw);
+        ecore_evas_size_base_set(ee, baseh, basew);
+        ecore_evas_size_step_set(ee, steph, stepw);
+        _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                       ecore_x_current_time_get());
      }
    else
      {
-       ecore_x_window_move_resize(ee->engine.x.win, x, y, w, h);
-       if (!ee->engine.x.managed)
-         {
-            ee->x = x;
-            ee->y = y;
-         }
+        if (!evas_engine_info_set(ee->evas, einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        ee->rotation = rotation;
+        _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
+                                       ecore_x_current_time_get());
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+        else
+          evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
      }
 }
 
-static void
-_ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation,
-                                   Evas_Engine_Info *einfo)
-{
-   int rot_dif;
+#define _USE_WIN_ROT_EFFECT 1
 
-   rot_dif = ee->rotation - rotation;
-   if (rot_dif < 0) rot_dif = -rot_dif;
+#if _USE_WIN_ROT_EFFECT
+static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__);
 
-   if (rot_dif != 180)
-     {
-       int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
-
-       evas_engine_info_set(ee->evas, einfo);
-       if (!ee->prop.fullscreen)
-         {
-            ecore_x_window_resize(ee->engine.x.win, ee->h, ee->w);
-            ee->expecting_resize.w = ee->h;
-            ee->expecting_resize.h = ee->w;
-         }
-       else
-         {
-            int w, h;
-
-            ecore_x_window_size_get(ee->engine.x.win, &w, &h);
-            ecore_x_window_resize(ee->engine.x.win, h, w);
-            if ((rotation == 0) || (rotation == 180))
-              {
-                 evas_output_size_set(ee->evas, ee->w, ee->h);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-              }
-            else
-              {
-                 evas_output_size_set(ee->evas, ee->h, ee->w);
-                 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
-              }
-            if (ee->func.fn_resize) ee->func.fn_resize(ee);
-         }
-       ecore_evas_size_min_get(ee, &minw, &minh);
-       ecore_evas_size_max_get(ee, &maxw, &maxh);
-       ecore_evas_size_base_get(ee, &basew, &baseh);
-       ecore_evas_size_step_get(ee, &stepw, &steph);
-       ee->rotation = rotation;
-       ecore_evas_size_min_set(ee, minh, minw);
-       ecore_evas_size_max_set(ee, maxh, maxw);
-       ecore_evas_size_base_set(ee, baseh, basew);
-       ecore_evas_size_step_set(ee, steph, stepw);
-       _ecore_evas_x_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
-                                        ecore_x_current_time_get());
-     }
-   else
-     {
-       evas_engine_info_set(ee->evas, einfo);
-       ee->rotation = rotation;
-       _ecore_evas_x_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
-                                        ecore_x_current_time_get());
-       if (ee->func.fn_resize) ee->func.fn_resize(ee);
-     }
+typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect;
+struct _Ecore_Evas_X_Rotation_Effect
+{
+   Eina_Bool    wait_for_comp_reply;
+};
 
-   if ((ee->rotation == 90) || (ee->rotation == 270))
-     evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
-   else
-     evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+static Ecore_Evas_X_Rotation_Effect _rot_effect =
+{
+   EINA_FALSE
+};
+
+static void
+_ecore_evas_x_rotation_effect_setup(void)
+{
+   _rot_effect.wait_for_comp_reply = EINA_TRUE;
 }
+#endif /* end of _USE_WIN_ROT_EFFECT */
 
 static void
-_ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation)
+_ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
 {
    if (ee->rotation == rotation) return;
-   if (!strcmp(ee->driver, "gl_x11")) return;
    if (!strcmp(ee->driver, "xrender_x11")) return;
-   if (!strcmp(ee->driver, "software_x11") || !strcmp(ee->driver, "software_xcb"))
-     {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       Evas_Engine_Info_Software_Xcb *einfo;
 
-       einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas);
-# else
-       Evas_Engine_Info_Software_X11 *einfo;
+#if _USE_WIN_ROT_EFFECT
+   int angles[2];
+   angles[0] = rotation;
+   angles[1] = ee->rotation;
+#endif /* end of _USE_WIN_ROT_EFFECT */
 
-       einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-       if (!einfo) return;
-       einfo->info.rotation = rotation;
-       _ecore_evas_x_rotation_set_internal
-         (ee, rotation, (Evas_Engine_Info *)einfo);
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 || BUILD_ECORE_EVAS_SOFTWARE_XCB */
+   if (!strcmp(ee->driver, "opengl_x11"))
+     {
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+        Evas_Engine_Info_GL_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
+                                            (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
+#endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
+     }
+   else if (!strcmp(ee->driver, "software_x11"))
+     {
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+        Evas_Engine_Info_Software_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
+                                            (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
      }
    else if (!strcmp(ee->driver,  "software_16_x11"))
      {
 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-       Evas_Engine_Info_Software_16_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
-       if (!einfo) return;
-       einfo->info.rotation = rotation;
-       _ecore_evas_x_rotation_set_internal
-         (ee, rotation, (Evas_Engine_Info *)einfo);
+        Evas_Engine_Info_Software_16_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
+                                            (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
      }
+   else if (!strcmp(ee->driver,  "software_8_x11"))
+     {
+#if BUILD_ECORE_EVAS_SOFTWARE_8_X11
+        Evas_Engine_Info_Software_8_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+        einfo->info.rotation = rotation;
+        _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
+                                            (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
+     }
+
+#if _USE_WIN_ROT_EFFECT
+   if ((ee->visible) &&
+       ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
+        (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)) &&
+        (ee->engine.x.sync_counter) &&
+        (ee->engine.x.sync_val > 0))
+     {
+        _ecore_evas_x_rotation_effect_setup();
+        _ecore_evas_x_flush_pre(ee, NULL, NULL);
+     }
+#endif /* end of _USE_WIN_ROT_EFFECT */
 }
 
 static void
 _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
 {
-   if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
-     return;
-   if (!strcmp(ee->driver, "gl_x11")) return;
-   if (!strcmp(ee->driver, "software_x11") || !strcmp(ee->driver, "software_xcb"))
+   if ((ee->shaped == shaped)) return;
+   if (!strcmp(ee->driver, "opengl_x11")) return;
+   if (!strcmp(ee->driver, "software_x11"))
      {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       Evas_Engine_Info_Software_Xcb *einfo;
-
-       einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas);
-# else
-       Evas_Engine_Info_Software_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-
-       ee->shaped = shaped;
-       if (einfo)
-         {
-            if (ee->shaped)
-              {
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-                  xcb_rectangle_t rectangle;
-                 Ecore_X_GC      gc;
-                 uint32_t        value_list;
-# else
-                 GC gc;
-                 XGCValues gcv;
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-
-                 if (!ee->engine.x.mask)
-                   ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-                  gc = xcb_generate_id(ecore_x_connection_get());
-                 value_list = 0;
-                 xcb_create_gc(ecore_x_connection_get(),
-                                gc, ee->engine.x.mask,
-                               XCB_GC_FOREGROUND,
-                                &value_list);
-                  rectangle.x = 0;
-                  rectangle.y = 0;
-                  rectangle.width = ee->w;
-                  rectangle.height = ee->h;
-                 xcb_poly_fill_rectangle(ecore_x_connection_get(),
-                                          ee->engine.x.mask, gc,
-                                          1, &rectangle);
-                 xcb_free_gc(ecore_x_connection_get(), gc);
-# else
-                 gcv.foreground = 0;
-                 gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask,
-                                GCForeground,
-                                &gcv);
-                 XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc,
-                                0, 0, ee->w, ee->h);
-                 XFreeGC(ecore_x_display_get(), gc);
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-                 einfo->info.mask = ee->engine.x.mask;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-                 ecore_x_window_shape_input_mask_set(ee->engine.x.win, 0);
-              }
-            else
-              {
-                 if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-                 ee->engine.x.mask = 0;
-                 einfo->info.mask = 0;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
-                 ecore_x_window_shape_input_mask_set(ee->engine.x.win, 0);
-              }
-         }
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 || BUILD_ECORE_EVAS_SOFTWARE_XCB */
-     }
-   else if (!strcmp(ee->driver, "xrender_x11") || !strcmp(ee->driver, "xrender_xcb"))
-     {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-       Evas_Engine_Info_XRender_Xcb *einfo;
-# else
-       Evas_Engine_Info_XRender_X11 *einfo;
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+        Evas_Engine_Info_Software_X11 *einfo;
 
-       ee->shaped = shaped;
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-       einfo = (Evas_Engine_Info_XRender_Xcb *)evas_engine_info_get(ee->evas);
-# else
-       einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-       if (einfo)
-         {
-            if (ee->shaped)
-              {
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-                  xcb_rectangle_t rectangle;
-                 Ecore_X_GC      gc;
-                 uint32_t        value_list;
-# else
-                 GC gc;
-                 XGCValues gcv;
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-
-                 if (!ee->engine.x.mask)
-                   ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-                  gc = xcb_generate_id(ecore_x_connection_get());
-                 value_list = 0;
-                 xcb_create_gc(ecore_x_connection_get(),
-                                gc, ee->engine.x.mask,
-                               XCB_GC_FOREGROUND,
-                                &value_list);
-                  rectangle.x = 0;
-                  rectangle.y = 0;
-                  rectangle.width = ee->w;
-                  rectangle.height = ee->h;
-                 xcb_poly_fill_rectangle(ecore_x_connection_get(),
-                                          ee->engine.x.mask, gc,
-                                          1, &rectangle);
-                 xcb_free_gc(ecore_x_connection_get(), gc);
-# else
-                 gcv.foreground = 0;
-                 gc = XCreateGC(ecore_x_display_get(), ee->engine.x.mask,
-                                GCForeground,
-                                &gcv);
-                 XFillRectangle(ecore_x_display_get(), ee->engine.x.mask, gc,
-                                0, 0, ee->w, ee->h);
-                 XFreeGC(ecore_x_display_get(), gc);
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-                 einfo->info.mask = ee->engine.x.mask;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-                 ecore_x_window_shape_input_mask_set(ee->engine.x.win, 0);
-              }
-            else
-              {
-                 if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-                 ee->engine.x.mask = 0;
-                 einfo->info.mask = 0;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
-                 ecore_x_window_shape_input_mask_set(ee->engine.x.win, 0);
-              }
-         }
-#endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
+        einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+        ee->shaped = shaped;
+        if (einfo)
+          {
+             if (ee->shaped)
+               {
+                  unsigned int foreground;
+                  Ecore_X_GC gc;
+
+                  if (!ee->engine.x.mask)
+                    ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+                  foreground = 0;
+                  gc = ecore_x_gc_new(ee->engine.x.mask,
+                                      ECORE_X_GC_VALUE_MASK_FOREGROUND,
+                                      &foreground);
+                  ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
+                                                  0, 0, ee->w, ee->h);
+                  ecore_x_gc_free(gc);
+                  einfo->info.mask = ee->engine.x.mask;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+                  ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+               }
+             else
+               {
+                  if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+                  ee->engine.x.mask = 0;
+                  einfo->info.mask = 0;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  ecore_x_window_shape_mask_set(ee->prop.window, 0);
+                  ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+               }
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
      }
    else if (!strcmp(ee->driver, "software_16_x11"))
      {
 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
 # if 0 /* XXX no shaped window support for software_16_x11 */
-       Evas_Engine_Info_Software_16_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
-       ee->shaped = shaped;
-       if (einfo)
-         {
-            if (ee->shaped)
-              {
-                 GC gc;
-                 XGCValues gcv;
-
-                 ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-                 einfo->info.mask = ee->engine.x.mask;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-              }
-            else
-              {
-                 if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-                 ee->engine.x.mask = 0;
-                 einfo->info.mask = 0;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
-              }
-         }
+        Evas_Engine_Info_Software_16_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
+        ee->shaped = shaped;
+        if (einfo)
+          {
+             if (ee->shaped)
+               {
+                  ee->engine.x.mask =
+                    ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+                  einfo->info.mask = ee->engine.x.mask;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+               }
+             else
+               {
+                  if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+                  ee->engine.x.mask = 0;
+                  einfo->info.mask = 0;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  ecore_x_window_shape_mask_set(ee->prop.window, 0);
+               }
+          }
 # endif /* XXX no shaped window support for software_16_x11 */
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
      }
+   if (!strcmp(ee->driver, "software_8_x11"))
+     {
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+        Evas_Engine_Info_Software_8_X11 *einfo;
 
+        einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
+        ee->shaped = shaped;
+        if (einfo)
+          {
+             if (ee->shaped)
+               {
+                  unsigned int foreground;
+                  Ecore_X_GC gc;
+
+                  if (!ee->engine.x.mask)
+                    ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
+                  foreground = 0;
+                  gc = ecore_x_gc_new(ee->engine.x.mask,
+                                      ECORE_X_GC_VALUE_MASK_FOREGROUND,
+                                      &foreground);
+                  ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
+                                                  0, 0, ee->w, ee->h);
+                  ecore_x_gc_free(gc);
+                  einfo->info.mask = ee->engine.x.mask;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+                  ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+               }
+             else
+               {
+                  if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+                  ee->engine.x.mask = 0;
+                  einfo->info.mask = 0;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  ecore_x_window_shape_mask_set(ee->prop.window, 0);
+                  ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+               }
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
+     }
 }
 
 /* FIXME, round trip */
 static void
 _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
 {
-# ifdef HAVE_ECORE_X_XCB
-   xcb_get_geometry_cookie_t          cookie_geom;
-   xcb_get_window_attributes_cookie_t cookie_attr;
-   xcb_get_geometry_reply_t          *reply_geom;
-   xcb_get_window_attributes_reply_t *reply_attr;
-#else
-   XWindowAttributes att;
-#endif /* ! HAVE_ECORE_X_XCB */
+   Ecore_X_Window_Attributes att;
+   char *id = NULL;
 
-   if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha)))
-     return;
+   if ((ee->alpha == alpha)) return;
 
-   if (!strcmp(ee->driver, "software_x11") || !strcmp(ee->driver, "software_xcb"))
+   if (!strcmp(ee->driver, "software_x11"))
      {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       Evas_Engine_Info_Software_Xcb *einfo;
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+        Evas_Engine_Info_Software_X11 *einfo;
 
-       einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas);
-#else
-       Evas_Engine_Info_Software_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-
-       if (!einfo) return;
-
-       if (!ecore_x_composite_query()) return;
-
-       ee->shaped = 0;
-       ee->alpha = alpha;
-       ecore_x_window_del(ee->engine.x.win);
-       ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-       if (ee->alpha)
-         {
-            if (ee->prop.override)
-              ee->engine.x.win = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            else
-              ee->engine.x.win = ecore_x_window_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            if (!ee->engine.x.mask)
-              ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-         }
-       else
-         {
-            if (ee->prop.override)
-              ee->engine.x.win = ecore_x_window_override_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            else
-              ee->engine.x.win = ecore_x_window_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-            ee->engine.x.mask = 0;
-            ecore_x_window_shape_input_mask_set(ee->engine.x.win, 0);
-         }
-
-       einfo->info.destination_alpha = alpha;
+        einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
 
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->engine.x.win);
-       cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->engine.x.win);
-
-       reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
-       reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
-       einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
-       einfo->info.colormap = reply_attr->colormap;
-       einfo->info.depth = reply_geom->depth;
-       free(reply_geom);
-       free(reply_attr);
-# else
-       XGetWindowAttributes(ecore_x_display_get(), ee->engine.x.win, &att);
-       einfo->info.visual = att.visual;
-       einfo->info.colormap = att.colormap;
-       einfo->info.depth = att.depth;
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-
-//     if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-//     ee->engine.x.mask = 0;
-       einfo->info.mask = ee->engine.x.mask;
-       einfo->info.drawable = ee->engine.x.win;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-       evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-       ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
-       ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-       if (ee->prop.borderless)
-         ecore_x_mwm_borderless_set(ee->engine.x.win, ee->prop.borderless);
-       if (ee->visible) ecore_x_window_show(ee->engine.x.win);
-       if (ee->prop.focused) ecore_x_window_focus(ee->engine.x.win);
-       if (ee->prop.title)
-         {
-            ecore_x_icccm_title_set(ee->engine.x.win, ee->prop.title);
-            ecore_x_netwm_name_set(ee->engine.x.win, ee->prop.title);
-         }
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 || BUILD_ECORE_EVAS_SOFTWARE_XCB */
-     }
-   else if (!strcmp(ee->driver, "xrender_x11") || !strcmp(ee->driver, "xrender_xcb"))
-     {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-       Evas_Engine_Info_XRender_Xcb *einfo;
-
-       einfo = (Evas_Engine_Info_XRender_Xcb *)evas_engine_info_get(ee->evas);
-# else
-       Evas_Engine_Info_XRender_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-
-       if (!einfo) return;
-       if (!ecore_x_composite_query()) return;
-
-       ee->shaped = 0;
-       ee->alpha = alpha;
-       ecore_x_window_del(ee->engine.x.win);
-       ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-       if (ee->alpha)
-         {
-            if (ee->prop.override)
-              ee->engine.x.win = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            else
-              ee->engine.x.win = ecore_x_window_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            if (!ee->engine.x.mask)
-              ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-         }
-       else
-         {
-            if (ee->prop.override)
-              ee->engine.x.win = ecore_x_window_override_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            else
-              ee->engine.x.win = ecore_x_window_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-            ee->engine.x.mask = 0;
-            ecore_x_window_shape_input_mask_set(ee->engine.x.win, 0);
-         }
-
-       einfo->info.destination_alpha = alpha;
-
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-       cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->engine.x.win);
-       reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
-
-       einfo->info.visual = reply_attr->visual;
-       free(reply_attr);
-# else
-       XGetWindowAttributes(ecore_x_display_get(), ee->engine.x.win, &att);
-       einfo->info.visual = att.visual;
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
+        if (!ecore_x_composite_query()) return;
+
+        ee->shaped = 0;
+        ee->alpha = alpha;
+        ecore_x_window_free(ee->prop.window);
+        ecore_event_window_unregister(ee->prop.window);
+        if (ee->alpha)
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (!ee->engine.x.mask)
+               ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
+          }
+        else
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+             ee->engine.x.mask = 0;
+             ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+          }
+
+        einfo->info.destination_alpha = alpha;
+
+        ecore_x_window_attributes_get(ee->prop.window, &att);
+        einfo->info.visual = att.visual;
+        einfo->info.colormap = att.colormap;
+        einfo->info.depth = att.depth;
 
-//     if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-//     ee->engine.x.mask = 0;
+//        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+//        ee->engine.x.mask = 0;
         einfo->info.mask = ee->engine.x.mask;
-       einfo->info.drawable = ee->engine.x.win;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-       evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-       ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
-       ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-       if (ee->prop.borderless)
-         ecore_x_mwm_borderless_set(ee->engine.x.win, ee->prop.borderless);
-       if (ee->visible) ecore_x_window_show(ee->engine.x.win);
-       if (ee->prop.focused) ecore_x_window_focus(ee->engine.x.win);
-       if (ee->prop.title)
-         {
-            ecore_x_icccm_title_set(ee->engine.x.win, ee->prop.title);
-            ecore_x_netwm_name_set(ee->engine.x.win, ee->prop.title);
-         }
-#endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
+        einfo->info.drawable = ee->prop.window;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+        ecore_x_window_shape_mask_set(ee->prop.window, 0);
+        ecore_x_input_multi_select(ee->prop.window);
+        ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                                    (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                                    (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                                    (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                                    (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+        if (ee->prop.borderless)
+          ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
+        if (ee->visible) ecore_x_window_show(ee->prop.window);
+        if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
+        if (ee->prop.title)
+          {
+             ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
+             ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
+          }
+        if (ee->prop.name)
+          ecore_x_icccm_name_class_set(ee->prop.window,
+                                       ee->prop.name, ee->prop.clas);
+        _ecore_evas_x_hints_update(ee);
+        _ecore_evas_x_group_leader_update(ee);
+        ecore_x_window_defaults_set(ee->prop.window);
+        _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
+        _ecore_evas_x_size_pos_hints_update(ee);
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
+        if ((id = getenv("DESKTOP_STARTUP_ID")))
+          {
+             ecore_x_netwm_startup_id_set(ee->prop.window, id);
+             /* NB: on linux this may simply empty the env as opposed to completely
+              * unset it to being empty - unsure as solartis libc crashes looking
+              * for the '=' char */
+             //        putenv((char*)"DESKTOP_STARTUP_ID=");
+          }
+     }
+   else if (!strcmp(ee->driver, "opengl_x11"))
+     {
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+        Evas_Engine_Info_GL_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+
+        if (!ecore_x_composite_query()) return;
+
+        ee->shaped = 0;
+        ee->alpha = alpha;
+        ecore_x_window_free(ee->prop.window);
+        ecore_event_window_unregister(ee->prop.window);
+        ee->prop.window = 0;
+
+        einfo->info.destination_alpha = alpha;
+
+        if (ee->engine.x.win_root != 0)
+          {
+             /* FIXME: round trip in ecore_x_window_argb_get */
+             if (ecore_x_window_argb_get(ee->engine.x.win_root))
+               {
+                  ee->prop.window =
+                    _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
+                                                ee->req.x, ee->req.y,
+                                                ee->req.w, ee->req.h,
+                                                ee->prop.override, 1, NULL);
+               }
+             else
+               {
+                  ee->prop.window =
+                    _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
+                                                ee->req.x, ee->req.y,
+                                                ee->req.w, ee->req.h,
+                                                ee->prop.override, ee->alpha,
+                                                NULL);
+               }
+          }
+        else
+          {
+             ee->prop.window =
+               _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
+                                           ee->req.x, ee->req.y,
+                                           ee->req.w, ee->req.h,
+                                           ee->prop.override, ee->alpha, NULL);
+          }
+
+        if (!ee->prop.window) return;
+/*
+        if (ee->alpha)
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (!ee->engine.x.mask)
+               ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
+          }
+        else
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+             ee->engine.x.mask = 0;
+             ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+          }
+ */
+
+        ecore_x_window_attributes_get(ee->prop.window, &att);
+        einfo->info.visual = att.visual;
+        einfo->info.colormap = att.colormap;
+        einfo->info.depth = att.depth;
+
+//        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+//        ee->engine.x.mask = 0;
+//        einfo->info.mask = ee->engine.x.mask;
+        einfo->info.drawable = ee->prop.window;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+//        ecore_x_window_shape_mask_set(ee->prop.window, 0);
+        ecore_x_input_multi_select(ee->prop.window);
+        ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                                    (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                                    (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                                    (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                                    (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+        if (ee->prop.borderless)
+          ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
+        if (ee->visible) ecore_x_window_show(ee->prop.window);
+        if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
+        if (ee->prop.title)
+          {
+             ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
+             ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
+          }
+        if (ee->prop.name)
+          ecore_x_icccm_name_class_set(ee->prop.window,
+                                       ee->prop.name, ee->prop.clas);
+        _ecore_evas_x_hints_update(ee);
+        _ecore_evas_x_group_leader_update(ee);
+        ecore_x_window_defaults_set(ee->prop.window);
+        _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
+        _ecore_evas_x_size_pos_hints_update(ee);
+#endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
+        if ((id = getenv("DESKTOP_STARTUP_ID")))
+          {
+             ecore_x_netwm_startup_id_set(ee->prop.window, id);
+             /* NB: on linux this may simply empty the env as opposed to completely
+              * unset it to being empty - unsure as solartis libc crashes looking
+              * for the '=' char */
+             //        putenv((char*)"DESKTOP_STARTUP_ID=");
+          }
      }
    else if (!strcmp(ee->driver, "software_16_x11"))
      {
 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-       Evas_Engine_Info_Software_16_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
-       if (!einfo) return;
-
-       ee->shaped = 0;
-       ee->alpha = alpha;
-       ecore_x_window_del(ee->engine.x.win);
-       ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-       if (ee->alpha)
-         {
-            if (ee->prop.override)
-              ee->engine.x.win = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            else
-              ee->engine.x.win = ecore_x_window_argb_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            if (!ee->engine.x.mask)
-              ee->engine.x.mask = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 1);
-         }
-       else
-         {
-            if (ee->prop.override)
-              ee->engine.x.win = ecore_x_window_override_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            else
-              ee->engine.x.win = ecore_x_window_new(ee->engine.x.win_root, ee->x, ee->y, ee->w, ee->h);
-            if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-            ee->engine.x.mask = 0;
-            ecore_x_window_shape_input_mask_set(ee->engine.x.win, 0);
-         }
+        Evas_Engine_Info_Software_16_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+
+        ee->shaped = 0;
+        ee->alpha = alpha;
+        ecore_x_window_free(ee->prop.window);
+        ecore_event_window_unregister(ee->prop.window);
+        if (ee->alpha)
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (!ee->engine.x.mask)
+               ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
+          }
+        else
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+             ee->engine.x.mask = 0;
+             ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+          }
 
 # if 0 /* XXX no alpha window support for software_16_x11 */
-       einfo->info.destination_alpha = alpha;
+        einfo->info.destination_alpha = alpha;
 # endif /* XXX no alpha window support for software_16_x11 */
 
 # if 0 /* XXX no shaped window support for software_16_x11 */
-//     if (ee->engine.x.mask) ecore_x_pixmap_del(ee->engine.x.mask);
-//     ee->engine.x.mask = 0;
+//        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+//        ee->engine.x.mask = 0;
         einfo->info.mask = ee->engine.x.mask;
 # endif /* XXX no shaped window support for software_16_x11 */
 
-       einfo->info.drawable = ee->engine.x.win;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-       evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-       ecore_x_window_shape_mask_set(ee->engine.x.win, 0);
-       ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-       if (ee->prop.borderless)
-         ecore_x_mwm_borderless_set(ee->engine.x.win, ee->prop.borderless);
-       if (ee->visible) ecore_x_window_show(ee->engine.x.win);
-       if (ee->prop.focused) ecore_x_window_focus(ee->engine.x.win);
-       if (ee->prop.title)
-         {
-            ecore_x_icccm_title_set(ee->engine.x.win, ee->prop.title);
-            ecore_x_netwm_name_set(ee->engine.x.win, ee->prop.title);
-         }
+        einfo->info.drawable = ee->prop.window;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+        ecore_x_window_shape_mask_set(ee->prop.window, 0);
+        ecore_x_input_multi_select(ee->prop.window);
+        ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                                    (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                                    (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                                    (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                                    (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+        if (ee->prop.borderless)
+          ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
+        if (ee->visible) ecore_x_window_show(ee->prop.window);
+        if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
+        if (ee->prop.title)
+          {
+             ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
+             ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
+          }
+        if (ee->prop.name)
+          ecore_x_icccm_name_class_set(ee->prop.window,
+                                       ee->prop.name, ee->prop.clas);
+        _ecore_evas_x_hints_update(ee);
+        _ecore_evas_x_group_leader_update(ee);
+        ecore_x_window_defaults_set(ee->prop.window);
+        _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
+        _ecore_evas_x_size_pos_hints_update(ee);
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+        if ((id = getenv("DESKTOP_STARTUP_ID")))
+          {
+             ecore_x_netwm_startup_id_set(ee->prop.window, id);
+             /* NB: on linux this may simply empty the env as opposed to completely
+              * unset it to being empty - unsure as solartis libc crashes looking
+              * for the '=' char */
+             //        putenv((char*)"DESKTOP_STARTUP_ID=");
+          }
+     }
+   else if (!strcmp(ee->driver, "software_8_x11"))
+     {
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+        Evas_Engine_Info_Software_8_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+
+        ee->shaped = 0;
+        ee->alpha = alpha;
+        ecore_x_window_free(ee->prop.window);
+        ecore_event_window_unregister(ee->prop.window);
+        if (ee->alpha)
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (!ee->engine.x.mask)
+               ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
+          }
+        else
+          {
+             if (ee->prop.override)
+               ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             else
+               ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
+             if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+             ee->engine.x.mask = 0;
+             ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
+          }
+
+        einfo->info.destination_alpha = alpha;
+
+        ecore_x_window_attributes_get(ee->prop.window, &att);
+        einfo->info.visual = att.visual;
+        einfo->info.colormap = att.colormap;
+        einfo->info.depth = att.depth;
+
+//        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
+//        ee->engine.x.mask = 0;
+        einfo->info.mask = ee->engine.x.mask;
+        einfo->info.drawable = ee->prop.window;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
+        ecore_x_window_shape_mask_set(ee->prop.window, 0);
+        ecore_x_input_multi_select(ee->prop.window);
+        ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                                    (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                                    (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                                    (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                                    (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+        if (ee->prop.borderless)
+          ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
+        if (ee->visible) ecore_x_window_show(ee->prop.window);
+        if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
+        if (ee->prop.title)
+          {
+             ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
+             ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
+          }
+        if (ee->prop.name)
+          ecore_x_icccm_name_class_set(ee->prop.window,
+                                       ee->prop.name, ee->prop.clas);
+        _ecore_evas_x_hints_update(ee);
+        _ecore_evas_x_group_leader_update(ee);
+        ecore_x_window_defaults_set(ee->prop.window);
+        _ecore_evas_x_protocols_set(ee);
+        _ecore_evas_x_sync_set(ee);
+        _ecore_evas_x_size_pos_hints_update(ee);
+
+        if ((id = getenv("DESKTOP_STARTUP_ID")))
+          {
+             ecore_x_netwm_startup_id_set(ee->prop.window, id);
+             /* NB: on linux this may simply empty the env as opposed to completely
+              * unset it to being empty - unsure as solartis libc crashes looking
+              * for the '=' char */
+             //        putenv((char*)"DESKTOP_STARTUP_ID=");
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
      }
 }
-#endif /* BUILD_ECORE_EVAS_X11 */
 
-static void *
-_ecore_evas_x_window_get(Ecore_Evas *ee)
+static void
+_ecore_evas_x_transparent_set(Ecore_Evas *ee, int transparent)
 {
-#ifdef BUILD_ECORE_EVAS_X11
-  return (void *) (long)ee->engine.x.win;
-#else
-   return 0;
-#endif /* BUILD_ECORE_EVAS_X11 */
+   if ((ee->transparent == transparent)) return;
+
+   if (!strcmp(ee->driver, "software_x11"))
+     {
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+        Evas_Engine_Info_Software_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+        if (!einfo) return;
+
+        ee->transparent = transparent;
+        einfo->info.destination_alpha = transparent;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
+        evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+#endif
+     }
+}
+
+static void
+_ecore_evas_x_window_group_set(Ecore_Evas *ee, const Ecore_Evas *group_ee)
+{
+   if (ee->prop.group_ee == group_ee) return;
+
+   ee->prop.group_ee = (Ecore_Evas *)group_ee;
+   if (ee->prop.group_ee)
+     ee->prop.group_ee_win = group_ee->prop.window;
+   else
+     ee->prop.group_ee_win = 0;
+   _ecore_evas_x_hints_update(ee);
+}
+
+static void
+_ecore_evas_x_aspect_set(Ecore_Evas *ee, double aspect)
+{
+   if (ee->prop.aspect == aspect) return;
+
+   ee->prop.aspect = aspect;
+   _ecore_evas_x_size_pos_hints_update(ee);
+// netwm state  
+//   if (ee->should_be_visible)
+//     ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+//                                      ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
+//   else
+//     _ecore_evas_x_state_update(ee);
+}
+
+static void
+_ecore_evas_x_urgent_set(Ecore_Evas *ee, int urgent)
+{
+   if (ee->prop.urgent == urgent) return;
+
+   ee->prop.urgent = urgent;
+   _ecore_evas_x_hints_update(ee);
+}
+
+static void
+_ecore_evas_x_modal_set(Ecore_Evas *ee, int modal)
+{
+   if (ee->prop.modal == modal) return;
+
+   ee->prop.modal = modal;
+   if (ee->should_be_visible)
+     ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                      ECORE_X_WINDOW_STATE_MODAL, -1, modal);
+   else
+     _ecore_evas_x_state_update(ee);
+}
+
+static void
+_ecore_evas_x_demand_attention_set(Ecore_Evas *ee, int demand)
+{
+   if (ee->prop.demand_attention == demand) return;
+
+   ee->prop.demand_attention = demand;
+   if (ee->should_be_visible)
+     ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                      ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION, -1, demand);
+   else
+     _ecore_evas_x_state_update(ee);
+}
+
+static void
+_ecore_evas_x_focus_skip_set(Ecore_Evas *ee, int skip)
+{
+   if (ee->prop.focus_skip == skip) return;
+
+   ee->prop.focus_skip = skip;
+   if (ee->should_be_visible)
+     {
+        ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                         ECORE_X_WINDOW_STATE_SKIP_TASKBAR, -1, skip);
+        ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                         ECORE_X_WINDOW_STATE_SKIP_PAGER, -1, skip);
+     }
+   else
+     _ecore_evas_x_state_update(ee);
+   _ecore_evas_x_hints_update(ee);
 }
 
+#endif /* BUILD_ECORE_EVAS_X11 */
+
 #ifdef BUILD_ECORE_EVAS_X11
 static void
 _ecore_evas_x_show(Ecore_Evas *ee)
@@ -2095,41 +2468,37 @@ _ecore_evas_x_show(Ecore_Evas *ee)
    ee->should_be_visible = 1;
    if (ee->prop.avoid_damage)
      _ecore_evas_x_render(ee);
-   ecore_x_window_show(ee->engine.x.win);
+   _ecore_evas_x_sync_set(ee);
+   ecore_x_window_show(ee->prop.window);
    if (ee->prop.fullscreen)
-     ecore_x_window_focus(ee->engine.x.win);
+     ecore_x_window_focus(ee->prop.window);
 }
 
 static void
 _ecore_evas_x_hide(Ecore_Evas *ee)
 {
-   ecore_x_window_hide(ee->engine.x.win);
+   ecore_x_window_hide(ee->prop.window);
    ee->should_be_visible = 0;
+   _ecore_evas_x_sync_set(ee);
 }
 
 static void
 _ecore_evas_x_raise(Ecore_Evas *ee)
 {
-   if (!ee->prop.fullscreen)
-     ecore_x_window_raise(ee->engine.x.win);
-   else
-     ecore_x_window_raise(ee->engine.x.win);
+   ecore_x_window_raise(ee->prop.window);
 }
 
 static void
 _ecore_evas_x_lower(Ecore_Evas *ee)
 {
-   if (!ee->prop.fullscreen)
-     ecore_x_window_lower(ee->engine.x.win);
-   else
-     ecore_x_window_lower(ee->engine.x.win);
+   ecore_x_window_lower(ee->prop.window);
 }
 
 static void
 _ecore_evas_x_activate(Ecore_Evas *ee)
 {
    ecore_x_netwm_client_active_request(ee->engine.x.win_root,
-                                      ee->engine.x.win, 2, 0);
+                                       ee->prop.window, 2, 0);
 }
 
 static void
@@ -2138,8 +2507,8 @@ _ecore_evas_x_title_set(Ecore_Evas *ee, const char *t)
    if (ee->prop.title) free(ee->prop.title);
    ee->prop.title = NULL;
    if (t) ee->prop.title = strdup(t);
-   ecore_x_icccm_title_set(ee->engine.x.win, ee->prop.title);
-   ecore_x_netwm_name_set(ee->engine.x.win, ee->prop.title);
+   ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
+   ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
 }
 
 static void
@@ -2149,9 +2518,9 @@ _ecore_evas_x_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
    if (ee->prop.clas) free(ee->prop.clas);
    ee->prop.name = NULL;
    ee->prop.clas = NULL;
-   ee->prop.name = strdup(n);
-   ee->prop.clas = strdup(c);
-   ecore_x_icccm_name_class_set(ee->engine.x.win, ee->prop.name, ee->prop.clas);
+   if (n) ee->prop.name = strdup(n);
+   if (c) ee->prop.clas = strdup(c);
+   ecore_x_icccm_name_class_set(ee->prop.window, ee->prop.name, ee->prop.clas);
 }
 
 static void
@@ -2199,20 +2568,29 @@ _ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
 }
 
 static void
+_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee;
+
+   ee = data;
+   if (ee) ee->prop.cursor.object = NULL;
+}
+
+static void
 _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
 {
    int x, y;
 
    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
 
-   if (obj == NULL)
+   if (!obj)
      {
-       ee->prop.cursor.object = NULL;
-       ee->prop.cursor.layer = 0;
-       ee->prop.cursor.hot.x = 0;
-       ee->prop.cursor.hot.y = 0;
-       ecore_x_window_cursor_show(ee->engine.x.win, 1);
-       return;
+        ee->prop.cursor.object = NULL;
+        ee->prop.cursor.layer = 0;
+        ee->prop.cursor.hot.x = 0;
+        ee->prop.cursor.hot.y = 0;
+        ecore_x_window_cursor_show(ee->prop.window, 1);
+        return;
      }
 
    ee->prop.cursor.object = obj;
@@ -2220,16 +2598,18 @@ _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int
    ee->prop.cursor.hot.x = hot_x;
    ee->prop.cursor.hot.y = hot_y;
 
-   ecore_x_window_cursor_show(ee->engine.x.win, 0);
+   ecore_x_window_cursor_show(ee->prop.window, 0);
 
    evas_pointer_output_xy_get(ee->evas, &x, &y);
    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
    evas_object_move(ee->prop.cursor.object,
-                   x - ee->prop.cursor.hot.x,
-                   y - ee->prop.cursor.hot.y);
+                    x - ee->prop.cursor.hot.x,
+                    y - ee->prop.cursor.hot.y);
    evas_object_pass_events_set(ee->prop.cursor.object, 1);
    if (evas_pointer_inside_get(ee->evas))
      evas_object_show(ee->prop.cursor.object);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
 }
 
 /*
@@ -2258,48 +2638,28 @@ _ecore_evas_x_layer_set(Ecore_Evas *ee, int layer)
 static void
 _ecore_evas_x_focus_set(Ecore_Evas *ee, int on __UNUSED__)
 {
-   ecore_x_window_focus(ee->engine.x.win);
+   ecore_x_window_focus(ee->prop.window);
 }
 
 static void
 _ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
 {
-//   if (((ee->prop.iconified) && (on)) ||
-//       ((!ee->prop.iconified) && (!on))) return;
-   ee->prop.iconified = on;
+   if (ee->prop.iconified == on) return;
+   if (((ee->should_be_visible) && (!ee->visible)) || (!ee->visible))
+     ee->prop.iconified = on;
+   _ecore_evas_x_hints_update(ee);
    if (on)
-     {
-       ecore_x_icccm_hints_set(ee->engine.x.win,
-                               1 /* accepts_focus */,
-                               ECORE_X_WINDOW_STATE_HINT_ICONIC /* initial_state */,
-                               0 /* icon_pixmap */,
-                               0 /* icon_mask */,
-                               0 /* icon_window */,
-                               0 /* window_group */,
-                               0 /* is_urgent */);
-       ecore_x_icccm_iconic_request_send(ee->engine.x.win, ee->engine.x.win_root);
-     }
-   else
-     {
-       ecore_x_icccm_hints_set(ee->engine.x.win,
-                               1 /* accepts_focus */,
-                               ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
-                               0 /* icon_pixmap */,
-                               0 /* icon_mask */,
-                               0 /* icon_window */,
-                               0 /* window_group */,
-                               0 /* is_urgent */);
-       ecore_evas_show(ee);
-     }
+     ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
+   else
+     ecore_evas_show(ee);
 }
 
 static void
 _ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
 {
-   if (((ee->prop.borderless) && (on)) ||
-       ((!ee->prop.borderless) && (!on))) return;
+   if (ee->prop.borderless == on) return;
    ee->prop.borderless = on;
-   ecore_x_mwm_borderless_set(ee->engine.x.win, ee->prop.borderless);
+   ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
 }
 
 /* FIXME: This function changes the initial state of the ee
@@ -2307,42 +2667,29 @@ _ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
 static void
 _ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
 {
-   Ecore_X_Window_State_Hint hint;
-
-   if ((ee->prop.withdrawn && withdrawn) ||
-      (!ee->prop.withdrawn && !withdrawn)) return;
-
-   ee->prop.withdrawn = withdrawn;
+   if (ee->prop.withdrawn == withdrawn) return;
+//   ee->prop.withdrawn = withdrawn;
+   _ecore_evas_x_hints_update(ee);
    if (withdrawn)
-     hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
+     ecore_evas_hide(ee);
    else
-     hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
-
-   ecore_x_icccm_hints_set(ee->engine.x.win,
-                          1 /* accepts_focus */,
-                          hint /* initial_state */,
-                          0 /* icon_pixmap */,
-                          0 /* icon_mask */,
-                          0 /* icon_window */,
-                          0 /* window_group */,
-                          0 /* is_urgent */);
+     ecore_evas_show(ee);
 }
 
 static void
 _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
 {
-   if ((ee->prop.sticky && sticky) ||
-      (!ee->prop.sticky && !sticky)) return;
+   if (ee->prop.sticky == sticky) return;
 
    /* We dont want to set prop.sticky here as it will cause
     * the sticky callback not to get called. Its set on the
     * property change event.
     * ee->prop.sticky = sticky;
     */
-   ee->engine.x.state.sticky = sticky;
+//   ee->engine.x.state.sticky = sticky;
    if (ee->should_be_visible)
-     ecore_x_netwm_state_request_send(ee->engine.x.win, ee->engine.x.win_root,
-                                     ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
+     ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                      ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
    else
      _ecore_evas_x_state_update(ee);
 }
@@ -2350,21 +2697,11 @@ _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
 static void
 _ecore_evas_x_ignore_events_set(Ecore_Evas *ee, int ignore)
 {
-   if ((ee->ignore_events && ignore) ||
-       (!ee->ignore_events && !ignore)) return;
+   if (ee->ignore_events == ignore) return;
 
-   if (ignore)
-     {
-       ee->ignore_events = 1;
-       if (ee->engine.x.win)
-         ecore_x_window_ignore_set(ee->engine.x.win, 1);
-     }
-   else
-     {
-       ee->ignore_events = 0;
-       if (ee->engine.x.win)
-         ecore_x_window_ignore_set(ee->engine.x.win, 0);
-     }
+   ee->ignore_events = ignore;
+   if (ee->prop.window)
+     ecore_x_window_ignore_set(ee->prop.window, ignore);
 }
 
 /*
@@ -2374,40 +2711,27 @@ _ecore_evas_x_reinit_win(Ecore_Evas *ee)
    if (!strcmp(ee->driver, "software_x11"))
      {
 #ifdef BUILD_ECORE_EVAS_X11
-       Evas_Engine_Info_Software_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-       if (einfo)
-         {
-            einfo->info.drawable = ee->engine.x.win;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-         }
-#endif
-     }
-   else if (!strcmp(ee->driver, "xrender_x11"))
-     {
-#ifdef BUILD_ECORE_EVAS_XRENDER_X11
-       Evas_Engine_Info_XRender_X11 *einfo;
+        Evas_Engine_Info_Software_X11 *einfo;
 
-       einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
-       if (einfo)
-         {
-            einfo->info.drawable = ee->engine.x.win;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-         }
+        einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             einfo->info.drawable = ee->prop.window;
+             evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+          }
 #endif
      }
-   else if (!strcmp(ee->driver, "gl_x11"))
+   else if (!strcmp(ee->driver, "opengl_x11"))
      {
 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
-       Evas_Engine_Info_GL_X11 *einfo;
-
-       einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
-       if (einfo)
-         {
-            einfo->info.drawable = ee->engine.x.win;
-            evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-         }
+        Evas_Engine_Info_GL_X11 *einfo;
+
+        einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             einfo->info.drawable = ee->prop.window;
+             evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+          }
 #endif
      }
 }
@@ -2416,141 +2740,297 @@ _ecore_evas_x_reinit_win(Ecore_Evas *ee)
 static void
 _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
 {
-   if (((ee->prop.override) && (on)) ||
-       ((!ee->prop.override) && (!on))) return;
-   ecore_x_window_hide(ee->engine.x.win);
-   ecore_x_window_override_set(ee->engine.x.win, on);
-   if (ee->visible) ecore_x_window_show(ee->engine.x.win);
-   if (ee->prop.focused) ecore_x_window_focus(ee->engine.x.win);
+   if (ee->prop.override == on) return;
+   if (ee->should_be_visible) ecore_x_window_hide(ee->prop.window);
+   ecore_x_window_override_set(ee->prop.window, on);
+   if (ee->should_be_visible) ecore_x_window_show(ee->prop.window);
+   if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
    ee->prop.override = on;
 }
 
 static void
+_ecore_evas_x_maximized_set(Ecore_Evas *ee, int on)
+{
+   if (ee->prop.maximized == on) return;
+   ee->engine.x.state.maximized_h = 1;
+   ee->engine.x.state.maximized_v = 1;
+//   ee->prop.maximized = on;
+   if (ee->should_be_visible)
+     {
+        ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                         ECORE_X_WINDOW_STATE_MAXIMIZED_VERT, -1, on);
+        ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                         ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ, -1, on);
+     }
+   else
+     _ecore_evas_x_state_update(ee);
+}
+
+static void
 _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
 {
-   if ((ee->prop.fullscreen && on) ||
-      (!ee->prop.fullscreen && !on)) return;
+   if (ee->prop.fullscreen == on) return;
 
    /* FIXME: Detect if WM is EWMH compliant and handle properly if not,
     * i.e. reposition, resize, and change borderless hint */
    ee->engine.x.state.fullscreen = on;
    if (ee->should_be_visible)
-     ecore_x_netwm_state_request_send(ee->engine.x.win, ee->engine.x.win_root,
-                                     ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
+     ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
+                                      ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
    else
      _ecore_evas_x_state_update(ee);
 }
 
 static void
+_ecore_evas_x_profiles_set(Ecore_Evas *ee, const char **plist, int n)
+{
+   /* Ecore_Evas's profile will be updated when WM sets the E_PROFILE. */
+   ecore_x_e_window_profile_list_set(ee->prop.window, plist, n);
+}
+
+static void
 _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
 {
    if (ee->prop.avoid_damage == on) return;
-   if (!strcmp(ee->driver, "gl_x11")) return;
-   if (!strcmp(ee->driver, "xrender_x11")) return;
+   if (!strcmp(ee->driver, "opengl_x11")) return;
 
-   if ((!strcmp(ee->driver, "software_x11")) || (!strcmp(ee->driver, "software_xcb")))
+   if (!strcmp(ee->driver, "software_x11"))
      {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       Evas_Engine_Info_Software_Xcb *einfo;
-# else
-       Evas_Engine_Info_Software_X11 *einfo;
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+        Evas_Engine_Info_Software_X11 *einfo;
 
-       ee->prop.avoid_damage = on;
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas);
-# else
-       einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-# endif /* !BUILD_ECORE_EVAS_SOFTWARE_XCB */
-       if (einfo)
-         {
-            if (ee->prop.avoid_damage)
-              {
-                 ee->engine.x.pmap = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, einfo->info.depth);
-                 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap);
-                 einfo->info.drawable = ee->engine.x.pmap;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 if ((ee->rotation == 90) || (ee->rotation == 270))
-                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
-                 else
-                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-                 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
-                   {
-                      ee->engine.x.using_bg_pixmap = 1;
-                      ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
-                      ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
-                   }
-                 if (ee->engine.x.direct_resize)
-                   {
-                      /* Turn this off for now
-                         ee->engine.x.using_bg_pixmap = 1;
-                         ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
-                      */
-                   }
-              }
-            else
-              {
-                 if (ee->engine.x.pmap) ecore_x_pixmap_del(ee->engine.x.pmap);
-                 if (ee->engine.x.gc) ecore_x_gc_del(ee->engine.x.gc);
-                 if (ee->engine.x.using_bg_pixmap)
-                   {
-                      ecore_x_window_pixmap_set(ee->engine.x.win, 0);
-                      ee->engine.x.using_bg_pixmap = 0;
-                      ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
-                   }
-                 ee->engine.x.pmap = 0;
-                 ee->engine.x.gc = 0;
-                 einfo->info.drawable = ee->engine.x.win;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-              }
-         }
-#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 || BUILD_ECORE_EVAS_SOFTWARE_XCB */
+        ee->prop.avoid_damage = on;
+        einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             if (ee->prop.avoid_damage)
+               {
+                  ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
+                  ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
+                  einfo->info.drawable = ee->engine.x.pmap;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  if ((ee->rotation == 90) || (ee->rotation == 270))
+                    evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+                  else
+                    evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+                  if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
+                    {
+                       ee->engine.x.using_bg_pixmap = 1;
+                       ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+                       ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
+                    }
+                  if (ee->engine.x.direct_resize)
+                    {
+                       /* Turn this off for now
+                          ee->engine.x.using_bg_pixmap = 1;
+                          ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+                       */
+                    }
+               }
+             else
+               {
+                  if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
+                  if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
+                  if (ee->engine.x.using_bg_pixmap)
+                    {
+                       ecore_x_window_pixmap_set(ee->prop.window, 0);
+                       ee->engine.x.using_bg_pixmap = 0;
+                       ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
+                    }
+                  ee->engine.x.pmap = 0;
+                  ee->engine.x.gc = 0;
+                  einfo->info.drawable = ee->prop.window;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+               }
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
      }
    else if (!strcmp(ee->driver, "software_16_x11"))
      {
 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-       Evas_Engine_Info_Software_16_X11 *einfo;
-       ee->prop.avoid_damage = on;
-
-       einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
-       if (einfo)
-         {
-            if (ee->prop.avoid_damage)
-              {
-                 ee->engine.x.pmap = ecore_x_pixmap_new(ee->engine.x.win, ee->w, ee->h, 16);
-                 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap);
-                 einfo->info.drawable = ee->engine.x.pmap;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-                 if ((ee->rotation == 90) || (ee->rotation == 270))
-                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
-                 else
-                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-                 if (ee->engine.x.direct_resize)
-                   {
-                      /* Turn this off for now
-                         ee->engine.x.using_bg_pixmap = 1;
-                         ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
-                      */
-                   }
-              }
-            else
-              {
-                 if (ee->engine.x.pmap) ecore_x_pixmap_del(ee->engine.x.pmap);
-                 if (ee->engine.x.gc) ecore_x_gc_del(ee->engine.x.gc);
-                 if (ee->engine.x.using_bg_pixmap)
-                   {
-                      ecore_x_window_pixmap_set(ee->engine.x.win, 0);
-                      ee->engine.x.using_bg_pixmap = 0;
-                   }
-                 ee->engine.x.pmap = 0;
-                 ee->engine.x.gc = 0;
-                 einfo->info.drawable = ee->engine.x.win;
-                 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-              }
-         }
+        Evas_Engine_Info_Software_16_X11 *einfo;
+
+        ee->prop.avoid_damage = on;
+        einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             if (ee->prop.avoid_damage)
+               {
+                  ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16);
+                  ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
+                  einfo->info.drawable = ee->engine.x.pmap;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  if ((ee->rotation == 90) || (ee->rotation == 270))
+                    evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+                  else
+                    evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+                  if (ee->engine.x.direct_resize)
+                    {
+                       /* Turn this off for now
+                          ee->engine.x.using_bg_pixmap = 1;
+                          ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+                       */
+                    }
+               }
+             else
+               {
+                  if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
+                  if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
+                  if (ee->engine.x.using_bg_pixmap)
+                    {
+                       ecore_x_window_pixmap_set(ee->prop.window, 0);
+                       ee->engine.x.using_bg_pixmap = 0;
+                    }
+                  ee->engine.x.pmap = 0;
+                  ee->engine.x.gc = 0;
+                  einfo->info.drawable = ee->prop.window;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+               }
+          }
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
      }
+   else if (!strcmp(ee->driver, "software_8_x11"))
+     {
+#if BUILD_ECORE_EVAS_SOFTWARE_8_X11
+        Evas_Engine_Info_Software_8_X11 *einfo;
+
+        ee->prop.avoid_damage = on;
+        einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
+        if (einfo)
+          {
+             if (ee->prop.avoid_damage)
+               {
+                  ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
+                  ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
+                  einfo->info.drawable = ee->engine.x.pmap;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+                  if ((ee->rotation == 90) || (ee->rotation == 270))
+                    evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
+                  else
+                    evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
+                  if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
+                    {
+                       ee->engine.x.using_bg_pixmap = 1;
+                       ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+                       ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
+                    }
+                  if (ee->engine.x.direct_resize)
+                    {
+                       /* Turn this off for now
+                          ee->engine.x.using_bg_pixmap = 1;
+                          ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+                       */
+                    }
+               }
+             else
+               {
+                  if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
+                  if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
+                  if (ee->engine.x.using_bg_pixmap)
+                    {
+                       ecore_x_window_pixmap_set(ee->prop.window, 0);
+                       ee->engine.x.using_bg_pixmap = 0;
+                       ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
+                    }
+                  ee->engine.x.pmap = 0;
+                  ee->engine.x.gc = 0;
+                  einfo->info.drawable = ee->prop.window;
+                  if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+                    {
+                       ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+                    }
+               }
+          }
+#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
+     }
+}
+
+static void
+_ecore_evas_x_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
+{
+   int outnum = 0;
+   int px = 0, py = 0, pw = 0, ph = 0;
+   Ecore_X_Window root;
+   Ecore_X_Randr_Output *out = NULL;
+   Ecore_X_Randr_Crtc crtc;
+   unsigned int val[4] = { 0 };
+   
+   if (ecore_x_window_prop_card32_get
+       (ee->prop.window, ecore_x_atom_get("E_ZONE_GEOMETRY"), val, 4) == 4)
+     {
+        if (x) *x = (int)val[0];
+        if (y) *y = (int)val[1];
+        if (w) *w = (int)val[2];
+        if (h) *h = (int)val[3];
+        return;
+     }
+   
+   root = ecore_x_window_root_get(ee->prop.window);
+   out = ecore_x_randr_window_outputs_get(ee->prop.window, &outnum);
+   if (!out)
+     {
+norandr:
+        if (out) free(out);
+        if (x) *x = 0;
+        if (y) *y = 0;
+        ecore_x_window_size_get(root, w, h);
+        return;
+     }
+   crtc = ecore_x_randr_output_crtc_get(root, out[0]);
+   if (!crtc) goto norandr;
+   ecore_x_randr_crtc_geometry_get(root, crtc, &px, &py, &pw, &ph);
+   if ((pw == 0) || (ph == 0)) goto norandr;
+   if (x) *x = px;
+   if (y) *y = py;
+   if (w) *w = pw;
+   if (h) *h = ph;
+   free(out);
+}
+
+static void
+_ecore_evas_x_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi)
+{
+   int scdpi, xmm = 0, ymm = 0, outnum = 0, w = 0, h = 0;
+   int px = 0, py = 0;
+   Ecore_X_Window root;
+   Ecore_X_Randr_Output *out = NULL;
+   Ecore_X_Randr_Crtc crtc;
+
+   root = ecore_x_window_root_get(ee->prop.window);
+   out = ecore_x_randr_window_outputs_get(ee->prop.window, &outnum);
+   if (!out)
+     {
+norandr:
+        if (out) free(out);
+        scdpi = ecore_x_dpi_get();
+        if (xdpi) *xdpi = scdpi;
+        if (ydpi) *ydpi = scdpi;
+        return;
+     }
+   crtc = ecore_x_randr_output_crtc_get(root, out[0]);
+   if (!crtc) goto norandr;
+   ecore_x_randr_crtc_geometry_get(root, crtc, &px, &py, &w, &h);
+   if ((w == 0) || (h == 0)) goto norandr;
+   ecore_x_randr_output_size_mm_get(root, out[0], &xmm, &ymm);
+   if ((xmm == 0) || (ymm == 0)) goto norandr;
+   if (xdpi) *xdpi = (w * 254) / (xmm * 10); // 25.4mm / inch
+   if (ydpi) *ydpi = (h * 254) / (ymm * 10); // 25.4mm / inch
+   free(out);
 }
 
 int
@@ -2559,20 +3039,20 @@ _ecore_evas_x_shutdown(void)
    _ecore_evas_init_count--;
    if (_ecore_evas_init_count == 0)
      {
-       int i;
+        unsigned int i;
 
-       while (ecore_evases) _ecore_evas_free(ecore_evases);
-       for (i = 0; i < 18; i++)
-         ecore_event_handler_del(ecore_evas_event_handlers[i]);
-       ecore_idle_enterer_del(ecore_evas_idle_enterer);
-       ecore_evas_idle_enterer = NULL;
-       if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
+        for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
+          {
+             if (ecore_evas_event_handlers[i])
+               ecore_event_handler_del(ecore_evas_event_handlers[i]);
+          }
+        ecore_event_evas_shutdown();
      }
    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
    return _ecore_evas_init_count;
 }
 
-static const Ecore_Evas_Engine_Func _ecore_x_engine_func =
+static Ecore_Evas_Engine_Func _ecore_x_engine_func =
 {
    _ecore_evas_x_free,
      NULL,
@@ -2612,47 +3092,426 @@ static const Ecore_Evas_Engine_Func _ecore_x_engine_func =
      _ecore_evas_x_iconified_set,
      _ecore_evas_x_borderless_set,
      _ecore_evas_x_override_set,
-     NULL,
+     _ecore_evas_x_maximized_set,
      _ecore_evas_x_fullscreen_set,
      _ecore_evas_x_avoid_damage_set,
      _ecore_evas_x_withdrawn_set,
      _ecore_evas_x_sticky_set,
      _ecore_evas_x_ignore_events_set,
      _ecore_evas_x_alpha_set,
-     _ecore_evas_x_window_get
+     _ecore_evas_x_transparent_set,
+     _ecore_evas_x_profiles_set,
+   
+     _ecore_evas_x_window_group_set,
+     _ecore_evas_x_aspect_set,
+     _ecore_evas_x_urgent_set,
+     _ecore_evas_x_modal_set,
+     _ecore_evas_x_demand_attention_set,
+     _ecore_evas_x_focus_skip_set,
+
+     NULL, // render
+     _ecore_evas_x_screen_geometry_get,
+     _ecore_evas_x_screen_dpi_get
 };
 #endif /* BUILD_ECORE_EVAS_X11 */
 
 /*
  * FIXME: there are some round trips. Especially, we can split
- * ecore_x_init in 2 functions and supress some round trips.
+ * ecore_x_init in 2 functions and suppress some round trips.
+ */
+
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_OPENGL_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_16_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+static void
+_ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+
+   if (ee->no_comp_sync) return;
+   if (!_ecore_evas_app_comp_sync) return;
+   if (ee->engine.x.sync_counter)
+     {
+        if (ee->engine.x.sync_began)
+          {
+             ee->engine.x.sync_val++;
+             if (!ee->engine.x.sync_cancel)
+               {
+                  if (!ee->semi_sync)
+                     ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
+                                                   ee->engine.x.sync_val);
+               }
+          }
+     }
+}
+
+static void
+_ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
+{
+   Ecore_Evas *ee = data;
+
+   if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
+       (!ee->gl_sync_draw_done)) // added by gl77.lee
+     {
+        if (ee->engine.x.sync_counter)
+          {
+             if (ee->engine.x.sync_began)
+               {
+                  if (!ee->engine.x.sync_cancel)
+                    {
+                       ecore_x_e_comp_sync_draw_size_done_send
+                          (ee->engine.x.win_root, ee->prop.window, ee->w, ee->h);
+                    }
+               }
+          }
+     }
+   if (ee->engine.x.netwm_sync_set)
+     {
+        ecore_x_sync_counter_2_set(ee->engine.x.netwm_sync_counter,
+                                   ee->engine.x.netwm_sync_val_hi,
+                                   ee->engine.x.netwm_sync_val_lo);
+        ee->engine.x.netwm_sync_set = 0;
+     }
+}
+#endif
+
+/**
+ * @brief Create Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
+ * @param disp_name The name of the Ecore_Evas to be created.
+ * @param parent The parent of the Ecore_Evas to be created.
+ * @param x The X coordinate to be used.
+ * @param y The Y coordinate to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return A handle to the created Ecore_Evas.
+ */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+EAPI Ecore_Evas *
+ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
+                            int x, int y, int w, int h)
+{
+   Evas_Engine_Info_Software_X11 *einfo;
+   Ecore_Evas *ee;
+   int argb = 0, rmethod;
+   static int redraw_debug = -1;
+   char *id = NULL;
+
+   rmethod = evas_render_method_lookup("software_x11");
+   if (!rmethod) return NULL;
+   if (!ecore_x_init(disp_name)) return NULL;
+   ee = calloc(1, sizeof(Ecore_Evas));
+   if (!ee) return NULL;
+
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
+
+   _ecore_evas_x_init();
+
+   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
+
+   ee->driver = "software_x11";
+   if (disp_name) ee->name = strdup(disp_name);
+
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
+   ee->x = x;
+   ee->y = y;
+   ee->w = w;
+   ee->h = h;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
+
+   ee->prop.max.w = 32767;
+   ee->prop.max.h = 32767;
+   ee->prop.layer = 4;
+   ee->prop.request_pos = 0;
+   ee->prop.sticky = 0;
+   ee->engine.x.state.sticky = 0;
+
+   /* init evas here */
+   ee->evas = evas_new();
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE,
+                           _ecore_evas_x_flush_pre, ee);
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST,
+                           _ecore_evas_x_flush_post, ee);
+   evas_data_attach_set(ee->evas, ee);
+   evas_output_method_set(ee->evas, rmethod);
+   evas_output_size_set(ee->evas, w, h);
+   evas_output_viewport_set(ee->evas, 0, 0, w, h);
+
+   ee->engine.x.win_root = parent;
+   ee->engine.x.screen_num = 0;
+
+   if (parent != 0)
+     {
+        ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
+       /* FIXME: round trip in ecore_x_window_argb_get */
+        if (ecore_x_window_argb_get(parent))
+          {
+             ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
+             argb = 1;
+          }
+        else
+          ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
+     }
+   else
+     ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
+   if ((id = getenv("DESKTOP_STARTUP_ID")))
+     {
+        ecore_x_netwm_startup_id_set(ee->prop.window, id);
+        /* NB: on linux this may simply empty the env as opposed to completely
+         * unset it to being empty - unsure as solartis libc crashes looking
+         * for the '=' char */
+//        putenv((char*)"DESKTOP_STARTUP_ID=");
+     }
+   einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
+   if (einfo)
+     {
+        Ecore_X_Screen *screen;
+
+        /* FIXME: this is inefficient as its 1 or more round trips */
+        screen = ecore_x_default_screen_get();
+        if (ecore_x_screen_count_get() > 1)
+          {
+             Ecore_X_Window *roots;
+             int num, i;
+
+             num = 0;
+             roots = ecore_x_window_root_list(&num);
+             if (roots)
+               {
+                  Ecore_X_Window root;
+
+                  root = ecore_x_window_root_get(parent);
+                  for (i = 0; i < num; i++)
+                    {
+                       if (root == roots[i])
+                         {
+                            screen = ecore_x_screen_get(i);
+                            break;
+                         }
+                    }
+                  free(roots);
+               }
+          }
+
+        einfo->info.destination_alpha = argb;
+
+        if (redraw_debug < 0)
+          {
+             if (getenv("REDRAW_DEBUG"))
+               redraw_debug = atoi(getenv("REDRAW_DEBUG"));
+             else
+               redraw_debug = 0;
+          }
+
+# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
+        einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB;
+        einfo->info.connection = ecore_x_connection_get();
+        einfo->info.screen = screen;
+# else
+        einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
+        einfo->info.connection = ecore_x_display_get();
+        einfo->info.screen = NULL;
+# endif
+        einfo->info.drawable = ee->prop.window;
+
+        if (argb)
+          {
+             Ecore_X_Window_Attributes at;
+
+             ecore_x_window_attributes_get(ee->prop.window, &at);
+             einfo->info.visual = at.visual;
+             einfo->info.colormap = at.colormap;
+             einfo->info.depth = at.depth;
+             einfo->info.destination_alpha = 1;
+          }
+        else
+          {
+             einfo->info.visual =
+               ecore_x_default_visual_get(einfo->info.connection, screen);
+             einfo->info.colormap =
+               ecore_x_default_colormap_get(einfo->info.connection, screen);
+             einfo->info.depth =
+               ecore_x_default_depth_get(einfo->info.connection, screen);
+             einfo->info.destination_alpha = 0;
+          }
+
+        einfo->info.rotation = 0;
+        einfo->info.debug = redraw_debug;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+
+   _ecore_evas_x_hints_update(ee);
+   _ecore_evas_x_group_leader_set(ee);
+   ecore_x_window_defaults_set(ee->prop.window);
+   _ecore_evas_x_protocols_set(ee);
+   _ecore_evas_x_sync_set(ee);
+
+   ee->engine.func->fn_render = _ecore_evas_x_render;
+   _ecore_evas_register(ee);
+   ecore_x_input_multi_select(ee->prop.window);
+   ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+   return ee;
+}
+#else
+EAPI Ecore_Evas *
+ecore_evas_software_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
+                            int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return NULL;
+}
+#endif
+
+/**
+ * @brief Get the window from Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support for x11 or if @p ee was not
+ * created with ecore_evas_software_x11_new() then nothing is done and
+ * 0 is returned.
+ * @param ee The Ecore_Evas from which to get the window.
+ * @return The window of type Ecore_X_Window.
+ */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+EAPI Ecore_X_Window
+ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
+{
+   if (!(!strcmp(ee->driver, "software_x11"))) return 0;
+   return (Ecore_X_Window) ecore_evas_window_get(ee);
+}
+#else
+EAPI Ecore_X_Window
+ecore_evas_software_x11_window_get(const Ecore_Evas *ee __UNUSED__)
+{
+   return 0;
+}
+#endif
+
+/**
+ * @brief Set the direct_resize of Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas in which to set direct resize.
+ * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
+ */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+EAPI void
+ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
+{
+   ee->engine.x.direct_resize = on;
+   if (ee->prop.avoid_damage)
+     {
+        if (ee->engine.x.direct_resize)
+          {
+/* turn this off for now
+             ee->engine.x.using_bg_pixmap = 1;
+             ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+ */
+          }
+        else
+          {
+/* turn this off too- bg pixmap is controlled by avoid damage directly
+             ee->engine.x.using_bg_pixmap = 0;
+             ecore_x_window_pixmap_set(ee->prop.window, 0);
+             ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
+ */
+          }
+     }
+}
+#else
+EAPI void
+ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
+{
+}
+#endif
+
+/**
+ * @brief Gets if the Ecore_Evas is being directly resized using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
+ * @param ee The Ecore_Evas from which to get direct resize.
+ * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
+ */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+EAPI Eina_Bool
+ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
+{
+   return ee->engine.x.direct_resize;
+}
+#else
+EAPI Eina_Bool
+ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
+{
+   return 0;
+}
+#endif
+
+/**
+ * @brief Add extra window on Ecore_Evas using software x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas on which to add the window.
+ * @param win The window to be added at the Ecore_Evas.
  */
+#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
+EAPI void
+ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+{
+   Ecore_X_Window *winp;
+
+   winp = malloc(sizeof(Ecore_X_Window));
+   if (winp)
+     {
+        *winp = win;
+        ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
+        ecore_x_input_multi_select(win);
+        ecore_event_window_register(win, ee, ee->evas,
+                                    (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                                    (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                                    (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                                    (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+     }
+}
+#else
+EAPI void
+ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
+{
+}
+#endif
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Create Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
+ * @param disp_name The name of the display of the Ecore_Evas to be created.
+ * @param parent The parent of the Ecore_Evas to be created.
+ * @param x The X coordinate to be used.
+ * @param y The Y coordinate to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return The new Ecore_Evas.
  */
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
 EAPI Ecore_Evas *
-ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
-                           int x, int y, int w, int h)
+ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
+                      int x, int y, int w, int h)
+{
+   return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
+}
+
+EAPI Ecore_Evas *
+ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
+                              int x, int y, int w, int h, const int *opt)
 {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-   Evas_Engine_Info_Software_Xcb *einfo;
-# else
-   Evas_Engine_Info_Software_X11 *einfo;
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
    Ecore_Evas *ee;
-   int argb = 0;
    int rmethod;
-   static int redraw_debug = -1;
+   char *id = NULL;
 
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-   rmethod = evas_render_method_lookup("software_xcb");
-# else
-   rmethod = evas_render_method_lookup("software_x11");
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
+   rmethod = evas_render_method_lookup("gl_x11");
    if (!rmethod) return NULL;
    if (!ecore_x_init(disp_name)) return NULL;
    ee = calloc(1, sizeof(Ecore_Evas));
@@ -2660,15 +3519,20 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
 
    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
 
+   ee->gl_sync_draw_done = -1; // added by gl77.lee
+
    _ecore_evas_x_init();
 
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
 
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-   ee->driver = "software_xcb";
-# else
-   ee->driver = "software_x11";
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
+   ee->driver = "opengl_x11";
+#if 1
+   ee->semi_sync = 0; // gl engine doesn't need to sync - its whole swaps
+#else
+   if (!getenv("ECORE_EVAS_COMP_NOSEMISYNC"))
+      ee->semi_sync = 1; // gl engine doesn't need to sync - its whole swaps
+//   ee->no_comp_sync = 1; // gl engine doesn't need to sync - its whole swaps
+#endif
    if (disp_name) ee->name = strdup(disp_name);
 
    if (w < 1) w = 1;
@@ -2677,6 +3541,10 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
    ee->y = y;
    ee->w = w;
    ee->h = h;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 32767;
    ee->prop.max.h = 32767;
@@ -2687,323 +3555,247 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
 
    /* init evas here */
    ee->evas = evas_new();
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
    evas_data_attach_set(ee->evas, ee);
    evas_output_method_set(ee->evas, rmethod);
    evas_output_size_set(ee->evas, w, h);
    evas_output_viewport_set(ee->evas, 0, 0, w, h);
 
+   if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
    ee->engine.x.win_root = parent;
-   if (parent != 0)
+
+   if (ee->engine.x.win_root != 0)
      {
+        ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
        /* FIXME: round trip in ecore_x_window_argb_get */
-       if (ecore_x_window_argb_get(parent))
-         {
-            ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
-            argb = 1;
-         }
-       else
-         ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
+        if (ecore_x_window_argb_get(ee->engine.x.win_root))
+          {
+             ee->prop.window = _ecore_evas_x_gl_window_new
+               (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
+          }
+        else
+          ee->prop.window = _ecore_evas_x_gl_window_new
+          (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
      }
    else
-     ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
-   if (getenv("DESKTOP_STARTUP_ID"))
+     ee->prop.window = _ecore_evas_x_gl_window_new
+     (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
+   if (!ee->prop.window)
      {
-       ecore_x_netwm_startup_id_set(ee->engine.x.win,
-                                    getenv("DESKTOP_STARTUP_ID"));
-       /* NB: on linux this may simply empty the env as opposed to completely
-        * unset it to being empty - unsure as solartis libc crashes looking
-        * for the '=' char */
-//     putenv((char*)"DESKTOP_STARTUP_ID=");
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
      }
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-   einfo = (Evas_Engine_Info_Software_Xcb *)evas_engine_info_get(ee->evas);
-# else
-   einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-   if (einfo)
+   if ((id = getenv("DESKTOP_STARTUP_ID")))
      {
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-        xcb_screen_iterator_t iter;
-       xcb_screen_t         *screen;
-# else
-       int screen;
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-
-       /* FIXME: this is inefficient as its a round trip */
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       screen = ecore_x_default_screen_get();
-        iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
-       if (iter.rem > 1)
-         {
-             xcb_get_geometry_cookie_t cookie;
-             xcb_get_geometry_reply_t *reply;
-            Ecore_X_Window           *roots;
-            int                       num;
-            uint8_t                   i;
-
-            num = 0;
-             cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
-            roots = ecore_x_window_root_list(&num);
-            if (roots)
-              {
-                  reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
-
-                 if (reply)
-                   {
-                      for (i = 0; i < num; xcb_screen_next (&iter), i++)
-                        {
-                           if (reply->root == roots[i])
-                             {
-                                screen = iter.data;
-                                break;
-                             }
-                        }
-                       free(reply);
-                   }
-                 free(roots);
-              }
-             else
-               {
-                  reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
-                  if (reply) free(reply);
-               }
-         }
-# else
-       screen = DefaultScreen(ecore_x_display_get());
-       if (ScreenCount(ecore_x_display_get()) > 1)
-         {
-            Ecore_X_Window *roots;
-            int num, i;
-
-            num = 0;
-            roots = ecore_x_window_root_list(&num);
-            if (roots)
-              {
-                 XWindowAttributes at;
-
-                 if (XGetWindowAttributes(ecore_x_display_get(),
-                                          parent, &at))
-                   {
-                      for (i = 0; i < num; i++)
-                        {
-                           if (at.root == roots[i])
-                             {
-                                screen = i;
-                                break;
-                             }
-                        }
-                   }
-                 free(roots);
-              }
-         }
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-
-       if (redraw_debug < 0)
-         {
-            if (getenv("REDRAW_DEBUG"))
-              redraw_debug = atoi(getenv("REDRAW_DEBUG"));
-            else
-              redraw_debug = 0;
-         }
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-       einfo->info.conn   = ecore_x_connection_get();
-       einfo->info.screen = screen;
-# else
-       einfo->info.display  = ecore_x_display_get();
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-       einfo->info.drawable = ee->engine.x.win;
-       if (argb)
-         {
-       /* FIXME: round trip */
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-             xcb_get_geometry_cookie_t          cookie_geom;
-             xcb_get_window_attributes_cookie_t cookie_attr;
-             xcb_get_geometry_reply_t          *reply_geom;
-             xcb_get_window_attributes_reply_t *reply_attr;
-
-            cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->engine.x.win);
-            cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->engine.x.win);
+        ecore_x_netwm_startup_id_set(ee->prop.window, id);
+        /* NB: on linux this may simply empty the env as opposed to completely
+         * unset it to being empty - unsure as solartis libc crashes looking
+         * for the '=' char */
+//        putenv((char*)"DESKTOP_STARTUP_ID=");
+     }
 
-             reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
-             reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
-            if (reply_attr && reply_geom)
-              {
-                  einfo->info.visual   = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
-                 einfo->info.colormap = reply_attr->colormap;
-                 einfo->info.depth    = reply_geom->depth;
-                 einfo->info.destination_alpha = 1;
-                  free(reply_geom);
-                  free(reply_attr);
-              }
-# else
-            XWindowAttributes at;
-
-            if (XGetWindowAttributes(ecore_x_display_get(), ee->engine.x.win,
-                                     &at))
-              {
-                 einfo->info.visual   = at.visual;
-                 einfo->info.colormap = at.colormap;
-                 einfo->info.depth    = at.depth;
-                 einfo->info.destination_alpha = 1;
-              }
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-         }
-       else
-         {
-# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
-             xcb_screen_t *screen;
+   _ecore_evas_x_hints_update(ee);
+   _ecore_evas_x_group_leader_set(ee);
+   ecore_x_window_defaults_set(ee->prop.window);
+   _ecore_evas_x_protocols_set(ee);
+   _ecore_evas_x_sync_set(ee);
+
+   ee->engine.func->fn_render = _ecore_evas_x_render;
+   _ecore_evas_register(ee);
+   ecore_x_input_multi_select(ee->prop.window);
+   ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
 
-             screen = ecore_x_default_screen_get();
-            einfo->info.visual   = xcb_visualtype_get(screen, screen->root_visual);
-            einfo->info.colormap = screen->default_colormap;
-            einfo->info.depth    = screen->root_depth;
-#else
-            einfo->info.visual   = DefaultVisual(ecore_x_display_get(), screen);
-            einfo->info.colormap = DefaultColormap(ecore_x_display_get(), screen);
-            einfo->info.depth    = DefaultDepth(ecore_x_display_get(), screen);
-# endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
-            einfo->info.destination_alpha = 0;
-         }
-       einfo->info.rotation = 0;
-       einfo->info.debug    = redraw_debug;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-     }
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
-
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
-   ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
    return ee;
+}
 #else
+EAPI Ecore_Evas *
+ecore_evas_gl_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
+                      int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
    return NULL;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_X11 && ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
 }
-
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
-EAPI Ecore_X_Window
-ecore_evas_software_x11_window_get(Ecore_Evas *ee)
+EAPI Ecore_Evas *
+ecore_evas_gl_x11_options_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
+                              int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, const int *opt __UNUSED__)
 {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-  return (Ecore_X_Window) (long)_ecore_evas_x_window_get(ee);
-#else
-   return 0;
-#endif
+   return NULL;
 }
+#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Get the window from Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support for x11 or if @p ee was not
+ * created with ecore_evas_gl_x11_new() then nothing is done and
+ * 0 is returned.
+ * @param ee The Ecore_Evas from which to get the window.
+ * @return The window of type Ecore_X_Window of Ecore_Evas.
  */
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
 EAPI Ecore_X_Window
-ecore_evas_software_x11_subwindow_get(Ecore_Evas *ee)
+ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
 {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-  return (Ecore_X_Window) (long)_ecore_evas_x_window_get(ee);
+   if (!(!strcmp(ee->driver, "opengl_x11"))) return 0;
+   return (Ecore_X_Window) ecore_evas_window_get(ee);
+}
 #else
+EAPI Ecore_X_Window
+ecore_evas_gl_x11_window_get(const Ecore_Evas *ee __UNUSED__)
+{
    return 0;
-#endif
 }
+#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Set direct_resize for Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas in which to set direct resize.
+ * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
  */
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
 EAPI void
-ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, int on)
+ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
 {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
    ee->engine.x.direct_resize = on;
-   if (ee->prop.avoid_damage)
-     {
-       if (ee->engine.x.direct_resize)
-         {
-/* turn this off for now
-            ee->engine.x.using_bg_pixmap = 1;
-            ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
- */
-         }
-       else
-         {
-/* turn this off too- bg pixmap is controlled by avoid damage directly
-            ee->engine.x.using_bg_pixmap = 0;
-            ecore_x_window_pixmap_set(ee->engine.x.win, 0);
-            ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
- */
-         }
-     }
+}
 #else
-   return;
-#endif
+EAPI void
+ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
+{
 }
+#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Gets if the Ecore_Evas is being directly resized using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
+ * @param ee The Ecore_Evas from which to get direct resize.
+ * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
  */
-EAPI int
-ecore_evas_software_x11_direct_resize_get(Ecore_Evas *ee)
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+EAPI Eina_Bool
+ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
 {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
    return ee->engine.x.direct_resize;
+}
 #else
+EAPI Eina_Bool
+ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
+{
    return 0;
-#endif
 }
+#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Add extra window on Ecore_Evas using opengl x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas for which to add the window.
+ * @param win The window to be added at the Ecore_Evas.
  */
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
 EAPI void
-ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
 {
-#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_XCB)
-   Ecore_X_Window *winp;
+   ecore_evas_software_x11_extra_event_window_add(ee, win);
+}
+#else
+EAPI void
+ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
+{
+}
+#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 
-   winp = malloc(sizeof(Ecore_X_Window));
-   if (winp)
+/**
+ * @brief Set the functions to be used before and after the swap callback.
+ * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
+ * @param ee The Ecore_Evas for which to set the swap callback.
+ * @param data The data for which to set the swap callback.
+ * @param pre_cb The function to be called before the callback.
+ * @param post_cb The function to be called after the callback.
+ */
+#ifdef BUILD_ECORE_EVAS_OPENGL_X11
+EAPI void
+ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e))
+{
+   Evas_Engine_Info_GL_X11 *einfo;
+
+   if (!(!strcmp(ee->driver, "opengl_x11"))) return;
+
+   einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
+   if (einfo)
      {
-       *winp = win;
-       ee->engine.x.win_extra = evas_list_append(ee->engine.x.win_extra, winp);
-       ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(win), ee);
+        einfo->callback.pre_swap = pre_cb;
+        einfo->callback.post_swap = post_cb;
+        einfo->callback.data = data;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
+          }
      }
+}
 #else
-#endif
+EAPI void
+ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee __UNUSED__, void *data __UNUSED__, void (*pre_cb) (void *data, Evas *e) __UNUSED__, void (*post_cb) (void *data, Evas *e) __UNUSED__)
+{
+   return;
+}
+#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
+
+EAPI Ecore_Evas *
+ecore_evas_xrender_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
+                           int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
+   return NULL;
+}
+
+EAPI Ecore_X_Window
+ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee __UNUSED__)
+{
+   return 0;
+}
+
+EAPI void
+ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
+{
+}
+
+EAPI Eina_Bool
+ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
+{
+   return 0;
+}
+
+EAPI void
+ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
+{
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Create Ecore_Evas using software 16 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
+ * @param disp_name The name of the display of the Ecore_Evas to be created.
+ * @param parent The parent of the Ecore_Evas to be created.
+ * @param x The X coordinate to be used.
+ * @param y The Y coordinate to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return The new Ecore_Evas.
  */
+#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
 EAPI Ecore_Evas *
-ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
-                     int x, int y, int w, int h)
+ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
+                               int x, int y, int w, int h)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-# ifdef HAVE_ECORE_X_XCB
-   Ecore_Evas *ee = NULL;
-# else
-   Evas_Engine_Info_GL_X11 *einfo;
+   Evas_Engine_Info_Software_16_X11 *einfo;
    Ecore_Evas *ee;
    int rmethod;
+   static int redraw_debug = -1;
 
-   rmethod = evas_render_method_lookup("gl_x11");
+   rmethod = evas_render_method_lookup("software_16_x11");
    if (!rmethod) return NULL;
    if (!ecore_x_init(disp_name)) return NULL;
    ee = calloc(1, sizeof(Ecore_Evas));
@@ -3015,7 +3807,7 @@ ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
 
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
 
-   ee->driver = "gl_x11";
+   ee->driver = "software_16_x11";
    if (disp_name) ee->name = strdup(disp_name);
 
    if (w < 1) w = 1;
@@ -3024,6 +3816,10 @@ ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
    ee->y = y;
    ee->w = w;
    ee->h = h;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 32767;
    ee->prop.max.h = 32767;
@@ -3034,147 +3830,248 @@ ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
 
    /* init evas here */
    ee->evas = evas_new();
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
    evas_data_attach_set(ee->evas, ee);
    evas_output_method_set(ee->evas, rmethod);
    evas_output_size_set(ee->evas, w, h);
    evas_output_viewport_set(ee->evas, 0, 0, w, h);
 
-   if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
    ee->engine.x.win_root = parent;
-   einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
-   if (einfo)
+   if (parent != 0)
      {
-       ee->engine.x.win = _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root, x, y, w, h, 0);
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+       /* FIXME: round trip in ecore_x_window_argb_get */
+        if (ecore_x_window_argb_get(parent))
+          {
+             ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
+          }
+        else
+          ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
      }
+   else
+     ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
    if (getenv("DESKTOP_STARTUP_ID"))
      {
-       ecore_x_netwm_startup_id_set(ee->engine.x.win,
-                                    getenv("DESKTOP_STARTUP_ID"));
-       /* NB: on linux this may simply empty the env as opposed to completely
-        * unset it to being empty - unsure as solartis libc crashes looking
-        * for the '=' char */
-//     putenv((char*)"DESKTOP_STARTUP_ID=");
-     }
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
-
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
-   ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-# endif /* HAVE_ECORE_X_XCB */
+        ecore_x_netwm_startup_id_set(ee->prop.window,
+                                     getenv("DESKTOP_STARTUP_ID"));
+        /* NB: on linux this may simply empty the env as opposed to completely
+         * unset it to being empty - unsure as solartis libc crashes looking
+         * for the '=' char */
+//        putenv((char*)"DESKTOP_STARTUP_ID=");
+     }
+   einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
+
+   if (einfo)
+     {
+        if (ScreenCount(ecore_x_display_get()) > 1)
+          {
+             Ecore_X_Window *roots;
+             int num, i;
+
+             num = 0;
+             roots = ecore_x_window_root_list(&num);
+             if (roots)
+               {
+                  XWindowAttributes at;
+
+                  if (XGetWindowAttributes(ecore_x_display_get(),
+                                           parent, &at))
+                    {
+                       for (i = 0; i < num; i++)
+                         {
+                            if (at.root == roots[i])
+                              break;
+                         }
+                    }
+                  free(roots);
+               }
+          }
+
+        if (redraw_debug < 0)
+          {
+             if (getenv("REDRAW_DEBUG"))
+               redraw_debug = atoi(getenv("REDRAW_DEBUG"));
+             else
+               redraw_debug = 0;
+          }
+        einfo->info.display  = ecore_x_display_get();
+        einfo->info.drawable = ee->prop.window;
+
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
+     }
 
+   _ecore_evas_x_hints_update(ee);
+   _ecore_evas_x_group_leader_set(ee);
+   ecore_x_window_defaults_set(ee->prop.window);
+   _ecore_evas_x_protocols_set(ee);
+   _ecore_evas_x_sync_set(ee);
+
+   ee->engine.func->fn_render = _ecore_evas_x_render;
+   _ecore_evas_register(ee);
+   ecore_x_input_multi_select(ee->prop.window);
+   ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
    return ee;
+}
 #else
-   disp_name = NULL;
-   parent = 0;
-   x = y = w = h = 0;
+EAPI Ecore_Evas *
+ecore_evas_software_x11_16_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
+                               int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
+{
    return NULL;
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 }
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Get the window from Ecore_Evas using software 16 x11.
+ * @note If ecore is not compiled with support for x11 or if @p ee was not
+ * created with ecore_evas_software_x11_16_new() then nothing is done and
+ * 0 is returned.
+ * @param ee The Ecore_Evas from which to get the window.
+ * @return The window of type Ecore_X_Window of Ecore_Evas.
  */
+#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
 EAPI Ecore_X_Window
-ecore_evas_gl_x11_window_get(Ecore_Evas *ee)
+ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-   return (Ecore_X_Window) _ecore_evas_x_window_get(ee);
-#else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
+   if (!(!strcmp(ee->driver, "software_16_x11"))) return 0;
+   return (Ecore_X_Window) ecore_evas_window_get(ee);
 }
-
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
+#else
 EAPI Ecore_X_Window
-ecore_evas_gl_x11_subwindow_get(Ecore_Evas *ee)
+ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee __UNUSED__)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-   return (Ecore_X_Window) _ecore_evas_x_window_get(ee);
-#else
    return 0;
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 }
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Set direct_resize for Ecore_Evas using software 16 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas in which to set direct resize.
+ * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
  */
+#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
 EAPI void
-ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, int on)
+ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
    ee->engine.x.direct_resize = on;
+   if (ee->prop.avoid_damage)
+     {
+        if (ee->engine.x.direct_resize)
+          {
+/* turn this off for now
+             ee->engine.x.using_bg_pixmap = 1;
+             ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
+ */
+          }
+        else
+          {
+/* turn this off too- bg pixmap is controlled by avoid damage directly
+             ee->engine.x.using_bg_pixmap = 0;
+             ecore_x_window_pixmap_set(ee->prop.window, 0);
+             ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
+ */
+          }
+     }
+}
 #else
-   return;
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
+EAPI void
+ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
+{
 }
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Gets if the Ecore_Evas is being directly resized using software 16 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and 0 is returned.
+ * @param ee The Ecore_Evas from which to get direct resize.
+ * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
  */
-EAPI int
-ecore_evas_gl_x11_direct_resize_get(Ecore_Evas *ee)
+#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
+EAPI Eina_Bool
+ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
    return ee->engine.x.direct_resize;
+}
 #else
+EAPI Eina_Bool
+ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
+{
    return 0;
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 }
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+
+/**
+ * @brief Add extra window on Ecore_Evas using software 16 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done.
+ * @param ee The Ecore_Evas on which to add the window.
+ * @param win The window to be added at the Ecore_Evas.
+ */
+#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
+EAPI void
+ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+{
+   Ecore_X_Window *winp;
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
+   winp = malloc(sizeof(Ecore_X_Window));
+   if (winp)
+     {
+        *winp = win;
+        ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
+        ecore_x_input_multi_select(win);
+        ecore_event_window_register(win, ee, ee->evas,
+                                    (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                                    (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                                    (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                                    (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+     }
+}
+#else
 EAPI void
-ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
 {
-#ifdef BUILD_ECORE_EVAS_OPENGL_X11
-   ecore_evas_software_x11_extra_event_window_add(ee, win);
-#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
 }
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Create Ecore_Evas using software 8 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
+ * @param disp_name The name of the display of the Ecore_Evas to be created.
+ * @param parent The parent of the Ecore_Evas to be created.
+ * @param x The X coordinate to be used.
+ * @param y The Y coordinate to be used.
+ * @param w The width of the Ecore_Evas to be created.
+ * @param h The height of the Ecore_Evas to be created.
+ * @return The new Ecore_Evas.
  */
 EAPI Ecore_Evas *
-ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent,
-                     int x, int y, int w, int h)
+ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent,
+                              int x, int y, int w, int h)
 {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-   Evas_Engine_Info_XRender_Xcb *einfo;
-# else
-   Evas_Engine_Info_XRender_X11 *einfo;
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+   Evas_Engine_Info_Software_8_X11 *einfo;
    Ecore_Evas *ee;
+   int argb = 0;
    int rmethod;
+   static int redraw_debug = -1;
 
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-   rmethod = evas_render_method_lookup("xrender_xcb");
-# else
-   rmethod = evas_render_method_lookup("xrender_x11");
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   rmethod = evas_render_method_lookup("software_8_x11");
    if (!rmethod) return NULL;
    if (!ecore_x_init(disp_name)) return NULL;
    ee = calloc(1, sizeof(Ecore_Evas));
@@ -3186,11 +4083,7 @@ ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent,
 
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
 
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-   ee->driver = "xrender_xcb";
-# else
-   ee->driver = "xrender_x11";
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   ee->driver = "software_8_x11";
    if (disp_name) ee->name = strdup(disp_name);
 
    if (w < 1) w = 1;
@@ -3199,6 +4092,10 @@ ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent,
    ee->y = y;
    ee->w = w;
    ee->h = h;
+   ee->req.x = ee->x;
+   ee->req.y = ee->y;
+   ee->req.w = ee->w;
+   ee->req.h = ee->h;
 
    ee->prop.max.w = 32767;
    ee->prop.max.h = 32767;
@@ -3209,440 +4106,565 @@ ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent,
 
    /* init evas here */
    ee->evas = evas_new();
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
+   evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
    evas_data_attach_set(ee->evas, ee);
    evas_output_method_set(ee->evas, rmethod);
    evas_output_size_set(ee->evas, w, h);
    evas_output_viewport_set(ee->evas, 0, 0, w, h);
 
    ee->engine.x.win_root = parent;
-   ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
+   //   if (parent != 0)
+   //     {
+   //       /* FIXME: round trip in ecore_x_window_argb_get */
+   //        if (ecore_x_window_argb_get(parent))
+   //          {
+   //             ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
+   //             argb = 1;
+   //          }
+   //        else
+   //          ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
+   //     }
+   //   else
+   ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
    if (getenv("DESKTOP_STARTUP_ID"))
      {
-       ecore_x_netwm_startup_id_set(ee->engine.x.win,
-                                    getenv("DESKTOP_STARTUP_ID"));
-       /* NB: on linux this may simply empty the env as opposed to completely
-        * unset it to being empty - unsure as solartis libc crashes looking
-        * for the '=' char */
-//     putenv((char*)"DESKTOP_STARTUP_ID=");
+        ecore_x_netwm_startup_id_set(ee->prop.window,
+              getenv("DESKTOP_STARTUP_ID"));
+        /* NB: on linux this may simply empty the env as opposed to completely
+         * unset it to being empty - unsure as solartis libc crashes looking
+         * for the '=' char */
+        //        putenv((char*)"DESKTOP_STARTUP_ID=");
      }
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
-   einfo = (Evas_Engine_Info_XRender_Xcb *)evas_engine_info_get(ee->evas);
-# else
-   einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
    if (einfo)
      {
-# ifdef BUILD_ECORE_EVAS_XRENDER_XCB
         xcb_screen_iterator_t iter;
-       xcb_screen_t         *screen;
+        xcb_screen_t         *screen;
 
-       /* FIXME: this is inefficient as its a round trip */
-       screen = ecore_x_default_screen_get();
+        /* FIXME: this is inefficient as its a round trip */
+        //einfo->info.backend = 1;
+        screen = ecore_x_default_screen_get();
         iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
-       if (iter.rem > 1)
-         {
+        if (iter.rem > 1)
+          {
              xcb_get_geometry_cookie_t cookie;
              xcb_get_geometry_reply_t *reply;
-            Ecore_X_Window           *roots;
-            int                       num;
-            uint8_t                   i;
+             Ecore_X_Window           *roots;
+             int                       num;
+             uint8_t                   i;
 
-            num = 0;
+             num = 0;
              cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
-            roots = ecore_x_window_root_list(&num);
-            if (roots)
-              {
+             roots = ecore_x_window_root_list(&num);
+             if (roots)
+               {
                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
 
-                 if (reply)
-                   {
-                      for (i = 0; i < num; xcb_screen_next (&iter), i++)
-                        {
-                           if (reply->root == roots[i])
-                             {
-                                screen = iter.data;
-                                break;
-                             }
-                        }
+                  if (reply)
+                    {
+                       for (i = 0; i < num; xcb_screen_next (&iter), i++)
+                         {
+                            if (reply->root == roots[i])
+                              {
+                                 screen = iter.data;
+                                 break;
+                              }
+                         }
                        free(reply);
-                   }
-                 free(roots);
-              }
+                    }
+                  free(roots);
+               }
              else
                {
                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
                   if (reply) free(reply);
                }
-         }
-       einfo->info.conn   = ecore_x_connection_get();
-        /* FIXME: uncomment that once the XCB render engine has that member */
-/*     einfo->info.screen = screen; */
-       einfo->info.visual = screen->root_visual;
-# else
-       int screen;
-
-       /* FIXME: this is inefficient as its a round trip */
-       screen = DefaultScreen(ecore_x_display_get());
-       if (ScreenCount(ecore_x_display_get()) > 1)
-         {
-            Ecore_X_Window *roots;
-            int num, i;
-
-            num = 0;
-            roots = ecore_x_window_root_list(&num);
-            if (roots)
-              {
-                 XWindowAttributes at;
-
-                 if (XGetWindowAttributes(ecore_x_display_get(),
-                                          parent, &at))
-                   {
-                      for (i = 0; i < num; i++)
-                        {
-                           if (at.root == roots[i])
-                             {
-                                screen = i;
-                                break;
-                             }
-                        }
-                   }
-                 free(roots);
-              }
-         }
-       einfo->info.display  = ecore_x_display_get();
-       einfo->info.visual   = DefaultVisual(ecore_x_display_get(), screen);
-# endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
-       einfo->info.drawable = ee->engine.x.win;
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-     }
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
-
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
-   ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
+          }
+
+        if (redraw_debug < 0)
+          {
+             if (getenv("REDRAW_DEBUG"))
+               redraw_debug = atoi(getenv("REDRAW_DEBUG"));
+             else
+               redraw_debug = 0;
+          }
+        einfo->info.connection = ecore_x_connection_get();
+        einfo->info.screen = screen;
+        einfo->info.drawable = ee->prop.window;
+        if (argb)
+          {
+             /* FIXME: round trip */
+             xcb_get_geometry_cookie_t          cookie_geom;
+             xcb_get_window_attributes_cookie_t cookie_attr;
+             xcb_get_geometry_reply_t          *reply_geom;
+             xcb_get_window_attributes_reply_t *reply_attr;
+
+             cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
+             cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
+
+             reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
+             reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
+             if (reply_attr && reply_geom)
+               {
+                  einfo->info.visual   = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
+                  einfo->info.colormap = reply_attr->colormap;
+                  einfo->info.depth    = reply_geom->depth;
+                  einfo->info.destination_alpha = 1;
+                  free(reply_geom);
+                  free(reply_attr);
+               }
+          }
+        else
+          {
+             xcb_screen_t *screen;
+
+             screen = ecore_x_default_screen_get();
+             einfo->info.visual   = xcb_visualtype_get(screen, screen->root_visual);
+             einfo->info.colormap = screen->default_colormap;
+             einfo->info.depth    = screen->root_depth;
+             einfo->info.destination_alpha = 0;
+          }
+        einfo->info.rotation = 0;
+        einfo->info.debug    = redraw_debug;
+        if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
+          {
+             ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+             ecore_evas_free(ee);
+             return NULL;
+          }
+     }
+   else
+     {
+        ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
+        ecore_evas_free(ee);
+        return NULL;
+     }
+
+   _ecore_evas_x_hints_update(ee);
+   _ecore_evas_x_group_leader_set(ee);
+   ecore_x_window_defaults_set(ee->prop.window);
+   _ecore_evas_x_protocols_set(ee);
+   _ecore_evas_x_sync_set(ee);
+
+   ee->engine.func->fn_render = _ecore_evas_x_render;
+   _ecore_evas_register(ee);
+   ecore_x_input_multi_select(ee->prop.window);
+   ecore_event_window_register(ee->prop.window, ee, ee->evas,
+                               (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                               (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                               (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                               (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+
    return ee;
 #else
    return NULL;
-#endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   (void)(disp_name);
+   (void)(parent);
+   (void)(x);
+   (void)(y);
+   (void)(w);
+   (void)(h);
+#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Get window from Ecore_Evas using software 8 x11.
+ * @note If ecore is not compiled with support for x11 or if @p ee was not
+ * created with ecore_evas_software_x11_8_new() then nothing is done and
+ * 0 is returned.
+ * @param ee The Ecore_Evas from which to get the window.
+ * @return The window of type Ecore_X_Window of Ecore_Evas.
  */
 EAPI Ecore_X_Window
-ecore_evas_xrender_x11_window_get(Ecore_Evas *ee)
+ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee)
 {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
-   return (Ecore_X_Window) _ecore_evas_x_window_get(ee);
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+   if (!(!strcmp(ee->driver, "software_8_x11"))) return 0;
+   return (Ecore_X_Window) ecore_evas_window_get(ee);
 #else
    return 0;
-#endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   (void)(ee);
+#endif
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Get subwindow from Ecore_Evas using software 8 x11.
+ * @note If ecore is not compiled with support for x11 or if @p ee was not
+ * created with ecore_evas_software_x11_8_new() then nothing is done and
+ * 0 is returned.
+ * @param ee The Ecore_Evas from which to get the subwindow.
+ * @return The window of type Ecore_X_Window of Ecore_Evas.
  */
 EAPI Ecore_X_Window
-ecore_evas_xrender_x11_subwindow_get(Ecore_Evas *ee)
+ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee)
 {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
-   return (Ecore_X_Window) _ecore_evas_x_window_get(ee);
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+   if (!(!strcmp(ee->driver, "software_8_x11"))) return 0;
+   return (Ecore_X_Window) ecore_evas_window_get(ee);
 #else
    return 0;
-#endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   (void)(ee);
+#endif
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Set direct_size for Ecore_Evas using software 8 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
+ * @param ee The Ecore_Evas in which to set direct resize.
+ * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
  */
 EAPI void
-ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, int on)
+ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
 {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
    ee->engine.x.direct_resize = on;
+   if (ee->prop.avoid_damage)
+     {
+        if (ee->engine.x.direct_resize)
+          {
+             /* turn this off for now
+                ee->engine.x.using_bg_pixmap = 1;
+                ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
+                */
+          }
+        else
+          {
+             /* turn this off too- bg pixmap is controlled by avoid damage directly
+                ee->engine.x.using_bg_pixmap = 0;
+                ecore_x_window_pixmap_set(ee->engine.x.win, 0);
+                ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
+                */
+          }
+     }
 #else
    return;
-#endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   (void)(ee);
+   (void)(on);
+#endif
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Gets if the Ecore_Evas is being directly resized using software 8 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and 0 is returned.
+ * @param ee The Ecore_Evas from which to get direct resize.
+ * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
  */
-EAPI int
-ecore_evas_xrender_x11_direct_resize_get(Ecore_Evas *ee)
+EAPI Eina_Bool
+ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee)
 {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
    return ee->engine.x.direct_resize;
 #else
    return 0;
-#endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   (void)(ee);
+#endif
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Add extra window on Ecore_Evas using software 8 x11.
+ * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
+ * @param ee The Ecore_Evas on which to add the window.
+ * @param win The window to be added at Ecore_Evas.
  */
 EAPI void
-ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
 {
-#if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
-   ecore_evas_software_x11_extra_event_window_add(ee, win);
+#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
+   Ecore_X_Window *winp;
+
+   winp = malloc(sizeof(Ecore_X_Window));
+   if (winp)
+     {
+        *winp = win;
+        ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
+        ecore_x_input_multi_select(win);
+        ecore_event_window_register(win, ee, ee->evas,
+                                    (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
+                                    (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
+                                    (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
+                                    (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
+     }
 #else
    return;
-#endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
+   (void)(ee);
+   (void)(win);
+#endif
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
-EAPI Ecore_Evas *
-ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
-                               int x, int y, int w, int h)
+EAPI void
+ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
 {
-#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-   Evas_Engine_Info_Software_16_X11 *einfo;
-   Ecore_Evas *ee;
-   int argb = 0;
-   int rmethod;
-   static int redraw_debug = -1;
-
-   rmethod = evas_render_method_lookup("software_16_x11");
-   if (!rmethod) return NULL;
-   if (!ecore_x_init(disp_name)) return NULL;
-   ee = calloc(1, sizeof(Ecore_Evas));
-   if (!ee) return NULL;
-
-   ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
-
-   _ecore_evas_x_init();
-
-   ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
-
-   ee->driver = "software_16_x11";
-   if (disp_name) ee->name = strdup(disp_name);
+#ifdef BUILD_ECORE_EVAS_X11
+   _ecore_evas_x_group_leader_unset(ee);
+   ee->engine.x.leader = win;
+   _ecore_evas_x_group_leader_update(ee);
+#else
+   return;
+   ee = NULL;
+   win = 0;
+#endif
+}
 
-   if (w < 1) w = 1;
-   if (h < 1) h = 1;
-   ee->x = x;
-   ee->y = y;
-   ee->w = w;
-   ee->h = h;
+EAPI Ecore_X_Window
+ecore_evas_x11_leader_get(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_EVAS_X11
+   return ee->engine.x.leader;
+#else
+   return 0;
+   ee = NULL;
+#endif
+}
 
-   ee->prop.max.w = 32767;
-   ee->prop.max.h = 32767;
-   ee->prop.layer = 4;
-   ee->prop.request_pos = 0;
-   ee->prop.sticky = 0;
-   ee->engine.x.state.sticky = 0;
+EAPI void
+ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
+{
+#ifdef BUILD_ECORE_EVAS_X11
+   _ecore_evas_x_group_leader_unset(ee);
+   _ecore_evas_x_group_leader_set(ee);
+#else
+   return;
+   ee = NULL;
+#endif
+}
 
-   /* init evas here */
-   ee->evas = evas_new();
-   evas_data_attach_set(ee->evas, ee);
-   evas_output_method_set(ee->evas, rmethod);
-   evas_output_size_set(ee->evas, w, h);
-   evas_output_viewport_set(ee->evas, 0, 0, w, h);
+#ifdef BUILD_ECORE_EVAS_X11
+static Eina_Bool
+_ecore_evas_x11_convert_rectangle_with_angle(Ecore_Evas *ee, Ecore_X_Rectangle *dst_rect, Ecore_X_Rectangle *src_rect)
+{
+   if ((!src_rect) || (!dst_rect)) return 0;
 
-   ee->engine.x.win_root = parent;
-   if (parent != 0)
+   if (ee->rotation == 0)
      {
-       /* FIXME: round trip in ecore_x_window_argb_get */
-       if (ecore_x_window_argb_get(parent))
-         {
-            ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
-            argb = 1;
-         }
-       else
-         ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
+        dst_rect->x = src_rect->x;
+        dst_rect->y = src_rect->y;
+        dst_rect->width = src_rect->width;
+        dst_rect->height = src_rect->height;
+     }
+   else if (ee->rotation == 90)
+     {
+        dst_rect->x = src_rect->y;
+        dst_rect->y = ee->req.h - src_rect->x - src_rect->width;
+        dst_rect->width = src_rect->height;
+        dst_rect->height = src_rect->width;
+     }
+   else if (ee->rotation == 180)
+     {
+        dst_rect->x = ee->req.w - src_rect->x - src_rect->width;
+        dst_rect->y = ee->req.h - src_rect->y - src_rect->height;
+        dst_rect->width = src_rect->width;
+        dst_rect->height = src_rect->height;
+     }
+   else if (ee->rotation == 270)
+     {
+        dst_rect->x = ee->req.w - src_rect->y - src_rect->height;
+        dst_rect->y = src_rect->x;
+        dst_rect->width = src_rect->height;
+        dst_rect->height = src_rect->width;
      }
    else
-     ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
-   if (getenv("DESKTOP_STARTUP_ID"))
      {
-       ecore_x_netwm_startup_id_set(ee->engine.x.win,
-                                    getenv("DESKTOP_STARTUP_ID"));
-       /* NB: on linux this may simply empty the env as opposed to completely
-        * unset it to being empty - unsure as solartis libc crashes looking
-        * for the '=' char */
-//     putenv((char*)"DESKTOP_STARTUP_ID=");
+        return 0;
      }
-   einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
 
-   if (einfo)
+   return 1;
+}
+#endif
+
+EAPI void
+ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
+{
+#ifdef BUILD_ECORE_EVAS_X11
+   Eina_Bool ret;
+   Ecore_X_Rectangle src_rect;
+   Ecore_X_Rectangle dst_rect;
+
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       int screen;
-
-       screen = DefaultScreen(ecore_x_display_get());
-       if (ScreenCount(ecore_x_display_get()) > 1)
-         {
-            Ecore_X_Window *roots;
-            int num, i;
-
-            num = 0;
-            roots = ecore_x_window_root_list(&num);
-            if (roots)
-              {
-                 XWindowAttributes at;
-
-                 if (XGetWindowAttributes(ecore_x_display_get(),
-                                          parent, &at))
-                   {
-                      for (i = 0; i < num; i++)
-                        {
-                           if (at.root == roots[i])
-                             {
-                                screen = i;
-                                break;
-                             }
-                        }
-                   }
-                 free(roots);
-              }
-         }
-
-       if (redraw_debug < 0)
-         {
-            if (getenv("REDRAW_DEBUG"))
-              redraw_debug = atoi(getenv("REDRAW_DEBUG"));
-            else
-              redraw_debug = 0;
-         }
-       einfo->info.display  = ecore_x_display_get();
-       einfo->info.drawable = ee->engine.x.win;
-
-       evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-     }
-   evas_key_modifier_add(ee->evas, "Shift");
-   evas_key_modifier_add(ee->evas, "Control");
-   evas_key_modifier_add(ee->evas, "Alt");
-   evas_key_modifier_add(ee->evas, "Meta");
-   evas_key_modifier_add(ee->evas, "Hyper");
-   evas_key_modifier_add(ee->evas, "Super");
-   evas_key_lock_add(ee->evas, "Caps_Lock");
-   evas_key_lock_add(ee->evas, "Num_Lock");
-   evas_key_lock_add(ee->evas, "Scroll_Lock");
-
-   ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
-   ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(ee->engine.x.win), ee);
-   return ee;
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_x11_shape_input_rectangle_set");
+        return;
+     }
+
+   src_rect.x = x;
+   src_rect.y = y;
+   src_rect.width = w;
+   src_rect.height = h;
+
+   dst_rect.x = 0;
+   dst_rect.y = 0;
+   dst_rect.width = 0;
+   dst_rect.height = 0;
+
+   ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
+
+   if (!ee->engine.x.win_shaped_input)
+      ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
+                                                                  0, 0, 1, 1);
+
+   if (ret)
+      ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input,
+                                               dst_rect.x, dst_rect.y,
+                                               dst_rect.width, dst_rect.height);
 #else
-   return NULL;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+   return;
+   ee = NULL;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
-EAPI Ecore_X_Window
-ecore_evas_software_x11_16_window_get(Ecore_Evas *ee)
+EAPI void
+ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
 {
-#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-   return (Ecore_X_Window) _ecore_evas_x_window_get(ee);
+#ifdef BUILD_ECORE_EVAS_X11
+   Eina_Bool ret;
+   Ecore_X_Rectangle src_rect;
+   Ecore_X_Rectangle dst_rect;
+
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_x11_shape_input_rectangle_add");
+        return;
+     }
+
+   src_rect.x = x;
+   src_rect.y = y;
+   src_rect.width = w;
+   src_rect.height = h;
+
+   dst_rect.x = 0;
+   dst_rect.y = 0;
+   dst_rect.width = 0;
+   dst_rect.height = 0;
+
+   ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
+
+   if (!ee->engine.x.win_shaped_input)
+      ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
+                                                                  0, 0, 1, 1);
+
+   if (ret)
+      ecore_x_window_shape_input_rectangle_add(ee->engine.x.win_shaped_input,
+                                               dst_rect.x, dst_rect.y,
+                                               dst_rect.width, dst_rect.height);
 #else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+   return;
+   ee = NULL;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
-EAPI Ecore_X_Window
-ecore_evas_software_x11_16_subwindow_get(Ecore_Evas *ee)
+EAPI void
+ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
 {
-#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-   return (Ecore_X_Window) _ecore_evas_x_window_get(ee);
+#ifdef BUILD_ECORE_EVAS_X11
+   Eina_Bool ret;
+   Ecore_X_Rectangle src_rect;
+   Ecore_X_Rectangle dst_rect;
+
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_x11_shape_input_rectangle_subtract");
+        return;
+     }
+
+   src_rect.x = x;
+   src_rect.y = y;
+   src_rect.width = w;
+   src_rect.height = h;
+
+   dst_rect.x = 0;
+   dst_rect.y = 0;
+   dst_rect.width = 0;
+   dst_rect.height = 0;
+
+   ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
+
+   if (!ee->engine.x.win_shaped_input)
+      ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
+                                                                  0, 0, 1, 1);
+
+   if (ret)
+      ecore_x_window_shape_input_rectangle_subtract(ee->engine.x.win_shaped_input,
+                                                    dst_rect.x, dst_rect.y,
+                                                    dst_rect.width, dst_rect.height);
 #else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+   return;
+   ee = NULL;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
 EAPI void
-ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, int on)
+ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
 {
-#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-   ee->engine.x.direct_resize = on;
-   if (ee->prop.avoid_damage)
+#ifdef BUILD_ECORE_EVAS_X11
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       if (ee->engine.x.direct_resize)
-         {
-/* turn this off for now
-            ee->engine.x.using_bg_pixmap = 1;
-            ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
- */
-         }
-       else
-         {
-/* turn this off too- bg pixmap is controlled by avoid damage directly
-            ee->engine.x.using_bg_pixmap = 0;
-            ecore_x_window_pixmap_set(ee->engine.x.win, 0);
-            ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
- */
-         }
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_x11_shape_input_empty");
+        return;
      }
+
+   if (!ee->engine.x.win_shaped_input)
+      ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
+
+   ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 0, 0);
 #else
    return;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+   ee = NULL;
+#endif
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
-EAPI int
-ecore_evas_software_x11_16_direct_resize_get(Ecore_Evas *ee)
+EAPI void
+ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
 {
-#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-   return ee->engine.x.direct_resize;
+#ifdef BUILD_ECORE_EVAS_X11
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
+     {
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_x11_shape_input_reset");
+        return;
+     }
+
+   if (!ee->engine.x.win_shaped_input)
+      ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
+
+   ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 65535, 65535);
 #else
-   return 0;
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+   return;
+   ee = NULL;
+#endif
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
 EAPI void
-ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
+ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
 {
-#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
-   Ecore_X_Window *winp;
-
-   winp = malloc(sizeof(Ecore_X_Window));
-   if (winp)
+#ifdef BUILD_ECORE_EVAS_X11
+   if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
      {
-       *winp = win;
-       ee->engine.x.win_extra = evas_list_append(ee->engine.x.win_extra, winp);
-       ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_x_winid_str_get(win), ee);
+        ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
+                         "ecore_evas_x11_shape_input_apply");
+        return;
      }
+
+   if (!ee->engine.x.win_shaped_input) return;
+
+   ecore_x_window_shape_input_window_set(ee->prop.window, ee->engine.x.win_shaped_input);
 #else
-#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
+   return;
+   ee = NULL;
+#endif
 }
index 5374817..069cccd 100644 (file)
@@ -1,37 +1,27 @@
 #ifndef _ECORE_FB_H
 #define _ECORE_FB_H
 
+#include <Eina.h>
+
 #ifdef EAPI
-#undef EAPI
+# undef EAPI
 #endif
-#ifdef _MSC_VER
-# ifdef BUILDING_DLL
-#  define EAPI __declspec(dllexport)
-# else
-#  define EAPI __declspec(dllimport)
-# endif
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
+
+#ifdef __GNUC__
+# if __GNUC__ >= 4
+#  define EAPI __attribute__ ((visibility("default")))
 # else
 #  define EAPI
 # endif
+#else
+# define EAPI
 #endif
 
-/**
- * @file
- * @brief Ecore frame buffer system functions.
- */
-
 /* FIXME:
  * maybe a new module?
  * - code to get battery info
  * - code to get thermal info
- * ecore evas fb isnt good enough for weird things, like multiple fb's, same happens here.
+ * ecore evas fb isn't good enough for weird things, like multiple fb's, same happens here.
  * backlight support using new kernel interface
  * absolute axis
  * joystick
 extern "C" {
 #endif
 
-typedef struct _Ecore_Fb_Input_Device Ecore_Fb_Input_Device; /* an input device handler */
+/**
+ * @defgroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
+ *
+ * Functions used to set up and shut down the Ecore_Framebuffer functions.
+ *
+ * @{
+ */
+
+/**
+ * @typedef Ecore_Fb_Input_Device
+ * Input device handler.
+ */
+typedef struct _Ecore_Fb_Input_Device Ecore_Fb_Input_Device;
 
-/* device capabilities */
+/**
+ * @enum _Ecore_Fb_Input_Device_Cap
+ * Device capabilities.
+ */
 enum _Ecore_Fb_Input_Device_Cap
 {
    ECORE_FB_INPUT_DEVICE_CAP_NONE            = 0x00000000,
-     ECORE_FB_INPUT_DEVICE_CAP_RELATIVE        = 0x00000001,
-     ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE        = 0x00000002,
-     ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS = 0x00000004
+   ECORE_FB_INPUT_DEVICE_CAP_RELATIVE        = 0x00000001,
+   ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE        = 0x00000002,
+   ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS = 0x00000004
 };
-typedef enum   _Ecore_Fb_Input_Device_Cap Ecore_Fb_Input_Device_Cap;
 
-EAPI extern int ECORE_FB_EVENT_KEY_DOWN; /**< FB Key Down event */
-EAPI extern int ECORE_FB_EVENT_KEY_UP; /**< FB Key Up event */
-EAPI extern int ECORE_FB_EVENT_MOUSE_BUTTON_DOWN; /**< FB Mouse Down event */
-EAPI extern int ECORE_FB_EVENT_MOUSE_BUTTON_UP; /**< FB Mouse Up event */
-EAPI extern int ECORE_FB_EVENT_MOUSE_MOVE; /**< FB Mouse Move event */
-EAPI extern int ECORE_FB_EVENT_MOUSE_WHEEL; /**< FB Mouse Wheel event */
-
-typedef struct _Ecore_Fb_Event_Key_Down          Ecore_Fb_Event_Key_Down; /**< FB Key Down event */
-typedef struct _Ecore_Fb_Event_Key_Up            Ecore_Fb_Event_Key_Up; /**< FB Key Up event */
-typedef struct _Ecore_Fb_Event_Mouse_Button_Down Ecore_Fb_Event_Mouse_Button_Down; /**< FB Mouse Down event */
-typedef struct _Ecore_Fb_Event_Mouse_Button_Up   Ecore_Fb_Event_Mouse_Button_Up; /**< FB Mouse Up event */
-typedef struct _Ecore_Fb_Event_Mouse_Move        Ecore_Fb_Event_Mouse_Move; /**< FB Mouse Move event */
-typedef struct _Ecore_Fb_Event_Mouse_Wheel       Ecore_Fb_Event_Mouse_Wheel; /**< FB Mouse Wheel event */
-
-struct _Ecore_Fb_Event_Key_Down /** FB Key Down event */
-{
-   Ecore_Fb_Input_Device *dev; /**< The device associated with the event */
-   char   *keyname; /**< The name of the key that was pressed */
-   char   *keysymbol; /**< The logical symbol of the key that was pressed */
-   char   *key_compose; /**< The UTF-8 string conversion if any */
-};
-   
-struct _Ecore_Fb_Event_Key_Up /** FB Key Up event */
-{
-   Ecore_Fb_Input_Device *dev; /**< The device associated with the event */
-   char   *keyname; /**< The name of the key that was released */
-   char   *keysymbol; /**< The logical symbol of the key that was pressed */
-   char   *key_compose; /**< The UTF-8 string conversion if any */
-};
-   
-struct _Ecore_Fb_Event_Mouse_Button_Down /** FB Mouse Down event */
-{
-   Ecore_Fb_Input_Device *dev; /**< The device associated with the event */
-   int     button; /**< Mouse button that was pressed (1 - 32) */
-   int     x; /**< Mouse co-ordinates when mouse button was pressed */
-   int     y; /**< Mouse co-ordinates when mouse button was pressed */
-   int     double_click : 1; /**< Set if click was a double click */
-   int     triple_click : 1; /**< Set if click was a triple click  */
-};
-   
-struct _Ecore_Fb_Event_Mouse_Button_Up /** FB Mouse Up event */
-{
-   Ecore_Fb_Input_Device *dev; /**< The device associated with the event */
-   int     button; /**< Mouse button that was released (1 - 32) */
-   int     x; /**< Mouse co-ordinates when mouse button was raised */
-   int     y; /**< Mouse co-ordinates when mouse button was raised */
-};
-   
-struct _Ecore_Fb_Event_Mouse_Move /** FB Mouse Move event */ 
-{
-   Ecore_Fb_Input_Device *dev; /**< The device associated with the event */
-   int     x; /**< Mouse co-ordinates where the mouse cursor moved to */
-   int     y; /**< Mouse co-ordinates where the mouse cursor moved to */
-};
-   
-struct _Ecore_Fb_Event_Mouse_Wheel /** FB Mouse Wheel event */
-{
-   Ecore_Fb_Input_Device *dev;
-   int x,y;
-   int direction; /* 0 = vertical, 1 = horizontal */
-   int wheel; /* value 1 (left/up), -1 (right/down) */
-};
+/**
+ * @typedef Ecore_Fb_Input_Device_Cap
+ * Device capabilities.
+ */
+typedef enum   _Ecore_Fb_Input_Device_Cap Ecore_Fb_Input_Device_Cap;
 
 /* ecore_fb_vt.c */
-EAPI void ecore_fb_callback_gain_set(void (*func) (void *data), void *data);
-EAPI void ecore_fb_callback_lose_set(void (*func) (void *data), void *data);
+EAPI void                      ecore_fb_callback_gain_set(void (*func) (void *data), void *data);
+EAPI void                      ecore_fb_callback_lose_set(void (*func) (void *data), void *data);
+
 /* ecore_fb_li.c */
-EAPI Ecore_Fb_Input_Device           *ecore_fb_input_device_open(const char *dev);
-EAPI void                             ecore_fb_input_device_close(Ecore_Fb_Input_Device *dev);
-EAPI void                             ecore_fb_input_device_listen(Ecore_Fb_Input_Device *dev, int listen);
-EAPI const char                      *ecore_fb_input_device_name_get(Ecore_Fb_Input_Device *dev);
-EAPI Ecore_Fb_Input_Device_Cap        ecore_fb_input_device_cap_get(Ecore_Fb_Input_Device *dev);
-EAPI void                             ecore_fb_input_device_axis_size_set(Ecore_Fb_Input_Device *dev, int w, int h);
-EAPI void                             ecore_fb_input_threshold_click_set(Ecore_Fb_Input_Device *dev, double threshold);
-EAPI double                           ecore_fb_input_threshold_click_get(Ecore_Fb_Input_Device *dev);
+EAPI Ecore_Fb_Input_Device    *ecore_fb_input_device_open(const char *dev);
+EAPI void                      ecore_fb_input_device_close(Ecore_Fb_Input_Device *dev);
+EAPI void                      ecore_fb_input_device_listen(Ecore_Fb_Input_Device *dev, Eina_Bool listen);
+EAPI const char               *ecore_fb_input_device_name_get(Ecore_Fb_Input_Device *dev);
+EAPI Ecore_Fb_Input_Device_Cap ecore_fb_input_device_cap_get(Ecore_Fb_Input_Device *dev);
+EAPI void                      ecore_fb_input_device_axis_size_set(Ecore_Fb_Input_Device *dev, int w, int h);
+EAPI void                      ecore_fb_input_threshold_click_set(Ecore_Fb_Input_Device *dev, double threshold);
+EAPI double                    ecore_fb_input_threshold_click_get(Ecore_Fb_Input_Device *dev);
+EAPI void                      ecore_fb_input_device_window_set(Ecore_Fb_Input_Device *dev, void *window);
+
 /* ecore_fb.c */
-EAPI int    ecore_fb_init(const char *name);
-EAPI int    ecore_fb_shutdown(void);
-EAPI void   ecore_fb_size_get(int *w, int *h);   
 
-EAPI void   ecore_fb_touch_screen_calibrate_set(int xscale, int xtrans, int yscale, int ytrans, int xyswap);
-EAPI void   ecore_fb_touch_screen_calibrate_get(int *xscale, int *xtrans, int *yscale, int *ytrans, int *xyswap);
-   
+EAPI int                       ecore_fb_init(const char *name);
+EAPI int                       ecore_fb_shutdown(void);
+EAPI void                      ecore_fb_size_get(int *w, int *h);
+
+EAPI void                      ecore_fb_touch_screen_calibrate_set(int xscale, int xtrans, int yscale, int ytrans, int xyswap);
+EAPI void                      ecore_fb_touch_screen_calibrate_get(int *xscale, int *xtrans, int *yscale, int *ytrans, int *xyswap);
+
+/**
+ * @}
+ */
+
 #ifdef __cplusplus
 }
 #endif
index 5cc71bb..9129fec 100644 (file)
@@ -2,37 +2,33 @@ MAINTAINERCLEANFILES = Makefile.in
 
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
--I$(top_builddir)/src/lib/ecore
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_input \
+@TSLIB_CFLAGS@ \
+@EINA_CFLAGS@
 
-if BUILD_ECORE_FB
 
 lib_LTLIBRARIES = libecore_fb.la
-include_HEADERS = \
-Ecore_Fb.h
+includes_HEADERS = Ecore_Fb.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_fb_la_SOURCES = \
 ecore_fb.c \
 ecore_fb_vt.c \
 ecore_fb_li.c \
-ecore_fb_ts.c \
-ecore_fb_private.h
+ecore_fb_ts.c
 # deprecated sources (might not compile):
 # ecore_fb_kbd.c
 # ecore_fb_ps2.c
 
 libecore_fb_la_LIBADD = \
-@tslib_libs@ \
-$(top_builddir)/src/lib/ecore/libecore.la
+@TSLIB_LIBS@ \
+$(top_builddir)/src/lib/ecore/libecore.la \
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+@EINA_LIBS@
 
-libecore_fb_la_LDFLAGS = -version-info @version_info@
-
-libecore_fb_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la
-
-endif
+libecore_fb_la_LDFLAGS = -version-info @version_info@ @release_info@
 
 EXTRA_DIST = \
-Ecore_Fb.h \
-ecore_fb.c \
 ecore_fb_private.h \
 ecore_fb_keytable.h
index a695dda..5b2b84b 100644 (file)
@@ -1,75 +1,99 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include "Ecore_Fb.h"
 #include "ecore_fb_private.h"
 
 static void _ecore_fb_size_get(int *w, int *h);
 
-EAPI int ECORE_FB_EVENT_KEY_DOWN = 0;
-EAPI int ECORE_FB_EVENT_KEY_UP = 0;
-EAPI int ECORE_FB_EVENT_MOUSE_BUTTON_DOWN = 0;
-EAPI int ECORE_FB_EVENT_MOUSE_BUTTON_UP = 0;
-EAPI int ECORE_FB_EVENT_MOUSE_MOVE = 0;
-EAPI int ECORE_FB_EVENT_MOUSE_WHEEL = 0;
-
 static int _ecore_fb_init_count = 0;
 static int _ecore_fb_console_w = 0;
 static int _ecore_fb_console_h = 0;
 
-static double _ecore_fb_double_click_time = 0.25;
-
-
 /**
- * @defgroup Ecore_FB_Library_Group Framebuffer Library Functions
+ * @addtogroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
  *
- * Functions used to set up and shut down the Ecore_Framebuffer functions.
+ * @{
  */
 
+static sighandler_t oldhand = NULL;
+
+static void
+nosigint(int val __UNUSED__)
+{
+}
+
 /**
- * Sets up the Ecore_Fb library.
- * @param   name device target name
- * @return  @c 0 on failure.  Otherwise, the number of times the library has
- *          been initialised without being shut down.
- * @ingroup Ecore_FB_Library_Group
+ * @brief Initialize the Ecore_Fb library.
+ *
+ * @param name Device target name.
+ * @return 1 or greater on success, 0 on error.
+ *
+ * This function sets up all the Ecore_Fb library. It returns 0 on
+ * failure, otherwise it returns the number of times it has already
+ * been called.
+ *
+ * When Ecore_Fb is not used anymore, call ecore_fb_shutdown() to shut down
+ * the Ecore_Fb library.
  */
 EAPI int
 ecore_fb_init(const char *name __UNUSED__)
 {
-       if(!_ecore_fb_init_count)
-       {
-               if(!ecore_fb_vt_init()) return 0;
-               ECORE_FB_EVENT_KEY_DOWN          = ecore_event_type_new();
-               ECORE_FB_EVENT_KEY_UP            = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_BUTTON_UP   = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_MOVE        = ecore_event_type_new();
-               ECORE_FB_EVENT_MOUSE_WHEEL       = ecore_event_type_new();
-               _ecore_fb_size_get(&_ecore_fb_console_w, &_ecore_fb_console_h);
-       }
-       return ++_ecore_fb_init_count;
+   if (++_ecore_fb_init_count != 1)
+      return _ecore_fb_init_count;
+
+   if (!ecore_fb_vt_init())
+      return --_ecore_fb_init_count;
+
+   if (!oldhand)
+     {
+        oldhand = signal(SIGINT, nosigint);
+     }
+   
+   _ecore_fb_size_get(&_ecore_fb_console_w, &_ecore_fb_console_h);
+
+   return _ecore_fb_init_count;
 }
 
 /**
- * Shuts down the Ecore_Fb library. 
- * @return  @c The number of times the system has been initialised without
- *             being shut down.
- * @ingroup Ecore_FB_Library_Group
+ * @brief Shut down the Ecore_Fb library.
+ *
+ * @return 0 when the library is completely shut down, 1 or
+ * greater otherwise.
+ *
+ * This function shuts down the Ecore_Fb library. It returns 0 when it has
+ * been called the same number of times than ecore_fb_init().
  */
 EAPI int
 ecore_fb_shutdown(void)
-{    
-       _ecore_fb_init_count--;
-       if(!_ecore_fb_init_count)
-       {
-               ecore_fb_vt_shutdown();
-               return 0;
-       }
-       return _ecore_fb_init_count;
+{
+   if (--_ecore_fb_init_count != 0)
+      return _ecore_fb_init_count;
+
+   if (oldhand)
+     {
+        signal(SIGINT, oldhand);
+        oldhand = NULL;
+     }
+   
+   ecore_fb_vt_shutdown();
+
+   return _ecore_fb_init_count;
 }
 
 
 /**
- * Retrieves the width and height of the current frame buffer in pixels.
+ * @brief Retrieve the width and height of the current frame buffer in
+ * pixels.
+ *
  * @param w Pointer to an integer in which to store the width.
  * @param h Pointer to an interge in which to store the height.
+ *
+ * This function retrieves the size of the current frame buffer in
+ * pixels. @p w and @p h can be buffers that will be filled with the
+ * corresponding values. If one of them is @c NULL, nothing will be
+ * done for that parameter.
  */
 EAPI void
 ecore_fb_size_get(int *w, int *h)
@@ -83,21 +107,23 @@ _ecore_fb_size_get(int *w, int *h)
 {
    struct fb_var_screeninfo fb_var;
    int fb;
-   
+
    fb = open("/dev/fb0", O_RDWR);
    if (fb < 0)
-     {
-       if (w) *w = 0;
-       if (h) *h = 0;
-       return;
-     }
+      goto exit;
+
    if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_var) == -1)
-     {
-       if (w) *w = 0;
-       if (h) *h = 0;
-       return;
-     }
+      goto err_ioctl;
+
+   *w = fb_var.xres;
+   *h = fb_var.yres;
+
+err_ioctl:
    close(fb);
-   if (w) *w = fb_var.xres;
-   if (h) *h = fb_var.yres;
+exit:
+   return;
 }
+
+/**
+ * @}
+ */
index 0cc1186..f9cdc3d 100644 (file)
@@ -1,7 +1,7 @@
 static void _ecore_fb_event_free_key_down(void *data, void *ev);
 static void _ecore_fb_event_free_key_up(void *data, void *ev);
 
-static const char *_ecore_fb_kbd_syms[128 * 6] =
+static const char *_ecore_fb_kbd_syms[128 * 7] =
 {
 #include "ecore_fb_keytable.h"
 };
@@ -9,128 +9,128 @@ static const char *_ecore_fb_kbd_syms[128 * 6] =
 static const char *_ecore_fb_btn_syms[128] =
 {
    "0x00",
-     "Escape", 
-     "F1", 
-     "F2", 
-     "F3", 
-     "F4", 
-     "Up", 
+     "Escape",
+     "F1",
+     "F2",
+     "F3",
+     "F4",
+     "Up",
      "Right",
-     "Left", 
-     "Down", 
-     "Return", 
-     "0x1b", 
-     "0x1c", 
-     "0x1d", 
+     "Left",
+     "Down",
+     "Return",
+     "0x1b",
+     "0x1c",
+     "0x1d",
      "0x1e",
      "0x1f",
-     "0x20", 
-     "0x21", 
-     "0x22", 
-     "0x23", 
-     "0x24", 
-     "0x25", 
-     "0x26", 
+     "0x20",
+     "0x21",
+     "0x22",
+     "0x23",
+     "0x24",
+     "0x25",
+     "0x26",
      "0x27",
-     "0x28", 
-     "0x29", 
+     "0x28",
+     "0x29",
      "0x2a",
      "0x2b",
      "0x2c",
      "0x2d",
-     "0x2e", 
-     "0x2f", 
-     "0x30", 
-     "0x31", 
-     "0x32", 
-     "0x33", 
-     "0x34", 
-     "0x35", 
-     "0x36", 
+     "0x2e",
+     "0x2f",
+     "0x30",
+     "0x31",
+     "0x32",
+     "0x33",
+     "0x34",
+     "0x35",
+     "0x36",
      "0x37",
-     "0x38", 
-     "0x39", 
+     "0x38",
+     "0x39",
      "0x3a",
      "0x3b",
      "0x3c",
      "0x3d",
-     "0x3e", 
-     "0x3f", 
-     "0x40", 
-     "0x41", 
-     "0x42", 
-     "0x43", 
-     "0x44", 
-     "0x45", 
-     "0x46", 
+     "0x3e",
+     "0x3f",
+     "0x40",
+     "0x41",
+     "0x42",
+     "0x43",
+     "0x44",
+     "0x45",
+     "0x46",
      "0x47",
-     "0x48", 
-     "0x49", 
+     "0x48",
+     "0x49",
      "0x4a",
      "0x4b",
      "0x4c",
      "0x4d",
-     "0x4e", 
-     "0x4f", 
-     "0x50", 
-     "0x51", 
-     "0x52", 
-     "0x53", 
-     "0x54", 
-     "0x55", 
-     "0x56", 
+     "0x4e",
+     "0x4f",
+     "0x50",
+     "0x51",
+     "0x52",
+     "0x53",
+     "0x54",
+     "0x55",
+     "0x56",
      "0x57",
-     "0x58", 
-     "0x59", 
+     "0x58",
+     "0x59",
      "0x5a",
      "0x5b",
      "0x5c",
      "0x5d",
-     "0x5e", 
-     "0x5f", 
-     "0x60", 
-     "0x61", 
-     "0x62", 
-     "0x63", 
-     "0x64", 
-     "0x65", 
-     "0x66", 
+     "0x5e",
+     "0x5f",
+     "0x60",
+     "0x61",
+     "0x62",
+     "0x63",
+     "0x64",
+     "0x65",
+     "0x66",
      "0x67",
-     "0x68", 
-     "0x69", 
+     "0x68",
+     "0x69",
      "0x6a",
      "0x6b",
      "0x6c",
      "0x6d",
-     "0x6e", 
-     "0x6f", 
-     "0x70", 
-     "0x71", 
-     "0x72", 
-     "0x73", 
-     "0x74", 
-     "0x75", 
-     "0x76", 
+     "0x6e",
+     "0x6f",
+     "0x70",
+     "0x71",
+     "0x72",
+     "0x73",
+     "0x74",
+     "0x75",
+     "0x76",
      "0x77",
-     "0x78", 
-     "0x79", 
+     "0x78",
+     "0x79",
      "0x7a",
      "0x7b",
      "0x7c",
      "0x7d",
-     "0x7e", 
+     "0x7e",
      "0x7f"
 };
-static int _ecore_fb_kbd_fd = 0;
+static int _ecore_fb_kbd_fd = -1;
 static int _ecore_fb_ctrl = 0;
 static int _ecore_fb_alt = 0;
 static int _ecore_fb_shift = 0;
 static int _ecore_fb_lock = 0;
 
 static Ecore_Fd_Handler *_ecore_fb_kbd_fd_handler_handle = NULL;
-static int _ecore_fb_kbd_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_fb_kbd_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
 
-static void 
+static void
 _ecore_fb_event_free_key_down(void *data __UNUSED__, void *ev)
 {
    Ecore_Fb_Event_Key_Up *e;
@@ -145,7 +145,7 @@ static void
 _ecore_fb_event_free_key_up(void *data __UNUSED__, void *ev)
 {
    Ecore_Fb_Event_Key_Up *e;
-   
+
    e = ev;
    free(e->keyname);
    if (e->keysymbol) free(e->keysymbol);
@@ -153,139 +153,160 @@ _ecore_fb_event_free_key_up(void *data __UNUSED__, void *ev)
    free(e);
 }
 
-static int
+static Eina_Bool
 _ecore_fb_kbd_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
    int v = 0;
-   
+
    do
      {
-       unsigned char buf;
-       
-       v = read(_ecore_fb_kbd_fd, &buf, 1);
-       if (v < 0) return 1;
-       if (v < 1) return 1;
-       if (!(buf & 0x80))
-         {
-            /* DOWN */
-            int vt_switch = -1;
-            Ecore_Fb_Event_Key_Down *e;
-            
-            e = calloc(1, sizeof(Ecore_Fb_Event_Key_Down));
-            if (!e) goto retry;
-            if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
-              {
-                 int add = 0;
-                 
-                 if (_ecore_fb_shift) add = 1;
-                 else if (_ecore_fb_lock) add = 2;
-                 e->keyname = strdup(_ecore_fb_kbd_syms[(buf & 0x7f) * 6]);
-                 e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + add]);
-                 e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + 3 + add]);
-              }
-            else
-              e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
-            if (!e->keyname)
-              {
-                 free(e);
-                 goto retry;
-              }
-            ecore_event_add(ECORE_FB_EVENT_KEY_DOWN, e, _ecore_fb_event_free_key_down, NULL);
-            if (!strcmp(e->keyname, "Control_L"))
-              _ecore_fb_ctrl++;
-            else if (!strcmp(e->keyname, "Control_R"))
-              _ecore_fb_ctrl++;
-            else if (!strcmp(e->keyname, "Alt_L"))
-              _ecore_fb_alt++;
-            else if (!strcmp(e->keyname, "Alt_R"))
-              _ecore_fb_alt++;
-            else if (!strcmp(e->keyname, "Shift_L"))
-              _ecore_fb_shift++;
-            else if (!strcmp(e->keyname, "Shift_R"))
-              _ecore_fb_shift++;
-            else if (!strcmp(e->keyname, "Caps_Lock"))
-              _ecore_fb_lock++;
-            else if (!strcmp(e->keyname, "F1")) vt_switch = 0;
-            else if (!strcmp(e->keyname, "F2")) vt_switch = 1;
-            else if (!strcmp(e->keyname, "F3")) vt_switch = 2;
-            else if (!strcmp(e->keyname, "F4")) vt_switch = 3;
-            else if (!strcmp(e->keyname, "F5")) vt_switch = 4;
-            else if (!strcmp(e->keyname, "F6")) vt_switch = 5;
-            else if (!strcmp(e->keyname, "F7")) vt_switch = 6;
-            else if (!strcmp(e->keyname, "F8")) vt_switch = 7;
-            else if (!strcmp(e->keyname, "F9")) vt_switch = 8;
-            else if (!strcmp(e->keyname, "F10")) vt_switch = 9;
-            else if (!strcmp(e->keyname, "F11")) vt_switch = 10;
-            else if (!strcmp(e->keyname, "F12")) vt_switch = 11;
-            if (_ecore_fb_ctrl > 2) _ecore_fb_ctrl = 2;
-            if (_ecore_fb_alt > 2) _ecore_fb_alt = 2;
-            if ((vt_switch >= 0) &&
-                (_ecore_fb_ctrl) &&
-                (_ecore_fb_alt))
-              _ecore_fb_vt_switch(vt_switch);
-         }
-       else
-         {
-            /* UP */
-            Ecore_Fb_Event_Key_Up *e;
-            
-            e = calloc(1, sizeof(Ecore_Fb_Event_Key_Up));
-            if (!e) goto retry;
-            if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
-              {
-                 int add = 0;
-                 
-                 if (_ecore_fb_shift) add = 1;
-                 else if (_ecore_fb_lock) add = 2;
-                 e->keyname = strdup(_ecore_fb_kbd_syms[(buf & 0x7f) * 6]);
-                 e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + add]);
-                 e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 6) + 3 + add]);
-              }
-            else
-              e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
-            if (!e->keyname)
-              {
-                 free(e);
-                 goto retry;
-              }
-            ecore_event_add(ECORE_FB_EVENT_KEY_UP, e, _ecore_fb_event_free_key_up, NULL);
-            if (!strcmp(e->keyname, "Control_L"))
-              _ecore_fb_ctrl--;
-            else if (!strcmp(e->keyname, "Control_R"))
-              _ecore_fb_ctrl--;
-            else if (!strcmp(e->keyname, "Alt_L"))
-              _ecore_fb_alt--;
-            else if (!strcmp(e->keyname, "Alt_R"))
-              _ecore_fb_alt--;
-            else if (!strcmp(e->keyname, "Shift_L"))
-              _ecore_fb_shift--;
-            else if (!strcmp(e->keyname, "Shift_R"))
-              _ecore_fb_shift--;
-            else if (!strcmp(e->keyname, "Caps_Lock"))
-              _ecore_fb_lock--;
-            if (_ecore_fb_ctrl < 0) _ecore_fb_ctrl = 0;
-            if (_ecore_fb_alt < 0) _ecore_fb_alt = 0;
-            if (_ecore_fb_shift < 0) _ecore_fb_shift = 0;
-            if (_ecore_fb_lock < 0) _ecore_fb_lock = 0;
-         }
-       retry:
-       ;
+        unsigned char buf;
+
+        v = read(_ecore_fb_kbd_fd, &buf, 1);
+        if (v < 0) return EINA_TRUE;
+        if (v < 1) return EINA_TRUE;
+        if (!(buf & 0x80))
+          {
+             /* DOWN */
+             int vt_switch = -1;
+             Ecore_Fb_Event_Key_Down *e;
+
+             e = calloc(1, sizeof(Ecore_Fb_Event_Key_Down));
+             if (!e) goto retry;
+             if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
+               {
+                  int add = 0;
+
+                  if (_ecore_fb_shift) add = 1;
+                  else if (_ecore_fb_lock) add = 2;
+                  e->keyname = strdup(_ecore_fb_kbd_syms[(buf & 0x7f) * 7]);
+                  e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + add]);
+                  e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + 3 + add]);
+               }
+             else
+                e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
+             if (!e->keyname)
+               {
+                  free(e);
+                  goto retry;
+               }
+             e->window = 1;
+             e->event_window = e->window;
+             e->root_window = e->window; 
+             e->same_screen = 1;
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+             if (!strcmp(e->keyname, "Control_L"))
+                _ecore_fb_ctrl++;
+             else if (!strcmp(e->keyname, "Control_R"))
+                _ecore_fb_ctrl++;
+             else if (!strcmp(e->keyname, "Alt_L"))
+                _ecore_fb_alt++;
+             else if (!strcmp(e->keyname, "Alt_R"))
+                _ecore_fb_alt++;
+             else if (!strcmp(e->keyname, "Shift_L"))
+                _ecore_fb_shift++;
+             else if (!strcmp(e->keyname, "Shift_R"))
+                _ecore_fb_shift++;
+             else if (!strcmp(e->keyname, "Caps_Lock"))
+                _ecore_fb_lock++;
+             else if (!strcmp(e->keyname, "F1")) vt_switch = 0;
+             else if (!strcmp(e->keyname, "F2")) vt_switch = 1;
+             else if (!strcmp(e->keyname, "F3")) vt_switch = 2;
+             else if (!strcmp(e->keyname, "F4")) vt_switch = 3;
+             else if (!strcmp(e->keyname, "F5")) vt_switch = 4;
+             else if (!strcmp(e->keyname, "F6")) vt_switch = 5;
+             else if (!strcmp(e->keyname, "F7")) vt_switch = 6;
+             else if (!strcmp(e->keyname, "F8")) vt_switch = 7;
+             else if (!strcmp(e->keyname, "F9")) vt_switch = 8;
+             else if (!strcmp(e->keyname, "F10")) vt_switch = 9;
+             else if (!strcmp(e->keyname, "F11")) vt_switch = 10;
+             else if (!strcmp(e->keyname, "F12")) vt_switch = 11;
+             if (_ecore_fb_ctrl > 2) _ecore_fb_ctrl = 2;
+             if (_ecore_fb_alt > 2) _ecore_fb_alt = 2;
+             if ((_ecore_fb_kbd_fd == _ecore_fb_tty_fd) &&
+                 (_ecore_fb_ctrl))
+               {
+                  const char *ts = _ecore_fb_kbd_syms[(buf & 0x7f) + 3 + 3];
+                  
+                  if (ts)
+                    {
+                       if (e->key_compose) free(e->key_compose);
+                       e->key_compose = strdup(ts);
+                    }
+               }
+             if ((vt_switch >= 0) &&
+                 (_ecore_fb_ctrl) &&
+                 (_ecore_fb_alt))
+                _ecore_fb_vt_switch(vt_switch);
+             ecore_event_add(ECORE_FB_EVENT_KEY_DOWN, e, _ecore_fb_event_free_key_down, NULL);
+          }
+        else
+          {
+             /* UP */
+             Ecore_Fb_Event_Key_Up *e;
+
+             e = calloc(1, sizeof(Ecore_Fb_Event_Key_Up));
+             if (!e) goto retry;
+             if (_ecore_fb_kbd_fd == _ecore_fb_tty_fd)
+               {
+                  int add = 0;
+
+                  if (_ecore_fb_shift) add = 1;
+                  else if (_ecore_fb_lock) add = 2;
+                  e->keyname = strdup(_ecore_fb_kbd_syms[(buf & 0x7f) * 7]);
+                  e->keysymbol = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + add]);
+                  e->key_compose = strdup(_ecore_fb_kbd_syms[((buf & 0x7f) * 7) + 3 + add]);
+               }
+             else
+                e->keyname = strdup(_ecore_fb_btn_syms[buf & 0x7f]);
+             if (!e->keyname)
+               {
+                  free(e);
+                  goto retry;
+               }
+             e->window = 1;
+             e->event_window = e->window;
+             e->root_window = e->window; 
+             e->same_screen = 1;
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+             ecore_event_add(ECORE_FB_EVENT_KEY_UP, e, _ecore_fb_event_free_key_up, NULL);
+             if (!strcmp(e->keyname, "Control_L"))
+                _ecore_fb_ctrl--;
+             else if (!strcmp(e->keyname, "Control_R"))
+                _ecore_fb_ctrl--;
+             else if (!strcmp(e->keyname, "Alt_L"))
+                _ecore_fb_alt--;
+             else if (!strcmp(e->keyname, "Alt_R"))
+                _ecore_fb_alt--;
+             else if (!strcmp(e->keyname, "Shift_L"))
+                _ecore_fb_shift--;
+             else if (!strcmp(e->keyname, "Shift_R"))
+                _ecore_fb_shift--;
+             else if (!strcmp(e->keyname, "Caps_Lock"))
+                _ecore_fb_lock--;
+             if (_ecore_fb_ctrl < 0) _ecore_fb_ctrl = 0;
+             if (_ecore_fb_alt < 0) _ecore_fb_alt = 0;
+             if (_ecore_fb_shift < 0) _ecore_fb_shift = 0;
+             if (_ecore_fb_lock < 0) _ecore_fb_lock = 0;
+          }
+retry:
+        ;
      }
    while (v > 0);
-   return 1;
+   return EINA_TRUE;
 }
 
 int
 ecore_fb_kbd_init(void)
 {
    int prev_flags;
-   
+
    prev_flags = fcntl(_ecore_fb_kbd_fd, F_GETFL);
    fcntl(_ecore_fb_kbd_fd, F_SETFL, prev_flags | O_NONBLOCK);
    _ecore_fb_kbd_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_kbd_fd,
-                                                                   ECORE_FD_READ,
-                                                                   _ecore_fb_kbd_fd_handler, NULL,
-                                                                   NULL, NULL);
+                                                               ECORE_FD_READ,
+                                                               _ecore_fb_kbd_fd_handler, NULL,
+                                                               NULL, NULL);
    if(!_ecore_fb_kbd_fd_handler_handle) return 0;
    return 1;
 }
@@ -293,10 +314,10 @@ ecore_fb_kbd_init(void)
 void
 ecore_fb_kbd_shutdown(void)
 {
+   if (_ecore_fb_kbd_fd_handler_handle)
+      ecore_main_fd_handler_del(_ecore_fb_kbd_fd_handler_handle);
    if (_ecore_fb_kbd_fd >= 0) close(_ecore_fb_kbd_fd);
-   if (_ecore_fb_kbd_fd_handler_handle) 
-     ecore_main_fd_handler_del(_ecore_fb_kbd_fd_handler_handle);
-   _ecore_fb_kbd_fd = 0;
+   _ecore_fb_kbd_fd = -1;
    _ecore_fb_kbd_fd_handler_handle = NULL;
    _ecore_fb_ctrl = 0;
    _ecore_fb_lock = 0;
index ff03497..70bf6b9 100644 (file)
 /* this table was taken from ecore_fb, is the default en layout */
-         "0x00",          "0x00",          "0x00", /**/"",    "",    "",/***/
-       "Escape",        "Escape",        "Escape", /**/"",    "",    "",/***/
-            "1",        "exclam",             "1", /**/"1",   "!",   "1",/***/
-            "2",            "at",             "2", /**/"2",   "@",   "2",/***/
-            "3",    "numbersign",             "3", /**/"3",   "#",   "3",/***/
-            "4",        "dollar",             "4", /**/"4",   "$",   "4",/***/
-            "5",       "percent",             "5", /**/"5",   "%",   "5",/***/
-            "6",  "asciicircumm",             "6", /**/"6",   "^",   "6",/***/
-            "7",     "ampersand",             "7", /**/"7",   "&",   "7",/***/
-            "8",       "asterik",             "8", /**/"8",   "*",   "8",/***/
-            "9",     "parenleft",             "9", /**/"9",   "(",   "9",/***/
-            "0",    "parenright",             "0", /**/"0",   ")",   "0",/***/
-        "minus",    "underscore",         "minus", /**/"-",   "_",   "-",/***/
-        "equal",          "plus",         "equal", /**/"=",   "+",   "=",/***/
-    "BackSpace",     "BackSpace",     "BackSpace", /**/"\010","\010","\010",/***/
-          "Tab",  "ISO_Left_Tab",           "Tab", /**/"\011","",    "\011",/***/
-            "q",             "Q",             "Q", /**/"q",   "Q",   "Q",/***/
-            "w",             "W",             "W", /**/"w",   "W",   "W",/***/
-            "e",             "E",             "E", /**/"e",   "E",   "E",/***/
-            "r",             "R",             "R", /**/"r",   "R",   "R",/***/
-            "t",             "T",             "T", /**/"t",   "T",   "T",/***/
-            "y",             "Y",             "Y", /**/"y",   "Y",   "Y",/***/
-            "u",             "U",             "U", /**/"u",   "U",   "U",/***/
-            "i",             "I",             "I", /**/"i",   "I",   "I",/***/
-            "o",             "O",             "O", /**/"o",   "O",   "O",/***/
-            "p",             "P",             "P", /**/"p",   "P",   "P",/***/
-  "bracketleft",     "braceleft",   "bracketleft", /**/"[",   "{",   "[",/***/
- "bracketright",    "braceright",  "bracketright", /**/"]",   "}",   "]",/***/
-       "Return",        "Return",        "Return", /**/"\015","\015","\015",/***/
-    "Control_L",     "Control_L",     "Control_L", /**/"",    "",    "",/***/
-            "a",             "A",             "A", /**/"a",   "A",   "A",/***/
-            "s",             "S",             "S", /**/"s",   "S",   "S",/***/
-            "d",             "D",             "D", /**/"d",   "D",   "D",/***/
-            "f",             "F",             "F", /**/"f",   "F",   "F",/***/
-            "g",             "G",             "G", /**/"g",   "G",   "G",/***/
-            "h",             "h",             "H", /**/"h",   "H",   "H",/***/
-            "j",             "J",             "J", /**/"j",   "J",   "J",/***/
-            "k",             "K",             "K", /**/"k",   "K",   "K",/***/
-            "l",             "L",             "L", /**/"l",   "L",   "L",/***/
-    "semicolon",         "colon",     "semicolon", /**/";",   ":",   ";",/***/
-   "apostrophe",      "quotedbl",    "apostrophe", /**/"'",   "\"",  "'",/***/
-        "grave",    "asciitilde",         "grave", /**/"`",   "~",   "`",/***/
-      "Shift_L",       "Shift_L",       "Shift_L", /**/"",    "",    "",/***/
-    "backslash",           "bar",     "backslash", /**/"\\",  "|",   "\\",/***/
-            "z",             "Z",             "Z", /**/"z",   "Z",   "Z",/***/
-            "x",             "X",             "X", /**/"x",   "X",   "X",/***/
-            "c",             "C",             "C", /**/"c",   "C",   "C",/***/
-            "v",             "V",             "V", /**/"v",   "V",   "V",/***/
-            "b",             "B",             "B", /**/"b",   "B",   "B",/***/
-            "n",             "N",             "N", /**/"n",   "N",   "N",/***/
-            "m",             "M",             "M", /**/"m",   "M",   "M",/***/
-        "comma",          "less",         "comma", /**/",",   "<",   ",",/***/
-       "period",       "greater",        "period", /**/".",   ">",   ".",/***/
-        "slash",      "question",         "slash", /**/"/",   "?",   "/",/***/
-      "Shift_R",       "Shift_R",       "Shift_R", /**/"",    "",    "",/***/
-  "KP_Multiply",   "KP_Multiply",   "KP_Multiply", /**/"",    "*",   "",/***/
-        "Alt_L",         "Alt_L",         "Alt_L", /**/"",    "",    "",/***/
-        "space",         "space",         "space", /**/" ",   " ",   " ",/***/
-    "Caps_Lock",     "Caps_Lock",     "Caps_Lock", /**/"",    "",    "",/***/
-           "F1",            "F1",            "F1", /**/"",    "",    "",/***/
-           "F2",            "F2",            "F2", /**/"",    "",    "",/***/
-           "F3",            "F3",            "F3", /**/"",    "",    "",/***/
-           "F4",            "F4",            "F4", /**/"",    "",    "",/***/
-           "F5",            "F5",            "F5", /**/"",    "",    "",/***/
-           "F6",            "F6",            "F6", /**/"",    "",    "",/***/
-           "F7",            "F7",            "F7", /**/"",    "",    "",/***/
-           "F8",            "F8",            "F8", /**/"",    "",    "",/***/
-           "F9",            "F9",            "F9", /**/"",    "",    "",/***/
-          "F10",           "F10",           "F10", /**/"",    "",    "",/***/
-     "Num_Lock",      "Num_Lock",      "Num_Lock", /**/"",    "",    "",/***/
-  "Scroll_Lock",   "Scroll_Lock",   "Scroll_Lock", /**/"",    "",    "",/***/
-      "KP_Home",          "KP_7",       "KP_Home", /**/"",    "7",   "",/***/
-        "KP_Up",          "KP_8",         "KP_Up", /**/"",    "8",   "",/***/
-     "KP_Prior",          "KP_9",      "KP_Prior", /**/"",    "9",   "",/***/
-  "KP_Subtract",   "KP_Subtract",   "KP_Subtract", /**/"",    "",    "",/***/
-      "KP_Left",          "KP_4",       "KP_Left", /**/"",    "4",   "",/***/
-     "KP_Begin",          "KP_5",      "KP_Begin", /**/"",    "5",   "",/***/
-     "KP_Right",          "KP_6",      "KP_Right", /**/"",    "6",   "",/***/
-       "KP_Add",        "KP_Add",        "KP_Add", /**/"",    "",    "",/***/
-       "KP_End",          "KP_1",        "KP_End", /**/"",    "1",   "",/***/
-      "KP_Down",          "KP_2",       "KP_Down", /**/"",    "2",   "",/***/
-      "KP_Next",          "KP_3",       "KP_Next", /**/"",    "3",   "",/***/
-    "KP_Insert",          "KP_0",     "KP_Insert", /**/"",    "0",   "",/***/
-    "KP_Delete",    "KP_Decimal",     "KP_Delete", /**/"",    ".",   "",/***/
-        "0x54",          "0x54",          "0x54", /**/"",    "",    "",/***/
-         "0x55",          "0x55",          "0x55", /**/"",    "",    "",/***/
-         "0x56",          "0x56",          "0x56", /**/"",    "",    "",/***/
-          "F11",           "F11",           "F11", /**/"",    "",    "",/***/
-          "F12",           "F12",           "F12", /**/"",    "",    "",/***/
-         "0x59",          "0x59",          "0x59", /**/"",    "",    "",/***/
-         "0x5a",          "0x5a",          "0x5a", /**/"",    "",    "",/***/
-         "0x5b",          "0x5b",          "0x5b", /**/"",    "",    "",/***/
-         "0x5c",          "0x5c",          "0x5c", /**/"",    "",    "",/***/
-         "0x5d",          "0x5d",          "0x5d", /**/"",    "",    "",/***/
-         "0x5e",          "0x5e",          "0x5e", /**/"",    "",    "",/***/
-         "0x5f",          "0x5f",          "0x5f", /**/"",    "",    "",/***/
-     "KP_Enter",      "KP_Enter",      "KP_Enter", /**/"",    "",    "",/***/
-    "Control_R",     "Control_R",     "Control_R", /**/"",    "",    "",/***/
-    "KP_Divide",     "KP_Divide",     "KP_Divide", /**/"",    "",    "",/***/
-        "Print",         "Print",         "Print", /**/"",    "",    "",/***/
-        "Alt_R",         "Alt_R",         "Alt_R", /**/"",    "",    "",/***/
-         "0x65",          "0x65",          "0x65", /**/"",    "",    "",/***/
-         "Home",          "Home",          "Home", /**/"",    "",    "",/***/
-           "Up",            "Up",            "Up", /**/"",    "",    "",/***/
-        "Prior",         "Prior",         "Prior", /**/"",    "",    "",/***/
-         "Left",          "Left",          "Left", /**/"",    "",    "",/***/
-        "Right",         "Right",         "Right", /**/"",    "",    "",/***/
-          "End",           "End",           "End", /**/"",    "",    "",/***/
-         "Down",          "Down",          "Down", /**/"",    "",    "",/***/
-         "Next",          "Next",          "Next", /**/"",    "",    "",/***/
-       "Insert",        "Insert",        "Insert", /**/"",    "",    "",/***/
-       "Delete",        "Delete",        "Delete", /**/"\177","\177","\177",/***/
-         "0x70",          "0x70",          "0x70", /**/"",    "",    "",/***/
-         "0x71",          "0x71",          "0x71", /**/"",    "",    "",/***/
-         "0x72",          "0x72",          "0x72", /**/"",    "",    "",/***/
-         "0x73",          "0x73",          "0x73", /**/"",    "",    "",/***/
-         "0x74",          "0x74",          "0x74", /**/"",    "",    "",/***/
-         "0x75",          "0x75",          "0x75", /**/"",    "",    "",/***/
-         "0x76",          "0x76",          "0x76", /**/"",    "",    "",/***/
-        "Pause",         "Pause",         "Pause", /**/"",    "",    "",/***/
-         "0x78",          "0x78",          "0x78", /**/"",    "",    "",/***/
-         "0x79",          "0x79",          "0x79", /**/"",    "",    "",/***/
-         "0x7a",          "0x7a",          "0x7a", /**/"",    "",    "",/***/
-         "0x7b",          "0x7b",          "0x7b", /**/"",    "",    "",/***/
-         "0x7c",          "0x7c",          "0x7c", /**/"",    "",    "",/***/
-      "Super_L",       "Super_L",       "Super_L", /**/"",    "",    "",/***/
-      "Super_R",       "Super_R",       "Super_R", /**/"",    "",    "",/***/
-         "0x7f",          "0x7f",          "0x7f", /**/"",    "",    "" /***/
+         "0x00",          "0x00",          "0x00", /**/"",    "",    "",  NULL,/***/
+       "Escape",        "Escape",        "Escape", /**/"",    "",    "",  "\x1b",/***/
+            "1",        "exclam",             "1", /**/"1",   "!",   "1",  NULL,/***/
+            "2",            "at",             "2", /**/"2",   "@",   "2",  "",/***/
+            "3",    "numbersign",             "3", /**/"3",   "#",   "3",  "\x1b",/***/
+            "4",        "dollar",             "4", /**/"4",   "$",   "4",  "\x1c",/***/
+            "5",       "percent",             "5", /**/"5",   "%",   "5",  "\x1d",/***/
+            "6",  "asciicircumm",             "6", /**/"6",   "^",   "6",  "\x1e",/***/
+            "7",     "ampersand",             "7", /**/"7",   "&",   "7",  "\x1f",/***/
+            "8",       "asterisk",            "8", /**/"8",   "*",   "8",  "\x7f",/***/
+            "9",     "parenleft",             "9", /**/"9",   "(",   "9",  NULL,/***/
+            "0",    "parenright",             "0", /**/"0",   ")",   "0",  NULL,/***/
+        "minus",    "underscore",         "minus", /**/"-",   "_",   "-",  NULL,/***/
+        "equal",          "plus",         "equal", /**/"=",   "+",   "=",  NULL,/***/
+    "BackSpace",     "BackSpace",     "BackSpace", /**/"\010","\010","\010",  NULL,/***/
+          "Tab",  "ISO_Left_Tab",           "Tab", /**/"\011","",    "\011",  NULL,/***/
+            "q",             "Q",             "Q", /**/"q",   "Q",   "Q",  "\x11",/***/
+            "w",             "W",             "W", /**/"w",   "W",   "W",  "\x17",/***/
+            "e",             "E",             "E", /**/"e",   "E",   "E",  "\x05",/***/
+            "r",             "R",             "R", /**/"r",   "R",   "R",  "\x12",/***/
+            "t",             "T",             "T", /**/"t",   "T",   "T",  "\x14",/***/
+            "y",             "Y",             "Y", /**/"y",   "Y",   "Y",  "\x19",/***/
+            "u",             "U",             "U", /**/"u",   "U",   "U",  "\x15",/***/
+            "i",             "I",             "I", /**/"i",   "I",   "I",  "\x09",/***/
+            "o",             "O",             "O", /**/"o",   "O",   "O",  "\x0f",/***/
+            "p",             "P",             "P", /**/"p",   "P",   "P",  "\x10",/***/
+  "bracketleft",     "braceleft",   "bracketleft", /**/"[",   "{",   "[",  "\x1b",/***/
+ "bracketright",    "braceright",  "bracketright", /**/"]",   "}",   "]",  "\x1d",/***/
+       "Return",        "Return",        "Return", /**/"\015","\015","\015",  NULL,/***/
+    "Control_L",     "Control_L",     "Control_L", /**/"",    "",    "",  NULL,/***/
+            "a",             "A",             "A", /**/"a",   "A",   "A",  "\x01",/***/
+            "s",             "S",             "S", /**/"s",   "S",   "S",  "\x13",/***/
+            "d",             "D",             "D", /**/"d",   "D",   "D",  "\x04",/***/
+            "f",             "F",             "F", /**/"f",   "F",   "F",  "\x06",/***/
+            "g",             "G",             "G", /**/"g",   "G",   "G",  "\x07",/***/
+            "h",             "h",             "H", /**/"h",   "H",   "H",  "\x08",/***/
+            "j",             "J",             "J", /**/"j",   "J",   "J",  "\x0a",/***/
+            "k",             "K",             "K", /**/"k",   "K",   "K",  "\x0b",/***/
+            "l",             "L",             "L", /**/"l",   "L",   "L",  "\x0c",/***/
+    "semicolon",         "colon",     "semicolon", /**/";",   ":",   ";",  NULL,/***/
+   "apostrophe",      "quotedbl",    "apostrophe", /**/"'",   "\"",  "'",  NULL,/***/
+        "grave",    "asciitilde",         "grave", /**/"`",   "~",   "`",  "",/***/
+      "Shift_L",       "Shift_L",       "Shift_L", /**/"",    "",    "",  NULL,/***/
+    "backslash",           "bar",     "backslash", /**/"\\",  "|",   "\\",  "\x1c",/***/
+            "z",             "Z",             "Z", /**/"z",   "Z",   "Z",  "\x1a",/***/
+            "x",             "X",             "X", /**/"x",   "X",   "X",  "\x18",/***/
+            "c",             "C",             "C", /**/"c",   "C",   "C",  "\x03",/***/
+            "v",             "V",             "V", /**/"v",   "V",   "V",  "\x16",/***/
+            "b",             "B",             "B", /**/"b",   "B",   "B",  "\x02",/***/
+            "n",             "N",             "N", /**/"n",   "N",   "N",  "\x0e",/***/
+            "m",             "M",             "M", /**/"m",   "M",   "M",  "\x0d",/***/
+        "comma",          "less",         "comma", /**/",",   "<",   ",",  NULL,/***/
+       "period",       "greater",        "period", /**/".",   ">",   ".",  NULL,/***/
+        "slash",      "question",         "slash", /**/"/",   "?",   "/",  "",/***/
+      "Shift_R",       "Shift_R",       "Shift_R", /**/"",    "",    "",  NULL,/***/
+  "KP_Multiply",   "KP_Multiply",   "KP_Multiply", /**/"",    "*",   "",  NULL,/***/
+        "Alt_L",         "Alt_L",         "Alt_L", /**/"",    "",    "",  NULL,/***/
+        "space",         "space",         "space", /**/" ",   " ",   " ",  "",/***/
+    "Caps_Lock",     "Caps_Lock",     "Caps_Lock", /**/"",    "",    "",  NULL,/***/
+           "F1",            "F1",            "F1", /**/"",    "",    "",  NULL,/***/
+           "F2",            "F2",            "F2", /**/"",    "",    "",  NULL,/***/
+           "F3",            "F3",            "F3", /**/"",    "",    "",  NULL,/***/
+           "F4",            "F4",            "F4", /**/"",    "",    "",  NULL,/***/
+           "F5",            "F5",            "F5", /**/"",    "",    "",  NULL,/***/
+           "F6",            "F6",            "F6", /**/"",    "",    "",  NULL,/***/
+           "F7",            "F7",            "F7", /**/"",    "",    "",  NULL,/***/
+           "F8",            "F8",            "F8", /**/"",    "",    "",  NULL,/***/
+           "F9",            "F9",            "F9", /**/"",    "",    "",  NULL,/***/
+          "F10",           "F10",           "F10", /**/"",    "",    "",  NULL,/***/
+     "Num_Lock",      "Num_Lock",      "Num_Lock", /**/"",    "",    "",  NULL,/***/
+  "Scroll_Lock",   "Scroll_Lock",   "Scroll_Lock", /**/"",    "",    "",  NULL,/***/
+      "KP_Home",          "KP_7",       "KP_Home", /**/"",    "7",   "",  NULL,/***/
+        "KP_Up",          "KP_8",         "KP_Up", /**/"",    "8",   "",  NULL,/***/
+     "KP_Prior",          "KP_9",      "KP_Prior", /**/"",    "9",   "",  NULL,/***/
+  "KP_Subtract",   "KP_Subtract",   "KP_Subtract", /**/"",    "",    "",  NULL,/***/
+      "KP_Left",          "KP_4",       "KP_Left", /**/"",    "4",   "",  NULL,/***/
+     "KP_Begin",          "KP_5",      "KP_Begin", /**/"",    "5",   "",  NULL,/***/
+     "KP_Right",          "KP_6",      "KP_Right", /**/"",    "6",   "",  NULL,/***/
+       "KP_Add",        "KP_Add",        "KP_Add", /**/"",    "",    "",  NULL,/***/
+       "KP_End",          "KP_1",        "KP_End", /**/"",    "1",   "",  NULL,/***/
+      "KP_Down",          "KP_2",       "KP_Down", /**/"",    "2",   "",  NULL,/***/
+      "KP_Next",          "KP_3",       "KP_Next", /**/"",    "3",   "",  NULL,/***/
+    "KP_Insert",          "KP_0",     "KP_Insert", /**/"",    "0",   "",  NULL,/***/
+    "KP_Delete",    "KP_Decimal",     "KP_Delete", /**/"",    ".",   "",  NULL,/***/
+         "0x54",          "0x54",          "0x54", /**/"",    "",    "",  NULL,/***/
+         "0x55",          "0x55",          "0x55", /**/"",    "",    "",  NULL,/***/
+         "0x56",          "0x56",          "0x56", /**/"",    "",    "",  NULL,/***/
+          "F11",           "F11",           "F11", /**/"",    "",    "",  NULL,/***/
+          "F12",           "F12",           "F12", /**/"",    "",    "",  NULL,/***/
+         "0x59",          "0x59",          "0x59", /**/"",    "",    "",  NULL,/***/
+         "0x5a",          "0x5a",          "0x5a", /**/"",    "",    "",  NULL,/***/
+         "0x5b",          "0x5b",          "0x5b", /**/"",    "",    "",  NULL,/***/
+         "0x5c",          "0x5c",          "0x5c", /**/"",    "",    "",  NULL,/***/
+         "0x5d",          "0x5d",          "0x5d", /**/"",    "",    "",  NULL,/***/
+         "0x5e",          "0x5e",          "0x5e", /**/"",    "",    "",  NULL,/***/
+         "0x5f",          "0x5f",          "0x5f", /**/"",    "",    "",  NULL,/***/
+     "KP_Enter",      "KP_Enter",      "KP_Enter", /**/"\015", "\015", "\015",  NULL,/***/
+    "Control_R",     "Control_R",     "Control_R", /**/"",    "",    "",  NULL,/***/
+    "KP_Divide",     "KP_Divide",     "KP_Divide", /**/"",    "",    "",  NULL,/***/
+        "Print",         "Print",         "Print", /**/"",    "",    "",  NULL,/***/
+        "Alt_R",         "Alt_R",         "Alt_R", /**/"",    "",    "",  NULL,/***/
+         "0x65",          "0x65",          "0x65", /**/"",    "",    "",  NULL,/***/
+         "Home",          "Home",          "Home", /**/"",    "",    "",  NULL,/***/
+           "Up",            "Up",            "Up", /**/"",    "",    "",  NULL,/***/
+        "Prior",         "Prior",         "Prior", /**/"",    "",    "",  NULL,/***/
+         "Left",          "Left",          "Left", /**/"",    "",    "",  NULL,/***/
+        "Right",         "Right",         "Right", /**/"",    "",    "",  NULL,/***/
+          "End",           "End",           "End", /**/"",    "",    "",  NULL,/***/
+         "Down",          "Down",          "Down", /**/"",    "",    "",  NULL,/***/
+         "Next",          "Next",          "Next", /**/"",    "",    "",  NULL,/***/
+       "Insert",        "Insert",        "Insert", /**/"",    "",    "",  NULL,/***/
+       "Delete",        "Delete",        "Delete", /**/"\177","\177","\177",  NULL,/***/
+         "0x70",          "0x70",          "0x70", /**/"",    "",    "",  NULL,/***/
+         "0x71",          "0x71",          "0x71", /**/"",    "",    "",  NULL,/***/
+         "0x72",          "0x72",          "0x72", /**/"",    "",    "",  NULL,/***/
+         "0x73",          "0x73",          "0x73", /**/"",    "",    "",  NULL,/***/
+         "0x74",          "0x74",          "0x74", /**/"",    "",    "",  NULL,/***/
+         "0x75",          "0x75",          "0x75", /**/"",    "",    "",  NULL,/***/
+         "0x76",          "0x76",          "0x76", /**/"",    "",    "",  NULL,/***/
+        "Pause",         "Pause",         "Pause", /**/"",    "",    "",  NULL,/***/
+         "0x78",          "0x78",          "0x78", /**/"",    "",    "",  NULL,/***/
+         "0x79",          "0x79",          "0x79", /**/"",    "",    "",  NULL,/***/
+         "0x7a",          "0x7a",          "0x7a", /**/"",    "",    "",  NULL,/***/
+         "0x7b",          "0x7b",          "0x7b", /**/"",    "",    "",  NULL,/***/
+         "0x7c",          "0x7c",          "0x7c", /**/"",    "",    "",  NULL,/***/
+      "Super_L",       "Super_L",       "Super_L", /**/"",    "",    "",  NULL,/***/
+      "Super_R",       "Super_R",       "Super_R", /**/"",    "",    "",  NULL,/***/
+         "0x7f",          "0x7f",          "0x7f", /**/"",    "",    "",  NULL, /***/
index cc1d591..78a3e5b 100644 (file)
@@ -1,11 +1,17 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
 #include "Ecore_Fb.h"
 #include "ecore_fb_private.h"
 
 #define CLICK_THRESHOLD_DEFAULT 0.25
 
-static Ecore_List *_ecore_fb_li_devices = NULL;
+static Eina_List *_ecore_fb_li_devices = NULL;
 
-static const char *_ecore_fb_li_kbd_syms[128 * 6] =
+static const char *_ecore_fb_li_kbd_syms[128 * 7] =
 {
 #include "ecore_fb_keytable.h"
 };
@@ -18,503 +24,699 @@ static const char *_ecore_fb_li_kbd_syms[128 * 6] =
  * Moved to static inline in order to force compiler to otimized
  * the unsued part away or force a link error if long has an unexpected
  * size.
- *                                             - bigeasy
+ *                                                - bigeasy
  */
-extern int long_has_neither_32_not_64_bits(void);
-static inline int test_bit(int bit, unsigned long *array)
-{
-       if (sizeof(long) == 4)
-               return array[bit / 32] & (1 << (bit % 32));
-
-       else if (sizeof(long) == 8)
-               return array[bit / 64] & (1 << (bit % 64));
-
-       else long_has_neither_32_nor_64_bits();
-}
-
-static void 
-_ecore_fb_li_event_free_key_down(void *data, void *ev)
+extern int long_has_neither_32_nor_64_bits(void);
+static inline int
+test_bit(int bit, unsigned long *array)
 {
-
-       Ecore_Fb_Event_Key_Up *e;
-
-       e = ev;
-       free(e->keyname);
-       if (e->keysymbol) free(e->keysymbol);
-       if (e->key_compose) free(e->key_compose);
-       free(e);
-}
-
-static void 
-_ecore_fb_li_event_free_key_up(void *data, void *ev)
-{
-
-       Ecore_Fb_Event_Key_Up *e;
-
-       e = ev;
-       free(e->keyname);
-       if (e->keysymbol) free(e->keysymbol);
-       if (e->key_compose) free(e->key_compose);
-       free(e);
+   if (sizeof(long) == 4)
+      return array[bit / 32] & (1 << (bit % 32));
+   else if (sizeof(long) == 8)
+      return array[bit / 64] & (1 << (bit % 64));
+   else long_has_neither_32_nor_64_bits();
 }
 
 static void
 _ecore_fb_li_device_event_key(Ecore_Fb_Input_Device *dev, struct input_event *iev)
 {
-       if(!dev->listen)
-               return;
-
-       /* check for basic keyboard keys */
-       if(iev->code >= KEY_ESC && iev->code <= KEY_COMPOSE)
-       {
-               /* check the key table */
-               if(iev->value)
-               {
-                       int offset = 0;
-                       Ecore_Fb_Event_Key_Down *ev;
-
-                       ev = calloc(1, sizeof(Ecore_Fb_Event_Key_Down));
-                       if(dev->keyboard.shift) offset = 1;
-                       else if(dev->keyboard.lock) offset = 2;
-                       ev->keyname = strdup(_ecore_fb_li_kbd_syms[iev->code * 6]);
-
-                       ev->keysymbol = strdup(_ecore_fb_li_kbd_syms[(iev->code * 6) + offset]);
-                       ev->key_compose = strdup(_ecore_fb_li_kbd_syms[(iev->code * 6) + 3 + offset]);
-                       ev->dev = dev;
-                       ecore_event_add(ECORE_FB_EVENT_KEY_DOWN, ev, _ecore_fb_li_event_free_key_down, NULL);
-                       /* its a repeated key, dont increment */
-                       if(iev->value == 2)
-                               return;
-                       if (!strcmp(ev->keyname, "Control_L"))
-                               dev->keyboard.ctrl++;
-                       else if (!strcmp(ev->keyname, "Control_R"))
-                               dev->keyboard.ctrl++;
-                       else if (!strcmp(ev->keyname, "Alt_L"))
-                               dev->keyboard.alt++;
-                       else if (!strcmp(ev->keyname, "Alt_R"))
-                               dev->keyboard.alt++;
-                       else if (!strcmp(ev->keyname, "Shift_L"))
-                               dev->keyboard.shift++;
-                       else if (!strcmp(ev->keyname, "Shift_R"))
-                               dev->keyboard.shift++;
-                       else if (!strcmp(ev->keyname, "Caps_Lock"))
-                               dev->keyboard.lock++;
-                       if (dev->keyboard.ctrl > 2) dev->keyboard.ctrl = 2;
-                       if (dev->keyboard.alt > 2) dev->keyboard.alt = 2;
-                       if (dev->keyboard.shift > 2) dev->keyboard.shift = 2;
-                       if (dev->keyboard.lock > 1) dev->keyboard.lock = 1;
-               }
-               else
-               {
-                       int offset = 0;
-                       Ecore_Fb_Event_Key_Up *ev;
-
-                       ev = calloc(1, sizeof(Ecore_Fb_Event_Key_Up));
-                       if(dev->keyboard.shift) offset = 1;
-                       else if(dev->keyboard.lock) offset = 2;
-                       ev->keyname = strdup(_ecore_fb_li_kbd_syms[iev->code * 6]);
-
-                       ev->keysymbol = strdup(_ecore_fb_li_kbd_syms[(iev->code * 6) + offset]);
-                       ev->key_compose = strdup(_ecore_fb_li_kbd_syms[(iev->code * 6) + 3 + offset]);
-                       ev->dev = dev;
-                       ecore_event_add(ECORE_FB_EVENT_KEY_UP, ev, _ecore_fb_li_event_free_key_up, NULL);
-                       if (!strcmp(ev->keyname, "Control_L"))
-                               dev->keyboard.ctrl--;
-                       else if (!strcmp(ev->keyname, "Control_R"))
-                               dev->keyboard.ctrl--;
-                       else if (!strcmp(ev->keyname, "Alt_L"))
-                               dev->keyboard.alt--;
-                       else if (!strcmp(ev->keyname, "Alt_R"))
-                               dev->keyboard.alt--;
-                       else if (!strcmp(ev->keyname, "Shift_L"))
-                               dev->keyboard.shift--;
-                       else if (!strcmp(ev->keyname, "Shift_R"))
-                               dev->keyboard.shift--;
-                       else if (!strcmp(ev->keyname, "Caps_Lock"))
-                               dev->keyboard.lock--;
-                       if (dev->keyboard.ctrl < 0) dev->keyboard.ctrl = 0;
-                       if (dev->keyboard.alt < 0) dev->keyboard.alt = 0;
-                       if (dev->keyboard.shift < 0) dev->keyboard.shift = 0;
-                       if (dev->keyboard.lock < 0) dev->keyboard.lock = 0;
-               }
-       }
-       /* check for mouse button events */
-       else if(iev->code >= BTN_MOUSE && iev->code < BTN_JOYSTICK)
-       {
-               int button;
-
-               button = ((iev->code & 0x00F) + 1);
-               if(iev->value)
-               {
-                       Ecore_Fb_Event_Mouse_Button_Down *ev;
-                       double current;
-
-                       ev = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Button_Down));
-                       ev->dev = dev;
-                       ev->button = button;
-                       ev->x = dev->mouse.x;
-                       ev->y = dev->mouse.y;
-
-                       current = ecore_time_get();
-                       if((current - dev->mouse.prev) <= dev->mouse.threshold)
-                       {
-                               ev->double_click = 1;
-                       }
-                       if((current - dev->mouse.last) <= (2 * dev->mouse.threshold))
-                       {
-                               ev->triple_click = 1;
-                               /* reset */
-                               dev->mouse.prev = 0;
-                               dev->mouse.last = 0;
-                               current = 0;
-                       }
-                       else
-                       {
-                               /* update values */
-                               dev->mouse.last = dev->mouse.prev;
-                               dev->mouse.prev = current;
-                       }
-                       ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_DOWN, ev, NULL ,NULL);
-               }
-               else
-               {
-                       Ecore_Fb_Event_Mouse_Button_Up *ev;
-
-                       ev = calloc(1,sizeof(Ecore_Fb_Event_Mouse_Button_Up));
-                       ev->dev = dev;
-                       ev->button = button;
-                       ev->x = dev->mouse.x;
-                       ev->y = dev->mouse.y;
-
-                       ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_UP, ev, NULL ,NULL);
-               }
-       }
+   if (!dev->listen) return;
+
+   /* check for basic keyboard keys */
+   if ((iev->code >= KEY_ESC) && (iev->code <= KEY_COMPOSE))
+     {
+        int offset = 0;
+        const char *keyname = _ecore_fb_li_kbd_syms[iev->code * 7];
+        
+        /* check the key table */
+        if (iev->value)
+          {
+             /* its a repeated key, dont increment */
+             if (iev->value != 2)
+               {
+                  if (!strcmp(keyname, "Control_L"))
+                    dev->keyboard.ctrl++;
+                  else if (!strcmp(keyname, "Control_R"))
+                    dev->keyboard.ctrl++;
+                  else if (!strcmp(keyname, "Alt_L"))
+                    dev->keyboard.alt++;
+                  else if (!strcmp(keyname, "Alt_R"))
+                    dev->keyboard.alt++;
+                  else if (!strcmp(keyname, "Shift_L"))
+                    dev->keyboard.shift++;
+                  else if (!strcmp(keyname, "Shift_R"))
+                    dev->keyboard.shift++;
+                  else if (!strcmp(keyname, "Caps_Lock"))
+                    dev->keyboard.lock = !dev->keyboard.lock;
+                  if (dev->keyboard.ctrl > 2) dev->keyboard.ctrl = 2;
+                  if (dev->keyboard.alt > 2) dev->keyboard.alt = 2;
+                  if (dev->keyboard.shift > 2) dev->keyboard.shift = 2;
+                  if (dev->keyboard.lock > 1) dev->keyboard.lock = 1;
+               }
+          }
+        else
+          {
+             if (!strcmp(keyname, "Control_L"))
+                dev->keyboard.ctrl--;
+             else if (!strcmp(keyname, "Control_R"))
+                dev->keyboard.ctrl--;
+             else if (!strcmp(keyname, "Alt_L"))
+                dev->keyboard.alt--;
+             else if (!strcmp(keyname, "Alt_R"))
+                dev->keyboard.alt--;
+             else if (!strcmp(keyname, "Shift_L"))
+                dev->keyboard.shift--;
+             else if (!strcmp(keyname, "Shift_R"))
+                dev->keyboard.shift--;
+             if (dev->keyboard.ctrl < 0) dev->keyboard.ctrl = 0;
+             if (dev->keyboard.alt < 0) dev->keyboard.alt = 0;
+             if (dev->keyboard.shift < 0) dev->keyboard.shift = 0;
+             if (dev->keyboard.lock < 0) dev->keyboard.lock = 0;
+          }
+
+        /* sending ecore_input_evas events */
+        Ecore_Event_Key *e;
+
+        if (dev->keyboard.shift) offset = 1;
+        else if (dev->keyboard.lock) offset = 2;
+
+        const char *key = _ecore_fb_li_kbd_syms[(iev->code * 7) + offset];
+        const char *compose = _ecore_fb_li_kbd_syms[(iev->code * 7) + 3 + offset];
+        
+        if (dev->keyboard.ctrl)
+          {
+             const char *ts = _ecore_fb_li_kbd_syms[(iev->code * 7) + 3 + 3];
+             
+             if (ts) compose = ts;
+          }
+
+        e = calloc(1, sizeof(Ecore_Event_Key) + strlen(key) +
+                   strlen(keyname) + (compose ? strlen(compose) : 0) + 3);
+        e->keyname = (char *)(e + 1);
+        e->key = e->keyname + strlen(keyname) + 1;
+        e->compose = (compose) ? e->key + strlen(key) + 1 : NULL;
+        e->string = e->compose;
+
+        strcpy((char *)e->keyname, keyname);
+        strcpy((char *)e->key, key);
+        if (compose)
+          strcpy((char *)e->compose, compose);
+
+        e->modifiers = 0;
+        if (dev->keyboard.shift)
+          e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+        if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+        if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+        if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
+
+        e->timestamp = ecore_loop_time_get() * 1000.0;
+        e->window = (Ecore_Window)dev->window;
+        e->event_window = (Ecore_Window)dev->window;
+        e->root_window = (Ecore_Window)dev->window;
+        e->same_screen = 1;
+
+        if (iev->value)
+          ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
+        else
+          ecore_event_add(ECORE_EVENT_KEY_UP, e, NULL, NULL);
+     }
+   /* check for mouse button events */
+   else if ((iev->code >= BTN_MOUSE) && (iev->code < BTN_JOYSTICK))
+     {
+        int button;
+        Ecore_Event_Mouse_Button *e;
+        double current = ecore_loop_time_get();
+
+        button = ((iev->code & 0x00F) + 1);
+        // swap 2 and 3 to make middle and right butotn work right.
+        if (button == 3) button = 2;
+        else if (button == 2) button = 3;
+        if (iev->value)
+          {
+             dev->mouse.did_double = EINA_FALSE;
+             dev->mouse.did_triple = EINA_FALSE;
+
+             if (((current - dev->mouse.prev) <= dev->mouse.threshold) &&
+                 (button == dev->mouse.prev_button))
+               {
+                  dev->mouse.did_double = EINA_TRUE;
+                  if (((current - dev->mouse.last) <= (2 * dev->mouse.threshold)) &&
+                      (button == dev->mouse.last_button))
+                    {
+                       dev->mouse.did_triple = EINA_TRUE;
+                       /* reset */
+                       dev->mouse.prev = 0;
+                       dev->mouse.last = 0;
+                       current = 0;
+                    }
+               }
+             dev->mouse.last = dev->mouse.prev;
+             dev->mouse.prev = current;
+             dev->mouse.last_button = dev->mouse.prev_button;
+             dev->mouse.prev_button = button;
+          }
+
+        e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+        if (!e)
+          return;
+
+        e->timestamp = current * 1000.0;
+        e->window = (Ecore_Window)dev->window;
+        e->event_window = (Ecore_Window)dev->window;
+        e->root_window = (Ecore_Window)dev->window;
+        e->same_screen = 1;
+
+        e->modifiers = 0;
+        if (dev->keyboard.shift)
+          e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+        if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+        if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+        if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
+
+        e->x = dev->mouse.x;
+        e->y = dev->mouse.y;
+        e->root.x = e->x;
+        e->root.y = e->y;
+        e->buttons = button;
+
+        if (dev->mouse.did_double)
+          e->double_click = 1;
+        if (dev->mouse.did_triple)
+          e->triple_click = 1;
+
+        if (iev->value)
+          ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
+        else
+          ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
+     }
 }
 
 static void
 _ecore_fb_li_device_event_rel(Ecore_Fb_Input_Device *dev, struct input_event *iev)
 {
-       if(!dev->listen)
-               return;
-       /* dispatch the button events if they are queued */
-       switch(iev->code)
-       {
-               case REL_X:
-               case REL_Y:
-               {
-                       Ecore_Fb_Event_Mouse_Move *ev;
-                       if(iev->code == REL_X)
-                       {
-                               dev->mouse.x += iev->value;
-                               if(dev->mouse.x > dev->mouse.w - 1)
-                                       dev->mouse.x = dev->mouse.w;
-                               else if(dev->mouse.x < 0)
-                                       dev->mouse.x = 0;
-                       }
-                       else
-                       {
-                               dev->mouse.y += iev->value;
-                               if(dev->mouse.y > dev->mouse.h - 1)
-                                       dev->mouse.y = dev->mouse.h;
-                               else if(dev->mouse.y < 0)
-                                       dev->mouse.y = 0;
-                       }
-                       ev = calloc(1,sizeof(Ecore_Fb_Event_Mouse_Move));
-                       ev->x = dev->mouse.x;
-                       ev->y = dev->mouse.y;
-                       ev->dev = dev;
-
-                       ecore_event_add(ECORE_FB_EVENT_MOUSE_MOVE,ev,NULL,NULL);
-                       break;
-               }
-               case REL_WHEEL:
-               case REL_HWHEEL:
-               {
-                       Ecore_Fb_Event_Mouse_Wheel *ev;
-                       ev = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Wheel));
-
-                       ev->x = dev->mouse.x;
-                       ev->y = dev->mouse.y;
-                       if(iev->code == REL_HWHEEL)
-                               ev->direction = 1;
-                       ev->wheel = iev->value;
-                       ev->dev = dev;
-                       ecore_event_add(ECORE_FB_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
-                       break;
-               }
-               default:
-                       break;
-       }
+   if (!dev->listen) return;
+   /* dispatch the button events if they are queued */
+   switch (iev->code)
+     {
+     case REL_X:
+     case REL_Y:
+          {
+             Ecore_Event_Mouse_Move *e;
+             if (iev->code == REL_X)
+               {
+                  dev->mouse.x += iev->value;
+                  if (dev->mouse.x > dev->mouse.w - 1)
+                    dev->mouse.x = dev->mouse.w;
+                  else if(dev->mouse.x < 0)
+                    dev->mouse.x = 0;
+               }
+             else
+               {
+                  dev->mouse.y += iev->value;
+                  if (dev->mouse.y > dev->mouse.h - 1)
+                    dev->mouse.y = dev->mouse.h;
+                  else if(dev->mouse.y < 0)
+                    dev->mouse.y = 0;
+               }
+
+             e = calloc(1, sizeof(Ecore_Event_Mouse_Move));
+             if (!e)
+               return;
+
+             e->window = (Ecore_Window)dev->window;
+             e->event_window = (Ecore_Window)dev->window;
+             e->root_window = (Ecore_Window)dev->window;
+             e->same_screen = 1;
+
+             e->modifiers = 0;
+             if (dev->keyboard.shift) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+             if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+             if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+             if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
+
+             e->x = dev->mouse.x;
+             e->y = dev->mouse.y;
+             e->root.x = e->x;
+             e->root.y = e->y;
+
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+
+             ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
+
+             break;
+          }
+     case REL_WHEEL:
+     case REL_HWHEEL:
+          {
+             Ecore_Event_Mouse_Wheel *e;
+
+             e = calloc(1, sizeof(Ecore_Event_Mouse_Wheel));
+             if (!e)
+               return;
+
+             e->x = dev->mouse.x;
+             e->y = dev->mouse.y;
+             if (iev->code == REL_HWHEEL) e->direction = 1;
+             e->z = iev->value;
+             e->root.x = dev->mouse.x;
+             e->root.y = dev->mouse.y;
+
+             e->window = (Ecore_Window)dev->window;
+             e->event_window = (Ecore_Window)dev->window;
+             e->root_window = (Ecore_Window)dev->window;
+             e->same_screen = 1;
+
+             e->modifiers = 0;
+             if (dev->keyboard.shift) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+             if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+             if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+             if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
+
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+
+             ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
+
+             break;
+          }
+     default:
+        break;
+     }
 }
 
 static void
 _ecore_fb_li_device_event_abs(Ecore_Fb_Input_Device *dev, struct input_event *iev)
 {
-       if(!dev->listen)
-               return;
-       switch(iev->code)
-       {
-               case ABS_X:
-               case ABS_Y:
-               {
-                       Ecore_Fb_Event_Mouse_Move *ev;
-                       if((iev->code == ABS_X) && (dev->mouse.w != 0))
-                       {
-                               int tmp;
-
-                               tmp = (int)((double)(iev->value - dev->mouse.min_w) / dev->mouse.rel_w);
-                               if(tmp < 0)
-                                       dev->mouse.x = 0;
-                               else if(tmp > dev->mouse.w)
-                                       dev->mouse.x = dev->mouse.w;
-                               else
-                                       dev->mouse.x = tmp;
-                       }
-                       else if((iev->code == ABS_Y) && (dev->mouse.h != 0))
-                       {
-                               int tmp;
-
-                               tmp = (int)((double)(iev->value - dev->mouse.min_h) / dev->mouse.rel_h);
-                               if(tmp < 0)
-                                       dev->mouse.y = 0;
-                               else if(tmp > dev->mouse.h)
-                                       dev->mouse.y = dev->mouse.h;
-                               else
-                                       dev->mouse.y = tmp;
-                       }
-                       ev = calloc(1,sizeof(Ecore_Fb_Event_Mouse_Move));
-                       ev->x = dev->mouse.x;
-                       ev->y = dev->mouse.y;
-                       ev->dev = dev;
-
-                       ecore_event_add(ECORE_FB_EVENT_MOUSE_MOVE, ev, NULL, NULL);
-                       break;
-               }
-               case ABS_PRESSURE:
-                       /* TODO emulate a button press */
-                       break;
-       }
+   static int prev_pressure = 0;
+   int pressure;
+
+   if (!dev->listen) return;
+   switch (iev->code)
+     {
+     case ABS_X:
+        if (dev->mouse.w != 0)
+          {
+             int tmp;
+
+             tmp = (int)((double)(iev->value - dev->mouse.min_w) / dev->mouse.rel_w);
+             if (tmp < 0) dev->mouse.x = 0;
+             else if (tmp > dev->mouse.w) dev->mouse.x = dev->mouse.w;
+             else dev->mouse.x = tmp;
+             dev->mouse.event = ECORE_EVENT_MOUSE_MOVE;
+          }
+        break;
+
+     case ABS_Y:
+        if (dev->mouse.h != 0)
+          {
+             int tmp;
+
+             tmp = (int)((double)(iev->value - dev->mouse.min_h) / dev->mouse.rel_h);
+             if (tmp < 0) dev->mouse.y = 0;
+             else if (tmp > dev->mouse.h) dev->mouse.y = dev->mouse.h;
+             else dev->mouse.y = tmp;
+             dev->mouse.event = ECORE_EVENT_MOUSE_MOVE;
+          }
+        break;
+
+     case ABS_PRESSURE:
+        pressure = iev->value;
+        if ((pressure) && (!prev_pressure))
+          {
+             /* DOWN: mouse is down, but was not before */
+             dev->mouse.event = ECORE_EVENT_MOUSE_BUTTON_DOWN;
+          }
+        else if ((!pressure) && (prev_pressure))
+          {
+             /* UP: mouse was down, but is not now */
+             dev->mouse.event = ECORE_EVENT_MOUSE_BUTTON_UP;
+          }
+        prev_pressure = pressure;
+        break;
+     }
+}
+
+static void
+_ecore_fb_li_device_event_syn(Ecore_Fb_Input_Device *dev, struct input_event *iev __UNUSED__)
+{
+   if (!dev->listen) return;
+
+   if (dev->mouse.event == ECORE_EVENT_MOUSE_MOVE)
+     {
+        Ecore_Event_Mouse_Move *ev;
+        ev = calloc(1,sizeof(Ecore_Event_Mouse_Move));
+        ev->x = dev->mouse.x;
+        ev->y = dev->mouse.y;
+        ev->root.x = ev->x;
+        ev->root.y = ev->y;
+        ev->timestamp = ecore_loop_time_get() * 1000.0;
+        ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
+     }
+   else if (dev->mouse.event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
+     {
+        Ecore_Event_Mouse_Button *ev;
+        ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+        ev->x = dev->mouse.x;
+        ev->y = dev->mouse.y;
+        ev->root.x = ev->x;
+        ev->root.y = ev->y;
+        ev->buttons = 1;
+        ev->timestamp = ecore_loop_time_get() * 1000.0;
+        ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
+     }
+   else if (dev->mouse.event == ECORE_EVENT_MOUSE_BUTTON_UP)
+     {
+        Ecore_Event_Mouse_Button *ev;
+        ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+        ev->x = dev->mouse.x;
+        ev->y = dev->mouse.y;
+        ev->root.x = ev->x;
+        ev->root.y = ev->y;
+        ev->buttons = 1;
+        ev->timestamp = ecore_loop_time_get() * 1000.0;
+        ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
+     }
 }
 
-static int
-_ecore_fb_li_device_fd_callback(void *data, Ecore_Fd_Handler *fdh)
+static Eina_Bool
+_ecore_fb_li_device_fd_callback(void *data, Ecore_Fd_Handler *fdh __UNUSED__)
 {
-       Ecore_Fb_Input_Device *dev;
-       struct input_event ev[64];
-       int len;
-       int i;
-
-       dev = (Ecore_Fb_Input_Device*)data;
-       /* read up to 64 events at once */
-       len = read(dev->fd, &ev, sizeof(ev));
-       // printf("[ecore_fb_li_device:fd_callback] received %d data\n", len);
-       for(i = 0; i < len/sizeof(ev[0]); i++)
-       {
-               switch(ev[i].type)
-               {
-                       case EV_ABS:
-                               _ecore_fb_li_device_event_abs(dev, &ev[i]);
-                               break;
-                       case EV_REL:
-                               _ecore_fb_li_device_event_rel(dev, &ev[i]);
-                               break;
-                       case EV_KEY:
-                               _ecore_fb_li_device_event_key(dev, &ev[i]);
-                               break;
-                       default:
-                               break;
-               }
-       }
-       return 1;
+   Ecore_Fb_Input_Device *dev;
+   struct input_event ev[64];
+   int len;
+   int i;
+
+   dev = (Ecore_Fb_Input_Device*)data;
+   /* read up to 64 events at once */
+   len = read(dev->fd, &ev, sizeof(ev));
+   for(i = 0; i < (int)(len / sizeof(ev[0])); i++)
+     {
+        switch(ev[i].type)
+          {
+          case EV_SYN:
+             _ecore_fb_li_device_event_syn(dev, &ev[i]);
+             break;
+          case EV_ABS:
+             _ecore_fb_li_device_event_abs(dev, &ev[i]);
+             break;
+          case EV_REL:
+             _ecore_fb_li_device_event_rel(dev, &ev[i]);
+             break;
+          case EV_KEY:
+             _ecore_fb_li_device_event_key(dev, &ev[i]);
+             break;
+          default:
+             break;
+          }
+     }
+   return EINA_TRUE;
 }
 
-/* 
- * Starts getting events from the input device 
+/**
+ * @addtogroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
+ *
+ * @{
+ */
+
+/**
+ * @brief Set the listen mode for an input device .
  *
+ * @param dev The device to set the mode of.
+ * @param listen @c EINA_FALSE to disable listening mode, @c EINA_TRUE to
+ * enable it.
+ *
+ * This function enables or disables listening on the input device @p dev.
+ * If @p listen is @c EINA_FALSE, listening mode is disabled, if it is
+ * @c EINA_TRUE, it is enabled.
  */
-EAPI void 
-ecore_fb_input_device_listen(Ecore_Fb_Input_Device *dev, int listen)
+EAPI void
+ecore_fb_input_device_listen(Ecore_Fb_Input_Device *dev, Eina_Bool listen)
 {
-       if(!dev) return;
-       if((listen && dev->listen) || (!listen && !dev->listen)) return;
-       if(listen)
-       {
-               /* if the device already had a handler */
-               if(!dev->handler)
-                       dev->handler = ecore_main_fd_handler_add(dev->fd, ECORE_FD_READ, _ecore_fb_li_device_fd_callback, dev, NULL, NULL);
-
-       }
-       dev->listen = listen;
+   if (!dev) return;
+   if ((listen && dev->listen) || (!listen && !dev->listen)) return;
+   if (listen)
+     {
+        /* if the device already had a handler */
+        if (!dev->handler)
+           dev->handler = ecore_main_fd_handler_add(dev->fd, ECORE_FD_READ, _ecore_fb_li_device_fd_callback, dev, NULL, NULL);
+
+     }
+   dev->listen = listen;
 }
 
 #ifndef EV_CNT
-#define EV_CNT (EV_MAX+1)
+# define EV_CNT (EV_MAX+1)
 #endif
 
-/*
- * Opens an input device
+/**
+ * @brief Associates an input device with the given @ref Ecore_Evas_Group.
+ *
+ * @param dev The input being associated with an @ref Ecore_Evas_Group (not @c NULL).
+ * @param window The window which this input is being associated to.
+ * @c NULL will remove any previous association.
+ *
+ * Events generated by this device will have a pointer to @p window. If this @p
+ * window is registered with ecore_event_window_register() or
+ * ecore_evas_input_event_register(), respective evas events will be delivered
+ * by the ecore_input_evas system. An example can be seen in the following code:
+ *
+ * @code
+ * Ecore_Evas *ee = ecore_evas_new(NULL, 0, 0, 800, 600, NULL);
+ *
+ * ecore_evas_input_event_register(ee);
+ *
+ * device = ecore_fb_input_device_open(device_path);
+ * if (device)
+ *   ecore_fb_input_device_window_set(device, ee);
+ *
+ * @endcode
+ *
+ * On the previous code, all input captured on the mentioned device will be
+ * delivered to the @c Ecore_Evas @c ee.
+ *
+ * @since 1.1
+ */
+EAPI void
+ecore_fb_input_device_window_set(Ecore_Fb_Input_Device *dev, void *window)
+{
+   if (!dev) return;
+
+   dev->window = window;
+}
+
+/**
+ * @brief Open an input device.
+ *
+ * @param dev The device to open.
+ * @return The @ref Ecore_Fb_Input_Device object that has been opened.
+ *
+ * This function opens the input device named @p dev and returns the
+ * object for it, or returns @c NULL on failure.
  */
 EAPI Ecore_Fb_Input_Device *
 ecore_fb_input_device_open(const char *dev)
 {
-       Ecore_Fb_Input_Device *device;
-       unsigned long event_type_bitmask[EV_CNT / 32 + 1];
-       int event_type;
-       int fd;
-
-       if(!dev) return NULL;
-       device = calloc(1, sizeof(Ecore_Fb_Input_Device));
-       if(!device) return NULL;
-
-       if(!_ecore_fb_li_devices)
-               _ecore_fb_li_devices = ecore_list_new();
-
-       if((fd = open(dev, O_RDONLY, O_NONBLOCK)) < 0)
-       {
-               fprintf(stderr, "[ecore_fb_li:device_open] %s %s", dev, strerror(errno));
-               goto error_open;
-       }
-       /* query capabilities */
-       if(ioctl(fd, EVIOCGBIT(0, EV_MAX), event_type_bitmask) < 0)
-       {
-               fprintf(stderr,"[ecore_fb_li:device_open] query capabilities %s %s", dev, strerror(errno));
-               goto error_caps;
-       }
-       /* query name */
-       device->info.name = calloc(256, sizeof(char));
-       if(ioctl(fd, EVIOCGNAME(sizeof(char) * 256), device->info.name) < 0)
-       {
-               fprintf(stderr, "[ecore_fb_li:device_open] get name %s %s", dev, strerror(errno));
-               strcpy(device->info.name, "Unknown");
-       }
-       device->fd = fd;
-       device->info.dev = strdup(dev);
-       /* common */
-       device->mouse.threshold = CLICK_THRESHOLD_DEFAULT;
-
-       /* set info */
-       for(event_type = 0; event_type < EV_MAX; event_type++)
-       {
-               if(!test_bit(event_type, event_type_bitmask))
-                       continue;
-               switch(event_type)
-               {
-                       case EV_SYN :
-                       break;
-
-                       case EV_KEY:
-                       device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS;
-                       break;
-
-                       case EV_REL:
-                       device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_RELATIVE;
-                       break;
-
-                       case EV_ABS:
-                       device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE;
-                       break;
-
-                       case EV_MSC:
-                       case EV_LED:
-                       case EV_SND:
-                       case EV_REP:
-                       case EV_FF :
-                       case EV_FF_STATUS:
-                       case EV_PWR:
-                       default:
-                       break;
-               }
-       }
-       ecore_list_append(_ecore_fb_li_devices, device);
-       return device;
-
-       error_caps:
-       close(fd);
-       error_open:
-       free(device);
-       return NULL;
-
+   Ecore_Fb_Input_Device *device;
+   unsigned long event_type_bitmask[EV_CNT / 32 + 1];
+   int event_type;
+   int fd;
+
+   if (!dev) return NULL;
+   device = calloc(1, sizeof(Ecore_Fb_Input_Device));
+   if (!device) return NULL;
+
+   if ((fd = open(dev, O_RDONLY, O_NONBLOCK)) < 0)
+     {
+        fprintf(stderr, "[ecore_fb_li:device_open] %s %s", dev, strerror(errno));
+        goto error_open;
+     }
+   /* query capabilities */
+   if (ioctl(fd, EVIOCGBIT(0, EV_MAX), event_type_bitmask) < 0)
+     {
+        fprintf(stderr,"[ecore_fb_li:device_open] query capabilities %s %s", dev, strerror(errno));
+        goto error_caps;
+     }
+   /* query name */
+   device->info.name = calloc(256, sizeof(char));
+   if (ioctl(fd, EVIOCGNAME(sizeof(char) * 256), device->info.name) < 0)
+     {
+        fprintf(stderr, "[ecore_fb_li:device_open] get name %s %s", dev, strerror(errno));
+        strcpy(device->info.name, "Unknown");
+     }
+   device->fd = fd;
+   device->info.dev = strdup(dev);
+   /* common */
+   device->mouse.threshold = CLICK_THRESHOLD_DEFAULT;
+
+   /* set info */
+   for (event_type = 0; event_type < EV_MAX; event_type++)
+     {
+        if (!test_bit(event_type, event_type_bitmask))
+          continue;
+        switch (event_type)
+          {
+          case EV_SYN:
+             break;
+          case EV_KEY:
+             device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS;
+             break;
+          case EV_REL:
+             device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_RELATIVE;
+             break;
+          case EV_ABS:
+             device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE;
+             break;
+          case EV_MSC:
+          case EV_LED:
+          case EV_SND:
+          case EV_REP:
+          case EV_FF :
+          case EV_FF_STATUS:
+          case EV_PWR:
+          default:
+                break;
+          }
+     }
+
+   _ecore_fb_li_devices = eina_list_append(_ecore_fb_li_devices, device);
+   return device;
+
+error_caps:
+   close(fd);
+error_open:
+   free(device);
+   return NULL;
 }
 
+/**
+ * @brief Close the given device.
+ *
+ * @param dev The device to close
+ *
+ * This function closes the device @p dev. If @p dev is @c NULL, this
+ * function does nothing.
+ */
 EAPI void
 ecore_fb_input_device_close(Ecore_Fb_Input_Device *dev)
 {
-       /* close the fd */
-       close(dev->fd);
-       /* remove the element from the list */
-       if(ecore_list_goto(_ecore_fb_li_devices, dev))
-               ecore_list_remove(_ecore_fb_li_devices);
-       free(dev);
+   if (!dev || dev->fd < 0) return;
+   /* close the fd */
+   close(dev->fd);
+   /* remove the element from the list */
+   _ecore_fb_li_devices = eina_list_remove(_ecore_fb_li_devices, dev);
+   free(dev);
 }
 
 
-/*
- * If the device is a relative input device, 
- * we must set a width and height for it. If its
- * absolute set the ioctl correctly, if not, unsupported
- * device
+/**
+ * @brief Set the axis size of the given device.
+ *
+ * @param dev The device to set the axis size to.
+ * @param w The width of the axis.
+ * @param h The height of the axis.
+ *
+ * This function sets set the width @p w and height @p h of the axis
+ * of device @p dev. If @p dev is a relative input device, a width and
+ * height must set for it. If its absolute set the ioctl correctly, if
+ * not, unsupported device.
  */
 EAPI void
 ecore_fb_input_device_axis_size_set(Ecore_Fb_Input_Device *dev, int w, int h)
 {
-       if(!dev)
-               return;
-       if(w < 0 || h < 0)
-               return;
-       /* FIXME 
-        * this code is for a touchscreen device, 
-        * make it configurable (ABSOLUTE | RELATIVE)
-        */
-       if(dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE)
-       {
-               /* FIXME looks like some kernels dont include this struct */
-               struct input_absinfo abs_features;
-
-               ioctl(dev->fd, EVIOCGABS(ABS_X), &abs_features);
-               dev->mouse.min_w = abs_features.minimum;
-               dev->mouse.rel_w = (double)(abs_features.maximum - abs_features.minimum)/(double)(w);
-
-               ioctl(dev->fd, EVIOCGABS(ABS_Y), &abs_features);
-               dev->mouse.min_h = abs_features.minimum;
-               dev->mouse.rel_h = (double)(abs_features.maximum - abs_features.minimum)/(double)(h);
-       }
-       else if(!(dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE))
-               return;
-
-       /* update the local values */
-       if(dev->mouse.x > w - 1)
-               dev->mouse.x = w -1;
-       if(dev->mouse.y > h - 1)
-               dev->mouse.y = h -1;
-       dev->mouse.w = w;
-       dev->mouse.h = h;
+   if (!dev) return;
+   if ((w < 0) || (h < 0)) return;
+   /* FIXME
+    * this code is for a touchscreen device,
+    * make it configurable (ABSOLUTE | RELATIVE)
+    */
+   if (dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE)
+     {
+        /* FIXME looks like some kernels dont include this struct */
+        struct input_absinfo abs_features;
+
+        ioctl(dev->fd, EVIOCGABS(ABS_X), &abs_features);
+        dev->mouse.min_w = abs_features.minimum;
+        dev->mouse.rel_w = (double)(abs_features.maximum - abs_features.minimum)/(double)(w);
+
+        ioctl(dev->fd, EVIOCGABS(ABS_Y), &abs_features);
+        dev->mouse.min_h = abs_features.minimum;
+        dev->mouse.rel_h = (double)(abs_features.maximum - abs_features.minimum)/(double)(h);
+     }
+   else if (!(dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE))
+      return;
+
+   /* update the local values */
+   if (dev->mouse.x > w - 1) dev->mouse.x = w -1;
+   if (dev->mouse.y > h - 1) dev->mouse.y = h -1;
+   dev->mouse.w = w;
+   dev->mouse.h = h;
 }
 
-
+/**
+ * @brief Retrieve the name of the given device.
+ *
+ * @param dev The device to get the name from.
+ * @return The name of the device.
+ *
+ * This function returns the name of the device @p dev. If @p dev is
+ * @c NULL, this function returns @c NULL.
+ */
 EAPI const char *
 ecore_fb_input_device_name_get(Ecore_Fb_Input_Device *dev)
 {
-       if(!dev)
-               return NULL;
-       return dev->info.name;
+   if (!dev) return NULL;
+   return dev->info.name;
 }
+
+/**
+ * @brief Retrieve the capability of the given device.
+ *
+ * @param dev The device to get the name from.
+ * @return The capability of the device.
+ *
+ * This function returns the capability of the device @p dev. If @p dev is
+ * @c NULL, this function returns ECORE_FB_INPUT_DEVICE_CAP_NONE.
+ */
 EAPI Ecore_Fb_Input_Device_Cap
 ecore_fb_input_device_cap_get(Ecore_Fb_Input_Device *dev)
 {
-       if(!dev)
-               return ECORE_FB_INPUT_DEVICE_CAP_NONE;
-       return dev->info.cap;
+   if (!dev) return ECORE_FB_INPUT_DEVICE_CAP_NONE;
+   return dev->info.cap;
 }
+
+/**
+ * @brief Set the threshold of mouse clicks of the given device.
+ *
+ * @param dev The device to set the threshodl mouse click to.
+ * @param threshold The threshold value.
+ *
+ * This function sets the threshold of mouse clicks of the device
+ * @p dev to @p threshold. If @p dev is @c NULL, this function does
+ * nothing.
+ */
 EAPI void
 ecore_fb_input_device_threshold_click_set(Ecore_Fb_Input_Device *dev, double threshold)
 {
-       if(!dev) return;
-       if(threshold == dev->mouse.threshold || threshold == 0) return;
-       dev->mouse.threshold = threshold;
+   if (!dev) return;
+   if ((threshold == dev->mouse.threshold) || (threshold == 0)) return;
+   dev->mouse.threshold = threshold;
 }
+
+/**
+ * @brief Get the threshold of mouse clicks of the given device.
+ *
+ * @param dev The device to set the threshodl mouse click from.
+ * @return The threshold value.
+ *
+ * This function returns the threshold of mouse clicks of the device
+ * @p dev. If @p dev is @c NULL, this function returns 0.0.
+ */
 EAPI double
 ecore_fb_input_device_threshold_click_get(Ecore_Fb_Input_Device *dev)
 {
-       if(!dev) return 0;
-       return dev->mouse.threshold;
+   if (!dev) return 0;
+   return dev->mouse.threshold;
 }
+
+/**
+ * @}
+ */
index 2d09809..797f863 100644 (file)
@@ -1,11 +1,13 @@
 #ifndef _ECORE_FB_PRIVATE_H
 #define _ECORE_FB_PRIVATE_H
 
-#include "ecore_private.h"
 #include "Ecore.h"
-#include "Ecore_Data.h"
+#include "ecore_private.h"
+#include "Ecore_Input.h"
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <termios.h>
 #include <sys/types.h>
@@ -19,8 +21,8 @@
  #define kernel_ulong_t unsigned long 
  #define BITS_PER_LONG 32
  #include <linux/input.h>
- #undef kernel_ulong_t <-added
- #undef BITS_PER_LONG <-added
+ #undef kernel_ulong_t
+ #undef BITS_PER_LONG
 #else
  #include <linux/input.h>
 #endif
 #include <fcntl.h>
 #include <errno.h>
 
+#include <Ecore_Fb.h>
+
 /* ecore_fb_li.c */
 struct _Ecore_Fb_Input_Device
 {
-       int fd;
-       Ecore_Fd_Handler *handler;
-       int listen;
-       struct {
-               Ecore_Fb_Input_Device_Cap cap;
-               char *name;
-               char *dev;
-       } info;
-       struct
-       {
-               /* common mouse */
-               int x,y;
-               int w,h;
-               
-               double last;
-               double prev;
-               double threshold;
-               /* absolute axis */
-               int min_w, min_h;
-               double rel_w, rel_h;
-
-       } mouse;
-       struct
-       {
-               int shift;
-               int ctrl;
-               int alt;
-               int lock;
-       } keyboard;
+        int fd;
+        Ecore_Fd_Handler *handler;
+        int listen;
+        struct {
+                Ecore_Fb_Input_Device_Cap cap;
+                char *name;
+                char *dev;
+        } info;
+        struct
+        {
+                /* common mouse */
+                int x,y;
+                int w,h;
+                
+                double last;
+                double prev;
+                double threshold;
+                Eina_Bool did_double;
+                Eina_Bool did_triple;
+                /* absolute axis */
+                int min_w, min_h;
+                double rel_w, rel_h;
+                int event;
+                int prev_button;
+                int last_button;
+        } mouse;
+        struct
+        {
+                int shift;
+                int ctrl;
+                int alt;
+                int lock;
+        } keyboard;
+        void *window;
 };
 
 /* ecore_fb_ts.c */
 EAPI int    ecore_fb_ts_init(void);
 EAPI void   ecore_fb_ts_shutdown(void);
+EAPI void   ecore_fb_ts_events_window_set(void *window);
+EAPI void  *ecore_fb_ts_events_window_get(void);
+EAPI void   ecore_fb_ts_event_window_set(void *window);
 
 /* ecore_fb_vt.c */
 int  ecore_fb_vt_init(void);
index 3a062da..fdff3a8 100644 (file)
@@ -10,7 +10,7 @@ struct _Ecore_Fb_Ps2_Event
 static int _ecore_fb_ps2_event_byte_count = 0;
 static Ecore_Fb_Ps2_Event _ecore_fb_ps2_event;
 static int _ecore_fb_ps2_fd = 0;
-static int _ecore_fb_ps2_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_fb_ps2_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
 
 int
 ecore_fb_ps2_init(void)
@@ -18,19 +18,19 @@ ecore_fb_ps2_init(void)
    _ecore_fb_ps2_fd = open("/dev/psaux", O_RDWR);
    if (_ecore_fb_ps2_fd >= 0)
      {
-       prev_flags = fcntl(_ecore_fb_ps2_fd, F_GETFL);
-       fcntl(_ecore_fb_ps2_fd, F_SETFL, prev_flags | O_NONBLOCK);
-       _ecore_fb_ts_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_ps2_fd, 
-                                                                       ECORE_FD_READ,
-                                                                       _ecore_fb_ps2_fd_handler, NULL, NULL, NULL);
-       if (!_ecore_fb_ts_fd_handler_handle)
-        {
-          close(_ecore_fb_ps2_fd);
-          return 0;
-         }
-       return 1;
+        prev_flags = fcntl(_ecore_fb_ps2_fd, F_GETFL);
+        fcntl(_ecore_fb_ps2_fd, F_SETFL, prev_flags | O_NONBLOCK);
+        _ecore_fb_ts_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_ps2_fd,
+                                                                   ECORE_FD_READ,
+                                                                   _ecore_fb_ps2_fd_handler, NULL, NULL, NULL);
+        if (!_ecore_fb_ts_fd_handler_handle)
+          {
+             close(_ecore_fb_ps2_fd);
+             return 0;
+          }
+        return 1;
      }
-  return 0;   
+   return 0;
 }
 
 void
@@ -40,7 +40,7 @@ ecore_fb_ps2_shutdown(void)
    _ecore_fb_ps2_fd = 0;
 }
 
-static int
+static Eina_Bool
 _ecore_fb_ps2_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
    static int prev_x = 0, prev_y = 0, prev_button = 0;
@@ -50,101 +50,139 @@ _ecore_fb_ps2_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __U
 
    do
      {
-       int x, y, button, i;
-       int num;
-       char *ptr;
-       double t;
-       int did_triple = 0;
-       
-       ptr = (char *)&(_ecore_fb_ps2_event);
-       ptr += _ecore_fb_ps2_event_byte_count;
-       num = sizeof(Ecore_Fb_Ps2_Event) - _ecore_fb_ps2_event_byte_count;
-       v = read(_ecore_fb_ps2_fd, ptr, num);
-       if (v < 0) return 1;
-       _ecore_fb_ps2_event_byte_count += v;
-       if (v < num) return 1;
-       t = ecore_time_get();
-       _ecore_fb_ps2_event_byte_count = 0;
-       if (_ecore_fb_ps2_event.button & 0x10)
-         x = prev_x + (0xffffff00 | _ecore_fb_ps2_event.x);
-       else
-         x = prev_x + _ecore_fb_ps2_event.x;
-       if (_ecore_fb_ps2_event.button & 0x20)
-         y = prev_y - (0xffffff00 | _ecore_fb_ps2_event.y);
-       else
-         y = prev_y - _ecore_fb_ps2_event.y;
-       button = _ecore_fb_ps2_event.button & 0x7;
-       if (x < 0) x = 0;
-       if (y < 0) y = 0;
-       if (x >= _ecore_fb_console_w) x = _ecore_fb_console_w - 1;
-       if (y >= _ecore_fb_console_h) y = _ecore_fb_console_h - 1;
-       /* add event to queue */
-       /* always add a move event */
-       if (1)
-         {
-            /* MOVE: mouse is down and was */
-            Ecore_Fb_Event_Mouse_Move *e;
-            
-            e = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Move));
-            if (!e) goto retry;
-            e->x = x;
-            e->y = y;
-            ecore_event_add(ECORE_FB_EVENT_MOUSE_MOVE, e, NULL, NULL);
-         }
-       for (i = 1; i <= 3; i++)
-         {
-            int mask;
-            
-            mask = 1 << (i - 1);
-            if (((button & mask)) && (!(prev_button & mask)))
-              {
-                 /* DOWN: mouse is down, but was not now */
-                 Ecore_Fb_Event_Mouse_Button_Down *e;
-                 
-                 e = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Button_Down));
-                 if (!e) goto retry;
-                 e->x = x;
-                 e->y = y;
-                 e->button = 1;
-                 if ((t - last_time) <= _ecore_fb_double_click_time)
-                   e->double_click = 1;
-                 if ((t - last_last_time) <= (2 * _ecore_fb_double_click_time))
-                   {
-                      did_triple = 1;
-                      e->triple_click = 1;
-                   }
-                 ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
-              }
-            else if ((!(button & mask)) && ((prev_button & mask)))
-              {
-                 /* UP: mouse was down, but is not now */
-                 Ecore_Fb_Event_Mouse_Button_Up *e;
-                 
-                 e = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Button_Up));
-                 if (!e) goto retry;
-                 e->x = x;
-                 e->y = y;
-                 e->button = 1;
-                 ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
-              }
-         }
-       if (did_triple)
-         {
-            last_time = 0;
-            last_last_time = 0;
-         }
-       else
-         {
-            last_last_time = last_time;
-            last_time = t;
-         }
-       retry:       
-       prev_x = x;
-       prev_y = y;
-       prev_button = button;
+        int x, y, button, i;
+        int num;
+        char *ptr;
+        double t;
+        static int did_double = 0;
+        static int did_triple = 0;
+
+        ptr = (char *)&(_ecore_fb_ps2_event);
+        ptr += _ecore_fb_ps2_event_byte_count;
+        num = sizeof(Ecore_Fb_Ps2_Event) - _ecore_fb_ps2_event_byte_count;
+        v = read(_ecore_fb_ps2_fd, ptr, num);
+        if (v < 0) return EINA_TRUE;
+        _ecore_fb_ps2_event_byte_count += v;
+        if (v < num) return EINA_TRUE;
+        t = ecore_loop_time_get();
+        _ecore_fb_ps2_event_byte_count = 0;
+        if (_ecore_fb_ps2_event.button & 0x10)
+           x = prev_x + (0xffffff00 | _ecore_fb_ps2_event.x);
+        else
+           x = prev_x + _ecore_fb_ps2_event.x;
+        if (_ecore_fb_ps2_event.button & 0x20)
+           y = prev_y - (0xffffff00 | _ecore_fb_ps2_event.y);
+        else
+           y = prev_y - _ecore_fb_ps2_event.y;
+        button = _ecore_fb_ps2_event.button & 0x7;
+        if (x < 0) x = 0;
+        if (y < 0) y = 0;
+        if (x >= _ecore_fb_console_w) x = _ecore_fb_console_w - 1;
+        if (y >= _ecore_fb_console_h) y = _ecore_fb_console_h - 1;
+        /* add event to queue */
+        /* always add a move event */
+        if (1)
+          {
+             /* MOVE: mouse is down and was */
+             Ecore_Event_Mouse_Move *e;
+
+             e = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Move));
+             if (!e) goto retry;
+             e->x = x;
+             e->y = y;
+             e->root.x = e->x;
+             e->root.y = e->y;
+             e->window = 1;
+             e->event_window = e->window;
+             e->root_window = e->window;
+             e->same_screen = 1;
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+             ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
+          }
+        for (i = 1; i <= 3; i++)
+          {
+             int mask;
+
+             mask = 1 << (i - 1);
+             if (((button & mask)) && (!(prev_button & mask)))
+               {
+                  /* DOWN: mouse is down, but was not now */
+                  Ecore_Event_Mouse_Button *e;
+
+                  e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+                  if (!e) goto retry;
+                  e->x = x;
+                  e->y = y;
+                  e->root.x = e->x;
+                  e->root.y = e->y;
+                  e->button = i;
+                  e->window = 1;
+                  e->event_window = e->window;
+                  e->root_window = e->window;
+                  e->same_screen = 1;
+                  if ((t - last_time) <= _ecore_fb_double_click_time)
+                    {
+                       e->double_click = 1;
+                       did_double = 1;
+                    }
+                  else
+                    {
+                       did_double = 0;
+                       did_triple = 0;
+                    }
+                  if ((t - last_last_time) <= (2 * _ecore_fb_double_click_time))
+                    {
+                       did_triple = 1;
+                       e->triple_click = 1;
+                    }
+                  else
+                    {
+                       did_triple = 0;
+                    }
+                  e->timestamp = ecore_loop_time_get() * 1000.0;
+                  ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
+               }
+             else if ((!(button & mask)) && ((prev_button & mask)))
+               {
+                  /* UP: mouse was down, but is not now */
+                  Ecore_Event_Mouse_Button *e;
+
+                  e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+                  if (!e) goto retry;
+                  e->x = x;
+                  e->y = y;
+                  e->root.x = e->x;
+                  e->root.y = e->y;
+                  e->button = i;
+                  e->window = 1;
+                  e->event_window = e->window;
+                  e->root_window = e->window;
+                  e->same_screen = 1;
+                  if (did_double)
+                     e->double_click = 1;
+                  if (did_triple)
+                     e->triple_click = 1;
+                  e->timestamp = ecore_loop_time_get() * 1000.0;
+                  ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
+               }
+          }
+        if (did_triple)
+          {
+             last_time = 0;
+             last_last_time = 0;
+          }
+        else
+          {
+             last_last_time = last_time;
+             last_time = t;
+          }
+        retry:
+        prev_x = x;
+        prev_y = y;
+        prev_button = button;
      }
    while (v > 0);
-   return 1;
+   return EINA_TRUE;
 }
 /**
  * @defgroup Ecore_FB_Click_Group Framebuffer Double Click Functions
@@ -154,7 +192,7 @@ _ecore_fb_ps2_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __U
 
 /**
  * Sets the timeout for a double and triple clicks to be flagged.
- * 
+ *
  * This sets the time between clicks before the double_click flag is
  * set in a button down event. If 3 clicks occur within double this
  * time, the triple_click flag is also set.
index 5d4f589..a33bb36 100644 (file)
@@ -1,11 +1,15 @@
-#include "Ecore_Fb.h"
-#include "ecore_fb_private.h"
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #ifdef HAVE_TSLIB
-#include <tslib.h>
-#include <errno.h>
+# include <tslib.h>
+# include <errno.h>
 #endif
 
+#include "Ecore_Fb.h"
+#include "ecore_fb_private.h"
+
 typedef struct _Ecore_Fb_Ts_Event Ecore_Fb_Ts_Event;
 typedef struct _Ecore_Fb_Ts_Calibrate Ecore_Fb_Ts_Calibrate;
 typedef struct _Ecore_Fb_Ts_Backlight Ecore_Fb_Ts_Backlight;
@@ -18,7 +22,7 @@ struct _Ecore_Fb_Ts_Event
    unsigned short pressure;
    unsigned short x;
    unsigned short y;
-   unsigned short _unused; 
+   unsigned short _unused;
 };
 
 struct _Ecore_Fb_Ts_Calibrate
@@ -56,8 +60,8 @@ struct _Ecore_Fb_Ts_Flite
    unsigned char brightness;
 };
 
-static int _ecore_fb_ts_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_fb_ts_fd = 0;
+static Eina_Bool _ecore_fb_ts_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
+static int _ecore_fb_ts_fd = -1;
 static int _ecore_fb_ts_event_byte_count = 0;
 static int _ecore_fb_ts_apply_cal = 0;
 static Ecore_Fb_Ts_Event _ecore_fb_ts_event;
@@ -70,54 +74,52 @@ struct ts_sample _ecore_fb_tslib_event;
 #endif
 
 static double _ecore_fb_double_click_time = 0.25;
+static void *_ecore_fb_ts_event_window = NULL;
 
 EAPI int
 ecore_fb_ts_init(void)
 {
-   int prev_flags;
 #ifdef HAVE_TSLIB
    char *tslib_tsdevice = NULL;
-   if ( ( tslib_tsdevice = getenv("TSLIB_TSDEVICE") ) != NULL )
-    {
+   if ( (tslib_tsdevice = getenv("TSLIB_TSDEVICE")) )
+     {
         printf( "ECORE_FB: TSLIB_TSDEVICE = '%s'\n", tslib_tsdevice );
         _ecore_fb_tslib_tsdev = ts_open( tslib_tsdevice, 1 ); /* 1 = nonblocking, 0 = blocking */
 
         if ( !_ecore_fb_tslib_tsdev )
-        {
-            printf( "ECORE_FB: Can't ts_open (%s)\n", strerror( errno ) );
-            return 0;
-        }
+          {
+             printf( "ECORE_FB: Can't ts_open (%s)\n", strerror( errno ) );
+             return 0;
+          }
 
         if ( ts_config( _ecore_fb_tslib_tsdev ) )
-        {
-            printf( "ECORE_FB: Can't ts_config (%s)\n", strerror( errno ) );
-            return 0;
-        }
+          {
+             printf( "ECORE_FB: Can't ts_config (%s)\n", strerror( errno ) );
+             return 0;
+          }
         _ecore_fb_ts_fd = ts_fd( _ecore_fb_tslib_tsdev );
         if ( _ecore_fb_ts_fd < 0 )
-        {
-            printf( "ECORE_FB: Can't open touchscreen (%s)\n", strerror( errno ) );
-            return 0;
-        }
-    }
+          {
+             printf( "ECORE_FB: Can't open touchscreen (%s)\n", strerror( errno ) );
+             return 0;
+          }
+     }
 #else
    _ecore_fb_ts_fd = open("/dev/touchscreen/0", O_RDONLY);
 #endif
    if (_ecore_fb_ts_fd >= 0)
      {
-       prev_flags = fcntl(_ecore_fb_ts_fd, F_GETFL);
-       fcntl(_ecore_fb_ts_fd, F_SETFL, prev_flags | O_NONBLOCK);
-       _ecore_fb_ts_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_ts_fd, 
-                                                                  ECORE_FD_READ,
-                                                                  _ecore_fb_ts_fd_handler, NULL,
-                                                                  NULL, NULL);
-       if (!_ecore_fb_ts_fd_handler_handle)
-         {
-            close(_ecore_fb_ts_fd);
-            return 0;
-         }
-       // FIXME _ecore_fb_kbd_fd = open("/dev/touchscreen/key", O_RDONLY);
-       return 1;
+        _ecore_fb_ts_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_ts_fd,
+                                                                   ECORE_FD_READ,
+                                                                   _ecore_fb_ts_fd_handler, NULL,
+                                                                   NULL, NULL);
+        if (!_ecore_fb_ts_fd_handler_handle)
+          {
+             close(_ecore_fb_ts_fd);
+             return 0;
+          }
+        // FIXME _ecore_fb_kbd_fd = open("/dev/touchscreen/key", O_RDONLY);
+        return 1;
      }
    return 0;
 }
@@ -125,11 +127,24 @@ ecore_fb_ts_init(void)
 EAPI void
 ecore_fb_ts_shutdown(void)
 {
-   if (_ecore_fb_ts_fd >= 0) close(_ecore_fb_ts_fd);
    if (_ecore_fb_ts_fd_handler_handle)
-     ecore_main_fd_handler_del(_ecore_fb_ts_fd_handler_handle);
-   _ecore_fb_ts_fd = 0;
+      ecore_main_fd_handler_del(_ecore_fb_ts_fd_handler_handle);
+   if (_ecore_fb_ts_fd >= 0) close(_ecore_fb_ts_fd);
+   _ecore_fb_ts_fd = -1;
    _ecore_fb_ts_fd_handler_handle = NULL;
+   _ecore_fb_ts_event_window = NULL;
+}
+
+EAPI void
+ecore_fb_ts_event_window_set(void *window)
+{
+   _ecore_fb_ts_event_window = window;
+}
+
+EAPI void *
+ecore_fb_ts_event_window_get(void)
+{
+    return _ecore_fb_ts_event_window;
 }
 
 /**
@@ -137,8 +152,8 @@ ecore_fb_ts_shutdown(void)
  *
  * Functions that calibrate the screen.
  */
-  
-  
+
+
 /**
  * Calibrates the touschreen using the given parameters.
  * @param   xscale X scaling, where 256 = 1.0
@@ -152,7 +167,7 @@ EAPI void
 ecore_fb_touch_screen_calibrate_set(int xscale, int xtrans, int yscale, int ytrans, int xyswap)
 {
    Ecore_Fb_Ts_Calibrate cal;
-   
+
    if (_ecore_fb_ts_fd < 0) return;
    cal.xscale = xscale;
    cal.xtrans = xtrans;
@@ -161,9 +176,8 @@ ecore_fb_touch_screen_calibrate_set(int xscale, int xtrans, int yscale, int ytra
    cal.xyswap = xyswap;
    if (ioctl(_ecore_fb_ts_fd, TS_SET_CAL, (void *)&cal))
      {
-       _ecore_fb_ts_cal = cal;
-       _ecore_fb_ts_apply_cal = 1;
-       
+        _ecore_fb_ts_cal = cal;
+        _ecore_fb_ts_apply_cal = 1;
      }
 }
 
@@ -181,16 +195,15 @@ EAPI void
 ecore_fb_touch_screen_calibrate_get(int *xscale, int *xtrans, int *yscale, int *ytrans, int *xyswap)
 {
    Ecore_Fb_Ts_Calibrate cal;
-   
+
    if (_ecore_fb_ts_fd < 0) return;
    if (!_ecore_fb_ts_apply_cal)
      {
-       if (ioctl(_ecore_fb_ts_fd, TS_GET_CAL, (void *)&cal))
-         _ecore_fb_ts_cal = cal;
-       
+        if (ioctl(_ecore_fb_ts_fd, TS_GET_CAL, (void *)&cal))
+           _ecore_fb_ts_cal = cal;
      }
    else
-     cal = _ecore_fb_ts_cal;
+      cal = _ecore_fb_ts_cal;
    if (xscale) *xscale = cal.xscale;
    if (xtrans) *xtrans = cal.xtrans;
    if (yscale) *yscale = cal.yscale;
@@ -198,112 +211,150 @@ ecore_fb_touch_screen_calibrate_get(int *xscale, int *xtrans, int *yscale, int *
    if (xyswap) *xyswap = cal.xyswap;
 }
 
-static int
+static Eina_Bool
 _ecore_fb_ts_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
    static int prev_x = 0, prev_y = 0, prev_pressure = 0;
    static double last_time = 0;
    static double last_last_time = 0;
    int v = 0;
-   
+
    do
      {
-       int x, y, pressure;
-       int num;
-       char *ptr;
-       double t;
-       int did_triple = 0;
+        int x, y, pressure;
+        int num;
+        char *ptr;
+        double t = 0.0;
+        static int did_double = 0;
+        static int did_triple = 0;
 
 #ifdef HAVE_TSLIB
-       if (_ecore_fb_ts_apply_cal)
-         num = ts_read_raw(_ecore_fb_tslib_tsdev, &_ecore_fb_tslib_event, 1);
-       else
-         num = ts_read(_ecore_fb_tslib_tsdev, &_ecore_fb_tslib_event, 1);
-       if (num != 1) return 1; /* no more samples at this time */
-       x = _ecore_fb_tslib_event.x;
-       y = _ecore_fb_tslib_event.y;
-       pressure = _ecore_fb_tslib_event.pressure;
-       v = 1; /* loop, there might be more samples */
-       t = ecore_time_get();
+        if (_ecore_fb_ts_apply_cal)
+           num = ts_read_raw(_ecore_fb_tslib_tsdev, &_ecore_fb_tslib_event, 1);
+        else
+           num = ts_read(_ecore_fb_tslib_tsdev, &_ecore_fb_tslib_event, 1);
+        if (num != 1) return 1; /* no more samples at this time */
+        x = _ecore_fb_tslib_event.x;
+        y = _ecore_fb_tslib_event.y;
+        pressure = _ecore_fb_tslib_event.pressure;
+        v = 1; /* loop, there might be more samples */
 #else
-       ptr = (char *)&(_ecore_fb_ts_event);
-       ptr += _ecore_fb_ts_event_byte_count;
-       num = sizeof(Ecore_Fb_Ts_Event) - _ecore_fb_ts_event_byte_count;
-       v = read(_ecore_fb_ts_fd, ptr, num);
-       if (v < 0) return 1;
-       _ecore_fb_ts_event_byte_count += v;
-       if (v < num) return 1;
-       _ecore_fb_ts_event_byte_count = 0;
-       if (_ecore_fb_ts_apply_cal)
-         {
-            x = ((_ecore_fb_ts_cal.xscale * _ecore_fb_ts_event.x) >> 8) + _ecore_fb_ts_cal.xtrans;
-            y = ((_ecore_fb_ts_cal.yscale * _ecore_fb_ts_event.y) >> 8) + _ecore_fb_ts_cal.ytrans;
-         }
-       else
-         {
-            x = _ecore_fb_ts_event.x;
-            y = _ecore_fb_ts_event.y;
-         }
-       pressure = _ecore_fb_ts_event.pressure;
-#endif   
-       /* add event to queue */
-       /* always add a move event */
-       if ((pressure) || (prev_pressure))
-         {
-            /* MOVE: mouse is down and was */
-            Ecore_Fb_Event_Mouse_Move *e;
-            
-            e = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Move));
-            if (!e) goto retry;
-            e->x = x;
-            e->y = y;
-            ecore_event_add(ECORE_FB_EVENT_MOUSE_MOVE, e, NULL, NULL);
-         }
-       if ((pressure) && (!prev_pressure))
-         {
-            /* DOWN: mouse is down, but was not now */
-            Ecore_Fb_Event_Mouse_Button_Down *e;
-            
-            e = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Button_Down));
-            if (!e) goto retry;
-            e->x = x;
-            e->y = y;
-            e->button = 1;
-            if ((t - last_time) <= _ecore_fb_double_click_time)
-              e->double_click = 1;
-            if ((t - last_last_time) <= (2 * _ecore_fb_double_click_time))
-              {
-                 did_triple = 1;
-                 e->triple_click = 1;
-              }
-            ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
-         }
-       else if ((!pressure) && (prev_pressure))
-         {
-            /* UP: mouse was down, but is not now */
-            Ecore_Fb_Event_Mouse_Button_Up *e;
-            
-            e = calloc(1, sizeof(Ecore_Fb_Event_Mouse_Button_Up));
-            if (!e) goto retry;
-            e->x = prev_x;
-            e->y = prev_y;
-            e->button = 1;
-            ecore_event_add(ECORE_FB_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
-         }
+        ptr = (char *)&(_ecore_fb_ts_event);
+        ptr += _ecore_fb_ts_event_byte_count;
+        num = sizeof(Ecore_Fb_Ts_Event) - _ecore_fb_ts_event_byte_count;
+        v = read(_ecore_fb_ts_fd, ptr, num);
+        if (v < 0) return 1;
+        _ecore_fb_ts_event_byte_count += v;
+        if (v < num) return 1;
+        _ecore_fb_ts_event_byte_count = 0;
+        if (_ecore_fb_ts_apply_cal)
+          {
+             x = ((_ecore_fb_ts_cal.xscale * _ecore_fb_ts_event.x) >> 8) + _ecore_fb_ts_cal.xtrans;
+             y = ((_ecore_fb_ts_cal.yscale * _ecore_fb_ts_event.y) >> 8) + _ecore_fb_ts_cal.ytrans;
+          }
+        else
+          {
+             x = _ecore_fb_ts_event.x;
+             y = _ecore_fb_ts_event.y;
+          }
+        pressure = _ecore_fb_ts_event.pressure;
+#endif
+        t = ecore_loop_time_get();
+        /* add event to queue */
+        /* always add a move event */
+        if ((pressure) || (prev_pressure))
+          {
+             /* MOVE: mouse is down and was */
+             Ecore_Event_Mouse_Move *e;
+
+             e = calloc(1, sizeof(Ecore_Event_Mouse_Move));
+             if (!e) goto retry;
+             e->x = x;
+             e->y = y;
+             e->root.x = e->x;
+             e->root.y = e->y;
+             e->window = 1;
+             e->event_window = e->window;
+             e->root_window = e->window;
+             e->same_screen = 1;
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+             ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
+          }
+        if ((pressure) && (!prev_pressure))
+          {
+             /* DOWN: mouse is down, but was not now */
+             Ecore_Event_Mouse_Button *e;
+
+             e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+             if (!e) goto retry;
+             e->x = x;
+             e->y = y;
+             e->root.x = e->x;
+             e->root.y = e->y;
+             e->buttons = 1;
+             if ((t - last_time) <= _ecore_fb_double_click_time)
+               {
+                  e->double_click = 1;
+                  did_double = 1;
+               }
+             else
+               {
+                  did_double = 0;
+                  did_triple = 0;
+               }
+             if ((t - last_last_time) <= (2 * _ecore_fb_double_click_time))
+               {
+                  did_triple = 1;
+                  e->triple_click = 1;
+               }
+             else
+               {
+                  did_triple = 0;
+               }
+             e->window = 1;
+             e->event_window = e->window;
+             e->root_window = e->window;
+             e->same_screen = 1;
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+             ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
+          }
+        else if ((!pressure) && (prev_pressure))
+          {
+             /* UP: mouse was down, but is not now */
+             Ecore_Event_Mouse_Button *e;
+
+             e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
+             if (!e) goto retry;
+             e->x = prev_x;
+             e->y = prev_y;
+             e->root.x = e->x;
+             e->root.y = e->y;
+             e->buttons = 1;
+             if (did_double)
+                e->double_click = 1;
+             if (did_triple)
+                e->triple_click = 1;
+             e->window = 1;
+             e->event_window = e->window;
+             e->root_window = e->window;
+             e->same_screen = 1;
+             e->timestamp = ecore_loop_time_get() * 1000.0;
+             ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
+          }
         if (did_triple)
-         {
-            last_time = 0;
-            last_last_time = 0;
-         }
-       else
-         {
-            last_last_time = last_time;
-            last_time = t;
-         }
-       retry:       
-       prev_x = x;
-       prev_y = y;
-       prev_pressure = pressure;
+          {
+             last_time = 0;
+             last_last_time = 0;
+          }
+        else
+          {
+             last_last_time = last_time;
+             last_time = t;
+          }
+retry:
+        prev_x = x;
+        prev_y = y;
+        prev_pressure = pressure;
      }
    while (v > 0);
    return 1;
index 9831ef3..09e3f37 100644 (file)
@@ -1,17 +1,21 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include "Ecore_Fb.h"
 #include "ecore_fb_private.h"
 
 static int _ecore_fb_vt_do_switch = 0;
 
-static int _ecore_fb_vt_tty0_fd = 0;
-static int _ecore_fb_vt_tty_fd = 0;
+static int _ecore_fb_vt_tty0_fd = -1;
+static int _ecore_fb_vt_tty_fd = -1;
 static int _ecore_fb_vt_current_vt = 0;
 static int _ecore_fb_vt_prev_vt = 0;
 
 static struct termios _ecore_fb_tty_prev_tio_mode;
 static struct vt_mode _ecore_fb_vt_prev_mode;
 
-static int _ecore_fb_signal_usr_handler(void *data, int type, void *ev);
+static Eina_Bool _ecore_fb_signal_usr_handler(void *data, int type, void *ev);
 static Ecore_Event_Handler *_ecore_fb_user_handler = NULL;
 static int _ecore_fb_tty_prev_mode = 0;
 static int _ecore_fb_tty_prev_kd_mode = 0;
@@ -25,198 +29,216 @@ static void *_ecore_fb_func_fb_gain_data = NULL;
 /* FIXME what is the filter for? */
 static Ecore_Event_Filter *_ecore_fb_filter_handler = NULL;
 
-static void *_ecore_fb_event_filter_start(void *data);
-static int   _ecore_fb_event_filter_filter(void *data, void *loop_data, int type, void *event);
-static void  _ecore_fb_event_filter_end(void *data, void *loop_data);
-
 /* prototypes */
+/* XXX: unused
 static void _ecore_fb_vt_switch(int vt);
+static void *_ecore_fb_event_filter_start(void *data);
+static Eina_Bool _ecore_fb_event_filter_filter(void *data, void *loop_data, int type, void *event);
+static void _ecore_fb_event_filter_end(void *data, void *loop_data);
+*/
 
-static int
+static Eina_Bool
 _ecore_fb_signal_usr_handler(void *data __UNUSED__, int type __UNUSED__, void *ev)
 {
+   Ecore_Event_Signal_User *e;
 
-       Ecore_Event_Signal_User *e;
-   
-       e = (Ecore_Event_Signal_User *)ev;
-       if (e->number == 1)
-       {
-               /* release vt */
-               if (_ecore_fb_func_fb_lost) _ecore_fb_func_fb_lost(_ecore_fb_func_fb_lost_data);
-               /* TODO stop listening from the devices? let the callback do it? */
-               ioctl(_ecore_fb_vt_tty_fd, VT_RELDISP, 1);
-       }
-       else if (e->number == 2)
-       {
-               /* attach vt */
-               if (_ecore_fb_func_fb_gain) _ecore_fb_func_fb_gain(_ecore_fb_func_fb_gain_data);
-               /* TODO reattach all devices */
-       }
-       return 1;
+   e = (Ecore_Event_Signal_User *)ev;
+   if (e->number == 1)
+     {
+        /* release vt */
+        if (_ecore_fb_func_fb_lost) _ecore_fb_func_fb_lost(_ecore_fb_func_fb_lost_data);
+        /* TODO stop listening from the devices? let the callback do it? */
+        ioctl(_ecore_fb_vt_tty_fd, VT_RELDISP, 1);
+     }
+   else if (e->number == 2)
+     {
+        /* attach vt */
+        if (_ecore_fb_func_fb_gain) _ecore_fb_func_fb_gain(_ecore_fb_func_fb_gain_data);
+        /* TODO reattach all devices */
+     }
+   return 1;
 }
 
+/* XXX: unused
 static void
 _ecore_fb_vt_switch(int vt)
 {
-       vt++;
-       if (_ecore_fb_vt_tty_fd != 0)
-       {
-               if (vt != _ecore_fb_vt_current_vt)
-               {
-                       tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
-                       ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
-                       ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
-               }
-       }
-       ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, vt);
+   vt++;
+   if (_ecore_fb_vt_tty_fd != 0)
+     {
+        if (vt != _ecore_fb_vt_current_vt)
+          {
+             tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
+             ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
+             ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
+          }
+     }
+   ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, vt);
 }
+*/
 
 static int
 _ecore_fb_vt_setup(void)
 {
-       char buf[64];
-       struct termios tio;
-       struct vt_mode new_vtmode;
-
-       if(_ecore_fb_vt_current_vt != _ecore_fb_vt_prev_vt)
-       {
-               snprintf(buf, sizeof(buf), "/dev/tty%i", _ecore_fb_vt_current_vt);
-               if((_ecore_fb_vt_tty_fd = open(buf, O_RDWR)) < 0)
-               {
-                       printf("[ecore_fb:vt_setup] cant open tty %d\n", _ecore_fb_vt_current_vt);
-                       return 0;
-               }
-               close(_ecore_fb_vt_tty0_fd);
-               _ecore_fb_vt_tty0_fd = 0;
-               /* FIXME detach the process from current tty ? */
-       }
-       else
-               _ecore_fb_vt_tty_fd = _ecore_fb_vt_tty0_fd;
-       /* for backup */
-       tcgetattr(_ecore_fb_vt_tty_fd, &_ecore_fb_tty_prev_tio_mode);
-       ioctl(_ecore_fb_vt_tty_fd, KDGETMODE, &_ecore_fb_tty_prev_kd_mode);
-       ioctl(_ecore_fb_vt_tty_fd, VT_GETMODE, &_ecore_fb_vt_prev_mode);
-
-       if(ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, KD_GRAPHICS) < 0)
-       {
-               perror("[ecore_fb:vt_setup] cant set the mode to KD_GRAPHICS");
-               close(_ecore_fb_vt_tty_fd);
-               return 0;
-       }
-       ioctl(_ecore_fb_vt_tty_fd, KDGKBMODE, &_ecore_fb_tty_prev_mode);
-       
-       /* support of switching */
-       new_vtmode.mode = VT_PROCESS;
-       new_vtmode.waitv = 0;
-       new_vtmode.relsig = SIGUSR1;
-       new_vtmode.acqsig = SIGUSR2;
-       if(ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &new_vtmode) < 0)
-       {
-               perror("[ecore_fb:vt_setup] cant set the tty mode");
-               close(_ecore_fb_vt_tty_fd);
-               return 0;
-       }
-       /* register signal handlers when alloc/detach of vt */
-       _ecore_fb_user_handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
-                                                   _ecore_fb_signal_usr_handler,
-                                                   NULL);
-       /* What does this does? */
-       _ecore_fb_filter_handler = ecore_event_filter_add(_ecore_fb_event_filter_start, _ecore_fb_event_filter_filter, _ecore_fb_event_filter_end, NULL);
-       
-       usleep(40000);
-       if(ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, _ecore_fb_vt_current_vt) < 0)
-       {
-               perror("[ecore_fb:vt_setup] error on VT_ACTIVATE");
-               close(_ecore_fb_vt_tty_fd);
-               return 0;
-       }
-       if(ioctl(_ecore_fb_vt_tty_fd, VT_WAITACTIVE, _ecore_fb_vt_current_vt) < 0)
-       {
-               perror("[ecore_fb:vt_setup] error on VT_WAITACTIVE");
-               close(_ecore_fb_vt_tty_fd);
-               return 0;
-       }
-       /* FIXME assign the fb to the tty in case isnt setup */
-       return 1;
+   char buf[64];
+// XXX: unused
+//   struct termios tio;
+   struct vt_mode new_vtmode;
+
+   if (_ecore_fb_vt_current_vt != _ecore_fb_vt_prev_vt)
+     {
+        snprintf(buf, sizeof(buf), "/dev/tty%i", _ecore_fb_vt_current_vt);
+        if ((_ecore_fb_vt_tty_fd = open(buf, O_RDWR)) < 0)
+          {
+             printf("[ecore_fb:vt_setup] can't open tty %d\n", _ecore_fb_vt_current_vt);
+             return 0;
+          }
+        close(_ecore_fb_vt_tty0_fd);
+        _ecore_fb_vt_tty0_fd = -1;
+        /* FIXME detach the process from current tty ? */
+     }
+   else
+      _ecore_fb_vt_tty_fd = _ecore_fb_vt_tty0_fd;
+   /* for backup */
+   tcgetattr(_ecore_fb_vt_tty_fd, &_ecore_fb_tty_prev_tio_mode);
+   ioctl(_ecore_fb_vt_tty_fd, KDGETMODE, &_ecore_fb_tty_prev_kd_mode);
+   ioctl(_ecore_fb_vt_tty_fd, VT_GETMODE, &_ecore_fb_vt_prev_mode);
+
+   if (ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, KD_GRAPHICS) < 0)
+     {
+        perror("[ecore_fb:vt_setup] can't set the mode to KD_GRAPHICS");
+        close(_ecore_fb_vt_tty_fd);
+        _ecore_fb_vt_tty_fd = -1;
+        return 0;
+     }
+   ioctl(_ecore_fb_vt_tty_fd, KDGKBMODE, &_ecore_fb_tty_prev_mode);
+
+   /* support of switching */
+   new_vtmode.mode = VT_PROCESS;
+   new_vtmode.waitv = 0;
+   new_vtmode.relsig = SIGUSR1;
+   new_vtmode.acqsig = SIGUSR2;
+   if (ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &new_vtmode) < 0)
+     {
+        perror("[ecore_fb:vt_setup] can't set the tty mode");
+        close(_ecore_fb_vt_tty_fd);
+        _ecore_fb_vt_tty_fd = -1;
+        return 0;
+     }
+   /* register signal handlers when alloc/detach of vt */
+   _ecore_fb_user_handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
+                                                    _ecore_fb_signal_usr_handler,
+                                                    NULL);
+   /* What does this do? */
+   /*
+   _ecore_fb_filter_handler = ecore_event_filter_add(_ecore_fb_event_filter_start, _ecore_fb_event_filter_filter, _ecore_fb_event_filter_end, NULL);
+   */
+
+   usleep(40000);
+   if (ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, _ecore_fb_vt_current_vt) < 0)
+     {
+        perror("[ecore_fb:vt_setup] error on VT_ACTIVATE");
+        close(_ecore_fb_vt_tty_fd);
+        _ecore_fb_vt_tty_fd = -1;
+        return 0;
+     }
+   if(ioctl(_ecore_fb_vt_tty_fd, VT_WAITACTIVE, _ecore_fb_vt_current_vt) < 0)
+     {
+        perror("[ecore_fb:vt_setup] error on VT_WAITACTIVE");
+        close(_ecore_fb_vt_tty_fd);
+        _ecore_fb_vt_tty_fd = -1;
+        return 0;
+     }
+   /* FIXME assign the fb to the tty in case isn't setup */
+   return 1;
 }
 
 int
 ecore_fb_vt_init(void)
 {
-       struct vt_stat vtstat;
-
-       /* as root you can allocate another tty */
-       if(!geteuid())
-               _ecore_fb_vt_do_switch = 1;
-       if((_ecore_fb_vt_tty0_fd = open("/dev/tty0", O_RDONLY)) < 0)
-       {
-               printf("[ecore_fb:init] cant open /dev/tty0\n");
-               return 0;
-       }
-       /* query current vt state */
-       if((ioctl(_ecore_fb_vt_tty0_fd, VT_GETSTATE, &vtstat)) < 0)
-       {
-               printf("[ecore_fb:init] cant get current tty state\n");
-               return 0;
-       }
-       _ecore_fb_vt_prev_vt = vtstat.v_active;
-       /* switch to another tty */
-       if(_ecore_fb_vt_do_switch)
-       {
-               int vtno;
-
-               if ((ioctl(_ecore_fb_vt_tty0_fd, VT_OPENQRY, &vtno) < 0))
-               {
-                       printf("[ecore_fb:init] cant query for a vt\n");
-                       return 0;
-               }
-               _ecore_fb_vt_current_vt = vtno;
-       }
-       /* use current tty */
-       else
-               _ecore_fb_vt_current_vt = _ecore_fb_vt_prev_vt;
-       if(!_ecore_fb_vt_setup())
-       {
-               printf("[ecore_fb:init] cant setup the vt, restoring previous mode...\n");
-               /* TODO finish this */
-               if(_ecore_fb_vt_do_switch)
-               {
-                       printf("[ecore_fb:init] switching back to vt %d\n", _ecore_fb_vt_prev_vt);
-               }
-               return 0;
-       }
-       return 1;
+   struct vt_stat vtstat;
+
+   /* as root you can allocate another tty */
+   if (!geteuid())
+      _ecore_fb_vt_do_switch = 1;
+   if ((_ecore_fb_vt_tty0_fd = open("/dev/tty0", O_RDONLY)) < 0)
+     {
+        printf("[ecore_fb:init] can't open /dev/tty0\n");
+        return 0;
+     }
+   /* query current vt state */
+   if ((ioctl(_ecore_fb_vt_tty0_fd, VT_GETSTATE, &vtstat)) < 0)
+     {
+        printf("[ecore_fb:init] can't get current tty state\n");
+        return 0;
+     }
+   _ecore_fb_vt_prev_vt = vtstat.v_active;
+   /* switch to another tty */
+   if (_ecore_fb_vt_do_switch)
+     {
+        int vtno;
+
+        if ((ioctl(_ecore_fb_vt_tty0_fd, VT_OPENQRY, &vtno) < 0))
+          {
+             printf("[ecore_fb:init] can't query for a vt\n");
+             return 0;
+          }
+        _ecore_fb_vt_current_vt = vtno;
+     }
+   /* use current tty */
+   else
+      _ecore_fb_vt_current_vt = _ecore_fb_vt_prev_vt;
+   if (!_ecore_fb_vt_setup())
+     {
+        printf("[ecore_fb:init] can't setup the vt, restoring previous mode...\n");
+        /* TODO finish this */
+        if (_ecore_fb_vt_do_switch)
+          {
+             printf("[ecore_fb:init] switching back to vt %d\n", _ecore_fb_vt_prev_vt);
+          }
+        return 0;
+     }
+   return 1;
 }
 
 void
 ecore_fb_vt_shutdown(void)
 {
-       /* restore the previous mode */
-       if(_ecore_fb_vt_tty_fd != 0)
-       {
-               tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
-               ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
-               ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
-               ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &_ecore_fb_vt_prev_mode);
-               /* go back to previous vt */
-               close(_ecore_fb_vt_tty_fd);
-               _ecore_fb_vt_tty_fd = 0;
-       }
-       
-       if(_ecore_fb_user_handler)
-               ecore_event_handler_del(_ecore_fb_user_handler);
-       _ecore_fb_user_handler = NULL;
-
-       if(_ecore_fb_filter_handler)
-               ecore_event_filter_del(_ecore_fb_filter_handler);
-       _ecore_fb_filter_handler = NULL;
+   /* restore the previous mode */
+   if (_ecore_fb_vt_tty_fd != -1)
+     {
+        tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
+        ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
+        ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
+        ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &_ecore_fb_vt_prev_mode);
+        /* go back to previous vt */
+        close(_ecore_fb_vt_tty_fd);
+        _ecore_fb_vt_tty_fd = -1;
+     }
+
+   if (_ecore_fb_user_handler) ecore_event_handler_del(_ecore_fb_user_handler);
+   _ecore_fb_user_handler = NULL;
+
+   if (_ecore_fb_filter_handler) ecore_event_filter_del(_ecore_fb_filter_handler);
+   _ecore_fb_filter_handler = NULL;
 }
 
 /**
- * To be documented.
+ * @addtogroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
+ *
+ * @{
+ */
+
+/**
+ * @brief Set a callback called when a virtual terminal is gained.
  *
- * FIXME: To be fixed.
- * @todo Documentation: Find out what this does.
+ * @param func The callback called when vt is gained.
+ * @param data The data to pass to the callback.
+ *
+ * This function sets the callback @p func which will be called when a
+ * virtual terminal is gained (for example you press Ctrl-Alt-F1 to go
+ * to vt1 and your app was using vt1). @p data will be pass to @p func if
+ * the callback is called.
  */
 EAPI void
 ecore_fb_callback_gain_set(void (*func) (void *data), void *data)
@@ -226,57 +248,75 @@ ecore_fb_callback_gain_set(void (*func) (void *data), void *data)
 }
 
 /**
- * To be documented.
+ * @brief Set a callback called when a virtual terminal is lost.
+ *
+ * @param func The callback called when vt is lost.
+ * @param data The data to pass to the callback.
  *
- * FIXME: To be fixed.
- * @todo Documentation: Find out what this does.
+ * This function sets the callback @p func which will be called when a
+ * virtual terminal is lost (someone wants the tv from you and you
+ * want to give up that vt). @p data will be pass to @p func if the
+ * callback is called.
  */
 EAPI void
 ecore_fb_callback_lose_set(void (*func) (void *data), void *data)
 {
    _ecore_fb_func_fb_lost = func;
    _ecore_fb_func_fb_lost_data = data;
+
 }
+
+/**
+ * @}
+ */
+
+/*
+ * This filter should take into account that the MOUSE_MOVE event can be
+ * triggered by a mouse, not just a touchscreen device, so you can't discard
+ * them (only those generated by a device that sends events with absolute
+ * coordinates).
+
 typedef struct _Ecore_Fb_Filter_Data Ecore_Fb_Filter_Data;
-   
+
 struct _Ecore_Fb_Filter_Data
 {
    int last_event_type;
 };
-                
+
 static void *
 _ecore_fb_event_filter_start(void *data __UNUSED__)
 {
    Ecore_Fb_Filter_Data *filter_data;
-   
+
    filter_data = calloc(1, sizeof(Ecore_Fb_Filter_Data));
    return filter_data;
 }
 
-static int
+static Eina_Bool
 _ecore_fb_event_filter_filter(void *data __UNUSED__, void *loop_data,int type, void *event __UNUSED__)
 {
    Ecore_Fb_Filter_Data *filter_data;
-   
+
    filter_data = loop_data;
-   if (!filter_data) return 1;
-   if (type == ECORE_FB_EVENT_MOUSE_MOVE)
+   if (!filter_data) return EINA_TRUE;
+   if (type == ECORE_EVENT_MOUSE_MOVE)
      {
-       if ((filter_data->last_event_type) == ECORE_FB_EVENT_MOUSE_MOVE)
-         {
-            filter_data->last_event_type = type;
-            return 0;
-         }
+        if ((filter_data->last_event_type) == ECORE_EVENT_MOUSE_MOVE)
+          {
+             filter_data->last_event_type = type;
+             return EINA_FALSE;
+          }
      }
    filter_data->last_event_type = type;
-   return 1;
+   return EINA_TRUE;
 }
 
 static void
 _ecore_fb_event_filter_end(void *data __UNUSED__, void *loop_data)
 {
    Ecore_Fb_Filter_Data *filter_data;
-   
+
    filter_data = loop_data;
    if (filter_data) free(filter_data);
 }
+*/
index 03c2355..30f3bd7 100644 (file)
@@ -1,17 +1,13 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifndef ECORE_FILE_H
 #define ECORE_FILE_H
 
-#include <Ecore_Data.h>
-
 /*
  * TODO:
  * - More events, move/rename of directory file
  */
 
+#include <Eina.h>
+
 #ifdef EAPI
 # undef EAPI
 #endif
 extern "C" {
 #endif
 
-   typedef struct _Ecore_File_Monitor       Ecore_File_Monitor;
-   typedef struct _Ecore_File_Monitor_Event Ecore_File_Monitor_Event;
-
-   typedef enum
-     {
-       ECORE_FILE_EVENT_NONE,
-         ECORE_FILE_EVENT_CREATED_FILE,
-         ECORE_FILE_EVENT_CREATED_DIRECTORY,
-         ECORE_FILE_EVENT_DELETED_FILE,
-         ECORE_FILE_EVENT_DELETED_DIRECTORY,
-         ECORE_FILE_EVENT_DELETED_SELF,
-         ECORE_FILE_EVENT_MODIFIED
-     } Ecore_File_Event;
-
-
-   EAPI int         ecore_file_init         (void);
-   EAPI int         ecore_file_shutdown     (void);
-   EAPI long long   ecore_file_mod_time     (const char *file);
-   EAPI long long   ecore_file_size         (const char *file);
-   EAPI int         ecore_file_exists       (const char *file);
-   EAPI int         ecore_file_is_dir       (const char *file);
-   EAPI int         ecore_file_mkdir        (const char *dir);
-   EAPI int         ecore_file_rmdir        (const char *dir);
-   EAPI int         ecore_file_recursive_rm (const char *dir);
-   EAPI int         ecore_file_mkpath       (const char *path);
-   EAPI int         ecore_file_cp           (const char *src, const char *dst);
-   EAPI int         ecore_file_mv           (const char *src, const char *dst);
-   EAPI int         ecore_file_symlink      (const char *src, const char *dest);
-   EAPI char       *ecore_file_realpath     (const char *file);
-   EAPI int         ecore_file_unlink       (const char *file);
-   EAPI const char *ecore_file_file_get     (const char *path);
-   EAPI char       *ecore_file_dir_get      (const char *path);
-
-   EAPI int         ecore_file_can_read     (const char *file);
-   EAPI int         ecore_file_can_write    (const char *file);
-   EAPI int         ecore_file_can_exec     (const char *file);
-   EAPI char       *ecore_file_readlink     (const char *link);
-   EAPI Ecore_List *ecore_file_ls           (const char *dir);
-   EAPI char       *ecore_file_app_exe_get  (const char *app);
-   EAPI char       *ecore_file_escape_name  (const char *filename);
-   EAPI char       *ecore_file_strip_ext    (const char *file);
-   EAPI int         ecore_file_dir_is_empty (const char *dir);
-
-   EAPI Ecore_File_Monitor * ecore_file_monitor_add(const char *path,
-                void (*func) (void *data, Ecore_File_Monitor *em,
-                      Ecore_File_Event event,
-                      const char *path),
-                void *data);
-   EAPI void        ecore_file_monitor_del(Ecore_File_Monitor *ecore_file_monitor);
-   EAPI const char *ecore_file_monitor_path_get(Ecore_File_Monitor *ecore_file_monitor);
-
-   EAPI int         ecore_file_path_dir_exists(const char *in_dir);
-   EAPI int         ecore_file_app_installed(const char *exe);
-   EAPI Ecore_List *ecore_file_app_list(void);
-
-   EAPI int         ecore_file_download(const char *url, const char *dst,
-                                       void (*completion_cb)(void *data,
-                                                             const char *file,
-                                                             int status),
-                                       int (*progress_cb)(void *data,
-                                                          const char *file,
-                                                          long int dltotal,
-                                                          long int dlnow,
-                                                          long int ultotal,
-                                                          long int ulnow),
-                                       void *data);
-   EAPI void        ecore_file_download_abort_all(void);
-   EAPI int         ecore_file_download_protocol_available(const char *protocol);
+/**
+ * @defgroup Ecore_File_Group Ecore_File - Files and directories convenience functions
+ *
+ * @{
+ */
+
+/**
+ * @typedef Ecore_File_Monitor
+ * Abstract type used when monitoring a directory.
+ */
+typedef struct _Ecore_File_Monitor       Ecore_File_Monitor;
+
+/**
+ * @typedef Ecore_File_Download_Job
+ * Abstract type used when aborting a download.
+ */
+typedef struct _Ecore_File_Download_Job  Ecore_File_Download_Job;
+
+/**
+ * @typedef _Ecore_File_Event
+ * The event type returned when a file or directory is monitored.
+ */
+typedef enum _Ecore_File_Event
+{
+   ECORE_FILE_EVENT_NONE,              /**< No event. */
+   ECORE_FILE_EVENT_CREATED_FILE,      /**< Created file event. */
+   ECORE_FILE_EVENT_CREATED_DIRECTORY, /**< Created directory event. */
+   ECORE_FILE_EVENT_DELETED_FILE,      /**< Deleted file event. */
+   ECORE_FILE_EVENT_DELETED_DIRECTORY, /**< Deleted directory event. */
+   ECORE_FILE_EVENT_DELETED_SELF,      /**< Deleted monitored directory event. */
+   ECORE_FILE_EVENT_MODIFIED,          /**< Modified file or directory event. */
+   ECORE_FILE_EVENT_CLOSED             /**< Closed file event */
+} Ecore_File_Event;
+
+/**
+ * @typedef Ecore_File_Monitor_Cb
+ * Callback type used when a monitored directory has changes.
+ */
+typedef void (*Ecore_File_Monitor_Cb)(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path);
+
+/**
+ * @typedef Ecore_File_Download_Completion_Cb
+ * Callback type used when a download is finished.
+ */
+typedef void (*Ecore_File_Download_Completion_Cb)(void *data, const char *file, int status);
+
+/**
+ * @typedef _Ecore_File_Progress_Return
+ * What to do with the download as a return from the 
+ * Ecore_File_Download_Progress_Cb function, if provided.
+ */
+typedef enum _Ecore_File_Progress_Return
+{
+   ECORE_FILE_PROGRESS_CONTINUE = 0,   /**< Continue the download. */
+   ECORE_FILE_PROGRESS_ABORT = 1       /**< Abort the download. */
+} Ecore_File_Progress_Return;
+
+/**
+ * @typedef Ecore_File_Download_Progress_Cb
+ * Callback type used while a download is in progress.
+ */
+typedef int (*Ecore_File_Download_Progress_Cb)(void *data,
+                                               const char *file,
+                                               long int dltotal,
+                                               long int dlnow,
+                                               long int ultotal,
+                                               long int ulnow);
+
+/* File operations */
+
+EAPI int            ecore_file_init         (void);
+EAPI int            ecore_file_shutdown     (void);
+EAPI long long      ecore_file_mod_time     (const char *file);
+EAPI long long      ecore_file_size         (const char *file);
+EAPI Eina_Bool      ecore_file_exists       (const char *file);
+EAPI Eina_Bool      ecore_file_is_dir       (const char *file);
+EAPI Eina_Bool      ecore_file_mkdir        (const char *dir);
+EAPI int            ecore_file_mkdirs       (const char **dirs);
+EAPI int            ecore_file_mksubdirs    (const char *base, const char **subdirs);
+EAPI Eina_Bool      ecore_file_rmdir        (const char *dir);
+EAPI Eina_Bool      ecore_file_recursive_rm (const char *dir);
+EAPI Eina_Bool      ecore_file_mkpath       (const char *path);
+EAPI int            ecore_file_mkpaths      (const char **paths);
+EAPI Eina_Bool      ecore_file_cp           (const char *src, const char *dst);
+EAPI Eina_Bool      ecore_file_mv           (const char *src, const char *dst);
+EAPI Eina_Bool      ecore_file_symlink      (const char *src, const char *dest);
+EAPI char          *ecore_file_realpath     (const char *file);
+EAPI Eina_Bool      ecore_file_unlink       (const char *file);
+EAPI Eina_Bool      ecore_file_remove       (const char *file);
+EAPI const char    *ecore_file_file_get     (const char *path);
+EAPI char          *ecore_file_dir_get      (const char *path);
+EAPI Eina_Bool      ecore_file_can_read     (const char *file);
+EAPI Eina_Bool      ecore_file_can_write    (const char *file);
+EAPI Eina_Bool      ecore_file_can_exec     (const char *file);
+EAPI char          *ecore_file_readlink     (const char *link);
+EAPI Eina_List     *ecore_file_ls           (const char *dir);
+EAPI Eina_Iterator *ecore_file_ls_iterator  (const char *dir);
+EAPI char          *ecore_file_app_exe_get  (const char *app);
+EAPI char          *ecore_file_escape_name  (const char *filename);
+EAPI char          *ecore_file_strip_ext    (const char *file);
+EAPI int            ecore_file_dir_is_empty (const char *dir);
+
+/* Monitoring */
+
+EAPI Ecore_File_Monitor *ecore_file_monitor_add(const char *path,
+                                                Ecore_File_Monitor_Cb func,
+                                                void *data);
+EAPI void                ecore_file_monitor_del(Ecore_File_Monitor *ecore_file_monitor);
+EAPI const char         *ecore_file_monitor_path_get(Ecore_File_Monitor *ecore_file_monitor);
+
+/* Path */
+
+EAPI Eina_Bool  ecore_file_path_dir_exists(const char *in_dir);
+EAPI Eina_Bool  ecore_file_app_installed(const char *exe);
+EAPI Eina_List *ecore_file_app_list(void);
+
+/* Download */
+
+EAPI Eina_Bool ecore_file_download(const char *url,
+                                   const char *dst,
+                                   Ecore_File_Download_Completion_Cb completion_cb,
+                                   Ecore_File_Download_Progress_Cb progress_cb,
+                                   void *data,
+                                   Ecore_File_Download_Job **job_ret);
+EAPI Eina_Bool ecore_file_download_full(const char *url,
+                                        const char *dst,
+                                        Ecore_File_Download_Completion_Cb completion_cb,
+                                        Ecore_File_Download_Progress_Cb progress_cb,
+                                        void *data,
+                                        Ecore_File_Download_Job **job_ret,
+                                        Eina_Hash *headers);
+
+EAPI void      ecore_file_download_abort_all(void);
+EAPI void      ecore_file_download_abort(Ecore_File_Download_Job *job);
+EAPI Eina_Bool ecore_file_download_protocol_available(const char *protocol);
+
+/**
+ * @}
+ */
 
 #ifdef __cplusplus
 }
index a40d3ba..ab23ace 100644 (file)
@@ -4,8 +4,11 @@ AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
 -I$(top_srcdir)/src/lib/ecore_con \
 -I$(top_builddir)/src/lib/ecore \
+@EFL_ECORE_FILE_BUILD@ \
 @CURL_CFLAGS@ \
-@EVIL_CFLAGS@
+@EVIL_CFLAGS@ \
+@EINA_CFLAGS@ \
+@WIN32_CPPFLAGS@
 
 AM_CFLAGS = @WIN32_CFLAGS@
 
@@ -13,16 +16,15 @@ if BUILD_ECORE_CON
 lib_ecore_con_la = $(top_builddir)/src/lib/ecore_con/libecore_con.la
 endif
 
-if BUILD_ECORE_FILE
-
 lib_LTLIBRARIES = libecore_file.la
-include_HEADERS = Ecore_File.h
+includes_HEADERS = Ecore_File.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_file_la_SOURCES = \
 ecore_file.c \
-ecore_file_private.h \
 ecore_file_monitor.c \
 ecore_file_monitor_inotify.c \
+ecore_file_monitor_win32.c \
 ecore_file_monitor_poll.c \
 ecore_file_path.c \
 ecore_file_download.c
@@ -30,17 +32,10 @@ ecore_file_download.c
 libecore_file_la_LIBADD = \
 $(top_builddir)/src/lib/ecore/libecore.la \
 $(lib_ecore_con_la) \
-@EVIL_LIBS@
-
-libecore_file_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
+@EVIL_LIBS@ \
+@EINA_LIBS@
 
-endif
+libecore_file_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
 
-EXTRA_DIST = \
-ecore_file.c \
-ecore_file_private.h \
-ecore_file_monitor.c \
-ecore_file_monitor_inotify.c \
-ecore_file_monitor_poll.c \
-ecore_file_path.c
+EXTRA_DIST = ecore_file_private.h
 
index 10b9d58..c59bf80 100644 (file)
@@ -1,13 +1,18 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
-#ifndef _FILE_OFFSET_BITS
-# define _FILE_OFFSET_BITS  64
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifndef _MSC_VER
+# include <unistd.h>
+# include <libgen.h>
+#endif
+
+#ifdef _WIN32
+# include <direct.h>
 #endif
 
 #ifdef HAVE_FEATURES_H
 #include <ctype.h>
 #include <errno.h>
 
-#include "ecore_file_private.h"
+#ifdef HAVE_ATFILE_SOURCE
+# include <dirent.h>
+#endif
 
+#include "ecore_file_private.h"
 
-static int init = 0;
+int _ecore_file_log_dom = -1;
+static int _ecore_file_init_count = 0;
 
 /* externally accessible functions */
+
 /**
- * Initialize Ecore_File and the services it will use. Call this function
- * once before you use any of the ecore file functions.
- * @return Return the number howoften ecore_file_init() was call succesfully;
- *         0 if it failed.
+ * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
+ *
+ * @{
+ */
+
+/**
+ * @brief Initialize the Ecore_File library.
+ *
+ * @return 1 or greater on success, 0 on error.
+ *
+ * This function sets up Ecore_File and the services it will use
+ * (monitoring, downloading, PATH related feature). It returns 0 on
+ * failure, otherwise it returns the number of times it has already
+ * been called.
+ *
+ * When Ecore_File is not used anymore, call ecore_file_shutdown()
+ * to shut down the Ecore_File library.
  */
 EAPI int
 ecore_file_init()
 {
-   if (++init != 1) return init;
+   if (++_ecore_file_init_count != 1)
+     return _ecore_file_init_count;
+
+   if (!ecore_init())
+     return --_ecore_file_init_count;
 
+   _ecore_file_log_dom = eina_log_domain_register
+     ("ecore_file", ECORE_FILE_DEFAULT_LOG_COLOR);
+   if(_ecore_file_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the ecore file module.");
+       return --_ecore_file_init_count;
+     }
+   ecore_file_path_init();
+   ecore_file_monitor_init();
+   ecore_file_download_init();
+
+   /* FIXME: were the tests disabled for a good reason ? */
+
+   /*
    if (!ecore_file_monitor_init())
-     goto error;
-   if (!ecore_file_path_init())
-     goto error;
+     goto shutdown_ecore_file_path;
+
    if (!ecore_file_download_init())
-     goto error;
-   return init;
+     goto shutdown_ecore_file_monitor;
+   */
 
-error:
+   return _ecore_file_init_count;
 
+   /*
+ shutdown_ecore_file_monitor:
    ecore_file_monitor_shutdown();
+ shutdown_ecore_file_path:
    ecore_file_path_shutdown();
-   ecore_file_download_shutdown();
 
-   return --init;
+   return --_ecore_file_init_count;
+   */
 }
 
 /**
- * Shutdown the Ecore_File
- * @return returns the number of libraries that still uses Ecore_File
+ * @brief Shut down the Ecore_File library.
+ *
+ * @return 0 when the library is completely shut down, 1 or
+ * greater otherwise.
+ *
+ * This function shuts down the Ecore_File library. It returns 0 when it has
+ * been called the same number of times than ecore_file_init(). In that case
+ * it shuts down all the services it uses.
  */
 EAPI int
 ecore_file_shutdown()
 {
-   if (--init != 0) return init;
+   if (--_ecore_file_init_count != 0)
+     return _ecore_file_init_count;
 
+   ecore_file_download_shutdown();
    ecore_file_monitor_shutdown();
    ecore_file_path_shutdown();
-   ecore_file_download_shutdown();
 
-   return init;
+   eina_log_domain_unregister(_ecore_file_log_dom);
+   _ecore_file_log_dom = -1;
+
+   ecore_shutdown();
+
+   return _ecore_file_init_count;
 }
 
 /**
- * Get the time of the last modification to the give file
- * @param file The name of the file
- * @return Return the time of the last data modification, if an error should
- *         occur it will return 0
+ * @brief Get the time of the last modification to the given file.
+ *
+ * @param file The name of the file.
+ * @return Return the time of the last data modification, or 0 on
+ * failure.
+ *
+ * This function returns the time of the last modification of
+ * @p file. On failure, it returns 0.
  */
 EAPI long long
 ecore_file_mod_time(const char *file)
@@ -82,9 +141,13 @@ ecore_file_mod_time(const char *file)
 }
 
 /**
- * Get the size of the given file
- * @param  file The name of the file
- * @return The size of the file in byte
+ * @brief Get the size of the given file.
+ *
+ * @param file The name of the file.
+ * @return Return the size of the file in bytes, or 0 on failure.
+ *
+ * This function returns the size of @p file in bytes. On failure, it
+ * returns 0.
  */
 EAPI long long
 ecore_file_size(const char *file)
@@ -96,190 +159,400 @@ ecore_file_size(const char *file)
 }
 
 /**
- * Check if file exists
- * @param  file The name of the file
- * @return 1 if file exists on local filesystem, 0 otherwise
+ * @brief Check if the given file exists.
+ *
+ * @param file The name of the file.
+ * @return @c EINA_TRUE if the @p file exists, @c EINA_FALSE otherwise.
+ *
+ * This function returns @c EINA_TRUE if @p file exists on local filesystem,
+ * @c EINA_FALSE otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_exists(const char *file)
 {
    struct stat st;
+   if (!file) return EINA_FALSE;
 
    /*Workaround so that "/" returns a true, otherwise we can't monitor "/" in ecore_file_monitor*/
-   if (stat(file, &st) < 0 && strcmp(file, "/")) return 0;
-   return 1;
+   if (stat(file, &st) < 0 && strcmp(file, "/")) return EINA_FALSE;
+   return EINA_TRUE;
 }
 
 /**
- * Check if file is a directory
- * @param  file The name of the file
- * @return 1 if file exist and is a directory, 0 otherwise
+ * @brief Check if the given file is a directory.
+ *
+ * @param file The name of the file.
+ * @return @c EINA_TRUE if the file exists and is a directory, @c EINA_FALSE
+ * otherwise.
+ *
+ * This function returns @c EINA_TRUE if @p file exists exists and is a
+ * directory on local filesystem, @c EINA_FALSE otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_is_dir(const char *file)
 {
    struct stat st;
 
-   if (stat(file, &st) < 0) return 0;
-   if (S_ISDIR(st.st_mode)) return 1;
-   return 0;
+   if (stat(file, &st) < 0) return EINA_FALSE;
+   if (S_ISDIR(st.st_mode)) return EINA_TRUE;
+   return EINA_FALSE;
 }
 
 static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
 
 /**
- * Create a new directory
+ * @brief Create a new directory.
+ *
  * @param  dir The name of the directory to create
- * @return 1 on successfull creation, 0 on failure
+ * @return @c EINA_TRUE on successful creation, @c EINA_FALSE otherwise.
  *
- * The directory is created with the mode: S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH
+ * This function creates the directory @p dir with the mode S_IRUSR |
+ * S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH. On
+ * success, it returns @c EINA_TRUE, @c EINA_FALSE otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_mkdir(const char *dir)
 {
-   if (mkdir(dir, default_mode) < 0) return 0;
-   return 1;
+   if (mkdir(dir, default_mode) < 0) return EINA_FALSE;
+   return EINA_TRUE;
 }
 
 /**
- * Delete the given dir
- * @param  dir The name of the directory to delete
- * @return 1 on success, 0 on failure
+ * @brief Create complete directory in a batch.
+ *
+ * @param dirs The list of directories, null terminated.
+ * @return The number of successful directories created, -1 if dirs is
+ * @c NULL.
+ *
+ * This function creates all the directories that are in the null
+ * terminated array @p dirs. The function loops over the directories
+ * and call ecore_file_mkdir(). This function returns -1 if @p dirs is
+ * @c NULL, otherwise if returns the number of suceesfully created
+ * directories.
  */
 EAPI int
-ecore_file_rmdir(const char *dir)
+ecore_file_mkdirs(const char **dirs)
 {
-   if (rmdir(dir) < 0) return 0;
-   return 1;
+   int i = 0;
+
+   if (!dirs) return -1;
+
+   for (; *dirs; dirs++)
+     if (ecore_file_mkdir(*dirs))
+       i++;
+   return i;
 }
 
 /**
- * Delete the given file
- * @param  file The name of the file to delete
- * @return 1 on success, 0 on failure
+ * @brief Create complete list of sub-directories in a batch (optimized).
+ *
+ * @param base The base directory to act on.
+ * @param subdirs The list of directories, null terminated.
+ * @return number of successful directories created, -1 on failure.
+ *
+ * This function creates all the directories that are in the null
+ * terminated array @p dirs in the @p base directory. If @p base does
+ * not exist, it will be created. The function loops over the directories
+ * and call ecore_file_mkdir(). The whole path of the directories must
+ * exist. So if base/a/b/c wants to be created, @p subdirs must
+ * contain "a", "a/b" and "a/b/c", in that order. This function
+ * returns -1 if @p dirs or @p base are @c NULL, or if @p base is
+ * empty ("\0"). It returns 0 is @p base is not a directory or
+ * invalid, or if it can't be created. Otherwise if returns the number
+ * of suceesfully created directories.
  */
 EAPI int
+ecore_file_mksubdirs(const char *base, const char **subdirs)
+{
+#ifndef HAVE_ATFILE_SOURCE
+   char buf[PATH_MAX];
+   int baselen;
+#else
+   int fd;
+   DIR *dir;
+#endif
+   int i;
+
+   if (!subdirs) return -1;
+   if ((!base) || (base[0] == '\0')) return -1;
+
+   if ((!ecore_file_is_dir(base)) && (!ecore_file_mkpath(base)))
+     return 0;
+
+#ifndef HAVE_ATFILE_SOURCE
+   baselen = eina_strlcpy(buf, base, sizeof(buf));
+   if ((baselen < 1) || (baselen + 1 >= (int)sizeof(buf)))
+     return 0;
+
+   if (buf[baselen - 1] != '/')
+     {
+        buf[baselen] = '/';
+        baselen++;
+     }
+#else
+   dir = opendir(base);
+   if (!dir)
+     return 0;
+   fd = dirfd(dir);
+#endif
+
+   i = 0;
+   for (; *subdirs; subdirs++)
+     {
+        struct stat st;
+
+#ifndef HAVE_ATFILE_SOURCE
+        eina_strlcpy(buf + baselen, *subdirs, sizeof(buf) - baselen);
+        if (stat(buf, &st) == 0)
+#else
+        if (fstatat(fd, *subdirs, &st, 0) == 0)
+#endif
+          {
+             if (S_ISDIR(st.st_mode))
+               {
+                  i++;
+                  continue;
+               }
+          }
+        else
+          {
+             if (errno == ENOENT)
+               {
+#ifndef HAVE_ATFILE_SOURCE
+                  if (mkdir(buf, default_mode) == 0)
+#else
+                  if (mkdirat(fd, *subdirs, default_mode) == 0)
+#endif
+                    {
+                       i++;
+                       continue;
+                    }
+                 }
+            }
+     }
+
+#ifdef HAVE_ATFILE_SOURCE
+   closedir(dir);
+#endif
+
+   return i;
+}
+
+/**
+ * @brief Delete the given directory.
+ *
+ * @param  dir The name of the directory to delete.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function deletes @p dir. It returns @c EINA_TRUE on success,
+ * @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_file_rmdir(const char *dir)
+{
+   if (rmdir(dir) < 0) return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+/**
+ * @brief Delete the given file.
+ *
+ * @param  file The name of the file to delete.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function deletes @p file. It returns @c EINA_TRUE on success,
+ * @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
 ecore_file_unlink(const char *file)
 {
-   if (unlink(file) < 0) return 0;
-   return 1;
+   if (unlink(file) < 0) return EINA_FALSE;
+   return EINA_TRUE;
 }
 
 /**
- * Delete a directory and all its contents
- * @param  dir The name of the directory to delete
- * @return 1 on success, 0 on failure
+ * @brief Remove the given file or directory.
+ *
+ * @param  file The name of the file or directory to delete.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
  *
- * If dir is a link only the link is removed
+ * This function removes @p file. It returns @c EINA_TRUE on success,
+ * @c EINA_FALSE otherwise.
  */
-EAPI int
+EAPI Eina_Bool
+ecore_file_remove(const char *file)
+{
+   if (remove(file) < 0) return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+/**
+ * @brief Delete the given directory and all its contents.
+ *
+ * @param  dir The name of the directory to delete.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function delete @p dir and all its contents. If @p dir is a
+ * link only the link is removed. It returns @c EINA_TRUE on success,
+ * @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
 ecore_file_recursive_rm(const char *dir)
 {
-   DIR                *dirp;
-   struct dirent      *dp;
-   char               path[PATH_MAX];
-   char               buf[PATH_MAX];
-   struct             stat st;
-   int                ret;
-
-   if (readlink(dir, buf, sizeof(buf)) > 0)
-     {
-       return ecore_file_unlink(dir);
-     }
+   Eina_Iterator *it;
+   char buf[PATH_MAX];
+   struct stat st;
+   int ret;
+
+   if (readlink(dir, buf, sizeof(buf) - 1) > 0)
+     return ecore_file_unlink(dir);
 
    ret = stat(dir, &st);
    if ((ret == 0) && (S_ISDIR(st.st_mode)))
      {
-       ret = 1;
-       if (stat(dir, &st) == -1) return 0;
-       dirp = opendir(dir);
-       if (dirp)
-         {
-            while ((dp = readdir(dirp)))
-              {
-                 if ((strcmp(dp->d_name, ".")) && (strcmp(dp->d_name, "..")))
-                   {
-                      snprintf(path, PATH_MAX, "%s/%s", dir, dp->d_name);
-                      if (!ecore_file_recursive_rm(path))
-                        ret = 0;
-                   }
-              }
-            closedir(dirp);
-         }
-       if (!ecore_file_rmdir(dir)) ret = 0;
-        return ret;
+        Eina_File_Direct_Info *info;
+
+        ret = 1;
+        if (stat(dir, &st) == -1) return EINA_FALSE; /* WOOT: WHY ARE WE CALLING STAT TWO TIMES ??? */
+
+        it = eina_file_direct_ls(dir);
+        EINA_ITERATOR_FOREACH(it, info)
+          {
+             if (!ecore_file_recursive_rm(info->path))
+               ret = 0;
+          }
+        eina_iterator_free(it);
+
+        if (!ecore_file_rmdir(dir)) ret = 0;
+        if (ret)
+            return EINA_TRUE;
+        else
+            return EINA_FALSE;
      }
    else
      {
-       if (ret == -1) return 0;
-       return ecore_file_unlink(dir);
+        if (ret == -1) return EINA_FALSE;
+        return ecore_file_unlink(dir);
      }
+}
 
-   return 1;
+static inline Eina_Bool
+_ecore_file_mkpath_if_not_exists(const char *path)
+{
+   struct stat st;
+
+   /* Windows: path like C: or D: etc are valid, but stat() returns an error */
+#ifdef _WIN32
+   if ((strlen(path) == 2) &&
+       ((path[0] >= 'a' && path[0] <= 'z') ||
+        (path[0] >= 'A' && path[0] <= 'Z')) &&
+       (path[1] == ':'))
+     return EINA_TRUE;
+#endif
+
+   if (stat(path, &st) < 0)
+     return ecore_file_mkdir(path);
+   else if (!S_ISDIR(st.st_mode))
+     return EINA_FALSE;
+   else
+     return EINA_TRUE;
 }
 
 /**
- * Create a complete path
+ * @brief Create a complete path.
+ *
  * @param  path The path to create
- * @return 1 on success, 0 on failure
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function creates @p path and all the subdirectories it
+ * contains. The separator is '/' or '\'. If @p path exists, this
+ * function returns @c EINA_TRUE immediately. It returns @c EINA_TRUE on
+ * success, @c EINA_FALSE otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_mkpath(const char *path)
 {
    char ss[PATH_MAX];
-   int  i;
+   unsigned int i;
 
-   ss[0] = 0;
-   i = 0;
-   while (path[i])
+   if (ecore_file_is_dir(path))
+     return EINA_TRUE;
+
+   for (i = 0; path[i] != '\0'; ss[i] = path[i], i++)
      {
-       if (i == sizeof(ss) - 1) return 0;
-       ss[i] = path[i];
-       ss[i + 1] = 0;
-       if (path[i] == '/')
-         {
-            ss[i] = 0;
-            if ((ecore_file_exists(ss)) && (!ecore_file_is_dir(ss))) return 0;
-            else if (!ecore_file_exists(ss)) ecore_file_mkdir(ss);
-            ss[i] = '/';
-         }
-       i++;
+        if (i == sizeof(ss) - 1) return EINA_FALSE;
+        if (((path[i] == '/') || (path[i] == '\\')) && (i > 0))
+          {
+             ss[i] = '\0';
+             if (!_ecore_file_mkpath_if_not_exists(ss))
+               return EINA_FALSE;
+          }
      }
-   if ((ecore_file_exists(ss)) && (!ecore_file_is_dir(ss))) return 0;
-   else if (!ecore_file_exists(ss)) ecore_file_mkdir(ss);
-   return 1;
+   ss[i] = '\0';
+   return _ecore_file_mkpath_if_not_exists(ss);
 }
 
 /**
- * Copy a file
- * @param  src The name of the source file
- * @param  dst The name of the destination file
- * @return 1 on success, 0 on failure
+ * @brief Create complete paths in a batch.
+ *
+ * @param paths list of paths, null terminated.
+ * @return number of successful paths created, -1 if paths is NULL.
+ *
+ * This function creates all the directories that are in the null
+ * terminated array @p paths. The function loops over the directories
+ * and call ecore_file_mkpath(), hence on Windows, '\' must be
+ * replaced by '/' before calling that function. This function
+ * returns -1 if @p paths is @c NULL. Otherwise if returns the number
+ * of suceesfully created directories.
  */
 EAPI int
+ecore_file_mkpaths(const char **paths)
+{
+   int i = 0;
+
+   if (!paths) return -1;
+
+   for (; *paths; paths++)
+     if (ecore_file_mkpath(*paths))
+       i++;
+   return i;
+}
+
+/**
+ * @brief Copy the given file to the given destination.
+ *
+ * @param  src The name of the source file.
+ * @param  dst The name of the destination file.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function copies @p src to @p dst. If the absolute path name of
+ * @p src and @p dst can not be computed, or if they are equal, or if
+ * the copy fails, the function returns @c EINA_FALSE, otherwise it
+ * returns @c EINA_TRUE.
+ */
+EAPI Eina_Bool
 ecore_file_cp(const char *src, const char *dst)
 {
-   FILE               *f1, *f2;
-   char                buf[16384];
-   char                realpath1[PATH_MAX];
-   char                realpath2[PATH_MAX];
-   size_t              num;
-   int                 ret = 1;
+   FILE *f1, *f2;
+   char buf[16384];
+   char realpath1[PATH_MAX], realpath2[PATH_MAX];
+   size_t num;
+   Eina_Bool ret = EINA_TRUE;
 
-   if (!realpath(src, realpath1)) return 0;
-   if (realpath(dst, realpath2) && !strcmp(realpath1, realpath2)) return 0;
+   if (!realpath(src, realpath1)) return EINA_FALSE;
+   if (realpath(dst, realpath2) && !strcmp(realpath1, realpath2)) return EINA_FALSE;
 
    f1 = fopen(src, "rb");
-   if (!f1) return 0;
+   if (!f1) return EINA_FALSE;
    f2 = fopen(dst, "wb");
    if (!f2)
      {
-       fclose(f1);
-       return 0;
+        fclose(f1);
+        return EINA_FALSE;
      }
    while ((num = fread(buf, 1, sizeof(buf), f1)) > 0)
      {
-       if (fwrite(buf, 1, num, f2) != num) ret = 0;
+        if (fwrite(buf, 1, num, f2) != num) ret = EINA_FALSE;
      }
    fclose(f1);
    fclose(f2);
@@ -287,59 +560,114 @@ ecore_file_cp(const char *src, const char *dst)
 }
 
 /**
- * Move a file
- * @param  src The name of the source file
- * @param  dst The name of the destination file
- * @return 1 on success, 0 on failure
+ * @brief Move the given file to the given destination.
+ *
+ * @param  src The name of the source file.
+ * @param  dst The name of the destination file.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function moves @p src to @p dst. It returns @c EINA_TRUE on
+ * success, @c EINA_FALSE otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_mv(const char *src, const char *dst)
 {
-   if (ecore_file_exists(dst)) return 0;
+   char buf[PATH_MAX];
+   int fd;
+
    if (rename(src, dst))
      {
-       if (errno == EXDEV)
-         {
-            struct stat st;
-
-            stat(src, &st);
-            if (S_ISREG(st.st_mode))
-              {
-                 ecore_file_cp(src, dst);
-                 chmod(dst, st.st_mode);
-                 ecore_file_unlink(src);
-                 return 1;
-              }
-         }
-       return 0;
+        // File cannot be moved directly because
+        // it resides on a different mount point.
+        if (errno == EXDEV)
+          {
+             struct stat st;
+
+             // Make sure this is a regular file before
+             // we do anything fancy.
+             stat(src, &st);
+             if (S_ISREG(st.st_mode))
+               {
+                  char *dir;
+
+                  dir = ecore_file_dir_get(dst);
+                  // Since we can't directly rename, try to
+                  // copy to temp file in the dst directory
+                  // and then rename.
+                  snprintf(buf, sizeof(buf), "%s/.%s.tmp.XXXXXX",
+                           dir, ecore_file_file_get(dst));
+                  free(dir);
+                  fd = mkstemp(buf);
+                  if (fd < 0) goto FAIL;
+                  close(fd);
+
+                  // Copy to temp file
+                  if (!ecore_file_cp(src, buf))
+                    goto FAIL;
+
+                  // Set file permissions of temp file to match src
+                  chmod(buf, st.st_mode);
+
+                  // Try to atomically move temp file to dst
+                  if (rename(buf, dst))
+                    {
+                       // If we still cannot atomically move
+                       // do a normal copy and hope for the best.
+                       if (!ecore_file_cp(buf, dst))
+                         goto FAIL;
+                    }
+
+                  // Delete temporary file and src
+                  ecore_file_unlink(buf);
+                  ecore_file_unlink(src);
+                  goto PASS;
+               }
+          }
+        goto FAIL;
      }
-   return 1;
+
+PASS:
+   return EINA_TRUE;
+
+FAIL:
+   return EINA_FALSE;
 }
 
 /**
- * Create a symbolic link
- * @param  src The name of the file to link
- * @param  dest The name of link
- * @return 1 on success, 0 on failure
+ * @brief Create a symbolic link.
+ *
+ * @param  src The name of the file to link.
+ * @param  dest The name of link.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function create the symbolic link @p dest of @p src. This
+ * function does not work on Windows. It returns @c EINA_TRUE on success,
+ * @c EINA_FALSE otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_symlink(const char *src, const char *dest)
 {
-   if (!symlink(src, dest)) return 1;
+   if (!symlink(src, dest)) return EINA_TRUE;
 
-   return 0;
+   return EINA_FALSE;
 }
 
 /**
- * Get the canonicalized absolute pathname
- * @param  file The file path
- * @return The canonicalized absolute pathname; on failure it will return
- *         an empty string
+ * @brief Get the canonicalized absolute path name.
+ *
+ * @param  file The file path.
+ * @return The canonicalized absolute pathname or an empty string on
+ * failure.
+ *
+ * This function returns the absolute path name of @p file as a newly
+ * allocated string. If @p file is @c NULL, or on error, this function
+ * returns an empty string. Otherwise, it returns the absolute path
+ * name. When not needed anymore, the returned value must be freed.
  */
 EAPI char *
 ecore_file_realpath(const char *file)
 {
-   char  buf[PATH_MAX];
+   char buf[PATH_MAX];
 
    /*
     * Some implementations of realpath do not conform to the SUS.
@@ -352,9 +680,13 @@ ecore_file_realpath(const char *file)
 }
 
 /**
- * Get the filename from a give path
- * @param  path The complete path
- * @return Only the file name
+ * Get the filename from a given path.
+ *
+ * @param  path The complete path.
+ * @return The file name.
+ *
+ * This function returns the file name of @p path. If @p path is
+ * @c NULL, the functions returns @c NULL.
  */
 EAPI const char *
 ecore_file_file_get(const char *path)
@@ -368,126 +700,152 @@ ecore_file_file_get(const char *path)
 }
 
 /**
- * Get the directory where file reside
- * @param  file The name of the file
- * @return The directory name
+ * @brief Get the directory where the given file resides.
+ *
+ * @param  file The name of the file.
+ * @return The directory name.
+ *
+ * This function returns the directory where @p file resides as anewly
+ * allocated string. If @p file is @c NULL or on error, this function
+ * returns @c NULL. When not needed anymore, the returned value must
+ * be freed.
  */
 EAPI char *
 ecore_file_dir_get(const char *file)
 {
-   char               *p;
-   char                buf[PATH_MAX];
+   char *p;
+   char buf[PATH_MAX];
 
+   if (!file) return NULL;
    strncpy(buf, file, PATH_MAX);
-   p = strrchr(buf, '/');
-   if (!p)
-     {
-       return strdup(file);
-     }
-
-   if (p == buf) return strdup("/");
-
-   *p = 0;
-   return strdup(buf);
+   buf[PATH_MAX - 1] = 0;
+   p = dirname(buf);
+   return strdup(p);
 }
 
 /**
- * Check if file can be read
- * @param  file The name of the file
- * @return 1 if the file is readable, 0 otherwise
+ * @brief Check if the given file can be read.
+ *
+ * @param  file The name of the file.
+ * @return @c EINA_TRUE if the @p file is readable, @c EINA_FALSE otherwise.
+ *
+ * This function returns @c EINA_TRUE if @p file can be read, @c EINA_FALSE
+ * otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_can_read(const char *file)
 {
-   if (!file) return 0;
-   if (!access(file, R_OK)) return 1;
-   return 0;
+   if (!file) return EINA_FALSE;
+   if (!access(file, R_OK)) return EINA_TRUE;
+   return EINA_FALSE;
 }
 
 /**
- * Check if file can be written
- * @param  file The name of the file
- * @return 1 if the file is writable, 0 otherwise
+ * @brief Check if the given file can be written.
+ *
+ * @param  file The name of the file.
+ * @return @c EINA_TRUE if the @p file is writable, @c EINA_FALSE otherwise.
+ *
+ * This function returns @c EINA_TRUE if @p file can be written, @c EINA_FALSE
+ * otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_can_write(const char *file)
 {
-   if (!file) return 0;
-   if (!access(file, W_OK)) return 1;
-   return 0;
+   if (!file) return EINA_FALSE;
+   if (!access(file, W_OK)) return EINA_TRUE;
+   return EINA_FALSE;
 }
 
 /**
- * Check if file can be executed
- * @param  file The name of the file
- * @return 1 if the file can be executed, 0 otherwise
+ * @brief Check if the given file can be executed.
+ *
+ * @param  file The name of the file.
+ * @return @c EINA_TRUE if the @p file can be executed, @c EINA_FALSE
+ * otherwise.
+ *
+ * This function returns @c EINA_TRUE if @p file can be executed, @c EINA_FALSE
+ * otherwise.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_can_exec(const char *file)
 {
-   if (!file) return 0;
-   if (!access(file, X_OK)) return 1;
-   return 0;
+   if (!file) return EINA_FALSE;
+   if (!access(file, X_OK)) return EINA_TRUE;
+   return EINA_FALSE;
 }
 
 /**
- * Get the path pointed by link
- * @param  link The name of the link
- * @return The path pointed by link or NULL
+ * @brief Get the path pointed by the given link.
+ *
+ * @param  lnk The name of the link.
+ * @return The path pointed by link or NULL.
+ *
+ * This function returns the path pointed by @p link as a newly
+ * allocated string. This function does not work on Windows. On
+ * failure, the function returns @c NULL. When not needed anymore, the
+ * returned value must be freed.
  */
 EAPI char *
-ecore_file_readlink(const char *link)
+ecore_file_readlink(const char *lnk)
 {
-   char                buf[PATH_MAX];
-   int                 count;
+   char buf[PATH_MAX];
+   int count;
 
-   if ((count = readlink(link, buf, sizeof(buf))) < 0) return NULL;
+   if ((count = readlink(lnk, buf, sizeof(buf) - 1)) < 0) return NULL;
    buf[count] = 0;
    return strdup(buf);
 }
 
 /**
- * Get the list of the files and directories in a given directory. The list
- * will be sorted with strcoll as compare function. That means that you may
- * want to set the current locale for the category LC_COLLATE with setlocale().
- * For more information see the manual pages of strcoll and setlocale.
- * The list will not contain the directory entries for '.' and '..'.
+ * @brief Get the list of the files and directories in the given
+ * directory.
+ *
  * @param  dir The name of the directory to list
- * @return Return an Ecore_List containing all the files in the directory;
+ * @return Return an Eina_List containing all the files in the directory;
  *         on failure it returns NULL.
+ *
+ * This function returns a list of allocated strings of all the files
+ * and directories contained in @p dir. The list will be sorted with
+ * strcoll as compare function. That means that you may want to set
+ * the current locale for the category LC_COLLATE with
+ * setlocale(). For more information see the manual pages of strcoll
+ * and setlocale. The list will not contain the directory entries for
+ * '.' and '..'. On failure, @c NULL is returned. When not needed
+ * anymore, the list elements must be freed.
  */
-EAPI Ecore_List *
+EAPI Eina_List *
 ecore_file_ls(const char *dir)
 {
-   char               *f;
-   DIR                *dirp;
-   struct dirent      *dp;
-   Ecore_List         *list;
+   Eina_File_Direct_Info *info;
+   Eina_Iterator *ls;
+   Eina_List *list = NULL;
 
-   dirp = opendir(dir);
-   if (!dirp) return NULL;
+   ls = eina_file_direct_ls(dir);
+   if (!ls) return NULL;
 
-   list = ecore_list_new();
-   ecore_list_free_cb_set(list, free);
-
-   while ((dp = readdir(dirp)))
+   EINA_ITERATOR_FOREACH(ls, info)
      {
-       if ((strcmp(dp->d_name, ".")) && (strcmp(dp->d_name, "..")))
-         {
-              f = strdup(dp->d_name);
-              ecore_list_append(list, f);
-         }
+        char *f;
+
+        f = strdup(info->path + info->name_start);
+        list = eina_list_append(list, f);
      }
-   closedir(dirp);
+   eina_iterator_free(ls);
 
-   ecore_list_sort(list, ECORE_COMPARE_CB(strcoll), ECORE_SORT_MIN);
+   list = eina_list_sort(list, eina_list_count(list), EINA_COMPARE_CB(strcoll));
 
-   ecore_list_first_goto(list);
    return list;
 }
 
 /**
- * FIXME: To be documented.
+ * @brief Return the executable from the given command.
+ *
+ * @param app The application command, with parameters.
+ * @return The executable from @p app as a newly allocated string. Arguments 
+ * are removed and escape characters are handled. If @p app is @c NULL, or 
+ * on failure, the function returns @c NULL. When not needed anymore, the 
+ * returned value must be freed.
  */
 EAPI char *
 ecore_file_app_exe_get(const char *app)
@@ -500,65 +858,65 @@ ecore_file_app_exe_get(const char *app)
 
    p = (char *)app;
 restart:
-   while ((*p) && (isspace(*p))) p++;
+   while ((*p) && (isspace((unsigned char)*p))) p++;
    exe1 = p;
    while (*p)
      {
-       if (in_quot_sing)
-         {
-            if (*p == '\'')
-              in_quot_sing = 0;
-         }
-       else if (in_quot_dbl)
-         {
-            if (*p == '\"')
-              in_quot_dbl = 0;
-         }
-       else
-         {
-            if (*p == '\'')
-              in_quot_sing = 1;
-            else if (*p == '\"')
-              in_quot_dbl = 1;
-            if ((isspace(*p)) && (!((p > app) && (p[-1] != '\\'))))
-              break;
-         }
-       p++;
+        if (in_quot_sing)
+          {
+             if (*p == '\'')
+               in_quot_sing = 0;
+          }
+        else if (in_quot_dbl)
+          {
+             if (*p == '\"')
+               in_quot_dbl = 0;
+          }
+        else
+          {
+             if (*p == '\'')
+               in_quot_sing = 1;
+             else if (*p == '\"')
+               in_quot_dbl = 1;
+             if ((isspace((unsigned char)*p)) && ((p <= app) || (p[-1] == '\\')))
+               break;
+          }
+        p++;
      }
    exe2 = p;
    if (exe2 == exe1) return NULL;
    if (*exe1 == '~')
      {
-       char *homedir;
-       int len;
-
-       /* Skip ~ */
-       exe1++;
-
-       homedir = getenv("HOME");
-       if (!homedir) return NULL;
-       len = strlen(homedir);
-       if (exe) free(exe);
-       exe = malloc(len + exe2 - exe1 + 2);
-       if (!exe) return NULL;
-       pp = exe;
-       if (len)
-         {
-            strcpy(exe, homedir);
-            pp += len;
-            if (*(pp - 1) != '/')
-              {
-                 *pp = '/';
-                 pp++;
-              }
-         }
+        char *homedir;
+        int len;
+
+        /* Skip ~ */
+        exe1++;
+
+        homedir = getenv("HOME");
+        if (!homedir) return NULL;
+        len = strlen(homedir);
+        if (exe) free(exe);
+        exe = malloc(len + exe2 - exe1 + 2);
+        if (!exe) return NULL;
+        pp = exe;
+        if (len)
+          {
+             strcpy(exe, homedir);
+             pp += len;
+             if (*(pp - 1) != '/')
+               {
+                  *pp = '/';
+                  pp++;
+               }
+          }
      }
    else
      {
-       if (exe) free(exe);
-       exe = malloc(exe2 - exe1 + 1);
-       if (!exe) return NULL;
-       pp = exe;
+        if (exe) free(exe);
+        exe = malloc(exe2 - exe1 + 1);
+        if (!exe) return NULL;
+        pp = exe;
      }
    p = exe1;
    restart = 0;
@@ -566,79 +924,85 @@ restart:
    in_quot_sing = 0;
    while (*p)
      {
-       if (in_quot_sing)
-         {
-            if (*p == '\'')
-              in_quot_sing = 0;
-            else
-              {
-                 *pp = *p;
-                 pp++;
-              }
-         }
-       else if (in_quot_dbl)
-         {
-            if (*p == '\"')
-              in_quot_dbl = 0;
-            else
-              {
-                 /* techcincally this is wrong. double quotes also accept
-                  * special chars:
-                  *
-                  * $, `, \
-                  */
-                 *pp = *p;
-                 pp++;
-              }
-         }
-       else
-         {
-            /* technically we should handle special chars:
-             *
-             * $, `, \, etc.
-             */
-            if ((p > exe1) && (p[-1] == '\\'))
-              {
-                 if (*p != '\n')
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            else if ((p > exe1) && (*p == '='))
-              {
-                 restart = 1;
-                 *pp = *p;
-                 pp++;
-              }
-            else if (*p == '\'')
-              in_quot_sing = 1;
-            else if (*p == '\"')
-              in_quot_dbl = 1;
-            else if (isspace(*p))
-              {
-                 if (restart)
-                   goto restart;
-                 else
-                   break;
-              }
-            else
-              {
-                 *pp = *p;
-                 pp++;
-              }
-         }
-       p++;
+        if (in_quot_sing)
+          {
+             if (*p == '\'')
+               in_quot_sing = 0;
+             else
+               {
+                  *pp = *p;
+                  pp++;
+               }
+          }
+        else if (in_quot_dbl)
+          {
+             if (*p == '\"')
+               in_quot_dbl = 0;
+             else
+               {
+                  /* technically this is wrong. double quotes also accept
+                   * special chars:
+                   *
+                   * $, `, \
+                   */
+                  *pp = *p;
+                  pp++;
+               }
+          }
+        else
+          {
+             /* technically we should handle special chars:
+              *
+              * $, `, \, etc.
+              */
+             if ((p > exe1) && (p[-1] == '\\'))
+               {
+                  if (*p != '\n')
+                    {
+                       *pp = *p;
+                       pp++;
+                    }
+               }
+             else if ((p > exe1) && (*p == '='))
+               {
+                  restart = 1;
+                  *pp = *p;
+                  pp++;
+               }
+             else if (*p == '\'')
+               in_quot_sing = 1;
+             else if (*p == '\"')
+               in_quot_dbl = 1;
+             else if (isspace((unsigned char)*p))
+               {
+                  if (restart)
+                    goto restart;
+                  else
+                    break;
+               }
+             else
+               {
+                  *pp = *p;
+                  pp++;
+               }
+          }
+        p++;
      }
    *pp = 0;
    return exe;
 }
 
 /**
- * Add the escape sequence ('\\') to the given filename
- * @param  filename The file name
- * @return The file name with special characters escaped; if the length of the
- *         resulting string is longer than PATH_MAX it will return NULL
+ * @brief Add the escape sequence ('\\') to the given file name.
+ *
+ * @param  filename The file name.
+ * @return The file name with special characters escaped.
+ *
+ * This function adds the escape sequence ('\\') to the given file
+ * name and returns the result as a newly allocated string. If the
+ * length of the returned string is longer than PATH_MAX, or on
+ * failure, @c NULL is returned. When not needed anymore, the returned
+ * value must be freed.
  */
 EAPI char *
 ecore_file_escape_name(const char *filename)
@@ -647,84 +1011,123 @@ ecore_file_escape_name(const char *filename)
    char *q;
    char buf[PATH_MAX];
 
+   EINA_SAFETY_ON_NULL_RETURN_VAL(filename, NULL);
+
    p = filename;
    q = buf;
    while (*p)
      {
-       if ((q - buf) > (PATH_MAX - 6)) return NULL;
-       if (
-           (*p == ' ') || (*p == '\t') || (*p == '\n') ||
-           (*p == '\\') || (*p == '\'') || (*p == '\"') ||
-           (*p == ';') || (*p == '!') || (*p == '#') ||
-           (*p == '$') || (*p == '%') || (*p == '&') ||
-           (*p == '*') || (*p == '(') || (*p == ')') ||
-           (*p == '[') || (*p == ']') || (*p == '{') ||
-           (*p == '}') || (*p == '|') || (*p == '<') ||
-           (*p == '>') || (*p == '?')
-           )
-         {
-            *q = '\\';
-            q++;
-         }
-       *q = *p;
-       q++;
-       p++;
+        if ((q - buf) > (PATH_MAX - 6)) return NULL;
+        if (
+            (*p == ' ') || (*p == '\\') || (*p == '\'') ||
+            (*p == '\"') || (*p == ';') || (*p == '!') ||
+            (*p == '#') || (*p == '$') || (*p == '%') ||
+            (*p == '&') || (*p == '*') || (*p == '(') ||
+            (*p == ')') || (*p == '[') || (*p == ']') ||
+            (*p == '{') || (*p == '}') || (*p == '|') ||
+            (*p == '<') || (*p == '>') || (*p == '?')
+            )
+          {
+             *q = '\\';
+             q++;
+          }
+        else if (*p == '\t')
+          {
+             *q = '\\';
+             q++;
+             *q = '\\';
+             q++;
+             *q = 't';
+             q++;
+             p++;
+             continue;
+          }
+        else if (*p == '\n')
+          {
+            *q = '\\';
+            q++;
+            *q = '\\';
+            q++;
+            *q = 'n';
+            q++;
+            p++;
+           continue;
+          }
+
+        *q = *p;
+        q++;
+        p++;
      }
    *q = 0;
    return strdup(buf);
 }
 
 /**
- * Remove the extension from a given path
- * @param  path The name of the file
- * @return A newly allocated string with the extension stripped out or NULL on errors
+ * @brief Remove the extension from the given file name.
+ *
+ * @param  path The name of the file.
+ * @return A newly allocated string with the extension stripped out or
+ * @c NULL on errors.
+ *
+ * This function removes the extension from @p path and returns the
+ * result as a newly allocated string. If @p path is @c NULL, or on
+ * failure, the function returns @c NULL. When not needed anymore, the
+ * returned value must be freed.
  */
 EAPI char *
 ecore_file_strip_ext(const char *path)
 {
    char *p, *file = NULL;
 
+   if (!path)
+     return NULL;
+
    p = strrchr(path, '.');
    if (!p)
-     {
-       file = strdup(path);
-     }
+     file = strdup(path);
    else if (p != path)
      {
-       file = malloc(((p - path) + 1) * sizeof(char));
-       if (file)
-         {
-            memcpy(file, path, (p - path));
-            file[p - path] = 0;
-         }
+        file = malloc(((p - path) + 1) * sizeof(char));
+        if (file)
+          {
+             memcpy(file, path, (p - path));
+             file[p - path] = 0;
+          }
      }
 
    return file;
 }
 
 /**
- * Check if the given directory is empty. The '.' and '..' files will be ignored.
- * @param  dir The name of the directory to check
- * @return 1 if directory is empty, 0 if it has at least one file or -1 in case of errors
+ * @brief Check if the given directory is empty.
+ *
+ * @param  dir The name of the directory to check.
+ * @return @c 1 if directory is empty, @c 0 if it has at least one file or
+ * @c -1 in case of errors.
+ *
+ * This functions checks if @p dir is empty. The '.' and '..' files
+ * will be ignored. If @p dir is empty, 1 is returned, if it contains
+ * at least one file, @c 0 is returned. On failure, @c -1 is returned.
  */
 EAPI int
 ecore_file_dir_is_empty(const char *dir)
 {
-   DIR *dirp;
-   struct dirent *dp;
+   Eina_File_Direct_Info *info;
+   Eina_Iterator *it;
 
-   dirp = opendir(dir);
-   if (!dirp) return -1;
+   it = eina_file_direct_ls(dir);
+   if (!it) return -1;
 
-   while ((dp = readdir(dirp)))
+   EINA_ITERATOR_FOREACH(it, info)
      {
-       if ((strcmp(dp->d_name, ".")) && (strcmp(dp->d_name, "..")))
-         {
-            closedir(dirp);
-            return 0;
-         }
+        eina_iterator_free(it);
+        return 0;
      }
-   
-   closedir(dirp);
+
+   eina_iterator_free(it);
    return 1;
 }
+
+/**
+ * @}
+ */
index e0472f0..03e593b 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
-#include "Ecore_Con.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef BUILD_ECORE_CON
+# include "Ecore_Con.h"
+#endif
+
 #include "ecore_file_private.h"
 
-#define ECORE_MAGIC_FILE_DOWNLOAD_JOB  0xf7427cb8
+#ifdef BUILD_ECORE_CON
+
+#define ECORE_MAGIC_FILE_DOWNLOAD_JOB 0xf7427cb8
+#define ECORE_FILE_DOWNLOAD_TIMEOUT 30
 
-typedef struct _Ecore_File_Download_Job                Ecore_File_Download_Job;
 struct _Ecore_File_Download_Job
 {
    ECORE_MAGIC;
 
-   Ecore_Con_Url       *url_con;
-   FILE                        *file;
+   Ecore_Con_Url        *url_con;
+   FILE                 *file;
 
-   char                        *dst;
+   char                 *dst;
 
-   void        (*completion_cb)(void *data, const char *file, int status);
-
-   int (*progress_cb)  (void *data, const char *file,
-                        long int dltotal, long int dlnow,
-                        long int ultotal, long int ulnow);
+   Ecore_File_Download_Completion_Cb completion_cb;
+   Ecore_File_Download_Progress_Cb progress_cb;
 };
 
 #ifdef HAVE_CURL
 Ecore_File_Download_Job *_ecore_file_download_curl(const char *url, const char *dst,
-                                                  void (*completion_cb)(void *data, const char *file, int status),
-                                                  int (*progress_cb)(void *data, const char *file, long int dltotal, long int dlnow, long int ultotal, long int ulnow),
-                                                  void *data);
+                                                   Ecore_File_Download_Completion_Cb completion_cb,
+                                                   Ecore_File_Download_Progress_Cb progress_cb,
+                                                   void *data,
+                                                   Eina_Hash *headers);
 
-static int _ecore_file_download_url_complete_cb(void *data, int type, void *event);
-static int _ecore_file_download_url_progress_cb(void *data, int type, void *event);
+static Eina_Bool _ecore_file_download_url_complete_cb(void *data, int type, void *event);
+static Eina_Bool _ecore_file_download_url_progress_cb(void *data, int type, void *event);
 #endif
-static void _ecore_file_download_abort(Ecore_File_Download_Job *job);
 
-static int                      init = 0;
-static Ecore_Event_Handler     *_url_complete_handler = NULL;
-static Ecore_Event_Handler     *_url_progress_download = NULL;
-static Ecore_List              *_job_list;
+static Ecore_Event_Handler *_url_complete_handler = NULL;
+static Ecore_Event_Handler *_url_progress_download = NULL;
+static Eina_List           *_job_list;
+
+static int download_init = 0;
+
+#endif /* BUILD_ECORE_CON */
 
-EAPI int
+int
 ecore_file_download_init(void)
 {
-#ifndef _WIN32
-   ecore_con_url_init();
-
-   if (init++ == 0)
-     {
-#ifdef HAVE_CURL
-       _url_complete_handler = ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _ecore_file_download_url_complete_cb, NULL);
-       _url_progress_download = ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _ecore_file_download_url_progress_cb, NULL);
-#endif
-     }
-   if (!_job_list)
+#ifdef BUILD_ECORE_CON
+   download_init++;
+   if (download_init > 1) return 1;
+   if (!ecore_con_init()) return 0;
+   if (!ecore_con_url_init())
      {
-       _job_list = ecore_list_new();
-       if (!_job_list) return 0;
+        ecore_con_shutdown();
+        return 0;
      }
-
+# ifdef HAVE_CURL
+   _url_complete_handler = ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _ecore_file_download_url_complete_cb, NULL);
+   _url_progress_download = ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _ecore_file_download_url_progress_cb, NULL);
+# endif
+#endif /* BUILD_ECORE_CON */
    return 1;
-#else
-   return 0;
-#endif
 }
 
-EAPI int
+void
 ecore_file_download_shutdown(void)
 {
-#ifndef _WIN32
-   if (--init == 0)
-     {
-       if (_url_complete_handler)
-         ecore_event_handler_del(_url_complete_handler);
-       if (_url_progress_download)
-         ecore_event_handler_del(_url_progress_download);
-       _url_complete_handler = NULL;
-       _url_progress_download = NULL;
-       if (_job_list)
-         ecore_list_destroy(_job_list);
-       _job_list = NULL;
-     }
-
-   return ecore_con_url_shutdown();
-#else
-   return 0;
-#endif
+#ifdef BUILD_ECORE_CON
+   download_init--;
+   if (download_init > 0) return;
+   if (_url_complete_handler)
+     ecore_event_handler_del(_url_complete_handler);
+   if (_url_progress_download)
+     ecore_event_handler_del(_url_progress_download);
+   _url_complete_handler = NULL;
+   _url_progress_download = NULL;
+   ecore_file_download_abort_all();
+   ecore_con_url_shutdown();
+   ecore_con_shutdown();
+#endif /* BUILD_ECORE_CON */
 }
 
-EAPI void
-ecore_file_download_abort_all(void)
+#ifdef BUILD_ECORE_CON
+# ifdef HAVE_CURL
+static Eina_Bool
+_ecore_file_download_headers_foreach_cb(const Eina_Hash *hash __UNUSED__, const void *key, void *data, void *fdata)
 {
-   if (!ecore_list_empty_is(_job_list))
-     {
-       Ecore_File_Download_Job *job;
+   Ecore_File_Download_Job *job = fdata;
+   ecore_con_url_additional_header_add(job->url_con, key, data);
 
-       while ((job = ecore_list_first_remove(_job_list)))
-         {
-            _ecore_file_download_abort(job);
-         }
-     }
-   ecore_list_clear(_job_list);
+   return EINA_TRUE;
 }
+# endif
+#endif
 
-/**
- * Download @p url to the given @p dst
- * @param  url The complete url to download
- * @param  dst The local file to save the downloaded to
- * @param  completion_cb A callback called on download complete
- * @param  progress_cb A callback called during the download operation
- * @return 1 if the download start or 0 on failure
- *
- * You must provide the full url, including 'http://', 'ftp://' or 'file://'.\n
- * If @p dst already exist it will not be overwritten and the function will fail.\n
- * Ecore must be compiled with CURL to download using http and ftp protocols.
- */
-EAPI int
-ecore_file_download(const char *url, const char *dst,
-                   void (*completion_cb)(void *data, const char *file, int status),
-                   int (*progress_cb)(void *data, const char *file, long int dltotal, long int dlnow, long int ultotal, long int ulnow),
-                   void *data)
+static Eina_Bool
+_ecore_file_download(const char *url,
+                     const char *dst,
+                     Ecore_File_Download_Completion_Cb completion_cb,
+                     Ecore_File_Download_Progress_Cb progress_cb,
+                     void *data,
+                     Ecore_File_Download_Job **job_ret,
+                     Eina_Hash *headers)
 {
+#ifdef BUILD_ECORE_CON
+   if (!url)
+     {
+        CRIT("Download URL is null");
+        return EINA_FALSE;
+     }
+
    char *dir = ecore_file_dir_get(dst);
 
    if (!ecore_file_is_dir(dir))
      {
-       free(dir);
-       return 0;
+        ERR("%s is not a directory", dir);
+        free(dir);
+        return EINA_FALSE;
      }
    free(dir);
-   if (ecore_file_exists(dst)) return 0;
+   if (ecore_file_exists(dst))
+     {
+        WRN("%s already exists", dst);
+        return EINA_FALSE;
+     }
 
-   /* FIXME: Add handlers for http and ftp! */
    if (!strncmp(url, "file://", 7))
      {
-       /* FIXME: Maybe fork? Might take a while to copy.
-        * Check filesize? */
-       /* Just copy it */
-
-       url += 7;
-       /* skip hostname */
-       url = strchr(url, '/');
-       return ecore_file_cp(url, dst);
+        /* FIXME: Maybe fork? Might take a while to copy.
+         * Check filesize? */
+        /* Just copy it */
+
+        url += 7;
+        /* skip hostname */
+        url = strchr(url, '/');
+        return ecore_file_cp(url, dst);
      }
-#ifdef HAVE_CURL
-   else if ((!strncmp(url, "http://", 7)) ||
-           (!strncmp(url, "ftp://", 6)))
+# ifdef HAVE_CURL
+   else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
+            (!strncmp(url, "ftp://", 6)))
      {
-       /* download */
-       Ecore_File_Download_Job *job;
-
-       job = _ecore_file_download_curl(url, dst, completion_cb, progress_cb, data);
-       if (job)
-         return 1;
-       else
-         return 0;
+        /* download */
+        Ecore_File_Download_Job *job;
+
+       job = _ecore_file_download_curl(url, dst, completion_cb, progress_cb, data, headers);
+        if(job_ret) *job_ret = job;
+        if(job)
+          return EINA_TRUE;
+        else
+          {
+             ERR("no job returned\n");
+             return EINA_FALSE;
+          }
+        return job ? EINA_TRUE : EINA_FALSE;
      }
-#endif
+# else
+   else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
+            (!strncmp(url, "ftp://", 6)))
+     {
+        (void)completion_cb;
+        (void)progress_cb;
+        (void)data;
+        (void)job_ret;
+        (void)headers;
+        return EINA_FALSE;
+     }
+# endif
    else
      {
-       return 0;
+        return EINA_FALSE;
      }
-#ifndef HAVE_CURL
-   completion_cb = NULL;
-   progress_cb = NULL;
-   data = NULL;
-#endif
+#else
+   (void)url;
+   (void)dst;
+   (void)completion_cb;
+   (void)progress_cb;
+   (void)data;
+   (void)job_ret;
+   (void)headers;
+   return EINA_FALSE;
+#endif /* BUILD_ECORE_CON */
+}
+
+/**
+ * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
+ *
+ * @{
+ */
+
+/**
+ * @brief Download the given url to the given destination.
+ *
+ * @param  url The complete url to download.
+ * @param  dst The local file to save the downloaded to.
+ * @param  completion_cb A callback called on download complete.
+ * @param  progress_cb A callback called during the download operation.
+ * @param  data User data passed to both callbacks.
+ * @param  job_ret Job used to abort the download.
+ * @return @c EINA_TRUE if the download start or @c EINA_FALSE on failure.
+ *
+ * This function starts the download of the URL @p url and saves it to
+ * @p dst. @p url must provide the protocol, including 'http://',
+ * 'ftp://' or 'file://'. Ecore_File must be compiled with CURL to
+ * download using http and ftp protocols. If @p dst is ill-formed, or
+ * if it already exists, the function returns @c EINA_FALSE. When the
+ * download is complete, the callback @p completion_cb is called and
+ * @p data is passed to it. The @p status parameter of @p completion_cb
+ * will be filled with the status of the download (200, 404,...). The
+ * @p progress_cb is called during the download operation, each time a
+ * packet is received or when CURL wants. It can be used to display the
+ * percentage of the downloaded file. Return 0 from this callback, if provided,
+ * to continue the operation or anything else to abort the download. The only
+ * operations that can be aborted are those with protocol 'http' or 'ftp'. In
+ * that case @p job_ret can be filled. It can be used with
+ * ecore_file_download_abort() or ecore_file_download_abort_all() to
+ * respectively abort one or all download operations. This function returns
+ * @c EINA_TRUE if the download starts, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_file_download(const char *url,
+                    const char *dst,
+                    Ecore_File_Download_Completion_Cb completion_cb,
+                    Ecore_File_Download_Progress_Cb progress_cb,
+                    void *data,
+                    Ecore_File_Download_Job **job_ret)
+{
+   return _ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, NULL);
+}
+
+/**
+ * @brief Download the given url to the given destination with additional headers.
+ *
+ * @param  url The complete url to download.
+ * @param  dst The local file to save the downloaded to.
+ * @param  completion_cb A callback called on download complete.
+ * @param  progress_cb A callback called during the download operation.
+ * @param  data User data passed to both callbacks.
+ * @param  job_ret Job used to abort the download.
+ * @param  headers pointer of header lists.
+ * @return @c EINA_TRUE if the download start or @c EINA_FALSE on failure.
+ */
+EAPI Eina_Bool
+ecore_file_download_full(const char *url,
+                         const char *dst,
+                         Ecore_File_Download_Completion_Cb completion_cb,
+                         Ecore_File_Download_Progress_Cb progress_cb,
+                         void *data,
+                         Ecore_File_Download_Job **job_ret,
+                         Eina_Hash *headers)
+{
+   return _ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, headers);
 }
 
 /**
- * Check if the given protocol is available
- * @param  protocol The protocol to check
- * @return 1 if protocol is handled or 0 if not
+ * @brief Check if the given protocol is available.
+ *
+ * @param  protocol The protocol to check.
+ * @return @c EINA_TRUE if protocol is handled, @c EINA_FALSE otherwise.
  *
- * @p protocol can be 'http://', 'ftp://' or 'file://'.\n
- * Ecore must be compiled with CURL to handle http and ftp protocols.
+ * This function returns @c EINA_TRUE if @p protocol is supported,
+ * @c EINA_FALSE otherwise. @p protocol can be 'http://', 'ftp://' or
+ * 'file://'. Ecore_FILE must be compiled with CURL to handle http and
+ * ftp protocols.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_download_protocol_available(const char *protocol)
 {
-   if (!strncmp(protocol, "file://", 7)) return 1;
-#ifdef HAVE_CURL
-   else if (!strncmp(protocol, "http://", 7)) return 1;
-   else if (!strncmp(protocol, "ftp://", 6)) return 1;
-#endif
+#ifdef BUILD_ECORE_CON
+   if (!strncmp(protocol, "file://", 7)) return EINA_TRUE;
+# ifdef HAVE_CURL
+   else if (!strncmp(protocol, "http://", 7)) return EINA_TRUE;
+   else if (!strncmp(protocol, "ftp://", 6)) return EINA_TRUE;
+# endif
+#else
+   (void)protocol;
+#endif /* BUILD_ECORE_CON */
 
-   return 0;
+   return EINA_FALSE;
 }
 
-#ifdef HAVE_CURL
+#ifdef BUILD_ECORE_CON
+
+# ifdef HAVE_CURL
 static int
 _ecore_file_download_url_compare_job(const void *data1, const void *data2)
 {
-   const Ecore_File_Download_Job       *job = data1;
-   const Ecore_Con_Url                 *url = data2;
+   const Ecore_File_Download_Job *job = data1;
+   const Ecore_Con_Url           *url = data2;
 
    if (job->url_con == url) return 0;
    return -1;
 }
 
-static int
-_ecore_file_download_url_complete_cb(void *data, int type, void *event)
+static Eina_Bool
+_ecore_file_download_url_complete_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   Ecore_Con_Event_Url_Complete        *ev = event;
-   Ecore_File_Download_Job     *job;
+   Ecore_Con_Event_Url_Complete *ev = event;
+   Ecore_File_Download_Job      *job;
 
-   job = ecore_list_find(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
-   if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return 1;
-
-   ecore_list_remove(_job_list);
+   job = eina_list_search_unsorted(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
+   if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return ECORE_CALLBACK_PASS_ON;
 
+   fclose(job->file);
    if (job->completion_cb)
-     job->completion_cb(ecore_con_url_data_get(job->url_con), job->dst, !ev->status);
+     job->completion_cb(ecore_con_url_data_get(job->url_con), job->dst, ev->status);
 
-   _ecore_file_download_abort(job);
+   _job_list = eina_list_remove(_job_list, job);
+   free(job->dst);
+   ecore_con_url_free(job->url_con);
+   free(job);
 
-   return 0;
+   return ECORE_CALLBACK_DONE;
 }
 
-static int
-_ecore_file_download_url_progress_cb(void *data, int type, void *event)
+static Eina_Bool
+_ecore_file_download_url_progress_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
 /* this reports the downloads progress. if we return 0, then download
  * continues, if we return anything else, then the download stops */
-   Ecore_Con_Event_Url_Progress        *ev = event;
-   Ecore_File_Download_Job     *job;
+   Ecore_Con_Event_Url_Progress *ev = event;
+   Ecore_File_Download_Job      *job;
 
-   job = ecore_list_find(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
-   if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return 1;
+   job = eina_list_search_unsorted(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
+   if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return ECORE_CALLBACK_PASS_ON;
 
    if (job->progress_cb)
      if (job->progress_cb(ecore_con_url_data_get(job->url_con), job->dst,
-                         (long int) ev->down.total, (long int) ev->down.now,
-                         (long int) ev->up.total, (long int) ev->up.now) != 0)
+                          (long int) ev->down.total, (long int) ev->down.now,
+                          (long int) ev->up.total, (long int) ev->up.now) != 0)
        {
-         ecore_list_remove(_job_list);
-         _ecore_file_download_abort(job);
+          _job_list = eina_list_remove(_job_list, job);
+          fclose(job->file);
+          free(job->dst);
+          free(job);
+
+          return ECORE_CALLBACK_PASS_ON;
        }
 
-   return 0;
+   return ECORE_CALLBACK_DONE;
 }
 
 Ecore_File_Download_Job *
 _ecore_file_download_curl(const char *url, const char *dst,
-                         void (*completion_cb)(void *data, const char *file,
-                                               int status),
-                         int (*progress_cb)(void *data, const char *file,
-                                            long int dltotal, long int dlnow,
-                                            long int ultotal, long int ulnow),
-                         void *data)
+                          Ecore_File_Download_Completion_Cb completion_cb,
+                          Ecore_File_Download_Progress_Cb progress_cb,
+                          void *data,
+                          Eina_Hash *headers)
 {
    Ecore_File_Download_Job *job;
 
@@ -264,17 +363,18 @@ _ecore_file_download_curl(const char *url, const char *dst,
    job->file = fopen(dst, "wb");
    if (!job->file)
      {
-       free(job);
-       return NULL;
+        free(job);
+        return NULL;
      }
    job->url_con = ecore_con_url_new(url);
    if (!job->url_con)
      {
-       fclose(job->file);
-       free(job);
-       return NULL;
+        fclose(job->file);
+        free(job);
+        return NULL;
      }
 
+   if (headers) eina_hash_foreach(headers, _ecore_file_download_headers_foreach_cb, job);
    ecore_con_url_fd_set(job->url_con, fileno(job->file));
    ecore_con_url_data_set(job->url_con, data);
 
@@ -282,21 +382,74 @@ _ecore_file_download_curl(const char *url, const char *dst,
 
    job->completion_cb = completion_cb;
    job->progress_cb = progress_cb;
-   ecore_list_append(_job_list, job);
+   _job_list = eina_list_append(_job_list, job);
 
-   ecore_con_url_send(job->url_con, NULL, 0, NULL);
+   if (!ecore_con_url_get(job->url_con))
+     {
+        ecore_con_url_free(job->url_con);
+        _job_list = eina_list_remove(_job_list, job);
+        fclose(job->file);
+        ecore_file_remove(job->dst);
+        free(job->dst);
+        free(job);
+        return NULL;
+     }
 
    return job;
 }
+# endif
 #endif
 
-static void
-_ecore_file_download_abort(Ecore_File_Download_Job *job)
+/**
+ * @brief Abort the given download job and call the completion_cb
+ * callbck with a status of 1 (error).
+ *
+ * @param job The download job to abort.
+ *
+ * This function aborts a download operation started by
+ * ecore_file_download(). @p job is the #Ecore_File_Download_Job
+ * structure filled by ecore_file_download(). If it is @c NULL, this
+ * function does nothing. To abort all the currently downloading
+ * operations, call ecore_file_download_abort_all().
+ */
+EAPI void
+ecore_file_download_abort(Ecore_File_Download_Job *job)
 {
-#ifdef HAVE_CURL
-   ecore_con_url_destroy(job->url_con);
-#endif  
+   if (!job)
+     return;
+
+#ifdef BUILD_ECORE_CON
+   if (job->completion_cb)
+     job->completion_cb(ecore_con_url_data_get(job->url_con), job->dst, 1);
+# ifdef HAVE_CURL
+   ecore_con_url_free(job->url_con);
+# endif
+   _job_list = eina_list_remove(_job_list, job);
    fclose(job->file);
    free(job->dst);
    free(job);
+#endif /* BUILD_ECORE_CON */
 }
+
+/**
+ * @brief Abort all downloads.
+ *
+ * This function aborts all the downloads that have been started by
+ * ecore_file_download(). It loops over the started downloads and call
+ * ecore_file_download_abort() for each of them. To abort only one
+ * specific download operation, call ecore_file_download_abort().
+ */
+EAPI void
+ecore_file_download_abort_all(void)
+{
+#ifdef BUILD_ECORE_CON
+   Ecore_File_Download_Job *job;
+
+   EINA_LIST_FREE(_job_list, job)
+             ecore_file_download_abort(job);
+#endif /* BUILD_ECORE_CON */
+}
+
+/**
+ * @}
+ */
index 32c1b20..8b07589 100644 (file)
@@ -1,20 +1,17 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
 #include "ecore_file_private.h"
 
-static int init = 0;
-
 typedef enum {
      ECORE_FILE_MONITOR_TYPE_NONE,
 #ifdef HAVE_INOTIFY
      ECORE_FILE_MONITOR_TYPE_INOTIFY,
 #endif
+#ifdef HAVE_NOTIFY_WIN32
+     ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32,
+#endif
 #ifdef HAVE_POLL
      ECORE_FILE_MONITOR_TYPE_POLL
 #endif
@@ -25,106 +22,159 @@ static Ecore_File_Monitor_Type monitor_type = ECORE_FILE_MONITOR_TYPE_NONE;
 int
 ecore_file_monitor_init(void)
 {
-   if (++init != 1) return init;
-
 #ifdef HAVE_INOTIFY
    monitor_type = ECORE_FILE_MONITOR_TYPE_INOTIFY;
    if (ecore_file_monitor_inotify_init())
-     return init;
+     return 1;
+#endif
+#ifdef HAVE_NOTIFY_WIN32
+   monitor_type = ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32;
+   if (ecore_file_monitor_win32_init())
+     return 1;
 #endif
 #ifdef HAVE_POLL
    monitor_type = ECORE_FILE_MONITOR_TYPE_POLL;
    if (ecore_file_monitor_poll_init())
-     return init;
+     return 1;
 #endif
    monitor_type = ECORE_FILE_MONITOR_TYPE_NONE;
-   return --init;
+   return 0;
 }
 
-int
+void
 ecore_file_monitor_shutdown(void)
 {
-   if (--init != 0) return init;
-
    switch (monitor_type)
      {
       case ECORE_FILE_MONITOR_TYPE_NONE:
-        break;
+         break;
 #ifdef HAVE_INOTIFY
       case ECORE_FILE_MONITOR_TYPE_INOTIFY:
-        ecore_file_monitor_inotify_shutdown();
-        break;
+         ecore_file_monitor_inotify_shutdown();
+         break;
+#endif
+#ifdef HAVE_NOTIFY_WIN32
+      case ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32:
+         ecore_file_monitor_win32_shutdown();
+         break;
 #endif
 #ifdef HAVE_POLL
       case ECORE_FILE_MONITOR_TYPE_POLL:
-        ecore_file_monitor_poll_shutdown();
-        break;
+         ecore_file_monitor_poll_shutdown();
+         break;
 #endif
      }
-   return init;
 }
 
 /**
- * Monitor a path using inotify or polling
- * @param  path The path to monitor
- * @param  func The function to call on changes
- * @param  data The data passed to func
- * @return An Ecore_File_Monitor pointer or NULL on failure
+ * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
+ *
+ * @{
+ */
+
+/**
+ * @brief Monitor the given path using inotify, Windows notification, or polling.
+ *
+ * @param  path The path to monitor.
+ * @param  func The function to call on changes.
+ * @param  data The data passed to func.
+ * @return An Ecore_File_Monitor pointer or NULL on failure.
+ *
+ * This function monitors @p path. If @p path is @c NULL, or is an
+ * empty string, or none of the notify methods (Inotify, Windows
+ * notification or polling) is available, or if @p path is not a file,
+ * the function returns @c NULL. Otherwise, it returns a newly
+ * allocated Ecore_File_Monitor object and the monitoring begins. When
+ * one of the Ecore_File_Event event is notified, @p func is called
+ * and @p data is passed to @p func. Call ecore_file_monitor_del() to
+ * stop the monitoring.
  */
 EAPI Ecore_File_Monitor *
-ecore_file_monitor_add(const char *path,
-                void (*func) (void *data, Ecore_File_Monitor *em,
-                      Ecore_File_Event event,
-                      const char *path),
-                void *data)
+ecore_file_monitor_add(const char           *path,
+                       Ecore_File_Monitor_Cb func,
+                       void                 *data)
 {
+   if (!path || !*path)
+     return NULL;
+
    switch (monitor_type)
      {
       case ECORE_FILE_MONITOR_TYPE_NONE:
-        return NULL;
+         return NULL;
 #ifdef HAVE_INOTIFY
       case ECORE_FILE_MONITOR_TYPE_INOTIFY:
-        return ecore_file_monitor_inotify_add(path, func, data);
+         return ecore_file_monitor_inotify_add(path, func, data);
+#endif
+#ifdef HAVE_NOTIFY_WIN32
+      case ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32:
+         return ecore_file_monitor_win32_add(path, func, data);
 #endif
 #ifdef HAVE_POLL
       case ECORE_FILE_MONITOR_TYPE_POLL:
-        return ecore_file_monitor_poll_add(path, func, data);
+         return ecore_file_monitor_poll_add(path, func, data);
 #endif
      }
    return NULL;
 }
 
 /**
- * Stop monitoring a path
- * @param  em The Ecore_File_Monitor to stop
+ * @brief Stop the monitoring of the given path.
+ *
+ * @param em The Ecore_File_Monitor to stop.
+ *
+ * This function stops the the monitoring of the path that has been
+ * monitored by ecore_file_monitor_add(). @p em must be the value
+ * returned by ecore_file_monitor_add(). If @p em is @c NULL, or none
+ * of the notify methods (Inotify, Windows notification or polling) is
+ * availablethis function does nothing.
  */
 EAPI void
 ecore_file_monitor_del(Ecore_File_Monitor *em)
 {
+   if (!em)
+     return;
+
    switch (monitor_type)
      {
       case ECORE_FILE_MONITOR_TYPE_NONE:
-        break;
+         break;
 #ifdef HAVE_INOTIFY
       case ECORE_FILE_MONITOR_TYPE_INOTIFY:
-        ecore_file_monitor_inotify_del(em);
-        break;
+         ecore_file_monitor_inotify_del(em);
+         break;
+#endif
+#ifdef HAVE_NOTIFY_WIN32
+      case ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32:
+         ecore_file_monitor_win32_del(em);
+         break;
 #endif
 #ifdef HAVE_POLL
       case ECORE_FILE_MONITOR_TYPE_POLL:
-        ecore_file_monitor_poll_del(em);
-        break;
+         ecore_file_monitor_poll_del(em);
+         break;
 #endif
      }
 }
 
 /**
- * Get the monitored path
- * @param  em The Ecore_File_Monitor to query
- * @return The path that is monitored by @p em
+ * @brief Get the monitored path.
+ *
+ * @param  em The Ecore_File_Monitor to query.
+ * @return The path that is monitored by @p em.
+ *
+ * This function returns the monitored path that has been
+ * monitored by ecore_file_monitor_add(). @p em must be the value
+ * returned by ecore_file_monitor_add(). If @p em is @c NULL, the
+ * function returns @c NULL.
  */
 EAPI const char *
 ecore_file_monitor_path_get(Ecore_File_Monitor *em)
 {
+   if (!em)
+     return NULL;
    return em->path;
 }
+
+/**
+ * @}
+ */
index 513ee2c..30226d3 100644 (file)
@@ -1,11 +1,13 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include "ecore_file_private.h"
 
 /*
@@ -15,6 +17,7 @@
  *   IN_ACCESS, IN_ATTRIB, IN_CLOSE_WRITE, IN_CLOSE_NOWRITE, IN_OPEN
  * - Read all events first, then call the callbacks. This will prevent several
  *   callbacks with the typic save cycle (delete file, new file)
+ * - Listen to IN_IGNORED, emitted when the watch is removed
  */
 
 #ifdef HAVE_INOTIFY
@@ -44,9 +47,10 @@ struct _Ecore_File_Monitor_Inotify
 };
 
 static Ecore_Fd_Handler *_fdh = NULL;
-static Ecore_List2    *_monitors = NULL;
+static Ecore_File_Monitor    *_monitors = NULL;
+static pid_t             _inotify_fd_pid = -1;
 
-static int                 _ecore_file_monitor_inotify_handler(void *data, Ecore_Fd_Handler *fdh);
+static Eina_Bool           _ecore_file_monitor_inotify_handler(void *data, Ecore_Fd_Handler *fdh);
 static Ecore_File_Monitor *_ecore_file_monitor_inotify_monitor_find(int wd);
 static void                _ecore_file_monitor_inotify_events(Ecore_File_Monitor *em, char *file, int mask);
 static int                 _ecore_file_monitor_inotify_monitor(Ecore_File_Monitor *em, const char *path);
@@ -64,13 +68,14 @@ ecore_file_monitor_inotify_init(void)
      return 0;
 
    _fdh = ecore_main_fd_handler_add(fd, ECORE_FD_READ, _ecore_file_monitor_inotify_handler,
-                                   NULL, NULL, NULL);
+                                    NULL, NULL, NULL);
    if (!_fdh)
      {
-       close(fd);
-       return 0;
+        close(fd);
+        return 0;
      }
 
+   _inotify_fd_pid = getpid();
    return 1;
 }
 
@@ -78,36 +83,38 @@ int
 ecore_file_monitor_inotify_shutdown(void)
 {
    int fd;
-   Ecore_List2 *l;
 
-   for (l = _monitors; l;)
-     {
-       Ecore_File_Monitor *em;
-
-       em = ECORE_FILE_MONITOR(l);
-       l = l->next;
-       ecore_file_monitor_inotify_del(em);
-     }
+   while(_monitors)
+        ecore_file_monitor_inotify_del(_monitors);
 
    if (_fdh)
      {
-       fd = ecore_main_fd_handler_fd_get(_fdh);
-       ecore_main_fd_handler_del(_fdh);
-       close(fd);
+        fd = ecore_main_fd_handler_fd_get(_fdh);
+        ecore_main_fd_handler_del(_fdh);
+        close(fd);
      }
+   _inotify_fd_pid = -1;
    return 1;
 }
 
 Ecore_File_Monitor *
 ecore_file_monitor_inotify_add(const char *path,
-                              void (*func) (void *data, Ecore_File_Monitor *em,
-                                            Ecore_File_Event event,
-                                            const char *path),
-                              void *data)
+                               void (*func) (void *data, Ecore_File_Monitor *em,
+                                             Ecore_File_Event event,
+                                             const char *path),
+                               void *data)
 {
    Ecore_File_Monitor *em;
    int len;
 
+   if (_inotify_fd_pid == -1) return NULL;
+
+   if (_inotify_fd_pid != getpid())
+     {
+        ecore_file_monitor_inotify_shutdown();
+        ecore_file_monitor_inotify_init();
+     }
+
    em = calloc(1, sizeof(Ecore_File_Monitor_Inotify));
    if (!em) return NULL;
 
@@ -119,17 +126,17 @@ ecore_file_monitor_inotify_add(const char *path,
    if (em->path[len - 1] == '/' && strcmp(em->path, "/"))
      em->path[len - 1] = 0;
 
-   _monitors = _ecore_list2_append(_monitors, em);
+   _monitors = ECORE_FILE_MONITOR(eina_inlist_append(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
 
    if (ecore_file_exists(em->path))
      {
-       if (!_ecore_file_monitor_inotify_monitor(em, em->path))
-         return NULL;
+        if (!_ecore_file_monitor_inotify_monitor(em, em->path))
+          return NULL;
      }
    else
      {
-       ecore_file_monitor_inotify_del(em);
-       return NULL;
+        ecore_file_monitor_inotify_del(em);
+        return NULL;
      }
 
    return em;
@@ -140,7 +147,8 @@ ecore_file_monitor_inotify_del(Ecore_File_Monitor *em)
 {
    int fd;
 
-   _monitors = _ecore_list2_remove(_monitors, em);
+   if (_monitors)
+     _monitors = ECORE_FILE_MONITOR(eina_inlist_remove(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
 
    fd = ecore_main_fd_handler_fd_get(_fdh);
    if (ECORE_FILE_MONITOR_INOTIFY(em)->wd)
@@ -149,7 +157,7 @@ ecore_file_monitor_inotify_del(Ecore_File_Monitor *em)
    free(em);
 }
 
-static int
+static Eina_Bool
 _ecore_file_monitor_inotify_handler(void *data __UNUSED__, Ecore_Fd_Handler *fdh)
 {
    Ecore_File_Monitor *em;
@@ -162,32 +170,28 @@ _ecore_file_monitor_inotify_handler(void *data __UNUSED__, Ecore_Fd_Handler *fdh
    size = read(ecore_main_fd_handler_fd_get(fdh), buffer, sizeof(buffer));
    while (i < size)
      {
-       event = (struct inotify_event *)&buffer[i];
-       event_size = sizeof(struct inotify_event) + event->len;
-       i += event_size;
+        event = (struct inotify_event *)&buffer[i];
+        event_size = sizeof(struct inotify_event) + event->len;
+        i += event_size;
 
-       em = _ecore_file_monitor_inotify_monitor_find(event->wd);
-       if (!em) continue;
+        em = _ecore_file_monitor_inotify_monitor_find(event->wd);
+        if (!em) continue;
 
-       _ecore_file_monitor_inotify_events(em, (event->len ? event->name : NULL), event->mask);
+        _ecore_file_monitor_inotify_events(em, (event->len ? event->name : NULL), event->mask);
      }
 
-   return 1;
+   return ECORE_CALLBACK_RENEW;
 }
 
 static Ecore_File_Monitor *
 _ecore_file_monitor_inotify_monitor_find(int wd)
 {
-   Ecore_List2 *l;
+   Ecore_File_Monitor *l;
 
-   for (l = _monitors; l; l = l->next)
+   EINA_INLIST_FOREACH(_monitors, l)
      {
-       Ecore_File_Monitor *em;
-
-       em = ECORE_FILE_MONITOR(l);
-
-       if (ECORE_FILE_MONITOR_INOTIFY(em)->wd == wd)
-         return em;
+        if (ECORE_FILE_MONITOR_INOTIFY(l)->wd == wd)
+          return l;
      }
    return NULL;
 }
@@ -205,86 +209,101 @@ _ecore_file_monitor_inotify_events(Ecore_File_Monitor *em, char *file, int mask)
    isdir = mask & IN_ISDIR;
 
 #if 0
-   _ecore_file_monitor_inotify_print(file, mask);
+   _ecore_file_monitor_inotify_print(buf, mask);
 #endif
 
+   if (mask & IN_ATTRIB)
+     {
+        em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
+     }
+   if (mask & IN_CLOSE_WRITE)
+     {
+        if (!isdir)
+          em->func(em->data, em, ECORE_FILE_EVENT_CLOSED, buf);
+     }
    if (mask & IN_MODIFY)
      {
-       if (!isdir)
-         em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
+        if (!isdir)
+          em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
      }
    if (mask & IN_MOVED_FROM)
      {
-       if (isdir)
-         em->func(em->data, em, ECORE_FILE_EVENT_DELETED_DIRECTORY, buf);
-       else
-         em->func(em->data, em, ECORE_FILE_EVENT_DELETED_FILE, buf);
+        if (isdir)
+          em->func(em->data, em, ECORE_FILE_EVENT_DELETED_DIRECTORY, buf);
+        else
+          em->func(em->data, em, ECORE_FILE_EVENT_DELETED_FILE, buf);
      }
    if (mask & IN_MOVED_TO)
      {
-       if (isdir)
-         em->func(em->data, em, ECORE_FILE_EVENT_CREATED_DIRECTORY, buf);
-       else
-         em->func(em->data, em, ECORE_FILE_EVENT_CREATED_FILE, buf);
+        if (isdir)
+          em->func(em->data, em, ECORE_FILE_EVENT_CREATED_DIRECTORY, buf);
+        else
+          em->func(em->data, em, ECORE_FILE_EVENT_CREATED_FILE, buf);
      }
    if (mask & IN_DELETE)
      {
-       if (isdir)
-         em->func(em->data, em, ECORE_FILE_EVENT_DELETED_DIRECTORY, buf);
-       else
-         em->func(em->data, em, ECORE_FILE_EVENT_DELETED_FILE, buf);
+        if (isdir)
+          em->func(em->data, em, ECORE_FILE_EVENT_DELETED_DIRECTORY, buf);
+        else
+          em->func(em->data, em, ECORE_FILE_EVENT_DELETED_FILE, buf);
      }
    if (mask & IN_CREATE)
      {
-       if (isdir)
-         em->func(em->data, em, ECORE_FILE_EVENT_CREATED_DIRECTORY, buf);
-       else
-         em->func(em->data, em, ECORE_FILE_EVENT_CREATED_FILE, buf);
+        if (isdir)
+          em->func(em->data, em, ECORE_FILE_EVENT_CREATED_DIRECTORY, buf);
+        else
+          em->func(em->data, em, ECORE_FILE_EVENT_CREATED_FILE, buf);
      }
    if (mask & IN_DELETE_SELF)
      {
-       em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
+        em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
      }
    if (mask & IN_MOVE_SELF)
      {
-       /* We just call delete. The dir is gone... */
-       em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
+        /* We just call delete. The dir is gone... */
+        em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
      }
    if (mask & IN_UNMOUNT)
      {
-       /* We just call delete. The dir is gone... */
-       em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
+        /* We just call delete. The dir is gone... */
+        em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
      }
    if (mask & IN_IGNORED)
      {
-       /* The watch is removed. If the file name still exists monitor the new one,
-        * else delete it */
-       if (ecore_file_exists(em->path))
-         {
-            if (!_ecore_file_monitor_inotify_monitor(em, em->path))
-              em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
-         }
-       else
-         em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
+        /* The watch is removed. If the file name still exists monitor the new one,
+         * else delete it */
+        if (ecore_file_exists(em->path))
+          {
+             if (_ecore_file_monitor_inotify_monitor(em, em->path))
+               em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
+          }
+        else
+          em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
      }
 }
 
 static int
 _ecore_file_monitor_inotify_monitor(Ecore_File_Monitor *em, const char *path)
 {
-   int mask;
-   mask = IN_MODIFY|
-         IN_MOVED_FROM|IN_MOVED_TO|
-         IN_DELETE|IN_CREATE|
-         IN_DELETE_SELF|IN_MOVE_SELF|
-         IN_UNMOUNT;
-   ECORE_FILE_MONITOR_INOTIFY(em)->wd = inotify_add_watch(ecore_main_fd_handler_fd_get(_fdh),
-                                                         path, mask);
+   int mask =
+      IN_ATTRIB |
+      IN_CLOSE_WRITE |
+      IN_MOVED_FROM |
+      IN_MOVED_TO |
+      IN_DELETE |
+      IN_CREATE |
+      IN_MODIFY |
+      IN_DELETE_SELF |
+      IN_MOVE_SELF |
+      IN_UNMOUNT;
+
+   ECORE_FILE_MONITOR_INOTIFY(em)->wd =
+      inotify_add_watch(ecore_main_fd_handler_fd_get(_fdh), path, mask);
    if (ECORE_FILE_MONITOR_INOTIFY(em)->wd < 0)
      {
-       printf("inotify_add_watch error\n");
-       ecore_file_monitor_inotify_del(em);
-       return 0;
+        INF("inotify_add_watch failed, file was deleted");
+        ecore_file_monitor_inotify_del(em);
+        return 0;
      }
    return 1;
 }
@@ -320,38 +339,32 @@ _ecore_file_monitor_inotify_print(char *file, int mask)
    else
      type = "file";
 
+   if (mask & IN_ACCESS)
+     INF("Inotify accessed %s: %s", type, file);
    if (mask & IN_MODIFY)
-     {
-       printf("Inotify modified %s: %s\n", type, file);
-     }
+     INF("Inotify modified %s: %s", type, file);
+   if (mask & IN_ATTRIB)
+     INF("Inotify attributes %s: %s", type, file);
+   if (mask & IN_CLOSE_WRITE)
+     INF("Inotify close write %s: %s", type, file);
+   if (mask & IN_CLOSE_NOWRITE)
+     INF("Inotify close write %s: %s", type, file);
+   if (mask & IN_OPEN)
+     INF("Inotify open %s: %s", type, file);
    if (mask & IN_MOVED_FROM)
-     {
-       printf("Inotify moved from %s: %s\n", type, file);
-     }
+     INF("Inotify moved from %s: %s", type, file);
    if (mask & IN_MOVED_TO)
-     {
-       printf("Inotify moved to %s: %s\n", type, file);
-     }
+     INF("Inotify moved to %s: %s", type, file);
    if (mask & IN_DELETE)
-     {
-       printf("Inotify delete %s: %s\n", type, file);
-     }
+     INF("Inotify delete %s: %s", type, file);
    if (mask & IN_CREATE)
-     {
-       printf("Inotify create %s: %s\n", type, file);
-     }
+     INF("Inotify create %s: %s", type, file);
    if (mask & IN_DELETE_SELF)
-     {
-       printf("Inotify delete self %s: %s\n", type, file);
-     }
+     INF("Inotify delete self %s: %s", type, file);
    if (mask & IN_MOVE_SELF)
-     {
-       printf("Inotify move self %s: %s\n", type, file);
-     }
+     INF("Inotify move self %s: %s", type, file);
    if (mask & IN_UNMOUNT)
-     {
-       printf("Inotify unmount %s: %s\n", type, file);
-     }
+     INF("Inotify unmount %s: %s", type, file);
 }
 #endif
 #endif /* HAVE_INOTIFY */
index abbdd22..49bfcb6 100644 (file)
@@ -1,11 +1,11 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
 #include "ecore_file_private.h"
 
 #ifdef HAVE_POLL
@@ -19,7 +19,6 @@
  */
 
 typedef struct _Ecore_File_Monitor_Poll Ecore_File_Monitor_Poll;
-typedef struct _Ecore_File              Ecore_File;
 
 #define ECORE_FILE_MONITOR_POLL(x) ((Ecore_File_Monitor_Poll *)(x))
 
@@ -30,24 +29,16 @@ struct _Ecore_File_Monitor_Poll
    unsigned char       deleted;
 };
 
-struct _Ecore_File
-{
-   Ecore_List2  __list_data;
-   char          *name;
-   int            mtime;
-   unsigned char  is_dir;
-};
-
 #define ECORE_FILE_INTERVAL_MIN  1.0
 #define ECORE_FILE_INTERVAL_STEP 0.5
 #define ECORE_FILE_INTERVAL_MAX  5.0
 
 static double         _interval = ECORE_FILE_INTERVAL_MIN;
 static Ecore_Timer   *_timer = NULL;
-static Ecore_List2 *_monitors = NULL;
+static Ecore_File_Monitor *_monitors = NULL;
 static int          _lock = 0;
 
-static int         _ecore_file_monitor_poll_handler(void *data);
+static Eina_Bool   _ecore_file_monitor_poll_handler(void *data);
 static void        _ecore_file_monitor_poll_check(Ecore_File_Monitor *em);
 static int         _ecore_file_monitor_poll_checking(Ecore_File_Monitor *em, char *name);
 
@@ -60,41 +51,33 @@ ecore_file_monitor_poll_init(void)
 int
 ecore_file_monitor_poll_shutdown(void)
 {
-   Ecore_List2 *l;
-
-   for (l = _monitors; l;)
-     {
-       Ecore_File_Monitor *em;
-
-       em = ECORE_FILE_MONITOR(l);
-       l = l->next;
-       ecore_file_monitor_poll_del(em);
-     }
+   while(_monitors)
+        ecore_file_monitor_poll_del(_monitors);
 
    if (_timer)
      {
-               ecore_timer_del(_timer);
-       _timer = NULL;
+        ecore_timer_del(_timer);
+        _timer = NULL;
      }
    return 1;
 }
 
 Ecore_File_Monitor *
 ecore_file_monitor_poll_add(const char *path,
-                           void (*func) (void *data, Ecore_File_Monitor *em,
-                                         Ecore_File_Event event,
-                                         const char *path),
-                           void *data)
+                            void (*func) (void *data, Ecore_File_Monitor *em,
+                                          Ecore_File_Event event,
+                                          const char *path),
+                            void *data)
 {
    Ecore_File_Monitor *em;
-   int len;
+   size_t len;
 
    if (!path) return NULL;
    if (!func) return NULL;
 
    em = calloc(1, sizeof(Ecore_File_Monitor_Poll));
    if (!em) return NULL;
-   
+
    if (!_timer)
      _timer = ecore_timer_add(_interval, _ecore_file_monitor_poll_handler, NULL);
    else
@@ -109,105 +92,99 @@ ecore_file_monitor_poll_add(const char *path,
    em->data = data;
 
    ECORE_FILE_MONITOR_POLL(em)->mtime = ecore_file_mod_time(em->path);
+   _monitors = ECORE_FILE_MONITOR(eina_inlist_append(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
+
    if (ecore_file_exists(em->path))
      {
-       if (ecore_file_is_dir(em->path))
-         {
-            /* Check for subdirs */
-            Ecore_List *files;
-            char *file;
-
-            files = ecore_file_ls(em->path);
-            if (files)
-              {
-                 while ((file = ecore_list_next(files)))
-                   {
-                      Ecore_File *f;
-                      char buf[PATH_MAX];
-
-                      f = calloc(1, sizeof(Ecore_File));
-                      if (!f)
-                        continue;
-
-                      snprintf(buf, sizeof(buf), "%s/%s", em->path, file);
-                      f->name = strdup(file);
-                      f->mtime = ecore_file_mod_time(buf);
-                      f->is_dir = ecore_file_is_dir(buf);
-                      em->files = _ecore_list2_append(em->files, f);
-                   }
-                 ecore_list_destroy(files);
-              }
-         }
+        if (ecore_file_is_dir(em->path))
+          {
+             /* Check for subdirs */
+             Eina_List *files;
+             char *file;
+
+             files = ecore_file_ls(em->path);
+             EINA_LIST_FREE(files, file)
+                    {
+                       Ecore_File *f;
+                       char buf[PATH_MAX];
+
+                       f = calloc(1, sizeof(Ecore_File));
+                       if (!f)
+                    {
+                       free(file);
+                         continue;
+                    }
+
+                       snprintf(buf, sizeof(buf), "%s/%s", em->path, file);
+                       f->name = file;
+                       f->mtime = ecore_file_mod_time(buf);
+                       f->is_dir = ecore_file_is_dir(buf);
+                       em->files = (Ecore_File *) eina_inlist_append(EINA_INLIST_GET(em->files), EINA_INLIST_GET(f));
+                    }
+          }
      }
    else
      {
-       ecore_file_monitor_poll_del(em);
-       return NULL;
+        ecore_file_monitor_poll_del(em);
+        return NULL;
      }
 
-   _monitors = _ecore_list2_append(_monitors, em);
-
    return em;
 }
 
 void
 ecore_file_monitor_poll_del(Ecore_File_Monitor *em)
 {
-   Ecore_List2 *l;
+   Ecore_File *l;
 
    if (_lock)
      {
-       ECORE_FILE_MONITOR_POLL(em)->deleted = 1;
-       return;
+        ECORE_FILE_MONITOR_POLL(em)->deleted = 1;
+        return;
      }
 
    /* Remove files */
    /*It's possible there weren't any files to monitor, so check if the list is init*/
    if (em->files)
      {
-       for (l = em->files; l;)
-         {
-            Ecore_File *file;
-            
-            file = (Ecore_File *)l;
-            l = l->next;
-            free(file->name);
-            free(file);
-         }
+        for (l = em->files; l;)
+          {
+             Ecore_File *file = l;
+
+             l = (Ecore_File *) EINA_INLIST_GET(l)->next;
+             free(file->name);
+             free(file);
+          }
      }
-   
-   _monitors = _ecore_list2_remove(_monitors, em);
-   
+
+   if (_monitors)
+     _monitors = ECORE_FILE_MONITOR(eina_inlist_remove(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
+
    free(em->path);
    free(em);
-   
+
    if (_timer)
      {
-       if (!_monitors)
-         {
-            ecore_timer_del(_timer);
-            _timer = NULL;
-         }
-       else
-         ecore_timer_interval_set(_timer, ECORE_FILE_INTERVAL_MIN);
+        if (!_monitors)
+          {
+             ecore_timer_del(_timer);
+             _timer = NULL;
+          }
+        else
+          ecore_timer_interval_set(_timer, ECORE_FILE_INTERVAL_MIN);
      }
 }
 
-static int
+static Eina_Bool
 _ecore_file_monitor_poll_handler(void *data __UNUSED__)
 {
-   Ecore_List2 *l;
+   Ecore_File_Monitor *l;
 
    _interval += ECORE_FILE_INTERVAL_STEP;
 
    _lock = 1;
-   for (l = _monitors; l; l = l->next)
-     {
-       Ecore_File_Monitor *em;
-
-       em = ECORE_FILE_MONITOR(l);
-       _ecore_file_monitor_poll_check(em);
-     }
+   EINA_INLIST_FOREACH(_monitors, l)
+        _ecore_file_monitor_poll_check(l);
    _lock = 0;
 
    if (_interval > ECORE_FILE_INTERVAL_MAX)
@@ -216,133 +193,134 @@ _ecore_file_monitor_poll_handler(void *data __UNUSED__)
 
    for (l = _monitors; l;)
      {
-       Ecore_File_Monitor *em;
+        Ecore_File_Monitor *em = l;
 
-       em = ECORE_FILE_MONITOR(l);
-       l = l->next;
-       if (ECORE_FILE_MONITOR_POLL(em)->deleted)
-         ecore_file_monitor_del(em);
+        l = ECORE_FILE_MONITOR(EINA_INLIST_GET(l)->next);
+        if (ECORE_FILE_MONITOR_POLL(em)->deleted)
+          ecore_file_monitor_del(em);
      }
-   return 1;
+   return ECORE_CALLBACK_RENEW;
 }
 
 static void
 _ecore_file_monitor_poll_check(Ecore_File_Monitor *em)
 {
    int mtime;
-   int is_dir;
 
    mtime = ecore_file_mod_time(em->path);
-   is_dir = ecore_file_is_dir(em->path);
    if (mtime < ECORE_FILE_MONITOR_POLL(em)->mtime)
      {
-       Ecore_List2 *l;
-       Ecore_File_Event event;
-       
-       /* Notify all files deleted */
-       for (l = em->files; l;)
-         {
-            Ecore_File *f;
-            char buf[PATH_MAX];
-            
-            f = (Ecore_File *)l;
-            l = l->next;
-
-            snprintf(buf, sizeof(buf), "%s/%s", em->path, f->name);
-            if (f->is_dir)
-              event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
-            else
-              event = ECORE_FILE_EVENT_DELETED_FILE;
-            em->func(em->data, em, event, buf);
-            free(f->name);
-            free(f);
-         }
-       em->files = NULL;
-       em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
-       _interval = ECORE_FILE_INTERVAL_MIN;
+        Ecore_File *l;
+        Ecore_File_Event event;
+
+        /* Notify all files deleted */
+        for (l = em->files; l;)
+          {
+             Ecore_File *f = l;
+             char buf[PATH_MAX];
+
+             l = (Ecore_File *) EINA_INLIST_GET(l)->next;
+
+             snprintf(buf, sizeof(buf), "%s/%s", em->path, f->name);
+             if (f->is_dir)
+               event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
+             else
+               event = ECORE_FILE_EVENT_DELETED_FILE;
+             em->func(em->data, em, event, buf);
+             free(f->name);
+             free(f);
+          }
+        em->files = NULL;
+        em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
+        _interval = ECORE_FILE_INTERVAL_MIN;
      }
    else
      {
-       Ecore_List2 *l;
-
-       /* Check for changed files */
-       for (l = em->files; l;)
-         {
-            Ecore_File *f;
-            char buf[PATH_MAX];
-            int mtime;
-            Ecore_File_Event event;
-
-            f = (Ecore_File *)l;
-            l = l->next;
-
-            snprintf(buf, sizeof(buf), "%s/%s", em->path, f->name);
-            mtime = ecore_file_mod_time(buf);
-            if (mtime < f->mtime)
-              {
-                 if (f->is_dir)
-                   event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
-                 else
-                   event = ECORE_FILE_EVENT_DELETED_FILE;
-
-                 em->func(em->data, em, event, buf);
-                 em->files = _ecore_list2_remove(em->files, f);
-                 free(f->name);
-                 free(f);
-                 _interval = ECORE_FILE_INTERVAL_MIN;
-              }
-            else if ((mtime > f->mtime) && !(f->is_dir))
-              {
-                 em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
-                 _interval = ECORE_FILE_INTERVAL_MIN;
-                 f->mtime = mtime;
-              }
-            else
-              f->mtime = mtime;
-         }
-
-       /* Check for new files */
-       if (ECORE_FILE_MONITOR_POLL(em)->mtime < mtime)
-         {
-            Ecore_List *files;
-            char *file;
-
-            /* Files have been added or removed */
-            files = ecore_file_ls(em->path);
-            if (files)
-              { 
-                 /* Are we a directory? We should check first, rather than rely on null here*/
-                 while ((file = ecore_list_next(files)))
-                   {
-                      Ecore_File *f;
-                      char buf[PATH_MAX];
-                      Ecore_File_Event event;
-                      
-                      if (_ecore_file_monitor_poll_checking(em, file))
-                        continue;
-                      
-                      snprintf(buf, sizeof(buf), "%s/%s", em->path, file);
-                      f = calloc(1, sizeof(Ecore_File));
-                      if (!f)
-                        continue;
-                      
-                      f->name = strdup(file);
-                      f->mtime = ecore_file_mod_time(buf);
-                      f->is_dir = ecore_file_is_dir(buf);
-                      if (f->is_dir)
-                        event = ECORE_FILE_EVENT_CREATED_DIRECTORY;
-                      else
-                        event = ECORE_FILE_EVENT_CREATED_FILE;
-                      em->func(em->data, em, event, buf);
-                      em->files = _ecore_list2_append(em->files, f);
-                   }
-                 ecore_list_destroy(files);
-              }
-            
-            if (!ecore_file_is_dir(em->path))
-              em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, em->path);
-            _interval = ECORE_FILE_INTERVAL_MIN;
-         }
+        Ecore_File *l;
+
+        /* Check for changed files */
+        for (l = em->files; l;)
+          {
+             Ecore_File *f = l;
+             char buf[PATH_MAX];
+             int mt;
+             Ecore_File_Event event;
+
+             l = (Ecore_File *) EINA_INLIST_GET(l)->next;
+
+             snprintf(buf, sizeof(buf), "%s/%s", em->path, f->name);
+             mt = ecore_file_mod_time(buf);
+             if (mt < f->mtime)
+               {
+                  if (f->is_dir)
+                    event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
+                  else
+                    event = ECORE_FILE_EVENT_DELETED_FILE;
+
+                  em->func(em->data, em, event, buf);
+                  em->files = (Ecore_File *) eina_inlist_remove(EINA_INLIST_GET(em->files), EINA_INLIST_GET(f));
+                  free(f->name);
+                  free(f);
+                  _interval = ECORE_FILE_INTERVAL_MIN;
+               }
+             else if ((mt > f->mtime) && !(f->is_dir))
+               {
+                  em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
+                  _interval = ECORE_FILE_INTERVAL_MIN;
+                  f->mtime = mt;
+               }
+             else
+               f->mtime = mt;
+          }
+
+        /* Check for new files */
+        if (ECORE_FILE_MONITOR_POLL(em)->mtime < mtime)
+          {
+             Eina_List *files;
+             Eina_List *fl;
+             char *file;
+
+             /* Files have been added or removed */
+             files = ecore_file_ls(em->path);
+             if (files)
+               {
+                  /* Are we a directory? We should check first, rather than rely on null here*/
+                  EINA_LIST_FOREACH(files, fl, file)
+                    {
+                       Ecore_File *f;
+                       char buf[PATH_MAX];
+                       Ecore_File_Event event;
+
+                       if (_ecore_file_monitor_poll_checking(em, file))
+                         continue;
+
+                       snprintf(buf, sizeof(buf), "%s/%s", em->path, file);
+                       f = calloc(1, sizeof(Ecore_File));
+                       if (!f)
+                         continue;
+
+                       f->name = strdup(file);
+                       f->mtime = ecore_file_mod_time(buf);
+                       f->is_dir = ecore_file_is_dir(buf);
+                       if (f->is_dir)
+                         event = ECORE_FILE_EVENT_CREATED_DIRECTORY;
+                       else
+                         event = ECORE_FILE_EVENT_CREATED_FILE;
+                       em->func(em->data, em, event, buf);
+                       em->files = (Ecore_File *) eina_inlist_append(EINA_INLIST_GET(em->files), EINA_INLIST_GET(f));
+                    }
+                  while (files)
+                    {
+                       file = eina_list_data_get(files);
+                       free(file);
+                       files = eina_list_remove_list(files, files);
+                    }
+               }
+
+             if (!ecore_file_is_dir(em->path))
+               em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, em->path);
+             _interval = ECORE_FILE_INTERVAL_MIN;
+          }
      }
    ECORE_FILE_MONITOR_POLL(em)->mtime = mtime;
 }
@@ -350,15 +328,12 @@ _ecore_file_monitor_poll_check(Ecore_File_Monitor *em)
 static int
 _ecore_file_monitor_poll_checking(Ecore_File_Monitor *em, char *name)
 {
-   Ecore_List2 *l;
+   Ecore_File *l;
 
-   for (l = em->files; l; l = l->next)
+   EINA_INLIST_FOREACH(em->files, l)
      {
-       Ecore_File *f;
-
-       f = (Ecore_File *)l;
-       if (!strcmp(f->name, name))
-         return 1;
+        if (!strcmp(l->name, name))
+          return 1;
      }
    return 0;
 }
diff --git a/src/lib/ecore_file/ecore_file_monitor_win32.c b/src/lib/ecore_file/ecore_file_monitor_win32.c
new file mode 100644 (file)
index 0000000..7f3af09
--- /dev/null
@@ -0,0 +1,310 @@
+/*\r
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2\r
+ */\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include <config.h>\r
+#endif\r
+\r
+#ifdef HAVE_NOTIFY_WIN32\r
+\r
+# define WIN32_LEAN_AND_MEAN\r
+# include <windows.h>\r
+# undef WIN32_LEAN_AND_MEAN\r
+# include <process.h>\r
+\r
+# include "ecore_file_private.h"\r
+\r
+\r
+typedef struct _Ecore_File_Monitor_Win32      Ecore_File_Monitor_Win32;\r
+typedef struct _Ecore_File_Monitor_Win32_Data Ecore_File_Monitor_Win32_Data;\r
+\r
+/* 4096 = 256 * sizeof(FILE_NOTIFY_INFORMATION) */\r
+# define ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE 4096\r
+# define ECORE_FILE_MONITOR_WIN32(x) ((Ecore_File_Monitor_Win32 *)(x))\r
+\r
+struct _Ecore_File_Monitor_Win32_Data\r
+{\r
+   char                 buffer[ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE];\r
+   OVERLAPPED           overlapped;\r
+   HANDLE               handle;\r
+   HANDLE               event;\r
+   Ecore_File_Monitor  *monitor;\r
+   Ecore_Win32_Handler *h;\r
+   DWORD                buf_length;\r
+   int                  is_dir;\r
+};\r
+\r
+struct _Ecore_File_Monitor_Win32\r
+{\r
+   Ecore_File_Monitor             monitor;\r
+   Ecore_File_Monitor_Win32_Data *file;\r
+   Ecore_File_Monitor_Win32_Data *dir;\r
+};\r
+\r
+static Ecore_File_Monitor *_monitors = NULL;\r
+\r
+static Eina_Bool _ecore_file_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh);\r
+\r
+\r
+static Ecore_File_Monitor_Win32_Data *\r
+_ecore_file_monitor_win32_data_new(Ecore_File_Monitor *monitor, int type)\r
+{\r
+   Ecore_File_Monitor_Win32_Data *md;\r
+   DWORD                          filter;\r
+\r
+   md = (Ecore_File_Monitor_Win32_Data *)calloc(1, sizeof(Ecore_File_Monitor_Win32_Data));\r
+   if (!md) return NULL;\r
+\r
+   md->handle = CreateFile(monitor->path,\r
+                           FILE_LIST_DIRECTORY,\r
+                           FILE_SHARE_READ |\r
+                           FILE_SHARE_WRITE,\r
+                           NULL,\r
+                           OPEN_EXISTING,\r
+                           FILE_FLAG_BACKUP_SEMANTICS |\r
+                           FILE_FLAG_OVERLAPPED,\r
+                           NULL);\r
+   if (md->handle == INVALID_HANDLE_VALUE)\r
+     goto free_md;\r
+\r
+   md->event = CreateEvent(NULL, FALSE, FALSE, NULL);\r
+   if (!md->event)\r
+     goto close_handle;\r
+\r
+   ZeroMemory (&md->overlapped, sizeof(md->overlapped));\r
+   md->overlapped.hEvent = md->event;\r
+\r
+   filter = (type == 0) ? FILE_NOTIFY_CHANGE_FILE_NAME : FILE_NOTIFY_CHANGE_DIR_NAME;\r
+   filter |=\r
+     FILE_NOTIFY_CHANGE_ATTRIBUTES |\r
+     FILE_NOTIFY_CHANGE_SIZE |\r
+     FILE_NOTIFY_CHANGE_LAST_WRITE |\r
+     FILE_NOTIFY_CHANGE_LAST_ACCESS |\r
+     FILE_NOTIFY_CHANGE_CREATION |\r
+     FILE_NOTIFY_CHANGE_SECURITY;\r
+\r
+   if (!ReadDirectoryChangesW(md->handle,\r
+                              md->buffer,\r
+                              ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE,\r
+                              FALSE,\r
+                              filter,\r
+                              &md->buf_length,\r
+                              &md->overlapped,\r
+                              NULL))\r
+     goto close_event;\r
+\r
+   md->h = ecore_main_win32_handler_add(md->event,\r
+                                        _ecore_file_monitor_win32_cb,\r
+                                        md);\r
+   if (!md->h)\r
+     goto close_event;\r
+\r
+   md->monitor = monitor;\r
+   md->is_dir = type;\r
+\r
+   return md;\r
+\r
+ close_event:\r
+   CloseHandle(md->event);\r
+ close_handle:\r
+   CloseHandle(md->handle);\r
+ free_md:\r
+   free(md);\r
+\r
+   return NULL;\r
+}\r
+\r
+static void\r
+_ecore_file_monitor_win32_data_free(Ecore_File_Monitor_Win32_Data *md)\r
+{\r
+   if (!md) return;\r
+\r
+   CloseHandle(md->event);\r
+   CloseHandle (md->handle);\r
+   free (md);\r
+}\r
+\r
+static Eina_Bool\r
+_ecore_file_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh)\r
+{\r
+   char                           filename[PATH_MAX];\r
+   PFILE_NOTIFY_INFORMATION       fni;\r
+   Ecore_File_Monitor_Win32_Data *md;\r
+   wchar_t                       *wname;\r
+   char                          *name;\r
+   DWORD                          filter;\r
+   DWORD                          offset;\r
+   DWORD                          buf_length;\r
+   Ecore_File_Event               event = ECORE_FILE_EVENT_NONE;\r
+\r
+   md = (Ecore_File_Monitor_Win32_Data *)data;\r
+\r
+   if (!GetOverlappedResult (md->handle, &md->overlapped, &buf_length, TRUE))\r
+     return 1;\r
+\r
+   fni = (PFILE_NOTIFY_INFORMATION)md->buffer;\r
+   do {\r
+      if (!fni)\r
+        break;\r
+      offset = fni->NextEntryOffset;\r
+\r
+      wname = (wchar_t *)malloc(sizeof(wchar_t) * (fni->FileNameLength + 1));\r
+      if (!wname)\r
+        return 0;\r
+\r
+      memcpy(wname, fni->FileName, fni->FileNameLength);\r
+      wname[fni->FileNameLength]='\0';\r
+      name = evil_wchar_to_char(wname);\r
+      free(wname);\r
+      if (!name)\r
+        return 0;\r
+\r
+      _snprintf(filename, PATH_MAX, "%s\\%s", md->monitor->path, name);\r
+      free(name);\r
+\r
+      switch (fni->Action)\r
+        {\r
+        case FILE_ACTION_ADDED:\r
+          if (md->is_dir)\r
+            event = ECORE_FILE_EVENT_CREATED_DIRECTORY;\r
+          else\r
+            event = ECORE_FILE_EVENT_CREATED_FILE;\r
+          break;\r
+        case FILE_ACTION_REMOVED:\r
+          if (md->is_dir)\r
+            event = ECORE_FILE_EVENT_DELETED_DIRECTORY;\r
+          else\r
+            event = ECORE_FILE_EVENT_DELETED_FILE;\r
+          break;\r
+        case FILE_ACTION_MODIFIED:\r
+          if (!md->is_dir)\r
+            event = ECORE_FILE_EVENT_MODIFIED;\r
+          break;\r
+        case FILE_ACTION_RENAMED_OLD_NAME:\r
+          if (md->is_dir)\r
+            event = ECORE_FILE_EVENT_DELETED_DIRECTORY;\r
+          else\r
+            event = ECORE_FILE_EVENT_DELETED_FILE;\r
+          break;\r
+        case FILE_ACTION_RENAMED_NEW_NAME:\r
+          if (md->is_dir)\r
+            event = ECORE_FILE_EVENT_CREATED_DIRECTORY;\r
+          else\r
+            event = ECORE_FILE_EVENT_CREATED_FILE;\r
+          break;\r
+        default: \r
+          fprintf(stderr, "unknown event\n");\r
+          event = ECORE_FILE_EVENT_NONE;\r
+          break;\r
+        }\r
+      if (event != ECORE_FILE_EVENT_NONE)\r
+        md->monitor->func(md->monitor->data, md->monitor, event, filename);\r
+\r
+      fni = (PFILE_NOTIFY_INFORMATION)((LPBYTE)fni + offset);\r
+   } while (offset);\r
+\r
+   filter = (md->is_dir == 0) ? FILE_NOTIFY_CHANGE_FILE_NAME : FILE_NOTIFY_CHANGE_DIR_NAME;\r
+   filter |=\r
+     FILE_NOTIFY_CHANGE_ATTRIBUTES |\r
+     FILE_NOTIFY_CHANGE_SIZE |\r
+     FILE_NOTIFY_CHANGE_LAST_WRITE |\r
+     FILE_NOTIFY_CHANGE_LAST_ACCESS |\r
+     FILE_NOTIFY_CHANGE_CREATION |\r
+     FILE_NOTIFY_CHANGE_SECURITY;\r
+\r
+    ReadDirectoryChangesW(md->handle,\r
+                          md->buffer,\r
+                          ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE,\r
+                          FALSE,\r
+                          filter,\r
+                          &md->buf_length,\r
+                          &md->overlapped,\r
+                          NULL);\r
+   return 1;\r
+}\r
+\r
+int\r
+ecore_file_monitor_win32_init(void)\r
+{\r
+   return 1;\r
+}\r
+\r
+int\r
+ecore_file_monitor_win32_shutdown(void)\r
+{\r
+   return 1;\r
+}\r
+\r
+Ecore_File_Monitor *\r
+ecore_file_monitor_win32_add(const char *path,\r
+                             void (*func) (void *data, Ecore_File_Monitor *em,\r
+                                           Ecore_File_Event event,\r
+                                           const char *path),\r
+                             void *data)\r
+{\r
+   Ecore_File_Monitor_Win32 *m;\r
+   Ecore_File_Monitor       *em;\r
+   size_t                    len;\r
+\r
+   if (!path || (*path == '\0')) return NULL;\r
+   if (!ecore_file_exists(path) || !ecore_file_is_dir(path))\r
+     return NULL;\r
+   if (!func) return NULL;\r
+\r
+   em = (Ecore_File_Monitor *)calloc(1, sizeof(Ecore_File_Monitor_Win32));\r
+   if (!em) return NULL;\r
+\r
+   em->func = func;\r
+   em->data = data;\r
+\r
+   em->path = strdup(path);\r
+   if (!em->path)\r
+     {\r
+        free(em);\r
+        return NULL;\r
+     }\r
+   len = strlen(em->path);\r
+   if (em->path[len - 1] == '/' || em->path[len - 1] == '\\')\r
+     em->path[len - 1] = '\0';\r
+\r
+   m = ECORE_FILE_MONITOR_WIN32(em);\r
+\r
+   m->file = _ecore_file_monitor_win32_data_new(em, 0);\r
+   if (!m->file)\r
+     {\r
+        free(em->path);\r
+        free(em);\r
+        return NULL;\r
+     }\r
+\r
+   m->dir = _ecore_file_monitor_win32_data_new(em, 1);\r
+   if (!m->dir)\r
+     {\r
+        _ecore_file_monitor_win32_data_free(m->file);\r
+        free(em->path);\r
+        free(em);\r
+        return NULL;\r
+     }\r
+\r
+   _monitors = ECORE_FILE_MONITOR(eina_inlist_append(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));\r
+\r
+   return em;\r
+}\r
+\r
+void\r
+ecore_file_monitor_win32_del(Ecore_File_Monitor *em)\r
+{\r
+   Ecore_File_Monitor_Win32 *m;\r
+\r
+   if (!em)\r
+     return;\r
+\r
+   m = ECORE_FILE_MONITOR_WIN32(em);\r
+   _ecore_file_monitor_win32_data_free(m->dir);\r
+   _ecore_file_monitor_win32_data_free(m->file);\r
+   free(em->path);\r
+   free(em);\r
+}\r
+\r
+#endif\r
index 7100d95..3c06e9b 100644 (file)
@@ -1,49 +1,63 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#undef alloca
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
 #include "ecore_file_private.h"
 
-static int init = 0;
-static Ecore_List *__ecore_file_path_bin = NULL;
+static Eina_List *__ecore_file_path_bin = NULL;
 
-static Ecore_List *_ecore_file_path_from_env(const char *env);
+static Eina_List *_ecore_file_path_from_env(const char *env);
 
-int
+void
 ecore_file_path_init(void)
 {
-   if (++init != 1) return init;
    __ecore_file_path_bin = _ecore_file_path_from_env("PATH");
-   ecore_list_free_cb_set(__ecore_file_path_bin, free);
-   return init;
 }
 
-int
+void
 ecore_file_path_shutdown(void)
 {
-   if (--init != 0) return init;
-   ecore_list_destroy(__ecore_file_path_bin);
-   __ecore_file_path_bin = NULL;
-   return init;
+   char *dir;
+
+   EINA_LIST_FREE(__ecore_file_path_bin, dir)
+     eina_stringshare_del(dir);
 }
 
-Ecore_List *
+Eina_List *
 _ecore_file_path_from_env(const char *env)
 {
-   Ecore_List *path;
-   char *env_path, *p, *last;
-
-   path = ecore_list_new();
+   Eina_List *path = NULL;
+   char *env_tmp, *env_path, *p, *last;
 
-   env_path = getenv(env);
-   if (!env_path)
+   env_tmp = getenv(env);
+   if (!env_tmp)
      return path;
 
-   env_path = strdup(env_path);
+   env_path = alloca(sizeof(char) * strlen(env_tmp) + 1);
+   memset(env_path, 0, strlen(env_tmp));
+   strcpy(env_path, env_tmp);
    last = env_path;
    for (p = env_path; *p; p++)
      {
@@ -52,91 +66,119 @@ _ecore_file_path_from_env(const char *env)
 
         if (!*p)
           {
-            if (!ecore_file_path_dir_exists(last))
-              ecore_list_append(path, strdup(last));
+             if (!ecore_file_path_dir_exists(last))
+               path = eina_list_append(path, eina_stringshare_add(last));
              last = p + 1;
           }
      }
    if (p > last)
-     ecore_list_append(path, strdup(last));
+     path = eina_list_append(path, eina_stringshare_add(last));
 
-   free(env_path);
    return path;
 }
 
 /**
- * Check if the given directory is in PATH
- * @param The name of the directory to search in PATH
- * @return 1 if the directory exist in PATH, 0 otherwise
+ * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
+ *
+ * @{
+ */
+
+/**
+ * @brief Check if the given directory is in PATH.
+ *
+ * @param in_dir The name of the directory to search in PATH.
+ * @return @c EINA_TRUE if the directory exist in PATH, @c EINA_FALSE otherwise.
+ *
+ * This function checks if @p in_dir is in the environment variable
+ * PATH. If @p in_dir is @c NULL, or if PATH is empty, or @p in_dir is
+ * not in PATH, the function returns @c EINA_FALSE, otherwise it returns
+ * @c EINA_TRUE.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_path_dir_exists(const char *in_dir)
 {
+   Eina_List *l;
    char *dir;
 
-   if (!__ecore_file_path_bin) return 0;
-   ecore_list_first_goto(__ecore_file_path_bin);
-   while ((dir = ecore_list_next(__ecore_file_path_bin)) != NULL)
+   if (!in_dir)
+     return EINA_FALSE;
+
+   if (!__ecore_file_path_bin) return EINA_FALSE;
+   EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
      {
-       if (!strcmp(dir, in_dir)) return 1;
+        if (strcmp(dir, in_dir))
+          return EINA_TRUE;
      }
-   return 0;
+
+   return EINA_FALSE;
 }
 
 /**
- * Check if the given application is installed
+ * @brief Check if the given application is installed.
+ *
  * @param  exe The name of the application
- * @return 1 if the exe is in PATH and is executable
- * 
- * This function check if the given name exist in PATH and is executable 
+ * @return @c EINA_TRUE if the @p exe is in PATH and is executable,
+ * @c EINA_FALSE otherwise.
+ *
+ * This function checks if @p exe exists in PATH and is executable. If
+ * @p exe is @c NULL or is not executable, the function returns
+ * @c EINA_FALSE, otherwise it returns @c EINA_TRUE.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_file_app_installed(const char *exe)
 {
+   Eina_List *l;
    char *dir;
    char  buf[PATH_MAX];
 
-   if (!exe) return 0;
-   if (ecore_file_can_exec(exe)) return 1;
+   if (!exe) return EINA_FALSE;
+   if (ecore_file_can_exec(exe)) return EINA_TRUE;
 
-   ecore_list_first_goto(__ecore_file_path_bin);
-   while ((dir = ecore_list_next(__ecore_file_path_bin)) != NULL)
+   EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
      {
-       snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
-       if (ecore_file_can_exec(buf)) return 1;
+        snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
+        if (ecore_file_can_exec(buf))
+          return EINA_TRUE;
      }
-   return 0;
+
+   return EINA_FALSE;
 }
 
 /**
- * Get a list of all the applications installed on the system
- * @return An Ecore_List containing all the executable files in the system
+ * @brief Get a list of all the applications installed on the system.
+ *
+ * @return An Eina_List containing all the executable files in the
+ * system.
+ *
+ * This function returns a list of allocated strings of all the
+ * executable files. If no files are found, the function returns
+ * @c NULL. When not needed anymore, the element of the list must be
+ * freed.
  */
-EAPI Ecore_List *
+EAPI Eina_List *
 ecore_file_app_list(void)
 {
-   Ecore_List *list, *files;
+   Eina_List *list = NULL;
+   Eina_List *files;
+   Eina_List *l;
    char  buf[PATH_MAX], *dir, *exe;
-   
-   list = ecore_list_new();
-   if (!list) return NULL;
-   ecore_list_free_cb_set(list, free);
-   ecore_list_first_goto(__ecore_file_path_bin);
-   while ((dir = ecore_list_next(__ecore_file_path_bin)) != NULL)
+
+   EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
      {
-       files = ecore_file_ls(dir);
-       if (files)
-         {
-            ecore_list_first_goto(files);
-            while ((exe = ecore_list_next(files)) != NULL)
-              {
-                 snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
-                 if ((ecore_file_can_exec(buf)) &&
-                     (!ecore_file_is_dir(buf)))
-                   ecore_list_append(list, strdup(buf));
-              }
-            ecore_list_destroy(files);
-         }
+        files = ecore_file_ls(dir);
+        EINA_LIST_FREE(files, exe)
+               {
+                  snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
+                  if ((ecore_file_can_exec(buf)) &&
+                      (!ecore_file_is_dir(buf)))
+               list = eina_list_append(list, strdup(buf));
+             free(exe);
+          }
      }
+
    return list;
 }
+
+/**
+ * @}
+ */
index e2001f7..45d2cbd 100644 (file)
-#ifndef _FILE_OFFSET_BITS
-# define _FILE_OFFSET_BITS  64
-#endif
+#ifndef ECORE_FILE_PRIVATE_H_
+#define ECORE_FILE_PRIVATE_H_
 
 #ifdef __linux__
 # include <features.h>
 #endif
 
-#include "Ecore.h"
-#include "ecore_private.h"
-
 #ifdef HAVE_EVIL
 # include <Evil.h>
 #endif
 
+#ifdef HAVE_ESCAPE
+# include <Escape.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
 #include "Ecore_File.h"
 
+extern int _ecore_file_log_dom;
+
+#ifdef ECORE_FILE_DEFAULT_LOG_COLOR
+#undef ECORE_FILE_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_FILE_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_file_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_file_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_file_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_file_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_file_log_dom, __VA_ARGS__)
+
 /* ecore_file_monitor */
-int ecore_file_monitor_init(void);
-int ecore_file_monitor_shutdown(void);
+int  ecore_file_monitor_init(void);
+void ecore_file_monitor_shutdown(void);
 
 #define ECORE_FILE_MONITOR(x) ((Ecore_File_Monitor *)(x))
 
+typedef struct _Ecore_File Ecore_File;
+struct _Ecore_File
+{
+   EINA_INLIST;
+   char          *name;
+   int            mtime;
+   unsigned char  is_dir;
+};
+
 struct _Ecore_File_Monitor
 {
-   Ecore_List2 __list_data;
+   EINA_INLIST;
    void (*func) (void *data,
-                Ecore_File_Monitor *ecore_file_monitor,
-                Ecore_File_Event event,
-                const char *path);
+                 Ecore_File_Monitor *ecore_file_monitor,
+                 Ecore_File_Event event,
+                 const char *path);
 
    char               *path;
    void               *data;
-   Ecore_List2        *files;
+   Ecore_File         *files;
 };
 
 #ifdef HAVE_INOTIFY
 int                 ecore_file_monitor_inotify_init(void);
 int                 ecore_file_monitor_inotify_shutdown(void);
 Ecore_File_Monitor *ecore_file_monitor_inotify_add(const char *path,
-                                                       void (*func) (void *data,
-                                                                     Ecore_File_Monitor *ecore_file_monitor,
-                                                                     Ecore_File_Event event,
-                                                                     const char *path),
-                                                       void *data);
+                                                        void (*func) (void *data,
+                                                                      Ecore_File_Monitor *ecore_file_monitor,
+                                                                      Ecore_File_Event event,
+                                                                      const char *path),
+                                                        void *data);
 void                ecore_file_monitor_inotify_del(Ecore_File_Monitor *ecore_file_monitor);
 #endif
+#ifdef HAVE_NOTIFY_WIN32
+int                 ecore_file_monitor_win32_init(void);
+int                 ecore_file_monitor_win32_shutdown(void);
+Ecore_File_Monitor *ecore_file_monitor_win32_add(const char *path,
+                                                 void      (*func) (void               *data,
+                                                                    Ecore_File_Monitor *ecore_file_monitor,
+                                                                    Ecore_File_Event    event,
+                                                                    const char         *path),
+                                                 void       *data);
+void                ecore_file_monitor_win32_del(Ecore_File_Monitor *ecore_file_monitor);
+#endif
 
 #ifdef HAVE_POLL
 int                 ecore_file_monitor_poll_init(void);
 int                 ecore_file_monitor_poll_shutdown(void);
 Ecore_File_Monitor *ecore_file_monitor_poll_add(const char *path,
-                                               void (*func) (void *data,
-                                                             Ecore_File_Monitor *ecore_file_monitor,
-                                                             Ecore_File_Event event,
-                                                             const char *path),
-                                               void *data);
+                                                void (*func) (void *data,
+                                                              Ecore_File_Monitor *ecore_file_monitor,
+                                                              Ecore_File_Event event,
+                                                              const char *path),
+                                                void *data);
 void                ecore_file_monitor_poll_del(Ecore_File_Monitor *ecore_file_monitor);
 
+#endif
+
 /* ecore_file_path */
-int ecore_file_path_init(void);
-int ecore_file_path_shutdown(void);
+void ecore_file_path_init(void);
+void ecore_file_path_shutdown(void);
 
 /* ecore_file_download */
-int ecore_file_download_init(void);
-int ecore_file_download_shutdown(void);
+int  ecore_file_download_init(void);
+void ecore_file_download_shutdown(void);
 
 #endif
index d839819..641ece7 100644 (file)
@@ -1,10 +1,8 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifndef _ECORE_IMF_H
 #define _ECORE_IMF_H
 
+#include <Eina.h>
+
 #ifdef EAPI
 # undef EAPI
 #endif
 # endif
 #endif /* ! _WIN32 */
 
-#include <Ecore_Data.h>
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-   /* Events sent by the Input Method */
-   typedef struct _Ecore_IMF_Event_Preedit_Start      Ecore_IMF_Event_Preedit_Start;
-   typedef struct _Ecore_IMF_Event_Preedit_End        Ecore_IMF_Event_Preedit_End;
-   typedef struct _Ecore_IMF_Event_Preedit_Changed    Ecore_IMF_Event_Preedit_Changed;
-   typedef struct _Ecore_IMF_Event_Commit             Ecore_IMF_Event_Commit;
-   typedef struct _Ecore_IMF_Event_Delete_Surrounding Ecore_IMF_Event_Delete_Surrounding;
-
-   /* Events to filter */
-   typedef struct _Ecore_IMF_Event_Mouse_Down         Ecore_IMF_Event_Mouse_Down;
-   typedef struct _Ecore_IMF_Event_Mouse_Up           Ecore_IMF_Event_Mouse_Up;
-   typedef struct _Ecore_IMF_Event_Mouse_In           Ecore_IMF_Event_Mouse_In;
-   typedef struct _Ecore_IMF_Event_Mouse_Out          Ecore_IMF_Event_Mouse_Out;
-   typedef struct _Ecore_IMF_Event_Mouse_Move         Ecore_IMF_Event_Mouse_Move;
-   typedef struct _Ecore_IMF_Event_Mouse_Wheel        Ecore_IMF_Event_Mouse_Wheel;
-   typedef struct _Ecore_IMF_Event_Key_Down           Ecore_IMF_Event_Key_Down;
-   typedef struct _Ecore_IMF_Event_Key_Up             Ecore_IMF_Event_Key_Up;
-   typedef union  _Ecore_IMF_Event                    Ecore_IMF_Event;
-
-   typedef struct _Ecore_IMF_Context                  Ecore_IMF_Context;                  /**< An Input Method Context */
-   typedef struct _Ecore_IMF_Context_Class            Ecore_IMF_Context_Class;            /**< An Input Method Context class */
-   typedef struct _Ecore_IMF_Context_Info             Ecore_IMF_Context_Info;             /**< An Input Method Context info */
-
-   EAPI extern int ECORE_IMF_EVENT_PREEDIT_START;
-   EAPI extern int ECORE_IMF_EVENT_PREEDIT_END;
-   EAPI extern int ECORE_IMF_EVENT_PREEDIT_CHANGED;
-   EAPI extern int ECORE_IMF_EVENT_COMMIT;
-   EAPI extern int ECORE_IMF_EVENT_DELETE_SURROUNDING;
-
-   typedef enum
-     {
-       ECORE_IMF_EVENT_MOUSE_DOWN,
-       ECORE_IMF_EVENT_MOUSE_UP,
-       ECORE_IMF_EVENT_MOUSE_IN,
-       ECORE_IMF_EVENT_MOUSE_OUT,
-       ECORE_IMF_EVENT_MOUSE_MOVE,
-       ECORE_IMF_EVENT_MOUSE_WHEEL,
-       ECORE_IMF_EVENT_KEY_DOWN,
-       ECORE_IMF_EVENT_KEY_UP
-     } Ecore_IMF_Event_Type;
-
-   typedef enum
-     {
-       ECORE_IMF_KEYBOARD_MODIFIER_NONE  = 0,      /**< No active modifiers */
-       ECORE_IMF_KEYBOARD_MODIFIER_CTRL  = 1 << 0, /**< "Control" is pressed */
-       ECORE_IMF_KEYBOARD_MODIFIER_ALT   = 1 << 1, /**< "Alt" is pressed */
-       ECORE_IMF_KEYBOARD_MODIFIER_SHIFT = 1 << 2, /**< "Shift" is pressed */
-       ECORE_IMF_KEYBOARD_MODIFIER_WIN   = 1 << 3  /**< "Win" (between "Ctrl" and "Alt") is pressed */
-     } Ecore_IMF_Keyboard_Modifiers;
-
-   typedef enum
-     {
-       ECORE_IMF_KEYBOARD_LOCK_NONE      = 0,      /**< No locks are active */
-       ECORE_IMF_KEYBOARD_LOCK_NUM       = 1 << 0, /**< "Num" lock is active */
-       ECORE_IMF_KEYBOARD_LOCK_CAPS      = 1 << 1, /**< "Caps" lock is active */
-       ECORE_IMF_KEYBOARD_LOCK_SCROLL    = 1 << 2  /**< "Scroll" lock is active */
-     } Ecore_IMF_Keyboard_Locks;
-
-   typedef enum
-     {
-       ECORE_IMF_MOUSE_NONE              = 0,      /**< A single click */
-       ECORE_IMF_MOUSE_DOUBLE_CLICK      = 1 << 0, /**< A double click */
-       ECORE_IMF_MOUSE_TRIPLE_CLICK      = 1 << 1  /**< A triple click */
-     } Ecore_IMF_Mouse_Flags;
-
-   typedef enum
-     {
-       ECORE_IMF_INPUT_MODE_ALPHA        = 1 << 0,
-       ECORE_IMF_INPUT_MODE_NUMERIC      = 1 << 1,
-       ECORE_IMF_INPUT_MODE_SPECIAL      = 1 << 2,
-       ECORE_IMF_INPUT_MODE_HEXA         = 1 << 3,
-       ECORE_IMF_INPUT_MODE_TELE         = 1 << 4,
-       ECORE_IMF_INPUT_MODE_FULL         = (ECORE_IMF_INPUT_MODE_ALPHA | ECORE_IMF_INPUT_MODE_NUMERIC | ECORE_IMF_INPUT_MODE_SPECIAL),
-       ECORE_IMF_INPUT_MODE_INVISIBLE    = 1 << 29,
-       ECORE_IMF_INPUT_MODE_AUTOCAP      = 1 << 30
-     } Ecore_IMF_Input_Mode;
-
-   struct _Ecore_IMF_Event_Preedit_Start
-     {
-       Ecore_IMF_Context *ctx;
-     };
-
-   struct _Ecore_IMF_Event_Preedit_End
-     {
-       Ecore_IMF_Context *ctx;
-     };
-
-   struct _Ecore_IMF_Event_Preedit_Changed
-     {
-       Ecore_IMF_Context *ctx;
-     };
-
-   struct _Ecore_IMF_Event_Commit
-     {
-       Ecore_IMF_Context *ctx;
-       char *str;
-     };
-
-   struct _Ecore_IMF_Event_Delete_Surrounding
-     {
-       Ecore_IMF_Context *ctx;
-       int offset;
-       int n_chars;
-     };
-
-   struct _Ecore_IMF_Event_Mouse_Down
-     {
-       int button;                             /**< The button which has been pressed */
-       struct {
-            int x, y;
-       } output;
-       struct {
-            int x, y;
-       } canvas;
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       Ecore_IMF_Mouse_Flags        flags;     /**< The flags corresponding the mouse click (single, double or triple click) */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-     };
-
-   struct _Ecore_IMF_Event_Mouse_Up
-     {
-       int button;                             /**< The button which has been pressed */
-       struct {
-            int x, y;
-       } output;
-       struct {
-            int x, y;
-       } canvas;
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       Ecore_IMF_Mouse_Flags        flags;     /**< The flags corresponding the mouse click (single, double or triple click) */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-     };
-
-   struct _Ecore_IMF_Event_Mouse_In
-     {
-       int buttons;
-       struct {
-            int x, y;
-       } output;
-       struct {
-            int x, y;
-       } canvas;
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-     };
-
-   struct _Ecore_IMF_Event_Mouse_Out
-     {
-       int buttons;
-       struct {
-            int x, y;
-       } output;
-       struct {
-            int x, y;
-       } canvas;
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-     };
-
-   struct _Ecore_IMF_Event_Mouse_Move
-     {
-       int buttons;
-       struct {
-            struct {
-                 int x, y;
-            } output;
-            struct {
-                 int x, y;
-            } canvas;
-       } cur, prev;
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-     };
-
-   struct _Ecore_IMF_Event_Mouse_Wheel
-     {
-       int direction;                         /* 0 = default up/down wheel */
-       int z;                                 /* ...,-2,-1 = down, 1,2,... = up */
-       struct {
-            int x, y;
-       } output;
-       struct {
-            int x, y;
-       } canvas;
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-     };
-
-   struct _Ecore_IMF_Event_Key_Down
-     {
-       char                        *keyname;   /**< The string name of the key pressed */
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       const char                  *key;       /**< The logical key : (eg shift+1 == exclamation) */
-       const char                  *string;    /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
-       const char                  *compose;   /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-   };
-
-   struct _Ecore_IMF_Event_Key_Up
-     {
-       char                        *keyname;   /**< The string name of the key pressed */
-       Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
-       Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
-       const char                  *key;       /**< The logical key : (eg shift+1 == exclamation) */
-       const char                  *string;    /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
-       const char                  *compose;   /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
-       unsigned int                 timestamp; /**< The timestamp when the event occured */
-     };
-
-   union _Ecore_IMF_Event
-     {
-       Ecore_IMF_Event_Mouse_Down mouse_down;
-       Ecore_IMF_Event_Mouse_Up mouse_up;
-       Ecore_IMF_Event_Mouse_In mouse_in;
-       Ecore_IMF_Event_Mouse_Out mouse_out;
-       Ecore_IMF_Event_Mouse_Move mouse_move;
-       Ecore_IMF_Event_Mouse_Wheel mouse_wheel;
-       Ecore_IMF_Event_Key_Down key_down;
-       Ecore_IMF_Event_Key_Up key_up;
-     };
-
-   struct _Ecore_IMF_Context_Class
-     {
-       void (*add)                 (Ecore_IMF_Context *ctx);
-       void (*del)                 (Ecore_IMF_Context *ctx);
-       void (*client_window_set)   (Ecore_IMF_Context *ctx, void *window);
-       void (*client_canvas_set)   (Ecore_IMF_Context *ctx, void *canvas);
-       void (*show)                (Ecore_IMF_Context *ctx);
-       void (*hide)                (Ecore_IMF_Context *ctx);
-       void (*preedit_string_get)  (Ecore_IMF_Context *ctx, char **str, int *cursor_pos);
-       void (*focus_in)            (Ecore_IMF_Context *ctx);
-       void (*focus_out)           (Ecore_IMF_Context *ctx);
-       void (*reset)               (Ecore_IMF_Context *ctx);
-       void (*cursor_position_set) (Ecore_IMF_Context *ctx, int cursor_pos);
-       void (*use_preedit_set)     (Ecore_IMF_Context *ctx, int use_preedit);
-       void (*input_mode_set)      (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
-       int  (*filter_event)        (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
-     };
-
-   struct _Ecore_IMF_Context_Info
-     {
-       const char *id;              /* ID */
-       const char *description;     /* Human readable description */
-       const char *default_locales; /* Languages for which this context is the default, separated by : */
-       const char *canvas_type;     /* The canvas type used by the input method. Eg.: evas */
-       int         canvas_required; /* Whether the canvas usage is required for this input method */
-     };
-
-   EAPI int                           ecore_imf_init(void);
-   EAPI int                           ecore_imf_shutdown(void);
-
-   EAPI Ecore_List                   *ecore_imf_context_available_ids_get(void);
-   EAPI Ecore_List                   *ecore_imf_context_available_ids_by_canvas_type_get(const char *canvas_type);
-   EAPI const char                   *ecore_imf_context_default_id_get(void);
-   EAPI const char                   *ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type);
-   EAPI const Ecore_IMF_Context_Info *ecore_imf_context_info_by_id_get(const char *id);
-
-   EAPI Ecore_IMF_Context            *ecore_imf_context_add(const char *id);
-   EAPI const Ecore_IMF_Context_Info *ecore_imf_context_info_get(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_del(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_client_window_set(Ecore_IMF_Context *ctx, void *window);
-   EAPI void                          ecore_imf_context_client_canvas_set(Ecore_IMF_Context *ctx, void *canvas);
-   EAPI void                          ecore_imf_context_show(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_hide(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cursor_pos);
-   EAPI void                          ecore_imf_context_focus_in(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_focus_out(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_reset(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_cursor_position_set(Ecore_IMF_Context *ctx, int cursor_pos);
-   EAPI void                          ecore_imf_context_use_preedit_set(Ecore_IMF_Context *ctx, int use_preedit);
-   EAPI void                          ecore_imf_context_retrieve_surrounding_callback_set(Ecore_IMF_Context *ctx, int (*func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos), const void *data);
-   EAPI void                          ecore_imf_context_input_mode_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
-   EAPI Ecore_IMF_Input_Mode          ecore_imf_context_input_mode_get(Ecore_IMF_Context *ctx);
-   EAPI int                           ecore_imf_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
-
-   /* plugin specific functions */
-   EAPI Ecore_IMF_Context            *ecore_imf_context_new(const Ecore_IMF_Context_Class *ctxc);
-   EAPI void                          ecore_imf_context_data_set(Ecore_IMF_Context *ctx, void *data);
-   EAPI void                         *ecore_imf_context_data_get(Ecore_IMF_Context *ctx);
-   EAPI int                           ecore_imf_context_surrounding_get(Ecore_IMF_Context *ctx, char **text, int *cursor_pos);
-   EAPI void                          ecore_imf_context_preedit_start_event_add(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_preedit_end_event_add(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_preedit_changed_event_add(Ecore_IMF_Context *ctx);
-   EAPI void                          ecore_imf_context_commit_event_add(Ecore_IMF_Context *ctx, const char *str);
-   EAPI void                          ecore_imf_context_delete_surrounding_event_add(Ecore_IMF_Context *ctx, int offset, int n_chars);
-
-   /* The following entry points must be exported by each input method module
-    */
-
-   /*
-    * int                imf_module_init   (const Ecore_IMF_Context_Info **info);
-    * void               imf_module_exit   (void);
-    * Ecore_IMF_Context *imf_module_create (void);
-    */
+/**
+ * @addtogroup Ecore_IMF_Context_Group
+ *
+ * @{
+ */
+/* ecore_imf_context_input_panel_event_callback_add() flag */
+typedef enum
+{
+   ECORE_IMF_INPUT_PANEL_STATE_EVENT,              /**< called when the state of the input panel is changed. @since 1.7 */
+   ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT,           /**< called when the language of the input panel is changed. @since 1.7 */
+   ECORE_IMF_INPUT_PANEL_SHIFT_MODE_EVENT,         /**< called when the shift key state of the input panel is changed @since 1.7 */
+   ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT,           /**< called when the size of the input panel is changed. @since 1.7 */
+   ECORE_IMF_CANDIDATE_PANEL_STATE_EVENT,          /**< called when the state of the candidate word panel is changed. @since 1.7 */
+   ECORE_IMF_CANDIDATE_PANEL_GEOMETRY_EVENT        /**< called when the size of the candidate word panel is changed. @since 1.7 */
+} Ecore_IMF_Input_Panel_Event;
+
+typedef enum
+{
+   ECORE_IMF_INPUT_PANEL_STATE_SHOW,        /**< Notification after the display of the input panel @since 1.7 */
+   ECORE_IMF_INPUT_PANEL_STATE_HIDE,        /**< Notification prior to the dismissal of the input panel @since 1.7 */
+   ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW    /**< Notification prior to the display of the input panel @since 1.7 */
+} Ecore_IMF_Input_Panel_State;
+
+typedef enum
+{
+    ECORE_IMF_INPUT_PANEL_SHIFT_MODE_OFF, /**< @since 1.7 */
+    ECORE_IMF_INPUT_PANEL_SHIFT_MODE_ON   /**< @since 1.7 */
+} Ecore_IMF_Input_Panel_Shift_Mode;
+
+typedef enum
+{
+   ECORE_IMF_CANDIDATE_PANEL_SHOW,        /**< Notification after the display of the candidate word panel @since 1.7 */
+   ECORE_IMF_CANDIDATE_PANEL_HIDE         /**< Notification prior to the dismissal of the candidate word panel @since 1.7 */
+} Ecore_IMF_Candidate_Panel_State;
+
+/* Events sent by the Input Method */
+typedef struct _Ecore_IMF_Event_Preedit_Start      Ecore_IMF_Event_Preedit_Start;
+typedef struct _Ecore_IMF_Event_Preedit_End        Ecore_IMF_Event_Preedit_End;
+typedef struct _Ecore_IMF_Event_Preedit_Changed    Ecore_IMF_Event_Preedit_Changed;
+typedef struct _Ecore_IMF_Event_Commit             Ecore_IMF_Event_Commit;
+typedef struct _Ecore_IMF_Event_Delete_Surrounding Ecore_IMF_Event_Delete_Surrounding;
+
+/* Events to filter */
+typedef struct _Ecore_IMF_Event_Mouse_Down         Ecore_IMF_Event_Mouse_Down;
+typedef struct _Ecore_IMF_Event_Mouse_Up           Ecore_IMF_Event_Mouse_Up;
+typedef struct _Ecore_IMF_Event_Mouse_In           Ecore_IMF_Event_Mouse_In;
+typedef struct _Ecore_IMF_Event_Mouse_Out          Ecore_IMF_Event_Mouse_Out;
+typedef struct _Ecore_IMF_Event_Mouse_Move         Ecore_IMF_Event_Mouse_Move;
+typedef struct _Ecore_IMF_Event_Mouse_Wheel        Ecore_IMF_Event_Mouse_Wheel;
+typedef struct _Ecore_IMF_Event_Key_Down           Ecore_IMF_Event_Key_Down;
+typedef struct _Ecore_IMF_Event_Key_Up             Ecore_IMF_Event_Key_Up;
+typedef union  _Ecore_IMF_Event                    Ecore_IMF_Event;
+
+typedef struct _Ecore_IMF_Context                  Ecore_IMF_Context;                  /**< An Input Method Context */
+typedef struct _Ecore_IMF_Context_Class            Ecore_IMF_Context_Class;            /**< An Input Method Context class */
+typedef struct _Ecore_IMF_Context_Info             Ecore_IMF_Context_Info;             /**< An Input Method Context info */
+
+/* Preedit attribute info */
+typedef struct _Ecore_IMF_Preedit_Attr             Ecore_IMF_Preedit_Attr;
+
+EAPI extern int ECORE_IMF_EVENT_PREEDIT_START;
+EAPI extern int ECORE_IMF_EVENT_PREEDIT_END;
+EAPI extern int ECORE_IMF_EVENT_PREEDIT_CHANGED;
+EAPI extern int ECORE_IMF_EVENT_COMMIT;
+EAPI extern int ECORE_IMF_EVENT_DELETE_SURROUNDING;
+
+typedef void (*Ecore_IMF_Event_Cb) (void *data, Ecore_IMF_Context *ctx, void *event_info);
+
+/**
+ * @typedef Ecore_IMF_Callback_Type
+ *
+ * Ecore IMF Event callback types.
+ *
+ * @see ecore_imf_context_event_callback_add()
+ */
+typedef enum
+{
+   ECORE_IMF_CALLBACK_PREEDIT_START,      /**< "PREEDIT_START" is called when a new preediting sequence starts. @since 1.2 */
+   ECORE_IMF_CALLBACK_PREEDIT_END,        /**< "PREEDIT_END" is called when a preediting sequence has been completed or canceled. @since 1.2 */
+   ECORE_IMF_CALLBACK_PREEDIT_CHANGED,    /**< "PREEDIT_CHANGED" is called whenever the preedit sequence currently being entered has changed. @since 1.2 */
+   ECORE_IMF_CALLBACK_COMMIT,             /**< "COMMIT" is called when a complete input sequence has been entered by the user @since 1.2 */
+   ECORE_IMF_CALLBACK_DELETE_SURROUNDING  /**< "DELETE_SURROUNDING" is called when the input method needs to delete all or part of the context surrounding the cursor @since 1.2 */
+} Ecore_IMF_Callback_Type;
+
+/**
+ * @typedef Ecore_IMF_Event_Type
+ *
+ * Ecore IMF event types.
+ *
+ * @see ecore_imf_context_filter_event()
+ */
+typedef enum
+{
+   ECORE_IMF_EVENT_MOUSE_DOWN,  /**< Mouse Down event */
+   ECORE_IMF_EVENT_MOUSE_UP,    /**< Mouse Up event */
+   ECORE_IMF_EVENT_MOUSE_IN,    /**< Mouse In event */
+   ECORE_IMF_EVENT_MOUSE_OUT,   /**< Mouse Out event */
+   ECORE_IMF_EVENT_MOUSE_MOVE,  /**< Mouse Move event */
+   ECORE_IMF_EVENT_MOUSE_WHEEL, /**< Mouse Wheel event */
+   ECORE_IMF_EVENT_KEY_DOWN,    /**< Key Down event */
+   ECORE_IMF_EVENT_KEY_UP       /**< Key Up event */
+} Ecore_IMF_Event_Type;
+/**
+ * @typedef Ecore_IMF_Keyboard_Modifiers
+ * Type for Ecore_IMF keyboard modifiers
+ */
+typedef enum
+{
+   ECORE_IMF_KEYBOARD_MODIFIER_NONE  = 0,      /**< No active modifiers */
+   ECORE_IMF_KEYBOARD_MODIFIER_CTRL  = 1 << 0, /**< "Control" is pressed */
+   ECORE_IMF_KEYBOARD_MODIFIER_ALT   = 1 << 1, /**< "Alt" is pressed */
+   ECORE_IMF_KEYBOARD_MODIFIER_SHIFT = 1 << 2, /**< "Shift" is pressed */
+   ECORE_IMF_KEYBOARD_MODIFIER_WIN   = 1 << 3, /**< "Win" (between "Ctrl" and "Alt") is pressed */
+   ECORE_IMF_KEYBOARD_MODIFIER_ALTGR = 1 << 4  /**< "AltGr" is pressed @since 1.7 */
+} Ecore_IMF_Keyboard_Modifiers;
+
+/**
+ * @typedef Ecore_IMF_Keyboard_Locks
+ * Type for Ecore_IMF keyboard locks
+ */
+typedef enum
+{
+   ECORE_IMF_KEYBOARD_LOCK_NONE      = 0,      /**< No locks are active */
+   ECORE_IMF_KEYBOARD_LOCK_NUM       = 1 << 0, /**< "Num" lock is active */
+   ECORE_IMF_KEYBOARD_LOCK_CAPS      = 1 << 1, /**< "Caps" lock is active */
+   ECORE_IMF_KEYBOARD_LOCK_SCROLL    = 1 << 2  /**< "Scroll" lock is active */
+} Ecore_IMF_Keyboard_Locks;
+
+/**
+ * @typedef Ecore_IMF_Mouse_Flags
+ * Type for Ecore_IMF mouse flags
+ */
+typedef enum
+{
+   ECORE_IMF_MOUSE_NONE              = 0,      /**< A single click */
+   ECORE_IMF_MOUSE_DOUBLE_CLICK      = 1 << 0, /**< A double click */
+   ECORE_IMF_MOUSE_TRIPLE_CLICK      = 1 << 1  /**< A triple click */
+} Ecore_IMF_Mouse_Flags;
+
+typedef enum
+{
+   ECORE_IMF_INPUT_MODE_ALPHA        = 1 << 0,
+   ECORE_IMF_INPUT_MODE_NUMERIC      = 1 << 1,
+   ECORE_IMF_INPUT_MODE_SPECIAL      = 1 << 2,
+   ECORE_IMF_INPUT_MODE_HEXA         = 1 << 3,
+   ECORE_IMF_INPUT_MODE_TELE         = 1 << 4,
+   ECORE_IMF_INPUT_MODE_FULL         = (ECORE_IMF_INPUT_MODE_ALPHA | ECORE_IMF_INPUT_MODE_NUMERIC | ECORE_IMF_INPUT_MODE_SPECIAL),
+   ECORE_IMF_INPUT_MODE_INVISIBLE    = 1 << 29,
+   ECORE_IMF_INPUT_MODE_AUTOCAP      = 1 << 30
+} Ecore_IMF_Input_Mode;
+
+/**
+ * @typedef Ecore_IMF_Preedit_Type
+ *
+ * Ecore IMF Preedit style types
+ *
+ * @see ecore_imf_context_preedit_string_with_attributes_get()
+ */
+typedef enum
+{
+   ECORE_IMF_PREEDIT_TYPE_NONE, /**< None style @since 1.1 */
+   ECORE_IMF_PREEDIT_TYPE_SUB1, /**< Substring style 1 @since 1.1 */
+   ECORE_IMF_PREEDIT_TYPE_SUB2, /**< Substring style 2 @since 1.1 */
+   ECORE_IMF_PREEDIT_TYPE_SUB3, /**< Substring style 3 @since 1.1 */
+   ECORE_IMF_PREEDIT_TYPE_SUB4, /**< Substring style 4 @since 1.8 */
+   ECORE_IMF_PREEDIT_TYPE_SUB5, /**< Substring style 5 @since 1.8 */
+   ECORE_IMF_PREEDIT_TYPE_SUB6, /**< Substring style 6 @since 1.8 */
+   ECORE_IMF_PREEDIT_TYPE_SUB7  /**< Substring style 7 @since 1.8 */
+} Ecore_IMF_Preedit_Type;
+
+/**
+ * @typedef Ecore_IMF_Autocapital_Type
+ *
+ * Autocapitalization Types.
+ *
+ * @see ecore_imf_context_autocapital_type_set()
+ */
+typedef enum
+{
+   ECORE_IMF_AUTOCAPITAL_TYPE_NONE,         /**< No auto-capitalization when typing @since 1.1 */
+   ECORE_IMF_AUTOCAPITAL_TYPE_WORD,         /**< Autocapitalize each word typed @since 1.1 */
+   ECORE_IMF_AUTOCAPITAL_TYPE_SENTENCE,     /**< Autocapitalize the start of each sentence @since 1.1 */
+   ECORE_IMF_AUTOCAPITAL_TYPE_ALLCHARACTER, /**< Autocapitalize all letters @since 1.1 */
+} Ecore_IMF_Autocapital_Type;
+
+/**
+ * @typedef Ecore_IMF_Input_Panel_Layout
+ *
+ * Input panel (virtual keyboard) layout types.
+ *
+ * @see ecore_imf_context_input_panel_layout_set()
+ */
+typedef enum
+{
+   ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL,          /**< Default layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER,          /**< Number layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL,           /**< Email layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_URL,             /**< URL layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_PHONENUMBER,     /**< Phone Number layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_IP,              /**< IP layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_MONTH,           /**< Month layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBERONLY,      /**< Number Only layout */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_INVALID,         /**< Never use this */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_HEX,             /**< Hexadecimal layout @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_TERMINAL,        /**< Command-line terminal layout including esc, alt, ctrl key, so on (no auto-correct, no auto-capitalization) @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_LAYOUT_PASSWORD         /**< Like normal, but no auto-correct, no auto-capitalization etc. @since 1.2 */
+} Ecore_IMF_Input_Panel_Layout;
+
+/**
+ * @typedef Ecore_IMF_Input_Panel_Lang
+ *
+ * Input panel (virtual keyboard) language modes.
+ *
+ * @see ecore_imf_context_input_panel_language_set()
+ */
+typedef enum
+{
+   ECORE_IMF_INPUT_PANEL_LANG_AUTOMATIC,    /**< Automatic @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_LANG_ALPHABET      /**< Alphabet @since 1.2 */
+} Ecore_IMF_Input_Panel_Lang;
+
+/**
+ * @typedef Ecore_IMF_Input_Panel_Return_Key_Type
+ *
+ * "Return" Key types on the input panel (virtual keyboard).
+ *
+ * @see ecore_imf_context_input_panel_return_key_type_set()
+ */
+typedef enum
+{
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT, /**< Default @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE,    /**< Done @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_GO,      /**< Go @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_JOIN,    /**< Join @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_LOGIN,   /**< Login @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_NEXT,    /**< Next @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SEARCH,  /**< Search or magnifier icon @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SEND,    /**< Send @since 1.2 */
+   ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SIGNIN   /**< Sign-in @since 1.8 */
+} Ecore_IMF_Input_Panel_Return_Key_Type;
+
+struct _Ecore_IMF_Event_Preedit_Start
+{
+   Ecore_IMF_Context *ctx;
+};
+
+struct _Ecore_IMF_Event_Preedit_End
+{
+   Ecore_IMF_Context *ctx;
+};
+
+struct _Ecore_IMF_Event_Preedit_Changed
+{
+   Ecore_IMF_Context *ctx;
+};
+
+struct _Ecore_IMF_Event_Commit
+{
+   Ecore_IMF_Context *ctx;
+   char              *str;
+};
+
+struct _Ecore_IMF_Event_Delete_Surrounding
+{
+   Ecore_IMF_Context *ctx;
+   int                offset;
+   int                n_chars;
+};
+
+struct _Ecore_IMF_Event_Mouse_Down
+{
+   int button;                             /**< The button which has been pressed */
+   struct {
+      int x, y;
+   } output;
+   struct {
+      int x, y;
+   } canvas;
+   Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
+   Ecore_IMF_Mouse_Flags        flags;     /**< The flags corresponding the mouse click (single, double or triple click) */
+   unsigned int                 timestamp; /**< The timestamp when the event occurred */
+};
+
+struct _Ecore_IMF_Event_Mouse_Up
+{
+   int button;                             /**< The button which has been pressed */
+   struct {
+      int x, y;
+   } output;
+   struct {
+      int x, y;
+   } canvas;
+   Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
+   Ecore_IMF_Mouse_Flags        flags;     /**< The flags corresponding the mouse click (single, double or triple click) */
+   unsigned int                 timestamp; /**< The timestamp when the event occurred */
+};
+
+struct _Ecore_IMF_Event_Mouse_In
+{
+   int buttons;
+   struct {
+      int x, y;
+   } output;
+   struct {
+      int x, y;
+   } canvas;
+   Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
+   unsigned int                 timestamp; /**< The timestamp when the event occurred */
+};
+
+struct _Ecore_IMF_Event_Mouse_Out
+{
+   int buttons;
+   struct {
+      int x, y;
+   } output;
+   struct {
+      int x, y;
+   } canvas;
+   Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
+   unsigned int                 timestamp; /**< The timestamp when the event occurred */
+};
+
+struct _Ecore_IMF_Event_Mouse_Move
+{
+   int buttons;
+   struct {
+      struct {
+         int x, y;
+      } output;
+      struct {
+         int x, y;
+      } canvas;
+   } cur, prev;
+   Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
+   unsigned int                 timestamp; /**< The timestamp when the event occurred */
+};
+
+struct _Ecore_IMF_Event_Mouse_Wheel
+{
+   int direction;                         /* 0 = default up/down wheel */
+   int z;                                 /* ...,-2,-1 = down, 1,2,... = up */
+   struct {
+      int x, y;
+   } output;
+   struct {
+      int x, y;
+   } canvas;
+   Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks     locks;     /**< The keyboard locks active when the event has been emitted */
+   unsigned int                 timestamp; /**< The timestamp when the event occurred */
+};
+
+struct _Ecore_IMF_Event_Key_Down
+{
+   const char                   *keyname;   /**< The string name of the key pressed */
+   Ecore_IMF_Keyboard_Modifiers  modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks      locks;     /**< The keyboard locks active when the event has been emitted */
+   const char                   *key;       /**< The logical key : (eg shift+1 == exclamation) */
+   const char                   *string;    /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
+   const char                   *compose;   /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
+   unsigned int                  timestamp; /**< The timestamp when the event occurred */
+};
+
+struct _Ecore_IMF_Event_Key_Up
+{
+   const char                   *keyname;   /**< The string name of the key pressed */
+   Ecore_IMF_Keyboard_Modifiers  modifiers; /**< The keyboard modifiers active when the event has been emitted */
+   Ecore_IMF_Keyboard_Locks      locks;     /**< The keyboard locks active when the event has been emitted */
+   const char                   *key;       /**< The logical key : (eg shift+1 == exclamation) */
+   const char                   *string;    /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
+   const char                   *compose;   /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
+   unsigned int                  timestamp; /**< The timestamp when the event occurred */
+};
+
+union _Ecore_IMF_Event
+{
+   Ecore_IMF_Event_Mouse_Down  mouse_down;
+   Ecore_IMF_Event_Mouse_Up    mouse_up;
+   Ecore_IMF_Event_Mouse_In    mouse_in;
+   Ecore_IMF_Event_Mouse_Out   mouse_out;
+   Ecore_IMF_Event_Mouse_Move  mouse_move;
+   Ecore_IMF_Event_Mouse_Wheel mouse_wheel;
+   Ecore_IMF_Event_Key_Down    key_down;
+   Ecore_IMF_Event_Key_Up      key_up;
+};
+
+struct _Ecore_IMF_Preedit_Attr
+{
+   Ecore_IMF_Preedit_Type preedit_type; /**< preedit style type */
+   unsigned int start_index;            /**< start index of the range (in bytes) */
+   unsigned int end_index;              /**< end index of the range (in bytes) */
+};
+
+struct _Ecore_IMF_Context_Class
+{
+   void (*add)                 (Ecore_IMF_Context *ctx);
+   void (*del)                 (Ecore_IMF_Context *ctx);
+   void (*client_window_set)   (Ecore_IMF_Context *ctx, void *window);
+   void (*client_canvas_set)   (Ecore_IMF_Context *ctx, void *canvas);
+   void (*show)                (Ecore_IMF_Context *ctx);
+   void (*hide)                (Ecore_IMF_Context *ctx);
+   void (*preedit_string_get)  (Ecore_IMF_Context *ctx, char **str, int *cursor_pos);
+   void (*focus_in)            (Ecore_IMF_Context *ctx);
+   void (*focus_out)           (Ecore_IMF_Context *ctx);
+   void (*reset)               (Ecore_IMF_Context *ctx);
+   void (*cursor_position_set) (Ecore_IMF_Context *ctx, int cursor_pos);
+   void (*use_preedit_set)     (Ecore_IMF_Context *ctx, Eina_Bool use_preedit);
+   void (*input_mode_set)      (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
+   Eina_Bool (*filter_event)   (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
+   void (*preedit_string_with_attributes_get) (Ecore_IMF_Context *ctx, char **str, Eina_List **attrs, int *cursor_pos);
+   void (*prediction_allow_set)(Ecore_IMF_Context *ctx, Eina_Bool prediction);
+   void (*autocapital_type_set)(Ecore_IMF_Context *ctx, Ecore_IMF_Autocapital_Type autocapital_type);
+   void (*control_panel_show)   (Ecore_IMF_Context *ctx);
+   void (*control_panel_hide)   (Ecore_IMF_Context *ctx);
+   void (*input_panel_layout_set) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout);
+   Ecore_IMF_Input_Panel_Layout (*input_panel_layout_get) (Ecore_IMF_Context *ctx);
+   void (*input_panel_language_set) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang);
+   Ecore_IMF_Input_Panel_Lang (*input_panel_language_get) (Ecore_IMF_Context *ctx);
+   void (*cursor_location_set) (Ecore_IMF_Context *ctx, int x, int y, int w, int h);
+   void (*input_panel_imdata_set)(Ecore_IMF_Context *ctx, const void* data, int len);
+   void (*input_panel_imdata_get)(Ecore_IMF_Context *ctx, void* data, int *len);
+   void (*input_panel_return_key_type_set) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Return_Key_Type return_key_type);
+   void (*input_panel_return_key_disabled_set) (Ecore_IMF_Context *ctx, Eina_Bool disabled);
+   void (*input_panel_caps_lock_mode_set) (Ecore_IMF_Context *ctx, Eina_Bool mode);
+   void (*input_panel_geometry_get)(Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h);
+   Ecore_IMF_Input_Panel_State (*input_panel_state_get) (Ecore_IMF_Context *ctx);
+   void (*input_panel_event_callback_add) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Event type, void (*func) (void *data, Ecore_IMF_Context *ctx, int value), void *data);
+   void (*input_panel_event_callback_del) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Event type, void (*func) (void *data, Ecore_IMF_Context *ctx, int value));
+   void (*input_panel_language_locale_get) (Ecore_IMF_Context *ctx, char **lang);
+   void (*candidate_panel_geometry_get)(Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h);
+};
+
+struct _Ecore_IMF_Context_Info
+{
+   const char *id;              /* ID */
+   const char *description;     /* Human readable description */
+   const char *default_locales; /* Languages for which this context is the default, separated by : */
+   const char *canvas_type;     /* The canvas type used by the input method. Eg.: evas */
+   int         canvas_required; /* Whether the canvas usage is required for this input method */
+};
+
+/**
+ * @}
+ */
+
+EAPI int                           ecore_imf_init(void);
+EAPI int                           ecore_imf_shutdown(void);
+
+EAPI void                          ecore_imf_module_register(const Ecore_IMF_Context_Info *info, Ecore_IMF_Context *(*imf_module_create)(void), Ecore_IMF_Context *(*imf_module_exit)(void));
+
+EAPI Eina_List                    *ecore_imf_context_available_ids_get(void);
+EAPI Eina_List                    *ecore_imf_context_available_ids_by_canvas_type_get(const char *canvas_type);
+EAPI const char                   *ecore_imf_context_default_id_get(void);
+EAPI const char                   *ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type);
+EAPI const Ecore_IMF_Context_Info *ecore_imf_context_info_by_id_get(const char *id);
+
+EAPI Ecore_IMF_Context            *ecore_imf_context_add(const char *id);
+EAPI const Ecore_IMF_Context_Info *ecore_imf_context_info_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_del(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_client_window_set(Ecore_IMF_Context *ctx, void *window);
+EAPI void                         *ecore_imf_context_client_window_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_client_canvas_set(Ecore_IMF_Context *ctx, void *canvas);
+EAPI void                         *ecore_imf_context_client_canvas_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_show(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_hide(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cursor_pos);
+EAPI void                          ecore_imf_context_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, char **str, Eina_List **attrs, int *cursor_pos);
+EAPI void                          ecore_imf_context_focus_in(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_focus_out(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_reset(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_cursor_position_set(Ecore_IMF_Context *ctx, int cursor_pos);
+EAPI void                          ecore_imf_context_cursor_location_set(Ecore_IMF_Context *ctx, int x, int y, int w, int h);
+EAPI void                          ecore_imf_context_use_preedit_set(Ecore_IMF_Context *ctx, Eina_Bool use_preedit);
+EAPI void                          ecore_imf_context_retrieve_surrounding_callback_set(Ecore_IMF_Context *ctx, Eina_Bool (*func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos), const void *data);
+EAPI void                          ecore_imf_context_input_mode_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
+EAPI Ecore_IMF_Input_Mode          ecore_imf_context_input_mode_get(Ecore_IMF_Context *ctx);
+EAPI Eina_Bool                     ecore_imf_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
+
+/* plugin specific functions */
+EAPI Ecore_IMF_Context            *ecore_imf_context_new(const Ecore_IMF_Context_Class *ctxc);
+EAPI void                          ecore_imf_context_data_set(Ecore_IMF_Context *ctx, void *data);
+EAPI void                         *ecore_imf_context_data_get(Ecore_IMF_Context *ctx);
+EAPI Eina_Bool                     ecore_imf_context_surrounding_get(Ecore_IMF_Context *ctx, char **text, int *cursor_pos);
+EAPI void                          ecore_imf_context_preedit_start_event_add(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_preedit_end_event_add(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_preedit_changed_event_add(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_commit_event_add(Ecore_IMF_Context *ctx, const char *str);
+EAPI void                          ecore_imf_context_delete_surrounding_event_add(Ecore_IMF_Context *ctx, int offset, int n_chars);
+EAPI void                          ecore_imf_context_event_callback_add(Ecore_IMF_Context *ctx, Ecore_IMF_Callback_Type type, Ecore_IMF_Event_Cb func, const void *data);
+EAPI void                         *ecore_imf_context_event_callback_del(Ecore_IMF_Context *ctx, Ecore_IMF_Callback_Type type, Ecore_IMF_Event_Cb func);
+EAPI void                          ecore_imf_context_event_callback_call(Ecore_IMF_Context *ctx, Ecore_IMF_Callback_Type type, void *event_info);
+EAPI void                          ecore_imf_context_prediction_allow_set(Ecore_IMF_Context *ctx, Eina_Bool prediction);
+EAPI Eina_Bool                     ecore_imf_context_prediction_allow_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_autocapital_type_set(Ecore_IMF_Context *ctx, Ecore_IMF_Autocapital_Type autocapital_type);
+EAPI Ecore_IMF_Autocapital_Type    ecore_imf_context_autocapital_type_get(Ecore_IMF_Context *ctx);
+
+EAPI void                          ecore_imf_context_control_panel_show(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_control_panel_hide(Ecore_IMF_Context *ctx);
+
+EAPI void                          ecore_imf_context_input_panel_show(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_hide(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_layout_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout);
+EAPI Ecore_IMF_Input_Panel_Layout  ecore_imf_context_input_panel_layout_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_language_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang);
+EAPI Ecore_IMF_Input_Panel_Lang    ecore_imf_context_input_panel_language_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_enabled_set(Ecore_IMF_Context *ctx, Eina_Bool enable);
+EAPI Eina_Bool                     ecore_imf_context_input_panel_enabled_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_imdata_set(Ecore_IMF_Context *ctx, const void *data, int len);
+EAPI void                          ecore_imf_context_input_panel_imdata_get(Ecore_IMF_Context *ctx, void *data, int *len);
+EAPI void                          ecore_imf_context_input_panel_return_key_type_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Return_Key_Type return_key_type);
+EAPI Ecore_IMF_Input_Panel_Return_Key_Type ecore_imf_context_input_panel_return_key_type_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_return_key_disabled_set(Ecore_IMF_Context *ctx, Eina_Bool disabled);
+EAPI Eina_Bool                     ecore_imf_context_input_panel_return_key_disabled_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_caps_lock_mode_set(Ecore_IMF_Context *ctx, Eina_Bool mode);
+EAPI Eina_Bool                     ecore_imf_context_input_panel_caps_lock_mode_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_geometry_get(Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h);
+EAPI Ecore_IMF_Input_Panel_State   ecore_imf_context_input_panel_state_get(Ecore_IMF_Context *ctx);
+EAPI void                          ecore_imf_context_input_panel_event_callback_add(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Event type, void (*func) (void *data, Ecore_IMF_Context *ctx, int value), const void *data);
+EAPI void                          ecore_imf_context_input_panel_event_callback_del(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Event type, void (*func) (void *data, Ecore_IMF_Context *ctx, int value));
+EAPI void                          ecore_imf_context_input_panel_language_locale_get(Ecore_IMF_Context *ctx, char **lang);
+EAPI void                          ecore_imf_context_candidate_panel_geometry_get(Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h);
+
+/* The following entry points must be exported by each input method module
+ */
+
+/*
+ * int                imf_module_init   (const Ecore_IMF_Context_Info **info);
+ * void               imf_module_exit   (void);
+ * Ecore_IMF_Context *imf_module_create (void);
+ */
 
 #ifdef __cplusplus
 }
index f13a264..10f6c2f 100644 (file)
@@ -1,31 +1,28 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-if BUILD_ECORE_IMF
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
--DPACKAGE_LIB_DIR=\"$(libdir)\"
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+@EFL_ECORE_IMF_BUILD@ \
+@EVIL_CFLAGS@ \
+@EINA_CFLAGS@
 
 AM_CFLAGS = @WIN32_CFLAGS@
 
 lib_LTLIBRARIES = libecore_imf.la
-include_HEADERS = \
-Ecore_IMF.h
+includes_HEADERS = Ecore_IMF.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_imf_la_SOURCES = \
 ecore_imf.c \
 ecore_imf_context.c \
-ecore_imf_module.c \
-ecore_imf_private.h
+ecore_imf_module.c
 
 libecore_imf_la_LIBADD = \
-$(top_builddir)/src/lib/ecore/libecore.la
+$(top_builddir)/src/lib/ecore/libecore.la \
+@EINA_LIBS@ \
+@EVIL_LIBS@
 
-libecore_imf_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
-endif
+libecore_imf_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
 
-EXTRA_DIST = \
-Ecore_IMF.h \
-ecore_imf.c \
-ecore_imf_context.c \
-ecore_imf_module.c \
-ecore_imf_private.h
+EXTRA_DIST = ecore_imf_private.h
index caf9671..7cf8a4a 100644 (file)
@@ -1,21 +1,21 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
-#include "config.h"
+#include <Ecore.h>
+#include <ecore_private.h>
 
 #include "Ecore_IMF.h"
 #include "ecore_imf_private.h"
 
-#include <Ecore.h>
-
 EAPI int ECORE_IMF_EVENT_PREEDIT_START = 0;
 EAPI int ECORE_IMF_EVENT_PREEDIT_END = 0;
 EAPI int ECORE_IMF_EVENT_PREEDIT_CHANGED = 0;
 EAPI int ECORE_IMF_EVENT_COMMIT = 0;
 EAPI int ECORE_IMF_EVENT_DELETE_SURROUNDING = 0;
 
-static int init_count = 0;
+int _ecore_imf_log_dom = -1;
+static int _ecore_imf_init_count = 0;
 
 /**
  * @defgroup Ecore_IMF_Lib_Group Ecore Input Method Library Functions
@@ -33,9 +33,17 @@ static int init_count = 0;
 EAPI int
 ecore_imf_init(void)
 {
-   if (++init_count != 1) return init_count;
+   if (++_ecore_imf_init_count != 1) return _ecore_imf_init_count;
 
-   ecore_init();
+   if (!ecore_init()) return --_ecore_imf_init_count;
+   _ecore_imf_log_dom = eina_log_domain_register
+      ("ecore_imf", ECORE_IMF_DEFAULT_LOG_COLOR);
+   if (_ecore_imf_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for the Ecore IMF module.");
+        ecore_shutdown();
+        return --_ecore_imf_init_count;
+     }
    ecore_imf_module_init();
 
    ECORE_IMF_EVENT_PREEDIT_START = ecore_event_type_new();
@@ -44,7 +52,7 @@ ecore_imf_init(void)
    ECORE_IMF_EVENT_COMMIT = ecore_event_type_new();
    ECORE_IMF_EVENT_DELETE_SURROUNDING = ecore_event_type_new();
 
-   return init_count;
+   return _ecore_imf_init_count;
 }
 
 /**
@@ -56,10 +64,10 @@ ecore_imf_init(void)
 EAPI int
 ecore_imf_shutdown(void)
 {
-   if (--init_count != 0) return init_count;
-
-   ecore_shutdown();
+   if (--_ecore_imf_init_count != 0) return _ecore_imf_init_count;
    ecore_imf_module_shutdown();
-
-   return init_count;
+   eina_log_domain_unregister(_ecore_imf_log_dom);
+   _ecore_imf_log_dom = -1;
+   ecore_shutdown();
+   return _ecore_imf_init_count;
 }
index 83f1fd4..d9aeca9 100644 (file)
@@ -1,40 +1,57 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
-#include <locale.h>
 #include <stdlib.h>
+#include <string.h>
+#include <locale.h>
 
-#include "config.h"
+#include <Ecore.h>
+#include <ecore_private.h>
 
 #include "Ecore_IMF.h"
 #include "ecore_imf_private.h"
 
-#include <Ecore.h>
-
 /**
  * @defgroup Ecore_IMF_Context_Group Ecore Input Method Context Functions
  *
  * Functions that operate on Ecore Input Method Context objects.
+
+ * Ecore Input Method Context Function defines the interface for EFL input methods. 
+ * An input method is used by EFL text input widgets like elm_entry 
+ * (based on edje_entry) to map from key events to Unicode character strings.
+ *
+ * The default input method can be set through setting the ECORE_IMF_MODULE environment variable.
+ *
+ * An input method may consume multiple key events in sequence and finally output the composed result. 
+ * This is called preediting, and an input method may provide feedback about 
+ * this process by displaying the intermediate composition states as preedit text.
+ *
+ * Immodule is plugin to connect your application and input method framework such as SCIM, ibus, and so on.@n
+ * ecore_imf_init() should be called to initialize and load immodule.@n
+ * ecore_imf_shutdown() is used for shutdowning and unloading immodule.
+ *
+ * An example of usage of these functions can be found at:
+ * @li @ref ecore_imf_example_c
  */
 
 /**
  * Get the list of the available Input Method Context ids.
  *
- * Note that the caller is responsible for freeing the Ecore_List
+ * Note that the caller is responsible for freeing the Eina_List
  * when finished with it. There is no need to finish the list strings.
  *
- * @return Return an Ecore_List of strings;
+ * @return Return an Eina_List of strings;
  *         on failure it returns NULL.
  * @ingroup Ecore_IMF_Context_Group
  */
-EAPI Ecore_List *
+EAPI Eina_List *
 ecore_imf_context_available_ids_get(void)
 {
    return ecore_imf_module_context_ids_get();
 }
 
-EAPI Ecore_List *
+EAPI Eina_List *
 ecore_imf_context_available_ids_by_canvas_type_get(const char *canvas_type)
 {
    return ecore_imf_module_context_ids_by_canvas_type_get(canvas_type);
@@ -51,16 +68,16 @@ ecore_imf_context_available_ids_by_canvas_type_get(const char *canvas_type)
 static int
 _ecore_imf_context_match_locale(const char *locale, const char *against, int against_len)
 {
-  if (strcmp(against, "*") == 0)
-    return 1;
+   if (strcmp(against, "*") == 0)
+     return 1;
 
-  if (strcasecmp(locale, against) == 0)
-    return 4;
+   if (strcasecmp(locale, against) == 0)
+     return 4;
 
-  if (strncasecmp(locale, against, 2) == 0)
-    return (against_len == 2) ? 3 : 2;
+   if (strncasecmp(locale, against, 2) == 0)
+     return (against_len == 2) ? 3 : 2;
 
-  return 0;
+   return 0;
 }
 
 /**
@@ -82,7 +99,7 @@ EAPI const char *
 ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type)
 {
    const char *id;
-   Ecore_List *modules;
+   Eina_List *modules;
    Ecore_IMF_Module *module;
    char *locale;
    char *tmp;
@@ -91,8 +108,8 @@ ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type)
    id = getenv("ECORE_IMF_MODULE");
    if (id)
      {
-       if (strcmp(id, "none") == 0) return NULL;
-       if (ecore_imf_module_get(id)) return id;
+        if (strcmp(id, "none") == 0) return NULL;
+        if (ecore_imf_module_get(id)) return id;
      }
 
    modules = ecore_imf_module_available_get();
@@ -110,29 +127,27 @@ ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type)
 
    id = NULL;
 
-   ecore_list_first_goto(modules);
-   while ((module = ecore_list_next(modules)))
+   EINA_LIST_FREE(modules, module)
      {
-       if (canvas_type &&
-           strcmp(module->info->canvas_type, canvas_type) == 0)
-         continue;
-
-       const char *p = module->info->default_locales;
-       while (p)
-         {
-            const char *q = strchr(p, ':');
-            int goodness = _ecore_imf_context_match_locale(locale, p, q ? q - p : strlen (p));
-
-             if (goodness > best_goodness)
-               {
-                  id = module->info->id;
-                  best_goodness = goodness;
-               }
-
-             p = q ? q + 1 : NULL;
-         }
+        if (canvas_type &&
+            strcmp(module->info->canvas_type, canvas_type) == 0)
+          continue;
+
+        const char *p = module->info->default_locales;
+        while (p)
+          {
+             const char *q = strchr(p, ':');
+             int goodness = _ecore_imf_context_match_locale(locale, p, q ? (size_t)(q - p) : strlen (p));
+
+             if (goodness > best_goodness)
+               {
+                  id = module->info->id;
+                  best_goodness = goodness;
+               }
+
+             p = q ? q + 1 : NULL;
+          }
      }
-   ecore_list_destroy(modules);
 
    free(locale);
    return id;
@@ -145,6 +160,32 @@ ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type)
  * @return Return a #Ecore_IMF_Context_Info for the Input Method Context with @p id;
  *         on failure it returns NULL.
  * @ingroup Ecore_IMF_Context_Group
+ * 
+ * Example
+ * @code
+ *
+ * const char *ctx_id;
+ * const Ecore_IMF_Context_Info *ctx_info;
+ * Ecore_IMF_Context *imf_context;
+ * ctx_id = ecore_imf_context_default_id_get();
+ * if (ctx_id)
+ *   {
+ *      ctx_info = ecore_imf_context_info_by_id_get(ctx_id);
+ *      if (!ctx_info->canvas_type ||
+ *          strcmp(ctx_info->canvas_type, "evas") == 0)
+ *        {
+ *           imf_context = ecore_imf_context_add(ctx_id);
+ *        }
+ *      else
+ *        {
+ *           ctx_id = ecore_imf_context_default_id_by_canvas_type_get("evas");
+ *           if (ctx_id)
+ *             {
+ *                imf_context = ecore_imf_context_add(ctx_id);
+ *             }
+ *        }
+ *   }
+ * @endcode
  */
 EAPI const Ecore_IMF_Context_Info *
 ecore_imf_context_info_by_id_get(const char *id)
@@ -174,9 +215,26 @@ ecore_imf_context_add(const char *id)
    ctx = ecore_imf_module_context_create(id);
    if (!ctx || !ctx->klass) return NULL;
    if (ctx->klass->add) ctx->klass->add(ctx);
-   /* default use_preedit is 1, so let's make sure it's
+   /* default use_preedit is EINA_TRUE, so let's make sure it's
+    * set on the immodule */
+   ecore_imf_context_use_preedit_set(ctx, EINA_TRUE);
+
+   /* default prediction is EINA_TRUE, so let's make sure it's
+    * set on the immodule */
+   ecore_imf_context_prediction_allow_set(ctx, EINA_TRUE);
+
+   /* default autocapital type is SENTENCE type, so let's make sure it's
+    * set on the immodule */
+   ecore_imf_context_autocapital_type_set(ctx, ECORE_IMF_AUTOCAPITAL_TYPE_SENTENCE);
+
+   /* default input panel enabled status is EINA_TRUE, so let's make sure it's
+    * set on the immodule */
+   ecore_imf_context_input_panel_enabled_set(ctx, EINA_TRUE);
+
+   /* default input panel layout type is NORMAL type, so let's make sure it's
     * set on the immodule */
-   ecore_imf_context_use_preedit_set(ctx, 1);
+   ecore_imf_context_input_panel_layout_set(ctx, ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL);
+
    /* default input_mode is ECORE_IMF_INPUT_MODE_FULL, so let's make sure it's
     * set on the immodule */
    ecore_imf_context_input_mode_set(ctx, ECORE_IMF_INPUT_MODE_FULL);
@@ -196,9 +254,9 @@ ecore_imf_context_info_get(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_info_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_info_get");
+        return NULL;
      }
    return ctx->module->info;
 }
@@ -212,13 +270,22 @@ ecore_imf_context_info_get(Ecore_IMF_Context *ctx)
 EAPI void
 ecore_imf_context_del(Ecore_IMF_Context *ctx)
 {
+   Ecore_IMF_Func_Node *fn;
+
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_del");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_del");
+        return;
      }
    if (ctx->klass->del) ctx->klass->del(ctx);
+
+   if (ctx->callbacks)
+     {
+        EINA_LIST_FREE(ctx->callbacks, fn)
+           free(fn);
+     }
+
    ECORE_MAGIC_SET(ctx, ECORE_MAGIC_NONE);
    free(ctx);
 }
@@ -230,7 +297,7 @@ ecore_imf_context_del(Ecore_IMF_Context *ctx)
  * also be used for purposes internal to the Input Method Context.
  *
  * @param ctx An #Ecore_IMF_Context.
- * @param window The client window. This may be NULL to indicate
+ * @param window The client window. This may be @c NULL to indicate
  *               that the previous client window no longer exists.
  * @ingroup Ecore_IMF_Context_Group
  */
@@ -239,11 +306,34 @@ ecore_imf_context_client_window_set(Ecore_IMF_Context *ctx, void *window)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_client_window_set");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_client_window_set");
+        return;
      }
    if (ctx->klass->client_window_set) ctx->klass->client_window_set(ctx, window);
+   ctx->window = window;
+}
+
+/**
+ * Get the client window of the Input Method Context
+ *
+ * See @ref ecore_imf_context_client_window_set for more details.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return Return the client window.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void *
+ecore_imf_context_client_window_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_client_window_get");
+        return NULL;
+     }
+   return ctx->window;
 }
 
 /**
@@ -255,8 +345,8 @@ ecore_imf_context_client_window_set(Ecore_IMF_Context *ctx, void *window)
  * also be used for purposes internal to the Input Method Context.
  *
  * @param ctx An #Ecore_IMF_Context.
- * @param canas The client canvas. This may be NULL to indicate
- *              that the previous client canvas no longer exists.
+ * @param canvas The client canvas. This may be @c NULL to indicate
+ *               that the previous client canvas no longer exists.
  * @ingroup Ecore_IMF_Context_Group
  */
 EAPI void
@@ -264,11 +354,34 @@ ecore_imf_context_client_canvas_set(Ecore_IMF_Context *ctx, void *canvas)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_client_window_set");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_client_canvas_set");
+        return;
      }
    if (ctx->klass->client_canvas_set) ctx->klass->client_canvas_set(ctx, canvas);
+   ctx->client_canvas = canvas;
+}
+
+/**
+ * Get the client canvas of the Input Method Context.
+ *
+ * See @ref ecore_imf_context_client_canvas_set for more details.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return Return the client canvas.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void *
+ecore_imf_context_client_canvas_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_client_canvas_get");
+        return NULL;
+     }
+   return ctx->client_canvas;
 }
 
 /**
@@ -282,9 +395,9 @@ ecore_imf_context_show(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_show");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_show");
+        return;
      }
    if (ctx->klass->show) ctx->klass->show(ctx);
 }
@@ -300,14 +413,14 @@ ecore_imf_context_hide(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_hide");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_hide");
+        return;
      }
    if (ctx->klass->hide) ctx->klass->hide(ctx);
 }
 
-/*
+/**
  * Retrieve the current preedit string and cursor position
  * for the Input Method Context.
  *
@@ -323,16 +436,88 @@ ecore_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cu
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_preedit_string_get");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_preedit_string_get");
+        return;
      }
    if (ctx->klass->preedit_string_get)
      ctx->klass->preedit_string_get(ctx, str, cursor_pos);
    else
      {
-       if (str) *str = strdup("");
-       if (cursor_pos) *cursor_pos = 0;
+        if (str) *str = strdup("");
+        if (cursor_pos) *cursor_pos = 0;
+     }
+}
+
+/**
+ * Retrieve the current preedit string, attributes and
+ * cursor position for the Input Method Context.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param str Location to store the retrieved string. The
+ *            string retrieved must be freed with free().
+ * @param attrs an Eina_List of attributes
+ * @param cursor_pos Location to store position of cursor (in characters)
+ *                   within the preedit string.
+ * @ingroup Ecore_IMF_Context_Group
+ *
+ * Example
+ * @code
+ * char *preedit_string;
+ * int cursor_pos;
+ * Eina_List *attrs = NULL, *l = NULL;
+ * Ecore_IMF_Preedit_Attr *attr;
+ *
+ * ecore_imf_context_preedit_string_with_attributes_get(imf_context,
+ *                                                      &preedit_string,
+ *                                                      &attrs, &cursor_pos);
+ * if (!preedit_string) return;
+ *
+ *  if (strlen(preedit_string) > 0)
+ *    {
+ *       if (attrs)
+ *         {
+ *            EINA_LIST_FOREACH(attrs, l, attr)
+ *              {
+ *                 if (attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB1)
+ *                   {
+ *                      // Something to do
+ *                   }
+ *                 else if (attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB2)
+ *                   {
+ *                      // Something to do
+ *                   }
+ *                 else if (attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB3)
+ *                   {
+ *                      // Something to do
+ *                   }
+ *              }
+ *         }
+ *    }
+ * 
+ * // delete attribute list
+ * EINA_LIST_FREE(attrs, attr) free(attr);
+ *
+ * free(preedit_string);
+ * @endcode
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, char **str, Eina_List **attrs, int *cursor_pos)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_preedit_string_with_attributes_get");
+        return;
+     }
+   if (ctx->klass->preedit_string_with_attributes_get)
+     ctx->klass->preedit_string_with_attributes_get(ctx, str, attrs, cursor_pos);
+   else
+     {
+        if (str) *str = strdup("");
+        if (attrs) *attrs = NULL;
+        if (cursor_pos) *cursor_pos = 0;
      }
 }
 
@@ -342,15 +527,27 @@ ecore_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cu
  *
  * @param ctx An #Ecore_IMF_Context.
  * @ingroup Ecore_IMF_Context_Group
+ *
+ * Example
+ * @code
+ * static void
+ * _focus_in_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+ * {
+ *    ecore_imf_context_reset(imf_context);
+ *    ecore_imf_context_focus_in(imf_context);
+ * }
+ *
+ * evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_IN, _focus_in_cb, ed);
+ * @endcode
  */
 EAPI void
 ecore_imf_context_focus_in(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_focus_in");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_focus_in");
+        return;
      }
    if (ctx->klass->focus_in) ctx->klass->focus_in(ctx);
 }
@@ -361,15 +558,27 @@ ecore_imf_context_focus_in(Ecore_IMF_Context *ctx)
  *
  * @param ctx An #Ecore_IMF_Context.
  * @ingroup Ecore_IMF_Context_Group
+ *
+ * Example
+ * @code
+ * static void
+ * _focus_out_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+ * {
+ *    ecore_imf_context_reset(imf_context);
+ *    ecore_imf_context_focus_out(imf_context);
+ * }
+ *
+ * evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _focus_out_cb, ed);
+ * @endcode
  */
 EAPI void
 ecore_imf_context_focus_out(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_focus_out");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_focus_out");
+        return;
      }
    if (ctx->klass->focus_out) ctx->klass->focus_out(ctx);
 }
@@ -381,15 +590,27 @@ ecore_imf_context_focus_out(Ecore_IMF_Context *ctx)
  *
  * @param ctx An #Ecore_IMF_Context.
  * @ingroup Ecore_IMF_Context_Group
+ * 
+ * Example
+ * @code
+ * static void
+ * _focus_out_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+ * {
+ *    ecore_imf_context_reset(imf_context);
+ *    ecore_imf_context_focus_out(imf_context);
+ * }
+ *
+ * evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _focus_out_cb, ed);
+ * @endcode
  */
 EAPI void
 ecore_imf_context_reset(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_reset");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_reset");
+        return;
      }
    if (ctx->klass->reset) ctx->klass->reset(ctx);
 }
@@ -407,17 +628,43 @@ ecore_imf_context_cursor_position_set(Ecore_IMF_Context *ctx, int cursor_pos)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_cursor_position_set");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_cursor_position_set");
+        return;
      }
    if (ctx->klass->cursor_position_set) ctx->klass->cursor_position_set(ctx, cursor_pos);
 }
 
 /**
+ * Notify the Input Method Context that a change in the cursor
+ * location has been made. The location is relative to the canvas.
+ * The cursor location can be used to determine the position of 
+ * candidate word window in the immodule.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param x cursor x position.
+ * @param y cursor y position.
+ * @param w cursor width.
+ * @param h cursor height.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_cursor_location_set(Ecore_IMF_Context *ctx, int x, int y, int w, int h)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_cursor_location_set");
+        return;
+     }
+   if (ctx->klass->cursor_location_set) ctx->klass->cursor_location_set(ctx, x, y, w, h);
+}
+
+/**
  * Set whether the IM context should use the preedit string
- * to display feedback. If @use_preedit is 0 (default
- * is 1), then the IM context may use some other method to display
+ * to display feedback. If @c use_preedit is @c EINA_FALSE (default
+ * is @c EINA_TRUE), then the IM context may use some other method to display
  * feedback, such as displaying it in a child of the root window.
  *
  * @param ctx An #Ecore_IMF_Context.
@@ -425,19 +672,113 @@ ecore_imf_context_cursor_position_set(Ecore_IMF_Context *ctx, int cursor_pos)
  * @ingroup Ecore_IMF_Context_Group
  */
 EAPI void
-ecore_imf_context_use_preedit_set(Ecore_IMF_Context *ctx, int use_preedit)
+ecore_imf_context_use_preedit_set(Ecore_IMF_Context *ctx, Eina_Bool use_preedit)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_use_preedit_set");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_use_preedit_set");
+        return;
      }
    if (ctx->klass->use_preedit_set) ctx->klass->use_preedit_set(ctx, use_preedit);
 }
 
 /**
- * Set the callback to be used on get_surrounding request.
+ * Set whether the IM context should allow to use the text prediction.
+ * If @p prediction is @c EINA_FALSE (default is @c EINA_TRUE), then the IM
+ * context will not display the text prediction window.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param prediction Whether the IM context should allow to use the text prediction.
+ * @note Default value is EINA_TRUE.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_prediction_allow_set(Ecore_IMF_Context *ctx, Eina_Bool prediction)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_prediction_allow_set");
+        return;
+     }
+
+   ctx->allow_prediction = prediction;
+
+   if (ctx->klass->prediction_allow_set)
+     ctx->klass->prediction_allow_set(ctx, prediction);
+}
+
+/**
+ * Get whether the IM context should allow to use the text prediction.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return @c EINA_TRUE if it allows to use the text prediction, otherwise
+ * @c EINA_FALSE.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI Eina_Bool
+ecore_imf_context_prediction_allow_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_prediction_allow_get");
+        return EINA_FALSE;
+     }
+
+   return ctx->allow_prediction;
+}
+
+/**
+ * Set the autocapitalization type on the immodule.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param autocapital_type the autocapitalization type.
+ * @note Default type is ECORE_IMF_AUTOCAPITAL_TYPE_SENTENCE.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_autocapital_type_set(Ecore_IMF_Context *ctx, Ecore_IMF_Autocapital_Type autocapital_type)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_autocapital_type_set");
+        return;
+     }
+
+   ctx->autocapital_type = autocapital_type;
+
+   if (ctx->klass->autocapital_type_set) ctx->klass->autocapital_type_set(ctx, autocapital_type);
+}
+
+/**
+ * Get the autocapitalization type.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return The autocapital type being used by @p ctx.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI Ecore_IMF_Autocapital_Type
+ecore_imf_context_autocapital_type_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_autocapital_allow_get");
+        return ECORE_IMF_AUTOCAPITAL_TYPE_NONE;
+     }
+
+   return ctx->autocapital_type;
+}
+
+/**
+ * Set the callback to be used on surrounding_get request.
  *
  * This callback will be called when the Input Method Context
  * module requests the surrounding context.
@@ -448,13 +789,13 @@ ecore_imf_context_use_preedit_set(Ecore_IMF_Context *ctx, int use_preedit)
  * @ingroup Ecore_IMF_Context_Group
  */
 EAPI void
-ecore_imf_context_retrieve_surrounding_callback_set(Ecore_IMF_Context *ctx, int (*func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos), const void *data)
+ecore_imf_context_retrieve_surrounding_callback_set(Ecore_IMF_Context *ctx, Eina_Bool (*func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos), const void *data)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_retrieve_surrounding_callback_set");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_retrieve_surrounding_callback_set");
+        return;
      }
 
    ctx->retrieve_surrounding_func = func;
@@ -465,7 +806,7 @@ ecore_imf_context_retrieve_surrounding_callback_set(Ecore_IMF_Context *ctx, int
  * Set the input mode used by the Ecore Input Context.
  *
  * The input mode can be one of the input modes defined in
- * #Ecore_IMF_Input_Mode. The default input mode is
+ * Ecore_IMF_Input_Mode. The default input mode is
  * ECORE_IMF_INPUT_MODE_FULL.
  *
  * @param ctx An #Ecore_IMF_Context.
@@ -477,9 +818,9 @@ ecore_imf_context_input_mode_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode in
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_input_mode_set");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_mode_set");
+        return;
      }
    if (ctx->klass->input_mode_set) ctx->klass->input_mode_set(ctx, input_mode);
    ctx->input_mode = input_mode;
@@ -499,39 +840,61 @@ ecore_imf_context_input_mode_get(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_input_mode_set");
-       return 0;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_mode_set");
+        return 0;
      }
    return ctx->input_mode;
 }
 
 /**
  * Allow an Ecore Input Context to internally handle an event.
- * If this function returns 1, then no further processing
+ * If this function returns @c EINA_TRUE, then no further processing
  * should be done for this event.
  *
  * Input methods must be able to accept all types of events (simply
- * returning 0 if the event was not handled), but there is no
+ * returning @c EINA_FALSE if the event was not handled), but there is no
  * obligation of any events to be submitted to this function.
  *
  * @param ctx An #Ecore_IMF_Context.
  * @param type The type of event defined by #Ecore_IMF_Event_Type.
  * @param event The event itself.
- * @return 1 if the event was handled; otherwise 0.
+ * @return @c EINA_TRUE if the event was handled; otherwise @c EINA_FALSE.
  * @ingroup Ecore_IMF_Context_Group
+ *
+ * Example
+ * @code
+ * static void
+ * _key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+ * {
+ *    Evas_Event_Key_Down *ev = event_info;
+ *    if (!ev->keyname) return;
+ *
+ *    if (imf_context)
+ *      {
+ *         Ecore_IMF_Event_Key_Down ecore_ev;
+ *         ecore_imf_evas_event_key_down_wrap(ev, &ecore_ev);
+ *         if (ecore_imf_context_filter_event(imf_context,
+ *                                            ECORE_IMF_EVENT_KEY_DOWN,
+ *                                            (Ecore_IMF_Event *)&ecore_ev))
+ *           return;
+ *      }
+ * }
+ *
+ * evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, data);
+ * @endcode
  */
-EAPI int
+EAPI Eina_Bool
 ecore_imf_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_filter_event");
-       return 0;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_filter_event");
+        return EINA_FALSE;
      }
    if (ctx->klass->filter_event) return ctx->klass->filter_event(ctx, type, event);
-   return 0;
+   return EINA_FALSE;
 }
 
 /**
@@ -556,7 +919,7 @@ ecore_imf_context_new(const Ecore_IMF_Context_Class *ctxc)
    Ecore_IMF_Context *ctx;
 
    if (!ctxc) return NULL;
-   ctx = malloc(sizeof(Ecore_IMF_Context));
+   ctx = calloc(1, sizeof(Ecore_IMF_Context));
    if (!ctx) return NULL;
    ECORE_MAGIC_SET(ctx, ECORE_MAGIC_CONTEXT);
    ctx->klass = ctxc;
@@ -583,9 +946,9 @@ ecore_imf_context_data_set(Ecore_IMF_Context *ctx, void *data)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_data_set");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_data_set");
+        return;
      }
    ctx->data = data;
 }
@@ -603,54 +966,58 @@ EAPI void *ecore_imf_context_data_get(Ecore_IMF_Context *ctx)
 {
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_data_get");
+        return NULL;
      }
    return ctx->data;
 }
 
 /**
  * Retrieve context around insertion point.
+ * Input methods typically want context in order to constrain input text based on existing text; 
+ * this is important for languages such as Thai where only some sequences of characters are allowed.
+ * In addition, the text around the insertion point can be used for supporting autocapital feature.
  *
  * This function is implemented by calling the
  * Ecore_IMF_Context::retrieve_surrounding_func (
  * set using #ecore_imf_context_retrieve_surrounding_callback_set).
  *
  * There is no obligation for a widget to respond to the
- * ::retrieve_surrounding_func, so input methods must be prepared
+ * retrieve_surrounding_func, so input methods must be prepared
  * to function without context.
  *
  * @param ctx An #Ecore_IMF_Context.
  * @param text Location to store a UTF-8 encoded string of text
  *             holding context around the insertion point.
- *             If the function returns 1, then you must free
+ *             If the function returns @c EINA_TRUE, then you must free
  *             the result stored in this location with free().
  * @param cursor_pos Location to store the position in characters of
- *                   the insertion cursor within @text.
- * @return 1 if surrounding text was provided; otherwise 0.
+ *                   the insertion cursor within @p text.
+ * @return @c EINA_TRUE if surrounding text was provided; otherwise
+ * @c EINA_FALSE.
  * @ingroup Ecore_IMF_Context_Module_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_imf_context_surrounding_get(Ecore_IMF_Context *ctx, char **text, int *cursor_pos)
 {
-   int result = 0;
+   int result = EINA_FALSE;
 
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_surrounding_get");
-       return 0;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_surrounding_get");
+        return EINA_FALSE;
      }
 
    if (ctx->retrieve_surrounding_func)
      {
-       result = ctx->retrieve_surrounding_func(ctx->retrieve_surrounding_data, ctx, text, cursor_pos);
-       if (!result)
-         {
-            if (text) *text = NULL;
-            if (cursor_pos) *cursor_pos = 0;
-         }
+        result = ctx->retrieve_surrounding_func(ctx->retrieve_surrounding_data, ctx, text, cursor_pos);
+        if (!result)
+          {
+             if (text) *text = NULL;
+             if (cursor_pos) *cursor_pos = 0;
+          }
      }
    return result;
 }
@@ -664,6 +1031,10 @@ _ecore_imf_event_free_preedit(void *data __UNUSED__, void *event)
 /**
  * Adds ECORE_IMF_EVENT_PREEDIT_START to the event queue.
  *
+ * ECORE_IMF_EVENT_PREEDIT_START should be added when a new preedit sequence starts.
+ * It's asynchronous method to put event to the event queue.
+ * ecore_imf_context_event_callback_call() can be used as synchronous method.
+ *
  * @param ctx An #Ecore_IMF_Context.
  * @ingroup Ecore_IMF_Context_Module_Group
  */
@@ -674,20 +1045,24 @@ ecore_imf_context_preedit_start_event_add(Ecore_IMF_Context *ctx)
 
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_preedit_start_event_add");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_preedit_start_event_add");
+        return;
      }
 
    ev = malloc(sizeof(Ecore_IMF_Event_Preedit_Start));
    ev->ctx = ctx;
    ecore_event_add(ECORE_IMF_EVENT_PREEDIT_START,
-                  ev, _ecore_imf_event_free_preedit, NULL);
+                   ev, _ecore_imf_event_free_preedit, NULL);
 }
 
 /**
  * Adds ECORE_IMF_EVENT_PREEDIT_END to the event queue.
  *
+ * ECORE_IMF_EVENT_PREEDIT_END should be added when a new preedit sequence has been completed or canceled.
+ * It's asynchronous method to put event to the event queue.
+ * ecore_imf_context_event_callback_call() can be used as synchronous method.
+ *
  * @param ctx An #Ecore_IMF_Context.
  * @ingroup Ecore_IMF_Context_Module_Group
  */
@@ -698,20 +1073,23 @@ ecore_imf_context_preedit_end_event_add(Ecore_IMF_Context *ctx)
 
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_preedit_end_event_add");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_preedit_end_event_add");
+        return;
      }
 
    ev = malloc(sizeof(Ecore_IMF_Event_Preedit_End));
    ev->ctx = ctx;
    ecore_event_add(ECORE_IMF_EVENT_PREEDIT_END,
-                  ev, _ecore_imf_event_free_preedit, NULL);
+                   ev, _ecore_imf_event_free_preedit, NULL);
 }
 
 /**
  * Adds ECORE_IMF_EVENT_PREEDIT_CHANGED to the event queue.
  *
+ * It's asynchronous method to put event to the event queue.
+ * ecore_imf_context_event_callback_call() can be used as synchronous method.
+ *
  * @param ctx An #Ecore_IMF_Context.
  * @ingroup Ecore_IMF_Context_Module_Group
  */
@@ -722,15 +1100,15 @@ ecore_imf_context_preedit_changed_event_add(Ecore_IMF_Context *ctx)
 
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_preedit_changed_event_add");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_preedit_changed_event_add");
+        return;
      }
 
    ev = malloc(sizeof(Ecore_IMF_Event_Preedit_Changed));
    ev->ctx = ctx;
    ecore_event_add(ECORE_IMF_EVENT_PREEDIT_CHANGED,
-                  ev, _ecore_imf_event_free_preedit, NULL);
+                   ev, _ecore_imf_event_free_preedit, NULL);
 }
 
 static void
@@ -746,6 +1124,9 @@ _ecore_imf_event_free_commit(void *data __UNUSED__, void *event)
 /**
  * Adds ECORE_IMF_EVENT_COMMIT to the event queue.
  *
+ * It's asynchronous method to put event to the event queue.
+ * ecore_imf_context_event_callback_call() can be used as synchronous method.
+ *
  * @param ctx An #Ecore_IMF_Context.
  * @param str The committed string.
  * @ingroup Ecore_IMF_Context_Module_Group
@@ -757,16 +1138,16 @@ ecore_imf_context_commit_event_add(Ecore_IMF_Context *ctx, const char *str)
 
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_commit_event_add");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_commit_event_add");
+        return;
      }
 
    ev = malloc(sizeof(Ecore_IMF_Event_Commit));
    ev->ctx = ctx;
    ev->str = str ? strdup(str) : NULL;
    ecore_event_add(ECORE_IMF_EVENT_COMMIT,
-                  ev, _ecore_imf_event_free_commit, NULL);
+                   ev, _ecore_imf_event_free_commit, NULL);
 
 }
 
@@ -779,6 +1160,13 @@ _ecore_imf_event_free_delete_surrounding(void *data __UNUSED__, void *event)
 /**
  * Adds ECORE_IMF_EVENT_DELETE_SURROUNDING to the event queue.
  *
+ * Asks the widget that the input context is attached to to delete characters around the cursor position
+ * by adding the ECORE_IMF_EVENT_DELETE_SURROUNDING to the event queue.
+ * Note that offset and n_chars are in characters not in bytes.
+ *
+ * It's asynchronous method to put ECORE_IMF_EVENT_DELETE_SURROUNDING event to the event queue.
+ * ecore_imf_context_event_callback_call() can be used as synchronous method.
+ *
  * @param ctx An #Ecore_IMF_Context.
  * @param offset The start offset of surrounding to be deleted.
  * @param n_chars The number of characters to be deleted.
@@ -791,9 +1179,9 @@ ecore_imf_context_delete_surrounding_event_add(Ecore_IMF_Context *ctx, int offse
 
    if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
      {
-       ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                        "ecore_imf_context_delete_surrounding_event_add");
-       return;
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_delete_surrounding_event_add");
+        return;
      }
 
    ev = malloc(sizeof(Ecore_IMF_Event_Delete_Surrounding));
@@ -801,5 +1189,712 @@ ecore_imf_context_delete_surrounding_event_add(Ecore_IMF_Context *ctx, int offse
    ev->offset = offset;
    ev->n_chars = n_chars;
    ecore_event_add(ECORE_IMF_EVENT_DELETE_SURROUNDING,
-                  ev, _ecore_imf_event_free_delete_surrounding, NULL);
+                   ev, _ecore_imf_event_free_delete_surrounding, NULL);
+}
+
+/**
+ * Add (register) a callback function to a given context event.
+ *
+ * This function adds a function callback to the context @p ctx when the
+ * event of type @p type occurs on it. The function pointer is @p
+ * func.
+ *
+ * The event type @p type to trigger the function may be one of
+ * #ECORE_IMF_CALLBACK_PREEDIT_START, #ECORE_IMF_CALLBACK_PREEDIT_END,
+ * #ECORE_IMF_CALLBACK_PREEDIT_CHANGED, #ECORE_IMF_CALLBACK_COMMIT and
+ * #ECORE_IMF_CALLBACK_DELETE_SURROUNDING.
+ *
+ * @param ctx Ecore_IMF_Context to attach a callback to.
+ * @param type The type of event that will trigger the callback
+ * @param func The (callback) function to be called when the event is
+ *        triggered
+ * @param data The data pointer to be passed to @p func
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ *
+ * Example
+ * @code
+ * static void
+ * _imf_event_commit_cb(void *data, Ecore_IMF_Context *ctx, void *event_info)
+ * {
+ *    char *commit_str = event_info;
+ *    // something to do
+ * }
+ *
+ * ecore_imf_context_event_callback_add(en->imf_context, ECORE_IMF_CALLBACK_COMMIT, _imf_event_commit_cb, data);
+ * @endcode
+ */
+EAPI void
+ecore_imf_context_event_callback_add(Ecore_IMF_Context *ctx, Ecore_IMF_Callback_Type type, Ecore_IMF_Event_Cb func, const void *data)
+{
+   Ecore_IMF_Func_Node *fn = NULL;
+
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_event_callback_add");
+        return;
+     }
+
+   if (!func) return;
+
+   fn = calloc(1, sizeof (Ecore_IMF_Func_Node));
+   if (!fn) return;
+
+   fn->func = func;
+   fn->data = data;
+   fn->type = type;
+
+   ctx->callbacks = eina_list_append(ctx->callbacks, fn);
+}
+
+/**
+ * Delete (unregister) a callback function registered to a given
+ * context event.
+ *
+ * This function removes a function callback from the context @p ctx when the
+ * event of type @p type occurs on it. The function pointer is @p
+ * func.
+ *
+ * @see ecore_imf_context_event_callback_add() for more details
+ *
+ * @param ctx Ecore_IMF_Context to remove a callback from.
+ * @param type The type of event that was triggering the callback
+ * @param func The (callback) function that was to be called when the event was triggered
+ * @return the data pointer
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI void *
+ecore_imf_context_event_callback_del(Ecore_IMF_Context *ctx, Ecore_IMF_Callback_Type type, Ecore_IMF_Event_Cb func)
+{
+   Eina_List *l = NULL;
+   Eina_List *l_next = NULL;
+   Ecore_IMF_Func_Node *fn = NULL;
+
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_event_callback_del");
+        return NULL;
+     }
+
+   if (!func) return NULL;
+   if (!ctx->callbacks) return NULL;
+
+   EINA_LIST_FOREACH_SAFE(ctx->callbacks, l, l_next, fn)
+     {
+        if ((fn) && (fn->func == func) && (fn->type == type))
+          {
+             void *tmp = (void *)fn->data;
+             free(fn);
+             ctx->callbacks = eina_list_remove_list(ctx->callbacks, l);
+             return tmp;
+          }
+     }
+   return NULL;
+}
+
+/**
+ * Call a given callback on the context @p ctx.
+ *
+ * ecore_imf_context_preedit_start_event_add(), ecore_imf_context_preedit_end_event_add(), 
+ * ecore_imf_context_preedit_changed_event_add(), ecore_imf_context_commit_event_add() and
+ * ecore_imf_context_delete_surrounding_event_add() APIs are asynchronous 
+ * because those API adds each event to the event queue.
+ *
+ * This API provides the way to call each callback function immediately.
+ *
+ * @param ctx Ecore_IMF_Context.
+ * @param type The type of event that will trigger the callback
+ * @param event_info The pointer to event specific struct or information to
+ *        pass to the callback functions registered on this event
+ * @ingroup Ecore_IMF_Context_Module_Group
+ * @since 1.2.0
+ */
+EAPI void
+ecore_imf_context_event_callback_call(Ecore_IMF_Context *ctx, Ecore_IMF_Callback_Type type, void *event_info)
+{
+   Ecore_IMF_Func_Node *fn = NULL;
+   Eina_List *l = NULL;
+
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_event_callback_call");
+        return;
+     }
+
+   EINA_LIST_FOREACH(ctx->callbacks, l, fn)
+     {
+        if ((fn) && (fn->type == type) && (fn->func))
+          fn->func(fn->data, ctx, event_info);
+     }
+}
+
+/**
+ * Ask the Input Method Context to show the control panel of using Input Method.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_control_panel_show(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_control_panel_show");
+        return;
+     }
+
+   if (ctx->klass->control_panel_show) ctx->klass->control_panel_show(ctx);
+}
+
+/**
+ * Ask the Input Method Context to hide the control panel of using Input Method.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_control_panel_hide(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_control_panel_hide");
+        return;
+     }
+
+   if (ctx->klass->control_panel_hide) ctx->klass->control_panel_hide(ctx);
+}
+
+/**
+ * Ask the Input Method Context to show the input panel (virtual keyboard).
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_input_panel_show(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_show");
+        return;
+     }
+
+   if (ctx->klass->show) ctx->klass->show(ctx);
 }
+
+/**
+ * Ask the Input Method Context to hide the input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_input_panel_hide(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_hide");
+        return;
+     }
+
+   if (ctx->klass->hide) ctx->klass->hide(ctx);
+}
+
+/**
+ * Set the layout of the input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param layout see #Ecore_IMF_Input_Panel_Layout
+ * @note Default layout type is ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_input_panel_layout_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_layout_set");
+        return;
+     }
+
+   if (ctx->klass->input_panel_layout_set)
+     ctx->klass->input_panel_layout_set(ctx, layout);
+
+   ctx->input_panel_layout = layout;
+}
+
+/**
+ * Get the layout of the current active input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return layout see #Ecore_IMF_Input_Panel_Layout
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI Ecore_IMF_Input_Panel_Layout
+ecore_imf_context_input_panel_layout_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_layout_get");
+        return ECORE_IMF_INPUT_PANEL_LAYOUT_INVALID;
+     }
+
+   if (ctx->klass->input_panel_layout_get)
+     return ctx->input_panel_layout;
+   else
+     return ECORE_IMF_INPUT_PANEL_LAYOUT_INVALID;
+}
+
+/**
+ * Set the language of the input panel.
+ * This API can be used when you want to show the English keyboard.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param lang the language to be set to the input panel.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_input_panel_language_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_language_set");
+        return;
+     }
+
+   if (ctx->klass->input_panel_language_set) ctx->klass->input_panel_language_set(ctx, lang);
+   ctx->input_panel_lang = lang;
+}
+
+/**
+ * Get the language of the input panel.
+ *
+ * See @ref ecore_imf_context_input_panel_language_set for more details.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return Ecore_IMF_Input_Panel_Lang
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI Ecore_IMF_Input_Panel_Lang
+ecore_imf_context_input_panel_language_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_language_get");
+        return ECORE_IMF_INPUT_PANEL_LANG_AUTOMATIC;
+     }
+
+   return ctx->input_panel_lang;
+}
+
+/**
+ * Set whether the Input Method Context should request to show the input panel automatically
+ * when the widget has focus.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param enabled If true, the input panel will be shown when the widget is clicked or has focus.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI void
+ecore_imf_context_input_panel_enabled_set(Ecore_IMF_Context *ctx,
+                                           Eina_Bool enabled)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_enabled_set");
+        return;
+     }
+
+   ctx->input_panel_enabled = enabled;
+}
+
+/**
+ * Get whether the Input Method Context requests to show the input panel automatically.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return Return the attribute to show the input panel automatically
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.1.0
+ */
+EAPI Eina_Bool
+ecore_imf_context_input_panel_enabled_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_enabled_get");
+        return EINA_FALSE;
+     }
+
+   return ctx->input_panel_enabled;
+}
+
+/**
+ * Set the input panel-specific data to deliver to the input panel.
+ * This API is used by applications to deliver specific data to the input panel.
+ * The data format MUST be negotiated by both application and the input panel.
+ * The size and format of data are defined by the input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param data The specific data to be set to the input panel.
+ * @param len the length of data, in bytes, to send to the input panel
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI void
+ecore_imf_context_input_panel_imdata_set(Ecore_IMF_Context *ctx, const void *data, int len)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_imdata_set");
+        return;
+     }
+
+   if (!data) return;
+
+   if (ctx->klass->input_panel_imdata_set)
+     ctx->klass->input_panel_imdata_set(ctx, data, len);
+}
+
+/**
+ * Get the specific data of the current active input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param data The specific data to be got from the input panel
+ * @param len The length of data
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI void
+ecore_imf_context_input_panel_imdata_get(Ecore_IMF_Context *ctx, void *data, int *len)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_imdata_get");
+        return;
+     }
+
+   if (!data) return;
+
+   if (ctx->klass->input_panel_imdata_get)
+     ctx->klass->input_panel_imdata_get(ctx, data, len);
+}
+
+/**
+ * Set the "return" key type. This type is used to set string or icon on the "return" key of the input panel.
+ *
+ * An input panel displays the string or icon associated with this type
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param return_key_type The type of "return" key on the input panel
+ * @note Default type is ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI void
+ecore_imf_context_input_panel_return_key_type_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Return_Key_Type return_key_type)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_return_key_type_set");
+        return;
+     }
+
+   ctx->input_panel_return_key_type = return_key_type;
+   if (ctx->klass->input_panel_return_key_type_set) ctx->klass->input_panel_return_key_type_set(ctx, return_key_type);
+}
+
+/**
+ * Get the "return" key type.
+ *
+ * @see ecore_imf_context_input_panel_return_key_type_set() for more details
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return The type of "return" key on the input panel
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI Ecore_IMF_Input_Panel_Return_Key_Type
+ecore_imf_context_input_panel_return_key_type_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_return_key_type_get");
+        return EINA_FALSE;
+     }
+
+   return ctx->input_panel_return_key_type;
+}
+
+/**
+ * Set the return key on the input panel to be disabled.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param disabled The state
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI void
+ecore_imf_context_input_panel_return_key_disabled_set(Ecore_IMF_Context *ctx, Eina_Bool disabled)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_return_key_disabled_set");
+        return;
+     }
+
+   ctx->input_panel_return_key_disabled = disabled;
+   if (ctx->klass->input_panel_return_key_disabled_set) ctx->klass->input_panel_return_key_disabled_set(ctx, disabled);
+}
+
+/**
+ * Get whether the return key on the input panel should be disabled or not.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return @c EINA_TRUE if it should be disabled.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI Eina_Bool
+ecore_imf_context_input_panel_return_key_disabled_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_return_key_disabled_get");
+        return EINA_FALSE;
+     }
+
+   return ctx->input_panel_return_key_disabled;
+}
+
+/**
+ * Set the caps lock mode on the input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param mode Turn on caps lock on the input panel if @c EINA_TRUE.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI void
+ecore_imf_context_input_panel_caps_lock_mode_set(Ecore_IMF_Context *ctx, Eina_Bool mode)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_caps_lock_mode_set");
+        return;
+     }
+
+   if (ctx->klass->input_panel_caps_lock_mode_set)
+     ctx->klass->input_panel_caps_lock_mode_set(ctx, mode);
+
+   ctx->input_panel_caps_lock_mode = mode;
+}
+
+/**
+ * Get the caps lock mode on the input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return @c EINA_TRUE if the caps lock is turned on.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.2.0
+ */
+EAPI Eina_Bool
+ecore_imf_context_input_panel_caps_lock_mode_get(Ecore_IMF_Context *ctx)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_caps_lock_mode_get");
+        return EINA_FALSE;
+     }
+
+   return ctx->input_panel_caps_lock_mode;
+}
+
+/**
+ * Get the position of the current active input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param x top-left x co-ordinate of the input panel
+ * @param y top-left y co-ordinate of the input panel
+ * @param w width of the input panel
+ * @param h height of the input panel
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.3
+ */
+EAPI void
+ecore_imf_context_input_panel_geometry_get(Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_geometry_get");
+        return;
+     }
+
+   if (ctx->klass->input_panel_geometry_get)
+     ctx->klass->input_panel_geometry_get(ctx, x, y, w, h);
+}
+
+/**
+ * Get state of current active input panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @return The state of input panel.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.3
+ */
+EAPI Ecore_IMF_Input_Panel_State
+ecore_imf_context_input_panel_state_get(Ecore_IMF_Context *ctx)
+{
+   Ecore_IMF_Input_Panel_State state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_state_get");
+        return ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+     }
+
+   if (ctx->klass->input_panel_state_get)
+     state = ctx->klass->input_panel_state_get(ctx);
+
+   return state;
+}
+
+/**
+ * Register a callback function which will be called if there is change in input panel state,language,mode etc.
+ * In order to deregister the callback function 
+ * Use @ref ecore_imf_context_input_panel_event_callback_del.
+ *
+ * @param ctx An #Ecore_IMF_Context
+ * @param type event type
+ * @param func the callback function
+ * @param data application-input panel specific data.
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.3
+ */
+EAPI void
+ecore_imf_context_input_panel_event_callback_add(Ecore_IMF_Context *ctx,
+                                                 Ecore_IMF_Input_Panel_Event type,
+                                                 void (*func) (void *data, Ecore_IMF_Context *ctx, int value),
+                                                 const void *data)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_event_callback_add");
+        return;
+     }
+
+   if (ctx->klass->input_panel_event_callback_add)
+     ctx->klass->input_panel_event_callback_add(ctx, type, func, (void *)data);
+}
+
+/**
+ * Unregister a callback function which will be called if there is change in input panel state, language, mode etc.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param type An #Ecore_IMF_Input_Panel_Event.
+ * @param func the callback function
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.3
+ */
+EAPI void
+ecore_imf_context_input_panel_event_callback_del(Ecore_IMF_Context *ctx,
+                                                 Ecore_IMF_Input_Panel_Event type,
+                                                 void (*func) (void *data, Ecore_IMF_Context *ctx, int value))
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_event_callback_del");
+        return;
+     }
+
+   if (ctx->klass->input_panel_event_callback_del)
+     ctx->klass->input_panel_event_callback_del(ctx, type, func);
+}
+
+/**
+ * Get the current language locale of the input panel.
+ *
+ * ex) fr_FR
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param lang Location to store the retrieved language string. The
+ *             string retrieved must be freed with free().
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.3
+ */
+EAPI void
+ecore_imf_context_input_panel_language_locale_get(Ecore_IMF_Context *ctx, char **lang)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_input_panel_language_locale_get");
+        return;
+     }
+
+   if (ctx->klass->input_panel_language_locale_get)
+     ctx->klass->input_panel_language_locale_get(ctx, lang);
+   else
+     {
+        if (lang) *lang = strdup("");
+     }
+}
+
+/**
+ * Get the geometry information of the candidate panel.
+ *
+ * @param ctx An #Ecore_IMF_Context.
+ * @param x top-left x co-ordinate of the candidate panel
+ * @param y top-left y co-ordinate of the candidate panel
+ * @param w width of the candidate panel
+ * @param h height of the candidate panel
+ * @ingroup Ecore_IMF_Context_Group
+ * @since 1.3
+ */
+EAPI void
+ecore_imf_context_candidate_panel_geometry_get(Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h)
+{
+   if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+     {
+        ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                         "ecore_imf_context_candidate_panel_geometry_get");
+        return;
+     }
+
+   if (ctx->klass->candidate_panel_geometry_get)
+     ctx->klass->candidate_panel_geometry_get(ctx, x, y, w, h);
+}
+
index d6b0be1..946f5bc 100644 (file)
@@ -1,44 +1,43 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
-#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <limits.h>
 
-#include "config.h"
+#include <Ecore.h>
+#include <ecore_private.h>
 
+#include "Ecore_IMF.h"
 #include "ecore_imf_private.h"
 
-static void _ecore_imf_module_load_all(void);
-static void _ecore_imf_module_append(Ecore_Plugin *plugin, const Ecore_IMF_Context_Info *info, Ecore_IMF_Context *(*imf_module_create)(void));
 static void _ecore_imf_module_free(Ecore_IMF_Module *module);
 static int _ecore_imf_modules_exists(const char *ctx_id);
 
-static Ecore_Path_Group *ecore_imf_modules_path = NULL;
-static Ecore_Hash *modules = NULL;
+typedef struct _Ecore_IMF_Selector
+{
+   const char *toselect;
+   void       *selected;
+} Ecore_IMF_Selector;
+
+static Eina_Hash *modules = NULL;
+static Eina_Array *module_list = NULL;
 
 void
 ecore_imf_module_init(void)
 {
-   char pathname[PATH_MAX];
-   const char *homedir;
-
-   ecore_imf_modules_path = ecore_path_group_new();
-   snprintf(pathname, sizeof(pathname), "%s/ecore/immodules/",
-           PACKAGE_LIB_DIR);
-   ecore_path_group_add(ecore_imf_modules_path, pathname);
+   char *homedir;
 
-   homedir = getenv("HOME");
+   module_list = eina_module_list_get(NULL, PACKAGE_LIB_DIR "/ecore/immodules", 0, NULL, NULL);
+   homedir = eina_module_environment_path_get("HOME", "/.ecore/immodules");
    if (homedir)
      {
-       snprintf(pathname, sizeof(pathname), "%s/.ecore/immodules/",
-                homedir);
-       ecore_path_group_add(ecore_imf_modules_path, pathname);
+        module_list = eina_module_list_get(module_list, homedir, 0, NULL, NULL);
+        free(homedir);
      }
-
-   modules = NULL;
-   _ecore_imf_module_load_all();
+   eina_module_list_load(module_list);
 }
 
 void
@@ -46,36 +45,38 @@ ecore_imf_module_shutdown(void)
 {
    if (modules)
      {
-       ecore_hash_destroy(modules);
-       modules = NULL;
+        eina_hash_free(modules);
+        modules = NULL;
      }
+   if (module_list)
+     {
+        eina_module_list_free(module_list);
+        eina_array_free(module_list);
+        module_list = NULL;
+     }
+}
 
-   ecore_path_group_del(ecore_imf_modules_path);
-   ecore_imf_modules_path = NULL;
+static Eina_Bool
+_hash_module_available_get(const Eina_Hash *hash __UNUSED__, int *data, void *list)
+{
+   *(Eina_List**)list = eina_list_append(*(Eina_List**)list, data);
+   return EINA_TRUE;
 }
 
-Ecore_List *
+Eina_List *
 ecore_imf_module_available_get(void)
 {
-   Ecore_List *values;
-   unsigned int i = 0;
+   Eina_List *values = NULL;
+   Eina_Iterator *it = NULL;
 
    if (!modules) return NULL;
 
-   /* ecore_hash_values() */
-   values = ecore_list_new();
-   while (i < ecore_prime_table[modules->size])
-     {
-       if (modules->buckets[i])
-         {
-            Ecore_Hash_Node *node;
-
-            for (node = modules->buckets[i]; node; node = node->next)
-              ecore_list_append(values, node->value);
-         }
-       i++;
-     }
-   ecore_list_first_goto(values);
+   it = eina_hash_iterator_data_new(modules);
+   if (!it)
+     return NULL;
+
+   eina_iterator_foreach(it, EINA_EACH_CB(_hash_module_available_get), &values);
+   eina_iterator_free(it);
 
    return values;
 }
@@ -84,7 +85,7 @@ Ecore_IMF_Module *
 ecore_imf_module_get(const char *ctx_id)
 {
    if (!modules) return NULL;
-   return ecore_hash_get(modules, ctx_id);
+   return eina_hash_find(modules, ctx_id);
 }
 
 Ecore_IMF_Context *
@@ -94,150 +95,107 @@ ecore_imf_module_context_create(const char *ctx_id)
    Ecore_IMF_Context *ctx = NULL;
 
    if (!modules) return NULL;
-   module = ecore_hash_get(modules, ctx_id);
+   module = eina_hash_find(modules, ctx_id);
    if (module)
      {
-       ctx = module->create();
-       if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
-         {
-            ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
-                             "ecore_imf_module_context_create");
-            return NULL;
-         }
-       ctx->module = module;
+        ctx = module->create();
+        if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
+          {
+             ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
+                              "ecore_imf_module_context_create");
+             return NULL;
+          }
+        ctx->module = module;
      }
    return ctx;
 }
 
-Ecore_List *
+static Eina_Bool
+_hash_ids_get(const Eina_Hash *hash __UNUSED__, const char *key, void *list)
+{
+   *(Eina_List**)list = eina_list_append(*(Eina_List**)list, key);
+   return EINA_TRUE;
+}
+
+Eina_List *
 ecore_imf_module_context_ids_get(void)
 {
+   Eina_List *l = NULL;
+   Eina_Iterator *it = NULL;
+
    if (!modules) return NULL;
-   return ecore_hash_keys(modules);
+
+   it = eina_hash_iterator_key_new(modules);
+   if (!it)
+     return NULL;
+
+   eina_iterator_foreach(it, EINA_EACH_CB(_hash_ids_get), &l);
+   eina_iterator_free(it);
+
+   return l;
+}
+
+static Eina_Bool
+_hash_ids_by_canvas_type_get(const Eina_Hash *hash __UNUSED__, void *data, void *fdata)
+{
+   Ecore_IMF_Module *module = data;
+   Ecore_IMF_Selector *selector = fdata;
+
+   if (!strcmp(module->info->canvas_type, selector->toselect))
+     selector->selected = eina_list_append(selector->selected, (void *)module->info->id);
+
+   return EINA_TRUE;
 }
 
-Ecore_List *
+Eina_List *
 ecore_imf_module_context_ids_by_canvas_type_get(const char *canvas_type)
 {
-   Ecore_List *values;
-   unsigned int i = 0;
+   Ecore_IMF_Selector selector;
+   Eina_List *values = NULL;
+   Eina_Iterator *it = NULL;
 
    if (!modules) return NULL;
 
    if (!canvas_type)
      return ecore_imf_module_context_ids_get();
 
-   values = ecore_list_new();
-   while (i < ecore_prime_table[modules->size])
-     {
-       if (modules->buckets[i])
-         {
-            Ecore_Hash_Node *node;
-
-            for (node = modules->buckets[i]; node; node = node->next)
-              {
-                 Ecore_IMF_Module *module = node->value;
-                 if (strcmp(module->info->canvas_type, canvas_type) == 0)
-                   ecore_list_append(values, (void *) module->info->id);
-              }
-         }
-       i++;
-     }
-   ecore_list_first_goto(values);
+   it = eina_hash_iterator_data_new(modules);
+   if (!it)
+     return NULL;
 
-   return values;
-}
+   selector.toselect = canvas_type;
+   selector.selected = values;
+   eina_iterator_foreach(it, EINA_EACH_CB(_hash_ids_by_canvas_type_get), &selector);
+   eina_iterator_free(it);
 
-static void
-_ecore_imf_module_load_all(void)
-{
-   Ecore_List *avail;
-   char *filename;
-   Ecore_Plugin *plugin;
-   const Ecore_IMF_Context_Info *info = NULL;
-   int (*imf_module_init)(const Ecore_IMF_Context_Info **info);
-   Ecore_IMF_Context *(*imf_module_create)(void);
-
-   avail = ecore_plugin_available_get(ecore_imf_modules_path);
-   if (!avail) return;
-
-   ecore_list_first_goto(avail);
-   while ((filename = ecore_list_next(avail)))
-     {
-       plugin = ecore_plugin_load(ecore_imf_modules_path, filename, NULL);
-       if (!plugin)
-         {
-            fprintf(stderr, "** ecore_imf: Error loading input method plugin %s!\n",
-                    filename);
-            continue;
-         }
-
-       imf_module_init = ecore_plugin_symbol_get(plugin, "imf_module_init");
-       if (!imf_module_init || !imf_module_init(&info) || !info)
-         {
-            fprintf(stderr, "** ecore_imf: Error initializing input method plugin %s! "
-                            "'imf_module_init' is missing or failed to run!",
-                    filename);
-            ecore_plugin_unload(plugin);
-            continue;
-         }
-
-       if (_ecore_imf_modules_exists(info->id))
-         {
-            fprintf(stderr, "** ecore_imf: Error loading input method plugin %s! "
-                            "Plugin with id='%s' already exists!",
-                    filename, info->id);
-            ecore_plugin_unload(plugin);
-            continue;
-         }
-
-       imf_module_create = ecore_plugin_symbol_get(plugin, "imf_module_create");
-       if (!imf_module_create)
-         {
-            fprintf(stderr, "** ecore_imf: Error setting up input method plugin %s! "
-                            "'imf_module_create' is missing!",
-                    filename);
-            ecore_plugin_unload(plugin);
-            continue;
-         }
-
-       _ecore_imf_module_append(plugin, info, imf_module_create);
-     }
-
-   ecore_list_destroy(avail);
+   return values;
 }
 
-static void
-_ecore_imf_module_append(Ecore_Plugin *plugin,
-                       const Ecore_IMF_Context_Info *info,
-                       Ecore_IMF_Context *(*imf_module_create)(void))
+EAPI void
+ecore_imf_module_register(const Ecore_IMF_Context_Info *info,
+                          Ecore_IMF_Context *(*imf_module_create)(void),
+                          Ecore_IMF_Context *(*imf_module_exit)(void))
 {
    Ecore_IMF_Module *module;
 
+   if (_ecore_imf_modules_exists(info->id)) return;
+
    if (!modules)
-     {
-       modules = ecore_hash_new(ecore_str_hash, ecore_str_compare);
-       ecore_hash_free_key_cb_set(modules, free);
-       ecore_hash_free_value_cb_set(modules, (Ecore_Free_Cb) _ecore_imf_module_free);
-     }
+     modules = eina_hash_string_superfast_new(EINA_FREE_CB(_ecore_imf_module_free));
 
    module = malloc(sizeof(Ecore_IMF_Module));
-   module->plugin = plugin;
    module->info = info;
    /* cache imf_module_create as it may be used several times */
    module->create = imf_module_create;
+   module->exit = imf_module_exit;
 
-   ecore_hash_set(modules, strdup(info->id), module);
+   eina_hash_add(modules, info->id, module);
 }
 
 static void
 _ecore_imf_module_free(Ecore_IMF_Module *module)
 {
-   int (*imf_module_exit)(void);
-
-   imf_module_exit = ecore_plugin_symbol_get(module->plugin, "imf_module_exit");
-   if (imf_module_exit) imf_module_exit();
-   ecore_plugin_unload(module->plugin);
+   if (module->exit) module->exit();
    free(module);
 }
 
@@ -245,5 +203,10 @@ static int
 _ecore_imf_modules_exists(const char *ctx_id)
 {
    if (!modules) return 0;
-   return (ecore_hash_get(modules, ctx_id) != NULL);
+   if (!ctx_id) return 0;
+
+   if (eina_hash_find(modules, ctx_id))
+     return 1;
+
+   return 0;
 }
index dd951e2..b4ff0f2 100644 (file)
@@ -1,13 +1,41 @@
 #ifndef _ECORE_IMF_PRIVATE_H
 #define _ECORE_IMF_PRIVATE_H
 
-#include "Ecore_IMF.h"
+#define ECORE_MAGIC_CONTEXT 0x56c1b39a
 
-#include "ecore_private.h"
+#ifdef ECORE_IMF_DEFAULT_LOG_COLOR
+#undef ECORE_IMF_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_IMF_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
 
-#define ECORE_MAGIC_CONTEXT 0x56c1b39a
+extern int _ecore_imf_log_dom;
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_imf_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_imf_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_imf_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_imf_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_imf_log_dom, __VA_ARGS__)
 
 typedef struct _Ecore_IMF_Module Ecore_IMF_Module;
+typedef struct _Ecore_IMF_Func_Node Ecore_IMF_Func_Node;
 
 struct _Ecore_IMF_Context
 {
@@ -16,23 +44,41 @@ struct _Ecore_IMF_Context
    const Ecore_IMF_Context_Class *klass;
    void                          *data;
    int                            input_mode;
-   int                          (*retrieve_surrounding_func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos);
+   void                          *window;
+   void                          *client_canvas;
+   Eina_Bool                    (*retrieve_surrounding_func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos);
    void                          *retrieve_surrounding_data;
+   Eina_List                     *callbacks;
+   Ecore_IMF_Autocapital_Type     autocapital_type;
+   Ecore_IMF_Input_Panel_Layout   input_panel_layout;
+   Ecore_IMF_Input_Panel_Lang     input_panel_lang;
+   Ecore_IMF_Input_Panel_Return_Key_Type input_panel_return_key_type;
+   Eina_Bool                      allow_prediction : 1;
+   Eina_Bool                      input_panel_enabled : 1;
+   Eina_Bool                      input_panel_return_key_disabled : 1;
+   Eina_Bool                      input_panel_caps_lock_mode : 1;
 };
 
 struct _Ecore_IMF_Module
 {
-   Ecore_Plugin                 *plugin;
    const Ecore_IMF_Context_Info *info;
    Ecore_IMF_Context            *(*create)(void);
+   Ecore_IMF_Context            *(*exit)(void);
+};
+
+struct _Ecore_IMF_Func_Node
+{
+   void (*func) ();
+   const void *data;
+   Ecore_IMF_Callback_Type type;
 };
 
 void               ecore_imf_module_init(void);
 void               ecore_imf_module_shutdown(void);
-Ecore_List        *ecore_imf_module_available_get(void);
+Eina_List         *ecore_imf_module_available_get(void);
 Ecore_IMF_Module  *ecore_imf_module_get(const char *ctx_id);
 Ecore_IMF_Context *ecore_imf_module_context_create(const char *ctx_id);
-Ecore_List        *ecore_imf_module_context_ids_get(void);
-Ecore_List        *ecore_imf_module_context_ids_by_canvas_type_get(const char *canvas_type);
+Eina_List         *ecore_imf_module_context_ids_get(void);
+Eina_List         *ecore_imf_module_context_ids_by_canvas_type_get(const char *canvas_type);
 
 #endif
index ea99324..5f7cdb9 100644 (file)
@@ -1,6 +1,3 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
 #ifndef _ECORE_IMF_EVAS_H
 #define _ECORE_IMF_EVAS_H
 
@@ -12,7 +9,7 @@
 #endif
 
 #ifdef _WIN32
-# ifdef EFL_ECORE_IMF_BUILD
+# ifdef EFL_ECORE_IMF_EVAS_BUILD
 #  ifdef DLL_EXPORT
 #   define EAPI __declspec(dllexport)
 #  else
@@ -20,7 +17,7 @@
 #  endif /* ! DLL_EXPORT */
 # else
 #  define EAPI __declspec(dllimport)
-# endif /* ! EFL_ECORE_EVAS_BUILD */
+# endif /* ! EFL_ECORE_IMF_BUILD */
 #else
 # ifdef __GNUC__
 #  if __GNUC__ >= 4
 extern "C" {
 #endif
 
-   EAPI void ecore_imf_evas_event_mouse_in_wrap(Evas_Event_Mouse_In *evas_event, Ecore_IMF_Event_Mouse_In *imf_event);
-   EAPI void ecore_imf_evas_event_mouse_out_wrap(Evas_Event_Mouse_Out *evas_event, Ecore_IMF_Event_Mouse_Out *imf_event);
-   EAPI void ecore_imf_evas_event_mouse_move_wrap(Evas_Event_Mouse_Move *evas_event, Ecore_IMF_Event_Mouse_Move *imf_event);
-   EAPI void ecore_imf_evas_event_mouse_down_wrap(Evas_Event_Mouse_Down *evas_event, Ecore_IMF_Event_Mouse_Down *imf_event);
-   EAPI void ecore_imf_evas_event_mouse_up_wrap(Evas_Event_Mouse_Up *evas_event, Ecore_IMF_Event_Mouse_Up *imf_event);
-   EAPI void ecore_imf_evas_event_mouse_wheel_wrap(Evas_Event_Mouse_Wheel *evas_event, Ecore_IMF_Event_Mouse_Wheel *imf_event);
-   EAPI void ecore_imf_evas_event_key_down_wrap(Evas_Event_Key_Down *evas_event, Ecore_IMF_Event_Key_Down *imf_event);
-   EAPI void ecore_imf_evas_event_key_up_wrap(Evas_Event_Key_Up *evas_event, Ecore_IMF_Event_Key_Up *imf_event);
+EAPI void ecore_imf_evas_event_mouse_in_wrap(Evas_Event_Mouse_In *evas_event, Ecore_IMF_Event_Mouse_In *imf_event);
+EAPI void ecore_imf_evas_event_mouse_out_wrap(Evas_Event_Mouse_Out *evas_event, Ecore_IMF_Event_Mouse_Out *imf_event);
+EAPI void ecore_imf_evas_event_mouse_move_wrap(Evas_Event_Mouse_Move *evas_event, Ecore_IMF_Event_Mouse_Move *imf_event);
+EAPI void ecore_imf_evas_event_mouse_down_wrap(Evas_Event_Mouse_Down *evas_event, Ecore_IMF_Event_Mouse_Down *imf_event);
+EAPI void ecore_imf_evas_event_mouse_up_wrap(Evas_Event_Mouse_Up *evas_event, Ecore_IMF_Event_Mouse_Up *imf_event);
+EAPI void ecore_imf_evas_event_mouse_wheel_wrap(Evas_Event_Mouse_Wheel *evas_event, Ecore_IMF_Event_Mouse_Wheel *imf_event);
+EAPI void ecore_imf_evas_event_key_down_wrap(Evas_Event_Key_Down *evas_event, Ecore_IMF_Event_Key_Down *imf_event);
+EAPI void ecore_imf_evas_event_key_up_wrap(Evas_Event_Key_Up *evas_event, Ecore_IMF_Event_Key_Up *imf_event);
 
 #ifdef __cplusplus
 }
index d41fc2d..fa5c491 100644 (file)
@@ -1,28 +1,22 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-if BUILD_ECORE_IMF_EVAS
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
 -I$(top_srcdir)/src/lib/ecore_imf \
-@EVAS_CFLAGS@
+@EFL_ECORE_IMF_EVAS_BUILD@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
 
 lib_LTLIBRARIES = libecore_imf_evas.la
-include_HEADERS = \
-Ecore_IMF_Evas.h
+includes_HEADERS = Ecore_IMF_Evas.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_imf_evas_la_SOURCES = \
 ecore_imf_evas.c
 
 libecore_imf_evas_la_LIBADD = \
 $(top_builddir)/src/lib/ecore_imf/libecore_imf.la \
-@EVAS_LIBS@
+@EVAS_LIBS@ \
+@EINA_LIBS@
 
-libecore_imf_evas_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore_imf/libecore_imf.la
-
-libecore_imf_evas_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
-endif
-
-EXTRA_DIST = \
-Ecore_IMF_Evas.h \
-ecore_imf_evas.c
+libecore_imf_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
index a60a5b0..4a5f3dd 100644 (file)
@@ -1,25 +1,28 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#include <Ecore.h>
+#include "ecore_private.h"
 #include "Ecore_IMF_Evas.h"
 
 /**
  * @defgroup Ecore_IMF_Evas_Group Ecore Input Method Context Evas Helper Functions
  *
  * Helper functions to make it easy to use Evas with Ecore_IMF.
+ * Converts each event from Evas to the corresponding event of Ecore_IMF.
+ *
+ * An example of usage of these functions can be found at:
+ * @li @ref ecore_imf_example_c
  */
 
-static char *_ecore_imf_evas_event_empty = "";
+static const char *_ecore_imf_evas_event_empty = "";
 
 /* Converts the Evas modifiers to Ecore_IMF keyboard modifiers */
 static void
 _ecore_imf_evas_event_modifiers_wrap(Evas_Modifier *evas_modifiers,
-                                    Ecore_IMF_Keyboard_Modifiers *imf_keyboard_modifiers)
+                                     Ecore_IMF_Keyboard_Modifiers *imf_keyboard_modifiers)
 {
    if (!evas_modifiers || !imf_keyboard_modifiers)
      return;
@@ -33,12 +36,14 @@ _ecore_imf_evas_event_modifiers_wrap(Evas_Modifier *evas_modifiers,
      *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_SHIFT;
    if (evas_key_modifier_is_set(evas_modifiers, "Super") || evas_key_modifier_is_set(evas_modifiers, "Hyper"))
      *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_WIN;
+   if (evas_key_modifier_is_set(evas_modifiers, "AltGr"))
+     *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_ALTGR;
 }
 
 /* Converts the Evas locks to Ecore_IMF keyboard locks */
 static void
 _ecore_imf_evas_event_locks_wrap(Evas_Lock *evas_locks,
-                                Ecore_IMF_Keyboard_Locks *imf_keyboard_locks)
+                                 Ecore_IMF_Keyboard_Locks *imf_keyboard_locks)
 {
    if (!evas_locks || !imf_keyboard_locks)
      return;
@@ -55,7 +60,7 @@ _ecore_imf_evas_event_locks_wrap(Evas_Lock *evas_locks,
 /* Converts the Evas mouse flags to Ecore_IMF mouse flags */
 static void
 _ecore_imf_evas_event_mouse_flags_wrap(Evas_Button_Flags evas_flags,
-                                      Ecore_IMF_Mouse_Flags *imf_flags)
+                                       Ecore_IMF_Mouse_Flags *imf_flags)
 {
    if (!imf_flags)
      return;
@@ -76,7 +81,7 @@ _ecore_imf_evas_event_mouse_flags_wrap(Evas_Button_Flags evas_flags,
  */
 EAPI void
 ecore_imf_evas_event_mouse_in_wrap(Evas_Event_Mouse_In *evas_event,
-                                  Ecore_IMF_Event_Mouse_In *imf_event)
+                                   Ecore_IMF_Event_Mouse_In *imf_event)
 {
    if (!evas_event || !imf_event)
      return;
@@ -100,7 +105,7 @@ ecore_imf_evas_event_mouse_in_wrap(Evas_Event_Mouse_In *evas_event,
  */
 EAPI void
 ecore_imf_evas_event_mouse_out_wrap(Evas_Event_Mouse_Out *evas_event,
-                                   Ecore_IMF_Event_Mouse_Out *imf_event)
+                                    Ecore_IMF_Event_Mouse_Out *imf_event)
 {
    if (!evas_event || !imf_event)
      return;
@@ -124,7 +129,7 @@ ecore_imf_evas_event_mouse_out_wrap(Evas_Event_Mouse_Out *evas_event,
  */
 EAPI void
 ecore_imf_evas_event_mouse_move_wrap(Evas_Event_Mouse_Move *evas_event,
-                                    Ecore_IMF_Event_Mouse_Move *imf_event)
+                                     Ecore_IMF_Event_Mouse_Move *imf_event)
 {
    if (!evas_event || !imf_event)
      return;
@@ -152,7 +157,7 @@ ecore_imf_evas_event_mouse_move_wrap(Evas_Event_Mouse_Move *evas_event,
  */
 EAPI void
 ecore_imf_evas_event_mouse_down_wrap(Evas_Event_Mouse_Down *evas_event,
-                                    Ecore_IMF_Event_Mouse_Down *imf_event)
+                                     Ecore_IMF_Event_Mouse_Down *imf_event)
 {
    if (!evas_event || !imf_event)
       return;
@@ -177,7 +182,7 @@ ecore_imf_evas_event_mouse_down_wrap(Evas_Event_Mouse_Down *evas_event,
  */
 EAPI void
 ecore_imf_evas_event_mouse_up_wrap(Evas_Event_Mouse_Up *evas_event,
-                                  Ecore_IMF_Event_Mouse_Up *imf_event)
+                                   Ecore_IMF_Event_Mouse_Up *imf_event)
 {
    if (!evas_event || !imf_event)
      return;
@@ -202,7 +207,7 @@ ecore_imf_evas_event_mouse_up_wrap(Evas_Event_Mouse_Up *evas_event,
  */
 EAPI void
 ecore_imf_evas_event_mouse_wheel_wrap(Evas_Event_Mouse_Wheel *evas_event,
-                                     Ecore_IMF_Event_Mouse_Wheel *imf_event)
+                                      Ecore_IMF_Event_Mouse_Wheel *imf_event)
 {
    if (!evas_event || !imf_event)
      return;
@@ -225,10 +230,32 @@ ecore_imf_evas_event_mouse_wheel_wrap(Evas_Event_Mouse_Wheel *evas_event,
  * @param evas_event The received Evas event.
  * @param imf_event The location to store the converted Ecore_IMF event.
  * @ingroup Ecore_IMF_Evas_Group
+ *
+ * Example
+ * @code
+ * static void
+ * _key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+ * {
+ *    Evas_Event_Key_Down *ev = event_info;
+ *    if (!ev->keyname) return;
+ *
+ *    if (imf_context)
+ *      {
+ *         Ecore_IMF_Event_Key_Down ecore_ev;
+ *         ecore_imf_evas_event_key_down_wrap(ev, &ecore_ev);
+ *         if (ecore_imf_context_filter_event(imf_context,
+ *                                            ECORE_IMF_EVENT_KEY_DOWN,
+ *                                            (Ecore_IMF_Event *)&ecore_ev))
+ *           return;
+ *      }
+ * }
+ *
+ * evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, data);
+ * @endcode
  */
 EAPI void
 ecore_imf_evas_event_key_down_wrap(Evas_Event_Key_Down *evas_event,
-                                  Ecore_IMF_Event_Key_Down *imf_event)
+                                   Ecore_IMF_Event_Key_Down *imf_event)
 {
    if (!evas_event || !imf_event)
      return;
@@ -248,11 +275,45 @@ ecore_imf_evas_event_key_down_wrap(Evas_Event_Key_Down *evas_event,
  * @param evas_event The received Evas event.
  * @param imf_event The location to store the converted Ecore_IMF event.
  * @ingroup Ecore_IMF_Evas_Group
+ *
+ * Example
+ * @code
+ * static void
+ * _key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+ * {
+ *    Evas_Event_Key_Up *ev = event_info;
+ *    if (!ev->keyname) return;
+ *
+ *    if (imf_context)
+ *      {
+ *         Ecore_IMF_Event_Key_Up ecore_ev;
+ *         ecore_imf_evas_event_key_up_wrap(ev, &ecore_ev);
+ *         if (ecore_imf_context_filter_event(imf_context,
+ *                                            ECORE_IMF_EVENT_KEY_UP,
+ *                                            (Ecore_IMF_Event *)&ecore_ev))
+ *           return;
+ *      }
+ * }
+ *
+ * evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_UP, _key_up_cb, data);
+ * @endcode
  */
 EAPI void
 ecore_imf_evas_event_key_up_wrap(Evas_Event_Key_Up *evas_event,
-                                Ecore_IMF_Event_Key_Up *imf_event)
+                                 Ecore_IMF_Event_Key_Up *imf_event)
 {
+   if (!evas_event)
+     {
+        EINA_LOG_ERR("Evas event is missing");
+        return;
+     }
+
+   if (!imf_event)
+     {
+        EINA_LOG_ERR("Imf event is missing");
+        return;
+     }
+
    imf_event->keyname = evas_event->keyname ? evas_event->keyname : _ecore_imf_evas_event_empty;
    imf_event->key = evas_event->key ? evas_event->key : _ecore_imf_evas_event_empty;
    imf_event->string = evas_event->string ? evas_event->string : _ecore_imf_evas_event_empty;
diff --git a/src/lib/ecore_input/Ecore_Input.h b/src/lib/ecore_input/Ecore_Input.h
new file mode 100644 (file)
index 0000000..d1feb22
--- /dev/null
@@ -0,0 +1,236 @@
+#ifndef _ECORE_INPUT_H
+#define _ECORE_INPUT_H
+
+#ifdef _WIN32
+# include <stddef.h>
+#else
+# include <inttypes.h>
+#endif
+
+#include <Eina.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_ECORE_INPUT_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_ECORE_INPUT_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+   EAPI extern int ECORE_EVENT_KEY_DOWN;
+   EAPI extern int ECORE_EVENT_KEY_UP;
+   EAPI extern int ECORE_EVENT_MOUSE_BUTTON_DOWN;
+   EAPI extern int ECORE_EVENT_MOUSE_BUTTON_UP;
+   EAPI extern int ECORE_EVENT_MOUSE_MOVE;
+   EAPI extern int ECORE_EVENT_MOUSE_WHEEL;
+   EAPI extern int ECORE_EVENT_MOUSE_IN;
+   EAPI extern int ECORE_EVENT_MOUSE_OUT;
+
+#define ECORE_EVENT_MODIFIER_SHIFT      0x0001
+#define ECORE_EVENT_MODIFIER_CTRL       0x0002
+#define ECORE_EVENT_MODIFIER_ALT        0x0004
+#define ECORE_EVENT_MODIFIER_WIN        0x0008
+#define ECORE_EVENT_MODIFIER_SCROLL     0x0010
+#define ECORE_EVENT_MODIFIER_NUM        0x0020
+#define ECORE_EVENT_MODIFIER_CAPS       0x0040
+#define ECORE_EVENT_LOCK_SCROLL         0x0080
+#define ECORE_EVENT_LOCK_NUM            0x0100
+#define ECORE_EVENT_LOCK_CAPS           0x0200
+#define ECORE_EVENT_LOCK_SHIFT          0x0300
+#define ECORE_EVENT_MODIFIER_ALTGR      0x0400 /**< @since 1.7 */
+
+   typedef uintptr_t                        Ecore_Window;
+   typedef struct _Ecore_Event_Key          Ecore_Event_Key;
+   typedef struct _Ecore_Event_Mouse_Button Ecore_Event_Mouse_Button;
+   typedef struct _Ecore_Event_Mouse_Wheel  Ecore_Event_Mouse_Wheel;
+   typedef struct _Ecore_Event_Mouse_Move   Ecore_Event_Mouse_Move;
+   typedef struct _Ecore_Event_Mouse_IO     Ecore_Event_Mouse_IO;
+   typedef struct _Ecore_Event_Modifiers    Ecore_Event_Modifiers;
+   
+   typedef enum _Ecore_Event_Modifier
+     {
+        ECORE_NONE,
+        ECORE_SHIFT,
+        ECORE_CTRL,
+        ECORE_ALT,
+        ECORE_WIN,
+        ECORE_SCROLL,
+        ECORE_CAPS,
+        ECORE_MODE, /**< @since 1.7 */
+        ECORE_LAST
+     } Ecore_Event_Modifier;
+
+   typedef enum _Ecore_Event_Press
+     {
+        ECORE_DOWN,
+        ECORE_UP
+     } Ecore_Event_Press;
+
+   typedef enum _Ecore_Event_IO
+     {
+        ECORE_IN,
+        ECORE_OUT
+     } Ecore_Event_IO;
+
+   typedef enum _Ecore_Compose_State
+     {   
+        ECORE_COMPOSE_NONE,
+        ECORE_COMPOSE_MIDDLE,
+        ECORE_COMPOSE_DONE
+     } Ecore_Compose_State;
+
+   struct _Ecore_Event_Key
+     {
+        const char      *keyname;
+        const char      *key;
+        const char      *string;
+        const char      *compose;
+        Ecore_Window     window;
+        Ecore_Window     root_window;
+        Ecore_Window     event_window;
+        
+        unsigned int     timestamp;
+        unsigned int     modifiers;
+        
+        int              same_screen;
+     };
+
+   struct _Ecore_Event_Mouse_Button
+     {
+        Ecore_Window     window;
+        Ecore_Window     root_window;
+        Ecore_Window     event_window;
+        
+        unsigned int     timestamp;
+        unsigned int     modifiers;
+        unsigned int     buttons;
+        unsigned int     double_click;
+        unsigned int     triple_click;
+        int              same_screen;
+        
+        int              x;
+        int              y;
+        struct {
+           int           x;
+           int           y;
+        } root;
+        
+        struct {
+           int           device; /* 0 if normal mouse, 1+ for other mouse-devices (eg multi-touch - other fingers) */
+           double        radius, radius_x, radius_y; /* radius of press point - radius_x and y if its an ellipse (radius is the average of the 2) */
+           double        pressure; /* pressure - 1.0 == normal, > 1.0 == more, 0.0 == none */
+           double        angle; /* angle relative to perpendicular (0.0 == perpendicular), in degrees */
+           double        x, y; /* same as x, y root.x, root.y, but with sub-pixel precision, if available */
+           struct {
+              double     x, y;
+           } root;
+        } multi;
+     };
+   
+   struct _Ecore_Event_Mouse_Wheel
+     {
+        Ecore_Window     window;
+        Ecore_Window     root_window;
+        Ecore_Window     event_window;
+        
+        unsigned int     timestamp;
+        unsigned int     modifiers;
+        
+        int              same_screen;
+        int              direction;
+        int              z;
+        
+        int              x;
+        int              y;
+        struct {
+           int           x;
+           int           y;
+        } root;
+     };
+   
+   struct _Ecore_Event_Mouse_Move
+     {
+        Ecore_Window     window;
+        Ecore_Window     root_window;
+        Ecore_Window     event_window;
+        
+        unsigned int     timestamp;
+        unsigned int     modifiers;
+        
+        int              same_screen;
+        
+        int              x;
+        int              y;
+        struct {
+           int           x;
+           int           y;
+        } root;
+        
+        struct {
+           int           device; /* 0 if normal mouse, 1+ for other mouse-devices (eg multi-touch - other fingers) */
+           double        radius, radius_x, radius_y; /* radius of press point - radius_x and y if its an ellipse (radius is the average of the 2) */
+           double        pressure; /* pressure - 1.0 == normal, > 1.0 == more, 0.0 == none */
+           double        angle; /* angle relative to perpendicular (0.0 == perpendicular), in degrees */
+           double        x, y; /* same as x, y root.x, root.y, but with sub-pixel precision, if available */
+           struct {
+              double     x, y;
+           } root;
+        } multi;
+     };
+   
+   struct _Ecore_Event_Mouse_IO
+     {
+        Ecore_Window     window;
+        Ecore_Window     event_window;
+        
+        unsigned int     timestamp;
+        unsigned int     modifiers;
+        
+        int              x;
+        int              y;
+     };
+
+   struct _Ecore_Event_Modifiers
+     {
+        unsigned int size;
+        unsigned int array[ECORE_LAST];
+     };
+   
+   EAPI int                  ecore_event_init(void);
+   EAPI int                  ecore_event_shutdown(void);
+   
+   EAPI unsigned int         ecore_event_modifier_mask(Ecore_Event_Modifier modifier);
+   EAPI Ecore_Event_Modifier ecore_event_update_modifier(const char *key, Ecore_Event_Modifiers *modifiers, int inc);
+
+   /**
+    * @since 1.7
+    */
+   EAPI Ecore_Compose_State  ecore_compose_get(const Eina_List *seq, char **seqstr_ret);
+   
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/ecore_input/Makefile.am b/src/lib/ecore_input/Makefile.am
new file mode 100644 (file)
index 0000000..da00da7
--- /dev/null
@@ -0,0 +1,26 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore \
+@EFL_ECORE_INPUT_BUILD@ \
+@EINA_CFLAGS@ \
+@EVIL_CFLAGS@
+
+lib_LTLIBRARIES = libecore_input.la
+includes_HEADERS = Ecore_Input.h
+includesdir = $(includedir)/ecore-@VMAJ@
+
+libecore_input_la_SOURCES = \
+ecore_input.c \
+ecore_input_compose.c \
+ecore_input_compose.h
+
+libecore_input_la_LIBADD = \
+$(top_builddir)/src/lib/ecore/libecore.la \
+@EINA_LIBS@ \
+@EVIL_LIBS@
+
+libecore_input_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
+
+EXTRA_DIST = ecore_input_private.h
diff --git a/src/lib/ecore_input/ecore_input.c b/src/lib/ecore_input/ecore_input.c
new file mode 100644 (file)
index 0000000..8f4b1f9
--- /dev/null
@@ -0,0 +1,127 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+#include "Ecore_Input.h"
+#include "ecore_input_private.h"
+
+
+int _ecore_input_log_dom = -1;
+
+EAPI int ECORE_EVENT_KEY_DOWN = 0;
+EAPI int ECORE_EVENT_KEY_UP = 0;
+EAPI int ECORE_EVENT_MOUSE_BUTTON_DOWN = 0;
+EAPI int ECORE_EVENT_MOUSE_BUTTON_UP = 0;
+EAPI int ECORE_EVENT_MOUSE_MOVE = 0;
+EAPI int ECORE_EVENT_MOUSE_WHEEL = 0;
+EAPI int ECORE_EVENT_MOUSE_IN = 0;
+EAPI int ECORE_EVENT_MOUSE_OUT = 0;
+
+static int _ecore_event_init_count = 0;
+
+EAPI int
+ecore_event_init(void)
+{
+   if (++_ecore_event_init_count != 1)
+     return _ecore_event_init_count;
+   if (!ecore_init())
+     {
+        _ecore_event_init_count--;
+        return 0;
+     }
+
+   _ecore_input_log_dom = eina_log_domain_register
+     ("ecore_input", ECORE_INPUT_DEFAULT_LOG_COLOR);
+   if(_ecore_input_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the ecore input module.");
+       return --_ecore_event_init_count;
+     }
+
+   ECORE_EVENT_KEY_DOWN = ecore_event_type_new();
+   ECORE_EVENT_KEY_UP = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_BUTTON_UP = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_MOVE = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_WHEEL = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_IN = ecore_event_type_new();
+   ECORE_EVENT_MOUSE_OUT = ecore_event_type_new();
+
+   return _ecore_event_init_count;
+}
+
+EAPI int
+ecore_event_shutdown(void)
+{
+   if (--_ecore_event_init_count != 0)
+     return _ecore_event_init_count;
+
+   ECORE_EVENT_KEY_DOWN = 0;
+   ECORE_EVENT_KEY_UP = 0;
+   ECORE_EVENT_MOUSE_BUTTON_DOWN = 0;
+   ECORE_EVENT_MOUSE_BUTTON_UP = 0;
+   ECORE_EVENT_MOUSE_MOVE = 0;
+   ECORE_EVENT_MOUSE_WHEEL = 0;
+   ECORE_EVENT_MOUSE_IN = 0;
+   ECORE_EVENT_MOUSE_OUT = 0;
+   eina_log_domain_unregister(_ecore_input_log_dom);
+   _ecore_input_log_dom = -1;
+   ecore_shutdown();
+   return _ecore_event_init_count;
+}
+
+typedef struct _Ecore_Event_Modifier_Match Ecore_Event_Modifier_Match;
+struct _Ecore_Event_Modifier_Match
+{
+   const char *key;
+   Ecore_Event_Modifier modifier;
+   unsigned int event_modifier;
+};
+
+static const Ecore_Event_Modifier_Match matchs[] = {
+  { "Shift_L", ECORE_SHIFT, ECORE_EVENT_MODIFIER_SHIFT },
+  { "Shift_R", ECORE_SHIFT, ECORE_EVENT_MODIFIER_SHIFT },
+  { "Alt_L", ECORE_ALT, ECORE_EVENT_MODIFIER_ALT },
+  { "Alt_R", ECORE_ALT, ECORE_EVENT_MODIFIER_ALT },
+  { "Control_L", ECORE_CTRL, ECORE_EVENT_MODIFIER_CTRL },
+  { "Control_R", ECORE_CTRL, ECORE_EVENT_MODIFIER_CTRL },
+  { "Caps_Lock", ECORE_CAPS, ECORE_EVENT_MODIFIER_CAPS },
+  { "Super_L", ECORE_WIN, ECORE_EVENT_MODIFIER_WIN },
+  { "Super_R", ECORE_WIN, ECORE_EVENT_MODIFIER_WIN },
+  { "ISO_Level3_Shift", ECORE_MODE, ECORE_EVENT_MODIFIER_ALTGR },
+  { "Scroll_Lock", ECORE_SCROLL, ECORE_EVENT_MODIFIER_SCROLL }
+};
+
+EAPI unsigned int
+ecore_event_modifier_mask(Ecore_Event_Modifier modifier)
+{
+   size_t i;
+
+   for (i = 0; i < sizeof (matchs) / sizeof (Ecore_Event_Modifier_Match); i++)
+     if (matchs[i].modifier == modifier)
+       return matchs[i].event_modifier;
+
+   return 0;
+}
+
+EAPI Ecore_Event_Modifier
+ecore_event_update_modifier(const char *key, Ecore_Event_Modifiers *modifiers, int inc)
+{
+   size_t i;
+
+   for (i = 0; i < sizeof (matchs) / sizeof (Ecore_Event_Modifier_Match); i++)
+     if (strcmp(matchs[i].key, key) == 0)
+       {
+          if (modifiers && matchs[i].modifier < modifiers->size)
+            modifiers->array[matchs[i].modifier] += inc;
+          return matchs[i].modifier;
+       }
+
+   return ECORE_NONE;
+}
diff --git a/src/lib/ecore_input/ecore_input_compose.c b/src/lib/ecore_input/ecore_input_compose.c
new file mode 100644 (file)
index 0000000..5335a7f
--- /dev/null
@@ -0,0 +1,61 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#include "Ecore.h"
+#include "ecore_private.h"
+
+#include "Ecore_Input.h"
+#include "ecore_input_private.h"
+
+// some info on a big big big compose table
+// http://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre
+// isolate compose tree into its own file - hand crafted into static const c
+#include "ecore_input_compose.h"
+
+EAPI Ecore_Compose_State
+ecore_compose_get(const Eina_List *seq, char **seqstr_ret)
+{
+   Comp *c, *cend;
+   Eina_List *l;
+   const char *s;
+   int i = 0;
+
+   if (!seq) return ECORE_COMPOSE_NONE;
+   l = (Eina_List *)seq;
+   s = l->data;
+   cend = (Comp *)comp + (sizeof(comp) / sizeof(comp[0]));
+   for (c = (Comp *)comp; c->s && s;)
+     {
+        // doesn't match -> jump to next level entry
+        if (!(!strcmp(s, c->s)))
+          {
+             c += c->jump + 1;
+             if (c >= cend)
+               {
+                  return ECORE_COMPOSE_NONE;
+               }
+          }
+        else
+          {
+             cend = c + c->jump;
+             // advance to next sequence member
+             l = l->next;
+             i++;
+             if (l) s = l->data;
+             else s = NULL;
+             c++;
+             // if advanced item jump is an endpoint - it's the string we want
+             if (c->jump == 0)
+               {
+                  if (seqstr_ret) *seqstr_ret = strdup(c->s);
+                  return ECORE_COMPOSE_DONE;
+               }
+          }
+     }
+   if (i == 0) return ECORE_COMPOSE_NONE;
+   return ECORE_COMPOSE_MIDDLE;
+}
diff --git a/src/lib/ecore_input/ecore_input_compose.h b/src/lib/ecore_input/ecore_input_compose.h
new file mode 100644 (file)
index 0000000..9fbfb76
--- /dev/null
@@ -0,0 +1,9895 @@
+typedef struct _Comp Comp;
+struct _Comp {
+   const char *s;
+   int jump;
+};
+
+static const Comp comp[] = {
+   {"dead_breve", 124},
+      {"dead_breve", 1},
+         {"˘", 0},
+      {"g", 1},
+         {"ğ", 0},
+      {"a", 1},
+         {"ă", 0},
+      {"Greek_IOTA", 1},
+         {"Ῐ", 0},
+      {"dead_grave", 4},
+         {"a", 1},
+            {"ằ", 0},
+         {"A", 1},
+            {"Ằ", 0},
+      {"Greek_iota", 1},
+         {"ῐ", 0},
+      {"e", 1},
+         {"ĕ", 0},
+      {"agrave", 1},
+         {"ằ", 0},
+      {"o", 1},
+         {"ŏ", 0},
+      {"Greek_upsilon", 1},
+         {"ῠ", 0},
+      {"ahook", 1},
+         {"ẳ", 0},
+      {"dead_belowdot", 4},
+         {"a", 1},
+            {"ặ", 0},
+         {"A", 1},
+            {"Ặ", 0},
+      {"space", 1},
+         {"˘", 0},
+      {"Cyrillic_I", 1},
+         {"Й", 0},
+      {"Multi_key", 15},
+         {"exclam", 4},
+            {"a", 1},
+               {"ặ", 0},
+            {"A", 1},
+               {"Ặ", 0},
+         {"cedilla", 4},
+            {"e", 1},
+               {"ḝ", 0},
+            {"E", 1},
+               {"Ḝ", 0},
+         {"comma", 4},
+            {"e", 1},
+               {"ḝ", 0},
+            {"E", 1},
+               {"Ḝ", 0},
+      {"i", 1},
+         {"ĭ", 0},
+      {"dead_tilde", 4},
+         {"a", 1},
+            {"ẵ", 0},
+         {"A", 1},
+            {"Ẵ", 0},
+      {"Cyrillic_a", 1},
+         {"ӑ", 0},
+      {"Cyrillic_U", 1},
+         {"Ў", 0},
+      {"nobreakspace", 1},
+         {"̆", 0},
+      {"u", 1},
+         {"ŭ", 0},
+      {"G", 1},
+         {"Ğ", 0},
+      {"Greek_ALPHA", 1},
+         {"Ᾰ", 0},
+      {"atilde", 1},
+         {"ẵ", 0},
+      {"Cyrillic_ie", 1},
+         {"ӗ", 0},
+      {"E", 1},
+         {"Ĕ", 0},
+      {"Cyrillic_i", 1},
+         {"й", 0},
+      {"Atilde", 1},
+         {"Ẵ", 0},
+      {"Cyrillic_zhe", 1},
+         {"ӂ", 0},
+      {"Greek_alpha", 1},
+         {"ᾰ", 0},
+      {"Ahook", 1},
+         {"Ẳ", 0},
+      {"O", 1},
+         {"Ŏ", 0},
+      {"A", 1},
+         {"Ă", 0},
+      {"Cyrillic_A", 1},
+         {"Ӑ", 0},
+      {"dead_hook", 4},
+         {"a", 1},
+            {"ẳ", 0},
+         {"A", 1},
+            {"Ẳ", 0},
+      {"Cyrillic_ZHE", 1},
+         {"Ӂ", 0},
+      {"Cyrillic_IE", 1},
+         {"Ӗ", 0},
+      {"Aacute", 1},
+         {"Ắ", 0},
+      {"dead_cedilla", 4},
+         {"e", 1},
+            {"ḝ", 0},
+         {"E", 1},
+            {"Ḝ", 0},
+      {"aacute", 1},
+         {"ắ", 0},
+      {"dead_acute", 4},
+         {"a", 1},
+            {"ắ", 0},
+         {"A", 1},
+            {"Ắ", 0},
+      {"Agrave", 1},
+         {"Ằ", 0},
+      {"I", 1},
+         {"Ĭ", 0},
+      {"U", 1},
+         {"Ŭ", 0},
+      {"Cyrillic_u", 1},
+         {"ў", 0},
+      {"Greek_UPSILON", 1},
+         {"Ῠ", 0},
+   {"dead_grave", 351},
+      {"W", 1},
+         {"Ẁ", 0},
+      {"dead_breve", 4},
+         {"a", 1},
+            {"ằ", 0},
+         {"A", 1},
+            {"Ằ", 0},
+      {"a", 1},
+         {"à", 0},
+      {"Greek_IOTA", 1},
+         {"Ὶ", 0},
+      {"dead_grave", 1},
+         {"`", 0},
+      {"dead_horn", 8},
+         {"o", 1},
+            {"ờ", 0},
+         {"u", 1},
+            {"ừ", 0},
+         {"O", 1},
+            {"Ờ", 0},
+         {"U", 1},
+            {"Ừ", 0},
+      {"Greek_iota", 1},
+         {"ὶ", 0},
+      {"dead_circumflex", 12},
+         {"a", 1},
+            {"ầ", 0},
+         {"e", 1},
+            {"ề", 0},
+         {"o", 1},
+            {"ồ", 0},
+         {"E", 1},
+            {"Ề", 0},
+         {"O", 1},
+            {"Ồ", 0},
+         {"A", 1},
+            {"Ầ", 0},
+      {"Greek_OMICRON", 1},
+         {"Ὸ", 0},
+      {"Acircumflex", 1},
+         {"Ầ", 0},
+      {"Cyrillic_er", 1},
+         {"р̀", 0},
+      {"e", 1},
+         {"è", 0},
+      {"o", 1},
+         {"ò", 0},
+      {"Udiaeresis", 1},
+         {"Ǜ", 0},
+      {"Greek_upsilon", 1},
+         {"ὺ", 0},
+      {"uhorn", 1},
+         {"ừ", 0},
+      {"space", 1},
+         {"`", 0},
+      {"dead_macron", 8},
+         {"e", 1},
+            {"ḕ", 0},
+         {"o", 1},
+            {"ṑ", 0},
+         {"E", 1},
+            {"Ḕ", 0},
+         {"O", 1},
+            {"Ṑ", 0},
+      {"acircumflex", 1},
+         {"ầ", 0},
+      {"Ecircumflex", 1},
+         {"Ề", 0},
+      {"Cyrillic_I", 1},
+         {"Ѝ", 0},
+      {"y", 1},
+         {"ỳ", 0},
+      {"Multi_key", 115},
+         {"b", 4},
+            {"a", 1},
+               {"ằ", 0},
+            {"A", 1},
+               {"Ằ", 0},
+         {"parenright", 26},
+            {"Greek_IOTA", 1},
+               {"Ἲ", 0},
+            {"Greek_iota", 1},
+               {"ἲ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὂ", 0},
+            {"Greek_upsilon", 1},
+               {"ὒ", 0},
+            {"Greek_epsilon", 1},
+               {"ἒ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἂ", 0},
+            {"Greek_omicron", 1},
+               {"ὂ", 0},
+            {"Greek_eta", 1},
+               {"ἢ", 0},
+            {"Greek_alpha", 1},
+               {"ἂ", 0},
+            {"Greek_ETA", 1},
+               {"Ἢ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἒ", 0},
+            {"Greek_omega", 1},
+               {"ὢ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὢ", 0},
+         {"quotedbl", 8},
+            {"Greek_iota", 1},
+               {"ῒ", 0},
+            {"Greek_upsilon", 1},
+               {"ῢ", 0},
+            {"u", 1},
+               {"ǜ", 0},
+            {"U", 1},
+               {"Ǜ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ờ", 0},
+            {"u", 1},
+               {"ừ", 0},
+            {"O", 1},
+               {"Ờ", 0},
+            {"U", 1},
+               {"Ừ", 0},
+         {"underscore", 8},
+            {"e", 1},
+               {"ḕ", 0},
+            {"o", 1},
+               {"ṑ", 0},
+            {"E", 1},
+               {"Ḕ", 0},
+            {"O", 1},
+               {"Ṑ", 0},
+         {"macron", 8},
+            {"e", 1},
+               {"ḕ", 0},
+            {"o", 1},
+               {"ṑ", 0},
+            {"E", 1},
+               {"Ḕ", 0},
+            {"O", 1},
+               {"Ṑ", 0},
+         {"parenleft", 28},
+            {"Greek_IOTA", 1},
+               {"Ἳ", 0},
+            {"Greek_iota", 1},
+               {"ἳ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὃ", 0},
+            {"Greek_upsilon", 1},
+               {"ὓ", 0},
+            {"Greek_epsilon", 1},
+               {"ἓ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἃ", 0},
+            {"Greek_omicron", 1},
+               {"ὃ", 0},
+            {"Greek_eta", 1},
+               {"ἣ", 0},
+            {"Greek_alpha", 1},
+               {"ἃ", 0},
+            {"Greek_ETA", 1},
+               {"Ἣ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἓ", 0},
+            {"Greek_omega", 1},
+               {"ὣ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὣ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὓ", 0},
+         {"U", 4},
+            {"a", 1},
+               {"ằ", 0},
+            {"A", 1},
+               {"Ằ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ầ", 0},
+            {"e", 1},
+               {"ề", 0},
+            {"o", 1},
+               {"ồ", 0},
+            {"E", 1},
+               {"Ề", 0},
+            {"O", 1},
+               {"Ồ", 0},
+            {"A", 1},
+               {"Ầ", 0},
+      {"Cyrillic_O", 1},
+         {"О̀", 0},
+      {"i", 1},
+         {"ì", 0},
+      {"n", 1},
+         {"ǹ", 0},
+      {"Cyrillic_a", 1},
+         {"а̀", 0},
+      {"Ohorn", 1},
+         {"Ờ", 0},
+      {"ohorn", 1},
+         {"ờ", 0},
+      {"Cyrillic_ER", 1},
+         {"Р̀", 0},
+      {"Greek_epsilon", 1},
+         {"ὲ", 0},
+      {"Cyrillic_U", 1},
+         {"У̀", 0},
+      {"nobreakspace", 1},
+         {"̀", 0},
+      {"V", 1},
+         {"Ǜ", 0},
+      {"Ocircumflex", 1},
+         {"Ồ", 0},
+      {"omacron", 1},
+         {"ṑ", 0},
+      {"ocircumflex", 1},
+         {"ồ", 0},
+      {"u", 1},
+         {"ù", 0},
+      {"Greek_ALPHA", 1},
+         {"Ὰ", 0},
+      {"Cyrillic_ie", 1},
+         {"ѐ", 0},
+      {"emacron", 1},
+         {"ḕ", 0},
+      {"E", 1},
+         {"È", 0},
+      {"Greek_iotadieresis", 1},
+         {"ῒ", 0},
+      {"Y", 1},
+         {"Ỳ", 0},
+      {"Cyrillic_i", 1},
+         {"ѝ", 0},
+      {"dead_dasia", 28},
+         {"Greek_IOTA", 1},
+            {"Ἳ", 0},
+         {"Greek_iota", 1},
+            {"ἳ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ὃ", 0},
+         {"Greek_upsilon", 1},
+            {"ὓ", 0},
+         {"Greek_epsilon", 1},
+            {"ἓ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἃ", 0},
+         {"Greek_omicron", 1},
+            {"ὃ", 0},
+         {"Greek_eta", 1},
+            {"ἣ", 0},
+         {"Greek_alpha", 1},
+            {"ἃ", 0},
+         {"Greek_ETA", 1},
+            {"Ἣ", 0},
+         {"Greek_EPSILON", 1},
+            {"Ἓ", 0},
+         {"Greek_omega", 1},
+            {"ὣ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὣ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ὓ", 0},
+      {"Greek_upsilondieresis", 1},
+         {"ῢ", 0},
+      {"Greek_omicron", 1},
+         {"ὸ", 0},
+      {"Greek_eta", 1},
+         {"ὴ", 0},
+      {"Abreve", 1},
+         {"Ằ", 0},
+      {"dead_psili", 26},
+         {"Greek_IOTA", 1},
+            {"Ἲ", 0},
+         {"Greek_iota", 1},
+            {"ἲ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ὂ", 0},
+         {"Greek_upsilon", 1},
+            {"ὒ", 0},
+         {"Greek_epsilon", 1},
+            {"ἒ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἂ", 0},
+         {"Greek_omicron", 1},
+            {"ὂ", 0},
+         {"Greek_eta", 1},
+            {"ἢ", 0},
+         {"Greek_alpha", 1},
+            {"ἂ", 0},
+         {"Greek_ETA", 1},
+            {"Ἢ", 0},
+         {"Greek_EPSILON", 1},
+            {"Ἒ", 0},
+         {"Greek_omega", 1},
+            {"ὢ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὢ", 0},
+      {"Greek_alpha", 1},
+         {"ὰ", 0},
+      {"ecircumflex", 1},
+         {"ề", 0},
+      {"w", 1},
+         {"ẁ", 0},
+      {"Greek_ETA", 1},
+         {"Ὴ", 0},
+      {"Cyrillic_o", 1},
+         {"о̀", 0},
+      {"Emacron", 1},
+         {"Ḕ", 0},
+      {"v", 1},
+         {"ǜ", 0},
+      {"O", 1},
+         {"Ò", 0},
+      {"abreve", 1},
+         {"ằ", 0},
+      {"A", 1},
+         {"À", 0},
+      {"Greek_EPSILON", 1},
+         {"Ὲ", 0},
+      {"Cyrillic_A", 1},
+         {"А̀", 0},
+      {"Omacron", 1},
+         {"Ṑ", 0},
+      {"Cyrillic_IE", 1},
+         {"Ѐ", 0},
+      {"Greek_omega", 1},
+         {"ὼ", 0},
+      {"dead_diaeresis", 8},
+         {"Greek_iota", 1},
+            {"ῒ", 0},
+         {"Greek_upsilon", 1},
+            {"ῢ", 0},
+         {"u", 1},
+            {"ǜ", 0},
+         {"U", 1},
+            {"Ǜ", 0},
+      {"Uhorn", 1},
+         {"Ừ", 0},
+      {"Greek_OMEGA", 1},
+         {"Ὼ", 0},
+      {"udiaeresis", 1},
+         {"ǜ", 0},
+      {"I", 1},
+         {"Ì", 0},
+      {"N", 1},
+         {"Ǹ", 0},
+      {"U", 1},
+         {"Ù", 0},
+      {"Cyrillic_u", 1},
+         {"у̀", 0},
+      {"Greek_UPSILON", 1},
+         {"Ὺ", 0},
+   {"dead_horn", 99},
+      {"Uhook", 1},
+         {"Ử", 0},
+      {"Obelowdot", 1},
+         {"Ợ", 0},
+      {"Ograve", 1},
+         {"Ờ", 0},
+      {"dead_grave", 8},
+         {"o", 1},
+            {"ờ", 0},
+         {"u", 1},
+            {"ừ", 0},
+         {"O", 1},
+            {"Ờ", 0},
+         {"U", 1},
+            {"Ừ", 0},
+      {"dead_horn", 1},
+         {"̛", 0},
+      {"Oacute", 1},
+         {"Ớ", 0},
+      {"ohook", 1},
+         {"ở", 0},
+      {"o", 1},
+         {"ơ", 0},
+      {"Utilde", 1},
+         {"Ữ", 0},
+      {"dead_belowdot", 8},
+         {"o", 1},
+            {"ợ", 0},
+         {"u", 1},
+            {"ự", 0},
+         {"O", 1},
+            {"Ợ", 0},
+         {"U", 1},
+            {"Ự", 0},
+      {"space", 1},
+         {"̛", 0},
+      {"ubelowdot", 1},
+         {"ự", 0},
+      {"oacute", 1},
+         {"ớ", 0},
+      {"uhook", 1},
+         {"ử", 0},
+      {"dead_tilde", 8},
+         {"o", 1},
+            {"ỡ", 0},
+         {"u", 1},
+            {"ữ", 0},
+         {"O", 1},
+            {"Ỡ", 0},
+         {"U", 1},
+            {"Ữ", 0},
+      {"Uacute", 1},
+         {"Ứ", 0},
+      {"Ugrave", 1},
+         {"Ừ", 0},
+      {"nobreakspace", 1},
+         {"̛", 0},
+      {"uacute", 1},
+         {"ứ", 0},
+      {"u", 1},
+         {"ư", 0},
+      {"otilde", 1},
+         {"ỡ", 0},
+      {"utilde", 1},
+         {"ữ", 0},
+      {"Otilde", 1},
+         {"Ỡ", 0},
+      {"ograve", 1},
+         {"ờ", 0},
+      {"Ohook", 1},
+         {"Ở", 0},
+      {"O", 1},
+         {"Ơ", 0},
+      {"Ubelowdot", 1},
+         {"Ự", 0},
+      {"dead_hook", 8},
+         {"o", 1},
+            {"ở", 0},
+         {"u", 1},
+            {"ử", 0},
+         {"O", 1},
+            {"Ở", 0},
+         {"U", 1},
+            {"Ử", 0},
+      {"ugrave", 1},
+         {"ừ", 0},
+      {"obelowdot", 1},
+         {"ợ", 0},
+      {"dead_acute", 8},
+         {"o", 1},
+            {"ớ", 0},
+         {"u", 1},
+            {"ứ", 0},
+         {"O", 1},
+            {"Ớ", 0},
+         {"U", 1},
+            {"Ứ", 0},
+      {"U", 1},
+         {"Ư", 0},
+   {"dead_circumflex", 335},
+      {"minus", 1},
+         {"⁻", 0},
+      {"W", 1},
+         {"Ŵ", 0},
+      {"g", 1},
+         {"ĝ", 0},
+      {"a", 1},
+         {"â", 0},
+      {"Ograve", 1},
+         {"Ồ", 0},
+      {"dead_circumflex", 1},
+         {"^", 0},
+      {"dead_grave", 12},
+         {"a", 1},
+            {"ầ", 0},
+         {"e", 1},
+            {"ề", 0},
+         {"o", 1},
+            {"ồ", 0},
+         {"E", 1},
+            {"Ề", 0},
+         {"O", 1},
+            {"Ồ", 0},
+         {"A", 1},
+            {"Ầ", 0},
+      {"Ehook", 1},
+         {"Ể", 0},
+      {"1", 1},
+         {"¹", 0},
+      {"C", 1},
+         {"Ĉ", 0},
+      {"KP_4", 1},
+         {"⁴", 0},
+      {"Oacute", 1},
+         {"Ố", 0},
+      {"Cyrillic_er", 1},
+         {"р̂", 0},
+      {"ohook", 1},
+         {"ổ", 0},
+      {"e", 1},
+         {"ê", 0},
+      {"agrave", 1},
+         {"ầ", 0},
+      {"KP_6", 1},
+         {"⁶", 0},
+      {"o", 1},
+         {"ô", 0},
+      {"ahook", 1},
+         {"ẩ", 0},
+      {"dead_belowdot", 12},
+         {"a", 1},
+            {"ậ", 0},
+         {"e", 1},
+            {"ệ", 0},
+         {"o", 1},
+            {"ộ", 0},
+         {"E", 1},
+            {"Ệ", 0},
+         {"O", 1},
+            {"Ộ", 0},
+         {"A", 1},
+            {"Ậ", 0},
+      {"space", 1},
+         {"^", 0},
+      {"KP_8", 1},
+         {"⁸", 0},
+      {"Etilde", 1},
+         {"Ễ", 0},
+      {"Cyrillic_I", 1},
+         {"И̂", 0},
+      {"y", 1},
+         {"ŷ", 0},
+      {"Multi_key", 83},
+         {"exclam", 12},
+            {"a", 1},
+               {"ậ", 0},
+            {"e", 1},
+               {"ệ", 0},
+            {"o", 1},
+               {"ộ", 0},
+            {"E", 1},
+               {"Ệ", 0},
+            {"O", 1},
+               {"Ộ", 0},
+            {"A", 1},
+               {"Ậ", 0},
+         {"t", 4},
+            {"M", 1},
+               {"™", 0},
+            {"m", 1},
+               {"™", 0},
+         {"underbar", 24},
+            {"a", 1},
+               {"ª", 0},
+            {"o", 1},
+               {"º", 0},
+            {"l", 1},
+               {"ˡ", 0},
+            {"y", 1},
+               {"ʸ", 0},
+            {"i", 1},
+               {"ⁱ", 0},
+            {"n", 1},
+               {"ⁿ", 0},
+            {"j", 1},
+               {"ʲ", 0},
+            {"x", 1},
+               {"ˣ", 0},
+            {"w", 1},
+               {"ʷ", 0},
+            {"r", 1},
+               {"ʳ", 0},
+            {"s", 1},
+               {"ˢ", 0},
+            {"h", 1},
+               {"ʰ", 0},
+         {"S", 4},
+            {"M", 1},
+               {"℠", 0},
+            {"m", 1},
+               {"℠", 0},
+         {"underscore", 24},
+            {"a", 1},
+               {"ª", 0},
+            {"o", 1},
+               {"º", 0},
+            {"l", 1},
+               {"ˡ", 0},
+            {"y", 1},
+               {"ʸ", 0},
+            {"i", 1},
+               {"ⁱ", 0},
+            {"n", 1},
+               {"ⁿ", 0},
+            {"j", 1},
+               {"ʲ", 0},
+            {"x", 1},
+               {"ˣ", 0},
+            {"w", 1},
+               {"ʷ", 0},
+            {"r", 1},
+               {"ʳ", 0},
+            {"s", 1},
+               {"ˢ", 0},
+            {"h", 1},
+               {"ʰ", 0},
+         {"s", 4},
+            {"M", 1},
+               {"℠", 0},
+            {"m", 1},
+               {"℠", 0},
+         {"T", 4},
+            {"M", 1},
+               {"™", 0},
+            {"m", 1},
+               {"™", 0},
+      {"oacute", 1},
+         {"ố", 0},
+      {"Cyrillic_O", 1},
+         {"О̂", 0},
+      {"i", 1},
+         {"î", 0},
+      {"KP_9", 1},
+         {"⁹", 0},
+      {"equal", 1},
+         {"⁼", 0},
+      {"KP_Space", 1},
+         {"²", 0},
+      {"dead_tilde", 12},
+         {"a", 1},
+            {"ẫ", 0},
+         {"e", 1},
+            {"ễ", 0},
+         {"o", 1},
+            {"ỗ", 0},
+         {"E", 1},
+            {"Ễ", 0},
+         {"O", 1},
+            {"Ỗ", 0},
+         {"A", 1},
+            {"Ẫ", 0},
+      {"7", 1},
+         {"⁷", 0},
+      {"Cyrillic_a", 1},
+         {"а̂", 0},
+      {"j", 1},
+         {"ĵ", 0},
+      {"parenright", 1},
+         {"⁾", 0},
+      {"Eacute", 1},
+         {"Ế", 0},
+      {"Cyrillic_ER", 1},
+         {"Р̂", 0},
+      {"KP_7", 1},
+         {"⁷", 0},
+      {"Cyrillic_U", 1},
+         {"У̂", 0},
+      {"nobreakspace", 1},
+         {"̂", 0},
+      {"u", 1},
+         {"û", 0},
+      {"z", 1},
+         {"ẑ", 0},
+      {"G", 1},
+         {"Ĝ", 0},
+      {"otilde", 1},
+         {"ỗ", 0},
+      {"H", 1},
+         {"Ĥ", 0},
+      {"8", 1},
+         {"⁸", 0},
+      {"KP_1", 1},
+         {"¹", 0},
+      {"atilde", 1},
+         {"ẫ", 0},
+      {"3", 1},
+         {"³", 0},
+      {"Cyrillic_ie", 1},
+         {"е̂", 0},
+      {"E", 1},
+         {"Ê", 0},
+      {"S", 1},
+         {"Ŝ", 0},
+      {"2", 1},
+         {"²", 0},
+      {"Y", 1},
+         {"Ŷ", 0},
+      {"Cyrillic_i", 1},
+         {"и̂", 0},
+      {"Otilde", 1},
+         {"Ỗ", 0},
+      {"Atilde", 1},
+         {"Ẫ", 0},
+      {"egrave", 1},
+         {"ề", 0},
+      {"ograve", 1},
+         {"ồ", 0},
+      {"plus", 1},
+         {"⁺", 0},
+      {"6", 1},
+         {"⁶", 0},
+      {"Ahook", 1},
+         {"Ẩ", 0},
+      {"w", 1},
+         {"ŵ", 0},
+      {"Ohook", 1},
+         {"Ổ", 0},
+      {"Cyrillic_o", 1},
+         {"о̂", 0},
+      {"4", 1},
+         {"⁴", 0},
+      {"KP_3", 1},
+         {"³", 0},
+      {"eacute", 1},
+         {"ế", 0},
+      {"J", 1},
+         {"Ĵ", 0},
+      {"O", 1},
+         {"Ô", 0},
+      {"s", 1},
+         {"ŝ", 0},
+      {"Z", 1},
+         {"Ẑ", 0},
+      {"KP_0", 1},
+         {"⁰", 0},
+      {"A", 1},
+         {"Â", 0},
+      {"c", 1},
+         {"ĉ", 0},
+      {"KP_Add", 1},
+         {"⁺", 0},
+      {"KP_2", 1},
+         {"²", 0},
+      {"Cyrillic_A", 1},
+         {"А̂", 0},
+      {"dead_hook", 12},
+         {"a", 1},
+            {"ẩ", 0},
+         {"e", 1},
+            {"ể", 0},
+         {"o", 1},
+            {"ổ", 0},
+         {"E", 1},
+            {"Ể", 0},
+         {"O", 1},
+            {"Ổ", 0},
+         {"A", 1},
+            {"Ẩ", 0},
+      {"5", 1},
+         {"⁵", 0},
+      {"KP_5", 1},
+         {"⁵", 0},
+      {"9", 1},
+         {"⁹", 0},
+      {"Cyrillic_IE", 1},
+         {"Е̂", 0},
+      {"Egrave", 1},
+         {"Ề", 0},
+      {"0", 1},
+         {"⁰", 0},
+      {"Aacute", 1},
+         {"Ấ", 0},
+      {"etilde", 1},
+         {"ễ", 0},
+      {"aacute", 1},
+         {"ấ", 0},
+      {"dead_acute", 12},
+         {"a", 1},
+            {"ấ", 0},
+         {"e", 1},
+            {"ế", 0},
+         {"o", 1},
+            {"ố", 0},
+         {"E", 1},
+            {"Ế", 0},
+         {"O", 1},
+            {"Ố", 0},
+         {"A", 1},
+            {"Ấ", 0},
+      {"Agrave", 1},
+         {"Ầ", 0},
+      {"parenleft", 1},
+         {"⁽", 0},
+      {"h", 1},
+         {"ĥ", 0},
+      {"I", 1},
+         {"Î", 0},
+      {"ehook", 1},
+         {"ể", 0},
+      {"U", 1},
+         {"Û", 0},
+      {"Cyrillic_u", 1},
+         {"у̂", 0},
+      {"KP_Equal", 1},
+         {"⁼", 0},
+   {"dead_currency", 103},
+      {"W", 1},
+         {"₩", 0},
+      {"g", 1},
+         {"₲", 0},
+      {"a", 1},
+         {"؋", 0},
+      {"dead_currency", 1},
+         {"¤", 0},
+      {"C", 1},
+         {"₡", 0},
+      {"e", 1},
+         {"€", 0},
+      {"F", 1},
+         {"₣", 0},
+      {"o", 1},
+         {"௹", 0},
+      {"l", 1},
+         {"£", 0},
+      {"t", 1},
+         {"৳", 0},
+      {"thorn", 1},
+         {"৲", 0},
+      {"space", 1},
+         {"¤", 0},
+      {"y", 1},
+         {"¥", 0},
+      {"b", 1},
+         {"฿", 0},
+      {"i", 1},
+         {"﷼", 0},
+      {"k", 1},
+         {"₭", 0},
+      {"n", 1},
+         {"₦", 0},
+      {"ccedilla", 1},
+         {"₵", 0},
+      {"nobreakspace", 1},
+         {"¤", 0},
+      {"u", 1},
+         {"元", 0},
+      {"G", 1},
+         {"₲", 0},
+      {"H", 1},
+         {"₴", 0},
+      {"E", 1},
+         {"₠", 0},
+      {"S", 1},
+         {"$", 0},
+      {"Y", 1},
+         {"円", 0},
+      {"f", 1},
+         {"ƒ", 0},
+      {"d", 1},
+         {"₫", 0},
+      {"D", 1},
+         {"₯", 0},
+      {"w", 1},
+         {"₩", 0},
+      {"p", 1},
+         {"₰", 0},
+      {"P", 1},
+         {"₧", 0},
+      {"M", 1},
+         {"ℳ", 0},
+      {"O", 1},
+         {"૱", 0},
+      {"m", 1},
+         {"₥", 0},
+      {"r", 1},
+         {"₢", 0},
+      {"s", 1},
+         {"₪", 0},
+      {"A", 1},
+         {"₳", 0},
+      {"R", 1},
+         {"₨", 0},
+      {"THORN", 1},
+         {"৲", 0},
+      {"c", 1},
+         {"¢", 0},
+      {"L", 1},
+         {"₤", 0},
+      {"T", 1},
+         {"₮", 0},
+      {"Ccedilla", 1},
+         {"₵", 0},
+      {"K", 1},
+         {"₭", 0},
+      {"B", 1},
+         {"₱", 0},
+      {"dead_cedilla", 4},
+         {"C", 1},
+            {"₵", 0},
+         {"c", 1},
+            {"₵", 0},
+      {"h", 1},
+         {"₴", 0},
+      {"I", 1},
+         {"៛", 0},
+      {"N", 1},
+         {"₦", 0},
+      {"U", 1},
+         {"圓", 0},
+   {"dead_belowdiaeresis", 7},
+      {"u", 1},
+         {"ṳ", 0},
+      {"dead_diaeresis", 2},
+         {"equal", 1},
+            {"⩷", 0},
+      {"U", 1},
+         {"Ṳ", 0},
+   {"dead_belowdot", 167},
+      {"minus", 1},
+         {"⨪", 0},
+      {"W", 1},
+         {"Ẉ", 0},
+      {"dead_breve", 4},
+         {"a", 1},
+            {"ặ", 0},
+         {"A", 1},
+            {"Ặ", 0},
+      {"a", 1},
+         {"ạ", 0},
+      {"dead_circumflex", 12},
+         {"a", 1},
+            {"ậ", 0},
+         {"e", 1},
+            {"ệ", 0},
+         {"o", 1},
+            {"ộ", 0},
+         {"E", 1},
+            {"Ệ", 0},
+         {"O", 1},
+            {"Ộ", 0},
+         {"A", 1},
+            {"Ậ", 0},
+      {"dead_horn", 8},
+         {"o", 1},
+            {"ợ", 0},
+         {"u", 1},
+            {"ự", 0},
+         {"O", 1},
+            {"Ợ", 0},
+         {"U", 1},
+            {"Ự", 0},
+      {"Acircumflex", 1},
+         {"Ậ", 0},
+      {"e", 1},
+         {"ẹ", 0},
+      {"o", 1},
+         {"ọ", 0},
+      {"l", 1},
+         {"ḷ", 0},
+      {"t", 1},
+         {"ṭ", 0},
+      {"dead_belowdot", 1},
+         {"̣", 0},
+      {"uhorn", 1},
+         {"ự", 0},
+      {"space", 1},
+         {"̣", 0},
+      {"dead_macron", 8},
+         {"l", 1},
+            {"ḹ", 0},
+         {"r", 1},
+            {"ṝ", 0},
+         {"R", 1},
+            {"Ṝ", 0},
+         {"L", 1},
+            {"Ḹ", 0},
+      {"acircumflex", 1},
+         {"ậ", 0},
+      {"Ecircumflex", 1},
+         {"Ệ", 0},
+      {"y", 1},
+         {"ỵ", 0},
+      {"b", 1},
+         {"ḅ", 0},
+      {"Multi_key", 9},
+         {"plus", 8},
+            {"o", 1},
+               {"ợ", 0},
+            {"u", 1},
+               {"ự", 0},
+            {"O", 1},
+               {"Ợ", 0},
+            {"U", 1},
+               {"Ự", 0},
+      {"i", 1},
+         {"ị", 0},
+      {"k", 1},
+         {"ḳ", 0},
+      {"n", 1},
+         {"ṇ", 0},
+      {"equal", 1},
+         {"⩦", 0},
+      {"Ohorn", 1},
+         {"Ợ", 0},
+      {"ohorn", 1},
+         {"ợ", 0},
+      {"sabovedot", 1},
+         {"ṩ", 0},
+      {"nobreakspace", 1},
+         {"̣", 0},
+      {"V", 1},
+         {"Ṿ", 0},
+      {"Ocircumflex", 1},
+         {"Ộ", 0},
+      {"ocircumflex", 1},
+         {"ộ", 0},
+      {"u", 1},
+         {"ụ", 0},
+      {"z", 1},
+         {"ẓ", 0},
+      {"H", 1},
+         {"Ḥ", 0},
+      {"E", 1},
+         {"Ẹ", 0},
+      {"S", 1},
+         {"Ṣ", 0},
+      {"Y", 1},
+         {"Ỵ", 0},
+      {"d", 1},
+         {"ḍ", 0},
+      {"D", 1},
+         {"Ḍ", 0},
+      {"Abreve", 1},
+         {"Ặ", 0},
+      {"plus", 1},
+         {"⨥", 0},
+      {"ecircumflex", 1},
+         {"ệ", 0},
+      {"dead_abovedot", 4},
+         {"S", 1},
+            {"Ṩ", 0},
+         {"s", 1},
+            {"ṩ", 0},
+      {"w", 1},
+         {"ẉ", 0},
+      {"v", 1},
+         {"ṿ", 0},
+      {"M", 1},
+         {"Ṃ", 0},
+      {"O", 1},
+         {"Ọ", 0},
+      {"abreve", 1},
+         {"ặ", 0},
+      {"m", 1},
+         {"ṃ", 0},
+      {"r", 1},
+         {"ṛ", 0},
+      {"s", 1},
+         {"ṣ", 0},
+      {"Z", 1},
+         {"Ẓ", 0},
+      {"A", 1},
+         {"Ạ", 0},
+      {"R", 1},
+         {"Ṛ", 0},
+      {"L", 1},
+         {"Ḷ", 0},
+      {"T", 1},
+         {"Ṭ", 0},
+      {"K", 1},
+         {"Ḳ", 0},
+      {"B", 1},
+         {"Ḅ", 0},
+      {"Sabovedot", 1},
+         {"Ṩ", 0},
+      {"Uhorn", 1},
+         {"Ự", 0},
+      {"h", 1},
+         {"ḥ", 0},
+      {"I", 1},
+         {"Ị", 0},
+      {"N", 1},
+         {"Ṇ", 0},
+      {"U", 1},
+         {"Ụ", 0},
+   {"dead_macron", 224},
+      {"adiaeresis", 1},
+         {"ǟ", 0},
+      {"g", 1},
+         {"ḡ", 0},
+      {"a", 1},
+         {"ā", 0},
+      {"Greek_IOTA", 1},
+         {"Ῑ", 0},
+      {"Ograve", 1},
+         {"Ṑ", 0},
+      {"dead_grave", 8},
+         {"e", 1},
+            {"ḕ", 0},
+         {"o", 1},
+            {"ṑ", 0},
+         {"E", 1},
+            {"Ḕ", 0},
+         {"O", 1},
+            {"Ṑ", 0},
+      {"Greek_iota", 1},
+         {"ῑ", 0},
+      {"Oacute", 1},
+         {"Ṓ", 0},
+      {"Cyrillic_er", 1},
+         {"р̄", 0},
+      {"e", 1},
+         {"ē", 0},
+      {"o", 1},
+         {"ō", 0},
+      {"Udiaeresis", 1},
+         {"Ǖ", 0},
+      {"Greek_upsilon", 1},
+         {"ῡ", 0},
+      {"dead_belowdot", 8},
+         {"l", 1},
+            {"ḹ", 0},
+         {"r", 1},
+            {"ṝ", 0},
+         {"R", 1},
+            {"Ṝ", 0},
+         {"L", 1},
+            {"Ḹ", 0},
+      {"space", 1},
+         {"¯", 0},
+      {"dead_macron", 1},
+         {"¯", 0},
+      {"Cyrillic_I", 1},
+         {"Ӣ", 0},
+      {"y", 1},
+         {"ȳ", 0},
+      {"Multi_key", 41},
+         {"period", 8},
+            {"a", 1},
+               {"ǡ", 0},
+            {"o", 1},
+               {"ȱ", 0},
+            {"O", 1},
+               {"Ȱ", 0},
+            {"A", 1},
+               {"Ǡ", 0},
+         {"exclam", 8},
+            {"l", 1},
+               {"ḹ", 0},
+            {"r", 1},
+               {"ṝ", 0},
+            {"R", 1},
+               {"Ṝ", 0},
+            {"L", 1},
+               {"Ḹ", 0},
+         {"quotedbl", 12},
+            {"a", 1},
+               {"ǟ", 0},
+            {"o", 1},
+               {"ȫ", 0},
+            {"u", 1},
+               {"ǖ", 0},
+            {"O", 1},
+               {"Ȫ", 0},
+            {"A", 1},
+               {"Ǟ", 0},
+            {"U", 1},
+               {"Ǖ", 0},
+         {"asciitilde", 4},
+            {"o", 1},
+               {"ȭ", 0},
+            {"O", 1},
+               {"Ȭ", 0},
+         {"semicolon", 4},
+            {"o", 1},
+               {"ǭ", 0},
+            {"O", 1},
+               {"Ǭ", 0},
+      {"oacute", 1},
+         {"ṓ", 0},
+      {"Cyrillic_O", 1},
+         {"О̄", 0},
+      {"i", 1},
+         {"ī", 0},
+      {"dead_tilde", 4},
+         {"o", 1},
+            {"ȭ", 0},
+         {"O", 1},
+            {"Ȭ", 0},
+      {"Cyrillic_a", 1},
+         {"а̄", 0},
+      {"Eacute", 1},
+         {"Ḗ", 0},
+      {"Cyrillic_ER", 1},
+         {"Р̄", 0},
+      {"Cyrillic_U", 1},
+         {"Ӯ", 0},
+      {"nobreakspace", 1},
+         {"̄", 0},
+      {"V", 1},
+         {"Ǖ", 0},
+      {"AE", 1},
+         {"Ǣ", 0},
+      {"u", 1},
+         {"ū", 0},
+      {"G", 1},
+         {"Ḡ", 0},
+      {"Greek_ALPHA", 1},
+         {"Ᾱ", 0},
+      {"otilde", 1},
+         {"ȭ", 0},
+      {"Cyrillic_ie", 1},
+         {"е̄", 0},
+      {"E", 1},
+         {"Ē", 0},
+      {"Y", 1},
+         {"Ȳ", 0},
+      {"Cyrillic_i", 1},
+         {"ӣ", 0},
+      {"dead_ogonek", 4},
+         {"o", 1},
+            {"ǭ", 0},
+         {"O", 1},
+            {"Ǭ", 0},
+      {"odiaeresis", 1},
+         {"ȫ", 0},
+      {"Otilde", 1},
+         {"Ȭ", 0},
+      {"egrave", 1},
+         {"ḕ", 0},
+      {"dead_greek", 12},
+         {"a", 1},
+            {"ᾱ", 0},
+         {"i", 1},
+            {"ῑ", 0},
+         {"u", 1},
+            {"ῡ", 0},
+         {"A", 1},
+            {"Ᾱ", 0},
+         {"I", 1},
+            {"Ῑ", 0},
+         {"U", 1},
+            {"Ῡ", 0},
+      {"ograve", 1},
+         {"ṑ", 0},
+      {"Greek_alpha", 1},
+         {"ᾱ", 0},
+      {"dead_abovedot", 8},
+         {"a", 1},
+            {"ǡ", 0},
+         {"o", 1},
+            {"ȱ", 0},
+         {"O", 1},
+            {"Ȱ", 0},
+         {"A", 1},
+            {"Ǡ", 0},
+      {"Cyrillic_o", 1},
+         {"о̄", 0},
+      {"eacute", 1},
+         {"ḗ", 0},
+      {"v", 1},
+         {"ǖ", 0},
+      {"O", 1},
+         {"Ō", 0},
+      {"A", 1},
+         {"Ā", 0},
+      {"Odiaeresis", 1},
+         {"Ȫ", 0},
+      {"Cyrillic_A", 1},
+         {"А̄", 0},
+      {"Cyrillic_IE", 1},
+         {"Е̄", 0},
+      {"Egrave", 1},
+         {"Ḕ", 0},
+      {"dead_diaeresis", 12},
+         {"a", 1},
+            {"ǟ", 0},
+         {"o", 1},
+            {"ȫ", 0},
+         {"u", 1},
+            {"ǖ", 0},
+         {"O", 1},
+            {"Ȫ", 0},
+         {"A", 1},
+            {"Ǟ", 0},
+         {"U", 1},
+            {"Ǖ", 0},
+      {"Adiaeresis", 1},
+         {"Ǟ", 0},
+      {"dead_acute", 8},
+         {"e", 1},
+            {"ḗ", 0},
+         {"o", 1},
+            {"ṓ", 0},
+         {"E", 1},
+            {"Ḗ", 0},
+         {"O", 1},
+            {"Ṓ", 0},
+      {"udiaeresis", 1},
+         {"ǖ", 0},
+      {"I", 1},
+         {"Ī", 0},
+      {"U", 1},
+         {"Ū", 0},
+      {"Cyrillic_u", 1},
+         {"ӯ", 0},
+      {"ae", 1},
+         {"ǣ", 0},
+      {"Greek_UPSILON", 1},
+         {"Ῡ", 0},
+   {"dead_doublegrave", 24},
+      {"Cyrillic_er", 1},
+         {"р̏", 0},
+      {"Cyrillic_I", 1},
+         {"И̏", 0},
+      {"Cyrillic_O", 1},
+         {"О̏", 0},
+      {"Cyrillic_a", 1},
+         {"а̏", 0},
+      {"Cyrillic_ER", 1},
+         {"Р̏", 0},
+      {"Cyrillic_U", 1},
+         {"У̏", 0},
+      {"Cyrillic_ie", 1},
+         {"е̏", 0},
+      {"Cyrillic_i", 1},
+         {"и̏", 0},
+      {"Cyrillic_o", 1},
+         {"о̏", 0},
+      {"Cyrillic_A", 1},
+         {"А̏", 0},
+      {"Cyrillic_IE", 1},
+         {"Е̏", 0},
+      {"Cyrillic_u", 1},
+         {"у̏", 0},
+   {"Multi_key", 5833},
+      {"backslash", 5},
+         {"minus", 1},
+            {"⍀", 0},
+         {"o", 2},
+            {"slash", 1},
+               {"🙌", 0},
+      {"minus", 59},
+         {"backslash", 1},
+            {"⍀", 0},
+         {"minus", 6},
+            {"minus", 1},
+               {"—", 0},
+            {"period", 1},
+               {"–", 0},
+            {"space", 1},
+               {"­", 0},
+         {"a", 1},
+            {"ā", 0},
+         {"e", 1},
+            {"ē", 0},
+         {"o", 1},
+            {"ō", 0},
+         {"l", 1},
+            {"£", 0},
+         {"space", 1},
+            {"~", 0},
+         {"y", 1},
+            {"¥", 0},
+         {"i", 1},
+            {"ī", 0},
+         {"parenright", 1},
+            {"}", 0},
+         {"u", 1},
+            {"ū", 0},
+         {"E", 1},
+            {"Ē", 0},
+         {"Y", 1},
+            {"¥", 0},
+         {"d", 1},
+            {"đ", 0},
+         {"D", 1},
+            {"Đ", 0},
+         {"plus", 1},
+            {"±", 0},
+         {"colon", 1},
+            {"÷", 0},
+         {"O", 1},
+            {"Ō", 0},
+         {"A", 1},
+            {"Ā", 0},
+         {"L", 1},
+            {"£", 0},
+         {"comma", 1},
+            {"¬", 0},
+         {"slash", 1},
+            {"⌿", 0},
+         {"greater", 1},
+            {"→", 0},
+         {"parenleft", 1},
+            {"{", 0},
+         {"I", 1},
+            {"Ī", 0},
+         {"U", 1},
+            {"Ū", 0},
+         {"asciicircum", 1},
+            {"¯", 0},
+      {"period", 130},
+         {"minus", 1},
+            {"·", 0},
+         {"period", 1},
+            {"…", 0},
+         {"W", 1},
+            {"Ẇ", 0},
+         {"g", 1},
+            {"ġ", 0},
+         {"a", 1},
+            {"ȧ", 0},
+         {"C", 1},
+            {"Ċ", 0},
+         {"exclam", 4},
+            {"S", 1},
+               {"Ṩ", 0},
+            {"s", 1},
+               {"ṩ", 0},
+         {"less", 1},
+            {"‹", 0},
+         {"e", 1},
+            {"ė", 0},
+         {"F", 1},
+            {"Ḟ", 0},
+         {"o", 1},
+            {"ȯ", 0},
+         {"t", 1},
+            {"ṫ", 0},
+         {"dead_belowdot", 4},
+            {"S", 1},
+               {"Ṩ", 0},
+            {"s", 1},
+               {"ṩ", 0},
+         {"y", 1},
+            {"ẏ", 0},
+         {"b", 1},
+            {"ḃ", 0},
+         {"i", 1},
+            {"ı", 0},
+         {"n", 1},
+            {"ṅ", 0},
+         {"equal", 1},
+            {"•", 0},
+         {"dead_caron", 4},
+            {"S", 1},
+               {"Ṧ", 0},
+            {"s", 1},
+               {"ṧ", 0},
+         {"x", 1},
+            {"ẋ", 0},
+         {"z", 1},
+            {"ż", 0},
+         {"G", 1},
+            {"Ġ", 0},
+         {"Sacute", 1},
+            {"Ṥ", 0},
+         {"H", 1},
+            {"Ḣ", 0},
+         {"E", 1},
+            {"Ė", 0},
+         {"S", 1},
+            {"Ṡ", 0},
+         {"Y", 1},
+            {"Ẏ", 0},
+         {"scaron", 1},
+            {"ṧ", 0},
+         {"f", 1},
+            {"ḟ", 0},
+         {"d", 1},
+            {"ḋ", 0},
+         {"Scaron", 1},
+            {"Ṧ", 0},
+         {"D", 1},
+            {"Ḋ", 0},
+         {"acute", 4},
+            {"S", 1},
+               {"Ṥ", 0},
+            {"s", 1},
+               {"ṥ", 0},
+         {"w", 1},
+            {"ẇ", 0},
+         {"p", 1},
+            {"ṗ", 0},
+         {"P", 1},
+            {"Ṗ", 0},
+         {"apostrophe", 4},
+            {"S", 1},
+               {"Ṥ", 0},
+            {"s", 1},
+               {"ṥ", 0},
+         {"M", 1},
+            {"Ṁ", 0},
+         {"O", 1},
+            {"Ȯ", 0},
+         {"m", 1},
+            {"ṁ", 0},
+         {"r", 1},
+            {"ṙ", 0},
+         {"s", 1},
+            {"ṡ", 0},
+         {"Z", 1},
+            {"Ż", 0},
+         {"sacute", 1},
+            {"ṥ", 0},
+         {"A", 1},
+            {"Ȧ", 0},
+         {"R", 1},
+            {"Ṙ", 0},
+         {"c", 1},
+            {"ċ", 0},
+         {"T", 1},
+            {"Ṫ", 0},
+         {"greater", 1},
+            {"›", 0},
+         {"B", 1},
+            {"Ḃ", 0},
+         {"dead_acute", 4},
+            {"S", 1},
+               {"Ṥ", 0},
+            {"s", 1},
+               {"ṥ", 0},
+         {"X", 1},
+            {"Ẋ", 0},
+         {"h", 1},
+            {"ḣ", 0},
+         {"I", 1},
+            {"İ", 0},
+         {"N", 1},
+            {"Ṅ", 0},
+         {"asciicircum", 1},
+            {"·", 0},
+      {"W", 4},
+         {"equal", 1},
+            {"₩", 0},
+         {"asciicircum", 1},
+            {"Ŵ", 0},
+      {"g", 10},
+         {"period", 1},
+            {"ġ", 0},
+         {"breve", 1},
+            {"ğ", 0},
+         {"comma", 1},
+            {"ģ", 0},
+         {"parenleft", 1},
+            {"ğ", 0},
+         {"U", 1},
+            {"ğ", 0},
+      {"a", 30},
+         {"minus", 1},
+            {"ā", 0},
+         {"a", 1},
+            {"å", 0},
+         {"e", 1},
+            {"æ", 0},
+         {"diaeresis", 1},
+            {"ä", 0},
+         {"quotedbl", 1},
+            {"ä", 0},
+         {"acute", 1},
+            {"á", 0},
+         {"underscore", 1},
+            {"ā", 0},
+         {"apostrophe", 1},
+            {"á", 0},
+         {"asterisk", 1},
+            {"å", 0},
+         {"comma", 1},
+            {"ą", 0},
+         {"asciitilde", 1},
+            {"ã", 0},
+         {"greater", 1},
+            {"â", 0},
+         {"parenleft", 1},
+            {"ă", 0},
+         {"grave", 1},
+            {"à", 0},
+         {"asciicircum", 1},
+            {"â", 0},
+      {"Greek_IOTA", 4},
+         {"quotedbl", 1},
+            {"Ϊ", 0},
+         {"apostrophe", 1},
+            {"Ί", 0},
+      {"Greek_iota", 485},
+         {"dead_grave", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾊ", 0},
+               {"Greek_eta", 1},
+                  {"ᾒ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾂ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾚ", 0},
+               {"Greek_omega", 1},
+                  {"ᾢ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾪ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾋ", 0},
+               {"Greek_eta", 1},
+                  {"ᾓ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾃ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾛ", 0},
+               {"Greek_omega", 1},
+                  {"ᾣ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾫ", 0},
+            {"Greek_eta", 1},
+               {"ῂ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾊ", 0},
+               {"Greek_eta", 1},
+                  {"ᾒ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾂ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾚ", 0},
+               {"Greek_omega", 1},
+                  {"ᾢ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾪ", 0},
+            {"Greek_alpha", 1},
+               {"ᾲ", 0},
+            {"Greek_omega", 1},
+               {"ῲ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾋ", 0},
+               {"Greek_eta", 1},
+                  {"ᾓ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾃ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾛ", 0},
+               {"Greek_omega", 1},
+                  {"ᾣ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾫ", 0},
+         {"dead_tilde", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾎ", 0},
+               {"Greek_eta", 1},
+                  {"ᾖ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾆ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾞ", 0},
+               {"Greek_omega", 1},
+                  {"ᾦ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾮ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾏ", 0},
+               {"Greek_eta", 1},
+                  {"ᾗ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾇ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾟ", 0},
+               {"Greek_omega", 1},
+                  {"ᾧ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾯ", 0},
+            {"Greek_eta", 1},
+               {"ῇ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾎ", 0},
+               {"Greek_eta", 1},
+                  {"ᾖ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾆ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾞ", 0},
+               {"Greek_omega", 1},
+                  {"ᾦ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾮ", 0},
+            {"Greek_alpha", 1},
+               {"ᾷ", 0},
+            {"Greek_omega", 1},
+               {"ῷ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾏ", 0},
+               {"Greek_eta", 1},
+                  {"ᾗ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾇ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾟ", 0},
+               {"Greek_omega", 1},
+                  {"ᾧ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾯ", 0},
+         {"parenright", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾈ", 0},
+            {"Greek_eta", 1},
+               {"ᾐ", 0},
+            {"Greek_alpha", 1},
+               {"ᾀ", 0},
+            {"Greek_ETA", 1},
+               {"ᾘ", 0},
+            {"Greek_omega", 1},
+               {"ᾠ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾨ", 0},
+         {"Greek_ALPHA", 1},
+            {"ᾼ", 0},
+         {"dead_dasia", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾉ", 0},
+            {"Greek_eta", 1},
+               {"ᾑ", 0},
+            {"Greek_alpha", 1},
+               {"ᾁ", 0},
+            {"Greek_ETA", 1},
+               {"ᾙ", 0},
+            {"Greek_omega", 1},
+               {"ᾡ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾩ", 0},
+         {"Greek_eta", 1},
+            {"ῃ", 0},
+         {"dead_psili", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾈ", 0},
+            {"Greek_eta", 1},
+               {"ᾐ", 0},
+            {"Greek_alpha", 1},
+               {"ᾀ", 0},
+            {"Greek_ETA", 1},
+               {"ᾘ", 0},
+            {"Greek_omega", 1},
+               {"ᾠ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾨ", 0},
+         {"quotedbl", 1},
+            {"ϊ", 0},
+         {"Greek_alpha", 1},
+            {"ᾳ", 0},
+         {"acute", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+            {"Greek_eta", 1},
+               {"ῄ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"Greek_alpha", 1},
+               {"ᾴ", 0},
+            {"Greek_omega", 1},
+               {"ῴ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+         {"Greek_ETA", 1},
+            {"ῌ", 0},
+         {"apostrophe", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+            {"Greek_eta", 1},
+               {"ῄ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"Greek_alpha", 1},
+               {"ᾴ", 0},
+            {"Greek_omega", 1},
+               {"ῴ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+         {"Greek_omegaaccent", 1},
+            {"ῴ", 0},
+         {"asciitilde", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾎ", 0},
+               {"Greek_eta", 1},
+                  {"ᾖ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾆ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾞ", 0},
+               {"Greek_omega", 1},
+                  {"ᾦ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾮ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾏ", 0},
+               {"Greek_eta", 1},
+                  {"ᾗ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾇ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾟ", 0},
+               {"Greek_omega", 1},
+                  {"ᾧ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾯ", 0},
+            {"Greek_eta", 1},
+               {"ῇ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾎ", 0},
+               {"Greek_eta", 1},
+                  {"ᾖ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾆ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾞ", 0},
+               {"Greek_omega", 1},
+                  {"ᾦ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾮ", 0},
+            {"Greek_alpha", 1},
+               {"ᾷ", 0},
+            {"Greek_omega", 1},
+               {"ῷ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾏ", 0},
+               {"Greek_eta", 1},
+                  {"ᾗ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾇ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾟ", 0},
+               {"Greek_omega", 1},
+                  {"ᾧ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾯ", 0},
+         {"Greek_omega", 1},
+            {"ῳ", 0},
+         {"Greek_OMEGA", 1},
+            {"ῼ", 0},
+         {"dead_acute", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+            {"Greek_eta", 1},
+               {"ῄ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"Greek_alpha", 1},
+               {"ᾴ", 0},
+            {"Greek_omega", 1},
+               {"ῴ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+         {"Greek_alphaaccent", 1},
+            {"ᾴ", 0},
+         {"parenleft", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾉ", 0},
+            {"Greek_eta", 1},
+               {"ᾑ", 0},
+            {"Greek_alpha", 1},
+               {"ᾁ", 0},
+            {"Greek_ETA", 1},
+               {"ᾙ", 0},
+            {"Greek_omega", 1},
+               {"ᾡ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾩ", 0},
+         {"grave", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾊ", 0},
+               {"Greek_eta", 1},
+                  {"ᾒ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾂ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾚ", 0},
+               {"Greek_omega", 1},
+                  {"ᾢ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾪ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾋ", 0},
+               {"Greek_eta", 1},
+                  {"ᾓ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾃ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾛ", 0},
+               {"Greek_omega", 1},
+                  {"ᾣ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾫ", 0},
+            {"Greek_eta", 1},
+               {"ῂ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾊ", 0},
+               {"Greek_eta", 1},
+                  {"ᾒ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾂ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾚ", 0},
+               {"Greek_omega", 1},
+                  {"ᾢ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾪ", 0},
+            {"Greek_alpha", 1},
+               {"ᾲ", 0},
+            {"Greek_omega", 1},
+               {"ῲ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾋ", 0},
+               {"Greek_eta", 1},
+                  {"ᾓ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾃ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾛ", 0},
+               {"Greek_omega", 1},
+                  {"ᾣ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾫ", 0},
+         {"Greek_etaaccent", 1},
+            {"ῄ", 0},
+      {"1", 21},
+         {"1", 2},
+            {"0", 1},
+               {"⅒", 0},
+         {"7", 1},
+            {"⅐", 0},
+         {"8", 1},
+            {"⅛", 0},
+         {"3", 1},
+            {"⅓", 0},
+         {"2", 1},
+            {"½", 0},
+         {"6", 1},
+            {"⅙", 0},
+         {"4", 1},
+            {"¼", 0},
+         {"5", 1},
+            {"⅕", 0},
+         {"9", 1},
+            {"⅑", 0},
+         {"asciicircum", 1},
+            {"¹", 0},
+      {"Greek_OMICRON", 2},
+         {"apostrophe", 1},
+            {"Ό", 0},
+      {"C", 26},
+         {"period", 1},
+            {"Ċ", 0},
+         {"C", 3},
+            {"C", 2},
+               {"P", 1},
+                  {"☭", 0},
+         {"less", 1},
+            {"Č", 0},
+         {"o", 1},
+            {"©", 0},
+         {"equal", 1},
+            {"€", 0},
+         {"E", 1},
+            {"₠", 0},
+         {"apostrophe", 1},
+            {"Ć", 0},
+         {"O", 1},
+            {"©", 0},
+         {"r", 1},
+            {"₢", 0},
+         {"bar", 1},
+            {"¢", 0},
+         {"comma", 1},
+            {"Ç", 0},
+         {"slash", 1},
+            {"₡", 0},
+      {"exclam", 108},
+         {"W", 1},
+            {"Ẉ", 0},
+         {"a", 1},
+            {"ạ", 0},
+         {"dead_horn", 8},
+            {"o", 1},
+               {"ợ", 0},
+            {"u", 1},
+               {"ự", 0},
+            {"O", 1},
+               {"Ợ", 0},
+            {"U", 1},
+               {"Ự", 0},
+         {"exclam", 1},
+            {"¡", 0},
+         {"e", 1},
+            {"ẹ", 0},
+         {"o", 1},
+            {"ọ", 0},
+         {"l", 1},
+            {"ḷ", 0},
+         {"t", 1},
+            {"ṭ", 0},
+         {"uhorn", 1},
+            {"ự", 0},
+         {"y", 1},
+            {"ỵ", 0},
+         {"b", 1},
+            {"ḅ", 0},
+         {"i", 1},
+            {"ị", 0},
+         {"k", 1},
+            {"ḳ", 0},
+         {"n", 1},
+            {"ṇ", 0},
+         {"Ohorn", 1},
+            {"Ợ", 0},
+         {"ohorn", 1},
+            {"ợ", 0},
+         {"V", 1},
+            {"Ṿ", 0},
+         {"u", 1},
+            {"ụ", 0},
+         {"z", 1},
+            {"ẓ", 0},
+         {"H", 1},
+            {"Ḥ", 0},
+         {"E", 1},
+            {"Ẹ", 0},
+         {"S", 1},
+            {"Ṣ", 0},
+         {"Y", 1},
+            {"Ỵ", 0},
+         {"d", 1},
+            {"ḍ", 0},
+         {"D", 1},
+            {"Ḍ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ợ", 0},
+            {"u", 1},
+               {"ự", 0},
+            {"O", 1},
+               {"Ợ", 0},
+            {"U", 1},
+               {"Ự", 0},
+         {"w", 1},
+            {"ẉ", 0},
+         {"v", 1},
+            {"ṿ", 0},
+         {"question", 1},
+            {"‽", 0},
+         {"M", 1},
+            {"Ṃ", 0},
+         {"O", 1},
+            {"Ọ", 0},
+         {"m", 1},
+            {"ṃ", 0},
+         {"r", 1},
+            {"ṛ", 0},
+         {"s", 1},
+            {"ṣ", 0},
+         {"Z", 1},
+            {"Ẓ", 0},
+         {"A", 1},
+            {"Ạ", 0},
+         {"R", 1},
+            {"Ṛ", 0},
+         {"L", 1},
+            {"Ḷ", 0},
+         {"T", 1},
+            {"Ṭ", 0},
+         {"K", 1},
+            {"Ḳ", 0},
+         {"B", 1},
+            {"Ḅ", 0},
+         {"Uhorn", 1},
+            {"Ự", 0},
+         {"h", 1},
+            {"ḥ", 0},
+         {"I", 1},
+            {"Ị", 0},
+         {"N", 1},
+            {"Ṇ", 0},
+         {"U", 1},
+            {"Ụ", 0},
+         {"asciicircum", 1},
+            {"¦", 0},
+      {"less", 56},
+         {"minus", 1},
+            {"←", 0},
+         {"C", 1},
+            {"Č", 0},
+         {"less", 1},
+            {"«", 0},
+         {"e", 1},
+            {"ě", 0},
+         {"l", 1},
+            {"ľ", 0},
+         {"t", 1},
+            {"ť", 0},
+         {"space", 1},
+            {"ˇ", 0},
+         {"n", 1},
+            {"ň", 0},
+         {"equal", 1},
+            {"≤", 0},
+         {"z", 1},
+            {"ž", 0},
+         {"3", 1},
+            {"♥", 0},
+         {"E", 1},
+            {"Ě", 0},
+         {"S", 1},
+            {"Š", 0},
+         {"d", 1},
+            {"ď", 0},
+         {"D", 1},
+            {"Ď", 0},
+         {"quotedbl", 1},
+            {"“", 0},
+         {"underscore", 1},
+            {"≤", 0},
+         {"apostrophe", 1},
+            {"‘", 0},
+         {"r", 1},
+            {"ř", 0},
+         {"s", 1},
+            {"š", 0},
+         {"Z", 1},
+            {"Ž", 0},
+         {"R", 1},
+            {"Ř", 0},
+         {"c", 1},
+            {"č", 0},
+         {"L", 1},
+            {"Ľ", 0},
+         {"T", 1},
+            {"Ť", 0},
+         {"slash", 1},
+            {"\\", 0},
+         {"greater", 1},
+            {"⋄", 0},
+         {"N", 1},
+            {"Ň", 0},
+      {"KP_Divide", 46},
+         {"g", 1},
+            {"ǥ", 0},
+         {"o", 1},
+            {"ø", 0},
+         {"l", 1},
+            {"ł", 0},
+         {"t", 1},
+            {"ŧ", 0},
+         {"b", 1},
+            {"ƀ", 0},
+         {"i", 1},
+            {"ɨ", 0},
+         {"Cyrillic_GHE", 1},
+            {"Ғ", 0},
+         {"leftarrow", 1},
+            {"↚", 0},
+         {"Cyrillic_KA", 1},
+            {"Ҟ", 0},
+         {"rightarrow", 1},
+            {"↛", 0},
+         {"z", 1},
+            {"ƶ", 0},
+         {"G", 1},
+            {"Ǥ", 0},
+         {"H", 1},
+            {"Ħ", 0},
+         {"d", 1},
+            {"đ", 0},
+         {"Cyrillic_ka", 1},
+            {"ҟ", 0},
+         {"D", 1},
+            {"Đ", 0},
+         {"O", 1},
+            {"Ø", 0},
+         {"Z", 1},
+            {"Ƶ", 0},
+         {"L", 1},
+            {"Ł", 0},
+         {"T", 1},
+            {"Ŧ", 0},
+         {"Cyrillic_ghe", 1},
+            {"ғ", 0},
+         {"h", 1},
+            {"ħ", 0},
+         {"I", 1},
+            {"Ɨ", 0},
+      {"F", 8},
+         {"period", 1},
+            {"Ḟ", 0},
+         {"l", 1},
+            {"ffl", 0},
+         {"i", 1},
+            {"ffi", 0},
+         {"r", 1},
+            {"₣", 0},
+      {"e", 28},
+         {"minus", 1},
+            {"ē", 0},
+         {"period", 1},
+            {"ė", 0},
+         {"less", 1},
+            {"ě", 0},
+         {"e", 1},
+            {"ə", 0},
+         {"diaeresis", 1},
+            {"ë", 0},
+         {"equal", 1},
+            {"€", 0},
+         {"quotedbl", 1},
+            {"ë", 0},
+         {"acute", 1},
+            {"é", 0},
+         {"underscore", 1},
+            {"ē", 0},
+         {"apostrophe", 1},
+            {"é", 0},
+         {"comma", 1},
+            {"ę", 0},
+         {"greater", 1},
+            {"ê", 0},
+         {"grave", 1},
+            {"è", 0},
+         {"asciicircum", 1},
+            {"ê", 0},
+      {"o", 52},
+         {"minus", 1},
+            {"ō", 0},
+         {"a", 1},
+            {"å", 0},
+         {"C", 1},
+            {"©", 0},
+         {"e", 1},
+            {"œ", 0},
+         {"o", 1},
+            {"°", 0},
+         {"diaeresis", 1},
+            {"ö", 0},
+         {"y", 1},
+            {"ẙ", 0},
+         {"x", 1},
+            {"¤", 0},
+         {"u", 1},
+            {"ů", 0},
+         {"quotedbl", 1},
+            {"ö", 0},
+         {"acute", 1},
+            {"ó", 0},
+         {"w", 1},
+            {"ẘ", 0},
+         {"underscore", 1},
+            {"ō", 0},
+         {"apostrophe", 1},
+            {"ó", 0},
+         {"r", 1},
+            {"®", 0},
+         {"s", 1},
+            {"§", 0},
+         {"A", 1},
+            {"Å", 0},
+         {"R", 1},
+            {"®", 0},
+         {"c", 1},
+            {"©", 0},
+         {"asciitilde", 1},
+            {"õ", 0},
+         {"slash", 1},
+            {"ø", 0},
+         {"greater", 1},
+            {"ô", 0},
+         {"X", 1},
+            {"¤", 0},
+         {"grave", 1},
+            {"ò", 0},
+         {"U", 1},
+            {"Ů", 0},
+         {"asciicircum", 1},
+            {"ô", 0},
+      {"l", 12},
+         {"minus", 1},
+            {"£", 0},
+         {"less", 1},
+            {"ľ", 0},
+         {"v", 1},
+            {"|", 0},
+         {"apostrophe", 1},
+            {"ĺ", 0},
+         {"comma", 1},
+            {"ļ", 0},
+         {"slash", 1},
+            {"ł", 0},
+      {"Greek_upsilon", 4},
+         {"quotedbl", 1},
+            {"ϋ", 0},
+         {"apostrophe", 1},
+            {"ύ", 0},
+      {"t", 16},
+         {"minus", 1},
+            {"ŧ", 0},
+         {"period", 1},
+            {"ṫ", 0},
+         {"less", 1},
+            {"ť", 0},
+         {"M", 1},
+            {"™", 0},
+         {"m", 1},
+            {"™", 0},
+         {"comma", 1},
+            {"ţ", 0},
+         {"slash", 1},
+            {"ŧ", 0},
+         {"h", 1},
+            {"þ", 0},
+      {"diaeresis", 42},
+         {"a", 1},
+            {"ä", 0},
+         {"dead_grave", 1},
+            {"῭", 0},
+         {"e", 1},
+            {"ë", 0},
+         {"o", 1},
+            {"ö", 0},
+         {"y", 1},
+            {"ÿ", 0},
+         {"i", 1},
+            {"ï", 0},
+         {"dead_tilde", 1},
+            {"῁", 0},
+         {"u", 1},
+            {"ü", 0},
+         {"E", 1},
+            {"Ë", 0},
+         {"Y", 1},
+            {"Ÿ", 0},
+         {"acute", 1},
+            {"΅", 0},
+         {"apostrophe", 1},
+            {"΅", 0},
+         {"O", 1},
+            {"Ö", 0},
+         {"asterisk", 1},
+            {"⍣", 0},
+         {"A", 1},
+            {"Ä", 0},
+         {"asciitilde", 1},
+            {"῁", 0},
+         {"greater", 1},
+            {"⍩", 0},
+         {"dead_acute", 1},
+            {"΅", 0},
+         {"I", 1},
+            {"Ï", 0},
+         {"grave", 1},
+            {"῭", 0},
+         {"U", 1},
+            {"Ü", 0},
+      {"space", 22},
+         {"minus", 1},
+            {"~", 0},
+         {"period", 1},
+            {" ", 0},
+         {"less", 1},
+            {"ˇ", 0},
+         {"space", 1},
+            {" ", 0},
+         {"apostrophe", 1},
+            {"'", 0},
+         {"comma", 1},
+            {"¸", 0},
+         {"asciitilde", 1},
+            {"~", 0},
+         {"greater", 1},
+            {"^", 0},
+         {"parenleft", 1},
+            {"˘", 0},
+         {"grave", 1},
+            {"`", 0},
+         {"asciicircum", 1},
+            {"^", 0},
+      {"percent", 2},
+         {"o", 1},
+            {"‰", 0},
+      {"y", 14},
+         {"minus", 1},
+            {"¥", 0},
+         {"diaeresis", 1},
+            {"ÿ", 0},
+         {"equal", 1},
+            {"¥", 0},
+         {"quotedbl", 1},
+            {"ÿ", 0},
+         {"acute", 1},
+            {"ý", 0},
+         {"apostrophe", 1},
+            {"ý", 0},
+         {"asciicircum", 1},
+            {"ŷ", 0},
+      {"b", 83},
+         {"period", 1},
+            {"ḃ", 0},
+         {"g", 1},
+            {"ğ", 0},
+         {"a", 1},
+            {"ă", 0},
+         {"Greek_IOTA", 1},
+            {"Ῐ", 0},
+         {"Greek_iota", 1},
+            {"ῐ", 0},
+         {"exclam", 4},
+            {"a", 1},
+               {"ặ", 0},
+            {"A", 1},
+               {"Ặ", 0},
+         {"e", 1},
+            {"ĕ", 0},
+         {"o", 1},
+            {"ŏ", 0},
+         {"Greek_upsilon", 1},
+            {"ῠ", 0},
+         {"dead_belowdot", 4},
+            {"a", 1},
+               {"ặ", 0},
+            {"A", 1},
+               {"Ặ", 0},
+         {"Cyrillic_I", 1},
+            {"Й", 0},
+         {"i", 1},
+            {"ĭ", 0},
+         {"Cyrillic_a", 1},
+            {"ӑ", 0},
+         {"Cyrillic_U", 1},
+            {"Ў", 0},
+         {"u", 1},
+            {"ŭ", 0},
+         {"G", 1},
+            {"Ğ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ᾰ", 0},
+         {"Cyrillic_ie", 1},
+            {"ӗ", 0},
+         {"E", 1},
+            {"Ĕ", 0},
+         {"Cyrillic_i", 1},
+            {"й", 0},
+         {"Cyrillic_zhe", 1},
+            {"ӂ", 0},
+         {"cedilla", 4},
+            {"e", 1},
+               {"ḝ", 0},
+            {"E", 1},
+               {"Ḝ", 0},
+         {"Greek_alpha", 1},
+            {"ᾰ", 0},
+         {"O", 1},
+            {"Ŏ", 0},
+         {"A", 1},
+            {"Ă", 0},
+         {"Cyrillic_A", 1},
+            {"Ӑ", 0},
+         {"comma", 4},
+            {"e", 1},
+               {"ḝ", 0},
+            {"E", 1},
+               {"Ḝ", 0},
+         {"Cyrillic_ZHE", 1},
+            {"Ӂ", 0},
+         {"Cyrillic_IE", 1},
+            {"Ӗ", 0},
+         {"dead_cedilla", 4},
+            {"e", 1},
+               {"ḝ", 0},
+            {"E", 1},
+               {"Ḝ", 0},
+         {"I", 1},
+            {"Ĭ", 0},
+         {"U", 1},
+            {"Ŭ", 0},
+         {"Cyrillic_u", 1},
+            {"ў", 0},
+         {"Greek_UPSILON", 1},
+            {"Ῠ", 0},
+      {"i", 28},
+         {"minus", 1},
+            {"ī", 0},
+         {"period", 1},
+            {"ı", 0},
+         {"diaeresis", 1},
+            {"ï", 0},
+         {"j", 1},
+            {"ij", 0},
+         {"quotedbl", 1},
+            {"ï", 0},
+         {"acute", 1},
+            {"í", 0},
+         {"underscore", 1},
+            {"ī", 0},
+         {"apostrophe", 1},
+            {"í", 0},
+         {"comma", 1},
+            {"į", 0},
+         {"asciitilde", 1},
+            {"ĩ", 0},
+         {"greater", 1},
+            {"î", 0},
+         {"semicolon", 1},
+            {"į", 0},
+         {"grave", 1},
+            {"ì", 0},
+         {"asciicircum", 1},
+            {"î", 0},
+      {"k", 4},
+         {"k", 1},
+            {"ĸ", 0},
+         {"comma", 1},
+            {"ķ", 0},
+      {"n", 10},
+         {"g", 1},
+            {"ŋ", 0},
+         {"less", 1},
+            {"ň", 0},
+         {"apostrophe", 1},
+            {"ń", 0},
+         {"comma", 1},
+            {"ņ", 0},
+         {"asciitilde", 1},
+            {"ñ", 0},
+      {"equal", 40},
+         {"W", 1},
+            {"₩", 0},
+         {"C", 1},
+            {"€", 0},
+         {"e", 1},
+            {"€", 0},
+         {"o", 1},
+            {"ő", 0},
+         {"y", 1},
+            {"¥", 0},
+         {"Cyrillic_U", 1},
+            {"Ӳ", 0},
+         {"u", 1},
+            {"ű", 0},
+         {"E", 1},
+            {"€", 0},
+         {"Y", 1},
+            {"¥", 0},
+         {"d", 1},
+            {"₫", 0},
+         {"underscore", 1},
+            {"≡", 0},
+         {"O", 1},
+            {"Ő", 0},
+         {"Cyrillic_ES", 1},
+            {"€", 0},
+         {"c", 1},
+            {"€", 0},
+         {"L", 1},
+            {"₤", 0},
+         {"slash", 1},
+            {"≠", 0},
+         {"Cyrillic_IE", 1},
+            {"€", 0},
+         {"N", 1},
+            {"₦", 0},
+         {"U", 1},
+            {"Ű", 0},
+         {"Cyrillic_u", 1},
+            {"ӳ", 0},
+      {"7", 2},
+         {"8", 1},
+            {"⅞", 0},
+      {"parenright", 32},
+         {"minus", 1},
+            {"}", 0},
+         {"Greek_IOTA", 1},
+            {"Ἰ", 0},
+         {"Greek_iota", 1},
+            {"ἰ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ὀ", 0},
+         {"Greek_upsilon", 1},
+            {"ὐ", 0},
+         {"parenright", 1},
+            {"]", 0},
+         {"Greek_epsilon", 1},
+            {"ἐ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἀ", 0},
+         {"Greek_omicron", 1},
+            {"ὀ", 0},
+         {"Greek_eta", 1},
+            {"ἠ", 0},
+         {"Greek_rho", 1},
+            {"ῤ", 0},
+         {"Greek_alpha", 1},
+            {"ἀ", 0},
+         {"Greek_ETA", 1},
+            {"Ἠ", 0},
+         {"Greek_EPSILON", 1},
+            {"Ἐ", 0},
+         {"Greek_omega", 1},
+            {"ὠ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὠ", 0},
+      {"x", 6},
+         {"o", 1},
+            {"¤", 0},
+         {"x", 1},
+            {"×", 0},
+         {"O", 1},
+            {"¤", 0},
+      {"Greek_epsilon", 2},
+         {"apostrophe", 1},
+            {"έ", 0},
+      {"braceleft", 2},
+         {"braceright", 1},
+            {"∅", 0},
+      {"underbar", 54},
+         {"1", 1},
+            {"₁", 0},
+         {"KP_4", 1},
+            {"₄", 0},
+         {"KP_6", 1},
+            {"₆", 0},
+         {"KP_8", 1},
+            {"₈", 0},
+         {"KP_9", 1},
+            {"₉", 0},
+         {"equal", 1},
+            {"₌", 0},
+         {"KP_Space", 1},
+            {"₂", 0},
+         {"7", 1},
+            {"₇", 0},
+         {"parenright", 1},
+            {"₎", 0},
+         {"KP_7", 1},
+            {"₇", 0},
+         {"8", 1},
+            {"₈", 0},
+         {"KP_1", 1},
+            {"₁", 0},
+         {"3", 1},
+            {"₃", 0},
+         {"2", 1},
+            {"₂", 0},
+         {"plus", 1},
+            {"₊", 0},
+         {"6", 1},
+            {"₆", 0},
+         {"4", 1},
+            {"₄", 0},
+         {"KP_3", 1},
+            {"₃", 0},
+         {"KP_0", 1},
+            {"₀", 0},
+         {"KP_Add", 1},
+            {"₊", 0},
+         {"KP_2", 1},
+            {"₂", 0},
+         {"5", 1},
+            {"₅", 0},
+         {"KP_5", 1},
+            {"₅", 0},
+         {"9", 1},
+            {"₉", 0},
+         {"0", 1},
+            {"₀", 0},
+         {"parenleft", 1},
+            {"₍", 0},
+         {"KP_Equal", 1},
+            {"₌", 0},
+      {"V", 2},
+         {"L", 1},
+            {"|", 0},
+      {"u", 28},
+         {"minus", 1},
+            {"ū", 0},
+         {"diaeresis", 1},
+            {"ü", 0},
+         {"u", 1},
+            {"ŭ", 0},
+         {"quotedbl", 1},
+            {"ü", 0},
+         {"acute", 1},
+            {"ú", 0},
+         {"underscore", 1},
+            {"ū", 0},
+         {"apostrophe", 1},
+            {"ú", 0},
+         {"asterisk", 1},
+            {"ů", 0},
+         {"comma", 1},
+            {"ų", 0},
+         {"asciitilde", 1},
+            {"ũ", 0},
+         {"slash", 1},
+            {"µ", 0},
+         {"greater", 1},
+            {"û", 0},
+         {"grave", 1},
+            {"ù", 0},
+         {"asciicircum", 1},
+            {"û", 0},
+      {"breve", 4},
+         {"g", 1},
+            {"ğ", 0},
+         {"G", 1},
+            {"Ğ", 0},
+      {"z", 6},
+         {"period", 1},
+            {"ż", 0},
+         {"less", 1},
+            {"ž", 0},
+         {"apostrophe", 1},
+            {"ź", 0},
+      {"G", 10},
+         {"period", 1},
+            {"Ġ", 0},
+         {"breve", 1},
+            {"Ğ", 0},
+         {"comma", 1},
+            {"Ģ", 0},
+         {"parenleft", 1},
+            {"Ğ", 0},
+         {"U", 1},
+            {"Ğ", 0},
+      {"Greek_ALPHA", 2},
+         {"apostrophe", 1},
+            {"Ά", 0},
+      {"bracketleft", 2},
+         {"bracketright", 1},
+            {"⌷", 0},
+      {"H", 2},
+         {"comma", 1},
+            {"Ḩ", 0},
+      {"8", 2},
+         {"8", 1},
+            {"∞", 0},
+      {"3", 8},
+         {"8", 1},
+            {"⅜", 0},
+         {"4", 1},
+            {"¾", 0},
+         {"5", 1},
+            {"⅗", 0},
+         {"asciicircum", 1},
+            {"³", 0},
+      {"E", 26},
+         {"minus", 1},
+            {"Ē", 0},
+         {"period", 1},
+            {"Ė", 0},
+         {"less", 1},
+            {"Ě", 0},
+         {"diaeresis", 1},
+            {"Ë", 0},
+         {"equal", 1},
+            {"€", 0},
+         {"quotedbl", 1},
+            {"Ë", 0},
+         {"acute", 1},
+            {"É", 0},
+         {"underscore", 1},
+            {"Ē", 0},
+         {"apostrophe", 1},
+            {"É", 0},
+         {"comma", 1},
+            {"Ę", 0},
+         {"greater", 1},
+            {"Ê", 0},
+         {"grave", 1},
+            {"È", 0},
+         {"asciicircum", 1},
+            {"Ê", 0},
+      {"S", 18},
+         {"period", 1},
+            {"Ṡ", 0},
+         {"exclam", 1},
+            {"§", 0},
+         {"less", 1},
+            {"Š", 0},
+         {"S", 1},
+            {"ẞ", 0},
+         {"apostrophe", 1},
+            {"Ś", 0},
+         {"M", 1},
+            {"℠", 0},
+         {"O", 1},
+            {"§", 0},
+         {"m", 1},
+            {"℠", 0},
+         {"comma", 1},
+            {"Ş", 0},
+      {"2", 6},
+         {"3", 1},
+            {"⅔", 0},
+         {"5", 1},
+            {"⅖", 0},
+         {"asciicircum", 1},
+            {"²", 0},
+      {"Y", 14},
+         {"minus", 1},
+            {"¥", 0},
+         {"diaeresis", 1},
+            {"Ÿ", 0},
+         {"equal", 1},
+            {"¥", 0},
+         {"quotedbl", 1},
+            {"Ÿ", 0},
+         {"acute", 1},
+            {"Ý", 0},
+         {"apostrophe", 1},
+            {"Ý", 0},
+         {"asciicircum", 1},
+            {"Ŷ", 0},
+      {"f", 12},
+         {"period", 1},
+            {"ḟ", 0},
+         {"l", 1},
+            {"fl", 0},
+         {"i", 1},
+            {"fi", 0},
+         {"S", 1},
+            {"ſ", 0},
+         {"f", 1},
+            {"ff", 0},
+         {"s", 1},
+            {"ſ", 0},
+      {"Greek_omicron", 2},
+         {"apostrophe", 1},
+            {"ό", 0},
+      {"Greek_eta", 2},
+         {"apostrophe", 1},
+            {"ή", 0},
+      {"d", 14},
+         {"minus", 1},
+            {"đ", 0},
+         {"period", 1},
+            {"ḋ", 0},
+         {"less", 1},
+            {"ď", 0},
+         {"i", 1},
+            {"⌀", 0},
+         {"equal", 1},
+            {"₫", 0},
+         {"comma", 1},
+            {"ḑ", 0},
+         {"h", 1},
+            {"ð", 0},
+      {"D", 10},
+         {"minus", 1},
+            {"Đ", 0},
+         {"period", 1},
+            {"Ḋ", 0},
+         {"less", 1},
+            {"Ď", 0},
+         {"H", 1},
+            {"Ð", 0},
+         {"comma", 1},
+            {"Ḑ", 0},
+      {"quotedbl", 137},
+         {"W", 1},
+            {"Ẅ", 0},
+         {"a", 1},
+            {"ä", 0},
+         {"Greek_IOTA", 1},
+            {"Ϊ", 0},
+         {"Greek_iota", 1},
+            {"ϊ", 0},
+         {"less", 1},
+            {"“", 0},
+         {"Umacron", 1},
+            {"Ṻ", 0},
+         {"Cyrillic_ZE", 1},
+            {"Ӟ", 0},
+         {"e", 1},
+            {"ë", 0},
+         {"o", 1},
+            {"ö", 0},
+         {"Cyrillic_ze", 1},
+            {"ӟ", 0},
+         {"t", 1},
+            {"ẗ", 0},
+         {"Greek_upsilon", 1},
+            {"ϋ", 0},
+         {"dead_macron", 4},
+            {"u", 1},
+               {"ṻ", 0},
+            {"U", 1},
+               {"Ṻ", 0},
+         {"Cyrillic_I", 1},
+            {"Ӥ", 0},
+         {"y", 1},
+            {"ÿ", 0},
+         {"Cyrillic_O", 1},
+            {"Ӧ", 0},
+         {"i", 1},
+            {"ï", 0},
+         {"Ukrainian_I", 1},
+            {"Ї", 0},
+         {"dead_tilde", 4},
+            {"o", 1},
+               {"ṏ", 0},
+            {"O", 1},
+               {"Ṏ", 0},
+         {"Cyrillic_che", 1},
+            {"ӵ", 0},
+         {"Cyrillic_a", 1},
+            {"ӓ", 0},
+         {"x", 1},
+            {"ẍ", 0},
+         {"Cyrillic_U", 1},
+            {"Ӱ", 0},
+         {"u", 1},
+            {"ü", 0},
+         {"otilde", 1},
+            {"ṏ", 0},
+         {"H", 1},
+            {"Ḧ", 0},
+         {"Cyrillic_YERU", 1},
+            {"Ӹ", 0},
+         {"Cyrillic_ie", 1},
+            {"ё", 0},
+         {"E", 1},
+            {"Ë", 0},
+         {"Y", 1},
+            {"Ÿ", 0},
+         {"Cyrillic_i", 1},
+            {"ӥ", 0},
+         {"Otilde", 1},
+            {"Ṏ", 0},
+         {"Cyrillic_zhe", 1},
+            {"ӝ", 0},
+         {"quotedbl", 1},
+            {"¨", 0},
+         {"umacron", 1},
+            {"ṻ", 0},
+         {"Cyrillic_yeru", 1},
+            {"ӹ", 0},
+         {"acute", 1},
+            {"̈́", 0},
+         {"w", 1},
+            {"ẅ", 0},
+         {"Cyrillic_CHE", 1},
+            {"Ӵ", 0},
+         {"Cyrillic_o", 1},
+            {"ӧ", 0},
+         {"Ukrainian_i", 1},
+            {"ї", 0},
+         {"Cyrillic_E", 1},
+            {"Ӭ", 0},
+         {"underscore", 4},
+            {"u", 1},
+               {"ṻ", 0},
+            {"U", 1},
+               {"Ṻ", 0},
+         {"apostrophe", 1},
+            {"̈́", 0},
+         {"O", 1},
+            {"Ö", 0},
+         {"macron", 4},
+            {"u", 1},
+               {"ṻ", 0},
+            {"U", 1},
+               {"Ṻ", 0},
+         {"A", 1},
+            {"Ä", 0},
+         {"Cyrillic_A", 1},
+            {"Ӓ", 0},
+         {"comma", 1},
+            {"„", 0},
+         {"asciitilde", 4},
+            {"o", 1},
+               {"ṏ", 0},
+            {"O", 1},
+               {"Ṏ", 0},
+         {"greater", 1},
+            {"”", 0},
+         {"Cyrillic_ZHE", 1},
+            {"Ӝ", 0},
+         {"Cyrillic_IE", 1},
+            {"Ё", 0},
+         {"Cyrillic_e", 1},
+            {"ӭ", 0},
+         {"dead_acute", 1},
+            {"̈́", 0},
+         {"X", 1},
+            {"Ẍ", 0},
+         {"h", 1},
+            {"ḧ", 0},
+         {"I", 1},
+            {"Ï", 0},
+         {"U", 1},
+            {"Ü", 0},
+         {"Cyrillic_u", 1},
+            {"ӱ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ϋ", 0},
+      {"plus", 12},
+         {"minus", 1},
+            {"±", 0},
+         {"o", 1},
+            {"ơ", 0},
+         {"u", 1},
+            {"ư", 0},
+         {"plus", 1},
+            {"#", 0},
+         {"O", 1},
+            {"Ơ", 0},
+         {"U", 1},
+            {"Ư", 0},
+      {"cedilla", 44},
+         {"g", 1},
+            {"ģ", 0},
+         {"C", 1},
+            {"Ç", 0},
+         {"e", 1},
+            {"ȩ", 0},
+         {"l", 1},
+            {"ļ", 0},
+         {"t", 1},
+            {"ţ", 0},
+         {"k", 1},
+            {"ķ", 0},
+         {"n", 1},
+            {"ņ", 0},
+         {"G", 1},
+            {"Ģ", 0},
+         {"H", 1},
+            {"Ḩ", 0},
+         {"E", 1},
+            {"Ȩ", 0},
+         {"S", 1},
+            {"Ş", 0},
+         {"d", 1},
+            {"ḑ", 0},
+         {"D", 1},
+            {"Ḑ", 0},
+         {"r", 1},
+            {"ŗ", 0},
+         {"s", 1},
+            {"ş", 0},
+         {"R", 1},
+            {"Ŗ", 0},
+         {"c", 1},
+            {"ç", 0},
+         {"L", 1},
+            {"Ļ", 0},
+         {"T", 1},
+            {"Ţ", 0},
+         {"K", 1},
+            {"Ķ", 0},
+         {"h", 1},
+            {"ḩ", 0},
+         {"N", 1},
+            {"Ņ", 0},
+      {"Greek_alpha", 2},
+         {"apostrophe", 1},
+            {"ά", 0},
+      {"dead_abovedot", 3},
+         {"f", 2},
+            {"s", 1},
+               {"ẛ", 0},
+      {"acute", 463},
+         {"W", 1},
+            {"Ẃ", 0},
+         {"dead_breve", 4},
+            {"a", 1},
+               {"ắ", 0},
+            {"A", 1},
+               {"Ắ", 0},
+         {"g", 1},
+            {"ǵ", 0},
+         {"a", 1},
+            {"á", 0},
+         {"Greek_IOTA", 1},
+            {"Ί", 0},
+         {"Greek_iota", 1},
+            {"ί", 0},
+         {"dead_horn", 8},
+            {"o", 1},
+               {"ớ", 0},
+            {"u", 1},
+               {"ứ", 0},
+            {"O", 1},
+               {"Ớ", 0},
+            {"U", 1},
+               {"Ứ", 0},
+         {"dead_circumflex", 12},
+            {"a", 1},
+               {"ấ", 0},
+            {"e", 1},
+               {"ế", 0},
+            {"o", 1},
+               {"ố", 0},
+            {"E", 1},
+               {"Ế", 0},
+            {"O", 1},
+               {"Ố", 0},
+            {"A", 1},
+               {"Ấ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ό", 0},
+         {"Acircumflex", 1},
+            {"Ấ", 0},
+         {"C", 1},
+            {"Ć", 0},
+         {"Cyrillic_er", 1},
+            {"р́", 0},
+         {"e", 1},
+            {"é", 0},
+         {"KP_Divide", 4},
+            {"o", 1},
+               {"ǿ", 0},
+            {"O", 1},
+               {"Ǿ", 0},
+         {"Utilde", 1},
+            {"Ṹ", 0},
+         {"o", 1},
+            {"ó", 0},
+         {"l", 1},
+            {"ĺ", 0},
+         {"Udiaeresis", 1},
+            {"Ǘ", 0},
+         {"Greek_upsilon", 1},
+            {"ύ", 0},
+         {"uhorn", 1},
+            {"ứ", 0},
+         {"dead_macron", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"acircumflex", 1},
+            {"ấ", 0},
+         {"Ecircumflex", 1},
+            {"Ế", 0},
+         {"Cyrillic_I", 1},
+            {"И́", 0},
+         {"y", 1},
+            {"ý", 0},
+         {"b", 4},
+            {"a", 1},
+               {"ắ", 0},
+            {"A", 1},
+               {"Ắ", 0},
+         {"idiaeresis", 1},
+            {"ḯ", 0},
+         {"Cyrillic_O", 1},
+            {"О́", 0},
+         {"i", 1},
+            {"í", 0},
+         {"k", 1},
+            {"ḱ", 0},
+         {"n", 1},
+            {"ń", 0},
+         {"ccedilla", 1},
+            {"ḉ", 0},
+         {"Cyrillic_GHE", 1},
+            {"Ѓ", 0},
+         {"dead_tilde", 8},
+            {"o", 1},
+               {"ṍ", 0},
+            {"u", 1},
+               {"ṹ", 0},
+            {"O", 1},
+               {"Ṍ", 0},
+            {"U", 1},
+               {"Ṹ", 0},
+         {"Cyrillic_a", 1},
+            {"а́", 0},
+         {"parenright", 26},
+            {"Greek_IOTA", 1},
+               {"Ἴ", 0},
+            {"Greek_iota", 1},
+               {"ἴ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὄ", 0},
+            {"Greek_upsilon", 1},
+               {"ὔ", 0},
+            {"Greek_epsilon", 1},
+               {"ἔ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἄ", 0},
+            {"Greek_omicron", 1},
+               {"ὄ", 0},
+            {"Greek_eta", 1},
+               {"ἤ", 0},
+            {"Greek_alpha", 1},
+               {"ἄ", 0},
+            {"Greek_ETA", 1},
+               {"Ἤ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἔ", 0},
+            {"Greek_omega", 1},
+               {"ὤ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὤ", 0},
+         {"Ohorn", 1},
+            {"Ớ", 0},
+         {"ohorn", 1},
+            {"ớ", 0},
+         {"Cyrillic_ER", 1},
+            {"Р́", 0},
+         {"Greek_epsilon", 1},
+            {"έ", 0},
+         {"Cyrillic_KA", 1},
+            {"Ќ", 0},
+         {"Cyrillic_U", 1},
+            {"У́", 0},
+         {"dead_abovering", 4},
+            {"a", 1},
+               {"ǻ", 0},
+            {"A", 1},
+               {"Ǻ", 0},
+         {"Ocircumflex", 1},
+            {"Ố", 0},
+         {"AE", 1},
+            {"Ǽ", 0},
+         {"omacron", 1},
+            {"ṓ", 0},
+         {"ocircumflex", 1},
+            {"ố", 0},
+         {"u", 1},
+            {"ú", 0},
+         {"z", 1},
+            {"ź", 0},
+         {"G", 1},
+            {"Ǵ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ά", 0},
+         {"otilde", 1},
+            {"ṍ", 0},
+         {"utilde", 1},
+            {"ṹ", 0},
+         {"Cyrillic_ie", 1},
+            {"е́", 0},
+         {"emacron", 1},
+            {"ḗ", 0},
+         {"E", 1},
+            {"É", 0},
+         {"S", 1},
+            {"Ś", 0},
+         {"Greek_iotadieresis", 1},
+            {"ΐ", 0},
+         {"Y", 1},
+            {"Ý", 0},
+         {"Cyrillic_i", 1},
+            {"и́", 0},
+         {"dead_dasia", 28},
+            {"Greek_IOTA", 1},
+               {"Ἵ", 0},
+            {"Greek_iota", 1},
+               {"ἵ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὅ", 0},
+            {"Greek_upsilon", 1},
+               {"ὕ", 0},
+            {"Greek_epsilon", 1},
+               {"ἕ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἅ", 0},
+            {"Greek_omicron", 1},
+               {"ὅ", 0},
+            {"Greek_eta", 1},
+               {"ἥ", 0},
+            {"Greek_alpha", 1},
+               {"ἅ", 0},
+            {"Greek_ETA", 1},
+               {"Ἥ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἕ", 0},
+            {"Greek_omega", 1},
+               {"ὥ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὥ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὕ", 0},
+         {"Greek_upsilondieresis", 1},
+            {"ΰ", 0},
+         {"Greek_omicron", 1},
+            {"ό", 0},
+         {"Greek_eta", 1},
+            {"ή", 0},
+         {"Otilde", 1},
+            {"Ṍ", 0},
+         {"Cyrillic_ka", 1},
+            {"ќ", 0},
+         {"Aring", 1},
+            {"Ǻ", 0},
+         {"Abreve", 1},
+            {"Ắ", 0},
+         {"dead_psili", 26},
+            {"Greek_IOTA", 1},
+               {"Ἴ", 0},
+            {"Greek_iota", 1},
+               {"ἴ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὄ", 0},
+            {"Greek_upsilon", 1},
+               {"ὔ", 0},
+            {"Greek_epsilon", 1},
+               {"ἔ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἄ", 0},
+            {"Greek_omicron", 1},
+               {"ὄ", 0},
+            {"Greek_eta", 1},
+               {"ἤ", 0},
+            {"Greek_alpha", 1},
+               {"ἄ", 0},
+            {"Greek_ETA", 1},
+               {"Ἤ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἔ", 0},
+            {"Greek_omega", 1},
+               {"ὤ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὤ", 0},
+         {"quotedbl", 12},
+            {"Greek_iota", 1},
+               {"ΐ", 0},
+            {"Greek_upsilon", 1},
+               {"ΰ", 0},
+            {"i", 1},
+               {"ḯ", 0},
+            {"u", 1},
+               {"ǘ", 0},
+            {"I", 1},
+               {"Ḯ", 0},
+            {"U", 1},
+               {"Ǘ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ớ", 0},
+            {"u", 1},
+               {"ứ", 0},
+            {"O", 1},
+               {"Ớ", 0},
+            {"U", 1},
+               {"Ứ", 0},
+         {"cedilla", 4},
+            {"C", 1},
+               {"Ḉ", 0},
+            {"c", 1},
+               {"ḉ", 0},
+         {"Greek_alpha", 1},
+            {"ά", 0},
+         {"ecircumflex", 1},
+            {"ế", 0},
+         {"w", 1},
+            {"ẃ", 0},
+         {"Greek_ETA", 1},
+            {"Ή", 0},
+         {"Cyrillic_o", 1},
+            {"о́", 0},
+         {"Emacron", 1},
+            {"Ḗ", 0},
+         {"Ooblique", 1},
+            {"Ǿ", 0},
+         {"p", 1},
+            {"ṕ", 0},
+         {"underscore", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"P", 1},
+            {"Ṕ", 0},
+         {"M", 1},
+            {"Ḿ", 0},
+         {"O", 1},
+            {"Ó", 0},
+         {"abreve", 1},
+            {"ắ", 0},
+         {"m", 1},
+            {"ḿ", 0},
+         {"r", 1},
+            {"ŕ", 0},
+         {"s", 1},
+            {"ś", 0},
+         {"Z", 1},
+            {"Ź", 0},
+         {"macron", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"A", 1},
+            {"Á", 0},
+         {"R", 1},
+            {"Ŕ", 0},
+         {"c", 1},
+            {"ć", 0},
+         {"Idiaeresis", 1},
+            {"Ḯ", 0},
+         {"L", 1},
+            {"Ĺ", 0},
+         {"Greek_EPSILON", 1},
+            {"Έ", 0},
+         {"Cyrillic_A", 1},
+            {"А́", 0},
+         {"comma", 4},
+            {"C", 1},
+               {"Ḉ", 0},
+            {"c", 1},
+               {"ḉ", 0},
+         {"asciitilde", 8},
+            {"o", 1},
+               {"ṍ", 0},
+            {"u", 1},
+               {"ṹ", 0},
+            {"O", 1},
+               {"Ṍ", 0},
+            {"U", 1},
+               {"Ṹ", 0},
+         {"Ccedilla", 1},
+            {"Ḉ", 0},
+         {"slash", 4},
+            {"o", 1},
+               {"ǿ", 0},
+            {"O", 1},
+               {"Ǿ", 0},
+         {"aring", 1},
+            {"ǻ", 0},
+         {"K", 1},
+            {"Ḱ", 0},
+         {"Omacron", 1},
+            {"Ṓ", 0},
+         {"Cyrillic_IE", 1},
+            {"Е́", 0},
+         {"dead_cedilla", 4},
+            {"C", 1},
+               {"Ḉ", 0},
+            {"c", 1},
+               {"ḉ", 0},
+         {"Greek_omega", 1},
+            {"ώ", 0},
+         {"dead_diaeresis", 12},
+            {"Greek_iota", 1},
+               {"ΐ", 0},
+            {"Greek_upsilon", 1},
+               {"ΰ", 0},
+            {"i", 1},
+               {"ḯ", 0},
+            {"u", 1},
+               {"ǘ", 0},
+            {"I", 1},
+               {"Ḯ", 0},
+            {"U", 1},
+               {"Ǘ", 0},
+         {"Uhorn", 1},
+            {"Ứ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ώ", 0},
+         {"oslash", 1},
+            {"ǿ", 0},
+         {"Cyrillic_ghe", 1},
+            {"ѓ", 0},
+         {"parenleft", 28},
+            {"Greek_IOTA", 1},
+               {"Ἵ", 0},
+            {"Greek_iota", 1},
+               {"ἵ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὅ", 0},
+            {"Greek_upsilon", 1},
+               {"ὕ", 0},
+            {"Greek_epsilon", 1},
+               {"ἕ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἅ", 0},
+            {"Greek_omicron", 1},
+               {"ὅ", 0},
+            {"Greek_eta", 1},
+               {"ἥ", 0},
+            {"Greek_alpha", 1},
+               {"ἅ", 0},
+            {"Greek_ETA", 1},
+               {"Ἥ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἕ", 0},
+            {"Greek_omega", 1},
+               {"ὥ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὥ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὕ", 0},
+         {"udiaeresis", 1},
+            {"ǘ", 0},
+         {"I", 1},
+            {"Í", 0},
+         {"N", 1},
+            {"Ń", 0},
+         {"U", 1},
+            {"Ú", 0},
+         {"Cyrillic_u", 1},
+            {"у́", 0},
+         {"ae", 1},
+            {"ǽ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ấ", 0},
+            {"e", 1},
+               {"ế", 0},
+            {"o", 1},
+               {"ố", 0},
+            {"E", 1},
+               {"Ế", 0},
+            {"O", 1},
+               {"Ố", 0},
+            {"A", 1},
+               {"Ấ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ύ", 0},
+      {"Cyrillic_pe", 2},
+         {"Cyrillic_a", 1},
+            {"§", 0},
+      {"w", 2},
+         {"asciicircum", 1},
+            {"ŵ", 0},
+      {"Greek_ETA", 2},
+         {"apostrophe", 1},
+            {"Ή", 0},
+      {"4", 2},
+         {"5", 1},
+            {"⅘", 0},
+      {"bracketright", 2},
+         {"bracketleft", 1},
+            {"⌷", 0},
+      {"colon", 6},
+         {"minus", 1},
+            {"÷", 0},
+         {"parenright", 1},
+            {"☺", 0},
+         {"parenleft", 1},
+            {"☹", 0},
+      {"p", 4},
+         {"period", 1},
+            {"ṗ", 0},
+         {"exclam", 1},
+            {"¶", 0},
+      {"underscore", 230},
+         {"adiaeresis", 1},
+            {"ǟ", 0},
+         {"period", 8},
+            {"a", 1},
+               {"ǡ", 0},
+            {"o", 1},
+               {"ȱ", 0},
+            {"O", 1},
+               {"Ȱ", 0},
+            {"A", 1},
+               {"Ǡ", 0},
+         {"g", 1},
+            {"ḡ", 0},
+         {"a", 1},
+            {"ā", 0},
+         {"Greek_IOTA", 1},
+            {"Ῑ", 0},
+         {"Greek_iota", 1},
+            {"ῑ", 0},
+         {"1", 1},
+            {"₁", 0},
+         {"exclam", 8},
+            {"l", 1},
+               {"ḹ", 0},
+            {"r", 1},
+               {"ṝ", 0},
+            {"R", 1},
+               {"Ṝ", 0},
+            {"L", 1},
+               {"Ḹ", 0},
+         {"KP_4", 1},
+            {"₄", 0},
+         {"less", 1},
+            {"≤", 0},
+         {"Cyrillic_er", 1},
+            {"р̄", 0},
+         {"o", 1},
+            {"ō", 0},
+         {"e", 1},
+            {"ē", 0},
+         {"KP_6", 1},
+            {"₆", 0},
+         {"Udiaeresis", 1},
+            {"Ǖ", 0},
+         {"Greek_upsilon", 1},
+            {"ῡ", 0},
+         {"dead_belowdot", 8},
+            {"l", 1},
+               {"ḹ", 0},
+            {"r", 1},
+               {"ṝ", 0},
+            {"R", 1},
+               {"Ṝ", 0},
+            {"L", 1},
+               {"Ḹ", 0},
+         {"KP_8", 1},
+            {"₈", 0},
+         {"Cyrillic_I", 1},
+            {"Ӣ", 0},
+         {"y", 1},
+            {"ȳ", 0},
+         {"Cyrillic_O", 1},
+            {"О̄", 0},
+         {"i", 1},
+            {"ī", 0},
+         {"KP_9", 1},
+            {"₉", 0},
+         {"equal", 1},
+            {"₌", 0},
+         {"KP_Space", 1},
+            {"₂", 0},
+         {"dead_tilde", 4},
+            {"o", 1},
+               {"ȭ", 0},
+            {"O", 1},
+               {"Ȭ", 0},
+         {"7", 1},
+            {"₇", 0},
+         {"Cyrillic_a", 1},
+            {"а̄", 0},
+         {"parenright", 1},
+            {"₎", 0},
+         {"Cyrillic_ER", 1},
+            {"Р̄", 0},
+         {"KP_7", 1},
+            {"₇", 0},
+         {"Cyrillic_U", 1},
+            {"Ӯ", 0},
+         {"AE", 1},
+            {"Ǣ", 0},
+         {"u", 1},
+            {"ū", 0},
+         {"G", 1},
+            {"Ḡ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ᾱ", 0},
+         {"otilde", 1},
+            {"ȭ", 0},
+         {"8", 1},
+            {"₈", 0},
+         {"KP_1", 1},
+            {"₁", 0},
+         {"3", 1},
+            {"₃", 0},
+         {"Cyrillic_ie", 1},
+            {"е̄", 0},
+         {"E", 1},
+            {"Ē", 0},
+         {"2", 1},
+            {"₂", 0},
+         {"Y", 1},
+            {"Ȳ", 0},
+         {"Cyrillic_i", 1},
+            {"ӣ", 0},
+         {"dead_ogonek", 4},
+            {"o", 1},
+               {"ǭ", 0},
+            {"O", 1},
+               {"Ǭ", 0},
+         {"odiaeresis", 1},
+            {"ȫ", 0},
+         {"Otilde", 1},
+            {"Ȭ", 0},
+         {"quotedbl", 12},
+            {"a", 1},
+               {"ǟ", 0},
+            {"o", 1},
+               {"ȫ", 0},
+            {"u", 1},
+               {"ǖ", 0},
+            {"O", 1},
+               {"Ȫ", 0},
+            {"A", 1},
+               {"Ǟ", 0},
+            {"U", 1},
+               {"Ǖ", 0},
+         {"plus", 1},
+            {"₊", 0},
+         {"6", 1},
+            {"₆", 0},
+         {"Greek_alpha", 1},
+            {"ᾱ", 0},
+         {"dead_abovedot", 8},
+            {"a", 1},
+               {"ǡ", 0},
+            {"o", 1},
+               {"ȱ", 0},
+            {"O", 1},
+               {"Ȱ", 0},
+            {"A", 1},
+               {"Ǡ", 0},
+         {"Cyrillic_o", 1},
+            {"о̄", 0},
+         {"4", 1},
+            {"₄", 0},
+         {"KP_3", 1},
+            {"₃", 0},
+         {"underscore", 1},
+            {"¯", 0},
+         {"apostrophe", 1},
+            {"⍘", 0},
+         {"O", 1},
+            {"Ō", 0},
+         {"KP_0", 1},
+            {"₀", 0},
+         {"A", 1},
+            {"Ā", 0},
+         {"KP_Add", 1},
+            {"₊", 0},
+         {"Odiaeresis", 1},
+            {"Ȫ", 0},
+         {"KP_2", 1},
+            {"₂", 0},
+         {"Cyrillic_A", 1},
+            {"А̄", 0},
+         {"asciitilde", 4},
+            {"o", 1},
+               {"ȭ", 0},
+            {"O", 1},
+               {"Ȭ", 0},
+         {"5", 1},
+            {"₅", 0},
+         {"greater", 1},
+            {"≥", 0},
+         {"semicolon", 4},
+            {"o", 1},
+               {"ǭ", 0},
+            {"O", 1},
+               {"Ǭ", 0},
+         {"KP_5", 1},
+            {"₅", 0},
+         {"9", 1},
+            {"₉", 0},
+         {"Cyrillic_IE", 1},
+            {"Е̄", 0},
+         {"0", 1},
+            {"₀", 0},
+         {"dead_diaeresis", 12},
+            {"a", 1},
+               {"ǟ", 0},
+            {"o", 1},
+               {"ȫ", 0},
+            {"u", 1},
+               {"ǖ", 0},
+            {"O", 1},
+               {"Ȫ", 0},
+            {"A", 1},
+               {"Ǟ", 0},
+            {"U", 1},
+               {"Ǖ", 0},
+         {"Adiaeresis", 1},
+            {"Ǟ", 0},
+         {"parenleft", 1},
+            {"₍", 0},
+         {"udiaeresis", 1},
+            {"ǖ", 0},
+         {"I", 1},
+            {"Ī", 0},
+         {"U", 1},
+            {"Ū", 0},
+         {"Cyrillic_u", 1},
+            {"ӯ", 0},
+         {"ae", 1},
+            {"ǣ", 0},
+         {"asciicircum", 1},
+            {"¯", 0},
+         {"Greek_UPSILON", 1},
+            {"Ῡ", 0},
+         {"KP_Equal", 1},
+            {"₌", 0},
+      {"v", 8},
+         {"l", 1},
+            {"|", 0},
+         {"z", 1},
+            {"ž", 0},
+         {"Z", 1},
+            {"Ž", 0},
+         {"slash", 1},
+            {"√", 0},
+      {"P", 8},
+         {"period", 1},
+            {"Ṗ", 0},
+         {"exclam", 1},
+            {"¶", 0},
+         {"t", 1},
+            {"₧", 0},
+         {"P", 1},
+            {"¶", 0},
+      {"question", 106},
+         {"dead_breve", 4},
+            {"a", 1},
+               {"ẳ", 0},
+            {"A", 1},
+               {"Ẳ", 0},
+         {"a", 1},
+            {"ả", 0},
+         {"dead_circumflex", 12},
+            {"a", 1},
+               {"ẩ", 0},
+            {"e", 1},
+               {"ể", 0},
+            {"o", 1},
+               {"ổ", 0},
+            {"E", 1},
+               {"Ể", 0},
+            {"O", 1},
+               {"Ổ", 0},
+            {"A", 1},
+               {"Ẩ", 0},
+         {"dead_horn", 8},
+            {"o", 1},
+               {"ở", 0},
+            {"u", 1},
+               {"ử", 0},
+            {"O", 1},
+               {"Ở", 0},
+            {"U", 1},
+               {"Ử", 0},
+         {"Acircumflex", 1},
+            {"Ẩ", 0},
+         {"exclam", 1},
+            {"⸘", 0},
+         {"e", 1},
+            {"ẻ", 0},
+         {"o", 1},
+            {"ỏ", 0},
+         {"uhorn", 1},
+            {"ử", 0},
+         {"acircumflex", 1},
+            {"ẩ", 0},
+         {"Ecircumflex", 1},
+            {"Ể", 0},
+         {"y", 1},
+            {"ỷ", 0},
+         {"b", 4},
+            {"a", 1},
+               {"ẳ", 0},
+            {"A", 1},
+               {"Ẳ", 0},
+         {"i", 1},
+            {"ỉ", 0},
+         {"Ohorn", 1},
+            {"Ở", 0},
+         {"ohorn", 1},
+            {"ở", 0},
+         {"Ocircumflex", 1},
+            {"Ổ", 0},
+         {"ocircumflex", 1},
+            {"ổ", 0},
+         {"u", 1},
+            {"ủ", 0},
+         {"E", 1},
+            {"Ẻ", 0},
+         {"Y", 1},
+            {"Ỷ", 0},
+         {"Abreve", 1},
+            {"Ẳ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ở", 0},
+            {"u", 1},
+               {"ử", 0},
+            {"O", 1},
+               {"Ở", 0},
+            {"U", 1},
+               {"Ử", 0},
+         {"ecircumflex", 1},
+            {"ể", 0},
+         {"question", 1},
+            {"¿", 0},
+         {"O", 1},
+            {"Ỏ", 0},
+         {"abreve", 1},
+            {"ẳ", 0},
+         {"A", 1},
+            {"Ả", 0},
+         {"Uhorn", 1},
+            {"Ử", 0},
+         {"I", 1},
+            {"Ỉ", 0},
+         {"U", 1},
+            {"Ủ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ẩ", 0},
+            {"e", 1},
+               {"ể", 0},
+            {"o", 1},
+               {"ổ", 0},
+            {"E", 1},
+               {"Ể", 0},
+            {"O", 1},
+               {"Ổ", 0},
+            {"A", 1},
+               {"Ẩ", 0},
+      {"apostrophe", 470},
+         {"W", 1},
+            {"Ẃ", 0},
+         {"dead_breve", 4},
+            {"a", 1},
+               {"ắ", 0},
+            {"A", 1},
+               {"Ắ", 0},
+         {"g", 1},
+            {"ǵ", 0},
+         {"a", 1},
+            {"á", 0},
+         {"Greek_IOTA", 1},
+            {"Ί", 0},
+         {"Greek_iota", 1},
+            {"ί", 0},
+         {"dead_horn", 8},
+            {"o", 1},
+               {"ớ", 0},
+            {"u", 1},
+               {"ứ", 0},
+            {"O", 1},
+               {"Ớ", 0},
+            {"U", 1},
+               {"Ứ", 0},
+         {"dead_circumflex", 12},
+            {"a", 1},
+               {"ấ", 0},
+            {"e", 1},
+               {"ế", 0},
+            {"o", 1},
+               {"ố", 0},
+            {"E", 1},
+               {"Ế", 0},
+            {"O", 1},
+               {"Ố", 0},
+            {"A", 1},
+               {"Ấ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ό", 0},
+         {"Acircumflex", 1},
+            {"Ấ", 0},
+         {"C", 1},
+            {"Ć", 0},
+         {"less", 1},
+            {"‘", 0},
+         {"Cyrillic_er", 1},
+            {"р́", 0},
+         {"e", 1},
+            {"é", 0},
+         {"KP_Divide", 4},
+            {"o", 1},
+               {"ǿ", 0},
+            {"O", 1},
+               {"Ǿ", 0},
+         {"Utilde", 1},
+            {"Ṹ", 0},
+         {"o", 1},
+            {"ó", 0},
+         {"l", 1},
+            {"ĺ", 0},
+         {"Udiaeresis", 1},
+            {"Ǘ", 0},
+         {"Greek_upsilon", 1},
+            {"ύ", 0},
+         {"uhorn", 1},
+            {"ứ", 0},
+         {"space", 1},
+            {"'", 0},
+         {"dead_macron", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"acircumflex", 1},
+            {"ấ", 0},
+         {"Ecircumflex", 1},
+            {"Ế", 0},
+         {"Cyrillic_I", 1},
+            {"И́", 0},
+         {"y", 1},
+            {"ý", 0},
+         {"b", 4},
+            {"a", 1},
+               {"ắ", 0},
+            {"A", 1},
+               {"Ắ", 0},
+         {"idiaeresis", 1},
+            {"ḯ", 0},
+         {"Cyrillic_O", 1},
+            {"О́", 0},
+         {"i", 1},
+            {"í", 0},
+         {"k", 1},
+            {"ḱ", 0},
+         {"n", 1},
+            {"ń", 0},
+         {"ccedilla", 1},
+            {"ḉ", 0},
+         {"Cyrillic_GHE", 1},
+            {"Ѓ", 0},
+         {"dead_tilde", 8},
+            {"o", 1},
+               {"ṍ", 0},
+            {"u", 1},
+               {"ṹ", 0},
+            {"O", 1},
+               {"Ṍ", 0},
+            {"U", 1},
+               {"Ṹ", 0},
+         {"Cyrillic_a", 1},
+            {"а́", 0},
+         {"parenright", 26},
+            {"Greek_IOTA", 1},
+               {"Ἴ", 0},
+            {"Greek_iota", 1},
+               {"ἴ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὄ", 0},
+            {"Greek_upsilon", 1},
+               {"ὔ", 0},
+            {"Greek_epsilon", 1},
+               {"ἔ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἄ", 0},
+            {"Greek_omicron", 1},
+               {"ὄ", 0},
+            {"Greek_eta", 1},
+               {"ἤ", 0},
+            {"Greek_alpha", 1},
+               {"ἄ", 0},
+            {"Greek_ETA", 1},
+               {"Ἤ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἔ", 0},
+            {"Greek_omega", 1},
+               {"ὤ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὤ", 0},
+         {"Ohorn", 1},
+            {"Ớ", 0},
+         {"ohorn", 1},
+            {"ớ", 0},
+         {"Cyrillic_ER", 1},
+            {"Р́", 0},
+         {"Greek_epsilon", 1},
+            {"έ", 0},
+         {"Cyrillic_KA", 1},
+            {"Ќ", 0},
+         {"Cyrillic_U", 1},
+            {"У́", 0},
+         {"dead_abovering", 4},
+            {"a", 1},
+               {"ǻ", 0},
+            {"A", 1},
+               {"Ǻ", 0},
+         {"Ocircumflex", 1},
+            {"Ố", 0},
+         {"AE", 1},
+            {"Ǽ", 0},
+         {"omacron", 1},
+            {"ṓ", 0},
+         {"ocircumflex", 1},
+            {"ố", 0},
+         {"u", 1},
+            {"ú", 0},
+         {"z", 1},
+            {"ź", 0},
+         {"G", 1},
+            {"Ǵ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ά", 0},
+         {"otilde", 1},
+            {"ṍ", 0},
+         {"utilde", 1},
+            {"ṹ", 0},
+         {"Cyrillic_ie", 1},
+            {"е́", 0},
+         {"emacron", 1},
+            {"ḗ", 0},
+         {"E", 1},
+            {"É", 0},
+         {"S", 1},
+            {"Ś", 0},
+         {"Greek_iotadieresis", 1},
+            {"ΐ", 0},
+         {"Y", 1},
+            {"Ý", 0},
+         {"Cyrillic_i", 1},
+            {"и́", 0},
+         {"dead_dasia", 28},
+            {"Greek_IOTA", 1},
+               {"Ἵ", 0},
+            {"Greek_iota", 1},
+               {"ἵ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὅ", 0},
+            {"Greek_upsilon", 1},
+               {"ὕ", 0},
+            {"Greek_epsilon", 1},
+               {"ἕ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἅ", 0},
+            {"Greek_omicron", 1},
+               {"ὅ", 0},
+            {"Greek_eta", 1},
+               {"ἥ", 0},
+            {"Greek_alpha", 1},
+               {"ἅ", 0},
+            {"Greek_ETA", 1},
+               {"Ἥ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἕ", 0},
+            {"Greek_omega", 1},
+               {"ὥ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὥ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὕ", 0},
+         {"Greek_upsilondieresis", 1},
+            {"ΰ", 0},
+         {"Greek_omicron", 1},
+            {"ό", 0},
+         {"Greek_eta", 1},
+            {"ή", 0},
+         {"Otilde", 1},
+            {"Ṍ", 0},
+         {"Cyrillic_ka", 1},
+            {"ќ", 0},
+         {"Aring", 1},
+            {"Ǻ", 0},
+         {"Abreve", 1},
+            {"Ắ", 0},
+         {"dead_psili", 26},
+            {"Greek_IOTA", 1},
+               {"Ἴ", 0},
+            {"Greek_iota", 1},
+               {"ἴ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὄ", 0},
+            {"Greek_upsilon", 1},
+               {"ὔ", 0},
+            {"Greek_epsilon", 1},
+               {"ἔ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἄ", 0},
+            {"Greek_omicron", 1},
+               {"ὄ", 0},
+            {"Greek_eta", 1},
+               {"ἤ", 0},
+            {"Greek_alpha", 1},
+               {"ἄ", 0},
+            {"Greek_ETA", 1},
+               {"Ἤ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἔ", 0},
+            {"Greek_omega", 1},
+               {"ὤ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὤ", 0},
+         {"quotedbl", 14},
+            {"Greek_iota", 1},
+               {"ΐ", 0},
+            {"Greek_upsilon", 1},
+               {"ΰ", 0},
+            {"space", 1},
+               {"΅", 0},
+            {"i", 1},
+               {"ḯ", 0},
+            {"u", 1},
+               {"ǘ", 0},
+            {"I", 1},
+               {"Ḯ", 0},
+            {"U", 1},
+               {"Ǘ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ớ", 0},
+            {"u", 1},
+               {"ứ", 0},
+            {"O", 1},
+               {"Ớ", 0},
+            {"U", 1},
+               {"Ứ", 0},
+         {"cedilla", 4},
+            {"C", 1},
+               {"Ḉ", 0},
+            {"c", 1},
+               {"ḉ", 0},
+         {"Greek_alpha", 1},
+            {"ά", 0},
+         {"ecircumflex", 1},
+            {"ế", 0},
+         {"w", 1},
+            {"ẃ", 0},
+         {"Greek_ETA", 1},
+            {"Ή", 0},
+         {"Cyrillic_o", 1},
+            {"о́", 0},
+         {"Emacron", 1},
+            {"Ḗ", 0},
+         {"Ooblique", 1},
+            {"Ǿ", 0},
+         {"p", 1},
+            {"ṕ", 0},
+         {"underscore", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"P", 1},
+            {"Ṕ", 0},
+         {"apostrophe", 1},
+            {"´", 0},
+         {"M", 1},
+            {"Ḿ", 0},
+         {"O", 1},
+            {"Ó", 0},
+         {"abreve", 1},
+            {"ắ", 0},
+         {"m", 1},
+            {"ḿ", 0},
+         {"r", 1},
+            {"ŕ", 0},
+         {"s", 1},
+            {"ś", 0},
+         {"Z", 1},
+            {"Ź", 0},
+         {"macron", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"A", 1},
+            {"Á", 0},
+         {"R", 1},
+            {"Ŕ", 0},
+         {"c", 1},
+            {"ć", 0},
+         {"Idiaeresis", 1},
+            {"Ḯ", 0},
+         {"L", 1},
+            {"Ĺ", 0},
+         {"Greek_EPSILON", 1},
+            {"Έ", 0},
+         {"Cyrillic_A", 1},
+            {"А́", 0},
+         {"comma", 1},
+            {"‚", 0},
+         {"asciitilde", 8},
+            {"o", 1},
+               {"ṍ", 0},
+            {"u", 1},
+               {"ṹ", 0},
+            {"O", 1},
+               {"Ṍ", 0},
+            {"U", 1},
+               {"Ṹ", 0},
+         {"Ccedilla", 1},
+            {"Ḉ", 0},
+         {"slash", 4},
+            {"o", 1},
+               {"ǿ", 0},
+            {"O", 1},
+               {"Ǿ", 0},
+         {"aring", 1},
+            {"ǻ", 0},
+         {"greater", 1},
+            {"’", 0},
+         {"K", 1},
+            {"Ḱ", 0},
+         {"Omacron", 1},
+            {"Ṓ", 0},
+         {"Cyrillic_IE", 1},
+            {"Е́", 0},
+         {"dead_cedilla", 4},
+            {"C", 1},
+               {"Ḉ", 0},
+            {"c", 1},
+               {"ḉ", 0},
+         {"Greek_omega", 1},
+            {"ώ", 0},
+         {"dead_diaeresis", 12},
+            {"Greek_iota", 1},
+               {"ΐ", 0},
+            {"Greek_upsilon", 1},
+               {"ΰ", 0},
+            {"i", 1},
+               {"ḯ", 0},
+            {"u", 1},
+               {"ǘ", 0},
+            {"I", 1},
+               {"Ḯ", 0},
+            {"U", 1},
+               {"Ǘ", 0},
+         {"Uhorn", 1},
+            {"Ứ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ώ", 0},
+         {"oslash", 1},
+            {"ǿ", 0},
+         {"Cyrillic_ghe", 1},
+            {"ѓ", 0},
+         {"parenleft", 28},
+            {"Greek_IOTA", 1},
+               {"Ἵ", 0},
+            {"Greek_iota", 1},
+               {"ἵ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὅ", 0},
+            {"Greek_upsilon", 1},
+               {"ὕ", 0},
+            {"Greek_epsilon", 1},
+               {"ἕ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἅ", 0},
+            {"Greek_omicron", 1},
+               {"ὅ", 0},
+            {"Greek_eta", 1},
+               {"ἥ", 0},
+            {"Greek_alpha", 1},
+               {"ἅ", 0},
+            {"Greek_ETA", 1},
+               {"Ἥ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἕ", 0},
+            {"Greek_omega", 1},
+               {"ὥ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὥ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὕ", 0},
+         {"udiaeresis", 1},
+            {"ǘ", 0},
+         {"I", 1},
+            {"Í", 0},
+         {"N", 1},
+            {"Ń", 0},
+         {"U", 1},
+            {"Ú", 0},
+         {"Cyrillic_u", 1},
+            {"у́", 0},
+         {"ae", 1},
+            {"ǽ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ấ", 0},
+            {"e", 1},
+               {"ế", 0},
+            {"o", 1},
+               {"ố", 0},
+            {"E", 1},
+               {"Ế", 0},
+            {"O", 1},
+               {"Ố", 0},
+            {"A", 1},
+               {"Ấ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ύ", 0},
+      {"M", 2},
+         {"period", 1},
+            {"Ṁ", 0},
+      {"O", 40},
+         {"minus", 1},
+            {"Ō", 0},
+         {"C", 1},
+            {"©", 0},
+         {"diaeresis", 1},
+            {"Ö", 0},
+         {"x", 1},
+            {"¤", 0},
+         {"E", 1},
+            {"Œ", 0},
+         {"S", 1},
+            {"§", 0},
+         {"quotedbl", 1},
+            {"Ö", 0},
+         {"acute", 1},
+            {"Ó", 0},
+         {"underscore", 1},
+            {"Ō", 0},
+         {"apostrophe", 1},
+            {"Ó", 0},
+         {"r", 1},
+            {"®", 0},
+         {"A", 1},
+            {"Ⓐ", 0},
+         {"R", 1},
+            {"®", 0},
+         {"c", 1},
+            {"©", 0},
+         {"asciitilde", 1},
+            {"Õ", 0},
+         {"slash", 1},
+            {"Ø", 0},
+         {"greater", 1},
+            {"Ô", 0},
+         {"X", 1},
+            {"¤", 0},
+         {"grave", 1},
+            {"Ò", 0},
+         {"asciicircum", 1},
+            {"Ô", 0},
+      {"m", 6},
+         {"period", 1},
+            {"ṁ", 0},
+         {"u", 1},
+            {"µ", 0},
+         {"slash", 1},
+            {"₥", 0},
+      {"r", 6},
+         {"less", 1},
+            {"ř", 0},
+         {"apostrophe", 1},
+            {"ŕ", 0},
+         {"comma", 1},
+            {"ŗ", 0},
+      {"s", 20},
+         {"period", 1},
+            {"ṡ", 0},
+         {"exclam", 1},
+            {"§", 0},
+         {"less", 1},
+            {"š", 0},
+         {"o", 1},
+            {"§", 0},
+         {"cedilla", 1},
+            {"ş", 0},
+         {"apostrophe", 1},
+            {"ś", 0},
+         {"M", 1},
+            {"℠", 0},
+         {"m", 1},
+            {"℠", 0},
+         {"s", 1},
+            {"ß", 0},
+         {"comma", 1},
+            {"ş", 0},
+      {"asterisk", 17},
+         {"a", 1},
+            {"å", 0},
+         {"diaeresis", 1},
+            {"⍣", 0},
+         {"u", 1},
+            {"ů", 0},
+         {"apostrophe", 4},
+            {"a", 1},
+               {"ǻ", 0},
+            {"A", 1},
+               {"Ǻ", 0},
+         {"A", 1},
+            {"Å", 0},
+         {"0", 1},
+            {"°", 0},
+         {"U", 1},
+            {"Ů", 0},
+      {"Z", 6},
+         {"period", 1},
+            {"Ż", 0},
+         {"less", 1},
+            {"Ž", 0},
+         {"apostrophe", 1},
+            {"Ź", 0},
+      {"bar", 6},
+         {"C", 1},
+            {"¢", 0},
+         {"c", 1},
+            {"¢", 0},
+         {"asciitilde", 1},
+            {"⍭", 0},
+      {"macron", 166},
+         {"adiaeresis", 1},
+            {"ǟ", 0},
+         {"period", 8},
+            {"a", 1},
+               {"ǡ", 0},
+            {"o", 1},
+               {"ȱ", 0},
+            {"O", 1},
+               {"Ȱ", 0},
+            {"A", 1},
+               {"Ǡ", 0},
+         {"g", 1},
+            {"ḡ", 0},
+         {"a", 1},
+            {"ā", 0},
+         {"Greek_IOTA", 1},
+            {"Ῑ", 0},
+         {"Greek_iota", 1},
+            {"ῑ", 0},
+         {"exclam", 8},
+            {"l", 1},
+               {"ḹ", 0},
+            {"r", 1},
+               {"ṝ", 0},
+            {"R", 1},
+               {"Ṝ", 0},
+            {"L", 1},
+               {"Ḹ", 0},
+         {"Cyrillic_er", 1},
+            {"р̄", 0},
+         {"e", 1},
+            {"ē", 0},
+         {"o", 1},
+            {"ō", 0},
+         {"Udiaeresis", 1},
+            {"Ǖ", 0},
+         {"Greek_upsilon", 1},
+            {"ῡ", 0},
+         {"dead_belowdot", 8},
+            {"l", 1},
+               {"ḹ", 0},
+            {"r", 1},
+               {"ṝ", 0},
+            {"R", 1},
+               {"Ṝ", 0},
+            {"L", 1},
+               {"Ḹ", 0},
+         {"Cyrillic_I", 1},
+            {"Ӣ", 0},
+         {"y", 1},
+            {"ȳ", 0},
+         {"Cyrillic_O", 1},
+            {"О̄", 0},
+         {"i", 1},
+            {"ī", 0},
+         {"dead_tilde", 4},
+            {"o", 1},
+               {"ȭ", 0},
+            {"O", 1},
+               {"Ȭ", 0},
+         {"Cyrillic_a", 1},
+            {"а̄", 0},
+         {"Cyrillic_ER", 1},
+            {"Р̄", 0},
+         {"Cyrillic_U", 1},
+            {"Ӯ", 0},
+         {"AE", 1},
+            {"Ǣ", 0},
+         {"u", 1},
+            {"ū", 0},
+         {"G", 1},
+            {"Ḡ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ᾱ", 0},
+         {"otilde", 1},
+            {"ȭ", 0},
+         {"Cyrillic_ie", 1},
+            {"е̄", 0},
+         {"E", 1},
+            {"Ē", 0},
+         {"Y", 1},
+            {"Ȳ", 0},
+         {"Cyrillic_i", 1},
+            {"ӣ", 0},
+         {"dead_ogonek", 4},
+            {"o", 1},
+               {"ǭ", 0},
+            {"O", 1},
+               {"Ǭ", 0},
+         {"odiaeresis", 1},
+            {"ȫ", 0},
+         {"Otilde", 1},
+            {"Ȭ", 0},
+         {"quotedbl", 12},
+            {"a", 1},
+               {"ǟ", 0},
+            {"o", 1},
+               {"ȫ", 0},
+            {"u", 1},
+               {"ǖ", 0},
+            {"O", 1},
+               {"Ȫ", 0},
+            {"A", 1},
+               {"Ǟ", 0},
+            {"U", 1},
+               {"Ǖ", 0},
+         {"Greek_alpha", 1},
+            {"ᾱ", 0},
+         {"dead_abovedot", 8},
+            {"a", 1},
+               {"ǡ", 0},
+            {"o", 1},
+               {"ȱ", 0},
+            {"O", 1},
+               {"Ȱ", 0},
+            {"A", 1},
+               {"Ǡ", 0},
+         {"Cyrillic_o", 1},
+            {"о̄", 0},
+         {"O", 1},
+            {"Ō", 0},
+         {"A", 1},
+            {"Ā", 0},
+         {"Odiaeresis", 1},
+            {"Ȫ", 0},
+         {"Cyrillic_A", 1},
+            {"А̄", 0},
+         {"asciitilde", 4},
+            {"o", 1},
+               {"ȭ", 0},
+            {"O", 1},
+               {"Ȭ", 0},
+         {"semicolon", 4},
+            {"o", 1},
+               {"ǭ", 0},
+            {"O", 1},
+               {"Ǭ", 0},
+         {"Cyrillic_IE", 1},
+            {"Е̄", 0},
+         {"dead_diaeresis", 12},
+            {"a", 1},
+               {"ǟ", 0},
+            {"o", 1},
+               {"ȫ", 0},
+            {"u", 1},
+               {"ǖ", 0},
+            {"O", 1},
+               {"Ȫ", 0},
+            {"A", 1},
+               {"Ǟ", 0},
+            {"U", 1},
+               {"Ǖ", 0},
+         {"Adiaeresis", 1},
+            {"Ǟ", 0},
+         {"udiaeresis", 1},
+            {"ǖ", 0},
+         {"I", 1},
+            {"Ī", 0},
+         {"U", 1},
+            {"Ū", 0},
+         {"Cyrillic_u", 1},
+            {"ӯ", 0},
+         {"ae", 1},
+            {"ǣ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ῡ", 0},
+      {"A", 32},
+         {"minus", 1},
+            {"Ā", 0},
+         {"diaeresis", 1},
+            {"Ä", 0},
+         {"E", 1},
+            {"Æ", 0},
+         {"quotedbl", 1},
+            {"Ä", 0},
+         {"acute", 1},
+            {"Á", 0},
+         {"underscore", 1},
+            {"Ā", 0},
+         {"apostrophe", 1},
+            {"Á", 0},
+         {"asterisk", 1},
+            {"Å", 0},
+         {"A", 1},
+            {"Å", 0},
+         {"comma", 1},
+            {"Ą", 0},
+         {"T", 1},
+            {"@", 0},
+         {"asciitilde", 1},
+            {"Ã", 0},
+         {"greater", 1},
+            {"Â", 0},
+         {"parenleft", 1},
+            {"Ă", 0},
+         {"grave", 1},
+            {"À", 0},
+         {"asciicircum", 1},
+            {"Â", 0},
+      {"R", 10},
+         {"less", 1},
+            {"Ř", 0},
+         {"apostrophe", 1},
+            {"Ŕ", 0},
+         {"O", 1},
+            {"®", 0},
+         {"s", 1},
+            {"₨", 0},
+         {"comma", 1},
+            {"Ŗ", 0},
+      {"Cyrillic_ES", 2},
+         {"equal", 1},
+            {"€", 0},
+      {"c", 98},
+         {"period", 1},
+            {"ċ", 0},
+         {"g", 1},
+            {"ǧ", 0},
+         {"a", 1},
+            {"ǎ", 0},
+         {"ezh", 1},
+            {"ǯ", 0},
+         {"C", 1},
+            {"Č", 0},
+         {"less", 1},
+            {"č", 0},
+         {"e", 1},
+            {"ě", 0},
+         {"o", 1},
+            {"ǒ", 0},
+         {"l", 1},
+            {"ľ", 0},
+         {"Udiaeresis", 1},
+            {"Ǚ", 0},
+         {"t", 1},
+            {"ť", 0},
+         {"i", 1},
+            {"ǐ", 0},
+         {"k", 1},
+            {"ǩ", 0},
+         {"n", 1},
+            {"ň", 0},
+         {"equal", 1},
+            {"€", 0},
+         {"j", 1},
+            {"ǰ", 0},
+         {"u", 1},
+            {"ǔ", 0},
+         {"z", 1},
+            {"ž", 0},
+         {"G", 1},
+            {"Ǧ", 0},
+         {"H", 1},
+            {"Ȟ", 0},
+         {"E", 1},
+            {"Ě", 0},
+         {"S", 1},
+            {"Š", 0},
+         {"d", 1},
+            {"ď", 0},
+         {"D", 1},
+            {"Ď", 0},
+         {"quotedbl", 4},
+            {"u", 1},
+               {"ǚ", 0},
+            {"U", 1},
+               {"Ǚ", 0},
+         {"apostrophe", 1},
+            {"ć", 0},
+         {"O", 1},
+            {"Ǒ", 0},
+         {"r", 1},
+            {"ř", 0},
+         {"s", 1},
+            {"š", 0},
+         {"Z", 1},
+            {"Ž", 0},
+         {"bar", 1},
+            {"¢", 0},
+         {"EZH", 1},
+            {"Ǯ", 0},
+         {"A", 1},
+            {"Ǎ", 0},
+         {"R", 1},
+            {"Ř", 0},
+         {"c", 1},
+            {"č", 0},
+         {"L", 1},
+            {"Ľ", 0},
+         {"comma", 1},
+            {"ç", 0},
+         {"T", 1},
+            {"Ť", 0},
+         {"slash", 1},
+            {"¢", 0},
+         {"K", 1},
+            {"Ǩ", 0},
+         {"dead_diaeresis", 4},
+            {"u", 1},
+               {"ǚ", 0},
+            {"U", 1},
+               {"Ǚ", 0},
+         {"h", 1},
+            {"ȟ", 0},
+         {"udiaeresis", 1},
+            {"ǚ", 0},
+         {"I", 1},
+            {"Ǐ", 0},
+         {"N", 1},
+            {"Ň", 0},
+         {"U", 1},
+            {"Ǔ", 0},
+      {"numbersign", 14},
+         {"e", 1},
+            {"♪", 0},
+         {"b", 1},
+            {"♭", 0},
+         {"q", 1},
+            {"♩", 0},
+         {"E", 1},
+            {"♫", 0},
+         {"S", 1},
+            {"♬", 0},
+         {"f", 1},
+            {"♮", 0},
+         {"numbersign", 1},
+            {"♯", 0},
+      {"L", 14},
+         {"minus", 1},
+            {"£", 0},
+         {"less", 1},
+            {"Ľ", 0},
+         {"equal", 1},
+            {"₤", 0},
+         {"V", 1},
+            {"|", 0},
+         {"apostrophe", 1},
+            {"Ĺ", 0},
+         {"comma", 1},
+            {"Ļ", 0},
+         {"slash", 1},
+            {"Ł", 0},
+      {"Greek_EPSILON", 2},
+         {"apostrophe", 1},
+            {"Έ", 0},
+      {"comma", 66},
+         {"minus", 1},
+            {"¬", 0},
+         {"g", 1},
+            {"ģ", 0},
+         {"a", 1},
+            {"ą", 0},
+         {"C", 1},
+            {"Ç", 0},
+         {"e", 1},
+            {"ę", 0},
+         {"l", 1},
+            {"ļ", 0},
+         {"t", 1},
+            {"ţ", 0},
+         {"space", 1},
+            {"¸", 0},
+         {"i", 1},
+            {"į", 0},
+         {"k", 1},
+            {"ķ", 0},
+         {"n", 1},
+            {"ņ", 0},
+         {"u", 1},
+            {"ų", 0},
+         {"G", 1},
+            {"Ģ", 0},
+         {"H", 1},
+            {"Ḩ", 0},
+         {"E", 1},
+            {"Ę", 0},
+         {"S", 1},
+            {"Ş", 0},
+         {"d", 1},
+            {"ḑ", 0},
+         {"D", 1},
+            {"Ḑ", 0},
+         {"quotedbl", 1},
+            {"„", 0},
+         {"apostrophe", 1},
+            {"‚", 0},
+         {"r", 1},
+            {"ŗ", 0},
+         {"s", 1},
+            {"ş", 0},
+         {"A", 1},
+            {"Ą", 0},
+         {"R", 1},
+            {"Ŗ", 0},
+         {"c", 1},
+            {"ç", 0},
+         {"L", 1},
+            {"Ļ", 0},
+         {"comma", 1},
+            {"¸", 0},
+         {"T", 1},
+            {"Ţ", 0},
+         {"K", 1},
+            {"Ķ", 0},
+         {"h", 1},
+            {"ḩ", 0},
+         {"I", 1},
+            {"Į", 0},
+         {"N", 1},
+            {"Ņ", 0},
+         {"U", 1},
+            {"Ų", 0},
+      {"T", 16},
+         {"minus", 1},
+            {"Ŧ", 0},
+         {"period", 1},
+            {"Ṫ", 0},
+         {"less", 1},
+            {"Ť", 0},
+         {"H", 1},
+            {"Þ", 0},
+         {"M", 1},
+            {"™", 0},
+         {"m", 1},
+            {"™", 0},
+         {"comma", 1},
+            {"Ţ", 0},
+         {"slash", 1},
+            {"Ŧ", 0},
+      {"asciitilde", 222},
+         {"dead_breve", 4},
+            {"a", 1},
+               {"ẵ", 0},
+            {"A", 1},
+               {"Ẵ", 0},
+         {"a", 1},
+            {"ã", 0},
+         {"Greek_iota", 1},
+            {"ῖ", 0},
+         {"dead_horn", 8},
+            {"o", 1},
+               {"ỡ", 0},
+            {"u", 1},
+               {"ữ", 0},
+            {"O", 1},
+               {"Ỡ", 0},
+            {"U", 1},
+               {"Ữ", 0},
+         {"dead_circumflex", 12},
+            {"a", 1},
+               {"ẫ", 0},
+            {"e", 1},
+               {"ễ", 0},
+            {"o", 1},
+               {"ỗ", 0},
+            {"E", 1},
+               {"Ễ", 0},
+            {"O", 1},
+               {"Ỗ", 0},
+            {"A", 1},
+               {"Ẫ", 0},
+         {"Acircumflex", 1},
+            {"Ẫ", 0},
+         {"e", 1},
+            {"ẽ", 0},
+         {"o", 1},
+            {"õ", 0},
+         {"Greek_upsilon", 1},
+            {"ῦ", 0},
+         {"diaeresis", 1},
+            {"⍨", 0},
+         {"uhorn", 1},
+            {"ữ", 0},
+         {"space", 1},
+            {"~", 0},
+         {"acircumflex", 1},
+            {"ẫ", 0},
+         {"Ecircumflex", 1},
+            {"Ễ", 0},
+         {"y", 1},
+            {"ỹ", 0},
+         {"b", 4},
+            {"a", 1},
+               {"ẵ", 0},
+            {"A", 1},
+               {"Ẵ", 0},
+         {"i", 1},
+            {"ĩ", 0},
+         {"n", 1},
+            {"ñ", 0},
+         {"parenright", 18},
+            {"Greek_IOTA", 1},
+               {"Ἶ", 0},
+            {"Greek_iota", 1},
+               {"ἶ", 0},
+            {"Greek_upsilon", 1},
+               {"ὖ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἆ", 0},
+            {"Greek_eta", 1},
+               {"ἦ", 0},
+            {"Greek_alpha", 1},
+               {"ἆ", 0},
+            {"Greek_ETA", 1},
+               {"Ἦ", 0},
+            {"Greek_omega", 1},
+               {"ὦ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὦ", 0},
+         {"Ohorn", 1},
+            {"Ỡ", 0},
+         {"ohorn", 1},
+            {"ỡ", 0},
+         {"Ocircumflex", 1},
+            {"Ỗ", 0},
+         {"V", 1},
+            {"Ṽ", 0},
+         {"ocircumflex", 1},
+            {"ỗ", 0},
+         {"u", 1},
+            {"ũ", 0},
+         {"E", 1},
+            {"Ẽ", 0},
+         {"Greek_iotadieresis", 1},
+            {"ῗ", 0},
+         {"Y", 1},
+            {"Ỹ", 0},
+         {"dead_dasia", 20},
+            {"Greek_IOTA", 1},
+               {"Ἷ", 0},
+            {"Greek_iota", 1},
+               {"ἷ", 0},
+            {"Greek_upsilon", 1},
+               {"ὗ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἇ", 0},
+            {"Greek_eta", 1},
+               {"ἧ", 0},
+            {"Greek_alpha", 1},
+               {"ἇ", 0},
+            {"Greek_ETA", 1},
+               {"Ἧ", 0},
+            {"Greek_omega", 1},
+               {"ὧ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὧ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὗ", 0},
+         {"Greek_upsilondieresis", 1},
+            {"ῧ", 0},
+         {"Greek_eta", 1},
+            {"ῆ", 0},
+         {"Abreve", 1},
+            {"Ẵ", 0},
+         {"dead_psili", 18},
+            {"Greek_IOTA", 1},
+               {"Ἶ", 0},
+            {"Greek_iota", 1},
+               {"ἶ", 0},
+            {"Greek_upsilon", 1},
+               {"ὖ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἆ", 0},
+            {"Greek_eta", 1},
+               {"ἦ", 0},
+            {"Greek_alpha", 1},
+               {"ἆ", 0},
+            {"Greek_ETA", 1},
+               {"Ἦ", 0},
+            {"Greek_omega", 1},
+               {"ὦ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὦ", 0},
+         {"quotedbl", 4},
+            {"Greek_iota", 1},
+               {"ῗ", 0},
+            {"Greek_upsilon", 1},
+               {"ῧ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ỡ", 0},
+            {"u", 1},
+               {"ữ", 0},
+            {"O", 1},
+               {"Ỡ", 0},
+            {"U", 1},
+               {"Ữ", 0},
+         {"Greek_alpha", 1},
+            {"ᾶ", 0},
+         {"ecircumflex", 1},
+            {"ễ", 0},
+         {"v", 1},
+            {"ṽ", 0},
+         {"O", 1},
+            {"Õ", 0},
+         {"abreve", 1},
+            {"ẵ", 0},
+         {"bar", 1},
+            {"⍭", 0},
+         {"A", 1},
+            {"Ã", 0},
+         {"0", 1},
+            {"⍬", 0},
+         {"Greek_omega", 1},
+            {"ῶ", 0},
+         {"dead_diaeresis", 4},
+            {"Greek_iota", 1},
+               {"ῗ", 0},
+            {"Greek_upsilon", 1},
+               {"ῧ", 0},
+         {"Uhorn", 1},
+            {"Ữ", 0},
+         {"parenleft", 20},
+            {"Greek_IOTA", 1},
+               {"Ἷ", 0},
+            {"Greek_iota", 1},
+               {"ἷ", 0},
+            {"Greek_upsilon", 1},
+               {"ὗ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἇ", 0},
+            {"Greek_eta", 1},
+               {"ἧ", 0},
+            {"Greek_alpha", 1},
+               {"ἇ", 0},
+            {"Greek_ETA", 1},
+               {"Ἧ", 0},
+            {"Greek_omega", 1},
+               {"ὧ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὧ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὗ", 0},
+         {"I", 1},
+            {"Ĩ", 0},
+         {"N", 1},
+            {"Ñ", 0},
+         {"U", 1},
+            {"Ũ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ẫ", 0},
+            {"e", 1},
+               {"ễ", 0},
+            {"o", 1},
+               {"ỗ", 0},
+            {"E", 1},
+               {"Ễ", 0},
+            {"O", 1},
+               {"Ỗ", 0},
+            {"A", 1},
+               {"Ẫ", 0},
+      {"slash", 66},
+         {"minus", 1},
+            {"⌿", 0},
+         {"g", 1},
+            {"ǥ", 0},
+         {"C", 1},
+            {"₡", 0},
+         {"less", 1},
+            {"\\", 0},
+         {"o", 1},
+            {"ø", 0},
+         {"l", 1},
+            {"ł", 0},
+         {"t", 1},
+            {"ŧ", 0},
+         {"b", 1},
+            {"ƀ", 0},
+         {"i", 1},
+            {"ɨ", 0},
+         {"equal", 1},
+            {"≠", 0},
+         {"Cyrillic_GHE", 1},
+            {"Ғ", 0},
+         {"leftarrow", 1},
+            {"↚", 0},
+         {"Cyrillic_KA", 1},
+            {"Ҟ", 0},
+         {"u", 1},
+            {"µ", 0},
+         {"rightarrow", 1},
+            {"↛", 0},
+         {"z", 1},
+            {"ƶ", 0},
+         {"G", 1},
+            {"Ǥ", 0},
+         {"H", 1},
+            {"Ħ", 0},
+         {"d", 1},
+            {"đ", 0},
+         {"Cyrillic_ka", 1},
+            {"ҟ", 0},
+         {"D", 1},
+            {"Đ", 0},
+         {"v", 1},
+            {"√", 0},
+         {"O", 1},
+            {"Ø", 0},
+         {"m", 1},
+            {"₥", 0},
+         {"Z", 1},
+            {"Ƶ", 0},
+         {"c", 1},
+            {"¢", 0},
+         {"L", 1},
+            {"Ł", 0},
+         {"T", 1},
+            {"Ŧ", 0},
+         {"slash", 1},
+            {"\\", 0},
+         {"Cyrillic_ghe", 1},
+            {"ғ", 0},
+         {"h", 1},
+            {"ħ", 0},
+         {"I", 1},
+            {"Ɨ", 0},
+         {"asciicircum", 1},
+            {"|", 0},
+      {"5", 4},
+         {"8", 1},
+            {"⅝", 0},
+         {"6", 1},
+            {"⅚", 0},
+      {"Cyrillic_EN", 4},
+         {"Cyrillic_O", 1},
+            {"№", 0},
+         {"Cyrillic_o", 1},
+            {"№", 0},
+      {"greater", 36},
+         {"a", 1},
+            {"â", 0},
+         {"less", 1},
+            {"⋄", 0},
+         {"e", 1},
+            {"ê", 0},
+         {"o", 1},
+            {"ô", 0},
+         {"diaeresis", 1},
+            {"⍩", 0},
+         {"space", 1},
+            {"^", 0},
+         {"i", 1},
+            {"î", 0},
+         {"equal", 1},
+            {"≥", 0},
+         {"u", 1},
+            {"û", 0},
+         {"E", 1},
+            {"Ê", 0},
+         {"quotedbl", 1},
+            {"”", 0},
+         {"underscore", 1},
+            {"≥", 0},
+         {"apostrophe", 1},
+            {"’", 0},
+         {"O", 1},
+            {"Ô", 0},
+         {"A", 1},
+            {"Â", 0},
+         {"greater", 1},
+            {"»", 0},
+         {"I", 1},
+            {"Î", 0},
+         {"U", 1},
+            {"Û", 0},
+      {"semicolon", 22},
+         {"a", 1},
+            {"ą", 0},
+         {"e", 1},
+            {"ę", 0},
+         {"o", 1},
+            {"ǫ", 0},
+         {"i", 1},
+            {"į", 0},
+         {"u", 1},
+            {"ų", 0},
+         {"E", 1},
+            {"Ę", 0},
+         {"underscore", 1},
+            {"⍮", 0},
+         {"O", 1},
+            {"Ǫ", 0},
+         {"A", 1},
+            {"Ą", 0},
+         {"I", 1},
+            {"Į", 0},
+         {"U", 1},
+            {"Ų", 0},
+      {"K", 2},
+         {"comma", 1},
+            {"Ķ", 0},
+      {"Cyrillic_IE", 2},
+         {"equal", 1},
+            {"€", 0},
+      {"B", 2},
+         {"period", 1},
+            {"Ḃ", 0},
+      {"0", 6},
+         {"3", 1},
+            {"↉", 0},
+         {"asterisk", 1},
+            {"°", 0},
+         {"asciitilde", 1},
+            {"⍬", 0},
+      {"Greek_omega", 2},
+         {"apostrophe", 1},
+            {"ώ", 0},
+      {"Greek_OMEGA", 2},
+         {"apostrophe", 1},
+            {"Ώ", 0},
+      {"X", 4},
+         {"o", 1},
+            {"¤", 0},
+         {"O", 1},
+            {"¤", 0},
+      {"parenleft", 971},
+         {"minus", 1},
+            {"{", 0},
+         {"W", 2},
+            {"parenright", 1},
+               {"Ⓦ", 0},
+         {"g", 2},
+            {"parenright", 1},
+               {"ⓖ", 0},
+         {"kana_KE", 2},
+            {"parenright", 1},
+               {"㋘", 0},
+         {"a", 2},
+            {"parenright", 1},
+               {"ⓐ", 0},
+         {"Greek_IOTA", 1},
+            {"Ἱ", 0},
+         {"Greek_iota", 1},
+            {"ἱ", 0},
+         {"1", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"⑪", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"⑭", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"⑯", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"⑱", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"⑲", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"⑫", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"⑰", 0},
+            {"parenright", 1},
+               {"①", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"⑰", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"⑱", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"⑪", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"⑬", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"⑫", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"⑯", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"⑭", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"⑬", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"⑩", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"⑫", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"⑮", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"⑮", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"⑲", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"⑩", 0},
+         {"Greek_OMICRON", 1},
+            {"Ὁ", 0},
+         {"C", 2},
+            {"parenright", 1},
+               {"Ⓒ", 0},
+         {"KP_4", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"㊶", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"㊹", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"㊻", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"㊽", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"㊾", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"㊷", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"㊼", 0},
+            {"parenright", 1},
+               {"④", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"㊼", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"㊽", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"㊶", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"㊸", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"㊷", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"㊻", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"㊹", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"㊸", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"㊵", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"㊷", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"㊺", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"㊺", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"㊾", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"㊵", 0},
+         {"kana_SA", 2},
+            {"parenright", 1},
+               {"㋚", 0},
+         {"e", 2},
+            {"parenright", 1},
+               {"ⓔ", 0},
+         {"F", 2},
+            {"parenright", 1},
+               {"Ⓕ", 0},
+         {"KP_6", 2},
+            {"parenright", 1},
+               {"⑥", 0},
+         {"o", 2},
+            {"parenright", 1},
+               {"ⓞ", 0},
+         {"l", 2},
+            {"parenright", 1},
+               {"ⓛ", 0},
+         {"kana_SE", 2},
+            {"parenright", 1},
+               {"㋝", 0},
+         {"kana_SU", 2},
+            {"parenright", 1},
+               {"㋜", 0},
+         {"t", 2},
+            {"parenright", 1},
+               {"ⓣ", 0},
+         {"kana_ME", 2},
+            {"parenright", 1},
+               {"㋱", 0},
+         {"Greek_upsilon", 1},
+            {"ὑ", 0},
+         {"kana_WO", 2},
+            {"parenright", 1},
+               {"㋾", 0},
+         {"space", 1},
+            {"˘", 0},
+         {"KP_8", 2},
+            {"parenright", 1},
+               {"⑧", 0},
+         {"Greek_RHO", 1},
+            {"Ῥ", 0},
+         {"Q", 2},
+            {"parenright", 1},
+               {"Ⓠ", 0},
+         {"y", 2},
+            {"parenright", 1},
+               {"ⓨ", 0},
+         {"b", 2},
+            {"parenright", 1},
+               {"ⓑ", 0},
+         {"kana_YO", 2},
+            {"parenright", 1},
+               {"㋵", 0},
+         {"i", 2},
+            {"parenright", 1},
+               {"ⓘ", 0},
+         {"kana_MA", 2},
+            {"parenright", 1},
+               {"㋮", 0},
+         {"k", 2},
+            {"parenright", 1},
+               {"ⓚ", 0},
+         {"n", 2},
+            {"parenright", 1},
+               {"ⓝ", 0},
+         {"KP_9", 2},
+            {"parenright", 1},
+               {"⑨", 0},
+         {"KP_Space", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"㉑", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"㉔", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"㉖", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"㉘", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"㉙", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"㉗", 0},
+            {"parenright", 1},
+               {"②", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"㉗", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"㉘", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"㉑", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"㉓", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"㉖", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"㉔", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"㉓", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"⑳", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"㉕", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"㉕", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"㉙", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"⑳", 0},
+         {"kana_YU", 2},
+            {"parenright", 1},
+               {"㋴", 0},
+         {"kana_TE", 2},
+            {"parenright", 1},
+               {"㋢", 0},
+         {"7", 2},
+            {"parenright", 1},
+               {"⑦", 0},
+         {"kana_NU", 2},
+            {"parenright", 1},
+               {"㋦", 0},
+         {"kana_HO", 2},
+            {"parenright", 1},
+               {"㋭", 0},
+         {"kana_HI", 2},
+            {"parenright", 1},
+               {"㋪", 0},
+         {"j", 2},
+            {"parenright", 1},
+               {"ⓙ", 0},
+         {"kana_E", 2},
+            {"parenright", 1},
+               {"㋓", 0},
+         {"x", 2},
+            {"parenright", 1},
+               {"ⓧ", 0},
+         {"Greek_epsilon", 1},
+            {"ἑ", 0},
+         {"q", 2},
+            {"parenright", 1},
+               {"ⓠ", 0},
+         {"KP_7", 2},
+            {"parenright", 1},
+               {"⑦", 0},
+         {"kana_I", 2},
+            {"parenright", 1},
+               {"㋑", 0},
+         {"kana_WA", 2},
+            {"parenright", 1},
+               {"㋻", 0},
+         {"kana_RU", 2},
+            {"parenright", 1},
+               {"㋸", 0},
+         {"V", 2},
+            {"parenright", 1},
+               {"Ⓥ", 0},
+         {"u", 2},
+            {"parenright", 1},
+               {"ⓤ", 0},
+         {"kana_NI", 2},
+            {"parenright", 1},
+               {"㋥", 0},
+         {"kana_MU", 2},
+            {"parenright", 1},
+               {"㋰", 0},
+         {"kana_CHI", 2},
+            {"parenright", 1},
+               {"㋠", 0},
+         {"kana_HA", 2},
+            {"parenright", 1},
+               {"㋩", 0},
+         {"z", 2},
+            {"parenright", 1},
+               {"ⓩ", 0},
+         {"G", 2},
+            {"parenright", 1},
+               {"Ⓖ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἁ", 0},
+         {"H", 2},
+            {"parenright", 1},
+               {"Ⓗ", 0},
+         {"8", 2},
+            {"parenright", 1},
+               {"⑧", 0},
+         {"KP_1", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"⑪", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"⑭", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"⑯", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"⑱", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"⑲", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"⑫", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"⑰", 0},
+            {"parenright", 1},
+               {"①", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"⑰", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"⑱", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"⑪", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"⑬", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"⑫", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"⑯", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"⑭", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"⑬", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"⑩", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"⑫", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"⑮", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"⑮", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"⑲", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"⑩", 0},
+         {"3", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"㉛", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"㉞", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"㊱", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"㊳", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"㊴", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"㉜", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"㊲", 0},
+            {"parenright", 1},
+               {"③", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"㊲", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"㊳", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"㉛", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"㉝", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"㉜", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"㊱", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"㉞", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"㉝", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"㉚", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"㉜", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"㉟", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"㉟", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"㊴", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"㉚", 0},
+         {"E", 2},
+            {"parenright", 1},
+               {"Ⓔ", 0},
+         {"S", 2},
+            {"parenright", 1},
+               {"Ⓢ", 0},
+         {"2", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"㉑", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"㉔", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"㉖", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"㉘", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"㉙", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"㉗", 0},
+            {"parenright", 1},
+               {"②", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"㉗", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"㉘", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"㉑", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"㉓", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"㉖", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"㉔", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"㉓", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"⑳", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"㉕", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"㉕", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"㉙", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"⑳", 0},
+         {"Y", 2},
+            {"parenright", 1},
+               {"Ⓨ", 0},
+         {"kana_RA", 2},
+            {"parenright", 1},
+               {"㋶", 0},
+         {"f", 2},
+            {"parenright", 1},
+               {"ⓕ", 0},
+         {"Greek_omicron", 1},
+            {"ὁ", 0},
+         {"Greek_eta", 1},
+            {"ἡ", 0},
+         {"kana_HE", 2},
+            {"parenright", 1},
+               {"㋬", 0},
+         {"Greek_rho", 1},
+            {"ῥ", 0},
+         {"kana_KO", 2},
+            {"parenright", 1},
+               {"㋙", 0},
+         {"d", 2},
+            {"parenright", 1},
+               {"ⓓ", 0},
+         {"kana_NE", 2},
+            {"parenright", 1},
+               {"㋧", 0},
+         {"D", 2},
+            {"parenright", 1},
+               {"Ⓓ", 0},
+         {"kana_FU", 2},
+            {"parenright", 1},
+               {"㋫", 0},
+         {"6", 2},
+            {"parenright", 1},
+               {"⑥", 0},
+         {"Greek_alpha", 1},
+            {"ἁ", 0},
+         {"kana_A", 2},
+            {"parenright", 1},
+               {"㋐", 0},
+         {"w", 2},
+            {"parenright", 1},
+               {"ⓦ", 0},
+         {"Greek_ETA", 1},
+            {"Ἡ", 0},
+         {"4", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"㊶", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"㊹", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"㊻", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"㊽", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"㊾", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"㊷", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"㊼", 0},
+            {"parenright", 1},
+               {"④", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"㊼", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"㊽", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"㊶", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"㊸", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"㊷", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"㊻", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"㊹", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"㊸", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"㊵", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"㊷", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"㊺", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"㊺", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"㊾", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"㊵", 0},
+         {"kana_KU", 2},
+            {"parenright", 1},
+               {"㋗", 0},
+         {"KP_3", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"㉛", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"㉞", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"㊱", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"㊳", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"㊴", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"㉜", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"㊲", 0},
+            {"parenright", 1},
+               {"③", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"㊲", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"㊳", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"㉛", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"㉝", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"㉜", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"㊱", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"㉞", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"㉝", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"㉚", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"㉜", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"㉟", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"㉟", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"㊴", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"㉚", 0},
+         {"p", 2},
+            {"parenright", 1},
+               {"ⓟ", 0},
+         {"J", 2},
+            {"parenright", 1},
+               {"Ⓙ", 0},
+         {"kana_YA", 2},
+            {"parenright", 1},
+               {"㋳", 0},
+         {"v", 2},
+            {"parenright", 1},
+               {"ⓥ", 0},
+         {"P", 2},
+            {"parenright", 1},
+               {"Ⓟ", 0},
+         {"M", 2},
+            {"parenright", 1},
+               {"Ⓜ", 0},
+         {"O", 2},
+            {"parenright", 1},
+               {"Ⓞ", 0},
+         {"m", 2},
+            {"parenright", 1},
+               {"ⓜ", 0},
+         {"r", 2},
+            {"parenright", 1},
+               {"ⓡ", 0},
+         {"s", 2},
+            {"parenright", 1},
+               {"ⓢ", 0},
+         {"Z", 2},
+            {"parenright", 1},
+               {"Ⓩ", 0},
+         {"kana_U", 2},
+            {"parenright", 1},
+               {"㋒", 0},
+         {"KP_0", 2},
+            {"parenright", 1},
+               {"⓪", 0},
+         {"A", 2},
+            {"parenright", 1},
+               {"Ⓐ", 0},
+         {"R", 2},
+            {"parenright", 1},
+               {"Ⓡ", 0},
+         {"kana_TO", 2},
+            {"parenright", 1},
+               {"㋣", 0},
+         {"kana_TA", 2},
+            {"parenright", 1},
+               {"㋟", 0},
+         {"c", 2},
+            {"parenright", 1},
+               {"ⓒ", 0},
+         {"kana_RO", 2},
+            {"parenright", 1},
+               {"㋺", 0},
+         {"L", 2},
+            {"parenright", 1},
+               {"Ⓛ", 0},
+         {"Greek_EPSILON", 1},
+            {"Ἑ", 0},
+         {"KP_2", 65},
+            {"1", 2},
+               {"parenright", 1},
+                  {"㉑", 0},
+            {"KP_4", 2},
+               {"parenright", 1},
+                  {"㉔", 0},
+            {"KP_6", 2},
+               {"parenright", 1},
+                  {"㉖", 0},
+            {"KP_8", 2},
+               {"parenright", 1},
+                  {"㉘", 0},
+            {"KP_9", 2},
+               {"parenright", 1},
+                  {"㉙", 0},
+            {"KP_Space", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"7", 2},
+               {"parenright", 1},
+                  {"㉗", 0},
+            {"parenright", 1},
+               {"②", 0},
+            {"KP_7", 2},
+               {"parenright", 1},
+                  {"㉗", 0},
+            {"8", 2},
+               {"parenright", 1},
+                  {"㉘", 0},
+            {"KP_1", 2},
+               {"parenright", 1},
+                  {"㉑", 0},
+            {"3", 2},
+               {"parenright", 1},
+                  {"㉓", 0},
+            {"2", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"6", 2},
+               {"parenright", 1},
+                  {"㉖", 0},
+            {"4", 2},
+               {"parenright", 1},
+                  {"㉔", 0},
+            {"KP_3", 2},
+               {"parenright", 1},
+                  {"㉓", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"⑳", 0},
+            {"KP_2", 2},
+               {"parenright", 1},
+                  {"㉒", 0},
+            {"5", 2},
+               {"parenright", 1},
+                  {"㉕", 0},
+            {"KP_5", 2},
+               {"parenright", 1},
+                  {"㉕", 0},
+            {"9", 2},
+               {"parenright", 1},
+                  {"㉙", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"⑳", 0},
+         {"kana_O", 2},
+            {"parenright", 1},
+               {"㋔", 0},
+         {"kana_RI", 2},
+            {"parenright", 1},
+               {"㋷", 0},
+         {"T", 2},
+            {"parenright", 1},
+               {"Ⓣ", 0},
+         {"kana_KA", 2},
+            {"parenright", 1},
+               {"㋕", 0},
+         {"kana_MI", 2},
+            {"parenright", 1},
+               {"㋯", 0},
+         {"5", 8},
+            {"parenright", 1},
+               {"⑤", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"㊿", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"㊿", 0},
+         {"kana_KI", 2},
+            {"parenright", 1},
+               {"㋖", 0},
+         {"KP_5", 8},
+            {"parenright", 1},
+               {"⑤", 0},
+            {"KP_0", 2},
+               {"parenright", 1},
+                  {"㊿", 0},
+            {"0", 2},
+               {"parenright", 1},
+                  {"㊿", 0},
+         {"K", 2},
+            {"parenright", 1},
+               {"Ⓚ", 0},
+         {"9", 2},
+            {"parenright", 1},
+               {"⑨", 0},
+         {"kana_SO", 2},
+            {"parenright", 1},
+               {"㋞", 0},
+         {"B", 2},
+            {"parenright", 1},
+               {"Ⓑ", 0},
+         {"kana_TSU", 2},
+            {"parenright", 1},
+               {"㋡", 0},
+         {"0", 2},
+            {"parenright", 1},
+               {"⓪", 0},
+         {"kana_MO", 2},
+            {"parenright", 1},
+               {"㋲", 0},
+         {"Greek_omega", 1},
+            {"ὡ", 0},
+         {"kana_NO", 2},
+            {"parenright", 1},
+               {"㋨", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὡ", 0},
+         {"kana_NA", 2},
+            {"parenright", 1},
+               {"㋤", 0},
+         {"X", 2},
+            {"parenright", 1},
+               {"Ⓧ", 0},
+         {"parenleft", 1},
+            {"[", 0},
+         {"h", 2},
+            {"parenright", 1},
+               {"ⓗ", 0},
+         {"I", 2},
+            {"parenright", 1},
+               {"Ⓘ", 0},
+         {"N", 2},
+            {"parenright", 1},
+               {"Ⓝ", 0},
+         {"kana_SHI", 2},
+            {"parenright", 1},
+               {"㋛", 0},
+         {"U", 2},
+            {"parenright", 1},
+               {"Ⓤ", 0},
+         {"kana_RE", 2},
+            {"parenright", 1},
+               {"㋹", 0},
+         {"Greek_UPSILON", 1},
+            {"Ὑ", 0},
+      {"h", 2},
+         {"comma", 1},
+            {"ḩ", 0},
+      {"I", 28},
+         {"minus", 1},
+            {"Ī", 0},
+         {"period", 1},
+            {"İ", 0},
+         {"diaeresis", 1},
+            {"Ï", 0},
+         {"j", 1},
+            {"IJ", 0},
+         {"quotedbl", 1},
+            {"Ï", 0},
+         {"acute", 1},
+            {"Í", 0},
+         {"underscore", 1},
+            {"Ī", 0},
+         {"J", 1},
+            {"IJ", 0},
+         {"apostrophe", 1},
+            {"Í", 0},
+         {"comma", 1},
+            {"Į", 0},
+         {"asciitilde", 1},
+            {"Ĩ", 0},
+         {"greater", 1},
+            {"Î", 0},
+         {"grave", 1},
+            {"Ì", 0},
+         {"asciicircum", 1},
+            {"Î", 0},
+      {"N", 16},
+         {"less", 1},
+            {"Ň", 0},
+         {"o", 1},
+            {"№", 0},
+         {"equal", 1},
+            {"₦", 0},
+         {"G", 1},
+            {"Ŋ", 0},
+         {"apostrophe", 1},
+            {"Ń", 0},
+         {"O", 1},
+            {"№", 0},
+         {"comma", 1},
+            {"Ņ", 0},
+         {"asciitilde", 1},
+            {"Ñ", 0},
+      {"grave", 362},
+         {"W", 1},
+            {"Ẁ", 0},
+         {"dead_breve", 4},
+            {"a", 1},
+               {"ằ", 0},
+            {"A", 1},
+               {"Ằ", 0},
+         {"a", 1},
+            {"à", 0},
+         {"Greek_IOTA", 1},
+            {"Ὶ", 0},
+         {"Greek_iota", 1},
+            {"ὶ", 0},
+         {"dead_horn", 8},
+            {"o", 1},
+               {"ờ", 0},
+            {"u", 1},
+               {"ừ", 0},
+            {"O", 1},
+               {"Ờ", 0},
+            {"U", 1},
+               {"Ừ", 0},
+         {"dead_circumflex", 12},
+            {"a", 1},
+               {"ầ", 0},
+            {"e", 1},
+               {"ề", 0},
+            {"o", 1},
+               {"ồ", 0},
+            {"E", 1},
+               {"Ề", 0},
+            {"O", 1},
+               {"Ồ", 0},
+            {"A", 1},
+               {"Ầ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ὸ", 0},
+         {"Acircumflex", 1},
+            {"Ầ", 0},
+         {"Cyrillic_er", 1},
+            {"р̀", 0},
+         {"e", 1},
+            {"è", 0},
+         {"o", 1},
+            {"ò", 0},
+         {"Udiaeresis", 1},
+            {"Ǜ", 0},
+         {"Greek_upsilon", 1},
+            {"ὺ", 0},
+         {"uhorn", 1},
+            {"ừ", 0},
+         {"space", 1},
+            {"`", 0},
+         {"dead_macron", 8},
+            {"e", 1},
+               {"ḕ", 0},
+            {"o", 1},
+               {"ṑ", 0},
+            {"E", 1},
+               {"Ḕ", 0},
+            {"O", 1},
+               {"Ṑ", 0},
+         {"acircumflex", 1},
+            {"ầ", 0},
+         {"Ecircumflex", 1},
+            {"Ề", 0},
+         {"Cyrillic_I", 1},
+            {"Ѝ", 0},
+         {"y", 1},
+            {"ỳ", 0},
+         {"b", 4},
+            {"a", 1},
+               {"ằ", 0},
+            {"A", 1},
+               {"Ằ", 0},
+         {"Cyrillic_O", 1},
+            {"О̀", 0},
+         {"i", 1},
+            {"ì", 0},
+         {"n", 1},
+            {"ǹ", 0},
+         {"Cyrillic_a", 1},
+            {"а̀", 0},
+         {"parenright", 26},
+            {"Greek_IOTA", 1},
+               {"Ἲ", 0},
+            {"Greek_iota", 1},
+               {"ἲ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὂ", 0},
+            {"Greek_upsilon", 1},
+               {"ὒ", 0},
+            {"Greek_epsilon", 1},
+               {"ἒ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἂ", 0},
+            {"Greek_omicron", 1},
+               {"ὂ", 0},
+            {"Greek_eta", 1},
+               {"ἢ", 0},
+            {"Greek_alpha", 1},
+               {"ἂ", 0},
+            {"Greek_ETA", 1},
+               {"Ἢ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἒ", 0},
+            {"Greek_omega", 1},
+               {"ὢ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὢ", 0},
+         {"Ohorn", 1},
+            {"Ờ", 0},
+         {"ohorn", 1},
+            {"ờ", 0},
+         {"Cyrillic_ER", 1},
+            {"Р̀", 0},
+         {"Greek_epsilon", 1},
+            {"ὲ", 0},
+         {"Cyrillic_U", 1},
+            {"У̀", 0},
+         {"Ocircumflex", 1},
+            {"Ồ", 0},
+         {"omacron", 1},
+            {"ṑ", 0},
+         {"ocircumflex", 1},
+            {"ồ", 0},
+         {"u", 1},
+            {"ù", 0},
+         {"Greek_ALPHA", 1},
+            {"Ὰ", 0},
+         {"Cyrillic_ie", 1},
+            {"ѐ", 0},
+         {"emacron", 1},
+            {"ḕ", 0},
+         {"E", 1},
+            {"È", 0},
+         {"Greek_iotadieresis", 1},
+            {"ῒ", 0},
+         {"Y", 1},
+            {"Ỳ", 0},
+         {"Cyrillic_i", 1},
+            {"ѝ", 0},
+         {"dead_dasia", 28},
+            {"Greek_IOTA", 1},
+               {"Ἳ", 0},
+            {"Greek_iota", 1},
+               {"ἳ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὃ", 0},
+            {"Greek_upsilon", 1},
+               {"ὓ", 0},
+            {"Greek_epsilon", 1},
+               {"ἓ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἃ", 0},
+            {"Greek_omicron", 1},
+               {"ὃ", 0},
+            {"Greek_eta", 1},
+               {"ἣ", 0},
+            {"Greek_alpha", 1},
+               {"ἃ", 0},
+            {"Greek_ETA", 1},
+               {"Ἣ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἓ", 0},
+            {"Greek_omega", 1},
+               {"ὣ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὣ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὓ", 0},
+         {"Greek_upsilondieresis", 1},
+            {"ῢ", 0},
+         {"Greek_omicron", 1},
+            {"ὸ", 0},
+         {"Greek_eta", 1},
+            {"ὴ", 0},
+         {"Abreve", 1},
+            {"Ằ", 0},
+         {"dead_psili", 26},
+            {"Greek_IOTA", 1},
+               {"Ἲ", 0},
+            {"Greek_iota", 1},
+               {"ἲ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὂ", 0},
+            {"Greek_upsilon", 1},
+               {"ὒ", 0},
+            {"Greek_epsilon", 1},
+               {"ἒ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἂ", 0},
+            {"Greek_omicron", 1},
+               {"ὂ", 0},
+            {"Greek_eta", 1},
+               {"ἢ", 0},
+            {"Greek_alpha", 1},
+               {"ἂ", 0},
+            {"Greek_ETA", 1},
+               {"Ἢ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἒ", 0},
+            {"Greek_omega", 1},
+               {"ὢ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὢ", 0},
+         {"quotedbl", 8},
+            {"Greek_iota", 1},
+               {"ῒ", 0},
+            {"Greek_upsilon", 1},
+               {"ῢ", 0},
+            {"u", 1},
+               {"ǜ", 0},
+            {"U", 1},
+               {"Ǜ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ờ", 0},
+            {"u", 1},
+               {"ừ", 0},
+            {"O", 1},
+               {"Ờ", 0},
+            {"U", 1},
+               {"Ừ", 0},
+         {"Greek_alpha", 1},
+            {"ὰ", 0},
+         {"ecircumflex", 1},
+            {"ề", 0},
+         {"w", 1},
+            {"ẁ", 0},
+         {"Greek_ETA", 1},
+            {"Ὴ", 0},
+         {"Cyrillic_o", 1},
+            {"о̀", 0},
+         {"Emacron", 1},
+            {"Ḕ", 0},
+         {"underscore", 8},
+            {"e", 1},
+               {"ḕ", 0},
+            {"o", 1},
+               {"ṑ", 0},
+            {"E", 1},
+               {"Ḕ", 0},
+            {"O", 1},
+               {"Ṑ", 0},
+         {"O", 1},
+            {"Ò", 0},
+         {"abreve", 1},
+            {"ằ", 0},
+         {"macron", 8},
+            {"e", 1},
+               {"ḕ", 0},
+            {"o", 1},
+               {"ṑ", 0},
+            {"E", 1},
+               {"Ḕ", 0},
+            {"O", 1},
+               {"Ṑ", 0},
+         {"A", 1},
+            {"À", 0},
+         {"Greek_EPSILON", 1},
+            {"Ὲ", 0},
+         {"Cyrillic_A", 1},
+            {"А̀", 0},
+         {"Omacron", 1},
+            {"Ṑ", 0},
+         {"Cyrillic_IE", 1},
+            {"Ѐ", 0},
+         {"Greek_omega", 1},
+            {"ὼ", 0},
+         {"dead_diaeresis", 8},
+            {"Greek_iota", 1},
+               {"ῒ", 0},
+            {"Greek_upsilon", 1},
+               {"ῢ", 0},
+            {"u", 1},
+               {"ǜ", 0},
+            {"U", 1},
+               {"Ǜ", 0},
+         {"Uhorn", 1},
+            {"Ừ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὼ", 0},
+         {"parenleft", 28},
+            {"Greek_IOTA", 1},
+               {"Ἳ", 0},
+            {"Greek_iota", 1},
+               {"ἳ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὃ", 0},
+            {"Greek_upsilon", 1},
+               {"ὓ", 0},
+            {"Greek_epsilon", 1},
+               {"ἓ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἃ", 0},
+            {"Greek_omicron", 1},
+               {"ὃ", 0},
+            {"Greek_eta", 1},
+               {"ἣ", 0},
+            {"Greek_alpha", 1},
+               {"ἃ", 0},
+            {"Greek_ETA", 1},
+               {"Ἣ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἓ", 0},
+            {"Greek_omega", 1},
+               {"ὣ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὣ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὓ", 0},
+         {"udiaeresis", 1},
+            {"ǜ", 0},
+         {"I", 1},
+            {"Ì", 0},
+         {"N", 1},
+            {"Ǹ", 0},
+         {"grave", 24},
+            {"Cyrillic_er", 1},
+               {"р̏", 0},
+            {"Cyrillic_I", 1},
+               {"И̏", 0},
+            {"Cyrillic_O", 1},
+               {"О̏", 0},
+            {"Cyrillic_a", 1},
+               {"а̏", 0},
+            {"Cyrillic_ER", 1},
+               {"Р̏", 0},
+            {"Cyrillic_U", 1},
+               {"У̏", 0},
+            {"Cyrillic_ie", 1},
+               {"е̏", 0},
+            {"Cyrillic_i", 1},
+               {"и̏", 0},
+            {"Cyrillic_o", 1},
+               {"о̏", 0},
+            {"Cyrillic_A", 1},
+               {"А̏", 0},
+            {"Cyrillic_IE", 1},
+               {"Е̏", 0},
+            {"Cyrillic_u", 1},
+               {"у̏", 0},
+         {"U", 1},
+            {"Ù", 0},
+         {"Cyrillic_u", 1},
+            {"у̀", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ầ", 0},
+            {"e", 1},
+               {"ề", 0},
+            {"o", 1},
+               {"ồ", 0},
+            {"E", 1},
+               {"Ề", 0},
+            {"O", 1},
+               {"Ồ", 0},
+            {"A", 1},
+               {"Ầ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ὺ", 0},
+      {"U", 106},
+         {"minus", 1},
+            {"Ū", 0},
+         {"g", 1},
+            {"ğ", 0},
+         {"a", 1},
+            {"ă", 0},
+         {"Greek_IOTA", 1},
+            {"Ῐ", 0},
+         {"Greek_iota", 1},
+            {"ῐ", 0},
+         {"exclam", 4},
+            {"a", 1},
+               {"ặ", 0},
+            {"A", 1},
+               {"Ặ", 0},
+         {"e", 1},
+            {"ĕ", 0},
+         {"o", 1},
+            {"ŏ", 0},
+         {"Greek_upsilon", 1},
+            {"ῠ", 0},
+         {"diaeresis", 1},
+            {"Ü", 0},
+         {"dead_belowdot", 4},
+            {"a", 1},
+               {"ặ", 0},
+            {"A", 1},
+               {"Ặ", 0},
+         {"space", 5},
+            {"comma", 4},
+               {"e", 1},
+                  {"ḝ", 0},
+               {"E", 1},
+                  {"Ḝ", 0},
+         {"Cyrillic_I", 1},
+            {"Й", 0},
+         {"i", 1},
+            {"ĭ", 0},
+         {"Cyrillic_a", 1},
+            {"ӑ", 0},
+         {"Cyrillic_U", 1},
+            {"Ў", 0},
+         {"u", 1},
+            {"ŭ", 0},
+         {"G", 1},
+            {"Ğ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ᾰ", 0},
+         {"Cyrillic_ie", 1},
+            {"ӗ", 0},
+         {"E", 1},
+            {"Ĕ", 0},
+         {"Cyrillic_i", 1},
+            {"й", 0},
+         {"Cyrillic_zhe", 1},
+            {"ӂ", 0},
+         {"quotedbl", 1},
+            {"Ü", 0},
+         {"cedilla", 4},
+            {"e", 1},
+               {"ḝ", 0},
+            {"E", 1},
+               {"Ḝ", 0},
+         {"Greek_alpha", 1},
+            {"ᾰ", 0},
+         {"acute", 1},
+            {"Ú", 0},
+         {"underscore", 1},
+            {"Ū", 0},
+         {"apostrophe", 1},
+            {"Ú", 0},
+         {"O", 1},
+            {"Ŏ", 0},
+         {"asterisk", 1},
+            {"Ů", 0},
+         {"A", 1},
+            {"Ă", 0},
+         {"Cyrillic_A", 1},
+            {"Ӑ", 0},
+         {"comma", 1},
+            {"Ų", 0},
+         {"asciitilde", 1},
+            {"Ũ", 0},
+         {"greater", 1},
+            {"Û", 0},
+         {"Cyrillic_ZHE", 1},
+            {"Ӂ", 0},
+         {"Cyrillic_IE", 1},
+            {"Ӗ", 0},
+         {"dead_cedilla", 4},
+            {"e", 1},
+               {"ḝ", 0},
+            {"E", 1},
+               {"Ḝ", 0},
+         {"I", 1},
+            {"Ĭ", 0},
+         {"grave", 1},
+            {"Ù", 0},
+         {"U", 1},
+            {"Ŭ", 0},
+         {"Cyrillic_u", 1},
+            {"ў", 0},
+         {"asciicircum", 1},
+            {"Û", 0},
+         {"Greek_UPSILON", 1},
+            {"Ῠ", 0},
+      {"asciicircum", 214},
+         {"minus", 1},
+            {"¯", 0},
+         {"period", 1},
+            {"·", 0},
+         {"W", 1},
+            {"Ŵ", 0},
+         {"g", 1},
+            {"ĝ", 0},
+         {"a", 1},
+            {"â", 0},
+         {"1", 1},
+            {"¹", 0},
+         {"C", 1},
+            {"Ĉ", 0},
+         {"KP_4", 1},
+            {"⁴", 0},
+         {"exclam", 12},
+            {"a", 1},
+               {"ậ", 0},
+            {"e", 1},
+               {"ệ", 0},
+            {"o", 1},
+               {"ộ", 0},
+            {"E", 1},
+               {"Ệ", 0},
+            {"O", 1},
+               {"Ộ", 0},
+            {"A", 1},
+               {"Ậ", 0},
+         {"Cyrillic_er", 1},
+            {"р̂", 0},
+         {"o", 1},
+            {"ô", 0},
+         {"e", 1},
+            {"ê", 0},
+         {"KP_6", 1},
+            {"⁶", 0},
+         {"dead_belowdot", 12},
+            {"a", 1},
+               {"ậ", 0},
+            {"e", 1},
+               {"ệ", 0},
+            {"o", 1},
+               {"ộ", 0},
+            {"E", 1},
+               {"Ệ", 0},
+            {"O", 1},
+               {"Ộ", 0},
+            {"A", 1},
+               {"Ậ", 0},
+         {"space", 1},
+            {"^", 0},
+         {"KP_8", 1},
+            {"⁸", 0},
+         {"Cyrillic_I", 1},
+            {"И̂", 0},
+         {"y", 1},
+            {"ŷ", 0},
+         {"Cyrillic_O", 1},
+            {"О̂", 0},
+         {"i", 1},
+            {"î", 0},
+         {"KP_9", 1},
+            {"⁹", 0},
+         {"equal", 1},
+            {"⁼", 0},
+         {"KP_Space", 1},
+            {"²", 0},
+         {"7", 1},
+            {"⁷", 0},
+         {"Cyrillic_a", 1},
+            {"а̂", 0},
+         {"j", 1},
+            {"ĵ", 0},
+         {"parenright", 1},
+            {"⁾", 0},
+         {"Cyrillic_ER", 1},
+            {"Р̂", 0},
+         {"KP_7", 1},
+            {"⁷", 0},
+         {"underbar", 24},
+            {"a", 1},
+               {"ª", 0},
+            {"o", 1},
+               {"º", 0},
+            {"l", 1},
+               {"ˡ", 0},
+            {"y", 1},
+               {"ʸ", 0},
+            {"i", 1},
+               {"ⁱ", 0},
+            {"n", 1},
+               {"ⁿ", 0},
+            {"j", 1},
+               {"ʲ", 0},
+            {"x", 1},
+               {"ˣ", 0},
+            {"w", 1},
+               {"ʷ", 0},
+            {"r", 1},
+               {"ʳ", 0},
+            {"s", 1},
+               {"ˢ", 0},
+            {"h", 1},
+               {"ʰ", 0},
+         {"Cyrillic_U", 1},
+            {"У̂", 0},
+         {"u", 1},
+            {"û", 0},
+         {"z", 1},
+            {"ẑ", 0},
+         {"G", 1},
+            {"Ĝ", 0},
+         {"H", 1},
+            {"Ĥ", 0},
+         {"8", 1},
+            {"⁸", 0},
+         {"KP_1", 1},
+            {"¹", 0},
+         {"3", 1},
+            {"³", 0},
+         {"Cyrillic_ie", 1},
+            {"е̂", 0},
+         {"E", 1},
+            {"Ê", 0},
+         {"S", 1},
+            {"Ŝ", 0},
+         {"2", 1},
+            {"²", 0},
+         {"Y", 1},
+            {"Ŷ", 0},
+         {"Cyrillic_i", 1},
+            {"и̂", 0},
+         {"plus", 1},
+            {"⁺", 0},
+         {"6", 1},
+            {"⁶", 0},
+         {"w", 1},
+            {"ŵ", 0},
+         {"Cyrillic_o", 1},
+            {"о̂", 0},
+         {"4", 1},
+            {"⁴", 0},
+         {"KP_3", 1},
+            {"³", 0},
+         {"underscore", 24},
+            {"a", 1},
+               {"ª", 0},
+            {"o", 1},
+               {"º", 0},
+            {"l", 1},
+               {"ˡ", 0},
+            {"y", 1},
+               {"ʸ", 0},
+            {"i", 1},
+               {"ⁱ", 0},
+            {"n", 1},
+               {"ⁿ", 0},
+            {"j", 1},
+               {"ʲ", 0},
+            {"x", 1},
+               {"ˣ", 0},
+            {"w", 1},
+               {"ʷ", 0},
+            {"r", 1},
+               {"ʳ", 0},
+            {"s", 1},
+               {"ˢ", 0},
+            {"h", 1},
+               {"ʰ", 0},
+         {"J", 1},
+            {"Ĵ", 0},
+         {"O", 1},
+            {"Ô", 0},
+         {"s", 1},
+            {"ŝ", 0},
+         {"Z", 1},
+            {"Ẑ", 0},
+         {"KP_0", 1},
+            {"⁰", 0},
+         {"A", 1},
+            {"Â", 0},
+         {"c", 1},
+            {"ĉ", 0},
+         {"KP_Add", 1},
+            {"⁺", 0},
+         {"KP_2", 1},
+            {"²", 0},
+         {"Cyrillic_A", 1},
+            {"А̂", 0},
+         {"slash", 1},
+            {"|", 0},
+         {"5", 1},
+            {"⁵", 0},
+         {"KP_5", 1},
+            {"⁵", 0},
+         {"9", 1},
+            {"⁹", 0},
+         {"Cyrillic_IE", 1},
+            {"Е̂", 0},
+         {"0", 1},
+            {"⁰", 0},
+         {"parenleft", 1},
+            {"⁽", 0},
+         {"h", 1},
+            {"ĥ", 0},
+         {"I", 1},
+            {"Î", 0},
+         {"U", 1},
+            {"Û", 0},
+         {"Cyrillic_u", 1},
+            {"у̂", 0},
+         {"KP_Equal", 1},
+            {"⁼", 0},
+      {"Greek_UPSILON", 4},
+         {"quotedbl", 1},
+            {"Ϋ", 0},
+         {"apostrophe", 1},
+            {"Ύ", 0},
+   {"dead_belowcircumflex", 24},
+      {"e", 1},
+         {"ḙ", 0},
+      {"l", 1},
+         {"ḽ", 0},
+      {"t", 1},
+         {"ṱ", 0},
+      {"n", 1},
+         {"ṋ", 0},
+      {"u", 1},
+         {"ṷ", 0},
+      {"E", 1},
+         {"Ḙ", 0},
+      {"d", 1},
+         {"ḓ", 0},
+      {"D", 1},
+         {"Ḓ", 0},
+      {"L", 1},
+         {"Ḽ", 0},
+      {"T", 1},
+         {"Ṱ", 0},
+      {"N", 1},
+         {"Ṋ", 0},
+      {"U", 1},
+         {"Ṷ", 0},
+   {"dead_caron", 134},
+      {"minus", 1},
+         {"₋", 0},
+      {"g", 1},
+         {"ǧ", 0},
+      {"a", 1},
+         {"ǎ", 0},
+      {"1", 1},
+         {"₁", 0},
+      {"ezh", 1},
+         {"ǯ", 0},
+      {"C", 1},
+         {"Č", 0},
+      {"e", 1},
+         {"ě", 0},
+      {"o", 1},
+         {"ǒ", 0},
+      {"l", 1},
+         {"ľ", 0},
+      {"Udiaeresis", 1},
+         {"Ǚ", 0},
+      {"t", 1},
+         {"ť", 0},
+      {"space", 1},
+         {"ˇ", 0},
+      {"Multi_key", 5},
+         {"quotedbl", 4},
+            {"u", 1},
+               {"ǚ", 0},
+            {"U", 1},
+               {"Ǚ", 0},
+      {"i", 1},
+         {"ǐ", 0},
+      {"k", 1},
+         {"ǩ", 0},
+      {"n", 1},
+         {"ň", 0},
+      {"equal", 1},
+         {"₌", 0},
+      {"dead_caron", 1},
+         {"ˇ", 0},
+      {"7", 1},
+         {"₇", 0},
+      {"j", 1},
+         {"ǰ", 0},
+      {"parenright", 1},
+         {"₎", 0},
+      {"sabovedot", 1},
+         {"ṧ", 0},
+      {"nobreakspace", 1},
+         {"̌", 0},
+      {"V", 1},
+         {"Ǚ", 0},
+      {"u", 1},
+         {"ǔ", 0},
+      {"z", 1},
+         {"ž", 0},
+      {"G", 1},
+         {"Ǧ", 0},
+      {"H", 1},
+         {"Ȟ", 0},
+      {"8", 1},
+         {"₈", 0},
+      {"3", 1},
+         {"₃", 0},
+      {"E", 1},
+         {"Ě", 0},
+      {"S", 1},
+         {"Š", 0},
+      {"2", 1},
+         {"₂", 0},
+      {"d", 1},
+         {"ď", 0},
+      {"D", 1},
+         {"Ď", 0},
+      {"plus", 1},
+         {"₊", 0},
+      {"6", 1},
+         {"₆", 0},
+      {"dead_abovedot", 4},
+         {"S", 1},
+            {"Ṧ", 0},
+         {"s", 1},
+            {"ṧ", 0},
+      {"4", 1},
+         {"₄", 0},
+      {"v", 1},
+         {"ǚ", 0},
+      {"O", 1},
+         {"Ǒ", 0},
+      {"r", 1},
+         {"ř", 0},
+      {"s", 1},
+         {"š", 0},
+      {"Z", 1},
+         {"Ž", 0},
+      {"EZH", 1},
+         {"Ǯ", 0},
+      {"A", 1},
+         {"Ǎ", 0},
+      {"R", 1},
+         {"Ř", 0},
+      {"c", 1},
+         {"č", 0},
+      {"L", 1},
+         {"Ľ", 0},
+      {"T", 1},
+         {"Ť", 0},
+      {"5", 1},
+         {"₅", 0},
+      {"K", 1},
+         {"Ǩ", 0},
+      {"9", 1},
+         {"₉", 0},
+      {"0", 1},
+         {"₀", 0},
+      {"Sabovedot", 1},
+         {"Ṧ", 0},
+      {"dead_diaeresis", 4},
+         {"u", 1},
+            {"ǚ", 0},
+         {"U", 1},
+            {"Ǚ", 0},
+      {"parenleft", 1},
+         {"₍", 0},
+      {"h", 1},
+         {"ȟ", 0},
+      {"udiaeresis", 1},
+         {"ǚ", 0},
+      {"I", 1},
+         {"Ǐ", 0},
+      {"N", 1},
+         {"Ň", 0},
+      {"U", 1},
+         {"Ǔ", 0},
+   {"dead_tilde", 266},
+      {"dead_breve", 4},
+         {"a", 1},
+            {"ẵ", 0},
+         {"A", 1},
+            {"Ẵ", 0},
+      {"a", 1},
+         {"ã", 0},
+      {"Greek_iota", 1},
+         {"ῖ", 0},
+      {"dead_horn", 8},
+         {"o", 1},
+            {"ỡ", 0},
+         {"u", 1},
+            {"ữ", 0},
+         {"O", 1},
+            {"Ỡ", 0},
+         {"U", 1},
+            {"Ữ", 0},
+      {"dead_circumflex", 12},
+         {"a", 1},
+            {"ẫ", 0},
+         {"e", 1},
+            {"ễ", 0},
+         {"o", 1},
+            {"ỗ", 0},
+         {"E", 1},
+            {"Ễ", 0},
+         {"O", 1},
+            {"Ỗ", 0},
+         {"A", 1},
+            {"Ẫ", 0},
+      {"Acircumflex", 1},
+         {"Ẫ", 0},
+      {"less", 1},
+         {"≲", 0},
+      {"Oacute", 1},
+         {"Ṍ", 0},
+      {"e", 1},
+         {"ẽ", 0},
+      {"o", 1},
+         {"õ", 0},
+      {"Greek_upsilon", 1},
+         {"ῦ", 0},
+      {"uhorn", 1},
+         {"ữ", 0},
+      {"space", 1},
+         {"~", 0},
+      {"dead_macron", 4},
+         {"o", 1},
+            {"ȭ", 0},
+         {"O", 1},
+            {"Ȭ", 0},
+      {"acircumflex", 1},
+         {"ẫ", 0},
+      {"Ecircumflex", 1},
+         {"Ễ", 0},
+      {"y", 1},
+         {"ỹ", 0},
+      {"Multi_key", 77},
+         {"b", 4},
+            {"a", 1},
+               {"ẵ", 0},
+            {"A", 1},
+               {"Ẵ", 0},
+         {"parenright", 18},
+            {"Greek_IOTA", 1},
+               {"Ἶ", 0},
+            {"Greek_iota", 1},
+               {"ἶ", 0},
+            {"Greek_upsilon", 1},
+               {"ὖ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἆ", 0},
+            {"Greek_eta", 1},
+               {"ἦ", 0},
+            {"Greek_alpha", 1},
+               {"ἆ", 0},
+            {"Greek_ETA", 1},
+               {"Ἦ", 0},
+            {"Greek_omega", 1},
+               {"ὦ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὦ", 0},
+         {"quotedbl", 4},
+            {"Greek_iota", 1},
+               {"ῗ", 0},
+            {"Greek_upsilon", 1},
+               {"ῧ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ỡ", 0},
+            {"u", 1},
+               {"ữ", 0},
+            {"O", 1},
+               {"Ỡ", 0},
+            {"U", 1},
+               {"Ữ", 0},
+         {"parenleft", 20},
+            {"Greek_IOTA", 1},
+               {"Ἷ", 0},
+            {"Greek_iota", 1},
+               {"ἷ", 0},
+            {"Greek_upsilon", 1},
+               {"ὗ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἇ", 0},
+            {"Greek_eta", 1},
+               {"ἧ", 0},
+            {"Greek_alpha", 1},
+               {"ἇ", 0},
+            {"Greek_ETA", 1},
+               {"Ἧ", 0},
+            {"Greek_omega", 1},
+               {"ὧ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὧ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὗ", 0},
+         {"U", 4},
+            {"a", 1},
+               {"ẵ", 0},
+            {"A", 1},
+               {"Ẵ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ẫ", 0},
+            {"e", 1},
+               {"ễ", 0},
+            {"o", 1},
+               {"ỗ", 0},
+            {"E", 1},
+               {"Ễ", 0},
+            {"O", 1},
+               {"Ỗ", 0},
+            {"A", 1},
+               {"Ẫ", 0},
+      {"oacute", 1},
+         {"ṍ", 0},
+      {"i", 1},
+         {"ĩ", 0},
+      {"n", 1},
+         {"ñ", 0},
+      {"equal", 1},
+         {"≃", 0},
+      {"dead_tilde", 1},
+         {"~", 0},
+      {"Uacute", 1},
+         {"Ṹ", 0},
+      {"Ohorn", 1},
+         {"Ỡ", 0},
+      {"ohorn", 1},
+         {"ỡ", 0},
+      {"nobreakspace", 1},
+         {"̃", 0},
+      {"V", 1},
+         {"Ṽ", 0},
+      {"Ocircumflex", 1},
+         {"Ỗ", 0},
+      {"omacron", 1},
+         {"ȭ", 0},
+      {"uacute", 1},
+         {"ṹ", 0},
+      {"ocircumflex", 1},
+         {"ỗ", 0},
+      {"u", 1},
+         {"ũ", 0},
+      {"E", 1},
+         {"Ẽ", 0},
+      {"Greek_iotadieresis", 1},
+         {"ῗ", 0},
+      {"Y", 1},
+         {"Ỹ", 0},
+      {"dead_dasia", 20},
+         {"Greek_IOTA", 1},
+            {"Ἷ", 0},
+         {"Greek_iota", 1},
+            {"ἷ", 0},
+         {"Greek_upsilon", 1},
+            {"ὗ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἇ", 0},
+         {"Greek_eta", 1},
+            {"ἧ", 0},
+         {"Greek_alpha", 1},
+            {"ἇ", 0},
+         {"Greek_ETA", 1},
+            {"Ἧ", 0},
+         {"Greek_omega", 1},
+            {"ὧ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὧ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ὗ", 0},
+      {"Greek_upsilondieresis", 1},
+         {"ῧ", 0},
+      {"odiaeresis", 1},
+         {"ṏ", 0},
+      {"Greek_eta", 1},
+         {"ῆ", 0},
+      {"Abreve", 1},
+         {"Ẵ", 0},
+      {"dead_psili", 18},
+         {"Greek_IOTA", 1},
+            {"Ἶ", 0},
+         {"Greek_iota", 1},
+            {"ἶ", 0},
+         {"Greek_upsilon", 1},
+            {"ὖ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἆ", 0},
+         {"Greek_eta", 1},
+            {"ἦ", 0},
+         {"Greek_alpha", 1},
+            {"ἆ", 0},
+         {"Greek_ETA", 1},
+            {"Ἦ", 0},
+         {"Greek_omega", 1},
+            {"ὦ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὦ", 0},
+      {"Greek_alpha", 1},
+         {"ᾶ", 0},
+      {"ecircumflex", 1},
+         {"ễ", 0},
+      {"v", 1},
+         {"ṽ", 0},
+      {"O", 1},
+         {"Õ", 0},
+      {"abreve", 1},
+         {"ẵ", 0},
+      {"A", 1},
+         {"Ã", 0},
+      {"Odiaeresis", 1},
+         {"Ṏ", 0},
+      {"greater", 1},
+         {"≳", 0},
+      {"Omacron", 1},
+         {"Ȭ", 0},
+      {"Greek_omega", 1},
+         {"ῶ", 0},
+      {"dead_diaeresis", 8},
+         {"Greek_iota", 1},
+            {"ῗ", 0},
+         {"o", 1},
+            {"ṏ", 0},
+         {"Greek_upsilon", 1},
+            {"ῧ", 0},
+         {"O", 1},
+            {"Ṏ", 0},
+      {"Uhorn", 1},
+         {"Ữ", 0},
+      {"dead_acute", 8},
+         {"o", 1},
+            {"ṍ", 0},
+         {"u", 1},
+            {"ṹ", 0},
+         {"O", 1},
+            {"Ṍ", 0},
+         {"U", 1},
+            {"Ṹ", 0},
+      {"I", 1},
+         {"Ĩ", 0},
+      {"N", 1},
+         {"Ñ", 0},
+      {"U", 1},
+         {"Ũ", 0},
+   {"dead_belowcomma", 14},
+      {"t", 1},
+         {"ț", 0},
+      {"space", 1},
+         {",", 0},
+      {"dead_belowcomma", 1},
+         {",", 0},
+      {"nobreakspace", 1},
+         {"̦", 0},
+      {"S", 1},
+         {"Ș", 0},
+      {"s", 1},
+         {"ș", 0},
+      {"T", 1},
+         {"Ț", 0},
+   {"dead_doubleacute", 18},
+      {"o", 1},
+         {"ő", 0},
+      {"space", 1},
+         {"˝", 0},
+      {"Cyrillic_U", 1},
+         {"Ӳ", 0},
+      {"dead_doubleacute", 1},
+         {"˝", 0},
+      {"nobreakspace", 1},
+         {"̋", 0},
+      {"u", 1},
+         {"ű", 0},
+      {"O", 1},
+         {"Ő", 0},
+      {"U", 1},
+         {"Ű", 0},
+      {"Cyrillic_u", 1},
+         {"ӳ", 0},
+   {"dead_abovering", 27},
+      {"a", 1},
+         {"å", 0},
+      {"space", 1},
+         {"°", 0},
+      {"y", 1},
+         {"ẙ", 0},
+      {"dead_abovering", 1},
+         {"°", 0},
+      {"nobreakspace", 1},
+         {"̊", 0},
+      {"u", 1},
+         {"ů", 0},
+      {"w", 1},
+         {"ẘ", 0},
+      {"A", 1},
+         {"Å", 0},
+      {"Aacute", 1},
+         {"Ǻ", 0},
+      {"aacute", 1},
+         {"ǻ", 0},
+      {"dead_acute", 4},
+         {"a", 1},
+            {"ǻ", 0},
+         {"A", 1},
+            {"Ǻ", 0},
+      {"U", 1},
+         {"Ů", 0},
+   {"Greek_accentdieresis", 4},
+      {"Greek_iota", 1},
+         {"ΐ", 0},
+      {"Greek_upsilon", 1},
+         {"ΰ", 0},
+   {"dead_voiced_sound", 46},
+      {"kana_KE", 1},
+         {"ゲ", 0},
+      {"kana_SA", 1},
+         {"ザ", 0},
+      {"kana_SE", 1},
+         {"ゼ", 0},
+      {"kana_SU", 1},
+         {"ズ", 0},
+      {"kana_WO", 1},
+         {"ヺ", 0},
+      {"kana_TE", 1},
+         {"デ", 0},
+      {"kana_HO", 1},
+         {"ボ", 0},
+      {"kana_HI", 1},
+         {"ビ", 0},
+      {"kana_WA", 1},
+         {"ヷ", 0},
+      {"kana_CHI", 1},
+         {"ヂ", 0},
+      {"kana_HA", 1},
+         {"バ", 0},
+      {"kana_HE", 1},
+         {"ベ", 0},
+      {"kana_KO", 1},
+         {"ゴ", 0},
+      {"kana_FU", 1},
+         {"ブ", 0},
+      {"kana_KU", 1},
+         {"グ", 0},
+      {"kana_U", 1},
+         {"ヴ", 0},
+      {"kana_TO", 1},
+         {"ド", 0},
+      {"kana_TA", 1},
+         {"ダ", 0},
+      {"kana_KA", 1},
+         {"ガ", 0},
+      {"kana_KI", 1},
+         {"ギ", 0},
+      {"kana_SO", 1},
+         {"ゾ", 0},
+      {"kana_TSU", 1},
+         {"ヅ", 0},
+      {"kana_SHI", 1},
+         {"ジ", 0},
+   {"dead_belowtilde", 14},
+      {"e", 1},
+         {"ḛ", 0},
+      {"i", 1},
+         {"ḭ", 0},
+      {"u", 1},
+         {"ṵ", 0},
+      {"E", 1},
+         {"Ḛ", 0},
+      {"plus", 1},
+         {"⨦", 0},
+      {"I", 1},
+         {"Ḭ", 0},
+      {"U", 1},
+         {"Ṵ", 0},
+   {"dead_ogonek", 35},
+      {"a", 1},
+         {"ą", 0},
+      {"e", 1},
+         {"ę", 0},
+      {"o", 1},
+         {"ǫ", 0},
+      {"space", 1},
+         {"˛", 0},
+      {"dead_macron", 4},
+         {"o", 1},
+            {"ǭ", 0},
+         {"O", 1},
+            {"Ǭ", 0},
+      {"i", 1},
+         {"į", 0},
+      {"nobreakspace", 1},
+         {"̨", 0},
+      {"omacron", 1},
+         {"ǭ", 0},
+      {"u", 1},
+         {"ų", 0},
+      {"E", 1},
+         {"Ę", 0},
+      {"dead_ogonek", 1},
+         {"˛", 0},
+      {"O", 1},
+         {"Ǫ", 0},
+      {"A", 1},
+         {"Ą", 0},
+      {"Omacron", 1},
+         {"Ǭ", 0},
+      {"I", 1},
+         {"Į", 0},
+      {"U", 1},
+         {"Ų", 0},
+   {"dead_dasia", 32},
+      {"Greek_IOTA", 1},
+         {"Ἱ", 0},
+      {"Greek_iota", 1},
+         {"ἱ", 0},
+      {"Greek_OMICRON", 1},
+         {"Ὁ", 0},
+      {"Greek_upsilon", 1},
+         {"ὑ", 0},
+      {"Greek_RHO", 1},
+         {"Ῥ", 0},
+      {"Greek_epsilon", 1},
+         {"ἑ", 0},
+      {"Greek_ALPHA", 1},
+         {"Ἁ", 0},
+      {"Greek_omicron", 1},
+         {"ὁ", 0},
+      {"Greek_eta", 1},
+         {"ἡ", 0},
+      {"Greek_rho", 1},
+         {"ῥ", 0},
+      {"Greek_alpha", 1},
+         {"ἁ", 0},
+      {"Greek_ETA", 1},
+         {"Ἡ", 0},
+      {"Greek_EPSILON", 1},
+         {"Ἑ", 0},
+      {"Greek_omega", 1},
+         {"ὡ", 0},
+      {"Greek_OMEGA", 1},
+         {"Ὡ", 0},
+      {"Greek_UPSILON", 1},
+         {"Ὑ", 0},
+   {"dead_iota", 491},
+      {"dead_grave", 59},
+         {"Multi_key", 26},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾊ", 0},
+               {"Greek_eta", 1},
+                  {"ᾒ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾂ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾚ", 0},
+               {"Greek_omega", 1},
+                  {"ᾢ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾪ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾋ", 0},
+               {"Greek_eta", 1},
+                  {"ᾓ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾃ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾛ", 0},
+               {"Greek_omega", 1},
+                  {"ᾣ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾫ", 0},
+         {"dead_dasia", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾋ", 0},
+            {"Greek_eta", 1},
+               {"ᾓ", 0},
+            {"Greek_alpha", 1},
+               {"ᾃ", 0},
+            {"Greek_ETA", 1},
+               {"ᾛ", 0},
+            {"Greek_omega", 1},
+               {"ᾣ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾫ", 0},
+         {"Greek_eta", 1},
+            {"ῂ", 0},
+         {"dead_psili", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾊ", 0},
+            {"Greek_eta", 1},
+               {"ᾒ", 0},
+            {"Greek_alpha", 1},
+               {"ᾂ", 0},
+            {"Greek_ETA", 1},
+               {"ᾚ", 0},
+            {"Greek_omega", 1},
+               {"ᾢ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾪ", 0},
+         {"Greek_alpha", 1},
+            {"ᾲ", 0},
+         {"Greek_omega", 1},
+            {"ῲ", 0},
+      {"space", 1},
+         {"ͺ", 0},
+      {"Multi_key", 262},
+         {"parenright", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾈ", 0},
+            {"Greek_eta", 1},
+               {"ᾐ", 0},
+            {"Greek_alpha", 1},
+               {"ᾀ", 0},
+            {"Greek_ETA", 1},
+               {"ᾘ", 0},
+            {"Greek_omega", 1},
+               {"ᾠ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾨ", 0},
+         {"acute", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+            {"Greek_eta", 1},
+               {"ῄ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"Greek_alpha", 1},
+               {"ᾴ", 0},
+            {"Greek_omega", 1},
+               {"ῴ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+         {"apostrophe", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+            {"Greek_eta", 1},
+               {"ῄ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"Greek_alpha", 1},
+               {"ᾴ", 0},
+            {"Greek_omega", 1},
+               {"ῴ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+         {"asciitilde", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾎ", 0},
+               {"Greek_eta", 1},
+                  {"ᾖ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾆ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾞ", 0},
+               {"Greek_omega", 1},
+                  {"ᾦ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾮ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾏ", 0},
+               {"Greek_eta", 1},
+                  {"ᾗ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾇ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾟ", 0},
+               {"Greek_omega", 1},
+                  {"ᾧ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾯ", 0},
+            {"Greek_eta", 1},
+               {"ῇ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾎ", 0},
+               {"Greek_eta", 1},
+                  {"ᾖ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾆ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾞ", 0},
+               {"Greek_omega", 1},
+                  {"ᾦ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾮ", 0},
+            {"Greek_alpha", 1},
+               {"ᾷ", 0},
+            {"Greek_omega", 1},
+               {"ῷ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾏ", 0},
+               {"Greek_eta", 1},
+                  {"ᾗ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾇ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾟ", 0},
+               {"Greek_omega", 1},
+                  {"ᾧ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾯ", 0},
+         {"parenleft", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾉ", 0},
+            {"Greek_eta", 1},
+               {"ᾑ", 0},
+            {"Greek_alpha", 1},
+               {"ᾁ", 0},
+            {"Greek_ETA", 1},
+               {"ᾙ", 0},
+            {"Greek_omega", 1},
+               {"ᾡ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾩ", 0},
+         {"grave", 58},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾊ", 0},
+               {"Greek_eta", 1},
+                  {"ᾒ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾂ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾚ", 0},
+               {"Greek_omega", 1},
+                  {"ᾢ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾪ", 0},
+            {"dead_dasia", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾋ", 0},
+               {"Greek_eta", 1},
+                  {"ᾓ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾃ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾛ", 0},
+               {"Greek_omega", 1},
+                  {"ᾣ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾫ", 0},
+            {"Greek_eta", 1},
+               {"ῂ", 0},
+            {"dead_psili", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾊ", 0},
+               {"Greek_eta", 1},
+                  {"ᾒ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾂ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾚ", 0},
+               {"Greek_omega", 1},
+                  {"ᾢ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾪ", 0},
+            {"Greek_alpha", 1},
+               {"ᾲ", 0},
+            {"Greek_omega", 1},
+               {"ῲ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾋ", 0},
+               {"Greek_eta", 1},
+                  {"ᾓ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾃ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾛ", 0},
+               {"Greek_omega", 1},
+                  {"ᾣ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾫ", 0},
+      {"dead_tilde", 59},
+         {"Multi_key", 26},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾎ", 0},
+               {"Greek_eta", 1},
+                  {"ᾖ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾆ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾞ", 0},
+               {"Greek_omega", 1},
+                  {"ᾦ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾮ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾏ", 0},
+               {"Greek_eta", 1},
+                  {"ᾗ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾇ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾟ", 0},
+               {"Greek_omega", 1},
+                  {"ᾧ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾯ", 0},
+         {"dead_dasia", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾏ", 0},
+            {"Greek_eta", 1},
+               {"ᾗ", 0},
+            {"Greek_alpha", 1},
+               {"ᾇ", 0},
+            {"Greek_ETA", 1},
+               {"ᾟ", 0},
+            {"Greek_omega", 1},
+               {"ᾧ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾯ", 0},
+         {"Greek_eta", 1},
+            {"ῇ", 0},
+         {"dead_psili", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾎ", 0},
+            {"Greek_eta", 1},
+               {"ᾖ", 0},
+            {"Greek_alpha", 1},
+               {"ᾆ", 0},
+            {"Greek_ETA", 1},
+               {"ᾞ", 0},
+            {"Greek_omega", 1},
+               {"ᾦ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾮ", 0},
+         {"Greek_alpha", 1},
+            {"ᾷ", 0},
+         {"Greek_omega", 1},
+            {"ῷ", 0},
+      {"Greek_ALPHA", 1},
+         {"ᾼ", 0},
+      {"dead_dasia", 12},
+         {"Greek_ALPHA", 1},
+            {"ᾉ", 0},
+         {"Greek_eta", 1},
+            {"ᾑ", 0},
+         {"Greek_alpha", 1},
+            {"ᾁ", 0},
+         {"Greek_ETA", 1},
+            {"ᾙ", 0},
+         {"Greek_omega", 1},
+            {"ᾡ", 0},
+         {"Greek_OMEGA", 1},
+            {"ᾩ", 0},
+      {"Greek_eta", 1},
+         {"ῃ", 0},
+      {"dead_iota", 1},
+         {"ͺ", 0},
+      {"dead_psili", 12},
+         {"Greek_ALPHA", 1},
+            {"ᾈ", 0},
+         {"Greek_eta", 1},
+            {"ᾐ", 0},
+         {"Greek_alpha", 1},
+            {"ᾀ", 0},
+         {"Greek_ETA", 1},
+            {"ᾘ", 0},
+         {"Greek_omega", 1},
+            {"ᾠ", 0},
+         {"Greek_OMEGA", 1},
+            {"ᾨ", 0},
+      {"Greek_alpha", 1},
+         {"ᾳ", 0},
+      {"Greek_ETA", 1},
+         {"ῌ", 0},
+      {"Greek_omegaaccent", 1},
+         {"ῴ", 0},
+      {"Greek_omega", 1},
+         {"ῳ", 0},
+      {"Greek_OMEGA", 1},
+         {"ῼ", 0},
+      {"dead_acute", 59},
+         {"Multi_key", 26},
+            {"parenright", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾌ", 0},
+               {"Greek_eta", 1},
+                  {"ᾔ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾄ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾜ", 0},
+               {"Greek_omega", 1},
+                  {"ᾤ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾬ", 0},
+            {"parenleft", 12},
+               {"Greek_ALPHA", 1},
+                  {"ᾍ", 0},
+               {"Greek_eta", 1},
+                  {"ᾕ", 0},
+               {"Greek_alpha", 1},
+                  {"ᾅ", 0},
+               {"Greek_ETA", 1},
+                  {"ᾝ", 0},
+               {"Greek_omega", 1},
+                  {"ᾥ", 0},
+               {"Greek_OMEGA", 1},
+                  {"ᾭ", 0},
+         {"dead_dasia", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾍ", 0},
+            {"Greek_eta", 1},
+               {"ᾕ", 0},
+            {"Greek_alpha", 1},
+               {"ᾅ", 0},
+            {"Greek_ETA", 1},
+               {"ᾝ", 0},
+            {"Greek_omega", 1},
+               {"ᾥ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾭ", 0},
+         {"Greek_eta", 1},
+            {"ῄ", 0},
+         {"dead_psili", 12},
+            {"Greek_ALPHA", 1},
+               {"ᾌ", 0},
+            {"Greek_eta", 1},
+               {"ᾔ", 0},
+            {"Greek_alpha", 1},
+               {"ᾄ", 0},
+            {"Greek_ETA", 1},
+               {"ᾜ", 0},
+            {"Greek_omega", 1},
+               {"ᾤ", 0},
+            {"Greek_OMEGA", 1},
+               {"ᾬ", 0},
+         {"Greek_alpha", 1},
+            {"ᾴ", 0},
+         {"Greek_omega", 1},
+            {"ῴ", 0},
+      {"Greek_alphaaccent", 1},
+         {"ᾴ", 0},
+      {"Greek_etaaccent", 1},
+         {"ῄ", 0},
+   {"dead_greek", 121},
+      {"W", 1},
+         {"Ω", 0},
+      {"g", 1},
+         {"γ", 0},
+      {"a", 1},
+         {"α", 0},
+      {"e", 1},
+         {"ε", 0},
+      {"F", 1},
+         {"Φ", 0},
+      {"o", 1},
+         {"ο", 0},
+      {"l", 1},
+         {"λ", 0},
+      {"t", 1},
+         {"τ", 0},
+      {"space", 1},
+         {"µ", 0},
+      {"dead_macron", 12},
+         {"a", 1},
+            {"ᾱ", 0},
+         {"i", 1},
+            {"ῑ", 0},
+         {"u", 1},
+            {"ῡ", 0},
+         {"A", 1},
+            {"Ᾱ", 0},
+         {"I", 1},
+            {"Ῑ", 0},
+         {"U", 1},
+            {"Ῡ", 0},
+      {"Q", 1},
+         {"Χ", 0},
+      {"y", 1},
+         {"ψ", 0},
+      {"b", 1},
+         {"β", 0},
+      {"i", 1},
+         {"ι", 0},
+      {"k", 1},
+         {"κ", 0},
+      {"n", 1},
+         {"ν", 0},
+      {"j", 1},
+         {"θ", 0},
+      {"x", 1},
+         {"ξ", 0},
+      {"q", 1},
+         {"χ", 0},
+      {"nobreakspace", 1},
+         {"µ", 0},
+      {"u", 1},
+         {"υ", 0},
+      {"z", 1},
+         {"ζ", 0},
+      {"G", 1},
+         {"Γ", 0},
+      {"H", 1},
+         {"Η", 0},
+      {"E", 1},
+         {"Ε", 0},
+      {"S", 1},
+         {"Σ", 0},
+      {"Y", 1},
+         {"Ψ", 0},
+      {"f", 1},
+         {"φ", 0},
+      {"d", 1},
+         {"δ", 0},
+      {"dead_greek", 1},
+         {"µ", 0},
+      {"D", 1},
+         {"Δ", 0},
+      {"w", 1},
+         {"ω", 0},
+      {"p", 1},
+         {"π", 0},
+      {"J", 1},
+         {"Θ", 0},
+      {"P", 1},
+         {"Π", 0},
+      {"M", 1},
+         {"Μ", 0},
+      {"O", 1},
+         {"Ο", 0},
+      {"m", 1},
+         {"μ", 0},
+      {"r", 1},
+         {"ρ", 0},
+      {"s", 1},
+         {"σ", 0},
+      {"Z", 1},
+         {"Ζ", 0},
+      {"dead_stroke", 2},
+         {"r", 1},
+            {"ϼ", 0},
+      {"A", 1},
+         {"Α", 0},
+      {"R", 1},
+         {"Ρ", 0},
+      {"L", 1},
+         {"Λ", 0},
+      {"T", 1},
+         {"Τ", 0},
+      {"dead_hook", 2},
+         {"U", 1},
+            {"ϒ", 0},
+      {"K", 1},
+         {"Κ", 0},
+      {"B", 1},
+         {"Β", 0},
+      {"X", 1},
+         {"Ξ", 0},
+      {"h", 1},
+         {"η", 0},
+      {"I", 1},
+         {"Ι", 0},
+      {"N", 1},
+         {"Ν", 0},
+      {"U", 1},
+         {"Υ", 0},
+   {"dead_invertedbreve", 24},
+      {"Cyrillic_er", 1},
+         {"р̑", 0},
+      {"Cyrillic_I", 1},
+         {"И̑", 0},
+      {"Cyrillic_O", 1},
+         {"О̑", 0},
+      {"Cyrillic_a", 1},
+         {"а̑", 0},
+      {"Cyrillic_ER", 1},
+         {"Р̑", 0},
+      {"Cyrillic_U", 1},
+         {"У̑", 0},
+      {"Cyrillic_ie", 1},
+         {"е̑", 0},
+      {"Cyrillic_i", 1},
+         {"и̑", 0},
+      {"Cyrillic_o", 1},
+         {"о̑", 0},
+      {"Cyrillic_A", 1},
+         {"А̑", 0},
+      {"Cyrillic_IE", 1},
+         {"Е̑", 0},
+      {"Cyrillic_u", 1},
+         {"у̑", 0},
+   {"dead_psili", 28},
+      {"Greek_IOTA", 1},
+         {"Ἰ", 0},
+      {"Greek_iota", 1},
+         {"ἰ", 0},
+      {"Greek_OMICRON", 1},
+         {"Ὀ", 0},
+      {"Greek_upsilon", 1},
+         {"ὐ", 0},
+      {"Greek_epsilon", 1},
+         {"ἐ", 0},
+      {"Greek_ALPHA", 1},
+         {"Ἀ", 0},
+      {"Greek_omicron", 1},
+         {"ὀ", 0},
+      {"Greek_eta", 1},
+         {"ἠ", 0},
+      {"Greek_rho", 1},
+         {"ῤ", 0},
+      {"Greek_alpha", 1},
+         {"ἀ", 0},
+      {"Greek_ETA", 1},
+         {"Ἠ", 0},
+      {"Greek_EPSILON", 1},
+         {"Ἐ", 0},
+      {"Greek_omega", 1},
+         {"ὠ", 0},
+      {"Greek_OMEGA", 1},
+         {"Ὠ", 0},
+   {"dead_abovedot", 159},
+      {"W", 1},
+         {"Ẇ", 0},
+      {"g", 1},
+         {"ġ", 0},
+      {"a", 1},
+         {"ȧ", 0},
+      {"C", 1},
+         {"Ċ", 0},
+      {"e", 1},
+         {"ė", 0},
+      {"F", 1},
+         {"Ḟ", 0},
+      {"o", 1},
+         {"ȯ", 0},
+      {"l", 1},
+         {"ŀ", 0},
+      {"t", 1},
+         {"ṫ", 0},
+      {"dead_belowdot", 4},
+         {"S", 1},
+            {"Ṩ", 0},
+         {"s", 1},
+            {"ṩ", 0},
+      {"space", 1},
+         {"˙", 0},
+      {"dead_macron", 8},
+         {"a", 1},
+            {"ǡ", 0},
+         {"o", 1},
+            {"ȱ", 0},
+         {"O", 1},
+            {"Ȱ", 0},
+         {"A", 1},
+            {"Ǡ", 0},
+      {"y", 1},
+         {"ẏ", 0},
+      {"b", 1},
+         {"ḃ", 0},
+      {"Multi_key", 23},
+         {"exclam", 4},
+            {"S", 1},
+               {"Ṩ", 0},
+            {"s", 1},
+               {"ṩ", 0},
+         {"f", 2},
+            {"s", 1},
+               {"ẛ", 0},
+         {"acute", 4},
+            {"S", 1},
+               {"Ṥ", 0},
+            {"s", 1},
+               {"ṥ", 0},
+         {"apostrophe", 4},
+            {"S", 1},
+               {"Ṥ", 0},
+            {"s", 1},
+               {"ṥ", 0},
+         {"c", 4},
+            {"S", 1},
+               {"Ṧ", 0},
+            {"s", 1},
+               {"ṧ", 0},
+      {"i", 1},
+         {"ı", 0},
+      {"n", 1},
+         {"ṅ", 0},
+      {"dead_caron", 4},
+         {"S", 1},
+            {"Ṧ", 0},
+         {"s", 1},
+            {"ṧ", 0},
+      {"j", 1},
+         {"ȷ", 0},
+      {"x", 1},
+         {"ẋ", 0},
+      {"amacron", 1},
+         {"ǡ", 0},
+      {"nobreakspace", 1},
+         {"̇", 0},
+      {"omacron", 1},
+         {"ȱ", 0},
+      {"z", 1},
+         {"ż", 0},
+      {"G", 1},
+         {"Ġ", 0},
+      {"Sacute", 1},
+         {"Ṥ", 0},
+      {"H", 1},
+         {"Ḣ", 0},
+      {"E", 1},
+         {"Ė", 0},
+      {"S", 1},
+         {"Ṡ", 0},
+      {"Y", 1},
+         {"Ẏ", 0},
+      {"scaron", 1},
+         {"ṧ", 0},
+      {"f", 1},
+         {"ḟ", 0},
+      {"d", 1},
+         {"ḋ", 0},
+      {"Scaron", 1},
+         {"Ṧ", 0},
+      {"D", 1},
+         {"Ḋ", 0},
+      {"dead_abovedot", 1},
+         {"˙", 0},
+      {"w", 1},
+         {"ẇ", 0},
+      {"p", 1},
+         {"ṗ", 0},
+      {"P", 1},
+         {"Ṗ", 0},
+      {"M", 1},
+         {"Ṁ", 0},
+      {"O", 1},
+         {"Ȯ", 0},
+      {"m", 1},
+         {"ṁ", 0},
+      {"r", 1},
+         {"ṙ", 0},
+      {"s", 1},
+         {"ṡ", 0},
+      {"Z", 1},
+         {"Ż", 0},
+      {"sacute", 1},
+         {"ṥ", 0},
+      {"dead_stroke", 2},
+         {"j", 1},
+            {"ɟ", 0},
+      {"A", 1},
+         {"Ȧ", 0},
+      {"R", 1},
+         {"Ṙ", 0},
+      {"c", 1},
+         {"ċ", 0},
+      {"L", 1},
+         {"Ŀ", 0},
+      {"T", 1},
+         {"Ṫ", 0},
+      {"Omacron", 1},
+         {"Ȱ", 0},
+      {"B", 1},
+         {"Ḃ", 0},
+      {"Amacron", 1},
+         {"Ǡ", 0},
+      {"dead_acute", 4},
+         {"S", 1},
+            {"Ṥ", 0},
+         {"s", 1},
+            {"ṥ", 0},
+      {"X", 1},
+         {"Ẋ", 0},
+      {"h", 1},
+         {"ḣ", 0},
+      {"I", 1},
+         {"İ", 0},
+      {"N", 1},
+         {"Ṅ", 0},
+   {"dead_double_grave", 24},
+      {"a", 1},
+         {"ȁ", 0},
+      {"e", 1},
+         {"ȅ", 0},
+      {"o", 1},
+         {"ȍ", 0},
+      {"i", 1},
+         {"ȉ", 0},
+      {"u", 1},
+         {"ȕ", 0},
+      {"E", 1},
+         {"Ȅ", 0},
+      {"O", 1},
+         {"Ȍ", 0},
+      {"r", 1},
+         {"ȑ", 0},
+      {"A", 1},
+         {"Ȁ", 0},
+      {"R", 1},
+         {"Ȑ", 0},
+      {"I", 1},
+         {"Ȉ", 0},
+      {"U", 1},
+         {"Ȕ", 0},
+   {"dead_semivoiced_sound", 10},
+      {"kana_HO", 1},
+         {"ポ", 0},
+      {"kana_HI", 1},
+         {"ピ", 0},
+      {"kana_HA", 1},
+         {"パ", 0},
+      {"kana_HE", 1},
+         {"ペ", 0},
+      {"kana_FU", 1},
+         {"プ", 0},
+   {"dead_stroke", 101},
+      {"g", 1},
+         {"ǥ", 0},
+      {"a", 1},
+         {"ⱥ", 0},
+      {"C", 1},
+         {"Ȼ", 0},
+      {"less", 1},
+         {"≮", 0},
+      {"Oacute", 1},
+         {"Ǿ", 0},
+      {"e", 1},
+         {"ɇ", 0},
+      {"o", 1},
+         {"ø", 0},
+      {"l", 1},
+         {"ł", 0},
+      {"t", 1},
+         {"ŧ", 0},
+      {"space", 1},
+         {"/", 0},
+      {"y", 1},
+         {"ɏ", 0},
+      {"b", 1},
+         {"ƀ", 0},
+      {"oacute", 1},
+         {"ǿ", 0},
+      {"i", 1},
+         {"ɨ", 0},
+      {"equal", 1},
+         {"≠", 0},
+      {"j", 1},
+         {"ɉ", 0},
+      {"nobreakspace", 1},
+         {"̸", 0},
+      {"u", 1},
+         {"ʉ", 0},
+      {"greaterthanequal", 1},
+         {"≱", 0},
+      {"z", 1},
+         {"ƶ", 0},
+      {"G", 1},
+         {"Ǥ", 0},
+      {"H", 1},
+         {"Ħ", 0},
+      {"E", 1},
+         {"Ɇ", 0},
+      {"2", 1},
+         {"ƻ", 0},
+      {"Y", 1},
+         {"Ɏ", 0},
+      {"d", 1},
+         {"đ", 0},
+      {"dead_greek", 2},
+         {"r", 1},
+            {"ϼ", 0},
+      {"D", 1},
+         {"Đ", 0},
+      {"dead_abovedot", 2},
+         {"j", 1},
+            {"ɟ", 0},
+      {"lessthanequal", 1},
+         {"≰", 0},
+      {"p", 1},
+         {"ᵽ", 0},
+      {"J", 1},
+         {"Ɉ", 0},
+      {"P", 1},
+         {"Ᵽ", 0},
+      {"O", 1},
+         {"Ø", 0},
+      {"r", 1},
+         {"ɍ", 0},
+      {"Z", 1},
+         {"Ƶ", 0},
+      {"dead_stroke", 1},
+         {"/", 0},
+      {"A", 1},
+         {"Ⱥ", 0},
+      {"R", 1},
+         {"Ɍ", 0},
+      {"c", 1},
+         {"ȼ", 0},
+      {"L", 1},
+         {"Ł", 0},
+      {"T", 1},
+         {"Ŧ", 0},
+      {"greater", 1},
+         {"≯", 0},
+      {"B", 1},
+         {"Ƀ", 0},
+      {"dead_acute", 4},
+         {"o", 1},
+            {"ǿ", 0},
+         {"O", 1},
+            {"Ǿ", 0},
+      {"h", 1},
+         {"ħ", 0},
+      {"I", 1},
+         {"Ɨ", 0},
+      {"U", 1},
+         {"Ʉ", 0},
+   {"dead_hook", 179},
+      {"W", 1},
+         {"Ⱳ", 0},
+      {"dead_breve", 4},
+         {"a", 1},
+            {"ẳ", 0},
+         {"A", 1},
+            {"Ẳ", 0},
+      {"g", 1},
+         {"ɠ", 0},
+      {"a", 1},
+         {"ả", 0},
+      {"dead_circumflex", 12},
+         {"a", 1},
+            {"ẩ", 0},
+         {"e", 1},
+            {"ể", 0},
+         {"o", 1},
+            {"ổ", 0},
+         {"E", 1},
+            {"Ể", 0},
+         {"O", 1},
+            {"Ổ", 0},
+         {"A", 1},
+            {"Ẩ", 0},
+      {"dead_horn", 8},
+         {"o", 1},
+            {"ở", 0},
+         {"u", 1},
+            {"ử", 0},
+         {"O", 1},
+            {"Ở", 0},
+         {"U", 1},
+            {"Ử", 0},
+      {"Acircumflex", 1},
+         {"Ẩ", 0},
+      {"C", 1},
+         {"Ƈ", 0},
+      {"e", 1},
+         {"ẻ", 0},
+      {"F", 1},
+         {"Ƒ", 0},
+      {"o", 1},
+         {"ỏ", 0},
+      {"t", 1},
+         {"ƭ", 0},
+      {"schwa", 1},
+         {"ɚ", 0},
+      {"uhorn", 1},
+         {"ử", 0},
+      {"space", 1},
+         {"̉", 0},
+      {"acircumflex", 1},
+         {"ẩ", 0},
+      {"Ecircumflex", 1},
+         {"Ể", 0},
+      {"y", 1},
+         {"ỷ", 0},
+      {"b", 1},
+         {"ɓ", 0},
+      {"Multi_key", 32},
+         {"b", 4},
+            {"a", 1},
+               {"ẳ", 0},
+            {"A", 1},
+               {"Ẳ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ở", 0},
+            {"u", 1},
+               {"ử", 0},
+            {"O", 1},
+               {"Ở", 0},
+            {"U", 1},
+               {"Ử", 0},
+         {"U", 4},
+            {"a", 1},
+               {"ẳ", 0},
+            {"A", 1},
+               {"Ẳ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ẩ", 0},
+            {"e", 1},
+               {"ể", 0},
+            {"o", 1},
+               {"ổ", 0},
+            {"E", 1},
+               {"Ể", 0},
+            {"O", 1},
+               {"Ổ", 0},
+            {"A", 1},
+               {"Ẩ", 0},
+      {"i", 1},
+         {"ỉ", 0},
+      {"k", 1},
+         {"ƙ", 0},
+      {"n", 1},
+         {"ɲ", 0},
+      {"Ohorn", 1},
+         {"Ở", 0},
+      {"ohorn", 1},
+         {"ở", 0},
+      {"q", 1},
+         {"ʠ", 0},
+      {"nobreakspace", 1},
+         {"̉", 0},
+      {"V", 1},
+         {"Ʋ", 0},
+      {"Ocircumflex", 1},
+         {"Ổ", 0},
+      {"ocircumflex", 1},
+         {"ổ", 0},
+      {"u", 1},
+         {"ủ", 0},
+      {"z", 1},
+         {"ȥ", 0},
+      {"G", 1},
+         {"Ɠ", 0},
+      {"E", 1},
+         {"Ẻ", 0},
+      {"Y", 1},
+         {"Ỷ", 0},
+      {"f", 1},
+         {"ƒ", 0},
+      {"d", 1},
+         {"ɗ", 0},
+      {"dead_greek", 2},
+         {"U", 1},
+            {"ϒ", 0},
+      {"D", 1},
+         {"Ɗ", 0},
+      {"Abreve", 1},
+         {"Ẳ", 0},
+      {"ecircumflex", 1},
+         {"ể", 0},
+      {"w", 1},
+         {"ⱳ", 0},
+      {"p", 1},
+         {"ƥ", 0},
+      {"v", 1},
+         {"ʋ", 0},
+      {"P", 1},
+         {"Ƥ", 0},
+      {"M", 1},
+         {"Ɱ", 0},
+      {"O", 1},
+         {"Ỏ", 0},
+      {"abreve", 1},
+         {"ẳ", 0},
+      {"m", 1},
+         {"ɱ", 0},
+      {"r", 1},
+         {"ɼ", 0},
+      {"s", 1},
+         {"ʂ", 0},
+      {"Z", 1},
+         {"Ȥ", 0},
+      {"A", 1},
+         {"Ả", 0},
+      {"c", 1},
+         {"ƈ", 0},
+      {"T", 1},
+         {"Ƭ", 0},
+      {"dead_hook", 1},
+         {"̉", 0},
+      {"K", 1},
+         {"Ƙ", 0},
+      {"B", 1},
+         {"Ɓ", 0},
+      {"Uhorn", 1},
+         {"Ử", 0},
+      {"h", 1},
+         {"ɦ", 0},
+      {"I", 1},
+         {"Ỉ", 0},
+      {"N", 1},
+         {"Ɲ", 0},
+      {"U", 1},
+         {"Ủ", 0},
+   {"dead_belowbreve", 4},
+      {"H", 1},
+         {"Ḫ", 0},
+      {"h", 1},
+         {"ḫ", 0},
+   {"dead_cedilla", 73},
+      {"dead_breve", 4},
+         {"e", 1},
+            {"ḝ", 0},
+         {"E", 1},
+            {"Ḝ", 0},
+      {"g", 1},
+         {"ģ", 0},
+      {"dead_currency", 4},
+         {"C", 1},
+            {"₵", 0},
+         {"c", 1},
+            {"₵", 0},
+      {"C", 1},
+         {"Ç", 0},
+      {"e", 1},
+         {"ȩ", 0},
+      {"l", 1},
+         {"ļ", 0},
+      {"t", 1},
+         {"ţ", 0},
+      {"ColonSign", 1},
+         {"₵", 0},
+      {"space", 1},
+         {"¸", 0},
+      {"k", 1},
+         {"ķ", 0},
+      {"n", 1},
+         {"ņ", 0},
+      {"nobreakspace", 1},
+         {"̧", 0},
+      {"G", 1},
+         {"Ģ", 0},
+      {"H", 1},
+         {"Ḩ", 0},
+      {"E", 1},
+         {"Ȩ", 0},
+      {"S", 1},
+         {"Ş", 0},
+      {"Cacute", 1},
+         {"Ḉ", 0},
+      {"d", 1},
+         {"ḑ", 0},
+      {"D", 1},
+         {"Ḑ", 0},
+      {"cent", 1},
+         {"₵", 0},
+      {"cacute", 1},
+         {"ḉ", 0},
+      {"r", 1},
+         {"ŗ", 0},
+      {"s", 1},
+         {"ş", 0},
+      {"R", 1},
+         {"Ŗ", 0},
+      {"c", 1},
+         {"ç", 0},
+      {"L", 1},
+         {"Ļ", 0},
+      {"T", 1},
+         {"Ţ", 0},
+      {"K", 1},
+         {"Ķ", 0},
+      {"dead_cedilla", 1},
+         {"¸", 0},
+      {"dead_acute", 4},
+         {"C", 1},
+            {"Ḉ", 0},
+         {"c", 1},
+            {"ḉ", 0},
+      {"h", 1},
+         {"ḩ", 0},
+      {"N", 1},
+         {"Ņ", 0},
+   {"dead_inverted_breve", 24},
+      {"a", 1},
+         {"ȃ", 0},
+      {"e", 1},
+         {"ȇ", 0},
+      {"o", 1},
+         {"ȏ", 0},
+      {"i", 1},
+         {"ȋ", 0},
+      {"u", 1},
+         {"ȗ", 0},
+      {"E", 1},
+         {"Ȇ", 0},
+      {"O", 1},
+         {"Ȏ", 0},
+      {"r", 1},
+         {"ȓ", 0},
+      {"A", 1},
+         {"Ȃ", 0},
+      {"R", 1},
+         {"Ȓ", 0},
+      {"I", 1},
+         {"Ȋ", 0},
+      {"U", 1},
+         {"Ȗ", 0},
+   {"dead_diaeresis", 190},
+      {"W", 1},
+         {"Ẅ", 0},
+      {"a", 1},
+         {"ä", 0},
+      {"Greek_IOTA", 1},
+         {"Ϊ", 0},
+      {"dead_grave", 4},
+         {"u", 1},
+            {"ǜ", 0},
+         {"U", 1},
+            {"Ǜ", 0},
+      {"Greek_iota", 1},
+         {"ϊ", 0},
+      {"Umacron", 1},
+         {"Ṻ", 0},
+      {"Cyrillic_ZE", 1},
+         {"Ӟ", 0},
+      {"dead_belowdiaeresis", 2},
+         {"equal", 1},
+            {"⩷", 0},
+      {"e", 1},
+         {"ë", 0},
+      {"o", 1},
+         {"ö", 0},
+      {"iacute", 1},
+         {"ḯ", 0},
+      {"Cyrillic_ze", 1},
+         {"ӟ", 0},
+      {"t", 1},
+         {"ẗ", 0},
+      {"Greek_upsilon", 1},
+         {"ϋ", 0},
+      {"space", 1},
+         {"\"", 0},
+      {"dead_macron", 12},
+         {"a", 1},
+            {"ǟ", 0},
+         {"o", 1},
+            {"ȫ", 0},
+         {"u", 1},
+            {"ṻ", 0},
+         {"O", 1},
+            {"Ȫ", 0},
+         {"A", 1},
+            {"Ǟ", 0},
+         {"U", 1},
+            {"Ṻ", 0},
+      {"Cyrillic_I", 1},
+         {"Ӥ", 0},
+      {"y", 1},
+         {"ÿ", 0},
+      {"Multi_key", 15},
+         {"underscore", 4},
+            {"u", 1},
+               {"ṻ", 0},
+            {"U", 1},
+               {"Ṻ", 0},
+         {"macron", 4},
+            {"u", 1},
+               {"ṻ", 0},
+            {"U", 1},
+               {"Ṻ", 0},
+         {"asciitilde", 4},
+            {"o", 1},
+               {"ṏ", 0},
+            {"O", 1},
+               {"Ṏ", 0},
+      {"Cyrillic_O", 1},
+         {"Ӧ", 0},
+      {"i", 1},
+         {"ï", 0},
+      {"Ukrainian_I", 1},
+         {"Ї", 0},
+      {"dead_caron", 4},
+         {"u", 1},
+            {"ǚ", 0},
+         {"U", 1},
+            {"Ǚ", 0},
+      {"dead_tilde", 4},
+         {"o", 1},
+            {"ṏ", 0},
+         {"O", 1},
+            {"Ṏ", 0},
+      {"Cyrillic_che", 1},
+         {"ӵ", 0},
+      {"Uacute", 1},
+         {"Ǘ", 0},
+      {"Cyrillic_a", 1},
+         {"ӓ", 0},
+      {"Ugrave", 1},
+         {"Ǜ", 0},
+      {"x", 1},
+         {"ẍ", 0},
+      {"amacron", 1},
+         {"ǟ", 0},
+      {"Cyrillic_U", 1},
+         {"Ӱ", 0},
+      {"nobreakspace", 1},
+         {"̈", 0},
+      {"omacron", 1},
+         {"ȫ", 0},
+      {"uacute", 1},
+         {"ǘ", 0},
+      {"u", 1},
+         {"ü", 0},
+      {"otilde", 1},
+         {"ṏ", 0},
+      {"Iacute", 1},
+         {"Ḯ", 0},
+      {"H", 1},
+         {"Ḧ", 0},
+      {"Cyrillic_YERU", 1},
+         {"Ӹ", 0},
+      {"Cyrillic_ie", 1},
+         {"ё", 0},
+      {"E", 1},
+         {"Ë", 0},
+      {"Y", 1},
+         {"Ÿ", 0},
+      {"Cyrillic_i", 1},
+         {"ӥ", 0},
+      {"Otilde", 1},
+         {"Ṏ", 0},
+      {"Cyrillic_zhe", 1},
+         {"ӝ", 0},
+      {"umacron", 1},
+         {"ṻ", 0},
+      {"Cyrillic_yeru", 1},
+         {"ӹ", 0},
+      {"acute", 1},
+         {"̈́", 0},
+      {"w", 1},
+         {"ẅ", 0},
+      {"Cyrillic_CHE", 1},
+         {"Ӵ", 0},
+      {"Cyrillic_o", 1},
+         {"ӧ", 0},
+      {"Ukrainian_i", 1},
+         {"ї", 0},
+      {"Cyrillic_E", 1},
+         {"Ӭ", 0},
+      {"apostrophe", 1},
+         {"̈́", 0},
+      {"O", 1},
+         {"Ö", 0},
+      {"A", 1},
+         {"Ä", 0},
+      {"Cyrillic_A", 1},
+         {"Ӓ", 0},
+      {"ugrave", 1},
+         {"ǜ", 0},
+      {"Omacron", 1},
+         {"Ȫ", 0},
+      {"Cyrillic_ZHE", 1},
+         {"Ӝ", 0},
+      {"Cyrillic_IE", 1},
+         {"Ё", 0},
+      {"dead_diaeresis", 1},
+         {"¨", 0},
+      {"Amacron", 1},
+         {"Ǟ", 0},
+      {"Cyrillic_e", 1},
+         {"ӭ", 0},
+      {"dead_acute", 14},
+         {"Greek_iota", 1},
+            {"ΐ", 0},
+         {"Greek_upsilon", 1},
+            {"ΰ", 0},
+         {"space", 1},
+            {"΅", 0},
+         {"i", 1},
+            {"ḯ", 0},
+         {"u", 1},
+            {"ǘ", 0},
+         {"I", 1},
+            {"Ḯ", 0},
+         {"U", 1},
+            {"Ǘ", 0},
+      {"X", 1},
+         {"Ẍ", 0},
+      {"h", 1},
+         {"ḧ", 0},
+      {"I", 1},
+         {"Ï", 0},
+      {"U", 1},
+         {"Ü", 0},
+      {"Cyrillic_u", 1},
+         {"ӱ", 0},
+      {"Greek_UPSILON", 1},
+         {"Ϋ", 0},
+   {"dead_acute", 500},
+      {"W", 1},
+         {"Ẃ", 0},
+      {"dead_breve", 4},
+         {"a", 1},
+            {"ắ", 0},
+         {"A", 1},
+            {"Ắ", 0},
+      {"g", 1},
+         {"ǵ", 0},
+      {"a", 1},
+         {"á", 0},
+      {"Greek_IOTA", 1},
+         {"Ί", 0},
+      {"Greek_iota", 1},
+         {"ί", 0},
+      {"dead_horn", 8},
+         {"o", 1},
+            {"ớ", 0},
+         {"u", 1},
+            {"ứ", 0},
+         {"O", 1},
+            {"Ớ", 0},
+         {"U", 1},
+            {"Ứ", 0},
+      {"dead_circumflex", 12},
+         {"a", 1},
+            {"ấ", 0},
+         {"e", 1},
+            {"ế", 0},
+         {"o", 1},
+            {"ố", 0},
+         {"E", 1},
+            {"Ế", 0},
+         {"O", 1},
+            {"Ố", 0},
+         {"A", 1},
+            {"Ấ", 0},
+      {"Greek_OMICRON", 1},
+         {"Ό", 0},
+      {"Acircumflex", 1},
+         {"Ấ", 0},
+      {"C", 1},
+         {"Ć", 0},
+      {"Cyrillic_er", 1},
+         {"р́", 0},
+      {"e", 1},
+         {"é", 0},
+      {"Utilde", 1},
+         {"Ṹ", 0},
+      {"o", 1},
+         {"ó", 0},
+      {"l", 1},
+         {"ĺ", 0},
+      {"Udiaeresis", 1},
+         {"Ǘ", 0},
+      {"Greek_upsilon", 1},
+         {"ύ", 0},
+      {"uhorn", 1},
+         {"ứ", 0},
+      {"space", 1},
+         {"'", 0},
+      {"dead_macron", 8},
+         {"e", 1},
+            {"ḗ", 0},
+         {"o", 1},
+            {"ṓ", 0},
+         {"E", 1},
+            {"Ḗ", 0},
+         {"O", 1},
+            {"Ṓ", 0},
+      {"acircumflex", 1},
+         {"ấ", 0},
+      {"Ecircumflex", 1},
+         {"Ế", 0},
+      {"Cyrillic_I", 1},
+         {"И́", 0},
+      {"y", 1},
+         {"ý", 0},
+      {"Multi_key", 153},
+         {"KP_Divide", 4},
+            {"o", 1},
+               {"ǿ", 0},
+            {"O", 1},
+               {"Ǿ", 0},
+         {"o", 4},
+            {"a", 1},
+               {"ǻ", 0},
+            {"A", 1},
+               {"Ǻ", 0},
+         {"b", 4},
+            {"a", 1},
+               {"ắ", 0},
+            {"A", 1},
+               {"Ắ", 0},
+         {"parenright", 26},
+            {"Greek_IOTA", 1},
+               {"Ἴ", 0},
+            {"Greek_iota", 1},
+               {"ἴ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὄ", 0},
+            {"Greek_upsilon", 1},
+               {"ὔ", 0},
+            {"Greek_epsilon", 1},
+               {"ἔ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἄ", 0},
+            {"Greek_omicron", 1},
+               {"ὄ", 0},
+            {"Greek_eta", 1},
+               {"ἤ", 0},
+            {"Greek_alpha", 1},
+               {"ἄ", 0},
+            {"Greek_ETA", 1},
+               {"Ἤ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἔ", 0},
+            {"Greek_omega", 1},
+               {"ὤ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὤ", 0},
+         {"quotedbl", 12},
+            {"Greek_iota", 1},
+               {"ΐ", 0},
+            {"Greek_upsilon", 1},
+               {"ΰ", 0},
+            {"i", 1},
+               {"ḯ", 0},
+            {"u", 1},
+               {"ǘ", 0},
+            {"I", 1},
+               {"Ḯ", 0},
+            {"U", 1},
+               {"Ǘ", 0},
+         {"plus", 8},
+            {"o", 1},
+               {"ớ", 0},
+            {"u", 1},
+               {"ứ", 0},
+            {"O", 1},
+               {"Ớ", 0},
+            {"U", 1},
+               {"Ứ", 0},
+         {"cedilla", 4},
+            {"C", 1},
+               {"Ḉ", 0},
+            {"c", 1},
+               {"ḉ", 0},
+         {"underscore", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"macron", 8},
+            {"e", 1},
+               {"ḗ", 0},
+            {"o", 1},
+               {"ṓ", 0},
+            {"E", 1},
+               {"Ḗ", 0},
+            {"O", 1},
+               {"Ṓ", 0},
+         {"comma", 4},
+            {"C", 1},
+               {"Ḉ", 0},
+            {"c", 1},
+               {"ḉ", 0},
+         {"asciitilde", 8},
+            {"o", 1},
+               {"ṍ", 0},
+            {"u", 1},
+               {"ṹ", 0},
+            {"O", 1},
+               {"Ṍ", 0},
+            {"U", 1},
+               {"Ṹ", 0},
+         {"slash", 4},
+            {"o", 1},
+               {"ǿ", 0},
+            {"O", 1},
+               {"Ǿ", 0},
+         {"parenleft", 28},
+            {"Greek_IOTA", 1},
+               {"Ἵ", 0},
+            {"Greek_iota", 1},
+               {"ἵ", 0},
+            {"Greek_OMICRON", 1},
+               {"Ὅ", 0},
+            {"Greek_upsilon", 1},
+               {"ὕ", 0},
+            {"Greek_epsilon", 1},
+               {"ἕ", 0},
+            {"Greek_ALPHA", 1},
+               {"Ἅ", 0},
+            {"Greek_omicron", 1},
+               {"ὅ", 0},
+            {"Greek_eta", 1},
+               {"ἥ", 0},
+            {"Greek_alpha", 1},
+               {"ἅ", 0},
+            {"Greek_ETA", 1},
+               {"Ἥ", 0},
+            {"Greek_EPSILON", 1},
+               {"Ἕ", 0},
+            {"Greek_omega", 1},
+               {"ὥ", 0},
+            {"Greek_OMEGA", 1},
+               {"Ὥ", 0},
+            {"Greek_UPSILON", 1},
+               {"Ὕ", 0},
+         {"U", 4},
+            {"a", 1},
+               {"ắ", 0},
+            {"A", 1},
+               {"Ắ", 0},
+         {"asciicircum", 12},
+            {"a", 1},
+               {"ấ", 0},
+            {"e", 1},
+               {"ế", 0},
+            {"o", 1},
+               {"ố", 0},
+            {"E", 1},
+               {"Ế", 0},
+            {"O", 1},
+               {"Ố", 0},
+            {"A", 1},
+               {"Ấ", 0},
+      {"idiaeresis", 1},
+         {"ḯ", 0},
+      {"Cyrillic_O", 1},
+         {"О́", 0},
+      {"i", 1},
+         {"í", 0},
+      {"k", 1},
+         {"ḱ", 0},
+      {"n", 1},
+         {"ń", 0},
+      {"ccedilla", 1},
+         {"ḉ", 0},
+      {"Cyrillic_GHE", 1},
+         {"Ѓ", 0},
+      {"dead_tilde", 8},
+         {"o", 1},
+            {"ṍ", 0},
+         {"u", 1},
+            {"ṹ", 0},
+         {"O", 1},
+            {"Ṍ", 0},
+         {"U", 1},
+            {"Ṹ", 0},
+      {"Cyrillic_a", 1},
+         {"а́", 0},
+      {"Ohorn", 1},
+         {"Ớ", 0},
+      {"ohorn", 1},
+         {"ớ", 0},
+      {"sabovedot", 1},
+         {"ṥ", 0},
+      {"Cyrillic_ER", 1},
+         {"Р́", 0},
+      {"Greek_epsilon", 1},
+         {"έ", 0},
+      {"Cyrillic_KA", 1},
+         {"Ќ", 0},
+      {"Cyrillic_U", 1},
+         {"У́", 0},
+      {"dead_abovering", 4},
+         {"a", 1},
+            {"ǻ", 0},
+         {"A", 1},
+            {"Ǻ", 0},
+      {"nobreakspace", 1},
+         {"́", 0},
+      {"V", 1},
+         {"Ǘ", 0},
+      {"Ocircumflex", 1},
+         {"Ố", 0},
+      {"AE", 1},
+         {"Ǽ", 0},
+      {"omacron", 1},
+         {"ṓ", 0},
+      {"ocircumflex", 1},
+         {"ố", 0},
+      {"u", 1},
+         {"ú", 0},
+      {"z", 1},
+         {"ź", 0},
+      {"G", 1},
+         {"Ǵ", 0},
+      {"Greek_ALPHA", 1},
+         {"Ά", 0},
+      {"otilde", 1},
+         {"ṍ", 0},
+      {"utilde", 1},
+         {"ṹ", 0},
+      {"Cyrillic_ie", 1},
+         {"е́", 0},
+      {"emacron", 1},
+         {"ḗ", 0},
+      {"E", 1},
+         {"É", 0},
+      {"S", 1},
+         {"Ś", 0},
+      {"Greek_iotadieresis", 1},
+         {"ΐ", 0},
+      {"Y", 1},
+         {"Ý", 0},
+      {"Cyrillic_i", 1},
+         {"и́", 0},
+      {"dead_dasia", 28},
+         {"Greek_IOTA", 1},
+            {"Ἵ", 0},
+         {"Greek_iota", 1},
+            {"ἵ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ὅ", 0},
+         {"Greek_upsilon", 1},
+            {"ὕ", 0},
+         {"Greek_epsilon", 1},
+            {"ἕ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἅ", 0},
+         {"Greek_omicron", 1},
+            {"ὅ", 0},
+         {"Greek_eta", 1},
+            {"ἥ", 0},
+         {"Greek_alpha", 1},
+            {"ἅ", 0},
+         {"Greek_ETA", 1},
+            {"Ἥ", 0},
+         {"Greek_EPSILON", 1},
+            {"Ἕ", 0},
+         {"Greek_omega", 1},
+            {"ὥ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὥ", 0},
+         {"Greek_UPSILON", 1},
+            {"Ὕ", 0},
+      {"Greek_upsilondieresis", 1},
+         {"ΰ", 0},
+      {"Greek_omicron", 1},
+         {"ό", 0},
+      {"Greek_eta", 1},
+         {"ή", 0},
+      {"Otilde", 1},
+         {"Ṍ", 0},
+      {"Cyrillic_ka", 1},
+         {"ќ", 0},
+      {"Aring", 1},
+         {"Ǻ", 0},
+      {"Abreve", 1},
+         {"Ắ", 0},
+      {"dead_psili", 26},
+         {"Greek_IOTA", 1},
+            {"Ἴ", 0},
+         {"Greek_iota", 1},
+            {"ἴ", 0},
+         {"Greek_OMICRON", 1},
+            {"Ὄ", 0},
+         {"Greek_upsilon", 1},
+            {"ὔ", 0},
+         {"Greek_epsilon", 1},
+            {"ἔ", 0},
+         {"Greek_ALPHA", 1},
+            {"Ἄ", 0},
+         {"Greek_omicron", 1},
+            {"ὄ", 0},
+         {"Greek_eta", 1},
+            {"ἤ", 0},
+         {"Greek_alpha", 1},
+            {"ἄ", 0},
+         {"Greek_ETA", 1},
+            {"Ἤ", 0},
+         {"Greek_EPSILON", 1},
+            {"Ἔ", 0},
+         {"Greek_omega", 1},
+            {"ὤ", 0},
+         {"Greek_OMEGA", 1},
+            {"Ὤ", 0},
+      {"Greek_alpha", 1},
+         {"ά", 0},
+      {"ecircumflex", 1},
+         {"ế", 0},
+      {"dead_abovedot", 4},
+         {"S", 1},
+            {"Ṥ", 0},
+         {"s", 1},
+            {"ṥ", 0},
+      {"w", 1},
+         {"ẃ", 0},
+      {"Greek_ETA", 1},
+         {"Ή", 0},
+      {"Cyrillic_o", 1},
+         {"о́", 0},
+      {"Emacron", 1},
+         {"Ḗ", 0},
+      {"Ooblique", 1},
+         {"Ǿ", 0},
+      {"p", 1},
+         {"ṕ", 0},
+      {"v", 1},
+         {"ǘ", 0},
+      {"P", 1},
+         {"Ṕ", 0},
+      {"M", 1},
+         {"Ḿ", 0},
+      {"O", 1},
+         {"Ó", 0},
+      {"abreve", 1},
+         {"ắ", 0},
+      {"m", 1},
+         {"ḿ", 0},
+      {"r", 1},
+         {"ŕ", 0},
+      {"s", 1},
+         {"ś", 0},
+      {"Z", 1},
+         {"Ź", 0},
+      {"dead_stroke", 4},
+         {"o", 1},
+            {"ǿ", 0},
+         {"O", 1},
+            {"Ǿ", 0},
+      {"A", 1},
+         {"Á", 0},
+      {"R", 1},
+         {"Ŕ", 0},
+      {"c", 1},
+         {"ć", 0},
+      {"Idiaeresis", 1},
+         {"Ḯ", 0},
+      {"L", 1},
+         {"Ĺ", 0},
+      {"Greek_EPSILON", 1},
+         {"Έ", 0},
+      {"Cyrillic_A", 1},
+         {"А́", 0},
+      {"Ccedilla", 1},
+         {"Ḉ", 0},
+      {"aring", 1},
+         {"ǻ", 0},
+      {"K", 1},
+         {"Ḱ", 0},
+      {"Omacron", 1},
+         {"Ṓ", 0},
+      {"Cyrillic_IE", 1},
+         {"Е́", 0},
+      {"Sabovedot", 1},
+         {"Ṥ", 0},
+      {"dead_cedilla", 4},
+         {"C", 1},
+            {"Ḉ", 0},
+         {"c", 1},
+            {"ḉ", 0},
+      {"Greek_omega", 1},
+         {"ώ", 0},
+      {"dead_diaeresis", 14},
+         {"Greek_iota", 1},
+            {"ΐ", 0},
+         {"Greek_upsilon", 1},
+            {"ΰ", 0},
+         {"space", 1},
+            {"΅", 0},
+         {"i", 1},
+            {"ḯ", 0},
+         {"u", 1},
+            {"ǘ", 0},
+         {"I", 1},
+            {"Ḯ", 0},
+         {"U", 1},
+            {"Ǘ", 0},
+      {"Uhorn", 1},
+         {"Ứ", 0},
+      {"Greek_OMEGA", 1},
+         {"Ώ", 0},
+      {"dead_acute", 1},
+         {"´", 0},
+      {"oslash", 1},
+         {"ǿ", 0},
+      {"Cyrillic_ghe", 1},
+         {"ѓ", 0},
+      {"udiaeresis", 1},
+         {"ǘ", 0},
+      {"I", 1},
+         {"Í", 0},
+      {"N", 1},
+         {"Ń", 0},
+      {"U", 1},
+         {"Ú", 0},
+      {"Cyrillic_u", 1},
+         {"у́", 0},
+      {"ae", 1},
+         {"ǽ", 0},
+      {"Greek_UPSILON", 1},
+         {"Ύ", 0},
+   {"dead_belowmacron", 34},
+      {"l", 1},
+         {"ḻ", 0},
+      {"t", 1},
+         {"ṯ", 0},
+      {"b", 1},
+         {"ḇ", 0},
+      {"k", 1},
+         {"ḵ", 0},
+      {"n", 1},
+         {"ṉ", 0},
+      {"z", 1},
+         {"ẕ", 0},
+      {"d", 1},
+         {"ḏ", 0},
+      {"D", 1},
+         {"Ḏ", 0},
+      {"r", 1},
+         {"ṟ", 0},
+      {"Z", 1},
+         {"Ẕ", 0},
+      {"R", 1},
+         {"Ṟ", 0},
+      {"L", 1},
+         {"Ḻ", 0},
+      {"T", 1},
+         {"Ṯ", 0},
+      {"K", 1},
+         {"Ḵ", 0},
+      {"B", 1},
+         {"Ḇ", 0},
+      {"h", 1},
+         {"ẖ", 0},
+      {"N", 1},
+         {"Ṉ", 0},
+   {"dead_belowring", 6},
+      {"a", 1},
+         {"ḁ", 0},
+      {"bar", 1},
+         {"⫰", 0},
+      {"A", 1},
+         {"Ḁ", 0},
+   {NULL, 0},
+};
diff --git a/src/lib/ecore_input/ecore_input_private.h b/src/lib/ecore_input/ecore_input_private.h
new file mode 100644 (file)
index 0000000..5660a20
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _ECORE_INPUT_PRIVATE_H
+#define _ECORE_INPUT_PRIVATE_H
+
+extern int _ecore_input_log_dom;
+
+#ifdef ECORE_INPUT_DEFAULT_LOG_COLOR
+# undef ECORE_INPUT_DEFAULT_LOG_COLOR 
+#endif
+
+#define ECORE_INPUT_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_input_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_input_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_input_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_input_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_input_log_dom, __VA_ARGS__)
+
+#endif
diff --git a/src/lib/ecore_input_evas/Ecore_Input_Evas.h b/src/lib/ecore_input_evas/Ecore_Input_Evas.h
new file mode 100644 (file)
index 0000000..c97274e
--- /dev/null
@@ -0,0 +1,64 @@
+#ifndef _ECORE_INPUT_EVAS_H
+#define _ECORE_INPUT_EVAS_H
+
+#include <Evas.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_ECORE_INPUT_EVAS_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_ECORE_INPUT_EVAS_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*Ecore_Event_Mouse_Move_Cb)(void *window, int x, int y, unsigned int timestamp);
+typedef void (*Ecore_Event_Multi_Move_Cb)(void *window, int device, int x, int y, double radius, double radius_x, double radius_y, double pressure, double angle, double mx, double my, unsigned int timestamp);
+typedef void (*Ecore_Event_Multi_Down_Cb)(void *window, int device, int x, int y, double radius, double radius_x, double radius_y, double pressure, double angle, double mx, double my, Evas_Button_Flags flags, unsigned int timestamp);
+typedef void (*Ecore_Event_Multi_Up_Cb)(void *window, int device, int x, int y, double radius, double radius_x, double radius_y, double pressure, double angle, double mx, double my, Evas_Button_Flags flags, unsigned int timestamp);
+      
+EAPI int       ecore_event_evas_init(void);
+EAPI int       ecore_event_evas_shutdown(void);
+
+EAPI Eina_Bool ecore_event_evas_key_down(void *data, int type, void *event);
+EAPI Eina_Bool ecore_event_evas_key_up(void *data, int type, void *event);
+EAPI Eina_Bool ecore_event_evas_mouse_button_up(void *data, int type, void *event);
+EAPI Eina_Bool ecore_event_evas_mouse_button_down(void *data, int type, void *event);
+EAPI Eina_Bool ecore_event_evas_mouse_wheel(void *data, int type, void *event);
+EAPI Eina_Bool ecore_event_evas_mouse_move(void *data, int type, void *event);
+EAPI Eina_Bool ecore_event_evas_mouse_in(void *data, int type, void *event);
+EAPI Eina_Bool ecore_event_evas_mouse_out(void *data, int type, void *event);
+
+EAPI void      ecore_event_window_register(Ecore_Window id, void *window, Evas *evas, Ecore_Event_Mouse_Move_Cb move_mouse, Ecore_Event_Multi_Move_Cb move_multi, Ecore_Event_Multi_Down_Cb down_multi, Ecore_Event_Multi_Up_Cb up_multi);
+EAPI void      ecore_event_window_unregister(Ecore_Window id);
+EAPI void     *ecore_event_window_match(Ecore_Window id);
+EAPI void      ecore_event_window_ignore_events(Ecore_Window id, int ignore_event);
+
+EAPI void      ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/ecore_input_evas/Makefile.am b/src/lib/ecore_input_evas/Makefile.am
new file mode 100644 (file)
index 0000000..ab5cd3b
--- /dev/null
@@ -0,0 +1,29 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore_input \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore \
+@EFL_ECORE_INPUT_EVAS_BUILD@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@ \
+@EVIL_CFLAGS@
+
+lib_LTLIBRARIES = libecore_input_evas.la
+includes_HEADERS = Ecore_Input_Evas.h
+includesdir = $(includedir)/ecore-@VMAJ@
+
+libecore_input_evas_la_SOURCES = \
+ecore_input_evas.c
+
+libecore_input_evas_la_LIBADD = \
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+$(top_builddir)/src/lib/ecore/libecore.la \
+@EVAS_LIBS@ \
+@EINA_LIBS@ \
+@EVIL_LIBS@
+
+libecore_input_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
+
+EXTRA_DIST = ecore_input_evas_private.h
diff --git a/src/lib/ecore_input_evas/ecore_input_evas.c b/src/lib/ecore_input_evas/ecore_input_evas.c
new file mode 100644 (file)
index 0000000..8ac41aa
--- /dev/null
@@ -0,0 +1,418 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "Ecore.h"
+#include "Ecore_Input.h"
+
+#include "Ecore_Input_Evas.h"
+#include "ecore_input_evas_private.h"
+
+int _ecore_input_evas_log_dom = -1;
+
+typedef struct _Ecore_Input_Window Ecore_Input_Window;
+struct _Ecore_Input_Window
+{
+   Evas *evas;
+   void *window;
+   Ecore_Event_Mouse_Move_Cb move_mouse;
+   Ecore_Event_Multi_Move_Cb move_multi;
+   Ecore_Event_Multi_Down_Cb down_multi;
+   Ecore_Event_Multi_Up_Cb up_multi;
+   int ignore_event;
+};
+
+static int _ecore_event_evas_init_count = 0;
+static Ecore_Event_Handler *ecore_event_evas_handlers[8];
+static Eina_Hash *_window_hash = NULL;
+
+EAPI void
+ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
+{
+   if (modifiers & ECORE_EVENT_MODIFIER_SHIFT)
+     evas_key_modifier_on(e, "Shift");
+   else evas_key_modifier_off(e, "Shift");
+
+   if (modifiers & ECORE_EVENT_MODIFIER_CTRL)
+     evas_key_modifier_on(e, "Control");
+   else evas_key_modifier_off(e, "Control");
+
+   if (modifiers & ECORE_EVENT_MODIFIER_ALT)
+     evas_key_modifier_on(e, "Alt");
+   else evas_key_modifier_off(e, "Alt");
+
+   if (modifiers & ECORE_EVENT_MODIFIER_WIN)
+     {
+        evas_key_modifier_on(e, "Super");
+        evas_key_modifier_on(e, "Hyper");
+     }
+   else
+     {
+        evas_key_modifier_off(e, "Super");
+        evas_key_modifier_off(e, "Hyper");
+     }
+
+   if (modifiers & ECORE_EVENT_MODIFIER_ALTGR)
+     evas_key_modifier_on(e, "AltGr");
+   else evas_key_modifier_off(e, "AltGr");
+
+   if (modifiers & ECORE_EVENT_LOCK_SCROLL)
+     evas_key_lock_on(e, "Scroll_Lock");
+   else evas_key_lock_off(e, "Scroll_Lock");
+
+   if (modifiers & ECORE_EVENT_LOCK_NUM)
+     evas_key_lock_on(e, "Num_Lock");
+   else evas_key_lock_off(e, "Num_Lock");
+
+   if (modifiers & ECORE_EVENT_LOCK_CAPS)
+     evas_key_lock_on(e, "Caps_Lock");
+   else evas_key_lock_off(e, "Caps_Lock");
+
+   if (modifiers & ECORE_EVENT_LOCK_SHIFT)
+     evas_key_lock_on(e, "Shift_Lock");
+   else evas_key_lock_off(e, "Shift_Lock");
+}
+
+EAPI void
+ecore_event_window_register(Ecore_Window id, void *window, Evas *evas,
+                            Ecore_Event_Mouse_Move_Cb move_mouse,
+                            Ecore_Event_Multi_Move_Cb move_multi,
+                            Ecore_Event_Multi_Down_Cb down_multi,
+                            Ecore_Event_Multi_Up_Cb up_multi)
+{
+   Ecore_Input_Window *w;
+
+   w = calloc(1, sizeof(Ecore_Input_Window));
+   if (!w) return;
+
+   w->evas = evas;
+   w->window = window;
+   w->move_mouse = move_mouse;
+   w->move_multi = move_multi;
+   w->down_multi = down_multi;
+   w->up_multi = up_multi;
+   w->ignore_event = 0;
+
+   eina_hash_add(_window_hash, &id, w);
+
+   evas_key_modifier_add(evas, "Shift");
+   evas_key_modifier_add(evas, "Control");
+   evas_key_modifier_add(evas, "Alt");
+   evas_key_modifier_add(evas, "Meta");
+   evas_key_modifier_add(evas, "Hyper");
+   evas_key_modifier_add(evas, "Super");
+   evas_key_modifier_add(evas, "AltGr");
+   evas_key_lock_add(evas, "Caps_Lock");
+   evas_key_lock_add(evas, "Num_Lock");
+   evas_key_lock_add(evas, "Scroll_Lock");
+}
+
+EAPI void
+ecore_event_window_unregister(Ecore_Window id)
+{
+   eina_hash_del(_window_hash, &id, NULL);
+}
+
+EAPI void *
+ecore_event_window_match(Ecore_Window id)
+{
+   Ecore_Input_Window *lookup;
+
+   lookup = eina_hash_find(_window_hash, &id);
+   if (lookup) return lookup->window;
+   return NULL;
+}
+
+EAPI void
+ecore_event_window_ignore_events(Ecore_Window id, int ignore_event)
+{
+   Ecore_Input_Window *lookup;
+
+   lookup = eina_hash_find(_window_hash, &id);
+   if (!lookup) return;
+   lookup->ignore_event = ignore_event;
+}
+
+static Ecore_Input_Window*
+_ecore_event_window_match(Ecore_Window id)
+{
+   Ecore_Input_Window *lookup;
+
+   lookup = eina_hash_find(_window_hash, &id);
+   if (!lookup) return NULL;
+   if (lookup->ignore_event) return NULL; /* Pass on event. */
+   return lookup;
+}
+
+static Eina_Bool
+_ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press)
+{
+   Ecore_Input_Window *lookup;
+
+   lookup = _ecore_event_window_match(e->event_window);
+   if (!lookup) return ECORE_CALLBACK_PASS_ON;
+   ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+   if (press == ECORE_DOWN)
+     evas_event_feed_key_down(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
+   else
+     evas_event_feed_key_up(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press press)
+{
+   Ecore_Input_Window *lookup;
+   Evas_Button_Flags flags = EVAS_BUTTON_NONE;
+
+   lookup = _ecore_event_window_match(e->event_window);
+   if (!lookup) return ECORE_CALLBACK_PASS_ON;
+   if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
+   if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
+   if (e->multi.device == 0)
+     {
+        ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+        if (press == ECORE_DOWN)
+          evas_event_feed_mouse_down(lookup->evas, e->buttons, flags,
+                                     e->timestamp, NULL);
+        else
+          evas_event_feed_mouse_up(lookup->evas, e->buttons, flags,
+                                   e->timestamp, NULL);
+     }
+   else
+     {
+        if (press == ECORE_DOWN)
+          {
+             if (lookup->down_multi)
+                lookup->down_multi(lookup->window, e->multi.device,
+                                   e->x, e->y, e->multi.radius,
+                                   e->multi.radius_x, e->multi.radius_y,
+                                   e->multi.pressure, e->multi.angle,
+                                   e->multi.x, e->multi.y, flags,
+                                   e->timestamp);
+             else
+                evas_event_feed_multi_down(lookup->evas, e->multi.device,
+                                           e->x, e->y, e->multi.radius,
+                                           e->multi.radius_x, e->multi.radius_y,
+                                           e->multi.pressure, e->multi.angle,
+                                           e->multi.x, e->multi.y, flags,
+                                           e->timestamp, NULL);
+          }
+        else
+          {
+             if (lookup->up_multi)
+                lookup->up_multi(lookup->window, e->multi.device,
+                                 e->x, e->y, e->multi.radius,
+                                 e->multi.radius_x, e->multi.radius_y,
+                                 e->multi.pressure, e->multi.angle,
+                                 e->multi.x, e->multi.y, flags,
+                                 e->timestamp);
+             else
+                evas_event_feed_multi_up(lookup->evas, e->multi.device,
+                                         e->x, e->y, e->multi.radius,
+                                         e->multi.radius_x, e->multi.radius_y,
+                                         e->multi.pressure, e->multi.angle,
+                                         e->multi.x, e->multi.y, flags,
+                                         e->timestamp, NULL);
+          }
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+EAPI Eina_Bool
+ecore_event_evas_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Event_Mouse_Move *e;
+   Ecore_Input_Window *lookup;
+
+   e = event;
+   lookup = _ecore_event_window_match(e->event_window);
+   if (!lookup) return ECORE_CALLBACK_PASS_ON;
+   if (e->multi.device == 0)
+     {
+        ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+        if (lookup->move_mouse)
+           lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
+        else
+           evas_event_feed_mouse_move(lookup->evas, e->x, e->y, e->timestamp,
+                                      NULL);
+     }
+   else
+     {
+        if (lookup->move_multi)
+           lookup->move_multi(lookup->window, e->multi.device,
+                              e->x, e->y, e->multi.radius,
+                              e->multi.radius_x, e->multi.radius_y,
+                              e->multi.pressure, e->multi.angle,
+                              e->multi.x, e->multi.y, e->timestamp);
+        else
+           evas_event_feed_multi_move(lookup->evas, e->multi.device,
+                                      e->x, e->y, e->multi.radius,
+                                      e->multi.radius_x, e->multi.radius_y,
+                                      e->multi.pressure, e->multi.angle,
+                                      e->multi.x, e->multi.y, e->timestamp,
+                                      NULL);
+     }
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+EAPI Eina_Bool
+ecore_event_evas_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_DOWN);
+}
+
+EAPI Eina_Bool
+ecore_event_evas_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_UP);
+}
+
+static Eina_Bool
+_ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io)
+{
+   Ecore_Input_Window *lookup;
+
+   lookup = _ecore_event_window_match(e->event_window);
+   if (!lookup) return ECORE_CALLBACK_PASS_ON;
+   ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+   switch (io)
+     {
+      case ECORE_IN:
+         evas_event_feed_mouse_in(lookup->evas, e->timestamp, NULL);
+         break;
+      case ECORE_OUT:
+         evas_event_feed_mouse_out(lookup->evas, e->timestamp, NULL);
+         break;
+      default:
+         break;
+     }
+
+   lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+EAPI Eina_Bool
+ecore_event_evas_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_DOWN);
+}
+
+EAPI Eina_Bool
+ecore_event_evas_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_UP);
+}
+
+EAPI Eina_Bool
+ecore_event_evas_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Event_Mouse_Wheel *e;
+   Ecore_Input_Window *lookup;
+
+   e = event;
+   lookup = _ecore_event_window_match(e->event_window);
+   if (!lookup) return ECORE_CALLBACK_PASS_ON;
+   ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+   evas_event_feed_mouse_wheel(lookup->evas, e->direction, e->z, e->timestamp, NULL);
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+EAPI Eina_Bool
+ecore_event_evas_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_IN);
+}
+
+EAPI Eina_Bool
+ecore_event_evas_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_OUT);
+}
+
+EAPI int
+ecore_event_evas_init(void)
+{
+   if (++_ecore_event_evas_init_count !=  1)
+     return _ecore_event_evas_init_count;
+
+   _ecore_input_evas_log_dom = eina_log_domain_register
+     ("ecore_input_evas",  ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR);
+   if (_ecore_input_evas_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for the ecore input evas_module.");
+        return --_ecore_event_evas_init_count;
+     }
+
+   if (!ecore_init())
+     {
+        return --_ecore_event_evas_init_count;
+     }
+
+   if (!ecore_event_init())
+     {
+        goto shutdown_ecore;
+     }
+
+   ecore_event_evas_handlers[0] = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
+                                                          ecore_event_evas_key_down,
+                                                          NULL);
+   ecore_event_evas_handlers[1] = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
+                                                          ecore_event_evas_key_up,
+                                                          NULL);
+   ecore_event_evas_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                                                          ecore_event_evas_mouse_button_down,
+                                                          NULL);
+   ecore_event_evas_handlers[3] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
+                                                          ecore_event_evas_mouse_button_up,
+                                                          NULL);
+   ecore_event_evas_handlers[4] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
+                                                          ecore_event_evas_mouse_move,
+                                                          NULL);
+   ecore_event_evas_handlers[5] = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
+                                                          ecore_event_evas_mouse_wheel,
+                                                          NULL);
+   ecore_event_evas_handlers[6] = ecore_event_handler_add(ECORE_EVENT_MOUSE_IN,
+                                                          ecore_event_evas_mouse_in,
+                                                          NULL);
+   ecore_event_evas_handlers[7] = ecore_event_handler_add(ECORE_EVENT_MOUSE_OUT,
+                                                          ecore_event_evas_mouse_out,
+                                                          NULL);
+
+   _window_hash = eina_hash_pointer_new(free);
+
+   return _ecore_event_evas_init_count;
+
+   shutdown_ecore:
+   ecore_shutdown();
+
+   return --_ecore_event_evas_init_count;
+}
+
+EAPI int
+ecore_event_evas_shutdown(void)
+{
+   size_t i;
+
+   if (--_ecore_event_evas_init_count != 0)
+     return _ecore_event_evas_init_count;
+
+   eina_hash_free(_window_hash);
+   _window_hash = NULL;
+   for (i = 0; i < sizeof(ecore_event_evas_handlers) / sizeof(Ecore_Event_Handler *); i++)
+     {
+        ecore_event_handler_del(ecore_event_evas_handlers[i]);
+        ecore_event_evas_handlers[i] = NULL;
+     }
+
+   ecore_event_shutdown();
+   ecore_shutdown();
+
+   eina_log_domain_unregister(_ecore_input_evas_log_dom);
+   _ecore_input_evas_log_dom = -1;
+
+   return _ecore_event_evas_init_count;
+}
diff --git a/src/lib/ecore_input_evas/ecore_input_evas_private.h b/src/lib/ecore_input_evas/ecore_input_evas_private.h
new file mode 100644 (file)
index 0000000..c19cfbf
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _ECORE_INPUT_PRIVATE_H
+#define _ECORE_INPUT_PRIVATE_H
+
+extern int _ecore_input_evas_log_dom;
+
+#ifdef ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR
+#undef ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR 
+#endif
+
+#define ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+#undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_input_evas_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+#undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_input_evas_log_dom, __VA_ARGS__)
+
+#ifdef INF
+#undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_input_evas_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+#undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_input_evas_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+#undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_input_evas_log_dom, __VA_ARGS__)
+
+#endif
index b420cf2..f77870f 100644 (file)
@@ -1,12 +1,19 @@
 #ifndef _ECORE_IPC_H
 #define _ECORE_IPC_H
 
+#include <Eina.h>
+
 #ifdef EAPI
-#undef EAPI
+# undef EAPI
 #endif
-#ifdef _MSC_VER
-# ifdef BUILDING_DLL
-#  define EAPI __declspec(dllexport)
+
+#ifdef _WIN32
+# ifdef EFL_ECORE_IPC_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif
 # else
 #  define EAPI __declspec(dllimport)
 # endif
@@ -22,8 +29,6 @@
 # endif
 #endif
 
-#include <Ecore_Data.h>
-
 /**
  * @file Ecore_Ipc.h
  * @brief Ecore inter-process communication functions.
 #ifdef __cplusplus
 extern "C" {
 #endif
-#ifndef _ECORE_IPC_PRIVATE_H
-   typedef void Ecore_Ipc_Server; /**< An IPC connection handle */
-   typedef void Ecore_Ipc_Client; /**< An IPC connection handle */
-#endif
 
-/**
- * Macros used for generic data packing
- */
-EAPI unsigned short _ecore_ipc_swap_16(unsigned short v);
-EAPI unsigned int _ecore_ipc_swap_32(unsigned int v);
+typedef struct _Ecore_Ipc_Server Ecore_Ipc_Server; /**< An IPC connection handle */
+typedef struct _Ecore_Ipc_Client Ecore_Ipc_Client; /**< An IPC connection handle */
+
+EAPI unsigned short     _ecore_ipc_swap_16(unsigned short v);
+EAPI unsigned int       _ecore_ipc_swap_32(unsigned int v);
 EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
 
 #ifdef WORDS_BIGENDIAN
@@ -69,44 +69,44 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
 /* unpacking */
 #define ECORE_IPC_GET64(v)\
     { \
-       p->v = ECORE_IPC_SWAP2CPU64(*(long long *)(ptr)); \
-       ptr += 8; \
+        p->v = ECORE_IPC_SWAP2CPU64(*(long long *)(ptr)); \
+        ptr += 8; \
     }
 #define ECORE_IPC_GET32(v)\
     { \
-       p->v = ECORE_IPC_SWAP2CPU32(*(int *)(ptr)); \
-       ptr += 4; \
+        p->v = ECORE_IPC_SWAP2CPU32(*(int *)(ptr)); \
+        ptr += 4; \
     }
 #define ECORE_IPC_GET16(v)\
     { \
-       p->v = ECORE_IPC_SWAP2CPU16(*(short *)(ptr)); \
-       ptr += 2; \
+        p->v = ECORE_IPC_SWAP2CPU16(*(short *)(ptr)); \
+        ptr += 2; \
     }
 #define ECORE_IPC_GET8(v) \
     { \
-       p->v = ECORE_IPC_SWAP2CPU8(*(char *)(ptr)); \
-       ptr += 1; \
+        p->v = ECORE_IPC_SWAP2CPU8(*(char *)(ptr)); \
+        ptr += 1; \
     }
 /* packing */
 #define ECORE_IPC_PUT64(v)\
     { \
-       *(long long *)(ptr) = ECORE_IPC_SWAP2NET64(p->v); \
-       ptr += 8; \
+        *(long long *)(ptr) = ECORE_IPC_SWAP2NET64(p->v); \
+        ptr += 8; \
     }
 #define ECORE_IPC_PUT32(v)\
     { \
-       *(int *)(ptr) = ECORE_IPC_SWAP2NET32(p->v); \
-       ptr += 4; \
+        *(int *)(ptr) = ECORE_IPC_SWAP2NET32(p->v); \
+        ptr += 4; \
     }
 #define ECORE_IPC_PUT16(v)\
     { \
-       *(short *)(ptr) = ECORE_IPC_SWAP2NET16(p->v); \
-       ptr += 2; \
+        *(short *)(ptr) = ECORE_IPC_SWAP2NET16(p->v); \
+        ptr += 2; \
     }
 #define ECORE_IPC_PUT8(v) \
     { \
-       *(char *)(ptr) = ECORE_IPC_SWAP2NET8(p->v); \
-       ptr += 1; \
+        *(char *)(ptr) = ECORE_IPC_SWAP2NET8(p->v); \
+        ptr += 1; \
     }
 /* padding data */
 #define ECORE_IPC_PAD8()   ptr += 1
@@ -124,16 +124,16 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
 #define ECORE_IPC_CHEKS() if (*((unsigned char *)d + s - 1) != 0) return 0;
 #define ECORE_IPC_GETS(v) \
     { \
-       if (ptr < ((unsigned char *)d + s)) \
-           { \
-               p->v = (char *)ptr; \
-               ptr += strlen(p->v) + 1; \
-           } \
+        if (ptr < ((unsigned char *)d + s)) \
+            { \
+                p->v = (char *)ptr; \
+                ptr += strlen(p->v) + 1; \
+            } \
     } 
 #define ECORE_IPC_PUTS(v, l)\
     { \
-       strcpy((char *)ptr, p->v); \
-       ptr += l + 1; \
+        strcpy((char *)ptr, p->v); \
+        ptr += l + 1; \
     }
 
 /* handy to calculate what sized block we need to alloc */
@@ -143,8 +143,8 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
 /* saves typing function headers */
 #define ECORE_IPC_DEC_STRUCT_PROTO(x) static int x(void *d, int s, void *pp)
 #define ECORE_IPC_ENC_STRUCT_PROTO(x) static void *x(void *pp, int *s)
-#define ECORE_IPC_DEC_EVAS_LIST_PROTO(x) static Evas_List *x(void *d, int s)
-#define ECORE_IPC_ENC_EVAS_LIST_PROTO(x) static void *x(Evas_List *lp, int *s)
+#define ECORE_IPC_DEC_EINA_LIST_PROTO(x) static Eina_List *x(void *d, int s)
+#define ECORE_IPC_ENC_EINA_LIST_PROTO(x) static void *x(Eina_List *lp, int *s)
 
 
 /* decoder setup - saves typing. requires data packet of exact size, or fail */
@@ -179,9 +179,9 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
 /* footer for the hell of it */
 #define ECORE_IPC_ENC_STRUCT_FOOT() return d
 
-#define ECORE_IPC_DEC_EVAS_LIST_HEAD(typ) \
+#define ECORE_IPC_DEC_EINA_LIST_HEAD(typ) \
     unsigned char *ptr; \
-    Evas_List *l; \
+    Eina_List *l; \
     typ *p; \
     l = NULL; \
     ptr = d; \
@@ -189,12 +189,12 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
         { \
             p = malloc(sizeof(typ));
 
-#define ECORE_IPC_DEC_EVAS_LIST_FOOT() \
-           l = evas_list_append(l, p); \
+#define ECORE_IPC_DEC_EINA_LIST_FOOT() \
+            l = eina_list_append(l, p); \
         } \
     return l
-#define ECORE_IPC_ENC_EVAS_LIST_HEAD_START(typ) \
-    Evas_List *l; \
+#define ECORE_IPC_ENC_EINA_LIST_HEAD_START(typ) \
+    Eina_List *l; \
     typ *p; \
     unsigned char *d, *ptr; \
     int len; \
@@ -203,7 +203,7 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
     for (l = lp; l; l = l->next) \
       { \
          p = l->data;
-#define ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH() \
+#define ECORE_IPC_ENC_EINA_LIST_HEAD_FINISH() \
       } \
     d = malloc(len); \
     if(!d) return NULL; \
@@ -213,112 +213,113 @@ EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
       { \
          p = l->data;
 
-#define ECORE_IPC_ENC_EVAS_LIST_FOOT() \
+#define ECORE_IPC_ENC_EINA_LIST_FOOT() \
       } \
    return d
 
-   typedef enum _Ecore_Ipc_Type
-     {
-       ECORE_IPC_LOCAL_USER,
-         ECORE_IPC_LOCAL_SYSTEM,
-         ECORE_IPC_REMOTE_SYSTEM,
-          ECORE_IPC_USE_SSL = 16
-     } Ecore_Ipc_Type;
-   
-   typedef struct _Ecore_Ipc_Event_Client_Add  Ecore_Ipc_Event_Client_Add;
-   typedef struct _Ecore_Ipc_Event_Client_Del  Ecore_Ipc_Event_Client_Del;
-   typedef struct _Ecore_Ipc_Event_Server_Add  Ecore_Ipc_Event_Server_Add;
-   typedef struct _Ecore_Ipc_Event_Server_Del  Ecore_Ipc_Event_Server_Del;
-   typedef struct _Ecore_Ipc_Event_Client_Data Ecore_Ipc_Event_Client_Data;
-   typedef struct _Ecore_Ipc_Event_Server_Data Ecore_Ipc_Event_Server_Data;
-   
-   struct _Ecore_Ipc_Event_Client_Add
-     {
-       Ecore_Ipc_Client *client;
-     };
-   
-   struct _Ecore_Ipc_Event_Client_Del
-     {
-       Ecore_Ipc_Client *client;
-     };
-   
-   struct _Ecore_Ipc_Event_Server_Add
-     {
-       Ecore_Ipc_Server *server;
-     };
+typedef enum _Ecore_Ipc_Type
+{
+   ECORE_IPC_LOCAL_USER,
+   ECORE_IPC_LOCAL_SYSTEM,
+   ECORE_IPC_REMOTE_SYSTEM,
+   ECORE_IPC_USE_SSL = (1 << 4),
+   ECORE_IPC_NO_PROXY = (1 << 5)
+} Ecore_Ipc_Type;
    
-   struct _Ecore_Ipc_Event_Server_Del
-     {
-       Ecore_Ipc_Server *server;
-     };
-   
-   struct _Ecore_Ipc_Event_Client_Data
-     {
-       Ecore_Ipc_Client *client;
-       /* FIXME: this needs to become an ipc message */
-       int               major;
-       int               minor;
-       int               ref;
-       int               ref_to;
-       int               response;
-       void             *data;
-       int               size;
-     };
-   
-   struct _Ecore_Ipc_Event_Server_Data
-     {
-       Ecore_Ipc_Server *server;
-       /* FIXME: this needs to become an ipc message */
-       int               major;
-       int               minor;
-       int               ref;
-       int               ref_to;
-       int               response;
-       void             *data;
-       int               size;
-     };
-   
-   EAPI extern int ECORE_IPC_EVENT_CLIENT_ADD;
-   EAPI extern int ECORE_IPC_EVENT_CLIENT_DEL;
-   EAPI extern int ECORE_IPC_EVENT_SERVER_ADD;
-   EAPI extern int ECORE_IPC_EVENT_SERVER_DEL;
-   EAPI extern int ECORE_IPC_EVENT_CLIENT_DATA;
-   EAPI extern int ECORE_IPC_EVENT_SERVER_DATA;
-   
-   EAPI int               ecore_ipc_init(void);
-   EAPI int               ecore_ipc_shutdown(void);
-   
-   /* FIXME: need to add protocol type parameter */
-   EAPI Ecore_Ipc_Server *ecore_ipc_server_add(Ecore_Ipc_Type type, const char *name, int port, const void *data);
+typedef struct _Ecore_Ipc_Event_Client_Add  Ecore_Ipc_Event_Client_Add;
+typedef struct _Ecore_Ipc_Event_Client_Del  Ecore_Ipc_Event_Client_Del;
+typedef struct _Ecore_Ipc_Event_Server_Add  Ecore_Ipc_Event_Server_Add;
+typedef struct _Ecore_Ipc_Event_Server_Del  Ecore_Ipc_Event_Server_Del;
+typedef struct _Ecore_Ipc_Event_Client_Data Ecore_Ipc_Event_Client_Data;
+typedef struct _Ecore_Ipc_Event_Server_Data Ecore_Ipc_Event_Server_Data;
+
+struct _Ecore_Ipc_Event_Client_Add
+{
+   Ecore_Ipc_Client *client;
+};
+
+struct _Ecore_Ipc_Event_Client_Del
+{
+   Ecore_Ipc_Client *client;
+};
+
+struct _Ecore_Ipc_Event_Server_Add
+{
+   Ecore_Ipc_Server *server;
+};
+
+struct _Ecore_Ipc_Event_Server_Del
+{
+   Ecore_Ipc_Server *server;
+};
    
-   /* FIXME: need to add protocol type parameter */
-   EAPI Ecore_Ipc_Server *ecore_ipc_server_connect(Ecore_Ipc_Type type, char *name, int port, const void *data);
-   EAPI void             *ecore_ipc_server_del(Ecore_Ipc_Server *svr);
-   EAPI void             *ecore_ipc_server_data_get(Ecore_Ipc_Server *svr);
-   EAPI int               ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr);
-   EAPI Ecore_List       *ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr);
+struct _Ecore_Ipc_Event_Client_Data
+{
+   Ecore_Ipc_Client *client;
    /* FIXME: this needs to become an ipc message */
-   EAPI int               ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
-   EAPI void              ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients);
-   EAPI void              ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *srv, int size);
-   EAPI int               ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *srv);
-   EAPI char             *ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr);
-   EAPI void              ecore_ipc_server_flush(Ecore_Ipc_Server *svr);
-       
+   int               major;
+   int               minor;
+   int               ref;
+   int               ref_to;
+   int               response;
+   void             *data;
+   int               size;
+};
+   
+struct _Ecore_Ipc_Event_Server_Data
+{
+   Ecore_Ipc_Server *server;
    /* FIXME: this needs to become an ipc message */
-   EAPI int               ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
-   EAPI Ecore_Ipc_Server *ecore_ipc_client_server_get(Ecore_Ipc_Client *cl);
-   EAPI void             *ecore_ipc_client_del(Ecore_Ipc_Client *cl);
-   EAPI void              ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data);
-   EAPI void             *ecore_ipc_client_data_get(Ecore_Ipc_Client *cl);
-   EAPI void              ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size);
-   EAPI int               ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl);
-   EAPI char             *ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl);
-   EAPI void              ecore_ipc_client_flush(Ecore_Ipc_Client *cl);
+   int               major;
+   int               minor;
+   int               ref;
+   int               ref_to;
+   int               response;
+   void             *data;
+   int               size;
+};
    
-   EAPI int               ecore_ipc_ssl_available_get(void);
-   /* FIXME: need to add a callback to "ok" large ipc messages greater than */
-   /*        a certain size (seurity/DOS attack safety) */
+EAPI extern int ECORE_IPC_EVENT_CLIENT_ADD;
+EAPI extern int ECORE_IPC_EVENT_CLIENT_DEL;
+EAPI extern int ECORE_IPC_EVENT_SERVER_ADD;
+EAPI extern int ECORE_IPC_EVENT_SERVER_DEL;
+EAPI extern int ECORE_IPC_EVENT_CLIENT_DATA;
+EAPI extern int ECORE_IPC_EVENT_SERVER_DATA;
+
+EAPI int               ecore_ipc_init(void);
+EAPI int               ecore_ipc_shutdown(void);
+
+/* FIXME: need to add protocol type parameter */
+EAPI Ecore_Ipc_Server *ecore_ipc_server_add(Ecore_Ipc_Type type, const char *name, int port, const void *data);
+
+/* FIXME: need to add protocol type parameter */
+EAPI Ecore_Ipc_Server *ecore_ipc_server_connect(Ecore_Ipc_Type type, char *name, int port, const void *data);
+EAPI void             *ecore_ipc_server_del(Ecore_Ipc_Server *svr);
+EAPI void             *ecore_ipc_server_data_get(Ecore_Ipc_Server *svr);
+EAPI Eina_Bool         ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr);
+EAPI Eina_List        *ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr);
+/* FIXME: this needs to become an ipc message */
+EAPI int               ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
+EAPI void              ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients);
+EAPI void              ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *srv, int size);
+EAPI int               ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *srv);
+EAPI const char       *ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr);
+EAPI void              ecore_ipc_server_flush(Ecore_Ipc_Server *svr);
+    
+/* FIXME: this needs to become an ipc message */
+EAPI int               ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
+EAPI Ecore_Ipc_Server *ecore_ipc_client_server_get(Ecore_Ipc_Client *cl);
+EAPI void             *ecore_ipc_client_del(Ecore_Ipc_Client *cl);
+EAPI void              ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data);
+EAPI void             *ecore_ipc_client_data_get(Ecore_Ipc_Client *cl);
+EAPI void              ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size);
+EAPI int               ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl);
+EAPI const char       *ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl);
+EAPI void              ecore_ipc_client_flush(Ecore_Ipc_Client *cl);
+
+EAPI int               ecore_ipc_ssl_available_get(void);
+/* FIXME: need to add a callback to "ok" large ipc messages greater than */
+/*        a certain size (seurity/DOS attack safety) */
    
 #ifdef __cplusplus
 }
index 8dcd9df..60e32d3 100644 (file)
@@ -7,31 +7,28 @@ AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
 -I$(top_srcdir)/src/lib/ecore_con \
 -I$(top_srcdir)/src/lib/ecore_ipc \
-@SSL_CFLAGS@
-
-if BUILD_ECORE_IPC
+@EFL_ECORE_IPC_BUILD@ \
+@SSL_CFLAGS@ \
+@EVIL_CFLAGS@ \
+@EINA_CFLAGS@ \
+@WIN32_CPPFLAGS@
 
 lib_LTLIBRARIES = libecore_ipc.la
-include_HEADERS = \
-Ecore_Ipc.h
+includes_HEADERS = Ecore_Ipc.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_ipc_la_SOURCES = \
-ecore_ipc.c \
-ecore_ipc_private.h
+ecore_ipc.c
 
+libecore_ipc_la_CFLAGS = @WIN32_CFLAGS@
 libecore_ipc_la_LIBADD = \
 $(top_builddir)/src/lib/ecore/libecore.la \
 $(top_builddir)/src/lib/ecore_con/libecore_con.la \
-@SSL_LIBS@
-
-libecore_ipc_la_LDFLAGS = -version-info @version_info@
-
-libecore_ipc_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la \
-$(top_builddir)/src/lib/ecore_con/libecore_con.la
+@SSL_LIBS@ \
+@EINA_LIBS@ \
+@EVIL_LIBS@ \
+@WIN32_LIBS@
 
-endif
+libecore_ipc_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
 
-EXTRA_DIST = \
-ecore_ipc.c \
-ecore_ipc_private.h
+EXTRA_DIST = ecore_ipc_private.h
index 1ea7887..0480001 100644 (file)
@@ -1,17 +1,31 @@
-#include "Ecore.h"
-#include <config.h>
-#include "Ecore_Con.h"
-#include "ecore_private.h"
-#include "ecore_ipc_private.h"
-#include "Ecore_Ipc.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
 
 #ifdef HAVE_NETINET_IN_H
+# include <sys/types.h>
 # include <netinet/in.h>
 #endif
+
 #ifdef HAVE_WINSOCK2_H
 # include <winsock2.h>
 #endif
 
+#if USE_GNUTLS_OPENSSL
+# include <gnutls/openssl.h>
+#elif USE_OPENSSL
+# include <openssl/ssl.h>
+#endif
+
+#include <Ecore.h>
+#include <ecore_private.h>
+#include <Ecore_Con.h>
+
+#include "Ecore_Ipc.h"
+#include "ecore_ipc_private.h"
+
 #define DLT_ZERO   0
 #define DLT_ONE    1
 #define DLT_SAME   2
@@ -29,7 +43,8 @@
 #define DLT_R1     14
 #define DLT_R2     15
 
-/* byte swappers - for dealing with big vs little endian machines */
+int _ecore_ipc_log_dom = -1;
+
 EAPI unsigned short
 _ecore_ipc_swap_16(unsigned short v)
 {
@@ -75,78 +90,78 @@ _ecore_ipc_dlt_int(int out, int prev, int *mode)
    /* 0 byte */
    if (out == 0)
      {
-       *mode = DLT_ZERO;
-       return 0;
+        *mode = DLT_ZERO;
+        return 0;
      }
    if (out == (int)0xffffffff)
      {
-       *mode = DLT_ONE;
-       return 0;
+        *mode = DLT_ONE;
+        return 0;
      }
    if (out == prev)
      {
-       *mode = DLT_SAME;
-       return 0;
+        *mode = DLT_SAME;
+        return 0;
      }
    if (out == prev << 1)
      {
-       *mode = DLT_SHL;
-       return 0;
+        *mode = DLT_SHL;
+        return 0;
      }
    if (out == prev >> 1)
      {
-       *mode = DLT_SHR;
-       return 0;
+        *mode = DLT_SHR;
+        return 0;
      }
    /* 1 byte */
    dlt = out - prev;
    if (!(dlt & 0xffffff00))
      {
-       *mode = DLT_ADD8;
-       return dlt & 0xff;
+        *mode = DLT_ADD8;
+        return dlt & 0xff;
      }
    dlt = prev - out;
    if (!(dlt & 0xffffff00))
      {
-       *mode = DLT_DEL8;
-       return dlt & 0xff;
+        *mode = DLT_DEL8;
+        return dlt & 0xff;
      }
    dlt = out - prev;
    if (!(dlt & 0x00ffffff))
      {
-       *mode = DLT_ADDU8;
-       return (dlt >> 24) & 0xff;
+        *mode = DLT_ADDU8;
+        return (dlt >> 24) & 0xff;
      }
    dlt = prev - out;
    if (!(dlt & 0x00ffffff))
      {
-       *mode = DLT_DELU8;
-       return (dlt >> 24) & 0xff;
+        *mode = DLT_DELU8;
+        return (dlt >> 24) & 0xff;
      }
    /* 2 byte */
    dlt = out - prev;
    if (!(dlt & 0xffff0000))
      {
-       *mode = DLT_ADD16;
-       return dlt & 0xffff;
+        *mode = DLT_ADD16;
+        return dlt & 0xffff;
      }
    dlt = prev - out;
    if (!(dlt & 0xffff0000))
      {
-       *mode = DLT_DEL16;
-       return dlt & 0xffff;
+        *mode = DLT_DEL16;
+        return dlt & 0xffff;
      }
    dlt = out - prev;
    if (!(dlt & 0x0000ffff))
      {
-       *mode = DLT_ADDU16;
-       return (dlt >> 16) & 0xffff;
+        *mode = DLT_ADDU16;
+        return (dlt >> 16) & 0xffff;
      }
    dlt = prev - out;
    if (!(dlt & 0x0000ffff))
      {
-       *mode = DLT_DELU16;
-       return (dlt >> 16) & 0xffff;
+        *mode = DLT_DELU16;
+        return (dlt >> 16) & 0xffff;
      }
    /* 4 byte */
    *mode = DLT_SET;
@@ -159,65 +174,65 @@ _ecore_ipc_ddlt_int(int in, int prev, int mode)
    switch (mode)
      {
       case DLT_ZERO:
-       return 0;
-       break;
+        return 0;
+        break;
       case DLT_ONE:
-       return 0xffffffff;
-       break;
+        return 0xffffffff;
+        break;
       case DLT_SAME:
-       return prev;
-       break;
+        return prev;
+        break;
       case DLT_SHL:
-       return prev << 1;
-       break;
+        return prev << 1;
+        break;
       case DLT_SHR:
-       return prev >> 1;
-       break;
+        return prev >> 1;
+        break;
       case DLT_ADD8:
-       return prev + in;
-       break;
+        return prev + in;
+        break;
       case DLT_DEL8:
-       return prev - in;
-       break;
+        return prev - in;
+        break;
       case DLT_ADDU8:
-       return prev + (in << 24);
-       break;
+        return prev + (in << 24);
+        break;
       case DLT_DELU8:
-       return prev - (in << 24);
-       break;
+        return prev - (in << 24);
+        break;
       case DLT_ADD16:
-       return prev + in;
-       break;
+        return prev + in;
+        break;
       case DLT_DEL16:
-       return prev - in;
-       break;
+        return prev - in;
+        break;
       case DLT_ADDU16:
-       return prev + (in << 16);
-       break;
+        return prev + (in << 16);
+        break;
       case DLT_DELU16:
-       return prev - (in << 16);
-       break;
+        return prev - (in << 16);
+        break;
       case DLT_SET:
-       return in;
-       break;
+        return in;
+        break;
       case DLT_R1:
-       return 0;
-       break;
+        return 0;
+        break;
       case DLT_R2:
-       return 0;
-       break;
+        return 0;
+        break;
       default:
-       break;
+        break;
      }
    return 0;
 }
 
-static int _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
-static int _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
+static Eina_Bool _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
 static void _ecore_ipc_event_client_add_free(void *data, void *ev);
 static void _ecore_ipc_event_client_del_free(void *data, void *ev);
 static void _ecore_ipc_event_client_data_free(void *data, void *ev);
@@ -232,8 +247,8 @@ EAPI int ECORE_IPC_EVENT_SERVER_DEL = 0;
 EAPI int ECORE_IPC_EVENT_CLIENT_DATA = 0;
 EAPI int ECORE_IPC_EVENT_SERVER_DATA = 0;
 
-static int                  init_count = 0;
-static Ecore_Ipc_Server    *servers = NULL;
+static int                  _ecore_ipc_init_count = 0;
+static Eina_List           *servers = NULL;
 static Ecore_Event_Handler *handler[6];
 
 /**
@@ -253,9 +268,17 @@ ecore_ipc_init(void)
 {
    int i = 0;
 
-   if (++init_count != 1) return init_count;
-
-   ecore_con_init();
+   if (++_ecore_ipc_init_count != 1)
+     return _ecore_ipc_init_count;
+   _ecore_ipc_log_dom = eina_log_domain_register
+     ("ecore_ipc", ECORE_IPC_DEFAULT_LOG_COLOR);
+   if(_ecore_ipc_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Ecore IPC module.");
+       return --_ecore_ipc_init_count;
+     }
+   if (!ecore_con_init())
+     return --_ecore_ipc_init_count;
 
    ECORE_IPC_EVENT_CLIENT_ADD = ecore_event_type_new();
    ECORE_IPC_EVENT_CLIENT_DEL = ecore_event_type_new();
@@ -265,18 +288,18 @@ ecore_ipc_init(void)
    ECORE_IPC_EVENT_SERVER_DATA = ecore_event_type_new();
 
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
-                                         _ecore_ipc_event_client_add, NULL);
+                                          _ecore_ipc_event_client_add, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
-                                         _ecore_ipc_event_client_del, NULL);
+                                          _ecore_ipc_event_client_del, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
-                                         _ecore_ipc_event_server_add, NULL);
+                                          _ecore_ipc_event_server_add, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
-                                         _ecore_ipc_event_server_del, NULL);
+                                          _ecore_ipc_event_server_del, NULL);
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
-                                         _ecore_ipc_event_client_data, NULL);
-   handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
-                                         _ecore_ipc_event_server_data, NULL);
-   return init_count;
+                                          _ecore_ipc_event_client_data, NULL);
+   handler[i] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
+                                          _ecore_ipc_event_server_data, NULL);
+   return _ecore_ipc_init_count;
 }
 
 /**
@@ -290,16 +313,21 @@ ecore_ipc_shutdown(void)
 {
    int i;
 
-   if (--init_count != 0) return init_count;
+   if (--_ecore_ipc_init_count != 0)
+     return _ecore_ipc_init_count;
 
-   while (servers) ecore_ipc_server_del(servers);
+   Eina_List *l, *l2;
+   Ecore_Ipc_Server *svr;
+   EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
+     ecore_ipc_server_del(svr);
 
    for (i = 0; i < 6; i++)
      ecore_event_handler_del(handler[i]);
 
    ecore_con_shutdown();
-
-   return init_count;
+   eina_log_domain_unregister(_ecore_ipc_log_dom);
+   _ecore_ipc_log_dom = -1;
+   return _ecore_ipc_init_count;
 }
 
 /**
@@ -329,6 +357,8 @@ ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, cons
    Ecore_Ipc_Type type;
    Ecore_Con_Type extra = 0;
 
+   if (!name) return NULL;
+
    svr = calloc(1, sizeof(Ecore_Ipc_Server));
    if (!svr) return NULL;
    type = compl_type;
@@ -337,28 +367,26 @@ ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, cons
    switch (type)
      {
       case ECORE_IPC_LOCAL_USER:
-       svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
+        break;
       case ECORE_IPC_LOCAL_SYSTEM:
-       svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
+        break;
       case ECORE_IPC_REMOTE_SYSTEM:
-       svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
+        break;
       default:
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    if (!svr->server)
      {
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    svr->max_buf_size = 32 * 1024;
    svr->data = (void *)data;
-   svr->client_list = ecore_list_new();
-   ecore_list_init(svr->client_list);
-   servers = _ecore_list2_append(servers, svr);
+   servers = eina_list_append(servers, svr);
    ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
    return svr;
 }
@@ -386,35 +414,39 @@ ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const
    Ecore_Ipc_Server *svr;
    Ecore_Ipc_Type type;
    Ecore_Con_Type extra = 0;
+   int features;
 
    svr = calloc(1, sizeof(Ecore_Ipc_Server));
    if (!svr) return NULL;
-   type = compl_type;
-   type &= ~ECORE_IPC_USE_SSL;
-   if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
+   type = compl_type & ECORE_IPC_TYPE;
+   features = compl_type & ECORE_IPC_SSL;
+   if ((features & ECORE_IPC_USE_SSL) == ECORE_IPC_USE_SSL)
+     extra |= ECORE_CON_USE_SSL;
+   if ((features & ECORE_IPC_NO_PROXY) == ECORE_IPC_NO_PROXY)
+     extra |= ECORE_CON_NO_PROXY;
    switch (type)
      {
       case ECORE_IPC_LOCAL_USER:
-       svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
+        break;
       case ECORE_IPC_LOCAL_SYSTEM:
-       svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
+        break;
       case ECORE_IPC_REMOTE_SYSTEM:
-       svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
-       break;
+        svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
+        break;
       default:
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    if (!svr->server)
      {
-       free(svr);
-       return NULL;
+        free(svr);
+        return NULL;
      }
    svr->max_buf_size = -1;
    svr->data = (void *)data;
-   servers = _ecore_list2_append(servers, svr);
+   servers = eina_list_append(servers, svr);
    ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
    return svr;
 }
@@ -432,23 +464,27 @@ ecore_ipc_server_del(Ecore_Ipc_Server *svr)
 
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_del");
+        return NULL;
      }
+   if (svr->delete_me) return NULL;
+
    data = svr->data;
    svr->data = NULL;
    svr->delete_me = 1;
    if (svr->event_count == 0)
      {
-       while (svr->clients)
-         ecore_ipc_client_del((Ecore_Ipc_Client *)svr->clients);
-       ecore_con_server_del(svr->server);
-       servers = _ecore_list2_remove(servers, svr);
-       if (svr->buf) free(svr->buf);
-       if (svr->client_list) ecore_list_destroy(svr->client_list);
-       ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
-       free(svr);
+        Ecore_Ipc_Client *cl;
+
+        EINA_LIST_FREE(svr->clients, cl)
+          ecore_ipc_client_del(cl);
+        if (svr->server) ecore_con_server_del(svr->server);
+        servers = eina_list_remove(servers, svr);
+
+        if (svr->buf) free(svr->buf);
+        ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
+        free(svr);
      }
    return data;
 }
@@ -464,9 +500,9 @@ ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_data_get");
+        return NULL;
      }
    return svr->data;
 }
@@ -474,17 +510,17 @@ ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
 /**
  * Retrieves whether the given IPC server is currently connected.
  * @param   svr The given IPC server.
- * @return  @c 1 if the server is connected.  @c 0 otherwise.
+ * @return @c EINA_TRUE if the server is connected, @c EINA_FALSE otherwise.
  * @ingroup Ecore_IPC_Server_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_connected_get");
-       return 0;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_connected_get");
+        return EINA_FALSE;
      }
    return ecore_con_server_connected_get(svr->server);
 }
@@ -492,51 +528,51 @@ ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
 /**
  * Retrieves the list of clients for this server.
  * @param   svr The given IPC server.
- * @return  An Ecore_List with the clients.
+ * @return  An Eina_List with the clients.
  * @ingroup Ecore_IPC_Server_Group
  */
-EAPI Ecore_List *
+EAPI Eina_List *
 ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_clients_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_clients_get");
+        return NULL;
      }
-   return svr->client_list;
+   return svr->clients;
 }
 
 #define SVENC(_member) \
    d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htonl(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       *(dat + s + 2) = dd[2]; \
-       *(dat + s + 3) = dd[3]; \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htonl(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        *(dat + s + 2) = dd[2]; \
+        *(dat + s + 3) = dd[3]; \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htons(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htons(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       *(dat + s + 0) = (unsigned char)d; \
-       s += 1; \
+        *(dat + s + 0) = (unsigned char)d; \
+        s += 1; \
      }
 
 /**
@@ -568,9 +604,9 @@ ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int
 
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_send");
-       return 0;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_send");
+        return 0;
      }
    if (size < 0) size = 0;
    msg.major    = major;
@@ -627,9 +663,9 @@ ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_client_limit_set");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_client_limit_set");
+        return;
      }
    ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
 }
@@ -646,9 +682,9 @@ ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_data_size_max_set");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_data_size_max_set");
+        return;
      }
    svr->max_buf_size = size;
 }
@@ -665,9 +701,9 @@ ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_data_size_max_get");
-       return -1;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_data_size_max_get");
+        return -1;
      }
    return svr->max_buf_size;
 }
@@ -682,14 +718,14 @@ ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
  *          deletion for the @p svr object. If no IP is known NULL is returned.
  * @ingroup Ecore_Ipc_Server_Group
  */
-EAPI char *
+EAPI const char *
 ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_ip_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_ip_get");
+        return NULL;
      }
    return ecore_con_server_ip_get(svr->server);
 }
@@ -705,9 +741,9 @@ ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
 {
    if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
      {
-       ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
-                        "ecore_ipc_server_server_flush");
-       return;
+        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
+                         "ecore_ipc_server_server_flush");
+        return;
      }
    ecore_con_server_flush(svr->server);
 }
@@ -716,32 +752,32 @@ ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
    d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htonl(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       *(dat + s + 2) = dd[2]; \
-       *(dat + s + 3) = dd[3]; \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htonl(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        *(dat + s + 2) = dd[2]; \
+        *(dat + s + 3) = dd[3]; \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dd; \
-       dd = (unsigned char *)&v; \
-       v = d; \
-       v = htons(v); \
-       *(dat + s + 0) = dd[0]; \
-       *(dat + s + 1) = dd[1]; \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dd; \
+        dd = (unsigned char *)&v; \
+        v = d; \
+        v = htons(v); \
+        *(dat + s + 0) = dd[0]; \
+        *(dat + s + 1) = dd[1]; \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       *(dat + s) = (unsigned char)d; \
-       s += 1; \
+        *(dat + s) = (unsigned char)d; \
+        s += 1; \
      }
 
 /**
@@ -776,10 +812,12 @@ ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int r
 
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_send");
-       return 0;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_send");
+        return 0;
      }
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(!cl->client, 0);
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(!ecore_con_client_connected_get(cl->client), 0);
    if (size < 0) size = 0;
    msg.major    = major;
    msg.minor    = minor;
@@ -819,11 +857,11 @@ ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_server_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_server_get");
+        return NULL;
      }
-   return (ecore_con_server_data_get(ecore_con_client_server_get(cl->client)));
+   return cl->svr;
 }
 
 /**
@@ -841,21 +879,21 @@ ecore_ipc_client_del(Ecore_Ipc_Client *cl)
 
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_del");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_del");
+        return NULL;
      }
    data = cl->data;
    cl->data = NULL;
    cl->delete_me = 1;
    if (cl->event_count == 0)
      {
-       svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
-       ecore_con_client_del(cl->client);
-       svr->clients = _ecore_list2_remove(svr->clients, cl);
-       if (cl->buf) free(cl->buf);
-       ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
-       free(cl);
+        svr = cl->svr;
+        if (cl->client) ecore_con_client_del(cl->client);
+        svr->clients = eina_list_remove(svr->clients, cl);
+        if (cl->buf) free(cl->buf);
+        ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
+        free(cl);
      }
    return data;
 }
@@ -871,9 +909,9 @@ ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_set");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_set");
+        return;
      }
    cl->data = (void *)data;
 }
@@ -889,9 +927,9 @@ ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_get");
+        return NULL;
      }
    return cl->data;
 }
@@ -899,7 +937,7 @@ ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
 /**
  * Sets the max data payload size for an Ipc message in bytes
  *
- * @param   client        The given client.
+ * @param   cl        The given client.
  * @param   size          The maximum data payload size in bytes.
  * @ingroup Ecore_Ipc_Client_Group
  */
@@ -908,18 +946,18 @@ ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_size_max_set");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_size_max_set");
+        return;
      }
    cl->max_buf_size = size;
 }
 
 /**
- * Sets the max data payload size for an Ipc message in bytes
+ * Gets the max data payload size for an Ipc message in bytes
  *
  * @param   cl            The given client.
- * @param   size          The maximum data payload size in bytes.
+ * @return The maximum data payload size in bytes on success, @c -1 on failure.
  * @ingroup Ecore_Ipc_Client_Group
  */
 EAPI int
@@ -927,9 +965,9 @@ ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_data_size_max_get");
-       return -1;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_data_size_max_get");
+        return -1;
      }
    return cl->max_buf_size;
 }
@@ -941,17 +979,18 @@ ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
  * @return  A pointer to an internal string that contains the IP address of
  *          the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
  *          This string should not be modified or trusted to stay valid after
- *          deletion for the @p cl object. If no IP is known NULL is returned.
+ *          deletion for the @p cl object. If no IP is known @c NULL is
+ *          returned.
  * @ingroup Ecore_Ipc_Client_Group
  */
-EAPI char *
+EAPI const char *
 ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_ip_get");
-       return NULL;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_ip_get");
+        return NULL;
      }
    return ecore_con_client_ip_get(cl->client);
 }
@@ -967,9 +1006,9 @@ ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
 {
    if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
      {
-       ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
-                        "ecore_ipc_client_flush");
-       return;
+        ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
+                         "ecore_ipc_client_flush");
+        return;
      }
    ecore_con_client_flush(cl->client);
 }
@@ -986,136 +1025,136 @@ ecore_ipc_ssl_available_get(void)
 }
 
 
-static int
+static Eina_Bool
 _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Add *e;
+   Ecore_Ipc_Server *svr;
 
    e = ev;
-   if (!_ecore_list2_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
+   svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
+   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Client *cl;
-       Ecore_Ipc_Server *svr;
-
-       cl = calloc(1, sizeof(Ecore_Ipc_Client));
-       if (!cl) return 0;
-       svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
-       ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
-       cl->client = e->client;
-       cl->max_buf_size = 32 * 1024;
-       ecore_con_client_data_set(cl->client, (void *)cl);
-       svr->clients = _ecore_list2_append(svr->clients, cl);
-       ecore_list_append(svr->client_list, cl);
-       if (!cl->delete_me)
-         {
-            Ecore_Ipc_Event_Client_Add *e2;
-
-            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
-            if (e2)
-              {
+        Ecore_Ipc_Client *cl;
+
+        cl = calloc(1, sizeof(Ecore_Ipc_Client));
+        if (!cl) return ECORE_CALLBACK_CANCEL;
+        cl->svr = svr;
+        ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
+        cl->client = e->client;
+        cl->max_buf_size = 32 * 1024;
+        ecore_con_client_data_set(cl->client, (void *)cl);
+        svr->clients = eina_list_append(svr->clients, cl);
+        if (!cl->delete_me)
+          {
+             Ecore_Ipc_Event_Client_Add *e2;
+
+             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
+             if (e2)
+               {
                   cl->event_count++;
-                 e2->client = cl;
-                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
-                                 _ecore_ipc_event_client_add_free, NULL);
-              }
-         }
+                  e2->client = cl;
+                  ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
+                                  _ecore_ipc_event_client_add_free, NULL);
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
-static int
+static Eina_Bool
 _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Del *e;
+   Ecore_Ipc_Server *svr;
 
    e = ev;
-   if (!_ecore_list2_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
+   if (!e->client) return ECORE_CALLBACK_RENEW;
+   svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
+   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Client *cl;
-
-       cl = ecore_con_client_data_get(e->client);
-         {
-            Ecore_Ipc_Event_Client_Del *e2;
-            Ecore_Ipc_Server *svr;
-
-            svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
-            ecore_list_goto(svr->client_list, cl);
-            ecore_list_remove(svr->client_list);
-            ecore_list_first_goto(svr->client_list);
-            if (!cl->delete_me)
-              {
-                 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
-                 if (e2)
-                   {
-                      cl->event_count++;
-                      e2->client = cl;
-                      ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
-                                      _ecore_ipc_event_client_del_free, NULL);
-                   }
-              }
-         }
+        Ecore_Ipc_Client *cl;
+
+        cl = ecore_con_client_data_get(e->client);
+        cl->client = NULL;
+          {
+             Ecore_Ipc_Event_Client_Del *e2;
+
+             if (!cl->delete_me)
+               {
+                  e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
+                  if (e2)
+                    {
+                       cl->event_count++;
+                       e2->client = cl;
+                       ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
+                                       _ecore_ipc_event_client_del_free, NULL);
+                    }
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
-static int
+static Eina_Bool
 _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Add *e;
 
    e = ev;
-   if (!_ecore_list2_find(servers, ecore_con_server_data_get(e->server))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Server *svr;
+        Ecore_Ipc_Server *svr;
 
-       svr = ecore_con_server_data_get(e->server);
-       if (!svr->delete_me)
-         {
-            Ecore_Ipc_Event_Server_Add *e2;
+        svr = ecore_con_server_data_get(e->server);
+        if (!svr->delete_me)
+          {
+             Ecore_Ipc_Event_Server_Add *e2;
 
-            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
-            if (e2)
-              {
+             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
+             if (e2)
+               {
                   svr->event_count++;
-                 e2->server = svr;
-                 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
-                                 _ecore_ipc_event_server_add_free, NULL);
-              }
-         }
+                  e2->server = svr;
+                  ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
+                                  _ecore_ipc_event_server_add_free, NULL);
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
-static int
+static Eina_Bool
 _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Del *e;
 
    e = ev;
-   if (!_ecore_list2_find(servers, ecore_con_server_data_get(e->server))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Server *svr;
+        Ecore_Ipc_Server *svr;
 
-       svr = ecore_con_server_data_get(e->server);
-       if (!svr->delete_me)
-         {
-            Ecore_Ipc_Event_Server_Del *e2;
+        svr = ecore_con_server_data_get(e->server);
+        svr->server = NULL;
+        if (!svr->delete_me)
+          {
+             Ecore_Ipc_Event_Server_Del *e2;
 
-            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
-            if (e2)
-              {
+             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
+             if (e2)
+               {
                   svr->event_count++;
-                 e2->server = svr;
-                 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
-                                 _ecore_ipc_event_server_del_free, NULL);
-              }
-         }
+                  e2->server = svr;
+                  ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
+                                  _ecore_ipc_event_server_del_free, NULL);
+               }
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
 #define CLSZ(_n) \
@@ -1128,186 +1167,186 @@ _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void
    md = ((head >> (4 * _n)) & 0xf); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(cl->buf + offset + s + 0); \
-       dv[1] = *(cl->buf + offset + s + 1); \
-       dv[2] = *(cl->buf + offset + s + 2); \
-       dv[3] = *(cl->buf + offset + s + 3); \
-       d = (int)ntohl(v); \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(cl->buf + offset + s + 0); \
+        dv[1] = *(cl->buf + offset + s + 1); \
+        dv[2] = *(cl->buf + offset + s + 2); \
+        dv[3] = *(cl->buf + offset + s + 3); \
+        d = (int)ntohl(v); \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(cl->buf + offset + s + 0); \
-       dv[1] = *(cl->buf + offset + s + 1); \
-       d = (int)ntohs(v); \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(cl->buf + offset + s + 0); \
+        dv[1] = *(cl->buf + offset + s + 1); \
+        d = (int)ntohs(v); \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       unsigned char v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(cl->buf + offset + s + 0); \
-       d = (int)v; \
-       s += 1; \
+        unsigned char v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(cl->buf + offset + s + 0); \
+        d = (int)v; \
+        s += 1; \
      } \
    msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
 
-static int
+static Eina_Bool
 _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Data *e;
+   Ecore_Ipc_Server *svr;
 
    e = ev;
-   if (!_ecore_list2_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return 1;
+   svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
+   if (!eina_list_data_find(servers, svr)) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Client *cl;
-       Ecore_Ipc_Msg_Head msg;
-       int offset = 0;
-       unsigned char *buf;
-
-       cl = ecore_con_client_data_get(e->client);
-
-       if (!cl->buf)
-         {
-            cl->buf_size = e->size;
-            cl->buf = e->data;
-            e->data = NULL; /* take it out of the old event */
-         }
-       else
-         {
-            buf = realloc(cl->buf, cl->buf_size + e->size);
-            if (!buf)
-              {
-                 free(cl->buf);
-                 cl->buf = 0;
-                 cl->buf_size  = 0;
-                 return 0;
-              }
-            cl->buf = buf;
-            memcpy(cl->buf + cl->buf_size, e->data, e->size);
-            cl->buf_size += e->size;
-         }
-       /* examine header */
-       redo:
-       if ((cl->buf_size - offset) >= (int)sizeof(int))
-         {
-            int s, md, d = 0, head;
-            unsigned char *dd;
-
-            dd = (unsigned char *)&head;
-            dd[0] = *(cl->buf + offset + 0);
-            dd[1] = *(cl->buf + offset + 1);
-            dd[2] = *(cl->buf + offset + 2);
-            dd[3] = *(cl->buf + offset + 3);
-            head = ntohl(head);
-            dd = (unsigned char *)&d;
-            s = 4;
-            CLSZ(0);
-            CLSZ(1);
-            CLSZ(2);
-            CLSZ(3);
-            CLSZ(4);
-            CLSZ(5);
-            if ((cl->buf_size - offset) < s)
-              {
-                 if (offset > 0) goto scroll;
-                 return 0;
-              }
-
-            s = 4;
-            CLDEC(0, major);
-            CLDEC(1, minor);
-            CLDEC(2, ref);
-            CLDEC(3, ref_to);
-            CLDEC(4, response);
-            CLDEC(5, size);
-            if (msg.size < 0) msg.size = 0;
-            /* there is enough data in the buffer for a full message */
-            if ((cl->buf_size - offset) >= (s + msg.size))
-              {
-                 Ecore_Ipc_Event_Client_Data *e2;
-                 Ecore_Ipc_Server *svr;
-                 int max, max2;
-
-                 buf = NULL;
-                 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
-                 max = svr->max_buf_size;
-                 max2 = cl->max_buf_size;
-                 if ((max >= 0) && (max2 >= 0))
-                   {
-                      if (max2 < max) max = max2;
-                   }
-                 else
-                   {
-                      if (max < 0) max = max2;
-                   }
-                 if ((max < 0) || (msg.size <= max))
-                   {
-                      if (msg.size > 0)
-                        {
-                           buf = malloc(msg.size);
-                           if (!buf) return 0;
-                           memcpy(buf, cl->buf + offset + s, msg.size);
-                        }
-                      if (!cl->delete_me)
-                        {
-                           e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
-                           if (e2)
-                             {
-                                cl->event_count++;
-                                e2->client   = cl;
-                                e2->major    = msg.major;
-                                e2->minor    = msg.minor;
-                                e2->ref      = msg.ref;
-                                e2->ref_to   = msg.ref_to;
-                                e2->response = msg.response;
-                                e2->size     = msg.size;
-                                e2->data     = buf;
-                                ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
-                                                _ecore_ipc_event_client_data_free,
-                                                NULL);
-                             }
-                        }
-                   }
-                 cl->prev.i = msg;
-                 offset += (s + msg.size);
-                 if (cl->buf_size == offset)
-                   {
-                      free(cl->buf);
-                      cl->buf = NULL;
-                      cl->buf_size = 0;
-                      return 0;
-                   }
-                 goto redo;
-              }
-            else goto scroll;
-         }
-       else
-         {
-            scroll:
-            buf = malloc(cl->buf_size - offset);
-            if (!buf)
-              {
-                 free(cl->buf);
-                 cl->buf = NULL;
-                 cl->buf_size = 0;
-                 return 0;
-              }
-            memcpy(buf, cl->buf + offset, cl->buf_size - offset);
-            free(cl->buf);
-            cl->buf = buf;
-            cl->buf_size -= offset;
-         }
+        Ecore_Ipc_Client *cl;
+        Ecore_Ipc_Msg_Head msg;
+        int offset = 0;
+        unsigned char *buf;
+
+        cl = ecore_con_client_data_get(e->client);
+
+        if (!cl->buf)
+          {
+             cl->buf_size = e->size;
+             cl->buf = e->data;
+             e->data = NULL; /* take it out of the old event */
+          }
+        else
+          {
+             buf = realloc(cl->buf, cl->buf_size + e->size);
+             if (!buf)
+               {
+                  free(cl->buf);
+                  cl->buf = 0;
+                  cl->buf_size  = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             cl->buf = buf;
+             memcpy(cl->buf + cl->buf_size, e->data, e->size);
+             cl->buf_size += e->size;
+          }
+        /* examine header */
+        redo:
+        if ((cl->buf_size - offset) >= (int)sizeof(int))
+          {
+             int s, md, d = 0, head;
+             unsigned char *dd;
+
+             dd = (unsigned char *)&head;
+             dd[0] = *(cl->buf + offset + 0);
+             dd[1] = *(cl->buf + offset + 1);
+             dd[2] = *(cl->buf + offset + 2);
+             dd[3] = *(cl->buf + offset + 3);
+             head = ntohl(head);
+             dd = (unsigned char *)&d;
+             s = 4;
+             CLSZ(0);
+             CLSZ(1);
+             CLSZ(2);
+             CLSZ(3);
+             CLSZ(4);
+             CLSZ(5);
+             if ((cl->buf_size - offset) < s)
+               {
+                  if (offset > 0) goto scroll;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+
+             s = 4;
+             CLDEC(0, major);
+             CLDEC(1, minor);
+             CLDEC(2, ref);
+             CLDEC(3, ref_to);
+             CLDEC(4, response);
+             CLDEC(5, size);
+             if (msg.size < 0) msg.size = 0;
+             /* there is enough data in the buffer for a full message */
+             if ((cl->buf_size - offset) >= (s + msg.size))
+               {
+                  Ecore_Ipc_Event_Client_Data *e2;
+                  int max, max2;
+
+                  buf = NULL;
+                  max = svr->max_buf_size;
+                  max2 = cl->max_buf_size;
+                  if ((max >= 0) && (max2 >= 0))
+                    {
+                       if (max2 < max) max = max2;
+                    }
+                  else
+                    {
+                       if (max < 0) max = max2;
+                    }
+                  if ((max < 0) || (msg.size <= max))
+                    {
+                       if (msg.size > 0)
+                         {
+                            buf = malloc(msg.size);
+                            if (!buf) return ECORE_CALLBACK_CANCEL;
+                            memcpy(buf, cl->buf + offset + s, msg.size);
+                         }
+                       if (!cl->delete_me)
+                         {
+                            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
+                            if (e2)
+                              {
+                                 cl->event_count++;
+                                 e2->client   = cl;
+                                 e2->major    = msg.major;
+                                 e2->minor    = msg.minor;
+                                 e2->ref      = msg.ref;
+                                 e2->ref_to   = msg.ref_to;
+                                 e2->response = msg.response;
+                                 e2->size     = msg.size;
+                                 e2->data     = buf;
+                                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
+                                                 _ecore_ipc_event_client_data_free,
+                                                 NULL);
+                              }
+                         }
+                    }
+                  cl->prev.i = msg;
+                  offset += (s + msg.size);
+                  if (cl->buf_size == offset)
+                    {
+                       free(cl->buf);
+                       cl->buf = NULL;
+                       cl->buf_size = 0;
+                       return ECORE_CALLBACK_CANCEL;
+                    }
+                  goto redo;
+               }
+             else goto scroll;
+          }
+        else
+          {
+             scroll:
+             buf = malloc(cl->buf_size - offset);
+             if (!buf)
+               {
+                  free(cl->buf);
+                  cl->buf = NULL;
+                  cl->buf_size = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             memcpy(buf, cl->buf + offset, cl->buf_size - offset);
+             free(cl->buf);
+             cl->buf = buf;
+             cl->buf_size -= offset;
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
 #define SVSZ(_n) \
@@ -1320,175 +1359,175 @@ _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void
    md = ((head >> (4 * _n)) & 0xf); \
    if (md >= DLT_SET) \
      { \
-       unsigned int v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(svr->buf + offset + s + 0); \
-       dv[1] = *(svr->buf + offset + s + 1); \
-       dv[2] = *(svr->buf + offset + s + 2); \
-       dv[3] = *(svr->buf + offset + s + 3); \
-       d = (int)ntohl(v); \
-       s += 4; \
+        unsigned int v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(svr->buf + offset + s + 0); \
+        dv[1] = *(svr->buf + offset + s + 1); \
+        dv[2] = *(svr->buf + offset + s + 2); \
+        dv[3] = *(svr->buf + offset + s + 3); \
+        d = (int)ntohl(v); \
+        s += 4; \
      } \
    else if (md >= DLT_ADD16) \
      { \
-       unsigned short v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(svr->buf + offset + s + 0); \
-       dv[1] = *(svr->buf + offset + s + 1); \
-       d = (int)ntohs(v); \
-       s += 2; \
+        unsigned short v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(svr->buf + offset + s + 0); \
+        dv[1] = *(svr->buf + offset + s + 1); \
+        d = (int)ntohs(v); \
+        s += 2; \
      } \
    else if (md >= DLT_ADD8) \
      { \
-       unsigned char v; \
-       unsigned char *dv; \
-       dv = (unsigned char *)&v; \
-       dv[0] = *(svr->buf + offset + s + 0); \
-       d = (int)v; \
-       s += 1; \
+        unsigned char v; \
+        unsigned char *dv; \
+        dv = (unsigned char *)&v; \
+        dv[0] = *(svr->buf + offset + s + 0); \
+        d = (int)v; \
+        s += 1; \
      } \
    msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
 
-static int
+static Eina_Bool
 _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Server_Data *e;
 
    e = ev;
-   if (!_ecore_list2_find(servers, ecore_con_server_data_get(e->server))) return 1;
+   if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
    /* handling code here */
      {
-       Ecore_Ipc_Server *svr;
-       Ecore_Ipc_Msg_Head msg;
-       int offset = 0;
-       unsigned char *buf;
-
-       svr = ecore_con_server_data_get(e->server);
-
-       if (!svr->buf)
-         {
-            svr->buf_size = e->size;
-            svr->buf = e->data;
-            e->data = NULL; /* take it out of the old event */
-         }
-       else
-         {
-            buf = realloc(svr->buf, svr->buf_size + e->size);
-            if (!buf)
-              {
-                 free(svr->buf);
-                 svr->buf = 0;
-                 svr->buf_size  = 0;
-                 return 0;
-              }
-            svr->buf = buf;
-            memcpy(svr->buf + svr->buf_size, e->data, e->size);
-            svr->buf_size += e->size;
-         }
-       /* examine header */
-       redo:
-       if ((svr->buf_size - offset) >= (int)sizeof(int))
-         {
-            int s, md, d = 0, head;
-            unsigned char *dd;
-
-            dd = (unsigned char *)&head;
-            dd[0] = *(svr->buf + offset + 0);
-            dd[1] = *(svr->buf + offset + 1);
-            dd[2] = *(svr->buf + offset + 2);
-            dd[3] = *(svr->buf + offset + 3);
-            head = ntohl(head);
-            dd = (unsigned char *)&d;
-            s = 4;
-            SVSZ(0);
-            SVSZ(1);
-            SVSZ(2);
-            SVSZ(3);
-            SVSZ(4);
-            SVSZ(5);
-            if ((svr->buf_size - offset) < s)
-              {
-                 if (offset > 0) goto scroll;
-                 return 0;
-              }
-
-            s = 4;
-            SVDEC(0, major);
-            SVDEC(1, minor);
-            SVDEC(2, ref);
-            SVDEC(3, ref_to);
-            SVDEC(4, response);
-            SVDEC(5, size);
-            if (msg.size < 0) msg.size = 0;
-            /* there is enough data in the buffer for a full message */
-            if ((svr->buf_size - offset) >= (s + msg.size))
-              {
-                 Ecore_Ipc_Event_Server_Data *e2;
-                 int max;
-
-                 buf = NULL;
-                 max = svr->max_buf_size;
-                 if ((max < 0) || (msg.size <= max))
-                   {
-                      if (msg.size > 0)
-                        {
-                           buf = malloc(msg.size);
-                           if (!buf) return 0;
-                           memcpy(buf, svr->buf + offset + s, msg.size);
-                        }
-                      if (!svr->delete_me)
-                        {
-                           e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
-                           if (e2)
-                             {
-                                svr->event_count++;
-                                e2->server   = svr;
-                                e2->major    = msg.major;
-                                e2->minor    = msg.minor;
-                                e2->ref      = msg.ref;
-                                e2->ref_to   = msg.ref_to;
-                                e2->response = msg.response;
-                                e2->size     = msg.size;
-                                e2->data     = buf;
-                                ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
-                                                _ecore_ipc_event_server_data_free,
-                                                NULL);
-                             }
-                        }
-                   }
-                 svr->prev.i = msg;
-                 offset += (s + msg.size);
-                 if (svr->buf_size == offset)
-                   {
-                      free(svr->buf);
-                      svr->buf = NULL;
-                      svr->buf_size = 0;
-                      return 0;
-                   }
-                 goto redo;
-              }
-            else goto scroll;
-         }
-       else
-         {
-            scroll:
-            buf = malloc(svr->buf_size - offset);
-            if (!buf)
-              {
-                 free(svr->buf);
-                 svr->buf = NULL;
-                 svr->buf_size = 0;
-                 return 0;
-              }
-            memcpy(buf, svr->buf + offset, svr->buf_size - offset);
-            free(svr->buf);
-            svr->buf = buf;
-            svr->buf_size -= offset;
-         }
+        Ecore_Ipc_Server *svr;
+        Ecore_Ipc_Msg_Head msg;
+        int offset = 0;
+        unsigned char *buf;
+
+        svr = ecore_con_server_data_get(e->server);
+
+        if (!svr->buf)
+          {
+             svr->buf_size = e->size;
+             svr->buf = e->data;
+             e->data = NULL; /* take it out of the old event */
+          }
+        else
+          {
+             buf = realloc(svr->buf, svr->buf_size + e->size);
+             if (!buf)
+               {
+                  free(svr->buf);
+                  svr->buf = 0;
+                  svr->buf_size  = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             svr->buf = buf;
+             memcpy(svr->buf + svr->buf_size, e->data, e->size);
+             svr->buf_size += e->size;
+          }
+        /* examine header */
+        redo:
+        if ((svr->buf_size - offset) >= (int)sizeof(int))
+          {
+             int s, md, d = 0, head;
+             unsigned char *dd;
+
+             dd = (unsigned char *)&head;
+             dd[0] = *(svr->buf + offset + 0);
+             dd[1] = *(svr->buf + offset + 1);
+             dd[2] = *(svr->buf + offset + 2);
+             dd[3] = *(svr->buf + offset + 3);
+             head = ntohl(head);
+             dd = (unsigned char *)&d;
+             s = 4;
+             SVSZ(0);
+             SVSZ(1);
+             SVSZ(2);
+             SVSZ(3);
+             SVSZ(4);
+             SVSZ(5);
+             if ((svr->buf_size - offset) < s)
+               {
+                  if (offset > 0) goto scroll;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+
+             s = 4;
+             SVDEC(0, major);
+             SVDEC(1, minor);
+             SVDEC(2, ref);
+             SVDEC(3, ref_to);
+             SVDEC(4, response);
+             SVDEC(5, size);
+             if (msg.size < 0) msg.size = 0;
+             /* there is enough data in the buffer for a full message */
+             if ((svr->buf_size - offset) >= (s + msg.size))
+               {
+                  Ecore_Ipc_Event_Server_Data *e2;
+                  int max;
+
+                  buf = NULL;
+                  max = svr->max_buf_size;
+                  if ((max < 0) || (msg.size <= max))
+                    {
+                       if (msg.size > 0)
+                         {
+                            buf = malloc(msg.size);
+                            if (!buf) return ECORE_CALLBACK_CANCEL;
+                            memcpy(buf, svr->buf + offset + s, msg.size);
+                         }
+                       if (!svr->delete_me)
+                         {
+                            e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
+                            if (e2)
+                              {
+                                 svr->event_count++;
+                                 e2->server   = svr;
+                                 e2->major    = msg.major;
+                                 e2->minor    = msg.minor;
+                                 e2->ref      = msg.ref;
+                                 e2->ref_to   = msg.ref_to;
+                                 e2->response = msg.response;
+                                 e2->size     = msg.size;
+                                 e2->data     = buf;
+                                 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
+                                                 _ecore_ipc_event_server_data_free,
+                                                 NULL);
+                              }
+                         }
+                    }
+                  svr->prev.i = msg;
+                  offset += (s + msg.size);
+                  if (svr->buf_size == offset)
+                    {
+                       free(svr->buf);
+                       svr->buf = NULL;
+                       svr->buf_size = 0;
+                       return ECORE_CALLBACK_CANCEL;
+                    }
+                  goto redo;
+               }
+             else goto scroll;
+          }
+        else
+          {
+             scroll:
+             buf = malloc(svr->buf_size - offset);
+             if (!buf)
+               {
+                  free(svr->buf);
+                  svr->buf = NULL;
+                  svr->buf_size = 0;
+                  return ECORE_CALLBACK_CANCEL;
+               }
+             memcpy(buf, svr->buf + offset, svr->buf_size - offset);
+             free(svr->buf);
+             svr->buf = buf;
+             svr->buf_size -= offset;
+          }
      }
-   return 0;
+   return ECORE_CALLBACK_CANCEL;
 }
 
 static void
index 2eb6f98..bedaab1 100644 (file)
@@ -1,19 +1,54 @@
 #ifndef _ECORE_IPC_PRIVATE_H
 #define _ECORE_IPC_PRIVATE_H
 
-#include "Ecore_Data.h"
 
-#if USE_OPENSSL
-#include <openssl/ssl.h>
+extern int _ecore_ipc_log_dom;
+
+#ifdef ECORE_IPC_DEFAULT_LOG_COLOR
+# undef ECORE_IPC_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_IPC_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_ipc_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_ipc_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
 #endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_ipc_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_ipc_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_ipc_log_dom, __VA_ARGS__)
 
 #define ECORE_MAGIC_IPC_SERVER             0x87786556
 #define ECORE_MAGIC_IPC_CLIENT             0x78875665
 
-typedef struct _Ecore_Ipc_Client Ecore_Ipc_Client;
-typedef struct _Ecore_Ipc_Server Ecore_Ipc_Server;
 typedef struct _Ecore_Ipc_Msg_Head Ecore_Ipc_Msg_Head;
+#define ECORE_IPC_TYPE 0x0f
+#define ECORE_IPC_SSL  0xf0
 
+#if defined (_MSC_VER) || (defined (__SUNPRO_C) && __SUNPRO_C < 0x5100)
+# pragma pack(1)
+# define ECORE_IPC_STRUCT_PACKED
+#elif defined (__GNUC__) || (defined (__SUNPRO_C) && __SUNPRO_C >= 0x5100)
+# define ECORE_IPC_STRUCT_PACKED __attribute__((packed))
+#else
+# define ECORE_IPC_STRUCT_PACKED
+#endif
 
 #ifdef __sgi
 #pragma pack 4
@@ -26,20 +61,16 @@ struct _Ecore_Ipc_Msg_Head
       int ref_to;
       int response;
       int size;
-} 
-#ifdef _GNU_C_
-__attribute__ ((packed));
-#endif
-;
+} ECORE_IPC_STRUCT_PACKED;
 #ifdef __sgi
 #pragma pack 0
 #endif
 
 struct _Ecore_Ipc_Client
 {
-   Ecore_List        __list_data;
    ECORE_MAGIC;
    Ecore_Con_Client  *client;
+   Ecore_Ipc_Server  *svr;
    void              *data;
    unsigned char     *buf;
    int                buf_size;
@@ -55,11 +86,9 @@ struct _Ecore_Ipc_Client
    
 struct _Ecore_Ipc_Server
 {
-   Ecore_List        __list_data;
    ECORE_MAGIC;
    Ecore_Con_Server *server;
-   Ecore_Ipc_Client *clients;
-   Ecore_List       *client_list;
+   Eina_List        *clients;
    void              *data;
    unsigned char     *buf;
    int                buf_size;
diff --git a/src/lib/ecore_psl1ght/Ecore_Psl1ght.h b/src/lib/ecore_psl1ght/Ecore_Psl1ght.h
new file mode 100644 (file)
index 0000000..c6300fd
--- /dev/null
@@ -0,0 +1,121 @@
+#ifndef _ECORE_PSL1GHT_H
+#define _ECORE_PSL1GHT_H
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef __GNUC__
+# if __GNUC__ >= 4
+#  define EAPI __attribute__ ((visibility("default")))
+# else
+#  define EAPI
+# endif
+#else
+# define EAPI
+#endif
+
+/**
+ * @file
+ * @brief Ecore PSL1GHT system functions.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EAPI extern int ECORE_PSL1GHT_EVENT_KEY_MODIFIERS;
+EAPI extern int ECORE_PSL1GHT_EVENT_GOT_FOCUS;
+EAPI extern int ECORE_PSL1GHT_EVENT_LOST_FOCUS;
+EAPI extern int ECORE_PSL1GHT_EVENT_EXPOSE;
+EAPI extern int ECORE_PSL1GHT_EVENT_QUIT;
+
+typedef struct _Ecore_Psl1ght_Event_Key_Modifiers Ecore_Psl1ght_Event_Key_Modifiers;
+struct _Ecore_Psl1ght_Event_Key_Modifiers /** PSL1GHT Key Modifier event */
+{
+   unsigned int timestamp;
+   unsigned int modifiers;
+   int          shift_changed : 1;
+   int          shift : 1;
+   int          alt_changed : 1;
+   int          alt : 1;
+   int          ctrl_changed : 1;
+   int          ctrl : 1;
+   int          win_changed : 1;
+   int          win : 1;
+   int          num_lock_changed : 1;
+   int          num_lock : 1;
+   int          caps_lock_changed : 1;
+   int          caps_lock : 1;
+   int          scroll_lock_changed : 1;
+   int          scroll_lock : 1;
+};
+
+typedef struct _Ecore_Psl1ght_Event_Key_Down Ecore_Psl1ght_Event_Key_Down;
+struct _Ecore_Psl1ght_Event_Key_Down /** PSL1GHT Key Down event */
+{
+   const char  *keyname;     /**< The name of the key that was pressed */
+   const char  *keycompose;     /**< The UTF-8 string conversion if any */
+   unsigned int time;
+};
+
+typedef struct _Ecore_Psl1ght_Event_Key_Up Ecore_Psl1ght_Event_Key_Up;
+struct _Ecore_Psl1ght_Event_Key_Up /** PSL1GHT Key Up event */
+{
+   const char  *keyname;     /**< The name of the key that was released */
+   const char  *keycompose;     /**< The UTF-8 string conversion if any */
+   unsigned int time;
+};
+
+typedef struct _Ecore_Psl1ght_Event_Mouse_Button_Down Ecore_Psl1ght_Event_Mouse_Button_Down;
+struct _Ecore_Psl1ght_Event_Mouse_Button_Down /** PSL1GHT Mouse Down event */
+{
+   int          button;    /**< Mouse button that was pressed (1 - 32) */
+   int          x;    /**< Mouse co-ordinates when mouse button was pressed */
+   int          y;    /**< Mouse co-ordinates when mouse button was pressed */
+   int          double_click : 1;    /**< Set if click was a double click */
+   int          triple_click : 1;    /**< Set if click was a triple click  */
+   unsigned int time;
+};
+
+typedef struct _Ecore_Psl1ght_Event_Mouse_Button_Up Ecore_Psl1ght_Event_Mouse_Button_Up;
+struct _Ecore_Psl1ght_Event_Mouse_Button_Up /** PSL1GHT Mouse Up event */
+{
+   int          button;    /**< Mouse button that was released (1 - 32) */
+   int          x;    /**< Mouse co-ordinates when mouse button was raised */
+   int          y;    /**< Mouse co-ordinates when mouse button was raised */
+   int          double_click : 1;    /**< Set if click was a double click */
+   int          triple_click : 1;    /**< Set if click was a triple click  */
+   unsigned int time;
+};
+
+typedef struct _Ecore_Psl1ght_Event_Mouse_Move Ecore_Psl1ght_Event_Mouse_Move;
+struct _Ecore_Psl1ght_Event_Mouse_Move /** PSL1GHT Mouse Move event */
+{
+   int          x;    /**< Mouse co-ordinates where the mouse cursor moved to */
+   int          y;    /**< Mouse co-ordinates where the mouse cursor moved to */
+   unsigned int time;
+};
+
+typedef struct _Ecore_Psl1ght_Event_Mouse_Wheel Ecore_Psl1ght_Event_Mouse_Wheel;
+struct _Ecore_Psl1ght_Event_Mouse_Wheel /** PSL1GHT Mouse Wheel event */
+{
+   int          x, y;
+   int          direction;    /* 0 = vertical, 1 = horizontal */
+   int          wheel;    /* value 1 (left/up), -1 (right/down) */
+   unsigned int time;
+};
+
+EAPI int ecore_psl1ght_init(const char *name);
+EAPI int ecore_psl1ght_shutdown(void);
+EAPI void ecore_psl1ght_resolution_set(int width, int height);
+EAPI void ecore_psl1ght_poll_events(void);
+
+EAPI void ecore_psl1ght_screen_resolution_get(int *w, int *h);
+EAPI void ecore_psl1ght_optimal_screen_resolution_get(int *w, int *h);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/ecore_psl1ght/Ecore_Psl1ght_Keys.h b/src/lib/ecore_psl1ght/Ecore_Psl1ght_Keys.h
new file mode 100644 (file)
index 0000000..e385af8
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef         ECORE_PSL1GHT_KEYS_H__
+# define        ECORE_PSL1GHT_KEYS_H__
+
+struct _ecore_psl1ght_keys_s
+{
+   int         code;
+   const char *name;
+   const char *compose;
+};
+
+static const struct _ecore_psl1ght_keys_s keystable[] =
+{
+   { KB_RAWKEY_NO_EVENT, "0x00", "" },
+   { KB_RAWKEY_BS, "BackSpace", "\010" },
+   { KB_RAWKEY_TAB, "Tab", "\011" },
+   { KB_RAWKEY_ENTER, "Return", "\015" },
+   { KB_RAWKEY_PAUSE, "Pause", "Pause" },
+   { KB_RAWKEY_ESCAPE, "Escape", "\033" },
+   { KB_RAWKEY_SPACE, "space", " " },
+
+   /* Skip uppercase letters */
+   { KB_RAWKEY_LEFT_BRACKET_101, "bracketleft", "[" },
+   { KB_RAWKEY_BACKSLASH_101, "backslash", "\\" },
+   { KB_RAWKEY_RIGHT_BRACKET_101, "bracketright", "]" },
+   { KB_RAWKEY_ACCENT_CIRCONFLEX_106, "asciicircumm", "^" },
+   { KB_RAWKEY_DELETE, "Delete", "\177" },
+   /* End of ASCII mapped keysyms */
+
+   /* Numeric keypad */
+   { KB_RAWKEY_KPAD_0, "KP0", "0" },
+   { KB_RAWKEY_KPAD_1, "KP1", "1" },
+   { KB_RAWKEY_KPAD_2, "KP2", "2" },
+   { KB_RAWKEY_KPAD_3, "KP3", "3" },
+   { KB_RAWKEY_KPAD_4, "KP4", "4" },
+   { KB_RAWKEY_KPAD_5, "KP5", "5" },
+   { KB_RAWKEY_KPAD_6, "KP6", "6" },
+   { KB_RAWKEY_KPAD_7, "KP7", "7" },
+   { KB_RAWKEY_KPAD_8, "KP8", "8" },
+   { KB_RAWKEY_KPAD_9, "KP9", "9" },
+   { KB_RAWKEY_KPAD_PERIOD, "period", "." },
+   { KB_RAWKEY_KPAD_SLASH, "KP_Divide", "/" },
+   { KB_RAWKEY_KPAD_ASTERISK, "KP_Multiply", "*" },
+   { KB_RAWKEY_KPAD_MINUS, "KP_Minus", "-" },
+   { KB_RAWKEY_KPAD_PLUS, "KP_Plus", "+" },
+   { KB_RAWKEY_KPAD_ENTER, "KP_Enter", "\015" },
+
+   /* Arrows + Home/End pad */
+   { KB_RAWKEY_UP_ARROW, "Up", "Up" },
+   { KB_RAWKEY_DOWN_ARROW, "Down", "Down" },
+   { KB_RAWKEY_RIGHT_ARROW, "Right", "Right" },
+   { KB_RAWKEY_LEFT_ARROW, "Left", "Left" },
+   { KB_RAWKEY_INSERT, "Insert", "Insert" },
+   { KB_RAWKEY_HOME, "Home", "Home" },
+   { KB_RAWKEY_END, "End", "End" },
+   { KB_RAWKEY_PAGE_UP, "Page_Up", "Page_Up" },
+   { KB_RAWKEY_PAGE_DOWN, "Page_Down", "Page_Down" },
+
+   /* Function keys */
+   { KB_RAWKEY_F1, "F1", "F1" },
+   { KB_RAWKEY_F2, "F2", "F2" },
+   { KB_RAWKEY_F3, "F3", "F3" },
+   { KB_RAWKEY_F4, "F4", "F4" },
+   { KB_RAWKEY_F5, "F5", "F5" },
+   { KB_RAWKEY_F6, "F6", "F6" },
+   { KB_RAWKEY_F7, "F7", "F7" },
+   { KB_RAWKEY_F8, "F8", "F8" },
+   { KB_RAWKEY_F9, "F9", "F9" },
+   { KB_RAWKEY_F10, "F10", "F10" },
+   { KB_RAWKEY_F11, "F11", "F11" },
+   { KB_RAWKEY_F12, "F12", "F12" },
+
+   /* Key state modifier keys */
+   { KB_RAWKEY_KPAD_NUMLOCK, "Num_Lock", "Num_Lock" },
+   { KB_RAWKEY_CAPS_LOCK, "Caps_Lock", "Caps_Lock" },
+   { KB_RAWKEY_SCROLL_LOCK, "Scroll_Lock", "Scroll_Lock" },
+};
+
+#endif  /* ECORE_PSL1GHT_KEYS_H__ */
diff --git a/src/lib/ecore_psl1ght/Makefile.am b/src/lib/ecore_psl1ght/Makefile.am
new file mode 100644 (file)
index 0000000..8e7328a
--- /dev/null
@@ -0,0 +1,30 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_evas \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_evas \
+-I$(top_builddir)/src/lib/ecore_input \
+@EFL_ECORE_PSL1GHT_BUILD@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
+
+lib_LTLIBRARIES = libecore_psl1ght.la
+includes_HEADERS = Ecore_Psl1ght.h
+includesdir = $(includedir)/ecore-@VMAJ@
+
+libecore_psl1ght_la_SOURCES = \
+ecore_psl1ght.c \
+moveutil.c \
+spursutil.c
+
+libecore_psl1ght_la_LIBADD = \
+$(top_builddir)/src/lib/ecore/libecore.la \
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+@EINA_LIBS@
+
+libecore_psl1ght_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
+
+EXTRA_DIST = Ecore_Psl1ght_Keys.h ecore_psl1ght_private.h
diff --git a/src/lib/ecore_psl1ght/ecore_psl1ght.c b/src/lib/ecore_psl1ght/ecore_psl1ght.c
new file mode 100644 (file)
index 0000000..16487ad
--- /dev/null
@@ -0,0 +1,859 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sysutil/video.h>
+#include <sysutil/sysutil.h>
+#include <sysmodule/sysmodule.h>
+#include <io/pad.h>
+#include <io/mouse.h>
+#include <io/kb.h>
+#include <io/camera.h>
+#include <io/move.h>
+#include <sys/process.h>
+
+#include "moveutil.h"
+
+#include "Eina.h"
+#include "Ecore_Psl1ght.h"
+#include "Ecore_Input.h"
+#include "Ecore.h"
+#include "ecore_psl1ght_private.h"
+#include "ecore_private.h"
+#include "Ecore_Psl1ght_Keys.h"
+
+/* Allocate 1MB stack to avoid overflows */
+SYS_PROCESS_PARAM(1001, 0x100000);
+
+int _ecore_psl1ght_log_dom = -1;
+
+EAPI int ECORE_PSL1GHT_EVENT_KEY_MODIFIERS = 0;
+EAPI int ECORE_PSL1GHT_EVENT_GOT_FOCUS = 0;
+EAPI int ECORE_PSL1GHT_EVENT_LOST_FOCUS = 0;
+EAPI int ECORE_PSL1GHT_EVENT_EXPOSE = 0;
+EAPI int ECORE_PSL1GHT_EVENT_QUIT = 0;
+
+static int _ecore_psl1ght_init_count = 0;
+static int window_width = 0;
+static int window_height = 0;
+/* Mouse support */
+static int mouse_connected = FALSE;
+static u8 mouse_buttons = 0;
+static int mouse_x = 0;
+static int mouse_y = 0;
+/* Keyboard support */
+static int keyboard_connected = FALSE;
+static KbLed keyboard_leds = {{0}};
+static KbMkey keyboard_mods = {{0}};
+static u16 keyboard_old_key = 0;
+/* Pad support */
+static padData pad_data;
+static padData old_pad_data = {0};
+static int pad_old_x = 0;
+static int pad_old_o = 0;
+/* Move support */
+static int move_connected = FALSE;
+static moveContext *move_context = NULL;
+u16 move_buttons = 0;
+
+static void xmb_event_handler(u64 status, u64 param, void *user_data);
+
+/**
+ * @defgroup Ecore_Psl1ght_Library_Group PSL1GHT Library Functions
+ *
+ * Functions used to set up and shut down the Ecore_Psl1ght functions.
+ */
+
+/**
+ * Sets up the Ecore_Psl1ght library.
+ * @param   name device target name
+ * @return  @c 0 on failure.  Otherwise, the number of times the library has
+ *          been initialised without being shut down.
+ * @ingroup Ecore_PSL1GHT_Library_Group
+ */
+EAPI int
+ecore_psl1ght_init(const char *name __UNUSED__)
+{
+   videoState state;
+   videoResolution resolution;
+   int ret, camera_loaded, gem_loaded;
+
+   if (++_ecore_psl1ght_init_count != 1)
+     return _ecore_psl1ght_init_count;
+   _ecore_psl1ght_log_dom = eina_log_domain_register
+       ("ecore_psl1ght", ECORE_PSL1GHT_DEFAULT_LOG_COLOR);
+   if (_ecore_psl1ght_log_dom < 0)
+     {
+        EINA_LOG_ERR("Impossible to create a log domain for the Ecore PSL1GHT module.");
+        return --_ecore_psl1ght_init_count;
+     }
+   if (!ecore_event_init())
+     {
+        eina_log_domain_unregister(_ecore_psl1ght_log_dom);
+        _ecore_psl1ght_log_dom = -1;
+        return --_ecore_psl1ght_init_count;
+     }
+
+   if (videoGetState (0, 0, &state) == 0 &&
+       videoGetResolution (state.displayMode.resolution, &resolution) == 0)
+     {
+        ecore_psl1ght_resolution_set (resolution.width, resolution.height);
+     }
+   else
+     {
+        ecore_event_shutdown();
+        eina_log_domain_unregister(_ecore_psl1ght_log_dom);
+        _ecore_psl1ght_log_dom = -1;
+        return --_ecore_psl1ght_init_count;
+     }
+
+   /* Pad support */
+   ioPadInit (7);
+   /* Mouse support */
+   ioMouseInit(2);
+   mouse_buttons = 0;
+   mouse_x = 0;
+   mouse_y = 0;
+
+   /* Keyboard support */
+   ioKbInit(2);
+   keyboard_leds._KbLedU.leds = 0;
+   keyboard_mods._KbMkeyU.mkeys = 0;
+
+   /* Initialize Move */
+   move_context = NULL;
+   move_buttons = 0;
+
+   camera_loaded = !sysModuleIsLoaded (SYSMODULE_CAMERA);
+   if (!camera_loaded)
+     ret = sysModuleLoad (SYSMODULE_CAMERA);
+   else
+     ret = 0;
+   if (ret == 0)
+     {
+        gem_loaded = !sysModuleIsLoaded (SYSMODULE_GEM);
+        if (!gem_loaded)
+          ret = sysModuleLoad (SYSMODULE_GEM);
+        if (ret == 0)
+          {
+             move_context = initMove ();
+          }
+        else {
+             if (gem_loaded)
+               sysModuleUnload (SYSMODULE_CAMERA);
+          }
+     }
+
+   sysUtilRegisterCallback (SYSUTIL_EVENT_SLOT0, xmb_event_handler, NULL);
+
+   ECORE_PSL1GHT_EVENT_GOT_FOCUS = ecore_event_type_new();
+   ECORE_PSL1GHT_EVENT_LOST_FOCUS = ecore_event_type_new();
+   ECORE_PSL1GHT_EVENT_EXPOSE = ecore_event_type_new();
+   ECORE_PSL1GHT_EVENT_KEY_MODIFIERS = ecore_event_type_new();
+   ECORE_PSL1GHT_EVENT_QUIT = ecore_event_type_new();
+
+   mouse_x = 0;
+   mouse_y = 0;
+
+   return _ecore_psl1ght_init_count;
+}
+
+/**
+ * Shuts down the Ecore_Psl1ght library.
+ * @return  @c The number of times the system has been initialised without
+ *             being shut down.
+ * @ingroup Ecore_PSL1GHT_Library_Group
+ */
+EAPI int
+ecore_psl1ght_shutdown(void)
+{
+   if (--_ecore_psl1ght_init_count != 0)
+     return _ecore_psl1ght_init_count;
+
+   ecore_event_shutdown();
+   eina_log_domain_unregister(_ecore_psl1ght_log_dom);
+   _ecore_psl1ght_log_dom = -1;
+
+   ECORE_PSL1GHT_EVENT_GOT_FOCUS = 0;
+   ECORE_PSL1GHT_EVENT_LOST_FOCUS = 0;
+   ECORE_PSL1GHT_EVENT_EXPOSE = 0;
+   ECORE_PSL1GHT_EVENT_KEY_MODIFIERS = 0;
+   ECORE_PSL1GHT_EVENT_QUIT = 0;
+
+   ioPadEnd();
+   ioMouseEnd();
+   ioKbEnd();
+
+   if (move_context)
+     {
+        endMove (move_context);
+        move_context = NULL;
+        sysModuleUnload (SYSMODULE_CAMERA);
+        sysModuleUnload (SYSMODULE_GEM);
+     }
+
+   sysUtilUnregisterCallback(SYSUTIL_EVENT_SLOT0);
+
+   return _ecore_psl1ght_init_count;
+}
+
+static unsigned int
+_ecore_psl1ght_get_time(void)
+{
+   return (unsigned int)((unsigned long long)
+                         (ecore_time_get() * 1000.0) & 0xffffffff);
+}
+
+static unsigned int
+_ecore_psl1ght_get_modifiers(void)
+{
+   unsigned int modifiers = 0;
+
+   if (keyboard_mods._KbMkeyU._KbMkeyS.r_shift ||
+       keyboard_mods._KbMkeyU._KbMkeyS.l_shift)
+     modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+   if (keyboard_mods._KbMkeyU._KbMkeyS.r_ctrl ||
+       keyboard_mods._KbMkeyU._KbMkeyS.l_ctrl)
+     modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+   if (keyboard_mods._KbMkeyU._KbMkeyS.r_alt ||
+       keyboard_mods._KbMkeyU._KbMkeyS.l_alt)
+     modifiers |= ECORE_EVENT_MODIFIER_ALT;
+   if (keyboard_mods._KbMkeyU._KbMkeyS.r_win ||
+       keyboard_mods._KbMkeyU._KbMkeyS.l_win)
+     modifiers |= ECORE_EVENT_MODIFIER_WIN;
+
+   if (keyboard_leds._KbLedU._KbLedS.num_lock)
+     modifiers |= ECORE_EVENT_LOCK_NUM;
+   if (keyboard_leds._KbLedU._KbLedS.caps_lock)
+     modifiers |= ECORE_EVENT_LOCK_CAPS;
+   if (keyboard_leds._KbLedU._KbLedS.scroll_lock)
+     modifiers |= ECORE_EVENT_LOCK_SCROLL;
+
+   return modifiers;
+}
+
+static void
+_ecore_psl1ght_key_modifiers(KbMkey *mods, KbLed *leds)
+{
+   Ecore_Psl1ght_Event_Key_Modifiers *ev;
+   Eina_Bool emit = EINA_FALSE;
+
+   ev = malloc(sizeof(Ecore_Psl1ght_Event_Key_Modifiers));
+   if (!ev) return;
+
+   if (mods->_KbMkeyU._KbMkeyS.l_shift !=
+       keyboard_mods._KbMkeyU._KbMkeyS.l_shift ||
+       mods->_KbMkeyU._KbMkeyS.r_shift !=
+       keyboard_mods._KbMkeyU._KbMkeyS.r_shift)
+     {
+        emit = EINA_TRUE;
+        ev->shift_changed = EINA_TRUE;
+        ev->shift = mods->_KbMkeyU._KbMkeyS.r_shift |
+          mods->_KbMkeyU._KbMkeyS.l_shift;
+     }
+   if (mods->_KbMkeyU._KbMkeyS.l_ctrl !=
+       keyboard_mods._KbMkeyU._KbMkeyS.l_ctrl ||
+       mods->_KbMkeyU._KbMkeyS.r_ctrl !=
+       keyboard_mods._KbMkeyU._KbMkeyS.r_ctrl)
+     {
+        emit = EINA_TRUE;
+        ev->ctrl_changed = EINA_TRUE;
+        ev->ctrl = mods->_KbMkeyU._KbMkeyS.r_ctrl |
+          mods->_KbMkeyU._KbMkeyS.l_ctrl;
+     }
+   if (mods->_KbMkeyU._KbMkeyS.l_alt !=
+       keyboard_mods._KbMkeyU._KbMkeyS.l_alt ||
+       mods->_KbMkeyU._KbMkeyS.r_alt !=
+       keyboard_mods._KbMkeyU._KbMkeyS.r_alt)
+     {
+        emit = EINA_TRUE;
+        ev->alt_changed = EINA_TRUE;
+        ev->alt = mods->_KbMkeyU._KbMkeyS.r_alt |
+          mods->_KbMkeyU._KbMkeyS.l_alt;
+     }
+   if (mods->_KbMkeyU._KbMkeyS.l_win !=
+       keyboard_mods._KbMkeyU._KbMkeyS.l_win ||
+       mods->_KbMkeyU._KbMkeyS.r_win !=
+       keyboard_mods._KbMkeyU._KbMkeyS.r_win)
+     {
+        emit = EINA_TRUE;
+        ev->win_changed = EINA_TRUE;
+        ev->win = mods->_KbMkeyU._KbMkeyS.r_win |
+          mods->_KbMkeyU._KbMkeyS.l_win;
+     }
+   keyboard_mods = *mods;
+
+   if (leds->_KbLedU._KbLedS.num_lock !=
+       keyboard_leds._KbLedU._KbLedS.num_lock)
+     {
+        emit = EINA_TRUE;
+        ev->num_lock_changed = EINA_TRUE;
+        ev->num_lock = leds->_KbLedU._KbLedS.num_lock;
+     }
+   if (leds->_KbLedU._KbLedS.caps_lock !=
+       keyboard_leds._KbLedU._KbLedS.caps_lock)
+     {
+        emit = EINA_TRUE;
+        ev->caps_lock_changed = EINA_TRUE;
+        ev->caps_lock = leds->_KbLedU._KbLedS.caps_lock;
+     }
+   if (leds->_KbLedU._KbLedS.scroll_lock !=
+       keyboard_leds._KbLedU._KbLedS.scroll_lock)
+     {
+        emit = EINA_TRUE;
+        ev->scroll_lock_changed = EINA_TRUE;
+        ev->scroll_lock = leds->_KbLedU._KbLedS.scroll_lock;
+     }
+   keyboard_leds = *leds;
+
+   if (emit)
+     {
+        ev->timestamp = _ecore_psl1ght_get_time ();
+        ev->modifiers = _ecore_psl1ght_get_modifiers();
+        ecore_event_add(ECORE_PSL1GHT_EVENT_KEY_MODIFIERS, ev, NULL, NULL);
+     }
+   else
+     {
+        free(ev);
+     }
+}
+
+static void
+unicodeToUtf8(u16 w, char *utf8buf)
+{
+   unsigned char *utf8s = (unsigned char *)utf8buf;
+
+   if ( w < 0x0080 )
+     {
+        utf8s[0] = ( unsigned char )w;
+        utf8s[1] = 0;
+     }
+   else if ( w < 0x0800 )
+     {
+        utf8s[0] = 0xc0 | ((w) >> 6);
+        utf8s[1] = 0x80 | ((w) & 0x3f);
+        utf8s[2] = 0;
+     }
+   else {
+        utf8s[0] = 0xe0 | ((w) >> 12);
+        utf8s[1] = 0x80 | (((w) >> 6) & 0x3f);
+        utf8s[2] = 0x80 | ((w) & 0x3f);
+        utf8s[3] = 0;
+     }
+}
+
+static Ecore_Event_Key *
+_ecore_psl1ght_event_key(u16 key)
+{
+   Ecore_Event_Key *ev;
+   char utf8[4];
+   u16 utf16;
+   unsigned int i;
+
+   ev = malloc(sizeof(Ecore_Event_Key));
+   if (!ev) return NULL;
+
+   ev->timestamp = _ecore_psl1ght_get_time ();
+   ev->window = 0;
+   ev->event_window = 0;
+   ev->modifiers = _ecore_psl1ght_get_modifiers();
+
+   key &= ~KB_KEYPAD;
+   for (i = 0; i < sizeof(keystable) / sizeof(struct _ecore_psl1ght_keys_s); ++i)
+     if (keystable[i].code == key)
+       {
+          ev->keyname = keystable[i].name;
+          ev->key = keystable[i].name;
+          ev->string = keystable[i].compose;
+          ev->compose = keystable[i].compose;
+
+          return ev;
+       }
+
+   utf16 = ioKbCnvRawCode (KB_MAPPING_101, keyboard_mods, keyboard_leds, key);
+   unicodeToUtf8(utf16, utf8);
+   ev->keyname = ev->key = ev->string = ev->compose = strdup (utf8);
+
+   return ev;
+}
+
+static void
+_ecore_psl1ght_mouse_move(s32 x_axis, s32 y_axis)
+{
+   Ecore_Event_Mouse_Move *ev;
+
+   ev = malloc(sizeof(Ecore_Event_Mouse_Move));
+   if (!ev) return;
+
+   mouse_x += x_axis;
+   mouse_y += y_axis;
+   if (mouse_x < 0) mouse_x = 0;
+   if (mouse_y < 0) mouse_y = 0;
+   if (mouse_x > window_width) mouse_x = window_width;
+   if (mouse_y > window_height) mouse_y = window_height;
+
+   ev->window = 0;
+   ev->root_window = 0;
+   ev->event_window = 0;
+   ev->same_screen = 0;
+   ev->timestamp = _ecore_psl1ght_get_time ();
+   ev->modifiers = _ecore_psl1ght_get_modifiers ();
+   ev->x = ev->root.x = mouse_x;
+   ev->y = ev->root.x = mouse_y;
+
+   ev->multi.device = 0;
+   ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
+   ev->multi.pressure = ev->multi.angle = 0;
+   ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
+
+   ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
+}
+
+static void
+_ecore_psl1ght_mouse_button(int button, int pressed)
+{
+   Ecore_Event_Mouse_Button *ev;
+   static unsigned int previous_timestamp = 0;
+
+   ev = malloc(sizeof(Ecore_Event_Mouse_Button));
+   if (!ev) return;
+
+   ev->window = 0;
+   ev->root_window = 0;
+   ev->event_window = 0;
+   ev->same_screen = 0;
+   ev->timestamp = _ecore_psl1ght_get_time ();
+   ev->modifiers = _ecore_psl1ght_get_modifiers ();
+   ev->buttons = button;
+   if (ev->timestamp - previous_timestamp <= 500)
+     ev->double_click = 1;
+   ev->triple_click = 0;
+   previous_timestamp = ev->timestamp;
+
+   ev->x = ev->root.x = mouse_x;
+   ev->y = ev->root.y = mouse_y;
+   ev->multi.device = 0;
+   ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
+   ev->multi.pressure = ev->multi.angle = 0;
+   ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
+
+   if (pressed)
+     ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
+   else
+     ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
+}
+
+static void
+_ecore_psl1ght_mouse_wheel(s8 wheel, s8 tilt)
+{
+   Ecore_Event_Mouse_Wheel *ev;
+
+   ev = malloc(sizeof(Ecore_Event_Mouse_Wheel));
+   if (!ev) return;
+
+   ev->timestamp = _ecore_psl1ght_get_time ();
+   ev->window = 0;
+   ev->event_window = 0;
+   ev->modifiers = _ecore_psl1ght_get_modifiers ();
+   ev->direction = 0;
+   ev->z = wheel;
+
+   ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
+}
+
+static void
+_ecore_psl1ght_pad_button (const char *name, int pressed)
+{
+   Ecore_Event_Key *ev = NULL;
+
+   ev = malloc(sizeof(Ecore_Event_Key));
+   if (!ev) return;
+
+   ev->timestamp = _ecore_psl1ght_get_time ();
+   ev->window = 0;
+   ev->event_window = 0;
+   ev->modifiers = 0;
+
+   ev->keyname = name;
+   ev->key = name;
+   ev->string = "";
+   ev->compose = "";
+
+   if (pressed)
+     ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
+   else
+     ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
+}
+
+#define PAD_STICK_DEADZONE 0x20
+
+static void
+_ecore_psl1ght_poll_joypad(void)
+{
+   padInfo padinfo;
+   int i;
+
+   /**/
+   /* Check mouse events */
+   ioPadGetInfo (&padinfo);
+
+   for (i = 0; i < 4; i++) /* Ignore the move */
+     {
+        if (padinfo.status[i])
+          {
+             int analog_h, analog_v;
+
+             if (ioPadGetData (i, &pad_data) != 0)
+               continue;
+             analog_h = pad_data.ANA_L_H - 0x80;
+             analog_v = pad_data.ANA_L_V - 0x80;
+
+             if (analog_h > PAD_STICK_DEADZONE)
+               analog_h -= PAD_STICK_DEADZONE;
+             else if (analog_h < -PAD_STICK_DEADZONE)
+               analog_h += PAD_STICK_DEADZONE;
+             else
+               analog_h = 0;
+             analog_h /= 10;
+
+             if (analog_v > PAD_STICK_DEADZONE)
+               analog_v -= PAD_STICK_DEADZONE;
+             else if (analog_v < -PAD_STICK_DEADZONE)
+               analog_v += PAD_STICK_DEADZONE;
+             else
+               analog_v = 0;
+             analog_v /= 10;
+
+             if (analog_h != 0 || analog_v != 0)
+               _ecore_psl1ght_mouse_move (analog_h, analog_v);
+
+             if (old_pad_data.BTN_CROSS ^ pad_data.BTN_CROSS) {
+               _ecore_psl1ght_pad_button ("Cross", pad_data.BTN_CROSS);
+               _ecore_psl1ght_mouse_button (1, pad_data.BTN_CROSS);
+             }
+             if (old_pad_data.BTN_CIRCLE ^ pad_data.BTN_CIRCLE) {
+               _ecore_psl1ght_pad_button ("Circle", pad_data.BTN_CIRCLE);
+               _ecore_psl1ght_mouse_button (3, pad_data.BTN_CIRCLE);
+             }
+             if (old_pad_data.BTN_SQUARE ^ pad_data.BTN_SQUARE)
+               _ecore_psl1ght_pad_button ("Square", pad_data.BTN_SQUARE);
+             if (old_pad_data.BTN_TRIANGLE ^ pad_data.BTN_TRIANGLE)
+               _ecore_psl1ght_pad_button ("Triangle", pad_data.BTN_TRIANGLE);
+             if (old_pad_data.BTN_UP ^ pad_data.BTN_UP)
+               _ecore_psl1ght_pad_button ("Up", pad_data.BTN_UP);
+             if (old_pad_data.BTN_DOWN ^ pad_data.BTN_DOWN)
+               _ecore_psl1ght_pad_button ("Down", pad_data.BTN_DOWN);
+             if (old_pad_data.BTN_LEFT ^ pad_data.BTN_LEFT)
+               _ecore_psl1ght_pad_button ("Left", pad_data.BTN_LEFT);
+             if (old_pad_data.BTN_RIGHT ^ pad_data.BTN_RIGHT)
+               _ecore_psl1ght_pad_button ("Right", pad_data.BTN_RIGHT);
+             if (old_pad_data.BTN_L1 ^ pad_data.BTN_L1)
+               _ecore_psl1ght_pad_button ("L1", pad_data.BTN_L1);
+             if (old_pad_data.BTN_L2 ^ pad_data.BTN_L2)
+               _ecore_psl1ght_pad_button ("L2", pad_data.BTN_L2);
+             if (old_pad_data.BTN_L3 ^ pad_data.BTN_L3)
+               _ecore_psl1ght_pad_button ("L3", pad_data.BTN_L3);
+             if (old_pad_data.BTN_R1 ^ pad_data.BTN_R1)
+               _ecore_psl1ght_pad_button ("R1", pad_data.BTN_R1);
+             if (old_pad_data.BTN_R2 ^ pad_data.BTN_R2)
+               _ecore_psl1ght_pad_button ("R2", pad_data.BTN_R2);
+             if (old_pad_data.BTN_R3 ^ pad_data.BTN_R3)
+               _ecore_psl1ght_pad_button ("R3", pad_data.BTN_R3);
+             if (old_pad_data.BTN_START ^ pad_data.BTN_START)
+               _ecore_psl1ght_pad_button ("Start", pad_data.BTN_START);
+             if (old_pad_data.BTN_SELECT ^ pad_data.BTN_SELECT)
+               _ecore_psl1ght_pad_button ("Select", pad_data.BTN_SELECT);
+
+             old_pad_data = pad_data;
+          }
+     }
+}
+
+static void
+_ecore_psl1ght_poll_mouse(void)
+{
+   mouseInfo mouseinfo;
+   u32 i;
+
+   /**/
+   /* Check mouse events */
+   ioMouseGetInfo(&mouseinfo);
+
+   if (mouseinfo.status[0] == 1 && !mouse_connected) // Connected
+     {
+        mouse_connected = TRUE;
+        mouse_buttons = 0;
+
+        // Old events in the queue are discarded
+        ioMouseClearBuf(0);
+     }
+   else if (mouseinfo.status[0] != 1 && mouse_connected) // Disconnected
+     {
+        mouse_connected = FALSE;
+        mouse_buttons = 0;
+     }
+
+   if (mouse_connected)
+     {
+        mouseDataList datalist;
+
+        ioMouseGetDataList(0, &datalist);
+
+        for (i = 0; i < datalist.count; i++)
+          {
+             u8 old_left = mouse_buttons & 1;
+             u8 new_left = datalist.list[i].buttons & 1;
+             u8 old_right = mouse_buttons & 2;
+             u8 new_right = datalist.list[i].buttons & 2;
+             u8 old_middle = mouse_buttons & 4;
+             u8 new_middle = datalist.list[i].buttons & 4;
+
+             if (datalist.list[i].x_axis != 0 ||
+                 datalist.list[i].y_axis != 0)
+               _ecore_psl1ght_mouse_move (datalist.list[i].x_axis,
+                                          datalist.list[i].y_axis);
+
+             if (old_left != new_left)
+               _ecore_psl1ght_mouse_button (1, new_left);
+             if (old_middle != new_middle)
+               _ecore_psl1ght_mouse_button (2, new_middle);
+             if (old_right != new_right)
+               _ecore_psl1ght_mouse_button (3, new_right);
+
+             if (datalist.list[i].wheel != 0)
+               _ecore_psl1ght_mouse_wheel (datalist.list[i].wheel,
+                                           datalist.list[i].tilt);
+
+             mouse_buttons = datalist.list[i].buttons;
+          }
+     }
+}
+
+static void
+_ecore_psl1ght_poll_move(void)
+{
+   int i;
+   u16 new_buttons;
+   static int t_pressed = 0;
+   static int calibrated = 0;
+   static float prev_x = 0;
+   static float prev_y = 0;
+   static int gyro = 0;
+   float x, y, z;
+
+   /* Check move events */
+   processMove (move_context);
+   new_buttons = move_context->state.paddata.buttons & (~move_buttons);
+   move_buttons = move_context->state.paddata.buttons;
+
+   moveGet3DPosition (move_context, &x, &y, &z);
+   //printf ("Move 3D position is : %f, %f, %f\n", x,y,z);
+
+   switch (new_buttons) {
+      case 1:
+        gyro = !gyro;
+        break;
+
+      case 4:
+        // Move button
+        //printf ("Calibrating\n");
+        gemCalibrate (0);
+        calibrated = 1;
+        break;
+
+      case 8:
+        // start button
+        _ecore_psl1ght_mouse_move ((window_width / 2) - mouse_x, (window_height / 2) - mouse_y);
+        break;
+     }
+
+   if (calibrated)
+     {
+        float x_axis, y_axis;
+
+        if (gyro)
+          {
+             gemInertialState gem_inert;
+
+             gemGetInertialState (0, 0, 0, &gem_inert);
+             x_axis = -vec_array (gem_inert.gyro, 1) * 25;
+             y_axis = -vec_array (gem_inert.gyro, 0) * 25;
+             if (abs (x_axis) > 2 || abs (y_axis) > 2)
+               _ecore_psl1ght_mouse_move (x_axis, y_axis);
+          }
+        else {
+             x_axis = (x - prev_x) * 2.5;
+             y_axis = -(y - prev_y) * 2.5;
+             prev_x = x;
+             prev_y = y;
+             _ecore_psl1ght_mouse_move (x_axis, y_axis);
+          }
+
+        if (!t_pressed && (move_buttons & 0x2))
+          _ecore_psl1ght_mouse_button (1, 1);
+        else if (t_pressed && (move_buttons & 0x2) == 0)
+          _ecore_psl1ght_mouse_button (1, 0);
+        t_pressed = move_buttons & 0x2;
+     }
+}
+
+static void
+_ecore_psl1ght_poll_keyboard(void)
+{
+   KbInfo kbInfo;
+   int i;
+
+   /* Check keyboard events */
+   ioKbGetInfo(&kbInfo);
+
+   if (kbInfo.status[0] == 1 && !keyboard_connected)
+     {
+        /* Connected */
+         keyboard_connected = true;
+
+         // Old events in the queue are discarded
+         ioKbClearBuf(0);
+         keyboard_leds._KbLedU.leds = 0;
+         keyboard_mods._KbMkeyU.mkeys = 0;
+         keyboard_old_key = 0;
+
+         // Set raw keyboard code types to get scan codes
+         ioKbSetCodeType(0, KB_CODETYPE_RAW);
+         ioKbSetReadMode(0, KB_RMODE_INPUTCHAR);
+     }
+   else if (kbInfo.status[0] != 1 && keyboard_connected)
+     {
+        /* Disconnected keyboard */
+         keyboard_connected = FALSE;
+     }
+
+   if (keyboard_connected)
+     {
+        KbData Keys;
+
+        // Read data from the keyboard buffer
+        if (ioKbRead(0, &Keys) == 0 && Keys.nb_keycode > 0)
+          {
+             Ecore_Event_Key *ev = NULL;
+
+             _ecore_psl1ght_key_modifiers (&Keys.mkey, &Keys.led);
+
+             if (Keys.nb_keycode == 0 && keyboard_old_key != 0)
+               {
+                  ev = _ecore_psl1ght_event_key (keyboard_old_key);
+                  if (ev) ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
+               }
+             for (i = 0; i < Keys.nb_keycode; i++)
+               {
+                  if (Keys.keycode[i] != keyboard_old_key)
+                    {
+                       if (Keys.keycode[i] != 0)
+                         {
+                            ev = _ecore_psl1ght_event_key (Keys.keycode[i]);
+                            if (ev)
+                              ecore_event_add(ECORE_EVENT_KEY_DOWN, ev,
+                                              NULL, NULL);
+                         }
+                       else
+                         {
+                            ev = _ecore_psl1ght_event_key (keyboard_old_key);
+                            if (ev)
+                              ecore_event_add(ECORE_EVENT_KEY_UP, ev,
+                                              NULL, NULL);
+                         }
+                       keyboard_old_key = Keys.keycode[0];
+                    }
+               }
+          }
+     }
+}
+
+static void
+xmb_event_handler(u64 status, u64 param, void *user_data)
+{
+   //printf ("Received event %lX\n", status);
+   switch (status) {
+     case SYSUTIL_EXIT_GAME:
+        ecore_event_add(ECORE_PSL1GHT_EVENT_QUIT, NULL, NULL, NULL);
+        break;
+     case SYSUTIL_DRAW_BEGIN:
+        ecore_event_add(ECORE_PSL1GHT_EVENT_EXPOSE, NULL, NULL, NULL);
+     case SYSUTIL_MENU_OPEN:
+        ecore_event_add(ECORE_PSL1GHT_EVENT_LOST_FOCUS, NULL, NULL, NULL);
+        break;
+     case SYSUTIL_DRAW_END:
+        ecore_event_add(ECORE_PSL1GHT_EVENT_EXPOSE, NULL, NULL, NULL);
+     case SYSUTIL_MENU_CLOSE:
+        ecore_event_add(ECORE_PSL1GHT_EVENT_GOT_FOCUS, NULL, NULL, NULL);
+        break;
+     default:
+       break;
+   }
+}
+
+EAPI void
+ecore_psl1ght_poll_events(void)
+{
+   _ecore_psl1ght_poll_joypad ();
+   _ecore_psl1ght_poll_mouse ();
+   if (move_context)
+     _ecore_psl1ght_poll_move ();
+   _ecore_psl1ght_poll_keyboard ();
+
+   sysUtilCheckCallback ();
+}
+
+EAPI void
+ecore_psl1ght_resolution_set(int width, int height)
+{
+   window_width = width;
+   window_height = height;
+   if (mouse_x > window_width) mouse_x = window_width;
+   if (mouse_y > window_height) mouse_y = window_height;
+}
+
+EAPI void
+ecore_psl1ght_screen_resolution_get(int *w, int *h)
+{
+   videoState state;
+   videoResolution resolution;
+
+   /* Get the state of the display */
+   if (videoGetState (0, 0, &state) == 0 &&
+       videoGetResolution (state.displayMode.resolution, &resolution) == 0)
+     {
+        if (w) *w = resolution.width;
+        if (h) *h = resolution.height;
+     }
+   else {
+        if (w) *w = 0;
+        if (h) *h = 0;
+     }
+}
+
+EAPI void
+ecore_psl1ght_optimal_screen_resolution_get(int *w, int *h)
+{
+   videoDeviceInfo info;
+   videoResolution res;
+   int area = 720 * 480;
+   int mode_area;
+   int i;
+
+   if (w) *w = 720;
+   if (h) *h = 480;
+
+   videoGetDeviceInfo(0, 0, &info);
+
+   for (i = 0; i < info.availableModeCount; i++) {
+        videoGetResolution (info.availableModes[i].resolution, &res);
+        mode_area = res.width * res.height;
+        if (mode_area > area)
+          {
+             area = mode_area;
+             if (w) *w = res.width;
+             if (h) *h = res.height;
+          }
+     }
+}
+
diff --git a/src/lib/ecore_psl1ght/ecore_psl1ght_private.h b/src/lib/ecore_psl1ght/ecore_psl1ght_private.h
new file mode 100644 (file)
index 0000000..bd5a86e
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef _ECORE_PSL1GHT_PRIVATE_H
+# define _ECORE_PSL1GHT_PRIVATE_H
+
+extern int _ecore_psl1ght_log_dom;
+
+# ifdef ECORE_PSL1GHT_DEFAULT_LOG_COLOR
+#  undef ECORE_PSL1GHT_DEFAULT_LOG_COLOR
+# endif
+# define ECORE_PSL1GHT_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+# ifdef ERR
+#  undef ERR
+# endif
+# define ERR(...) EINA_LOG_DOM_ERR(_ecore_psl1ght_log_dom, __VA_ARGS__)
+
+# ifdef DBG
+#  undef DBG
+# endif
+# define DBG(...) EINA_LOG_DOM_DBG(_ecore_psl1ght_log_dom, __VA_ARGS__)
+
+# ifdef INF
+#  undef INF
+# endif
+# define INF(...) EINA_LOG_DOM_INFO(_ecore_psl1ght_log_dom, __VA_ARGS__)
+
+# ifdef WRN
+#  undef WRN
+# endif
+# define WRN(...) EINA_LOG_DOM_WARN(_ecore_psl1ght_log_dom, __VA_ARGS__)
+
+# ifdef CRIT
+#  undef CRIT
+# endif
+# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_psl1ght_log_dom, __VA_ARGS__)
+
+#endif
diff --git a/src/lib/ecore_psl1ght/gemutil.c b/src/lib/ecore_psl1ght/gemutil.c
new file mode 100644 (file)
index 0000000..9ccfc1c
--- /dev/null
@@ -0,0 +1,281 @@
+#include <stdio.h>
+#include <io/move.h>
+#include <sys/memory.h>
+#include <ppu-types.h>
+#include <io/camera.h>
+#include <ppu-types.h>
+#include <spurs/spurs.h>
+#include <sys/spu.h>
+#include <sys/thread.h>
+#include <sys/systime.h>
+
+#define SPURS_DEFAULT_PREFIX_NAME "gem_spurs"
+
+u16 oldGemPad = 0;
+u16 newGemPad = 0;
+u16 newGemAnalogT = 0;
+extern cameraReadInfo camread;
+
+static inline float
+vec_array(vec_float4 vec, unsigned int idx)
+{
+   union {
+      vec_float4 vec;
+      float      array[4];
+   } v;
+
+   v.vec = vec;
+
+   if (idx > 3)
+     return -1;
+   return v.array[idx];
+}
+
+int
+initMove()
+{
+   Spurs *spurs;
+   gemAttribute gem_attr;
+   u8 gem_spu_priorities[8] = { 1, 0, 0, 0, 0, 0, 0, 0 };
+   int ret;
+   int i;
+
+   spurs = initSpurs (NULL);
+
+   if (spurs == NULL)
+     goto error;
+
+   printf ("preparing GemAttribute structure with spurs\n");
+
+   initAttributeGem (&gem_attr, 1, NULL, spurs, gem_spu_priorities);
+   gem_attr->version = 2;
+   gem_attr->max = 1;
+   gem_attr->spurs = spurs;
+   gem_attr->memory = NULL;
+   gem_attr->spu_priorities[0] = 1;
+   for (i = 1; i < 8; ++i)
+     gem_attr->spu_priorities[i] = 0;
+
+   printf ("calling GemInit with GemAttribute structure version=%d max_connect=%d spurs=%X\n",
+           gem_attr.version, gem_attr.max, gem_attr.spurs);
+   ret = gemInit (&gem_attr);
+   printf ("return from GemInit %X \n", ret);
+   if (ret)
+     goto error;
+
+   ret = gemPrepareCamera (128, 0.5);
+   printf ("GemPrepareCamera return %d exposure set to 128 and quality to 0.5\n",
+           ret);
+   if (ret)
+     goto error;
+   ret = gemReset (0);
+   printf ("GemReset return %X \n", ret);
+   if (ret)
+     goto error;
+   return ret;
+
+error:
+   if (spurs)
+     endSpurs (spurs);
+   return NULL;
+}
+
+int
+endMove()
+{
+   endSpurs (spurs);
+   gemEnd ();
+   return 0;
+}
+
+int
+proccessGem(int t)
+{
+   int ret;
+
+   switch (t) {
+      case 0:
+
+        ret = gemUpdateStart (camread.buffer, camread.timestamp);
+
+        if (ret != 0)
+          {
+             printf ("Return from gemUpdateStart %X\n", ret);
+          }
+        break;
+
+      case 2:
+
+        ret = gemUpdateFinish ();
+        if (ret != 0)
+          {
+             printf ("Return from gemUpdateFinish %X\n", ret);
+          }
+        break;
+
+      case 3:
+        ret = gemConvertVideoFinish ();
+        if (ret != 0)
+          {
+             printf ("Return from gemConvertVideoFinish %X\n", ret);
+          }
+        break;
+
+      default:
+        ret = -1;
+        break;
+     }
+   return ret;
+}
+
+void
+readGemPad(int num_gem)
+{
+   gemState gem_state;
+   int ret;
+   unsigned int hues[] = { 4 << 24, 4 << 24, 4 << 24, 4 << 24 };
+   ret = gemGetState (0, 0, -22000, &gem_state);
+
+   newGemPad = gem_state.paddata.buttons & (~oldGemPad);
+   newGemAnalogT = gem_state.paddata.ANA_T;
+   oldGemPad = gem_state.paddata.buttons;
+
+   switch (ret) {
+      case 2:
+        gemForceRGB (num_gem, 0.5, 0.5, 0.5);
+        break;
+
+      case 5:
+
+        gemTrackHues (hues, NULL);
+        break;
+
+      default:
+        break;
+     }
+}
+
+void
+readGemAccPosition(int num_gem)
+{
+   vec_float4 position;
+
+   gemGetAccelerometerPositionInDevice (num_gem, &position);
+
+   printf (" accelerometer device coordinates [%f,%f,%f,%f]\n",
+           vec_array (position, 0), vec_array (position, 1), vec_array (position, 2),
+           vec_array (position, 3));
+}
+
+void
+readGemInertial(int num_gem)
+{
+   gemInertialState gem_inertial_state;
+   int ret;
+
+   ret = gemGetInertialState (num_gem, 0, -22000, &gem_inertial_state);
+   printf ("gemGetInertialState return %X\n", ret);
+   printf ("counter %d temperature %f\n", gem_inertial_state.counter,
+           gem_inertial_state.temperature);
+
+   printf (" accelerometer sensor   [%f,%f,%f,%f]\n",
+           vec_array (gem_inertial_state.accelerometer, 0),
+           vec_array (gem_inertial_state.accelerometer, 1),
+           vec_array (gem_inertial_state.accelerometer, 2),
+           vec_array (gem_inertial_state.accelerometer, 3));
+
+   printf (" accelerometer_bias sensor   [%f,%f,%f,%f]\n",
+           vec_array (gem_inertial_state.accelerometer_bias, 0),
+           vec_array (gem_inertial_state.accelerometer_bias, 1),
+           vec_array (gem_inertial_state.accelerometer_bias, 2),
+           vec_array (gem_inertial_state.accelerometer_bias, 3));
+
+   printf (" gyro sensor  [%f,%f,%f,%f]\n", vec_array (gem_inertial_state.gyro,
+                                                       0), vec_array (gem_inertial_state.gyro, 1),
+           vec_array (gem_inertial_state.gyro, 2),
+           vec_array (gem_inertial_state.gyro, 3));
+
+   printf (" gyro_bias sensor  [%f,%f,%f,%f]\n",
+           vec_array (gem_inertial_state.gyro_bias, 0),
+           vec_array (gem_inertial_state.gyro_bias, 1),
+           vec_array (gem_inertial_state.gyro_bias, 2),
+           vec_array (gem_inertial_state.gyro_bias, 3));
+}
+
+void
+readGem()
+{
+   gemState gem_state;
+   proccessGem (0);
+
+   proccessGem (2);
+
+   readGemPad (0); // This will read buttons from Move
+   switch (newGemPad) {
+      case 1:
+        printf ("Select pressed \n");
+        break;
+
+      case 2:
+        printf ("T pressed value %d\n", newGemAnalogT);
+        printf
+          ("Frame %d center of the sphere in world coordinates %f %f %f %f \n",
+          camread.frame, vec_array (gem_state.pos, 0), vec_array (gem_state.pos,
+                                                                  1), vec_array (gem_state.pos, 2), vec_array (gem_state.pos, 3));
+        break;
+
+      case 4:
+        printf ("Move pressed \n");
+        gemCalibrate (0);
+        break;
+
+      case 8:
+        printf ("Start pressed \n");
+        pos_x = 0;
+        pos_y = 0;
+        break;
+
+      case 16:
+        printf ("Triangle pressed \n");
+        getImageState ();
+        break;
+
+      case 32:
+        printf ("Circle pressed \n");
+        break;
+
+      case 64:
+        printf ("Cross pressed \n");
+        printf ("X,Y,Z position (mm) %f %f %f\n", vec_array (gem_state.pos, 0),
+                vec_array (gem_state.pos, 1), vec_array (gem_state.pos, 2));
+        readGemAccPosition (0);
+        break;
+
+      case 128:
+        printf ("Square pressed \n");
+        readGemInertial (0);
+        break;
+
+      default:
+        break;
+     }
+}
+
+void
+getImageState()
+{
+   int ret;
+
+   gemImageState imgState;
+
+   gemGetImageState (0, &imgState);
+   printf (" u  [%f]\n", imgState.u);
+   printf (" v  [%f]\n", imgState.v);
+   printf (" r  [%f]\n", imgState.r);
+   printf (" projectionx  [%f]\n", imgState.projectionx);
+   printf (" projectiony  [%f]\n", imgState.projectiony);
+   printf (" distance  [%f]\n", imgState.distance);
+   printf ("visible=%d r_valid=%d\n", imgState.visible, imgState.r_valid);
+   printf ("tiemestamp=%Ld\n", imgState.frame_time);
+}
+
diff --git a/src/lib/ecore_psl1ght/gemutil.h b/src/lib/ecore_psl1ght/gemutil.h
new file mode 100644 (file)
index 0000000..ce4b544
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) Antonio José Ramos Márquez (bigboss)
+ * Copyright (C) Youness Alaoui (KaKaRoTo)
+ */
+
+#ifndef __GEMUTIL_H__
+#define __GEMUTIL_H__
+
+#include <ppu-types.h>
+#include <spurs/spurs.h>
+#include <io/camera.h>
+#include <io/move.h>
+
+typedef struct
+{
+   Spurs *spurs;
+} moveContext;
+
+#endif /* __GEMUTIL_H__ */
diff --git a/src/lib/ecore_psl1ght/moveutil.c b/src/lib/ecore_psl1ght/moveutil.c
new file mode 100644 (file)
index 0000000..1dadfbc
--- /dev/null
@@ -0,0 +1,245 @@
+#include <stdio.h>
+#include <io/move.h>
+#include <sys/memory.h>
+#include <ppu-types.h>
+#include <io/camera.h>
+#include <ppu-types.h>
+#include <spurs/spurs.h>
+#include <sys/thread.h>
+#include <sys/systime.h>
+
+#include "spursutil.h"
+#include "moveutil.h"
+
+u16 oldGemPad = 0;
+u16 newGemPad = 0;
+u16 newGemAnalogT = 0;
+
+static void
+endCamera(moveContext *context)
+{
+   cameraStop (0);
+
+   cameraClose (0);
+   cameraEnd ();
+
+   sysMemContainerDestroy (context->camInfo.container);
+}
+
+static int
+initCamera(moveContext *context)
+{
+   int ret;
+
+   context->camInfo.container = NULL;
+
+   ret = cameraInit ();
+   printf ("cameraInit() returned %d\n", ret);
+   if (ret == 0)
+     {
+        cameraType type = CAM_TYPE_UNKNOWN;
+
+        ret = cameraGetType (0, &type);
+        if (ret == 0 && type == CAM_TYPE_PLAYSTATION_EYE)
+          {
+             context->camInfo.format = CAM_FORM_RAW8;
+             context->camInfo.framerate = 60;
+             context->camInfo.resolution = CAM_RESO_VGA;
+             context->camInfo.info_ver = 0x0101;
+             ret = sysMemContainerCreate (&context->camInfo.container, 0x200000);
+             printf ("sysMemContainerCreate() for camera container returned %d\n", ret);
+
+             ret = cameraOpenEx (0, &context->camInfo);
+             switch (ret) {
+                case 0:
+                  printf ("Found me an eye, arrr!\n");
+                  printf ("cameraOpenEx returned %08X\n", ret);
+                  printf ("Video dimensions: %dx%d\n", context->camInfo.width, context->camInfo.height);
+                  printf ("Buffer at %08X\n", context->camInfo.buffer);
+                  printf ("pbuf0 Buffer at %08X\n", context->camInfo.pbuf[0]);
+                  printf ("pbuf0 Buffer at %08X\n", context->camInfo.pbuf[1]);
+                  printf ("context->camInfo.info_ver %X\n", context->camInfo.info_ver);
+
+                  context->camRead.buffer = context->camInfo.buffer;
+                  context->camRead.version = 0x0100;
+                  printf ("Setting CameraReadEx %08X buffer to cameraInfoex buffer \n",
+                          context->camRead.buffer);
+                  break;
+
+                default:
+                  printf ("Error %X detected opening PlayStation Eye\n", ret);
+                  goto error;
+               }
+          }
+        else {
+             printf ("Device detected is not a PlayStation Eye and this sample need it\n");
+             goto error;
+          }
+     }
+   else {
+        goto error;
+     }
+   return ret;
+
+error:
+   if (context->camInfo.container)
+     sysMemContainerDestroy (context->camInfo.container);
+   return ret;
+}
+
+static int
+readCamera(moveContext *context)
+{
+   int ret;
+
+   ret = cameraReadEx (0, &context->camRead);
+   switch (ret) {
+      case CAMERA_ERRO_NEED_START:
+        cameraReset (0);
+        ret = gemPrepareCamera (128, 0.5);
+        printf ("GemPrepareCamera return %d exposure set to 128 and quality to 0.5 before cameraStart\n",
+                ret);
+        printf ("lets go!! It's time to look your face in Sony Bravia :P\n");
+        ret = cameraStart (0);
+        printf ("cameraStart return %d \n", ret);
+        printf ("*******************************************\n");
+        printf ("* Now make sure you have a Move connected\n");
+        printf ("* and point it towards the camera and press\n");
+        printf ("* the action button to calibrate\n");
+        printf ("*******************************************\n");
+        break;
+
+      case 0:
+        break;
+
+      default:
+        printf ("error %08X ", ret);
+        ret = 1;
+        break;
+     }
+   // printf("despues de start return %d \n",ret);
+   if (ret == 0 && context->camRead.readcount != 0)
+     {
+        return context->camRead.readcount;
+     }
+   else {
+        return 0;
+     }
+}
+
+moveContext *
+initMove()
+{
+   moveContext *context = NULL;
+   Spurs *spurs;
+   gemAttribute gem_attr;
+   int ret;
+   int i;
+
+   spurs = initSpurs ("gem_spurs");
+
+   if (spurs == NULL)
+     goto error;
+
+   printf ("preparing GemAttribute structure with spurs\n");
+
+   gem_attr.version = 2;
+   gem_attr.max = 1;
+   gem_attr.spurs = spurs;
+   gem_attr.memory = NULL;
+   gem_attr.spu_priorities[0] = 1;
+   for (i = 1; i < 8; ++i)
+     gem_attr.spu_priorities[i] = 0;
+
+   printf ("calling GemInit with GemAttribute structure version=%d max_connect=%d spurs=%X\n",
+           gem_attr.version, gem_attr.max, gem_attr.spurs);
+   ret = gemInit (&gem_attr);
+   printf ("return from GemInit %X \n", ret);
+   if (ret)
+     goto error;
+
+   ret = gemPrepareCamera (128, 0.5);
+   printf ("GemPrepareCamera return %d exposure set to 128 and quality to 0.5\n",
+           ret);
+   if (ret)
+     goto error;
+   ret = gemReset (0);
+   printf ("GemReset return %X \n", ret);
+   if (ret)
+     goto error;
+
+   context = (moveContext *)malloc (sizeof (moveContext));
+   context->spurs = spurs;
+   ret = initCamera (context);
+
+   if (ret == 0)
+     return context;
+
+error:
+   if (spurs)
+     endSpurs (spurs);
+   if (context)
+     free (context);
+   return NULL;
+}
+
+void
+endMove(moveContext *context)
+{
+   /* Stop Move */
+    gemEnd ();
+    /* Stop Camera */
+    endCamera (context);
+    /* Stop Spurs */
+    endSpurs (context->spurs);
+
+    free (context);
+}
+
+int
+processMove(moveContext *context)
+{
+   const unsigned int hues[] = { 4 << 24, 4 << 24, 4 << 24, 4 << 24 };
+   int ret = -1;
+
+   if (readCamera (context) > 0)
+     {
+        ret = gemUpdateStart (context->camRead.buffer, context->camRead.timestamp);
+        //printf ("Return from gemUpdateStart %X\n", ret);
+        if (ret == 0)
+          {
+             ret = gemUpdateFinish ();
+             //printf ("Return from gemUpdateFinish %X\n", ret);
+             if (ret == 0)
+               {
+                  ret = gemGetState (0, STATE_LATEST_IMAGE_TIME, 0, &context->state);
+                  switch (ret) {
+                     case 2:
+                       gemForceRGB (0, 0.5, 0.5, 0.5);
+                       break;
+
+                     case 5:
+                       gemTrackHues (hues, NULL);
+                       break;
+
+                     default:
+                       break;
+                    }
+               }
+          }
+     }
+
+   return ret;
+}
+
+void
+moveGet3DPosition(moveContext *context, float *x, float *y, float *z)
+{
+   if (x)
+     *x = vec_array (context->state.pos, 0);
+   if (y)
+     *y = vec_array (context->state.pos, 1);
+   if (z)
+     *z = vec_array (context->state.pos, 2);
+}
+
diff --git a/src/lib/ecore_psl1ght/moveutil.h b/src/lib/ecore_psl1ght/moveutil.h
new file mode 100644 (file)
index 0000000..bb4b22c
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) Antonio José Ramos Márquez (bigboss)
+ * Copyright (C) Youness Alaoui (KaKaRoTo)
+ */
+
+#ifndef __MOVEUTIL_H__
+#define __MOVEUTIL_H__
+
+#include <ppu-types.h>
+#include <spurs/spurs.h>
+#include <io/camera.h>
+#include <io/move.h>
+
+typedef struct
+{
+   Spurs         *spurs;
+   cameraInfoEx   camInfo;
+   cameraReadInfo camRead;
+   gemState       state;
+} moveContext;
+
+static inline float
+vec_array(vec_float4 vec, unsigned int idx)
+{
+   union {
+      vec_float4 vec;
+      float      array[4];
+   } v;
+
+   v.vec = vec;
+
+   if (idx > 3)
+     return -1;
+   return v.array[idx];
+}
+
+moveContext *initMove();
+void         endMove(moveContext *context);
+void         readGemState(moveContext *context);
+int          processMove(moveContext *context);
+void         moveGet3DPosition(moveContext *context, float *x, float *y, float *z);
+
+#endif /* __MOVEUTIL_H__ */
diff --git a/src/lib/ecore_psl1ght/spursutil.c b/src/lib/ecore_psl1ght/spursutil.c
new file mode 100644 (file)
index 0000000..27b5c1d
--- /dev/null
@@ -0,0 +1,62 @@
+#include "spursutil.h"
+#include <sys/spu.h>
+
+#define SPURS_DEFAULT_PREFIX_NAME "spursutil"
+
+Spurs *
+initSpurs(const char *prefix_name)
+{
+   Spurs *spurs = NULL;
+   SpursAttribute attributeSpurs;
+   int ret;
+   int i;
+
+   ret = sysSpuInitialize (6, 0);
+   printf ("sysSpuInitialize return %d\n", ret);
+
+   /* initialize spurs */
+   printf ("Initializing spurs\n");
+   spurs = (void *)memalign (SPURS_ALIGN, sizeof (Spurs));
+   printf ("Initializing spurs attribute\n");
+
+   ret = spursAttributeInitialize (&attributeSpurs, 5, 250, 1000, true);
+   if (ret)
+     {
+        printf ("error : spursAttributeInitialize failed  %x\n", ret);
+        goto error;
+     }
+
+   printf ("Setting name prefix\n");
+   if (!prefix_name)
+     prefix_name = SPURS_DEFAULT_PREFIX_NAME;
+   ret = spursAttributeSetNamePrefix (&attributeSpurs,
+                                      prefix_name, strlen (prefix_name));
+   if (ret)
+     {
+        printf ("error : spursAttributeInitialize failed %x\n", ret);
+        goto error;
+     }
+
+   printf ("Initializing with attribute\n");
+   ret = spursInitializeWithAttribute (spurs, &attributeSpurs);
+   if (ret)
+     {
+        printf ("error: spursInitializeWithAttribute failed  %x\n", ret);
+        goto error;
+     }
+
+   return spurs;
+
+error:
+   if (spurs)
+     free (spurs);
+   return NULL;
+}
+
+void
+endSpurs(Spurs *spurs)
+{
+   spursFinalize (spurs);
+   free (spurs);
+}
+
diff --git a/src/lib/ecore_psl1ght/spursutil.h b/src/lib/ecore_psl1ght/spursutil.h
new file mode 100644 (file)
index 0000000..0b35030
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) Antonio José Ramos Márquez (bigboss)
+ * Copyright (C) Youness Alaoui (KaKaRoTo)
+ */
+
+#ifndef __SPURSUTIL_H__
+#define __SPURSUTIL_H__
+
+#include <ppu-types.h>
+#include <spurs/spurs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Initialize spurs with a given name prefix (*/
+Spurs *initSpurs(const char *prefix_name);
+void   endSpurs(Spurs *spurs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SPURSUTIL_H__ */
index ea81358..359e974 100644 (file)
@@ -1,7 +1,3 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifndef _ECORE_SDL_H
 #define _ECORE_SDL_H
 
 extern "C" {
 #endif
 
-EAPI extern int ECORE_SDL_EVENT_KEY_DOWN; /**< SDL Key Down event */
-EAPI extern int ECORE_SDL_EVENT_KEY_UP; /**< SDL Key Up event */
-EAPI extern int ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN; /**< SDL Mouse Down event */
-EAPI extern int ECORE_SDL_EVENT_MOUSE_BUTTON_UP; /**< SDL Mouse Up event */
-EAPI extern int ECORE_SDL_EVENT_MOUSE_MOVE; /**< SDL Mouse Move event */
-EAPI extern int ECORE_SDL_EVENT_MOUSE_WHEEL; /**< SDL Mouse Wheel event */
-EAPI extern int ECORE_SDL_EVENT_GOT_FOCUS; /**< SDL Mouse Wheel event */
-EAPI extern int ECORE_SDL_EVENT_LOST_FOCUS; /**< SDL Mouse Wheel event */
+EAPI extern int ECORE_SDL_EVENT_GOT_FOCUS;
+EAPI extern int ECORE_SDL_EVENT_LOST_FOCUS;
 EAPI extern int ECORE_SDL_EVENT_RESIZE;
 EAPI extern int ECORE_SDL_EVENT_EXPOSE;
 
 typedef struct _Ecore_Sdl_Event_Key_Down Ecore_Sdl_Event_Key_Down;
 struct _Ecore_Sdl_Event_Key_Down /** SDL Key Down event */
 {
-        const char      *keyname; /**< The name of the key that was pressed */
-        const char      *keycompose; /**< The UTF-8 string conversion if any */
-        unsigned int    time;
+   const char      *keyname; /**< The name of the key that was pressed */
+   const char      *keycompose; /**< The UTF-8 string conversion if any */
+   unsigned int    time;
 };
 
 typedef struct _Ecore_Sdl_Event_Key_Up Ecore_Sdl_Event_Key_Up;
 struct _Ecore_Sdl_Event_Key_Up /** SDL Key Up event */
 {
-        const char      *keyname; /**< The name of the key that was released */
-        const char      *keycompose; /**< The UTF-8 string conversion if any */
-        unsigned int    time;
+   const char      *keyname; /**< The name of the key that was released */
+   const char      *keycompose; /**< The UTF-8 string conversion if any */
+   unsigned int    time;
 };
 
 typedef struct _Ecore_Sdl_Event_Mouse_Button_Down Ecore_Sdl_Event_Mouse_Button_Down;
 struct _Ecore_Sdl_Event_Mouse_Button_Down /** SDL Mouse Down event */
 {
-       int             button; /**< Mouse button that was pressed (1 - 32) */
-       int             x; /**< Mouse co-ordinates when mouse button was pressed */
-       int             y; /**< Mouse co-ordinates when mouse button was pressed */
-       int             double_click : 1; /**< Set if click was a double click */
-       int             triple_click : 1; /**< Set if click was a triple click  */
-        unsigned int    time;
+   int             button; /**< Mouse button that was pressed (1 - 32) */
+   int             x; /**< Mouse co-ordinates when mouse button was pressed */
+   int             y; /**< Mouse co-ordinates when mouse button was pressed */
+   int             double_click : 1; /**< Set if click was a double click */
+   int             triple_click : 1; /**< Set if click was a triple click  */
+   unsigned int    time;
 };
 
 typedef struct _Ecore_Sdl_Event_Mouse_Button_Up Ecore_Sdl_Event_Mouse_Button_Up;
 struct _Ecore_Sdl_Event_Mouse_Button_Up /** SDL Mouse Up event */
 {
-       int             button; /**< Mouse button that was released (1 - 32) */
-       int             x; /**< Mouse co-ordinates when mouse button was raised */
-       int             y; /**< Mouse co-ordinates when mouse button was raised */
-       int             double_click : 1; /**< Set if click was a double click */
-       int             triple_click : 1; /**< Set if click was a triple click  */
-        unsigned int    time;
+   int             button; /**< Mouse button that was released (1 - 32) */
+   int             x; /**< Mouse co-ordinates when mouse button was raised */
+   int             y; /**< Mouse co-ordinates when mouse button was raised */
+   int             double_click : 1; /**< Set if click was a double click */
+   int             triple_click : 1; /**< Set if click was a triple click  */
+   unsigned int    time;
 };
 
 typedef struct _Ecore_Sdl_Event_Mouse_Move Ecore_Sdl_Event_Mouse_Move;
 struct _Ecore_Sdl_Event_Mouse_Move /** SDL Mouse Move event */ 
 {
-       int             x; /**< Mouse co-ordinates where the mouse cursor moved to */
-       int             y; /**< Mouse co-ordinates where the mouse cursor moved to */
-        unsigned int    time;
+   int             x; /**< Mouse co-ordinates where the mouse cursor moved to */
+   int             y; /**< Mouse co-ordinates where the mouse cursor moved to */
+   unsigned int    time;
 };
 
 typedef struct _Ecore_Sdl_Event_Mouse_Wheel Ecore_Sdl_Event_Mouse_Wheel;
 struct _Ecore_Sdl_Event_Mouse_Wheel /** SDL Mouse Wheel event */
 {
-       int             x,y;
-       int             direction; /* 0 = vertical, 1 = horizontal */
-       int             wheel; /* value 1 (left/up), -1 (right/down) */
-        unsigned int    time;
+   int             x,y;
+   int             direction; /* 0 = vertical, 1 = horizontal */
+   int             wheel; /* value 1 (left/up), -1 (right/down) */
+   unsigned int    time;
 };
 
 typedef struct _Ecore_Sdl_Event_Video_Resize Ecore_Sdl_Event_Video_Resize;
 struct _Ecore_Sdl_Event_Video_Resize
 {
-        int             w;
-        int             h;
+   int             w;
+   int             h;
 };
 
 EAPI int        ecore_sdl_init(const char *name);
index 8e5a7a0..4d0b60b 100644 (file)
@@ -11,13 +11,15 @@ struct _ecore_sdl_keys_s
 static const struct _ecore_sdl_keys_s  keystable[] =
 {
    { SDLK_UNKNOWN,      "0x00",         "" },
-   { SDLK_FIRST,        "First",        "" },
+#ifndef BUILD_ECORE_EVAS_SDL_130
+   { SDLK_FIRST,        "First",        "First" },
+#endif
    { SDLK_BACKSPACE,    "BackSpace",    "\010" },
    { SDLK_TAB,          "Tab",          "\011" },
-   { SDLK_CLEAR,        "Clear",        "" },
+   { SDLK_CLEAR,        "Clear",        "Clear" },
    { SDLK_RETURN,       "Return",       "\015" },
-   { SDLK_PAUSE,        "Pause",        "" },
-   { SDLK_ESCAPE,       "Escape",       "" },
+   { SDLK_PAUSE,        "Pause",        "Pause" },
+   { SDLK_ESCAPE,       "Escape",       "\033" },
    { SDLK_SPACE,        "space",        " " },
    { SDLK_EXCLAIM,      "exclam",       "!" },
    { SDLK_QUOTEDBL,     "quotedbl",     "\"" },
@@ -27,7 +29,7 @@ static const struct _ecore_sdl_keys_s  keystable[] =
    { SDLK_QUOTE,        "apostrophe",   "'" },
    { SDLK_LEFTPAREN,    "parenleft",    "(" },
    { SDLK_RIGHTPAREN,   "parenright",   ")" },
-   { SDLK_ASTERISK,     "asterik",      "*" },
+   { SDLK_ASTERISK,     "asterisk",     "*" },
    { SDLK_PLUS,         "plus",         "+" },
    { SDLK_COMMA,        "comma",        "," },
    { SDLK_MINUS,        "minus",        "-" },
@@ -43,7 +45,7 @@ static const struct _ecore_sdl_keys_s  keystable[] =
    { SDLK_7,            "7",            "7" },
    { SDLK_8,            "8",            "8" },
    { SDLK_9,            "9",            "9" },
-   { SDLK_COLON,        "colon",        ";" },
+   { SDLK_COLON,        "colon",        ":" },
    { SDLK_SEMICOLON,    "semicolon",    ";" },
    { SDLK_LESS,         "less",         "<" },
    { SDLK_EQUALS,       "equal",        "=" },
@@ -87,6 +89,7 @@ static const struct _ecore_sdl_keys_s  keystable[] =
    { SDLK_DELETE,       "Delete",       "\177" },
    /* End of ASCII mapped keysyms */
 
+#ifndef BUILD_ECORE_EVAS_SDL_130
    /* International keyboard syms */
    { SDLK_WORLD_0,      "w0",           "" }, /* 0xA0 */
    { SDLK_WORLD_1,      "w1",           "" },
@@ -184,7 +187,7 @@ static const struct _ecore_sdl_keys_s  keystable[] =
    { SDLK_WORLD_93,     "w93",          "" },
    { SDLK_WORLD_94,     "w94",          "" },
    { SDLK_WORLD_95,     "w95",          "" },
-
+#endif
    /* Numeric keypad */
    { SDLK_KP0,          "KP0",          "0" },
    { SDLK_KP1,          "KP1",          "1" },
@@ -205,59 +208,59 @@ static const struct _ecore_sdl_keys_s  keystable[] =
    { SDLK_KP_EQUALS,    "KP_Equals",    "=" },
 
    /* Arrows + Home/End pad */
-   { SDLK_UP,           "Up",           "" },
-   { SDLK_DOWN,         "Down",         "" },
-   { SDLK_RIGHT,        "Right",        "" },
-   { SDLK_LEFT,         "Left",         "" },
-   { SDLK_INSERT,       "Insert",       "" },
-   { SDLK_HOME,         "Home",         "" },
-   { SDLK_END,          "End",          "" },
-   { SDLK_PAGEUP,       "Page_Up",      "" },
-   { SDLK_PAGEDOWN,     "Page_Down",    "" },
+   { SDLK_UP,           "Up",           "Up" },
+   { SDLK_DOWN,         "Down",         "Down" },
+   { SDLK_RIGHT,        "Right",        "Right" },
+   { SDLK_LEFT,         "Left",         "Left" },
+   { SDLK_INSERT,       "Insert",       "Insert" },
+   { SDLK_HOME,         "Home",         "Home" },
+   { SDLK_END,          "End",          "End" },
+   { SDLK_PAGEUP,       "Page_Up",      "Page_Up" },
+   { SDLK_PAGEDOWN,     "Page_Down",    "Page_Down" },
 
    /* Function keys */
-   { SDLK_F1,           "F1",           "" },
-   { SDLK_F2,           "F2",           "" },
-   { SDLK_F3,           "F3",           "" },
-   { SDLK_F4,           "F4",           "" },
-   { SDLK_F5,           "F5",           "" },
-   { SDLK_F6,           "F6",           "" },
-   { SDLK_F7,           "F7",           "" },
-   { SDLK_F8,           "F8",           "" },
-   { SDLK_F9,           "F9",           "" },
-   { SDLK_F10,          "F10",          "" },
-   { SDLK_F11,          "F11",          "" },
-   { SDLK_F12,          "F12",          "" },
-   { SDLK_F13,          "F13",          "" },
-   { SDLK_F14,          "F14",          "" },
-   { SDLK_F15,          "F15",          "" },
+   { SDLK_F1,           "F1",           "F1" },
+   { SDLK_F2,           "F2",           "F2" },
+   { SDLK_F3,           "F3",           "F3" },
+   { SDLK_F4,           "F4",           "F4" },
+   { SDLK_F5,           "F5",           "F5" },
+   { SDLK_F6,           "F6",           "F6" },
+   { SDLK_F7,           "F7",           "F7" },
+   { SDLK_F8,           "F8",           "F8" },
+   { SDLK_F9,           "F9",           "F9" },
+   { SDLK_F10,          "F10",          "F10" },
+   { SDLK_F11,          "F11",          "F11" },
+   { SDLK_F12,          "F12",          "F12" },
+   { SDLK_F13,          "F13",          "F13" },
+   { SDLK_F14,          "F14",          "F14" },
+   { SDLK_F15,          "F15",          "F15" },
 
    /* Key state modifier keys */
-   { SDLK_NUMLOCK,      "Num_Lock",     "" },
-   { SDLK_CAPSLOCK,     "Caps_Lock",    "" },
-   { SDLK_SCROLLOCK,    "Scroll_Lock",  "" },
-   { SDLK_RSHIFT,       "Shift_R",      "" },
-   { SDLK_LSHIFT,       "Shift_L",      "" },
-   { SDLK_RCTRL,        "Control_R",    "" },
-   { SDLK_LCTRL,        "Control_L",    "" },
-   { SDLK_RALT,         "Alt_R",        "" },
-   { SDLK_LALT,         "Alt_L",        "" },
-   { SDLK_RMETA,        "Meta_R",       "" },
-   { SDLK_LMETA,        "Meta_L",       "" },
-   { SDLK_LSUPER,       "Super_L",      "" },   /* Left "Windows" key */
-   { SDLK_RSUPER,       "Super_R",      "" },   /* Right "Windows" key */
-   { SDLK_MODE,         "Mode",         "" },   /* "Alt Gr" key */
-   { SDLK_COMPOSE,      "Compose",      "" },   /* Multi-key compose key */
+   { SDLK_NUMLOCK,      "Num_Lock",     "Num_Lock" },
+   { SDLK_CAPSLOCK,     "Caps_Lock",    "Caps_Lock" },
+   { SDLK_SCROLLOCK,    "Scroll_Lock",  "Scroll_Lock" },
+   { SDLK_RSHIFT,       "Shift_R",      "Shift_R" },
+   { SDLK_LSHIFT,       "Shift_L",      "Shift_L" },
+   { SDLK_RCTRL,        "Control_R",    "Control_R" },
+   { SDLK_LCTRL,        "Control_L",    "Control_L" },
+   { SDLK_RALT,         "Alt_R",        "Alt_R" },
+   { SDLK_LALT,         "Alt_L",        "Alt_L" },
+   { SDLK_RMETA,        "Meta_R",       "Meta_R" },
+   { SDLK_LMETA,        "Meta_L",       "Meta_L" },
+   { SDLK_LSUPER,       "Super_L",      "Super_L" },   /* Left "Windows" key */
+   { SDLK_RSUPER,       "Super_R",      "Super_R" },   /* Right "Windows" key */
+   { SDLK_MODE,         "Mode",         "Mode" },   /* "Alt Gr" key */
+   { SDLK_COMPOSE,      "Compose",      "Compose" },   /* Multi-key compose key */
 
    /* Miscellaneous function keys */
-   { SDLK_HELP,         "Help",         "" },
-   { SDLK_PRINT,        "Print",        "" },
-   { SDLK_SYSREQ,       "SysReq",       "" },
-   { SDLK_BREAK,        "Break",        "" },
-   { SDLK_MENU,         "Menu",         "" },
-   { SDLK_POWER,        "Power",        "" },   /* Power Macintosh power key */
-   { SDLK_EURO,         "Euro",         "" },   /* Some european keyboards */
-   { SDLK_UNDO,         "Undo",         "" }    /* Atari keyboard has Undo */
+   { SDLK_HELP,         "Help",         "Help" },
+   { SDLK_PRINT,        "Print",        "Print" },
+   { SDLK_SYSREQ,       "SysReq",       "SysReq" },
+   { SDLK_BREAK,        "Break",        "Break" },
+   { SDLK_MENU,         "Menu",         "Menu" },
+   { SDLK_POWER,        "Power",        "Power" },   /* Power Macintosh power key */
+   { SDLK_EURO,         "Euro",         "\200" },   /* Some european keyboards */
+   { SDLK_UNDO,         "Undo",         "Undo" }    /* Atari keyboard has Undo */
 };
 
 #endif  /* ECORE_SDL_KEYS_H__ */
index 6dd931e..27210bb 100644 (file)
@@ -2,31 +2,28 @@ MAINTAINERCLEANFILES = Makefile.in
 
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_evas \
+-I$(top_srcdir)/src/lib/ecore_input \
 -I$(top_builddir)/src/lib/ecore \
-@SDL_CFLAGS@
-
-if BUILD_ECORE_SDL
+-I$(top_builddir)/src/lib/ecore_evas \
+-I$(top_builddir)/src/lib/ecore_input \
+@EFL_ECORE_SDL_BUILD@ \
+@SDL_CFLAGS@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
 
 lib_LTLIBRARIES = libecore_sdl.la
-include_HEADERS = \
-Ecore_Sdl.h
+includes_HEADERS = Ecore_Sdl.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_sdl_la_SOURCES = \
-ecore_sdl.c \
-Ecore_Sdl_Keys.h
+ecore_sdl.c
 
 libecore_sdl_la_LIBADD = \
 $(top_builddir)/src/lib/ecore/libecore.la \
-@SDL_LIBS@
-
-libecore_sdl_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+@SDL_LIBS@ @EVIL_LIBS@ @EINA_LIBS@
 
-libecore_sdl_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la
+libecore_sdl_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
 
-endif
-
-EXTRA_DIST = \
-Ecore_Sdl.h \
-Ecore_Sdl_Keys.h \
-ecore_sdl.c
+EXTRA_DIST = Ecore_Sdl_Keys.h ecore_sdl_private.h
index 2d9d316..3f28216 100644 (file)
@@ -1,28 +1,58 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <SDL/SDL.h>
 
+#include "Eina.h"
 #include "Ecore_Sdl.h"
-#include "ecore_private.h"
+#include "Ecore_Input.h"
 #include "Ecore.h"
-#include "Ecore_Data.h"
+#include "ecore_sdl_private.h"
+#include "ecore_private.h"
 #include "Ecore_Sdl_Keys.h"
 
-EAPI int ECORE_SDL_EVENT_KEY_DOWN = 0;
-EAPI int ECORE_SDL_EVENT_KEY_UP = 0;
-EAPI int ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN = 0;
-EAPI int ECORE_SDL_EVENT_MOUSE_BUTTON_UP = 0;
-EAPI int ECORE_SDL_EVENT_MOUSE_MOVE = 0;
-EAPI int ECORE_SDL_EVENT_MOUSE_WHEEL = 0;
+#include <eina_rbtree.h>
+
+int _ecore_sdl_log_dom = -1;
+
+typedef struct _Ecore_SDL_Pressed Ecore_SDL_Pressed;
+struct _Ecore_SDL_Pressed
+{
+   EINA_RBTREE;
+
+   SDLKey key;
+};
+
 EAPI int ECORE_SDL_EVENT_GOT_FOCUS = 0;
 EAPI int ECORE_SDL_EVENT_LOST_FOCUS = 0;
 EAPI int ECORE_SDL_EVENT_RESIZE = 0;
 EAPI int ECORE_SDL_EVENT_EXPOSE = 0;
 
 static int _ecore_sdl_init_count = 0;
+static Eina_Rbtree *repeat = NULL;
+
+static Eina_Rbtree_Direction
+_ecore_sdl_pressed_key(const Ecore_SDL_Pressed *left,
+                       const Ecore_SDL_Pressed *right,
+                       __UNUSED__ void *data)
+{
+   return left->key < right->key ? EINA_RBTREE_LEFT : EINA_RBTREE_RIGHT;
+}
+
+static int
+_ecore_sdl_pressed_node(const Ecore_SDL_Pressed *node,
+                        const SDLKey *key,
+                        __UNUSED__ int length,
+                        __UNUSED__ void *data)
+{
+   return node->key - *key;
+}
 
 /**
- * @defgroup Ecore_Sdl_Library_Group Framebuffer Library Functions
+ * @defgroup Ecore_Sdl_Library_Group SDL Library Functions
  *
- * Functions used to set up and shut down the Ecore_Framebuffer functions.
+ * Functions used to set up and shut down the Ecore_Sdl functions.
  */
 
 /**
@@ -35,20 +65,26 @@ static int _ecore_sdl_init_count = 0;
 EAPI int
 ecore_sdl_init(const char *name __UNUSED__)
 {
-       if(!_ecore_sdl_init_count)
-       {
-               ECORE_SDL_EVENT_KEY_DOWN          = ecore_event_type_new();
-               ECORE_SDL_EVENT_KEY_UP            = ecore_event_type_new();
-               ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
-               ECORE_SDL_EVENT_MOUSE_BUTTON_UP   = ecore_event_type_new();
-               ECORE_SDL_EVENT_MOUSE_MOVE        = ecore_event_type_new();
-               ECORE_SDL_EVENT_MOUSE_WHEEL       = ecore_event_type_new();
-                ECORE_SDL_EVENT_GOT_FOCUS         = ecore_event_type_new();
-                ECORE_SDL_EVENT_LOST_FOCUS        = ecore_event_type_new();
-                ECORE_SDL_EVENT_RESIZE            = ecore_event_type_new();
-                ECORE_SDL_EVENT_EXPOSE            = ecore_event_type_new();
-       }
-       return ++_ecore_sdl_init_count;
+   if(++_ecore_sdl_init_count != 1)
+     return _ecore_sdl_init_count;
+   _ecore_sdl_log_dom = eina_log_domain_register
+     ("ecore_sdl", ECORE_SDL_DEFAULT_LOG_COLOR);
+   if(_ecore_sdl_log_dom < 0)
+     {
+       EINA_LOG_ERR("Impossible to create a log domain for the Ecore SDL module.");
+       return --_ecore_sdl_init_count;
+     }
+   if (!ecore_event_init())
+     return --_ecore_sdl_init_count;
+
+   ECORE_SDL_EVENT_GOT_FOCUS  = ecore_event_type_new();
+   ECORE_SDL_EVENT_LOST_FOCUS = ecore_event_type_new();
+   ECORE_SDL_EVENT_RESIZE     = ecore_event_type_new();
+   ECORE_SDL_EVENT_EXPOSE     = ecore_event_type_new();
+
+   SDL_EnableKeyRepeat(200, 100);
+
+   return _ecore_sdl_init_count;
 }
 
 /**
@@ -60,8 +96,59 @@ ecore_sdl_init(const char *name __UNUSED__)
 EAPI int
 ecore_sdl_shutdown(void)
 {
-       _ecore_sdl_init_count--;
-       return _ecore_sdl_init_count;
+   if (--_ecore_sdl_init_count != 0)
+     return _ecore_sdl_init_count;
+
+   ecore_event_shutdown();
+   eina_log_domain_unregister(_ecore_sdl_log_dom);
+   _ecore_sdl_log_dom = -1;
+   return _ecore_sdl_init_count;
+}
+
+static unsigned int
+_ecore_sdl_event_modifiers(int mod)
+{
+   unsigned int        modifiers = 0;
+
+   if(mod & KMOD_LSHIFT) modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+   if(mod & KMOD_RSHIFT) modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+   if(mod & KMOD_LCTRL) modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+   if(mod & KMOD_RCTRL) modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+   if(mod & KMOD_LALT) modifiers |= ECORE_EVENT_MODIFIER_ALT;
+   if(mod & KMOD_RALT) modifiers |= ECORE_EVENT_MODIFIER_ALT;
+   if(mod & KMOD_NUM) modifiers |= ECORE_EVENT_LOCK_NUM;
+   if(mod & KMOD_CAPS) modifiers |= ECORE_EVENT_LOCK_CAPS;
+
+   return modifiers;
+}
+
+static Ecore_Event_Key*
+_ecore_sdl_event_key(SDL_Event *event, double time)
+{
+   Ecore_Event_Key *ev;
+   unsigned int i;
+
+   ev = malloc(sizeof(Ecore_Event_Key));
+   if (!ev) return NULL;
+
+   ev->timestamp = time;
+   ev->window = 0;
+   ev->event_window = 0;
+   ev->modifiers = _ecore_sdl_event_modifiers(SDL_GetModState());
+   ev->key = NULL;
+   ev->compose = NULL;
+
+   for (i = 0; i < sizeof(keystable) / sizeof(struct _ecore_sdl_keys_s); ++i)
+     if (keystable[i].code == event->key.keysym.sym)
+       {
+          ev->keyname = keystable[i].name;
+          ev->string = keystable[i].compose;
+
+          return ev;
+       }
+
+   free(ev);
+   return NULL;
 }
 
 EAPI void
@@ -77,14 +164,27 @@ ecore_sdl_feed_events(void)
           {
           case SDL_MOUSEMOTION:
           {
-             Ecore_Sdl_Event_Mouse_Move *ev;
+             Ecore_Event_Mouse_Move *ev;
 
-             ev = malloc(sizeof(Ecore_Sdl_Event_Mouse_Move));
+             ev = malloc(sizeof(Ecore_Event_Mouse_Move));
+             if (!ev) return ;
+
+             ev->timestamp = time;
+             ev->window = 0;
+             ev->event_window = 0;
+             ev->modifiers = 0; /* FIXME: keep modifier around. */
              ev->x = event.motion.x;
              ev->y = event.motion.y;
-             ev->time = time;
+             ev->root.x = ev->x;
+             ev->root.y = ev->y;
+
+             /* Must set multi touch device to 0 or it will get ignored */
+             ev->multi.device = 0;
+             ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
+             ev->multi.pressure = ev->multi.angle = 0;
+             ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
 
-             ecore_event_add(ECORE_SDL_EVENT_MOUSE_MOVE, ev, NULL, NULL);
+             ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
              break;
           }
           case SDL_MOUSEBUTTONDOWN:
@@ -92,46 +192,66 @@ ecore_sdl_feed_events(void)
              if (event.button.button == SDL_BUTTON_WHEELUP ||
                  event.button.button == SDL_BUTTON_WHEELDOWN)
                {
-                  Ecore_Sdl_Event_Mouse_Wheel   *ev;
+                  Ecore_Event_Mouse_Wheel *ev;
+
+                  ev = malloc(sizeof(Ecore_Event_Mouse_Wheel));
+                  if (!ev) return ;
 
-                  ev = malloc(sizeof (Ecore_Sdl_Event_Mouse_Wheel));
-                  ev->x = event.button.x;
-                  ev->y = event.button.y;
+                  ev->timestamp = time;
+                  ev->window = 0;
+                  ev->event_window = 0;
+                  ev->modifiers = 0; /* FIXME: keep modifier around. */
                   ev->direction = 0;
-                  ev->wheel = event.button.button == SDL_BUTTON_WHEELDOWN ? -1 : 1;
-                  ev->time = time;
+                  ev->z = event.button.button == SDL_BUTTON_WHEELDOWN ? -1 : 1;
 
-                  ecore_event_add(ECORE_SDL_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
+                  ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
                }
              else
                {
-                  Ecore_Sdl_Event_Mouse_Button_Down  *ev;
+                  Ecore_Event_Mouse_Button *ev;
 
-                  ev = malloc(sizeof (Ecore_Sdl_Event_Mouse_Button_Down));
-                  ev->x = event.button.x;
-                  ev->y = event.button.y;
-                  ev->button = event.button.button;
+                  ev = malloc(sizeof(Ecore_Event_Mouse_Button));
+                  if (!ev) return ;
+
+                  ev->timestamp = time;
+                  ev->window = 0;
+                  ev->event_window = 0;
+                  ev->modifiers = 0; /* FIXME: keep modifier around. */
+                  ev->buttons = event.button.button;
                   ev->double_click = 0;
                   ev->triple_click = 0;
-                  ev->time = time;
 
-                  ecore_event_add(ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
+                  /* Must set multi touch device to 0 or it will get ignored */
+                  ev->multi.device = 0;
+                  ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
+                  ev->multi.pressure = ev->multi.angle = 0;
+                  ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
+
+                  ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
                }
              break;
           }
           case SDL_MOUSEBUTTONUP:
           {
-             Ecore_Sdl_Event_Mouse_Button_Up  *ev;
+             Ecore_Event_Mouse_Button *ev;
 
-             ev = malloc(sizeof (Ecore_Sdl_Event_Mouse_Button_Up));
-             ev->x = event.button.x;
-             ev->y = event.button.y;
-             ev->button = event.button.button;
+             ev = malloc(sizeof(Ecore_Event_Mouse_Button));
+             if (!ev) return ;
+             ev->timestamp = time;
+             ev->window = 0;
+             ev->event_window = 0;
+             ev->modifiers = 0; /* FIXME: keep modifier around. */
+             ev->buttons = event.button.button;
              ev->double_click = 0;
              ev->triple_click = 0;
-             ev->time = time;
 
-             ecore_event_add(ECORE_SDL_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
+             /* Must set multi touch device to 0 or it will get ignored */
+             ev->multi.device = 0;
+             ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
+             ev->multi.pressure = ev->multi.angle = 0;
+             ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
+
+             ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
              break;
           }
           case SDL_VIDEORESIZE:
@@ -154,44 +274,48 @@ ecore_sdl_feed_events(void)
 
           case SDL_KEYDOWN:
           {
-             Ecore_Sdl_Event_Key_Down   *ev;
-             unsigned int               i;
+             Ecore_SDL_Pressed *entry;
+             Ecore_Event_Key *ev;
+
+             entry = (Ecore_SDL_Pressed*) eina_rbtree_inline_lookup(repeat, &event.key.keysym.sym, sizeof (event.key.keysym.sym),
+                                                                    EINA_RBTREE_CMP_KEY_CB(_ecore_sdl_pressed_node), NULL);
+             if (entry)
+               {
+                  ev = _ecore_sdl_event_key(&event, time);
+                  if (ev) ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
+               }
 
-             ev = malloc(sizeof (Ecore_Sdl_Event_Key_Down));
-             ev->time = time;
+             ev = _ecore_sdl_event_key(&event, time);
+             if (ev) ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
 
-             for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_sdl_keys_s); ++i)
-               if (keystable[i].code == event.key.keysym.sym)
-                 {
-                    ev->keyname = keystable[i].name;
-                    ev->keycompose = keystable[i].compose;
+             if (!entry)
+               {
+                  entry = malloc(sizeof (Ecore_SDL_Pressed));
+                  if (!entry) break;
 
-                    ecore_event_add(ECORE_SDL_EVENT_KEY_DOWN, ev, NULL, NULL);
-                    return ;
-                 }
+                  entry->key = event.key.keysym.sym;
 
-             free(ev);
+                  repeat = eina_rbtree_inline_insert(repeat, EINA_RBTREE_GET(entry),
+                                                     EINA_RBTREE_CMP_NODE_CB(_ecore_sdl_pressed_key), NULL);
+               }
              break;
           }
           case SDL_KEYUP:
           {
-             Ecore_Sdl_Event_Key_Up     *ev;
-             unsigned int               i;
-
-             ev = malloc(sizeof (Ecore_Sdl_Event_Key_Up));
-             ev->time = time;
+             Ecore_Event_Key *ev;
+             Ecore_SDL_Pressed *entry;
 
-             for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_sdl_keys_s); ++i)
-               if (keystable[i].code == event.key.keysym.sym)
-                 {
-                    ev->keyname = keystable[i].name;
-                    ev->keycompose = keystable[i].compose;
-
-                    ecore_event_add(ECORE_SDL_EVENT_KEY_UP, ev, NULL, NULL);
-                    return ;
-                 }
+             entry = (Ecore_SDL_Pressed*) eina_rbtree_inline_lookup(repeat, &event.key.keysym.sym, sizeof (event.key.keysym.sym),
+                                                                    EINA_RBTREE_CMP_KEY_CB(_ecore_sdl_pressed_node), NULL);
+             if (entry)
+               {
+                  repeat = eina_rbtree_inline_remove(repeat, EINA_RBTREE_GET(entry),
+                                                     EINA_RBTREE_CMP_NODE_CB(_ecore_sdl_pressed_key), NULL);
+                  free(entry);
+               }
 
-             free(ev);
+             ev = _ecore_sdl_event_key(&event, time);
+             if (ev) ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
              break;
           }
           case SDL_ACTIVEEVENT:
diff --git a/src/lib/ecore_sdl/ecore_sdl_private.h b/src/lib/ecore_sdl/ecore_sdl_private.h
new file mode 100644 (file)
index 0000000..37e9570
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef _ECORE_SDL_PRIVATE_H
+# define _ECORE_SDL_PRIVATE_H
+
+extern int _ecore_sdl_log_dom;
+
+# ifdef ECORE_SDL_DEFAULT_LOG_COLOR
+#  undef ECORE_SDL_DEFAULT_LOG_COLOR 
+# endif
+# define ECORE_SDL_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+  
+# ifdef ERR
+#  undef ERR
+# endif
+# define ERR(...) EINA_LOG_DOM_ERR(_ecore_sdl_log_dom, __VA_ARGS__)
+  
+# ifdef DBG
+#  undef DBG
+# endif
+# define DBG(...) EINA_LOG_DOM_DBG(_ecore_sdl_log_dom, __VA_ARGS__)
+  
+# ifdef INF
+#  undef INF
+# endif
+# define INF(...) EINA_LOG_DOM_INFO(_ecore_sdl_log_dom, __VA_ARGS__)
+  
+# ifdef WRN
+#  undef WRN
+# endif
+# define WRN(...) EINA_LOG_DOM_WARN(_ecore_sdl_log_dom, __VA_ARGS__)
+  
+# ifdef CRIT
+#  undef CRIT
+# endif
+# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_sdl_log_dom, __VA_ARGS__)
+  
+#endif
diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h b/src/lib/ecore_wayland/Ecore_Wayland.h
new file mode 100644 (file)
index 0000000..8cd0f9d
--- /dev/null
@@ -0,0 +1,391 @@
+#ifndef _ECORE_WAYLAND_H_
+# define _ECORE_WAYLAND_H_
+
+/*
+ * Wayland supoprt is considered experimental as wayland itself is still
+ * unstable and liable to change core protocol. If you use this api, it is
+ * possible it will break in future, until this notice is removed.
+ */
+
+# include <Eina.h>
+# include <wayland-client.h>
+# include <wayland-cursor.h>
+# include <xkbcommon/xkbcommon.h>
+
+# ifdef EAPI
+#  undef EAPI
+# endif
+
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+
+typedef enum _Ecore_Wl_Window_Type Ecore_Wl_Window_Type;
+typedef enum _Ecore_Wl_Window_Buffer_Type Ecore_Wl_Window_Buffer_Type;
+
+typedef struct _Ecore_Wl_Display Ecore_Wl_Display;
+typedef struct _Ecore_Wl_Output Ecore_Wl_Output;
+typedef struct _Ecore_Wl_Input Ecore_Wl_Input;
+# ifndef _ECORE_WAYLAND_WINDOW_PREDEF
+typedef struct _Ecore_Wl_Window Ecore_Wl_Window;
+# endif
+typedef struct _Ecore_Wl_Dnd Ecore_Wl_Dnd; /** @since 1.7 */
+typedef struct _Ecore_Wl_Dnd_Source Ecore_Wl_Dnd_Source;
+typedef struct _Ecore_Wl_Dnd_Target Ecore_Wl_Dnd_Target;
+
+typedef struct _Ecore_Wl_Event_Mouse_In Ecore_Wl_Event_Mouse_In;
+typedef struct _Ecore_Wl_Event_Mouse_Out Ecore_Wl_Event_Mouse_Out;
+typedef struct _Ecore_Wl_Event_Focus_In Ecore_Wl_Event_Focus_In;
+typedef struct _Ecore_Wl_Event_Focus_Out Ecore_Wl_Event_Focus_Out;
+typedef struct _Ecore_Wl_Event_Window_Configure Ecore_Wl_Event_Window_Configure;
+typedef struct _Ecore_Wl_Event_Dnd_Enter Ecore_Wl_Event_Dnd_Enter;
+typedef struct _Ecore_Wl_Event_Dnd_Position Ecore_Wl_Event_Dnd_Position;
+typedef struct _Ecore_Wl_Event_Dnd_Leave Ecore_Wl_Event_Dnd_Leave;
+typedef struct _Ecore_Wl_Event_Dnd_Drop Ecore_Wl_Event_Dnd_Drop;
+typedef struct _Ecore_Wl_Event_Data_Source_Send Ecore_Wl_Event_Data_Source_Send; /** @since 1.7 */
+typedef struct _Ecore_Wl_Event_Selection_Data_Ready Ecore_Wl_Event_Selection_Data_Ready; /** @since 1.7 */
+typedef struct _Ecore_Wl_Event_Interfaces_Bound Ecore_Wl_Event_Interfaces_Bound;
+
+enum _Ecore_Wl_Window_Type
+{
+   ECORE_WL_WINDOW_TYPE_NONE,
+   ECORE_WL_WINDOW_TYPE_TOPLEVEL,
+   ECORE_WL_WINDOW_TYPE_FULLSCREEN,
+   ECORE_WL_WINDOW_TYPE_MAXIMIZED,
+   ECORE_WL_WINDOW_TYPE_TRANSIENT,
+   ECORE_WL_WINDOW_TYPE_MENU,
+   ECORE_WL_WINDOW_TYPE_CUSTOM
+};
+
+enum _Ecore_Wl_Window_Buffer_Type
+{
+   ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW,
+   ECORE_WL_WINDOW_BUFFER_TYPE_EGL_IMAGE,
+   ECORE_WL_WINDOW_BUFFER_TYPE_SHM
+};
+
+struct _Ecore_Wl_Display
+{
+   struct 
+     {
+        struct wl_display *display;
+        struct wl_compositor *compositor;
+        struct wl_shell *shell;
+        struct wl_shell *desktop_shell;
+        struct wl_shm *shm;
+        struct wl_data_device_manager *data_device_manager;
+     } wl;
+
+   int fd;
+   unsigned int mask;
+   unsigned int serial;
+   Ecore_Fd_Handler *fd_hdl;
+
+   struct wl_list inputs;
+   struct wl_list outputs;
+
+   struct
+     {
+        struct xkb_context *context;
+     } xkb;
+
+   struct wl_cursor_theme *cursor_theme;
+
+   Ecore_Wl_Output *output;
+   Ecore_Wl_Input *input;
+
+   void (*output_configure)(Ecore_Wl_Output *output, void *data);
+   void *data;
+};
+
+struct _Ecore_Wl_Output
+{
+   Ecore_Wl_Display *display;
+   struct wl_output *output;
+   Eina_Rectangle allocation;
+   int mw, mh;
+   struct wl_list link;
+
+   void (*destroy) (Ecore_Wl_Output *output, void *data);
+   void *data;
+};
+
+struct _Ecore_Wl_Input
+{
+   Ecore_Wl_Display *display;
+   struct wl_seat *seat;
+   struct wl_pointer *pointer;
+   struct wl_keyboard *keyboard;
+   struct wl_touch *touch;
+
+   const char *cursor_name;
+   struct wl_surface *cursor_surface;
+   struct wl_callback *cursor_frame_cb;
+
+   struct wl_data_device *data_device;
+
+   Ecore_Wl_Window *pointer_focus;
+   Ecore_Wl_Window *keyboard_focus;
+
+   unsigned int button;
+   unsigned int timestamp;
+   unsigned int modifiers;
+   unsigned int pointer_enter_serial;
+   int sx, sy;
+
+   struct wl_list link;
+
+   Ecore_Wl_Window *grab;
+   unsigned int grab_button;
+
+   Ecore_Wl_Dnd_Source *drag_source;
+   Ecore_Wl_Dnd_Source *selection_source;
+   Ecore_Wl_Dnd *dnd; /** @since 1.7 */
+
+   struct
+     {
+        struct xkb_keymap *keymap;
+        struct xkb_state *state;
+        xkb_mod_mask_t control_mask;
+        xkb_mod_mask_t alt_mask;
+        xkb_mod_mask_t shift_mask;
+     } xkb;
+
+   struct 
+     {
+        Ecore_Fd_Handler *hdlr;
+        int timerfd;
+        unsigned int sym, key, time;
+     } repeat;
+};
+
+struct _Ecore_Wl_Window
+{
+   Ecore_Wl_Display *display;
+   Ecore_Wl_Window *parent;
+
+   struct wl_surface *surface;
+   struct wl_shell_surface *shell_surface;
+
+   struct 
+     {
+        struct wl_region *input, *opaque;
+     } region;
+
+   int id;
+   int x, y;
+   int edges;
+
+   Eina_Rectangle allocation, pending_allocation;
+   Eina_Rectangle saved_allocation, server_allocation;
+
+   /* Eina_Bool redraw_scheduled : 1; */
+   /* Eina_Bool resize_scheduled : 1; */
+   Eina_Bool alpha : 1;
+   Eina_Bool transparent : 1;
+   Eina_Bool moving : 1;
+   Eina_Bool resizing : 1;
+
+   Ecore_Wl_Window_Type type;
+   Ecore_Wl_Window_Buffer_Type buffer_type;
+
+   Ecore_Wl_Input *pointer_device;
+   Ecore_Wl_Input *keyboard_device;
+
+   Eina_Bool frame_pending;
+   struct wl_callback *frame_callback;
+   /* FIXME: Ideally we should record the cursor name for this window 
+    * so we can compare and avoid unnecessary cursor set calls to wayland */
+
+   void *data;
+};
+
+struct _Ecore_Wl_Event_Mouse_In
+{
+   int modifiers;
+   int x, y;
+   struct 
+     {
+        int x, y;
+     } root;
+   unsigned int window;
+   unsigned int event_window;
+   unsigned int root_window;
+   unsigned int timestamp;
+};
+
+struct _Ecore_Wl_Event_Mouse_Out
+{
+   int modifiers;
+   int x, y;
+   struct 
+     {
+        int x, y;
+     } root;
+   unsigned int window;
+   unsigned int event_window;
+   unsigned int root_window;
+   unsigned int timestamp;
+};
+
+struct _Ecore_Wl_Event_Focus_In
+{
+   unsigned int win;
+   unsigned int timestamp;
+};
+
+struct _Ecore_Wl_Event_Focus_Out
+{
+   unsigned int win;
+   unsigned int timestamp;
+};
+
+struct _Ecore_Wl_Event_Window_Configure
+{
+   unsigned int win;
+   unsigned int event_win;
+   int x, y, w, h;
+};
+
+struct _Ecore_Wl_Event_Dnd_Enter
+{
+   unsigned int win, source;
+   char **types;
+   int num_types;
+   struct 
+     {
+        int x, y;
+     } position;
+};
+
+struct _Ecore_Wl_Event_Dnd_Position
+{
+   unsigned int win, source;
+   struct 
+     {
+        int x, y;
+     } position;
+};
+
+struct _Ecore_Wl_Event_Dnd_Leave
+{
+   unsigned int win, source;
+};
+
+struct _Ecore_Wl_Event_Dnd_Drop
+{
+   unsigned int win, source;
+   struct 
+     {
+        int x, y;
+     } position;
+};
+
+/** @since 1.7 */
+struct _Ecore_Wl_Event_Data_Source_Send
+{
+   char *type;
+   int fd;
+};
+
+/** @since 1.7 */
+struct _Ecore_Wl_Event_Selection_Data_Ready
+{
+   char *data;
+   int len;
+   Eina_Bool done;
+};
+
+struct _Ecore_Wl_Event_Interfaces_Bound
+{
+   Eina_Bool compositor : 1;
+   Eina_Bool shm : 1;
+   Eina_Bool shell : 1;
+};
+
+/**
+ * @file
+ * @brief Ecore functions for dealing with the Wayland window system
+ * 
+ * Ecore_Wl provides a wrapper and convenience functions for using the 
+ * Wayland window system. Function groups for this part of the library 
+ * include the following:
+ * 
+ * @li @ref Ecore_Wl_Init_Group
+ * @li @ref Ecore_Wl_Display_Group
+ * @li @ref Ecore_Wl_Flush_Group
+ * @li @ref Ecore_Wl_Window_Group
+ */
+
+EAPI extern int ECORE_WL_EVENT_MOUSE_IN;
+EAPI extern int ECORE_WL_EVENT_MOUSE_OUT;
+EAPI extern int ECORE_WL_EVENT_FOCUS_IN;
+EAPI extern int ECORE_WL_EVENT_FOCUS_OUT;
+EAPI extern int ECORE_WL_EVENT_WINDOW_CONFIGURE;
+EAPI extern int ECORE_WL_EVENT_DND_ENTER;
+EAPI extern int ECORE_WL_EVENT_DND_POSITION;
+EAPI extern int ECORE_WL_EVENT_DND_LEAVE;
+EAPI extern int ECORE_WL_EVENT_DND_DROP;
+EAPI extern int ECORE_WL_EVENT_DATA_SOURCE_TARGET; /** @since 1.7 */
+EAPI extern int ECORE_WL_EVENT_DATA_SOURCE_SEND; /** @since 1.7 */
+EAPI extern int ECORE_WL_EVENT_DATA_SOURCE_CANCELLED; /** @since 1.7 */
+EAPI extern int ECORE_WL_EVENT_SELECTION_DATA_READY; /** @since 1.7 */
+EAPI extern int ECORE_WL_EVENT_INTERFACES_BOUND;
+
+EAPI int ecore_wl_init(const char *name);
+EAPI int ecore_wl_shutdown(void);
+EAPI void ecore_wl_flush(void);
+EAPI void ecore_wl_sync(void);
+EAPI struct wl_shm *ecore_wl_shm_get(void);
+EAPI struct wl_display *ecore_wl_display_get(void);
+EAPI void ecore_wl_screen_size_get(int *w, int *h);
+EAPI void ecore_wl_pointer_xy_get(int *x, int *y);
+EAPI int ecore_wl_dpi_get(void);
+EAPI void ecore_wl_display_iterate(void);
+EAPI struct wl_cursor *ecore_wl_cursor_get(const char *cursor_name);
+
+EAPI void ecore_wl_input_grab(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int button);
+EAPI void ecore_wl_input_ungrab(Ecore_Wl_Input *input);
+EAPI void ecore_wl_input_pointer_set(Ecore_Wl_Input *input, struct wl_surface *surface, int hot_x, int hot_y);
+EAPI void ecore_wl_input_cursor_from_name_set(Ecore_Wl_Input *input, const char *cursor_name);
+EAPI void ecore_wl_input_cursor_default_restore(Ecore_Wl_Input *input);
+
+EAPI struct wl_list ecore_wl_outputs_get(void);
+
+EAPI Ecore_Wl_Window *ecore_wl_window_new(Ecore_Wl_Window *parent, int x, int y, int w, int h, int buffer_type);
+EAPI void ecore_wl_window_free(Ecore_Wl_Window *win);
+EAPI void ecore_wl_window_move(Ecore_Wl_Window *win, int x, int y);
+EAPI void ecore_wl_window_resize(Ecore_Wl_Window *win, int w, int h, int location);
+EAPI void ecore_wl_window_damage(Ecore_Wl_Window *win, int x, int y, int w, int h);
+EAPI void ecore_wl_window_buffer_attach(Ecore_Wl_Window *win, struct wl_buffer *buffer, int x, int y);
+EAPI void ecore_wl_window_show(Ecore_Wl_Window *win);
+EAPI void ecore_wl_window_hide(Ecore_Wl_Window *win);
+EAPI void ecore_wl_window_raise(Ecore_Wl_Window *win);
+EAPI void ecore_wl_window_maximized_set(Ecore_Wl_Window *win, Eina_Bool maximized);
+EAPI void ecore_wl_window_fullscreen_set(Ecore_Wl_Window *win, Eina_Bool fullscreen);
+EAPI void ecore_wl_window_transparent_set(Ecore_Wl_Window *win, Eina_Bool transparent);
+EAPI void ecore_wl_window_update_size(Ecore_Wl_Window *win, int w, int h);
+EAPI void ecore_wl_window_update_location(Ecore_Wl_Window *win, int x, int y);
+EAPI struct wl_surface *ecore_wl_window_surface_get(Ecore_Wl_Window *win);
+EAPI struct wl_shell_surface *ecore_wl_window_shell_surface_get(Ecore_Wl_Window *win);
+EAPI Ecore_Wl_Window *ecore_wl_window_find(unsigned int id);
+EAPI void ecore_wl_window_type_set(Ecore_Wl_Window *win, Ecore_Wl_Window_Type type);
+EAPI void ecore_wl_window_pointer_set(Ecore_Wl_Window *win, struct wl_surface *surface, int hot_x, int hot_y);
+EAPI void ecore_wl_window_cursor_from_name_set(Ecore_Wl_Window *win, const char *cursor_name);
+EAPI void ecore_wl_window_cursor_default_restore(Ecore_Wl_Window *win);
+EAPI void ecore_wl_window_parent_set(Ecore_Wl_Window *win, Ecore_Wl_Window *parent);
+
+/** @since 1.7 */
+EAPI Eina_Bool ecore_wl_dnd_set_selection(Ecore_Wl_Dnd *dnd, const char **types_offered);
+EAPI Eina_Bool ecore_wl_dnd_get_selection(Ecore_Wl_Dnd *dnd, const char *type);
+EAPI Ecore_Wl_Dnd *ecore_wl_dnd_get();
+EAPI Eina_Bool ecore_wl_dnd_start_drag();
+EAPI Eina_Bool ecore_wl_dnd_selection_has_owner(Ecore_Wl_Dnd *dnd);
+
+#endif
diff --git a/src/lib/ecore_wayland/Makefile.am b/src/lib/ecore_wayland/Makefile.am
new file mode 100644 (file)
index 0000000..f6b801d
--- /dev/null
@@ -0,0 +1,33 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_input \
+@WAYLAND_CFLAGS@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
+
+lib_LTLIBRARIES = libecore_wayland.la
+includes_HEADERS = Ecore_Wayland.h
+includesdir = $(includedir)/ecore-@VMAJ@
+
+libecore_wayland_la_SOURCES = \
+ecore_wl.c \
+ecore_wl_output.c \
+ecore_wl_input.c \
+ecore_wl_window.c \
+ecore_wl_dnd.c
+
+libecore_wayland_la_LIBADD = \
+$(top_builddir)/src/lib/ecore/libecore.la \
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+@WAYLAND_LIBS@ \
+@EVAS_LIBS@ \
+@EINA_LIBS@
+
+libecore_wayland_la_LDFLAGS = -version-info @version_info@ @release_info@
+libecore_wayland_la_DEPENDENCIES = $(top_builddir)/src/lib/ecore/libecore.la
+
+EXTRA_DIST = ecore_wl_private.h
diff --git a/src/lib/ecore_wayland/ecore_wl.c b/src/lib/ecore_wayland/ecore_wl.c
new file mode 100644 (file)
index 0000000..3bb05e7
--- /dev/null
@@ -0,0 +1,498 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include "ecore_wl_private.h"
+
+/* local function prototypes */
+static Eina_Bool _ecore_wl_shutdown(Eina_Bool close);
+static int _ecore_wl_cb_event_mask_update(unsigned int mask, void *data);
+static Eina_Bool _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl __UNUSED__);
+static void _ecore_wl_cb_handle_global(struct wl_display *disp, unsigned int id, const char *interface, unsigned int version __UNUSED__, void *data);
+static Eina_Bool _ecore_wl_xkb_init(Ecore_Wl_Display *ewd);
+static Eina_Bool _ecore_wl_xkb_shutdown(Ecore_Wl_Display *ewd);
+
+/* local variables */
+static int _ecore_wl_init_count = 0;
+
+/* external variables */
+int _ecore_wl_log_dom = -1;
+Ecore_Wl_Display *_ecore_wl_disp = NULL;
+
+EAPI int ECORE_WL_EVENT_MOUSE_IN = 0;
+EAPI int ECORE_WL_EVENT_MOUSE_OUT = 0;
+EAPI int ECORE_WL_EVENT_FOCUS_IN = 0;
+EAPI int ECORE_WL_EVENT_FOCUS_OUT = 0;
+EAPI int ECORE_WL_EVENT_WINDOW_CONFIGURE = 0;
+EAPI int ECORE_WL_EVENT_DND_ENTER = 0;
+EAPI int ECORE_WL_EVENT_DND_POSITION = 0;
+EAPI int ECORE_WL_EVENT_DND_LEAVE = 0;
+EAPI int ECORE_WL_EVENT_DND_DROP = 0;
+EAPI int ECORE_WL_EVENT_DATA_SOURCE_TARGET = 0;
+EAPI int ECORE_WL_EVENT_DATA_SOURCE_SEND = 0;
+EAPI int ECORE_WL_EVENT_SELECTION_DATA_READY = 0;
+EAPI int ECORE_WL_EVENT_DATA_SOURCE_CANCELLED = 0;
+EAPI int ECORE_WL_EVENT_INTERFACES_BOUND = 0;
+
+/**
+ * @defgroup Ecore_Wl_Init_Group Wayland Library Init and Shutdown Functions
+ * 
+ * Functions that start and shutdown the Ecore Wayland Library.
+ */
+
+/**
+ * Initialize the Wayland display connection to the given display.
+ * 
+ * @param   name Display target name. if @c NULL, the default display is 
+ *          assumed.
+ * @return  The number of times the library has been initialized without being 
+ *          shut down. 0 is returned if an error occurs.
+ * 
+ * @ingroup Ecore_Wl_Init_Group
+ */
+EAPI int 
+ecore_wl_init(const char *name)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (++_ecore_wl_init_count != 1) return _ecore_wl_init_count;
+
+   if (!eina_init()) return --_ecore_wl_init_count;
+
+   _ecore_wl_log_dom = 
+     eina_log_domain_register("ecore_wl", ECORE_WL_DEFAULT_LOG_COLOR);
+   if (_ecore_wl_log_dom < 0)
+     {
+        EINA_LOG_ERR("Cannot create a log domain for Ecore Wayland");
+        eina_shutdown();
+        return --_ecore_wl_init_count;
+     }
+
+   if (!ecore_init())
+     {
+        ERR("Could not initialize ecore");
+        eina_log_domain_unregister(_ecore_wl_log_dom);
+        _ecore_wl_log_dom = -1;
+        eina_shutdown();
+        return --_ecore_wl_init_count;
+     }
+
+   if (!ecore_event_init())
+     {
+        ERR("Could not initialize ecore_event");
+        eina_log_domain_unregister(_ecore_wl_log_dom);
+        _ecore_wl_log_dom = -1;
+        ecore_shutdown();
+        eina_shutdown();
+        return --_ecore_wl_init_count;
+     }
+
+   if (!ECORE_WL_EVENT_MOUSE_IN)
+     {
+        ECORE_WL_EVENT_MOUSE_IN = ecore_event_type_new();
+        ECORE_WL_EVENT_MOUSE_OUT = ecore_event_type_new();
+        ECORE_WL_EVENT_FOCUS_IN = ecore_event_type_new();
+        ECORE_WL_EVENT_FOCUS_OUT = ecore_event_type_new();
+        ECORE_WL_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
+        ECORE_WL_EVENT_DND_ENTER = ecore_event_type_new();
+        ECORE_WL_EVENT_DND_POSITION = ecore_event_type_new();
+        ECORE_WL_EVENT_DND_LEAVE = ecore_event_type_new();
+        ECORE_WL_EVENT_DND_DROP = ecore_event_type_new();
+        ECORE_WL_EVENT_DATA_SOURCE_TARGET = ecore_event_type_new();
+        ECORE_WL_EVENT_DATA_SOURCE_SEND = ecore_event_type_new();
+        ECORE_WL_EVENT_SELECTION_DATA_READY = ecore_event_type_new();
+        ECORE_WL_EVENT_DATA_SOURCE_CANCELLED = ecore_event_type_new();
+        ECORE_WL_EVENT_INTERFACES_BOUND = ecore_event_type_new();
+     }
+
+   if (!(_ecore_wl_disp = malloc(sizeof(Ecore_Wl_Display))))
+     {
+        ERR("Could not allocate memory for Ecore_Wl_Display structure");
+        eina_log_domain_unregister(_ecore_wl_log_dom);
+        _ecore_wl_log_dom = -1;
+        ecore_event_shutdown();
+        ecore_shutdown();
+        eina_shutdown();
+        return --_ecore_wl_init_count;
+     }
+
+   memset(_ecore_wl_disp, 0, sizeof(Ecore_Wl_Display));
+
+   if (!(_ecore_wl_disp->wl.display = wl_display_connect(name)))
+     {
+        ERR("Could not connect to Wayland display");
+        eina_log_domain_unregister(_ecore_wl_log_dom);
+        _ecore_wl_log_dom = -1;
+        ecore_event_shutdown();
+        ecore_shutdown();
+        eina_shutdown();
+        return --_ecore_wl_init_count;
+     }
+
+   _ecore_wl_disp->fd = 
+     wl_display_get_fd(_ecore_wl_disp->wl.display, 
+                       _ecore_wl_cb_event_mask_update, _ecore_wl_disp);
+
+   _ecore_wl_disp->fd_hdl = 
+     ecore_main_fd_handler_add(_ecore_wl_disp->fd, ECORE_FD_READ, 
+                               _ecore_wl_cb_handle_data, _ecore_wl_disp, 
+                               NULL, NULL);
+
+   wl_list_init(&_ecore_wl_disp->inputs);
+   wl_list_init(&_ecore_wl_disp->outputs);
+
+   wl_display_add_global_listener(_ecore_wl_disp->wl.display, 
+                                  _ecore_wl_cb_handle_global, _ecore_wl_disp);
+
+   /* Init egl */
+
+   /* FIXME: Process connection events ?? */
+   /* wl_display_iterate(_ecore_wl_disp->wl.display, WL_DISPLAY_READABLE); */
+
+   /* TODO: create pointer surfaces */
+
+   if (!_ecore_wl_xkb_init(_ecore_wl_disp))
+     {
+        ERR("Could not initialize XKB");
+        free(_ecore_wl_disp);
+        eina_log_domain_unregister(_ecore_wl_log_dom);
+        _ecore_wl_log_dom = -1;
+        ecore_event_shutdown();
+        ecore_shutdown();
+        eina_shutdown();
+        return --_ecore_wl_init_count;
+     }
+
+   _ecore_wl_window_init();
+
+   return _ecore_wl_init_count;
+}
+
+/**
+ * Shuts down the Ecore Wayland Library
+ * 
+ * In shutting down the library, the Wayland display connection is terminated 
+ * and any event handlers for it are removed.
+ * 
+ * @return  The number of times the library has been initialized without 
+ *          being shut down.
+ * 
+ * @ingroup Ecore_Wl_Init_Group
+ */
+EAPI int 
+ecore_wl_shutdown(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_wl_shutdown(EINA_TRUE);
+}
+
+/**
+ * @defgroup Ecore_Wl_Flush_Group Wayland Synchronization Functions
+ * 
+ * Functions that ensure that all commands which have been issued by the 
+ * Ecore Wayland library have been sent to the server.
+ */
+
+/**
+ * Sends all Wayland commands to the Wayland Display.
+ * 
+ * @ingroup Ecore_Wl_Flush_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_flush(void)
+{
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   while (_ecore_wl_disp->mask & WL_DISPLAY_WRITABLE)
+     wl_display_iterate(_ecore_wl_disp->wl.display, WL_DISPLAY_WRITABLE);
+}
+
+/**
+ * Flushes the command buffer and waits until all requests have been 
+ * processed by the server.
+ * 
+ * @ingroup Ecore_Wl_Flush_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_sync(void)
+{
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   wl_display_sync(_ecore_wl_disp->wl.display);
+}
+
+/**
+ * @defgroup Ecore_Wl_Display_Group Wayland Display Functions
+ * 
+ * Functions that set and retrieve various information about the Wayland Display.
+ */
+
+/**
+ * Retrieves the Wayland Shm Interface used for the current Wayland connection.
+ * 
+ * @return The current wayland shm interface
+ * 
+ * @ingroup Ecore_Wl_Display_Group
+ * @since 1.2
+ */
+EAPI struct wl_shm *
+ecore_wl_shm_get(void)
+{
+   return _ecore_wl_disp->wl.shm;
+}
+
+/**
+ * Retrieves the Wayland Display Interface used for the current Wayland connection.
+ * 
+ * @return The current wayland display interface
+ * 
+ * @ingroup Ecore_Wl_Display_Group
+ * @since 1.2
+ */
+EAPI struct wl_display *
+ecore_wl_display_get(void)
+{
+   return _ecore_wl_disp->wl.display;
+}
+
+/**
+ * Retrieves the size of the current screen.
+ * 
+ * @param w where to return the width. May be NULL. Returns 0 on error.
+ * @param h where to return the height. May be NULL. Returns 0 on error.
+ * 
+ * @ingroup Ecore_Wl_Display_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_screen_size_get(int *w, int *h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (w) *w = 0;
+   if (h) *h = 0;
+
+   if (!_ecore_wl_disp->output) return;
+
+   if (w) *w = _ecore_wl_disp->output->allocation.w;
+   if (h) *h = _ecore_wl_disp->output->allocation.h;
+}
+
+/* @since 1.2 */
+EAPI void 
+ecore_wl_pointer_xy_get(int *x, int *y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_wl_input_pointer_xy_get(x, y);
+}
+
+/**
+ * Return the screen DPI
+ *
+ * This is a simplistic call to get DPI. It does not account for differing
+ * DPI in the x and y axes nor does it account for multihead or xinerama and
+ * xrandr where different parts of the screen may have different DPI etc.
+ *
+ * @return the general screen DPI (dots/pixels per inch).
+ * 
+ * @since 1.2
+ */
+EAPI int 
+ecore_wl_dpi_get(void)
+{
+   int w, mw;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!_ecore_wl_disp->output) return 75;
+
+   mw = _ecore_wl_disp->output->mw;
+   if (mw <= 0) return 75;
+
+   w = _ecore_wl_disp->output->allocation.w;
+   /* FIXME: NB: Hrrrmmm, need to verify this. xorg code is using a different 
+    * formula to calc this */
+   return (((w * 254) / mw) + 5) / 10;
+}
+
+EAPI void 
+ecore_wl_display_iterate(void)
+{
+   wl_display_iterate(_ecore_wl_disp->wl.display, WL_DISPLAY_READABLE);
+}
+
+/**
+ * Retrieves the requested cursor from the cursor theme
+ * 
+ * @param cursor_name The desired cursor name to be looked up in the theme
+ * @return the cursor or NULL if the cursor cannot be found
+ *
+ * @since 1.2
+ */
+EAPI struct wl_cursor *
+ecore_wl_cursor_get(const char *cursor_name)
+{
+   if ((!_ecore_wl_disp) || (!_ecore_wl_disp->cursor_theme)) 
+     return NULL;
+
+   return wl_cursor_theme_get_cursor(_ecore_wl_disp->cursor_theme,
+                                     cursor_name);
+}
+
+/* local functions */
+static Eina_Bool 
+_ecore_wl_shutdown(Eina_Bool close)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (--_ecore_wl_init_count != 0) return _ecore_wl_init_count;
+   if (!_ecore_wl_disp) return _ecore_wl_init_count;
+
+   _ecore_wl_window_shutdown();
+
+   if (_ecore_wl_disp->fd_hdl) 
+     ecore_main_fd_handler_del(_ecore_wl_disp->fd_hdl);
+
+   if (close) 
+     {
+        Ecore_Wl_Output *out, *tout;
+        Ecore_Wl_Input *in, *tin;
+
+        wl_list_for_each_safe(out, tout, &_ecore_wl_disp->outputs, link)
+          _ecore_wl_output_del(out);
+
+        wl_list_for_each_safe(in, tin, &_ecore_wl_disp->inputs, link)
+          _ecore_wl_input_del(in);
+
+        _ecore_wl_xkb_shutdown(_ecore_wl_disp);
+
+        if (_ecore_wl_disp->wl.shell) 
+          wl_shell_destroy(_ecore_wl_disp->wl.shell);
+        if (_ecore_wl_disp->wl.shm) wl_shm_destroy(_ecore_wl_disp->wl.shm);
+        if (_ecore_wl_disp->wl.data_device_manager)
+          wl_data_device_manager_destroy(_ecore_wl_disp->wl.data_device_manager);
+        if (_ecore_wl_disp->wl.compositor)
+          wl_compositor_destroy(_ecore_wl_disp->wl.compositor);
+        if (_ecore_wl_disp->wl.display)
+          {
+             wl_display_flush(_ecore_wl_disp->wl.display);
+             wl_display_disconnect(_ecore_wl_disp->wl.display);
+          }
+        free(_ecore_wl_disp);
+     }
+
+   ecore_event_shutdown();
+   ecore_shutdown();
+
+   eina_log_domain_unregister(_ecore_wl_log_dom);
+   _ecore_wl_log_dom = -1;
+   eina_shutdown();
+
+   return _ecore_wl_init_count;
+}
+
+static int 
+_ecore_wl_cb_event_mask_update(unsigned int mask, void *data)
+{
+   Ecore_Wl_Display *ewd;
+
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ewd = data;
+   ewd->mask = mask;
+   return 0;
+}
+
+static Eina_Bool 
+_ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl __UNUSED__)
+{
+   Ecore_Wl_Display *ewd;
+
+   /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
+
+   if (!(ewd = data)) return ECORE_CALLBACK_RENEW;
+   wl_display_iterate(ewd->wl.display, ewd->mask);
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void 
+_ecore_wl_cb_handle_global(struct wl_display *disp, unsigned int id, const char *interface, unsigned int version __UNUSED__, void *data)
+{
+   Ecore_Wl_Display *ewd;
+
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ewd = data;
+
+   /* TODO: Add listener for wl_display so we can catch fatal errors !! */
+
+   if (!strcmp(interface, "wl_compositor"))
+     ewd->wl.compositor = wl_display_bind(disp, id, &wl_compositor_interface);
+   else if (!strcmp(interface, "wl_output"))
+     _ecore_wl_output_add(ewd, id);
+   else if (!strcmp(interface, "wl_seat"))
+     _ecore_wl_input_add(ewd, id);
+   else if (!strcmp(interface, "wl_shell"))
+     ewd->wl.shell = wl_display_bind(disp, id, &wl_shell_interface);
+   /* else if (!strcmp(interface, "desktop_shell")) */
+   /*   ewd->wl.desktop_shell = wl_display_bind(disp, id, &wl_shell_interface); */
+   else if (!strcmp(interface, "wl_shm"))
+     {
+        ewd->wl.shm = wl_display_bind(disp, id, &wl_shm_interface);
+
+        /* FIXME: We should not hard-code a cursor size here, and we should 
+         * also import the theme name from a config or env variable */
+        ewd->cursor_theme = wl_cursor_theme_load(NULL, 32, ewd->wl.shm);
+     }
+   else if (!strcmp(interface, "wl_data_device_manager"))
+     {
+        ewd->wl.data_device_manager = 
+          wl_display_bind(disp, id, &wl_data_device_manager_interface);
+     }
+
+   if ((ewd->wl.compositor) && (ewd->wl.shm) && (ewd->wl.shell))
+     {
+        Ecore_Wl_Event_Interfaces_Bound *ev;
+
+        if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Interfaces_Bound))))
+          return;
+
+        ev->compositor = (ewd->wl.compositor != NULL);
+        ev->shm = (ewd->wl.shm != NULL);
+        ev->shell = (ewd->wl.shell != NULL);
+
+        ecore_event_add(ECORE_WL_EVENT_INTERFACES_BOUND, ev, NULL, NULL);
+     }
+}
+
+static Eina_Bool 
+_ecore_wl_xkb_init(Ecore_Wl_Display *ewd)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ewd->xkb.context = xkb_context_new(0)))
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool 
+_ecore_wl_xkb_shutdown(Ecore_Wl_Display *ewd)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xkb_context_unref(ewd->xkb.context);
+
+   return EINA_TRUE;
+}
+
+struct wl_data_source *
+_ecore_wl_create_data_source(Ecore_Wl_Display *ewd)
+{
+   return wl_data_device_manager_create_data_source(ewd->wl.data_device_manager);
+}
diff --git a/src/lib/ecore_wayland/ecore_wl_dnd.c b/src/lib/ecore_wayland/ecore_wl_dnd.c
new file mode 100644 (file)
index 0000000..e7c8f86
--- /dev/null
@@ -0,0 +1,485 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <sys/epoll.h>
+#include "ecore_wl_private.h"
+
+struct _dnd_task
+{
+   void *data;
+   Ecore_Fd_Cb cb;
+};
+
+struct _dnd_read_ctx
+{
+   int epoll_fd;
+   struct epoll_event *ep;
+};
+
+/* local function prototypes */
+static void _ecore_wl_dnd_offer(void *data, struct wl_data_offer *wl_data_offer __UNUSED__, const char *type);
+static void _ecore_wl_dnd_cb_enter_free(void *data __UNUSED__, void *event);
+
+static void _ecore_wl_dnd_data_source_target(void *data, struct wl_data_source *source, const char *mime_type);
+static void _ecore_wl_dnd_data_source_send(void *data, struct wl_data_source *source, const char *mime_type, int32_t fd);
+static void _ecore_wl_dnd_data_source_cancelled(void *data, struct wl_data_source *source);
+static void _ecore_wl_dnd_source_receive_data(Ecore_Wl_Dnd_Source *source, const char *type);
+
+/* wayland listeners */
+static const struct wl_data_offer_listener _ecore_wl_data_offer_listener = 
+{
+   _ecore_wl_dnd_offer,
+};
+
+static const struct wl_data_source_listener _ecore_wl_data_source_listener = 
+{
+   _ecore_wl_dnd_data_source_target,
+   _ecore_wl_dnd_data_source_send,
+   _ecore_wl_dnd_data_source_cancelled
+};
+
+extern Ecore_Wl_Dnd *glb_dnd;
+
+EAPI Ecore_Wl_Dnd *
+ecore_wl_dnd_get()
+{
+   return glb_dnd;
+}
+
+EAPI Eina_Bool
+ecore_wl_dnd_start_drag(Ecore_Wl_Dnd *dnd __UNUSED__)
+{
+   //TODO:
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+ecore_wl_dnd_set_selection(Ecore_Wl_Dnd *dnd, const char **types_offered)
+{
+   char **p;
+   const char **type;
+
+   dnd->data_source = _ecore_wl_create_data_source(dnd->ewd);
+
+   /* free old types */
+   if (dnd->types_offered.data)
+     {
+        wl_array_for_each(p, &dnd->types_offered)
+          free(*p);
+        wl_array_release(&dnd->types_offered);
+        wl_array_init(&dnd->types_offered);
+     }
+
+   for (type = types_offered; *type; type++) 
+     {
+        p = wl_array_add(&dnd->types_offered, sizeof(*p));
+        *p = strdup(*type);
+        wl_data_source_offer(dnd->data_source, *p);
+     }
+
+   wl_data_source_add_listener(dnd->data_source, &_ecore_wl_data_source_listener, dnd);
+
+   _ecore_wl_input_set_selection(dnd->input, dnd->data_source);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+ecore_wl_dnd_get_selection(Ecore_Wl_Dnd *dnd, const char *type)
+{
+   char **p;
+   Ecore_Wl_Input *input;
+
+   input = dnd->input;
+
+   if (!input->selection_source) return EINA_FALSE;
+
+   wl_array_for_each(p, &input->selection_source->types)
+     if (strcmp(type, *p) == 0) break;
+
+   if (!*p) return EINA_FALSE;
+
+   _ecore_wl_dnd_source_receive_data(input->selection_source, type);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+ecore_wl_dnd_selection_has_owner(Ecore_Wl_Dnd *dnd)
+{
+   Ecore_Wl_Input *input;
+
+   input = dnd->input;
+   return (input->selection_source != NULL);
+}
+
+/* local functions */
+static void
+_ecore_wl_dnd_data_source_target(void *data __UNUSED__, struct wl_data_source *source __UNUSED__, const char *mime_type __UNUSED__)
+{
+   //TODO:
+}
+
+static void 
+_ecore_wl_dnd_cb_data_source_send_free(void *data __UNUSED__, void *event)
+{
+   Ecore_Wl_Event_Data_Source_Send *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = event)) return;
+
+   free(ev->type);
+   free(ev);
+}
+
+static void
+_ecore_wl_dnd_data_source_send(void *data, struct wl_data_source *source __UNUSED__, const char *mime_type, int32_t fd)
+{
+   Ecore_Wl_Event_Data_Source_Send *event;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!data) return;
+
+   if (!(event = calloc(1, sizeof(Ecore_Wl_Event_Data_Source_Send)))) return;
+
+   event->type = strdup(mime_type);
+   event->fd = fd;
+
+   ecore_event_add(ECORE_WL_EVENT_DATA_SOURCE_SEND, event, _ecore_wl_dnd_cb_data_source_send_free, NULL);
+}
+
+static void
+_ecore_wl_dnd_data_source_cancelled(void *data __UNUSED__, struct wl_data_source *source)
+{
+   wl_data_source_destroy(source);
+}
+
+void 
+_ecore_wl_dnd_add(Ecore_Wl_Input *input, struct wl_data_device *data_device __UNUSED__, struct wl_data_offer *offer)
+{
+   Ecore_Wl_Dnd_Source *source;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(source = malloc(sizeof(Ecore_Wl_Dnd_Source)))) return;
+   wl_array_init(&source->types);
+   source->refcount = 1;
+   source->input = input;
+   source->offer = offer;
+   wl_data_offer_add_listener(source->offer, 
+                              &_ecore_wl_data_offer_listener, source);
+}
+
+void 
+_ecore_wl_dnd_enter(void *data, struct wl_data_device *data_device __UNUSED__, unsigned int timestamp __UNUSED__, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *offer)
+{
+   Ecore_Wl_Event_Dnd_Enter *event;
+   Ecore_Wl_Input *input;
+   Ecore_Wl_Window *win;
+   char **p;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if ((!(input = data)) || (!offer)) return;
+
+   if (!(input->drag_source = wl_data_offer_get_user_data(offer)))
+     return;
+
+   win = wl_surface_get_user_data(surface);
+//   input->pointer_focus = win;
+
+   p = wl_array_add(&input->drag_source->types, sizeof(*p));
+   *p = NULL;
+
+   if (!(event = calloc(1, sizeof(Ecore_Wl_Event_Dnd_Enter)))) return;
+
+   event->win = win->id;
+   if (input->drag_source->input)
+     {
+        if (input->drag_source->input->keyboard_focus)
+          event->source = input->drag_source->input->keyboard_focus->id;
+     }
+
+   event->position.x = wl_fixed_to_int(x);
+   event->position.y = wl_fixed_to_int(y);
+   event->num_types = input->drag_source->types.size;
+   event->types = input->drag_source->types.data;
+
+   ecore_event_add(ECORE_WL_EVENT_DND_ENTER, event, 
+                   _ecore_wl_dnd_cb_enter_free, NULL);
+}
+
+void 
+_ecore_wl_dnd_leave(void *data, struct wl_data_device *data_device __UNUSED__)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+   /* FIXME: NB: This MAY need to raise a wl_event_dnd_leave for the 
+    * source window */
+   _ecore_wl_dnd_del(input->drag_source);
+   input->drag_source = NULL;
+}
+
+void 
+_ecore_wl_dnd_motion(void *data, struct wl_data_device *data_device __UNUSED__, unsigned int timestamp __UNUSED__, wl_fixed_t x, wl_fixed_t y)
+{
+   Ecore_Wl_Event_Dnd_Position *event;
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+
+   input->sx = wl_fixed_to_int(x);
+   input->sy = wl_fixed_to_int(y);
+
+   if (!(event = calloc(1, sizeof(Ecore_Wl_Event_Dnd_Position)))) return;
+
+   if (input->drag_source)
+     {
+        if (input->drag_source->input)
+          {
+             if (input->drag_source->input->pointer_focus)
+               event->win = input->drag_source->input->pointer_focus->id;
+             if (input->drag_source->input->keyboard_focus)
+               event->source = input->drag_source->input->keyboard_focus->id;
+          }
+     }
+
+   event->position.x = input->sx;
+   event->position.y = input->sy;
+
+   ecore_event_add(ECORE_WL_EVENT_DND_POSITION, event, NULL, NULL);
+}
+
+void 
+_ecore_wl_dnd_drop(void *data, struct wl_data_device *data_device __UNUSED__)
+{
+   Ecore_Wl_Event_Dnd_Drop *event;
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+
+   if (!(event = calloc(1, sizeof(Ecore_Wl_Event_Dnd_Drop)))) return;
+
+   if (input->drag_source)
+     {
+        if (input->drag_source->input)
+          {
+             if (input->drag_source->input->pointer_focus)
+               event->win = input->drag_source->input->pointer_focus->id;
+             if (input->drag_source->input->keyboard_focus)
+               event->source = input->drag_source->input->keyboard_focus->id;
+          }
+     }
+
+   event->position.x = input->sx;
+   event->position.y = input->sy;
+
+   ecore_event_add(ECORE_WL_EVENT_DND_DROP, event, NULL, NULL);
+}
+
+void 
+_ecore_wl_dnd_selection(void *data, struct wl_data_device *data_device __UNUSED__, struct wl_data_offer *offer)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+   if (input->selection_source) _ecore_wl_dnd_del(input->selection_source);
+   input->selection_source = NULL;
+   if (offer)
+     {
+        char **p;
+
+        input->selection_source = wl_data_offer_get_user_data(offer);
+        p = wl_array_add(&input->selection_source->types, sizeof(*p));
+        *p = NULL;
+     }
+}
+
+void 
+_ecore_wl_dnd_del(Ecore_Wl_Dnd_Source *source)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!source) return;
+   source->refcount--;
+   if (source->refcount == 0)
+     {
+        char **p;
+
+        wl_data_offer_destroy(source->offer);
+        for (p = source->types.data; *p; p++)
+          free(*p);
+        wl_array_release(&source->types);
+        free(source);
+     }
+}
+
+/* local functions */
+static void 
+_ecore_wl_dnd_offer(void *data, struct wl_data_offer *wl_data_offer __UNUSED__, const char *type)
+{
+   Ecore_Wl_Dnd_Source *source;
+   char **p;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(source = data)) return;
+   p = wl_array_add(&source->types, sizeof(*p));
+   *p = strdup(type);
+}
+
+static void 
+_ecore_wl_dnd_cb_enter_free(void *data __UNUSED__, void *event)
+{
+   Ecore_Wl_Event_Dnd_Enter *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = event)) return;
+   free(ev);
+}
+
+static void 
+_ecore_wl_dnd_cb_selection_data_ready_free(void *data __UNUSED__, void *event)
+{
+   Ecore_Wl_Event_Selection_Data_Ready *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = event)) return;
+
+   free(ev->data);
+   free(ev);
+}
+
+static Eina_Bool 
+_ecore_wl_dnd_read_data(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
+{
+   int len;
+   char buffer[4096];
+   Ecore_Wl_Dnd_Source *source;
+   Ecore_Wl_Event_Selection_Data_Ready *event;
+   Eina_Bool ret;
+
+   source = data;
+
+   len = read(source->fd, buffer, sizeof buffer);
+
+   if (!(event = calloc(1, sizeof(Ecore_Wl_Event_Selection_Data_Ready)))) 
+     return ECORE_CALLBACK_CANCEL;
+
+   if (len <= 0)
+     {
+        close(source->fd);
+        _ecore_wl_dnd_del(source);
+        event->done = EINA_TRUE;
+        event->data = NULL;
+        event->len = 0;
+        ret = ECORE_CALLBACK_CANCEL;
+     }
+   else
+     {
+        event->data = malloc(len + 1);
+        if (!event->data) return ECORE_CALLBACK_CANCEL;
+        strncpy(event->data, buffer, len);
+        event->data[len] = '\0';
+        event->len = len;
+        event->done = EINA_FALSE;
+        ret = ECORE_CALLBACK_RENEW;
+     }
+
+   ecore_event_add(ECORE_WL_EVENT_SELECTION_DATA_READY, event, 
+                   _ecore_wl_dnd_cb_selection_data_ready_free, NULL);
+   return ret;
+}
+
+
+static Eina_Bool
+_ecore_wl_dnd_idler_cb(void *data)
+{
+   struct _dnd_read_ctx *ctx;
+   struct _dnd_task *task;
+   int count, i;
+
+   ctx = data;
+   count = epoll_wait(ctx->epoll_fd, ctx->ep, 1, 0);
+   for (i = 0; i < count; i++)
+     {
+        task = ctx->ep->data.ptr;
+        if (task->cb(task->data, NULL) == ECORE_CALLBACK_CANCEL)
+          {
+             free(ctx->ep);
+             free(task);
+             free(ctx);
+             return ECORE_CALLBACK_CANCEL;
+          }
+     } 
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_ecore_wl_dnd_source_receive_data(Ecore_Wl_Dnd_Source *source, const char *type)
+{
+   int epoll_fd;
+   struct epoll_event *ep = NULL;
+   struct _dnd_task *task = NULL;
+   struct _dnd_read_ctx *read_ctx = NULL;
+   int p[2];
+
+   if (pipe2(p, O_CLOEXEC) == -1)
+     return;
+
+   wl_data_offer_receive(source->offer, type, p[1]);
+   close(p[1]);
+
+   /* Due to http://trac.enlightenment.org/e/ticket/1208,
+    * use epoll and idle handler instead of ecore_main_fd_handler_add() */
+
+   ep = calloc(1, sizeof(struct epoll_event));
+   if (!ep) goto err;
+
+   task = calloc(1, sizeof(struct _dnd_task));
+   if (!task) goto err;
+
+   read_ctx = calloc(1, sizeof(struct _dnd_read_ctx));
+   if (!read_ctx) goto err;
+
+   epoll_fd  = epoll_create1(0);
+   if (epoll_fd < 0) goto err;
+
+   task->data = source;
+   task->cb = _ecore_wl_dnd_read_data;
+   ep->events = EPOLLIN;
+   ep->data.ptr = task;
+
+   if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, p[0], ep) < 0) goto err;
+
+   read_ctx->epoll_fd = epoll_fd;
+   read_ctx->ep = ep;
+
+   if (!ecore_idler_add(_ecore_wl_dnd_idler_cb, read_ctx)) goto err;
+
+   source->refcount++;
+   source->fd = p[0];
+   return;
+
+err:
+   if (ep) free(ep);
+   if (task) free(task);
+   if (read_ctx) free(read_ctx);
+   close(p[0]);
+   return;
+}
diff --git a/src/lib/ecore_wayland/ecore_wl_input.c b/src/lib/ecore_wayland/ecore_wl_input.c
new file mode 100644 (file)
index 0000000..54c77d0
--- /dev/null
@@ -0,0 +1,1207 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/**
+ * NB: Events that receive a 'serial' instead of timestamp
+ * 
+ * input_device_attach (for pointer image)
+ * input_device_button_event (button press/release)
+ * input_device_key_press
+ * input_device_pointer_enter
+ * input_device_pointer_leave
+ * input_device_keyboard_enter
+ * input_device_keyboard_leave
+ * input_device_touch_down
+ * input_device_touch_up
+ * 
+ **/
+
+#include "ecore_wl_private.h"
+#include <sys/mman.h>
+#include <sys/timerfd.h>
+
+/* FIXME: This gives BTN_LEFT/RIGHT/MIDDLE for linux systems ... 
+ *        What about other OSs ?? */
+#ifdef __linux__
+# include <linux/input.h>
+#else
+# define BTN_LEFT 0x110
+# define BTN_RIGHT 0x111
+# define BTN_MIDDLE 0x112
+# define BTN_SIDE 0x113
+# define BTN_EXTRA 0x114
+# define BTN_FORWARD 0x115
+# define BTN_BACK 0x116
+#endif
+
+Ecore_Wl_Dnd *glb_dnd = NULL;
+
+/* local function prototypes */
+static void _ecore_wl_input_seat_handle_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps);
+
+static void _ecore_wl_input_cb_pointer_enter(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int serial, struct wl_surface *surface, wl_fixed_t sx, wl_fixed_t sy);
+static void _ecore_wl_input_cb_pointer_leave(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int serial, struct wl_surface *surface);
+static void _ecore_wl_input_cb_pointer_motion(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int timestamp, wl_fixed_t sx, wl_fixed_t sy);
+static void _ecore_wl_input_cb_pointer_button(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int button, unsigned int state);
+static void _ecore_wl_input_cb_pointer_axis(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int timestamp, unsigned int axis, wl_fixed_t value);
+static void _ecore_wl_input_cb_pointer_frame(void *data, struct wl_callback *callback, unsigned int timestamp __UNUSED__);
+static void _ecore_wl_input_cb_keyboard_keymap(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int format, int fd, unsigned int size);
+static void _ecore_wl_input_cb_keyboard_enter(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface, struct wl_array *keys __UNUSED__);
+static void _ecore_wl_input_cb_keyboard_leave(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface);
+static void _ecore_wl_input_cb_keyboard_key(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int key, unsigned int state);
+static void _ecore_wl_input_cb_keyboard_modifiers(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial __UNUSED__, unsigned int depressed, unsigned int latched, unsigned int locked, unsigned int group);
+static Eina_Bool _ecore_wl_input_cb_keyboard_repeat(void *data, Ecore_Fd_Handler *handler __UNUSED__);
+static void _ecore_wl_input_cb_touch_down(void *data, struct wl_touch *touch __UNUSED__, unsigned int serial, unsigned int timestamp, struct wl_surface *surface __UNUSED__, int id __UNUSED__, wl_fixed_t x, wl_fixed_t y);
+static void _ecore_wl_input_cb_touch_up(void *data, struct wl_touch *touch __UNUSED__, unsigned int serial, unsigned int timestamp, int id __UNUSED__);
+static void _ecore_wl_input_cb_touch_motion(void *data, struct wl_touch *touch __UNUSED__, unsigned int timestamp, int id __UNUSED__, wl_fixed_t x, wl_fixed_t y);
+static void _ecore_wl_input_cb_touch_frame(void *data __UNUSED__, struct wl_touch *touch __UNUSED__);
+static void _ecore_wl_input_cb_touch_cancel(void *data __UNUSED__, struct wl_touch *touch __UNUSED__);
+static void _ecore_wl_input_cb_data_offer(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer);
+static void _ecore_wl_input_cb_data_enter(void *data, struct wl_data_device *data_device, unsigned int timestamp, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *offer);
+static void _ecore_wl_input_cb_data_leave(void *data, struct wl_data_device *data_device);
+static void _ecore_wl_input_cb_data_motion(void *data, struct wl_data_device *data_device, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y);
+static void _ecore_wl_input_cb_data_drop(void *data, struct wl_data_device *data_device);
+static void _ecore_wl_input_cb_data_selection(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer);
+
+static void _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_mouse_in_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_mouse_out_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_focus_in_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_focus_out_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_mouse_wheel_send(Ecore_Wl_Input *input, unsigned int axis, int value, unsigned int timestamp);
+
+/* static int _ecore_wl_input_keysym_to_string(unsigned int symbol, char *buffer, int len); */
+
+/* wayland interfaces */
+static const struct wl_pointer_listener pointer_listener = 
+{
+   _ecore_wl_input_cb_pointer_enter,
+   _ecore_wl_input_cb_pointer_leave,
+   _ecore_wl_input_cb_pointer_motion,
+   _ecore_wl_input_cb_pointer_button,
+   _ecore_wl_input_cb_pointer_axis,
+};
+
+static const struct wl_keyboard_listener keyboard_listener = 
+{
+   _ecore_wl_input_cb_keyboard_keymap,
+   _ecore_wl_input_cb_keyboard_enter,
+   _ecore_wl_input_cb_keyboard_leave,
+   _ecore_wl_input_cb_keyboard_key,
+   _ecore_wl_input_cb_keyboard_modifiers,
+};
+
+static const struct wl_touch_listener touch_listener = 
+{
+   _ecore_wl_input_cb_touch_down,
+   _ecore_wl_input_cb_touch_up,
+   _ecore_wl_input_cb_touch_motion,
+   _ecore_wl_input_cb_touch_frame,
+   _ecore_wl_input_cb_touch_cancel
+};
+
+static const struct wl_seat_listener _ecore_wl_seat_listener = 
+{
+   _ecore_wl_input_seat_handle_capabilities,
+};
+
+static const struct wl_data_device_listener _ecore_wl_data_listener = 
+{
+   _ecore_wl_input_cb_data_offer,
+   _ecore_wl_input_cb_data_enter,
+   _ecore_wl_input_cb_data_leave,
+   _ecore_wl_input_cb_data_motion,
+   _ecore_wl_input_cb_data_drop,
+   _ecore_wl_input_cb_data_selection
+};
+
+static const struct wl_callback_listener _ecore_wl_pointer_surface_listener = 
+{
+   _ecore_wl_input_cb_pointer_frame
+};
+
+/* local variables */
+static int _pointer_x, _pointer_y;
+
+EAPI void 
+ecore_wl_input_grab(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int button)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!input) return;
+   input->grab = win;
+   input->grab_button = button;
+}
+
+EAPI void 
+ecore_wl_input_ungrab(Ecore_Wl_Input *input)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!input) return;
+   input->grab = NULL;
+   input->grab_button = 0;
+}
+
+EAPI void
+ecore_wl_input_pointer_set(Ecore_Wl_Input *input, struct wl_surface *surface, int hot_x, int hot_y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (input)
+     wl_pointer_set_cursor(input->pointer, input->pointer_enter_serial, 
+                           surface, hot_x, hot_y);
+}
+
+EAPI void
+ecore_wl_input_cursor_from_name_set(Ecore_Wl_Input *input, const char *cursor_name)
+{
+   struct wl_cursor_image *cursor_image;
+   struct wl_buffer *buffer;
+   struct wl_cursor *cursor;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!input) return;
+
+   eina_stringshare_replace(&input->cursor_name, cursor_name);
+
+   /* No cursor. Set to default Left Pointer */
+   if (!cursor_name) 
+     eina_stringshare_replace(&input->cursor_name, "left_ptr");
+
+   /* try to get this cursor from the theme */
+   if (!(cursor = ecore_wl_cursor_get(input->cursor_name)))
+     {
+        /* if the theme does not have this cursor, default to left pointer */
+        if (!(cursor = ecore_wl_cursor_get("left_ptr")))
+          return;
+     }
+
+   if ((!cursor->images) || (!cursor->images[0]))
+     {
+        ecore_wl_input_pointer_set(input, NULL, 0, 0);
+        return;
+     }
+
+   cursor_image = cursor->images[0];
+   if ((buffer = wl_cursor_image_get_buffer(cursor_image)))
+     {
+        ecore_wl_input_pointer_set(input, input->cursor_surface, 
+                                   cursor_image->hotspot_x, 
+                                   cursor_image->hotspot_y);
+        wl_surface_attach(input->cursor_surface, buffer, 0, 0);
+        wl_surface_damage(input->cursor_surface, 0, 0, 
+                          cursor_image->width, cursor_image->height);
+
+        if (!input->cursor_frame_cb)
+          _ecore_wl_input_cb_pointer_frame(input, NULL, 0);
+     }
+}
+
+EAPI void
+ecore_wl_input_cursor_default_restore(Ecore_Wl_Input *input)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!input) return;
+
+   /* Restore to default wayland cursor */
+   ecore_wl_input_cursor_from_name_set(input, "left_ptr");
+}
+
+/* local functions */
+void 
+_ecore_wl_input_add(Ecore_Wl_Display *ewd, unsigned int id)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = malloc(sizeof(Ecore_Wl_Input)))) return;
+
+   memset(input, 0, sizeof(Ecore_Wl_Input));
+
+   input->display = ewd;
+   input->pointer_focus = NULL;
+   input->keyboard_focus = NULL;
+
+   input->seat = 
+     wl_display_bind(ewd->wl.display, id, &wl_seat_interface);
+   wl_list_insert(ewd->inputs.prev, &input->link);
+   wl_seat_add_listener(input->seat, 
+                        &_ecore_wl_seat_listener, input);
+   wl_seat_set_user_data(input->seat, input);
+
+   input->data_device = 
+     wl_data_device_manager_get_data_device(ewd->wl.data_device_manager, 
+                                            input->seat);
+   wl_data_device_add_listener(input->data_device, 
+                               &_ecore_wl_data_listener, input);
+   input->cursor_surface = 
+     wl_compositor_create_surface(_ecore_wl_disp->wl.compositor);
+
+   input->repeat.timerfd = 
+     timerfd_create(CLOCK_MONOTONIC, (TFD_CLOEXEC | TFD_NONBLOCK));
+
+   input->repeat.hdlr = 
+     ecore_main_fd_handler_add(input->repeat.timerfd, ECORE_FD_READ, 
+                               _ecore_wl_input_cb_keyboard_repeat, input, 
+                               NULL, NULL);
+
+   ewd->input = input;
+
+   /* create Ecore_Wl_Dnd */
+   if (!glb_dnd)
+     if (!(glb_dnd = calloc(1, sizeof(Ecore_Wl_Dnd)))) return;
+   glb_dnd->ewd = ewd;
+   glb_dnd->input = input;
+   input->dnd = glb_dnd;
+   wl_array_init(&glb_dnd->types_offered);
+}
+
+void 
+_ecore_wl_input_del(Ecore_Wl_Input *input)
+{
+   if (!input) return;
+
+   if (input->cursor_name) eina_stringshare_del(input->cursor_name);
+   input->cursor_name = NULL;
+
+   if (input->keyboard_focus)
+     {
+        Ecore_Wl_Window *win = NULL;
+
+        if ((win = input->keyboard_focus))
+          win->keyboard_device = NULL;
+
+        input->keyboard_focus = NULL;
+     }
+
+   if (input->drag_source) _ecore_wl_dnd_del(input->drag_source);
+   input->drag_source = NULL;
+
+   if (input->selection_source) _ecore_wl_dnd_del(input->selection_source);
+   input->selection_source = NULL;
+
+   if (input->data_device) wl_data_device_destroy(input->data_device);
+
+   if (input->xkb.state)
+     xkb_state_unref(input->xkb.state);
+   if (input->xkb.keymap)
+     xkb_map_unref(input->xkb.keymap);
+
+   if (input->cursor_surface)
+     wl_surface_destroy(input->cursor_surface);
+
+   wl_list_remove(&input->link);
+   if (input->seat) wl_seat_destroy(input->seat);
+
+   if (input->repeat.hdlr) ecore_main_fd_handler_del(input->repeat.hdlr);
+   input->repeat.hdlr = NULL;
+
+   if (input->repeat.timerfd) close(input->repeat.timerfd);
+   input->repeat.timerfd = 0;
+
+   free(input);
+}
+
+void 
+_ecore_wl_input_pointer_xy_get(int *x, int *y)
+{
+   if (x) *x = _pointer_x;
+   if (y) *y = _pointer_y;
+}
+
+static void 
+_ecore_wl_input_seat_handle_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps)
+{
+   Ecore_Wl_Input *input;
+
+   if (!(input = data)) return;
+   if ((caps & WL_SEAT_CAPABILITY_POINTER) && (!input->pointer))
+     {
+        input->pointer = wl_seat_get_pointer(seat);
+        wl_pointer_set_user_data(input->pointer, input);
+        wl_pointer_add_listener(input->pointer, &pointer_listener, input);
+     }
+   else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && (input->pointer))
+     {
+        wl_pointer_destroy(input->pointer);
+        input->pointer = NULL;
+     }
+
+   if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && (!input->keyboard))
+     {
+        input->keyboard = wl_seat_get_keyboard(seat);
+        wl_keyboard_set_user_data(input->keyboard, input);
+        wl_keyboard_add_listener(input->keyboard, &keyboard_listener, input);
+     }
+   else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && (input->keyboard))
+     {
+        wl_keyboard_destroy(input->keyboard);
+        input->keyboard = NULL;
+     }
+
+   if ((caps & WL_SEAT_CAPABILITY_TOUCH) && (!input->touch))
+     {
+        input->touch = wl_seat_get_touch(seat);
+        wl_touch_set_user_data(input->touch, input);
+        wl_touch_add_listener(input->touch, &touch_listener, input);
+     }
+   else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && (input->touch))
+     {
+        wl_touch_destroy(input->touch);
+        input->touch = NULL;
+     }
+}
+
+
+static void 
+_ecore_wl_input_cb_pointer_motion(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int timestamp, wl_fixed_t sx, wl_fixed_t sy)
+{
+   Ecore_Wl_Input *input;
+
+   /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
+
+   if (!(input = data)) return;
+
+   _pointer_x = input->sx = wl_fixed_to_int(sx);
+   _pointer_y = input->sy = wl_fixed_to_int(sy);
+
+   input->timestamp = timestamp;
+
+   if (input->pointer_focus)
+     _ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
+
+   ecore_wl_input_cursor_from_name_set(input, input->cursor_name);
+}
+
+static void 
+_ecore_wl_input_cb_pointer_button(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int button, unsigned int state)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+
+   input->timestamp = timestamp;
+   input->display->serial = serial;
+
+//   _ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
+
+   if (state)
+     {
+        if ((input->pointer_focus) && (!input->grab) && (state))
+          ecore_wl_input_grab(input, input->pointer_focus, button);
+
+        input->button = button;
+        _ecore_wl_input_mouse_down_send(input, input->pointer_focus, 
+                                        timestamp);
+     }
+   else
+     {
+        _ecore_wl_input_mouse_up_send(input, input->pointer_focus, 
+                                      timestamp);
+        input->button = 0;
+
+        if ((input->grab) && (input->grab_button == button) && (!state))
+          ecore_wl_input_ungrab(input);
+     }
+
+//   _ecore_wl_input_mouse_move_send(input, timestamp);
+}
+
+static void 
+_ecore_wl_input_cb_pointer_axis(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int timestamp, unsigned int axis, wl_fixed_t value)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+   _ecore_wl_input_mouse_wheel_send(input, axis, wl_fixed_to_int(value), 
+                                    timestamp);
+}
+
+static void 
+_ecore_wl_input_cb_pointer_frame(void *data, struct wl_callback *callback, unsigned int timestamp __UNUSED__)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+
+   if (callback)
+     {
+        if (callback != input->cursor_frame_cb) return;
+        wl_callback_destroy(callback);
+        input->cursor_frame_cb = NULL;
+     }
+
+   if (!input->cursor_name)
+     {
+        ecore_wl_input_pointer_set(input, NULL, 0, 0);
+        return;
+     }
+
+   if (!input->cursor_frame_cb)
+     {
+        input->cursor_frame_cb = wl_surface_frame(input->cursor_surface);
+        wl_callback_add_listener(input->cursor_frame_cb, 
+                                 &_ecore_wl_pointer_surface_listener, input);
+     }
+}
+
+static void 
+_ecore_wl_input_cb_keyboard_keymap(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int format, int fd, unsigned int size)
+{
+   Ecore_Wl_Input *input;
+   char *map = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data))
+     {
+        close(fd);
+        return;
+     }
+
+   if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1)
+     {
+        close(fd);
+        return;
+     }
+
+   map = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
+   if (map == MAP_FAILED)
+     {
+        close(fd);
+        return;
+     }
+
+   input->xkb.keymap = 
+     xkb_map_new_from_string(input->display->xkb.context, map, 
+                             XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+
+   munmap(map, size);
+   close(fd);
+
+   if (!(input->xkb.keymap)) return;
+   if (!(input->xkb.state = xkb_state_new(input->xkb.keymap)))
+     {
+        xkb_map_unref(input->xkb.keymap);
+        input->xkb.keymap = NULL;
+        return;
+     }
+
+   input->xkb.control_mask = 
+     1 << xkb_map_mod_get_index(input->xkb.keymap, "Control");
+   input->xkb.alt_mask = 
+     1 << xkb_map_mod_get_index(input->xkb.keymap, "Mod1");
+   input->xkb.shift_mask = 
+     1 << xkb_map_mod_get_index(input->xkb.keymap, "Shift");
+}
+
+static void 
+_ecore_wl_input_cb_keyboard_key(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int keycode, unsigned int state)
+{
+   Ecore_Wl_Input *input;
+   Ecore_Wl_Window *win;
+   unsigned int code, num;
+   const xkb_keysym_t *syms;
+   xkb_keysym_t sym = XKB_KEY_NoSymbol;
+   xkb_mod_mask_t mask;
+   char string[32], key[32], keyname[32];// compose[32];
+   Ecore_Event_Key *e;
+   struct itimerspec ts;
+   int len = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+   input->display->serial = serial;
+
+   /* xkb rules reflect X broken keycodes, so offset by 8 */
+   code = keycode + 8;
+
+   win = input->keyboard_focus;
+   if ((!win) || (win->keyboard_device != input) || (!input->xkb.state)) 
+     return;
+
+   mask = xkb_state_serialize_mods(input->xkb.state, 
+                                   XKB_STATE_DEPRESSED | XKB_STATE_LATCHED);
+
+   input->modifiers = 0;
+
+   /* The Ecore_Event_Modifiers don't quite match the X mask bits */
+   if (mask & input->xkb.control_mask)
+     input->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+   if (mask & input->xkb.alt_mask)
+     input->modifiers |= ECORE_EVENT_MODIFIER_ALT;
+   if (mask & input->xkb.shift_mask)
+     input->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+
+   num = xkb_key_get_syms(input->xkb.state, code, &syms);
+   if (num == 1) sym = syms[0];
+
+   memset(key, 0, sizeof(key));
+   xkb_keysym_get_name(sym, key, sizeof(key));
+
+   memset(keyname, 0, sizeof(keyname));
+   xkb_keysym_get_name(sym, keyname, sizeof(keyname));
+   if (keyname[0] == '\0')
+     snprintf(keyname, sizeof(keyname), "Keycode-%i", code);
+
+   memset(string, 0, sizeof(string));
+   if (xkb_keysym_to_utf8(sym, string, 32) <= 0)
+     {
+        /* FIXME: NB: We may need to add more checks here for other 
+         * non-printable characters */
+        if ((sym == XKB_KEY_Tab) || (sym == XKB_KEY_ISO_Left_Tab)) 
+          string[len++] = '\t';
+     }
+
+   /* FIXME: NB: Start hacking on compose key support */
+   /* memset(compose, 0, sizeof(compose)); */
+   /* if (sym == XKB_KEY_Multi_key) */
+   /*   { */
+   /*      if (xkb_keysym_to_utf8(sym, compose, 32) <= 0) */
+   /*        compose[0] = '\0'; */
+   /*   } */
+
+   e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
+              ((string[0] != '\0') ? strlen(string) : 0) + 3);
+   if (!e) return;
+
+   e->keyname = (char *)(e + 1);
+   e->key = e->keyname + strlen(keyname) + 1;
+   e->string = strlen(string) ? e->key + strlen(key) + 1 : NULL;
+   e->compose = e->string;
+
+   strcpy((char *)e->keyname, keyname);
+   strcpy((char *)e->key, key);
+   if (strlen(string)) strcpy((char *)e->string, string);
+
+   e->window = win->id;
+   e->event_window = win->id;
+   e->timestamp = timestamp;
+   e->modifiers = input->modifiers;
+
+   if (state)
+     ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
+   else
+     ecore_event_add(ECORE_EVENT_KEY_UP, e, NULL, NULL);
+
+   if ((!state) && (keycode == input->repeat.key))
+     {
+        input->repeat.sym = 0;
+        input->repeat.key = 0;
+        input->repeat.time = 0;
+
+        ts.it_interval.tv_sec = 0;
+        ts.it_interval.tv_nsec = 0;
+        ts.it_value.tv_sec = 0;
+        ts.it_value.tv_nsec = 0;
+
+        timerfd_settime(input->repeat.timerfd, 0, &ts, NULL);
+     }
+   else if ((state) && 
+            ((!input->repeat.key) || 
+                ((keycode) && (keycode != input->repeat.key))))
+     {
+        input->repeat.sym = sym;
+        input->repeat.key = keycode;
+        input->repeat.time = timestamp;
+
+        /* interval after expires */
+        ts.it_interval.tv_sec = 0;
+        ts.it_interval.tv_nsec = 35 * 1000 * 1000;
+
+        /* initial expiration */
+        ts.it_value.tv_sec = 0;
+        ts.it_value.tv_nsec = 500 * 1000 * 1000;
+
+        timerfd_settime(input->repeat.timerfd, 0, &ts, NULL);
+     }
+}
+
+static void 
+_ecore_wl_input_cb_keyboard_modifiers(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial __UNUSED__, unsigned int depressed, unsigned int latched, unsigned int locked, unsigned int group)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+   xkb_state_update_mask(input->xkb.state, depressed, latched, 
+                         locked, 0, 0, group);
+}
+
+static Eina_Bool 
+_ecore_wl_input_cb_keyboard_repeat(void *data, Ecore_Fd_Handler *handler __UNUSED__)
+{
+   Ecore_Wl_Input *input;
+   Ecore_Wl_Window *win = NULL;
+   unsigned long long int xp;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return ECORE_CALLBACK_RENEW;
+
+   /* Trap for EAGAIN */
+   if (read(input->repeat.timerfd, &xp, sizeof(xp)) != sizeof(xp))
+     return ECORE_CALLBACK_RENEW;
+
+   if ((win = input->keyboard_focus))
+     _ecore_wl_input_cb_keyboard_key(input, NULL, input->display->serial, 
+                                     input->repeat.time, 
+                                     input->repeat.key, EINA_TRUE);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void 
+_ecore_wl_input_cb_pointer_enter(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int serial, struct wl_surface *surface, wl_fixed_t sx, wl_fixed_t sy)
+{
+   Ecore_Wl_Input *input;
+   Ecore_Wl_Window *win = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+   if (!(input = data)) return;
+
+   if (!input->timestamp)
+     {
+        struct timeval tv;
+
+        gettimeofday(&tv, NULL);
+        input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+     }
+
+   input->sx = wl_fixed_to_double(sx);
+   input->sy = wl_fixed_to_double(sy);
+   input->display->serial = serial;
+   input->pointer_enter_serial = serial;
+
+   if (!(win = wl_surface_get_user_data(surface))) return;
+
+   win->pointer_device = input;
+   input->pointer_focus = win;
+
+   /* _ecore_wl_input_mouse_move_send(input, win, input->timestamp); */
+   _ecore_wl_input_mouse_in_send(input, win, input->timestamp);
+
+   /* The cursor on the surface is undefined until we set it */
+   ecore_wl_input_cursor_from_name_set(input, "left_ptr");
+
+   /* NB: This whole 'if' below is a major HACK due to wayland's stupidness 
+    * of not sending a mouse_up (or any notification at all for that matter) 
+    * when a move or resize grab is finished */
+   if (input->grab)
+     {
+        /* NB: This COULD mean a move has finished, or it could mean that 
+         * a 'drag' is being done to a different surface */
+
+        if ((input->grab == win) && (win->moving))
+          {
+             /* NB: 'Fake' a mouse_up for move finished */
+             win->moving = EINA_FALSE;
+             _ecore_wl_input_mouse_up_send(input, win, input->timestamp);
+
+             input->button = 0;
+
+             if ((input->grab) && (input->grab_button == BTN_LEFT))
+               ecore_wl_input_ungrab(input);
+          }
+        else if ((input->grab == win) && (win->resizing))
+          {
+             /* NB: 'Fake' a mouse_up for resize finished */
+             win->resizing = EINA_FALSE;
+             _ecore_wl_input_mouse_up_send(input, win, input->timestamp);
+
+             input->button = 0;
+
+             if ((input->grab) && (input->grab_button == BTN_LEFT))
+               ecore_wl_input_ungrab(input);
+          }
+        /* FIXME: Test d-n-d and potentially add needed case here */
+     }
+}
+
+static void 
+_ecore_wl_input_cb_pointer_leave(void *data, struct wl_pointer *pointer __UNUSED__, unsigned int serial, struct wl_surface *surface)
+{
+   Ecore_Wl_Input *input;
+   Ecore_Wl_Window *win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+   if (!(input = data)) return;
+
+   input->display->serial = serial;
+
+   if (!surface) return;
+   if (!(win = wl_surface_get_user_data(surface))) return;
+
+   win->pointer_device = NULL;
+   input->pointer_focus = NULL;
+
+   /* _ecore_wl_input_mouse_move_send(input, win, input->timestamp); */
+   _ecore_wl_input_mouse_out_send(input, win, input->timestamp);
+
+   if (input->grab)
+     {
+        /* move or resize started */
+
+        /* printf("Pointer Leave WITH a Grab\n"); */
+     }
+}
+
+static void 
+_ecore_wl_input_cb_keyboard_enter(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface, struct wl_array *keys __UNUSED__)
+{
+   Ecore_Wl_Input *input;
+   Ecore_Wl_Window *win = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+   if (!(input = data)) return;
+
+   if (!input->timestamp)
+     {
+        struct timeval tv;
+
+        gettimeofday(&tv, NULL);
+        input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+     }
+
+   input->display->serial = serial;
+
+   if (!(win = wl_surface_get_user_data(surface))) return;
+
+   win->keyboard_device = input;
+   input->keyboard_focus = win;
+
+   _ecore_wl_input_focus_in_send(input, win, input->timestamp);
+}
+
+static void 
+_ecore_wl_input_cb_keyboard_leave(void *data, struct wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface)
+{
+   Ecore_Wl_Input *input;
+   Ecore_Wl_Window *win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+   if (!(input = data)) return;
+
+   if (input->repeat.timerfd)
+     {
+        struct itimerspec ts;
+        
+        ts.it_interval.tv_sec = 0;
+        ts.it_interval.tv_nsec = 0;
+        ts.it_value.tv_sec = 0;
+        ts.it_value.tv_nsec = 0;
+
+        timerfd_settime(input->repeat.timerfd, 0, &ts, NULL);
+     }
+
+   if (!input->timestamp)
+     {
+        struct timeval tv;
+
+        gettimeofday(&tv, NULL);
+        input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+     }
+
+   input->display->serial = serial;
+
+   if (!surface) return;
+   if (!(win = wl_surface_get_user_data(surface))) return;
+
+   win->keyboard_device = NULL;
+   _ecore_wl_input_focus_out_send(input, win, input->timestamp);
+
+   input->keyboard_focus = NULL;
+}
+
+static void 
+_ecore_wl_input_cb_touch_down(void *data, struct wl_touch *touch __UNUSED__, unsigned int serial, unsigned int timestamp, struct wl_surface *surface __UNUSED__, int id __UNUSED__, wl_fixed_t x, wl_fixed_t y)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+   if (!(input = data)) return;
+
+   /* FIXME: NB: Not sure yet if input->timestamp should be set here. 
+    * This needs to be tested with an actual touch device */
+   /* input->timestamp = timestamp; */
+   input->display->serial = serial;
+   input->button = BTN_LEFT;
+   input->sx = wl_fixed_to_int(x);
+   input->sy = wl_fixed_to_int(y);
+   _ecore_wl_input_cb_pointer_enter(data, NULL, serial, surface, x, y);
+   _ecore_wl_input_mouse_down_send(input, input->pointer_focus, timestamp);
+}
+
+static void 
+_ecore_wl_input_cb_touch_up(void *data, struct wl_touch *touch __UNUSED__, unsigned int serial, unsigned int timestamp, int id __UNUSED__)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+
+   /* FIXME: NB: Not sure yet if input->timestamp should be set here. 
+    * This needs to be tested with an actual touch device */
+   /* input->timestamp = timestamp; */
+   input->button = BTN_LEFT;
+   input->display->serial = serial;
+   _ecore_wl_input_mouse_up_send(input, input->pointer_focus, timestamp);
+   input->button = 0;
+}
+
+static void 
+_ecore_wl_input_cb_touch_motion(void *data, struct wl_touch *touch __UNUSED__, unsigned int timestamp, int id __UNUSED__, wl_fixed_t x, wl_fixed_t y)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(input = data)) return;
+
+   /* FIXME: NB: Not sure yet if input->timestamp should be set here. 
+    * This needs to be tested with an actual touch device */
+   /* input->timestamp = timestamp; */
+   input->sx = wl_fixed_to_int(x);
+   input->sy = wl_fixed_to_int(y);
+
+   _ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
+}
+
+static void 
+_ecore_wl_input_cb_touch_frame(void *data __UNUSED__, struct wl_touch *touch __UNUSED__)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+}
+
+static void 
+_ecore_wl_input_cb_touch_cancel(void *data __UNUSED__, struct wl_touch *touch __UNUSED__)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+}
+
+static void 
+_ecore_wl_input_cb_data_offer(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_wl_dnd_add(data, data_device, offer);
+}
+
+static void 
+_ecore_wl_input_cb_data_enter(void *data, struct wl_data_device *data_device, unsigned int timestamp, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *offer)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+
+   _ecore_wl_dnd_enter(data, data_device, timestamp, surface, x, y, offer);
+}
+
+static void 
+_ecore_wl_input_cb_data_leave(void *data, struct wl_data_device *data_device)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_wl_dnd_leave(data, data_device);
+}
+
+static void 
+_ecore_wl_input_cb_data_motion(void *data, struct wl_data_device *data_device, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_wl_dnd_motion(data, data_device, timestamp, x, y);
+}
+
+static void 
+_ecore_wl_input_cb_data_drop(void *data, struct wl_data_device *data_device)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_wl_dnd_drop(data, data_device);
+}
+
+static void 
+_ecore_wl_input_cb_data_selection(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_wl_dnd_selection(data, data_device, offer);
+}
+
+static void 
+_ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
+{
+   Ecore_Event_Mouse_Move *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = malloc(sizeof(Ecore_Event_Mouse_Move)))) return;
+
+   ev->timestamp = timestamp;
+   ev->x = input->sx;
+   ev->y = input->sy;
+   /* ev->root.x = input->sx; */
+   /* ev->root.y = input->sy; */
+   ev->modifiers = input->modifiers;
+   ev->multi.device = 0;
+   ev->multi.radius = 1;
+   ev->multi.radius_x = 1;
+   ev->multi.radius_y = 1;
+   ev->multi.pressure = 1.0;
+   ev->multi.angle = 0.0;
+   ev->multi.x = input->sx;
+   ev->multi.y = input->sy;
+
+   if (win)
+     {
+        ev->window = win->id;
+        ev->event_window = win->id;
+     }
+
+   ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
+}
+
+static void 
+_ecore_wl_input_mouse_in_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
+{
+   Ecore_Wl_Event_Mouse_In *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Mouse_In)))) return;
+
+   ev->x = input->sx;
+   ev->y = input->sy;
+   /* ev->root.x = input->sx; */
+   /* ev->root.y = input->sy; */
+   ev->modifiers = input->modifiers;
+   ev->timestamp = timestamp;
+
+   if (win)
+     {
+        ev->window = win->id;
+        ev->event_window = win->id;
+     }
+
+   ecore_event_add(ECORE_WL_EVENT_MOUSE_IN, ev, NULL, NULL);
+}
+
+static void 
+_ecore_wl_input_mouse_out_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
+{
+   Ecore_Wl_Event_Mouse_Out *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Mouse_Out)))) return;
+
+   ev->x = input->sx;
+   ev->y = input->sy;
+   /* ev->root.x = input->sx; */
+   /* ev->root.y = input->sy; */
+   ev->modifiers = input->modifiers;
+   ev->timestamp = timestamp;
+
+   if (win)
+     {
+        ev->window = win->id;
+        ev->event_window = win->id;
+     }
+
+   ecore_event_add(ECORE_WL_EVENT_MOUSE_OUT, ev, NULL, NULL);
+}
+
+static void 
+_ecore_wl_input_focus_in_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp)
+{
+   Ecore_Wl_Event_Focus_In *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Focus_In)))) return;
+   ev->timestamp = timestamp;
+   if (win) ev->win = win->id;
+   ecore_event_add(ECORE_WL_EVENT_FOCUS_IN, ev, NULL, NULL);
+}
+
+static void 
+_ecore_wl_input_focus_out_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp)
+{
+   Ecore_Wl_Event_Focus_Out *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Focus_Out)))) return;
+   ev->timestamp = timestamp;
+   if (win) ev->win = win->id;
+   ecore_event_add(ECORE_WL_EVENT_FOCUS_OUT, ev, NULL, NULL);
+}
+
+static void 
+_ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
+{
+   Ecore_Event_Mouse_Button *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = malloc(sizeof(Ecore_Event_Mouse_Button)))) return;
+
+   if (input->button == BTN_LEFT)
+     ev->buttons = 1;
+   else if (input->button == BTN_MIDDLE)
+     ev->buttons = 2;
+   else if (input->button == BTN_RIGHT)
+     ev->buttons = 3;
+   else
+     ev->buttons = input->button;
+
+   ev->timestamp = timestamp;
+   ev->x = input->sx;
+   ev->y = input->sy;
+   /* ev->root.x = input->sx; */
+   /* ev->root.y = input->sy; */
+   ev->modifiers = input->modifiers;
+
+   /* FIXME: Need to get these from wayland somehow */
+   ev->double_click = 0;
+   ev->triple_click = 0;
+
+   ev->multi.device = 0;
+   ev->multi.radius = 1;
+   ev->multi.radius_x = 1;
+   ev->multi.radius_y = 1;
+   ev->multi.pressure = 1.0;
+   ev->multi.angle = 0.0;
+   ev->multi.x = input->sx;
+   ev->multi.y = input->sy;
+
+   if (win)
+     {
+        ev->window = win->id;
+        ev->event_window = win->id;
+     }
+
+   ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
+}
+
+static void 
+_ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
+{
+   Ecore_Event_Mouse_Button *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = malloc(sizeof(Ecore_Event_Mouse_Button)))) return;
+
+   if (input->button == BTN_LEFT)
+     ev->buttons = 1;
+   else if (input->button == BTN_MIDDLE)
+     ev->buttons = 2;
+   else if (input->button == BTN_RIGHT)
+     ev->buttons = 3;
+   else
+     ev->buttons = input->button;
+
+   ev->timestamp = timestamp;
+   ev->x = input->sx;
+   ev->y = input->sy;
+   /* ev->root.x = input->sx; */
+   /* ev->root.y = input->sy; */
+   ev->modifiers = input->modifiers;
+
+   /* FIXME: Need to get these from wayland somehow */
+   ev->double_click = 0;
+   ev->triple_click = 0;
+
+   ev->multi.device = 0;
+   ev->multi.radius = 1;
+   ev->multi.radius_x = 1;
+   ev->multi.radius_y = 1;
+   ev->multi.pressure = 1.0;
+   ev->multi.angle = 0.0;
+   ev->multi.x = input->sx;
+   ev->multi.y = input->sy;
+
+   if (win)
+     {
+        ev->window = win->id;
+        ev->event_window = win->id;
+     }
+
+   ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
+}
+
+static void 
+_ecore_wl_input_mouse_wheel_send(Ecore_Wl_Input *input, unsigned int axis, int value, unsigned int timestamp)
+{
+   Ecore_Event_Mouse_Wheel *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = malloc(sizeof(Ecore_Event_Mouse_Wheel)))) return;
+
+   ev->timestamp = timestamp;
+   ev->modifiers = input->modifiers;
+   ev->x = input->sx;
+   ev->y = input->sy;
+   /* ev->root.x = input->sx; */
+   /* ev->root.y = input->sy; */
+
+   if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL)
+     {
+        ev->direction = 0;
+        ev->z = -value;
+     }
+   else if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL)
+     {
+        ev->direction = 1;
+        ev->z = -value;
+     }
+
+   if (input->grab)
+     {
+        ev->window = input->grab->id;
+        ev->event_window = input->grab->id;
+     }
+   else if (input->pointer_focus)
+     {
+        ev->window = input->pointer_focus->id;
+        ev->event_window = input->pointer_focus->id;
+     }
+
+   ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
+}
+
+void
+_ecore_wl_input_set_selection(Ecore_Wl_Input *input, struct wl_data_source *source)
+{
+   wl_data_device_set_selection(input->data_device, source, input->display->serial);
+}
+
diff --git a/src/lib/ecore_wayland/ecore_wl_output.c b/src/lib/ecore_wayland/ecore_wl_output.c
new file mode 100644 (file)
index 0000000..5e6c38d
--- /dev/null
@@ -0,0 +1,85 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "ecore_wl_private.h"
+
+/* local function prototypes */
+static void _ecore_wl_output_cb_geometry(void *data, struct wl_output *wl_output __UNUSED__, int x, int y, int w, int h, int subpixel __UNUSED__, const char *make __UNUSED__, const char *model __UNUSED__, int transform __UNUSED__);
+static void _ecore_wl_output_cb_mode(void *data, struct wl_output *wl_output __UNUSED__, unsigned int flags, int w, int h, int refresh __UNUSED__);
+
+/* wayland listeners */
+static const struct wl_output_listener _ecore_wl_output_listener = 
+{
+   _ecore_wl_output_cb_geometry,
+   _ecore_wl_output_cb_mode
+};
+
+/* @since 1.2 */
+EAPI struct wl_list 
+ecore_wl_outputs_get(void)
+{
+   return _ecore_wl_disp->outputs;
+}
+
+void 
+_ecore_wl_output_add(Ecore_Wl_Display *ewd, unsigned int id)
+{
+   Ecore_Wl_Output *output;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(output = malloc(sizeof(Ecore_Wl_Output)))) return;
+
+   memset(output, 0, sizeof(Ecore_Wl_Output));
+
+   output->display = ewd;
+
+   output->output = wl_display_bind(ewd->wl.display, id, &wl_output_interface);
+   wl_list_insert(ewd->outputs.prev, &output->link);
+   wl_output_add_listener(output->output, &_ecore_wl_output_listener, output);
+}
+
+void 
+_ecore_wl_output_del(Ecore_Wl_Output *output) 
+{
+   if (!output) return;
+   if (output->destroy) (*output->destroy)(output, output->data);
+   if (output->output) wl_output_destroy(output->output);
+   wl_list_remove(&output->link);
+   free(output);
+}
+
+/* local functions */
+static void 
+_ecore_wl_output_cb_geometry(void *data, struct wl_output *wl_output __UNUSED__, int x, int y, int w, int h, int subpixel __UNUSED__, const char *make __UNUSED__, const char *model __UNUSED__, int transform __UNUSED__)
+{
+   Ecore_Wl_Output *output;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   output = data;
+   output->allocation.x = x;
+   output->allocation.y = y;
+   output->mw = w;
+   output->mh = h;
+}
+
+static void 
+_ecore_wl_output_cb_mode(void *data, struct wl_output *wl_output __UNUSED__, unsigned int flags, int w, int h, int refresh __UNUSED__)
+{
+   Ecore_Wl_Output *output;
+   Ecore_Wl_Display *ewd;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   output = data;
+   ewd = output->display;
+   if (flags & WL_OUTPUT_MODE_CURRENT)
+     {
+        output->allocation.w = w;
+        output->allocation.h = h;
+        _ecore_wl_disp->output = output;
+        if (ewd->output_configure) (*ewd->output_configure)(output, ewd->data);
+     }
+}
diff --git a/src/lib/ecore_wayland/ecore_wl_private.h b/src/lib/ecore_wayland/ecore_wl_private.h
new file mode 100644 (file)
index 0000000..7f59ae9
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef _ECORE_WAYLAND_PRIVATE_H
+# define _ECORE_WAYLAND_PRIVATE_H
+
+# include <limits.h>
+# include <unistd.h>
+
+# include "Ecore.h"
+# include "Ecore_Input.h"
+# include "Ecore_Wayland.h"
+
+//# define LOGFNS 1
+
+# ifdef LOGFNS
+#  include <stdio.h>
+#  define LOGFN(fl, ln, fn) printf("-ECORE-WL: %25s: %5i - %s\n", fl, ln, fn);
+# else
+#  define LOGFN(fl, ln, fn)
+# endif
+
+extern int _ecore_wl_log_dom;
+extern Ecore_Wl_Display *_ecore_wl_disp;
+
+# ifdef ECORE_WL_DEFAULT_LOG_COLOR
+#  undef ECORE_WL_DEFAULT_LOG_COLOR
+# endif
+# define ECORE_WL_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+# ifdef ERR
+#  undef ERR
+# endif
+# define ERR(...) EINA_LOG_DOM_ERR(_ecore_wl_log_dom, __VA_ARGS__)
+
+# ifdef DBG
+#  undef DBG
+# endif
+# define DBG(...) EINA_LOG_DOM_DBG(_ecore_wl_log_dom, __VA_ARGS__)
+
+# ifdef INF
+#  undef INF
+# endif
+# define INF(...) EINA_LOG_DOM_INFO(_ecore_wl_log_dom, __VA_ARGS__)
+
+# ifdef WRN
+#  undef WRN
+# endif
+# define WRN(...) EINA_LOG_DOM_WARN(_ecore_wl_log_dom, __VA_ARGS__)
+
+# ifdef CRIT
+#  undef CRIT
+# endif
+# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_wl_log_dom, __VA_ARGS__)
+
+struct _Ecore_Wl_Dnd
+{
+   Ecore_Wl_Display *ewd;
+   Ecore_Wl_Input *input;
+
+   /* As provider */
+   struct wl_data_source *data_source;
+   struct wl_array types_offered;
+
+   /* TODO: dnd specific fields */
+};
+
+struct _Ecore_Wl_Dnd_Source
+{
+   struct wl_data_offer *offer;
+   Ecore_Wl_Input *input;
+   struct wl_array types;
+   int refcount;
+   int fd;
+   int x, y;
+
+   /* TODO: task & data_func */
+   void *data;
+};
+
+struct _Ecore_Wl_Dnd_Target
+{
+   Ecore_Wl_Dnd_Source *source;
+};
+
+void _ecore_wl_window_init(void);
+void _ecore_wl_window_shutdown(void);
+
+void _ecore_wl_output_add(Ecore_Wl_Display *ewd, unsigned int id);
+void _ecore_wl_output_del(Ecore_Wl_Output *output);
+
+void _ecore_wl_input_add(Ecore_Wl_Display *ewd, unsigned int id);
+void _ecore_wl_input_del(Ecore_Wl_Input *input);
+void _ecore_wl_input_pointer_xy_get(int *x, int *y);
+void _ecore_wl_input_set_selection(Ecore_Wl_Input *input, struct wl_data_source *source);
+
+void _ecore_wl_dnd_add(Ecore_Wl_Input *input, struct wl_data_device *data_device, struct wl_data_offer *offer);
+void _ecore_wl_dnd_enter(void *data, struct wl_data_device *data_device __UNUSED__, unsigned int timestamp __UNUSED__, struct wl_surface *surface, int x, int y, struct wl_data_offer *offer);
+void _ecore_wl_dnd_leave(void *data, struct wl_data_device *data_device __UNUSED__);
+void _ecore_wl_dnd_motion(void *data, struct wl_data_device *data_device __UNUSED__, unsigned int timestamp __UNUSED__, int x, int y);
+void _ecore_wl_dnd_drop(void *data, struct wl_data_device *data_device __UNUSED__);
+void _ecore_wl_dnd_selection(void *data, struct wl_data_device *data_device __UNUSED__, struct wl_data_offer *offer);
+void _ecore_wl_dnd_del(Ecore_Wl_Dnd_Source *source);
+
+struct wl_data_source *_ecore_wl_create_data_source(Ecore_Wl_Display *ewd);
+#endif
diff --git a/src/lib/ecore_wayland/ecore_wl_window.c b/src/lib/ecore_wayland/ecore_wl_window.c
new file mode 100644 (file)
index 0000000..76524ac
--- /dev/null
@@ -0,0 +1,703 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "ecore_wl_private.h"
+
+/* local function prototypes */
+static void _ecore_wl_window_cb_ping(void *data __UNUSED__, struct wl_shell_surface *shell_surface, unsigned int serial);
+static void _ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, unsigned int edges, int w, int h);
+static void _ecore_wl_window_cb_popup_done(void *data, struct wl_shell_surface *shell_surface __UNUSED__);
+static void _ecore_wl_window_cb_surface_enter(void *data, struct wl_surface *surface, struct wl_output *output __UNUSED__);
+static void _ecore_wl_window_cb_surface_leave(void *data, struct wl_surface *surface, struct wl_output *output __UNUSED__);
+static void _ecore_wl_window_configure_send(Ecore_Wl_Window *win, int w, int h);
+static char *_ecore_wl_window_id_str_get(unsigned int win_id);
+
+/* local variables */
+static Eina_Hash *_windows = NULL;
+
+/* wayland listeners */
+static const struct wl_surface_listener _ecore_wl_surface_listener = 
+{
+   _ecore_wl_window_cb_surface_enter,
+   _ecore_wl_window_cb_surface_leave
+};
+
+static const struct wl_shell_surface_listener _ecore_wl_shell_surface_listener = 
+{
+   _ecore_wl_window_cb_ping,
+   _ecore_wl_window_cb_configure,
+   _ecore_wl_window_cb_popup_done
+};
+
+/* internal functions */
+void 
+_ecore_wl_window_init(void)
+{
+   if (!_windows) 
+     _windows = eina_hash_string_superfast_new(NULL);
+}
+
+void 
+_ecore_wl_window_shutdown(void)
+{
+   eina_hash_free(_windows);
+   _windows = NULL;
+}
+
+/**
+ * @defgroup Ecore_Wl_Window_Group Wayland Library Init and Shutdown Functions
+ * 
+ * Functions that can be used to create a Wayland window.
+ */
+
+/**
+ * Creates a new window
+ * 
+ * @param parent The parent window to use. If @p parent is @c 0, the root window 
+ *               of the default display is used.
+ * @param x      X Position
+ * @param y      Y position
+ * @param w      Width
+ * @param h      Height
+ * @param buffer_type The type of the buffer to be used to create a new Ecore_Wl_Window.
+ * 
+ * @return The new window
+ * 
+ * @ingroup Ecore_Wl_Window_Group
+ * @since 1.2
+ */
+EAPI Ecore_Wl_Window *
+ecore_wl_window_new(Ecore_Wl_Window *parent, int x, int y, int w, int h, int buffer_type)
+{
+   Ecore_Wl_Window *win;
+   static int _win_id = 1;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(win = malloc(sizeof(Ecore_Wl_Window))))
+     {
+        ERR("Failed to allocate an Ecore Wayland Window");
+        return NULL;
+     }
+
+   memset(win, 0, sizeof(Ecore_Wl_Window));
+
+   win->display = _ecore_wl_disp;
+   win->parent = parent;
+   win->allocation.x = x;
+   win->allocation.y = y;
+   win->allocation.w = w;
+   win->allocation.h = h;
+   win->saved_allocation = win->allocation;
+   win->transparent = EINA_FALSE;
+   /* win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL; */
+   win->type = ECORE_WL_WINDOW_TYPE_NONE;
+   win->buffer_type = buffer_type;
+   win->id = _win_id++;
+
+   eina_hash_add(_windows, _ecore_wl_window_id_str_get(win->id), win);
+   return win;
+}
+
+/**
+ * Deletes the given window
+ * 
+ * @param win The given window
+ * 
+ * @ingroup Ecore_Wl_Window_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_window_free(Ecore_Wl_Window *win)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   eina_hash_del(_windows, _ecore_wl_window_id_str_get(win->id), win);
+
+   wl_list_for_each(input, &_ecore_wl_disp->inputs, link)
+     {
+        if ((input->pointer_focus) && (input->pointer_focus == win))
+          input->pointer_focus = NULL;
+        if ((input->keyboard_focus) && (input->keyboard_focus == win))
+          input->keyboard_focus = NULL;
+     }
+
+   if (win->region.input) wl_region_destroy(win->region.input);
+   win->region.input = NULL;
+   if (win->region.opaque) wl_region_destroy(win->region.opaque);
+   win->region.opaque = NULL;
+   if (win->shell_surface) wl_shell_surface_destroy(win->shell_surface);
+   win->shell_surface = NULL;
+
+   if (win->surface) wl_surface_destroy(win->surface);
+   win->surface = NULL;
+
+   /* HMMM, why was this disabled ? */
+   free(win);
+}
+
+/**
+ * Signals for Wayland to initiate a window move.
+ * 
+ * The position requested (@p x, @p y) is not honored by Wayland because 
+ * Wayland does not allow specific window placement to be set.
+ * 
+ * @param win The window to move.
+ * @param x   X Position
+ * @param y   Y Position
+ * 
+ * @ingroup Ecore_Wl_Window_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_window_move(Ecore_Wl_Window *win, int x, int y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   win->allocation.x = x;
+   win->allocation.y = y;
+
+   if (win->shell_surface)
+     {
+        Ecore_Wl_Input *input;
+
+        if (!(input = win->keyboard_device))
+          {
+             if (win->parent)
+               {
+                  if (!(input = win->parent->keyboard_device))
+                    input = win->parent->pointer_device;
+               }
+          }
+
+        if ((!input) || (!input->seat)) return;
+
+        wl_shell_surface_move(win->shell_surface, input->seat,
+                              input->display->serial);
+     }
+}
+
+/**
+ * Signals for Wayland to initiate a window resize.
+ * 
+ * The size requested (@p w, @p h) is not honored by Wayland because 
+ * Wayland does not allow specific window sizes to be set.
+ * 
+ * @param win      The window to resize.
+ * @param w        Width
+ * @param h        Height
+ * @param location The edge of the window from where the resize should start.
+ * 
+ * @ingroup Ecore_Wl_Window_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_window_resize(Ecore_Wl_Window *win, int w, int h, int location)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   if (win->type != ECORE_WL_WINDOW_TYPE_FULLSCREEN)
+     {
+        win->allocation.w = w;
+        win->allocation.h = h;
+
+        win->region.input = 
+          wl_compositor_create_region(_ecore_wl_disp->wl.compositor);
+        wl_region_add(win->region.input, win->allocation.x, win->allocation.y, 
+                      win->allocation.w, win->allocation.h);
+     }
+
+   if (!win->transparent)
+     {
+        win->region.opaque = 
+          wl_compositor_create_region(_ecore_wl_disp->wl.compositor);
+        wl_region_add(win->region.opaque, win->allocation.x, win->allocation.y, 
+                      win->allocation.w, win->allocation.h);
+     }
+
+   if (win->shell_surface)
+     {
+        Ecore_Wl_Input *input;
+
+        if (!(input = win->keyboard_device))
+          {
+             if (win->parent)
+               {
+                  if (!(input = win->parent->keyboard_device))
+                    input = win->parent->pointer_device;
+               }
+          }
+
+        if ((!input) || (!input->seat)) return;
+
+        wl_shell_surface_resize(win->shell_surface, input->seat, 
+                                input->display->serial, location);
+     }
+}
+
+EAPI void 
+ecore_wl_window_damage(Ecore_Wl_Window *win, int x, int y, int w, int h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   if (win->surface) 
+     wl_surface_damage(win->surface, x, y, w, h);
+}
+
+EAPI void 
+ecore_wl_window_buffer_attach(Ecore_Wl_Window *win, struct wl_buffer *buffer, int x, int y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   switch (win->buffer_type)
+     {
+      case ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW:
+        win->server_allocation = win->allocation;
+        break;
+      case ECORE_WL_WINDOW_BUFFER_TYPE_EGL_IMAGE:
+      case ECORE_WL_WINDOW_BUFFER_TYPE_SHM:
+        if (win->surface)
+          {
+             if (win->edges & 4) //  resizing from the left
+               x = win->server_allocation.w - win->allocation.w;
+             else
+               x = 0;
+
+             if (win->edges & 1) // resizing from the top
+               y = win->server_allocation.h - win->allocation.h;
+             else
+               y = 0;
+
+             win->edges = 0;
+
+             /* if (buffer) */
+             wl_surface_attach(win->surface, buffer, x, y);
+             wl_surface_damage(win->surface, 0, 0, 
+                               win->allocation.w, win->allocation.h);
+
+             win->server_allocation = win->allocation;
+          }
+        break;
+      default:
+        return;
+     }
+
+   if (win->region.input)
+     {
+        wl_surface_set_input_region(win->surface, win->region.input);
+        wl_region_destroy(win->region.input);
+        win->region.input = NULL;
+     }
+
+   if (win->region.opaque)
+     {
+        wl_surface_set_opaque_region(win->surface, win->region.opaque);
+        wl_region_destroy(win->region.opaque);
+        win->region.opaque = NULL;
+     }
+}
+
+/**
+ * Shows a window
+ * 
+ * Synonymous to "mapping" a window in Wayland System terminology.
+ * 
+ * @param win The window to show.
+ * 
+ * @ingroup Ecore_Wl_Window_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_window_show(Ecore_Wl_Window *win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   if (win->surface) return;
+
+   win->surface = wl_compositor_create_surface(_ecore_wl_disp->wl.compositor);
+   wl_surface_set_user_data(win->surface, win);
+   /* wl_surface_add_listener(win->surface, &_ecore_wl_surface_listener, win); */
+
+   win->shell_surface = 
+     wl_shell_get_shell_surface(_ecore_wl_disp->wl.shell, win->surface);
+   wl_shell_surface_add_listener(win->shell_surface, 
+                                 &_ecore_wl_shell_surface_listener, win);
+
+   switch (win->type)
+     {
+      case ECORE_WL_WINDOW_TYPE_FULLSCREEN:
+        wl_shell_surface_set_fullscreen(win->shell_surface, 
+                                        WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
+                                        0, NULL);
+        break;
+      case ECORE_WL_WINDOW_TYPE_MAXIMIZED:
+        wl_shell_surface_set_maximized(win->shell_surface, NULL);
+        break;
+      case ECORE_WL_WINDOW_TYPE_TRANSIENT:
+        wl_shell_surface_set_transient(win->shell_surface, 
+                                       win->parent->surface, 
+                                       win->allocation.x, win->allocation.y, 0);
+        break;
+      case ECORE_WL_WINDOW_TYPE_MENU:
+        wl_shell_surface_set_popup(win->shell_surface, 
+                                   _ecore_wl_disp->input->seat,
+                                   _ecore_wl_disp->serial,
+                                   win->parent->surface, 
+                                   win->allocation.x, win->allocation.y, 0);
+        break;
+      case ECORE_WL_WINDOW_TYPE_NONE:
+        win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
+        /* fallthrough */
+      case ECORE_WL_WINDOW_TYPE_TOPLEVEL:
+        wl_shell_surface_set_toplevel(win->shell_surface);
+        break;
+      default:
+        break;
+     }
+
+   /* if (win->type != ECORE_WL_WINDOW_TYPE_FULLSCREEN) */
+   /*   { */
+   /*      win->region.input =  */
+   /*        wl_compositor_create_region(_ecore_wl_disp->wl.compositor); */
+   /*      wl_region_add(win->region.input, win->allocation.x, win->allocation.y,  */
+   /*                    win->allocation.w, win->allocation.h); */
+   /*   } */
+
+   /* if (!win->transparent) */
+   /*   { */
+   /*      win->region.opaque =  */
+   /*        wl_compositor_create_region(_ecore_wl_disp->wl.compositor); */
+   /*      wl_region_add(win->region.opaque, win->allocation.x, win->allocation.y,  */
+   /*                    win->allocation.w, win->allocation.h); */
+   /*   } */
+}
+
+/**
+ * Hides a window
+ * 
+ * Synonymous to "unmapping" a window in Wayland System terminology.
+ * 
+ * @param win The window to hide.
+ * 
+ * @ingroup Ecore_Wl_Window_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_window_hide(Ecore_Wl_Window *win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   if (win->shell_surface) wl_shell_surface_destroy(win->shell_surface);
+   win->shell_surface = NULL;
+   if (win->surface) wl_surface_destroy(win->surface);
+   win->surface = NULL;
+}
+
+/**
+ * Raises a window
+ * 
+ * @param win The window to raise.
+ * 
+ * @ingroup Ecore_Wl_Window_Group
+ * @since 1.2
+ */
+EAPI void 
+ecore_wl_window_raise(Ecore_Wl_Window *win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   if (win->shell_surface) 
+     wl_shell_surface_set_toplevel(win->shell_surface);
+}
+
+EAPI void 
+ecore_wl_window_maximized_set(Ecore_Wl_Window *win, Eina_Bool maximized)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   if ((win->type == ECORE_WL_WINDOW_TYPE_MAXIMIZED) == maximized) return;
+   if (win->type == ECORE_WL_WINDOW_TYPE_TOPLEVEL)
+     {
+        win->saved_allocation = win->allocation;
+        if (win->shell_surface) 
+          wl_shell_surface_set_maximized(win->shell_surface, NULL);
+        win->type = ECORE_WL_WINDOW_TYPE_MAXIMIZED;
+     }
+   else if (win->type == ECORE_WL_WINDOW_TYPE_MAXIMIZED)
+     {
+        if (win->shell_surface) 
+          wl_shell_surface_set_toplevel(win->shell_surface);
+        win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
+        _ecore_wl_window_configure_send(win, win->saved_allocation.w, 
+                                        win->saved_allocation.h);
+     }
+}
+
+EAPI void 
+ecore_wl_window_fullscreen_set(Ecore_Wl_Window *win, Eina_Bool fullscreen)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   if ((win->type == ECORE_WL_WINDOW_TYPE_FULLSCREEN) == fullscreen) return;
+   if (fullscreen)
+     {
+        win->type = ECORE_WL_WINDOW_TYPE_FULLSCREEN;
+        win->saved_allocation = win->allocation;
+        if (win->shell_surface)
+          wl_shell_surface_set_fullscreen(win->shell_surface, 
+                                          WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
+                                          0, NULL);
+     }
+   else 
+     {
+        if (win->shell_surface)
+          wl_shell_surface_set_toplevel(win->shell_surface);
+        win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
+        _ecore_wl_window_configure_send(win, win->saved_allocation.w, 
+                                        win->saved_allocation.h);
+     }
+}
+
+EAPI void 
+ecore_wl_window_transparent_set(Ecore_Wl_Window *win, Eina_Bool transparent)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   win->transparent = transparent;
+   if (win->region.opaque) wl_region_destroy(win->region.opaque);
+   win->region.opaque = NULL;
+   if (!win->transparent)
+     {
+        win->region.opaque = 
+          wl_compositor_create_region(_ecore_wl_disp->wl.compositor);
+        wl_region_add(win->region.opaque, win->allocation.x, win->allocation.y, 
+                      win->allocation.w, win->allocation.h);
+     }
+}
+
+EAPI void 
+ecore_wl_window_update_size(Ecore_Wl_Window *win, int w, int h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   win->allocation.w = w;
+   win->allocation.h = h;
+}
+
+EAPI void 
+ecore_wl_window_update_location(Ecore_Wl_Window *win, int x, int y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   win->allocation.x = x;
+   win->allocation.y = y;
+}
+
+EAPI struct wl_surface *
+ecore_wl_window_surface_get(Ecore_Wl_Window *win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return NULL;
+   return win->surface;
+}
+
+/* @since 1.2 */
+EAPI struct wl_shell_surface *
+ecore_wl_window_shell_surface_get(Ecore_Wl_Window *win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return NULL;
+   return win->shell_surface;
+}
+
+EAPI Ecore_Wl_Window *
+ecore_wl_window_find(unsigned int id)
+{
+   Ecore_Wl_Window *win = NULL;
+
+   win = eina_hash_find(_windows, _ecore_wl_window_id_str_get(id));
+   return win;
+}
+
+EAPI void 
+ecore_wl_window_type_set(Ecore_Wl_Window *win, Ecore_Wl_Window_Type type)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+   win->type = type;
+}
+
+EAPI void 
+ecore_wl_window_pointer_set(Ecore_Wl_Window *win, struct wl_surface *surface, int hot_x, int hot_y)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   if ((input = win->pointer_device))
+     ecore_wl_input_pointer_set(input, surface, hot_x, hot_y);
+}
+
+EAPI void
+ecore_wl_window_cursor_from_name_set(Ecore_Wl_Window *win, const char *cursor_name)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   if ((input = win->pointer_device))
+     ecore_wl_input_cursor_from_name_set(input, cursor_name);
+}
+
+EAPI void
+ecore_wl_window_cursor_default_restore(Ecore_Wl_Window *win)
+{
+   Ecore_Wl_Input *input;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return;
+
+   if ((input = win->pointer_device))
+     ecore_wl_input_cursor_default_restore(input);
+}
+
+/* @since 1.2 */
+EAPI void 
+ecore_wl_window_parent_set(Ecore_Wl_Window *win, Ecore_Wl_Window *parent)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   win->parent = parent;
+}
+
+/* local functions */
+static void 
+_ecore_wl_window_cb_ping(void *data __UNUSED__, struct wl_shell_surface *shell_surface, unsigned int serial)
+{
+   if (!shell_surface) return;
+   wl_shell_surface_pong(shell_surface, serial);
+}
+
+static void 
+_ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, unsigned int edges, int w, int h)
+{
+   Ecore_Wl_Window *win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(win = data)) return;
+
+   if ((w <= 0) || (h <= 0)) return;
+
+   if ((win->allocation.w != w) || (win->allocation.h != h))
+     {
+        win->edges = edges;
+        if (win->region.input) wl_region_destroy(win->region.input);
+        win->region.input = NULL;
+        if (win->region.opaque) wl_region_destroy(win->region.opaque);
+        win->region.opaque = NULL;
+
+        _ecore_wl_window_configure_send(win, w, h);
+     }
+}
+
+static void 
+_ecore_wl_window_cb_popup_done(void *data, struct wl_shell_surface *shell_surface __UNUSED__)
+{
+   Ecore_Wl_Window *win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!shell_surface) return;
+   if (!(win = data)) return;
+   ecore_wl_input_ungrab(win->pointer_device);
+}
+
+static void 
+_ecore_wl_window_cb_surface_enter(void *data, struct wl_surface *surface, struct wl_output *output __UNUSED__)
+{
+   Ecore_Wl_Window *win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+   if (!(win = data)) return;
+}
+
+static void 
+_ecore_wl_window_cb_surface_leave(void *data, struct wl_surface *surface, struct wl_output *output __UNUSED__)
+{
+   Ecore_Wl_Window *win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!surface) return;
+   if (!(win = data)) return;
+}
+
+static void 
+_ecore_wl_window_configure_send(Ecore_Wl_Window *win, int w, int h)
+{
+   Ecore_Wl_Event_Window_Configure *ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Configure)))) return;
+   ev->win = win->id;
+   ev->event_win = win->id;
+   ev->x = win->allocation.x;
+   ev->y = win->allocation.y;
+   ev->w = w;
+   ev->h = h;
+   ecore_event_add(ECORE_WL_EVENT_WINDOW_CONFIGURE, ev, NULL, NULL);
+}
+
+static char *
+_ecore_wl_window_id_str_get(unsigned int win_id)
+{
+   const char *vals = "qWeRtYuIoP5$&<~";
+   static char id[9];
+   unsigned int val;
+
+   val = win_id;
+   id[0] = vals[(val >> 28) & 0xf];
+   id[1] = vals[(val >> 24) & 0xf];
+   id[2] = vals[(val >> 20) & 0xf];
+   id[3] = vals[(val >> 16) & 0xf];
+   id[4] = vals[(val >> 12) & 0xf];
+   id[5] = vals[(val >> 8) & 0xf];
+   id[6] = vals[(val >> 4) & 0xf];
+   id[7] = vals[(val) & 0xf];
+   id[8] = 0;
+
+   return id;
+}
index 6c9e4a0..ae1bd4e 100644 (file)
@@ -1,10 +1,22 @@
+#ifndef __ECORE_WIN32_H__
+#define __ECORE_WIN32_H__
+
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ * DO NOT USE THIS HEADER. IT IS WORK IN PROGRESS. IT IS NOT FINAL AND
+ * THE API MAY CHANGE.
  */
 
-#ifndef __ECORE_WIN32_H__
-#define __ECORE_WIN32_H__
+#ifndef ECORE_WIN32_WIP_POZEFLKSD
+# ifdef _MSC_VER
+#  pragma message ("You are using a work in progress API. This API is not stable")
+#  pragma message ("and is subject to change. You use this at your own risk.")
+# else
+#  warning "You are using a work in progress API. This API is not stable"
+#  warning "and is subject to change. You use this at your own risk."
+# endif
+#endif
 
+#include <Eina.h>
 
 #ifdef EAPI
 # undef EAPI
 #endif /* ! _WIN32 */
 
 
-typedef void Ecore_Win32_Window;
-typedef void Ecore_Win32_Cursor;
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-/* Window state */
+/**
+ * @defgroup Ecore_Win32_Group Ecore_Win32 library
+ *
+ * @{
+ */
 
+/**
+ * @typedef Ecore_Win32_Window_State
+ * State of a window.
+ */
 typedef enum
 {
-   /* The window is iconified. */
-   ECORE_WIN32_WINDOW_STATE_ICONIFIED,
-   /* The window is a modal dialog box. */
-   ECORE_WIN32_WINDOW_STATE_MODAL,
-   /* The window manager should keep the window's position fixed
-    * even if the virtual desktop scrolls. */
-   ECORE_WIN32_WINDOW_STATE_STICKY,
-   /* The window has the maximum vertical size. */
-   ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT,
-   /* The window has the maximum horizontal size. */
-   ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ,
-   /* The window has the maximum horizontal and vertical size. */
-   ECORE_WIN32_WINDOW_STATE_MAXIMIZED,
-   /* The window is shaded. */
-   ECORE_WIN32_WINDOW_STATE_SHADED,
-   /* The window is invisible (i.e. minimized/iconified) */
-   ECORE_WIN32_WINDOW_STATE_HIDDEN,
-   /* The window should fill the entire screen and have no
-    * window border/decorations */
-   ECORE_WIN32_WINDOW_STATE_FULLSCREEN,
-   /* The following are not documented because they are not
-    * intended for use in applications. */
-   ECORE_WIN32_WINDOW_STATE_ABOVE,
-   ECORE_WIN32_WINDOW_STATE_BELOW,
-   /* FIXME: Documentation */
-   ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION,
-   /* Unknown state */
-   ECORE_WIN32_WINDOW_STATE_UNKNOWN
+   ECORE_WIN32_WINDOW_STATE_ICONIFIED, /**< iconified window */
+   ECORE_WIN32_WINDOW_STATE_MODAL, /**< modal dialog box */
+   ECORE_WIN32_WINDOW_STATE_STICKY, /**< sticky window */
+   ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT, /**< maximum vertical sized window */
+   ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ, /**< maximum horizontal sized window */
+   ECORE_WIN32_WINDOW_STATE_MAXIMIZED, /**< maximum sized window */
+   ECORE_WIN32_WINDOW_STATE_SHADED, /**< shaded window */
+   ECORE_WIN32_WINDOW_STATE_HIDDEN, /**< hidden (minimized or iconified) window */
+   ECORE_WIN32_WINDOW_STATE_FULLSCREEN, /**< fullscreen window */
+   ECORE_WIN32_WINDOW_STATE_ABOVE, /**< above window */
+   ECORE_WIN32_WINDOW_STATE_BELOW, /**< below window */
+   ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION, /**< To document */
+   ECORE_WIN32_WINDOW_STATE_UNKNOWN /**< Unknown state */
 } Ecore_Win32_Window_State;
 
-/* Window type */
-
+/**
+ * @typedef Ecore_Win32_Window_Type
+ * Type of a window.
+ */
 typedef enum
 {
-   /* Desktop feature*/
-   ECORE_WIN32_WINDOW_TYPE_DESKTOP,
-   /* Dock window (should be on top of other windows */
-   ECORE_WIN32_WINDOW_TYPE_DOCK,
-   /* Toolbar window */
-   ECORE_WIN32_WINDOW_TYPE_TOOLBAR,
-   /* Menu window */
-   ECORE_WIN32_WINDOW_TYPE_MENU,
-   /* Small persistent utility window, such as a palette or toolbox */
-   ECORE_WIN32_WINDOW_TYPE_UTILITY,
-   /* Splash screen window displayed as an application is starting up */
-   ECORE_WIN32_WINDOW_TYPE_SPLASH,
-   /* Dialog window */
-   ECORE_WIN32_WINDOW_TYPE_DIALOG,
-   /* Normal top-level window */
-   ECORE_WIN32_WINDOW_TYPE_NORMAL,
-   /* Unknown type */
-   ECORE_WIN32_WINDOW_TYPE_UNKNOWN
+   ECORE_WIN32_WINDOW_TYPE_DESKTOP, /**< Desktop feature */
+   ECORE_WIN32_WINDOW_TYPE_DOCK,    /**< Dock window (should be on top of other windows) */
+   ECORE_WIN32_WINDOW_TYPE_TOOLBAR, /**< Toolbar window */
+   ECORE_WIN32_WINDOW_TYPE_MENU,    /**< Menu window */
+   ECORE_WIN32_WINDOW_TYPE_UTILITY, /**< Small persistent utility window, such as a palette or toolbox */
+   ECORE_WIN32_WINDOW_TYPE_SPLASH,  /**< Splash screen window displayed as an application is starting up */
+   ECORE_WIN32_WINDOW_TYPE_DIALOG,  /**< Dialog window */
+   ECORE_WIN32_WINDOW_TYPE_NORMAL,  /**< Normal top-level window */
+   ECORE_WIN32_WINDOW_TYPE_UNKNOWN  /**< Unknown type */
 } Ecore_Win32_Window_Type;
 
-/*cursor shapes */
-
+/**
+ * @typedef Ecore_Win32_Cursor_Shape
+ * Shape of a cursor.
+ */
 typedef enum
 {
-   ECORE_WIN32_CURSOR_SHAPE_APP_STARTING, /* Standard arrow and small hourglass */
-   ECORE_WIN32_CURSOR_SHAPE_ARROW,        /* Standard arrow */
-   ECORE_WIN32_CURSOR_SHAPE_CROSS,        /* Crosshair */
-   ECORE_WIN32_CURSOR_SHAPE_HAND,         /* Hand */
-   ECORE_WIN32_CURSOR_SHAPE_HELP,         /* Arrow and question mark */
-   ECORE_WIN32_CURSOR_SHAPE_I_BEAM,       /* I-beam */
-   ECORE_WIN32_CURSOR_SHAPE_NO,           /* Slashed circle */
-   ECORE_WIN32_CURSOR_SHAPE_SIZE_ALL,     /* Four-pointed arrow pointing north, south, east, and west */
-   ECORE_WIN32_CURSOR_SHAPE_SIZE_NESW,    /* Double-pointed arrow pointing northeast and southwest */
-   ECORE_WIN32_CURSOR_SHAPE_SIZE_NS,      /* Double-pointed arrow pointing north and south */
-   ECORE_WIN32_CURSOR_SHAPE_SIZE_NWSE,    /* Double-pointed arrow pointing northwest and southeast */
-   ECORE_WIN32_CURSOR_SHAPE_SIZE_WE,      /* Double-pointed arrow pointing west and east */
-   ECORE_WIN32_CURSOR_SHAPE_UP_ARROW,     /* Vertical arrow */
-   ECORE_WIN32_CURSOR_SHAPE_WAIT          /* Hourglass */
+   ECORE_WIN32_CURSOR_SHAPE_APP_STARTING, /**< Standard arrow and small hourglass */
+   ECORE_WIN32_CURSOR_SHAPE_ARROW,        /**< Standard arrow */
+   ECORE_WIN32_CURSOR_SHAPE_CROSS,        /**< Crosshair */
+   ECORE_WIN32_CURSOR_SHAPE_HAND,         /**< Hand */
+   ECORE_WIN32_CURSOR_SHAPE_HELP,         /**< Arrow and question mark */
+   ECORE_WIN32_CURSOR_SHAPE_I_BEAM,       /**< I-beam */
+   ECORE_WIN32_CURSOR_SHAPE_NO,           /**< Slashed circle */
+   ECORE_WIN32_CURSOR_SHAPE_SIZE_ALL,     /**< Four-pointed arrow pointing north, south, east, and west */
+   ECORE_WIN32_CURSOR_SHAPE_SIZE_NESW,    /**< Double-pointed arrow pointing northeast and southwest */
+   ECORE_WIN32_CURSOR_SHAPE_SIZE_NS,      /**< Double-pointed arrow pointing north and south */
+   ECORE_WIN32_CURSOR_SHAPE_SIZE_NWSE,    /**< Double-pointed arrow pointing northwest and southeast */
+   ECORE_WIN32_CURSOR_SHAPE_SIZE_WE,      /**< Double-pointed arrow pointing west and east */
+   ECORE_WIN32_CURSOR_SHAPE_UP_ARROW,     /**< Vertical arrow */
+   ECORE_WIN32_CURSOR_SHAPE_WAIT          /**< Hourglass */
 } Ecore_Win32_Cursor_Shape;
 
-/* Events */
+/**
+ * @typedef Ecore_Win32_DnD_State
+ * State of a DnD operation.
+ */
+typedef enum
+{
+   ECORE_WIN32_DND_EVENT_DRAG_ENTER = 1, /**< Drag enter */
+   ECORE_WIN32_DND_EVENT_DRAG_OVER  = 2, /**< Drag over */
+   ECORE_WIN32_DND_EVENT_DRAG_LEAVE = 3, /**< Drag leave */
+   ECORE_WIN32_DND_EVENT_DROP       = 4  /**< Drop */
+} Ecore_Win32_DnD_State;
+
+/**
+ * @typedef Ecore_Win32_Window
+ * Abstract type for a window.
+ */
+typedef struct _Ecore_Win32_Window Ecore_Win32_Window;
+
+/**
+ * @typedef Ecore_Win32_Cursor
+ * Abstract type for a cursor.
+ */
+typedef void Ecore_Win32_Cursor;
+
 
-typedef struct _Ecore_Win32_Event_Key_Down              Ecore_Win32_Event_Key_Down;
-typedef struct _Ecore_Win32_Event_Key_Up                Ecore_Win32_Event_Key_Up;
-typedef struct _Ecore_Win32_Event_Mouse_Button_Down     Ecore_Win32_Event_Mouse_Button_Down;
-typedef struct _Ecore_Win32_Event_Mouse_Button_Up       Ecore_Win32_Event_Mouse_Button_Up;
-typedef struct _Ecore_Win32_Event_Mouse_Move            Ecore_Win32_Event_Mouse_Move;
+/**
+ * @typedef Ecore_Win32_Event_Mouse_In
+ * Event sent when the mouse enters the window.
+ */
 typedef struct _Ecore_Win32_Event_Mouse_In              Ecore_Win32_Event_Mouse_In;
+
+/**
+ * @typedef Ecore_Win32_Event_Mouse_Out
+ * Event sent when the mouse leaves the window.
+ */
 typedef struct _Ecore_Win32_Event_Mouse_Out             Ecore_Win32_Event_Mouse_Out;
-typedef struct _Ecore_Win32_Event_Mouse_Wheel           Ecore_Win32_Event_Mouse_Wheel;
+
+/**
+ * @typedef Ecore_Win32_Event_Window_Focus_In
+ * Event sent when the window gets the focus.
+ */
 typedef struct _Ecore_Win32_Event_Window_Focus_In       Ecore_Win32_Event_Window_Focus_In;
+
+/**
+ * @typedef Ecore_Win32_Event_Window_Focus_Out
+ * Event sent when the window looses the focus.
+ */
 typedef struct _Ecore_Win32_Event_Window_Focus_Out      Ecore_Win32_Event_Window_Focus_Out;
+
+/**
+ * @typedef Ecore_Win32_Event_Window_Damage
+ * Event sent when the window is damaged.
+ */
 typedef struct _Ecore_Win32_Event_Window_Damage         Ecore_Win32_Event_Window_Damage;
+
+/**
+ * @typedef Ecore_Win32_Event_Window_Create
+ * Event sent when the window is created.
+ */
 typedef struct _Ecore_Win32_Event_Window_Create         Ecore_Win32_Event_Window_Create;
+
+/**
+ * @typedef Ecore_Win32_Event_Window_Destroy
+ * Event sent when the window is destroyed.
+ */
 typedef struct _Ecore_Win32_Event_Window_Destroy        Ecore_Win32_Event_Window_Destroy;
-typedef struct _Ecore_Win32_Event_Window_Hide           Ecore_Win32_Event_Window_Hide;
-typedef struct _Ecore_Win32_Event_Window_Show           Ecore_Win32_Event_Window_Show;
-typedef struct _Ecore_Win32_Event_Window_Configure      Ecore_Win32_Event_Window_Configure;
-typedef struct _Ecore_Win32_Event_Window_Resize         Ecore_Win32_Event_Window_Resize;
-typedef struct _Ecore_Win32_Event_Window_Delete_Request Ecore_Win32_Event_Window_Delete_Request;
 
-struct _Ecore_Win32_Event_Key_Down
-{
-   Ecore_Win32_Window *window;
-   char               *keyname;
-   char               *keysymbol;
-   char               *keycompose;
-   double              time;
-};
+/**
+ * @typedef Ecore_Win32_Event_Window_Hide
+ * Event sent when the window is hidden.
+ */
+typedef struct _Ecore_Win32_Event_Window_Hide           Ecore_Win32_Event_Window_Hide;
 
-struct _Ecore_Win32_Event_Key_Up
-{
-   Ecore_Win32_Window *window;
-   char               *keyname;
-   char               *keysymbol;
-   char               *keycompose;
-   double              time;
-};
+/**
+ * @typedef Ecore_Win32_Event_Window_Show
+ * Event sent when the window is shown.
+ */
+typedef struct _Ecore_Win32_Event_Window_Show           Ecore_Win32_Event_Window_Show;
 
-struct _Ecore_Win32_Event_Mouse_Button_Down
-{
-   Ecore_Win32_Window *window;
-   int                 button;
-   int                 x;
-   int                 y;
-   double              time;
-   unsigned int        double_click : 1;
-   unsigned int        triple_click : 1;
-};
+/**
+ * @typedef Ecore_Win32_Event_Window_Configure
+ * Event sent when the window is configured.
+ */
+typedef struct _Ecore_Win32_Event_Window_Configure      Ecore_Win32_Event_Window_Configure;
 
-struct _Ecore_Win32_Event_Mouse_Button_Up
-{
-   Ecore_Win32_Window *window;
-   int                 button;
-   int                 x;
-   int                 y;
-   double              time;
-   unsigned int        double_click : 1;
-   unsigned int        triple_click : 1;
-};
+/**
+ * @typedef Ecore_Win32_Event_Window_Resize
+ * Event sent when the window is resized.
+ */
+typedef struct _Ecore_Win32_Event_Window_Resize         Ecore_Win32_Event_Window_Resize;
 
-struct _Ecore_Win32_Event_Mouse_Move
-{
-   Ecore_Win32_Window *window;
-   int                 x;
-   int                 y;
-   double              time;
-};
+/**
+ * @typedef Ecore_Win32_Event_Window_Delete_Request
+ * Event sent when the window is deleted.
+ */
+typedef struct _Ecore_Win32_Event_Window_Delete_Request Ecore_Win32_Event_Window_Delete_Request;
 
+/**
+ * @struct _Ecore_Win32_Event_Mouse_In
+ * Event sent when the mouse enters the window.
+ */
 struct _Ecore_Win32_Event_Mouse_In
 {
-   Ecore_Win32_Window *window;
-   int                 x;
-   int                 y;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   int                 x; /**< The x coordinate where the mouse leaved */
+   int                 y; /**< The y coordinate where the mouse entered */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Mouse_Out
+ * Event sent when the mouse leaves the window.
+ */
 struct _Ecore_Win32_Event_Mouse_Out
 {
-   Ecore_Win32_Window *window;
-   int                 x;
-   int                 y;
-   double              time;
-};
-
-struct _Ecore_Win32_Event_Mouse_Wheel
-{
-   Ecore_Win32_Window *window;
-   int                 direction; /* 0 = default up/down wheel FIXME: more wheel types */
-   int                 z; /* ...,-2,-1 = down, 1,2,... = up */
-   int                 modifiers;
-   int                 x;
-   int                 y;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   int                 x; /**< The x coordinate where the mouse leaved */
+   int                 y; /**< The y coordinate where the mouse leaved */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Focus_In
+ * Event sent when the window gets the focus.
+ */
 struct _Ecore_Win32_Event_Window_Focus_In
 {
-   Ecore_Win32_Window *window;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Focus_Out
+ * Event sent when the window looses the focus.
+ */
 struct _Ecore_Win32_Event_Window_Focus_Out
 {
-   Ecore_Win32_Window *window;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Damage
+ * Event sent when the window is damaged.
+ */
 struct _Ecore_Win32_Event_Window_Damage
 {
-   Ecore_Win32_Window *window;
-   int                 x;
-   int                 y;
-   int                 width;
-   int                 height;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   int                 x; /**< The x coordinate of the top left corner of the damaged region */
+   int                 y; /**< The y coordinate of the top left corner of the damaged region */
+   int                 width; /**< The width of the damaged region */
+   int                 height; /**< The time the event occurred */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Create
+ * Event sent when the window is created.
+ */
 struct _Ecore_Win32_Event_Window_Create
 {
-   Ecore_Win32_Window *window;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Destroy
+ * Event sent when the window is destroyed.
+ */
 struct _Ecore_Win32_Event_Window_Destroy
 {
-   Ecore_Win32_Window *window;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Hide
+ * Event sent when the window is hidden.
+ */
 struct _Ecore_Win32_Event_Window_Hide
 {
-   Ecore_Win32_Window *window;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Show
+ * Event sent when the window is shown.
+ */
 struct _Ecore_Win32_Event_Window_Show
 {
-   Ecore_Win32_Window *window;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Configure
+ * Event sent when the window is configured.
+ */
 struct _Ecore_Win32_Event_Window_Configure
 {
-   Ecore_Win32_Window *window;
+   Ecore_Win32_Window *window; /**< The window that received the event */
    Ecore_Win32_Window *abovewin;
-   int                 x;
-   int                 y;
-   int                 width;
-   int                 height;
-   double              time;
+   int                 x; /**< The new x coordinate of the top left corner */
+   int                 y; /**< The new y coordinate of the top left corner */
+   int                 width; /**< The new width */
+   int                 height; /**< The new height */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Resize
+ * Event sent when the window is resized.
+ */
 struct _Ecore_Win32_Event_Window_Resize
 {
-   Ecore_Win32_Window *window;
-   int                 width;
-   int                 height;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   int                 width; /**< The new width */
+   int                 height; /**< The new height */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_Win32_Event_Window_Delete_Request
+ * Event sent when the window is deleted.
+ */
 struct _Ecore_Win32_Event_Window_Delete_Request
 {
-   Ecore_Win32_Window *window;
-   double              time;
+   Ecore_Win32_Window *window; /**< The window that received the event */
+   unsigned long       timestamp; /**< The time the event occurred */
 };
 
-EAPI extern int ECORE_WIN32_EVENT_KEY_DOWN;
-EAPI extern int ECORE_WIN32_EVENT_KEY_UP;
-EAPI extern int ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN;
-EAPI extern int ECORE_WIN32_EVENT_MOUSE_BUTTON_UP;
-EAPI extern int ECORE_WIN32_EVENT_MOUSE_MOVE;
-EAPI extern int ECORE_WIN32_EVENT_MOUSE_IN;
-EAPI extern int ECORE_WIN32_EVENT_MOUSE_OUT;
-EAPI extern int ECORE_WIN32_EVENT_MOUSE_WHEEL;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_DAMAGE;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_CREATE;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_DESTROY;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_HIDE;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_SHOW;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_CONFIGURE;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_RESIZE;
-EAPI extern int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST;
+/**
+ * @typedef Ecore_Win32_Dnd_DropTarget_Callback
+ * Callback type for Drop operations. See ecore_win32_dnd_register_drop_target().
+ */
+typedef int (*Ecore_Win32_Dnd_DropTarget_Callback)(void *window, int event, int pt_x, int pt_y, void *data, int size);
+
+EAPI extern int ECORE_WIN32_EVENT_MOUSE_IN; /**< Ecore_Event for the #Ecore_Win32_Event_Mouse_In event */
+EAPI extern int ECORE_WIN32_EVENT_MOUSE_OUT; /**< Ecore_Event for the #Ecore_Win32_Event_Mouse_Out event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN; /**< Ecore_Event for the #Ecore_Win32_Event_Window_Focus_In event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT; /**< Ecore_Event for the #Ecore_Win32_Event_Window_Focus_Out event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_DAMAGE; /**< Ecore_Event for the Ecore_Win32_Event_Damage event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_CREATE; /**< Ecore_Event for the Ecore_Win32_Event_Create event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_DESTROY; /**< Ecore_Event for the Ecore_Win32_Event_Destroy event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_HIDE; /**< Ecore_Event for the Ecore_Win32_Event_Hide event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_SHOW; /**< Ecore_Event for the Ecore_Win32_Event_Show event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_CONFIGURE; /**< Ecore_Event for the Ecore_Win32_Event_Configure event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_RESIZE; /**< Ecore_Event for the Ecore_Win32_Event_Resize event */
+EAPI extern int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST; /**< Ecore_Event for the #Ecore_Win32_Event_Window_Delete_Request event */
 
 
 /* Core */
 
-EAPI int    ecore_win32_init();
-EAPI int    ecore_win32_shutdown();
-EAPI int    ecore_win32_screen_depth_get();
-EAPI double ecore_win32_current_time_get(void);
-EAPI void   ecore_win32_message_loop_begin (void);
+EAPI int           ecore_win32_init();
+EAPI int           ecore_win32_shutdown();
+EAPI int           ecore_win32_screen_depth_get();
+EAPI void          ecore_win32_double_click_time_set(double t);
+EAPI double        ecore_win32_double_click_time_get(void);
+EAPI unsigned long ecore_win32_current_time_get(void);
 
 /* Window */
 
@@ -322,7 +389,7 @@ EAPI Ecore_Win32_Window *ecore_win32_window_override_new(Ecore_Win32_Window *par
                                                          int                 width,
                                                          int                 height);
 
-EAPI void ecore_win32_window_del(Ecore_Win32_Window *window);
+EAPI void ecore_win32_window_free(Ecore_Win32_Window *window);
 
 EAPI void *ecore_win32_window_hwnd_get(Ecore_Win32_Window *window);
 
@@ -393,16 +460,18 @@ EAPI void ecore_win32_window_lower(Ecore_Win32_Window *window);
 EAPI void ecore_win32_window_title_set(Ecore_Win32_Window *window,
                                        const char         *title);
 
-EAPI void ecore_win32_window_focus_set(Ecore_Win32_Window *window);
+EAPI void ecore_win32_window_focus(Ecore_Win32_Window *window);
+
+EAPI void *ecore_win32_window_focus_get(void);
 
 EAPI void ecore_win32_window_iconified_set(Ecore_Win32_Window *window,
-                                           int                 on);
+                                           Eina_Bool           on);
 
 EAPI void ecore_win32_window_borderless_set(Ecore_Win32_Window *window,
-                                            int                 on);
+                                            Eina_Bool           on);
 
 EAPI void ecore_win32_window_fullscreen_set(Ecore_Win32_Window *window,
-                                            int                 on);
+                                            Eina_Bool           on);
 
 EAPI void ecore_win32_window_cursor_set(Ecore_Win32_Window *window,
                                         Ecore_Win32_Cursor *cursor);
@@ -429,9 +498,29 @@ EAPI Ecore_Win32_Cursor *ecore_win32_cursor_new(const void *pixels_and,
 
 EAPI void                ecore_win32_cursor_free(Ecore_Win32_Cursor *cursor);
 
-EAPI Ecore_Win32_Cursor *ecore_win32_cursor_shape_get(Ecore_Win32_Cursor_Shape shape);
+EAPI Ecore_Win32_Cursor *ecore_win32_cursor_shaped_new(Ecore_Win32_Cursor_Shape shape);
+
+EAPI void                ecore_win32_cursor_size_get(int *width, int *height);
+
+
 
-EAPI int                 ecore_win32_cursor_size_get(void);
+/* Drag and drop */
+EAPI int       ecore_win32_dnd_init();
+EAPI int       ecore_win32_dnd_shutdown();
+EAPI Eina_Bool ecore_win32_dnd_begin(const char *data,
+                                     int         size);
+EAPI Eina_Bool ecore_win32_dnd_register_drop_target(Ecore_Win32_Window                 *window,
+                                                    Ecore_Win32_Dnd_DropTarget_Callback callback);
+EAPI void      ecore_win32_dnd_unregister_drop_target(Ecore_Win32_Window *window);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
 
 
 #endif /* __ECORE_WIN32_H__ */
index 1795c69..7031fa5 100644 (file)
@@ -2,30 +2,43 @@ MAINTAINERCLEANFILES = Makefile.in
 
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
--I$(top_builddir)/src/lib/ecore
-
-
-if BUILD_ECORE_WIN32
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_input \
+@EFL_ECORE_WIN32_BUILD@ \
+@EVIL_CFLAGS@ \
+@EINA_CFLAGS@ \
+@WIN32_CPPFLAGS@
 
 lib_LTLIBRARIES = libecore_win32.la
 
-include_HEADERS = \
-Ecore_Win32.h
+includes_HEADERS = Ecore_Win32.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_win32_la_SOURCES = \
 ecore_win32.c \
 ecore_win32_cursor.c \
+ecore_win32_dnd.c \
+ecore_win32_dnd_enumformatetc.cpp \
+ecore_win32_dnd_data_object.cpp \
+ecore_win32_dnd_drop_source.cpp \
+ecore_win32_dnd_drop_target.cpp \
 ecore_win32_event.c \
 ecore_win32_window.c
 
 libecore_win32_la_LIBADD = \
 @ecore_win32_libs@ \
 @WIN32_LIBS@ \
-$(top_builddir)/src/lib/ecore/libecore.la
-
-libecore_win32_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
+$(top_builddir)/src/lib/ecore/libecore.la \
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+@EINA_LIBS@ \
+@EVIL_LIBS@
 
-endif
+libecore_win32_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
 
 EXTRA_DIST = \
-ecore_win32_private.h
+ecore_win32_private.h \
+ecore_win32_dnd_enumformatetc.h \
+ecore_win32_dnd_data_object.h \
+ecore_win32_dnd_drop_source.h \
+ecore_win32_dnd_drop_target.h
index 2acc005..b571d74 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
 #include <stdlib.h>
-#include <stdio.h>   /* for printf */
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
 #include <windowsx.h>
 
-#include "Ecore.h"
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+
 #include "Ecore_Win32.h"
 #include "ecore_win32_private.h"
 
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
 
-/***** Global declarations *****/
+/**
+ * @cond LOCAL
+ */
 
-HINSTANCE           _ecore_win32_instance = NULL;
-double              _ecore_win32_double_click_time = 0.25;
-double              _ecore_win32_event_last_time = 0.0;
-Ecore_Win32_Window *_ecore_win32_event_last_window = NULL;
+/* OLE IID for Drag'n Drop */
 
-int ECORE_WIN32_EVENT_KEY_DOWN              = 0;
-int ECORE_WIN32_EVENT_KEY_UP                = 0;
-int ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN     = 0;
-int ECORE_WIN32_EVENT_MOUSE_BUTTON_UP       = 0;
-int ECORE_WIN32_EVENT_MOUSE_MOVE            = 0;
-int ECORE_WIN32_EVENT_MOUSE_IN              = 0;
-int ECORE_WIN32_EVENT_MOUSE_OUT             = 0;
-int ECORE_WIN32_EVENT_MOUSE_WHEEL           = 0;
-int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN       = 0;
-int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT      = 0;
-int ECORE_WIN32_EVENT_WINDOW_DAMAGE         = 0;
-int ECORE_WIN32_EVENT_WINDOW_CREATE         = 0;
-int ECORE_WIN32_EVENT_WINDOW_DESTROY        = 0;
-int ECORE_WIN32_EVENT_WINDOW_SHOW           = 0;
-int ECORE_WIN32_EVENT_WINDOW_HIDE           = 0;
-int ECORE_WIN32_EVENT_WINDOW_CONFIGURE      = 0;
-int ECORE_WIN32_EVENT_WINDOW_RESIZE         = 0;
-int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = 0;
+# define INITGUID
+# include <basetyps.h>
+DEFINE_OLEGUID(IID_IEnumFORMATETC, 0x00000103L, 0, 0);
+DEFINE_OLEGUID(IID_IDataObject,    0x0000010EL, 0, 0);
+DEFINE_OLEGUID(IID_IDropSource,    0x00000121L, 0, 0);
+DEFINE_OLEGUID(IID_IDropTarget,    0x00000122L, 0, 0);
+DEFINE_OLEGUID(IID_IUnknown,       0x00000000L, 0, 0);
 
-
-/***** Private declarations *****/
+#define IDI_ICON 101
 
 static int       _ecore_win32_init_count = 0;
 
-LRESULT CALLBACK _ecore_win32_window_procedure(HWND   window,
-                                               UINT   message,
-                                               WPARAM window_param,
-                                               LPARAM data_param);
-
-
-/***** API *****/
-
-
-int
-ecore_win32_init()
+static void
+_ecore_win32_size_check(Ecore_Win32_Window *win, int w, int h, int *dx, int *dy)
 {
-   WNDCLASS wc;
-
-   if (_ecore_win32_init_count > 0)
-     {
-       _ecore_win32_init_count++;
-       return _ecore_win32_init_count;
-     }
-
-   printf (" *** ecore_win32_init\n");
-   _ecore_win32_instance = GetModuleHandle(NULL);
-   if (!_ecore_win32_instance)
-     return 0;
-
-   memset (&wc, 0, sizeof (WNDCLASS));
-   wc.style = CS_HREDRAW | CS_VREDRAW;
-   wc.lpfnWndProc = _ecore_win32_window_procedure;
-   wc.cbClsExtra = 0;
-   wc.cbWndExtra = 0;
-   wc.hInstance = _ecore_win32_instance;
-   wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
-   wc.hCursor = LoadCursor (NULL, IDC_ARROW);
-   wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
-   wc.lpszMenuName =  NULL;
-   wc.lpszClassName = ECORE_WIN32_WINDOW_CLASS;
-
-   if(!RegisterClass(&wc))
-     {
-        FreeLibrary(_ecore_win32_instance);
-        return 0;
-     }
-
-   if (!ECORE_WIN32_EVENT_KEY_DOWN)
-     {
-        ECORE_WIN32_EVENT_KEY_DOWN              = ecore_event_type_new();
-        ECORE_WIN32_EVENT_KEY_UP                = ecore_event_type_new();
-        ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN     = ecore_event_type_new();
-        ECORE_WIN32_EVENT_MOUSE_BUTTON_UP       = ecore_event_type_new();
-        ECORE_WIN32_EVENT_MOUSE_MOVE            = ecore_event_type_new();
-        ECORE_WIN32_EVENT_MOUSE_IN              = ecore_event_type_new();
-        ECORE_WIN32_EVENT_MOUSE_OUT             = ecore_event_type_new();
-        ECORE_WIN32_EVENT_MOUSE_WHEEL           = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_FOCUS_IN       = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT      = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_DAMAGE         = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_CREATE         = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_DESTROY        = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_SHOW           = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_HIDE           = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_CONFIGURE      = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_RESIZE         = ecore_event_type_new();
-        ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
-     }
-
-   _ecore_win32_init_count++;
-
-   return _ecore_win32_init_count;
+   int minimal_width;
+   int minimal_height;
+
+   minimal_width = GetSystemMetrics(SM_CXMIN);
+   minimal_height = GetSystemMetrics(SM_CYMIN);
+   if ((w) < MAX(minimal_width, (int)win->min_width))
+     *dx = 0;
+   if ((w) > (int)win->max_width)
+     *dx = 0;
+   if ((h) < MAX(minimal_height, (int)win->min_height))
+     *dy = 0;
+   if ((h) > (int)win->max_height)
+     *dy = 0;
 }
 
-int
-ecore_win32_shutdown()
-{
-   _ecore_win32_init_count++;
-   if (_ecore_win32_init_count > 0) return _ecore_win32_init_count;
-   if (!_ecore_win32_instance) return _ecore_win32_init_count;
-
-   UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance);
-   FreeLibrary(_ecore_win32_instance);
-   _ecore_win32_instance = NULL;
-
-   if (_ecore_win32_init_count < 0) _ecore_win32_init_count = 0;
-
-   return _ecore_win32_init_count;
-}
-
-int
-ecore_win32_screen_depth_get()
-{
-   HDC dc;
-   int depth;
-
-   dc = GetDC(NULL);
-   if (!dc)
-     return 0;
-
-   depth = GetDeviceCaps(dc, BITSPIXEL);
-   ReleaseDC(NULL, dc);
-
-   return depth;
-}
-
-/**
- * Sets the timeout for a double and triple clicks to be flagged.
- *
- * This sets the time between clicks before the double_click flag is
- * set in a button down event. If 3 clicks occur within double this
- * time, the triple_click flag is also set.
- *
- * @param t The time in seconds
- */
-void
-ecore_win32_double_click_time_set(double t)
-{
-   if (t < 0.0) t = 0.0;
-   _ecore_win32_double_click_time = t;
-}
-
-/**
- * Retrieves the double and triple click flag timeout.
- *
- * See @ref ecore_win32_double_click_time_set for more information.
- *
- * @return The timeout for double clicks in seconds.
- */
-double
-ecore_win32_double_click_time_get(void)
-{
-   return _ecore_win32_double_click_time;
-}
-
-/**
- * Return the last event time
- */
-double
-ecore_win32_current_time_get(void)
-{
-   return _ecore_win32_event_last_time;
-}
-
-
-/***** Private functions definitions *****/
-
-
 LRESULT CALLBACK
 _ecore_win32_window_procedure(HWND   window,
                               UINT   message,
@@ -201,7 +63,7 @@ _ecore_win32_window_procedure(HWND   window,
                               LPARAM data_param)
 {
    Ecore_Win32_Callback_Data *data;
-   POINTS                     pt;
+   POINTS                     point;
    DWORD                      coord;
 
    data = (Ecore_Win32_Callback_Data *)malloc(sizeof(Ecore_Win32_Callback_Data));
@@ -211,121 +73,342 @@ _ecore_win32_window_procedure(HWND   window,
    data->message = message;
    data->window_param = window_param;
    data->data_param = data_param;
-   data->time = GetMessageTime();
+   data->timestamp = GetMessageTime();
    coord = GetMessagePos();
-   pt = MAKEPOINTS(coord);
-   data->x = pt.x;
-   data->y = pt.y;
+   point = MAKEPOINTS(coord);
+   data->x = point.x;
+   data->y = point.y;
+   data->discard_ctrl = EINA_FALSE;
 
    switch (data->message)
      {
        /* Keyboard input notifications */
      case WM_KEYDOWN:
-       printf (" * ecore message : keystroke down\n");
+     case WM_SYSKEYDOWN:
+       if ((data->message == WM_KEYDOWN) &&
+           (data->window_param == VK_CONTROL) &&
+           ((HIWORD(data->data_param) & KF_EXTENDED) == 0))
+         {
+            /* Ctrl left key is pressed */
+            BOOL res;
+            MSG next_msg;
+
+            /*
+             * we check if the next message
+             * - is a WM_KEYDOWN
+             * - has the same timestamp than the Ctrl one
+             * - is the key press of the right Alt key
+             */
+            res = PeekMessage(&next_msg, data->window,
+                              WM_KEYDOWN, WM_KEYDOWN,
+                              PM_NOREMOVE);
+            if (res &&
+                (next_msg.wParam == VK_MENU) &&
+                (next_msg.time == data->timestamp) &&
+                (HIWORD(next_msg.lParam) & KF_EXTENDED))
+              {
+                 INF("discard left Ctrl key press (sent by AltGr key press)");
+                 data->discard_ctrl = EINA_TRUE;
+              }
+         }
        _ecore_win32_event_handle_key_press(data, 1);
        return 0;
      case WM_CHAR:
+     case WM_SYSCHAR:
+       INF("char message");
        _ecore_win32_event_handle_key_press(data, 0);
        return 0;
      case WM_KEYUP:
-       printf (" * ecore message : keystroke up\n");
-       _ecore_win32_event_handle_key_release(data, 1);
+     case WM_SYSKEYUP:
+       INF("keyup message");
+       if ((data->window_param == VK_CONTROL) &&
+           ((HIWORD(data->data_param) & KF_EXTENDED) == 0))
+         {
+            /* Ctrl left key is pressed */
+            BOOL res;
+            MSG next_msg;
+
+            /*
+             * we check if the next message
+             * - is a WM_KEYUP or WM_SYSKEYUP
+             * - has the same timestamp than the Ctrl one
+             * - is the key release of the right Alt key
+             */
+            res = PeekMessage(&next_msg, data->window,
+                              WM_KEYUP, WM_SYSKEYUP,
+                              PM_NOREMOVE);
+            if (res &&
+                ((next_msg.message == WM_KEYUP) ||
+                 (next_msg.message == WM_SYSKEYUP)) &&
+                (next_msg.wParam == VK_MENU) &&
+                (next_msg.time == data->timestamp) &&
+                (HIWORD(next_msg.lParam) & KF_EXTENDED))
+              {
+                 INF("discard left Ctrl key release (sent by AltGr key release)");
+                 data->discard_ctrl = EINA_TRUE;
+              }
+         }
+       _ecore_win32_event_handle_key_release(data);
        return 0;
      case WM_SETFOCUS:
-       printf (" * ecore message : focus in\n");
+       INF("setfocus message");
        _ecore_win32_event_handle_focus_in(data);
        return 0;
      case WM_KILLFOCUS:
-       printf (" * ecore message : focus out\n");
+       INF("kill focus message");
        _ecore_win32_event_handle_focus_out(data);
        return 0;
        /* Mouse input notifications */
      case WM_LBUTTONDOWN:
-       printf (" * ecore message : lbuttondown\n");
+       INF("left button down message");
+       SetCapture(window);
        _ecore_win32_event_handle_button_press(data, 1);
        return 0;
      case WM_MBUTTONDOWN:
-       printf (" * ecore message : mbuttondown\n");
+       INF("middle button down message");
        _ecore_win32_event_handle_button_press(data, 2);
        return 0;
      case WM_RBUTTONDOWN:
-       printf (" * ecore message : rbuttondown\n");
+       INF("right button down message");
        _ecore_win32_event_handle_button_press(data, 3);
        return 0;
      case WM_LBUTTONUP:
-       printf (" * ecore message : lbuttonup\n");
-       _ecore_win32_event_handle_button_release(data, 1);
-       return 0;
+       {
+          Ecore_Win32_Window *w = NULL;
+
+          INF("left button up message");
+
+          ReleaseCapture();
+          w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
+          if (w->drag.dragging)
+            {
+               w->drag.dragging = 0;
+               return 0;
+            }
+
+          _ecore_win32_event_handle_button_release(data, 1);
+          return 0;
+       }
      case WM_MBUTTONUP:
-       printf (" * ecore message : mbuttonup\n");
+       INF("middle button up message");
        _ecore_win32_event_handle_button_release(data, 2);
        return 0;
      case WM_RBUTTONUP:
-       printf (" * ecore message : rbuttonup\n");
+       INF("right button up message");
        _ecore_win32_event_handle_button_release(data, 3);
        return 0;
      case WM_MOUSEMOVE:
        {
-          RECT                        rect;
-          struct _Ecore_Win32_Window *w = NULL;
-
-          w = (struct _Ecore_Win32_Window *)GetWindowLong(window, GWL_USERDATA);
+          RECT                rect;
+          Ecore_Win32_Window *w = NULL;
+
+          INF("moue move message");
+
+          w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
+
+          if (w->drag.dragging)
+            {
+               POINT pt;
+
+               pt.x = GET_X_LPARAM(data_param);
+               pt.y = GET_Y_LPARAM(data_param);
+               if (ClientToScreen(window, &pt))
+                 {
+                    if (w->drag.type == HTCAPTION)
+                      {
+                         int dx;
+                         int dy;
+
+                         dx = pt.x - w->drag.px;
+                         dy = pt.y - w->drag.py;
+                         ecore_win32_window_move(w, w->drag.x + dx, w->drag.y + dy);
+                         w->drag.x += dx;
+                         w->drag.y += dy;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTLEFT)
+                      {
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         ecore_win32_window_move_resize(w, w->drag.x + dw, w->drag.y, w->drag.w - dw, w->drag.h);
+                         w->drag.x += dw;
+                         w->drag.w -= dw;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTRIGHT)
+                      {
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h);
+                         w->drag.w += dw;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTTOP)
+                      {
+                         int dh;
+
+                         dh = pt.y - w->drag.py;
+                         ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dh, w->drag.w, w->drag.h - dh);
+                         w->drag.y += dh;
+                         w->drag.h -= dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTBOTTOM)
+                      {
+                         int dh;
+
+                         dh = pt.y - w->drag.py;
+                         ecore_win32_window_resize(w, w->drag.w, w->drag.h + dh);
+                         w->drag.h += dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTTOPLEFT)
+                      {
+                         int dx;
+                         int dy;
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         dx = dw;
+                         dy = dh;
+                         _ecore_win32_size_check(w,
+                                                 w->drag.w - dw, w->drag.h - dh,
+                                                 &dx, &dy);
+
+                         ecore_win32_window_move_resize(w, w->drag.x + dx, w->drag.y + dy, w->drag.w - dw, w->drag.h - dh);
+                         w->drag.x += dx;
+                         w->drag.y += dy;
+                         w->drag.w -= dw;
+                         w->drag.h -= dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTTOPRIGHT)
+                      {
+                         int dx;
+                         int dy;
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         dx = dw;
+                         dy = dh;
+                         _ecore_win32_size_check(w,
+                                                 w->drag.w, w->drag.h - dh,
+                                                 &dx, &dy);
+                         ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dy, w->drag.w, w->drag.h - dh);
+                         w->drag.y += dy;
+                         w->drag.w += dw;
+                         w->drag.h -= dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTBOTTOMLEFT)
+                      {
+                         int dx;
+                         int dy;
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         dx = dw;
+                         dy = dh;
+                         _ecore_win32_size_check(w,
+                                                 w->drag.w - dw, w->drag.h + dh,
+                                                 &dx, &dy);
+                         ecore_win32_window_move_resize(w, w->drag.x + dx, w->drag.y, w->drag.w - dw, w->drag.h + dh);
+                         w->drag.x += dx;
+                         w->drag.w -= dw;
+                         w->drag.h += dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                    if (w->drag.type == HTBOTTOMRIGHT)
+                      {
+                         int dh;
+                         int dw;
+
+                         dw = pt.x - w->drag.px;
+                         dh = pt.y - w->drag.py;
+                         ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h + dh);
+                         w->drag.w += dw;
+                         w->drag.h += dh;
+                         w->drag.px = pt.x;
+                         w->drag.py = pt.y;
+                         return 0;
+                      }
+                 }
+            }
 
           if (GetClientRect(window, &rect))
-          {
-             POINT pt;
-
-             pt.x = GET_X_LPARAM(data_param);
-             pt.y = GET_Y_LPARAM(data_param);
-             if (!PtInRect(&rect, pt))
-               {
-                  if (w->pointer_is_in)
-                    {
-                       w->pointer_is_in = 0;
-                       _ecore_win32_event_handle_leave_notify(data);
-                    }
-               }
-             else
-               {
-                  if (!w->pointer_is_in)
-                    {
-                       w->pointer_is_in = 1;
-                       _ecore_win32_event_handle_enter_notify(data);
-                    }
-
-               }
-          }
+            {
+               POINT pt;
+
+               INF("mouse in window");
+
+               pt.x = GET_X_LPARAM(data_param);
+               pt.y = GET_Y_LPARAM(data_param);
+               if (!PtInRect(&rect, pt))
+                 {
+                    if (w->pointer_is_in)
+                      {
+                         w->pointer_is_in = 0;
+                         _ecore_win32_event_handle_leave_notify(data);
+                      }
+                 }
+               else
+                 {
+                    if (!w->pointer_is_in)
+                      {
+                         w->pointer_is_in = 1;
+                         _ecore_win32_event_handle_enter_notify(data);
+                      }
+                 }
+            }
+          else
+            {
+               ERR("GetClientRect() failed");
+            }
           _ecore_win32_event_handle_motion_notify(data);
 
           return 0;
        }
      case WM_MOUSEWHEEL:
-       printf (" * ecore message : mouse wheel\n");
+       INF("mouse wheel message");
        _ecore_win32_event_handle_button_press(data, 4);
        return 0;
        /* Window notifications */
      case WM_CREATE:
-       {
-         RECT rect;
-         GetClientRect(window, &rect);
-         printf (" *** ecore message : create %ld %ld\n",
-                 rect.right - rect.left, rect.bottom - rect.top);
-       }
+       INF("create window message");
        _ecore_win32_event_handle_create_notify(data);
        return 0;
      case WM_DESTROY:
-       printf (" * ecore message : destroy\n");
+       INF("destroy window message");
        _ecore_win32_event_handle_destroy_notify(data);
        return 0;
      case WM_SHOWWINDOW:
-       {
-         RECT rect;
-         GetClientRect(window, &rect);
-         printf (" *** ecore message : show %ld %ld\n",
-                 rect.right - rect.left, rect.bottom - rect.top);
-       }
+       INF("show window message");
        if ((data->data_param == SW_OTHERUNZOOM) ||
-           (data->data_param == SW_OTHERUNZOOM))
+           (data->data_param == SW_OTHERZOOM))
          return 0;
 
        if (data->window_param)
@@ -335,22 +418,26 @@ _ecore_win32_window_procedure(HWND   window,
 
        return 0;
      case WM_CLOSE:
-       printf (" * ecore message : close\n");
+       INF("close window message");
        _ecore_win32_event_handle_delete_request(data);
        return 0;
+     case WM_GETMINMAXINFO:
+       INF("get min max info window message");
+       return TRUE;
      case WM_MOVING:
-       printf (" * ecore message : moving\n");
+       INF("moving window message");
+       _ecore_win32_event_handle_configure_notify(data);
        return TRUE;
      case WM_MOVE:
-       printf (" * ecore message : moved\n");
+       INF("move window message");
        return 0;
      case WM_SIZING:
-       printf (" * ecore message : sizing\n");
+       INF("sizing window message");
        _ecore_win32_event_handle_resize(data);
        _ecore_win32_event_handle_configure_notify(data);
        return TRUE;
      case WM_SIZE:
-       printf (" * ecore message : sized\n");
+       INF("size window message");
        return 0;
 /*      case WM_WINDOWPOSCHANGING: */
 /*        { */
@@ -362,26 +449,67 @@ _ecore_win32_window_procedure(HWND   window,
 /*        _ecore_win32_event_handle_configure_notify(data); */
 /*        return 0; */
      case WM_WINDOWPOSCHANGED:
-       {
-         RECT rect;
-         GetClientRect(window, &rect);
-         printf (" *** ecore message : WINDOWPOSCHANGED %ld %ld\n",
-                 rect.right - rect.left, rect.bottom - rect.top);
-       }
+       INF("position changed window message");
        _ecore_win32_event_handle_configure_notify(data);
+       _ecore_win32_event_handle_expose(data);
        return 0;
-     case WM_ENTERSIZEMOVE :
-       printf (" * ecore message : WM_ENTERSIZEMOVE \n");
+     case WM_ENTERSIZEMOVE:
+       INF("enter size move window message");
        return 0;
      case WM_EXITSIZEMOVE:
-       printf (" * ecore message : WM_EXITSIZEMOVE\n");
+       INF("exit size move window message");
        return 0;
+     case WM_NCLBUTTONDOWN:
+       INF("non client left button down window message");
+
+       if (((DWORD)window_param == HTCAPTION) ||
+           ((DWORD)window_param == HTBOTTOM) ||
+           ((DWORD)window_param == HTBOTTOMLEFT) ||
+           ((DWORD)window_param == HTBOTTOMRIGHT) ||
+           ((DWORD)window_param == HTLEFT) ||
+           ((DWORD)window_param == HTRIGHT) ||
+           ((DWORD)window_param == HTTOP) ||
+           ((DWORD)window_param == HTTOPLEFT) ||
+           ((DWORD)window_param == HTTOPRIGHT))
+         {
+           Ecore_Win32_Window *w;
+
+           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
+           ecore_win32_window_geometry_get(w,
+                                           NULL, NULL,
+                                           &w->drag.w, &w->drag.h);
+           SetCapture(window);
+           w->drag.type = (DWORD)window_param;
+           w->drag.px = GET_X_LPARAM(data_param);
+           w->drag.py = GET_Y_LPARAM(data_param);
+           w->drag.dragging = 1;
+           return 0;
+         }
+       return DefWindowProc(window, message, window_param, data_param);
+     case WM_SYSCOMMAND:
+       INF("sys command window message %d", (int)window_param);
+
+       if ((((DWORD)window_param & 0xfff0) == SC_MOVE) ||
+           (((DWORD)window_param & 0xfff0) == SC_SIZE))
+         {
+           Ecore_Win32_Window *w;
+
+           INF("sys command MOVE or SIZE window message : %dx%d", GET_X_LPARAM(data_param), GET_Y_LPARAM(data_param));
+
+           w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
+           w->drag.dragging = 1;
+           return 0;
+         }
+       return DefWindowProc(window, message, window_param, data_param);
        /* GDI notifications */
+     case WM_ERASEBKGND:
+       return 1;
      case WM_PAINT:
        {
          RECT rect;
 
-         printf (" * ecore message : paint\n");
+         INF("paint message");
+
          if (GetUpdateRect(window, &rect, FALSE))
            {
               PAINTSTRUCT ps;
@@ -391,22 +519,323 @@ _ecore_win32_window_procedure(HWND   window,
               data->update = rect;
               _ecore_win32_event_handle_expose(data);
               EndPaint(window, &ps);
-              printf (" *    %ld %ld %ld %ld\n",
-                      rect.left,
-                      rect.top,
-                      rect.right - rect.left,
-                      rect.bottom - rect.top);
            }
          return 0;
        }
      case WM_SETREDRAW:
-       printf (" * ecore message : WM_SETREDRAW\n");
+       INF("set redraw message");
        return 0;
      case WM_SYNCPAINT:
-       printf (" * ecore message : WM_SYNCPAINT\n");
+       INF("sync paint message");
        return 0;
      default:
        return DefWindowProc(window, message, window_param, data_param);
      }
+}
+
+/**
+ * @endcond
+ */
+
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+
+HINSTANCE           _ecore_win32_instance = NULL;
+double              _ecore_win32_double_click_time = 0.25;
+unsigned long       _ecore_win32_event_last_time = 0;
+Ecore_Win32_Window *_ecore_win32_event_last_window = NULL;
+int                 _ecore_win32_log_dom_global = -1;
+
+int ECORE_WIN32_EVENT_MOUSE_IN              = 0;
+int ECORE_WIN32_EVENT_MOUSE_OUT             = 0;
+int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN       = 0;
+int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT      = 0;
+int ECORE_WIN32_EVENT_WINDOW_DAMAGE         = 0;
+int ECORE_WIN32_EVENT_WINDOW_CREATE         = 0;
+int ECORE_WIN32_EVENT_WINDOW_DESTROY        = 0;
+int ECORE_WIN32_EVENT_WINDOW_SHOW           = 0;
+int ECORE_WIN32_EVENT_WINDOW_HIDE           = 0;
+int ECORE_WIN32_EVENT_WINDOW_CONFIGURE      = 0;
+int ECORE_WIN32_EVENT_WINDOW_RESIZE         = 0;
+int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = 0;
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Ecore_Win32_Group Ecore_Win32 library
+ *
+ * Ecore_Win32 is a library that wraps Windows graphic functions
+ * and integrate them nicely into the Ecore main loop.
+ *
+ * @section Ecore_Win32_Sec_Init Initialisation / Shutdown
+ *
+ * To fill...
+ *
+ * @section Ecore_Win32_Sec_Icons How to set icons to an application
+ *
+ * It is possible to also sets the icon of the application easily:
+ *
+ * @li Create an icon with your favorite image creator. The Gimp is a
+ * good choice. Create several images of size 16, 32 and 48. You can
+ * also create images of size 24, 64, 128 and 256. Paste all of them
+ * in the image of size 16 as a layer. Save the image of size 16 with
+ * the name my_icon.ico. Put it where the source code of the
+ * application is located.
+ * @li Create my_icon_rc.rc file with your code editor and add in it:
+ * @code
+ * 101 ICON DISCARDABLE "my_icon.ico"
+ * @endcode
+ * @li With Visual Studio, put that file in the 'Resource file' part
+ * of the project.
+ * @li With MinGW, you have to compile it with windres:
+ * @code
+ * windres my_icon_rc.rc my_icon_rc.o
+ * @endcode
+ * and add my_icon_rc.o to the object files of the application.
+ *
+ * @note The value 101 must not be changed, it's the ID used
+ * internally by Ecore_Win32 to get the icons.
+ *
+ * @{
+ */
+
+/**
+ * @brief Initialize the Ecore_Win32 library.
+ *
+ * @return 1 or greater on success, 0 on error.
+ *
+ * This function sets up the Windows graphic system. It returns 0 on
+ * failure, otherwise it returns the number of times it has already been
+ * called.
+ *
+ * When Ecore_Win32 is not used anymore, call ecore_win32_shutdown()
+ * to shut down the Ecore_Win32 library.
+ */
+EAPI int
+ecore_win32_init()
+{
+   WNDCLASSEX wc;
+   HICON      icon;
+   HICON      icon_sm;
+
+   if (++_ecore_win32_init_count != 1)
+     return _ecore_win32_init_count;
+
+   if (!eina_init())
+     return --_ecore_win32_init_count;
+
+   _ecore_win32_log_dom_global = eina_log_domain_register
+     ("ecore_win32", ECORE_WIN32_DEFAULT_LOG_COLOR);
+   if (_ecore_win32_log_dom_global < 0)
+     {
+        EINA_LOG_ERR("Ecore_Win32: Could not register log domain");
+        goto shutdown_eina;
+     }
 
+   if (!ecore_event_init())
+     {
+        ERR("Ecore_Win32: Could not init ecore_event");
+        goto unregister_log_domain;
+     }
+
+   _ecore_win32_instance = GetModuleHandle(NULL);
+   if (!_ecore_win32_instance)
+     {
+        ERR("GetModuleHandle() failed");
+        goto shutdown_ecore_event;
+     }
+
+   icon = LoadImage(_ecore_win32_instance,
+                    MAKEINTRESOURCE(IDI_ICON),
+                    IMAGE_ICON,
+                    GetSystemMetrics(SM_CXICON),
+                    GetSystemMetrics(SM_CYICON),
+                    LR_DEFAULTCOLOR);
+   icon_sm = LoadImage(_ecore_win32_instance,
+                       MAKEINTRESOURCE(IDI_ICON),
+                       IMAGE_ICON,
+                       GetSystemMetrics(SM_CXSMICON),
+                       GetSystemMetrics(SM_CYSMICON),
+                       LR_DEFAULTCOLOR);
+   if (!icon)
+     icon = LoadIcon (NULL, IDI_APPLICATION);
+   if (!icon_sm)
+     icon_sm = LoadIcon (NULL, IDI_APPLICATION);
+
+   memset (&wc, 0, sizeof (WNDCLASSEX));
+   wc.cbSize = sizeof (WNDCLASSEX);
+   wc.style = CS_HREDRAW | CS_VREDRAW;
+   wc.lpfnWndProc = _ecore_win32_window_procedure;
+   wc.cbClsExtra = 0;
+   wc.cbWndExtra = 0;
+   wc.hInstance = _ecore_win32_instance;
+   wc.hIcon = icon;
+   wc.hCursor = LoadCursor (NULL, IDC_ARROW);
+   wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
+   wc.lpszMenuName =  NULL;
+   wc.lpszClassName = ECORE_WIN32_WINDOW_CLASS;
+   wc.hIconSm = icon_sm;
+
+   if(!RegisterClassEx(&wc))
+     {
+        ERR("RegisterClass() failed");
+        goto free_library;
+     }
+
+   if (!ecore_win32_dnd_init())
+     {
+        ERR("ecore_win32_dnd_init() failed");
+        goto unregister_class;
+     }
+
+   if (!ECORE_WIN32_EVENT_MOUSE_IN)
+     {
+        ECORE_WIN32_EVENT_MOUSE_IN              = ecore_event_type_new();
+        ECORE_WIN32_EVENT_MOUSE_OUT             = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_FOCUS_IN       = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT      = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_DAMAGE         = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_CREATE         = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_DESTROY        = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_SHOW           = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_HIDE           = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_CONFIGURE      = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_RESIZE         = ecore_event_type_new();
+        ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
+     }
+
+   return _ecore_win32_init_count;
+
+ unregister_class:
+   UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance);
+ free_library:
+   FreeLibrary(_ecore_win32_instance);
+ shutdown_ecore_event:
+   ecore_event_shutdown();
+ unregister_log_domain:
+   eina_log_domain_unregister(_ecore_win32_log_dom_global);
+ shutdown_eina:
+   eina_shutdown();
+
+   return --_ecore_win32_init_count;
+}
+
+/**
+ * @brief Shut down the Ecore_Win32 library.
+ *
+ * @return 0 when the library is completely shut down, 1 or
+ * greater otherwise.
+ *
+ * This function shuts down the Ecore_Win32 library. It returns 0 when it has
+ * been called the same number of times than ecore_win32_init(). In that case
+ * it shuts down all the Windows graphic system.
+ */
+EAPI int
+ecore_win32_shutdown()
+{
+   if (--_ecore_win32_init_count != 0)
+     return _ecore_win32_init_count;
+
+   ecore_win32_dnd_shutdown();
+
+   if (!UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance))
+     INF("UnregisterClass() failed");
+
+   if (!FreeLibrary(_ecore_win32_instance))
+     INF("FreeLibrary() failed");
+
+   _ecore_win32_instance = NULL;
+
+   ecore_event_shutdown();
+   eina_log_domain_unregister(_ecore_win32_log_dom_global);
+   _ecore_win32_log_dom_global = -1;
+   eina_shutdown();
+
+   return _ecore_win32_init_count;
+}
+
+/**
+ * @brief Retrieve the depth of the screen.
+ *
+ * @return The depth of the screen.
+ *
+ * This function returns the depth of the screen. If an error occurs,
+ * it returns 0.
+ */
+EAPI int
+ecore_win32_screen_depth_get()
+{
+   HDC dc;
+   int depth;
+
+   INF("getting screen depth");
+
+   dc = GetDC(NULL);
+   if (!dc)
+     {
+        ERR("GetDC() failed");
+        return 0;
+     }
+
+   depth = GetDeviceCaps(dc, BITSPIXEL);
+   if (!ReleaseDC(NULL, dc))
+     {
+        ERR("ReleaseDC() failed (device context not released)");
+     }
+
+   return depth;
+}
+
+/**
+ * @brief Sets the timeout for a double and triple clicks to be flagged.
+ *
+ * @param t The time in seconds.
+ *
+ * This function sets the time @p t between clicks before the
+ * double_click flag is set in a button down event. If 3 clicks occur
+ * within double this time, the triple_click flag is also set.
+ */
+EAPI void
+ecore_win32_double_click_time_set(double t)
+{
+   if (t < 0.0) t = 0.0;
+   _ecore_win32_double_click_time = t;
+}
+
+/**
+ * @brief Retrieve the double and triple click flag timeout.
+ *
+ * @return The timeout for double clicks in seconds.
+ *
+ * This function returns the double clicks in seconds. If
+ * ecore_win32_double_click_time_set() has not been called, the
+ * default value is returned. See ecore_win32_double_click_time_set()
+ * for more informations.
+ */
+EAPI double
+ecore_win32_double_click_time_get(void)
+{
+   return _ecore_win32_double_click_time;
 }
+
+/**
+ * @brief Return the last event time.
+ *
+ * @return The last envent time.
+ *
+ * This function returns the last event time.
+ */
+EAPI unsigned long
+ecore_win32_current_time_get(void)
+{
+   return _ecore_win32_event_last_time;
+}
+
+/**
+ * @}
+ */
index 7e89f9a..9b58c95 100644 (file)
@@ -1,7 +1,3 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
 
+#include <Eina.h>
+
 #include "Ecore_Win32.h"
 #include "ecore_win32_private.h"
 
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
+
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
 
-/***** API *****/
 
-Ecore_Win32_Cursor *
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Ecore_Win32_Group Ecore_Win32 library
+ *
+ * @{
+ */
+
+/**
+ * @brief Create a new cursor.
+ *
+ * @param pixels_and The array of bytes containing the bit values for
+ * the AND mask of the cursor.
+ * @param pixels_xor The array of bytes containing the bit values for
+ * the XOR mask of the cursor.
+ * @param width The width of the cursor.
+ * @param height The height of the cursor.
+ * @param hot_x The horizontal position of the cursor's hot spot.
+ * @param hot_y The vertical position of the cursor's hot spot.
+ * @return A newly user-defined cursor.
+ *
+ * This function creates a new cursor of size @p width and @p
+ * height. They must be valid size. To determine the valid size of a
+ * cursor, use ecore_win32_cursor_size_get(). @p pixels_and is an array
+ * of bytes (unsigned char) containing the bits of the cursor that
+ * will be visible. @p pixels_xor is similar but will allow the cursor
+ * to have a shape. Here is the truth table for the masks:
+ *
+ * <table border=1>
+ * <tr><td>AND mask</td><td>XOR mask</td><td>Display</td></tr>
+ * <tr><td>0</td>       <td>0</td>       <td>Black</td></tr>
+ * <tr><td>0</td>       <td>1</td>       <td>White</td></tr>
+ * <tr><td>1</td>       <td>0</td>       <td>Screen</td></tr>
+ * <tr><td>1</td>       <td>1</td>       <td>Reverse screen</td></tr>
+ * </table>
+ *
+ * @p hot_x and @p hot_y are the position of the hot spot of the
+ * cursor. If @p pixels_and or @p pixels_xor are @c NULL, the function
+ * returns NULL. If @p width or @p height does not match the valid
+ * size of a cursor, the function returns @c NULL. On success, the
+ * function creates a user-defined cursor, otherwise it returns
+ * @c NULL.
+ *
+ * Once the cursor is not used anymore, use ecore_win32_cursor_free()
+ * to free the ressources.
+ *
+ * Example of use:
+ *
+ * @code
+ * unsigned char pixels_and[] ={
+ * 0xFF, 0xFC, 0x3F, 0xFF,   // line 1
+ * 0xFF, 0xC0, 0x1F, 0xFF,   // line 2
+ * 0xFF, 0x00, 0x3F, 0xFF,   // line 3
+ * 0xFE, 0x00, 0xFF, 0xFF,   // line 4
+ *
+ * 0xF7, 0x01, 0xFF, 0xFF,   // line 5
+ * 0xF0, 0x03, 0xFF, 0xFF,   // line 6
+ * 0xF0, 0x03, 0xFF, 0xFF,   // line 7
+ * 0xE0, 0x07, 0xFF, 0xFF,   // line 8
+ *
+ * 0xC0, 0x07, 0xFF, 0xFF,   // line 9
+ * 0xC0, 0x0F, 0xFF, 0xFF,   // line 10
+ * 0x80, 0x0F, 0xFF, 0xFF,   // line 11
+ * 0x80, 0x0F, 0xFF, 0xFF,   // line 12
+ *
+ * 0x80, 0x07, 0xFF, 0xFF,   // line 13
+ * 0x00, 0x07, 0xFF, 0xFF,   // line 14
+ * 0x00, 0x03, 0xFF, 0xFF,   // line 15
+ * 0x00, 0x00, 0xFF, 0xFF,   // line 16
+ *
+ * 0x00, 0x00, 0x7F, 0xFF,   // line 17
+ * 0x00, 0x00, 0x1F, 0xFF,   // line 18
+ * 0x00, 0x00, 0x0F, 0xFF,   // line 19
+ * 0x80, 0x00, 0x0F, 0xFF,   // line 20
+ *
+ * 0x80, 0x00, 0x07, 0xFF,   // line 21
+ * 0x80, 0x00, 0x07, 0xFF,   // line 22
+ * 0xC0, 0x00, 0x07, 0xFF,   // line 23
+ * 0xC0, 0x00, 0x0F, 0xFF,   // line 24
+ *
+ * 0xE0, 0x00, 0x0F, 0xFF,   // line 25
+ * 0xF0, 0x00, 0x1F, 0xFF,   // line 26
+ * 0xF0, 0x00, 0x1F, 0xFF,   // line 27
+ * 0xF8, 0x00, 0x3F, 0xFF,   // line 28
+ *
+ * 0xFE, 0x00, 0x7F, 0xFF,   // line 29
+ * 0xFF, 0x00, 0xFF, 0xFF,   // line 30
+ * 0xFF, 0xC3, 0xFF, 0xFF,   // line 31
+ * 0xFF, 0xFF, 0xFF, 0xFF    // line 32
+ * };
+ *
+ * unsigned char pixels_xor[] = {
+ * 0x00, 0x00, 0x00, 0x00,   // line 1
+ * 0x00, 0x03, 0xC0, 0x00,   // line 2
+ * 0x00, 0x3F, 0x00, 0x00,   // line 3
+ * 0x00, 0xFE, 0x00, 0x00,   // line 4
+ *
+ * 0x0E, 0xFC, 0x00, 0x00,   // line 5
+ * 0x07, 0xF8, 0x00, 0x00,   // line 6
+ * 0x07, 0xF8, 0x00, 0x00,   // line 7
+ * 0x0F, 0xF0, 0x00, 0x00,   // line 8
+ *
+ * 0x1F, 0xF0, 0x00, 0x00,   // line 9
+ * 0x1F, 0xE0, 0x00, 0x00,   // line 10
+ * 0x3F, 0xE0, 0x00, 0x00,   // line 11
+ * 0x3F, 0xE0, 0x00, 0x00,   // line 12
+ *
+ * 0x3F, 0xF0, 0x00, 0x00,   // line 13
+ * 0x7F, 0xF0, 0x00, 0x00,   // line 14
+ * 0x7F, 0xF8, 0x00, 0x00,   // line 15
+ * 0x7F, 0xFC, 0x00, 0x00,   // line 16
+ *
+ * 0x7F, 0xFF, 0x00, 0x00,   // line 17
+ * 0x7F, 0xFF, 0x80, 0x00,   // line 18
+ * 0x7F, 0xFF, 0xE0, 0x00,   // line 19
+ * 0x3F, 0xFF, 0xE0, 0x00,   // line 20
+ *
+ * 0x3F, 0xC7, 0xF0, 0x00,   // line 21
+ * 0x3F, 0x83, 0xF0, 0x00,   // line 22
+ * 0x1F, 0x83, 0xF0, 0x00,   // line 23
+ * 0x1F, 0x83, 0xE0, 0x00,   // line 24
+ *
+ * 0x0F, 0xC7, 0xE0, 0x00,   // line 25
+ * 0x07, 0xFF, 0xC0, 0x00,   // line 26
+ * 0x07, 0xFF, 0xC0, 0x00,   // line 27
+ * 0x01, 0xFF, 0x80, 0x00,   // line 28
+ *
+ * 0x00, 0xFF, 0x00, 0x00,   // line 29
+ * 0x00, 0x3C, 0x00, 0x00,   // line 30
+ * 0x00, 0x00, 0x00, 0x00,   // line 31
+ * 0x00, 0x00, 0x00, 0x00    // line 32
+ * };
+ *
+ * Ecore_Win32_Cursor *cursor = ecore_win32_cursor_new(pixels_and, pixels_xor, 32, 32, 19, 2);
+ * @endcode
+ */
+EAPI Ecore_Win32_Cursor *
 ecore_win32_cursor_new(const void *pixels_and,
                        const void *pixels_xor,
                        int         width,
@@ -28,6 +171,11 @@ ecore_win32_cursor_new(const void *pixels_and,
    int                 cursor_width;
    int                 cursor_height;
 
+   INF("creating cursor");
+
+   if (!pixels_and || !pixels_xor)
+     return NULL;
+
    cursor_width = GetSystemMetrics(SM_CXCURSOR);
    cursor_height = GetSystemMetrics(SM_CYCURSOR);
 
@@ -45,18 +193,40 @@ ecore_win32_cursor_new(const void *pixels_and,
    return cursor;
 }
 
-void
+/**
+ * @brief Free the given cursor.
+ *
+ * @param cursor The cursor to free.
+ *
+ * This function free @p cursor. @p cursor must have been obtained
+ * with ecore_win32_cursor_new().
+ */
+EAPI void
 ecore_win32_cursor_free(Ecore_Win32_Cursor *cursor)
 {
+   INF("destroying cursor");
+
    DestroyCursor(cursor);
 }
 
-Ecore_Win32_Cursor *
-ecore_win32_cursor_shape_get(Ecore_Win32_Cursor_Shape shape)
+/**
+ * @brief Create a cursor from a Windows ressource.
+ *
+ * @param shape The pre-defined shape of the cursor.
+ * @return The new cursor.
+ *
+ * This function returns a pre-defined cursor with a specified
+ * @p shape. This cursor does not need to be freed, as it is loaded
+ * from an existing resource.
+ */
+EAPI Ecore_Win32_Cursor *
+ecore_win32_cursor_shaped_new(Ecore_Win32_Cursor_Shape shape)
 {
    Ecore_Win32_Cursor *cursor = NULL;
    const char         *cursor_name;
 
+   INF("geting shape cursor");
+
    switch (shape)
      {
        case ECORE_WIN32_CURSOR_SHAPE_APP_STARTING:
@@ -111,13 +281,25 @@ ecore_win32_cursor_shape_get(Ecore_Win32_Cursor_Shape shape)
    return cursor;
 }
 
-int
-ecore_win32_cursor_size_get(void)
+/**
+ * @brief Retrieve the size of a valid cursor.
+ *
+ * @param width The width of a valid cursor.
+ * @param height The height of a valid cursor.
+ *
+ * This function returns the size of a cursor that must be passed to
+ * ecore_win32_cursor_new(). @p width and @p height are buffers that
+ * will be filled with the correct size. They can be @c NULL.
+ */
+EAPI void
+ecore_win32_cursor_size_get(int *width, int *height)
 {
-   int width;
-   int height;
+   INF("geting size cursor");
 
-   width = GetSystemMetrics(SM_CXCURSOR);
-   height = GetSystemMetrics(SM_CYCURSOR);
-   return (width > height) ? width : height;
+   if (*width) *width = GetSystemMetrics(SM_CXCURSOR);
+   if (*height) *height = GetSystemMetrics(SM_CYCURSOR);
 }
+
+/**
+ * @}
+ */
diff --git a/src/lib/ecore_win32/ecore_win32_dnd.c b/src/lib/ecore_win32/ecore_win32_dnd.c
new file mode 100755 (executable)
index 0000000..6c5253a
--- /dev/null
@@ -0,0 +1,221 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <windows.h>
+
+#include "Ecore_Win32.h"
+#include "ecore_win32_private.h"
+
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
+
+/**
+ * @cond LOCAL
+ */
+
+
+static int _ecore_win32_dnd_init_count = 0;
+
+static HANDLE DataToHandle(const char *data, int size)
+{
+   char *ptr;
+   ptr = (char *)GlobalAlloc(GMEM_FIXED, size);
+   memcpy(ptr, data, size);
+   return ptr;
+}
+
+/**
+ * @endcond
+ */
+
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Ecore_Win32_Group Ecore_Win32 library
+ *
+ * @{
+ */
+
+/**
+ * @brief Initialize the Ecore_Win32 Drag and Drop module.
+ *
+ * @return 1 or greater on success, 0 on error.
+ *
+ * This function initialize the Drag and Drop module. It returns 0 on
+ * failure, otherwise it returns the number of times it has already
+ * been called.
+ *
+ * When the Drag and Drop module is not used anymore, call
+ * ecore_win32_dnd_shutdown() to shut down the module.
+ */
+EAPI int
+ecore_win32_dnd_init()
+{
+   if (_ecore_win32_dnd_init_count > 0)
+     {
+       _ecore_win32_dnd_init_count++;
+       return _ecore_win32_dnd_init_count;
+     }
+
+   if (OleInitialize(NULL) != S_OK)
+     return 0;
+
+   _ecore_win32_dnd_init_count++;
+
+   return _ecore_win32_dnd_init_count;
+}
+
+/**
+ * @brief Shut down the Ecore_Win32 Drag and Drop module.
+ *
+ * @return 0 when the module is completely shut down, 1 or
+ * greater otherwise.
+ *
+ * This function shuts down the Drag and Drop module. It returns 0 when it has
+ * been called the same number of times than ecore_win32_dnd_init(). In that case
+ * it shut down the module.
+ */
+EAPI int
+ecore_win32_dnd_shutdown()
+{
+   _ecore_win32_dnd_init_count--;
+   if (_ecore_win32_dnd_init_count > 0) return _ecore_win32_dnd_init_count;
+
+   OleUninitialize();
+
+   if (_ecore_win32_dnd_init_count < 0) _ecore_win32_dnd_init_count = 0;
+
+   return _ecore_win32_dnd_init_count;
+}
+
+/**
+ * @brief Begin a DnD operation.
+ *
+ * @param data The name pf the Drag operation.
+ * @param size The size of the name.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function start a Drag operation with the name @p data. If
+ * @p data is @c NULL, @c EINA_FALSE is returned. if @p size is less than
+ * @c 0, it is set to the length (as strlen()) of @p data. On success the
+ * function returns @c EINA_TRUE, otherwise it returns @c EINA_FALSE.
+ */
+EAPI Eina_Bool
+ecore_win32_dnd_begin(const char *data,
+                      int         size)
+{
+   IDataObject *pDataObject = NULL;
+   IDropSource *pDropSource = NULL;
+   FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+   STGMEDIUM stgmed = { TYMED_HGLOBAL, { 0 }, 0 };
+   Eina_Bool res = EINA_FALSE;
+
+   if (!data)
+      return EINA_FALSE;
+
+   if (size < 0)
+      size = strlen(data) + 1;
+
+   stgmed.hGlobal = DataToHandle(data, size);
+
+   // create the data object
+   pDataObject = (IDataObject *)_ecore_win32_dnd_data_object_new((void *)&fmtetc,
+                                                                 (void *)&stgmed,
+                                                                 1);
+   pDropSource = (IDropSource *)_ecore_win32_dnd_drop_source_new();
+
+   if (pDataObject && pDropSource)
+   {
+      DWORD dwResult;
+      DWORD dwEffect = DROPEFFECT_COPY;
+
+      // do the drag-drop!
+      dwResult = DoDragDrop(pDataObject, pDropSource, DROPEFFECT_COPY, &dwEffect);
+
+      // finished. Check the return values to see if we need to do anything else
+      if (dwResult == DRAGDROP_S_DROP)
+      {
+         //printf(">>> \"%s\" Dropped <<<\n", str);
+         if(dwEffect == DROPEFFECT_MOVE)
+         {
+            // remove the data we just dropped from active document
+         }
+      }
+      //else if (dwResult == DRAGDROP_S_CANCEL)
+      //   printf("DND cancelled\n");
+      //else
+      //   printf("DND error\n");
+
+      res = EINA_TRUE;
+   }
+
+   _ecore_win32_dnd_data_object_free(pDataObject);
+   _ecore_win32_dnd_drop_source_free(pDropSource);
+
+   // cleanup
+   ReleaseStgMedium(&stgmed);
+
+   return res;
+}
+
+/**
+ * @brief Register a Drop operation.
+ *
+ * @param window The destination of the Drop operation.
+ * @param callback The callback called when the Drop operation
+ * finishes.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ *
+ * This function register a Drop operation on @p window. Once the Drop
+ * operation finishes, @p callback is called. If @p window is @c NULL,
+ * the function returns @c EINA_FALSE. On success, it returns @c EINA_TRUE,
+ * otherwise it returns @c EINA_FALSE.
+ */
+EAPI Eina_Bool
+ecore_win32_dnd_register_drop_target(Ecore_Win32_Window                 *window,
+                                     Ecore_Win32_Dnd_DropTarget_Callback callback)
+{
+   Ecore_Win32_Window *wnd = (Ecore_Win32_Window *)window;
+
+   if (!window)
+      return EINA_FALSE;
+
+   wnd->dnd_drop_target = _ecore_win32_dnd_register_drop_window(wnd->window,
+                                                                callback,
+                                                                (void *)wnd);
+   return wnd->dnd_drop_target ? EINA_TRUE : EINA_FALSE;
+}
+
+/**
+ * @brief Unregister a Drop operation.
+ *
+ * @param window The destination of the Drop operation.
+ *
+ * This function unregister a Drop operation on @p window. If
+ * @p window is @c NULL, the function does nothing.
+ */
+EAPI void
+ecore_win32_dnd_unregister_drop_target(Ecore_Win32_Window *window)
+{
+   Ecore_Win32_Window *wnd = (Ecore_Win32_Window *)window;
+
+   if (!window)
+      return;
+
+   if (wnd->dnd_drop_target)
+      _ecore_win32_dnd_unregister_drop_window(wnd->window, wnd->dnd_drop_target);
+}
+
+/**
+ * @}
+ */
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_data_object.cpp b/src/lib/ecore_win32/ecore_win32_dnd_data_object.cpp
new file mode 100644 (file)
index 0000000..75e26f5
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <ole2.h>
+
+#include "Ecore_Win32.h"
+#include "ecore_win32_private.h"
+
+#include "ecore_win32_dnd_enumformatetc.h"
+#include "ecore_win32_dnd_data_object.h"
+
+
+static HGLOBAL DupGlobalMem(HGLOBAL hMem)
+{
+   DWORD len = (DWORD)GlobalSize(hMem);
+   PVOID source = GlobalLock(hMem);
+   PVOID dest = GlobalAlloc(GMEM_FIXED, len);
+   memcpy(dest, source, len);
+   GlobalUnlock(hMem);
+   return dest;
+}
+
+// structors
+
+DataObject::DataObject(FORMATETC *fmtetc, STGMEDIUM *stgmed, int count)
+{
+   assert(fmtetc != NULL);
+   assert(stgmed != NULL);
+   assert(count > 0);
+
+   // reference count must ALWAYS start at 1
+   ref_count_ = 1;
+   formats_num_ = count;
+
+   format_etc_ = new FORMATETC[count];
+   stg_medium_ = new STGMEDIUM[count];
+
+   for(int i = 0; i < count; i++)
+   {
+      format_etc_[i] = fmtetc[i];
+      stg_medium_[i] = stgmed[i];
+   }
+}
+
+DataObject::~DataObject()
+{
+   delete[] format_etc_;
+   delete[] stg_medium_;
+}
+
+
+// IUnknown
+
+HRESULT DataObject::QueryInterface(REFIID iid, void **ppvObject)
+{
+   // check to see what interface has been requested
+   if ((iid == IID_IDataObject) || (iid == IID_IUnknown))
+   {
+      AddRef();
+      *ppvObject = this;
+      return S_OK;
+   }
+   *ppvObject = 0;
+   return E_NOINTERFACE;
+}
+
+ULONG DataObject::AddRef()
+{
+   return InterlockedIncrement(&ref_count_);
+}
+
+ULONG DataObject::Release()
+{
+   LONG count = InterlockedDecrement(&ref_count_);
+   if(count == 0)
+   {
+      delete this;
+      return 0;
+   }
+   return count;
+}
+
+// IDataObject
+
+HRESULT DataObject::GetData(FORMATETC *pFormatEtc, STGMEDIUM *pMedium)
+{
+   assert(pMedium != NULL);
+   int idx;
+
+   // try to match the specified FORMATETC with one of our supported formats
+   if((idx = lookup_format_etc(pFormatEtc)) == -1)
+      return DV_E_FORMATETC;
+
+   // found a match - transfer data into supplied storage medium
+   pMedium->tymed = format_etc_[idx].tymed;
+   pMedium->pUnkForRelease = 0;
+
+   // copy the data into the caller's storage medium
+   switch(format_etc_[idx].tymed)
+   {
+   case TYMED_HGLOBAL:
+      pMedium->hGlobal = DupGlobalMem(stg_medium_[idx].hGlobal);
+      break;
+
+   default:
+      return DV_E_FORMATETC;
+   }
+
+   return S_OK;
+}
+
+HRESULT DataObject::GetDataHere(FORMATETC *pFormatEtc __UNUSED__, STGMEDIUM *pmedium __UNUSED__)
+{
+   return DATA_E_FORMATETC;
+}
+
+HRESULT DataObject::QueryGetData(FORMATETC *pFormatEtc)
+{
+   return (lookup_format_etc(pFormatEtc) == -1) ? DV_E_FORMATETC : S_OK;
+}
+
+HRESULT DataObject::GetCanonicalFormatEtc(FORMATETC *pFormatEct __UNUSED__, FORMATETC *pFormatEtcOut)
+{
+   // Apparently we have to set this field to NULL even though we don't do anything else
+   pFormatEtcOut->ptd = NULL;
+   return E_NOTIMPL;
+}
+
+HRESULT DataObject::SetData(FORMATETC *pFormatEtc __UNUSED__, STGMEDIUM *pMedium __UNUSED__,  BOOL fRelease __UNUSED__)
+{
+   return E_NOTIMPL;
+}
+
+HRESULT DataObject::EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc)
+{
+   // only the get direction is supported for OLE
+   if(dwDirection == DATADIR_GET)
+   {
+      // for Win2k+ you can use the SHCreateStdEnumFmtEtc API call, however
+      // to support all Windows platforms we need to implement IEnumFormatEtc ourselves.
+      return CreateEnumFormatEtc(formats_num_, format_etc_, ppEnumFormatEtc);
+   }
+   else
+   {
+      // the direction specified is not supported for drag+drop
+      return E_NOTIMPL;
+   }
+}
+
+HRESULT DataObject::DAdvise(FORMATETC *pFormatEtc __UNUSED__,  DWORD advf __UNUSED__, IAdviseSink *, DWORD *)
+{
+   return OLE_E_ADVISENOTSUPPORTED;
+}
+
+HRESULT DataObject::DUnadvise(DWORD dwConnection __UNUSED__)
+{
+   return OLE_E_ADVISENOTSUPPORTED;
+}
+
+HRESULT DataObject::EnumDAdvise(IEnumSTATDATA **ppEnumAdvise __UNUSED__)
+{
+   return OLE_E_ADVISENOTSUPPORTED;
+}
+
+// internal helper function
+
+int DataObject::lookup_format_etc(FORMATETC *pFormatEtc)
+{
+   // check each of our formats in turn to see if one matches
+   for(int i = 0; i < formats_num_; i++)
+   {
+      if((format_etc_[i].tymed & pFormatEtc->tymed) &&
+         (format_etc_[i].cfFormat == pFormatEtc->cfFormat) &&
+         (format_etc_[i].dwAspect == pFormatEtc->dwAspect))
+      {
+         // return index of stored format
+         return i;
+      }
+   }
+
+   // error, format not found
+   return -1;
+}
+
+void *_ecore_win32_dnd_data_object_new(void *fmtetc, void *stgmeds, int count)
+{
+   IDataObject *object = new DataObject((FORMATETC *)fmtetc, (STGMEDIUM *)stgmeds, (UINT)count);
+   assert(object != NULL);
+   return object;
+}
+
+void _ecore_win32_dnd_data_object_free(void *data_object)
+{
+   if (!data_object)
+     return;
+
+   IDataObject *object = (IDataObject *)data_object;
+   object->Release();
+}
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_data_object.h b/src/lib/ecore_win32/ecore_win32_dnd_data_object.h
new file mode 100644 (file)
index 0000000..3d289cf
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef __ECORE_WIN32_DND_DATA_OBJECT_H__
+#define __ECORE_WIN32_DND_DATA_OBJECT_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <objbase.h>
+
+
+class DataObject : public IDataObject
+{
+ private:
+
+   LONG       ref_count_;
+   int        formats_num_;
+   FORMATETC *format_etc_;
+   STGMEDIUM *stg_medium_;
+
+ private: // internal helper function
+
+   int lookup_format_etc(FORMATETC *format_etc);
+
+ public: // structors
+
+   DataObject(FORMATETC *fmtetc, STGMEDIUM *stgmed, int count);
+   ~DataObject();
+
+ public: // IUnknown
+
+   HRESULT __stdcall QueryInterface(REFIID iid, void **ppvObject);
+   ULONG   __stdcall AddRef();
+   ULONG   __stdcall Release();
+
+ public: // IDataObject
+
+   HRESULT __stdcall GetData(FORMATETC *pFormatEtc, STGMEDIUM *pmedium);
+   HRESULT __stdcall GetDataHere(FORMATETC *pFormatEtc, STGMEDIUM *pmedium);
+   HRESULT __stdcall QueryGetData(FORMATETC *pFormatEtc);
+   HRESULT __stdcall GetCanonicalFormatEtc(FORMATETC *pFormatEct, FORMATETC *pFormatEtcOut);
+   HRESULT __stdcall SetData(FORMATETC *pFormatEtc, STGMEDIUM *pMedium,  BOOL fRelease);
+   HRESULT __stdcall EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc);
+   HRESULT __stdcall DAdvise(FORMATETC *pFormatEtc,  DWORD advf, IAdviseSink *, DWORD *);
+   HRESULT __stdcall DUnadvise(DWORD dwConnection);
+   HRESULT __stdcall EnumDAdvise(IEnumSTATDATA **ppEnumAdvise);
+};
+
+
+#endif /* __ECORE_WIN32_DND_DATA_OBJECT_H__ */
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_drop_source.cpp b/src/lib/ecore_win32/ecore_win32_dnd_drop_source.cpp
new file mode 100644 (file)
index 0000000..bea7736
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+
+#include "ecore_win32_dnd_drop_source.h"
+
+#include "ecore_win32_private.h"
+
+// structors
+
+// reference count must ALWAYS start at 1
+DropSource::DropSource() : ref_count_(1)
+{ }
+
+
+// IUnknown
+
+HRESULT DropSource::QueryInterface(REFIID iid, void **ppvObject)
+{
+   // check to see what interface has been requested
+   if (iid == IID_IDropSource || iid == IID_IUnknown)
+   {
+      AddRef();
+      *ppvObject = this;
+      return S_OK;
+   }
+   *ppvObject = 0;
+   return E_NOINTERFACE;
+}
+
+ULONG DropSource::AddRef()
+{
+   return InterlockedIncrement(&ref_count_);
+}
+
+ULONG DropSource::Release()
+{
+   LONG count = InterlockedDecrement(&ref_count_);
+   if(count == 0)
+   {
+      delete this;
+      return 0;
+   }
+   return count;
+}
+
+
+// IDropSource
+
+HRESULT DropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
+{
+    // if the Escape key has been pressed since the last call, cancel the drop
+    if(fEscapePressed == TRUE)
+        return DRAGDROP_S_CANCEL;
+
+    // if the LeftMouse button has been released, then do the drop!
+    if((grfKeyState & MK_LBUTTON) == 0)
+        return DRAGDROP_S_DROP;
+
+    // continue with the drag-drop
+    return S_OK;
+}
+
+HRESULT DropSource::GiveFeedback(DWORD dwEffect __UNUSED__)
+{
+    return DRAGDROP_S_USEDEFAULTCURSORS;
+}
+
+
+// ecore_win32 private functions
+
+void *_ecore_win32_dnd_drop_source_new()
+{
+   IDropSource *object = new DropSource();
+   assert(object != NULL);
+   return object;
+}
+
+void _ecore_win32_dnd_drop_source_free(void *drop_source)
+{
+   if (!drop_source)
+     return;
+
+   IDropSource *object = (IDropSource *)drop_source;
+   object->Release();
+}
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_drop_source.h b/src/lib/ecore_win32/ecore_win32_dnd_drop_source.h
new file mode 100644 (file)
index 0000000..9081f46
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef __ECORE_WIN32_DND_DROP_SOURCE_H__
+#define __ECORE_WIN32_DND_DROP_SOURCE_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <ole2.h>
+
+#include "Ecore_Win32.h"
+
+
+class DropSource : public IDropSource
+{
+ private:
+
+   LONG ref_count_;
+
+ public: // structors
+
+   DropSource();
+
+ public: // IUnknown
+
+   HRESULT __stdcall QueryInterface(REFIID iid, void ** ppvObject);
+   ULONG   __stdcall AddRef();
+   ULONG   __stdcall Release();
+
+ public: // IDropSource
+
+   HRESULT __stdcall QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);
+   HRESULT __stdcall GiveFeedback(DWORD dwEffect);
+};
+
+
+#endif /* __ECORE_WIN32_DND_DROP_SOURCE_H__ */
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_drop_target.cpp b/src/lib/ecore_win32/ecore_win32_dnd_drop_target.cpp
new file mode 100644 (file)
index 0000000..e19fb5d
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "ecore_win32_dnd_drop_target.h"
+
+#include "ecore_win32_private.h"
+
+
+// structors
+
+DropTarget::DropTarget(HWND window, Ecore_Win32_Dnd_DropTarget_Callback callback, void *window_obj_ptr)
+  : ref_count_(1)
+  , window_(window)
+  , allow_drop_(false)
+  , drop_callback_(callback)
+  ,drop_callback_ptr_(window_obj_ptr)
+{ }
+
+
+// IUnknown
+
+HRESULT DropTarget::QueryInterface(REFIID iid, void **ppvObject)
+{
+   // check to see what interface has been requested
+   if (iid == IID_IDropTarget || iid == IID_IUnknown)
+   {
+      AddRef();
+      *ppvObject = this;
+      return S_OK;
+   }
+   *ppvObject = 0;
+
+   return E_NOINTERFACE;
+}
+
+ULONG DropTarget::AddRef()
+{
+   return InterlockedIncrement(&ref_count_);
+}
+
+ULONG DropTarget::Release()
+{
+   LONG count = InterlockedDecrement(&ref_count_);
+   if (count == 0)
+   {
+      delete this;
+      return 0;
+   }
+
+   return count;
+}
+
+
+// IDropTarget
+
+HRESULT DropTarget::DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
+{
+   // does the dataobject contain data we want?
+   allow_drop_ = QueryDataObject(pDataObject) &&
+      (drop_callback_ == NULL ||
+      (drop_callback_(drop_callback_ptr_, ECORE_WIN32_DND_EVENT_DRAG_ENTER, pt.x, pt.y, NULL, 0) != 0));
+
+   if (allow_drop_)
+   {
+      // get the dropeffect based on keyboard state
+      *pdwEffect = DropEffect(grfKeyState, pt, *pdwEffect);
+      SetFocus(window_);
+      //PositionCursor(_hwnd, pt);
+   }
+   else
+      *pdwEffect = DROPEFFECT_NONE;
+   return S_OK;
+}
+
+HRESULT DropTarget::DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
+{
+   allow_drop_ =
+     (drop_callback_ == NULL) ||
+     (drop_callback_(drop_callback_ptr_, ECORE_WIN32_DND_EVENT_DRAG_OVER, pt.x, pt.y, NULL, 0) != 0);
+
+   if (allow_drop_)
+   {
+      *pdwEffect = DropEffect(grfKeyState, pt, *pdwEffect);
+      //PositionCursor(m_hWnd, pt);
+   }
+   else
+   {
+      *pdwEffect = DROPEFFECT_NONE;
+   }
+
+   return S_OK;
+}
+
+HRESULT DropTarget::DragLeave()
+{
+   POINT pt;
+
+   GetCursorPos(&pt);
+   if (drop_callback_ != NULL)
+     drop_callback_(drop_callback_ptr_, ECORE_WIN32_DND_EVENT_DRAG_LEAVE, pt.x, pt.y, NULL, 0);
+
+   return S_OK;
+}
+
+HRESULT DropTarget::Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
+{
+   if (allow_drop_)
+   {
+      // construct a FORMATETC object
+      FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+      STGMEDIUM stgmed;
+
+      // See if the dataobject contains any TEXT stored as a HGLOBAL
+      if (pDataObject->QueryGetData(&fmtetc) == S_OK)
+      {
+         // Yippie! the data is there, so go get it!
+         if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK)
+         {
+            // we asked for the data as a HGLOBAL, so access it appropriately
+            PVOID data = GlobalLock(stgmed.hGlobal);
+            UINT size = GlobalSize(stgmed.hGlobal);
+
+            if (drop_callback_ != NULL)
+            {
+               drop_callback_(drop_callback_ptr_,
+                              ECORE_WIN32_DND_EVENT_DROP,
+                              pt.x, pt.y,
+                              data, size);
+            }
+
+            GlobalUnlock(stgmed.hGlobal);
+
+            // release the data using the COM API
+            ReleaseStgMedium(&stgmed);
+         }
+      }
+      *pdwEffect = DropEffect(grfKeyState, pt, *pdwEffect);
+   }
+   else
+   {
+      *pdwEffect = DROPEFFECT_NONE;
+   }
+
+   return S_OK;
+}
+
+
+// internal helper function
+
+DWORD DropTarget::DropEffect(DWORD grfKeyState, POINTL pt __UNUSED__, DWORD dwAllowed)
+{
+   DWORD dwEffect = 0;
+
+   // 1. check "pt" -> do we allow a drop at the specified coordinates?
+
+   // 2. work out that the drop-effect should be based on grfKeyState
+   if (grfKeyState & MK_CONTROL)
+   {
+          dwEffect = dwAllowed & DROPEFFECT_COPY;
+   }
+   else if (grfKeyState & MK_SHIFT)
+   {
+          dwEffect = dwAllowed & DROPEFFECT_MOVE;
+   }
+
+   // 3. no key-modifiers were specified (or drop effect not allowed), so
+   //    base the effect on those allowed by the dropsource
+   if (dwEffect == 0)
+   {
+          if (dwAllowed & DROPEFFECT_COPY) dwEffect = DROPEFFECT_COPY;
+          if (dwAllowed & DROPEFFECT_MOVE) dwEffect = DROPEFFECT_MOVE;
+   }
+
+   return dwEffect;
+}
+
+bool DropTarget::QueryDataObject(IDataObject *pDataObject)
+{
+    FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+
+    // does the data object support CF_TEXT using a HGLOBAL?
+    return pDataObject->QueryGetData(&fmtetc) == S_OK;
+}
+
+
+// ecore_win32 private functions
+
+void *_ecore_win32_dnd_register_drop_window(HWND hwnd,  Ecore_Win32_Dnd_DropTarget_Callback callback, void *ptr)
+{
+   DropTarget *pDropTarget = new DropTarget(hwnd, callback, ptr);
+
+   if (pDropTarget == NULL)
+     return NULL;
+
+   // acquire a strong lock
+   if (FAILED(CoLockObjectExternal(pDropTarget, TRUE, FALSE)))
+     {
+        delete pDropTarget;
+        return NULL;
+     }
+
+   // tell OLE that the window is a drop target
+   if (FAILED(RegisterDragDrop(hwnd, pDropTarget)))
+     {
+        delete pDropTarget;
+        return NULL;
+     }
+
+   return pDropTarget;
+}
+
+void _ecore_win32_dnd_unregister_drop_window(HWND hwnd, void *drop_target)
+{
+   IDropTarget *pDropTarget = (IDropTarget *)drop_target;
+
+   if (drop_target == NULL)
+     return;
+
+   // remove drag+drop
+   RevokeDragDrop(hwnd);
+
+   // remove the strong lock
+   CoLockObjectExternal(pDropTarget, FALSE, TRUE);
+
+   // release our own reference
+   pDropTarget->Release();
+}
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_drop_target.h b/src/lib/ecore_win32/ecore_win32_dnd_drop_target.h
new file mode 100644 (file)
index 0000000..24c3de3
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef __ECORE_WIN32_DND_DROP_TARGET_H__
+#define __ECORE_WIN32_DND_DROP_TARGET_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <ole2.h>
+
+#include "Ecore_Win32.h"
+
+
+class DropTarget : public IDropTarget
+{
+ private:
+
+   LONG                                ref_count_;
+   HWND                                window_;
+   bool                                allow_drop_;
+   Ecore_Win32_Dnd_DropTarget_Callback drop_callback_;
+   void                               *drop_callback_ptr_;
+
+ private: // internal helper function
+
+   DWORD DropEffect(DWORD grfKeyState, POINTL pt, DWORD dwAllowed);
+   bool  QueryDataObject(IDataObject *pDataObject);
+
+ public: // structors
+
+   DropTarget(HWND hwnd, Ecore_Win32_Dnd_DropTarget_Callback callback, void *window_obj_ptr);
+
+public: // IUnknown
+
+   HRESULT __stdcall QueryInterface(REFIID iid, void ** ppvObject);
+   ULONG   __stdcall AddRef();
+   ULONG   __stdcall Release();
+
+ public: // IDropTarget
+
+   HRESULT __stdcall DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
+   HRESULT __stdcall DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
+   HRESULT __stdcall DragLeave();
+   HRESULT __stdcall Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
+};
+
+
+#endif /* __ECORE_WIN32_DND_DROP_TARGET_H__ */
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.cpp b/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.cpp
new file mode 100644 (file)
index 0000000..a3858bc
--- /dev/null
@@ -0,0 +1,157 @@
+
+#include <ole2.h>
+
+#include "ecore_win32_dnd_enumformatetc.h"
+
+
+// structors
+
+CEnumFormatEtc::CEnumFormatEtc(FORMATETC *format_etc, int formats_num)
+  : ref_count_(1)
+  , index_(0)
+  , formats_num_(formats_num)
+  , format_etc_(new FORMATETC[formats_num])
+{
+   // make a new copy of each FORMATETC structure
+   for (unsigned int i = 0; i < formats_num_; i++)
+     {
+        DeepCopyFormatEtc(&format_etc_[i], &format_etc[i]);
+     }
+}
+
+CEnumFormatEtc::~CEnumFormatEtc()
+{
+   if (format_etc_)
+     {
+        // first free any DVTARGETDEVICE structures
+        for (ULONG i = 0; i < formats_num_; i++)
+          {
+             if (format_etc_[i].ptd)
+               CoTaskMemFree(format_etc_[i].ptd);
+          }
+
+        // now free the main array
+        delete[] format_etc_;
+     }
+}
+
+// IUnknown
+
+ULONG __stdcall CEnumFormatEtc::AddRef(void)
+{
+   // increment object reference count
+   return InterlockedIncrement(&ref_count_);
+}
+
+ULONG __stdcall CEnumFormatEtc::Release(void)
+{
+   // decrement object reference count
+   LONG count = InterlockedDecrement(&ref_count_);
+
+   if (count == 0)
+     {
+        delete this;
+        return 0;
+     }
+   else
+     {
+        return count;
+     }
+}
+
+HRESULT __stdcall CEnumFormatEtc::QueryInterface(REFIID iid, void **ppvObject)
+{
+   // check to see what interface has been requested
+   if ((iid == IID_IEnumFORMATETC) || (iid == IID_IUnknown))
+     {
+        AddRef();
+        *ppvObject = this;
+        return S_OK;
+     }
+   else
+     {
+        *ppvObject = 0;
+        return E_NOINTERFACE;
+     }
+}
+
+// IEnumFormatEtc
+
+HRESULT CEnumFormatEtc::Reset(void)
+{
+   index_ = 0;
+   return S_OK;
+}
+
+HRESULT CEnumFormatEtc::Skip(ULONG celt)
+{
+   index_ += celt;
+   return (index_ <= formats_num_) ? S_OK : S_FALSE;
+}
+
+HRESULT CEnumFormatEtc::Clone(IEnumFORMATETC **ppEnumFormatEtc)
+{
+   HRESULT hResult;
+
+   // make a duplicate enumerator
+   hResult = CreateEnumFormatEtc(formats_num_, format_etc_, ppEnumFormatEtc);
+
+   if (hResult == S_OK)
+     {
+        // manually set the index state
+        ((CEnumFormatEtc *)*ppEnumFormatEtc)->index_ = index_;
+     }
+
+   return hResult;
+}
+
+HRESULT CEnumFormatEtc::Next(ULONG celt, FORMATETC *pFormatEtc, ULONG *pceltFetched)
+{
+   ULONG copied = 0;
+
+   // validate arguments
+   if ((celt == 0) || (pFormatEtc == 0))
+     return E_INVALIDARG;
+
+   // copy the FORMATETC structures into the caller's buffer
+   while (index_ < formats_num_ && copied < celt)
+     {
+        DeepCopyFormatEtc(&pFormatEtc[copied], &format_etc_[index_]);
+        copied++;
+        index_++;
+     }
+
+   // store result
+   if (pceltFetched != 0)
+     *pceltFetched = copied;
+
+   // did we copy all that was requested?
+   return (copied == celt) ? S_OK : S_FALSE;
+}
+
+// external functions
+
+void DeepCopyFormatEtc(FORMATETC *dest, FORMATETC *source)
+{
+   // copy the source FORMATETC into dest
+   *dest = *source;
+
+   if (source->ptd)
+     {
+        // allocate memory for the DVTARGETDEVICE if necessary
+        dest->ptd = (DVTARGETDEVICE*)CoTaskMemAlloc(sizeof(DVTARGETDEVICE));
+
+        // copy the contents of the source DVTARGETDEVICE into dest->ptd
+        *(dest->ptd) = *(source->ptd);
+     }
+}
+
+HRESULT CreateEnumFormatEtc(UINT cfmt, FORMATETC *afmt, IEnumFORMATETC **ppEnumFormatEtc)
+{
+  if((cfmt == 0) || (afmt == 0) || (ppEnumFormatEtc == 0))
+     return E_INVALIDARG;
+
+   *ppEnumFormatEtc = new CEnumFormatEtc(afmt, cfmt);
+
+   return (*ppEnumFormatEtc) ? S_OK : E_OUTOFMEMORY;
+}
diff --git a/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.h b/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.h
new file mode 100644 (file)
index 0000000..9f17f56
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef __ECORE_WIN32_DND_ENUMFORMATETC_H__
+#define __ECORE_WIN32_DND_ENUMFORMATETC_H__
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <objbase.h>
+
+
+class CEnumFormatEtc : public IEnumFORMATETC
+{
+ private:
+
+   LONG       ref_count_;        // Reference count for this COM interface
+   ULONG      index_;           // current enumerator index
+   ULONG      formats_num_;      // number of FORMATETC members
+   FORMATETC *format_etc_;       // array of FORMATETC objects
+
+ public: // structors
+
+   CEnumFormatEtc(FORMATETC *pFormatEtc, int nNumFormats);
+
+   ~CEnumFormatEtc();
+
+ public: // IUnknown
+
+   HRESULT __stdcall  QueryInterface (REFIID iid, void ** ppvObject);
+
+   ULONG   __stdcall  AddRef (void);
+
+   ULONG   __stdcall  Release (void);
+
+ public: // IEnumFormatEtc
+
+   HRESULT __stdcall  Next  (ULONG celt, FORMATETC * rgelt, ULONG * pceltFetched);
+
+   HRESULT __stdcall  Skip  (ULONG celt);
+
+   HRESULT __stdcall  Reset (void);
+
+   HRESULT __stdcall  Clone (IEnumFORMATETC ** ppEnumFormatEtc);
+};
+
+void DeepCopyFormatEtc(FORMATETC *dest, FORMATETC *source);
+
+HRESULT CreateEnumFormatEtc(UINT cfmt, FORMATETC *afmt, IEnumFORMATETC **ppEnumFormatEtc);
+
+
+#endif /* __ECORE_WIN32_DND_ENUMFORMATETC_H__ */
index 4b0b342..4476b2b 100644 (file)
@@ -1,7 +1,3 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 #undef WIN32_LEAN_AND_MEAN
 #include <windowsx.h>
 
-#include "Ecore.h"
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+
 #include "Ecore_Win32.h"
 #include "ecore_win32_private.h"
 
 
+typedef enum
+{
+   ECORE_WIN32_KEY_MASK_LSHIFT = 1 << 0,
+   ECORE_WIN32_KEY_MASK_RSHIFT = 1 << 1,
+   ECORE_WIN32_KEY_MASK_LCONTROL = 1 << 2,
+   ECORE_WIN32_KEY_MASK_RCONTROL = 1 << 3,
+   ECORE_WIN32_KEY_MASK_LMENU = 1 << 4,
+   ECORE_WIN32_KEY_MASK_RMENU = 1 << 5
+} Ecore_Win32_Key_Mask;
+
 /***** Private declarations *****/
 
 
-static Ecore_Win32_Window *_ecore_win32_mouse_down_last_window = NULL;
-static Ecore_Win32_Window *_ecore_win32_mouse_down_last_last_window = NULL;
-static double              _ecore_win32_mouse_down_last_time = 0;
-static double              _ecore_win32_mouse_down_last_last_time = 0;
-static int                 _ecore_win32_mouse_down_did_triple = 0;
-static int                 _ecore_win32_mouse_up_count = 0;
+static Ecore_Win32_Window  *_ecore_win32_mouse_down_last_window = NULL;
+static Ecore_Win32_Window  *_ecore_win32_mouse_down_last_last_window = NULL;
+static long                 _ecore_win32_mouse_down_last_time = 0  ;
+static long                 _ecore_win32_mouse_down_last_last_time = 0  ;
+static int                  _ecore_win32_mouse_down_did_triple = 0;
+static int                  _ecore_win32_mouse_up_count = 0;
+static Ecore_Win32_Key_Mask _ecore_win32_key_mask = 0;
 
 static void _ecore_win32_event_free_key_down(void *data,
                                              void *ev);
@@ -35,15 +45,18 @@ static void _ecore_win32_event_free_key_down(void *data,
 static void _ecore_win32_event_free_key_up(void *data,
                                            void *ev);
 
-static int  _ecore_win32_event_keystroke_get(int    key,
-                                             char **keyname,
-                                             char **keysymbol,
-                                             char **keycompose);
+static int  _ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
+                                             Eina_Bool                  is_down,
+                                             char                     **keyname,
+                                             char                     **keysymbol,
+                                             char                     **keycompose,
+                                             unsigned int              *modifiers);
 
-static int  _ecore_win32_event_char_get(int    key,
-                                        char **keyname,
-                                        char **keysymbol,
-                                        char **keycompose);
+static int  _ecore_win32_event_char_get(int           key,
+                                        char        **keyname,
+                                        char        **keysymbol,
+                                        char        **keycompose,
+                                        unsigned int *modifiers);
 
 
 /***** Global functions definitions *****/
@@ -52,94 +65,94 @@ void
 _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg,
                                     int                        is_keystroke)
 {
-   Ecore_Win32_Event_Key_Down *e;
+   Ecore_Event_Key *e;
 
-   e = (Ecore_Win32_Event_Key_Down *)malloc(sizeof(Ecore_Win32_Event_Key_Down));
+   INF("key pressed");
+
+   e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
    if (!e) return;
 
    if (is_keystroke)
      {
-        if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
-                                              &e->keyname,
-                                              &e->keysymbol,
-                                              &e->keycompose))
+        if (!_ecore_win32_event_keystroke_get(msg,
+                                              EINA_TRUE,
+                                              (char **)&e->keyname,
+                                              (char **)&e->key,
+                                              (char **)&e->string,
+                                              &e->modifiers))
           {
              free(e);
              return;
           }
-        goto store_key;
      }
    else
      {
         if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
-                                         &e->keyname,
-                                         &e->keysymbol,
-                                         &e->keycompose))
+                                         (char **)&e->keyname,
+                                         (char **)&e->key,
+                                         (char **)&e->string,
+                                         &e->modifiers))
           {
              free(e);
              return;
           }
      }
 
- store_key:
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
    if (!e->window)
      {
         free(e);
         return;
      }
-   e->time = (double)msg->time / 1000.0;
+   e->event_window = e->window;
+   e->timestamp = msg->timestamp;
 
-   _ecore_win32_event_last_time = e->time;
+   _ecore_win32_event_last_time = e->timestamp;
 
-   ecore_event_add(ECORE_WIN32_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL);
+   ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL);
 }
 
 void
-_ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg,
-                                      int                        is_keystroke)
+_ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg)
 {
-   Ecore_Win32_Event_Key_Up *e;
+   Ecore_Event_Key *e;
+
+   INF("key released");
 
-   e = (Ecore_Win32_Event_Key_Up *)calloc(1, sizeof(Ecore_Win32_Event_Key_Up));
+   e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
    if (!e) return;
 
-   if (is_keystroke)
-     {
-        if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
-                                              &e->keyname,
-                                              &e->keysymbol,
-                                              &e->keycompose))
-          {
-             free(e);
-             return;
-          }
-        goto store_key;
-     }
-   else
+   if (!_ecore_win32_event_keystroke_get(msg,
+                                         EINA_FALSE,
+                                         (char **)&e->keyname,
+                                         (char **)&e->key,
+                                         (char **)&e->string,
+                                         &e->modifiers))
      {
-        if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
-                                         &e->keyname,
-                                         &e->keysymbol,
-                                         &e->keycompose))
+        if (msg->discard_ctrl ||
+            !_ecore_win32_event_char_get(LOWORD(msg->window_param),
+                                         (char **)&e->keyname,
+                                         (char **)&e->key,
+                                         (char **)&e->string,
+                                         &e->modifiers))
           {
              free(e);
              return;
           }
      }
 
- store_key:
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
    if (!e->window)
      {
         free(e);
         return;
      }
-   e->time = (double)msg->time / 1000.0;
+   e->event_window = e->window;
+   e->timestamp = msg->timestamp;
 
-   _ecore_win32_event_last_time = e->time;
+   _ecore_win32_event_last_time = e->timestamp;
 
-   ecore_event_add(ECORE_WIN32_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL);
+   ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL);
 }
 
 void
@@ -148,74 +161,79 @@ _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
 {
    Ecore_Win32_Window *window;
 
-   window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   INF("mouse button pressed");
+
+   window = (Ecore_Win32_Window *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
    if (button > 3)
      {
-        Ecore_Win32_Event_Mouse_Wheel *e;
+        Ecore_Event_Mouse_Wheel *e;
 
-        e = (Ecore_Win32_Event_Mouse_Wheel *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Wheel));
+        e = (Ecore_Event_Mouse_Wheel *)calloc(1, sizeof(Ecore_Event_Mouse_Wheel));
         if (!e) return;
 
-        e->window = window;
-       e->direction = 0;
+        e->window = (Ecore_Window)window;
+        e->event_window = e->window;
+        e->direction = 0;
         /* wheel delta is positive or negative, never 0 */
-       e->z = GET_WHEEL_DELTA_WPARAM(msg->window_param) > 0 ? -1 : 1;
-       e->x = GET_X_LPARAM(msg->data_param);
-       e->y = GET_Y_LPARAM(msg->data_param);
-        e->time = (double)msg->time / 1000.0;
+        e->z = GET_WHEEL_DELTA_WPARAM(msg->window_param) > 0 ? -1 : 1;
+        e->x = GET_X_LPARAM(msg->data_param);
+        e->y = GET_Y_LPARAM(msg->data_param);
+        e->timestamp = msg->timestamp;
 
-        _ecore_win32_event_last_time = e->time;
-        _ecore_win32_event_last_window = e->window;
+        _ecore_win32_event_last_time = e->timestamp;
+        _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
 
-        ecore_event_add(ECORE_WIN32_EVENT_MOUSE_WHEEL, e, NULL, NULL);
+        ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
      }
    else
      {
        {
-          Ecore_Win32_Event_Mouse_Move *e;
+          Ecore_Event_Mouse_Move *e;
 
-          e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
+          e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
           if (!e) return;
 
-          e->window = window;
+          e->window = (Ecore_Window)window;
+          e->event_window = e->window;
           e->x = GET_X_LPARAM(msg->data_param);
           e->y = GET_Y_LPARAM(msg->data_param);
-          e->time = (double)msg->time / 1000.0;
+          e->timestamp = msg->timestamp;
 
-          _ecore_win32_event_last_time = e->time;
-          _ecore_win32_event_last_window = e->window;
+          _ecore_win32_event_last_time = e->timestamp;
+          _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
 
-          ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
+          ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
        }
 
        {
-          Ecore_Win32_Event_Mouse_Button_Down *e;
+          Ecore_Event_Mouse_Button *e;
 
           if (_ecore_win32_mouse_down_did_triple)
             {
                _ecore_win32_mouse_down_last_window = NULL;
                _ecore_win32_mouse_down_last_last_window = NULL;
-               _ecore_win32_mouse_down_last_time = 0.0;
-               _ecore_win32_mouse_down_last_last_time = 0.0;
+               _ecore_win32_mouse_down_last_time = 0;
+               _ecore_win32_mouse_down_last_last_time = 0;
             }
 
-          e = (Ecore_Win32_Event_Mouse_Button_Down *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Button_Down));
+          e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
           if (!e) return;
 
-          e->window = window;
-          e->button = button;
+          e->window = (Ecore_Window)window;
+          e->event_window = e->window;
+          e->buttons = button;
           e->x = GET_X_LPARAM(msg->data_param);
           e->y = GET_Y_LPARAM(msg->data_param);
-          e->time = (double)msg->time / 1000.0;
+          e->timestamp = msg->timestamp;
 
-          if (((e->time - _ecore_win32_mouse_down_last_time) <= _ecore_win32_double_click_time) &&
-              (e->window == _ecore_win32_mouse_down_last_window))
+          if (((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) &&
+              (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window))
             e->double_click = 1;
 
-          if (((e->time - _ecore_win32_mouse_down_last_last_time) <= (2.0 * _ecore_win32_double_click_time)) &&
-              (e->window == _ecore_win32_mouse_down_last_window) &&
-              (e->window == _ecore_win32_mouse_down_last_last_window))
+          if (((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) &&
+              (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) &&
+              (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window))
             {
                e->triple_click = 1;
                _ecore_win32_mouse_down_did_triple = 1;
@@ -226,116 +244,123 @@ _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
           if (!e->double_click && !e->triple_click)
             _ecore_win32_mouse_up_count = 0;
 
-          _ecore_win32_event_last_time = e->time;
-          _ecore_win32_event_last_window = e->window;
+          _ecore_win32_event_last_time = e->timestamp;
+          _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
 
           if (!_ecore_win32_mouse_down_did_triple)
             {
                _ecore_win32_mouse_down_last_last_window = _ecore_win32_mouse_down_last_window;
-               _ecore_win32_mouse_down_last_window = e->window;
+               _ecore_win32_mouse_down_last_window = (Ecore_Win32_Window *)e->window;
                _ecore_win32_mouse_down_last_last_time = _ecore_win32_mouse_down_last_time;
-               _ecore_win32_mouse_down_last_time = e->time;
+               _ecore_win32_mouse_down_last_time = e->timestamp;
             }
 
-          ecore_event_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
+          ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
        }
      }
-/*    printf (" * ecore event button press\n"); */
 }
 
 void
 _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg,
-                                         int                          button)
+                                         int                        button)
 {
    Ecore_Win32_Window *window;
 
-   window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   INF("mouse button released");
+
+   window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
    {
-      Ecore_Win32_Event_Mouse_Move *e;
+      Ecore_Event_Mouse_Move *e;
 
-      e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
+      e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
       if (!e) return;
 
-      e->window = window;
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
       e->x = GET_X_LPARAM(msg->data_param);
       e->y = GET_Y_LPARAM(msg->data_param);
-      e->time = (double)msg->time / 1000.0;
+      e->timestamp = msg->timestamp;
 
-      _ecore_win32_event_last_time = e->time;
-      _ecore_win32_event_last_window = e->window;
+      _ecore_win32_event_last_time = e->timestamp;
+      _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
 
-      ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
+      ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
    }
 
    {
-      Ecore_Win32_Event_Mouse_Button_Up *e;
+      Ecore_Event_Mouse_Button *e;
 
-      e = (Ecore_Win32_Event_Mouse_Button_Up *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Button_Up));
+      e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
       if (!e) return;
 
-      e->window = window;
-      e->button = button;
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
+      e->buttons = button;
       e->x = GET_X_LPARAM(msg->data_param);
       e->y = GET_Y_LPARAM(msg->data_param);
-      e->time = (double)msg->time / 1000.0;
+      e->timestamp = msg->timestamp;
 
       _ecore_win32_mouse_up_count++;
 
       if ((_ecore_win32_mouse_up_count >= 2) &&
-          ((e->time - _ecore_win32_mouse_down_last_time) <= _ecore_win32_double_click_time) &&
-          (e->window == _ecore_win32_mouse_down_last_window))
+          ((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) &&
+          (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window))
         e->double_click = 1;
 
       if ((_ecore_win32_mouse_up_count >= 3) &&
-          ((e->time - _ecore_win32_mouse_down_last_last_time) <= (2.0 * _ecore_win32_double_click_time)) &&
-          (e->window == _ecore_win32_mouse_down_last_window) &&
-          (e->window == _ecore_win32_mouse_down_last_last_window))
+          ((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) &&
+          (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) &&
+          (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window))
         e->triple_click = 1;
 
-      _ecore_win32_event_last_time = e->time;
-      _ecore_win32_event_last_window = e->window;
+      _ecore_win32_event_last_time = e->timestamp;
+      _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
 
-      ecore_event_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
+      ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
    }
-
-/*    printf (" * ecore event button release\n"); */
 }
 
 void
 _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg)
 {
-   Ecore_Win32_Event_Mouse_Move *e;
+   Ecore_Event_Mouse_Move *e;
+
+   INF("mouse moved");
 
-   e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
+   e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
+   e->event_window = e->window;
    e->x = GET_X_LPARAM(msg->data_param);
    e->y = GET_Y_LPARAM(msg->data_param);
-   e->time = (double)msg->time / 1000.0;
+   e->timestamp = msg->timestamp;
 
-   ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
+   ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
 }
 
 void
 _ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg)
 {
   {
-     Ecore_Win32_Event_Mouse_Move *e;
+     Ecore_Event_Mouse_Move *e;
+
+     INF("mouse in");
 
-     e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
+     e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
      if (!e) return;
 
-     e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+     e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
+     e->event_window = e->window;
      e->x = msg->x;
      e->y = msg->y;
-     e->time = (double)msg->time / 1000.0;
+     e->timestamp = msg->timestamp;
 
-     _ecore_win32_event_last_time = e->time;
-     _ecore_win32_event_last_window = e->window;
+     _ecore_win32_event_last_time = e->timestamp;
+     _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
 
-     ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
+     ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
   }
 
   {
@@ -344,12 +369,12 @@ _ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg)
      e = (Ecore_Win32_Event_Mouse_In *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_In));
      if (!e) return;
 
-     e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+     e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
      e->x = msg->x;
      e->y = msg->y;
-     e->time = (double)msg->time / 1000.0;
+     e->timestamp = msg->timestamp ;
 
-     _ecore_win32_event_last_time = e->time;
+     _ecore_win32_event_last_time = e->timestamp;
 
      ecore_event_add(ECORE_WIN32_EVENT_MOUSE_IN, e, NULL, NULL);
   }
@@ -359,20 +384,23 @@ void
 _ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg)
 {
   {
-     Ecore_Win32_Event_Mouse_Move *e;
+     Ecore_Event_Mouse_Move *e;
 
-     e = (Ecore_Win32_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Move));
+     INF("mouse out");
+
+     e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
      if (!e) return;
 
-     e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+     e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
+     e->event_window = e->window;
      e->x = msg->x;
      e->y = msg->y;
-     e->time = (double)msg->time / 1000.0;
+     e->timestamp = msg->timestamp;
 
-     _ecore_win32_event_last_time = e->time;
-     _ecore_win32_event_last_window = e->window;
+     _ecore_win32_event_last_time = e->timestamp;
+     _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
 
-     ecore_event_add(ECORE_WIN32_EVENT_MOUSE_MOVE, e, NULL, NULL);
+     ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
   }
 
   {
@@ -381,12 +409,12 @@ _ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg)
      e = (Ecore_Win32_Event_Mouse_Out *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Out));
      if (!e) return;
 
-     e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+     e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
      e->x = msg->x;
      e->y = msg->y;
-     e->time = (double)msg->time / 1000.0;
+     e->timestamp = msg->timestamp;
 
-     _ecore_win32_event_last_time = e->time;
+     _ecore_win32_event_last_time = e->timestamp;
 
      ecore_event_add(ECORE_WIN32_EVENT_MOUSE_OUT, e, NULL, NULL);
   }
@@ -397,13 +425,15 @@ _ecore_win32_event_handle_focus_in(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Focus_In *e;
 
+   INF("focus in");
+
    e = (Ecore_Win32_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_In));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
-   e->time = _ecore_win32_event_last_time;
-   _ecore_win32_event_last_time = e->time;
+   e->timestamp = _ecore_win32_event_last_time;
+   _ecore_win32_event_last_time = e->timestamp;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
 }
@@ -413,13 +443,15 @@ _ecore_win32_event_handle_focus_out(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Focus_Out *e;
 
+   INF("focus out");
+
    e = (Ecore_Win32_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_Out));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
-   e->time = _ecore_win32_event_last_time;
-   _ecore_win32_event_last_time = e->time;
+   e->timestamp = _ecore_win32_event_last_time;
+   _ecore_win32_event_last_time = e->timestamp;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
 }
@@ -429,18 +461,19 @@ _ecore_win32_event_handle_expose(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Damage *e;
 
+   INF("window expose");
+
    e = (Ecore_Win32_Event_Window_Damage *)calloc(1, sizeof(Ecore_Win32_Event_Window_Damage));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
    e->x = msg->update.left;
    e->y = msg->update.top;
    e->width = msg->update.right - msg->update.left;
    e->height = msg->update.bottom - msg->update.top;
-/*    printf (" * ecore : event expose %d %d\n", e->width, e->height); */
 
-   e->time = _ecore_win32_event_last_time;
+   e->timestamp = _ecore_win32_event_last_time;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
 }
@@ -450,12 +483,14 @@ _ecore_win32_event_handle_create_notify(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Create *e;
 
+   INF("window create notify");
+
    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Create));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
-   e->time = _ecore_win32_event_last_time;
+   e->timestamp = _ecore_win32_event_last_time;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CREATE, e, NULL, NULL);
 }
@@ -465,12 +500,14 @@ _ecore_win32_event_handle_destroy_notify(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Destroy *e;
 
+   INF("window destroy notify");
+
    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Destroy));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
-   e->time = _ecore_win32_event_last_time;
+   e->timestamp = _ecore_win32_event_last_time;
    if (e->window == _ecore_win32_event_last_window) _ecore_win32_event_last_window = NULL;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, e, NULL, NULL);
@@ -481,12 +518,14 @@ _ecore_win32_event_handle_map_notify(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Show *e;
 
+   INF("window map notify");
+
    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Show));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
-   e->time = _ecore_win32_event_last_time;
+   e->timestamp = _ecore_win32_event_last_time;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_SHOW, e, NULL, NULL);
 }
@@ -496,12 +535,14 @@ _ecore_win32_event_handle_unmap_notify(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Hide *e;
 
+   INF("window unmap notify");
+
    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Hide));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
 
-   e->time = _ecore_win32_event_last_time;
+   e->timestamp = _ecore_win32_event_last_time;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_HIDE, e, NULL, NULL);
 }
@@ -513,6 +554,8 @@ _ecore_win32_event_handle_configure_notify(Ecore_Win32_Callback_Data *msg)
    Ecore_Win32_Event_Window_Configure *e;
    WINDOWPOS                          *window_pos;
 
+   INF("window configure notify");
+
    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Configure));
    if (!e) return;
 
@@ -524,14 +567,13 @@ _ecore_win32_event_handle_configure_notify(Ecore_Win32_Callback_Data *msg)
         return;
      }
 
-/*    printf ("_ecore_win32_event_handle_configure_notify\n"); */
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
-   e->abovewin = (void *)GetWindowLong(window_pos->hwndInsertAfter, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
+   e->abovewin = (void *)GetWindowLongPtr(window_pos->hwndInsertAfter, GWLP_USERDATA);
    e->x = wi.rcClient.left;
    e->y = wi.rcClient.top;
    e->width = wi.rcClient.right - wi.rcClient.left;
    e->height = wi.rcClient.bottom - wi.rcClient.top;
-   e->time = _ecore_win32_event_last_time;
+   e->timestamp = _ecore_win32_event_last_time;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
 }
@@ -542,17 +584,18 @@ _ecore_win32_event_handle_resize(Ecore_Win32_Callback_Data *msg)
    RECT                             rect;
    Ecore_Win32_Event_Window_Resize *e;
 
+   INF("window resize");
+
    if (!GetClientRect(msg->window, &rect))
      return;
 
    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Resize));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
    e->width = rect.right - rect.left;
    e->height = rect.bottom - rect.top;
-   e->time = _ecore_win32_event_last_time;
-/*    printf (" * _ecore_win32_event_handle_resize %d %d\n", e->width, e->height); */
+   e->timestamp = _ecore_win32_event_last_time;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_RESIZE, e, NULL, NULL);
 }
@@ -562,11 +605,13 @@ _ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg)
 {
    Ecore_Win32_Event_Window_Delete_Request *e;
 
+   INF("window delete request");
+
    e = calloc(1, sizeof(Ecore_Win32_Event_Window_Delete_Request));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
-   e->time = _ecore_win32_event_last_time;
+   e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
+   e->timestamp = _ecore_win32_event_last_time;
 
    ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
 }
@@ -575,40 +620,51 @@ _ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg)
 /***** Private functions definitions *****/
 
 static void
-_ecore_win32_event_free_key_down(void *data,
+_ecore_win32_event_free_key_down(void *data __UNUSED__,
                                  void *ev)
 {
-   Ecore_Win32_Event_Key_Down *e;
+   Ecore_Event_Key *e;
 
    e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->keycompose) free(e->keycompose);
+   if (e->keyname) free((char *)e->keyname);
+   if (e->key) free((char *)e->key);
+   if (e->string) free((char *)e->string);
    free(e);
 }
 
 static void
-_ecore_win32_event_free_key_up(void *data,
+_ecore_win32_event_free_key_up(void *data __UNUSED__,
                                void *ev)
 {
-   Ecore_Win32_Event_Key_Up *e;
+   Ecore_Event_Key *e;
 
    e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->keycompose) free(e->keycompose);
+   if (e->keyname) free((char *)e->keyname);
+   if (e->key) free((char *)e->key);
+   if (e->string) free((char *)e->string);
    free(e);
 }
 
 static int
-_ecore_win32_event_keystroke_get(int    key,
-                                 char **keyname,
-                                 char **keysymbol,
-                                 char **keycompose)
+_ecore_win32_event_keystroke_get(Ecore_Win32_Callback_Data *msg,
+                                 Eina_Bool     is_down,
+                                 char        **keyname,
+                                 char        **keysymbol,
+                                 char        **keycompose,
+                                 unsigned int *modifiers)
 {
-  char *kn;
-  char *ks;
-  char *kc;
+  WCHAR buf[3];
+  char delete_string[2] = { 0x7f, 0 };
+  char *kn = NULL;
+  char *ks = NULL;
+  char *kc = NULL;
+  int key;
+  int is_extended;
+  int previous_key_state;
+
+  key = msg->window_param;
+  is_extended = msg->data_param & 0x01000000;
+  previous_key_state = msg->data_param & 0x40000000;
 
   *keyname = NULL;
   *keysymbol = NULL;
@@ -618,55 +674,337 @@ _ecore_win32_event_keystroke_get(int    key,
      {
        /* Keystroke */
      case VK_PRIOR:
-       kn = "KP_Prior";
-       ks = "KP_Prior";
-       kc = "";
+       if (is_extended)
+         {
+            kn = "Prior";
+            ks = "Prior";
+            kc = NULL;
+         }
+       else
+         {
+            kn = "KP_Prior";
+            ks = "KP_9";
+            kc = "KP_Prior";
+         }
        break;
      case VK_NEXT:
-       kn = "KP_Next";
-       ks = "KP_Next";
-       kc = "";
+       if (is_extended)
+         {
+            kn = "Next";
+            ks = "Next";
+            kc = NULL;
+         }
+       else
+         {
+            kn = "KP_Next";
+            ks = "KP_3";
+            kc = "KP_Next";
+         }
        break;
      case VK_END:
-       kn = "KP_End";
-       ks = "KP_End";
-       kc = "";
+       if (is_extended)
+         {
+            kn = "End";
+            ks = "End";
+            kc = NULL;
+         }
+       else
+         {
+            kn = "KP_End";
+            ks = "KP_1";
+            kc = "KP_End";
+         }
        break;
      case VK_HOME:
-       kn = "KP_Home";
-       ks = "KP_Home";
-       kc = "";
+       if (is_extended)
+         {
+            kn = "Home";
+            ks = "Home";
+            kc = NULL;
+         }
+       else
+         {
+            kn = "KP_Home";
+            ks = "KP_7";
+            kc = "KP_Home";
+         }
        break;
      case VK_LEFT:
-       kn = "KP_Left";
-       ks = "KP_Left";
-       kc = "";
+       if (is_extended)
+         {
+            kn = "Left";
+            ks = "Left";
+            kc = NULL;
+         }
+       else
+         {
+            kn = "KP_Left";
+            ks = "KP_4";
+            kc = "KP_Left";
+         }
        break;
      case VK_UP:
-       kn = "KP_Up";
-       ks = "KP_Up";
-       kc = "";
+       if (is_extended)
+         {
+            kn = "Up";
+            ks = "Up";
+            kc = NULL;
+         }
+       else
+         {
+            kn = "KP_Up";
+            ks = "KP_8";
+            kc = "KP_Up";
+         }
        break;
      case VK_RIGHT:
-       kn = "KP_Right";
-       ks = "KP_Right";
-       kc = "";
+       if (is_extended)
+         {
+           kn = "Right";
+           ks = "Right";
+           kc = NULL;
+         }
+       else
+         {
+           kn = "KP_Right";
+           ks = "KP_6";
+           kc = "KP_Right";
+         }
        break;
      case VK_DOWN:
-       kn = "KP_Down";
-       ks = "KP_Down";
-       kc = "";
+       if (is_extended)
+         {
+           kn = "Down";
+           ks = "Down";
+           kc = NULL;
+         }
+       else
+         {
+           kn = "KP_Down";
+           ks = "KP_2";
+           kc = "KP_Down";
+         }
        break;
      case VK_INSERT:
-       kn = "KP_Insert";
-       ks = "KP_Insert";
-       kc = "";
+       if (is_extended)
+         {
+           kn = "Insert";
+           ks = "Insert";
+           kc = NULL;
+         }
+       else
+         {
+           kn = "KP_Insert";
+           ks = "KP_0";
+           kc = "KP_Insert";
+         }
        break;
      case VK_DELETE:
-       kn = "KP_Delete";
-       ks = "KP_Delete";
-       kc = "";
+       if (is_extended)
+         {
+           kn = "Delete";
+           ks = "Delete";
+           kc = delete_string;
+         }
+       else
+         {
+           kn = "KP_Delete";
+           ks = "KP_Decimal";
+           kc = "KP_Delete";
+         }
        break;
+     case VK_SHIFT:
+       {
+          SHORT res;
+
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               res = GetKeyState(VK_LSHIFT);
+               if (res & 0x8000)
+                 {
+                    _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LSHIFT;
+                    kn = "Shift_L";
+                    ks = "Shift_L";
+                    kc = "";
+                 }
+               res = GetKeyState(VK_RSHIFT);
+               if (res & 0x8000)
+                 {
+                    _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RSHIFT;
+                    kn = "Shift_R";
+                    ks = "Shift_R";
+                    kc = "";
+                 }
+               *modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
+            }
+          else /* is_up */
+            {
+               res = GetKeyState(VK_LSHIFT);
+               if (!(res & 0x8000) &&
+                   (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LSHIFT))
+                 {
+                    kn = "Shift_L";
+                    ks = "Shift_L";
+                    kc = "";
+                    _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LSHIFT;
+                 }
+               res = GetKeyState(VK_RSHIFT);
+               if (!(res & 0x8000) &&
+                   (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RSHIFT))
+                 {
+                    kn = "Shift_R";
+                    ks = "Shift_R";
+                    kc = "";
+                    _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RSHIFT;
+                 }
+               *modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+            }
+          break;
+       }
+     case VK_CONTROL:
+       {
+          SHORT res;
+
+          if (msg->discard_ctrl)
+            return 0;
+
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               res = GetKeyState(VK_LCONTROL);
+               if (res & 0x8000)
+                 {
+                    _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LCONTROL;
+                    kn = "Control_L";
+                    ks = "Control_L";
+                    kc = "";
+                    break;
+                 }
+               res = GetKeyState(VK_RCONTROL);
+               if (res & 0x8000)
+                 {
+                    _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RCONTROL;
+                    kn = "Control_R";
+                    ks = "Control_R";
+                    kc = "";
+                    break;
+                 }
+               *modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+            }
+          else /* is_up */
+            {
+               res = GetKeyState(VK_LCONTROL);
+               if (!(res & 0x8000) &&
+                   (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LCONTROL))
+                 {
+                    kn = "Control_L";
+                    ks = "Control_L";
+                    kc = "";
+                    _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LCONTROL;
+                    break;
+                 }
+               res = GetKeyState(VK_RCONTROL);
+               if (!(res & 0x8000) &&
+                   (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RCONTROL))
+                 {
+                    kn = "Control_R";
+                    ks = "Control_R";
+                    kc = "";
+                    _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RCONTROL;
+                    break;
+                 }
+               *modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
+            }
+          break;
+       }
+     case VK_MENU:
+       {
+          SHORT res;
+
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               res = GetKeyState(VK_LMENU);
+               if (res & 0x8000)
+                 {
+                    _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LMENU;
+                    kn = "Alt_L";
+                    ks = "Alt_L";
+                    kc = "";
+                 }
+               res = GetKeyState(VK_RMENU);
+               if (res & 0x8000)
+                 {
+                    _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RMENU;
+                    kn = "Alt_R";
+                    ks = "Alt_R";
+                    kc = "";
+                 }
+               *modifiers |= ECORE_EVENT_MODIFIER_ALT;
+            }
+          else /* is_up */
+            {
+               res = GetKeyState(VK_LMENU);
+               if (!(res & 0x8000) &&
+                   (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LMENU))
+                 {
+                    kn = "Alt_L";
+                    ks = "Alt_L";
+                    kc = "";
+                    _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LMENU;
+                 }
+               res = GetKeyState(VK_RMENU);
+               if (!(res & 0x8000) &&
+                   (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RMENU))
+                 {
+                    kn = "Alt_R";
+                    ks = "Alt_R";
+                    kc = "";
+                    _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RMENU;
+                 }
+               *modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
+            }
+          break;
+       }
+     case VK_LWIN:
+       {
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               kn = "Super_L";
+               ks = "Super_L";
+               kc = "";
+               *modifiers |= ECORE_EVENT_MODIFIER_WIN;
+            }
+          else /* is_up */
+            {
+               kn = "Super_L";
+               ks = "Super_L";
+               kc = "";
+               *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
+            }
+          break;
+       }
+     case VK_RWIN:
+       {
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               kn = "Super_R";
+               ks = "Super_R";
+               kc = "";
+               *modifiers |= ECORE_EVENT_MODIFIER_WIN;
+            }
+          else /* is_up */
+            {
+               kn = "Super_R";
+               ks = "Super_R";
+               kc = "";
+               *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
+            }
+          break;
+       }
      case VK_F1:
        kn = "F1";
        ks = "F1";
@@ -788,9 +1126,53 @@ _ecore_win32_event_keystroke_get(int    key,
        kc = "";
        break;
      default:
-       /* other non keystroke characters */
-       return 0;
+       {
+          /* other non keystroke characters */
+          BYTE kbd_state[256];
+          int res;
+
+          if (is_down)
+            return 0;
+
+          if (!GetKeyboardState(kbd_state))
+            return 0;
+
+           res = ToUnicode(msg->window_param,
+                           MapVirtualKey(msg->window_param, 2),
+                           kbd_state, buf, 3, 0);
+           if (res == 1)
+             {
+               /* FIXME: might be troublesome for non european languages */
+               /* in that case, UNICODE should be used, I guess */
+               buf[1] = '\0';
+               kn = (char *)buf;
+               ks = (char *)buf;
+               kc = (char *)buf;
+
+               res = GetAsyncKeyState(VK_SHIFT);
+               if (res & 0x8000)
+                 *modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+               else
+                 *modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
+
+               res = GetKeyState(VK_CONTROL);
+               if (res & 0x8000)
+                 *modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+               else
+                 *modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
+
+               res = GetKeyState(VK_MENU);
+               if (res & 0x8000)
+                 *modifiers |= ECORE_EVENT_MODIFIER_ALT;
+               else
+                 *modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
+
+               break;
+             }
+           return 0;
+         }
      }
+
    *keyname = strdup(kn);
    if (!*keyname) return 0;
    *keysymbol = strdup(ks);
@@ -800,69 +1182,88 @@ _ecore_win32_event_keystroke_get(int    key,
         *keyname = NULL;
         return 0;
      }
-   *keycompose = strdup(kc);
-   if (!*keycompose)
+   if (!kc)
+     *keycompose = NULL;
+   else
      {
-        free(*keyname);
-        free(*keysymbol);
-        *keyname = NULL;
-        *keysymbol = NULL;
-        return 0;
+        *keycompose = strdup(kc);
+        if (!*keycompose)
+          {
+             free(*keyname);
+             free(*keysymbol);
+             *keyname = NULL;
+             *keysymbol = NULL;
+             return 0;
+          }
      }
 
    return 1;
 }
 
 static int
-_ecore_win32_event_char_get(int    key,
-                            char **keyname,
-                            char **keysymbol,
-                            char **keycompose)
+_ecore_win32_event_char_get(int           key,
+                            char        **keyname,
+                            char        **keysymbol,
+                            char        **keycompose,
+                            unsigned int *modifiers)
 {
-  char kn[32];
-  char ks[32];
-  char *kc;
+  char *kn = NULL;
+  char *ks = NULL;
+  char *kc = NULL;
+  char buf[2];
+  SHORT res;
 
   *keyname = NULL;
   *keysymbol = NULL;
   *keycompose = NULL;
 
+   /* check control charaters such as ^a(key:1), ^z(key:26) */
+   if ((key > 0) && (key < 27) &&
+       ((GetKeyState(VK_CONTROL) & 0x8000) ||
+        (GetKeyState(VK_CONTROL) & 0x8000))) key += 96;
+
    switch (key)
      {
+     case VK_PROCESSKEY:
+      break;
      case VK_BACK:
-       strncpy(kn, "Backspace", 32);
-       strncpy(ks, "Backspace", 32);
-       kc = "";
+       kn = "BackSpace";
+       ks = "BackSpace";
+       kc = "\b";
        break;
      case VK_TAB:
-       strncpy(kn, "Tab", 32);
-       strncpy(ks, "Tab", 32);
-       kc = "";
+       kn = "Tab";
+       ks = "Tab";
+       kc = "\t";
        break;
      case 0x0a:
        /* Line feed (Shift + Enter) */
-       strncpy(kn, "LineFeed", 32);
-       strncpy(ks, "LineFeed", 32);
-       kc = "";
+       kn = "LineFeed";
+       ks = "LineFeed";
+       kc = "LineFeed";
        break;
      case VK_RETURN:
-       strncpy(kn, "Return", 32);
-       strncpy(ks, "Return", 32);
-       kc = "";
+       kn = "Return";
+       ks = "Return";
+       kc = "\n";
        break;
      case VK_ESCAPE:
-       strncpy(kn, "Escape", 32);
-       strncpy(ks, "Escape", 32);
-       kc = "";
+       kn = "Escape";
+       ks = "Escape";
+       kc = "\e";
+       break;
+     case VK_SPACE:
+       kn = "space";
+       ks = "space";
+       kc = " ";
        break;
      default:
        /* displayable characters */
-       printf (" * key : %d\n", key);
-       kn[0] = (TCHAR)key;
-       kn[1] = '\0';
-       ks[0] = (TCHAR)key;
-       ks[1] = '\0';
-       kc = "";
+       buf[0] = key;
+       buf[1] = '\0';
+       kn = buf;
+       ks = buf;
+       kc = buf;
        break;
      }
    *keyname = strdup(kn);
@@ -884,5 +1285,23 @@ _ecore_win32_event_char_get(int    key,
         return 0;
      }
 
+   res = GetAsyncKeyState(VK_SHIFT);
+   if (res & 0x8000)
+     *modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+   else
+     *modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
+
+   res = GetKeyState(VK_CONTROL);
+   if (res & 0x8000)
+     *modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+   else
+     *modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
+
+   res = GetKeyState(VK_MENU);
+   if (res & 0x8000)
+     *modifiers |= ECORE_EVENT_MODIFIER_ALT;
+   else
+     *modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
+
    return 1;
 }
index 93b6fa7..e3e4426 100644 (file)
@@ -1,26 +1,63 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifndef __ECORE_WIN32_PRIVATE_H__
 #define __ECORE_WIN32_PRIVATE_H__
 
 
-#define ECORE_WIN32_WINDOW_CLASS "Ecore_Win32_Window_Class"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef MIN
+# undef MIN
+#endif
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+#ifdef MAX
+# undef MAX
+#endif
+#define MAX(a,b) (((a) < (b)) ? (b) : (a))
+
+/* logging messages macros */
+extern int _ecore_win32_log_dom_global;
+
+#ifdef ECORE_WIN32_DEFAULT_LOG_COLOR
+# undef ECORE_WIN32_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_WIN32_DEFAULT_LOG_COLOR EINA_COLOR_LIGHTBLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_win32_log_dom_global , __VA_ARGS__)
+#ifdef DBG
+#undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_win32_log_dom_global , __VA_ARGS__)
+
+#ifdef INF
+#undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_win32_log_dom_global , __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_win32_log_dom_global, __VA_ARGS__)
 
+#define ECORE_WIN32_WINDOW_CLASS "Ecore_Win32_Window_Class"
 
 typedef struct _Ecore_Win32_Callback_Data Ecore_Win32_Callback_Data;
 
 struct _Ecore_Win32_Callback_Data
 {
-   RECT         update;
-   HWND         window;
-   unsigned int message;
-   WPARAM       window_param;
-   LPARAM       data_param;
-   long         time;
-   int          x;
-   int          y;
+   RECT          update;
+   HWND          window;
+   unsigned int  message;
+   WPARAM        window_param;
+   LPARAM        data_param;
+   unsigned long timestamp;
+   int           x;
+   int           y;
+   Eina_Bool     discard_ctrl;
 };
 
 struct _Ecore_Win32_Window
@@ -34,8 +71,8 @@ struct _Ecore_Win32_Window
    unsigned int           min_height;
    unsigned int           max_width;
    unsigned int           max_height;
-   unsigned int           base_width;
-   unsigned int           base_height;
+   int                    base_width;
+   int                    base_height;
    unsigned int           step_width;
    unsigned int           step_height;
 
@@ -68,19 +105,38 @@ struct _Ecore_Win32_Window
    unsigned int           borderless    : 1;
    unsigned int           iconified     : 1;
    unsigned int           fullscreen    : 1;
+
+   struct {
+      unsigned short width;
+      unsigned short height;
+      unsigned char *mask;
+      unsigned int   enabled : 1;
+      unsigned int   layered : 1;
+   } shape;
+
+   struct {
+      DWORD        type;
+      int x;
+      int y;
+      int w;
+      int h;
+      int px;
+      int py;
+      unsigned int dragging : 1;
+   } drag;
+
+   void *dnd_drop_target;
 };
 
 
 extern HINSTANCE           _ecore_win32_instance;
 extern double              _ecore_win32_double_click_time;
-extern double              _ecore_win32_event_last_time;
+extern unsigned long       _ecore_win32_event_last_time;
 extern Ecore_Win32_Window *_ecore_win32_event_last_window;
 
 
-char *_ecore_win32_hwnd_str_get(HWND window);
-
 void  _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, int is_keystroke);
-void  _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg, int is_keystroke);
+void  _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg);
 void  _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, int button);
 void  _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg, int button);
 void  _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg);
@@ -97,5 +153,18 @@ void  _ecore_win32_event_handle_configure_notify(Ecore_Win32_Callback_Data *msg)
 void  _ecore_win32_event_handle_resize(Ecore_Win32_Callback_Data *msg);
 void  _ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg);
 
+void *_ecore_win32_dnd_data_object_new(void *fmtetc, void *stgmeds, int count);
+void _ecore_win32_dnd_data_object_free(void *data_object);
+void *_ecore_win32_dnd_drop_source_new();
+void _ecore_win32_dnd_drop_source_free(void *drop_source);
+void *_ecore_win32_dnd_register_drop_window(HWND hwnd,
+                                            Ecore_Win32_Dnd_DropTarget_Callback callback, void *ptr);
+void _ecore_win32_dnd_unregister_drop_window(HWND hwnd, void *drop_target);
+
+
+#ifdef __cplusplus
+}
+#endif
+
 
 #endif /* __ECORE_WIN32_PRIVATE_H__ */
index a3129ee..36f8a86 100644 (file)
@@ -1,7 +1,3 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
 
+#include <Eina.h>
+
 #include "Ecore_Win32.h"
 #include "ecore_win32_private.h"
 
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
 
-/***** Private declarations *****/
+/**
+ * @cond LOCAL
+ */
 
 
 typedef enum _Ecore_Win32_Window_Z_Order Ecore_Win32_Window_Z_Order;
@@ -29,59 +32,232 @@ enum _Ecore_Win32_Window_Z_Order
   ECORE_WIN32_WINDOW_Z_ORDER_TOPMOST
 };
 
-static Ecore_Win32_Window *ecore_win32_window_internal_new(Ecore_Win32_Window *parent,
-                                                           int                 x,
-                                                           int                 y,
-                                                           int                 width,
-                                                           int                 height,
-                                                           DWORD               style);
+static Ecore_Win32_Window *
+ecore_win32_window_internal_new(Ecore_Win32_Window *parent,
+                                int                 x,
+                                int                 y,
+                                int                 width,
+                                int                 height,
+                                DWORD               style)
+{
+   RECT                rect;
+   Ecore_Win32_Window *w;
+   int                 minimal_width;
+   int                 minimal_height;
 
+   w = (Ecore_Win32_Window *)calloc(1, sizeof(Ecore_Win32_Window));
+   if (!w)
+     {
+        ERR("malloc() failed");
+        return NULL;
+     }
 
-/***** API *****/
+   rect.left = 0;
+   rect.top = 0;
+   rect.right = width;
+   rect.bottom = height;
+   if (!AdjustWindowRectEx(&rect, style, FALSE, 0))
+     {
+        ERR("AdjustWindowRect() failed");
+        free(w);
+        return NULL;
+     }
 
-Ecore_Win32_Window *
+   minimal_width = GetSystemMetrics(SM_CXMIN);
+   minimal_height = GetSystemMetrics(SM_CYMIN);
+/*    if (((rect.right - rect.left) < minimal_width) || */
+/*        ((rect.bottom - rect.top) < minimal_height)) */
+/*      { */
+/*         fprintf (stderr, "[Ecore] [Win32] ERROR !!\n"); */
+/*         fprintf (stderr, "                Wrong size %ld\n", rect.right - rect.left); */
+/*         free(w); */
+/*         return NULL; */
+/*      } */
+   if ((rect.right - rect.left) < minimal_width)
+     {
+       rect.right = rect.left + minimal_width;
+     }
+
+   w->window = CreateWindowEx(0,
+                              ECORE_WIN32_WINDOW_CLASS, "",
+                              style,
+                              x, y,
+                              rect.right - rect.left,
+                              rect.bottom - rect.top,
+                              parent ? parent->window : NULL,
+                              NULL, _ecore_win32_instance, NULL);
+   if (!w->window)
+     {
+        ERR("CreateWindowEx() failed");
+        free(w);
+        return NULL;
+     }
+
+   SetLastError(0);
+   if (!SetWindowLongPtr(w->window, GWLP_USERDATA, (LONG_PTR)w) &&
+       (GetLastError() != 0))
+     {
+        ERR("SetWindowLongPtr() failed");
+        DestroyWindow(w->window);
+        free(w);
+        return NULL;
+     }
+
+   w->min_width   = 0;
+   w->min_height  = 0;
+   w->max_width   = 32767;
+   w->max_height  = 32767;
+   w->base_width  = -1;
+   w->base_height = -1;
+   w->step_width  = 1;
+   w->step_height = 1;
+
+   w->state.iconified         = 0;
+   w->state.modal             = 0;
+   w->state.sticky            = 0;
+   w->state.maximized_vert    = 0;
+   w->state.maximized_horz    = 0;
+   w->state.shaded            = 0;
+   w->state.hidden            = 0;
+   w->state.fullscreen        = 0;
+   w->state.above             = 0;
+   w->state.below             = 0;
+   w->state.demands_attention = 0;
+
+   w->type.desktop = 0;
+   w->type.dock    = 0;
+   w->type.toolbar = 0;
+   w->type.menu    = 0;
+   w->type.utility = 0;
+   w->type.splash  = 0;
+   w->type.dialog  = 0;
+   w->type.normal  = 0;
+
+   w->pointer_is_in = 0;
+   w->borderless    = 0;
+   w->iconified     = 0;
+   w->fullscreen    = 0;
+
+   return w;
+}
+
+/**
+ * @endcond
+ */
+
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Ecore_Win32_Group Ecore_Win32 library
+ *
+ * @{
+ */
+
+/**
+ * @brief Creates a new window.
+ *
+ * @param parent The parent window.
+ * @param x The x coordinate of the top-left corner of the window.
+ * @param y The y coordinate of the top-left corner of the window.
+ * @param width The width of the window.
+ * @param height The height of hte window.
+ * @return A newly allocated window.
+ *
+ * This function creates a new window which parent is @p parent. @p width and
+ * @p height are the size of the window content (the client part),
+ * without the border and title bar. @p x and @p y are the system
+ * coordinates of the top left cerner of the window (that is, of the
+ * title bar). This function returns a newly created window on
+ * success, and @c NULL on failure.
+ */
+EAPI Ecore_Win32_Window *
 ecore_win32_window_new(Ecore_Win32_Window *parent,
                        int                 x,
                        int                 y,
                        int                 width,
                        int                 height)
 {
+   INF("creating window with border");
+
    return ecore_win32_window_internal_new(parent,
                                           x, y,
                                           width, height,
                                           WS_OVERLAPPEDWINDOW | WS_SIZEBOX);
 }
 
-/* simulate X11 override windows */
-Ecore_Win32_Window *
+/**
+ * @brief Creates a new borderless window.
+ *
+ * @param parent The parent window.
+ * @param x The x coordinate of the top-left corner of the window.
+ * @param y The y coordinate of the top-left corner of the window.
+ * @param width The width of the window.
+ * @param height The height of hte window.
+ * @return A newly allocated window.
+ *
+ * This function is the same than ecore_win32_window_override_new()
+ * but the returned window is borderless.
+ */
+EAPI Ecore_Win32_Window *
 ecore_win32_window_override_new(Ecore_Win32_Window *parent,
                                 int                 x,
                                 int                 y,
                                 int                 width,
                                 int                 height)
 {
+   INF("creating window without border");
+
    return ecore_win32_window_internal_new(parent,
                                           x, y,
                                           width, height,
-                                          WS_POPUP);
+                                          WS_POPUP & ~(WS_CAPTION | WS_THICKFRAME));
 }
 
-void
-ecore_win32_window_del(Ecore_Win32_Window *window)
+/**
+ * @brief Free the given window.
+ *
+ * @param window The window to free.
+ *
+ * This function frees @p window. If @p window is @c NULL, this
+ * function does nothing.
+ */
+EAPI void
+ecore_win32_window_free(Ecore_Win32_Window *window)
 {
    if (!window) return;
 
-   DestroyWindow(((struct _Ecore_Win32_Window *)window)->window);
+   INF("destroying window");
+
+   if (window->shape.mask)
+      free(window->shape.mask);
+
+   DestroyWindow(window->window);
    free(window);
-   printf ("ecore_win32_window_del\n");
 }
 
-void *
+/**
+ * @brief Return the window HANDLE associated to the given window.
+ *
+ * @param window The window to retrieve the HANDLE from.
+ *
+ * This function returns the window HANDLE associated to @p window. If
+ * @p window is @c NULL, this function returns @c NULL.
+ *
+ * @note The returned value is of type HWND.
+ */
+EAPI void *
 ecore_win32_window_hwnd_get(Ecore_Win32_Window *window)
 {
    if (!window) return NULL;
 
-   return ((struct _Ecore_Win32_Window *)window)->window;
+   return window->window;
 }
 
 /*
@@ -112,118 +288,193 @@ ecore_win32_window_configure(Ecore_Win32_Window        *window,
     default:
       return;
     }
-  SetWindowPos((struct _Ecore_Win32_Window *)window->window, w, x, y, width, height, ???);
+  SetWindowPos((Ecore_Win32_Window *)window->window, w, x, y, width, height, ???);
 }
 */
 
-void
+/**
+ * @brief Move the given window to a given position.
+ *
+ * @param window The window to move.
+ * @param x The x coordinate of the destination position.
+ * @param y The y coordinate of the destination position.
+ *
+ * This function move @p window to the new position of coordinates @p x
+ * and @p y. If @p window is @c NULL, or if it is fullscreen, or on
+ * error, this function does nothing.
+ */
+EAPI void
 ecore_win32_window_move(Ecore_Win32_Window *window,
                         int                 x,
                         int                 y)
 {
    RECT rect;
-   HWND w;
 
+   /* FIXME: on fullscreen, should not move it */
    if (!window) return;
 
-   printf ("ecore_win32_window_move %p : %d %d\n", window, x, y);
-   w = ((struct _Ecore_Win32_Window *)window)->window;
-   if (!GetWindowRect(w, &rect))
-     return;
+   INF("moving window (%dx%d)", x, y);
+
+   if (!GetWindowRect(window->window, &rect))
+     {
+        ERR("GetWindowRect() failed");
+        return;
+     }
 
-   MoveWindow(w, x, y,
-              rect.right - rect.left,
-              rect.bottom - rect.top,
-              TRUE);
+   if (!MoveWindow(window->window, x, y,
+                   rect.right - rect.left,
+                   rect.bottom - rect.top,
+                   TRUE))
+     {
+        ERR("MoveWindow() failed");
+     }
 }
 
-void
+/**
+ * @brief Resize the given window to a given size.
+ *
+ * @param window The window to resize.
+ * @param width The new width.
+ * @param height The new height.
+ *
+ * This function resize @p window to the new @p width and @p height.
+ * If @p window is @c NULL, or if it is fullscreen, or on error, this
+ * function does nothing.
+ */
+EAPI void
 ecore_win32_window_resize(Ecore_Win32_Window *window,
                           int                 width,
                           int                 height)
 {
-   RECT                        rect;
-   struct _Ecore_Win32_Window *w;
-   DWORD                       style;
-   int                         x;
-   int                         y;
-
+   RECT                rect;
+   DWORD               style;
+   int                 x;
+   int                 y;
+   int                 minimal_width;
+   int                 minimal_height;
+
+   /* FIXME: on fullscreen, should not resize it */
    if (!window) return;
 
-   w = (struct _Ecore_Win32_Window *)window;
-   if (!GetWindowRect(w->window, &rect)) return;
+   INF("resizing window (%dx%d)", width, height);
+
+   minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)window->min_width);
+   minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)window->min_height);
 
-   printf ("ecore_win32_window_resize 0 : %p (%d %d) (%d %d) (%d %d)\n",
-           w,
-           w->min_width,
-           w->min_height,
-           w->max_width,
-           w->max_height,
-           width,
-           height);
+   if (!GetWindowRect(window->window, &rect))
+     {
+        ERR("GetWindowRect() failed");
+        return;
+     }
 
    x = rect.left;
    y = rect.top;
    rect.left = 0;
    rect.top = 0;
-/*    if (width < w->min_width) width = w->min_width; */
-/*    if (width > w->max_width) width = w->max_width; */
-/*    printf ("ecore_win32_window_resize 1 : %d %d %d\n", w->min_height, w->max_height, height); */
-/*    if (height < w->min_height) height = w->min_height; */
-/*    printf ("ecore_win32_window_resize 2 : %d %d\n", w->max_height, height); */
-/*    if (height > w->max_height) height = w->max_height; */
-/*    printf ("ecore_win32_window_resize 3 : %d %d\n", w->max_height, height); */
+   if (width < minimal_width) width = minimal_width;
+   if (width > (int)window->max_width) width = window->max_width;
+   if (height < minimal_height) height = minimal_height;
+   if (height > (int)window->max_height) height = window->max_height;
    rect.right = width;
    rect.bottom = height;
-   style = GetWindowLong(w->window, GWL_STYLE);
+   if (!(style = GetWindowLong(window->window, GWL_STYLE)))
+     {
+        ERR("GetWindowLong() failed");
+        return;
+     }
    if (!AdjustWindowRect(&rect, style, FALSE))
-     return;
+     {
+        ERR("AdjustWindowRect() failed");
+        return;
+     }
 
-   if (!MoveWindow(w->window, x, y,
+   if (!MoveWindow(window->window, x, y,
                    rect.right - rect.left,
                    rect.bottom - rect.top,
-                   FALSE))
+                   TRUE))
      {
-       printf (" MEEERDE !!!\n");
+        ERR("MoveWindow() failed");
      }
-   printf ("ecore_win32_window_resize 4 : %d %d\n", width, height);
 }
 
-void
+/**
+ * @brief Move and resize the given window to a given position and size.
+ *
+ * @param window The window to move and resize.
+ * @param x The x coordinate of the destination position.
+ * @param y The x coordinate of the destination position.
+ * @param width The new width.
+ * @param height The new height.
+ *
+ * This function resize @p window to the new position of coordinates @p x
+ * and @p y and the new @p width and @p height. If @p window is @c NULL,
+ * or if it is fullscreen, or on error, this function does nothing.
+ */
+EAPI void
 ecore_win32_window_move_resize(Ecore_Win32_Window *window,
                                int                 x,
                                int                 y,
                                int                 width,
                                int                 height)
 {
-   RECT                        rect;
-   struct _Ecore_Win32_Window *w;
-   DWORD                       style;
+   RECT                rect;
+   DWORD               style;
+   int                 minimal_width;
+   int                 minimal_height;
 
+   /* FIXME: on fullscreen, should not move/resize it */
    if (!window) return;
 
-   printf ("ecore_win32_window_move_resize 0 : %p  %d %d\n", window, width, height);
-   w = ((struct _Ecore_Win32_Window *)window);
+   INF("moving and resizing window (%dx%d %dx%d)", x, y, width, height);
+
+   minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)window->min_width);
+   minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)window->min_height);
+
    rect.left = 0;
    rect.top = 0;
-   if ((unsigned int)width < w->min_width) width = w->min_width;
-   if ((unsigned int)width > w->max_width) width = w->max_width;
-   if ((unsigned int)height < w->min_height) height = w->min_height;
-   if ((unsigned int)height > w->max_height) height = w->max_height;
-   printf ("ecore_win32_window_move_resize 1 : %d %d\n", width, height);
+   if (width < minimal_width) width = minimal_width;
+   if (width > (int)window->max_width) width = window->max_width;
+   if (height < minimal_height) height = minimal_height;
+   if (height > (int)window->max_height) height = window->max_height;
    rect.right = width;
    rect.bottom = height;
-   style = GetWindowLong(w->window, GWL_STYLE);
-   if (!AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, FALSE))
-     return;
+   if (!(style = GetWindowLong(window->window, GWL_STYLE)))
+     {
+        ERR("GetWindowLong() failed");
+        return;
+     }
+   if (!AdjustWindowRect(&rect, style, FALSE))
+     {
+        ERR("AdjustWindowRect() failed");
+        return;
+     }
 
-   MoveWindow(w->window, x, y,
-              rect.right - rect.left,
-              rect.bottom - rect.top,
-              TRUE);
+   if (!MoveWindow(window->window, x, y,
+                   rect.right - rect.left,
+                   rect.bottom - rect.top,
+                   TRUE))
+     {
+        ERR("MoveWindow() failed");
+     }
 }
 
-void
+/**
+ * @brief Get the geometry of the given window.
+ *
+ * @param window The window to retrieve the geometry from.
+ * @param x The x coordinate of the position.
+ * @param y The x coordinate of the position.
+ * @param width The width.
+ * @param height The height.
+ *
+ * This function retrieves the position and size of @p window. @p x,
+ * @p y, @p width and @p height can be buffers that will be filled with
+ * the corresponding values. If one of them is @c NULL, nothing will
+ * be done for that parameter. If @p window is @c NULL, and if the
+ * buffers are not @c NULL, they will be filled with respectively 0,
+ * 0, the size of the screen and the height of the screen.
+ */
+EAPI void
 ecore_win32_window_geometry_get(Ecore_Win32_Window *window,
                                 int                *x,
                                 int                *y,
@@ -234,7 +485,8 @@ ecore_win32_window_geometry_get(Ecore_Win32_Window *window,
    int  w;
    int  h;
 
-   printf ("ecore_win32_window_geometry_get %p\n", window);
+   INF("getting window geometry");
+
    if (!window)
      {
         if (x) *x = 0;
@@ -245,9 +497,10 @@ ecore_win32_window_geometry_get(Ecore_Win32_Window *window,
         return;
      }
 
-   if (!GetClientRect(((struct _Ecore_Win32_Window *)window)->window,
-                      &rect))
+   if (!GetClientRect(window->window, &rect))
      {
+        ERR("GetClientRect() failed");
+
         if (x) *x = 0;
         if (y) *y = 0;
         if (width) *width = 0;
@@ -259,9 +512,10 @@ ecore_win32_window_geometry_get(Ecore_Win32_Window *window,
    w = rect.right - rect.left;
    h = rect.bottom - rect.top;
 
-   if (!GetWindowRect(((struct _Ecore_Win32_Window *)window)->window,
-                      &rect))
+   if (!GetWindowRect(window->window, &rect))
      {
+        ERR("GetWindowRect() failed");
+
         if (x) *x = 0;
         if (y) *y = 0;
         if (width) *width = 0;
@@ -276,14 +530,29 @@ ecore_win32_window_geometry_get(Ecore_Win32_Window *window,
    if (height) *height = h;
 }
 
-void
+/**
+ * @brief Get the size of the given window.
+ *
+ * @param window The window to retrieve the size from.
+ * @param width The width.
+ * @param height The height.
+ *
+ * This function retrieves the size of @p window. @p width and
+ * @p height can be buffers that will be filled with the corresponding
+ * values. If one of them is @c NULL, nothing will be done for that
+ * parameter. If @p window is @c NULL, and if the buffers are not
+ * @c NULL, they will be filled with respectively the size of the screen
+ * and the height of the screen.
+ */
+EAPI void
 ecore_win32_window_size_get(Ecore_Win32_Window *window,
                             int                *width,
                             int                *height)
 {
    RECT rect;
 
-   printf ("ecore_win32_window_size_get %p\n", window);
+   INF("getting window size");
+
    if (!window)
      {
         if (width) *width = GetSystemMetrics(SM_CXSCREEN);
@@ -292,9 +561,10 @@ ecore_win32_window_size_get(Ecore_Win32_Window *window,
         return;
      }
 
-   if (!GetClientRect(((struct _Ecore_Win32_Window *)window)->window,
-                      &rect))
+   if (!GetClientRect(window->window, &rect))
      {
+        ERR("GetClientRect() failed");
+
         if (width) *width = 0;
         if (height) *height = 0;
      }
@@ -303,171 +573,288 @@ ecore_win32_window_size_get(Ecore_Win32_Window *window,
    if (height) *height = rect.bottom - rect.top;
 }
 
-void
+/**
+ * @brief Set the minimum size of the given window.
+ *
+ * @param window The window.
+ * @param min_width The minimal width.
+ * @param min_height The minimal height.
+ *
+ * This function sets the minimum size of @p window to @p min_width
+ * and *p min_height. If @p window is @c NULL, this functions does
+ * nothing.
+ */
+EAPI void
 ecore_win32_window_size_min_set(Ecore_Win32_Window *window,
                                 unsigned int        min_width,
                                 unsigned int        min_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    if (!window) return;
 
    printf ("ecore_win32_window_size_min_set : %p  %d %d\n", window, min_width, min_height);
-   w = (struct _Ecore_Win32_Window *)window;
-   w->min_width = min_width;
-   w->min_height = min_height;
+   window->min_width = min_width;
+   window->min_height = min_height;
 }
 
-void
+/**
+ * @brief Get the minimum size of the given window.
+ *
+ * @param window The window.
+ * @param min_width The minimal width.
+ * @param min_height The minimal height.
+ *
+ * This function fills the minimum size of @p window in the buffers
+ * @p min_width and *p min_height. They both can be @c NULL. If
+ * @p window is @c NULL, this functions does nothing.
+ */
+EAPI void
 ecore_win32_window_size_min_get(Ecore_Win32_Window *window,
                                 unsigned int       *min_width,
                                 unsigned int       *min_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    if (!window) return;
 
-   w = (struct _Ecore_Win32_Window *)window;
-   printf ("ecore_win32_window_size_min_get : %p  %d %d\n", window, w->min_width, w->min_height);
-   if (min_width) *min_width = w->min_width;
-   if (min_height) *min_height = w->min_height;
+   printf ("ecore_win32_window_size_min_get : %p  %d %d\n", window, window->min_width, window->min_height);
+   if (min_width) *min_width = window->min_width;
+   if (min_height) *min_height = window->min_height;
 }
 
-void
+/**
+ * @brief Set the maximum size of the given window.
+ *
+ * @param window The window.
+ * @param max_width The maximal width.
+ * @param max_height The maximal height.
+ *
+ * This function sets the maximum size of @p window to @p max_width
+ * and *p max_height. If @p window is @c NULL, this functions does
+ * nothing.
+ */
+EAPI void
 ecore_win32_window_size_max_set(Ecore_Win32_Window *window,
                                 unsigned int        max_width,
                                 unsigned int        max_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    if (!window) return;
 
    printf ("ecore_win32_window_size_max_set : %p  %d %d\n", window, max_width, max_height);
-   w = (struct _Ecore_Win32_Window *)window;
-   w->max_width = max_width;
-   w->max_height = max_height;
+   window->max_width = max_width;
+   window->max_height = max_height;
 }
 
-void
+/**
+ * @brief Get the maximum size of the given window.
+ *
+ * @param window The window.
+ * @param max_width The maximal width.
+ * @param max_height The maximal height.
+ *
+ * This function fills the maximum size of @p window in the buffers
+ * @p max_width and *p max_height. They both can be @c NULL. If
+ * @p window is @c NULL, this functions does nothing.
+ */
+EAPI void
 ecore_win32_window_size_max_get(Ecore_Win32_Window *window,
                                 unsigned int       *max_width,
                                 unsigned int       *max_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    if (!window) return;
 
-   w = (struct _Ecore_Win32_Window *)window;
-   printf ("ecore_win32_window_size_max_get : %p  %d %d\n", window, w->max_width, w->max_height);
-   if (max_width) *max_width = w->max_width;
-   if (max_height) *max_height = w->max_height;
+   printf ("ecore_win32_window_size_max_get : %p  %d %d\n", window, window->max_width, window->max_height);
+   if (max_width) *max_width = window->max_width;
+   if (max_height) *max_height = window->max_height;
 }
 
-void
+/**
+ * @brief Set the base size of the given window.
+ *
+ * @param window The window.
+ * @param base_width The base width.
+ * @param base_height The base height.
+ *
+ * This function sets the base size of @p window to @p base_width
+ * and *p base_height. If @p window is @c NULL, this functions does
+ * nothing.
+ */
+EAPI void
 ecore_win32_window_size_base_set(Ecore_Win32_Window *window,
                                  unsigned int        base_width,
                                  unsigned int        base_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    printf ("ecore_win32_window_size_base_set : %p  %d %d\n", window, base_width, base_height);
    if (!window) return;
 
-   w = (struct _Ecore_Win32_Window *)window;
-   w->base_width = base_width;
-   w->base_height = base_height;
+   window->base_width = base_width;
+   window->base_height = base_height;
 }
 
-void
+/**
+ * @brief Get the base size of the given window.
+ *
+ * @param window The window.
+ * @param base_width The base width.
+ * @param base_height The bas height.
+ *
+ * This function fills the base size of @p window in the buffers
+ * @p base_width and *p base_height. They both can be @c NULL. If
+ * @p window is @c NULL, this functions does nothing.
+ */
+EAPI void
 ecore_win32_window_size_base_get(Ecore_Win32_Window *window,
                                  unsigned int       *base_width,
                                  unsigned int       *base_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    if (!window) return;
 
-   w = (struct _Ecore_Win32_Window *)window;
-   printf ("ecore_win32_window_size_base_get : %p  %d %d\n", window, w->base_width, w->base_height);
-   if (base_width) *base_width = w->base_width;
-   if (base_height) *base_height = w->base_height;
+   printf ("ecore_win32_window_size_base_get : %p  %d %d\n", window, window->base_width, window->base_height);
+   if (base_width) *base_width = window->base_width;
+   if (base_height) *base_height = window->base_height;
 }
 
-void
+/**
+ * @brief Set the step size of the given window.
+ *
+ * @param window The window.
+ * @param step_width The step width.
+ * @param step_height The step height.
+ *
+ * This function sets the step size of @p window to @p step_width
+ * and *p step_height. If @p window is @c NULL, this functions does
+ * nothing.
+ */
+EAPI void
 ecore_win32_window_size_step_set(Ecore_Win32_Window *window,
                                  unsigned int        step_width,
                                  unsigned int        step_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    printf ("ecore_win32_window_size_step_set : %p  %d %d\n", window, step_width, step_height);
    if (!window) return;
 
-   w = (struct _Ecore_Win32_Window *)window;
-   w->step_width = step_width;
-   w->step_height = step_height;
+   window->step_width = step_width;
+   window->step_height = step_height;
 }
 
-void
+/**
+ * @brief Get the step size of the given window.
+ *
+ * @param window The window.
+ * @param step_width The step width.
+ * @param step_height The bas height.
+ *
+ * This function fills the step size of @p window in the buffers
+ * @p step_width and *p step_height. They both can be @c NULL. If
+ * @p window is @c NULL, this functions does nothing.
+ */
+EAPI void
 ecore_win32_window_size_step_get(Ecore_Win32_Window *window,
                                  unsigned int       *step_width,
                                  unsigned int       *step_height)
 {
-   struct _Ecore_Win32_Window *w;
-
    if (!window) return;
 
-   w = (struct _Ecore_Win32_Window *)window;
-   printf ("ecore_win32_window_size_step_get : %p  %d %d\n", window, w->step_width, w->step_height);
-   if (step_width) *step_width = w->step_width;
-   if (step_height) *step_height = w->step_height;
+   printf ("ecore_win32_window_size_step_get : %p  %d %d\n", window, window->step_width, window->step_height);
+   if (step_width) *step_width = window->step_width;
+   if (step_height) *step_height = window->step_height;
 }
 
-/* TODO: ecore_win32_window_shaped_set */
-
-void
+/**
+ * @brief Show the given window.
+ *
+ * @param window The window to show.
+ *
+ * This function shows @p window. If @p window is @c NULL, or on
+ * error, this function does nothing.
+ */
+EAPI void
 ecore_win32_window_show(Ecore_Win32_Window *window)
 {
    if (!window) return;
 
-   printf (" ** ecore_win32_window_show  %p\n", window);
-   ShowWindow(((struct _Ecore_Win32_Window *)window)->window, SW_SHOWNORMAL);
-   UpdateWindow(((struct _Ecore_Win32_Window *)window)->window);
+   INF("showing window");
+
+   ShowWindow(window->window, SW_SHOWNORMAL);
+   if (!UpdateWindow(window->window))
+     {
+        ERR("UpdateWindow() failed");
+     }
 }
 
 /* FIXME: seems to block the taskbar */
-void
+/**
+ * @brief Hide the given window.
+ *
+ * @param window The window to show.
+ *
+ * This function hides @p window. If @p window is @c NULL, or on
+ * error, this function does nothing.
+ */
+EAPI void
 ecore_win32_window_hide(Ecore_Win32_Window *window)
 {
    if (!window) return;
 
-   printf (" ** ecore_win32_window_hide  %p\n", window);
-   ShowWindow(((struct _Ecore_Win32_Window *)window)->window, SW_HIDE);
+   INF("hiding window");
+
+   ShowWindow(window->window, SW_HIDE);
 }
 
-void
+/**
+ * @brief Place the given window at the top of the Z order.
+ *
+ * @param window The window to place at the top.
+ *
+ * This function places @p window at the top of the Z order. If
+ * @p window is @c NULL, this function does nothing.
+ */
+EAPI void
 ecore_win32_window_raise(Ecore_Win32_Window *window)
 {
    if (!window) return;
 
-   printf (" ** ecore_win32_window_raise  %p\n", window);
-   SetWindowPos(((struct _Ecore_Win32_Window *)window)->window,
-                HWND_TOP, 0, 0, 0, 0,
-                SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
+   INF("raising window");
+
+   if (!SetWindowPos(window->window,
+                     HWND_TOP, 0, 0, 0, 0,
+                     SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
+     {
+        ERR("SetWindowPos() failed");
+     }
 }
 
-void
+/**
+ * @brief Place the given window at the bottom of the Z order.
+ *
+ * @param window The window to place at the bottom.
+ *
+ * This function places @p window at the bottom of the Z order. If
+ * @p window is @c NULL, this function does nothing.
+ */
+EAPI void
 ecore_win32_window_lower(Ecore_Win32_Window *window)
 {
    if (!window) return;
 
-   printf (" ** ecore_win32_window_lower  %p\n", window);
-   SetWindowPos(((struct _Ecore_Win32_Window *)window)->window,
-                HWND_BOTTOM, 0, 0, 0, 0,
-                SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
+   INF("lowering window");
+
+   if (!SetWindowPos(window->window,
+                     HWND_BOTTOM, 0, 0, 0, 0,
+                     SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
+     {
+        ERR("SetWindowPos() failed");
+     }
 }
 
-void
+/**
+ * @brief Set the title of the given window.
+ *
+ * @param window The window to set the title.
+ * @param title The new title.
+ *
+ * This function sets the title of @p window to @p title. If @p window
+ * is @c NULL, or if @p title is @c NULL or empty, or on error, this
+ * function does nothing.
+ */
+EAPI void
 ecore_win32_window_title_set(Ecore_Win32_Window *window,
                              const char         *title)
 {
@@ -475,184 +862,354 @@ ecore_win32_window_title_set(Ecore_Win32_Window *window,
 
    if (!title || !title[0]) return;
 
-   SetWindowText(((struct _Ecore_Win32_Window *)window)->window, title);
+   INF("setting window title");
+
+   if (!SetWindowText(window->window, title))
+     {
+        ERR("SetWindowText() failed");
+     }
 }
 
-void
-ecore_win32_window_focus_set(Ecore_Win32_Window *window)
+/**
+ * @brief Set the focus to the given window.
+ *
+ * @param window The window to give focus to.
+ *
+ * This function gives the focus to @p window. If @p window is
+ * @c NULL, this function does nothing.
+ */
+EAPI void
+ecore_win32_window_focus(Ecore_Win32_Window *window)
 {
    if (!window) return;
 
-   SetFocus(((struct _Ecore_Win32_Window *)window)->window);
+   INF("focusing window");
+
+   if (!SetFocus(window->window))
+     {
+        ERR("SetFocus() failed");
+     }
 }
 
-void
-ecore_win32_window_iconified_set(Ecore_Win32_Window *window,
-                                 int                 on)
+/**
+ * @brief Get the current focused window.
+ *
+ * @return The window that has focus.
+ *
+ * This function returns the window that has focus. If the calling
+ * thread's message queue does not have an associated window with the
+ * keyboard focus, the return value is @c NULL.
+ *
+ * @note Even if the returned value is @c NULL, another thread's queue
+ * may be associated with a window that has the keyboard focus.
+ *
+ * @note The returned value is of type HWND.
+ */
+EAPI void *
+ecore_win32_window_focus_get(void)
 {
-   struct _Ecore_Win32_Window *ew;
+   HWND focused;
+
+   INF("getting focused window");
+
+   focused = GetFocus();
+   if (!focused)
+     {
+        ERR("GetFocus() failed");
+        return NULL;
+     }
+
+   return focused;
+}
 
+/**
+ * @brief Iconify or restore the given window.
+ *
+ * @param window The window.
+ * @param on @c EINA_TRUE to iconify the window, @c EINA_FALSE to restore it.
+ *
+ * This function iconify or restore @p window. If @p on is set to @c EINA_TRUE,
+ * the window will be iconified, if it is set to @c EINA_FALSE, it will be
+ * restored. If @p window is @c NULL or if the state does not change (like
+ * iconifying the window while it is already iconified), this function does
+ * nothing.
+ */
+EAPI void
+ecore_win32_window_iconified_set(Ecore_Win32_Window *window,
+                                 Eina_Bool           on)
+{
    if (!window) return;
 
-   ew = (struct _Ecore_Win32_Window *)window;
-   if (((ew->iconified) && (on)) ||
-       ((!ew->iconified) && (!on)))
+   if (((window->iconified) && (on)) ||
+       ((!window->iconified) && (!on)))
      return;
 
-   if (on)
-     {
-        ShowWindow(ew->window,
-                   SW_MINIMIZE);
-     }
-   else
-     {
-        ShowWindow(ew->window,
-                   SW_RESTORE);
-     }
-   ew->iconified = on;
+   INF("iconifying window: %s", on ? "yes" : "no");
+
+   ShowWindow(window->window, on ? SW_MINIMIZE : SW_RESTORE);
+   window->iconified = on;
 }
 
-void
+/**
+ * @brief Remove or restore the border of the given window.
+ *
+ * @param window The window.
+ * @param on @c EINA_TRUE to remove the border, @c EINA_FALSE to restore it.
+ *
+ * This function remove or restore the border of @p window. If @p on is set to
+ * @c EINA_TRUE, the window will have no border, if it is set to @c EINA_FALSE,
+ * it will have a border. If @p window is @c NULL or if the state does not
+ * change (like setting to borderless while the window has no border), this
+ * function does nothing.
+ */
+EAPI void
 ecore_win32_window_borderless_set(Ecore_Win32_Window *window,
-                                  int                 on)
+                                  Eina_Bool           on)
 {
-   RECT                        rect;
-   DWORD                       style;
-   struct _Ecore_Win32_Window *ew;
-   HWND                        w;
+   RECT                rect;
+   DWORD               style;
 
    if (!window) return;
 
-   printf (" ** ecore_win32_window_borderless_set  %p  %d\n", window, on);
-   ew = (struct _Ecore_Win32_Window *)window;
-   if (((ew->borderless) && (on)) ||
-       ((!ew->borderless) && (!on)))
+   if (((window->borderless) && (on)) ||
+       ((!window->borderless) && (!on)))
      return;
 
-   w = ew->window;
+   INF("setting window without border: %s", on ? "yes" : "no");
 
-   style = GetWindowLong(w, GWL_STYLE);
+   style = GetWindowLong(window->window, GWL_STYLE);
    if (on)
      {
-        if (!GetClientRect(w, &rect)) return;
-        SetWindowLong(w, GWL_STYLE, style & ~WS_CAPTION);
+        if (!GetClientRect(window->window, &rect))
+          {
+             ERR("GetClientRect() failed");
+             return;
+          }
+        SetLastError(0);
+        if (!SetWindowLongPtr(window->window, GWL_STYLE, style & ~(WS_CAPTION | WS_THICKFRAME)) &&
+            (GetLastError() != 0))
+          {
+             ERR("SetWindowLongPtr() failed");
+             return;
+          }
      }
    else
      {
-        if (!GetWindowRect(w, &rect)) return;
-        style |= WS_CAPTION;
-        AdjustWindowRect (&rect, style, FALSE);
-        SetWindowLong(w, GWL_STYLE, style);
+        if (!GetWindowRect(window->window, &rect))
+          {
+             ERR("GetWindowRect() failed");
+             return;
+          }
+        style |= WS_CAPTION | WS_THICKFRAME;
+        if (!AdjustWindowRect (&rect, style, FALSE))
+          {
+             ERR("AdjustWindowRect() failed");
+             return;
+          }
+        SetLastError(0);
+        if (!SetWindowLongPtr(window->window, GWL_STYLE, style) &&
+            (GetLastError() != 0))
+          {
+             ERR("SetWindowLongPtr() failed");
+             return;
+          }
      }
-   SetWindowPos(w, HWND_TOPMOST,
-                rect.left, rect.top,
-                rect.right - rect.left, rect.bottom - rect.top,
-                SWP_NOMOVE | SWP_FRAMECHANGED);
-   ew->borderless = on;
+   if (!SetWindowPos(window->window, HWND_TOPMOST,
+                     rect.left, rect.top,
+                     rect.right - rect.left, rect.bottom - rect.top,
+                     SWP_NOMOVE | SWP_FRAMECHANGED))
+     {
+        ERR("SetWindowPos() failed");
+        return;
+     }
+
+   window->borderless = on;
 }
 
-void
+/**
+ * @brief Set the given window to fullscreen.
+ *
+ * @param window The window.
+ * @param on @c EINA_TRUE for fullscreen mode, @c EINA_FALSE for windowed mode.
+ *
+ * This function set @p window to fullscreen or windowed mode. If @p on is set
+ * to @c EINA_TRUE, the window will be fullscreen, if it is set to
+ * @c EINA_FALSE, it will be windowed. If @p window is @c NULL or if the state
+ * does not change (like setting to fullscreen while the window is already
+ * fullscreen), this function does nothing.
+ */
+EAPI void
 ecore_win32_window_fullscreen_set(Ecore_Win32_Window *window,
-                                  int                 on)
+                                  Eina_Bool           on)
 {
-   struct _Ecore_Win32_Window *ew;
-   HWND                        w;
-   int                         width;
-   int                         height;
-
    if (!window) return;
 
-   ew = (struct _Ecore_Win32_Window *)window;
-   if (((ew->fullscreen) && (on)) ||
-       ((!ew->fullscreen) && (!on)))
+   if (((window->fullscreen) && (on)) ||
+       ((!window->fullscreen) && (!on)))
      return;
 
-   ew->fullscreen = on;
-   w = ew->window;
+   INF("setting fullscreen: %s", on ? "yes" : "no");
+
+   window->fullscreen = !!on;
 
    if (on)
      {
-        if (!GetWindowRect(w, &ew->rect)) return;
-        ew->style = GetWindowLong(w, GWL_STYLE);
-        width = GetSystemMetrics (SM_CXSCREEN);
-        height = GetSystemMetrics (SM_CYSCREEN);
-        if (!SetWindowLong(w, GWL_STYLE,
-                           (ew->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP))
-          return;
-        SetWindowPos(w, HWND_TOP, 0, 0, width, height,
-                     SWP_NOCOPYBITS | SWP_SHOWWINDOW);
+        DWORD style;
+
+        if (!GetWindowRect(window->window, &window->rect))
+          {
+             ERR("GetWindowRect() failed");
+             return;
+          }
+        if (!(window->style = GetWindowLong(window->window, GWL_STYLE)))
+          {
+             ERR("GetWindowLong() failed");
+             return;
+          }
+        style = window->style & ~WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX;
+        style |= WS_VISIBLE | WS_POPUP;
+        SetLastError(0);
+        if (!SetWindowLongPtr(window->window, GWL_STYLE, style) &&
+            (GetLastError() != 0))
+          {
+             ERR("SetWindowLongPtr() failed");
+             return;
+          }
+        SetLastError(0);
+        if (!SetWindowLongPtr(window->window, GWL_EXSTYLE, WS_EX_TOPMOST) &&
+            (GetLastError() != 0))
+          {
+             ERR("SetWindowLongPtr() failed");
+             return;
+          }
+        if (!SetWindowPos(window->window, HWND_TOPMOST, 0, 0,
+                          GetSystemMetrics (SM_CXSCREEN),
+                          GetSystemMetrics (SM_CYSCREEN),
+                          SWP_NOCOPYBITS | SWP_SHOWWINDOW))
+          {
+             ERR("SetWindowPos() failed");
+             return;
+          }
      }
    else
      {
-        if (!SetWindowLong(w, GWL_STYLE, ew->style))
-          return;
-        SetWindowPos(w, HWND_NOTOPMOST,
-                     ew->rect.left,
-                     ew->rect.top,
-                     ew->rect.right - ew->rect.left,
-                     ew->rect.bottom - ew->rect.top,
-                     SWP_NOCOPYBITS | SWP_SHOWWINDOW);
+        SetLastError(0);
+        if (!SetWindowLongPtr(window->window, GWL_STYLE, window->style) &&
+            (GetLastError() != 0))
+          {
+             ERR("SetWindowLongPtr() failed");
+             return;
+          }
+        SetLastError(0);
+        if (!SetWindowLongPtr(window->window, GWL_EXSTYLE, 0) &&
+            (GetLastError() != 0))
+          {
+             ERR("SetWindowLongPtr() failed");
+             return;
+          }
+        if (!SetWindowPos(window->window, HWND_NOTOPMOST,
+                          window->rect.left,
+                          window->rect.top,
+                          window->rect.right - window->rect.left,
+                          window->rect.bottom - window->rect.top,
+                          SWP_NOCOPYBITS | SWP_SHOWWINDOW))
+          {
+             ERR("SetWindowPos() failed");
+             return;
+          }
      }
 }
 
-void
+/**
+ * @brief Set the given cursor to the given window.
+ *
+ * @param window The window to modify the cursor.
+ * @param cursor The new cursor.
+ *
+ * This function sets @p cursor to @p window. @p cursor must have been
+ * obtained by ecore_win32_cursor_new() or
+ * ecore_win32_cursor_shaped_new(). If @p window or @p cursor is
+ * @c NULL, the function does nothing.
+ */
+EAPI void
 ecore_win32_window_cursor_set(Ecore_Win32_Window *window,
                               Ecore_Win32_Cursor *cursor)
 {
-   SetClassLong(((struct _Ecore_Win32_Window *)window)->window,
-                GCL_HCURSOR, (LONG)cursor);
+   INF("setting cursor");
+
+   if (!window || !cursor)
+     return;
+
+   if (!SetClassLongPtr(window->window,
+                        GCLP_HCURSOR, (LONG_PTR)cursor))
+     {
+        ERR("SetClassLong() failed");
+     }
 }
 
-void
+/**
+ * @brief Set the state of the given window.
+ *
+ * @param window The window to modify the state.
+ * @param state An array of the new states.
+ * @param num The number of states in the array.
+ *
+ * This function set the state of @p window. @p state is an array of
+ * states of size @p num. If @p window or @p state are @c NULL, or if
+ * @p num is less or equal than 0, the function does nothing.
+ */
+EAPI void
 ecore_win32_window_state_set(Ecore_Win32_Window       *window,
                              Ecore_Win32_Window_State *state,
                              unsigned int              num)
 {
    unsigned int i;
 
-   if (!num)
+   if (!window || !state || (num <= 0))
      return;
 
+   INF("setting cursor state");
+
    for (i = 0; i < num; i++)
      {
         switch (state[i])
           {
           case ECORE_WIN32_WINDOW_STATE_ICONIFIED:
-            ((struct _Ecore_Win32_Window *)window)->state.iconified = 1;
+            window->state.iconified = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_MODAL:
-            ((struct _Ecore_Win32_Window *)window)->state.modal = 1;
+            window->state.modal = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_STICKY:
-            ((struct _Ecore_Win32_Window *)window)->state.sticky = 1;
+            window->state.sticky = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT:
-            ((struct _Ecore_Win32_Window *)window)->state.maximized_vert = 1;
+            window->state.maximized_vert = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ:
-            ((struct _Ecore_Win32_Window *)window)->state.maximized_horz = 1;
+            window->state.maximized_horz = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_MAXIMIZED:
-            ((struct _Ecore_Win32_Window *)window)->state.maximized_horz = 1;
-            ((struct _Ecore_Win32_Window *)window)->state.maximized_vert = 1;
+            window->state.maximized_horz = 1;
+            window->state.maximized_vert = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_SHADED:
-            ((struct _Ecore_Win32_Window *)window)->state.shaded = 1;
+            window->state.shaded = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_HIDDEN:
-            ((struct _Ecore_Win32_Window *)window)->state.hidden = 1;
+            window->state.hidden = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_FULLSCREEN:
-            ((struct _Ecore_Win32_Window *)window)->state.fullscreen = 1;
+            window->state.fullscreen = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_ABOVE:
-            ((struct _Ecore_Win32_Window *)window)->state.above = 1;
+            window->state.above = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_BELOW:
-            ((struct _Ecore_Win32_Window *)window)->state.below = 1;
+            window->state.below = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION:
-            ((struct _Ecore_Win32_Window *)window)->state.demands_attention = 1;
+            window->state.demands_attention = 1;
             break;
           case ECORE_WIN32_WINDOW_STATE_UNKNOWN:
             /* nothing to be done */
@@ -661,262 +1218,201 @@ ecore_win32_window_state_set(Ecore_Win32_Window       *window,
      }
 }
 
-void
+/**
+ * @brief Apply the modification of the state to the given window.
+ *
+ * @param window The window.
+ * @param state The state to apply changes.
+ * @param set The value of the state change.
+ *
+ * This function applies the modification of the state @p state of
+ * @p window. @p set is used only for
+ * #ECORE_WIN32_WINDOW_STATE_ICONIFIED and
+ * #ECORE_WIN32_WINDOW_STATE_FULLSCREEN. If @p window is @c NULL, the
+ * function does nothing.
+ */
+EAPI void
 ecore_win32_window_state_request_send(Ecore_Win32_Window      *window,
                                       Ecore_Win32_Window_State state,
                                       unsigned int             set)
 {
-  if (!window)
-    return;
+   if (!window) return;
+
+   INF("sending cursor state");
 
    switch (state)
      {
-     case ECORE_WIN32_WINDOW_STATE_ICONIFIED:
-       if (((struct _Ecore_Win32_Window *)window)->state.iconified)
-         ecore_win32_window_iconified_set(window, set);
-       break;
-     case ECORE_WIN32_WINDOW_STATE_MODAL:
-       ((struct _Ecore_Win32_Window *)window)->state.modal = 1;
-       break;
-     case ECORE_WIN32_WINDOW_STATE_STICKY:
-       ((struct _Ecore_Win32_Window *)window)->state.sticky = 1;
-       break;
-     case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT:
-       if (((struct _Ecore_Win32_Window *)window)->state.maximized_vert)
-         {
-            RECT rect;
-            int  y;
-            int  height;
-
-            if (!SystemParametersInfo(SPI_GETWORKAREA, 0,
-                                      &rect, 0))
-              break;
-            y = rect.top;
-            height = rect.bottom - rect.top;
-
-            if (!GetClientRect(((struct _Ecore_Win32_Window *)window)->window,
-                               &rect))
-              break;
-
-            MoveWindow(window, rect.left, y,
-                       rect.right - rect.left,
-                       height,
-                       TRUE);
-         }
-       break;
-     case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ:
-       if (((struct _Ecore_Win32_Window *)window)->state.maximized_horz)
-         {
-            RECT rect;
-
-            if (!GetClientRect(((struct _Ecore_Win32_Window *)window)->window,
-                               &rect))
-              break;
-
-            MoveWindow(window, 0, rect.top,
-                       GetSystemMetrics(SM_CXSCREEN),
-                       rect.bottom - rect.top,
-                       TRUE);
-         }
-       break;
-     case ECORE_WIN32_WINDOW_STATE_MAXIMIZED:
-       if (((struct _Ecore_Win32_Window *)window)->state.maximized_vert &&
-           ((struct _Ecore_Win32_Window *)window)->state.maximized_horz)
-         {
-            RECT rect;
-
-            if (!SystemParametersInfo(SPI_GETWORKAREA, 0,
-                                      &rect, 0))
-              break;
-
-            MoveWindow(window, 0, 0,
-                       GetSystemMetrics(SM_CXSCREEN),
-                       rect.bottom - rect.top,
-                       TRUE);
-         }
-       break;
-     case ECORE_WIN32_WINDOW_STATE_SHADED:
-       ((struct _Ecore_Win32_Window *)window)->state.shaded = 1;
-       break;
-     case ECORE_WIN32_WINDOW_STATE_HIDDEN:
-       ((struct _Ecore_Win32_Window *)window)->state.hidden = 1;
-       break;
-     case ECORE_WIN32_WINDOW_STATE_FULLSCREEN:
-       if (((struct _Ecore_Win32_Window *)window)->state.fullscreen)
-         ecore_win32_window_fullscreen_set(window, set);
-       break;
-     case ECORE_WIN32_WINDOW_STATE_ABOVE:
-       if (((struct _Ecore_Win32_Window *)window)->state.above)
-         SetWindowPos(((struct _Ecore_Win32_Window *)window)->window,
-                      HWND_TOP,
-                      0, 0,
-                      0, 0,
-                      SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
-       break;
-     case ECORE_WIN32_WINDOW_STATE_BELOW:
-       if (((struct _Ecore_Win32_Window *)window)->state.below)
-         SetWindowPos(((struct _Ecore_Win32_Window *)window)->window,
-                      HWND_BOTTOM,
-                      0, 0,
-                      0, 0,
-                      SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
-       break;
-     case ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION:
-       ((struct _Ecore_Win32_Window *)window)->state.demands_attention = 1;
-       break;
-     case ECORE_WIN32_WINDOW_STATE_UNKNOWN:
-       /* nothing to be done */
-       break;
+      case ECORE_WIN32_WINDOW_STATE_ICONIFIED:
+         if (window->state.iconified)
+           ecore_win32_window_iconified_set(window, set);
+         break;
+      case ECORE_WIN32_WINDOW_STATE_MODAL:
+         window->state.modal = 1;
+         break;
+      case ECORE_WIN32_WINDOW_STATE_STICKY:
+         window->state.sticky = 1;
+         break;
+      case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT:
+         if (window->state.maximized_vert)
+           {
+              RECT rect;
+              int  y;
+              int  height;
+
+              if (!SystemParametersInfo(SPI_GETWORKAREA, 0,
+                                        &rect, 0))
+                {
+                   ERR("SystemParametersInfo() failed");
+                   break;
+                }
+              y = rect.top;
+              height = rect.bottom - rect.top;
+
+              if (!GetClientRect(window->window, &rect))
+                {
+                   ERR("GetClientRect() failed");
+                   break;
+                }
+
+              if (!MoveWindow(window->window, rect.left, y,
+                              rect.right - rect.left,
+                              height,
+                              TRUE))
+                {
+                   ERR("MoveWindow() failed");
+                }
+           }
+         break;
+      case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ:
+         if (window->state.maximized_horz)
+           {
+              RECT rect;
+
+              if (!GetClientRect(window->window, &rect))
+                {
+                   ERR("GetClientRect() failed");
+                   break;
+                }
+
+              if (!MoveWindow(window->window, 0, rect.top,
+                              GetSystemMetrics(SM_CXSCREEN),
+                              rect.bottom - rect.top,
+                              TRUE))
+                {
+                   ERR("MoveWindow() failed");
+                }
+           }
+         break;
+      case ECORE_WIN32_WINDOW_STATE_MAXIMIZED:
+         if (window->state.maximized_vert && window->state.maximized_horz)
+           {
+              RECT rect;
+
+              if (!SystemParametersInfo(SPI_GETWORKAREA, 0,
+                                        &rect, 0))
+                {
+                   ERR("SystemParametersInfo() failed");
+                   break;
+                }
+
+              if (!MoveWindow(window->window, 0, 0,
+                              GetSystemMetrics(SM_CXSCREEN),
+                              rect.bottom - rect.top,
+                              TRUE))
+                {
+                   ERR("MoveWindow() failed");
+                }
+           }
+         break;
+      case ECORE_WIN32_WINDOW_STATE_SHADED:
+         window->state.shaded = 1;
+         break;
+      case ECORE_WIN32_WINDOW_STATE_HIDDEN:
+         window->state.hidden = 1;
+         break;
+      case ECORE_WIN32_WINDOW_STATE_FULLSCREEN:
+         if (window->state.fullscreen)
+           ecore_win32_window_fullscreen_set(window, set);
+         break;
+      case ECORE_WIN32_WINDOW_STATE_ABOVE:
+         if (window->state.above)
+           if (!SetWindowPos(window->window, HWND_TOP,
+                             0, 0,
+                             0, 0,
+                             SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW))
+             {
+                ERR("SetWindowPos() failed");
+             }
+         break;
+      case ECORE_WIN32_WINDOW_STATE_BELOW:
+         if (window->state.below)
+           if (!SetWindowPos(window->window, HWND_BOTTOM,
+                             0, 0,
+                             0, 0,
+                             SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW))
+             {
+                ERR("SetWindowPos() failed");
+             }
+         break;
+      case ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION:
+         window->state.demands_attention = 1;
+         break;
+      case ECORE_WIN32_WINDOW_STATE_UNKNOWN:
+         /* nothing to be done */
+         break;
      }
 }
 
-void
+/**
+ * @brief Set the type of the given window.
+ *
+ * @param window The window to modify the type.
+ * @param type The nwindow types.
+ *
+ * This function set the type of @p window to @p type. If
+ * @p window is @c NULL, the function does nothing.
+ */
+EAPI void
 ecore_win32_window_type_set(Ecore_Win32_Window      *window,
                             Ecore_Win32_Window_Type  type)
 {
+   if (!window)
+     return;
+
+   INF("setting window type");
+
    switch (type)
      {
      case ECORE_WIN32_WINDOW_TYPE_DESKTOP:
-       ((struct _Ecore_Win32_Window *)window)->type.desktop = 1;
+       window->type.desktop = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_DOCK:
-       ((struct _Ecore_Win32_Window *)window)->type.dock = 1;
+       window->type.dock = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_TOOLBAR:
-       ((struct _Ecore_Win32_Window *)window)->type.toolbar = 1;
+       window->type.toolbar = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_MENU:
-       ((struct _Ecore_Win32_Window *)window)->type.menu = 1;
+       window->type.menu = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_UTILITY:
-       ((struct _Ecore_Win32_Window *)window)->type.utility = 1;
+       window->type.utility = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_SPLASH:
-       ((struct _Ecore_Win32_Window *)window)->type.splash = 1;
+       window->type.splash = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_DIALOG:
-       ((struct _Ecore_Win32_Window *)window)->type.dialog = 1;
+       window->type.dialog = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_NORMAL:
-       ((struct _Ecore_Win32_Window *)window)->type.normal = 1;
+       window->type.normal = 1;
        break;
      case ECORE_WIN32_WINDOW_TYPE_UNKNOWN:
-       ((struct _Ecore_Win32_Window *)window)->type.normal = 1;
+       window->type.normal = 1;
        break;
      }
 }
 
-
-/***** Private functions definitions *****/
-
-static Ecore_Win32_Window *
-ecore_win32_window_internal_new(Ecore_Win32_Window *parent,
-                                int                 x,
-                                int                 y,
-                                int                 width,
-                                int                 height,
-                                DWORD               style)
-{
-   RECT                        rect;
-   struct _Ecore_Win32_Window *w;
-   int                         minimal_width;
-   int                         minimal_height;
-
-   w = (struct _Ecore_Win32_Window *)calloc(1, sizeof(struct _Ecore_Win32_Window));
-   if (!w)
-     return NULL;
-
-   printf (" *** ecore_win32_window_new : %p  %d %d %d\n",
-           w,
-           width, height, GetSystemMetrics(SM_CXMIN));
-   rect.left = 0;
-   rect.top = 0;
-   rect.right = width;
-   rect.bottom = height;
-   if (!AdjustWindowRect(&rect, style, FALSE))
-     {
-        free(w);
-        return NULL;
-     }
-   printf (" * ecore : new debut : %ld %d %d\n",
-           rect.right - rect.left, GetSystemMetrics(SM_CXMIN), GetSystemMetrics(SM_CYMIN));
-
-   minimal_width = GetSystemMetrics(SM_CXMIN);
-   minimal_height = GetSystemMetrics(SM_CYMIN);
-/*    if (((rect.right - rect.left) < minimal_width) || */
-/*        ((rect.bottom - rect.top) < minimal_height)) */
-/*      { */
-/*         fprintf (stderr, "[Ecore] [Win32] ERROR !!\n"); */
-/*         fprintf (stderr, "                Wrong size %ld\n", rect.right - rect.left); */
-/*         free(w); */
-/*         return NULL; */
-/*      } */
-   if ((rect.right - rect.left) < minimal_width)
-     {
-       rect.right = rect.left + minimal_width;
-     }
-
-   w->window = CreateWindow(ECORE_WIN32_WINDOW_CLASS, "",
-                            style,
-                            x, y,
-                            rect.right - rect.left,
-                            rect.bottom - rect.top,
-                            parent ? ((struct _Ecore_Win32_Window *)parent)->window : NULL,
-                            NULL, _ecore_win32_instance, NULL);
-   if (!w->window)
-     {
-        free(w);
-        return NULL;
-     }
-
-   SetLastError(0);
-   if (!SetWindowLong(w->window, GWL_USERDATA, (LONG)w) && (GetLastError() != 0))
-     {
-        DestroyWindow(w->window);
-        free(w);
-        return NULL;
-     }
-
-   w->min_width   = 0;
-   w->min_height  = 0;
-   w->max_width   = 32767;
-   w->max_height  = 32767;
-   w->base_width  = -1;
-   w->base_height = -1;
-   w->step_width  = -1;
-   w->step_height = -1;
-
-   w->state.iconified         = 0;
-   w->state.modal             = 0;
-   w->state.sticky            = 0;
-   w->state.maximized_vert    = 0;
-   w->state.maximized_horz    = 0;
-   w->state.shaded            = 0;
-   w->state.hidden            = 0;
-   w->state.fullscreen        = 0;
-   w->state.above             = 0;
-   w->state.below             = 0;
-   w->state.demands_attention = 0;
-
-   w->type.desktop = 0;
-   w->type.dock    = 0;
-   w->type.toolbar = 0;
-   w->type.menu    = 0;
-   w->type.utility = 0;
-   w->type.splash  = 0;
-   w->type.dialog  = 0;
-   w->type.normal  = 0;
-
-   w->pointer_is_in = 0;
-   w->borderless    = 0;
-   w->iconified     = 0;
-   w->fullscreen    = 0;
-
-   printf (" *** ecore_win32_window_new fin : (%d %d) (%d %d)\n",
-           w->min_width,
-           w->min_height,
-           w->max_width,
-           w->max_height);
-
-   return w;
-}
+/**
+ * @}
+ */
index 0b6b46a..20c1975 100644 (file)
@@ -1,16 +1,23 @@
+#ifndef __ECORE_WINCE_H__
+#define __ECORE_WINCE_H__
+
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ * DO NOT USE THIS HEADER. IT IS WORK IN PROGRESS. IT IS NOT FINAL AND
+ * THE API MAY CHANGE.
  */
 
-#ifndef __ECORE_WINCE_H__
-#define __ECORE_WINCE_H__
+#ifndef ECORE_WINCE_WIP_OSXCKQSD
+# warning "You are using a work in progress API. This API is not stable"
+# warning "and is subject to change. You use this at your own risk."
+#endif
 
+#include <Eina.h>
 
 #ifdef EAPI
 # undef EAPI
 #endif
 
-#ifdef _WINCE
+#ifdef _WIN32
 # ifdef EFL_ECORE_WINCE_BUILD
 #  ifdef DLL_EXPORT
 #   define EAPI __declspec(dllexport)
 extern "C" {
 #endif
 
+/**
+ * @defgroup Ecore_WinCE_Group Ecore_WinCE library
+ *
+ * @{
+ */
 
-typedef void Ecore_WinCE_Window;
 
+/**
+ * @typedef Ecore_WinCE_Window
+ * Abstract type for a window.
+ */
+typedef struct _Ecore_WinCE_Window Ecore_WinCE_Window;
 
-/* Events */
 
-typedef struct _Ecore_WinCE_Event_Key_Down              Ecore_WinCE_Event_Key_Down;
-typedef struct _Ecore_WinCE_Event_Key_Up                Ecore_WinCE_Event_Key_Up;
-typedef struct _Ecore_WinCE_Event_Mouse_Button_Down     Ecore_WinCE_Event_Mouse_Button_Down;
-typedef struct _Ecore_WinCE_Event_Mouse_Button_Up       Ecore_WinCE_Event_Mouse_Button_Up;
-typedef struct _Ecore_WinCE_Event_Mouse_Move            Ecore_WinCE_Event_Mouse_Move;
+/**
+ * @typedef Ecore_WinCE_Event_Mouse_In
+ * Event sent when the mouse enters the window.
+ */
 typedef struct _Ecore_WinCE_Event_Mouse_In              Ecore_WinCE_Event_Mouse_In;
+
+/**
+ * @typedef Ecore_WinCE_Event_Mouse_Out
+ * Event sent when the mouse leaves the window.
+ */
 typedef struct _Ecore_WinCE_Event_Mouse_Out             Ecore_WinCE_Event_Mouse_Out;
+
+/**
+ * @typedef Ecore_WinCE_Event_Window_Focus_In
+ * Event sent when the window gets the focus.
+ */
 typedef struct _Ecore_WinCE_Event_Window_Focus_In       Ecore_WinCE_Event_Window_Focus_In;
+
+/**
+ * @typedef Ecore_WinCE_Event_Window_Focus_Out
+ * Event sent when the window looses the focus.
+ */
 typedef struct _Ecore_WinCE_Event_Window_Focus_Out      Ecore_WinCE_Event_Window_Focus_Out;
+
+/**
+ * @typedef Ecore_WinCE_Event_Window_Damage
+ * Event sent when the window is damaged.
+ */
 typedef struct _Ecore_WinCE_Event_Window_Damage         Ecore_WinCE_Event_Window_Damage;
+
+/**
+ * @typedef Ecore_WinCE_Event_Window_Create
+ * Event sent when the window is created.
+ */
 typedef struct _Ecore_WinCE_Event_Window_Create         Ecore_WinCE_Event_Window_Create;
-typedef struct _Ecore_WinCE_Event_Window_Destroy        Ecore_WinCE_Event_Window_Destroy;
-typedef struct _Ecore_WinCE_Event_Window_Hide           Ecore_WinCE_Event_Window_Hide;
-typedef struct _Ecore_WinCE_Event_Window_Show           Ecore_WinCE_Event_Window_Show;
-typedef struct _Ecore_WinCE_Event_Window_Delete_Request Ecore_WinCE_Event_Window_Delete_Request;
 
-struct _Ecore_WinCE_Event_Key_Down
-{
-   Ecore_WinCE_Window *window;
-   char               *keyname;
-   char               *keysymbol;
-   char               *keycompose;
-   double              time;
-};
+/**
+ * @typedef Ecore_WinCE_Event_Window_Destroy
+ * Event sent when the window is destroyed.
+ */
+typedef struct _Ecore_WinCE_Event_Window_Destroy        Ecore_WinCE_Event_Window_Destroy;
 
-struct _Ecore_WinCE_Event_Key_Up
-{
-   Ecore_WinCE_Window *window;
-   char               *keyname;
-   char               *keysymbol;
-   char               *keycompose;
-   double              time;
-};
+/**
+ * @typedef Ecore_WinCE_Event_Window_Hide
+ * Event sent when the window is hidden.
+ */
+typedef struct _Ecore_WinCE_Event_Window_Hide           Ecore_WinCE_Event_Window_Hide;
 
-struct _Ecore_WinCE_Event_Mouse_Button_Down
-{
-   Ecore_WinCE_Window *window;
-   int                 button;
-   int                 x;
-   int                 y;
-   double              time;
-   unsigned int        double_click : 1;
-   unsigned int        triple_click : 1;
-};
+/**
+ * @typedef Ecore_WinCE_Event_Window_Show
+ * Event sent when the window is shown.
+ */
+typedef struct _Ecore_WinCE_Event_Window_Show           Ecore_WinCE_Event_Window_Show;
 
-struct _Ecore_WinCE_Event_Mouse_Button_Up
-{
-   Ecore_WinCE_Window *window;
-   int                 button;
-   int                 x;
-   int                 y;
-   double              time;
-   unsigned int        double_click : 1;
-   unsigned int        triple_click : 1;
-};
+/**
+ * @typedef Ecore_WinCE_Event_Window_Delete_Request
+ * Event sent when the window is deleted.
+ */
+typedef struct _Ecore_WinCE_Event_Window_Delete_Request Ecore_WinCE_Event_Window_Delete_Request;
 
-struct _Ecore_WinCE_Event_Mouse_Move
-{
-   Ecore_WinCE_Window *window;
-   int                 x;
-   int                 y;
-   double              time;
-};
 
+/**
+ * @struct _Ecore_WinCE_Event_Mouse_In
+ * Event sent when the mouse enters the window.
+ */
 struct _Ecore_WinCE_Event_Mouse_In
 {
-   Ecore_WinCE_Window *window;
-   int                 x;
-   int                 y;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   int                 x; /**< The x coordinate where the mouse entered */
+   int                 y; /**< The y coordinate where the mouse entered */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Mouse_Out
+ * Event sent when the mouse leaves the window.
+ */
 struct _Ecore_WinCE_Event_Mouse_Out
 {
-   Ecore_WinCE_Window *window;
-   int                 x;
-   int                 y;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   int                 x; /**< The x coordinate where the mouse leaved */
+   int                 y; /**< The y coordinate where the mouse leaved */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Focus_In
+ * Event sent when the window gets the focus.
+ */
 struct _Ecore_WinCE_Event_Window_Focus_In
 {
-   Ecore_WinCE_Window *window;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Focus_Out
+ * Event sent when the window looses the focus.
+ */
 struct _Ecore_WinCE_Event_Window_Focus_Out
 {
-   Ecore_WinCE_Window *window;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Damage
+ * Event sent when the window is damaged.
+ */
 struct _Ecore_WinCE_Event_Window_Damage
 {
-   Ecore_WinCE_Window *window;
-   int                 x;
-   int                 y;
-   int                 width;
-   int                 height;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   int                 x; /**< The x coordinate of the top left corner of the damaged region */
+   int                 y; /**< The y coordinate of the top left corner of the damaged region */
+   int                 width; /**< The width of the damaged region */
+   int                 height; /**< The height of the damaged region */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Create
+ * Event sent when the window is created.
+ */
 struct _Ecore_WinCE_Event_Window_Create
 {
-   Ecore_WinCE_Window *window;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Destroy
+ * Event sent when the window is destroyed.
+ */
 struct _Ecore_WinCE_Event_Window_Destroy
 {
-   Ecore_WinCE_Window *window;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Hide
+ * Event sent when the window is hidden.
+ */
 struct _Ecore_WinCE_Event_Window_Hide
 {
-   Ecore_WinCE_Window *window;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Show
+ * Event sent when the window is shown.
+ */
 struct _Ecore_WinCE_Event_Window_Show
 {
-   Ecore_WinCE_Window *window;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   long                time; /**< The time the event occurred */
 };
 
+/**
+ * @struct _Ecore_WinCE_Event_Window_Delete_Request
+ * Event sent when the window is deleted.
+ */
 struct _Ecore_WinCE_Event_Window_Delete_Request
 {
-   Ecore_WinCE_Window *window;
-   double              time;
+   Ecore_WinCE_Window *window; /**< The window that received the event */
+   long                time; /**< The time the event occurred */
 };
 
 
-EAPI extern int ECORE_WINCE_EVENT_KEY_DOWN;
-EAPI extern int ECORE_WINCE_EVENT_KEY_UP;
-EAPI extern int ECORE_WINCE_EVENT_MOUSE_BUTTON_DOWN;
-EAPI extern int ECORE_WINCE_EVENT_MOUSE_BUTTON_UP;
-EAPI extern int ECORE_WINCE_EVENT_MOUSE_MOVE;
-EAPI extern int ECORE_WINCE_EVENT_MOUSE_IN;
-EAPI extern int ECORE_WINCE_EVENT_MOUSE_OUT;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_DAMAGE;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_CREATE;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_DESTROY;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_HIDE;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_SHOW;
-EAPI extern int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST;
+EAPI extern int ECORE_WINCE_EVENT_MOUSE_IN; /**< Ecore_Event for the #Ecore_WinCE_Event_Mouse_In event */
+EAPI extern int ECORE_WINCE_EVENT_MOUSE_OUT; /**< Ecore_Event for the #Ecore_WinCE_Event_Mouse_Out event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN; /**< Ecore_Event for the #Ecore_WinCE_Event_Window_Focus_In event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT; /**< Ecore_Event for the #Ecore_WinCE_Event_Window_Focus_Out event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_DAMAGE; /**< Ecore_Event for the Ecore_WinCE_Event_Damage event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_CREATE; /**< Ecore_Event for the Ecore_WinCE_Event_Create event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_DESTROY; /**< Ecore_Event for the Ecore_WinCE_Event_Destroy event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_HIDE; /**< Ecore_Event for the Ecore_WinCE_Event_Hide event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_SHOW; /**< Ecore_Event for the Ecore_WinCE_Event_Show event */
+EAPI extern int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST; /**< Ecore_Event for the #Ecore_WinCE_Event_Window_Delete_Request event */
 
 
 /* Core */
 
 EAPI int    ecore_wince_init();
 EAPI int    ecore_wince_shutdown();
-EAPI double ecore_wince_current_time_get(void);
-EAPI void   ecore_wince_message_loop_begin (void);
+EAPI void   ecore_wince_double_click_time_set(double t);
+EAPI double ecore_wince_double_click_time_get(void);
+EAPI long   ecore_wince_current_time_get(void);
 
 /* Window */
 
@@ -207,17 +255,40 @@ EAPI Ecore_WinCE_Window *ecore_wince_window_new(Ecore_WinCE_Window *parent,
                                                 int                 width,
                                                 int                 height);
 
-EAPI void ecore_wince_window_del(Ecore_WinCE_Window *window);
+EAPI void ecore_wince_window_free(Ecore_WinCE_Window *window);
+
+EAPI void *ecore_wince_window_hwnd_get(Ecore_WinCE_Window *window);
+
+EAPI void ecore_wince_window_move(Ecore_WinCE_Window *window,
+                                  int                 x,
+                                  int                 y);
+
+EAPI void ecore_wince_window_resize(Ecore_WinCE_Window *window,
+                                    int                 width,
+                                    int                 height);
+
+EAPI void ecore_wince_window_move_resize(Ecore_WinCE_Window *window,
+                                         int                 x,
+                                         int                 y,
+                                         int                 width,
+                                         int                 height);
 
 EAPI void ecore_wince_window_show(Ecore_WinCE_Window *window);
 
 EAPI void ecore_wince_window_hide(Ecore_WinCE_Window *window);
 
+EAPI void ecore_wince_window_title_set(Ecore_WinCE_Window *window,
+                                       const char         *title);
+
+EAPI void ecore_wince_window_focus(Ecore_WinCE_Window *window);
+
+EAPI void *ecore_wince_window_focus_get(void);
+
 EAPI void ecore_wince_window_backend_set(Ecore_WinCE_Window *window, int backend);
 
-EAPI void ecore_wince_window_suspend_set(Ecore_WinCE_Window *window, int (*suspend)(int));
+EAPI void ecore_wince_window_suspend_cb_set(Ecore_WinCE_Window *window, int (*suspend_cb)(int));
 
-EAPI void ecore_wince_window_resume_set(Ecore_WinCE_Window *window, int (*resume)(int));
+EAPI void ecore_wince_window_resume_cb_set(Ecore_WinCE_Window *window, int (*resume_cb)(int));
 
 EAPI void ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
                                           int                *x,
@@ -229,8 +300,12 @@ EAPI void ecore_wince_window_size_get(Ecore_WinCE_Window *window,
                                       int                *width,
                                       int                *height);
 
-EAPI void *ecore_wince_window_window_get(Ecore_WinCE_Window *window);
+EAPI void ecore_wince_window_fullscreen_set(Ecore_WinCE_Window *window,
+                                            Eina_Bool           on);
 
+/**
+ * @}
+ */
 
 #ifdef __cplusplus
 }
index d5f3499..a264ffb 100644 (file)
@@ -2,17 +2,20 @@ MAINTAINERCLEANFILES = Makefile.in
 
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
--I$(top_builddir)/src/lib/ecore
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_input \
+@EFL_ECORE_WINCE_BUILD@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@ \
+@WIN32_CPPFLAGS@
 
 AM_CFLAGS = @WIN32_CFLAGS@
 
-
-if BUILD_ECORE_WINCE
-
 lib_LTLIBRARIES = libecore_wince.la
 
-include_HEADERS = \
-Ecore_WinCE.h
+includes_HEADERS = Ecore_WinCE.h
+includesdir = $(includedir)/ecore-@VMAJ@
 
 libecore_wince_la_SOURCES = \
 ecore_wince.c \
@@ -21,11 +24,12 @@ ecore_wince_window.c
 
 libecore_wince_la_LIBADD = \
 @WIN32_LIBS@ \
-$(top_builddir)/src/lib/ecore/libecore.la
-
-libecore_wince_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+$(top_builddir)/src/lib/ecore/libecore.la \
+@EVAS_LIBS@ \
+@EINA_LIBS@ \
+@EVIL_LIBS@
 
-endif
+libecore_wince_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
 
-EXTRA_DIST = \
-ecore_wince_private.h
+EXTRA_DIST = ecore_wince_private.h
index 71ebf77..5638ad3 100644 (file)
@@ -1,6 +1,6 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
 #include <stdlib.h>
 #include <stdio.h>   /* for printf */
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
 
-#include "Ecore.h"
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+
 #include "Ecore_WinCE.h"
 #include "ecore_wince_private.h"
 
-
-/***** Global declarations *****/
-
-double              _ecore_wince_double_click_time = 0.25;
-double              _ecore_wince_event_last_time = 0.0;
-Ecore_WinCE_Window *_ecore_wince_event_last_window = NULL;
-HINSTANCE           _ecore_wince_instance = NULL;
-
-int ECORE_WINCE_EVENT_KEY_DOWN              = 0;
-int ECORE_WINCE_EVENT_KEY_UP                = 0;
-int ECORE_WINCE_EVENT_MOUSE_BUTTON_DOWN     = 0;
-int ECORE_WINCE_EVENT_MOUSE_BUTTON_UP       = 0;
-int ECORE_WINCE_EVENT_MOUSE_MOVE            = 0;
-int ECORE_WINCE_EVENT_MOUSE_IN              = 0;
-int ECORE_WINCE_EVENT_MOUSE_OUT             = 0;
-int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = 0;
-int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = 0;
-int ECORE_WINCE_EVENT_WINDOW_DAMAGE         = 0;
-int ECORE_WINCE_EVENT_WINDOW_CREATE         = 0;
-int ECORE_WINCE_EVENT_WINDOW_DESTROY        = 0;
-int ECORE_WINCE_EVENT_WINDOW_SHOW           = 0;
-int ECORE_WINCE_EVENT_WINDOW_HIDE           = 0;
-int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = 0;
-
-
-/***** Private declarations *****/
-
-static int       _ecore_wince_init_count = 0;
-
-
-LRESULT CALLBACK _ecore_wince_window_procedure(HWND   window,
-                                               UINT   message,
-                                               WPARAM window_param,
-                                               LPARAM data_param);
-
-
-/***** API *****/
-
-int
-ecore_wince_init()
-{
-   WNDCLASS wc;
-
-   if (_ecore_wince_init_count > 0)
-     {
-       _ecore_wince_init_count++;
-       return _ecore_wince_init_count;
-     }
-
-   _ecore_wince_instance = GetModuleHandle(NULL);
-   if (!_ecore_wince_instance)
-     return 0;
-
-   memset (&wc, 0, sizeof (wc));
-   wc.style = CS_HREDRAW | CS_VREDRAW;
-   wc.lpfnWndProc = _ecore_wince_window_procedure;
-   wc.cbClsExtra = 0;
-   wc.cbWndExtra = 0;
-   wc.hInstance = _ecore_wince_instance;
-   wc.hIcon = NULL;
-   wc.hCursor = LoadCursor (NULL, IDC_ARROW);
-   wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
-   wc.lpszMenuName =  NULL;
-   wc.lpszClassName = ECORE_WINCE_WINDOW_CLASS;
-
-   if(!RegisterClass(&wc))
-     {
-        FreeLibrary(_ecore_wince_instance);
-        return 0;
-     }
-
-   if (!ECORE_WINCE_EVENT_KEY_DOWN)
-     {
-        ECORE_WINCE_EVENT_KEY_DOWN              = ecore_event_type_new();
-        ECORE_WINCE_EVENT_KEY_UP                = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_BUTTON_DOWN     = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_BUTTON_UP       = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_MOVE            = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_IN              = ecore_event_type_new();
-        ECORE_WINCE_EVENT_MOUSE_OUT             = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_DAMAGE         = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_CREATE         = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_DESTROY        = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_SHOW           = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_HIDE           = ecore_event_type_new();
-        ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
-     }
-
-   _ecore_wince_init_count++;
-
-   printf ("ecore_wince : instance + class bon\n");
-
-   return _ecore_wince_init_count;
-}
-
-int
-ecore_wince_shutdown()
-{
-   _ecore_wince_init_count++;
-   if (_ecore_wince_init_count > 0) return _ecore_wince_init_count;
-   if (!_ecore_wince_instance) return _ecore_wince_init_count;
-
-   UnregisterClass(ECORE_WINCE_WINDOW_CLASS, _ecore_wince_instance);
-   FreeLibrary(_ecore_wince_instance);
-   _ecore_wince_instance = NULL;
-
-   if (_ecore_wince_init_count < 0) _ecore_wince_init_count = 0;
-
-   return _ecore_wince_init_count;
-}
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
 
 /**
- * Sets the timeout for a double and triple clicks to be flagged.
- *
- * This sets the time between clicks before the double_click flag is
- * set in a button down event. If 3 clicks occur within double this
- * time, the triple_click flag is also set.
- *
- * @param t The time in seconds
+ * @cond LOCAL
  */
-EAPI void
-ecore_wince_double_click_time_set(double t)
-{
-   if (t < 0.0) t = 0.0;
-   _ecore_wince_double_click_time = t;
-}
 
-/**
- * Retrieves the double and triple click flag timeout.
- *
- * See @ref ecore_wince_double_click_time_set for more information.
- *
- * @return The timeout for double clicks in seconds.
- */
-EAPI double
-ecore_wince_double_click_time_get(void)
-{
-   return _ecore_wince_double_click_time;
-}
-
-/**
- * Return the last event time
- */
-EAPI double
-ecore_wince_current_time_get(void)
-{
-   return _ecore_wince_event_last_time;
-}
-
-
-/***** Private functions definitions *****/
+static int       _ecore_wince_init_count = 0;
 
 LRESULT CALLBACK
 _ecore_wince_window_procedure(HWND   window,
@@ -193,53 +52,50 @@ _ecore_wince_window_procedure(HWND   window,
    switch (data->message)
      {
        /* Keyboard input notifications */
+     case WM_CHAR:
+       _ecore_wince_event_handle_key_press(data, 0);
+       break;
      case WM_HOTKEY:
-       printf (" * ecore message : keystroke down (hotkey)\n");
-       _ecore_wince_event_handle_key_press(data);
-       return 0;
+       _ecore_wince_event_handle_key_press(data, 1);
+       break;
      case WM_KEYDOWN:
-       printf (" * ecore message : keystroke down\n");
-       _ecore_wince_event_handle_key_press(data);
-       return 0;
+     case WM_SYSKEYDOWN:
+       _ecore_wince_event_handle_key_press(data, 1);
+       break;
      case WM_KEYUP:
-       printf (" * ecore message : keystroke up\n");
-       _ecore_wince_event_handle_key_release(data);
-       return 0;
+     case WM_SYSKEYUP:
+       _ecore_wince_event_handle_key_release(data, 1);
+       break;
      case WM_SETFOCUS:
-       printf (" * ecore message : focus in\n");
        _ecore_wince_event_handle_focus_in(data);
-       return 0;
+       break;
      case WM_KILLFOCUS:
-       printf (" * ecore message : focus out\n");
        _ecore_wince_event_handle_focus_out(data);
-       return 0;
+       break;
        /* Mouse input notifications */
      case WM_LBUTTONDOWN:
-       printf (" * ecore message : lbuttondown\n");
        _ecore_wince_event_handle_button_press(data, 1);
-       return 0;
+       break;
      case WM_LBUTTONUP:
-       printf (" * ecore message : lbuttonup\n");
        _ecore_wince_event_handle_button_release(data, 1);
-       return 0;
+       break;
      case WM_MOUSEMOVE:
        {
-          RECT                        rect;
-          struct _Ecore_WinCE_Window *w = NULL;
+          RECT                rect;
+          Ecore_WinCE_Window *w = NULL;
 
-          w = (struct _Ecore_WinCE_Window *)GetWindowLong(window, GWL_USERDATA);
-          printf (" * ecore message : mouse move\n");
+          w = (Ecore_WinCE_Window *)GetWindowLong(window, GWL_USERDATA);
 
           if (GetClientRect(window, &rect))
             {
                POINT pt;
 
-               printf ("GetClientRect !!\n");
+               INF("mouse in window");
+
                pt.x = LOWORD(data_param);
                pt.y = HIWORD(data_param);
                if (!PtInRect(&rect, pt))
                  {
-                    printf ("pas dans rect...\n");
                     if (w->pointer_is_in)
                       {
                          w->pointer_is_in = 0;
@@ -248,10 +104,8 @@ _ecore_wince_window_procedure(HWND   window,
                  }
                else
                  {
-                    printf ("dans rect... %d\n", w->pointer_is_in);
                     if (!w->pointer_is_in)
                       {
-                         printf ("w->pointer_is_in a 0\n");
                          w->pointer_is_in = 1;
                          _ecore_wince_event_handle_enter_notify(data);
                       }
@@ -259,65 +113,288 @@ _ecore_wince_window_procedure(HWND   window,
             }
           else
             {
-               printf ("pas de GetClientRect !!\n");
+               ERR("GetClientRect() failed");
             }
           _ecore_wince_event_handle_motion_notify(data);
 
-          return 0;
+          break;
        }
        /* Window notifications */
      case WM_CREATE:
-       {
-         RECT rect;
-         GetClientRect(window, &rect);
-         printf (" *** ecore message : create %ld %ld\n",
-                 rect.right - rect.left, rect.bottom - rect.top);
-       }
        _ecore_wince_event_handle_create_notify(data);
-       return 0;
+       break;
      case WM_DESTROY:
-       printf (" * ecore message : destroy\n");
        _ecore_wince_event_handle_destroy_notify(data);
-       return 0;
+       break;
      case WM_SHOWWINDOW:
-       {
-         RECT rect;
-         GetClientRect(window, &rect);
-         printf (" *** ecore message : show %ld %ld\n",
-                 rect.right - rect.left, rect.bottom - rect.top);
-       }
        if ((data->data_param == SW_OTHERUNZOOM) ||
-           (data->data_param == SW_OTHERUNZOOM))
-         return 0;
+           (data->data_param == SW_OTHERZOOM))
+         break;
 
        if (data->window_param)
          _ecore_wince_event_handle_map_notify(data);
        else
          _ecore_wince_event_handle_unmap_notify(data);
 
-       return 0;
+       break;
      case WM_CLOSE:
-       printf (" * ecore message : close\n");
        _ecore_wince_event_handle_delete_request(data);
-       return 0;
+       break;
        /* GDI notifications */
+     case WM_ERASEBKGND:
+       return 1;
      case WM_PAINT:
        {
-          RECT rect;
           PAINTSTRUCT paint;
 
-          printf (" * ecore message : paint\n");
           if (BeginPaint(window, &paint))
             {
-               printf (" * ecore message : painting...\n");
                data->update = paint.rcPaint;
                _ecore_wince_event_handle_expose(data);
                EndPaint(window, &paint);
             }
-          return 0;
+          break;
        }
      default:
        return DefWindowProc(window, message, window_param, data_param);
      }
 
+   return 0;
+}
+
+static void
+_ecore_wince_error_print_cb(const Eina_Log_Domain *d __UNUSED__,
+                            Eina_Log_Level  level __UNUSED__,
+                            const char     *file __UNUSED__,
+                            const char     *fnc,
+                            int             line,
+                            const char     *fmt,
+                            void           *data __UNUSED__,
+                            va_list         args)
+{
+   fprintf(stderr, "[%s:%d] ", fnc, line);
+   vfprintf(stderr, fmt, args);
+}
+
+/**
+ * @endcond
+ */
+
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+
+double              _ecore_wince_double_click_time = 0.25;
+long                _ecore_wince_event_last_time = 0;
+Ecore_WinCE_Window *_ecore_wince_event_last_window = NULL;
+HINSTANCE           _ecore_wince_instance = NULL;
+int                 _ecore_wince_log_dom_global = -1;
+
+int ECORE_WINCE_EVENT_MOUSE_IN              = 0;
+int ECORE_WINCE_EVENT_MOUSE_OUT             = 0;
+int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = 0;
+int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = 0;
+int ECORE_WINCE_EVENT_WINDOW_DAMAGE         = 0;
+int ECORE_WINCE_EVENT_WINDOW_CREATE         = 0;
+int ECORE_WINCE_EVENT_WINDOW_DESTROY        = 0;
+int ECORE_WINCE_EVENT_WINDOW_SHOW           = 0;
+int ECORE_WINCE_EVENT_WINDOW_HIDE           = 0;
+int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = 0;
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Ecore_WinCE_Group Ecore_WinCE library
+ *
+ * Ecore_WinCE is a library that wraps Windows CE graphic functions
+ * and integrate them nicely into the Ecore main loop.
+ *
+ * @{
+ */
+
+/**
+ * @brief Initialize the Ecore_WinCE library.
+ *
+ * @return 1 or greater on success, 0 on error.
+ *
+ * This function sets up the Windows CE graphic system. It returns 0 on
+ * failure, otherwise it returns the number of times it has already been
+ * called.
+ *
+ * When Ecore_WinCE is not used anymore, call ecore_wince_shutdown()
+ * to shut down the Ecore_WinCE library.
+ */
+EAPI int
+ecore_wince_init()
+{
+   WNDCLASS wc;
+
+   if (++_ecore_wince_init_count != 1)
+     return _ecore_wince_init_count;
+
+   if (!eina_init())
+     return --_ecore_wince_init_count;
+
+   eina_log_print_cb_set(_ecore_wince_error_print_cb, NULL);
+   _ecore_wince_log_dom_global = eina_log_domain_register
+     ("ecore_wince", ECORE_WINCE_DEFAULT_LOG_COLOR);
+   if (_ecore_wince_log_dom_global < 0)
+     {
+        EINA_LOG_ERR("Ecore_WinCE: Could not register log domain");
+        goto shutdown_eina;
+      }
+
+   if (!ecore_event_init())
+     {
+        ERR("Ecore_WinCE: Could not init ecore_event");
+        goto unregister_log_domain;
+     }
+
+   _ecore_wince_instance = GetModuleHandle(NULL);
+   if (!_ecore_wince_instance)
+     {
+        ERR("GetModuleHandle() failed");
+        goto shutdown_ecore_event;
+     }
+
+   memset (&wc, 0, sizeof (wc));
+   wc.style = CS_HREDRAW | CS_VREDRAW;
+   wc.lpfnWndProc = _ecore_wince_window_procedure;
+   wc.cbClsExtra = 0;
+   wc.cbWndExtra = 0;
+   wc.hInstance = _ecore_wince_instance;
+   wc.hIcon = NULL;
+   wc.hCursor = LoadCursor (NULL, IDC_ARROW);
+   wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
+   wc.lpszMenuName =  NULL;
+   wc.lpszClassName = ECORE_WINCE_WINDOW_CLASS;
+
+   if(!RegisterClass(&wc))
+     {
+        ERR("RegisterClass() failed");
+        goto free_library;
+     }
+
+   if (!ECORE_WINCE_EVENT_MOUSE_IN)
+     {
+        ECORE_WINCE_EVENT_MOUSE_IN              = ecore_event_type_new();
+        ECORE_WINCE_EVENT_MOUSE_OUT             = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_FOCUS_IN       = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT      = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_DAMAGE         = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_CREATE         = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_DESTROY        = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_SHOW           = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_HIDE           = ecore_event_type_new();
+        ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
+     }
+
+   return _ecore_wince_init_count;
+
+ free_library:
+   FreeLibrary(_ecore_wince_instance);
+ shutdown_ecore_event:
+   ecore_event_shutdown();
+ unregister_log_domain:
+   eina_log_domain_unregister(_ecore_wince_log_dom_global);
+ shutdown_eina:
+   eina_shutdown();
+
+   return --_ecore_wince_init_count;
+}
+
+/**
+ * @brief Shut down the Ecore_WinCE library.
+ *
+ * @return 0 when the library is completely shut down, 1 or
+ * greater otherwise.
+ *
+ * This function shuts down the Ecore_WinCE library. It returns 0 when it has
+ * been called the same number of times than ecore_wince_init(). In that case
+ * it shuts down all the Windows CE graphic system.
+ */
+EAPI int
+ecore_wince_shutdown()
+{
+   HWND task_bar;
+
+   if (--_ecore_wince_init_count != 0)
+     return _ecore_wince_init_count;
+
+   /* force task bar to be shown (in case the application exits */
+   /* while being fullscreen) */
+   task_bar = FindWindow(L"HHTaskBar", NULL);
+   if (task_bar)
+     {
+        ShowWindow(task_bar, SW_SHOW);
+        EnableWindow(task_bar, TRUE);
+     }
+
+   if (!UnregisterClass(ECORE_WINCE_WINDOW_CLASS, _ecore_wince_instance))
+     ERR("UnregisterClass() failed");
+
+   if (!FreeLibrary(_ecore_wince_instance))
+     ERR("FreeLibrary() failed");
+
+   _ecore_wince_instance = NULL;
+
+   ecore_event_shutdown();
+   eina_log_domain_unregister(_ecore_wince_log_dom_global);
+   _ecore_wince_log_dom_global = -1;
+   eina_shutdown();
+
+   return _ecore_wince_init_count;
 }
+
+/**
+ * @brief Set the timeout for a double and triple clicks to be flagged.
+ *
+ * @param t The time in seconds.
+ *
+ * This function sets the time @p t between clicks before the
+ * double_click flag is set in a button down event. If 3 clicks occur
+ * within double this time, the triple_click flag is also set.
+ */
+EAPI void
+ecore_wince_double_click_time_set(double t)
+{
+   if (t < 0.0) t = 0.0;
+   _ecore_wince_double_click_time = t;
+}
+
+/**
+ * @brief Retrieve the double and triple click flag timeout.
+ *
+ * @return The timeout for double clicks in seconds.
+ *
+ * This function returns the double clicks in seconds. If
+ * ecore_wince_double_click_time_set() has not been called, the
+ * default value is returned. See ecore_wince_double_click_time_set()
+ * for more informations.
+ */
+EAPI double
+ecore_wince_double_click_time_get(void)
+{
+   return _ecore_wince_double_click_time;
+}
+
+/**
+ * @brief Return the last event time.
+ *
+ * @return The last envent time.
+ *
+ * This function returns the last event time.
+ */
+EAPI long
+ecore_wince_current_time_get(void)
+{
+   return _ecore_wince_event_last_time;
+}
+
+/**
+ * @}
+ */
index 73fcd56..9afc062 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
 #include <stdlib.h>
-#include <stdio.h>   /* for printf */
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
 
-#include "Ecore.h"
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+
 #include "Ecore_WinCE.h"
 #include "ecore_wince_private.h"
 
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
 
-/***** Private declarations *****/
-
-static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_window = NULL;
-static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_last_window = NULL;
-static double              _ecore_wince_mouse_down_last_time = 0;
-static double              _ecore_wince_mouse_down_last_last_time = 0;
-static int                 _ecore_wince_mouse_down_did_triple = 0;
-static int                 _ecore_wince_mouse_up_count = 0;
-
-
-static void _ecore_wince_event_free_key_down(void *data,
-                                             void *ev);
+/**
+ * @cond LOCAL
+ */
 
-static void _ecore_wince_event_free_key_up(void *data,
-                                           void *ev);
+typedef enum
+{
+   ECORE_WINCE_KEY_MASK_LSHIFT = 1 << 0,
+   ECORE_WINCE_KEY_MASK_RSHIFT = 1 << 1,
+   ECORE_WINCE_KEY_MASK_LCONTROL = 1 << 2,
+   ECORE_WINCE_KEY_MASK_RCONTROL = 1 << 3,
+   ECORE_WINCE_KEY_MASK_LMENU = 1 << 4,
+   ECORE_WINCE_KEY_MASK_RMENU = 1 << 5
+} Ecore_Wince_Key_Mask;
+
+static Ecore_WinCE_Window  *_ecore_wince_mouse_down_last_window = NULL;
+static Ecore_WinCE_Window  *_ecore_wince_mouse_down_last_last_window = NULL;
+static long                 _ecore_wince_mouse_down_last_time = 0;
+static long                 _ecore_wince_mouse_down_last_last_time = 0;
+static int                  _ecore_wince_mouse_down_did_triple = 0;
+static int                  _ecore_wince_mouse_up_count = 0;
+static Ecore_Wince_Key_Mask _ecore_wince_key_mask = 0;
 
-static int  _ecore_wince_event_keystroke_get(int    key,
-                                             char **keyname,
-                                             char **keysymbol,
-                                             char **keycompose);
+static void
+_ecore_wince_event_free_key_down(void *data __UNUSED__,
+                                 void *ev)
+{
+   Ecore_Event_Key *e;
 
-static int  _ecore_wince_event_char_get(int    key,
-                                        char **keyname,
-                                        char **keysymbol,
-                                        char **keycompose);
+   e = ev;
+   if (e->keyname) free((char *)e->keyname);
+   if (e->key) free((char *)e->key);
+   if (e->string) free((char *)e->string);
+   free(e);
+}
 
+static void
+_ecore_wince_event_free_key_up(void *data __UNUSED__,
+                               void *ev)
+{
+   Ecore_Event_Key *e;
 
-/***** Global functions *****/
+   e = ev;
+   if (e->keyname) free((char *)e->keyname);
+   if (e->key) free((char *)e->key);
+   if (e->string) free((char *)e->string);
+   free(e);
+}
 
-void
-_ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg)
+static int
+_ecore_wince_event_keystroke_get(int       key,
+                                 Eina_Bool is_down,
+                                 char    **keyname,
+                                 char    **keysymbol,
+                                 char    **keycompose)
 {
-   Ecore_WinCE_Event_Key_Down *e;
+  char *kn;
+  char *ks;
+  char *kc;
+  int previous_key_state;
 
-   e = (Ecore_WinCE_Event_Key_Down *)malloc(sizeof(Ecore_WinCE_Event_Key_Down));
-   if (!e) return;
+  previous_key_state = msg->data_param & 0x40000000;
 
-   if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
-                                         &e->keyname,
-                                         &e->keysymbol,
-                                         &e->keycompose))
-     {
-        free(e);
-        return;
-     }
+  *keyname = NULL;
+  *keysymbol = NULL;
+  *keycompose = NULL;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
-   if (!e->window)
+   switch (key)
      {
-        free(e);
-        return;
+       /* Keystroke */
+     case VK_PRIOR:
+       kn = "Prior";
+       ks = "Prior";
+       kc = "Prior";
+       break;
+     case VK_NEXT:
+       kn = "Next";
+       ks = "Next";
+       kc = "Next";
+       break;
+     case VK_END:
+       kn = "End";
+       ks = "End";
+       kc = "End";
+       break;
+     case VK_HOME:
+       kn = "Home";
+       ks = "Home";
+       kc = "Home";
+       break;
+     case VK_LEFT:
+       kn = "Left";
+       ks = "Left";
+       kc = "Left";
+       break;
+     case VK_UP:
+       kn = "Up";
+       ks = "Up";
+       kc = "Up";
+       break;
+     case VK_RIGHT:
+       kn = "Right";
+       ks = "Right";
+       kc = "Right";
+       break;
+     case VK_DOWN:
+       kn = "Down";
+       ks = "Down";
+       kc = "Down";
+       break;
+     case VK_INSERT:
+       kn = "Insert";
+       ks = "Insert";
+       kc = "Insert";
+       break;
+     case VK_DELETE:
+       kn = "Delete";
+       ks = "Delete";
+       kc = "Delete";
+       break;
+     case VK_F1:
+       kn = "F1";
+       ks = "F1";
+       kc = "";
+       break;
+     case VK_F2:
+       kn = "F2";
+       ks = "F2";
+       kc = "";
+       break;
+     case VK_F3:
+       kn = "F3";
+       ks = "F3";
+       kc = "";
+       break;
+     case VK_F4:
+       kn = "F4";
+       ks = "F4";
+       kc = "";
+       break;
+     case VK_F5:
+       kn = "F5";
+       ks = "F5";
+       kc = "";
+       break;
+     case VK_F6:
+       kn = "F6";
+       ks = "F6";
+       kc = "";
+       break;
+     case VK_F7:
+       kn = "F7";
+       ks = "F7";
+       kc = "";
+       break;
+     case VK_F8:
+       kn = "F8";
+       ks = "F8";
+       kc = "";
+       break;
+     case VK_F9:
+       kn = "F9";
+       ks = "F9";
+       kc = "";
+       break;
+     case VK_F10:
+       kn = "F10";
+       ks = "F10";
+       kc = "";
+       break;
+     case VK_F11:
+       kn = "F11";
+       ks = "F11";
+       kc = "";
+       break;
+     case VK_F12:
+       kn = "F12";
+       ks = "F12";
+       kc = "";
+       break;
+     case VK_F13:
+       kn = "F13";
+       ks = "F13";
+       kc = "";
+       break;
+     case VK_F14:
+       kn = "F14";
+       ks = "F14";
+       kc = "";
+       break;
+     case VK_F15:
+       kn = "F15";
+       ks = "F15";
+       kc = "";
+       break;
+     case VK_F16:
+       kn = "F16";
+       ks = "F16";
+       kc = "";
+       break;
+     case VK_F17:
+       kn = "F17";
+       ks = "F17";
+       kc = "";
+       break;
+     case VK_F18:
+       kn = "F18";
+       ks = "F18";
+       kc = "";
+       break;
+     case VK_F19:
+       kn = "F19";
+       ks = "F19";
+       kc = "";
+       break;
+     case VK_F20:
+       /*
+       * VK_F20 indicates that an arrow key came from a rocker.
+       * This can safely be ignored.
+       */
+       return 0;
+     case VK_F21:
+       /*
+       * VK_F21 indicates that an arrow key came from a directional
+       * pad. This can safely be ignored.
+       */
+       return 0;
+     case VK_F22:
+       kn = "F22";
+       ks = "F22";
+       kc = "";
+       break;
+     case VK_F23:
+       /*
+       * Sent with VK_RETURN when doing an action (usually the middle
+       * button on a directional pad. This can safely be ignored.
+       */
+       return 0;
+     case VK_F24:
+       kn = "F24";
+       ks = "F24";
+       kc = "";
+       break;
+     case VK_APPS:
+       kn = "Application";
+       ks = "Application";
+       kc = "";
+       break;
+     case VK_SHIFT:
+       {
+          SHORT res;
+
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               res = GetKeyState(VK_LSHIFT);
+               if (res & 0x8000)
+                 {
+                    _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LSHIFT;
+                    kn = "Shift_L";
+                    ks = "Shift_L";
+                    kc = "";
+                 }
+               res = GetKeyState(VK_RSHIFT);
+               if (res & 0x8000)
+                 {
+                    _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RSHIFT;
+                    kn = "Shift_R";
+                    ks = "Shift_R";
+                    kc = "";
+                 }
+            }
+          else /* is_up */
+            {
+               res = GetKeyState(VK_LSHIFT);
+               if (!(res & 0x8000) &&
+                   (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LSHIFT))
+                 {
+                    kn = "Shift_L";
+                    ks = "Shift_L";
+                    kc = "";
+                    _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LSHIFT;
+                 }
+               res = GetKeyState(VK_RSHIFT);
+               if (!(res & 0x8000) &&
+                   (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RSHIFT))
+                 {
+                    kn = "Shift_R";
+                    ks = "Shift_R";
+                    kc = "";
+                    _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RSHIFT;
+                 }
+            }
+          break;
+       }
+     case VK_CONTROL:
+       {
+          SHORT res;
+
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               res = GetKeyState(VK_LCONTROL);
+               if (res & 0x8000)
+                 {
+                    _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LCONTROL;
+                    kn = "Control_L";
+                    ks = "Control_L";
+                    kc = "";
+                    break;
+                 }
+               res = GetKeyState(VK_RCONTROL);
+               if (res & 0x8000)
+                 {
+                    _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RCONTROL;
+                    kn = "Control_R";
+                    ks = "Control_R";
+                    kc = "";
+                    break;
+                 }
+            }
+          else /* is_up */
+            {
+               res = GetKeyState(VK_LCONTROL);
+               if (!(res & 0x8000) &&
+                   (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LCONTROL))
+                 {
+                    kn = "Control_L";
+                    ks = "Control_L";
+                    kc = "";
+                    _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LCONTROL;
+                    break;
+                 }
+               res = GetKeyState(VK_RCONTROL);
+               if (!(res & 0x8000) &&
+                   (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RCONTROL))
+                 {
+                    kn = "Control_R";
+                    ks = "Control_R";
+                    kc = "";
+                    _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RCONTROL;
+                    break;
+                 }
+            }
+          break;
+       }
+     case VK_MENU:
+       {
+          SHORT res;
+
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               res = GetKeyState(VK_LMENU);
+               if (res & 0x8000)
+                 {
+                    _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LMENU;
+                    kn = "Alt_L";
+                    ks = "Alt_L";
+                    kc = "";
+                 }
+               res = GetKeyState(VK_RMENU);
+               if (res & 0x8000)
+                 {
+                    _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RMENU;
+                    kn = "Alt_R";
+                    ks = "Alt_R";
+                    kc = "";
+                 }
+            }
+          else /* is_up */
+            {
+               res = GetKeyState(VK_LMENU);
+               if (!(res & 0x8000) &&
+                   (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LMENU))
+                 {
+                    kn = "Alt_L";
+                    ks = "Alt_L";
+                    kc = "";
+                    _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LMENU;
+                 }
+               res = GetKeyState(VK_RMENU);
+               if (!(res & 0x8000) &&
+                   (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RMENU))
+                 {
+                    kn = "Alt_R";
+                    ks = "Alt_R";
+                    kc = "";
+                    _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RMENU;
+                 }
+            }
+          break;
+       }
+     case VK_LWIN:
+       {
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               kn = "Super_L";
+               ks = "Super_L";
+               kc = "";
+               *modifiers |= ECORE_EVENT_MODIFIER_WIN;
+            }
+          else /* is_up */
+            {
+               kn = "Super_L";
+               ks = "Super_L";
+               kc = "";
+               *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
+            }
+          break;
+       }
+     case VK_RWIN:
+       {
+          if (is_down)
+            {
+               if (previous_key_state) return 0;
+               kn = "Super_R";
+               ks = "Super_R";
+               kc = "";
+               *modifiers |= ECORE_EVENT_MODIFIER_WIN;
+            }
+          else /* is_up */
+            {
+               kn = "Super_R";
+               ks = "Super_R";
+               kc = "";
+               *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
+            }
+          break;
+       }
+     default:
+       /* other non keystroke characters */
+       return 0;
      }
-   e->time = (double)msg->time / 1000.0;
-
-   _ecore_wince_event_last_time = e->time;
-
-   ecore_event_add(ECORE_WINCE_EVENT_KEY_DOWN, e, _ecore_wince_event_free_key_down, NULL);
-}
-
-void
-_ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg)
-{
-   Ecore_WinCE_Event_Key_Up *e;
-
-   e = (Ecore_WinCE_Event_Key_Up *)calloc(1, sizeof(Ecore_WinCE_Event_Key_Up));
-   if (!e) return;
-
-   if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
-                                         &e->keyname,
-                                         &e->keysymbol,
-                                         &e->keycompose))
+   *keyname = strdup(kn);
+   if (!*keyname) return 0;
+   *keysymbol = strdup(ks);
+   if (!*keysymbol)
      {
-        free(e);
-        return;
+        free(*keyname);
+        *keyname = NULL;
+        return 0;
      }
-
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
-   if (!e->window)
+   *keycompose = strdup(kc);
+   if (!*keycompose)
      {
-        free(e);
-        return;
+        free(*keyname);
+        free(*keysymbol);
+        *keyname = NULL;
+        *keysymbol = NULL;
+        return 0;
      }
-   e->time = (double)msg->time / 1000.0;
-
-   _ecore_wince_event_last_time = e->time;
 
-   ecore_event_add(ECORE_WINCE_EVENT_KEY_UP, e, _ecore_wince_event_free_key_up, NULL);
+   return 1;
 }
 
-void
-_ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg,
-                                       int                        button)
+static int
+_ecore_wince_event_char_get(int    key,
+                            char **keyname,
+                            char **keysymbol,
+                            char **keycompose)
 {
-   Ecore_WinCE_Window *window;
-
-   window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
-
-   {
-      Ecore_WinCE_Event_Mouse_Move *e;
-
-      e = (Ecore_WinCE_Event_Mouse_Move *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Move));
-      if (!e) return;
-
-      e->window = window;
-      e->x = LOWORD(msg->data_param);
-      e->y = HIWORD(msg->data_param);
-      e->time = (double)msg->time / 1000.0;
-
-      _ecore_wince_event_last_time = e->time;
-      _ecore_wince_event_last_window = e->window;
-
-      ecore_event_add(ECORE_WINCE_EVENT_MOUSE_MOVE, e, NULL, NULL);
-   }
-
-   {
-      Ecore_WinCE_Event_Mouse_Button_Down *e;
-
-      if (_ecore_wince_mouse_down_did_triple)
-        {
-           _ecore_wince_mouse_down_last_window = NULL;
-           _ecore_wince_mouse_down_last_last_window = NULL;
-           _ecore_wince_mouse_down_last_time = 0.0;
-           _ecore_wince_mouse_down_last_last_time = 0.0;
-        }
-
-      e = (Ecore_WinCE_Event_Mouse_Button_Down *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Button_Down));
-      if (!e) return;
+  char kn[32];
+  char ks[32];
+  char kc[32];
 
-      e->window = window;
-      e->button = button;
-      e->x = LOWORD(msg->data_param);
-      e->y = HIWORD(msg->data_param);
-      e->time = (double)msg->time / 1000.0;
+  *keyname = NULL;
+  *keysymbol = NULL;
+  *keycompose = NULL;
 
-      if (((e->time - _ecore_wince_mouse_down_last_time) <= _ecore_wince_double_click_time) &&
-          (e->window == _ecore_wince_mouse_down_last_window))
-        e->double_click = 1;
+   /* check control charaters such as ^a(key:1), ^z(key:26) */
+   if ((key > 0) && (key < 27) &&
+       ((GetKeyState(VK_CONTROL) & 0x8000) ||
+        (GetKeyState(VK_CONTROL) & 0x8000))) key += 96;
 
-      if (((e->time - _ecore_wince_mouse_down_last_last_time) <= (2.0 * _ecore_wince_double_click_time)) &&
-          (e->window == _ecore_wince_mouse_down_last_window) &&
-          (e->window == _ecore_wince_mouse_down_last_last_window))
-        {
-           e->triple_click = 1;
-           _ecore_wince_mouse_down_did_triple = 1;
-        }
-      else
-        _ecore_wince_mouse_down_did_triple = 0;
+   switch (key)
+     {
+     case VK_APP3:
+     case VK_BACK:
+       strncpy(kn, "BackSpace", 32);
+       strncpy(ks, "BackSpace", 32);
+       strncpy(kc, "BackSpace", 32);
+       break;
+     case VK_APP4:
+     case VK_TAB:
+       strncpy(kn, "Tab", 32);
+       strncpy(ks, "Tab", 32);
+       strncpy(kc, "Tab", 32);
+       break;
+     case VK_APP5:
+     case 0x0a:
+       /* Line feed (Shift + Enter) */
+       strncpy(kn, "LineFeed", 32);
+       strncpy(ks, "LineFeed", 32);
+       strncpy(kc, "LineFeed", 32);
+       break;
+     case VK_APP2:
+     case VK_RETURN:
+       strncpy(kn, "Return", 32);
+       strncpy(ks, "Return", 32);
+       strncpy(kc, "Return", 32);
+       break;
+     case VK_APP1:
+     case VK_ESCAPE:
+       strncpy(kn, "Escape", 32);
+       strncpy(ks, "Escape", 32);
+       strncpy(kc, "Escape", 32);
+       break;
+     case VK_SPACE:
+       strncpy(kn, "space", 32);
+       strncpy(ks, "space", 32);
+       strncpy(kc, " ", 32);
+       break;
+     default:
+       /* displayable characters */
+       printf (" * key : %d\n", key);
+       kn[0] = (TCHAR)key;
+       kn[1] = '\0';
+       ks[0] = (TCHAR)key;
+       ks[1] = '\0';
+       kc[0] = (TCHAR)key;
+       kc[1] = '\0';
+       break;
+     }
+   *keyname = strdup(kn);
+   if (!*keyname) return 0;
+   *keysymbol = strdup(ks);
+   if (!*keysymbol)
+     {
+        free(*keyname);
+        *keyname = NULL;
+        return 0;
+     }
+   *keycompose = strdup(kc);
+   if (!*keycompose)
+     {
+        free(*keyname);
+        free(*keysymbol);
+        *keyname = NULL;
+        *keysymbol = NULL;
+        return 0;
+     }
+
+   return 1;
+}
+
+/**
+ * @endcond
+ */
+
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+void
+_ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg,
+                                    int                        is_keystroke)
+{
+   Ecore_Event_Key *e;
+
+   INF("key pressed");
+
+   e = (Ecore_Event_Key *)malloc(sizeof(Ecore_Event_Key));
+   if (!e) return;
+
+   if (is_keystroke)
+     {
+        if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
+                                              EINA_TRUE,
+                                              (char **)&e->keyname,
+                                              (char **)&e->key,
+                                              (char **)&e->string))
+          {
+             free(e);
+             return;
+          }
+     }
+   else
+     {
+        if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
+                                         (char **)&e->keyname,
+                                         (char **)&e->key,
+                                         (char **)&e->string))
+          {
+             free(e);
+             return;
+          }
+     }
+
+   e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
+   e->event_window = e->window;
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+   e->timestamp = msg->time;
+
+   _ecore_wince_event_last_time = e->timestamp;
+
+   ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_wince_event_free_key_down, NULL);
+}
+
+void
+_ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg,
+                                      int                        is_keystroke)
+{
+   Ecore_Event_Key *e;
+
+   INF("key released");
+
+   e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
+   if (!e) return;
+
+   if (is_keystroke)
+     {
+        if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
+                                              EINA_FALSE,
+                                              (char **)&e->keyname,
+                                              (char **)&e->key,
+                                              (char **)&e->string))
+          {
+             free(e);
+             return;
+          }
+     }
+   else
+     {
+        if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
+                                         (char **)&e->keyname,
+                                         (char **)&e->key,
+                                         (char **)&e->string))
+          {
+             free(e);
+             return;
+          }
+     }
+
+   e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
+   e->event_window = e->window;
+   if (!e->window)
+     {
+        free(e);
+        return;
+     }
+   e->timestamp = msg->time;
+
+   _ecore_wince_event_last_time = e->timestamp;
+
+   ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_wince_event_free_key_up, NULL);
+}
+
+void
+_ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg,
+                                       int                        button)
+{
+   Ecore_WinCE_Window *window;
+
+   INF("mouse button pressed");
+
+   window = (Ecore_WinCE_Window *)GetWindowLong(msg->window, GWL_USERDATA);
+
+   {
+      Ecore_Event_Mouse_Move *e;
+
+      e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
+      if (!e) return;
+
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
+      e->x = LOWORD(msg->data_param);
+      e->y = HIWORD(msg->data_param);
+      e->timestamp = msg->time;
+
+      _ecore_wince_event_last_time = e->timestamp;
+      _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
+
+      ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
+   }
+
+   {
+      Ecore_Event_Mouse_Button *e;
+
+      if (_ecore_wince_mouse_down_did_triple)
+        {
+           _ecore_wince_mouse_down_last_window = NULL;
+           _ecore_wince_mouse_down_last_last_window = NULL;
+           _ecore_wince_mouse_down_last_time = 0;
+           _ecore_wince_mouse_down_last_last_time = 0;
+        }
+
+      e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
+      if (!e) return;
+
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
+      e->buttons = button;
+      e->x = LOWORD(msg->data_param);
+      e->y = HIWORD(msg->data_param);
+      e->timestamp = msg->time;
+
+      if (((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
+          (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
+        e->double_click = 1;
+
+      if (((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
+          (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
+          (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
+        {
+           e->triple_click = 1;
+           _ecore_wince_mouse_down_did_triple = 1;
+        }
+      else
+        _ecore_wince_mouse_down_did_triple = 0;
 
       if (!e->double_click && !e->triple_click)
         _ecore_wince_mouse_up_count = 0;
 
-      _ecore_wince_event_last_time = e->time;
-      _ecore_wince_event_last_window = e->window;
+      _ecore_wince_event_last_time = e->timestamp;
+      _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
 
       if (!_ecore_wince_mouse_down_did_triple)
         {
            _ecore_wince_mouse_down_last_last_window = _ecore_wince_mouse_down_last_window;
-           _ecore_wince_mouse_down_last_window = e->window;
+           _ecore_wince_mouse_down_last_window = (Ecore_WinCE_Window *)e->window;
            _ecore_wince_mouse_down_last_last_time = _ecore_wince_mouse_down_last_time;
-           _ecore_wince_mouse_down_last_time = e->time;
+           _ecore_wince_mouse_down_last_time = e->timestamp;
         }
 
-      ecore_event_add(ECORE_WINCE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
+      ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
    }
-   printf (" * ecore event button press\n");
 }
 
 void
 _ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg,
-                                         int                          button)
+                                         int                        button)
 {
    Ecore_WinCE_Window *window;
 
+   INF("mouse button released");
+
    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
 
    {
-      Ecore_WinCE_Event_Mouse_Move *e;
+      Ecore_Event_Mouse_Move *e;
 
-      e = (Ecore_WinCE_Event_Mouse_Move *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Move));
+      e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
       if (!e) return;
 
-      e->window = window;
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
       e->x = LOWORD(msg->data_param);
       e->y = HIWORD(msg->data_param);
-      e->time = (double)msg->time / 1000.0;
+      e->timestamp = msg->time;
 
-      _ecore_wince_event_last_time = e->time;
-      _ecore_wince_event_last_window = e->window;
+      _ecore_wince_event_last_time = e->timestamp;
+      _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
 
-      ecore_event_add(ECORE_WINCE_EVENT_MOUSE_MOVE, e, NULL, NULL);
+      ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
    }
 
    {
-      Ecore_WinCE_Event_Mouse_Button_Up *e;
+      Ecore_Event_Mouse_Button *e;
 
-      e = (Ecore_WinCE_Event_Mouse_Button_Up *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Button_Up));
+      e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
       if (!e) return;
 
-      e->window = window;
-      e->button = button;
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
+      e->buttons = button;
       e->x = LOWORD(msg->data_param);
       e->y = HIWORD(msg->data_param);
-      e->time = (double)msg->time / 1000.0;
+      e->timestamp = msg->time;
 
       _ecore_wince_mouse_up_count++;
 
       if ((_ecore_wince_mouse_up_count >= 2) &&
-          ((e->time - _ecore_wince_mouse_down_last_time) <= _ecore_wince_double_click_time) &&
-          (e->window == _ecore_wince_mouse_down_last_window))
+          ((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
+          (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
         e->double_click = 1;
 
       if ((_ecore_wince_mouse_up_count >= 3) &&
-          ((e->time - _ecore_wince_mouse_down_last_last_time) <= (2.0 * _ecore_wince_double_click_time)) &&
-          (e->window == _ecore_wince_mouse_down_last_window) &&
-          (e->window == _ecore_wince_mouse_down_last_last_window))
+          ((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
+          (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
+          (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
         e->triple_click = 1;
 
-      _ecore_wince_event_last_time = e->time;
-      _ecore_wince_event_last_window = e->window;
+      _ecore_wince_event_last_time = e->timestamp;
+      _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
 
-      ecore_event_add(ECORE_WINCE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
+      ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
    }
-
-   printf (" * ecore event button release\n");
 }
 
 void
 _ecore_wince_event_handle_motion_notify(Ecore_WinCE_Callback_Data *msg)
 {
-   Ecore_WinCE_Event_Mouse_Move *e;
+   Ecore_Event_Mouse_Move *e;
+
+   INF("mouse moved");
 
-   e = (Ecore_WinCE_Event_Mouse_Move *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Move));
+   e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
    if (!e) return;
 
-   e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
+   e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
+   e->event_window = e->window;
    e->x = LOWORD(msg->data_param);
    e->y = HIWORD(msg->data_param);
-   e->time = (double)msg->time / 1000.0;
+   e->timestamp = msg->time;
 
-   ecore_event_add(ECORE_WINCE_EVENT_MOUSE_MOVE, e, NULL, NULL);
-   printf (" * ecore event motion notify\n");
+   ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
 }
 
 void
@@ -262,24 +838,26 @@ _ecore_wince_event_handle_enter_notify(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Window *window;
 
+   INF("mouse in");
+
    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
-   printf (" * ecore event enter notify 0\n");
 
    {
-      Ecore_WinCE_Event_Mouse_Move *e;
+      Ecore_Event_Mouse_Move *e;
 
-      e = (Ecore_WinCE_Event_Mouse_Move *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Move));
+      e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
       if (!e) return;
 
-      e->window = window;
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
       e->x = msg->x;
       e->y = msg->y;
-      e->time = (double)msg->time / 1000.0;
+      e->timestamp = msg->time;
 
-      _ecore_wince_event_last_time = e->time;
-      _ecore_wince_event_last_window = e->window;
+      _ecore_wince_event_last_time = e->timestamp;
+      _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
 
-      ecore_event_add(ECORE_WINCE_EVENT_MOUSE_MOVE, e, NULL, NULL);
+      ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
    }
 
    {
@@ -291,13 +869,12 @@ _ecore_wince_event_handle_enter_notify(Ecore_WinCE_Callback_Data *msg)
       e->window = window;
       e->x = msg->x;
       e->y = msg->y;
-      e->time = (double)msg->time / 1000.0;
+      e->time = msg->time;
 
       _ecore_wince_event_last_time = e->time;
 
       ecore_event_add(ECORE_WINCE_EVENT_MOUSE_IN, e, NULL, NULL);
    }
-   printf (" * ecore event enter notify 1\n");
 }
 
 void
@@ -305,23 +882,26 @@ _ecore_wince_event_handle_leave_notify(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Window *window;
 
+   INF("mouse out");
+
    window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
 
    {
-      Ecore_WinCE_Event_Mouse_Move *e;
+      Ecore_Event_Mouse_Move *e;
 
-      e = (Ecore_WinCE_Event_Mouse_Move *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Move));
+      e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
       if (!e) return;
 
-      e->window = window;
+      e->window = (Ecore_Window)window;
+      e->event_window = e->window;
       e->x = msg->x;
       e->y = msg->y;
-      e->time = (double)msg->time / 1000.0;
+      e->timestamp = msg->time;
 
-      _ecore_wince_event_last_time = e->time;
-      _ecore_wince_event_last_window = e->window;
+      _ecore_wince_event_last_time = e->timestamp;
+      _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
 
-      ecore_event_add(ECORE_WINCE_EVENT_MOUSE_MOVE, e, NULL, NULL);
+      ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
    }
 
    {
@@ -333,20 +913,21 @@ _ecore_wince_event_handle_leave_notify(Ecore_WinCE_Callback_Data *msg)
       e->window = window;
       e->x = msg->x;
       e->y = msg->y;
-      e->time = (double)msg->time / 1000.0;
+      e->time = msg->time;
 
       _ecore_wince_event_last_time = e->time;
 
       ecore_event_add(ECORE_WINCE_EVENT_MOUSE_OUT, e, NULL, NULL);
    }
-   printf (" * ecore event leave notify\n");
 }
 
 void
 _ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Focus_In *e;
-   struct _Ecore_WinCE_Window        *window;
+   Ecore_WinCE_Window                *window;
+
+   INF("focus in");
 
    e = (Ecore_WinCE_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_In));
    if (!e) return;
@@ -358,8 +939,8 @@ _ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg)
         return;
      }
 
-   if (window->resume)
-     window->resume(window->backend);
+   if (window->resume_cb)
+     window->resume_cb(window->backend);
 
    e->window = window;
 
@@ -373,7 +954,9 @@ void
 _ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Focus_Out *e;
-   struct _Ecore_WinCE_Window         *window;
+   Ecore_WinCE_Window                 *window;
+
+   INF("focus out");
 
    e = (Ecore_WinCE_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_Out));
    if (!e) return;
@@ -384,8 +967,8 @@ _ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg)
         free(e);
         return;
      }
-   if (window->suspend)
-     window->suspend(window->backend);
+   if (window->suspend_cb)
+     window->suspend_cb(window->backend);
 
    e->window = window;
 
@@ -400,6 +983,8 @@ _ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Damage *e;
 
+   INF("window expose");
+
    e = (Ecore_WinCE_Event_Window_Damage *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Damage));
    if (!e) return;
 
@@ -414,7 +999,7 @@ _ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg)
    e->y = msg->update.top;
    e->width = msg->update.right - msg->update.left;
    e->height = msg->update.bottom - msg->update.top;
-   printf (" * ecore : event expose %d %d\n", e->width, e->height);
+   INF("window expose size: %dx%d", e->width, e->height);
 
    e->time = _ecore_wince_event_last_time;
 
@@ -426,6 +1011,8 @@ _ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Create *e;
 
+   INF("window create notify");
+
    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Create));
    if (!e) return;
 
@@ -446,6 +1033,8 @@ _ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Destroy *e;
 
+   INF("window destroy notify");
+
    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Destroy));
    if (!e) return;
 
@@ -467,6 +1056,8 @@ _ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Show *e;
 
+   INF("window map notify");
+
    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Show));
    if (!e) return;
 
@@ -487,6 +1078,8 @@ _ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Hide *e;
 
+   INF("window unmap notify");
+
    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Hide));
    if (!e) return;
 
@@ -507,6 +1100,8 @@ _ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg)
 {
    Ecore_WinCE_Event_Window_Delete_Request *e;
 
+   INF("window delete request");
+
    e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Delete_Request));
    if (!e) return;
 
@@ -522,323 +1117,7 @@ _ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg)
    ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
 }
 
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
 
-/***** Private functions definitions *****/
-
-static void
-_ecore_wince_event_free_key_down(void *data,
-                                 void *ev)
-{
-   Ecore_WinCE_Event_Key_Down *e;
-
-   e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->keycompose) free(e->keycompose);
-   free(e);
-}
-
-static void
-_ecore_wince_event_free_key_up(void *data,
-                               void *ev)
-{
-   Ecore_WinCE_Event_Key_Up *e;
-
-   e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->keycompose) free(e->keycompose);
-   free(e);
-}
-
-static int
-_ecore_wince_event_keystroke_get(int    key,
-                                 char **keyname,
-                                 char **keysymbol,
-                                 char **keycompose)
-{
-  char *kn;
-  char *ks;
-  char *kc;
-
-  *keyname = NULL;
-  *keysymbol = NULL;
-  *keycompose = NULL;
-
-   switch (key)
-     {
-       /* Keystroke */
-     case VK_PRIOR:
-       kn = "KP_Prior";
-       ks = "KP_Prior";
-       kc = "";
-       break;
-     case VK_NEXT:
-       kn = "KP_Next";
-       ks = "KP_Next";
-       kc = "";
-       break;
-     case VK_END:
-       kn = "KP_End";
-       ks = "KP_End";
-       kc = "";
-       break;
-     case VK_HOME:
-       kn = "KP_Home";
-       ks = "KP_Home";
-       kc = "";
-       break;
-     case VK_LEFT:
-       kn = "KP_Left";
-       ks = "KP_Left";
-       kc = "";
-       break;
-     case VK_UP:
-       kn = "KP_Up";
-       ks = "KP_Up";
-       kc = "";
-       break;
-     case VK_RIGHT:
-       kn = "KP_Right";
-       ks = "KP_Right";
-       kc = "";
-       break;
-     case VK_DOWN:
-       kn = "KP_Down";
-       ks = "KP_Down";
-       kc = "";
-       break;
-     case VK_INSERT:
-       kn = "KP_Insert";
-       ks = "KP_Insert";
-       kc = "";
-       break;
-     case VK_DELETE:
-       kn = "KP_Delete";
-       ks = "KP_Delete";
-       kc = "";
-       break;
-     case VK_F1:
-       kn = "F1";
-       ks = "F1";
-       kc = "";
-       break;
-     case VK_F2:
-       kn = "F2";
-       ks = "F2";
-       kc = "";
-       break;
-     case VK_F3:
-       kn = "F3";
-       ks = "F3";
-       kc = "";
-       break;
-     case VK_F4:
-       kn = "F4";
-       ks = "F4";
-       kc = "";
-       break;
-     case VK_F5:
-       kn = "F5";
-       ks = "F5";
-       kc = "";
-       break;
-     case VK_F6:
-       kn = "F6";
-       ks = "F6";
-       kc = "";
-       break;
-     case VK_F7:
-       kn = "F7";
-       ks = "F7";
-       kc = "";
-       break;
-     case VK_F8:
-       kn = "F8";
-       ks = "F8";
-       kc = "";
-       break;
-     case VK_F9:
-       kn = "F9";
-       ks = "F9";
-       kc = "";
-       break;
-     case VK_F10:
-       kn = "F10";
-       ks = "F10";
-       kc = "";
-       break;
-     case VK_F11:
-       kn = "F11";
-       ks = "F11";
-       kc = "";
-       break;
-     case VK_F12:
-       kn = "F12";
-       ks = "F12";
-       kc = "";
-       break;
-     case VK_F13:
-       kn = "F13";
-       ks = "F13";
-       kc = "";
-       break;
-     case VK_F14:
-       kn = "F14";
-       ks = "F14";
-       kc = "";
-       break;
-     case VK_F15:
-       kn = "F15";
-       ks = "F15";
-       kc = "";
-       break;
-     case VK_F16:
-       kn = "F16";
-       ks = "F16";
-       kc = "";
-       break;
-     case VK_F17:
-       kn = "F17";
-       ks = "F17";
-       kc = "";
-       break;
-     case VK_F18:
-       kn = "F18";
-       ks = "F18";
-       kc = "";
-       break;
-     case VK_F19:
-       kn = "F19";
-       ks = "F19";
-       kc = "";
-       break;
-     case VK_F20:
-       kn = "F20";
-       ks = "F20";
-       kc = "";
-       break;
-     case VK_F21:
-       kn = "F21";
-       ks = "F21";
-       kc = "";
-       break;
-     case VK_F22:
-       kn = "F22";
-       ks = "F22";
-       kc = "";
-       break;
-     case VK_F23:
-       kn = "F23";
-       ks = "F23";
-       kc = "";
-       break;
-     case VK_F24:
-       kn = "F24";
-       ks = "F24";
-       kc = "";
-       break;
-     default:
-       /* other non keystroke characters */
-       return 0;
-     }
-   *keyname = strdup(kn);
-   if (!*keyname) return 0;
-   *keysymbol = strdup(ks);
-   if (!*keysymbol)
-     {
-        free(*keyname);
-        *keyname = NULL;
-        return 0;
-     }
-   *keycompose = strdup(kc);
-   if (!*keycompose)
-     {
-        free(*keyname);
-        free(*keysymbol);
-        *keyname = NULL;
-        *keysymbol = NULL;
-        return 0;
-     }
-
-   return 1;
-}
-
-static int
-_ecore_wince_event_char_get(int    key,
-                            char **keyname,
-                            char **keysymbol,
-                            char **keycompose)
-{
-  char kn[32];
-  char ks[32];
-  char *kc;
-
-  *keyname = NULL;
-  *keysymbol = NULL;
-  *keycompose = NULL;
-
-   switch (key)
-     {
-     case VK_APP3:
-     case VK_BACK:
-       strncpy(kn, "Backspace", 32);
-       strncpy(ks, "Backspace", 32);
-       kc = "";
-       break;
-     case VK_APP4:
-     case VK_TAB:
-       strncpy(kn, "Tab", 32);
-       strncpy(ks, "Tab", 32);
-       kc = "";
-       break;
-     case VK_APP5:
-     case 0x0a:
-       /* Line feed (Shift + Enter) */
-       strncpy(kn, "LineFeed", 32);
-       strncpy(ks, "LineFeed", 32);
-       kc = "";
-       break;
-     case VK_APP2:
-     case VK_RETURN:
-       strncpy(kn, "Return", 32);
-       strncpy(ks, "Return", 32);
-       kc = "";
-       break;
-     case VK_APP1:
-     case VK_ESCAPE:
-       strncpy(kn, "Escape", 32);
-       strncpy(ks, "Escape", 32);
-       kc = "";
-       break;
-     default:
-       /* displayable characters */
-       printf (" * key : %d\n", key);
-       kn[0] = (TCHAR)key;
-       kn[1] = '\0';
-       ks[0] = (TCHAR)key;
-       ks[1] = '\0';
-       kc = "";
-       break;
-     }
-   *keyname = strdup(kn);
-   if (!*keyname) return 0;
-   *keysymbol = strdup(ks);
-   if (!*keysymbol)
-     {
-        free(*keyname);
-        *keyname = NULL;
-        return 0;
-     }
-   *keycompose = strdup(kc);
-   if (!*keycompose)
-     {
-        free(*keyname);
-        free(*keysymbol);
-        *keyname = NULL;
-        *keysymbol = NULL;
-        return 0;
-     }
-
-   return 1;
-}
index 68aeed2..b506312 100644 (file)
@@ -1,11 +1,28 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifndef __ECORE_WINCE_PRIVATE_H__
 #define __ECORE_WINCE_PRIVATE_H__
 
 
+/* logging messages macros */
+extern int _ecore_wince_log_dom_global;
+
+#ifdef ECORE_WINCE_DEFAULT_LOG_COLOR
+#undef ECORE_WINCE_DEFAULT_LOG_COLOR
+#endif
+#define ECORE_WINCE_DEFAULT_LOG_COLOR EINA_COLOR_LIGHTBLUE
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_wince_log_dom_global , __VA_ARGS__)
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_wince_log_dom_global , __VA_ARGS__)
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_wince_log_dom_global , __VA_ARGS__)
+
 #define ECORE_WINCE_WINDOW_CLASS L"Ecore_WinCE_Window_Class"
 
 
@@ -24,30 +41,32 @@ struct _Ecore_WinCE_Callback_Data
 };
 
 
-typedef int (*ecore_wince_suspend) (int);
-typedef int (*ecore_wince_resume)  (int);
+typedef int (*ecore_wince_suspend_cb) (int);
+typedef int (*ecore_wince_resume_cb)  (int);
 
 
 struct _Ecore_WinCE_Window
 {
-   HWND                window;
+   HWND                   window;
 
-   int                 backend;
-   ecore_wince_suspend suspend;
-   ecore_wince_resume  resume;
+   int                    backend;
+   ecore_wince_suspend_cb suspend_cb;
+   ecore_wince_resume_cb  resume_cb;
 
-   unsigned int        pointer_is_in : 1;
+   RECT                   rect;           /* used to go fullscreen to normal */
+
+   unsigned int           pointer_is_in : 1;
+   unsigned int           fullscreen    : 1;
 };
 
+extern HINSTANCE           _ecore_wince_instance;
 extern double              _ecore_wince_double_click_time;
-extern double              _ecore_wince_event_last_time;
+extern long                _ecore_wince_event_last_time;
 extern Ecore_WinCE_Window *_ecore_wince_event_last_window;
 
-extern HINSTANCE           _ecore_wince_instance;
-
 
-void  _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg);
-void  _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg);
+void  _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg, int is_keystroke);
+void  _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg, int is_keystroke);
 void  _ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg, int button);
 void  _ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg, int button);
 void  _ecore_wince_event_handle_motion_notify(Ecore_WinCE_Callback_Data *msg);
index de97069..49a6312 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-#include <stdlib.h>
-#include <stdio.h>   /* for printf */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
-#include <aygshell.h>
+
+#include <Evil.h>
+#include <Eina.h>
 
 #include "Ecore_WinCE.h"
 #include "ecore_wince_private.h"
 
+/*============================================================================*
+ *                                  Local                                     *
+ *============================================================================*/
+
+/**
+ * @cond LOCAL
+ */
 
-/***** Private declarations *****/
 
 typedef BOOL (__stdcall *UnregisterFunc1Proc)(UINT, UINT);
 
-static int _ecore_wince_hardware_keys_register(HWND window);
+static int
+_ecore_wince_hardware_keys_register(HWND window)
+{
+   HINSTANCE           core_dll;
+   UnregisterFunc1Proc unregister_fct;
+   int                 i;
+
+   core_dll = LoadLibrary(L"coredll.dll");
+   if (!core_dll)
+     {
+        ERR("LoadLibrary() failed");
+        return 0;
+     }
+
+   unregister_fct = (UnregisterFunc1Proc)GetProcAddress(core_dll, L"UnregisterFunc1");
+   if (!unregister_fct)
+     {
+        ERR("GetProcAddress() failed");
+        FreeLibrary(core_dll);
+        return 0;
+     }
+
+   for (i = 0xc1; i <= 0xcf; i++)
+     {
+        unregister_fct(MOD_WIN, i);
+        RegisterHotKey(window, i, MOD_WIN, i);
+     }
+
+   FreeLibrary(core_dll);
+
+   return 1;
+}
+
+/**
+ * @endcond
+ */
+
 
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
 
-/***** API *****/
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
 
-Ecore_WinCE_Window *
+/**
+ * @addtogroup Ecore_WinCE_Group Ecore_WinCE library
+ *
+ * @{
+ */
+
+/**
+ * @brief Creates a new window.
+ *
+ * @param parent The parent window.
+ * @param x The x coordinate of the top-left corner of the window.
+ * @param y The y coordinate of the top-left corner of the window.
+ * @param width The width of the window.
+ * @param height The height of hte window.
+ * @return A newly allocated window.
+ *
+ * This function creates a new window which parent is @p parent. @p width and
+ * @p height are the size of the window content (the client part),
+ * without the border and title bar. @p x and @p y are the system
+ * coordinates of the top left cerner of the window (that is, of the
+ * title bar). This function returns a newly created window on
+ * success, and @c NULL on failure.
+ */
+EAPI Ecore_WinCE_Window *
 ecore_wince_window_new(Ecore_WinCE_Window *parent,
                        int                 x,
                        int                 y,
                        int                 width,
                        int                 height)
 {
-   struct _Ecore_WinCE_Window *w;
-   HWND                        window;
-   RECT                        rect;
+   Ecore_WinCE_Window *w;
+   HWND                window;
+   RECT                rect;
+
+   INF("creating window");
 
-   w = (struct _Ecore_WinCE_Window *)calloc(1, sizeof(struct _Ecore_WinCE_Window));
+   w = (Ecore_WinCE_Window *)calloc(1, sizeof(Ecore_WinCE_Window));
    if (!w)
-     return NULL;
+     {
+        ERR("malloc() failed");
+        return NULL;
+     }
 
-   SetRect(&rect, 0, 0,
-           GetSystemMetrics(SM_CXSCREEN),
-           GetSystemMetrics(SM_CYSCREEN));
+   rect.left = 0;
+   rect.top = 0;
+   rect.right = width;
+   rect.bottom = height;
+   if (!AdjustWindowRectEx(&rect, WS_CAPTION | WS_SYSMENU | WS_VISIBLE, FALSE, WS_EX_TOPMOST))
+     {
+        ERR("AdjustWindowRectEx() failed");
+        free(w);
+        return NULL;
+     }
 
    window = CreateWindowEx(WS_EX_TOPMOST,
                            ECORE_WINCE_WINDOW_CLASS,
                            L"",
-                           WS_VISIBLE | WS_POPUP,
-                           rect.left, rect.top,
-                           rect.right - rect.left,
-                           rect.bottom - rect.top,
-                            parent ? ((struct _Ecore_WinCE_Window *)parent)->window : NULL,
+                           WS_CAPTION | WS_SYSMENU | WS_VISIBLE,
+                           x, y,
+                           rect.right - rect.left, rect.bottom - rect.top,
+                           parent ? ((Ecore_WinCE_Window *)parent)->window : NULL,
                            NULL, _ecore_wince_instance, NULL);
    if (!window)
      {
+        ERR("CreateWindowEx() failed");
         free(w);
         return NULL;
      }
 
-   SHFullScreen(window,
-                SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON);
-
    if (!_ecore_wince_hardware_keys_register(window))
      {
+        ERR("_ecore_wince_hardware_keys_register() failed");
         DestroyWindow(window);
         free(w);
         return NULL;
@@ -72,6 +151,7 @@ ecore_wince_window_new(Ecore_WinCE_Window *parent,
    SetLastError(0);
    if (!SetWindowLong(window, GWL_USERDATA, (LONG)w) && (GetLastError() != 0))
      {
+        ERR("SetWindowLong() failed");
         DestroyWindow(window);
         free(w);
         return NULL;
@@ -82,76 +162,438 @@ ecore_wince_window_new(Ecore_WinCE_Window *parent,
    return w;
 }
 
-void
-ecore_wince_window_del(Ecore_WinCE_Window *window)
+/**
+ * @brief Free the given window.
+ *
+ * @param window The window to free.
+ *
+ * This function frees @p window. If @p window is @c NULL, this
+ * function does nothing.
+ */
+EAPI void
+ecore_wince_window_free(Ecore_WinCE_Window *window)
 {
-   Ecore_WinCE_Window *w;
-
    if (!window) return;
 
-   DestroyWindow(((struct _Ecore_WinCE_Window *)window)->window);
+   INF("destroying window");
+
+   DestroyWindow(window->window);
    free(window);
-   fprintf (stderr, "ecore_wince_window_del\n");
 }
 
-void
+/**
+ * @brief Return the window HANDLE associated to the given window.
+ *
+ * @param window The window to retrieve the HANDLE from.
+ *
+ * This function returns the window HANDLE associated to @p window. If
+ * @p window is @c NULL, this function returns @c NULL.
+ */
+EAPI void *
+ecore_wince_window_hwnd_get(Ecore_WinCE_Window *window)
+{
+   if (!window)
+     return NULL;
+
+   return window->window;
+}
+
+/**
+ * @brief Move the given window to a given position.
+ *
+ * @param window The window to move.
+ * @param x The x coordinate of the destination position.
+ * @param y The y coordinate of the destination position.
+ *
+ * This function move @p window to the new position of coordinates @p x
+ * and @p y. If @p window is @c NULL, or if it is fullscreen, or on
+ * error, this function does nothing.
+ */
+EAPI void
+ecore_wince_window_move(Ecore_WinCE_Window *window,
+                        int                 x,
+                        int                 y)
+{
+   RECT rect;
+
+   if (!window || window->fullscreen)
+     return;
+
+   INF("moving window (%dx%d)", x, y);
+
+   if (!GetWindowRect(window->window, &rect))
+     {
+        ERR("GetWindowRect() failed");
+        return;
+     }
+
+   if (!MoveWindow(window->window, x, y,
+                   rect.right - rect.left,
+                   rect.bottom - rect.top,
+                   TRUE))
+     {
+        ERR("MoveWindow() failed");
+     }
+}
+
+/**
+ * @brief Resize the given window to a given size.
+ *
+ * @param window The window to resize.
+ * @param width The new width.
+ * @param height The new height.
+ *
+ * This function resize @p window to the new @p width and @p height.
+ * If @p window is @c NULL, or if it is fullscreen, or on error, this
+ * function does nothing.
+ */
+EAPI void
+ecore_wince_window_resize(Ecore_WinCE_Window *window,
+                          int                 width,
+                          int                 height)
+{
+   RECT  rect;
+   DWORD style;
+   DWORD exstyle;
+   int   x;
+   int   y;
+
+   if (!window || window->fullscreen)
+     return;
+
+   INF("resizing window (%dx%d)", width, height);
+
+   if (!GetWindowRect(window->window, &rect))
+     {
+        ERR("GetWindowRect() failed");
+        return;
+     }
+
+   x = rect.left;
+   y = rect.top;
+   rect.left = 0;
+   rect.top = 0;
+   rect.right = width;
+   rect.bottom = height;
+   if (!(style = GetWindowLong(window->window, GWL_STYLE)))
+     {
+        ERR("GetWindowLong() failed");
+        return;
+     }
+   if (!(exstyle = GetWindowLong(window->window, GWL_EXSTYLE)))
+     {
+        ERR("GetWindowLong() failed");
+        return;
+     }
+   if (!AdjustWindowRectEx(&rect, style, FALSE, exstyle))
+     {
+        ERR("AdjustWindowRectEx() failed");
+        return;
+     }
+
+   if (!MoveWindow(window->window, x, y,
+                   rect.right - rect.left,
+                   rect.bottom - rect.top,
+                   FALSE))
+     {
+        ERR("MoveWindow() failed");
+     }
+}
+
+/**
+ * @brief Move and resize the given window to a given position and size.
+ *
+ * @param window The window to move and resize.
+ * @param x The x coordinate of the destination position.
+ * @param y The x coordinate of the destination position.
+ * @param width The new width.
+ * @param height The new height.
+ *
+ * This function resize @p window to the new position of coordinates @p x
+ * and @p y and the new @p width and @p height. If @p window is @c NULL,
+ * or if it is fullscreen, or on error, this function does nothing.
+ */
+EAPI void
+ecore_wince_window_move_resize(Ecore_WinCE_Window *window,
+                               int                 x,
+                               int                 y,
+                               int                 width,
+                               int                 height)
+{
+   RECT                rect;
+   DWORD               style;
+   DWORD               exstyle;
+
+   if (!window || window->fullscreen)
+     return;
+
+   INF("moving and resizing window (%dx%d %dx%d)", x, y, width, height);
+
+   rect.left = 0;
+   rect.top = 0;
+   rect.right = width;
+   rect.bottom = height;
+   if (!(style = GetWindowLong(window->window, GWL_STYLE)))
+     {
+        ERR("GetWindowLong() failed");
+        return;
+     }
+   if (!(exstyle = GetWindowLong(window->window, GWL_EXSTYLE)))
+     {
+        ERR("GetWindowLong() failed");
+        return;
+     }
+   if (!AdjustWindowRectEx(&rect, style, FALSE, exstyle))
+     {
+        ERR("AdjustWindowRectEx() failed");
+        return;
+     }
+
+   if (!MoveWindow(window->window, x, y,
+                   rect.right - rect.left,
+                   rect.bottom - rect.top,
+                   TRUE))
+     {
+        ERR("MoveWindow() failed");
+     }
+}
+
+/**
+ * @brief Show the given window.
+ *
+ * @param window The window to show.
+ *
+ * This function shows @p window. If @p window is @c NULL, or on
+ * error, this function does nothing.
+ */
+EAPI void
 ecore_wince_window_show(Ecore_WinCE_Window *window)
 {
    if (!window) return;
 
-   fprintf (stderr, " ** ecore_wince_window_show  %p\n", window);
-   ShowWindow(((struct _Ecore_WinCE_Window *)window)->window, SW_SHOWNORMAL);
-   UpdateWindow(((struct _Ecore_WinCE_Window *)window)->window);
-   SendMessage(((struct _Ecore_WinCE_Window *)window)->window, WM_SHOWWINDOW, 1, 0);
+   INF("showing window");
+
+   if (!ShowWindow(window->window, SW_SHOWNORMAL))
+     {
+        ERR("ShowWindow() failed");
+        return;
+     }
+   if (!UpdateWindow(window->window))
+     {
+        ERR("UpdateWindow() failed");
+     }
+   if (!SendMessage(window->window, WM_SHOWWINDOW, 1, 0))
+     {
+        ERR("SendMessage() failed");
+     }
 }
 
-void
+/**
+ * @brief Hide the given window.
+ *
+ * @param window The window to show.
+ *
+ * This function hides @p window. If @p window is @c NULL, or on
+ * error, this function does nothing.
+ */
+EAPI void
 ecore_wince_window_hide(Ecore_WinCE_Window *window)
 {
    if (!window) return;
 
-   fprintf (stderr, " ** ecore_wince_window_hide  %p\n", window);
-   ShowWindow(((struct _Ecore_WinCE_Window *)window)->window, SW_HIDE);
-   SendMessage(((struct _Ecore_WinCE_Window *)window)->window, WM_SHOWWINDOW, 0, 0);
+   INF("hiding window");
+
+   if (!ShowWindow(window->window, SW_HIDE))
+     {
+        ERR("ShowWindow() failed");
+        return;
+     }
+   if (!SendMessage(window->window, WM_SHOWWINDOW, 0, 0))
+     {
+        ERR("SendMessage() failed");
+     }
 }
 
-void
-ecore_wince_window_backend_set(Ecore_WinCE_Window *window, int backend)
+/**
+ * @brief Set the title of the given window.
+ *
+ * @param window The window to set the title.
+ * @param title The new title.
+ *
+ * This function sets the title of @p window to @p title. If @p window
+ * is @c NULL, or if @p title is @c NULL or empty, or on error, this
+ * function does nothing.
+ */
+EAPI void
+ecore_wince_window_title_set(Ecore_WinCE_Window *window,
+                             const char         *title)
 {
-   struct _Ecore_WinCE_Window *w;
+   wchar_t *wtitle;
 
-   if (!window)
-     return;
+   if (!window) return;
+
+   if (!title || !title[0]) return;
+
+   INF("setting window title");
+
+   wtitle = evil_char_to_wchar(title);
+   if (!wtitle) return;
+
+   if (!SetWindowText(window->window, wtitle))
+     {
+        ERR("SetWindowText() failed");
+     }
+   free(wtitle);
+}
+
+/**
+ * @brief Set the focus to the given window.
+ *
+ * @param window The window to give focus to.
+ *
+ * This function gives the focus to @p window. If @p window is
+ * @c NULL, this function does nothing.
+ */
+EAPI void
+ecore_wince_window_focus(Ecore_WinCE_Window *window)
+{
+   if (!window) return;
+
+   INF("focusing window");
 
-   w = (struct _Ecore_WinCE_Window *)window;
-   w->backend = backend;
+   if (!SetFocus(window->window))
+     {
+        ERR("SetFocus() failed");
+     }
 }
 
-void
-ecore_wince_window_suspend_set(Ecore_WinCE_Window *window, int (*suspend)(int))
+/**
+ * @brief Get the current focused window.
+ *
+ * @return The window that has focus.
+ *
+ * This function returns the window that has focus. If the calling
+ * thread's message queue does not have an associated window with the
+ * keyboard focus, the return value is @c NULL.
+ *
+ * @note Even if the returned value is @c NULL, another thread's queue
+ * may be associated with a window that has the keyboard focus.
+ *
+ * @note The returned value is of type HWND.
+ */
+EAPI void *
+ecore_wince_window_focus_get(void)
 {
-   struct _Ecore_WinCE_Window *w;
+   HWND focused;
+
+   INF("getting focused window");
+
+   focused = GetFocus();
+   if (!focused)
+     {
+        ERR("GetFocus() failed");
+        return NULL;
+     }
+
+   return focused;
+}
 
+/**
+ * @brief Set the graphic backend used for the given window.
+ *
+ * @param window The window.
+ * @param backend The backend.
+ *
+ * This function sets the graphic backend to use with @p window to
+ * @p backend. If @p window if @c NULL, this function does nothing.
+ *
+ * The valid values for @p backend are
+ *
+ * @li 0: automatic choice of the backend.
+ * @li 1: the framebuffer (fast but could be not well suported).
+ * @li 2: GAPI (less fast but almost always supported).
+ * @li 3: DirectDraw (less fast than GAPI but almost always
+ * supported).
+ * @li 4: GDI (the slowest but always supported).
+ *
+ * The @p backend is used only in Evas and Ecore_Evas. So this
+ * function should not be called if Ecore_Evas is used.
+ */
+EAPI void
+ecore_wince_window_backend_set(Ecore_WinCE_Window *window,
+                               int                 backend)
+{
    if (!window)
      return;
 
-   w = (struct _Ecore_WinCE_Window *)window;
-   w->suspend = suspend;
+   INF("setting backend");
+
+   window->backend = backend;
 }
 
-void
-ecore_wince_window_resume_set(Ecore_WinCE_Window *window, int (*resume)(int))
+/**
+ * @brief Set the suspend callback used for the given window.
+ *
+ * @param window The window.
+ * @param suspend_cb The suspend callback.
+ *
+ * This function sets the suspend callback to use with @p window to
+ * @p suspend_cb. If @p window if @c NULL, this function does nothing.
+ *
+ * The @p suspend_cb is used only in Evas and Ecore_Evas. So this
+ * function should not be called if Ecore_Evas is used.
+ */
+EAPI void
+ecore_wince_window_suspend_cb_set(Ecore_WinCE_Window *window, int (*suspend_cb)(int))
 {
-   struct _Ecore_WinCE_Window *w;
+   if (!window)
+     return;
+
+   INF("setting suspend callback");
 
+   window->suspend_cb = suspend_cb;
+}
+
+/**
+ * @brief Set the resume callback used for the given window.
+ *
+ * @param window The window.
+ * @param resume_cb The resume callback.
+ *
+ * This function sets the resume callback to use with @p window to
+ * @p resume_cb. If @p window if @c NULL, this function does nothing.
+ *
+ * The @p resume_cb is used only in Evas and Ecore_Evas. So this
+ * function should not be called if Ecore_Evas is used.
+ */
+EAPI void
+ecore_wince_window_resume_cb_set(Ecore_WinCE_Window *window, int (*resume_cb)(int))
+{
    if (!window)
      return;
 
-   w = (struct _Ecore_WinCE_Window *)window;
-   w->resume = resume;
+   INF("setting resume callback");
+
+   window->resume_cb = resume_cb;
 }
 
-void
+/**
+ * @brief Get the geometry of the given window.
+ *
+ * @param window The window to retrieve the geometry from.
+ * @param x The x coordinate of the position.
+ * @param y The x coordinate of the position.
+ * @param width The width.
+ * @param height The height.
+ *
+ * This function retrieves the position and size of @p window. @p x,
+ * @p y, @p width and @p height can be buffers that will be filled with
+ * the corresponding values. If one of them is @c NULL, nothing will
+ * be done for that parameter. If @p window is @c NULL, and if the
+ * buffers are not @c NULL, they will be filled with respectively 0,
+ * 0, the size of the screen and the height of the screen.
+ */
+EAPI void
 ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
                                 int                *x,
                                 int                *y,
@@ -162,7 +604,8 @@ ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
    int  w;
    int  h;
 
-   printf ("ecore_wince_window_geometry_get %p\n", window);
+   INF("getting window geometry");
+
    if (!window)
      {
         if (x) *x = 0;
@@ -173,9 +616,10 @@ ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
         return;
      }
 
-   if (!GetClientRect(((struct _Ecore_WinCE_Window *)window)->window,
-                      &rect))
+   if (!GetClientRect(window->window, &rect))
      {
+        ERR("GetClientRect() failed");
+
         if (x) *x = 0;
         if (y) *y = 0;
         if (width) *width = 0;
@@ -187,9 +631,10 @@ ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
    w = rect.right - rect.left;
    h = rect.bottom - rect.top;
 
-   if (!GetWindowRect(((struct _Ecore_WinCE_Window *)window)->window,
-                      &rect))
+   if (!GetWindowRect(window->window, &rect))
      {
+        ERR("GetWindowRect() failed");
+
         if (x) *x = 0;
         if (y) *y = 0;
         if (width) *width = 0;
@@ -204,14 +649,29 @@ ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
    if (height) *height = h;
 }
 
-void
+/**
+ * @brief Get the size of the given window.
+ *
+ * @param window The window to retrieve the size from.
+ * @param width The width.
+ * @param height The height.
+ *
+ * This function retrieves the size of @p window. @p width and
+ * @p height can be buffers that will be filled with the corresponding
+ * values. If one of them is @c NULL, nothing will be done for that
+ * parameter. If @p window is @c NULL, and if the buffers are not
+ * @c NULL, they will be filled with respectively the size of the screen
+ * and the height of the screen.
+ */
+EAPI void
 ecore_wince_window_size_get(Ecore_WinCE_Window *window,
                             int                *width,
                             int                *height)
 {
    RECT rect;
 
-   printf ("ecore_wince_window_size_get %p\n", window);
+   INF("getting window size");
+
    if (!window)
      {
         if (width) *width = GetSystemMetrics(SM_CXSCREEN);
@@ -220,9 +680,10 @@ ecore_wince_window_size_get(Ecore_WinCE_Window *window,
         return;
      }
 
-   if (!GetClientRect(((struct _Ecore_WinCE_Window *)window)->window,
-                      &rect))
+   if (!GetClientRect(window->window, &rect))
      {
+        ERR("GetClientRect() failed");
+
         if (width) *width = 0;
         if (height) *height = 0;
      }
@@ -231,45 +692,136 @@ ecore_wince_window_size_get(Ecore_WinCE_Window *window,
    if (height) *height = rect.bottom - rect.top;
 }
 
-void *
-ecore_wince_window_window_get(Ecore_WinCE_Window *window)
+/**
+ * @brief Set the given window to fullscreen.
+ *
+ * @param window The window.
+ * @param on @c EINA_TRUE for fullscreen mode, @c EINA_FALSE for windowed mode.
+ *
+ * This function set @p window to fullscreen or windowed mode. If @p on is set
+ * to @c EINA_TRUE, the window will be fullscreen, if it is set to
+ * @c EINA_FALSE, it will be windowed. If @p window is @c NULL or if the state
+ * does not change (like setting to fullscreen while the window is already
+ * fullscreen), this function does nothing.
+ */
+EAPI void
+ecore_wince_window_fullscreen_set(Ecore_WinCE_Window *window,
+                                  Eina_Bool           on)
 {
-   struct _Ecore_WinCE_Window *w;
-
-   if (!window)
-     return NULL;
+   HWND task_bar;
 
-   return ((struct _Ecore_WinCE_Window *)window)->window;
-}
+   if (!window) return;
 
+   if (((window->fullscreen) && (on)) ||
+       ((!window->fullscreen) && (!on)))
+     return;
 
-/***** Private functions definitions *****/
+   INF("setting fullscreen: %s", on ? "yes" : "no");
 
-static int
-_ecore_wince_hardware_keys_register(HWND window)
-{
-   HINSTANCE           core_dll;
-   UnregisterFunc1Proc unregister_fct;
-   int                 i;
-
-   core_dll = LoadLibrary(L"coredll.dll");
-   if (!core_dll)
-     return 0;
+   window->fullscreen = !!on;
 
-   unregister_fct = (UnregisterFunc1Proc)GetProcAddress(core_dll, L"UnregisterFunc1");
-   if (!unregister_fct)
+   if (on)
      {
-        FreeLibrary(core_dll);
-        return 0;
+        /* save the position and size of the window */
+        if (!GetWindowRect(window->window, &window->rect))
+          {
+             ERR("GetWindowRect() failed");
+             return;
+          }
+
+        /* hide task bar */
+        task_bar = FindWindow(L"HHTaskBar", NULL);
+        if (!task_bar)
+          {
+             INF("FindWindow(): can not find task bar");
+          }
+        if (!ShowWindow(task_bar, SW_HIDE))
+          {
+             INF("ShowWindow(): task bar already hidden");
+          }
+        if (!EnableWindow(task_bar, FALSE))
+          {
+             INF("EnableWindow(): input already disabled");
+          }
+
+        /* style: visible + popup */
+        if (!SetWindowLong(window->window, GWL_STYLE, WS_POPUP | WS_VISIBLE))
+          {
+             INF("SetWindowLong() failed");
+          }
+
+        /* resize window to fit the entire screen */
+        if (!SetWindowPos(window->window, HWND_TOPMOST,
+                          0, 0,
+                          GetSystemMetrics(SM_CXSCREEN),
+                          GetSystemMetrics(SM_CYSCREEN),
+                          SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED))
+          {
+             INF("SetWindowPos() failed");
+          }
+        /*
+         * It seems that SetWindowPos is not sufficient.
+         * Call MoveWindow with the correct size and force painting.
+         * Note that UpdateWindow (forcing repainting) is not sufficient
+         */
+        if (!MoveWindow(window->window,
+                        0, 0,
+                        GetSystemMetrics(SM_CXSCREEN),
+                        GetSystemMetrics(SM_CYSCREEN),
+                        TRUE))
+          {
+             INF("MoveWindow() failed");
+          }
      }
-
-   for (i = 0xc1; i <= 0xcf; i++)
+   else
      {
-        unregister_fct(MOD_WIN, i);
-        RegisterHotKey(window, i, MOD_WIN, i);
+        /* show task bar */
+        task_bar = FindWindow(L"HHTaskBar", NULL);
+        if (!task_bar)
+          {
+             INF("FindWindow(): can not find task bar");
+          }
+        if (!ShowWindow(task_bar, SW_SHOW))
+          {
+             INF("ShowWindow(): task bar already visible");
+          }
+        if (!EnableWindow(task_bar, TRUE))
+          {
+             INF("EnableWindow():  input already enabled");
+          }
+
+        /* style: visible + caption + sysmenu */
+        if (!SetWindowLong(window->window, GWL_STYLE, WS_CAPTION | WS_SYSMENU | WS_VISIBLE))
+          {
+             INF("SetWindowLong() failed");
+          }
+        /* restaure the position and size of the window */
+        if (!SetWindowPos(window->window, HWND_TOPMOST,
+                          window->rect.left,
+                          window->rect.top,
+                          window->rect.right - window->rect.left,
+                          window->rect.bottom - window->rect.top,
+                          SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED))
+          {
+             INF("SetWindowLong() failed");
+          }
+        /*
+         * It seems that SetWindowPos is not sufficient.
+         * Call MoveWindow with the correct size and force painting.
+         * Note that UpdateWindow (forcing repainting) is not sufficient
+         */
+        if (!MoveWindow(window->window,
+                        window->rect.left,
+                        window->rect.top,
+                        window->rect.right - window->rect.left,
+                        window->rect.bottom - window->rect.top,
+                        TRUE))
+          {
+             INF("MoveWindow() failed");
+          }
      }
-
-   FreeLibrary(core_dll);
-
-   return 1;
 }
+
+/**
+ * @}
+ */
index 050e9bc..b3fc0fa 100644 (file)
@@ -1,30 +1,29 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #ifndef _ECORE_X_H
 #define _ECORE_X_H
 
+#include <Eina.h>
+
 #ifdef EAPI
 # undef EAPI
-#endif
+#endif // ifdef EAPI
+
 #ifdef _MSC_VER
 # ifdef BUILDING_DLL
 #  define EAPI __declspec(dllexport)
-# else
+# else // ifdef BUILDING_DLL
 #  define EAPI __declspec(dllimport)
-# endif
-#else
+# endif // ifdef BUILDING_DLL
+#else // ifdef _MSC_VER
 # ifdef __GNUC__
 #  if __GNUC__ >= 4
 #   define EAPI __attribute__ ((visibility("default")))
-#  else
+#  else // if __GNUC__ >= 4
 #   define EAPI
-#  endif
-# else
+#  endif // if __GNUC__ >= 4
+# else // ifdef __GNUC__
 #  define EAPI
-# endif
-#endif
+# endif // ifdef __GNUC__
+#endif // ifdef _MSC_VER
 
 #include <sys/types.h>
 
  * @li @ref Ecore_X_Flush_Group
  */
 
-
-typedef unsigned int Ecore_X_ID;
-#  ifndef _ECORE_X_WINDOW_PREDEF
-typedef Ecore_X_ID   Ecore_X_Window;
-#  endif
+typedef unsigned int   Ecore_X_ID;
+#ifndef _ECORE_X_WINDOW_PREDEF
+typedef Ecore_X_ID     Ecore_X_Window;
+#endif // ifndef _ECORE_X_WINDOW_PREDEF
+typedef void          *Ecore_X_Visual;
+typedef Ecore_X_ID     Ecore_X_Pixmap;
+typedef Ecore_X_ID     Ecore_X_Drawable;
 #ifdef HAVE_ECORE_X_XCB
-typedef Ecore_X_ID   Ecore_X_Visual;
-#else
-typedef void       * Ecore_X_Visual;
+typedef Ecore_X_ID     Ecore_X_GC;
+#else // ifdef HAVE_ECORE_X_XCB
+typedef void          *Ecore_X_GC;
 #endif /* HAVE_ECORE_X_XCB */
-typedef Ecore_X_ID   Ecore_X_Pixmap;
-typedef Ecore_X_ID   Ecore_X_Drawable;
-#ifdef HAVE_ECORE_X_XCB
-typedef Ecore_X_ID   Ecore_X_GC;
-#else
-typedef void       * Ecore_X_GC;
-#endif /* HAVE_ECORE_X_XCB */
-typedef Ecore_X_ID   Ecore_X_Atom;
-typedef Ecore_X_ID   Ecore_X_Colormap;
-typedef Ecore_X_ID   Ecore_X_Time;
-typedef Ecore_X_ID   Ecore_X_Cursor;
-typedef void         Ecore_X_Display;
-typedef void         Ecore_X_Connection;
-typedef void         Ecore_X_Screen;
-typedef Ecore_X_ID   Ecore_X_Sync_Counter;
-typedef Ecore_X_ID   Ecore_X_Sync_Alarm;
+typedef Ecore_X_ID     Ecore_X_Atom;
+typedef Ecore_X_ID     Ecore_X_Colormap;
+typedef Ecore_X_ID     Ecore_X_Time;
+typedef Ecore_X_ID     Ecore_X_Cursor;
+typedef void           Ecore_X_Display;
+typedef void           Ecore_X_Connection;
+typedef void           Ecore_X_Screen;
+typedef Ecore_X_ID     Ecore_X_Sync_Counter;
+typedef Ecore_X_ID     Ecore_X_Sync_Alarm;
+typedef void           Ecore_X_XRegion;
+
+typedef Ecore_X_ID     Ecore_X_Randr_Output;
+typedef Ecore_X_ID     Ecore_X_Randr_Crtc;
+typedef Ecore_X_ID     Ecore_X_Randr_Mode;
+typedef unsigned short Ecore_X_Randr_Size_ID;
+typedef int            Ecore_X_Randr_Screen;
+
+typedef Ecore_X_ID     Ecore_X_Device;
 
 #ifdef __cplusplus
 extern "C" {
-#endif
+#endif // ifdef __cplusplus
 
-typedef struct _Ecore_X_Rectangle {
-   int x, y;
+typedef struct _Ecore_X_Rectangle
+{
+   int          x, y;
    unsigned int width, height;
 } Ecore_X_Rectangle;
 
-typedef struct _Ecore_X_Icon {
+typedef struct _Ecore_X_Icon
+{
    unsigned int  width, height;
    unsigned int *data;
 } Ecore_X_Icon;
 
-typedef enum _Ecore_X_Window_State {
-    /** The window is iconified. */
-    ECORE_X_WINDOW_STATE_ICONIFIED,
-    /** The window is a modal dialog box. */
-    ECORE_X_WINDOW_STATE_MODAL,
-    /** The window manager should keep the window's position fixed
-     * even if the virtual desktop scrolls. */
-    ECORE_X_WINDOW_STATE_STICKY,
-    /** The window has the maximum vertical size. */
-    ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,
-    /** The window has the maximum horizontal size. */
-    ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,
-    /** The window is shaded. */
-    ECORE_X_WINDOW_STATE_SHADED,
-    /** The window should not be included in the taskbar. */
-    ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
-    /** The window should not be included in the pager. */
-    ECORE_X_WINDOW_STATE_SKIP_PAGER,
-    /** The window is invisible (i.e. minimized/iconified) */
-    ECORE_X_WINDOW_STATE_HIDDEN,
-    /** The window should fill the entire screen and have no
-     * window border/decorations */
-    ECORE_X_WINDOW_STATE_FULLSCREEN,
-    /* The following are not documented because they are not
-     * intended for use in applications. */
-    ECORE_X_WINDOW_STATE_ABOVE,
-    ECORE_X_WINDOW_STATE_BELOW,
-    /* FIXME: Documentation */
-    ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION,
-    /* Unknown state */
-    ECORE_X_WINDOW_STATE_UNKNOWN
+typedef enum _Ecore_X_GC_Value_Mask
+{
+   ECORE_X_GC_VALUE_MASK_FUNCTION = (1L << 0),
+   ECORE_X_GC_VALUE_MASK_PLANE_MASK = (1L << 1),
+   ECORE_X_GC_VALUE_MASK_FOREGROUND = (1L << 2),
+   ECORE_X_GC_VALUE_MASK_BACKGROUND = (1L << 3),
+   ECORE_X_GC_VALUE_MASK_LINE_WIDTH = (1L << 4),
+   ECORE_X_GC_VALUE_MASK_LINE_STYLE = (1L << 5),
+   ECORE_X_GC_VALUE_MASK_CAP_STYLE = (1L << 6),
+   ECORE_X_GC_VALUE_MASK_JOIN_STYLE = (1L << 7),
+   ECORE_X_GC_VALUE_MASK_FILL_STYLE = (1L << 8),
+   ECORE_X_GC_VALUE_MASK_FILL_RULE = (1L << 9),
+   ECORE_X_GC_VALUE_MASK_TILE = (1L << 10),
+   ECORE_X_GC_VALUE_MASK_STIPPLE = (1L << 11),
+   ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X = (1L << 12),
+   ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y = (1L << 13),
+   ECORE_X_GC_VALUE_MASK_FONT = (1L << 14),
+   ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE = (1L << 15),
+   ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES = (1L << 16),
+   ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X = (1L << 17),
+   ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y = (1L << 18),
+   ECORE_X_GC_VALUE_MASK_CLIP_MASK = (1L << 19),
+   ECORE_X_GC_VALUE_MASK_DASH_OFFSET = (1L << 20),
+   ECORE_X_GC_VALUE_MASK_DASH_LIST = (1L << 21),
+   ECORE_X_GC_VALUE_MASK_ARC_MODE = (1L << 22)
+} Ecore_X_GC_Value_Mask;
+
+typedef enum _Ecore_X_Composite_Update_Type
+{
+   ECORE_X_COMPOSITE_UPDATE_AUTOMATIC,
+   ECORE_X_COMPOSITE_UPDATE_MANUAL
+} Ecore_X_Composite_Update_Type;
+
+/**
+ * @typedef _Ecore_X_Window_State
+ * Defines the different states of the window of Ecore_X.
+ */
+typedef enum _Ecore_X_Window_State
+{
+   ECORE_X_WINDOW_STATE_UNKNOWN = 0,
+   ECORE_X_WINDOW_STATE_ICONIFIED,  /** The window is iconified. */
+   ECORE_X_WINDOW_STATE_MODAL,  /** The window is a modal dialog box. */
+   ECORE_X_WINDOW_STATE_STICKY, /** The window manager should keep the window's position fixed
+                                 * even if the virtual desktop scrolls. */
+   ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,  /** The window has the maximum vertical size. */
+   ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,  /** The window has the maximum horizontal size. */
+   ECORE_X_WINDOW_STATE_SHADED,  /** The window is shaded. */
+   ECORE_X_WINDOW_STATE_SKIP_TASKBAR,  /** The window should not be included in the taskbar. */
+   ECORE_X_WINDOW_STATE_SKIP_PAGER,  /** The window should not be included in the pager. */
+   ECORE_X_WINDOW_STATE_HIDDEN,  /** The window is invisible (i.e. minimized/iconified) */
+   ECORE_X_WINDOW_STATE_FULLSCREEN,  /** The window should fill the entire screen and have no
+                                      * window border/decorations */
+   ECORE_X_WINDOW_STATE_ABOVE,
+   ECORE_X_WINDOW_STATE_BELOW,
+   ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION
 } Ecore_X_Window_State;
 
-typedef enum _Ecore_X_Window_State_Action {
-     ECORE_X_WINDOW_STATE_ACTION_REMOVE,
-     ECORE_X_WINDOW_STATE_ACTION_ADD,
-     ECORE_X_WINDOW_STATE_ACTION_TOGGLE
+typedef enum _Ecore_X_Window_State_Action
+{
+   ECORE_X_WINDOW_STATE_ACTION_REMOVE,
+   ECORE_X_WINDOW_STATE_ACTION_ADD,
+   ECORE_X_WINDOW_STATE_ACTION_TOGGLE
 } Ecore_X_Window_State_Action;
 
-typedef enum _Ecore_X_Window_Stack_Mode {
+typedef enum _Ecore_X_Window_Stack_Mode
+{
    ECORE_X_WINDOW_STACK_ABOVE = 0,
    ECORE_X_WINDOW_STACK_BELOW = 1,
    ECORE_X_WINDOW_STACK_TOP_IF = 2,
@@ -128,35 +159,99 @@ typedef enum _Ecore_X_Window_Stack_Mode {
    ECORE_X_WINDOW_STACK_OPPOSITE = 4
 } Ecore_X_Window_Stack_Mode;
 
-typedef enum _Ecore_X_Randr_Rotation {
-   ECORE_X_RANDR_ROT_0 = (1 << 0),
-   ECORE_X_RANDR_ROT_90 = (1 << 1),
-   ECORE_X_RANDR_ROT_180 = (1 << 2),
-   ECORE_X_RANDR_ROT_270 = (1 << 3),
-   ECORE_X_RANDR_FLIP_X = (1 << 4),
-   ECORE_X_RANDR_FLIP_Y = (1 << 5)
-} Ecore_X_Randr_Rotation;
-
-#define ECORE_X_SELECTION_TARGET_TARGETS "TARGETS"
-#define ECORE_X_SELECTION_TARGET_TEXT "TEXT"
+typedef enum _Ecore_X_Randr_Orientation
+{
+   ECORE_X_RANDR_ORIENTATION_ROT_0 = (1 << 0),
+   ECORE_X_RANDR_ORIENTATION_ROT_90 = (1 << 1),
+   ECORE_X_RANDR_ORIENTATION_ROT_180 = (1 << 2),
+   ECORE_X_RANDR_ORIENTATION_ROT_270 = (1 << 3),
+   ECORE_X_RANDR_ORIENTATION_FLIP_X = (1 << 4),
+   ECORE_X_RANDR_ORIENTATION_FLIP_Y = (1 << 5)
+} Ecore_X_Randr_Orientation;
+
+typedef enum _Ecore_X_Randr_Connection_Status
+{
+   ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED = 0,
+   ECORE_X_RANDR_CONNECTION_STATUS_DISCONNECTED = 1,
+   ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN = 2
+} Ecore_X_Randr_Connection_Status;
+
+typedef enum _Ecore_X_Randr_Output_Policy
+{
+   ECORE_X_RANDR_OUTPUT_POLICY_ABOVE = 1,
+   ECORE_X_RANDR_OUTPUT_POLICY_RIGHT = 2,
+   ECORE_X_RANDR_OUTPUT_POLICY_BELOW = 3,
+   ECORE_X_RANDR_OUTPUT_POLICY_LEFT = 4,
+   ECORE_X_RANDR_OUTPUT_POLICY_CLONE = 5,
+   ECORE_X_RANDR_OUTPUT_POLICY_NONE = 6,
+   ECORE_X_RANDR_OUTPUT_POLICY_ASK = 7
+} Ecore_X_Randr_Output_Policy;
+
+typedef enum _Ecore_X_Randr_Relative_Alignment
+{
+   ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE = 0,
+   ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL = 1,
+   ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR = 2
+} Ecore_X_Randr_Relative_Alignment;
+
+typedef enum _Ecore_X_Render_Subpixel_Order
+{
+   ECORE_X_RENDER_SUBPIXEL_ORDER_UNKNOWN = 0,
+   ECORE_X_RENDER_SUBPIXEL_ORDER_HORIZONTAL_RGB = 1,
+   ECORE_X_RENDER_SUBPIXEL_ORDER_HORIZONTAL_BGR = 2,
+   ECORE_X_RENDER_SUBPIXEL_ORDER_VERTICAL_RGB = 3,
+   ECORE_X_RENDER_SUBPIXEL_ORDER_VERTICAL_BGR = 4,
+   ECORE_X_RENDER_SUBPIXEL_ORDER_NONE = 5
+} Ecore_X_Render_Subpixel_Order;
+
+typedef enum _Ecore_X_Randr_Edid_Display_Interface_Type
+{
+   ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_UNDEFINED,
+   ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DVI,
+   ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_A,
+   ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_B,
+   ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_MDDI,
+   ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT
+} Ecore_X_Randr_Edid_Display_Interface_Type;
+
+typedef enum _Ecore_X_Randr_Edid_Display_Colorscheme
+{
+   ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_MONOCHROME_GRAYSCALE = 0x00,
+   ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB = 0x08,
+   ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_NON_RGB = 0x10,
+   ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_UNDEFINED = 0x18,
+   ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_4_4_4 = 0x444000,
+   ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_4_4 = 0x444,
+   ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_2_2 = 0x422
+} Ecore_X_Randr_Edid_Display_Colorscheme;
+
+typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio
+{
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3 = 0x0,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9 = 0x1,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10 = 0x2,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4 = 0x4,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9 = 0x8
+} Ecore_X_Randr_Edid_Aspect_Ratio;
+
+#define ECORE_X_RANDR_EDID_UNKNOWN_VALUE       -1
+
+#define ECORE_X_SELECTION_TARGET_TARGETS       "TARGETS"
+#define ECORE_X_SELECTION_TARGET_TEXT          "TEXT"
 #define ECORE_X_SELECTION_TARGET_COMPOUND_TEXT "COMPOUND_TEXT"
-#define ECORE_X_SELECTION_TARGET_STRING "STRING"
-#define ECORE_X_SELECTION_TARGET_UTF8_STRING "UTF8_STRING"
-#define ECORE_X_SELECTION_TARGET_FILENAME "FILENAME"
+#define ECORE_X_SELECTION_TARGET_STRING        "STRING"
+#define ECORE_X_SELECTION_TARGET_UTF8_STRING   "UTF8_STRING"
+#define ECORE_X_SELECTION_TARGET_FILENAME      "FILENAME"
 
-#define ECORE_X_DND_VERSION 5
+#define ECORE_X_DND_VERSION                    5
 
-EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_COPY;
-EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_MOVE;
-EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_LINK;
-EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_ASK;
-EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_PRIVATE;
-
-typedef enum _Ecore_X_Selection {
+typedef enum _Ecore_X_Selection
+{
    ECORE_X_SELECTION_PRIMARY,
    ECORE_X_SELECTION_SECONDARY,
    ECORE_X_SELECTION_XDND,
-   ECORE_X_SELECTION_CLIPBOARD
+   ECORE_X_SELECTION_CLIPBOARD,
+   ECORE_X_SELECTION_OTHER
 } Ecore_X_Selection;
 
 typedef enum _Ecore_X_Event_Mode
@@ -181,239 +276,212 @@ typedef enum _Ecore_X_Event_Detail
 
 typedef enum _Ecore_X_Event_Mask
 {
-   ECORE_X_EVENT_MASK_NONE                   = 0L,
-   ECORE_X_EVENT_MASK_KEY_DOWN               = (1L << 0),
-   ECORE_X_EVENT_MASK_KEY_UP                 = (1L << 1),
-   ECORE_X_EVENT_MASK_MOUSE_DOWN             = (1L << 2),
-   ECORE_X_EVENT_MASK_MOUSE_UP               = (1L << 3),
-   ECORE_X_EVENT_MASK_MOUSE_IN               = (1L << 4),
-   ECORE_X_EVENT_MASK_MOUSE_OUT              = (1L << 5),
-   ECORE_X_EVENT_MASK_MOUSE_MOVE             = (1L << 6),
-   ECORE_X_EVENT_MASK_WINDOW_DAMAGE          = (1L << 15),
-   ECORE_X_EVENT_MASK_WINDOW_VISIBILITY      = (1L << 16),
-   ECORE_X_EVENT_MASK_WINDOW_CONFIGURE       = (1L << 17),
-   ECORE_X_EVENT_MASK_WINDOW_RESIZE_MANAGE   = (1L << 18),
-   ECORE_X_EVENT_MASK_WINDOW_MANAGE          = (1L << 19),
+   ECORE_X_EVENT_MASK_NONE = 0L,
+   ECORE_X_EVENT_MASK_KEY_DOWN = (1L << 0),
+   ECORE_X_EVENT_MASK_KEY_UP = (1L << 1),
+   ECORE_X_EVENT_MASK_MOUSE_DOWN = (1L << 2),
+   ECORE_X_EVENT_MASK_MOUSE_UP = (1L << 3),
+   ECORE_X_EVENT_MASK_MOUSE_IN = (1L << 4),
+   ECORE_X_EVENT_MASK_MOUSE_OUT = (1L << 5),
+   ECORE_X_EVENT_MASK_MOUSE_MOVE = (1L << 6),
+   ECORE_X_EVENT_MASK_WINDOW_DAMAGE = (1L << 15),
+   ECORE_X_EVENT_MASK_WINDOW_VISIBILITY = (1L << 16),
+   ECORE_X_EVENT_MASK_WINDOW_CONFIGURE = (1L << 17),
+   ECORE_X_EVENT_MASK_WINDOW_RESIZE_MANAGE = (1L << 18),
+   ECORE_X_EVENT_MASK_WINDOW_MANAGE = (1L << 19),
    ECORE_X_EVENT_MASK_WINDOW_CHILD_CONFIGURE = (1L << 20),
-   ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE    = (1L << 21),
-   ECORE_X_EVENT_MASK_WINDOW_PROPERTY        = (1L << 22),
-   ECORE_X_EVENT_MASK_WINDOW_COLORMAP        = (1L << 23),
-   ECORE_X_EVENT_MASK_WINDOW_GRAB            = (1L << 24),
-   ECORE_X_EVENT_MASK_MOUSE_WHEEL            = (1L << 29),
-   ECORE_X_EVENT_MASK_WINDOW_FOCUS_IN        = (1L << 30),
-   ECORE_X_EVENT_MASK_WINDOW_FOCUS_OUT       = (1L << 31)
+   ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE = (1L << 21),
+   ECORE_X_EVENT_MASK_WINDOW_PROPERTY = (1L << 22),
+   ECORE_X_EVENT_MASK_WINDOW_COLORMAP = (1L << 23),
+   ECORE_X_EVENT_MASK_WINDOW_GRAB = (1L << 24),
+   ECORE_X_EVENT_MASK_MOUSE_WHEEL = (1L << 29),
+   ECORE_X_EVENT_MASK_WINDOW_FOCUS_IN = (1L << 30),
+   ECORE_X_EVENT_MASK_WINDOW_FOCUS_OUT = (1L << 31)
 } Ecore_X_Event_Mask;
 
-typedef enum _Ecore_X_Gravity {
-     ECORE_X_GRAVITY_FORGET = 0,
-     ECORE_X_GRAVITY_UNMAP = 0,
-     ECORE_X_GRAVITY_NW = 1,
-     ECORE_X_GRAVITY_N = 2,
-     ECORE_X_GRAVITY_NE = 3,
-     ECORE_X_GRAVITY_W = 4,
-     ECORE_X_GRAVITY_CENTER = 5,
-     ECORE_X_GRAVITY_E = 6,
-     ECORE_X_GRAVITY_SW = 7,
-     ECORE_X_GRAVITY_S = 8,
-     ECORE_X_GRAVITY_SE = 9,
-     ECORE_X_GRAVITY_STATIC = 10
+typedef enum _Ecore_X_Gravity
+{
+   ECORE_X_GRAVITY_FORGET = 0,
+   ECORE_X_GRAVITY_UNMAP = 0,
+   ECORE_X_GRAVITY_NW = 1,
+   ECORE_X_GRAVITY_N = 2,
+   ECORE_X_GRAVITY_NE = 3,
+   ECORE_X_GRAVITY_W = 4,
+   ECORE_X_GRAVITY_CENTER = 5,
+   ECORE_X_GRAVITY_E = 6,
+   ECORE_X_GRAVITY_SW = 7,
+   ECORE_X_GRAVITY_S = 8,
+   ECORE_X_GRAVITY_SE = 9,
+   ECORE_X_GRAVITY_STATIC = 10
 } Ecore_X_Gravity;
 
 /* Needed for ecore_x_region_window_shape_set */
 typedef enum _Ecore_X_Shape_Type
 {
    ECORE_X_SHAPE_BOUNDING,
-   ECORE_X_SHAPE_CLIP
+   ECORE_X_SHAPE_CLIP,
+   ECORE_X_SHAPE_INPUT
 } Ecore_X_Shape_Type;
 
-typedef struct _Ecore_X_Event_Key_Down                 Ecore_X_Event_Key_Down;
-typedef struct _Ecore_X_Event_Key_Up                   Ecore_X_Event_Key_Up;
-typedef struct _Ecore_X_Event_Mouse_Button_Down        Ecore_X_Event_Mouse_Button_Down;
-typedef struct _Ecore_X_Event_Mouse_Button_Up          Ecore_X_Event_Mouse_Button_Up;
-typedef struct _Ecore_X_Event_Mouse_Move               Ecore_X_Event_Mouse_Move;
-typedef struct _Ecore_X_Event_Mouse_In                 Ecore_X_Event_Mouse_In;
-typedef struct _Ecore_X_Event_Mouse_Out                Ecore_X_Event_Mouse_Out;
-typedef struct _Ecore_X_Event_Mouse_Wheel              Ecore_X_Event_Mouse_Wheel;
-typedef struct _Ecore_X_Event_Window_Focus_In          Ecore_X_Event_Window_Focus_In;
-typedef struct _Ecore_X_Event_Window_Focus_Out         Ecore_X_Event_Window_Focus_Out;
-typedef struct _Ecore_X_Event_Window_Keymap            Ecore_X_Event_Window_Keymap;
-typedef struct _Ecore_X_Event_Window_Damage            Ecore_X_Event_Window_Damage;
-typedef struct _Ecore_X_Event_Window_Visibility_Change Ecore_X_Event_Window_Visibility_Change;
-typedef struct _Ecore_X_Event_Window_Create            Ecore_X_Event_Window_Create;
-typedef struct _Ecore_X_Event_Window_Destroy           Ecore_X_Event_Window_Destroy;
-typedef struct _Ecore_X_Event_Window_Hide              Ecore_X_Event_Window_Hide;
-typedef struct _Ecore_X_Event_Window_Show              Ecore_X_Event_Window_Show;
-typedef struct _Ecore_X_Event_Window_Show_Request      Ecore_X_Event_Window_Show_Request;
-typedef struct _Ecore_X_Event_Window_Reparent          Ecore_X_Event_Window_Reparent;
-typedef struct _Ecore_X_Event_Window_Configure         Ecore_X_Event_Window_Configure;
-typedef struct _Ecore_X_Event_Window_Configure_Request Ecore_X_Event_Window_Configure_Request;
-typedef struct _Ecore_X_Event_Window_Gravity           Ecore_X_Event_Window_Gravity;
-typedef struct _Ecore_X_Event_Window_Resize_Request    Ecore_X_Event_Window_Resize_Request;
-typedef struct _Ecore_X_Event_Window_Stack             Ecore_X_Event_Window_Stack;
-typedef struct _Ecore_X_Event_Window_Stack_Request     Ecore_X_Event_Window_Stack_Request;
-typedef struct _Ecore_X_Event_Window_Property          Ecore_X_Event_Window_Property;
-typedef struct _Ecore_X_Event_Window_Colormap          Ecore_X_Event_Window_Colormap;
-typedef struct _Ecore_X_Event_Window_Mapping           Ecore_X_Event_Window_Mapping;
-typedef struct _Ecore_X_Event_Selection_Clear          Ecore_X_Event_Selection_Clear;
-typedef struct _Ecore_X_Event_Selection_Request        Ecore_X_Event_Selection_Request;
-typedef struct _Ecore_X_Event_Selection_Notify         Ecore_X_Event_Selection_Notify;
-typedef struct _Ecore_X_Selection_Data                 Ecore_X_Selection_Data;
-typedef struct _Ecore_X_Selection_Data_Files           Ecore_X_Selection_Data_Files;
-typedef struct _Ecore_X_Selection_Data_Text            Ecore_X_Selection_Data_Text;
-typedef struct _Ecore_X_Selection_Data_Targets         Ecore_X_Selection_Data_Targets;
-typedef struct _Ecore_X_Event_Xdnd_Enter               Ecore_X_Event_Xdnd_Enter;
-typedef struct _Ecore_X_Event_Xdnd_Position            Ecore_X_Event_Xdnd_Position;
-typedef struct _Ecore_X_Event_Xdnd_Status              Ecore_X_Event_Xdnd_Status;
-typedef struct _Ecore_X_Event_Xdnd_Leave               Ecore_X_Event_Xdnd_Leave;
-typedef struct _Ecore_X_Event_Xdnd_Drop                Ecore_X_Event_Xdnd_Drop;
-typedef struct _Ecore_X_Event_Xdnd_Finished            Ecore_X_Event_Xdnd_Finished;
-typedef struct _Ecore_X_Event_Client_Message           Ecore_X_Event_Client_Message;
-typedef struct _Ecore_X_Event_Window_Shape             Ecore_X_Event_Window_Shape;
-typedef struct _Ecore_X_Event_Screensaver_Notify       Ecore_X_Event_Screensaver_Notify;
-typedef struct _Ecore_X_Event_Sync_Counter             Ecore_X_Event_Sync_Counter;
-typedef struct _Ecore_X_Event_Sync_Alarm               Ecore_X_Event_Sync_Alarm;
-typedef struct _Ecore_X_Event_Screen_Change            Ecore_X_Event_Screen_Change;
-
-typedef struct _Ecore_X_Event_Window_Delete_Request                Ecore_X_Event_Window_Delete_Request;
-typedef struct _Ecore_X_Event_Window_Prop_Title_Change             Ecore_X_Event_Window_Prop_Title_Change;
-typedef struct _Ecore_X_Event_Window_Prop_Visible_Title_Change     Ecore_X_Event_Window_Prop_Visible_Title_Change;
-typedef struct _Ecore_X_Event_Window_Prop_Icon_Name_Change         Ecore_X_Event_Window_Prop_Icon_Name_Change;
-typedef struct _Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change;
-typedef struct _Ecore_X_Event_Window_Prop_Client_Machine_Change    Ecore_X_Event_Window_Prop_Client_Machine_Change;
-typedef struct _Ecore_X_Event_Window_Prop_Name_Class_Change        Ecore_X_Event_Window_Prop_Name_Class_Change;
-typedef struct _Ecore_X_Event_Window_Prop_Pid_Change               Ecore_X_Event_Window_Prop_Pid_Change;
-typedef struct _Ecore_X_Event_Window_Prop_Desktop_Change           Ecore_X_Event_Window_Prop_Desktop_Change;
-
-typedef struct _Ecore_X_Event_Window_Move_Resize_Request Ecore_X_Event_Window_Move_Resize_Request;
-typedef struct _Ecore_X_Event_Window_State_Request       Ecore_X_Event_Window_State_Request;
-typedef struct _Ecore_X_Event_Frame_Extents_Request      Ecore_X_Event_Frame_Extents_Request;
-typedef struct _Ecore_X_Event_Ping                       Ecore_X_Event_Ping;
-typedef struct _Ecore_X_Event_Desktop_Change             Ecore_X_Event_Desktop_Change;
-
-typedef struct _Ecore_X_Event_Startup_Sequence           Ecore_X_Event_Startup_Sequence;
-
-struct _Ecore_X_Event_Key_Down
-{
-   char   *keyname;
-   char   *keysymbol;
-   char   *key_compose;
-   int     modifiers;
-   int    same_screen;
-   Ecore_X_Window  win;
-   Ecore_X_Window  event_win;
-   Ecore_X_Window  root_win;
-   Ecore_X_Time    time;
-};
-
-struct _Ecore_X_Event_Key_Up
-{
-   char   *keyname;
-   char   *keysymbol;
-   char   *key_compose;
-   int     modifiers;
-   int    same_screen;
-   Ecore_X_Window  win;
-   Ecore_X_Window  event_win;
-   Ecore_X_Window  root_win;
-   Ecore_X_Time    time;
-};
-
-struct _Ecore_X_Event_Mouse_Button_Down
-{
-   int     button;
-   int     modifiers;
-   int     x, y;
-   int    same_screen;
-   struct {
-      int  x, y;
-   } root;
-   Ecore_X_Window  win;
-   Ecore_X_Window  event_win;
-   Ecore_X_Window  root_win;
-   Ecore_X_Time    time;
-   unsigned int    double_click : 1;
-   unsigned int    triple_click : 1;
-};
-
-struct _Ecore_X_Event_Mouse_Button_Up
-{
-   int     button;
-   int     modifiers;
-   int     x, y;
-   int    same_screen;
-   struct {
-      int  x, y;
-   } root;
-   Ecore_X_Window  win;
-   Ecore_X_Window  event_win;
-   Ecore_X_Window  root_win;
-   Ecore_X_Time    time;
-   unsigned int    double_click : 1;
-   unsigned int    triple_click : 1;
-};
+typedef enum _Ecore_X_Mapping_Type
+{
+   ECORE_X_MAPPING_MODIFIER,
+   ECORE_X_MAPPING_KEYBOARD,
+   ECORE_X_MAPPING_MOUSE
+} Ecore_X_Mapping_Type;
 
-struct _Ecore_X_Event_Mouse_Move
+typedef enum _Ecore_X_Randr_Property_Change
 {
-   int     modifiers;
-   int     x, y;
-   int    same_screen;
-   struct {
-      int  x, y;
-   } root;
-   Ecore_X_Window  win;
-   Ecore_X_Window  event_win;
-   Ecore_X_Window  root_win;
-   Ecore_X_Time    time;
-};
+   ECORE_X_RANDR_PROPERTY_CHANGE_ADD,
+   ECORE_X_RANDR_PROPERTY_CHANGE_DEL
+} Ecore_X_Randr_Property_Change;
+
+typedef enum _Ecore_X_Netwm_Direction
+{
+   ECORE_X_NETWM_DIRECTION_SIZE_TL = 0,
+   ECORE_X_NETWM_DIRECTION_SIZE_T = 1,
+   ECORE_X_NETWM_DIRECTION_SIZE_TR = 2,
+   ECORE_X_NETWM_DIRECTION_SIZE_R = 3,
+   ECORE_X_NETWM_DIRECTION_SIZE_BR = 4,
+   ECORE_X_NETWM_DIRECTION_SIZE_B = 5,
+   ECORE_X_NETWM_DIRECTION_SIZE_BL = 6,
+   ECORE_X_NETWM_DIRECTION_SIZE_L = 7,
+   ECORE_X_NETWM_DIRECTION_MOVE = 8,
+   ECORE_X_NETWM_DIRECTION_CANCEL = 11,
+} Ecore_X_Netwm_Direction;
+
+/**
+ * @typedef _Ecore_X_Error_Code
+ * Defines the error codes of Ecore_X which wraps the X Window Systems
+ * protocol's errors.
+ *
+ * @since 1.7.0
+ */
+typedef enum _Ecore_X_Error_Code
+{
+   /** Everything is okay. */
+   ECORE_X_ERROR_CODE_SUCCESS = 0, /** Bad request code */
+   ECORE_X_ERROR_CODE_BAD_REQUEST = 1, /** Int parameter out of range */
+   ECORE_X_ERROR_CODE_BAD_VALUE = 2, /** Parameter not a Window */
+   ECORE_X_ERROR_CODE_BAD_WINDOW = 3, /** Parameter not a Pixmap */
+   ECORE_X_ERROR_CODE_BAD_PIXMAP = 4, /** Parameter not an Atom */
+   ECORE_X_ERROR_CODE_BAD_ATOM = 5, /** Parameter not a Cursor */
+   ECORE_X_ERROR_CODE_BAD_CURSOR = 6, /** Parameter not a Font */
+   ECORE_X_ERROR_CODE_BAD_FONT = 7, /** Parameter mismatch */
+   ECORE_X_ERROR_CODE_BAD_MATCH = 8, /** Parameter not a Pixmap or Window */
+   ECORE_X_ERROR_CODE_BAD_DRAWABLE = 9, /** Bad access */
+   ECORE_X_ERROR_CODE_BAD_ACCESS = 10, /** Insufficient resources */
+   ECORE_X_ERROR_CODE_BAD_ALLOC = 11, /** No such colormap */
+   ECORE_X_ERROR_CODE_BAD_COLOR = 12, /** Parameter not a GC */
+   ECORE_X_ERROR_CODE_BAD_GC = 13, /** Choice not in range or already used */
+   ECORE_X_ERROR_CODE_BAD_ID_CHOICE = 14, /** Font or color name doesn't exist */
+   ECORE_X_ERROR_CODE_BAD_NAME = 15, /** Request length incorrect */
+   ECORE_X_ERROR_CODE_BAD_LENGTH = 16, /** Server is defective */
+   ECORE_X_ERROR_CODE_BAD_IMPLEMENTATION = 17,
+} Ecore_X_Error_Code;
+
+typedef struct _Ecore_X_Event_Mouse_In                     Ecore_X_Event_Mouse_In;
+typedef struct _Ecore_X_Event_Mouse_Out                    Ecore_X_Event_Mouse_Out;
+typedef struct _Ecore_X_Event_Window_Focus_In              Ecore_X_Event_Window_Focus_In;
+typedef struct _Ecore_X_Event_Window_Focus_Out             Ecore_X_Event_Window_Focus_Out;
+typedef struct _Ecore_X_Event_Window_Keymap                Ecore_X_Event_Window_Keymap;
+typedef struct _Ecore_X_Event_Window_Damage                Ecore_X_Event_Window_Damage;
+typedef struct _Ecore_X_Event_Window_Visibility_Change     Ecore_X_Event_Window_Visibility_Change;
+typedef struct _Ecore_X_Event_Window_Create                Ecore_X_Event_Window_Create;
+typedef struct _Ecore_X_Event_Window_Destroy               Ecore_X_Event_Window_Destroy;
+typedef struct _Ecore_X_Event_Window_Hide                  Ecore_X_Event_Window_Hide;
+typedef struct _Ecore_X_Event_Window_Show                  Ecore_X_Event_Window_Show;
+typedef struct _Ecore_X_Event_Window_Show_Request          Ecore_X_Event_Window_Show_Request;
+typedef struct _Ecore_X_Event_Window_Reparent              Ecore_X_Event_Window_Reparent;
+typedef struct _Ecore_X_Event_Window_Configure             Ecore_X_Event_Window_Configure;
+typedef struct _Ecore_X_Event_Window_Configure_Request     Ecore_X_Event_Window_Configure_Request;
+typedef struct _Ecore_X_Event_Window_Gravity               Ecore_X_Event_Window_Gravity;
+typedef struct _Ecore_X_Event_Window_Resize_Request        Ecore_X_Event_Window_Resize_Request;
+typedef struct _Ecore_X_Event_Window_Stack                 Ecore_X_Event_Window_Stack;
+typedef struct _Ecore_X_Event_Window_Stack_Request         Ecore_X_Event_Window_Stack_Request;
+typedef struct _Ecore_X_Event_Window_Property              Ecore_X_Event_Window_Property;
+typedef struct _Ecore_X_Event_Window_Colormap              Ecore_X_Event_Window_Colormap;
+typedef struct _Ecore_X_Event_Mapping_Change               Ecore_X_Event_Mapping_Change;
+typedef struct _Ecore_X_Event_Window_Mapping               Ecore_X_Event_Window_Mapping;
+typedef struct _Ecore_X_Event_Selection_Clear              Ecore_X_Event_Selection_Clear;
+typedef struct _Ecore_X_Event_Selection_Request            Ecore_X_Event_Selection_Request;
+typedef struct _Ecore_X_Event_Selection_Notify             Ecore_X_Event_Selection_Notify;
+typedef struct _Ecore_X_Event_Fixes_Selection_Notify       Ecore_X_Event_Fixes_Selection_Notify;
+typedef struct _Ecore_X_Selection_Data                     Ecore_X_Selection_Data;
+typedef struct _Ecore_X_Selection_Data_Files               Ecore_X_Selection_Data_Files;
+typedef struct _Ecore_X_Selection_Data_Text                Ecore_X_Selection_Data_Text;
+typedef struct _Ecore_X_Selection_Data_Targets             Ecore_X_Selection_Data_Targets;
+typedef struct _Ecore_X_Event_Xdnd_Enter                   Ecore_X_Event_Xdnd_Enter;
+typedef struct _Ecore_X_Event_Xdnd_Position                Ecore_X_Event_Xdnd_Position;
+typedef struct _Ecore_X_Event_Xdnd_Status                  Ecore_X_Event_Xdnd_Status;
+typedef struct _Ecore_X_Event_Xdnd_Leave                   Ecore_X_Event_Xdnd_Leave;
+typedef struct _Ecore_X_Event_Xdnd_Drop                    Ecore_X_Event_Xdnd_Drop;
+typedef struct _Ecore_X_Event_Xdnd_Finished                Ecore_X_Event_Xdnd_Finished;
+typedef struct _Ecore_X_Event_Client_Message               Ecore_X_Event_Client_Message;
+typedef struct _Ecore_X_Event_Window_Shape                 Ecore_X_Event_Window_Shape;
+typedef struct _Ecore_X_Event_Screensaver_Notify           Ecore_X_Event_Screensaver_Notify;
+typedef struct _Ecore_X_Event_Gesture_Notify_Flick         Ecore_X_Event_Gesture_Notify_Flick;
+typedef struct _Ecore_X_Event_Gesture_Notify_Pan           Ecore_X_Event_Gesture_Notify_Pan;
+typedef struct _Ecore_X_Event_Gesture_Notify_PinchRotation Ecore_X_Event_Gesture_Notify_PinchRotation;
+typedef struct _Ecore_X_Event_Gesture_Notify_Tap           Ecore_X_Event_Gesture_Notify_Tap;
+typedef struct _Ecore_X_Event_Gesture_Notify_TapNHold      Ecore_X_Event_Gesture_Notify_TapNHold;
+typedef struct _Ecore_X_Event_Gesture_Notify_Hold          Ecore_X_Event_Gesture_Notify_Hold;
+typedef struct _Ecore_X_Event_Gesture_Notify_Group         Ecore_X_Event_Gesture_Notify_Group;
+typedef struct _Ecore_X_Event_Sync_Counter                 Ecore_X_Event_Sync_Counter;
+typedef struct _Ecore_X_Event_Sync_Alarm                   Ecore_X_Event_Sync_Alarm;
+typedef struct _Ecore_X_Event_Screen_Change                Ecore_X_Event_Screen_Change;
+typedef struct _Ecore_X_Event_Randr_Crtc_Change            Ecore_X_Event_Randr_Crtc_Change;
+typedef struct _Ecore_X_Event_Randr_Output_Change          Ecore_X_Event_Randr_Output_Change;
+typedef struct _Ecore_X_Event_Randr_Output_Property_Notify Ecore_X_Event_Randr_Output_Property_Notify;
+
+typedef struct _Ecore_X_Event_Window_Delete_Request        Ecore_X_Event_Window_Delete_Request;
+typedef struct _Ecore_X_Event_Window_Move_Resize_Request   Ecore_X_Event_Window_Move_Resize_Request;
+typedef struct _Ecore_X_Event_Window_State_Request         Ecore_X_Event_Window_State_Request;
+typedef struct _Ecore_X_Event_Frame_Extents_Request        Ecore_X_Event_Frame_Extents_Request;
+typedef struct _Ecore_X_Event_Ping                         Ecore_X_Event_Ping;
+typedef struct _Ecore_X_Event_Desktop_Change               Ecore_X_Event_Desktop_Change;
+
+typedef struct _Ecore_X_Event_Startup_Sequence             Ecore_X_Event_Startup_Sequence;
+
+typedef struct _Ecore_X_Event_Generic                      Ecore_X_Event_Generic;
+
+typedef struct _Ecore_X_Randr_Screen_Size                  Ecore_X_Randr_Screen_Size;
+typedef struct _Ecore_X_Randr_Screen_Size_MM               Ecore_X_Randr_Screen_Size_MM;
+
+typedef struct _Ecore_X_Xdnd_Position                      Ecore_X_Xdnd_Position;
 
 struct _Ecore_X_Event_Mouse_In
 {
    int                  modifiers;
    int                  x, y;
-   int                 same_screen;
-   struct {
-      int  x, y;
+   Eina_Bool            same_screen : 1;
+   struct
+   {
+      int x, y;
    } root;
-   Ecore_X_Window               win;
-   Ecore_X_Window               event_win;
-   Ecore_X_Window              root_win;
-   Ecore_X_Event_Mode          mode;
-   Ecore_X_Event_Detail                detail;
-   Ecore_X_Time                 time;
+   Ecore_X_Window       win;
+   Ecore_X_Window       event_win;
+   Ecore_X_Window       root_win;
+   Ecore_X_Event_Mode   mode;
+   Ecore_X_Event_Detail detail;
+   Ecore_X_Time         time;
 };
 
 struct _Ecore_X_Event_Mouse_Out
 {
    int                  modifiers;
    int                  x, y;
-   int                 same_screen;
-   struct {
-      int  x, y;
-   } root;
-   Ecore_X_Window               win;
-   Ecore_X_Window               event_win;
-   Ecore_X_Window              root_win;
-   Ecore_X_Event_Mode          mode;
-   Ecore_X_Event_Detail                detail;
-   Ecore_X_Time                 time;
-};
-
-struct _Ecore_X_Event_Mouse_Wheel
-{
-   int direction; /* 0 = default up/down wheel FIXME: more wheel types */
-   int z; /* ...,-2,-1 = down, 1,2,... = up */
-   int modifiers;
-   int x, y;
-   int same_screen;
-
-   struct {
+   int                  same_screen;
+   struct
+   {
       int x, y;
    } root;
-
-   Ecore_X_Window win;
-   Ecore_X_Window event_win;
-   Ecore_X_Window root_win;
-   Ecore_X_Time   time;
+   Ecore_X_Window       win;
+   Ecore_X_Window       event_win;
+   Ecore_X_Window       root_win;
+   Ecore_X_Event_Mode   mode;
+   Ecore_X_Event_Detail detail;
+   Ecore_X_Time         time;
 };
 
 struct _Ecore_X_Event_Window_Focus_In
@@ -434,266 +502,318 @@ struct _Ecore_X_Event_Window_Focus_Out
 
 struct _Ecore_X_Event_Window_Keymap
 {
-   Ecore_X_Window  win;
+   Ecore_X_Window win;
 };
 
 struct _Ecore_X_Event_Window_Damage
 {
-   Ecore_X_Window  win;
-   int             x, y, w, h;
-   int             count;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   int            x, y, w, h;
+   int            count;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Visibility_Change
 {
-   Ecore_X_Window  win;
-   int             fully_obscured;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   int            fully_obscured;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Create
 {
-   Ecore_X_Window  win;
-   int             override;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window parent;
+   int            override;
+   int            x, y, w, h;
+   int            border;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Destroy
 {
-   Ecore_X_Window  win;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window event_win;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Hide
 {
-   Ecore_X_Window  win;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window event_win;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Show
 {
-   Ecore_X_Window  win;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window event_win;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Show_Request
 {
-   Ecore_X_Window  win;
-   Ecore_X_Window  parent;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window parent;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Reparent
 {
-   Ecore_X_Window  win;
-   Ecore_X_Window  parent;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window event_win;
+   Ecore_X_Window parent;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Configure
 {
-   Ecore_X_Window  win;
-   Ecore_X_Window  abovewin;
-   int             x, y, w, h;
-   int             border;
-   unsigned int    override : 1;
-   unsigned int    from_wm : 1;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window event_win;
+   Ecore_X_Window abovewin;
+   int            x, y, w, h;
+   int            border;
+   Eina_Bool      override : 1;
+   Eina_Bool      from_wm : 1;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Configure_Request
 {
-   Ecore_X_Window  win;
-   Ecore_X_Window  abovewin;
-   int             x, y, w, h;
-   int             border;
+   Ecore_X_Window            win;
+   Ecore_X_Window            parent_win;
+   Ecore_X_Window            abovewin;
+   int                       x, y, w, h;
+   int                       border;
    Ecore_X_Window_Stack_Mode detail;
-   unsigned long   value_mask;
-   Ecore_X_Time    time;
+   unsigned long             value_mask;
+   Ecore_X_Time              time;
 };
 
 struct _Ecore_X_Event_Window_Gravity
 {
-   Ecore_X_Window  win;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window event_win;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Resize_Request
 {
-   Ecore_X_Window  win;
-   int             w, h;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   int            w, h;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Stack
 {
-   Ecore_X_Window  win;
-   Ecore_X_Window  event_win;
+   Ecore_X_Window            win;
+   Ecore_X_Window            event_win;
    Ecore_X_Window_Stack_Mode detail;
-   Ecore_X_Time    time;
+   Ecore_X_Time              time;
 };
 
 struct _Ecore_X_Event_Window_Stack_Request
 {
-   Ecore_X_Window  win;
-   Ecore_X_Window  parent;
+   Ecore_X_Window            win;
+   Ecore_X_Window            parent;
    Ecore_X_Window_Stack_Mode detail;
-   Ecore_X_Time    time;
+   Ecore_X_Time              time;
 };
 
 struct _Ecore_X_Event_Window_Property
 {
-   Ecore_X_Window  win;
-   Ecore_X_Atom    atom;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Atom   atom;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Colormap
 {
    Ecore_X_Window   win;
    Ecore_X_Colormap cmap;
-   int              installed;
+   Eina_Bool        installed : 1;
    Ecore_X_Time     time;
 };
 
+struct _Ecore_X_Event_Mapping_Change
+{
+   Ecore_X_Mapping_Type type;
+   int                  keycode;
+   int                  num;
+};
+
 struct _Ecore_X_Event_Selection_Clear
 {
    Ecore_X_Window    win;
    Ecore_X_Selection selection;
+   Ecore_X_Atom      atom;
    Ecore_X_Time      time;
 };
 
 struct _Ecore_X_Event_Selection_Request
 {
-   Ecore_X_Window    owner;
-   Ecore_X_Window    requestor;
-   Ecore_X_Time      time;
-   Ecore_X_Atom      selection;
-   Ecore_X_Atom      target;
-   Ecore_X_Atom      property;
+   Ecore_X_Window owner;
+   Ecore_X_Window requestor;
+   Ecore_X_Time   time;
+   Ecore_X_Atom   selection;
+   Ecore_X_Atom   target;
+   Ecore_X_Atom   property;
+};
+
+typedef enum
+{
+   ECORE_X_OWNER_CHANGE_REASON_NEW_OWNER,
+   ECORE_X_OWNER_CHANGE_REASON_DESTROY,
+   ECORE_X_OWNER_CHANGE_REASON_CLOSE
+} Ecore_X_Owner_Change_Reason;
+
+struct _Ecore_X_Event_Fixes_Selection_Notify
+{
+   Ecore_X_Window              win;
+   Ecore_X_Window              owner;
+   Ecore_X_Time                time;
+   Ecore_X_Time                selection_time;
+   Ecore_X_Selection           selection;
+   Ecore_X_Atom                atom;
+   Ecore_X_Owner_Change_Reason reason;
 };
 
 struct _Ecore_X_Event_Selection_Notify
 {
-   Ecore_X_Window             win;
-   Ecore_X_Time               time;
-   Ecore_X_Selection          selection;
-   char                      *target;
-   void                      *data;
+   Ecore_X_Window    win;
+   Ecore_X_Time      time;
+   Ecore_X_Selection selection;
+   Ecore_X_Atom      atom;
+   char             *target;
+   void             *data;
 };
 
 struct _Ecore_X_Selection_Data
 {
-   enum {
-       ECORE_X_SELECTION_CONTENT_NONE,
-       ECORE_X_SELECTION_CONTENT_TEXT,
-       ECORE_X_SELECTION_CONTENT_FILES,
-       ECORE_X_SELECTION_CONTENT_TARGETS,
-       ECORE_X_SELECTION_CONTENT_CUSTOM
+   enum
+   {
+      ECORE_X_SELECTION_CONTENT_NONE,
+      ECORE_X_SELECTION_CONTENT_TEXT,
+      ECORE_X_SELECTION_CONTENT_FILES,
+      ECORE_X_SELECTION_CONTENT_TARGETS,
+      ECORE_X_SELECTION_CONTENT_CUSTOM
    } content;
-   unsigned char    *data;
-   int               length;
-   int               format;
-
-   int             (*free)(void *data);
+   unsigned char *data;
+   int            length;
+   int            format;
+   int            (*free)(void *data);
 };
 
 struct _Ecore_X_Selection_Data_Files
 {
    Ecore_X_Selection_Data data;
-   char     **files;
-   int        num_files;
+   char                 **files;
+   int                    num_files;
 };
 
 struct _Ecore_X_Selection_Data_Text
 {
    Ecore_X_Selection_Data data;
-   char     *text;
+   char                  *text;
 };
 
 struct _Ecore_X_Selection_Data_Targets
 {
    Ecore_X_Selection_Data data;
-   char     **targets;
-   int        num_targets;
+   char                 **targets;
+   int                    num_targets;
 };
 
 struct _Ecore_X_Event_Xdnd_Enter
 {
-   Ecore_X_Window       win, source;
+   Ecore_X_Window win, source;
 
-   char               **types;
-   int                  num_types;
+   char         **types;
+   int            num_types;
 };
 
 struct _Ecore_X_Event_Xdnd_Position
 {
-   Ecore_X_Window       win, source;
-   struct {
+   Ecore_X_Window win, source;
+   struct
+   {
+      int x, y;
+   } position;
+   Ecore_X_Atom   action;
+};
+
+struct _Ecore_X_Xdnd_Position
+{
+   Ecore_X_Window win, prev;
+   struct
+   {
       int x, y;
    } position;
-   Ecore_X_Atom         action;
 };
 
 struct _Ecore_X_Event_Xdnd_Status
 {
-   Ecore_X_Window       win, target;
-   int                  will_accept;
-   Ecore_X_Rectangle    rectangle;
-   Ecore_X_Atom         action;
+   Ecore_X_Window    win, target;
+   Eina_Bool         will_accept : 1;
+   Ecore_X_Rectangle rectangle;
+   Ecore_X_Atom      action;
 };
 
 struct _Ecore_X_Event_Xdnd_Leave
 {
-   Ecore_X_Window       win, source;
+   Ecore_X_Window win, source;
 };
 
 struct _Ecore_X_Event_Xdnd_Drop
 {
-   Ecore_X_Window       win, source;
-   Ecore_X_Atom         action;
-   struct {
+   Ecore_X_Window win, source;
+   Ecore_X_Atom   action;
+   struct
+   {
       int x, y;
    } position;
 };
 
 struct _Ecore_X_Event_Xdnd_Finished
 {
-   Ecore_X_Window       win, target;
-   int                  completed;
-   Ecore_X_Atom         action;
+   Ecore_X_Window win, target;
+   Eina_Bool      completed : 1;
+   Ecore_X_Atom   action;
 };
 
 struct _Ecore_X_Event_Client_Message
 {
-   Ecore_X_Window       win;
-   Ecore_X_Atom         message_type;
-   int                  format;
-   union {
-      char              b[20];
-      short             s[10];
-      long              l[5];
-   }                    data;
-   Ecore_X_Time         time;
+   Ecore_X_Window win;
+   Ecore_X_Atom   message_type;
+   int            format;
+   union
+   {
+      char  b[20];
+      short s[10];
+      long  l[5];
+   } data;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Shape
 {
-   Ecore_X_Window  win;
-   Ecore_X_Time    time;
+   Ecore_X_Window     win;
+   Ecore_X_Time       time;
+   Ecore_X_Shape_Type type;
+   int                x, y, w, h;
+   Eina_Bool          shaped : 1;
 };
 
 struct _Ecore_X_Event_Screensaver_Notify
 {
-   Ecore_X_Window  win;
-   int             on;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Eina_Bool      on : 1;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Sync_Counter
 {
-   Ecore_X_Time    time;
+   Ecore_X_Time time;
 };
 
 struct _Ecore_X_Event_Sync_Alarm
@@ -702,78 +822,123 @@ struct _Ecore_X_Event_Sync_Alarm
    Ecore_X_Sync_Alarm alarm;
 };
 
+struct _Ecore_X_Randr_Screen_Size
+{
+   int width, height;
+};
+
+struct _Ecore_X_Randr_Screen_Size_MM
+{
+   int width, height, width_mm, height_mm;
+};
+
 struct _Ecore_X_Event_Screen_Change
 {
-   Ecore_X_Window win, root;
-   int            width, height;
+   Ecore_X_Window                win;
+   Ecore_X_Window                root;
+   Ecore_X_Randr_Screen_Size_MM  size;  /* in pixel and millimeters */
+   Ecore_X_Time                  time;
+   Ecore_X_Time                  config_time;
+   Ecore_X_Randr_Orientation     orientation;
+   Ecore_X_Render_Subpixel_Order subpixel_order;
+   Ecore_X_Randr_Size_ID         size_id;
+};
+
+struct _Ecore_X_Event_Randr_Crtc_Change
+{
+   Ecore_X_Window            win;
+   Ecore_X_Randr_Crtc        crtc;
+   Ecore_X_Randr_Mode        mode;
+   Ecore_X_Randr_Orientation orientation;
+   Eina_Rectangle            geo;
+};
+
+struct _Ecore_X_Event_Randr_Output_Change
+{
+   Ecore_X_Window                  win;
+   Ecore_X_Randr_Output            output;
+   Ecore_X_Randr_Crtc              crtc;
+   Ecore_X_Randr_Mode              mode;
+   Ecore_X_Randr_Orientation       orientation;
+   Ecore_X_Randr_Connection_Status connection;
+   Ecore_X_Render_Subpixel_Order   subpixel_order;
+};
+
+struct _Ecore_X_Event_Randr_Output_Property_Notify
+{
+   Ecore_X_Window                win;
+   Ecore_X_Randr_Output          output;
+   Ecore_X_Atom                  property;
+   Ecore_X_Time                  time;
+   Ecore_X_Randr_Property_Change state;
 };
 
 struct _Ecore_X_Event_Window_Delete_Request
 {
-   Ecore_X_Window  win;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Title_Change
 {
-   Ecore_X_Window  win;
-   char   *title;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   char          *title;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Visible_Title_Change
 {
-   Ecore_X_Window  win;
-   char   *title;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   char          *title;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Icon_Name_Change
 {
-   Ecore_X_Window  win;
-   char   *name;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   char          *name;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change
 {
-   Ecore_X_Window  win;
-   char   *name;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   char          *name;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Client_Machine_Change
 {
-   Ecore_X_Window  win;
-   char   *name;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   char          *name;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Name_Class_Change
 {
-   Ecore_X_Window  win;
-   char   *name;
-   char   *clas;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   char          *name;
+   char          *clas;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Pid_Change
 {
-   Ecore_X_Window  win;
-   pid_t   pid;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   pid_t          pid;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Window_Prop_Desktop_Change
 {
-   Ecore_X_Window  win;
-   long    desktop;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   long           desktop;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Startup_Sequence
 {
-   Ecore_X_Window  win;
+   Ecore_X_Window win;
 };
 
 struct _Ecore_X_Event_Window_Move_Resize_Request
@@ -795,31 +960,37 @@ struct _Ecore_X_Event_Window_State_Request
 
 struct _Ecore_X_Event_Frame_Extents_Request
 {
-   Ecore_X_Window              win;
+   Ecore_X_Window win;
 };
 
 struct _Ecore_X_Event_Ping
 {
-   Ecore_X_Window  win;
-   Ecore_X_Window  event_win;
-   Ecore_X_Time    time;
+   Ecore_X_Window win;
+   Ecore_X_Window event_win;
+   Ecore_X_Time   time;
 };
 
 struct _Ecore_X_Event_Desktop_Change
 {
-   Ecore_X_Window              win;
-   unsigned int                desk;
-   int                         source;
+   Ecore_X_Window win;
+   unsigned int   desk;
+   int            source;
+};
+
+struct _Ecore_X_Event_Generic
+{
+   int          extension;
+   int          evtype;
+   unsigned int cookie;
+   void        *data;
 };
 
-EAPI extern int ECORE_X_EVENT_KEY_DOWN;
-EAPI extern int ECORE_X_EVENT_KEY_UP;
-EAPI extern int ECORE_X_EVENT_MOUSE_BUTTON_DOWN;
-EAPI extern int ECORE_X_EVENT_MOUSE_BUTTON_UP;
-EAPI extern int ECORE_X_EVENT_MOUSE_MOVE;
+EAPI extern int ECORE_X_EVENT_ANY; /**< low level event dependent on
+                                        backend in use, if Xlib will be XEvent, if XCB will be xcb_generic_event_t.
+                                        @warning avoid using it.
+                                    */
 EAPI extern int ECORE_X_EVENT_MOUSE_IN;
 EAPI extern int ECORE_X_EVENT_MOUSE_OUT;
-EAPI extern int ECORE_X_EVENT_MOUSE_WHEEL;
 EAPI extern int ECORE_X_EVENT_WINDOW_FOCUS_IN;
 EAPI extern int ECORE_X_EVENT_WINDOW_FOCUS_OUT;
 EAPI extern int ECORE_X_EVENT_WINDOW_KEYMAP;
@@ -840,28 +1011,30 @@ EAPI extern int ECORE_X_EVENT_WINDOW_STACK_REQUEST;
 EAPI extern int ECORE_X_EVENT_WINDOW_PROPERTY;
 EAPI extern int ECORE_X_EVENT_WINDOW_COLORMAP;
 EAPI extern int ECORE_X_EVENT_WINDOW_MAPPING;
+EAPI extern int ECORE_X_EVENT_MAPPING_CHANGE;
 EAPI extern int ECORE_X_EVENT_SELECTION_CLEAR;
 EAPI extern int ECORE_X_EVENT_SELECTION_REQUEST;
 EAPI extern int ECORE_X_EVENT_SELECTION_NOTIFY;
+EAPI extern int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY;
 EAPI extern int ECORE_X_EVENT_CLIENT_MESSAGE;
 EAPI extern int ECORE_X_EVENT_WINDOW_SHAPE;
 EAPI extern int ECORE_X_EVENT_SCREENSAVER_NOTIFY;
+EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK;
+EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_PAN;
+EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION;
+EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_TAP;
+EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD;
+EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD;
+EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP;
 EAPI extern int ECORE_X_EVENT_SYNC_COUNTER;
 EAPI extern int ECORE_X_EVENT_SYNC_ALARM;
 EAPI extern int ECORE_X_EVENT_SCREEN_CHANGE;
+EAPI extern int ECORE_X_EVENT_RANDR_CRTC_CHANGE;
+EAPI extern int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE;
+EAPI extern int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY;
 EAPI extern int ECORE_X_EVENT_DAMAGE_NOTIFY;
 
 EAPI extern int ECORE_X_EVENT_WINDOW_DELETE_REQUEST;
-/*
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE;
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE;
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE;
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE;
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE;
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE;
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE;
-EAPI extern int ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE;
-*/
 
 EAPI extern int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST;
 EAPI extern int ECORE_X_EVENT_WINDOW_STATE_REQUEST;
@@ -872,6 +1045,10 @@ EAPI extern int ECORE_X_EVENT_DESKTOP_CHANGE;
 EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
 EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
 EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
+EAPI extern int ECORE_X_EVENT_XKB_STATE_NOTIFY; /** @since 1.7 */
+EAPI extern int ECORE_X_EVENT_XKB_NEWKBD_NOTIFY; /** @since 1.7 */
+
+EAPI extern int ECORE_X_EVENT_GENERIC;
 
 EAPI extern int ECORE_X_EVENT_XDND_ENTER;
 EAPI extern int ECORE_X_EVENT_XDND_POSITION;
@@ -880,63 +1057,66 @@ EAPI extern int ECORE_X_EVENT_XDND_LEAVE;
 EAPI extern int ECORE_X_EVENT_XDND_DROP;
 EAPI extern int ECORE_X_EVENT_XDND_FINISHED;
 
-EAPI extern int ECORE_X_MODIFIER_SHIFT;
-EAPI extern int ECORE_X_MODIFIER_CTRL;
-EAPI extern int ECORE_X_MODIFIER_ALT;
-EAPI extern int ECORE_X_MODIFIER_WIN;
+EAPI extern int ECORE_X_MODIFIER_SHIFT; /**< @since 1.7 */
+EAPI extern int ECORE_X_MODIFIER_CTRL;  /**< @since 1.7 */
+EAPI extern int ECORE_X_MODIFIER_ALT;   /**< @since 1.7 */
+EAPI extern int ECORE_X_MODIFIER_WIN;   /**< @since 1.7 */
+EAPI extern int ECORE_X_MODIFIER_ALTGR; /**< @since 1.7 */
 
 EAPI extern int ECORE_X_LOCK_SCROLL;
 EAPI extern int ECORE_X_LOCK_NUM;
 EAPI extern int ECORE_X_LOCK_CAPS;
+EAPI extern int ECORE_X_LOCK_SHIFT;
+
+EAPI extern int ECORE_X_RAW_BUTTON_PRESS;   /**< @since 1.8 */
+EAPI extern int ECORE_X_RAW_BUTTON_RELEASE; /**< @since 1.8 */
+EAPI extern int ECORE_X_RAW_MOTION;         /**< @since 1.8 */
 
-typedef enum _Ecore_X_WM_Protocol {
-       /**
-        * If enabled the window manager will be asked to send a
-        * delete message instead of just closing (destroying) the window.
-        */
-       ECORE_X_WM_PROTOCOL_DELETE_REQUEST,
-
-       /**
-        * If enabled the window manager will be told that the window
-        * explicitly sets input focus.
-        */
-       ECORE_X_WM_PROTOCOL_TAKE_FOCUS,
-
-       /**
-        * If enabled the window manager can ping the window to check
-        * if it is alive.
-        */
-       ECORE_X_NET_WM_PROTOCOL_PING,
-
-       /**
-        * If enabled the window manager can sync updating with the
-        * window (?)
-        */
-       ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST,
-
-       /* Number of defined items */
-       ECORE_X_WM_PROTOCOL_NUM
+typedef enum _Ecore_X_WM_Protocol
+{
+   /** If enabled the window manager will be asked to send a
+    * delete message instead of just closing (destroying) the window. */
+   ECORE_X_WM_PROTOCOL_DELETE_REQUEST,
+
+   /** If enabled the window manager will be told that the window
+    * explicitly sets input focus. */
+   ECORE_X_WM_PROTOCOL_TAKE_FOCUS,
+
+   /** If enabled the window manager can ping the window to check
+    * if it is alive. */
+   ECORE_X_NET_WM_PROTOCOL_PING,
+
+   /** If enabled the window manager can sync updating with the
+    * window (?) */
+   ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST,
+
+   /** Number of defined items */
+   ECORE_X_WM_PROTOCOL_NUM
 } Ecore_X_WM_Protocol;
 
-typedef enum _Ecore_X_Window_Input_Mode {
-       /** The window can never be focused */
-       ECORE_X_WINDOW_INPUT_MODE_NONE,
+typedef enum _Ecore_X_Window_Input_Mode
+{
+   /** The window can never be focused */
+   ECORE_X_WINDOW_INPUT_MODE_NONE,
 
-       /** The window can be focused by the WM but doesn't focus itself */
-       ECORE_X_WINDOW_INPUT_MODE_PASSIVE,
+   /** The window can be focused by the WM but doesn't focus itself */
+   ECORE_X_WINDOW_INPUT_MODE_PASSIVE,
 
-       /** The window sets the focus itself if one of its sub-windows
-        * already is focused
-        */
-       ECORE_X_WINDOW_INPUT_MODE_ACTIVE_LOCAL,
+   /** The window sets the focus itself if one of its sub-windows
+    * already is focused */
+   ECORE_X_WINDOW_INPUT_MODE_ACTIVE_LOCAL,
 
-       /** The window sets the focus itself even if another window
-        * is currently focused
-        */
-       ECORE_X_WINDOW_INPUT_MODE_ACTIVE_GLOBAL
+   /** The window sets the focus itself even if another window
+    * is currently focused */
+   ECORE_X_WINDOW_INPUT_MODE_ACTIVE_GLOBAL
 } Ecore_X_Window_Input_Mode;
 
-typedef enum _Ecore_X_Window_State_Hint {
+/**
+ * @typedef _Ecore_X_Window_State_Hint
+ * Defines the different state hint of the window of Ecore_X.
+ */
+typedef enum _Ecore_X_Window_State_Hint
+{
    /** Do not provide any state hint to the window manager */
    ECORE_X_WINDOW_STATE_HINT_NONE = -1,
 
@@ -947,421 +1127,381 @@ typedef enum _Ecore_X_Window_State_Hint {
    ECORE_X_WINDOW_STATE_HINT_NORMAL,
 
    /** The window wants to start in an iconified state */
-   ECORE_X_WINDOW_STATE_HINT_ICONIC,
+   ECORE_X_WINDOW_STATE_HINT_ICONIC
 } Ecore_X_Window_State_Hint;
 
-typedef enum _Ecore_X_Window_Type {
-    ECORE_X_WINDOW_TYPE_DESKTOP,
-    ECORE_X_WINDOW_TYPE_DOCK,
-    ECORE_X_WINDOW_TYPE_TOOLBAR,
-    ECORE_X_WINDOW_TYPE_MENU,
-    ECORE_X_WINDOW_TYPE_UTILITY,
-    ECORE_X_WINDOW_TYPE_SPLASH,
-    ECORE_X_WINDOW_TYPE_DIALOG,
-    ECORE_X_WINDOW_TYPE_NORMAL,
-    ECORE_X_WINDOW_TYPE_UNKNOWN
+typedef enum _Ecore_X_Window_Type
+{
+   ECORE_X_WINDOW_TYPE_UNKNOWN = 0,
+   ECORE_X_WINDOW_TYPE_DESKTOP,
+   ECORE_X_WINDOW_TYPE_DOCK,
+   ECORE_X_WINDOW_TYPE_TOOLBAR,
+   ECORE_X_WINDOW_TYPE_MENU,
+   ECORE_X_WINDOW_TYPE_UTILITY,
+   ECORE_X_WINDOW_TYPE_SPLASH,
+   ECORE_X_WINDOW_TYPE_DIALOG,
+   ECORE_X_WINDOW_TYPE_NORMAL,
+   ECORE_X_WINDOW_TYPE_DROPDOWN_MENU,
+   ECORE_X_WINDOW_TYPE_POPUP_MENU,
+   ECORE_X_WINDOW_TYPE_TOOLTIP,
+   ECORE_X_WINDOW_TYPE_NOTIFICATION,
+   ECORE_X_WINDOW_TYPE_COMBO,
+   ECORE_X_WINDOW_TYPE_DND
 } Ecore_X_Window_Type;
 
-typedef enum _Ecore_X_Action {
-    ECORE_X_ACTION_MOVE,
-    ECORE_X_ACTION_RESIZE,
-    ECORE_X_ACTION_MINIMIZE,
-    ECORE_X_ACTION_SHADE,
-    ECORE_X_ACTION_STICK,
-    ECORE_X_ACTION_MAXIMIZE_HORZ,
-    ECORE_X_ACTION_MAXIMIZE_VERT,
-    ECORE_X_ACTION_FULLSCREEN,
-    ECORE_X_ACTION_CHANGE_DESKTOP,
-    ECORE_X_ACTION_CLOSE
+typedef enum _Ecore_X_Action
+{
+   ECORE_X_ACTION_MOVE,
+   ECORE_X_ACTION_RESIZE,
+   ECORE_X_ACTION_MINIMIZE,
+   ECORE_X_ACTION_SHADE,
+   ECORE_X_ACTION_STICK,
+   ECORE_X_ACTION_MAXIMIZE_HORZ,
+   ECORE_X_ACTION_MAXIMIZE_VERT,
+   ECORE_X_ACTION_FULLSCREEN,
+   ECORE_X_ACTION_CHANGE_DESKTOP,
+   ECORE_X_ACTION_CLOSE,
+   ECORE_X_ACTION_ABOVE,
+   ECORE_X_ACTION_BELOW
 } Ecore_X_Action;
 
-typedef enum _Ecore_X_Window_Configure_Mask {
-   ECORE_X_WINDOW_CONFIGURE_MASK_X              = (1 << 0),
-   ECORE_X_WINDOW_CONFIGURE_MASK_Y              = (1 << 1),
-   ECORE_X_WINDOW_CONFIGURE_MASK_W              = (1 << 2),
-   ECORE_X_WINDOW_CONFIGURE_MASK_H              = (1 << 3),
-   ECORE_X_WINDOW_CONFIGURE_MASK_BORDER_WIDTH   = (1 << 4),
-   ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING        = (1 << 5),
-   ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE     = (1 << 6)
+typedef enum _Ecore_X_Window_Configure_Mask
+{
+   ECORE_X_WINDOW_CONFIGURE_MASK_X = (1 << 0),
+   ECORE_X_WINDOW_CONFIGURE_MASK_Y = (1 << 1),
+   ECORE_X_WINDOW_CONFIGURE_MASK_W = (1 << 2),
+   ECORE_X_WINDOW_CONFIGURE_MASK_H = (1 << 3),
+   ECORE_X_WINDOW_CONFIGURE_MASK_BORDER_WIDTH = (1 << 4),
+   ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING = (1 << 5),
+   ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE = (1 << 6)
 } Ecore_X_Window_Configure_Mask;
 
-typedef enum _Ecore_X_Virtual_Keyboard_State {
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN = 0,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_ON,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL,
-    ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD
+typedef enum _Ecore_X_Virtual_Keyboard_State
+{
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN = 0,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_ON,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_IP,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_URL,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD,
+   ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME
 } Ecore_X_Virtual_Keyboard_State;
 
+typedef enum _Ecore_X_Illume_Mode
+{
+   ECORE_X_ILLUME_MODE_UNKNOWN = 0,
+   ECORE_X_ILLUME_MODE_SINGLE,
+   ECORE_X_ILLUME_MODE_DUAL_TOP,
+   ECORE_X_ILLUME_MODE_DUAL_LEFT
+} Ecore_X_Illume_Mode;
+
+typedef enum _Ecore_X_Illume_Quickpanel_State
+{
+   ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN = 0,
+   ECORE_X_ILLUME_QUICKPANEL_STATE_OFF,
+   ECORE_X_ILLUME_QUICKPANEL_STATE_ON
+} Ecore_X_Illume_Quickpanel_State;
+
+typedef enum _Ecore_X_Illume_Indicator_State
+{
+   ECORE_X_ILLUME_INDICATOR_STATE_UNKNOWN = 0,
+   ECORE_X_ILLUME_INDICATOR_STATE_OFF,
+   ECORE_X_ILLUME_INDICATOR_STATE_ON
+} Ecore_X_Illume_Indicator_State;
+
+typedef enum _Ecore_X_Illume_Clipboard_State
+{
+   ECORE_X_ILLUME_CLIPBOARD_STATE_UNKNOWN = 0,
+   ECORE_X_ILLUME_CLIPBOARD_STATE_OFF,
+   ECORE_X_ILLUME_CLIPBOARD_STATE_ON
+} Ecore_X_Illume_Clipboard_State;
+
+typedef enum _Ecore_X_Illume_Indicator_Opacity_Mode
+{
+   ECORE_X_ILLUME_INDICATOR_OPACITY_UNKNOWN = 0,
+   ECORE_X_ILLUME_INDICATOR_OPAQUE,
+   ECORE_X_ILLUME_INDICATOR_TRANSLUCENT,
+   ECORE_X_ILLUME_INDICATOR_TRANSPARENT
+} Ecore_X_Illume_Indicator_Opacity_Mode;
+
+typedef enum _Ecore_X_Illume_Window_State
+{
+   ECORE_X_ILLUME_WINDOW_STATE_NORMAL = 0,
+   ECORE_X_ILLUME_WINDOW_STATE_FLOATING
+} Ecore_X_Illume_Window_State;
 
 /* Window layer constants */
-#define ECORE_X_WINDOW_LAYER_BELOW 2
+#define ECORE_X_WINDOW_LAYER_BELOW  2
 #define ECORE_X_WINDOW_LAYER_NORMAL 4
-#define ECORE_X_WINDOW_LAYER_ABOVE 6
+#define ECORE_X_WINDOW_LAYER_ABOVE  6
 
 /* Property list operations */
 #define ECORE_X_PROP_LIST_REMOVE    0
 #define ECORE_X_PROP_LIST_ADD       1
 #define ECORE_X_PROP_LIST_TOGGLE    2
 
-EAPI int              ecore_x_init(const char *name);
-EAPI int              ecore_x_shutdown(void);
-EAPI int              ecore_x_disconnect(void);
-EAPI Ecore_X_Display *ecore_x_display_get(void);
-EAPI Ecore_X_Connection *ecore_x_connection_get(void);
-EAPI int              ecore_x_fd_get(void);
-EAPI Ecore_X_Screen  *ecore_x_default_screen_get(void);
-EAPI void             ecore_x_double_click_time_set(double t);
-EAPI double           ecore_x_double_click_time_get(void);
-EAPI void             ecore_x_flush(void);
-EAPI void             ecore_x_sync(void);
-EAPI void             ecore_x_killall(Ecore_X_Window root);
-EAPI void             ecore_x_kill(Ecore_X_Window win);
-
-EAPI Ecore_X_Time     ecore_x_current_time_get(void);
-
-EAPI void             ecore_x_error_handler_set(void (*func) (void *data), const void *data);
-EAPI void             ecore_x_io_error_handler_set(void (*func) (void *data), const void *data);
-EAPI int              ecore_x_error_request_get(void);
-EAPI int              ecore_x_error_code_get(void);
-
-EAPI void             ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask);
-EAPI void             ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask);
-
-EAPI int              ecore_x_selection_notify_send(Ecore_X_Window requestor, Ecore_X_Atom selection, Ecore_X_Atom target, Ecore_X_Atom property, Ecore_X_Time time);
-EAPI void             ecore_x_selection_primary_prefetch(void);
-EAPI void             ecore_x_selection_primary_fetch(void);
-EAPI int              ecore_x_selection_primary_set(Ecore_X_Window w, const void *data, int size);
-EAPI int              ecore_x_selection_primary_clear(void);
-EAPI void             ecore_x_selection_secondary_prefetch(void);
-EAPI void             ecore_x_selection_secondary_fetch(void);
-EAPI int              ecore_x_selection_secondary_set(Ecore_X_Window w, const void *data, int size);
-EAPI int              ecore_x_selection_secondary_clear(void);
-EAPI void             ecore_x_selection_xdnd_prefetch(void);
-EAPI void             ecore_x_selection_xdnd_fetch(void);
-EAPI int              ecore_x_selection_xdnd_set(Ecore_X_Window w, const void *data, int size);
-EAPI int              ecore_x_selection_xdnd_clear(void);
-EAPI void             ecore_x_selection_clipboard_prefetch(void);
-EAPI void             ecore_x_selection_clipboard_fetch(void);
-EAPI int              ecore_x_selection_clipboard_set(Ecore_X_Window w, const void *data, int size);
-EAPI int              ecore_x_selection_clipboard_clear(void);
-EAPI void             ecore_x_selection_primary_request(Ecore_X_Window w, const char *target);
-EAPI void             ecore_x_selection_secondary_request(Ecore_X_Window w, const char *target);
-EAPI void             ecore_x_selection_xdnd_request(Ecore_X_Window w, const char *target);
-EAPI void             ecore_x_selection_clipboard_request(Ecore_X_Window w, const char *target);
-EAPI int              ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret);
-EAPI void             ecore_x_selection_converter_add(char *target, int (*func)(char *target, void *data, int size, void **data_ret, int *size_ret));
-EAPI void             ecore_x_selection_converter_atom_add(Ecore_X_Atom target, int (*func)(char *target, void *data, int size, void **data_ret, int *size_ret));
-EAPI void             ecore_x_selection_converter_del(char *target);
-EAPI void             ecore_x_selection_converter_atom_del(Ecore_X_Atom target);
-EAPI void             ecore_x_selection_parser_add(const char *target, void *(*func)(const char *target, void *data, int size, int format));
-EAPI void             ecore_x_selection_parser_del(const char *target);
-
-EAPI void             ecore_x_dnd_aware_set(Ecore_X_Window win, int on);
-EAPI void             ecore_x_dnd_version_get_prefetch(Ecore_X_Window window);
-EAPI void             ecore_x_dnd_version_get_fetch(void);
-EAPI int              ecore_x_dnd_version_get(Ecore_X_Window win);
-EAPI void             ecore_x_dnd_type_get_prefetch(Ecore_X_Window window);
-EAPI void             ecore_x_dnd_type_get_fetch(void);
-EAPI int              ecore_x_dnd_type_isset(Ecore_X_Window win, const char *type);
-EAPI void             ecore_x_dnd_type_set(Ecore_X_Window win, const char *type, int on);
-EAPI void             ecore_x_dnd_types_set(Ecore_X_Window win, char **types, unsigned int num_types);
-EAPI void             ecore_x_dnd_actions_set(Ecore_X_Window win, Ecore_X_Atom *actions, unsigned int num_actions);
-EAPI void             ecore_x_dnd_begin_prefetch(Ecore_X_Window source);
-EAPI void             ecore_x_dnd_begin_fetch(void);
-EAPI int              ecore_x_dnd_begin(Ecore_X_Window source, unsigned char *data, int size);
-EAPI int              ecore_x_dnd_drop(void);
-EAPI void             ecore_x_dnd_send_status(int will_accept, int suppress, Ecore_X_Rectangle rectangle, Ecore_X_Atom action);
-EAPI void             ecore_x_dnd_send_finished(void);
-
-EAPI Ecore_X_Window   ecore_x_window_new(Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window   ecore_x_window_override_new(Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI int              ecore_x_window_argb_get(Ecore_X_Window win);
-EAPI Ecore_X_Window   ecore_x_window_manager_argb_new(Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window   ecore_x_window_argb_new(Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window   ecore_x_window_override_argb_new(Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI Ecore_X_Window   ecore_x_window_input_new(Ecore_X_Window parent, int x, int y, int w, int h);
-EAPI void             ecore_x_window_configure(Ecore_X_Window win,
-                                              Ecore_X_Window_Configure_Mask mask,
-                                              int x, int y, int w, int h,
-                                              int border_width,
-                                              Ecore_X_Window sibling,
-                                              int stack_mode);
-EAPI void             ecore_x_window_cursor_set(Ecore_X_Window win, Ecore_X_Cursor c);
-EAPI void             ecore_x_window_del(Ecore_X_Window win);
-EAPI void             ecore_x_window_ignore_set(Ecore_X_Window win, int ignore);
-EAPI Ecore_X_Window  *ecore_x_window_ignore_list(int *num);
-
-EAPI void             ecore_x_window_delete_request_send(Ecore_X_Window win);
-EAPI void             ecore_x_window_show(Ecore_X_Window win);
-EAPI void             ecore_x_window_hide(Ecore_X_Window win);
-EAPI void             ecore_x_window_move(Ecore_X_Window win, int x, int y);
-EAPI void             ecore_x_window_resize(Ecore_X_Window win, int w, int h);
-EAPI void             ecore_x_window_move_resize(Ecore_X_Window win, int x, int y, int w, int h);
-EAPI void             ecore_x_window_focus(Ecore_X_Window win);
-EAPI void             ecore_x_window_focus_at_time(Ecore_X_Window win, Ecore_X_Time t);
-EAPI void             ecore_x_get_input_focus_prefetch(void);
-EAPI void             ecore_x_get_input_focus_fetch(void);
-EAPI Ecore_X_Window   ecore_x_window_focus_get(void);
-EAPI void             ecore_x_window_raise(Ecore_X_Window win);
-EAPI void             ecore_x_window_lower(Ecore_X_Window win);
-EAPI void             ecore_x_window_reparent(Ecore_X_Window win, Ecore_X_Window new_parent, int x, int y);
-EAPI void             ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h);
-EAPI void             ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h);
-EAPI int              ecore_x_window_border_width_get(Ecore_X_Window win);
-EAPI void             ecore_x_window_border_width_set(Ecore_X_Window win, int width);
-EAPI int              ecore_x_window_depth_get(Ecore_X_Window win);
-EAPI void             ecore_x_window_cursor_show(Ecore_X_Window win, int show);
-EAPI void             ecore_x_window_defaults_set(Ecore_X_Window win);
-EAPI int              ecore_x_window_visible_get(Ecore_X_Window win);
-EAPI Ecore_X_Window   ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base, int x, int y, Ecore_X_Window *skip, int skip_num);
-EAPI Ecore_X_Window   ecore_x_window_shadow_parent_get(Ecore_X_Window root, Ecore_X_Window win);
-EAPI void             ecore_x_window_shadow_tree_flush(void);
-EAPI Ecore_X_Window   ecore_x_window_root_get(Ecore_X_Window win);
-EAPI Ecore_X_Window   ecore_x_window_at_xy_get(int x, int y);
-EAPI Ecore_X_Window   ecore_x_window_at_xy_with_skip_get(int x, int y, Ecore_X_Window *skip, int skip_num);
-EAPI Ecore_X_Window   ecore_x_window_at_xy_begin_get(Ecore_X_Window begin, int x, int y);
-EAPI void             ecore_x_query_tree_prefetch(Ecore_X_Window window);
-EAPI void             ecore_x_query_tree_fetch(void);
-EAPI Ecore_X_Window   ecore_x_window_parent_get(Ecore_X_Window win);
-
-EAPI void             ecore_x_window_background_color_set(Ecore_X_Window win,
-                                                         unsigned short r,
-                                                         unsigned short g,
-                                                         unsigned short b);
-EAPI void             ecore_x_window_gravity_set(Ecore_X_Window win,
-                                                Ecore_X_Gravity grav);
-EAPI void             ecore_x_window_pixel_gravity_set(Ecore_X_Window win,
-                                                      Ecore_X_Gravity grav);
-EAPI void             ecore_x_window_pixmap_set(Ecore_X_Window win,
-                                               Ecore_X_Pixmap pmap);
-EAPI void             ecore_x_window_area_clear(Ecore_X_Window win,
-                                               int x, int y, int w, int h);
-EAPI void             ecore_x_window_area_expose(Ecore_X_Window win,
-                                                int x, int y, int w, int h);
-EAPI void             ecore_x_window_override_set(Ecore_X_Window win, int override);
-
-EAPI void             ecore_x_window_prop_card32_set(Ecore_X_Window win, Ecore_X_Atom atom,
-                                                    unsigned int *val, unsigned int num);
-EAPI void             ecore_x_window_prop_card32_get_prefetch(Ecore_X_Window window,
-                                                              Ecore_X_Atom atom);
-EAPI void             ecore_x_window_prop_card32_get_fetch(void);
-EAPI int              ecore_x_window_prop_card32_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                                                    unsigned int *val, unsigned int len);
-EAPI int              ecore_x_window_prop_card32_list_get(Ecore_X_Window win,
-                                                          Ecore_X_Atom atom,
-                                                          unsigned int **plst);
-
-EAPI void             ecore_x_window_prop_xid_set(Ecore_X_Window win,
-                                                  Ecore_X_Atom atom,
-                                                  Ecore_X_Atom type,
-                                                  Ecore_X_ID * lst,
-                                                  unsigned int num);
-EAPI void             ecore_x_window_prop_xid_get_prefetch(Ecore_X_Window window,
-                                                           Ecore_X_Atom   atom,
-                                                           Ecore_X_Atom   type);
-EAPI void             ecore_x_window_prop_xid_get_fetch(void);
-EAPI int              ecore_x_window_prop_xid_get(Ecore_X_Window win,
-                                                  Ecore_X_Atom atom,
-                                                  Ecore_X_Atom type,
-                                                  Ecore_X_ID * lst,
-                                                  unsigned int len);
-EAPI int              ecore_x_window_prop_xid_list_get(Ecore_X_Window win,
-                                                       Ecore_X_Atom atom,
-                                                       Ecore_X_Atom type,
-                                                       Ecore_X_ID ** plst);
-EAPI void             ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
-                                                          Ecore_X_Atom atom,
-                                                          Ecore_X_Atom type,
-                                                          Ecore_X_ID item,
-                                                          int op);
-EAPI void             ecore_x_window_prop_atom_set(Ecore_X_Window win,
-                                                   Ecore_X_Atom atom,
-                                                   Ecore_X_Atom * val,
-                                                   unsigned int num);
-EAPI void             ecore_x_window_prop_atom_get_prefetch(Ecore_X_Window window,
-                                                            Ecore_X_Atom   atom);
-EAPI void             ecore_x_window_prop_atom_get_fetch(void);
-EAPI int              ecore_x_window_prop_atom_get(Ecore_X_Window win,
-                                                   Ecore_X_Atom atom,
-                                                   Ecore_X_Atom * val,
-                                                   unsigned int len);
-EAPI int              ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
-                                                        Ecore_X_Atom atom,
-                                                        Ecore_X_Atom ** plst);
-EAPI void             ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
-                                                           Ecore_X_Atom atom,
-                                                           Ecore_X_Atom item,
-                                                           int op);
-EAPI void             ecore_x_window_prop_window_set(Ecore_X_Window win,
-                                                     Ecore_X_Atom atom,
-                                                     Ecore_X_Window * val,
-                                                     unsigned int num);
-EAPI void             ecore_x_window_prop_window_get_prefetch(Ecore_X_Window window,
-                                                              Ecore_X_Atom   atom);
-EAPI void             ecore_x_window_prop_window_get_fetch(void);
-EAPI int              ecore_x_window_prop_window_get(Ecore_X_Window win,
-                                                     Ecore_X_Atom atom,
-                                                     Ecore_X_Window * val,
-                                                     unsigned int len);
-EAPI int              ecore_x_window_prop_window_list_get(Ecore_X_Window win,
-                                                          Ecore_X_Atom atom,
-                                                          Ecore_X_Window ** plst);
-
-EAPI Ecore_X_Atom     ecore_x_window_prop_any_type(void);
-EAPI void             ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Atom format, int size, void *data, int number);
-EAPI void             ecore_x_window_prop_property_get_prefetch(Ecore_X_Window window,
-                                                                Ecore_X_Atom   property,
-                                                                Ecore_X_Atom   type);
-EAPI void             ecore_x_window_prop_property_get_fetch(void);
-EAPI int              ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecore_X_Atom type, int size, unsigned char **data, int *num);
-EAPI void             ecore_x_window_prop_property_del(Ecore_X_Window win, Ecore_X_Atom property);
-EAPI void             ecore_x_window_prop_list_prefetch(Ecore_X_Window window);
-EAPI void             ecore_x_window_prop_list_fetch(void);
-EAPI Ecore_X_Atom    *ecore_x_window_prop_list(Ecore_X_Window win, int *num_ret);
-EAPI void             ecore_x_window_prop_string_set(Ecore_X_Window win, Ecore_X_Atom type, const char *str);
-EAPI void             ecore_x_window_prop_string_get_prefetch(Ecore_X_Window window,
-                                                              Ecore_X_Atom   type);
-EAPI void             ecore_x_window_prop_string_get_fetch(void);
-EAPI char            *ecore_x_window_prop_string_get(Ecore_X_Window win, Ecore_X_Atom type);
-EAPI int              ecore_x_window_prop_protocol_isset(Ecore_X_Window win, Ecore_X_WM_Protocol protocol);
-EAPI Ecore_X_WM_Protocol *ecore_x_window_prop_protocol_list_get(Ecore_X_Window win, int *num_ret);
-
-EAPI void               ecore_x_window_shape_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask);
-EAPI void               ecore_x_window_shape_window_set(Ecore_X_Window win, Ecore_X_Window shape_win);
-EAPI void               ecore_x_window_shape_window_set_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y);
-EAPI void               ecore_x_window_shape_rectangle_set(Ecore_X_Window win, int x, int y, int w, int h);
-EAPI void               ecore_x_window_shape_rectangles_set(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num);
-EAPI void               ecore_x_window_shape_window_add(Ecore_X_Window win, Ecore_X_Window shape_win);
-EAPI void               ecore_x_window_shape_window_add_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y);
-EAPI void               ecore_x_window_shape_rectangle_add(Ecore_X_Window win, int x, int y, int w, int h);
-EAPI void               ecore_x_window_shape_rectangle_clip(Ecore_X_Window win, int x, int y, int w, int h);
-EAPI void               ecore_x_window_shape_rectangles_add(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num);
-EAPI void               ecore_x_window_shape_rectangles_get_prefetch(Ecore_X_Window window);
-EAPI void               ecore_x_window_shape_rectangles_get_fetch(void);
-EAPI Ecore_X_Rectangle *ecore_x_window_shape_rectangles_get(Ecore_X_Window win, int *num_ret);
-EAPI void               ecore_x_window_shape_events_select(Ecore_X_Window win, int on);
-EAPI void               ecore_x_window_shape_input_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask);
-
-EAPI Ecore_X_Pixmap   ecore_x_pixmap_new(Ecore_X_Window win, int w, int h, int dep);
-EAPI void             ecore_x_pixmap_del(Ecore_X_Pixmap pmap);
-EAPI void             ecore_x_pixmap_paste(Ecore_X_Pixmap pmap, Ecore_X_Drawable dest, Ecore_X_GC gc, int sx, int sy, int w, int h, int dx, int dy);
-EAPI void             ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h);
-EAPI int              ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap);
-
-EAPI Ecore_X_GC       ecore_x_gc_new(Ecore_X_Drawable draw);
-EAPI void             ecore_x_gc_del(Ecore_X_GC gc);
-
-EAPI int              ecore_x_client_message32_send(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Event_Mask mask, long d0, long d1, long d2, long d3, long d4);
-EAPI int              ecore_x_client_message8_send(Ecore_X_Window win, Ecore_X_Atom type, const void *data, int len);
-EAPI int              ecore_x_mouse_move_send(Ecore_X_Window win, int x, int y);
-EAPI int              ecore_x_mouse_down_send(Ecore_X_Window win, int x, int y, int b);
-EAPI int              ecore_x_mouse_up_send(Ecore_X_Window win, int x, int y, int b);
-
-EAPI void            ecore_x_drawable_geometry_get_prefetch(Ecore_X_Drawable drawable);
-EAPI void            ecore_x_drawable_geometry_get_fetch(void);
-EAPI void            ecore_x_drawable_geometry_get(Ecore_X_Drawable d, int *x, int *y, int *w, int *h);
-EAPI int             ecore_x_drawable_border_width_get(Ecore_X_Drawable d);
-EAPI int             ecore_x_drawable_depth_get(Ecore_X_Drawable d);
-
-EAPI int  ecore_x_cursor_color_supported_get(void);
-EAPI Ecore_X_Cursor ecore_x_cursor_new(Ecore_X_Window win, int *pixels, int w, int h, int hot_x, int hot_y);
-EAPI void ecore_x_cursor_free(Ecore_X_Cursor c);
-EAPI Ecore_X_Cursor ecore_x_cursor_shape_get(int shape);
-EAPI void ecore_x_cursor_size_set(int size);
-EAPI int  ecore_x_cursor_size_get(void);
-
+EAPI int                       ecore_x_init(const char *name);
+EAPI int                       ecore_x_shutdown(void);
+EAPI int                       ecore_x_disconnect(void);
+EAPI Ecore_X_Display          *ecore_x_display_get(void);
+EAPI Ecore_X_Connection       *ecore_x_connection_get(void);
+EAPI int                       ecore_x_fd_get(void);
+EAPI Ecore_X_Screen           *ecore_x_default_screen_get(void);
+EAPI void                      ecore_x_screen_size_get(const Ecore_X_Screen *screen, int *w, int *h);
+EAPI int                       ecore_x_screen_count_get(void);
+EAPI int                       ecore_x_screen_index_get(const Ecore_X_Screen *screen);
+EAPI Ecore_X_Screen           *ecore_x_screen_get(int index);
+
+EAPI void                      ecore_x_double_click_time_set(double t);
+EAPI double                    ecore_x_double_click_time_get(void);
+EAPI void                      ecore_x_flush(void);
+EAPI void                      ecore_x_sync(void);
+EAPI void                      ecore_x_killall(Ecore_X_Window root);
+EAPI void                      ecore_x_kill(Ecore_X_Window win);
+EAPI int                       ecore_x_dpi_get(void);
+EAPI Eina_Bool                 ecore_x_bell(int percent);
+EAPI unsigned int              ecore_x_visual_id_get(Ecore_X_Visual visual);
+
+EAPI Ecore_X_Visual            ecore_x_default_visual_get(Ecore_X_Display *disp, Ecore_X_Screen *screen);
+EAPI Ecore_X_Colormap          ecore_x_default_colormap_get(Ecore_X_Display *disp, Ecore_X_Screen *screen);
+EAPI int                       ecore_x_default_depth_get(Ecore_X_Display *disp, Ecore_X_Screen *screen);
+
+EAPI Ecore_X_Time              ecore_x_current_time_get(void);
+
+EAPI void                      ecore_x_error_handler_set(void (*func)(void *data), const void *data);
+EAPI void                      ecore_x_io_error_handler_set(void (*func)(void *data), const void *data);
+EAPI int                       ecore_x_error_request_get(void);
+EAPI int                       ecore_x_error_code_get(void);
+EAPI Ecore_X_ID                ecore_x_error_resource_id_get(void);
+
+EAPI void                      ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask);
+EAPI void                      ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask);
+
+EAPI Eina_Bool                 ecore_x_selection_notify_send(Ecore_X_Window requestor, Ecore_X_Atom selection, Ecore_X_Atom target, Ecore_X_Atom property, Ecore_X_Time time);
+EAPI Eina_Bool                 ecore_x_selection_primary_set(Ecore_X_Window w, const void *data, int size);
+EAPI Eina_Bool                 ecore_x_selection_primary_clear(void);
+EAPI Eina_Bool                 ecore_x_selection_secondary_set(Ecore_X_Window w, const void *data, int size);
+EAPI Eina_Bool                 ecore_x_selection_secondary_clear(void);
+EAPI Eina_Bool                 ecore_x_selection_xdnd_set(Ecore_X_Window w, const void *data, int size);
+EAPI Eina_Bool                 ecore_x_selection_xdnd_clear(void);
+EAPI Eina_Bool                 ecore_x_selection_clipboard_set(Ecore_X_Window w, const void *data, int size);
+EAPI Eina_Bool                 ecore_x_selection_clipboard_clear(void);
+EAPI void                      ecore_x_selection_primary_request(Ecore_X_Window w, const char *target);
+EAPI void                      ecore_x_selection_secondary_request(Ecore_X_Window w, const char *target);
+EAPI void                      ecore_x_selection_xdnd_request(Ecore_X_Window w, const char *target);
+EAPI void                      ecore_x_selection_clipboard_request(Ecore_X_Window w, const char *target);
+EAPI Eina_Bool                 ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret, int *len, Ecore_X_Atom *targprop, int *targsize);
+EAPI void                      ecore_x_selection_converter_add(char *target, Eina_Bool (*func)(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *, int *));
+EAPI void                      ecore_x_selection_converter_atom_add(Ecore_X_Atom target, Eina_Bool (*func)(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *tprop, int *tsize));
+EAPI void                      ecore_x_selection_converter_del(char *target);
+EAPI void                      ecore_x_selection_converter_atom_del(Ecore_X_Atom target);
+EAPI void                      ecore_x_selection_parser_add(const char *target, void *(*func)(const char *target, void *data, int size, int format));
+EAPI void                      ecore_x_selection_parser_del(const char *target);
+EAPI void                      ecore_x_selection_owner_set(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Time tm);
+EAPI Ecore_X_Window            ecore_x_selection_owner_get(Ecore_X_Atom atom);
+EAPI Eina_Bool                 ecore_x_selection_converter_text(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *targprop, int *s); /** @since 1.8 */
+
+EAPI void                      ecore_x_dnd_aware_set(Ecore_X_Window win, Eina_Bool on);
+EAPI int                       ecore_x_dnd_version_get(Ecore_X_Window win);
+EAPI Eina_Bool                 ecore_x_dnd_type_isset(Ecore_X_Window win, const char *type);
+EAPI void                      ecore_x_dnd_type_set(Ecore_X_Window win, const char *type, Eina_Bool on);
+EAPI void                      ecore_x_dnd_types_set(Ecore_X_Window win, const char **types, unsigned int num_types);
+EAPI void                      ecore_x_dnd_actions_set(Ecore_X_Window win, Ecore_X_Atom *actions, unsigned int num_actions);
+EAPI Eina_Bool                 ecore_x_dnd_begin(Ecore_X_Window source, unsigned char *data, int size);
+EAPI Eina_Bool                 ecore_x_dnd_drop(void);
+EAPI void                      ecore_x_dnd_send_status(Eina_Bool will_accept, Eina_Bool suppress, Ecore_X_Rectangle rectangle, Ecore_X_Atom action);
+EAPI void                      ecore_x_dnd_send_finished(void);
+EAPI void                      ecore_x_dnd_source_action_set(Ecore_X_Atom action);
+EAPI Ecore_X_Atom              ecore_x_dnd_source_action_get(void);
+EAPI void                      ecore_x_dnd_callback_pos_update_set(void (*cb)(void *, Ecore_X_Xdnd_Position *data), const void *data);
+
+EAPI Ecore_X_Window            ecore_x_window_new(Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window            ecore_x_window_override_new(Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI int                       ecore_x_window_argb_get(Ecore_X_Window win);
+EAPI Ecore_X_Window            ecore_x_window_manager_argb_new(Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window            ecore_x_window_argb_new(Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window            ecore_x_window_override_argb_new(Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI Ecore_X_Window            ecore_x_window_input_new(Ecore_X_Window parent, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_configure(Ecore_X_Window win, Ecore_X_Window_Configure_Mask mask, int x, int y, int w, int h, int border_width, Ecore_X_Window sibling, int stack_mode);
+EAPI void                      ecore_x_window_cursor_set(Ecore_X_Window win, Ecore_X_Cursor c);
+EAPI void                      ecore_x_window_free(Ecore_X_Window win);
+EAPI void                      ecore_x_window_ignore_set(Ecore_X_Window win, int ignore);
+EAPI Ecore_X_Window           *ecore_x_window_ignore_list(int *num);
+
+EAPI void                      ecore_x_window_delete_request_send(Ecore_X_Window win);
+EAPI void                      ecore_x_window_show(Ecore_X_Window win);
+EAPI void                      ecore_x_window_hide(Ecore_X_Window win);
+EAPI void                      ecore_x_window_move(Ecore_X_Window win, int x, int y);
+EAPI void                      ecore_x_window_resize(Ecore_X_Window win, int w, int h);
+EAPI void                      ecore_x_window_move_resize(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_focus(Ecore_X_Window win);
+EAPI void                      ecore_x_window_focus_at_time(Ecore_X_Window win, Ecore_X_Time t);
+EAPI Ecore_X_Window            ecore_x_window_focus_get(void);
+EAPI void                      ecore_x_window_raise(Ecore_X_Window win);
+EAPI void                      ecore_x_window_lower(Ecore_X_Window win);
+EAPI void                      ecore_x_window_reparent(Ecore_X_Window win, Ecore_X_Window new_parent, int x, int y);
+EAPI void                      ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h);
+EAPI void                      ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h);
+EAPI int                       ecore_x_window_border_width_get(Ecore_X_Window win);
+EAPI void                      ecore_x_window_border_width_set(Ecore_X_Window win, int width);
+EAPI int                       ecore_x_window_depth_get(Ecore_X_Window win);
+EAPI void                      ecore_x_window_cursor_show(Ecore_X_Window win, Eina_Bool show);
+EAPI void                      ecore_x_window_defaults_set(Ecore_X_Window win);
+EAPI int                       ecore_x_window_visible_get(Ecore_X_Window win);
+EAPI Ecore_X_Window            ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base, int x, int y, Ecore_X_Window *skip, int skip_num);
+EAPI Ecore_X_Window            ecore_x_window_shadow_parent_get(Ecore_X_Window root, Ecore_X_Window win);
+EAPI void                      ecore_x_window_shadow_tree_flush(void);
+EAPI Ecore_X_Window            ecore_x_window_root_get(Ecore_X_Window win);
+EAPI Ecore_X_Window            ecore_x_window_at_xy_get(int x, int y);
+EAPI Ecore_X_Window            ecore_x_window_at_xy_with_skip_get(int x, int y, Ecore_X_Window *skip, int skip_num);
+EAPI Ecore_X_Window            ecore_x_window_at_xy_begin_get(Ecore_X_Window begin, int x, int y);
+EAPI Ecore_X_Window            ecore_x_window_parent_get(Ecore_X_Window win);
+
+EAPI void                      ecore_x_window_background_color_set(Ecore_X_Window win, unsigned short r, unsigned short g, unsigned short b);
+EAPI void                      ecore_x_window_gravity_set(Ecore_X_Window win, Ecore_X_Gravity grav);
+EAPI void                      ecore_x_window_pixel_gravity_set(Ecore_X_Window win, Ecore_X_Gravity grav);
+EAPI void                      ecore_x_window_pixmap_set(Ecore_X_Window win, Ecore_X_Pixmap pmap);
+EAPI void                      ecore_x_window_area_clear(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_area_expose(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_override_set(Ecore_X_Window win, Eina_Bool override);
+
+EAPI void                      ecore_x_window_prop_card32_set(Ecore_X_Window win, Ecore_X_Atom atom, unsigned int *val, unsigned int num);
+EAPI int                       ecore_x_window_prop_card32_get(Ecore_X_Window win, Ecore_X_Atom atom, unsigned int *val, unsigned int len);
+EAPI int                       ecore_x_window_prop_card32_list_get(Ecore_X_Window win, Ecore_X_Atom atom, unsigned int **plst);
+
+EAPI void                      ecore_x_window_prop_xid_set(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom type, Ecore_X_ID *lst, unsigned int num);
+EAPI int                       ecore_x_window_prop_xid_get(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom type, Ecore_X_ID *lst, unsigned int len);
+EAPI int                       ecore_x_window_prop_xid_list_get(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom type, Ecore_X_ID **plst);
+EAPI void                      ecore_x_window_prop_xid_list_change(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom type, Ecore_X_ID item, int op);
+EAPI void                      ecore_x_window_prop_atom_set(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom *val, unsigned int num);
+EAPI int                       ecore_x_window_prop_atom_get(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom *val, unsigned int len);
+EAPI int                       ecore_x_window_prop_atom_list_get(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom **plst);
+EAPI void                      ecore_x_window_prop_atom_list_change(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Atom item, int op);
+EAPI void                      ecore_x_window_prop_window_set(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Window *val, unsigned int num);
+EAPI int                       ecore_x_window_prop_window_get(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Window *val, unsigned int len);
+EAPI int                       ecore_x_window_prop_window_list_get(Ecore_X_Window win, Ecore_X_Atom atom, Ecore_X_Window **plst);
+
+EAPI Ecore_X_Atom              ecore_x_window_prop_any_type(void);
+EAPI void                      ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Atom format, int size, void *data, int number);
+EAPI int                       ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecore_X_Atom type, int size, unsigned char **data, int *num);
+EAPI void                      ecore_x_window_prop_property_del(Ecore_X_Window win, Ecore_X_Atom property);
+EAPI Ecore_X_Atom             *ecore_x_window_prop_list(Ecore_X_Window win, int *num_ret);
+EAPI void                      ecore_x_window_prop_string_set(Ecore_X_Window win, Ecore_X_Atom type, const char *str);
+EAPI char                     *ecore_x_window_prop_string_get(Ecore_X_Window win, Ecore_X_Atom type);
+EAPI Eina_Bool                 ecore_x_window_prop_protocol_isset(Ecore_X_Window win, Ecore_X_WM_Protocol protocol);
+EAPI Ecore_X_WM_Protocol      *ecore_x_window_prop_protocol_list_get(Ecore_X_Window win, int *num_ret);
+
+EAPI void                      ecore_x_window_shape_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask);
+EAPI void                      ecore_x_window_shape_window_set(Ecore_X_Window win, Ecore_X_Window shape_win);
+EAPI void                      ecore_x_window_shape_window_set_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y);
+EAPI void                      ecore_x_window_shape_rectangle_set(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_rectangles_set(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num);
+EAPI void                      ecore_x_window_shape_input_rectangle_set(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_input_rectangles_set(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num);
+EAPI void                      ecore_x_window_shape_input_rectangle_add(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_rectangle_subtract(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_input_rectangle_subtract(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_input_window_set_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y);
+EAPI void                      ecore_x_window_shape_input_window_set(Ecore_X_Window win, Ecore_X_Window shape_win);
+EAPI void                      ecore_x_window_shape_window_add(Ecore_X_Window win, Ecore_X_Window shape_win);
+EAPI void                      ecore_x_window_shape_window_add_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y);
+EAPI void                      ecore_x_window_shape_input_window_add_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y);
+EAPI void                      ecore_x_window_shape_rectangle_add(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_rectangle_clip(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_input_rectangle_clip(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_window_shape_rectangles_add(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num);
+EAPI void                      ecore_x_window_shape_input_rectangles_add(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num);
+EAPI Ecore_X_Rectangle        *ecore_x_window_shape_rectangles_get(Ecore_X_Window win, int *num_ret);
+EAPI Ecore_X_Rectangle        *ecore_x_window_shape_input_rectangles_get(Ecore_X_Window win, int *num_ret);
+EAPI void                      ecore_x_window_shape_events_select(Ecore_X_Window win, Eina_Bool on);
+EAPI void                      ecore_x_window_shape_input_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask);
+
+EAPI Ecore_X_Pixmap            ecore_x_pixmap_new(Ecore_X_Window win, int w, int h, int dep);
+EAPI void                      ecore_x_pixmap_free(Ecore_X_Pixmap pmap);
+EAPI void                      ecore_x_pixmap_paste(Ecore_X_Pixmap pmap, Ecore_X_Drawable dest, Ecore_X_GC gc, int sx, int sy, int w, int h, int dx, int dy);
+EAPI void                      ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h);
+EAPI int                       ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap);
+
+EAPI Ecore_X_GC                ecore_x_gc_new(Ecore_X_Drawable draw, Ecore_X_GC_Value_Mask value_mask, const unsigned int *value_list);
+EAPI void                      ecore_x_gc_free(Ecore_X_GC gc);
+EAPI void                      ecore_x_gc_foreground_set(Ecore_X_GC gc, unsigned long foreground);
+EAPI void                      ecore_x_gc_background_set(Ecore_X_GC gc, unsigned long background);
+
+EAPI Eina_Bool                 ecore_x_client_message32_send(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Event_Mask mask, long d0, long d1, long d2, long d3, long d4);
+EAPI Eina_Bool                 ecore_x_client_message8_send(Ecore_X_Window win, Ecore_X_Atom type, const void *data, int len);
+EAPI Eina_Bool                 ecore_x_mouse_move_send(Ecore_X_Window win, int x, int y);
+EAPI Eina_Bool                 ecore_x_mouse_down_send(Ecore_X_Window win, int x, int y, int b);
+EAPI Eina_Bool                 ecore_x_mouse_up_send(Ecore_X_Window win, int x, int y, int b);
+EAPI Eina_Bool                 ecore_x_mouse_in_send(Ecore_X_Window win, int x, int y);
+EAPI Eina_Bool                 ecore_x_mouse_out_send(Ecore_X_Window win, int x, int y);
+
+EAPI void                      ecore_x_drawable_geometry_get(Ecore_X_Drawable d, int *x, int *y, int *w, int *h);
+EAPI int                       ecore_x_drawable_border_width_get(Ecore_X_Drawable d);
+EAPI int                       ecore_x_drawable_depth_get(Ecore_X_Drawable d);
+EAPI void                      ecore_x_drawable_rectangle_fill(Ecore_X_Drawable d, Ecore_X_GC gc, int x, int y, int width, int height);
+
+EAPI Eina_Bool                 ecore_x_cursor_color_supported_get(void);
+EAPI Ecore_X_Cursor            ecore_x_cursor_new(Ecore_X_Window win, int *pixels, int w, int h, int hot_x, int hot_y);
+EAPI void                      ecore_x_cursor_free(Ecore_X_Cursor c);
+EAPI Ecore_X_Cursor            ecore_x_cursor_shape_get(int shape);
+EAPI void                      ecore_x_cursor_size_set(int size);
+EAPI int                       ecore_x_cursor_size_get(void);
 
 /* FIXME: these funcs need categorising */
-EAPI Ecore_X_Window *ecore_x_window_root_list(int *num_ret);
-EAPI Ecore_X_Window  ecore_x_window_root_first_get(void);
-EAPI int             ecore_x_window_manage(Ecore_X_Window win);
-EAPI void            ecore_x_window_container_manage(Ecore_X_Window win);
-EAPI void            ecore_x_window_client_manage(Ecore_X_Window win);
-EAPI void            ecore_x_window_sniff(Ecore_X_Window win);
-EAPI void            ecore_x_window_client_sniff(Ecore_X_Window win);
-EAPI void            ecore_x_atom_get_prefetch(const char *name);
-EAPI void            ecore_x_atom_get_fetch(void);
-EAPI Ecore_X_Atom    ecore_x_atom_get(const char *name);
-EAPI void            ecore_x_atoms_get(const char **names, int num, Ecore_X_Atom *atoms);
-       
-
-
-EAPI void            ecore_x_icccm_init(void);
-EAPI void            ecore_x_icccm_state_set(Ecore_X_Window win, Ecore_X_Window_State_Hint state);
+EAPI Ecore_X_Window           *ecore_x_window_root_list(int *num_ret);
+EAPI Ecore_X_Window            ecore_x_window_root_first_get(void);
+EAPI Eina_Bool                 ecore_x_window_manage(Ecore_X_Window win);
+EAPI void                      ecore_x_window_container_manage(Ecore_X_Window win);
+EAPI void                      ecore_x_window_client_manage(Ecore_X_Window win);
+EAPI void                      ecore_x_window_sniff(Ecore_X_Window win);
+EAPI void                      ecore_x_window_client_sniff(Ecore_X_Window win);
+
+EAPI Ecore_X_Atom              ecore_x_atom_get(const char *name);
+EAPI void                      ecore_x_atoms_get(const char **names, int num, Ecore_X_Atom *atoms);
+EAPI char                     *ecore_x_atom_name_get(Ecore_X_Atom atom);
+
+EAPI void                      ecore_x_icccm_init(void);
+EAPI void                      ecore_x_icccm_state_set(Ecore_X_Window win, Ecore_X_Window_State_Hint state);
 EAPI Ecore_X_Window_State_Hint ecore_x_icccm_state_get(Ecore_X_Window win);
-EAPI void            ecore_x_icccm_delete_window_send(Ecore_X_Window win, Ecore_X_Time t);
-EAPI void            ecore_x_icccm_take_focus_send(Ecore_X_Window win, Ecore_X_Time t);
-EAPI void            ecore_x_icccm_save_yourself_send(Ecore_X_Window win, Ecore_X_Time t);
-EAPI void            ecore_x_icccm_move_resize_send(Ecore_X_Window win, int x, int y, int w, int h);
-EAPI void  ecore_x_icccm_hints_set(Ecore_X_Window win,
-                                  int accepts_focus,
-                                  Ecore_X_Window_State_Hint initial_state,
-                                  Ecore_X_Pixmap icon_pixmap,
-                                  Ecore_X_Pixmap icon_mask,
-                                  Ecore_X_Window icon_window,
-                                  Ecore_X_Window window_group,
-                                  int is_urgent);
-EAPI int  ecore_x_icccm_hints_get(Ecore_X_Window win,
-                                 int *accepts_focus,
-                                 Ecore_X_Window_State_Hint *initial_state,
-                                 Ecore_X_Pixmap *icon_pixmap,
-                                 Ecore_X_Pixmap *icon_mask,
-                                 Ecore_X_Window *icon_window,
-                                 Ecore_X_Window *window_group,
-                                 int *is_urgent);
-EAPI void  ecore_x_icccm_size_pos_hints_set(Ecore_X_Window win,
-                                           int request_pos,
-                                           Ecore_X_Gravity gravity,
-                                           int min_w, int min_h,
-                                           int max_w, int max_h,
-                                           int base_w, int base_h,
-                                           int step_x, int step_y,
-                                           double min_aspect,
-                                           double max_aspect);
-EAPI int   ecore_x_icccm_size_pos_hints_get(Ecore_X_Window win,
-                                           int *request_pos,
-                                           Ecore_X_Gravity *gravity,
-                                           int *min_w, int *min_h,
-                                           int *max_w, int *max_h,
-                                           int *base_w, int *base_h,
-                                           int *step_x, int *step_y,
-                                           double *min_aspect,
-                                           double *max_aspect);
-EAPI void  ecore_x_icccm_title_set(Ecore_X_Window win, const char *t);
-EAPI char *ecore_x_icccm_title_get(Ecore_X_Window win);
-EAPI void  ecore_x_icccm_protocol_set(Ecore_X_Window win,
-                                     Ecore_X_WM_Protocol protocol,
-                                     int on);
-EAPI int   ecore_x_icccm_protocol_isset(Ecore_X_Window win,
-                                       Ecore_X_WM_Protocol protocol);
-EAPI void  ecore_x_icccm_name_class_set(Ecore_X_Window win,
-                                       const char *n,
-                                       const char *c);
-EAPI void  ecore_x_icccm_name_class_get(Ecore_X_Window win,
-                                       char **n,
-                                       char **c);
-EAPI char *ecore_x_icccm_client_machine_get(Ecore_X_Window win);
-EAPI void  ecore_x_icccm_command_set(Ecore_X_Window win, int argc, char **argv);
-EAPI void  ecore_x_icccm_command_get(Ecore_X_Window win, int *argc, char ***argv);
-EAPI char *ecore_x_icccm_icon_name_get(Ecore_X_Window win);
-EAPI void  ecore_x_icccm_icon_name_set(Ecore_X_Window win, const char *t);
-EAPI void  ecore_x_icccm_colormap_window_set(Ecore_X_Window win, Ecore_X_Window subwin);
-EAPI void  ecore_x_icccm_colormap_window_unset(Ecore_X_Window win, Ecore_X_Window subwin);
-EAPI void  ecore_x_icccm_transient_for_set(Ecore_X_Window win, Ecore_X_Window forwin);
-EAPI void  ecore_x_icccm_transient_for_unset(Ecore_X_Window win);
-EAPI Ecore_X_Window ecore_x_icccm_transient_for_get(Ecore_X_Window win);
-EAPI void  ecore_x_icccm_window_role_set(Ecore_X_Window win, const char *role);
-EAPI char *ecore_x_icccm_window_role_get(Ecore_X_Window win);
-EAPI void  ecore_x_icccm_client_leader_set(Ecore_X_Window win, Ecore_X_Window l);
-EAPI Ecore_X_Window ecore_x_icccm_client_leader_get(Ecore_X_Window win);
-EAPI void ecore_x_icccm_iconic_request_send(Ecore_X_Window win, Ecore_X_Window root);
-
+EAPI void                      ecore_x_icccm_delete_window_send(Ecore_X_Window win, Ecore_X_Time t);
+EAPI void                      ecore_x_icccm_take_focus_send(Ecore_X_Window win, Ecore_X_Time t);
+EAPI void                      ecore_x_icccm_save_yourself_send(Ecore_X_Window win, Ecore_X_Time t);
+EAPI void                      ecore_x_icccm_move_resize_send(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI void                      ecore_x_icccm_hints_set(Ecore_X_Window win, Eina_Bool accepts_focus, Ecore_X_Window_State_Hint initial_state, Ecore_X_Pixmap icon_pixmap, Ecore_X_Pixmap icon_mask, Ecore_X_Window icon_window, Ecore_X_Window window_group, Eina_Bool is_urgent);
+EAPI Eina_Bool                 ecore_x_icccm_hints_get(Ecore_X_Window win, Eina_Bool *accepts_focus, Ecore_X_Window_State_Hint *initial_state, Ecore_X_Pixmap *icon_pixmap, Ecore_X_Pixmap *icon_mask, Ecore_X_Window *icon_window, Ecore_X_Window *window_group, Eina_Bool *is_urgent);
+EAPI void                      ecore_x_icccm_size_pos_hints_set(Ecore_X_Window win, Eina_Bool request_pos, Ecore_X_Gravity gravity, int min_w, int min_h, int max_w, int max_h, int base_w, int base_h, int step_x, int step_y, double min_aspect, double max_aspect);
+EAPI Eina_Bool                 ecore_x_icccm_size_pos_hints_get(Ecore_X_Window win, Eina_Bool *request_pos, Ecore_X_Gravity *gravity, int *min_w, int *min_h, int *max_w, int *max_h, int *base_w, int *base_h, int *step_x, int *step_y, double *min_aspect, double *max_aspect);
+EAPI void                      ecore_x_icccm_title_set(Ecore_X_Window win, const char *t);
+EAPI char                     *ecore_x_icccm_title_get(Ecore_X_Window win);
+EAPI void                      ecore_x_icccm_protocol_atoms_set(Ecore_X_Window win, Ecore_X_Atom *protos, int num);
+EAPI void                      ecore_x_icccm_protocol_set(Ecore_X_Window win, Ecore_X_WM_Protocol protocol, Eina_Bool on);
+EAPI Eina_Bool                 ecore_x_icccm_protocol_isset(Ecore_X_Window win, Ecore_X_WM_Protocol protocol);
+EAPI void                      ecore_x_icccm_name_class_set(Ecore_X_Window win, const char *n, const char *c);
+EAPI void                      ecore_x_icccm_name_class_get(Ecore_X_Window win, char **n, char **c);
+EAPI char                     *ecore_x_icccm_client_machine_get(Ecore_X_Window win);
+EAPI void                      ecore_x_icccm_command_set(Ecore_X_Window win, int argc, char **argv);
+EAPI void                      ecore_x_icccm_command_get(Ecore_X_Window win, int *argc, char ***argv);
+EAPI char                     *ecore_x_icccm_icon_name_get(Ecore_X_Window win);
+EAPI void                      ecore_x_icccm_icon_name_set(Ecore_X_Window win, const char *t);
+EAPI void                      ecore_x_icccm_colormap_window_set(Ecore_X_Window win, Ecore_X_Window subwin);
+EAPI void                      ecore_x_icccm_colormap_window_unset(Ecore_X_Window win, Ecore_X_Window subwin);
+EAPI void                      ecore_x_icccm_transient_for_set(Ecore_X_Window win, Ecore_X_Window forwin);
+EAPI void                      ecore_x_icccm_transient_for_unset(Ecore_X_Window win);
+EAPI Ecore_X_Window            ecore_x_icccm_transient_for_get(Ecore_X_Window win);
+EAPI void                      ecore_x_icccm_window_role_set(Ecore_X_Window win, const char *role);
+EAPI char                     *ecore_x_icccm_window_role_get(Ecore_X_Window win);
+EAPI void                      ecore_x_icccm_client_leader_set(Ecore_X_Window win, Ecore_X_Window l);
+EAPI Ecore_X_Window            ecore_x_icccm_client_leader_get(Ecore_X_Window win);
+EAPI void                      ecore_x_icccm_iconic_request_send(Ecore_X_Window win, Ecore_X_Window root);
 
 typedef enum _Ecore_X_MWM_Hint_Func
 {
@@ -1389,342 +1529,879 @@ typedef enum _Ecore_X_MWM_Hint_Input
    ECORE_X_MWM_HINT_INPUT_MODELESS = 0,
    ECORE_X_MWM_HINT_INPUT_PRIMARY_APPLICATION_MODAL = 1,
    ECORE_X_MWM_HINT_INPUT_SYSTEM_MODAL = 2,
-   ECORE_X_MWM_HINT_INPUT_FULL_APPLICATION_MODAL = 3,
+   ECORE_X_MWM_HINT_INPUT_FULL_APPLICATION_MODAL = 3
 } Ecore_X_MWM_Hint_Input;
 
-EAPI void ecore_x_mwm_hints_get_prefetch(Ecore_X_Window window);
-EAPI void ecore_x_mwm_hints_get_fetch(void);
-EAPI int  ecore_x_mwm_hints_get(Ecore_X_Window win,
-                                Ecore_X_MWM_Hint_Func *fhint,
-                                Ecore_X_MWM_Hint_Decor *dhint,
-                                Ecore_X_MWM_Hint_Input *ihint);
-EAPI void ecore_x_mwm_borderless_set(Ecore_X_Window win, int borderless);
+EAPI Eina_Bool                       ecore_x_mwm_hints_get(Ecore_X_Window win, Ecore_X_MWM_Hint_Func *fhint, Ecore_X_MWM_Hint_Decor *dhint, Ecore_X_MWM_Hint_Input *ihint);
+EAPI void                            ecore_x_mwm_borderless_set(Ecore_X_Window win, Eina_Bool borderless);
 
 /* netwm */
-EAPI void                ecore_x_netwm_init(void);
-EAPI void                ecore_x_netwm_shutdown(void);
-EAPI void                ecore_x_netwm_wm_identify(Ecore_X_Window root, Ecore_X_Window check, const char *wm_name);
-EAPI void                ecore_x_netwm_supported_set(Ecore_X_Window root, Ecore_X_Atom *supported, int num);
-EAPI void                ecore_x_netwm_supported_get_prefetch(Ecore_X_Window root);
-EAPI void                ecore_x_netwm_supported_get_fetch(void);
-EAPI int                 ecore_x_netwm_supported_get(Ecore_X_Window root, Ecore_X_Atom **supported, int *num);
-EAPI void                ecore_x_netwm_desk_count_set(Ecore_X_Window root, unsigned int n_desks);
-EAPI void                ecore_x_netwm_desk_roots_set(Ecore_X_Window root, Ecore_X_Window *vroots, unsigned int n_desks);
-EAPI void                ecore_x_netwm_desk_names_set(Ecore_X_Window root, const char **names, unsigned int n_desks);
-EAPI void                ecore_x_netwm_desk_size_set(Ecore_X_Window root, unsigned int width, unsigned int height);
-EAPI void                ecore_x_netwm_desk_workareas_set(Ecore_X_Window root, unsigned int *areas, unsigned int n_desks);
-EAPI void                ecore_x_netwm_desk_current_set(Ecore_X_Window root, unsigned int desk);
-EAPI void                ecore_x_netwm_desk_viewports_set(Ecore_X_Window root, unsigned int *origins, unsigned int n_desks);
-EAPI void                ecore_x_netwm_desk_layout_set(Ecore_X_Window root, int orientation, int columns, int rows, int starting_corner);
-EAPI void                ecore_x_netwm_showing_desktop_set(Ecore_X_Window root, int on);
-EAPI void                ecore_x_netwm_client_list_set(Ecore_X_Window root, Ecore_X_Window *p_clients, unsigned int n_clients);
-EAPI void                ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root, Ecore_X_Window *p_clients, unsigned int n_clients);
-EAPI void                ecore_x_netwm_client_active_set(Ecore_X_Window root, Ecore_X_Window win);
-EAPI void                ecore_x_netwm_client_active_request(Ecore_X_Window root, Ecore_X_Window win, int type, Ecore_X_Window current_win);
-EAPI void                ecore_x_netwm_name_set(Ecore_X_Window win, const char *name);
-EAPI void                ecore_x_netwm_name_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_name_get_fetch(void);
-EAPI int                 ecore_x_netwm_name_get(Ecore_X_Window win, char **name);
-EAPI void                ecore_x_netwm_startup_id_set(Ecore_X_Window win, const char *id);
-EAPI void                ecore_x_netwm_startup_id_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_startup_id_get_fetch(void);
-EAPI int                 ecore_x_netwm_startup_id_get(Ecore_X_Window win, char **id);
-EAPI void                ecore_x_netwm_visible_name_set(Ecore_X_Window win, const char *name);
-EAPI void                ecore_x_netwm_visible_name_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_visible_name_get_fetch(void);
-EAPI int                 ecore_x_netwm_visible_name_get(Ecore_X_Window win, char **name);
-EAPI void                ecore_x_netwm_icon_name_set(Ecore_X_Window win, const char *name);
-EAPI void                ecore_x_netwm_icon_name_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_icon_name_get_fetch(void);
-EAPI int                 ecore_x_netwm_icon_name_get(Ecore_X_Window win, char **name);
-EAPI void                ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win, const char *name);
-EAPI void                ecore_x_netwm_visible_icon_name_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_visible_icon_name_get_fetch(void);
-EAPI int                 ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win, char **name);
-EAPI void                ecore_x_netwm_desktop_set(Ecore_X_Window win, unsigned int desk);
-EAPI void                ecore_x_netwm_desktop_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_desktop_get_fetch(void);
-EAPI int                 ecore_x_netwm_desktop_get(Ecore_X_Window win, unsigned int *desk);
-EAPI void                ecore_x_netwm_strut_set(Ecore_X_Window win, int left, int right, int top, int bottom);
-EAPI void                ecore_x_netwm_strut_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_strut_get_fetch(void);
-EAPI int                 ecore_x_netwm_strut_get(Ecore_X_Window win, int *left, int *right, int *top, int *bottom);
-EAPI void                ecore_x_netwm_strut_partial_set(Ecore_X_Window win, int left, int right, int top, int bottom, int left_start_y, int left_end_y, int right_start_y, int right_end_y, int top_start_x, int top_end_x, int bottom_start_x, int bottom_end_x);
-EAPI void                ecore_x_netwm_strut_partial_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_strut_partial_get_fetch(void);
-EAPI int                 ecore_x_netwm_strut_partial_get(Ecore_X_Window win, int *left, int *right, int *top, int *bottom, int *left_start_y, int *left_end_y, int *right_start_y, int *right_end_y, int *top_start_x, int *top_end_x, int *bottom_start_x, int *bottom_end_x);
-EAPI void                ecore_x_netwm_icons_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_icons_get_fetch(void);
-EAPI int                 ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num);
-EAPI void                ecore_x_netwm_icon_geometry_set(Ecore_X_Window win, int x, int y, int width, int height);
-EAPI void                ecore_x_netwm_icon_geometry_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_icon_geometry_get_fetch(void);
-EAPI int                 ecore_x_netwm_icon_geometry_get(Ecore_X_Window win, int *x, int *y, int *width, int *height);
-EAPI void                ecore_x_netwm_pid_set(Ecore_X_Window win, int pid);
-EAPI void                ecore_x_netwm_pid_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_pid_get_fetch(void);
-EAPI int                 ecore_x_netwm_pid_get(Ecore_X_Window win, int *pid);
-EAPI void                ecore_x_netwm_handled_icons_set(Ecore_X_Window win);
-EAPI void                ecore_x_netwm_handled_icons_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_handled_icons_get_fetch(void);
-EAPI int                 ecore_x_netwm_handled_icons_get(Ecore_X_Window win);
-EAPI void                ecore_x_netwm_user_time_set(Ecore_X_Window win, unsigned int time);
-EAPI void                ecore_x_netwm_user_time_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_user_time_get_fetch(void);
-EAPI int                 ecore_x_netwm_user_time_get(Ecore_X_Window win, unsigned int *time);
-EAPI void                ecore_x_netwm_window_state_set(Ecore_X_Window win, Ecore_X_Window_State *state, unsigned int num);
-EAPI void                ecore_x_netwm_window_state_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_window_state_get_fetch(void);
-EAPI int                 ecore_x_netwm_window_state_get(Ecore_X_Window win, Ecore_X_Window_State **state, unsigned int *num);
-EAPI void                ecore_x_netwm_window_type_set(Ecore_X_Window win, Ecore_X_Window_Type type);
-EAPI void                ecore_x_netwm_window_type_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_window_type_get_fetch(void);
-EAPI int                 ecore_x_netwm_window_type_get(Ecore_X_Window win, Ecore_X_Window_Type *type);
-EAPI int                 ecore_x_netwm_window_types_get(Ecore_X_Window win, Ecore_X_Window_Type **types);
-EAPI int                 ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action);
-EAPI void                ecore_x_netwm_allowed_action_set(Ecore_X_Window win, Ecore_X_Action *action, unsigned int num);
-EAPI void                ecore_x_netwm_allowed_action_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_allowed_action_get_fetch(void);
-EAPI int                 ecore_x_netwm_allowed_action_get(Ecore_X_Window win, Ecore_X_Action **action, unsigned int *num);
-EAPI void                ecore_x_netwm_opacity_set(Ecore_X_Window win, unsigned int opacity);
-EAPI void                ecore_x_netwm_opacity_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_opacity_get_fetch(void);
-EAPI int                 ecore_x_netwm_opacity_get(Ecore_X_Window win, unsigned int *opacity);
-EAPI void                ecore_x_netwm_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb);
-EAPI void                ecore_x_netwm_frame_size_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_frame_size_get_fetch(void);
-EAPI int                 ecore_x_netwm_frame_size_get(Ecore_X_Window win, int *fl, int *fr, int *ft, int *fb);
-EAPI void                ecore_x_netwm_sync_counter_get_prefetch(Ecore_X_Window window);
-EAPI void                ecore_x_netwm_sync_counter_get_fetch(void);
-EAPI int                 ecore_x_netwm_sync_counter_get(Ecore_X_Window win, Ecore_X_Sync_Counter *counter);
-EAPI void                ecore_x_netwm_ping_send(Ecore_X_Window win);
-EAPI void                ecore_x_netwm_sync_request_send(Ecore_X_Window win, unsigned int serial);
-EAPI void                ecore_x_netwm_state_request_send(Ecore_X_Window win, Ecore_X_Window root, Ecore_X_Window_State s1, Ecore_X_Window_State s2, int set);
-EAPI void                ecore_x_netwm_desktop_request_send(Ecore_X_Window win, Ecore_X_Window root, unsigned int desktop);
-
-
-
-
-EAPI void                ecore_x_e_init(void);
-EAPI void                ecore_x_e_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb);
-EAPI void                ecore_x_e_virtual_keyboard_set(Ecore_X_Window win, int is_keyboard);
-EAPI int                 ecore_x_e_virtual_keyboard_get(Ecore_X_Window win);
-EAPI void                ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window win, Ecore_X_Virtual_Keyboard_State state);
-EAPI Ecore_X_Virtual_Keyboard_State ecore_x_e_virtual_keyboard_state_get(Ecore_X_Window win);
-EAPI void                ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window win, Ecore_X_Virtual_Keyboard_State state);
+EAPI void                            ecore_x_netwm_init(void);
+EAPI void                            ecore_x_netwm_shutdown(void);
+EAPI void                            ecore_x_netwm_wm_identify(Ecore_X_Window root, Ecore_X_Window check, const char *wm_name);
+EAPI void                            ecore_x_netwm_supported_set(Ecore_X_Window root, Ecore_X_Atom *supported, int num);
+EAPI Eina_Bool                       ecore_x_netwm_supported_get(Ecore_X_Window root, Ecore_X_Atom **supported, int *num);
+EAPI void                            ecore_x_netwm_desk_count_set(Ecore_X_Window root, unsigned int n_desks);
+EAPI void                            ecore_x_netwm_desk_roots_set(Ecore_X_Window root, Ecore_X_Window *vroots, unsigned int n_desks);
+EAPI void                            ecore_x_netwm_desk_names_set(Ecore_X_Window root, const char **names, unsigned int n_desks);
+EAPI void                            ecore_x_netwm_desk_size_set(Ecore_X_Window root, unsigned int width, unsigned int height);
+EAPI void                            ecore_x_netwm_desk_workareas_set(Ecore_X_Window root, unsigned int *areas, unsigned int n_desks);
+EAPI unsigned int                   *ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks);
+EAPI void                            ecore_x_netwm_desk_current_set(Ecore_X_Window root, unsigned int desk);
+EAPI void                            ecore_x_netwm_desk_viewports_set(Ecore_X_Window root, unsigned int *origins, unsigned int n_desks);
+EAPI void                            ecore_x_netwm_desk_layout_set(Ecore_X_Window root, int orientation, int columns, int rows, int starting_corner);
+EAPI void                            ecore_x_netwm_showing_desktop_set(Ecore_X_Window root, Eina_Bool on);
+EAPI void                            ecore_x_netwm_client_list_set(Ecore_X_Window root, Ecore_X_Window *p_clients, unsigned int n_clients);
+EAPI void                            ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root, Ecore_X_Window *p_clients, unsigned int n_clients);
+EAPI void                            ecore_x_netwm_client_active_set(Ecore_X_Window root, Ecore_X_Window win);
+EAPI void                            ecore_x_netwm_client_active_request(Ecore_X_Window root, Ecore_X_Window win, int type, Ecore_X_Window current_win);
+EAPI void                            ecore_x_netwm_name_set(Ecore_X_Window win, const char *name);
+EAPI int                             ecore_x_netwm_name_get(Ecore_X_Window win, char **name);
+EAPI void                            ecore_x_netwm_startup_id_set(Ecore_X_Window win, const char *id);
+EAPI int                             ecore_x_netwm_startup_id_get(Ecore_X_Window win, char **id);
+EAPI void                            ecore_x_netwm_visible_name_set(Ecore_X_Window win, const char *name);
+EAPI int                             ecore_x_netwm_visible_name_get(Ecore_X_Window win, char **name);
+EAPI void                            ecore_x_netwm_icon_name_set(Ecore_X_Window win, const char *name);
+EAPI int                             ecore_x_netwm_icon_name_get(Ecore_X_Window win, char **name);
+EAPI void                            ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win, const char *name);
+EAPI int                             ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win, char **name);
+EAPI void                            ecore_x_netwm_desktop_set(Ecore_X_Window win, unsigned int desk);
+EAPI Eina_Bool                       ecore_x_netwm_desktop_get(Ecore_X_Window win, unsigned int *desk);
+EAPI void                            ecore_x_netwm_strut_set(Ecore_X_Window win, int left, int right, int top, int bottom);
+EAPI Eina_Bool                       ecore_x_netwm_strut_get(Ecore_X_Window win, int *left, int *right, int *top, int *bottom);
+EAPI void                            ecore_x_netwm_strut_partial_set(Ecore_X_Window win, int left, int right, int top, int bottom, int left_start_y, int left_end_y, int right_start_y, int right_end_y, int top_start_x, int top_end_x, int bottom_start_x, int bottom_end_x);
+EAPI Eina_Bool                       ecore_x_netwm_strut_partial_get(Ecore_X_Window win, int *left, int *right, int *top, int *bottom, int *left_start_y, int *left_end_y, int *right_start_y, int *right_end_y, int *top_start_x, int *top_end_x, int *bottom_start_x, int *bottom_end_x);
+
+EAPI void                            ecore_x_netwm_icons_set(Ecore_X_Window win, Ecore_X_Icon *icon, int num);
+
+EAPI Eina_Bool                       ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num);
+EAPI void                            ecore_x_netwm_icon_geometry_set(Ecore_X_Window win, int x, int y, int width, int height);
+EAPI Eina_Bool                       ecore_x_netwm_icon_geometry_get(Ecore_X_Window win, int *x, int *y, int *width, int *height);
+EAPI void                            ecore_x_netwm_pid_set(Ecore_X_Window win, int pid);
+EAPI Eina_Bool                       ecore_x_netwm_pid_get(Ecore_X_Window win, int *pid);
+EAPI void                            ecore_x_netwm_handled_icons_set(Ecore_X_Window win);
+EAPI Eina_Bool                       ecore_x_netwm_handled_icons_get(Ecore_X_Window win);
+EAPI void                            ecore_x_netwm_user_time_set(Ecore_X_Window win, unsigned int time);
+EAPI Eina_Bool                       ecore_x_netwm_user_time_get(Ecore_X_Window win, unsigned int *time);
+EAPI void                            ecore_x_netwm_window_state_set(Ecore_X_Window win, Ecore_X_Window_State *state, unsigned int num);
+EAPI Eina_Bool                       ecore_x_netwm_window_state_get(Ecore_X_Window win, Ecore_X_Window_State **state, unsigned int *num);
+EAPI void                            ecore_x_netwm_window_type_set(Ecore_X_Window win, Ecore_X_Window_Type type);
+EAPI Eina_Bool                       ecore_x_netwm_window_type_get(Ecore_X_Window win, Ecore_X_Window_Type *type);
+EAPI int                             ecore_x_netwm_window_types_get(Ecore_X_Window win, Ecore_X_Window_Type **types);
+EAPI Eina_Bool                       ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action);
+EAPI void                            ecore_x_netwm_allowed_action_set(Ecore_X_Window win, Ecore_X_Action *action, unsigned int num);
+EAPI Eina_Bool                       ecore_x_netwm_allowed_action_get(Ecore_X_Window win, Ecore_X_Action **action, unsigned int *num);
+EAPI void                            ecore_x_netwm_opacity_set(Ecore_X_Window win, unsigned int opacity);
+EAPI Eina_Bool                       ecore_x_netwm_opacity_get(Ecore_X_Window win, unsigned int *opacity);
+EAPI void                            ecore_x_netwm_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb);
+EAPI Eina_Bool                       ecore_x_netwm_frame_size_get(Ecore_X_Window win, int *fl, int *fr, int *ft, int *fb);
+EAPI Eina_Bool                       ecore_x_netwm_sync_counter_get(Ecore_X_Window win, Ecore_X_Sync_Counter *counter);
+EAPI void                            ecore_x_netwm_ping_send(Ecore_X_Window win);
+EAPI void                            ecore_x_netwm_sync_request_send(Ecore_X_Window win, unsigned int serial);
+EAPI void                            ecore_x_netwm_state_request_send(Ecore_X_Window win, Ecore_X_Window root, Ecore_X_Window_State s1, Ecore_X_Window_State s2, Eina_Bool set);
+EAPI void                            ecore_x_netwm_desktop_request_send(Ecore_X_Window win, Ecore_X_Window root, unsigned int desktop);
+EAPI void                            ecore_x_netwm_moveresize_request_send(Ecore_X_Window win, int x, int y, Ecore_X_Netwm_Direction direction, unsigned int button);
+
+EAPI void                            ecore_x_e_init(void);
+EAPI void                            ecore_x_e_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb);
+EAPI void                            ecore_x_e_virtual_keyboard_set(Ecore_X_Window win, unsigned int is_keyboard);
+EAPI Eina_Bool                       ecore_x_e_virtual_keyboard_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window win, Ecore_X_Virtual_Keyboard_State state);
+EAPI Ecore_X_Virtual_Keyboard_State  ecore_x_e_virtual_keyboard_state_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window win, Ecore_X_Virtual_Keyboard_State state);
+
+/* Illume functions */
+EAPI void                            ecore_x_e_illume_zone_set(Ecore_X_Window win, Ecore_X_Window zone);
+EAPI Ecore_X_Window                  ecore_x_e_illume_zone_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_zone_list_set(Ecore_X_Window win, Ecore_X_Window *zones, unsigned int n_zones);
+EAPI void                            ecore_x_e_illume_conformant_set(Ecore_X_Window win, unsigned int is_conformant);
+EAPI Eina_Bool                       ecore_x_e_illume_conformant_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_mode_set(Ecore_X_Window win, Ecore_X_Illume_Mode mode);
+EAPI Ecore_X_Illume_Mode             ecore_x_e_illume_mode_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_mode_send(Ecore_X_Window win, Ecore_X_Illume_Mode mode);
+EAPI void                            ecore_x_e_illume_focus_back_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_focus_forward_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_focus_home_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_close_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_home_new_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_home_del_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_next_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_prev_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_activate_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_read_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_read_next_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_read_prev_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_up_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_access_action_down_send(Ecore_X_Window win);
+
+EAPI void                            ecore_x_e_illume_drag_set(Ecore_X_Window win, unsigned int drag);
+EAPI Eina_Bool                       ecore_x_e_illume_drag_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_drag_locked_set(Ecore_X_Window win, unsigned int is_locked);
+EAPI Eina_Bool                       ecore_x_e_illume_drag_locked_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_drag_start_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_drag_end_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_indicator_geometry_set(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI Eina_Bool                       ecore_x_e_illume_indicator_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h);
+EAPI void                            ecore_x_e_illume_softkey_geometry_set(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI Eina_Bool                       ecore_x_e_illume_softkey_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h);
+EAPI void                            ecore_x_e_illume_keyboard_geometry_set(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI Eina_Bool                       ecore_x_e_illume_keyboard_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h);
+EAPI void                            ecore_x_e_illume_quickpanel_set(Ecore_X_Window win, unsigned int is_quickpanel);
+EAPI Eina_Bool                       ecore_x_e_illume_quickpanel_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_quickpanel_state_set(Ecore_X_Window win, Ecore_X_Illume_Quickpanel_State state);
+EAPI Ecore_X_Illume_Quickpanel_State ecore_x_e_illume_quickpanel_state_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_quickpanel_state_send(Ecore_X_Window win, Ecore_X_Illume_Quickpanel_State state);
+EAPI void                            ecore_x_e_illume_quickpanel_state_toggle(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_quickpanel_priority_major_set(Ecore_X_Window win, unsigned int priority);
+EAPI int                             ecore_x_e_illume_quickpanel_priority_major_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_quickpanel_priority_minor_set(Ecore_X_Window win, unsigned int priority);
+EAPI int                             ecore_x_e_illume_quickpanel_priority_minor_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_quickpanel_zone_set(Ecore_X_Window win, unsigned int zone);
+EAPI int                             ecore_x_e_illume_quickpanel_zone_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_quickpanel_zone_request_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_illume_quickpanel_position_update_send(Ecore_X_Window win);
+
+EAPI void                            ecore_x_e_illume_clipboard_state_set(Ecore_X_Window win, Ecore_X_Illume_Clipboard_State state);
+
+EAPI Ecore_X_Illume_Clipboard_State  ecore_x_e_illume_clipboard_state_get(Ecore_X_Window win);
+
+EAPI void                            ecore_x_e_illume_clipboard_geometry_set(Ecore_X_Window win, int x, int y, int w, int h);
+EAPI Eina_Bool                       ecore_x_e_illume_clipboard_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h);
+EAPI void                            ecore_x_e_comp_sync_counter_set(Ecore_X_Window win, Ecore_X_Sync_Counter counter);
+EAPI Ecore_X_Sync_Counter            ecore_x_e_comp_sync_counter_get(Ecore_X_Window win);
+EAPI void                            ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window root, Ecore_X_Window win);
+EAPI void                            ecore_x_e_comp_sync_draw_size_done_send(Ecore_X_Window root, Ecore_X_Window win, int w, int h);
+EAPI void                            ecore_x_e_comp_sync_supported_set(Ecore_X_Window root, Eina_Bool enabled);
+EAPI Eina_Bool                       ecore_x_e_comp_sync_supported_get(Ecore_X_Window root);
+EAPI void                            ecore_x_e_comp_sync_begin_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_comp_sync_end_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_comp_sync_cancel_send(Ecore_X_Window win);
+
+EAPI void                            ecore_x_e_comp_flush_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_comp_dump_send(Ecore_X_Window win);
+EAPI void                            ecore_x_e_comp_pixmap_set(Ecore_X_Window win, Ecore_X_Pixmap pixmap);
+EAPI Ecore_X_Pixmap                  ecore_x_e_comp_pixmap_get(Ecore_X_Window win);
+
+EAPI char                            *ecore_x_e_window_profile_get(Ecore_X_Window win);
+EAPI void                             ecore_x_e_window_profile_set(Ecore_X_Window win, const char *profile);
+EAPI void                             ecore_x_e_window_profile_list_set(Ecore_X_Window  win, const char **profiles, unsigned int num_profiles);
+EAPI Eina_Bool                        ecore_x_e_window_profile_list_get(Ecore_X_Window win, const char ***profiles, int *ret_num);
+
+EAPI Ecore_X_Sync_Alarm              ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter);
+EAPI Eina_Bool                       ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm);
+EAPI Eina_Bool                       ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter, unsigned int *val);
+EAPI Ecore_X_Sync_Counter            ecore_x_sync_counter_new(int val);
+EAPI void                            ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter);
+EAPI void                            ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter, int by);
+EAPI void                            ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter, int val);
+
+EAPI void                            ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter, int val);
+EAPI void                            ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter, int val_hi, unsigned int val_lo);
+EAPI Eina_Bool                       ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter, int *val_hi, unsigned int *val_lo);
+
+EAPI int                             ecore_x_xinerama_screen_count_get(void);
+EAPI Eina_Bool                       ecore_x_xinerama_screen_geometry_get(int screen, int *x, int *y, int *w, int *h);
+
+EAPI Eina_Bool                       ecore_x_screensaver_event_available_get(void);
+EAPI int                             ecore_x_screensaver_idle_time_get(void);
+EAPI void                            ecore_x_screensaver_set(int timeout, int interval, int prefer_blanking, int allow_exposures);
+EAPI void                            ecore_x_screensaver_timeout_set(int timeout);
+EAPI int                             ecore_x_screensaver_timeout_get(void);
+EAPI void                            ecore_x_screensaver_blank_set(int timeout);
+EAPI int                             ecore_x_screensaver_blank_get(void);
+EAPI void                            ecore_x_screensaver_expose_set(int timeout);
+EAPI int                             ecore_x_screensaver_expose_get(void);
+EAPI void                            ecore_x_screensaver_interval_set(int timeout);
+EAPI int                             ecore_x_screensaver_interval_get(void);
+EAPI void                            ecore_x_screensaver_event_listen_set(Eina_Bool on);
+EAPI Eina_Bool                       ecore_x_screensaver_custom_blanking_enable(void); /** @since 1.7 */
+EAPI Eina_Bool                       ecore_x_screensaver_custom_blanking_disable(void); /** @since 1.7 */
        
-
-EAPI void                ecore_x_xinerama_query_screens_prefetch(void);
-EAPI void                ecore_x_xinerama_query_screens_fetch(void);
-EAPI int                 ecore_x_xinerama_screen_count_get(void);
-EAPI int                 ecore_x_xinerama_screen_geometry_get(int screen, int *x, int *y, int *w, int *h);
-
-EAPI int                 ecore_x_screensaver_event_available_get(void);
-EAPI void                ecore_x_screensaver_idle_time_prefetch(void);
-EAPI void                ecore_x_screensaver_idle_time_fetch(void);
-EAPI int                 ecore_x_screensaver_idle_time_get(void);
-EAPI void                ecore_x_get_screensaver_prefetch(void);
-EAPI void                ecore_x_get_screensaver_fetch(void);
-EAPI void                ecore_x_screensaver_set(int timeout, int interval, int prefer_blanking, int allow_exposures);
-EAPI void                ecore_x_screensaver_timeout_set(int timeout);
-EAPI int                 ecore_x_screensaver_timeout_get(void);
-EAPI void                ecore_x_screensaver_blank_set(int timeout);
-EAPI int                 ecore_x_screensaver_blank_get(void);
-EAPI void                ecore_x_screensaver_expose_set(int timeout);
-EAPI int                 ecore_x_screensaver_expose_get(void);
-EAPI void                ecore_x_screensaver_interval_set(int timeout);
-EAPI int                 ecore_x_screensaver_interval_get(void);
-EAPI void                ecore_x_screensaver_event_listen_set(int on);
-
 /* FIXME: these funcs need categorising */
 
 typedef struct _Ecore_X_Window_Attributes
 {
-   Ecore_X_Window     root;
-   int                x, y, w, h;
-   int                border;
-   int                depth;
-   unsigned char      visible : 1;
-   unsigned char      viewable : 1;
-   unsigned char      override : 1;
-   unsigned char      input_only : 1;
-   unsigned char      save_under : 1;
-   struct {
-       Ecore_X_Event_Mask mine;
-       Ecore_X_Event_Mask all;
-       Ecore_X_Event_Mask no_propagate;
+   Ecore_X_Window   root;
+   int              x, y, w, h;
+   int              border;
+   int              depth;
+   Eina_Bool        visible : 1;
+   Eina_Bool        viewable : 1;
+   Eina_Bool        override : 1;
+   Eina_Bool        input_only : 1;
+   Eina_Bool        save_under : 1;
+   struct
+   {
+      Ecore_X_Event_Mask mine;
+      Ecore_X_Event_Mask all;
+      Ecore_X_Event_Mask no_propagate;
    } event_mask;
-   Ecore_X_Gravity    window_gravity;
-   Ecore_X_Gravity    pixel_gravity;
-   Ecore_X_Colormap   colormap;
-   Ecore_X_Visual     visual;
+   Ecore_X_Gravity  window_gravity;
+   Ecore_X_Gravity  pixel_gravity;
+   Ecore_X_Colormap colormap;
+   Ecore_X_Visual   visual;
    /* FIXME: missing
     * int map_installed;
     * Screen *screen;
     */
 } Ecore_X_Window_Attributes;
 
-EAPI void ecore_x_get_window_attributes_prefetch(Ecore_X_Window window);
-EAPI void ecore_x_get_window_attributes_fetch(void);
-EAPI int  ecore_x_window_attributes_get(Ecore_X_Window win, Ecore_X_Window_Attributes *att_ret);
-EAPI void ecore_x_window_save_set_add(Ecore_X_Window win);
-EAPI void ecore_x_window_save_set_del(Ecore_X_Window win);
-EAPI Ecore_X_Window *ecore_x_window_children_get(Ecore_X_Window win, int *num);
-
-EAPI int  ecore_x_pointer_control_set(int accel_num, int accel_denom, int threshold);
-EAPI void ecore_x_pointer_control_get_prefetch(void);
-EAPI void ecore_x_pointer_control_get_fetch(void);
-EAPI int  ecore_x_pointer_control_get(int *accel_num, int *accel_denom, int *threshold);
-EAPI int  ecore_x_pointer_grab(Ecore_X_Window win);
-EAPI int  ecore_x_pointer_confine_grab(Ecore_X_Window win);
-EAPI void ecore_x_pointer_ungrab(void);
-EAPI int  ecore_x_pointer_warp(Ecore_X_Window win, int x, int y);
-EAPI int  ecore_x_keyboard_grab(Ecore_X_Window win);
-EAPI void ecore_x_keyboard_ungrab(void);
-EAPI void ecore_x_grab(void);
-EAPI void ecore_x_ungrab(void);
-EAPI void ecore_x_passive_grab_replay_func_set(int (*func) (void *data, int event_type, void *event), void *data);
-EAPI void ecore_x_window_button_grab(Ecore_X_Window win, int button,
-                                    Ecore_X_Event_Mask event_mask,
-                                    int mod, int any_mod);
-EAPI void ecore_x_window_button_ungrab(Ecore_X_Window win, int button,
-                                      int mod, int any_mod);
-EAPI void ecore_x_window_key_grab(Ecore_X_Window win, const char *key,
-                                 int mod, int any_mod);
-EAPI void ecore_x_window_key_ungrab(Ecore_X_Window win, const char *key,
-                                   int mod, int any_mod);
-
-EAPI void ecore_x_focus_reset(void);
-EAPI void ecore_x_events_allow_all(void);
-EAPI void ecore_x_pointer_last_xy_get(int *x, int *y);
-EAPI void ecore_x_pointer_xy_get_prefetch(Ecore_X_Window window);
-EAPI void ecore_x_pointer_xy_get_fetch(void);
-EAPI void ecore_x_pointer_xy_get(Ecore_X_Window win, int *x, int *y);
-
-/* ecore_x_sync.c */
-EAPI Ecore_X_Sync_Alarm ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter);
-EAPI int                ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm);
+EAPI Eina_Bool        ecore_x_window_attributes_get(Ecore_X_Window win, Ecore_X_Window_Attributes *att_ret);
+EAPI void             ecore_x_window_save_set_add(Ecore_X_Window win);
+EAPI void             ecore_x_window_save_set_del(Ecore_X_Window win);
+EAPI Ecore_X_Window  *ecore_x_window_children_get(Ecore_X_Window win, int *num);
+
+EAPI Eina_Bool        ecore_x_pointer_control_set(int accel_num, int accel_denom, int threshold);
+EAPI Eina_Bool        ecore_x_pointer_control_get(int *accel_num, int *accel_denom, int *threshold);
+EAPI Eina_Bool        ecore_x_pointer_mapping_set(unsigned char *map, int nmap);
+EAPI Eina_Bool        ecore_x_pointer_mapping_get(unsigned char *map, int nmap);
+EAPI Eina_Bool        ecore_x_pointer_grab(Ecore_X_Window win);
+EAPI Eina_Bool        ecore_x_pointer_confine_grab(Ecore_X_Window win);
+EAPI void             ecore_x_pointer_ungrab(void);
+EAPI Eina_Bool        ecore_x_pointer_warp(Ecore_X_Window win, int x, int y);
+EAPI Eina_Bool        ecore_x_keyboard_grab(Ecore_X_Window win);
+EAPI void             ecore_x_keyboard_ungrab(void);
+EAPI void             ecore_x_grab(void);
+EAPI void             ecore_x_ungrab(void);
+EAPI void             ecore_x_passive_grab_replay_func_set(Eina_Bool (*func)(void *data, int event_type, void *event), void *data);
+EAPI void             ecore_x_window_button_grab(Ecore_X_Window win, int button, Ecore_X_Event_Mask event_mask, int mod, int any_mod);
+EAPI void             ecore_x_window_button_ungrab(Ecore_X_Window win, int button, int mod, int any_mod);
+EAPI void             ecore_x_window_key_grab(Ecore_X_Window win, const char *key, int mod, int any_mod);
+EAPI void             ecore_x_window_key_ungrab(Ecore_X_Window win, const char *key, int mod, int any_mod);
+
+EAPI void             ecore_x_focus_reset(void);
+EAPI void             ecore_x_events_allow_all(void);
+EAPI void             ecore_x_pointer_last_xy_get(int *x, int *y);
+EAPI void             ecore_x_pointer_xy_get(Ecore_X_Window win, int *x, int *y);
+
+/* ecore_x_region.c */
+EAPI Ecore_X_XRegion *ecore_x_xregion_new(void);
+EAPI void             ecore_x_xregion_free(Ecore_X_XRegion *region);
+EAPI Eina_Bool        ecore_x_xregion_set(Ecore_X_XRegion *region, Ecore_X_GC gc);
+EAPI void             ecore_x_xregion_translate(Ecore_X_XRegion *region, int x, int y);
+EAPI Eina_Bool        ecore_x_xregion_intersect(Ecore_X_XRegion *dst, Ecore_X_XRegion *r1, Ecore_X_XRegion *r2);
+EAPI Eina_Bool        ecore_x_xregion_union(Ecore_X_XRegion *dst, Ecore_X_XRegion *r1, Ecore_X_XRegion *r2);
+EAPI Eina_Bool        ecore_x_xregion_union_rect(Ecore_X_XRegion *dst, Ecore_X_XRegion *src, Ecore_X_Rectangle *rect);
+EAPI Eina_Bool        ecore_x_xregion_subtract(Ecore_X_XRegion *dst, Ecore_X_XRegion *r1, Ecore_X_XRegion *r2);
+EAPI Eina_Bool        ecore_x_xregion_is_empty(Ecore_X_XRegion *region);
+EAPI Eina_Bool        ecore_x_xregion_is_equal(Ecore_X_XRegion *r1, Ecore_X_XRegion *r2);
+EAPI Eina_Bool        ecore_x_xregion_point_contain(Ecore_X_XRegion *region, int x, int y);
+EAPI Eina_Bool        ecore_x_xregion_rect_contain(Ecore_X_XRegion *region, Ecore_X_Rectangle *rect);
 
 /* ecore_x_randr.c */
-typedef struct _Ecore_X_Screen_Size Ecore_X_Screen_Size;
-struct _Ecore_X_Screen_Size
-{
-   int width, height;
-};
 
-typedef struct _Ecore_X_Screen_Refresh_Rate Ecore_X_Screen_Refresh_Rate;
-struct _Ecore_X_Screen_Refresh_Rate
-{
-   int rate;
-};
+/* The usage of 'Ecore_X_Randr_None' or 'Ecore_X_Randr_Unset'
+ * depends on the context. In most cases 'Ecore_X_Randr_Unset'
+ * can be used, but in some cases -1 is a special value to
+ * functions, thus 'Ecore_X_Randr_None' (=0) must be used.
+ */
 
-EAPI int                     ecore_x_randr_query();
-EAPI int                     ecore_x_randr_events_select(Ecore_X_Window win, int on);
-EAPI void                    ecore_x_randr_get_screen_info_prefetch(Ecore_X_Window window);
-EAPI void                    ecore_x_randr_get_screen_info_fetch(void);
-EAPI Ecore_X_Randr_Rotation  ecore_x_randr_screen_rotations_get(Ecore_X_Window root);
-EAPI Ecore_X_Randr_Rotation  ecore_x_randr_screen_rotation_get(Ecore_X_Window root);
-EAPI void                    ecore_x_randr_screen_rotation_set(Ecore_X_Window root, Ecore_X_Randr_Rotation rot);
-EAPI Ecore_X_Screen_Size    *ecore_x_randr_screen_sizes_get(Ecore_X_Window root, int *num);
-EAPI Ecore_X_Screen_Size     ecore_x_randr_current_screen_size_get(Ecore_X_Window root);
-EAPI int                     ecore_x_randr_screen_size_set(Ecore_X_Window root, Ecore_X_Screen_Size size);
+typedef short Ecore_X_Randr_Refresh_Rate;
+typedef int   Ecore_X_Randr_Crtc_Gamma;
+typedef int   Ecore_X_Randr_Signal_Format;
+typedef int   Ecore_X_Randr_Signal_Property;
+typedef int   Ecore_X_Randr_Connector_Type;
+
+typedef struct _Ecore_X_Randr_Mode_Info
+{
+   Ecore_X_ID    xid;
+   unsigned int  width;
+   unsigned int  height;
+   unsigned long dotClock;
+   unsigned int  hSyncStart;
+   unsigned int  hSyncEnd;
+   unsigned int  hTotal;
+   unsigned int  hSkew;
+   unsigned int  vSyncStart;
+   unsigned int  vSyncEnd;
+   unsigned int  vTotal;
+   char         *name;
+   unsigned int  nameLength;
+   unsigned long modeFlags;
+} Ecore_X_Randr_Mode_Info;
+
+EAPI int                                       ecore_x_randr_version_get(void);
+EAPI Eina_Bool                                 ecore_x_randr_query(void);
+
+/* ecore_x_randr_11.c */
+EAPI Ecore_X_Randr_Orientation                 ecore_x_randr_screen_primary_output_orientations_get(Ecore_X_Window root);
+EAPI Ecore_X_Randr_Orientation                 ecore_x_randr_screen_primary_output_orientation_get(Ecore_X_Window root);
+EAPI Eina_Bool                                 ecore_x_randr_screen_primary_output_orientation_set(Ecore_X_Window root, Ecore_X_Randr_Orientation orientation);
+EAPI Ecore_X_Randr_Screen_Size_MM             *ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root, int *num);
 
-EAPI Ecore_X_Screen_Refresh_Rate *ecore_x_randr_screen_refresh_rates_get(Ecore_X_Window root, int size_id, int *num);
-EAPI Ecore_X_Screen_Refresh_Rate  ecore_x_randr_current_screen_refresh_rate_get(Ecore_X_Window root);
+/**
+ * @brief get the current set size of a given screen's primary output
+ * @param root window which's primary output will be queried
+ * @param w the current size's width
+ * @param h the current size's height
+ * @param w_mm the current size's width in mm
+ * @param h_mm the current size's height in mm
+ * @param size_index of current set size to be used with ecore_x_randr_primary_output_size_set()
+ */
+EAPI void                                      ecore_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root, int *w, int *h, int *w_mm, int *h_mm, int *size_index);
+EAPI Eina_Bool                                 ecore_x_randr_screen_primary_output_size_set(Ecore_X_Window root, int size_index);
+EAPI Ecore_X_Randr_Refresh_Rate                ecore_x_randr_screen_primary_output_current_refresh_rate_get(Ecore_X_Window root);
+EAPI Ecore_X_Randr_Refresh_Rate               *ecore_x_randr_screen_primary_output_refresh_rates_get(Ecore_X_Window root, int size_index, int *num);
+EAPI Eina_Bool                                 ecore_x_randr_screen_primary_output_refresh_rate_set(Ecore_X_Window root, int size_index, Ecore_X_Randr_Refresh_Rate rate);
+
+/* ecore_x_randr_12.c */
+EAPI void                                      ecore_x_randr_events_select(Ecore_X_Window win, Eina_Bool on);
+
+EAPI void                                      ecore_x_randr_screen_current_size_get(Ecore_X_Window root, int *w, int *h, int *w_mm, int *h_mm);
+EAPI void                                      ecore_x_randr_screen_size_range_get(Ecore_X_Window root, int *wmin, int *hmin, int *wmax, int *hmax);
+EAPI void                                      ecore_x_randr_screen_reset(Ecore_X_Window root);
+EAPI Eina_Bool                                 ecore_x_randr_screen_current_size_set(Ecore_X_Window root, int w, int h, int w_mm, int h_mm);
+EAPI Ecore_X_Randr_Mode_Info                 **ecore_x_randr_modes_info_get(Ecore_X_Window root, int *num);
+EAPI Ecore_X_Randr_Mode                        ecore_x_randr_mode_info_add(Ecore_X_Window root, Ecore_X_Randr_Mode_Info *mode_info);
+EAPI void                                      ecore_x_randr_mode_del(Ecore_X_Randr_Mode mode);
+EAPI Ecore_X_Randr_Mode_Info                  *ecore_x_randr_mode_info_get(Ecore_X_Window root, Ecore_X_Randr_Mode mode);
+EAPI void                                      ecore_x_randr_mode_info_free(Ecore_X_Randr_Mode_Info *mode_info);
+EAPI Ecore_X_Randr_Crtc                       *ecore_x_randr_crtcs_get(Ecore_X_Window root, int *num);
+EAPI Ecore_X_Randr_Output                     *ecore_x_randr_outputs_get(Ecore_X_Window root, int *num);
+EAPI Ecore_X_Randr_Output                     *ecore_x_randr_window_outputs_get(Ecore_X_Window window, int *num);
+EAPI Ecore_X_Randr_Output                     *ecore_x_randr_current_output_get(Ecore_X_Window window, int *num);
+EAPI Ecore_X_Randr_Crtc                       *ecore_x_randr_window_crtcs_get(Ecore_X_Window window, int *num);
+EAPI Ecore_X_Randr_Crtc                       *ecore_x_randr_current_crtc_get(Ecore_X_Window window, int *num);
+EAPI Ecore_X_Randr_Output                     *ecore_x_randr_crtc_outputs_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int *num);
+EAPI Ecore_X_Randr_Output                     *ecore_x_randr_crtc_possible_outputs_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int *num);
+EAPI void                                      ecore_x_randr_crtc_geometry_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int *x, int *y, int *w, int *h);
+EAPI void                                      ecore_x_randr_crtc_pos_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int *x, int *y);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_pos_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int x, int y);
+EAPI Ecore_X_Randr_Mode                        ecore_x_randr_crtc_mode_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_mode_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, Ecore_X_Randr_Output *outputs, int noutputs, Ecore_X_Randr_Mode mode);
+EAPI void                                      ecore_x_randr_crtc_size_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int *w, int *h);
+EAPI Ecore_X_Randr_Refresh_Rate                ecore_x_randr_crtc_refresh_rate_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, Ecore_X_Randr_Mode mode);
+EAPI Ecore_X_Randr_Orientation                 ecore_x_randr_crtc_orientations_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc);
+EAPI Ecore_X_Randr_Orientation                 ecore_x_randr_crtc_orientation_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_orientation_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, const Ecore_X_Randr_Orientation orientation);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_clone_set(Ecore_X_Window root, Ecore_X_Randr_Crtc original, Ecore_X_Randr_Crtc clone);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_settings_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, Ecore_X_Randr_Output *outputs, int noutputs, int x, int y, Ecore_X_Randr_Mode mode, Ecore_X_Randr_Orientation orientation);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_pos_relative_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc_r1, Ecore_X_Randr_Crtc crtc_r2, Ecore_X_Randr_Output_Policy policy, Ecore_X_Randr_Relative_Alignment alignment);
+EAPI Eina_Bool                                 ecore_x_randr_output_mode_add(Ecore_X_Randr_Output output, Ecore_X_Randr_Mode mode);
+EAPI void                                      ecore_x_randr_output_mode_del(Ecore_X_Randr_Output output, Ecore_X_Randr_Mode mode);
+EAPI Ecore_X_Randr_Mode                       *ecore_x_randr_output_modes_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *num, int *npreferred);
+EAPI Ecore_X_Randr_Output                     *ecore_x_randr_output_clones_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *num);
+EAPI Ecore_X_Randr_Crtc                       *ecore_x_randr_output_possible_crtcs_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *num);
+EAPI Ecore_X_Randr_Crtc                        ecore_x_randr_output_crtc_get(Ecore_X_Window root, Ecore_X_Randr_Output output);
+EAPI char                                     *ecore_x_randr_output_name_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *len);
+EAPI int                                       ecore_x_randr_crtc_gamma_ramp_size_get(Ecore_X_Randr_Crtc crtc);
+EAPI Ecore_X_Randr_Crtc_Gamma                **ecore_x_randr_crtc_gamma_ramps_get(Ecore_X_Randr_Crtc crtc);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_gamma_ramps_set(Ecore_X_Randr_Crtc crtc, const Ecore_X_Randr_Crtc_Gamma *red, const Ecore_X_Randr_Crtc_Gamma *green, const Ecore_X_Randr_Crtc_Gamma *blue);
+EAPI Eina_Bool                                 ecore_x_randr_move_all_crtcs_but(Ecore_X_Window root, const Ecore_X_Randr_Crtc *not_moved, int nnot_moved, int dx, int dy);
+EAPI Eina_Bool                                 ecore_x_randr_move_crtcs(Ecore_X_Window root, const Ecore_X_Randr_Crtc *crtcs, int ncrtc, int dx, int dy);
+EAPI void                                      ecore_x_randr_mode_size_get(Ecore_X_Window root, Ecore_X_Randr_Mode mode, int *w, int *h);
+EAPI Ecore_X_Randr_Connection_Status           ecore_x_randr_output_connection_status_get(Ecore_X_Window root, Ecore_X_Randr_Output output);
+EAPI void                                      ecore_x_randr_output_size_mm_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *w, int *h);
+EAPI Eina_Bool                                 ecore_x_randr_output_crtc_set(Ecore_X_Window root, Ecore_X_Randr_Output output, const Ecore_X_Randr_Crtc crtc);
+
+/* ecore_x_randr_12_edid.c */
 
-EAPI int ecore_x_randr_screen_refresh_rate_set(Ecore_X_Window root, Ecore_X_Screen_Size size, Ecore_X_Screen_Refresh_Rate rate);
+/**
+ * @brief Validates the header from raw EDID data.
+ *
+ * @param edid The edid structure.
+ * @param edid_length Length of the edid structure.
+ * @return @c EINA_TRUE, if the header is valid, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool                                 ecore_x_randr_edid_has_valid_header(unsigned char *edid, unsigned long edid_length);
 
+/**
+ * @brief Checks whether a display's EDID has a valid checksum.
+ *
+ * @param edid The edid structure.
+ * @param edid_length Length of the edid structure.
+ * @return @c EINA_TRUE, if the checksum is valid, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool                                 ecore_x_randr_edid_info_has_valid_checksum(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the encoded version from raw EDID data.
+ *
+ * The return value has the minor version in the lowest 8 bits, and the major
+ * version in all the rest of the bits. i.e.
+ *
+ * minor = (version & 0x000000ff);
+ * major = (version & 0xffffff00) >> 8;
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The encoded major and minor version encasuplated an int.
+ */
+EAPI int                                       ecore_x_randr_edid_version_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the encoded manufacturer from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The encoded manufacturer identifier.
+ */
+EAPI char                                     *ecore_x_randr_edid_manufacturer_name_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the encoded name from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The encoded manufacturer identifier.
+ */
+EAPI char                                     *ecore_x_randr_edid_display_name_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the encoded ASCII from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The encoded ASCII display identifier.
+ */
+EAPI char                                     *ecore_x_randr_edid_display_ascii_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the encoded serial identifier from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The encoded serial identifier.
+ */
+EAPI char                                     *ecore_x_randr_edid_display_serial_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the encoded model number from raw EDID data.
+ *
+ * The manufacturer ID table is necessary for a useful description.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The encoded model number.
+ */
+EAPI int                                       ecore_x_randr_edid_model_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the manufacturer serial number from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The encoded serial manufacturer serial number.
+ */
+EAPI int                                       ecore_x_randr_edid_manufacturer_serial_number_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the manufacturer model number from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The manufacturer's model number.
+ */
+EAPI int                                       ecore_x_randr_edid_manufacturer_model_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Looks up the DPMS support from raw EDID data.
+ *
+ * @param edid The edid structure.
+ * @param edid_length Length of the edid structure.
+ * @return @c EINA_TRUE, if DPMS is supported in some way, @c EINA_FALSE
+ * otherwise.
+ */
+EAPI Eina_Bool                                 ecore_x_randr_edid_dpms_available_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Looks up the DPMS Standby support from raw EDID data.
+ *
+ * @param edid The edid structure.
+ * @param edid_length Length of the edid structure.
+ * @return @c EINA_TRUE, if DPMS Standby is supported, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool                                 ecore_x_randr_edid_dpms_standby_available_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Looks up the DPMS Suspend support from raw EDID data.
+ *
+ * @param edid The edid structure.
+ * @param edid_length Length of the edid structure.
+ * @return @c EINA_TRUE, if DPMS Suspend is supported, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool                                 ecore_x_randr_edid_dpms_suspend_available_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Looks up the DPMS Off support from raw EDID data.
+ *
+ * @param edid The edid structure.
+ * @param edid_length Length of the edid structure.
+ * @return @c EINA_TRUE, if DPMS Off is supported, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool                                 ecore_x_randr_edid_dpms_off_available_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the preferred aspect ratio from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The preferred aspect ratio.
+ */
+EAPI Ecore_X_Randr_Edid_Aspect_Ratio           ecore_x_randr_edid_display_aspect_ratio_preferred_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the supported aspect ratios from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The supported aspect ratios.
+ */
+EAPI Ecore_X_Randr_Edid_Aspect_Ratio           ecore_x_randr_edid_display_aspect_ratios_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the supported colorschemes from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The supported colorschemes.
+ */
+EAPI Ecore_X_Randr_Edid_Display_Colorscheme    ecore_x_randr_edid_display_colorscheme_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the display type from raw EDID data.
+ *
+ * @param edid The edid structure.
+ * @param edid_length Length of the edid structure.
+ * @return @c EINA_TRUE, if the display is a digital one, @c EINA_FALSE
+ * otherwise.
+ */
+EAPI Eina_Bool                                 ecore_x_randr_edid_display_type_digital_get(unsigned char *edid, unsigned long edid_length);
+
+/**
+ * @brief Get the display interface type from raw EDID data.
+ *
+ * @param edid the edid structure
+ * @param edid_length length of the edid structure
+ * @return The interface type.
+ */
+EAPI Ecore_X_Randr_Edid_Display_Interface_Type ecore_x_randr_edid_display_interface_type_get(unsigned char *edid, unsigned long edid_length);
+
+/* ecore_x_randr_12.c */
+
+EAPI Eina_Bool                                 ecore_x_randr_output_backlight_available(void);
+EAPI void                                      ecore_x_randr_screen_backlight_level_set(Ecore_X_Window root, double level);
+EAPI double                                    ecore_x_randr_output_backlight_level_get(Ecore_X_Window root, Ecore_X_Randr_Output output);
+EAPI Eina_Bool                                 ecore_x_randr_output_backlight_level_set(Ecore_X_Window root, Ecore_X_Randr_Output output, double level);
+EAPI Ecore_X_Randr_Output                      ecore_x_randr_primary_output_get(Ecore_X_Window root);
+EAPI void                                      ecore_x_randr_primary_output_set(Ecore_X_Window root, Ecore_X_Randr_Output output);
+EAPI Ecore_X_Render_Subpixel_Order             ecore_x_randr_output_subpixel_order_get(Ecore_X_Window root, Ecore_X_Randr_Output output);
+EAPI unsigned char                            *ecore_x_randr_output_edid_get(Ecore_X_Window root, Ecore_X_Randr_Output output, unsigned long *length);
+EAPI Ecore_X_Randr_Output                     *ecore_x_randr_output_wired_clones_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *num);
+EAPI Ecore_X_Randr_Output                    **ecore_x_randr_output_compatibility_list_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *num);
+EAPI Ecore_X_Randr_Signal_Format              *ecore_x_randr_output_signal_formats_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *num);
+EAPI Eina_Bool                                 ecore_x_randr_output_signal_format_set(Ecore_X_Window root, Ecore_X_Randr_Output output, Ecore_X_Randr_Signal_Format *signal);
+EAPI Ecore_X_Randr_Signal_Property            *ecore_x_randr_output_signal_properties_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *num);
+EAPI int                                       ecore_x_randr_output_connector_number_get(Ecore_X_Window root, Ecore_X_Randr_Output output);
+EAPI Ecore_X_Randr_Connector_Type              ecore_x_randr_output_connector_type_get(Ecore_X_Window root, Ecore_X_Randr_Output output);
+/* WTF - these dont exist in ecore-x!!!!   
+EAPI Eina_Rectangle                           *ecore_x_randr_crtc_panning_area_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int *x, int *y, int *w, int *h);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_panning_area_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int x, const int y, const int w, const int h);
+EAPI Eina_Rectangle                           *ecore_x_randr_crtc_tracking_area_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int *x, int *y, int *w, int *h);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_tracking_area_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int x, const int y, const int w, const int h);
+EAPI Eina_Rectangle                           *ecore_x_randr_crtc_border_area_get(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc);
+EAPI Eina_Bool                                 ecore_x_randr_crtc_border_area_set(Ecore_X_Window root, Ecore_X_Randr_Crtc crtc, int left, const int top, const int right, const int bottom);
+*/
+   
 /* XRender Support (horrendously incomplete) */
-typedef Ecore_X_ID  Ecore_X_Picture;
+typedef Ecore_X_ID Ecore_X_Picture;
 
 /* XFixes Extension Support */
-typedef Ecore_X_ID  Ecore_X_Region;
+typedef Ecore_X_ID Ecore_X_Region;
 
-typedef enum _Ecore_X_Region_Type {
-     ECORE_X_REGION_BOUNDING,
-     ECORE_X_REGION_CLIP
+typedef enum _Ecore_X_Region_Type
+{
+   ECORE_X_REGION_BOUNDING,
+   ECORE_X_REGION_CLIP
 } Ecore_X_Region_Type;
 
-EAPI Ecore_X_Region ecore_x_region_new(Ecore_X_Rectangle *rects, int num);
-EAPI Ecore_X_Region ecore_x_region_new_from_bitmap(Ecore_X_Pixmap bitmap);
-EAPI Ecore_X_Region ecore_x_region_new_from_window(Ecore_X_Window win, Ecore_X_Region_Type type);
-EAPI Ecore_X_Region ecore_x_region_new_from_gc(Ecore_X_GC gc);
-EAPI Ecore_X_Region ecore_x_region_new_from_picture(Ecore_X_Picture picture);
-EAPI void           ecore_x_region_del(Ecore_X_Region region);
-EAPI void           ecore_x_region_set(Ecore_X_Region region, Ecore_X_Rectangle *rects, int num);
-EAPI void           ecore_x_region_copy(Ecore_X_Region dest, Ecore_X_Region source);
-EAPI void           ecore_x_region_combine(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2);
-EAPI void           ecore_x_region_intersect(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2);
-EAPI void           ecore_x_region_subtract(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2);
-EAPI void           ecore_x_region_invert(Ecore_X_Region dest, Ecore_X_Rectangle *bounds, Ecore_X_Region source);
-EAPI void           ecore_x_region_translate(Ecore_X_Region region, int dx, int dy);
-EAPI void           ecore_x_region_extents(Ecore_X_Region dest, Ecore_X_Region source);
-EAPI void           ecore_x_region_fetch_prefetch(Ecore_X_Region region);
-EAPI void           ecore_x_region_fetch_fetch(void);
-EAPI Ecore_X_Rectangle * ecore_x_region_fetch(Ecore_X_Region region, int *num, Ecore_X_Rectangle *bounds);
-EAPI void           ecore_x_region_expand(Ecore_X_Region dest, Ecore_X_Region source, unsigned int left, unsigned int right, unsigned int top, unsigned int bottom);
-EAPI void           ecore_x_region_gc_clip_set(Ecore_X_Region region, Ecore_X_GC gc, int x_origin, int y_origin);
-EAPI void           ecore_x_region_window_shape_set(Ecore_X_Region region, Ecore_X_Window win, Ecore_X_Shape_Type type, int x_offset, int y_offset);
-EAPI void           ecore_x_region_picture_clip_set(Ecore_X_Region region, Ecore_X_Picture picture, int x_origin, int y_origin);
+EAPI Ecore_X_Region     ecore_x_region_new(Ecore_X_Rectangle *rects, int num);
+EAPI Ecore_X_Region     ecore_x_region_new_from_bitmap(Ecore_X_Pixmap bitmap);
+EAPI Ecore_X_Region     ecore_x_region_new_from_window(Ecore_X_Window win, Ecore_X_Region_Type type);
+EAPI Ecore_X_Region     ecore_x_region_new_from_gc(Ecore_X_GC gc);
+EAPI Ecore_X_Region     ecore_x_region_new_from_picture(Ecore_X_Picture picture);
+EAPI void               ecore_x_region_free(Ecore_X_Region region);
+EAPI void               ecore_x_region_set(Ecore_X_Region region, Ecore_X_Rectangle *rects, int num);
+EAPI void               ecore_x_region_copy(Ecore_X_Region dest, Ecore_X_Region source);
+EAPI void               ecore_x_region_combine(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2);
+EAPI void               ecore_x_region_intersect(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2);
+EAPI void               ecore_x_region_subtract(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2);
+EAPI void               ecore_x_region_invert(Ecore_X_Region dest, Ecore_X_Rectangle *bounds, Ecore_X_Region source);
+EAPI void               ecore_x_region_translate(Ecore_X_Region region, int dx, int dy);
+EAPI void               ecore_x_region_extents(Ecore_X_Region dest, Ecore_X_Region source);
+EAPI Ecore_X_Rectangle *ecore_x_region_fetch(Ecore_X_Region region, int *num, Ecore_X_Rectangle *bounds);
+EAPI void               ecore_x_region_expand(Ecore_X_Region dest, Ecore_X_Region source, unsigned int left, unsigned int right, unsigned int top, unsigned int bottom);
+EAPI void               ecore_x_region_gc_clip_set(Ecore_X_Region region, Ecore_X_GC gc, int x_origin, int y_origin);
+EAPI void               ecore_x_region_window_shape_set(Ecore_X_Region region, Ecore_X_Window win, Ecore_X_Shape_Type type, int x_offset, int y_offset);
+EAPI void               ecore_x_region_picture_clip_set(Ecore_X_Region region, Ecore_X_Picture picture, int x_origin, int y_origin);
+
+/**
+ * xfixes selection notification request.
+ *
+ * This lets you choose which selections you want to get notifications for.
+ * @param selection The selection atom.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ * @since 1.1.0
+ */
+EAPI Eina_Bool          ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection);
 
 /* XComposite Extension Support */
-EAPI int               ecore_x_composite_query(void);
+EAPI Eina_Bool          ecore_x_composite_query(void);
+EAPI void               ecore_x_composite_redirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type);
+EAPI void               ecore_x_composite_redirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type);
+EAPI void               ecore_x_composite_unredirect_window(Ecore_X_Window win, Ecore_X_Composite_Update_Type type);
+EAPI void               ecore_x_composite_unredirect_subwindows(Ecore_X_Window win, Ecore_X_Composite_Update_Type type);
+EAPI Ecore_X_Pixmap     ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win);
+EAPI void               ecore_x_composite_window_events_disable(Ecore_X_Window win);
+EAPI void               ecore_x_composite_window_events_enable(Ecore_X_Window win);
+EAPI Ecore_X_Window     ecore_x_composite_render_window_enable(Ecore_X_Window root);
+EAPI void               ecore_x_composite_render_window_disable(Ecore_X_Window root);
 
 /* XDamage Extension Support */
-typedef Ecore_X_ID  Ecore_X_Damage;
+typedef Ecore_X_ID Ecore_X_Damage;
 
-typedef enum _Ecore_X_Damage_Report_Level {
-     ECORE_X_DAMAGE_REPORT_RAW_RECTANGLES,
-     ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES,
-     ECORE_X_DAMAGE_REPORT_BOUNDING_BOX,
-     ECORE_X_DAMAGE_REPORT_NON_EMPTY
+typedef enum _Ecore_X_Damage_Report_Level
+{
+   ECORE_X_DAMAGE_REPORT_RAW_RECTANGLES,
+   ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES,
+   ECORE_X_DAMAGE_REPORT_BOUNDING_BOX,
+   ECORE_X_DAMAGE_REPORT_NON_EMPTY
 } Ecore_X_Damage_Report_Level;
 
-struct _Ecore_X_Event_Damage {
-     Ecore_X_Damage_Report_Level level;
-     Ecore_X_Drawable drawable;
-     Ecore_X_Damage   damage;
-     int              more;
-     Ecore_X_Time     time;
-     Ecore_X_Rectangle area;
-     Ecore_X_Rectangle  geometry;
-};
-
-typedef struct _Ecore_X_Event_Damage  Ecore_X_Event_Damage;
-
-EAPI int               ecore_x_damage_query(void);
-EAPI Ecore_X_Damage    ecore_x_damage_new(Ecore_X_Drawable d, Ecore_X_Damage_Report_Level level);
-EAPI void              ecore_x_damage_del(Ecore_X_Damage damage);
-EAPI void              ecore_x_damage_subtract(Ecore_X_Damage damage, Ecore_X_Region repair, Ecore_X_Region parts);
-
-EAPI int               ecore_x_screen_is_composited(int screen);
-
-EAPI int               ecore_x_dpms_query(void);
-EAPI void              ecore_x_dpms_capable_get_prefetch(void);
-EAPI void              ecore_x_dpms_capable_get_fetch(void);
-EAPI int               ecore_x_dpms_capable_get(void);
-EAPI void              ecore_x_dpms_enable_get_prefetch(void);
-EAPI void              ecore_x_dpms_enable_get_fetch(void);
-EAPI int               ecore_x_dpms_enabled_get(void);
-EAPI void              ecore_x_dpms_enabled_set(int enabled);
-EAPI void              ecore_x_dpms_timeouts_get_prefetch(void);
-EAPI void              ecore_x_dpms_timeouts_get_fetch(void);
-EAPI void              ecore_x_dpms_timeouts_get(unsigned int *standby, unsigned int *suspend, unsigned int *off);
-EAPI int               ecore_x_dpms_timeouts_set(unsigned int standby, unsigned int suspend, unsigned int off);
-EAPI unsigned int      ecore_x_dpms_timeout_standby_get(void);
-EAPI unsigned int      ecore_x_dpms_timeout_suspend_get(void);
-EAPI unsigned int      ecore_x_dpms_timeout_off_get(void);
-EAPI void              ecore_x_dpms_timeout_standby_set(unsigned int new_timeout);
-EAPI void              ecore_x_dpms_timeout_suspend_set(unsigned int new_timeout);
-EAPI void              ecore_x_dpms_timeout_off_set(unsigned int new_timeout);
-
-EAPI int ecore_x_test_fake_key_down(const char *key);
-EAPI int ecore_x_test_fake_key_up(const char *key);
-EAPI int ecore_x_test_fake_key_press(const char *key);
-EAPI const char *ecore_x_keysym_string_get(int keysym);
-   
+struct _Ecore_X_Event_Damage
+{
+   Ecore_X_Damage_Report_Level level;
+   Ecore_X_Drawable            drawable;
+   Ecore_X_Damage              damage;
+   int                         more;
+   Ecore_X_Time                time;
+   Ecore_X_Rectangle           area;
+   Ecore_X_Rectangle           geometry;
+};
+
+typedef struct _Ecore_X_Event_Damage Ecore_X_Event_Damage;
+
+struct _Ecore_X_Event_Xkb
+{
+   int group;
+};
+typedef struct _Ecore_X_Event_Xkb Ecore_X_Event_Xkb; /** @since 1.7 */
+
+EAPI Eina_Bool      ecore_x_damage_query(void);
+EAPI Ecore_X_Damage ecore_x_damage_new(Ecore_X_Drawable d, Ecore_X_Damage_Report_Level level);
+EAPI void           ecore_x_damage_free(Ecore_X_Damage damage);
+EAPI void           ecore_x_damage_subtract(Ecore_X_Damage damage, Ecore_X_Region repair, Ecore_X_Region parts);
+
+EAPI Eina_Bool      ecore_x_screen_is_composited(int screen);
+EAPI void           ecore_x_screen_is_composited_set(int screen, Ecore_X_Window win);
+
+EAPI Eina_Bool      ecore_x_dpms_query(void);
+EAPI Eina_Bool      ecore_x_dpms_capable_get(void);
+EAPI Eina_Bool      ecore_x_dpms_enabled_get(void);
+EAPI void           ecore_x_dpms_enabled_set(int enabled);
+EAPI void           ecore_x_dpms_timeouts_get(unsigned int *standby, unsigned int *suspend, unsigned int *off);
+EAPI Eina_Bool      ecore_x_dpms_timeouts_set(unsigned int standby, unsigned int suspend, unsigned int off);
+EAPI unsigned int   ecore_x_dpms_timeout_standby_get(void);
+EAPI unsigned int   ecore_x_dpms_timeout_suspend_get(void);
+EAPI unsigned int   ecore_x_dpms_timeout_off_get(void);
+EAPI void           ecore_x_dpms_timeout_standby_set(unsigned int new_timeout);
+EAPI void           ecore_x_dpms_timeout_suspend_set(unsigned int new_timeout);
+EAPI void           ecore_x_dpms_timeout_off_set(unsigned int new_timeout);
+
+EAPI Eina_Bool      ecore_x_test_fake_key_down(const char *key);
+EAPI Eina_Bool      ecore_x_test_fake_key_up(const char *key);
+EAPI Eina_Bool      ecore_x_test_fake_key_press(const char *key);
+EAPI const char    *ecore_x_keysym_string_get(int keysym);
+
+/**
+ * Given a keyname, return the keycode representing that key
+ * @param keyname The key from which to get the keycode.
+ * @return The keycode of the key.
+ *
+ * @since 1.2.0
+ */
+EAPI int            ecore_x_keysym_keycode_get(const char *keyname);
+
+typedef struct _Ecore_X_Image Ecore_X_Image;
+
+EAPI Ecore_X_Image *ecore_x_image_new(int w, int h, Ecore_X_Visual vis, int depth);
+EAPI void           ecore_x_image_free(Ecore_X_Image *im);
+EAPI Eina_Bool      ecore_x_image_get(Ecore_X_Image *im, Ecore_X_Drawable draw, int x, int y, int sx, int sy, int w, int h);
+EAPI void           ecore_x_image_put(Ecore_X_Image *im, Ecore_X_Drawable draw, Ecore_X_GC gc, int x, int y, int sx, int sy, int w, int h);
+EAPI void          *ecore_x_image_data_get(Ecore_X_Image *im, int *bpl, int *rows, int *bpp);
+EAPI Eina_Bool      ecore_x_image_is_argb32_get(Ecore_X_Image *im);
+
+EAPI Eina_Bool      ecore_x_image_to_argb_convert(void *src, int sbpp, int sbpl, Ecore_X_Colormap c, Ecore_X_Visual v, int x, int y, int w, int h, unsigned int *dst, int dbpl, int dx, int dy);
+
+EAPI Eina_Bool      ecore_x_input_multi_select(Ecore_X_Window win);
+EAPI Eina_Bool     ecore_x_input_raw_select(Ecore_X_Window win); /**< @since 1.8 */
+
+EAPI Eina_Bool      ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win);
+
+typedef enum _Ecore_X_Gesture_Event_Mask
+{
+   ECORE_X_GESTURE_EVENT_MASK_NONE = 0L,
+   ECORE_X_GESTURE_EVENT_MASK_FLICK = (1L << 0),
+   ECORE_X_GESTURE_EVENT_MASK_PAN = (1L << 1),
+   ECORE_X_GESTURE_EVENT_MASK_PINCHROTATION = (1L << 2),
+   ECORE_X_GESTURE_EVENT_MASK_TAP = (1L << 3),
+   ECORE_X_GESTURE_EVENT_MASK_TAPNHOLD = (1L << 4),
+   ECORE_X_GESTURE_EVENT_MASK_HOLD = (1L << 5),
+   ECORE_X_GESTURE_EVENT_MASK_GROUP = (1L << 6)
+} Ecore_X_Gesture_Event_Mask;
+
+typedef enum _Ecore_X_Gesture_Event_Type
+{
+   ECORE_X_GESTURE_EVENT_FLICK,
+   ECORE_X_GESTURE_EVENT_PAN,
+   ECORE_X_GESTURE_EVENT_PINCHROTATION,
+   ECORE_X_GESTURE_EVENT_TAP,
+   ECORE_X_GESTURE_EVENT_TAPNHOLD,
+   ECORE_X_GESTURE_EVENT_HOLD,
+   ECORE_X_GESTURE_EVENT_GROUP
+} Ecore_X_Gesture_Event_Type;
+
+typedef enum _Ecore_X_Gesture_Event_Subtype
+{
+   ECORE_X_GESTURE_END,
+   ECORE_X_GESTURE_BEGIN,
+   ECORE_X_GESTURE_UPDATE,
+   ECORE_X_GESTURE_DONE
+} Ecore_X_Gesture_Event_Subtype;
+
+typedef enum _Ecore_X_Gesture_Group_Subtype
+{
+   ECORE_X_GESTURE_GROUP_REMOVED,
+   ECORE_X_GESTURE_GROUP_ADDED,
+   ECORE_X_GESTURE_GROUP_CURRENT
+} Ecore_X_Gesture_Group_Subtype;
+
+typedef enum _Ecore_X_Gesture_Direction
+{
+   ECORE_X_GESTURE_NORTHWARD,
+   ECORE_X_GESTURE_NORTHEASTWARD,
+   ECORE_X_GESTURE_EASTWARD,
+   ECORE_X_GESTURE_SOUTHEASTWARD,
+   ECORE_X_GESTURE_SOUTHWARD,
+   ECORE_X_GESTURE_SOUTHWESTWARD,
+   ECORE_X_GESTURE_WESTWARD,
+   ECORE_X_GESTURE_NORTHWESTWARD
+} Ecore_X_Gesture_Direction;
+
+struct _Ecore_X_Event_Gesture_Notify_Flick
+{
+   Ecore_X_Window                win;
+   Ecore_X_Time                  time;
+   Ecore_X_Gesture_Event_Subtype subtype;
+   int                           num_fingers;
+   int                           distance;
+   Ecore_X_Time                  duration;
+   Ecore_X_Gesture_Direction     direction;
+   double                        angle;
+};
+
+struct _Ecore_X_Event_Gesture_Notify_Pan
+{
+   Ecore_X_Window                win;
+   Ecore_X_Time                  time;
+   Ecore_X_Gesture_Event_Subtype subtype;
+   int                           num_fingers;
+   int                           dx;
+   int                           dy;
+   int                           distance;
+   Ecore_X_Time                  duration;
+   Ecore_X_Gesture_Direction     direction;
+};
+
+struct _Ecore_X_Event_Gesture_Notify_PinchRotation
+{
+   Ecore_X_Window                win;
+   Ecore_X_Time                  time;
+   Ecore_X_Gesture_Event_Subtype subtype;
+   int                           num_fingers;
+   int                           distance;
+   int                           cx;
+   int                           cy;
+   double                        zoom;
+   double                        angle;
+};
+
+struct _Ecore_X_Event_Gesture_Notify_Tap
+{
+   Ecore_X_Window                win;
+   Ecore_X_Time                  time;
+   Ecore_X_Gesture_Event_Subtype subtype;
+   int                           num_fingers;
+   int                           cx;
+   int                           cy;
+   int                           tap_repeat;
+   Ecore_X_Time                  interval;
+};
+
+struct _Ecore_X_Event_Gesture_Notify_TapNHold
+{
+   Ecore_X_Window                win;
+   Ecore_X_Time                  time;
+   Ecore_X_Gesture_Event_Subtype subtype;
+   int                           num_fingers;
+   int                           cx;
+   int                           cy;
+   Ecore_X_Time                  interval;
+   Ecore_X_Time                  hold_time;
+};
+
+struct _Ecore_X_Event_Gesture_Notify_Hold
+{
+   Ecore_X_Window                win;
+   Ecore_X_Time                  time;
+   Ecore_X_Gesture_Event_Subtype subtype;
+   int                           num_fingers;
+   int                           cx;
+   int                           cy;
+   Ecore_X_Time                  hold_time;
+};
+
+struct _Ecore_X_Event_Gesture_Notify_Group
+{
+   Ecore_X_Window                win;
+   Ecore_X_Time                  time;
+   Ecore_X_Gesture_Group_Subtype subtype;
+   int                           num_groups;
+   int                           group_id;
+};
+
+EAPI Eina_Bool                             ecore_x_gesture_supported(void);
+
+EAPI Eina_Bool                             ecore_x_gesture_events_select(Ecore_X_Window win, Ecore_X_Gesture_Event_Mask mask);
+
+EAPI Ecore_X_Gesture_Event_Mask            ecore_x_gesture_events_selected_get(Ecore_X_Window win);
+
+EAPI Eina_Bool                             ecore_x_gesture_event_grab(Ecore_X_Window win, Ecore_X_Gesture_Event_Type type, int num_fingers);
+
+EAPI Eina_Bool                             ecore_x_gesture_event_ungrab(Ecore_X_Window win, Ecore_X_Gesture_Event_Type type, int num_fingers);
+
+EAPI void                                  ecore_x_e_illume_indicator_state_set(Ecore_X_Window win, Ecore_X_Illume_Indicator_State state);
+EAPI Ecore_X_Illume_Indicator_State        ecore_x_e_illume_indicator_state_get(Ecore_X_Window win);
+EAPI void                                  ecore_x_e_illume_indicator_state_send(Ecore_X_Window win, Ecore_X_Illume_Indicator_State state);
+
+EAPI void                                  ecore_x_e_illume_indicator_opacity_set(Ecore_X_Window win, Ecore_X_Illume_Indicator_Opacity_Mode mode);
+
+EAPI Ecore_X_Illume_Indicator_Opacity_Mode ecore_x_e_illume_indicator_opacity_get(Ecore_X_Window win);
+
+EAPI void                                  ecore_x_e_illume_indicator_opacity_send(Ecore_X_Window win, Ecore_X_Illume_Indicator_Opacity_Mode mode);
+
+EAPI void
+ecore_x_e_illume_window_state_set(Ecore_X_Window win,
+                                  Ecore_X_Illume_Window_State state);
+
+EAPI Ecore_X_Illume_Window_State           ecore_x_e_illume_window_state_get(Ecore_X_Window win);
+EAPI void                                  ecore_x_xkb_select_group(int group); /* @since 1.7 */
+
 #ifdef __cplusplus
 }
-#endif
+#endif // ifdef __cplusplus
+
+#include <Ecore_X_Atoms.h>
+#include <Ecore_X_Cursor.h>
 
-#endif
+#endif // ifndef _ECORE_X_H
index 4d1253d..ca6351d 100644 (file)
@@ -1,6 +1,3 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
 #ifndef _ECORE_X_ATOMS_H
 #define _ECORE_X_ATOMS_H
 
@@ -18,6 +15,8 @@ EAPI extern Ecore_X_Atom ECORE_X_ATOM_STRING;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_TEXT;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_UTF8_STRING;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_WINDOW;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_PIXMAP;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_VISUALID;
 
 /* dnd atoms */
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_XDND;
@@ -45,7 +44,7 @@ EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_MOVE;
 EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_LINK;
 EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_ASK;
 EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_PRIVATE;
+
 /* old E atom */
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_FRAME_SIZE;
 
@@ -126,6 +125,12 @@ EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
 
 /* state */
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE;
@@ -154,6 +159,8 @@ EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_BELOW;
 
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT_PARTIAL;
@@ -180,19 +187,106 @@ EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
 EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
 
-/* currenly E specific virtual keyboard extension, aim to submit to netwm spec
+/* currently E specific virtual keyboard extension, aim to submit to netwm spec
  * later */
 
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
-EAPI extern Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME;
+
+/* Illume specific atoms */
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE_LIST;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CONFORMANT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_SINGLE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_BACK;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_HOME;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_NEW;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_DEL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLOSE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_START;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_END;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_ON;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_OFF;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_OPAQUE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSLUCENT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSPARENT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_AVAILABLE_ANGLE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_ON;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_OFF;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_WINDOW_STATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_NEXT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_PREV;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_NEXT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_PREV;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN;
+
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_COUNTER;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_END;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_CANCEL;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_FLUSH;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_DUMP;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_PIXMAP;
+
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_PARENT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_POSITION;
+
+/* currently elementary and E specific extension */
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_PROFILE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_PROFILE_LIST;
+
+/* for sliding window */
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_STATE;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_GEOMETRY;
 
+/* for SDB(Samsung Debug Bridge) */
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_SDB_SERVER_CONNECT;
+EAPI extern Ecore_X_Atom ECORE_X_ATOM_SDB_SERVER_DISCONNECT;
 #endif /* _ECORE_X_ATOMS_H */
index af2e97a..807541e 100644 (file)
@@ -6,81 +6,82 @@
  * @brief Defines the various cursor types for the X Windows system.
  */
 
-#define ECORE_X_CURSOR_X 0
-#define ECORE_X_CURSOR_ARROW 2
-#define ECORE_X_CURSOR_BASED_ARROW_DOWN 4
-#define ECORE_X_CURSOR_UP 6
-#define ECORE_X_CURSOR_BOAT 8
-#define ECORE_X_CURSOR_BOTTOM_LEFT_CORNER 12
+#define ECORE_X_CURSOR_X                   0
+#define ECORE_X_CURSOR_ARROW               2
+#define ECORE_X_CURSOR_BASED_ARROW_DOWN    4
+#define ECORE_X_CURSOR_UP                  6
+#define ECORE_X_CURSOR_BOAT                8
+#define ECORE_X_CURSOR_BOGOSITY            10
+#define ECORE_X_CURSOR_BOTTOM_LEFT_CORNER  12
 #define ECORE_X_CURSOR_BOTTOM_RIGHT_CORNER 14
-#define ECORE_X_CURSOR_BOTTOM_SIDE 16
-#define ECORE_X_CURSOR_BOTTOM_TEE 18
-#define ECORE_X_CURSOR_BOX_SPIRAL 20
-#define ECORE_X_CURSOR_CENTER_PTR 22
-#define ECORE_X_CURSOR_CIRCLE 24
-#define ECORE_X_CURSOR_CLOCK 26
-#define ECORE_X_CURSOR_COFFEE_MUG 28
-#define ECORE_X_CURSOR_CROSS 30
-#define ECORE_X_CURSOR_CROSS_REVERSE 32
-#define ECORE_X_CURSOR_CROSSHAIR 34
-#define ECORE_X_CURSOR_DIAMOND_CROSS 36
-#define ECORE_X_CURSOR_DOT 38
-#define ECORE_X_CURSOR_DOT_BOX_MASK 40
-#define ECORE_X_CURSOR_DOUBLE_ARROW 42
-#define ECORE_X_CURSOR_DRAFT_LARGE 44
-#define ECORE_X_CURSOR_DRAFT_SMALL 46
-#define ECORE_X_CURSOR_DRAPED_BOX 48
-#define ECORE_X_CURSOR_EXCHANGE 50
-#define ECORE_X_CURSOR_FLEUR 52
-#define ECORE_X_CURSOR_GOBBLER 54
-#define ECORE_X_CURSOR_GUMBY 56
-#define ECORE_X_CURSOR_HAND1 58
-#define ECORE_X_CURSOR_HAND2 60
-#define ECORE_X_CURSOR_HEART 62
-#define ECORE_X_CURSOR_ICON 64
-#define ECORE_X_CURSOR_IRON_CROSS 66
-#define ECORE_X_CURSOR_LEFT_PTR 68
-#define ECORE_X_CURSOR_LEFT_SIDE 70
-#define ECORE_X_CURSOR_LEFT_TEE 72
-#define ECORE_X_CURSOR_LEFTBUTTON 74
-#define ECORE_X_CURSOR_LL_ANGLE 76
-#define ECORE_X_CURSOR_LR_ANGLE 78
-#define ECORE_X_CURSOR_MAN 80
-#define ECORE_X_CURSOR_MIDDLEBUTTON 82
-#define ECORE_X_CURSOR_MOUSE 84
-#define ECORE_X_CURSOR_PENCIL 86
-#define ECORE_X_CURSOR_PIRATE 88
-#define ECORE_X_CURSOR_PLUS 90
-#define ECORE_X_CURSOR_QUESTION_ARROW 92
-#define ECORE_X_CURSOR_RIGHT_PTR 94
-#define ECORE_X_CURSOR_RIGHT_SIDE 96
-#define ECORE_X_CURSOR_RIGHT_TEE 98
-#define ECORE_X_CURSOR_RIGHTBUTTON 100
-#define ECORE_X_CURSOR_RTL_LOGO 102
-#define ECORE_X_CURSOR_SAILBOAT 104
-#define ECORE_X_CURSOR_SB_DOWN_ARROW 106
-#define ECORE_X_CURSOR_SB_H_DOUBLE_ARROW 108
-#define ECORE_X_CURSOR_SB_LEFT_ARROW 110
-#define ECORE_X_CURSOR_SB_RIGHT_ARROW 112
-#define ECORE_X_CURSOR_SB_UP_ARROW 114
-#define ECORE_X_CURSOR_SB_V_DOUBLE_ARROW 116
-#define ECORE_X_CURSOR_SHUTTLE 118
-#define ECORE_X_CURSOR_SIZING 120
-#define ECORE_X_CURSOR_SPIDER 122
-#define ECORE_X_CURSOR_SPRAYCAN 124
-#define ECORE_X_CURSOR_STAR 126
-#define ECORE_X_CURSOR_TARGET 128
-#define ECORE_X_CURSOR_TCROSS 130
-#define ECORE_X_CURSOR_TOP_LEFT_ARROW 132
-#define ECORE_X_CURSOR_TOP_LEFT_CORNER 134
-#define ECORE_X_CURSOR_TOP_RIGHT_CORNER 136
-#define ECORE_X_CURSOR_TOP_SIDE 138
-#define ECORE_X_CURSOR_TOP_TEE 140
-#define ECORE_X_CURSOR_TREK 142
-#define ECORE_X_CURSOR_UL_ANGLE 144
-#define ECORE_X_CURSOR_UMBRELLA 146
-#define ECORE_X_CURSOR_UR_ANGLE 148
-#define ECORE_X_CURSOR_WATCH 150
-#define ECORE_X_CURSOR_XTERM 152
+#define ECORE_X_CURSOR_BOTTOM_SIDE         16
+#define ECORE_X_CURSOR_BOTTOM_TEE          18
+#define ECORE_X_CURSOR_BOX_SPIRAL          20
+#define ECORE_X_CURSOR_CENTER_PTR          22
+#define ECORE_X_CURSOR_CIRCLE              24
+#define ECORE_X_CURSOR_CLOCK               26
+#define ECORE_X_CURSOR_COFFEE_MUG          28
+#define ECORE_X_CURSOR_CROSS               30
+#define ECORE_X_CURSOR_CROSS_REVERSE       32
+#define ECORE_X_CURSOR_CROSSHAIR           34
+#define ECORE_X_CURSOR_DIAMOND_CROSS       36
+#define ECORE_X_CURSOR_DOT                 38
+#define ECORE_X_CURSOR_DOT_BOX_MASK        40
+#define ECORE_X_CURSOR_DOUBLE_ARROW        42
+#define ECORE_X_CURSOR_DRAFT_LARGE         44
+#define ECORE_X_CURSOR_DRAFT_SMALL         46
+#define ECORE_X_CURSOR_DRAPED_BOX          48
+#define ECORE_X_CURSOR_EXCHANGE            50
+#define ECORE_X_CURSOR_FLEUR               52
+#define ECORE_X_CURSOR_GOBBLER             54
+#define ECORE_X_CURSOR_GUMBY               56
+#define ECORE_X_CURSOR_HAND1               58
+#define ECORE_X_CURSOR_HAND2               60
+#define ECORE_X_CURSOR_HEART               62
+#define ECORE_X_CURSOR_ICON                64
+#define ECORE_X_CURSOR_IRON_CROSS          66
+#define ECORE_X_CURSOR_LEFT_PTR            68
+#define ECORE_X_CURSOR_LEFT_SIDE           70
+#define ECORE_X_CURSOR_LEFT_TEE            72
+#define ECORE_X_CURSOR_LEFTBUTTON          74
+#define ECORE_X_CURSOR_LL_ANGLE            76
+#define ECORE_X_CURSOR_LR_ANGLE            78
+#define ECORE_X_CURSOR_MAN                 80
+#define ECORE_X_CURSOR_MIDDLEBUTTON        82
+#define ECORE_X_CURSOR_MOUSE               84
+#define ECORE_X_CURSOR_PENCIL              86
+#define ECORE_X_CURSOR_PIRATE              88
+#define ECORE_X_CURSOR_PLUS                90
+#define ECORE_X_CURSOR_QUESTION_ARROW      92
+#define ECORE_X_CURSOR_RIGHT_PTR           94
+#define ECORE_X_CURSOR_RIGHT_SIDE          96
+#define ECORE_X_CURSOR_RIGHT_TEE           98
+#define ECORE_X_CURSOR_RIGHTBUTTON         100
+#define ECORE_X_CURSOR_RTL_LOGO            102
+#define ECORE_X_CURSOR_SAILBOAT            104
+#define ECORE_X_CURSOR_SB_DOWN_ARROW       106
+#define ECORE_X_CURSOR_SB_H_DOUBLE_ARROW   108
+#define ECORE_X_CURSOR_SB_LEFT_ARROW       110
+#define ECORE_X_CURSOR_SB_RIGHT_ARROW      112
+#define ECORE_X_CURSOR_SB_UP_ARROW         114
+#define ECORE_X_CURSOR_SB_V_DOUBLE_ARROW   116
+#define ECORE_X_CURSOR_SHUTTLE             118
+#define ECORE_X_CURSOR_SIZING              120
+#define ECORE_X_CURSOR_SPIDER              122
+#define ECORE_X_CURSOR_SPRAYCAN            124
+#define ECORE_X_CURSOR_STAR                126
+#define ECORE_X_CURSOR_TARGET              128
+#define ECORE_X_CURSOR_TCROSS              130
+#define ECORE_X_CURSOR_TOP_LEFT_ARROW      132
+#define ECORE_X_CURSOR_TOP_LEFT_CORNER     134
+#define ECORE_X_CURSOR_TOP_RIGHT_CORNER    136
+#define ECORE_X_CURSOR_TOP_SIDE            138
+#define ECORE_X_CURSOR_TOP_TEE             140
+#define ECORE_X_CURSOR_TREK                142
+#define ECORE_X_CURSOR_UL_ANGLE            144
+#define ECORE_X_CURSOR_UMBRELLA            146
+#define ECORE_X_CURSOR_UR_ANGLE            148
+#define ECORE_X_CURSOR_WATCH               150
+#define ECORE_X_CURSOR_XTERM               152
 
-#endif
+#endif // ifndef _ECORE_X_CURSOR_H
index 9e6a8fd..b14fc7d 100644 (file)
@@ -1,7 +1,5 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-if BUILD_ECORE_X
-
 SUBDIRS = xlib xcb
 
 if BUILD_ECORE_X_XCB
@@ -12,25 +10,21 @@ endif
 
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
--I$(top_srcdir)/src/lib/ecore_txt \
 -I$(top_builddir)/src/lib/ecore \
--I$(top_builddir)/src/lib/ecore_txt
+@EINA_CFLAGS@
 
 lib_LTLIBRARIES = libecore_x.la
 
 libecore_x_la_SOURCES =
 
-libecore_x_la_LIBADD = $(DEP)
-
-libecore_x_la_LDFLAGS = -version-info @version_info@
-
+libecore_x_la_LIBADD = $(DEP) @EINA_LIBS@
+libecore_x_la_LDFLAGS = -version-info @version_info@ @release_info@
 libecore_x_la_DEPENDENCIES = $(DEP)
 
-include_HEADERS = \
+includes_HEADERS = \
 Ecore_X.h \
 Ecore_X_Atoms.h \
 Ecore_X_Cursor.h
-
-endif
+includesdir = $(includedir)/ecore-@VMAJ@
 
 EXTRA_DIST = ecore_x_atoms_decl.h
index 08e9b2f..df1f1a7 100644 (file)
@@ -1,83 +1,85 @@
 /* generic atoms */
-EAPI Ecore_X_Atom ECORE_X_ATOM_ATOM                     = 0;
-EAPI Ecore_X_Atom ECORE_X_ATOM_CARDINAL                 = 0;
-EAPI Ecore_X_Atom ECORE_X_ATOM_COMPOUND_TEXT            = 0;
-EAPI Ecore_X_Atom ECORE_X_ATOM_FILE_NAME                = 0;
-EAPI Ecore_X_Atom ECORE_X_ATOM_STRING                   = 0;
-EAPI Ecore_X_Atom ECORE_X_ATOM_TEXT                     = 0;
-EAPI Ecore_X_Atom ECORE_X_ATOM_UTF8_STRING              = 0;
-EAPI Ecore_X_Atom ECORE_X_ATOM_WINDOW                   = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_ATOM = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_CARDINAL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_COMPOUND_TEXT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_FILE_NAME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_STRING = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_TEXT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_UTF8_STRING = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WINDOW = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_PIXMAP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_VISUALID = 0;
 
 /* dnd atoms */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_PROP_XDND     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_XDND          = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_AWARE              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ENTER              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_TYPE_LIST          = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_POSITION           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ACTION_COPY        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ACTION_MOVE        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ACTION_PRIVATE     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ACTION_ASK         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ACTION_LIST        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ACTION_LINK        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_ACTION_DESCRIPTION = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_PROXY              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_STATUS             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_LEAVE              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_DROP               = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_XDND_FINISHED           = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_XDND = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_XDND = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_AWARE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ENTER = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_TYPE_LIST = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_POSITION = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_COPY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_MOVE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_PRIVATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_ASK = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_LIST = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_LINK = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_DESCRIPTION = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_PROXY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_STATUS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_LEAVE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_DROP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_FINISHED = 0;
 
 /* dnd atoms that need to be exposed to the application interface */
-EAPI Ecore_X_Atom  ECORE_X_DND_ACTION_COPY              = 0;
-EAPI Ecore_X_Atom  ECORE_X_DND_ACTION_MOVE              = 0;
-EAPI Ecore_X_Atom  ECORE_X_DND_ACTION_LINK              = 0;
-EAPI Ecore_X_Atom  ECORE_X_DND_ACTION_ASK               = 0;
-EAPI Ecore_X_Atom  ECORE_X_DND_ACTION_PRIVATE           = 0;
+EAPI Ecore_X_Atom ECORE_X_DND_ACTION_COPY = 0;
+EAPI Ecore_X_Atom ECORE_X_DND_ACTION_MOVE = 0;
+EAPI Ecore_X_Atom ECORE_X_DND_ACTION_LINK = 0;
+EAPI Ecore_X_Atom ECORE_X_DND_ACTION_ASK = 0;
+EAPI Ecore_X_Atom ECORE_X_DND_ACTION_PRIVATE = 0;
 
 /* old E atom */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_FRAME_SIZE            = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_FRAME_SIZE = 0;
 
 /* old Gnome atom */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WIN_LAYER               = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WIN_LAYER = 0;
 
 /* ICCCM atoms */
 
 /* ICCCM: client properties */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_NAME                 = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_ICON_NAME            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_NORMAL_HINTS         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_SIZE_HINTS           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_HINTS                = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_CLASS                = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_TRANSIENT_FOR        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_PROTOCOLS            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_COLORMAP_WINDOWS     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_COMMAND              = 0; /* obsolete */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_CLIENT_MACHINE       = 0; /* obsolete */
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_NAME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_ICON_NAME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_NORMAL_HINTS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_SIZE_HINTS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_HINTS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CLASS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_TRANSIENT_FOR = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_PROTOCOLS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_COLORMAP_WINDOWS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_COMMAND = 0; /* obsolete */
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CLIENT_MACHINE = 0; /* obsolete */
 
 /* ICCCM: window manager properties */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_STATE                = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_ICON_SIZE            = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_ICON_SIZE = 0;
 
 /* ICCCM: WM_STATE  property */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_CHANGE_STATE         = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CHANGE_STATE = 0;
 
 /* ICCCM: WM_PROTOCOLS properties */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_TAKE_FOCUS           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_SAVE_YOURSELF        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_DELETE_WINDOW        = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_TAKE_FOCUS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_SAVE_YOURSELF = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_DELETE_WINDOW = 0;
 
 /* ICCCM: WM_COLORMAP properties */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_COLORMAP_NOTIFY      = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_COLORMAP_NOTIFY = 0;
 
 /* ICCCM: session management properties */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SM_CLIENT_ID            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_CLIENT_LEADER        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_WM_WINDOW_ROLE          = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SM_CLIENT_ID = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CLIENT_LEADER = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_WM_WINDOW_ROLE = 0;
 
 /* Motif WM atom */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_MOTIF_WM_HINTS          = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_MOTIF_WM_HINTS = 0;
 
 /* NetWM 1.3 atoms (http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html) */
 
@@ -85,135 +87,529 @@ EAPI Ecore_X_Atom  ECORE_X_ATOM_MOTIF_WM_HINTS          = 0;
  * NetWM: Root Window Properties and related messages (complete)
  */
 
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_SUPPORTED                  = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_CLIENT_LIST                = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_CLIENT_LIST_STACKING       = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_DESKTOP_GEOMETRY           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_DESKTOP_VIEWPORT           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_CURRENT_DESKTOP            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_DESKTOP_NAMES              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_ACTIVE_WINDOW              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WORKAREA                   = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_VIRTUAL_ROOTS              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_DESKTOP_LAYOUT             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_SHOWING_DESKTOP            = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTED = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST_STACKING = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_GEOMETRY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_VIEWPORT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CURRENT_DESKTOP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_NAMES = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_ACTIVE_WINDOW = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WORKAREA = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_VIRTUAL_ROOTS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_LAYOUT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_SHOWING_DESKTOP = 0;
 
 /*
  * NetWM: Other Root Window Messages (complete)
  */
 
 /* pager */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_CLOSE_WINDOW               = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_MOVERESIZE_WINDOW          = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_MOVERESIZE              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_RESTACK_WINDOW             = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CLOSE_WINDOW = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_MOVERESIZE_WINDOW = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_MOVERESIZE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW = 0;
 
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS      = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS = 0;
 
 /*
  * NetWM: Application Window Properties (complete)
  */
 
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_NAME                    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_VISIBLE_NAME            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ICON_NAME               = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME       = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_DESKTOP                 = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_NAME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_NAME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_NAME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP = 0;
 
 /* window type */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH      = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG      = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL      = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND = 0;
 
 /* state */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE                   = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_MODAL             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_STICKY            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_SHADED            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR      = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_HIDDEN            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN        = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_ABOVE             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_BELOW             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MODAL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_STICKY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SHADED = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_HIDDEN = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_ABOVE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_BELOW = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION = 0;
 
 /* allowed actions */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_MOVE             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_RESIZE           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_SHADE            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_STICK            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN       = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP   = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ACTION_CLOSE            = 0;
-
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STRUT                   = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_STRUT_PARTIAL           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ICON_GEOMETRY           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_ICON                    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_PID                     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_HANDLED_ICONS           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_USER_TIME               = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_STARTUP_ID                 = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_FRAME_EXTENTS              = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MOVE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_RESIZE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_SHADE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_STICK = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CLOSE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_ABOVE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_BELOW = 0;
+
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT_PARTIAL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_GEOMETRY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_PID = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_ID = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS = 0;
 
 /*
  * NetWM: Window Manager Protocols (complete)
  */
 
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_PING                    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_SYNC_REQUEST            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER    = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_PING = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER = 0;
 
 /*
  * NetWM: Not in the spec
  */
 
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_OPACITY          = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_SHADOW           = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_WM_WINDOW_SHADE            = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_SHADOW = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_SHADE = 0;
 
 /*
  * Startup Notification (http://standards.freedesktop.org/startup-notification-spec/startup-notification-0.1.txt)
  */
 
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_NET_STARTUP_INFO               = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO = 0;
 
 /* selection atoms */
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_TARGETS              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_PRIMARY              = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_SECONDARY            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_CLIPBOARD            = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_PROP_PRIMARY         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_PROP_SECONDARY       = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD       = 0;
-
-/* currenly E specific virtual keyboard extension, aim to submit to netwm spec
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_TARGETS = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PRIMARY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_SECONDARY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_CLIPBOARD = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_PRIMARY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_SECONDARY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD = 0;
+
+/* currently E specific virtual keyboard extension, aim to submit to netwm spec
  * later */
 
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD             = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE       = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON          = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA       = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC     = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER= 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX         = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL    = 0;
-EAPI Ecore_X_Atom  ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD    = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME = 0;
+
+/* currently E specific illume extension */
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE_LIST = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CONFORMANT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_SINGLE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_BACK = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_HOME = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLOSE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_NEW = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_DEL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_START = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_END = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_ON = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_OFF = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_OPAQUE= 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSLUCENT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSPARENT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_AVAILABLE_ANGLE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_ON = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLIPBOARD_OFF = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_WINDOW_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_NEXT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_PREV = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_NEXT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_PREV = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN = 0;
+
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_COUNTER = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_BEGIN = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_END = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_CANCEL = 0;
+
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_FLUSH = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_DUMP = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_PIXMAP = 0;
+
+/* currently Emotion and E17 specific extension */
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_PARENT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_POSITION = 0;
+
+/* for sliding window */
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_STATE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_GEOMETRY = 0;
+
+/* for SDB(Samsung Debug Bridge) */
+EAPI Ecore_X_Atom ECORE_X_ATOM_SDB_SERVER_CONNECT = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_SDB_SERVER_DISCONNECT = 0;
+
+/* currently elementary and E specific extension */
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_PROFILE = 0;
+EAPI Ecore_X_Atom ECORE_X_ATOM_E_PROFILE_LIST = 0;
+
+typedef struct _Atom_Item Atom_Item;
+
+struct _Atom_Item
+{
+   const char   *name;
+   Ecore_X_Atom *atom;
+};
+
+const Atom_Item atom_items[] =
+{
+   { "ATOM", &ECORE_X_ATOM_ATOM },
+   { "CARDINAL", &ECORE_X_ATOM_CARDINAL },
+   { "COMPOUND_TEXT", &ECORE_X_ATOM_COMPOUND_TEXT },
+   { "FILE_NAME", &ECORE_X_ATOM_FILE_NAME },
+   { "STRING", &ECORE_X_ATOM_STRING },
+   { "TEXT", &ECORE_X_ATOM_TEXT },
+   { "UTF8_STRING", &ECORE_X_ATOM_UTF8_STRING },
+   { "WINDOW", &ECORE_X_ATOM_WINDOW },
+   { "PIXMAP", &ECORE_X_ATOM_PIXMAP },
+   { "VISUALID", &ECORE_X_ATOM_VISUALID },
+
+   { "JXSelectionWindowProperty", &ECORE_X_ATOM_SELECTION_PROP_XDND },
+   { "XdndSelection", &ECORE_X_ATOM_SELECTION_XDND },
+   { "XdndAware", &ECORE_X_ATOM_XDND_AWARE },
+   { "XdndEnter", &ECORE_X_ATOM_XDND_ENTER },
+   { "XdndTypeList", &ECORE_X_ATOM_XDND_TYPE_LIST },
+   { "XdndPosition", &ECORE_X_ATOM_XDND_POSITION },
+   { "XdndActionCopy", &ECORE_X_ATOM_XDND_ACTION_COPY },
+   { "XdndActionMove", &ECORE_X_ATOM_XDND_ACTION_MOVE },
+   { "XdndActionPrivate", &ECORE_X_ATOM_XDND_ACTION_PRIVATE },
+   { "XdndActionAsk", &ECORE_X_ATOM_XDND_ACTION_ASK },
+   { "XdndActionList", &ECORE_X_ATOM_XDND_ACTION_LIST },
+   { "XdndActionLink", &ECORE_X_ATOM_XDND_ACTION_LINK },
+   { "XdndActionDescription", &ECORE_X_ATOM_XDND_ACTION_DESCRIPTION },
+   { "XdndProxy", &ECORE_X_ATOM_XDND_PROXY },
+   { "XdndStatus", &ECORE_X_ATOM_XDND_STATUS },
+   { "XdndLeave", &ECORE_X_ATOM_XDND_LEAVE },
+   { "XdndDrop", &ECORE_X_ATOM_XDND_DROP },
+   { "XdndFinished", &ECORE_X_ATOM_XDND_FINISHED },
+
+   { "XdndActionCopy", &ECORE_X_DND_ACTION_COPY },
+   { "XdndActionMove", &ECORE_X_DND_ACTION_MOVE },
+   { "XdndActionLink", &ECORE_X_DND_ACTION_LINK },
+   { "XdndActionAsk", &ECORE_X_DND_ACTION_ASK },
+   { "XdndActionPrivate", &ECORE_X_DND_ACTION_PRIVATE },
+
+   { "_E_FRAME_SIZE", &ECORE_X_ATOM_E_FRAME_SIZE },
+
+   { "_WIN_LAYER", &ECORE_X_ATOM_WIN_LAYER },
+
+   { "WM_NAME", &ECORE_X_ATOM_WM_NAME },
+   { "WM_ICON_NAME", &ECORE_X_ATOM_WM_ICON_NAME },
+   { "WM_NORMAL_HINTS", &ECORE_X_ATOM_WM_NORMAL_HINTS },
+   { "WM_SIZE_HINTS", &ECORE_X_ATOM_WM_SIZE_HINTS },
+   { "WM_HINTS", &ECORE_X_ATOM_WM_HINTS },
+   { "WM_CLASS", &ECORE_X_ATOM_WM_CLASS },
+   { "WM_TRANSIENT_FOR", &ECORE_X_ATOM_WM_TRANSIENT_FOR },
+   { "WM_PROTOCOLS", &ECORE_X_ATOM_WM_PROTOCOLS },
+   { "WM_COLORMAP_WINDOWS", &ECORE_X_ATOM_WM_COLORMAP_WINDOWS },
+   { "WM_COMMAND", &ECORE_X_ATOM_WM_COMMAND },
+   { "WM_CLIENT_MACHINE", &ECORE_X_ATOM_WM_CLIENT_MACHINE },
+
+   { "WM_STATE", &ECORE_X_ATOM_WM_STATE },
+   { "WM_ICON_SIZE", &ECORE_X_ATOM_WM_ICON_SIZE },
+
+   { "WM_CHANGE_STATE", &ECORE_X_ATOM_WM_CHANGE_STATE },
+
+   { "WM_TAKE_FOCUS", &ECORE_X_ATOM_WM_TAKE_FOCUS },
+   { "WM_SAVE_YOURSELF", &ECORE_X_ATOM_WM_SAVE_YOURSELF },
+   { "WM_DELETE_WINDOW", &ECORE_X_ATOM_WM_DELETE_WINDOW },
+
+   { "WM_COLORMAP_NOTIFY", &ECORE_X_ATOM_WM_COLORMAP_NOTIFY },
+
+   { "SM_CLIENT_ID", &ECORE_X_ATOM_SM_CLIENT_ID },
+   { "WM_CLIENT_LEADER", &ECORE_X_ATOM_WM_CLIENT_LEADER },
+   { "WM_WINDOW_ROLE", &ECORE_X_ATOM_WM_WINDOW_ROLE },
+
+   { "_MOTIF_WM_HINTS", &ECORE_X_ATOM_MOTIF_WM_HINTS },
+
+   { "_NET_SUPPORTED", &ECORE_X_ATOM_NET_SUPPORTED },
+   { "_NET_CLIENT_LIST", &ECORE_X_ATOM_NET_CLIENT_LIST },
+   { "_NET_CLIENT_LIST_STACKING", &ECORE_X_ATOM_NET_CLIENT_LIST_STACKING },
+   { "_NET_NUMBER_OF_DESKTOPS", &ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS },
+   { "_NET_DESKTOP_GEOMETRY", &ECORE_X_ATOM_NET_DESKTOP_GEOMETRY },
+   { "_NET_DESKTOP_VIEWPORT", &ECORE_X_ATOM_NET_DESKTOP_VIEWPORT },
+   { "_NET_CURRENT_DESKTOP", &ECORE_X_ATOM_NET_CURRENT_DESKTOP },
+   { "_NET_DESKTOP_NAMES", &ECORE_X_ATOM_NET_DESKTOP_NAMES },
+   { "_NET_ACTIVE_WINDOW", &ECORE_X_ATOM_NET_ACTIVE_WINDOW },
+   { "_NET_WORKAREA", &ECORE_X_ATOM_NET_WORKAREA },
+   { "_NET_SUPPORTING_WM_CHECK", &ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK },
+   { "_NET_VIRTUAL_ROOTS", &ECORE_X_ATOM_NET_VIRTUAL_ROOTS },
+   { "_NET_DESKTOP_LAYOUT", &ECORE_X_ATOM_NET_DESKTOP_LAYOUT },
+   { "_NET_SHOWING_DESKTOP", &ECORE_X_ATOM_NET_SHOWING_DESKTOP },
+
+   { "_NET_CLOSE_WINDOW", &ECORE_X_ATOM_NET_CLOSE_WINDOW },
+   { "_NET_MOVERESIZE_WINDOW", &ECORE_X_ATOM_NET_MOVERESIZE_WINDOW },
+   { "_NET_WM_MOVERESIZE", &ECORE_X_ATOM_NET_WM_MOVERESIZE },
+   { "_NET_RESTACK_WINDOW", &ECORE_X_ATOM_NET_RESTACK_WINDOW },
+
+   { "_NET_REQUEST_FRAME_EXTENTS", &ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS },
+
+   { "_NET_WM_NAME", &ECORE_X_ATOM_NET_WM_NAME },
+   { "_NET_WM_VISIBLE_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_NAME },
+   { "_NET_WM_ICON_NAME", &ECORE_X_ATOM_NET_WM_ICON_NAME },
+   { "_NET_WM_VISIBLE_ICON_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME },
+   { "_NET_WM_DESKTOP", &ECORE_X_ATOM_NET_WM_DESKTOP },
+
+   { "_NET_WM_WINDOW_TYPE", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE },
+   { "_NET_WM_WINDOW_TYPE_DESKTOP", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP },
+   { "_NET_WM_WINDOW_TYPE_DOCK", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK },
+   { "_NET_WM_WINDOW_TYPE_TOOLBAR", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR },
+   { "_NET_WM_WINDOW_TYPE_MENU", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU },
+   { "_NET_WM_WINDOW_TYPE_UTILITY", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY },
+   { "_NET_WM_WINDOW_TYPE_SPLASH", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH },
+   { "_NET_WM_WINDOW_TYPE_DIALOG", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG },
+   { "_NET_WM_WINDOW_TYPE_NORMAL", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL },
+   { "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU",
+     &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU },
+   { "_NET_WM_WINDOW_TYPE_POPUP_MENU",
+     &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU },
+   { "_NET_WM_WINDOW_TYPE_TOOLTIP", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP },
+   { "_NET_WM_WINDOW_TYPE_NOTIFICATION",
+     &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION },
+   { "_NET_WM_WINDOW_TYPE_COMBO", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO },
+   { "_NET_WM_WINDOW_TYPE_DND", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND },
+
+   { "_NET_WM_STATE", &ECORE_X_ATOM_NET_WM_STATE },
+   { "_NET_WM_STATE_MODAL", &ECORE_X_ATOM_NET_WM_STATE_MODAL },
+   { "_NET_WM_STATE_STICKY", &ECORE_X_ATOM_NET_WM_STATE_STICKY },
+   { "_NET_WM_STATE_MAXIMIZED_VERT",
+     &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT },
+   { "_NET_WM_STATE_MAXIMIZED_HORZ",
+     &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ },
+   { "_NET_WM_STATE_SHADED", &ECORE_X_ATOM_NET_WM_STATE_SHADED },
+   { "_NET_WM_STATE_SKIP_TASKBAR", &ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR },
+   { "_NET_WM_STATE_SKIP_PAGER", &ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER },
+   { "_NET_WM_STATE_HIDDEN", &ECORE_X_ATOM_NET_WM_STATE_HIDDEN },
+   { "_NET_WM_STATE_FULLSCREEN", &ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN },
+   { "_NET_WM_STATE_ABOVE", &ECORE_X_ATOM_NET_WM_STATE_ABOVE },
+   { "_NET_WM_STATE_BELOW", &ECORE_X_ATOM_NET_WM_STATE_BELOW },
+   { "_NET_WM_STATE_DEMANDS_ATTENTION",
+     &ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION },
+
+   { "_NET_WM_ALLOWED_ACTIONS", &ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS },
+   { "_NET_WM_ACTION_MOVE", &ECORE_X_ATOM_NET_WM_ACTION_MOVE },
+   { "_NET_WM_ACTION_RESIZE", &ECORE_X_ATOM_NET_WM_ACTION_RESIZE },
+   { "_NET_WM_ACTION_MINIMIZE", &ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE },
+   { "_NET_WM_ACTION_SHADE", &ECORE_X_ATOM_NET_WM_ACTION_SHADE },
+   { "_NET_WM_ACTION_STICK", &ECORE_X_ATOM_NET_WM_ACTION_STICK },
+   { "_NET_WM_ACTION_MAXIMIZE_HORZ",
+     &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ },
+   { "_NET_WM_ACTION_MAXIMIZE_VERT",
+     &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT },
+   { "_NET_WM_ACTION_FULLSCREEN", &ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN },
+   { "_NET_WM_ACTION_CHANGE_DESKTOP",
+     &ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP },
+   { "_NET_WM_ACTION_CLOSE", &ECORE_X_ATOM_NET_WM_ACTION_CLOSE },
+   { "_NET_WM_ACTION_ABOVE", &ECORE_X_ATOM_NET_WM_ACTION_ABOVE },
+   { "_NET_WM_ACTION_BELOW", &ECORE_X_ATOM_NET_WM_ACTION_BELOW },
+
+   { "_NET_WM_STRUT", &ECORE_X_ATOM_NET_WM_STRUT },
+   { "_NET_WM_STRUT_PARTIAL", &ECORE_X_ATOM_NET_WM_STRUT_PARTIAL },
+   { "_NET_WM_ICON_GEOMETRY", &ECORE_X_ATOM_NET_WM_ICON_GEOMETRY },
+   { "_NET_WM_ICON", &ECORE_X_ATOM_NET_WM_ICON },
+   { "_NET_WM_PID", &ECORE_X_ATOM_NET_WM_PID },
+   { "_NET_WM_HANDLED_ICONS", &ECORE_X_ATOM_NET_WM_HANDLED_ICONS },
+   { "_NET_WM_USER_TIME", &ECORE_X_ATOM_NET_WM_USER_TIME },
+   { "_NET_STARTUP_ID", &ECORE_X_ATOM_NET_STARTUP_ID },
+   { "_NET_FRAME_EXTENTS", &ECORE_X_ATOM_NET_FRAME_EXTENTS },
+
+   { "_NET_WM_PING", &ECORE_X_ATOM_NET_WM_PING },
+   { "_NET_WM_SYNC_REQUEST", &ECORE_X_ATOM_NET_WM_SYNC_REQUEST },
+   { "_NET_WM_SYNC_REQUEST_COUNTER",
+     &ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER },
+
+   { "_NET_WM_WINDOW_OPACITY", &ECORE_X_ATOM_NET_WM_WINDOW_OPACITY },
+   { "_NET_WM_WINDOW_SHADOW", &ECORE_X_ATOM_NET_WM_WINDOW_SHADOW },
+   { "_NET_WM_WINDOW_SHADE", &ECORE_X_ATOM_NET_WM_WINDOW_SHADE },
+
+   { "TARGETS", &ECORE_X_ATOM_SELECTION_TARGETS },
+   { "CLIPBOARD", &ECORE_X_ATOM_SELECTION_CLIPBOARD },
+   { "PRIMARY", &ECORE_X_ATOM_SELECTION_PRIMARY },
+   { "SECONDARY", &ECORE_X_ATOM_SELECTION_SECONDARY },
+   { "_ECORE_SELECTION_PRIMARY", &ECORE_X_ATOM_SELECTION_PROP_PRIMARY },
+   { "_ECORE_SELECTION_SECONDARY", &ECORE_X_ATOM_SELECTION_PROP_SECONDARY },
+   { "_ECORE_SELECTION_CLIPBOARD", &ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD },
+
+   { "_E_VIRTUAL_KEYBOARD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD },
+   { "_E_VIRTUAL_KEYBOARD_STATE", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE },
+   { "_E_VIRTUAL_KEYBOARD_ON", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON },
+   { "_E_VIRTUAL_KEYBOARD_OFF", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF },
+   { "_E_VIRTUAL_KEYBOARD_ALPHA", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA },
+   { "_E_VIRTUAL_KEYBOARD_NUMERIC", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC },
+   { "_E_VIRTUAL_KEYBOARD_PIN", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN },
+   { "_E_VIRTUAL_KEYBOARD_PHONE_NUMBER",
+     &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER },
+   { "_E_VIRTUAL_KEYBOARD_HEX", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX },
+   { "_E_VIRTUAL_KEYBOARD_TERMINAL",
+     &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL },
+   { "_E_VIRTUAL_KEYBOARD_PASSWORD",
+     &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD },
+   { "_E_VIRTUAL_KEYBOARD_IP", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP },
+   { "_E_VIRTUAL_KEYBOARD_HOST", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST },
+   { "_E_VIRTUAL_KEYBOARD_FILE", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE },
+   { "_E_VIRTUAL_KEYBOARD_URL", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL },
+   { "_E_VIRTUAL_KEYBOARD_KEYPAD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD },
+   { "_E_VIRTUAL_KEYBOARD_J2ME", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME },
+
+   { "_E_ILLUME_ZONE", &ECORE_X_ATOM_E_ILLUME_ZONE },
+   { "_E_ILLUME_ZONE_LIST", &ECORE_X_ATOM_E_ILLUME_ZONE_LIST },
+   { "_E_ILLUME_CONFORMANT", &ECORE_X_ATOM_E_ILLUME_CONFORMANT },
+   { "_E_ILLUME_MODE", &ECORE_X_ATOM_E_ILLUME_MODE },
+   { "_E_ILLUME_MODE_SINGLE", &ECORE_X_ATOM_E_ILLUME_MODE_SINGLE },
+   { "_E_ILLUME_MODE_DUAL_TOP", &ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP },
+   { "_E_ILLUME_MODE_DUAL_LEFT", &ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT },
+   { "_E_ILLUME_FOCUS_BACK", &ECORE_X_ATOM_E_ILLUME_FOCUS_BACK },
+   { "_E_ILLUME_FOCUS_FORWARD", &ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD },
+   { "_E_ILLUME_FOCUS_HOME", &ECORE_X_ATOM_E_ILLUME_FOCUS_HOME },
+   { "_E_ILLUME_CLOSE", &ECORE_X_ATOM_E_ILLUME_CLOSE },
+   { "_E_ILLUME_HOME_NEW", &ECORE_X_ATOM_E_ILLUME_HOME_NEW },
+   { "_E_ILLUME_HOME_DEL", &ECORE_X_ATOM_E_ILLUME_HOME_DEL },
+   { "_E_ILLUME_DRAG", &ECORE_X_ATOM_E_ILLUME_DRAG },
+   { "_E_ILLUME_DRAG_LOCKED", &ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED },
+   { "_E_ILLUME_DRAG_START", &ECORE_X_ATOM_E_ILLUME_DRAG_START },
+   { "_E_ILLUME_DRAG_END", &ECORE_X_ATOM_E_ILLUME_DRAG_END },
+   { "_E_ILLUME_INDICATOR_GEOMETRY",
+     &ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY },
+   { "_E_ILLUME_SOFTKEY_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY },
+   { "_E_ILLUME_KEYBOARD_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY },
+   { "_E_ILLUME_QUICKPANEL", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL },
+   { "_E_ILLUME_QUICKPANEL_STATE", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE },
+   { "_E_ILLUME_QUICKPANEL_STATE_TOGGLE",
+     &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE },
+   { "_E_ILLUME_QUICKPANEL_ON", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON },
+   { "_E_ILLUME_QUICKPANEL_OFF", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF },
+   { "_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR",
+     &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR },
+   { "_E_ILLUME_QUICKPANEL_PRIORITY_MINOR",
+     &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR },
+   { "_E_ILLUME_QUICKPANEL_ZONE", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE },
+   { "_E_ILLUME_QUICKPANEL_POSITION_UPDATE",
+     &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE },
+   { "_E_ILLUME_INDICATOR_STATE", &ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE },
+   { "_E_ILLUME_INDICATOR_ON", &ECORE_X_ATOM_E_ILLUME_INDICATOR_ON },
+   { "_E_ILLUME_INDICATOR_OFF", &ECORE_X_ATOM_E_ILLUME_INDICATOR_OFF },
+   { "_E_ILLUME_INDICATOR_OPACITY_MODE", &ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE },
+   { "_E_ILLUME_INDICATOR_OPAQUE", &ECORE_X_ATOM_E_ILLUME_INDICATOR_OPAQUE },
+   { "_E_ILLUME_INDICATOR_TRANSLUCENT", &ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSLUCENT },
+   { "_E_ILLUME_INDICATOR_TRANSPARENT", &ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSPARENT },
+   { "_E_ILLUME_ROTATE_WINDOW_AVAILABLE_ANGLES", &ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_AVAILABLE_ANGLE },
+   { "_E_ILLUME_ROTATE_WINDOW_ANGLE", &ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE },
+   { "_E_ILLUME_ROTATE_ROOT_ANGLE", &ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE },
+   { "_E_ILLUME_CLIPBOARD_STATE", &ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE },
+   { "_E_ILLUME_CLIPBOARD_ON", &ECORE_X_ATOM_E_ILLUME_CLIPBOARD_ON },
+   { "_E_ILLUME_CLIPBOARD_OFF", &ECORE_X_ATOM_E_ILLUME_CLIPBOARD_OFF },
+   { "_E_ILLUME_CLIPBOARD_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY },
+   { "_E_ILLUME_WINDOW_STATE", &ECORE_X_ATOM_E_ILLUME_WINDOW_STATE },
+   { "_E_ILLUME_WINDOW_STATE_NORMAL", &ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL },
+   { "_E_ILLUME_WINDOW_STATE_FLOATING", &ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING },
+   { "_E_ILLUME_ACCESS_CONTROL", &ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL },
+   { "_E_ILLUME_ACCESS_ACTION_NEXT", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_NEXT },
+   { "_E_ILLUME_ACCESS_ACTION_PREV", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_PREV },
+   { "_E_ILLUME_ACCESS_ACTION_ACTIVATE", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE },
+   { "_E_ILLUME_ACCESS_ACTION_READ", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ },
+   { "_E_ILLUME_ACCESS_ACTION_READ_NEXT", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_NEXT },
+   { "_E_ILLUME_ACCESS_ACTION_READ_PREV", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_PREV },
+   { "_E_ILLUME_ACCESS_ACTION_UP", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP },
+   { "_E_ILLUME_ACCESS_ACTION_DOWN", &ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN },
+   { "_E_COMP_SYNC_COUNTER", &ECORE_X_ATOM_E_COMP_SYNC_COUNTER },
+   { "_E_COMP_SYNC_DRAW_DONE", &ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE },
+   { "_E_COMP_SYNC_SUPPORTED", &ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED },
+   { "_E_COMP_SYNC_BEGIN", &ECORE_X_ATOM_E_COMP_SYNC_BEGIN },
+   { "_E_COMP_SYNC_END", &ECORE_X_ATOM_E_COMP_SYNC_END },
+   { "_E_COMP_SYNC_CANCEL", &ECORE_X_ATOM_E_COMP_SYNC_CANCEL },
+
+   { "_E_COMP_FLUSH", &ECORE_X_ATOM_E_COMP_FLUSH },
+   { "_E_COMP_DUMP", &ECORE_X_ATOM_E_COMP_DUMP },
+   { "_E_COMP_PIXMAP", &ECORE_X_ATOM_E_COMP_PIXMAP },
+   { "_E_VIDEO_PARENT", &ECORE_X_ATOM_E_VIDEO_PARENT },
+   { "_E_VIDEO_POSITION", &ECORE_X_ATOM_E_VIDEO_POSITION },
+
+   { "_E_PROFILE", &ECORE_X_ATOM_E_PROFILE },
+   { "_E_PROFILE_LIST", &ECORE_X_ATOM_E_PROFILE_LIST }
+
+   /* SLP additions after the comma */ ,
+
+   /* for sliding window */
+   { "_E_ILLUME_SLIDING_WIN_STATE", &ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_STATE },
+   { "_E_ILLUME_SLIDING_WIN_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_GEOMETRY },
+
+   /* for SDB(Samsung Debug Bridge) */
+   { "_SDB_SERVER_CONNECT", &ECORE_X_ATOM_SDB_SERVER_CONNECT },
+   { "_SDB_SERVER_DISCONNECT", &ECORE_X_ATOM_SDB_SERVER_DISCONNECT }
+};
+
index 39dde65..366ebfd 100644 (file)
@@ -1,81 +1,98 @@
 
-MAINTAINERCLEANFILES = Makefile.in
+MAINTAINERCLEANFILES = Makefile.in ecore_xcb_keysym_table.h
 
 if BUILD_ECORE_X_XCB
 
 AM_CPPFLAGS = \
-@XCB_DAMAGE_CFLAGS@ \
-@XCB_COMPOSITE_CFLAGS@ \
-@XCB_DPMS_CFLAGS@ \
-@XCB_RANDR_CFLAGS@ \
-@XCB_RENDER_CFLAGS@ \
-@XCB_SCREENSAVER_CFLAGS@ \
-@XCB_SHAPE_CFLAGS@ \
-@XCB_SYNC_CFLAGS@ \
-@XCB_XFIXES_CFLAGS@ \
-@XCB_XINERAMA_CFLAGS@ \
-@XCB_XPRINT_CFLAGS@ \
-@XCB_XTEST_CFLAGS@ \
-@XCB_CFLAGS@ \
--I$(top_srcdir)/src/lib/ecore \
--I$(top_srcdir)/src/lib/ecore_txt \
--I$(top_srcdir)/src/lib/ecore_x \
--I$(top_builddir)/src/lib/ecore \
--I$(top_builddir)/src/lib/ecore_txt \
--I$(top_builddir)/src/lib/ecore_x
+  @XCB_DAMAGE_CFLAGS@ \
+  @XCB_COMPOSITE_CFLAGS@ \
+  @XCB_DPMS_CFLAGS@ \
+  @XCB_RANDR_CFLAGS@ \
+  @XCB_RENDER_CFLAGS@ \
+  @XCB_SCREENSAVER_CFLAGS@ \
+  @XCB_SHAPE_CFLAGS@ \
+  @XCB_SYNC_CFLAGS@ \
+  @XCB_XFIXES_CFLAGS@ \
+  @XCB_XINERAMA_CFLAGS@ \
+  @XCB_XPRINT_CFLAGS@ \
+  @XCB_XTEST_CFLAGS@ \
+  @XCB_XINPUT_CFLAGS@ \
+  @XCB_XGESTURE_CFLAGS@ \
+  @XCB_CURSOR_CFLAGS@ \
+  @ECORE_XCB_CFLAGS@ \
+  @PIXMAN_CFLAGS@ \
+  -I$(top_srcdir)/src/lib/ecore \
+  -I$(top_srcdir)/src/lib/ecore_x \
+  -I$(top_srcdir)/src/lib/ecore_input \
+  -I$(top_builddir)/src/lib/ecore \
+  -I$(top_builddir)/src/lib/ecore_x \
+  -I$(top_builddir)/src/lib/ecore_input \
+  @EINA_CFLAGS@
 
-noinst_LTLIBRARIES      = libecore_x_xcb.la
+noinst_LTLIBRARIES = libecore_x_xcb.la
 
-libecore_x_xcb_la_SOURCES  = \
-ecore_xcb_atom.c \
-ecore_xcb_cursor.c \
-ecore_xcb_damage.c \
-ecore_xcb_composite.c \
-ecore_xcb_dnd.c \
-ecore_xcb_dpms.c \
-ecore_xcb_drawable.c \
-ecore_xcb_e.c \
-ecore_xcb_events.c \
-ecore_xcb_fixes.c \
-ecore_xcb_gc.c \
-ecore_xcb_icccm.c \
-ecore_xcb_mwm.c \
-ecore_xcb_netwm.c \
-ecore_xcb_pixmap.c \
-ecore_xcb_randr.c \
-ecore_xcb_reply.c \
-ecore_xcb_screensaver.c \
-ecore_xcb_selection.c \
-ecore_xcb_shape.c \
-ecore_xcb_sync.c \
-ecore_xcb_window.c \
-ecore_xcb_window_prop.c \
-ecore_xcb_window_shadow.c \
-ecore_xcb_xinerama.c \
-ecore_xcb.c
+libecore_x_xcb_la_SOURCES = \
+  ecore_xcb.c \
+  ecore_xcb_atoms.c \
+  ecore_xcb_extensions.c \
+  ecore_xcb_shape.c \
+  ecore_xcb_screensaver.c \
+  ecore_xcb_sync.c \
+  ecore_xcb_render.c \
+  ecore_xcb_randr.c \
+  ecore_xcb_xfixes.c \
+  ecore_xcb_composite.c \
+  ecore_xcb_cursor.c \
+  ecore_xcb_damage.c \
+  ecore_xcb_dnd.c \
+  ecore_xcb_dpms.c \
+  ecore_xcb_drawable.c \
+  ecore_xcb_e.c \
+  ecore_xcb_gc.c \
+  ecore_xcb_image.c \
+  ecore_xcb_input.c \
+  ecore_xcb_gesture.c \
+  ecore_xcb_mwm.c \
+  ecore_xcb_pixmap.c \
+  ecore_xcb_region.c \
+  ecore_xcb_selection.c \
+  ecore_xcb_textlist.c \
+  ecore_xcb_events.c \
+  ecore_xcb_keymap.c \
+  ecore_xcb_netwm.c \
+  ecore_xcb_icccm.c \
+  ecore_xcb_window.c \
+  ecore_xcb_window_prop.c \
+  ecore_xcb_window_shape.c \
+  ecore_xcb_window_shadow.c \
+  ecore_xcb_xinerama.c \
+  ecore_xcb_error.c \
+  ecore_xcb_xtest.c \
+  ecore_xcb_vsync.c \
+  ecore_xcb_xdefaults.c
 
 libecore_x_xcb_la_LIBADD = \
-@XCB_DAMAGE_LIBS@ \
-@XCB_COMPOSITE_LIBS@ \
-@XCB_DPMS_LIBS@ \
-@XCB_RANDR_LIBS@ \
-@XCB_RENDER_LIBS@ \
-@XCB_SCREENSAVER_LIBS@ \
-@XCB_SHAPE_LIBS@ \
-@XCB_SYNC_LIBS@ \
-@XCB_XFIXES_LIBS@ \
-@XCB_XINERAMA_LIBS@ \
-@XCB_XPRINT_LIBS@ \
-@XCB_XTEST_LIBS@ \
-@XCB_LIBS@ \
-$(top_builddir)/src/lib/ecore/libecore.la \
-$(top_builddir)/src/lib/ecore_txt/libecore_txt.la
-
-libecore_x_xcb_la_LDFLAGS = -version-info @version_info@
-
-libecore_x_xcb_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la \
-$(top_builddir)/src/lib/ecore_txt/libecore_txt.la
+  @XCB_DAMAGE_LIBS@ \
+  @XCB_COMPOSITE_LIBS@ \
+  @XCB_DPMS_LIBS@ \
+  @XCB_RANDR_LIBS@ \
+  @XCB_RENDER_LIBS@ \
+  @XCB_SCREENSAVER_LIBS@ \
+  @XCB_SHAPE_LIBS@ \
+  @XCB_SYNC_LIBS@ \
+  @XCB_XFIXES_LIBS@ \
+  @XCB_XINERAMA_LIBS@ \
+  @XCB_XPRINT_LIBS@ \
+  @XCB_XTEST_LIBS@ \
+  @XCB_XINPUT_LIBS@ \
+  @XCB_XGESTURE_LIBS@ \
+  @XCB_CURSOR_LIBS@ \
+  @ECORE_XCB_LIBS@ \
+  @PIXMAN_LIBS@ \
+  $(top_builddir)/src/lib/ecore/libecore.la \
+  $(top_builddir)/src/lib/ecore_input/libecore_input.la \
+  @EINA_LIBS@ \
+  @dlopen_libs@
 
 endif
 
index 9ccf5f7..0ca779e 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-#include <X11/keysym.h>
-
-#include "Ecore.h"
 #include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
-
-static int _ecore_xcb_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_xcb_fd_handler_buf(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_xcb_key_mask_get(xcb_keysym_t sym);
-static void *_ecore_xcb_event_filter_start(void *data);
-static int   _ecore_xcb_event_filter_filter(void *data, void *loop_data,int type, void *event);
-static void  _ecore_xcb_event_filter_end(void *data, void *loop_data);
-
-static Ecore_Fd_Handler *_ecore_xcb_fd_handler_handle = NULL;
-static Ecore_Event_Filter *_ecore_xcb_filter_handler = NULL;
-
-#ifdef ECORE_XCB_DAMAGE
-static int _ecore_xcb_event_damage_id = 0;
-#endif /* ECORE_XCB_DAMAGE */
-#ifdef ECORE_XCB_RANDR
-static int _ecore_xcb_event_randr_id = 0;
-#endif /* ECORE_XCB_RANDR */
-#ifdef ECORE_XCB_SCREENSAVER
-static int _ecore_xcb_event_screensaver_id = 0;
-#endif /* ECORE_XCB_SCREENSAVER */
-#ifdef ECORE_XCB_SHAPE
-static int _ecore_xcb_event_shape_id = 0;
-#endif /* ECORE_XCB_SHAPE */
-#ifdef ECORE_XCB_SYNC
-static int _ecore_xcb_event_sync_id = 0;
-#endif /* ECORE_XCB_SYNC */
-#ifdef ECORE_XCB_FIXES
-static int _ecore_xcb_event_fixes_selection_id = 0;
-#endif /* ECORE_XCB_FIXES */
-
-static int _ecore_xcb_event_handlers_num = 0;
-static void (**_ecore_xcb_event_handlers) (xcb_generic_event_t * event) = NULL;
-static xcb_generic_event_t *_ecore_xcb_event_buffered = NULL;
+#include <X11/Xlib-xcb.h>
+#include <dlfcn.h>
 
+/* local function prototypes */
+static int _ecore_xcb_shutdown(Eina_Bool close_display);
+static Eina_Bool _ecore_xcb_fd_handle(void *data, Ecore_Fd_Handler *hdlr __UNUSED__);
+static Eina_Bool _ecore_xcb_fd_handle_buff(void *data, Ecore_Fd_Handler *hdlr __UNUSED__);
+static Eina_Bool _ecore_xcb_idle_enter(void *data __UNUSED__);
+
+/* local variables */
 static int _ecore_xcb_init_count = 0;
 static int _ecore_xcb_grab_count = 0;
+static Ecore_Fd_Handler *_ecore_xcb_fd_handler = NULL;
+static xcb_generic_event_t *_ecore_xcb_event_buffered = NULL;
+static Ecore_Idle_Enterer *_ecore_xcb_idle_enterer = NULL;
 
+/* external variables */
+int _ecore_xcb_log_dom = -1;
+Ecore_X_Display *_ecore_xcb_display = NULL;
 Ecore_X_Connection *_ecore_xcb_conn = NULL;
-Ecore_X_Screen     *_ecore_xcb_screen = NULL;
-double              _ecore_xcb_double_click_time = 0.25;
-Ecore_X_Time        _ecore_xcb_event_last_time = XCB_NONE;
-Ecore_X_Window      _ecore_xcb_event_last_window = XCB_NONE;
-int16_t             _ecore_xcb_event_last_root_x = 0;
-int16_t             _ecore_xcb_event_last_root_y = 0;
-int                 _ecore_xcb_xcursor = 0;
-
-Ecore_X_Window      _ecore_xcb_private_window = 0;
-
-/* FIXME - These are duplicates after making ecore atoms public */
-
-Ecore_X_Atom        _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM];
-
-
-EAPI int ECORE_X_EVENT_KEY_DOWN                 = 0;
-EAPI int ECORE_X_EVENT_KEY_UP                   = 0;
-EAPI int ECORE_X_EVENT_MOUSE_BUTTON_DOWN        = 0;
-EAPI int ECORE_X_EVENT_MOUSE_BUTTON_UP          = 0;
-EAPI int ECORE_X_EVENT_MOUSE_MOVE               = 0;
-EAPI int ECORE_X_EVENT_MOUSE_IN                 = 0;
-EAPI int ECORE_X_EVENT_MOUSE_OUT                = 0;
-EAPI int ECORE_X_EVENT_MOUSE_WHEEL              = 0;
-EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN          = 0;
-EAPI int ECORE_X_EVENT_WINDOW_FOCUS_OUT         = 0;
-EAPI int ECORE_X_EVENT_WINDOW_KEYMAP            = 0;
-EAPI int ECORE_X_EVENT_WINDOW_DAMAGE            = 0;
-EAPI int ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_CREATE            = 0;
-EAPI int ECORE_X_EVENT_WINDOW_DESTROY           = 0;
-EAPI int ECORE_X_EVENT_WINDOW_HIDE              = 0;
-EAPI int ECORE_X_EVENT_WINDOW_SHOW              = 0;
-EAPI int ECORE_X_EVENT_WINDOW_SHOW_REQUEST      = 0;
-EAPI int ECORE_X_EVENT_WINDOW_REPARENT          = 0;
-EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE         = 0;
-EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = 0;
-EAPI int ECORE_X_EVENT_WINDOW_GRAVITY           = 0;
-EAPI int ECORE_X_EVENT_WINDOW_RESIZE_REQUEST    = 0;
-EAPI int ECORE_X_EVENT_WINDOW_STACK             = 0;
-EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST     = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROPERTY          = 0;
-EAPI int ECORE_X_EVENT_WINDOW_COLORMAP          = 0;
-EAPI int ECORE_X_EVENT_WINDOW_MAPPING           = 0;
-EAPI int ECORE_X_EVENT_SELECTION_CLEAR          = 0;
-EAPI int ECORE_X_EVENT_SELECTION_REQUEST        = 0;
-EAPI int ECORE_X_EVENT_SELECTION_NOTIFY         = 0;
-EAPI int ECORE_X_EVENT_CLIENT_MESSAGE           = 0;
-EAPI int ECORE_X_EVENT_WINDOW_SHAPE             = 0;
-EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY       = 0;
-EAPI int ECORE_X_EVENT_SYNC_COUNTER             = 0;
-EAPI int ECORE_X_EVENT_SYNC_ALARM               = 0;
-EAPI int ECORE_X_EVENT_SCREEN_CHANGE            = 0;
-EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY            = 0;
-
-EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST    = 0;
-/*
-EAPI int ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE = 0;
-*/
-
-EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0;
-EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST       = 0;
-EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST      = 0;
-EAPI int ECORE_X_EVENT_PING                       = 0;
-EAPI int ECORE_X_EVENT_DESKTOP_CHANGE             = 0;
-
-EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW       = 0;
-EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE    = 0;
-EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE    = 0;
-
-EAPI int ECORE_X_MODIFIER_SHIFT                   = 0;
-EAPI int ECORE_X_MODIFIER_CTRL                    = 0;
-EAPI int ECORE_X_MODIFIER_ALT                     = 0;
-EAPI int ECORE_X_MODIFIER_WIN                     = 0;
-
-EAPI int ECORE_X_LOCK_SCROLL                      = 0;
-EAPI int ECORE_X_LOCK_NUM                         = 0;
-EAPI int ECORE_X_LOCK_CAPS                        = 0;
+Ecore_X_Screen *_ecore_xcb_screen = NULL;
+Ecore_X_Atom _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_NUM];
+double _ecore_xcb_double_click_time = 0.25;
 
 /**
- * @defgroup Ecore_Xcb_Init_Group X Library Init and Shutdown Functions
+ * @defgroup Ecore_X_Init_Group X Library Init and Shutdown Functions
  *
  * Functions that start and shut down the Ecore X Library.
  */
@@ -143,494 +36,251 @@ EAPI int ECORE_X_LOCK_CAPS                        = 0;
  *               assumed.
  * @return  The number of times the library has been initialized without
  *          being shut down.  0 is returned if an error occurs.
- * @ingroup Ecore_Xcb_Init_Group
+ * @ingroup Ecore_X_Init_Group
  */
 EAPI int
 ecore_x_init(const char *name)
 {
-   xcb_screen_iterator_t              iter;
-   int                                screen;
-   uint32_t                           max_request_length;
-   const xcb_query_extension_reply_t *reply_big_requests;
-#ifdef ECORE_XCB_DAMAGE
-   const xcb_query_extension_reply_t *reply_damage;
-#endif /* ECORE_XCB_DAMAGE */
-#ifdef ECORE_XCB_COMPOSITE
-   const xcb_query_extension_reply_t *reply_composite;
-#endif /* ECORE_XCB_COMPOSITE */
-#ifdef ECORE_XCB_DPMS
-   const xcb_query_extension_reply_t *reply_dpms;
-#endif /* ECORE_XCB_DPMS */
-#ifdef ECORE_XCB_RANDR
-   const xcb_query_extension_reply_t *reply_randr;
-#endif /* ECORE_XCB_RANDR */
-#ifdef ECORE_XCB_SCREENSAVER
-   const xcb_query_extension_reply_t *reply_screensaver;
-#endif /* ECORE_XCB_SCREENSAVER */
-#ifdef ECORE_XCB_SHAPE
-   const xcb_query_extension_reply_t *reply_shape;
-#endif /* ECORE_XCB_SHAPE */
-#ifdef ECORE_XCB_SYNC
-   xcb_sync_initialize_cookie_t       cookie_sync_init;
-   xcb_sync_initialize_reply_t       *reply_sync_init;
-   const xcb_query_extension_reply_t *reply_sync;
-#endif /* ECORE_XCB_SYNC */
-#ifdef ECORE_XCB_FIXES
-   const xcb_query_extension_reply_t *reply_xfixes;
-#endif /* ECORE_XCB_FIXES */
-#ifdef ECORE_XCB_XINERAMA
-   const xcb_query_extension_reply_t *reply_xinerama;
-#endif /* ECORE_XCB_XINERAMA */
-#ifdef ECORE_XCB_XPRINT
-   const xcb_query_extension_reply_t *reply_xprint;
-#endif /* ECORE_XCB_XPRINT */
-
-   xcb_intern_atom_cookie_t           atom_cookies[ECORE_X_ATOMS_COUNT];
-
-   if (_ecore_xcb_init_count > 0)
+   char *gl = NULL;
+   uint32_t mask, list[1];
+
+   /* check if we have initialized already */
+   if (++_ecore_xcb_init_count != 1)
+     return _ecore_xcb_init_count;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   /* try to initialize eina */
+   if (!eina_init()) return --_ecore_xcb_init_count;
+
+   /* setup ecore_xcb log domain */
+   _ecore_xcb_log_dom =
+     eina_log_domain_register("ecore_x", ECORE_XCB_DEFAULT_LOG_COLOR);
+   if (_ecore_xcb_log_dom < 0)
+     {
+        EINA_LOG_ERR("Cannot create Ecore Xcb log domain");
+        eina_shutdown();
+        return --_ecore_xcb_init_count;
+     }
+
+   /* try to initialize ecore */
+   if (!ecore_init())
      {
-       _ecore_xcb_init_count++;
-       return _ecore_xcb_init_count;
+        /* unregister log domain */
+         eina_log_domain_unregister(_ecore_xcb_log_dom);
+         _ecore_xcb_log_dom = -1;
+         eina_shutdown();
+         return --_ecore_xcb_init_count;
      }
-   _ecore_xcb_conn = xcb_connect(name, &screen);
-   if (!_ecore_xcb_conn) return 0;
 
-   /* FIXME: no error code right now */
-   /* _ecore_xcb_error_handler_init(); */
+   /* try to initialize ecore_event */
+   if (!ecore_event_init())
+     {
+        /* unregister log domain */
+         eina_log_domain_unregister(_ecore_xcb_log_dom);
+         _ecore_xcb_log_dom = -1;
+         ecore_shutdown();
+         eina_shutdown();
+         return --_ecore_xcb_init_count;
+     }
 
-   /********************/
-   /* First round trip */
-   /********************/
+   /* NB: XLib has XInitThreads */
 
-   /*
-    * Non blocking stuff:
+   /* check for env var which says we are not going to use GL @ all
     *
-    * 1. We request the atoms
-    * 2. We Prefetch the extension data
+    * NB: This is done because if someone wants a 'pure' xcb implementation
+    * of ecore_x, all they need do is export this variable in the environment
+    * and ecore_x will not use xlib stuff at all.
     *
+    * The upside is you can get pure xcb-based ecore_x (w/ all the speed), but
+    * there is a down-side here in that you cannot get OpenGL without XLib :(
     */
+   if ((gl = getenv("ECORE_X_NO_XLIB")))
+     {
+        /* we found the env var that says 'Yes, we are not ever gonna try
+         * OpenGL so it is safe to not use XLib at all' */
 
+        /* try to connect to the display server */
+        _ecore_xcb_conn = xcb_connect(name, NULL);
+     }
+   else
+     {
+        /* env var was not specified, so we will assume that the user
+         * may want opengl @ some point. connect this way for opengl to work */
+        void *libxcb, *libxlib;
+        Display *(*_real_display)(const char *display);
+        xcb_connection_t *(*_real_connection)(Display * dpy);
+        void (*_real_queue)(Display *dpy, enum XEventQueueOwner owner);
+        int (*_real_close)(Display *dpy);
+#ifdef EVAS_FRAME_QUEUING
+        Status (*_real_threads)(void);
+#endif
+
+        /* want to dlopen here to avoid actual library linkage */
+        libxlib = dlopen("libX11.so", (RTLD_LAZY | RTLD_GLOBAL));
+        if (!libxlib)
+          libxlib = dlopen("libX11.so.6", (RTLD_LAZY | RTLD_GLOBAL));
+        if (!libxlib)
+          libxlib = dlopen("libX11.so.6.3.0", (RTLD_LAZY | RTLD_GLOBAL));
+        if (!libxlib)
+          {
+             ERR("Could not dlsym to libX11");
+             /* unregister log domain */
+             eina_log_domain_unregister(_ecore_xcb_log_dom);
+             _ecore_xcb_log_dom = -1;
+             ecore_event_shutdown();
+             ecore_shutdown();
+             eina_shutdown();
+             return --_ecore_xcb_init_count;
+          }
 
-   /* We request the atoms (non blocking) */
-   _ecore_x_atom_init(atom_cookies);
-
-   /* We prefetch all the extension data (non blocking) */
+        libxcb = dlopen("libX11-xcb.so", (RTLD_LAZY | RTLD_GLOBAL));
+        if (!libxcb)
+          libxcb = dlopen("libX11-xcb.so.1", (RTLD_LAZY | RTLD_GLOBAL));
+        if (!libxcb)
+          libxcb = dlopen("libX11-xcb.so.1.0.0", (RTLD_LAZY | RTLD_GLOBAL));
+        if (!libxcb)
+          {
+             ERR("Could not dlsym to libX11-xcb");
+             /* unregister log domain */
+             eina_log_domain_unregister(_ecore_xcb_log_dom);
+             _ecore_xcb_log_dom = -1;
+             ecore_event_shutdown();
+             ecore_shutdown();
+             eina_shutdown();
+             return --_ecore_xcb_init_count;
+          }
 
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_big_requests_id);
+        _real_display = dlsym(libxlib, "XOpenDisplay");
+        _real_close = dlsym(libxlib, "XCloseDisplay");
+        _real_connection = dlsym(libxcb, "XGetXCBConnection");
+        _real_queue = dlsym(libxcb, "XSetEventQueueOwner");
+#ifdef EVAS_FRAME_QUEUING
+        _real_threads = dlsym(libxlib, "XInitThreads");
+#endif
 
-#ifdef ECORE_XCB_DAMAGE
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_damage_id);
-#endif /* ECORE_XCB_DAMAGE */
+        if (_real_display)
+          {
+#ifdef EVAS_FRAME_QUEUING
+             if (_real_threads) _real_threads();
+#endif
+             _ecore_xcb_display = _real_display(name);
+             if (!_ecore_xcb_display)
+               {
+                  ERR("Could not open Display via XLib");
+                  /* unregister log domain */
+                  eina_log_domain_unregister(_ecore_xcb_log_dom);
+                  _ecore_xcb_log_dom = -1;
+                  ecore_event_shutdown();
+                  ecore_shutdown();
+                  eina_shutdown();
+                  return --_ecore_xcb_init_count;
+               }
+             if (_real_connection)
+               _ecore_xcb_conn = _real_connection(_ecore_xcb_display);
+             if (!_ecore_xcb_conn)
+               {
+                  ERR("Could not get XCB Connection from XLib");
+
+                  if (_real_close) _real_close(_ecore_xcb_display);
+
+                  /* unregister log domain */
+                  eina_log_domain_unregister(_ecore_xcb_log_dom);
+                  _ecore_xcb_log_dom = -1;
+                  ecore_event_shutdown();
+                  ecore_shutdown();
+                  eina_shutdown();
+                  return --_ecore_xcb_init_count;
+               }
+             if (_real_queue)
+               _real_queue(_ecore_xcb_display, XCBOwnsEventQueue);
+          }
+     }
 
-#ifdef ECORE_XCB_COMPOSITE
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_composite_id);
-#endif /* ECORE_XCB_COMPOSITE */
+   if (xcb_connection_has_error(_ecore_xcb_conn))
+     {
+        CRIT("XCB Connection has error");
+        eina_log_domain_unregister(_ecore_xcb_log_dom);
+        _ecore_xcb_log_dom = -1;
+        ecore_event_shutdown();
+        ecore_shutdown();
+        eina_shutdown();
+        return --_ecore_xcb_init_count;
+     }
 
-#ifdef ECORE_XCB_DPMS
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_dpms_id);
-#endif /* ECORE_XCB_DPMS */
+   /* grab the default screen */
+   _ecore_xcb_screen =
+     xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
 
-#ifdef ECORE_XCB_RANDR
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_randr_id);
-#endif /* ECORE_XCB_RANDR */
+   /* NB: This method of init/finalize extensions first, then atoms
+    * Does end up being 2 round trips to X, BUT if we do extensions init then
+    * atoms init first, and call the 'finalize' functions later, we end up
+    * being slower, so it's a trade-off. This current method clocks in
+    * around 0.003 for fetching atoms VS 0.010 for init both then finalize */
 
-#ifdef ECORE_XCB_SCREENSAVER
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_screensaver_id);
-#endif /* ECORE_XCB_SCREENSAVER */
+   /* prefetch extension data */
+   _ecore_xcb_extensions_init();
 
-#ifdef ECORE_XCB_SHAPE
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_shape_id);
-#endif /* ECORE_XCB_SHAPE */
+   /* finalize extensions */
+   _ecore_xcb_extensions_finalize();
 
-#ifdef ECORE_XCB_SYNC
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_sync_id);
-   cookie_sync_init = xcb_sync_initialize_unchecked(_ecore_xcb_conn,
-                                                    XCB_SYNC_MAJOR_VERSION,
-                                                    XCB_SYNC_MINOR_VERSION);
-#endif /* ECORE_XCB_SYNC */
+   /* set keyboard autorepeat */
+   mask = XCB_KB_AUTO_REPEAT_MODE;
+   list[0] = XCB_AUTO_REPEAT_MODE_ON;
+   xcb_change_keyboard_control(_ecore_xcb_conn, mask, list);
 
-#ifdef ECORE_XCB_FIXES
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_xfixes_id);
-#endif /* ECORE_XCB_FIXES */
+   /* setup xcb events */
+   _ecore_xcb_events_init();
 
-#ifdef ECORE_XCB_XINERAMA
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_xinerama_id);
-#endif /* ECORE_XCB_XINERAMA */
+   /* setup xcb keymasks */
+   _ecore_xcb_keymap_init();
 
-#ifdef ECORE_XCB_XPRINT
-   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_x_print_id);
-#endif /* ECORE_XCB_XPRINT */
+   /* finalize xcb keymasks */
+   _ecore_xcb_keymap_finalize();
 
-   /* We init some components (not related to XCB) */
-   _ecore_x_reply_init();
-   _ecore_x_dnd_init();
-   ecore_x_netwm_init();
-   _ecore_x_selection_init();
-
-   /* There is no LASTEvent constant in XCB */
-   /* LASTevent is equal to 35 */
-   _ecore_xcb_event_handlers_num = 35;
-
-   /* We get the default screen */
-   iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
-   for (; iter.rem; --screen, xcb_screen_next (&iter))
-     if (screen == 0)
-       {
-          _ecore_xcb_screen = iter.data;
-          break;
-       }
-
-   /*
-    * Blocking stuff:
-    *
-    * 1. We get the atoms
-    * 2. We ask for the extension data
-    *
-    */
+   /* setup ecore fd handler */
+   _ecore_xcb_fd_handler =
+     ecore_main_fd_handler_add(xcb_get_file_descriptor(_ecore_xcb_conn),
+                               ECORE_FD_READ, _ecore_xcb_fd_handle,
+                               _ecore_xcb_conn, _ecore_xcb_fd_handle_buff,
+                               _ecore_xcb_conn);
 
-   /* We get the atoms (blocking) */
-   _ecore_x_atom_init_finalize(atom_cookies);
-
-   /* We then ask for the extension data (blocking) */
-   reply_big_requests = xcb_get_extension_data(_ecore_xcb_conn, &xcb_big_requests_id);
-
-#ifdef ECORE_XCB_DAMAGE
-   reply_damage = xcb_get_extension_data(_ecore_xcb_conn, &xcb_damage_id);
-   if (reply_damage)
-     _ecore_xcb_event_damage_id = reply_damage->first_event + XCB_DAMAGE_NOTIFY;
-   if (_ecore_xcb_event_damage_id >= _ecore_xcb_event_handlers_num)
-     _ecore_xcb_event_handlers_num = _ecore_xcb_event_damage_id + 1;
-#endif /* ECORE_XCB_DAMAGE */
-
-#ifdef ECORE_XCB_COMPOSITE
-   reply_composite = xcb_get_extension_data(_ecore_xcb_conn, &xcb_composite_id);
-#endif /* ECORE_XCB_COMPOSITE */
-
-#ifdef ECORE_XCB_DPMS
-   reply_dpms = xcb_get_extension_data(_ecore_xcb_conn, &xcb_dpms_id);
-#endif /* ECORE_XCB_DPMS */
-
-#ifdef ECORE_XCB_RANDR
-   reply_randr = xcb_get_extension_data(_ecore_xcb_conn, &xcb_randr_id);
-   if (reply_randr)
-     _ecore_xcb_event_randr_id = reply_randr->first_event + XCB_RANDR_SCREEN_CHANGE_NOTIFY;
-   if (_ecore_xcb_event_randr_id >= _ecore_xcb_event_handlers_num)
-     _ecore_xcb_event_handlers_num = _ecore_xcb_event_randr_id + 1;
-#endif /* ECORE_XCB_RANDR */
-
-#ifdef ECORE_XCB_SCREENSAVER
-   reply_screensaver = xcb_get_extension_data(_ecore_xcb_conn, &xcb_screensaver_id);
-   if (reply_screensaver)
-     _ecore_xcb_event_screensaver_id = reply_screensaver->first_event + XCB_SCREENSAVER_NOTIFY;
-   if (_ecore_xcb_event_screensaver_id >= _ecore_xcb_event_handlers_num)
-     _ecore_xcb_event_handlers_num = _ecore_xcb_event_screensaver_id + 1;
-#endif /* ECORE_XCB_SCREENSAVER */
-
-#ifdef ECORE_XCB_SHAPE
-   reply_shape = xcb_get_extension_data(_ecore_xcb_conn, &xcb_shape_id);
-   if (reply_shape)
-     _ecore_xcb_event_shape_id = reply_shape->first_event + XCB_SHAPE_NOTIFY;
-   if (_ecore_xcb_event_shape_id >= _ecore_xcb_event_handlers_num)
-     _ecore_xcb_event_handlers_num = _ecore_xcb_event_shape_id + 1;
-#endif /* ECORE_XCB_SHAPE */
-
-#ifdef ECORE_XCB_SYNC
-   reply_sync = xcb_get_extension_data(_ecore_xcb_conn, &xcb_sync_id);
-   if (reply_sync)
-     {
-       _ecore_xcb_event_sync_id = reply_sync->first_event;
-        reply_sync_init = xcb_sync_initialize_reply(_ecore_xcb_conn,
-                                                    cookie_sync_init, NULL);
-       if (!reply_sync_init)
-         _ecore_xcb_event_sync_id = 0;
-        else
-          free(reply_sync_init);
-     }
-   if (_ecore_xcb_event_sync_id + XCB_SYNC_ALARM_NOTIFY >= _ecore_xcb_event_handlers_num)
-     _ecore_xcb_event_handlers_num = _ecore_xcb_event_sync_id + XCB_SYNC_ALARM_NOTIFY + 1;
-#endif /* ECORE_XCB_SYNC */
-
-#ifdef ECORE_XCB_FIXES
-   reply_xfixes = xcb_get_extension_data(_ecore_xcb_conn, &xcb_xfixes_id);
-   if (reply_xfixes)
-     _ecore_xcb_event_fixes_selection_id = reply_xfixes->first_event + XCB_XFIXES_SELECTION_NOTIFY;
-   if (_ecore_xcb_event_fixes_selection_id >= _ecore_xcb_event_handlers_num)
-     _ecore_xcb_event_handlers_num = _ecore_xcb_event_fixes_selection_id + 1;
-#endif /* ECORE_XCB_FIXES */
-
-#ifdef ECORE_XCB_XINERAMA
-   reply_xinerama = xcb_get_extension_data(_ecore_xcb_conn, &xcb_xinerama_id);
-#endif /* ECORE_XCB_XINERAMA */
-
-#ifdef ECORE_XCB_XPRINT
-   reply_xprint = xcb_get_extension_data(_ecore_xcb_conn, &xcb_x_print_id);
-#endif /* ECORE_XCB_XPRINT */
-
-   /*********************/
-   /* Second round trip */
-   /*********************/
-
-   /* We ask for the QueryVersion request of the extensions */
-   _ecore_x_damage_init(reply_damage);
-   _ecore_x_composite_init(reply_composite);
-   _ecore_x_dpms_init(reply_dpms);
-   _ecore_x_randr_init(reply_randr);
-   _ecore_x_shape_init(reply_shape);
-   _ecore_x_sync_init(reply_sync);
-   _ecore_x_xfixes_init(reply_xfixes);
-   _ecore_x_xinerama_init(reply_xinerama);
-
-   /* we enable the Big Request extension if present */
-   max_request_length = xcb_get_maximum_request_length(_ecore_xcb_conn);
-
-   _ecore_xcb_event_handlers = calloc(_ecore_xcb_event_handlers_num, sizeof(void *));
-   if (!_ecore_xcb_event_handlers)
-     {
-        /* We get the replies of the QueryVersion request because we leave */
-        _ecore_x_damage_init_finalize();
-        _ecore_x_composite_init_finalize();
-        _ecore_x_dpms_init_finalize();
-        _ecore_x_randr_init_finalize();
-        _ecore_x_shape_init_finalize();
-        _ecore_x_sync_init_finalize();
-        _ecore_x_xfixes_init_finalize();
-        _ecore_x_xinerama_init_finalize();
-
-        xcb_disconnect(_ecore_xcb_conn);
-       _ecore_xcb_fd_handler_handle = NULL;
-       _ecore_xcb_conn = NULL;
-       return 0;
-     }
+   if (!_ecore_xcb_fd_handler)
+     return _ecore_xcb_shutdown(EINA_TRUE);
 
-#ifdef ECORE_XCB_CURSOR
-   _ecore_xcb_xcursor = XcursorSupportsARGB(_ecore_xcb_conn);
-#endif /* ECORE_XCB_CURSOR */
-
-   _ecore_xcb_event_handlers[XCB_KEY_PRESS]         = _ecore_x_event_handle_key_press;
-   _ecore_xcb_event_handlers[XCB_KEY_RELEASE]       = _ecore_x_event_handle_key_release;
-   _ecore_xcb_event_handlers[XCB_BUTTON_PRESS]      = _ecore_x_event_handle_button_press;
-   _ecore_xcb_event_handlers[XCB_BUTTON_RELEASE]    = _ecore_x_event_handle_button_release;
-   _ecore_xcb_event_handlers[XCB_MOTION_NOTIFY]     = _ecore_x_event_handle_motion_notify;
-   _ecore_xcb_event_handlers[XCB_ENTER_NOTIFY]      = _ecore_x_event_handle_enter_notify;
-   _ecore_xcb_event_handlers[XCB_LEAVE_NOTIFY]      = _ecore_x_event_handle_leave_notify;
-   _ecore_xcb_event_handlers[XCB_FOCUS_IN]          = _ecore_x_event_handle_focus_in;
-   _ecore_xcb_event_handlers[XCB_FOCUS_OUT]         = _ecore_x_event_handle_focus_out;
-   _ecore_xcb_event_handlers[XCB_KEYMAP_NOTIFY]     = _ecore_x_event_handle_keymap_notify;
-   _ecore_xcb_event_handlers[XCB_EXPOSE]            = _ecore_x_event_handle_expose;
-   _ecore_xcb_event_handlers[XCB_GRAPHICS_EXPOSURE] = _ecore_x_event_handle_graphics_expose;
-   _ecore_xcb_event_handlers[XCB_VISIBILITY_NOTIFY] = _ecore_x_event_handle_visibility_notify;
-   _ecore_xcb_event_handlers[XCB_CREATE_NOTIFY]     = _ecore_x_event_handle_create_notify;
-   _ecore_xcb_event_handlers[XCB_DESTROY_NOTIFY]    = _ecore_x_event_handle_destroy_notify;
-   _ecore_xcb_event_handlers[XCB_UNMAP_NOTIFY]      = _ecore_x_event_handle_unmap_notify;
-   _ecore_xcb_event_handlers[XCB_MAP_NOTIFY]        = _ecore_x_event_handle_map_notify;
-   _ecore_xcb_event_handlers[XCB_MAP_REQUEST]       = _ecore_x_event_handle_map_request;
-   _ecore_xcb_event_handlers[XCB_REPARENT_NOTIFY]   = _ecore_x_event_handle_reparent_notify;
-   _ecore_xcb_event_handlers[XCB_CONFIGURE_NOTIFY]  = _ecore_x_event_handle_configure_notify;
-   _ecore_xcb_event_handlers[XCB_CONFIGURE_REQUEST] = _ecore_x_event_handle_configure_request;
-   _ecore_xcb_event_handlers[XCB_GRAVITY_NOTIFY]    = _ecore_x_event_handle_gravity_notify;
-   _ecore_xcb_event_handlers[XCB_RESIZE_REQUEST]    = _ecore_x_event_handle_resize_request;
-   _ecore_xcb_event_handlers[XCB_CIRCULATE_NOTIFY]  = _ecore_x_event_handle_circulate_notify;
-   _ecore_xcb_event_handlers[XCB_CIRCULATE_REQUEST] = _ecore_x_event_handle_circulate_request;
-   _ecore_xcb_event_handlers[XCB_PROPERTY_NOTIFY]   = _ecore_x_event_handle_property_notify;
-   _ecore_xcb_event_handlers[XCB_SELECTION_CLEAR]   = _ecore_x_event_handle_selection_clear;
-   _ecore_xcb_event_handlers[XCB_SELECTION_REQUEST] = _ecore_x_event_handle_selection_request;
-   _ecore_xcb_event_handlers[XCB_SELECTION_NOTIFY]  = _ecore_x_event_handle_selection_notify;
-   _ecore_xcb_event_handlers[XCB_COLORMAP_NOTIFY]   = _ecore_x_event_handle_colormap_notify;
-   _ecore_xcb_event_handlers[XCB_CLIENT_MESSAGE]    = _ecore_x_event_handle_client_message;
-   _ecore_xcb_event_handlers[XCB_MAPPING_NOTIFY]    = _ecore_x_event_handle_mapping_notify;
-#ifdef ECORE_XCB_DAMAGE
-   if (_ecore_xcb_event_damage_id)
-     _ecore_xcb_event_handlers[_ecore_xcb_event_damage_id] = _ecore_x_event_handle_damage_notify;
-#endif /* ECORE_XCB_DAMAGE */
-#ifdef ECORE_XCB_RANDR
-   if (_ecore_xcb_event_randr_id)
-     _ecore_xcb_event_handlers[_ecore_xcb_event_randr_id] = _ecore_x_event_handle_randr_change;
-#endif /* ECORE_XCB_RANDR */
-#ifdef ECORE_XCB_SCREENSAVER
-   if (_ecore_xcb_event_screensaver_id)
-     _ecore_xcb_event_handlers[_ecore_xcb_event_screensaver_id] = _ecore_x_event_handle_screensaver_notify;
-#endif /* ECORE_XCB_SCREENSAVER */
-#ifdef ECORE_XCB_SHAPE
-   if (_ecore_xcb_event_shape_id)
-     _ecore_xcb_event_handlers[_ecore_xcb_event_shape_id] = _ecore_x_event_handle_shape_change;
-#endif /* ECORE_XCB_SHAPE */
-#ifdef ECORE_XCB_SYNC
-   if (_ecore_xcb_event_sync_id)
-     {
-       _ecore_xcb_event_handlers[_ecore_xcb_event_sync_id + XCB_SYNC_COUNTER_NOTIFY] =
-          _ecore_x_event_handle_sync_counter;
-       _ecore_xcb_event_handlers[_ecore_xcb_event_sync_id + XCB_SYNC_ALARM_NOTIFY] =
-          _ecore_x_event_handle_sync_alarm;
-     }
-#endif /* ECORE_XCB_SYNC */
-#ifdef ECORE_XCB_FIXES
-   if (_ecore_xcb_event_fixes_selection_id)
-     _ecore_xcb_event_handlers[_ecore_xcb_event_fixes_selection_id] = _ecore_x_event_handle_fixes_selection_notify;
-#endif /* ECORE_XCB_FIXES */
+   /* prefetch atoms */
+   _ecore_xcb_atoms_init();
 
-   if (!ECORE_X_EVENT_KEY_DOWN)
-     {
-       ECORE_X_EVENT_KEY_DOWN                 = ecore_event_type_new();
-       ECORE_X_EVENT_KEY_UP                   = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_BUTTON_DOWN        = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_BUTTON_UP          = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_MOVE               = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_IN                 = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_OUT                = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_WHEEL              = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_FOCUS_IN          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_FOCUS_OUT         = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_KEYMAP            = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_DAMAGE            = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_CREATE            = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_DESTROY           = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_HIDE              = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_SHOW              = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_SHOW_REQUEST      = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_REPARENT          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_CONFIGURE         = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_GRAVITY           = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_RESIZE_REQUEST    = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_STACK             = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_STACK_REQUEST     = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROPERTY          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_COLORMAP          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_MAPPING           = ecore_event_type_new();
-       ECORE_X_EVENT_SELECTION_CLEAR          = ecore_event_type_new();
-       ECORE_X_EVENT_SELECTION_REQUEST        = ecore_event_type_new();
-       ECORE_X_EVENT_SELECTION_NOTIFY         = ecore_event_type_new();
-       ECORE_X_EVENT_CLIENT_MESSAGE           = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_SHAPE             = ecore_event_type_new();
-       ECORE_X_EVENT_SCREENSAVER_NOTIFY       = ecore_event_type_new();
-       ECORE_X_EVENT_SYNC_COUNTER             = ecore_event_type_new();
-       ECORE_X_EVENT_SYNC_ALARM               = ecore_event_type_new();
-       ECORE_X_EVENT_SCREEN_CHANGE            = ecore_event_type_new();
-       ECORE_X_EVENT_DAMAGE_NOTIFY            = ecore_event_type_new();
-
-       ECORE_X_EVENT_WINDOW_DELETE_REQUEST                = ecore_event_type_new();
-       /*
-       ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE             = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE     = ecore_event_type_new();
-        ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE        = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE         = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE    = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE               = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE           = ecore_event_type_new();
-       */
-
-       ECORE_X_EVENT_DESKTOP_CHANGE             = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_STATE_REQUEST       = ecore_event_type_new();
-       ECORE_X_EVENT_FRAME_EXTENTS_REQUEST      = ecore_event_type_new();
-       ECORE_X_EVENT_PING                       = ecore_event_type_new();
-
-       ECORE_X_EVENT_STARTUP_SEQUENCE_NEW       = ecore_event_type_new();
-       ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE    = ecore_event_type_new();
-       ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE    = ecore_event_type_new();
-     }
+   /* finalize atoms */
+   _ecore_xcb_atoms_finalize();
 
-   /* everything has these... unless its like a pda... :) */
-   ECORE_X_MODIFIER_SHIFT = _ecore_xcb_key_mask_get(XK_Shift_L);
-   ECORE_X_MODIFIER_CTRL  = _ecore_xcb_key_mask_get(XK_Control_L);
-
-   /* apple's xdarwin has no alt!!!! */
-   ECORE_X_MODIFIER_ALT   = _ecore_xcb_key_mask_get(XK_Alt_L);
-   if (!ECORE_X_MODIFIER_ALT)
-     ECORE_X_MODIFIER_ALT = _ecore_xcb_key_mask_get(XK_Meta_L);
-   if (!ECORE_X_MODIFIER_ALT)
-     ECORE_X_MODIFIER_ALT = _ecore_xcb_key_mask_get(XK_Super_L);
-
-   /* the windows key... a valid modifier :) */
-   ECORE_X_MODIFIER_WIN   = _ecore_xcb_key_mask_get(XK_Super_L);
-   if (!ECORE_X_MODIFIER_WIN)
-     ECORE_X_MODIFIER_WIN = _ecore_xcb_key_mask_get(XK_Mode_switch);
-   if (!ECORE_X_MODIFIER_WIN)
-     ECORE_X_MODIFIER_WIN = _ecore_xcb_key_mask_get(XK_Meta_L);
-
-   if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
-     ECORE_X_MODIFIER_WIN = 0;
-   if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL)
-     ECORE_X_MODIFIER_ALT = 0;
-
-   ECORE_X_LOCK_SCROLL    = _ecore_xcb_key_mask_get(XK_Scroll_Lock);
-   ECORE_X_LOCK_NUM       = _ecore_xcb_key_mask_get(XK_Num_Lock);
-   ECORE_X_LOCK_CAPS      = _ecore_xcb_key_mask_get(XK_Caps_Lock);
-
-   _ecore_xcb_fd_handler_handle =
-     ecore_main_fd_handler_add(xcb_get_file_descriptor(_ecore_xcb_conn),
-                              ECORE_FD_READ,
-                              _ecore_xcb_fd_handler, _ecore_xcb_conn,
-                              _ecore_xcb_fd_handler_buf, _ecore_xcb_conn);
-   if (!_ecore_xcb_fd_handler_handle)
-     {
-        /* We get the replies of the QueryVersion request because we leave */
-        _ecore_x_damage_init_finalize();
-        _ecore_x_composite_init_finalize();
-        _ecore_x_dpms_init_finalize();
-        _ecore_x_randr_init_finalize();
-        _ecore_x_shape_init_finalize();
-        _ecore_x_sync_init_finalize();
-        _ecore_x_xfixes_init_finalize();
-        _ecore_x_xinerama_init_finalize();
-
-       xcb_disconnect(_ecore_xcb_conn);
-       free(_ecore_xcb_event_handlers);
-       _ecore_xcb_fd_handler_handle = NULL;
-       _ecore_xcb_conn = NULL;
-       _ecore_xcb_event_handlers = NULL;
-       return 0;
-     }
-   _ecore_xcb_filter_handler = ecore_event_filter_add(_ecore_xcb_event_filter_start, _ecore_xcb_event_filter_filter, _ecore_xcb_event_filter_end, NULL);
+   /* icccm_init: dummy function */
+   ecore_x_icccm_init();
 
-   /* This is just to be anal about naming conventions */
+   /* setup netwm */
+   ecore_x_netwm_init();
 
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] = ECORE_X_ATOM_WM_DELETE_WINDOW;
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] = ECORE_X_ATOM_WM_TAKE_FOCUS;
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_PING] = ECORE_X_ATOM_NET_WM_PING;
-   _ecore_xcb_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
+   /* old e hints init: dummy function */
+   ecore_x_e_init();
 
-   _ecore_xcb_init_count++;
+   _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] =
+     ECORE_X_ATOM_WM_DELETE_WINDOW;
+   _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] =
+     ECORE_X_ATOM_WM_TAKE_FOCUS;
+   _ecore_xcb_atoms_wm_protocol[ECORE_X_NET_WM_PROTOCOL_PING] =
+     ECORE_X_ATOM_NET_WM_PING;
+   _ecore_xcb_atoms_wm_protocol[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] =
+     ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
 
-   _ecore_xcb_private_window = ecore_x_window_override_new(0, -77, -777, 123, 456);
+   /* setup selection */
+   _ecore_xcb_selection_init();
 
-   /* We finally get the replies of the QueryVersion request */
-   _ecore_x_damage_init_finalize();
-   _ecore_x_composite_init_finalize();
-   _ecore_x_dpms_init_finalize();
-   _ecore_x_randr_init_finalize();
-   _ecore_x_shape_init_finalize();
-   _ecore_x_sync_init_finalize();
-   _ecore_x_xfixes_init_finalize();
-   _ecore_x_xinerama_init_finalize();
+   /* setup dnd */
+   _ecore_xcb_dnd_init();
 
-   return _ecore_xcb_init_count;
-}
+   _ecore_xcb_idle_enterer =
+     ecore_idle_enterer_add(_ecore_xcb_idle_enter, NULL);
 
-static int
-_ecore_x_shutdown(int close_display)
-{
-   _ecore_xcb_init_count--;
-   if (_ecore_xcb_init_count > 0) return _ecore_xcb_init_count;
-   if (!_ecore_xcb_conn) return _ecore_xcb_init_count;
-   if (close_display)
-      xcb_disconnect(_ecore_xcb_conn);
-   else
-      close(xcb_get_file_descriptor(_ecore_xcb_conn));
-   free(_ecore_xcb_event_handlers);
-   ecore_main_fd_handler_del(_ecore_xcb_fd_handler_handle);
-   ecore_event_filter_del(_ecore_xcb_filter_handler);
-   _ecore_xcb_fd_handler_handle = NULL;
-   _ecore_xcb_filter_handler = NULL;
-   _ecore_xcb_conn = NULL;
-   _ecore_xcb_event_handlers = NULL;
-   _ecore_x_selection_shutdown();
-   _ecore_x_dnd_shutdown();
-   ecore_x_netwm_shutdown();
-   _ecore_x_reply_shutdown();
-   if (_ecore_xcb_init_count < 0) _ecore_xcb_init_count = 0;
    return _ecore_xcb_init_count;
 }
 
@@ -642,1200 +292,1292 @@ _ecore_x_shutdown(int close_display)
  *
  * @return  The number of times the library has been initialized without
  *          being shut down.
- * @ingroup Ecore_Xcb_Init_Group
+ * @ingroup Ecore_X_Init_Group
  */
 EAPI int
 ecore_x_shutdown(void)
 {
-   return _ecore_x_shutdown(1);
+   return _ecore_xcb_shutdown(EINA_TRUE);
 }
 
 /**
  * Shuts down the Ecore X library.
  *
- * As ecore_xcb_shutdown, except do not close Display, only connection.
+ * As ecore_x_shutdown, except do not close Display, only connection.
  *
- * @ingroup Ecore_Xcb_Init_Group
+ * @return The number of times the library has been initialized without
+ * being shut down. 0 is returned if an error occurs.
+ * @ingroup Ecore_X_Init_Group
  */
 EAPI int
 ecore_x_disconnect(void)
 {
-   return _ecore_x_shutdown(0);
+   return _ecore_xcb_shutdown(EINA_FALSE);
 }
 
 /**
- * @defgroup Ecore_Xcb_Display_Attr_Group X Display Attributes
+ * @defgroup Ecore_X_Flush_Group X Synchronization Functions
  *
- * Functions that set and retrieve X display attributes.
+ * Functions that ensure that all commands that have been issued by the
+ * Ecore X library have been sent to the server.
  */
 
-EAPI Ecore_X_Display *
-ecore_x_display_get(void)
-{
-   return NULL;
-}
-
 /**
- * Retrieves the Ecore_X_Connection handle used for the current X connection.
- * @return  The current X connection.
- * @ingroup Ecore_Xcb_Display_Attr_Group
+ * Sends all X commands in the X Display buffer.
+ * @ingroup Ecore_X_Flush_Group
  */
-EAPI Ecore_X_Connection *
-ecore_x_connection_get(void)
+EAPI void
+ecore_x_flush(void)
 {
-   return (Ecore_X_Connection *)_ecore_xcb_conn;
-}
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/**
- * Retrieves the X display file descriptor.
- * @return  The current X display file descriptor.
- * @ingroup Ecore_Xcb_Display_Attr_Group
- */
-EAPI int
-ecore_x_fd_get(void)
-{
-   return xcb_get_file_descriptor(_ecore_xcb_conn);
+   CHECK_XCB_CONN;
+   xcb_flush(_ecore_xcb_conn);
 }
 
 /**
  * Retrieves the Ecore_X_Screen handle used for the current X connection.
  * @return  The current default screen.
- * @ingroup Ecore_Xcb_Display_Attr_Group
+ * @ingroup Ecore_X_Display_Attr_Group
  */
 EAPI Ecore_X_Screen *
 ecore_x_default_screen_get(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    return (Ecore_X_Screen *)_ecore_xcb_screen;
 }
 
-/**
- * Sets the timeout for a double and triple clicks to be flagged.
- *
- * This sets the time between clicks before the double_click flag is
- * set in a button down event. If 3 clicks occur within double this
- * time, the triple_click flag is also set.
- *
- * @param   t The time in seconds
- * @ingroup Ecore_Xcb_Display_Attr_Group
- */
-EAPI void
-ecore_x_double_click_time_set(double t)
+EAPI Ecore_X_Connection *
+ecore_x_connection_get(void)
 {
-   if (t < 0.0) t = 0.0;
-   _ecore_xcb_double_click_time = t;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   CHECK_XCB_CONN;
+   return (Ecore_X_Connection *)_ecore_xcb_conn;
 }
 
 /**
- * Retrieves the double and triple click flag timeout.
- *
- * See @ref ecore_xcb_double_click_time_set for more information.
- *
- * @return  The timeout for double clicks in seconds.
- * @ingroup Ecore_Xcb_Display_Attr_Group
+ * Return the last event time
  */
-EAPI double
-ecore_x_double_click_time_get(void)
+EAPI Ecore_X_Time
+ecore_x_current_time_get(void)
 {
-   return _ecore_xcb_double_click_time;
+   return _ecore_xcb_events_last_time_get();
 }
 
 /**
- * @defgroup Ecore_Xcb_Flush_Group X Synchronization Functions
- *
- * Functions that ensure that all commands that have been issued by the
- * Ecore X library have been sent to the server.
+ * Flushes the command buffer and waits until all requests have been
+ * processed by the server.
+ * @ingroup Ecore_X_Flush_Group
  */
+EAPI void
+ecore_x_sync(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   CHECK_XCB_CONN;
+   free(xcb_get_input_focus_reply(_ecore_xcb_conn,
+                                  xcb_get_input_focus_unchecked(_ecore_xcb_conn),
+                                  NULL));
+}
 
-/**
- * Sends all X commands in the X Display buffer.
- * @ingroup Ecore_Xcb_Flush_Group
- */
 EAPI void
-ecore_x_flush(void)
+ecore_x_grab(void)
 {
-   xcb_flush(_ecore_xcb_conn);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   CHECK_XCB_CONN;
+   _ecore_xcb_grab_count++;
+   if (_ecore_xcb_grab_count == 1)
+     xcb_grab_server(_ecore_xcb_conn);
 }
 
-/**
- * Flushes the command buffer and waits until all requests have been
- * processed by the server.
- * @ingroup Ecore_Xcb_Flush_Group
- */
 EAPI void
-ecore_x_sync(void)
+ecore_x_ungrab(void)
 {
-   free(xcb_get_input_focus_reply(_ecore_xcb_conn, xcb_get_input_focus(_ecore_xcb_conn), NULL));
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   CHECK_XCB_CONN;
+   _ecore_xcb_grab_count--;
+   if (_ecore_xcb_grab_count < 0) _ecore_xcb_grab_count = 0;
+   if (_ecore_xcb_grab_count == 0)
+     xcb_ungrab_server(_ecore_xcb_conn);
 }
 
 /**
- * Kill all clients with subwindows under a given window.
+ * Send client message with given type and format 32.
  *
- * You can kill all clients connected to the X server by using
- * @ref ecore_x_window_root_list to get a list of root windows, and
- * then passing each root window to this function.
+ * @param win     The window the message is sent to.
+ * @param type    The client message type.
+ * @param mask    The mask of the message to be sent.
+ * @param d0      The client message data item 1
+ * @param d1      The client message data item 2
+ * @param d2      The client message data item 3
+ * @param d3      The client message data item 4
+ * @param d4      The client message data item 5
  *
- * @param root The window whose children will be killed.
+ * @return @c EINA_TRUE on success @c EINA_FALSE otherwise.
  */
-EAPI void
-ecore_x_killall(Ecore_X_Window root)
+EAPI Eina_Bool
+ecore_x_client_message32_send(Ecore_X_Window win, Ecore_X_Atom type,
+                              Ecore_X_Event_Mask mask,
+                              long d0, long d1, long d2, long d3, long d4)
 {
-   int screens;
-   int i;
+   xcb_client_message_event_t ev;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *err;
 
-   xcb_grab_server(_ecore_xcb_conn);
-   screens = xcb_setup_roots_iterator (xcb_get_setup (_ecore_xcb_conn)).rem;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* Tranverse window tree starting from root, and drag each
-    * before the firing squad */
-   for (i = 0; i < screens; ++i)
-     {
-        xcb_query_tree_cookie_t cookie;
-        xcb_query_tree_reply_t *reply;
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
 
-        cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, root);
-        reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
-        if (reply)
-          {
-            xcb_window_iterator_t iter;
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = type;
+   ev.data.data32[0] = (uint32_t)d0;
+   ev.data.data32[1] = (uint32_t)d1;
+   ev.data.data32[2] = (uint32_t)d2;
+   ev.data.data32[3] = (uint32_t)d3;
+   ev.data.data32[4] = (uint32_t)d4;
 
-            iter = xcb_query_tree_children_iterator(reply);
-            for (; iter.rem; xcb_window_next(&iter))
-               xcb_kill_client(_ecore_xcb_conn, *iter.data);
-            free(reply);
-          }
+   cookie = xcb_send_event(_ecore_xcb_conn, 0, win, mask, (const char *)&ev);
+
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
+     {
+        DBG("Problem Sending Event");
+        DBG("\tType: %d", type);
+        DBG("\tWin: %d", win);
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
      }
 
-   xcb_ungrab_server(_ecore_xcb_conn);
-   free(xcb_get_input_focus_reply(_ecore_xcb_conn, xcb_get_input_focus(_ecore_xcb_conn), NULL));
+   return EINA_TRUE;
 }
 
 /**
- * Kill a specific client
+ * Send client message with given type and format 8.
  *
- * You can kill a specific client woning window @p window
+ * @param win     The window the message is sent to.
+ * @param type    The client message type.
+ * @param data    Data to be sent.
+ * @param len     Number of data bytes, max @c 20.
  *
- * @param window Window of the client to be killed
+ * @return @c EINA_TRUE on success @c EINA_FALSE otherwise.
  */
-EAPI void
-ecore_x_kill(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_client_message8_send(Ecore_X_Window win, Ecore_X_Atom type,
+                             const void *data, int len)
 {
-   xcb_kill_client(_ecore_xcb_conn, window);
-}
+   xcb_client_message_event_t ev;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *err;
 
-/**
- * Return the last event time
- */
-EAPI Ecore_X_Time
-ecore_x_current_time_get(void)
-{
-   return _ecore_xcb_event_last_time;
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-static void
-handle_event(xcb_generic_event_t *ev)
-{
-   uint8_t response_type = ev->response_type & ~0x80;
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 8;
+   ev.window = win;
+   ev.type = type;
+   if (len > 20) len = 20;
+   memcpy(ev.data.data8, data, len);
+   memset(ev.data.data8 + len, 0, 20 - len);
 
-   if (response_type < _ecore_xcb_event_handlers_num)
+   cookie = xcb_send_event(_ecore_xcb_conn, 0, win,
+                           XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
      {
-       if (_ecore_xcb_event_handlers[response_type])
-         _ecore_xcb_event_handlers[response_type] (ev);
+        DBG("Problem Sending Event");
+        DBG("\tType: %d", type);
+        DBG("\tWin: %d", win);
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
      }
+
+   return EINA_TRUE;
 }
 
-static int
-_ecore_xcb_fd_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
+EAPI Eina_Bool
+ecore_x_mouse_down_send(Ecore_X_Window win, int x, int y, int b)
 {
-   xcb_connection_t    *c;
-   xcb_generic_event_t *ev;
+   xcb_translate_coordinates_cookie_t cookie;
+   xcb_translate_coordinates_reply_t *reply;
+   xcb_button_press_event_t ev;
+   xcb_void_cookie_t vcookie;
+   xcb_generic_error_t *err;
+   Ecore_X_Window root = 0;
 
-   c = (xcb_connection_t *)data;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/*    printf ("nbr events: %d\n", _ecore_xcb_event_handlers_num); */
+   root = ecore_x_window_root_get(win);
+   cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
+   reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
-   /* We check if _ecore_xcb_event_buffered is NULL or not */
-   if (_ecore_xcb_event_buffered)
-     handle_event(_ecore_xcb_event_buffered);
+   memset(&ev, 0, sizeof(xcb_button_press_event_t));
+
+   ev.response_type = XCB_BUTTON_PRESS;
+   ev.event = win;
+   ev.child = win;
+   ev.root = root;
+   ev.event_x = x;
+   ev.event_y = y;
+   ev.same_screen = 1;
+   ev.state = 1 << b;
+   ev.detail = b; // xcb uses detail for button
+   ev.root_x = reply->dst_x;
+   ev.root_y = reply->dst_y;
+   ev.time = ecore_x_current_time_get();
+   free(reply);
 
-   while ((ev = xcb_poll_for_event(c)))
-     handle_event(ev);
+   vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
+                            XCB_EVENT_MASK_BUTTON_PRESS, (const char *)&ev);
+
+   err = xcb_request_check(_ecore_xcb_conn, vcookie);
+   if (err)
+     {
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
+     }
 
-   return 1;
+   return EINA_TRUE;
 }
 
-static int
-_ecore_xcb_fd_handler_buf(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
+EAPI Eina_Bool
+ecore_x_mouse_up_send(Ecore_X_Window win, int x, int y, int b)
 {
-   xcb_connection_t *c;
+   xcb_translate_coordinates_cookie_t cookie;
+   xcb_translate_coordinates_reply_t *reply;
+   xcb_button_release_event_t ev;
+   xcb_void_cookie_t vcookie;
+   xcb_generic_error_t *err;
+   Ecore_X_Window root = 0;
 
-   c = (xcb_connection_t *)data;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   _ecore_xcb_event_buffered = xcb_poll_for_event(c);
-   if (!_ecore_xcb_event_buffered)
-     return 0;
-
-   return 1;
-}
+   root = ecore_x_window_root_get(win);
+   cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
+   reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
-/* FIXME: possible roundtrip */
-/* FIXME: fix xcb_keysyms. It's ugly !! (reply in xcb_key_symbols_get_keysym) */
-static int
-_ecore_xcb_key_mask_get(xcb_keysym_t sym)
-{
-   xcb_keycode_iterator_t            iter;
-   xcb_get_modifier_mapping_cookie_t cookie;
-   xcb_get_modifier_mapping_reply_t *reply;
-   xcb_key_symbols_t                *symbols;
-   xcb_keysym_t                      sym2;
-   int                               i, j;
-   const int                         masks[8] =
-     {
-        XCB_MOD_MASK_SHIFT,
-        XCB_MOD_MASK_LOCK,
-        XCB_MOD_MASK_CONTROL,
-        XCB_MOD_MASK_1,
-        XCB_MOD_MASK_2,
-        XCB_MOD_MASK_3,
-        XCB_MOD_MASK_4,
-        XCB_MOD_MASK_5
-     };
-
-   cookie = xcb_get_modifier_mapping_unchecked(_ecore_xcb_conn);
-   symbols = xcb_key_symbols_alloc(_ecore_xcb_conn);
-
-   reply = xcb_get_modifier_mapping_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply)
-     {
-        xcb_key_symbols_free(symbols);
+   memset(&ev, 0, sizeof(xcb_button_release_event_t));
 
-        return 0;
-     }
+   ev.response_type = XCB_BUTTON_RELEASE;
+   ev.event = win;
+   ev.child = win;
+   ev.root = root;
+   ev.event_x = x;
+   ev.event_y = y;
+   ev.same_screen = 1;
+   ev.state = 0;
+   ev.root_x = reply->dst_x;
+   ev.root_y = reply->dst_y;
+   ev.detail = b; // xcb uses detail for button
+   ev.time = ecore_x_current_time_get();
+   free(reply);
 
-   iter = xcb_get_modifier_mapping_keycodes_iterator(reply);
+   vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
+                            XCB_EVENT_MASK_BUTTON_RELEASE, (const char *)&ev);
 
-   for (i = 0; iter.rem; xcb_keycode_next(&iter), i++)
+   err = xcb_request_check(_ecore_xcb_conn, vcookie);
+   if (err)
      {
-       for (j = 0; j < 8; j++)
-         {
-            sym2 = xcb_key_symbols_get_keysym(symbols, *iter.data, j);
-            if (sym2 != 0) break;
-         }
-       if (sym2 == sym)
-         {
-            int mask;
-
-            mask = masks[i];
-            free(reply);
-            xcb_key_symbols_free(symbols);
-            return mask;
-         }
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
      }
 
-   free(reply);
-   xcb_key_symbols_free(symbols);
-
-  return 0;
+   return EINA_TRUE;
 }
 
-typedef struct _Ecore_X_Filter_Data Ecore_X_Filter_Data;
-
-struct _Ecore_X_Filter_Data
+EAPI Eina_Bool
+ecore_x_mouse_move_send(Ecore_X_Window win, int x, int y)
 {
-   int last_event_type;
-};
+   xcb_translate_coordinates_cookie_t cookie;
+   xcb_translate_coordinates_reply_t *reply;
+   xcb_motion_notify_event_t ev;
+   xcb_void_cookie_t vcookie;
+   xcb_generic_error_t *err;
+   Ecore_X_Window root = 0;
 
-static void *
-_ecore_xcb_event_filter_start(void *data __UNUSED__)
-{
-   Ecore_X_Filter_Data *filter_data;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   filter_data = calloc(1, sizeof(Ecore_X_Filter_Data));
-   return filter_data;
-}
+   root = ecore_x_window_root_get(win);
+   cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
+   reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
-static int
-_ecore_xcb_event_filter_filter(void *data __UNUSED__, void *loop_data,int type, void *event __UNUSED__)
-{
-   Ecore_X_Filter_Data *filter_data;
+   memset(&ev, 0, sizeof(xcb_motion_notify_event_t));
+
+   ev.response_type = XCB_MOTION_NOTIFY;
+   ev.event = win;
+   ev.child = win;
+   ev.root = root;
+   ev.event_x = x;
+   ev.event_y = y;
+   ev.same_screen = 1;
+   ev.state = 0;
+   ev.detail = 0; // xcb uses 'detail' for is_hint
+   ev.root_x = reply->dst_x;
+   ev.root_y = reply->dst_y;
+   ev.time = ecore_x_current_time_get();
+   free(reply);
+
+   vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
+                            XCB_EVENT_MASK_POINTER_MOTION, (const char *)&ev);
 
-   filter_data = loop_data;
-   if (!filter_data) return 1;
-   if (type == ECORE_X_EVENT_MOUSE_MOVE)
+   err = xcb_request_check(_ecore_xcb_conn, vcookie);
+   if (err)
      {
-       if ((filter_data->last_event_type) == ECORE_X_EVENT_MOUSE_MOVE)
-         {
-            filter_data->last_event_type = type;
-            return 0;
-         }
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
      }
-   filter_data->last_event_type = type;
-   return 1;
+
+   return EINA_TRUE;
 }
 
-static void
-_ecore_xcb_event_filter_end(void *data __UNUSED__, void *loop_data)
+EAPI Eina_Bool
+ecore_x_mouse_in_send(Ecore_X_Window win, int x, int y)
 {
-   Ecore_X_Filter_Data *filter_data;
-
-   filter_data = loop_data;
-   if (filter_data) free(filter_data);
-}
-
-
+   xcb_translate_coordinates_cookie_t cookie;
+   xcb_translate_coordinates_reply_t *reply;
+   xcb_enter_notify_event_t ev;
+   xcb_void_cookie_t vcookie;
+   xcb_generic_error_t *err;
+   Ecore_X_Window root = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   root = ecore_x_window_root_get(win);
+   cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
+   reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+
+   memset(&ev, 0, sizeof(xcb_enter_notify_event_t));
+
+   ev.response_type = XCB_ENTER_NOTIFY;
+   ev.event = win;
+   ev.child = win;
+   ev.root = root;
+   ev.event_x = x;
+   ev.event_y = y;
+   ev.same_screen_focus = 1;
+   ev.mode = XCB_NOTIFY_MODE_NORMAL;
+   ev.detail = XCB_NOTIFY_DETAIL_NONLINEAR;
+   /* ev.focus = 0; */
+   ev.state = 0;
+   ev.root_x = reply->dst_x;
+   ev.root_y = reply->dst_y;
+   ev.time = ecore_x_current_time_get();
+   free(reply);
 
+   vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
+                            XCB_EVENT_MASK_ENTER_WINDOW, (const char *)&ev);
 
+   err = xcb_request_check(_ecore_xcb_conn, vcookie);
+   if (err)
+     {
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
+     }
 
+   return EINA_TRUE;
+}
 
+EAPI Eina_Bool
+ecore_x_mouse_out_send(Ecore_X_Window win, int x, int y)
+{
+   xcb_translate_coordinates_cookie_t cookie;
+   xcb_translate_coordinates_reply_t *reply;
+   xcb_leave_notify_event_t ev;
+   xcb_void_cookie_t vcookie;
+   xcb_generic_error_t *err;
+   Ecore_X_Window root = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   root = ecore_x_window_root_get(win);
+   cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
+   reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+
+   memset(&ev, 0, sizeof(xcb_leave_notify_event_t));
+
+   ev.response_type = XCB_LEAVE_NOTIFY;
+   ev.event = win;
+   ev.child = win;
+   ev.root = root;
+   ev.event_x = x;
+   ev.event_y = y;
+   ev.same_screen_focus = 1;
+   ev.mode = XCB_NOTIFY_MODE_NORMAL;
+   ev.detail = XCB_NOTIFY_DETAIL_NONLINEAR;
+   /* ev.focus = 0; */
+   ev.state = 0;
+   ev.root_x = reply->dst_x;
+   ev.root_y = reply->dst_y;
+   ev.time = ecore_x_current_time_get();
+   free(reply);
 
+   vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
+                            XCB_EVENT_MASK_LEAVE_WINDOW, (const char *)&ev);
 
+   err = xcb_request_check(_ecore_xcb_conn, vcookie);
+   if (err)
+     {
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
+     }
 
+   return EINA_TRUE;
+}
 
+EAPI Eina_Bool
+ecore_x_keyboard_grab(Ecore_X_Window win)
+{
+   xcb_grab_keyboard_cookie_t cookie;
+   xcb_grab_keyboard_reply_t *reply;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   cookie =
+     xcb_grab_keyboard_unchecked(_ecore_xcb_conn, 0, win, XCB_CURRENT_TIME,
+                                 XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
+   reply = xcb_grab_keyboard_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+   free(reply);
+   return EINA_TRUE;
+}
 
+EAPI void
+ecore_x_keyboard_ungrab(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   xcb_ungrab_keyboard(_ecore_xcb_conn, XCB_CURRENT_TIME);
+}
 
+EAPI void
+ecore_x_pointer_xy_get(Ecore_X_Window win, int *x, int *y)
+{
+   xcb_query_pointer_cookie_t cookie;
+   xcb_query_pointer_reply_t *reply;
 
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+//   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
+   if (x) *x = -1;
+   if (y) *y = -1;
 
+   cookie = xcb_query_pointer_unchecked(_ecore_xcb_conn, win);
+   reply = xcb_query_pointer_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
+   if (x) *x = reply->win_x;
+   if (y) *y = reply->win_y;
+   free(reply);
+}
 
+EAPI Eina_Bool
+ecore_x_pointer_control_set(int accel_num, int accel_denom, int threshold)
+{
+   xcb_void_cookie_t vcookie;
+   xcb_generic_error_t *err;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   vcookie =
+     xcb_change_pointer_control_checked(_ecore_xcb_conn,
+                                        accel_num, accel_denom, threshold, 
+                                        1, 1);
+   err = xcb_request_check(_ecore_xcb_conn, vcookie);
+   if (err)
+     {
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
+     }
 
+   return EINA_TRUE;
+}
 
-/*****************************************************************************/
-/*****************************************************************************/
-/*****************************************************************************/
-/* FIXME: these funcs need categorising */
-/*****************************************************************************/
+EAPI Eina_Bool
+ecore_x_pointer_control_get(int *accel_num, int *accel_denom, int *threshold)
+{
+   xcb_get_pointer_control_cookie_t cookie;
+   xcb_get_pointer_control_reply_t *reply;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if (accel_num) *accel_num = 0;
+   if (accel_denom) *accel_denom = 0;
+   if (threshold) *threshold = 0;
 
+   cookie = xcb_get_pointer_control_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_pointer_control_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
-/**
- * Get a list of all the root windows on the server.
- *
- * @note   The returned array will need to be freed after use.
- * @param  num_ret Pointer to integer to put number of windows returned in.
- * @return An array of all the root windows.  @c NULL is returned if memory
- *         could not be allocated for the list, or if @p num_ret is @c NULL.
- */
-EAPI Ecore_X_Window *
-ecore_x_window_root_list(int *num_ret)
-{
-   xcb_screen_iterator_t iter;
-   const xcb_setup_t    *setup;
-   uint8_t               i;
-   uint8_t               num;
-   Ecore_X_Window     *roots;
-/* #ifdef ECORE_XCBXPRINT */
-/*    int xp_base, xp_err_base; */
-/* #endif /\* ECORE_XCBXPRINT *\/ */
-
-   if (!num_ret) return NULL;
-   *num_ret = 0;
-
-   /* FIXME: todo... */
-/* #ifdef ECORE_XCBXPRINT */
-/*    num = ScreenCount(_ecore_xcb_conn); */
-/*    if (ecore_xcb_xprint_query()) */
-/*      { */
-/*     Screen **ps = NULL; */
-/*     int psnum = 0; */
-
-/*     ps = XpQueryScreens(_ecore_xcb_conn, &psnum); */
-/*     if (ps) */
-/*       { */
-/*          int overlap, j; */
-
-/*          overlap = 0; */
-/*          for (i = 0; i < num; i++) */
-/*            { */
-/*               for (j = 0; j < psnum; j++) */
-/*                 { */
-/*                    if (ScreenOfDisplay(_ecore_xcb_conn, i) == ps[j]) */
-/*                      overlap++; */
-/*                 } */
-/*            } */
-/*          roots = malloc((num - overlap) * sizeof(Ecore_X_Window)); */
-/*          if (roots) */
-/*            { */
-/*               int k; */
-
-/*               k = 0; */
-/*               for (i = 0; i < num; i++) */
-/*                 { */
-/*                    int is_print; */
-
-/*                    is_print = 0; */
-/*                    for (j = 0; j < psnum; j++) */
-/*                      { */
-/*                         if (ScreenOfDisplay(_ecore_xcb_conn, i) == ps[j]) */
-/*                           { */
-/*                              is_print = 1; */
-/*                              break; */
-/*                           } */
-/*                      } */
-/*                    if (!is_print) */
-/*                      { */
-/*                         roots[k] = RootWindow(_ecore_xcb_conn, i); */
-/*                         k++; */
-/*                      } */
-/*                 } */
-/*               *num_ret = k; */
-/*            } */
-/*          XFree(ps); */
-/*       } */
-/*     else */
-/*       { */
-/*          roots = malloc(num * sizeof(Ecore_X_Window)); */
-/*          if (!roots) return NULL; */
-/*          *num_ret = num; */
-/*          for (i = 0; i < num; i++) */
-/*            roots[i] = RootWindow(_ecore_xcb_conn, i); */
-/*       } */
-/*      } */
-/*    else */
-/*      { */
-/*     roots = malloc(num * sizeof(Ecore_X_Window)); */
-/*     if (!roots) return NULL; */
-/*     *num_ret = num; */
-/*     for (i = 0; i < num; i++) */
-/*       roots[i] = RootWindow(_ecore_xcb_conn, i); */
-/*      } */
-/* #else */
-   setup = xcb_get_setup (_ecore_xcb_conn);
-   iter = xcb_setup_roots_iterator (setup);
-   num = setup->roots_len;
-   roots = malloc(num * sizeof(Ecore_X_Window));
-   if (!roots) return NULL;
-
-   *num_ret = num;
-   for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
-     roots[i] = iter.data->root;
-/* #endif /\* ECORE_XCBXPRINT *\/ */
+   if (accel_num) *accel_num = reply->acceleration_numerator;
+   if (accel_denom) *accel_denom = reply->acceleration_denominator;
+   if (threshold) *threshold = reply->threshold;
+   free(reply);
 
-   return roots;
+   return EINA_TRUE;
 }
 
-EAPI Ecore_X_Window
-ecore_x_window_root_first_get(void)
+EAPI Eina_Bool
+ecore_x_pointer_mapping_set(unsigned char *map, int nmap)
 {
-   Ecore_X_Window *roots = NULL;
-   Ecore_X_Window  root;
-   int             num;
+   xcb_set_pointer_mapping_cookie_t cookie;
+   xcb_set_pointer_mapping_reply_t *reply;
+   Eina_Bool ret = EINA_FALSE;
 
-   roots = ecore_x_window_root_list(&num);
-   if(!(roots)) return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (num > 0)
-      root = roots[0];
-   else
-      root = 0;
+   cookie = xcb_set_pointer_mapping_unchecked(_ecore_xcb_conn, nmap, map);
+   reply = xcb_set_pointer_mapping_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
-   free(roots);
-   return root;
-}
+   if (reply->status == XCB_MAPPING_STATUS_SUCCESS)
+     ret = EINA_TRUE;
 
-/* FIXME: todo */
-
-static void _ecore_x_window_manage_error(void *data);
-
-static int _ecore_xcb_window_manage_failed = 0;
-static void
-_ecore_x_window_manage_error(void *data __UNUSED__)
-{
-/*    if ((ecore_xcb_error_request_get() == X_ChangeWindowAttributes) && */
-/*        (ecore_xcb_error_code_get() == BadAccess)) */
-/*      _ecore_xcb_window_manage_failed = 1; */
+   free(reply);
+   return ret;
 }
 
-/* FIXME: round trip */
-EAPI int
-ecore_x_window_manage(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_pointer_mapping_get(unsigned char *map, int nmap)
 {
-   xcb_get_window_attributes_cookie_t cookie_attr;
-   xcb_get_input_focus_cookie_t       cookie_sync;
-   xcb_get_window_attributes_reply_t *reply_attr;
-   xcb_get_input_focus_reply_t       *reply_sync;
-   uint32_t                           value_list;
+   xcb_get_pointer_mapping_cookie_t cookie;
+   xcb_get_pointer_mapping_reply_t *reply;
 
-   cookie_attr = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, window);
-   cookie_sync = xcb_get_input_focus_unchecked(_ecore_xcb_conn);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   reply_attr = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie_attr, NULL);
-   if (!reply_attr)
+   if (map) *map = 0;
+   nmap = 0;
+
+   cookie = xcb_get_pointer_mapping_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_pointer_mapping_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+
+   nmap = xcb_get_pointer_mapping_map_length(reply);
+   if (nmap <= 0)
      {
-        reply_sync = xcb_get_input_focus_reply(_ecore_xcb_conn, cookie_sync, NULL);
-        if (reply_sync) free(reply_sync);
-        return 0;
+        free(reply);
+        return EINA_FALSE;
      }
 
-   reply_sync = xcb_get_input_focus_reply(_ecore_xcb_conn, cookie_sync, NULL);
-   if (reply_sync) free(reply_sync);
-
-   _ecore_xcb_window_manage_failed = 0;
-   /* FIXME: no error code yet */
-   /* ecore_xcb_error_handler_set(_ecore_xcb_window_manage_error, NULL); */
-
-   value_list =
-     XCB_EVENT_MASK_KEY_PRESS             |
-     XCB_EVENT_MASK_KEY_RELEASE           |
-     XCB_EVENT_MASK_ENTER_WINDOW          |
-     XCB_EVENT_MASK_LEAVE_WINDOW          |
-     XCB_EVENT_MASK_STRUCTURE_NOTIFY      |
-     XCB_EVENT_MASK_RESIZE_REDIRECT       |
-     XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY   |
-     XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
-     XCB_EVENT_MASK_PROPERTY_CHANGE       |
-     reply_attr->your_event_mask;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_EVENT_MASK,
-                                &value_list);
-   free(reply_attr);
-
-   cookie_sync = xcb_get_input_focus_unchecked(_ecore_xcb_conn);
-   if (reply_sync) free(reply_sync);
-
-   /* FIXME: no error code yet */
-   /* ecore_xcb_error_handler_set(NULL, NULL); */
-   if (_ecore_xcb_window_manage_failed)
+   if (map)
      {
-       _ecore_xcb_window_manage_failed = 0;
-       return 0;
+        uint8_t *tmp;
+        int i = 0;
+
+        tmp = xcb_get_pointer_mapping_map(reply);
+        for (i = 0; i < nmap; i++)
+          map[i] = tmp[i];
      }
 
-   return 1;
+   free(reply);
+   return EINA_TRUE;
 }
 
+EAPI Eina_Bool
+ecore_x_pointer_grab(Ecore_X_Window win)
+{
+   xcb_grab_pointer_cookie_t cookie;
+   xcb_grab_pointer_reply_t *reply;
+   uint16_t mask;
+   Eina_Bool ret = EINA_FALSE;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   mask = (XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE |
+           XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
+           XCB_EVENT_MASK_POINTER_MOTION);
 
+   cookie = xcb_grab_pointer_unchecked(_ecore_xcb_conn, 0, win, mask,
+                                       XCB_GRAB_MODE_ASYNC,
+                                       XCB_GRAB_MODE_ASYNC,
+                                       XCB_NONE, XCB_NONE, XCB_CURRENT_TIME);
+   reply = xcb_grab_pointer_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
+   ret = (reply->status == XCB_GRAB_STATUS_SUCCESS) ? EINA_TRUE : EINA_FALSE;
 
+   free(reply);
+   return ret;
+}
 
-
-EAPI int
-ecore_x_pointer_control_set(int accel_num,
-                            int accel_denom,
-                            int threshold)
+EAPI Eina_Bool
+ecore_x_pointer_confine_grab(Ecore_X_Window win)
 {
-   xcb_change_pointer_control(_ecore_xcb_conn, 
-                              accel_num, accel_denom, threshold,
-                              1, 1);
-   return 1;
+   xcb_grab_pointer_cookie_t cookie;
+   xcb_grab_pointer_reply_t *reply;
+   uint16_t mask;
+   Eina_Bool ret = EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   mask = (XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE |
+           XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
+           XCB_EVENT_MASK_POINTER_MOTION);
+
+   cookie = xcb_grab_pointer_unchecked(_ecore_xcb_conn, 0, win, mask,
+                                       XCB_GRAB_MODE_ASYNC,
+                                       XCB_GRAB_MODE_ASYNC,
+                                       win, XCB_NONE, XCB_CURRENT_TIME);
+   reply = xcb_grab_pointer_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+
+   ret = (reply->status == XCB_GRAB_STATUS_SUCCESS) ? EINA_TRUE : EINA_FALSE;
+
+   free(reply);
+   return ret;
 }
 
 EAPI void
-ecore_x_pointer_control_get_prefetch(void)
+ecore_x_pointer_ungrab(void)
 {
-   xcb_get_pointer_control_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_get_pointer_control_unchecked(_ecore_xcb_conn);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   xcb_ungrab_pointer(_ecore_xcb_conn, XCB_CURRENT_TIME);
 }
 
-EAPI void
-ecore_x_pointer_control_get_fetch(void)
+EAPI Eina_Bool
+ecore_x_pointer_warp(Ecore_X_Window win, int x, int y)
 {
-   xcb_get_pointer_control_cookie_t cookie;
-   xcb_get_pointer_control_reply_t *reply;
+   xcb_void_cookie_t vcookie;
+   xcb_generic_error_t *err;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_pointer_control_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   vcookie =
+     xcb_warp_pointer_checked(_ecore_xcb_conn, XCB_NONE, win, 0, 0, 0, 0, x, y);
+   err = xcb_request_check(_ecore_xcb_conn, vcookie);
+   if (err)
+     {
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
 }
 
-EAPI int
-ecore_x_pointer_control_get(int *accel_num,
-                            int *accel_denom,
-                            int *threshold)
+/**
+ * Invoke the standard system beep to alert users
+ *
+ * @param percent The volume at which the bell rings. Must be in the range
+ * [-100,+100]. If percent >= 0, the final volume will be:
+ *       base - [(base * percent) / 100] + percent
+ * Otherwise, it's calculated as:
+ *       base + [(base * percent) / 100]
+ * where @c base is the bell's base volume as set by XChangeKeyboardControl(3).
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_bell(int percent)
 {
-   xcb_get_pointer_control_reply_t *reply;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *err;
 
-   if (accel_num) *accel_num = 0;
-   if (accel_denom) *accel_denom = 1;
-   if (threshold) *threshold = 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+   CHECK_XCB_CONN;
 
-   if (accel_num) *accel_num = reply->acceleration_numerator;
-   if (accel_denom) *accel_denom = reply->acceleration_denominator;
-   if (threshold) *threshold = reply->threshold;
+   // FIXME: Use unchecked version after development is ironed out
+   cookie = xcb_bell_checked(_ecore_xcb_conn, percent);
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
+     {
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
+     }
 
-   return 1;
+   return EINA_TRUE;
 }
 
-EAPI int
-ecore_x_pointer_grab(Ecore_X_Window window)
+EAPI void
+ecore_x_display_size_get(Ecore_X_Display *dsp __UNUSED__, int *w, int *h)
 {
-   xcb_grab_pointer_cookie_t cookie;
-   xcb_grab_pointer_reply_t *reply;
+   xcb_screen_t *screen;
 
-   cookie = xcb_grab_pointer_unchecked(_ecore_xcb_conn, 0, window,
-                                       XCB_EVENT_MASK_BUTTON_PRESS   |
-                                       XCB_EVENT_MASK_BUTTON_RELEASE |
-                                       XCB_EVENT_MASK_ENTER_WINDOW   |
-                                       XCB_EVENT_MASK_LEAVE_WINDOW   |
-                                       XCB_EVENT_MASK_POINTER_MOTION,
-                                       XCB_GRAB_MODE_ASYNC,
-                                       XCB_GRAB_MODE_ASYNC,
-                                       XCB_NONE, XCB_NONE,
-                                       XCB_CURRENT_TIME);
-   reply = xcb_grab_pointer_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply)
-      return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   free(reply);
-
-   return 1;
+   /* grab the default screen */
+   screen = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
+   if (w) *w = screen->width_in_pixels;
+   if (h) *h = screen->height_in_pixels;
 }
 
-EAPI int
-ecore_x_pointer_confine_grab(Ecore_X_Window window)
+EAPI unsigned long
+ecore_x_display_black_pixel_get(Ecore_X_Display *dsp __UNUSED__)
 {
-   xcb_grab_pointer_cookie_t cookie;
-   xcb_grab_pointer_reply_t *reply;
+   xcb_screen_t *screen;
 
-   cookie = xcb_grab_pointer_unchecked(_ecore_xcb_conn, 0, window,
-                                       XCB_EVENT_MASK_BUTTON_PRESS   |
-                                       XCB_EVENT_MASK_BUTTON_RELEASE |
-                                       XCB_EVENT_MASK_ENTER_WINDOW   |
-                                       XCB_EVENT_MASK_LEAVE_WINDOW   |
-                                       XCB_EVENT_MASK_POINTER_MOTION,
-                                       XCB_GRAB_MODE_ASYNC,
-                                       XCB_GRAB_MODE_ASYNC,
-                                       window, XCB_NONE,
-                                       XCB_CURRENT_TIME);
-   reply = xcb_grab_pointer_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply)
-      return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   free(reply);
+   /* grab the default screen */
+   screen = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
+   return screen->black_pixel;
+}
+
+EAPI unsigned long
+ecore_x_display_white_pixel_get(Ecore_X_Display *dsp __UNUSED__)
+{
+   xcb_screen_t *screen;
 
-   return 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   /* grab the default screen */
+   screen = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
+   return screen->white_pixel;
 }
 
 EAPI void
-ecore_x_pointer_ungrab(void)
+ecore_x_pointer_last_xy_get(int *x, int *y)
 {
-   xcb_ungrab_pointer(_ecore_xcb_conn, XCB_CURRENT_TIME);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (x) *x = _ecore_xcb_event_last_root_x;
+   if (y) *y = _ecore_xcb_event_last_root_y;
 }
 
-EAPI int
-ecore_x_pointer_warp(Ecore_X_Window window,
-                     int            x,
-                     int            y)
+EAPI void
+ecore_x_focus_reset(void)
 {
-  xcb_warp_pointer(_ecore_xcb_conn, XCB_NONE, window, 0, 0, 0, 0, x, y);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-  return 1;
+   xcb_set_input_focus(_ecore_xcb_conn, XCB_INPUT_FOCUS_POINTER_ROOT,
+                       ((xcb_screen_t *)_ecore_xcb_screen)->root,
+                       XCB_CURRENT_TIME);
+//   ecore_x_flush();
 }
 
-EAPI int
-ecore_x_keyboard_grab(Ecore_X_Window window)
+EAPI void
+ecore_x_events_allow_all(void)
 {
-   xcb_grab_keyboard_cookie_t cookie;
-   xcb_grab_keyboard_reply_t *reply;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_grab_keyboard_unchecked(_ecore_xcb_conn, 0, window,
-                                        XCB_CURRENT_TIME,
-                                        XCB_GRAB_MODE_ASYNC,
-                                        XCB_GRAB_MODE_ASYNC);
-   reply = xcb_grab_keyboard_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply)
-      return 0;
+   xcb_allow_events(_ecore_xcb_conn, XCB_ALLOW_ASYNC_BOTH, XCB_CURRENT_TIME);
+//   ecore_x_flush();
+}
 
-   free(reply);
+/**
+ * Kill a specific client
+ *
+ * You can kill a specific client owning window @p win
+ *
+ * @param win Window of the client to be killed
+ */
+EAPI void
+ecore_x_kill(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return 1;
+   xcb_kill_client(_ecore_xcb_conn, win);
+//   ecore_x_flush();
 }
 
+/**
+ * Kill all clients with subwindows under a given window.
+ *
+ * You can kill all clients connected to the X server by using
+ * @ref ecore_x_window_root_list to get a list of root windows, and
+ * then passing each root window to this function.
+ *
+ * @param root The window whose children will be killed.
+ */
 EAPI void
-ecore_x_keyboard_ungrab(void)
+ecore_x_killall(Ecore_X_Window root)
 {
-   xcb_ungrab_keyboard(_ecore_xcb_conn, XCB_CURRENT_TIME);
+   int screens = 0, i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   ecore_x_grab();
+
+   screens = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem;
+
+   /* Traverse window tree starting from root, and drag each
+    * before the firing squad */
+   for (i = 0; i < screens; ++i)
+     {
+        xcb_query_tree_cookie_t cookie;
+        xcb_query_tree_reply_t *reply;
+
+        cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, root);
+        reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             xcb_window_t *wins = NULL;
+             int tree_c_len, j = 0;
+
+             wins = xcb_query_tree_children(reply);
+             tree_c_len = xcb_query_tree_children_length(reply);
+             for (j = 0; j < tree_c_len; j++)
+               xcb_kill_client(_ecore_xcb_conn, wins[j]);
+             free(reply);
+          }
+     }
+
+   ecore_x_ungrab();
+   ecore_x_sync(); // needed
 }
 
-EAPI void
-ecore_x_grab(void)
+/**
+ * Return the screen DPI
+ *
+ * This is a simplistic call to get DPI. It does not account for differing
+ * DPI in the x amd y axes nor does it account for multihead or xinerama and
+ * xrander where different parts of the screen may have differen DPI etc.
+ *
+ * @return the general screen DPI (dots/pixels per inch).
+ */
+EAPI int
+ecore_x_dpi_get(void)
 {
-   _ecore_xcb_grab_count++;
+   uint16_t mw = 0, w = 0;
 
-   if (_ecore_xcb_grab_count == 1)
-      xcb_grab_server(_ecore_xcb_conn);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   mw = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_millimeters;
+   if (mw <= 0) return 75;
+   w = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
+   return (((w * 254) / mw) + 5) / 10;
 }
 
-EAPI void
-ecore_x_ungrab(void)
+/**
+ * @defgroup Ecore_X_Display_Attr_Group X Display Attributes
+ *
+ * Functions that set and retrieve X display attributes.
+ */
+
+/**
+ * Retrieves the Ecore_X_Display handle used for the current X connection.
+ * @return  The current X display.
+ * @ingroup Ecore_X_Display_Attr_Group
+ */
+EAPI Ecore_X_Display *
+ecore_x_display_get(void)
 {
-   _ecore_xcb_grab_count--;
-   if (_ecore_xcb_grab_count < 0)
-      _ecore_xcb_grab_count = 0;
+   char *gl = NULL;
 
-   if (_ecore_xcb_grab_count == 0)
-   {
-      xcb_ungrab_server(_ecore_xcb_conn);
-      free(xcb_get_input_focus_reply(_ecore_xcb_conn, xcb_get_input_focus(_ecore_xcb_conn), NULL));
-   }
+   CHECK_XCB_CONN;
+
+   /* if we have the 'dont use xlib' env var, then we are not using
+    * XLib and thus cannot return a real XDisplay.
+    *
+    * NB: This may break EFL in some places and needs lots of testing !!! */
+   if ((gl = getenv("ECORE_X_NO_XLIB")))
+     return (Ecore_X_Display *)_ecore_xcb_conn;
+   else /* we can safely return an XDisplay var */
+     return (Ecore_X_Display *)_ecore_xcb_display;
 }
 
-int      _ecore_window_grabs_num = 0;
-Ecore_X_Window  *_ecore_window_grabs = NULL;
-int    (*_ecore_window_grab_replay_func) (void *data, int event_type, void *event);
-void    *_ecore_window_grab_replay_data;
+/**
+ * Retrieves the X display file descriptor.
+ * @return  The current X display file descriptor.
+ * @ingroup Ecore_X_Display_Attr_Group
+ */
+EAPI int
+ecore_x_fd_get(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+   return xcb_get_file_descriptor(_ecore_xcb_conn);
+}
 
 EAPI void
-ecore_x_passive_grab_replay_func_set(int (*func) (void *data,
-                                                  int   event_type,
-                                                  void *event),
+ecore_x_passive_grab_replay_func_set(Eina_Bool (*func)(void *data, int type, void *event),
                                      void *data)
 {
-   _ecore_window_grab_replay_func = func;
-   _ecore_window_grab_replay_data = data;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_window_grab_replay_func = func;
+   _ecore_xcb_window_grab_replay_data = data;
 }
 
+/**
+ * Retrieves the size of an Ecore_X_Screen.
+ * @param screen the handle to the screen to query.
+ * @param w where to return the width. May be NULL. Returns 0 on errors.
+ * @param h where to return the height. May be NULL. Returns 0 on errors.
+ * @ingroup Ecore_X_Display_Attr_Group
+ * @see ecore_x_default_screen_get()
+ *
+ * @since 1.1
+ */
 EAPI void
-ecore_x_window_button_grab(Ecore_X_Window     window,
-                           int                button,
-                           Ecore_X_Event_Mask event_mask,
-                           int                mod,
-                           int                any_mod)
+ecore_x_screen_size_get(const Ecore_X_Screen *screen, int *w, int *h)
 {
-   int      i;
-   uint16_t m;
-   uint16_t locks[8];
-   uint16_t ev;
-
-   m = mod;
-   if (any_mod) m = XCB_BUTTON_MASK_ANY;
-   locks[0] = 0;
-   locks[1] = ECORE_X_LOCK_CAPS;
-   locks[2] = ECORE_X_LOCK_NUM;
-   locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   ev = event_mask;
-   for (i = 0; i < 8; i++)
-     xcb_grab_button(_ecore_xcb_conn, 0, window, ev,
-                     XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC,
-                     XCB_NONE, XCB_NONE, button, m | locks[i]);
-   _ecore_window_grabs_num++;
-   _ecore_window_grabs = realloc(_ecore_window_grabs,
-                                _ecore_window_grabs_num * sizeof(Ecore_X_Window));
-   _ecore_window_grabs[_ecore_window_grabs_num - 1] = window;
+   xcb_screen_t *s;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (w) *w = 0;
+   if (h) *h = 0;
+   if (!(s = (xcb_screen_t *)screen)) return;
+   if (w) *w = s->width_in_pixels;
+   if (h) *h = s->height_in_pixels;
 }
 
-void
-_ecore_x_sync_magic_send(int            val,
-                         Ecore_X_Window swindow)
+/**
+ * Retrieves the count of screens.
+ *
+ * @return  The count of screens.
+ * @ingroup Ecore_X_Display_Attr_Group
+ *
+ * @since 1.1
+ */
+EAPI int
+ecore_x_screen_count_get(void)
 {
-   xcb_client_message_event_t ev;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.window = _ecore_xcb_private_window;
-   ev.type = 27777;
-   ev.data.data32[0] = 0x7162534;
-   ev.data.data32[1] = 0x10000000 + val;
-   ev.data.data32[2] = swindow;
-
-   xcb_send_event(_ecore_xcb_conn, 0, _ecore_xcb_private_window,
-                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+   return xcb_setup_roots_length(xcb_get_setup(_ecore_xcb_conn));
 }
 
-void
-_ecore_x_window_grab_remove(Ecore_X_Window window)
+/**
+ * Retrieves the index number of the given screen.
+ *
+ * @param screen The screen for which index will be gotten.
+ * @return  The index number of the screen.
+ * @ingroup Ecore_X_Display_Attr_Group
+ *
+ * @since 1.1
+ */
+EAPI int
+ecore_x_screen_index_get(const Ecore_X_Screen *screen)
 {
-   int i, shuffle = 0;
+   xcb_screen_iterator_t iter;
+   int i = 0;
+
+   CHECK_XCB_CONN;
 
-   if (_ecore_window_grabs_num > 0)
+   iter =
+     xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
+   for (; iter.rem; xcb_screen_next(&iter))
      {
-       for (i = 0; i < _ecore_window_grabs_num; i++)
-         {
-            if (shuffle) _ecore_window_grabs[i - 1] = _ecore_window_grabs[i];
-            if ((!shuffle) && (_ecore_window_grabs[i] == window))
-              shuffle = 1;
-         }
-       if (shuffle)
-         {
-            _ecore_window_grabs_num--;
-            _ecore_window_grabs = realloc(_ecore_window_grabs,
-                                          _ecore_window_grabs_num * sizeof(Ecore_X_Window));
-         }
+        if (iter.data == (xcb_screen_t *)screen)
+          return i;
+        i++;
      }
+
+   return 0;
 }
 
-EAPI void
-ecore_x_window_button_ungrab(Ecore_X_Window window,
-                             int            button,
-                             int            mod,
-                             int            any_mod)
+/**
+ * Retrieves the screen based on index number.
+ *
+ * @param idx The index that will be used to retrieve the screen.
+ * @return  The Ecore_X_Screen at this index.
+ * @ingroup Ecore_X_Display_Attr_Group
+ *
+ * @since 1.1
+ */
+EAPI Ecore_X_Screen *
+ecore_x_screen_get(int idx)
 {
-   int      i;
-   uint16_t m;
-   uint16_t locks[8];
-
-   m = mod;
-   if (any_mod) m = XCB_BUTTON_MASK_ANY;
-   locks[0] = 0;
-   locks[1] = ECORE_X_LOCK_CAPS;
-   locks[2] = ECORE_X_LOCK_NUM;
-   locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   for (i = 0; i < 8; i++)
-     xcb_ungrab_button(_ecore_xcb_conn, button, window, m | locks[i]);
-   _ecore_x_sync_magic_send(1, window);
-}
+   xcb_screen_iterator_t iter;
+   int i = 0;
 
-int                _ecore_key_grabs_num = 0;
-Ecore_X_Window  *_ecore_key_grabs = NULL;
+   CHECK_XCB_CONN;
 
-EAPI void
-ecore_x_window_key_grab(Ecore_X_Window window,
-                        const char    *key,
-                        int            mod,
-                        int            any_mod)
+   iter =
+     xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
+   for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
+     if (i == idx) return iter.data;
+
+   return NULL;
+}
+
+EAPI unsigned int
+ecore_x_visual_id_get(Ecore_X_Visual visual)
 {
-   xcb_keycode_t keycode = 0;
-   uint16_t      m;
-   uint16_t      locks[8];
-   int           i;
-
-   if (!strncmp(key, "Keycode-", 8))
-     keycode = atoi(key + 8);
-   /* FIXME: TODO... */
-
-/*    else */
-/*      { */
-/*         KeySym              keysym; */
-
-/*     keysym = XStringToKeysym(key); */
-/*     if (keysym == NoSymbol) return; */
-/*     keycode  = XKeysymToKeycode(_ecore_xcb_conn, XStringToKeysym(key)); */
-/*      } */
-   if (keycode == 0) return;
-
-   m = mod;
-   if (any_mod) m = XCB_BUTTON_MASK_ANY;
-   locks[0] = 0;
-   locks[1] = ECORE_X_LOCK_CAPS;
-   locks[2] = ECORE_X_LOCK_NUM;
-   locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   for (i = 0; i < 8; i++)
-     xcb_grab_key(_ecore_xcb_conn, 1, window, m | locks[i], keycode,
-                  XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC);
-   _ecore_key_grabs_num++;
-   _ecore_key_grabs = realloc(_ecore_key_grabs,
-                             _ecore_key_grabs_num * sizeof(Ecore_X_Window));
-   _ecore_key_grabs[_ecore_key_grabs_num - 1] = window;
+   return ((xcb_visualtype_t *)visual)->visual_id;
 }
 
-void
-_ecore_x_key_grab_remove(Ecore_X_Window window)
+/**
+ * Retrieve the default Visual.
+ *
+ * @param disp  The Display to get the Default Visual from
+ * @param screen The Screen.
+ *
+ * @return The default visual.
+ * @since 1.1.0
+ */
+EAPI Ecore_X_Visual
+ecore_x_default_visual_get(Ecore_X_Display *disp __UNUSED__, Ecore_X_Screen *screen)
 {
-   int i, shuffle = 0;
+   xcb_screen_t *s;
+   xcb_depth_iterator_t diter;
+   xcb_visualtype_iterator_t viter;
+
+   CHECK_XCB_CONN;
 
-   if (_ecore_key_grabs_num > 0)
+   s = (xcb_screen_t *)screen;
+   diter = xcb_screen_allowed_depths_iterator(s);
+   for (; diter.rem; xcb_depth_next(&diter))
      {
-       for (i = 0; i < _ecore_key_grabs_num; i++)
-         {
-            if (shuffle) _ecore_key_grabs[i - 1] = _ecore_key_grabs[i];
-            if ((!shuffle) && (_ecore_key_grabs[i] == window))
-              shuffle = 1;
-         }
-       if (shuffle)
-         {
-            _ecore_key_grabs_num--;
-            _ecore_key_grabs = realloc(_ecore_key_grabs,
-                                       _ecore_key_grabs_num * sizeof(Ecore_X_Window));
-         }
+        viter = xcb_depth_visuals_iterator(diter.data);
+        for (; viter.rem; xcb_visualtype_next(&viter))
+          {
+             if (viter.data->visual_id == s->root_visual)
+               return viter.data;
+          }
      }
+   return 0;
 }
 
-EAPI void
-ecore_x_window_key_ungrab(Ecore_X_Window window,
-                          const char    *key,
-                          int            mod,
-                          int            any_mod)
+/**
+ * Retrieve the default Colormap.
+ *
+ * @param disp  The Display to get the Default Colormap from
+ * @param screen The Screen.
+ *
+ * @return The default colormap.
+ * @since 1.1.0
+ */
+EAPI Ecore_X_Colormap
+ecore_x_default_colormap_get(Ecore_X_Display *disp __UNUSED__, Ecore_X_Screen *screen)
 {
-   xcb_keycode_t keycode = 0;
-   uint16_t      m;
-   uint16_t      locks[8];
-   int           i;
-
-   if (!strncmp(key, "Keycode-", 8))
-     keycode = atoi(key + 8);
-   /* FIXME: todo... */
-
-/*    else */
-/*      { */
-/*         KeySym              keysym; */
-
-/*     keysym = XStringToKeysym(key); */
-/*     if (keysym == NoSymbol) return; */
-/*     keycode  = XKeysymToKeycode(_ecore_xcb_conn, XStringToKeysym(key)); */
-/*      } */
-   if (keycode == 0) return;
-
-   m = mod;
-   if (any_mod) m = XCB_BUTTON_MASK_ANY;
-   locks[0] = 0;
-   locks[1] = ECORE_X_LOCK_CAPS;
-   locks[2] = ECORE_X_LOCK_NUM;
-   locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   for (i = 0; i < 8; i++)
-     xcb_ungrab_key(_ecore_xcb_conn, keycode, window, m | locks[i]);
-   _ecore_x_sync_magic_send(2, window);
+   xcb_screen_t *s;
+
+   s = (xcb_screen_t *)screen;
+   return s->default_colormap;
 }
 
 /**
- * Send client message with given type and format 32.
+ * Retrieve the default depth.
  *
- * @param window  The window the message is sent to.
- * @param type    The client message type.
- * @param mask    The client message mask.
- * @param d0      The client message data item 1
- * @param d1      The client message data item 2
- * @param d2      The client message data item 3
- * @param d3      The client message data item 4
- * @param d4      The client message data item 5
+ * @param disp  The Display to get the Default Depth from
+ * @param screen The Screen.
  *
- * @return !0 on success.
+ * @return The default depth.
+ * @since 1.1.0
  */
 EAPI int
-ecore_x_client_message32_send(Ecore_X_Window     window,
-                              Ecore_X_Atom       type,
-                              Ecore_X_Event_Mask mask,
-                              long               d0,
-                              long               d1,
-                              long               d2,
-                              long               d3,
-                              long               d4)
+ecore_x_default_depth_get(Ecore_X_Display *disp __UNUSED__, Ecore_X_Screen *screen)
 {
-    xcb_client_message_event_t ev;
+   xcb_screen_t *s;
 
-    ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-    ev.format = 32;
-    ev.window = window;
-    ev.type = type;
-    ev.data.data32[0] = d0;
-    ev.data.data32[1] = d1;
-    ev.data.data32[2] = d2;
-    ev.data.data32[3] = d3;
-    ev.data.data32[4] = d4;
+   s = (xcb_screen_t *)screen;
+   return s->root_depth;
+}
 
-    xcb_send_event(_ecore_xcb_conn, 0, window, mask, (const char *)&ev);
+EAPI void
+ecore_x_xkb_select_group(int group)
+{
+   // XXX: implement me */
+}
 
-    return 1;
+/**
+ * Sets the timeout for a double and triple clicks to be flagged.
+ *
+ * This sets the time between clicks before the double_click flag is
+ * set in a button down event. If 3 clicks occur within double this
+ * time, the triple_click flag is also set.
+ *
+ * @param   t The time in seconds
+ * @ingroup Ecore_X_Display_Attr_Group
+ */
+EAPI void
+ecore_x_double_click_time_set(double t)
+{
+   if (t < 0.0) t = 0.0;
+   _ecore_xcb_double_click_time = t;
 }
 
 /**
- * Send client message with given type and format 8.
+ * Retrieves the double and triple click flag timeout.
  *
- * @param window  The window the message is sent to.
- * @param type    The client message type.
- * @param data    Data to be sent.
- * @param len     Number of data bytes, max 20.
+ * See @ref ecore_x_double_click_time_set for more information.
  *
- * @return !0 on success.
+ * @return  The timeout for double clicks in seconds.
+ * @ingroup Ecore_X_Display_Attr_Group
  */
-EAPI int
-ecore_x_client_message8_send(Ecore_X_Window window,
-                             Ecore_X_Atom   type,
-                             const void    *data,
-                             int            len)
+EAPI double
+ecore_x_double_click_time_get(void)
 {
-   xcb_client_message_event_t ev;
+   return _ecore_xcb_double_click_time;
+}
 
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 8;
-   ev.window = window;
-   ev.type = type;
-   if (len > 20)
-      len = 20;
-   memcpy(ev.data.data8, data, len);
-   memset(ev.data.data8 + len, 0, 20 - len);
+/* local function prototypes */
+static int
+_ecore_xcb_shutdown(Eina_Bool close_display)
+{
+   if (--_ecore_xcb_init_count != 0)
+     return _ecore_xcb_init_count;
 
-   xcb_send_event(_ecore_xcb_conn, 0, window, XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+   if (!_ecore_xcb_conn)
+     return _ecore_xcb_init_count;
 
-   return 1;
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/* FIXME: round trip */
-EAPI int
-ecore_x_mouse_move_send(Ecore_X_Window window,
-                        int            x,
-                        int            y)
-{
-   xcb_motion_notify_event_t          ev;
-   xcb_get_geometry_cookie_t          cookie_geom;
-   xcb_translate_coordinates_cookie_t cookie_trans;
-   xcb_get_geometry_reply_t          *reply_geom;
-   xcb_translate_coordinates_reply_t *reply_trans;
-
-   cookie_geom = xcb_get_geometry_unchecked(_ecore_xcb_conn, window);
-   reply_geom = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_geom, NULL);
-   if (!reply_geom) return 0;
-
-   cookie_trans = xcb_translate_coordinates_unchecked(_ecore_xcb_conn, window, reply_geom->root, x, y);
-   reply_trans = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie_trans, NULL);
-   if (!reply_trans)
+   ecore_idle_enterer_del(_ecore_xcb_idle_enterer);
+   _ecore_xcb_idle_enterer = NULL;
+
+   if (_ecore_xcb_fd_handler)
+     ecore_main_fd_handler_del(_ecore_xcb_fd_handler);
+
+   /* disconnect from display server */
+   if (close_display)
+     xcb_disconnect(_ecore_xcb_conn);
+   else
      {
-        free(reply_geom);
-        return 0;
+        close(xcb_get_file_descriptor(_ecore_xcb_conn));
+        _ecore_xcb_conn = NULL;
      }
 
-   ev.response_type = XCB_MOTION_NOTIFY;
-   ev.detail = 0;
-   ev.time = _ecore_xcb_event_last_time;
-   ev.root = reply_geom->root;
-   ev.event = window;
-   ev.child = window;
-   ev.root_x = reply_trans->dst_x;
-   ev.root_y = reply_trans->dst_y;
-   ev.event_x = x;
-   ev.event_y = y;
-   ev.state = 0;
-   ev.same_screen = 1;
+   /* shutdown events */
+   _ecore_xcb_events_shutdown();
 
-   xcb_send_event(_ecore_xcb_conn, 1, window, XCB_EVENT_MASK_POINTER_MOTION, (const char *)&ev);
+   /* shutdown input extension */
+   _ecore_xcb_input_shutdown();
 
-   free(reply_geom);
-   free(reply_trans);
+   /* shutdown gesture extension */
+   _ecore_xcb_gesture_shutdown();
 
-   return 1;
-}
+   /* shutdown selection */
+   _ecore_xcb_selection_shutdown();
 
-/* FIXME: round trip */
-EAPI int
-ecore_x_mouse_down_send(Ecore_X_Window window,
-                        int            x,
-                        int            y,
-                        int              button)
-{
-   xcb_button_press_event_t           ev;
-   xcb_get_geometry_cookie_t          cookie_geom;
-   xcb_translate_coordinates_cookie_t cookie_trans;
-   xcb_get_geometry_reply_t          *reply_geom;
-   xcb_translate_coordinates_reply_t *reply_trans;
-
-   cookie_geom = xcb_get_geometry_unchecked(_ecore_xcb_conn, window);
-   reply_geom = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_geom, NULL);
-   if (!reply_geom) return 0;
-
-   cookie_trans = xcb_translate_coordinates_unchecked(_ecore_xcb_conn, window, reply_geom->root, x, y);
-   reply_trans = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie_trans, NULL);
-   if (!reply_trans)
-     {
-        free(reply_geom);
-        return 0;
-     }
+   /* shutdown dnd */
+   _ecore_xcb_dnd_shutdown();
 
-   ev.response_type = XCB_BUTTON_PRESS;
-   ev.detail = button;
-   ev.time = _ecore_xcb_event_last_time;
-   ev.root = reply_geom->root;
-   ev.event = window;
-   ev.child = window;
-   ev.root_x = reply_trans->dst_x;
-   ev.root_y = reply_trans->dst_y;
-   ev.event_x = x;
-   ev.event_y = y;
-   ev.state = 1 << button;
-   ev.same_screen = 1;
+   /* shutdown netwm */
+   ecore_x_netwm_shutdown();
 
-   xcb_send_event(_ecore_xcb_conn, 1, window, XCB_EVENT_MASK_BUTTON_PRESS, (const char *)&ev);
+   /* shutdown keymap */
+   _ecore_xcb_keymap_shutdown();
 
-   free(reply_geom);
-   free(reply_trans);
+   /* shutdown ecore_event */
+   ecore_event_shutdown();
 
-   return 1;
+   /* shutdown ecore */
+   ecore_shutdown();
+
+   /* unregister log domain */
+   eina_log_domain_unregister(_ecore_xcb_log_dom);
+   _ecore_xcb_log_dom = -1;
+
+   /* shutdown eina */
+   eina_shutdown();
+
+   return _ecore_xcb_init_count;
 }
 
-/* FIXME: round trip */
-EAPI int
-ecore_x_mouse_up_send(Ecore_X_Window window,
-                      int            x,
-                      int            y,
-                      int            button)
+static Eina_Bool
+_ecore_xcb_fd_handle(void *data, Ecore_Fd_Handler *hdlr __UNUSED__)
 {
-   xcb_button_release_event_t         ev;
-   xcb_get_geometry_cookie_t          cookie_geom;
-   xcb_translate_coordinates_cookie_t cookie_trans;
-   xcb_get_geometry_reply_t          *reply_geom;
-   xcb_translate_coordinates_reply_t *reply_trans;
-
-   cookie_geom = xcb_get_geometry_unchecked(_ecore_xcb_conn, window);
-   reply_geom = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_geom, NULL);
-   if (!reply_geom) return 0;
-
-   cookie_trans = xcb_translate_coordinates_unchecked(_ecore_xcb_conn, window, reply_geom->root, x, y);
-   reply_trans = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie_trans, NULL);
-   if (!reply_trans)
+   xcb_connection_t *conn;
+   xcb_generic_event_t *ev = NULL;
+
+   conn = (xcb_connection_t *)data;
+
+   if (_ecore_xcb_event_buffered)
      {
-        free(reply_geom);
-        return 0;
+        _ecore_xcb_events_handle(_ecore_xcb_event_buffered);
+        free(_ecore_xcb_event_buffered);
+        _ecore_xcb_event_buffered = NULL;
      }
 
-   ev.response_type = XCB_BUTTON_RELEASE;
-   ev.detail = button;
-   ev.time = _ecore_xcb_event_last_time;
-   ev.root = reply_geom->root;
-   ev.event = window;
-   ev.child = window;
-   ev.root_x = reply_trans->dst_x;
-   ev.root_y = reply_trans->dst_y;
-   ev.event_x = x;
-   ev.event_y = y;
-   ev.state = 0;
-   ev.same_screen = 1;
-
-   xcb_send_event(_ecore_xcb_conn, 1, window, XCB_EVENT_MASK_BUTTON_RELEASE, (const char *)&ev);
+//   xcb_flush(conn);
 
-   free(reply_geom);
-   free(reply_trans);
+   while ((ev = xcb_poll_for_event(conn)))
+     {
+        /* NB: Ecore Xlib uses filterevent for xim, but xcb does not support
+         * xim, so no need for it here */
+
+          /* check for errors first */
+           if (xcb_connection_has_error(conn))
+             {
+                xcb_generic_error_t *err;
+
+                err = (xcb_generic_error_t *)ev;
+                _ecore_xcb_io_error_handle(err);
+             }
+           else
+             {
+                /* FIXME: Filter event for XIM */
+                _ecore_xcb_events_handle(ev);
+                free(ev);
+             }
+     }
 
-   return 1;
+   return ECORE_CALLBACK_RENEW;
 }
 
-EAPI void
-ecore_x_focus_reset(void)
+static Eina_Bool
+_ecore_xcb_fd_handle_buff(void *data, Ecore_Fd_Handler *hdlr __UNUSED__)
 {
-   xcb_set_input_focus(_ecore_xcb_conn,
-                       (uint8_t)XCB_INPUT_FOCUS_POINTER_ROOT,
-                       XCB_INPUT_FOCUS_POINTER_ROOT,
-                       XCB_CURRENT_TIME);
-}
+   xcb_connection_t *conn;
+   xcb_generic_event_t *ev = NULL;
 
-EAPI void
-ecore_x_events_allow_all(void)
-{
-   xcb_allow_events(_ecore_xcb_conn, XCB_ALLOW_ASYNC_BOTH, XCB_CURRENT_TIME);
-}
+   conn = (xcb_connection_t *)data;
+   ev = xcb_poll_for_event(conn);
+   if (ev)
+     {
+        /* check for errors first */
+        if (xcb_connection_has_error(conn))
+          {
+             xcb_generic_error_t *err;
 
-EAPI void
-ecore_x_pointer_last_xy_get(int *x,
-                            int *y)
-{
-   if (x) *x = _ecore_xcb_event_last_root_x;
-   if (y) *y = _ecore_xcb_event_last_root_y;
+             err = (xcb_generic_error_t *)ev;
+             _ecore_xcb_io_error_handle(err);
+             return ECORE_CALLBACK_CANCEL;
+          }
+        _ecore_xcb_event_buffered = ev;
+        return ECORE_CALLBACK_RENEW;
+     }
+   return ECORE_CALLBACK_CANCEL;
 }
 
+static Eina_Bool
+_ecore_xcb_idle_enter(void *data __UNUSED__)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/*****************************************************************************/
-/*****************************************************************************/
-/*****************************************************************************/
+   xcb_flush(_ecore_xcb_conn);
+   return ECORE_CALLBACK_RENEW;
+}
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_atoms.c b/src/lib/ecore_x/xcb/ecore_xcb_atoms.c
new file mode 100644 (file)
index 0000000..c8c217e
--- /dev/null
@@ -0,0 +1,149 @@
+#include "ecore_xcb_private.h"
+#include "ecore_x_atoms_decl.h"
+
+/* NB: Increment if you add new atoms */
+#define ECORE_X_ATOMS_COUNT 199
+
+/* local function prototypes */
+
+/* local variables */
+static xcb_intern_atom_cookie_t cookies[ECORE_X_ATOMS_COUNT];
+
+void
+_ecore_xcb_atoms_init(void)
+{
+   int i = 0, num = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   num = (sizeof(atom_items) / sizeof(Atom_Item));
+   for (i = 0; i < num; i++)
+     {
+        cookies[i] =
+          xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
+                                    strlen(atom_items[i].name), atom_items[i].name);
+     }
+}
+
+void
+_ecore_xcb_atoms_finalize(void)
+{
+   int i = 0, num = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   num = (sizeof(atom_items) / sizeof(Atom_Item));
+   for (i = 0; i < num; i++)
+     {
+        xcb_intern_atom_reply_t *reply = NULL;
+
+        if (!(reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookies[i], 0)))
+          continue;
+        *(atom_items[i].atom) = reply->atom;
+        free(reply);
+     }
+}
+
+/**
+ * @defgroup Ecore_X_Atom_Group XCB Atom Functions
+ *
+ * Functions that operate on atoms
+ */
+
+/**
+ * Retrieves the atom value associated to a name.
+ *
+ * @param  name Unused.
+ * @return      Associated atom value.
+ *
+ * Retrieves the atom value associated to a name. The reply is the
+ * returned value of the function ecore_xcb_intern_atom_reply(). If
+ * @p reply is @c NULL, the NULL atom is returned. Otherwise, the atom
+ * associated to the name is returned.
+ *
+ * @ingroup Ecore_X_Atom_Group
+ */
+EAPI Ecore_X_Atom
+ecore_x_atom_get(const char *name)
+{
+   xcb_intern_atom_cookie_t cookie;
+   xcb_intern_atom_reply_t *reply;
+   Ecore_X_Atom a;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   cookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(name), name);
+   reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return XCB_ATOM_NONE;
+   a = reply->atom;
+   free(reply);
+   return a;
+}
+
+/**
+ * Retrieves the name of the given atom.
+ *
+ * @param  atom
+ * @return      The name of the atom.
+ *
+ * @ingroup Ecore_X_Atom_Group
+ */
+EAPI char *
+ecore_x_atom_name_get(Ecore_X_Atom atom)
+{
+   xcb_get_atom_name_cookie_t cookie;
+   xcb_get_atom_name_reply_t *reply;
+   char *name;
+   int len = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   cookie = xcb_get_atom_name_unchecked(_ecore_xcb_conn, atom);
+   reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return NULL;
+   len = xcb_get_atom_name_name_length(reply);
+   name = (char *)malloc(sizeof(char) * (len + 1));
+   if (!name)
+     {
+        free(reply);
+        return NULL;
+     }
+   memcpy(name, xcb_get_atom_name_name(reply), len);
+   name[len] = '\0';
+
+   free(reply);
+   return name;
+}
+
+EAPI void
+ecore_x_atoms_get(const char  **names,
+                  int           num,
+                  Ecore_X_Atom *atoms)
+{
+   xcb_intern_atom_cookie_t cookies[num];
+   int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   for (i = 0; i < num; i++)
+     {
+        cookies[i] =
+          xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
+                                    strlen(names[i]), names[i]);
+     }
+   for (i = 0; i < num; i++)
+     {
+        xcb_intern_atom_reply_t *reply = NULL;
+
+        if (!(reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookies[i], 0)))
+          continue;
+        atoms[i] = reply->atom;
+        free(reply);
+     }
+}
+
index eefacba..0d3b44e 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
-
-/**
- * @defgroup Ecore_X_Composite_Group X Composite Extension Functions
- *
- * Functions related to the X Composite extension.
- */
-
 #ifdef ECORE_XCB_COMPOSITE
-static uint8_t _composite_available = 0;
-static xcb_composite_query_version_cookie_t _ecore_xcb_composite_init_cookie;
-#endif /* ECORE_XCB_COMPOSITE */
-
+# include <xcb/composite.h>
+#endif
 
-/* To avoid round trips, the initialization is separated in 2
-   functions: _ecore_xcb_composite_init and
-   _ecore_xcb_composite_init_finalize. The first one gets the cookies and
-   the second one gets the replies. */
+/* local variables */
+static Eina_Bool _composite_avail = EINA_FALSE;
 
 void
-_ecore_x_composite_init(const xcb_query_extension_reply_t *reply)
+_ecore_xcb_composite_init(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
 #ifdef ECORE_XCB_COMPOSITE
-   if (reply && reply->present)
-      _ecore_xcb_composite_init_cookie = xcb_composite_query_version_unchecked(_ecore_xcb_conn, XCB_COMPOSITE_MAJOR_VERSION, XCB_COMPOSITE_MINOR_VERSION);
-#endif /* ECORE_XCB_COMPOSITE */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_composite_id);
+#endif
 }
 
 void
-_ecore_x_composite_init_finalize(void)
+_ecore_xcb_composite_finalize(void)
 {
 #ifdef ECORE_XCB_COMPOSITE
-   xcb_composite_query_version_reply_t *reply;
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
-   reply = xcb_composite_query_version_reply(_ecore_xcb_conn,
-                                          _ecore_xcb_composite_init_cookie,
-                                          NULL);
-   if (reply)
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_COMPOSITE
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_composite_id);
+   if ((ext_reply) && (ext_reply->present))
      {
-        if (reply->major_version = XCB_COMPOSITE_MAJOR_VERSION &&
-           reply->minor_version >= XCB_COMPOSITE_MINOR_VERSION)
-          _composite_available = 1;
-        free(reply);
+        xcb_composite_query_version_cookie_t cookie;
+        xcb_composite_query_version_reply_t *reply;
+
+        cookie =
+          xcb_composite_query_version_unchecked(_ecore_xcb_conn,
+                                                XCB_COMPOSITE_MAJOR_VERSION,
+                                                XCB_COMPOSITE_MINOR_VERSION);
+        reply =
+          xcb_composite_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+//             if ((reply->major_version >= XCB_COMPOSITE_MAJOR_VERSION) &&
+               if (reply->minor_version >= XCB_COMPOSITE_MINOR_VERSION)
+                 {
+# ifdef ECORE_XCB_RENDER
+                    if (_ecore_xcb_render_avail_get())
+                      {
+#  ifdef ECORE_XCB_XFIXES
+                         if (_ecore_xcb_xfixes_avail_get())
+                           _composite_avail = EINA_TRUE;
+#  endif
+                      }
+# endif
+                 }
+
+               free(reply);
+          }
      }
-#endif /* ECORE_XCB_COMPOSITE */
+#endif
 }
 
 /**
- * Return whether the Composite Extension is available.
- * @return 1 if the Composite Extension is available, 0 if not.
+ * @defgroup Ecore_X_Composite_Group X Composite Extension Functions
+ *
+ * Functions related to the X Composite Extension
+ */
+
+/**
+ * Return whether the Composite Extension is available
+ *
+ * @return @c EINA_TRUE is the Composite Extension is available, @c EINA_FALSE
+ * if not.
  *
- * Return 1 if the X server supports the Composite Extension version 0.4
- * or greater, 0 otherwise.
  * @ingroup Ecore_X_Composite_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_composite_query(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return _composite_avail;
+}
+
+EAPI void
+ecore_x_composite_redirect_window(Ecore_X_Window                win,
+                                  Ecore_X_Composite_Update_Type type)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return;
+
 #ifdef ECORE_XCB_COMPOSITE
-   return _composite_available;
+   uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = XCB_COMPOSITE_REDIRECT_MANUAL;
+        break;
+     }
+   xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI void
+ecore_x_composite_redirect_subwindows(Ecore_X_Window                win,
+                                      Ecore_X_Composite_Update_Type type)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return;
+
+#ifdef ECORE_XCB_COMPOSITE
+   uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = XCB_COMPOSITE_REDIRECT_MANUAL;
+        break;
+     }
+   xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI void
+ecore_x_composite_unredirect_window(Ecore_X_Window                win,
+                                    Ecore_X_Composite_Update_Type type)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return;
+
+#ifdef ECORE_XCB_COMPOSITE
+   uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = XCB_COMPOSITE_REDIRECT_MANUAL;
+        break;
+     }
+   xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI void
+ecore_x_composite_unredirect_subwindows(Ecore_X_Window                win,
+                                        Ecore_X_Composite_Update_Type type)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return;
+
+#ifdef ECORE_XCB_COMPOSITE
+   uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = XCB_COMPOSITE_REDIRECT_MANUAL;
+        break;
+     }
+   xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI Ecore_X_Pixmap
+ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
+{
+#ifdef ECORE_XCB_COMPOSITE
+   Ecore_X_Pixmap pmap = XCB_NONE;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return XCB_NONE;
+
+#ifdef ECORE_XCB_COMPOSITE
+   pmap = xcb_generate_id(_ecore_xcb_conn);
+   xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
+//   ecore_x_flush();
+#endif
+
+   return pmap;
+}
+
+EAPI void
+ecore_x_composite_window_events_disable(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return;
+
+#ifdef ECORE_XCB_SHAPE
+   ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
+//   ecore_x_flush();
 #else
-   return 0;
-#endif /* ECORE_XCB_COMPOSITE */
+   return;
+   win = 0;
+#endif
 }
+
+EAPI void
+ecore_x_composite_window_events_enable(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return;
+
+#ifdef ECORE_XCB_SHAPE
+   ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+#endif
+}
+
+EAPI Ecore_X_Window
+ecore_x_composite_render_window_enable(Ecore_X_Window root)
+{
+   Ecore_X_Window win = 0;
+#ifdef ECORE_XCB_COMPOSITE
+   xcb_composite_get_overlay_window_cookie_t cookie;
+   xcb_composite_get_overlay_window_reply_t *reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return 0;
+
+#ifdef ECORE_XCB_COMPOSITE
+   cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
+   reply =
+     xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return win;
+
+   win = reply->overlay_win;
+   free(reply);
+
+   ecore_x_composite_window_events_disable(win);
+//   ecore_x_flush();
+#endif
+
+   return win;
+}
+
+EAPI void
+ecore_x_composite_render_window_disable(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_composite_avail) return;
+
+#ifdef ECORE_XCB_COMPOSITE
+   xcb_composite_release_overlay_window(_ecore_xcb_conn, win);
+//   ecore_x_flush();
+#endif
+}
+
index 1dcea4d..755df04 100644 (file)
@@ -1,23 +1,77 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
-#include <xcb/shm.h>
-#include <xcb/xcb_image.h>
+#ifdef ECORE_XCB_CURSOR
+# include <xcb/render.h>
+# include <xcb/xcb_renderutil.h>
+#endif
+
+/* local function prototypes */
+#ifdef ECORE_XCB_CURSOR
+static xcb_render_pictforminfo_t *_ecore_xcb_cursor_format_get(void);
+#endif
+static void                       _ecore_xcb_cursor_default_size_get(void);
+static void                       _ecore_xcb_cursor_dpi_size_get(void);
+static void                       _ecore_xcb_cursor_guess_size(void);
+#ifdef ECORE_XCB_CURSOR
+static Ecore_X_Cursor             _ecore_xcb_cursor_image_load_cursor(xcb_image_t *img,
+                                                                      int          hot_x,
+                                                                      int          hot_y);
+#endif
+static void _ecore_xcb_cursor_image_destroy(xcb_image_t *img);
 
+/* local variables */
+static int _ecore_xcb_cursor_size = 0;
+static Eina_Bool _ecore_xcb_cursor = EINA_FALSE;
+#ifdef ECORE_XCB_CURSOR
+static uint32_t _ecore_xcb_cursor_format_id = 0;
+//   static xcb_render_pictforminfo_t *_ecore_xcb_cursor_format = NULL;
+#endif
 
-extern int _ecore_xcb_xcursor;
+void
+_ecore_xcb_cursor_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   /* NB: No-op */
+}
 
+void
+_ecore_xcb_cursor_finalize(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-EAPI int
+#ifdef ECORE_XCB_CURSOR
+   _ecore_xcb_cursor = _ecore_xcb_render_argb_get();
+
+   /* find render pict format */
+   if (_ecore_xcb_cursor_format_id <= 0)
+     _ecore_xcb_cursor_format_id = _ecore_xcb_cursor_format_get()->id;
+#endif
+
+   /* try to grab cursor size from XDefaults */
+   _ecore_xcb_cursor_default_size_get();
+
+   /* if that failed, try to get it from Xft Dpi setting */
+   if (_ecore_xcb_cursor_size == 0)
+     _ecore_xcb_cursor_dpi_size_get();
+
+   /* if that failed, try to guess from display size */
+   if (_ecore_xcb_cursor_size == 0)
+     _ecore_xcb_cursor_guess_size();
+
+   /* NB: Would normally add theme stuff here, but E cursor does not support
+    * xcursor themes. Delay parsing that stuff out until such time if/when the
+    * user selects to use X Cursor, rather than E cursor */
+}
+
+EAPI Eina_Bool
 ecore_x_cursor_color_supported_get(void)
 {
-   return _ecore_xcb_xcursor;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_cursor;
 }
 
 EAPI Ecore_X_Cursor
-ecore_x_cursor_new(Ecore_X_Window window,
+ecore_x_cursor_new(Ecore_X_Window win,
                    int           *pixels,
                    int            w,
                    int            h,
@@ -25,198 +79,169 @@ ecore_x_cursor_new(Ecore_X_Window window,
                    int            hot_y)
 {
    Ecore_X_Cursor cursor = 0;
+   xcb_image_t *img;
+
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
 #ifdef ECORE_XCB_CURSOR
-   if (_ecore_x_xcursor)
+   if (_ecore_xcb_cursor)
      {
-       Cursor c;
-       XcursorImage *xci;
-
-       xci = XcursorImageCreate(w, h);
-       if (xci)
-         {
-            int i;
-
-            xci->xhot = hot_x;
-            xci->yhot = hot_y;
-            xci->delay = 0;
-            for (i = 0; i < (w * h); i++)
-              {
-//               int r, g, b, a;
-//
-//               a = (pixels[i] >> 24) & 0xff;
-//               r = (((pixels[i] >> 16) & 0xff) * a) / 0xff;
-//               g = (((pixels[i] >> 8 ) & 0xff) * a) / 0xff;
-//               b = (((pixels[i]      ) & 0xff) * a) / 0xff;
-                 xci->pixels[i] = pixels[i];
-//                 (a << 24) | (r << 16) | (g << 8) | (b);
-              }
-            c = XcursorImageLoadCursor(_ecore_x_disp, xci);
-            XcursorImageDestroy(xci);
-            return c;
-         }
+        img = _ecore_xcb_image_create_native(w, h, XCB_IMAGE_FORMAT_Z_PIXMAP,
+                                             32, NULL, (w * h * sizeof(int)),
+                                             (uint8_t *)pixels);
+        cursor = _ecore_xcb_cursor_image_load_cursor(img, hot_x, hot_y);
+        _ecore_xcb_cursor_image_destroy(img);
+        return cursor;
      }
    else
-#endif /* ECORE_XCB_CURSOR */
-     {
-       const uint32_t dither[2][2] =
-         {
-              {0, 2},
-              {3, 1}
-         };
-        Ecore_X_Drawable draw;
-        Ecore_X_Pixmap   pixmap;
-        Ecore_X_Pixmap   mask;
-        Ecore_X_GC       gc;
-        xcb_image_t     *image;
-        uint32_t        *pix;
-        uint8_t          fr;
-        uint8_t          fg;
-        uint8_t          fb;
-        uint8_t          br;
-        uint8_t          bg;
-        uint8_t          bb;
-       uint32_t         brightest = 0;
-       uint32_t         darkest = 255 * 3;
-        uint16_t         x;
-        uint16_t         y;
-
-        draw = window;
-        pixmap = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_pixmap(_ecore_xcb_conn,
-                          1, pixmap, draw,
-                          1, 1);
-        mask = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_pixmap(_ecore_xcb_conn,
-                          1, mask, draw,
-                          1, 1);
-
-        image = xcb_image_create_native(_ecore_xcb_conn, w, h,
-                                 XCB_IMAGE_FORMAT_Z_PIXMAP,
-                                 32, NULL, ~0, NULL);
-        image->data = malloc(image->size);
-
-       fr = 0x00; fg = 0x00; fb = 0x00;
-       br = 0xff; bg = 0xff; bb = 0xff;
-        pix = (uint32_t *)pixels;
-       for (y = 0; y < h; y++)
-         {
-            for (x = 0; x < w; x++)
-              {
-                 uint8_t r, g, b, a;
-
-                 a = (pix[0] >> 24) & 0xff;
-                 r = (pix[0] >> 16) & 0xff;
-                 g = (pix[0] >> 8 ) & 0xff;
-                 b = (pix[0]      ) & 0xff;
-                 if (a > 0)
-                   {
-                      if ((uint32_t)(r + g + b) > brightest)
-                        {
-                           brightest = r + g + b;
-                           br = r;
-                           bg = g;
-                           bb = b;
-                        }
-                      if ((uint32_t)(r + g + b) < darkest)
-                        {
-                           darkest = r + g + b;
-                           fr = r;
-                           fg = g;
-                           fb = b;
-                        }
-                   }
-                 pix++;
-              }
-         }
-
-       pix = (uint32_t *)pixels;
-       for (y = 0; y < h; y++)
-         {
-            for (x = 0; x < w; x++)
-              {
-                 uint32_t v;
-                 uint8_t  r, g, b;
-                 int32_t  d1, d2;
-
-                 r = (pix[0] >> 16) & 0xff;
-                 g = (pix[0] >> 8 ) & 0xff;
-                 b = (pix[0]      ) & 0xff;
-                 d1 =
-                   ((r - fr) * (r - fr)) +
-                   ((g - fg) * (g - fg)) +
-                   ((b - fb) * (b - fb));
-                 d2 =
-                   ((r - br) * (r - br)) +
-                   ((g - bg) * (g - bg)) +
-                   ((b - bb) * (b - bb));
-                 if (d1 + d2)
-                   {
-                      v = (((d2 * 255) / (d1 + d2)) * 5) / 256;
-                      if (v > dither[x & 0x1][y & 0x1]) v = 1;
-                      else v = 0;
-                   }
-                 else
-                   {
-                      v = 0;
-                   }
-                 xcb_image_put_pixel(image, x, y, v);
-                 pix++;
-              }
-         }
-        draw = pixmap;
-        gc = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_gc(_ecore_xcb_conn, gc, draw, 0, NULL);
-        xcb_image_put(_ecore_xcb_conn, draw, gc, image, 0, 0, 0);
-        xcb_free_gc(_ecore_xcb_conn, gc);
-
-       pix = (uint32_t *)pixels;
-       for (y = 0; y < h; y++)
-         {
-            for (x = 0; x < w; x++)
-              {
-                 uint32_t v;
-
-                 v = (((pix[0] >> 24) & 0xff) * 5) / 256;
-                 if (v > dither[x & 0x1][y & 0x1]) v = 1;
-                 else v = 0;
-                 xcb_image_put_pixel(image, x, y, v);
-                 pix++;
-              }
-         }
-        draw = mask;
-        gc = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_gc (_ecore_xcb_conn, gc, draw, 0, NULL);
-        xcb_image_put(_ecore_xcb_conn, draw, gc, image, 0, 0, 0);
-        xcb_free_gc(_ecore_xcb_conn, gc);
-
-       free(image->data);
-       image->data = NULL;
-       xcb_image_destroy(image);
-
-        cursor = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_cursor (_ecore_xcb_conn, cursor,
-                           pixmap, mask,
-                           fr << 8 | fr,
-                           fg << 8 | fg,
-                           fb << 8 | fb,
-                           br << 8 | br,
-                           bg << 8 | bg,
-                           bb << 8 | bb,
-                           hot_x,
-                           hot_y);
-       xcb_free_pixmap(_ecore_xcb_conn, pixmap);
-       xcb_free_pixmap(_ecore_xcb_conn, mask);
-
-       return cursor;
-     }
+#endif
+   {
+      Ecore_X_GC gc;
+      xcb_pixmap_t pmap, mask;
+      uint32_t *pix;
+      uint8_t fr = 0x00, fg = 0x00, fb = 0x00;
+      uint8_t br = 0xff, bg = 0xff, bb = 0xff;
+      uint32_t brightest = 0, darkest = 255 * 3;
+      uint16_t x, y;
+      const uint32_t dither[2][2] =
+      {
+         {0, 2},
+         {3, 1}
+      };
+
+      img = _ecore_xcb_image_create_native(w, h, XCB_IMAGE_FORMAT_Z_PIXMAP,
+                                           1, NULL, ~0, NULL);
+      if (img->data) free(img->data);
+      img->data = malloc(img->size);
+
+      pmap = xcb_generate_id(_ecore_xcb_conn);
+      xcb_create_pixmap(_ecore_xcb_conn, 1, pmap, win, w, h);
+      mask = xcb_generate_id(_ecore_xcb_conn);
+      xcb_create_pixmap(_ecore_xcb_conn, 1, mask, win, w, h);
+
+      pix = (uint32_t *)pixels;
+      for (y = 0; y < h; y++)
+        {
+           for (x = 0; x < w; x++)
+             {
+                uint8_t r, g, b, a;
+
+                a = (pix[0] >> 24) & 0xff;
+                r = (pix[0] >> 16) & 0xff;
+                g = (pix[0] >> 8) & 0xff;
+                b = (pix[0]) & 0xff;
+                if (a > 0)
+                  {
+                     if ((uint32_t)(r + g + b) > brightest)
+                       {
+                          brightest = r + g + b;
+                          br = r;
+                          bg = g;
+                          bb = b;
+                       }
+
+                     if ((uint32_t)(r + g + b) < darkest)
+                       {
+                          darkest = r + g + b;
+                          fr = r;
+                          fg = g;
+                          fb = b;
+                       }
+                  }
+                pix++;
+             }
+        }
+
+      pix = (uint32_t *)pixels;
+      for (y = 0; y < h; y++)
+        {
+           for (x = 0; x < w; x++)
+             {
+                uint32_t v;
+                uint8_t r, g, b;
+                int32_t d1, d2;
+
+                r = (pix[0] >> 16) & 0xff;
+                g = (pix[0] >> 8) & 0xff;
+                b = (pix[0]) & 0xff;
+                d1 =
+                  ((r - fr) * (r - fr)) +
+                  ((g - fg) * (g - fg)) +
+                  ((b - fb) * (b - fb));
+                d2 =
+                  ((r - br) * (r - br)) +
+                  ((g - bg) * (g - bg)) +
+                  ((b - bb) * (b - bb));
+                if (d1 + d2)
+                  {
+                     v = (((d2 * 255) / (d1 + d2)) * 5) / 256;
+                     if (v > dither[x & 0x1][y & 0x1])
+                       v = 1;
+                     else
+                       v = 0;
+                  }
+                else
+                  v = 0;
+
+                xcb_image_put_pixel(img, x, y, v);
+                pix++;
+             }
+        }
+
+      gc = ecore_x_gc_new(pmap, 0, NULL);
+      xcb_put_image(_ecore_xcb_conn, img->format, pmap, gc, w, h,
+                    0, 0, 0, img->depth, img->size, img->data);
+      ecore_x_gc_free(gc);
+
+      pix = (uint32_t *)pixels;
+      for (y = 0; y < h; y++)
+        {
+           for (x = 0; x < w; x++)
+             {
+                uint32_t v;
+
+                v = (((pix[0] >> 24) & 0xff) * 5) / 256;
+                if (v > dither[x & 0x1][y & 0x1])
+                  v = 1;
+                else
+                  v = 0;
+
+                xcb_image_put_pixel(img, x, y, v);
+                pix++;
+             }
+        }
+
+      gc = ecore_x_gc_new(mask, 0, NULL);
+      xcb_put_image(_ecore_xcb_conn, img->format, mask, gc, w, h,
+                    0, 0, 0, img->depth, img->size, img->data);
+      ecore_x_gc_free(gc);
+
+      if (img->data) free(img->data);
+      _ecore_xcb_cursor_image_destroy(img);
+
+      cursor = xcb_generate_id(_ecore_xcb_conn);
+      xcb_create_cursor(_ecore_xcb_conn, cursor, pmap, mask,
+                        fr << 8 | fr, fg << 8 | fg, fb << 8 | fb,
+                        br << 8 | br, bg << 8 | bg, bb << 8 | bb,
+                        hot_x, hot_y);
+
+      xcb_free_pixmap(_ecore_xcb_conn, pmap);
+      xcb_free_pixmap(_ecore_xcb_conn, mask);
+
+      return cursor;
+   }
+
    return 0;
 }
 
 EAPI void
-ecore_x_cursor_free(Ecore_X_Cursor cursor)
+ecore_x_cursor_free(Ecore_X_Cursor c)
 {
-   xcb_free_cursor(_ecore_xcb_conn, cursor);
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+     CHECK_XCB_CONN;
+
+     xcb_free_cursor(_ecore_xcb_conn, c);
 }
 
 /*
@@ -227,44 +252,149 @@ ecore_x_cursor_free(Ecore_X_Cursor cursor)
 EAPI Ecore_X_Cursor
 ecore_x_cursor_shape_get(int shape)
 {
-   Ecore_X_Cursor cursor;
-   xcb_font_t     font;
+   Ecore_X_Cursor cursor = 0;
+   xcb_font_t font;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* Shapes are defined in Ecore_X_Cursor.h */
    font = xcb_generate_id(_ecore_xcb_conn);
    xcb_open_font(_ecore_xcb_conn, font, strlen("cursor"), "cursor");
 
    cursor = xcb_generate_id(_ecore_xcb_conn);
-   xcb_create_glyph_cursor (_ecore_xcb_conn,
-                            cursor,
-                            font,
-                            font,
-                            shape,
-                            shape + 1,
-                            0, 0, 0,
-                            65535, 65535, 65535);
+   /* FIXME: Add request check ?? */
+   xcb_create_glyph_cursor(_ecore_xcb_conn, cursor, font, font,
+                           shape, shape + 1, 0, 0, 0, 65535, 65535, 65535);
 
    xcb_close_font(_ecore_xcb_conn, font);
-
    return cursor;
 }
 
 EAPI void
 ecore_x_cursor_size_set(int size)
 {
-#ifdef ECORE_XCB_CURSOR
-   XcursorSetDefaultSize(_ecore_x_disp, size);
-#else
-   size = 0;
-#endif /* ECORE_XCB_CURSOR */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_cursor_size = size;
+   /* NB: May need to adjust size of current cursors here */
 }
 
 EAPI int
 ecore_x_cursor_size_get(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_cursor_size;
+}
+
+/* local functions */
 #ifdef ECORE_XCB_CURSOR
-   return XcursorGetDefaultSize(_ecore_x_disp);
-#else
-   return 0;
-#endif /* ECORE_XCB_CURSOR */
+static xcb_render_pictforminfo_t *
+_ecore_xcb_cursor_format_get(void)
+{
+   const xcb_render_query_pict_formats_reply_t *reply;
+   xcb_render_pictforminfo_t *ret = NULL;
+
+   CHECK_XCB_CONN;
+
+   reply = xcb_render_util_query_formats(_ecore_xcb_conn);
+   if (reply)
+     ret = xcb_render_util_find_standard_format(reply,
+                                                XCB_PICT_STANDARD_ARGB_32);
+
+   return ret;
+}
+
+#endif
+
+static void
+_ecore_xcb_cursor_default_size_get(void)
+{
+   char *s = NULL;
+   int v = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   s = getenv("XCURSOR_SIZE");
+   if (!s)
+     {
+        _ecore_xcb_xdefaults_init();
+        v = _ecore_xcb_xdefaults_int_get("Xcursor", "size");
+        _ecore_xcb_xdefaults_shutdown();
+     }
+   else
+     v = atoi(s);
+   if (v) _ecore_xcb_cursor_size = ((v * 16) / 72);
+}
+
+static void
+_ecore_xcb_cursor_dpi_size_get(void)
+{
+   int v = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_xdefaults_init();
+   v = _ecore_xcb_xdefaults_int_get("Xft", "dpi");
+   if (v) _ecore_xcb_cursor_size = ((v * 16) / 72);
+   _ecore_xcb_xdefaults_shutdown();
 }
+
+static void
+_ecore_xcb_cursor_guess_size(void)
+{
+   int w = 0, h = 0, s = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_screen_size_get(_ecore_xcb_screen, &w, &h);
+   if (h < w) s = h;
+   else s = w;
+   _ecore_xcb_cursor_size = (s / 48);
+}
+
+#ifdef ECORE_XCB_CURSOR
+static Ecore_X_Cursor
+_ecore_xcb_cursor_image_load_cursor(xcb_image_t *img,
+                                    int          hot_x,
+                                    int          hot_y)
+{
+   Ecore_X_Cursor cursor = 0;
+   Ecore_X_GC gc;
+   xcb_pixmap_t pmap;
+   xcb_render_picture_t pict;
+
+   CHECK_XCB_CONN;
+
+   pmap = xcb_generate_id(_ecore_xcb_conn);
+   xcb_create_pixmap(_ecore_xcb_conn, img->depth, pmap,
+                     ((xcb_screen_t *)_ecore_xcb_screen)->root,
+                     img->width, img->height);
+
+   gc = ecore_x_gc_new(pmap, 0, NULL);
+   xcb_put_image(_ecore_xcb_conn, img->format, pmap, gc,
+                 img->width, img->height, 0, 0, 0, img->depth,
+                 img->size, img->data);
+   ecore_x_gc_free(gc);
+
+   pict = xcb_generate_id(_ecore_xcb_conn);
+   xcb_render_create_picture(_ecore_xcb_conn, pict, pmap,
+                             _ecore_xcb_cursor_format_id, 0, NULL);
+   xcb_free_pixmap(_ecore_xcb_conn, pmap);
+
+   cursor = xcb_generate_id(_ecore_xcb_conn);
+   xcb_render_create_cursor(_ecore_xcb_conn, cursor, pict, hot_x, hot_y);
+   xcb_render_free_picture(_ecore_xcb_conn, pict);
+
+   return cursor;
+}
+
+#endif
+
+static void
+_ecore_xcb_cursor_image_destroy(xcb_image_t *img)
+{
+   CHECK_XCB_CONN;
+   if (img) xcb_image_destroy(img);
+}
+
index d5b0c66..deb3b9c 100644 (file)
@@ -1,83 +1,79 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
+# ifdef ECORE_XCB_DAMAGE
+#  include <xcb/damage.h>
+# endif
 
+/* local variables */
+static Eina_Bool _damage_avail = EINA_FALSE;
 
-/**
- * @defgroup Ecore_X_Damage_Group X Damage Extension Functions
- *
- * Functions related to the X Damage extension.
- */
-
-
-#ifdef ECORE_XCB_DAMAGE
-static uint8_t _damage_available = 0;
-static xcb_damage_query_version_cookie_t _ecore_xcb_damage_init_cookie;
-#endif /* ECORE_XCB_DAMAGE */
-
-
-/* To avoid round trips, the initialization is separated in 2
-   functions: _ecore_xcb_damage_init and
-   _ecore_xcb_damage_init_finalize. The first one gets the cookies and
-   the second one gets the replies. */
+/* external variables */
+int _ecore_xcb_event_damage = -1;
 
 void
-_ecore_x_damage_init(const xcb_query_extension_reply_t *reply)
+_ecore_xcb_damage_init(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
 #ifdef ECORE_XCB_DAMAGE
-   if (reply && (reply->present))
-      _ecore_xcb_damage_init_cookie = xcb_damage_query_version_unchecked(_ecore_xcb_conn, 1, 1);
-#endif /* ECORE_XCB_DAMAGE */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_damage_id);
+#endif
 }
 
 void
-_ecore_x_damage_init_finalize(void)
+_ecore_xcb_damage_finalize(void)
 {
 #ifdef ECORE_XCB_DAMAGE
-   xcb_damage_query_version_reply_t *reply;
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
-   reply = xcb_damage_query_version_reply(_ecore_xcb_conn,
-                                          _ecore_xcb_damage_init_cookie,
-                                          NULL);
-   if (reply)
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_DAMAGE
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_damage_id);
+   if ((ext_reply) && (ext_reply->present))
      {
-        if (reply->major_version >= 1)
-          _damage_available = 1;
-        free(reply);
+        xcb_damage_query_version_cookie_t cookie;
+        xcb_damage_query_version_reply_t *reply;
+
+        cookie =
+          xcb_damage_query_version_unchecked(_ecore_xcb_conn,
+                                             XCB_DAMAGE_MAJOR_VERSION,
+                                             XCB_DAMAGE_MINOR_VERSION);
+        reply = xcb_damage_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             _damage_avail = EINA_TRUE;
+             free(reply);
+          }
+
+        if (_damage_avail)
+          _ecore_xcb_event_damage = ext_reply->first_event;
      }
-#endif /* ECORE_XCB_DAMAGE */
+#endif
 }
 
-
 /**
- * Return whether the Damage Extension is available.
- * @return 1 if the Damage Extension is available, 0 if not.
+ * @defgroup Ecore_X_Damage_Group X Damage Extension Functions
  *
- * Return 1 if the X server supports the Damage Extension version 1.0,
- * 0 otherwise.
- * @ingroup Ecore_X_Damage_Group
+ * Functions related to the X Damage Extension.
  */
-EAPI int
+
+EAPI Eina_Bool
 ecore_x_damage_query(void)
 {
-#ifdef ECORE_XCB_DAMAGE
-   return _damage_available;
-#else
-   return 0;
-#endif /* ECORE_XCB_DAMAGE */
+   return _damage_avail;
 }
 
-
 /**
- * Creates a damage object.
- * @param drawable The drawable to monotor.
- * @param level    The level of the damage report.
- * @return         The damage object.
+ * Create a damage object
+ *
+ * @param drawable The drawable to monitor
+ * @param level The level of the damage report
+ * @return The damage object
+ *
+ * Creates a damage object to monitor changes to @p drawable,
+ * with the level @p level.
  *
- * Creates a damage object to monitor changes to @p drawable, with the
- * level @p level.
  * @ingroup Ecore_X_Damage_Group
  */
 EAPI Ecore_X_Damage
@@ -86,45 +82,59 @@ ecore_x_damage_new(Ecore_X_Drawable            drawable,
 {
    Ecore_X_Damage damage = 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_damage_avail) return 0;
+
 #ifdef ECORE_XCB_DAMAGE
    damage = xcb_generate_id(_ecore_xcb_conn);
    xcb_damage_create(_ecore_xcb_conn, damage, drawable, level);
-#endif /* ECORE_XCB_DAMAGE */
+//   ecore_x_flush();
+#endif
 
    return damage;
 }
 
-
 /**
- * Destroys a damage object.
- * @param damage The damage object to destroy.
+ * Destroy a damage object
+ *
+ * @param damage The damage object to destroy
+ *
+ * Destroys the damage object @p damage
  *
- * Destroys the damage object @p damage.
  * @ingroup Ecore_X_Damage_Group
  */
 EAPI void
-ecore_x_damage_del(Ecore_X_Damage damage)
+ecore_x_damage_free(Ecore_X_Damage damage)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_damage_avail) return;
+
 #ifdef ECORE_XCB_DAMAGE
    xcb_damage_destroy(_ecore_xcb_conn, damage);
-#endif /* ECORE_XCB_DAMAGE */
+//   ecore_x_flush();
+#endif
 }
 
-
 /**
- * Synchronously modifies the region.
- * @param damage The damage object to destroy.
- * @param repair The repair region.
- * @param parts  The parts region.
+ * Synchronously modifies the region
+ *
+ * @param damage The damage object to destroy
+ * @param repair The repair region
+ * @param parts The parts region
  *
  * Synchronously modifies the regions in the following manner:
  * If @p repair is @c XCB_NONE:
  *   1) parts = damage
- *   2) damage = <empty>
+ *   2) damage = \<empty\>
  * Otherwise:
  *   1) parts = damage INTERSECT repair
  *   2) damage = damage - parts
  *   3) Generate DamageNotify for remaining damage areas
+ *
  * @ingroup Ecore_X_Damage_Group
  */
 EAPI void
@@ -132,7 +142,14 @@ ecore_x_damage_subtract(Ecore_X_Damage damage,
                         Ecore_X_Region repair,
                         Ecore_X_Region parts)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_damage_avail) return;
+
 #ifdef ECORE_XCB_DAMAGE
    xcb_damage_subtract(_ecore_xcb_conn, damage, repair, parts);
-#endif /* ECORE_XCB_DAMAGE */
+//   ecore_x_flush();
+#endif
 }
+
index b270d3d..177e61d 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-#include "Ecore.h"
 #include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
-
 
-EAPI int ECORE_X_EVENT_XDND_ENTER    = 0;
-EAPI int ECORE_X_EVENT_XDND_POSITION = 0;
-EAPI int ECORE_X_EVENT_XDND_STATUS   = 0;
-EAPI int ECORE_X_EVENT_XDND_LEAVE    = 0;
-EAPI int ECORE_X_EVENT_XDND_DROP     = 0;
-EAPI int ECORE_X_EVENT_XDND_FINISHED = 0;
+#ifndef MIN
+# define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#endif
 
+/* local structures */
+typedef struct _Version_Cache_Item
+{
+   Ecore_X_Window win;
+   int            ver;
+} Version_Cache_Item;
+
+/* local function prototypes */
+static Eina_Bool _ecore_xcb_dnd_converter_copy(char         *target __UNUSED__,
+                                               void         *data,
+                                               int           size,
+                                               void        **data_ret,
+                                               int          *size_ret,
+                                               Ecore_X_Atom *tprop __UNUSED__,
+                                               int          *count __UNUSED__);
+
+/* local variables */
+static int _ecore_xcb_dnd_init_count = 0;
 static Ecore_X_DND_Source *_source = NULL;
 static Ecore_X_DND_Target *_target = NULL;
-static int _ecore_x_dnd_init_count = 0;
-
+static Version_Cache_Item *_version_cache = NULL;
+static int _version_cache_num = 0, _version_cache_alloc = 0;
+static void (*_posupdatecb)(void *,
+                            Ecore_X_Xdnd_Position *);
+static void *_posupdatedata;
+
+/* external variables */
+EAPI int ECORE_X_EVENT_XDND_ENTER = 0;
+EAPI int ECORE_X_EVENT_XDND_POSITION = 0;
+EAPI int ECORE_X_EVENT_XDND_STATUS = 0;
+EAPI int ECORE_X_EVENT_XDND_LEAVE = 0;
+EAPI int ECORE_X_EVENT_XDND_DROP = 0;
+EAPI int ECORE_X_EVENT_XDND_FINISHED = 0;
 
 void
-_ecore_x_dnd_init(void)
+_ecore_xcb_dnd_init(void)
 {
-   if (!_ecore_x_dnd_init_count)
-     {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-       _source = calloc(1, sizeof(Ecore_X_DND_Source));
-       _source->version = ECORE_X_DND_VERSION;
-       _source->win = XCB_NONE;
-       _source->dest = XCB_NONE;
-       _source->state = ECORE_X_DND_SOURCE_IDLE;
-
-       _target = calloc(1, sizeof(Ecore_X_DND_Target));
-       _target->win = XCB_NONE;
-       _target->source = XCB_NONE;
-       _target->state = ECORE_X_DND_TARGET_IDLE;
-
-       ECORE_X_EVENT_XDND_ENTER    = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_POSITION = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_STATUS   = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_LEAVE    = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_DROP     = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_FINISHED = ecore_event_type_new();
+   if (!_ecore_xcb_dnd_init_count)
+     {
+        _source = calloc(1, sizeof(Ecore_X_DND_Source));
+        if (!_source) return;
+        _source->version = ECORE_X_DND_VERSION;
+        _source->win = XCB_NONE;
+        _source->dest = XCB_NONE;
+        _source->state = ECORE_X_DND_SOURCE_IDLE;
+        _source->prev.window = 0;
+
+        _target = calloc(1, sizeof(Ecore_X_DND_Target));
+        if (!_target)
+          {
+             free(_source);
+             _source = NULL;
+             return;
+          }
+        _target->win = XCB_NONE;
+        _target->source = XCB_NONE;
+        _target->state = ECORE_X_DND_TARGET_IDLE;
+
+        ECORE_X_EVENT_XDND_ENTER = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_POSITION = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_STATUS = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_LEAVE = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_DROP = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_FINISHED = ecore_event_type_new();
      }
-
-   _ecore_x_dnd_init_count++;
+   _ecore_xcb_dnd_init_count++;
 }
 
 void
-_ecore_x_dnd_shutdown(void)
+_ecore_xcb_dnd_shutdown(void)
 {
-   _ecore_x_dnd_init_count--;
-   if (_ecore_x_dnd_init_count > 0)
-     return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (_source)
-     free(_source);
+   _ecore_xcb_dnd_init_count--;
+   if (_ecore_xcb_dnd_init_count > 0) return;
+   if (_source) free(_source);
    _source = NULL;
-
-   if (_target)
-     free(_target);
+   if (_target) free(_target);
    _target = NULL;
-
-   _ecore_x_dnd_init_count = 0;
+   _ecore_xcb_dnd_init_count = 0;
 }
 
 EAPI void
-ecore_x_dnd_aware_set(Ecore_X_Window window,
-                      int            on)
+ecore_x_dnd_send_status(Eina_Bool         will_accept,
+                        Eina_Bool         suppress,
+                        Ecore_X_Rectangle rect,
+                        Ecore_X_Atom      action)
 {
-   Ecore_X_Atom prop_data = ECORE_X_DND_VERSION;
+   xcb_client_message_event_t ev;
 
-   if (on)
-     ecore_x_window_prop_property_set(window, ECORE_X_ATOM_XDND_AWARE,
-                                     ECORE_X_ATOM_ATOM, 32, &prop_data, 1);
-   else
-     ecore_x_window_prop_property_del(window, ECORE_X_ATOM_XDND_AWARE);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- */
-EAPI void
-ecore_x_dnd_version_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? window : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       ECORE_X_ATOM_XDND_AWARE,
-                                       ECORE_X_ATOM_ATOM,
-                                       0, LONG_MAX);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+   if (_target->state == ECORE_X_DND_TARGET_IDLE) return;
 
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_dnd_version_get_prefetch().
- */
-EAPI void
-ecore_x_dnd_version_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   _target->will_accept = will_accept;
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.type = ECORE_X_ATOM_XDND_STATUS;
+   ev.format = 32;
+   ev.window = _target->source;
+   ev.data.data32[0] = _target->win;
+   ev.data.data32[1] = 0;
+   if (will_accept) ev.data.data32[1] |= 0x1UL;
+   if (!suppress) ev.data.data32[1] |= 0x2UL;
+
+   ev.data.data32[2] = rect.x;
+   ev.data.data32[2] <<= 16;
+   ev.data.data32[2] |= rect.y;
+   ev.data.data32[3] = rect.width;
+   ev.data.data32[3] <<= 16;
+   ev.data.data32[3] |= rect.height;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   if (will_accept)
+     ev.data.data32[4] = action;
+   else
+     ev.data.data32[4] = XCB_NONE;
+   _target->accepted_action = action;
+
+   xcb_send_event(_ecore_xcb_conn, 0, _target->source,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Get the DnD version.
- * @param  window Unused.
- * @return        0 on failure, the version otherwise.
- *
- * Get the DnD version. Returns 0 on failure, the version otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dnd_version_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_dnd_version_get_fetch(), which gets the reply.
- */
-EAPI int
-ecore_x_dnd_version_get(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_dnd_drop(void)
 {
-   unsigned char            *prop_data;
-   int                       num;
+   xcb_client_message_event_t ev;
+   Eina_Bool status = EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (ecore_x_window_prop_property_get(window, ECORE_X_ATOM_XDND_AWARE,
-                                        ECORE_X_ATOM_ATOM, 32, &prop_data, &num))
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   if (_source->dest)
      {
-       int version = (int) *prop_data;
-       free(prop_data);
-       return version;
+        ev.response_type = XCB_CLIENT_MESSAGE;
+        ev.format = 32;
+        ev.window = _source->dest;
+
+        if (_source->will_accept)
+          {
+             ev.type = ECORE_X_ATOM_XDND_DROP;
+             ev.data.data32[0] = _source->win;
+             ev.data.data32[1] = 0;
+             ev.data.data32[2] = _source->time;
+
+             xcb_send_event(_ecore_xcb_conn, 0, _source->dest,
+                            XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//             ecore_x_flush();
+             _source->state = ECORE_X_DND_SOURCE_DROPPED;
+             status = EINA_TRUE;
+          }
+        else
+          {
+             ev.type = ECORE_X_ATOM_XDND_LEAVE;
+             ev.data.data32[0] = _source->win;
+             ev.data.data32[1] = 0;
+
+             xcb_send_event(_ecore_xcb_conn, 0, _source->dest,
+                            XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//             ecore_x_flush();
+             _source->state = ECORE_X_DND_SOURCE_IDLE;
+          }
      }
    else
-     return 0;
-}
+     {
+        ecore_x_selection_xdnd_clear();
+        _source->state = ECORE_X_DND_SOURCE_IDLE;
+     }
 
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- */
-EAPI void
-ecore_x_dnd_type_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? window : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       ECORE_X_ATOM_XDND_TYPE_LIST,
-                                       ECORE_X_ATOM_ATOM,
-                                       0, LONG_MAX);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+   ecore_x_window_ignore_set(_source->win, 0);
+   _source->prev.window = 0;
 
+   return status;
+}
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_dnd_type_get_prefetch().
- */
 EAPI void
-ecore_x_dnd_type_get_fetch(void)
+ecore_x_dnd_aware_set(Ecore_X_Window win,
+                      Eina_Bool      on)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   Ecore_X_Atom prop_data = ECORE_X_DND_VERSION;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/* FIXME: round trip (InternAtomGet request) */
+   if (on)
+     ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_AWARE,
+                                      ECORE_X_ATOM_ATOM, 32, &prop_data, 1);
+   else
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_AWARE);
+}
 
-/**
- * Check if the type is set.
- * @param   window Unused.
- * @param   type   The type to check
- * @return         0 on failure, 1 otherwise.
- *
- * Check if the type is set. 0 on failure, 1 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dnd_type_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_dnd_type_get_fetch(), which gets the reply.
- */
 EAPI int
-ecore_x_dnd_type_isset(Ecore_X_Window window,
-                       const char    *type)
+ecore_x_dnd_version_get(Ecore_X_Window win)
 {
-   xcb_intern_atom_cookie_t cookie;
-   xcb_intern_atom_reply_t *reply;
-   Ecore_X_Atom            *atoms;
-   unsigned char           *data;
-   int                      num;
-   int                      i;
-   uint8_t                  ret = 0;
-
-   cookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
-                                      strlen(type), type);
-
-   if (!ecore_x_window_prop_property_get(window, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                        ECORE_X_ATOM_ATOM, 32, &data, &num))
+   unsigned char *data;
+   int num = 0;
+   Version_Cache_Item *t;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
      {
-        reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
-        if (reply) free(reply);
-        return ret;
+        if (_version_cache)
+          {
+             int i = 0;
+
+             for (i = 0; i < _version_cache_num; i++)
+               {
+                  if (_version_cache[i].win == win)
+                    return _version_cache[i].ver;
+               }
+          }
      }
 
-   reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply)
+   if (ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_AWARE,
+                                        ECORE_X_ATOM_ATOM, 32, &data, &num))
      {
+        int version = 0;
+
+        version = (int)*data;
         free(data);
-        return 0;
+        if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
+          {
+             _version_cache_num++;
+             if (_version_cache_num > _version_cache_alloc)
+               _version_cache_alloc += 16;
+             t = realloc(_version_cache,
+                         _version_cache_alloc * sizeof(Version_Cache_Item));
+             if (!t) return 0;
+             _version_cache = t;
+             _version_cache[_version_cache_num - 1].win = win;
+             _version_cache[_version_cache_num - 1].ver = version;
+          }
+        return version;
      }
-   atoms = (Ecore_X_Atom *)data;
 
+   if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
+     {
+        _version_cache_num++;
+        if (_version_cache_num > _version_cache_alloc)
+          _version_cache_alloc += 16;
+        t = realloc(_version_cache,
+                    _version_cache_alloc * sizeof(Version_Cache_Item));
+        if (!t) return 0;
+        _version_cache = t;
+        _version_cache[_version_cache_num - 1].win = win;
+        _version_cache[_version_cache_num - 1].ver = 0;
+     }
+
+   return 0;
+}
+
+EAPI Eina_Bool
+ecore_x_dnd_type_isset(Ecore_X_Window win,
+                       const char    *type)
+{
+   int num = 0, i = 0;
+   Eina_Bool ret = EINA_FALSE;
+   unsigned char *data;
+   Ecore_X_Atom *atoms, atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                         ECORE_X_ATOM_ATOM, 32, &data, &num))
+     return ret;
+
+   atom = ecore_x_atom_get(type);
+   atoms = (Ecore_X_Atom *)data;
    for (i = 0; i < num; ++i)
      {
-       if (reply->atom == atoms[i])
-         {
-            ret = 1;
-            break;
-         }
+        if (atom == atoms[i])
+          {
+             ret = EINA_TRUE;
+             break;
+          }
      }
 
    free(data);
-   free(reply);
-
    return ret;
 }
 
-/* FIXME: round trip (InternAtomGet request) */
-
-/**
- * Set the type.
- * @param   window Unused.
- * @param   type   The type to set
- * @param   on     0 or non 0...
- *
- * Set the type.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dnd_type_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_dnd_type_get_fetch(), which gets the reply.
- */
 EAPI void
-ecore_x_dnd_type_set(Ecore_X_Window window,
+ecore_x_dnd_type_set(Ecore_X_Window win,
                      const char    *type,
-                     int            on)
+                     Eina_Bool      on)
 {
-   xcb_intern_atom_cookie_t cookie;
-   xcb_intern_atom_reply_t *reply;
-   Ecore_X_Atom            *oldset = NULL;
-   Ecore_X_Atom            *newset = NULL;
-   unsigned char           *data = NULL;
-   unsigned char           *old_data = NULL;
-   Ecore_X_Atom             atom;
-   int                      i, j = 0, num = 0;
-
-   cookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
-                                      strlen(type), type);
+   Ecore_X_Atom atom, *oldset = NULL, *newset = NULL;
+   int i = 0, j = 0, num = 0;
+   unsigned char *data = NULL, *old_data = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
    atom = ecore_x_atom_get(type);
-   if (!ecore_x_window_prop_property_get(window, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                         ECORE_X_ATOM_ATOM,
-                                         32, &old_data, &num))
-     {
-        reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
-        if (reply) free(reply);
-        return;
-     }
+   ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                    ECORE_X_ATOM_ATOM, 32, &old_data, &num);
    oldset = (Ecore_X_Atom *)old_data;
-
    if (on)
      {
-       if (ecore_x_dnd_type_isset(window, type))
-         {
-            free(old_data);
-             reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
-             if (reply) free(reply);
-            return;
-         }
-       data = calloc(num + 1, sizeof(Ecore_X_Atom));
-       if (!data)
+        if (ecore_x_dnd_type_isset(win, type))
           {
-            free(old_data);
-             reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
-             if (reply) free(reply);
+             free(old_data);
              return;
           }
-       newset = (Ecore_X_Atom *)data;
-
-       for (i = 0; i < num; i++)
-         newset[i + 1] = oldset[i];
-       /* prepend the new type */
-
-        reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
-        if (!reply)
-          {
-            free(old_data);
-            return;
-          }
-       newset[0] = reply->atom;
-        free(reply);
-
-       ecore_x_window_prop_property_set(window,
-                                         ECORE_X_ATOM_XDND_TYPE_LIST,
-                                         ECORE_X_ATOM_ATOM,
-                                         32, data, num + 1);
+        newset = calloc(num + 1, sizeof(Ecore_X_Atom));
+        if (!newset) return;
+        data = (unsigned char *)newset;
+        for (i = 0; i < num; i++)
+          newset[i + 1] = oldset[i];
+        newset[0] = atom;
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                         ECORE_X_ATOM_ATOM, 32, data, num + 1);
      }
    else
      {
-       if (!ecore_x_dnd_type_isset(window, type))
-         {
-            free(old_data);
-            return;
-         }
-       newset = calloc(num - 1, sizeof(Ecore_X_Atom));
-       if (!newset)
-         {
-            free(old_data);
-            return;
-         }
-       data = (unsigned char *)newset;
-       for (i = 0; i < num; i++)
-         if (oldset[i] != atom)
-           newset[j++] = oldset[i];
-
-       ecore_x_window_prop_property_set(window,
-                                         ECORE_X_ATOM_XDND_TYPE_LIST,
-                                         ECORE_X_ATOM_ATOM,
-                                         32, data, num - 1);
+        if (!ecore_x_dnd_type_isset(win, type))
+          {
+             free(old_data);
+             return;
+          }
+        newset = calloc(num - 1, sizeof(Ecore_X_Atom));
+        if (!newset)
+          {
+             free(old_data);
+             return;
+          }
+        data = (unsigned char *)newset;
+        for (i = 0; i < num; i++)
+          if (oldset[i] != atom)
+            newset[j++] = oldset[i];
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                         ECORE_X_ATOM_ATOM, 32, data, num - 1);
      }
-
    free(oldset);
    free(newset);
 }
 
-/* FIXME: round trips, but I don't think we can do much, here */
-
-/**
- * Set the types.
- * @param   window Unused.
- * @param   types  The types to set
- * @param   num_types The number of types
- *
- * Set the types.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dnd_type_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_dnd_type_get_fetch(), which gets the reply.
- */
 EAPI void
-ecore_x_dnd_types_set(Ecore_X_Window window,
-                      char         **types,
+ecore_x_dnd_types_set(Ecore_X_Window win,
+                      const char   **types,
                       unsigned int   num_types)
 {
    Ecore_X_Atom *newset = NULL;
-   void         *data = NULL;
-   uint32_t      i;
+   unsigned int i;
+   unsigned char *data = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
    if (!num_types)
-     {
-       ecore_x_window_prop_property_del(window, ECORE_X_ATOM_XDND_TYPE_LIST);
-     }
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_TYPE_LIST);
    else
      {
-        xcb_intern_atom_cookie_t *cookies;
-        xcb_intern_atom_reply_t  *reply;
-
-        cookies = (xcb_intern_atom_cookie_t *)malloc(sizeof(xcb_intern_atom_cookie_t));
-        if (!cookies) return;
-       for (i = 0; i < num_types; i++)
-         cookies[i] = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
-                                                 strlen(types[i]), types[i]);
-        data = calloc(num_types, sizeof(Ecore_X_Atom));
-       if (!data)
+        newset = calloc(num_types, sizeof(Ecore_X_Atom));
+        if (!newset) return;
+
+        data = (unsigned char *)newset;
+        for (i = 0; i < num_types; i++)
           {
-            for (i = 0; i < num_types; i++)
-              {
-                 reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookies[i], NULL);
-                 if (reply) free(reply);
-              }
-            free(cookies);
-            return;
+             newset[i] = ecore_x_atom_get(types[i]);
+             ecore_x_selection_converter_atom_add(newset[i],
+                                                  _ecore_xcb_dnd_converter_copy);
           }
-       newset = data;
-       for (i = 0; i < num_types; i++)
-          {
-             reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookies[i], NULL);
-             if (reply)
-               {
-                  newset[i] = reply->atom;
-                  free(reply);
-               }
-             else
-               newset[i] = XCB_NONE;
-          }
-        free(cookies);
-       ecore_x_window_prop_property_set(window, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                         ECORE_X_ATOM_ATOM, 32, data, num_types);
-       free(data);
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                         ECORE_X_ATOM_ATOM, 32, data,
+                                         num_types);
+        free(newset);
      }
 }
 
-Ecore_X_DND_Source *
-_ecore_x_dnd_source_get(void)
+EAPI void
+ecore_x_dnd_actions_set(Ecore_X_Window win,
+                        Ecore_X_Atom  *actions,
+                        unsigned int   num_actions)
 {
-   return _source;
-}
+   unsigned int i;
+   unsigned char *data = NULL;
 
-Ecore_X_DND_Target *
-_ecore_x_dnd_target_get(void)
-{
-   return _target;
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/**
- * Sends the GetProperty request.
- * @param source Window whose properties are requested.
- */
-EAPI void
-ecore_x_dnd_begin_prefetch(Ecore_X_Window source)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       source ? source : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       ECORE_X_ATOM_XDND_AWARE,
-                                       ECORE_X_ATOM_ATOM,
-                                       0, LONG_MAX);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (!num_actions)
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_ACTION_LIST);
+   else
+     {
+        data = (unsigned char *)actions;
+        for (i = 0; i < num_actions; i++)
+          ecore_x_selection_converter_atom_add(actions[i],
+                                               _ecore_xcb_dnd_converter_copy);
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_ACTION_LIST,
+                                         ECORE_X_ATOM_ATOM, 32, data,
+                                         num_actions);
+     }
 }
 
-
 /**
- * Gets the reply of the GetProperty request sent by ecore_x_dnd_begin_prefetch().
+ * The DND position update cb is called Ecore_X sends a DND position to a
+ * client.
+ *
+ * It essentially mirrors some of the data sent in the position message.
+ * Generally this cb should be set just before position update is called.
+ * Please note well you need to look after your own data pointer if someone
+ * trashes you position update cb set.
+ *
+ * It is considered good form to clear this when the dnd event finishes.
+ *
+ * @param cb Callback to updated each time ecore_x sends a position update.
+ * @param data User data.
  */
 EAPI void
-ecore_x_dnd_begin_fetch(void)
+ecore_x_dnd_callback_pos_update_set(void (*cb)(void *, Ecore_X_Xdnd_Position *data),
+                                    const void *data)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   _posupdatecb = cb;
+   _posupdatedata = (void *)data;
 }
 
-/* FIXME: round trip */
-
-/**
- * Begins the DnD.
- * @param  source Unused.
- * @param  data   The data.
- * @param  size   The size of the data.
- * @return        0 on failure, 1 otherwise.
- *
- * Begins the DnD. Returns 0 on failure, 1 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dnd_begin_prefetch(), which sends the GetProperty request,
- * then ecore_x_dnd_begin_fetch(), which gets the reply.
- */
-EAPI int
+EAPI Eina_Bool
 ecore_x_dnd_begin(Ecore_X_Window source,
                   unsigned char *data,
                   int            size)
 {
-   ecore_x_selection_xdnd_prefetch();
-   if (!ecore_x_dnd_version_get(source))
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_dnd_version_get(source)) return EINA_FALSE;
+
+   /* Take ownership of XdndSelection */
+   if (!ecore_x_selection_xdnd_set(source, data, size)) return EINA_FALSE;
+
+   if (_version_cache)
      {
-        ecore_x_selection_xdnd_fetch();
-        return 0;
+        free(_version_cache);
+        _version_cache = NULL;
+        _version_cache_num = 0;
+        _version_cache_alloc = 0;
      }
 
-   /* Take ownership of XdndSelection */
-   ecore_x_selection_xdnd_prefetch();
-   ecore_x_selection_xdnd_fetch();
-   if (!ecore_x_selection_xdnd_set(source, data, size))
-     return 0;
+   ecore_x_window_shadow_tree_flush();
 
    _source->win = source;
    ecore_x_window_ignore_set(_source->win, 1);
    _source->state = ECORE_X_DND_SOURCE_DRAGGING;
-   _source->time = _ecore_xcb_event_last_time;
+   _source->time = _ecore_xcb_events_last_time_get();
+   _source->prev.window = 0;
 
-   /* Default Accepted Action: ask */
-   _source->action = ECORE_X_ATOM_XDND_ACTION_COPY;
+   /* Default Accepted Action: move */
+   _source->action = ECORE_X_ATOM_XDND_ACTION_MOVE;
    _source->accepted_action = XCB_NONE;
-   return 1;
-}
-
-EAPI int
-ecore_x_dnd_drop(void)
-{
-   uint8_t status = 0;
-
-   if (_source->dest)
-     {
-        xcb_client_message_event_t ev;
-
-       ev.response_type = XCB_CLIENT_MESSAGE;
-       ev.format = 32;
-       ev.window = _source->dest;
-
-       if (_source->will_accept)
-         {
-            ev.type = ECORE_X_ATOM_XDND_DROP;
-            ev.data.data32[0] = _source->win;
-            ev.data.data32[1] = 0;
-            ev.data.data32[2] = _source->time;
-            xcb_send_event(_ecore_xcb_conn, 0, _source->dest, 0, (const char *)&ev);
-            _source->state = ECORE_X_DND_SOURCE_DROPPED;
-            status = 1;
-         }
-       else
-         {
-            ev.type = ECORE_X_ATOM_XDND_LEAVE;
-            ev.data.data32[0] = _source->win;
-            ev.data.data32[1] = 0;
-            xcb_send_event(_ecore_xcb_conn, 0, _source->dest, 0, (const char *)&ev);
-            _source->state = ECORE_X_DND_SOURCE_IDLE;
-         }
-     }
-   else
-     {
-       /* Dropping on nothing */
-       ecore_x_selection_xdnd_clear();
-       _source->state = ECORE_X_DND_SOURCE_IDLE;
-     }
-   ecore_x_window_ignore_set(_source->win, 0);
-
    _source->dest = XCB_NONE;
 
-   return status;
+   return EINA_TRUE;
 }
 
 EAPI void
-ecore_x_dnd_send_status(int               will_accept,
-                        int               suppress,
-                        Ecore_X_Rectangle rectangle,
-                        Ecore_X_Atom      action)
+ecore_x_dnd_send_finished(void)
 {
    xcb_client_message_event_t ev;
 
-   if (_target->state == ECORE_X_DND_TARGET_IDLE)
-     return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   _target->will_accept = will_accept;
+   if (_target->state == ECORE_X_DND_TARGET_IDLE) return;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
 
    ev.response_type = XCB_CLIENT_MESSAGE;
    ev.format = 32;
+   ev.type = ECORE_X_ATOM_XDND_FINISHED;
    ev.window = _target->source;
-   ev.type = ECORE_X_ATOM_XDND_STATUS;
-
    ev.data.data32[0] = _target->win;
    ev.data.data32[1] = 0;
-   if (will_accept)
-     ev.data.data32[1] |= 0x1UL;
-   if (!suppress)
-     ev.data.data32[1] |= 0x2UL;
-
-   /* Set rectangle information */
-   ev.data.data32[2] = rectangle.x;
-   ev.data.data32[2] <<= 16;
-   ev.data.data32[2] |= rectangle.y;
-   ev.data.data32[3] = rectangle.width;
-   ev.data.data32[3] <<= 16;
-   ev.data.data32[3] |= rectangle.height;
-
-   if (will_accept)
-     {
-       ev.data.data32[4] = action;
-       _target->accepted_action = action;
-     }
-   else
+   ev.data.data32[2] = 0;
+   if (_target->will_accept)
      {
-       ev.data.data32[4] = XCB_NONE;
-       _target->accepted_action = action;
+        ev.data.data32[1] |= 0x1UL;
+        ev.data.data32[2] = _target->accepted_action;
      }
 
-   xcb_send_event(_ecore_xcb_conn, 0, _target->source, 0, (const char *)&ev);
+   xcb_send_event(_ecore_xcb_conn, 0, _target->source,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
+   _target->state = ECORE_X_DND_TARGET_IDLE;
 }
 
 EAPI void
-ecore_x_dnd_send_finished(void)
+ecore_x_dnd_source_action_set(Ecore_X_Atom action)
 {
-   xcb_client_message_event_t ev;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (_target->state == ECORE_X_DND_TARGET_IDLE)
-     return;
-
-   ev.response_type = XCB_CLIENT_MESSAGE;
-   ev.format = 32;
-   ev.window = _target->source;
-   ev.type = ECORE_X_ATOM_XDND_FINISHED;
+   _source->action = action;
+   if (_source->prev.window)
+     _ecore_xcb_dnd_drag(_source->prev.window,
+                         _source->prev.x, _source->prev.y);
+}
 
-   ev.data.data32[0] = _target->win;
-   ev.data.data32[1] = 0;
-   ev.data.data32[2] = 0;
-   if (_target->will_accept)
-     {
-       ev.data.data32[1] |= 0x1UL;
-       ev.data.data32[2] = _target->accepted_action;
-     }
-   xcb_send_event(_ecore_xcb_conn, 0, _target->source, 0, (const char *)&ev);
+Ecore_X_DND_Source *
+_ecore_xcb_dnd_source_get(void)
+{
+   return _source;
+}
 
-   _target->state = ECORE_X_DND_TARGET_IDLE;
+Ecore_X_DND_Target *
+_ecore_xcb_dnd_target_get(void)
+{
+   return _target;
 }
 
 void
-_ecore_x_dnd_drag(Ecore_X_Window root,
-                 int x,
-                  int y)
+_ecore_xcb_dnd_drag(Ecore_X_Window root,
+                    int            x,
+                    int            y)
 {
    xcb_client_message_event_t ev;
-   Ecore_X_Window             win;
-   Ecore_X_Window            *skip;
-   int                        num;
+   Ecore_X_Window win, *skip;
+   Ecore_X_Xdnd_Position pos;
+   int num = 0;
+
+   if (_source->state != ECORE_X_DND_SOURCE_DRAGGING) return;
 
-   if (_source->state != ECORE_X_DND_SOURCE_DRAGGING)
-     return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
 
    ev.response_type = XCB_CLIENT_MESSAGE;
    ev.format = 32;
 
-   /* Attempt to find a DND-capable window under the cursor */
    skip = ecore_x_window_ignore_list(&num);
-//   win = ecore_x_window_at_xy_with_skip_get(x, y, skip, num);
    win = ecore_x_window_shadow_tree_at_xy_with_skip_get(root, x, y, skip, num);
-   while (win)
+   while ((win) && !(ecore_x_dnd_version_get(win)))
+     win = ecore_x_window_shadow_parent_get(root, win);
+
+   if ((_source->dest) && (win != _source->dest))
      {
-        xcb_query_tree_cookie_t cookie_tree;
-        xcb_query_tree_reply_t *reply_tree;
+        ev.window = _source->dest;
+        ev.type = ECORE_X_ATOM_XDND_LEAVE;
+        ev.data.data32[0] = _source->win;
+        ev.data.data32[1] = 0;
+
+        xcb_send_event(_ecore_xcb_conn, 0, _source->dest,
+                       XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//        ecore_x_flush();
+        _source->suppress = 0;
+     }
 
-        ecore_x_dnd_version_get_prefetch(win);
-        cookie_tree = xcb_query_tree_unchecked(_ecore_xcb_conn, win);
+   if (win)
+     {
+        int x1, x2, y1, y2;
 
-        ecore_x_dnd_version_get_fetch();
-        /* We found the correct window ? */
-        if (ecore_x_dnd_version_get(win))
+        _source->version = MIN(ECORE_X_DND_VERSION,
+                               ecore_x_dnd_version_get(win));
+        if (win != _source->dest)
           {
-             reply_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_tree, NULL);
-             if (reply_tree) free(reply_tree);
-             break;
+             int i = 0;
+             unsigned char *data;
+             Ecore_X_Atom *types;
+
+             ecore_x_window_prop_property_get(_source->win,
+                                              ECORE_X_ATOM_XDND_TYPE_LIST,
+                                              ECORE_X_ATOM_ATOM, 32,
+                                              &data, &num);
+             types = (Ecore_X_Atom *)data;
+             ev.window = win;
+             ev.type = ECORE_X_ATOM_XDND_ENTER;
+             ev.data.data32[0] = _source->win;
+             ev.data.data32[1] = 0;
+             if (num > 3)
+               ev.data.data32[1] |= 0x1UL;
+             else
+               ev.data.data32[1] &= 0xfffffffeUL;
+             ev.data.data32[1] |= ((unsigned long)_source->version) << 24;
+
+             for (i = 2; i < 5; i++)
+               ev.data.data32[i] = 0;
+             for (i = 0; i < MIN(num, 3); ++i)
+               ev.data.data32[i + 2] = types[i];
+             free(data);
+
+             xcb_send_event(_ecore_xcb_conn, 0, win,
+                            XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//             ecore_x_flush();
+             _source->await_status = 0;
+             _source->will_accept = 0;
           }
-        reply_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_tree, NULL);
-        if (reply_tree)
+
+        x1 = _source->rectangle.x;
+        x2 = _source->rectangle.x + _source->rectangle.width;
+        y1 = _source->rectangle.y;
+        y2 = _source->rectangle.y + _source->rectangle.height;
+
+        if ((!_source->await_status) || (!_source->suppress) ||
+            ((x < x1) || (x > x2) || (y < y1) || (y > y2)))
           {
-            win = reply_tree->parent;
-            free(reply_tree);
+             ev.window = win;
+             ev.type = ECORE_X_ATOM_XDND_POSITION;
+             ev.data.data32[0] = _source->win;
+             ev.data.data32[1] = 0;
+             ev.data.data32[2] = ((x << 16) & 0xffff0000) | (y & 0xffff);
+             ev.data.data32[3] = _source->time;
+             ev.data.data32[4] = _source->action;
+
+             xcb_send_event(_ecore_xcb_conn, 0, win,
+                            XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//             ecore_x_flush();
+             _source->await_status = 1;
           }
      }
 
-   /* Send XdndLeave to current destination window if we have left it */
-   if ((_source->dest) && (win != _source->dest))
+   if (_posupdatecb)
      {
-       ev.window = _source->dest;
-       ev.type = ECORE_X_ATOM_XDND_LEAVE;
-       ev.data.data32[0] = _source->win;
-       ev.data.data32[1] = 0;
-
-       xcb_send_event(_ecore_xcb_conn, 0, _source->dest, 0, (const char *)&ev);
-       _source->suppress = 0;
+        pos.position.x = x;
+        pos.position.y = y;
+        pos.win = win;
+        pos.prev = _source->dest;
+        _posupdatecb(_posupdatedata, &pos);
      }
 
-   if (win)
-     {
-       int16_t                   x1;
-       int16_t                   x2;
-       int16_t                   y1;
-       int16_t                   y2;
+   _source->prev.x = x;
+   _source->prev.y = y;
+   _source->prev.window = root;
+   _source->dest = win;
+}
 
-        ecore_x_dnd_version_get_prefetch(win);
-        ecore_x_dnd_type_get_prefetch(_source->win);
+EAPI Ecore_X_Atom
+ecore_x_dnd_source_action_get(void)
+{
+   return _source->action;
+}
 
-        ecore_x_dnd_version_get_fetch();
-        if (!ecore_x_dnd_version_get(win))
+/* local functions */
+static Eina_Bool
+_ecore_xcb_dnd_converter_copy(char         *target __UNUSED__,
+                              void         *data,
+                              int           size,
+                              void        **data_ret,
+                              int          *size_ret,
+                              Ecore_X_Atom *tprop __UNUSED__,
+                              int          *count __UNUSED__)
+{
+   Ecore_Xcb_Textproperty text_prop;
+   Ecore_Xcb_Encoding_Style style = XcbTextStyle;
+   char *mystr;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if ((!data) || (!size)) return EINA_FALSE;
+
+   mystr = calloc(1, size + 1);
+   if (!mystr) return EINA_FALSE;
+
+   memcpy(mystr, data, size);
+   if (_ecore_xcb_mb_textlist_to_textproperty(&mystr, 1, style, &text_prop))
+     {
+        int len;
+
+        len = strlen((char *)text_prop.value) + 1;
+        if (!(*data_ret = malloc(len)))
           {
-            ecore_x_dnd_type_get_fetch();
-            return;
+             free(mystr);
+             return EINA_FALSE;
           }
-
-       _source->version = MIN(ECORE_X_DND_VERSION,
-                               ecore_x_dnd_version_get(win));
-       if (win != _source->dest)
-         {
-            unsigned char *data;
-            Ecore_X_Atom  *types;
-            int            num;
-            int            i;
-
-             ecore_x_dnd_type_get_fetch();
-             if (!ecore_x_window_prop_property_get(_source->win,
-                                                   ECORE_X_ATOM_XDND_TYPE_LIST,
-                                                   ECORE_X_ATOM_ATOM,
-                                                   32, &data, &num))
-               return;
-
-            types = (Ecore_X_Atom *)data;
-
-            /* Entered new window, send XdndEnter */
-            ev.window = win;
-            ev.type = ECORE_X_ATOM_XDND_ENTER;
-            ev.data.data32[0] = _source->win;
-            ev.data.data32[1] = 0;
-            if (num > 3)
-              ev.data.data32[1] |= 0x1UL;
-            else
-              ev.data.data32[1] &= 0xfffffffeUL;
-            ev.data.data32[1] |= ((unsigned long) _source->version) << 24;
-
-            for (i = 2; i < 5; i++)
-              ev.data.data32[i] = 0;
-            for (i = 0; i < MIN(num, 3); ++i)
-              ev.data.data32[i + 2] = types[i];
-            free(data);
-            xcb_send_event(_ecore_xcb_conn, 0, win, 0, (const char *)&ev);
-            _source->await_status = 0;
-            _source->will_accept = 0;
-         }
-        else
-          ecore_x_dnd_type_get_fetch();
-
-       /* Determine if we're still in the rectangle from the last status */
-       x1 = _source->rectangle.x;
-       x2 = _source->rectangle.x + _source->rectangle.width;
-       y1 = _source->rectangle.y;
-       y2 = _source->rectangle.y + _source->rectangle.height;
-
-       if ((!_source->await_status) ||
-           (!_source->suppress) ||
-           ((x < x1) || (x > x2) || (y < y1) || (y > y2)))
-         {
-            ev.window = win;
-            ev.type = ECORE_X_ATOM_XDND_POSITION;
-            ev.data.data32[0] = _source->win;
-            ev.data.data32[1] = 0; /* Reserved */
-            ev.data.data32[2] = ((x << 16) & 0xffff0000) | (y & 0xffff);
-            ev.data.data32[3] = _source->time; /* Version 1 */
-            ev.data.data32[4] = _source->action; /* Version 2, Needs to be pre-set */
-            xcb_send_event(_ecore_xcb_conn, 0, win, 0, (const char *)&ev);
-
-            _source->await_status = 1;
-         }
+        memcpy(*data_ret, text_prop.value, len);
+        *size_ret = len;
+        free(text_prop.value);
+        free(mystr);
+        return EINA_TRUE;
+     }
+   else
+     {
+        free(mystr);
+        return EINA_FALSE;
      }
-
-   _source->dest = win;
 }
+
index cb61d45..39ef589 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
+#ifdef ECORE_XCB_DAMAGE
+# include <xcb/dpms.h>
+#endif
 
-
-/**
- * @defgroup Ecore_X_DPMS_Group X DPMS Extension Functions
- *
- * Functions related to the X DPMS extension.
- */
-
-
-#ifdef ECORE_XCB_DPMS
-static int _dpms_available = 0;
-static xcb_dpms_get_version_cookie_t _ecore_xcb_dpms_init_cookie;
-#endif /* ECORE_XCB_DPMS */
-
-/* To avoid round trips, the initialization is separated in 2
-   functions: _ecore_xcb_dpms_init and
-   _ecore_xcb_dpms_init_finalize. The first one gets the cookies and
-   the second one gets the replies. */
+/* local variables */
+static Eina_Bool _dpms_avail = EINA_FALSE;
 
 void
-_ecore_x_dpms_init(const xcb_query_extension_reply_t *reply)
+_ecore_xcb_dpms_init(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
 #ifdef ECORE_XCB_DPMS
-   if (reply && (reply->present))
-      _ecore_xcb_dpms_init_cookie = xcb_dpms_get_version_unchecked(_ecore_xcb_conn, 0, 0);
-#endif /* ECORE_XCB_DPMS */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_dpms_id);
+#endif
 }
 
 void
-_ecore_x_dpms_init_finalize(void)
+_ecore_xcb_dpms_finalize(void)
 {
 #ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_version_reply_t *reply;
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
-   reply = xcb_dpms_get_version_reply(_ecore_xcb_conn,
-                                      _ecore_xcb_dpms_init_cookie, NULL);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (reply)
+#ifdef ECORE_XCB_DPMS
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_dpms_id);
+   if ((ext_reply) && (ext_reply->present))
      {
-        if (reply->server_major_version >= 1)
-          _dpms_available = 1;
-        free(reply);
+        xcb_dpms_get_version_cookie_t cookie;
+        xcb_dpms_get_version_reply_t *reply;
+
+        cookie =
+          xcb_dpms_get_version_unchecked(_ecore_xcb_conn,
+                                         XCB_DPMS_MAJOR_VERSION,
+                                         XCB_DPMS_MINOR_VERSION);
+        reply = xcb_dpms_get_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             if (reply->server_major_version >= 1)
+               _dpms_avail = EINA_TRUE;
+             free(reply);
+          }
      }
-#endif /* ECORE_XCB_DPMS */
+#endif
 }
 
-
 /**
- * Checks if the DPMS extension is available or not.
- * @return @c 1 if the DPMS extension is available, @c 0 otherwise.
+ * @defgroup Ecore_X_DPMS_Group X DPMS Extension Functions
  *
- * Return 1 if the X server supports the DPMS Extension version 1.0,
- * 0 otherwise.
- * @ingroup Ecore_X_DPMS_Group
+ * Functions related to the X DPMS Extension
  */
-EAPI int
-ecore_x_dpms_query(void)
-{
-#ifdef ECORE_XCB_DPMS
-   return _dpms_available;
-#else
-   return 0;
-#endif /* ECORE_XCB_DPMS */
-}
-
 
 /**
- * Sends the DPMSCapable request.
- * @ingroup Ecore_X_DPMS_Group
- */
-EAPI void
-ecore_x_dpms_capable_get_prefetch(void)
-{
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_capable_cookie_t cookie;
-
-   cookie = xcb_dpms_capable_unchecked(_ecore_xcb_conn);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-#endif /* ECORE_XCB_DPMS */
-}
-
-
-/**
- * Gets the reply of the DPMSCapable request sent by ecore_x_dpms_capable_get_prefetch().
+ * Checks if the DPMS extension is available or not.
+ *
+ * @return @c EINA_TRUE if the DPMS extension is available,
+ * @c EINA_FALSE otherwise.
+ *
+ * Return @c EINA_TRUE if the X server supports the DPMS Extension version 1.0,
+ * @c EINA_FALSE otherwise.
+ *
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI void
-ecore_x_dpms_capable_get_fetch(void)
+EAPI Eina_Bool
+ecore_x_dpms_query(void)
 {
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_capable_cookie_t cookie;
-   xcb_dpms_capable_reply_t *reply;
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_dpms_capable_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-#endif /* ECORE_XCB_DPMS */
+     return _dpms_avail;
 }
 
-
 /**
  * Checks if the X server is capable of DPMS.
  * @return @c 1 if the X server is capable of DPMS, @c 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_capable_get_prefetch(), which sends the DPMSCapable request,
- * then ecore_x_dpms_capable_get_fetch(), which gets the reply.
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_dpms_capable_get(void)
 {
-   int                       capable = 0;
+   Eina_Bool ret = EINA_FALSE;
 #ifdef ECORE_XCB_DPMS
+   xcb_dpms_capable_cookie_t cookie;
    xcb_dpms_capable_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   capable = reply->capable;
-#endif /* ECORE_XCB_DPMS */
+   if (!_dpms_avail) return EINA_FALSE;
 
-   return capable;
-}
-
-
-/**
- * Sends the DPMSInfo request.
- * @ingroup Ecore_X_DPMS_Group
- */
-EAPI void
-ecore_x_dpms_enable_get_prefetch(void)
-{
 #ifdef ECORE_XCB_DPMS
-   xcb_dpms_info_cookie_t cookie;
+   cookie = xcb_dpms_capable_unchecked(_ecore_xcb_conn);
+   reply = xcb_dpms_capable_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        ret = reply->capable;
+        free(reply);
+     }
+#endif
 
-   cookie = xcb_dpms_info_unchecked(_ecore_xcb_conn);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-#endif /* ECORE_XCB_DPMS */
+   return ret;
 }
 
-
 /**
- * Gets the reply of the DPMSInfo request sent by ecore_x_dpms_enable_get_prefetch().
+ * Checks the DPMS state of the display.
+ * @return @c EINA_TRUE if DPMS is enabled, @c EINA_FALSE otherwise.
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI void
-ecore_x_dpms_enable_get_fetch(void)
+EAPI Eina_Bool
+ecore_x_dpms_enabled_get(void)
 {
+   Eina_Bool ret = EINA_FALSE;
 #ifdef ECORE_XCB_DPMS
    xcb_dpms_info_cookie_t cookie;
    xcb_dpms_info_reply_t *reply;
+#endif
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_dpms_info_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-#endif /* ECORE_XCB_DPMS */
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if (!_dpms_avail) return EINA_FALSE;
 
-/**
- * Checks the DPMS state of the display.
- * @return @c 1 if DPMS is enabled, @c 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_enapable_get_prefetch(), which sends the DPMSInfo request,
- * then ecore_x_dpms_enapable_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_DPMS_Group
- */
-EAPI int
-ecore_x_dpms_enable_get(void)
-{
-   int                    enable = 0;
 #ifdef ECORE_XCB_DPMS
-   xcb_dpms_info_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
-
-   enable = reply->state;
-#endif /* ECORE_XCB_DPMS */
+   cookie = xcb_dpms_info_unchecked(_ecore_xcb_conn);
+   reply = xcb_dpms_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+   if (reply->state) ret = EINA_TRUE;
+   free(reply);
+#endif
 
-   return enable;
+   return ret;
 }
 
-
 /**
  * Sets the DPMS state of the display.
  * @param enabled @c 0 to disable DPMS characteristics of the server, enable it otherwise.
@@ -197,255 +142,179 @@ ecore_x_dpms_enable_get(void)
 EAPI void
 ecore_x_dpms_enabled_set(int enabled)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_dpms_avail) return;
+
 #ifdef ECORE_XCB_DPMS
    if (enabled)
-      xcb_dpms_enable(_ecore_xcb_conn);
+     xcb_dpms_enable(_ecore_xcb_conn);
    else
-      xcb_dpms_disable(_ecore_xcb_conn);
-#endif /* ECORE_XCB_DPMS */
+     xcb_dpms_disable(_ecore_xcb_conn);
+#endif
 }
 
-
 /**
- * Sets the timeouts. The values are in unit of seconds.
+ * Gets the timeouts. The values are in unit of seconds.
  * @param standby Amount of time of inactivity before standby mode will be invoked.
  * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
  * @param off     Amount of time of inactivity before the monitor is shut off.
- * @return        Returns always 1.
- * @ingroup Ecore_X_DPMS_Group
- */
-EAPI int
-ecore_x_dpms_timeouts_set(unsigned int standby,
-                          unsigned int suspend,
-                          unsigned int off)
-{
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_set_timeouts(_ecore_xcb_conn, standby, suspend, off);
-#endif /* ECORE_XCB_DPMS */
-
-   return 1;
-}
-
-
-/**
- * Sends the DPMSGetTimeouts request.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
-ecore_x_dpms_timeouts_get_prefetch(void)
+ecore_x_dpms_timeouts_get(unsigned int *standby,
+                          unsigned int *suspend,
+                          unsigned int *off)
 {
 #ifdef ECORE_XCB_DPMS
    xcb_dpms_get_timeouts_cookie_t cookie;
+   xcb_dpms_get_timeouts_reply_t *reply;
+#endif
 
-   cookie = xcb_dpms_get_timeouts_unchecked(_ecore_xcb_conn);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-#endif /* ECORE_XCB_DPMS */
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if (standby) *standby = 0;
+   if (suspend) *suspend = 0;
+   if (off) *off = 0;
 
-/**
- * Gets the reply of the DPMSGetTimeouts request sent by ecore_x_dpms_timeouts_get_prefetch().
- * @ingroup Ecore_X_DPMS_Group
- */
-EAPI void
-ecore_x_dpms_timeouts_get_fetch(void)
-{
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_cookie_t cookie;
-   xcb_dpms_get_timeouts_reply_t *reply;
+   if (!_dpms_avail) return;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
+#ifdef ECORE_XCB_DPMS
+   cookie = xcb_dpms_get_timeouts_unchecked(_ecore_xcb_conn);
    reply = xcb_dpms_get_timeouts_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-#endif /* ECORE_XCB_DPMS */
+   if (!reply) return;
+   if (standby) *standby = reply->standby_timeout;
+   if (suspend) *suspend = reply->suspend_timeout;
+   if (off) *off = reply->off_timeout;
+   free(reply);
+#endif
 }
 
-
 /**
- * Gets the timeouts. The values are in unit of seconds.
+ * Sets the timeouts. The values are in unit of seconds.
+ *
  * @param standby Amount of time of inactivity before standby mode will be invoked.
  * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
  * @param off     Amount of time of inactivity before the monitor is shut off.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure.
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI void
-ecore_x_dpms_timeouts_get(unsigned int *standby,
-                          unsigned int *suspend,
-                          unsigned int *off)
+EAPI Eina_Bool
+ecore_x_dpms_timeouts_set(unsigned int standby,
+                          unsigned int suspend,
+                          unsigned int off)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_dpms_avail) return EINA_FALSE;
+
 #ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_reply_t *reply;
+   // FIXME: Add request check
+   xcb_dpms_set_timeouts(_ecore_xcb_conn, standby, suspend, off);
+   return EINA_TRUE;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (reply)
-     {
-        if (standby) *standby = reply->standby_timeout;
-        if (suspend) *suspend = reply->suspend_timeout;
-        if (off) *off = 0;
-     }
-   else
-#endif /* ECORE_XCB_DPMS */
-     {
-        if (standby) *standby = 0;
-        if (suspend) *suspend = 0;
-        if (off) *off = 0;
-     }
+   return EINA_FALSE;
 }
 
-
 /**
  * Returns the amount of time of inactivity before standby mode is invoked.
  * @return The standby timeout value.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_timeouts_get_prefetch(), which sends the DPMSGetTimeouts request,
- * then ecore_x_dpms_timeouts_get_fetch(), which gets the reply.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI unsigned int
 ecore_x_dpms_timeout_standby_get(void)
 {
-   int                            standby = 0;
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+   unsigned int standby = 0;
 
-   standby = reply->standby_timeout;
-#endif /* ECORE_XCB_DPMS */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   ecore_x_dpms_timeouts_get(&standby, NULL, NULL);
    return standby;
 }
 
-
 /**
  * Returns the amount of time of inactivity before the second level of
  * power saving is invoked.
  * @return The suspend timeout value.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_timeouts_get_prefetch(), which sends the DPMSGetTimeouts request,
- * then ecore_x_dpms_timeouts_get_fetch(), which gets the reply.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI unsigned int
 ecore_x_dpms_timeout_suspend_get(void)
 {
-   int                            suspend = 0;;
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+   unsigned int suspend = 0;
 
-   suspend = reply->suspend_timeout;
-#endif /* ECORE_XCB_DPMS */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   ecore_x_dpms_timeouts_get(NULL, &suspend, NULL);
    return suspend;
 }
 
-
 /**
  * Returns the amount of time of inactivity before the third and final
  * level of power saving is invoked.
  * @return The off timeout value.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_timeouts_get_prefetch(), which sends the DPMSGetTimeouts request,
- * then ecore_x_dpms_timeouts_get_fetch(), which gets the reply.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI unsigned int
 ecore_x_dpms_timeout_off_get(void)
 {
-   int                            off = 0;
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+   unsigned int off = 0;
 
-   off = reply->off_timeout;
-#endif /* ECORE_XCB_DPMS */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   ecore_x_dpms_timeouts_get(NULL, NULL, &off);
    return off;
 }
 
-
 /**
  * Sets the standby timeout (in unit of seconds).
- * @param new_standby Amount of time of inactivity before standby mode will be invoked.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_timeouts_get_prefetch(), which sends the DPMSGetTimeouts request,
- * then ecore_x_dpms_timeouts_get_fetch(), which gets the reply.
+ * @param new_timeout Amount of time of inactivity before standby mode will be invoked.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
-ecore_x_dpms_timeout_standby_set(unsigned int new_standby)
+ecore_x_dpms_timeout_standby_set(unsigned int new_timeout)
 {
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_reply_t *reply;
+   unsigned int standby = 0, suspend = 0, off = 0;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   xcb_dpms_set_timeouts(_ecore_xcb_conn,
-                         new_standby,
-                         reply->suspend_timeout,
-                         reply->off_timeout);
-#endif /* ECORE_XCB_DPMS */
+   ecore_x_dpms_timeouts_get(&standby, &suspend, &off);
+   ecore_x_dpms_timeouts_set(new_timeout, suspend, off);
 }
 
-
 /**
  * Sets the suspend timeout (in unit of seconds).
- * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_timeouts_get_prefetch(), which sends the DPMSGetTimeouts request,
- * then ecore_x_dpms_timeouts_get_fetch(), which gets the reply.
+ * @param new_timeout Amount of time of inactivity before the screen is placed into suspend mode.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
-ecore_x_dpms_timeout_suspend_set(unsigned int new_suspend)
+ecore_x_dpms_timeout_suspend_set(unsigned int new_timeout)
 {
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_reply_t *reply;
+   unsigned int standby = 0, suspend = 0, off = 0;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   xcb_dpms_set_timeouts(_ecore_xcb_conn,
-                         reply->standby_timeout,
-                         new_suspend,
-                         reply->off_timeout);
-#endif /* ECORE_XCB_DPMS */
+   ecore_x_dpms_timeouts_get(&standby, &suspend, &off);
+   ecore_x_dpms_timeouts_set(standby, new_timeout, off);
 }
 
-
 /**
  * Sets the off timeout (in unit of seconds).
- * @param off     Amount of time of inactivity before the monitor is shut off.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_dpms_timeouts_get_prefetch(), which sends the DPMSGetTimeouts request,
- * then ecore_x_dpms_timeouts_get_fetch(), which gets the reply.
+ * @param new_timeout     Amount of time of inactivity before the monitor is shut off.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
-ecore_x_dpms_timeout_off_set(unsigned int new_off)
+ecore_x_dpms_timeout_off_set(unsigned int new_timeout)
 {
-#ifdef ECORE_XCB_DPMS
-   xcb_dpms_get_timeouts_reply_t *reply;
+   unsigned int standby = 0, suspend = 0, off = 0;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   xcb_dpms_set_timeouts(_ecore_xcb_conn,
-                         reply->standby_timeout,
-                         reply->suspend_timeout,
-                         new_off);
-#endif /* ECORE_XCB_DPMS */
+   ecore_x_dpms_timeouts_get(&standby, &suspend, &off);
+   ecore_x_dpms_timeouts_set(standby, suspend, new_timeout);
 }
+
index 3a1bb5b..4e9a356 100644 (file)
@@ -1,10 +1,4 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
-#include <xcb/xcb.h>
-
 
 /**
  * @defgroup Ecore_X_Drawable_Group X Drawable Functions
  * Functions that operate on drawables.
  */
 
-
-/**
- * Sends the GetGeometry request.
- * @param drawable Drawable whose characteristics are sought.
- * @ingroup Ecore_X_Drawable_Group
- */
-EAPI void
-ecore_x_drawable_geometry_get_prefetch(Ecore_X_Drawable drawable)
-{
-   xcb_get_geometry_cookie_t cookie;
-
-   cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, drawable);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-
 /**
- * Gets the reply of the GetGeometry request sent by ecore_x_atom_get_prefetch().
- * @ingroup Ecore_X_Drawable_Group
+ * Fill the specified rectangle on a drawable.
+ * @param d The given drawable.
+ * @param gc The graphic context that controls the fill rules.
+ * @param x The X coordinate of the top-left corner of the rectangle.
+ * @param y The Y coordinate of the top-left corner of the rectangle.
+ * @param width The width of the rectangle.
+ * @param height The height of the rectangle.
  */
 EAPI void
-ecore_x_drawable_geometry_get_fetch(void)
+ecore_x_drawable_rectangle_fill(Ecore_X_Drawable draw,
+                                Ecore_X_GC       gc,
+                                int              x,
+                                int              y,
+                                int              w,
+                                int              h)
 {
-   xcb_get_geometry_cookie_t cookie;
-   xcb_get_geometry_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   xcb_rectangle_t rect;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_poly_fill_rectangle(_ecore_xcb_conn, draw, gc, 1,
+                           (const xcb_rectangle_t *)&rect);
+//   ecore_x_flush();
 }
 
-
 /**
  * Retrieves the geometry of the given drawable.
- * @param drawable Unused.
- * @param x        Pointer to an integer into which the X position is to be stored.
- * @param y        Pointer to an integer into which the Y position is to be stored.
- * @param width    Pointer to an integer into which the width is to be stored.
- * @param height   Pointer to an integer into which the height is to be stored.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_drawable_geometry_get_prefetch(), which sends the GetGeometry request,
- * then ecore_x_drawable_geometry_get_fetch(), which gets the reply.
+ * @param d The given drawable.
+ * @param x Pointer to an integer into which the X position is to be stored.
+ * @param y Pointer to an integer into which the Y position is to be stored.
+ * @param w Pointer to an integer into which the width is to be stored.
+ * @param h Pointer to an integer into which the height is to be stored.
  * @ingroup Ecore_X_Drawable_Group
  */
 EAPI void
-ecore_x_drawable_geometry_get(Ecore_X_Drawable drawable __UNUSED__,
+ecore_x_drawable_geometry_get(Ecore_X_Drawable draw,
                               int             *x,
                               int             *y,
-                              int             *width,
-                              int             *height)
+                              int             *w,
+                              int             *h)
 {
+   xcb_get_geometry_cookie_t cookie;
    xcb_get_geometry_reply_t *reply;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     {
-        if (x) *x = 0;
-        if (y) *y = 0;
-        if (width) *width = 0;
-        if (height) *height = 0;
-        return;
-     }
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+   cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, draw);
+   reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
    if (x) *x = reply->x;
    if (y) *y = reply->y;
-   if (width) *width = reply->width;
-   if (height) *height = reply->height;
+   if (w) *w = (int)reply->width;
+   if (h) *h = (int)reply->height;
+   free(reply);
 }
 
-
 /**
  * Retrieves the width of the border of the given drawable.
- * @param  drawable Unused.
- * @return          The border width of the given drawable.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_drawable_geometry_get_prefetch(), which sends the GetGeometry request,
- * then ecore_x_drawable_geometry_get_fetch(), which gets the reply.
+ * @param  d The given drawable.
+ * @return The border width of the given drawable.
  * @ingroup Ecore_X_Drawable_Group
  */
 EAPI int
-ecore_x_drawable_border_width_get(Ecore_X_Drawable drawable __UNUSED__)
+ecore_x_drawable_border_width_get(Ecore_X_Drawable d)
 {
+   xcb_get_geometry_cookie_t cookie;
    xcb_get_geometry_reply_t *reply;
+   int ret = 0;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return reply->border_width;
+   cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, d);
+   reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   ret = (int)reply->border_width;
+   free(reply);
+   return ret;
 }
 
-
 /**
  * Retrieves the depth of the given drawable.
- * @param  drawable Unused.
- * @return          The depth of the given drawable.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_drawable_geometry_get_prefetch(), which sends the GetGeometry request,
- * then ecore_x_drawable_geometry_get_fetch(), which gets the reply.
+ * @param  d The given drawable.
+ * @return The depth of the given drawable.
  * @ingroup Ecore_X_Drawable_Group
  */
 EAPI int
-ecore_x_drawable_depth_get(Ecore_X_Drawable drawable __UNUSED__)
+ecore_x_drawable_depth_get(Ecore_X_Drawable d)
 {
+   xcb_get_geometry_cookie_t cookie;
    xcb_get_geometry_reply_t *reply;
+   int ret = 0;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return reply->depth;
+   cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, d);
+   reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   ret = (int)reply->depth;
+   free(reply);
+   return ret;
 }
+
index 4c82617..82d94b6 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#include "ecore_xcb_private.h"
 
-/*
- * OLD E hints
- */
+/* local function prototypes */
+static Ecore_X_Atom                    _ecore_xcb_e_vkbd_atom_get(Ecore_X_Virtual_Keyboard_State state);
+static Ecore_X_Virtual_Keyboard_State  _ecore_xcb_e_vkbd_state_get(Ecore_X_Atom atom);
+static Ecore_X_Atom                    _ecore_xcb_e_quickpanel_atom_get(Ecore_X_Illume_Quickpanel_State state);
+static Ecore_X_Illume_Quickpanel_State _ecore_xcb_e_quickpanel_state_get(Ecore_X_Atom atom);
+static Ecore_X_Atom                    _ecore_xcb_e_illume_atom_get(Ecore_X_Illume_Mode mode);
+static Ecore_X_Illume_Mode             _ecore_xcb_e_illume_mode_get(Ecore_X_Atom atom);
+static Ecore_X_Atom                    _ecore_xcb_e_indicator_atom_get(Ecore_X_Illume_Indicator_State state);
+static Ecore_X_Illume_Indicator_State  _ecore_xcb_e_indicator_state_get(Ecore_X_Atom atom);
 
-#include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
+EAPI void
+ecore_x_e_init(void)
+{
+}
+
+EAPI void
+ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window root,
+                                   Ecore_X_Window win)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
+   ev.data.data32[0] = win;
+   ev.data.data32[1] = 0;
+   ev.data.data32[2] = 0;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_e_comp_sync_draw_size_done_send(Ecore_X_Window root,
+                                        Ecore_X_Window win,
+                                        int            w,
+                                        int            h)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
+   ev.data.data32[0] = win;
+   ev.data.data32[1] = 1;
+   ev.data.data32[2] = w;
+   ev.data.data32[3] = h;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_e_comp_sync_counter_set(Ecore_X_Window       win,
+                                Ecore_X_Sync_Counter counter)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (counter)
+     ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
+                                 ECORE_X_ATOM_CARDINAL, &counter, 1);
+   else
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER);
+}
+
+EAPI Ecore_X_Sync_Counter
+ecore_x_e_comp_sync_counter_get(Ecore_X_Window win)
+{
+   Ecore_X_Sync_Counter counter = 0;
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret = ecore_x_window_prop_xid_get(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
+                                     ECORE_X_ATOM_CARDINAL, &counter, 1);
+   if (ret != 1) return 0;
+   return counter;
+}
+
+EAPI Eina_Bool
+ecore_x_e_comp_sync_supported_get(Ecore_X_Window root)
+{
+   Ecore_X_Window win, win2;
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   ret =
+     ecore_x_window_prop_xid_get(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                 ECORE_X_ATOM_WINDOW, &win, 1);
+   if ((ret == 1) && (win))
+     {
+        ret =
+          ecore_x_window_prop_xid_get(win, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                      ECORE_X_ATOM_WINDOW, &win2, 1);
+        if ((ret == 1) && (win2 == win))
+          return EINA_TRUE;
+     }
+   return EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_window_profile_list_set(Ecore_X_Window  win,
+                                  const char    **profiles,
+                                  unsigned int    num_profiles)
+{
+   Ecore_X_Atom *atoms;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!win)
+     return;
+
+   if (!num_profiles)
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_PROFILE_LIST);
+   else
+     {
+        atoms = alloca(num_profiles * sizeof(Ecore_X_Atom));
+        ecore_x_atoms_get(profiles, num_profiles, atoms);
+        ecore_x_window_prop_property_set(win,
+                                         ECORE_X_ATOM_E_PROFILE_LIST,
+                                         ECORE_X_ATOM_ATOM, 32, (void *)atoms,
+                                         num_profiles);
+     }
+}
+
+EAPI Eina_Bool
+ecore_x_e_window_profile_list_get(Ecore_X_Window   win,
+                                  const char    ***profiles,
+                                  int             *ret_num)
+{
+   unsigned char *data = NULL;
+   Ecore_X_Atom *atoms;
+   int num, i;
+
+   if (ret_num)
+     *ret_num = 0;
+
+   if (profiles)
+     *profiles = NULL;
+
+   if (!win)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_property_get(win,
+                                         ECORE_X_ATOM_E_PROFILE_LIST,
+                                         ECORE_X_ATOM_ATOM, 32, &data, &num))
+     return EINA_FALSE;
+
+   if (ret_num)
+     *ret_num = num;
+
+   if (profiles)
+     {
+        (*profiles) = calloc(num, sizeof(char *));
+        if (!(*profiles))
+          {
+             if (ret_num)
+               *ret_num = 0;
+
+             if (data)
+               free(data);
+
+             return EINA_FALSE;
+          }
+
+        atoms = (Ecore_X_Atom *)data;
+        for (i = 0; i < num; i++)
+           (*profiles)[i] = ecore_x_atom_name_get(atoms[i]);
+     }
+
+   if (data)
+     free(data);
+
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_e_window_profile_set(Ecore_X_Window win,
+                             const char    *profile)
+{
+   Ecore_X_Atom atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!win)
+     return;
+
+   if (!profile)
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_PROFILE);
+   else
+     {
+        atom = ecore_x_atom_get(profile);
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_E_PROFILE,
+                                         ECORE_X_ATOM_ATOM, 32, (void *)&atom, 1);
+     }
+}
 
+EAPI char *
+ecore_x_e_window_profile_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom *atom = NULL;
+   unsigned char *data;
+   char *profile = NULL;
+   int num;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_E_PROFILE,
+                                         ECORE_X_ATOM_ATOM, 32, &data, &num))
+     return NULL;
+
+   if (data)
+     atom = (Ecore_X_Atom *)data;
+
+   if (atom)
+     profile = ecore_x_atom_name_get(atom[0]);
+
+   return profile;
+}
+
+EAPI void
+ecore_x_e_comp_sync_supported_set(Ecore_X_Window root,
+                                  Eina_Bool      enabled)
+{
+   Ecore_X_Window win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   if (enabled)
+     {
+        win = ecore_x_window_new(root, 1, 2, 3, 4);
+        ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                    ECORE_X_ATOM_WINDOW, &win, 1);
+        ecore_x_window_prop_xid_set(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                    ECORE_X_ATOM_WINDOW, &win, 1);
+     }
+   else
+     {
+        int ret = 0;
+
+        ret = ecore_x_window_prop_xid_get(root,
+                                          ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                          ECORE_X_ATOM_WINDOW, &win, 1);
+        if ((ret == 1) && (win))
+          {
+             ecore_x_window_prop_property_del(root,
+                                              ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED);
+             ecore_x_window_free(win);
+          }
+     }
+}
+
+EAPI void
+ecore_x_e_comp_sync_begin_send(Ecore_X_Window win)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
+   ev.data.data32[0] = win;
+   ev.data.data32[1] = 0;
+   ev.data.data32[2] = 0;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_e_comp_sync_end_send(Ecore_X_Window win)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_E_COMP_SYNC_END;
+   ev.data.data32[0] = win;
+   ev.data.data32[1] = 0;
+   ev.data.data32[2] = 0;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_e_comp_sync_cancel_send(Ecore_X_Window win)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_E_COMP_SYNC_CANCEL;
+   ev.data.data32[0] = win;
+   ev.data.data32[1] = 0;
+   ev.data.data32[2] = 0;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_e_comp_flush_send(Ecore_X_Window win)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_E_COMP_FLUSH;
+   ev.data.data32[0] = win;
+   ev.data.data32[1] = 0;
+   ev.data.data32[2] = 0;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_e_comp_dump_send(Ecore_X_Window win)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_E_COMP_DUMP;
+   ev.data.data32[0] = win;
+   ev.data.data32[1] = 0;
+   ev.data.data32[2] = 0;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_e_comp_pixmap_set(Ecore_X_Window win,
+                          Ecore_X_Pixmap pixmap)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (pixmap)
+     ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_PIXMAP,
+                                 ECORE_X_ATOM_PIXMAP, &pixmap, 1);
+   else
+     ecore_x_window_prop_property_del(win, pixmap);
+}
+
+EAPI Ecore_X_Pixmap
+ecore_x_e_comp_pixmap_get(Ecore_X_Window win)
+{
+   Ecore_X_Pixmap pixmap = 0;
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret = ecore_x_window_prop_xid_get(win, ECORE_X_ATOM_E_COMP_PIXMAP,
+                                     ECORE_X_ATOM_PIXMAP, &pixmap, 1);
+   if (ret != 1) return 0;
+   return pixmap;
+}
 
 EAPI void
-ecore_x_e_frame_size_set(Ecore_X_Window window,
+ecore_x_e_frame_size_set(Ecore_X_Window win,
                          int            fl,
                          int            fr,
                          int            ft,
@@ -19,11 +437,1140 @@ ecore_x_e_frame_size_set(Ecore_X_Window window,
 {
    uint32_t frames[4];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    frames[0] = fl;
    frames[1] = fr;
    frames[2] = ft;
    frames[3] = fb;
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_E_FRAME_SIZE, ECORE_X_ATOM_CARDINAL, 32,
-                       4, (const void *)frames);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_FRAME_SIZE, frames, 4);
 }
+
+EAPI Ecore_X_Virtual_Keyboard_State
+ecore_x_e_virtual_keyboard_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
+                                     &atom, 1))
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
+
+   return _ecore_xcb_e_vkbd_state_get(atom);
+}
+
+EAPI void
+ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window                 win,
+                                     Ecore_X_Virtual_Keyboard_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   atom = _ecore_xcb_e_vkbd_atom_get(state);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
+                                &atom, 1);
+}
+
+EAPI void
+ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window                 win,
+                                      Ecore_X_Virtual_Keyboard_State state)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_xcb_e_vkbd_atom_get(state),
+                                 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_virtual_keyboard_set(Ecore_X_Window win,
+                               unsigned int   is_keyboard)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
+                                  &is_keyboard, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_e_virtual_keyboard_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI int
+ecore_x_e_illume_quickpanel_priority_major_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
+                                       &val, 1))
+     return 0;
+
+   return val;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_priority_major_set(Ecore_X_Window win,
+                                               unsigned int   priority)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
+                                  &priority, 1);
+}
+
+EAPI int
+ecore_x_e_illume_quickpanel_priority_minor_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
+                                       &val, 1))
+     return 0;
+
+   return val;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_priority_minor_set(Ecore_X_Window win,
+                                               unsigned int   priority)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
+                                  &priority, 1);
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_zone_set(Ecore_X_Window win,
+                                     unsigned int   zone)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
+                                  &zone, 1);
+}
+
+EAPI int
+ecore_x_e_illume_quickpanel_zone_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
+                                       &val, 1))
+     return 0;
+
+   return val;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_position_update_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win,
+                                 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_conformant_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_illume_conformant_set(Ecore_X_Window win,
+                                unsigned int   is_conformant)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
+                                  &is_conformant, 1);
+}
+
+EAPI void
+ecore_x_e_illume_softkey_geometry_set(Ecore_X_Window win,
+                                      int            x,
+                                      int            y,
+                                      int            w,
+                                      int            h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_softkey_geometry_get(Ecore_X_Window win,
+                                      int           *x,
+                                      int           *y,
+                                      int           *w,
+                                      int           *h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+
+   if (ecore_x_window_prop_card32_get(win,
+                                      ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
+                                      geom, 4) != 4)
+     return EINA_FALSE;
+
+   if (x) *x = geom[0];
+   if (y) *y = geom[1];
+   if (w) *w = geom[2];
+   if (h) *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_e_illume_indicator_geometry_set(Ecore_X_Window win,
+                                        int            x,
+                                        int            y,
+                                        int            w,
+                                        int            h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_indicator_geometry_get(Ecore_X_Window win,
+                                        int           *x,
+                                        int           *y,
+                                        int           *w,
+                                        int           *h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+
+   if (ecore_x_window_prop_card32_get(win,
+                                      ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
+                                      geom, 4) != 4)
+     return EINA_FALSE;
+
+   if (x) *x = geom[0];
+   if (y) *y = geom[1];
+   if (w) *w = geom[2];
+   if (h) *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_e_illume_keyboard_geometry_set(Ecore_X_Window win,
+                                       int            x,
+                                       int            y,
+                                       int            w,
+                                       int            h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_keyboard_geometry_get(Ecore_X_Window win,
+                                       int           *x,
+                                       int           *y,
+                                       int           *w,
+                                       int           *h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+
+   if (ecore_x_window_prop_card32_get(win,
+                                      ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
+                                      geom, 4) != 4)
+     return EINA_FALSE;
+
+   if (x) *x = geom[0];
+   if (y) *y = geom[1];
+   if (w) *w = geom[2];
+   if (h) *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_set(Ecore_X_Window win,
+                                unsigned int   is_quickpanel)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
+                                  &is_quickpanel, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_quickpanel_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_state_set(Ecore_X_Window                  win,
+                                      Ecore_X_Illume_Quickpanel_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   atom = _ecore_xcb_e_quickpanel_atom_get(state);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Quickpanel_State
+ecore_x_e_illume_quickpanel_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
+
+   return _ecore_xcb_e_quickpanel_state_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_state_send(Ecore_X_Window                  win,
+                                       Ecore_X_Illume_Quickpanel_State state)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_xcb_e_quickpanel_atom_get(state),
+                                 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_state_toggle(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win,
+                                 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 0, 0, 0, 0, 0);
+}
+
+static Ecore_X_Atom
+_ecore_xcb_e_clipboard_atom_get(Ecore_X_Illume_Clipboard_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_CLIPBOARD_STATE_ON:
+        return ECORE_X_ATOM_E_ILLUME_CLIPBOARD_ON;
+      case ECORE_X_ILLUME_CLIPBOARD_STATE_OFF:
+        return ECORE_X_ATOM_E_ILLUME_CLIPBOARD_OFF;
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Clipboard_State
+_ecore_xcb_e_clipboard_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_CLIPBOARD_ON)
+     return ECORE_X_ILLUME_CLIPBOARD_STATE_ON;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_CLIPBOARD_OFF)
+     return ECORE_X_ILLUME_CLIPBOARD_STATE_OFF;
+
+   return ECORE_X_ILLUME_INDICATOR_STATE_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_clipboard_state_set(Ecore_X_Window win,
+                                     Ecore_X_Illume_Clipboard_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_xcb_e_clipboard_atom_get(state);
+
+   ecore_x_window_prop_atom_set(win,
+                                ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Clipboard_State
+ecore_x_e_illume_clipboard_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_CLIPBOARD_STATE_UNKNOWN;
+   return _ecore_xcb_e_clipboard_state_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_clipboard_geometry_set(Ecore_X_Window win,
+                                        int x, int y, int w, int h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_clipboard_geometry_get(Ecore_X_Window win,
+                                        int *x, int *y, int *w, int *h)
+{
+   int ret = 0;
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret =
+      ecore_x_window_prop_card32_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY,
+                                     geom, 4);
+   if (ret != 4) return EINA_FALSE;
+
+   if (x) *x = geom[0];
+   if (y) *y = geom[1];
+   if (w) *w = geom[2];
+   if (h) *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_e_illume_mode_set(Ecore_X_Window      win,
+                          Ecore_X_Illume_Mode mode)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   atom = _ecore_xcb_e_illume_atom_get(mode);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_MODE, &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Mode
+ecore_x_e_illume_mode_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_ILLUME_MODE, &atom, 1))
+     return ECORE_X_ILLUME_MODE_UNKNOWN;
+
+   return _ecore_xcb_e_illume_mode_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_mode_send(Ecore_X_Window      win,
+                           Ecore_X_Illume_Mode mode)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_MODE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_xcb_e_illume_atom_get(mode),
+                                 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_focus_back_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_BACK,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_focus_forward_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_focus_home_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_HOME,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_close_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_CLOSE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_home_new_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_NEW,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_home_del_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_DEL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_next_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_NEXT,
+                                 0, 0, 0);
+}
+   
+EAPI void
+ecore_x_e_illume_access_action_prev_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_PREV,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_activate_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_read_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_read_next_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_NEXT,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_read_prev_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_PREV,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_up_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_down_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_drag_set(Ecore_X_Window win,
+                          unsigned int   drag)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG, &drag, 1);
+}
+
+EAPI void
+ecore_x_e_illume_drag_locked_set(Ecore_X_Window win,
+                                 unsigned int   is_locked)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
+                                  &is_locked, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_drag_locked_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_drag_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG, &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_illume_drag_start_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_START,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_drag_end_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_END,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_zone_set(Ecore_X_Window win,
+                          Ecore_X_Window zone)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE, &zone, 1);
+}
+
+EAPI Ecore_X_Window
+ecore_x_e_illume_zone_get(Ecore_X_Window win)
+{
+   Ecore_X_Window zone;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_window_get(win, ECORE_X_ATOM_E_ILLUME_ZONE,
+                                       &zone, 1))
+     return 0;
+
+   return zone;
+}
+
+EAPI void
+ecore_x_e_illume_zone_list_set(Ecore_X_Window  win,
+                               Ecore_X_Window *zones,
+                               unsigned int    num)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE_LIST,
+                                  zones, num);
+}
+
+/* local functions */
+static Ecore_X_Atom
+_ecore_xcb_e_vkbd_atom_get(Ecore_X_Virtual_Keyboard_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_ON:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_IP:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_URL:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Virtual_Keyboard_State
+_ecore_xcb_e_vkbd_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_IP;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_URL;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME;
+
+   return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
+}
+
+static Ecore_X_Atom
+_ecore_xcb_e_quickpanel_atom_get(Ecore_X_Illume_Quickpanel_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_QUICKPANEL_STATE_ON:
+        return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON;
+
+      case ECORE_X_ILLUME_QUICKPANEL_STATE_OFF:
+        return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Quickpanel_State
+_ecore_xcb_e_quickpanel_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON)
+     return ECORE_X_ILLUME_QUICKPANEL_STATE_ON;
+   if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF)
+     return ECORE_X_ILLUME_QUICKPANEL_STATE_OFF;
+
+   return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
+}
+
+static Ecore_X_Atom
+_ecore_xcb_e_illume_atom_get(Ecore_X_Illume_Mode mode)
+{
+   switch (mode)
+     {
+      case ECORE_X_ILLUME_MODE_SINGLE:
+        return ECORE_X_ATOM_E_ILLUME_MODE_SINGLE;
+
+      case ECORE_X_ILLUME_MODE_DUAL_TOP:
+        return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP;
+
+      case ECORE_X_ILLUME_MODE_DUAL_LEFT:
+        return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT;
+
+      default:
+        break;
+     }
+   return ECORE_X_ILLUME_MODE_UNKNOWN;
+}
+
+static Ecore_X_Illume_Mode
+_ecore_xcb_e_illume_mode_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_MODE_SINGLE)
+     return ECORE_X_ILLUME_MODE_SINGLE;
+   if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP)
+     return ECORE_X_ILLUME_MODE_DUAL_TOP;
+   if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT)
+     return ECORE_X_ILLUME_MODE_DUAL_LEFT;
+
+   return ECORE_X_ILLUME_MODE_UNKNOWN;
+}
+
+static Ecore_X_Atom
+_ecore_xcb_e_indicator_atom_get(Ecore_X_Illume_Indicator_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_INDICATOR_STATE_ON:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_ON;
+
+      case ECORE_X_ILLUME_INDICATOR_STATE_OFF:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_OFF;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Indicator_State
+_ecore_xcb_e_indicator_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_ON)
+     return ECORE_X_ILLUME_INDICATOR_STATE_ON;
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_OFF)
+     return ECORE_X_ILLUME_INDICATOR_STATE_OFF;
+
+   return ECORE_X_ILLUME_INDICATOR_STATE_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_indicator_state_set(Ecore_X_Window                 win,
+                                     Ecore_X_Illume_Indicator_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   atom = _ecore_xcb_e_indicator_atom_get(state);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Indicator_State
+ecore_x_e_illume_indicator_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_INDICATOR_STATE_UNKNOWN;
+
+   return _ecore_xcb_e_indicator_state_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_indicator_state_send(Ecore_X_Window                 win,
+                                      Ecore_X_Illume_Indicator_State state)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_xcb_e_indicator_atom_get(state),
+                                 0, 0, 0, 0);
+}
+
+static Ecore_X_Atom
+_ecore_x_e_indicator_opacity_atom_get(Ecore_X_Illume_Indicator_Opacity_Mode mode)
+{
+   switch (mode)
+     {
+      case ECORE_X_ILLUME_INDICATOR_OPAQUE:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_OPAQUE;
+
+      case ECORE_X_ILLUME_INDICATOR_TRANSLUCENT:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSLUCENT;
+
+      case ECORE_X_ILLUME_INDICATOR_TRANSPARENT:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSPARENT;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Indicator_Opacity_Mode
+_ecore_x_e_indicator_opacity_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_OPAQUE)
+     return ECORE_X_ILLUME_INDICATOR_OPAQUE;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSLUCENT)
+     return ECORE_X_ILLUME_INDICATOR_TRANSLUCENT;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSPARENT)
+     return ECORE_X_ILLUME_INDICATOR_TRANSPARENT;
+
+   return ECORE_X_ILLUME_INDICATOR_OPACITY_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_indicator_opacity_set(Ecore_X_Window win,
+                                     Ecore_X_Illume_Indicator_Opacity_Mode mode)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_indicator_opacity_atom_get(mode);
+   ecore_x_window_prop_atom_set(win,
+                                ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Indicator_Opacity_Mode
+ecore_x_e_illume_indicator_opacity_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_INDICATOR_OPACITY_UNKNOWN;
+
+   return _ecore_x_e_indicator_opacity_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_indicator_opacity_send(Ecore_X_Window win,
+                                      Ecore_X_Illume_Indicator_Opacity_Mode mode)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win,
+                                 ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_x_e_indicator_opacity_atom_get(mode),
+                                 0, 0, 0, 0);
+}
+
+static Ecore_X_Atom
+_ecore_x_e_illume_window_state_atom_get(Ecore_X_Illume_Window_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_WINDOW_STATE_NORMAL:
+        return ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL;
+
+      case ECORE_X_ILLUME_WINDOW_STATE_FLOATING:
+        return ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Window_State
+_ecore_x_e_illume_window_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL)
+     return ECORE_X_ILLUME_WINDOW_STATE_NORMAL;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING)
+     return ECORE_X_ILLUME_WINDOW_STATE_FLOATING;
+
+   return ECORE_X_ILLUME_WINDOW_STATE_NORMAL;
+}
+
+EAPI void
+ecore_x_e_illume_window_state_set(Ecore_X_Window win,
+                                  Ecore_X_Illume_Window_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_illume_window_state_atom_get(state);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_WINDOW_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Window_State
+ecore_x_e_illume_window_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_WINDOW_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_WINDOW_STATE_NORMAL;
+
+   return _ecore_x_e_illume_window_state_get(atom);
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_error.c b/src/lib/ecore_x/xcb/ecore_xcb_error.c
new file mode 100644 (file)
index 0000000..fc32926
--- /dev/null
@@ -0,0 +1,123 @@
+#include "ecore_xcb_private.h"
+#include <xcb/xcb_event.h>
+
+/* local variables */
+static void (*_error_func)(void *data) = NULL;
+static void *_error_data = NULL;
+static void (*_io_error_func)(void *data) = NULL;
+static void *_io_error_data = NULL;
+static int _error_request_code = 0;
+static int _error_code = 0;
+static Ecore_X_ID _error_resource_id = 0;
+
+/**
+ * Set the error handler.
+ * @param func The error handler function
+ * @param data The data to be passed to the handler function
+ *
+ * Set the X error handler function
+ */
+EAPI void
+ecore_x_error_handler_set(void        (*func)(void *data),
+                          const void *data)
+{
+   _error_func = func;
+   _error_data = (void *)data;
+}
+
+/**
+ * Set the I/O error handler.
+ * @param func The I/O error handler function
+ * @param data The data to be passed to the handler function
+ *
+ * Set the X I/O error handler function
+ */
+EAPI void
+ecore_x_io_error_handler_set(void        (*func)(void *data),
+                             const void *data)
+{
+   _io_error_func = func;
+   _io_error_data = (void *)data;
+}
+
+/**
+ * Get the request code that caused the error.
+ * @return The request code causing the X error
+ *
+ * Return the X request code that caused the last X error
+ */
+EAPI int
+ecore_x_error_request_get(void)
+{
+   return _error_request_code;
+}
+
+/**
+ * Get the error code from the error.
+ * @return The error code from the X error
+ *
+ * Return the error code from the last X error
+ */
+EAPI int
+ecore_x_error_code_get(void)
+{
+   return _error_code;
+}
+
+/**
+ * Get the resource id that caused the error.
+ * @return The resource id causing the X error
+ *
+ * Return the X resource id that caused the last X error
+ */
+EAPI Ecore_X_ID
+ecore_x_error_resource_id_get(void)
+{
+   return _error_resource_id;
+}
+
+int
+_ecore_xcb_error_handle(xcb_generic_error_t *err)
+{
+   WRN("Got Error:");
+   WRN("\tEvent: %s", xcb_event_get_request_label(err->major_code));
+   WRN("\tError: %s", xcb_event_get_error_label(err->error_code));
+
+#ifdef OLD_XCB_VERSION
+   if (err->error_code == XCB_EVENT_ERROR_BAD_VALUE)
+     WRN("\tBad Value: %d", ((xcb_value_error_t *)err)->bad_value);
+   else if (err->error_code == XCB_EVENT_ERROR_BAD_WINDOW)
+     WRN("\tBad Window: %d", ((xcb_window_error_t *)err)->bad_value);
+#else
+   if (err->error_code == XCB_VALUE)
+     WRN("\tBad Value: %d", ((xcb_value_error_t *)err)->bad_value);
+   else if (err->error_code == XCB_WINDOW)
+     WRN("\tBad Window: %d", ((xcb_window_error_t *)err)->bad_value);
+#endif
+
+   _error_request_code = err->sequence;
+   _error_code = err->error_code;
+   _error_resource_id = err->resource_id;
+   if (_error_func)
+     _error_func(_error_data);
+
+   return 0;
+}
+
+int
+_ecore_xcb_io_error_handle(xcb_generic_error_t *err)
+{
+   CRIT("IO Error:");
+   if (err)
+     {
+        CRIT("\tRequest: %d", err->sequence);
+        CRIT("\tCode: %d", err->error_code);
+     }
+   if (_io_error_func)
+     _io_error_func(_io_error_data);
+   else
+     exit(-1);
+
+   return 0;
+}
+
index bf6799a..1763397 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-#include "Ecore.h"
 #include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
+//#include "Ecore_X_Atoms.h"
+#include <langinfo.h>
+#include <xcb/xcb_icccm.h>
+#include <xcb/xcb_event.h>
+# ifdef ECORE_XCB_DAMAGE
+#  include <xcb/damage.h>
+# endif
+# ifdef ECORE_XCB_RANDR
+#  include <xcb/randr.h>
+# endif
+# ifdef ECORE_XCB_SCREENSAVER
+#  include <xcb/screensaver.h>
+# endif
+# ifdef ECORE_XCB_SYNC
+#  include <xcb/sync.h>
+# endif
+# ifdef ECORE_XCB_XFIXES
+#  include <xcb/xfixes.h>
+# endif
+# ifdef ECORE_XCB_XGESTURE
+#  include <xcb/gesture.h>
+# endif
 
+#ifndef CODESET
+# define CODESET "INVALID"
+#endif
 
-/** OpenBSD does not define CODESET
- * FIXME ??
- */
+typedef struct _Ecore_X_Mouse_Down_Info
+{
+   EINA_INLIST;
+   int            dev;
+   Ecore_X_Time   last_time;
+   Ecore_X_Time   last_last_time;
+   Ecore_X_Window last_win;
+   Ecore_X_Window last_last_win;
+   Ecore_X_Window last_event_win;
+   Ecore_X_Window last_last_event_win;
+   Eina_Bool      did_double : 1;
+   Eina_Bool      did_triple : 1;
+} Ecore_X_Mouse_Down_Info;
+
+/* local function prototypes */
+static void                     _ecore_xcb_event_handle_any_event(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_key_press(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_key_release(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_button_press(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_button_release(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_motion_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_enter_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_leave_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_keymap_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_focus_in(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_focus_out(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_expose(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_graphics_exposure(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_visibility_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_create_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_destroy_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_map_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_unmap_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_map_request(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_reparent_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_configure_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_configure_request(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_gravity_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_resize_request(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_circulate_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_circulate_request(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_property_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_selection_clear(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_selection_request(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_selection_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_colormap_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_client_message(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_mapping_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_damage_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_randr_change(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_randr_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_randr_crtc_change(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_randr_output_change(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_randr_output_property_change(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_screensaver_notify(xcb_generic_event_t *event);
+#ifdef ECORE_XCB_XGESTURE
+static void                     _ecore_xcb_event_handle_gesture_notify_flick(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_gesture_notify_pan(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_gesture_notify_pinchrotation(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_gesture_notify_tap(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_gesture_notify_tapnhold(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_gesture_notify_hold(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_gesture_notify_group(xcb_generic_event_t *event);
+#endif
+#ifdef ECORE_XCB_SHAPE
+static void                     _ecore_xcb_event_handle_shape_change(xcb_generic_event_t *event);
+#endif
+static void                     _ecore_xcb_event_handle_sync_counter(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_sync_alarm(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event __UNUSED__);
+static void                     _ecore_xcb_event_handle_xfixes_cursor_notify(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_generic_event(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_handle_input_event(xcb_generic_event_t *event);
+
+static void                     _ecore_xcb_event_key_press(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_key_release(xcb_generic_event_t *event);
+static void                     _ecore_xcb_event_mouse_move_free(void *data __UNUSED__,
+                                                                 void *event);
+static Ecore_X_Event_Mode       _ecore_xcb_event_mode_get(uint8_t mode);
+static Ecore_X_Event_Detail     _ecore_xcb_event_detail_get(uint8_t detail);
+static void                     _ecore_xcb_event_xdnd_enter_free(void *data __UNUSED__,
+                                                                 void *event);
+static void                     _ecore_xcb_event_selection_notify_free(void *data __UNUSED__,
+                                                                       void *event);
+static void                     _ecore_xcb_event_generic_event_free(void *data,
+                                                                    void *event);
+static void                     _ecore_xcb_event_mouse_down_info_clear(void);
+static Ecore_X_Mouse_Down_Info *_ecore_xcb_event_mouse_down_info_get(int dev);
+
+/* local variables */
+static Eina_Bool _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+//static Ecore_Event *_ecore_xcb_event_last_mouse_move_event = NULL;
+static Eina_Inlist *_ecore_xcb_mouse_down_info_list = NULL;
+static Ecore_X_Time _ecore_xcb_event_last_time;
+static Ecore_X_Window _ecore_xcb_event_last_window = 0;
+
+/* public variables */
+int16_t _ecore_xcb_event_last_root_x = 0;
+int16_t _ecore_xcb_event_last_root_y = 0;
+
+EAPI int ECORE_X_EVENT_ANY = 0;
+EAPI int ECORE_X_EVENT_MOUSE_IN = 0;
+EAPI int ECORE_X_EVENT_MOUSE_OUT = 0;
+EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0;
+EAPI int ECORE_X_EVENT_WINDOW_FOCUS_OUT = 0;
+EAPI int ECORE_X_EVENT_WINDOW_KEYMAP = 0;
+EAPI int ECORE_X_EVENT_WINDOW_DAMAGE = 0;
+EAPI int ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = 0;
+EAPI int ECORE_X_EVENT_WINDOW_CREATE = 0;
+EAPI int ECORE_X_EVENT_WINDOW_DESTROY = 0;
+EAPI int ECORE_X_EVENT_WINDOW_HIDE = 0;
+EAPI int ECORE_X_EVENT_WINDOW_SHOW = 0;
+EAPI int ECORE_X_EVENT_WINDOW_SHOW_REQUEST = 0;
+EAPI int ECORE_X_EVENT_WINDOW_REPARENT = 0;
+EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE = 0;
+EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = 0;
+EAPI int ECORE_X_EVENT_WINDOW_GRAVITY = 0;
+EAPI int ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = 0;
+EAPI int ECORE_X_EVENT_WINDOW_STACK = 0;
+EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0;
+EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0;
+EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0;
+EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0;
+EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0;
+EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
+EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
+EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_CLIENT_MESSAGE = 0;
+EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
+EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PAN = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAP = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = 0;
+EAPI int ECORE_X_EVENT_SYNC_COUNTER = 0;
+EAPI int ECORE_X_EVENT_SYNC_ALARM = 0;
+EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0;
+EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_RANDR_CRTC_CHANGE = 0;
+EAPI int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = 0;
+EAPI int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0;
+EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0;
+EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0;
+EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = 0;
+EAPI int ECORE_X_EVENT_PING = 0;
+EAPI int ECORE_X_EVENT_DESKTOP_CHANGE = 0;
+EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = 0;
+EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = 0;
+EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = 0;
+EAPI int ECORE_X_EVENT_XKB_STATE_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_XKB_NEWKBD_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_GENERIC = 0;
+
+EAPI int ECORE_X_RAW_BUTTON_PRESS = 0;
+EAPI int ECORE_X_RAW_BUTTON_RELEASE = 0;
+EAPI int ECORE_X_RAW_MOTION = 0;
 
-#ifndef CODESET
-#define CODESET "INVALID"
+void
+_ecore_xcb_events_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ECORE_X_EVENT_ANY)
+     {
+        ECORE_X_EVENT_ANY = ecore_event_type_new();
+        ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new();
+        ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_KEYMAP = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_CREATE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_DESTROY = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_HIDE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_SHOW = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_SHOW_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_REPARENT = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_GRAVITY = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_STACK = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_STACK_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new();
+        ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new();
+        ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new();
+        ECORE_X_EVENT_SCREENSAVER_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_PAN = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_TAP = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = ecore_event_type_new();
+        ECORE_X_EVENT_SYNC_COUNTER = ecore_event_type_new();
+        ECORE_X_EVENT_SYNC_ALARM = ecore_event_type_new();
+        ECORE_X_EVENT_SCREEN_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_RANDR_CRTC_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_STATE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_PING = ecore_event_type_new();
+        ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = ecore_event_type_new();
+        ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = ecore_event_type_new();
+        ECORE_X_EVENT_XKB_STATE_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_XKB_NEWKBD_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_GENERIC = ecore_event_type_new();
+
+       ECORE_X_RAW_BUTTON_PRESS = ecore_event_type_new();
+       ECORE_X_RAW_BUTTON_RELEASE = ecore_event_type_new();
+       ECORE_X_RAW_MOTION = ecore_event_type_new();
+     }
+}
+
+void
+_ecore_xcb_events_shutdown(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_event_mouse_down_info_clear();
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+//   if (_ecore_xcb_event_last_mouse_move_event)
+//     {
+//        ecore_event_del(_ecore_xcb_event_last_mouse_move_event);
+//        _ecore_xcb_event_last_mouse_move_event = NULL;
+//     }
+}
+
+void
+_ecore_xcb_events_handle(xcb_generic_event_t *ev)
+{
+   uint8_t response = 0;
+
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   /* strip highest bit (set if event is generated) */
+   response = (ev->response_type & ~0x80);
+   if (response == 0)
+     {
+        xcb_generic_error_t *err;
+
+        err = (xcb_generic_error_t *)ev;
+
+        /* NB: There is no way to check access of destroyed windows,
+         * so trap those cases and ignore. We also ignore BadValue from
+         * xcb_grab/ungrab_button (happens when we are using any_mod)
+         * and a few others */
+#ifdef OLD_XCB_VERSION
+        if (err->error_code == XCB_EVENT_ERROR_BAD_WINDOW) return;
+        else if (err->error_code == XCB_EVENT_ERROR_BAD_MATCH)
+          {
+             if ((err->major_code == XCB_SET_INPUT_FOCUS) ||
+                 (err->major_code == XCB_CONFIGURE_WINDOW))
+               return;
+          }
+        else if (err->error_code == XCB_EVENT_ERROR_BAD_VALUE)
+          {
+             if ((err->major_code == XCB_KILL_CLIENT) ||
+                 (err->major_code == XCB_GRAB_BUTTON) ||
+                 (err->major_code == XCB_UNGRAB_BUTTON))
+               return;
+          }
+#else
+        if (err->error_code == XCB_WINDOW) return;
+        else if (err->error_code == XCB_MATCH)
+          {
+             if ((err->major_code == XCB_SET_INPUT_FOCUS) ||
+                 (err->major_code == XCB_CONFIGURE_WINDOW))
+               return;
+          }
+        else if (err->error_code == XCB_VALUE)
+          {
+             if ((err->major_code == XCB_KILL_CLIENT) ||
+                 (err->major_code == XCB_GRAB_BUTTON) ||
+                 (err->major_code == XCB_UNGRAB_BUTTON))
+               return;
+          }
 #endif
+        WRN("Got Event Error:");
+        WRN("\tMajor Code: %d", err->major_code);
+        WRN("\tMinor Code: %d", err->minor_code);
+        WRN("\tRequest: %s", xcb_event_get_request_label(err->major_code));
+        WRN("\tError: %s", xcb_event_get_error_label(err->error_code));
+        if (err->error_code == 2) // bad value
+          WRN("\tValue: %d", ((xcb_value_error_t *)err)->bad_value);
+        else if (err->error_code == 8) // bad match
+          WRN("\tMatch: %d", ((xcb_match_error_t *)err)->bad_value);
+
+        if (err->major_code == XCB_SEND_EVENT)
+          {
+             WRN("\tSend Event Error");
+             WRN("\t\tSeq: %d", ev->sequence);
+             WRN("\t\tFull Seq: %d", ev->full_sequence);
+             WRN("\t\tType: %d", ev->response_type);
+          }
+        /* if (err->major_code == 148)  */
+        /*   { */
+        /*      printf("GOT 148 Error\n"); */
+        /*   } */
+        return;
+     }
 
-#if 0
-static void _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev);
+   /* FIXME: Filter event for xim when xcb supports xim */
+
+   _ecore_xcb_event_handle_any_event(ev);
+
+   if (response == XCB_KEY_PRESS)
+     _ecore_xcb_event_handle_key_press(ev);
+   else if (response == XCB_KEY_RELEASE)
+     _ecore_xcb_event_handle_key_release(ev);
+   else if (response == XCB_BUTTON_PRESS)
+     _ecore_xcb_event_handle_button_press(ev);
+   else if (response == XCB_BUTTON_RELEASE)
+     _ecore_xcb_event_handle_button_release(ev);
+   else if (response == XCB_MOTION_NOTIFY)
+     _ecore_xcb_event_handle_motion_notify(ev);
+   else if (response == XCB_ENTER_NOTIFY)
+     _ecore_xcb_event_handle_enter_notify(ev);
+   else if (response == XCB_LEAVE_NOTIFY)
+     _ecore_xcb_event_handle_leave_notify(ev);
+   else if (response == XCB_KEYMAP_NOTIFY)
+     _ecore_xcb_event_handle_keymap_notify(ev);
+   else if (response == XCB_FOCUS_IN)
+     _ecore_xcb_event_handle_focus_in(ev);
+   else if (response == XCB_FOCUS_OUT)
+     _ecore_xcb_event_handle_focus_out(ev);
+   else if (response == XCB_EXPOSE)
+     _ecore_xcb_event_handle_expose(ev);
+   else if (response == XCB_GRAPHICS_EXPOSURE)
+     _ecore_xcb_event_handle_graphics_exposure(ev);
+   else if (response == XCB_VISIBILITY_NOTIFY)
+     _ecore_xcb_event_handle_visibility_notify(ev);
+   else if (response == XCB_CREATE_NOTIFY)
+     _ecore_xcb_event_handle_create_notify(ev);
+   else if (response == XCB_DESTROY_NOTIFY)
+     _ecore_xcb_event_handle_destroy_notify(ev);
+   else if (response == XCB_MAP_NOTIFY)
+     _ecore_xcb_event_handle_map_notify(ev);
+   else if (response == XCB_UNMAP_NOTIFY)
+     _ecore_xcb_event_handle_unmap_notify(ev);
+   else if (response == XCB_MAP_REQUEST)
+     _ecore_xcb_event_handle_map_request(ev);
+   else if (response == XCB_REPARENT_NOTIFY)
+     _ecore_xcb_event_handle_reparent_notify(ev);
+   else if (response == XCB_CONFIGURE_NOTIFY)
+     _ecore_xcb_event_handle_configure_notify(ev);
+   else if (response == XCB_CONFIGURE_REQUEST)
+     _ecore_xcb_event_handle_configure_request(ev);
+   else if (response == XCB_GRAVITY_NOTIFY)
+     _ecore_xcb_event_handle_gravity_notify(ev);
+   else if (response == XCB_RESIZE_REQUEST)
+     _ecore_xcb_event_handle_resize_request(ev);
+   else if (response == XCB_CIRCULATE_NOTIFY)
+     _ecore_xcb_event_handle_circulate_notify(ev);
+   else if (response == XCB_CIRCULATE_REQUEST)
+     _ecore_xcb_event_handle_circulate_request(ev);
+   else if (response == XCB_PROPERTY_NOTIFY)
+     _ecore_xcb_event_handle_property_notify(ev);
+   else if (response == XCB_SELECTION_CLEAR)
+     _ecore_xcb_event_handle_selection_clear(ev);
+   else if (response == XCB_SELECTION_REQUEST)
+     _ecore_xcb_event_handle_selection_request(ev);
+   else if (response == XCB_SELECTION_NOTIFY)
+     _ecore_xcb_event_handle_selection_notify(ev);
+   else if (response == XCB_COLORMAP_NOTIFY)
+     _ecore_xcb_event_handle_colormap_notify(ev);
+   else if (response == XCB_CLIENT_MESSAGE)
+     _ecore_xcb_event_handle_client_message(ev);
+   else if (response == XCB_MAPPING_NOTIFY)
+     _ecore_xcb_event_handle_mapping_notify(ev);
+   else if (response == 35) /* GenericEvent == 35 */
+     _ecore_xcb_event_handle_generic_event(ev);
+#ifdef ECORE_XCB_DAMAGE
+   else if ((_ecore_xcb_event_damage >= 0) &&
+            (response == (_ecore_xcb_event_damage + XCB_DAMAGE_NOTIFY)))
+     _ecore_xcb_event_handle_damage_notify(ev);
+#endif
+#ifdef ECORE_XCB_RANDR
+   else if ((_ecore_xcb_event_randr >= 0) &&
+            (response ==
+             _ecore_xcb_event_randr + XCB_RANDR_SCREEN_CHANGE_NOTIFY))
+     _ecore_xcb_event_handle_randr_change(ev);
+   else if ((_ecore_xcb_event_randr >= 0) &&
+            (response == (_ecore_xcb_event_randr + XCB_RANDR_NOTIFY)))
+     _ecore_xcb_event_handle_randr_notify(ev);
+#endif
+#ifdef ECORE_XCB_SCREENSAVER
+   else if ((_ecore_xcb_event_screensaver >= 0) &&
+            (response ==
+             _ecore_xcb_event_screensaver + XCB_SCREENSAVER_NOTIFY))
+     _ecore_xcb_event_handle_screensaver_notify(ev);
 #endif
-static void _ecore_x_event_free_key_down(void *data, void *ev);
-static void _ecore_x_event_free_key_up(void *data, void *ev);
+#ifdef ECORE_XCB_XGESTURE
+   else if ((_ecore_xcb_event_gesture >= 0) && 
+            (response == 
+                _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_FLICK))
+     _ecore_xcb_event_handle_gesture_notify_flick(ev);
+   else if ((_ecore_xcb_event_gesture >= 0) && 
+            (response == 
+                _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_PAN))
+     _ecore_xcb_event_handle_gesture_notify_pan(ev);
+   else if ((_ecore_xcb_event_gesture >= 0) && 
+            (response == 
+                _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_PINCH_ROTATION))
+     _ecore_xcb_event_handle_gesture_notify_pinchrotation(ev);
+   else if ((_ecore_xcb_event_gesture >= 0) && 
+            (response == 
+                _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_TAP))
+     _ecore_xcb_event_handle_gesture_notify_tap(ev);
+   else if ((_ecore_xcb_event_gesture >= 0) && 
+            (response == 
+                _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_TAP_N_HOLD))
+     _ecore_xcb_event_handle_gesture_notify_tapnhold(ev);
+   else if ((_ecore_xcb_event_gesture >= 0) && 
+            (response == 
+                _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_HOLD))
+     _ecore_xcb_event_handle_gesture_notify_hold(ev);
+   else if ((_ecore_xcb_event_gesture >= 0) && 
+            (response == 
+                _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_GROUP))
+     _ecore_xcb_event_handle_gesture_notify_group(ev);
+#endif
+#ifdef ECORE_XCB_SHAPE
+   else if ((_ecore_xcb_event_shape >= 0) &&
+            (response == (_ecore_xcb_event_shape + XCB_SHAPE_NOTIFY)))
+     _ecore_xcb_event_handle_shape_change(ev);
+#endif
+#ifdef ECORE_XCB_SYNC
+   else if ((_ecore_xcb_event_sync >= 0) &&
+            (response == (_ecore_xcb_event_sync + XCB_SYNC_COUNTER_NOTIFY)))
+     _ecore_xcb_event_handle_sync_counter(ev);
+   else if ((_ecore_xcb_event_sync >= 0) &&
+            (response == (_ecore_xcb_event_sync + XCB_SYNC_ALARM_NOTIFY)))
+     _ecore_xcb_event_handle_sync_alarm(ev);
+#endif
+#ifdef ECORE_XCB_XFIXES
+   else if ((_ecore_xcb_event_xfixes >= 0) &&
+            (response ==
+             _ecore_xcb_event_xfixes + XCB_XFIXES_SELECTION_NOTIFY))
+     _ecore_xcb_event_handle_xfixes_selection_notify(ev);
+   else if ((_ecore_xcb_event_xfixes >= 0) &&
+            (response == (_ecore_xcb_event_xfixes + XCB_XFIXES_CURSOR_NOTIFY)))
+     _ecore_xcb_event_handle_xfixes_cursor_notify(ev);
+#endif
+}
 
-static Ecore_X_Window _ecore_xcb_mouse_down_last_window = 0;
-static Ecore_X_Window _ecore_xcb_mouse_down_last_last_window = 0;
-static Ecore_X_Window _ecore_xcb_mouse_down_last_event_window = 0;
-static Ecore_X_Window _ecore_xcb_mouse_down_last_last_event_window = 0;
-static Ecore_X_Time   _ecore_xcb_mouse_down_last_time = 0;
-static Ecore_X_Time   _ecore_xcb_mouse_down_last_last_time = 0;
-static int            _ecore_xcb_mouse_up_count = 0;
-static int            _ecore_xcb_mouse_down_did_triple = 0;
+Ecore_X_Time
+_ecore_xcb_events_last_time_get(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   return _ecore_xcb_event_last_time;
+}
 
-/* FIXME: roundtrip */
 EAPI void
-ecore_x_event_mask_set(Ecore_X_Window     window,
+ecore_x_event_mask_set(Ecore_X_Window     win,
                        Ecore_X_Event_Mask mask)
 {
    xcb_get_window_attributes_cookie_t cookie;
    xcb_get_window_attributes_reply_t *reply;
-   uint32_t                           value_list;
+   uint32_t list;
 
-   if (!window)
-      window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, window);
+   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
    reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
    if (!reply) return;
 
-   value_list = mask | reply->your_event_mask;
-   xcb_change_window_attributes(_ecore_xcb_conn, window, XCB_CW_EVENT_MASK, &value_list);
+   list = (mask | reply->your_event_mask);
    free(reply);
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_EVENT_MASK, &list);
+//   ecore_x_flush();
 }
 
-/* FIXME: roundtrip */
 EAPI void
-ecore_x_event_mask_unset(Ecore_X_Window     window,
+ecore_x_event_mask_unset(Ecore_X_Window     win,
                          Ecore_X_Event_Mask mask)
 {
    xcb_get_window_attributes_cookie_t cookie;
    xcb_get_window_attributes_reply_t *reply;
-   uint32_t value_list;
+   uint32_t list;
 
-   if (!window)
-      window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, window);
+   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
    reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
    if (!reply) return;
 
-   value_list = reply->your_event_mask & ~mask;
-   xcb_change_window_attributes(_ecore_xcb_conn, window, XCB_CW_EVENT_MASK, &value_list);
+   list = (reply->your_event_mask & ~mask);
    free(reply);
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_EVENT_MASK, &list);
+//   ecore_x_flush();
 }
 
-#if 0
-static void
-_ecore_x_event_free_window_prop_name_class_change(void *data, void *ev)
-{
-   Ecore_X_Event_Window_Prop_Name_Class_Change *e;
-
-   e = ev;
-   if (e->name) free(e->name);
-   if (e->clas) free(e->clas);
-   free(e);
-}
-
-static void
-_ecore_x_event_free_window_prop_title_change(void *data, void *ev)
-{
-   Ecore_X_Event_Window_Prop_Title_Change *e;
-
-   e = ev;
-   if (e->title) free(e->title);
-   free(e);
-}
-
-static void
-_ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev)
-{
-   Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
-
-   e = ev;
-   if (e->title) free(e->title);
-   free(e);
-}
-
-static void
-_ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev)
-{
-   Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
-
-   e = ev;
-   if (e->name) free(e->name);
-   free(e);
-}
-
-static void
-_ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev)
+unsigned int
+_ecore_xcb_events_modifiers_get(unsigned int state)
 {
-   Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
-
-   e = ev;
-   if (e->name) free(e->name);
-   free(e);
+   unsigned int modifiers = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (state & ECORE_X_MODIFIER_SHIFT)
+     modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+   if (state & ECORE_X_MODIFIER_CTRL)
+     modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+   if (state & ECORE_X_MODIFIER_ALT)
+     modifiers |= ECORE_EVENT_MODIFIER_ALT;
+   if (state & ECORE_X_MODIFIER_WIN)
+     modifiers |= ECORE_EVENT_MODIFIER_WIN;
+   if (state & ECORE_X_MODIFIER_ALTGR)
+     modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
+   if (state & ECORE_X_LOCK_SCROLL)
+     modifiers |= ECORE_EVENT_LOCK_SCROLL;
+   if (state & ECORE_X_LOCK_CAPS)
+     modifiers |= ECORE_EVENT_LOCK_CAPS;
+   if (state & ECORE_X_LOCK_NUM)
+     modifiers |= ECORE_EVENT_LOCK_NUM;
+   if (state & ECORE_X_LOCK_SHIFT)
+     modifiers |= ECORE_EVENT_LOCK_SHIFT;
+
+   return modifiers;
 }
 
+/* local functions */
 static void
-_ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev)
+_ecore_xcb_event_handle_any_event(xcb_generic_event_t *event)
 {
-   Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
+   xcb_generic_event_t *ev;
 
-   e = ev;
-   if (e->name) free(e->name);
-   free(e);
-}
-#endif
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-static void
-_ecore_x_event_free_key_down(void *data __UNUSED__, void *ev)
-{
-   Ecore_X_Event_Key_Down *e;
+   ev = malloc(sizeof(xcb_generic_event_t));
+   if (!ev) return;
 
-   e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->key_compose) free(e->key_compose);
-   free(e);
+   memcpy(ev, event, sizeof(xcb_generic_event_t));
+   ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
 }
 
 static void
-_ecore_x_event_free_key_up(void *data __UNUSED__, void *ev)
+_ecore_xcb_event_handle_key_press(xcb_generic_event_t *event)
 {
-   Ecore_X_Event_Key_Up *e;
-
-   e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->key_compose) free(e->key_compose);
-   free(e);
+   _ecore_xcb_event_key_press(event);
 }
 
 static void
-_ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
+_ecore_xcb_event_handle_key_release(xcb_generic_event_t *event)
 {
-   Ecore_X_Event_Xdnd_Enter *e;
-   int                       i;
-
-   e = ev;
-   for (i = 0; i < e->num_types; i++)
-     free(e->types[i]);
-   free(e->types);
-   free(e);
+   _ecore_xcb_event_key_release(event);
 }
 
 static void
-_ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev)
-{
-   Ecore_X_Event_Selection_Notify *e;
-   Ecore_X_Selection_Data         *sel;
-
-   e = ev;
-   sel = e->data;
-   if (sel->free)
-     sel->free(sel);
-   free(e->target);
-   free(e);
-}
-
-/* FIXME: handle this event */
-void
-_ecore_x_event_handle_key_press(xcb_generic_event_t *event)
-{
-   xcb_key_press_event_t  *ev;
-/*    Ecore_X_Event_Key_Down *e; */
-/*    char                   *keyname; */
-/*    int                     val; */
-/*    char                    buf[256]; */
-/*    KeySym                  sym; */
-/*    XComposeStatus          status; */
-
-   ev = (xcb_key_press_event_t *)event;
-/*    e = calloc(1, sizeof(Ecore_X_Event_Key_Down)); */
-/*    if (!e) return; */
-/*    keyname = XKeysymToString(XKeycodeToKeysym(xevent->xkey.display,  */
-/*                                           xevent->xkey.keycode, 0)); */
-/*    if (!keyname) */
-/*      { */
-/*     snprintf(buf, sizeof(buf), "Keycode-%i", xevent->xkey.keycode); */
-/*     keyname = buf; */
-/*      } */
-/*    e->keyname = strdup(keyname); */
-/*    if (!e->keyname) */
-/*      { */
-/*     free(e); */
-/*     return; */
-/*      } */
-/*    val = XLookupString((XKeyEvent *)xevent, buf, sizeof(buf), &sym, &status); */
-/*    if (val > 0) */
-/*      { */
-/*     buf[val] = 0; */
-/*     e->key_compose = ecore_txt_convert(nl_langinfo(CODESET), "UTF-8", buf); */
-/*      } */
-/*    else e->key_compose = NULL; */
-/*    keyname = XKeysymToString(sym); */
-/*    if (keyname) e->keysymbol = strdup(keyname); */
-/*    else e->keysymbol = strdup(e->keyname); */
-/*    if (!e->keysymbol) */
-/*      { */
-/*     if (e->keyname) free(e->keyname); */
-/*     if (e->key_compose) free(e->key_compose); */
-/*     free(e); */
-/*     return; */
-/*      } */
-/*    if (xevent->xkey.subwindow) e->win = xevent->xkey.subwindow; */
-/*    else e->win = xevent->xkey.window; */
-/*    e->event_win = xevent->xkey.window; */
-/*    e->time = xevent->xkey.time; */
-/*    e->modifiers = xevent->xkey.state; */
-/*    _ecore_x_event_last_time = e->time; */
-/*    ecore_event_add(ECORE_X_EVENT_KEY_DOWN, e, _ecore_x_event_free_key_down, NULL); */
-}
-
-/* FIXME: handle this event */
-void
-_ecore_x_event_handle_key_release(xcb_generic_event_t *event)
-{
-   xcb_key_release_event_t *ev;
-/*    Ecore_X_Event_Key_Up    *e; */
-/*    char                   *keyname; */
-/*    int                     val; */
-/*    char                    buf[256]; */
-/*    KeySym                  sym; */
-/*    XComposeStatus          status; */
-
-   ev = (xcb_key_release_event_t *)event;
-/*    e = calloc(1, sizeof(Ecore_X_Event_Key_Up)); */
-/*    if (!e) return; */
-/*    keyname = XKeysymToString(XKeycodeToKeysym(xevent->xkey.display,  */
-/*                                           xevent->xkey.keycode, 0)); */
-/*    if (!keyname) */
-/*      { */
-/*     snprintf(buf, sizeof(buf), "Keycode-%i", xevent->xkey.keycode); */
-/*     keyname = buf; */
-/*      } */
-/*    e->keyname = strdup(keyname); */
-/*    if (!e->keyname) */
-/*      { */
-/*     free(e); */
-/*     return; */
-/*      } */
-/*    val = XLookupString((XKeyEvent *)xevent, buf, sizeof(buf), &sym, &status); */
-/*    if (val > 0) */
-/*      { */
-/*     buf[val] = 0; */
-/*     e->key_compose = ecore_txt_convert("ISO8859-1", "UTF-8", buf); */
-/*      } */
-/*    else e->key_compose = NULL; */
-/*    keyname = XKeysymToString(sym); */
-/*    if (keyname) e->keysymbol = strdup(keyname); */
-/*    else e->keysymbol = strdup(e->keyname); */
-/*    if (!e->keysymbol) */
-/*      { */
-/*     if (e->keyname) free(e->keyname); */
-/*     if (e->key_compose) free(e->key_compose); */
-/*     free(e); */
-/*     return; */
-/*      } */
-/*    if (xevent->xkey.subwindow) e->win = xevent->xkey.subwindow; */
-/*    else e->win = xevent->xkey.window; */
-/*    e->event_win = xevent->xkey.window; */
-/*    e->time = xevent->xkey.time; */
-/*    e->modifiers = xevent->xkey.state; */
-/*    _ecore_x_event_last_time = e->time; */
-/*    ecore_event_add(ECORE_X_EVENT_KEY_UP, e, _ecore_x_event_free_key_up, NULL); */
-}
-
-void
-_ecore_x_event_handle_button_press(xcb_generic_event_t *event)
+_ecore_xcb_event_handle_button_press(xcb_generic_event_t *event)
 {
    xcb_button_press_event_t *ev;
-   int                       i;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
 
    ev = (xcb_button_press_event_t *)event;
    if ((ev->detail > 3) && (ev->detail < 8))
      {
-       Ecore_X_Event_Mouse_Wheel *e;
-
-       e = malloc(sizeof(Ecore_X_Event_Mouse_Wheel));
-
-       if (!e)
-         return;
-
-       e->modifiers = ev->state;
-       e->direction = 0;
-       e->z = 0;
-       if      (ev->detail == 4)
-         {
-            e->direction = 0;
-            e->z = -1;
-         }
-       else if (ev->detail == 5)
-         {
-            e->direction = 0;
-            e->z = 1;
-         }
-       else if (ev->detail == 6)
-         {
-            e->direction = 1;
-            e->z = -1;
-         }
-       else if (ev->detail == 7)
-         {
-            e->direction = 1;
-            e->z = 1;
-         }
-       e->x = ev->event_x;
-       e->y = ev->event_y;
-       e->root.x = ev->root_x;
-       e->root.y = ev->root_y;
-
-       if (ev->child)
-         e->win = ev->child;
-       else
-         e->win = ev->event;
-
-       e->event_win = ev->event;
-       e->same_screen = ev->same_screen;
-       e->root_win = ev->root;
-       e->time = ev->time;
-       _ecore_xcb_event_last_time = e->time;
-       _ecore_xcb_event_last_window = e->win;
-       _ecore_xcb_event_last_root_x = e->root.x;
-       _ecore_xcb_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_WHEEL, e, NULL, NULL);
-       for (i = 0; i < _ecore_window_grabs_num; i++)
-         {
-            if ((_ecore_window_grabs[i] == ev->event) ||
-                (_ecore_window_grabs[i] == ev->child))
-              {
-                 int replay = 0;
-
-                 if (_ecore_window_grab_replay_func)
-                   replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data,
-                                                           ECORE_X_EVENT_MOUSE_WHEEL,
-                                                           e);
-                  /* FIXME: xcb_key_press_event_t does not save the */
-                  /* connection. So I use the current one */
-                 if (replay)
-                   xcb_allow_events(_ecore_xcb_conn,
-                                     XCB_ALLOW_REPLAY_POINTER,
-                                     ev->time);
-                 else
-                   xcb_allow_events(_ecore_xcb_conn,
-                                     XCB_ALLOW_ASYNC_POINTER,
-                                     ev->time);
-                 break;
-              }
-         }
+        Ecore_Event_Mouse_Wheel *e;
+
+        if (!(e = malloc(sizeof(Ecore_Event_Mouse_Wheel)))) return;
+
+        e->timestamp = ev->time;
+        e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
+        switch (ev->detail)
+          {
+           case 4:
+             e->direction = 0;
+             e->z = -1;
+             break;
+
+           case 5:
+             e->direction = 0;
+             e->z = 1;
+             break;
+
+           case 6:
+             e->direction = 1;
+             e->z = -1;
+             break;
+
+           case 7:
+             e->direction = 1;
+             e->z = 1;
+             break;
+
+           default:
+             e->direction = 0;
+             e->z = 0;
+             break;
+          }
+        e->x = ev->event_x;
+        e->y = ev->event_y;
+        e->root.x = ev->root_x;
+        e->root.y = ev->root_y;
+        if (ev->child)
+          e->window = ev->child;
+        else
+          e->window = ev->event;
+
+        e->event_window = ev->event;
+        e->same_screen = ev->same_screen;
+        e->root_window = ev->root;
+
+        _ecore_xcb_event_last_time = e->timestamp;
+        _ecore_xcb_event_last_window = e->window;
+        _ecore_xcb_event_last_root_x = e->root.x;
+        _ecore_xcb_event_last_root_y = e->root.y;
+
+        ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
+
+        _ecore_xcb_window_grab_allow_events(ev->event, ev->child,
+                                            ECORE_EVENT_MOUSE_WHEEL,
+                                            e, ev->time);
      }
    else
      {
-         {
-            Ecore_X_Event_Mouse_Move *e;
-
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-            if (!e) return;
-            e->modifiers = ev->state;
-            e->x = ev->event_x;
-            e->y = ev->event_y;
-            e->root.x = ev->root_x;
-            e->root.y = ev->root_y;
-            if (ev->child) e->win = ev->child;
-            else e->win = ev->event;
-            e->same_screen = ev->same_screen;
-            e->root_win = ev->root;
-            e->event_win = ev->event;
-            e->time = ev->time;
-            _ecore_xcb_event_last_time = e->time;
-            _ecore_xcb_event_last_window = e->win;
-            _ecore_xcb_event_last_root_x = e->root.x;
-            _ecore_xcb_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-         }
-         {
-            Ecore_X_Event_Mouse_Button_Down *e;
-
-            if (_ecore_xcb_mouse_down_did_triple)
-              {
-                 _ecore_xcb_mouse_down_last_window = 0;
-                 _ecore_xcb_mouse_down_last_last_window = 0;
-                 _ecore_xcb_mouse_down_last_event_window = 0;
-                 _ecore_xcb_mouse_down_last_last_event_window = 0;
-                 _ecore_xcb_mouse_down_last_time = 0;
-                 _ecore_xcb_mouse_down_last_last_time = 0;
-              }
-
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Button_Down));
-            if (!e) return;
-            e->button = ev->detail;
-            e->modifiers = ev->state;
-            e->x = ev->event_x;
-            e->y = ev->event_y;
-            e->root.x = ev->root_x;
-            e->root.y = ev->root_y;
-            if (ev->child) e->win = ev->child;
-            else e->win = ev->event;
-            e->same_screen = ev->same_screen;
-            e->root_win = ev->root;
-            e->event_win = ev->event;
-            e->time = ev->time;
-            if (e->win == e->event_win)
-              {
-                 if (((int)(e->time - _ecore_xcb_mouse_down_last_time) <=
-                      (int)(1000 * _ecore_xcb_double_click_time)) &&
-                     (e->win == _ecore_xcb_mouse_down_last_window) &&
-                     (e->event_win == _ecore_xcb_mouse_down_last_event_window)
-                     )
-                   e->double_click = 1;
-                 if (((int)(e->time - _ecore_xcb_mouse_down_last_last_time) <=
-                      (int)(2 * 1000 * _ecore_xcb_double_click_time)) &&
-                     (e->win == _ecore_xcb_mouse_down_last_window) &&
-                      (e->win == _ecore_xcb_mouse_down_last_last_window) &&
-                     (e->event_win == _ecore_xcb_mouse_down_last_event_window) &&
-                      (e->event_win == _ecore_xcb_mouse_down_last_last_event_window)
-                     )
-                   {
-                        e->triple_click = 1;
-                      _ecore_xcb_mouse_down_did_triple = 1;
-                   }
-                  else
-                    _ecore_xcb_mouse_down_did_triple = 0;
-              }
-             if (!e->double_click && !e->triple_click)
-               _ecore_xcb_mouse_up_count = 0;
-            _ecore_xcb_event_last_time = e->time;
-            _ecore_xcb_event_last_window = e->win;
-            _ecore_xcb_event_last_root_x = e->root.x;
-            _ecore_xcb_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
-            for (i = 0; i < _ecore_window_grabs_num; i++)
-              {
-                 if ((_ecore_window_grabs[i] == ev->event) ||
-                     (_ecore_window_grabs[i] == ev->child))
-                   {
-                      int replay = 0;
-
-                      if (_ecore_window_grab_replay_func)
-                        replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data,
-                                                                ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
-                                                                e);
-                       /* FIXME: xcb_key_press_event_t does not save the */
-                       /* connection. So I use the current one */
-                      if (replay)
-                        xcb_allow_events(_ecore_xcb_conn,
-                                          XCB_ALLOW_REPLAY_POINTER,
-                                          ev->time);
-                      else
-                        xcb_allow_events(_ecore_xcb_conn,
-                                          XCB_ALLOW_ASYNC_POINTER,
-                                          ev->time);
-                      break;
-                   }
-              }
-            if (e->win == e->event_win)
-              {
-                 if (!_ecore_xcb_mouse_down_did_triple)
-                   {
-                      _ecore_xcb_mouse_down_last_last_window = _ecore_xcb_mouse_down_last_window;
-                      if (ev->child)
-                        _ecore_xcb_mouse_down_last_window = ev->child;
-                      else
-                        _ecore_xcb_mouse_down_last_window = ev->event;
-                      _ecore_xcb_mouse_down_last_last_event_window = _ecore_xcb_mouse_down_last_event_window;
-                      _ecore_xcb_mouse_down_last_event_window = ev->event;
-                      _ecore_xcb_mouse_down_last_last_time = _ecore_xcb_mouse_down_last_time;
-                      _ecore_xcb_mouse_down_last_time = ev->time;
-                   }
-              }
-         }
+        Ecore_Event_Mouse_Button *e;
+        unsigned int child_win = 0;
+
+        child_win = (ev->child ? ev->child : ev->event);
+
+        _ecore_xcb_event_mouse_move(ev->time, ev->state,
+                                    ev->event_x, ev->event_y,
+                                    ev->root_x, ev->root_y,
+                                    ev->event, child_win,
+                                    ev->root, ev->same_screen,
+                                    0, 1, 1, 1.0, 0.0,
+                                    ev->event_x, ev->event_y,
+                                    ev->root_x, ev->root_y);
+
+        e = _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                                          ev->time,
+                                          ev->state, ev->detail,
+                                          ev->event_x, ev->event_y,
+                                          ev->root_x, ev->root_y, ev->event,
+                                          child_win,
+                                          ev->root, ev->same_screen,
+                                          0, 1, 1, 1.0, 0.0,
+                                          ev->event_x, ev->event_y,
+                                          ev->root_x, ev->root_y);
+        if (e)
+          _ecore_xcb_window_grab_allow_events(ev->event, ev->child,
+                                              ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                                              e, ev->time);
      }
 }
 
-void
-_ecore_x_event_handle_button_release(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_button_release(xcb_generic_event_t *event)
 {
    xcb_button_release_event_t *ev;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_button_release_event_t *)event;
-   /* filter out wheel buttons */
    if ((ev->detail <= 3) || (ev->detail > 7))
      {
-         {
-            Ecore_X_Event_Mouse_Move *e;
-
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-            if (!e) return;
-            e->modifiers = ev->state;
-            e->x = ev->event_x;
-            e->y = ev->event_y;
-            e->root.x = ev->root_x;
-            e->root.y = ev->root_y;
-            if (ev->child) e->win = ev->child;
-            else e->win = ev->event;
-            e->same_screen = ev->same_screen;
-            e->root_win = ev->root;
-            e->event_win = ev->event;
-            e->time = ev->time;
-            _ecore_xcb_event_last_time = e->time;
-            _ecore_xcb_event_last_window = e->win;
-            _ecore_xcb_event_last_root_x = e->root.x;
-            _ecore_xcb_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-         }
-         {
-            Ecore_X_Event_Mouse_Button_Up *e;
-
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Button_Up));
-            if (!e) return;
-            e->button = ev->detail;
-            e->modifiers = ev->state;
-            e->x = ev->event_x;
-            e->y = ev->event_y;
-            e->root.x = ev->root_x;
-            e->root.y = ev->root_y;
-            if (ev->child) e->win = ev->child;
-            else e->win = ev->event;
-            e->same_screen = ev->same_screen;
-            e->root_win = ev->root;
-            e->event_win = ev->event;
-            e->time = ev->time;
-             _ecore_xcb_mouse_up_count++;
-            if (e->win == e->event_win)
-              {
-                 if ((_ecore_xcb_mouse_up_count >= 2) &&
-                      ((int)(e->time - _ecore_xcb_mouse_down_last_time) <=
-                      (int)(1000 * _ecore_xcb_double_click_time)) &&
-                     (e->win == _ecore_xcb_mouse_down_last_window) &&
-                     (e->event_win == _ecore_xcb_mouse_down_last_event_window)
-                     )
-                   e->double_click = 1;
-                 if ((_ecore_xcb_mouse_up_count >= 3) &&
-                     ((int)(e->time - _ecore_xcb_mouse_down_last_last_time) <=
-                      (int)(2 * 1000 * _ecore_xcb_double_click_time)) &&
-                     (e->win == _ecore_xcb_mouse_down_last_window) &&
-                      (e->win == _ecore_xcb_mouse_down_last_last_window) &&
-                     (e->event_win == _ecore_xcb_mouse_down_last_event_window) &&
-                      (e->event_win == _ecore_xcb_mouse_down_last_last_event_window)
-                     )
-                    e->triple_click = 1;
-              }
-            _ecore_xcb_event_last_time = e->time;
-            _ecore_xcb_event_last_window = e->win;
-            _ecore_xcb_event_last_root_x = e->root.x;
-            _ecore_xcb_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
-         }
+        _ecore_xcb_event_mouse_move(ev->time, ev->state,
+                                    ev->event_x, ev->event_y,
+                                    ev->root_x, ev->root_y,
+                                    ev->event,
+                                    (ev->child ? ev->child : ev->event),
+                                    ev->root, ev->same_screen,
+                                    0, 1, 1, 1.0, 0.0,
+                                    ev->event_x, ev->event_y,
+                                    ev->root_x, ev->root_y);
+
+        _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP, ev->time,
+                                      ev->state, ev->detail,
+                                      ev->event_x, ev->event_y, ev->root_x,
+                                      ev->root_y, ev->event,
+                                      (ev->child ? ev->child : ev->event),
+                                      ev->root, ev->same_screen,
+                                      0, 1, 1, 1.0, 0.0,
+                                      ev->event_x, ev->event_y,
+                                      ev->root_x, ev->root_y);
      }
 }
 
-void
-_ecore_x_event_handle_motion_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_motion_notify(xcb_generic_event_t *event)
 {
    xcb_motion_notify_event_t *ev;
-   Ecore_X_Event_Mouse_Move  *e;
 
    ev = (xcb_motion_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-   if (!e) return;
-   e->modifiers = ev->state;
+
+   /* if (_ecore_xcb_event_last_mouse_move_event)  */
+   /*   { */
+   /*      ecore_event_del(_ecore_xcb_event_last_mouse_move_event); */
+   /*      _ecore_xcb_event_last_mouse_move = EINA_FALSE; */
+   /*      _ecore_xcb_event_last_mouse_move_event = NULL; */
+   /*   } */
+
+   _ecore_xcb_event_mouse_move(ev->time, ev->state,
+                               ev->event_x, ev->event_y,
+                               ev->root_x, ev->root_y,
+                               ev->event,
+                               (ev->child ? ev->child : ev->event),
+                               ev->root, ev->same_screen,
+                               0, 1, 1, 1.0, 0.0,
+                               ev->event_x, ev->event_y,
+                               ev->root_x, ev->root_y);
+   _ecore_xcb_event_last_mouse_move = EINA_TRUE;
+
+   _ecore_xcb_dnd_drag(ev->root, ev->root_x, ev->root_y);
+}
+
+static void
+_ecore_xcb_event_handle_enter_notify(xcb_generic_event_t *event)
+{
+   xcb_enter_notify_event_t *ev;
+   Ecore_X_Event_Mouse_In *e;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_enter_notify_event_t *)event;
+
+   _ecore_xcb_event_mouse_move(ev->time, ev->state,
+                               ev->event_x, ev->event_y,
+                               ev->root_x, ev->root_y,
+                               ev->event,
+                               (ev->child ? ev->child : ev->event),
+                               ev->root, ev->same_screen_focus,
+                               0, 1, 1, 1.0, 0.0,
+                               ev->event_x, ev->event_y,
+                               ev->root_x, ev->root_y);
+
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Mouse_In)))) return;
+
+   e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
    e->x = ev->event_x;
    e->y = ev->event_y;
    e->root.x = ev->root_x;
    e->root.y = ev->root_y;
-   if (ev->child) e->win = ev->child;
-   else e->win = ev->event;
-   e->same_screen = ev->same_screen;
-   e->root_win = ev->root;
+   if (ev->child)
+     e->win = ev->child;
+   else
+     e->win = ev->event;
    e->event_win = ev->event;
+   e->same_screen = ev->same_screen_focus;
+   e->root_win = ev->root;
+   e->mode = _ecore_xcb_event_mode_get(ev->mode);
+   e->detail = _ecore_xcb_event_detail_get(ev->detail);
    e->time = ev->time;
    _ecore_xcb_event_last_time = e->time;
-   _ecore_xcb_event_last_window = e->win;
-   _ecore_xcb_event_last_root_x = e->root.x;
-   _ecore_xcb_event_last_root_y = e->root.y;
 
-   /* Xdnd handling */
-   _ecore_x_dnd_drag(e->root_win, e->root.x, e->root.y);
-
-   ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
+   ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_enter_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_leave_notify(xcb_generic_event_t *event)
 {
-   xcb_enter_notify_event_t *ev;
+   xcb_leave_notify_event_t *ev;
+   Ecore_X_Event_Mouse_Out *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_enter_notify_event_t *)event;
 
-     {
-       Ecore_X_Event_Mouse_Move *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-       if (!e) return;
-       e->modifiers = ev->state;
-       e->x = ev->event_x;
-       e->y = ev->event_y;
-       e->root.x = ev->root_x;
-       e->root.y = ev->root_y;
-       if (ev->child) e->win = ev->child;
-       else e->win = ev->event;
-       e->same_screen = ev->same_screen_focus;
-       e->root_win = ev->root;
-       e->event_win = ev->event;
-       e->time = ev->time;
-       _ecore_xcb_event_last_time = e->time;
-       _ecore_xcb_event_last_window = e->win;
-       _ecore_xcb_event_last_root_x = e->root.x;
-       _ecore_xcb_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-     }
-     {
-       Ecore_X_Event_Mouse_In *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
-       if (!e) return;
-       e->modifiers = ev->state;
-       e->x = ev->event_x;
-       e->y = ev->event_y;
-       e->root.x = ev->root_x;
-       e->root.y = ev->root_y;
-       if (ev->child) e->win = ev->child;
-       else e->win = ev->event;
-       e->same_screen = ev->same_screen_focus;
-       e->root_win = ev->root;
-       e->event_win = ev->event;
-        switch (ev->mode) {
-        case XCB_NOTIFY_MODE_NORMAL:
-          e->mode = ECORE_X_EVENT_MODE_NORMAL;
-          break;
-        case XCB_NOTIFY_MODE_GRAB:
-          e->mode = ECORE_X_EVENT_MODE_GRAB;
-          break;
-        case XCB_NOTIFY_MODE_UNGRAB:
-          e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-          break;
-        default:
-          e->mode = ECORE_X_EVENT_MODE_NORMAL;
-          break;
-        }
-        switch (ev->detail) {
-        case XCB_NOTIFY_DETAIL_ANCESTOR:
-          e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-          break;
-        case XCB_NOTIFY_DETAIL_VIRTUAL:
-          e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-          break;
-        case XCB_NOTIFY_DETAIL_INFERIOR:
-          e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-          break;
-        case XCB_NOTIFY_DETAIL_NONLINEAR:
-          e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-          break;
-        case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL:
-          e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-          break;
-        default:
-          e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-          break;
-        }
-       e->time = ev->time;
-       _ecore_xcb_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
-     }
+   _ecore_xcb_event_mouse_move(ev->time, ev->state,
+                               ev->event_x, ev->event_y,
+                               ev->root_x, ev->root_y,
+                               ev->event,
+                               (ev->child ? ev->child : ev->event),
+                               ev->root, ev->same_screen_focus,
+                               0, 1, 1, 1.0, 0.0,
+                               ev->event_x, ev->event_y,
+                               ev->root_x, ev->root_y);
+
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out)))) return;
+
+   e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
+   e->x = ev->event_x;
+   e->y = ev->event_y;
+   e->root.x = ev->root_x;
+   e->root.y = ev->root_y;
+   if (ev->child)
+     e->win = ev->child;
+   else
+     e->win = ev->event;
+   e->event_win = ev->event;
+   e->same_screen = ev->same_screen_focus;
+   e->root_win = ev->root;
+   e->mode = _ecore_xcb_event_mode_get(ev->mode);
+   e->detail = _ecore_xcb_event_detail_get(ev->detail);
+
+   e->time = ev->time;
+   _ecore_xcb_event_last_time = e->time;
+   _ecore_xcb_event_last_window = e->win;
+   _ecore_xcb_event_last_root_x = e->root.x;
+   _ecore_xcb_event_last_root_y = e->root.y;
+
+   ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_leave_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_keymap_notify(xcb_generic_event_t *event __UNUSED__)
 {
-   xcb_leave_notify_event_t *ev;
+//   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   ev = (xcb_leave_notify_event_t *)event;
-     {
-       Ecore_X_Event_Mouse_Move *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-       if (!e) return;
-       e->modifiers = ev->state;
-       e->x = ev->event_x;
-       e->y = ev->event_y;
-       e->root.x = ev->root_x;
-       e->root.y = ev->root_y;
-       if (ev->child) e->win = ev->child;
-       else e->win = ev->event;
-       e->same_screen = ev->same_screen_focus;
-       e->root_win = ev->root;
-       e->event_win = ev->event;
-       e->time = ev->time;
-       _ecore_xcb_event_last_time = e->time;
-       _ecore_xcb_event_last_window = e->win;
-       _ecore_xcb_event_last_root_x = e->root.x;
-       _ecore_xcb_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-     }
-     {
-       Ecore_X_Event_Mouse_Out *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
-       if (!e) return;
-       e->modifiers = ev->state;
-       e->x = ev->event_x;
-       e->y = ev->event_y;
-       e->root.x = ev->root_x;
-       e->root.y = ev->root_y;
-       if (ev->child) e->win = ev->child;
-       else e->win = ev->event;
-       e->same_screen = ev->same_screen_focus;
-       e->root_win = ev->root;
-       e->event_win = ev->event;
-        switch (ev->mode) {
-        case XCB_NOTIFY_MODE_NORMAL:
-          e->mode = ECORE_X_EVENT_MODE_NORMAL;
-          break;
-        case XCB_NOTIFY_MODE_GRAB:
-          e->mode = ECORE_X_EVENT_MODE_GRAB;
-          break;
-        case XCB_NOTIFY_MODE_UNGRAB:
-          e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-          break;
-        default:
-          e->mode = ECORE_X_EVENT_MODE_NORMAL;
-          break;
-        }
-        switch (ev->detail) {
-        case XCB_NOTIFY_DETAIL_ANCESTOR:
-          e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-          break;
-        case XCB_NOTIFY_DETAIL_VIRTUAL:
-          e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-          break;
-        case XCB_NOTIFY_DETAIL_INFERIOR:
-          e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-          break;
-        case XCB_NOTIFY_DETAIL_NONLINEAR:
-          e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-          break;
-        case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL:
-          e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-          break;
-        default:
-          e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-          break;
-        }
-       e->time = ev->time;
-       _ecore_xcb_event_last_time = e->time;
-       _ecore_xcb_event_last_window = e->win;
-       _ecore_xcb_event_last_root_x = e->root.x;
-       _ecore_xcb_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
-     }
+     // FIXME: handle this event type
+       _ecore_xcb_event_last_mouse_move = EINA_FALSE;
 }
 
-void
-_ecore_x_event_handle_focus_in(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_focus_in(xcb_generic_event_t *event)
 {
-   xcb_focus_in_event_t          *ev;
+   xcb_focus_in_event_t *ev;
    Ecore_X_Event_Window_Focus_In *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_focus_in_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In)))) return;
+
    e->win = ev->event;
-   switch (ev->mode) {
-   case XCB_NOTIFY_MODE_NORMAL:
-     e->mode = ECORE_X_EVENT_MODE_NORMAL;
-     break;
-   case XCB_NOTIFY_MODE_GRAB:
-     e->mode = ECORE_X_EVENT_MODE_GRAB;
-     break;
-   case XCB_NOTIFY_MODE_UNGRAB:
-     e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-     break;
-   case XCB_NOTIFY_MODE_WHILE_GRABBED:
-     e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
-     break;
-   }
-   switch (ev->detail) {
-   case XCB_NOTIFY_DETAIL_ANCESTOR:
-     e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-     break;
-   case XCB_NOTIFY_DETAIL_VIRTUAL:
-     e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-     break;
-   case XCB_NOTIFY_DETAIL_INFERIOR:
-     e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-     break;
-   case XCB_NOTIFY_DETAIL_NONLINEAR:
-     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-     break;
-   case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL:
-     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-     break;
-   case XCB_NOTIFY_DETAIL_POINTER:
-     e->detail = ECORE_X_EVENT_DETAIL_POINTER;
-     break;
-   case XCB_NOTIFY_DETAIL_POINTER_ROOT:
-     e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
-     break;
-   case XCB_NOTIFY_DETAIL_NONE:
-     e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
-     break;
-   }
+   e->mode = _ecore_xcb_event_mode_get(ev->mode);
+   e->detail = _ecore_xcb_event_detail_get(ev->detail);
+
    e->time = _ecore_xcb_event_last_time;
    _ecore_xcb_event_last_time = e->time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_focus_out(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_focus_out(xcb_generic_event_t *event)
 {
-   xcb_focus_out_event_t            *ev;
+   xcb_focus_out_event_t *ev;
    Ecore_X_Event_Window_Focus_Out *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_focus_out_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out)))) return;
+
    e->win = ev->event;
-   switch (ev->mode) {
-   case XCB_NOTIFY_MODE_NORMAL:
-     e->mode = ECORE_X_EVENT_MODE_NORMAL;
-     break;
-   case XCB_NOTIFY_MODE_GRAB:
-     e->mode = ECORE_X_EVENT_MODE_GRAB;
-     break;
-   case XCB_NOTIFY_MODE_UNGRAB:
-     e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-     break;
-   case XCB_NOTIFY_MODE_WHILE_GRABBED:
-     e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
-     break;
-   }
-   switch (ev->detail) {
-   case XCB_NOTIFY_DETAIL_ANCESTOR:
-     e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-     break;
-   case XCB_NOTIFY_DETAIL_VIRTUAL:
-     e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-     break;
-   case XCB_NOTIFY_DETAIL_INFERIOR:
-     e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-     break;
-   case XCB_NOTIFY_DETAIL_NONLINEAR:
-     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-     break;
-   case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL:
-     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-     break;
-   case XCB_NOTIFY_DETAIL_POINTER:
-     e->detail = ECORE_X_EVENT_DETAIL_POINTER;
-     break;
-   case XCB_NOTIFY_DETAIL_POINTER_ROOT:
-     e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
-     break;
-   case XCB_NOTIFY_DETAIL_NONE:
-     e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
-     break;
-   }
+   e->mode = _ecore_xcb_event_mode_get(ev->mode);
+   e->detail = _ecore_xcb_event_detail_get(ev->detail);
+
    e->time = _ecore_xcb_event_last_time;
    _ecore_xcb_event_last_time = e->time;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
-}
 
-void
-_ecore_x_event_handle_keymap_notify(xcb_generic_event_t *event __UNUSED__)
-{
-   /* FIXME: handle this event type */
+   ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_expose(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_expose(xcb_generic_event_t *event)
 {
-   xcb_expose_event_t            *ev;
+   xcb_expose_event_t *ev;
    Ecore_X_Event_Window_Damage *e;
 
-   ev = (xcb_expose_event_t *)event,
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
-   if (!e) return;
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_expose_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Damage)))) return;
+
    e->win = ev->window;
    e->time = _ecore_xcb_event_last_time;
    e->x = ev->x;
@@ -916,151 +914,178 @@ _ecore_x_event_handle_expose(xcb_generic_event_t *event)
    e->w = ev->width;
    e->h = ev->height;
    e->count = ev->count;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_graphics_expose(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_graphics_exposure(xcb_generic_event_t *event)
 {
    xcb_graphics_exposure_event_t *ev;
    Ecore_X_Event_Window_Damage *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_graphics_exposure_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Damage)))) return;
+
    e->win = ev->drawable;
-   e->time = _ecore_xcb_event_last_time;
    e->x = ev->x;
    e->y = ev->y;
    e->w = ev->width;
    e->h = ev->height;
    e->count = ev->count;
+   e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_visibility_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_visibility_notify(xcb_generic_event_t *event)
 {
    xcb_visibility_notify_event_t *ev;
+   Ecore_X_Event_Window_Visibility_Change *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_visibility_notify_event_t *)event;
-   if (ev->state != XCB_VISIBILITY_PARTIALLY_OBSCURED)
-   {
-      Ecore_X_Event_Window_Visibility_Change *e;
-
-      e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change));
-      if (!e) return;
-      e->win = ev->window;
-      e->time = _ecore_xcb_event_last_time;
-      if (ev->state == XCB_VISIBILITY_FULLY_OBSCURED)
-        e->fully_obscured = 1;
-      else
-        e->fully_obscured = 0;
-      ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
-   }
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change))))
+     return;
+
+   e->win = ev->window;
+   e->time = _ecore_xcb_event_last_time;
+   if (ev->state == XCB_VISIBILITY_FULLY_OBSCURED)
+     e->fully_obscured = 1;
+   else
+     e->fully_obscured = 0;
+
+   ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_create_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_create_notify(xcb_generic_event_t *event)
 {
-   xcb_create_notify_event_t     *ev;
+   xcb_create_notify_event_t *ev;
    Ecore_X_Event_Window_Create *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_create_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Create)))) return;
+
    e->win = ev->window;
+   e->parent = ev->parent;
    if (ev->override_redirect)
-      e->override = 1;
+     e->override = 1;
    else
-      e->override = 0;
+     e->override = 0;
+   e->x = ev->x;
+   e->y = ev->y;
+   e->w = ev->width;
+   e->h = ev->height;
+   e->border = ev->border_width;
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_destroy_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_destroy_notify(xcb_generic_event_t *event)
 {
-   xcb_destroy_notify_event_t     *ev;
+   xcb_destroy_notify_event_t *ev;
    Ecore_X_Event_Window_Destroy *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_destroy_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
-   if (!e) return;
-   e->win =  ev->window;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy)))) return;
+
+   e->win = ev->window;
+   e->event_win = ev->event;
+   if (e->win == _ecore_xcb_event_last_window)
+     _ecore_xcb_event_last_window = 0;
    e->time = _ecore_xcb_event_last_time;
-   if (e->win == _ecore_xcb_event_last_window) _ecore_xcb_event_last_window = 0;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_unmap_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_map_notify(xcb_generic_event_t *event)
 {
-   xcb_unmap_notify_event_t    *ev;
-   Ecore_X_Event_Window_Hide *e;
+   xcb_map_notify_event_t *ev;
+   Ecore_X_Event_Window_Show *e;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_map_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Show)))) return;
 
-   ev = (xcb_unmap_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
-   if (!e) return;
    e->win = ev->window;
+   e->event_win = ev->event;
    e->time = _ecore_xcb_event_last_time;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
+
+   ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_map_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_unmap_notify(xcb_generic_event_t *event)
 {
-   xcb_map_notify_event_t      *ev;
-   Ecore_X_Event_Window_Show *e;
+   xcb_unmap_notify_event_t *ev;
+   Ecore_X_Event_Window_Hide *e;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_unmap_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Hide)))) return;
 
-   ev = (xcb_map_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
-   if (!e) return;
    e->win = ev->window;
+   e->event_win = ev->event;
    e->time = _ecore_xcb_event_last_time;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
+
+   ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_map_request(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_map_request(xcb_generic_event_t *event)
 {
-   xcb_map_request_event_t             *ev;
+   xcb_map_request_event_t *ev;
    Ecore_X_Event_Window_Show_Request *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_map_request_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request)))) return;
+
    e->win = ev->window;
    e->parent = ev->parent;
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_reparent_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_reparent_notify(xcb_generic_event_t *event)
 {
-   xcb_reparent_notify_event_t     *ev;
+   xcb_reparent_notify_event_t *ev;
    Ecore_X_Event_Window_Reparent *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_reparent_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent)))) return;
+
    e->win = ev->window;
+   e->event_win = ev->event;
    e->parent = ev->parent;
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_configure_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_configure_notify(xcb_generic_event_t *event)
 {
-   xcb_configure_notify_event_t     *ev;
+   xcb_configure_notify_event_t *ev;
    Ecore_X_Event_Window_Configure *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_configure_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Configure)))) return;
+
    e->win = ev->window;
+   e->event_win = ev->event;
    e->abovewin = ev->above_sibling;
    e->x = ev->x;
    e->y = ev->y;
@@ -1069,21 +1094,25 @@ _ecore_x_event_handle_configure_notify(xcb_generic_event_t *event)
    e->border = ev->border_width;
    e->override = ev->override_redirect;
    /* send_event is bit 7 (0x80) of response_type */
-   e->from_wm = (ev->response_type & 0x80) ? 1 : 0;
+   e->from_wm = ((ev->response_type & 0x80) ? 1 : 0);
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_configure_request(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_configure_request(xcb_generic_event_t *event)
 {
-   xcb_configure_request_event_t            *ev;
+   xcb_configure_request_event_t *ev;
    Ecore_X_Event_Window_Configure_Request *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_configure_request_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request))))
+     return;
+
    e->win = ev->window;
+   e->parent_win = ev->parent;
    e->abovewin = ev->sibling;
    e->x = ev->x;
    e->y = ev->y;
@@ -1091,58 +1120,80 @@ _ecore_x_event_handle_configure_request(xcb_generic_event_t *event)
    e->h = ev->height;
    e->border = ev->border_width;
    e->value_mask = ev->value_mask;
-   switch (ev->stack_mode) {
-   case XCB_STACK_MODE_ABOVE:
-     e->detail = ECORE_X_WINDOW_STACK_ABOVE;
-     break;
-   case XCB_STACK_MODE_BELOW:
-     e->detail = ECORE_X_WINDOW_STACK_BELOW;
-     break;
-   case XCB_STACK_MODE_TOP_IF:
-     e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
-     break;
-   case XCB_STACK_MODE_BOTTOM_IF:
-     e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
-     break;
-   case XCB_STACK_MODE_OPPOSITE:
-     e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
-     break;
-   }
-   e->time = _ecore_xcb_event_last_time;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
-}
+   switch (ev->stack_mode)
+     {
+      case XCB_STACK_MODE_ABOVE:
+        e->detail = ECORE_X_WINDOW_STACK_ABOVE;
+        break;
 
-void
-_ecore_x_event_handle_gravity_notify(xcb_generic_event_t *event __UNUSED__)
-{
-   /* FIXME: handle this event type */
+      case XCB_STACK_MODE_BELOW:
+        e->detail = ECORE_X_WINDOW_STACK_BELOW;
+        break;
+
+      case XCB_STACK_MODE_TOP_IF:
+        e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
+        break;
+
+      case XCB_STACK_MODE_BOTTOM_IF:
+        e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
+        break;
+
+      case XCB_STACK_MODE_OPPOSITE:
+        e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
+        break;
+     }
+   e->time = _ecore_xcb_event_last_time;
+
+   ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_resize_request(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_gravity_notify(xcb_generic_event_t *event __UNUSED__)
+{
+/*
+   xcb_gravity_notify_event_t *ev;
+   Ecore_X_Event_Window_Gravity *e;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_gravity_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Gravity)))) return;
+
+   e->win = ev->window;
+   e->event_win = ev->event;
+   e->time = _ecore_xcb_event_last_time;
+
+   ecore_event_add(ECORE_X_EVENT_WINDOW_GRAVITY, e, NULL, NULL);
+ */
+}
+
+static void
+_ecore_xcb_event_handle_resize_request(xcb_generic_event_t *event)
 {
-   xcb_resize_request_event_t            *ev;
+   xcb_resize_request_event_t *ev;
    Ecore_X_Event_Window_Resize_Request *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_resize_request_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request)))) return;
+
    e->win = ev->window;
    e->w = ev->width;
    e->h = ev->height;
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_circulate_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_circulate_notify(xcb_generic_event_t *event)
 {
    xcb_circulate_notify_event_t *ev;
    Ecore_X_Event_Window_Stack *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_circulate_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Stack)))) return;
+
    e->win = ev->window;
    e->event_win = ev->event;
    if (ev->place == XCB_PLACE_ON_TOP)
@@ -1150,18 +1201,20 @@ _ecore_x_event_handle_circulate_notify(xcb_generic_event_t *event)
    else
      e->detail = ECORE_X_WINDOW_STACK_BELOW;
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_circulate_request(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_circulate_request(xcb_generic_event_t *event)
 {
-   xcb_circulate_request_event_t        *ev;
+   xcb_circulate_request_event_t *ev;
    Ecore_X_Event_Window_Stack_Request *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_circulate_request_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request)))) return;
+
    e->win = ev->window;
    e->parent = ev->event;
    if (ev->place == XCB_PLACE_ON_TOP)
@@ -1169,249 +1222,154 @@ _ecore_x_event_handle_circulate_request(xcb_generic_event_t *event)
    else
      e->detail = ECORE_X_WINDOW_STACK_BELOW;
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_property_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_property_notify(xcb_generic_event_t *event)
 {
-#if 0 /* for now i disabled this. nice idea though this is - it leaves a lot
-       * to be desired for efficiency that is better left to the app layer
-       */
-   if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLASS)
-     {
-       Ecore_X_Event_Window_Prop_Name_Class_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change));
-       if (!e) return;
-       ecore_x_window_prop_name_class_get(xevent->xproperty.window,
-                                          &(e->name), &(e->clas));
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE, e, _ecore_x_event_free_window_prop_name_class_change, NULL);
-     }
-   else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_NAME))
-     {
-       Ecore_X_Event_Window_Prop_Title_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change));
-       if (!e) return;
-       e->title = ecore_x_window_prop_title_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_title_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_NAME)
-     {
-       Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Title_Change));
-       if (!e) return;
-       e->title = ecore_x_window_prop_visible_title_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_visible_title_change, NULL);
-     }
-   else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_ICON_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_ICON_NAME))
-     {
-       Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Icon_Name_Change));
-       if (!e) return;
-       e->name = ecore_x_window_prop_icon_name_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_icon_name_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME)
-     {
-       Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change));
-       if (!e) return;
-       e->name = ecore_x_window_prop_visible_icon_name_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_visible_icon_name_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLIENT_MACHINE)
-     {
-       Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Client_Machine_Change));
-       if (!e) return;
-       e->name = ecore_x_window_prop_client_machine_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE, e, _ecore_x_event_free_window_prop_client_machine_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_PID)
-     {
-       Ecore_X_Event_Window_Prop_Pid_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Pid_Change));
-       if (!e) return;
-       e->pid = ecore_x_window_prop_pid_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_DESKTOP)
-     {
-       Ecore_X_Event_Window_Prop_Desktop_Change *e;
+   xcb_property_notify_event_t *ev;
+   Ecore_X_Event_Window_Property *e;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Desktop_Change));
-       if (!e) return;
-       e->desktop = ecore_x_window_prop_desktop_get(xevent->xproperty.window);
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
-     }
-   else
-#endif
-   {
-      xcb_property_notify_event_t     *ev;
-      Ecore_X_Event_Window_Property *e;
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_property_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Property)))) return;
+
+   e->win = ev->window;
+   e->atom = ev->atom;
+   e->time = ev->time;
+   _ecore_xcb_event_last_time = e->time;
 
-      ev = (xcb_property_notify_event_t *)event;
-      e = calloc(1,sizeof(Ecore_X_Event_Window_Property));
-      if (!e) return;
-      e->win = ev->window;
-      e->atom = ev->atom;
-      e->time = ev->time;
-      _ecore_xcb_event_last_time = e->time;
-      ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
-   }
+   ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_selection_clear(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_selection_clear(xcb_generic_event_t *event)
 {
-   xcb_selection_clear_event_t     *ev;
-   Ecore_X_Selection_Intern      *d;
+   xcb_selection_clear_event_t *ev;
    Ecore_X_Event_Selection_Clear *e;
-   Ecore_X_Atom                   sel;
+   Ecore_X_Atom sel;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_selection_clear_event_t *)event;
-   if (!(d = _ecore_x_selection_get(ev->selection)))
-     return;
-   if (ev->time > d->time)
-     {
-       _ecore_x_selection_set(XCB_NONE, NULL, 0,
-                               ev->selection);
-     }
+   if (!(e = malloc(sizeof(Ecore_X_Event_Selection_Clear)))) return;
 
-   /* Generate event for app cleanup */
-   e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
    e->win = ev->owner;
-   e->time = ev->time;
-   sel = ev->selection;
+   e->atom = sel = ev->selection;
    if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
      e->selection = ECORE_X_SELECTION_PRIMARY;
    else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
      e->selection = ECORE_X_SELECTION_SECONDARY;
-   else
+   else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
      e->selection = ECORE_X_SELECTION_CLIPBOARD;
-   ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
+   else
+     e->selection = ECORE_X_SELECTION_OTHER;
+   e->time = ev->time;
 
+   ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_selection_request(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_selection_request(xcb_generic_event_t *event)
 {
    xcb_selection_request_event_t *ev;
-   Ecore_X_Selection_Intern    *sd;
-   xcb_selection_notify_event_t   sn_event;
-   void                          *data;
+   Ecore_X_Event_Selection_Request *e;
+   Ecore_X_Selection_Intern *sd;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_selection_request_event_t *)event;
-   /* FIXME: is it the correct value ? */
-   sn_event.response_type = XCB_SELECTION_NOTIFY;
-   sn_event.pad0 = 0;
-   /* FIXME: is it the correct value ? */
-   sn_event.sequence = 0;
-   sn_event.time = XCB_CURRENT_TIME;
-   sn_event.requestor = ev->requestor;
-   sn_event.selection = ev->selection;
-   sn_event.target = ev->target;
-
-   if ((sd = _ecore_x_selection_get(ev->selection)) &&
+   if (!(e = malloc(sizeof(Ecore_X_Event_Selection_Request)))) return;
+
+   e->owner = ev->owner;
+   e->requestor = ev->requestor;
+   e->selection = ev->selection;
+   e->target = ev->target;
+   e->property = ev->property;
+   e->time = ev->time;
+
+   ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
+
+   if ((sd = _ecore_xcb_selection_get(ev->selection)) &&
        (sd->win == ev->owner))
      {
-       if (!ecore_x_selection_convert(ev->selection, ev->target,
-                                       &data))
-         {
-            /* Refuse selection, conversion to requested target failed */
-            sn_event.property = XCB_NONE;
-         }
-       else
-         {
-            /* FIXME: This does not properly handle large data transfers */
-            ecore_x_window_prop_property_set(ev->requestor,
-                                              ev->property,
-                                              ev->target,
-                                              8, data, sd->length);
-            sn_event.property = ev->property;
-            free(data);
-         }
-     }
-   else
-     {
-       sn_event.property = XCB_NONE;
-       return;
+        Ecore_X_Selection_Intern *si;
+
+        si = _ecore_xcb_selection_get(ev->selection);
+        if (si->data)
+          {
+             Ecore_X_Atom property = XCB_NONE, type;
+             void *data = NULL;
+             int len = 0, typesize = 0;
+
+             type = ev->target;
+             typesize = 8;
+             len = sd->length;
+
+             if (!ecore_x_selection_convert(ev->selection, ev->target,
+                                            &data, &len, &type, &typesize))
+               property = XCB_NONE;
+             else if (data)
+               {
+                  ecore_x_window_prop_property_set(ev->requestor, ev->property,
+                                                   type, typesize, data, len);
+                  property = ev->property;
+                  free(data);
+               }
+             ecore_x_selection_notify_send(ev->requestor, ev->selection,
+                                           ev->target, property, ev->time);
+          }
      }
-
-   /* FIXME: I use _ecore_xcb_conn, as ev has no information on the connection */
-   xcb_send_event(_ecore_xcb_conn, 0,
-                  ev->requestor, 0, (const char *)&sn_event);
 }
 
-/* FIXME: round trip */
-void
-_ecore_x_event_handle_selection_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_selection_notify(xcb_generic_event_t *event)
 {
-   xcb_selection_notify_event_t   *ev;
+   xcb_selection_notify_event_t *ev;
    Ecore_X_Event_Selection_Notify *e;
-   unsigned char                 *data = NULL;
-   Ecore_X_Atom                   selection;
-   int                            num_ret;
-   uint8_t                        format;
+   unsigned char *data = NULL;
+   Ecore_X_Atom selection;
+   int num = 0, format = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_selection_notify_event_t *)event;
    selection = ev->selection;
-
    if (ev->target == ECORE_X_ATOM_SELECTION_TARGETS)
      {
-        ecore_x_window_prop_property_get_prefetch(ev->requestor,
-                                                  ev->property,
-                                                  ECORE_X_ATOM_ATOM);
-        ecore_x_window_prop_property_get_fetch();
-        format = ecore_x_window_prop_property_get(ev->requestor,
-                                                  ev->property,
-                                                  ECORE_X_ATOM_ATOM,
-                                                  32,
-                                                  &data,
-                                                  &num_ret);
-       if (!format) return;
+        format =
+          ecore_x_window_prop_property_get(ev->requestor, ev->property,
+                                           XCB_ATOM_ATOM, 32, &data, &num);
+        if (!format)
+          {
+             /* fallback if targets handling is not working and try get the
+              * selection directly */
+             xcb_convert_selection(_ecore_xcb_conn, ev->requestor,
+                                   selection, selection,
+                                   ECORE_X_ATOM_UTF8_STRING, XCB_CURRENT_TIME);
+             return;
+          }
      }
    else
      {
-        ecore_x_window_prop_property_get_prefetch(ev->requestor,
-                                                  ev->property,
-                                                  XCB_GET_PROPERTY_TYPE_ANY);
-        ecore_x_window_prop_property_get_fetch();
-        format = ecore_x_window_prop_property_get(ev->requestor,
-                                                  ev->property,
-                                                  ECORE_X_ATOM_ATOM,
-                                                  8,
-                                                  &data,
-                                                  &num_ret);
-       if (!format) return;
+        format =
+          ecore_x_window_prop_property_get(ev->requestor, ev->property,
+                                           XCB_GET_PROPERTY_TYPE_ANY, 8,
+                                           &data, &num);
+        if (!format) return;
      }
 
    e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
    if (!e) return;
    e->win = ev->requestor;
    e->time = ev->time;
-   e->target = _ecore_x_selection_target_get(ev->target);
+   e->atom = selection;
+   e->target = _ecore_xcb_selection_target_get(ev->target);
 
    if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
      e->selection = ECORE_X_SELECTION_PRIMARY;
@@ -1422,662 +1380,1449 @@ _ecore_x_event_handle_selection_notify(xcb_generic_event_t *event)
    else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
      e->selection = ECORE_X_SELECTION_CLIPBOARD;
    else
-     {
-       free(e);
-       return;
-     }
-   e->data = _ecore_x_selection_parse(e->target, data, num_ret, format);
+     e->selection = ECORE_X_SELECTION_OTHER;
+
+   e->data = _ecore_xcb_selection_parse(e->target, data, num, format);
 
-   ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e, _ecore_x_event_free_selection_notify, NULL);
+   ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
+                   _ecore_xcb_event_selection_notify_free, NULL);
 }
 
-void
-_ecore_x_event_handle_colormap_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_colormap_notify(xcb_generic_event_t *event)
 {
-   xcb_colormap_notify_event_t     *ev;
+   xcb_colormap_notify_event_t *ev;
    Ecore_X_Event_Window_Colormap *e;
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
    ev = (xcb_colormap_notify_event_t *)event;
-   e = calloc(1,sizeof(Ecore_X_Event_Window_Colormap));
-   if (!e) return;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Colormap)))) return;
+
    e->win = ev->window;
    e->cmap = ev->colormap;
    if (ev->state == XCB_COLORMAP_STATE_INSTALLED)
-      e->installed = 1;
+     e->installed = 1;
    else
-      e->installed = 0;
+     e->installed = 0;
    e->time = _ecore_xcb_event_last_time;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_client_message(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_client_message(xcb_generic_event_t *event)
 {
+   xcb_client_message_event_t *ev;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_client_message_event_t *)event;
+
    /* Special client message event handling here. need to put LOTS of if */
    /* checks here and generate synthetic events per special message known */
    /* otherwise generate generic client message event. this would handle*/
    /* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
 
-   xcb_client_message_event_t *ev;
-
-   ev = (xcb_client_message_event_t *)event;
-   if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS) &&
-       (ev->format == 32) &&
-       (ev->data.data32[0] == (uint32_t)ECORE_X_ATOM_WM_DELETE_WINDOW))
+   if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS) && (ev->format == 32) &&
+       (ev->data.data32[0] == ECORE_X_ATOM_WM_DELETE_WINDOW))
      {
-       Ecore_X_Event_Window_Delete_Request *e;
+        Ecore_X_Event_Window_Delete_Request *e;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
-       if (!e) return;
-       e->win = ev->window;
-       e->time = _ecore_xcb_event_last_time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request))))
+          return;
+        e->win = ev->window;
+        e->time = _ecore_xcb_event_last_time;
+        ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
      }
-
    else if ((ev->type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
-           (ev->format == 32) &&
-           /* Ignore move and resize with keyboard */
-           (ev->data.data32[2] < 9))
+            (ev->format == 32) && (ev->data.data32[2] < 9))
      {
-       Ecore_X_Event_Window_Move_Resize_Request *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
-       if (!e) return;
-       e->win = ev->window;
-       e->x = ev->data.data32[0];
-       e->y = ev->data.data32[1];
-       e->direction = ev->data.data32[2];
-       e->button = ev->data.data32[3];
-       e->source = ev->data.data32[4];
-       ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
+        Ecore_X_Event_Window_Move_Resize_Request *e;
+
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request))))
+          return;
+        e->win = ev->window;
+        e->x = ev->data.data32[0];
+        e->y = ev->data.data32[1];
+        e->direction = ev->data.data32[2];
+        e->button = ev->data.data32[3];
+        e->source = ev->data.data32[4];
+        ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
      }
-
-   /* Xdnd Client Message Handling Begin */
-   /* Message Type: XdndEnter target */
    else if (ev->type == ECORE_X_ATOM_XDND_ENTER)
      {
-       Ecore_X_Event_Xdnd_Enter *e;
-       Ecore_X_DND_Target       *target;
-       uint32_t                  three;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
-       if (!e) return;
-
-       target = _ecore_x_dnd_target_get();
-       target->state = ECORE_X_DND_TARGET_ENTERED;
-
-       target = _ecore_x_dnd_target_get();
-       target->source = ev->data.data32[0];
-       target->win = ev->window;
-       target->version = ev->data.data32[1] >> 24;
-       if (target->version > ECORE_X_DND_VERSION)
-         {
-             printf("DND: Requested version %d, we only support up to %d\n", target->version,
-                    ECORE_X_DND_VERSION);
-            return;
-         }
-
-        /* FIXME: roud trip, but I don't know how to suppress it */
-       if ((three = ev->data.data32[1] & 0x1UL))
-         {
-            /* source supports more than 3 types, fetch property */
-            unsigned char *data;
-            Ecore_X_Atom  *types;
-            int            num_ret;
-            int            i;
-             uint8_t        format;
-
-             ecore_x_window_prop_property_get_prefetch(target->source,
-                                                       ECORE_X_ATOM_XDND_TYPE_LIST,
-                                                       ECORE_X_ATOM_ATOM);
-             ecore_x_window_prop_property_get_fetch();
-             format = ecore_x_window_prop_property_get(target->source,
-                                                       ECORE_X_ATOM_XDND_TYPE_LIST,
-                                                       ECORE_X_ATOM_ATOM,
-                                                       32,
-                                                       &data,
-                                                       &num_ret);
-             if (!format)
-              {
-                 printf("DND: Could not fetch data type list from source window, aborting.\n");
-                 return;
-              }
-            types = (Ecore_X_Atom *)data;
-            e->types = calloc(num_ret, sizeof(char *));
-            if (e->types)
-              {
-                  xcb_get_atom_name_cookie_t *cookies;
-
-                  cookies = (xcb_get_atom_name_cookie_t *)malloc(sizeof(xcb_get_atom_name_cookie_t) * num_ret);
+        Ecore_X_Event_Xdnd_Enter *e;
+        Ecore_X_DND_Target *target;
+
+        DBG("Got Xdnd Enter Event");
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter)))) return;
+        target = _ecore_xcb_dnd_target_get();
+        target->state = ECORE_X_DND_TARGET_ENTERED;
+        target->source = ev->data.data32[0];
+        target->win = ev->window;
+        target->version = (int)(ev->data.data32[1] >> 24);
+        if (target->version > ECORE_X_DND_VERSION)
+          {
+             WRN("DND: Requested version %d but we only support up to %d",
+                 target->version, ECORE_X_DND_VERSION);
+             free(e);
+             return;
+          }
+        if (ev->data.data32[1] & 0x1UL)
+          {
+             unsigned char *data;
+             Ecore_X_Atom *types;
+             int num_ret = 0;
+
+             if (!ecore_x_window_prop_property_get(target->source,
+                                                   ECORE_X_ATOM_XDND_TYPE_LIST,
+                                                   ECORE_X_ATOM_ATOM, 32,
+                                                   &data, &num_ret))
+               {
+                  WRN("DND: Could not fetch data type list from source window");
+                  free(e);
+                  return;
+               }
+             types = (Ecore_X_Atom *)data;
+             e->types = calloc(num_ret, sizeof(char *));
+             if (e->types)
+               {
+                  int i = 0;
+
                   for (i = 0; i < num_ret; i++)
-                    cookies[i] = xcb_get_atom_name_unchecked(_ecore_xcb_conn, types[i]);
-                 for (i = 0; i < num_ret; i++)
-                    {
-                       xcb_get_atom_name_reply_t *reply;
-                       char                      *name;
-
-                       reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookies[i], NULL);
-                       if (reply)
-                         {
-                            name = (char *)malloc(sizeof (char) * (reply->name_len + 1));
-                            memcpy(name,
-                                   xcb_get_atom_name_name(reply),
-                                   reply->name_len);
-                            name[reply->name_len] = '\0';
-                            e->types[i] = name;
-                            free(reply);
-                         }
-                    }
-                  free(cookies);
-              }
-            e->num_types = num_ret;
-         }
-       else
-         {
-            int i = 0;
-
-            e->types = calloc(3, sizeof(char *));
-            if (e->types)
-              {
-                  xcb_get_atom_name_cookie_t cookies[3];
-
-                  for (i = 0; i < 3; i++)
-                    cookies[i] = xcb_get_atom_name_unchecked(_ecore_xcb_conn, ev->data.data32[i + 2]);
-                  for (i = 0; i < 3; i++)
+                    e->types[i] = ecore_x_atom_name_get(types[i]);
+               }
+             e->num_types = num_ret;
+          }
+        else
+          {
+             int i = 0;
+
+             e->types = calloc(3, sizeof(char *));
+             if (e->types)
+               {
+                  while ((i < 3) && (ev->data.data32[i + 2]))
                     {
-                       xcb_get_atom_name_reply_t *reply;
-                       char                      *name;
-
-                       reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookies[i], NULL);
-                       if (reply && (ev->data.data32[i + 2]))
-                         {
-                            name = (char *)malloc(sizeof (char) * (reply->name_len + 1));
-                            memcpy(name,
-                                   xcb_get_atom_name_name(reply),
-                                   reply->name_len);
-                            name[reply->name_len] = '\0';
-                            e->types[i] = name;
-                         }
-                       if (reply) free(reply);
+                       e->types[i] =
+                         ecore_x_atom_name_get(ev->data.data32[i + 2]);
+                       i++;
                     }
-              }
-            e->num_types = i;
-         }
+               }
+             e->num_types = i;
+          }
 
-       e->win = target->win;
-       e->source = target->source;
-       ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e, _ecore_x_event_free_xdnd_enter, NULL);
+        e->win = target->win;
+        e->source = target->source;
+        ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
+                        _ecore_xcb_event_xdnd_enter_free, NULL);
      }
-
-   /* Message Type: XdndPosition target */
    else if (ev->type == ECORE_X_ATOM_XDND_POSITION)
      {
-       Ecore_X_Event_Xdnd_Position *e;
-       Ecore_X_DND_Target          *target;
-
-       target = _ecore_x_dnd_target_get();
-       if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
-           (target->win != ev->window))
-         return;
-
-       target->pos.x = (int16_t)ev->data.data32[2] >> 16;
-       target->pos.y = (int16_t)ev->data.data32[2] & 0xFFFFUL;
-       target->action = ev->data.data32[4]; /* Version 2 */
-
-       target->time = (target->version >= 1) ?
-          ev->data.data32[3] : XCB_CURRENT_TIME;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
-       if (!e) return;
-       e->win = target->win;
-       e->source = target->source;
-       e->position.x = target->pos.x;
-       e->position.y = target->pos.y;
-       e->action = target->action;
-       ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
+        Ecore_X_Event_Xdnd_Position *e;
+        Ecore_X_DND_Target *target;
+
+        DBG("Got Xdnd Position Event");
+        target = _ecore_xcb_dnd_target_get();
+        if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
+            (target->win != ev->window)) return;
+        target->pos.x = ev->data.data32[2] >> 16;
+        target->pos.y = ev->data.data32[2] & 0xFFFFUL;
+        target->action = ev->data.data32[4];
+        target->time = (target->version >= 1) ?
+          (Ecore_X_Time)ev->data.data32[3] : XCB_CURRENT_TIME;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
+        if (!e) return;
+        e->win = target->win;
+        e->source = target->source;
+        e->position.x = target->pos.x;
+        e->position.y = target->pos.y;
+        e->action = target->action;
+        ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
      }
-
-   /* Message Type: XdndStatus source */
    else if (ev->type == ECORE_X_ATOM_XDND_STATUS)
      {
-       Ecore_X_Event_Xdnd_Status *e;
-       Ecore_X_DND_Source        *source;
-
-       source = _ecore_x_dnd_source_get();
-       /* Make sure source/target match */
-       if ((source->win != ev->window ) ||
-           (source->dest != ev->data.data32[0]))
-         return;
-
-       source->await_status = 0;
-
-       source->will_accept = ev->data.data32[1] & 0x1UL;
-       source->suppress = (ev->data.data32[1] & 0x2UL) ? 0 : 1;
-
-       source->rectangle.x = (int16_t)ev->data.data32[2] >> 16;
-       source->rectangle.y = (int16_t)ev->data.data32[2] & 0xFFFFUL;
-       source->rectangle.width = (uint16_t)ev->data.data32[3] >> 16;
-       source->rectangle.height = (uint16_t)ev->data.data32[3] & 0xFFFFUL;
-
-       source->accepted_action = ev->data.data32[4];
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
-       if (!e) return;
-       e->win = source->win;
-       e->target = source->dest;
-       e->will_accept = source->will_accept;
-       e->rectangle.x = source->rectangle.x;
-       e->rectangle.y = source->rectangle.y;
-       e->rectangle.width = source->rectangle.width;
-       e->rectangle.height = source->rectangle.height;
-       e->action = source->accepted_action;
-
-       ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
+        Ecore_X_Event_Xdnd_Status *e;
+        Ecore_X_DND_Source *source;
+
+        DBG("Got Xdnd Status Event");
+        source = _ecore_xcb_dnd_source_get();
+        if ((source->win != ev->window) ||
+            (source->dest != (Ecore_X_Window)ev->data.data32[0]))
+          return;
+
+        source->await_status = 0;
+        source->will_accept = ev->data.data32[1] & 0x1UL;
+        source->suppress = (ev->data.data32[1] & 0x2UL) ? 0 : 1;
+        source->rectangle.x = ev->data.data32[2] >> 16;
+        source->rectangle.y = ev->data.data32[2] & 0xFFFFUL;
+        source->rectangle.width = ev->data.data32[3] >> 16;
+        source->rectangle.height = ev->data.data32[3] & 0xFFFFUL;
+        source->accepted_action = ev->data.data32[4];
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
+        if (!e) return;
+        e->win = source->win;
+        e->target = source->dest;
+        e->will_accept = source->will_accept;
+        e->rectangle.x = source->rectangle.x;
+        e->rectangle.y = source->rectangle.y;
+        e->rectangle.width = source->rectangle.width;
+        e->rectangle.height = source->rectangle.height;
+        e->action = source->accepted_action;
+
+        ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
      }
-
-   /* Message Type: XdndLeave target */
-   /* Pretend the whole thing never happened, sort of */
    else if (ev->type == ECORE_X_ATOM_XDND_LEAVE)
      {
-       Ecore_X_Event_Xdnd_Leave *e;
-       Ecore_X_DND_Target       *target;
-
-       target = _ecore_x_dnd_target_get();
-       if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
-           (target->win != ev->window))
-         return;
-
-       target->state = ECORE_X_DND_TARGET_IDLE;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
-       if (!e) return;
-       e->win = ev->window;
-       e->source = ev->data.data32[0];
-       ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
+        Ecore_X_Event_Xdnd_Leave *e;
+        Ecore_X_DND_Target *target;
+
+        DBG("Got Xdnd Leave Event");
+        target = _ecore_xcb_dnd_target_get();
+        if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
+            (target->win != ev->window))
+          return;
+        target->state = ECORE_X_DND_TARGET_IDLE;
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
+        if (!e) return;
+        e->win = ev->window;
+        e->source = (Ecore_X_Window)ev->data.data32[0];
+        ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
      }
-
-   /* Message Type: XdndDrop target */
    else if (ev->type == ECORE_X_ATOM_XDND_DROP)
      {
-       Ecore_X_Event_Xdnd_Drop *e;
-       Ecore_X_DND_Target      *target;
-
-       target = _ecore_x_dnd_target_get();
-       /* Match source/target */
-       if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
-           (target->win != ev->window))
-         return;
-
-       target->time = (target->version >= 1) ?
-          ev->data.data32[2] : _ecore_xcb_event_last_time;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
-       if (!e) return;
-       e->win = target->win;
-       e->source = target->source;
-       e->action = target->action;
-       e->position.x = target->pos.x;
-       e->position.y = target->pos.y;
-       ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
+        Ecore_X_Event_Xdnd_Drop *e;
+        Ecore_X_DND_Target *target;
+
+        DBG("Got Xdnd Drop Event");
+        target = _ecore_xcb_dnd_target_get();
+        if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
+            (target->win != ev->window))
+          return;
+        target->time = (target->version >= 1) ?
+          (Ecore_X_Time)ev->data.data32[2] : _ecore_xcb_event_last_time;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
+        if (!e) return;
+        e->win = target->win;
+        e->source = target->source;
+        e->action = target->action;
+        e->position.x = target->pos.x;
+        e->position.y = target->pos.y;
+        ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
      }
-
-   /* Message Type: XdndFinished source */
    else if (ev->type == ECORE_X_ATOM_XDND_FINISHED)
      {
-       Ecore_X_Event_Xdnd_Finished *e;
-       Ecore_X_DND_Source          *source;
-       uint8_t                        completed = 1;
-
-       source = _ecore_x_dnd_source_get();
-       /* Match source/target */
-       if ((source->win != ev->window) ||
-           (source->dest != ev->data.data32[0]))
-         return;
-
-       if ((source->version >= 5) && (ev->data.data32[1] & 0x1UL))
-         {
-            /* Target successfully performed drop action */
-            ecore_x_selection_xdnd_clear();
-            source->state = ECORE_X_DND_SOURCE_IDLE;
-         }
-       else
-         {
-              completed = 0;
-              source->state = ECORE_X_DND_SOURCE_CONVERTING;
-
-              /* FIXME: Probably need to add a timer to switch back to idle
-               * and discard the selection data */
-         }
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
-       if (!e) return;
-       e->win = source->win;
-       e->target = source->dest;
-       e->completed = completed;
-       if (source->version >= 5)
-         {
-            source->accepted_action = ev->data.data32[2];
-            e->action = source->accepted_action;
-         }
-       else
-         {
-            source->accepted_action = 0;
-            e->action = source->action;
-         }
-
-       ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
+        Ecore_X_Event_Xdnd_Finished *e;
+        Ecore_X_DND_Source *source;
+        Eina_Bool completed = EINA_TRUE;
+
+        DBG("Got Xdnd Finished Event");
+        source = _ecore_xcb_dnd_source_get();
+        if ((source->win != ev->window) ||
+            (source->dest != (Ecore_X_Window)ev->data.data32[0]))
+          return;
+        if ((source->version < 5) || (ev->data.data32[1] & 0x1UL))
+          {
+             ecore_x_selection_xdnd_clear();
+             source->state = ECORE_X_DND_SOURCE_IDLE;
+          }
+        else if (source->version >= 5)
+          {
+             completed = EINA_FALSE;
+             source->state = ECORE_X_DND_SOURCE_CONVERTING;
+             /* FIXME: Probably need to add a timer to switch back to idle
+              * and discard the selection data */
+          }
+
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished))))
+          return;
+        e->win = source->win;
+        e->target = source->dest;
+        e->completed = completed;
+        if (source->version >= 5)
+          {
+             source->accepted_action = ev->data.data32[2];
+             e->action = source->accepted_action;
+          }
+        else
+          {
+             source->accepted_action = 0;
+             e->action = source->action;
+          }
+        ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
      }
    else if (ev->type == ECORE_X_ATOM_NET_WM_STATE)
      {
-       Ecore_X_Event_Window_State_Request *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
-       if (!e) return;
-       e->win = ev->window;
-       if (ev->data.data32[0] == 0)
-         e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
-       else if (ev->data.data32[0] == 1)
-         e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
-       else if (ev->data.data32[0] == 2)
-         e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
-       else
-         {
-            free(e);
-            return;
-         }
-       e->state[0] = _ecore_x_netwm_state_get(ev->data.data32[1]);
-       if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
-         {
-             xcb_get_atom_name_reply_t *reply;
-            char                      *name;
-
-             /* FIXME: round trip */
-             reply = xcb_get_atom_name_reply(_ecore_xcb_conn,
-                                             xcb_get_atom_name_unchecked(_ecore_xcb_conn, ev->data.data32[1]),
-                                             NULL);
-            if (reply)
-               {
-                 name = (char *)malloc(sizeof (char) * (reply->name_len + 1));
-                 memcpy(name,
-                        xcb_get_atom_name_name(reply),
-                        reply->name_len);
-                 name[reply->name_len] = '\0';
-                 printf("Unknown state: %s\n", name);
-                 free(name);
-                 free(reply);
-               }
-         }
-       e->state[1] = _ecore_x_netwm_state_get(ev->data.data32[2]);
-       if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
-         {
-             xcb_get_atom_name_reply_t *reply;
-            char                      *name;
-
-             reply = xcb_get_atom_name_reply(_ecore_xcb_conn,
-                                             xcb_get_atom_name_unchecked(_ecore_xcb_conn, ev->data.data32[2]),
-                                             NULL);
-            if (reply)
-               {
-                 name = (char *)malloc(sizeof (char) * (reply->name_len + 1));
-                 memcpy(name,
-                        xcb_get_atom_name_name(reply),
-                        reply->name_len);
-                 name[reply->name_len] = '\0';
-                 printf("Unknown state: %s\n", name);
-                 free(name);
-               }
-         }
-       e->source = ev->data.data32[3];
-
-       ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
+        Ecore_X_Event_Window_State_Request *e;
+
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request))))
+          return;
+        e->win = ev->window;
+        if (ev->data.data32[0] == 0)
+          e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
+        else if (ev->data.data32[0] == 1)
+          e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
+        else if (ev->data.data32[0] == 2)
+          e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
+        else
+          {
+             free(e);
+             return;
+          }
+        e->state[0] = _ecore_xcb_netwm_window_state_get(ev->data.data32[1]);
+        if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
+          {
+             /* FIXME */
+          }
+        e->state[1] = _ecore_xcb_netwm_window_state_get(ev->data.data32[2]);
+        if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
+          {
+             /* FIXME */
+          }
+        e->source = ev->data.data32[3];
+        ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
      }
-   else if ((ev->type == ECORE_X_ATOM_WM_CHANGE_STATE)
-           && (ev->format == 32)
-           && (ev->data.data32[0] == XCB_WM_ICONIC_STATE))
+#ifdef OLD_XCB_VERSION
+   else if ((ev->type == ECORE_X_ATOM_WM_CHANGE_STATE) &&
+            (ev->format == 32) && (ev->data.data32[0] == XCB_WM_STATE_ICONIC))
+#else
+   else if ((ev->type == ECORE_X_ATOM_WM_CHANGE_STATE) && (ev->format == 32) &&
+            (ev->data.data32[0] == XCB_ICCCM_WM_STATE_ICONIC))
+#endif
      {
-       Ecore_X_Event_Window_State_Request *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
-       if (!e) return;
-       e->win = ev->window;
-       e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
-       e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
-
-       ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
+        Ecore_X_Event_Window_State_Request *e;
+
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request))))
+          return;
+        e->win = ev->window;
+        e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
+        e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
+        ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
      }
-   else if ((ev->type == ECORE_X_ATOM_NET_WM_DESKTOP)
-           && (ev->format == 32))
+   else if ((ev->type == ECORE_X_ATOM_NET_WM_DESKTOP) && (ev->format == 32))
      {
-       Ecore_X_Event_Desktop_Change *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
-       if (!e) return;
-       e->win = ev->window;
-       e->desk = ev->data.data32[0];
-       e->source = ev->data.data32[1];
-
-       ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
+        Ecore_X_Event_Desktop_Change *e;
+
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change))))
+          return;
+        e->win = ev->window;
+        e->desk = ev->data.data32[0];
+        e->source = ev->data.data32[1];
+        ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
      }
-   else if ((ev->type == ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
+   else if (ev->type == ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS)
      {
-       Ecore_X_Event_Frame_Extents_Request *e;
+        Ecore_X_Event_Frame_Extents_Request *e;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
-       if (!e) return;
-       e->win = ev->window;
-
-       ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request))))
+          return;
+        e->win = ev->window;
+        ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
      }
-   else if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS)
-           && ((Ecore_X_Atom)ev->data.data32[0] == ECORE_X_ATOM_NET_WM_PING)
-           && (ev->format == 32))
+   else if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS) &&
+            ((Ecore_X_Atom)ev->data.data32[0] == ECORE_X_ATOM_NET_WM_PING) &&
+            (ev->format == 32))
      {
-       Ecore_X_Event_Ping *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Ping));
-       if (!e) return;
-       e->win = ev->window;
-       e->time = ev->data.data32[1];
-       e->event_win = ev->data.data32[2];
-
-       ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
+        Ecore_X_Event_Ping *e;
+        Ecore_X_Window root = 0;
+        int count = 0;
+
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Ping)))) return;
+        e->win = ev->window;
+        e->time = ev->data.data32[1];
+        e->event_win = ev->data.data32[2];
+        ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
+
+        CHECK_XCB_CONN;
+
+        count = xcb_setup_roots_length(xcb_get_setup(_ecore_xcb_conn));
+        if (count > 1)
+          root = ecore_x_window_root_get(e->win);
+        else
+          root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+        if (ev->window != root)
+          {
+             ev->window = root;
+             xcb_send_event(_ecore_xcb_conn, 0, root,
+                            (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                             XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY),
+                            (const char *)&ev);
+//             ecore_x_flush();
+          }
      }
    else if ((ev->type == ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
-           (ev->format == 8))
+            (ev->format == 8))
      {
-       _ecore_x_netwm_startup_info_begin(ev->window, (char *)ev->data.data8);
+        _ecore_xcb_netwm_startup_info_begin(ev->window, ev->data.data8[0]);
      }
-   else if ((ev->type == ECORE_X_ATOM_NET_STARTUP_INFO) &&
-           (ev->format == 8))
+   else if ((ev->type == ECORE_X_ATOM_NET_STARTUP_INFO) && (ev->format == 8))
      {
-       _ecore_x_netwm_startup_info(ev->window, (char *)ev->data.data8);
+        _ecore_xcb_netwm_startup_info(ev->window, ev->data.data8[0]);
      }
-   else if ((ev->type == 27777)
-           && (ev->data.data32[0] == 0x7162534)
-           && (ev->format == 32)
-           && (ev->window == _ecore_xcb_private_window))
+   else if ((ev->type == 27777) && (ev->data.data32[0] == 0x7162534) &&
+            (ev->format == 32)) // && (ev->window = _private_window))
      {
-       /* a grab sync marker */
-       if (ev->data.data32[1] == 0x10000001)
-         _ecore_x_window_grab_remove(ev->data.data32[2]);
-       else if (ev->data.data32[1] == 0x10000002)
-         _ecore_x_key_grab_remove(ev->data.data32[2]);
+        if (ev->data.data32[1] == 0x10000001)
+          _ecore_xcb_window_button_grab_remove(ev->data.data32[2]);
+        else if (ev->data.data32[1] == 0x10000002)
+          _ecore_xcb_window_key_grab_remove(ev->data.data32[2]);
      }
    else
      {
-       Ecore_X_Event_Client_Message *e;
-       int i;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
-       if (!e) return;
-       e->win = ev->window;
-       e->message_type = ev->type;
-       e->format = ev->format;
-       for (i = 0; i < 5; i++)
-         e->data.l[i] = ev->data.data32[i];
-
-       ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
+        Ecore_X_Event_Client_Message *e;
+        int i = 0;
+
+        if (!(e = calloc(1, sizeof(Ecore_X_Event_Client_Message))))
+          return;
+
+        e->win = ev->window;
+        e->message_type = ev->type;
+        e->format = ev->format;
+        for (i = 0; i < 5; i++)
+          e->data.l[i] = ev->data.data32[i];
+        ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
      }
 }
 
-void
-_ecore_x_event_handle_mapping_notify(xcb_generic_event_t *event __UNUSED__)
+static void
+_ecore_xcb_event_handle_mapping_notify(xcb_generic_event_t *event)
 {
-   /* FIXME: handle this event type */
-}
+   xcb_mapping_notify_event_t *ev;
+   Ecore_X_Event_Mapping_Change *e;
 
-void
-_ecore_x_event_handle_shape_change(xcb_generic_event_t *event)
-{
-#ifdef ECORE_X_SHAPE
-   xcb_shape_notify_event_t     *ev;
-   Ecore_X_Event_Window_Shape *e;
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
 
-   ev = (xcb_shape_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
-   if (!e) return;
-   e->win = ev->affected_window;
-   e->time = ev->server_time;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
-#else
-   event = NULL;
-#endif /* ECORE_X_SHAPE */
-}
+   ev = (xcb_mapping_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Mapping_Change)))) return;
 
-void
-_ecore_x_event_handle_screensaver_notify(xcb_generic_event_t *event)
-{
-#ifdef ECORE_X_SCREENSAVER
-   xcb_screensaver_notify_event_t     *ev;
-   Ecore_X_Event_Screensaver_Notify *e;
+   _ecore_xcb_keymap_refresh(ev);
+   _ecore_xcb_modifiers_get();
 
-   ev = (xcb_screensaver_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
-   if (!e) return;
-   e->win = ev->window;
-   if (ev->state == XCB_SCREENSAVER_STATE_ON)
-     e->on = 1;
-   else
-     e->on = 0;
-   e->time = ev->time;
-   ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
-#else
-   event = NULL;
-#endif /* ECORE_X_SCREENSAVER */
+   switch (ev->request)
+     {
+      case XCB_MAPPING_MODIFIER:
+        e->type = ECORE_X_MAPPING_MODIFIER;
+        break;
+
+      case XCB_MAPPING_KEYBOARD:
+        e->type = ECORE_X_MAPPING_KEYBOARD;
+        break;
+
+      case XCB_MAPPING_POINTER:
+      default:
+        e->type = ECORE_X_MAPPING_MOUSE;
+        break;
+     }
+   e->keycode = ev->first_keycode;
+   e->num = ev->count;
+
+   ecore_event_add(ECORE_X_EVENT_MAPPING_CHANGE, e, NULL, NULL);
 }
 
-void
-_ecore_x_event_handle_sync_counter(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_damage_notify(xcb_generic_event_t *event)
 {
-#ifdef ECORE_X_SYNC
-   xcb_sync_counter_notify_event_t *ev;
-   Ecore_X_Event_Sync_Counter    *e;
+#ifdef ECORE_XCB_DAMAGE
+   xcb_damage_notify_event_t *ev;
+   Ecore_X_Event_Damage *e;
+#endif
 
-   ev = (xcb_sync_counter_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
-   if (!e) return;
-   e->time = ev->timestamp;
-   ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
-#else
-   event = NULL;
-#endif /* ECORE_X_SYNC */
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-void
-_ecore_x_event_handle_sync_alarm(xcb_generic_event_t *event)
-{
-#ifdef ECORE_X_SYNC
-   xcb_sync_alarm_notify_event_t *ev;
-   Ecore_X_Event_Sync_Alarm    *e;
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+#ifdef ECORE_XCB_DAMAGE
+   ev = (xcb_damage_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Damage)))) return;
 
-   ev = (xcb_sync_alarm_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
-   if (!e) return;
+   e->level = ev->level;
+   e->drawable = ev->drawable;
+   e->damage = ev->damage;
    e->time = ev->timestamp;
-   e->alarm = ev->alarm;
-   ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
-#else
-   event = NULL;
-#endif /* ECORE_X_SYNC */
+   e->area.x = ev->area.x;
+   e->area.y = ev->area.y;
+   e->area.width = ev->area.width;
+   e->area.height = ev->area.height;
+   e->geometry.x = ev->geometry.x;
+   e->geometry.y = ev->geometry.y;
+   e->geometry.width = ev->geometry.width;
+   e->geometry.height = ev->geometry.height;
+
+   ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
+#endif
 }
 
-/* FIXME: round trip */
-void
-_ecore_x_event_handle_randr_change(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_randr_change(xcb_generic_event_t *event)
 {
-#ifdef ECORE_X_RANDR
+#ifdef ECORE_XCB_RANDR
    xcb_randr_screen_change_notify_event_t *ev;
-   Ecore_X_Event_Screen_Change            *e;
+   Ecore_X_Event_Screen_Change *e;
+#endif
 
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+#ifdef ECORE_XCB_RANDR
    ev = (xcb_randr_screen_change_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Screen_Change)))) return;
 
-   if ((ev->response_type & ~0x80) != XCB_CONFIGURE_NOTIFY)
-     {
-       xcb_query_extension_reply_t *rep;
-
-       rep = xcb_query_extension_reply(_ecore_xcb_conn,
-                                       xcb_query_extension_unchecked(_ecore_xcb_conn,
-                                                                     strlen("randr"),
-                                                                     "randr"),
-                                       NULL);
-
-     if ((!rep) ||
-         (((ev->response_type & ~0x80) - rep->first_event) != XCB_RANDR_SCREEN_CHANGE_NOTIFY))
-       printf("ERROR: Can't update RandR config!\n");
-     if (rep)
-       free(rep);
-     }
-
-   e = calloc(1, sizeof(Ecore_X_Event_Screen_Change));
-   if (!e) return;
    e->win = ev->request_window;
    e->root = ev->root;
-   e->width = ev->width;
-   e->height = ev->height;
+   e->size.width = ev->width;
+   e->size.height = ev->height;
+   e->time = ev->timestamp;
+   e->config_time = ev->config_timestamp;
+   e->size.width_mm = ev->mwidth;
+   e->size.height_mm = ev->mheight;
+   e->orientation = ev->rotation;
+   e->subpixel_order = ev->subpixel_order;
+
    ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
-#else
-   event = NULL;
-#endif /* ECORE_X_RANDR */
+#endif
 }
 
-void
-_ecore_x_event_handle_fixes_selection_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_randr_notify(xcb_generic_event_t *event)
 {
-#ifdef ECORE_X_FIXES
-   /* Nothing here yet */
-#else
-   event = NULL;
-#endif /* ECORE_X_FIXES */
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_notify_event_t *ev;
+#endif
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+#ifdef ECORE_XCB_RANDR
+   ev = (xcb_randr_notify_event_t *)event;
+   switch (ev->subCode)
+     {
+      case XCB_RANDR_NOTIFY_CRTC_CHANGE:
+        _ecore_xcb_event_handle_randr_crtc_change(event);
+        break;
+
+      case XCB_RANDR_NOTIFY_OUTPUT_CHANGE:
+        _ecore_xcb_event_handle_randr_output_change(event);
+        break;
+
+      case XCB_RANDR_NOTIFY_OUTPUT_PROPERTY:
+        _ecore_xcb_event_handle_randr_output_property_change(event);
+        break;
+
+      default:
+        break;
+     }
+#endif
 }
 
-void
-_ecore_x_event_handle_damage_notify(xcb_generic_event_t *event)
+static void
+_ecore_xcb_event_handle_randr_crtc_change(xcb_generic_event_t *event)
 {
-#ifdef ECORE_XCBDAMAGE
-   xcb_damage_notify_event_t *ev;
-   Ecore_X_Event_Damage      *e;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_notify_event_t *ev;
+   Ecore_X_Event_Randr_Crtc_Change *e;
+#endif
 
-   ev = (xcb_damage_notify_event_t *)event;
-   e = calloc(1, sizeof(Ecore_X_Event_Damage));
-   if (!e) return;
+#ifdef ECORE_XCB_RANDR
+   ev = (xcb_randr_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change))))
+     return;
 
-   e->level = ev->level;
-   e->drawable = ev->drawable;
-   e->damage = ev->damage;
-   /* FIXME: XCB has no 'more' member in xcb_damage_notify_event_t */
-/*    e->more = ev->more; */
-   e->time = ev->timestamp;
-   e->area.x = ev->area.x;
-   e->area.y = ev->area.y;
-   e->area.width = ev->area.width;
-   e->area.height = ev->area.height;
-   e->geometry.x = ev->geometry.x;
-   e->geometry.y = ev->geometry.y;
-   e->geometry.width = ev->geometry.width;
-   e->geometry.height = ev->geometry.height;
+   e->win = ev->u.cc.window;
+   e->crtc = ev->u.cc.crtc;
+   e->mode = ev->u.cc.mode;
+   e->orientation = ev->u.cc.rotation;
+   e->geo.x = ev->u.cc.x;
+   e->geo.y = ev->u.cc.y;
+   e->geo.w = ev->u.cc.width;
+   e->geo.h = ev->u.cc.height;
 
-   ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
-#else
-   event = NULL;
-#endif /* ECORE_XCBDAMAGE */
+   ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
+#endif
+}
+
+static void
+_ecore_xcb_event_handle_randr_output_change(xcb_generic_event_t *event)
+{
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_notify_event_t *ev;
+   Ecore_X_Event_Randr_Output_Change *e;
+#endif
+
+#ifdef ECORE_XCB_RANDR
+   ev = (xcb_randr_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Change))))
+     return;
+
+   e->win = ev->u.oc.window;
+   e->output = ev->u.oc.output;
+   e->crtc = ev->u.oc.crtc;
+   e->mode = ev->u.oc.mode;
+   e->orientation = ev->u.oc.rotation;
+   e->connection = ev->u.oc.connection;
+   e->subpixel_order = ev->u.oc.subpixel_order;
+
+   ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, e, NULL, NULL);
+#endif
 }
+
+static void
+_ecore_xcb_event_handle_randr_output_property_change(xcb_generic_event_t *event)
+{
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_notify_event_t *ev;
+   Ecore_X_Event_Randr_Output_Property_Notify *e;
+#endif
+
+#ifdef ECORE_XCB_RANDR
+   ev = (xcb_randr_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify))))
+     return;
+
+   e->win = ev->u.op.window;
+   e->output = ev->u.op.output;
+   e->property = ev->u.op.atom;
+   e->time = ev->u.op.timestamp;
+   if (ev->u.op.status == XCB_PROPERTY_NEW_VALUE)
+     e->state = ECORE_X_RANDR_PROPERTY_CHANGE_ADD;
+   else
+     e->state = ECORE_X_RANDR_PROPERTY_CHANGE_DEL;
+
+   ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL);
+#endif
+}
+
+static void
+_ecore_xcb_event_handle_screensaver_notify(xcb_generic_event_t *event)
+{
+#ifdef ECORE_XCB_SCREENSAVER
+   xcb_screensaver_notify_event_t *ev;
+   Ecore_X_Event_Screensaver_Notify *e;
+#endif
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+#ifdef ECORE_XCB_SCREENSAVER
+   ev = (xcb_screensaver_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify)))) return;
+
+   e->win = ev->window;
+   e->on = EINA_FALSE;
+   if ((ev->state == XCB_SCREENSAVER_STATE_ON) ||
+       (ev->state == XCB_SCREENSAVER_STATE_CYCLE)) e->on = EINA_TRUE;
+   e->time = ev->time;
+
+   ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
+#endif
+}
+
+#ifdef ECORE_XCB_XGESTURE
+static void
+_ecore_xcb_event_handle_gesture_notify_flick(xcb_generic_event_t *event)
+{
+   xcb_gesture_notify_flick_event_t *ev;
+   Ecore_X_Event_Gesture_Notify_Flick *e;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
+
+   ev = (xcb_gesture_notify_flick_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Flick)))) return;
+
+   e->win = ev->window;
+   e->time = ev->time;
+   e->subtype = ev->kind;
+   e->num_fingers = ev->num_finger;
+   e->distance = ev->distance;
+   e->duration = ev->duration;
+   e->direction = ev->direction;
+   e->angle = XFixedToDouble(ev->angle);
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_FLICK, e, NULL, NULL);
+}
+
+static void
+_ecore_xcb_event_handle_gesture_notify_pan(xcb_generic_event_t *event)
+{
+   xcb_gesture_notify_pan_event_t *ev;
+   Ecore_X_Event_Gesture_Notify_Pan *e;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
+
+   ev = (xcb_gesture_notify_pan_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Pan)))) return;
+
+   e->win = ev->window;
+   e->time = ev->time;
+   e->subtype = ev->kind;
+   e->num_fingers = ev->num_finger;
+   e->dx = ev->dx;
+   e->dy = ev->dy;
+   e->distance = ev->distance;
+   e->duration = ev->duration;
+   e->direction = ev->direction;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PAN, e, NULL, NULL);
+}
+
+static void
+_ecore_xcb_event_handle_gesture_notify_pinchrotation(xcb_generic_event_t *event)
+{
+   xcb_gesture_notify_pinch_rotation_event_t *ev;
+   Ecore_X_Event_Gesture_Notify_PinchRotation *e;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
+
+   ev = (xcb_gesture_notify_pinch_rotation_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_PinchRotation)))) return;
+
+   e->win = ev->window;
+   e->time = ev->time;
+   e->subtype = ev->kind;
+   e->num_fingers = ev->num_finger;
+   e->distance = ev->distance;
+   e->cx = ev->cx;
+   e->cy = ev->cy;
+   e->zoom = XFixedToDouble(ev->zoom);
+   e->angle = XFixedToDouble(ev->angle);
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION, e, NULL, NULL);
+}
+
+static void
+_ecore_xcb_event_handle_gesture_notify_tap(xcb_generic_event_t *event)
+{
+   xcb_gesture_notify_tap_event_t *ev;
+   Ecore_X_Event_Gesture_Notify_Tap *e;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
+
+   ev = (xcb_gesture_notify_tap_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Tap)))) return;
+
+   e->win = ev->window;
+   e->time = ev->time;
+   e->subtype = ev->kind;
+   e->num_fingers = ev->num_finger;
+   e->cx = ev->cx;
+   e->cy = ev->cy;
+   e->tap_repeat = ev->tap_repeat;
+   e->interval = ev->interval;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAP, e, NULL, NULL);
+}
+
+static void
+_ecore_xcb_event_handle_gesture_notify_tapnhold(xcb_generic_event_t *event)
+{
+   xcb_gesture_notify_tap_n_hold_event_t *ev;
+   Ecore_X_Event_Gesture_Notify_TapNHold *e;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
+
+   ev = (xcb_gesture_notify_tap_n_hold_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_TapNHold)))) return;
+
+   e->win = ev->window;
+   e->time = ev->time;
+   e->subtype = ev->kind;
+   e->num_fingers = ev->num_finger;
+   e->cx = ev->cx;
+   e->cy = ev->cy;
+   e->interval = ev->interval;
+   e->hold_time = ev->holdtime;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD, e, NULL, NULL);
+}
+
+static void
+ _ecore_xcb_event_handle_gesture_notify_hold(xcb_generic_event_t *event)
+{
+   xcb_gesture_notify_hold_event_t *ev;
+   Ecore_X_Event_Gesture_Notify_Hold *e;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
+
+   ev = (xcb_gesture_notify_hold_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Hold)))) return;
+
+   e->win = ev->window;
+   e->time = ev->time;
+   e->subtype = ev->kind;
+   e->num_fingers = ev->num_finger;
+   e->cx = ev->cx;
+   e->cy = ev->cy;
+   e->hold_time = ev->holdtime;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_HOLD, e, NULL, NULL);
+}
+
+static void
+ _ecore_xcb_event_handle_gesture_notify_group(xcb_generic_event_t *event)
+{
+   xcb_gesture_notify_group_event_t *ev;
+   Ecore_X_Event_Gesture_Notify_Group *e;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
+
+   ev = (xcb_gesture_notify_group_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Group)))) return;
+
+   e->win = ev->window;
+   e->time = ev->time;
+   e->subtype = ev->kind;
+   e->num_groups = ev->num_group;
+   e->group_id = ev->groupid;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_GROUP, e, NULL, NULL);
+}
+#endif
+
+#ifdef ECORE_XCB_SHAPE
+static void
+_ecore_xcb_event_handle_shape_change(xcb_generic_event_t *event)
+{
+   xcb_shape_notify_event_t *ev;
+   Ecore_X_Event_Window_Shape *e;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+   ev = (xcb_shape_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Shape)))) return;
+
+   e->win = ev->affected_window;
+   e->time = ev->server_time;
+   switch (ev->shape_kind)
+     {
+      case XCB_SHAPE_SK_BOUNDING:
+        e->type = ECORE_X_SHAPE_BOUNDING;
+        break;
+
+      case XCB_SHAPE_SK_CLIP:
+        e->type = ECORE_X_SHAPE_CLIP;
+        break;
+
+      case XCB_SHAPE_SK_INPUT:
+        e->type = ECORE_X_SHAPE_INPUT;
+        break;
+
+      default:
+        break;
+     }
+   e->x = ev->extents_x;
+   e->y = ev->extents_y;
+   e->w = ev->extents_width;
+   e->h = ev->extents_height;
+   e->shaped = ev->shaped;
+
+   ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
+}
+
+#endif
+
+static void
+_ecore_xcb_event_handle_sync_counter(xcb_generic_event_t *event)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_counter_notify_event_t *ev;
+   Ecore_X_Event_Sync_Counter *e;
+#endif
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+
+#ifdef ECORE_XCB_SYNC
+   ev = (xcb_sync_counter_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter)))) return;
+
+   e->time = ev->timestamp;
+
+   ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
+#endif
+}
+
+static void
+_ecore_xcb_event_handle_sync_alarm(xcb_generic_event_t *event)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_alarm_notify_event_t *ev;
+   Ecore_X_Event_Sync_Alarm *e;
+#endif
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+#ifdef ECORE_XCB_SYNC
+   ev = (xcb_sync_alarm_notify_event_t *)event;
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm)))) return;
+
+   e->time = ev->timestamp;
+   e->alarm = ev->alarm;
+
+   ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
+#endif
+}
+
+static void
+_ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event)
+{
+#ifdef ECORE_XCB_XFIXES
+   Ecore_X_Event_Fixes_Selection_Notify *e;
+   Ecore_X_Atom sel;
+   xcb_xfixes_selection_notify_event_t *ev;
+#endif
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+#ifdef ECORE_XCB_XFIXES
+   ev = (xcb_xfixes_selection_notify_event_t *)event;
+
+   if (!(e = calloc(1, sizeof(*e)))) return;
+
+   e->win = ev->window;
+   e->owner = ev->owner;
+   e->time = ev->timestamp;
+   e->selection_time = ev->selection_timestamp;
+   e->atom = sel = ev->selection;
+   if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
+     e->selection = ECORE_X_SELECTION_PRIMARY;
+   else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
+     e->selection = ECORE_X_SELECTION_SECONDARY;
+   else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
+     e->selection = ECORE_X_SELECTION_CLIPBOARD;
+   else
+     e->selection = ECORE_X_SELECTION_OTHER;
+   e->reason = ev->subtype;
+
+   ecore_event_add(ECORE_X_EVENT_FIXES_SELECTION_NOTIFY, e, NULL, NULL);
+#endif
+}
+
+static void
+_ecore_xcb_event_handle_xfixes_cursor_notify(xcb_generic_event_t *event __UNUSED__)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+//  FIXME: TBD
+}
+
+static void
+_ecore_xcb_event_handle_generic_event(xcb_generic_event_t *event)
+{
+   xcb_ge_event_t *ev;
+   Ecore_X_Event_Generic *e;
+
+   ev = (xcb_ge_event_t *)event;
+
+   /* pad0 *IS* extension - bug in xcb */
+   if (ev->pad0 == _ecore_xcb_event_input)
+     {
+        _ecore_xcb_event_handle_input_event(event);
+// FIXME: should we generate generic events as WELL as input events?
+//        return;
+     }
+
+   if (!(e = calloc(1, sizeof(Ecore_X_Event_Generic))))
+     return;
+
+   DBG("Handle Generic Event: %d", ev->event_type);
+
+   e->cookie = ev->sequence;
+   /* NB: These are bugs in xcb ge_event structure. The struct should have a
+    * field for extension & data, but does not.
+    *
+    * XCB people have been notified of this issue */
+   e->extension = ev->pad0;
+   /* e->data = ev->pad1; */
+   if (ev->length > 0)
+     {
+        int len = ev->length * sizeof(int);
+        e->data = malloc(len);
+        if (e->data) memcpy(e->data, &(event[1]), len);
+     }
+
+   e->evtype = ev->event_type;
+
+   ecore_event_add(ECORE_X_EVENT_GENERIC, e,
+                   _ecore_xcb_event_generic_event_free, e->data);
+}
+
+static void
+_ecore_xcb_event_handle_input_event(xcb_generic_event_t *event)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_input_handle_event(event);
+}
+
+static void
+_ecore_xcb_event_key_press(xcb_generic_event_t *event)
+{
+   Ecore_Event_Key *e;
+   xcb_keysym_t sym = XCB_NO_SYMBOL;
+   xcb_keycode_t keycode = 0;
+   xcb_key_press_event_t *xevent;
+   char *keyname = NULL, *key = NULL;
+   char *compose = NULL;
+   char compose_buffer[256];
+   int val = 0;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+
+   xevent = (xcb_key_press_event_t *)event;
+   keycode = xevent->detail;
+
+   sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, xevent->state);
+   keyname = _ecore_xcb_keymap_keysym_to_string(sym);
+   if (!keyname)
+     {
+        char buff[256];
+
+        snprintf(buff, sizeof(buff), "Keycode-%i", keycode);
+        keyname = buff;
+     }
+
+   val =
+     _ecore_xcb_keymap_lookup_string(keycode, xevent->state, compose_buffer,
+                                     sizeof(compose_buffer), &sym);
+   if (val > 0)
+     {
+        compose_buffer[val] = 0;
+        compose =
+          eina_str_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
+        if (!compose)
+          ERR("Ecore_X cannot convert input key string '%s' to UTF-8. "
+              "Is Eina built with iconv support?", compose_buffer);
+     }
+
+   key = _ecore_xcb_keymap_keysym_to_string(sym);
+   if (!key) key = keyname;
+
+   e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
+              (compose ? strlen(compose) : 0) + 3);
+   if (e)
+     {
+        e->keyname = (char *)(e + 1);
+        e->key = e->keyname + strlen(keyname) + 1;
+
+        e->compose = NULL;
+        if (compose) e->compose = (e->key + strlen(key) + 1);
+        e->string = e->compose;
+
+        strcpy((char *)e->keyname, keyname);
+        strcpy((char *)e->key, key);
+        if (compose) strcpy((char *)e->compose, compose);
+
+        e->modifiers = _ecore_xcb_events_modifiers_get(xevent->state);
+        e->timestamp = xevent->time;
+        e->window = xevent->child ? xevent->child : xevent->event;
+        e->event_window = xevent->event;
+        e->same_screen = xevent->same_screen;
+        e->root_window = xevent->root;
+
+        DBG("Sending Key Down Event: %s", e->keyname);
+        ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
+     }
+   _ecore_xcb_event_last_time = xevent->time;
+}
+
+static void
+_ecore_xcb_event_key_release(xcb_generic_event_t *event)
+{
+   Ecore_Event_Key *e;
+   xcb_keysym_t sym = XCB_NO_SYMBOL;
+   xcb_keycode_t keycode = 0;
+   xcb_key_release_event_t *xevent;
+   char *keyname = NULL, *key = NULL;
+   char *compose = NULL;
+   char compose_buffer[256];
+   int val = 0;
+
+   _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+
+   xevent = (xcb_key_release_event_t *)event;
+   keycode = xevent->detail;
+
+   sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, xevent->state);
+   keyname = _ecore_xcb_keymap_keysym_to_string(sym);
+   if (!keyname)
+     {
+        char buff[256];
+
+        snprintf(buff, sizeof(buff), "Keycode-%i", keycode);
+        keyname = buff;
+     }
+
+   val =
+     _ecore_xcb_keymap_lookup_string(keycode, xevent->state, compose_buffer,
+                                     sizeof(compose_buffer), &sym);
+   if (val > 0)
+     {
+        compose_buffer[val] = 0;
+        compose =
+          eina_str_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
+//        tmp = compose;
+     }
+
+   key = _ecore_xcb_keymap_keysym_to_string(sym);
+   if (!key) key = keyname;
+
+   e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
+              (compose ? strlen(compose) : 0) + 3);
+   if (e)
+     {
+        e->keyname = (char *)(e + 1);
+        e->key = e->keyname + strlen(keyname) + 1;
+
+        e->compose = NULL;
+        if (compose) e->compose = (e->key + strlen(key) + 1);
+        e->string = e->compose;
+
+        strcpy((char *)e->keyname, keyname);
+        strcpy((char *)e->key, key);
+        if (compose) strcpy((char *)e->compose, compose);
+
+        e->modifiers = _ecore_xcb_events_modifiers_get(xevent->state);
+        e->timestamp = xevent->time;
+        e->window = xevent->child ? xevent->child : xevent->event;
+        e->event_window = xevent->event;
+        e->same_screen = xevent->same_screen;
+        e->root_window = xevent->root;
+
+        ecore_event_add(ECORE_EVENT_KEY_UP, e, NULL, NULL);
+     }
+   _ecore_xcb_event_last_time = xevent->time;
+}
+
+void
+_ecore_xcb_event_mouse_move(uint16_t     timestamp,
+                            uint16_t     modifiers,
+                            int16_t      x,
+                            int16_t      y,
+                            int16_t      root_x,
+                            int16_t      root_y,
+                            xcb_window_t event_win,
+                            xcb_window_t win,
+                            xcb_window_t root_win,
+                            uint8_t      same_screen,
+                            int          dev,
+                            double       radx,
+                            double       rady,
+                            double       pressure,
+                            double       angle,
+                            int16_t      mx,
+                            int16_t      my,
+                            int16_t      mrx,
+                            int16_t      mry)
+{
+   Ecore_Event_Mouse_Move *e;
+   Ecore_Event *event;
+
+   if (!(e = malloc(sizeof(Ecore_Event_Mouse_Move)))) return;
+
+   e->window = win;
+   e->root_window = root_win;
+   e->timestamp = timestamp;
+   e->same_screen = same_screen;
+   e->event_window = event_win;
+   e->modifiers = _ecore_xcb_events_modifiers_get(modifiers);
+   e->x = x;
+   e->y = y;
+   e->root.x = root_x;
+   e->root.y = root_y;
+   e->multi.device = dev;
+   e->multi.radius = ((radx + rady) / 2);
+   e->multi.radius_x = radx;
+   e->multi.radius_y = rady;
+   e->multi.pressure = pressure;
+   e->multi.angle = angle;
+   e->multi.x = mx;
+   e->multi.y = my;
+   e->multi.root.x = mrx;
+   e->multi.root.y = mry;
+
+   event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e,
+                           _ecore_xcb_event_mouse_move_free, NULL);
+
+   _ecore_xcb_event_last_time = e->timestamp;
+   _ecore_xcb_event_last_window = e->window;
+   _ecore_xcb_event_last_root_x = root_x;
+   _ecore_xcb_event_last_root_y = root_y;
+//   _ecore_xcb_event_last_mouse_move_event = event;
+}
+
+static void
+_ecore_xcb_event_mouse_move_free(void *data __UNUSED__,
+                                 void *event)
+{
+   Ecore_Event_Mouse_Move *ev;
+
+   ev = event;
+//   if (_ecore_xcb_event_last_mouse_move_event)
+//     {
+//        _ecore_xcb_event_last_mouse_move = EINA_FALSE;
+//        _ecore_xcb_event_last_mouse_move_event = NULL;
+//     }
+   if (ev) free(ev);
+}
+
+Ecore_Event_Mouse_Button *
+_ecore_xcb_event_mouse_button(int          event,
+                              uint16_t     timestamp,
+                              uint16_t     modifiers,
+                              xcb_button_t buttons,
+                              int16_t      x,
+                              int16_t      y,
+                              int16_t      root_x,
+                              int16_t      root_y,
+                              xcb_window_t event_win,
+                              xcb_window_t win,
+                              xcb_window_t root_win,
+                              uint8_t      same_screen,
+                              int          dev,
+                              double       radx,
+                              double       rady,
+                              double       pressure,
+                              double       angle,
+                              int16_t      mx,
+                              int16_t      my,
+                              int16_t      mrx,
+                              int16_t      mry)
+{
+   Ecore_Event_Mouse_Button *e;
+   Ecore_X_Mouse_Down_Info *info = NULL;
+
+   if (!(e = malloc(sizeof(Ecore_Event_Mouse_Button)))) return NULL;
+
+   e->window = win;
+   e->root_window = root_win;
+   e->timestamp = timestamp;
+   e->same_screen = same_screen;
+   e->event_window = event_win;
+   e->buttons = buttons;
+   e->modifiers = _ecore_xcb_events_modifiers_get(modifiers);
+   e->double_click = 0;
+   e->triple_click = 0;
+   e->x = x;
+   e->y = y;
+   e->root.x = root_x;
+   e->root.y = root_y;
+
+   if ((info = _ecore_xcb_event_mouse_down_info_get(dev)))
+     {
+        if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
+            (info->did_triple))
+          {
+             info->last_win = 0;
+             info->last_last_win = 0;
+             info->last_event_win = 0;
+             info->last_time = 0;
+             info->last_last_time = 0;
+          }
+        if (event_win == win)
+          {
+             if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
+               {
+                  if (((int)(timestamp - info->last_time) <=
+                       (int)(1000 * _ecore_xcb_double_click_time)) &&
+                      (win == info->last_win) &&
+                      (event_win == info->last_event_win))
+                    {
+                       e->double_click = 1;
+                       info->did_double = EINA_TRUE;
+                    }
+                  else
+                    {
+                       info->did_double = EINA_FALSE;
+                       info->did_triple = EINA_FALSE;
+                    }
+                  if (((int)(timestamp - info->last_last_time) <=
+                       (int)(2 * 1000 * _ecore_xcb_double_click_time)) &&
+                      (win == info->last_win) &&
+                      (win == info->last_last_win) &&
+                      (event_win == info->last_event_win) &&
+                      (event_win == info->last_last_event_win))
+                    {
+                       e->triple_click = 1;
+                       info->did_triple = EINA_TRUE;
+                    }
+                  else
+                    info->did_triple = EINA_FALSE;
+               }
+             else
+               {
+                  if (info->did_double) e->double_click = 1;
+                  if (info->did_triple) e->triple_click = 1;
+               }
+          }
+     }
+
+   /* NB: Comment out right now because _ecore_xcb_mouse_up_count is
+    * only used here...nowhere else in the code */
+
+   /* if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&  */
+   /*     (!e->double_click) && (!e->triple_click)) */
+   /*   _ecore_xcb_mouse_up_count = 0; */
+
+   e->multi.device = dev;
+   e->multi.radius = ((radx + rady) / 2);
+   e->multi.radius_x = radx;
+   e->multi.radius_y = rady;
+   e->multi.pressure = pressure;
+   e->multi.angle = angle;
+   e->multi.x = mx;
+   e->multi.y = my;
+   e->multi.root.x = mrx;
+   e->multi.root.y = mry;
+
+   _ecore_xcb_event_last_time = e->timestamp;
+   _ecore_xcb_event_last_window = e->window;
+   _ecore_xcb_event_last_root_x = root_x;
+   _ecore_xcb_event_last_root_y = root_y;
+
+   ecore_event_add(event, e, NULL, NULL);
+
+   if ((info) && (event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
+       (win == event_win) && (!info->did_triple))
+     {
+        info->last_last_win = info->last_win;
+        info->last_win = win;
+        info->last_last_event_win = info->last_event_win;
+        info->last_event_win = event_win;
+        info->last_last_time = info->last_time;
+        info->last_time = timestamp;
+     }
+
+   return e;
+}
+
+static Ecore_X_Event_Mode
+_ecore_xcb_event_mode_get(uint8_t mode)
+{
+   switch (mode)
+     {
+      case XCB_NOTIFY_MODE_NORMAL:
+        return ECORE_X_EVENT_MODE_NORMAL;
+
+      case XCB_NOTIFY_MODE_WHILE_GRABBED:
+        return ECORE_X_EVENT_MODE_WHILE_GRABBED;
+
+      case XCB_NOTIFY_MODE_GRAB:
+        return ECORE_X_EVENT_MODE_GRAB;
+
+      case XCB_NOTIFY_MODE_UNGRAB:
+        return ECORE_X_EVENT_MODE_UNGRAB;
+
+      default:
+        return ECORE_X_EVENT_MODE_NORMAL;
+     }
+}
+
+static Ecore_X_Event_Detail
+_ecore_xcb_event_detail_get(uint8_t detail)
+{
+   switch (detail)
+     {
+      case XCB_NOTIFY_DETAIL_ANCESTOR:
+        return ECORE_X_EVENT_DETAIL_ANCESTOR;
+
+      case XCB_NOTIFY_DETAIL_VIRTUAL:
+        return ECORE_X_EVENT_DETAIL_VIRTUAL;
+
+      case XCB_NOTIFY_DETAIL_INFERIOR:
+        return ECORE_X_EVENT_DETAIL_INFERIOR;
+
+      case XCB_NOTIFY_DETAIL_NONLINEAR:
+        return ECORE_X_EVENT_DETAIL_NON_LINEAR;
+
+      case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL:
+        return ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
+
+      case XCB_NOTIFY_DETAIL_POINTER:
+        return ECORE_X_EVENT_DETAIL_POINTER;
+
+      case XCB_NOTIFY_DETAIL_POINTER_ROOT:
+        return ECORE_X_EVENT_DETAIL_POINTER_ROOT;
+
+      case XCB_NOTIFY_DETAIL_NONE:
+      default:
+        return ECORE_X_EVENT_DETAIL_ANCESTOR;
+     }
+}
+
+static void
+_ecore_xcb_event_xdnd_enter_free(void *data __UNUSED__,
+                                 void *event)
+{
+   Ecore_X_Event_Xdnd_Enter *e;
+   int i = 0;
+
+   e = event;
+   for (i = 0; i < e->num_types; i++)
+     free(e->types[i]);
+   free(e->types);
+   free(e);
+}
+
+static void
+_ecore_xcb_event_selection_notify_free(void *data __UNUSED__,
+                                       void *event)
+{
+   Ecore_X_Event_Selection_Notify *e;
+   Ecore_X_Selection_Data *sel;
+
+   e = event;
+   if (!(sel = e->data)) return;
+   if (sel->free) sel->free(sel);
+   free(e->target);
+   free(e);
+}
+
+static void
+_ecore_xcb_event_generic_event_free(void *data,
+                                    void *event)
+{
+   Ecore_X_Event_Generic *e;
+
+   e = (Ecore_X_Event_Generic *)event;
+   if (e->data) free(data);
+   free(e);
+}
+
+static void
+_ecore_xcb_event_mouse_down_info_clear(void)
+{
+   Eina_Inlist *l;
+   Ecore_X_Mouse_Down_Info *info = NULL;
+
+   l = _ecore_xcb_mouse_down_info_list;
+   while (l)
+     {
+        info = EINA_INLIST_CONTAINER_GET(l, Ecore_X_Mouse_Down_Info);
+        l = eina_inlist_remove(l, l);
+        free(info);
+     }
+   _ecore_xcb_mouse_down_info_list = NULL;
+}
+
+static Ecore_X_Mouse_Down_Info *
+_ecore_xcb_event_mouse_down_info_get(int dev)
+{
+   Eina_Inlist *l;
+   Ecore_X_Mouse_Down_Info *info = NULL;
+
+   l = _ecore_xcb_mouse_down_info_list;
+   EINA_INLIST_FOREACH(l, info)
+     if (info->dev == dev) return info;
+
+   if (!(info = calloc(1, sizeof(Ecore_X_Mouse_Down_Info)))) return NULL;
+
+   info->dev = dev;
+   l = eina_inlist_append(l, (Eina_Inlist *)info);
+   _ecore_xcb_mouse_down_info_list = l;
+
+   return info;
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_extensions.c b/src/lib/ecore_x/xcb/ecore_xcb_extensions.c
new file mode 100644 (file)
index 0000000..40c10ac
--- /dev/null
@@ -0,0 +1,148 @@
+#include "ecore_xcb_private.h"
+
+void
+_ecore_xcb_extensions_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_big_requests_id);
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_shm_id);
+
+#ifdef ECORE_XCB_SHAPE
+   _ecore_xcb_shape_init();
+#endif
+
+#ifdef ECORE_XCB_SCREENSAVER
+   _ecore_xcb_screensaver_init();
+#endif
+
+#ifdef ECORE_XCB_SYNC
+   _ecore_xcb_sync_init();
+#endif
+
+#ifdef ECORE_XCB_RANDR
+   _ecore_xcb_randr_init();
+#endif
+
+#ifdef ECORE_XCB_XFIXES
+   _ecore_xcb_xfixes_init();
+#endif
+
+#ifdef ECORE_XCB_DAMAGE
+   _ecore_xcb_damage_init();
+#endif
+
+#ifdef ECORE_XCB_RENDER
+   _ecore_xcb_render_init();
+#endif
+
+#ifdef ECORE_XCB_COMPOSITE
+   _ecore_xcb_composite_init();
+#endif
+
+#ifdef ECORE_XCB_DPMS
+   _ecore_xcb_dpms_init();
+#endif
+
+#ifdef ECORE_XCB_DPMS
+   _ecore_xcb_dpms_init();
+#endif
+
+#ifdef ECORE_XCB_CURSOR
+   _ecore_xcb_cursor_init();
+#endif
+
+#ifdef ECORE_XCB_XINERAMA
+   _ecore_xcb_xinerama_init();
+#endif
+
+#ifdef ECORE_XCB_XINPUT
+   _ecore_xcb_input_init();
+#endif
+
+#ifdef ECORE_XCB_GESTURE
+   _ecore_xcb_gesture_init();
+#endif
+
+/* #ifdef ECORE_XCB_DRI */
+/*    _ecore_xcb_dri_init(); */
+/* #endif */
+
+#ifdef ECORE_XCB_XTEST
+   _ecore_xcb_xtest_init();
+#endif
+
+   xcb_prefetch_maximum_request_length(_ecore_xcb_conn);
+}
+
+void
+_ecore_xcb_extensions_finalize(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xcb_get_extension_data(_ecore_xcb_conn, &xcb_big_requests_id);
+   xcb_get_extension_data(_ecore_xcb_conn, &xcb_shm_id);
+
+#ifdef ECORE_XCB_SHAPE
+   _ecore_xcb_shape_finalize();
+#endif
+
+#ifdef ECORE_XCB_SCREENSAVER
+   _ecore_xcb_screensaver_finalize();
+#endif
+
+#ifdef ECORE_XCB_SYNC
+   _ecore_xcb_sync_finalize();
+#endif
+
+#ifdef ECORE_XCB_RANDR
+   _ecore_xcb_randr_finalize();
+#endif
+
+#ifdef ECORE_XCB_XFIXES
+   _ecore_xcb_xfixes_finalize();
+#endif
+
+#ifdef ECORE_XCB_DAMAGE
+   _ecore_xcb_damage_finalize();
+#endif
+
+#ifdef ECORE_XCB_RENDER
+   _ecore_xcb_render_finalize();
+#endif
+
+#ifdef ECORE_XCB_COMPOSITE
+   _ecore_xcb_composite_finalize();
+#endif
+
+#ifdef ECORE_XCB_DPMS
+   _ecore_xcb_dpms_finalize();
+#endif
+
+#ifdef ECORE_XCB_CURSOR
+   _ecore_xcb_cursor_finalize();
+#endif
+
+#ifdef ECORE_XCB_XINERAMA
+   _ecore_xcb_xinerama_finalize();
+#endif
+
+#ifdef ECORE_XCB_XINPUT
+   _ecore_xcb_input_finalize();
+#endif
+
+#ifdef ECORE_XCB_GESTURE
+   _ecore_xcb_gesture_finalize();
+#endif
+
+/* #ifdef ECORE_XCB_DRI */
+/*    _ecore_xcb_dri_finalize(); */
+/* #endif */
+
+#ifdef ECORE_XCB_XTEST
+   _ecore_xcb_xtest_finalize();
+#endif
+
+   xcb_get_maximum_request_length(_ecore_xcb_conn);
+}
+
index 0a4ec22..d811b54 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
 
-
 /**
  * Creates a new default graphics context associated with the given
  * drawable.
- * @param  drawable Drawable to create graphics context with.  If @c 0 is
- *                  given instead, the default root window is used.
- * @return          The new default graphics context.
- *
- * Creates a new default graphics context associated with @p
- * drawable. The graphic context can be used with any destination
- * drawable having the same root and depth as @p drawable. Use with
- * other drawables results in a BadMatch error.
+ * @param  draw Drawable to create graphics context with.  If @c 0 is
+ *              given instead, the default root window is used.
+ * @param value_mask Bitmask values.
+ * @param value_list List of values. The order of values must be the
+ *                   same than the corresponding bitmaks.
+ * @return The new default graphics context.
  */
 EAPI Ecore_X_GC
-ecore_x_gc_new(Ecore_X_Drawable drawable)
+ecore_x_gc_new(Ecore_X_Drawable      drawable,
+               Ecore_X_GC_Value_Mask value_mask,
+               const unsigned int   *value_list)
 {
    xcb_gcontext_t gc;
+   uint32_t vmask = 0;
+   int i = 0, mask = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
    if (!drawable) drawable = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
+   for (i = 0, mask = 1; i <= 22; i++, mask <<= 1)
+     {
+        switch (mask & value_mask)
+          {
+           case ECORE_X_GC_VALUE_MASK_FUNCTION:
+             vmask |= XCB_GC_FUNCTION;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_PLANE_MASK:
+             vmask |= XCB_GC_PLANE_MASK;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FOREGROUND:
+             vmask |= XCB_GC_FOREGROUND;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_BACKGROUND:
+             vmask |= XCB_GC_BACKGROUND;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_LINE_WIDTH:
+             vmask |= XCB_GC_LINE_WIDTH;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_LINE_STYLE:
+             vmask |= XCB_GC_LINE_STYLE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CAP_STYLE:
+             vmask |= XCB_GC_CAP_STYLE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_JOIN_STYLE:
+             vmask |= XCB_GC_JOIN_STYLE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FILL_STYLE:
+             vmask |= XCB_GC_FILL_STYLE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FILL_RULE:
+             vmask |= XCB_GC_FILL_RULE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_TILE:
+             vmask |= XCB_GC_TILE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_STIPPLE:
+             vmask |= XCB_GC_STIPPLE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X:
+             vmask |= XCB_GC_TILE_STIPPLE_ORIGIN_X;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y:
+             vmask |= XCB_GC_TILE_STIPPLE_ORIGIN_Y;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FONT:
+             vmask |= XCB_GC_FONT;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE:
+             vmask |= XCB_GC_SUBWINDOW_MODE;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES:
+             vmask |= XCB_GC_GRAPHICS_EXPOSURES;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X:
+             vmask |= XCB_GC_CLIP_ORIGIN_X;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y:
+             vmask |= XCB_GC_CLIP_ORIGIN_Y;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CLIP_MASK:
+             vmask |= XCB_GC_CLIP_MASK;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_DASH_OFFSET:
+             vmask |= XCB_GC_DASH_OFFSET;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_DASH_LIST:
+             vmask |= XCB_GC_DASH_LIST;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_ARC_MODE:
+             vmask |= XCB_GC_ARC_MODE;
+             break;
+          }
+     }
+
    gc = xcb_generate_id(_ecore_xcb_conn);
-   xcb_create_gc(_ecore_xcb_conn, gc, drawable, 0, NULL);
+   xcb_create_gc(_ecore_xcb_conn, gc, drawable, vmask, value_list);
 
+//   ecore_x_flush();
    return gc;
 }
 
-
 /**
  * Deletes and frees the given graphics context.
  * @param gc The given graphics context.
- *
- * Destroyes the graphic context @p gc as well as the associated
- * storage.
  */
 EAPI void
-ecore_x_gc_del(Ecore_X_GC gc)
+ecore_x_gc_free(Ecore_X_GC gc)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
    xcb_free_gc(_ecore_xcb_conn, gc);
+//   ecore_x_flush();
 }
+
+EAPI void
+ecore_x_gc_foreground_set(Ecore_X_GC    gc,
+                          unsigned long foreground)
+{
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   list = foreground;
+   xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_FOREGROUND, &list);
+//   ecore_x_flush();
+}
+
+EAPI void
+ecore_x_gc_background_set(Ecore_X_GC    gc,
+                          unsigned long background)
+{
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   list = background;
+   xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_BACKGROUND, &list);
+//   ecore_x_flush();
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_gesture.c b/src/lib/ecore_x/xcb/ecore_xcb_gesture.c
new file mode 100644 (file)
index 0000000..263dade
--- /dev/null
@@ -0,0 +1,203 @@
+#include "ecore_xcb_private.h"
+#ifdef ECORE_XCB_XGESTURE
+# include <xcb/gesture.h>
+# include <xcb/xcb_event.h>
+#endif
+
+/* local variables */
+static Eina_Bool _gesture_available = EINA_FALSE;
+
+/* external variables */
+int _ecore_xcb_event_gesture = -1;
+
+void 
+_ecore_xcb_gesture_init(void) 
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XGESTURE
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_gesture_id);
+#endif
+}
+
+void 
+_ecore_xcb_gesture_finalize(void) 
+{
+#ifdef ECORE_XCB_XGESTURE
+   xcb_gesture_query_version_cookie_t cookie;
+   xcb_gesture_query_version_reply_t *reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XGESTURE
+   cookie = 
+     xcb_gesture_query_version_unchecked(_ecore_xcb_conn);
+   reply = 
+     xcb_gesture_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply) 
+     {
+        _gesture_available = EINA_TRUE;
+        free(reply);
+     }
+
+   if (_gesture_available) 
+     {
+        const xcb_query_extension_reply_t *ext_reply;
+
+        ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_gesture_id);
+        if (ext_reply) 
+          _ecore_xcb_event_gesture = ext_reply->first_event;
+     }
+#endif
+}
+
+void 
+_ecore_xcb_gesture_shutdown(void) 
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+}
+
+EAPI Eina_Bool
+ecore_x_gesture_supported(void)
+{
+   return _gesture_available;
+}
+
+#ifdef ECORE_XCB_XGESTURE
+EAPI Eina_Bool
+ecore_x_gesture_events_select(Ecore_X_Window win,
+                              Ecore_X_Gesture_Event_Mask mask)
+#else
+EAPI Eina_Bool
+ecore_x_gesture_events_select(Ecore_X_Window win __UNUSED__,
+                              Ecore_X_Gesture_Event_Mask mask __UNUSED__)
+#endif
+
+{
+#ifdef ECORE_XCB_XGESTURE
+   if (!_gesture_available) return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN
+
+   xcb_gesture_select_events(_ecore_xcb_conn, win, mask);
+
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+#ifdef ECORE_XCB_XGESTURE
+EAPI Ecore_X_Gesture_Event_Mask
+ecore_x_gesture_events_selected_get(Ecore_X_Window win)
+#else
+EAPI Ecore_X_Gesture_Event_Mask
+ecore_x_gesture_events_selected_get(Ecore_X_Window win __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_XGESTURE
+   xcb_gesture_get_selected_events_cookie_t ecookie;
+   xcb_gesture_get_selected_events_reply_t *ereply;
+   Ecore_X_Gesture_Event_Mask mask = ECORE_X_GESTURE_EVENT_MASK_NONE;
+
+   if (!_gesture_available) return mask;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN
+
+   ecookie = xcb_gesture_get_selected_events(_ecore_xcb_conn, win);
+   ereply = 
+     xcb_gesture_get_selected_events_reply(_ecore_xcb_conn, ecookie, NULL);
+   if (ereply)
+     {
+        mask = ereply->mask;
+        free(ereply);
+     }
+
+   return mask;
+#else
+   return ECORE_X_GESTURE_EVENT_MASK_NONE;
+#endif
+}
+
+#ifdef ECORE_XCB_XGESTURE
+EAPI Eina_Bool
+ecore_x_gesture_event_grab(Ecore_X_Window win,
+                           Ecore_X_Gesture_Event_Type type,
+                           int num_fingers)
+#else
+EAPI Eina_Bool
+ecore_x_gesture_event_grab(Ecore_X_Window win __UNUSED__,
+                           Ecore_X_Gesture_Event_Type type __UNUSED__,
+                           int num_fingers __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_XGESTURE
+   Eina_Bool status = EINA_TRUE;
+   xcb_gesture_grab_event_cookie_t ecookie;
+   xcb_gesture_grab_event_reply_t *ereply;
+
+   if (!_gesture_available) return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN
+
+   ecookie = 
+     xcb_gesture_grab_event(_ecore_xcb_conn, win, type, num_fingers, 0L);
+   ereply = xcb_gesture_grab_event_reply(_ecore_xcb_conn, ecookie, NULL);
+
+   if (ereply)
+     {
+        if (ereply->status) status = EINA_FALSE;
+        free(ereply);
+     }
+   else
+     status = EINA_FALSE;
+
+   return status;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+#ifdef ECORE_XCB_XGESTURE
+EAPI Eina_Bool
+ecore_x_gesture_event_ungrab(Ecore_X_Window win,
+                             Ecore_X_Gesture_Event_Type type,
+                             int num_fingers)
+#else
+EAPI Eina_Bool
+ecore_x_gesture_event_ungrab(Ecore_X_Window win __UNUSED__,
+                             Ecore_X_Gesture_Event_Type type __UNUSED__,
+                             int num_fingers __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_XGESTURE
+   Eina_Bool status = EINA_TRUE;
+   xcb_gesture_ungrab_event_cookie_t ecookie;
+   xcb_gesture_ungrab_event_reply_t *ereply;
+
+   if (!_gesture_available) return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN
+
+  ecookie = 
+     xcb_gesture_ungrab_event(_ecore_xcb_conn, win, type, num_fingers, 0L);
+  ereply = xcb_gesture_ungrab_event_reply(_ecore_xcb_conn, ecookie, NULL);
+
+   if (ereply)
+     {
+        if (ereply->status) status = EINA_FALSE;
+        free(ereply);
+     }
+   else
+     status = EINA_FALSE;
+
+   return status;
+#else
+   return EINA_FALSE;
+#endif
+}
index c5b0113..8dea861 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#include "ecore_xcb_private.h"
+#include <xcb/xcb_icccm.h>
+
+EAPI void
+ecore_x_icccm_init(void)
+{
+}
 
-/*
- * Various ICCCM related functions.
+/**
+ * Sets the WM_COMMAND property for @a win.
  *
- * This is ALL the code involving anything ICCCM related, for both WM and
- * client.
+ * @param win  The window.
+ * @param argc Number of arguments.
+ * @param argv Arguments.
  */
+EAPI void
+ecore_x_icccm_command_set(Ecore_X_Window win,
+                          int            argc,
+                          char         **argv)
+{
+   void *buf;
+   char *b;
+   int nbytes, i;
 
-#include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-#include <xcb/xcb_icccm.h>
+   for (i = 0, nbytes = 0; i < argc; i++) 
+     if (argv[i]) nbytes += strlen(argv[i]) + 1;
 
+   buf = malloc(sizeof(char) * nbytes);
+   if (!buf) return;
+
+   b = (char *)buf;
+   for (i = 0; i < argc; i++)
+     {
+        if (argv[i])
+          {
+             strcpy(b, argv[i]);
+             b += strlen(argv[i]) + 1;
+          }
+        else
+          *b++ = '\0';
+     }
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
+                       ECORE_X_ATOM_WM_COMMAND, ECORE_X_ATOM_STRING, 8,
+                       nbytes, buf);
+   free(buf);
+}
 
 /**
- * @defgroup Ecore_X_ICCCM_Group ICCCM related functions.
+ * Get the WM_COMMAND property for @a win.
+ *
+ * Return the command of a window. String must be free'd when done with.
  *
- * Functions related to ICCCM.
+ * @param win  The window.
+ * @param argc Number of arguments.
+ * @param argv Arguments.
  */
+EAPI void
+ecore_x_icccm_command_get(Ecore_X_Window win,
+                          int           *argc,
+                          char        ***argv)
+{
+   xcb_get_property_cookie_t cookie;
+   xcb_get_property_reply_t *reply;
+   int len = 0;
+   char **v, *data, *cp, *start;
+   int c = 0, i = 0, j = 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-static int _ecore_x_icccm_size_hints_get (const void       *reply,
-                                          Ecore_X_Atom      property,
-                                          xcb_size_hints_t *hints)
-{
-   uint32_t s;
+   if (argc) *argc = 0;
+   if (argv) *argv = NULL;
+
+   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
+                                       ECORE_X_ATOM_WM_COMMAND,
+                                       XCB_GET_PROPERTY_TYPE_ANY,
+                                       0, 1000000L);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
 
-   if (!hints) return 0;
+   if ((reply->type != ECORE_X_ATOM_STRING) || (reply->format != 8))
+     {
+        free(reply);
+        return;
+     }
 
-   if (!reply) return 0;
-   if ((((xcb_get_property_reply_t *)reply)->type != ECORE_X_ATOM_WM_SIZE_HINTS) &&
-       ((((xcb_get_property_reply_t *)reply)->format != 8)  ||
-        (((xcb_get_property_reply_t *)reply)->format != 16) ||
-        (((xcb_get_property_reply_t *)reply)->format != 32))                &&
-       (((xcb_get_property_reply_t *)reply)->value_len < 15)) /* OldNumPropSizeElements = 15 (pre-ICCCM) */
-      return 0;
+   len = reply->value_len;
+   if (len < 1)
+     {
+        free(reply);
+        return;
+     }
 
-   memcpy(hints,
-          xcb_get_property_value((xcb_get_property_reply_t *)reply),
-          ((xcb_get_property_reply_t *)reply)->value_len);
+   data = (char *)xcb_get_property_value(reply);
+   if (len && (data[len - 1] == '\0'))
+     len--;
 
-   s = (XCB_SIZE_US_POSITION_HINT  | XCB_SIZE_US_SIZE_HINT   |
-        XCB_SIZE_P_POSITION_HINT   | XCB_SIZE_P_SIZE_HINT    |
-        XCB_SIZE_P_MIN_SIZE_HINT   | XCB_SIZE_P_MAX_SIZE_HINT |
-        XCB_SIZE_P_RESIZE_INC_HINT | XCB_SIZE_P_ASPECT_HINT);
+   c = 1;
+   for (cp = (char *)data, i = len; i > 0; cp++, i--)
+     if (*cp == '\0') c++;
 
-   if (((xcb_get_property_reply_t *)reply)->value_len >= 18) /* NumPropSizeElements = 18 (ICCCM version 1) */
-      s |= (XCB_SIZE_BASE_SIZE_HINT | XCB_SIZE_P_WIN_GRAVITY_HINT);
-   else
+   v = (char **)malloc((c + 1) * sizeof(char *));
+   if (!v)
      {
-        xcb_size_hints_set_base_size(hints, 0, 0);
-        xcb_size_hints_set_win_gravity(hints, 0);
+        free(reply);
+        return;
      }
-   /* FIXME: is it necessary ? */
-   /* hints->flags &= s; */         /* get rid of unwanted bits */
 
-   return 1;
-}
+   start = (char *)malloc((len + 1) * sizeof(char));
+   if (!start)
+     {
+        free(reply);
+        free(v);
+        return;
+     }
 
+   memcpy(start, (char *)data, len);
+   start[len] = '\0';
+   for (cp = start, i = len + 1, j = 0; i > 0; cp++, i--)
+     {
+        if (*cp == '\0')
+          {
+             v[j] = start;
+             start = (cp + 1);
+             j++;
+          }
+     }
 
-/**
- * Sets the state of a window.
- * @param window The window.
- * @param state  The state.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_state_set(Ecore_X_Window            window,
-                        Ecore_X_Window_State_Hint state)
-{
-   uint32_t c[2];
+   if (c < 1)
+     {
+        free(reply);
+        free(v);
+        return;
+     }
 
-   if (state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
-      c[0] = XCB_WM_WITHDRAWN_STATE;
-   else if (state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
-      c[0] = XCB_WM_NORMAL_STATE;
-   else if (state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
-      c[0] = XCB_WM_ICONIC_STATE;
-   c[1] = 0;
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_WM_STATE, ECORE_X_ATOM_WM_STATE, 32,
-                       2, c);
+   if (argc) *argc = c;
+
+   if (argv)
+     {
+        (*argv) = malloc(c * sizeof(char *));
+        if (!*argv)
+          {
+             free(reply);
+             free(v);
+             if (argc) *argc = 0;
+             return;
+          }
+
+        for (i = 0; i < c; i++)
+          {
+             if (v[i])
+               (*argv)[i] = strdup(v[i]);
+             else
+               (*argv)[i] = strdup("");
+          }
+     }
+
+   free(reply);
+   free(v);
 }
 
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_state_get_prefetch(Ecore_X_Window window)
+EAPI char *
+ecore_x_icccm_title_get(Ecore_X_Window win)
 {
    xcb_get_property_cookie_t cookie;
+#ifdef OLD_XCB_VERSION
+   xcb_get_text_property_reply_t prop;
+#else
+   xcb_icccm_get_text_property_reply_t prop;
+#endif
+   uint8_t ret = 0;
+   char *title = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return NULL;
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_name_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_get_wm_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
+#else
+   cookie = xcb_icccm_get_wm_name_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_icccm_get_wm_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
+#endif
+   if (ret == 0) return NULL;
+   if (prop.name_len < 1)
+     {
+#ifdef OLD_XCB_VERSION
+        xcb_get_text_property_reply_wipe(&prop);
+#else
+        xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+        return NULL;
+     }
+
+   if (!(title = malloc((prop.name_len + 1) * sizeof(char *))))
+     {
+#ifdef OLD_XCB_VERSION
+        xcb_get_text_property_reply_wipe(&prop);
+#else
+        xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+        return NULL;
+     }
+   memcpy(title, prop.name, sizeof(char *) * prop.name_len);
+   title[prop.name_len] = '\0';
+
+   if (prop.encoding != ECORE_X_ATOM_UTF8_STRING)
+     {
+        Ecore_Xcb_Textproperty tp;
+        int count = 0;
+        char **list = NULL;
+        Eina_Bool ret = EINA_FALSE;
+
+        tp.value = strdup(title);
+        tp.nitems = prop.name_len;
+        tp.encoding = prop.encoding;
+#ifdef HAVE_ICONV
+        ret = _ecore_xcb_utf8_textproperty_to_textlist(&tp, &list, &count);
+#else
+        ret = _ecore_xcb_mb_textproperty_to_textlist(&tp, &list, &count);
+#endif
+        if (ret)
+          {
+             if (count > 0)
+               title = strdup(list[0]);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_STATE,
-                                       ECORE_X_ATOM_WM_STATE,
-                                       0L, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+             if (list) free(list);
+          }
+     }
+
+#ifdef OLD_XCB_VERSION
+   xcb_get_text_property_reply_wipe(&prop);
+#else
+   xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+   return title;
 }
 
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_state_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
 EAPI void
-ecore_x_icccm_state_get_fetch(void)
+ecore_x_icccm_title_set(Ecore_X_Window win,
+                        const char    *title)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   Ecore_Xcb_Textproperty prop;
+   char *list[1];
+   Eina_Bool ret = EINA_FALSE;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!title) return;
+
+   prop.value = NULL;
+   list[0] = strdup(title);
+
+#ifdef HAVE_ICONV
+   ret = _ecore_xcb_utf8_textlist_to_textproperty(list, 1, XcbUTF8StringStyle,
+                                                  &prop);
+#else
+   ret = _ecore_xcb_mb_textlist_to_textproperty(list, 1, XcbStdICCTextStyle,
+                                                &prop);
+#endif
+
+   if (ret)
+     {
+#ifdef OLD_XCB_VERSION
+        xcb_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
+                        strlen(prop.value), prop.value);
+#else
+        xcb_icccm_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING, 8,
+                              strlen(prop.value), prop.value);
+#endif
+        if (prop.value) free(prop.value);
+     }
+   else
+#ifdef OLD_XCB_VERSION
+     xcb_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
+                     strlen(title), title);
+#else
+     xcb_icccm_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING, 8,
+                           strlen(title), title);
+#endif
+   free(list[0]);
 }
 
 /**
- * Gets the state of a window.
- * @param window The window.
- * @return       The state of the window
+ * Get a window name & class.
+ * @param win The window
+ * @param n The name string
+ * @param c The class string
  *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_state_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_state_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
+ * Get a window name * class
  */
-EAPI Ecore_X_Window_State_Hint
-ecore_x_icccm_state_get(Ecore_X_Window window __UNUSED__)
+EAPI void
+ecore_x_icccm_name_class_get(Ecore_X_Window win,
+                             char         **name,
+                             char         **class)
 {
-   xcb_get_property_reply_t   *reply;
-   uint8_t                    *prop;
-   Ecore_X_Window_State_Hint hint = ECORE_X_WINDOW_STATE_HINT_NONE;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return hint;
+   xcb_get_property_cookie_t cookie;
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_class_reply_t prop;
+#else
+   xcb_icccm_get_wm_class_reply_t prop;
+#endif
+   uint8_t ret = 0;
 
-   if ((reply->type == 0) ||
-       (reply->format != 8) ||
-       (reply->value_len != 2))
-      return hint;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   prop = (uint8_t *)xcb_get_property_value(reply);
-   switch (prop[0]) {
-   case XCB_WM_WITHDRAWN_STATE:
-     hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
-     break;
-   case XCB_WM_NORMAL_STATE:
-     hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
-     break;
-   case XCB_WM_ICONIC_STATE:
-     hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
-     break;
-   default:
-     hint = ECORE_X_WINDOW_STATE_HINT_NONE;
-     break;
-   }
+   if (name) *name = NULL;
+   if (class) *class = NULL;
 
-   return hint;
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_class_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_get_wm_class_reply(_ecore_xcb_conn, cookie, &prop, NULL);
+#else
+   cookie = xcb_icccm_get_wm_class_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_icccm_get_wm_class_reply(_ecore_xcb_conn, cookie, &prop, NULL);
+#endif
+   if (ret == 0) return;
+
+   if (name) *name = strdup(prop.instance_name);
+   if (class) *class = strdup(prop.class_name);
+
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_class_reply_wipe(&prop);
+#else
+   xcb_icccm_get_wm_class_reply_wipe(&prop);
+#endif
 }
 
 /**
- * Sends the ClientMessage event with the DeleteWindow property.
- * @param window The window.
- * @param time   The time.
- * @ingroup Ecore_X_ICCCM_Group
+ * Set a window name & class.
+ * @param win The window
+ * @param n The name string
+ * @param c The class string
+ *
+ * Set a window name * class
  */
 EAPI void
-ecore_x_icccm_delete_window_send(Ecore_X_Window window,
-                                 Ecore_X_Time   time)
+ecore_x_icccm_name_class_set(Ecore_X_Window win,
+                             const char    *name,
+                             const char    *class)
 {
-   ecore_x_client_message32_send(window, ECORE_X_ATOM_WM_PROTOCOLS,
-                                 ECORE_X_EVENT_MASK_NONE,
-                                 ECORE_X_ATOM_WM_DELETE_WINDOW,
-                                 time, 0, 0, 0);
+   char *class_string, *s;
+   int length_name, length_class;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   length_name = strlen(name);
+   length_class = strlen(class);
+   class_string =
+     (char *)malloc(sizeof(char) * (length_name + length_class + 2));
+   if (!class_string) return;
+
+   s = class_string;
+   if (length_name)
+     {
+        strcpy(s, name);
+        s += length_name + 1;
+     }
+   else
+     *s++ = '\0';
+
+   if (length_class)
+     strcpy(s, class);
+   else
+     *s = '\0';
+
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
+                       ECORE_X_ATOM_WM_CLASS, ECORE_X_ATOM_STRING, 8,
+                       length_name + length_class + 2, (void *)class_string);
+   free(class_string);
 }
 
 /**
- * Sends the ClientMessage event with the TakeFocus property.
- * @param window The window.
- * @param time   The time.
- * @ingroup Ecore_X_ICCCM_Group
+ * Specify that a window is transient for another top-level window and should be handled accordingly.
+ * @param win the transient window
+ * @param forwin the toplevel window
  */
 EAPI void
-ecore_x_icccm_take_focus_send(Ecore_X_Window window,
-                              Ecore_X_Time   time)
+ecore_x_icccm_transient_for_set(Ecore_X_Window win,
+                                Ecore_X_Window forwindow)
 {
-   ecore_x_client_message32_send(window, ECORE_X_ATOM_WM_PROTOCOLS,
-                                 ECORE_X_EVENT_MASK_NONE,
-                                 ECORE_X_ATOM_WM_TAKE_FOCUS,
-                                 time, 0, 0, 0);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
+                       ECORE_X_ATOM_WM_TRANSIENT_FOR, ECORE_X_ATOM_WINDOW, 32,
+                       1, (void *)&forwindow);
 }
 
 /**
- * Sends the ClientMessage event with the SaveYourself property.
- * @param window The window.
- * @param time   The time.
- * @ingroup Ecore_X_ICCCM_Group
+ * Remove the transient_for setting from a window.
+ * @param win The window
  */
 EAPI void
-ecore_x_icccm_save_yourself_send(Ecore_X_Window window,
-                                 Ecore_X_Time   time)
+ecore_x_icccm_transient_for_unset(Ecore_X_Window win)
 {
-   ecore_x_client_message32_send(window, ECORE_X_ATOM_WM_PROTOCOLS,
-                                 ECORE_X_EVENT_MASK_NONE,
-                                 ECORE_X_ATOM_WM_SAVE_YOURSELF,
-                                 time, 0, 0, 0);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_property_del(win, ECORE_X_ATOM_WM_TRANSIENT_FOR);
 }
 
 /**
- * Sends the ConfigureNotify event with the StructureNotify property.
- * @param window The window.
- * @param x      The X coordinate.
- * @param y      The Y coordinate.
- * @param width  The width.
- * @param height The height.
- * @ingroup Ecore_X_ICCCM_Group
+ * Get the window this window is transient for, if any.
+ * @param win The window to check
+ * @return The window ID of the top-level window, or 0 if the property does not exist.
  */
-EAPI void
-ecore_x_icccm_move_resize_send(Ecore_X_Window window,
-                               int            x,
-                               int            y,
-                               int            width,
-                               int            height)
+EAPI Ecore_X_Window
+ecore_x_icccm_transient_for_get(Ecore_X_Window win)
 {
-   xcb_configure_notify_event_t ev;
+   Ecore_X_Window forwin = 0;
+   xcb_get_property_cookie_t cookie;
 
-   ev.response_type = XCB_CONFIGURE_NOTIFY | 0x80;
-   ev.pad0 = 0;
-   ev.sequence = 0;
-   ev.event = window;
-   ev.window = window;
-   ev.above_sibling = 0;
-   ev.x = x;
-   ev.y = y;
-   ev.width = width;
-   ev.height = height;
-   ev.border_width = 0;
-   ev.override_redirect = 0;
-   xcb_send_event(_ecore_xcb_conn, 0, window,
-                  XCB_EVENT_MASK_STRUCTURE_NOTIFY, (const char *)&ev);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_transient_for_unchecked(_ecore_xcb_conn, win);
+   xcb_get_wm_transient_for_reply(_ecore_xcb_conn, cookie, &forwin, NULL);
+#else
+   cookie = xcb_icccm_get_wm_transient_for_unchecked(_ecore_xcb_conn, win);
+   xcb_icccm_get_wm_transient_for_reply(_ecore_xcb_conn, cookie, &forwin, NULL);
+#endif
+
+   return forwin;
 }
 
 /**
- * Sets the hints of a window.
- * @param window        The window.
- * @param accepts_focus AcceptFocus hint
- * @param initial_state Initial state flags.
- * @param icon_pixmap   Icon pixmap.
- * @param icon_mask     Icon mask.
- * @param icon_window   Icon window.
- * @param window_group  Group window.
- * @param is_urgent     IsUrgent flag.
- * @ingroup Ecore_X_ICCCM_Group
+ * Get the window role.
+ * @param win The window
+ * @return The window's role string.
  */
-EAPI void
-ecore_x_icccm_hints_set(Ecore_X_Window            window,
-                       int                       accepts_focus,
-                       Ecore_X_Window_State_Hint initial_state,
-                       Ecore_X_Pixmap            icon_pixmap,
-                       Ecore_X_Pixmap            icon_mask,
-                       Ecore_X_Window            icon_window,
-                       Ecore_X_Window            window_group,
-                        int                       is_urgent)
+EAPI char *
+ecore_x_icccm_window_role_get(Ecore_X_Window win)
 {
-   xcb_wm_hints_t *hints;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   hints = xcb_alloc_wm_hints();
-   if (!hints)
-      return;
-
-   xcb_wm_hints_set_input(hints, accepts_focus);
-   if (initial_state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
-      xcb_wm_hints_set_withdrawn(hints);
-   else if (initial_state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
-      xcb_wm_hints_set_normal(hints);
-   else if (initial_state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
-      xcb_wm_hints_set_iconic(hints);
-   if (icon_pixmap != 0)
-     xcb_wm_hints_set_icon_pixmap(hints, icon_pixmap);
-   if (icon_mask != 0)
-     xcb_wm_hints_set_icon_mask(hints, icon_mask);
-   if (icon_window != 0)
-     xcb_wm_hints_set_icon_window(hints, icon_window);
-   if (window_group != 0)
-     xcb_wm_hints_set_window_group(hints, window_group);
-   if (is_urgent)
-     xcb_wm_hints_set_urgency(hints);
-   xcb_set_wm_hints(_ecore_xcb_conn, window, hints);
-   free(hints);
+   return ecore_x_window_prop_string_get(win, ECORE_X_ATOM_WM_WINDOW_ROLE);
 }
 
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
+/**
+ * Set the window role hint.
+ * @param win The window
+ * @param role The role string
  */
 EAPI void
-ecore_x_icccm_hints_get_prefetch(Ecore_X_Window window)
+ecore_x_icccm_window_role_set(Ecore_X_Window win,
+                              const char    *role)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_HINTS,
-                                       ECORE_X_ATOM_WM_HINTS,
-                                       0L, XCB_NUM_WM_HINTS_ELEMENTS);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_WM_WINDOW_ROLE, role);
 }
 
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_hints_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
+/**
+ * Get the window's client leader.
+ * @param win The window
+ * @return The window's client leader window, or 0 if unset
  */
-EAPI void
-ecore_x_icccm_hints_get_fetch(void)
+EAPI Ecore_X_Window
+ecore_x_icccm_client_leader_get(Ecore_X_Window win)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   Ecore_X_Window leader;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (ecore_x_window_prop_window_get(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
+                                      &leader, 1) > 0)
+     return leader;
+
+   return 0;
 }
 
 /**
- * Gets the hints of a window.
- * @param window        The window.
- * @param accepts_focus AcceptFocus hint
- * @param initial_state Initial state flags.
- * @param icon_pixmap   Icon pixmap.
- * @param icon_mask     Icon mask.
- * @param icon_window   Icon window.
- * @param window_group  Group window.
- * @param is_urgent     IsUrgent flag.
- * @return              1 on success, 0 otherwise.
+ * Set the window's client leader.
+ * @param win The window
+ * @param l The client leader window
  *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_hints_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_hints_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
+ * All non-transient top-level windows created by an app other than
+ * the main window must have this property set to the app's main window.
  */
-EAPI int
-ecore_x_icccm_hints_get(Ecore_X_Window             window __UNUSED__,
-                       int                       *accepts_focus,
-                       Ecore_X_Window_State_Hint *initial_state,
-                       Ecore_X_Pixmap            *icon_pixmap,
-                       Ecore_X_Pixmap            *icon_mask,
-                       Ecore_X_Window            *icon_window,
-                       Ecore_X_Window            *window_group,
-                        int                       *is_urgent)
+EAPI void
+ecore_x_icccm_client_leader_set(Ecore_X_Window win,
+                                Ecore_X_Window leader)
 {
-   xcb_wm_hints_t           *hints;
-   xcb_get_property_reply_t *reply;
-   uint32_t                  flags;
-
-   if (accepts_focus)
-      *accepts_focus = 1;
-   if (initial_state)
-      *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
-   if (icon_pixmap)
-      *icon_pixmap = 0;
-   if (icon_mask)
-      *icon_mask = 0;
-   if (icon_window)
-      *icon_window = 0;
-   if (window_group)
-      *window_group = 0;
-   if (is_urgent)
-      *is_urgent = 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if ((reply->type != ECORE_X_ATOM_WM_HINTS) ||
-       (reply->value_len < (XCB_NUM_WM_HINTS_ELEMENTS - 1)) ||
-       (reply->format != 32))
-      return 0;
+   ecore_x_window_prop_window_set(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
+                                  &leader, 1);
+}
 
-   hints = xcb_alloc_wm_hints();
-   if (!hints)
-      return 0;
+EAPI Ecore_X_Window_State_Hint
+ecore_x_icccm_state_get(Ecore_X_Window win)
+{
+   xcb_get_property_cookie_t cookie;
+   xcb_get_property_reply_t *reply;
+   Ecore_X_Window_State_Hint hint = ECORE_X_WINDOW_STATE_HINT_NONE;
+   uint8_t *prop;
 
-   memcpy(hints, xcb_get_property_value(reply), reply->value_len);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   flags = xcb_wm_hints_get_flags(hints);
-   if ((flags & XCB_WM_INPUT_HINT) && (accepts_focus))
-     {
-        if (xcb_wm_hints_get_input(hints))
-           *accepts_focus = 1;
-        else
-           *accepts_focus = 0;
-     }
-   if ((flags & XCB_WM_STATE_HINT) && (initial_state))
-     {
-       if (xcb_wm_hints_get_initial_state(hints) == XCB_WM_WITHDRAWN_STATE)
-           *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
-        else if (xcb_wm_hints_get_initial_state(hints) == XCB_WM_NORMAL_STATE)
-           *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
-        else if (xcb_wm_hints_get_initial_state(hints) == XCB_WM_ICONIC_STATE)
-           *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
-     }
-   if ((flags & XCB_WM_ICON_PIXMAP_HINT) && (icon_pixmap))
-     {
-        *icon_pixmap = xcb_wm_hints_get_icon_pixmap(hints);
-     }
-   if ((flags & XCB_WM_ICON_MASK_HINT) && (icon_mask))
-     {
-        *icon_mask = xcb_wm_hints_get_icon_mask(hints);
-     }
-   if ((flags & XCB_WM_ICON_WINDOW_HINT) && (icon_window))
+   cookie =
+     xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
+                                ECORE_X_ATOM_WM_STATE, ECORE_X_ATOM_WM_STATE,
+                                0L, 0x7fffffff);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return hint;
+   if ((reply->type == 0) || (reply->format != 8) || (reply->value_len != 2))
      {
-        *icon_window = xcb_wm_hints_get_icon_window(hints);
+        free(reply);
+        return hint;
      }
-   if ((flags & XCB_WM_WINDOW_GROUP_HINT) && (window_group))
+
+   prop = (uint8_t *)xcb_get_property_value(reply);
+#ifdef OLD_XCB_VERSION
+   switch (prop[0])
      {
-        if (reply->value_len < XCB_NUM_WM_HINTS_ELEMENTS)
-           *window_group = 0;
-        else
-           *window_group = xcb_wm_hints_get_window_group(hints);
+      case XCB_WM_STATE_WITHDRAWN:
+        hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
+        break;
+
+      case XCB_WM_STATE_NORMAL:
+        hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+        break;
+
+      case XCB_WM_STATE_ICONIC:
+        hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
+        break;
+
+      default:
+        break;
      }
-   if ((flags & XCB_WM_X_URGENCY_HINT) && (is_urgent))
+#else
+   switch (prop[0])
      {
-        *is_urgent = 1;
-     }
+      case XCB_ICCCM_WM_STATE_WITHDRAWN:
+        hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
+        break;
 
-   free(hints);
+      case XCB_ICCCM_WM_STATE_NORMAL:
+        hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+        break;
 
-   return 1;
-}
+      case XCB_ICCCM_WM_STATE_ICONIC:
+        hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
+        break;
 
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_size_pos_hints_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+      default:
+        break;
+     }
+#endif
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_NORMAL_HINTS,
-                                       ECORE_X_ATOM_WM_SIZE_HINTS,
-                                       0L, 18);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   free(reply);
+   return hint;
 }
 
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_size_pos_hints_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
 EAPI void
-ecore_x_icccm_size_pos_hints_get_fetch(void)
+ecore_x_icccm_state_set(Ecore_X_Window            win,
+                        Ecore_X_Window_State_Hint state)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+#ifdef OLD_XCB_VERSION
+   xcb_wm_hints_t hints;
+#else
+   xcb_icccm_wm_hints_t hints;
+#endif
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef OLD_XCB_VERSION
+   xcb_wm_hints_set_none(&hints);
+
+   hints.flags = XCB_WM_HINT_STATE;
+
+   if (state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
+     xcb_wm_hints_set_withdrawn(&hints);
+   else if (state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
+     xcb_wm_hints_set_normal(&hints);
+   else if (state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
+     xcb_wm_hints_set_iconic(&hints);
+
+   xcb_set_wm_hints(_ecore_xcb_conn, win, &hints);
+#else
+   xcb_icccm_wm_hints_set_none(&hints);
+
+   hints.flags = XCB_ICCCM_WM_HINT_STATE;
+
+   if (state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
+     xcb_icccm_wm_hints_set_withdrawn(&hints);
+   else if (state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
+     xcb_icccm_wm_hints_set_normal(&hints);
+   else if (state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
+     xcb_icccm_wm_hints_set_iconic(&hints);
+
+   xcb_icccm_set_wm_hints(_ecore_xcb_conn, win, &hints);
+#endif
 }
 
-/**
- * Sets the hints of a window.
- * @param window      The window.
- * @param request_pos Request position flag.
- * @param gravity     Gravity.
- * @param min_w       Minimum width.
- * @param min_h       Minimum height.
- * @param max_w       Maximum width.
- * @param max_h       Maximum height.
- * @param base_w      Base width
- * @param base_h      Base height
- * @param step_x      X step coordinate.
- * @param step_y      Y step coordinate.
- * @param min_aspect  Minimum aspect ratio.
- * @param max_aspect  Maximum aspect ratio.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_size_pos_hints_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_size_pos_hints_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
 EAPI void
-ecore_x_icccm_size_pos_hints_set(Ecore_X_Window  window,
-                                 int             request_pos,
-                                Ecore_X_Gravity gravity,
-                                int             min_w,
-                                 int             min_h,
-                                int             max_w,
-                                 int             max_h,
-                                int             base_w,
-                                 int             base_h,
-                                int             step_x,
-                                 int             step_y,
-                                double          min_aspect,
-                                 double          max_aspect)
+ecore_x_icccm_delete_window_send(Ecore_X_Window win,
+                                 Ecore_X_Time   t)
 {
-   xcb_size_hints_t         *hint;
-   xcb_get_property_reply_t *reply;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
+                                 ECORE_X_EVENT_MASK_NONE,
+                                 ECORE_X_ATOM_WM_DELETE_WINDOW, t, 0, 0, 0);
+}
 
-   hint = xcb_alloc_size_hints();
-   if (!hint)
-      return;
+EAPI void
+ecore_x_icccm_hints_set(Ecore_X_Window            win,
+                        Eina_Bool                 accepts_focus,
+                        Ecore_X_Window_State_Hint initial_state,
+                        Ecore_X_Pixmap            icon_pixmap,
+                        Ecore_X_Pixmap            icon_mask,
+                        Ecore_X_Window            icon_window,
+                        Ecore_X_Window            window_group,
+                        Eina_Bool                 is_urgent)
+{
+#ifdef OLD_XCB_VERSION
+   xcb_wm_hints_t hints;
+#else
+   xcb_icccm_wm_hints_t hints;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply                                      ||
-       (reply->type != ECORE_X_ATOM_WM_SIZE_HINTS) ||
-       ((reply->format != 8)   &&
-        (reply->format != 16)  &&
-        (reply->format != 32))                     ||
-       (reply->value_len < 15))
-      return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   xcb_size_hints_set_flags(hint, 0);
-   if (request_pos)
+#ifdef OLD_XCB_VERSION
+   xcb_wm_hints_set_none(&hints);
+   xcb_wm_hints_set_input(&hints, accepts_focus);
+
+   if (initial_state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
+     xcb_wm_hints_set_withdrawn(&hints);
+   else if (initial_state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
+     xcb_wm_hints_set_normal(&hints);
+   else if (initial_state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
+     xcb_wm_hints_set_iconic(&hints);
+
+   if (icon_pixmap != 0) xcb_wm_hints_set_icon_pixmap(&hints, icon_pixmap);
+   if (icon_mask != 0) xcb_wm_hints_set_icon_mask(&hints, icon_mask);
+   if (icon_window != 0) xcb_wm_hints_set_icon_window(&hints, icon_window);
+   if (window_group != 0) xcb_wm_hints_set_window_group(&hints, window_group);
+   if (is_urgent) xcb_wm_hints_set_urgency(&hints);
+
+   xcb_set_wm_hints(_ecore_xcb_conn, win, &hints);
+#else
+   xcb_icccm_wm_hints_set_none(&hints);
+   xcb_icccm_wm_hints_set_input(&hints, accepts_focus);
+
+   if (initial_state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
+     xcb_icccm_wm_hints_set_withdrawn(&hints);
+   else if (initial_state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
+     xcb_icccm_wm_hints_set_normal(&hints);
+   else if (initial_state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
+     xcb_icccm_wm_hints_set_iconic(&hints);
+
+   if (icon_pixmap != 0)
+     xcb_icccm_wm_hints_set_icon_pixmap(&hints, icon_pixmap);
+   if (icon_mask != 0)
+     xcb_icccm_wm_hints_set_icon_mask(&hints, icon_mask);
+   if (icon_window != 0)
+     xcb_icccm_wm_hints_set_icon_window(&hints, icon_window);
+   if (window_group != 0)
+     xcb_icccm_wm_hints_set_window_group(&hints, window_group);
+   if (is_urgent)
+     xcb_icccm_wm_hints_set_urgency(&hints);
+
+   xcb_icccm_set_wm_hints(_ecore_xcb_conn, win, &hints);
+#endif
+}
+
+EAPI Eina_Bool
+ecore_x_icccm_hints_get(Ecore_X_Window             win,
+                        Eina_Bool                 *accepts_focus,
+                        Ecore_X_Window_State_Hint *initial_state,
+                        Ecore_X_Pixmap            *icon_pixmap,
+                        Ecore_X_Pixmap            *icon_mask,
+                        Ecore_X_Window            *icon_window,
+                        Ecore_X_Window            *window_group,
+                        Eina_Bool                 *is_urgent)
+{
+   xcb_get_property_cookie_t cookie;
+#ifdef OLD_XCB_VERSION
+   xcb_wm_hints_t hints;
+#else
+   xcb_icccm_wm_hints_t hints;
+#endif
+   uint8_t ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (accepts_focus) *accepts_focus = EINA_TRUE;
+   if (initial_state) *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+   if (icon_pixmap) *icon_pixmap = 0;
+   if (icon_mask) *icon_mask = 0;
+   if (icon_window) *icon_window = 0;
+   if (window_group) *window_group = 0;
+   if (is_urgent) *is_urgent = EINA_FALSE;
+
+#ifdef OLD_XCB_VERSION
+   xcb_wm_hints_set_none(&hints);
+   cookie = xcb_get_wm_hints_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_get_wm_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
+#else
+   xcb_icccm_wm_hints_set_none(&hints);
+   cookie = xcb_icccm_get_wm_hints_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_icccm_get_wm_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
+#endif
+   if (!ret) return EINA_FALSE;
+
+#ifdef OLD_XCB_VERSION
+   if ((hints.flags & XCB_WM_HINT_INPUT) && (accepts_focus))
+#else
+   if ((hints.flags & XCB_ICCCM_WM_HINT_INPUT) && (accepts_focus))
+#endif
      {
-       xcb_size_hints_set_flags(hint, XCB_SIZE_US_POSITION_HINT);
+        if (hints.input)
+          *accepts_focus = EINA_TRUE;
+        else
+          *accepts_focus = EINA_FALSE;
      }
-   if (gravity != ECORE_X_GRAVITY_NW)
+
+#ifdef OLD_XCB_VERSION
+   if ((hints.flags & XCB_WM_HINT_STATE) && (initial_state))
      {
-       xcb_size_hints_set_win_gravity(hint, (uint8_t)gravity);
+        if (hints.initial_state == XCB_WM_STATE_WITHDRAWN)
+          *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
+        else if (hints.initial_state == XCB_WM_STATE_NORMAL)
+          *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+        else if (hints.initial_state == XCB_WM_STATE_ICONIC)
+          *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
      }
-   if ((min_w > 0) || (min_h > 0))
+
+   if ((hints.flags & XCB_WM_HINT_ICON_PIXMAP) && (icon_pixmap))
+     *icon_pixmap = hints.icon_pixmap;
+
+   if ((hints.flags & XCB_WM_HINT_ICON_MASK) && (icon_mask))
+     *icon_mask = hints.icon_mask;
+
+   if ((hints.flags & XCB_WM_HINT_ICON_WINDOW) && (icon_window))
+     *icon_window = hints.icon_window;
+
+   if ((hints.flags & XCB_WM_HINT_WINDOW_GROUP) && (window_group))
+     *window_group = hints.window_group;
+
+   if ((hints.flags & XCB_WM_HINT_X_URGENCY) && (is_urgent))
+     *is_urgent = EINA_TRUE;
+#else
+   if ((hints.flags & XCB_ICCCM_WM_HINT_STATE) && (initial_state))
      {
-       xcb_size_hints_set_min_size(hint, min_w, min_h);
+        if (hints.initial_state == XCB_ICCCM_WM_STATE_WITHDRAWN)
+          *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
+        else if (hints.initial_state == XCB_ICCCM_WM_STATE_NORMAL)
+          *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+        else if (hints.initial_state == XCB_ICCCM_WM_STATE_ICONIC)
+          *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
      }
-   if ((max_w > 0) || (max_h > 0))
+
+   if ((hints.flags & XCB_ICCCM_WM_HINT_ICON_PIXMAP) && (icon_pixmap))
+     *icon_pixmap = hints.icon_pixmap;
+
+   if ((hints.flags & XCB_ICCCM_WM_HINT_ICON_MASK) && (icon_mask))
+     *icon_mask = hints.icon_mask;
+
+   if ((hints.flags & XCB_ICCCM_WM_HINT_ICON_WINDOW) && (icon_window))
+     *icon_window = hints.icon_window;
+
+   if ((hints.flags & XCB_ICCCM_WM_HINT_WINDOW_GROUP) && (window_group))
+     *window_group = hints.window_group;
+
+   if ((hints.flags & XCB_ICCCM_WM_HINT_X_URGENCY) && (is_urgent))
+     *is_urgent = EINA_TRUE;
+#endif
+
+   return EINA_TRUE;
+}
+
+/**
+ * Get a window icon name.
+ * @param win The window
+ * @return The windows icon name string
+ *
+ * Return the icon name of a window. String must be free'd when done with.
+ */
+EAPI char *
+ecore_x_icccm_icon_name_get(Ecore_X_Window win)
+{
+   xcb_get_property_cookie_t cookie;
+#ifdef OLD_XCB_VERSION
+   xcb_get_text_property_reply_t prop;
+#else
+   xcb_icccm_get_text_property_reply_t prop;
+#endif
+   uint8_t ret = 0;
+   char *tmp = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return NULL;
+
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_icon_name_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_get_wm_icon_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
+#else
+   cookie = xcb_icccm_get_wm_icon_name_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_icccm_get_wm_icon_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
+#endif
+   if (ret == 0) return NULL;
+
+   if (prop.name_len < 1)
      {
-       xcb_size_hints_set_max_size(hint, max_w, max_h);
+#ifdef OLD_XCB_VERSION
+        xcb_get_text_property_reply_wipe(&prop);
+#else
+        xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+        return NULL;
      }
-   if ((base_w > 0) || (base_h > 0))
+
+   if (!(tmp = malloc((prop.name_len + 1) * sizeof(char *))))
      {
-       xcb_size_hints_set_base_size(hint, base_w, base_h);
+#ifdef OLD_XCB_VERSION
+        xcb_get_text_property_reply_wipe(&prop);
+#else
+        xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+        return NULL;
      }
-   if ((step_x > 1) || (step_y > 1))
+   memcpy(tmp, prop.name, sizeof(char *) * prop.name_len);
+   tmp[prop.name_len] = '\0';
+
+   if (prop.encoding != ECORE_X_ATOM_UTF8_STRING)
      {
-       xcb_size_hints_set_resize_inc(hint, step_x, step_y);
+        Ecore_Xcb_Textproperty tp;
+        int count = 0;
+        char **list = NULL;
+        Eina_Bool ret = EINA_FALSE;
+
+        tp.value = strdup(tmp);
+        tp.nitems = prop.name_len;
+        tp.encoding = prop.encoding;
+#ifdef HAVE_ICONV
+        ret = _ecore_xcb_utf8_textproperty_to_textlist(&tp, &list, &count);
+#else
+        ret = _ecore_xcb_mb_textproperty_to_textlist(&tp, &list, &count);
+#endif
+        if (ret)
+          {
+             if (count > 0)
+               tmp = strdup(list[0]);
+
+             if (list) free(list);
+          }
      }
-   if ((min_aspect > 0.0) || (max_aspect > 0.0))
+
+#ifdef OLD_XCB_VERSION
+   xcb_get_text_property_reply_wipe(&prop);
+#else
+   xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+   return tmp;
+}
+
+/**
+ * Set a window icon name.
+ * @param win The window
+ * @param t The icon name string
+ *
+ * Set a window icon name
+ */
+EAPI void
+ecore_x_icccm_icon_name_set(Ecore_X_Window win,
+                            const char    *name)
+{
+   Ecore_Xcb_Textproperty prop;
+   char *list[1];
+   Eina_Bool ret = EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!win) || (!name)) return;
+
+   prop.value = NULL;
+   list[0] = strdup(name);
+
+#ifdef HAVE_ICONV
+   ret = _ecore_xcb_utf8_textlist_to_textproperty(list, 1, XcbUTF8StringStyle,
+                                                  &prop);
+#else
+   ret = _ecore_xcb_mb_textlist_to_textproperty(list, 1, XcbStdICCTextStyle,
+                                                &prop);
+#endif
+
+   if (ret)
      {
-       xcb_size_hints_set_aspect(hint,
-                                  (int32_t)(min_aspect * 10000),
-                                  10000,
-                                  (int32_t)(max_aspect * 10000),
-                                  10000);
+#ifdef OLD_XCB_VERSION
+        xcb_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
+                             strlen(prop.value), prop.value);
+#else
+        xcb_icccm_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
+                                   8, strlen(prop.value), prop.value);
+#endif
+        if (prop.value) free(prop.value);
      }
-   xcb_set_wm_normal_hints(_ecore_xcb_conn, window, hint);
+   else
+#ifdef OLD_XCB_VERSION
+     xcb_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
+                          strlen(name), name);
+#else
+     xcb_icccm_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
+                                8, strlen(name), name);
+#endif
+
+   free(list[0]);
+}
+
+EAPI void
+ecore_x_icccm_iconic_request_send(Ecore_X_Window win,
+                                  Ecore_X_Window root)
+{
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   free(hint);
+   if (!win) return;
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_WM_CHANGE_STATE;
+#ifdef OLD_XCB_VERSION
+   ev.data.data32[0] = XCB_WM_STATE_ICONIC;
+#else
+   ev.data.data32[0] = XCB_ICCCM_WM_STATE_ICONIC;
+#endif
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT),
+                  (const char *)&ev);
+//   ecore_x_flush();
 }
 
 /**
- * Gets the hints of a window.
- * @param window      The window.
- * @param request_pos Request position flag.
- * @param gravity     Gravity.
- * @param min_w       Minimum width.
- * @param min_h       Minimum height.
- * @param max_w       Maximum width.
- * @param max_h       Maximum height.
- * @param base_w      Base width
- * @param base_h      Base height
- * @param step_x      X step coordinate.
- * @param step_y      Y step coordinate.
- * @param min_aspect  Minimum aspect ratio.
- * @param max_aspect  M
- * @return            1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_size_pos_hints_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_size_pos_hints_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
+ * Set or unset a wm protocol property.
+ * @param win The Window
+ * @param protocol The protocol to enable/disable
+ * @param on On/Off
+ */
+EAPI void
+ecore_x_icccm_protocol_set(Ecore_X_Window      win,
+                           Ecore_X_WM_Protocol protocol,
+                           Eina_Bool           on)
+{
+   Ecore_X_Atom proto;
+   xcb_get_property_cookie_t cookie;
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_t protos;
+#else
+   xcb_icccm_get_wm_protocols_reply_t protos;
+#endif
+   int i = 0, count = 0, set = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (protocol >= ECORE_X_WM_PROTOCOL_NUM) return;
+   proto = _ecore_xcb_atoms_wm_protocol[protocol];
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
+   if (!xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL))
+#else
+   cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
+   if (!xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL))
+#endif
+     count = 0;
+   else
+     count = protos.atoms_len;
+
+   for (i = 0; i < count; i++)
+     {
+        if (protos.atoms[i] == proto)
+          {
+             set = 1;
+             break;
+          }
+     }
+
+   if (on)
+     {
+        if (!set)
+          {
+             Ecore_X_Atom *atoms = NULL;
+
+             atoms = malloc((count + 1) * sizeof(Ecore_X_Atom));
+             if (atoms)
+               {
+                  for (i = 0; i < count; i++)
+                    atoms[i] = protos.atoms[i];
+                  atoms[count] = proto;
+#ifdef OLD_XCB_VERSION
+                  xcb_set_wm_protocols(_ecore_xcb_conn,
+                                       ECORE_X_ATOM_WM_PROTOCOLS,
+                                       win, count, atoms);
+#else
+                  xcb_icccm_set_wm_protocols(_ecore_xcb_conn, win, 
+                                             ECORE_X_ATOM_WM_PROTOCOLS,
+                                             count, atoms);
+#endif
+                  free(atoms);
+               }
+          }
+     }
+   else
+     {
+        if (set)
+          {
+             for (i = 0; i < count; i++)
+               {
+                  if (protos.atoms[i] == proto)
+                    {
+                       int j = 0;
+
+                       for (j = (i + 1); j < count; j++)
+                         protos.atoms[j - 1] = protos.atoms[j];
+                       if (count > 1)
+#ifdef OLD_XCB_VERSION
+                         xcb_set_wm_protocols(_ecore_xcb_conn,
+                                              ECORE_X_ATOM_WM_PROTOCOLS,
+                                              win, count - 1, protos.atoms);
+#else
+                         xcb_icccm_set_wm_protocols(_ecore_xcb_conn, win, 
+                                                    ECORE_X_ATOM_WM_PROTOCOLS,
+                                                    count - 1, protos.atoms);
+#endif
+                       else
+                         ecore_x_window_prop_property_del(win,
+                                                          ECORE_X_ATOM_WM_PROTOCOLS);
+                       break;
+                    }
+               }
+          }
+     }
+
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_wipe(&protos);
+#else
+   xcb_icccm_get_wm_protocols_reply_wipe(&protos);
+#endif
+}
+
+/**
+ * Determines whether a protocol is set for a window.
+ * @param win The Window
+ * @param protocol The protocol to query
+ * @return 1 if the protocol is set, else 0.
+ */
+EAPI Eina_Bool
+ecore_x_icccm_protocol_isset(Ecore_X_Window      win,
+                             Ecore_X_WM_Protocol protocol)
+{
+   Ecore_X_Atom proto;
+   Eina_Bool ret = EINA_FALSE;
+   xcb_get_property_cookie_t cookie;
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_t reply;
+#else
+   xcb_icccm_get_wm_protocols_reply_t reply;
+#endif
+   uint8_t val = 0;
+   unsigned int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (protocol >= ECORE_X_WM_PROTOCOL_NUM) return EINA_FALSE;
+
+   proto = _ecore_xcb_atoms_wm_protocol[protocol];
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
+   val = xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &reply, NULL);
+#else
+   cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
+   val = xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &reply, NULL);
+#endif
+   if (!val) return EINA_FALSE;
+
+   for (i = 0; i < reply.atoms_len; i++)
+     if (reply.atoms[i] == proto)
+       {
+          ret = EINA_TRUE;
+          break;
+       }
+
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_wipe(&reply);
+#else
+   xcb_icccm_get_wm_protocols_reply_wipe(&reply);
+#endif
+
+   return ret;
+}
+
+/**
+ * Set protocol atoms explicitly
+ * @param win The Window
+ * @param protos An array of protocol atoms
+ * @param num the number of members of the array
  */
-EAPI int
-ecore_x_icccm_size_pos_hints_get(Ecore_X_Window   window __UNUSED__,
-                                 int             *request_pos,
+EAPI void
+ecore_x_icccm_protocol_atoms_set(Ecore_X_Window win,
+                                 Ecore_X_Atom  *protos,
+                                 int            num)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (num > 0)
+#ifdef OLD_XCB_VERSION
+     xcb_set_wm_protocols(_ecore_xcb_conn, ECORE_X_ATOM_WM_PROTOCOLS,
+                          win, num, protos);
+#else
+     xcb_icccm_set_wm_protocols(_ecore_xcb_conn, win, 
+                                ECORE_X_ATOM_WM_PROTOCOLS, num, protos);
+#endif
+   else
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_WM_PROTOCOLS);
+}
+
+EAPI Eina_Bool
+ecore_x_icccm_size_pos_hints_get(Ecore_X_Window   win,
+                                 Eina_Bool       *request_pos,
                                  Ecore_X_Gravity *gravity,
                                  int             *min_w,
                                  int             *min_h,
@@ -588,21 +1156,19 @@ ecore_x_icccm_size_pos_hints_get(Ecore_X_Window   window __UNUSED__,
                                  double          *min_aspect,
                                  double          *max_aspect)
 {
-   xcb_size_hints_t         *hint;
-   xcb_get_property_reply_t *reply;
-   uint32_t                  flags;
-   int32_t                   minw = 0;
-   int32_t                   minh = 0;
-   int32_t                   maxw = 32767;
-   int32_t                   maxh = 32767;
-   int32_t                   basew = -1;
-   int32_t                   baseh = -1;
-   int32_t                   stepx = -1;
-   int32_t                   stepy = -1;
-   double                    mina = 0.0;
-   double                    maxa = 0.0;
-
-   if (request_pos) *request_pos = 0;
+   xcb_size_hints_t hints;
+   xcb_get_property_cookie_t cookie;
+   uint8_t ret = 0;
+   int32_t minw = 0, minh = 0;
+   int32_t maxw = 32767, maxh = 32767;
+   int32_t basew = -1, baseh = -1;
+   int32_t stepx = -1, stepy = -1;
+   double mina = 0.0, maxa = 0.0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (request_pos) *request_pos = EINA_FALSE;
    if (gravity) *gravity = ECORE_X_GRAVITY_NW;
    if (min_w) *min_w = minw;
    if (min_h) *min_h = minh;
@@ -615,1299 +1181,389 @@ ecore_x_icccm_size_pos_hints_get(Ecore_X_Window   window __UNUSED__,
    if (min_aspect) *min_aspect = mina;
    if (max_aspect) *max_aspect = maxa;
 
-
-   hint = xcb_alloc_size_hints();
-   if (!hint) return 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return 0;
-
-   if (!_ecore_x_icccm_size_hints_get(reply, ECORE_X_ATOM_WM_NORMAL_HINTS, hint))
-     return 0;
-
-   flags = xcb_size_hints_get_flags(hint);
-     if ((flags & XCB_SIZE_US_POSITION_HINT) || (flags & XCB_SIZE_P_POSITION_HINT))
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
+#else
+   cookie = xcb_icccm_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_icccm_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie,
+                                             &hints, NULL);
+#endif
+   if (!ret) return EINA_FALSE;
+
+#ifdef OLD_XCB_VERSION
+   if ((hints.flags & XCB_SIZE_HINT_US_POSITION) ||
+       (hints.flags & XCB_SIZE_HINT_P_POSITION))
+#else
+   if ((hints.flags & XCB_ICCCM_SIZE_HINT_US_POSITION) ||
+       (hints.flags & XCB_ICCCM_SIZE_HINT_P_POSITION))
+#endif
      {
-       if (request_pos)
-          *request_pos = 1;
+        if (request_pos) *request_pos = EINA_TRUE;
      }
-   if (flags & XCB_SIZE_P_WIN_GRAVITY_HINT)
+
+#ifdef OLD_XCB_VERSION
+   if (hints.flags & XCB_SIZE_HINT_P_WIN_GRAVITY)
+#else
+   if (hints.flags & XCB_ICCCM_SIZE_HINT_P_WIN_GRAVITY)
+#endif
      {
-       if (gravity)
-          *gravity = xcb_size_hints_get_win_gravity(hint);
+        if (gravity) *gravity = hints.win_gravity;
      }
-   if (flags & XCB_SIZE_P_MIN_SIZE_HINT)
+
+#ifdef OLD_XCB_VERSION
+   if (hints.flags & XCB_SIZE_HINT_P_MIN_SIZE)
+#else
+   if (hints.flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE)
+#endif
      {
-       xcb_size_hints_get_min_size(hint, &minw, &minh);
+        minw = hints.min_width;
+        minh = hints.min_height;
      }
-   if (flags & XCB_SIZE_P_MAX_SIZE_HINT)
+
+#ifdef OLD_XCB_VERSION
+   if (hints.flags & XCB_SIZE_HINT_P_MAX_SIZE)
+#else
+   if (hints.flags & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE)
+#endif
      {
-       xcb_size_hints_get_max_size(hint, &maxw, &maxh);
-       if (maxw < minw)
-          maxw = minw;
-       if (maxh < minh)
-          maxh = minh;
+        maxw = hints.max_width;
+        maxh = hints.max_height;
+        if (maxw < minw) maxw = minw;
+        if (maxh < minh) maxh = minh;
      }
-   if (flags & XCB_SIZE_BASE_SIZE_HINT)
+
+#ifdef OLD_XCB_VERSION
+   if (hints.flags & XCB_SIZE_HINT_BASE_SIZE)
+#else
+   if (hints.flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE)
+#endif
      {
-       xcb_size_hints_get_base_size(hint, &basew, &baseh);
-       if (basew > minw)
-          minw = basew;
-       if (baseh > minh)
-          minh = baseh;
+        basew = hints.base_width;
+        baseh = hints.base_height;
+        if (basew > minw) minw = basew;
+        if (baseh > minh) minh = baseh;
      }
-   if (flags & XCB_SIZE_P_RESIZE_INC_HINT)
+
+#ifdef OLD_XCB_VERSION
+   if (hints.flags & XCB_SIZE_HINT_P_RESIZE_INC)
+#else
+   if (hints.flags & XCB_ICCCM_SIZE_HINT_P_RESIZE_INC)
+#endif
      {
-       xcb_size_hints_get_increase(hint, &stepx, &stepy);
-       if (stepx < 1)
-          stepx = 1;
-       if (stepy < 1)
-          stepy = 1;
+        stepx = hints.width_inc;
+        stepy = hints.height_inc;
+        if (stepx < 1) stepx = 1;
+        if (stepy < 1) stepy = 1;
      }
-   if (flags & XCB_SIZE_P_ASPECT_HINT)
+
+#ifdef OLD_XCB_VERSION
+   if (hints.flags & XCB_SIZE_HINT_P_ASPECT)
+#else
+   if (hints.flags & XCB_ICCCM_SIZE_HINT_P_ASPECT)
+#endif
      {
-        int32_t min_aspect_num;
-        int32_t min_aspect_den;
-        int32_t max_aspect_num;
-        int32_t max_aspect_den;
-
-        xcb_size_hints_get_min_aspect(hint, &min_aspect_num, &min_aspect_den);
-       if (min_aspect_den > 0)
-          mina = ((double)min_aspect_num) / ((double)min_aspect_den);
-        xcb_size_hints_get_max_aspect(hint, &max_aspect_num, &max_aspect_den);
-       if (max_aspect_den > 0)
-          maxa = ((double)max_aspect_num) / ((double)max_aspect_den);
+        if (hints.min_aspect_den > 0)
+          mina = ((double)hints.min_aspect_num) / ((double)hints.min_aspect_den);
+
+        if (hints.max_aspect_den > 0)
+          maxa = ((double)hints.max_aspect_num) / ((double)hints.max_aspect_den);
      }
 
-   if (min_w)
-      *min_w = minw;
-   if (min_h)
-      *min_h = minh;
-   if (max_w)
-      *max_w = maxw;
-   if (max_h)
-      *max_h = maxh;
-   if (base_w)
-      *base_w = basew;
-   if (base_h)
-      *base_h = baseh;
-   if (step_x)
-      *step_x = stepx;
-   if (step_y)
-      *step_y = stepy;
-   if (min_aspect)
-      *min_aspect = mina;
-   if (max_aspect)
-      *max_aspect = maxa;
-
-   free(hint);
-
-   return 1;
-}
+   if (min_w) *min_w = minw;
+   if (min_h) *min_h = minh;
+   if (max_w) *max_w = maxw;
+   if (max_h) *max_h = maxh;
+   if (base_w) *base_w = basew;
+   if (base_h) *base_h = baseh;
+   if (step_x) *step_x = stepx;
+   if (step_y) *step_y = stepy;
+   if (min_aspect) *min_aspect = mina;
+   if (max_aspect) *max_aspect = maxa;
 
-/**
- * Set the title of a window
- * @param window The window.
- * @param title  The title.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_title_set(Ecore_X_Window window,
-                        const char    *title)
-{
-   /* FIXME: to do:  utf8 */
-
-/*    xprop.value = NULL; */
-/* #ifdef X_HAVE_UTF8_STRING */
-/*    list[0] = strdup(t); */
-/*    ret = */
-/*       Xutf8TextListToTextProperty(_ecore_xcb_conn, list, 1, XUTF8StringStyle, */
-/*                               &xprop); */
-/* #else */
-/*    list[0] = strdup(t); */
-/*    ret = */
-/*       XmbTextListToTextProperty(_ecore_xcb_conn, list, 1, XStdICCTextStyle, */
-/*                             &xprop); */
-/* #endif */
-
-  xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                      ECORE_X_ATOM_WM_NAME, ECORE_X_ATOM_STRING, 8,
-                      strlen(title), title);
+   return EINA_TRUE;
 }
 
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
 EAPI void
-ecore_x_icccm_title_get_prefetch(Ecore_X_Window window)
+ecore_x_icccm_size_pos_hints_set(Ecore_X_Window  win,
+                                 Eina_Bool       request_pos,
+                                 Ecore_X_Gravity gravity,
+                                 int             min_w,
+                                 int             min_h,
+                                 int             max_w,
+                                 int             max_h,
+                                 int             base_w,
+                                 int             base_h,
+                                 int             step_x,
+                                 int             step_y,
+                                 double          min_aspect,
+                                 double          max_aspect)
 {
    xcb_get_property_cookie_t cookie;
+   xcb_size_hints_t hints;
+   uint8_t ret = 0;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_NAME,
-                                       XCB_GET_PROPERTY_TYPE_ANY,
-                                       0L, 128);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
+#else
+   cookie = xcb_icccm_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_icccm_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie,
+                                             &hints, NULL);
+#endif
+   if (!ret) memset(&hints, 0, sizeof(xcb_size_hints_t));
+
+   hints.flags = 0;
+
+#ifdef OLD_XCB_VERSION
+   if (request_pos)
+     hints.flags |= XCB_SIZE_HINT_US_POSITION;
+
+   if (gravity != ECORE_X_GRAVITY_NW)
+     xcb_size_hints_set_win_gravity(&hints, gravity);
+   if ((min_w > 0) || (min_h > 0))
+     xcb_size_hints_set_min_size(&hints, min_w, min_h);
+   if ((max_w > 0) || (max_h > 0))
+     xcb_size_hints_set_max_size(&hints, max_w, max_h);
+   if ((base_w > 0) || (base_h > 0))
+     xcb_size_hints_set_base_size(&hints, base_w, base_h);
+   if ((step_x > 1) || (step_y > 1))
+     xcb_size_hints_set_resize_inc(&hints, step_x, step_y);
+   if ((min_aspect > 0.0) || (max_aspect > 0.0))
+     xcb_size_hints_set_aspect(&hints,
+                               (int32_t)(min_aspect * 10000), 10000,
+                               (int32_t)(max_aspect * 10000), 10000);
+
+   xcb_set_wm_normal_hints(_ecore_xcb_conn, win, &hints);
+#else
+   if (request_pos)
+     hints.flags |= XCB_ICCCM_SIZE_HINT_US_POSITION;
+
+   if (gravity != ECORE_X_GRAVITY_NW)
+     xcb_icccm_size_hints_set_win_gravity(&hints, gravity);
+   if ((min_w > 0) || (min_h > 0))
+     xcb_icccm_size_hints_set_min_size(&hints, min_w, min_h);
+   if ((max_w > 0) || (max_h > 0))
+     xcb_icccm_size_hints_set_max_size(&hints, max_w, max_h);
+   if ((base_w > 0) || (base_h > 0))
+     xcb_icccm_size_hints_set_base_size(&hints, base_w, base_h);
+   if ((step_x > 1) || (step_y > 1))
+     xcb_icccm_size_hints_set_resize_inc(&hints, step_x, step_y);
+   if ((min_aspect > 0.0) || (max_aspect > 0.0))
+     xcb_icccm_size_hints_set_aspect(&hints,
+                                     (int32_t)(min_aspect * 10000), 10000,
+                                     (int32_t)(max_aspect * 10000), 10000);
+
+   xcb_icccm_set_wm_normal_hints(_ecore_xcb_conn, win, &hints);
+#endif
 }
 
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_title_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
 EAPI void
-ecore_x_icccm_title_get_fetch(void)
+ecore_x_icccm_move_resize_send(Ecore_X_Window win,
+                               int            x,
+                               int            y,
+                               int            w,
+                               int            h)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   xcb_configure_notify_event_t ev;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+
+   memset(&ev, 0, sizeof(xcb_configure_notify_event_t));
+
+   ev.response_type = XCB_CONFIGURE_NOTIFY;
+   ev.event = win;
+   ev.window = win;
+   ev.above_sibling = XCB_NONE;
+   ev.x = x;
+   ev.y = y;
+   ev.width = w;
+   ev.height = h;
+   ev.border_width = 0;
+   ev.override_redirect = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_STRUCTURE_NOTIFY, (const char *)&ev);
+//   ecore_x_flush();
 }
 
 /**
- * Gets the title of a window.
- * @param window The window (Unused).
- * @return       The title of the window
+ * Get a window client machine string.
+ * @param win The window
+ * @return The windows client machine string
  *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_title_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_title_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
+ * Return the client machine of a window. String must be free'd when done with.
  */
 EAPI char *
-ecore_x_icccm_title_get(Ecore_X_Window window __UNUSED__)
+ecore_x_icccm_client_machine_get(Ecore_X_Window win)
 {
-   char                     *title = NULL;
-   xcb_get_property_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return NULL;
-
-   if (reply->type == ECORE_X_ATOM_UTF8_STRING)
-     {
-        int length;
-
-        /* FIXME: verify the value of length */
-        length = (reply->value_len * reply->format) / 8;
-        title = (char *)malloc((length + 1) * sizeof(char));
-        memcpy(title, xcb_get_property_value(reply), length);
-        title[length] = '\0';
-     }
-   /* not in UTF8, so we convert */
-   else
+   xcb_get_property_cookie_t cookie;
+#ifdef OLD_XCB_VERSION
+   xcb_get_text_property_reply_t prop;
+#else
+   xcb_icccm_get_text_property_reply_t prop;
+#endif
+   uint8_t ret = 0;
+   char *tmp = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_client_machine_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_get_wm_client_machine_reply(_ecore_xcb_conn, cookie, &prop, NULL);
+#else
+   cookie = xcb_icccm_get_wm_client_machine_unchecked(_ecore_xcb_conn, win);
+   ret = xcb_icccm_get_wm_client_machine_reply(_ecore_xcb_conn, cookie,
+                                               &prop, NULL);
+#endif
+   if (ret == 0) return NULL;
+
+   tmp = malloc((prop.name_len + 1) * sizeof(char *));
+   if (!tmp)
      {
-       /* convert to utf8 */
-
-       /* FIXME: to do... */
-
-/* #ifdef X_HAVE_UTF8_STRING */
-/*              ret = Xutf8TextPropertyToTextList(_ecore_xcb_conn, &xprop, */
-/*                                                &list, &num); */
-/* #else */
-/*              ret = XmbTextPropertyToTextList(_ecore_xcb_conn, &xprop, */
-/*                                              &list, &num); */
-/* #endif */
-
-/*              if ((ret == XLocaleNotSupported) || */
-/*                  (ret == XNoMemory) || (ret == XConverterNotFound)) */
-/*                { */
-/*                   t = strdup((char *)xprop.value); */
-/*                } */
-/*              else if ((ret >= Success) && (num > 0)) */
-/*                { */
-/*                   t = strdup(list[0]); */
-/*                } */
-/*              if (list) */
-/*                XFreeStringList(list); */
-/*           } */
-
-/*         if (xprop.value) XFree(xprop.value); */
+#ifdef OLD_XCB_VERSION
+        xcb_get_text_property_reply_wipe(&prop);
+#else
+        xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+        return NULL;
      }
+   memcpy(tmp, prop.name, sizeof(char *) * prop.name_len);
+   tmp[prop.name_len] = '\0';
 
-   return title;
+#ifdef OLD_XCB_VERSION
+   xcb_get_text_property_reply_wipe(&prop);
+#else
+   xcb_icccm_get_text_property_reply_wipe(&prop);
+#endif
+
+   return tmp;
 }
 
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
 EAPI void
-ecore_x_icccm_protocol_get_prefetch(Ecore_X_Window window)
+ecore_x_icccm_take_focus_send(Ecore_X_Window win,
+                              Ecore_X_Time   t)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_PROTOCOLS,
-                                       ECORE_X_ATOM_ATOM, 0, 1000000L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
+                                 XCB_EVENT_MASK_NO_EVENT,
+                                 ECORE_X_ATOM_WM_TAKE_FOCUS, t, 0, 0, 0);
 }
 
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_protocol_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
 EAPI void
-ecore_x_icccm_protocol_get_fetch(void)
+ecore_x_icccm_save_yourself_send(Ecore_X_Window win,
+                                 Ecore_X_Time   t)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Set or unset a wm protocol property.
- * @param window   The Window
- * @param protocol The protocol to enable/disable
- * @param on       On/Off
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_protocol_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_protocol_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_protocol_set(Ecore_X_Window      window,
-                          Ecore_X_WM_Protocol protocol,
-                           int                 on)
-{
-   xcb_get_property_reply_t *reply;
-   Ecore_X_Atom             *protos = NULL;
-   Ecore_X_Atom              proto;
-   uint32_t                  protos_count = 0;
-   uint8_t                   already_set = 0;
-
-   /* Check for invalid values */
-   if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
-      return;
-
-   proto = _ecore_xcb_atoms_wm_protocols[protocol];
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
-
-   if ((reply->type == ECORE_X_ATOM_ATOM) && (reply->format == 32))
-     {
-        uint32_t i;
-
-        protos_count = reply->value_len / sizeof(Ecore_X_Atom);
-        protos = (Ecore_X_Atom *)xcb_get_property_value(reply);
-        for (i = 0; i < protos_count; i++)
-          {
-             if (protos[i] == proto)
-               {
-                  already_set = 1;
-                  break;
-               }
-          }
-     }
-
-   if (on)
-     {
-       Ecore_X_Atom *new_protos = NULL;
-
-       if (already_set)
-          return;
-       new_protos = (Ecore_X_Atom *)malloc((protos_count + 1) * sizeof(Ecore_X_Atom));
-       if (!new_protos)
-          return;
-        memcpy(new_protos, protos, reply->value_len);
-       new_protos[protos_count] = proto;
-       xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                            ECORE_X_ATOM_WM_PROTOCOLS,
-                            ECORE_X_ATOM_ATOM, 32,
-                            protos_count + 1, new_protos);
-       free(new_protos);
-     }
-   else
-     {
-        uint32_t i;
-
-       if (!already_set)
-          return;
-       for (i = 0; i < protos_count; i++)
-         {
-            if (protos[i] == proto)
-              {
-                 uint32_t j;
-
-                 for (j = i + 1; j < protos_count; j++)
-                    protos[j - 1] = protos[j];
-                 if (protos_count > 1)
-                     xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                                         ECORE_X_ATOM_WM_PROTOCOLS,
-                                         ECORE_X_ATOM_ATOM, 32,
-                                         protos_count - 1, protos);
-                 else
-                    xcb_delete_property(_ecore_xcb_conn, window,
-                                         ECORE_X_ATOM_WM_PROTOCOLS);
-                 return;
-              }
-         }
-     }
-}
-
-/**
- * Determines whether a protocol is set for a window.
- * @param window   The Window (Unused).
- * @param protocol The protocol to query.
- * @return         1 if the protocol is set, else 0.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_protocol_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_protocol_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI int
-ecore_x_icccm_protocol_isset(Ecore_X_Window      window __UNUSED__,
-                             Ecore_X_WM_Protocol protocol)
-{
-   xcb_get_property_reply_t *reply;
-   Ecore_X_Atom           *protos = NULL;
-   Ecore_X_Atom            proto;
-   uint32_t                  i;
-   uint8_t                   ret = 0;
-
-   /* check for invalid values */
-   if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
-      return 0;
-
-   proto = _ecore_xcb_atoms_wm_protocols[protocol];
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply || (reply->type != ECORE_X_ATOM_ATOM) || (reply->format != 32))
-     {
-        return 0;
-     }
-
-   protos = (Ecore_X_Atom *)xcb_get_property_value(reply);
-   for (i = 0; i < reply->value_len; i++)
-      if (protos[i] == proto)
-       {
-          ret = 1;
-          break;
-       }
-
-   return ret;
-}
-
-/**
- * Set a window name & class.
- * @param window The window
- * @param name   The name string
- * @param class  The class string
- *
- * Set the name and class of @p window to respectively @p name and @p class.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_name_class_set(Ecore_X_Window window,
-                             const char    *name,
-                             const char    *class)
-{
-   char *class_string;
-   char *s;
-   int   length_name;
-   int   length_class;
-
-   length_name = strlen(name);
-   length_class = strlen(class);
-   class_string = (char *)malloc(sizeof(char) * (length_name + length_class + 2));
-   if (!class_string)
-     return;
-   s = class_string;
-   if (length_name)
-     {
-       strcpy(s, name);
-       s += length_name + 1;
-     }
-   else
-     *s++ = '\0';
-   if(length_class)
-     strcpy(s, class);
-   else
-     *s = '\0';
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_WM_CLASS, ECORE_X_ATOM_STRING, 8,
-                       length_name + length_class + 2, (void *)class_string);
-   free(class_string);
-}
-
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_name_class_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_CLASS,
-                                       ECORE_X_ATOM_STRING,
-                                       0, 2048L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_name_class_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_name_class_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get a window name and class.
- * @param window The window (Unused).
- * @param name   The name string.
- * @param class  The class string.
- *
- * Store the name and class of @p window into respectively @p name and
- * @p class.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_name_class_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_name_class_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_name_class_get(Ecore_X_Window window __UNUSED__,
-                             char         **name,
-                             char         **class)
-{
-   xcb_get_property_reply_t *reply;
-   void                     *data;
-   char                     *n = NULL;
-   char                     *c = NULL;
-   int                       length;
-   int                       length_name;
-   int                       length_class;
-
-
-   if (name) *name = NULL;
-   if (class) *class = NULL;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return;
-
-   if ((reply->type != ECORE_X_ATOM_STRING) ||
-       (reply->format != 8))
-      return;
-
-   length = reply->value_len;
-   data = xcb_get_property_value(reply);
-   /* data contains the name string and the class string */
-   /* separated by the NULL character. data is not NULL-terminated */
-   length_name = strlen(data);
-   n = (char *)malloc(sizeof(char) * (length_name + 1));
-   if (!n)
-      return;
-   length_class = length - length_name - 1;
-   c = (char *)malloc(sizeof(char) * (length_class + 1));
-   if (!c)
-     {
-        free(n);
-        return;
-     }
-
-   memcpy(n, data, length_name);
-   n[length_name] = '\0';
-   length_class = length - length_name - 1;
-   data += length_name + 1;
-   memcpy(c, data, length_class);
-   c[length_class] = '\0';
-
-   if (name)
-      *name = n;
-   if (class)
-      *class = c;
-}
-
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_client_machine_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? window : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       ECORE_X_ATOM_WM_CLIENT_MACHINE,
-                                       XCB_GET_PROPERTY_TYPE_ANY,
-                                       0L, 1000000L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_client_machine_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_client_machine_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get a window client machine string.
- * @param window The window
- * @return The windows client machine string
- *
- * Return the client machine of a window. String must be free'd when done with.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_client_machine_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_client_machine_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI char *
-ecore_x_icccm_client_machine_get(Ecore_X_Window window)
-{
-   char *name;
-
-   name = ecore_x_window_prop_string_get(window, ECORE_X_ATOM_WM_CLIENT_MACHINE);
-   return name;
-}
-
-/**
- * Sets the WM_COMMAND property for @a win.
- *
- * @param window The window.
- * @param argc   Number of arguments.
- * @param argv   Arguments.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_command_set(Ecore_X_Window window,
-                          int            argc,
-                          char         **argv)
-{
-   void *buf;
-   char *b;
-   int   nbytes;
-   int   i;
-
-   for (i = 0, nbytes = 0; i < argc; i++)
-     {
-        nbytes += strlen(argv[i]) + 1;
-     }
-   buf = malloc(sizeof(char) * nbytes);
-   if (!buf)
-     return;
-   b = (char *)buf;
-   for (i = 0; i < argc; i++)
-     {
-        if (argv[i])
-          {
-             strcpy(b, argv[i]);
-             b += strlen(argv[i]) + 1;
-          }
-        else
-          *b++ = '\0';
-     }
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_WM_COMMAND, ECORE_X_ATOM_STRING, 8,
-                       nbytes, buf);
-   free(buf);
-}
-
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_command_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_COMMAND,
-                                       XCB_GET_PROPERTY_TYPE_ANY,
-                                       0L, 1000000L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_command_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_command_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the WM_COMMAND property for a window.
- *
- * @param win  The window.
- * @param argc Number of arguments.
- * @param argv Arguments.
- *
- * Return the command of @p window and store it in @p argv. @p argc
- * contains the number of arguments. String must be free'd when done with.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_command_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_command_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_command_get(Ecore_X_Window window __UNUSED__,
-                          int           *argc,
-                          char        ***argv)
-{
-   xcb_get_property_reply_t *reply;
-   char                    **v;
-   char                     *data;
-   char                     *cp;
-   char                     *start;
-   uint32_t                  value_len;
-   int                       c;
-   int                       i;
-   int                       j;
-
-   if (argc) *argc = 0;
-   if (argv) *argv = NULL;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return;
-
-   if ((reply->type != ECORE_X_ATOM_STRING) ||
-       (reply->format != 8))
-      return;
-
-   value_len = reply->value_len;
-   data = (char *)xcb_get_property_value(reply);
-   if (value_len && (data[value_len - 1] == '\0'))
-     value_len--;
-
-   c = 1;
-   for (cp = (char *)data, i = value_len; i > 0; cp++, i--)
-     {
-        if (*cp == '\0') c++;
-     }
-   v = (char **)malloc((c + 1) * sizeof(char *));
-   if (!v)
-      return;
-
-   start = (char *)malloc((value_len + 1) * sizeof(char));
-   if (!start)
-     {
-       free(v);
-       return;
-     }
-
-    memcpy (start, (char *) data, value_len);
-    start[value_len] = '\0';
-    for (cp = start, i = value_len + 1, j = 0; i > 0; cp++, i--) {
-       if (*cp == '\0') {
-           v[j] = start;
-           start = (cp + 1);
-           j++;
-       }
-    }
-
-   if (c < 1)
-     {
-       if (v)
-         free(v);
-       return;
-     }
-
-   if (argc) *argc = c;
-   if (argv)
-     {
-       (*argv) = malloc(c * sizeof(char *));
-       if (!*argv)
-         {
-            free(v);
-            if (argc) *argc = 0;
-            return;
-         }
-       for (i = 0; i < c; i++)
-         {
-            if (v[i])
-              (*argv)[i] = strdup(v[i]);
-            else
-              (*argv)[i] = strdup("");
-         }
-     }
-
-   free(v);
-}
-
-/**
- * Set a window icon name.
- * @param window The window.
- * @param title  The icon name string.
- *
- * Set @p window icon name.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_icon_name_set(Ecore_X_Window window,
-                            const char    *title)
-{
-   /* FIXME: do the UTF8 conversion... */
-
-/* #ifdef X_HAVE_UTF8_STRING */
-/*    list[0] = strdup(t); */
-/*    ret = Xutf8TextListToTextProperty(_ecore_xcb_conn, list, 1, */
-/*                                  XUTF8StringStyle, &xprop); */
-/* #else */
-/*    list[0] = strdup(t); */
-/*    ret = XmbTextListToTextProperty(_ecore_xcb_conn, list, 1, */
-/*                                XStdICCTextStyle, &xprop); */
-/* #endif */
-
-  xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                      ECORE_X_ATOM_WM_ICON_NAME, ECORE_X_ATOM_WM_ICON_NAME,
-                      8, strlen(title), title);
-}
-
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_icon_name_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_ICON_NAME,
-                                       XCB_GET_PROPERTY_TYPE_ANY,
-                                       0L, 128L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_icon_name_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_icon_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get a window icon name.
- * @param window The window.
- * @return       The windows icon name string.
- *
- * Return the icon name of @p window. String must be free'd when done with.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_icon_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_icon_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI char *
-ecore_x_icccm_icon_name_get(Ecore_X_Window window __UNUSED__)
-{
-   xcb_get_property_reply_t *reply;
-   char                     *title = NULL;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return NULL;
-
-   printf ("[XCB] reply->bytes_afer (should be 0): %d\n", ((xcb_get_property_reply_t *)reply)->bytes_after);
-
-   if (reply->type == ECORE_X_ATOM_UTF8_STRING)
-     {
-        int length;
-
-        /* FIXME: verify the value of length */
-        length = reply->value_len * reply->format / 8;
-        title = (char *)malloc((length + 1) * sizeof(char));
-        memcpy(title, xcb_get_property_value(reply), length);
-        title[length] = '\0';
-     }
-   /* not in UTF8, so we convert */
-   else
-     {
-        /* FIXME: do the UTF8... */
-
-       /* convert to utf8 */
-/* #ifdef X_HAVE_UTF8_STRING */
-/*               ret = Xutf8TextPropertyToTextList(_ecore_xcb_conn, &xprop, */
-/*                                                 &list, &num); */
-/* #else */
-/*               ret = XmbTextPropertyToTextList(_ecore_xcb_conn, &xprop, */
-/*                                               &list, &num); */
-/* #endif */
-
-/*               if ((ret == XLocaleNotSupported) || */
-/*                   (ret == XNoMemory) || (ret == XConverterNotFound)) */
-/*                 { */
-/*                    t = strdup((char *)xprop.value); */
-/*                 } */
-/*               else if (ret >= Success) */
-/*                 { */
-/*                    if ((num >= 1) && (list)) */
-/*                      { */
-/*                         t = strdup(list[0]); */
-/*                      } */
-/*                    if (list) */
-/*                      XFreeStringList(list); */
-/*                 } */
-/*            } */
-
-/*          if (xprop.value) XFree(xprop.value); */
-     }
-
-   return title;
-}
-
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_colormap_window_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? ((xcb_screen_t *)_ecore_xcb_screen)->root : window,
-                                       ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
-                                       ECORE_X_ATOM_WINDOW,
-                                       0L, LONG_MAX);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_colormap_window_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_colormap_window_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
+                                 XCB_EVENT_MASK_NO_EVENT,
+                                 ECORE_X_ATOM_WM_SAVE_YOURSELF, t, 0, 0, 0);
+}
 
 /**
  * Add a subwindow to the list of windows that need a different colormap installed.
- * @param window     The toplevel window
- * @param sub_window The subwindow to be added to the colormap windows list
- *
- * Add @p sub_window to the list of windows that need a different
- * colormap installed.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_colormap_window_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_colormap_window_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
+ * @param win The toplevel window
+ * @param subwin The subwindow to be added to the colormap windows list
  */
 EAPI void
-ecore_x_icccm_colormap_window_set(Ecore_X_Window window,
-                                  Ecore_X_Window sub_window)
+ecore_x_icccm_colormap_window_set(Ecore_X_Window win,
+                                  Ecore_X_Window subwin)
 {
-   void                     *data = NULL;
-   xcb_get_property_reply_t *reply;
-   uint32_t                  num;
+   int num = 0, i = 0;
+   unsigned char *odata = NULL, *data = NULL;
+   Ecore_X_Window *newset = NULL, *oldset = NULL;
 
-   if (window == 0)
-     window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply || (reply->format != 32) || (reply->value_len == 0))
+   if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                                         ECORE_X_ATOM_WINDOW, 32, &odata, &num))
      {
-        data = calloc(1, sizeof(Ecore_X_Window));
-        if (!data)
-          {
-             if (reply) free(reply);
-             return;
-          }
+        if (!(newset = calloc(1, sizeof(Ecore_X_Window)))) return;
+        newset[0] = subwin;
         num = 1;
+        data = (unsigned char *)newset;
      }
    else
      {
-        Ecore_X_Window *newset = NULL;
-        Ecore_X_Window *oldset = NULL;
-        uint32_t          i;
-
-        num = reply->value_len;
-        data = calloc(num + 1, sizeof(Ecore_X_Window));
-        if (!data)
-          return;
-
-        newset = (Ecore_X_Window *)data;
-        oldset = (Ecore_X_Window *)xcb_get_property_value(reply);
-        for (i = 0; i < num; ++i)
+        if (!(newset = calloc(num + 1, sizeof(Ecore_X_Window)))) return;
+        oldset = (Ecore_X_Window *)odata;
+        for (i = 0; i < num; i++)
           {
-             if (oldset[i] == sub_window)
+             if (oldset[i] == subwin)
                {
+                  if (odata) free(odata);
+                  odata = NULL;
                   free(newset);
                   return;
                }
-
              newset[i] = oldset[i];
           }
-
-        newset[num++] = sub_window;
+        newset[num++] = subwin;
+        if (odata) free(odata);
+        data = (unsigned char *)newset;
      }
-
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
-                       ECORE_X_ATOM_WINDOW,
-                       32, num, data);
-   free(data);
+   ecore_x_window_prop_property_set(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                                    ECORE_X_ATOM_WINDOW, 32, data, num);
+   free(newset);
 }
 
 /**
  * Remove a window from the list of colormap windows.
- * @param window     The toplevel window
- * @param sub_window The window to be removed from the colormap window list.
- *
- * Remove @p sub_window from the list of colormap windows.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_colormap_window_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_colormap_window_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
+ * @param win The toplevel window
+ * @param subwin The window to be removed from the colormap window list.
  */
 EAPI void
-ecore_x_icccm_colormap_window_unset(Ecore_X_Window window,
-                                    Ecore_X_Window sub_window)
+ecore_x_icccm_colormap_window_unset(Ecore_X_Window win,
+                                    Ecore_X_Window subwin)
 {
-   void                     *data = NULL;
-   Ecore_X_Window           *oldset = NULL;
-   Ecore_X_Window           *newset = NULL;
-   xcb_get_property_reply_t *reply;
-   uint32_t                  num;
-   uint32_t                  i;
-   uint32_t                  j;
-   uint32_t                  k = 0;
+   int num = 0, i = 0, j = 0, k = 0;
+   unsigned char *odata = NULL, *data = NULL;
+   Ecore_X_Window *newset = NULL, *oldset = NULL;
 
-   if (window == 0) window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply || (reply->format != 32) || (reply->value_len == 0))
+   if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                                         ECORE_X_ATOM_WINDOW, 32, &odata, &num))
      return;
 
-   num = reply->value_len;
-   oldset = (Ecore_X_Window *)xcb_get_property_value(reply);
+   oldset = (Ecore_X_Window *)odata;
    for (i = 0; i < num; i++)
      {
-       if (oldset[i] == sub_window)
-         {
-            if (num == 1)
-              {
-                 xcb_delete_property(_ecore_xcb_conn, window,
-                                      ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
-                 return;
-              }
-            else
-              {
-                 data = calloc(num - 1, sizeof(Ecore_X_Window));
-                 newset = (Ecore_X_Window *)data;
-                 for (j = 0; j < num; ++j)
-                    if (oldset[j] != sub_window)
-                       newset[k++] = oldset[j];
-                  xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                                      ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
-                                      ECORE_X_ATOM_WINDOW,
-                                      32, k, data);
-                 free(newset);
-                 return;
-              }
-         }
+        if (oldset[i] == subwin)
+          {
+             if (num == 1)
+               {
+                  ecore_x_window_prop_property_del(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
+                  if (odata) free(odata);
+                  odata = NULL;
+                  return;
+               }
+             else
+               {
+                  newset = calloc(num - 1, sizeof(Ecore_X_Window));
+                  data = (unsigned char *)newset;
+                  for (j = 0; j < num; ++j)
+                    if (oldset[j] != subwin)
+                      newset[k++] = oldset[j];
+
+                  ecore_x_window_prop_property_set(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                                                   ECORE_X_ATOM_WINDOW, 32, data, k);
+                  if (odata) free(odata);
+                  odata = NULL;
+                  free(newset);
+                  return;
+               }
+          }
      }
+   if (odata) free(odata);
 }
 
-/**
- * Specify that a window is transient for another top-level window and should be handled accordingly.
- * @param window    The transient window
- * @param forwindow The toplevel window
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_transient_for_set(Ecore_X_Window window,
-                                Ecore_X_Window forwindow)
-{
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_WM_TRANSIENT_FOR, ECORE_X_ATOM_WINDOW, 32,
-                       1, (void *)&forwindow);
-}
-
-/**
- * Remove the transient_for setting from a window.
- * @param window The window.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_transient_for_unset(Ecore_X_Window window)
-{
-   xcb_delete_property(_ecore_xcb_conn, window, ECORE_X_ATOM_WM_TRANSIENT_FOR);
-}
-
-/*
- * Sends the GetProperty request.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_transient_for_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_WM_TRANSIENT_FOR,
-                                       ECORE_X_ATOM_WINDOW,
-                                       0L, 1L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/*
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_transient_for_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_transient_for_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the window this window is transient for, if any.
- * @param window The window to check (Unused).
- * @return       The window ID of the top-level window, or 0 if the property does not exist.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_transient_for_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_transient_for_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI Ecore_X_Window
-ecore_x_icccm_transient_for_get(Ecore_X_Window window __UNUSED__)
-{
-   xcb_get_property_reply_t *reply;
-   Ecore_X_Window            forwin = 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return forwin;
-
-   if ((reply->format != 32) ||
-       (reply->value_len == 0) ||
-       (reply->type != ECORE_X_ATOM_WINDOW))
-      return forwin;
-   
-   forwin = *(Ecore_X_Window *)xcb_get_property_value(reply);
-
-   return forwin;
-}
-
-/**
- * Set the window role hint.
- * @param window The window
- * @param role   The role string.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_window_role_set(Ecore_X_Window window,
-                              const char    *role)
-{
-   ecore_x_window_prop_string_set(window, ECORE_X_ATOM_WM_WINDOW_ROLE,
-                                 (char *)role);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_window_role_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? window : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       ECORE_X_ATOM_WM_WINDOW_ROLE, XCB_GET_PROPERTY_TYPE_ANY,
-                                       0L, 1000000L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_window_role_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_window_role_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the window role.
- * @param window The window.
- * @return       The window's role string.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_window_role_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_window_role_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI char *
-ecore_x_icccm_window_role_get(Ecore_X_Window window)
-{
-   return ecore_x_window_prop_string_get(window, ECORE_X_ATOM_WM_WINDOW_ROLE);
-}
-
-/**
- * Set the window's client leader.
- * @param window The window
- * @param leader The client leader window
- *
- * All non-transient top-level windows created by an app other than
- * the main window must have this property set to the app's main window.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_client_leader_set(Ecore_X_Window window,
-                                Ecore_X_Window leader)
-{
-   ecore_x_window_prop_window_set(window, ECORE_X_ATOM_WM_CLIENT_LEADER,
-                                 &leader, 1);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_client_leader_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window,
-                                       ECORE_X_ATOM_WM_CLIENT_LEADER,
-                                       ECORE_X_ATOM_WINDOW,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_icccm_client_leader_get_prefetch().
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_client_leader_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the window's client leader.
- * @param window The window
- * @return       The window's client leader window, or 0 if unset.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_icccm_client_leader_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_icccm_client_leader_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI Ecore_X_Window
-ecore_x_icccm_client_leader_get(Ecore_X_Window window)
-{
-   Ecore_X_Window leader;
-
-   if (ecore_x_window_prop_window_get(window, ECORE_X_ATOM_WM_CLIENT_LEADER,
-                                     &leader, 1) > 0)
-      return leader;
-
-   return 0;
-}
-
-/**
- * Send the ClientMessage event with the ChangeState property.
- * @param window The window.
- * @param root   The root window.
- * @ingroup Ecore_X_ICCCM_Group
- */
-EAPI void
-ecore_x_icccm_iconic_request_send(Ecore_X_Window window,
-                                  Ecore_X_Window root)
-{
-   xcb_client_message_event_t ev;
-
-   if (!window) return;
-   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   /* send_event is bit 7 (0x80) of response_type */
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.sequence = 0;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_WM_CHANGE_STATE;
-   ev.data.data32[0] = XCB_WM_ICONIC_STATE;
-
-   xcb_send_event(_ecore_xcb_conn, 0, root,
-                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
-                  (const char *)&ev);
-}
-
-/* FIXME: there are older E hints, gnome hints and mwm hints and new netwm */
-/*        hints. each should go in their own file/section so we know which */
-/*        is which. also older kde hints too. we should try support as much */
-/*        as makese sense to support */
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_image.c b/src/lib/ecore_x/xcb/ecore_xcb_image.c
new file mode 100644 (file)
index 0000000..8e22110
--- /dev/null
@@ -0,0 +1,738 @@
+#include "ecore_xcb_private.h"
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <xcb/xcb_event.h>
+#include <xcb/shm.h>
+
+struct _Ecore_X_Image
+{
+   xcb_shm_segment_info_t shminfo;
+   xcb_image_t           *xim;
+   Ecore_X_Visual         vis;
+   int                    depth, w, h;
+   int                    bpl, bpp, rows;
+   unsigned char         *data;
+   Eina_Bool              shm : 1;
+};
+
+/* local function prototypes */
+static void          _ecore_xcb_image_shm_check(void);
+static void          _ecore_xcb_image_shm_create(Ecore_X_Image *im);
+static xcb_format_t *_ecore_xcb_image_find_format(const xcb_setup_t *setup,
+                                                  uint8_t            depth);
+
+/* local variables */
+static int _ecore_xcb_image_shm_can = -1;
+
+EAPI Ecore_X_Image *
+ecore_x_image_new(int            w,
+                  int            h,
+                  Ecore_X_Visual vis,
+                  int            depth)
+{
+   Ecore_X_Image *im;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(im = calloc(1, sizeof(Ecore_X_Image)))) return NULL;
+   im->w = w;
+   im->h = h;
+   im->vis = vis;
+   im->depth = depth;
+   _ecore_xcb_image_shm_check();
+   im->shm = _ecore_xcb_image_shm_can;
+   return im;
+}
+
+EAPI void
+ecore_x_image_free(Ecore_X_Image *im)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!im) return;
+   if (im->shm)
+     {
+        if (im->xim)
+          {
+             xcb_shm_detach(_ecore_xcb_conn, im->shminfo.shmseg);
+             xcb_image_destroy(im->xim);
+             shmdt(im->shminfo.shmaddr);
+             shmctl(im->shminfo.shmid, IPC_RMID, 0);
+          }
+     }
+   else if (im->xim)
+     {
+        if (im->xim->data) free(im->xim->data);
+        im->xim->data = NULL;
+        xcb_image_destroy(im->xim);
+     }
+
+   free(im);
+//   ecore_x_flush();
+}
+
+EAPI Eina_Bool
+ecore_x_image_get(Ecore_X_Image   *im,
+                  Ecore_X_Drawable draw,
+                  int              x,
+                  int              y,
+                  int              sx,
+                  int              sy,
+                  int              w,
+                  int              h)
+{
+   Eina_Bool ret = EINA_TRUE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (im->shm)
+     {
+        if (!im->xim) _ecore_xcb_image_shm_create(im);
+        if (!im->xim) return EINA_FALSE;
+
+        if ((sx == 0) && (w == im->w))
+          {
+             im->xim->data = (uint8_t *)im->data + (im->xim->stride * sy) +
+               (sx * im->bpp);
+             im->xim->width = w;
+             im->xim->height = h;
+
+             ecore_x_grab();
+             if (!xcb_image_shm_get(_ecore_xcb_conn, draw, im->xim,
+                                    im->shminfo, x, y, 0xffffffff))
+               {
+                  DBG("\tImage Shm Get Failed");
+                  ret = EINA_FALSE;
+               }
+             ecore_x_ungrab();
+             ecore_x_sync(); // needed
+          }
+        else
+          {
+             Ecore_X_Image *tim;
+
+             tim = ecore_x_image_new(w, h, im->vis, im->depth);
+             if (tim)
+               {
+                  ret = ecore_x_image_get(tim, draw, x, y, 0, 0, w, h);
+                  if (ret)
+                    {
+                       unsigned char *spixels, *pixels;
+                       int sbpp = 0, sbpl = 0, srows = 0;
+                       int bpp = 0, bpl = 0, rows = 0;
+
+                       spixels =
+                         ecore_x_image_data_get(tim, &sbpl, &srows, &sbpp);
+                       pixels = ecore_x_image_data_get(im, &bpl, &rows, &bpp);
+                       if ((spixels) && (pixels))
+                         {
+                            unsigned char *p, *sp;
+                            int r = 0;
+
+                            p = (pixels + (sy * bpl) + (sx * bpp));
+                            sp = spixels;
+                            for (r = srows; r > 0; r--)
+                              {
+                                 memcpy(p, sp, sbpl);
+                                 p += bpl;
+                                 sp += sbpl;
+                              }
+                         }
+                    }
+                  ecore_x_image_free(tim);
+               }
+          }
+     }
+   else
+     {
+        ret = EINA_FALSE;
+        ecore_x_grab();
+        im->xim =
+          xcb_image_get(_ecore_xcb_conn, draw, x, y, w, h,
+                        0xffffffff, XCB_IMAGE_FORMAT_Z_PIXMAP);
+        if (!im->xim) ret = EINA_FALSE;
+        ecore_x_ungrab();
+        ecore_x_sync(); // needed
+
+        if (im->xim)
+          {
+             im->data = (unsigned char *)im->xim->data;
+             im->bpl = im->xim->stride;
+             im->rows = im->xim->height;
+             if (im->xim->bpp <= 8)
+               im->bpp = 1;
+             else if (im->xim->bpp <= 16)
+               im->bpp = 2;
+             else
+               im->bpp = 4;
+          }
+     }
+
+   return ret;
+}
+
+EAPI void *
+ecore_x_image_data_get(Ecore_X_Image *im,
+                       int           *bpl,
+                       int           *rows,
+                       int           *bpp)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!im) return NULL;
+   if (!im->xim) _ecore_xcb_image_shm_create(im);
+   if (!im->xim) return NULL;
+
+   if (bpl) *bpl = im->bpl;
+   if (rows) *rows = im->rows;
+   if (bpp) *bpp = im->bpp;
+
+   return im->data;
+}
+
+EAPI void
+ecore_x_image_put(Ecore_X_Image   *im,
+                  Ecore_X_Drawable draw,
+                  Ecore_X_GC       gc,
+                  int              x,
+                  int              y,
+                  int              sx,
+                  int              sy,
+                  int              w,
+                  int              h)
+{
+   Ecore_X_GC tgc = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!gc)
+     {
+        uint32_t mask, values[1];
+
+        tgc = xcb_generate_id(_ecore_xcb_conn);
+        mask = XCB_GC_SUBWINDOW_MODE;
+        values[0] = XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS;
+        xcb_create_gc(_ecore_xcb_conn, tgc, draw, mask, values);
+        gc = tgc;
+     }
+   if (!im->xim) _ecore_xcb_image_shm_create(im);
+   if (im->xim)
+     {
+        if (im->shm)
+          xcb_shm_put_image(_ecore_xcb_conn, draw, gc, im->xim->width,
+                            im->xim->height, sx, sy, w, h, x, y,
+                            im->xim->depth, im->xim->format, 0,
+                            im->shminfo.shmseg,
+                            im->xim->data - im->shminfo.shmaddr);
+//          xcb_image_shm_put(_ecore_xcb_conn, draw, gc, im->xim,
+//                            im->shminfo, sx, sy, x, y, w, h, 0);
+        else
+          xcb_image_put(_ecore_xcb_conn, draw, gc, im->xim, sx, sy, 0);
+     }
+   if (tgc) ecore_x_gc_free(tgc);
+   ecore_x_sync();
+}
+
+EAPI Eina_Bool
+ecore_x_image_is_argb32_get(Ecore_X_Image *im)
+{
+   xcb_visualtype_t *vis;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   vis = (xcb_visualtype_t *)im->vis;
+   if (!im->xim) _ecore_xcb_image_shm_create(im);
+
+   if (((vis->_class == XCB_VISUAL_CLASS_TRUE_COLOR) ||
+        (vis->_class == XCB_VISUAL_CLASS_DIRECT_COLOR)) &&
+       (im->depth >= 24) && (vis->red_mask == 0xff0000) &&
+       (vis->green_mask == 0x00ff00) && (vis->blue_mask == 0x0000ff))
+     {
+#ifdef WORDS_BIGENDIAN
+        if (im->xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST) return EINA_TRUE;
+#else
+        if (im->xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST) return EINA_TRUE;
+#endif
+     }
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_image_to_argb_convert(void            *src,
+                              int              sbpp,
+                              int              sbpl,
+                              Ecore_X_Colormap c,
+                              Ecore_X_Visual   v,
+                              int              x,
+                              int              y,
+                              int              w,
+                              int              h,
+                              unsigned int    *dst,
+                              int              dbpl,
+                              int              dx,
+                              int              dy)
+{
+   xcb_visualtype_t *vis;
+   uint32_t *cols;
+   int n = 0, nret = 0, i, row, mode = 0;
+   unsigned int pal[256], r, g, b;
+   enum
+   {
+      rgbnone = 0,
+      rgb565,
+      bgr565,
+      rgbx555,
+      argbx888,
+      abgrx888,
+      rgba888x,
+      bgra888x,
+      argbx666
+   };
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   sbpp *= 8;
+
+   vis = (xcb_visualtype_t *)v;
+   n = vis->colormap_entries;
+   if ((n <= 256) &&
+       ((vis->_class == XCB_VISUAL_CLASS_PSEUDO_COLOR) ||
+        (vis->_class == XCB_VISUAL_CLASS_STATIC_COLOR) ||
+        (vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE) ||
+        (vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY)))
+     {
+        xcb_query_colors_cookie_t cookie;
+        xcb_query_colors_reply_t *reply;
+
+        if (!c)
+          {
+             c = (xcb_colormap_t)((xcb_screen_t *)
+                                  _ecore_xcb_screen)->default_colormap;
+          }
+
+        cols = alloca(n * sizeof(uint32_t));
+        for (i = 0; i < n; i++)
+          cols[i] = i;
+
+        cookie = xcb_query_colors_unchecked(_ecore_xcb_conn, c, n, cols);
+        reply = xcb_query_colors_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             xcb_rgb_iterator_t iter;
+             xcb_rgb_t *ret;
+
+             iter = xcb_query_colors_colors_iterator(reply);
+             ret = xcb_query_colors_colors(reply);
+             if (ret)
+               {
+                  for (i = 0; iter.rem; xcb_rgb_next(&iter), i++)
+                    {
+                       pal[i] = 0xff000000 |
+                         ((iter.data->red >> 8) << 16) |
+                         ((iter.data->green >> 8) << 8) |
+                         ((iter.data->blue >> 8));
+                    }
+                  nret = n;
+               }
+             free(reply);
+          }
+     }
+   else if ((vis->_class == XCB_VISUAL_CLASS_TRUE_COLOR) ||
+            (vis->_class == XCB_VISUAL_CLASS_DIRECT_COLOR))
+     {
+        if ((vis->red_mask == 0x00ff0000) &&
+            (vis->green_mask == 0x0000ff00) &&
+            (vis->blue_mask == 0x000000ff))
+          mode = argbx888;
+        else if ((vis->red_mask == 0x000000ff) &&
+                 (vis->green_mask == 0x0000ff00) &&
+                 (vis->blue_mask == 0x00ff0000))
+          mode = abgrx888;
+        else if ((vis->red_mask == 0xff000000) &&
+                 (vis->green_mask == 0x00ff0000) &&
+                 (vis->blue_mask == 0x0000ff00))
+          mode = rgba888x;
+        else if ((vis->red_mask == 0x0000ff00) &&
+                 (vis->green_mask == 0x00ff0000) &&
+                 (vis->blue_mask == 0xff000000))
+          mode = bgra888x;
+        else if ((vis->red_mask == 0x0003f000) &&
+                 (vis->green_mask == 0x00000fc0) &&
+                 (vis->blue_mask == 0x0000003f))
+          mode = argbx666;
+        else if ((vis->red_mask == 0x0000f800) &&
+                 (vis->green_mask == 0x000007e0) &&
+                 (vis->blue_mask == 0x0000001f))
+          mode = rgb565;
+        else if ((vis->red_mask == 0x0000001f) &&
+                 (vis->green_mask == 0x000007e0) &&
+                 (vis->blue_mask == 0x0000f800))
+          mode = bgr565;
+        else if ((vis->red_mask == 0x00007c00) &&
+                 (vis->green_mask == 0x000003e0) &&
+                 (vis->blue_mask == 0x0000001f))
+          mode = rgbx555;
+        else
+          return EINA_FALSE;
+     }
+   for (row = 0; row < h; row++)
+     {
+        unsigned char *s8;
+        unsigned short *s16;
+        unsigned int *s32, *dp, *de;
+
+        dp = ((unsigned int *)(((unsigned char *)dst) +
+                               ((dy + row) * dbpl))) + dx;
+        de = dp + w;
+        switch (sbpp)
+          {
+           case 8:
+             s8 = ((unsigned char *)(((unsigned char *)src) +
+                                     ((y + row) * sbpl))) + x;
+             if (nret > 0)
+               {
+                  while (dp < de)
+                    {
+                       *dp = pal[*s8];
+                       s8++; dp++;
+                    }
+               }
+             else
+               return EINA_FALSE;
+             break;
+
+           case 16:
+             s16 = ((unsigned short *)(((unsigned char *)src) +
+                                       ((y + row) * sbpl))) + x;
+             switch (mode)
+               {
+                case rgb565:
+                  while (dp < de)
+                    {
+                       r = (*s16 & 0xf800) << 8;
+                       g = (*s16 & 0x07e0) << 5;
+                       b = (*s16 & 0x001f) << 3;
+                       r |= (r >> 5) & 0xff0000;
+                       g |= (g >> 6) & 0x00ff00;
+                       b |= (b >> 5);
+                       *dp = 0xff000000 | r | g | b;
+                       s16++; dp++;
+                    }
+                  break;
+
+                case bgr565:
+                  while (dp < de)
+                    {
+                       r = (*s16 & 0x001f) << 19;
+                       g = (*s16 & 0x07e0) << 5;
+                       b = (*s16 & 0xf800) >> 8;
+                       r |= (r >> 5) & 0xff0000;
+                       g |= (g >> 6) & 0x00ff00;
+                       b |= (b >> 5);
+                       *dp = 0xff000000 | r | g | b;
+                       s16++; dp++;
+                    }
+                  break;
+
+                case rgbx555:
+                  while (dp < de)
+                    {
+                       r = (*s16 & 0x7c00) << 9;
+                       g = (*s16 & 0x03e0) << 6;
+                       b = (*s16 & 0x001f) << 3;
+                       r |= (r >> 5) & 0xff0000;
+                       g |= (g >> 5) & 0x00ff00;
+                       b |= (b >> 5);
+                       *dp = 0xff000000 | r | g | b;
+                       s16++; dp++;
+                    }
+                  break;
+
+                default:
+                  return EINA_FALSE;
+                  break;
+               }
+             break;
+
+           case 24:
+           case 32:
+             s32 = ((unsigned int *)(((unsigned char *)src) +
+                                     ((y + row) * sbpl))) + x;
+             switch (mode)
+               {
+                case argbx888:
+                  while (dp < de)
+                    {
+                       *dp = 0xff000000 | *s32;
+                       s32++; dp++;
+                    }
+                  break;
+
+                case abgrx888:
+                  while (dp < de)
+                    {
+                       r = *s32 & 0x000000ff;
+                       g = *s32 & 0x0000ff00;
+                       b = *s32 & 0x00ff0000;
+                       *dp = 0xff000000 | (r << 16) | (g) | (b >> 16);
+                       s32++; dp++;
+                    }
+                  break;
+
+                case rgba888x:
+                  while (dp < de)
+                    {
+                       *dp = 0xff000000 | (*s32 >> 8);
+                       s32++; dp++;
+                    }
+                  break;
+
+                case bgra888x:
+                  while (dp < de)
+                    {
+                       r = *s32 & 0x0000ff00;
+                       g = *s32 & 0x00ff0000;
+                       b = *s32 & 0xff000000;
+                       *dp = 0xff000000 | (r << 8) | (g >> 8) | (b >> 24);
+                       s32++; dp++;
+                    }
+                  break;
+
+                case argbx666:
+                  while (dp < de)
+                    {
+                       r = (*s32 & 0x3f000) << 6;
+                       g = (*s32 & 0x00fc0) << 4;
+                       b = (*s32 & 0x0003f) << 2;
+                       r |= (r >> 6) & 0xff0000;
+                       g |= (g >> 6) & 0x00ff00;
+                       b |= (b >> 6);
+                       *dp = 0xff000000 | r | g | b;
+                       s32++; dp++;
+                    }
+                  break;
+
+                default:
+                  return EINA_FALSE;
+                  break;
+               }
+             break;
+             break;
+
+           default:
+             return EINA_FALSE;
+             break;
+          }
+     }
+   return EINA_TRUE;
+}
+
+/* local functions */
+static void
+_ecore_xcb_image_shm_check(void)
+{
+//   xcb_shm_query_version_reply_t *reply;
+     xcb_shm_segment_info_t shminfo;
+     xcb_shm_get_image_cookie_t cookie;
+     xcb_shm_get_image_reply_t *ireply;
+     xcb_image_t *img = 0;
+     uint8_t depth = 0;
+
+     if (_ecore_xcb_image_shm_can != -1) return;
+     CHECK_XCB_CONN;
+
+     /* reply =  */
+     /*   xcb_shm_query_version_reply(_ecore_xcb_conn,  */
+     /*                               xcb_shm_query_version(_ecore_xcb_conn), NULL); */
+     /* if (!reply)  */
+     /*   { */
+     /*      _ecore_xcb_image_shm_can = 0; */
+     /*      return; */
+     /*   } */
+
+     /* if ((reply->major_version < 1) ||  */
+     /*     ((reply->major_version == 1) && (reply->minor_version == 0)))  */
+     /*   { */
+     /*      _ecore_xcb_image_shm_can = 0; */
+     /*      free(reply); */
+     /*      return; */
+     /*   } */
+
+     /* free(reply); */
+
+     depth = ((xcb_screen_t *)_ecore_xcb_screen)->root_depth;
+
+     ecore_x_sync(); // needed
+
+     img = _ecore_xcb_image_create_native(1, 1, XCB_IMAGE_FORMAT_Z_PIXMAP,
+                                          depth, NULL, ~0, NULL);
+     if (!img)
+       {
+          _ecore_xcb_image_shm_can = 0;
+          return;
+       }
+
+     shminfo.shmid =
+       shmget(IPC_PRIVATE, img->stride * img->height, (IPC_CREAT | 0666));
+     if (shminfo.shmid == (uint32_t)-1)
+       {
+          xcb_image_destroy(img);
+          _ecore_xcb_image_shm_can = 0;
+          return;
+       }
+
+     shminfo.shmaddr = shmat(shminfo.shmid, 0, 0);
+     img->data = shminfo.shmaddr;
+     if (img->data == (uint8_t *)-1)
+       {
+          xcb_image_destroy(img);
+          _ecore_xcb_image_shm_can = 0;
+          return;
+       }
+
+     shminfo.shmseg = xcb_generate_id(_ecore_xcb_conn);
+     xcb_shm_attach(_ecore_xcb_conn, shminfo.shmseg, shminfo.shmid, 0);
+
+     cookie =
+       xcb_shm_get_image(_ecore_xcb_conn,
+                         ((xcb_screen_t *)_ecore_xcb_screen)->root,
+                         0, 0, img->width, img->height,
+                         0xffffffff, img->format,
+                         shminfo.shmseg, img->data - shminfo.shmaddr);
+
+     ecore_x_sync(); // needed
+
+     ireply = xcb_shm_get_image_reply(_ecore_xcb_conn, cookie, NULL);
+     if (ireply)
+       {
+          _ecore_xcb_image_shm_can = 1;
+          free(ireply);
+       }
+     else
+       _ecore_xcb_image_shm_can = 0;
+
+     xcb_shm_detach(_ecore_xcb_conn, shminfo.shmseg);
+     xcb_image_destroy(img);
+     shmdt(shminfo.shmaddr);
+     shmctl(shminfo.shmid, IPC_RMID, 0);
+}
+
+static void
+_ecore_xcb_image_shm_create(Ecore_X_Image *im)
+{
+   CHECK_XCB_CONN;
+
+   im->xim =
+     _ecore_xcb_image_create_native(im->w, im->h, XCB_IMAGE_FORMAT_Z_PIXMAP,
+                                    im->depth, NULL, ~0, NULL);
+   if (!im->xim) return;
+
+   im->shminfo.shmid = shmget(IPC_PRIVATE, im->xim->size, (IPC_CREAT | 0666));
+   if (im->shminfo.shmid == (uint32_t)-1)
+     {
+        xcb_image_destroy(im->xim);
+        return;
+     }
+
+   im->shminfo.shmaddr = shmat(im->shminfo.shmid, 0, 0);
+   im->xim->data = im->shminfo.shmaddr;
+   if ((!im->xim->data) || (im->xim->data == (uint8_t *)-1))
+     {
+        DBG("Shm Create No Image Data");
+        xcb_image_destroy(im->xim);
+        shmdt(im->shminfo.shmaddr);
+        shmctl(im->shminfo.shmid, IPC_RMID, 0);
+        return;
+     }
+
+   im->shminfo.shmseg = xcb_generate_id(_ecore_xcb_conn);
+   xcb_shm_attach(_ecore_xcb_conn, im->shminfo.shmseg, im->shminfo.shmid, 0);
+
+   im->data = (unsigned char *)im->xim->data;
+   im->bpl = im->xim->stride;
+   im->rows = im->xim->height;
+   if (im->xim->bpp <= 8)
+     im->bpp = 1;
+   else if (im->xim->bpp <= 16)
+     im->bpp = 2;
+   else
+     im->bpp = 4;
+}
+
+xcb_image_t *
+_ecore_xcb_image_create_native(int                w,
+                               int                h,
+                               xcb_image_format_t format,
+                               uint8_t            depth,
+                               void              *base,
+                               uint32_t           bytes,
+                               uint8_t           *data)
+{
+   static uint8_t dpth = 0;
+   static xcb_format_t *fmt = NULL;
+   const xcb_setup_t *setup;
+   xcb_image_format_t xif;
+
+   CHECK_XCB_CONN;
+
+   /* NB: We cannot use xcb_image_create_native as it only creates images
+    * using MSB_FIRST, so this routine recreates that function and uses
+    * the endian-ness of the server setup */
+   setup = xcb_get_setup(_ecore_xcb_conn);
+   xif = format;
+
+   if ((xif == XCB_IMAGE_FORMAT_Z_PIXMAP) && (depth == 1))
+     xif = XCB_IMAGE_FORMAT_XY_PIXMAP;
+
+   if (dpth != depth)
+     {
+        dpth = depth;
+        fmt = _ecore_xcb_image_find_format(setup, depth);
+        if (!fmt) return 0;
+     }
+
+   switch (xif)
+     {
+      case XCB_IMAGE_FORMAT_XY_BITMAP:
+        if (depth != 1) return 0;
+
+      case XCB_IMAGE_FORMAT_XY_PIXMAP:
+      case XCB_IMAGE_FORMAT_Z_PIXMAP:
+        return xcb_image_create(w, h, xif,
+                                fmt->scanline_pad,
+                                fmt->depth, fmt->bits_per_pixel,
+                                setup->bitmap_format_scanline_unit,
+                                setup->image_byte_order,
+                                setup->bitmap_format_bit_order,
+                                base, bytes, data);
+
+      default:
+        break;
+     }
+
+   return 0;
+}
+
+static xcb_format_t *
+_ecore_xcb_image_find_format(const xcb_setup_t *setup,
+                             uint8_t            depth)
+{
+   xcb_format_t *fmt, *fmtend;
+
+   CHECK_XCB_CONN;
+
+   fmt = xcb_setup_pixmap_formats(setup);
+   fmtend = fmt + xcb_setup_pixmap_formats_length(setup);
+   for (; fmt != fmtend; ++fmt)
+     if (fmt->depth == depth)
+       return fmt;
+
+   return 0;
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_input.c b/src/lib/ecore_x/xcb/ecore_xcb_input.c
new file mode 100644 (file)
index 0000000..c0338c2
--- /dev/null
@@ -0,0 +1,274 @@
+#include "ecore_xcb_private.h"
+#ifdef ECORE_XCB_XINPUT
+# include <xcb/xinput.h>
+# include <xcb/xcb_event.h>
+#endif
+
+/* FIXME: this is a guess. can't find defines for touch events in xcb libs
+ * online */
+/* these are not yet defined in xcb support for xi2 - so manually create */
+#ifndef XCB_INPUT_DEVICE_TOUCH_BEGIN
+#define XCB_INPUT_DEVICE_TOUCH_BEGIN    18
+#endif
+#ifndef XCB_INPUT_DEVICE_TOUCH_END
+#define XCB_INPUT_DEVICE_TOUCH_END      19
+#endif
+#ifndef XCB_INPUT_DEVICE_TOUCH_UPDATE
+#define XCB_INPUT_DEVICE_TOUCH_UPDATE   21
+#endif
+
+#ifndef XCB_INPUT_POINTER_EMULATED_MASK
+#define XCB_INPUT_POINTER_EMULATED_MASK (1 << 16)
+#endif
+
+/* local variables */
+static Eina_Bool _input_avail = EINA_FALSE;
+
+/* external variables */
+int _ecore_xcb_event_input = 0;
+
+void
+_ecore_xcb_input_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XINPUT
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_input_id);
+#endif
+}
+
+void
+_ecore_xcb_input_finalize(void)
+{
+#ifdef ECORE_XCB_XINPUT
+   xcb_input_get_extension_version_cookie_t cookie;
+   xcb_input_get_extension_version_reply_t *reply;
+   char buff[128];
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XINPUT
+   cookie =
+     xcb_input_get_extension_version_unchecked(_ecore_xcb_conn, 127, buff);
+   reply =
+     xcb_input_get_extension_version_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        _input_avail = EINA_TRUE;
+        free(reply);
+     }
+
+   if (_input_avail)
+     {
+        const xcb_query_extension_reply_t *ext_reply;
+
+        ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_input_id);
+        if (ext_reply)
+          _ecore_xcb_event_input = ext_reply->first_event;
+     }
+#endif
+}
+
+void
+_ecore_xcb_input_shutdown(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+}
+
+void
+#ifdef ECORE_XCB_XINPUT
+_ecore_xcb_input_handle_event(xcb_generic_event_t *event)
+#else
+_ecore_xcb_input_handle_event(xcb_generic_event_t * event __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_XINPUT
+   xcb_ge_event_t *ev;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   /* FIXME: look at xlib ecore_x_xi2.c to copy logic in when i can find an
+    * xcb-input lib to test with */
+#ifdef ECORE_XCB_XINPUT
+   ev = (xcb_ge_event_t *)event;
+   switch (ev->event_type)
+     {
+      case XCB_INPUT_DEVICE_MOTION_NOTIFY:
+      {
+         xcb_input_device_motion_notify_event_t *de;
+         unsigned int child_win = 0;
+
+         de = (xcb_input_device_motion_notify_event_t *)ev->pad1;
+         child_win = (de->child ? de->child : de->event);
+         _ecore_xcb_event_mouse_move(de->time, de->state, de->event_x,
+                                     de->event_y, de->root_x, de->root_y,
+                                     de->event, child_win, de->root,
+                                     de->same_screen, de->device_id,
+                                     1, 1, 1.0, 0.0,
+                                     de->event_x, de->event_y,
+                                     de->root_x, de->root_y);
+      }
+      break;
+
+      case XCB_INPUT_DEVICE_BUTTON_PRESS:
+      {
+         xcb_input_device_button_press_event_t *de;
+         unsigned int child_win = 0;
+
+         de = (xcb_input_device_button_press_event_t *)ev->pad1;
+         child_win = (de->child ? de->child : de->event);
+         _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                                       de->time, de->state, de->detail,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y, de->event,
+                                       child_win, de->root,
+                                       de->same_screen, de->device_id,
+                                       1, 1, 1.0, 0.0,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y);
+      }
+      break;
+
+      case XCB_INPUT_DEVICE_BUTTON_RELEASE:
+      {
+         xcb_input_device_button_release_event_t *de;
+         unsigned int child_win = 0;
+
+         de = (xcb_input_device_button_release_event_t *)ev->pad1;
+         child_win = (de->child ? de->child : de->event);
+         _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
+                                       de->time, de->state, de->detail,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y, de->event,
+                                       child_win, de->root,
+                                       de->same_screen, de->device_id,
+                                       1, 1, 1.0, 0.0,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y);
+      }
+      break;
+
+      case XCB_INPUT_DEVICE_TOUCH_UPDATE:
+      {
+         xcb_input_device_motion_notify_event_t *de;
+         unsigned int child_win = 0;
+
+         de = (xcb_input_device_motion_notify_event_t *)ev->pad1;
+         child_win = (de->child ? de->child : de->event);
+         _ecore_xcb_event_mouse_move(de->time, de->state, de->event_x,
+                                     de->event_y, de->root_x, de->root_y,
+                                     de->event, child_win, de->root,
+                                     de->same_screen, de->device_id,
+                                     1, 1, 1.0, 0.0,
+                                     de->event_x, de->event_y,
+                                     de->root_x, de->root_y);
+      }
+      break;
+
+      case XCB_INPUT_DEVICE_TOUCH_BEGIN:
+      {
+         xcb_input_device_button_press_event_t *de;
+         unsigned int child_win = 0;
+
+         de = (xcb_input_device_button_press_event_t *)ev->pad1;
+         child_win = (de->child ? de->child : de->event);
+         _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                                       de->time, de->state, de->detail,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y, de->event,
+                                       child_win, de->root,
+                                       de->same_screen, de->device_id,
+                                       1, 1, 1.0, 0.0,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y);
+      }
+      break;
+
+      case XCB_INPUT_DEVICE_TOUCH_END:
+      {
+         xcb_input_device_button_release_event_t *de;
+         unsigned int child_win = 0;
+
+         de = (xcb_input_device_button_release_event_t *)ev->pad1;
+         child_win = (de->child ? de->child : de->event);
+         _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
+                                       de->time, de->state, de->detail,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y, de->event,
+                                       child_win, de->root,
+                                       de->same_screen, de->device_id,
+                                       1, 1, 1.0, 0.0,
+                                       de->event_x, de->event_y,
+                                       de->root_x, de->root_y);
+      }
+      break;
+
+      default:
+        break;
+     }
+#endif
+}
+
+EAPI Eina_Bool
+ecore_x_input_multi_select(Ecore_X_Window win)
+{
+   Eina_Bool find = EINA_FALSE;
+#ifdef ECORE_XCB_XINPUT
+   xcb_input_list_input_devices_cookie_t dcookie;
+   xcb_input_list_input_devices_reply_t *dreply;
+   xcb_input_device_info_iterator_t diter;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_input_avail) return EINA_FALSE;
+
+   /* FIXME: i can't seemingly test this! no xcb input lib so can't look and
+    * test and look at types etc. - look at xlib code and copy logic over
+    * when we can */
+#ifdef ECORE_XCB_XINPUT
+   dcookie = xcb_input_list_input_devices_unchecked(_ecore_xcb_conn);
+   dreply =
+     xcb_input_list_input_devices_reply(_ecore_xcb_conn, dcookie, NULL);
+   if (!dreply) return EINA_FALSE;
+
+   diter = xcb_input_list_input_devices_devices_iterator(dreply);
+   while (diter.rem)
+     {
+        xcb_input_device_info_t *dev;
+        const xcb_input_event_class_t iclass[] =
+        {
+           XCB_INPUT_DEVICE_BUTTON_PRESS,
+           XCB_INPUT_DEVICE_BUTTON_RELEASE,
+           XCB_INPUT_DEVICE_MOTION_NOTIFY,
+           XCB_INPUT_DEVICE_TOUCH_BEGIN,
+           XCB_INPUT_DEVICE_TOUCH_END,
+           XCB_INPUT_DEVICE_TOUCH_UPDATE
+        };
+
+        dev = diter.data;
+        if (dev->device_use == XCB_INPUT_DEVICE_USE_IS_X_EXTENSION_DEVICE)
+          {
+             DBG("Device %d", dev->device_id);
+             DBG("\tType: %d", dev->device_type);
+             DBG("\tNum Classes: %d", dev->num_class_info);
+             DBG("\tUse: %d", dev->device_use);
+
+             xcb_input_select_extension_event(_ecore_xcb_conn, win,
+                                              sizeof(iclass) / sizeof(xcb_input_event_class_t),
+                                              iclass);
+             find = EINA_TRUE;
+          }
+        xcb_input_device_info_next(&diter);
+     }
+   free(dreply);
+#endif
+
+   return find;
+   win = 0;
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_keymap.c b/src/lib/ecore_x/xcb/ecore_xcb_keymap.c
new file mode 100644 (file)
index 0000000..6c11246
--- /dev/null
@@ -0,0 +1,491 @@
+#include "ecore_xcb_private.h"
+#define NEED_KEYSYM_TABLE
+#define NEED_VTABLE
+#include "ecore_xcb_keysym_table.h"
+#include <xcb/xcb_keysyms.h>
+#include <X11/keysym.h>
+
+/* local function prototypes */
+static int          _ecore_xcb_keymap_mask_get(void        *reply,
+                                               xcb_keysym_t sym);
+static xcb_keysym_t _ecore_xcb_keymap_string_to_keysym(const char *str);
+static int          _ecore_xcb_keymap_translate_key(xcb_keycode_t keycode,
+                                                    unsigned int  modifiers,
+                                                    unsigned int *modifiers_return,
+                                                    xcb_keysym_t *keysym_return);
+static int _ecore_xcb_keymap_translate_keysym(xcb_keysym_t keysym,
+                                              unsigned int modifiers,
+                                              char        *buffer,
+                                              int          bytes);
+
+/* local variables */
+static xcb_key_symbols_t *_ecore_xcb_keysyms;
+static int _ecore_xcb_mode_switch = 0;
+
+/* public variables */
+EAPI int ECORE_X_MODIFIER_SHIFT = 0;
+EAPI int ECORE_X_MODIFIER_CTRL = 0;
+EAPI int ECORE_X_MODIFIER_ALT = 0;
+EAPI int ECORE_X_MODIFIER_WIN = 0;
+EAPI int ECORE_X_MODIFIER_ALTGR = 0;
+EAPI int ECORE_X_LOCK_SCROLL = 0;
+EAPI int ECORE_X_LOCK_NUM = 0;
+EAPI int ECORE_X_LOCK_CAPS = 0;
+EAPI int ECORE_X_LOCK_SHIFT = 0;
+
+void
+_ecore_xcb_keymap_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   _ecore_xcb_keysyms = xcb_key_symbols_alloc(_ecore_xcb_conn);
+}
+
+void
+_ecore_xcb_keymap_finalize(void)
+{
+   xcb_get_modifier_mapping_cookie_t cookie;
+   xcb_get_modifier_mapping_reply_t *reply;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   cookie = xcb_get_modifier_mapping_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_modifier_mapping_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply)
+     {
+        xcb_key_symbols_free(_ecore_xcb_keysyms);
+        return;
+     }
+
+   _ecore_xcb_mode_switch = _ecore_xcb_keymap_mask_get(reply, XK_Mode_switch);
+
+   ECORE_X_MODIFIER_SHIFT = _ecore_xcb_keymap_mask_get(reply, XK_Shift_L);
+   ECORE_X_MODIFIER_CTRL = _ecore_xcb_keymap_mask_get(reply, XK_Control_L);
+
+   ECORE_X_MODIFIER_ALT = _ecore_xcb_keymap_mask_get(reply, XK_Alt_L);
+   if (!ECORE_X_MODIFIER_ALT)
+     ECORE_X_MODIFIER_ALT = _ecore_xcb_keymap_mask_get(reply, XK_Meta_L);
+   if (!ECORE_X_MODIFIER_ALT)
+     ECORE_X_MODIFIER_ALT = _ecore_xcb_keymap_mask_get(reply, XK_Super_L);
+
+   ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Super_L);
+   if (!ECORE_X_MODIFIER_WIN)
+     ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Meta_L);
+
+   ECORE_X_MODIFIER_ALTGR = _ecore_xcb_keymap_mask_get(reply, XK_Mode_switch);
+
+   if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
+     ECORE_X_MODIFIER_WIN = 0;
+   if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL)
+     ECORE_X_MODIFIER_ALT = 0;
+
+   ECORE_X_LOCK_SCROLL = _ecore_xcb_keymap_mask_get(reply, XK_Scroll_Lock);
+   ECORE_X_LOCK_NUM = _ecore_xcb_keymap_mask_get(reply, XK_Num_Lock);
+   ECORE_X_LOCK_CAPS = _ecore_xcb_keymap_mask_get(reply, XK_Caps_Lock);
+   ECORE_X_LOCK_SHIFT = _ecore_xcb_keymap_mask_get(reply, XK_Shift_Lock);
+}
+
+void
+_ecore_xcb_modifiers_get(void)
+{
+   _ecore_xcb_keymap_finalize();
+}
+
+void
+_ecore_xcb_keymap_shutdown(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (_ecore_xcb_keysyms) xcb_key_symbols_free(_ecore_xcb_keysyms);
+}
+
+void
+_ecore_xcb_keymap_refresh(xcb_mapping_notify_event_t *event)
+{
+   CHECK_XCB_CONN;
+   xcb_refresh_keyboard_mapping(_ecore_xcb_keysyms, event);
+}
+
+xcb_keysym_t
+_ecore_xcb_keymap_keycode_to_keysym(xcb_keycode_t keycode,
+                                    int           col)
+{
+   xcb_keysym_t key0, key1;
+
+   CHECK_XCB_CONN;
+   if (col & _ecore_xcb_mode_switch)
+     {
+        key0 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 4);
+        key1 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 5);
+     }
+   else
+     {
+        key0 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 0);
+        key1 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 1);
+     }
+
+   if (key1 == XCB_NO_SYMBOL)
+     key1 = key0;
+
+   if ((col & ECORE_X_LOCK_NUM) &&
+       ((xcb_is_keypad_key(key1)) || (xcb_is_private_keypad_key(key1))))
+     {
+        if ((col & XCB_MOD_MASK_SHIFT) ||
+            ((col & XCB_MOD_MASK_LOCK) && (col & ECORE_X_LOCK_SHIFT)))
+          return key0;
+        else
+          return key1;
+     }
+   else if (!(col & XCB_MOD_MASK_SHIFT) && !(col & XCB_MOD_MASK_LOCK))
+     return key0;
+   else if (!(col & XCB_MOD_MASK_SHIFT) &&
+            (col & XCB_MOD_MASK_LOCK && (col & ECORE_X_LOCK_CAPS)))
+     return key1;
+   else if ((col & XCB_MOD_MASK_SHIFT) &&
+            (col & XCB_MOD_MASK_LOCK) && (col & ECORE_X_LOCK_CAPS))
+     return key0;
+   else if ((col & XCB_MOD_MASK_SHIFT) ||
+            (col & XCB_MOD_MASK_LOCK && (col & ECORE_X_LOCK_SHIFT)))
+     return key1;
+
+   return XCB_NO_SYMBOL;
+}
+
+xcb_keycode_t *
+_ecore_xcb_keymap_keysym_to_keycode(xcb_keysym_t keysym)
+{
+   CHECK_XCB_CONN;
+   return xcb_key_symbols_get_keycode(_ecore_xcb_keysyms, keysym);
+}
+
+char *
+_ecore_xcb_keymap_keysym_to_string(xcb_keysym_t keysym)
+{
+   int i = 0, n = 0, h = 0, idx = 0;
+   const unsigned char *entry;
+   unsigned char val1, val2, val3, val4;
+
+   CHECK_XCB_CONN;
+   if (!keysym) return NULL;
+   if (keysym == XK_VoidSymbol) keysym = 0;
+   if (keysym <= 0x1fffffff)
+     {
+        val1 = (keysym >> 24);
+        val2 = ((keysym >> 16) & 0xff);
+        val3 = ((keysym >> 8) & 0xff);
+        val4 = (keysym & 0xff);
+        i = keysym % VTABLESIZE;
+        h = i + 1;
+        n = VMAXHASH;
+        while ((idx = hashKeysym[i]))
+          {
+             entry = &_ecore_xcb_keytable[idx];
+             if ((entry[0] == val1) && (entry[1] == val2) &&
+                 (entry[2] == val3) && (entry[3] == val4))
+               return (char *)entry + 4;
+             if (!--n) break;
+             i += h;
+             if (i >= VTABLESIZE) i -= VTABLESIZE;
+          }
+     }
+
+   if ((keysym >= 0x01000100) && (keysym <= 0x0110ffff))
+     {
+        xcb_keysym_t val;
+        char *s = NULL;
+        int i = 0;
+
+        val = (keysym & 0xffffff);
+        if (val & 0xff0000)
+          i = 10;
+        else
+          i = 6;
+
+        if (!(s = malloc(i))) return NULL;
+        i--;
+        s[i--] = '\0';
+        for (; i; i--)
+          {
+             val1 = (val & 0xf);
+             val >>= 4;
+             if (val1 < 10)
+               s[i] = '0' + val1;
+             else
+               s[i] = 'A' + val1 - 10;
+          }
+        s[i] = 'U';
+        return s;
+     }
+
+   return NULL;
+}
+
+xcb_keycode_t
+_ecore_xcb_keymap_string_to_keycode(const char *key)
+{
+   if (!strncmp(key, "Keycode-", 8))
+     return atoi(key + 8);
+   else
+     {
+        xcb_keysym_t keysym = XCB_NO_SYMBOL;
+        xcb_keycode_t *keycodes, keycode = 0;
+        int i = 0;
+
+        CHECK_XCB_CONN;
+
+        keysym = _ecore_xcb_keymap_string_to_keysym(key);
+        if (keysym == XCB_NO_SYMBOL) return XCB_NO_SYMBOL;
+
+        keycodes = _ecore_xcb_keymap_keysym_to_keycode(keysym);
+        if (!keycodes) return XCB_NO_SYMBOL;
+
+        while (keycodes[i] != XCB_NO_SYMBOL)
+          {
+             if (keycodes[i] != 0)
+               {
+                  keycode = keycodes[i];
+                  break;
+               }
+             i++;
+          }
+        return keycode;
+     }
+}
+
+int
+_ecore_xcb_keymap_lookup_string(xcb_keycode_t keycode,
+                                int           state,
+                                char         *buffer,
+                                int           bytes,
+                                xcb_keysym_t *sym)
+{
+   unsigned int modifiers = 0;
+   xcb_keysym_t keysym;
+
+   CHECK_XCB_CONN;
+   if (!_ecore_xcb_keymap_translate_key(keycode, state, &modifiers, &keysym))
+     return 0;
+
+   if (sym) *sym = keysym;
+
+   return _ecore_xcb_keymap_translate_keysym(keysym, state, buffer, bytes);
+}
+
+EAPI const char *
+ecore_x_keysym_string_get(int keysym)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_keymap_keysym_to_string(keysym);
+}
+
+EAPI int 
+ecore_x_keysym_keycode_get(const char *keyname)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_keymap_string_to_keycode(keyname);
+}
+
+/* local functions */
+static int
+_ecore_xcb_keymap_mask_get(void        *reply,
+                           xcb_keysym_t sym)
+{
+   xcb_get_modifier_mapping_reply_t *rep;
+   xcb_keysym_t sym2;
+   int mask = 0;
+   const int masks[8] =
+   {
+      XCB_MOD_MASK_SHIFT, XCB_MOD_MASK_LOCK, XCB_MOD_MASK_CONTROL,
+      XCB_MOD_MASK_1, XCB_MOD_MASK_2, XCB_MOD_MASK_3, XCB_MOD_MASK_4,
+      XCB_MOD_MASK_5
+   };
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   rep = (xcb_get_modifier_mapping_reply_t *)reply;
+   if ((rep) && (rep->keycodes_per_modifier > 0))
+     {
+        int i = 0;
+        xcb_keycode_t *modmap;
+
+        modmap = xcb_get_modifier_mapping_keycodes(rep);
+        for (i = 0; i < (8 * rep->keycodes_per_modifier); i++)
+          {
+             int j = 0;
+
+             for (j = 0; j < 8; j++)
+               {
+                  sym2 =
+                    xcb_key_symbols_get_keysym(_ecore_xcb_keysyms,
+                                               modmap[i], j);
+                  if (sym2 != 0) break;
+               }
+             if (sym2 == sym)
+               {
+                  mask = masks[i / rep->keycodes_per_modifier];
+                  break;
+               }
+          }
+     }
+
+   return mask;
+}
+
+static xcb_keysym_t
+_ecore_xcb_keymap_string_to_keysym(const char *str)
+{
+   int i = 0, n = 0, h = 0;
+   unsigned long sig = 0;
+   const char *p = NULL;
+   int c = 0, idx = 0;
+   const unsigned char *entry;
+   unsigned char sig1, sig2;
+   long unsigned int val;
+
+   p = str;
+   while ((c = *p++))
+     sig = (sig << 1) + c;
+
+   i = (sig % KTABLESIZE);
+   h = i + 1;
+   sig1 = (sig >> 8) & 0xff;
+   sig2 = sig & 0xff;
+   n = KMAXHASH;
+
+   while ((idx = hashString[i]))
+     {
+        entry = &_ecore_xcb_keytable[idx];
+        if ((entry[0] == sig1) && (entry[1] == sig2) &&
+            !strcmp(str, (char *)entry + 6))
+          {
+             val = ((entry[2] << 24) | (entry[3] << 16) |
+                    (entry[4] << 8) | (entry[5]));
+             if (!val) val = 0xffffff;
+             return val;
+          }
+        if (!--n) break;
+        i += h;
+        if (i >= KTABLESIZE) i -= KTABLESIZE;
+     }
+
+   if (*str == 'U')
+     {
+        val = 0;
+        for (p = &str[1]; *p; p++)
+          {
+             c = *p;
+             if (('0' <= c) && (c <= '9'))
+               val = (val << 4) + c - '0';
+             else if (('a' <= c) && (c <= 'f'))
+               val = (val << 4) + c - 'a' + 10;
+             else if (('A' <= c) && (c <= 'F'))
+               val = (val << 4) + c - 'A' + 10;
+             else
+               return XCB_NO_SYMBOL;
+             if (val > 0x10ffff) return XCB_NO_SYMBOL;
+          }
+        if ((val < 0x20) || ((val > 0x7e) && (val < 0xa0)))
+          return XCB_NO_SYMBOL;
+        if (val < 0x100) return val;
+        return val | 0x01000000;
+     }
+
+   if ((strlen(str) > 2) && (str[0] == '0') && (str[1] == 'x'))
+     {
+        char *tmp = NULL;
+
+        val = strtoul(str, &tmp, 16);
+        if ((val == ULONG_MAX) || ((tmp) && (*tmp != '\0')))
+          return XCB_NO_SYMBOL;
+        else
+          return val;
+     }
+
+   if (!strncmp(str, "XF86_", 5))
+     {
+        long unsigned int ret;
+        char *tmp;
+
+        tmp = strdup(str);
+        if (!tmp) return XCB_NO_SYMBOL;
+        memmove(&tmp[4], &tmp[5], strlen(str) - 5 + 1);
+        ret = _ecore_xcb_keymap_string_to_keysym(tmp);
+        free(tmp);
+        return ret;
+     }
+
+   return XCB_NO_SYMBOL;
+}
+
+static int
+_ecore_xcb_keymap_translate_key(xcb_keycode_t keycode,
+                                unsigned int  modifiers,
+                                unsigned int *modifiers_return,
+                                xcb_keysym_t *keysym_return)
+{
+   xcb_keysym_t sym;
+
+   if (!_ecore_xcb_keysyms) return 0;
+
+   sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, modifiers);
+
+   if (modifiers_return)
+     *modifiers_return = ((XCB_MOD_MASK_SHIFT | XCB_MOD_MASK_LOCK) |
+                          _ecore_xcb_mode_switch | ECORE_X_LOCK_NUM);
+   if (keysym_return)
+     *keysym_return = sym;
+
+   return 1;
+}
+
+static int
+_ecore_xcb_keymap_translate_keysym(xcb_keysym_t keysym,
+                                   unsigned int modifiers,
+                                   char        *buffer,
+                                   int          bytes)
+{
+   unsigned long hbytes = 0;
+   unsigned char c;
+
+   if (!keysym) return 0;
+   hbytes = (keysym >> 8);
+
+   if (!(bytes &&
+         ((hbytes == 0) ||
+          ((hbytes == 0xFF) &&
+           (((keysym >= XK_BackSpace) && (keysym <= XK_Clear)) ||
+            (keysym == XK_Return) || (keysym == XK_Escape) ||
+            (keysym == XK_KP_Space) || (keysym == XK_KP_Tab) ||
+            (keysym == XK_KP_Enter) ||
+            ((keysym >= XK_KP_Multiply) && (keysym <= XK_KP_9)) ||
+            (keysym == XK_KP_Equal) || (keysym == XK_Delete))))))
+     return 0;
+
+   if (keysym == XK_KP_Space)
+     c = (XK_space & 0x7F);
+   else if (hbytes == 0xFF)
+     c = (keysym & 0x7F);
+   else
+     c = (keysym & 0xFF);
+
+   if (modifiers & ECORE_X_MODIFIER_CTRL)
+     {
+        if (((c >= '@') && (c < '\177')) || c == ' ')
+          c &= 0x1F;
+        else if (c == '2')
+          c = '\000';
+        else if ((c >= '3') && (c <= '7'))
+          c -= ('3' - '\033');
+        else if (c == '8')
+          c = '\177';
+        else if (c == '/')
+          c = '_' & 0x1F;
+     }
+   buffer[0] = c;
+   return 1;
+}
+
index f96c4cf..6c95331 100644 (file)
@@ -1,24 +1,10 @@
-/*
- * Various MWM related functions.
- * 
- * This is ALL the code involving anything MWM related. for both WM and
- * client.
- */
-
 #include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
+//#include "Ecore_X_Atoms.h"
 
-
-/**
- * @defgroup Ecore_X_MWM_Group MWM related functions.
- *
- * Functions related to MWM.
- */
-
-#define ECORE_X_MWM_HINTS_FUNCTIONS           (1 << 0)
-#define ECORE_X_MWM_HINTS_DECORATIONS         (1 << 1)
-#define ECORE_X_MWM_HINTS_INPUT_MODE          (1 << 2)
-#define ECORE_X_MWM_HINTS_STATUS              (1 << 3)
+#define ECORE_X_MWM_HINTS_FUNCTIONS   (1 << 0)
+#define ECORE_X_MWM_HINTS_DECORATIONS (1 << 1)
+#define ECORE_X_MWM_HINTS_INPUT_MODE  (1 << 2)
+#define ECORE_X_MWM_HINTS_STATUS      (1 << 3)
 
 typedef struct _mwmhints
 {
@@ -27,74 +13,64 @@ typedef struct _mwmhints
    uint32_t decorations;
    int32_t  inputmode;
    uint32_t status;
-}
-MWMHints;
-
+} MWMHints;
 
 /**
- * Sends the GetProperty request.
- * @param window Window whose MWM hints are requested.
- * @ingroup Ecore_X_MWM_Group
+ * @defgroup Ecore_X_MWM_Group MWM related functions.
+ *
+ * Functions related to MWM.
  */
-EAPI void
-ecore_x_mwm_hints_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? window : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       ECORE_X_ATOM_MOTIF_WM_HINTS,
-                                       ECORE_X_ATOM_MOTIF_WM_HINTS,
-                                       0, LONG_MAX);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
 
 /**
- * Gets the reply of the GetProperty request sent by ecore_x_mwm_hints_get_prefetch().
+ * Sets the borderless flag of a window using MWM.
+ *
+ * @param win The window.
+ * @param borderless The borderless flag.
+ *
  * @ingroup Ecore_X_MWM_Group
  */
 EAPI void
-ecore_x_mwm_hints_get_fetch(void)
+ecore_x_mwm_borderless_set(Ecore_X_Window win,
+                           Eina_Bool      borderless)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   uint32_t data[5] = { 0, 0, 0, 0, 0 };
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   data[0] = 2;
+   data[2] = !borderless;
+
+   ecore_x_window_prop_property_set(win,
+                                    ECORE_X_ATOM_MOTIF_WM_HINTS,
+                                    ECORE_X_ATOM_MOTIF_WM_HINTS, 32,
+                                    (void *)data, 5);
 }
 
-/**
- * To document.
- * @param  window Unused.
- * @param  fhint To document.
- * @param  dhint To document.
- * @param  ihint To document.
- * @return       1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_mwm_hints_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_mwm_hints_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_MWM_Group
- */
-EAPI int
-ecore_x_mwm_hints_get(Ecore_X_Window          window __UNUSED__,
-                     Ecore_X_MWM_Hint_Func  *fhint,
-                     Ecore_X_MWM_Hint_Decor *dhint,
-                     Ecore_X_MWM_Hint_Input *ihint)
+EAPI Eina_Bool
+ecore_x_mwm_hints_get(Ecore_X_Window          win,
+                      Ecore_X_MWM_Hint_Func  *fhint,
+                      Ecore_X_MWM_Hint_Decor *dhint,
+                      Ecore_X_MWM_Hint_Input *ihint)
 {
-   MWMHints                 *mwmhints = NULL;
-   int                       ret = 0;
+   xcb_get_property_cookie_t cookie;
    xcb_get_property_reply_t *reply;
+   MWMHints *mwmhints = NULL;
+   int ret = EINA_FALSE;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if ((reply->format != 32) ||
-       (reply->value_len == 0))
-      return 0;
+   cookie =
+     xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
+                                ECORE_X_ATOM_MOTIF_WM_HINTS,
+                                ECORE_X_ATOM_MOTIF_WM_HINTS, 0, UINT_MAX);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+   if ((reply->format != 32) || (reply->value_len == 0))
+     {
+        free(reply);
+        return EINA_FALSE;
+     }
 
    mwmhints = xcb_get_property_value(reply);
    if (reply->value_len >= 4)
@@ -120,30 +96,9 @@ ecore_x_mwm_hints_get(Ecore_X_Window          window __UNUSED__,
              else
                *ihint = ECORE_X_MWM_HINT_INPUT_MODELESS;
           }
-        ret = 1;
+        ret = EINA_TRUE;
      }
-
+   free(reply);
    return ret;
 }
 
-/**
- * Sets the borderless flag of a window using MWM.
- * @param window     The window.
- * @param borderless The borderless flag.
- * @ingroup Ecore_X_MWM_Group
- */
-EAPI void
-ecore_x_mwm_borderless_set(Ecore_X_Window window,
-                           int            borderless)
-{
-   uint32_t data[5] = {0, 0, 0, 0, 0};
-
-   data[0] = 2; /* just set the decorations hint! */
-   data[2] = !borderless;
-   
-   if (window == 0) window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_MOTIF_WM_HINTS, ECORE_X_ATOM_MOTIF_WM_HINTS,
-                       32, 5, data);
-}
-
index 13026b1..954e663 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#include "ecore_xcb_private.h"
 
-/*
- * _NET_WM... aka Extended Window Manager Hint (EWMH) functions.
- */
+/* local function prototypes */
+/* static void _ecore_xcb_netwm_startup_info_free(void *data); */
+static Ecore_X_Atom        _ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type);
+static Ecore_X_Window_Type _ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom);
+static Ecore_X_Atom        _ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state);
+static Ecore_X_Atom        _ecore_xcb_netwm_action_atom_get(Ecore_X_Action action);
 
-#include "Ecore_Data.h"
-#include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
+/* local variables */
+//static Eina_Hash *_startup_info = NULL;
+
+/* local structures */
+typedef struct _Ecore_Xcb_Startup_Info Ecore_Xcb_Startup_Info;
+struct _Ecore_Xcb_Startup_Info
+{
+   Ecore_X_Window win;
+   int            init, size;
+   char          *buffer;
+   int            length;
+
+   /* sequence info fields */
+   char          *id, *name;
+   int            screen;
+   char          *bin, *icon;
+   int            desktop, timestamp;
+   char          *description, *wmclass;
+   int            silent;
+};
 
+EAPI void
+ecore_x_netwm_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/**
- * @defgroup Ecore_X_NetWM_Group Extended Window Manager Hint (EWMH) functions
- *
- * Functions related to the Extended Window Manager Hint (EWMH).
- */
+//   _startup_info =
+//     eina_hash_string_superfast_new(_ecore_xcb_netwm_startup_info_free);
+}
 
+EAPI void
+ecore_x_netwm_shutdown(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-typedef struct _Ecore_X_Startup_Info Ecore_X_Startup_Info;
+//   if (_startup_info) eina_hash_free(_startup_info);
+//   _startup_info = NULL;
+}
 
-struct _Ecore_X_Startup_Info
+EAPI Eina_Bool
+ecore_x_netwm_pid_get(Ecore_X_Window win,
+                      int           *pid)
 {
-   Ecore_X_Window win;
+   uint32_t tmp;
 
-   int   init;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   int   buffer_size;
-   char *buffer;
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1))
+     return EINA_FALSE;
 
-   int   length;
+   if (pid) *pid = tmp;
 
-   /* These are the sequence info fields */
-   char *id;
-   char *name;
-   int   screen;
-   char *bin;
-   char *icon;
-   int   desktop;
-   int   timestamp;
-   char *description;
-   char *wmclass;
-   int   silent;
-};
+   return EINA_TRUE;
+}
 
-#if 0
-static void  _ecore_x_window_prop_string_utf8_get_prefetch(Ecore_X_Window window, Ecore_X_Atom atom);
-static void  _ecore_x_window_prop_string_utf8_get_fetch(void);
-#endif
-static void  _ecore_x_window_prop_string_utf8_set(Ecore_X_Window window, Ecore_X_Atom atom, const char *str);
-static char *_ecore_x_window_prop_string_utf8_get(Ecore_X_Window window, Ecore_X_Atom atom);
-#if 0 /* Unused */
-static int   _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info);
-static int   _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info, char *data);
-#endif
-static void  _ecore_x_netwm_startup_info_free(void *data);
-
-/*
- * Local variables
- */
-
-static Ecore_Hash *startup_info = NULL;
-
-/**
- * Initialize the NetWM module
- */
 EAPI void
-ecore_x_netwm_init(void)
+ecore_x_netwm_pid_set(Ecore_X_Window win,
+                      int            pid)
+{
+   unsigned int tmp;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   tmp = pid;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_netwm_window_type_get(Ecore_X_Window       win,
+                              Ecore_X_Window_Type *type)
+{
+   Ecore_X_Atom *atoms;
+   int num = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
+
+   num =
+     ecore_x_window_prop_atom_list_get(win,
+                                       ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atoms);
+   if ((type) && (num >= 1) && (atoms))
+     *type = _ecore_xcb_netwm_window_type_type_get(atoms[0]);
+
+   if (atoms) free(atoms);
+
+   if (num >= 1) return EINA_TRUE;
+   return EINA_FALSE;
+}
+
+EAPI void
+ecore_x_netwm_window_type_set(Ecore_X_Window      win,
+                              Ecore_X_Window_Type type)
+{
+   Ecore_X_Atom atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   atom = _ecore_xcb_netwm_window_type_atom_get(type);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atom, 1);
+}
+
+EAPI int
+ecore_x_netwm_window_types_get(Ecore_X_Window        win,
+                               Ecore_X_Window_Type **types)
 {
-   startup_info = ecore_hash_new(ecore_direct_hash, ecore_direct_compare);
-   if (startup_info)
+   int num = 0, i = 0;
+   Ecore_X_Atom *atoms = NULL;
+   Ecore_X_Window_Type *atoms2 = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (types) *types = NULL;
+   num =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
+                                       &atoms);
+   if ((num <= 0) || (!atoms))
+     {
+        if (atoms) free(atoms);
+        return 0;
+     }
+
+   atoms2 = malloc(num * sizeof(Ecore_X_Window_Type));
+   if (!atoms2)
      {
-       ecore_hash_free_value_cb_set(startup_info, _ecore_x_netwm_startup_info_free);
+        if (atoms) free(atoms);
+        return 0;
      }
+
+   for (i = 0; i < num; i++)
+     atoms2[i] = _ecore_xcb_netwm_window_type_type_get(atoms[i]);
+   if (atoms) free(atoms);
+
+   if (types)
+     *types = atoms2;
+   else
+     free(atoms2);
+
+   return num;
+}
+
+EAPI int
+ecore_x_netwm_name_get(Ecore_X_Window win,
+                       char         **name)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     *name = ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_NAME);
+   return 1;
 }
 
-/**
- * Shutdown the NetWM module
- */
 EAPI void
-ecore_x_netwm_shutdown(void)
+ecore_x_netwm_name_set(Ecore_X_Window win,
+                       const char    *name)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
+}
+
+EAPI void
+ecore_x_netwm_opacity_set(Ecore_X_Window win,
+                          unsigned int   opacity)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
+                                  &opacity, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_netwm_opacity_get(Ecore_X_Window win,
+                          unsigned int  *opacity)
 {
-   if (startup_info)
-     ecore_hash_destroy(startup_info);
-   startup_info = NULL;
-}
-
-/**
- * Set the _NET_SUPPORTING_WM_CHECK property.
- * @param root    The root window.
- * @param check   The child window.
- * @param wm_name The name of the Window Manager.
- *
- * Set the _NET_SUPPORTING_WM_CHECK property on the @p root window to be
- * the ID of the child window @p check created by the Window Manager.
- * @p check also have the _NET_WM_NAME property set to the name
- * @p wm_name of the Window Manager.
- *
- * The Window MUST call that function to indicate that a compliant
- * window manager is active.
- * @ingroup Ecore_X_NetWM_Group
- */
+   unsigned int tmp = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
+                                       &tmp, 1))
+     return EINA_FALSE;
+
+   if (opacity) *opacity = tmp;
+
+   return EINA_TRUE;
+}
+
 EAPI void
 ecore_x_netwm_wm_identify(Ecore_X_Window root,
                           Ecore_X_Window check,
-                         const char    *wm_name)
-{
-   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
-   ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
-   _ecore_x_window_prop_string_utf8_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
-   /* This one isn't mandatory */
-   _ecore_x_window_prop_string_utf8_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
-}
-
-/**
- * Set the _NET_SUPPORTED property.
- * @param root      The root window.
- * @param supported The supported hints.
- * @param num       The number of hints.
- *
- * Set the _NET_SUPPORTED property on the @p root window. The hints
- * that the Window Manager supports are stored in @p supported.
- *
- * The Window Manager MUST set this property to indicate which hints
- * it supports.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_supported_set(Ecore_X_Window root,
-                            Ecore_X_Atom  *supported,
-                            int            num)
+                          const char    *wm_name)
 {
-   ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED, supported, num);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
+                                  &check, 1);
+   ecore_x_window_prop_string_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
+   ecore_x_window_prop_string_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
+                                  &check, 1);
 }
 
-/**
- * Sends the GetProperty request.
- * @param root The root window
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_supported_get_prefetch(Ecore_X_Window root)
+ecore_x_netwm_supported_set(Ecore_X_Window root,
+                            Ecore_X_Atom  *supported,
+                            int            num)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, root,
-                                       ECORE_X_ATOM_NET_SUPPORTED, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED,
+                                supported, num);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_supported_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_supported_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the hints supported by the Window Manager.
- * @param root      The root window.
- * @param supported The supported hints.
- * @param num       The number of atoms.
- * @return          1 on success, 0 otherwise.
- *
- * Get the hints supported by the Window Manager. @p root is the root
- * window. The hints are stored in @p supported. The number of hints
- * is stored in @p num.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_supported_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_supported_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
+EAPI Eina_Bool
 ecore_x_netwm_supported_get(Ecore_X_Window root,
                             Ecore_X_Atom **supported,
                             int           *num)
 {
-   int num_ret;
+   int num_ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (num) *num = 0UL;
+   if (num) *num = 0;
    if (supported) *supported = NULL;
 
-   num_ret = ecore_x_window_prop_xid_list_get(root,
-                                              ECORE_X_ATOM_NET_SUPPORTED,
-                                              ECORE_X_ATOM_ATOM,
-                                              supported);
-   if (num_ret <= 0)
-      return 0;
+   num_ret =
+     ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
+                                       supported);
+   if (num_ret <= 0) return EINA_FALSE;
+   if (num) *num = num_ret;
 
-   if (num) *num = (uint32_t)num_ret;
-   return 1;
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_NUMBER_OF_DESKTOPS property.
- * @param root The root window.
- * @param n_desks The number of desktops.
- *
- * Set the number of desktops @p n_desks of the Window Manager by
- * sending the _NET_NUMBER_OF_DESKTOPS to the @p root window.
- *
- * The Window Manager SHOULD set and update this property to indicate
- * the number of virtual desktops. A Pager can request a change in the
- * number of desktops by using that function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_desk_count_set(Ecore_X_Window root,
                              unsigned int   n_desks)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
-                                 &n_desks, 1);
-}
-
-/**
- * Set the _NET_VIRTUAL_ROOTS property.
- * @param root    The root window.
- * @param vroots  The virtual root windows.
- * @param n_desks The number of desks.
- *
- * Set the number of virtual desktops by sending the
- * _NET_VIRTUAL_ROOTS property to the @p root window. @p vroots is an
- * array of window and @p n_desks is the number of windows.
- *
- * A Window Manager that implements virtual desktops by reparent
- * client windows to a child of the root window MUST use that
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
+                                  &n_desks, 1);
+}
+
 EAPI void
 ecore_x_netwm_desk_roots_set(Ecore_X_Window  root,
-                            Ecore_X_Window *vroots,
+                             Ecore_X_Window *vroots,
                              unsigned int    n_desks)
 {
-   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS, vroots, n_desks);
-}
-
-/**
- * Set the _NET_DESKTOP_NAMES property.
- * @param root    The root window.
- * @param names   The names of the virtual desktops.
- * @param n_desks The number of virtual desktops.
- *
- * Set the name of each virtual desktop by sending the
- * _NET_DESKTOP_NAMES to the @p root window. @p names are the names of
- * the virtual desktops and @p n_desks is the number of virtual
- * desktops.
- *
- * A Pager MAY use that function. @p n_desks may be different from the
- * one passed to ecore_x_netwm_desk_count_set().  If it less or equal,
- * then the desktops with high numbers are unnamed. If it is larger,
- * then the excess names are considered to be reserved in case the
- * number of desktops is increased.
- * @ingroup Ecore_X_NetWM_Group
- */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS,
+                                  vroots, n_desks);
+}
+
 EAPI void
 ecore_x_netwm_desk_names_set(Ecore_X_Window root,
-                            const char   **names,
+                             const char   **names,
                              unsigned int   n_desks)
 {
-   char        ss[32];
-   char       *buf;
+   char ss[32], *buf = NULL, *t = NULL;
    const char *s;
-   uint32_t    i;
-   uint32_t    len;
-   uint32_t    l;
+   uint32_t len = 0, i, l;
 
-   buf = NULL;
-   len = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
    for (i = 0; i < n_desks; i++)
      {
-       s = (names) ? names[i] : NULL;
-       if (!s)
-         {
-            /* Default to "Desk-<number>" */
-            sprintf(ss, "Desk-%d", i);
-            s = ss;
-         }
-
-       l = strlen(s) + 1;
-       buf = realloc(buf, len + l);
-       memcpy(buf + len, s, l);
-       len += l;
+        s = ((names) ? names[i] : NULL);
+        if (!s)
+          {
+             /* Default to "Desk-<number>" */
+              sprintf(ss, "Desk-%d", i);
+              s = ss;
+          }
+
+        l = strlen(s) + 1;
+        t = realloc(buf, len + 1);
+        if (t)
+          {
+             buf = t;
+             memcpy(buf + len, s, l);
+          }
+        len += l;
      }
 
    xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, root,
                        ECORE_X_ATOM_NET_DESKTOP_NAMES,
-                       ECORE_X_ATOM_UTF8_STRING,
-                       8, len, (const void *)buf);
+                       ECORE_X_ATOM_UTF8_STRING, 8, len, (const void *)buf);
+//   ecore_x_flush();
    free(buf);
 }
 
-/**
- * Set the _NET_DESKTOP_GEOMETRY property.
- * @param root   The root window.
- * @param width  The width of the desktop.
- * @param height The height of the desktop.
- *
- * Set the common @p width and @p height of all desktops by sending
- * the _NET_DESKTOP_GEOMETRY to the @p root window.
- *
- * This size is equal to the screen size if the Window Manager doesn't
- * support large desktops, otherwise it's equal to the virtual size of
- * the desktop. The Window Manager SHOULD set this property. A Pager
- * can request a change in the desktop geometry by using this
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_desk_size_set(Ecore_X_Window root,
                             unsigned int   width,
@@ -325,105 +309,25 @@ ecore_x_netwm_desk_size_set(Ecore_X_Window root,
 {
    uint32_t size[2];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    size[0] = width;
    size[1] = height;
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_DESKTOP_GEOMETRY,
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY,
                                   size, 2);
 }
 
-/**
- * Set the _NET_DESKTOP_VIEWPORT property.
- * @param root    The root window.
- * @param origins An array of paris of coordiantes.
- * @param n_desks The number of virtual desktops.
- *
- * Set the top left corner of each desktop's viewport by sending the
- * _NET_DESKTOP_VIEWPORT property to the @p root window. @p origins
- * contains each pair of X coordinate and Y coordinate of the top left
- * corner of each desktop's viewport.
- *
- * If the Window Manager does not support large desktops, the
- * coordinates MUST be (0,0). A Pager can request to change the
- * viewport for the current desktop by using this function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
                                  unsigned int  *origins,
                                  unsigned int   n_desks)
 {
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
-                                  origins, 2 * n_desks);
-}
-
-/**
- * Set the _NET_DESKTOP_LAYOUT property.
- * @param root The root window.
- * @param orientation
- * @param columns
- * @param rows
- * @param starting_corner
- *
- * Set the layout of virtual desktops relative to each other by
- * sending the _NET_DESKTOP_LAYOUT to the @p root window.
- * @p orientation defines the orientation of the virtual desktop. 0
- * means horizontal layout, 1 means vertical layout. @p columns is
- * the number of desktops in the X direction and @p rows is the number
- * in the Y direction. @p starting_corner is the corner containing the
- * first desktop. The values for @p starting_corner are 0 (top-left),
- * 1 (top-right), 2 (bottom-right) and 3 (bottom-left).
- *
- * When the orientation is horizontal the desktops are laid out in
- * rows, with the first desktop in the specified starting corner. So a
- * layout with four columns and three rows starting in
- * the top-left corner looks like this:
- *
- * +--+--+--+--+
- * | 0| 1| 2| 3|
- * +--+--+--+--+
- * | 4| 5| 6| 7|
- * +--+--+--+--+
- * | 8| 9|10|11|
- * +--+--+--+--+
- *
- * With @p starting_corner being bottom-right, it looks like this:
- *
- * +--+--+--+--+
- * |11|10| 9| 8|
- * +--+--+--+--+
- * | 7| 6| 5| 4|
- * +--+--+--+--+
- * | 3| 2| 1| 0|
- * +--+--+--+--+
- *
- * When the orientation is vertical the layout with four columns and
- * three rows starting in the top-left corner looks like:
- *
- * +--+--+--+--+
- * | 0| 3| 6| 9|
- * +--+--+--+--+
- * | 1| 4| 7|10|
- * +--+--+--+--+
- * | 2| 5| 8|11|
- * +--+--+--+--+
- *
- * With @p starting_corner  being top-right, it looks like:
- *
- * +--+--+--+--+
- * | 9| 6| 3| 0|
- * +--+--+--+--+
- * |10| 7| 4| 1|
- * +--+--+--+--+
- * |11| 8| 5| 2|
- * +--+--+--+--+
- *
- * This function MUST be used by a Pager and NOT by the Window
- * Manager. When using this function, the Pager must own a manager
- * selection.
- * @ingroup Ecore_X_NetWM_Group
- */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
+                                  origins, (2 * n_desks));
+}
+
 EAPI void
 ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
                               int            orientation,
@@ -431,2767 +335,1270 @@ ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
                               int            rows,
                               int            starting_corner)
 {
-   uint32_t layout[4];
+   unsigned int layout[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
    layout[0] = orientation;
    layout[1] = columns;
    layout[2] = rows;
    layout[3] = starting_corner;
-   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT, layout, 4);
-}
-
-/**
- * Set the _NET_WORKAREA property.
- * @param root    The root window.
- * @param areas   An array of areas.
- * @param n_desks The number of desks.
- *
- * Set the work area for each desktop by sending the _NET_WORKAREA
- * property to the @p root window. An area contains the geometry (X
- * and Y coordinates, width and height). These geometries are
- * specified relative to the viewport on each desktop and specify an
- * area that is completely contained within the viewport. @p areas
- * stores these geometries. @p n_desks is the number of geometry to
- * set.
- *
- * This function MUST be set by the Window Manager. It is used by
- * desktop applications to place desktop icons appropriately.
- * @ingroup Ecore_X_NetWM_Group
- */
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
+                                  layout, 4);
+}
+
 EAPI void
 ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
                                  unsigned int  *areas,
                                  unsigned int   n_desks)
 {
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_WORKAREA,
-                                  areas, 4 * n_desks);
-}
-
-/**
- * Set the _NET_CURRENT_DESKTOP property.
- * @param root The root window.
- * @param desk The index of the current desktop.
- *
- * Set the current desktop by sending the _NET_CURRENT_DESKTOP to the
- * @p root window. @p deskmust be an integer number between 0 and the
- * number of desks (set by ecore_x_netwm_desk_count_set()) -1.
- *
- * This function MUST be called by the Window Manager. If a Pagerwants
- * to switch to naother desktop, it MUST call that function.
- * @ingroup Ecore_X_NetWM_Group
- */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
+                                  4 * n_desks);
+}
+
+EAPI unsigned int *
+ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks)
+{
+   int ret;
+   unsigned int *areas = NULL;
+   
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   
+   ret = ecore_x_window_prop_card32_list_get(root, ECORE_X_ATOM_NET_WORKAREA,
+                                             &areas);
+   if (!areas)
+     {
+        if (n_desks) *n_desks = 0;
+        return 0;
+     }
+   if (n_desks) *n_desks = ret / 4;
+   return areas;
+}
+
 EAPI void
 ecore_x_netwm_desk_current_set(Ecore_X_Window root,
                                unsigned int   desk)
 {
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_CURRENT_DESKTOP,
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP,
                                   &desk, 1);
 }
 
-/**
- * Set the _NET_SHOWING_DESKTOP property.
- * @param root The root window
- * @param on   0 to hide the desktop, non 0 to show it.
- *
- * Set or unset the desktop in a "showing mode" by sending the
- * _NET_SHOWING_DESKTOP property to the @p root window. If @p on is 0,
- * the windows are hidden and the desktop background is displayed and
- * focused.
- *
- * If a Pager wants to enter or leave the mode, it MUST use this
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
-                                  int            on)
+                                  Eina_Bool      on)
 {
-   uint32_t val;
+   unsigned int val = 0;
 
-   val = (on) ? 1 : 0;
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_SHOWING_DESKTOP,
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   val = ((on) ? 1 : 0);
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP,
                                   &val, 1);
 }
 
-/*
- * Client status
- */
-
-/**
- * Set the _NET_CLIENT_LIST property.
- * @param root The root window.
- * @param p_clients An array of windows.
- * @param n_clients The number of windows.
- *
- * Map all the X windows managed by the window manager from the oldest
- * to the newest by sending the _NET_CLIENT_LIST property to the
- * @p root window. The X windows are stored in @p p_clients and their
- * number in @p n_clients.
- *
- * This function SHOULD be called by the Window Manager.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_client_list_set(Ecore_X_Window  root,
-                              Ecore_X_Window *p_clients,
-                              unsigned int    n_clients)
+EAPI int
+ecore_x_netwm_startup_id_get(Ecore_X_Window win,
+                             char         **id)
 {
-   ecore_x_window_prop_window_set(root,
-                                  ECORE_X_ATOM_NET_CLIENT_LIST,
-                                  p_clients, n_clients);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/**
- * Set the _NET_CLIENT_LIST_STACKING property.
- * @param root The root window.
- * @param p_clients An array of windows.
- * @param n_clients The number of windows.
- *
- * Stack all the X windows managed by the window manager from bottom
- * to top order by sending the _NET_CLIENT_LIST_STACKING property to the
- * @p root window. The X windows are stored in @p p_clients and their
- * number in @p n_clients.
- *
- * This function SHOULD be called by the Window Manager.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_client_list_stacking_set(Ecore_X_Window  root,
-                                       Ecore_X_Window *p_clients,
-                                       unsigned int    n_clients)
-{
-   ecore_x_window_prop_window_set(root,
-                                  ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
-                                  p_clients, n_clients);
-}
+   if (id)
+     {
+        *id =
+          ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_STARTUP_ID);
+     }
 
-/**
- * Set the _NET_ACTIVE_WINDOW property.
- * @param root   The root window.
- * @param window The widow to activate.
- *
- * Activate @p window by sending the _NET_ACTIVE_WINDOW property to
- * the @p root window.
- *
- * If a Client wants to activate another window, it MUST call this
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_client_active_set(Ecore_X_Window root,
-                                Ecore_X_Window window)
-{
-   ecore_x_window_prop_window_set(root,
-                                  ECORE_X_ATOM_NET_ACTIVE_WINDOW,
-                                  &window, 1);
-}
-
-/**
- * Set the _NET_WM_NAME property.
- * @param window The widow to activate.
- * @param name   The title name of the window.
- *
- * Set the title name of @p window to @p name by sending the
- * _NET_WM_NAME property to @p window.
- *
- * The Client SHOULD set the title of @p window in UTF-8 encoding. If
- * set, the Window Manager should use this in preference to WM_NAME.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_name_set(Ecore_X_Window window,
-                       const char    *name)
-{
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_WM_NAME, name);
+   return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_name_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_startup_id_set(Ecore_X_Window win,
+                             const char    *id)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the title of a window.
- * @param window The window.
- * @param name   The title name.
- * @return       Returns always 1.
- *
- * Retrieve the title name of @p window and store it in @p name. The
- * function returns always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_name_get(Ecore_X_Window window,
-                       char         **name)
+ecore_x_netwm_state_request_send(Ecore_X_Window       win,
+                                 Ecore_X_Window       root,
+                                 Ecore_X_Window_State s1,
+                                 Ecore_X_Window_State s2,
+                                 Eina_Bool            set)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window, ECORE_X_ATOM_NET_WM_NAME);
-   return 1;
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_WM_STATE;
+   ev.data.data32[0] = !!set;
+   ev.data.data32[1] = _ecore_xcb_netwm_window_state_atom_get(s1);
+   ev.data.data32[2] = _ecore_xcb_netwm_window_state_atom_get(s2);
+   /* 1 == normal client, if used in a pager this should be 2 */
+   ev.data.data32[3] = 1;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Set the _NET_STARTUP_ID property.
- * @param window The window.
- * @param id     The ID name.
- *
- * Set the ID @p id used for the startup sequence by sending the
- * property _NET_STARTUP_ID to @p window. The ID name should be
- * encoded in UTF-8.
- *
- * If a new value for the property is set, the Window Manager
- * should update the window's status accordingly (update its virtual
- * desktop, etc.).
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_startup_id_set(Ecore_X_Window window,
-                             const char    *id)
+ecore_x_netwm_window_state_set(Ecore_X_Window        win,
+                               Ecore_X_Window_State *state,
+                               unsigned int          num)
 {
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_STARTUP_ID, id);
+   Ecore_X_Atom *set;
+   unsigned int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!num)
+     {
+        ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
+        return;
+     }
+
+   set = malloc(num * sizeof(Ecore_X_Atom));
+   if (!set) return;
+
+   for (i = 0; i < num; i++)
+     set[i] = _ecore_xcb_netwm_window_state_atom_get(state[i]);
+
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_STATE, set, num);
+   free(set);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_startup_id_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_window_state_get(Ecore_X_Window         win,
+                               Ecore_X_Window_State **state,
+                               unsigned int          *num)
 {
-   xcb_get_property_cookie_t cookie;
+   Ecore_X_Atom *atoms;
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (num) *num = 0;
+   if (state) *state = NULL;
+
+   ret =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE, &atoms);
+
+   if (ret <= 0) return EINA_FALSE;
+
+   if (state)
+     {
+        *state = malloc(ret * sizeof(Ecore_X_Window_State));
+        if (*state)
+          {
+             int i = 0;
+
+             for (i = 0; i < ret; i++)
+               (*state)[i] = _ecore_xcb_netwm_window_state_get(atoms[i]);
+             if (num) *num = ret;
+          }
+     }
+
+   free(atoms);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_STARTUP_ID, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_startup_id_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_startup_id_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the startup ID name of a window.
- * @param window The window
- * @param id     The ID name
- * @return       Return always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_startup_id_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_startup_id_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_startup_id_get(Ecore_X_Window window,
-                             char         **id)
+ecore_x_netwm_client_active_set(Ecore_X_Window root,
+                                Ecore_X_Window win)
 {
-   if (id)
-     *id = _ecore_x_window_prop_string_utf8_get(window, ECORE_X_ATOM_NET_STARTUP_ID);
-   return 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(root,
+                                  ECORE_X_ATOM_NET_ACTIVE_WINDOW, &win, 1);
 }
 
-/**
- * Set the _NET_WM_VISIBLE_NAME property.
- * @param window The widow to activate.
- * @param name   The title name of the window.
- *
- * Set the title name of @p window to @p name by sending the
- * _NET_WM_VISIBLE_NAME property to @p window, when the Window Manager
- * displays a window name other than by calling
- * ecore_x_netwm_name_set().
- *
- * The Client SHOULD set the title of @p window in UTF-8
- * encoding. This function is used for displaying title windows like
- * [xterm1], [xterm2], ... thereby allowing Pagers to display the same
- * title as the Window Manager.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_name_set(Ecore_X_Window window,
-                               const char    *name)
+ecore_x_netwm_client_active_request(Ecore_X_Window root,
+                                    Ecore_X_Window win,
+                                    int            type,
+                                    Ecore_X_Window current_win)
 {
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
-                                        name);
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_ACTIVE_WINDOW;
+   ev.data.data32[0] = type;
+   ev.data.data32[1] = XCB_CURRENT_TIME;
+   ev.data.data32[2] = current_win;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_name_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_client_list_set(Ecore_X_Window  root,
+                              Ecore_X_Window *p_clients,
+                              unsigned int    n_clients)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_VISIBLE_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
+                                  p_clients, n_clients);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_visible_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the visible title of a window.
- * @param window The window.
- * @param name   The title name.
- * @return       Returns always 1.
- *
- * Retrieve the visible title name of @p window and store it in @p name. The
- * function returns always 1.
- * @param window The window
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_visible_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_visible_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_visible_name_get(Ecore_X_Window window,
-                               char         **name)
+ecore_x_netwm_client_list_stacking_set(Ecore_X_Window  root,
+                                       Ecore_X_Window *p_clients,
+                                       unsigned int    n_clients)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window,
-                                                  ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
-   return 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
+                                  p_clients, n_clients);
 }
 
-/**
- * Set the _NET_WM_ICON_NAME property.
- * @param window The widow to activate.
- * @param name   The icon name of the window.
- *
- * Set the icon name of @p window to @p name by sending the
- * _NET_WM_ICON_NAME property to @p window.
- *
- * The Client SHOULD set the title of @p window in UTF-8 encoding. If
- * set, the Window Manager should use this in preference to WM_ICON_NAME.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_icon_name_set(Ecore_X_Window window,
-                            const char    *name)
+EAPI Eina_Bool
+ecore_x_screen_is_composited(int screen)
 {
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_WM_ICON_NAME,
-                                        name);
+   char buff[32];
+   xcb_get_selection_owner_cookie_t ocookie;
+   xcb_get_selection_owner_reply_t *oreply;
+   Ecore_X_Window win;
+   static Ecore_X_Atom atom = XCB_NONE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
+
+   if (atom == XCB_NONE)
+     {
+        xcb_intern_atom_cookie_t acookie;
+        xcb_intern_atom_reply_t *areply;
+
+        acookie =
+          xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
+        areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
+        if (!areply) return EINA_FALSE;
+        atom = areply->atom;
+        free(areply);
+     }
+   if (atom == XCB_NONE) return EINA_FALSE;
+
+   ocookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, atom);
+   oreply = xcb_get_selection_owner_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (!oreply) return EINA_FALSE;
+   win = oreply->owner;
+   free(oreply);
+
+   return (win != XCB_NONE) ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_name_get_prefetch(Ecore_X_Window window)
+ecore_x_screen_is_composited_set(int            screen,
+                                 Ecore_X_Window win)
 {
-   xcb_get_property_cookie_t cookie;
+   static Ecore_X_Atom atom = XCB_NONE;
+   char buff[32];
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ICON_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
+   if (atom == XCB_NONE)
+     {
+        xcb_intern_atom_cookie_t acookie;
+        xcb_intern_atom_reply_t *areply;
+
+        acookie =
+          xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
+        areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
+        if (!areply) return;
+        atom = areply->atom;
+        free(areply);
+     }
+   if (atom == XCB_NONE) return;
+   xcb_set_selection_owner(_ecore_xcb_conn, win, atom,
+                           _ecore_xcb_events_last_time_get());
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_icon_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the icon name of a window.
- * @param window The window.
- * @param name   The icon name.
- * @return       Returns always 1.
- *
- * Retrieve the icon name of @p window and store it in @p name. The
- * function returns always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_icon_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_icon_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_icon_name_get(Ecore_X_Window window,
-                            char         **name)
+ecore_x_netwm_ping_send(Ecore_X_Window win)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window,
-                                                 ECORE_X_ATOM_NET_WM_ICON_NAME);
-   return 1;
-}
+   xcb_client_message_event_t ev;
 
-/**
- * Set the _NET_WM_VISIBLE_ICON_NAME property.
- * @param window The widow to activate.
- * @param name   The title name of the window.
- *
- * Set the icon name of @p window to @p name by sending the
- * _NET_WM_VISIBLE_ICON_NAME property to @p window, when the Window Manager
- * displays a icon name other than by calling
- * ecore_x_netwm_icon_name_set().
- *
- * The Client SHOULD set the icon name in UTF-8
- * encoding. The Window Manager MUST use this function is it display
- * an icon name other than with ecore_x_netwm_icon_name_set().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_visible_icon_name_set(Ecore_X_Window window,
-                                    const char    *name)
-{
-   _ecore_x_window_prop_string_utf8_set(window,
-                                        ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
-                                        name);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
+   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_PING;
+   ev.data.data32[1] = ecore_x_current_time_get();
+   ev.data.data32[2] = win;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_icon_name_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_frame_size_set(Ecore_X_Window win,
+                             int            fl,
+                             int            fr,
+                             int            ft,
+                             int            fb)
 {
-   xcb_get_property_cookie_t cookie;
+   uint32_t frames[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   frames[0] = fl;
+   frames[1] = fr;
+   frames[2] = ft;
+   frames[3] = fb;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
+                                  frames, 4);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_visible_icon_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_visible_icon_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the visible icon name of a window.
- * @param window The window.
- * @param name   The icon name.
- * @return       Returns always 1.
- *
- * Retrieve the visible icon name of @p window and store it in
- * @p name. The function returns always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_visible_icon_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_visible_icon_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_visible_icon_name_get(Ecore_X_Window window,
-                                    char         **name)
+EAPI Eina_Bool
+ecore_x_netwm_frame_size_get(Ecore_X_Window win,
+                             int           *fl,
+                             int           *fr,
+                             int           *ft,
+                             int           *fb)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window,
-                                                  ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
-   return 1;
+   int ret = 0;
+   unsigned int frames[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
+                                        frames, 4);
+   if (ret != 4) return EINA_FALSE;
+
+   if (fl) *fl = frames[0];
+   if (fr) *fr = frames[1];
+   if (ft) *ft = frames[2];
+   if (fb) *fb = frames[3];
+
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_WM_DESKTOP property.
- * @param window The window.
- * @param desk   The desktop index.
- *
- * Set on which desktop the @p window is in by sending the
- * _NET_WM_DESKTOP property to @p window. @p desk is the index of
- * the desktop, starting from 0. To indicate that the window should
- * appear on all desktops, @p desk must be equal to 0xFFFFFFFF.
- *
- * A Client MAY choose not to set this property, in which case the
- * Window Manager SHOULD place it as it wishes.
- *
- * The Window Manager should honor _NET_WM_DESKTOP whenever a
- * withdrawn window requests to be mapped.
- *
- * A Client can request a change of desktop for a non-withdrawn window
- * by sending a _NET_WM_DESKTOP client message to the root window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_desktop_set(Ecore_X_Window window,
-                          unsigned int   desk)
+ecore_x_netwm_sync_request_send(Ecore_X_Window win,
+                                unsigned int   serial)
 {
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+
+   /* FIXME: Maybe need XSyncIntToValue ?? */
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
+   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
+   ev.data.data32[1] = _ecore_xcb_events_last_time_get();
+   ev.data.data32[2] = serial;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_desktop_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_desktop_set(Ecore_X_Window win,
+                          unsigned int   desk)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_DESKTOP, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_desktop_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_desktop_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the visible icon name of a window.
- * @param window The window.
- * @param desk   The desktop index.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the desktop index in which @p window is displayed and
- * store it in @p desk. If @p desk value is 0xFFFFFFFF, the window
- * appears on all desktops. The function returns 1 on success, 0
- * otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_desktop_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_desktop_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_desktop_get(Ecore_X_Window window,
-                          unsigned int *desk)
+EAPI Eina_Bool
+ecore_x_netwm_desktop_get(Ecore_X_Window win,
+                          unsigned int  *desk)
 {
-   int      ret;
-   uint32_t tmp;
+   unsigned int tmp = 0;
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_DESKTOP,
-                                       &tmp, 1);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
+                                       &tmp, 1))
+     return EINA_FALSE;
 
    if (desk) *desk = tmp;
-   return (ret == 1) ? 1 : 0;
-}
-
-/**
- * Set the _NET_WM_STRUT property.
- * @param window The window
- * @param left   The number of pixels at the left of the screen.
- * @param right  The number of pixels at the right of the screen.
- * @param top    The number of pixels at the top of the screen.
- * @param bottom The number of pixels at the bottom of the screen.
- *
- * Set space at the edje of the screen by sending the _NET_WM_STRUT
- * property to @p window if @p window is to reserve that space.
- * @p left, @p right, @p top and @p bottom are respectively the number
- * of pixels at the left, right, top and bottom of the screen.
- *
- * This property is deprecated and ecore_x_netwm_strut_partial_set()
- * should be used instead. However, Clients MAY set this property in
- * addition to _NET_WM_STRUT_PARTIAL to ensure backward compatibility
- * with Window Managers supporting older versions of the
- * Specification.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_strut_set(Ecore_X_Window window,
-                        int            left,
-                        int            right,
-                        int            top,
-                        int            bottom)
-{
-   uint32_t strut[4];
 
-   strut[0] = left;
-   strut[1] = right;
-   strut[2] = top;
-   strut[3] = bottom;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
+   return EINA_TRUE;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_strut_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
+                                   Ecore_X_Window root,
+                                   unsigned int   desktop)
 {
-   xcb_get_property_cookie_t cookie;
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_STRUT, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_WM_DESKTOP;
+   ev.data.data32[0] = desktop;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_strut_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_strut_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/*
- * _NET_WM_STRUT is deprecated
- */
-
-/**
- * Get the space at the edje of the screen.
- * @param window The window
- * @param left   The number of pixels at the left of the screen.
- * @param right  The number of pixels at the right of the screen.
- * @param top    The number of pixels at the top of the screen.
- * @param bottom The number of pixels at the bottom of the screen.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the space at the edje of the screen if @p window is to
- * reserve such space. The number of pixels at the left, right, top
- * and bottom of the screen are respectively stored in @p left,
- * @p right, @p top and @p bottom. This function returns 1 on success,
- * 0 otherwise.
- *
- * This property is deprecated. See ecore_x_netwm_strut_set() for more
- * informations.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_strut_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_strut_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_strut_get(Ecore_X_Window window,
-                        int           *left,
-                        int           *right,
-                        int           *top,
-                        int           *bottom)
-{
-   uint32_t strut[4];
-   int      ret = 0;
-
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
-   if (ret != 4)
-     return 0;
-
-   if (left)   *left   = strut[0];
-   if (right)  *right  = strut[1];
-   if (top)    *top    = strut[2];
-   if (bottom) *bottom = strut[3];
+ecore_x_netwm_moveresize_request_send(Ecore_X_Window win,
+                                      int x,
+                                      int y,
+                                      Ecore_X_Netwm_Direction direction,
+                                      unsigned int button)
+{
+   xcb_client_message_event_t ev;
 
-   return 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_WM_MOVERESIZE;
+   ev.data.data32[0] = x;
+   ev.data.data32[1] = y;
+   ev.data.data32[2] = direction;
+   ev.data.data32[3] = button;
+   ev.data.data32[4] = 1;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
 }
 
-/**
- * Set the _NET_WM_STRUT_PARTIAL property.
- * @param window         The window
- * @param left           The number of pixels at the left of the screen.
- * @param right          The number of pixels at the right of the screen.
- * @param top            The number of pixels at the top of the screen.
- * @param bottom         The number of pixels at the bottom of the screen.
- * @param left_start_y   The number of pixels.
- * @param left_end_y     The number of pixels.
- * @param right_start_y  The number of pixels.
- * @param right_end_y    The number of pixels.
- * @param top_start_x    The number of pixels.
- * @param top_end_x      The number of pixels.
- * @param bottom_start_x The number of pixels.
- * @param bottom_end_x   The number of pixels.
- *
- * Set space at the edje of the screen by sending the
- * _NET_WM_STRUT_PARTIAL property to @p window if @p window is to
- * reserve that space. @p left, @p right, @p top and @p bottom are
- * respectively the number of pixels at the left, right, top and
- * bottom of the screen.
- *
- * TODO: more description for that function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_strut_partial_set(Ecore_X_Window window,
-                                int            left,
-                                int            right,
-                                int            top,
-                                int            bottom,
-                                int            left_start_y,
-                                int            left_end_y,
-                                int            right_start_y,
-                                int            right_end_y,
-                                int            top_start_x,
-                                int            top_end_x,
-                                int            bottom_start_x,
-                                int            bottom_end_x)
+ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
 {
-   unsigned int strut[12];
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   strut[0] = left;
-   strut[1] = right;
-   strut[2] = top;
-   strut[3] = bottom;
-   strut[4] = left_start_y;
-   strut[5] = left_end_y;
-   strut[6] = right_start_y;
-   strut[7] = right_end_y;
-   strut[8] = top_start_x;
-   strut[9] = top_end_x;
-   strut[10] = bottom_start_x;
-   strut[11] = bottom_end_x;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
+                                  NULL, 0);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_strut_partial_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
+                                       NULL, 0))
+     return EINA_FALSE;
+
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_strut_partial_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_strut_partial_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the space at the edje of the screen of a window.
- * @param window         The window
- * @param left           The number of pixels at the left of the screen.
- * @param right          The number of pixels at the right of the screen.
- * @param top            The number of pixels at the top of the screen.
- * @param bottom         The number of pixels at the bottom of the screen.
- * @param left_start_y   The number of pixels.
- * @param left_end_y     The number of pixels.
- * @param right_start_y  The number of pixels.
- * @param right_end_y    The number of pixels.
- * @param top_start_x    The number of pixels.
- * @param top_end_x      The number of pixels.
- * @param bottom_start_x The number of pixels.
- * @param bottom_end_x   The number of pixels.
- *
- * Retrieve the space at the edje of the screen if @p window is to
- * reserve such space. The number of pixels at the left, right, top
- * and bottom of the screen are respectively stored in @p left,
- * @p right, @p top and @p bottom. This function returns 1 on success,
- * 0 otherwise.
- *
- * TODO: more description for that function.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_strut_partial_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_strut_partial_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI int
-ecore_x_netwm_strut_partial_get(Ecore_X_Window window,
-                                int           *left,
-                                int           *right,
-                                int           *top,
-                                int           *bottom,
-                                int           *left_start_y,
-                                int           *left_end_y,
-                                int           *right_start_y,
-                                int           *right_end_y,
-                                int           *top_start_x,
-                                int           *top_end_x,
-                                int           *bottom_start_x,
-                                int           *bottom_end_x)
+ecore_x_netwm_icon_name_get(Ecore_X_Window win,
+                            char         **name)
 {
-   uint32_t strut[12];
-   int      ret = 0;
-
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
-   if (ret != 12)
-     return 0;
-
-   if (left)           *left           = strut[0];
-   if (right)          *right          = strut[1];
-   if (top)            *top            = strut[2];
-   if (bottom)         *bottom         = strut[3];
-   if (left_start_y)   *left_start_y   = strut[4];
-   if (left_end_y)     *left_end_y     = strut[5];
-   if (right_start_y)  *right_start_y  = strut[6];
-   if (right_end_y)    *right_end_y    = strut[7];
-   if (top_start_x)    *top_start_x    = strut[8];
-   if (top_end_x)      *top_end_x      = strut[9];
-   if (bottom_start_x) *bottom_start_x = strut[10];
-   if (bottom_end_x)   *bottom_end_x   = strut[11];
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     {
+        *name =
+          ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_ICON_NAME);
+     }
+
    return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icons_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_icon_name_set(Ecore_X_Window win,
+                            const char    *name)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ICON, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME, name);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_icons_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icons_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Retrieve hte possible icons of a window.
- * @param window The window
- * @param icon   An array of icons.
- * @param num    The number of icons.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve an array of possible icons of @p window. The icons are
- * stored in @p icon and their number in @p num.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_icons_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_icons_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_icons_get(Ecore_X_Window window,
+ecore_x_netwm_icons_set(Ecore_X_Window win,
+                        Ecore_X_Icon *icon,
+                        int num)
+{
+   unsigned int *data, *p, *p2;
+   unsigned int i, size, x, y;
+   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   size = 0;
+   for (i = 0; i < (unsigned int)num; i++)
+     {
+        size += 2 + (icon[i].width * icon[i].height);
+     }
+   data = malloc(size * sizeof(unsigned int));
+   if (!data) return;
+   p = data;
+   for (i = 0; i < (unsigned int)num; i++)
+     {
+        p[0] = icon[i].width;
+        p[1] = icon[i].height;
+        p += 2;
+        p2 = icon[i].data;
+        for (y = 0; y < icon[i].height; y++)
+          {
+             for (x = 0; x < icon[i].width; x++)
+               {
+                  unsigned int r, g, b, a;
+                  
+                  a = (*p2 >> 24) & 0xff;
+                  r = (*p2 >> 16) & 0xff;
+                  g = (*p2 >> 8 ) & 0xff;
+                  b = (*p2      ) & 0xff;
+                  if ((a > 0) && (a < 255))
+                    {
+                       r = (r * 255) / a;
+                       g = (g * 255) / a;
+                       b = (b * 255) / a;
+                    }
+                  *p = (a << 24) | (r << 16) | (g << 8) | b;
+                  p++;
+                  p2++;
+               }
+          }
+     }
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON,
+                                  data, size);
+   free(data);
+}
+
+EAPI Eina_Bool
+ecore_x_netwm_icons_get(Ecore_X_Window win,
                         Ecore_X_Icon **icon,
                         int           *num)
 {
-   uint32_t *data;
-   uint32_t *p;
-   uint32_t *src;
-   uint32_t  icons;
-   uint32_t  len;
-   uint32_t  i;
-   int       num_ret;
+   int num_ret = 0;
+   unsigned int i = 0, len = 0, icons = 0;
+   unsigned int *data, *p, *src;
 
-   if (num) *num = 0UL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (num) *num = 0;
    if (icon) *icon = NULL;
 
-   num_ret = ecore_x_window_prop_card32_list_get(window,
-                                                 ECORE_X_ATOM_NET_WM_ICON,
-                                                 &data);
-   if ((num_ret <= 0) || !data)
-     return 0;
+   num_ret =
+     ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON, &data);
 
+   if ((num_ret <= 0) || (!data))
+     {
+        if (data) free(data);
+        return EINA_FALSE;
+     }
    if (num_ret < 2)
      {
-       free(data);
-       return 0;
+        if (data) free(data);
+        return EINA_FALSE;
      }
 
-   /* Check how many icons there are */
    icons = 0;
    p = data;
    while (p)
      {
-       len = p[0] * p[1];
-       p += (len + 2);
-       if ((p - data) > num_ret)
-         {
-            free(data);
-            return 0;
-         }
-       icons++;
-
-       if ((p - data) == num_ret)
-         p = NULL;
+        len = (p[0] * p[1]);
+        p += (len + 2);
+        if ((p - data) > num_ret)
+          {
+             if (data) free(data);
+             return EINA_FALSE;
+          }
+        icons++;
+        if ((p - data) == num_ret) p = NULL;
      }
    if (num) *num = icons;
-
-   /* If the user doesn't want the icons, return */
    if (!icon)
      {
-       free(data);
-       return 1;
+        if (data) free(data);
+        return EINA_TRUE;
      }
 
-   /* Allocate memory */
    *icon = malloc(icons * sizeof(Ecore_X_Icon));
    if (!(*icon))
      {
-       free(data);
-       return 0;
+        if (data) free(data);
+        return EINA_FALSE;
      }
 
    /* Fetch the icons */
    p = data;
    for (i = 0; i < icons; i++)
      {
-       uint32_t *ps, *pd, *pe;
-
-       len = p[0] * p[1];
-       ((*icon)[i]).width = p[0];
-       ((*icon)[i]).height = p[1];
-       src = &(p[2]);
-       ((*icon)[i]).data = malloc(len * sizeof(uint32_t));
-       if (!((*icon)[i]).data)
-         {
-            while (i)
-              free(((*icon)[--i]).data);
-            free(*icon);
-            free(data);
-            return 0;
-         }
-
-       pd = ((*icon)[i]).data;
-       ps = src;
-       pe = ps + len;
-       for (; ps < pe; ps++)
-         {
-            uint32_t r, g, b, a;
-
-            a = (*ps >> 24) & 0xff;
-            r = (((*ps >> 16) & 0xff) * a) / 255;
-            g = (((*ps >>  8) & 0xff) * a) / 255;
-            b = (((*ps      ) & 0xff) * a) / 255;
-            *pd = (a << 24) | (r << 16) | (g << 8) | (b);
-            pd++;
-         }
-       p += (len + 2);
+        unsigned int *ps, *pd, *pe;
+
+        len = p[0] * p[1];
+        ((*icon)[i]).width = p[0];
+        ((*icon)[i]).height = p[1];
+        src = &(p[2]);
+        ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
+        if (!((*icon)[i]).data)
+          {
+             while (i)
+               free(((*icon)[--i]).data);
+             free(*icon);
+             free(data);
+             return EINA_FALSE;
+          }
+
+        pd = ((*icon)[i]).data;
+        ps = src;
+        pe = ps + len;
+        for (; ps < pe; ps++)
+          {
+             unsigned int r, g, b, a;
+
+             a = (*ps >> 24) & 0xff;
+             r = (((*ps >> 16) & 0xff) * a) / 255;
+             g = (((*ps >> 8) & 0xff) * a) / 255;
+             b = (((*ps) & 0xff) * a) / 255;
+             *pd = (a << 24) | (r << 16) | (g << 8) | (b);
+             pd++;
+          }
+        p += (len + 2);
      }
 
-   free(data);
-
-   return 1;
+   if (data) free(data);
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_WM_ICON_GEOMETRY property.
- * @param window The window.
- * @param x      The X coordinate of the icon.
- * @param y      The Y coordinate of the icon.
- * @param width  The width of the icon.
- * @param height The height of the icon.
- *
- * Set the geometry of the icon of @p window by sending the
- * _NET_WM_ICON_GEOMETRY property to @p window. @p x, @p y, @p width
- * and @p height specify respectively the X coordinate, the Y
- * coordinate, the width and the height of the icon.
- *
- * Stand alone tools like a taskbar or an iconbox MAY use this
- * function. This functions makes possible for a Window Manager to
- * display a nice animation like morphing the window into its icon.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_geometry_set(Ecore_X_Window window,
+ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
                                 int            x,
                                 int            y,
-                                int            width,
-                                int            height)
+                                int            w,
+                                int            h)
 {
-   uint32_t geometry[4];
+   unsigned int geom[4];
 
-   geometry[0] = (uint32_t)x;
-   geometry[1] = (uint32_t)y;
-   geometry[2] = (uint32_t)width;
-   geometry[3] = (uint32_t)height;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
+                                  geom, 4);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_icon_geometry_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
+                                int           *x,
+                                int           *y,
+                                int           *w,
+                                int           *h)
 {
-   xcb_get_property_cookie_t cookie;
+   int ret = 0;
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ret =
+     ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
+                                    geom, 4);
+   if (ret != 4) return EINA_FALSE;
+   if (x) *x = geom[0];
+   if (y) *y = geom[1];
+   if (w) *w = geom[2];
+   if (h) *h = geom[3];
+
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_icon_geometry_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_geometry_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the geometry of an icon.
- * @param window The window
- * @param x      x
- * @param x      The X coordinate of the icon.
- * @param y      The Y coordinate of the icon.
- * @param width  The width of the icon.
- * @param height The height of the icon.
- * @return       1 on success, 0 othrwise.
- *
- * Retrieve the geometry of the icon of @p window. The geometry is
- * stored in @p x, @p y, @p width and @p height. The function returns
- * 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_icon_geometry_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_icon_geometry_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_icon_geometry_get(Ecore_X_Window window,
-                                int           *x,
-                                int           *y,
-                                int           *width,
-                                int           *height)
+ecore_x_netwm_strut_set(Ecore_X_Window win,
+                        int            l,
+                        int            r,
+                        int            t,
+                        int            b)
 {
-   uint32_t geometry[4];
-   int      ret;
+   unsigned int strut[4];
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
-   if (ret != 4)
-     return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (x)      *x      = geometry[0];
-   if (y)      *y      = geometry[1];
-   if (width)  *width  = geometry[2];
-   if (height) *height = geometry[3];
+   strut[0] = l;
+   strut[1] = r;
+   strut[2] = t;
+   strut[3] = b;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
+}
 
-   return 1;
+EAPI Eina_Bool
+ecore_x_netwm_strut_get(Ecore_X_Window win,
+                        int           *l,
+                        int           *r,
+                        int           *t,
+                        int           *b)
+{
+   unsigned int strut[4];
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret =
+     ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
+   if (ret != 4) return EINA_FALSE;
+
+   if (l) *l = strut[0];
+   if (r) *r = strut[1];
+   if (t) *t = strut[2];
+   if (b) *b = strut[3];
+
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_WM_PID property.
- * @param window The window.
- * @param pid    The process ID.
- *
- * Set the process ID of the client owning @p window by sending the
- * _NET_WM_PID property to @p window.
- *
- * This function MAY be used by the Window Manager to kill windows
- * which do not respond to the _NET_WM_PING protocol.
- *
- * If _NET_WM_PID is set, the ICCCM-specified property
- * WM_CLIENT_MACHINE MUST also be set.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_pid_set(Ecore_X_Window window,
-                      int            pid)
+ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
+                                int            left,
+                                int            right,
+                                int            top,
+                                int            bottom,
+                                int            left_start_y,
+                                int            left_end_y,
+                                int            right_start_y,
+                                int            right_end_y,
+                                int            top_start_x,
+                                int            top_end_x,
+                                int            bottom_start_x,
+                                int            bottom_end_x)
 {
-   unsigned int tmp;
+   unsigned int strut[12];
 
-   tmp = pid;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_PID,
-                                 &tmp, 1);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   strut[0] = left;
+   strut[1] = right;
+   strut[2] = top;
+   strut[3] = bottom;
+   strut[4] = left_start_y;
+   strut[5] = left_end_y;
+   strut[6] = right_start_y;
+   strut[7] = right_end_y;
+   strut[8] = top_start_x;
+   strut[9] = top_end_x;
+   strut[10] = bottom_start_x;
+   strut[11] = bottom_end_x;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
+                                  strut, 12);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_pid_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
+                                int           *left,
+                                int           *right,
+                                int           *top,
+                                int           *bottom,
+                                int           *left_start_y,
+                                int           *left_end_y,
+                                int           *right_start_y,
+                                int           *right_end_y,
+                                int           *top_start_x,
+                                int           *top_end_x,
+                                int           *bottom_start_x,
+                                int           *bottom_end_x)
 {
-   xcb_get_property_cookie_t cookie;
+   unsigned int strut[12];
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret =
+     ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
+                                    strut, 12);
+   if (ret != 12) return EINA_FALSE;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_PID, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (left) *left = strut[0];
+   if (right) *right = strut[1];
+   if (top) *top = strut[2];
+   if (bottom) *bottom = strut[3];
+   if (left_start_y) *left_start_y = strut[4];
+   if (left_end_y) *left_end_y = strut[5];
+   if (right_start_y) *right_start_y = strut[6];
+   if (right_end_y) *right_end_y = strut[7];
+   if (top_start_x) *top_start_x = strut[8];
+   if (top_end_x) *top_end_x = strut[9];
+   if (bottom_start_x) *bottom_start_x = strut[10];
+   if (bottom_end_x) *bottom_end_x = strut[11];
+
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_pid_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_pid_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the process ID of a client window.
- * @param window The window.
- * @param pid    The process ID.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the process ID of @p window and store it in @p pid. This
- * function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_pid_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_pid_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_pid_get(Ecore_X_Window window,
-                      int           *pid)
+ecore_x_netwm_user_time_set(Ecore_X_Window win,
+                            unsigned int   t)
 {
-   int ret;
-   uint32_t tmp;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_PID,
-                                       &tmp, 1);
-   if (pid) *pid = tmp;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME, &t, 1);
+}
 
-   return (ret == 1) ? 1 : 0;
-}
-
-/**
- * Set the _NET_WM_HANDLED_ICONS property.
- * @param window The window.
- *
- * Indicate to the Window Manager that it does not need to provide
- * icons for the iconified @p window by sending the
- * _NET_WM_HANDLED_ICONS property to @p window.
- *
- * This function can be used by a Pager on one of its own toplevel
- * windows (for example if the Client is a taskbar and provides
- * buttons for iconified windows).
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_handled_icons_set(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_user_time_get(Ecore_X_Window win,
+                            unsigned int  *t)
 {
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
-                                 NULL, 0);
+   unsigned int tmp;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
+                                       &tmp, 1))
+     return EINA_FALSE;
+
+   if (t) *t = tmp;
+
+   return EINA_TRUE;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_handled_icons_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_visible_name_set(Ecore_X_Window win,
+                               const char    *name)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_HANDLED_ICONS, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
+                                  name);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_handled_icons_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_handled_icons_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Return wheter the Client handles icons or not.
- * @param window The window.
- * @return       1 if icons are handled, 0 otherwise.
- *
- * Return whether the client handles icons or not if @p window is
- * iconified.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_handled_icons_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_handled_icons_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI int
-ecore_x_netwm_handled_icons_get(Ecore_X_Window window)
-{
-   int ret = 0;
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
-                                       NULL, 0);
-   return (ret == 0) ? 1 : 0;
-}
-
-/**
- * Set the _NET_WM_USER_TIME property.
- * @param window The window.
- * @param time   The last user activity time in the window.
- *
- * Set the XServer time at which last user activity in @p window took
- * place by sending the _NET_WM_USER_TIME property to @p window. @p
- * time contains that XServer time in seconds.
- *
- * This function allows a Window Manager to alter the focus, stacking,
- * and/or placement behavior of windows when they are mapped depending
- * on whether the new window was created by a user action or is a
- * "pop-up" window activated by a timer or some other event.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_user_time_set(Ecore_X_Window window,
-                            unsigned int   time)
+ecore_x_netwm_visible_name_get(Ecore_X_Window win,
+                               char         **name)
 {
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_USER_TIME,
-                                 &time, 1);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     *name = ecore_x_window_prop_string_get(win,
+                                            ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
+   return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_user_time_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
+                                    const char    *name)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_USER_TIME, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
+                                  name);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_user_time_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_user_time_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the last user activity time in the window.
- * @param window The window.
- * @param time   The returned time.
- * @return       1 on success, 0 otherwise.
- *
- * Return the XServer time at which last user activity in @p window
- * took place. The time is stored in @p time.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_user_time_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_user_time_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI int
-ecore_x_netwm_user_time_get(Ecore_X_Window window,
-                            unsigned int  *time)
+ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
+                                    char         **name)
 {
-   int ret;
-   uint32_t tmp;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     {
+        *name =
+          ecore_x_window_prop_string_get(win,
+                                         ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
+     }
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_USER_TIME,
-                                       &tmp, 1);
-   if (time) *time = tmp;
-   return (ret == 1) ? 1 : 0;
+   return 1;
 }
 
-Ecore_X_Window_State
-_ecore_x_netwm_state_get(Ecore_X_Atom a)
+EAPI Eina_Bool
+ecore_x_netwm_sync_counter_get(Ecore_X_Window        win,
+                               Ecore_X_Sync_Counter *counter)
 {
-   if (a == ECORE_X_ATOM_NET_WM_STATE_MODAL)
-     return ECORE_X_WINDOW_STATE_MODAL;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_STICKY)
-     return ECORE_X_WINDOW_STATE_STICKY;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
-     return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
-     return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_SHADED)
-     return ECORE_X_WINDOW_STATE_SHADED;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
-     return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
-     return ECORE_X_WINDOW_STATE_SKIP_PAGER;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
-     return ECORE_X_WINDOW_STATE_HIDDEN;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
-     return ECORE_X_WINDOW_STATE_FULLSCREEN;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
-     return ECORE_X_WINDOW_STATE_ABOVE;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_BELOW)
-     return ECORE_X_WINDOW_STATE_BELOW;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
-     return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
-   else
-     return ECORE_X_WINDOW_STATE_UNKNOWN;
-}
-
-static Ecore_X_Atom
-_ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
-{
-   switch(s)
-     {
-      case ECORE_X_WINDOW_STATE_MODAL:
-        return ECORE_X_ATOM_NET_WM_STATE_MODAL;
-      case ECORE_X_WINDOW_STATE_STICKY:
-        return ECORE_X_ATOM_NET_WM_STATE_STICKY;
-      case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
-        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
-      case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
-        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
-      case ECORE_X_WINDOW_STATE_SHADED:
-        return ECORE_X_ATOM_NET_WM_STATE_SHADED;
-      case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
-        return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
-      case ECORE_X_WINDOW_STATE_SKIP_PAGER:
-        return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
-      case ECORE_X_WINDOW_STATE_HIDDEN:
-        return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
-      case ECORE_X_WINDOW_STATE_FULLSCREEN:
-        return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
-      case ECORE_X_WINDOW_STATE_ABOVE:
-        return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
-      case ECORE_X_WINDOW_STATE_BELOW:
-        return ECORE_X_ATOM_NET_WM_STATE_BELOW;
-      case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
-        return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
-      default:
-        return 0;
-     }
-}
-
-/**
- * Set the _NET_WM_STATE property.
- * @param window The window.
- * @param state  An array of window hints.
- * @param num    The number of hints.
- *
- * Set a list of hints describing @p window state by sending the
- * _NET_WM_STATE property to @p window. The hints are stored in the
- * array @p state. @p num must contain the number of hints.
- *
- * The Window Manager SHOULD honor _NET_WM_STATE whenever a withdrawn
- * window requests to be mapped. A Client wishing to change the state
- * of a window MUST send a _NET_WM_STATE client message to the root
- * window. The Window Manager MUST keep this property updated to
- * reflect the current state of the window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_state_set(Ecore_X_Window        window,
-                               Ecore_X_Window_State *state,
-                               unsigned int          num)
-{
-   Ecore_X_Atom  *set;
-   uint32_t       i;
-
-   if (!num)
-     {
-       ecore_x_window_prop_property_del(window, ECORE_X_ATOM_NET_WM_STATE);
-       return;
-     }
-
-   set = malloc(num * sizeof(Ecore_X_Atom));
-   if (!set) return;
-
-   for (i = 0; i < num; i++)
-     set[i] = _ecore_x_netwm_state_atom_get(state[i]);
-
-   ecore_x_window_prop_atom_set(window, ECORE_X_ATOM_NET_WM_STATE, set, num);
-
-   free(set);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_state_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_STATE, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);;
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_state_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_state_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the hints describing the window state.
- * @param window The window.
- * @param state  The returned hins.
- * @param num    The number of hints.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the hints describing @p window state. The state is
- * returned in @p state. The nummber of hints is stored in @p
- * num. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_window_state_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_window_state_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_window_state_get(Ecore_X_Window         window,
-                               Ecore_X_Window_State **state,
-                               unsigned int          *num)
-{
-   Ecore_X_Atom *atoms;
-   int           num_ret;
-   int           i;
-
-   if (num) *num = 0;
-   if (state) *state = NULL;
-
-   num_ret = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_STATE,
-                                              &atoms);
-   if (num_ret <= 0)
-      return 0;
-
-   if (state)
-     {
-       *state = malloc(num_ret * sizeof(Ecore_X_Window_State));
-       if (*state)
-         for (i = 0; i < num_ret; ++i)
-           (*state)[i] = _ecore_x_netwm_state_get(atoms[i]);
-
-       if (num) *num = num_ret;
-     }
-
-   free(atoms);
-
-   return 1;
-}
-
-static Ecore_X_Window_Type
-_ecore_x_netwm_window_type_type_get(Ecore_X_Atom atom)
-{
-   if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
-     return ECORE_X_WINDOW_TYPE_DESKTOP;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
-     return ECORE_X_WINDOW_TYPE_DOCK;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
-     return ECORE_X_WINDOW_TYPE_TOOLBAR;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
-     return ECORE_X_WINDOW_TYPE_MENU;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
-     return ECORE_X_WINDOW_TYPE_UTILITY;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
-     return ECORE_X_WINDOW_TYPE_SPLASH;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
-     return ECORE_X_WINDOW_TYPE_DIALOG;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
-     return ECORE_X_WINDOW_TYPE_NORMAL;
-   else
-     return ECORE_X_WINDOW_TYPE_UNKNOWN;
-}
-
-static Ecore_X_Atom
-_ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
-{
-   switch (type)
-     {
-      case ECORE_X_WINDOW_TYPE_DESKTOP:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
-      case ECORE_X_WINDOW_TYPE_DOCK:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
-      case ECORE_X_WINDOW_TYPE_TOOLBAR:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
-      case ECORE_X_WINDOW_TYPE_MENU:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
-      case ECORE_X_WINDOW_TYPE_UTILITY:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
-      case ECORE_X_WINDOW_TYPE_SPLASH:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
-      case ECORE_X_WINDOW_TYPE_DIALOG:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
-      case ECORE_X_WINDOW_TYPE_NORMAL:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
-      default:
-        return 0;
-     }
-}
+   unsigned int tmp;
 
-/*
- * FIXME: We should set WM_TRANSIENT_FOR if type is ECORE_X_WINDOW_TYPE_TOOLBAR
- * , ECORE_X_WINDOW_TYPE_MENU or ECORE_X_WINDOW_TYPE_DIALOG
- */
-
-/**
- * Set the _NET_WM_WINDOW_TYPE property.
- * @param window The window.
- * @param type   The functional type of the window.
- *
- * Set the functional @p type of @p window by sending _NET_WM_WINDOW_TYPE
- * property to @p window.
- *
- * This property SHOULD be set by the Client before mapping. This
- * property SHOULD be used by the window manager in determining the
- * decoration, stacking position and other behavior of the window. The
- * Client SHOULD specify window types in order of preference (the first
- * being most preferable).
- *
- * This hint is intended to replace the MOTIF hints.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_type_set(Ecore_X_Window      window,
-                              Ecore_X_Window_Type type)
-{
-   Ecore_X_Atom atom;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   atom = _ecore_x_netwm_window_type_atom_get(type);
-   ecore_x_window_prop_atom_set(window, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                               &atom, 1);
-}
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
+                                       &tmp, 1))
+     return EINA_FALSE;
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_type_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+   if (counter) *counter = tmp;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_WINDOW_TYPE, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_type_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_type_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/* FIXME: Maybe return 0 on some conditions? */
-
-/**
- * Get the functional type of a window.
- * @param window The window.
- * @param type   The function type of the window.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the functional type of @p window. The type is stored in
- * @p type. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_window_type_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_window_type_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_window_type_get(Ecore_X_Window       window,
-                              Ecore_X_Window_Type *type)
+EAPI Eina_Bool
+ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
+                                   Ecore_X_Action action)
 {
-   Ecore_X_Atom *atoms;
-   int           num;
-   int           i;
+   int num = 0, i = 0;
+   Ecore_X_Atom *atoms, atom;
+   Eina_Bool ret = EINA_FALSE;
 
-   if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   num = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                                          &atoms);
-   if (num < 0)
-     {
-       /* IMO this is not the place to mix netwm and icccm /kwo */
-       /* Check if WM_TRANSIENT_FOR is set */
-
-        /* Disable it for xcb */
-
-/*     if ((type) && (ecore_x_icccm_transient_for_get(window))) */
-/*       *type = ECORE_X_WINDOW_TYPE_DIALOG; */
-/*     return 1; */
-     }
+   num =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
+                                       &atoms);
+   if (num <= 0) return EINA_FALSE;
 
-   if (type)
-     {
-       for (i = 0; i < num; ++i)
-         {
-            *type = _ecore_x_netwm_window_type_type_get(atoms[i]);
-            if (*type != ECORE_X_WINDOW_TYPE_UNKNOWN)
-              break;
-         }
-     }
-
-   free(atoms);
-
-   return 1;
-}
-
-static Ecore_X_Atom
-_ecore_x_netwm_action_atom_get(Ecore_X_Action action)
-{
-   switch (action)
+   atom = _ecore_xcb_netwm_action_atom_get(action);
+   for (i = 0; i < num; i++)
      {
-      case ECORE_X_ACTION_MOVE:
-        return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
-      case ECORE_X_ACTION_RESIZE:
-        return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
-      case ECORE_X_ACTION_MINIMIZE:
-        return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
-      case ECORE_X_ACTION_SHADE:
-        return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
-      case ECORE_X_ACTION_STICK:
-        return ECORE_X_ATOM_NET_WM_ACTION_STICK;
-      case ECORE_X_ACTION_MAXIMIZE_HORZ:
-        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
-      case ECORE_X_ACTION_MAXIMIZE_VERT:
-        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
-      case ECORE_X_ACTION_FULLSCREEN:
-        return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
-      case ECORE_X_ACTION_CHANGE_DESKTOP:
-        return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
-      case ECORE_X_ACTION_CLOSE:
-        return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
-      default:
-        return 0;
+        if (atoms[i] == atom)
+          {
+             ret = EINA_TRUE;
+             break;
+          }
      }
-}
-
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_allowed_action_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (atoms) free(atoms);
+   return ret;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_allowed_action_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_allowed_action_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/* FIXME: Get complete list */
-
-/**
- * Check whether an action is supported by a window.
- * @param window The window
- * @param action The action
- * @return       1 if set, 0 otherwise.
- *
- * Return whether the user operation @p action is supported by the
- * Window Manager for @p window.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_allowed_action_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_allowed_action_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_allowed_action_isset(Ecore_X_Window window,
-                                   Ecore_X_Action action)
+EAPI Eina_Bool
+ecore_x_netwm_allowed_action_get(Ecore_X_Window   win,
+                                 Ecore_X_Action **action,
+                                 unsigned int    *num)
 {
    Ecore_X_Atom *atoms;
-   Ecore_X_Atom  atom;
-   int           num;
-   int           ret = 0;
-   int           i;
+   int num_ret = 0;
 
-   num = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
-                                          &atoms);
-   if (num <= 0)
-     return ret;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   atom = _ecore_x_netwm_action_atom_get(action);
+   if (num) *num = 0;
+   if (action) *action = NULL;
 
-   for (i = 0; i < num; ++i)
+   num_ret =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
+                                       &atoms);
+   if (num_ret <= 0) return EINA_FALSE;
+   if (action)
      {
-       if (atom == atoms[i])
-         {
-            ret = 1;
-            break;
-         }
+        *action = malloc(num_ret * sizeof(Ecore_X_Action));
+        if (*action)
+          {
+             int i = 0;
+
+             for (i = 0; i < num_ret; i++)
+               (*action)[i] = _ecore_xcb_netwm_action_atom_get(atoms[i]);
+          }
+        if (num) *num = num_ret;
      }
-
    free(atoms);
-
-   return ret;
+   return EINA_TRUE;
 }
 
-/* FIXME: Set complete list */
-/**
- * Set the _NET_WM_ALLOWED_ACTIONS property.
- * @param window The window.
- * @param action An array of allowed actions.
- * @param num    The number of actions.
- *
- * Set the user operations that the Window Manager supports for
- * @p window by sending the _NET_WM_ALLOWED_ACTIONS property to
- * @p window. @p action stores @p num actions.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_allowed_action_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_allowed_action_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_allowed_action_set(Ecore_X_Window  window,
+ecore_x_netwm_allowed_action_set(Ecore_X_Window  win,
                                  Ecore_X_Action *action,
                                  unsigned int    num)
 {
-   Ecore_X_Atom  *set;
-   unsigned int   i;
+   Ecore_X_Atom *set;
+   unsigned int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
    if (!num)
      {
-       ecore_x_window_prop_property_del(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
-       return;
+        ecore_x_window_prop_property_del(win,
+                                         ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
+        return;
      }
 
    set = malloc(num * sizeof(Ecore_X_Atom));
    if (!set) return;
 
    for (i = 0; i < num; i++)
-     set[i] = _ecore_x_netwm_action_atom_get(action[i]);
-
-   ecore_x_window_prop_atom_set(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS, set, num);
+     set[i] = _ecore_xcb_netwm_action_atom_get(action[i]);
 
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
+                                set, num);
    free(set);
 }
 
-/**
- * Get the allowed actions supported by a window.
- * @param window The window.
- * @param action The returned array of the actions.
- * @param num    The number of actions.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the user operations that the Window Manager supports for
- * @p window and store them in @p action. The number of actions is
- * stored in @p num. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_allowed_action_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_allowed_action_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_allowed_action_get(Ecore_X_Window   window,
-                                 Ecore_X_Action **action,
-                                 unsigned int    *num)
+/* local functions */
+int
+_ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
+                                    uint8_t        data __UNUSED__)
 {
-   Ecore_X_Atom *atoms;
-   int           num_ret;
-   int           i;
-
-   if (num) *num = 0;
-   if (action) *action = NULL;
-
-   num_ret = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
-                                              &atoms);
-   if (num_ret <= 0)
-      return 0;
-
-   if (action)
-     {
-       *action = malloc(num_ret * sizeof(Ecore_X_Action));
-       if (*action)
-         for (i = 0; i < num_ret; ++i)
-           (*action)[i] = _ecore_x_netwm_action_atom_get(atoms[i]);
-
-       if (num) *num = num_ret;
-     }
-
-   free(atoms);
-
-   return 1;
+   // TODO: TBD
+     return 1;
 }
 
-/**
- * Set the _NET_WM_WINDOW_OPACITY property.
- * @param window  The window.
- * @param opacity The opacity value.
- *
- * Set the desired opacity of @p window by sending the
- * _NET_WM_WINDOW_OPACITY property to @p window. @p opacity is 0 for a
- * transparent window and 0xffffffff for an opaque window. @p opacity
- * must be multiplied with the original alpha value of @p window
- * (which is 1 for visuals not including an alpha component) so that
- * @p window content is modulated by the opacity value.
- *
- * Window Managers acting as compositing managers MAY take this into
- * account when displaying a window. Window Managers MUST forward the
- * value of this property to any enclosing frame window.  This
- * property MAY change while the window is mapped and the Window
- * Manager MUST respect changes while the window is mapped.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_opacity_set(Ecore_X_Window window,
-                          unsigned int   opacity)
+int
+_ecore_xcb_netwm_startup_info(Ecore_X_Window win __UNUSED__,
+                              uint8_t        data __UNUSED__)
 {
-   uint32_t op = opacity;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
-                                 &op, 1);
+   // TODO: TBD
+     return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_opacity_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+/* static void  */
+/* _ecore_xcb_netwm_startup_info_free(void *data)  */
+/* { */
+/*    Ecore_Xcb_Startup_Info *info; */
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_WINDOW_OPACITY, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+/*    LOGFN(__FILE__, __LINE__, __FUNCTION__); */
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_opacity_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_opacity_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the opacity value of a window.
- * @param window  The window.
- * @param opacity The returned opacity.
- * @return        1 on success, 0 otherwise.
- *
- * Retriee the opacity value of @p window and store it in
- * @p opacity. This function returns 1 on sucess, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_opacity_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_opacity_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_opacity_get(Ecore_X_Window window,
-                          unsigned int  *opacity)
-{
-   int ret;
-   unsigned int tmp;
+/*    if (!(info = data)) return; */
+/*    if (info->buffer) free(info->buffer); */
+/*    if (info->id) free(info->id); */
+/*    if (info->name) free(info->name); */
+/*    if (info->bin) free(info->bin); */
+/*    if (info->icon) free(info->icon); */
+/*    if (info->description) free(info->description); */
+/*    if (info->wmclass) free(info->wmclass); */
+/*    free(info); */
+/* } */
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
-                                       &tmp, 1);
-   if (opacity) *opacity = tmp;
-   return ret == 1 ? 1 : 0;
-}
-
-/**
- * Set the _NET_FRAME_EXTENTS property.
- * @param window The window.
- * @param fl     The number of pixels of the left border of the window.
- * @param fr     The number of pixels of the right border of the window.
- * @param ft     The number of pixels of the top border of the window.
- * @param fb     The number of pixels of the bottom border of the window.
- *
- * Set the border witdh of @p window by sending the _NET_FRAME_EXTENTS
- * property to @p window. @p fl, @p fr, @p ft and @p fb are respectively
- * the number of pixels of the left, right, top and bottom border of
- * @p window.
- *
- * The Window Manager MUST set _NET_FRAME_EXTENTS to the extents of
- * the window's frame.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_frame_size_set(Ecore_X_Window window,
-                             int            fl,
-                             int            fr,
-                             int            ft,
-                             int            fb)
+static Ecore_X_Atom
+_ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type)
 {
-   uint32_t frames[4];
-
-   frames[0] = fl;
-   frames[1] = fr;
-   frames[2] = ft;
-   frames[3] = fb;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames, 4);
-}
+   switch (type)
+     {
+      case ECORE_X_WINDOW_TYPE_DESKTOP:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_frame_size_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+      case ECORE_X_WINDOW_TYPE_DOCK:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_FRAME_EXTENTS, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+      case ECORE_X_WINDOW_TYPE_TOOLBAR:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_frame_size_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_frame_size_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the frame extent of a window.
- * @param window  The window.
- * @param fl      The number of pixels of the left border of the window.
- * @param fr      The number of pixels of the right border of the window.
- * @param ft      The number of pixels of the top border of the window.
- * @param fb      The number of pixels of the bottom border of the window.
- * @return        1 on success, 0 otherwise.
- *
- * Retrieve the frame extents of @p window. The number of pixels of
- * the left, right, top and bottom border of @p window are
- * respectively stored in @p fl, @p fr, @p ft anfd @p fb. TYhis
- * function retuirns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_frame_size_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_frame_size_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_frame_size_get(Ecore_X_Window window,
-                             int           *fl,
-                             int           *fr,
-                             int           *ft,
-                             int           *fb)
-{
-   uint32_t frames[4];
-   int      ret = 0;
+      case ECORE_X_WINDOW_TYPE_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames, 4);
-   if (ret != 4)
-     return 0;
+      case ECORE_X_WINDOW_TYPE_UTILITY:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
 
-   if (fl) *fl = frames[0];
-   if (fr) *fr = frames[1];
-   if (ft) *ft = frames[2];
-   if (fb) *fb = frames[3];
-   return 1;
-}
+      case ECORE_X_WINDOW_TYPE_SPLASH:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_sync_counter_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+      case ECORE_X_WINDOW_TYPE_DIALOG:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+      case ECORE_X_WINDOW_TYPE_NORMAL:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_sync_counter_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_sync_counter_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the X ID of a X Sync counter.
- * @param window  The window.
- * @param counter The X ID of the Sync counter.
- * @return        1 on success, 0 otherwise.
- *
- * Retrieve the X ID of the X Sync counter of @p window and store it
- * in @p counter. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_frame_size_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_frame_size_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_sync_counter_get(Ecore_X_Window        window,
-                               Ecore_X_Sync_Counter *counter)
-{
-   int          ret;
-   unsigned int tmp;
+      case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
-                                       &tmp, 1);
+      case ECORE_X_WINDOW_TYPE_POPUP_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
 
-   if (counter) *counter = tmp;
-   return (ret == 1) ? 1 : 0;
-}
+      case ECORE_X_WINDOW_TYPE_TOOLTIP:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
 
-/**
- * Send a _NET_WM_PING property event.
- * @param window The window.
- *
- * Send a ClientMessage event from @p window with the _NET_WM_PING
- * property set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_ping_send(Ecore_X_Window window)
-{
-   xcb_client_message_event_t ev;
+      case ECORE_X_WINDOW_TYPE_NOTIFICATION:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
 
-   if (!window) return;
+      case ECORE_X_WINDOW_TYPE_COMBO:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
 
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.sequence = 0;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
-   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_PING;
-   ev.data.data32[1] = XCB_CURRENT_TIME;
-   ev.data.data32[2] = window;
-   ev.data.data32[3] = 0;
-   ev.data.data32[4] = 0;
-   ev.data.data32[5] = 0;
+      case ECORE_X_WINDOW_TYPE_DND:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
 
-   xcb_send_event(_ecore_xcb_conn, 0, window, XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+      default:
+        return 0;
+     }
 }
 
-/**
- * Send a _NET_WM_SYNC_REQUEST property event.
- * @param window The window.
- * @param serial The update request number.
- *
- * Send a ClientMessage event from @p window with the _NET_WM_SYNC_REQUEST
- * property set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_sync_request_send(Ecore_X_Window window,
-                                unsigned int   serial)
-{
-   xcb_client_message_event_t ev;
-
-   if (!window) return;
-
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
-   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
-   ev.data.data32[1] = XCB_CURRENT_TIME;
-   ev.data.data32[2] = serial;
-   /* FIXME: imho, the following test is useless as serial is non negative */
-   /* should we remove it ? */
-   ev.data.data32[3] = (serial < 0) ? ~0L : 0L;
-   ev.data.data32[4] = 0;
-
-   xcb_send_event(_ecore_xcb_conn, 0, window, 0, (const char *)&ev);
-}
-
-/**
- * Send a _NET_WM_STATE property event.
- * @param window The window.
- * @param root   The root window.
- * @param s1     The first state to alter.
- * @param s2     The second state to alter.
- * @param set    0 to unset the property, set it otherwise.
- *
- * Send a ClientMessage event from @p window to the @p root window
- * with the _NET_WM_STATE property set. This change the state of a
- * mapped window. @p s1 is the first state to alter. @p s2 is the
- * second state to alter. If @p set value is 0, the property is
- * removed (or unset), otherwise, the property is set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_state_request_send(Ecore_X_Window       window,
-                                 Ecore_X_Window       root,
-                                 Ecore_X_Window_State s1,
-                                 Ecore_X_Window_State s2,
-                                 int                  set)
+static Ecore_X_Window_Type
+_ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom)
 {
-   xcb_client_message_event_t ev;
-
-   if (!window) return;
-   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_NET_WM_STATE;
-   ev.data.data32[0] = !!set;
-   ev.data.data32[1] = _ecore_x_netwm_state_atom_get(s1);
-   ev.data.data32[2] = _ecore_x_netwm_state_atom_get(s2);
-   /* 1 == normal client, if someone wants to use this
-    * function in a pager, this should be 2 */
-   ev.data.data32[3] = 1;
-   ev.data.data32[4] = 0;
+   if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
+     return ECORE_X_WINDOW_TYPE_DESKTOP;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
+     return ECORE_X_WINDOW_TYPE_DOCK;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
+     return ECORE_X_WINDOW_TYPE_TOOLBAR;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
+     return ECORE_X_WINDOW_TYPE_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
+     return ECORE_X_WINDOW_TYPE_UTILITY;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
+     return ECORE_X_WINDOW_TYPE_SPLASH;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
+     return ECORE_X_WINDOW_TYPE_DIALOG;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
+     return ECORE_X_WINDOW_TYPE_NORMAL;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
+     return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
+     return ECORE_X_WINDOW_TYPE_POPUP_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
+     return ECORE_X_WINDOW_TYPE_TOOLTIP;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
+     return ECORE_X_WINDOW_TYPE_NOTIFICATION;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
+     return ECORE_X_WINDOW_TYPE_COMBO;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
+     return ECORE_X_WINDOW_TYPE_DND;
+   else
+     return ECORE_X_WINDOW_TYPE_UNKNOWN;
+}
 
-   xcb_send_event(_ecore_xcb_conn, 0, root,
-                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
-                  (const char *)&ev);
-}
-
-/**
- * Send a _NET_WM_DESKTOP property event.
- * @param window  The window.
- * @param root    The root window.
- * @param desktop The new desktop index.
- *
- * Send a ClientMessage event from @p window to the @p root window
- * with the _NET_WM_DESKTOP property set. This change the state of a
- * non-withdrawn window. @p desktop is the new desktop index to set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_desktop_request_send(Ecore_X_Window window,
-                                   Ecore_X_Window root,
-                                   unsigned int   desktop)
+static Ecore_X_Atom
+_ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state)
 {
-   xcb_client_message_event_t ev;
+   switch (state)
+     {
+      case ECORE_X_WINDOW_STATE_MODAL:
+        return ECORE_X_ATOM_NET_WM_STATE_MODAL;
 
-   if (!window) return;
-   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+      case ECORE_X_WINDOW_STATE_STICKY:
+        return ECORE_X_ATOM_NET_WM_STATE_STICKY;
 
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_NET_WM_DESKTOP;
-   ev.data.data32[0] = desktop;
+      case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
+        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
 
-   xcb_send_event(_ecore_xcb_conn, 0, root,
-                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
-                  (const char *)&ev);
-}
+      case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
+        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
 
-int
-_ecore_x_netwm_startup_info_begin(Ecore_X_Window window,
-                                  char          *data)
-{
-#if 0
-   Ecore_X_Startup_Info *info;
+      case ECORE_X_WINDOW_STATE_SHADED:
+        return ECORE_X_ATOM_NET_WM_STATE_SHADED;
 
-   if (!startup_info) return 0;
-   info = ecore_hash_get(startup_info, (void *)window);
-   if (info)
-     {
-       printf("Already got info for win: 0x%x\n", window);
-       _ecore_x_netwm_startup_info_free(info);
-     }
-   info = calloc(1, sizeof(Ecore_X_Startup_Info));
-   if (!info) return 0;
-   info->win = win;
-   info->length = 0;
-   info->buffer_size = 161;
-   info->buffer = calloc(info->buffer_size, sizeof(char));
-   if (!info->buffer)
-     {
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
-   memcpy(info->buffer, data, 20);
-   info->length += 20;
-   info->buffer[info->length] = 0;
-   ecore_hash_set(startup_info, (void *)info->win, info);
-   if (strlen(info->buffer) != 20)
-     {
-       /* We have a '\0' in there, the message is done */
-       _ecore_x_netwm_startup_info_process(info);
-     }
-#else
-   window = XCB_NONE;
-   data = NULL;
-#endif
+      case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
+        return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
 
-   return 1;
-}
+      case ECORE_X_WINDOW_STATE_SKIP_PAGER:
+        return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
 
-int
-_ecore_x_netwm_startup_info(Ecore_X_Window window,
-                            char          *data)
-{
-#if 0
-   Ecore_X_Startup_Info *info;
-   char *p;
+      case ECORE_X_WINDOW_STATE_HIDDEN:
+        return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
 
-   if (!startup_info) return 0;
-   info = ecore_hash_get(startup_info, (void *)window);
-   if (!info) return 0;
-   if ((info->length + 20) > info->buffer_size)
-     {
-       info->buffer_size += 160;
-       info->buffer = realloc(info->buffer, info->buffer_size * sizeof(char));
-       if (!info->buffer)
-         {
-            ecore_hash_remove(startup_info, (void *)info->win);
-            _ecore_x_netwm_startup_info_free(info);
-            return 0;
-         }
-     }
-   memcpy(info->buffer + info->length, data, 20);
-   p = info->buffer + info->length;
-   info->length += 20;
-   info->buffer[info->length] = 0;
-   if (strlen(p) != 20)
-     {
-       /* We have a '\0' in there, the message is done */
-       _ecore_x_netwm_startup_info_process(info);
-     }
-#else
-   window = XCB_NONE;
-   data = NULL;
-#endif
+      case ECORE_X_WINDOW_STATE_FULLSCREEN:
+        return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
 
-   return 1;
-}
+      case ECORE_X_WINDOW_STATE_ABOVE:
+        return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
 
-/*
- * Set UTF-8 string property
- */
-static void
-_ecore_x_window_prop_string_utf8_set(Ecore_X_Window window,
-                                     Ecore_X_Atom   atom,
-                                     const char    *str)
-{
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       atom, ECORE_X_ATOM_UTF8_STRING,
-                       8, strlen(str), str);
-}
+      case ECORE_X_WINDOW_STATE_BELOW:
+        return ECORE_X_ATOM_NET_WM_STATE_BELOW;
 
-#if 0
-static void
-_ecore_x_window_prop_string_utf8_get_prefetch(Ecore_X_Window window,
-                                              Ecore_X_Atom atom)
-{
-   xcb_get_property_cookie_t cookie;
+      case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
+        return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       atom, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+      default:
+        return 0;
+     }
 }
 
-static void
-_ecore_x_window_prop_string_utf8_get_fetch(void)
+Ecore_X_Window_State
+_ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   if (atom == ECORE_X_ATOM_NET_WM_STATE_MODAL)
+     return ECORE_X_WINDOW_STATE_MODAL;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_STICKY)
+     return ECORE_X_WINDOW_STATE_STICKY;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
+     return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
+     return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_SHADED)
+     return ECORE_X_WINDOW_STATE_SHADED;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
+     return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
+     return ECORE_X_WINDOW_STATE_SKIP_PAGER;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
+     return ECORE_X_WINDOW_STATE_HIDDEN;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
+     return ECORE_X_WINDOW_STATE_FULLSCREEN;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
+     return ECORE_X_WINDOW_STATE_ABOVE;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_BELOW)
+     return ECORE_X_WINDOW_STATE_BELOW;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
+     return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
+   else
+     return ECORE_X_WINDOW_STATE_UNKNOWN;
 }
-#endif
 
-/*
- * Get UTF-8 string property
- */
-static char *
-_ecore_x_window_prop_string_utf8_get(Ecore_X_Window window __UNUSED__,
-                                     Ecore_X_Atom   atom __UNUSED__)
+static Ecore_X_Atom
+_ecore_xcb_netwm_action_atom_get(Ecore_X_Action action)
 {
-   xcb_get_property_reply_t *reply;
-   char                     *str;
-   int                       length;
+   switch (action)
+     {
+      case ECORE_X_ACTION_MOVE:
+        return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return NULL;
+      case ECORE_X_ACTION_RESIZE:
+        return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
 
-   if ((reply->format != 8) ||
-       (reply->value_len <= 0))
-      return NULL;
+      case ECORE_X_ACTION_MINIMIZE:
+        return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
 
-   length = reply->value_len;
-   str = (char *)malloc (sizeof (char) * (length + 1));
-   if (!str)
-     {
-        return NULL;
-     }
-   memcpy(str, xcb_get_property_value(reply), length);
-   str[length] = '\0';
+      case ECORE_X_ACTION_SHADE:
+        return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
 
-   return str;
-}
+      case ECORE_X_ACTION_STICK:
+        return ECORE_X_ATOM_NET_WM_ACTION_STICK;
 
-#if 0 /* Unused */
-/*
- * Process startup info
- */
-static int
-_ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info)
-{
-   Ecore_X_Event_Startup_Sequence *e;
-   int                             event;
-   char                           *p;
+      case ECORE_X_ACTION_MAXIMIZE_HORZ:
+        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
 
-   p = strchr(info->buffer, ':');
-   if (!p)
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
-   *p = 0;
-   if (!strcmp(info->buffer, "new"))
-     {
-       if (info->init)
-         event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
-       else
-         event = ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
-       info->init = 1;
-     }
-   else if (!strcmp(info->buffer, "change"))
-     {
-       event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
-     }
-   else if (!strcmp(info->buffer, "remove"))
-     event = ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
-   else
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
+      case ECORE_X_ACTION_MAXIMIZE_VERT:
+        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
 
-   p++;
+      case ECORE_X_ACTION_FULLSCREEN:
+        return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
 
-   if (!_ecore_x_netwm_startup_info_parse(info, p))
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
+      case ECORE_X_ACTION_CHANGE_DESKTOP:
+        return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
 
-   if (info->init)
-     {
-       e = calloc(1, sizeof(Ecore_X_Event_Startup_Sequence));
-       if (!e)
-         {
-            ecore_hash_remove(startup_info, (void *)info->win);
-            _ecore_x_netwm_startup_info_free(info);
-            return 0;
-         }
-       e->win = info->win;
-       ecore_event_add(event, e, NULL, NULL);
-     }
+      case ECORE_X_ACTION_CLOSE:
+        return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
 
-   if (event == ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE)
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-     }
-   else
-     {
-       /* Discard buffer */
-       info->length = 0;
-       info->buffer[0] = 0;
-     }
-   return 1;
-}
+      case ECORE_X_ACTION_ABOVE:
+        return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
 
-/*
- * Parse startup info
- */
-static int
-_ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
-                                  char                 *data)
-{
+      case ECORE_X_ACTION_BELOW:
+        return ECORE_X_ATOM_NET_WM_ACTION_BELOW;
 
-   while (*data)
-     {
-       int in_quot_sing, in_quot_dbl, escaped;
-       char *p, *pp;
-       char *key;
-       char value[1024];
-
-       /* Skip space */
-       while (*data == ' ') data++;
-       /* Get key */
-       key = data;
-       data = strchr(key, '=');
-       if (!data) return 0;
-       *data = 0;
-       data++;
-
-       /* Get value */
-       p = data;
-       pp = value;
-       in_quot_dbl = 0;
-       in_quot_sing = 0;
-       escaped = 0;
-       while (*p)
-         {
-            if ((pp - value) >= 1024) return 0;
-            if (escaped)
-              {
-                 *pp = *p;
-                 pp++;
-                 escaped = 0;
-              }
-            else if (in_quot_sing)
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\'')
-                   in_quot_sing = 0;
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            else if (in_quot_dbl)
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\"')
-                   in_quot_dbl = 0;
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            else
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\'')
-                   in_quot_sing = 1;
-                 else if (*p == '\"')
-                   in_quot_dbl = 1;
-                 else if (*p == ' ')
-                   {
-                      break;
-                   }
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            p++;
-         }
-       if ((in_quot_dbl) || (in_quot_sing)) return 0;
-       data = p;
-       *pp = 0;
-
-       /* Parse info */
-       if (!strcmp(key, "ID"))
-         {
-            if ((info->id) && (strcmp(info->id, value))) return 0;
-            info->id = strdup(value);
-            p = strstr(value, "_TIME");
-            if (p)
-              {
-                 info->timestamp = atoi(p + 5);
-              }
-         }
-       else if (!strcmp(key, "NAME"))
-         {
-            if (info->name) free(info->name);
-            info->name = strdup(value);
-         }
-       else if (!strcmp(key, "SCREEN"))
-         {
-            info->screen = atoi(value);
-         }
-       else if (!strcmp(key, "BIN"))
-         {
-            if (info->bin) free(info->bin);
-            info->bin = strdup(value);
-         }
-       else if (!strcmp(key, "ICON"))
-         {
-            if (info->icon) free(info->icon);
-            info->icon = strdup(value);
-         }
-       else if (!strcmp(key, "DESKTOP"))
-         {
-            info->desktop = atoi(value);
-         }
-       else if (!strcmp(key, "TIMESTAMP"))
-         {
-            if (!info->timestamp)
-              info->timestamp = atoi(value);
-         }
-       else if (!strcmp(key, "DESCRIPTION"))
-         {
-            if (info->description) free(info->description);
-            info->description = strdup(value);
-         }
-       else if (!strcmp(key, "WMCLASS"))
-         {
-            if (info->wmclass) free(info->wmclass);
-            info->wmclass = strdup(value);
-         }
-       else if (!strcmp(key, "SILENT"))
-         {
-            info->silent = atoi(value);
-         }
-       else
-         {
-            printf("Ecore X Sequence, Unknown: %s=%s\n", key, value);
-         }
+      default:
+        return 0;
      }
-   if (!info->id) return 0;
-   return 1;
 }
-#endif
-
-/*
- * Free startup info struct
- */
-static void
-_ecore_x_netwm_startup_info_free(void *data)
-{
-   Ecore_X_Startup_Info *info;
-
-   info = data;
-   if (!info) return;
-   if (info->buffer) free(info->buffer);
-   if (info->id) free(info->id);
-   if (info->name) free(info->name);
-   if (info->bin) free(info->bin);
-   if (info->icon) free(info->icon);
-   if (info->description) free(info->description);
-   if (info->wmclass) free(info->wmclass);
-   free(info);
-}
-
-/*
- * Is screen composited?
- */
-
-/* FIXME: one round trip can be removed. Can we keep it ? */
-
-/**
- * Check whether a screen is composited or not.
- * @param screen The screen index.
- *
- * Return 1 if @p screen is composited, 0 otherwise.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_screen_is_composited(int screen)
-{
-   char                             buf[32];
-   xcb_intern_atom_cookie_t         cookie_atom;
-   xcb_get_selection_owner_cookie_t cookie_owner;
-   xcb_intern_atom_reply_t         *reply_atom;
-   xcb_get_selection_owner_reply_t *reply_owner;
-   Ecore_X_Window                   window;
-   Ecore_X_Atom                     atom;
-
-   snprintf(buf, sizeof(buf), "_NET_WM_CM_S%d", screen);
-   cookie_atom = xcb_intern_atom_unchecked(_ecore_xcb_conn, 1,
-                                           strlen(buf), buf);
-   reply_atom = xcb_intern_atom_reply(_ecore_xcb_conn, cookie_atom, NULL);
-   if (!reply_atom) return 0;
-   atom = reply_atom->atom;
-   free(reply_atom);
 
-   cookie_owner = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, atom);
-   reply_owner = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie_owner, NULL);
-   if (!reply_owner) return 0;
-
-   window = reply_owner->owner;
-   free(reply_owner);
-
-   return window != XCB_NONE;
-}
index f976f93..f9bf525 100644 (file)
@@ -1,17 +1,11 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
 
-
 /**
  * @defgroup Ecore_X_Pixmap_Group X Pixmap Functions
  *
  * Functions that operate on pixmaps.
  */
 
-
 /**
  * Creates a new pixmap.
  * @param   win Window used to determine which screen of the display the
@@ -32,16 +26,19 @@ ecore_x_pixmap_new(Ecore_X_Window win,
 {
    Ecore_X_Pixmap pmap;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
    if (win == 0) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
    if (dep == 0) dep = ((xcb_screen_t *)_ecore_xcb_screen)->root_depth;
 
    pmap = xcb_generate_id(_ecore_xcb_conn);
    xcb_create_pixmap(_ecore_xcb_conn, dep, pmap, win, w, h);
 
+//   ecore_x_flush();
    return pmap;
 }
 
-
 /**
  * Deletes the reference to the given pixmap.
  *
@@ -52,12 +49,15 @@ ecore_x_pixmap_new(Ecore_X_Window win,
  * @ingroup Ecore_X_Pixmap_Group
  */
 EAPI void
-ecore_x_pixmap_del(Ecore_X_Pixmap pmap)
+ecore_x_pixmap_free(Ecore_X_Pixmap pmap)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
    xcb_free_pixmap(_ecore_xcb_conn, pmap);
+//   ecore_x_flush();
 }
 
-
 /**
  * Pastes a rectangular area of the given pixmap onto the given drawable.
  * @param   pmap The given pixmap.
@@ -75,18 +75,21 @@ ecore_x_pixmap_del(Ecore_X_Pixmap pmap)
 EAPI void
 ecore_x_pixmap_paste(Ecore_X_Pixmap   pmap,
                      Ecore_X_Drawable dest,
-                    Ecore_X_GC       gc,
+                     Ecore_X_GC       gc,
                      int              sx,
                      int              sy,
-                    int              w,
+                     int              w,
                      int              h,
                      int              dx,
                      int              dy)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
    xcb_copy_area(_ecore_xcb_conn, pmap, dest, gc, sx, sy, dx, dy, w, h);
+//   ecore_x_flush();
 }
 
-
 /**
  * Retrieves the size of the given pixmap.
  * @param   pmap The given pixmap.
@@ -97,13 +100,18 @@ ecore_x_pixmap_paste(Ecore_X_Pixmap   pmap,
  * @ingroup Ecore_X_Pixmap_Group
  */
 EAPI void
-ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h)
+ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap,
+                            int           *x,
+                            int           *y,
+                            int           *w,
+                            int           *h)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    if (pmap)
-      ecore_x_drawable_geometry_get(pmap, x, y, w, h);
+     ecore_x_drawable_geometry_get(pmap, x, y, w, h);
 }
 
-
 /**
  * Retrieves the depth of the given pixmap.
  * @param   pmap The given pixmap.
@@ -113,5 +121,8 @@ ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h)
 EAPI int
 ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    return ecore_x_drawable_depth_get(pmap);
 }
+
index 180010c..838c278 100644 (file)
 #ifndef __ECORE_XCB_PRIVATE_H__
-#define __ECORE_XCB_PRIVATE_H__
-
-#include "config.h"
-
-#include <sys/param.h>
-
-#ifndef MAXHOSTNAMELEN
-# define MAXHOSTNAMELEN 256
-#endif
-
-#ifndef XK_MISCELLANY
-# define XK_MISCELLANY 1
-#endif /* XK_MISCELLANY */
-
-#include <xcb/xcb.h>
-#include <xcb/xcb_icccm.h>
-#include <xcb/xcb_keysyms.h>
-#include <xcb/bigreq.h>
-#ifdef ECORE_XCB_CURSOR
-# include <xcb/cursor.h>
-#endif /* ECORE_XCB_CURSOR */
-#ifdef ECORE_XCB_DAMAGE
-# include <xcb/damage.h>
-#endif /* ECORE_XCB_DAMAGE */
-#ifdef ECORE_XCB_COMPOSITE
-# include <xcb/composite.h>
-#endif /* ECORE_XCB_COMPOSITE */
-#ifdef ECORE_XCB_DPMS
-# include <xcb/dpms.h>
-#endif /* ECORE_XCB_DPMS */
-#ifdef ECORE_XCB_RANDR
-# include <xcb/randr.h>
-#endif /* ECORE_XCB_RANDR */
-#ifdef ECORE_XCB_RENDER
-# include <xcb/render.h>
-#endif /* ECORE_XCB_RENDER */
-#ifdef ECORE_XCB_SCREENSAVER
-# include <xcb/screensaver.h>
-#endif /* ECORE_XCB_SCREENSAVER */
-#ifdef ECORE_XCB_SHAPE
-# include <xcb/shape.h>
-#endif /* ECORE_XCB_SHAPE */
-#ifdef ECORE_XCB_SYNC
-# include <xcb/sync.h>
-#endif /* ECORE_XCB_SYNC */
-#ifdef ECORE_XCB_XFIXES
-# include <xcb/xfixes.h>
-#endif /* ECORE_XCB_XFIXES */
-#ifdef ECORE_XCB_XINERAMA
-# include <xcb/xinerama.h>
-#endif /* ECORE_XCB_XINERAMA */
-#ifdef ECORE_XCB_XPRINT
-# include <xcb/xprint.h>
-#endif /* ECORE_XCB_XPRINT */
-
-#include "ecore_private.h"
-#include "Ecore_X.h"
-
-/* FIXME: this is for simulation only */
-#include "Ecore_Txt.h"
-
-typedef struct _Ecore_X_Selection_Intern Ecore_X_Selection_Intern;
-
-struct _Ecore_X_Selection_Intern
+# define __ECORE_XCB_PRIVATE_H__
+
+//# define LOGFNS 1
+
+# ifdef HAVE_CONFIG_H
+#  include "config.h"
+# endif
+
+# include <unistd.h> // included for close & gethostname functions
+
+/* generic xcb includes */
+# include <xcb/xcb.h>
+# include <xcb/bigreq.h>
+# include <xcb/shm.h>
+# include <xcb/xcb_image.h>
+
+/* EFL includes */
+# include "Ecore.h"
+# include "Ecore_Input.h"
+# include "Ecore_X.h"
+
+/* logging */
+extern int _ecore_xcb_log_dom;
+
+# ifdef ECORE_XCB_DEFAULT_LOG_COLOR
+#  undef ECORE_XCB_DEFAULT_LOG_COLOR
+# endif
+# define ECORE_XCB_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+# ifdef ERR
+#  undef ERR
+# endif
+# define ERR(...) EINA_LOG_DOM_ERR(_ecore_xcb_log_dom, __VA_ARGS__)
+
+# ifdef DBG
+#  undef DBG
+# endif
+# define DBG(...) EINA_LOG_DOM_DBG(_ecore_xcb_log_dom, __VA_ARGS__)
+
+# ifdef INF
+#  undef INF
+# endif
+# define INF(...) EINA_LOG_DOM_INFO(_ecore_xcb_log_dom, __VA_ARGS__)
+
+# ifdef WRN
+#  undef WRN
+# endif
+# define WRN(...) EINA_LOG_DOM_WARN(_ecore_xcb_log_dom, __VA_ARGS__)
+
+# ifdef CRIT
+#  undef CRIT
+# endif
+# define CRIT(...)          EINA_LOG_DOM_CRIT(_ecore_xcb_log_dom, __VA_ARGS__)
+
+# ifdef LOGFNS
+#  include <stdio.h>
+#  define LOGFN(fl, ln, fn) printf("-ECORE-XCB: %25s: %5i - %s\n", fl, ln, fn);
+# else
+#  define LOGFN(fl, ln, fn)
+# endif
+
+# ifndef MAXHOSTNAMELEN
+#  define MAXHOSTNAMELEN 256
+# endif
+
+# ifndef MIN
+#  define MIN(x, y) (((x) > (y)) ? (y) : (x))
+# endif
+
+# ifndef MAX
+#  define MAX(a, b) ((a < b) ? b : a)
+# endif
+
+#define CHECK_XCB_CONN                              \
+  {                                                 \
+     if (xcb_connection_has_error(_ecore_xcb_conn)) \
+       {                                            \
+          DBG("XCB Connection Has Error !!");       \
+          _ecore_xcb_io_error_handle(NULL);         \
+       }                                            \
+  }
+
+/* enums */
+typedef enum _Ecore_Xcb_Encoding_Style Ecore_Xcb_Encoding_Style;
+
+enum _Ecore_Xcb_Encoding_Style
 {
-   Ecore_X_Window    win;
-   Ecore_X_Atom      selection;
-   unsigned char     *data;
-   int               length;
-   Ecore_X_Time      time;
+   XcbStringStyle,
+   XcbCompoundTextStyle,
+   XcbTextStyle,
+   XcbStdICCTextStyle,
+   XcbUTF8StringStyle
 };
 
+/* structures */
+typedef struct _Ecore_X_DND_Source          Ecore_X_DND_Source;
+typedef struct _Ecore_X_DND_Target          Ecore_X_DND_Target;
+typedef struct _Ecore_X_Selection_Intern    Ecore_X_Selection_Intern;
 typedef struct _Ecore_X_Selection_Converter Ecore_X_Selection_Converter;
+typedef struct _Ecore_X_Selection_Parser    Ecore_X_Selection_Parser;
+typedef struct _Ecore_Xcb_Textproperty      Ecore_Xcb_Textproperty;
 
-struct _Ecore_X_Selection_Converter
-{
-   Ecore_X_Atom target;
-   int (*convert)(char *target, void *data, int size,
-                  void **data_ret, int *size_ret);
-   Ecore_X_Selection_Converter *next;
-};
-
-typedef struct _Ecore_X_Selection_Parser Ecore_X_Selection_Parser;
-
-struct _Ecore_X_Selection_Parser
-{
-   char     *target;
-   void *(*parse)(const char *target, void *data, int size, int format);
-   Ecore_X_Selection_Parser *next;
-};
-
-typedef struct _Ecore_X_DND_Source
+struct _Ecore_X_DND_Source
 {
-   int version;
+   int            version;
    Ecore_X_Window win, dest;
 
-   enum {
+   enum
+   {
       ECORE_X_DND_SOURCE_IDLE,
       ECORE_X_DND_SOURCE_DRAGGING,
       ECORE_X_DND_SOURCE_DROPPED,
       ECORE_X_DND_SOURCE_CONVERTING
    } state;
 
-   struct {
-      short x, y;
+   struct
+   {
+      short          x, y;
       unsigned short width, height;
    } rectangle;
 
+   struct
+   {
+      Ecore_X_Window window;
+      int            x, y;
+   } prev;
+
    Ecore_X_Time time;
 
    Ecore_X_Atom action, accepted_action;
 
-   int will_accept;
-   int suppress;
-
-   int await_status;
-} Ecore_X_DND_Source;
+   int          will_accept, suppress;
+   int          await_status;
+};
 
-typedef struct _Ecore_X_DND_Target
+struct _Ecore_X_DND_Target
 {
-   int version;
+   int            version;
    Ecore_X_Window win, source;
 
-   enum {
+   enum
+   {
       ECORE_X_DND_TARGET_IDLE,
       ECORE_X_DND_TARGET_ENTERED
    } state;
 
-   struct {
+   struct
+   {
       int x, y;
    } pos;
 
    Ecore_X_Time time;
 
    Ecore_X_Atom action, accepted_action;
+   int          will_accept;
+};
 
-   int will_accept;
-} Ecore_X_DND_Target;
-
-
-extern Ecore_X_Connection *_ecore_xcb_conn;
-extern Ecore_X_Screen     *_ecore_xcb_screen;
-extern double              _ecore_xcb_double_click_time;
-extern Ecore_X_Time        _ecore_xcb_event_last_time;
-extern Ecore_X_Window      _ecore_xcb_event_last_window;
-extern int16_t             _ecore_xcb_event_last_root_x;
-extern int16_t             _ecore_xcb_event_last_root_y;
-extern int                 _ecore_xcb_xcursor;
-
-extern Ecore_X_Atom        _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM];
-
-extern int                 _ecore_window_grabs_num;
-extern Ecore_X_Window     *_ecore_window_grabs;
-extern int               (*_ecore_window_grab_replay_func) (void *data, int event_type, void *event);
-extern void               *_ecore_window_grab_replay_data;
-
-extern Ecore_X_Window      _ecore_xcb_private_window;
-
-
-void _ecore_x_error_handler_init(void);
-
-void _ecore_x_event_handle_key_press          (xcb_generic_event_t *event);
-void _ecore_x_event_handle_key_release        (xcb_generic_event_t *event);
-void _ecore_x_event_handle_button_press       (xcb_generic_event_t *event);
-void _ecore_x_event_handle_button_release     (xcb_generic_event_t *event);
-void _ecore_x_event_handle_motion_notify      (xcb_generic_event_t *event);
-void _ecore_x_event_handle_enter_notify       (xcb_generic_event_t *event);
-void _ecore_x_event_handle_leave_notify       (xcb_generic_event_t *event);
-void _ecore_x_event_handle_focus_in           (xcb_generic_event_t *event);
-void _ecore_x_event_handle_focus_out          (xcb_generic_event_t *event);
-void _ecore_x_event_handle_keymap_notify      (xcb_generic_event_t *event);
-void _ecore_x_event_handle_expose             (xcb_generic_event_t *event);
-void _ecore_x_event_handle_graphics_expose    (xcb_generic_event_t *event);
-void _ecore_x_event_handle_visibility_notify  (xcb_generic_event_t *event);
-void _ecore_x_event_handle_create_notify      (xcb_generic_event_t *event);
-void _ecore_x_event_handle_destroy_notify     (xcb_generic_event_t *event);
-void _ecore_x_event_handle_unmap_notify       (xcb_generic_event_t *event);
-void _ecore_x_event_handle_map_notify         (xcb_generic_event_t *event);
-void _ecore_x_event_handle_map_request        (xcb_generic_event_t *event);
-void _ecore_x_event_handle_reparent_notify    (xcb_generic_event_t *event);
-void _ecore_x_event_handle_configure_notify   (xcb_generic_event_t *event);
-void _ecore_x_event_handle_configure_request  (xcb_generic_event_t *event);
-void _ecore_x_event_handle_gravity_notify     (xcb_generic_event_t *event);
-void _ecore_x_event_handle_resize_request     (xcb_generic_event_t *event);
-void _ecore_x_event_handle_circulate_notify   (xcb_generic_event_t *event);
-void _ecore_x_event_handle_circulate_request  (xcb_generic_event_t *event);
-void _ecore_x_event_handle_property_notify    (xcb_generic_event_t *event);
-void _ecore_x_event_handle_selection_clear    (xcb_generic_event_t *event);
-void _ecore_x_event_handle_selection_request  (xcb_generic_event_t *event);
-void _ecore_x_event_handle_selection_notify   (xcb_generic_event_t *event);
-void _ecore_x_event_handle_colormap_notify    (xcb_generic_event_t *event);
-void _ecore_x_event_handle_client_message     (xcb_generic_event_t *event);
-void _ecore_x_event_handle_mapping_notify     (xcb_generic_event_t *event);
-#ifdef ECORE_XCB_DAMAGE
-void _ecore_x_event_handle_damage_notify      (xcb_generic_event_t *event);
-#endif /* ECORE_XCB_DAMAGE */
-#ifdef ECORE_XCB_RANDR
-void _ecore_x_event_handle_randr_change       (xcb_generic_event_t *event);
-#endif /* ECORE_XCB_RANDR */
-#ifdef ECORE_XCB_SCREENSAVER
-void _ecore_x_event_handle_screensaver_notify (xcb_generic_event_t *event);
-#endif /* ECORE_XCB_SCREENSAVER */
-#ifdef ECORE_XCB_SHAPE
-void _ecore_x_event_handle_shape_change       (xcb_generic_event_t *event);
-#endif /* ECORE_XCB_SHAPE */
-#ifdef ECORE_XCB_SYNC
-void _ecore_x_event_handle_sync_counter       (xcb_generic_event_t *event);
-void _ecore_x_event_handle_sync_alarm         (xcb_generic_event_t *event);
-#endif /* ECORE_XCB_SYNC */
-#ifdef ECORE_XCB_FIXES
-void _ecore_x_event_handle_fixes_selection_notify(xcb_generic_event_t *event);
-#endif /* ECORE_XCB_FIXES */
-
-
-/* requests / replies */
-int          _ecore_x_reply_init ();
-void         _ecore_x_reply_shutdown ();
-void         _ecore_xcb_cookie_cache (unsigned int cookie);
-unsigned int _ecore_xcb_cookie_get (void);
-void         _ecore_xcb_reply_cache (void *reply);
-void        *_ecore_xcb_reply_get (void);
-
-
-/* atoms */
-extern Ecore_X_Atom ECORE_X_ATOM_ATOM;
-extern Ecore_X_Atom ECORE_X_ATOM_CARDINAL;
-extern Ecore_X_Atom ECORE_X_ATOM_STRING;
-extern Ecore_X_Atom ECORE_X_ATOM_WINDOW;
-extern Ecore_X_Atom ECORE_X_ATOM_E_FRAME_SIZE;
-extern Ecore_X_Atom ECORE_X_ATOM_WM_SIZE_HINTS;
-
-#define ECORE_X_ATOMS_COUNT 115
-
-void _ecore_x_atom_init          (xcb_intern_atom_cookie_t *);
-void _ecore_x_atom_init_finalize (xcb_intern_atom_cookie_t *);
-
-
-/* damage */
-void _ecore_x_damage_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_damage_init_finalize (void);
-
-/* composite */
-void _ecore_x_composite_init       (const xcb_query_extension_reply_t *reply);
-void _ecore_x_composite_init_finalize (void);
-
-/* from dnd */
-void                _ecore_x_dnd_init       (void);
-void                _ecore_x_dnd_shutdown   (void);
-Ecore_X_DND_Source *_ecore_x_dnd_source_get (void);
-Ecore_X_DND_Target *_ecore_x_dnd_target_get (void);
-void                _ecore_x_dnd_drag       (Ecore_X_Window root,
-                                             int x,
-                                             int y);
-
-
-/* dpms */
-void _ecore_x_dpms_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_dpms_init_finalize (void);
-
-
-/* netwm */
-Ecore_X_Window_State _ecore_x_netwm_state_get(Ecore_X_Atom a);
-int                  _ecore_x_netwm_startup_info_begin(Ecore_X_Window win, char *data);
-int                  _ecore_x_netwm_startup_info(Ecore_X_Window win, char *data);
-
-
-/* randr */
-void _ecore_x_randr_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_randr_init_finalize (void);
-
-
-/* selection */
-void                      _ecore_x_selection_init(void);
-void                      _ecore_x_selection_shutdown(void);
-Ecore_X_Atom              _ecore_x_selection_target_atom_get(const char *target);
-char                     *_ecore_x_selection_target_get(Ecore_X_Atom target);
-Ecore_X_Selection_Intern *_ecore_x_selection_get(Ecore_X_Atom selection);
-int                       _ecore_x_selection_set(Ecore_X_Window w, const void *data, int len, Ecore_X_Atom selection);
-int                       _ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret);
-void                     *_ecore_x_selection_parse(const char *target, void *data, int size, int format);
-
-
-/* screensaver */
-void _ecore_x_screensaver_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_screensaver_init_finalize (void);
-
-
-/* shape */
-void _ecore_x_shape_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_shape_init_finalize (void);
-
-
-/* sync */
-void _ecore_x_sync_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_sync_init_finalize (void);
-
-
-/* xfixes */
-void _ecore_x_xfixes_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_xfixes_init_finalize (void);
-
-
-/* xinerama */
-void _ecore_x_xinerama_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_xinerama_init_finalize (void);
+struct _Ecore_X_Selection_Intern
+{
+   Ecore_X_Window win;
+   Ecore_X_Atom   selection;
+   unsigned char *data;
+   int            length;
+   Ecore_X_Time   time;
+};
 
+struct _Ecore_X_Selection_Converter
+{
+   Ecore_X_Atom                 target;
+   Eina_Bool                    (*convert)(char *target,
+                                           void *data,
+                                           int size,
+                                           void **data_ret,
+                                           int *size_ret,
+                                           Ecore_X_Atom *type,
+                                           int *size_type);
+   Ecore_X_Selection_Converter *next;
+};
 
-/* xprint */
-void _ecore_x_xprint_init          (const xcb_query_extension_reply_t *reply);
-void _ecore_x_xprint_init_finalize (void);
+struct _Ecore_X_Selection_Parser
+{
+   char                     *target;
+   void                     *(*parse)(const char *target, void *data, int size, int format);
+   Ecore_X_Selection_Parser *next;
+};
 
-/* to categorize */
-void _ecore_x_sync_magic_send(int val, Ecore_X_Window swin);
-void _ecore_x_window_grab_remove(Ecore_X_Window win);
-void _ecore_x_key_grab_remove(Ecore_X_Window win);
+struct _Ecore_Xcb_Textproperty
+{
+   char        *value;
+   Ecore_X_Atom encoding;
+   unsigned int format, nitems;
+};
 
+/* external variables */
+extern Ecore_X_Connection *_ecore_xcb_conn;
+extern Ecore_X_Screen *_ecore_xcb_screen;
+extern double _ecore_xcb_double_click_time;
+extern int16_t _ecore_xcb_event_last_root_x;
+extern int16_t _ecore_xcb_event_last_root_y;
+
+/* external variables for extension events */
+extern int _ecore_xcb_event_damage;
+extern int _ecore_xcb_event_randr;
+extern int _ecore_xcb_event_screensaver;
+extern int _ecore_xcb_event_shape;
+extern int _ecore_xcb_event_sync;
+extern int _ecore_xcb_event_xfixes;
+extern int _ecore_xcb_event_input;
+extern int _ecore_xcb_event_gesture;
+
+extern Ecore_X_Atom _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_NUM];
+
+extern int _ecore_xcb_button_grabs_num;
+extern int _ecore_xcb_key_grabs_num;
+extern Ecore_X_Window *_ecore_xcb_button_grabs;
+extern Ecore_X_Window *_ecore_xcb_key_grabs;
+extern Eina_Bool (*_ecore_xcb_window_grab_replay_func)(void *data,
+                                                       int type,
+                                                       void *event);
+extern void *_ecore_xcb_window_grab_replay_data;
+
+/* private function prototypes */
+void _ecore_xcb_error_handler_init(void);
+void _ecore_xcb_error_handler_shutdown(void);
+
+void _ecore_xcb_atoms_init(void);
+void _ecore_xcb_atoms_finalize(void);
+
+void _ecore_xcb_extensions_init(void);
+void _ecore_xcb_extensions_finalize(void);
+
+void _ecore_xcb_shape_init(void);
+void _ecore_xcb_shape_finalize(void);
+
+void _ecore_xcb_screensaver_init(void);
+void _ecore_xcb_screensaver_finalize(void);
+
+void _ecore_xcb_sync_init(void);
+void _ecore_xcb_sync_finalize(void);
+void _ecore_xcb_sync_magic_send(int val,
+                                Ecore_X_Window win);
+
+void                _ecore_xcb_render_init(void);
+void                _ecore_xcb_render_finalize(void);
+Eina_Bool           _ecore_xcb_render_argb_get(void);
+Eina_Bool           _ecore_xcb_render_anim_get(void);
+Eina_Bool           _ecore_xcb_render_avail_get(void);
+
+Eina_Bool           _ecore_xcb_render_visual_supports_alpha(Ecore_X_Visual visual);
+uint32_t            _ecore_xcb_render_find_visual_id(int type,
+                                                     Eina_Bool check_alpha);
+Ecore_X_Visual     *_ecore_xcb_render_visual_get(int visual_id);
+
+void                _ecore_xcb_randr_init(void);
+void                _ecore_xcb_randr_finalize(void);
+
+void _ecore_xcb_gesture_init(void);
+void _ecore_xcb_gesture_finalize(void);
+void _ecore_xcb_gesture_shutdown(void);
+
+void                _ecore_xcb_xfixes_init(void);
+void                _ecore_xcb_xfixes_finalize(void);
+Eina_Bool           _ecore_xcb_xfixes_avail_get(void);
+
+void                _ecore_xcb_damage_init(void);
+void                _ecore_xcb_damage_finalize(void);
+
+void                _ecore_xcb_composite_init(void);
+void                _ecore_xcb_composite_finalize(void);
+
+void                _ecore_xcb_dpms_init(void);
+void                _ecore_xcb_dpms_finalize(void);
+
+void                _ecore_xcb_cursor_init(void);
+void                _ecore_xcb_cursor_finalize(void);
+
+void                _ecore_xcb_xinerama_init(void);
+void                _ecore_xcb_xinerama_finalize(void);
+
+void                _ecore_xcb_dnd_init(void);
+void                _ecore_xcb_dnd_shutdown(void);
+Ecore_X_DND_Source *_ecore_xcb_dnd_source_get(void);
+Ecore_X_DND_Target *_ecore_xcb_dnd_target_get(void);
+void                _ecore_xcb_dnd_drag(Ecore_X_Window root,
+                                        int x,
+                                        int y);
+
+void  _ecore_xcb_selection_init(void);
+void  _ecore_xcb_selection_shutdown(void);
+void *_ecore_xcb_selection_parse(const char *target,
+                                 void *data,
+                                 int size,
+                                 int format);
+char                     *_ecore_xcb_selection_target_get(Ecore_X_Atom target);
+Ecore_X_Selection_Intern *_ecore_xcb_selection_get(Ecore_X_Atom selection);
+
+# ifdef HAVE_ICONV
+Eina_Bool _ecore_xcb_utf8_textlist_to_textproperty(char **list,
+                                                   int count,
+                                                   Ecore_Xcb_Encoding_Style style,
+                                                   Ecore_Xcb_Textproperty *ret);
+# endif
+Eina_Bool _ecore_xcb_mb_textlist_to_textproperty(char **list,
+                                                 int count,
+                                                 Ecore_Xcb_Encoding_Style style,
+                                                 Ecore_Xcb_Textproperty *ret);
+Eina_Bool _ecore_xcb_textlist_to_textproperty(const char *type,
+                                              char **list,
+                                              int count,
+                                              Ecore_Xcb_Encoding_Style style,
+                                              Ecore_Xcb_Textproperty *ret);
+
+# ifdef HAVE_ICONV
+Eina_Bool _ecore_xcb_utf8_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
+                                                   char ***list_ret,
+                                                   int *count_ret);
+# endif
+Eina_Bool _ecore_xcb_mb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
+                                                 char ***list_ret,
+                                                 int *count_ret);
+Eina_Bool _ecore_xcb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
+                                              const char *type,
+                                              char ***list_ret,
+                                              int *count_ret);
+
+void         _ecore_xcb_events_init(void);
+void         _ecore_xcb_events_shutdown(void);
+void         _ecore_xcb_events_handle(xcb_generic_event_t *ev);
+Ecore_X_Time _ecore_xcb_events_last_time_get(void);
+unsigned int _ecore_xcb_events_modifiers_get(unsigned int state);
+void         _ecore_xcb_event_mouse_move(uint16_t timestamp,
+                                         uint16_t modifiers,
+                                         int16_t x,
+                                         int16_t y,
+                                         int16_t root_x,
+                                         int16_t root_y,
+                                         xcb_window_t event_win,
+                                         xcb_window_t win,
+                                         xcb_window_t root_win,
+                                         uint8_t same_screen,
+                                         int dev,
+                                         double radx,
+                                         double rady,
+                                         double pressure,
+                                         double angle,
+                                         int16_t mx,
+                                         int16_t my,
+                                         int16_t mrx,
+                                         int16_t mry);
+Ecore_Event_Mouse_Button *_ecore_xcb_event_mouse_button(int event,
+                                                        uint16_t timestamp,
+                                                        uint16_t modifiers,
+                                                        xcb_button_t buttons,
+                                                        int16_t x,
+                                                        int16_t y,
+                                                        int16_t root_x,
+                                                        int16_t root_y,
+                                                        xcb_window_t event_win,
+                                                        xcb_window_t win,
+                                                        xcb_window_t root_win,
+                                                        uint8_t same_screen,
+                                                        int dev,
+                                                        double radx,
+                                                        double rady,
+                                                        double pressure,
+                                                        double angle,
+                                                        int16_t mx,
+                                                        int16_t my,
+                                                        int16_t mrx,
+                                                        int16_t mry);
+
+void           _ecore_xcb_keymap_init(void);
+void           _ecore_xcb_keymap_finalize(void);
+void           _ecore_xcb_keymap_shutdown(void);
+void           _ecore_xcb_keymap_refresh(xcb_mapping_notify_event_t *event);
+xcb_keysym_t   _ecore_xcb_keymap_keycode_to_keysym(xcb_keycode_t keycode,
+                                                   int col);
+xcb_keycode_t *_ecore_xcb_keymap_keysym_to_keycode(xcb_keysym_t keysym);
+char          *_ecore_xcb_keymap_keysym_to_string(xcb_keysym_t keysym);
+xcb_keycode_t  _ecore_xcb_keymap_string_to_keycode(const char *key);
+int            _ecore_xcb_keymap_lookup_string(xcb_keycode_t keycode,
+                                               int state,
+                                               char *buffer,
+                                               int bytes,
+                                               xcb_keysym_t *sym);
+
+void _ecore_xcb_input_init(void);
+void _ecore_xcb_input_finalize(void);
+void _ecore_xcb_input_shutdown(void);
+# ifdef ECORE_XCB_XINPUT
+void _ecore_xcb_input_handle_event(xcb_generic_event_t *event);
+# else
+void _ecore_xcb_input_handle_event(xcb_generic_event_t *event __UNUSED__);
+# endif
+
+void           _ecore_xcb_dri_init(void);
+void           _ecore_xcb_dri_finalize(void);
+
+void           _ecore_xcb_xtest_init(void);
+void           _ecore_xcb_xtest_finalize(void);
+
+Ecore_X_Window _ecore_xcb_window_root_of_screen_get(int screen);
+void           _ecore_xcb_window_prop_string_utf8_set(Ecore_X_Window win,
+                                                      Ecore_X_Atom atom,
+                                                      const char *str);
+Ecore_X_Visual _ecore_xcb_window_visual_get(Ecore_X_Window win);
+void           _ecore_xcb_window_button_grab_remove(Ecore_X_Window win);
+void           _ecore_xcb_window_key_grab_remove(Ecore_X_Window win);
+void           _ecore_xcb_window_grab_allow_events(Ecore_X_Window event_win,
+                                                   Ecore_X_Window child_win,
+                                                   int type,
+                                                   void *event,
+                                                   Ecore_X_Time timestamp);
+
+int                  _ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
+                                                         uint8_t data __UNUSED__);
+int                  _ecore_xcb_netwm_startup_info(Ecore_X_Window win __UNUSED__,
+                                                   uint8_t data __UNUSED__);
+Ecore_X_Window_State _ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom);
+
+int                  _ecore_xcb_error_handle(xcb_generic_error_t *err);
+int                  _ecore_xcb_io_error_handle(xcb_generic_error_t *err);
+
+xcb_image_t         *_ecore_xcb_image_create_native(int w,
+                                                    int h,
+                                                    xcb_image_format_t format,
+                                                    uint8_t depth,
+                                                    void *base,
+                                                    uint32_t bytes,
+                                                    uint8_t *data);
+
+void  _ecore_xcb_xdefaults_init(void);
+void  _ecore_xcb_xdefaults_shutdown(void);
+char *_ecore_xcb_xdefaults_string_get(const char *prog,
+                                      const char *param);
+int   _ecore_xcb_xdefaults_int_get(const char *prog,
+                                   const char *param);
+
+void _ecore_xcb_modifiers_get(void);
 
-#endif /* __ECORE_XCB_PRIVATE_H__*/
+#endif
index d2e0b9d..a96b047 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-#include "ecore_xcb_private.h"
-
-
-/**
- * @defgroup Ecore_X_RandR_Group X RandR Extension Functions
+/* TODO: List of missing functions
  *
- * Functions related to the X RandR extension.
+ * ecore_x_randr_crtc_clone_set
+ * ecore_x_randr_output_crtc_set
+ * ecore_x_randr_edid_version_get
+ * ecore_x_randr_edid_info_has_valid_checksum
+ * ecore_x_randr_edid_manufacturer_name_get
+ * ecore_x_randr_edid_display_ascii_get
+ * ecore_x_randr_edid_display_serial_get
+ * ecore_x_randr_edid_model_get
+ * ecore_x_randr_edid_manufacturer_serial_number_get
+ * ecore_x_randr_edid_manufacturer_model_get
+ * ecore_x_randr_edid_dpms_available_get
+ * ecore_x_randr_edid_dpms_standby_available_get
+ * ecore_x_randr_edid_dpms_suspend_available_get
+ * ecore_x_randr_edid_dpms_off_available_get
+ * ecore_x_randr_edid_display_aspect_ratio_preferred_get
+ * ecore_x_randr_edid_display_aspect_ratios_get
+ * ecore_x_randr_edid_display_colorscheme_get
+ * ecore_x_randr_edid_display_type_digital_get
+ * ecore_x_randr_edid_display_interface_type_get
+ * ecore_x_randr_screen_backlight_level_set
+ * ecore_x_randr_output_subpixel_order_get
+ * ecore_x_randr_output_wired_clones_get
+ * ecore_x_randr_output_compatibility_list_get
+ * ecore_x_randr_output_signal_formats_get
+ * ecore_x_randr_output_signal_format_set
+ * ecore_x_randr_output_signal_properties_get
+ * ecore_x_randr_output_connector_number_get
+ * ecore_x_randr_output_connector_type_get
+ * ecore_x_randr_crtc_panning_area_get
+ * ecore_x_randr_crtc_panning_area_set
+ * ecore_x_randr_crtc_tracking_area_get
+ * ecore_x_randr_crtc_tracking_area_set
+ * ecore_x_randr_crtc_border_area_get
+ * ecore_x_randr_crtc_border_area_set
  */
 
-
+#include "ecore_xcb_private.h"
+# ifdef ECORE_XCB_RANDR
+#  include <xcb/randr.h>
+# endif
+
+#define Ecore_X_Randr_None  0
+#define Ecore_X_Randr_Unset -1
+
+#define RANDR_1_1           ((1 << 16) | 1)
+#define RANDR_1_2           ((1 << 16) | 2)
+#define RANDR_1_3           ((1 << 16) | 3)
+
+#define RANDR_CHECK_1_1_RET(ret) if (_randr_version < RANDR_1_1) return ret
+#define RANDR_CHECK_1_2_RET(ret) if (_randr_version < RANDR_1_2) return ret
+#define RANDR_CHECK_1_3_RET(ret) if (_randr_version < RANDR_1_3) return ret
+
+#define ECORE_X_RANDR_EDID_VERSION_13 ((1 << 8) | 3)
+#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR 0x12
+#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR 0x13
+#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK 0x36
+#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE 3
+#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT 5
+#define _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX 13
+
+#define _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
+  for (block = edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK; block <= (edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK + (3 * 18)); block += 18)
+
+#define _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) \
+  _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block)                 \
+  if ((block[0] == 0) && (block[1] == 0))
+
+/* local function prototypes */
+static Eina_Bool                                       _ecore_xcb_randr_output_validate(Ecore_X_Window       root,
+                                                                                        Ecore_X_Randr_Output output);
+static Eina_Bool                                       _ecore_xcb_randr_crtc_validate(Ecore_X_Window     root,
+                                                                                      Ecore_X_Randr_Crtc crtc);
+static Eina_Bool                                       _ecore_xcb_randr_root_validate(Ecore_X_Window root);
+static int                                             _ecore_xcb_randr_root_to_screen(Ecore_X_Window root);
 #ifdef ECORE_XCB_RANDR
-static int _randr_available = 0;
-static xcb_randr_query_version_cookie_t _ecore_xcb_randr_init_cookie;
-#endif /* ECORE_XCB_RANDR */
-
-
-/* To avoid round trips, the initialization is separated in 2
-   functions: _ecore_xcb_randr_init and
-   _ecore_xcb_randr_init_finalize. The first one gets the cookies and
-   the second one gets the replies and set the atoms. */
+static xcb_randr_get_screen_resources_reply_t         *_ecore_xcb_randr_12_get_resources(Ecore_X_Window win);
+static xcb_randr_get_screen_resources_current_reply_t *_ecore_xcb_randr_13_get_resources(Ecore_X_Window win);
+#endif
+static xcb_timestamp_t                                 _ecore_xcb_randr_12_get_resource_timestamp(Ecore_X_Window win);
+static xcb_timestamp_t                                 _ecore_xcb_randr_13_get_resource_timestamp(Ecore_X_Window win);
+
+static Ecore_X_Randr_Mode                             *_ecore_xcb_randr_12_output_modes_get(Ecore_X_Window       root,
+                                                                                            Ecore_X_Randr_Output output,
+                                                                                            int                 *num,
+                                                                                            int                 *npreferred);
+static Ecore_X_Randr_Mode *_ecore_xcb_randr_13_output_modes_get(Ecore_X_Window       root,
+                                                                Ecore_X_Randr_Output output,
+                                                                int                 *num,
+                                                                int                 *npreferred);
+static Ecore_X_Randr_Mode_Info  *_ecore_xcb_randr_12_mode_info_get(Ecore_X_Window     root,
+                                                                   Ecore_X_Randr_Mode mode);
+static Ecore_X_Randr_Mode_Info  *_ecore_xcb_randr_13_mode_info_get(Ecore_X_Window     root,
+                                                                   Ecore_X_Randr_Mode mode);
+static Ecore_X_Randr_Mode_Info **_ecore_xcb_randr_12_modes_info_get(Ecore_X_Window root,
+                                                                    int           *num);
+static Ecore_X_Randr_Mode_Info **_ecore_xcb_randr_13_modes_info_get(Ecore_X_Window root,
+                                                                    int           *num);
+static void                      _ecore_xcb_randr_12_mode_size_get(Ecore_X_Window     root,
+                                                                   Ecore_X_Randr_Mode mode,
+                                                                   int               *w,
+                                                                   int               *h);
+static void _ecore_xcb_randr_13_mode_size_get(Ecore_X_Window     root,
+                                              Ecore_X_Randr_Mode mode,
+                                              int               *w,
+                                              int               *h);
+static Ecore_X_Randr_Output *_ecore_xcb_randr_12_output_clones_get(Ecore_X_Window       root,
+                                                                   Ecore_X_Randr_Output output,
+                                                                   int                 *num);
+static Ecore_X_Randr_Output *_ecore_xcb_randr_13_output_clones_get(Ecore_X_Window       root,
+                                                                   Ecore_X_Randr_Output output,
+                                                                   int                 *num);
+static Ecore_X_Randr_Crtc *_ecore_xcb_randr_12_output_possible_crtcs_get(Ecore_X_Window       root,
+                                                                         Ecore_X_Randr_Output output,
+                                                                         int                 *num);
+static Ecore_X_Randr_Crtc *_ecore_xcb_randr_13_output_possible_crtcs_get(Ecore_X_Window       root,
+                                                                         Ecore_X_Randr_Output output,
+                                                                         int                 *num);
+static char *_ecore_xcb_randr_12_output_name_get(Ecore_X_Window       root,
+                                                 Ecore_X_Randr_Output output,
+                                                 int                 *len);
+static char *_ecore_xcb_randr_13_output_name_get(Ecore_X_Window       root,
+                                                 Ecore_X_Randr_Output output,
+                                                 int                 *len);
+static Ecore_X_Randr_Connection_Status _ecore_xcb_randr_12_output_connection_status_get(Ecore_X_Window       root,
+                                                                                        Ecore_X_Randr_Output output);
+static Ecore_X_Randr_Connection_Status _ecore_xcb_randr_13_output_connection_status_get(Ecore_X_Window       root,
+                                                                                        Ecore_X_Randr_Output output);
+static Ecore_X_Randr_Output           *_ecore_xcb_randr_12_outputs_get(Ecore_X_Window root,
+                                                                       int           *num);
+static Ecore_X_Randr_Output           *_ecore_xcb_randr_13_outputs_get(Ecore_X_Window root,
+                                                                       int           *num);
+static Ecore_X_Randr_Crtc              _ecore_xcb_randr_12_output_crtc_get(Ecore_X_Window       root,
+                                                                           Ecore_X_Randr_Output output);
+static Ecore_X_Randr_Crtc              _ecore_xcb_randr_13_output_crtc_get(Ecore_X_Window       root,
+                                                                           Ecore_X_Randr_Output output);
+
+/* local variables */
+static Eina_Bool _randr_avail = EINA_FALSE;
+static int _randr_version = -1;
+
+/* external variables */
+int _ecore_xcb_event_randr = -1;
 
 void
-_ecore_x_randr_init(const xcb_query_extension_reply_t *reply)
+_ecore_xcb_randr_init(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
 #ifdef ECORE_XCB_RANDR
-   if (reply && (reply->present))
-      _ecore_xcb_randr_init_cookie = xcb_randr_query_version_unchecked(_ecore_xcb_conn, 1, 2);
-#endif /* ECORE_XCB_RANDR */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_randr_id);
+#endif
 }
 
 void
-_ecore_x_randr_init_finalize(void)
+_ecore_xcb_randr_finalize(void)
 {
 #ifdef ECORE_XCB_RANDR
-   xcb_randr_query_version_reply_t *reply;
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
-   reply = xcb_randr_query_version_reply(_ecore_xcb_conn,
-                                         _ecore_xcb_randr_init_cookie, NULL);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (reply)
+#ifdef ECORE_XCB_RANDR
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_randr_id);
+   if ((ext_reply) && (ext_reply->present))
      {
-        if ((reply->major_version >= 1) &&
-            (reply->minor_version >= 1))
-          _randr_available = 1;
-        free(reply);
+        xcb_randr_query_version_cookie_t cookie;
+        xcb_randr_query_version_reply_t *reply;
+
+        cookie =
+          xcb_randr_query_version_unchecked(_ecore_xcb_conn,
+                                            XCB_RANDR_MAJOR_VERSION,
+                                            XCB_RANDR_MINOR_VERSION);
+        reply = xcb_randr_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             if ((reply->major_version >= XCB_RANDR_MAJOR_VERSION) &&
+                 (reply->minor_version >= XCB_RANDR_MINOR_VERSION))
+               _randr_avail = EINA_TRUE;
+
+             _randr_version =
+               ((reply->major_version << 16) | reply->minor_version);
+
+             free(reply);
+          }
+
+        if (_randr_avail)
+          _ecore_xcb_event_randr = ext_reply->first_event;
      }
-#endif /* ECORE_XCB_RANDR */
+#endif
 }
 
-/**
- * Return whether the X server supports the RandR Extension.
- * @return 1 if the X RandR Extension is available, 0 otherwise.
- *
- * Return 1 if the X server supports the RandR Extension version 1.1,
- * 0 otherwise.
- * @ingroup Ecore_X_RandR_Group
- */
-EAPI int
-ecore_x_randr_query(void)
-{
+static Eina_Bool
 #ifdef ECORE_XCB_RANDR
-   return _randr_available;
+_ecore_xcb_randr_root_validate(Ecore_X_Window root)
 #else
-   return 0;
-#endif /* ECORE_XCB_RANDR */
-}
+_ecore_xcb_randr_root_validate(Ecore_X_Window root __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Randr_Screen scr = -1;
+# define RANDR_VALIDATE_ROOT(screen, root) \
+  ((screen == _ecore_xcb_randr_root_to_screen(root)) != -1)
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_RANDR
+   if ((root) && RANDR_VALIDATE_ROOT(scr, root))
+     return EINA_TRUE;
+#endif
 
+   return EINA_FALSE;
+}
 
-static Ecore_X_Window
-_xcb_randr_root_to_screen(Ecore_X_Window root)
+static int
+_ecore_xcb_randr_root_to_screen(Ecore_X_Window root)
 {
-   xcb_screen_iterator_t iter;
+   int count = 0, num = 0;
 
-   iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
-   for (; iter.rem; xcb_screen_next(&iter))
-     {
-        if (iter.data->root == root)
-          return iter.data->root;
-     }
+   CHECK_XCB_CONN;
+
+   count = xcb_setup_roots_length(xcb_get_setup(_ecore_xcb_conn));
+   for (num = 0; num < count; num++)
+     if (_ecore_xcb_window_root_of_screen_get(num) == root)
+       return num;
 
-   return XCB_NONE;
+   return -1;
 }
 
-/**
- * Select if the ScreenChangeNotify events  will be sent.
- * @param window The window.
- * @param on     1 to enable, 0 to disable.
- * @return       1 on success, 0 otherwise.
+/* public functions */
+
+/*
+ * @brief Query whether RandR is available or not.
  *
- * If @p on value is @c 1, ScreenChangeNotify events
- * will be sent when the screen configuration changes, either from
- * this protocol extension, or due to detected external screen
- * configuration changes. ScreenChangeNotify may also be sent when
- * this request executes if the screen configuration has changed since
- * the client connected, to avoid race conditions.
- * @ingroup Ecore_X_RandR_Group
+ * @return @c EINA_TRUE if extension is available, @c EINA_FALSE otherwise.
  */
-EAPI int
-ecore_x_randr_events_select(Ecore_X_Window window,
-                            int            on)
+EAPI Eina_Bool
+ecore_x_randr_query(void)
 {
-#ifdef ECORE_XCB_RANDR
-     xcb_randr_select_input(_ecore_xcb_conn, window,
-                            on ? XCB_RANDR_SCREEN_CHANGE_NOTIFY : 0);
-     return 1;
-#else
-   return 0;
-#endif /* ECORE_XCB_RANDR */
+   return _randr_avail;
 }
 
-/**
- * Sends the GetScreenInfo request.
- * @param window Window whose properties are requested.
- * @ingroup Ecore_X_RandR_Group
+/*
+ * @return version of the RandRR extension supported by the server or,
+ * in case RandRR extension is not available, Ecore_X_Randr_Unset (=-1).
+ * bit version information: 31   MAJOR   16 | 15   MINOR   0
  */
-EAPI void
-ecore_x_randr_get_screen_info_prefetch(Ecore_X_Window window)
+EAPI int
+ecore_x_randr_version_get(void)
 {
-   xcb_randr_get_screen_info_cookie_t cookie;
-
-   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn,
-                                                _xcb_randr_root_to_screen(window));
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return _randr_version;
 }
 
-
-/**
- * Gets the reply of the GetScreenInfo request sent by ecore_x_randr_get_screen_info_prefetch().
- * @ingroup Ecore_X_RandR_Group
+/*
+ * @param root window which's primary output will be queried
  */
-EAPI void
-ecore_x_randr_get_screen_info_fetch(void)
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_screen_primary_output_orientations_get(Ecore_X_Window root)
 {
+   int ret = Ecore_X_Randr_None;
+#ifdef ECORE_XCB_RANDR
    xcb_randr_get_screen_info_cookie_t cookie;
    xcb_randr_get_screen_info_reply_t *reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        ret = reply->rotations;
+        free(reply);
+     }
+#endif
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply =xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   return ret;
 }
 
-/**
- * Get the set of rotations and reflections.
- * @param root The window (Unused).
- * @return     The set of rotations and reflections.
- *
- * Get the set of rotations and reflections supported by the screen
- * associated to @p window (passed to
- * ecore_x_randr_get_screen_info_prefetch()).
- *
- * To use this function, you must call before, and in order,
- * ecore_x_randr_get_screen_info_prefetch(), which sends the GetScreenInfo request,
- * then ecore_x_randr_get_screen_info_fetch(), which gets the reply.
- * @ingroup Ecore_X_RandR_Group
+/*
+ * @param root window which's primary output will be queried
+ * @return the current orientation of the root window's screen primary output
  */
-EAPI Ecore_X_Randr_Rotation
-ecore_x_randr_screen_rotations_get(Ecore_X_Window root __UNUSED__)
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_screen_primary_output_orientation_get(Ecore_X_Window root)
 {
+   int ret = Ecore_X_Randr_None;
 #ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_info_cookie_t cookie;
    xcb_randr_get_screen_info_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return reply->rotations;
-#else
-   return 0;
-#endif /* ECORE_XCB_RANDR */
+#ifdef ECORE_XCB_RANDR
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        ret = reply->rotation;
+        free(reply);
+     }
+#endif
+
+   return ret;
 }
 
-/**
- * Get the rotation.
- * @param root The window (Unused).
- * @return     The rotation.
- *
- * Get the rotation supported by the screen
- * associated to @p window (passed to
- * ecore_x_randr_get_screen_info_prefetch()).
+/*
+ * @brief Sets a given screen's primary output's orientation.
  *
- * To use this function, you must call before, and in order,
- * ecore_x_randr_get_screen_info_prefetch(), which sends the GetScreenInfo request,
- * then ecore_x_randr_get_screen_info_fetch(), which gets the reply.
- * @ingroup Ecore_X_RandR_Group
+ * @param root Window which's screen's primary output will be queried.
+ * @param orientation Orientation which should be set for the root window's
+ * screen primary output.
+ * @return @c EINA_TRUE if the primary output's orientation could be
+ * successfully altered.
  */
-EAPI Ecore_X_Randr_Rotation
-ecore_x_randr_screen_rotation_get(Ecore_X_Window root __UNUSED__)
+EAPI Eina_Bool
+ecore_x_randr_screen_primary_output_orientation_set(Ecore_X_Window            root,
+                                                    Ecore_X_Randr_Orientation orientation)
 {
+   int ret = EINA_FALSE;
 #ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_info_cookie_t cookie;
    xcb_randr_get_screen_info_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return reply->rotation;
-#else
-   return 0;
-#endif /* ECORE_XCB_RANDR */
+#ifdef ECORE_XCB_RANDR
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        xcb_randr_set_screen_config_cookie_t scookie;
+        xcb_randr_set_screen_config_reply_t *sreply;
+
+        scookie =
+          xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
+                                                XCB_CURRENT_TIME,
+                                                reply->config_timestamp,
+                                                reply->sizeID, orientation,
+                                                reply->rate);
+        sreply =
+          xcb_randr_set_screen_config_reply(_ecore_xcb_conn, scookie, NULL);
+        if (!sreply)
+          ret = EINA_FALSE;
+        else
+          {
+             ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
+               EINA_TRUE : EINA_FALSE;
+             free(sreply);
+          }
+        free(reply);
+     }
+#endif
+
+   return ret;
 }
 
-/**
- * Get the frame buffer sizes.
- * @param root The window (Unused).
- * @param num  The number of sizes.
- * @return     The sizes.
- *
- * Get the list of possible frame buffer sizes (at the normal
- * orientation supported by the screen associated to @p window (passed
- * to ecore_x_randr_get_screen_info_prefetch()). Each size indicates
- * both the linear physical size of the screen and the pixel size.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_randr_get_screen_info_prefetch(), which sends the GetScreenInfo request,
- * then ecore_x_randr_get_screen_info_fetch(), which gets the reply.
- * @ingroup Ecore_X_RandR_Group
+/*
+ * @brief gets a screen's primary output's possible sizes
+ * @param root window which's primary output will be queried
+ * @param num number of sizes reported as supported by the screen's primary output
+ * @return an array of sizes reported as supported by the screen's primary output or - if query failed - NULL
  */
-EAPI Ecore_X_Screen_Size *
-ecore_x_randr_screen_sizes_get(Ecore_X_Window root __UNUSED__,
-                               int           *num)
+EAPI Ecore_X_Randr_Screen_Size_MM *
+ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root,
+                                              int           *num)
 {
 #ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_info_cookie_t cookie;
    xcb_randr_get_screen_info_reply_t *reply;
-   xcb_randr_screen_size_t           *sizes;
-   Ecore_X_Screen_Size               *ret;
-   int                                n;
-   int                                i;
+   Ecore_X_Randr_Screen_Size_MM *ret = NULL;
+#endif
 
-   if (num) *num = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return NULL;
+#ifdef ECORE_XCB_RANDR
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        int len = 0, i = 0;
+        xcb_randr_screen_size_t *sizes;
 
-   n = xcb_randr_get_screen_info_sizes_length(reply);
-   ret = calloc(n, sizeof(Ecore_X_Screen_Size));
-   if (!ret) return NULL;
+        len = xcb_randr_get_screen_info_sizes_length(reply);
+        sizes = xcb_randr_get_screen_info_sizes(reply);
+        if ((!sizes) || (len <= 0))
+          {
+             free(reply);
+             return NULL;
+          }
+        if (num) *num = len;
+        ret = calloc(len, sizeof(Ecore_X_Randr_Screen_Size_MM));
+        if (!ret)
+          {
+             free(reply);
+             return NULL;
+          }
+        for (i = 0; i < len; i++)
+          {
+             ret[i].width = sizes[i].width;
+             ret[i].height = sizes[i].height;
+             ret[i].width_mm = sizes[i].mwidth;
+             ret[i].height_mm = sizes[i].mheight;
+          }
 
-   if (num) *num = n;
-   sizes = xcb_randr_get_screen_info_sizes(reply);
-   for (i = 0; i < n; i++)
-     {
-        ret[i].width = sizes[i].width;
-        ret[i].height = sizes[i].height;
+        free(reply);
      }
 
    return ret;
 #else
-   if (num) *num = 0;
    return NULL;
-#endif /* ECORE_XCB_RANDR */
+#endif
 }
 
-/**
- * Get the current frame buffer size.
- * @param root The window (Unused).
- * @return     The active size.
- *
- * Get the active frame buffer size supported by the screen associated
- * to @p window (passed to
- * ecore_x_randr_get_screen_info_prefetch()).
- *
- * To use this function, you must call before, and in order,
- * ecore_x_randr_get_screen_info_prefetch(), which sends the GetScreenInfo request,
- * then ecore_x_randr_get_screen_info_fetch(), which gets the reply.
- * @ingroup Ecore_X_RandR_Group
+/*
+ * @brief get the current set size of a given screen's primary output
+ * @param root window which's primary output will be queried
+ * @param w the current size's width
+ * @param h the current size's height
+ * @param w_mm the current size's width in mm
+ * @param h_mm the current size's height in mm
+ * @param size_index of current set size to be used with ecore_x_randr_primary_output_size_set()
  */
-EAPI Ecore_X_Screen_Size
-ecore_x_randr_current_screen_size_get(Ecore_X_Window root __UNUSED__)
+EAPI void
+ecore_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root,
+                                                     int           *w,
+                                                     int           *h,
+                                                     int           *w_mm,
+                                                     int           *h_mm,
+                                                     int           *size_index)
 {
-   Ecore_X_Screen_Size ret = { -1, -1 };
 #ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_info_cookie_t cookie;
    xcb_randr_get_screen_info_reply_t *reply;
-   xcb_randr_screen_size_t           *sizes;
-   uint16_t                           size_index;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return ret;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   size_index = reply->sizeID;
-   sizes = xcb_randr_get_screen_info_sizes(reply);
-   if (size_index < reply->nSizes)
+#ifdef ECORE_XCB_RANDR
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
      {
-        ret.width = sizes[size_index].mwidth;
-        ret.height = sizes[size_index].mheight;
-     }
-#endif /* ECORE_XCB_RANDR */
+        int len = 0, idx = 0;
+        xcb_randr_screen_size_t *sizes;
 
-   return ret;
+        len = xcb_randr_get_screen_info_sizes_length(reply);
+        sizes = xcb_randr_get_screen_info_sizes(reply);
+        if ((!sizes) || (len <= 0))
+          {
+             free(reply);
+             return;
+          }
+        idx = reply->sizeID;
+        if ((idx < len) && (idx >= 0))
+          {
+             if (w) *w = sizes[idx].width;
+             if (h) *h = sizes[idx].height;
+             if (w_mm) *w_mm = sizes[idx].mwidth;
+             if (h_mm) *h_mm = sizes[idx].mheight;
+             if (size_index) *size_index = idx;
+          }
+
+        free(reply);
+     }
+#endif
 }
 
-/**
- * Get the current refresh rate.
- * @param root The window (Unused).
- * @return     The current refresh rate.
- *
- * Get the current refresh rate supported by the screen associated
- * to @p window (passed to
- * ecore_x_randr_get_screen_info_prefetch()).
+/*
+ * @brief Sets a given screen's primary output size, but disables all other
+ * outputs at the same time.
  *
- * To use this function, you must call before, and in order,
- * ecore_x_randr_get_screen_info_prefetch(), which sends the GetScreenInfo request,
- * then ecore_x_randr_get_screen_info_fetch(), which gets the reply.
- * @ingroup Ecore_X_RandR_Group
+ * @param root Window which's primary output will be queried.
+ * @param size_index Within the list of sizes reported as supported by the root
+ * window's screen primary output.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure due to e.g.
+ * invalid times.
  */
-EAPI Ecore_X_Screen_Refresh_Rate
-ecore_x_randr_current_screen_refresh_rate_get(Ecore_X_Window root __UNUSED__)
+EAPI Eina_Bool
+ecore_x_randr_screen_primary_output_size_set(Ecore_X_Window root,
+                                             int            size_index)
 {
-   Ecore_X_Screen_Refresh_Rate        ret = { -1 };
+   Eina_Bool ret = EINA_FALSE;
 #ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_info_cookie_t cookie;
    xcb_randr_get_screen_info_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return ret;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   ret.rate = reply->rate;
-#endif /* ECORE_XCB_RANDR */
+#ifdef ECORE_XCB_RANDR
+   if (!((size_index >= 0) && (_ecore_xcb_randr_root_validate(root))))
+     return EINA_FALSE;
+
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        int len = 0;
+
+        len = xcb_randr_get_screen_info_sizes_length(reply);
+        if (len <= 0)
+          {
+             free(reply);
+             return EINA_FALSE;
+          }
+        if ((size_index < len) && (size_index >= 0))
+          {
+             xcb_randr_set_screen_config_cookie_t scookie;
+             xcb_randr_set_screen_config_reply_t *sreply;
+
+             scookie =
+               xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
+                                                     XCB_CURRENT_TIME,
+                                                     reply->config_timestamp,
+                                                     size_index,
+                                                     reply->rotation,
+                                                     reply->rate);
+             sreply =
+               xcb_randr_set_screen_config_reply(_ecore_xcb_conn,
+                                                 scookie, NULL);
+             if (!sreply)
+               ret = EINA_FALSE;
+             else
+               {
+                  ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
+                    EINA_TRUE : EINA_FALSE;
+                  free(sreply);
+               }
+          }
 
+        free(reply);
+     }
+#endif
    return ret;
 }
 
-/**
- * Get the refresh rates.
- * @param root The window (Unused).
- * @param num  The number of refresh rates.
- * @return     The refresh rates.
- *
- * Get the list of refresh rates for each size supported by the screen
- * associated to @p window (passed to
- * ecore_x_randr_get_screen_info_prefetch()). Each element
- * of 'sizes' has a corresponding element in 'refresh'. An empty list
- * indicates no known rates, or a device for which refresh is not
- * relevant.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_randr_get_screen_info_prefetch(), which sends the GetScreenInfo request,
- * then ecore_x_randr_get_screen_info_fetch(), which gets the reply.
- * @ingroup Ecore_X_RandR_Group
+/*
+ * @param root window which's primary output will be queried
+ * @return currently used refresh rate or - if request failed or RandRR is not available - 0.0
  */
-EAPI Ecore_X_Screen_Refresh_Rate *
-ecore_x_randr_screen_refresh_rates_get(Ecore_X_Window root __UNUSED__,
-                                       int            size_id __UNUSED__,
-                                       int           *num)
+EAPI Ecore_X_Randr_Refresh_Rate
+ecore_x_randr_screen_primary_output_current_refresh_rate_get(Ecore_X_Window root)
 {
 #ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_info_cookie_t cookie;
    xcb_randr_get_screen_info_reply_t *reply;
-   Ecore_X_Screen_Refresh_Rate       *ret;
-   Ecore_X_Screen_Refresh_Rate       *tmp;
-   xcb_randr_refresh_rates_iterator_t iter;
-   uint16_t                           n;
+   Ecore_X_Randr_Refresh_Rate ret = 0.0;
+#endif
 
-   if (num) *num = 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return NULL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   n = reply->nSizes;
-   ret = calloc(n, sizeof(Ecore_X_Screen_Refresh_Rate));
-   if (!ret)
-     return NULL;
-
-   if (num) *num = n;
+#ifdef ECORE_XCB_RANDR
+   if (!_ecore_xcb_randr_root_validate(root)) return ret;
 
-   /* FIXME: maybe there's a missing function in xcb randr implementation */
-   iter = xcb_randr_get_screen_info_rates_iterator(reply);
-   tmp = ret;
-   for (; iter.rem; xcb_randr_refresh_rates_next(&iter), tmp++)
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
      {
-       tmp->rate = iter.data->nRates;;
+        ret = reply->rate;
+        free(reply);
      }
 
    return ret;
 #else
-   if (num) *num = 0;
-   return NULL;
-#endif /* ECORE_XCB_RANDR */
+   return 0.0;
+#endif
 }
 
-/* FIXME: round trip. Should we remove it ? */
-
-/**
- * Set the screen rotation.
- * @param root The root window.
- * @param rot  The rotation.
- *
- * Set the rotation of the screen associated to @p root.
- *
- * Note that that function is blocking.
- * @ingroup Ecore_X_RandR_Group
+/*
+ * @param root window which's primary output will be queried
+ * @param size_index referencing the size to query valid refresh rates for
+ * @return currently used refresh rate or - if request failed or RandRR is not available - NULL
  */
-EAPI void
-ecore_x_randr_screen_rotation_set(Ecore_X_Window         root,
-                                  Ecore_X_Randr_Rotation rot)
+EAPI Ecore_X_Randr_Refresh_Rate *
+ecore_x_randr_screen_primary_output_refresh_rates_get(Ecore_X_Window root,
+                                                      int            size_index,
+                                                      int           *num)
 {
 #ifdef ECORE_XCB_RANDR
-   xcb_randr_set_screen_config_cookie_t cookie;
-   xcb_randr_set_screen_config_reply_t *reply_config;
-   xcb_randr_get_screen_info_reply_t   *reply;
+   xcb_randr_get_screen_info_cookie_t cookie;
+   xcb_randr_get_screen_info_reply_t *reply;
+   Ecore_X_Randr_Refresh_Rate *ret = NULL;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
-                                                  XCB_CURRENT_TIME,
-                                                  reply->config_timestamp,
-                                                  reply->sizeID,
-                                                  rot,
-                                                  0);
-   reply_config = xcb_randr_set_screen_config_reply(_ecore_xcb_conn, cookie, NULL);
-   if (reply_config)
-     free(reply_config);
-#endif /* ECORE_XCB_RANDR */
-}
+#ifdef ECORE_XCB_RANDR
+   if (!_ecore_xcb_randr_root_validate(root)) return ret;
+
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        int len = 0;
 
-/* FIXME: round trip. Should we remove it ? */
+        len = xcb_randr_get_screen_info_rates_length(reply);
+        if (num) *num = len;
 
-/**
- * Set the screen size.
- * @param root The root window.
- * @param size The size.
- *
- * Set the size of the screen associated to @p root.
+        ret = malloc(sizeof(Ecore_X_Randr_Refresh_Rate) * len);
+        if (ret)
+          {
+             xcb_randr_refresh_rates_iterator_t iter;
+             int i = 0;
+
+             iter = xcb_randr_get_screen_info_rates_iterator(reply);
+             while (i++ < size_index)
+               xcb_randr_refresh_rates_next(&iter);
+
+             memcpy(ret, xcb_randr_refresh_rates_rates(iter.data),
+                    sizeof(Ecore_X_Randr_Refresh_Rate) * len);
+          }
+        free(reply);
+     }
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+/*
+ * @brief Sets the current primary output's refresh rate.
  *
- * Note that that function is blocking.
- * @ingroup Ecore_X_RandR_Group
+ * @param root Window which's primary output will be queried.
+ * @param size_index Referencing the size to be set.
+ * @param rate The refresh rate to be set.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
  */
-EAPI int
-ecore_x_randr_screen_size_set(Ecore_X_Window      root,
-                              Ecore_X_Screen_Size size)
+EAPI Eina_Bool
+ecore_x_randr_screen_primary_output_refresh_rate_set(Ecore_X_Window             root,
+                                                     int                        size_index,
+                                                     Ecore_X_Randr_Refresh_Rate rate)
 {
+   Eina_Bool ret = EINA_FALSE;
 #ifdef ECORE_XCB_RANDR
-   xcb_randr_set_screen_config_cookie_t cookie;
-   xcb_randr_set_screen_config_reply_t *reply_config;
-   xcb_randr_get_screen_info_reply_t   *reply;
-   xcb_randr_screen_size_iterator_t     iter;
-   int                                  size_index = -1;
-   int                                  i;
+   xcb_randr_get_screen_info_cookie_t cookie;
+   xcb_randr_get_screen_info_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   if (_randr_version < RANDR_1_1) return EINA_FALSE;
 
-   iter = xcb_randr_get_screen_info_sizes_iterator(reply);
-   for (i = 0; iter.rem; xcb_randr_screen_size_next(&iter), i++)
+   cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
      {
-        if ((iter.data->width = size.width) &&
-            (iter.data->height = size.height) &&
-            (iter.data->mwidth = size.width) &&
-            (iter.data->mheight = size.height))
+        xcb_randr_set_screen_config_cookie_t scookie;
+        xcb_randr_set_screen_config_reply_t *sreply;
+
+        scookie =
+          xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
+                                                XCB_CURRENT_TIME,
+                                                reply->config_timestamp,
+                                                size_index,
+                                                reply->rotation, rate);
+        sreply =
+          xcb_randr_set_screen_config_reply(_ecore_xcb_conn,
+                                            scookie, NULL);
+        if (!sreply)
+          ret = EINA_FALSE;
+        else
           {
-            size_index = i;
-            break;
+             ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
+               EINA_TRUE : EINA_FALSE;
+             free(sreply);
           }
+        free(reply);
      }
-   if (size_index == -1) return 0;
+#endif
+
+   return ret;
+}
+
+/*
+ * @brief Free detailed mode information. The pointer handed in will be set to
+ * @c NULL after freeing the memory.
+ *
+ * @param mode_info The mode information that should be freed.
+ */
+EAPI void
+ecore_x_randr_mode_info_free(Ecore_X_Randr_Mode_Info *mode_info)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
-                                                  XCB_CURRENT_TIME,
-                                                  reply->config_timestamp,
-                                                  size_index,
-                                                  XCB_RANDR_ROTATION_ROTATE_0,
-                                                  0);
-   reply_config = xcb_randr_set_screen_config_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply_config)
-     return 0;
+   RANDR_CHECK_1_2_RET();
 
-   free(reply_config);
+   if (!mode_info) return;
 
-   return 1;
-#else
-   return 0;
-#endif /* ECORE_XCB_RANDR */
+   if (mode_info->name) free(mode_info->name);
+   free(mode_info);
+   mode_info = NULL;
 }
 
-/* FIXME: round trip. Should we remove it ? */
+/*
+ * @param root window which's screen should be queried
+ * @return Ecore_X_Randr_Ouptut_Id or - if query failed or none is set - Ecore_X_Randr_None
+ */
+EAPI Ecore_X_Randr_Output
+ecore_x_randr_primary_output_get(Ecore_X_Window root)
+{
+   Ecore_X_Randr_Output ret = Ecore_X_Randr_None;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_output_primary_cookie_t cookie;
+   xcb_randr_get_output_primary_reply_t *reply;
+#endif
 
-/**
- * Set the screen refresh rate.
- * @param root The root window.
- * @param size The size.
- * @param rate The refresh rate.
- *
- * Set the size and the refresh rate of the screen associated to
- * @p root.
- *
- * Note that that function is blocking.
- * @ingroup Ecore_X_RandR_Group
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_3_RET(Ecore_X_Randr_None);
+
+   if (!_ecore_xcb_randr_root_validate(root))
+     return Ecore_X_Randr_None;
+
+   cookie = xcb_randr_get_output_primary_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_output_primary_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        ret = reply->output;
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+/*
+ * @param root window which's screen should be queried
+ * @param output that should be set as given root window's screen primary output
  */
-EAPI int
-ecore_x_randr_screen_refresh_rate_set(Ecore_X_Window              root,
-                                      Ecore_X_Screen_Size         size,
-                                      Ecore_X_Screen_Refresh_Rate rate)
+EAPI void
+ecore_x_randr_primary_output_set(Ecore_X_Window       root,
+                                 Ecore_X_Randr_Output output)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
 #ifdef ECORE_XCB_RANDR
-   xcb_randr_set_screen_config_cookie_t cookie;
-   xcb_randr_set_screen_config_reply_t *reply_config;
-   xcb_randr_get_screen_info_reply_t   *reply;
-   xcb_randr_screen_size_iterator_t     iter;
-   int                                  size_index = -1;
-   int                                  i;
+   RANDR_CHECK_1_3_RET();
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return 0;
+   if ((output) && (_ecore_xcb_randr_root_validate(root)))
+     xcb_randr_set_output_primary(_ecore_xcb_conn, root, output);
+#endif
+}
+
+EAPI Ecore_X_Randr_Mode *
+ecore_x_randr_output_modes_get(Ecore_X_Window       root,
+                               Ecore_X_Randr_Output output,
+                               int                 *num,
+                               int                 *npreferred)
+{
+   Ecore_X_Randr_Mode *modes = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
 
-   iter = xcb_randr_get_screen_info_sizes_iterator(reply);
-   for (i = 0; iter.rem; xcb_randr_screen_size_next(&iter), i++)
+   if (_randr_version >= RANDR_1_3)
      {
-        if ((iter.data->width = size.width) &&
-            (iter.data->height = size.height) &&
-            (iter.data->mwidth = size.width) &&
-            (iter.data->mheight = size.height))
-          {
-            size_index = i;
-            break;
-          }
+        modes =
+          _ecore_xcb_randr_13_output_modes_get(root, output, num, npreferred);
+     }
+   else if (_randr_version == RANDR_1_2)
+     {
+        modes =
+          _ecore_xcb_randr_12_output_modes_get(root, output, num, npreferred);
      }
-   if (size_index == -1) return 0;
+#endif
 
-   cookie = xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
-                                                  XCB_CURRENT_TIME,
-                                                  reply->config_timestamp,
-                                                  size_index,
-                                                  XCB_RANDR_ROTATION_ROTATE_0,
-                                                  rate.rate);
-   reply_config = xcb_randr_set_screen_config_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!reply_config)
-     return 0;
+   return modes;
+}
 
-   free(reply_config);
+EAPI Eina_Bool 
+ecore_x_randr_output_mode_add(Ecore_X_Randr_Output output, Ecore_X_Randr_Mode mode)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return 1;
-#else
-   return 0;
-#endif /* ECORE_XCB_RANDR */
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if ((output == Ecore_X_Randr_None) || (mode == Ecore_X_Randr_None))
+     return EINA_FALSE;
+
+   xcb_randr_add_output_mode(_ecore_xcb_conn, output, mode);
+   return EINA_TRUE;
+#endif
+   return EINA_FALSE;
 }
+
+/*
+ * @brief get detailed information for a given mode id
+ * @param root window which's screen's ressources are queried
+ * @param mode the XID which identifies the mode of interest
+ * @return mode's detailed information
+ */
+EAPI Ecore_X_Randr_Mode_Info *
+ecore_x_randr_mode_info_get(Ecore_X_Window     root,
+                            Ecore_X_Randr_Mode mode)
+{
+   Ecore_X_Randr_Mode_Info *ret = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (!_ecore_xcb_randr_root_validate(root)) return NULL;
+
+   if (_randr_version >= RANDR_1_3)
+     ret = _ecore_xcb_randr_13_mode_info_get(root, mode);
+   else if (_randr_version == RANDR_1_2)
+     ret = _ecore_xcb_randr_12_mode_info_get(root, mode);
+#endif
+   return ret;
+}
+
+/*
+ * @brief add a mode to a display
+ * @param root window to which's screen's ressources are added
+ * @param mode_info
+ * @return Ecore_X_Randr_Mode of the added mode. Ecore_X_Randr_None if mode
+ * adding failed.
+ * @since 1.2.0
+ */
+EAPI Ecore_X_Randr_Mode 
+ecore_x_randr_mode_info_add(Ecore_X_Window root, Ecore_X_Randr_Mode_Info *mode_info)
+{
+   Ecore_X_Randr_Mode mode = Ecore_X_Randr_None;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_create_mode_cookie_t cookie;
+   xcb_randr_create_mode_reply_t *reply;
+   xcb_randr_mode_info_t info;
+   int namelen = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if (!mode_info) return Ecore_X_Randr_None;
+   if (!_ecore_xcb_randr_root_validate(root)) return Ecore_X_Randr_None;
+
+   namelen = strlen(mode_info->name);
+
+   memset(&info, 0, sizeof(info));
+   info.width = mode_info->width;
+   info.height = mode_info->height;
+   info.dot_clock = mode_info->dotClock;
+   info.hsync_start = mode_info->hSyncStart;
+   info.hsync_end = mode_info->hSyncEnd;
+   info.htotal = mode_info->hTotal;
+   info.hskew = mode_info->hSkew;
+   info.vsync_start = mode_info->vSyncStart;
+   info.vsync_end = mode_info->vSyncEnd;
+   info.vtotal = mode_info->vTotal;
+   info.mode_flags = mode_info->modeFlags;
+   info.name_len = namelen;
+
+   cookie = 
+     xcb_randr_create_mode_unchecked(_ecore_xcb_conn, root, info, 
+                                     namelen, mode_info->name);
+   reply = xcb_randr_create_mode_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        mode = mode_info->xid;
+        free(reply);
+     }
+#endif
+   return mode;
+}
+
+/*
+ * @brief get detailed information for all modes related to a root window's screen
+ * @param root window which's screen's ressources are queried
+ * @param num number of modes returned
+ * @return modes' information
+ */
+EAPI Ecore_X_Randr_Mode_Info **
+ecore_x_randr_modes_info_get(Ecore_X_Window root,
+                             int           *num)
+{
+   Ecore_X_Randr_Mode_Info **ret = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (num) *num = 0;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (!_ecore_xcb_randr_root_validate(root)) return NULL;
+
+   if (_randr_version >= RANDR_1_3)
+     ret = _ecore_xcb_randr_13_modes_info_get(root, num);
+   else if (_randr_version == RANDR_1_2)
+     ret = _ecore_xcb_randr_12_modes_info_get(root, num);
+#endif
+   return ret;
+}
+
+/**
+ * @brief Gets the width and hight of a given mode.
+ *
+ * @param root Window which's screen's ressources are queried.
+ * @param mode The mode which's size is to be looked up.
+ * @param w Width of given mode in px.
+ * @param h Height of given mode in px.
+ */
+EAPI void
+ecore_x_randr_mode_size_get(Ecore_X_Window     root,
+                            Ecore_X_Randr_Mode mode,
+                            int               *w,
+                            int               *h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET();
+
+   if (mode == Ecore_X_Randr_None) return;
+
+   if (_randr_version >= RANDR_1_3)
+     _ecore_xcb_randr_13_mode_size_get(root, mode, w, h);
+   else if (_randr_version == RANDR_1_2)
+     _ecore_xcb_randr_12_mode_size_get(root, mode, w, h);
+#endif
+}
+
+/**
+ * @brief Gets the EDID information of an attached output if available.
+ * Note that this information is not to be compared using ordinary string
+ * comparison functions, since it includes 0-bytes.
+ *
+ * @param root Window this information should be queried from.
+ * @param output The XID of the output.
+ * @param length Length of the byte-array. If @c NULL, request will fail.
+ * @return EDID information of the output.
+ */
+EAPI unsigned char *
+ecore_x_randr_output_edid_get(Ecore_X_Window       root,
+                              Ecore_X_Randr_Output output,
+                              unsigned long       *length)
+{
+   unsigned char *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_output_property_cookie_t cookie;
+   xcb_randr_get_output_property_reply_t *reply;
+   Ecore_X_Atom atom;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if ((!length) || (!_ecore_xcb_randr_output_validate(root, output)))
+     return NULL;
+
+   atom = ecore_x_atom_get("EDID");
+   cookie =
+     xcb_randr_get_output_property_unchecked(_ecore_xcb_conn, output, atom,
+                                             XCB_GET_PROPERTY_TYPE_ANY,
+                                             0, 100, 0, 0);
+   reply =
+     xcb_randr_get_output_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        if ((reply->type == XCB_ATOM_INTEGER) && (reply->format == 8))
+          {
+             if (length) *length = reply->num_items;
+             if ((ret = malloc(reply->num_items * sizeof(unsigned char))))
+               {
+                  memcpy(ret, xcb_randr_get_output_property_data(reply),
+                         (reply->num_items * sizeof(unsigned char)));
+               }
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+/**
+ * @brief Gets the outputs which might be used simultaneously on the same CRTC.
+ *
+ * @param root Window that this information should be queried for.
+ * @param output The output which's clones we concern.
+ * @param num Number of possible clones.
+ * @return The existing outputs, @c NULL otherwise.
+ */
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_output_clones_get(Ecore_X_Window       root,
+                                Ecore_X_Randr_Output output,
+                                int                 *num)
+{
+   Ecore_X_Randr_Output *outputs = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (output == Ecore_X_Randr_None) return NULL;
+
+   if (_randr_version >= RANDR_1_3)
+     outputs = _ecore_xcb_randr_13_output_clones_get(root, output, num);
+   else if (_randr_version == RANDR_1_2)
+     outputs = _ecore_xcb_randr_12_output_clones_get(root, output, num);
+#endif
+   return outputs;
+}
+
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_output_possible_crtcs_get(Ecore_X_Window       root,
+                                        Ecore_X_Randr_Output output,
+                                        int                 *num)
+{
+   Ecore_X_Randr_Crtc *crtcs = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (output == Ecore_X_Randr_None) return NULL;
+
+   if (_randr_version >= RANDR_1_3)
+     crtcs = _ecore_xcb_randr_13_output_possible_crtcs_get(root, output, num);
+   else if (_randr_version == RANDR_1_2)
+     crtcs = _ecore_xcb_randr_12_output_possible_crtcs_get(root, output, num);
+#endif
+   return crtcs;
+}
+
+/**
+ * @brief gets the given output's name as reported by X
+ * @param root the window which's screen will be queried
+ * @param output The output name given to be reported.
+ * @param len length of returned c-string.
+ * @return name of the output as reported by X
+ */
+EAPI char *
+ecore_x_randr_output_name_get(Ecore_X_Window       root,
+                              Ecore_X_Randr_Output output,
+                              int                 *len)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (output == Ecore_X_Randr_None) return NULL;
+
+   if (_randr_version >= RANDR_1_3)
+     return _ecore_xcb_randr_13_output_name_get(root, output, len);
+   else if (_randr_version == RANDR_1_2)
+     return _ecore_xcb_randr_12_output_name_get(root, output, len);
+#endif
+
+   return NULL;
+}
+
+EAPI Ecore_X_Randr_Connection_Status
+ecore_x_randr_output_connection_status_get(Ecore_X_Window       root,
+                                           Ecore_X_Randr_Output output)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN);
+
+   if (output == Ecore_X_Randr_None)
+     return ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
+
+   if (_randr_version >= RANDR_1_3)
+     return _ecore_xcb_randr_13_output_connection_status_get(root, output);
+   else if (_randr_version == RANDR_1_2)
+     return _ecore_xcb_randr_12_output_connection_status_get(root, output);
+#endif
+
+   return ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
+}
+
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_outputs_get(Ecore_X_Window root,
+                          int           *num)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (_randr_version >= RANDR_1_3)
+     return _ecore_xcb_randr_13_outputs_get(root, num);
+   else if (_randr_version == RANDR_1_2)
+     return _ecore_xcb_randr_12_outputs_get(root, num);
+#endif
+
+   return NULL;
+}
+
+EAPI Ecore_X_Randr_Crtc
+ecore_x_randr_output_crtc_get(Ecore_X_Window       root,
+                              Ecore_X_Randr_Output output)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
+
+   if (output == Ecore_X_Randr_None) return Ecore_X_Randr_None;
+
+   if (_randr_version >= RANDR_1_3)
+     return _ecore_xcb_randr_13_output_crtc_get(root, output);
+   else if (_randr_version == RANDR_1_2)
+     return _ecore_xcb_randr_12_output_crtc_get(root, output);
+#endif
+
+   return Ecore_X_Randr_None;
+}
+
+EAPI void 
+ecore_x_randr_output_size_mm_get(Ecore_X_Window root, Ecore_X_Randr_Output output, int *w_mm, int *h_mm)
+{
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_output_info_cookie_t ocookie;
+   xcb_randr_get_output_info_reply_t *oreply;
+   xcb_timestamp_t timestamp = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (w_mm) *w_mm = 0;
+   if (h_mm) *h_mm = 0;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET();
+
+   if ((output != Ecore_X_Randr_None) && (_randr_version >= RANDR_1_3))
+     {
+        xcb_randr_get_screen_resources_current_reply_t *reply;
+
+        reply = _ecore_xcb_randr_13_get_resources(root);
+        timestamp = reply->config_timestamp;
+        free(reply);
+     }
+   else if ((output != Ecore_X_Randr_None) && (_randr_version == RANDR_1_2))
+     {
+        xcb_randr_get_screen_resources_reply_t *reply;
+
+        reply = _ecore_xcb_randr_12_get_resources(root);
+        timestamp = reply->config_timestamp;
+        free(reply);
+     }
+
+   ocookie =
+     xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output, timestamp);
+   oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        if (w_mm) *w_mm = oreply->mm_width;
+        if (h_mm) *h_mm = oreply->mm_height;
+        free(oreply);
+     }
+#endif
+}
+
+/**
+ * @brief Sets the demanded parameters for a given CRTC. Note that the CRTC is
+ * auto enabled in it's preferred mode, when it was disabled before.
+ *
+ * @param root The root window which's default display will be queried.
+ * @param crtc The CRTC which's configuration should be altered.
+ * @param outputs An array of outputs, that should display this CRTC's content.
+ * @param noutputs Number of outputs in the array of outputs. If set to
+ * Ecore_X_Randr_Unset, current outputs and number of outputs will be used. If
+ * set to Ecore_X_Randr_None, CRTC will be disabled.
+ * @param x New x coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current x
+ * coordinate will be assumed.
+ * @param y New y coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current y
+ * coordinate will be assumed.
+ * @param mode The new mode to be set. If Ecore_X_Randr_None is passed, the
+ * CRTC will be disabled. If Ecore_X_Randr_Unset is passed, the current mode is
+ * assumed.
+ * @param orientation The new orientation to be set. If Ecore_X_Randr_Unset is
+ * used, the current mode is assumed.
+ * @return @c EINA_TRUE if the configuration alteration was successful,
+ * @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_settings_set(Ecore_X_Window            root,
+                                Ecore_X_Randr_Crtc        crtc,
+                                Ecore_X_Randr_Output     *outputs,
+                                int                       noutputs,
+                                int                       x,
+                                int                       y,
+                                Ecore_X_Randr_Mode        mode,
+                                Ecore_X_Randr_Orientation orientation)
+{
+   Eina_Bool ret = EINA_FALSE;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_cookie_t ccookie;
+   xcb_randr_get_crtc_info_reply_t *creply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ccookie =
+     xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
+   creply =
+     xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ccookie, NULL);
+   if (creply)
+     {
+        xcb_randr_set_crtc_config_cookie_t scookie;
+        xcb_randr_set_crtc_config_reply_t *sreply;
+
+        if ((mode == Ecore_X_Randr_None) ||
+            (noutputs == Ecore_X_Randr_None))
+          {
+             outputs = NULL;
+             noutputs = 0;
+          }
+        else if (noutputs == (int)Ecore_X_Randr_Unset)
+          {
+             outputs = xcb_randr_get_crtc_info_outputs(creply);
+             noutputs = creply->num_outputs;
+          }
+        if ((int)mode == Ecore_X_Randr_Unset) mode = creply->mode;
+        if (x < 0) x = creply->x;
+        if (y < 0) y = creply->y;
+        if ((int)orientation == Ecore_X_Randr_Unset)
+          orientation = creply->rotation;
+
+        scookie =
+          xcb_randr_set_crtc_config_unchecked(_ecore_xcb_conn,
+                                              crtc, XCB_CURRENT_TIME, stamp,
+                                              x, y, mode, orientation,
+                                              noutputs, outputs);
+        sreply =
+          xcb_randr_set_crtc_config_reply(_ecore_xcb_conn, scookie, NULL);
+        if (sreply)
+          {
+             ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
+               EINA_TRUE : EINA_FALSE;
+             free(sreply);
+          }
+        free(creply);
+     }
+#endif
+
+   return ret;
+}
+
+/**
+ * @brief Sets a mode for a CRTC and the outputs attached to it.
+ *
+ * @param root The window's screen to be queried
+ * @param crtc The CRTC which shall be set
+ * @param outputs Array of outputs which have to be compatible with the mode. If
+ * @c NULL CRTC will be disabled.
+ * @param noutputs Number of outputs in array to be used. Use
+ * Ecore_X_Randr_Unset (or @c -1) to use currently used outputs.
+ * @param mode XID of the mode to be set. If set to @c 0 the CRTC will be
+ * disabled. If set to @c -1 the call will fail.
+ * @return @c EINA_TRUE if mode setting was successful, @c EINA_FALSE
+ * otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_mode_set(Ecore_X_Window        root,
+                            Ecore_X_Randr_Crtc    crtc,
+                            Ecore_X_Randr_Output *outputs,
+                            int                   noutputs,
+                            Ecore_X_Randr_Mode    mode)
+{
+   Eina_Bool ret = EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if ((int)mode == Ecore_X_Randr_Unset) return ret;
+   ret =
+     ecore_x_randr_crtc_settings_set(root, crtc, outputs, noutputs,
+                                     Ecore_X_Randr_Unset, Ecore_X_Randr_Unset,
+                                     mode, Ecore_X_Randr_Unset);
+#endif
+
+   return ret;
+}
+
+/**
+ * @brief Get the current set mode of a given CRTC
+ * @param root the window's screen to be queried
+ * @param crtc the CRTC which's should be queried
+ * @return currently set mode or - in case parameters are invalid -
+ * Ecore_X_Randr_Unset
+ */
+EAPI Ecore_X_Randr_Mode
+ecore_x_randr_crtc_mode_get(Ecore_X_Window     root,
+                            Ecore_X_Randr_Crtc crtc)
+{
+   Ecore_X_Randr_Mode ret = Ecore_X_Randr_Unset;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_cookie_t ocookie;
+   xcb_randr_get_crtc_info_reply_t *oreply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_Unset);
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ocookie =
+     xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
+   oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        ret = oreply->mode;
+        free(oreply);
+     }
+#endif
+
+   return ret;
+}
+
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_crtc_orientation_get(Ecore_X_Window     root,
+                                   Ecore_X_Randr_Crtc crtc)
+{
+   Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_cookie_t ocookie;
+   xcb_randr_get_crtc_info_reply_t *oreply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ocookie =
+     xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
+   oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        ret = oreply->rotation;
+        free(oreply);
+     }
+#endif
+
+   return ret;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_crtc_orientation_set(Ecore_X_Window            root,
+                                   Ecore_X_Randr_Crtc        crtc,
+                                   Ecore_X_Randr_Orientation orientation)
+{
+   Eina_Bool ret = EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if (orientation != Ecore_X_Randr_None)
+     {
+        ret =
+          ecore_x_randr_crtc_settings_set(root, crtc, NULL,
+                                          Ecore_X_Randr_Unset, Ecore_X_Randr_Unset,
+                                          Ecore_X_Randr_Unset, Ecore_X_Randr_Unset,
+                                          orientation);
+     }
+#endif
+   return ret;
+}
+
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_crtc_orientations_get(Ecore_X_Window     root,
+                                    Ecore_X_Randr_Crtc crtc)
+{
+   Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_cookie_t ocookie;
+   xcb_randr_get_crtc_info_reply_t *oreply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ocookie =
+     xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
+   oreply =
+     xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        ret = oreply->rotations;
+        free(oreply);
+     }
+#endif
+
+   return ret;
+}
+
+/*
+ * @brief get a CRTC's possible outputs.
+ * @param root the root window which's screen will be queried
+ * @param num number of possible outputs referenced by given CRTC
+ */
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_crtc_possible_outputs_get(Ecore_X_Window     root,
+                                        Ecore_X_Randr_Crtc crtc,
+                                        int               *num)
+{
+   Ecore_X_Randr_Output *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_cookie_t ocookie;
+   xcb_randr_get_crtc_info_reply_t *oreply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ocookie =
+     xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
+   oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        if (num) *num = oreply->num_possible_outputs;
+        ret = malloc(sizeof(Ecore_X_Randr_Output) *
+                     oreply->num_possible_outputs);
+        if (ret)
+          {
+             memcpy(ret, xcb_randr_get_crtc_info_possible(oreply),
+                    sizeof(Ecore_X_Randr_Output) *
+                    oreply->num_possible_outputs);
+          }
+        free(oreply);
+     }
+#endif
+
+   return ret;
+}
+
+/*
+ * @brief get all known CRTCs related to a root window's screen
+ * @param root window which's screen's ressources are queried
+ * @param num number of CRTCs returned
+ * @return CRTC IDs
+ */
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_crtcs_get(Ecore_X_Window root,
+                        int           *num)
+{
+   Ecore_X_Randr_Crtc *ret = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (_randr_version >= RANDR_1_3)
+     {
+        xcb_randr_get_screen_resources_current_reply_t *reply;
+
+        reply = _ecore_xcb_randr_13_get_resources(root);
+        if (reply)
+          {
+             if (num) *num = reply->num_crtcs;
+             ret = malloc(sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
+             if (ret)
+               memcpy(ret, xcb_randr_get_screen_resources_current_crtcs(reply),
+                      sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
+             free(reply);
+          }
+     }
+   else if (_randr_version == RANDR_1_2)
+     {
+        xcb_randr_get_screen_resources_reply_t *reply;
+
+        reply = _ecore_xcb_randr_12_get_resources(root);
+        if (reply)
+          {
+             if (num) *num = reply->num_crtcs;
+             ret = malloc(sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
+             if (ret)
+               memcpy(ret, xcb_randr_get_screen_resources_crtcs(reply),
+                      sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
+             free(reply);
+          }
+     }
+#endif
+
+   return ret;
+}
+
+/*
+ * @deprecated bad naming. Use ecore_x_randr_window_crtcs_get instead.
+ * @brief Get the CRTCs, which display a certain window.
+ *
+ * @param window Window the displaying CRTCs shall be found for.
+ * @param num The number of CRTCs displaying the window.
+ * @return Array of CRTCs that display a certain window. @c NULL if no CRTCs
+ * was found that displays the specified window.
+ */
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_current_crtc_get(Ecore_X_Window window,
+                                 int           *num)
+{
+   return ecore_x_randr_window_crtcs_get(window, num);
+}
+
+/*
+ * @brief Get the CRTCs, which display a certain window.
+ *
+ * @param window Window the displaying crtcs shall be found for.
+ * @param num The number of crtcs displaying the window.
+ * @return Array of crtcs that display a certain window. @c NULL if no crtcs
+ * was found that displays the specified window.
+ * @since 1.2.0
+ */
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_window_crtcs_get(Ecore_X_Window window,
+                               int *num)
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Window root;
+   Eina_Rectangle w_geo, c_geo;
+   Ecore_X_Randr_Crtc *crtcs, *ret = NULL;
+   Ecore_X_Randr_Mode mode;
+   int ncrtcs, i, nret = 0;
+   xcb_translate_coordinates_cookie_t cookie;
+   xcb_translate_coordinates_reply_t *trans;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   ecore_x_window_geometry_get(window, &w_geo.x, &w_geo.y, &w_geo.w, &w_geo.h);
+
+   root = ecore_x_window_root_get(window);
+   crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs);
+   if (!crtcs) goto _ecore_x_randr_window_crtcs_get_fail;
+
+   /* now get window RELATIVE to root window - thats what matters. */
+   cookie = xcb_translate_coordinates(_ecore_xcb_conn, window, root, 0, 0);
+   trans = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
+   w_geo.x = trans->dst_x;
+   w_geo.y = trans->dst_y;
+   free(trans);
+
+   ret = calloc(1, ncrtcs * sizeof(Ecore_X_Randr_Crtc));
+   if (!ret)
+     {
+        free(crtcs);
+        goto _ecore_x_randr_window_crtcs_get_fail;
+     }
+   for (i = 0, nret = 0; i < ncrtcs; i++)
+     {
+        /* if crtc is not enabled, don't bother about it any further */
+         mode = ecore_x_randr_crtc_mode_get(root, crtcs[i]);
+         if (mode == Ecore_X_Randr_None) continue;
+
+         ecore_x_randr_crtc_geometry_get(root, crtcs[i], &c_geo.x, &c_geo.y,
+                                         &c_geo.w, &c_geo.h);
+         if (eina_rectangles_intersect(&w_geo, &c_geo))
+           {
+              ret[nret] = crtcs[i];
+              nret++;
+           }
+     }
+   free(crtcs);
+
+   if (num) *num = nret;
+   return ret;
+
+_ecore_x_randr_window_crtcs_get_fail:
+#endif
+   if (num) *num = 0;
+   return NULL;
+}
+
+/*
+ * @brief get a CRTC's outputs.
+ * @param root the root window which's screen will be queried
+ * @param num number of outputs referenced by given CRTC
+ */
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_crtc_outputs_get(Ecore_X_Window     root,
+                               Ecore_X_Randr_Crtc crtc,
+                               int               *num)
+{
+   Ecore_X_Randr_Output *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_cookie_t ocookie;
+   xcb_randr_get_crtc_info_reply_t *oreply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(NULL);
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ocookie =
+     xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
+   oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        if (num) *num = oreply->num_outputs;
+        ret = malloc(sizeof(Ecore_X_Randr_Output) * oreply->num_outputs);
+        if (ret)
+          memcpy(ret, xcb_randr_get_crtc_info_outputs(oreply),
+                 sizeof(Ecore_X_Randr_Output) * oreply->num_outputs);
+        free(oreply);
+     }
+#endif
+
+   return ret;
+}
+
+EAPI void
+ecore_x_randr_crtc_geometry_get(Ecore_X_Window     root,
+                                Ecore_X_Randr_Crtc crtc,
+                                int               *x,
+                                int               *y,
+                                int               *w,
+                                int               *h)
+{
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_cookie_t ocookie;
+   xcb_randr_get_crtc_info_reply_t *oreply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET();
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ocookie =
+     xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
+   oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        if (x) *x = oreply->x;
+        if (y) *y = oreply->y;
+        if (w) *w = oreply->width;
+        if (h) *h = oreply->height;
+        free(oreply);
+     }
+#endif
+}
+
+/**
+ * @brief Sets a CRTC relative to another one.
+ *
+ * @param root The window on which CRTC's position will be set.
+ * @param crtc_r1 The CRTC to be positioned.
+ * @param crtc_r2 The CRTC the position should be relative to.
+ * @param policy The relation between the crtcs.
+ * @param alignment In case CRTCs size differ, aligns CRTC1 accordingly at
+ * CRTC2's borders.
+ * @return @c EINA_TRUE if crtc could be successfully positioned, @c EINA_FALSE
+ * if repositioning failed or if position of new crtc would be out of given
+ * screen's min/max bounds.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_pos_relative_set(Ecore_X_Window                   root,
+                                    Ecore_X_Randr_Crtc               crtc_r1,
+                                    Ecore_X_Randr_Crtc               crtc_r2,
+                                    Ecore_X_Randr_Output_Policy      policy,
+                                    Ecore_X_Randr_Relative_Alignment alignment)
+{
+#ifdef ECORE_XCB_RANDR
+   Eina_Rectangle r1, r2;
+   int w_max = 0, h_max = 0, cw = 0, ch = 0, xn = -1, yn = -1;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if ((ecore_x_randr_crtc_mode_get(root, crtc_r1) == 0) ||
+       (ecore_x_randr_crtc_mode_get(root, crtc_r2) == 0))
+     return EINA_FALSE;
+
+   if ((!_ecore_xcb_randr_crtc_validate(root, crtc_r1) ||
+        (!(crtc_r1 != crtc_r2) && (!_ecore_xcb_randr_crtc_validate(root, crtc_r2)))))
+     return EINA_FALSE;
+
+   ecore_x_randr_crtc_geometry_get(root, crtc_r1, &r1.x, &r1.y, &r1.w, &r1.h);
+   ecore_x_randr_crtc_geometry_get(root, crtc_r2, &r2.x, &r2.y, &r2.w, &r2.h);
+   ecore_x_randr_screen_size_range_get(root, NULL, NULL, &w_max, &h_max);
+   ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
+
+   switch (policy)
+     {
+      case ECORE_X_RANDR_OUTPUT_POLICY_RIGHT:
+        xn = (r2.x + r2.w);
+        if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
+          yn = -1;
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
+          yn = ((int)(((double)r2.h / 2.0) + (double)r2.y - ((double)r1.h / 2.0)));
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
+          yn = ((int)((double)ch / 2.0) - ((double)r1.h / 2.0));
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_LEFT:
+        xn = (r2.x - r1.w);
+        if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
+          yn = -1;
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
+          yn = ((int)(((double)r2.h / 2.0) + (double)r2.y - ((double)r1.h / 2.0)));
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
+          yn = ((int)((double)ch / 2.0) - ((double)r1.h / 2.0));
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_BELOW:
+        yn = (r2.y + r2.h);
+        if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
+          xn = -1;
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
+          xn = ((int)((((double)r2.x + (double)r2.w) / 2.0) - ((double)r1.w / 2.0)));
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
+          xn = ((int)((double)cw / 2.0));
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_ABOVE:
+        yn = (r2.y - r1.h);
+        if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
+          xn = -1;
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
+          xn = ((int)((((double)r2.x + (double)r2.w) / 2.0) - ((double)r1.w / 2.0)));
+        else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
+          xn = ((int)((double)cw / 2.0));
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_CLONE:
+        return ecore_x_randr_crtc_pos_set(root, crtc_r1, r2.x, r2.y);
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_NONE:
+        break;
+      default:
+        return EINA_FALSE;
+     }
+
+   if ((xn == r1.x) && (yn == r1.x)) return EINA_TRUE;
+   if (((yn + r1.h) > h_max) || ((xn + r1.w) > w_max))
+     return EINA_FALSE;
+
+   return ecore_x_randr_crtc_pos_set(root, crtc_r1, xn, yn);
+#endif
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_move_all_crtcs_but(Ecore_X_Window            root,
+                                 const Ecore_X_Randr_Crtc *not_moved,
+                                 int                       num,
+                                 int                       dx,
+                                 int                       dy)
+{
+   Eina_Bool ret = EINA_FALSE;
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Randr_Crtc *crtcs = NULL, *move = NULL;
+   int i = 0, j = 0, k = 0, n = 0, total = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   if ((num <= 0) || (!not_moved) || (!_ecore_xcb_randr_root_validate(root)))
+     return EINA_FALSE;
+
+   crtcs = ecore_x_randr_crtcs_get(root, &total);
+   n = (total - num);
+   move = malloc(sizeof(Ecore_X_Randr_Crtc) * n);
+   if (move)
+     {
+        for (i = 0, k = 0; (i < total) && (k < n); i++)
+          {
+             for (j = 0; j < num; j++)
+               if (crtcs[i] == not_moved[j]) break;
+             if (j == num)
+               move[k++] = crtcs[i];
+          }
+        ret = ecore_x_randr_move_crtcs(root, move, n, dx, dy);
+        free(move);
+        free(crtcs);
+     }
+#endif
+
+   return ret;
+}
+
+EAPI void
+ecore_x_randr_crtc_pos_get(Ecore_X_Window     root,
+                           Ecore_X_Randr_Crtc crtc,
+                           int               *x,
+                           int               *y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET();
+
+   ecore_x_randr_crtc_geometry_get(root, crtc, x, y, NULL, NULL);
+#endif
+}
+
+/*
+ * @brief Sets the position of given CRTC within root window's screen.
+ *
+ * @param root The window's screen to be queried.
+ * @param crtc The CRTC which's position within the mentioned screen is to be
+ * altered.
+ * @param x Position on the x-axis (0 == left) of the screen. if x < 0 current
+ * value will be kept.
+ * @param y Position on the y-ayis (0 == top) of the screen. if y < 0, current
+ * value will be kept.
+ * @return @c EINA_TRUE if position could be successfully be altered.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_pos_set(Ecore_X_Window     root,
+                           Ecore_X_Randr_Crtc crtc,
+                           int                x,
+                           int                y)
+{
+   Eina_Bool ret = EINA_FALSE;
+#ifdef ECORE_XCB_RANDR
+   int w = 0, h = 0, nw = 0, nh = 0;
+   Eina_Rectangle rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   ecore_x_randr_crtc_geometry_get(root, crtc,
+                                   &rect.x, &rect.y, &rect.w, &rect.h);
+   ecore_x_randr_screen_current_size_get(root, &w, &h, NULL, NULL);
+   if (x < 0) x = rect.x;
+   if (y < 0) y = rect.y;
+   if ((x + rect.w) > w)
+     nw = (x + rect.w);
+   if ((y + rect.h) > h)
+     nh = (y + rect.h);
+
+   if ((nw != 0) || (nh != 0))
+     {
+        if (!ecore_x_randr_screen_current_size_set(root, nw, nh, 0, 0))
+          return EINA_FALSE;
+     }
+
+   ret = ecore_x_randr_crtc_settings_set(root, crtc, NULL, -1, x, y, -1, -1);
+#endif
+
+   return ret;
+}
+
+EAPI void
+ecore_x_randr_crtc_size_get(Ecore_X_Window     root,
+                            Ecore_X_Randr_Crtc crtc,
+                            int               *w,
+                            int               *h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET();
+   ecore_x_randr_crtc_geometry_get(root, crtc, NULL, NULL, w, h);
+#endif
+}
+
+EAPI Ecore_X_Randr_Refresh_Rate
+ecore_x_randr_crtc_refresh_rate_get(Ecore_X_Window     root,
+                                    Ecore_X_Randr_Crtc crtc,
+                                    Ecore_X_Randr_Mode mode)
+{
+   Ecore_X_Randr_Refresh_Rate ret = 0.0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(0.0);
+
+   if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return 0.0;
+
+   if (_randr_version >= RANDR_1_3)
+     {
+        xcb_randr_get_screen_resources_current_reply_t *reply;
+
+        reply = _ecore_xcb_randr_13_get_resources(root);
+        if (reply)
+          {
+             xcb_randr_mode_info_iterator_t miter;
+
+             miter =
+               xcb_randr_get_screen_resources_current_modes_iterator(reply);
+             while (miter.rem)
+               {
+                  xcb_randr_mode_info_t *minfo;
+
+                  minfo = miter.data;
+                  if (minfo->id == mode)
+                    {
+                       if ((minfo->htotal) && (minfo->vtotal))
+                         {
+                            ret = ((double)minfo->dot_clock /
+                                   ((double)minfo->htotal *
+                                    (double)minfo->vtotal));
+                         }
+                       break;
+                    }
+                  xcb_randr_mode_info_next(&miter);
+               }
+             free(reply);
+          }
+     }
+   else if (_randr_version == RANDR_1_2)
+     {
+        xcb_randr_get_screen_resources_reply_t *reply;
+
+        reply = _ecore_xcb_randr_12_get_resources(root);
+        if (reply)
+          {
+             xcb_randr_mode_info_iterator_t miter;
+
+             miter = xcb_randr_get_screen_resources_modes_iterator(reply);
+             while (miter.rem)
+               {
+                  xcb_randr_mode_info_t *minfo;
+
+                  minfo = miter.data;
+                  if (minfo->id == mode)
+                    {
+                       if ((minfo->htotal) && (minfo->vtotal))
+                         {
+                            ret = ((double)minfo->dot_clock /
+                                   ((double)minfo->htotal *
+                                    (double)minfo->vtotal));
+                         }
+                       break;
+                    }
+                  xcb_randr_mode_info_next(&miter);
+               }
+             free(reply);
+          }
+     }
+#endif
+   return ret;
+}
+
+/*
+ * @brief Move given CRTCs belonging to the given root window's screen dx/dy
+ * pixels relative to their current position. The screen size will be
+ * automatically adjusted if necessary and possible.
+ *
+ * @param root Window which's screen's resources are used.
+ * @param crtcs List of CRTCs to be moved.
+ * @param ncrtc Number of CRTCs in array.
+ * @param dx Amount of pixels the CRTCs should be moved in x direction.
+ * @param dy Amount of pixels the CRTCs should be moved in y direction.
+ * @return @c EINA_TRUE if all crtcs could be moved successfully.
+ */
+EAPI Eina_Bool
+ecore_x_randr_move_crtcs(Ecore_X_Window            root,
+                         const Ecore_X_Randr_Crtc *crtcs,
+                         int                       num,
+                         int                       dx,
+                         int                       dy)
+{
+   Eina_Bool ret = EINA_TRUE;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_crtc_info_reply_t *oreply[num];
+   int i = 0, cw = 0, ch = 0;
+   int mw = 0, mh = 0, nw = 0, nh = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if (!_ecore_xcb_randr_root_validate(root)) return EINA_FALSE;
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   ecore_x_randr_screen_size_range_get(root, NULL, NULL, &mw, &mh);
+   ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
+   nw = cw;
+   nh = ch;
+
+   for (i = 0; i < num; i++)
+     {
+        xcb_randr_get_crtc_info_cookie_t ocookie;
+
+        ocookie =
+          xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtcs[i],
+                                            stamp);
+        oreply[i] = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn,
+                                                  ocookie, NULL);
+        if (oreply[i])
+          {
+             if (((oreply[i]->x + dx) < 0) ||
+                 ((oreply[i]->y + dy) < 0) ||
+                 ((oreply[i]->x + oreply[i]->width + dx) > mw) ||
+                 ((oreply[i]->y + oreply[i]->height + dy) > mh))
+               {
+                  continue;
+               }
+             nw = MAX((int)(oreply[i]->x + oreply[i]->width + dx), nw);
+             nh = MAX((int)(oreply[i]->y + oreply[i]->height + dy), nh);
+          }
+     }
+
+   if ((nw > cw) || (nh > ch))
+     {
+        if (!ecore_x_randr_screen_current_size_set(root, nw, nh, -1, -1))
+          {
+             for (i = 0; i < num; i++)
+               if (oreply[i]) free(oreply[i]);
+
+             return EINA_FALSE;
+          }
+     }
+
+   for (i = 0; ((i < num) && (oreply[i])); i++)
+     {
+        if (!oreply[i]) continue;
+        if (!ecore_x_randr_crtc_settings_set(root, crtcs[i], NULL, -1,
+                                             (oreply[i]->x + dx),
+                                             (oreply[i]->y + dy),
+                                             oreply[i]->mode,
+                                             oreply[i]->rotation))
+          {
+             ret = EINA_FALSE;
+             break;
+          }
+     }
+
+   if (i < num)
+     {
+        while (i-- >= 0)
+          {
+             if (oreply[i])
+               ecore_x_randr_crtc_settings_set(root, crtcs[i], NULL, -1,
+                                               (oreply[i]->x - dx),
+                                               (oreply[i]->y - dy),
+                                               oreply[i]->mode,
+                                               oreply[i]->rotation);
+          }
+     }
+
+   for (i = 0; i < num; i++)
+     if (oreply[i]) free(oreply[i]);
+#endif
+
+   return ret;
+}
+
+/**
+ * @brief enable event selection. This enables basic interaction with
+ * output/crtc events and requires RRandR >= 1.2.
+ * @param win select this window's properties for RandRR events
+ * @param on enable/disable selecting
+ */
+EAPI void
+ecore_x_randr_events_select(Ecore_X_Window win,
+                            Eina_Bool      on)
+{
+#ifdef ECORE_XCB_RANDR
+   uint16_t mask = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   if (on)
+     {
+        mask = XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE;
+        if (_randr_version >= ((1 << 16) | 2))
+          {
+             mask |= (XCB_RANDR_NOTIFY_MASK_CRTC_CHANGE |
+                      XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE |
+                      XCB_RANDR_NOTIFY_MASK_OUTPUT_PROPERTY);
+          }
+     }
+
+   xcb_randr_select_input(_ecore_xcb_conn, win, mask);
+#endif
+}
+
+/**
+ * @brief removes unused screen space. The most upper left CRTC is set to 0x0
+ * and all other CRTCs dx,dy respectively.
+ * @param root the window's screen which will be reset.
+ */
+EAPI void
+ecore_x_randr_screen_reset(Ecore_X_Window root)
+{
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   Ecore_X_Randr_Crtc *crtcs = NULL;
+   int total = 0, i = 0, w = 0, h = 0;
+   int dx = 100000, dy = 100000, num = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   if (!_ecore_xcb_randr_root_validate(root)) return;
+   crtcs = ecore_x_randr_crtcs_get(root, &total);
+
+   if (_randr_version >= RANDR_1_3)
+     stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+   else if (_randr_version == RANDR_1_2)
+     stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
+
+   /* I hate declaring variables inside code like this, but we need the
+    * value of 'total' before we can */
+   Ecore_X_Randr_Crtc enabled[total];
+
+   for (i = 0; i < total; i++)
+     {
+        xcb_randr_get_crtc_info_cookie_t ocookie;
+        xcb_randr_get_crtc_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtcs[i], stamp);
+        oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn,
+                                               ocookie, NULL);
+        if (!oreply) continue;
+        if ((oreply->mode <= 0) || (oreply->num_outputs == 0))
+          {
+             free(oreply);
+             continue;
+          }
+
+        enabled[num++] = crtcs[i];
+        if ((int)(oreply->x + oreply->width) > w)
+          w = (oreply->x + oreply->width);
+        if ((int)(oreply->y + oreply->height) > h)
+          h = (oreply->y + oreply->height);
+
+        if (oreply->x < dx) dx = oreply->x;
+        if (oreply->y < dy) dy = oreply->y;
+
+        free(oreply);
+     }
+   free(crtcs);
+
+   if ((dx > 0) || (dy > 0))
+     {
+        if (ecore_x_randr_move_crtcs(root, enabled, num, -dx, -dy))
+          {
+             w -= dx;
+             h -= dy;
+          }
+     }
+
+   ecore_x_randr_screen_current_size_set(root, w, h, -1, -1);
+#endif
+}
+
+/*
+ * @param root window which's screen will be queried
+ * @param wmin minimum width the screen can be set to
+ * @param hmin minimum height the screen can be set to
+ * @param wmax maximum width the screen can be set to
+ * @param hmax maximum height the screen can be set to
+ */
+EAPI void
+ecore_x_randr_screen_size_range_get(Ecore_X_Window root,
+                                    int           *minw,
+                                    int           *minh,
+                                    int           *maxw,
+                                    int           *maxh)
+{
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_size_range_cookie_t cookie;
+   xcb_randr_get_screen_size_range_reply_t *reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET();
+
+   cookie = xcb_randr_get_screen_size_range_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_randr_get_screen_size_range_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        if (minw) *minw = reply->min_width;
+        if (minh) *minh = reply->min_height;
+        if (maxw) *maxw = reply->max_width;
+        if (maxh) *maxh = reply->max_height;
+        free(reply);
+     }
+#endif
+}
+
+/*
+ * @param w width of screen in px
+ * @param h height of screen in px
+ */
+EAPI void
+ecore_x_randr_screen_current_size_get(Ecore_X_Window root,
+                                      int           *w,
+                                      int           *h,
+                                      int           *w_mm,
+                                      int           *h_mm)
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Randr_Screen scr = 0;
+   xcb_screen_t *s;
+# define RANDR_VALIDATE_ROOT(screen, root) \
+  ((screen == _ecore_xcb_randr_root_to_screen(root)) != -1)
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET();
+
+   if (!RANDR_VALIDATE_ROOT(scr, root)) return;
+
+   s = ecore_x_screen_get(scr);
+   if (w) *w = s->width_in_pixels;
+   if (h) *h = s->height_in_pixels;
+   if (w_mm) *w_mm = s->width_in_millimeters;
+   if (h_mm) *h_mm = s->height_in_millimeters;
+#endif
+}
+
+/*
+ * @param root Window which's screen's size should be set. If invalid (e.g. 
+ * @c NULL) no action is taken.
+ * @param w Width in px the screen should be set to. If out of valid
+ * boundaries, current value is assumed.
+ * @param h Height in px the screen should be set to. If out of valid
+ * boundaries, current value is assumed.
+ * @param w_mm Width in mm the screen should be set to. If @c 0, current
+ * aspect is assumed.
+ * @param h_mm Height in mm the screen should be set to. If @c 0, current
+ * aspect is assumed.
+ * @return @c EINA_TRUE if request was successfully sent or screen is already
+ * in requested size, @c EINA_FALSE if parameters are invalid.
+ */
+EAPI Eina_Bool
+ecore_x_randr_screen_current_size_set(Ecore_X_Window root,
+                                      int            w,
+                                      int            h,
+                                      int            w_mm,
+                                      int            h_mm)
+{
+   Eina_Bool ret = EINA_TRUE;
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Randr_Screen scr;
+   int wc = 0, hc = 0, w_mm_c = 0, h_mm_c = 0;
+   int mw = 0, mh = 0, xw = 0, xh = 0;
+# define RANDR_VALIDATE_ROOT(screen, root) \
+  ((screen == _ecore_xcb_randr_root_to_screen(root)) != -1)
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if (!RANDR_VALIDATE_ROOT(scr, root)) return EINA_FALSE;
+   ecore_x_randr_screen_current_size_get(root, &wc, &hc, &w_mm_c, &h_mm_c);
+   if ((w == wc) && (h == hc) && (w_mm == w_mm_c) && (h_mm == h_mm_c))
+     return EINA_TRUE;
+   ecore_x_randr_screen_size_range_get(root, &mw, &mh, &xw, &xh);
+   if (((w != 1) && ((w < mw) || (w > xw))) ||
+       ((h != -1) && ((h < mh) || (h > xh)))) return EINA_FALSE;
+
+   if (w <= 0)
+     w = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
+   if (h <= 0)
+     h = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
+
+   /* NB: Hmmmm, xlib version divides w_mm by width ... that seems wrong */
+   if (w_mm <= 0)
+     w_mm = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_millimeters;
+   if (h_mm <= 0)
+     h_mm = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_millimeters;
+
+   xcb_randr_set_screen_size(_ecore_xcb_conn, root, w, h, w_mm, h_mm);
+#endif
+
+   return ret;
+}
+
+/*
+ * @deprecated bad naming. Use ecore_x_randr_window_outputs_get instead.
+ * @brief Get the outputs, which display a certain window.
+ *
+ * @param window Window the displaying outputs shall be found for.
+ * @param num The number of outputs displaying the window.
+ * @return Array of outputs that display a certain window. @c NULL if no
+ * outputs was found that displays the specified window.
+ */
+
+Ecore_X_Randr_Output *
+ecore_x_randr_current_output_get(Ecore_X_Window window,
+                                 int *num)
+{
+   return ecore_x_randr_window_outputs_get(window, num);
+}
+
+/*
+ * @brief Get the outputs, which display a certain window.
+ *
+ * @param window Window the displaying outputs shall be found for.
+ * @param num The number of outputs displaying the window.
+ * @return Array of outputs that display a certain window. @c NULL if no
+ * outputs was found that displays the specified window.
+ */
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_window_outputs_get(Ecore_X_Window window,
+                                 int           *num)
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Window root;
+   Ecore_X_Randr_Crtc *crtcs;
+   Ecore_X_Randr_Output *outputs, *ret = NULL, *tret;
+   int ncrtcs, noutputs, i, nret = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (num) *num = 0;
+
+#ifdef ECORE_XCB_RANDR
+   if (_randr_version < RANDR_1_2) goto _ecore_x_randr_current_output_get_fail;
+
+   root = ecore_x_window_root_get(window);
+   if (!(crtcs = ecore_x_randr_window_crtcs_get(window, &ncrtcs)))
+     goto _ecore_x_randr_current_output_get_fail;
+
+   for (i = 0, nret = 0; i < ncrtcs; i++)
+     {
+
+        outputs = ecore_x_randr_crtc_outputs_get(root, crtcs[i],
+              &noutputs);
+        if (!outputs)
+          goto _ecore_x_randr_current_output_get_fail_free;
+        tret = realloc(ret, ((nret + noutputs) * sizeof(Ecore_X_Randr_Output)));
+        if (!tret) goto _ecore_x_randr_current_output_get_fail_free;
+        ret = tret;
+        memcpy(&ret[nret], outputs, (noutputs * sizeof(Ecore_X_Randr_Output)));
+        nret += noutputs;
+        free(outputs);
+        outputs = NULL;
+     }
+   free(crtcs);
+
+   if (num)
+     *num = nret;
+
+   return ret;
+
+_ecore_x_randr_current_output_get_fail_free:
+   free(outputs);
+   free(crtcs);
+   free(ret);
+_ecore_x_randr_current_output_get_fail:
+#endif
+   if (num) *num = 0;
+   return NULL;
+}
+
+/*
+ * @brief get the backlight level of the given output
+ * @param root window which's screen should be queried
+ * @param output from which the backlight level should be retrieved
+ * @return the backlight level
+ */
+EAPI double
+ecore_x_randr_output_backlight_level_get(Ecore_X_Window       root,
+                                         Ecore_X_Randr_Output output)
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Atom _backlight;
+   xcb_intern_atom_cookie_t acookie;
+   xcb_intern_atom_reply_t *areply;
+   xcb_randr_get_output_property_cookie_t cookie;
+   xcb_randr_get_output_property_reply_t *reply;
+   xcb_randr_query_output_property_cookie_t qcookie;
+   xcb_randr_query_output_property_reply_t *qreply;
+   double dvalue;
+   long value, max, min;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(-1);
+
+   acookie =
+     xcb_intern_atom_unchecked(_ecore_xcb_conn, 1,
+                               strlen("Backlight"), "Backlight");
+   areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
+
+   if (!areply)
+     {
+        ERR("Backlight property is not suppported on this server or driver");
+        return -1;
+     }
+   else
+     {
+        _backlight = areply->atom;
+        free(areply);
+     }
+
+   if (!_ecore_xcb_randr_output_validate(root, output))
+     {
+        ERR("Invalid output");
+        return -1;
+     }
+
+   cookie =
+     xcb_randr_get_output_property_unchecked(_ecore_xcb_conn,
+                                             output, _backlight,
+                                             XCB_ATOM_NONE, 0, 4, 0, 0);
+   reply =
+     xcb_randr_get_output_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply)
+     {
+        WRN("Backlight not supported on this output");
+        return -1;
+     }
+
+   if ((reply->format != 32) || (reply->num_items != 1) ||
+       (reply->type != XCB_ATOM_INTEGER))
+     {
+        free(reply);
+        return -1;
+     }
+
+   value = *((long *)xcb_randr_get_output_property_data(reply));
+   free (reply);
+
+   /* I have the current value of the backlight */
+   /* Now retrieve the min and max intensities of the output */
+   qcookie =
+     xcb_randr_query_output_property_unchecked(_ecore_xcb_conn,
+                                               output, _backlight);
+   qreply =
+     xcb_randr_query_output_property_reply(_ecore_xcb_conn, qcookie, NULL);
+   if (qreply)
+     {
+        dvalue = -1;
+        if ((qreply->range) &&
+            (xcb_randr_query_output_property_valid_values_length(qreply) == 2))
+          {
+             int32_t *vals;
+
+             vals = xcb_randr_query_output_property_valid_values(qreply);
+             /* finally convert the current value in the interval [0..1] */
+             min = vals[0];
+             max = vals[1];
+             dvalue = ((double)(value - min)) / ((double)(max - min));
+          }
+        free(qreply);
+        return dvalue;
+     }
+#endif
+   return -1;
+}
+
+/*
+ * @brief Set the backlight level of a given output.
+ *
+ * @param root Window which's screen should be queried.
+ * @param output That should be set.
+ * @param level For which the backlight should be set.
+ * @return @c EINA_TRUE in case of success.
+ */
+EAPI Eina_Bool
+ecore_x_randr_output_backlight_level_set(Ecore_X_Window       root,
+                                         Ecore_X_Randr_Output output,
+                                         double               level)
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Atom _backlight;
+   xcb_intern_atom_cookie_t acookie;
+   xcb_intern_atom_reply_t *areply;
+   xcb_randr_query_output_property_cookie_t qcookie;
+   xcb_randr_query_output_property_reply_t *qreply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if ((level < 0) || (level > 1))
+     {
+        ERR("Backlight level should be between 0 and 1");
+        return EINA_FALSE;
+     }
+
+   if (!_ecore_xcb_randr_output_validate(root, output))
+     {
+        ERR("Wrong output value");
+        return EINA_FALSE;
+     }
+
+   acookie =
+     xcb_intern_atom_unchecked(_ecore_xcb_conn, 1,
+                               strlen("Backlight"), "Backlight");
+   areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
+   if (!areply)
+     {
+        WRN("Backlight property is not suppported on this server or driver");
+        return EINA_FALSE;
+     }
+   else
+     {
+        _backlight = areply->atom;
+        free(areply);
+     }
+
+   qcookie =
+     xcb_randr_query_output_property_unchecked(_ecore_xcb_conn,
+                                               output, _backlight);
+   qreply =
+     xcb_randr_query_output_property_reply(_ecore_xcb_conn, qcookie, NULL);
+   if (qreply)
+     {
+        if ((qreply->range) && (qreply->length == 2))
+          {
+             int32_t *vals;
+             double min, max, tmp;
+             long n;
+
+             vals = xcb_randr_query_output_property_valid_values(qreply);
+             min = vals[0];
+             max = vals[1];
+             tmp = (level * (max - min)) + min;
+             n = tmp;
+             if (n > max) n = max;
+             if (n < min) n = min;
+             xcb_randr_change_output_property(_ecore_xcb_conn, output,
+                                              _backlight, XCB_ATOM_INTEGER,
+                                              32, XCB_PROP_MODE_REPLACE,
+                                              1, (unsigned char *)&n);
+             ecore_x_flush(); // needed
+          }
+
+        free(qreply);
+        return EINA_TRUE;
+     }
+#endif
+   return EINA_FALSE;
+}
+
+/*
+ * @brief Check if a backlight is available.
+ *
+ * @return Whether a backlight is available.
+ */
+EAPI Eina_Bool 
+ecore_x_randr_output_backlight_available(void) 
+{
+#ifdef ECORE_XCB_RANDR
+   Ecore_X_Atom _backlight;
+   xcb_intern_atom_cookie_t acookie;
+   xcb_intern_atom_reply_t *areply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   acookie =
+     xcb_intern_atom_unchecked(_ecore_xcb_conn, 1,
+                               strlen("Backlight"), "Backlight");
+   areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
+
+   if (!areply)
+     {
+        ERR("Backlight property is not suppported on this server or driver");
+        return EINA_FALSE;
+     }
+   else
+     {
+        _backlight = areply->atom;
+        free(areply);
+        return EINA_TRUE;
+     }
+#endif
+   return EINA_FALSE;
+}
+
+EAPI int
+ecore_x_randr_edid_version_get(unsigned char *edid, unsigned long edid_length)
+{
+   if ((edid_length > _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR) &&
+       (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
+     return (edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR] << 8) |
+            edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR];
+   return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+}
+
+EAPI char *
+ecore_x_randr_edid_display_name_get(unsigned char *edid, unsigned long edid_length) 
+{
+   unsigned char *block = NULL;
+   int version = 0;
+
+   version = ecore_x_randr_edid_version_get(edid, edid_length);
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
+
+   _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
+     {
+        if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfc)
+          {
+             char *name, *p;
+             const char *edid_name;
+
+             edid_name = (const char *)block + 
+               _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
+             name = 
+               malloc(sizeof(char) * 
+                      _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
+             if (!name) return NULL;
+
+             strncpy(name, edid_name, 
+                     (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
+             name[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
+             for (p = name; *p; p++)
+               if ((*p < ' ') || (*p > '~')) *p = 0;
+
+             return name;
+          }
+     }
+   return NULL;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_edid_has_valid_header(unsigned char *edid, unsigned long edid_length)
+{
+   const unsigned char header[] =
+     { 
+        0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 
+     };
+
+   if ((!edid) || (edid_length < 8)) return EINA_FALSE;
+   if (!memcmp(edid, header, 8)) return EINA_TRUE;
+   return EINA_FALSE;
+}
+
+/* local functions */
+static Eina_Bool
+_ecore_xcb_randr_output_validate(Ecore_X_Window       root,
+                                 Ecore_X_Randr_Output output)
+{
+   Eina_Bool ret = EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if ((output) && (_ecore_xcb_randr_root_validate(root)))
+     {
+        if (_randr_version >= RANDR_1_3)
+          {
+             xcb_randr_get_screen_resources_current_reply_t *reply;
+
+             reply = _ecore_xcb_randr_13_get_resources(root);
+             if (reply)
+               {
+                  int len = 0, i = 0;
+                  xcb_randr_output_t *outputs;
+
+                  len =
+                    xcb_randr_get_screen_resources_current_outputs_length(reply);
+                  outputs =
+                    xcb_randr_get_screen_resources_current_outputs(reply);
+                  for (i = 0; i < len; i++)
+                    {
+                       if (outputs[i] == output)
+                         {
+                            ret = EINA_TRUE;
+                            break;
+                         }
+                    }
+                  free(reply);
+               }
+          }
+        else if (_randr_version == RANDR_1_2)
+          {
+             xcb_randr_get_screen_resources_reply_t *reply;
+
+             reply = _ecore_xcb_randr_12_get_resources(root);
+             if (reply)
+               {
+                  int len = 0, i = 0;
+                  xcb_randr_output_t *outputs;
+
+                  len = xcb_randr_get_screen_resources_outputs_length(reply);
+                  outputs = xcb_randr_get_screen_resources_outputs(reply);
+                  for (i = 0; i < len; i++)
+                    {
+                       if (outputs[i] == output)
+                         {
+                            ret = EINA_TRUE;
+                            break;
+                         }
+                    }
+                  free(reply);
+               }
+          }
+     }
+#endif
+   return ret;
+}
+
+/**
+ * @brief Validates a CRTC for a given root window's screen.
+ *
+ * @param root The window which's default display will be queried.
+ * @param crtc The CRTC to be validated.
+ * @return In case it is found @c EINA_TRUE will be returned, else
+ * @c EINA_FALSE is returned.
+ */
+static Eina_Bool
+_ecore_xcb_randr_crtc_validate(Ecore_X_Window     root,
+                               Ecore_X_Randr_Crtc crtc)
+{
+   Eina_Bool ret = EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if (((int)crtc == Ecore_X_Randr_None) || ((int)crtc == Ecore_X_Randr_Unset))
+     return ret;
+
+   if ((crtc) && (_ecore_xcb_randr_root_validate(root)))
+     {
+        if (_randr_version >= RANDR_1_3)
+          {
+             xcb_randr_get_screen_resources_current_reply_t *reply;
+
+             reply = _ecore_xcb_randr_13_get_resources(root);
+             if (reply)
+               {
+                  int i = 0;
+                  xcb_randr_crtc_t *crtcs;
+
+                  crtcs = xcb_randr_get_screen_resources_current_crtcs(reply);
+                  for (i = 0; i < reply->num_crtcs; i++)
+                    {
+                       if (crtcs[i] == crtc)
+                         {
+                            ret = EINA_TRUE;
+                            break;
+                         }
+                    }
+                  free(reply);
+               }
+          }
+        else if (_randr_version == RANDR_1_2)
+          {
+             xcb_randr_get_screen_resources_reply_t *reply;
+
+             reply = _ecore_xcb_randr_12_get_resources(root);
+             if (reply)
+               {
+                  int i = 0;
+                  xcb_randr_crtc_t *crtcs;
+
+                  crtcs = xcb_randr_get_screen_resources_crtcs(reply);
+                  for (i = 0; i < reply->num_crtcs; i++)
+                    {
+                       if (crtcs[i] == crtc)
+                         {
+                            ret = EINA_TRUE;
+                            break;
+                         }
+                    }
+                  free(reply);
+               }
+          }
+     }
+#endif
+
+   return ret;
+}
+
+static Ecore_X_Randr_Mode *
+_ecore_xcb_randr_12_output_modes_get(Ecore_X_Window       root,
+                                     Ecore_X_Randr_Output output,
+                                     int                 *num,
+                                     int                 *npreferred)
+{
+   Ecore_X_Randr_Mode *modes = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             if (num) *num = oreply->num_modes;
+             if (npreferred) *npreferred = oreply->num_preferred;
+
+             modes = malloc(sizeof(Ecore_X_Randr_Mode) *
+                            oreply->num_modes);
+             if (modes)
+               {
+                  xcb_randr_mode_t *rmodes;
+                  int len = 0;
+
+                  len = xcb_randr_get_output_info_modes_length(oreply);
+                  rmodes = xcb_randr_get_output_info_modes(oreply);
+                  memcpy(modes, rmodes, sizeof(Ecore_X_Randr_Mode) * len);
+               }
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return modes;
+}
+
+static Ecore_X_Randr_Mode *
+_ecore_xcb_randr_13_output_modes_get(Ecore_X_Window       root,
+                                     Ecore_X_Randr_Output output,
+                                     int                 *num,
+                                     int                 *npreferred)
+{
+   Ecore_X_Randr_Mode *modes = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_timestamp_t stamp = 0;
+   xcb_randr_get_output_info_cookie_t ocookie;
+   xcb_randr_get_output_info_reply_t *oreply;
+
+   stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
+
+   ocookie =
+     xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output, stamp);
+   oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (oreply)
+     {
+        if (num) *num = oreply->num_modes;
+        if (npreferred) *npreferred = oreply->num_preferred;
+
+        modes = malloc(sizeof(Ecore_X_Randr_Mode) * oreply->num_modes);
+        if (modes)
+          {
+             xcb_randr_mode_t *rmodes;
+             int len = 0;
+
+             len = xcb_randr_get_output_info_modes_length(oreply);
+             rmodes = xcb_randr_get_output_info_modes(oreply);
+             memcpy(modes, rmodes, sizeof(Ecore_X_Randr_Mode) * len);
+          }
+        free(oreply);
+     }
+#endif
+   return modes;
+}
+
+static Ecore_X_Randr_Mode_Info *
+_ecore_xcb_randr_12_mode_info_get(Ecore_X_Window     root,
+                                  Ecore_X_Randr_Mode mode)
+{
+   Ecore_X_Randr_Mode_Info *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        if ((ret = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
+          {
+             uint8_t *nbuf;
+             xcb_randr_mode_info_iterator_t miter;
+
+             nbuf = xcb_randr_get_screen_resources_names(reply);
+             miter = xcb_randr_get_screen_resources_modes_iterator(reply);
+             while (miter.rem)
+               {
+                  xcb_randr_mode_info_t *minfo;
+
+                  minfo = miter.data;
+                  nbuf += minfo->name_len;
+
+                  if (minfo->id == mode)
+                    {
+                       ret->xid = minfo->id;
+                       ret->width = minfo->width;
+                       ret->height = minfo->height;
+                       ret->dotClock = minfo->dot_clock;
+                       ret->hSyncStart = minfo->hsync_start;
+                       ret->hSyncEnd = minfo->hsync_end;
+                       ret->hTotal = minfo->htotal;
+                       ret->vSyncStart = minfo->vsync_start;
+                       ret->vSyncEnd = minfo->vsync_end;
+                       ret->vTotal = minfo->vtotal;
+                       ret->modeFlags = minfo->mode_flags;
+
+                       ret->name = NULL;
+                       ret->nameLength = minfo->name_len;
+                       if (ret->nameLength > 0)
+                         {
+                            ret->name = malloc(ret->nameLength + 1);
+                            if (ret->name)
+                              memcpy(ret->name, nbuf, ret->nameLength + 1);
+                         }
+
+                       break;
+                    }
+                  xcb_randr_mode_info_next(&miter);
+               }
+          }
+
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Mode_Info *
+_ecore_xcb_randr_13_mode_info_get(Ecore_X_Window     root,
+                                  Ecore_X_Randr_Mode mode)
+{
+   Ecore_X_Randr_Mode_Info *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        if ((ret = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
+          {
+             uint8_t *nbuf;
+             xcb_randr_mode_info_iterator_t miter;
+
+             nbuf = xcb_randr_get_screen_resources_current_names(reply);
+             miter =
+               xcb_randr_get_screen_resources_current_modes_iterator(reply);
+             while (miter.rem)
+               {
+                  xcb_randr_mode_info_t *minfo;
+
+                  minfo = miter.data;
+                  nbuf += minfo->name_len;
+
+                  if (minfo->id == mode)
+                    {
+                       ret->xid = minfo->id;
+                       ret->width = minfo->width;
+                       ret->height = minfo->height;
+                       ret->dotClock = minfo->dot_clock;
+                       ret->hSyncStart = minfo->hsync_start;
+                       ret->hSyncEnd = minfo->hsync_end;
+                       ret->hTotal = minfo->htotal;
+                       ret->vSyncStart = minfo->vsync_start;
+                       ret->vSyncEnd = minfo->vsync_end;
+                       ret->vTotal = minfo->vtotal;
+                       ret->modeFlags = minfo->mode_flags;
+
+                       ret->name = NULL;
+                       ret->nameLength = minfo->name_len;
+                       if (ret->nameLength > 0)
+                         {
+                            ret->name = malloc(ret->nameLength + 1);
+                            if (ret->name)
+                              memcpy(ret->name, nbuf, ret->nameLength + 1);
+                         }
+
+                       break;
+                    }
+                  xcb_randr_mode_info_next(&miter);
+               }
+          }
+
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Mode_Info **
+_ecore_xcb_randr_12_modes_info_get(Ecore_X_Window root,
+                                   int           *num)
+{
+   Ecore_X_Randr_Mode_Info **ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        if (num) *num = reply->num_modes;
+        ret = malloc(sizeof(Ecore_X_Randr_Mode_Info *) * reply->num_modes);
+        if (ret)
+          {
+             xcb_randr_mode_info_iterator_t miter;
+             int i = 0;
+             uint8_t *nbuf;
+
+             nbuf = xcb_randr_get_screen_resources_names(reply);
+             miter = xcb_randr_get_screen_resources_modes_iterator(reply);
+             while (miter.rem)
+               {
+                  xcb_randr_mode_info_t *minfo;
+
+                  minfo = miter.data;
+                  nbuf += minfo->name_len;
+                  if ((ret[i] = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
+                    {
+                       ret[i]->xid = minfo->id;
+                       ret[i]->width = minfo->width;
+                       ret[i]->height = minfo->height;
+                       ret[i]->dotClock = minfo->dot_clock;
+                       ret[i]->hSyncStart = minfo->hsync_start;
+                       ret[i]->hSyncEnd = minfo->hsync_end;
+                       ret[i]->hTotal = minfo->htotal;
+                       ret[i]->vSyncStart = minfo->vsync_start;
+                       ret[i]->vSyncEnd = minfo->vsync_end;
+                       ret[i]->vTotal = minfo->vtotal;
+                       ret[i]->modeFlags = minfo->mode_flags;
+
+                       ret[i]->name = NULL;
+                       ret[i]->nameLength = minfo->name_len;
+                       if (ret[i]->nameLength > 0)
+                         {
+                            ret[i]->name = malloc(ret[i]->nameLength + 1);
+                            if (ret[i]->name)
+                              memcpy(ret[i]->name, nbuf,
+                                     ret[i]->nameLength + 1);
+                         }
+                    }
+                  else
+                    {
+                       while (i > 0)
+                         free(ret[--i]);
+                       free(ret);
+                       ret = NULL;
+                       break;
+                    }
+                  i++;
+                  xcb_randr_mode_info_next(&miter);
+               }
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Mode_Info **
+_ecore_xcb_randr_13_modes_info_get(Ecore_X_Window root,
+                                   int           *num)
+{
+   Ecore_X_Randr_Mode_Info **ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        if (num) *num = reply->num_modes;
+        ret = malloc(sizeof(Ecore_X_Randr_Mode_Info *) * reply->num_modes);
+        if (ret)
+          {
+             xcb_randr_mode_info_iterator_t miter;
+             int i = 0;
+             uint8_t *nbuf;
+
+             nbuf = xcb_randr_get_screen_resources_current_names(reply);
+             miter =
+               xcb_randr_get_screen_resources_current_modes_iterator(reply);
+             while (miter.rem)
+               {
+                  xcb_randr_mode_info_t *minfo;
+
+                  minfo = miter.data;
+                  nbuf += minfo->name_len;
+                  if ((ret[i] = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
+                    {
+                       ret[i]->xid = minfo->id;
+                       ret[i]->width = minfo->width;
+                       ret[i]->height = minfo->height;
+                       ret[i]->dotClock = minfo->dot_clock;
+                       ret[i]->hSyncStart = minfo->hsync_start;
+                       ret[i]->hSyncEnd = minfo->hsync_end;
+                       ret[i]->hTotal = minfo->htotal;
+                       ret[i]->vSyncStart = minfo->vsync_start;
+                       ret[i]->vSyncEnd = minfo->vsync_end;
+                       ret[i]->vTotal = minfo->vtotal;
+                       ret[i]->modeFlags = minfo->mode_flags;
+
+                       ret[i]->name = NULL;
+                       ret[i]->nameLength = minfo->name_len;
+                       if (ret[i]->nameLength > 0)
+                         {
+                            ret[i]->name = malloc(ret[i]->nameLength + 1);
+                            if (ret[i]->name)
+                              memcpy(ret[i]->name, nbuf,
+                                     ret[i]->nameLength + 1);
+                         }
+                    }
+                  else
+                    {
+                       while (i > 0)
+                         free(ret[--i]);
+                       free(ret);
+                       ret = NULL;
+                       break;
+                    }
+                  i++;
+                  xcb_randr_mode_info_next(&miter);
+               }
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static void
+_ecore_xcb_randr_12_mode_size_get(Ecore_X_Window     root,
+                                  Ecore_X_Randr_Mode mode,
+                                  int               *w,
+                                  int               *h)
+{
+   if (w) *w = 0;
+   if (h) *h = 0;
+
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_mode_info_iterator_t miter;
+
+        miter = xcb_randr_get_screen_resources_modes_iterator(reply);
+        while (miter.rem)
+          {
+             xcb_randr_mode_info_t *minfo;
+
+             minfo = miter.data;
+             if (minfo->id == mode)
+               {
+                  if (w) *w = minfo->width;
+                  if (h) *h = minfo->height;
+                  break;
+               }
+             xcb_randr_mode_info_next(&miter);
+          }
+        free(reply);
+     }
+#endif
+}
+
+static void
+_ecore_xcb_randr_13_mode_size_get(Ecore_X_Window     root,
+                                  Ecore_X_Randr_Mode mode,
+                                  int               *w,
+                                  int               *h)
+{
+   if (w) *w = 0;
+   if (h) *h = 0;
+
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_mode_info_iterator_t miter;
+
+        miter = xcb_randr_get_screen_resources_current_modes_iterator(reply);
+        while (miter.rem)
+          {
+             xcb_randr_mode_info_t *minfo;
+
+             minfo = miter.data;
+             if (minfo->id == mode)
+               {
+                  if (w) *w = minfo->width;
+                  if (h) *h = minfo->height;
+                  break;
+               }
+             xcb_randr_mode_info_next(&miter);
+          }
+        free(reply);
+     }
+#endif
+}
+
+static Ecore_X_Randr_Output *
+_ecore_xcb_randr_12_output_clones_get(Ecore_X_Window       root,
+                                      Ecore_X_Randr_Output output,
+                                      int                 *num)
+{
+   Ecore_X_Randr_Output *outputs = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             if (num) *num = oreply->num_clones;
+
+             outputs =
+               malloc(sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
+             if (outputs)
+               {
+                  memcpy(outputs, xcb_randr_get_output_info_clones(oreply),
+                         sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
+               }
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return outputs;
+}
+
+static Ecore_X_Randr_Output *
+_ecore_xcb_randr_13_output_clones_get(Ecore_X_Window       root,
+                                      Ecore_X_Randr_Output output,
+                                      int                 *num)
+{
+   Ecore_X_Randr_Output *outputs = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             if (num) *num = oreply->num_clones;
+
+             outputs =
+               malloc(sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
+             if (outputs)
+               {
+                  memcpy(outputs, xcb_randr_get_output_info_clones(oreply),
+                         sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
+               }
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return outputs;
+}
+
+static Ecore_X_Randr_Crtc *
+_ecore_xcb_randr_12_output_possible_crtcs_get(Ecore_X_Window       root,
+                                              Ecore_X_Randr_Output output,
+                                              int                 *num)
+{
+   Ecore_X_Randr_Crtc *crtcs = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             if (num) *num = oreply->num_crtcs;
+
+             crtcs = malloc(sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
+             if (crtcs)
+               {
+                  memcpy(crtcs, xcb_randr_get_output_info_crtcs(oreply),
+                         sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
+               }
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return crtcs;
+}
+
+static Ecore_X_Randr_Crtc *
+_ecore_xcb_randr_13_output_possible_crtcs_get(Ecore_X_Window       root,
+                                              Ecore_X_Randr_Output output,
+                                              int                 *num)
+{
+   Ecore_X_Randr_Crtc *crtcs = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             if (num) *num = oreply->num_crtcs;
+
+             crtcs = malloc(sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
+             if (crtcs)
+               {
+                  memcpy(crtcs, xcb_randr_get_output_info_crtcs(oreply),
+                         sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
+               }
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return crtcs;
+}
+
+static char *
+_ecore_xcb_randr_12_output_name_get(Ecore_X_Window       root,
+                                    Ecore_X_Randr_Output output,
+                                    int                 *len)
+{
+   char *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             uint8_t *nbuf;
+
+             nbuf = xcb_randr_get_output_info_name(oreply);
+             nbuf += oreply->name_len;
+
+             if (len) *len = oreply->name_len;
+             if (oreply->name_len > 0)
+               {
+                  ret = malloc(oreply->name_len + 1);
+                  if (ret)
+                    memcpy(ret, nbuf, oreply->name_len + 1);
+               }
+
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static char *
+_ecore_xcb_randr_13_output_name_get(Ecore_X_Window       root,
+                                    Ecore_X_Randr_Output output,
+                                    int                 *len)
+{
+   char *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             uint8_t *nbuf;
+
+             nbuf = xcb_randr_get_output_info_name(oreply);
+             nbuf += oreply->name_len;
+
+             if (len) *len = oreply->name_len;
+             if (oreply->name_len > 0)
+               {
+                  ret = malloc(oreply->name_len + 1);
+                  if (ret)
+                    memcpy(ret, nbuf, oreply->name_len + 1);
+               }
+
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Connection_Status
+_ecore_xcb_randr_12_output_connection_status_get(Ecore_X_Window       root,
+                                                 Ecore_X_Randr_Output output)
+{
+   Ecore_X_Randr_Connection_Status ret = ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             ret = oreply->connection;
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Connection_Status
+_ecore_xcb_randr_13_output_connection_status_get(Ecore_X_Window       root,
+                                                 Ecore_X_Randr_Output output)
+{
+   Ecore_X_Randr_Connection_Status ret = ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             ret = oreply->connection;
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Output *
+_ecore_xcb_randr_12_outputs_get(Ecore_X_Window root,
+                                int           *num)
+{
+   Ecore_X_Randr_Output *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        if (num) *num = reply->num_outputs;
+        ret = malloc(sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
+        if (ret)
+          memcpy(ret, xcb_randr_get_screen_resources_outputs(reply),
+                 sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Output *
+_ecore_xcb_randr_13_outputs_get(Ecore_X_Window root,
+                                int           *num)
+{
+   Ecore_X_Randr_Output *ret = NULL;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        if (num) *num = reply->num_outputs;
+        ret = malloc(sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
+        if (ret)
+          memcpy(ret, xcb_randr_get_screen_resources_current_outputs(reply),
+                 sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Crtc
+_ecore_xcb_randr_12_output_crtc_get(Ecore_X_Window       root,
+                                    Ecore_X_Randr_Output output)
+{
+   Ecore_X_Randr_Crtc ret = Ecore_X_Randr_None;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             ret = oreply->crtc;
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static Ecore_X_Randr_Crtc
+_ecore_xcb_randr_13_output_crtc_get(Ecore_X_Window       root,
+                                    Ecore_X_Randr_Output output)
+{
+   Ecore_X_Randr_Crtc ret = Ecore_X_Randr_None;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(root);
+   if (reply)
+     {
+        xcb_randr_get_output_info_cookie_t ocookie;
+        xcb_randr_get_output_info_reply_t *oreply;
+
+        ocookie =
+          xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
+                                              reply->config_timestamp);
+        oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
+                                                 ocookie, NULL);
+        if (oreply)
+          {
+             ret = oreply->crtc;
+             free(oreply);
+          }
+        free(reply);
+     }
+#endif
+   return ret;
+}
+
+static xcb_randr_get_screen_resources_reply_t *
+_ecore_xcb_randr_12_get_resources(Ecore_X_Window win)
+{
+   xcb_randr_get_screen_resources_cookie_t cookie;
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   cookie = xcb_randr_get_screen_resources_unchecked(_ecore_xcb_conn, win);
+   reply = xcb_randr_get_screen_resources_reply(_ecore_xcb_conn, cookie, NULL);
+   return reply;
+}
+
+static xcb_randr_get_screen_resources_current_reply_t *
+_ecore_xcb_randr_13_get_resources(Ecore_X_Window win)
+{
+   xcb_randr_get_screen_resources_current_cookie_t cookie;
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   cookie =
+     xcb_randr_get_screen_resources_current_unchecked(_ecore_xcb_conn, win);
+   reply =
+     xcb_randr_get_screen_resources_current_reply(_ecore_xcb_conn,
+                                                  cookie, NULL);
+   return reply;
+}
+
+static xcb_timestamp_t
+_ecore_xcb_randr_12_get_resource_timestamp(Ecore_X_Window win)
+{
+   xcb_timestamp_t stamp = 0;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_reply_t *reply;
+
+   reply = _ecore_xcb_randr_12_get_resources(win);
+   stamp = reply->config_timestamp;
+   free(reply);
+#endif
+   return stamp;
+}
+
+static xcb_timestamp_t
+_ecore_xcb_randr_13_get_resource_timestamp(Ecore_X_Window win)
+{
+   xcb_timestamp_t stamp = 0;
+#ifdef ECORE_XCB_RANDR
+   xcb_randr_get_screen_resources_current_reply_t *reply;
+
+   reply = _ecore_xcb_randr_13_get_resources(win);
+   stamp = reply->config_timestamp;
+   free(reply);
+#endif
+   return stamp;
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_region.c b/src/lib/ecore_x/xcb/ecore_xcb_region.c
new file mode 100644 (file)
index 0000000..a221d8f
--- /dev/null
@@ -0,0 +1,159 @@
+#include "ecore_xcb_private.h"
+#include <pixman.h>
+
+/*
+ * [ ] XPolygonRegion
+ * [ ] XShrinkRegion
+ * [ ] XClipBox
+ * [ ] XXorRegion
+ */
+
+EAPI Ecore_X_XRegion *
+ecore_x_xregion_new()
+{
+   pixman_region16_t *region;
+
+   region = (pixman_region16_t *)malloc(sizeof(pixman_region16_t));
+   if (!region) return NULL;
+
+   pixman_region_init(region);
+
+   return (Ecore_X_XRegion *)region;
+}
+
+EAPI void
+ecore_x_xregion_free(Ecore_X_XRegion *region)
+{
+   if (!region) return;
+
+   pixman_region_fini(region);
+   free(region);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_set(Ecore_X_XRegion *region,
+                    Ecore_X_GC       gc)
+{
+   xcb_rectangle_t *rects;
+   pixman_box16_t *boxes;
+   int num = 0, i = 0;
+
+   CHECK_XCB_CONN;
+
+   if (!region) return EINA_FALSE;
+
+   boxes = pixman_region_rectangles((pixman_region16_t *)region, &num);
+   if ((!boxes) || (num == 0)) return EINA_FALSE;
+
+   rects = (xcb_rectangle_t *)malloc(sizeof(xcb_rectangle_t) * num);
+   if (!rects) return EINA_FALSE;
+
+   for (i = 0; i < num; i++)
+     {
+        rects[i].x = boxes[i].x1;
+        rects[i].y = boxes[i].y1;
+        rects[i].width = boxes[i].x2 - boxes[i].x1 + 1;
+        rects[i].height = boxes[i].y2 - boxes[i].y1 + 1;
+     }
+
+   xcb_set_clip_rectangles(_ecore_xcb_conn, XCB_CLIP_ORDERING_YX_BANDED,
+                           gc, 0, 0, num, rects);
+
+//   ecore_x_flush();
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_xregion_translate(Ecore_X_XRegion *region,
+                          int              x,
+                          int              y)
+{
+   if (!region) return;
+
+   pixman_region_translate((pixman_region16_t *)region, x, y);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_intersect(Ecore_X_XRegion *dst,
+                          Ecore_X_XRegion *r1,
+                          Ecore_X_XRegion *r2)
+{
+   return pixman_region_intersect((pixman_region16_t *)dst,
+                                  (pixman_region16_t *)r1,
+                                  (pixman_region16_t *)r2);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_union(Ecore_X_XRegion *dst,
+                      Ecore_X_XRegion *r1,
+                      Ecore_X_XRegion *r2)
+{
+   return pixman_region_union((pixman_region16_t *)dst,
+                              (pixman_region16_t *)r1,
+                              (pixman_region16_t *)r2);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_union_rect(Ecore_X_XRegion   *dst,
+                           Ecore_X_XRegion   *src,
+                           Ecore_X_Rectangle *rect)
+{
+   return pixman_region_union_rect((pixman_region16_t *)dst,
+                                   (pixman_region16_t *)src,
+                                   rect->x, rect->y, rect->width, rect->height);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_subtract(Ecore_X_XRegion *dst,
+                         Ecore_X_XRegion *rm,
+                         Ecore_X_XRegion *rs)
+{
+   return pixman_region_subtract((pixman_region16_t *)dst,
+                                 (pixman_region16_t *)rm,
+                                 (pixman_region16_t *)rs);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_is_empty(Ecore_X_XRegion *region)
+{
+   if (!region) return EINA_TRUE;
+
+   return !pixman_region_not_empty((pixman_region16_t *)region);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_is_equal(Ecore_X_XRegion *r1,
+                         Ecore_X_XRegion *r2)
+{
+   if ((!r1) || (!r2)) return EINA_FALSE;
+
+   return pixman_region_equal((pixman_region16_t *)r1,
+                              (pixman_region16_t *)r2);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_point_contain(Ecore_X_XRegion *region,
+                              int              x,
+                              int              y)
+{
+   if (!region) return EINA_FALSE;
+
+   return pixman_region_contains_point((pixman_region16_t *)region, x, y, NULL);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_rect_contain(Ecore_X_XRegion   *region,
+                             Ecore_X_Rectangle *rect)
+{
+   pixman_box16_t box;
+
+   if ((!region) || (!rect)) return EINA_FALSE;
+
+   box.x1 = rect->x;
+   box.y1 = rect->y;
+   box.x2 = rect->x + rect->width - 1;
+   box.y2 = rect->y + rect->height - 1;
+
+   return pixman_region_contains_rectangle((pixman_region16_t *)region, &box);
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_render.c b/src/lib/ecore_x/xcb/ecore_xcb_render.c
new file mode 100644 (file)
index 0000000..f36b4d2
--- /dev/null
@@ -0,0 +1,225 @@
+#include "ecore_xcb_private.h"
+#include <ctype.h> // for isupper/tolower
+#ifdef ECORE_XCB_RENDER
+# include <xcb/render.h>
+# include <xcb/xcb_renderutil.h>
+#endif
+
+/* local function prototypes */
+static Eina_Bool _ecore_xcb_render_parse_boolean(char *v);
+
+/* local variables */
+static Eina_Bool _render_avail = EINA_FALSE;
+static Eina_Bool _render_argb = EINA_FALSE;
+static Eina_Bool _render_anim = EINA_FALSE;
+
+void
+_ecore_xcb_render_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_RENDER
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_render_id);
+#endif
+}
+
+void
+_ecore_xcb_render_finalize(void)
+{
+#ifdef ECORE_XCB_RENDER
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_RENDER
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_render_id);
+   if ((ext_reply) && (ext_reply->present))
+     {
+        xcb_render_query_version_cookie_t cookie;
+        xcb_render_query_version_reply_t *reply;
+
+        cookie =
+          xcb_render_query_version_unchecked(_ecore_xcb_conn,
+                                             XCB_RENDER_MAJOR_VERSION,
+                                             XCB_RENDER_MINOR_VERSION);
+        reply = xcb_render_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+//        if ((reply->major_version >= XCB_RENDER_MAJOR_VERSION) &&
+               if (reply->minor_version >= XCB_RENDER_MINOR_VERSION)
+                 {
+                    char *v = NULL;
+
+                    _render_avail = EINA_TRUE;
+                    _ecore_xcb_xdefaults_init();
+                    if ((reply->major_version > 0) || (reply->minor_version >= 5))
+                      {
+                         _render_argb = EINA_TRUE;
+                         v = getenv("XCURSOR_CORE");
+                         if (!v)
+                           v = _ecore_xcb_xdefaults_string_get("Xcursor", "core");
+                         if ((v) && (_ecore_xcb_render_parse_boolean(v)))
+                           _render_argb = EINA_FALSE;
+                      }
+                    if ((_render_argb) &&
+                        ((reply->major_version > 0) || (reply->minor_version >= 8)))
+                      {
+                         _render_anim = EINA_TRUE;
+                         v = getenv("XCURSOR_ANIM");
+                         if (!v)
+                           v = _ecore_xcb_xdefaults_string_get("Xcursor", "anim");
+                         if ((v) && (_ecore_xcb_render_parse_boolean(v)))
+                           _render_anim = EINA_FALSE;
+                      }
+                    _ecore_xcb_xdefaults_shutdown();
+                 }
+          }
+        free(reply);
+     }
+#endif
+}
+
+Eina_Bool
+_ecore_xcb_render_avail_get(void)
+{
+   return _render_avail;
+}
+
+Eina_Bool
+_ecore_xcb_render_argb_get(void)
+{
+   return _render_argb;
+}
+
+Eina_Bool
+_ecore_xcb_render_anim_get(void)
+{
+   return _render_anim;
+}
+
+Eina_Bool
+_ecore_xcb_render_visual_supports_alpha(Ecore_X_Visual visual)
+{
+   Eina_Bool ret = EINA_FALSE;
+#ifdef ECORE_XCB_RENDER
+   const xcb_render_query_pict_formats_reply_t *reply;
+   xcb_render_pictvisual_t *vis;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!visual) return EINA_FALSE;
+   if (!_render_avail) return EINA_FALSE;
+
+#ifdef ECORE_XCB_RENDER
+   reply = xcb_render_util_query_formats(_ecore_xcb_conn);
+   if (!reply) return EINA_FALSE;
+
+   vis =
+     xcb_render_util_find_visual_format(reply,
+                                        ((xcb_visualtype_t *)visual)->visual_id);
+   if (vis)
+     {
+        xcb_render_pictforminfo_t temp;
+        xcb_render_pictforminfo_t *format;
+
+        temp.id = vis->format;
+        format =
+          xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID, &temp, 0);
+
+        if ((format->type == XCB_RENDER_PICT_TYPE_DIRECT) &&
+            (format->direct.alpha_mask))
+          ret = EINA_TRUE;
+     }
+
+#endif
+
+   return ret;
+}
+
+uint32_t
+_ecore_xcb_render_find_visual_id(int       type,
+                                 Eina_Bool check_alpha)
+{
+#ifdef ECORE_XCB_RENDER
+   const xcb_render_query_pict_formats_reply_t *reply;
+   xcb_render_pictvisual_t *visual = NULL;
+   xcb_render_pictscreen_iterator_t screens;
+   xcb_render_pictdepth_iterator_t depths;
+   xcb_render_pictvisual_iterator_t visuals;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_render_avail) return 0;
+
+#ifdef ECORE_XCB_RENDER
+   reply = xcb_render_util_query_formats(_ecore_xcb_conn);
+   if (!reply) return 0;
+
+   for (screens = xcb_render_query_pict_formats_screens_iterator(reply);
+        screens.rem; xcb_render_pictscreen_next(&screens))
+     {
+        for (depths = xcb_render_pictscreen_depths_iterator(screens.data);
+             depths.rem; xcb_render_pictdepth_next(&depths))
+          {
+             for (visuals = xcb_render_pictdepth_visuals_iterator(depths.data);
+                  visuals.rem; xcb_render_pictvisual_next(&visuals))
+               {
+                  xcb_render_pictforminfo_t temp;
+                  xcb_render_pictforminfo_t *format;
+
+                  visual = visuals.data;
+                  temp.id = visual->format;
+
+                  format =
+                    xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID,
+                                                &temp, 0);
+                  if (!format) continue;
+                  if (format->type == type)
+                    {
+                       if (check_alpha)
+                         {
+                            if (format->direct.alpha_mask)
+                              return visual->visual;
+                         }
+                       else
+                         return visual->visual;
+                    }
+               }
+          }
+     }
+#endif
+
+   return 0;
+}
+
+/* local function prototypes */
+static Eina_Bool
+_ecore_xcb_render_parse_boolean(char *v)
+{
+   char c;
+
+   c = *v;
+   if (isupper((int)c))
+     c = tolower(c);
+   if ((c == 't') || (c == 'y') || (c == '1'))
+     return EINA_TRUE;
+   if ((c == 'f') || (c == 'n') || (c == '0'))
+     return EINA_FALSE;
+   if (c == 'o')
+     {
+        char d;
+
+        d = v[1];
+        if (isupper((int)d))
+          d = tolower(d);
+        if (d == 'n') return EINA_TRUE;
+        if (d == 'f') return EINA_FALSE;
+     }
+   return EINA_FALSE;
+}
+
index 6fdf8c4..9b74c67 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
+# ifdef ECORE_XCB_SCREENSAVER
+#  include <xcb/screensaver.h>
+# endif
 
+/* local variables */
+static Eina_Bool _screensaver_avail = EINA_FALSE;
 
-/**
- * @defgroup Ecore_X_ScrenSaver_Group X Shape extension
- *
- * These functions use the shape extension of the X server to change
- * shape of given windows.
- */
-
+/* external variables */
+int _ecore_xcb_event_screensaver = -1;
 
-/**
- * Return whether the X server supports the ScrenSaver Extension.
- * @return 1 if the X ScrenSaver Extension is available, 0 otherwise.
- *
- * Return 1 if the X server supports the ScrenSaver Extension version 1.0,
- * 0 otherwise.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
-EAPI int
-ecore_x_screensaver_event_available_get(void)
+void
+_ecore_xcb_screensaver_init(void)
 {
-   return 1;
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-
-/**
- * Sends the QueryInfo request.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
-EAPI void
-ecore_x_screensaver_idle_time_prefetch(void)
-{
 #ifdef ECORE_XCB_SCREENSAVER
-   xcb_screensaver_query_info_cookie_t cookie;
-
-   cookie = xcb_screensaver_query_info_unchecked(_ecore_xcb_conn, ((xcb_screen_t *)_ecore_xcb_screen)->root);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-#endif /* ECORE_XCB_SCREENSAVER */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_screensaver_id);
+#endif
 }
 
-
-/**
- * Gets the reply of the QueryInfo request sent by ecore_x_get_screensaver_prefetch().
- * @ingroup Ecore_X_ScrenSaver_Group
- */
-EAPI void
-ecore_x_screensaver_idle_time_fetch(void)
+void
+_ecore_xcb_screensaver_finalize(void)
 {
 #ifdef ECORE_XCB_SCREENSAVER
-   xcb_screensaver_query_info_cookie_t cookie;
-   xcb_screensaver_query_info_reply_t *reply;
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_screensaver_query_info_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-#endif /* ECORE_XCB_SCREENSAVER */
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+#ifdef ECORE_XCB_SCREENSAVER
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_screensaver_id);
+   if ((ext_reply) && (ext_reply->present))
+     {
+        xcb_screensaver_query_version_cookie_t cookie;
+        xcb_screensaver_query_version_reply_t *reply;
+
+        cookie =
+          xcb_screensaver_query_version_unchecked(_ecore_xcb_conn,
+                                                  XCB_SCREENSAVER_MAJOR_VERSION,
+                                                  XCB_SCREENSAVER_MINOR_VERSION);
+        reply =
+          xcb_screensaver_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             if ((reply->server_major_version >= XCB_SCREENSAVER_MAJOR_VERSION) &&
+                 (reply->server_minor_version >= XCB_SCREENSAVER_MINOR_VERSION))
+               _screensaver_avail = EINA_TRUE;
+
+             free(reply);
+          }
+
+        if (_screensaver_avail)
+          _ecore_xcb_event_screensaver = ext_reply->first_event;
+     }
+#endif
+}
 
-/**
- * Get the number of seconds since the last input was received.
- * @return The number of seconds.
- *
- * Get the number of milliseconds since the last input was received
- * from the user on any of the input devices.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI int
 ecore_x_screensaver_idle_time_get(void)
 {
-  int idle = 0;
+   int ret = 0;
 #ifdef ECORE_XCB_SCREENSAVER
+   xcb_screensaver_query_info_cookie_t cookie;
    xcb_screensaver_query_info_reply_t *reply;
+   Ecore_X_Window root;
+#endif
 
-   reply = _ecore_xcb_reply_get();
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (!reply) return 0;
+   if (!_screensaver_avail) return 0;
 
-   /* FIXME: check if it is ms_since_user_input or ms_until_server */
-   idle = reply->ms_since_user_input / 1000;
-#endif /* ECORE_XCB_SCREENSAVER */
+#ifdef ECORE_XCB_SCREENSAVER
+   root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   cookie = xcb_screensaver_query_info_unchecked(_ecore_xcb_conn, root);
+   reply = xcb_screensaver_query_info_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   ret = (reply->ms_until_server / 1000);
+   free(reply);
+#endif
 
-   return idle;
+   return ret;
 }
 
-
-/**
- * Set the parameters of the screen saver.
- * @param timeout  The timeout, in second.
- * @param interval The interval, in seconds.
- * @param blank    0 to disable screen blanking, otherwise enable it.
- * @param expose   Allow Expose generation event or not.
- *
- * Set the parameters of the screen saver. @p timeout is the timeout,
- * in seconds, until the screen saver turns on. @p interval is the
- * interval, in seconds, between screen saver alterations. @p blank
- * specifies how to enable screen blanking. @p expose specifies the
- * screen save control values.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI void
 ecore_x_screensaver_set(int timeout,
                         int interval,
-                        int blank,
-                        int expose)
+                        int prefer_blanking,
+                        int allow_exposures)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_screensaver_avail) return;
+
+#ifdef ECORE_XCB_SCREENSAVER
    xcb_set_screen_saver(_ecore_xcb_conn,
-                        (int16_t)timeout,
-                        (int16_t)interval,
-                        (uint8_t)blank,
-                        (uint8_t)expose);
+                        timeout, interval, prefer_blanking, allow_exposures);
+#endif
 }
 
-
-/**
- * Sends the GetScreenSaver request.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI void
-ecore_x_get_screensaver_prefetch(void)
+ecore_x_screensaver_timeout_set(int timeout)
 {
+#ifdef ECORE_XCB_SCREENSAVER
    xcb_get_screen_saver_cookie_t cookie;
+   xcb_get_screen_saver_reply_t *reply;
+   uint16_t pint;
+   uint8_t pblank, pexpo;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if (!_screensaver_avail) return;
+
+#ifdef ECORE_XCB_SCREENSAVER
    cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
+   pint = reply->interval;
+   pblank = reply->prefer_blanking;
+   pexpo = reply->allow_exposures;
+   free(reply);
+   xcb_set_screen_saver(_ecore_xcb_conn, timeout, pint, pblank, pexpo);
+#endif
 }
 
-
-/**
- * Gets the reply of the GetScreenSaver request sent by ecore_x_get_screensaver_prefetch().
- * @ingroup Ecore_X_ScrenSaver_Group
- */
-EAPI void
-ecore_x_get_screensaver_fetch(void)
+EAPI int
+ecore_x_screensaver_timeout_get(void)
 {
+   int timeout = 0;
+#ifdef ECORE_XCB_SCREENSAVER
    xcb_get_screen_saver_cookie_t cookie;
    xcb_get_screen_saver_reply_t *reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_screensaver_avail) return 0;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
+#ifdef ECORE_XCB_SCREENSAVER
+   cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
    reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
+   if (!reply) return 0;
+   timeout = reply->timeout;
+   free(reply);
+#endif
 
+   return timeout;
+}
 
-/**
- * Set the timeout of the screen saver.
- * @param  timeout The timeout to set.
- *
- * Set the @p timeout, in seconds, until the screen saver turns on.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI void
-ecore_x_screensaver_timeout_set(int timeout)
+ecore_x_screensaver_blank_set(int blank)
 {
+#ifdef ECORE_XCB_SCREENSAVER
+   xcb_get_screen_saver_cookie_t cookie;
    xcb_get_screen_saver_reply_t *reply;
+   uint16_t pint, pto;
+   uint8_t pexpo;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   xcb_set_screen_saver(_ecore_xcb_conn,
-                        (int16_t)timeout,
-                        reply->interval,
-                        reply->prefer_blanking,
-                        reply->allow_exposures);
-}
+   if (!_screensaver_avail) return;
 
+#ifdef ECORE_XCB_SCREENSAVER
+   cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
+   pto = reply->timeout;
+   pint = reply->interval;
+   pexpo = reply->allow_exposures;
+   free(reply);
+   xcb_set_screen_saver(_ecore_xcb_conn, pto, pint, blank, pexpo);
+#endif
+}
 
-/**
- * Get the timeout of the screen saver.
- * @return The timeout.
- *
- * Get the @p timeout, in seconds, until the screen saver turns on.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI int
-ecore_x_screensaver_timeout_get(void)
+ecore_x_screensaver_blank_get(void)
 {
+   int blank = 0;
+#ifdef ECORE_XCB_SCREENSAVER
+   xcb_get_screen_saver_cookie_t cookie;
    xcb_get_screen_saver_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0.0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return (int)reply->timeout;
-}
+   if (!_screensaver_avail) return 0;
 
+#ifdef ECORE_XCB_SCREENSAVER
+   cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   blank = reply->prefer_blanking;
+   free(reply);
+#endif
+
+   return blank;
+}
 
-/**
- * Set the interval of the screen saver.
- * @param  interval The interval to set.
- *
- * Set the @p interval, in seconds, between screen saver alterations.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI void
-ecore_x_screensaver_interval_set(int interval)
+ecore_x_screensaver_expose_set(int expose)
 {
+#ifdef ECORE_XCB_SCREENSAVER
+   xcb_get_screen_saver_cookie_t cookie;
    xcb_get_screen_saver_reply_t *reply;
+   uint16_t pint, pto;
+   uint8_t pblank;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   xcb_set_screen_saver(_ecore_xcb_conn,
-                        reply->timeout,
-                        (int16_t)interval,
-                        reply->prefer_blanking,
-                        reply->allow_exposures);
-}
+   if (!_screensaver_avail) return;
 
+#ifdef ECORE_XCB_SCREENSAVER
+   cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
+   pto = reply->timeout;
+   pint = reply->interval;
+   pblank = reply->prefer_blanking;
+   free(reply);
+   xcb_set_screen_saver(_ecore_xcb_conn, pto, pint, pblank, expose);
+#endif
+}
 
-/**
- * Get the interval of the screen saver.
- * @return The interval.
- *
- * Get the @p interval, in seconds, between screen saver alterations.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI int
-ecore_x_screensaver_interval_get(void)
+ecore_x_screensaver_expose_get(void)
 {
+   int expose = 0;
+#ifdef ECORE_XCB_SCREENSAVER
+   xcb_get_screen_saver_cookie_t cookie;
    xcb_get_screen_saver_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0.0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return (int)reply->interval;
-}
+   if (!_screensaver_avail) return 0;
 
+#ifdef ECORE_XCB_SCREENSAVER
+   cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   expose = reply->allow_exposures;
+   free(reply);
+#endif
+
+   return expose;
+}
 
-/**
- * Set the screen blanking.
- * @param  blank The blank to set.
- *
- * @p blank specifies how to enable screen blanking.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI void
-ecore_x_screensaver_blank_set(int blank)
+ecore_x_screensaver_interval_set(int interval)
 {
+#ifdef ECORE_XCB_SCREENSAVER
+   xcb_get_screen_saver_cookie_t cookie;
    xcb_get_screen_saver_reply_t *reply;
+   uint16_t pto;
+   uint8_t pblank, pexpose;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   xcb_set_screen_saver(_ecore_xcb_conn,
-                        reply->timeout,
-                        reply->interval,
-                        (uint8_t)blank,
-                        reply->allow_exposures);
-}
+   if (!_screensaver_avail) return;
 
+#ifdef ECORE_XCB_SCREENSAVER
+   cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
+   pto = reply->timeout;
+   pblank = reply->prefer_blanking;
+   pexpose = reply->allow_exposures;
+   free(reply);
+   xcb_set_screen_saver(_ecore_xcb_conn, pto, interval, pblank, pexpose);
+#endif
+}
 
-/**
- * Get the screen blanking.
- * @return The blanking.
- *
- * Get the screen blanking.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI int
-ecore_x_screensaver_blank_get(void)
+ecore_x_screensaver_interval_get(void)
 {
+   int interval = 0;
+#ifdef ECORE_XCB_SCREENSAVER
+   xcb_get_screen_saver_cookie_t cookie;
    xcb_get_screen_saver_reply_t *reply;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0.0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return (int)reply->prefer_blanking;
-}
+   if (!_screensaver_avail) return 0;
 
+#ifdef ECORE_XCB_SCREENSAVER
+   cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
+   reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   interval = reply->interval;
+   free(reply);
+#endif
+
+   return interval;
+}
 
-/**
- * Set the screen save control values.
- * @param  expose The expose to set.
- *
- * Set the screen save control values.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
 EAPI void
-ecore_x_screensaver_expose_set(int expose)
+ecore_x_screensaver_event_listen_set(Eina_Bool on)
 {
-   xcb_get_screen_saver_reply_t *reply;
+#ifdef ECORE_XCB_SCREENSAVER
+   Ecore_X_Window root;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   xcb_set_screen_saver(_ecore_xcb_conn,
-                        reply->timeout,
-                        reply->interval,
-                        reply->prefer_blanking,
-                        (uint8_t)expose);
-}
+   if (!_screensaver_avail) return;
 
+#ifdef ECORE_XCB_SCREENSAVER
+   root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   if (on)
+     xcb_screensaver_select_input(_ecore_xcb_conn, root,
+                                  XCB_SCREENSAVER_EVENT_NOTIFY_MASK | 
+                                  XCB_SCREENSAVER_EVENT_CYCLE_MASK);
+   else
+     xcb_screensaver_select_input(_ecore_xcb_conn, root, 0);
+#endif
+}
 
-/**
- * Get the screen save control values.
- * @return The expose.
- *
- * Get the screen save control values.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_screensaver_prefetch(), which sends the GetScreenSaver request,
- * then ecore_x_get_screensaver_fetch(), which gets the reply.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
-EAPI int
-ecore_x_screensaver_expose_get(void)
+EAPI Eina_Bool
+ecore_x_screensaver_event_available_get(void)
 {
-   xcb_get_screen_saver_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0.0;
-
-   return (int)reply->allow_exposures;
+   return _screensaver_avail;
 }
 
+EAPI Eina_Bool
+ecore_x_screensaver_custom_blanking_enable(void)
+{
+#ifdef ECORE_XCB_SCREENSAVER
+   uint32_t mask_list[9];
+   
+   xcb_screensaver_set_attributes_checked
+     (_ecore_xcb_conn,
+         ((xcb_screen_t *)_ecore_xcb_screen)->root,
+         -9999, -9999, 1, 1, 0,
+         XCB_WINDOW_CLASS_INPUT_ONLY.
+         XCB_COPY_FROM_PARENT, XCB_COPY_FROM_PARENT,
+         0, mask_list);
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
 
-/**
- * Specifies if the Screen Saver NotifyMask event should be generated.
- * @param on 0 to disable the generation of the event, otherwise enable it.
- *
- * Specifies if the Screen Saver NotifyMask event on the screen
- * associated with drawable should be generated for this client. If
- * @p on is set to @c 0, the generation is disabled, otherwise, it is
- * enabled.
- * @ingroup Ecore_X_ScrenSaver_Group
- */
-EAPI void
-ecore_x_screensaver_event_listen_set(int on)
+EAPI Eina_Bool
+ecore_x_screensaver_custom_blanking_disable(void)
 {
 #ifdef ECORE_XCB_SCREENSAVER
-   xcb_screensaver_select_input(_ecore_xcb_conn,
-                                ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                on ? XCB_SCREENSAVER_EVENT_NOTIFY_MASK : 0);
-#endif /* ECORE_XCB_SCREENSAVER */
+   xcb_screensaver_unset_attributes_checked
+     (_ecore_xcb_conn,
+         ((xcb_screen_t *)_ecore_xcb_screen)->root);
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
 }
index dd4d075..2fe148b 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
-
-static Ecore_X_Selection_Intern     selections[4];
-static Ecore_X_Selection_Converter *converters = NULL;
-static Ecore_X_Selection_Parser    *parsers = NULL;
+//#include "Ecore_X_Atoms.h"
 
-static int _ecore_x_selection_converter_text(char *target, void *data, int size, void **data_ret, int *size_ret);
-static int _ecore_x_selection_data_default_free(void *data);
-static void *_ecore_x_selection_parser_files(const char *target, void *data, int size, int format);
-static int _ecore_x_selection_data_files_free(void *data);
-static void *_ecore_x_selection_parser_text(const char *target, void *data, int size, int format);
-static int _ecore_x_selection_data_text_free(void *data);
-static void *_ecore_x_selection_parser_targets(const char *target, void *data, int size, int format);
-static int _ecore_x_selection_data_targets_free(void *data);
-
-#define ECORE_X_SELECTION_DATA(x) ((Ecore_X_Selection_Data *)(x))
+#define ECORE_XCB_SELECTION_DATA(x) ((Ecore_X_Selection_Data *)(x))
 
+/* local function prototypes */
+static void *_ecore_xcb_selection_parser_text(const char *target __UNUSED__,
+                                              void       *data,
+                                              int         size,
+                                              int         format __UNUSED__);
+static void *_ecore_xcb_selection_parser_files(const char *target,
+                                               void       *data,
+                                               int         size,
+                                               int         format __UNUSED__);
+static void *_ecore_xcb_selection_parser_targets(const char *target __UNUSED__,
+                                                 void       *data,
+                                                 int         size,
+                                                 int         format __UNUSED__);
+
+//static int _ecore_xcb_selection_data_free(void *data);
+static int       _ecore_xcb_selection_data_text_free(void *data);
+static int       _ecore_xcb_selection_data_targets_free(void *data);
+static int       _ecore_xcb_selection_data_files_free(void *data);
+static int       _ecore_xcb_selection_data_default_free(void *data);
+static Eina_Bool _ecore_xcb_selection_set(Ecore_X_Window win,
+                                          const void    *data,
+                                          int            size,
+                                          Ecore_X_Atom   selection);
+static void _ecore_xcb_selection_request(Ecore_X_Window win,
+                                         Ecore_X_Atom   selection,
+                                         const char    *target);
+static Ecore_X_Atom _ecore_xcb_selection_target_atom_get(const char *target);
+
+/* local variables */
+static Ecore_X_Selection_Intern _selections[4];
+static Ecore_X_Selection_Converter *_converters = NULL;
+static Ecore_X_Selection_Parser *_parsers = NULL;
+
+/* local functions */
 void
-_ecore_x_selection_init(void)
+_ecore_xcb_selection_init(void)
 {
-   /* Initialize global data */
-   memset(selections, 0, sizeof(selections));
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   memset(_selections, 0, sizeof(_selections));
 
-   /* Initialize converters */
+   /* init converters */
    ecore_x_selection_converter_atom_add(ECORE_X_ATOM_TEXT,
-                                       _ecore_x_selection_converter_text);
-#ifdef X_HAVE_UTF8_STRING
+                                        ecore_x_selection_converter_text);
    ecore_x_selection_converter_atom_add(ECORE_X_ATOM_UTF8_STRING,
-                                       _ecore_x_selection_converter_text);
-#endif
+                                        ecore_x_selection_converter_text);
    ecore_x_selection_converter_atom_add(ECORE_X_ATOM_COMPOUND_TEXT,
-                                       _ecore_x_selection_converter_text);
+                                        ecore_x_selection_converter_text);
    ecore_x_selection_converter_atom_add(ECORE_X_ATOM_STRING,
-                                       _ecore_x_selection_converter_text);
+                                        ecore_x_selection_converter_text);
 
-   /* Initialize parsers */
+   /* init parsers */
    ecore_x_selection_parser_add("text/plain",
-                               _ecore_x_selection_parser_text);
+                                _ecore_xcb_selection_parser_text);
    ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_UTF8_STRING,
-                               _ecore_x_selection_parser_text);
+                                _ecore_xcb_selection_parser_text);
    ecore_x_selection_parser_add("text/uri-list",
-                               _ecore_x_selection_parser_files);
+                                _ecore_xcb_selection_parser_files);
    ecore_x_selection_parser_add("_NETSCAPE_URL",
-                               _ecore_x_selection_parser_files);
+                                _ecore_xcb_selection_parser_files);
    ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_TARGETS,
-                               _ecore_x_selection_parser_targets);
+                                _ecore_xcb_selection_parser_targets);
 }
 
 void
-_ecore_x_selection_shutdown(void)
+_ecore_xcb_selection_shutdown(void)
 {
    Ecore_X_Selection_Converter *cnv;
    Ecore_X_Selection_Parser *prs;
 
-   /* free the selection converters */
-   cnv = converters;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   /* free selection converters */
+   cnv = _converters;
    while (cnv)
      {
-       Ecore_X_Selection_Converter *tmp;
+        Ecore_X_Selection_Converter *tmp;
 
-       tmp = cnv->next;
-       free(cnv);
-       cnv = tmp;
+        tmp = cnv->next;
+        free(cnv);
+        cnv = tmp;
      }
-   converters = NULL;
+   _converters = NULL;
 
-   /* free the selection parsers */
-   prs = parsers;
+   /* free parsers */
+   prs = _parsers;
    while (prs)
      {
-       Ecore_X_Selection_Parser *tmp;
+        Ecore_X_Selection_Parser *tmp;
 
-       tmp = prs;
-       prs = prs->next;
-       free(tmp->target);
-       free(tmp);
+        tmp = prs;
+        prs = prs->next;
+        free(tmp->target);
+        free(tmp);
      }
-   parsers = NULL;
+   _parsers = NULL;
 }
 
-Ecore_X_Selection_Intern *
-_ecore_x_selection_get(Ecore_X_Atom selection)
+/* public functions */
+EAPI void
+ecore_x_selection_converter_atom_add(Ecore_X_Atom                                          target,
+                                     Eina_Bool                                             (*func)(char *target,
+                                                                             void         *data,
+                                                                             int           size,
+                                                                             void        **data_ret,
+                                                                             int          *size_ret,
+                                                                             Ecore_X_Atom *type,
+                                                                             int          *size_type))
 {
-   if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
-     return &selections[0];
-   else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
-     return &selections[1];
-   else if (selection == ECORE_X_ATOM_SELECTION_XDND)
-     return &selections[2];
-   else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
-     return &selections[3];
+   Ecore_X_Selection_Converter *cnv;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   cnv = _converters;
+   if (_converters)
+     {
+        while (1)
+          {
+             if (cnv->target == target)
+               {
+                  cnv->convert = func;
+                  return;
+               }
+             if (cnv->next)
+               cnv = cnv->next;
+             else
+               break;
+          }
+        cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
+        if (!cnv->next) return;
+        cnv = cnv->next;
+     }
    else
-     return NULL;
+     {
+        _converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
+        if (!_converters) return;
+        cnv = _converters;
+     }
+   cnv->target = target;
+   cnv->convert = func;
 }
 
-
-/*
- * Sends the GetSelectionOwner request.
- */
-void
-_ecore_xcb_get_selection_owner_prefetch(Ecore_X_Atom selection)
+EAPI void
+ecore_x_selection_converter_add(char                                                 *target,
+                                Eina_Bool                                             (*func)(char *target,
+                                                                        void         *data,
+                                                                        int           size,
+                                                                        void        **date_ret,
+                                                                        int          *size_ret,
+                                                                        Ecore_X_Atom *atom_ret,
+                                                                        int          *ret))
 {
-   xcb_get_selection_owner_cookie_t cookie;
+   Ecore_X_Atom atarget;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, selection);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if ((!func) || (!target)) return;
+   atarget = _ecore_xcb_selection_target_atom_get(target);
+   ecore_x_selection_converter_atom_add(atarget, func);
 }
 
-/*
- * Gets the reply of the GetSelectionOwner request sent by _ecore_xcb_get_selection_owner_prefetch().
- */
-void
-_ecore_xcb_get_selection_owner_fetch(void)
+EAPI void
+ecore_x_selection_converter_del(char *target)
 {
-   xcb_get_selection_owner_cookie_t cookie;
-   xcb_get_selection_owner_reply_t *reply;
+   Ecore_X_Atom atarget;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!target) return;
+   atarget = _ecore_xcb_selection_target_atom_get(target);
+   ecore_x_selection_converter_atom_del(atarget);
 }
 
-/*
- * To use this function, you must call before, and in order,
- * _ecore_xcb_get_selection_owner_prefetch(), which sends the GetSelectionOwner request,
- * then _ecore_xcb_get_selection_owner_fetch(), which gets the reply.
- */
-int
-_ecore_x_selection_set(Ecore_X_Window window,
-                       const void    *data,
-                       int            size,
-                       Ecore_X_Atom   selection)
+EAPI void
+ecore_x_selection_converter_atom_del(Ecore_X_Atom target)
 {
-   xcb_get_selection_owner_reply_t *reply;
-   unsigned char                   *buf = NULL;
-   int                              in;
+   Ecore_X_Selection_Converter *conv, *pconv = NULL;
 
-   xcb_set_selection_owner(_ecore_xcb_conn, window, selection, _ecore_xcb_event_last_time);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply || (reply->owner != window)) return 0;
+   conv = _converters;
+   while (conv)
+     {
+        if (conv->target == target)
+          {
+             if (pconv)
+               pconv->next = conv->next;
+             else
+               _converters = conv->next;
+             free(conv);
+             return;
+          }
+        pconv = conv;
+        conv = conv->next;
+     }
+}
 
-   if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
-     in = 0;
-   else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
-     in = 1;
-   else if (selection == ECORE_X_ATOM_SELECTION_XDND)
-     in = 2;
-   else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
-     in = 3;
-   else
-     return 0;
+EAPI void
+ecore_x_selection_parser_add(const char *target,
+                             void *(*func)(const char *target, void *data, int size, int format))
+{
+   Ecore_X_Selection_Parser *prs;
 
-   if (data)
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!target) return;
+   prs = _parsers;
+   if (prs)
      {
-       selections[in].win = window;
-       selections[in].selection = selection;
-       selections[in].length = size;
-       selections[in].time = _ecore_xcb_event_last_time;
-
-       buf = malloc(size);
-       memcpy(buf, data, size);
-       selections[in].data = buf;
+        while (prs->next)
+          {
+             if (!strcmp(prs->target, target))
+               {
+                  prs->parse = func;
+                  return;
+               }
+             prs = prs->next;
+          }
+        prs->next = calloc(1, sizeof(Ecore_X_Selection_Parser));
+        prs = prs->next;
      }
    else
      {
-       if (selections[in].data)
-         {
-            free(selections[in].data);
-            memset(&selections[in], 0, sizeof(Ecore_X_Selection_Data));
-         }
+        _parsers = calloc(1, sizeof(Ecore_X_Selection_Parser));
+        prs = _parsers;
      }
-
-   return 1;
+   prs->target = strdup(target);
+   prs->parse = func;
 }
 
-
-/**
- * Sends the GetSelectionOwner request.
- */
 EAPI void
-ecore_x_selection_primary_prefetch(void)
+ecore_x_selection_parser_del(const char *target)
 {
-   xcb_get_selection_owner_cookie_t cookie;
+   Ecore_X_Selection_Parser *prs, *pprs = NULL;
 
-   cookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, ECORE_X_ATOM_SELECTION_PRIMARY);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/**
- * Gets the reply of the GetSelectionOwner request sent by ecore_x_selection_primary_prefetch().
- */
-EAPI void
-ecore_x_selection_primary_fetch(void)
-{
-   xcb_get_selection_owner_cookie_t cookie;
-   xcb_get_selection_owner_reply_t *reply;
+   if (!target) return;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   prs = _parsers;
+   while (prs)
+     {
+        if (!strcmp(prs->target, target))
+          {
+             if (pprs)
+               pprs->next = prs->next;
+             else
+               _parsers = prs->next;
+             free(prs->target);
+             free(prs);
+             return;
+          }
+        pprs = prs;
+        prs = prs->next;
+     }
 }
 
 /**
  * Claim ownership of the PRIMARY selection and set its data.
- * @param window The window to which this selection belongs
- * @param data   The data associated with the selection
- * @param size   The size of the data buffer in bytes
- * @return       Returns 1 if the ownership of the selection was successfully
- *               claimed, or 0 if unsuccessful.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_primary_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_primary_fetch(), which gets the reply.
+ * @param w    The window to which this selection belongs
+ * @param data The data associated with the selection
+ * @param size The size of the data buffer in bytes
+ * @return     Returns 1 if the ownership of the selection was successfully
+ *             claimed, or 0 if unsuccessful.
  */
-EAPI int
-ecore_x_selection_primary_set(Ecore_X_Window window,
+EAPI Eina_Bool
+ecore_x_selection_primary_set(Ecore_X_Window win,
                               const void    *data,
                               int            size)
 {
-   return _ecore_x_selection_set(window, data, size, ECORE_X_ATOM_SELECTION_PRIMARY);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_selection_set(win, data, size,
+                                   ECORE_X_ATOM_SELECTION_PRIMARY);
 }
 
 /**
  * Release ownership of the primary selection
  * @return     Returns 1 if the selection was successfully cleared,
  *             or 0 if unsuccessful.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_primary_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_primary_fetch(), which gets the reply.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_selection_primary_clear(void)
 {
-   return _ecore_x_selection_set(XCB_NONE, NULL, 0, ECORE_X_ATOM_SELECTION_PRIMARY);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-
-/**
- * Sends the GetSelectionOwner request.
- */
-EAPI void
-ecore_x_selection_secondary_prefetch(void)
-{
-   xcb_get_selection_owner_cookie_t cookie;
-
-   cookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, ECORE_X_ATOM_SELECTION_SECONDARY);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
+                                   ECORE_X_ATOM_SELECTION_PRIMARY);
 }
 
-/**
- * Gets the reply of the GetSelectionOwner request sent by ecore_x_selection_secondary_prefetch().
- */
 EAPI void
-ecore_x_selection_secondary_fetch(void)
+ecore_x_selection_primary_request(Ecore_X_Window win,
+                                  const char    *target)
 {
-   xcb_get_selection_owner_cookie_t cookie;
-   xcb_get_selection_owner_reply_t *reply;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   _ecore_xcb_selection_request(win, ECORE_X_ATOM_SELECTION_PRIMARY, target);
 }
 
-
 /**
  * Claim ownership of the SECONDARY selection and set its data.
- * @param window The window to which this selection belongs
- * @param data   The data associated with the selection
- * @param size   The size of the data buffer in bytes
- * @return       Returns 1 if the ownership of the selection was successfully
- *               claimed, or 0 if unsuccessful.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_secondary_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_secondary_fetch(), which gets the reply.
+ * @param w    The window to which this selection belongs
+ * @param data The data associated with the selection
+ * @param size The size of the data buffer in bytes
+ * @return     Returns 1 if the ownership of the selection was successfully
+ *             claimed, or 0 if unsuccessful.
  */
-EAPI int
-ecore_x_selection_secondary_set(Ecore_X_Window window,
+EAPI Eina_Bool
+ecore_x_selection_secondary_set(Ecore_X_Window win,
                                 const void    *data,
                                 int            size)
 {
-   return _ecore_x_selection_set(window, data, size, ECORE_X_ATOM_SELECTION_SECONDARY);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_selection_set(win, data, size,
+                                   ECORE_X_ATOM_SELECTION_SECONDARY);
 }
 
 /**
  * Release ownership of the secondary selection
  * @return     Returns 1 if the selection was successfully cleared,
  *             or 0 if unsuccessful.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_secondary_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_secondary_fetch(), which gets the reply.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_selection_secondary_clear(void)
 {
-   return _ecore_x_selection_set(XCB_NONE, NULL, 0, ECORE_X_ATOM_SELECTION_SECONDARY);
-}
-
-
-/**
- * Sends the GetSelectionOwner request.
- */
-EAPI void
-ecore_x_selection_xdnd_prefetch(void)
-{
-   xcb_get_selection_owner_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, ECORE_X_ATOM_SELECTION_XDND);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
+                                   ECORE_X_ATOM_SELECTION_SECONDARY);
 }
 
-/**
- * Gets the reply of the GetSelectionOwner request sent by ecore_x_selection_xdnd_prefetch().
- */
 EAPI void
-ecore_x_selection_xdnd_fetch(void)
+ecore_x_selection_secondary_request(Ecore_X_Window win,
+                                    const char    *target)
 {
-   xcb_get_selection_owner_cookie_t cookie;
-   xcb_get_selection_owner_reply_t *reply;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   _ecore_xcb_selection_request(win, ECORE_X_ATOM_SELECTION_SECONDARY, target);
 }
 
 /**
  * Claim ownership of the XDND selection and set its data.
- * @param window The window to which this selection belongs
- * @param data   The data associated with the selection
- * @param size   The size of the data buffer in bytes
- * @return       Returns 1 if the ownership of the selection was successfully
- *               claimed, or 0 if unsuccessful.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_xdnd_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_xdnd_fetch(), which gets the reply.
+ * @param w    The window to which this selection belongs
+ * @param data The data associated with the selection
+ * @param size The size of the data buffer in bytes
+ * @return     Returns 1 if the ownership of the selection was successfully
+ *             claimed, or 0 if unsuccessful.
  */
-EAPI int
-ecore_x_selection_xdnd_set(Ecore_X_Window window,
+EAPI Eina_Bool
+ecore_x_selection_xdnd_set(Ecore_X_Window win,
                            const void    *data,
                            int            size)
 {
-   return _ecore_x_selection_set(window, data, size, ECORE_X_ATOM_SELECTION_XDND);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_selection_set(win, data, size,
+                                   ECORE_X_ATOM_SELECTION_XDND);
 }
 
 /**
  * Release ownership of the XDND selection
  * @return     Returns 1 if the selection was successfully cleared,
  *             or 0 if unsuccessful.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_xdnd_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_xdnd_fetch(), which gets the reply.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_selection_xdnd_clear(void)
 {
-   return _ecore_x_selection_set(XCB_NONE, NULL, 0, ECORE_X_ATOM_SELECTION_XDND);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
+                                   ECORE_X_ATOM_SELECTION_XDND);
+}
 
-/**
- * Sends the GetSelectionOwner request.
- */
 EAPI void
-ecore_x_selection_clipboard_prefetch(void)
+ecore_x_selection_xdnd_request(Ecore_X_Window win,
+                               const char    *target)
 {
-   xcb_get_selection_owner_cookie_t cookie;
+   Ecore_X_Atom atom;
+   Ecore_X_DND_Target *_target;
 
-   cookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, ECORE_X_ATOM_SELECTION_CLIPBOARD);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/**
- * Gets the reply of the GetSelectionOwner request sent by ecore_x_selection_clipboard_prefetch().
- */
-EAPI void
-ecore_x_selection_clipboard_fetch(void)
-{
-   xcb_get_selection_owner_cookie_t cookie;
-   xcb_get_selection_owner_reply_t *reply;
+   _target = _ecore_xcb_dnd_target_get();
+   atom = _ecore_xcb_selection_target_atom_get(target);
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   xcb_convert_selection(_ecore_xcb_conn, win, ECORE_X_ATOM_SELECTION_XDND,
+                         atom, ECORE_X_ATOM_SELECTION_PROP_XDND, _target->time);
 }
 
 /**
  * Claim ownership of the CLIPBOARD selection and set its data.
- * @param window The window to which this selection belongs
- * @param data   The data associated with the selection
- * @param size   The size of the data buffer in bytes
- * @return       Returns 1 if the ownership of the selection was successfully
- *               claimed, or 0 if unsuccessful.
+ * @param w    The window to which this selection belongs
+ * @param data The data associated with the selection
+ * @param size The size of the data buffer in bytes
+ * @return     Returns 1 if the ownership of the selection was successfully
+ *             claimed, or 0 if unsuccessful.
  *
  * Get the converted data from a previous CLIPBOARD selection
  * request. The buffer must be freed when done with.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_clipboard_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_clipboard_fetch(), which gets the reply.
  */
-EAPI int
-ecore_x_selection_clipboard_set(Ecore_X_Window window,
+EAPI Eina_Bool
+ecore_x_selection_clipboard_set(Ecore_X_Window win,
                                 const void    *data,
                                 int            size)
 {
-   return _ecore_x_selection_set(window, data, size, ECORE_X_ATOM_SELECTION_CLIPBOARD);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_selection_set(win, data, size,
+                                   ECORE_X_ATOM_SELECTION_CLIPBOARD);
 }
 
 /**
  * Release ownership of the clipboard selection
  * @return     Returns 1 if the selection was successfully cleared,
  *             or 0 if unsuccessful.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_selection_clipboard_prefetch(), which sends the GetSelectionOwner request,
- * then ecore_x_selection_clipboard_fetch(), which gets the reply.
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_selection_clipboard_clear(void)
 {
-   return _ecore_x_selection_set(XCB_NONE, NULL, 0, ECORE_X_ATOM_SELECTION_CLIPBOARD);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
+                                   ECORE_X_ATOM_SELECTION_CLIPBOARD);
+}
 
-/* FIXME: roundtrip if target is not handled in the tests */
-Ecore_X_Atom
-_ecore_x_selection_target_atom_get(const char *target)
+EAPI void
+ecore_x_selection_clipboard_request(Ecore_X_Window win,
+                                    const char    *target)
 {
-   Ecore_X_Atom x_target = XCB_NONE;
-
-   if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
-     x_target = ECORE_X_ATOM_TEXT;
-   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
-     x_target = ECORE_X_ATOM_COMPOUND_TEXT;
-   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
-     x_target = ECORE_X_ATOM_STRING;
-   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
-     x_target = ECORE_X_ATOM_UTF8_STRING;
-   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
-     x_target = ECORE_X_ATOM_FILE_NAME;
-   else
-     {
-        xcb_intern_atom_cookie_t cookie;
-        xcb_intern_atom_reply_t *reply;
-
-        cookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
-                                           strlen(target), target);
-        reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
-        if (!reply)
-          return XCB_NONE;
-       x_target = reply->atom;
-        free(reply);
-     }
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   return x_target;
+   _ecore_xcb_selection_request(win, ECORE_X_ATOM_SELECTION_CLIPBOARD, target);
 }
 
-
-/* FIXME: roundtrip if target is not handled in the tests */
-char *
-_ecore_x_selection_target_get(Ecore_X_Atom target)
+EAPI Eina_Bool
+ecore_x_selection_convert(Ecore_X_Atom  selection,
+                          Ecore_X_Atom  target,
+                          void        **data_ret,
+                          int          *size,
+                          Ecore_X_Atom *targtype,
+                          int          *typesize)
 {
-   if (target == ECORE_X_ATOM_FILE_NAME)
-     return strdup(ECORE_X_SELECTION_TARGET_FILENAME);
-   else if (target == ECORE_X_ATOM_STRING)
-     return strdup(ECORE_X_SELECTION_TARGET_STRING);
-   else if (target == ECORE_X_ATOM_UTF8_STRING)
-     return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
-   else if (target == ECORE_X_ATOM_TEXT)
-     return strdup(ECORE_X_SELECTION_TARGET_TEXT);
-   else
-     {
-        xcb_get_atom_name_cookie_t cookie;
-        xcb_get_atom_name_reply_t *reply;
-        char                      *name;
+   Ecore_X_Selection_Intern *sel;
+   Ecore_X_Selection_Converter *cnv;
+   void *data;
+   char *tgt_str;
 
-        cookie = xcb_get_atom_name_unchecked(_ecore_xcb_conn, target);
-        reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookie, NULL);
-        if (!reply)
-          return NULL;
-        name = (char *)malloc(sizeof(char) * (reply->length + 1));
-        if (!name)
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   sel = _ecore_xcb_selection_get(selection);
+   tgt_str = _ecore_xcb_selection_target_get(target);
+
+   for (cnv = _converters; cnv; cnv = cnv->next)
+     {
+        if (cnv->target == target)
           {
-             free(reply);
-             return NULL;
+             int r = 0;
+
+             r = cnv->convert(tgt_str, sel->data, sel->length, &data, size,
+                              targtype, typesize);
+             free(tgt_str);
+             if (r)
+               {
+                  if (data_ret) *data_ret = data;
+                  return r;
+               }
+             else
+               return EINA_FALSE;
           }
-        memcpy(name, xcb_get_atom_name_name(reply), reply->length);
-        name[reply->length] = '\0';
-        free(reply);
-        return name;
      }
+
+   return EINA_FALSE;
 }
 
-static void
-_ecore_x_selection_request(Ecore_X_Window window,
-                           Ecore_X_Atom   selection,
-                           const char    *target_str)
+EAPI Eina_Bool
+ecore_x_selection_notify_send(Ecore_X_Window requestor,
+                              Ecore_X_Atom   selection,
+                              Ecore_X_Atom   target,
+                              Ecore_X_Atom   property,
+                              Ecore_X_Time   tim)
 {
-   Ecore_X_Atom target, prop;
+   xcb_selection_notify_event_t ev;
 
-   target = _ecore_x_selection_target_atom_get(target_str);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
-     prop = ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
-   else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
-     prop = ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
-   else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
-     prop = ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
-   else
-     return;
+   memset(&ev, 0, sizeof(xcb_selection_notify_event_t));
 
-   xcb_convert_selection(_ecore_xcb_conn, window,
-                         selection, target, prop,
-                         XCB_CURRENT_TIME);
-}
+   ev.response_type = XCB_SELECTION_NOTIFY;
+   ev.requestor = requestor;
+   ev.selection = selection;
+   ev.target = target;
+   ev.property = property;
+   ev.time = tim;
 
-EAPI void
-ecore_x_selection_primary_request(Ecore_X_Window window,
-                                  const char    *target)
-{
-   _ecore_x_selection_request(window, ECORE_X_ATOM_SELECTION_PRIMARY, target);
-}
+   xcb_send_event(_ecore_xcb_conn, 0, requestor,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
 
-EAPI void
-ecore_x_selection_secondary_request(Ecore_X_Window window,
-                                    const char    *target)
-{
-   _ecore_x_selection_request(window, ECORE_X_ATOM_SELECTION_SECONDARY, target);
+   return EINA_TRUE;
 }
 
 EAPI void
-ecore_x_selection_xdnd_request(Ecore_X_Window window,
-                               const char    *target)
+ecore_x_selection_owner_set(Ecore_X_Window win,
+                            Ecore_X_Atom   atom,
+                            Ecore_X_Time   tim)
 {
-   Ecore_X_Atom        atom;
-   Ecore_X_DND_Target *_target;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   _target = _ecore_x_dnd_target_get();
-   atom = _ecore_x_selection_target_atom_get(target);
-   xcb_convert_selection(_ecore_xcb_conn, window,
-                         ECORE_X_ATOM_SELECTION_XDND, atom,
-                         ECORE_X_ATOM_SELECTION_PROP_XDND,
-                         _target->time);
+   xcb_set_selection_owner(_ecore_xcb_conn, win, atom, tim);
 }
 
-EAPI void
-ecore_x_selection_clipboard_request(Ecore_X_Window window, const char *target)
+EAPI Ecore_X_Window
+ecore_x_selection_owner_get(Ecore_X_Atom atom)
 {
-   _ecore_x_selection_request(window, ECORE_X_ATOM_SELECTION_CLIPBOARD, target);
-}
+   xcb_get_selection_owner_cookie_t cookie;
+   xcb_get_selection_owner_reply_t *reply;
+   Ecore_X_Window ret;
 
-EAPI void
-ecore_x_selection_converter_atom_add(Ecore_X_Atom target,
-                                     int        (*func)(char  *target,
-                                                        void  *data,
-                                                        int    size,
-                                                        void **data_ret,
-                                                        int   *size_ret))
-{
-   Ecore_X_Selection_Converter *cnv;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cnv = converters;
-   if (converters)
-     {
-       while (1)
-         {
-            if (cnv->target == target)
-              {
-                 cnv->convert = func;
-                 return;
-              }
-            if (cnv->next)
-              cnv = cnv->next;
-            else
-              break;
-         }
-
-       cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
-       cnv = cnv->next;
-     }
-   else
-     {
-       converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
-       cnv = converters;
-     }
-   cnv->target = target;
-   cnv->convert = func;
+   cookie = xcb_get_selection_owner(_ecore_xcb_conn, atom);
+   reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   ret = reply->owner;
+   free(reply);
+   return ret;
 }
 
-EAPI void
-ecore_x_selection_converter_add(char *target,
-                                int (*func)(char  *target,
-                                            void  *data,
-                                            int    size,
-                                            void **data_ret,
-                                            int   *size_ret))
+void *
+_ecore_xcb_selection_parse(const char *target,
+                           void       *data,
+                           int         size,
+                           int         format)
 {
-   Ecore_X_Atom x_target;
+   Ecore_X_Selection_Parser *prs;
+   Ecore_X_Selection_Data *sel;
 
-   if (!func || !target)
-     return;
+   for (prs = _parsers; prs; prs = prs->next)
+     {
+        if (!strcmp(prs->target, target))
+          {
+             sel = prs->parse(target, data, size, format);
+             if (sel) return sel;
+          }
+     }
 
-   x_target = _ecore_x_selection_target_atom_get(target);
+   sel = calloc(1, sizeof(Ecore_X_Selection_Data));
+   if (!sel) return NULL;
+   sel->free = _ecore_xcb_selection_data_default_free;
+   sel->length = size;
+   sel->format = format;
+   sel->data = data;
 
-   ecore_x_selection_converter_atom_add(x_target, func);
+   return sel;
 }
 
-EAPI void
-ecore_x_selection_converter_atom_del(Ecore_X_Atom target)
+Ecore_X_Selection_Intern *
+_ecore_xcb_selection_get(Ecore_X_Atom selection)
 {
-   Ecore_X_Selection_Converter *cnv, *prev_cnv;
-
-   prev_cnv = NULL;
-   cnv = converters;
-
-   while (cnv)
-     {
-       if (cnv->target == target)
-         {
-            if (prev_cnv)
-              prev_cnv->next = cnv->next;
-            else
-              converters = cnv->next; /* This was the first converter */
-            free(cnv);
-
-            return;
-         }
-       prev_cnv = cnv;
-       cnv = cnv->next;
-     }
+   if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
+     return &_selections[0];
+   else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
+     return &_selections[1];
+   else if (selection == ECORE_X_ATOM_SELECTION_XDND)
+     return &_selections[2];
+   else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
+     return &_selections[3];
+   else
+     return NULL;
 }
 
-EAPI void
-ecore_x_selection_converter_del(char *target)
+/* local functions */
+static Eina_Bool
+_ecore_xcb_selection_set(Ecore_X_Window win,
+                         const void    *data,
+                         int            size,
+                         Ecore_X_Atom   selection)
 {
-   Ecore_X_Atom x_target;
+   xcb_get_selection_owner_cookie_t cookie;
+   xcb_get_selection_owner_reply_t *reply;
+   int in = 0;
 
-   if (!target)
-     return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   x_target = _ecore_x_selection_target_atom_get(target);
-   ecore_x_selection_converter_atom_del(x_target);
-}
+   xcb_set_selection_owner(_ecore_xcb_conn, win, selection, XCB_CURRENT_TIME);
 
-EAPI int
-ecore_x_selection_notify_send(Ecore_X_Window requestor,
-                              Ecore_X_Atom   selection,
-                              Ecore_X_Atom   target,
-                              Ecore_X_Atom   property,
-                              Ecore_X_Time   time)
-{
-   xcb_selection_notify_event_t ev;
+   cookie = xcb_get_selection_owner(_ecore_xcb_conn, selection);
+   reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
-   ev.time = time;
-   ev.requestor = requestor;
-   ev.selection = selection;
-   ev.target = target;
-   ev.property = property;
-   /* send_event is bit 7 (0x80) of response_type */
-   ev.response_type = 0x80;
+   if (reply->owner != win)
+     {
+        free(reply);
+        return EINA_FALSE;
+     }
+   free(reply);
 
-   xcb_send_event(_ecore_xcb_conn, 0,
-                  requestor, 0, (const char *)&ev);
-   return 1;
-}
+   if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
+     in = 0;
+   else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
+     in = 1;
+   else if (selection == ECORE_X_ATOM_SELECTION_XDND)
+     in = 2;
+   else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
+     in = 3;
+   else
+     return EINA_FALSE;
 
-/* Locate and run conversion callback for specified selection target */
-EAPI int
-ecore_x_selection_convert(Ecore_X_Atom selection,
-                          Ecore_X_Atom target,
-                          void       **data_ret)
-{
-   Ecore_X_Selection_Intern    *sel;
-   Ecore_X_Selection_Converter *cnv;
-   void                        *data;
-   char                        *tgt_str;
-   int                          size;
+   if (data)
+     {
+        unsigned char *buff = NULL;
 
-   sel = _ecore_x_selection_get(selection);
-   tgt_str = _ecore_x_selection_target_get(target);
+        _selections[in].win = win;
+        _selections[in].selection = selection;
+        _selections[in].length = size;
+        _selections[in].time = _ecore_xcb_events_last_time_get();
 
-   for (cnv = converters; cnv; cnv = cnv->next)
+        buff = malloc(size);
+        if (!buff) return EINA_FALSE;
+        memcpy(buff, data, size);
+        _selections[in].data = buff;
+     }
+   else if (_selections[in].data)
      {
-       if (cnv->target == target)
-         {
-            int r;
-            r = cnv->convert(tgt_str, sel->data, sel->length, &data, &size);
-            free(tgt_str);
-            if (r)
-              {
-                 *data_ret = data;
-                 return r;
-              }
-            else
-              return 0;
-         }
+        free(_selections[in].data);
+        memset(&_selections[in], 0, sizeof(Ecore_X_Selection_Data));
      }
 
-   /* Default, just return the data */
-   *data_ret = malloc(sel->length);
-   memcpy(*data_ret, sel->data, sel->length);
-   free(tgt_str);
-   return 1;
+   return EINA_TRUE;
 }
 
-/* TODO: We need to work out a mechanism for automatic conversion to any requested
- * locale using Ecore_Txt functions */
-/* Converter for standard non-utf8 text targets */
-static int
-_ecore_x_selection_converter_text(char *target, void *data, int size, void **data_ret, int *size_ret)
+static void
+_ecore_xcb_selection_request(Ecore_X_Window win,
+                             Ecore_X_Atom   selection,
+                             const char    *target)
 {
+   Ecore_X_Atom atarget, prop;
 
-  /* FIXME: to do... */
-
-/*    XTextProperty text_prop; */
-/*    char *mystr; */
-/*    XICCEncodingStyle style; */
-
-/*    if (!data || !size) */
-/*      return 0; */
-
-/*    if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT)) */
-/*      style = XTextStyle; */
-/*    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT)) */
-/*      style = XCompoundTextStyle; */
-/*    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING)) */
-/*      style = XStringStyle; */
-/* #ifdef X_HAVE_UTF8_STRING */
-/*    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING)) */
-/*      style = XUTF8StringStyle; */
-/* #endif */
-/*    else */
-/*      return 0; */
-
-/*    if (!(mystr = strdup(data))) */
-/*      return 0; */
-
-/* #ifdef X_HAVE_UTF8_STRING */
-/*    if (Xutf8TextListToTextProperty(_ecore_x_disp, &mystr, 1, style, &text_prop) == Success) */
-/*      { */
-/*     int bufsize = strlen((char *)text_prop.value) + 1; */
-/*     *data_ret = malloc(bufsize); */
-/*     memcpy(*data_ret, text_prop.value, bufsize); */
-/*     *size_ret = bufsize; */
-/*     XFree(text_prop.value); */
-/*     free(mystr); */
-/*     return 1; */
-/*      } */
-/* #else */
-/*    if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style, &text_prop) == Success) */
-/*      { */
-/*     int bufsize = strlen(text_prop.value) + 1; */
-/*     *data_ret = malloc(bufsize); */
-/*     memcpy(*data_ret, text_prop.value, bufsize); */
-/*     *size_ret = bufsize; */
-/*     XFree(text_prop.value); */
-/*     free(mystr); */
-/*     return 1; */
-/*      } */
-/* #endif */
-/*    else */
-/*      { */
-/*     free(mystr); */
-/*     return 0; */
-/*      } */
-
-  return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
+     prop = ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
+   else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
+     prop = ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
+   else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
+     prop = ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
+   else
+     return;
+
+   atarget = _ecore_xcb_selection_target_atom_get(target);
+
+   xcb_convert_selection(_ecore_xcb_conn, win, selection, atarget, prop,
+                         XCB_CURRENT_TIME);
 }
 
-EAPI void
-ecore_x_selection_parser_add(const char *target,
-                             void     *(*func)(const char *target,
-                                               void       *data,
-                                               int         size,
-                                               int         format))
+EAPI Eina_Bool
+ecore_x_selection_converter_text(char         *target,
+                                 void         *data,
+                                 int           size,
+                                 void        **data_ret,
+                                 int          *size_ret,
+                                 Ecore_X_Atom *type __UNUSED__,
+                                 int          *size_type __UNUSED__)
 {
-   Ecore_X_Selection_Parser *prs;
+   Ecore_Xcb_Encoding_Style style;
+   Ecore_Xcb_Textproperty ret;
+   char *str;
 
-   if (!target)
-     return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!data) || (!size)) return EINA_FALSE;
 
-   prs = parsers;
-   if (parsers)
+   if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
+     style = XcbTextStyle;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
+     style = XcbCompoundTextStyle;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
+     style = XcbStringStyle;
+#ifdef HAVE_ICONV
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
+     style = XcbUTF8StringStyle;
+#endif
+   else
+     return EINA_FALSE;
+
+   str = alloca(size + 1);
+   memcpy(str, data, size);
+   str[size] = '\0';
+
+#ifdef HAVE_ICONV
+   if (_ecore_xcb_utf8_textlist_to_textproperty(&str, 1, style, &ret))
      {
-       while (prs->next)
-         {
-            if (!strcmp(prs->target, target))
-              {
-                 prs->parse = func;
-                 return;
-              }
-            prs = prs->next;
-         }
-
-       prs->next = calloc(1, sizeof(Ecore_X_Selection_Parser));
-       prs = prs->next;
+        int size = 0;
+
+        size = (strlen((char *)ret.value) + 1);
+        *data_ret = malloc(size);
+        if (!*data_ret) return EINA_FALSE;
+        memcpy(*data_ret, ret.value, size);
+        *size_ret = size;
+        if (ret.value) free(ret.value);
+        return EINA_TRUE;
      }
-   else
+#else
+   if (_ecore_xcb_mb_textlist_to_textproperty(&str, 1, style, &ret))
      {
-       parsers = calloc(1, sizeof(Ecore_X_Selection_Parser));
-       prs = parsers;
+        int size = 0;
+
+        size = (strlen((char *)ret.value) + 1);
+        *data_ret = malloc(size);
+        if (!*data_ret) return EINA_FALSE;
+        memcpy(*data_ret, ret.value, size);
+        *size_ret = size;
+        if (ret.value) free(ret.value);
+        return EINA_TRUE;
      }
-   prs->target = strdup(target);
-   prs->parse = func;
+#endif
+   else
+     return EINA_TRUE;
 }
 
-EAPI void
-ecore_x_selection_parser_del(const char *target)
+static void *
+_ecore_xcb_selection_parser_text(const char *target __UNUSED__,
+                                 void       *data,
+                                 int         size,
+                                 int         format __UNUSED__)
 {
-   Ecore_X_Selection_Parser *prs, *prev_prs;
-
-   if (!target)
-     return;
+   Ecore_X_Selection_Data_Text *sel;
+   unsigned char *_data;
+   void *t;
 
-   prev_prs = NULL;
-   prs = parsers;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   while (prs)
-     {
-       if (!strcmp(prs->target, target))
-         {
-            if (prev_prs)
-              prev_prs->next = prs->next;
-            else
-              parsers = prs->next; /* This was the first parser */
-            free(prs->target);
-            free(prs);
-
-            return;
-         }
-       prev_prs = prs;
-       prs = prs->next;
-     }
-}
+   if (!(_data = data)) return NULL;
 
-/* Locate and run conversion callback for specified selection target */
-void *
-_ecore_x_selection_parse(const char *target, void *data, int size, int format)
-{
-   Ecore_X_Selection_Parser *prs;
-   Ecore_X_Selection_Data *sel;
+   sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text));
+   if (!sel) return NULL;
 
-   for (prs = parsers; prs; prs = prs->next)
+   if (_data[size - 1])
      {
-       if (!strcmp(prs->target, target))
-         {
-            sel = prs->parse(target, data, size, format);
-            return sel;
-         }
+        size++;
+        t = realloc(_data, size);
+        if (!t)
+          {
+             free(sel);
+             return NULL;
+          }
+        _data = t;
+        _data[size - 1] = 0;
      }
-
-   /* Default, just return the data */
-   sel = calloc(1, sizeof(Ecore_X_Selection_Data));
-   sel->free = _ecore_x_selection_data_default_free;
-   sel->length = size;
-   sel->format = format;
-   sel->data = data;
+   sel->text = (char *)_data;
+   ECORE_XCB_SELECTION_DATA(sel)->length = size;
+   ECORE_XCB_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TEXT;
+   ECORE_XCB_SELECTION_DATA(sel)->data = _data;
+   ECORE_XCB_SELECTION_DATA(sel)->free = _ecore_xcb_selection_data_text_free;
    return sel;
 }
 
-static int
-_ecore_x_selection_data_default_free(void *data)
-{
-   Ecore_X_Selection_Data *sel;
-
-   sel = data;
-   free(sel->data);
-   free(sel);
-   return 1;
-}
-
 static void *
-_ecore_x_selection_parser_files(const char *target, void *_data, int size, int format __UNUSED__)
+_ecore_xcb_selection_parser_files(const char *target,
+                                  void       *data,
+                                  int         size,
+                                  int         format __UNUSED__)
 {
    Ecore_X_Selection_Data_Files *sel;
-   char *data = _data;
-   int i, is;
-   char *tmp;
+   char *_data, *tmp, *t, **t2;
+   int i = 0, is = 0;
 
-   if (strcmp(target, "text/uri-list") &&
-       strcmp(target, "_NETSCAPE_URL"))
-     return NULL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if ((strcmp(target, "text/uri-list")) &&
+       (strcmp(target, "_NETSCAPE_URL"))) return NULL;
+
+   if (!(_data = data)) return NULL;
 
    sel = calloc(1, sizeof(Ecore_X_Selection_Data_Files));
-   ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_files_free;
+   if (!sel) return NULL;
 
-   if (data[size - 1])
+   ECORE_XCB_SELECTION_DATA(sel)->free = _ecore_xcb_selection_data_files_free;
+
+   if (_data[size - 1])
      {
-       /* Isn't nul terminated */
-       size++;
-       data = realloc(data, size);
-       data[size - 1] = 0;
+        size++;
+        t = realloc(_data, size);
+        if (!t)
+          {
+             free(sel);
+             return NULL;
+          }
+        _data = t;
+        _data[size - 1] = 0;
      }
 
    tmp = malloc(size);
-   i = 0;
-   is = 0;
-   while ((is < size) && (data[is]))
+   if (!tmp)
+     {
+        free(sel);
+        return NULL;
+     }
+
+   while ((is < size) && (_data[is]))
      {
-       if ((i == 0) && (data[is] == '#'))
-         {
-            for (; ((data[is]) && (data[is] != '\n')); is++);
-         }
-       else
-         {
-            if ((data[is] != '\r') &&
-                (data[is] != '\n'))
-              {
-                 tmp[i++] = data[is++];
-              }
-            else
-              {
-                 while ((data[is] == '\r') || (data[is] == '\n')) is++;
-                 tmp[i] = 0;
-                 sel->num_files++;
-                 sel->files = realloc(sel->files, sel->num_files * sizeof(char *));
-                 sel->files[sel->num_files - 1] = strdup(tmp);
-                 tmp[0] = 0;
-                 i = 0;
-              }
-         }
+        if ((i == 0) && (_data[is] == '#'))
+          {
+             for (; ((_data[is]) && (_data[is] != '\n')); is++) ;
+          }
+        else
+          {
+             if ((_data[is] != '\r') && (_data[is] != '\n'))
+               tmp[i++] = _data[is++];
+             else
+               {
+                  while ((_data[is] == '\r') || (_data[is] == '\n'))
+                    is++;
+                  tmp[i] = 0;
+                  sel->num_files++;
+                  t2 = realloc(sel->files, sel->num_files * sizeof(char *));
+                  if (t2)
+                    {
+                       sel->files = t2;
+                       sel->files[sel->num_files - 1] = strdup(tmp);
+                    }
+                  tmp[0] = 0;
+                  i = 0;
+               }
+          }
      }
    if (i > 0)
      {
-       tmp[i] = 0;
-       sel->num_files++;
-       sel->files = realloc(sel->files, sel->num_files * sizeof(char *));
-       sel->files[sel->num_files - 1] = strdup(tmp);
+        tmp[i] = 0;
+        sel->num_files++;
+        t2 = realloc(sel->files, sel->num_files * sizeof(char *));
+        if (t2)
+          {
+             sel->files = t2;
+             sel->files[sel->num_files - 1] = strdup(tmp);
+          }
      }
-   free(tmp);
-   free(data);
+   if (tmp) free(tmp);
+   if (_data) free(_data);
 
-   ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_FILES;
-   ECORE_X_SELECTION_DATA(sel)->length = sel->num_files;
+   ECORE_XCB_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_FILES;
+   ECORE_XCB_SELECTION_DATA(sel)->length = sel->num_files;
 
-   return ECORE_X_SELECTION_DATA(sel);
+   return ECORE_XCB_SELECTION_DATA(sel);
 }
 
-static int
-_ecore_x_selection_data_files_free(void *data)
+static void *
+_ecore_xcb_selection_parser_targets(const char *target __UNUSED__,
+                                    void       *data,
+                                    int         size,
+                                    int         format __UNUSED__)
 {
-   Ecore_X_Selection_Data_Files *sel;
-   int i;
+   Ecore_X_Selection_Data_Targets *sel;
+   unsigned long *targets;
+   int i = 0;
 
-   sel = data;
-   if (sel->files)
-     {
-       for (i = 0; i < sel->num_files; i++)
-         free(sel->files[i]);
-       free(sel->files);
-     }
-   free(sel);
-   return 0;
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-static void *
-_ecore_x_selection_parser_text(const char *target __UNUSED__,
-                               void       *_data,
-                               int         size,
-                               int         format __UNUSED__)
-{
-   Ecore_X_Selection_Data_Text *sel;
-   char                        *data = _data;
+   if (!(targets = (unsigned long *)data)) return NULL;
 
-   sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text));
+   sel = calloc(1, sizeof(Ecore_X_Selection_Data_Targets));
+   if (!sel) return NULL;
 
-   if (data[size - 1])
+   sel->num_targets = (size - 2);
+   sel->targets = malloc((size - 2) * sizeof(char *));
+   if (!sel->targets)
      {
-       /* Isn't nul terminated */
-       size++;
-       data = realloc(data, size);
-       data[size - 1] = 0;
+        free(sel);
+        return NULL;
+     }
+
+   for (i = 2; i < size; i++)
+     {
+        xcb_get_atom_name_cookie_t cookie;
+        xcb_get_atom_name_reply_t *reply;
+        char *name = NULL;
+        int len = 0;
+
+        cookie = xcb_get_atom_name_unchecked(_ecore_xcb_conn, targets[i]);
+        reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             len = xcb_get_atom_name_name_length(reply);
+             name = (char *)malloc(sizeof(char) * (len + 1));
+             if (name)
+               {
+                  memcpy(name, xcb_get_atom_name_name(reply), len);
+                  name[len] = '\0';
+                  sel->targets[i - 2] = name;
+               }
+             free(reply);
+          }
      }
 
-   sel->text = (char *)data;
-   ECORE_X_SELECTION_DATA(sel)->length = size;
-   ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TEXT;
-   ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_text_free;
+   ECORE_XCB_SELECTION_DATA(sel)->free =
+     _ecore_xcb_selection_data_targets_free;
+   ECORE_XCB_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TARGETS;
+   ECORE_XCB_SELECTION_DATA(sel)->length = size;
+   ECORE_XCB_SELECTION_DATA(sel)->data = data;
+
    return sel;
 }
 
+/*
+   static int
+   _ecore_xcb_selection_data_free(void *data)
+   {
+   Ecore_X_Selection_Data *sel;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(sel = data)) return 0;
+   if (sel->data) free(sel->data);
+   free(sel);
+   return 1;
+   }
+ */
+
 static int
-_ecore_x_selection_data_text_free(void *data)
+_ecore_xcb_selection_data_text_free(void *data)
 {
    Ecore_X_Selection_Data_Text *sel;
 
-   sel = data;
-   free(sel->text);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!(sel = data)) return 0;
+   if (sel->text) free(sel->text);
    free(sel);
    return 1;
 }
 
-static void *
-_ecore_x_selection_parser_targets(const char *target __UNUSED__,
-                                  void       *data,
-                                  int         size,
-                                  int         format __UNUSED__)
+static int
+_ecore_xcb_selection_data_targets_free(void *data)
 {
    Ecore_X_Selection_Data_Targets *sel;
-   uint32_t                       *targets;
-   xcb_get_atom_name_cookie_t     *cookies;
-   int                             i;
 
-   sel = calloc(1, sizeof(Ecore_X_Selection_Data_Targets));
-   targets = (uint32_t *)data;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   sel->num_targets = size - 2;
-   sel->targets = malloc((size - 2) * sizeof(char *));
-   cookies = (xcb_get_atom_name_cookie_t *)malloc ((size - 2) * sizeof (xcb_get_atom_name_cookie_t));
-   for (i = 0; i < size - 2; i++)
-     cookies[i] = xcb_get_atom_name_unchecked(_ecore_xcb_conn, targets[i + 2]);
-
-   /* FIXME: do we let the declaration of reply inside the loop ? */
-   for (i = 0; i < size - 2; i++)
-     {
-       xcb_get_atom_name_reply_t *reply;
-       char                      *name;
-       int                        length;
-
-       reply =xcb_get_atom_name_reply(_ecore_xcb_conn, cookies[i], NULL);
-       length = xcb_get_atom_name_name_length(reply);
-       name = (char *)malloc (length + 1);
-       memcpy(name, xcb_get_atom_name_name(reply), length);
-       name[length] = '\0';
-       sel->targets[i - 2] = name;
-     }
-   free(cookies);
-   free(data);
-
-   ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_targets_free;
-   ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TARGETS;
-   ECORE_X_SELECTION_DATA(sel)->length = size;
-   return sel;
+   if (!(sel = data)) return 0;
+   if (sel->targets) free(sel->targets);
+   free(ECORE_XCB_SELECTION_DATA(sel)->data);
+   free(sel);
+   return 1;
 }
 
 static int
-_ecore_x_selection_data_targets_free(void *data)
+_ecore_xcb_selection_data_files_free(void *data)
 {
-   Ecore_X_Selection_Data_Targets *sel;
-   int i;
+   Ecore_X_Selection_Data_Files *sel;
 
-   sel = data;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (sel->targets)
+   if (!(sel = data)) return 0;
+   if (sel->files)
      {
-       for (i = 0; i < sel->num_targets; i++)
-         free(sel->targets[i]);
-       free(sel->targets);
+        int i = 0;
+
+        for (i = 0; i < sel->num_files; i++)
+          if (sel->files[i]) free(sel->files[i]);
+        if (sel->files) free(sel->files);
      }
    free(sel);
+   return 0;
+}
+
+static int
+_ecore_xcb_selection_data_default_free(void *data)
+{
+   Ecore_X_Selection_Data *sel;
+
+   if (!(sel = data)) return 1;
+   free(sel->data);
+   free(sel);
    return 1;
 }
+
+static Ecore_X_Atom
+_ecore_xcb_selection_target_atom_get(const char *target)
+{
+   Ecore_X_Atom x_target;
+
+   if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
+     x_target = ECORE_X_ATOM_TEXT;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
+     x_target = ECORE_X_ATOM_COMPOUND_TEXT;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
+     x_target = ECORE_X_ATOM_STRING;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
+     x_target = ECORE_X_ATOM_UTF8_STRING;
+   else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
+     x_target = ECORE_X_ATOM_FILE_NAME;
+   else
+     x_target = ecore_x_atom_get(target);
+
+   return x_target;
+}
+
+char *
+_ecore_xcb_selection_target_get(Ecore_X_Atom target)
+{
+   if (target == ECORE_X_ATOM_FILE_NAME)
+     return strdup(ECORE_X_SELECTION_TARGET_FILENAME);
+   else if (target == ECORE_X_ATOM_STRING)
+     return strdup(ECORE_X_SELECTION_TARGET_STRING);
+   else if (target == ECORE_X_ATOM_UTF8_STRING)
+     return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
+   else if (target == ECORE_X_ATOM_TEXT)
+     return strdup(ECORE_X_SELECTION_TARGET_TEXT);
+   else
+     return ecore_x_atom_name_get(target);
+}
+
index a85b2b7..913f199 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
-
-
-/**
- * @defgroup Ecore_X_Shape_Group X Shape extension
- *
- * Functions that use the shape extension of the X server to change shape of given windows.
- */
-
-
 #ifdef ECORE_XCB_SHAPE
-static int _shape_available = 0;
-static xcb_shape_query_version_cookie_t _ecore_xcb_shape_init_cookie;
-#endif /* ECORE_XCB_SHAPE */
+# include <xcb/shape.h>
+#endif
 
-
-/* To avoid round trips, the initialization is separated in 2
-   functions: _ecore_xcb_shape_init and
-   _ecore_xcb_shape_init_finalize. The first one gets the cookies and
-   the second one gets the replies. */
+/* external variables */
+int _ecore_xcb_event_shape = -1;
 
 void
-_ecore_x_shape_init(const xcb_query_extension_reply_t *reply)
-{
-#ifdef ECORE_XCB_SHAPE
-   if (reply && (reply->present))
-      _ecore_xcb_shape_init_cookie = xcb_shape_query_version_unchecked(_ecore_xcb_conn);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-void
-_ecore_x_shape_init_finalize(void)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_shape_query_version_reply_t *reply;
-
-   reply = xcb_shape_query_version_reply(_ecore_xcb_conn,
-                                         _ecore_xcb_shape_init_cookie,
-                                         NULL);
-   if (reply)
-     {
-        _shape_available = 1;
-        free(reply);
-     }
-#endif /* ECORE_XCB_SHAPE */
-}
-
-
-/**
- * Sets the shape of the given window to the given pixmap.
- * @param dest_win    The given window.
- * @param source_mask A 2-bit depth pixmap that provides the new shape of the window.
- *
- * Sets the shape of the window @p dest_win to the pixmap @p source_mask.
- * @ingroup Ecore_X_Shape_Group
- */
-EAPI void
-ecore_x_window_shape_mask_set(Ecore_X_Window dest_win,
-                              Ecore_X_Pixmap source_mask)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_shape_mask(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, dest_win, 0, 0, source_mask);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-EAPI void
-ecore_x_window_shape_window_set(Ecore_X_Window dest_win,
-                                Ecore_X_Window shape_win)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING, dest_win, 0, 0, shape_win);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-EAPI void
-ecore_x_window_shape_window_set_xy(Ecore_X_Window dest_win,
-                                   Ecore_X_Window shape_win,
-                                   int            x,
-                                   int            y)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING, dest_win, x, y, shape_win);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-
-/**
- * Sets the shape of the given window to a rectangle.
- * @param dest_win The given window.
- * @param x        The X coordinate of the top left corner of the rectangle.
- * @param y        The Y coordinate of the top left corner of the rectangle.
- * @param width    The width of the rectangle.
- * @param height   The height of the rectangle.
- *
- * Sets the shape of the window @p dest_win to a rectangle defined  by
- * @p x, @p y, @p width and @p height.
- * @ingroup Ecore_X_Shape_Group
- */
-EAPI void
-ecore_x_window_shape_rectangle_set(Ecore_X_Window dest_win,
-                                   int            x,
-                                   int            y,
-                                   int            width,
-                                   int            height)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_rectangle_t rect;
-
-   rect.x = x;
-   rect.y = y;
-   rect.width = width;
-   rect.height = height;
-   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, 1, &rect);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-EAPI void
-ecore_x_window_shape_rectangles_set(Ecore_X_Window     dest_win,
-                                    Ecore_X_Rectangle *rects,
-                                    int                num)
+_ecore_xcb_shape_init(void)
 {
-#ifdef ECORE_XCB_SHAPE
-   if (num > 0)
-     xcb_shape_rectangles(_ecore_xcb_conn,
-                          XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING,
-                          0, dest_win, 0, 0, num, (xcb_rectangle_t *)rects);
-   else
-     xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, 0, NULL);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-EAPI void
-ecore_x_window_shape_window_add(Ecore_X_Window dest_win,
-                                Ecore_X_Window shape_win)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING, dest_win, 0, 0, shape_win);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-EAPI void
-ecore_x_window_shape_window_add_xy(Ecore_X_Window dest_win,
-                                   Ecore_X_Window shape_win,
-                                   int            x,
-                                   int            y)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING, dest_win, x, y, shape_win);
-#endif /* ECORE_XCB_SHAPE */
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-EAPI void
-ecore_x_window_shape_rectangle_add(Ecore_X_Window dest_win,
-                                   int            x,
-                                   int            y,
-                                   int            width,
-                                   int            height)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_rectangle_t rect;
-
-   rect.x = x;
-   rect.y = y;
-   rect.width = width;
-   rect.height = height;
-   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, 1, &rect);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-EAPI void
-ecore_x_window_shape_rectangle_clip(Ecore_X_Window dest_win,
-                                    int            x,
-                                    int            y,
-                                    int            width,
-                                    int            height)
-{
-   xcb_rectangle_t rect;
-   
-   rect.x = x;
-   rect.y = y;
-   rect.width = width;
-   rect.height = height;
-   xcb_shape_rectangles(_ecore_xcb_conn,
-                        XCB_SHAPE_SO_INTERSECT, XCB_SHAPE_SK_BOUNDING,
-                        0, dest_win, 0, 0, 1, &rect);
-}
-
-EAPI void
-ecore_x_window_shape_rectangles_add(Ecore_X_Window     dest_win,
-                                    Ecore_X_Rectangle *rects,
-                                    int                num)
-{
 #ifdef ECORE_XCB_SHAPE
-   if (num > 0)
-     xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, num, (const xcb_rectangle_t *)rects);
-   else
-     xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_BOUNDING, 0, dest_win, 0, 0, 0, NULL);
-#endif /* ECORE_XCB_SHAPE */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_shape_id);
+#endif
 }
 
-
-/**
- * Sends the ShapeGetRectangles request.
- * @param window Requested window.
- * @ingroup Ecore_X_Shape_Group
- */
-EAPI void
-ecore_x_window_shape_rectangles_get_prefetch(Ecore_X_Window window)
-{
-#ifdef ECORE_XCB_SHAPE
-   xcb_shape_get_rectangles_cookie_t cookie;
-
-   cookie = xcb_shape_get_rectangles_unchecked(_ecore_xcb_conn, window, XCB_SHAPE_SK_BOUNDING);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-#endif /* ECORE_XCB_SHAPE */
-}
-
-
-/**
- * Gets the reply of the ShapeGetRectangles request sent by ecore_x_window_shape_rectangles_get_prefetch().
- * @ingroup Ecore_X_Shape_Group
- */
-EAPI void
-ecore_x_window_shape_rectangles_get_fetch(void)
+void
+_ecore_xcb_shape_finalize(void)
 {
 #ifdef ECORE_XCB_SHAPE
-   xcb_shape_get_rectangles_cookie_t cookie;
-   xcb_shape_get_rectangles_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_shape_get_rectangles_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-#endif /* ECORE_XCB_SHAPE */
-}
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/**
- * To document.
- * @param  window  Unused.
- * @param  num_ret To document.
- * @return         To document.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_window_shape_rectangles_get_prefetch(), which sends the ShapeGetRectangles request,
- * then ecore_x_window_shape_rectangles_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_Shape_Group
- */
-EAPI Ecore_X_Rectangle *
-ecore_x_window_shape_rectangles_get(Ecore_X_Window window __UNUSED__,
-                                    int           *num_ret)
-{
-   Ecore_X_Rectangle *rects = NULL;
-   uint32_t           num = 0;
 #ifdef ECORE_XCB_SHAPE
-   xcb_shape_get_rectangles_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_shape_id);
+   if ((ext_reply) && (ext_reply->present))
      {
-       if (num_ret) *num_ret = 0;
-       return NULL;
+        xcb_shape_query_version_cookie_t cookie;
+        xcb_shape_query_version_reply_t *reply;
+        Eina_Bool _shape_avail;
+
+        _shape_avail = EINA_FALSE;
+        cookie = xcb_shape_query_version_unchecked(_ecore_xcb_conn);
+        reply = xcb_shape_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             _shape_avail = EINA_TRUE;
+             free(reply);
+          }
+
+        if (_shape_avail)
+          _ecore_xcb_event_shape = ext_reply->first_event;
      }
-
-   num = reply->rectangles_len;
-   rects = malloc(sizeof(Ecore_X_Rectangle) * num);
-   if (rects)
-     memcpy (rects,
-             xcb_shape_get_rectangles_rectangles(reply),
-             num * sizeof (Ecore_X_Rectangle));
-   else
-     num = 0;
-#endif /* ECORE_XCB_SHAPE */
-
-   if (num_ret) *num_ret = num;
-
-   return rects;
+#endif
 }
 
-EAPI void
-ecore_x_window_shape_events_select(Ecore_X_Window dest_win,
-                                   int            on)
-{
-#ifdef ECORE_XCB_SHAPE
-     xcb_shape_select_input(_ecore_xcb_conn, dest_win, on ? 1 : 0);
-#endif /* ECORE_XCB_SHAPE */
-}
index 5b1fd0b..75f4e4f 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
+# ifdef ECORE_XCB_SYNC
+#  include <xcb/sync.h>
+# endif
 
+/* local variables */
+static Eina_Bool _sync_avail = EINA_FALSE;
 
-/**
- * @defgroup Ecore_X_Sync_Group X Sync Extension Functions
- *
- * Functions related to the X Sync extension.
- */
-
-
-#ifdef ECORE_XCB_SYNC
-static int _sync_available = 0;
-static xcb_sync_initialize_cookie_t _ecore_xcb_sync_init_cookie;
-#endif /* ECORE_XCB_SYNC */
-
-
-/* To avoid round trips, the initialization is separated in 2
-   functions: _ecore_xcb_sync_init and
-   _ecore_xcb_sync_init_finalize. The first one gets the cookies and
-   the second one gets the replies and set the atoms. */
+/* external variables */
+int _ecore_xcb_event_sync = -1;
 
 void
-_ecore_x_sync_init(const xcb_query_extension_reply_t *reply)
+_ecore_xcb_sync_init(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
 #ifdef ECORE_XCB_SYNC
-   if (reply && (reply->present))
-     _ecore_xcb_sync_init_cookie = xcb_sync_initialize_unchecked(_ecore_xcb_conn,
-                                                                 XCB_SYNC_MAJOR_VERSION,
-                                                                 XCB_SYNC_MINOR_VERSION);
-#endif /* ECORE_XCB_SYNC */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_sync_id);
+#endif
 }
 
 void
-_ecore_x_sync_init_finalize(void)
+_ecore_xcb_sync_finalize(void)
 {
 #ifdef ECORE_XCB_SYNC
-   xcb_sync_initialize_reply_t *reply;
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
-   reply = xcb_sync_initialize_reply(_ecore_xcb_conn,
-                                     _ecore_xcb_sync_init_cookie, NULL);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (reply)
+#ifdef ECORE_XCB_SYNC
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_sync_id);
+   if ((ext_reply) && (ext_reply->present))
      {
-       if (reply->major_version >= 3)
-        _sync_available = 1;
-        free(reply);
+        xcb_sync_initialize_cookie_t cookie;
+        xcb_sync_initialize_reply_t *reply;
+
+        cookie =
+          xcb_sync_initialize_unchecked(_ecore_xcb_conn,
+                                        XCB_SYNC_MAJOR_VERSION,
+                                        XCB_SYNC_MINOR_VERSION);
+        reply = xcb_sync_initialize_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             if (reply->major_version >= 3) _sync_avail = EINA_TRUE;
+             free(reply);
+          }
+
+        if (_sync_avail)
+          _ecore_xcb_event_sync = ext_reply->first_event;
      }
-#endif /* ECORE_XCB_SYNC */
+#endif
 }
 
-
-/**
- * Return whether the X server supports the Sync Extension.
- * @return 1 if the X Sync Extension is available, 0 otherwise.
- *
- * Return 1 if the X server supports the Sync Extension version 3.0,
- * 0 otherwise.
- * @ingroup Ecore_X_Sync_Group
- */
-EAPI int
-ecore_x_sync_query(void)
+void
+_ecore_xcb_sync_magic_send(int            val,
+                           Ecore_X_Window win)
 {
-#ifdef ECORE_XCB_SYNC
-   return _sync_available;
-#else
-   return 0;
-#endif /* ECORE_XCB_SYNC */
-}
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = 27777;
+   ev.data.data32[0] = 0x7162534;
+   ev.data.data32[1] = (0x10000000 + val);
+   ev.data.data32[2] = win;
 
-/**
- * Create a new alarm.
- * @param counter A counter.
- * @return        A newly created alarm.
- *
- * Create a new alarm.
- * @ingroup Ecore_X_Sync_Group
- */
+   xcb_send_event(_ecore_xcb_conn, 0, win, XCB_EVENT_MASK_NO_EVENT,
+                  (const char *)&ev);
+//   ecore_x_flush();
+}
+
+/* public functions */
 EAPI Ecore_X_Sync_Alarm
 ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)
 {
 #ifdef ECORE_XCB_SYNC
-   uint32_t           value_list[6];
-   xcb_sync_int64_t   init;
+   uint32_t list[6], mask;
+   xcb_sync_int64_t init;
    Ecore_X_Sync_Alarm alarm;
-   uint32_t           value_mask;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if ((!_sync_avail) || (!counter)) return 0;
+
+#ifdef ECORE_XCB_SYNC
    init.lo = 0;
    init.hi = 0;
    xcb_sync_set_counter(_ecore_xcb_conn, counter, init);
 
-   value_mask =
-     XCB_SYNC_CA_COUNTER | XCB_SYNC_CA_VALUE_TYPE |
-     XCB_SYNC_CA_VALUE   | XCB_SYNC_CA_TEST_TYPE  |
-     XCB_SYNC_CA_DELTA   | XCB_SYNC_CA_EVENTS;
-   value_list[0] = counter;
-   value_list[1] = XCB_SYNC_VALUETYPE_ABSOLUTE;
-   value_list[2] = 1;
-   value_list[3] = XCB_SYNC_TESTTYPE_POSITIVE_COMPARISON;
-   value_list[4] = 1;
-   value_list[5] = 1;
+   mask = (XCB_SYNC_CA_COUNTER | XCB_SYNC_CA_VALUE_TYPE |
+           XCB_SYNC_CA_VALUE | XCB_SYNC_CA_TEST_TYPE |
+           XCB_SYNC_CA_DELTA | XCB_SYNC_CA_EVENTS);
+   list[0] = counter;
+   list[1] = XCB_SYNC_VALUETYPE_ABSOLUTE;
+   list[2] = 1;
+   list[3] = XCB_SYNC_TESTTYPE_POSITIVE_COMPARISON;
+   list[4] = 1;
+   list[5] = 1;
    alarm = xcb_generate_id(_ecore_xcb_conn);
-   xcb_sync_create_alarm(_ecore_xcb_conn,
-                         alarm,
-                         value_mask,
-                         (const uint32_t *)value_list);
 
-   ecore_x_sync();
+   xcb_sync_create_alarm(_ecore_xcb_conn, alarm, mask, list);
+   ecore_x_sync(); // needed
+
    return alarm;
-#else
+#endif
    return 0;
-#endif /* ECORE_XCB_SYNC */
 }
 
-
-/**
- * Delete an alarm.
- * @param alarm The alarm to delete.
- * @return      1 on success, 0 otherwise.
- *
- * Delete the @p alarm. Returns 1 on success, 0 otherwise.
- * @ingroup Ecore_X_Sync_Group
- */
-EAPI int
+EAPI Eina_Bool
 ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!alarm)) return EINA_FALSE;
+
 #ifdef ECORE_XCB_SYNC
    xcb_sync_destroy_alarm(_ecore_xcb_conn, alarm);
-   return 1;
-#else
+//   ecore_x_flush();
+   return EINA_TRUE;
+#endif
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,
+                           unsigned int        *val)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_query_counter_cookie_t cookie;
+   xcb_sync_query_counter_reply_t *reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!counter)) return EINA_FALSE;
+
+#ifdef ECORE_XCB_SYNC
+   cookie = xcb_sync_query_counter_unchecked(_ecore_xcb_conn, counter);
+   reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        if (val) *val = (unsigned int)reply->counter_value.lo;
+        free(reply);
+        return EINA_TRUE;
+     }
+#endif
+   return EINA_FALSE;
+}
+
+EAPI void
+ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,
+                         int                  by)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_int64_t v;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!counter)) return;
+
+#ifdef ECORE_XCB_SYNC
+   v.hi = (by < 0) ? ~0 : 0;
+   v.lo = by;
+
+   xcb_sync_change_counter(_ecore_xcb_conn, counter, v);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI void
+ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,
+                              int                  val)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_query_counter_cookie_t cookie;
+   xcb_sync_query_counter_reply_t *reply;
+   xcb_sync_int64_t v1, v2;
+   xcb_sync_waitcondition_t cond;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!counter)) return;
+
+#ifdef ECORE_XCB_SYNC
+   cookie = xcb_sync_query_counter_unchecked(_ecore_xcb_conn, counter);
+   reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
+   v1 = reply->counter_value;
+   free(reply);
+
+   v1.hi = (val < 0) ? ~0 : 0;
+   v1.lo = val;
+   v2.hi = ((val + 1) < 0) ? ~0 : 0;
+   v2.lo = (val + 1);
+
+   cond.trigger.counter = counter;
+   cond.trigger.wait_type = XCB_SYNC_VALUETYPE_ABSOLUTE;
+   cond.trigger.wait_value = v1;
+   cond.trigger.test_type = XCB_SYNC_TESTTYPE_POSITIVE_COMPARISON;
+   cond.event_threshold = v2;
+
+   xcb_sync_await(_ecore_xcb_conn, 1, &cond);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI Ecore_X_Sync_Counter
+ecore_x_sync_counter_new(int val)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_counter_t counter;
+   xcb_sync_int64_t v;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_sync_avail) return 0;
+
+#ifdef ECORE_XCB_SYNC
+   v.hi = (val < 0) ? ~0 : 0;
+   v.lo = val;
+
+   counter = xcb_generate_id(_ecore_xcb_conn);
+   xcb_sync_create_counter(_ecore_xcb_conn, counter, v);
+//   ecore_x_flush();
+
+   return counter;
+#endif
+
    return 0;
-#endif /* ECORE_XCB_SYNC */
 }
+
+EAPI void
+ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!counter)) return;
+
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_destroy_counter(_ecore_xcb_conn, counter);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI void
+ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,
+                         int                  val)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_int64_t v;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!counter)) return;
+
+#ifdef ECORE_XCB_SYNC
+   v.hi = (val < 0) ? ~0 : 0;
+   v.lo = val;
+
+   xcb_sync_set_counter(_ecore_xcb_conn, counter, v);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI void
+ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,
+                           int                  val_hi,
+                           unsigned int         val_lo)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_int64_t v;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!counter)) return;
+
+#ifdef ECORE_XCB_SYNC
+   v.hi = val_hi;
+   v.lo = val_lo;
+
+   xcb_sync_set_counter(_ecore_xcb_conn, counter, v);
+//   ecore_x_flush();
+#endif
+}
+
+EAPI Eina_Bool
+ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,
+                             int                 *val_hi,
+                             unsigned int        *val_lo)
+{
+#ifdef ECORE_XCB_SYNC
+   xcb_sync_query_counter_cookie_t cookie;
+   xcb_sync_query_counter_reply_t *reply;
+   xcb_sync_int64_t value;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if ((!_sync_avail) || (!counter)) return EINA_FALSE;
+
+#ifdef ECORE_XCB_SYNC
+   cookie =
+     xcb_sync_query_counter_unchecked(_ecore_xcb_conn,
+                                      (xcb_sync_counter_t)counter);
+   reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+   value = reply->counter_value;
+   free(reply);
+   if (val_hi) *val_hi = (int)value.hi;
+   if (val_lo) *val_lo = (unsigned int)value.lo;
+   return EINA_TRUE;
+#endif
+
+   return EINA_FALSE;
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_textlist.c b/src/lib/ecore_x/xcb/ecore_xcb_textlist.c
new file mode 100644 (file)
index 0000000..2a5c854
--- /dev/null
@@ -0,0 +1,509 @@
+#include "ecore_xcb_private.h"
+//#include "Ecore_X_Atoms.h"
+#include <langinfo.h>
+#ifdef HAVE_ICONV
+# include <iconv.h>
+#endif
+#ifndef CODESET
+# define CODESET "INVALID"
+#endif
+
+static int _ecore_xcb_textlist_get_buffer_size(Eina_Bool is_wide,
+                                               void     *list,
+                                               int       count);
+static int   _ecore_xcb_textlist_get_wc_len(wchar_t *wstr);
+static void *_ecore_xcb_textlist_alloc_list(Eina_Bool is_wide,
+                                            int       count,
+                                            int       nitems);
+static void _ecore_xcb_textlist_copy_list(Eina_Bool is_wide,
+                                          void     *text,
+                                          char    **list,
+                                          int       count);
+static wchar_t *_ecore_xcb_textlist_copy_wchar(wchar_t *str1,
+                                               wchar_t *str2);
+static int      _ecore_xcb_textlist_len_wchar(wchar_t *str);
+
+#ifdef HAVE_ICONV
+Eina_Bool
+_ecore_xcb_utf8_textlist_to_textproperty(char                   **list,
+                                         int                      count,
+                                         Ecore_Xcb_Encoding_Style style,
+                                         Ecore_Xcb_Textproperty  *ret)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_textlist_to_textproperty("utf8string", list, count,
+                                              style, ret);
+}
+
+#endif
+
+Eina_Bool
+_ecore_xcb_mb_textlist_to_textproperty(char                   **list,
+                                       int                      count,
+                                       Ecore_Xcb_Encoding_Style style,
+                                       Ecore_Xcb_Textproperty  *ret)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_textlist_to_textproperty("multiByte", list, count,
+                                              style, ret);
+}
+
+/* NB: This Function May Not Be Correct !!!
+ * (as I do not know text conversion, locales, etc, etc very well)
+ *
+ * Portions were ripped from libX11 XTextListToTextProperty
+ */
+Eina_Bool
+_ecore_xcb_textlist_to_textproperty(const char              *type,
+                                    char                   **list,
+                                    int                      count,
+                                    Ecore_Xcb_Encoding_Style style,
+                                    Ecore_Xcb_Textproperty  *ret)
+{
+   Eina_Bool is_wide = EINA_FALSE;
+   Ecore_X_Atom encoding;
+   int len = 0, nitems = 0, i = 0;
+   size_t from_left = 0, to_left = 0;
+   int unconv_num = 0, val = 0;
+   char *buff, *to, *value, *from;
+   const char *to_type, *from_type;
+   char **mb = NULL;
+   wchar_t **wc = NULL;
+#ifdef HAVE_ICONV
+   iconv_t conv;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!strcmp("wideChar", type)) is_wide = EINA_TRUE;
+   len = _ecore_xcb_textlist_get_buffer_size(is_wide, list, count);
+   if (!(buff = (char *)malloc(len * sizeof(char)))) return EINA_FALSE;
+   from_type = nl_langinfo(CODESET);
+   switch (style)
+     {
+      case XcbStringStyle:
+      case XcbStdICCTextStyle:
+        encoding = ECORE_X_ATOM_STRING;
+        to_type = nl_langinfo(CODESET);
+//        to_type = "string";
+        break;
+
+      case XcbUTF8StringStyle:
+        encoding = ECORE_X_ATOM_UTF8_STRING;
+        to_type = "UTF-8";
+        break;
+
+      case XcbCompoundTextStyle:
+        encoding = ECORE_X_ATOM_COMPOUND_TEXT;
+        to_type = nl_langinfo(CODESET);
+//        to_type = "compoundText";
+        break;
+
+      case XcbTextStyle:
+        encoding = ECORE_X_ATOM_TEXT;
+        to_type = nl_langinfo(CODESET);
+//        to_type = "multiByte";
+        if (!is_wide)
+          {
+             nitems = 0;
+             mb = (char **)list;
+             to = buff;
+             for (i = 0; ((i < count) && (len > 0)); i++)
+               {
+                  if (*mb) strcpy(to, *mb);
+                  else *to = '\0';
+                  from_left = (*mb ? strlen(*mb) : 0) + 1;
+                  nitems += from_left;
+                  to += from_left;
+                  mb++;
+               }
+             unconv_num = 0;
+             goto done;
+          }
+        break;
+
+      default:
+        free(buff);
+        return EINA_FALSE;
+        break;
+     }
+
+   if (count < 1)
+     {
+        nitems = 0;
+        goto done;
+     }
+
+retry:
+#ifdef HAVE_ICONV
+   conv = iconv_open(to_type, from_type);
+#endif
+
+   if (is_wide)
+     wc = (wchar_t **)list;
+   else
+     mb = (char **)list;
+
+   to = buff;
+   to_left = len;
+   unconv_num = 0;
+   for (i = 1; to_left > 0; i++)
+     {
+        if (is_wide)
+          {
+             from = (char *)*wc;
+             from_left = _ecore_xcb_textlist_get_wc_len(*wc);
+             wc++;
+          }
+        else
+          {
+             from = *mb;
+             from_left = (*mb ? strlen(*mb) : 0);
+             mb++;
+          }
+
+#ifdef HAVE_ICONV
+        val = iconv(conv, &from, &from_left, &to, &to_left);
+#endif
+        if (val < 0) continue;
+        if ((val > 0) && (style == XcbStdICCTextStyle) &&
+            (encoding == ECORE_X_ATOM_STRING))
+          {
+#ifdef HAVE_ICONV
+             iconv_close(conv);
+#endif
+             encoding = ECORE_X_ATOM_COMPOUND_TEXT;
+             goto retry;
+          }
+
+        unconv_num += val;
+        *to++ = '\0';
+        to_left--;
+        if (i >= count) break;
+     }
+
+#ifdef HAVE_ICONV
+   iconv_close(conv);
+#endif
+   nitems = (to - buff);
+
+done:
+   if (nitems <= 0) nitems = 1;
+   if (!(value = (char *)malloc(nitems * sizeof(char))))
+     {
+        free(buff);
+        return EINA_FALSE;
+     }
+   if (nitems == 1)
+     *value = 0;
+   else
+     memcpy(value, buff, nitems);
+   nitems--;
+   free(buff);
+
+   ret->value = value;
+   ret->encoding = encoding;
+   ret->format = 8;
+   ret->nitems = nitems;
+
+   return EINA_TRUE;
+}
+
+#ifdef HAVE_ICONV
+Eina_Bool
+_ecore_xcb_utf8_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
+                                         char                       ***list_ret,
+                                         int                          *count_ret)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_textproperty_to_textlist(text_prop, "utf8String",
+                                              list_ret, count_ret);
+}
+
+#endif
+
+Eina_Bool
+_ecore_xcb_mb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
+                                       char                       ***list_ret,
+                                       int                          *count_ret)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return _ecore_xcb_textproperty_to_textlist(text_prop, "multiByte",
+                                              list_ret, count_ret);
+}
+
+Eina_Bool
+_ecore_xcb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
+                                    const char                   *type,
+                                    char                       ***list_ret,
+                                    int                          *count_ret)
+{
+   Eina_Bool is_wide = EINA_FALSE;
+   Eina_Bool do_strcpy = EINA_FALSE;
+   const char *from_type;
+   char *buff, *to, *from;
+   char *lptr, *sptr;
+   int nitems = 0, len = 0, num = 0, ret = 0;
+   size_t from_left = 0, to_left = 0;
+#ifdef HAVE_ICONV
+   iconv_t conv = 0;
+#endif
+
+   *list_ret = NULL;
+   *count_ret = 0;
+   if (!strcmp("wideChar", type)) is_wide = EINA_TRUE;
+
+   nitems = text_prop->nitems;
+   if (nitems <= 0) return EINA_TRUE;
+
+   if (text_prop->format != 8) return EINA_FALSE;
+
+   from_type = nl_langinfo(CODESET);
+   if (text_prop->encoding == ECORE_X_ATOM_UTF8_STRING)
+     from_type = "UTF-8";
+
+   if (is_wide)
+     len = (text_prop->nitems + 1) * sizeof(wchar_t);
+   else
+     {
+        if (!strcmp(type, "utf8String"))
+          len = text_prop->nitems * 6 + 1;
+        else
+          len = text_prop->nitems * MB_CUR_MAX + 1;
+     }
+
+   buff = (char *)malloc(len * sizeof(char));
+   if (!buff) return EINA_FALSE;
+
+   to = buff;
+   to_left = len;
+
+   if (!strcmp(from_type, type))
+     do_strcpy = EINA_TRUE;
+   else
+     {
+#ifdef HAVE_ICONV
+        conv = iconv_open(type, from_type);
+#endif
+        if (!conv)
+          {
+             free(buff);
+             return EINA_FALSE;
+          }
+     }
+
+   lptr = sptr = text_prop->value;
+   num = *count_ret = 0;
+   while (1)
+     {
+        if ((nitems == 0) || (*sptr == 0))
+          {
+             from = lptr;
+             from_left = sptr - lptr;
+             lptr = sptr;
+             if (do_strcpy)
+               {
+                  int l = 0;
+
+                  l = MIN(from_left, to_left);
+                  strncpy(to, from, l);
+                  from += len;
+                  to += len;
+                  from_left -= l;
+                  to_left -= l;
+                  ret = 0;
+               }
+             else
+               ret = iconv(conv, &from, &from_left, &to, &to_left);
+
+             if (ret < 0) continue;
+             num += ret;
+             (*count_ret)++;
+             if (nitems == 0) break;
+             lptr = ++sptr;
+             if (is_wide)
+               {
+                  *((wchar_t *)to) = (wchar_t)0;
+                  to += sizeof(wchar_t);
+                  to_left -= sizeof(wchar_t);
+               }
+             else
+               {
+                  *((char *)to) = '\0';
+                  to++;
+                  to_left--;
+               }
+          }
+        else
+          sptr++;
+
+        nitems--;
+     }
+
+#if HAVE_ICONV
+   if (!do_strcpy) iconv_close(conv);
+#endif
+
+   if (is_wide)
+     {
+        *((wchar_t *)to) = (wchar_t)0;
+        to_left -= sizeof(wchar_t);
+     }
+   else
+     {
+        *((char *)to) = '\0';
+        to_left--;
+     }
+
+   *list_ret =
+     _ecore_xcb_textlist_alloc_list(is_wide, *count_ret, (len - to_left));
+   if (*list_ret)
+     _ecore_xcb_textlist_copy_list(is_wide, buff, *list_ret, *count_ret);
+
+   free(buff);
+
+   return EINA_TRUE;
+}
+
+static int
+_ecore_xcb_textlist_get_buffer_size(Eina_Bool is_wide,
+                                    void     *list,
+                                    int       count)
+{
+   int len = 0;
+   char **mb;
+   wchar_t **wc;
+
+   if (!list) return 0;
+   if (is_wide)
+     {
+        wc = (wchar_t **)list;
+        for (; count-- > 0; wc++)
+          if (*wc) len += _ecore_xcb_textlist_get_wc_len(*wc) + 1;
+        len *= 5;
+     }
+   else
+     {
+        mb = (char **)list;
+        for (; count-- > 0; mb++)
+          if (*mb) len += strlen(*mb) + 1;
+        len *= 3;
+     }
+   len = (len / 2048 + 1) * 2048;
+   return len;
+}
+
+static int
+_ecore_xcb_textlist_get_wc_len(wchar_t *wstr)
+{
+   wchar_t *ptr;
+
+   ptr = wstr;
+   while (*ptr)
+     ptr++;
+
+   return ptr - wstr;
+}
+
+static void *
+_ecore_xcb_textlist_alloc_list(Eina_Bool is_wide,
+                               int       count,
+                               int       nitems)
+{
+   if (is_wide)
+     {
+        wchar_t **list;
+
+        list = (wchar_t **)malloc(count * sizeof(wchar_t *));
+        if (!list) return NULL;
+        *list = (wchar_t *)malloc(nitems * sizeof(wchar_t));
+        if (!*list)
+          {
+             free(list);
+             return NULL;
+          }
+        return *list;
+     }
+   else
+     {
+        char **list;
+
+        list = (char **)malloc(count * sizeof(char *));
+        if (!list) return NULL;
+        *list = (char *)malloc(nitems * sizeof(char));
+        if (!*list)
+          {
+             free(list);
+             return NULL;
+          }
+        return *list;
+     }
+}
+
+static void
+_ecore_xcb_textlist_copy_list(Eina_Bool is_wide,
+                              void     *text,
+                              char    **list,
+                              int       count)
+{
+   int len = 0;
+
+   if (is_wide)
+     {
+        wchar_t *txt, *str, **wlist;
+
+        txt = (wchar_t *)text;
+        wlist = (wchar_t **)list;
+        for (str = *wlist; count > 0; count--, wlist++)
+          {
+             _ecore_xcb_textlist_copy_wchar(str, txt);
+             *wlist = str;
+             len = (_ecore_xcb_textlist_len_wchar(str) + 1);
+             str += len;
+             txt += len;
+          }
+     }
+   else
+     {
+        char *txt, *str, **slist;
+
+        txt = (char *)text;
+        slist = (char **)list;
+        for (str = *slist; count > 0; count--, slist++)
+          {
+             strcpy(str, txt);
+             *slist = str;
+             len = strlen(str) + 1;
+             str += len;
+             txt += len;
+          }
+     }
+}
+
+static wchar_t *
+_ecore_xcb_textlist_copy_wchar(wchar_t *str1,
+                               wchar_t *str2)
+{
+   wchar_t *tmp;
+
+   tmp = str1;
+   while ((*str1++ = *str2++))
+     ;
+   return tmp;
+}
+
+static int
+_ecore_xcb_textlist_len_wchar(wchar_t *str)
+{
+   wchar_t *ptr;
+
+   ptr = str;
+   while (*ptr)
+     ptr++;
+   return ptr - str;
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_vsync.c b/src/lib/ecore_x/xcb/ecore_xcb_vsync.c
new file mode 100644 (file)
index 0000000..47efefc
--- /dev/null
@@ -0,0 +1,375 @@
+#include "ecore_xcb_private.h"
+# include <fcntl.h>
+# include <dlfcn.h>
+# include <X11/Xlib-xcb.h>
+
+#define ECORE_XCB_VSYNC_DRI2      1
+#define DRM_EVENT_CONTEXT_VERSION 2
+
+#ifdef ECORE_XCB_VSYNC_DRI2
+
+/* relevant header bits of dri/drm inlined here to avoid needing external */
+/* headers to build drm */
+typedef unsigned int drm_magic_t;
+
+typedef enum
+{
+   DRM_VBLANK_ABSOLUTE = 0x00000000,
+   DRM_VBLANK_RELATIVE = 0x00000001,
+   DRM_VBLANK_EVENT = 0x04000000,
+   DRM_VBLANK_FLIP = 0x08000000,
+   DRM_VBLANK_NEXTONMISS = 0x10000000,
+   DRM_VBLANK_SECONDARY = 0x20000000,
+   DRM_VBLANK_SIGNAL = 0x40000000
+} drmVBlankSeqType;
+
+typedef struct _drmVBlankReq
+{
+   drmVBlankSeqType type;
+   unsigned int     sequence;
+   unsigned long    signal;
+} drmVBlankReq;
+
+typedef struct _drmVBlankReply
+{
+   drmVBlankSeqType type;
+   unsigned int     sequence;
+   long             tval_sec, tval_usec;
+} drmVBlankReply;
+
+typedef union _drmVBlank
+{
+   drmVBlankReq   request;
+   drmVBlankReply reply;
+} drmVBlank;
+
+typedef struct _drmEventContext
+{
+   int version;
+   void (*vblank_handler)(int          fd,
+                          unsigned int sequence,
+                          unsigned int tv_sec,
+                          unsigned int tv_usec,
+                          void        *user_data);
+   void (*page_flip_handler)(int          fd,
+                             unsigned int sequence,
+                             unsigned int tv_sec,
+                             unsigned int tv_usec,
+                             void        *user_data);
+} drmEventContext;
+
+static int (*sym_drmClose)(int fd) = NULL;
+static int (*sym_drmGetMagic)(int          fd,
+                              drm_magic_t *magic) = NULL;
+static int (*sym_drmWaitVBlank)(int        fd,
+                                drmVBlank *vbl) = NULL;
+static int (*sym_drmHandleEvent)(int              fd,
+                                 drmEventContext *evctx) = NULL;
+
+/* dri */
+static Bool (*sym_DRI2QueryExtension)(Display *display,
+                                      int     *eventBase,
+                                      int     *errorBase) = NULL;
+static Bool (*sym_DRI2QueryVersion)(Display *display,
+                                    int     *major,
+                                    int     *minor) = NULL;
+static Bool (*sym_DRI2Connect)(Display *display,
+                               XID      window,
+                               char   **driverName,
+                               char   **deviceName) = NULL;
+static Bool (*sym_DRI2Authenticate)(Display    *display,
+                                    XID         window,
+                                    drm_magic_t magic) = NULL;
+
+/* local function prototypes */
+static Eina_Bool _ecore_xcb_dri_link(void);
+static Eina_Bool _ecore_xcb_dri_start(void);
+static void      _ecore_xcb_dri_shutdown(void);
+
+static Eina_Bool _ecore_xcb_dri_cb(void             *data __UNUSED__,
+                                   Ecore_Fd_Handler *fdh __UNUSED__);
+static void      _ecore_xcb_dri_tick_begin(void *data __UNUSED__);
+static void      _ecore_xcb_dri_tick_end(void *data __UNUSED__);
+static void      _ecore_xcb_dri_tick_schedule(void);
+static void      _ecore_xcb_dri_vblank_handler(int          fd __UNUSED__,
+                                               unsigned int frame __UNUSED__,
+                                               unsigned int sec __UNUSED__,
+                                               unsigned int usec __UNUSED__,
+                                               void        *data __UNUSED__);
+
+/* local variables */
+static Ecore_X_Window _vsync_root = 0;
+static int _drm_fd = -1;
+static Ecore_Fd_Handler *_drm_fdh = NULL;
+static unsigned int _drm_magic = 0;
+static Eina_Bool _drm_event_busy = EINA_FALSE;
+static void *_drm_lib = NULL;
+static void *_dri_lib = NULL;
+static drmEventContext _drm_evctx;
+#endif
+
+void
+_ecore_xcb_dri_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+}
+
+void
+_ecore_xcb_dri_finalize(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+}
+
+EAPI Eina_Bool
+ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win)
+{
+#ifdef ECORE_XCB_VSYNC_DRI2
+   Ecore_X_Window root;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_VSYNC_DRI2
+   root = ecore_x_window_root_get(win);
+   if (root != _vsync_root)
+     {
+        _vsync_root = root;
+        if (_vsync_root)
+          {
+             if (!_ecore_xcb_dri_link())
+               {
+                  ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
+                  return EINA_FALSE;
+               }
+             _ecore_xcb_dri_shutdown();
+             if (!_ecore_xcb_dri_start())
+               {
+                  _vsync_root = 0;
+                  ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
+                  return EINA_FALSE;
+               }
+             ecore_animator_custom_source_tick_begin_callback_set
+               (_ecore_xcb_dri_tick_begin, NULL);
+             ecore_animator_custom_source_tick_end_callback_set
+               (_ecore_xcb_dri_tick_end, NULL);
+             ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM);
+          }
+        else
+          {
+             if (_drm_fd >= 0)
+               {
+                  _ecore_xcb_dri_shutdown();
+                  ecore_animator_custom_source_tick_begin_callback_set
+                    (NULL, NULL);
+                  ecore_animator_custom_source_tick_end_callback_set
+                    (NULL, NULL);
+                  ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
+               }
+          }
+     }
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+   win = 0;
+#endif
+}
+
+/* local functions */
+#ifdef ECORE_XCB_VSYNC_DRI2
+static Eina_Bool
+_ecore_xcb_dri_link(void)
+{
+   const char *_drm_libs[] =
+   {
+      "libdrm.so.2",
+      "libdrm.so.1",
+      "libdrm.so.0",
+      "libdrm.so",
+      NULL,
+   };
+   const char *_dri_libs[] =
+   {
+      "libdri2.so.2",
+      "libdri2.so.1",
+      "libdri2.so.0",
+      "libdri2.so",
+      "libGL.so.4",
+      "libGL.so.3",
+      "libGL.so.2",
+      "libGL.so.1",
+      "libGL.so.0",
+      "libGL.so",
+      NULL,
+   };
+   int i = 0, fail = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+# define SYM(lib, xx)                           \
+  do {                                          \
+       sym_## xx = dlsym(lib, #xx);             \
+       if (!(sym_## xx)) {                      \
+            fprintf(stderr, "%s\n", dlerror()); \
+            fail = 1;                           \
+         }                                      \
+    } while (0);
+
+   if (_drm_lib) return EINA_TRUE;
+
+   for (i = 0; _drm_libs[i]; i++)
+     {
+        _drm_lib = dlopen(_drm_libs[i], (RTLD_LOCAL | RTLD_LAZY));
+        if (_drm_lib)
+          {
+             fail = 0;
+             SYM(_drm_lib, drmClose);
+             SYM(_drm_lib, drmGetMagic);
+             SYM(_drm_lib, drmWaitVBlank);
+             SYM(_drm_lib, drmHandleEvent);
+             if (fail)
+               {
+                  dlclose(_drm_lib);
+                  _drm_lib = NULL;
+               }
+             else
+               break;
+          }
+     }
+   if (!_drm_lib) return EINA_FALSE;
+   for (i = 0; _dri_libs[i]; i++)
+     {
+        if ((_dri_lib = dlopen(_dri_libs[i], (RTLD_LOCAL | RTLD_LAZY))))
+          {
+             fail = 0;
+             SYM(_dri_lib, DRI2QueryExtension);
+             SYM(_dri_lib, DRI2QueryVersion);
+             SYM(_dri_lib, DRI2Connect);
+             SYM(_dri_lib, DRI2Authenticate);
+             if (fail)
+               {
+                  dlclose(_dri_lib);
+                  _dri_lib = NULL;
+               }
+             else
+               break;
+          }
+     }
+   if (!_dri_lib)
+     {
+        dlclose(_drm_lib);
+        _drm_lib = NULL;
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_xcb_dri_start(void)
+{
+   Ecore_X_Display *disp;
+   int _dri2_event = 0, _dri2_error = 0;
+   int _dri2_major = 0, _dri2_minor = 0;
+   char *device = NULL, *driver = NULL;
+
+   disp = ecore_x_display_get();
+   if (!sym_DRI2QueryExtension(disp, &_dri2_event, &_dri2_error))
+     return 0;
+   if (!sym_DRI2QueryVersion(disp, &_dri2_major, &_dri2_minor))
+     return 0;
+   if (_dri2_major < 2) return 0;
+   if (!sym_DRI2Connect(disp, _vsync_root, &driver, &device))
+     return 0;
+
+   _drm_fd = open(device, O_RDWR);
+   if (_drm_fd < 0) return 0;
+
+   sym_drmGetMagic(_drm_fd, &_drm_magic);
+   if (!sym_DRI2Authenticate(disp, _vsync_root, _drm_magic))
+     {
+        close(_drm_fd);
+        _drm_fd = -1;
+        return EINA_FALSE;
+     }
+
+   memset(&_drm_evctx, 0, sizeof(_drm_evctx));
+   _drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
+   _drm_evctx.vblank_handler = _ecore_xcb_dri_vblank_handler;
+   _drm_evctx.page_flip_handler = NULL;
+
+   _drm_fdh = ecore_main_fd_handler_add(_drm_fd, ECORE_FD_READ,
+                                        _ecore_xcb_dri_cb, NULL, NULL, NULL);
+   if (!_drm_fdh)
+     {
+        close(_drm_fd);
+        _drm_fd = -1;
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+_ecore_xcb_dri_shutdown(void)
+{
+   if (_drm_fd >= 0)
+     {
+        close(_drm_fd);
+        _drm_fd = -1;
+     }
+   if (_drm_fdh)
+     {
+        ecore_main_fd_handler_del(_drm_fdh);
+        _drm_fdh = NULL;
+     }
+}
+
+static Eina_Bool
+_ecore_xcb_dri_cb(void             *data __UNUSED__,
+                  Ecore_Fd_Handler *fdh __UNUSED__)
+{
+   sym_drmHandleEvent(_drm_fd, &_drm_evctx);
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_ecore_xcb_dri_tick_begin(void *data __UNUSED__)
+{
+   _drm_event_busy = EINA_TRUE;
+   _ecore_xcb_dri_tick_schedule();
+}
+
+static void
+_ecore_xcb_dri_tick_end(void *data __UNUSED__)
+{
+   _drm_event_busy = EINA_FALSE;
+}
+
+static void
+_ecore_xcb_dri_tick_schedule(void)
+{
+   drmVBlank vbl;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   vbl.request.type = (DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT);
+   vbl.request.sequence = 1;
+   vbl.request.signal = 0;
+
+   sym_drmWaitVBlank(_drm_fd, &vbl);
+}
+
+static void
+_ecore_xcb_dri_vblank_handler(int          fd __UNUSED__,
+                              unsigned int frame __UNUSED__,
+                              unsigned int sec __UNUSED__,
+                              unsigned int usec __UNUSED__,
+                              void        *data __UNUSED__)
+{
+   ecore_animator_custom_tick();
+   if (_drm_event_busy) _ecore_xcb_dri_tick_schedule();
+}
+
+#endif
index b02eb7a..8e38c5a 100644 (file)
@@ -1,33 +1,48 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-#include "Ecore.h"
 #include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
-
-
-static int             ignore_num = 0;
-static Ecore_X_Window *ignore_list = NULL;
-
-static Ecore_X_Window _ecore_x_window_at_xy_get(Ecore_X_Window  base,
-                                                int16_t         base_x,
-                                                int16_t         base_y,
-                                                int16_t         x,
-                                                int16_t         y,
-                                                Ecore_X_Window *skip,
-                                                int             skip_num);
-
 #ifdef ECORE_XCB_RENDER
-static Ecore_X_Window _ecore_x_window_argb_internal_new(Ecore_X_Window parent,
-                                                        int16_t        x,
-                                                        int16_t        y,
-                                                        uint16_t       w,
-                                                        uint16_t       h,
-                                                        uint8_t        override_redirect,
-                                                        uint8_t        save_under);
-#endif /* ECORE_XCB_RENDER */
+# include <xcb/render.h>
+#endif
+#ifdef ECORE_XCB_SHAPE
+# include <xcb/shape.h>
+#endif
+#ifdef ECORE_XCB_XPRINT
+#include <xcb/xprint.h>
+#endif
+
+/* local function prototypes */
+static Ecore_X_Window _ecore_xcb_window_argb_internal_new(Ecore_X_Window parent,
+                                                          int            x,
+                                                          int            y,
+                                                          int            w,
+                                                          int            h,
+                                                          uint8_t        override_redirect,
+                                                          uint8_t        save_under);
+static Ecore_X_Window _ecore_xcb_window_at_xy_get(Ecore_X_Window  base,
+                                                  int             bx,
+                                                  int             by,
+                                                  int             x,
+                                                  int             y,
+                                                  Ecore_X_Window *skip,
+                                                  int             skip_num);
+static int               _ecore_xcb_window_modifiers_get(unsigned int state);
+static xcb_visualtype_t *_ecore_xcb_window_find_visual_by_id(xcb_visualid_t id);
+#ifdef ECORE_XCB_XPRINT
+static xcb_screen_t     *_ecore_xcb_window_screen_of_display(int screen);
+#endif
+
+/* local variables */
+static int ignore_num = 0;
+static Ecore_X_Window *ignore_list = NULL;
 
+/* external variables */
+int _ecore_xcb_button_grabs_num = 0;
+int _ecore_xcb_key_grabs_num = 0;
+Ecore_X_Window *_ecore_xcb_button_grabs = NULL;
+Ecore_X_Window *_ecore_xcb_key_grabs = NULL;
+Eina_Bool (*_ecore_xcb_window_grab_replay_func)(void *data,
+                                                int   type,
+                                                void *event);
+void *_ecore_xcb_window_grab_replay_data;
 
 /**
  * @defgroup Ecore_X_Window_Create_Group X Window Creation Functions
@@ -50,49 +65,53 @@ EAPI Ecore_X_Window
 ecore_x_window_new(Ecore_X_Window parent,
                    int            x,
                    int            y,
-                   int            width,
-                   int            height)
-{
-   uint32_t       value_list[9];
-   Ecore_X_Window window;
-   xcb_visualid_t vis = { XCB_WINDOW_CLASS_COPY_FROM_PARENT };
-   uint32_t       value_mask;
-
-   if (parent == 0) parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   value_mask =
-     XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL  | XCB_CW_BIT_GRAVITY       |
-     XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE | XCB_CW_OVERRIDE_REDIRECT |
-     XCB_CW_SAVE_UNDER  | XCB_CW_EVENT_MASK    | XCB_CW_DONT_PROPAGATE;
-
-   value_list[0]  = XCB_NONE;
-   value_list[1]  = 0;
-   value_list[2]  = XCB_GRAVITY_NORTH_WEST;
-   value_list[3]  = XCB_GRAVITY_NORTH_WEST;
-   value_list[4]  = XCB_BACKING_STORE_NOT_USEFUL;
-   value_list[5]  = 0;
-   value_list[6]  = 0;
-   value_list[7]  =
-     XCB_EVENT_MASK_KEY_PRESS         | XCB_EVENT_MASK_KEY_RELEASE      |
-     XCB_EVENT_MASK_BUTTON_PRESS      | XCB_EVENT_MASK_BUTTON_RELEASE   |
-     XCB_EVENT_MASK_ENTER_WINDOW      | XCB_EVENT_MASK_LEAVE_WINDOW     |
-     XCB_EVENT_MASK_POINTER_MOTION    | XCB_EVENT_MASK_EXPOSURE        |
-     XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_FOCUS_CHANGE      | XCB_EVENT_MASK_PROPERTY_CHANGE  |
-     XCB_EVENT_MASK_COLOR_MAP_CHANGE;
-   value_list[8]  = XCB_EVENT_MASK_NO_EVENT;
-
-   window = xcb_generate_id(_ecore_xcb_conn);
-   xcb_create_window(_ecore_xcb_conn,
-                   XCB_WINDOW_CLASS_COPY_FROM_PARENT,
-                   window, parent, x, y, width, height, 0,
-                   XCB_WINDOW_CLASS_INPUT_OUTPUT,
-                   vis,
-                   value_mask,
-                   value_list);
-
-   if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root) ecore_x_window_defaults_set(window);
-   return window;
+                   int            w,
+                   int            h)
+{
+   Ecore_X_Window win;
+   uint32_t mask, mask_list[9];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (parent == 0)
+     parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   /* NB: Order here is very important due to xcb_cw_t enum */
+   mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
+           XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
+           XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER | XCB_CW_EVENT_MASK |
+           XCB_CW_DONT_PROPAGATE);
+
+   mask_list[0] = XCB_BACK_PIXMAP_NONE;
+   mask_list[1] = 0;
+   mask_list[2] = XCB_GRAVITY_NORTH_WEST;
+   mask_list[3] = XCB_GRAVITY_NORTH_WEST;
+   mask_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
+   mask_list[5] = 0;
+   mask_list[6] = 0;
+   mask_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
+                   XCB_EVENT_MASK_BUTTON_PRESS |
+                   XCB_EVENT_MASK_BUTTON_RELEASE |
+                   XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
+                   XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
+                   XCB_EVENT_MASK_VISIBILITY_CHANGE |
+                   XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+                   XCB_EVENT_MASK_FOCUS_CHANGE |
+                   XCB_EVENT_MASK_PROPERTY_CHANGE |
+                   XCB_EVENT_MASK_COLOR_MAP_CHANGE);
+   mask_list[8] = XCB_EVENT_MASK_NO_EVENT;
+
+   win = xcb_generate_id(_ecore_xcb_conn);
+   xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
+                     win, parent, x, y, w, h, 0,
+                     XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                     XCB_COPY_FROM_PARENT, mask, mask_list);
+
+   if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root)
+     ecore_x_window_defaults_set(win);
+
+   return win;
 }
 
 /**
@@ -110,47 +129,50 @@ EAPI Ecore_X_Window
 ecore_x_window_override_new(Ecore_X_Window parent,
                             int            x,
                             int            y,
-                            int            width,
-                            int            height)
-{
-   uint32_t         value_list[9];
-   Ecore_X_Window window;
-   xcb_visualid_t   vis = { XCB_WINDOW_CLASS_COPY_FROM_PARENT };
-   uint32_t         value_mask;
-
-   if (parent == 0) parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   value_mask =
-     XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL  | XCB_CW_BIT_GRAVITY       |
-     XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE | XCB_CW_OVERRIDE_REDIRECT |
-     XCB_CW_SAVE_UNDER  | XCB_CW_EVENT_MASK    | XCB_CW_DONT_PROPAGATE;
-
-   value_list[0]  = XCB_NONE;
-   value_list[1]  = 0;
-   value_list[2]  = XCB_GRAVITY_NORTH_WEST;
-   value_list[3]  = XCB_GRAVITY_NORTH_WEST;
-   value_list[4]  = XCB_BACKING_STORE_NOT_USEFUL;
-   value_list[5]  = 1;
-   value_list[6]  = 0;
-   value_list[7]  =
-     XCB_EVENT_MASK_KEY_PRESS         | XCB_EVENT_MASK_KEY_RELEASE      |
-     XCB_EVENT_MASK_BUTTON_PRESS      | XCB_EVENT_MASK_BUTTON_RELEASE   |
-     XCB_EVENT_MASK_ENTER_WINDOW      | XCB_EVENT_MASK_LEAVE_WINDOW     |
-     XCB_EVENT_MASK_POINTER_MOTION    | XCB_EVENT_MASK_EXPOSURE        |
-     XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_FOCUS_CHANGE      | XCB_EVENT_MASK_PROPERTY_CHANGE  |
-     XCB_EVENT_MASK_COLOR_MAP_CHANGE;
-   value_list[8]  = XCB_EVENT_MASK_NO_EVENT;
-
-   window = xcb_generate_id(_ecore_xcb_conn);
-   xcb_create_window(_ecore_xcb_conn,
-                   XCB_WINDOW_CLASS_COPY_FROM_PARENT,
-                   window, parent, x, y, width, height, 0,
-                   XCB_WINDOW_CLASS_INPUT_OUTPUT,
-                   vis,
-                   value_mask,
-                   value_list);
-   return window;
+                            int            w,
+                            int            h)
+{
+   Ecore_X_Window win;
+   uint32_t mask, mask_list[9];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (parent == 0)
+     parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   /* NB: Order here is very important due to xcb_cw_t enum */
+   mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
+           XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
+           XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER | XCB_CW_EVENT_MASK |
+           XCB_CW_DONT_PROPAGATE);
+
+   mask_list[0] = XCB_BACK_PIXMAP_NONE;
+   mask_list[1] = 0;
+   mask_list[2] = XCB_GRAVITY_NORTH_WEST;
+   mask_list[3] = XCB_GRAVITY_NORTH_WEST;
+   mask_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
+   mask_list[5] = 1;
+   mask_list[6] = 0;
+   mask_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
+                   XCB_EVENT_MASK_BUTTON_PRESS |
+                   XCB_EVENT_MASK_BUTTON_RELEASE |
+                   XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
+                   XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
+                   XCB_EVENT_MASK_VISIBILITY_CHANGE |
+                   XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+                   XCB_EVENT_MASK_FOCUS_CHANGE |
+                   XCB_EVENT_MASK_PROPERTY_CHANGE |
+                   XCB_EVENT_MASK_COLOR_MAP_CHANGE);
+   mask_list[8] = XCB_EVENT_MASK_NO_EVENT;
+
+   win = xcb_generate_id(_ecore_xcb_conn);
+   xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
+                     win, parent, x, y, w, h, 0,
+                     XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                     XCB_COPY_FROM_PARENT, mask, mask_list);
+
+   return win;
 }
 
 /**
@@ -168,43 +190,42 @@ EAPI Ecore_X_Window
 ecore_x_window_input_new(Ecore_X_Window parent,
                          int            x,
                          int            y,
-                         int            width,
-                         int            height)
-{
-   uint32_t         value_list[3];
-   Ecore_X_Window window;
-   xcb_visualid_t   vis = { XCB_WINDOW_CLASS_COPY_FROM_PARENT };
-   uint32_t         value_mask;
-
-   if (parent == 0) parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   value_mask = XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE;
-
-   value_list[0]  = 1;
-   value_list[1]  =
-     XCB_EVENT_MASK_KEY_PRESS         | XCB_EVENT_MASK_KEY_RELEASE      |
-     XCB_EVENT_MASK_BUTTON_PRESS      | XCB_EVENT_MASK_BUTTON_RELEASE   |
-     XCB_EVENT_MASK_ENTER_WINDOW      | XCB_EVENT_MASK_LEAVE_WINDOW     |
-     XCB_EVENT_MASK_POINTER_MOTION    | XCB_EVENT_MASK_EXPOSURE        |
-     XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_FOCUS_CHANGE      | XCB_EVENT_MASK_PROPERTY_CHANGE  |
-     XCB_EVENT_MASK_COLOR_MAP_CHANGE;
-   value_list[2]  = XCB_EVENT_MASK_NO_EVENT;
-
-   window = xcb_generate_id(_ecore_xcb_conn);
-   xcb_create_window(_ecore_xcb_conn,
-                   XCB_WINDOW_CLASS_COPY_FROM_PARENT,
-                   window, parent, x, y, width, height, 0,
-                   XCB_WINDOW_CLASS_INPUT_OUTPUT,
-                   vis,
-                   value_mask,
-                   value_list);
+                         int            w,
+                         int            h)
+{
+   Ecore_X_Window win;
+   uint32_t mask, mask_list[3];
 
-   if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root)
-     {
-     }
+   LOGFN(__FILE__, __LINE__, __FUNCTION__)
+   CHECK_XCB_CONN;
 
-   return window;
+   if (parent == 0)
+     parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   /* NB: Order here is very important due to xcb_cw_t enum */
+   mask = (XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK |
+           XCB_CW_DONT_PROPAGATE);
+
+   mask_list[0] = 1;
+   mask_list[1] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
+                   XCB_EVENT_MASK_BUTTON_PRESS |
+                   XCB_EVENT_MASK_BUTTON_RELEASE |
+                   XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
+                   XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
+                   XCB_EVENT_MASK_VISIBILITY_CHANGE |
+                   XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+                   XCB_EVENT_MASK_FOCUS_CHANGE |
+                   XCB_EVENT_MASK_PROPERTY_CHANGE |
+                   XCB_EVENT_MASK_COLOR_MAP_CHANGE);
+   mask_list[2] = XCB_EVENT_MASK_NO_EVENT;
+
+   win = xcb_generate_id(_ecore_xcb_conn);
+   xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
+                     win, parent, x, y, w, h, 0,
+                     XCB_WINDOW_CLASS_INPUT_ONLY,
+                     XCB_COPY_FROM_PARENT, mask, mask_list);
+
+   return win;
 }
 
 /**
@@ -213,27 +234,25 @@ ecore_x_window_input_new(Ecore_X_Window parent,
  *                 window of the default display is used.
  * @param   x      X position.
  * @param   y      Y position.
- * @param   width  Width.
- * @param   height Height.
- * @return         The new window handle.
+ * @param   w      Width.
+ * @param   h      Height.
+ * @return  The new window handle.
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
 ecore_x_window_manager_argb_new(Ecore_X_Window parent,
                                 int            x,
                                 int            y,
-                                int            width,
-                                int            height)
+                                int            w,
+                                int            h)
 {
-   Ecore_X_Window window = 0;
+   Ecore_X_Window win = 0;
 
-#ifdef ECORE_XCB_RENDER
-   window = _ecore_x_window_argb_internal_new(parent,
-                                              x, y, width, height,
-                                              1, 0);
-#endif /* ECORE_XCB_RENDER */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   return window;
+   win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 1, 0);
+
+   return win;
 }
 
 /**
@@ -242,27 +261,25 @@ ecore_x_window_manager_argb_new(Ecore_X_Window parent,
  *                 window of the default display is used.
  * @param   x      X position.
  * @param   y      Y position.
- * @param   width  Width.
- * @param   height Height.
- * @return         The new window handle.
+ * @param   w      Width.
+ * @param   h      Height.
+ * @return  The new window handle.
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
 ecore_x_window_argb_new(Ecore_X_Window parent,
                         int            x,
                         int            y,
-                        int            width,
-                        int            height)
+                        int            w,
+                        int            h)
 {
-   Ecore_X_Window window = 0;
+   Ecore_X_Window win = 0;
 
-#ifdef ECORE_XCB_RENDER
-   window = _ecore_x_window_argb_internal_new(parent,
-                                              x, y, width, height,
-                                              0, 0);
-#endif /* ECORE_XCB_RENDER */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   return window;
+   win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 0, 0);
+
+   return win;
 }
 
 /**
@@ -271,27 +288,25 @@ ecore_x_window_argb_new(Ecore_X_Window parent,
  *                 window of the default display is used.
  * @param   x      X position.
  * @param   y      Y position.
- * @param   width  Width.
- * @param   height Height.
- * @return         The new window handle.
+ * @param   w      Width.
+ * @param   h      Height.
+ * @return  The new window handle.
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
 ecore_x_window_override_argb_new(Ecore_X_Window parent,
                                  int            x,
                                  int            y,
-                                 int            width,
-                                 int            height)
+                                 int            w,
+                                 int            h)
 {
-   Ecore_X_Window window = 0;
+   Ecore_X_Window win = 0;
 
-#ifdef ECORE_XCB_RENDER
-   window = _ecore_x_window_argb_internal_new(parent,
-                                              x, y, width, height,
-                                              1, 0);
-#endif /* ECORE_XCB_RENDER */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   return window;
+   win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 1, 0);
+
+   return win;
 }
 
 /**
@@ -302,283 +317,331 @@ ecore_x_window_override_argb_new(Ecore_X_Window parent,
 
 /**
  * Deletes the given window.
- * @param   window The given window.
+ * @param   win The given window.
  * @ingroup Ecore_X_Window_Destroy_Group
  */
 EAPI void
-ecore_x_window_del(Ecore_X_Window window)
+ecore_x_window_free(Ecore_X_Window win)
 {
-   /* sorry sir, deleting the root window doesn't sound like
-    * a smart idea.
-    */
-   if (window)
-      xcb_destroy_window(_ecore_xcb_conn, window);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (win)
+     {
+        /* xcb_destroy_notify_event_t ev; */
+        /* Ecore_X_Window root; */
+
+          /* if (xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem == 1) */
+          /*   root = ((xcb_screen_t *)_ecore_xcb_screen)->root; */
+          /* else  */
+          /*   { */
+          /*      xcb_get_geometry_cookie_t cookie; */
+          /*      xcb_get_geometry_reply_t *reply; */
+
+     /*      cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win); */
+                 /*      reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL); */
+     /*      if (!reply) return; */
+                   /*      root = reply->root; */
+     /*      free(reply); */
+                     /*   } */
+
+     /* memset(&ev, 0, sizeof(xcb_destroy_notify_event_t)); */
+
+                       /* ev.response_type = XCB_DESTROY_NOTIFY; */
+     /* ev.window = win; */
+                         /* ev.event = root; */
+
+     /* xcb_send_event(_ecore_xcb_conn, 0, root,  */
+                           /*                XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |  */
+     /*                XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,  */
+                             /*                (const char *)&ev); */
+
+        xcb_destroy_window(_ecore_xcb_conn, win);
+//        ecore_x_flush();
+     }
 }
 
 /**
  * Sends a delete request to the given window.
- * @param   window The given window.
+ * @param   win The given window.
  * @ingroup Ecore_X_Window_Destroy_Group
  */
 EAPI void
-ecore_x_window_delete_request_send(Ecore_X_Window window)
+ecore_x_window_delete_request_send(Ecore_X_Window win)
 {
-   xcb_client_message_event_t ev;
-
-   /* sorry sir, deleting the root window doesn't sound like
-    * a smart idea.
-    */
-   if (window == 0)
-      return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   ev.response_type = XCB_CLIENT_MESSAGE;
-   ev.format = 32;
-   ev.sequence = 0;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
-   ev.data.data32[0] = ECORE_X_ATOM_WM_DELETE_WINDOW;
-   ev.data.data32[1] = XCB_CURRENT_TIME;
-
-   xcb_send_event(_ecore_xcb_conn, 0, window,
-                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+   if (!win) return;
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
+                                 XCB_EVENT_MASK_NO_EVENT,
+                                 ECORE_X_ATOM_WM_DELETE_WINDOW,
+                                 XCB_CURRENT_TIME, 0, 0, 0);
 }
 
-/**
- * @defgroup Ecore_X_Window_Configure_Group X Window Configure Functions
- *
- * Functions to configure X windows.
- */
-
-
-/**
- * Configures the given window with the given mask.
- * @param   window       The given window.
- * @param   mask         The given mask.
- * @param   x            The X coordinate of the window.
- * @param   y            The Y coordinate of the window.
- * @param   width        The width of the window.
- * @param   height       The height of the window.
- * @param   border_width The border width of the window.
- * @param   sibling      The sibling window of the window.
- * @param   stack_mode   The stack mode of the window.
- * @ingroup Ecore_X_Window_Configure_Group
- */
 EAPI void
-ecore_x_window_configure(Ecore_X_Window                window,
+ecore_x_window_configure(Ecore_X_Window                win,
                          Ecore_X_Window_Configure_Mask mask,
                          int                           x,
                          int                           y,
-                         int                           width,
-                         int                           height,
+                         int                           w,
+                         int                           h,
                          int                           border_width,
                          Ecore_X_Window                sibling,
                          int                           stack_mode)
 {
-   uint32_t *value_list;
-   uint32_t  value_mask;
-   int       length = 0;
-
-   if (!window)
-      return;
-
-   value_mask = mask;
-   for ( ; value_mask; value_mask >>= 1)
-     if (value_mask & 1)
-       length++;
-   value_list = (uint32_t *)malloc(sizeof(uint32_t) * length);
-   if (!value_list)
-      return;
-
-   value_mask = mask;
-   for ( ; value_mask; value_mask >>= 1, value_list++)
-      if (value_mask & 1)
-        {
-          switch (value_mask) {
-          case XCB_CONFIG_WINDOW_X:
-            *value_list = x;
-            break;
-          case XCB_CONFIG_WINDOW_Y:
-            *value_list = y;
-            break;
-          case XCB_CONFIG_WINDOW_WIDTH:
-            *value_list = width;
-            break;
-          case XCB_CONFIG_WINDOW_HEIGHT:
-            *value_list = height;
-            break;
-          case XCB_CONFIG_WINDOW_BORDER_WIDTH:
-            *value_list = border_width;
-            break;
-          case XCB_CONFIG_WINDOW_SIBLING:
-            *value_list = sibling;
-            break;
-          case XCB_CONFIG_WINDOW_STACK_MODE:
-            *value_list = stack_mode;
-            break;
-          }
-        }
+   uint16_t vmask = 0;
+   uint32_t vlist[7];
+   unsigned int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+
+   if (mask & XCB_CONFIG_WINDOW_X)
+     {
+        vmask |= XCB_CONFIG_WINDOW_X;
+        vlist[i++] = x;
+     }
+   if (mask & XCB_CONFIG_WINDOW_Y)
+     {
+        vmask |= XCB_CONFIG_WINDOW_Y;
+        vlist[i++] = y;
+     }
+   if (mask & XCB_CONFIG_WINDOW_WIDTH)
+     {
+        vmask |= XCB_CONFIG_WINDOW_WIDTH;
+        vlist[i++] = w;
+     }
+   if (mask & XCB_CONFIG_WINDOW_HEIGHT)
+     {
+        vmask |= XCB_CONFIG_WINDOW_HEIGHT;
+        vlist[i++] = h;
+     }
+   if (mask & XCB_CONFIG_WINDOW_BORDER_WIDTH)
+     {
+        vmask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
+        vlist[i++] = border_width;
+     }
+   if (mask & XCB_CONFIG_WINDOW_SIBLING)
+     {
+        vmask |= XCB_CONFIG_WINDOW_SIBLING;
+        vlist[i++] = sibling;
+     }
+   if (mask & XCB_CONFIG_WINDOW_STACK_MODE)
+     {
+        vmask |= XCB_CONFIG_WINDOW_STACK_MODE;
+        vlist[i++] = stack_mode;
+     }
 
-   xcb_configure_window(_ecore_xcb_conn, window, mask, value_list);
-   free(value_list);
+   xcb_configure_window(_ecore_xcb_conn, win, vmask,
+                        (const uint32_t *)&vlist);
+//   ecore_x_flush();
 }
 
 /**
+ * @defgroup Ecore_X_Window_Geometry_Group X Window Geometry Functions
+ *
+ * Functions that change or retrieve the geometry of X windows.
+ */
+
+/**
  * Moves a window to the position @p x, @p y.
  *
  * The position is relative to the upper left hand corner of the
  * parent window.
  *
- * @param   window The window to move.
- * @param   x      X position.
- * @param   y      Y position.
- * @ingroup Ecore_X_Window_Configure_Group
+ * @param   win The window to move.
+ * @param   x   X position.
+ * @param   y   Y position.
+ * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_move(Ecore_X_Window window,
+ecore_x_window_move(Ecore_X_Window win,
                     int            x,
                     int            y)
 {
-   uint32_t value_list[2];
-   uint32_t value_mask;
+   uint32_t list[2], mask;
 
-   if (!window)
-      return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   value_mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
+   if (!win) return;
 
-   value_list[0] = x;
-   value_list[1] = y;
+   mask = (XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y);
+   list[0] = x;
+   list[1] = y;
 
-   xcb_configure_window(_ecore_xcb_conn, window, value_mask, value_list);
+   xcb_configure_window(_ecore_xcb_conn, win, mask,
+                        (const uint32_t *)&list);
+//   ecore_x_flush();
 }
 
 /**
  * Resizes a window.
- * @param   window The window to resize.
- * @param   width  New width of the window.
- * @param   height New height of the window.
- * @ingroup Ecore_X_Window_Configure_Group
+ * @param   win The window to resize.
+ * @param   w   New width of the window.
+ * @param   h   New height of the window.
+ * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_resize(Ecore_X_Window window,
-                      int            width,
-                      int            height)
+ecore_x_window_resize(Ecore_X_Window win,
+                      int            w,
+                      int            h)
 {
-   uint32_t value_list[2];
-   uint32_t value_mask;
+   uint32_t list[2], mask;
 
-   if (!window)
-      return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (width < 1) width = 1;
-   if (height < 1) height = 1;
+   if (!win) return;
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
 
-   value_mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
+   mask = (XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT);
+   list[0] = w;
+   list[1] = h;
 
-   value_list[0] = width;
-   value_list[1] = height;
-
-   xcb_configure_window(_ecore_xcb_conn, window, value_mask, value_list);
+   xcb_configure_window(_ecore_xcb_conn, win, mask,
+                        (const uint32_t *)&list);
+//   ecore_x_flush();
 }
 
 /**
  * Moves and resizes a window.
- * @param   window The window to move and resize.
- * @param   x      New X position of the window.
- * @param   y      New Y position of the window.
- * @param   width  New width of the window.
- * @param   height New height of the window.
- * @ingroup Ecore_X_Window_Configure_Group
+ * @param   win The window to move and resize.
+ * @param   x   New X position of the window.
+ * @param   y   New Y position of the window.
+ * @param   w   New width of the window.
+ * @param   h   New height of the window.
+ * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_move_resize(Ecore_X_Window window,
+ecore_x_window_move_resize(Ecore_X_Window win,
                            int            x,
                            int            y,
-                           int            width,
-                           int            height)
+                           int            w,
+                           int            h)
 {
-   uint32_t value_list[4];
-   uint32_t value_mask;
+   uint32_t list[4], mask;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (!window)
-      return;
+   if (!win) return;
+   if (w < 1) w = 1;
+   if (h < 1) h = 1;
 
-   if (width < 1) width = 1;
-   if (height < 1) height = 1;
+   mask = (XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y |
+           XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT);
+   list[0] = x;
+   list[1] = y;
+   list[2] = w;
+   list[3] = h;
 
-   value_mask =
-     XCB_CONFIG_WINDOW_X     | XCB_CONFIG_WINDOW_Y     |
-     XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
+   xcb_configure_window(_ecore_xcb_conn, win, mask,
+                        (const uint32_t *)&list);
+//   ecore_x_flush();
+}
 
-   value_list[0] = x;
-   value_list[1] = y;
-   value_list[2] = width;
-   value_list[3] = height;
+/**
+ * Retrieves the width of the border of the given window.
+ * @param   win The given window.
+ * @return  Width of the border of @p win.
+ * @ingroup Ecore_X_Window_Geometry_Group
+ */
+EAPI int
+ecore_x_window_border_width_get(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   xcb_configure_window(_ecore_xcb_conn, window, value_mask, value_list);
+   if (!win) return 0;
+   return ecore_x_drawable_border_width_get(win);
 }
 
 /**
  * Sets the width of the border of the given window.
- * @param   window       The given window.
- * @param   border_width The new border width.
- * @ingroup Ecore_X_Window_Configure_Group
+ * @param   win The given window.
+ * @param   width The new border width.
+ * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_border_width_set(Ecore_X_Window window,
+ecore_x_window_border_width_set(Ecore_X_Window win,
                                 int            border_width)
 {
-   uint32_t value_list;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* doesn't make sense to call this on a root window */
-   if (!window)
-      return;
+   if (!win) return;
 
-   value_list = border_width;
+   list = border_width;
 
-   xcb_configure_window(_ecore_xcb_conn, window, XCB_CONFIG_WINDOW_BORDER_WIDTH, &value_list);
+   xcb_configure_window(_ecore_xcb_conn, win,
+                        XCB_CONFIG_WINDOW_BORDER_WIDTH, &list);
+//   ecore_x_flush();
 }
 
 /**
+ * @defgroup Ecore_X_Window_Z_Order_Group X Window Z Order Functions
+ *
+ * Functions that change the Z order of X windows.
+ */
+
+/**
  * Raises the given window.
- * @param   window The window to raise.
- * @ingroup Ecore_X_Window_Configure_Group
+ * @param   win The window to raise.
+ * @ingroup Ecore_X_Window_Z_Order_Group
  */
 EAPI void
-ecore_x_window_raise(Ecore_X_Window window)
+ecore_x_window_raise(Ecore_X_Window win)
 {
-   uint32_t value_list;
+   uint32_t list[] = { XCB_STACK_MODE_ABOVE };
 
-   if (!window)
-      return;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   value_list = XCB_STACK_MODE_ABOVE;
-
-   xcb_configure_window(_ecore_xcb_conn, window, XCB_CONFIG_WINDOW_STACK_MODE, &value_list);
+   xcb_configure_window(_ecore_xcb_conn, win,
+                        XCB_CONFIG_WINDOW_STACK_MODE, list);
+//   ecore_x_flush();
 }
 
 /**
  * Lowers the given window.
- * @param   window The window to lower.
- * @ingroup Ecore_X_Window_Configure_Group
+ * @param   win The window to lower.
+ * @ingroup Ecore_X_Window_Z_Order_Group
  */
 EAPI void
-ecore_x_window_lower(Ecore_X_Window window)
+ecore_x_window_lower(Ecore_X_Window win)
 {
-   uint32_t value_list;
+   uint32_t list[] = { XCB_STACK_MODE_BELOW };
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (!window)
-      return;
+   xcb_configure_window(_ecore_xcb_conn, win,
+                        XCB_CONFIG_WINDOW_STACK_MODE, list);
+//   ecore_x_flush();
+}
 
-   value_list = XCB_STACK_MODE_BELOW;
+/**
+ * Retrieves the depth of the given window.
+ * @param  win The given window.
+ * @return Depth of the window.
+ */
+EAPI int
+ecore_x_window_depth_get(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   xcb_configure_window(_ecore_xcb_conn, window, XCB_CONFIG_WINDOW_STACK_MODE, &value_list);
+   return ecore_x_drawable_depth_get(win);
 }
 
 /**
- * @defgroup Evas_X_Window_Change_Properties_Group X Window Change Property Functions
+ * @defgroup Ecore_X_Window_Properties_Group X Window Property Functions
  *
- * Functions that change window properties.
+ * Functions that set window properties.
  */
 
 /**
@@ -587,47 +650,37 @@ ecore_x_window_lower(Ecore_X_Window window)
  * The default properties set for the window are @c WM_CLIENT_MACHINE and
  * @c _NET_WM_PID.
  *
- * @param   window The given window.
- * @ingroup Ecore_X_Window_Change_Property_Group
+ * @param   win The given window.
+ * @ingroup Ecore_X_Window_Properties_Group
  */
 EAPI void
-ecore_x_window_defaults_set(Ecore_X_Window window)
-{
-   char   buf[MAXHOSTNAMELEN];
-   pid_t  pid;
-   int    argc;
-   char **argv;
-
-   /*
-    * Set WM_CLIENT_MACHINE.
-    */
-   gethostname(buf, MAXHOSTNAMELEN);
-   buf[MAXHOSTNAMELEN - 1] = '\0';
-   /* The ecore function uses UTF8 which Xlib may not like (especially
-    * with older clients) */
-   /* ecore_xcb_window_prop_string_set(win, ECORE_X_ATOM_WM_CLIENT_MACHINE,
-                                 (char *)buf); */
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       ECORE_X_ATOM_WM_CLIENT_MACHINE,
-                       ECORE_X_ATOM_STRING,
-                       8, strlen(buf), buf);
-
-   /*
-    * Set _NET_WM_PID
-    */
-   pid = getpid();
-   ecore_x_netwm_pid_set(window, pid);
+ecore_x_window_defaults_set(Ecore_X_Window win)
+{
+   char buff[MAXHOSTNAMELEN], **argv;
+   int argc;
+   pid_t pid;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   ecore_x_netwm_window_type_set(window, ECORE_X_WINDOW_TYPE_NORMAL);
+   gethostname(buff, MAXHOSTNAMELEN);
+   buff[MAXHOSTNAMELEN - 1] = '\0';
 
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
+                       ECORE_X_ATOM_WM_CLIENT_MACHINE, ECORE_X_ATOM_STRING,
+                       8, strlen(buff), buff);
+
+   pid = getpid();
+   ecore_x_netwm_pid_set(win, pid);
+   ecore_x_netwm_window_type_set(win, ECORE_X_WINDOW_TYPE_NORMAL);
    ecore_app_args_get(&argc, &argv);
-   ecore_x_icccm_command_set(window, argc, argv);
+   ecore_x_icccm_command_set(win, argc, argv);
 }
 
 /**
  * @defgroup Ecore_X_Window_Visibility_Group X Window Visibility Functions
  *
- * Functions to change the visibility of X windows.
+ * Functions to access and change the visibility of X windows.
  */
 
 /**
@@ -635,13 +688,17 @@ ecore_x_window_defaults_set(Ecore_X_Window window)
  *
  * Synonymous to "mapping" a window in X Window System terminology.
  *
- * @param   window The window to show.
- * @ingroup Ecore_X_Window_Visibility_Group
+ * @param   win The window to show.
+ * @ingroup Ecore_X_Window_Visibility
  */
 EAPI void
-ecore_x_window_show(Ecore_X_Window window)
+ecore_x_window_show(Ecore_X_Window win)
 {
-   xcb_map_window(_ecore_xcb_conn, window);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (win)
+     xcb_map_window(_ecore_xcb_conn, win);
 }
 
 /**
@@ -649,943 +706,921 @@ ecore_x_window_show(Ecore_X_Window window)
  *
  * Synonymous to "unmapping" a window in X Window System terminology.
  *
- * @param   window The window to hide.
- * @ingroup Ecore_X_Window_Visibility_Group
+ * @param   win The window to hide.
+ * @ingroup Ecore_X_Window_Visibility
  */
 EAPI void
-ecore_x_window_hide(Ecore_X_Window window)
+ecore_x_window_hide(Ecore_X_Window win)
 {
-   xcb_unmap_notify_event_t ev;
-   Ecore_X_Window           root;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* ICCCM: SEND unmap event... */
-   root = window;
-   /* FIXME: is it correct ? */
-   if (xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem == 1)
-     root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-   else
+   if (win)
      {
-        xcb_get_geometry_cookie_t   cookie;
-        xcb_get_geometry_reply_t   *rep;
-        Ecore_X_Drawable            draw;
-
-        /* FIXME: can we avoid round trips, here ? */
-        draw = window;
-        cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, draw);
-        rep = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
-        if (!rep)
-           return;
-        root = rep->root;
-        free(rep);
-     }
-   ev.response_type = XCB_UNMAP_NOTIFY;
-   ev.pad0 = 0;
-   ev.sequence = 0;
-   ev.event = root;
-   ev.window = window;
-   ev.from_configure = 0;
+        xcb_unmap_notify_event_t ev;
+        Ecore_X_Window root;
+
+        if (xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem == 1)
+          root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+        else
+          {
+             xcb_get_geometry_cookie_t cookie;
+             xcb_get_geometry_reply_t *reply;
+
+             cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
+             reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
+             if (!reply) return;
+             root = reply->root;
+             free(reply);
+          }
+
+        memset(&ev, 0, sizeof(xcb_unmap_notify_event_t));
+
+        ev.response_type = XCB_UNMAP_NOTIFY;
+        ev.window = win;
+        ev.event = root;
+        ev.from_configure = 0;
 
-   xcb_send_event(_ecore_xcb_conn, 0, root,
-                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
-                  (const char *)&ev);
-   xcb_unmap_window(_ecore_xcb_conn, window);
+        xcb_send_event(_ecore_xcb_conn, 0, root,
+                       (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
+                        XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT),
+                       (const char *)&ev);
+
+        xcb_unmap_window(_ecore_xcb_conn, win);
+//        ecore_x_flush();
+     }
 }
 
 /**
- * @defgroup Ecore_X_Window_Input_Focus_Group X Window Input Focus Functions
+ * @defgroup Ecore_X_Window_Focus_Functions X Window Focus Functions
  *
- * Functions that manage the focus of an X Window.
+ * Functions that give the focus to an X Window.
  */
 
 /**
- * Sets the focus to the window @p window.
- * @param   window The window to focus.
- * @ingroup Ecore_X_Window_Input_Focus_Group
+ * Sets the focus to the window @p win.
+ * @param   win The window to focus.
+ * @ingroup Ecore_X_Window_Focus_Functions
  */
 EAPI void
-ecore_x_window_focus(Ecore_X_Window window)
+ecore_x_window_focus(Ecore_X_Window win)
 {
-   Ecore_X_Time time = XCB_CURRENT_TIME;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (window == 0) window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
-   /* xcb_set_input_focus(_ecore_xcb_conn, XCB_INPUT_FOCUS_NONE, win, time); */
    xcb_set_input_focus(_ecore_xcb_conn,
-                       XCB_INPUT_FOCUS_POINTER_ROOT, window, time);
+                       XCB_INPUT_FOCUS_PARENT, win, XCB_CURRENT_TIME);
+//   ecore_x_flush();
 }
 
 /**
  * Sets the focus to the given window at a specific time.
- * @param   window The window to focus.
- * @param   time   When to set the focus to the window.
- * @ingroup Ecore_X_Window_Input_Focus_Group
+ * @param   win The window to focus.
+ * @param   t   When to set the focus to the window.
+ * @ingroup Ecore_X_Window_Focus_Functions
  */
 EAPI void
-ecore_x_window_focus_at_time(Ecore_X_Window window,
-                             Ecore_X_Time   time)
+ecore_x_window_focus_at_time(Ecore_X_Window win,
+                             Ecore_X_Time   time __UNUSED__)
 {
-   if (window == 0) window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* xcb_set_input_focus(_ecore_xcb_conn, XCB_INPUT_FOCUS_NONE, win, time); */
-   xcb_set_input_focus(_ecore_xcb_conn,
-                       XCB_INPUT_FOCUS_POINTER_ROOT, window, time);
+   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   xcb_set_input_focus(_ecore_xcb_conn, 
+                       XCB_INPUT_FOCUS_PARENT, win, XCB_CURRENT_TIME);
+//   ecore_x_flush();
 }
 
 /**
- * @defgroup Ecore_X_Window_Reparent_Group X Window Reparent Functions
+ * @defgroup Ecore_X_Window_Parent_Group X Window Parent Functions
  *
  * Functions that retrieve or changes the parent window of a window.
  */
 
 /**
  * Moves a window to within another window at a given position.
- * @param   window     The window to reparent.
+ * @param   win        The window to reparent.
  * @param   new_parent The new parent window.
  * @param   x          X position within new parent window.
  * @param   y          Y position within new parent window.
- * @ingroup Ecore_X_Window_Reparent_Group
+ * @ingroup Ecore_X_Window_Parent_Group
  */
 EAPI void
-ecore_x_window_reparent(Ecore_X_Window window,
-                        Ecore_X_Window new_parent,
+ecore_x_window_reparent(Ecore_X_Window win,
+                        Ecore_X_Window parent,
                         int            x,
                         int            y)
 {
-   if (new_parent == 0) new_parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   xcb_reparent_window(_ecore_xcb_conn, window, new_parent, x, y);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if (parent == 0)
+     parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
-/**
- * @defgroup Ecore_X_Window_Change_Attributes_Group X Window Change Attributes Functions
- *
- * Functions that change the attributes of a window.
- */
+   xcb_reparent_window(_ecore_xcb_conn, win, parent, x, y);
+//   ecore_x_flush();
+}
 
-/**
- * Sets the background pixmap of the given window.
- * @param   window The given window.
- * @param   pixmap The pixmap to set to.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_pixmap_set(Ecore_X_Window window,
+ecore_x_window_pixmap_set(Ecore_X_Window win,
                           Ecore_X_Pixmap pixmap)
 {
-   uint32_t value_list;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   value_list = pixmap;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_BACK_PIXMAP, &value_list);
+   list = pixmap;
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_BACK_PIXMAP, &list);
+//   ecore_x_flush();
 }
 
 /**
  * Sets the background color of the given window.
- * @param   window The given window.
- * @param   red    The red component of the color to set to.
- * @param   green  The green component of the color to set to.
- * @param   blue   The blue component of the color to set to.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
+ * @param win   The given window
+ * @param r     red value (0...65536, 16 bits)
+ * @param g     green value (0...65536, 16 bits)
+ * @param b     blue value (0...65536, 16 bits)
  */
 EAPI void
-ecore_x_window_background_color_set(Ecore_X_Window window,
+ecore_x_window_background_color_set(Ecore_X_Window win,
                                     unsigned short red,
                                     unsigned short green,
                                     unsigned short blue)
 {
    xcb_alloc_color_cookie_t cookie;
-   xcb_alloc_color_reply_t *rep;
-   uint32_t                 value_list;
-
-   /* FIXME: should I provide a reply, and not the color components, here ? */
-   /*        (because of roundtrips) */
-   cookie = xcb_alloc_color_unchecked(_ecore_xcb_conn,
-                                      ((xcb_screen_t *)_ecore_xcb_screen)->default_colormap,
-                                      red, green, blue);
-   rep = xcb_alloc_color_reply(_ecore_xcb_conn, cookie, NULL);
-   if (!rep)
-     return;
-
-   value_list = rep->pixel;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_BACK_PIXEL, &value_list);
-   free(rep);
+   xcb_alloc_color_reply_t *reply;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   cookie =
+     xcb_alloc_color_unchecked(_ecore_xcb_conn,
+                               ((xcb_screen_t *)_ecore_xcb_screen)->default_colormap,
+                               red, green, blue);
+   reply = xcb_alloc_color_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return;
+   list = reply->pixel;
+   free(reply);
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_BACK_PIXEL, &list);
+//   ecore_x_flush();
 }
 
-/**
- * Sets the bit gravity of the given window.
- * @param   window  The given window.
- * @param   gravity The gravity.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_pixel_gravity_set(Ecore_X_Window  window,
+ecore_x_window_pixel_gravity_set(Ecore_X_Window  win,
                                  Ecore_X_Gravity gravity)
 {
-   uint32_t value_list;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   value_list = gravity;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_BIT_GRAVITY, &value_list);
+   list = gravity;
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_BIT_GRAVITY, &list);
+//   ecore_x_flush();
 }
 
-/**
- * Sets the gravity of the given window.
- * @param   window  The given window.
- * @param   gravity The gravity.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_gravity_set(Ecore_X_Window  window,
+ecore_x_window_gravity_set(Ecore_X_Window  win,
                            Ecore_X_Gravity gravity)
 {
-   uint32_t value_list;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   value_list = gravity;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_WIN_GRAVITY, &value_list);
+   list = gravity;
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_WIN_GRAVITY, &list);
+//   ecore_x_flush();
 }
 
-/**
- * Sets the override attribute of the given window.
- * @param   window            The given window.
- * @param   override_redirect The override_redirect boolean.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_override_set(Ecore_X_Window window,
-                            int            override_redirect)
+ecore_x_window_override_set(Ecore_X_Window win,
+                            Eina_Bool      override)
 {
-   uint32_t value_list;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   value_list = override_redirect;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_OVERRIDE_REDIRECT, &value_list);
+   list = override;
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_OVERRIDE_REDIRECT, &list);
+//   ecore_x_flush();
 }
 
 /**
- * Shows the cursor of the given window.
- * @param   window The given window.
- * @param   show   If set to @c 0, hide the cursor. Show it otherwise.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
+ * @brief Show the cursor on a window of type Ecore_X_Window.
+ * @param win The window for which the cursor will be showed.
+ * @param show Enables the show of the cursor on the window if equals EINA_TRUE, disables if equals EINA_FALSE.
  */
 EAPI void
-ecore_x_window_cursor_show(Ecore_X_Window window,
-                           int            show)
+ecore_x_window_cursor_show(Ecore_X_Window win,
+                           Eina_Bool      show)
 {
-   if (window == 0) window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   uint32_t list = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
    if (!show)
      {
-        Ecore_X_Cursor   cursor;
-        Ecore_X_Drawable draw;
-        Ecore_X_Pixmap   pixmap;
-        Ecore_X_Pixmap   mask;
-        Ecore_X_GC       gc;
-        xcb_point_t      point;
-        uint32_t         value_list;
-
-        draw = window;
-        pixmap = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_pixmap(_ecore_xcb_conn,
-                          1, pixmap, draw,
-                          1, 1);
-        mask = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_pixmap(_ecore_xcb_conn,
-                          1, mask, draw,
-                          1, 1);
-
+        Ecore_X_Cursor cursor;
+        Ecore_X_Pixmap p, m;
+        Ecore_X_GC gc;
+        xcb_point_t point;
+
+        p = xcb_generate_id(_ecore_xcb_conn);
+        xcb_create_pixmap(_ecore_xcb_conn, 1, p, win, 1, 1);
+        m = xcb_generate_id(_ecore_xcb_conn);
+        xcb_create_pixmap(_ecore_xcb_conn, 1, m, win, 1, 1);
         gc = xcb_generate_id(_ecore_xcb_conn);
-        xcb_create_gc (_ecore_xcb_conn, gc, draw, 0, NULL);
-        value_list = 0;
-        xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_FOREGROUND, &value_list);
-
-        draw = mask;
+        xcb_create_gc(_ecore_xcb_conn, gc, win, 0, NULL);
+        xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_FOREGROUND, &list);
         point.x = 0;
         point.y = 0;
-        xcb_poly_point(_ecore_xcb_conn, XCB_COORD_MODE_ORIGIN, draw,
-                       gc, 1, &point);
-
+        xcb_poly_point(_ecore_xcb_conn, XCB_COORD_MODE_ORIGIN,
+                       win, gc, 1, &point);
         xcb_free_gc(_ecore_xcb_conn, gc);
 
         cursor = xcb_generate_id(_ecore_xcb_conn);
         xcb_create_cursor(_ecore_xcb_conn, cursor,
-                          pixmap, mask,
-                          0, 0, 0,
-                          0, 0, 0,
-                          0, 0);
-        value_list = cursor;
-        xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                     XCB_CW_CURSOR, &value_list);
+                          p, m, 0, 0, 0, 0, 0, 0, 0, 0);
+        list = cursor;
+
+        xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                     XCB_CW_CURSOR, &list);
 
         xcb_free_cursor(_ecore_xcb_conn, cursor);
-        xcb_free_pixmap(_ecore_xcb_conn, mask);
-        xcb_free_pixmap(_ecore_xcb_conn, pixmap);
+        xcb_free_pixmap(_ecore_xcb_conn, m);
+        xcb_free_pixmap(_ecore_xcb_conn, p);
      }
    else
      {
-        uint32_t value_list;
-
-        value_list = 0;
-        xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                     XCB_CW_CURSOR, &value_list);
+        xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                     XCB_CW_CURSOR, &list);
      }
+//   ecore_x_flush();
 }
 
-/**
- * Sets the cursor of the given window.
- * @param   window The given window.
- * @param   cursor The given cursor.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_cursor_set(Ecore_X_Window window,
+ecore_x_window_cursor_set(Ecore_X_Window win,
                           Ecore_X_Cursor cursor)
 {
-   uint32_t value_list;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   list = cursor;
 
-   value_list = cursor;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_CURSOR, &value_list);
+   xcb_change_window_attributes(_ecore_xcb_conn, win, XCB_CW_CURSOR, &list);
+//   ecore_x_flush();
 }
 
-/**
- * Todo
- * @param   window The given window.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_container_manage(Ecore_X_Window window)
+ecore_x_window_container_manage(Ecore_X_Window win)
 {
-   uint32_t value_list;
+   uint32_t list;
 
-   value_list =
-     XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_EVENT_MASK, &value_list);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   list = (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+           XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY);
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_EVENT_MASK, &list);
+//   ecore_x_flush();
 }
 
-/**
- * Todo
- * @param   window The given window.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_client_manage(Ecore_X_Window window)
-{
-   uint32_t value_list;
-
-   value_list =
-     XCB_EVENT_MASK_VISIBILITY_CHANGE |
-/*      XCB_EVENT_MASK_RESIZE_REDIRECT | */
-     XCB_EVENT_MASK_STRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_FOCUS_CHANGE |
-     XCB_EVENT_MASK_PROPERTY_CHANGE |
-     XCB_EVENT_MASK_COLOR_MAP_CHANGE;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_EVENT_MASK, &value_list);
+ecore_x_window_client_manage(Ecore_X_Window win)
+{
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   list = (XCB_EVENT_MASK_VISIBILITY_CHANGE |
+           XCB_EVENT_MASK_FOCUS_CHANGE |
+           XCB_EVENT_MASK_PROPERTY_CHANGE |
+           XCB_EVENT_MASK_COLOR_MAP_CHANGE |
+           XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+           XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY);
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_EVENT_MASK, &list);
+
 #ifdef ECORE_XCB_SHAPE
-   xcb_shape_select_input(_ecore_xcb_conn, window, 1);
-#endif /* ECORE_XCB_SHAPE */
+   xcb_shape_select_input(_ecore_xcb_conn, win, EINA_TRUE);
+#endif
+//   ecore_x_flush();
 }
 
-/**
- * Todo
- * @param   window The given window.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_sniff(Ecore_X_Window window)
+ecore_x_window_sniff(Ecore_X_Window win)
 {
-   uint32_t value_list;
+   uint32_t list;
 
-   value_list =
-     XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_PROPERTY_CHANGE;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_EVENT_MASK, &value_list);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   list = (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
+           XCB_EVENT_MASK_PROPERTY_CHANGE);
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_EVENT_MASK, &list);
+//   ecore_x_flush();
 }
 
-/**
- * Todo
- * @param   window The given window.
- * @ingroup Ecore_X_Window_Change_Attributes_Group
- */
 EAPI void
-ecore_x_window_client_sniff(Ecore_X_Window window)
-{
-   uint32_t value_list;
-
-   value_list =
-     XCB_EVENT_MASK_VISIBILITY_CHANGE |
-     XCB_EVENT_MASK_STRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_FOCUS_CHANGE |
-     XCB_EVENT_MASK_PROPERTY_CHANGE |
-     XCB_EVENT_MASK_COLOR_MAP_CHANGE;
-   xcb_change_window_attributes(_ecore_xcb_conn, window,
-                                XCB_CW_EVENT_MASK, &value_list);
+ecore_x_window_client_sniff(Ecore_X_Window win)
+{
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   list = (XCB_EVENT_MASK_VISIBILITY_CHANGE |
+           XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+           XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
+           XCB_EVENT_MASK_FOCUS_CHANGE |
+           XCB_EVENT_MASK_PROPERTY_CHANGE |
+           XCB_EVENT_MASK_COLOR_MAP_CHANGE);
+
+   xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                XCB_CW_EVENT_MASK, &list);
 #ifdef ECORE_XCB_SHAPE
-   xcb_shape_select_input(_ecore_xcb_conn, window, 1);
-#endif /* ECORE_XCB_SHAPE */
+   xcb_shape_select_input(_ecore_xcb_conn, win, EINA_TRUE);
+#endif
+//   ecore_x_flush();
 }
 
-/**
- * Clears an area of the given window.
- * @param   window  The given window.
- * @param   x            The X coordinate of the area.
- * @param   y            The Y coordinate of the area.
- * @param   width        The width of the area.
- * @param   height       The height of the area.
- * @ingroup Ecore_X_Window_Clear_Area_Group
- */
 EAPI void
-ecore_x_window_area_clear(Ecore_X_Window window,
+ecore_x_window_area_clear(Ecore_X_Window win,
                           int            x,
                           int            y,
-                          int            width,
-                          int            height)
+                          int            w,
+                          int            h)
 {
-   xcb_clear_area(_ecore_xcb_conn, 0, window, x, y, width, height);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   xcb_clear_area(_ecore_xcb_conn, 0, win, x, y, w, h);
+//   ecore_x_flush();
 }
 
-/**
- * Exposes an area of the given window.
- * @param   window  The given window.
- * @param   x            The X coordinate of the area.
- * @param   y            The Y coordinate of the area.
- * @param   width        The width of the area.
- * @param   height       The height of the area.
- * @ingroup Ecore_X_Window_Clear_Area_Group
- */
 EAPI void
-ecore_x_window_area_expose(Ecore_X_Window window,
+ecore_x_window_area_expose(Ecore_X_Window win,
                            int            x,
                            int            y,
-                           int            width,
-                           int            height)
+                           int            w,
+                           int            h)
 {
-   xcb_clear_area(_ecore_xcb_conn, 1, window, x, y, width, height);
-}
-
-
-/**
- * @defgroup Ecore_X_Window_Save_Set_Group X Window Change Save Set Functions
- *
- * Functions that either inserts or deletes the specified window from
- * the client's save-set.
- */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/**
- * Inserts the window in the client's save-set.
- * @param   window The window to insert in the client's save-set.
- * @ingroup Ecore_X_Window_Save_Set_Group
- */
-EAPI void
-ecore_x_window_save_set_add(Ecore_X_Window window)
-{
-   xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_INSERT, window);
+   xcb_clear_area(_ecore_xcb_conn, 1, win, x, y, w, h);
+//   ecore_x_flush();
 }
 
-/**
- * Deletes the window from the client's save-set.
- * @param   window The window to delete from the client's save-set.
- * @ingroup Ecore_X_Window_Save_Set_Group
- */
 EAPI void
-ecore_x_window_save_set_del(Ecore_X_Window window)
+ecore_x_window_save_set_add(Ecore_X_Window win)
 {
-   xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_DELETE, window);
-}
-
-/******************************
- *
- * Request that have a reply
- *
- ******************************/
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_INSERT, win);
+}
 
-/**
- * Sends the GetInputFocus request.
- * @ingroup Ecore_X_Window_Input_Focus_Group
- */
 EAPI void
-ecore_x_get_input_focus_prefetch(void)
+ecore_x_window_save_set_del(Ecore_X_Window win)
 {
-   xcb_get_input_focus_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_get_input_focus_unchecked(_ecore_xcb_conn);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_DELETE, win);
 }
 
 /**
- * Gets the reply of the GetInputFocus request sent by ecore_x_get_input_focus_prefetch().
- * @ingroup Ecore_X_Window_Input_Focus_Group
+ * gets the window that has focus.
+ * @return  The window that has focus.
+ * @ingroup Ecore_X_Window_Focus_Functions
  */
-EAPI void
-ecore_x_get_input_focus_fetch(void)
+EAPI Ecore_X_Window
+ecore_x_window_focus_get(void)
 {
    xcb_get_input_focus_cookie_t cookie;
    xcb_get_input_focus_reply_t *reply;
+   Ecore_X_Window focus = 0;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   cookie = xcb_get_input_focus_unchecked(_ecore_xcb_conn);
    reply = xcb_get_input_focus_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   if (!reply) return 0;
+   focus = reply->focus;
+   free(reply);
+   return focus;
 }
 
-/**
- * Gets the window that has focus.
- * @return  The window that has focus.
- *
- * Returns the window that has the focus. If an error aoocured, @c 0
- * is returned, otherwise the function returns the window that has focus.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_input_focus_prefetch(), which sends the GetInputFocus request,
- * then ecore_x_get_input_focus_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Input_Focus_Group
- */
-EAPI Ecore_X_Window
-ecore_x_window_focus_get(void)
+EAPI int
+ecore_x_window_argb_get(Ecore_X_Window win)
 {
-   xcb_get_input_focus_reply_t *reply;
-   Ecore_X_Window               window = 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return window;
-
-   return reply->focus;
-}
+   uint8_t ret = 0;
+#ifdef ECORE_XCB_RENDER
+   Ecore_X_Visual visual;
+#endif
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/**
- * @defgroup Ecore_X_Window_Get_Attributes_Group X Window Get Attributes Functions
- *
- * Functions that get the attributes of a window.
- */
+//   if (!win) return ret;
 
+#ifdef ECORE_XCB_RENDER
+   /* grab the window's visual */
+   visual = _ecore_xcb_window_visual_get(win);
 
-/**
- * Sends the GetWindowAttributes request.
- * @ingroup Ecore_X_Window_Get_Attributes_Group
- */
-EAPI void
-ecore_x_get_window_attributes_prefetch(Ecore_X_Window window)
-{
-   xcb_get_window_attributes_cookie_t cookie;
+   /* check if this visual supports alpha */
+   ret = _ecore_xcb_render_visual_supports_alpha(visual);
+#endif
 
-   cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, window);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return ret;
 }
 
-/**
- * Gets the reply of the GetWindowAttributes request sent by ecore_x_get_window_attributes_prefetch().
- * @ingroup Ecore_X_Window_Get_Attributes_Group
- */
-EAPI void
-ecore_x_get_window_attributes_fetch(void)
+EAPI Eina_Bool
+ecore_x_window_manage(Ecore_X_Window win)
 {
    xcb_get_window_attributes_cookie_t cookie;
    xcb_get_window_attributes_reply_t *reply;
+   xcb_void_cookie_t change_cookie;
+   xcb_generic_error_t *err;
+   uint32_t list;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
+   cookie = xcb_get_window_attributes(_ecore_xcb_conn, win);
    reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   if (!reply) return EINA_FALSE;
+
+   ecore_x_sync(); // needed
+
+   list = (XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
+           XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_RESIZE_REDIRECT |
+           XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+           XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
+           XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+           XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
+           reply->your_event_mask);
+   free(reply);
+
+   change_cookie = xcb_change_window_attributes(_ecore_xcb_conn, win,
+                                                XCB_CW_EVENT_MASK, &list);
+
+   ecore_x_sync(); // needed
+
+   err = xcb_request_check(_ecore_xcb_conn, change_cookie);
+   if (err)
+     {
+        _ecore_xcb_error_handle(err);
+        free(err);
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
 }
 
-/**
- * Retrieves the attributes of a window.
- * @param windows Unused.
- * @param att_ret Pointer to an Ecore_X_Window_Attributes
- *                  structure in which the attributes of a window
- *                  are to be stored.
- *
- * Retrieves the attributes of a window. If
- * @p att_ret is @c NULL, the function does nothing. If an error
- * occurred, @p att_ret is set to 0. Otherwise, the @p att_ret structure
- * is filled with the attributes os the requested window.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_window_attributes_prefetch(), which sends the GetWindowAttributes request,
- * then ecore_x_get_window_attributes_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Get_Attributes_Group
- */
-EAPI int
-ecore_x_window_attributes_get(Ecore_X_Window             window __UNUSED__,
+EAPI Eina_Bool
+ecore_x_window_attributes_get(Ecore_X_Window             win,
                               Ecore_X_Window_Attributes *att_ret)
 {
+   xcb_get_window_attributes_cookie_t cookie;
    xcb_get_window_attributes_reply_t *reply;
+   xcb_get_geometry_cookie_t gcookie;
+   xcb_get_geometry_reply_t *greply;
 
-   if (!att_ret) return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+   cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
+   reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
    memset(att_ret, 0, sizeof(Ecore_X_Window_Attributes));
 
-   if (reply->map_state != XCB_MAP_STATE_UNMAPPED) att_ret->visible = 1;
-   if (reply->map_state == XCB_MAP_STATE_VIEWABLE) att_ret->viewable = 1;
-   if (reply->override_redirect) att_ret->override = 1;
-   if (reply->_class == XCB_WINDOW_CLASS_INPUT_ONLY) att_ret->input_only = 1;
-   if (reply->save_under) att_ret->save_under = 1;
+   if (reply->map_state != XCB_MAP_STATE_UNMAPPED)
+     att_ret->visible = EINA_TRUE;
 
-   att_ret->event_mask.mine         = reply->your_event_mask;
-   att_ret->event_mask.all          = reply->all_event_masks;
-   att_ret->event_mask.no_propagate = reply->do_not_propagate_mask;
-   att_ret->window_gravity          = reply->win_gravity;
-   att_ret->pixel_gravity           = reply->bit_gravity;
-   att_ret->colormap                = reply->colormap;
-   att_ret->visual                  = reply->visual;
+   if (reply->map_state == XCB_MAP_STATE_VIEWABLE)
+     att_ret->viewable = EINA_TRUE;
 
-   return 1;
-}
+   if (reply->override_redirect)
+     att_ret->override = EINA_TRUE;
 
-/**
- * Finds out whether the given window is currently visible.
- * @param  window Unused.
- * @return        1 if the window is visible, otherwise 0.
- *
- * Finds out whether the given window is currently visible.
- * If an error occurred, or if the window is not visible, 0 is
- * returned. Otherwise 1 is returned.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_get_window_attributes_prefetch(), which sends the GetWindowAttributes request,
- * then ecore_x_get_window_attributes_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Get_Attributes_Group
- */
-EAPI int
-ecore_x_window_visible_get(Ecore_X_Window window __UNUSED__)
-{
-   xcb_get_window_attributes_reply_t *reply;
+   if (reply->_class == XCB_WINDOW_CLASS_INPUT_ONLY)
+     att_ret->input_only = EINA_TRUE;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+   if (reply->save_under)
+     att_ret->save_under = EINA_TRUE;
 
-   return (reply->map_state == XCB_MAP_STATE_VIEWABLE) ? 1 : 0;
+   att_ret->event_mask.mine = reply->your_event_mask;
+   att_ret->event_mask.all = reply->all_event_masks;
+   att_ret->event_mask.no_propagate = reply->do_not_propagate_mask;
+   att_ret->window_gravity = reply->win_gravity;
+   att_ret->pixel_gravity = reply->bit_gravity;
+   att_ret->colormap = reply->colormap;
+   att_ret->visual = _ecore_xcb_window_find_visual_by_id(reply->visual);
+
+   free(reply);
+
+   gcookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
+   greply = xcb_get_geometry_reply(_ecore_xcb_conn, gcookie, NULL);
+   if (!greply) return EINA_TRUE;
+
+   /* xcb_translate_coordinates_reply_t *trans; */
+   /* xcb_query_tree_cookie_t tcookie; */
+   /* xcb_query_tree_reply_t *treply; */
+
+   /* tcookie = xcb_query_tree(_ecore_xcb_conn, win); */
+   /* treply = xcb_query_tree_reply(_ecore_xcb_conn, tcookie, NULL); */
+
+   /* trans =  */
+   /*   xcb_translate_coordinates_reply(_ecore_xcb_conn,  */
+   /*                                   xcb_translate_coordinates(_ecore_xcb_conn,  */
+   /*                                                             win, treply->parent, greply->x, greply->y), NULL); */
+   /* free(treply); */
+
+   att_ret->root = greply->root;
+   att_ret->depth = greply->depth;
+//   att_ret->x = trans->dst_x;
+//   att_ret->y = trans->dst_y;
+   att_ret->x = greply->x;
+   att_ret->y = greply->y;
+   att_ret->w = greply->width;
+   att_ret->h = greply->height;
+   att_ret->border = greply->border_width;
+
+//   free(trans);
+
+   free(greply);
+   return EINA_TRUE;
 }
 
-
 /**
- * Sends the QueryPointer request.
- * @ingroup Ecore_X_Window_Parent_Group
+ * Retrieves the size of the given window.
+ * @param   win The given window.
+ * @param   w   Pointer to an integer into which the width is to be stored.
+ * @param   h   Pointer to an integer into which the height is to be stored.
+ * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_pointer_xy_get_prefetch(Ecore_X_Window window)
+ecore_x_window_size_get(Ecore_X_Window win,
+                        int           *width,
+                        int           *height)
 {
-   xcb_query_pointer_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_query_pointer_unchecked(_ecore_xcb_conn, window);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   ecore_x_drawable_geometry_get(win, NULL, NULL, width, height);
 }
 
 /**
- * Gets the reply of the QueryPointer request sent by ecore_x_query_pointer_prefetch().
- * @ingroup Ecore_X_Window_Parent_Group
+ * Set if a window should be ignored.
+ * @param   win The given window.
+ * @param   ignore if to ignore
  */
 EAPI void
-ecore_x_pointer_xy_get_fetch(void)
+ecore_x_window_ignore_set(Ecore_X_Window win,
+                          int            ignore)
 {
-   xcb_query_pointer_cookie_t cookie;
-   xcb_query_pointer_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_query_pointer_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
+   int i = 0, j = 0, count = 0;
 
-/**
- * Retrieves the coordinates of the pointer.
- * @param window Unused.
- * @param x      The X coordinate of the pointer.
- * @param y      The Y coordinate of the pointer.
- *
- * Retrieves the coordinates of the pointer.
- * If the window used in
- * ecore_x_query_pointer_prefetch() is not on the same screen than
- * the root window or if an error occured, @p x and @p y  are set
- * to 0. Otherwise, they are respectively set to the X and Y
- * coordinates of the pointer.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_query_pointer_prefetch(), which sends the QueryPointer request,
- * then ecore_x_query_pointer_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Parent_Group
- */
-EAPI void
-ecore_x_pointer_xy_get(Ecore_X_Window window __UNUSED__,
-                       int           *x,
-                       int           *y)
-{
-   xcb_query_pointer_reply_t *reply;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
+   if (ignore)
      {
-       if (x) *x = 0;
-       if (y) *y = 0;
+        if (ignore_list)
+          {
+             for (i = 0; i < ignore_num; i++)
+               if (win == ignore_list[i]) return;
 
-       return;
+             ignore_list =
+               realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
+             if (!ignore_list) return;
+
+             ignore_list[ignore_num++] = win;
+          }
+        else
+          {
+             ignore_num = 0;
+             ignore_list = malloc(sizeof(Ecore_X_Window));
+             if (!ignore_list) return;
+             ignore_list[ignore_num++] = win;
+          }
      }
+   else
+     {
+        if (!ignore_list) return;
+        for (count = ignore_num, i = 0, j = 0; i < count; i++)
+          {
+             if (win != ignore_list[i])
+               ignore_list[j++] = ignore_list[i];
+             else
+               ignore_num--;
+          }
+        if (ignore_num <= 0)
+          {
+             free(ignore_list);
+             ignore_list = NULL;
+             return;
+          }
 
-   if (x) *x = reply->win_x;
-   if (y) *y = reply->win_y;
+        ignore_list =
+          realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
+     }
 }
 
-
 /**
- * Sends the QueryTree request.
- * @ingroup Ecore_X_Window_Parent_Group
+ * Get the ignore list
+ * @param   num number of windows in the list
+ * @return  list of windows to ignore
  */
-EAPI void
-ecore_x_query_tree_prefetch(Ecore_X_Window window)
+EAPI Ecore_X_Window *
+ecore_x_window_ignore_list(int *num)
 {
-   xcb_query_tree_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, window);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (num) *num = ignore_num;
+   return ignore_list;
 }
 
 /**
- * Gets the reply of the QueryTree request sent by ecore_x_query_tree_prefetch().
- * @ingroup Ecore_X_Window_Parent_Group
+ * Get a list of all the root windows on the server.
+ *
+ * @note   The returned array will need to be freed after use.
+ * @param  num_ret Pointer to integer to put number of windows returned in.
+ * @return An array of all the root windows.  @c NULL is returned if memory
+ *         could not be allocated for the list, or if @p num_ret is @c NULL.
  */
-EAPI void
-ecore_x_query_tree_fetch(void)
+EAPI Ecore_X_Window *
+ecore_x_window_root_list(int *num_ret)
 {
-   xcb_query_tree_cookie_t cookie;
-   xcb_query_tree_reply_t *reply;
+   xcb_screen_iterator_t iter;
+   uint8_t i, num;
+   Ecore_X_Window *roots = NULL;
+#ifdef ECORE_XCB_XPRINT
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!num_ret) return NULL;
+   if (num_ret) *num_ret = 0;
+
+   /* if (xcb_connection_has_error(_ecore_xcb_conn))  */
+   /*   { */
+   /*      DBG("XCB Connection Has Error !!!"); */
+   /*      return NULL; */
+   /*   } */
+
+   num = ecore_x_screen_count_get();
+
+#ifdef ECORE_XCB_XPRINT
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_x_print_id);
+   if ((ext_reply) && (ext_reply->present))
+     {
+        xcb_x_print_print_query_screens_cookie_t cookie;
+        xcb_x_print_print_query_screens_reply_t *reply;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
+        cookie = xcb_x_print_print_query_screens_unchecked(_ecore_xcb_conn);
+        reply =
+          xcb_x_print_print_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             xcb_window_t *screens;
+             int psnum = 0, overlap = 0, j = 0, k = 0;
 
-/**
- * Retrieves the parent window of the given window.
- * @param   window Unused.
- * @return         The parent window of @p window.
- *
- * Retrieves the parent window of the given window. If
- * an error occured, @c 0 is returned.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_query_tree_prefetch(), which sends the QueryTree request,
- * then ecore_x_query_tree_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Parent_Group
- */
-EAPI Ecore_X_Window
-ecore_x_window_parent_get(Ecore_X_Window window __UNUSED__)
-{
-   xcb_query_tree_reply_t *reply;
+             psnum = xcb_x_print_print_query_screens_roots_length(reply);
+             screens = xcb_x_print_print_query_screens_roots(reply);
+             for (i = 0; i < num; i++)
+               {
+                  for (j = 0; j < psnum; j++)
+                    {
+                       xcb_screen_t *s;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return 0;
+                       if ((s = _ecore_xcb_window_screen_of_display(i)))
+                         {
+                            if (s->root == screens[j])
+                              overlap++;
+                         }
+                    }
+               }
+             if (!(roots = malloc((num - overlap)
+                                  * sizeof(Ecore_X_Window)))) return NULL;
+             for (i = 0; i < num; i++)
+               {
+                  Eina_Bool is_print = EINA_FALSE;
 
-   return reply->parent;
-}
+                  for (j = 0; j < psnum; j++)
+                    {
+                       xcb_screen_t *s;
+
+                       if ((s = _ecore_xcb_window_screen_of_display(i)))
+                         {
+                            if (s->root == screens[j])
+                              {
+                                 is_print = EINA_TRUE;
+                                 break;
+                              }
+                         }
+                    }
+                  if (!is_print)
+                    {
+                       xcb_screen_t *s;
 
+                       if ((s = _ecore_xcb_window_screen_of_display(i)))
+                         {
+                            roots[k] = s->root;
+                            k++;
+                         }
+                    }
+               }
+             if (num_ret) *num_ret = k;
+             free(reply);
+          }
+        else
+          {
+             /* Fallback to default method */
+              iter =
+                xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
+              if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
+              if (num_ret) *num_ret = num;
+              for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
+                roots[i] = iter.data->root;
+          }
+     }
+   else
+     {
+        /* Fallback to default method */
+         iter =
+           xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
+         if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
+         if (num_ret) *num_ret = num;
+         for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
+           roots[i] = iter.data->root;
+     }
+#else
+   iter =
+     xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
+   if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
+   if (num_ret) *num_ret = num;
+   for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
+     roots[i] = iter.data->root;
+#endif
+
+   return roots;
+}
 
-/**
- * Retrieves the children windows of the given window.
- * @param   window Unused.
- * @param   num    children windows count.
- * @return         The children windows.
- *
- * Retrieves the children windows of the given window. If
- * an error occured, @c 0 is returned.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_query_tree_prefetch(), which sends the QueryTree request,
- * then ecore_x_query_tree_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Parent_Group
- */
 EAPI Ecore_X_Window *
-ecore_x_window_children_get(Ecore_X_Window window __UNUSED__,
+ecore_x_window_children_get(Ecore_X_Window win,
                             int           *num)
 {
+   xcb_query_tree_cookie_t cookie;
    xcb_query_tree_reply_t *reply;
-   Ecore_X_Window         *windows = NULL;
+   Ecore_X_Window *windows = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
    if (num) *num = 0;
-   reply = _ecore_xcb_reply_get();
+   cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, win);
+   reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
    if (!reply) return NULL;
 
-   windows = malloc(reply->children_len);
-   if (!windows)
-     return NULL;
-
    if (num) *num = reply->children_len;
-   memcpy(windows,
-          xcb_query_tree_children(reply),
-          sizeof(Ecore_X_Window) * reply->children_len);
-
-   return windows;
-}
-
-/* FIXME: I've tried to remove the round trips. 3 cookies are */
-/*        created at the beginning of the function. Because of */
-/*        the recursivity of the algo, I can't find better trick */
-static Ecore_X_Window
-_ecore_x_window_at_xy_get(Ecore_X_Window  base,
-                          int16_t         base_x,
-                          int16_t         base_y,
-                          int16_t         x,
-                          int16_t         y,
-                          Ecore_X_Window *skip,
-                          int             skip_num)
-{
-   xcb_window_iterator_t              iter_children;
-   xcb_get_window_attributes_cookie_t cookie_get_window_attributes;
-   xcb_get_geometry_cookie_t          cookie_get_geometry;
-   xcb_query_tree_cookie_t            cookie_query_tree;
-   xcb_get_window_attributes_reply_t *reply_get_window_attributes;
-   xcb_get_geometry_reply_t          *reply_get_geometry;
-   xcb_query_tree_reply_t            *reply_query_tree;
-   Ecore_X_Window                     window = 0;
-   Ecore_X_Window                     child = 0;
-   int16_t                            win_x;
-   int16_t                            win_y;
-   uint16_t                           win_width;
-   uint16_t                           win_height;
-
-   cookie_get_window_attributes = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, base);
-   cookie_get_geometry = xcb_get_geometry_unchecked(_ecore_xcb_conn, base);
-   cookie_query_tree = xcb_query_tree_unchecked(_ecore_xcb_conn, base);
-
-   reply_get_window_attributes = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie_get_window_attributes, NULL);
-   if (!reply_get_window_attributes)
-     {
-       reply_get_geometry = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_get_geometry, NULL);
-       if (reply_get_geometry) free(reply_get_geometry);
-       reply_query_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_query_tree, NULL);
-       if (reply_query_tree) free(reply_query_tree);
-       return window;
-     }
-
-   if (reply_get_window_attributes->map_state != XCB_MAP_STATE_VIEWABLE)
-     {
-       free(reply_get_window_attributes);
-       reply_get_geometry = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_get_geometry, NULL);
-       if (reply_get_geometry) free(reply_get_geometry);
-       reply_query_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_query_tree, NULL);
-       if (reply_query_tree) free(reply_query_tree);
-       return window;
-     }
-
-   free(reply_get_window_attributes);
-
-   reply_get_geometry = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_get_geometry, NULL);
-   if (!reply_get_geometry)
-     {
-       reply_query_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_query_tree, NULL);
-       if (reply_query_tree) free(reply_query_tree);
-       return window;
-     }
-
-   win_x = reply_get_geometry->x;
-   win_y = reply_get_geometry->y;
-   win_width = reply_get_geometry->width;
-   win_height = reply_get_geometry->height;
-
-   free(reply_get_geometry);
-
-   win_x += base_x;
-   win_y += base_y;
-
-   if (!((x >= win_x) &&
-         (y >= win_y) &&
-         (x < (int16_t)(win_x + win_width)) &&
-         (y < (int16_t)(win_y + win_height))))
+   if (reply->children_len > 0)
      {
-       reply_query_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_query_tree, NULL);
-       if (reply_query_tree) free(reply_query_tree);
-       return window;
-     }
+        windows = malloc(sizeof(Ecore_X_Window) * reply->children_len);
+        if (windows)
+          {
+             unsigned int i = 0;
+             xcb_window_t *w;
 
-   reply_query_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_query_tree, NULL);
-   if (!reply_query_tree)
-     {
-        if (skip)
-         {
-             int i;
-
-            for (i = 0; i < skip_num; i++)
-              if (base == skip[i])
-                return window;
-         }
-       return base;
+             w = xcb_query_tree_children(reply);
+             for (i = 0; i < reply->children_len; i++)
+               windows[i] = w[i];
+          }
      }
 
-   iter_children = xcb_query_tree_children_iterator(reply_query_tree);
-   for (; iter_children.rem; xcb_window_next(&iter_children))
-     {
-        if (skip)
-          {
-             int j;
+   free(reply);
+   return windows;
+}
 
-             for (j = 0; j < skip_num; j++)
-               if (*iter_children.data == skip[j])
-                 continue;
-          }
-        child = _ecore_x_window_at_xy_get(*iter_children.data, win_x, win_y, x, y, skip, skip_num);
-        if (child)
-          {
-             free(reply_query_tree);
+/**
+ * Retrieves the root window a given window is on.
+ * @param   win The window to get the root window of
+ * @return  The root window of @p win
+ * @ingroup Ecore_X_Window_Geometry_Group
+ */
+EAPI Ecore_X_Window
+ecore_x_window_root_get(Ecore_X_Window win)
+{
+   xcb_get_geometry_cookie_t gcookie;
+   xcb_get_geometry_reply_t *greply;
+   Ecore_X_Window window = 0;
 
-             return child;
-          }
-     }
+   /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
+   CHECK_XCB_CONN;
 
-   if (skip)
-     {
-        int i;
-
-       for (i = 0; i < skip_num; i++)
-         if (base == skip[i])
-            {
-               /* We return 0. child has an xid equal to 0 */
-               free(reply_query_tree);
-               return child;
-            }
-     }
+   gcookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
+   greply = xcb_get_geometry_reply(_ecore_xcb_conn, gcookie, NULL);
+   if (!greply) return 0;
+   window = greply->root;
+   free(greply);
 
-   free(reply_query_tree);
+   return window;
+}
 
-   return base;
+EAPI Ecore_X_Window
+ecore_x_window_root_first_get(void)
+{
+   return ((xcb_screen_t *)_ecore_xcb_screen)->root;
 }
 
 /**
- * @defgroup Ecore_X_Window_Geometry_Group X Window Geometry Functions
+ * Retrieves the geometry of the given window.
  *
- * Functions that change or retrieve the geometry of X windows.
+ * Note that the x & y coordingates are relative to your parent.  In
+ * particular for reparenting window managers - relative to you window border.
+ * If you want screen coordinates either walk the window tree to the root,
+ * else for ecore_evas applications see ecore_evas_geometry_get().  Elementary
+ * applications can use elm_win_screen_position_get().
+ *
+ * @param   win The given window.
+ * @param   x   Pointer to an integer in which the X position is to be stored.
+ * @param   y   Pointer to an integer in which the Y position is to be stored.
+ * @param   w   Pointer to an integer in which the width is to be stored.
+ * @param   h   Pointer to an integer in which the height is to be stored.
+ * @ingroup Ecore_X_Window_Geometry_Group
  */
+EAPI void
+ecore_x_window_geometry_get(Ecore_X_Window win,
+                            int           *x,
+                            int           *y,
+                            int           *w,
+                            int           *h)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   ecore_x_drawable_geometry_get(win, x, y, w, h);
+}
 
 /**
  * Retrieves the top, visible window at the given location.
  * @param   x The given X position.
  * @param   y The given Y position.
- * @return    The window at that position.
+ * @return  The window at that position.
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
 ecore_x_window_at_xy_get(int x,
-                           int y)
+                         int y)
 {
-   Ecore_X_Window window;
-   Ecore_X_Window root;
+   Ecore_X_Window root, win = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* FIXME: Proper function to determine current root/virtual root
-    * window missing here */
    root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
    ecore_x_grab();
-   window = _ecore_x_window_at_xy_get(root, 0, 0, x, y, NULL, 0);
+   win = _ecore_xcb_window_at_xy_get(root, 0, 0, x, y, NULL, 0);
    ecore_x_ungrab();
 
-   return window ? window : root;
+   return win ? win : root;
 }
 
 /**
@@ -1593,429 +1628,611 @@ ecore_x_window_at_xy_get(int x,
  * but skips the windows in the list.
  * @param   x The given X position.
  * @param   y The given Y position.
- * @return    The window at that position.
+ * @param   skip The list of windows to be skipped.
+ * @param   skip_num The number of windows to be skipped.
+ * @return  The window at that position.
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
 ecore_x_window_at_xy_with_skip_get(int             x,
-                                     int             y,
-                                     Ecore_X_Window *skip,
-                                     int             skip_num)
+                                   int             y,
+                                   Ecore_X_Window *skip,
+                                   int             skip_num)
 {
-   Ecore_X_Window window;
-   Ecore_X_Window root;
+   Ecore_X_Window root, win = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* FIXME: Proper function to determine current root/virtual root
-    * window missing here */
    root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
    ecore_x_grab();
-   window = _ecore_x_window_at_xy_get(root, 0, 0, x, y, skip, skip_num);
+   win = _ecore_xcb_window_at_xy_get(root, 0, 0, x, y, skip, skip_num);
    ecore_x_ungrab();
 
-   return window ? window : root;
+   return win ? win : root;
 }
 
-/**
- * Retrieves the top, visible window at the given location,
- * but begins at the @p begin window instead of the root one.
- * @param   begin The window from which we begin.
- * @param   x     The given X position.
- * @param   y     The given Y position.
- * @return        The window at that position.
- * @ingroup Ecore_X_Window_Geometry_Group
- */
 EAPI Ecore_X_Window
 ecore_x_window_at_xy_begin_get(Ecore_X_Window begin,
                                int            x,
                                int            y)
 {
-   Ecore_X_Window window;
+   Ecore_X_Window win = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
    ecore_x_grab();
-   window = _ecore_x_window_at_xy_get(begin, 0, 0, x, y, NULL, 0);
+   win = _ecore_xcb_window_at_xy_get(begin, 0, 0, x, y, NULL, 0);
    ecore_x_ungrab();
 
-   return window ? window : begin;
+   return win ? win : begin;
 }
 
+/**
+ * Retrieves the parent window of the given window.
+ * @param   win The given window.
+ * @return  The parent window of @p win.
+ * @ingroup Ecore_X_Window_Parent_Group
+ */
+EAPI Ecore_X_Window
+ecore_x_window_parent_get(Ecore_X_Window win)
+{
+   xcb_query_tree_cookie_t cookie;
+   xcb_query_tree_reply_t *reply;
+   Ecore_X_Window window = 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/* FIXME: Should I provide the replies (or the cookies), instead of
-          creating them in the function ? */
-#ifdef ECORE_XCB_RENDER
-static Ecore_X_Window
-_ecore_x_window_argb_internal_new(Ecore_X_Window parent,
-                                  int16_t        x,
-                                  int16_t        y,
-                                  uint16_t       w,
-                                  uint16_t       h,
-                                  uint8_t        override_redirect,
-                                  uint8_t        save_under)
-{
-   uint32_t                               value_list[10];
-   xcb_depth_iterator_t                   iter_depth;
-   xcb_visualtype_iterator_t              iter_visualtype;
-   xcb_render_query_pict_formats_cookie_t cookie_pict_format;
-   xcb_render_query_pict_formats_reply_t *rep_pict_format;
-   Ecore_X_Screen                        *screen = NULL;
-   Ecore_X_Window                         win = { 0 };
-   xcb_visualid_t                         vis = { 0 };
-   Ecore_X_Colormap                       colormap;
-   uint32_t                               value_mask;
-
-   cookie_pict_format = xcb_render_query_pict_formats_unchecked(_ecore_xcb_conn);
+//   if (!win) return 0;
+   cookie = xcb_query_tree(_ecore_xcb_conn, win);
+   reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   window = reply->parent;
+   free(reply);
 
-   if (parent == 0)
-     {
-        parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-       screen = ((xcb_screen_t *)_ecore_xcb_screen);
-     }
-   else
-     {
-        xcb_screen_iterator_t     iter_screen;
-        xcb_get_geometry_reply_t *rep;
-        Ecore_X_Drawable        draw;
-        Ecore_X_Window          root;
+   return window;
+}
 
-        draw = parent;
-        rep = xcb_get_geometry_reply(_ecore_xcb_conn,
-                                     xcb_get_geometry_unchecked(_ecore_xcb_conn,
-                                                                draw),
-                                     NULL);
-        if (!rep)
-          return win;
+/**
+ * Finds out whether the given window is currently visible.
+ * @param   win The given window.
+ * @return  1 if the window is visible, otherwise 0.
+ * @ingroup Ecore_X_Window_Visibility_Group
+ */
+EAPI int
+ecore_x_window_visible_get(Ecore_X_Window win)
+{
+   xcb_get_window_attributes_cookie_t cookie;
+   xcb_get_window_attributes_reply_t *reply;
+   int ret = EINA_FALSE;
 
-        root = rep->root;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-        free(rep);
+   cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
+   reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
 
-        for (; iter_screen.rem; xcb_screen_next(&iter_screen))
-          {
-             if (iter_screen.data->root == root)
-               {
-                 screen = iter_screen.data;
-               }
-          }
-     }
-   if (!screen)
-     return win;
-
-   /* we get the X visual types */
-   iter_depth = xcb_screen_allowed_depths_iterator(screen);
-   for (; iter_depth.rem; xcb_depth_next(&iter_depth)) {
-       if (iter_depth.data->depth == 32) {
-            iter_visualtype = xcb_depth_visuals_iterator(iter_depth.data);
-            break;
-       }
-   }
-
-   /* we get the X render visual id */
-   rep_pict_format = xcb_render_query_pict_formats_reply(_ecore_xcb_conn,
-                                                         cookie_pict_format,
-                                                         NULL);
-   if (!rep_pict_format)
-     return win;
-
-   for (; iter_visualtype.rem; xcb_visualtype_next(&iter_visualtype)) {
-      if (iter_visualtype.data->_class == XCB_VISUAL_CLASS_TRUE_COLOR) {
-         xcb_render_pictforminfo_iterator_t iter_forminfo;
-         xcb_render_pictscreen_iterator_t   iter_pictscreen;
-         xcb_render_pictformat_t            pict_format = { 0 };
-
-         iter_forminfo = xcb_render_query_pict_formats_formats_iterator(rep_pict_format);
-         for (; iter_forminfo.rem; xcb_render_pictforminfo_next(&iter_forminfo)) {
-            if (iter_forminfo.data->type == XCB_RENDER_PICT_TYPE_DIRECT &&
-                iter_forminfo.data->direct.alpha_mask && iter_forminfo.data->depth == 32) {
-               pict_format = iter_forminfo.data->id;
-               break;
-            }
-         }
-         if (pict_format == 0) {
-            free(rep_pict_format);
-            return win;
-         }
-         iter_pictscreen = xcb_render_query_pict_formats_screens_iterator(rep_pict_format);
-         for (; iter_pictscreen.rem; xcb_render_pictscreen_next(&iter_pictscreen)) {
-            xcb_render_pictdepth_iterator_t iter_depth;
-
-            iter_depth = xcb_render_pictscreen_depths_iterator(iter_pictscreen.data);
-            for (; iter_depth.rem; xcb_render_pictdepth_next(&iter_depth)) {
-               xcb_render_pictvisual_iterator_t iter_visual;
-
-               iter_visual = xcb_render_pictdepth_visuals_iterator(iter_depth.data);
-               for (; iter_visual.rem; xcb_render_pictvisual_next(&iter_visual)) {
-                  if ((iter_visual.data->visual == iter_visualtype.data->visual_id) &&
-                      (pict_format == iter_visual.data->format)) {
-                    vis = iter_visual.data->visual;
-                    break;
-                  }
-               }
-            }
-         }
-      }
-   }
+   if (reply->map_state == XCB_MAP_STATE_VIEWABLE)
+     ret = EINA_TRUE;
+
+   free(reply);
+   return ret;
+}
+
+EAPI void
+ecore_x_window_button_grab(Ecore_X_Window     win,
+                           int                button,
+                           Ecore_X_Event_Mask mask,
+                           int                mod,
+                           int                any_mod)
+{
+   int i = 0;
+   uint16_t m, locks[8], ev;
+   uint8_t b;
+   Ecore_X_Window *t;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   b = button;
+   if (b == 0)
+     b = XCB_BUTTON_INDEX_ANY;
+
+   m = _ecore_xcb_window_modifiers_get(mod);
+   if (any_mod) m = XCB_MOD_MASK_ANY;
+
+   locks[0] = 0;
+   locks[1] = ECORE_X_LOCK_CAPS;
+   locks[2] = ECORE_X_LOCK_NUM;
+   locks[3] = ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+
+   ev = mask;
+   for (i = 0; i < 8; i++)
+     xcb_grab_button(_ecore_xcb_conn, 0, win, ev,
+                     XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC,
+                     XCB_NONE, XCB_NONE, b, m | locks[i]);
+
+   _ecore_xcb_button_grabs_num++;
+   t = realloc(_ecore_xcb_button_grabs,
+               _ecore_xcb_button_grabs_num * sizeof(Ecore_X_Window));
+   if (!t) return;
+
+   _ecore_xcb_button_grabs = t;
+   _ecore_xcb_button_grabs[_ecore_xcb_button_grabs_num - 1] = win;
+}
+
+EAPI void
+ecore_x_window_button_ungrab(Ecore_X_Window win,
+                             int            button,
+                             int            mod,
+                             int            any_mod)
+{
+   int i = 0;
+   uint16_t m = 0, locks[8];
+   uint8_t b;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   b = button;
+   if (b == 0) b = XCB_BUTTON_INDEX_ANY;
+
+   m = _ecore_xcb_window_modifiers_get(mod);
+   if (any_mod) m = XCB_MOD_MASK_ANY;
+
+   locks[0] = 0;
+   locks[1] = ECORE_X_LOCK_CAPS;
+   locks[2] = ECORE_X_LOCK_NUM;
+   locks[3] = ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+
+   for (i = 0; i < 8; i++)
+     xcb_ungrab_button(_ecore_xcb_conn, b, win, m | locks[i]);
+
+   _ecore_xcb_sync_magic_send(1, win);
+}
+
+EAPI void
+ecore_x_window_key_grab(Ecore_X_Window win,
+                        const char    *key,
+                        int            mod,
+                        int            any_mod)
+{
+   xcb_keycode_t keycode = XCB_NO_SYMBOL;
+   uint16_t m = 0, locks[8];
+   int i = 0;
+   Ecore_X_Window *t;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   keycode = _ecore_xcb_keymap_string_to_keycode(key);
+   if (keycode == XCB_NO_SYMBOL) return;
+
+   m = _ecore_xcb_window_modifiers_get(mod);
+   if (any_mod) m = XCB_MOD_MASK_ANY;
+
+   locks[0] = 0;
+   locks[1] = ECORE_X_LOCK_CAPS;
+   locks[2] = ECORE_X_LOCK_NUM;
+   locks[3] = ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+
+   for (i = 0; i < 8; i++)
+     xcb_grab_key(_ecore_xcb_conn, 0, win, m | locks[i],
+                  keycode, XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC);
+   _ecore_xcb_key_grabs_num++;
+   t = realloc(_ecore_xcb_key_grabs,
+               _ecore_xcb_key_grabs_num * sizeof(Ecore_X_Window));
+   if (!t) return;
+   _ecore_xcb_key_grabs = t;
+   _ecore_xcb_key_grabs[_ecore_xcb_key_grabs_num - 1] = win;
+}
 
-   free(rep_pict_format);
+EAPI void
+ecore_x_window_key_ungrab(Ecore_X_Window win,
+                          const char    *key,
+                          int            mod,
+                          int            any_mod)
+{
+   xcb_keycode_t keycode = XCB_NO_SYMBOL;
+   uint16_t m = 0, locks[8];
+   int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   keycode = _ecore_xcb_keymap_string_to_keycode(key);
+   if (keycode == XCB_NO_SYMBOL) return;
+
+   m = _ecore_xcb_window_modifiers_get(mod);
+   if (any_mod) m = XCB_MOD_MASK_ANY;
+
+   locks[0] = 0;
+   locks[1] = ECORE_X_LOCK_CAPS;
+   locks[2] = ECORE_X_LOCK_NUM;
+   locks[3] = ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+
+   for (i = 0; i < 8; i++)
+     xcb_ungrab_key(_ecore_xcb_conn, keycode, win, m | locks[i]);
+
+   _ecore_xcb_sync_magic_send(2, win);
+}
+
+/* local functions */
+Ecore_X_Window
+_ecore_xcb_window_root_of_screen_get(int screen)
+{
+   xcb_screen_iterator_t iter;
+
+   CHECK_XCB_CONN;
+   iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
+   for (; iter.rem; --screen, xcb_screen_next(&iter))
+     if (screen == 0)
+       {
+          xcb_screen_t *s;
+
+          if ((s = iter.data))
+            return s->root;
+       }
+   return 0;
+}
+
+static Ecore_X_Window
+_ecore_xcb_window_argb_internal_new(Ecore_X_Window parent,
+                                    int            x,
+                                    int            y,
+                                    int            w,
+                                    int            h,
+                                    uint8_t        override_redirect,
+                                    uint8_t        save_under)
+{
+   Ecore_X_Window win = 0;
+#ifdef ECORE_XCB_RENDER
+   uint32_t value_list[10];
+   uint32_t value_mask;
+   uint32_t vis;
+   Ecore_X_Colormap colormap;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_RENDER
+   if (parent == 0)
+     parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
-   if (vis == 0)
-     return win;
+   vis =
+     _ecore_xcb_render_find_visual_id(XCB_RENDER_PICT_TYPE_DIRECT, EINA_TRUE);
 
    colormap = xcb_generate_id(_ecore_xcb_conn);
-   xcb_create_colormap(_ecore_xcb_conn, XCB_COLORMAP_ALLOC_NONE, colormap, parent, vis);
-
-   value_mask =
-     XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL  | XCB_CW_BIT_GRAVITY       |
-     XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE | XCB_CW_OVERRIDE_REDIRECT |
-     XCB_CW_SAVE_UNDER  | XCB_CW_EVENT_MASK    | XCB_CW_DONT_PROPAGATE    |
-     XCB_CW_COLORMAP;
-
-   value_list[0]  = XCB_NONE;
-   value_list[1]  = 0;
-   value_list[2]  = XCB_GRAVITY_NORTH_WEST;
-   value_list[3]  = XCB_GRAVITY_NORTH_WEST;
-   value_list[4]  = XCB_BACKING_STORE_NOT_USEFUL;
-   value_list[5]  = override_redirect;
-   value_list[6]  = save_under;
-   value_list[7]  =
-     XCB_EVENT_MASK_KEY_PRESS         | XCB_EVENT_MASK_KEY_RELEASE      |
-     XCB_EVENT_MASK_BUTTON_PRESS      | XCB_EVENT_MASK_BUTTON_RELEASE   |
-     XCB_EVENT_MASK_ENTER_WINDOW      | XCB_EVENT_MASK_LEAVE_WINDOW     |
-     XCB_EVENT_MASK_POINTER_MOTION    | XCB_EVENT_MASK_EXPOSURE        |
-     XCB_EVENT_MASK_VISIBILITY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY |
-     XCB_EVENT_MASK_FOCUS_CHANGE      | XCB_EVENT_MASK_PROPERTY_CHANGE  |
-     XCB_EVENT_MASK_COLOR_MAP_CHANGE;
-   value_list[8]  = XCB_EVENT_MASK_NO_EVENT;
-   value_list[9]  = colormap;
+   xcb_create_colormap(_ecore_xcb_conn, XCB_COLORMAP_ALLOC_NONE,
+                       colormap, parent, vis);
+
+   value_mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
+                 XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
+                 XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER |
+                 XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE | XCB_CW_COLORMAP);
+
+   value_list[0] = XCB_BACK_PIXMAP_NONE;
+   value_list[1] = 0;
+   value_list[2] = XCB_GRAVITY_NORTH_WEST;
+   value_list[3] = XCB_GRAVITY_NORTH_WEST;
+   value_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
+   value_list[5] = override_redirect;
+   value_list[6] = save_under;
+   value_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
+                    XCB_EVENT_MASK_BUTTON_PRESS |
+                    XCB_EVENT_MASK_BUTTON_RELEASE |
+                    XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
+                    XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
+                    XCB_EVENT_MASK_VISIBILITY_CHANGE |
+                    XCB_EVENT_MASK_STRUCTURE_NOTIFY |
+                    XCB_EVENT_MASK_FOCUS_CHANGE |
+                    XCB_EVENT_MASK_PROPERTY_CHANGE |
+                    XCB_EVENT_MASK_COLOR_MAP_CHANGE);
+   value_list[8] = XCB_EVENT_MASK_NO_EVENT;
+   value_list[9] = colormap;
 
    win = xcb_generate_id(_ecore_xcb_conn);
-   xcb_create_window(_ecore_xcb_conn,
-                     32, /* depth */
-                     win, parent,
-                     x, y, w, h, 0,
-                     XCB_WINDOW_CLASS_INPUT_OUTPUT,
-                     vis,
-                     value_mask,
+   xcb_create_window(_ecore_xcb_conn, 32, win, parent, x, y, w, h, 0,
+                     XCB_WINDOW_CLASS_INPUT_OUTPUT, vis, value_mask,
                      value_list);
 
    xcb_free_colormap(_ecore_xcb_conn, colormap);
 
    if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root)
      ecore_x_window_defaults_set(win);
+#endif
 
    return win;
 }
-#endif /* ECORE_XCB_RENDER */
 
+static Ecore_X_Window
+_ecore_xcb_window_at_xy_get(Ecore_X_Window  base,
+                            int             bx,
+                            int             by,
+                            int             x,
+                            int             y,
+                            Ecore_X_Window *skip,
+                            int             skip_num)
+{
+   xcb_query_tree_cookie_t cookie;
+   xcb_query_tree_reply_t *reply;
+   Ecore_X_Window *windows = NULL;
+   int wx, wy, ww, wh, num, i = 0;
+   Eina_Bool skipit = EINA_FALSE;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/* FIXME: round trip */
-EAPI int
-ecore_x_window_argb_get(Ecore_X_Window win)
-{
-   uint8_t                                ret = 0;
-#ifdef ECORE_XCB_RENDER
-   xcb_render_pictforminfo_iterator_t     iter_forminfo;
-   xcb_render_pictscreen_iterator_t       iter_pictscreen;
-   xcb_render_pictformat_t                pict_format = { 0 };
-   xcb_render_query_pict_formats_reply_t *rep_pictformat;
-   xcb_get_window_attributes_reply_t     *rep;
-   xcb_visualid_t                         visual;
-
-   rep = xcb_get_window_attributes_reply(_ecore_xcb_conn,
-                                         xcb_get_window_attributes_unchecked(_ecore_xcb_conn,
-                                                                             win),
-                                         NULL);
-   if (!rep)
-     return ret;
-
-   visual = rep->visual;
-
-   free(rep);
-
-   rep_pictformat = xcb_render_query_pict_formats_reply(_ecore_xcb_conn,
-                                                        xcb_render_query_pict_formats_unchecked(_ecore_xcb_conn),
-                                                        NULL);
-   if (!rep_pictformat)
-     return ret;
-
-   iter_forminfo = xcb_render_query_pict_formats_formats_iterator(rep_pictformat);
-   for (; iter_forminfo.rem; xcb_render_pictforminfo_next(&iter_forminfo))
-     {
-        if ((iter_forminfo.data->type == XCB_RENDER_PICT_TYPE_DIRECT) &&
-            (iter_forminfo.data->direct.alpha_mask))
-          {
-             pict_format = iter_forminfo.data->id;
-             break;
-          }
-     }
-   if (pict_format == 0)
-     {
-        free(rep_pictformat);
+   if (!ecore_x_window_visible_get(base)) return 0;
 
-        return ret;
-     }
+   ecore_x_window_geometry_get(base, &wx, &wy, &ww, &wh);
+   wx += bx;
+   wy += by;
+
+   if (!((x >= wx) && (y >= wy) && (x < (wx + ww)) && (y < (wy + wh))))
+     return 0;
+
+   cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, base);
+   reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+
+   num = reply->children_len;
+   windows = xcb_query_tree_children(reply);
 
-   iter_pictscreen = xcb_render_query_pict_formats_screens_iterator(rep_pictformat);
-   for (; iter_pictscreen.rem; xcb_render_pictscreen_next(&iter_pictscreen))
+   for (i = (num - 1); i >= 0; --i)
      {
-        xcb_render_pictdepth_iterator_t iter_depth;
+        skipit = EINA_FALSE;
 
-        iter_depth = xcb_render_pictscreen_depths_iterator(iter_pictscreen.data);
-        for (; iter_depth.rem; xcb_render_pictdepth_next(&iter_depth))
+        if (skip)
           {
-             xcb_render_pictvisual_iterator_t iter_visual;
+             int j = 0;
 
-             iter_visual = xcb_render_pictdepth_visuals_iterator(iter_depth.data);
-             for (; iter_visual.rem; xcb_render_pictvisual_next(&iter_visual))
+             for (j = 0; j < skip_num; j++)
                {
-                  if ((iter_visual.data->visual == visual) &&
-                      (pict_format == iter_visual.data->format))
+                  if (windows[i] == skip[j])
                     {
-                       ret = 1;
-                       break;
+                       skipit = EINA_TRUE;
+                       goto onward;
                     }
                }
           }
-     }
+onward:
+        if (!skipit)
+          {
+             Ecore_X_Window child = 0;
 
-   free(rep_pictformat);
-#endif /* ECORE_XCB_RENDER */
+             child =
+               _ecore_xcb_window_at_xy_get(windows[i],
+                                           wx, wy, x, y, skip, skip_num);
+             if (child)
+               {
+                  if (reply) free(reply);
+                  return child;
+               }
+          }
+     }
 
-   return ret;
+   if (reply) free(reply);
+   return base;
 }
 
+Ecore_X_Visual
+_ecore_xcb_window_visual_get(Ecore_X_Window win)
+{
+   xcb_get_window_attributes_cookie_t cookie;
+   xcb_get_window_attributes_reply_t *reply;
+   Ecore_X_Visual visual = 0;
+
+   CHECK_XCB_CONN;
 
+   cookie = xcb_get_window_attributes(_ecore_xcb_conn, win);
+   reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   visual = _ecore_xcb_window_find_visual_by_id(reply->visual);
+   free(reply);
 
+   return visual;
+}
 
-/**
- * Set if a window should be ignored.
- * @param   window The given window.
- * @param   ignore if to ignore
- */
-EAPI void
-ecore_x_window_ignore_set(Ecore_X_Window window,
-                          int            ignore)
+void
+_ecore_xcb_window_button_grab_remove(Ecore_X_Window win)
 {
-   int i, j;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (ignore)
-     {
-       if (ignore_list)
-         {
-            for (i = 0; i < ignore_num; i++)
-              {
-                 if (window == ignore_list[i])
-                   return;
-              }
-            ignore_list = realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
-            if (!ignore_list) return;
-            ignore_list[ignore_num++] = window;
-         }
-       else
-         {
-            ignore_num = 0;
-            ignore_list = malloc(sizeof(Ecore_X_Window));
-            ignore_list[ignore_num++] = window;
-         }
-     }
-   else
+   if (_ecore_xcb_button_grabs_num > 0)
      {
-       if (!ignore_list) return;
-       for (i = 0, j = 0; i < ignore_num; i++)
-         {
-            if (window != ignore_list[i])
-              ignore_list[i] = ignore_list[j++];
-            else
-              ignore_num--;
-         }
-       ignore_list = realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
+        int i = 0, shuffle = 0;
+
+        for (i = 0; i < _ecore_xcb_button_grabs_num; i++)
+          {
+             if (shuffle)
+               _ecore_xcb_button_grabs[i - 1] = _ecore_xcb_button_grabs[i];
+
+             if ((!shuffle) && (_ecore_xcb_button_grabs[i] == win))
+               shuffle = 1;
+          }
+
+        if (shuffle)
+          {
+             Ecore_X_Window *t;
+
+             _ecore_xcb_button_grabs_num--;
+             if (_ecore_xcb_button_grabs_num <= 0)
+               {
+                  free(_ecore_xcb_button_grabs);
+                  _ecore_xcb_button_grabs = NULL;
+                  return;
+               }
+
+             t = realloc(_ecore_xcb_button_grabs,
+                         _ecore_xcb_button_grabs_num * sizeof(Ecore_X_Window));
+             if (!t) return;
+             _ecore_xcb_button_grabs = t;
+          }
      }
 }
 
-/**
- * Get the ignore list
- * @param   num number of windows in the list
- * @return  list of windows to ignore
- */
-EAPI Ecore_X_Window *
-ecore_x_window_ignore_list(int *num)
+void
+_ecore_xcb_window_key_grab_remove(Ecore_X_Window win)
 {
-   if (num) *num = ignore_num;
-   return ignore_list;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (_ecore_xcb_key_grabs_num > 0)
+     {
+        int i = 0, shuffle = 0;
+
+        for (i = 0; i < _ecore_xcb_key_grabs_num; i++)
+          {
+             if (shuffle)
+               _ecore_xcb_key_grabs[i - 1] = _ecore_xcb_key_grabs[i];
+
+             if ((!shuffle) && (_ecore_xcb_key_grabs[i] == win))
+               shuffle = 1;
+          }
+
+        if (shuffle)
+          {
+             Ecore_X_Window *t;
+
+             _ecore_xcb_key_grabs_num--;
+             if (_ecore_xcb_key_grabs_num <= 0)
+               {
+                  free(_ecore_xcb_key_grabs);
+                  _ecore_xcb_key_grabs = NULL;
+                  return;
+               }
+
+             t = realloc(_ecore_xcb_key_grabs,
+                         _ecore_xcb_key_grabs_num * sizeof(Ecore_X_Window));
+             if (!t) return;
+             _ecore_xcb_key_grabs = t;
+          }
+     }
 }
 
-/**
- * Retrieves the size of the given window.
- * @param   win The given window.
- * @param   w   Pointer to an integer into which the width is to be stored.
- * @param   h   Pointer to an integer into which the height is to be stored.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_drawable_geometry_get_prefetch(), which sends the GetGeometry request,
- * then ecore_x_drawable_geometry_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Geometry_Group
- */
-EAPI void
-ecore_x_window_size_get(Ecore_X_Window window,
-                        int           *width,
-                        int           *height)
+void
+_ecore_xcb_window_grab_allow_events(Ecore_X_Window event_win,
+                                    Ecore_X_Window child_win,
+                                    int            type,
+                                    void          *event,
+                                    Ecore_X_Time   timestamp)
 {
-   if (window == 0)
-      window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   for (i = 0; i < _ecore_xcb_button_grabs_num; i++)
+     {
+        if ((_ecore_xcb_button_grabs[i] == event_win) ||
+            (_ecore_xcb_button_grabs[i] == child_win))
+          {
+             Eina_Bool replay = EINA_FALSE;
 
-   ecore_x_drawable_geometry_get(window, NULL, NULL, width, height);
+             if (_ecore_xcb_window_grab_replay_func)
+               {
+                  replay =
+                    _ecore_xcb_window_grab_replay_func(_ecore_xcb_window_grab_replay_data,
+                                                       type, event);
+               }
+             if (replay)
+               {
+                  xcb_allow_events(_ecore_xcb_conn,
+                                   XCB_ALLOW_REPLAY_POINTER, timestamp);
+               }
+             else
+               {
+                  xcb_allow_events(_ecore_xcb_conn,
+                                   XCB_ALLOW_ASYNC_POINTER, timestamp);
+               }
+             break;
+          }
+     }
 }
 
-/**
- * Retrieves the geometry of the given window.
- * @param   win The given window.
- * @param   x   Pointer to an integer in which the X position is to be stored.
- * @param   y   Pointer to an integer in which the Y position is to be stored.
- * @param   w   Pointer to an integer in which the width is to be stored.
- * @param   h   Pointer to an integer in which the height is to be stored.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_drawable_geometry_get_prefetch(), which sends the GetGeometry request,
- * then ecore_x_drawable_geometry_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_Window_Geometry_Group
- */
-EAPI void
-ecore_x_window_geometry_get(Ecore_X_Window window,
-                            int           *x,
-                            int           *y,
-                            int           *width,
-                            int           *height)
+static int
+_ecore_xcb_window_modifiers_get(unsigned int state)
 {
-   if (!window)
-      window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   ecore_x_drawable_geometry_get(window, x, y, width, height);
+   int xmodifiers = 0;
+
+   if (state & ECORE_EVENT_MODIFIER_SHIFT)
+     xmodifiers |= ECORE_X_MODIFIER_SHIFT;
+   if (state & ECORE_EVENT_MODIFIER_CTRL)
+     xmodifiers |= ECORE_X_MODIFIER_CTRL;
+   if (state & ECORE_EVENT_MODIFIER_ALT)
+     xmodifiers |= ECORE_X_MODIFIER_ALT;
+   if (state & ECORE_EVENT_MODIFIER_WIN)
+     xmodifiers |= ECORE_X_MODIFIER_WIN;
+   if (state & ECORE_EVENT_MODIFIER_ALTGR)
+     xmodifiers |= ECORE_X_MODIFIER_ALTGR;
+   if (state & ECORE_EVENT_LOCK_SCROLL)
+     xmodifiers |= ECORE_X_LOCK_SCROLL;
+   if (state & ECORE_EVENT_LOCK_NUM)
+     xmodifiers |= ECORE_X_LOCK_NUM;
+   if (state & ECORE_EVENT_LOCK_CAPS)
+     xmodifiers |= ECORE_X_LOCK_CAPS;
+   if (state & ECORE_EVENT_LOCK_SHIFT)
+     xmodifiers |= ECORE_X_LOCK_SHIFT;
+
+   return xmodifiers;
 }
 
-/**
- * Retrieves the width of the border of the given window.
- * @param   win The given window.
- * @return  Width of the border of @p win.
- * @ingroup Ecore_X_Window_Geometry_Group
- */
-EAPI int
-ecore_x_window_border_width_get(Ecore_X_Window win)
+static xcb_visualtype_t *
+_ecore_xcb_window_find_visual_by_id(xcb_visualid_t id)
 {
-   /* doesn't make sense to call this on a root window */
-   if (!win)
-      return 0;
+   xcb_depth_iterator_t diter;
+   xcb_visualtype_iterator_t viter;
 
-   return ecore_x_drawable_border_width_get(win);
+   CHECK_XCB_CONN;
+   diter = xcb_screen_allowed_depths_iterator(_ecore_xcb_screen);
+   for (; diter.rem; xcb_depth_next(&diter))
+     {
+        viter = xcb_depth_visuals_iterator(diter.data);
+        for (; viter.rem; xcb_visualtype_next(&viter))
+          {
+             if (viter.data->visual_id == id)
+               return viter.data;
+          }
+     }
+   return 0;
 }
 
-/**
- * Retrieves the depth of the given window.
- * @param  win The given window.
- * @return Depth of the window.
- */
-EAPI int
-ecore_x_window_depth_get(Ecore_X_Window win)
+#ifdef ECORE_XCB_XPRINT
+static xcb_screen_t *
+_ecore_xcb_window_screen_of_display(int screen)
 {
-   return ecore_x_drawable_depth_get(win);
+   xcb_screen_iterator_t iter;
+
+   CHECK_XCB_CONN;
+   iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
+   for (; iter.rem; --screen, xcb_screen_next(&iter))
+     if (screen == 0)
+       return iter.data;
+
+   return NULL;
 }
+
+#endif
index c7b81af..e00fdc1 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
-
+#include <xcb/xcb_icccm.h>
 
-/*
- * Set CARD32 (array) property
- */
-EAPI void
-ecore_x_window_prop_card32_set(Ecore_X_Window win,
+EAPI int
+ecore_x_window_prop_card32_get(Ecore_X_Window win,
                                Ecore_X_Atom   atom,
-                              unsigned int  *val,
-                               unsigned int   num)
-{
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
-                       atom, ECORE_X_ATOM_CARDINAL, 32, num, (const void *)val);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- * @param atom   The atom.
- */
-EAPI void
-ecore_x_window_prop_card32_get_prefetch(Ecore_X_Window window,
-                                        Ecore_X_Atom atom)
+                               unsigned int  *val,
+                               unsigned int   len)
 {
    xcb_get_property_cookie_t cookie;
+   xcb_get_property_reply_t *reply;
+   int num = 0;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window,
-                                       atom,
-                                       ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom,
+                                       ECORE_X_ATOM_CARDINAL, 0, 0x7fffffff);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return -1;
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_prop_card32_get_prefetch().
- */
-EAPI void
-ecore_x_window_prop_card32_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   if ((reply->type != ECORE_X_ATOM_CARDINAL) || (reply->format != 32))
+     num = -1;
+   else if (reply->value_len == 0)
+     num = 0;
+   else
+     {
+        if (reply->value_len < len)
+          len = reply->value_len;
+
+        if (val)
+          {
+             unsigned int i = 0;
+             unsigned char *v;
+
+             v = xcb_get_property_value(reply);
+             for (i = 0; i < len; i++)
+               val[i] = ((uint32_t *)v)[i];
+             num = len;
+          }
+     }
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   if (reply) free(reply);
+   return num;
 }
 
-/*
- * Get CARD32 (array) property
- *
- * At most len items are returned in val.
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * Note: Return value 0 means that the property exists but has no elements.
- */
-EAPI int
-ecore_x_window_prop_card32_get(Ecore_X_Window win __UNUSED__,
-                               Ecore_X_Atom   atom __UNUSED__,
-                              unsigned int  *val,
-                               unsigned int   len)
+EAPI void
+ecore_x_window_prop_card32_set(Ecore_X_Window win,
+                               Ecore_X_Atom   atom,
+                               unsigned int  *val,
+                               unsigned int   num)
 {
-   xcb_get_property_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply ||
-       (reply->type != ECORE_X_ATOM_CARDINAL) ||
-       (reply->format != 32))
-      return -1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (reply->value_len < len)
-     len = xcb_get_property_value_length(reply);
+#if SIZEOF_INT == SIZEOF_LONG
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
+                       ECORE_X_ATOM_CARDINAL, 32, num, (unsigned char *)val);
+//   ecore_x_flush();
+#else
+   long *v2;
+   unsigned int i;
 
-   if (val)
-      memcpy(val, xcb_get_property_value(reply), len);
+   v2 = malloc(num * sizeof(long));
+   if (!v2) return;
+   for (i = 0; i < num; i++)
+     v2[i] = val[i];
 
-   return (int)len;
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
+                       ECORE_X_ATOM_CARDINAL, 32, num, (unsigned char *)v2);
+   free(v2);
+//   ecore_x_flush();
+#endif
 }
 
-/*
- * Get CARD32 (array) property of any length
- *
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * Note: Return value 0 means that the property exists but has no elements.
- */
 EAPI int
-ecore_x_window_prop_card32_list_get(Ecore_X_Window win __UNUSED__,
-                                    Ecore_X_Atom   atom __UNUSED__,
-                                   unsigned int **plist)
+ecore_x_window_prop_card32_list_get(Ecore_X_Window win,
+                                    Ecore_X_Atom   atom,
+                                    unsigned int **list)
 {
+   xcb_get_property_cookie_t cookie;
    xcb_get_property_reply_t *reply;
-   int                       num = -1;
+   int num = -1;
 
-   if (plist)
-      *plist = NULL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return -1;
+   if (list) *list = NULL;
 
-   if ((reply->type == XCB_NONE) ||
-       (reply->value_len == 0))
-      num = 0;
-   else if ((reply->type == ECORE_X_ATOM_CARDINAL) &&
-            (reply->format == 32))
+   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom,
+                                       XCB_ATOM_CARDINAL, 0, 0x7fffffff);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return -1;
+
+   if ((reply->type != XCB_ATOM_CARDINAL) || (reply->format != 32))
+     num = -1;
+   else if ((reply->value_len == 0) || (!xcb_get_property_value(reply)))
+     num = 0;
+   else
      {
-       uint32_t *val;
-
-       num = xcb_get_property_value_length(reply);
-       if (plist)
-         {
-            val = (uint32_t *)malloc (num);
-            if (!val)
-               goto error;
-
-            memcpy(val, xcb_get_property_value(reply), num);
-            *plist = val;
-         }
+        num = reply->value_len;
+        if (list)
+          {
+             unsigned int *val;
+             void *data;
+             int i = 0;
+
+             val = malloc(num * sizeof(unsigned int));
+             if (!val)
+               {
+                  free(reply);
+                  return -1;
+               }
+             data = xcb_get_property_value(reply);
+             for (i = 0; i < num; i++)
+               val[i] = ((uint32_t *)data)[i];
+             *list = val;
+          }
      }
 
- error:
-
+   free(reply);
    return num;
 }
 
-/*
- * Set X ID (array) property
- */
-EAPI void
-ecore_x_window_prop_xid_set(Ecore_X_Window win,
-                            Ecore_X_Atom   atom,
-                           Ecore_X_Atom   type,
-                            Ecore_X_ID    *xids,
-                           unsigned int   num)
-{
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
-                       atom, type, 32, num, xids);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- * @param atom   The atom.
- * @param type   The atom type.
- */
-EAPI void
-ecore_x_window_prop_xid_get_prefetch(Ecore_X_Window window,
-                                     Ecore_X_Atom   atom,
-                                     Ecore_X_Atom   type)
+EAPI int
+ecore_x_window_prop_atom_get(Ecore_X_Window win,
+                             Ecore_X_Atom   atom,
+                             Ecore_X_Atom  *list,
+                             unsigned int   len)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window,
-                                       atom,
-                                       type,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return ecore_x_window_prop_xid_get(win, atom, ECORE_X_ATOM_ATOM, list, len);
 }
 
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_prop_xid_get_prefetch().
- */
 EAPI void
-ecore_x_window_prop_xid_get_fetch(void)
+ecore_x_window_prop_atom_set(Ecore_X_Window win,
+                             Ecore_X_Atom   atom,
+                             Ecore_X_Atom  *list,
+                             unsigned int   num)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   /* xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,  */
+   /*                     ECORE_X_ATOM_ATOM, 32, num, list); */
+   ecore_x_window_prop_xid_set(win, atom, ECORE_X_ATOM_ATOM, list, num);
 }
 
-/*
- * Get X ID (array) property
- *
- * At most len items are returned in val.
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * Note: Return value 0 means that the property exists but has no elements.
- */
-EAPI int
-ecore_x_window_prop_xid_get(Ecore_X_Window win __UNUSED__,
-                            Ecore_X_Atom   atom __UNUSED__,
-                           Ecore_X_Atom   type __UNUSED__,
+EAPI void
+ecore_x_window_prop_xid_set(Ecore_X_Window win,
+                            Ecore_X_Atom   atom,
+                            Ecore_X_Atom   type,
                             Ecore_X_ID    *xids,
-                           unsigned int   len)
+                            unsigned int   num)
 {
-   xcb_get_property_reply_t *reply;
-   int                       num = len;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return -1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   if (reply->type == XCB_NONE)
-      num = 0;
-   else if (reply->format == 32)
-     {
-        if (reply->value_len < len)
-          num = xcb_get_property_value_length(reply);
+#if SIZEOF_INT == SIZEOF_LONG
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
+                       type, 32, num, (unsigned char *)xids);
+//   ecore_x_flush();
+#else
+   long *v2;
+   unsigned int i;
 
-        if (xids)
-           memcpy(xids, xcb_get_property_value(reply), num);
-     }
+   v2 = malloc(num * sizeof(long));
+   if (!v2) return;
+   for (i = 0; i < num; i++)
+     v2[i] = xids[i];
 
-   return num;
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
+                       type, 32, num, (unsigned char *)v2);
+   free(v2);
+//   ecore_x_flush();
+#endif
 }
 
-/*
- * Get X ID (array) property
- *
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * The returned array must be freed with free().
- * Note: Return value 0 means that the property exists but has no elements.
- */
 EAPI int
-ecore_x_window_prop_xid_list_get(Ecore_X_Window win __UNUSED__,
-                                 Ecore_X_Atom   atom __UNUSED__,
-                                Ecore_X_Atom   type __UNUSED__,
-                                 Ecore_X_ID   **pxids)
+ecore_x_window_prop_xid_get(Ecore_X_Window win,
+                            Ecore_X_Atom   atom,
+                            Ecore_X_Atom   type,
+                            Ecore_X_ID    *xids,
+                            unsigned int   len)
 {
+   xcb_get_property_cookie_t cookie;
    xcb_get_property_reply_t *reply;
-   int                       num = -1;
+   int num = 0;
 
-   if (pxids)
-      *pxids = NULL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return -1;
+   num = len;
+   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom, type,
+                                       0, 0x7fffffff);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return -1;
 
-   if ((reply->type == XCB_NONE) ||
-       (reply->value_len == 0))
-      num = 0;
-   else if ((reply->type == ECORE_X_ATOM_CARDINAL) &&
-            (reply->format == 32))
+   if ((reply->type != type) || (reply->format != 32))
+     num = -1;
+   else if (reply->value_len == 0)
+     num = 0;
+   else
      {
-       uint32_t *val;
-
-       num = xcb_get_property_value_length(reply);
-       if (pxids)
-         {
-            val = (uint32_t *)malloc (num);
-            if (!val)
-               return -1;
-
-            memcpy(val, xcb_get_property_value(reply), num);
-            *pxids = val;
-         }
-     }
-
-   return num;
-}
+        unsigned int i = 0;
+        unsigned char *v;
 
-/*
- * Remove/add/toggle X ID list item.
- */
-EAPI void
-ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
-                                    Ecore_X_Atom   atom,
-                                    Ecore_X_Atom   type,
-                                    Ecore_X_ID     item,
-                                    int            op)
-{
-   Ecore_X_ID *lst;
-   int         i;
-   int         num;
+        if (reply->value_len < len)
+          len = reply->value_len;
 
-   num = ecore_x_window_prop_xid_list_get(win, atom, type, &lst);
-   if (num < 0)
-      return;                  /* Error - assuming invalid window */
+        v = xcb_get_property_value(reply);
+        for (i = 0; i < len; i++)
+          xids[i] = ((uint32_t *)v)[i];
 
-   /* Is it there? */
-   for (i = 0; i < num; i++)
-     {
-       if (lst[i] == item)
-          break;
+        num = len;
      }
 
-   if (i < num)
-     {
-       /* Was in list */
-       if (op == ECORE_X_PROP_LIST_ADD)
-          goto done;
-       /* Remove it */
-       num--;
-       for (; i < num; i++)
-          lst[i] = lst[i + 1];
-     }
-   else
-     {
-       /* Was not in list */
-       if (op == ECORE_X_PROP_LIST_REMOVE)
-          goto done;
-       /* Add it */
-       num++;
-       lst = realloc(lst, num * sizeof(Ecore_X_ID));
-       lst[i] = item;
-     }
-
-   ecore_x_window_prop_xid_set(win, atom, type, lst, num);
-
- done:
-   if (lst)
-      free(lst);
-}
-
-/*
- * Set Atom (array) property
- */
-EAPI void
-ecore_x_window_prop_atom_set(Ecore_X_Window win,
-                             Ecore_X_Atom   atom,
-                             Ecore_X_Atom  *list,
-                             unsigned int   num)
-{
-   ecore_x_window_prop_xid_set(win, atom, ECORE_X_ATOM_ATOM, list, num);
+   if (reply) free(reply);
+   return num;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- * @param atom   Property atom.
- */
 EAPI void
-ecore_x_window_prop_atom_get_prefetch(Ecore_X_Window window,
-                                      Ecore_X_Atom   atom)
+ecore_x_window_prop_string_set(Ecore_X_Window win,
+                               Ecore_X_Atom   type,
+                               const char    *str)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window,
-                                       atom,
-                                       ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, type,
+                       ECORE_X_ATOM_UTF8_STRING, 8, strlen(str), str);
+//   ecore_x_flush();
 }
 
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_prop_atom_get_prefetch().
- */
-EAPI void
-ecore_x_window_prop_atom_get_fetch(void)
+EAPI char *
+ecore_x_window_prop_string_get(Ecore_X_Window win,
+                               Ecore_X_Atom   type)
 {
    xcb_get_property_cookie_t cookie;
    xcb_get_property_reply_t *reply;
+   char *str = NULL;
+   int len = 0;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   cookie =
+     xcb_get_property_unchecked(_ecore_xcb_conn, 0,
+                                win ? win : ((xcb_screen_t *)_ecore_xcb_screen)->root,
+                                type, XCB_GET_PROPERTY_TYPE_ANY, 0, 1000000L);
    reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
+   if (!reply) return NULL;
 
-/*
- * Get Atom (array) property
- *
- * At most len items are returned in val.
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * Note: Return value 0 means that the property exists but has no elements.
- */
-EAPI int
-ecore_x_window_prop_atom_get(Ecore_X_Window win,
-                             Ecore_X_Atom   atom,
-                             Ecore_X_Atom  *list,
-                             unsigned int len)
-{
-   return ecore_x_window_prop_xid_get(win, atom, ECORE_X_ATOM_ATOM, list, len);
-}
+   len = ((reply->value_len * reply->format) / 8);
+   str = (char *)malloc((len + 1) * sizeof(char));
+   memcpy(str, xcb_get_property_value(reply), len);
+   str[len] = '\0';
 
-/*
- * Get Atom (array) property
- *
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * The returned array must be freed with free().
- * Note: Return value 0 means that the property exists but has no elements.
- */
-EAPI int
-ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
-                                  Ecore_X_Atom   atom,
-                                  Ecore_X_Atom **plist)
-{
-   return ecore_x_window_prop_xid_list_get(win, atom, ECORE_X_ATOM_ATOM, plist);
-}
+   if (reply->type != ECORE_X_ATOM_UTF8_STRING)
+     {
+        Ecore_Xcb_Textproperty prop;
+        int count = 0;
+        char **list = NULL;
+        Eina_Bool ret = EINA_FALSE;
+
+        prop.value = strdup(str);
+        prop.nitems = len;
+        prop.encoding = reply->type;
+
+#ifdef HAVE_ICONV
+        ret = _ecore_xcb_utf8_textproperty_to_textlist(&prop, &list, &count);
+#else
+        ret = _ecore_xcb_mb_textproperty_to_textlist(&prop, &list, &count);
+#endif
+        if (ret)
+          {
+             if (count > 0)
+               str = strdup(list[0]);
+             else
+               str = strdup((char *)prop.value);
+
+             if (list) free(list);
+          }
+        else
+          str = strdup((char *)prop.value);
+     }
 
-/*
- * Remove/add/toggle atom list item.
- */
-EAPI void
-ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
-                                     Ecore_X_Atom   atom,
-                                     Ecore_X_Atom   item,
-                                     int            op)
-{
-   ecore_x_window_prop_xid_list_change(win, atom, ECORE_X_ATOM_ATOM, item, op);
+   free(reply);
+   return str;
 }
 
-/*
- * Set Window (array) property
- */
-EAPI void
-ecore_x_window_prop_window_set(Ecore_X_Window  win,
+EAPI int
+ecore_x_window_prop_window_get(Ecore_X_Window  win,
                                Ecore_X_Atom    atom,
                                Ecore_X_Window *list,
-                               unsigned int    num)
-{
-   ecore_x_window_prop_xid_set(win, atom, ECORE_X_ATOM_WINDOW, list, num);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- * @param atom   The atom.
- */
-EAPI void
-ecore_x_window_prop_window_get_prefetch(Ecore_X_Window window,
-                                        Ecore_X_Atom   atom)
+                               unsigned int    len)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window,
-                                       atom,
-                                       ECORE_X_ATOM_WINDOW,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return ecore_x_window_prop_xid_get(win, atom, ECORE_X_ATOM_WINDOW, list, len);
 }
 
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_prop_window_get_prefetch().
- */
 EAPI void
-ecore_x_window_prop_window_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/*
- * Get Window (array) property
- *
- * At most len items are returned in val.
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * Note: Return value 0 means that the property exists but has no elements.
- */
-EAPI int
-ecore_x_window_prop_window_get(Ecore_X_Window  win,
+ecore_x_window_prop_window_set(Ecore_X_Window  win,
                                Ecore_X_Atom    atom,
                                Ecore_X_Window *list,
-                               unsigned int    len)
+                               unsigned int    num)
 {
-   return ecore_x_window_prop_xid_get(win, atom, ECORE_X_ATOM_WINDOW, list, len);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_xid_set(win, atom, ECORE_X_ATOM_WINDOW, list, num);
 }
 
-/*
- * Get Window (array) property
- *
- * If the property was successfully fetched the number of items stored in
- * val is returned, otherwise -1 is returned.
- * The returned array must be freed with free().
- * Note: Return value 0 means that the property exists but has no elements.
- */
 EAPI int
 ecore_x_window_prop_window_list_get(Ecore_X_Window   win,
                                     Ecore_X_Atom     atom,
-                                    Ecore_X_Window **plist)
+                                    Ecore_X_Window **plst)
 {
-   return ecore_x_window_prop_xid_list_get(win, atom, ECORE_X_ATOM_WINDOW, plist);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return ecore_x_window_prop_xid_list_get(win, atom, ECORE_X_ATOM_WINDOW, plst);
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
 EAPI Ecore_X_Atom
 ecore_x_window_prop_any_type(void)
 {
-   return XCB_GET_PROPERTY_TYPE_ANY;
+   return XCB_ATOM_ANY;
 }
 
-/**
- * To be documented.
- * @param window   The window.
- * @param property The property atom.
- * @param type     The type atom.
- * @param size     The size.
- * @param data     The data.
- * @param number   The size of the data.
- *
- * FIXME: To be fixed.
- */
 EAPI void
-ecore_x_window_prop_property_set(Ecore_X_Window window,
-                                 Ecore_X_Atom   property,
-                                 Ecore_X_Atom   type,
-                                 int            size,
-                                 void          *data,
-                                 int            number)
-{
-   if (window == 0) window = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       property, type,
-                       size, number, data);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window   Window whose properties are requested.
- * @param property Property atom.
- * @param type     Type atom.
- */
-EAPI void
-ecore_x_window_prop_property_get_prefetch(Ecore_X_Window window,
-                                          Ecore_X_Atom   property,
-                                          Ecore_X_Atom   type)
+ecore_x_window_prop_property_del(Ecore_X_Window win,
+                                 Ecore_X_Atom   property)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? window : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       property, type, 0, LONG_MAX);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   xcb_delete_property(_ecore_xcb_conn, win, property);
 }
 
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_prop_property_get_prefetch().
- */
 EAPI void
-ecore_x_window_prop_property_get_fetch(void)
+ecore_x_window_prop_property_set(Ecore_X_Window win,
+                                 Ecore_X_Atom   property,
+                                 Ecore_X_Atom   type,
+                                 int            size,
+                                 void          *data,
+                                 int            num)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   if (win == 0)
+     win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   if (size != 32)
+     {
+        xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
+                            property, type, size, num, (unsigned char *)data);
+//        ecore_x_flush();
+     }
+   else
+     {
+        uint32_t *dat;
+        int i = 0, *ptr;
+
+        dat = malloc(sizeof(uint32_t) * num);
+        if (dat)
+          {
+             for (ptr = (int *)data, i = 0; i < num; i++)
+               dat[i] = ptr[i];
+             xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
+                                 property, type, size, num,
+                                 (unsigned char *)dat);
+             free(dat);
+//             ecore_x_flush();
+          }
+     }
 }
 
-/**
- * To be documented.
- * @param window   The window (Unused).
- * @param property The property atom (Unused).
- * @param type     The type atom (Unused).
- * @param size     The size (Unused).
- * @param data     The returned data.
- * @param num      The size of the data.
- * @return         1 on success, 0 otherwise.
- *
- * FIXME: To be fixed.
- */
 EAPI int
-ecore_x_window_prop_property_get(Ecore_X_Window  window __UNUSED__,
-                                 Ecore_X_Atom    property __UNUSED__,
-                                 Ecore_X_Atom    type __UNUSED__,
-                                 int             size __UNUSED__,
+ecore_x_window_prop_property_get(Ecore_X_Window  win,
+                                 Ecore_X_Atom    property,
+                                 Ecore_X_Atom    type,
+                                 int             size,
                                  unsigned char **data,
                                  int            *num)
 {
+   xcb_get_property_cookie_t cookie;
    xcb_get_property_reply_t *reply;
+   int format = 0;
+   unsigned int i = 0;
+   void *value;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   /* make sure these are initialized */
-   if (num) *num = 0L;
+   if (num) *num = 0;
 
    if (data)
      *data = NULL;
-   else /* we can't store the retrieved data, so just return */
-     return 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
+   else
      return 0;
 
-   if ((reply->format != size) ||
-       (reply->value_len == 0))
-      return 0;
-
-   *data = malloc(reply->value_len);
-   if (!*data)
-      return 0;
+   if (win == 0)
+     win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
 
-   memcpy(*data, xcb_get_property_value(reply), 
-          xcb_get_property_value_length(reply));
+   cookie =
+     xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
+                                property, type, 0, UINT_MAX);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return 0;
+   if ((reply->format != size) || (reply->value_len == 0))
+     {
+        free(reply);
+        return 0;
+     }
 
-   if (num)
-      *num = reply->value_len;
+   if (!(*data = malloc(reply->value_len * reply->format / 8)))
+     {
+        free(reply);
+        return 0;
+     }
 
-   return reply->format;
-}
+   value = xcb_get_property_value(reply);
+   switch (reply->format)
+     {
+      case 8:
+        for (i = 0; i < reply->value_len; i++)
+          (*data)[i] = ((unsigned char *)value)[i];
+        break;
+
+      case 16:
+        for (i = 0; i < reply->value_len; i++)
+          ((unsigned short *)*data)[i] = ((unsigned short *)value)[i];
+        break;
+
+      case 32:
+        for (i = 0; i < reply->value_len; i++)
+          ((unsigned int *)*data)[i] = ((uint32_t *)value)[i];
+        break;
+     }
 
-EAPI void
-ecore_x_window_prop_property_del(Ecore_X_Window window,
-                                 Ecore_X_Atom   property)
-{
-   xcb_delete_property(_ecore_xcb_conn, window, property);
+   if (num) *num = reply->value_len;
+   format = reply->format;
+   free(reply);
+   return format;
 }
 
-/**
- * Sends the ListProperties request.
- * @param window Window whose properties are requested.
- */
-EAPI void
-ecore_x_window_prop_list_prefetch(Ecore_X_Window window)
+EAPI int
+ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
+                                  Ecore_X_Atom   atom,
+                                  Ecore_X_Atom **list)
 {
-   xcb_list_properties_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_list_properties_unchecked(_ecore_xcb_conn, window);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return ecore_x_window_prop_xid_list_get(win, atom, ECORE_X_ATOM_ATOM, list);
 }
 
-
-/**
- * Gets the reply of the ListProperties request sent by ecore_x_window_prop_list_prefetch().
- */
 EAPI void
-ecore_x_window_prop_list_fetch(void)
+ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
+                                     Ecore_X_Atom   atom,
+                                     Ecore_X_Atom   item,
+                                     int            op)
 {
-   xcb_list_properties_cookie_t cookie;
-   xcb_list_properties_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_list_properties_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_xid_list_change(win, atom, ECORE_X_ATOM_ATOM, item, op);
 }
 
-
-/**
- * To be documented.
- * @param window  The window (Unused).
- * @param num_ret The number of atoms.
- * @return        The returned atoms.
- *
- * FIXME: To be fixed.
- */
-EAPI Ecore_X_Atom *
-ecore_x_window_prop_list(Ecore_X_Window window __UNUSED__,
-                         int           *num_ret)
+EAPI int
+ecore_x_window_prop_xid_list_get(Ecore_X_Window win,
+                                 Ecore_X_Atom   atom,
+                                 Ecore_X_Atom   type,
+                                 Ecore_X_ID   **xids)
 {
-   xcb_list_properties_reply_t *reply;
-   Ecore_X_Atom                *atoms;
-
-   if (num_ret) *num_ret = 0;
-
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-      return NULL;
+   xcb_get_property_cookie_t cookie;
+   xcb_get_property_reply_t *reply;
+   int num = -1;
 
-   atoms = (Ecore_X_Atom *)malloc(reply->atoms_len * sizeof(Ecore_X_Atom));
-   if (!atoms)
-      return NULL;
-   memcpy(atoms,
-          xcb_list_properties_atoms(reply),
-          reply->atoms_len * sizeof(Ecore_X_Atom));
-   if(num_ret)
-     *num_ret = reply->atoms_len;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-   return atoms;
-}
+   if (xids) *xids = NULL;
 
-/**
- * Set a window string property.
- * @param win The window
- * @param type The property
- * @param str The string
- *
- * Set a window string property
- */
-EAPI void
-ecore_x_window_prop_string_set(Ecore_X_Window win,
-                               Ecore_X_Atom   type,
-                               const char    *str)
-{
-   if (win == 0) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
-                     type, ECORE_X_ATOM_UTF8_STRING,
-                     8, strlen(str), str);
-}
+   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom, type,
+                                       0, 0x7fffffff);
+   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return -1;
 
-/**
- * Sends the GetProperty request.
- * @param window Window whose properties are requested.
- * @param type   The atom.
- */
-EAPI void
-ecore_x_window_prop_string_get_prefetch(Ecore_X_Window window,
-                                        Ecore_X_Atom   type)
-{
-   xcb_get_property_cookie_t cookie;
+   if ((reply->type != type) || (reply->format != 32))
+     num = -1;
+   else if ((reply->value_len == 0) || (!xcb_get_property_value(reply)))
+     num = 0;
+   else
+     {
+        Ecore_X_Atom *alst;
+        void *val;
+
+        num = xcb_get_property_value_length(reply);
+        val = xcb_get_property_value(reply);
+        alst = malloc(num * sizeof(Ecore_X_ID));
+        if (alst)
+          {
+             int i = 0;
+
+             for (i = 0; i < num; i++)
+               alst[i] = ((uint32_t *)val)[i];
+             *xids = alst;
+          }
+     }
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0,
-                                       window ? window : ((xcb_screen_t *)_ecore_xcb_screen)->root,
-                                       type, XCB_GET_PROPERTY_TYPE_ANY, 0L, 1000000L);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   free(reply);
+   return num;
 }
 
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_prop_string_get_prefetch().
- */
 EAPI void
-ecore_x_window_prop_string_get_fetch(void)
+ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
+                                    Ecore_X_Atom   atom,
+                                    Ecore_X_Atom   type,
+                                    Ecore_X_ID     item,
+                                    int            op)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
+   Ecore_X_ID *lst;
+   int i = 0, num = 0;
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-/**
- * Get a window string property.
- * @param window The window
- * @param type The property
- *
- * Return window string property of a window. String must be free'd when done.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_window_prop_string_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_window_prop_string_get_fetch(), which gets the reply.
- */
-EAPI char *
-ecore_x_window_prop_string_get(Ecore_X_Window window __UNUSED__,
-                               Ecore_X_Atom   type __UNUSED__)
-{
-   xcb_get_property_reply_t *reply;
-   char                     *str = NULL;
+   num = ecore_x_window_prop_xid_list_get(win, atom, type, &lst);
+   if (num < 0) return;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     return NULL;
+   for (i = 0; i < num; i++)
+     {
+        if (lst[i] == item) break;
+     }
 
-   if (reply->type == ECORE_X_ATOM_UTF8_STRING)
+   if (i < num)
      {
-        int length;
-
-        length = reply->value_len;
-        str = (char *)malloc(length + 1);
-        memcpy(str,
-               xcb_get_property_value(reply),
-               length);
-        str[length] = '\0';
+        if (op == ECORE_X_PROP_LIST_ADD)
+          goto done;
+        num--;
+        for (; i < num; i++)
+          lst[i] = lst[i + 1];
      }
    else
      {
-       /* FIXME: to be done... */
-
-/* #ifdef X_HAVE_UTF8_STRING */
-/*         s = Xutf8TextPropertyToTextList(_ecore_xcb_conn, &xtp, */
-/*                                         &list, &items); */
-/* #else */
-/*         s = XmbTextPropertyToTextList(_ecore_xcb_conn, &xtp, */
-/*                                       &list, &items); */
-/* #endif */
-/*         if ((s == XLocaleNotSupported) || */
-/*             (s == XNoMemory) || (s == XConverterNotFound)) */
-/*           { */
-/*              str = strdup((char *)xtp.value); */
-/*           } */
-/*         else if ((s >= Success) && (items > 0)) */
-/*           { */
-/*              str = strdup(list[0]); */
-/*           } */
-/*         if (list) */
-/*            XFreeStringList(list); */
+        if (op == ECORE_X_PROP_LIST_REMOVE)
+          goto done;
+        num++;
+        lst = realloc(lst, num * sizeof(Ecore_X_ID));
+        lst[i] = item;
      }
+   ecore_x_window_prop_xid_set(win, atom, type, lst, num);
 
-   return str;
+done:
+   if (lst) free(lst);
 }
 
-/* FIXME : round trips because of GetWMProtocols */
-/*         should we rewrite its code ? */
-EAPI int
-ecore_x_window_prop_protocol_isset(Ecore_X_Window      window,
+EAPI Eina_Bool
+ecore_x_window_prop_protocol_isset(Ecore_X_Window      win,
                                    Ecore_X_WM_Protocol protocol)
 {
-   Ecore_X_Atom *protos;
-   Ecore_X_Atom  proto;
-   uint32_t      protos_count;
-   uint32_t      i;
-   uint8_t       ret = 0;
-
-   /* check for invalid values */
-   if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
-       return ret;
-
-   proto = _ecore_xcb_atoms_wm_protocols[protocol];
-
-   if (!xcb_get_wm_protocols(_ecore_xcb_conn, window, &protos_count, &protos))
-       return ret;
-
-   for (i = 0; i < protos_count; i++)
-       if (protos[i] == proto)
-         {
-            ret = 1;
-            break;
-         }
-
-   free(protos);
+   Eina_Bool ret = EINA_FALSE;
+   Ecore_X_Atom proto;
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_t protos;
+#else
+   xcb_icccm_get_wm_protocols_reply_t protos;
+#endif
+   xcb_get_property_cookie_t cookie;
+   uint8_t reply;
+   uint32_t count = 0, i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (protocol >= ECORE_X_WM_PROTOCOL_NUM) return EINA_FALSE;
+
+   proto = _ecore_xcb_atoms_wm_protocol[protocol];
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
+                                           ECORE_X_ATOM_WM_PROTOCOLS);
+   reply = xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL);
+#else
+   cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
+                                                 ECORE_X_ATOM_WM_PROTOCOLS);
+   reply = xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie,
+                                            &protos, NULL);
+#endif
+   if (!reply) return EINA_FALSE;
+
+   count = protos.atoms_len;
+   for (i = 0; i < count; i++)
+     {
+        if (protos.atoms[i] == proto)
+          {
+             ret = EINA_TRUE;
+             break;
+          }
+     }
 
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_wipe(&protos);
+#else
+   xcb_icccm_get_wm_protocols_reply_wipe(&protos);
+#endif
    return ret;
 }
 
-/**
- * To be documented.
- * @param window  The window.
- * @param num_ret The number of WM protocols.
- * @return        The returned WM protocols.
- *
- * FIXME: To be fixed.
- */
-
-/* FIXME : round trips because of get_wm_protocols */
-/*         should we rewrite its code ? */
-
 EAPI Ecore_X_WM_Protocol *
-ecore_x_window_prop_protocol_list_get(Ecore_X_Window window,
+ecore_x_window_prop_protocol_list_get(Ecore_X_Window win,
                                       int           *num_ret)
 {
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_t protos;
+#else
+   xcb_icccm_get_wm_protocols_reply_t protos;
+#endif
+   xcb_get_property_cookie_t cookie;
+   uint8_t reply;
+   uint32_t count = 0, i = 0;
    Ecore_X_WM_Protocol *prot_ret = NULL;
-   Ecore_X_Atom        *protos;
-   uint32_t             protos_count;
-   uint32_t             i;
 
-   if (!xcb_get_wm_protocols(_ecore_xcb_conn, window, &protos_count, &protos))
-     return NULL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!num_ret) return NULL;
+
+   *num_ret = 0;
 
-   if ((!protos) || (protos_count <= 0)) return NULL;
+#ifdef OLD_XCB_VERSION
+   cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
+                                           ECORE_X_ATOM_WM_PROTOCOLS);
+   reply = xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL);
+#else
+   cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
+                                                 ECORE_X_ATOM_WM_PROTOCOLS);
+   reply = xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie,
+                                            &protos, NULL);
+#endif
+   if (!reply) return NULL;
 
-   prot_ret = calloc(1, protos_count * sizeof(Ecore_X_WM_Protocol));
+   count = protos.atoms_len;
+   if (count <= 0)
+     {
+#ifdef OLD_XCB_VERSION
+        xcb_get_wm_protocols_reply_wipe(&protos);
+#else
+        xcb_icccm_get_wm_protocols_reply_wipe(&protos);
+#endif
+        return NULL;
+     }
+
+   prot_ret = calloc(1, count * sizeof(Ecore_X_WM_Protocol));
    if (!prot_ret)
      {
-       free(protos);
-       return NULL;
+#ifdef OLD_XCB_VERSION
+        xcb_get_wm_protocols_reply_wipe(&protos);
+#else
+        xcb_icccm_get_wm_protocols_reply_wipe(&protos);
+#endif
+        return NULL;
      }
-   for (i = 0; i < protos_count; i++)
+
+   for (i = 0; i < count; i++)
      {
-       Ecore_X_WM_Protocol j;
-
-       prot_ret[i] = -1;
-       for (j = 0; j < ECORE_X_WM_PROTOCOL_NUM; j++)
-         {
-            if (_ecore_xcb_atoms_wm_protocols[j] == protos[i])
-              prot_ret[i] = j;
-         }
+        Ecore_X_WM_Protocol j;
+
+        prot_ret[i] = -1;
+        for (j = 0; j < ECORE_X_WM_PROTOCOL_NUM; j++)
+          {
+             if (_ecore_xcb_atoms_wm_protocol[j] == protos.atoms[i])
+               prot_ret[i] = j;
+          }
      }
-   free(protos);
-   *num_ret = protos_count;
 
+   if (num_ret) *num_ret = count;
+
+#ifdef OLD_XCB_VERSION
+   xcb_get_wm_protocols_reply_wipe(&protos);
+#else
+   xcb_icccm_get_wm_protocols_reply_wipe(&protos);
+#endif
    return prot_ret;
 }
+
+EAPI Ecore_X_Atom *
+ecore_x_window_prop_list(Ecore_X_Window win,
+                         int           *num)
+{
+   xcb_list_properties_cookie_t cookie;
+   xcb_list_properties_reply_t *reply;
+   xcb_atom_t *atm;
+   Ecore_X_Atom *atoms;
+   int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (num) *num = 0;
+
+   cookie = xcb_list_properties_unchecked(_ecore_xcb_conn, win);
+   reply = xcb_list_properties_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return NULL;
+
+   atoms = (Ecore_X_Atom *)malloc(reply->atoms_len * sizeof(Ecore_X_Atom));
+   if (!atoms)
+     {
+        free(reply);
+        return NULL;
+     }
+
+   atm = xcb_list_properties_atoms(reply);
+   for (i = 0; i < reply->atoms_len; i++)
+     atoms[i] = atm[i];
+
+   if (num) *num = reply->atoms_len;
+   free(reply);
+
+   return atoms;
+}
+
index c025673..82326fa 100644 (file)
@@ -1,76 +1,60 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
-/* #include "Ecore.h" */
 #include "ecore_xcb_private.h"
-#include "Ecore_X.h"
-
 
 typedef struct _Shadow Shadow;
 struct _Shadow
 {
-   Shadow         *parent;
-   Shadow        **children;
-   Ecore_X_Window  win;
-   int             children_num;
-   short           x, y;
-   unsigned short  w, h;
+   Shadow        *parent, **children;
+   Ecore_X_Window win;
+   int            children_num;
+   short          x, y;
+   unsigned short w, h;
 };
 
-static int shadow_count = 0;
+static Eina_Bool _inside_rects(Shadow            *s,
+                               int                x,
+                               int                y,
+                               int                bx,
+                               int                by,
+                               Ecore_X_Rectangle *rects,
+                               int                num);
+
+//static int shadow_count = 0;
 static Shadow **shadow_base = NULL;
 static int shadow_num = 0;
 
-
 /* FIXME: round trips */
 static Shadow *
 _ecore_x_window_tree_walk(Ecore_X_Window window)
 {
-   Shadow                            *s;
-   Shadow                           **sl;
+   Shadow *s, **sl;
    xcb_get_window_attributes_reply_t *reply_attr;
-   xcb_get_geometry_reply_t          *reply_geom;
-   xcb_query_tree_reply_t            *reply_tree;
+   xcb_get_geometry_reply_t *reply_geom;
+   xcb_query_tree_reply_t *reply_tree;
    xcb_get_window_attributes_cookie_t cookie_attr;
-   xcb_get_geometry_cookie_t          cookie_geom;
-   xcb_query_tree_cookie_t            cookie_tree;
-   int                                i;
-   int                                j;
+   xcb_get_geometry_cookie_t cookie_geom;
+   xcb_query_tree_cookie_t cookie_tree;
+   int i, j;
 
-   cookie_attr = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, window);
-   cookie_geom = xcb_get_geometry_unchecked(_ecore_xcb_conn, window);
-   cookie_tree = xcb_query_tree_unchecked(_ecore_xcb_conn, window);
+   CHECK_XCB_CONN;
 
+   cookie_attr = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, window);
    reply_attr = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie_attr, NULL);
-   if (!reply_attr)
-     {
-        reply_geom = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_geom, NULL);
-        if (reply_geom) free(reply_geom);
-        reply_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_tree, NULL);
-        if (reply_tree) free(reply_tree);
-        return NULL;
-     }
-
+   if (!reply_attr) return NULL;
    if (reply_attr->map_state != XCB_MAP_STATE_VIEWABLE)
      {
-        reply_geom = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_geom, NULL);
-        if (reply_geom) free(reply_geom);
-        reply_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_tree, NULL);
-        if (reply_tree) free(reply_tree);
+        free(reply_attr);
         return NULL;
      }
 
    free(reply_attr);
 
-   s = calloc(1, sizeof(Shadow));
-   if (!s) return NULL;
-
+   cookie_geom = xcb_get_geometry_unchecked(_ecore_xcb_conn, window);
    reply_geom = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_geom, NULL);
-   if (!reply_geom)
+   if (!reply_geom) return NULL;
+
+   if (!(s = calloc(1, sizeof(Shadow))))
      {
-        reply_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_tree, NULL);
-        if (reply_tree) free(reply_tree);
+        free(reply_geom);
         return NULL;
      }
 
@@ -82,82 +66,86 @@ _ecore_x_window_tree_walk(Ecore_X_Window window)
 
    free(reply_geom);
 
+   cookie_tree = xcb_query_tree_unchecked(_ecore_xcb_conn, window);
    reply_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_tree, NULL);
    if (reply_tree)
-/*    if (XQueryTree(_ecore_xcb_conn, s->win, &root_win, &parent_win, */
-/*                &list, &num)) */
      {
         xcb_window_t *list;
-        int           num;
+        int num;
 
         num = xcb_query_tree_children_length(reply_tree);
         list = xcb_query_tree_children(reply_tree);
 
-       s->children = calloc(1, sizeof(Shadow *) * num);
-       if (s->children)
-         {
-            s->children_num = num;
-            for (i = 0; i < num; i++)
-              {
-                 s->children[i] = _ecore_x_window_tree_walk(list[i]);
-                 if (s->children[i]) s->children[i]->parent = s;
-              }
-            /* compress list down */
-            j = 0;
-            for (i = 0; i < num; i++)
-              {
-                 if (s->children[i])
-                   {
-                      s->children[j] = s->children[i];
-                      j++;
-                   }
-              }
-            if (j == 0)
-              {
-                 free(s->children);
-                 s->children = NULL;
-                 s->children_num = 0;
-              }
-            else
-              {
-                 s->children_num = j;
-                 sl = realloc(s->children, sizeof(Shadow *) * j);
-                 if (sl) s->children = sl;
-              }
-         }
+        s->children = calloc(1, sizeof(Shadow *) * num);
+        if (s->children)
+          {
+             s->children_num = num;
+             for (i = 0; i < num; i++)
+               {
+                  s->children[i] = _ecore_x_window_tree_walk(list[i]);
+                  if (s->children[i])
+                    s->children[i]->parent = s;
+               }
+             /* compress list down */
+             j = 0;
+             for (i = 0; i < num; i++)
+               {
+                  if (s->children[i])
+                    {
+                       s->children[j] = s->children[i];
+                       j++;
+                    }
+               }
+             if (j == 0)
+               {
+                  free(s->children);
+                  s->children = NULL;
+                  s->children_num = 0;
+               }
+             else
+               {
+                  s->children_num = j;
+                  sl = realloc(s->children, sizeof(Shadow *) * j);
+                  if (sl) s->children = sl;
+               }
+          }
+
         free(reply_tree);
      }
+
    return s;
 }
 
 static void
 _ecore_x_window_tree_shadow_free1(Shadow *s)
 {
-   int i;
+   int i = 0;
 
    if (!s) return;
    if (s->children)
      {
-       for (i = 0; i < s->children_num; i++)
-         {
-            if (s->children[i])
-              _ecore_x_window_tree_shadow_free1(s->children[i]);
-         }
-       free(s->children);
+        for (i = 0; i < s->children_num; i++)
+          {
+             if (s->children[i])
+               _ecore_x_window_tree_shadow_free1(s->children[i]);
+          }
+        free(s->children);
      }
+
    free(s);
 }
 
 static void
 _ecore_x_window_tree_shadow_free(void)
 {
-   int i;
+   int i = 0;
 
    if (!shadow_base) return;
+
    for (i = 0; i < shadow_num; i++)
      {
-       if (!shadow_base[i]) continue;
-       _ecore_x_window_tree_shadow_free1(shadow_base[i]);
+        if (!shadow_base[i]) continue;
+        _ecore_x_window_tree_shadow_free1(shadow_base[i]);
      }
    free(shadow_base);
    shadow_base = NULL;
@@ -167,55 +155,62 @@ _ecore_x_window_tree_shadow_free(void)
 static void
 _ecore_x_window_tree_shadow_populate(void)
 {
-   Ecore_X_Window   *roots;
-   int               i, num;
+   Ecore_X_Window *roots = NULL;
+   int i = 0, num = 0;
 
-   roots = ecore_x_window_root_list(&num);
-   if (roots)
+   if ((roots = ecore_x_window_root_list(&num)))
      {
-       shadow_base = calloc(1, sizeof(Shadow *) * num);
-       if (shadow_base)
-         {
-            shadow_num = num;
-            for (i = 0; i < num; i++)
-              shadow_base[i] = _ecore_x_window_tree_walk(roots[i]);
-         }
-       free(roots);
+        shadow_base = calloc(1, sizeof(Shadow *) * num);
+        if (shadow_base)
+          {
+             shadow_num = num;
+             for (i = 0; i < num; i++)
+               shadow_base[i] = _ecore_x_window_tree_walk(roots[i]);
+          }
+
+        free(roots);
      }
 }
 
-static void
-_ecore_x_window_tree_shadow_start(void)
-{
+/*
+   static void
+   _ecore_x_window_tree_shadow_start(void)
+   {
    shadow_count++;
    if (shadow_count > 1) return;
    _ecore_x_window_tree_shadow_populate();
-}
+   }
 
-static void
-_ecore_x_window_tree_shadow_stop(void)
-{
+   static void
+   _ecore_x_window_tree_shadow_stop(void)
+   {
    shadow_count--;
    if (shadow_count != 0) return;
    _ecore_x_window_tree_shadow_free();
-}
+   }
+ */
 
 Shadow *
-_ecore_x_window_shadow_tree_find_shadow(Shadow *s, Ecore_X_Window win)
+_ecore_x_window_shadow_tree_find_shadow(Shadow        *s,
+                                        Ecore_X_Window win)
 {
    Shadow *ss;
-   int i;
+   int i = 0;
 
    if (s->win == win) return s;
+
    if (s->children)
      {
-       for (i = 0; i < s->children_num; i++)
-         {
-            if (!s->children[i]) continue;
-            if ((ss = _ecore_x_window_shadow_tree_find_shadow(s->children[i], win)))
-              return ss;
-         }
+        for (i = 0; i < s->children_num; i++)
+          {
+             if (!s->children[i]) continue;
+
+             if ((ss =
+                    _ecore_x_window_shadow_tree_find_shadow(s->children[i], win)))
+               return ss;
+          }
      }
+
    return NULL;
 }
 
@@ -223,77 +218,127 @@ Shadow *
 _ecore_x_window_shadow_tree_find(Ecore_X_Window base)
 {
    Shadow *s;
-   int i;
+   int i = 0;
 
    for (i = 0; i < shadow_num; i++)
      {
-       if (!shadow_base[i]) continue;
-       if ((s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], base)))
-         return s;
+        if (!shadow_base[i]) continue;
+
+        if ((s =
+               _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], base)))
+          return s;
      }
    return NULL;
 }
 
 static Ecore_X_Window
-_ecore_x_window_shadow_tree_at_xy_get_shadow(Shadow *s, int bx, int by, int x, int y,
-                                            Ecore_X_Window *skip, int skip_num)
+_ecore_x_window_shadow_tree_at_xy_get_shadow(Shadow         *s,
+                                             int             bx,
+                                             int             by,
+                                             int             x,
+                                             int             y,
+                                             Ecore_X_Window *skip,
+                                             int             skip_num)
 {
    Ecore_X_Window child;
-   int i, j;
-   int wx, wy;
+   Ecore_X_Rectangle *rects;
+   int i = 0, j = 0, wx = 0, wy = 0, num = 0;
 
    wx = s->x + bx;
    wy = s->y + by;
    if (!((x >= wx) && (y >= wy) && (x < (wx + s->w)) && (y < (wy + s->h))))
      return 0;
+
+   rects = ecore_x_window_shape_rectangles_get(s->win, &num);
+   if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
+   num = 0;
+   rects = ecore_x_window_shape_input_rectangles_get(s->win, &num);
+   if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
+
    if (s->children)
      {
-       int skipit = 0;
-
-       for (i = s->children_num - 1; i >= 0; --i)
-         {
-            if (!s->children[i]) continue;
-            skipit = 0;
-            if (skip)
-              {
-                 for (j = 0; j < skip_num; j++)
-                   {
-                      if (s->children[i]->win == skip[j])
-                        {
-                           skipit = 1;
-                           goto onward;
-                        }
-                   }
-              }
-            onward:
-            if (!skipit)
-              {
-                 if ((child = _ecore_x_window_shadow_tree_at_xy_get_shadow(s->children[i], wx, wy, x, y, skip, skip_num)))
-                   {
-                      return child;
-                   }
-              }
-         }
+        int skipit = 0;
+
+        for (i = s->children_num - 1; i >= 0; --i)
+          {
+             if (!s->children[i]) continue;
+
+             skipit = 0;
+             if (skip)
+               {
+                  for (j = 0; j < skip_num; j++)
+                    {
+                       if (s->children[i]->win == skip[j])
+                         {
+                            skipit = 1;
+                            goto onward;
+                         }
+                    }
+               }
+onward:
+             if (!skipit)
+               {
+                  if ((child =
+                         _ecore_x_window_shadow_tree_at_xy_get_shadow(s->children[i], wx, wy, x, y, skip, skip_num)))
+                    return child;
+               }
+          }
      }
+
    return s->win;
 }
 
 static Ecore_X_Window
-_ecore_x_window_shadow_tree_at_xy_get(Ecore_X_Window base, int bx, int by, int x, int y,
-                                     Ecore_X_Window *skip, int skip_num)
+_ecore_x_window_shadow_tree_at_xy_get(Ecore_X_Window  base,
+                                      int             bx,
+                                      int             by,
+                                      int             x,
+                                      int             y,
+                                      Ecore_X_Window *skip,
+                                      int             skip_num)
 {
    Shadow *s;
 
    if (!shadow_base)
      {
-       _ecore_x_window_tree_shadow_populate();
-       if (!shadow_base) return 0;
+        _ecore_x_window_tree_shadow_populate();
+        if (!shadow_base) return 0;
      }
+
    s = _ecore_x_window_shadow_tree_find(base);
    if (!s) return 0;
+
    return _ecore_x_window_shadow_tree_at_xy_get_shadow(s, bx, by, x, y, skip, skip_num);
 }
 
+static Eina_Bool
+_inside_rects(Shadow            *s,
+              int                x,
+              int                y,
+              int                bx,
+              int                by,
+              Ecore_X_Rectangle *rects,
+              int                num)
+{
+   Eina_Bool inside = EINA_FALSE;
+   int i = 0;
+
+   if (!rects) return EINA_FALSE;
+   for (i = 0; i < num; i++)
+     {
+        if ((x >= s->x + bx + rects[i].x) &&
+            (y >= s->y + by + rects[i].y) &&
+            (x < (int)(s->x + bx + rects[i].x + rects[i].width)) &&
+            (y < (int)(s->y + by + rects[i].y + rects[i].height)))
+          {
+             inside = EINA_TRUE;
+             break;
+          }
+     }
+   free(rects);
+   return inside;
+}
+
 /**
  * Retrieves the top, visible window at the given location,
  * but skips the windows in the list. This uses a shadow tree built from the
@@ -303,11 +348,17 @@ _ecore_x_window_shadow_tree_at_xy_get(Ecore_X_Window base, int bx, int by, int x
  * @param   base The base window to start searching from (normally root).
  * @param   x The given X position.
  * @param   y The given Y position.
- * @return  The window at that position.
+ * @param   skip The list of windows to be skipped.
+ * @param   skip_num The number of windows to be skipped.
+ * @return  The window at the desired position.
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base, int x, int y, Ecore_X_Window *skip, int skip_num)
+ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window  base,
+                                               int             x,
+                                               int             y,
+                                               Ecore_X_Window *skip,
+                                               int             skip_num)
 {
    return _ecore_x_window_shadow_tree_at_xy_get(base, 0, 0, x, y, skip, skip_num);
 }
@@ -321,25 +372,28 @@ ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base, int x, int y
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_shadow_parent_get(Ecore_X_Window root, Ecore_X_Window win)
+ecore_x_window_shadow_parent_get(Ecore_X_Window root __UNUSED__,
+                                 Ecore_X_Window win)
 {
    Shadow *s;
-   int     i;
+   int i = 0;
 
    if (!shadow_base)
      {
-       _ecore_x_window_tree_shadow_populate();
-       if (!shadow_base) return 0;
+        _ecore_x_window_tree_shadow_populate();
+        if (!shadow_base) return 0;
      }
+
    for (i = 0; i < shadow_num; i++)
      {
-       if (!shadow_base[i]) continue;
-       s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], win);
-       if (s)
-         {
-            if (!s->parent) return 0;
-            return s->parent->win;
-         }
+        if (!shadow_base[i]) continue;
+
+        s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], win);
+        if (s)
+          {
+             if (!s->parent) return 0;
+             return s->parent->win;
+          }
      }
    return 0;
 }
@@ -353,3 +407,4 @@ ecore_x_window_shadow_tree_flush(void)
 {
    _ecore_x_window_tree_shadow_free();
 }
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_window_shape.c b/src/lib/ecore_x/xcb/ecore_xcb_window_shape.c
new file mode 100644 (file)
index 0000000..6206a51
--- /dev/null
@@ -0,0 +1,790 @@
+#include "ecore_xcb_private.h"
+#ifdef ECORE_XCB_SHAPE
+# include <xcb/shape.h>
+#endif
+
+/**
+ * @defgroup Ecore_X_Window_Shape X Window Shape Functions
+ *
+ * These functions use the shape extension of the X server to change
+ * shape of given windows.
+ */
+
+/**
+ * Sets the input shape of the given window to that given by the pixmap @p mask.
+ * @param   win  The given window.
+ * @param   mask A 1-bit depth pixmap that provides the new input shape of the
+ *               window.
+ * @ingroup Ecore_X_Window_Shape
+ */
+EAPI void
+ecore_x_window_shape_input_mask_set(Ecore_X_Window win,
+                                    Ecore_X_Pixmap mask)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_mask(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT,
+                  win, 0, 0, mask);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   mask = 0;
+#endif
+}
+
+/**
+ * Sets the shape of the given window to that given by the pixmap @p mask.
+ * @param   win  The given window.
+ * @param   mask A 2-bit depth pixmap that provides the new shape of the
+ *               window.
+ * @ingroup Ecore_X_Window_Shape
+ */
+EAPI void
+ecore_x_window_shape_mask_set(Ecore_X_Window win,
+                              Ecore_X_Pixmap mask)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_mask(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING,
+                  win, 0, 0, mask);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   mask = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_window_set(Ecore_X_Window win,
+                                Ecore_X_Window shape_win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING,
+                     XCB_SHAPE_SK_BOUNDING, win, 0, 0, shape_win);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   shape_win = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_window_set_xy(Ecore_X_Window win,
+                                   Ecore_X_Window shape_win,
+                                   int            x,
+                                   int            y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING,
+                     XCB_SHAPE_SK_BOUNDING, win, x, y, shape_win);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   shape_win = 0;
+   x = 0;
+   y = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangle_set(Ecore_X_Window win,
+                                   int            x,
+                                   int            y,
+                                   int            w,
+                                   int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
+                        XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangles_set(Ecore_X_Window     win,
+                                    Ecore_X_Rectangle *rects,
+                                    int                num)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t *rect = NULL;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!rects) return;
+
+#ifdef ECORE_XCB_SHAPE
+   if (num > 0)
+     {
+        int i = 0;
+
+        if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
+          return;
+
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
+     }
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
+                        XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, num, (xcb_rectangle_t *)rect);
+
+   if (rect) free(rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   num = 0;
+   rects = NULL;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_window_add(Ecore_X_Window win,
+                                Ecore_X_Window shape_win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
+                     XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING,
+                     win, 0, 0, shape_win);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   shape_win = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_window_add_xy(Ecore_X_Window win,
+                                   Ecore_X_Window shape_win,
+                                   int            x,
+                                   int            y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
+                     XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING,
+                     win, x, y, shape_win);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   shape_win = 0;
+   x = 0;
+   y = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangle_add(Ecore_X_Window win,
+                                   int            x,
+                                   int            y,
+                                   int            w,
+                                   int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
+                        XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangle_subtract(Ecore_X_Window win,
+                                        int            x,
+                                        int            y,
+                                        int            w,
+                                        int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SUBTRACT,
+                        XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangle_clip(Ecore_X_Window win,
+                                    int            x,
+                                    int            y,
+                                    int            w,
+                                    int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_INTERSECT,
+                        XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangles_add(Ecore_X_Window     win,
+                                    Ecore_X_Rectangle *rects,
+                                    int                num)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t *rect = NULL;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   if (num > 0)
+     {
+        int i = 0;
+
+        if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
+          return;
+
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
+     }
+
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
+                        XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, num, (xcb_rectangle_t *)&rect);
+
+   if (rect) free(rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   num = 0;
+   rects = NULL;
+#endif
+}
+
+EAPI Ecore_X_Rectangle *
+ecore_x_window_shape_rectangles_get(Ecore_X_Window win,
+                                    int           *num_ret)
+{
+   Ecore_X_Rectangle *rects = NULL;
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_get_rectangles_cookie_t cookie;
+   xcb_shape_get_rectangles_reply_t *reply;
+   xcb_rectangle_t *r;
+   unsigned int i = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (num_ret) *num_ret = 0;
+
+#ifdef ECORE_XCB_SHAPE
+   cookie =
+     xcb_shape_get_rectangles(_ecore_xcb_conn, win, XCB_SHAPE_SK_BOUNDING);
+   reply = xcb_shape_get_rectangles_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return NULL;
+   if (num_ret) *num_ret = reply->rectangles_len;
+
+   if (reply->rectangles_len < 1)
+     {
+        free(reply);
+        if (num_ret) *num_ret = 0;
+        return NULL;
+     }
+
+   rects = malloc(sizeof(Ecore_X_Rectangle) * reply->rectangles_len);
+   if (!rects)
+     {
+        free(reply);
+        if (num_ret) *num_ret = 0;
+        return NULL;
+     }
+   r = xcb_shape_get_rectangles_rectangles(reply);
+   for (i = 0; i < reply->rectangles_len; i++)
+     {
+        rects[i].x = r[i].x;
+        rects[i].y = r[i].y;
+        rects[i].width = r[i].width;
+        rects[i].height = r[i].height;
+     }
+
+   free(reply);
+
+   return rects;
+#else
+   return rects;
+   win = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_events_select(Ecore_X_Window win,
+                                   Eina_Bool      on)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_select_input(_ecore_xcb_conn, win, on);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   on = 0;
+#endif
+}
+
+EAPI Ecore_X_Rectangle *
+ecore_x_window_shape_input_rectangles_get(Ecore_X_Window win,
+                                          int           *num_ret)
+{
+   Ecore_X_Rectangle *rects = NULL;
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_get_rectangles_cookie_t cookie;
+   xcb_shape_get_rectangles_reply_t *reply;
+   xcb_rectangle_t *r;
+   unsigned int i = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (num_ret) *num_ret = 0;
+
+#ifdef ECORE_XCB_SHAPE
+   cookie =
+     xcb_shape_get_rectangles(_ecore_xcb_conn, win, XCB_SHAPE_SK_INPUT);
+   reply = xcb_shape_get_rectangles_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return NULL;
+   if (num_ret) *num_ret = reply->rectangles_len;
+
+   if (reply->rectangles_len < 1)
+     {
+        free(reply);
+        if (num_ret) *num_ret = 0;
+        return NULL;
+     }
+
+   rects = malloc(sizeof(Ecore_X_Rectangle) * reply->rectangles_len);
+   if (!rects)
+     {
+        free(reply);
+        if (num_ret) *num_ret = 0;
+        return NULL;
+     }
+   r = xcb_shape_get_rectangles_rectangles(reply);
+   for (i = 0; i < reply->rectangles_len; i++)
+     {
+        rects[i].x = r[i].x;
+        rects[i].y = r[i].y;
+        rects[i].width = r[i].width;
+        rects[i].height = r[i].height;
+     }
+
+   free(reply);
+
+   return rects;
+#else
+   xcb_get_geometry_cookie_t cookie;
+   xcb_get_geometry_reply_t *reply;
+
+   if (!(rects = malloc(sizeof(Ecore_X_Rectangle))))
+     return NULL;
+
+   /* get geometry */
+   cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
+   reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
+   if (reply)
+     {
+        rects[0].x = reply->x;
+        rects[0].y = reply->y;
+        rects[0].width = reply->width;
+        rects[0].height = reply->height;
+        free(reply);
+     }
+   if (num_ret) *num_ret = 1;
+   return rects;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_rectangles_set(Ecore_X_Window     win,
+                                          Ecore_X_Rectangle *rects,
+                                          int                num)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t *rect = NULL;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!rects) return;
+
+#ifdef ECORE_XCB_SHAPE
+   if (num > 0)
+     {
+        int i = 0;
+
+        if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
+          return;
+
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
+     }
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
+                        XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, num, (xcb_rectangle_t *)rect);
+
+   if (rect) free(rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   num = 0;
+   rects = NULL;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_rectangle_subtract(Ecore_X_Window win,
+                                              int            x,
+                                              int            y,
+                                              int            w,
+                                              int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SUBTRACT,
+                        XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_rectangle_add(Ecore_X_Window win,
+                                         int            x,
+                                         int            y,
+                                         int            w,
+                                         int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
+                        XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_rectangle_set(Ecore_X_Window win,
+                                         int            x,
+                                         int            y,
+                                         int            w,
+                                         int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
+                        XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_window_set_xy(Ecore_X_Window win,
+                                         Ecore_X_Window shape_win,
+                                         int            x,
+                                         int            y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT,
+                     XCB_SHAPE_SK_INPUT, win, x, y, shape_win);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   shape_win = 0;
+   x = 0;
+   y = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_window_add_xy(Ecore_X_Window win,
+                                         Ecore_X_Window shape_win,
+                                         int            x,
+                                         int            y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_INPUT,
+                     XCB_SHAPE_SK_INPUT, win, x, y, shape_win);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   shape_win = 0;
+   x = 0;
+   y = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_window_set(Ecore_X_Window win,
+                                      Ecore_X_Window shape_win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT,
+                     XCB_SHAPE_SK_INPUT, win, 0, 0, shape_win);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   shape_win = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_rectangle_clip(Ecore_X_Window win,
+                                          int            x,
+                                          int            y,
+                                          int            w,
+                                          int            h)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t rect;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_INTERSECT,
+                        XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, 1, &rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   x = 0;
+   y = 0;
+   w = 0;
+   h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_input_rectangles_add(Ecore_X_Window     win,
+                                          Ecore_X_Rectangle *rects,
+                                          int                num)
+{
+#ifdef ECORE_XCB_SHAPE
+   xcb_rectangle_t *rect = NULL;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+#ifdef ECORE_XCB_SHAPE
+   if (num > 0)
+     {
+        int i = 0;
+
+        if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
+          return;
+
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
+     }
+
+   xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
+                        XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
+                        win, 0, 0, num, (xcb_rectangle_t *)&rect);
+
+   if (rect) free(rect);
+//   ecore_x_flush();
+#else
+   return;
+   win = 0;
+   num = 0;
+   rects = NULL;
+#endif
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c b/src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c
new file mode 100644 (file)
index 0000000..e0e5610
--- /dev/null
@@ -0,0 +1,116 @@
+#include "ecore_xcb_private.h"
+#include <fnmatch.h>
+
+/* local function prototypes */
+static Eina_Bool _ecore_xcb_xdefaults_glob_match(const char *str,
+                                                 const char *glob);
+
+/* local variables */
+static Eina_File *_ecore_xcb_xdefaults_file = NULL;
+static char *_ecore_xcb_xdefaults_data = NULL;
+
+void
+_ecore_xcb_xdefaults_init(void)
+{
+   char buff[PATH_MAX];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   snprintf(buff, sizeof(buff), "%s/.Xdefaults", getenv("HOME"));
+   if ((_ecore_xcb_xdefaults_file = eina_file_open(buff, EINA_FALSE)))
+     {
+        eina_mmap_safety_enabled_set(EINA_TRUE);
+
+        _ecore_xcb_xdefaults_data =
+          eina_file_map_all(_ecore_xcb_xdefaults_file, EINA_FILE_SEQUENTIAL);
+     }
+}
+
+void
+_ecore_xcb_xdefaults_shutdown(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!_ecore_xcb_xdefaults_file) return;
+   if (_ecore_xcb_xdefaults_data)
+     eina_file_map_free(_ecore_xcb_xdefaults_file, _ecore_xcb_xdefaults_data);
+   if (_ecore_xcb_xdefaults_file) eina_file_close(_ecore_xcb_xdefaults_file);
+}
+
+char *
+_ecore_xcb_xdefaults_string_get(const char *prog,
+                                const char *param)
+{
+   char buff[1024], ret[1024];
+   char *str = NULL;
+   char **ea = NULL;
+   unsigned int count = 0, i = 0;
+
+   if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
+     return NULL;
+
+   snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
+
+   str = _ecore_xcb_xdefaults_data;
+   ea = eina_str_split_full(str, "\n", -1, &count);
+   for (i = 0; i < count; i++)
+     {
+        if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
+          sscanf(ea[i], "%*[^:]:%*[ ]%s", ret);
+     }
+   if ((ea) && (ea[0]))
+     {
+        free(ea[0]);
+        free(ea);
+     }
+
+   return strdup(ret);
+}
+
+int
+_ecore_xcb_xdefaults_int_get(const char *prog,
+                             const char *param)
+{
+   char buff[1024];
+   char *str = NULL;
+   char **ea = NULL;
+   unsigned int count = 0, i = 0;
+   int ret = -1;
+
+   if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
+     return 0;
+
+   snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
+
+   str = _ecore_xcb_xdefaults_data;
+   ea = eina_str_split_full(str, "\n", -1, &count);
+   for (i = 0; i < count; i++)
+     {
+        if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
+          sscanf(ea[i], "%*[^:]:%*[ ]%d", &ret);
+     }
+   if ((ea) && (ea[0]))
+     {
+        free(ea[0]);
+        free(ea);
+     }
+
+   return ret;
+}
+
+/* local functions */
+static Eina_Bool
+_ecore_xcb_xdefaults_glob_match(const char *str,
+                                const char *glob)
+{
+   if ((!str) || (!glob)) return EINA_FALSE;
+   if (glob[0] == 0)
+     {
+        if (str[0] == 0) return EINA_TRUE;
+        return EINA_FALSE;
+     }
+   if (!strcmp(glob, "*")) return EINA_TRUE;
+   if (!fnmatch(glob, str, 0)) return EINA_TRUE;
+   return EINA_FALSE;
+}
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_xfixes.c b/src/lib/ecore_x/xcb/ecore_xcb_xfixes.c
new file mode 100644 (file)
index 0000000..58444cd
--- /dev/null
@@ -0,0 +1,744 @@
+#include "ecore_xcb_private.h"
+# ifdef ECORE_XCB_XFIXES
+#  include <xcb/xfixes.h>
+# endif
+
+/* local function prototypes */
+static xcb_rectangle_t   *_ecore_xcb_rect_to_xcb(Ecore_X_Rectangle *rects,
+                                                 int                num);
+static Ecore_X_Rectangle *_ecore_xcb_rect_to_ecore(xcb_rectangle_t *rects,
+                                                   int              num);
+
+/* local variables */
+static Eina_Bool _xfixes_avail = EINA_FALSE;
+
+/* external variables */
+int _ecore_xcb_event_xfixes = -1;
+
+void
+_ecore_xcb_xfixes_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_xfixes_id);
+#endif
+}
+
+void
+_ecore_xcb_xfixes_finalize(void)
+{
+#ifdef ECORE_XCB_XFIXES
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XFIXES
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_xfixes_id);
+   if ((ext_reply) && (ext_reply->present))
+     {
+        xcb_xfixes_query_version_cookie_t cookie;
+        xcb_xfixes_query_version_reply_t *reply;
+
+        cookie =
+          xcb_xfixes_query_version_unchecked(_ecore_xcb_conn,
+                                             XCB_XFIXES_MAJOR_VERSION,
+                                             XCB_XFIXES_MINOR_VERSION);
+        reply = xcb_xfixes_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             /* NB: XFixes Extension >= 3 needed for shape stuff.
+              * for now, I am removing this check so that it matches the
+              * xlib code closer. If the extension version ends up being
+              * that important, then re-enable this */
+
+     /* if (reply->major_version >= 3) */
+                _xfixes_avail = EINA_TRUE;
+                free(reply);
+          }
+
+        if (_xfixes_avail)
+          _ecore_xcb_event_xfixes = ext_reply->first_event;
+     }
+#endif
+}
+
+EAPI Eina_Bool
+ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection)
+{
+#ifdef ECORE_XCB_XFIXES
+   Ecore_X_Window root = 0;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *err;
+   int mask = 0;
+#endif
+
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return EINA_FALSE;
+
+#ifdef ECORE_XCB_XFIXES
+   root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   mask = (XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER |
+           XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_WINDOW_DESTROY |
+           XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_CLIENT_CLOSE);
+
+   cookie =
+     xcb_xfixes_select_selection_input_checked(_ecore_xcb_conn, root,
+                                               selection, mask);
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
+     {
+        free(err);
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+#endif
+   return EINA_FALSE;
+}
+
+Eina_Bool
+_ecore_xcb_xfixes_avail_get(void)
+{
+   return _xfixes_avail;
+}
+
+/**
+ * @defgroup Ecore_X_Fixes_Group X Fixes Extension Functions
+ *
+ * Functions related to the X Fixes extension.
+ */
+
+/**
+ * Create a region from rectangles.
+ * @param rects The rectangles used to initialize the region.
+ * @param num   The number of rectangles.
+ * @return      The newly created region.
+ *
+ * Create a region initialized to the specified list of rectangles
+ * @p rects. The rectangles may be specified in any order, their union
+ * becomes the region.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI Ecore_X_Region
+ecore_x_region_new(Ecore_X_Rectangle *rects,
+                   int                num)
+{
+   Ecore_X_Region region = 0;
+#ifdef ECORE_XCB_XFIXES
+   xcb_rectangle_t *xrects;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return 0;
+
+#ifdef ECORE_XCB_XFIXES
+   xrects = _ecore_xcb_rect_to_xcb(rects, num);
+   region = xcb_generate_id(_ecore_xcb_conn);
+   xcb_xfixes_create_region(_ecore_xcb_conn, region, num, xrects);
+   free(xrects);
+//   ecore_x_flush();
+#endif
+
+   return region;
+}
+
+/**
+ * Create a region from a pixmap.
+ * @param bitmap The bitmap used to initialize the region.
+ * @return       The newly created region.
+ *
+ * Creates a region initialized to the set of 'one' pixels in @p bitmap
+ * (which must be of depth 1, else Match error).
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI Ecore_X_Region
+ecore_x_region_new_from_bitmap(Ecore_X_Pixmap bitmap)
+{
+   Ecore_X_Region region = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return 0;
+
+#ifdef ECORE_XCB_XFIXES
+   region = xcb_generate_id(_ecore_xcb_conn);
+   xcb_xfixes_create_region_from_bitmap(_ecore_xcb_conn, region, bitmap);
+//   ecore_x_flush();
+#endif
+
+   return region;
+}
+
+/**
+ * Create a region from a window.
+ * @param win The window used to initialize the region.
+ * @param type   The type of the region.
+ * @return       The newly created region.
+ *
+ * Creates a region initialized to the specified @p window region. See
+ * the Shape extension for the definition of Bounding and Clip
+ * regions.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI Ecore_X_Region
+ecore_x_region_new_from_window(Ecore_X_Window      win,
+                               Ecore_X_Region_Type type)
+{
+   Ecore_X_Region region = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return 0;
+
+#ifdef ECORE_XCB_XFIXES
+   region = xcb_generate_id(_ecore_xcb_conn);
+   xcb_xfixes_create_region_from_window(_ecore_xcb_conn, region, win, type);
+//   ecore_x_flush();
+#endif
+
+   return region;
+}
+
+/**
+ * Create a region from a graphic context.
+ * @param gc The graphic context used to initialize the region.
+ * @return   The newly created region.
+ *
+ * Creates a region initialized from the clip list of @p gc.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI Ecore_X_Region
+ecore_x_region_new_from_gc(Ecore_X_GC gc)
+{
+   Ecore_X_Region region = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return 0;
+
+#ifdef ECORE_XCB_XFIXES
+   region = xcb_generate_id(_ecore_xcb_conn);
+   xcb_xfixes_create_region_from_gc(_ecore_xcb_conn, region, gc);
+//   ecore_x_flush();
+#endif
+
+   return region;
+}
+
+/**
+ * Create a region from a picture.
+ * @param picture The picture used to initialize the region.
+ * @return        The newly created region.
+ *
+ * Creates a region initialized from the clip list of @p picture.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI Ecore_X_Region
+ecore_x_region_new_from_picture(Ecore_X_Picture picture)
+{
+   Ecore_X_Region region = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return 0;
+
+#ifdef ECORE_XCB_XFIXES
+   region = xcb_generate_id(_ecore_xcb_conn);
+   xcb_xfixes_create_region_from_picture(_ecore_xcb_conn, region, picture);
+//   ecore_x_flush();
+#endif
+
+   return region;
+}
+
+/**
+ * Destroy a region.
+ * @param region The region to destroy.
+ *
+ * Destroy the specified @p region.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_free(Ecore_X_Region region)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_destroy_region(_ecore_xcb_conn, region);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Set the content of a region.
+ * @param region The region to destroy.
+ * @param rects  The rectangles used to set the region.
+ * @param num    The number of rectangles.
+ *
+ * Replace the current contents of @p region with the region formed
+ * by the union of the rectangles @p rects.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_set(Ecore_X_Region     region,
+                   Ecore_X_Rectangle *rects,
+                   int                num)
+{
+#ifdef ECORE_XCB_XFIXES
+   xcb_rectangle_t *xrects;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xrects = _ecore_xcb_rect_to_xcb(rects, num);
+   xcb_xfixes_set_region(_ecore_xcb_conn, region, num, xrects);
+   free(xrects);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Copy the content of a region.
+ * @param dest   The destination region.
+ * @param source The source region.
+ *
+ * Replace the contents of @p dest with the contents of @p source.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_copy(Ecore_X_Region dest,
+                    Ecore_X_Region source)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+   // NB: Hmmmm...this may need converting to/fro xcb_rectangle_t
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_copy_region(_ecore_xcb_conn, source, dest);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Make the union of two regions.
+ * @param dest    The destination region.
+ * @param source1 The first source region.
+ * @param source2 The second source region.
+ *
+ * Replace the contents of @p dest with the union of @p source1 and
+ * @p source2.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_combine(Ecore_X_Region dest,
+                       Ecore_X_Region source1,
+                       Ecore_X_Region source2)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_union_region(_ecore_xcb_conn, source1, source2, dest);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Make the intersection of two regions.
+ * @param dest    The destination region.
+ * @param source1 The first source region.
+ * @param source2 The second source region.
+ *
+ * Replace the contents of @p dest with the intersection of @p source1 and
+ * @p source2.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_intersect(Ecore_X_Region dest,
+                         Ecore_X_Region source1,
+                         Ecore_X_Region source2)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_intersect_region(_ecore_xcb_conn, source1, source2, dest);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Make the subtraction of two regions.
+ * @param dest    The destination region.
+ * @param source1 The first source region.
+ * @param source2 The second source region.
+ *
+ * Replace the contents of @p dest with the subtraction of @p source1 by
+ * @p source2.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_subtract(Ecore_X_Region dest,
+                        Ecore_X_Region source1,
+                        Ecore_X_Region source2)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_subtract_region(_ecore_xcb_conn, source1, source2, dest);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Make the subtraction of regions by bounds.
+ * @param dest   The destination region.
+ * @param bounds The bounds.
+ * @param source The source region.
+ *
+ * The @p source region is subtracted from the region specified by
+ * @p bounds.  The result is placed in @p dest, replacing its
+ * contents.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_invert(Ecore_X_Region     dest,
+                      Ecore_X_Rectangle *bounds,
+                      Ecore_X_Region     source)
+{
+#ifdef ECORE_XCB_XFIXES
+   xcb_rectangle_t xrects;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xrects.x = bounds->x;
+   xrects.y = bounds->y;
+   xrects.width = bounds->width;
+   xrects.height = bounds->height;
+
+   xcb_xfixes_invert_region(_ecore_xcb_conn, source, xrects, dest);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Translate a region.
+ * @param region The region to translate.
+ * @param dx     The horizontal translation.
+ * @param dy     The vertical translation.
+ *
+ * The @p region is translated by @p dx and @p dy in place.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_translate(Ecore_X_Region region,
+                         int            dx,
+                         int            dy)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_translate_region(_ecore_xcb_conn, region, dx, dy);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Extent a region.
+ * @param dest   The destination region.
+ * @param source The source region.
+ *
+ * The extents of the @p source region are placed in @p dest.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_extents(Ecore_X_Region dest,
+                       Ecore_X_Region source)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_region_extents(_ecore_xcb_conn, source, dest);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Return the rectangles that compose a region.
+ * @param  region The region (Unused).
+ * @param  num    The number of returned rectangles.
+ * @param  bounds The returned bounds of the region.
+ * @return        The returned rectangles.
+ *
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI Ecore_X_Rectangle *
+ecore_x_region_fetch(Ecore_X_Region     region,
+                     int               *num,
+                     Ecore_X_Rectangle *bounds)
+{
+   Ecore_X_Rectangle extents = { 0, 0, 0, 0 };
+   Ecore_X_Rectangle *rects = NULL;
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_fetch_region_cookie_t cookie;
+   xcb_xfixes_fetch_region_reply_t *reply;
+   xcb_rectangle_t *r;
+   int n = 0;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (num) *num = 0;
+   if (bounds) *bounds = extents;
+   if (!_xfixes_avail) return NULL;
+
+#ifdef ECORE_XCB_XFIXES
+   cookie = xcb_xfixes_fetch_region_unchecked(_ecore_xcb_conn, region);
+   reply = xcb_xfixes_fetch_region_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return NULL;
+
+   r = xcb_xfixes_fetch_region_rectangles(reply);
+   n = xcb_xfixes_fetch_region_rectangles_length(reply);
+   rects = _ecore_xcb_rect_to_ecore(r, n);
+   if (num) *num = n;
+
+   /* rects = (Ecore_X_Rectangle *)malloc(n * sizeof(Ecore_X_Rectangle)); */
+   /* if (!rects)  */
+   /*   { */
+   /*      free(reply); */
+   /*      return NULL; */
+   /*   } */
+
+   /* for (i = 0; i < n; i++)  */
+   /*   { */
+   /*      rects[i].x = r[i].x; */
+   /*      rects[i].y = r[i].y; */
+   /*      rects[i].width = r[i].width; */
+   /*      rects[i].height = r[i].height; */
+   /*   } */
+
+   (*bounds).x = reply->extents.x;
+   (*bounds).y = reply->extents.y;
+   (*bounds).width = reply->extents.width;
+   (*bounds).height = reply->extents.height;
+
+   free(reply);
+#endif
+
+   return rects;
+}
+
+/**
+ * Expand a region.
+ * @param dest   The destination region.
+ * @param source The source region.
+ * @param left   The number of pixels to add on the left.
+ * @param right  The number of pixels to add on the right.
+ * @param top    The number of pixels to add at the top.
+ * @param bottom The number of pixels to add at the bottom.
+ *
+ * Put in @p dest the area specified by expanding each rectangle in
+ * the @p source  region by the specified number of pixels to the
+ * @p left, @p right, @p top and @p bottom.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_expand(Ecore_X_Region dest,
+                      Ecore_X_Region source,
+                      unsigned int   left,
+                      unsigned int   right,
+                      unsigned int   top,
+                      unsigned int   bottom)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_expand_region(_ecore_xcb_conn, source, dest, left, right, top, bottom);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Change clip-mask in a graphic context to the specified region.
+ * @param region   The region to change.
+ * @param gc       The clip-mask graphic context.
+ * @param x The horizontal translation.
+ * @param y The vertical translation.
+ *
+ * Changes clip-mask in @p gc to the specified @p region and
+ * sets the clip origin with the values of @p x_origin and @p y_origin.
+ * Output will be clippped to remain contained within the region. The
+ * clip origin is interpreted relative to the origin of whatever
+ * destination drawable is specified in a graphics request. The
+ * region is interpreted relative to the clip origin. Future changes
+ * to region have no effect on the gc clip-mask.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_gc_clip_set(Ecore_X_Region region,
+                           Ecore_X_GC     gc,
+                           int            x,
+                           int            y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_set_gc_clip_region(_ecore_xcb_conn, gc, region, x, y);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Change the shape extension of a window.
+ * @param region   The region.
+ * @param dest     The window whose shape is changed.
+ * @param type     The kind of shape.
+ * @param x The horizontal offset.
+ * @param y The vertical offset.
+ *
+ * Set the specified Shape extension region of @p window to @p region,
+ * offset by @p x_offset and @p y_offset. Future changes to region
+ * have no effect on the window shape.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_window_shape_set(Ecore_X_Region     region,
+                                Ecore_X_Window     dest,
+                                Ecore_X_Shape_Type type,
+                                int                x,
+                                int                y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_set_window_shape_region(_ecore_xcb_conn, dest, type, x, y, region);
+//   ecore_x_flush();
+#endif
+}
+
+/**
+ * Change clip-mask in picture to the specified region.
+ * @param region   The region.
+ * @param picture  The picture.
+ * @param x The X coordinate of the origin.
+ * @param y The Y coordinate of the origin.
+ *
+ * Changes clip-mask in picture to the specified @p region
+ * and sets the clip origin.  Input and output will be clipped to
+ * remain contained within the region.  The clip origin is interpreted
+ * relative to the origin of the drawable associated with @p picture.  The
+ * region is interpreted relative to the clip origin.  Future changes
+ * to region have no effect on the picture clip-mask.
+ * @ingroup Ecore_X_Fixes_Group
+ */
+EAPI void
+ecore_x_region_picture_clip_set(Ecore_X_Region  region,
+                                Ecore_X_Picture picture,
+                                int             x,
+                                int             y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_xfixes_avail) return;
+
+#ifdef ECORE_XCB_XFIXES
+   xcb_xfixes_set_picture_clip_region(_ecore_xcb_conn, picture, region, x, y);
+//   ecore_x_flush();
+#endif
+}
+
+/* local function prototypes */
+static xcb_rectangle_t *
+_ecore_xcb_rect_to_xcb(Ecore_X_Rectangle *rects,
+                       int                num)
+{
+   xcb_rectangle_t *xrect;
+   int i = 0;
+
+   if (!num) return NULL;
+
+   xrect = malloc(sizeof(xcb_rectangle_t) * num);
+   if (!xrect) return NULL;
+
+   for (i = 0; i < num; i++)
+     {
+        xrect[i].x = rects[i].x;
+        xrect[i].y = rects[i].y;
+        xrect[i].width = rects[i].width;
+        xrect[i].height = rects[i].height;
+     }
+
+   return xrect;
+}
+
+static Ecore_X_Rectangle *
+_ecore_xcb_rect_to_ecore(xcb_rectangle_t *rects,
+                         int              num)
+{
+   Ecore_X_Rectangle *erect;
+   int i = 0;
+
+   if (!num) return NULL;
+
+   erect = malloc(sizeof(Ecore_X_Rectangle) * num);
+   if (!erect) return NULL;
+
+   for (i = 0; i < num; i++)
+     {
+        erect[i].x = rects[i].x;
+        erect[i].y = rects[i].y;
+        erect[i].width = rects[i].width;
+        erect[i].height = rects[i].height;
+     }
+
+   return erect;
+}
+
index 52aaf96..37a2339 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-
 #include "ecore_xcb_private.h"
-
-
-/**
- * @defgroup Ecore_X_Xinerama_Group X Xinerama Extension Functions
- *
- * Functions related to the X Xinerama extension.
- */
-
-
 #ifdef ECORE_XCB_XINERAMA
-static int _xinerama_available = 0;
-static xcb_xinerama_query_version_cookie_t _ecore_xcb_xinerama_init_cookie;
-#endif /* ECORE_XCB_XINERAMA */
-
+# include <xcb/xinerama.h>
+#endif
 
-/* To avoid round trips, the initialization is separated in 2
-   functions: _ecore_xcb_xinerama_init and
-   _ecore_xcb_xinerama_init_finalize. The first one gets the cookies and
-   the second one gets the replies. */
+/* local variables */
+static Eina_Bool _xinerama_avail = EINA_FALSE;
+static Eina_Bool _xinerama_active = EINA_FALSE;
 
 void
-_ecore_x_xinerama_init(const xcb_query_extension_reply_t *reply)
+_ecore_xcb_xinerama_init(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
 #ifdef ECORE_XCB_XINERAMA
-   if (reply && (reply->present))
-      _ecore_xcb_xinerama_init_cookie = xcb_xinerama_query_version_unchecked(_ecore_xcb_conn, 1, 2);
-#endif /* ECORE_XCB_XINERAMA */
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_xinerama_id);
+#endif
 }
 
 void
-_ecore_x_xinerama_init_finalize(void)
+_ecore_xcb_xinerama_finalize(void)
 {
 #ifdef ECORE_XCB_XINERAMA
-   xcb_xinerama_query_version_reply_t *reply;
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
 
-   reply = xcb_xinerama_query_version_reply(_ecore_xcb_conn,
-                                          _ecore_xcb_xinerama_init_cookie, NULL);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (reply)
+#ifdef ECORE_XCB_XINERAMA
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_xinerama_id);
+   if ((ext_reply) && (ext_reply->present))
      {
-        if ((reply->major >= 1) &&
-            (reply->minor >= 1))
-          _xinerama_available = 1;
-        free(reply);
+        xcb_xinerama_query_version_cookie_t cookie;
+        xcb_xinerama_query_version_reply_t *reply;
+
+        cookie =
+          xcb_xinerama_query_version_unchecked(_ecore_xcb_conn,
+                                               XCB_XINERAMA_MAJOR_VERSION,
+                                               XCB_XINERAMA_MINOR_VERSION);
+        reply =
+          xcb_xinerama_query_version_reply(_ecore_xcb_conn, cookie, NULL);
+        if (reply)
+          {
+             _xinerama_avail = EINA_TRUE;
+             // NB: Do we need to compare version numbers here ?
+             free(reply);
+          }
+
+        if (_xinerama_avail)
+          {
+             xcb_xinerama_is_active_cookie_t acookie;
+             xcb_xinerama_is_active_reply_t *areply;
+
+             acookie = xcb_xinerama_is_active_unchecked(_ecore_xcb_conn);
+             areply =
+               xcb_xinerama_is_active_reply(_ecore_xcb_conn, acookie, NULL);
+             if (areply)
+               {
+                  _xinerama_active = areply->state;
+                  free(areply);
+               }
+          }
      }
-#endif /* ECORE_XCB_XINERAMA */
+#endif
 }
 
-
-/**
- * Return whether the X server supports the Xinerama Extension.
- * @return 1 if the X Xinerama Extension is available, 0 otherwise.
- *
- * Return 1 if the X server supports the Fixes Xinerama version 1.1,
- * 0 otherwise.
- * @ingroup Ecore_X_Xinerama_Group
- */
 EAPI int
-ecore_x_xinerama_query(void)
-{
-#ifdef ECORE_XCB_XINERAMA
-   return _xinerama_available;
-#else
-   return 0;
-#endif /* ECORE_XCB_XINERAMA */
-}
-
-
-/**
- * Sends the XineramaQueryScreens request.
- * @ingroup Ecore_X_Xinerama_Group
- */
-EAPI void
-ecore_x_xinerama_query_screens_prefetch(void)
-{
-#ifdef ECORE_XCB_XINERAMA
-   xcb_xinerama_query_screens_cookie_t cookie;
-
-   cookie = xcb_xinerama_query_screens_unchecked(_ecore_xcb_conn);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-#endif /* ECORE_XCB_XINERAMA */
-}
-
-
-/**
- * Gets the reply of the XineramaQueryScreens request sent by ecore_x_xinerama_query_screens_prefetch().
- * @ingroup Ecore_X_Xinerama_Group
- */
-EAPI void
-ecore_x_xinerama_query_screens_fetch(void)
+ecore_x_xinerama_screen_count_get(void)
 {
+   int count = 0;
 #ifdef ECORE_XCB_XINERAMA
    xcb_xinerama_query_screens_cookie_t cookie;
    xcb_xinerama_query_screens_reply_t *reply;
+#endif
 
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_xinerama_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-#endif /* ECORE_XCB_XINERAMA */
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
+   if (!_xinerama_avail) return 0;
 
-/**
- * Return the number of screens.
- * @return The screen count.
- *
- * Return the number of screens.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_xinerama_query_screens_prefetch(), which sends the XineramaQueryScreens request,
- * then ecore_x_xinerama_query_screens_fetch(), which gets the reply.
- * @ingroup Ecore_X_Xinerama_Group
- */
-EAPI int
-ecore_x_xinerama_screen_count_get(void)
-{
-   int                                 screen_count = 0;
 #ifdef ECORE_XCB_XINERAMA
-   xcb_xinerama_screen_info_iterator_t iter;
-   xcb_xinerama_query_screens_reply_t *reply;
-
-   reply = _ecore_xcb_reply_get();
+   cookie = xcb_xinerama_query_screens_unchecked(_ecore_xcb_conn);
+   reply =
+     xcb_xinerama_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
    if (!reply) return 0;
+   count = reply->number;
+#endif
 
-   iter = xcb_xinerama_query_screens_screen_info_iterator(reply);
-   screen_count = iter.rem;
-#endif /* ECORE_XCB_XINERAMA */
-
-   return screen_count;
+   return count;
 }
 
-
-/**
- * Get the geometry of the screen.
- * @param screen The screen (Unused).
- * @param x      The X coordinate of the screen.
- * @param y      The Y coordinate of the screen
- * @param width  The width of the screen
- * @param height The height of the screen
- * @return       1 on success, 0 otherwise.
- *
- * Get the geometry of the screen whose number is @p screen. The
- * returned values are stored in @p x, @p y, @p width and @p height.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_xinerama_query_screens_prefetch(), which sends the XineramaQueryScreens request,
- * then ecore_x_xinerama_query_screens_fetch(), which gets the reply.
- * @ingroup Ecore_X_Xinerama_Group
- */
-EAPI int
+EAPI Eina_Bool
 ecore_x_xinerama_screen_geometry_get(int  screen,
                                      int *x,
                                      int *y,
-                                     int *width,
-                                     int *height)
+                                     int *w,
+                                     int *h)
 {
 #ifdef ECORE_XCB_XINERAMA
-   xcb_xinerama_screen_info_iterator_t iter;
+   xcb_xinerama_query_screens_cookie_t cookie;
    xcb_xinerama_query_screens_reply_t *reply;
+   xcb_xinerama_screen_info_t *info;
+#endif
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply)
-     {
-        if (x) *x = 0;
-        if (y) *y = 0;
-        if (width) *width = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
-        if (height) *height = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
-        return 0;
-     }
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
+   if (h) *h = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
 
-   iter = xcb_xinerama_query_screens_screen_info_iterator(reply);
-   for (; iter.rem; screen--, xcb_xinerama_screen_info_next(&iter))
+   if (!_xinerama_avail) return EINA_FALSE;
+
+#ifdef ECORE_XCB_XINERAMA
+   cookie = xcb_xinerama_query_screens_unchecked(_ecore_xcb_conn);
+   reply =
+     xcb_xinerama_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
+   if (!reply) return EINA_FALSE;
+
+   info = xcb_xinerama_query_screens_screen_info(reply);
+   if (!info)
      {
-        if (screen == 0)
-          {
-             if (x) *x = iter.data->x_org;
-             if (y) *y = iter.data->y_org;
-             if (width) *width = iter.data->width;
-             if (height) *height = iter.data->height;
-             return 1;
-          }
+        free(reply);
+        return EINA_FALSE;
      }
-#endif /* ECORE_XCB_XINERAMA */
 
-   if (x) *x = 0;
-   if (y) *y = 0;
-   if (width) *width = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
-   if (height) *height = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
+   if (x) *x = info[screen].x_org;
+   if (y) *y = info[screen].y_org;
+   if (w) *w = info[screen].width;
+   if (h) *h = info[screen].height;
+
+   free(reply);
+   return EINA_TRUE;
+#endif
 
-   return 0;
+   return EINA_FALSE;
 }
+
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_xtest.c b/src/lib/ecore_x/xcb/ecore_xcb_xtest.c
new file mode 100644 (file)
index 0000000..b664dc9
--- /dev/null
@@ -0,0 +1,215 @@
+#include "ecore_xcb_private.h"
+#ifdef ECORE_XCB_XTEST
+# include <xcb/xtest.h>
+# include <X11/keysym.h>
+#endif
+
+/* local variables */
+static Eina_Bool _test_avail = EINA_FALSE;
+
+void
+_ecore_xcb_xtest_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XTEST
+   xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_test_id);
+#endif
+}
+
+void
+_ecore_xcb_xtest_finalize(void)
+{
+#ifdef ECORE_XCB_XTEST
+   const xcb_query_extension_reply_t *ext_reply;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+#ifdef ECORE_XCB_XTEST
+   ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_test_id);
+   if ((ext_reply) && (ext_reply->present))
+     _test_avail = EINA_TRUE;
+#endif
+}
+
+EAPI Eina_Bool
+#ifdef ECORE_XCB_XTEST
+ecore_x_test_fake_key_down(const char *key)
+#else
+ecore_x_test_fake_key_down(const char *key __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_XTEST
+   xcb_keycode_t keycode = 0;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *err;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_test_avail) return EINA_FALSE;
+
+#ifdef ECORE_XCB_XTEST
+   keycode = _ecore_xcb_keymap_string_to_keycode(key);
+   if (keycode == XCB_NO_SYMBOL) return EINA_FALSE;
+
+   cookie =
+     xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_PRESS,
+                         keycode, XCB_CURRENT_TIME,
+                         ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
+     {
+        free(err);
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+#endif
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+#ifdef ECORE_XCB_XTEST
+ecore_x_test_fake_key_up(const char *key)
+#else
+ecore_x_test_fake_key_up(const char *key __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_XTEST
+   xcb_keycode_t keycode = 0;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *err;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_test_avail) return EINA_FALSE;
+
+#ifdef ECORE_XCB_XTEST
+   keycode = _ecore_xcb_keymap_string_to_keycode(key);
+   if (keycode == XCB_NO_SYMBOL) return EINA_FALSE;
+
+   cookie =
+     xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_RELEASE,
+                         keycode, XCB_CURRENT_TIME,
+                         ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
+     {
+        free(err);
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+#endif
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+#ifdef ECORE_XCB_XTEST
+ecore_x_test_fake_key_press(const char *key)
+#else
+ecore_x_test_fake_key_press(const char *key __UNUSED__)
+#endif
+{
+#ifdef ECORE_XCB_XTEST
+   xcb_keycode_t keycode = 0;
+   xcb_keysym_t keysym = 0;
+   xcb_keycode_t shift_code = 0;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *err;
+   Eina_Bool shift = EINA_FALSE;
+#endif
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!_test_avail) return EINA_FALSE;
+
+#ifdef ECORE_XCB_XTEST
+   keycode = _ecore_xcb_keymap_string_to_keycode(key);
+   keysym = _ecore_xcb_keymap_keycode_to_keysym(keycode, 0);
+   if (keysym == XCB_NO_SYMBOL)
+     {
+        keysym = _ecore_xcb_keymap_keycode_to_keysym(keycode, 1);
+        if (keysym != XCB_NO_SYMBOL)
+          shift = EINA_TRUE;
+     }
+
+   if (shift)
+     {
+        xcb_keycode_t *keycodes;
+        int i = 0;
+
+        keycodes = _ecore_xcb_keymap_keysym_to_keycode(XK_Shift_L);
+        while (keycodes[i] != XCB_NO_SYMBOL)
+          {
+             if (keycodes[i] != 0)
+               {
+                  shift_code = keycodes[i];
+                  break;
+               }
+             i++;
+          }
+     }
+
+   if (shift)
+     {
+        cookie =
+          xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_PRESS,
+                              shift_code, XCB_CURRENT_TIME,
+                              ((xcb_screen_t *)_ecore_xcb_screen)->root,
+                              0, 0, 0);
+        err = xcb_request_check(_ecore_xcb_conn, cookie);
+        if (err)
+          {
+             free(err);
+             return EINA_FALSE;
+          }
+     }
+
+   cookie =
+     xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_PRESS,
+                         keycode, XCB_CURRENT_TIME,
+                         ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
+     {
+        free(err);
+        return EINA_FALSE;
+     }
+   cookie =
+     xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_RELEASE,
+                         keycode, XCB_CURRENT_TIME,
+                         ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
+   err = xcb_request_check(_ecore_xcb_conn, cookie);
+   if (err)
+     {
+        free(err);
+        return EINA_FALSE;
+     }
+
+   if (shift)
+     {
+        cookie =
+          xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_RELEASE,
+                              shift_code, XCB_CURRENT_TIME,
+                              ((xcb_screen_t *)_ecore_xcb_screen)->root,
+                              0, 0, 0);
+        err = xcb_request_check(_ecore_xcb_conn, cookie);
+        if (err)
+          {
+             free(err);
+             return EINA_FALSE;
+          }
+     }
+
+   return EINA_TRUE;
+#endif
+
+   return EINA_FALSE;
+}
index 4cb9f8b..3c7364c 100644 (file)
@@ -5,10 +5,13 @@ if BUILD_ECORE_X_XLIB
 
 AM_CPPFLAGS = \
 @Xcursor_cflags@ \
+@XKB_CFLAGS@ \
 @XDAMAGE_CFLAGS@ \
 @XCOMPOSITE_CFLAGS@ \
+@XGESTURE_CFLAGS@ \
 @XDPMS_CFLAGS@ \
 @XFIXES_CFLAGS@ \
+@XI2_CFLAGS@ \
 @XINERAMA_CFLAGS@ \
 @XPRINT_CFLAGS@ \
 @XRANDR_CFLAGS@ \
@@ -17,19 +20,25 @@ AM_CPPFLAGS = \
 @XTEST_CFLAGS@ \
 @x_cflags@ \
 -I$(top_srcdir)/src/lib/ecore \
--I$(top_srcdir)/src/lib/ecore_txt \
 -I$(top_srcdir)/src/lib/ecore_x \
+-I$(top_srcdir)/src/lib/ecore_input \
 -I$(top_builddir)/src/lib/ecore \
--I$(top_builddir)/src/lib/ecore_txt \
--I$(top_builddir)/src/lib/ecore_x
+-I$(top_builddir)/src/lib/ecore_x \
+-I$(top_builddir)/src/lib/ecore_input \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
 
-noinst_LTLIBRARIES      = libecore_x_xlib.la
+noinst_LTLIBRARIES = libecore_x_xlib.la
 
-libecore_x_xlib_la_SOURCES  = \
+libecore_x_xlib_la_SOURCES = \
 ecore_x.c \
 ecore_x_dnd.c \
 ecore_x_sync.c \
 ecore_x_randr.c \
+ecore_x_randr_11.c \
+ecore_x_randr_12.c \
+ecore_x_randr_12_edid.c \
+ecore_x_randr_13.c \
 ecore_x_fixes.c \
 ecore_x_damage.c \
 ecore_x_composite.c \
@@ -51,14 +60,23 @@ ecore_x_dpms.c \
 ecore_x_drawable.c \
 ecore_x_cursor.c \
 ecore_x_test.c \
-ecore_x_atoms.c
+ecore_x_atoms.c \
+ecore_x_region.c \
+ecore_x_image.c \
+ecore_x_xi2.c \
+ecore_x_vsync.c \
+ecore_x_randr.h \
+ecore_x_gesture.c
 
 libecore_x_xlib_la_LIBADD = \
 @Xcursor_libs@ \
+@XKB_LIBS@ \
 @XDAMAGE_LIBS@ \
 @XCOMPOSITE_LIBS@ \
+@XGESTURE_LIBS@ \
 @XDPMS_LIBS@ \
 @XFIXES_LIBS@ \
+@XI2_LIBS@ \
 @XINERAMA_LIBS@ \
 @XPRINT_LIBS@ \
 @XRANDR_LIBS@ \
@@ -67,13 +85,9 @@ libecore_x_xlib_la_LIBADD = \
 @XTEST_LIBS@ \
 @x_libs@ \
 $(top_builddir)/src/lib/ecore/libecore.la \
-$(top_builddir)/src/lib/ecore_txt/libecore_txt.la
-
-libecore_x_xlib_la_LDFLAGS = -version-info @version_info@
-
-libecore_x_xlib_la_DEPENDENCIES = \
-$(top_builddir)/src/lib/ecore/libecore.la \
-$(top_builddir)/src/lib/ecore_txt/libecore_txt.la
+$(top_builddir)/src/lib/ecore_input/libecore_input.la \
+@EINA_LIBS@ \
+@dlopen_libs@
 
 endif
 
index 9be563f..7cb777d 100644 (file)
@@ -1,29 +1,58 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+//#define LOGRT 1
+
+#ifdef LOGRT
+#include <dlfcn.h>
+#endif /* ifdef LOGRT */
+
 #include "Ecore.h"
+#include "ecore_private.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include "Ecore_X_Atoms.h"
+#include "Ecore_Input.h"
 
-static int _ecore_x_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_x_fd_handler_buf(void *data, Ecore_Fd_Handler *fd_handler);
-static int _ecore_x_key_mask_get(KeySym sym);
+static Eina_Bool _ecore_x_fd_handler(void *data,
+                                     Ecore_Fd_Handler *fd_handler);
+static Eina_Bool _ecore_x_fd_handler_buf(void *data,
+                                         Ecore_Fd_Handler *fd_handler);
+static int       _ecore_x_key_mask_get(KeySym sym);
+static int       _ecore_x_event_modifier(unsigned int state);
 
 static Ecore_Fd_Handler *_ecore_x_fd_handler_handle = NULL;
+
+static const int AnyXEvent = 0; /* 0 can be used as there are no event types
+                                 * with index 0 and 1 as they are used for
+                                 * errors
+                                 */
+
 static int _ecore_x_event_shape_id = 0;
 static int _ecore_x_event_screensaver_id = 0;
 static int _ecore_x_event_sync_id = 0;
+int _ecore_xlib_log_dom = -1;
+
 #ifdef ECORE_XRANDR
 static int _ecore_x_event_randr_id = 0;
-#endif
+#endif /* ifdef ECORE_XRANDR */
 #ifdef ECORE_XFIXES
 static int _ecore_x_event_fixes_selection_id = 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 #ifdef ECORE_XDAMAGE
 static int _ecore_x_event_damage_id = 0;
-#endif
+#endif /* ifdef ECORE_XDAMAGE */
+#ifdef ECORE_XGESTURE
+static int _ecore_x_event_gesture_id = 0;
+#endif /* ifdef ECORE_XGESTURE */
+#ifdef ECORE_XKB
+static int _ecore_x_event_xkb_id = 0;
+#endif /* ifdef ECORE_XKB */
 static int _ecore_x_event_handlers_num = 0;
 static void (**_ecore_x_event_handlers) (XEvent * event) = NULL;
 
@@ -31,25 +60,20 @@ static int _ecore_x_init_count = 0;
 static int _ecore_x_grab_count = 0;
 
 Display *_ecore_x_disp = NULL;
-double   _ecore_x_double_click_time = 0.25;
-Time     _ecore_x_event_last_time = 0;
-Window   _ecore_x_event_last_win = 0;
-int      _ecore_x_event_last_root_x = 0;
-int      _ecore_x_event_last_root_y = 0;
-int      _ecore_x_xcursor = 0;
+double _ecore_x_double_click_time = 0.25;
+Time _ecore_x_event_last_time = 0;
+Window _ecore_x_event_last_win = 0;
+int _ecore_x_event_last_root_x = 0;
+int _ecore_x_event_last_root_y = 0;
+Eina_Bool _ecore_x_xcursor = EINA_FALSE;
 
 Ecore_X_Window _ecore_x_private_win = 0;
 
 Ecore_X_Atom _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM];
 
-EAPI int ECORE_X_EVENT_KEY_DOWN = 0;
-EAPI int ECORE_X_EVENT_KEY_UP = 0;
-EAPI int ECORE_X_EVENT_MOUSE_BUTTON_DOWN = 0;
-EAPI int ECORE_X_EVENT_MOUSE_BUTTON_UP = 0;
-EAPI int ECORE_X_EVENT_MOUSE_MOVE = 0;
+EAPI int ECORE_X_EVENT_ANY = 0;
 EAPI int ECORE_X_EVENT_MOUSE_IN = 0;
 EAPI int ECORE_X_EVENT_MOUSE_OUT = 0;
-EAPI int ECORE_X_EVENT_MOUSE_WHEEL = 0;
 EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0;
 EAPI int ECORE_X_EVENT_WINDOW_FOCUS_OUT = 0;
 EAPI int ECORE_X_EVENT_WINDOW_KEYMAP = 0;
@@ -70,29 +94,29 @@ EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0;
 EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0;
 EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0;
 EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0;
+EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0;
 EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
 EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
 EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = 0;
 EAPI int ECORE_X_EVENT_CLIENT_MESSAGE = 0;
 EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
 EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PAN;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAP;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD;
+EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP;
 EAPI int ECORE_X_EVENT_SYNC_COUNTER = 0;
 EAPI int ECORE_X_EVENT_SYNC_ALARM = 0;
 EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0;
 EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY = 0;
-
+EAPI int ECORE_X_EVENT_RANDR_CRTC_CHANGE = 0;
+EAPI int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = 0;
+EAPI int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = 0;
 EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0;
-/*
-EAPI int ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE = 0;
-EAPI int ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE = 0;
-*/
-
 EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0;
 EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0;
 EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = 0;
@@ -103,14 +127,146 @@ EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = 0;
 EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = 0;
 EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = 0;
 
+EAPI int ECORE_X_EVENT_XKB_STATE_NOTIFY = 0;
+EAPI int ECORE_X_EVENT_XKB_NEWKBD_NOTIFY = 0;
+
+
+EAPI int ECORE_X_EVENT_GENERIC = 0;
+
 EAPI int ECORE_X_MODIFIER_SHIFT = 0;
 EAPI int ECORE_X_MODIFIER_CTRL = 0;
 EAPI int ECORE_X_MODIFIER_ALT = 0;
 EAPI int ECORE_X_MODIFIER_WIN = 0;
+EAPI int ECORE_X_MODIFIER_ALTGR = 0;
 
 EAPI int ECORE_X_LOCK_SCROLL = 0;
 EAPI int ECORE_X_LOCK_NUM = 0;
 EAPI int ECORE_X_LOCK_CAPS = 0;
+EAPI int ECORE_X_LOCK_SHIFT = 0;
+
+EAPI int ECORE_X_RAW_BUTTON_PRESS = 0;
+EAPI int ECORE_X_RAW_BUTTON_RELEASE = 0;
+EAPI int ECORE_X_RAW_MOTION = 0;
+
+#ifdef LOGRT
+static double t0 = 0.0;
+static Status (*_logrt_real_reply)(Display *disp,
+                                   void *rep,
+                                   int extra,
+                                   Bool discard) = NULL;
+static void
+_logrt_init(void)
+{
+   void *lib;
+
+   lib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY);
+   if (!lib)
+     lib = dlopen("libX11.so.6", RTLD_GLOBAL | RTLD_LAZY);
+
+   if (!lib)
+     lib = dlopen("libX11.so.6.3", RTLD_GLOBAL | RTLD_LAZY);
+
+   if (!lib)
+     lib = dlopen("libX11.so.6.3.0", RTLD_GLOBAL | RTLD_LAZY);
+
+   _logrt_real_reply = dlsym(lib, "_XReply");
+   t0 = ecore_time_get();
+}
+
+Status
+_XReply(Display *disp,
+        void *rep,
+        int extra,
+        Bool discard)
+{
+   void *bt[128];
+   int i, n;
+   char **sym;
+
+   n = backtrace(bt, 128);
+   if (n > 0)
+     {
+        sym = backtrace_symbols(bt, n);
+        printf("ROUNDTRIP: %4.4f :", ecore_time_get() - t0);
+        if (sym)
+          {
+             for (i = n - 1; i > 0; i--)
+               {
+                  char *fname = strchr(sym[i], '(');
+                  if (fname)
+                    {
+                       char *tsym = alloca(strlen(fname) + 1);
+                       char *end;
+                       strcpy(tsym, fname + 1);
+                       end = strchr(tsym, '+');
+                       if (end)
+                         {
+                            *end = 0;
+                            printf("%s", tsym);
+                         }
+                       else
+                         printf("???");
+                    }
+                  else
+                    printf("???");
+
+                  if (i > 1)
+                    printf(" > ");
+               }
+             printf("\n");
+          }
+     }
+
+   // fixme: logme
+   return _logrt_real_reply(disp, rep, extra, discard);
+}
+
+#endif /* ifdef LOGRT */
+
+/* wrapper to use XkbKeycodeToKeysym when possible */
+KeySym
+_ecore_x_XKeycodeToKeysym(Display *display, KeyCode keycode, int idx)
+{
+#ifdef ECORE_XKB
+   return XkbKeycodeToKeysym(display, keycode, 0, idx);
+#else
+   return XKeycodeToKeysym(display, keycode, idx);
+#endif
+}
+
+void
+_ecore_x_modifiers_get(void)
+{
+   /* everything has these... unless its like a pda... :) */
+   ECORE_X_MODIFIER_SHIFT = _ecore_x_key_mask_get(XK_Shift_L);
+   ECORE_X_MODIFIER_CTRL = _ecore_x_key_mask_get(XK_Control_L);
+
+   /* apple's xdarwin has no alt!!!! */
+   ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Alt_L);
+   if (!ECORE_X_MODIFIER_ALT)
+     ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Meta_L);
+
+   if (!ECORE_X_MODIFIER_ALT)
+     ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Super_L);
+
+   /* the windows key... a valid modifier :) */
+   ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Super_L);
+   if (!ECORE_X_MODIFIER_WIN)
+     ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Meta_L);
+
+   ECORE_X_MODIFIER_ALTGR = _ecore_x_key_mask_get(XK_Mode_switch);
+
+   if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
+     ECORE_X_MODIFIER_WIN = 0;
+
+   if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL)
+     ECORE_X_MODIFIER_ALT = 0;
+
+   ECORE_X_LOCK_SCROLL = _ecore_x_key_mask_get(XK_Scroll_Lock);
+   ECORE_X_LOCK_NUM = _ecore_x_key_mask_get(XK_Num_Lock);
+   ECORE_X_LOCK_CAPS = _ecore_x_key_mask_get(XK_Caps_Lock);
+   ECORE_X_LOCK_SHIFT = _ecore_x_key_mask_get(XK_Shift_Lock);
+}
 
 /**
  * @defgroup Ecore_X_Init_Group X Library Init and Shutdown Functions
@@ -135,248 +291,346 @@ ecore_x_init(const char *name)
 #ifdef ECORE_XSS
    int screensaver_base = 0;
    int screensaver_err_base = 0;
-#endif
+#endif /* ifdef ECORE_XSS */
    int sync_base = 0;
    int sync_err_base = 0;
 #ifdef ECORE_XRANDR
    int randr_base = 0;
    int randr_err_base = 0;
-#endif
+#endif /* ifdef ECORE_XRANDR */
 #ifdef ECORE_XFIXES
    int fixes_base = 0;
    int fixes_err_base = 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 #ifdef ECORE_XDAMAGE
    int damage_base = 0;
    int damage_err_base = 0;
-#endif
-   
-   if (_ecore_x_init_count > 0) 
+#endif /* ifdef ECORE_XDAMAGE */
+#ifdef ECORE_XGESTURE
+   int gesture_base = 0;
+   int gesture_err_base = 0;
+#endif /* ifdef ECORE_XGESTURE */
+#ifdef ECORE_XKB
+   int xkb_base = 0;
+#endif /* ifdef ECORE_XKB */
+   if (++_ecore_x_init_count != 1)
+     return _ecore_x_init_count;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+#ifdef LOGRT
+   _logrt_init();
+#endif /* ifdef LOGRT */
+
+   eina_init();
+   _ecore_xlib_log_dom = eina_log_domain_register
+       ("ecore_x", ECORE_XLIB_DEFAULT_LOG_COLOR);
+   if (_ecore_xlib_log_dom < 0)
      {
-       _ecore_x_init_count++;
-       return _ecore_x_init_count;
+        EINA_LOG_ERR(
+          "Impossible to create a log domain for the Ecore Xlib module.");
+        return --_ecore_x_init_count;
      }
+
+   if (!ecore_init())
+     goto shutdown_eina;
+   if (!ecore_event_init())
+     goto shutdown_ecore;
+
+#ifdef EVAS_FRAME_QUEUING
+   XInitThreads();
+#endif /* ifdef EVAS_FRAME_QUEUING */
    _ecore_x_disp = XOpenDisplay((char *)name);
-   if (!_ecore_x_disp) return 0;
+   if (!_ecore_x_disp)
+     goto shutdown_ecore_event;
+
    _ecore_x_error_handler_init();
    _ecore_x_event_handlers_num = LASTEvent;
-   
+
+#define ECORE_X_EVENT_HANDLERS_GROW(ext_base, ext_num_events)            \
+  do {                                                                   \
+       if (_ecore_x_event_handlers_num < (ext_base + ext_num_events)) {  \
+            _ecore_x_event_handlers_num = (ext_base + ext_num_events); } \
+    } while (0)
+
    if (XShapeQueryExtension(_ecore_x_disp, &shape_base, &shape_err_base))
-     _ecore_x_event_shape_id = shape_base + ShapeNotify;
-   if (_ecore_x_event_shape_id >= _ecore_x_event_handlers_num)
-     _ecore_x_event_handlers_num = _ecore_x_event_shape_id + 1;
-   
+     _ecore_x_event_shape_id = shape_base;
+
+   ECORE_X_EVENT_HANDLERS_GROW(shape_base, ShapeNumberEvents);
+
 #ifdef ECORE_XSS
-   if (XScreenSaverQueryExtension(_ecore_x_disp, &screensaver_base, &screensaver_err_base))
-     _ecore_x_event_screensaver_id = screensaver_base + ScreenSaverNotify;
-#endif   
-   if (_ecore_x_event_screensaver_id >= _ecore_x_event_handlers_num)
-     _ecore_x_event_handlers_num = _ecore_x_event_screensaver_id + 1;
-   
+   if (XScreenSaverQueryExtension(_ecore_x_disp, &screensaver_base,
+                                  &screensaver_err_base))
+     _ecore_x_event_screensaver_id = screensaver_base;
+
+   ECORE_X_EVENT_HANDLERS_GROW(screensaver_base, ScreenSaverNumberEvents);
+#endif /* ifdef ECORE_XSS */
+
    if (XSyncQueryExtension(_ecore_x_disp, &sync_base, &sync_err_base))
      {
-       int major, minor;
+        int major, minor;
 
-       _ecore_x_event_sync_id = sync_base;
-       if (!XSyncInitialize(_ecore_x_disp, &major, &minor))
-         _ecore_x_event_sync_id = 0;
+        _ecore_x_event_sync_id = sync_base;
+        if (!XSyncInitialize(_ecore_x_disp, &major, &minor))
+          _ecore_x_event_sync_id = 0;
      }
-   if (_ecore_x_event_sync_id + XSyncAlarmNotify >= _ecore_x_event_handlers_num)
-     _ecore_x_event_handlers_num = _ecore_x_event_sync_id + XSyncAlarmNotify + 1;
-   
+
+   ECORE_X_EVENT_HANDLERS_GROW(sync_base, XSyncNumberEvents);
+
 #ifdef ECORE_XRANDR
    if (XRRQueryExtension(_ecore_x_disp, &randr_base, &randr_err_base))
-     _ecore_x_event_randr_id = randr_base + RRScreenChangeNotify;
-   if (_ecore_x_event_randr_id >= _ecore_x_event_handlers_num)
-     _ecore_x_event_handlers_num = _ecore_x_event_randr_id + 1;
-#endif
+     _ecore_x_event_randr_id = randr_base;
+
+   ECORE_X_EVENT_HANDLERS_GROW(randr_base, RRNumberEvents);
+#endif /* ifdef ECORE_XRANDR */
 
 #ifdef ECORE_XFIXES
    if (XFixesQueryExtension(_ecore_x_disp, &fixes_base, &fixes_err_base))
-     _ecore_x_event_fixes_selection_id = fixes_base + XFixesSelectionNotify;
-   if (_ecore_x_event_fixes_selection_id >= _ecore_x_event_handlers_num)
-     _ecore_x_event_handlers_num = _ecore_x_event_fixes_selection_id + 1;
-#endif
+     _ecore_x_event_fixes_selection_id = fixes_base;
+
+   ECORE_X_EVENT_HANDLERS_GROW(fixes_base, XFixesNumberEvents);
+#endif /* ifdef ECORE_XFIXES */
 
 #ifdef ECORE_XDAMAGE
    if (XDamageQueryExtension(_ecore_x_disp, &damage_base, &damage_err_base))
-     _ecore_x_event_damage_id = damage_base + XDamageNotify;
-   if (_ecore_x_event_damage_id >= _ecore_x_event_handlers_num)
-     _ecore_x_event_handlers_num = _ecore_x_event_damage_id + 1;
-#endif
+     _ecore_x_event_damage_id = damage_base;
 
-   _ecore_x_event_handlers = calloc(_ecore_x_event_handlers_num, sizeof(void *));
-   if (!_ecore_x_event_handlers)
+   ECORE_X_EVENT_HANDLERS_GROW(damage_base, XDamageNumberEvents);
+#endif /* ifdef ECORE_XDAMAGE */
+
+#ifdef ECORE_XGESTURE
+   if (XGestureQueryExtension(_ecore_x_disp, &gesture_base, &gesture_err_base))
+     _ecore_x_event_gesture_id = gesture_base;
+
+   ECORE_X_EVENT_HANDLERS_GROW(gesture_base, GestureNumberEvents);
+#endif /* ifdef ECORE_XGESTURE */
+#ifdef ECORE_XKB
      {
-        XCloseDisplay(_ecore_x_disp);
-       _ecore_x_fd_handler_handle = NULL;
-       _ecore_x_disp = NULL;
-       return 0;       
+        int dummy;
+        
+        if (XkbQueryExtension(_ecore_x_disp, &dummy, &xkb_base,
+                              &dummy, &dummy, &dummy))
+          _ecore_x_event_xkb_id = xkb_base;
+        XkbSelectEventDetails(_ecore_x_disp, XkbUseCoreKbd, XkbStateNotify,
+                              XkbAllStateComponentsMask, XkbGroupStateMask);
      }
-#ifdef ECORE_XCURSOR   
-   _ecore_x_xcursor = XcursorSupportsARGB(_ecore_x_disp);
+   ECORE_X_EVENT_HANDLERS_GROW(xkb_base, XkbNumberEvents);
 #endif
-   _ecore_x_event_handlers[KeyPress]         = _ecore_x_event_handle_key_press;
-   _ecore_x_event_handlers[KeyRelease]       = _ecore_x_event_handle_key_release;
-   _ecore_x_event_handlers[ButtonPress]      = _ecore_x_event_handle_button_press;
-   _ecore_x_event_handlers[ButtonRelease]    = _ecore_x_event_handle_button_release;
-   _ecore_x_event_handlers[MotionNotify]     = _ecore_x_event_handle_motion_notify;
-   _ecore_x_event_handlers[EnterNotify]      = _ecore_x_event_handle_enter_notify;
-   _ecore_x_event_handlers[LeaveNotify]      = _ecore_x_event_handle_leave_notify;
-   _ecore_x_event_handlers[FocusIn]          = _ecore_x_event_handle_focus_in;
-   _ecore_x_event_handlers[FocusOut]         = _ecore_x_event_handle_focus_out;
-   _ecore_x_event_handlers[KeymapNotify]     = _ecore_x_event_handle_keymap_notify;
-   _ecore_x_event_handlers[Expose]           = _ecore_x_event_handle_expose;
-   _ecore_x_event_handlers[GraphicsExpose]   = _ecore_x_event_handle_graphics_expose;
-   _ecore_x_event_handlers[VisibilityNotify] = _ecore_x_event_handle_visibility_notify;
-   _ecore_x_event_handlers[CreateNotify]     = _ecore_x_event_handle_create_notify;
-   _ecore_x_event_handlers[DestroyNotify]    = _ecore_x_event_handle_destroy_notify;
-   _ecore_x_event_handlers[UnmapNotify]      = _ecore_x_event_handle_unmap_notify;
-   _ecore_x_event_handlers[MapNotify]        = _ecore_x_event_handle_map_notify;
-   _ecore_x_event_handlers[MapRequest]       = _ecore_x_event_handle_map_request;
-   _ecore_x_event_handlers[ReparentNotify]   = _ecore_x_event_handle_reparent_notify;
-   _ecore_x_event_handlers[ConfigureNotify]  = _ecore_x_event_handle_configure_notify;
-   _ecore_x_event_handlers[ConfigureRequest] = _ecore_x_event_handle_configure_request;
-   _ecore_x_event_handlers[GravityNotify]    = _ecore_x_event_handle_gravity_notify;
-   _ecore_x_event_handlers[ResizeRequest]    = _ecore_x_event_handle_resize_request;
-   _ecore_x_event_handlers[CirculateNotify]  = _ecore_x_event_handle_circulate_notify;
-   _ecore_x_event_handlers[CirculateRequest] = _ecore_x_event_handle_circulate_request;
-   _ecore_x_event_handlers[PropertyNotify]   = _ecore_x_event_handle_property_notify;
-   _ecore_x_event_handlers[SelectionClear]   = _ecore_x_event_handle_selection_clear;
-   _ecore_x_event_handlers[SelectionRequest] = _ecore_x_event_handle_selection_request;
-   _ecore_x_event_handlers[SelectionNotify]  = _ecore_x_event_handle_selection_notify;
-   _ecore_x_event_handlers[ColormapNotify]   = _ecore_x_event_handle_colormap_notify;
-   _ecore_x_event_handlers[ClientMessage]    = _ecore_x_event_handle_client_message;
-   _ecore_x_event_handlers[MappingNotify]    = _ecore_x_event_handle_mapping_notify;
+
+   _ecore_x_event_handlers = calloc(_ecore_x_event_handlers_num, sizeof(void *));
+   if (!_ecore_x_event_handlers)
+     goto close_display;
+
+#ifdef ECORE_XCURSOR
+   _ecore_x_xcursor = XcursorSupportsARGB(_ecore_x_disp) ? EINA_TRUE : EINA_FALSE;
+#endif /* ifdef ECORE_XCURSOR */
+   _ecore_x_event_handlers[AnyXEvent] = _ecore_x_event_handle_any_event;
+   _ecore_x_event_handlers[KeyPress] = _ecore_x_event_handle_key_press;
+   _ecore_x_event_handlers[KeyRelease] = _ecore_x_event_handle_key_release;
+   _ecore_x_event_handlers[ButtonPress] = _ecore_x_event_handle_button_press;
+   _ecore_x_event_handlers[ButtonRelease] =
+     _ecore_x_event_handle_button_release;
+   _ecore_x_event_handlers[MotionNotify] = _ecore_x_event_handle_motion_notify;
+   _ecore_x_event_handlers[EnterNotify] = _ecore_x_event_handle_enter_notify;
+   _ecore_x_event_handlers[LeaveNotify] = _ecore_x_event_handle_leave_notify;
+   _ecore_x_event_handlers[FocusIn] = _ecore_x_event_handle_focus_in;
+   _ecore_x_event_handlers[FocusOut] = _ecore_x_event_handle_focus_out;
+   _ecore_x_event_handlers[KeymapNotify] = _ecore_x_event_handle_keymap_notify;
+   _ecore_x_event_handlers[Expose] = _ecore_x_event_handle_expose;
+   _ecore_x_event_handlers[GraphicsExpose] =
+     _ecore_x_event_handle_graphics_expose;
+   _ecore_x_event_handlers[VisibilityNotify] =
+     _ecore_x_event_handle_visibility_notify;
+   _ecore_x_event_handlers[CreateNotify] = _ecore_x_event_handle_create_notify;
+   _ecore_x_event_handlers[DestroyNotify] =
+     _ecore_x_event_handle_destroy_notify;
+   _ecore_x_event_handlers[UnmapNotify] = _ecore_x_event_handle_unmap_notify;
+   _ecore_x_event_handlers[MapNotify] = _ecore_x_event_handle_map_notify;
+   _ecore_x_event_handlers[MapRequest] = _ecore_x_event_handle_map_request;
+   _ecore_x_event_handlers[ReparentNotify] =
+     _ecore_x_event_handle_reparent_notify;
+   _ecore_x_event_handlers[ConfigureNotify] =
+     _ecore_x_event_handle_configure_notify;
+   _ecore_x_event_handlers[ConfigureRequest] =
+     _ecore_x_event_handle_configure_request;
+   _ecore_x_event_handlers[GravityNotify] =
+     _ecore_x_event_handle_gravity_notify;
+   _ecore_x_event_handlers[ResizeRequest] =
+     _ecore_x_event_handle_resize_request;
+   _ecore_x_event_handlers[CirculateNotify] =
+     _ecore_x_event_handle_circulate_notify;
+   _ecore_x_event_handlers[CirculateRequest] =
+     _ecore_x_event_handle_circulate_request;
+   _ecore_x_event_handlers[PropertyNotify] =
+     _ecore_x_event_handle_property_notify;
+   _ecore_x_event_handlers[SelectionClear] =
+     _ecore_x_event_handle_selection_clear;
+   _ecore_x_event_handlers[SelectionRequest] =
+     _ecore_x_event_handle_selection_request;
+   _ecore_x_event_handlers[SelectionNotify] =
+     _ecore_x_event_handle_selection_notify;
+   _ecore_x_event_handlers[ColormapNotify] =
+     _ecore_x_event_handle_colormap_notify;
+   _ecore_x_event_handlers[ClientMessage] =
+     _ecore_x_event_handle_client_message;
+   _ecore_x_event_handlers[MappingNotify] =
+     _ecore_x_event_handle_mapping_notify;
+#ifdef GenericEvent
+   _ecore_x_event_handlers[GenericEvent] = _ecore_x_event_handle_generic_event;
+#endif /* ifdef GenericEvent */
+
    if (_ecore_x_event_shape_id)
-     _ecore_x_event_handlers[_ecore_x_event_shape_id] = _ecore_x_event_handle_shape_change;
+     _ecore_x_event_handlers[_ecore_x_event_shape_id] =
+       _ecore_x_event_handle_shape_change;
+
    if (_ecore_x_event_screensaver_id)
-     _ecore_x_event_handlers[_ecore_x_event_screensaver_id] = _ecore_x_event_handle_screensaver_notify;
+     _ecore_x_event_handlers[_ecore_x_event_screensaver_id] =
+       _ecore_x_event_handle_screensaver_notify;
+
    if (_ecore_x_event_sync_id)
      {
-       _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncCounterNotify] =
-          _ecore_x_event_handle_sync_counter;
-       _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncAlarmNotify] =
-          _ecore_x_event_handle_sync_alarm;
+        _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncCounterNotify] =
+          _ecore_x_event_handle_sync_counter;
+        _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncAlarmNotify] =
+          _ecore_x_event_handle_sync_alarm;
      }
+
 #ifdef ECORE_XRANDR
    if (_ecore_x_event_randr_id)
-     _ecore_x_event_handlers[_ecore_x_event_randr_id] = _ecore_x_event_handle_randr_change;
-#endif
+     {
+        _ecore_x_event_handlers[_ecore_x_event_randr_id +
+                                RRScreenChangeNotify] =
+          _ecore_x_event_handle_randr_change;
+        _ecore_x_event_handlers[_ecore_x_event_randr_id +
+                                RRNotify] = _ecore_x_event_handle_randr_notify;
+     }
+
+#endif /* ifdef ECORE_XRANDR */
 #ifdef ECORE_XFIXES
    if (_ecore_x_event_fixes_selection_id)
-     _ecore_x_event_handlers[_ecore_x_event_fixes_selection_id] = _ecore_x_event_handle_fixes_selection_notify;
-#endif
+     _ecore_x_event_handlers[_ecore_x_event_fixes_selection_id] =
+       _ecore_x_event_handle_fixes_selection_notify;
+
+#endif /* ifdef ECORE_XFIXES */
 #ifdef ECORE_XDAMAGE
    if (_ecore_x_event_damage_id)
-     _ecore_x_event_handlers[_ecore_x_event_damage_id] = _ecore_x_event_handle_damage_notify;
-#endif
+     _ecore_x_event_handlers[_ecore_x_event_damage_id] =
+       _ecore_x_event_handle_damage_notify;
+
+#endif /* ifdef ECORE_XDAMAGE */
+#ifdef ECORE_XKB
+   // set x autorepeat detection to on. that means instead of
+   //   press-release-press-release-press-release
+   // you get
+   //   press-press-press-press-press-release
+   do
+     {
+        Bool works = 0;
+        XkbSetDetectableAutoRepeat(_ecore_x_disp, 1, &works);
+     }
+     while (0);
+   if (_ecore_x_event_xkb_id)
+   _ecore_x_event_handlers[_ecore_x_event_xkb_id] = _ecore_x_event_handle_xkb;
+#endif /* ifdef ECORE_XKB */
+
+#ifdef ECORE_XGESTURE
+   if (_ecore_x_event_gesture_id)
+     {
+        _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyFlick] =
+          _ecore_x_event_handle_gesture_notify_flick;
+        _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyPan] =
+          _ecore_x_event_handle_gesture_notify_pan;
+        _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyPinchRotation] =
+          _ecore_x_event_handle_gesture_notify_pinchrotation;
+        _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyTap] =
+          _ecore_x_event_handle_gesture_notify_tap;
+        _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyTapNHold] =
+          _ecore_x_event_handle_gesture_notify_tapnhold;
+        _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyHold] =
+          _ecore_x_event_handle_gesture_notify_hold;
+        _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyGroup] =
+          _ecore_x_event_handle_gesture_notify_group;
+     }
+
+#endif /* ifdef ECORE_XGESTURE */
 
-   if (!ECORE_X_EVENT_KEY_DOWN)
+   if (!ECORE_X_EVENT_ANY)
      {
-       ECORE_X_EVENT_KEY_DOWN                 = ecore_event_type_new();
-       ECORE_X_EVENT_KEY_UP                   = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_BUTTON_DOWN        = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_BUTTON_UP          = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_MOVE               = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_IN                 = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_OUT                = ecore_event_type_new();
-       ECORE_X_EVENT_MOUSE_WHEEL              = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_FOCUS_IN          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_FOCUS_OUT         = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_KEYMAP            = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_DAMAGE            = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_CREATE            = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_DESTROY           = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_HIDE              = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_SHOW              = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_SHOW_REQUEST      = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_REPARENT          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_CONFIGURE         = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_GRAVITY           = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_RESIZE_REQUEST    = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_STACK             = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_STACK_REQUEST     = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROPERTY          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_COLORMAP          = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_MAPPING           = ecore_event_type_new();
-       ECORE_X_EVENT_SELECTION_CLEAR          = ecore_event_type_new();
-       ECORE_X_EVENT_SELECTION_REQUEST        = ecore_event_type_new();
-       ECORE_X_EVENT_SELECTION_NOTIFY         = ecore_event_type_new();
-       ECORE_X_EVENT_CLIENT_MESSAGE           = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_SHAPE             = ecore_event_type_new();
-       ECORE_X_EVENT_SCREENSAVER_NOTIFY       = ecore_event_type_new();
-       ECORE_X_EVENT_SYNC_COUNTER             = ecore_event_type_new();
-       ECORE_X_EVENT_SYNC_ALARM               = ecore_event_type_new();
-       ECORE_X_EVENT_SCREEN_CHANGE            = ecore_event_type_new();
-       ECORE_X_EVENT_DAMAGE_NOTIFY            = ecore_event_type_new();
+        ECORE_X_EVENT_ANY = ecore_event_type_new();
+        ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new();
+        ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_KEYMAP = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_CREATE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_DESTROY = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_HIDE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_SHOW = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_SHOW_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_REPARENT = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_GRAVITY = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_STACK = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_STACK_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new();
+        ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new();
+        ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new();
+        ECORE_X_EVENT_SCREENSAVER_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_PAN = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_TAP = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = ecore_event_type_new();
+        ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = ecore_event_type_new();
+        ECORE_X_EVENT_SYNC_COUNTER = ecore_event_type_new();
+        ECORE_X_EVENT_SYNC_ALARM = ecore_event_type_new();
+        ECORE_X_EVENT_SCREEN_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_RANDR_CRTC_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new();
+
+        ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
+
+        ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_WINDOW_STATE_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = ecore_event_type_new();
+        ECORE_X_EVENT_PING = ecore_event_type_new();
+
+        ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = ecore_event_type_new();
+        ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = ecore_event_type_new();
+        ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = ecore_event_type_new();
+
+        ECORE_X_EVENT_XKB_STATE_NOTIFY = ecore_event_type_new();
+        ECORE_X_EVENT_XKB_NEWKBD_NOTIFY = ecore_event_type_new();
        
-       ECORE_X_EVENT_WINDOW_DELETE_REQUEST                = ecore_event_type_new();
-       /*
-       ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE             = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE     = ecore_event_type_new();
-        ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE        = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE         = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE    = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE               = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE           = ecore_event_type_new();
-       */
-
-       ECORE_X_EVENT_DESKTOP_CHANGE           = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new();
-       ECORE_X_EVENT_WINDOW_STATE_REQUEST     = ecore_event_type_new();
-       ECORE_X_EVENT_FRAME_EXTENTS_REQUEST    = ecore_event_type_new();
-       ECORE_X_EVENT_PING                     = ecore_event_type_new();
-
-       ECORE_X_EVENT_STARTUP_SEQUENCE_NEW     = ecore_event_type_new();
-       ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE  = ecore_event_type_new();
-       ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE  = ecore_event_type_new();
+        ECORE_X_EVENT_GENERIC = ecore_event_type_new();
+
+       ECORE_X_RAW_BUTTON_PRESS = ecore_event_type_new();
+       ECORE_X_RAW_BUTTON_RELEASE = ecore_event_type_new();
+       ECORE_X_RAW_MOTION = ecore_event_type_new();
      }
-   
-   /* everything has these... unless its like a pda... :) */
-   ECORE_X_MODIFIER_SHIFT = _ecore_x_key_mask_get(XK_Shift_L);
-   ECORE_X_MODIFIER_CTRL  = _ecore_x_key_mask_get(XK_Control_L);
-   
-   /* apple's xdarwin has no alt!!!! */
-   ECORE_X_MODIFIER_ALT   = _ecore_x_key_mask_get(XK_Alt_L);
-   if (!ECORE_X_MODIFIER_ALT) 
-     ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Meta_L);
-   if (!ECORE_X_MODIFIER_ALT) 
-     ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Super_L);   
-   
-   /* the windows key... a valid modifier :) */
-   ECORE_X_MODIFIER_WIN   = _ecore_x_key_mask_get(XK_Super_L);
-   if (!ECORE_X_MODIFIER_WIN) 
-     ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Mode_switch);
-   if (!ECORE_X_MODIFIER_WIN) 
-     ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Meta_L);
-   
-   if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
-     ECORE_X_MODIFIER_WIN = 0;
-   if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL)
-     ECORE_X_MODIFIER_ALT = 0;
-   
-   ECORE_X_LOCK_SCROLL    = _ecore_x_key_mask_get(XK_Scroll_Lock);
-   ECORE_X_LOCK_NUM       = _ecore_x_key_mask_get(XK_Num_Lock);
-   ECORE_X_LOCK_CAPS      = _ecore_x_key_mask_get(XK_Caps_Lock);
-   
-   _ecore_x_fd_handler_handle = 
+
+   _ecore_x_modifiers_get();
+
+   _ecore_x_fd_handler_handle =
      ecore_main_fd_handler_add(ConnectionNumber(_ecore_x_disp),
-                              ECORE_FD_READ,
-                              _ecore_x_fd_handler, _ecore_x_disp,
-                              _ecore_x_fd_handler_buf, _ecore_x_disp);
+                               ECORE_FD_READ,
+                               _ecore_x_fd_handler, _ecore_x_disp,
+                               _ecore_x_fd_handler_buf, _ecore_x_disp);
    if (!_ecore_x_fd_handler_handle)
-     {
-       XCloseDisplay(_ecore_x_disp);
-       free(_ecore_x_event_handlers);
-       _ecore_x_fd_handler_handle = NULL;
-       _ecore_x_disp = NULL;
-       _ecore_x_event_handlers = NULL;
-       return 0;
-     }
+     goto free_event_handlers;
 
    _ecore_x_atoms_init();
 
@@ -388,13 +642,17 @@ ecore_x_init(const char *name)
 
    /* old e hints init */
    ecore_x_e_init();
-   
+
    /* This is just to be anal about naming conventions */
 
-   _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] = ECORE_X_ATOM_WM_DELETE_WINDOW;
-   _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] = ECORE_X_ATOM_WM_TAKE_FOCUS;
-   _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_PING] = ECORE_X_ATOM_NET_WM_PING;
-   _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
+   _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] =
+     ECORE_X_ATOM_WM_DELETE_WINDOW;
+   _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] =
+     ECORE_X_ATOM_WM_TAKE_FOCUS;
+   _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_PING] =
+     ECORE_X_ATOM_NET_WM_PING;
+   _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] =
+     ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
 
    _ecore_x_selection_data_init();
    _ecore_x_dnd_init();
@@ -402,33 +660,73 @@ ecore_x_init(const char *name)
    _ecore_x_damage_init();
    _ecore_x_composite_init();
    _ecore_x_dpms_init();
-   
-   _ecore_x_init_count++;
-   
+   _ecore_x_randr_init();
+   _ecore_x_gesture_init();
+   _ecore_x_input_init();
+   _ecore_x_events_init();
+
    _ecore_x_private_win = ecore_x_window_override_new(0, -77, -777, 123, 456);
-   
+
    return _ecore_x_init_count;
+
+free_event_handlers:
+   free(_ecore_x_event_handlers);
+   _ecore_x_event_handlers = NULL;
+close_display:
+   XCloseDisplay(_ecore_x_disp);
+   _ecore_x_fd_handler_handle = NULL;
+   _ecore_x_disp = NULL;
+shutdown_ecore_event:
+   ecore_event_shutdown();
+shutdown_ecore:
+   ecore_shutdown();
+shutdown_eina:
+   eina_log_domain_unregister(_ecore_xlib_log_dom);
+   _ecore_xlib_log_dom = -1;
+   eina_shutdown();
+
+   return --_ecore_x_init_count;
 }
 
 static int
 _ecore_x_shutdown(int close_display)
 {
-   _ecore_x_init_count--;
-   if (_ecore_x_init_count > 0) return _ecore_x_init_count;
-   if (!_ecore_x_disp) return _ecore_x_init_count;
+   if (--_ecore_x_init_count != 0)
+     return _ecore_x_init_count;
+
+   if (!_ecore_x_disp)
+     return _ecore_x_init_count;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_main_fd_handler_del(_ecore_x_fd_handler_handle);
    if (close_display)
-      XCloseDisplay(_ecore_x_disp);
+     XCloseDisplay(_ecore_x_disp);
    else
-      close(ConnectionNumber(_ecore_x_disp));
+     {
+        close(ConnectionNumber(_ecore_x_disp));
+        // FIXME: may have to clean up x display internal here
+// getting segv here? hmmm. odd. disable
+//        XFree(_ecore_x_disp);
+     }
+
    free(_ecore_x_event_handlers);
-   ecore_main_fd_handler_del(_ecore_x_fd_handler_handle);
    _ecore_x_fd_handler_handle = NULL;
    _ecore_x_disp = NULL;
    _ecore_x_event_handlers = NULL;
+   _ecore_x_events_shutdown();
+   _ecore_x_input_shutdown();
    _ecore_x_selection_shutdown();
    _ecore_x_dnd_shutdown();
    ecore_x_netwm_shutdown();
-   if (_ecore_x_init_count < 0) _ecore_x_init_count = 0;
+
+   ecore_event_shutdown();
+   ecore_shutdown();
+
+   eina_log_domain_unregister(_ecore_xlib_log_dom);
+   _ecore_xlib_log_dom = -1;
+   eina_shutdown();
+
    return _ecore_x_init_count;
 }
 
@@ -439,7 +737,7 @@ _ecore_x_shutdown(int close_display)
  * and any event handlers for it are removed.
  *
  * @return  The number of times the library has been initialized without
- *          being shut down.
+ *          being shut down. 0 is returned if an error occurs.
  * @ingroup Ecore_X_Init_Group
  */
 EAPI int
@@ -486,12 +784,95 @@ ecore_x_display_get(void)
 EAPI int
 ecore_x_fd_get(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ConnectionNumber(_ecore_x_disp);
 }
 
 /**
+ * Retrieves the Ecore_X_Screen handle used for the current X connection.
+ * @return  The current default screen.
+ * @ingroup Ecore_X_Display_Attr_Group
+ */
+EAPI Ecore_X_Screen *
+ecore_x_default_screen_get(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return (Ecore_X_Screen *)DefaultScreenOfDisplay(_ecore_x_disp);
+}
+
+/**
+ * Retrieves the size of an Ecore_X_Screen.
+ * @param screen the handle to the screen to query.
+ * @param w where to return the width. May be NULL. Returns 0 on errors.
+ * @param h where to return the height. May be NULL. Returns 0 on errors.
+ * @ingroup Ecore_X_Display_Attr_Group
+ * @see ecore_x_default_screen_get()
+ *
+ * @since 1.1
+ */
+EAPI void
+ecore_x_screen_size_get(const Ecore_X_Screen *screen,
+                        int *w,
+                        int *h)
+{
+   Screen *s = (Screen *)screen;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (w) *w = 0;
+   if (h) *h = 0;
+   if (!s) return;
+   if (w) *w = s->width;
+   if (h) *h = s->height;
+}
+
+/**
+ * Retrieves the number of screens.
+ *
+ * @return  The count of the number of screens.
+ * @ingroup Ecore_X_Display_Attr_Group
+ *
+ * @since 1.1
+ */
+EAPI int
+ecore_x_screen_count_get(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   return ScreenCount(_ecore_x_disp);
+}
+
+/**
+ * Retrieves the index number of the given screen.
+ *
+ * @param screen The screen for which the index will be retrieved.
+ * @return  The index number of the screen.
+ * @ingroup Ecore_X_Display_Attr_Group
+ *
+ * @since 1.1
+ */
+EAPI int
+ecore_x_screen_index_get(const Ecore_X_Screen *screen)
+{
+   return XScreenNumberOfScreen((Screen *)screen);
+}
+
+/**
+ * Retrieves the screen based on index number.
+ *
+ * @param idx The index that will be used to retrieve the screen.
+ * @return  The Ecore_X_Screen at this index.
+ * @ingroup Ecore_X_Display_Attr_Group
+ *
+ * @since 1.1
+ */
+EAPI Ecore_X_Screen *
+ecore_x_screen_get(int idx)
+{
+   return XScreenOfDisplay(_ecore_x_disp, idx);
+}
+
+/**
  * Sets the timeout for a double and triple clicks to be flagged.
- * 
+ *
  * This sets the time between clicks before the double_click flag is
  * set in a button down event. If 3 clicks occur within double this
  * time, the triple_click flag is also set.
@@ -502,7 +883,9 @@ ecore_x_fd_get(void)
 EAPI void
 ecore_x_double_click_time_set(double t)
 {
-   if (t < 0.0) t = 0.0;
+   if (t < 0.0)
+     t = 0.0;
+
    _ecore_x_double_click_time = t;
 }
 
@@ -534,6 +917,7 @@ ecore_x_double_click_time_get(void)
 EAPI void
 ecore_x_flush(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFlush(_ecore_x_disp);
 }
 
@@ -545,6 +929,7 @@ ecore_x_flush(void)
 EAPI void
 ecore_x_sync(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSync(_ecore_x_disp, False);
 }
 
@@ -565,19 +950,20 @@ ecore_x_killall(Ecore_X_Window root)
    Window parent_r;
    Window *children_r = NULL;
    unsigned int num_children = 0;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGrabServer(_ecore_x_disp);
    /* Tranverse window tree starting from root, and drag each
     * before the firing squad */
    while (XQueryTree(_ecore_x_disp, root, &root_r, &parent_r,
-                    &children_r, &num_children) && (num_children > 0))
+                     &children_r, &num_children) && (num_children > 0))
      {
-       for (j = 0; j < num_children; ++j)
-         {
-            XKillClient(_ecore_x_disp, children_r[j]);
-         }
-       
-       XFree(children_r);
+        for (j = 0; j < num_children; ++j)
+          {
+             XKillClient(_ecore_x_disp, children_r[j]);
+          }
+
+        XFree(children_r);
      }
    XUngrabServer(_ecore_x_disp);
    XSync(_ecore_x_disp, False);
@@ -593,6 +979,7 @@ ecore_x_killall(Ecore_X_Window root)
 EAPI void
 ecore_x_kill(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XKillClient(_ecore_x_disp, win);
 }
 
@@ -605,101 +992,141 @@ ecore_x_current_time_get(void)
    return _ecore_x_event_last_time;
 }
 
-static int
-_ecore_x_fd_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
+/**
+ * Return the screen DPI
+ *
+ * This is a simplistic call to get DPI. It does not account for differing
+ * DPI in the x amd y axes nor does it account for multihead or xinerama and
+ * xrander where different parts of the screen may have different DPI etc.
+ *
+ * @return the general screen DPI (dots/pixels per inch).
+ */
+EAPI int
+ecore_x_dpi_get(void)
+{
+   Screen *s;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   s = DefaultScreenOfDisplay(_ecore_x_disp);
+   if (s->mwidth <= 0)
+     return 75;
+
+   return (((s->width * 254) / s->mwidth) + 5) / 10;
+}
+
+/**
+ * Invoke the standard system beep to alert users
+ *
+ * @param percent The volume at which the bell rings. Must be in the range
+ * [-100,+100]. If percent >= 0, the final volume will be:
+ *       base - [(base * percent) / 100] + percent
+ * Otherwise, it's calculated as:
+ *       base + [(base * percent) / 100]
+ * where @c base is the bell's base volume as set by XChangeKeyboardControl(3).
+ *
+ * @returns @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_bell(int percent)
+{
+   int ret;
+
+   ret = XBell(_ecore_x_disp, percent);
+   if (ret == BadValue)
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_ecore_x_fd_handler(void *data,
+                    Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
    Display *d;
-   
+
    d = data;
    while (XPending(d))
      {
-       XEvent ev;
-       
-       XNextEvent(d, &ev);
-
-       /* Filter event for XIM */
-       if (XFilterEvent(&ev, ev.xkey.window)) continue;
-
-       if ((ev.type >= 0) && (ev.type < _ecore_x_event_handlers_num))
-         {
-            if (_ecore_x_event_handlers[ev.type])
-              _ecore_x_event_handlers[ev.type] (&ev);
-         }
+        XEvent ev;
+
+        XNextEvent(d, &ev);
+#ifdef ENABLE_XIM
+        /* Filter event for XIM */
+        if (XFilterEvent(&ev, ev.xkey.window))
+          continue;
+
+#endif /* ifdef ENABLE_XIM */
+        if ((ev.type >= 0) && (ev.type < _ecore_x_event_handlers_num))
+          {
+             if (_ecore_x_event_handlers[AnyXEvent])
+               _ecore_x_event_handlers[AnyXEvent] (&ev);
+
+             if (_ecore_x_event_handlers[ev.type])
+               _ecore_x_event_handlers[ev.type] (&ev);
+          }
      }
-   return 1;
+   return ECORE_CALLBACK_RENEW;
 }
 
-static int
-_ecore_x_fd_handler_buf(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
+static Eina_Bool
+_ecore_x_fd_handler_buf(void *data,
+                        Ecore_Fd_Handler *fd_handler __UNUSED__)
 {
    Display *d;
 
    d = data;
-   if (XPending(d)) return 1;
-   return 0;
+   if (XPending(d))
+     return ECORE_CALLBACK_RENEW;
+
+   return ECORE_CALLBACK_CANCEL;
 }
 
 static int
 _ecore_x_key_mask_get(KeySym sym)
 {
-   XModifierKeymap    *mod;
-   KeySym              sym2;
-   int                 i, j;
-   const int           masks[8] = 
-     {
-       ShiftMask, LockMask, ControlMask, 
-         Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
-     };
-   
+   XModifierKeymap *mod;
+   KeySym sym2;
+   int i, j;
+   const int masks[8] =
+   {
+      ShiftMask, LockMask, ControlMask,
+      Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
+   };
+
    mod = XGetModifierMapping(_ecore_x_disp);
    if ((mod) && (mod->max_keypermod > 0))
-     {
-       for (i = 0; i < (8 * mod->max_keypermod); i++)
-         {
-            for (j = 0; j < 8; j++)
-              {
-                 sym2 = XKeycodeToKeysym(_ecore_x_disp, mod->modifiermap[i], j);
-                 if (sym2 != 0) break;
-              }
-            if (sym2 == sym)
-              {
-                 int mask;
-                 
-                 mask = masks[i / mod->max_keypermod];
-                 if (mod->modifiermap) XFree(mod->modifiermap);
-                 XFree(mod);
-                 return mask;
-              }
-         }
-     }
+     for (i = 0; i < (8 * mod->max_keypermod); i++)
+       {
+          for (j = 0; j < 8; j++)
+            {
+               sym2 = _ecore_x_XKeycodeToKeysym(_ecore_x_disp,
+                                                mod->modifiermap[i], j);
+               if (sym2 != 0)
+                 break;
+            }
+          if (sym2 == sym)
+            {
+               int mask;
+
+               mask = masks[i / mod->max_keypermod];
+               if (mod->modifiermap)
+                 XFree(mod->modifiermap);
+
+               XFree(mod);
+               return mask;
+            }
+       }
+
    if (mod)
      {
-       if (mod->modifiermap) XFree(mod->modifiermap);
-       XFree(mod);
-     }
-  return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+        if (mod->modifiermap)
+          XFree(mod->modifiermap);
 
+        XFree(mod);
+     }
 
+   return 0;
+}
 
 /*****************************************************************************/
 /*****************************************************************************/
@@ -722,108 +1149,122 @@ ecore_x_window_root_list(int *num_ret)
    Ecore_X_Window *roots;
 #ifdef ECORE_XPRINT
    int xp_base, xp_err_base;
-#endif
-   
-   if (!num_ret) return NULL;
+#endif /* ifdef ECORE_XPRINT */
+
+   if (!num_ret)
+     return NULL;
+
    *num_ret = 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 #ifdef ECORE_XPRINT
    num = ScreenCount(_ecore_x_disp);
    if (XpQueryExtension(_ecore_x_disp, &xp_base, &xp_err_base))
      {
-       Screen **ps = NULL;
-       int psnum = 0;
-       
-       ps = XpQueryScreens(_ecore_x_disp, &psnum);
-       if (ps)
-         {
-            int overlap, j;
-            
-            overlap = 0;
-            for (i = 0; i < num; i++)
-              {
-                 for (j = 0; j < psnum; j++)
-                   {
-                      if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j])
-                        overlap++;
-                   }
-              }
-            roots = malloc((num - overlap) * sizeof(Window));
-            if (roots)
-              {
-                 int k;
-                 
-                 k = 0;
-                 for (i = 0; i < num; i++)
-                   {
-                      int is_print;
-                      
-                      is_print = 0;
-                      for (j = 0; j < psnum; j++)
-                        {
-                           if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j])
-                             {
-                                is_print = 1;
-                                break;
-                             }
-                        }
-                      if (!is_print)
-                        {
-                           roots[k] = RootWindow(_ecore_x_disp, i);
-                           k++;
-                        }
-                   }
-                 *num_ret = k;
-              }
-            XFree(ps);
-         }
-       else
-         {
-            roots = malloc(num * sizeof(Window));
-            if (!roots) return NULL;
-            *num_ret = num;
-            for (i = 0; i < num; i++)
-              roots[i] = RootWindow(_ecore_x_disp, i);
-         }
+        Screen **ps = NULL;
+        int psnum = 0;
+
+        ps = XpQueryScreens(_ecore_x_disp, &psnum);
+        if (ps)
+          {
+             int overlap, j;
+
+             overlap = 0;
+             for (i = 0; i < num; i++)
+               {
+                  for (j = 0; j < psnum; j++)
+                    {
+                       if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j])
+                         overlap++;
+                    }
+               }
+             roots = malloc(MAX((num - overlap) * sizeof(Window), 1));
+             if (roots)
+               {
+                  int k;
+
+                  k = 0;
+                  for (i = 0; i < num; i++)
+                    {
+                       int is_print;
+
+                       is_print = 0;
+                       for (j = 0; j < psnum; j++)
+                         {
+                            if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j])
+                              {
+                                 is_print = 1;
+                                 break;
+                              }
+                         }
+                       if (!is_print)
+                         {
+                            roots[k] = RootWindow(_ecore_x_disp, i);
+                            k++;
+                         }
+                    }
+                  *num_ret = k;
+               }
+
+             XFree(ps);
+          }
+        else
+          {
+             roots = malloc(num * sizeof(Window));
+             if (!roots)
+               return NULL;
+
+             *num_ret = num;
+             for (i = 0; i < num; i++)
+               roots[i] = RootWindow(_ecore_x_disp, i);
+          }
      }
    else
      {
-       roots = malloc(num * sizeof(Window));
-       if (!roots) return NULL;
-       *num_ret = num;
-       for (i = 0; i < num; i++)
-         roots[i] = RootWindow(_ecore_x_disp, i);
+        roots = malloc(num * sizeof(Window));
+        if (!roots)
+          return NULL;
+
+        *num_ret = num;
+        for (i = 0; i < num; i++)
+          roots[i] = RootWindow(_ecore_x_disp, i);
      }
-#else   
+
+#else /* ifdef ECORE_XPRINT */
    num = ScreenCount(_ecore_x_disp);
    roots = malloc(num * sizeof(Window));
-   if (!roots) return NULL;
+   if (!roots)
+     return NULL;
+
    *num_ret = num;
    for (i = 0; i < num; i++)
      roots[i] = RootWindow(_ecore_x_disp, i);
-#endif   
+#endif /* ifdef ECORE_XPRINT */
    return roots;
 }
 
 EAPI Ecore_X_Window
 ecore_x_window_root_first_get(void)
 {
+   return RootWindow(_ecore_x_disp, 0);
+/*
    int num;
    Ecore_X_Window root, *roots = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    roots = ecore_x_window_root_list(&num);
-   if(!(roots)) return 0;
-   
+   if (!(roots)) return 0;
+
    if (num > 0)
-      root = roots[0];
+     root = roots[0];
    else
-      root = 0;
+     root = 0;
 
    free(roots);
    return root;
+ */
 }
 
-
 static void _ecore_x_window_manage_error(void *data);
 
 static int _ecore_x_window_manage_failed = 0;
@@ -835,114 +1276,98 @@ _ecore_x_window_manage_error(void *data __UNUSED__)
      _ecore_x_window_manage_failed = 1;
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_window_manage(Ecore_X_Window win)
 {
-   XWindowAttributes   att;
-   
-   if (XGetWindowAttributes(_ecore_x_disp, win, &att) != True) return 0;
+   XWindowAttributes att;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (XGetWindowAttributes(_ecore_x_disp, win, &att) != True)
+     return EINA_FALSE;
+
    ecore_x_sync();
    _ecore_x_window_manage_failed = 0;
    ecore_x_error_handler_set(_ecore_x_window_manage_error, NULL);
-   XSelectInput(_ecore_x_disp, win, 
-               EnterWindowMask | 
-               LeaveWindowMask | 
-               PropertyChangeMask | 
-               ResizeRedirectMask |
-               SubstructureRedirectMask | 
-               SubstructureNotifyMask |
-               StructureNotifyMask |
-               KeyPressMask | 
-               KeyReleaseMask |
-               att.your_event_mask);
+   XSelectInput(_ecore_x_disp, win,
+                EnterWindowMask |
+                LeaveWindowMask |
+                PropertyChangeMask |
+                ResizeRedirectMask |
+                SubstructureRedirectMask |
+                SubstructureNotifyMask |
+                StructureNotifyMask |
+                KeyPressMask |
+                KeyReleaseMask |
+                att.your_event_mask);
    ecore_x_sync();
    ecore_x_error_handler_set(NULL, NULL);
    if (_ecore_x_window_manage_failed)
      {
-       _ecore_x_window_manage_failed = 0;
-       return 0;
+        _ecore_x_window_manage_failed = 0;
+        return EINA_FALSE;
      }
-   return 1;
+
+   return EINA_TRUE;
 }
 
 EAPI void
 ecore_x_window_container_manage(Ecore_X_Window win)
 {
-   XSelectInput(_ecore_x_disp, win, 
-               SubstructureRedirectMask | 
-               SubstructureNotifyMask);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSelectInput(_ecore_x_disp, win,
+                SubstructureRedirectMask |
+                SubstructureNotifyMask);
 }
 
 EAPI void
 ecore_x_window_client_manage(Ecore_X_Window win)
 {
-   XSelectInput(_ecore_x_disp, win, 
-               PropertyChangeMask | 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSelectInput(_ecore_x_disp, win,
+                PropertyChangeMask |
 //             ResizeRedirectMask |
-               FocusChangeMask |
-               ColormapChangeMask |
-               VisibilityChangeMask |
-               StructureNotifyMask
-               );
+                FocusChangeMask |
+                ColormapChangeMask |
+                VisibilityChangeMask |
+                StructureNotifyMask |
+                SubstructureNotifyMask
+                );
    XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask);
 }
 
 EAPI void
 ecore_x_window_sniff(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSelectInput(_ecore_x_disp, win,
-               PropertyChangeMask |
-               SubstructureNotifyMask);
+                PropertyChangeMask |
+                SubstructureNotifyMask);
 }
 
 EAPI void
 ecore_x_window_client_sniff(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSelectInput(_ecore_x_disp, win,
-               PropertyChangeMask |
-               FocusChangeMask |
-               ColormapChangeMask |
-               VisibilityChangeMask |
-               StructureNotifyMask);
+                PropertyChangeMask |
+                FocusChangeMask |
+                ColormapChangeMask |
+                VisibilityChangeMask |
+                StructureNotifyMask |
+                SubstructureNotifyMask);
    XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask);
 }
 
-/**
- * Retrieves the atom value associated with the given name.
- * @param  name The given name.
- * @return Associated atom value.
- */
-EAPI Ecore_X_Atom    
-ecore_x_atom_get(const char *name)
+EAPI Eina_Bool
+ecore_x_window_attributes_get(Ecore_X_Window win,
+                              Ecore_X_Window_Attributes *att_ret)
 {
-   if (!_ecore_x_disp) return 0;
-   return XInternAtom(_ecore_x_disp, name, False);
-}
-
-EAPI void
-ecore_x_atoms_get(const char **names, int num, Ecore_X_Atom *atoms)
-{
-   Atom *atoms_int;
-   int i;
-   
-   if (!_ecore_x_disp) return;
-   atoms_int = alloca(num * sizeof(Atom));
-   XInternAtoms(_ecore_x_disp, (char **)names, num, False, atoms_int);
-   for (i = 0; i < num; i++)
-     atoms[i] = atoms_int[i];
-}
-
-
-
-
+   XWindowAttributes att;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
+     return EINA_FALSE;
 
-EAPI int
-ecore_x_window_attributes_get(Ecore_X_Window win, Ecore_X_Window_Attributes *att_ret)
-{
-   XWindowAttributes att;
-   
-   if (!XGetWindowAttributes(_ecore_x_disp, win, &att)) return 0;
    memset(att_ret, 0, sizeof(Ecore_X_Window_Attributes));
    att_ret->root = att.root;
    att_ret->x = att.x;
@@ -951,11 +1376,21 @@ ecore_x_window_attributes_get(Ecore_X_Window win, Ecore_X_Window_Attributes *att
    att_ret->h = att.height;
    att_ret->border = att.border_width;
    att_ret->depth = att.depth;
-   if (att.map_state != IsUnmapped) att_ret->visible = 1;
-   if (att.map_state == IsViewable) att_ret->viewable = 1;
-   if (att.override_redirect) att_ret->override = 1;
-   if (att.class == InputOnly) att_ret->input_only = 1;
-   if (att.save_under) att_ret->save_under = 1;
+   if (att.map_state != IsUnmapped)
+     att_ret->visible = 1;
+
+   if (att.map_state == IsViewable)
+     att_ret->viewable = 1;
+
+   if (att.override_redirect)
+     att_ret->override = 1;
+
+   if (att.class == InputOnly)
+     att_ret->input_only = 1;
+
+   if (att.save_under)
+     att_ret->save_under = 1;
+
    att_ret->event_mask.mine = att.your_event_mask;
    att_ret->event_mask.all = att.all_event_masks;
    att_ret->event_mask.no_propagate = att.do_not_propagate_mask;
@@ -963,185 +1398,240 @@ ecore_x_window_attributes_get(Ecore_X_Window win, Ecore_X_Window_Attributes *att
    att_ret->pixel_gravity = att.bit_gravity;
    att_ret->colormap = att.colormap;
    att_ret->visual = att.visual;
-   return 1;
+   return EINA_TRUE;
 }
 
 EAPI void
 ecore_x_window_save_set_add(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XAddToSaveSet(_ecore_x_disp, win);
 }
 
 EAPI void
 ecore_x_window_save_set_del(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XRemoveFromSaveSet(_ecore_x_disp, win);
 }
 
 EAPI Ecore_X_Window *
-ecore_x_window_children_get(Ecore_X_Window win, int *num)
+ecore_x_window_children_get(Ecore_X_Window win,
+                            int *num)
 {
-   Ecore_X_Window     *windows = NULL;
-   Window              root_ret = 0, parent_ret = 0, *children_ret = NULL;
-   unsigned int        children_ret_num = 0;
-   
+   Ecore_X_Window *windows = NULL;
+   Window root_ret = 0, parent_ret = 0, *children_ret = NULL;
+   unsigned int children_ret_num = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XQueryTree(_ecore_x_disp, win, &root_ret, &parent_ret, &children_ret,
-                  &children_ret_num))
-     {
-       return NULL;
-     }
+                   &children_ret_num))
+     return NULL;
+
    if (children_ret)
      {
-       windows = malloc(children_ret_num * sizeof(Ecore_X_Window));
-       if (windows)
-         {
-            unsigned int i;
-            
-            for (i = 0; i < children_ret_num; i++)
-              windows[i] = children_ret[i];
-            *num = children_ret_num;
-         }
-       XFree(children_ret);
+        windows = malloc(children_ret_num * sizeof(Ecore_X_Window));
+        if (windows)
+          {
+             unsigned int i;
+
+             for (i = 0; i < children_ret_num; i++)
+               windows[i] = children_ret[i];
+             *num = children_ret_num;
+          }
+
+        XFree(children_ret);
      }
+
    return windows;
 }
 
-EAPI int
-ecore_x_pointer_control_set(int accel_num, int accel_denom, int threshold)
+EAPI Eina_Bool
+ecore_x_pointer_control_set(int accel_num,
+                            int accel_denom,
+                            int threshold)
 {
-   return XChangePointerControl(_ecore_x_disp, 1, 1, 
-                               accel_num, accel_denom, threshold);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XChangePointerControl(_ecore_x_disp, 1, 1,
+                                accel_num, accel_denom, threshold) ? EINA_TRUE : EINA_FALSE;
 }
 
+EAPI Eina_Bool
+ecore_x_pointer_control_get(int *accel_num,
+                            int *accel_denom,
+                            int *threshold)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XGetPointerControl(_ecore_x_disp,
+                             accel_num, accel_denom, threshold) ? EINA_TRUE : EINA_FALSE;
+}
 
-EAPI int
-ecore_x_pointer_control_get(int *accel_num, int *accel_denom, int *threshold)
+EAPI Eina_Bool
+ecore_x_pointer_mapping_set(unsigned char *map,
+                            int nmap)
 {
-   return XGetPointerControl(_ecore_x_disp, 
-                               accel_num, accel_denom, threshold);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return (XSetPointerMapping(_ecore_x_disp, map, nmap) == MappingSuccess) ? EINA_TRUE : EINA_FALSE;
 }
 
-EAPI int
+EAPI Eina_Bool
+ecore_x_pointer_mapping_get(unsigned char *map,
+                            int nmap)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XGetPointerMapping(_ecore_x_disp, map, nmap) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
 ecore_x_pointer_grab(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (XGrabPointer(_ecore_x_disp, win, False,
-                   ButtonPressMask | ButtonReleaseMask | 
-                   EnterWindowMask | LeaveWindowMask | PointerMotionMask,
-                   GrabModeAsync, GrabModeAsync,
-                   None, None, CurrentTime) == GrabSuccess) return 1;
-   return 0;
+                    ButtonPressMask | ButtonReleaseMask |
+                    EnterWindowMask | LeaveWindowMask | PointerMotionMask,
+                    GrabModeAsync, GrabModeAsync,
+                    None, None, CurrentTime) == GrabSuccess)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_pointer_confine_grab(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (XGrabPointer(_ecore_x_disp, win, False,
-                   ButtonPressMask | ButtonReleaseMask | 
-                   EnterWindowMask | LeaveWindowMask | PointerMotionMask,
-                   GrabModeAsync, GrabModeAsync,
-                   win, None, CurrentTime) == GrabSuccess) return 1;
-   return 0;
+                    ButtonPressMask | ButtonReleaseMask |
+                    EnterWindowMask | LeaveWindowMask | PointerMotionMask,
+                    GrabModeAsync, GrabModeAsync,
+                    win, None, CurrentTime) == GrabSuccess)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
 }
 
 EAPI void
 ecore_x_pointer_ungrab(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XUngrabPointer(_ecore_x_disp, CurrentTime);
 }
 
-EAPI int
-ecore_x_pointer_warp(Ecore_X_Window win, int x, int y)
+EAPI Eina_Bool
+ecore_x_pointer_warp(Ecore_X_Window win,
+                     int x,
+                     int y)
 {
-   return XWarpPointer(_ecore_x_disp, None, win, 0, 0, 0, 0, x, y);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XWarpPointer(_ecore_x_disp, None, win, 0, 0, 0, 0, x, y) ? EINA_TRUE : EINA_FALSE;
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_keyboard_grab(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (XGrabKeyboard(_ecore_x_disp, win, False,
-                    GrabModeAsync, GrabModeAsync,
-                    CurrentTime) == GrabSuccess) return 1;
-   return 0;
+                     GrabModeAsync, GrabModeAsync,
+                     CurrentTime) == GrabSuccess)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
 }
 
 EAPI void
 ecore_x_keyboard_ungrab(void)
 {
-   XUngrabKeyboard(_ecore_x_disp, CurrentTime);   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XUngrabKeyboard(_ecore_x_disp, CurrentTime);
 }
 
 EAPI void
 ecore_x_grab(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_grab_count++;
-   
    if (_ecore_x_grab_count == 1)
-      XGrabServer(_ecore_x_disp);
+     XGrabServer(_ecore_x_disp);
 }
 
 EAPI void
 ecore_x_ungrab(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_grab_count--;
    if (_ecore_x_grab_count < 0)
-      _ecore_x_grab_count = 0;
+     _ecore_x_grab_count = 0;
 
    if (_ecore_x_grab_count == 0)
-   {
-      XUngrabServer(_ecore_x_disp);
-      XSync(_ecore_x_disp, False);
-   }
+     XUngrabServer(_ecore_x_disp);
 }
 
-int      _ecore_window_grabs_num = 0;
-Window  *_ecore_window_grabs = NULL;
-int    (*_ecore_window_grab_replay_func) (void *data, int event_type, void *event);
-void    *_ecore_window_grab_replay_data;
+int _ecore_window_grabs_num = 0;
+Window *_ecore_window_grabs = NULL;
+Eina_Bool (*_ecore_window_grab_replay_func)(void *data,
+                                            int event_type,
+                                            void *event);
+void *_ecore_window_grab_replay_data;
 
 EAPI void
-ecore_x_passive_grab_replay_func_set(int (*func) (void *data, int event_type, void *event), void *data)
+ecore_x_passive_grab_replay_func_set(Eina_Bool (*func)(void *data,
+                                                       int event_type,
+                                                       void *event),
+                                     void *data)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_window_grab_replay_func = func;
    _ecore_window_grab_replay_data = data;
 }
 
 EAPI void
-ecore_x_window_button_grab(Ecore_X_Window win, int button, 
-                          Ecore_X_Event_Mask event_mask,
-                          int mod, int any_mod)
-{
-   unsigned int        b;
-   unsigned int        m;
-   unsigned int        locks[8];
-   int                 i, ev;
-   
+ecore_x_window_button_grab(Ecore_X_Window win,
+                           int button,
+                           Ecore_X_Event_Mask event_mask,
+                           int mod,
+                           int any_mod)
+{
+   unsigned int b;
+   unsigned int m;
+   unsigned int locks[8];
+   int i, ev;
+   Window *t;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    b = button;
-   if (b == 0) b = AnyButton;
-   m = mod;
-   if (any_mod) m = AnyModifier;
+   if (b == 0)
+     b = AnyButton;
+
+   m = _ecore_x_event_modifier(mod);
+   if (any_mod)
+     m = AnyModifier;
+
    locks[0] = 0;
    locks[1] = ECORE_X_LOCK_CAPS;
    locks[2] = ECORE_X_LOCK_NUM;
    locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
    ev = event_mask;
    for (i = 0; i < 8; i++)
      XGrabButton(_ecore_x_disp, b, m | locks[i],
-                win, False, ev, GrabModeSync, GrabModeAsync, None, None);
+                 win, False, ev, GrabModeSync, GrabModeAsync, None, None);
    _ecore_window_grabs_num++;
-   _ecore_window_grabs = realloc(_ecore_window_grabs, 
-                                _ecore_window_grabs_num * sizeof(Window));
+   t = realloc(_ecore_window_grabs,
+               _ecore_window_grabs_num * sizeof(Window));
+   if (!t) return;
+   _ecore_window_grabs = t;
    _ecore_window_grabs[_ecore_window_grabs_num - 1] = win;
 }
 
 void
-_ecore_x_sync_magic_send(int val, Ecore_X_Window swin)
+_ecore_x_sync_magic_send(int val,
+                         Ecore_X_Window swin)
 {
    XEvent xev;
-   
+
    xev.xclient.type = ClientMessage;
    xev.xclient.serial = 0;
    xev.xclient.send_event = True;
@@ -1159,89 +1649,120 @@ void
 _ecore_x_window_grab_remove(Ecore_X_Window win)
 {
    int i, shuffle = 0;
-   
+   Window *t;
+
    if (_ecore_window_grabs_num > 0)
      {
-       for (i = 0; i < _ecore_window_grabs_num; i++)
-         {
-            if (shuffle) _ecore_window_grabs[i - 1] = _ecore_window_grabs[i];
-            if ((!shuffle) && (_ecore_window_grabs[i] == win))
-              shuffle = 1;
-         }
-       if (shuffle)
-         {
-            _ecore_window_grabs_num--;
-            _ecore_window_grabs = realloc(_ecore_window_grabs, 
-                                          _ecore_window_grabs_num * sizeof(Window));
-         }
+        for (i = 0; i < _ecore_window_grabs_num; i++)
+          {
+             if (shuffle)
+               _ecore_window_grabs[i - 1] = _ecore_window_grabs[i];
+
+             if ((!shuffle) && (_ecore_window_grabs[i] == win))
+               shuffle = 1;
+          }
+        if (shuffle)
+          {
+             _ecore_window_grabs_num--;
+             if (_ecore_window_grabs_num <= 0)
+               {
+                  free(_ecore_window_grabs);
+                  _ecore_window_grabs = NULL;
+                  return;
+               }
+             t = realloc(_ecore_window_grabs,
+                         _ecore_window_grabs_num *
+                         sizeof(Window));
+             if (!t) return;
+             _ecore_window_grabs = t;
+          }
      }
 }
 
 EAPI void
-ecore_x_window_button_ungrab(Ecore_X_Window win, int button, 
-                            int mod, int any_mod)
-{
-   unsigned int        b;
-   unsigned int        m;
-   unsigned int        locks[8];
-   int                 i;
-   
+ecore_x_window_button_ungrab(Ecore_X_Window win,
+                             int button,
+                             int mod,
+                             int any_mod)
+{
+   unsigned int b;
+   unsigned int m;
+   unsigned int locks[8];
+   int i;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    b = button;
-   if (b == 0) b = AnyButton;
-   m = mod;
-   if (any_mod) m = AnyModifier;
+   if (b == 0)
+     b = AnyButton;
+
+   m = _ecore_x_event_modifier(mod);
+   if (any_mod)
+     m = AnyModifier;
+
    locks[0] = 0;
    locks[1] = ECORE_X_LOCK_CAPS;
    locks[2] = ECORE_X_LOCK_NUM;
    locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
    for (i = 0; i < 8; i++)
      XUngrabButton(_ecore_x_disp, b, m | locks[i], win);
    _ecore_x_sync_magic_send(1, win);
 }
 
-int      _ecore_key_grabs_num = 0;
-Window  *_ecore_key_grabs = NULL;
+int _ecore_key_grabs_num = 0;
+Window *_ecore_key_grabs = NULL;
 
 EAPI void
-ecore_x_window_key_grab(Ecore_X_Window win, const char *key, 
-                       int mod, int any_mod)
-{
-   KeyCode             keycode = 0;
-   KeySym              keysym;
-   unsigned int        m;
-   unsigned int        locks[8];
-   int                 i;
-   
+ecore_x_window_key_grab(Ecore_X_Window win,
+                        const char *key,
+                        int mod,
+                        int any_mod)
+{
+   KeyCode keycode = 0;
+   KeySym keysym;
+   unsigned int m;
+   unsigned int locks[8];
+   int i;
+   Window *t;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!strncmp(key, "Keycode-", 8))
      keycode = atoi(key + 8);
    else
      {
-       keysym = XStringToKeysym(key);
-       if (keysym == NoSymbol) return;
-       keycode  = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key));
+        keysym = XStringToKeysym(key);
+        if (keysym == NoSymbol)
+          return;
+
+        keycode = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key));
      }
-   if (keycode == 0) return;
-   
-   m = mod;
-   if (any_mod) m = AnyModifier;
+
+   if (keycode == 0)
+     return;
+
+   m = _ecore_x_event_modifier(mod);
+   if (any_mod)
+     m = AnyModifier;
+
    locks[0] = 0;
    locks[1] = ECORE_X_LOCK_CAPS;
    locks[2] = ECORE_X_LOCK_NUM;
    locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
    for (i = 0; i < 8; i++)
      XGrabKey(_ecore_x_disp, keycode, m | locks[i],
-             win, False, GrabModeSync, GrabModeAsync);
+              win, False, GrabModeSync, GrabModeAsync);
    _ecore_key_grabs_num++;
-   _ecore_key_grabs = realloc(_ecore_key_grabs,
-                             _ecore_key_grabs_num * sizeof(Window));
+   t = realloc(_ecore_key_grabs,
+               _ecore_key_grabs_num * sizeof(Window));
+   if (!t) return;
+   _ecore_key_grabs = t;
    _ecore_key_grabs[_ecore_key_grabs_num - 1] = win;
 }
 
@@ -1249,54 +1770,74 @@ void
 _ecore_x_key_grab_remove(Ecore_X_Window win)
 {
    int i, shuffle = 0;
-   
+   Window *t;
+
    if (_ecore_key_grabs_num > 0)
      {
-       for (i = 0; i < _ecore_key_grabs_num; i++)
-         {
-            if (shuffle) _ecore_key_grabs[i - 1] = _ecore_key_grabs[i];
-            if ((!shuffle) && (_ecore_key_grabs[i] == win))
-              shuffle = 1;
-         }
-       if (shuffle)
-         {
-            _ecore_key_grabs_num--;
-            _ecore_key_grabs = realloc(_ecore_key_grabs, 
-                                       _ecore_key_grabs_num * sizeof(Window));
-         }
+        for (i = 0; i < _ecore_key_grabs_num; i++)
+          {
+             if (shuffle)
+               _ecore_key_grabs[i - 1] = _ecore_key_grabs[i];
+
+             if ((!shuffle) && (_ecore_key_grabs[i] == win))
+               shuffle = 1;
+          }
+        if (shuffle)
+          {
+             _ecore_key_grabs_num--;
+             if (_ecore_key_grabs_num <= 0)
+               {
+                  free(_ecore_key_grabs);
+                  _ecore_key_grabs = NULL;
+                  return;
+               }
+             t = realloc(_ecore_key_grabs,
+                         _ecore_key_grabs_num * sizeof(Window));
+             if (!t) return;
+             _ecore_key_grabs = t;
+          }
      }
 }
 
 EAPI void
-ecore_x_window_key_ungrab(Ecore_X_Window win, const char *key,
-                         int mod, int any_mod)
+ecore_x_window_key_ungrab(Ecore_X_Window win,
+                          const char *key,
+                          int mod,
+                          int any_mod)
 {
-   KeyCode             keycode = 0;
-   KeySym              keysym;
-   unsigned int        m;
-   unsigned int        locks[8];
-   int                 i;
+   KeyCode keycode = 0;
+   KeySym keysym;
+   unsigned int m;
+   unsigned int locks[8];
+   int i;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!strncmp(key, "Keycode-", 8))
      keycode = atoi(key + 8);
    else
      {
-       keysym = XStringToKeysym(key);
-       if (keysym == NoSymbol) return;
-       keycode  = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key));
+        keysym = XStringToKeysym(key);
+        if (keysym == NoSymbol)
+          return;
+
+        keycode = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key));
      }
-   if (keycode == 0) return;
-   
-   m = mod;
-   if (any_mod) m = AnyModifier;
+
+   if (keycode == 0)
+     return;
+
+   m = _ecore_x_event_modifier(mod);
+   if (any_mod)
+     m = AnyModifier;
+
    locks[0] = 0;
    locks[1] = ECORE_X_LOCK_CAPS;
    locks[2] = ECORE_X_LOCK_NUM;
    locks[3] = ECORE_X_LOCK_SCROLL;
-   locks[4] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM;
-   locks[5] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_SCROLL;
-   locks[6] = ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
-   locks[7] = ECORE_X_LOCK_CAPS   | ECORE_X_LOCK_NUM    | ECORE_X_LOCK_SCROLL;
+   locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
+   locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
+   locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
+   locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
    for (i = 0; i < 8; i++)
      XUngrabKey(_ecore_x_disp, keycode, m | locks[i], win);
    _ecore_x_sync_magic_send(2, win);
@@ -1307,32 +1848,39 @@ ecore_x_window_key_ungrab(Ecore_X_Window win, const char *key,
  *
  * @param win     The window the message is sent to.
  * @param type    The client message type.
+ * @param mask    The mask of the message to be sent.
  * @param d0      The client message data item 1
  * @param d1      The client message data item 2
  * @param d2      The client message data item 3
  * @param d3      The client message data item 4
  * @param d4      The client message data item 5
  *
- * @return !0 on success.
+ * @return @c EINA_TRUE on success @c EINA_FALSE otherwise.
  */
-EAPI int
-ecore_x_client_message32_send(Ecore_X_Window win, Ecore_X_Atom type,
-                             Ecore_X_Event_Mask mask,
-                             long d0, long d1, long d2, long d3, long d4)
+EAPI Eina_Bool
+ecore_x_client_message32_send(Ecore_X_Window win,
+                              Ecore_X_Atom type,
+                              Ecore_X_Event_Mask mask,
+                              long d0,
+                              long d1,
+                              long d2,
+                              long d3,
+                              long d4)
 {
-    XEvent xev;
+   XEvent xev;
 
-    xev.xclient.window = win;
-    xev.xclient.type = ClientMessage;
-    xev.xclient.message_type = type;
-    xev.xclient.format = 32;
-    xev.xclient.data.l[0] = d0;
-    xev.xclient.data.l[1] = d1;
-    xev.xclient.data.l[2] = d2;
-    xev.xclient.data.l[3] = d3;
-    xev.xclient.data.l[4] = d4;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.window = win;
+   xev.xclient.type = ClientMessage;
+   xev.xclient.message_type = type;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = d0;
+   xev.xclient.data.l[1] = d1;
+   xev.xclient.data.l[2] = d2;
+   xev.xclient.data.l[3] = d3;
+   xev.xclient.data.l[4] = d4;
 
-    return XSendEvent(_ecore_x_disp, win, False, mask, &xev);
+   return XSendEvent(_ecore_x_disp, win, False, mask, &xev) ? EINA_TRUE : EINA_FALSE;
 }
 
 /**
@@ -1341,36 +1889,43 @@ ecore_x_client_message32_send(Ecore_X_Window win, Ecore_X_Atom type,
  * @param win     The window the message is sent to.
  * @param type    The client message type.
  * @param data    Data to be sent.
- * @param len     Number of data bytes, max 20.
+ * @param len     Number of data bytes, max @c 20.
  *
- * @return !0 on success.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
  */
-EAPI int
-ecore_x_client_message8_send(Ecore_X_Window win, Ecore_X_Atom type,
-                            const void *data, int len)
+EAPI Eina_Bool
+ecore_x_client_message8_send(Ecore_X_Window win,
+                             Ecore_X_Atom type,
+                             const void *data,
+                             int len)
 {
-    XEvent xev;
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.window = win;
+   xev.xclient.type = ClientMessage;
+   xev.xclient.message_type = type;
+   xev.xclient.format = 8;
+   if (len > 20)
+     len = 20;
 
-    xev.xclient.window = win;
-    xev.xclient.type = ClientMessage;
-    xev.xclient.message_type = type;
-    xev.xclient.format = 8;
-    if (len > 20)
-        len = 20;
-    memcpy(xev.xclient.data.b, data, len);
-    memset(xev.xclient.data.b + len, 0, 20 - len);
+   memcpy(xev.xclient.data.b, data, len);
+   memset(xev.xclient.data.b + len, 0, 20 - len);
 
-    return XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
+   return XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev) ? EINA_TRUE : EINA_FALSE;
 }
 
-EAPI int
-ecore_x_mouse_move_send(Ecore_X_Window win, int x, int y)
+EAPI Eina_Bool
+ecore_x_mouse_move_send(Ecore_X_Window win,
+                        int x,
+                        int y)
 {
    XEvent xev;
    XWindowAttributes att;
    Window tw;
    int rx, ry;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetWindowAttributes(_ecore_x_disp, win, &att);
    XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
    xev.xmotion.type = MotionNotify;
@@ -1385,17 +1940,21 @@ ecore_x_mouse_move_send(Ecore_X_Window win, int x, int y)
    xev.xmotion.state = 0;
    xev.xmotion.is_hint = 0;
    xev.xmotion.same_screen = 1;
-   return XSendEvent(_ecore_x_disp, win, True, PointerMotionMask, &xev);
+   return XSendEvent(_ecore_x_disp, win, True, PointerMotionMask, &xev) ? EINA_TRUE : EINA_FALSE;
 }
 
-EAPI int
-ecore_x_mouse_down_send(Ecore_X_Window win, int x, int y, int b)
+EAPI Eina_Bool
+ecore_x_mouse_down_send(Ecore_X_Window win,
+                        int x,
+                        int y,
+                        int b)
 {
    XEvent xev;
    XWindowAttributes att;
    Window tw;
    int rx, ry;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetWindowAttributes(_ecore_x_disp, win, &att);
    XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
    xev.xbutton.type = ButtonPress;
@@ -1410,17 +1969,21 @@ ecore_x_mouse_down_send(Ecore_X_Window win, int x, int y, int b)
    xev.xbutton.state = 1 << b;
    xev.xbutton.button = b;
    xev.xbutton.same_screen = 1;
-   return XSendEvent(_ecore_x_disp, win, True, ButtonPressMask, &xev);
+   return XSendEvent(_ecore_x_disp, win, True, ButtonPressMask, &xev) ? EINA_TRUE : EINA_FALSE;
 }
 
-EAPI int
-ecore_x_mouse_up_send(Ecore_X_Window win, int x, int y, int b)
+EAPI Eina_Bool
+ecore_x_mouse_up_send(Ecore_X_Window win,
+                      int x,
+                      int y,
+                      int b)
 {
    XEvent xev;
    XWindowAttributes att;
    Window tw;
    int rx, ry;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetWindowAttributes(_ecore_x_disp, win, &att);
    XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
    xev.xbutton.type = ButtonRelease;
@@ -1435,40 +1998,219 @@ ecore_x_mouse_up_send(Ecore_X_Window win, int x, int y, int b)
    xev.xbutton.state = 0;
    xev.xbutton.button = b;
    xev.xbutton.same_screen = 1;
-   return XSendEvent(_ecore_x_disp, win, True, ButtonReleaseMask, &xev);
+   return XSendEvent(_ecore_x_disp, win, True, ButtonReleaseMask, &xev) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_mouse_in_send(Ecore_X_Window win,
+                      int x,
+                      int y)
+{
+   XEvent xev;
+   XWindowAttributes att;
+   Window tw;
+   int rx, ry;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XGetWindowAttributes(_ecore_x_disp, win, &att);
+   XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
+   xev.xcrossing.type = EnterNotify;
+   xev.xcrossing.window = win;
+   xev.xcrossing.root = att.root;
+   xev.xcrossing.subwindow = win;
+   xev.xcrossing.time = _ecore_x_event_last_time;
+   xev.xcrossing.x = x;
+   xev.xcrossing.y = y;
+   xev.xcrossing.x_root = rx;
+   xev.xcrossing.y_root = ry;
+   xev.xcrossing.mode = NotifyNormal;
+   xev.xcrossing.detail = NotifyNonlinear;
+   xev.xcrossing.same_screen = 1;
+   xev.xcrossing.focus = 0;
+   xev.xcrossing.state = 0;
+   return XSendEvent(_ecore_x_disp, win, True, EnterWindowMask, &xev) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_mouse_out_send(Ecore_X_Window win,
+                      int x,
+                      int y)
+{
+   XEvent xev;
+   XWindowAttributes att;
+   Window tw;
+   int rx, ry;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XGetWindowAttributes(_ecore_x_disp, win, &att);
+   XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
+   xev.xcrossing.type = LeaveNotify;
+   xev.xcrossing.window = win;
+   xev.xcrossing.root = att.root;
+   xev.xcrossing.subwindow = win;
+   xev.xcrossing.time = _ecore_x_event_last_time;
+   xev.xcrossing.x = x;
+   xev.xcrossing.y = y;
+   xev.xcrossing.x_root = rx;
+   xev.xcrossing.y_root = ry;
+   xev.xcrossing.mode = NotifyNormal;
+   xev.xcrossing.detail = NotifyNonlinear;
+   xev.xcrossing.same_screen = 1;
+   xev.xcrossing.focus = 0;
+   xev.xcrossing.state = 0;
+   return XSendEvent(_ecore_x_disp, win, True, LeaveWindowMask, &xev) ? EINA_TRUE : EINA_FALSE;
 }
 
 EAPI void
 ecore_x_focus_reset(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSetInputFocus(_ecore_x_disp, PointerRoot, RevertToPointerRoot, CurrentTime);
 }
 
 EAPI void
 ecore_x_events_allow_all(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XAllowEvents(_ecore_x_disp, AsyncBoth, CurrentTime);
 }
 
 EAPI void
-ecore_x_pointer_last_xy_get(int *x, int *y)
+ecore_x_pointer_last_xy_get(int *x,
+                            int *y)
 {
-   if (x) *x = _ecore_x_event_last_root_x;
-   if (y) *y = _ecore_x_event_last_root_y;
+   if (x)
+     *x = _ecore_x_event_last_root_x;
+
+   if (y)
+     *y = _ecore_x_event_last_root_y;
 }
 
 EAPI void
-ecore_x_pointer_xy_get(Ecore_X_Window win, int *x, int *y)
+ecore_x_pointer_xy_get(Ecore_X_Window win,
+                       int *x,
+                       int *y)
 {
    Window rwin, cwin;
    int rx, ry, wx, wy, ret;
    unsigned int mask;
-   
-   ret = XQueryPointer(_ecore_x_disp, win, &rwin, &cwin, &rx, &ry, &wx, &wy, &mask);
-   if (!ret) wx = wy = -1;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = XQueryPointer(_ecore_x_disp, win, &rwin, &cwin,
+                       &rx, &ry, &wx, &wy, &mask);
+   if (!ret)
+     wx = wy = -1;
+
    if (x) *x = wx;
    if (y) *y = wy;
 }
+
+/**
+ * Retrieve the Visual ID from a given Visual.
+ *
+ * @param visual  The Visual to get the ID for.
+ *
+ * @return The visual id.
+ * @since 1.1.0
+ */
+EAPI unsigned int
+ecore_x_visual_id_get(Ecore_X_Visual visual)
+{
+   return XVisualIDFromVisual(visual);
+}
+
+/**
+ * Retrieve the default Visual.
+ *
+ * @param disp  The Display to get the Default Visual from
+ * @param screen The Screen.
+ *
+ * @return The default visual.
+ * @since 1.1.0
+ */
+EAPI Ecore_X_Visual
+ecore_x_default_visual_get(Ecore_X_Display *disp,
+                           Ecore_X_Screen *screen)
+{
+   return DefaultVisual(disp, ecore_x_screen_index_get(screen));
+}
+
+/**
+ * Retrieve the default Colormap.
+ *
+ * @param disp  The Display to get the Default Colormap from
+ * @param screen The Screen.
+ *
+ * @return The default colormap.
+ * @since 1.1.0
+ */
+EAPI Ecore_X_Colormap
+ecore_x_default_colormap_get(Ecore_X_Display *disp,
+                             Ecore_X_Screen *screen)
+{
+   return DefaultColormap(disp, ecore_x_screen_index_get(screen));
+}
+
+/**
+ * Retrieve the default depth.
+ *
+ * @param disp  The Display to get the Default Depth from
+ * @param screen The Screen.
+ *
+ * @return The default depth.
+ * @since 1.1.0
+ */
+EAPI int
+ecore_x_default_depth_get(Ecore_X_Display *disp,
+                          Ecore_X_Screen *screen)
+{
+   return DefaultDepth(disp, ecore_x_screen_index_get(screen));
+}
+
+EAPI void
+ecore_x_xkb_select_group(int group)
+{
+#ifdef ECORE_XKB
+   XkbLockGroup(_ecore_x_disp, XkbUseCoreKbd, group);
+#endif
+}
+
 /*****************************************************************************/
 /*****************************************************************************/
 /*****************************************************************************/
+
+static int
+_ecore_x_event_modifier(unsigned int state)
+{
+   int xmodifiers = 0;
+
+   if (state & ECORE_EVENT_MODIFIER_SHIFT)
+     xmodifiers |= ECORE_X_MODIFIER_SHIFT;
+
+   if (state & ECORE_EVENT_MODIFIER_CTRL)
+     xmodifiers |= ECORE_X_MODIFIER_CTRL;
+
+   if (state & ECORE_EVENT_MODIFIER_ALT)
+     xmodifiers |= ECORE_X_MODIFIER_ALT;
+
+   if (state & ECORE_EVENT_MODIFIER_WIN)
+     xmodifiers |= ECORE_X_MODIFIER_WIN;
+
+   if (state & ECORE_EVENT_MODIFIER_ALTGR)
+     xmodifiers |= ECORE_X_MODIFIER_ALTGR;
+
+   if (state & ECORE_EVENT_LOCK_SCROLL)
+     xmodifiers |= ECORE_X_LOCK_SCROLL;
+
+   if (state & ECORE_EVENT_LOCK_NUM)
+     xmodifiers |= ECORE_X_LOCK_NUM;
+
+   if (state & ECORE_EVENT_LOCK_CAPS)
+     xmodifiers |= ECORE_X_LOCK_CAPS;
+
+   if (state & ECORE_EVENT_LOCK_SHIFT)
+     xmodifiers |= ECORE_X_LOCK_SHIFT;
+
+   return xmodifiers;
+}
+
index 0ca85c1..6518264 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else /* ifdef HAVE_ALLOCA_H */
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif /* ifdef  __cplusplus */
+void *alloca(size_t);
+#endif /* ifdef HAVE_ALLOCA_H */
+
+#include <string.h>
 
-#include "config.h"
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include "Ecore_X_Atoms.h"
-
 #include "ecore_x_atoms_decl.h"
 
-typedef struct
-{
-   const char   *name;
-   Ecore_X_Atom *atom;
-} Atom_Item;
-
 void
 _ecore_x_atoms_init(void)
 {
-   const Atom_Item items[] =
-     {
-       { "ATOM", &ECORE_X_ATOM_ATOM },
-       { "CARDINAL", &ECORE_X_ATOM_CARDINAL },
-       { "COMPOUND_TEXT", &ECORE_X_ATOM_COMPOUND_TEXT },
-       { "FILE_NAME", &ECORE_X_ATOM_FILE_NAME },
-       { "STRING", &ECORE_X_ATOM_STRING },
-       { "TEXT", &ECORE_X_ATOM_TEXT },
-       { "UTF8_STRING", &ECORE_X_ATOM_UTF8_STRING },
-       { "WINDOW", &ECORE_X_ATOM_WINDOW },
-
-       { "JXSelectionWindowProperty", &ECORE_X_ATOM_SELECTION_PROP_XDND },
-       { "XdndSelection", &ECORE_X_ATOM_SELECTION_XDND },
-       { "XdndAware", &ECORE_X_ATOM_XDND_AWARE },
-       { "XdndEnter", &ECORE_X_ATOM_XDND_ENTER },
-       { "XdndTypeList", &ECORE_X_ATOM_XDND_TYPE_LIST },
-       { "XdndPosition", &ECORE_X_ATOM_XDND_POSITION },
-       { "XdndActionCopy", &ECORE_X_ATOM_XDND_ACTION_COPY },
-       { "XdndActionMove", &ECORE_X_ATOM_XDND_ACTION_MOVE },
-       { "XdndActionPrivate", &ECORE_X_ATOM_XDND_ACTION_PRIVATE },
-       { "XdndActionAsk", &ECORE_X_ATOM_XDND_ACTION_ASK },
-       { "XdndActionList", &ECORE_X_ATOM_XDND_ACTION_LIST },
-       { "XdndActionLink", &ECORE_X_ATOM_XDND_ACTION_LINK },
-       { "XdndActionDescription", &ECORE_X_ATOM_XDND_ACTION_DESCRIPTION },
-       { "XdndProxy", &ECORE_X_ATOM_XDND_PROXY },
-       { "XdndStatus", &ECORE_X_ATOM_XDND_STATUS },
-       { "XdndLeave", &ECORE_X_ATOM_XDND_LEAVE },
-       { "XdndDrop", &ECORE_X_ATOM_XDND_DROP },
-       { "XdndFinished", &ECORE_X_ATOM_XDND_FINISHED },
-
-       { "XdndActionCopy", &ECORE_X_DND_ACTION_COPY },
-       { "XdndActionMove", &ECORE_X_DND_ACTION_MOVE },
-       { "XdndActionLink", &ECORE_X_DND_ACTION_LINK },
-       { "XdndActionAsk", &ECORE_X_DND_ACTION_ASK },
-       { "XdndActionPrivate", &ECORE_X_DND_ACTION_PRIVATE },
-
-       { "_E_FRAME_SIZE", &ECORE_X_ATOM_E_FRAME_SIZE },
-
-       { "_WIN_LAYER", &ECORE_X_ATOM_WIN_LAYER },
-
-       { "WM_NAME", &ECORE_X_ATOM_WM_NAME },
-       { "WM_ICON_NAME", &ECORE_X_ATOM_WM_ICON_NAME },
-       { "WM_NORMAL_HINTS", &ECORE_X_ATOM_WM_NORMAL_HINTS },
-       { "WM_SIZE_HINTS", &ECORE_X_ATOM_WM_SIZE_HINTS },
-       { "WM_HINTS", &ECORE_X_ATOM_WM_HINTS },
-       { "WM_CLASS", &ECORE_X_ATOM_WM_CLASS },
-       { "WM_TRANSIENT_FOR", &ECORE_X_ATOM_WM_TRANSIENT_FOR },
-       { "WM_PROTOCOLS", &ECORE_X_ATOM_WM_PROTOCOLS },
-       { "WM_COLORMAP_WINDOWS", &ECORE_X_ATOM_WM_COLORMAP_WINDOWS },
-       { "WM_COMMAND", &ECORE_X_ATOM_WM_COMMAND },
-       { "WM_CLIENT_MACHINE", &ECORE_X_ATOM_WM_CLIENT_MACHINE },
-
-       { "WM_STATE", &ECORE_X_ATOM_WM_STATE },
-       { "WM_ICON_SIZE", &ECORE_X_ATOM_WM_ICON_SIZE },
-
-       { "WM_CHANGE_STATE", &ECORE_X_ATOM_WM_CHANGE_STATE },
-
-       { "WM_TAKE_FOCUS", &ECORE_X_ATOM_WM_TAKE_FOCUS },
-       { "WM_SAVE_YOURSELF", &ECORE_X_ATOM_WM_SAVE_YOURSELF },
-       { "WM_DELETE_WINDOW", &ECORE_X_ATOM_WM_DELETE_WINDOW },
-
-       { "WM_COLORMAP_NOTIFY", &ECORE_X_ATOM_WM_COLORMAP_NOTIFY },
-
-       { "SM_CLIENT_ID", &ECORE_X_ATOM_SM_CLIENT_ID },
-       { "WM_CLIENT_LEADER", &ECORE_X_ATOM_WM_CLIENT_LEADER },
-       { "WM_WINDOW_ROLE", &ECORE_X_ATOM_WM_WINDOW_ROLE },
-
-       { "_MOTIF_WM_HINTS", &ECORE_X_ATOM_MOTIF_WM_HINTS },
-
-       { "_NET_SUPPORTED", &ECORE_X_ATOM_NET_SUPPORTED },
-       { "_NET_CLIENT_LIST", &ECORE_X_ATOM_NET_CLIENT_LIST },
-       { "_NET_CLIENT_LIST_STACKING", &ECORE_X_ATOM_NET_CLIENT_LIST_STACKING },
-       { "_NET_NUMBER_OF_DESKTOPS", &ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS },
-       { "_NET_DESKTOP_GEOMETRY", &ECORE_X_ATOM_NET_DESKTOP_GEOMETRY },
-       { "_NET_DESKTOP_VIEWPORT", &ECORE_X_ATOM_NET_DESKTOP_VIEWPORT },
-       { "_NET_CURRENT_DESKTOP", &ECORE_X_ATOM_NET_CURRENT_DESKTOP },
-       { "_NET_DESKTOP_NAMES", &ECORE_X_ATOM_NET_DESKTOP_NAMES },
-       { "_NET_ACTIVE_WINDOW", &ECORE_X_ATOM_NET_ACTIVE_WINDOW },
-       { "_NET_WORKAREA", &ECORE_X_ATOM_NET_WORKAREA },
-       { "_NET_SUPPORTING_WM_CHECK", &ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK },
-       { "_NET_VIRTUAL_ROOTS", &ECORE_X_ATOM_NET_VIRTUAL_ROOTS },
-       { "_NET_DESKTOP_LAYOUT", &ECORE_X_ATOM_NET_DESKTOP_LAYOUT },
-       { "_NET_SHOWING_DESKTOP", &ECORE_X_ATOM_NET_SHOWING_DESKTOP },
-
-       { "_NET_CLOSE_WINDOW", &ECORE_X_ATOM_NET_CLOSE_WINDOW },
-       { "_NET_MOVERESIZE_WINDOW", &ECORE_X_ATOM_NET_MOVERESIZE_WINDOW },
-       { "_NET_WM_MOVERESIZE", &ECORE_X_ATOM_NET_WM_MOVERESIZE },
-       { "_NET_RESTACK_WINDOW", &ECORE_X_ATOM_NET_RESTACK_WINDOW },
-
-       { "_NET_REQUEST_FRAME_EXTENTS", &ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS },
-
-       { "_NET_WM_NAME", &ECORE_X_ATOM_NET_WM_NAME },
-       { "_NET_WM_VISIBLE_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_NAME },
-       { "_NET_WM_ICON_NAME", &ECORE_X_ATOM_NET_WM_ICON_NAME },
-       { "_NET_WM_VISIBLE_ICON_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME },
-       { "_NET_WM_DESKTOP", &ECORE_X_ATOM_NET_WM_DESKTOP },
-
-       { "_NET_WM_WINDOW_TYPE", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE },
-       { "_NET_WM_WINDOW_TYPE_DESKTOP", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP },
-       { "_NET_WM_WINDOW_TYPE_DOCK", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK },
-       { "_NET_WM_WINDOW_TYPE_TOOLBAR", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR },
-       { "_NET_WM_WINDOW_TYPE_MENU", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU },
-       { "_NET_WM_WINDOW_TYPE_UTILITY", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY },
-       { "_NET_WM_WINDOW_TYPE_SPLASH", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH },
-       { "_NET_WM_WINDOW_TYPE_DIALOG", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG },
-       { "_NET_WM_WINDOW_TYPE_NORMAL", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL },
-
-       { "_NET_WM_STATE", &ECORE_X_ATOM_NET_WM_STATE },
-       { "_NET_WM_STATE_MODAL", &ECORE_X_ATOM_NET_WM_STATE_MODAL },
-       { "_NET_WM_STATE_STICKY", &ECORE_X_ATOM_NET_WM_STATE_STICKY },
-       { "_NET_WM_STATE_MAXIMIZED_VERT", &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT },
-       { "_NET_WM_STATE_MAXIMIZED_HORZ", &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ },
-       { "_NET_WM_STATE_SHADED", &ECORE_X_ATOM_NET_WM_STATE_SHADED },
-       { "_NET_WM_STATE_SKIP_TASKBAR", &ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR },
-       { "_NET_WM_STATE_SKIP_PAGER", &ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER },
-       { "_NET_WM_STATE_HIDDEN", &ECORE_X_ATOM_NET_WM_STATE_HIDDEN },
-       { "_NET_WM_STATE_FULLSCREEN", &ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN },
-       { "_NET_WM_STATE_ABOVE", &ECORE_X_ATOM_NET_WM_STATE_ABOVE },
-       { "_NET_WM_STATE_BELOW", &ECORE_X_ATOM_NET_WM_STATE_BELOW },
-       { "_NET_WM_STATE_DEMANDS_ATTENTION", &ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION },
-
-       { "_NET_WM_ALLOWED_ACTIONS", &ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS },
-       { "_NET_WM_ACTION_MOVE", &ECORE_X_ATOM_NET_WM_ACTION_MOVE },
-       { "_NET_WM_ACTION_RESIZE", &ECORE_X_ATOM_NET_WM_ACTION_RESIZE },
-       { "_NET_WM_ACTION_MINIMIZE", &ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE },
-       { "_NET_WM_ACTION_SHADE", &ECORE_X_ATOM_NET_WM_ACTION_SHADE },
-       { "_NET_WM_ACTION_STICK", &ECORE_X_ATOM_NET_WM_ACTION_STICK },
-       { "_NET_WM_ACTION_MAXIMIZE_HORZ", &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ },
-       { "_NET_WM_ACTION_MAXIMIZE_VERT", &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT },
-       { "_NET_WM_ACTION_FULLSCREEN", &ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN },
-       { "_NET_WM_ACTION_CHANGE_DESKTOP", &ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP },
-       { "_NET_WM_ACTION_CLOSE", &ECORE_X_ATOM_NET_WM_ACTION_CLOSE },
-
-       { "_NET_WM_STRUT", &ECORE_X_ATOM_NET_WM_STRUT },
-       { "_NET_WM_STRUT_PARTIAL", &ECORE_X_ATOM_NET_WM_STRUT_PARTIAL },
-       { "_NET_WM_ICON_GEOMETRY", &ECORE_X_ATOM_NET_WM_ICON_GEOMETRY },
-       { "_NET_WM_ICON", &ECORE_X_ATOM_NET_WM_ICON },
-       { "_NET_WM_PID", &ECORE_X_ATOM_NET_WM_PID },
-       { "_NET_WM_HANDLED_ICONS", &ECORE_X_ATOM_NET_WM_HANDLED_ICONS },
-       { "_NET_WM_USER_TIME", &ECORE_X_ATOM_NET_WM_USER_TIME },
-       { "_NET_STARTUP_ID", &ECORE_X_ATOM_NET_STARTUP_ID },
-       { "_NET_FRAME_EXTENTS", &ECORE_X_ATOM_NET_FRAME_EXTENTS },
-
-       { "_NET_WM_PING", &ECORE_X_ATOM_NET_WM_PING },
-       { "_NET_WM_SYNC_REQUEST", &ECORE_X_ATOM_NET_WM_SYNC_REQUEST },
-       { "_NET_WM_SYNC_REQUEST_COUNTER", &ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER },
-
-       { "_NET_WM_WINDOW_OPACITY", &ECORE_X_ATOM_NET_WM_WINDOW_OPACITY },
-       { "_NET_WM_WINDOW_SHADOW", &ECORE_X_ATOM_NET_WM_WINDOW_SHADOW },
-       { "_NET_WM_WINDOW_SHADE", &ECORE_X_ATOM_NET_WM_WINDOW_SHADE },
-
-       { "TARGETS", &ECORE_X_ATOM_SELECTION_TARGETS },
-       { "CLIPBOARD", &ECORE_X_ATOM_SELECTION_PRIMARY },
-       { "PRIMARY", &ECORE_X_ATOM_SELECTION_SECONDARY },
-       { "SECONDARY", &ECORE_X_ATOM_SELECTION_CLIPBOARD },
-       { "_ECORE_SELECTION_PRIMARY", &ECORE_X_ATOM_SELECTION_PROP_PRIMARY },
-       { "_ECORE_SELECTION_SECONDARY", &ECORE_X_ATOM_SELECTION_PROP_SECONDARY },
-       { "_ECORE_SELECTION_CLIPBOARD", &ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD },
-
-       { "_E_VIRTUAL_KEYBOARD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD },
-       { "_E_VIRTUAL_KEYBOARD_STATE", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE },
-       { "_E_VIRTUAL_KEYBOARD_ON", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON },
-       { "_E_VIRTUAL_KEYBOARD_OFF", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF },
-       { "_E_VIRTUAL_KEYBOARD_ALPHA", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA },
-       { "_E_VIRTUAL_KEYBOARD_NUMERIC", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC },
-       { "_E_VIRTUAL_KEYBOARD_PIN", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN },
-       { "_E_VIRTUAL_KEYBOARD_PHONE_NUMBER", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER },
-       { "_E_VIRTUAL_KEYBOARD_HEX", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX },
-       { "_E_VIRTUAL_KEYBOARD_TERMINAL", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL },
-       { "_E_VIRTUAL_KEYBOARD_PASSWORD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD }
-     };
    Atom *atoms;
    char **names;
    int i, num;
 
-   num = sizeof(items) / sizeof(Atom_Item);
+   num = sizeof(atom_items) / sizeof(Atom_Item);
    atoms = alloca(num * sizeof(Atom));
    names = alloca(num * sizeof(char *));
-   for (i = 0; i < num; i++) names[i] = (char *)items[i].name;
+   for (i = 0; i < num; i++)
+     names[i] = (char *) atom_items[i].name;
    XInternAtoms(_ecore_x_disp, names, num, False, atoms);
-   for (i = 0; i < num; i++) *(items[i].atom) = atoms[i];
+   for (i = 0; i < num; i++)
+     *(atom_items[i].atom) = atoms[i];
+}
+
+/**
+ * Retrieves the atom value associated with the given name.
+ * @param  name The given name.
+ * @return Associated atom value.
+ */
+EAPI Ecore_X_Atom
+ecore_x_atom_get(const char *name)
+{
+   if (!_ecore_x_disp)
+     return 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XInternAtom(_ecore_x_disp, name, False);
 }
+
+EAPI void
+ecore_x_atoms_get(const char **names,
+                  int num,
+                  Ecore_X_Atom *atoms)
+{
+   Atom *atoms_int;
+   int i;
+
+   if (!_ecore_x_disp)
+     return;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atoms_int = alloca(num * sizeof(Atom));
+   XInternAtoms(_ecore_x_disp, (char **)names, num, False, atoms_int);
+   for (i = 0; i < num; i++)
+     atoms[i] = atoms_int[i];
+}
+
+EAPI char *
+ecore_x_atom_name_get(Ecore_X_Atom atom)
+{
+   char *name;
+   char *xname;
+
+   if (!_ecore_x_disp)
+     return NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xname = XGetAtomName(_ecore_x_disp, atom);
+   if (!xname)
+     return NULL;
+
+   name = strdup(xname);
+   XFree(xname);
+
+   return name;
+}
+
index 486d042..b919db9 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
 
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 
-static int _composite_available;
+static Eina_Bool _composite_available = EINA_FALSE;
 
 void
 _ecore_x_composite_init(void)
 {
-   _composite_available = 0;
+   _composite_available = EINA_FALSE;
 
 #ifdef ECORE_XCOMPOSITE
    int major, minor;
 
    if (XCompositeQueryVersion(_ecore_x_disp, &major, &minor))
-     _composite_available = 1;
+     {
+# ifdef ECORE_XRENDER
+        if (XRenderQueryExtension(_ecore_x_disp, &major, &minor))
+          {
+#  ifdef ECORE_XFIXES
+             if (XFixesQueryVersion(_ecore_x_disp, &major, &minor))
+               {
+                  _composite_available = EINA_TRUE;
+               }
+#  endif
+          }
+# endif
+     }
 #endif
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_composite_query(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _composite_available;
 }
+
+EAPI void
+ecore_x_composite_redirect_window(Ecore_X_Window win,
+                                  Ecore_X_Composite_Update_Type type)
+{
+#ifdef ECORE_XCOMPOSITE
+   int update = CompositeRedirectAutomatic;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = CompositeRedirectAutomatic;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = CompositeRedirectManual;
+        break;
+     }
+   XCompositeRedirectWindow(_ecore_x_disp, win, update);
+#endif /* ifdef ECORE_XCOMPOSITE */
+}
+
+EAPI void
+ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
+                                      Ecore_X_Composite_Update_Type type)
+{
+#ifdef ECORE_XCOMPOSITE
+   int update = CompositeRedirectAutomatic;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = CompositeRedirectAutomatic;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = CompositeRedirectManual;
+        break;
+     }
+   XCompositeRedirectSubwindows(_ecore_x_disp, win, update);
+#endif /* ifdef ECORE_XCOMPOSITE */
+}
+
+EAPI void
+ecore_x_composite_unredirect_window(Ecore_X_Window win,
+                                    Ecore_X_Composite_Update_Type type)
+{
+#ifdef ECORE_XCOMPOSITE
+   int update = CompositeRedirectAutomatic;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = CompositeRedirectAutomatic;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = CompositeRedirectManual;
+        break;
+     }
+   XCompositeUnredirectWindow(_ecore_x_disp, win, update);
+#endif /* ifdef ECORE_XCOMPOSITE */
+}
+
+EAPI void
+ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
+                                        Ecore_X_Composite_Update_Type type)
+{
+#ifdef ECORE_XCOMPOSITE
+   int update = CompositeRedirectAutomatic;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   switch (type)
+     {
+      case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
+        update = CompositeRedirectAutomatic;
+        break;
+
+      case ECORE_X_COMPOSITE_UPDATE_MANUAL:
+        update = CompositeRedirectManual;
+        break;
+     }
+   XCompositeUnredirectSubwindows(_ecore_x_disp, win, update);
+#endif /* ifdef ECORE_XCOMPOSITE */
+}
+
+EAPI Ecore_X_Pixmap
+ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
+{
+   Ecore_X_Pixmap pixmap = None;
+#ifdef ECORE_XCOMPOSITE
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   pixmap = XCompositeNameWindowPixmap(_ecore_x_disp, win);
+#endif /* ifdef ECORE_XCOMPOSITE */
+   return pixmap;
+}
+
+EAPI void
+ecore_x_composite_window_events_disable(Ecore_X_Window win)
+{
+#ifdef ECORE_XCOMPOSITE
+   ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
+#endif /* ifdef ECORE_XCOMPOSITE */
+}
+
+EAPI void
+ecore_x_composite_window_events_enable(Ecore_X_Window win)
+{
+#ifdef ECORE_XCOMPOSITE
+   ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
+#endif /* ifdef ECORE_XCOMPOSITE */
+}
+
+EAPI Ecore_X_Window
+ecore_x_composite_render_window_enable(Ecore_X_Window root)
+{
+   Ecore_X_Window win = 0;
+#ifdef ECORE_XCOMPOSITE
+   win = XCompositeGetOverlayWindow(_ecore_x_disp, root);
+   ecore_x_composite_window_events_disable(win);
+#endif /* ifdef ECORE_XCOMPOSITE */
+   return win;
+}
+
+EAPI void
+ecore_x_composite_render_window_disable(Ecore_X_Window root)
+{
+#ifdef ECORE_XCOMPOSITE
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XCompositeReleaseOverlayWindow(_ecore_x_disp, root);
+#endif /* ifdef ECORE_XCOMPOSITE */
+}
+
index d420a48..a968c56 100644 (file)
-#include "ecore_x_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
 
+#include <stdlib.h>
 
-EAPI int
+#include "ecore_x_private.h"
+
+EAPI Eina_Bool
 ecore_x_cursor_color_supported_get(void)
 {
    return _ecore_x_xcursor;
 }
 
 EAPI Ecore_X_Cursor
-ecore_x_cursor_new(Ecore_X_Window win, int *pixels, int w, int h, int hot_x, int hot_y)
+ecore_x_cursor_new(Ecore_X_Window win,
+                   int *pixels,
+                   int w,
+                   int h,
+                   int hot_x,
+                   int hot_y)
 {
 #ifdef ECORE_XCURSOR
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (_ecore_x_xcursor)
      {
-       Cursor c;
-       XcursorImage *xci;
-
-       xci = XcursorImageCreate(w, h);
-       if (xci)
-         {
-            int i;
-
-            xci->xhot = hot_x;
-            xci->yhot = hot_y;
-            xci->delay = 0;
-            for (i = 0; i < (w * h); i++)
-              {
+        Cursor c;
+        XcursorImage *xci;
+
+        xci = XcursorImageCreate(w, h);
+        if (xci)
+          {
+             int i;
+
+             xci->xhot = hot_x;
+             xci->yhot = hot_y;
+             xci->delay = 0;
+             for (i = 0; i < (w * h); i++)
+               {
 //               int r, g, b, a;
 //
 //               a = (pixels[i] >> 24) & 0xff;
 //               r = (((pixels[i] >> 16) & 0xff) * a) / 0xff;
 //               g = (((pixels[i] >> 8 ) & 0xff) * a) / 0xff;
 //               b = (((pixels[i]      ) & 0xff) * a) / 0xff;
-                 xci->pixels[i] = pixels[i];
+                  xci->pixels[i] = pixels[i];
 //                 (a << 24) | (r << 16) | (g << 8) | (b);
-              }
-            c = XcursorImageLoadCursor(_ecore_x_disp, xci);
-            XcursorImageDestroy(xci);
-            return c;
-         }
+               }
+             c = XcursorImageLoadCursor(_ecore_x_disp, xci);
+             XcursorImageDestroy(xci);
+             return c;
+          }
      }
    else
-#endif
-     {
-       XColor c1, c2;
-       Cursor c;
-       Pixmap pmap, mask;
-       GC gc;
-       XGCValues gcv;
-       XImage *xim;
-       unsigned int *pix;
-       int fr, fg, fb, br, bg, bb;
-       int brightest = 0;
-       int darkest = 255 * 3;
-       int x, y;
-       const int dither[2][2] =
-         {
-              {0, 2},
-              {3, 1}
-         };
-
-       pmap = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
-       mask = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
-       xim = XCreateImage(_ecore_x_disp,
-                          DefaultVisual(_ecore_x_disp, 0),
-                          1, ZPixmap, 0, NULL, w, h, 32, 0);
-       xim->data = malloc(xim->bytes_per_line * xim->height);
-
-       fr = 0x00; fg = 0x00; fb = 0x00;
-       br = 0xff; bg = 0xff; bb = 0xff;
-       pix = (unsigned int*)pixels;
-       for (y = 0; y < h; y++)
-         {
-            for (x = 0; x < w; x++)
-              {
-                 int r, g, b, a;
-
-                 a = (pix[0] >> 24) & 0xff;
-                 r = (pix[0] >> 16) & 0xff;
-                 g = (pix[0] >> 8 ) & 0xff;
-                 b = (pix[0]      ) & 0xff;
-                 if (a > 0)
-                   {
-                      if ((r + g + b) > brightest)
-                        {
-                           brightest = r + g + b;
-                           br = r;
-                           bg = g;
-                           bb = b;
-                        }
-                      if ((r + g + b) < darkest)
-                        {
-                           darkest = r + g + b;
-                           fr = r;
-                           fg = g;
-                           fb = b;
-                        }
-                   }
-                 pix++;
-              }
-         }
-
-       pix = (unsigned int*)pixels;
-       for (y = 0; y < h; y++)
-         {
-            for (x = 0; x < w; x++)
-              {
-                 int v;
-                 int r, g, b;
-                 int d1, d2;
-
-                 r = (pix[0] >> 16) & 0xff;
-                 g = (pix[0] >> 8 ) & 0xff;
-                 b = (pix[0]      ) & 0xff;
-                 d1 =
-                   ((r - fr) * (r - fr)) +
-                   ((g - fg) * (g - fg)) +
-                   ((b - fb) * (b - fb));
-                 d2 =
-                   ((r - br) * (r - br)) +
-                   ((g - bg) * (g - bg)) +
-                   ((b - bb) * (b - bb));
-                 if (d1 + d2)
-                   {
-                      v = (((d2 * 255) / (d1 + d2)) * 5) / 256;
-                      if (v > dither[x & 0x1][y & 0x1]) v = 1;
-                      else v = 0;
-                   }
-                 else
-                   {
-                      v = 0;
-                   }
-                 XPutPixel(xim, x, y, v);
-                 pix++;
-              }
-         }
-       gc = XCreateGC(_ecore_x_disp, pmap, 0, &gcv);
-       XPutImage(_ecore_x_disp, pmap, gc, xim, 0, 0, 0, 0, w, h);
-       XFreeGC(_ecore_x_disp, gc);
-
-       pix = (unsigned int*)pixels;
-       for (y = 0; y < h; y++)
-         {
-            for (x = 0; x < w; x++)
-              {
-                 int v;
-
-                 v = (((pix[0] >> 24) & 0xff) * 5) / 256;
-                 if (v > dither[x & 0x1][y & 0x1]) v = 1;
-                 else v = 0;
-                 XPutPixel(xim, x, y, v);
-                 pix++;
-              }
-         }
-       gc = XCreateGC(_ecore_x_disp, mask, 0, &gcv);
-       XPutImage(_ecore_x_disp, mask, gc, xim, 0, 0, 0, 0, w, h);
-       XFreeGC(_ecore_x_disp, gc);
-
-       free(xim->data);
-       xim->data = NULL;
-       XDestroyImage(xim);
-
-       c1.pixel = 0;
-       c1.red   = fr << 8 | fr;
-       c1.green = fg << 8 | fg;
-       c1.blue  = fb << 8 | fb;
-       c1.flags = DoRed | DoGreen | DoBlue;
-
-       c2.pixel = 0;
-       c2.red   = br << 8 | br;
-       c2.green = bg << 8 | bg;
-       c2.blue  = bb << 8 | bb;
-       c2.flags = DoRed | DoGreen | DoBlue;
-
-       c = XCreatePixmapCursor(_ecore_x_disp,
-                               pmap, mask,
-                               &c1, &c2,
-                               hot_x, hot_y);
-       XFreePixmap(_ecore_x_disp, pmap);
-       XFreePixmap(_ecore_x_disp, mask);
-       return c;
-     }
+#endif /* ifdef ECORE_XCURSOR */
+   {
+      XColor c1, c2;
+      Cursor c;
+      Pixmap pmap, mask;
+      GC gc;
+      XGCValues gcv;
+      XImage *xim;
+      unsigned int *pix;
+      int fr, fg, fb, br, bg, bb;
+      int brightest = 0;
+      int darkest = 255 * 3;
+      int x, y;
+      const int dither[2][2] =
+      {
+         {0, 2},
+         {3, 1}
+      };
+
+      pmap = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
+      mask = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
+      xim = XCreateImage(_ecore_x_disp,
+                         DefaultVisual(_ecore_x_disp, 0),
+                         1, ZPixmap, 0, NULL, w, h, 32, 0);
+      xim->data = malloc(xim->bytes_per_line * xim->height);
+
+      fr = 0x00; fg = 0x00; fb = 0x00;
+      br = 0xff; bg = 0xff; bb = 0xff;
+      pix = (unsigned int *)pixels;
+      for (y = 0; y < h; y++)
+        {
+           for (x = 0; x < w; x++)
+             {
+                int r, g, b, a;
+
+                a = (pix[0] >> 24) & 0xff;
+                r = (pix[0] >> 16) & 0xff;
+                g = (pix[0] >> 8) & 0xff;
+                b = (pix[0]) & 0xff;
+                if (a > 0)
+                  {
+                     if ((r + g + b) > brightest)
+                       {
+                          brightest = r + g + b;
+                          br = r;
+                          bg = g;
+                          bb = b;
+                       }
+
+                     if ((r + g + b) < darkest)
+                       {
+                          darkest = r + g + b;
+                          fr = r;
+                          fg = g;
+                          fb = b;
+                       }
+                  }
+
+                pix++;
+             }
+        }
+
+      pix = (unsigned int *)pixels;
+      for (y = 0; y < h; y++)
+        {
+           for (x = 0; x < w; x++)
+             {
+                int v;
+                int r, g, b;
+                int d1, d2;
+
+                r = (pix[0] >> 16) & 0xff;
+                g = (pix[0] >> 8) & 0xff;
+                b = (pix[0]) & 0xff;
+                d1 =
+                  ((r - fr) * (r - fr)) +
+                  ((g - fg) * (g - fg)) +
+                  ((b - fb) * (b - fb));
+                d2 =
+                  ((r - br) * (r - br)) +
+                  ((g - bg) * (g - bg)) +
+                  ((b - bb) * (b - bb));
+                if (d1 + d2)
+                  {
+                     v = (((d2 * 255) / (d1 + d2)) * 5) / 256;
+                     if (v > dither[x & 0x1][y & 0x1])
+                       v = 1;
+                     else
+                       v = 0;
+                  }
+                else
+                  v = 0;
+
+                XPutPixel(xim, x, y, v);
+                pix++;
+             }
+        }
+      gc = XCreateGC(_ecore_x_disp, pmap, 0, &gcv);
+      XPutImage(_ecore_x_disp, pmap, gc, xim, 0, 0, 0, 0, w, h);
+      XFreeGC(_ecore_x_disp, gc);
+
+      pix = (unsigned int *)pixels;
+      for (y = 0; y < h; y++)
+        {
+           for (x = 0; x < w; x++)
+             {
+                int v;
+
+                v = (((pix[0] >> 24) & 0xff) * 5) / 256;
+                if (v > dither[x & 0x1][y & 0x1])
+                  v = 1;
+                else
+                  v = 0;
+
+                XPutPixel(xim, x, y, v);
+                pix++;
+             }
+        }
+      gc = XCreateGC(_ecore_x_disp, mask, 0, &gcv);
+      XPutImage(_ecore_x_disp, mask, gc, xim, 0, 0, 0, 0, w, h);
+      XFreeGC(_ecore_x_disp, gc);
+
+      free(xim->data);
+      xim->data = NULL;
+      XDestroyImage(xim);
+
+      c1.pixel = 0;
+      c1.red = fr << 8 | fr;
+      c1.green = fg << 8 | fg;
+      c1.blue = fb << 8 | fb;
+      c1.flags = DoRed | DoGreen | DoBlue;
+
+      c2.pixel = 0;
+      c2.red = br << 8 | br;
+      c2.green = bg << 8 | bg;
+      c2.blue = bb << 8 | bb;
+      c2.flags = DoRed | DoGreen | DoBlue;
+
+      c = XCreatePixmapCursor(_ecore_x_disp,
+                              pmap, mask,
+                              &c1, &c2,
+                              hot_x, hot_y);
+      XFreePixmap(_ecore_x_disp, pmap);
+      XFreePixmap(_ecore_x_disp, mask);
+      return c;
+   }
+
    return 0;
 }
 
 EAPI void
 ecore_x_cursor_free(Ecore_X_Cursor c)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFreeCursor(_ecore_x_disp, c);
 }
 
@@ -198,6 +217,7 @@ ecore_x_cursor_free(Ecore_X_Cursor c)
 EAPI Ecore_X_Cursor
 ecore_x_cursor_shape_get(int shape)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    /* Shapes are defined in Ecore_X_Cursor.h */
    return XCreateFontCursor(_ecore_x_disp, shape);
 }
@@ -206,18 +226,21 @@ EAPI void
 ecore_x_cursor_size_set(int size)
 {
 #ifdef ECORE_XCURSOR
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XcursorSetDefaultSize(_ecore_x_disp, size);
-#else
+#else /* ifdef ECORE_XCURSOR */
    size = 0;
-#endif
+#endif /* ifdef ECORE_XCURSOR */
 }
 
 EAPI int
 ecore_x_cursor_size_get(void)
 {
 #ifdef ECORE_XCURSOR
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return XcursorGetDefaultSize(_ecore_x_disp);
-#else
+#else /* ifdef ECORE_XCURSOR */
    return 0;
-#endif
+#endif /* ifdef ECORE_XCURSOR */
 }
+
index 3507ce2..b094f85 100644 (file)
@@ -1,14 +1,14 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
 
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 
-static int _damage_available;
+static Eina_Bool _damage_available = EINA_FALSE;
 #ifdef ECORE_XDAMAGE
 static int _damage_major, _damage_minor;
-#endif
+#endif /* ifdef ECORE_XDAMAGE */
 
 void
 _ecore_x_damage_init(void)
@@ -17,47 +17,55 @@ _ecore_x_damage_init(void)
    _damage_major = 1;
    _damage_minor = 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (XDamageQueryVersion(_ecore_x_disp, &_damage_major, &_damage_minor))
-     _damage_available = 1;
+     _damage_available = EINA_TRUE;
    else
-     _damage_available = 0;
-#else
-   _damage_available = 0;
-#endif
+     _damage_available = EINA_FALSE;
+
+#else /* ifdef ECORE_XDAMAGE */
+   _damage_available = EINA_FALSE;
+#endif /* ifdef ECORE_XDAMAGE */
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_damage_query(void)
 {
    return _damage_available;
 }
 
 EAPI Ecore_X_Damage
-ecore_x_damage_new(Ecore_X_Drawable d, Ecore_X_Damage_Report_Level level)
+ecore_x_damage_new(Ecore_X_Drawable d,
+                   Ecore_X_Damage_Report_Level level)
 {
 #ifdef ECORE_XDAMAGE
    Ecore_X_Damage damage;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    damage = XDamageCreate(_ecore_x_disp, d, level);
    return damage;
-#else
+#else /* ifdef ECORE_XDAMAGE */
    return 0;
-#endif
+#endif /* ifdef ECORE_XDAMAGE */
 }
 
 EAPI void
-ecore_x_damage_del(Ecore_X_Damage damage)
+ecore_x_damage_free(Ecore_X_Damage damage)
 {
 #ifdef ECORE_XDAMAGE
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XDamageDestroy(_ecore_x_disp, damage);
-#endif
+#endif /* ifdef ECORE_XDAMAGE */
 }
 
 EAPI void
-ecore_x_damage_subtract(Ecore_X_Damage damage, Ecore_X_Region repair, Ecore_X_Region parts)
+ecore_x_damage_subtract(Ecore_X_Damage damage,
+                        Ecore_X_Region repair,
+                        Ecore_X_Region parts)
 {
 #ifdef ECORE_XDAMAGE
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XDamageSubtract(_ecore_x_disp, damage, repair, parts);
-#endif
+#endif /* ifdef ECORE_XDAMAGE */
 }
 
index 61a64df..372470a 100644 (file)
@@ -1,6 +1,10 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <string.h>
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
@@ -20,33 +24,44 @@ static int _ecore_x_dnd_init_count = 0;
 typedef struct _Version_Cache_Item
 {
    Ecore_X_Window win;
-   int ver;
+   int            ver;
 } Version_Cache_Item;
 static Version_Cache_Item *_version_cache = NULL;
 static int _version_cache_num = 0, _version_cache_alloc = 0;
+static void (*_posupdatecb)(void *,
+                            Ecore_X_Xdnd_Position *);
+static void *_posupdatedata;
 
 void
 _ecore_x_dnd_init(void)
 {
    if (!_ecore_x_dnd_init_count)
      {
-       _source = calloc(1, sizeof(Ecore_X_DND_Source));
-       _source->version = ECORE_X_DND_VERSION;
-       _source->win = None;
-       _source->dest = None;
-       _source->state = ECORE_X_DND_SOURCE_IDLE;
-
-       _target = calloc(1, sizeof(Ecore_X_DND_Target));
-       _target->win = None;
-       _target->source = None;
-       _target->state = ECORE_X_DND_TARGET_IDLE;
-       
-       ECORE_X_EVENT_XDND_ENTER              = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_POSITION           = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_STATUS             = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_LEAVE              = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_DROP               = ecore_event_type_new();
-       ECORE_X_EVENT_XDND_FINISHED           = ecore_event_type_new();
+        _source = calloc(1, sizeof(Ecore_X_DND_Source));
+        if (!_source) return;
+        _source->version = ECORE_X_DND_VERSION;
+        _source->win = None;
+        _source->dest = None;
+        _source->state = ECORE_X_DND_SOURCE_IDLE;
+        _source->prev.window = 0;
+
+        _target = calloc(1, sizeof(Ecore_X_DND_Target));
+        if (!_target)
+          {
+             free(_source);
+             _source = NULL;
+             return;
+          }
+        _target->win = None;
+        _target->source = None;
+        _target->state = ECORE_X_DND_TARGET_IDLE;
+
+        ECORE_X_EVENT_XDND_ENTER = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_POSITION = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_STATUS = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_LEAVE = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_DROP = ecore_event_type_new();
+        ECORE_X_EVENT_XDND_FINISHED = ecore_event_type_new();
      }
 
    _ecore_x_dnd_init_count++;
@@ -61,54 +76,72 @@ _ecore_x_dnd_shutdown(void)
 
    if (_source)
      free(_source);
+
    _source = NULL;
 
    if (_target)
      free(_target);
+
    _target = NULL;
 
    _ecore_x_dnd_init_count = 0;
 }
 
-static int
-_ecore_x_dnd_converter_copy(char *target, void *data, int size, void **data_ret, int *size_ret)
+static Eina_Bool
+_ecore_x_dnd_converter_copy(char *target __UNUSED__,
+                            void *data,
+                            int size,
+                            void **data_ret,
+                            int *size_ret,
+                            Ecore_X_Atom *tprop __UNUSED__,
+                            int *count __UNUSED__)
 {
    XTextProperty text_prop;
    char *mystr;
    XICCEncodingStyle style = XTextStyle;
 
    if (!data || !size)
-     return 0;
+     return EINA_FALSE;
 
    mystr = calloc(1, size + 1);
-   if (!mystr) return 0;
+   if (!mystr)
+     return EINA_FALSE;
+
    memcpy(mystr, data, size);
 
-   if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style, &text_prop) == Success)
+   if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style,
+                                 &text_prop) == Success)
      {
-       int bufsize = strlen(text_prop.value) + 1;
-       *data_ret = malloc(bufsize);
-       memcpy(*data_ret, text_prop.value, bufsize);
-       *size_ret = bufsize;
-       XFree(text_prop.value);
-       free(mystr);
-       return 1;
+        int bufsize = strlen((char *)text_prop.value) + 1;
+        *data_ret = malloc(bufsize);
+        if (!*data_ret)
+          {
+             free(mystr);
+             return EINA_FALSE;
+          }
+        memcpy(*data_ret, text_prop.value, bufsize);
+        *size_ret = bufsize;
+        XFree(text_prop.value);
+        free(mystr);
+        return EINA_TRUE;
      }
    else
      {
-       free(mystr);
-       return 0;
+        free(mystr);
+        return EINA_FALSE;
      }
 }
 
 EAPI void
-ecore_x_dnd_aware_set(Ecore_X_Window win, int on)
+ecore_x_dnd_aware_set(Ecore_X_Window win,
+                      Eina_Bool on)
 {
    Ecore_X_Atom prop_data = ECORE_X_DND_VERSION;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (on)
      ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_AWARE,
-                                     XA_ATOM, 32, &prop_data, 1);
+                                      XA_ATOM, 32, &prop_data, 1);
    else
      ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_AWARE);
 }
@@ -118,62 +151,76 @@ ecore_x_dnd_version_get(Ecore_X_Window win)
 {
    unsigned char *prop_data;
    int num;
+   Version_Cache_Item *t;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    // this looks hacky - and it is, but we need a way of caching info about
    // a window while dragging, because we literally query this every mouse
    // move and going to and from x multiple times per move is EXPENSIVE
    // and slows things down, puts lots of load on x etc.
    if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
-     {
-       if (_version_cache)
-         {
-            int i;
-            
-            for (i = 0; i < _version_cache_num; i++)
-              {
-                 if (_version_cache[i].win == win)
-                   return _version_cache[i].ver;
-              }
-         }
-     }
-     
+     if (_version_cache)
+       {
+          int i;
+
+          for (i = 0; i < _version_cache_num; i++)
+            {
+               if (_version_cache[i].win == win)
+                 return _version_cache[i].ver;
+            }
+       }
+
    if (ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_AWARE,
                                         XA_ATOM, 32, &prop_data, &num))
      {
-       int version = (int) *prop_data;
-       free(prop_data);
-       if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
-         {
-            _version_cache_num++;
-            if (_version_cache_num > _version_cache_alloc)
-              _version_cache_alloc += 16;
-            _version_cache = realloc(_version_cache, _version_cache_alloc * sizeof(Version_Cache_Item));
-            _version_cache[_version_cache_num - 1].win = win;
-            _version_cache[_version_cache_num - 1].ver = version;
-         }
-       return version;
+        int version = (int)*prop_data;
+        free(prop_data);
+        if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
+          {
+             _version_cache_num++;
+             if (_version_cache_num > _version_cache_alloc)
+               _version_cache_alloc += 16;
+
+             t = realloc(_version_cache,
+                         _version_cache_alloc *
+                         sizeof(Version_Cache_Item));
+             if (!t) return 0;
+             _version_cache = t;
+             _version_cache[_version_cache_num - 1].win = win;
+             _version_cache[_version_cache_num - 1].ver = version;
+          }
+
+        return version;
      }
+
    if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
      {
-       _version_cache_num++;
-       if (_version_cache_num > _version_cache_alloc)
-         _version_cache_alloc += 16;
-       _version_cache = realloc(_version_cache, _version_cache_alloc * sizeof(Version_Cache_Item));
-       _version_cache[_version_cache_num - 1].win = win;
-       _version_cache[_version_cache_num - 1].ver = 0;
+        _version_cache_num++;
+        if (_version_cache_num > _version_cache_alloc)
+          _version_cache_alloc += 16;
+
+        t = realloc(_version_cache, _version_cache_alloc *
+                    sizeof(Version_Cache_Item));
+        if (!t) return 0;
+        _version_cache = t;
+        _version_cache[_version_cache_num - 1].win = win;
+        _version_cache[_version_cache_num - 1].ver = 0;
      }
+
    return 0;
 }
 
-EAPI int
-ecore_x_dnd_type_isset(Ecore_X_Window win, const char *type)
+EAPI Eina_Bool
+ecore_x_dnd_type_isset(Ecore_X_Window win,
+                       const char *type)
 {
-   int                  num, i, ret = 0;
-   unsigned char       *data;
-   Ecore_X_Atom        *atoms, atom;
+   int num, i, ret = EINA_FALSE;
+   unsigned char *data;
+   Ecore_X_Atom *atoms, atom;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                        XA_ATOM, 32, &data, &num))
+                                         XA_ATOM, 32, &data, &num))
      return ret;
 
    atom = ecore_x_atom_get(type);
@@ -181,11 +228,11 @@ ecore_x_dnd_type_isset(Ecore_X_Window win, const char *type)
 
    for (i = 0; i < num; ++i)
      {
-       if (atom == atoms[i])
-         {
-            ret = 1;
-            break;
-         }
+        if (atom == atoms[i])
+          {
+             ret = EINA_TRUE;
+             break;
+          }
      }
 
    XFree(data);
@@ -193,112 +240,152 @@ ecore_x_dnd_type_isset(Ecore_X_Window win, const char *type)
 }
 
 EAPI void
-ecore_x_dnd_type_set(Ecore_X_Window win, const char *type, int on)
+ecore_x_dnd_type_set(Ecore_X_Window win,
+                     const char *type,
+                     Eina_Bool on)
 {
-   Ecore_X_Atom      atom;
-   Ecore_X_Atom      *oldset = NULL, *newset = NULL;
-   int               i, j = 0, num = 0;
-   unsigned char     *data = NULL;
-   unsigned char     *old_data = NULL;
+   Ecore_X_Atom atom;
+   Ecore_X_Atom *oldset = NULL, *newset = NULL;
+   int i, j = 0, num = 0;
+   unsigned char *data = NULL;
+   unsigned char *old_data = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    atom = ecore_x_atom_get(type);
    ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
                                     XA_ATOM, 32, &old_data, &num);
    oldset = (Ecore_X_Atom *)old_data;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (on)
      {
-       if (ecore_x_dnd_type_isset(win, type))
-         {
-            XFree(old_data);
-            return;
-         }
-       newset = calloc(num + 1, sizeof(Ecore_X_Atom));
-       if (!newset) return;
-       data = (unsigned char *)newset;
-
-       for (i = 0; i < num; i++)
-         newset[i + 1] = oldset[i];
-       /* prepend the new type */
-       newset[0] = atom;
-
-       ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                        XA_ATOM, 32, data, num + 1);
+        if (ecore_x_dnd_type_isset(win, type))
+          {
+             XFree(old_data);
+             return;
+          }
+
+        newset = calloc(num + 1, sizeof(Ecore_X_Atom));
+        if (!newset)
+          return;
+
+        data = (unsigned char *)newset;
+
+        for (i = 0; i < num; i++)
+          newset[i + 1] = oldset[i];
+        /* prepend the new type */
+        newset[0] = atom;
+
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                         XA_ATOM, 32, data, num + 1);
      }
    else
      {
-       if (!ecore_x_dnd_type_isset(win, type))
-         {
-            XFree(old_data);
-            return;
-         }
-       newset = calloc(num - 1, sizeof(Ecore_X_Atom));
-       if (!newset)
-         {
-            XFree(old_data);
-            return;
-         }
-       data = (unsigned char *)newset;
-       for (i = 0; i < num; i++)
-         if (oldset[i] != atom)
-           newset[j++] = oldset[i];
-
-       ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                        XA_ATOM, 32, data, num - 1);
+        if (!ecore_x_dnd_type_isset(win, type))
+          {
+             XFree(old_data);
+             return;
+          }
+
+        newset = calloc(num - 1, sizeof(Ecore_X_Atom));
+        if (!newset)
+          {
+             XFree(old_data);
+             return;
+          }
+
+        data = (unsigned char *)newset;
+        for (i = 0; i < num; i++)
+          if (oldset[i] != atom)
+            newset[j++] = oldset[i];
+
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                         XA_ATOM, 32, data, num - 1);
      }
+
    XFree(oldset);
    free(newset);
 }
 
 EAPI void
-ecore_x_dnd_types_set(Ecore_X_Window win, char **types, unsigned int num_types)
+ecore_x_dnd_types_set(Ecore_X_Window win,
+                      const char **types,
+                      unsigned int num_types)
 {
-   Ecore_X_Atom      *newset = NULL;
-   unsigned int      i;
-   unsigned char     *data = NULL;
+   Ecore_X_Atom *newset = NULL;
+   unsigned int i;
+   unsigned char *data = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!num_types)
-     {
-       ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_TYPE_LIST);
-     }
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_TYPE_LIST);
    else
      {
-       newset = calloc(num_types, sizeof(Ecore_X_Atom));
-       if (!newset) return;
-       data = (unsigned char *)newset;
-       for (i = 0; i < num_types; i++)
-         {
-            newset[i] = ecore_x_atom_get(types[i]);
-            ecore_x_selection_converter_atom_add(newset[i], _ecore_x_dnd_converter_copy);
-         }
-       ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                        XA_ATOM, 32, data, num_types);
-       free(newset);
+        newset = calloc(num_types, sizeof(Ecore_X_Atom));
+        if (!newset)
+          return;
+
+        data = (unsigned char *)newset;
+        for (i = 0; i < num_types; i++)
+          {
+             newset[i] = ecore_x_atom_get(types[i]);
+             ecore_x_selection_converter_atom_add(newset[i],
+                                                  _ecore_x_dnd_converter_copy);
+          }
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
+                                         XA_ATOM, 32, data, num_types);
+        free(newset);
      }
 }
 
 EAPI void
-ecore_x_dnd_actions_set(Ecore_X_Window win, Ecore_X_Atom *actions, unsigned int num_actions)
+ecore_x_dnd_actions_set(Ecore_X_Window win,
+                        Ecore_X_Atom *actions,
+                        unsigned int num_actions)
 {
-   unsigned int      i;
-   unsigned char     *data = NULL;
+   unsigned int i;
+   unsigned char *data = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!num_actions)
-     {
-       ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_ACTION_LIST);
-     }
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_ACTION_LIST);
    else
      {
-       data = (unsigned char *)actions;
-       for (i = 0; i < num_actions; i++)
-         {
-            ecore_x_selection_converter_atom_add(actions[i], _ecore_x_dnd_converter_copy);
-         }
-       ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_ACTION_LIST,
-                                        XA_ATOM, 32, data, num_actions);
+        data = (unsigned char *)actions;
+        for (i = 0; i < num_actions; i++)
+          {
+             ecore_x_selection_converter_atom_add(actions[i],
+                                                  _ecore_x_dnd_converter_copy);
+          }
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_ACTION_LIST,
+                                         XA_ATOM, 32, data, num_actions);
      }
 }
 
+/**
+ * The DND position update cb is called Ecore_X sends a DND position to a
+ * client.
+ *
+ * It essentially mirrors some of the data sent in the position message.
+ * Generally this cb should be set just before position update is called.
+ * Please note well you need to look after your own data pointer if someone
+ * trashes you position update cb set.
+ *
+ * It is considered good form to clear this when the dnd event finishes.
+ *
+ * @param cb Callback to updated each time ecore_x sends a position update.
+ * @param data User data.
+ */
+EAPI void
+ecore_x_dnd_callback_pos_update_set(
+  void (*cb)(void *,
+             Ecore_X_Xdnd_Position *data),
+  const void *data)
+{
+   _posupdatecb = cb;
+   _posupdatedata = (void *)data; /* Discard the const early */
+}
+
 Ecore_X_DND_Source *
 _ecore_x_dnd_source_get(void)
 {
@@ -311,90 +398,102 @@ _ecore_x_dnd_target_get(void)
    return _target;
 }
 
-EAPI int
-ecore_x_dnd_begin(Ecore_X_Window source, unsigned char *data, int size)
+EAPI Eina_Bool
+ecore_x_dnd_begin(Ecore_X_Window source,
+                  unsigned char *data,
+                  int size)
 {
-
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!ecore_x_dnd_version_get(source))
-     return 0;
+     return EINA_FALSE;
 
    /* Take ownership of XdndSelection */
    if (!ecore_x_selection_xdnd_set(source, data, size))
-     return 0;
+     return EINA_FALSE;
 
    if (_version_cache)
      {
-       free(_version_cache);
-       _version_cache = NULL;
-       _version_cache_num = 0;
-       _version_cache_alloc = 0;
+        free(_version_cache);
+        _version_cache = NULL;
+        _version_cache_num = 0;
+        _version_cache_alloc = 0;
      }
+
    ecore_x_window_shadow_tree_flush();
-   
+
    _source->win = source;
    ecore_x_window_ignore_set(_source->win, 1);
    _source->state = ECORE_X_DND_SOURCE_DRAGGING;
    _source->time = _ecore_x_event_last_time;
+   _source->prev.window = 0;
 
    /* Default Accepted Action: move */
    _source->action = ECORE_X_ATOM_XDND_ACTION_MOVE;
    _source->accepted_action = None;
    _source->dest = None;
 
-   return 1;
+   return EINA_TRUE;
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_dnd_drop(void)
 {
    XEvent xev;
-   int status = 0;
+   int status = EINA_FALSE;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (_source->dest)
      {
-       xev.xany.type = ClientMessage;
-       xev.xany.display = _ecore_x_disp;
-       xev.xclient.format = 32;
-       xev.xclient.window = _source->dest;
-
-       if (_source->will_accept)
-         {
-            xev.xclient.message_type = ECORE_X_ATOM_XDND_DROP;
-            xev.xclient.data.l[0] = _source->win;
-            xev.xclient.data.l[1] = 0;
-            xev.xclient.data.l[2] = _source->time;
-            XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
-            _source->state = ECORE_X_DND_SOURCE_DROPPED;
-            status = 1;
-         }
-       else
-         {
-            xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
-            xev.xclient.data.l[0] = _source->win;
-            xev.xclient.data.l[1] = 0;
-            XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
-            _source->state = ECORE_X_DND_SOURCE_IDLE;
-         }
+        xev.xany.type = ClientMessage;
+        xev.xany.display = _ecore_x_disp;
+        xev.xclient.format = 32;
+        xev.xclient.window = _source->dest;
+
+        if (_source->will_accept)
+          {
+             xev.xclient.message_type = ECORE_X_ATOM_XDND_DROP;
+             xev.xclient.data.l[0] = _source->win;
+             xev.xclient.data.l[1] = 0;
+             xev.xclient.data.l[2] = _source->time;
+             XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
+             _source->state = ECORE_X_DND_SOURCE_DROPPED;
+             status = EINA_TRUE;
+          }
+        else
+          {
+             xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
+             xev.xclient.data.l[0] = _source->win;
+             xev.xclient.data.l[1] = 0;
+             XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
+             _source->state = ECORE_X_DND_SOURCE_IDLE;
+          }
      }
    else
      {
-       /* Dropping on nothing */
-       ecore_x_selection_xdnd_clear();
-       _source->state = ECORE_X_DND_SOURCE_IDLE;
+        /* Dropping on nothing */
+        ecore_x_selection_xdnd_clear();
+        _source->state = ECORE_X_DND_SOURCE_IDLE;
      }
+
    ecore_x_window_ignore_set(_source->win, 0);
 
+   _source->prev.window = 0;
+
    return status;
 }
 
 EAPI void
-ecore_x_dnd_send_status(int will_accept, int suppress, Ecore_X_Rectangle rectangle, Ecore_X_Atom action)
+ecore_x_dnd_send_status(Eina_Bool will_accept,
+                        Eina_Bool suppress,
+                        Ecore_X_Rectangle rectangle,
+                        Ecore_X_Atom action)
 {
    XEvent xev;
 
    if (_target->state == ECORE_X_DND_TARGET_IDLE)
      return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    memset(&xev, 0, sizeof(XEvent));
 
    _target->will_accept = will_accept;
@@ -409,6 +508,7 @@ ecore_x_dnd_send_status(int will_accept, int suppress, Ecore_X_Rectangle rectang
    xev.xclient.data.l[1] = 0;
    if (will_accept)
      xev.xclient.data.l[1] |= 0x1UL;
+
    if (!suppress)
      xev.xclient.data.l[1] |= 0x2UL;
 
@@ -422,13 +522,13 @@ ecore_x_dnd_send_status(int will_accept, int suppress, Ecore_X_Rectangle rectang
 
    if (will_accept)
      {
-       xev.xclient.data.l[4] = action;
-       _target->accepted_action = action;
+        xev.xclient.data.l[4] = action;
+        _target->accepted_action = action;
      }
    else
      {
-       xev.xclient.data.l[4] = None;
-       _target->accepted_action = action;
+        xev.xclient.data.l[4] = None;
+        _target->accepted_action = action;
      }
 
    XSendEvent(_ecore_x_disp, _target->source, False, 0, &xev);
@@ -437,11 +537,12 @@ ecore_x_dnd_send_status(int will_accept, int suppress, Ecore_X_Rectangle rectang
 EAPI void
 ecore_x_dnd_send_finished(void)
 {
-   XEvent   xev;
+   XEvent xev;
 
    if (_target->state == ECORE_X_DND_TARGET_IDLE)
      return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xev.xany.type = ClientMessage;
    xev.xany.display = _ecore_x_disp;
    xev.xclient.message_type = ECORE_X_ATOM_XDND_FINISHED;
@@ -453,21 +554,39 @@ ecore_x_dnd_send_finished(void)
    xev.xclient.data.l[2] = 0;
    if (_target->will_accept)
      {
-       xev.xclient.data.l[1] |= 0x1UL;
-       xev.xclient.data.l[2] = _target->accepted_action;
+        xev.xclient.data.l[1] |= 0x1UL;
+        xev.xclient.data.l[2] = _target->accepted_action;
      }
+
    XSendEvent(_ecore_x_disp, _target->source, False, 0, &xev);
 
    _target->state = ECORE_X_DND_TARGET_IDLE;
 }
 
+EAPI void
+ecore_x_dnd_source_action_set(Ecore_X_Atom action)
+{
+   _source->action = action;
+   if (_source->prev.window)
+     _ecore_x_dnd_drag(_source->prev.window, _source->prev.x, _source->prev.y);
+}
+
+EAPI Ecore_X_Atom
+ecore_x_dnd_source_action_get(void)
+{
+   return _source->action;
+}
+
 void
-_ecore_x_dnd_drag(Ecore_X_Window root, int x, int y)
+_ecore_x_dnd_drag(Ecore_X_Window root,
+                  int x,
+                  int y)
 {
-   XEvent          xev;
-   Ecore_X_Window  win;
+   XEvent xev;
+   Ecore_X_Window win;
    Ecore_X_Window *skip;
-   int             num;
+   Ecore_X_Xdnd_Position pos;
+   int num;
 
    if (_source->state != ECORE_X_DND_SOURCE_DRAGGING)
      return;
@@ -495,74 +614,93 @@ _ecore_x_dnd_drag(Ecore_X_Window root, int x, int y)
    /* Send XdndLeave to current destination window if we have left it */
    if ((_source->dest) && (win != _source->dest))
      {
-       xev.xclient.window = _source->dest;
-       xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
-       xev.xclient.data.l[0] = _source->win;
-       xev.xclient.data.l[1] = 0;
+        xev.xclient.window = _source->dest;
+        xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
+        xev.xclient.data.l[0] = _source->win;
+        xev.xclient.data.l[1] = 0;
 
-       XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
-       _source->suppress = 0;
+        XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
+        _source->suppress = 0;
      }
 
    if (win)
      {
-       int x1, x2, y1, y2;
-
-       _source->version = MIN(ECORE_X_DND_VERSION,
-                            ecore_x_dnd_version_get(win));
-       if (win != _source->dest)
-         {
-            int i;
-            unsigned char *data;
-            Ecore_X_Atom *types;
-
-            ecore_x_window_prop_property_get(_source->win, ECORE_X_ATOM_XDND_TYPE_LIST,
-                                             XA_ATOM, 32, &data, &num);
-            types = (Ecore_X_Atom *)data;
-
-            /* Entered new window, send XdndEnter */
-            xev.xclient.window = win;
-            xev.xclient.message_type = ECORE_X_ATOM_XDND_ENTER;
-            xev.xclient.data.l[0] = _source->win;
-            xev.xclient.data.l[1] = 0;
-            if (num > 3)
-              xev.xclient.data.l[1] |= 0x1UL;
-            else
-              xev.xclient.data.l[1] &= 0xfffffffeUL;
-            xev.xclient.data.l[1] |= ((unsigned long) _source->version) << 24;
-
-            for (i = 2; i < 5; i++)
-              xev.xclient.data.l[i] = 0;
-            for (i = 0; i < MIN(num, 3); ++i)
-              xev.xclient.data.l[i + 2] = types[i];
-            XFree(data);
-            XSendEvent(_ecore_x_disp, win, False, 0, &xev);
-            _source->await_status = 0;
-            _source->will_accept = 0;
-         }
-
-       /* Determine if we're still in the rectangle from the last status */
-       x1 = _source->rectangle.x;
-       x2 = _source->rectangle.x + _source->rectangle.width;
-       y1 = _source->rectangle.y;
-       y2 = _source->rectangle.y + _source->rectangle.height;
-
-       if ((!_source->await_status) ||
-           (!_source->suppress) ||
-           ((x < x1) || (x > x2) || (y < y1) || (y > y2)))
-         {
-            xev.xclient.window = win;
-            xev.xclient.message_type = ECORE_X_ATOM_XDND_POSITION;
-            xev.xclient.data.l[0] = _source->win;
-            xev.xclient.data.l[1] = 0; /* Reserved */
-            xev.xclient.data.l[2] = ((x << 16) & 0xffff0000) | (y & 0xffff);
-            xev.xclient.data.l[3] = _source->time; /* Version 1 */
-            xev.xclient.data.l[4] = _source->action; /* Version 2, Needs to be pre-set */
-            XSendEvent(_ecore_x_disp, win, False, 0, &xev);
-
-            _source->await_status = 1;
-         }
+        int x1, x2, y1, y2;
+
+        _source->version = MIN(ECORE_X_DND_VERSION,
+                               ecore_x_dnd_version_get(win));
+        if (win != _source->dest)
+          {
+             int i;
+             unsigned char *data;
+             Ecore_X_Atom *types;
+
+             ecore_x_window_prop_property_get(_source->win,
+                                              ECORE_X_ATOM_XDND_TYPE_LIST,
+                                              XA_ATOM,
+                                              32,
+                                              &data,
+                                              &num);
+             types = (Ecore_X_Atom *)data;
+
+             /* Entered new window, send XdndEnter */
+             xev.xclient.window = win;
+             xev.xclient.message_type = ECORE_X_ATOM_XDND_ENTER;
+             xev.xclient.data.l[0] = _source->win;
+             xev.xclient.data.l[1] = 0;
+             if (num > 3)
+               xev.xclient.data.l[1] |= 0x1UL;
+             else
+               xev.xclient.data.l[1] &= 0xfffffffeUL;
+
+             xev.xclient.data.l[1] |= ((unsigned long)_source->version) << 24;
+
+             for (i = 2; i < 5; i++)
+               xev.xclient.data.l[i] = 0;
+             for (i = 0; i < MIN(num, 3); ++i)
+               xev.xclient.data.l[i + 2] = types[i];
+             XFree(data);
+             XSendEvent(_ecore_x_disp, win, False, 0, &xev);
+             _source->await_status = 0;
+             _source->will_accept = 0;
+          }
+
+        /* Determine if we're still in the rectangle from the last status */
+        x1 = _source->rectangle.x;
+        x2 = _source->rectangle.x + _source->rectangle.width;
+        y1 = _source->rectangle.y;
+        y2 = _source->rectangle.y + _source->rectangle.height;
+
+        if ((!_source->await_status) ||
+            (!_source->suppress) ||
+            ((x < x1) || (x > x2) || (y < y1) || (y > y2)))
+          {
+             xev.xclient.window = win;
+             xev.xclient.message_type = ECORE_X_ATOM_XDND_POSITION;
+             xev.xclient.data.l[0] = _source->win;
+             xev.xclient.data.l[1] = 0; /* Reserved */
+             xev.xclient.data.l[2] = ((x << 16) & 0xffff0000) | (y & 0xffff);
+             xev.xclient.data.l[3] = _source->time; /* Version 1 */
+             xev.xclient.data.l[4] = _source->action; /* Version 2, Needs to be pre-set */
+             XSendEvent(_ecore_x_disp, win, False, 0, &xev);
+
+             _source->await_status = 1;
+          }
+     }
+
+   if (_posupdatecb)
+     {
+        pos.position.x = x;
+        pos.position.y = y;
+        pos.win = win;
+        pos.prev = _source->dest;
+        _posupdatecb(_posupdatedata, &pos);
      }
 
+   _source->prev.x = x;
+   _source->prev.y = y;
+   _source->prev.window = root;
    _source->dest = win;
 }
+
+/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
index d4dac43..23349f4 100644 (file)
@@ -1,10 +1,10 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
 
 #include "ecore_x_private.h"
 
-static int _dpms_available;
+static Eina_Bool _dpms_available = EINA_FALSE;
 
 void
 _ecore_x_dpms_init(void)
@@ -16,12 +16,13 @@ _ecore_x_dpms_init(void)
    _dpms_minor = 0;
 
    if (DPMSGetVersion(_ecore_x_disp, &_dpms_major, &_dpms_minor))
-     _dpms_available = 1;
+     _dpms_available = EINA_TRUE;
    else
-     _dpms_available = 0;
-#else
-   _dpms_available = 0;
-#endif
+     _dpms_available = EINA_FALSE;
+
+#else /* ifdef ECORE_XDPMS */
+   _dpms_available = EINA_FALSE;
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -35,7 +36,7 @@ _ecore_x_dpms_init(void)
  * @return @c 1 if the X DPMS extension is available, @c 0 otherwise.
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_dpms_query(void)
 {
    return _dpms_available;
@@ -46,14 +47,15 @@ ecore_x_dpms_query(void)
  * @return @c 1 if the X server is capable of DPMS, @c 0 otherwise.
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_dpms_capable_get(void)
 {
 #ifdef ECORE_XDPMS
-   return DPMSCapable(_ecore_x_disp);
-#else
-   return 0;
-#endif
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return DPMSCapable(_ecore_x_disp) ? EINA_TRUE : EINA_FALSE;
+#else /* ifdef ECORE_XDPMS */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -61,18 +63,19 @@ ecore_x_dpms_capable_get(void)
  * @return @c 1 if DPMS is enabled, @c 0 otherwise.
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_dpms_enabled_get(void)
 {
 #ifdef ECORE_XDPMS
    unsigned char state;
    unsigned short power_lvl;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    DPMSInfo(_ecore_x_disp, &power_lvl, &state);
-   return state;
-#else
-   return 0;
-#endif
+   return state ? EINA_TRUE : EINA_FALSE;
+#else /* ifdef ECORE_XDPMS */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -84,11 +87,13 @@ EAPI void
 ecore_x_dpms_enabled_set(int enabled)
 {
 #ifdef ECORE_XDPMS
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (enabled)
      DPMSEnable(_ecore_x_disp);
    else
      DPMSDisable(_ecore_x_disp);
-#endif
+
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -99,12 +104,15 @@ ecore_x_dpms_enabled_set(int enabled)
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
-ecore_x_dpms_timeouts_get(unsigned int *standby, unsigned int *suspend, unsigned int *off)
+ecore_x_dpms_timeouts_get(unsigned int *standby,
+                          unsigned int *suspend,
+                          unsigned int *off)
 {
 #ifdef ECORE_XDPMS
-   DPMSGetTimeouts(_ecore_x_disp, (unsigned short *)standby, 
-                  (unsigned short *)suspend, (unsigned short *)off);
-#endif
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   DPMSGetTimeouts(_ecore_x_disp, (unsigned short *)standby,
+                   (unsigned short *)suspend, (unsigned short *)off);
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -114,14 +122,17 @@ ecore_x_dpms_timeouts_get(unsigned int *standby, unsigned int *suspend, unsigned
  * @param off     Amount of time of inactivity before the monitor is shut off.
  * @ingroup Ecore_X_DPMS_Group
  */
-EAPI int
-ecore_x_dpms_timeouts_set(unsigned int standby, unsigned int suspend, unsigned int off)
+EAPI Eina_Bool
+ecore_x_dpms_timeouts_set(unsigned int standby,
+                          unsigned int suspend,
+                          unsigned int off)
 {
 #ifdef ECORE_XDPMS
-   return DPMSSetTimeouts(_ecore_x_disp, standby, suspend, off);
-#else
-   return 0;
-#endif
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return DPMSSetTimeouts(_ecore_x_disp, standby, suspend, off) ? EINA_TRUE : EINA_FALSE;
+#else /* ifdef ECORE_XDPMS */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -130,16 +141,17 @@ ecore_x_dpms_timeouts_set(unsigned int standby, unsigned int suspend, unsigned i
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI unsigned int
-ecore_x_dpms_timeout_standby_get()
+ecore_x_dpms_timeout_standby_get(void)
 {
 #ifdef ECORE_XDPMS
    unsigned short standby, suspend, off;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
    return standby;
-#else
+#else /* ifdef ECORE_XDPMS */
    return 0;
-#endif
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -149,16 +161,17 @@ ecore_x_dpms_timeout_standby_get()
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI unsigned int
-ecore_x_dpms_timeout_suspend_get()
+ecore_x_dpms_timeout_suspend_get(void)
 {
 #ifdef ECORE_XDPMS
    unsigned short standby, suspend, off;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
    return suspend;
-#else
+#else /* ifdef ECORE_XDPMS */
    return 0;
-#endif
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
@@ -168,21 +181,22 @@ ecore_x_dpms_timeout_suspend_get()
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI unsigned int
-ecore_x_dpms_timeout_off_get()
+ecore_x_dpms_timeout_off_get(void)
 {
 #ifdef ECORE_XDPMS
    unsigned short standby, suspend, off;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
    return off;
-#else
+#else /* ifdef ECORE_XDPMS */
    return 0;
-#endif
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
  * Sets the standby timeout (in unit of seconds).
- * @param new_standby Amount of time of inactivity before standby mode will be invoked.
+ * @param new_timeout Amount of time of inactivity before standby mode will be invoked.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
@@ -191,14 +205,15 @@ ecore_x_dpms_timeout_standby_set(unsigned int new_timeout)
 #ifdef ECORE_XDPMS
    unsigned short standby, suspend, off;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
    DPMSSetTimeouts(_ecore_x_disp, new_timeout, suspend, off);
-#endif
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
  * Sets the suspend timeout (in unit of seconds).
- * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
+ * @param new_timeout Amount of time of inactivity before the screen is placed into suspend mode.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
@@ -207,14 +222,15 @@ ecore_x_dpms_timeout_suspend_set(unsigned int new_timeout)
 #ifdef ECORE_XDPMS
    unsigned short standby, suspend, off;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
    DPMSSetTimeouts(_ecore_x_disp, standby, new_timeout, off);
-#endif
+#endif /* ifdef ECORE_XDPMS */
 }
 
 /**
  * Sets the off timeout (in unit of seconds).
- * @param off     Amount of time of inactivity before the monitor is shut off.
+ * @param new_timeout     Amount of time of inactivity before the monitor is shut off.
  * @ingroup Ecore_X_DPMS_Group
  */
 EAPI void
@@ -223,7 +239,9 @@ ecore_x_dpms_timeout_off_set(unsigned int new_timeout)
 #ifdef ECORE_XDPMS
    unsigned short standby, suspend, off;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
    DPMSSetTimeouts(_ecore_x_disp, standby, suspend, new_timeout);
-#endif
+#endif /* ifdef ECORE_XDPMS */
 }
+
index efc1c9c..d1b4111 100644 (file)
@@ -1,17 +1,15 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
 
 #include "ecore_x_private.h"
 
-
 /**
  * @defgroup Ecore_X_Drawable_Group X Drawable Functions
  *
  * Functions that operate on drawables.
  */
 
-
 /**
  * Retrieves the geometry of the given drawable.
  * @param d The given drawable.
  * @ingroup Ecore_X_Drawable_Group
  */
 EAPI void
-ecore_x_drawable_geometry_get(Ecore_X_Drawable d, int *x, int *y, int *w, int *h)
+ecore_x_drawable_geometry_get(Ecore_X_Drawable d,
+                              int *x,
+                              int *y,
+                              int *w,
+                              int *h)
 {
-   Window         dummy_win;
-   int            ret_x, ret_y;
-   unsigned int   ret_w, ret_h, dummy_border, dummy_depth;
+   Window dummy_win;
+   int ret_x, ret_y;
+   unsigned int ret_w, ret_h, dummy_border, dummy_depth;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &ret_x, &ret_y,
                      &ret_w, &ret_h, &dummy_border, &dummy_depth))
-   {
-      ret_x = 0;
-      ret_y = 0;
-      ret_w = 0;
-      ret_h = 0;
-   }
-
-   if (x) *x = ret_x;
-   if (y) *y = ret_y;
-   if (w) *w = (int) ret_w;
-   if (h) *h = (int) ret_h;
+     {
+        ret_x = 0;
+        ret_y = 0;
+        ret_w = 0;
+        ret_h = 0;
+     }
+
+   if (x)
+     *x = ret_x;
+
+   if (y)
+     *y = ret_y;
+
+   if (w)
+     *w = (int)ret_w;
+
+   if (h)
+     *h = (int)ret_h;
 }
 
 /**
@@ -52,15 +62,16 @@ ecore_x_drawable_geometry_get(Ecore_X_Drawable d, int *x, int *y, int *w, int *h
 EAPI int
 ecore_x_drawable_border_width_get(Ecore_X_Drawable d)
 {
-   Window         dummy_win;
-   int            dummy_x, dummy_y;
-   unsigned int   dummy_w, dummy_h, border_ret, dummy_depth;
+   Window dummy_win;
+   int dummy_x, dummy_y;
+   unsigned int dummy_w, dummy_h, border_ret, dummy_depth;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &dummy_x, &dummy_y,
                      &dummy_w, &dummy_h, &border_ret, &dummy_depth))
-      border_ret = 0;
+     border_ret = 0;
 
-   return (int) border_ret;
+   return (int)border_ret;
 }
 
 /**
@@ -72,13 +83,36 @@ ecore_x_drawable_border_width_get(Ecore_X_Drawable d)
 EAPI int
 ecore_x_drawable_depth_get(Ecore_X_Drawable d)
 {
-   Window         dummy_win;
-   int            dummy_x, dummy_y;
-   unsigned int   dummy_w, dummy_h, dummy_border, depth_ret;
+   Window dummy_win;
+   int dummy_x, dummy_y;
+   unsigned int dummy_w, dummy_h, dummy_border, depth_ret;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &dummy_x, &dummy_y,
                      &dummy_w, &dummy_h, &dummy_border, &depth_ret))
-      depth_ret = 0;
+     depth_ret = 0;
 
-   return (int) depth_ret;
+   return (int)depth_ret;
 }
+
+/**
+ * Fill the specified rectangle on a drawable.
+ * @param d The given drawable.
+ * @param gc The graphic context that controls the fill rules.
+ * @param x The X coordinate of the top-left corner of the rectangle.
+ * @param y The Y coordinate of the top-left corner of the rectangle.
+ * @param width The width of the rectangle.
+ * @param height The height of the rectangle.
+ */
+EAPI void
+ecore_x_drawable_rectangle_fill(Ecore_X_Drawable d,
+                                Ecore_X_GC gc,
+                                int x,
+                                int y,
+                                int width,
+                                int height)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XFillRectangle(_ecore_x_disp, d, gc, x, y, width, height);
+}
+
index e36d04a..ea17e64 100644 (file)
@@ -1,10 +1,11 @@
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-/*
  * OLD E hints
  */
-#include "config.h"
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
@@ -16,10 +17,15 @@ ecore_x_e_init(void)
 }
 
 EAPI void
-ecore_x_e_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb)
+ecore_x_e_frame_size_set(Ecore_X_Window win,
+                         int fl,
+                         int fr,
+                         int ft,
+                         int fb)
 {
    unsigned int frames[4];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    frames[0] = fl;
    frames[1] = fr;
    frames[2] = ft;
@@ -28,34 +34,75 @@ ecore_x_e_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb)
 }
 
 EAPI void
-ecore_x_e_virtual_keyboard_set(Ecore_X_Window win, int is_keyboard)
+ecore_x_e_virtual_keyboard_set(Ecore_X_Window win,
+                               unsigned int is_keyboard)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
-                                 &is_keyboard, 1);
+                                  &is_keyboard, 1);
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_e_virtual_keyboard_get(Ecore_X_Window win)
 {
    unsigned int val;
-   
-   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD, &val, 1))
-     return 0;
-   return val;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
 }
 
 static Ecore_X_Virtual_Keyboard_State
 _ecore_x_e_vkbd_state_get(Ecore_X_Atom atom)
 {
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON) return ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF) return ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA) return ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC) return ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN) return ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER) return ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX) return ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL) return ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL;
-   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD) return ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD;
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_IP;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_URL;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD;
+
+   if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME)
+     return ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME;
+
    return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
 }
 
@@ -64,47 +111,1534 @@ _ecore_x_e_vkbd_atom_get(Ecore_X_Virtual_Keyboard_State state)
 {
    switch (state)
      {
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_ON: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
-      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD: return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
-      default: return 0;
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_ON:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_IP:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_URL:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD;
+
+      case ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME:
+        return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME;
+
+      default: break;
      }
    return 0;
 }
 
 EAPI void
-ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window win, Ecore_X_Virtual_Keyboard_State state)
+ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window win,
+                                     Ecore_X_Virtual_Keyboard_State state)
 {
    Ecore_X_Atom atom = 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    atom = _ecore_x_e_vkbd_atom_get(state);
    ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
-                               &atom, 1);
+                                &atom, 1);
 }
 
 EAPI Ecore_X_Virtual_Keyboard_State
 ecore_x_e_virtual_keyboard_state_get(Ecore_X_Window win)
 {
-   Ecore_X_Atom atom;
-   int num;
-   
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
-                                    &atom, 1))
+                                     &atom, 1))
      return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
+
    return _ecore_x_e_vkbd_state_get(atom);
 }
 
 EAPI void
-ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window win, Ecore_X_Virtual_Keyboard_State state)
+ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window win,
+                                      Ecore_X_Virtual_Keyboard_State state)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_client_message32_send(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
-                                ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
-                                _ecore_x_e_vkbd_atom_get(state),
-                                0, 0, 0, 0);
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_x_e_vkbd_atom_get(state),
+                                 0, 0, 0, 0);
+}
+
+static Ecore_X_Atom
+_ecore_x_e_illume_atom_get(Ecore_X_Illume_Mode mode)
+{
+   switch (mode)
+     {
+      case ECORE_X_ILLUME_MODE_SINGLE:
+        return ECORE_X_ATOM_E_ILLUME_MODE_SINGLE;
+
+      case ECORE_X_ILLUME_MODE_DUAL_TOP:
+        return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP;
+
+      case ECORE_X_ILLUME_MODE_DUAL_LEFT:
+        return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT;
+
+      default:
+        break;
+     }
+   return ECORE_X_ILLUME_MODE_UNKNOWN;
+}
+
+static Ecore_X_Illume_Mode
+_ecore_x_e_illume_mode_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_MODE_SINGLE)
+     return ECORE_X_ILLUME_MODE_SINGLE;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP)
+     return ECORE_X_ILLUME_MODE_DUAL_TOP;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT)
+     return ECORE_X_ILLUME_MODE_DUAL_LEFT;
+
+   return ECORE_X_ILLUME_MODE_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_zone_set(Ecore_X_Window win,
+                          Ecore_X_Window zone)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE,
+                                  &zone, 1);
+}
+
+EAPI Ecore_X_Window
+ecore_x_e_illume_zone_get(Ecore_X_Window win)
+{
+   Ecore_X_Window zone;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_window_get(win, ECORE_X_ATOM_E_ILLUME_ZONE,
+                                       &zone, 1))
+     return 0;
+
+   return zone;
+}
+
+EAPI void
+ecore_x_e_illume_zone_list_set(Ecore_X_Window win,
+                               Ecore_X_Window *zones,
+                               unsigned int n_zones)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE_LIST,
+                                  zones, n_zones);
+}
+
+EAPI void
+ecore_x_e_illume_conformant_set(Ecore_X_Window win,
+                                unsigned int is_conformant)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
+                                  &is_conformant, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_conformant_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_illume_mode_set(Ecore_X_Window win,
+                          Ecore_X_Illume_Mode mode)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_illume_atom_get(mode);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_MODE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Mode
+ecore_x_e_illume_mode_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_ILLUME_MODE, &atom, 1))
+     return ECORE_X_ILLUME_MODE_UNKNOWN;
+
+   return _ecore_x_e_illume_mode_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_mode_send(Ecore_X_Window win,
+                           Ecore_X_Illume_Mode mode)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_MODE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_x_e_illume_atom_get(mode),
+                                 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_focus_back_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_BACK,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_focus_forward_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_focus_home_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_HOME,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_close_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_CLOSE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_home_new_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_NEW,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_home_del_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_DEL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_next_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_NEXT, 
+                                 0, 0, 0);
 }
+
+EAPI void
+ecore_x_e_illume_access_action_prev_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_PREV,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_activate_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE, 
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_read_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_read_next_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_NEXT,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_read_prev_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_PREV,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_up_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_access_action_down_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 win,
+                                 ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN,
+                                 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_drag_set(Ecore_X_Window win,
+                          unsigned int drag)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG, &drag, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_drag_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG, &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_illume_drag_locked_set(Ecore_X_Window win,
+                                 unsigned int is_locked)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
+                                  &is_locked, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_drag_locked_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_illume_drag_start_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_START,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_drag_end_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_END,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_indicator_geometry_set(Ecore_X_Window win,
+                                        int x,
+                                        int y,
+                                        int w,
+                                        int h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_indicator_geometry_get(Ecore_X_Window win,
+                                        int *x,
+                                        int *y,
+                                        int *w,
+                                        int *h)
+{
+   int ret = 0;
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret =
+     ecore_x_window_prop_card32_get(win,
+                                    ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
+                                    geom, 4);
+   if (ret != 4)
+     return EINA_FALSE;
+
+   if (x)
+     *x = geom[0];
+
+   if (y)
+     *y = geom[1];
+
+   if (w)
+     *w = geom[2];
+
+   if (h)
+     *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_e_illume_softkey_geometry_set(Ecore_X_Window win,
+                                      int x,
+                                      int y,
+                                      int w,
+                                      int h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_softkey_geometry_get(Ecore_X_Window win,
+                                      int *x,
+                                      int *y,
+                                      int *w,
+                                      int *h)
+{
+   int ret = 0;
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret =
+     ecore_x_window_prop_card32_get(win,
+                                    ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
+                                    geom, 4);
+   if (ret != 4)
+     return EINA_FALSE;
+
+   if (x)
+     *x = geom[0];
+
+   if (y)
+     *y = geom[1];
+
+   if (w)
+     *w = geom[2];
+
+   if (h)
+     *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+EAPI void
+ecore_x_e_illume_keyboard_geometry_set(Ecore_X_Window win,
+                                       int x,
+                                       int y,
+                                       int w,
+                                       int h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_keyboard_geometry_get(Ecore_X_Window win,
+                                       int *x,
+                                       int *y,
+                                       int *w,
+                                       int *h)
+{
+   int ret = 0;
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret =
+     ecore_x_window_prop_card32_get(win,
+                                    ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
+                                    geom, 4);
+   if (ret != 4)
+     return EINA_FALSE;
+
+   if (x)
+     *x = geom[0];
+
+   if (y)
+     *y = geom[1];
+
+   if (w)
+     *w = geom[2];
+
+   if (h)
+     *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+static Ecore_X_Atom
+_ecore_x_e_quickpanel_atom_get(Ecore_X_Illume_Quickpanel_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_QUICKPANEL_STATE_ON:
+        return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON;
+
+      case ECORE_X_ILLUME_QUICKPANEL_STATE_OFF:
+        return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Quickpanel_State
+_ecore_x_e_quickpanel_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON)
+     return ECORE_X_ILLUME_QUICKPANEL_STATE_ON;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF)
+     return ECORE_X_ILLUME_QUICKPANEL_STATE_OFF;
+
+   return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_set(Ecore_X_Window win,
+                                unsigned int is_quickpanel)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
+                                  &is_quickpanel, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_quickpanel_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
+                                       &val, 1))
+     return EINA_FALSE;
+
+   return val ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_state_set(Ecore_X_Window win,
+                                      Ecore_X_Illume_Quickpanel_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_quickpanel_atom_get(state);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Quickpanel_State
+ecore_x_e_illume_quickpanel_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
+
+   return _ecore_x_e_quickpanel_state_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_state_send(Ecore_X_Window win,
+                                       Ecore_X_Illume_Quickpanel_State state)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_x_e_quickpanel_atom_get(state),
+                                 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_state_toggle(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win,
+                                 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 0, 0, 0, 0, 0);
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_priority_major_set(Ecore_X_Window win,
+                                               unsigned int priority)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
+                                  &priority, 1);
+}
+
+EAPI int
+ecore_x_e_illume_quickpanel_priority_major_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
+                                       &val, 1))
+     return 0;
+
+   return val;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_priority_minor_set(Ecore_X_Window win,
+                                               unsigned int priority)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
+                                  &priority, 1);
+}
+
+EAPI int
+ecore_x_e_illume_quickpanel_priority_minor_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
+                                       &val, 1))
+     return 0;
+
+   return val;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_zone_set(Ecore_X_Window win,
+                                     unsigned int zone)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
+                                  &zone, 1);
+}
+
+EAPI int
+ecore_x_e_illume_quickpanel_zone_get(Ecore_X_Window win)
+{
+   unsigned int val = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
+                                       &val, 1))
+     return 0;
+
+   return val;
+}
+
+EAPI void
+ecore_x_e_illume_quickpanel_position_update_send(Ecore_X_Window win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win,
+                                 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 1, 0, 0, 0, 0);
+}
+
+static Ecore_X_Atom
+_ecore_x_e_clipboard_atom_get(Ecore_X_Illume_Clipboard_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_CLIPBOARD_STATE_ON:
+        return ECORE_X_ATOM_E_ILLUME_CLIPBOARD_ON;
+      case ECORE_X_ILLUME_CLIPBOARD_STATE_OFF:
+        return ECORE_X_ATOM_E_ILLUME_CLIPBOARD_OFF;
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Clipboard_State
+_ecore_x_e_clipboard_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_CLIPBOARD_ON)
+     return ECORE_X_ILLUME_CLIPBOARD_STATE_ON;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_CLIPBOARD_OFF)
+     return ECORE_X_ILLUME_CLIPBOARD_STATE_OFF;
+
+   return ECORE_X_ILLUME_INDICATOR_STATE_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_clipboard_state_set(Ecore_X_Window win,
+                                     Ecore_X_Illume_Clipboard_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_clipboard_atom_get(state);
+
+   ecore_x_window_prop_atom_set(win,
+                                ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Clipboard_State
+ecore_x_e_illume_clipboard_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_CLIPBOARD_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_CLIPBOARD_STATE_UNKNOWN;
+   return _ecore_x_e_clipboard_state_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_clipboard_geometry_set(Ecore_X_Window win,
+                                        int x, int y, int w, int h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY,
+                                  geom, 4);
+}
+
+EAPI Eina_Bool
+ecore_x_e_illume_clipboard_geometry_get(Ecore_X_Window win,
+                                        int *x, int *y, int *w, int *h)
+{
+   int ret = 0;
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret =
+      ecore_x_window_prop_card32_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_CLIPBOARD_GEOMETRY,
+                                     geom, 4);
+   if (ret != 4) return EINA_FALSE;
+
+   if (x) *x = geom[0];
+   if (y) *y = geom[1];
+   if (w) *w = geom[2];
+   if (h) *h = geom[3];
+
+   return EINA_TRUE;
+}
+
+/* for sliding window */
+EAPI void 
+ecore_x_e_illume_sliding_win_state_set(Ecore_X_Window win,
+                                       unsigned int   is_visible)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_card32_set(win, 
+                                  ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_STATE, 
+                                  &is_visible, 1);
+} /* ecore_x_e_illume_sliding_win_state_set */
+
+EAPI int 
+ecore_x_e_illume_sliding_win_state_get(Ecore_X_Window win)
+{
+   unsigned int is_visible = 0;
+   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_STATE, 
+                                       &is_visible, 1))
+      return 0;
+
+   return is_visible;
+}
+
+EAPI void
+ecore_x_e_illume_sliding_win_geometry_set(Ecore_X_Window win,
+                                          int            x,
+                                          int            y,
+                                          int            w,
+                                          int            h)
+{
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_GEOMETRY, 
+                                  geom, 4);
+} /* ecore_x_e_illume_sliding_win_geometry_set */
+
+EAPI int 
+ecore_x_e_illume_sliding_win_geometry_get(Ecore_X_Window win,
+                                          int           *x,
+                                          int           *y,
+                                          int           *w,
+                                          int           *h)
+{
+   int ret = 0;
+   unsigned int geom[4];
+   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = 
+     ecore_x_window_prop_card32_get(win, 
+                                    ECORE_X_ATOM_E_ILLUME_SLIDING_WIN_GEOMETRY, 
+                                    geom, 4);
+   if (ret != 4)
+      return 0;
+   
+   if (x)
+      *x = geom[0];
+   
+   if (y)
+      *y = geom[1];
+   
+   if (w)
+      *w = geom[2];
+   
+   if (h)
+      *h = geom[3];
+   
+   return 1;
+}/* ecore_x_e_illume_sliding_win_geometry_get */
+
+EAPI void
+ecore_x_e_comp_sync_counter_set(Ecore_X_Window win,
+                                Ecore_X_Sync_Counter counter)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (counter)
+     ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
+                                 ECORE_X_ATOM_CARDINAL, &counter, 1);
+   else
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER);
+}
+
+EAPI Ecore_X_Sync_Counter
+ecore_x_e_comp_sync_counter_get(Ecore_X_Window win)
+{
+   int ret = 0;
+   Ecore_X_Sync_Counter counter = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret =
+     ecore_x_window_prop_xid_get(win,
+                                 ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
+                                 ECORE_X_ATOM_CARDINAL,
+                                 &counter, 1);
+   if (ret != 1)
+     return 0;
+
+   return counter;
+}
+
+EAPI void
+ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window root,
+                                   Ecore_X_Window win)
+{
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
+
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // version
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+
+   XSendEvent(_ecore_x_disp, root, False,
+              SubstructureRedirectMask | SubstructureNotifyMask,
+              &xev);
+}
+
+EAPI void
+ecore_x_e_comp_sync_draw_size_done_send(Ecore_X_Window root,
+                                        Ecore_X_Window win,
+                                        int w,
+                                        int h)
+{
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
+
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 1; // version
+   xev.xclient.data.l[2] = w; // win width at draw time
+   xev.xclient.data.l[3] = h; // win height at draw time
+   xev.xclient.data.l[4] = 0; // later
+
+   XSendEvent(_ecore_x_disp, root, False,
+              SubstructureRedirectMask | SubstructureNotifyMask,
+              &xev);
+}
+
+/*
+ * @since 1.3
+ * 
+ */
+EAPI void
+ecore_x_e_window_profile_list_set(Ecore_X_Window  win,
+                                  const char    **profiles,
+                                  unsigned int    num_profiles)
+{
+   Ecore_X_Atom *atoms;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!win)
+     return;
+
+   if (!num_profiles)
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_PROFILE_LIST);
+   else
+     {
+        atoms = alloca(num_profiles * sizeof(Ecore_X_Atom));
+        ecore_x_atoms_get(profiles, num_profiles, atoms);
+        ecore_x_window_prop_property_set(win,
+                                         ECORE_X_ATOM_E_PROFILE_LIST,
+                                         XA_ATOM, 32, (void *)atoms,
+                                         num_profiles);
+     }
+}
+
+/*
+ * @since 1.3
+ */
+EAPI Eina_Bool
+ecore_x_e_window_profile_list_get(Ecore_X_Window   win,
+                                  const char    ***profiles,
+                                  int             *ret_num)
+{
+   unsigned char *data;
+   Ecore_X_Atom *atoms;
+   int num, i;
+
+   if (ret_num)
+     *ret_num = 0;
+
+   if (profiles)
+     *profiles = NULL;
+
+   if (!win)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_property_get(win,
+                                         ECORE_X_ATOM_E_PROFILE_LIST,
+                                         XA_ATOM, 32, &data, &num))
+     return EINA_FALSE;
+
+   if (ret_num)
+     *ret_num = num;
+
+   if (profiles)
+     {
+        (*profiles) = calloc(num, sizeof(char *));
+        if (!(*profiles))
+          {
+             if (ret_num)
+               *ret_num = 0;
+
+             if (data)
+               free(data);
+
+             return EINA_FALSE;
+          }
+
+        atoms = (Ecore_X_Atom *)data;
+        for (i = 0; i < num; i++)
+           (*profiles)[i] = ecore_x_atom_name_get(atoms[i]);
+     }
+
+   if (data)
+     XFree(data);
+
+   return EINA_TRUE;
+}
+
+/*
+ * @since 1.3
+ */
+EAPI void
+ecore_x_e_window_profile_set(Ecore_X_Window win,
+                             const char    *profile)
+{
+   Ecore_X_Atom atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!win)
+     return;
+
+   if (!profile)
+     ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_PROFILE);
+   else
+     {
+        atom = ecore_x_atom_get(profile);
+        ecore_x_window_prop_property_set(win, ECORE_X_ATOM_E_PROFILE,
+                                         XA_ATOM, 32, (void *)&atom, 1);
+     }
+}
+
+/*
+ * @since 1.3 
+ */
+EAPI char *
+ecore_x_e_window_profile_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom *atom = NULL;
+   unsigned char *data;
+   char *profile = NULL;
+   int num;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_E_PROFILE,
+                                         XA_ATOM, 32, &data, &num))
+     return NULL;
+
+   if (data)
+     atom = (Ecore_X_Atom *)data;
+
+   if (atom)
+     profile = ecore_x_atom_name_get(atom[0]);
+
+   return profile;
+}
+
+EAPI void
+ecore_x_e_comp_sync_supported_set(Ecore_X_Window root,
+                                  Eina_Bool enabled)
+{
+   Ecore_X_Window win;
+
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (enabled)
+     {
+        win = ecore_x_window_new(root, 1, 2, 3, 4);
+        ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                    ECORE_X_ATOM_WINDOW, &win, 1);
+        ecore_x_window_prop_xid_set(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                    ECORE_X_ATOM_WINDOW, &win, 1);
+     }
+   else
+     {
+        int ret;
+
+        ret =
+          ecore_x_window_prop_xid_get(root,
+                                      ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                      ECORE_X_ATOM_WINDOW,
+                                      &win, 1);
+        if ((ret == 1) && (win))
+          {
+             ecore_x_window_prop_property_del(
+               root,
+               ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED);
+             ecore_x_window_free(win);
+          }
+     }
+}
+
+EAPI Eina_Bool
+ecore_x_e_comp_sync_supported_get(Ecore_X_Window root)
+{
+   Ecore_X_Window win, win2;
+   int ret;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
+
+   ret =
+     ecore_x_window_prop_xid_get(root,
+                                 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                 ECORE_X_ATOM_WINDOW,
+                                 &win, 1);
+   if ((ret == 1) && (win))
+     {
+        ret =
+          ecore_x_window_prop_xid_get(win,
+                                      ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
+                                      ECORE_X_ATOM_WINDOW,
+                                      &win2, 1);
+        if ((ret == 1) && (win2 == win))
+          return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+EAPI void
+ecore_x_e_comp_sync_begin_send(Ecore_X_Window win)
+{
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+
+   XSendEvent(_ecore_x_disp, win, False,
+              NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
+              &xev);
+}
+
+EAPI void
+ecore_x_e_comp_sync_end_send(Ecore_X_Window win)
+{
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_END;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+
+   XSendEvent(_ecore_x_disp, win, False,
+              NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
+              &xev);
+}
+
+EAPI void
+ecore_x_e_comp_sync_cancel_send(Ecore_X_Window win)
+{
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_CANCEL;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+
+   XSendEvent(_ecore_x_disp, win, False,
+              NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
+              &xev);
+}
+
+EAPI void
+ecore_x_e_comp_flush_send(Ecore_X_Window win)
+{
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_FLUSH;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+
+   XSendEvent(_ecore_x_disp, win, False,
+              NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
+              &xev);
+}
+
+EAPI void
+ecore_x_e_comp_dump_send(Ecore_X_Window win)
+{
+   XEvent xev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.type = ClientMessage;
+   xev.xclient.display = _ecore_x_disp;
+   xev.xclient.window = win;
+   xev.xclient.message_type = ECORE_X_ATOM_E_COMP_DUMP;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = win;
+   xev.xclient.data.l[1] = 0; // later
+   xev.xclient.data.l[2] = 0; // later
+   xev.xclient.data.l[3] = 0; // later
+   xev.xclient.data.l[4] = 0; // later
+
+   XSendEvent(_ecore_x_disp, win, False,
+              NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
+              &xev);
+}
+
+EAPI void
+ecore_x_e_comp_pixmap_set(Ecore_X_Window win,
+                          Ecore_X_Pixmap pixmap)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (pixmap)
+     ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_PIXMAP,
+                                 ECORE_X_ATOM_PIXMAP, &pixmap, 1);
+   else
+     ecore_x_window_prop_property_del(win, pixmap);
+}
+
+EAPI Ecore_X_Pixmap
+ecore_x_e_comp_pixmap_get(Ecore_X_Window win)
+{
+   int ret = 0;
+   Ecore_X_Pixmap pixmap = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret =
+     ecore_x_window_prop_xid_get(win,
+                                 ECORE_X_ATOM_E_COMP_PIXMAP,
+                                 ECORE_X_ATOM_PIXMAP,
+                                 &pixmap, 1);
+   if (ret != 1)
+     return 0;
+
+   return pixmap;
+}
+
+static Ecore_X_Atom
+_ecore_x_e_indicator_atom_get(Ecore_X_Illume_Indicator_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_INDICATOR_STATE_ON:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_ON;
+
+      case ECORE_X_ILLUME_INDICATOR_STATE_OFF:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_OFF;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Indicator_State
+_ecore_x_e_indicator_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_ON)
+     return ECORE_X_ILLUME_INDICATOR_STATE_ON;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_OFF)
+     return ECORE_X_ILLUME_INDICATOR_STATE_OFF;
+
+   return ECORE_X_ILLUME_INDICATOR_STATE_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_indicator_state_set(Ecore_X_Window win,
+                                     Ecore_X_Illume_Indicator_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_indicator_atom_get(state);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Indicator_State
+ecore_x_e_illume_indicator_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_INDICATOR_STATE_UNKNOWN;
+
+   return _ecore_x_e_indicator_state_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_indicator_state_send(Ecore_X_Window win,
+                                      Ecore_X_Illume_Indicator_State state)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_INDICATOR_STATE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_x_e_indicator_atom_get(state),
+                                 0, 0, 0, 0);
+}
+
+static Ecore_X_Atom
+_ecore_x_e_indicator_opacity_atom_get(Ecore_X_Illume_Indicator_Opacity_Mode mode)
+{
+   switch (mode)
+     {
+      case ECORE_X_ILLUME_INDICATOR_OPAQUE:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_OPAQUE;
+
+      case ECORE_X_ILLUME_INDICATOR_TRANSLUCENT:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSLUCENT;
+
+      case ECORE_X_ILLUME_INDICATOR_TRANSPARENT:
+        return ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSPARENT;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Indicator_Opacity_Mode
+_ecore_x_e_indicator_opacity_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_OPAQUE)
+     return ECORE_X_ILLUME_INDICATOR_OPAQUE;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSLUCENT)
+     return ECORE_X_ILLUME_INDICATOR_TRANSLUCENT;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_INDICATOR_TRANSPARENT)
+     return ECORE_X_ILLUME_INDICATOR_TRANSPARENT;
+
+   return ECORE_X_ILLUME_INDICATOR_OPACITY_UNKNOWN;
+}
+
+EAPI void
+ecore_x_e_illume_indicator_opacity_set(Ecore_X_Window win,
+                                     Ecore_X_Illume_Indicator_Opacity_Mode mode)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_indicator_opacity_atom_get(mode);
+   ecore_x_window_prop_atom_set(win,
+                                ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Indicator_Opacity_Mode
+ecore_x_e_illume_indicator_opacity_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_INDICATOR_OPACITY_UNKNOWN;
+
+   return _ecore_x_e_indicator_opacity_get(atom);
+}
+
+EAPI void
+ecore_x_e_illume_indicator_opacity_send(Ecore_X_Window win,
+                                      Ecore_X_Illume_Indicator_Opacity_Mode mode)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_client_message32_send(win,
+                                 ECORE_X_ATOM_E_ILLUME_INDICATOR_OPACITY_MODE,
+                                 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                 _ecore_x_e_indicator_opacity_atom_get(mode),
+                                 0, 0, 0, 0);
+}
+
+static Ecore_X_Atom
+_ecore_x_e_illume_window_state_atom_get(Ecore_X_Illume_Window_State state)
+{
+   switch (state)
+     {
+      case ECORE_X_ILLUME_WINDOW_STATE_NORMAL:
+        return ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL;
+
+      case ECORE_X_ILLUME_WINDOW_STATE_FLOATING:
+        return ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING;
+
+      default:
+        break;
+     }
+   return 0;
+}
+
+static Ecore_X_Illume_Window_State
+_ecore_x_e_illume_window_state_get(Ecore_X_Atom atom)
+{
+   if (atom == ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_NORMAL)
+     return ECORE_X_ILLUME_WINDOW_STATE_NORMAL;
+
+   if (atom == ECORE_X_ATOM_E_ILLUME_WINDOW_STATE_FLOATING)
+     return ECORE_X_ILLUME_WINDOW_STATE_FLOATING;
+
+   return ECORE_X_ILLUME_WINDOW_STATE_NORMAL;
+}
+
+EAPI void
+ecore_x_e_illume_window_state_set(Ecore_X_Window win,
+                                  Ecore_X_Illume_Window_State state)
+{
+   Ecore_X_Atom atom = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   atom = _ecore_x_e_illume_window_state_atom_get(state);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_WINDOW_STATE,
+                                &atom, 1);
+}
+
+EAPI Ecore_X_Illume_Window_State
+ecore_x_e_illume_window_state_get(Ecore_X_Window win)
+{
+   Ecore_X_Atom atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!ecore_x_window_prop_atom_get(win,
+                                     ECORE_X_ATOM_E_ILLUME_WINDOW_STATE,
+                                     &atom, 1))
+     return ECORE_X_ILLUME_WINDOW_STATE_NORMAL;
+
+   return _ecore_x_e_illume_window_state_get(atom);
+}
+
index 3de31d6..f6eb075 100644 (file)
@@ -1,27 +1,36 @@
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 
-static void _ecore_x_error_handle(Display * d, XErrorEvent * ev);
-static int  _ecore_x_io_error_handle(Display *d);
+static int _ecore_x_error_handle(Display *d,
+                                 XErrorEvent *ev);
+static int _ecore_x_io_error_handle(Display *d);
 
-static void (*_error_func) (void *data) = NULL;
+static void (*_error_func)(void *data) = NULL;
 static void *_error_data = NULL;
-static void (*_io_error_func) (void *data) = NULL;
+static void (*_io_error_func)(void *data) = NULL;
 static void *_io_error_data = NULL;
-static int   _error_request_code = 0;
-static int   _error_code = 0;
+static int _error_request_code = 0;
+static int _error_code = 0;
+static Ecore_X_ID _error_resource_id = 0;
 
 /**
  * Set the error handler.
  * @param func The error handler function
  * @param data The data to be passed to the handler function
- * 
+ *
  * Set the X error handler function
  */
 EAPI void
-ecore_x_error_handler_set(void (*func) (void *data), const void *data)
+ecore_x_error_handler_set(void (*func)(void *data),
+                          const void *data)
 {
    _error_func = func;
    _error_data = (void *)data;
@@ -31,11 +40,12 @@ ecore_x_error_handler_set(void (*func) (void *data), const void *data)
  * Set the I/O error handler.
  * @param func The I/O error handler function
  * @param data The data to be passed to the handler function
- * 
+ *
  * Set the X I/O error handler function
  */
 EAPI void
-ecore_x_io_error_handler_set(void (*func) (void *data), const void *data)
+ecore_x_io_error_handler_set(void (*func)(void *data),
+                             const void *data)
 {
    _io_error_func = func;
    _io_error_data = (void *)data;
@@ -44,7 +54,7 @@ ecore_x_io_error_handler_set(void (*func) (void *data), const void *data)
 /**
  * Get the request code that caused the error.
  * @return The request code causing the X error
- * 
+ *
  * Return the X request code that caused the last X error
  */
 EAPI int
@@ -56,40 +66,61 @@ ecore_x_error_request_get(void)
 /**
  * Get the error code from the error.
  * @return The error code from the X error
- * 
+ *
  * Return the error code from the last X error
  */
+//FIXME: Use Ecore_X_Error_Code type when 2.0 is released
 EAPI int
 ecore_x_error_code_get(void)
 {
    return _error_code;
 }
 
+/**
+ * Get the resource id that caused the error.
+ * @return The resource id causing the X error
+ *
+ * Return the X resource id that caused the last X error
+ */
+EAPI Ecore_X_ID
+ecore_x_error_resource_id_get(void)
+{
+   return _error_resource_id;
+}
+
 void
 _ecore_x_error_handler_init(void)
 {
    XSetErrorHandler((XErrorHandler)_ecore_x_error_handle);
-   XSetIOErrorHandler((XIOErrorHandler)_ecore_x_io_error_handle);   
+   XSetIOErrorHandler((XIOErrorHandler)_ecore_x_io_error_handle);
 }
 
-static void
-_ecore_x_error_handle(Display *d, XErrorEvent *ev)
+static int
+_ecore_x_error_handle(Display *d,
+                      XErrorEvent *ev)
 {
-    if (d == _ecore_x_disp)
+   if (d == _ecore_x_disp)
      {
-       _error_request_code = ev->request_code;
-       _error_code = ev->error_code;
-       if (_error_func) _error_func(_error_data);
+        _error_request_code = ev->request_code;
+        _error_code = ev->error_code;
+        _error_resource_id = ev->resourceid;
+        if (_error_func)
+          _error_func(_error_data);
      }
+   return 0;
 }
 
 static int
 _ecore_x_io_error_handle(Display *d)
 {
-    if (d == _ecore_x_disp)
+   if (d == _ecore_x_disp)
      {
-       if (_io_error_func) _io_error_func(_io_error_data);
-       else exit(-1);
+        if (_io_error_func)
+          _io_error_func(_io_error_data);
+        else
+          exit(-1);
      }
+
    return 0;
 }
+
index 59bacb2..7d685cf 100644 (file)
@@ -1,10 +1,15 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
 #include <langinfo.h>
 
-#include "ecore_private.h"
 #include "Ecore.h"
+#include "ecore_private.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include "Ecore_X_Atoms.h"
 
 #ifndef CODESET
 #define CODESET "INVALID"
-#endif
-
-#if 0
-static void _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev);
-static void _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev);
-#endif
-static void _ecore_x_event_free_key_down(void *data, void *ev);
-static void _ecore_x_event_free_key_up(void *data, void *ev);
-
-static Window _ecore_x_mouse_down_last_win = 0;
-static Window _ecore_x_mouse_down_last_last_win = 0;
-static Window _ecore_x_mouse_down_last_event_win = 0;
-static Window _ecore_x_mouse_down_last_last_event_win = 0;
-static Time _ecore_x_mouse_down_last_time = 0;
-static Time _ecore_x_mouse_down_last_last_time = 0;
-static int _ecore_x_mouse_up_count = 0;
-static int _ecore_x_mouse_down_did_triple = 0;
-
-EAPI void
-ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask)
-{
-   XWindowAttributes attr;
-   XSetWindowAttributes s_attr;
-
-   if (!w)
-      w = DefaultRootWindow(_ecore_x_disp);
-
-   memset(&attr, 0, sizeof(XWindowAttributes));
-   XGetWindowAttributes(_ecore_x_disp, w, &attr);
-   s_attr.event_mask = mask | attr.your_event_mask;
-   XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
-}
+#endif /* ifndef CODESET */
 
-EAPI void
-ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask)
+typedef struct _Ecore_X_Mouse_Down_Info
 {
-   XWindowAttributes attr;
-   XSetWindowAttributes s_attr;
-
-   if (!w)
-      w = DefaultRootWindow(_ecore_x_disp);
+   EINA_INLIST;
+   int       dev;
+   Window    last_win;
+   Window    last_last_win;
+   Window    last_event_win;
+   Window    last_last_event_win;
+   Time      last_time;
+   Time      last_last_time;
+   Eina_Bool did_double : 1;
+   Eina_Bool did_triple : 1;
+} Ecore_X_Mouse_Down_Info;
+
+static int _ecore_x_last_event_mouse_move = 0;
+static Ecore_Event *_ecore_x_last_event_mouse_move_event = NULL;
+static Eina_Inlist *_ecore_x_mouse_down_info_list = NULL;
 
-   memset(&attr, 0, sizeof(XWindowAttributes));
-   XGetWindowAttributes(_ecore_x_disp, w, &attr);
-   s_attr.event_mask = attr.your_event_mask & ~mask;
-   XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
-}
-
-#if 0
 static void
-_ecore_x_event_free_window_prop_name_class_change(void *data, void *ev)
+_ecore_x_mouse_down_info_clear(void)
 {
-   Ecore_X_Event_Window_Prop_Name_Class_Change *e;
-   
-   e = ev;
-   if (e->name) free(e->name);
-   if (e->clas) free(e->clas);
-   free(e);
+   Eina_Inlist *l = _ecore_x_mouse_down_info_list;
+   Ecore_X_Mouse_Down_Info *info = NULL;
+   while (l)
+     {
+        info = EINA_INLIST_CONTAINER_GET(l, Ecore_X_Mouse_Down_Info);
+        l = eina_inlist_remove(l, l);
+        free(info);
+     }
+   _ecore_x_mouse_down_info_list = NULL;
 }
 
-static void
-_ecore_x_event_free_window_prop_title_change(void *data, void *ev)
+void
+_ecore_x_events_init(void)
 {
-   Ecore_X_Event_Window_Prop_Title_Change *e;
-   
-   e = ev;
-   if (e->title) free(e->title);
-   free(e);
+   //Actually, Nothing to do.
 }
 
-static void
-_ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev)
+void
+_ecore_x_events_shutdown(void)
 {
-   Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
-   
-   e = ev;
-   if (e->title) free(e->title);
-   free(e);
+   _ecore_x_mouse_down_info_clear();
 }
 
-static void
-_ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev)
+static Ecore_X_Mouse_Down_Info *
+_ecore_x_mouse_down_info_get(int dev)
 {
-   Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
-   
-   e = ev;
-   if (e->name) free(e->name);
-   free(e);
-}
+   Eina_Inlist *l = _ecore_x_mouse_down_info_list;
+   Ecore_X_Mouse_Down_Info *info = NULL;
 
-static void
-_ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev)
-{
-   Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
-   
-   e = ev;
-   if (e->name) free(e->name);
-   free(e);
+   //Return the exist info
+   EINA_INLIST_FOREACH(l, info)
+     if (info->dev == dev) return info;
+
+   //New Device. Add it.
+   info = calloc(1, sizeof(Ecore_X_Mouse_Down_Info));
+   if (!info) return NULL;
+
+   info->dev = dev;
+   l = eina_inlist_append(l, (Eina_Inlist *)info);
+   _ecore_x_mouse_down_info_list = l;
+   return info;
 }
 
 static void
-_ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev)
+_ecore_x_event_free_mouse_move(void *data __UNUSED__,
+                               void *ev)
 {
-   Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
-   
+   Ecore_Event_Mouse_Move *e;
+
    e = ev;
-   if (e->name) free(e->name);
+   if (_ecore_x_last_event_mouse_move)
+     {
+        _ecore_x_last_event_mouse_move_event = NULL;
+        _ecore_x_last_event_mouse_move = 0;
+     }
+
    free(e);
 }
-#endif
 
-static void
-_ecore_x_event_free_key_down(void *data __UNUSED__, void *ev)
+EAPI void
+ecore_x_event_mask_set(Ecore_X_Window w,
+                       Ecore_X_Event_Mask mask)
 {
-   Ecore_X_Event_Key_Down *e;
+   XWindowAttributes attr;
+   XSetWindowAttributes s_attr;
 
-   e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->key_compose) free(e->key_compose);
-   free(e);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!w)
+     w = DefaultRootWindow(_ecore_x_disp);
+
+   memset(&attr, 0, sizeof(XWindowAttributes));
+   XGetWindowAttributes(_ecore_x_disp, w, &attr);
+   s_attr.event_mask = mask | attr.your_event_mask;
+   XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
 }
 
-static void
-_ecore_x_event_free_key_up(void *data __UNUSED__, void *ev)
+EAPI void
+ecore_x_event_mask_unset(Ecore_X_Window w,
+                         Ecore_X_Event_Mask mask)
 {
-   Ecore_X_Event_Key_Up *e;
+   XWindowAttributes attr;
+   XSetWindowAttributes s_attr;
 
-   e = ev;
-   if (e->keyname) free(e->keyname);
-   if (e->keysymbol) free(e->keysymbol);
-   if (e->key_compose) free(e->key_compose);
-   free(e);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!w)
+     w = DefaultRootWindow(_ecore_x_disp);
+
+   memset(&attr, 0, sizeof(XWindowAttributes));
+   XGetWindowAttributes(_ecore_x_disp, w, &attr);
+   s_attr.event_mask = attr.your_event_mask & ~mask;
+   XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
 }
 
 static void
-_ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
+_ecore_x_event_free_xdnd_enter(void *data __UNUSED__,
+                               void *ev)
 {
    Ecore_X_Event_Xdnd_Enter *e;
    int i;
@@ -168,7 +151,8 @@ _ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
 }
 
 static void
-_ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev)
+_ecore_x_event_free_selection_notify(void *data __UNUSED__,
+                                     void *ev)
 {
    Ecore_X_Event_Selection_Notify *e;
    Ecore_X_Selection_Data *sel;
@@ -177,114 +161,360 @@ _ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev)
    sel = e->data;
    if (sel->free)
      sel->free(sel);
+
    free(e->target);
    free(e);
 }
 
+static unsigned int
+_ecore_x_event_modifiers(unsigned int state)
+{
+   unsigned int modifiers = 0;
+
+   if (state & ECORE_X_MODIFIER_SHIFT)
+     modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
+
+   if (state & ECORE_X_MODIFIER_CTRL)
+     modifiers |= ECORE_EVENT_MODIFIER_CTRL;
+
+   if (state & ECORE_X_MODIFIER_ALT)
+     modifiers |= ECORE_EVENT_MODIFIER_ALT;
+
+   if (state & ECORE_X_MODIFIER_WIN)
+     modifiers |= ECORE_EVENT_MODIFIER_WIN;
+
+   if (state & ECORE_X_MODIFIER_ALTGR)
+     modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
+
+   if (state & ECORE_X_LOCK_SCROLL)
+     modifiers |= ECORE_EVENT_LOCK_SCROLL;
+
+   if (state & ECORE_X_LOCK_NUM)
+     modifiers |= ECORE_EVENT_LOCK_NUM;
+
+   if (state & ECORE_X_LOCK_CAPS)
+     modifiers |= ECORE_EVENT_LOCK_CAPS;
+
+   if (state & ECORE_X_LOCK_SHIFT)
+     modifiers |= ECORE_EVENT_LOCK_SHIFT;
+
+   return modifiers;
+}
+
 void
-_ecore_x_event_handle_key_press(XEvent *xevent)
+_ecore_mouse_move(unsigned int timestamp,
+                  unsigned int xmodifiers,
+                  int x,
+                  int y,
+                  int x_root,
+                  int y_root,
+                  unsigned int event_window,
+                  unsigned int window,
+                  unsigned int root_win,
+                  int same_screen,
+                  int dev,
+                  double radx,
+                  double rady,
+                  double pressure,
+                  double angle,
+                  double mx,
+                  double my,
+                  double mrx,
+                  double mry)
 {
-   Ecore_X_Event_Key_Down *e;
-   char                   *keyname;
-   int                     val;
-   char                    buf[256];
-   KeySym                  sym;
-   XComposeStatus          status;
+   Ecore_Event_Mouse_Move *e;
+   Ecore_Event *event;
 
-   e = calloc(1, sizeof(Ecore_X_Event_Key_Down));
-   if (!e) return;
-   keyname = XKeysymToString(XKeycodeToKeysym(xevent->xkey.display, 
-                                             xevent->xkey.keycode, 0));
+   e = malloc(sizeof(Ecore_Event_Mouse_Move));
+   if (!e)
+     return;
+
+   e->window = window;
+   e->root_window = root_win;
+   e->timestamp = timestamp;
+   e->same_screen = same_screen;
+   e->event_window = event_window;
+
+   e->modifiers = _ecore_x_event_modifiers(xmodifiers);
+   e->x = x;
+   e->y = y;
+   e->root.x = x_root;
+   e->root.y = y_root;
+
+   e->multi.device = dev;
+   e->multi.radius = (radx + rady) / 2;
+   e->multi.radius_x = radx;
+   e->multi.radius_y = rady;
+   e->multi.pressure = pressure;
+   e->multi.angle = angle;
+   e->multi.x = mx;
+   e->multi.y = my;
+   e->multi.root.x = mrx;
+   e->multi.root.y = mry;
+
+   event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE,
+                           e,
+                           _ecore_x_event_free_mouse_move,
+                           NULL);
+
+   _ecore_x_event_last_time = timestamp;
+   _ecore_x_event_last_win = window;
+   _ecore_x_event_last_root_x = x_root;
+   _ecore_x_event_last_root_y = y_root;
+
+   _ecore_x_last_event_mouse_move_event = event;
+}
+
+static void
+_ecore_key_press(int event,
+                 XKeyEvent *xevent)
+{
+   Ecore_Event_Key *e;
+   char *compose = NULL;
+   char *tmp = NULL;
+   char *keyname;
+   char *key;
+   char keyname_buffer[256];
+   char compose_buffer[256];
+   KeySym sym;
+   XComposeStatus status;
+   int val;
+
+   _ecore_x_last_event_mouse_move = 0;
+   keyname = XKeysymToString(_ecore_x_XKeycodeToKeysym(xevent->display,
+                                                       xevent->keycode, 0));
    if (!keyname)
      {
-       snprintf(buf, sizeof(buf), "Keycode-%i", xevent->xkey.keycode);
-       keyname = buf;
+        snprintf(keyname_buffer,
+                 sizeof(keyname_buffer),
+                 "Keycode-%i",
+                 xevent->keycode);
+        keyname = keyname_buffer;
      }
-   e->keyname = strdup(keyname);
-   if (!e->keyname)
+
+   sym = 0;
+   key = NULL;
+   compose = NULL;
+   val = XLookupString(xevent,
+                       compose_buffer,
+                       sizeof(compose_buffer),
+                       &sym,
+                       &status);
+   if (val > 0)
      {
-       free(e);
-       return;
+        compose_buffer[val] = 0;
+        compose = eina_str_convert(nl_langinfo(CODESET), "UTF-8",
+                                   compose_buffer);
+        if (!compose)
+          ERR("Ecore_X cannot convert input key string '%s' to UTF-8. "
+              "Is Eina built with iconv support?", compose_buffer);
+        tmp = compose;
      }
-   val = XLookupString((XKeyEvent *)xevent, buf, sizeof(buf), &sym, &status);
-   if (val > 0)
+
+   key = XKeysymToString(sym);
+   if (!key)
+     key = keyname;
+
+   e =
+     malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
+            (compose ? strlen(compose) : 0) + 3);
+   if (!e)
+     goto on_error;
+
+   e->keyname = (char *)(e + 1);
+   e->key = e->keyname + strlen(keyname) + 1;
+   e->compose = (compose) ? e->key + strlen(key) + 1 : NULL;
+   e->string = e->compose;
+
+   strcpy((char *)e->keyname, keyname);
+   strcpy((char *)e->key, key);
+   if (compose)
+     strcpy((char *)e->compose, compose);
+
+   e->modifiers = _ecore_x_event_modifiers(xevent->state);
+
+   e->timestamp = xevent->time;
+   e->window = xevent->subwindow ? xevent->subwindow : xevent->window;
+   e->event_window = xevent->window;
+   e->same_screen = xevent->same_screen;
+   e->root_window = xevent->root;
+
+   ecore_event_add(event, e, NULL, NULL);
+
+   _ecore_x_event_last_time = e->timestamp;
+
+on_error:
+   if (tmp)
+     free(tmp);
+}
+
+Ecore_Event_Mouse_Button *
+_ecore_mouse_button(int event,
+                    unsigned int timestamp,
+                    unsigned int xmodifiers,
+                    unsigned int buttons,
+                    int x,
+                    int y,
+                    int x_root,
+                    int y_root,
+                    unsigned int event_window,
+                    unsigned int window,
+                    unsigned int root_win,
+                    int same_screen,
+                    int dev,
+                    double radx,
+                    double rady,
+                    double pressure,
+                    double angle,
+                    double mx,
+                    double my,
+                    double mrx,
+                    double mry)
+{
+   Ecore_Event_Mouse_Button *e;
+
+   e = malloc(sizeof(Ecore_Event_Mouse_Button));
+   if (!e)
+     return NULL;
+
+   e->window = window;
+   e->root_window = root_win;
+   e->timestamp = timestamp;
+   e->same_screen = same_screen;
+   e->event_window = event_window;
+
+   e->buttons = buttons;
+   e->modifiers = _ecore_x_event_modifiers(xmodifiers);
+   e->double_click = 0;
+   e->triple_click = 0;
+   e->x = x;
+   e->y = y;
+   e->root.x = x_root;
+   e->root.y = y_root;
+
+   Ecore_X_Mouse_Down_Info *down_info = _ecore_x_mouse_down_info_get(dev);
+
+   if (down_info)
      {
-       buf[val] = 0;
-       e->key_compose = ecore_txt_convert(nl_langinfo(CODESET), "UTF-8", buf);
+        if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
+            down_info->did_triple)
+          {
+             down_info->last_win = 0;
+             down_info->last_last_win = 0;
+             down_info->last_event_win = 0;
+             down_info->last_last_event_win = 0;
+             down_info->last_time = 0;
+             down_info->last_last_time = 0;
+          }
+        if (event_window == window)
+          {
+             if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
+               {
+                  //Check Double Clicked
+                  if (((int)(timestamp - down_info->last_time) <=
+                       (int)(1000 * _ecore_x_double_click_time)) &&
+                      (window == down_info->last_win) &&
+                      (event_window == down_info->last_event_win))
+                    {
+                       e->double_click = 1;
+                       down_info->did_double = EINA_TRUE;
+                    }
+                  else
+                    {
+                       down_info->did_double = EINA_FALSE;
+                       down_info->did_triple = EINA_FALSE;
+                    }
+
+                  //Check Triple Clicked
+                  if (((int)(timestamp - down_info->last_last_time) <=
+                       (int)(2 * 1000 * _ecore_x_double_click_time)) &&
+                      (window == down_info->last_win) &&
+                      (window == down_info->last_last_win) &&
+                      (event_window == down_info->last_event_win) &&
+                      (event_window == down_info->last_last_event_win)
+                      )
+                    {
+                       e->triple_click = 1;
+                       down_info->did_triple = EINA_TRUE;
+                    }
+                  else
+                    {
+                       down_info->did_triple = EINA_FALSE;
+                    }
+               }
+             else
+               {
+                  if (down_info->did_double)
+                    e->double_click = 1;
+                  if (down_info->did_triple)
+                    e->triple_click = 1;
+               }
+          }
      }
-   else e->key_compose = NULL;
-   keyname = XKeysymToString(sym);
-   if (keyname) e->keysymbol = strdup(keyname);
-   else e->keysymbol = strdup(e->keyname);
-   if (!e->keysymbol)
+
+   /* NB: Block commented out as _ecore_x_mouse_up_count appears to have
+    * no use. The variable is also commented out above. This code block is
+    * the only place that this variable is used, and appears to serve no
+    * purpose. - dh
+      if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN
+       && !e->double_click
+       && !e->triple_click)
+      _ecore_x_mouse_up_count = 0;
+    */
+
+   e->multi.device = dev;
+   e->multi.radius = (radx + rady) / 2;
+   e->multi.radius_x = radx;
+   e->multi.radius_y = rady;
+   e->multi.pressure = pressure;
+   e->multi.angle = angle;
+   e->multi.x = mx;
+   e->multi.y = my;
+   e->multi.root.x = mrx;
+   e->multi.root.y = mry;
+
+   _ecore_x_event_last_time = e->timestamp;
+   _ecore_x_event_last_win = e->window;
+   _ecore_x_event_last_root_x = x_root;
+   _ecore_x_event_last_root_y = y_root;
+
+   ecore_event_add(event, e, NULL, NULL);
+
+   if ((down_info) &&
+       (event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
+       (window == event_window) &&
+       (!down_info->did_triple))
      {
-       if (e->keyname) free(e->keyname);
-       if (e->key_compose) free(e->key_compose);
-       free(e);
-       return;
+        down_info->last_last_win = down_info->last_win;
+        down_info->last_win = window;
+        down_info->last_last_event_win = down_info->last_event_win;
+        down_info->last_event_win = event_window;
+        down_info->last_last_time = down_info->last_time;
+        down_info->last_time = timestamp;
      }
-   if (xevent->xkey.subwindow) e->win = xevent->xkey.subwindow;
-   else e->win = xevent->xkey.window;
-   e->event_win = xevent->xkey.window;
-   e->time = xevent->xkey.time;
-   e->modifiers = xevent->xkey.state;
-   e->same_screen = xevent->xkey.same_screen;
-   e->root_win = xevent->xkey.root;
-   _ecore_x_event_last_time = e->time;
-   ecore_event_add(ECORE_X_EVENT_KEY_DOWN, e, _ecore_x_event_free_key_down, NULL);
+
+   return e;
+}
+
+void
+_ecore_x_event_handle_any_event(XEvent *xevent)
+{
+   XEvent *ev = malloc(sizeof(XEvent));
+   if (!ev) return;
+   memcpy(ev, xevent, sizeof(XEvent));
+   ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_key_press(XEvent *xevent)
+{
+   _ecore_key_press(ECORE_EVENT_KEY_DOWN, (XKeyEvent *)xevent);
 }
 
 void
 _ecore_x_event_handle_key_release(XEvent *xevent)
 {
-   Ecore_X_Event_Key_Up *e;
-   char                   *keyname;
-   int                     val;
-   char                    buf[256];
-   KeySym                  sym;
-   XComposeStatus          status;
-   
-   e = calloc(1, sizeof(Ecore_X_Event_Key_Up));
-   if (!e) return;
-   keyname = XKeysymToString(XKeycodeToKeysym(xevent->xkey.display, 
-                                             xevent->xkey.keycode, 0));
-   if (!keyname)
-     {
-       snprintf(buf, sizeof(buf), "Keycode-%i", xevent->xkey.keycode);
-       keyname = buf;
-     }
-   e->keyname = strdup(keyname);
-   if (!e->keyname)
-     {
-       free(e);
-       return;
-     }
-   val = XLookupString((XKeyEvent *)xevent, buf, sizeof(buf), &sym, &status);
-   if (val > 0)
-     {
-       buf[val] = 0;
-       e->key_compose = ecore_txt_convert("ISO8859-1", "UTF-8", buf);
-     }
-   else e->key_compose = NULL;
-   keyname = XKeysymToString(sym);
-   if (keyname) e->keysymbol = strdup(keyname);
-   else e->keysymbol = strdup(e->keyname);
-   if (!e->keysymbol)
-     {
-       if (e->keyname) free(e->keyname);
-       if (e->key_compose) free(e->key_compose);
-       free(e);
-       return;
-     }
-   if (xevent->xkey.subwindow) e->win = xevent->xkey.subwindow;
-   else e->win = xevent->xkey.window;
-   e->event_win = xevent->xkey.window;
-   e->time = xevent->xkey.time;
-   e->modifiers = xevent->xkey.state;
-   e->same_screen = xevent->xkey.same_screen;
-   e->root_win = xevent->xkey.root;
-   _ecore_x_event_last_time = e->time;
-   ecore_event_add(ECORE_X_EVENT_KEY_UP, e, _ecore_x_event_free_key_up, NULL);
+   _ecore_key_press(ECORE_EVENT_KEY_UP, (XKeyEvent *)xevent);
 }
 
 void
@@ -292,435 +522,394 @@ _ecore_x_event_handle_button_press(XEvent *xevent)
 {
    int i;
 
+   _ecore_x_last_event_mouse_move = 0;
    if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8))
      {
-       Ecore_X_Event_Mouse_Wheel *e;
-       
-       e = malloc(sizeof(Ecore_X_Event_Mouse_Wheel));
-       
-       if (!e)
-         return;
-       
-       e->modifiers = xevent->xbutton.state;
-       e->direction = 0;
-       e->z = 0;
-       if      (xevent->xbutton.button == 4)
-         {
-            e->direction = 0;
-            e->z = -1;
-         }
-       else if (xevent->xbutton.button == 5)
-         {
-            e->direction = 0;
-            e->z = 1;
-         }
-       else if (xevent->xbutton.button == 6)
-         {
-            e->direction = 1;
-            e->z = -1;
-         }
-       else if (xevent->xbutton.button == 7)
-         {
-            e->direction = 1;
-            e->z = 1;
-         }
-       e->x = xevent->xbutton.x;
-       e->y = xevent->xbutton.y;
-       e->root.x = xevent->xbutton.x_root;
-       e->root.y = xevent->xbutton.y_root;
-       
-       if (xevent->xbutton.subwindow)
-         e->win = xevent->xbutton.subwindow;
-       else
-         e->win = xevent->xbutton.window;
-       
-       e->event_win = xevent->xbutton.window;
-       e->same_screen = xevent->xbutton.same_screen;
-       e->root_win = xevent->xbutton.root;
-       e->time = xevent->xbutton.time;
-       _ecore_x_event_last_time = e->time;
-       _ecore_x_event_last_win = e->win;
-       _ecore_x_event_last_root_x = e->root.x;
-       _ecore_x_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_WHEEL, e, NULL, NULL);
-       for (i = 0; i < _ecore_window_grabs_num; i++)
-         {
-            if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
-                (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
-              {
-                 int replay = 0;
-                 
-                 if (_ecore_window_grab_replay_func)
-                   replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data, 
-                                                           ECORE_X_EVENT_MOUSE_WHEEL,
-                                                           e);
-                 if (replay)
-                   XAllowEvents(xevent->xbutton.display,
-                                ReplayPointer,
-                                xevent->xbutton.time);
-                 else
-                   XAllowEvents(xevent->xbutton.display,
-                                AsyncPointer,
-                                xevent->xbutton.time);
-                 break;
-              }
-         }
+        Ecore_Event_Mouse_Wheel *e;
+
+        e = malloc(sizeof(Ecore_Event_Mouse_Wheel));
+        if (!e)
+          return;
+
+        e->timestamp = xevent->xbutton.time;
+        e->modifiers = _ecore_x_event_modifiers(xevent->xbutton.state);
+        switch (xevent->xbutton.button)
+          {
+           case 4: e->direction = 0; e->z = -1; break;
+
+           case 5: e->direction = 0; e->z = 1; break;
+
+           case 6: e->direction = 1; e->z = -1; break;
+
+           case 7: e->direction = 1; e->z = 1; break;
+
+           default: e->direction = 0; e->z = 0; break;
+          }
+
+        e->x = xevent->xbutton.x;
+        e->y = xevent->xbutton.y;
+        e->root.x = xevent->xbutton.x_root;
+        e->root.y = xevent->xbutton.y_root;
+
+        if (xevent->xbutton.subwindow)
+          e->window = xevent->xbutton.subwindow;
+        else
+          e->window = xevent->xbutton.window;
+
+        e->event_window = xevent->xbutton.window;
+        e->same_screen = xevent->xbutton.same_screen;
+        e->root_window = xevent->xbutton.root;
+
+        _ecore_x_event_last_time = e->timestamp;
+        _ecore_x_event_last_win = e->window;
+        _ecore_x_event_last_root_x = xevent->xbutton.x_root;
+        _ecore_x_event_last_root_y = xevent->xbutton.y_root;
+        ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
+
+        for (i = 0; i < _ecore_window_grabs_num; i++)
+          {
+             if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
+                 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
+               {
+                  Eina_Bool replay = EINA_FALSE;
+
+                  if (_ecore_window_grab_replay_func)
+                    replay = _ecore_window_grab_replay_func(
+                        _ecore_window_grab_replay_data,
+                        ECORE_EVENT_MOUSE_WHEEL,
+                        e);
+
+                  if (replay)
+                    XAllowEvents(xevent->xbutton.display,
+                                 ReplayPointer, xevent->xbutton.time);
+                  else
+                    XAllowEvents(xevent->xbutton.display,
+                                 AsyncPointer, xevent->xbutton.time);
+
+                  break;
+               }
+          }
      }
    else
      {
-         {
-            Ecore_X_Event_Mouse_Move *e;
-            
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-            if (!e) return;
-            e->modifiers = xevent->xbutton.state;
-            e->x = xevent->xbutton.x;
-            e->y = xevent->xbutton.y;
-            e->root.x = xevent->xbutton.x_root;
-            e->root.y = xevent->xbutton.y_root;
-            if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
-            else e->win = xevent->xbutton.window;
-            e->same_screen = xevent->xbutton.same_screen;
-            e->root_win = xevent->xbutton.root;
-            e->event_win = xevent->xbutton.window;
-            e->time = xevent->xbutton.time;
-            _ecore_x_event_last_time = e->time;
-            _ecore_x_event_last_win = e->win;
-            _ecore_x_event_last_root_x = e->root.x;
-            _ecore_x_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-         }
-         {
-            Ecore_X_Event_Mouse_Button_Down *e;
-             
-            if (_ecore_x_mouse_down_did_triple)
-              {
-                 _ecore_x_mouse_down_last_win = 0;
-                 _ecore_x_mouse_down_last_last_win = 0;
-                 _ecore_x_mouse_down_last_event_win = 0;
-                 _ecore_x_mouse_down_last_last_event_win = 0;
-                 _ecore_x_mouse_down_last_time = 0;
-                 _ecore_x_mouse_down_last_last_time = 0;
-              }
-            
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Button_Down));
-            if (!e) return;
-            e->button = xevent->xbutton.button;
-            e->modifiers = xevent->xbutton.state;
-            e->x = xevent->xbutton.x;
-            e->y = xevent->xbutton.y;
-            e->root.x = xevent->xbutton.x_root;
-            e->root.y = xevent->xbutton.y_root;
-            if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
-            else e->win = xevent->xbutton.window;
-            e->same_screen = xevent->xbutton.same_screen;
-            e->root_win = xevent->xbutton.root;
-            e->event_win = xevent->xbutton.window;
-            e->time = xevent->xbutton.time;
-            if (e->win == e->event_win)
-              {
-                 if (((int)(e->time - _ecore_x_mouse_down_last_time) <= 
-                      (int)(1000 * _ecore_x_double_click_time)) &&
-                     (e->win == _ecore_x_mouse_down_last_win) &&
-                     (e->event_win == _ecore_x_mouse_down_last_event_win)
-                     )
-                   e->double_click = 1;
-                 if (((int)(e->time - _ecore_x_mouse_down_last_last_time) <= 
-                      (int)(2 * 1000 * _ecore_x_double_click_time)) &&
-                     (e->win == _ecore_x_mouse_down_last_win) &&
-                      (e->win == _ecore_x_mouse_down_last_last_win) &&
-                     (e->event_win == _ecore_x_mouse_down_last_event_win) &&
-                      (e->event_win == _ecore_x_mouse_down_last_last_event_win)
-                     )
-                   {
-                        e->triple_click = 1;
-                      _ecore_x_mouse_down_did_triple = 1;
-                   }
-                  else
-                    _ecore_x_mouse_down_did_triple = 0;
-              }
-             if (!e->double_click && !e->triple_click)
-               _ecore_x_mouse_up_count = 0;
-            _ecore_x_event_last_time = e->time;
-            _ecore_x_event_last_win = e->win;
-            _ecore_x_event_last_root_x = e->root.x;
-            _ecore_x_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
-            for (i = 0; i < _ecore_window_grabs_num; i++)
-              {
-                 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
-                     (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
-                   {
-                      int replay = 0;
-                      
-                      if (_ecore_window_grab_replay_func)
-                        replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data, 
-                                                                ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
-                                                                e);
-                      if (replay)
-                        XAllowEvents(xevent->xbutton.display,
-                                     ReplayPointer,
-                                     xevent->xbutton.time);
-                      else
-                        XAllowEvents(xevent->xbutton.display,
-                                     AsyncPointer,
-                                     xevent->xbutton.time);
-                      break;
-                   }
-              }
-            if (e->win == e->event_win)
-              {
-                 if (!_ecore_x_mouse_down_did_triple)
-                   {
-                      _ecore_x_mouse_down_last_last_win = _ecore_x_mouse_down_last_win;
-                      if (xevent->xbutton.subwindow)
-                        _ecore_x_mouse_down_last_win = xevent->xbutton.subwindow;
-                      else
-                        _ecore_x_mouse_down_last_win = xevent->xbutton.window;
-                      _ecore_x_mouse_down_last_last_event_win = _ecore_x_mouse_down_last_event_win;
-                      _ecore_x_mouse_down_last_event_win = xevent->xbutton.window;
-                      _ecore_x_mouse_down_last_last_time = _ecore_x_mouse_down_last_time;
-                      _ecore_x_mouse_down_last_time = xevent->xbutton.time;
-                   }
-              }
-         }
+        {
+           _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
+                             xevent->xbutton.x, xevent->xbutton.y,
+                             xevent->xbutton.x_root, xevent->xbutton.y_root,
+                             xevent->xbutton.window,
+                             (xevent->xbutton.subwindow ? xevent->xbutton.
+                              subwindow : xevent->xbutton.window),
+                             xevent->xbutton.root,
+                             xevent->xbutton.same_screen,
+                             0, 1, 1,
+                             1.0, // pressure
+                             0.0, // angle
+                             xevent->xbutton.x, xevent->xbutton.y,
+                             xevent->xbutton.x_root, xevent->xbutton.y_root);
+        }
+        {
+           Ecore_Event_Mouse_Button *e;
+           int event_window;
+           int window;
+
+           window =
+             (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->
+              xbutton.window);
+           event_window = xevent->xbutton.window;
+
+           e = _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                                   xevent->xbutton.time,
+                                   xevent->xbutton.state,
+                                   xevent->xbutton.button,
+                                   xevent->xbutton.x,
+                                   xevent->xbutton.y,
+                                   xevent->xbutton.x_root,
+                                   xevent->xbutton.y_root,
+                                   event_window,
+                                   window,
+                                   xevent->xbutton.root,
+                                   xevent->xbutton.same_screen,
+                                   0,
+                                   1,
+                                   1,
+                                   1.0,
+// pressure
+                                   0.0,
+// angle
+                                   xevent->xbutton.x,
+                                   xevent->xbutton.y,
+                                   xevent->xbutton.x_root,
+                                   xevent->xbutton.y_root);
+           if (e)
+             for (i = 0; i < _ecore_window_grabs_num; i++)
+               {
+                  if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
+                      (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
+                    {
+                       Eina_Bool replay = EINA_FALSE;
+
+                       if (_ecore_window_grab_replay_func)
+                         replay = _ecore_window_grab_replay_func(
+                             _ecore_window_grab_replay_data,
+                             ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                             e);
+
+                       if (replay)
+                         XAllowEvents(xevent->xbutton.display,
+                                      ReplayPointer, xevent->xbutton.time);
+                       else
+                         XAllowEvents(xevent->xbutton.display,
+                                      AsyncPointer, xevent->xbutton.time);
+
+                       break;
+                    }
+               }
+        }
      }
 }
 
 void
 _ecore_x_event_handle_button_release(XEvent *xevent)
 {
+   _ecore_x_last_event_mouse_move = 0;
    /* filter out wheel buttons */
    if ((xevent->xbutton.button <= 3) || (xevent->xbutton.button > 7))
      {
-         {
-            Ecore_X_Event_Mouse_Move *e;
-            
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-            if (!e) return;
-            e->modifiers = xevent->xbutton.state;
-            e->x = xevent->xbutton.x;
-            e->y = xevent->xbutton.y;
-            e->root.x = xevent->xbutton.x_root;
-            e->root.y = xevent->xbutton.y_root;
-            if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
-            else e->win = xevent->xbutton.window;
-            e->same_screen = xevent->xbutton.same_screen;
-            e->root_win = xevent->xbutton.root;
-            e->event_win = xevent->xbutton.window;
-            e->time = xevent->xbutton.time;
-            _ecore_x_event_last_time = e->time;
-            _ecore_x_event_last_win = e->win;
-            _ecore_x_event_last_root_x = e->root.x;
-            _ecore_x_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-         }
-         {
-            Ecore_X_Event_Mouse_Button_Up *e;
-            
-            e = calloc(1, sizeof(Ecore_X_Event_Mouse_Button_Up));
-            if (!e) return;
-            e->button = xevent->xbutton.button;
-            e->modifiers = xevent->xbutton.state;
-            e->x = xevent->xbutton.x;
-            e->y = xevent->xbutton.y;
-            e->root.x = xevent->xbutton.x_root;
-            e->root.y = xevent->xbutton.y_root;
-            if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
-            else e->win = xevent->xbutton.window;
-            e->same_screen = xevent->xbutton.same_screen;
-            e->root_win = xevent->xbutton.root;
-            e->event_win = xevent->xbutton.window;
-            e->time = xevent->xbutton.time;
-             _ecore_x_mouse_up_count++;
-            if (e->win == e->event_win)
-              {
-                 if ((_ecore_x_mouse_up_count >= 2) &&
-                      ((int)(e->time - _ecore_x_mouse_down_last_time) <= 
-                      (int)(1000 * _ecore_x_double_click_time)) &&
-                     (e->win == _ecore_x_mouse_down_last_win) &&
-                     (e->event_win == _ecore_x_mouse_down_last_event_win)
-                     )
-                   e->double_click = 1;
-                 if ((_ecore_x_mouse_up_count >= 3) &&
-                     ((int)(e->time - _ecore_x_mouse_down_last_last_time) <= 
-                      (int)(2 * 1000 * _ecore_x_double_click_time)) &&
-                     (e->win == _ecore_x_mouse_down_last_win) &&
-                      (e->win == _ecore_x_mouse_down_last_last_win) &&
-                     (e->event_win == _ecore_x_mouse_down_last_event_win) &&
-                      (e->event_win == _ecore_x_mouse_down_last_last_event_win)
-                     )
-                    e->triple_click = 1;
-              }
-            _ecore_x_event_last_time = e->time;
-            _ecore_x_event_last_win = e->win;
-            _ecore_x_event_last_root_x = e->root.x;
-            _ecore_x_event_last_root_y = e->root.y;
-            ecore_event_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
-         }
+        _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
+                          xevent->xbutton.x, xevent->xbutton.y,
+                          xevent->xbutton.x_root, xevent->xbutton.y_root,
+                          xevent->xbutton.window,
+                          (xevent->xbutton.subwindow ? xevent->xbutton.
+                           subwindow : xevent->xbutton.window),
+                          xevent->xbutton.root,
+                          xevent->xbutton.same_screen,
+                          0, 1, 1,
+                          1.0, // pressure
+                          0.0, // angle
+                          xevent->xbutton.x, xevent->xbutton.y,
+                          xevent->xbutton.x_root, xevent->xbutton.y_root);
+
+        _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
+                            xevent->xbutton.time, xevent->xbutton.state,
+                            xevent->xbutton.button,
+                            xevent->xbutton.x, xevent->xbutton.y,
+                            xevent->xbutton.x_root, xevent->xbutton.y_root,
+                            xevent->xbutton.window,
+                            (xevent->xbutton.subwindow ? xevent->xbutton.
+                             subwindow : xevent->xbutton.window),
+                            xevent->xbutton.root,
+                            xevent->xbutton.same_screen,
+                            0, 1, 1,
+                            1.0, // pressure
+                            0.0, // angle
+                            xevent->xbutton.x, xevent->xbutton.y,
+                            xevent->xbutton.x_root, xevent->xbutton.y_root);
      }
 }
 
 void
 _ecore_x_event_handle_motion_notify(XEvent *xevent)
 {
-   Ecore_X_Event_Mouse_Move     *e;
-
-   e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-   if (!e) return;
-   e->modifiers = xevent->xmotion.state;
-   e->x = xevent->xmotion.x;
-   e->y = xevent->xmotion.y;
-   e->root.x = xevent->xmotion.x_root;
-   e->root.y = xevent->xmotion.y_root;
-   if (xevent->xmotion.subwindow) e->win = xevent->xmotion.subwindow;
-   else e->win = xevent->xmotion.window;
-   e->same_screen = xevent->xmotion.same_screen;
-   e->root_win = xevent->xmotion.root;
-   e->event_win = xevent->xmotion.window;
-   e->time = xevent->xmotion.time;
-   _ecore_x_event_last_time = e->time;
-   _ecore_x_event_last_win = e->win;
-   _ecore_x_event_last_root_x = e->root.x;
-   _ecore_x_event_last_root_y = e->root.y;
+/*
+   if (_ecore_x_last_event_mouse_move)
+     {
+        ecore_event_del(_ecore_x_last_event_mouse_move_event);
+        _ecore_x_last_event_mouse_move = 0;
+        _ecore_x_last_event_mouse_move_event = NULL;
+     }
+ */
+   _ecore_mouse_move(xevent->xmotion.time, xevent->xmotion.state,
+                     xevent->xmotion.x, xevent->xmotion.y,
+                     xevent->xmotion.x_root, xevent->xmotion.y_root,
+                     xevent->xmotion.window,
+                     (xevent->xmotion.subwindow ? xevent->xmotion.subwindow :
+                      xevent->xmotion.window),
+                     xevent->xmotion.root,
+                     xevent->xmotion.same_screen,
+                     0, 1, 1,
+                     1.0,   // pressure
+                     0.0,   // angle
+                     xevent->xmotion.x, xevent->xmotion.y,
+                     xevent->xmotion.x_root, xevent->xmotion.y_root);
+
+   _ecore_x_last_event_mouse_move = 1;
 
    /* Xdnd handling */
-   _ecore_x_dnd_drag(xevent->xmotion.root, e->root.x, e->root.y);
-
-   ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
+   _ecore_x_dnd_drag(xevent->xmotion.root,
+                     xevent->xmotion.x_root,
+                     xevent->xmotion.y_root);
 }
 
 void
 _ecore_x_event_handle_enter_notify(XEvent *xevent)
 {
-     {
-       Ecore_X_Event_Mouse_Move *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-       if (!e) return;
-       e->modifiers = xevent->xcrossing.state;
-       e->x = xevent->xcrossing.x;
-       e->y = xevent->xcrossing.y;
-       e->root.x = xevent->xcrossing.x_root;
-       e->root.y = xevent->xcrossing.y_root;
-       if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
-       else e->win = xevent->xcrossing.window;
-       e->same_screen = xevent->xcrossing.same_screen;
-       e->root_win = xevent->xcrossing.root;
-       e->event_win = xevent->xcrossing.window;
-       e->time = xevent->xcrossing.time;
-       _ecore_x_event_last_time = e->time;
-       _ecore_x_event_last_win = e->win;
-       _ecore_x_event_last_root_x = e->root.x;
-       _ecore_x_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-     }
-     {
-       Ecore_X_Event_Mouse_In *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
-       if (!e) return;
-       e->modifiers = xevent->xcrossing.state;
-       e->x = xevent->xcrossing.x;
-       e->y = xevent->xcrossing.y;
-       e->root.x = xevent->xcrossing.x_root;
-       e->root.y = xevent->xcrossing.y_root;
-       if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
-       else e->win = xevent->xcrossing.window;
-       e->same_screen = xevent->xcrossing.same_screen;
-       e->root_win = xevent->xcrossing.root;
-       e->event_win = xevent->xcrossing.window;
-       if      (xevent->xcrossing.mode == NotifyNormal) e->mode = ECORE_X_EVENT_MODE_NORMAL;
-       else if (xevent->xcrossing.mode == NotifyGrab)   e->mode = ECORE_X_EVENT_MODE_GRAB;
-       else if (xevent->xcrossing.mode == NotifyUngrab) e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-       if      (xevent->xcrossing.detail == NotifyAncestor)         e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-       else if (xevent->xcrossing.detail == NotifyVirtual)          e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-       else if (xevent->xcrossing.detail == NotifyInferior)         e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-       else if (xevent->xcrossing.detail == NotifyNonlinear)        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-       else if (xevent->xcrossing.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-       e->time = xevent->xcrossing.time;
-       _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
-     }
+   _ecore_x_last_event_mouse_move = 0;
+   {
+      _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
+                        xevent->xcrossing.x, xevent->xcrossing.y,
+                        xevent->xcrossing.x_root, xevent->xcrossing.y_root,
+                        xevent->xcrossing.window,
+                        (xevent->xcrossing.subwindow ? xevent->xcrossing.
+                         subwindow : xevent->xcrossing.window),
+                        xevent->xcrossing.root,
+                        xevent->xcrossing.same_screen,
+                        0, 1, 1,
+                        1.0, // pressure
+                        0.0, // angle
+                        xevent->xcrossing.x, xevent->xcrossing.y,
+                        xevent->xcrossing.x_root, xevent->xcrossing.y_root);
+   }
+   {
+      Ecore_X_Event_Mouse_In *e;
+
+      e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
+      if (!e)
+        return;
+
+      e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
+      e->x = xevent->xcrossing.x;
+      e->y = xevent->xcrossing.y;
+      e->root.x = xevent->xcrossing.x_root;
+      e->root.y = xevent->xcrossing.y_root;
+      if (xevent->xcrossing.subwindow)
+        e->win = xevent->xcrossing.subwindow;
+      else
+        e->win = xevent->xcrossing.window;
+
+      e->same_screen = xevent->xcrossing.same_screen;
+      e->root_win = xevent->xcrossing.root;
+      e->event_win = xevent->xcrossing.window;
+
+      if (xevent->xcrossing.mode == NotifyNormal)
+        e->mode = ECORE_X_EVENT_MODE_NORMAL;
+      else if (xevent->xcrossing.mode == NotifyGrab)
+        e->mode = ECORE_X_EVENT_MODE_GRAB;
+      else if (xevent->xcrossing.mode == NotifyUngrab)
+        e->mode = ECORE_X_EVENT_MODE_UNGRAB;
+
+      if (xevent->xcrossing.detail == NotifyAncestor)
+        e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
+      else if (xevent->xcrossing.detail == NotifyVirtual)
+        e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
+      else if (xevent->xcrossing.detail == NotifyInferior)
+        e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
+      else if (xevent->xcrossing.detail == NotifyNonlinear)
+        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
+      else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
+        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
+
+      e->time = xevent->xcrossing.time;
+      _ecore_x_event_last_time = e->time;
+      ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
+   }
 }
 
 void
 _ecore_x_event_handle_leave_notify(XEvent *xevent)
 {
-     {
-       Ecore_X_Event_Mouse_Move *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
-       if (!e) return;
-       e->modifiers = xevent->xcrossing.state;
-       e->x = xevent->xcrossing.x;
-       e->y = xevent->xcrossing.y;
-       e->root.x = xevent->xcrossing.x_root;
-       e->root.y = xevent->xcrossing.y_root;
-       if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
-       else e->win = xevent->xcrossing.window;
-       e->same_screen = xevent->xcrossing.same_screen;
-       e->root_win = xevent->xcrossing.root;
-       e->event_win = xevent->xcrossing.window;
-       e->time = xevent->xcrossing.time;
-       _ecore_x_event_last_time = e->time;
-       _ecore_x_event_last_win = e->win;
-       _ecore_x_event_last_root_x = e->root.x;
-       _ecore_x_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
-     }
-     {
-       Ecore_X_Event_Mouse_Out *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
-       if (!e) return;
-       e->modifiers = xevent->xcrossing.state;
-       e->x = xevent->xcrossing.x;
-       e->y = xevent->xcrossing.y;
-       e->root.x = xevent->xcrossing.x_root;
-       e->root.y = xevent->xcrossing.y_root;
-       if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
-       else e->win = xevent->xcrossing.window;
-       e->same_screen = xevent->xcrossing.same_screen;
-       e->root_win = xevent->xcrossing.root;
-       e->event_win = xevent->xcrossing.window;
-       if      (xevent->xcrossing.mode == NotifyNormal) e->mode = ECORE_X_EVENT_MODE_NORMAL;
-       else if (xevent->xcrossing.mode == NotifyGrab)   e->mode = ECORE_X_EVENT_MODE_GRAB;
-       else if (xevent->xcrossing.mode == NotifyUngrab) e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-       if      (xevent->xcrossing.detail == NotifyAncestor)         e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-       else if (xevent->xcrossing.detail == NotifyVirtual)          e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-       else if (xevent->xcrossing.detail == NotifyInferior)         e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-       else if (xevent->xcrossing.detail == NotifyNonlinear)        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-       else if (xevent->xcrossing.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-       e->time = xevent->xcrossing.time;
-       _ecore_x_event_last_time = e->time;
-       _ecore_x_event_last_win = e->win;
-       _ecore_x_event_last_root_x = e->root.x;
-       _ecore_x_event_last_root_y = e->root.y;
-       ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
-     }
+   _ecore_x_last_event_mouse_move = 0;
+   {
+      _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
+                        xevent->xcrossing.x, xevent->xcrossing.y,
+                        xevent->xcrossing.x_root, xevent->xcrossing.y_root,
+                        xevent->xcrossing.window,
+                        (xevent->xcrossing.subwindow ? xevent->xcrossing.
+                         subwindow : xevent->xcrossing.window),
+                        xevent->xcrossing.root,
+                        xevent->xcrossing.same_screen,
+                        0, 1, 1,
+                        1.0, // pressure
+                        0.0, // angle
+                        xevent->xcrossing.x, xevent->xcrossing.y,
+                        xevent->xcrossing.x_root, xevent->xcrossing.y_root);
+   }
+   {
+      Ecore_X_Event_Mouse_Out *e;
+
+      e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
+      if (!e)
+        return;
+
+      e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
+      e->x = xevent->xcrossing.x;
+      e->y = xevent->xcrossing.y;
+      e->root.x = xevent->xcrossing.x_root;
+      e->root.y = xevent->xcrossing.y_root;
+      if (xevent->xcrossing.subwindow)
+        e->win = xevent->xcrossing.subwindow;
+      else
+        e->win = xevent->xcrossing.window;
+
+      e->same_screen = xevent->xcrossing.same_screen;
+      e->root_win = xevent->xcrossing.root;
+      e->event_win = xevent->xcrossing.window;
+
+      if (xevent->xcrossing.mode == NotifyNormal)
+        e->mode = ECORE_X_EVENT_MODE_NORMAL;
+      else if (xevent->xcrossing.mode == NotifyGrab)
+        e->mode = ECORE_X_EVENT_MODE_GRAB;
+      else if (xevent->xcrossing.mode == NotifyUngrab)
+        e->mode = ECORE_X_EVENT_MODE_UNGRAB;
+
+      if (xevent->xcrossing.detail == NotifyAncestor)
+        e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
+      else if (xevent->xcrossing.detail == NotifyVirtual)
+        e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
+      else if (xevent->xcrossing.detail == NotifyInferior)
+        e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
+      else if (xevent->xcrossing.detail == NotifyNonlinear)
+        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
+      else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
+        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
+
+      e->time = xevent->xcrossing.time;
+      _ecore_x_event_last_time = e->time;
+      _ecore_x_event_last_win = e->win;
+      _ecore_x_event_last_root_x = e->root.x;
+      _ecore_x_event_last_root_y = e->root.y;
+      ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
+   }
 }
 
 void
 _ecore_x_event_handle_focus_in(XEvent *xevent)
 {
    Ecore_X_Event_Window_Focus_In *e;
-       
+
+   _ecore_x_last_event_mouse_move = 0;
+
    e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xfocus.window;
-   if      (xevent->xfocus.mode == NotifyNormal)       e->mode = ECORE_X_EVENT_MODE_NORMAL;
-   else if (xevent->xfocus.mode == NotifyWhileGrabbed) e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
-   else if (xevent->xfocus.mode == NotifyGrab)         e->mode = ECORE_X_EVENT_MODE_GRAB;
-   else if (xevent->xfocus.mode == NotifyUngrab)       e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-   if      (xevent->xfocus.detail == NotifyAncestor)         e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-   else if (xevent->xfocus.detail == NotifyVirtual)          e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-   else if (xevent->xfocus.detail == NotifyInferior)         e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-   else if (xevent->xfocus.detail == NotifyNonlinear)        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-   else if (xevent->xfocus.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-   else if (xevent->xfocus.detail == NotifyPointer)          e->detail = ECORE_X_EVENT_DETAIL_POINTER;
-   else if (xevent->xfocus.detail == NotifyPointerRoot)      e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
-   else if (xevent->xfocus.detail == NotifyDetailNone)       e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
+
+   if (xevent->xfocus.mode == NotifyNormal)
+     e->mode = ECORE_X_EVENT_MODE_NORMAL;
+   else if (xevent->xfocus.mode == NotifyWhileGrabbed)
+     e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
+   else if (xevent->xfocus.mode == NotifyGrab)
+     e->mode = ECORE_X_EVENT_MODE_GRAB;
+   else if (xevent->xfocus.mode == NotifyUngrab)
+     e->mode = ECORE_X_EVENT_MODE_UNGRAB;
+
+   if (xevent->xfocus.detail == NotifyAncestor)
+     e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
+   else if (xevent->xfocus.detail == NotifyVirtual)
+     e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
+   else if (xevent->xfocus.detail == NotifyInferior)
+     e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
+   else if (xevent->xfocus.detail == NotifyNonlinear)
+     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
+   else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
+     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
+   else if (xevent->xfocus.detail == NotifyPointer)
+     e->detail = ECORE_X_EVENT_DETAIL_POINTER;
+   else if (xevent->xfocus.detail == NotifyPointerRoot)
+     e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
+   else if (xevent->xfocus.detail == NotifyDetailNone)
+     e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
+
    e->time = _ecore_x_event_last_time;
    _ecore_x_event_last_time = e->time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
@@ -730,22 +919,41 @@ void
 _ecore_x_event_handle_focus_out(XEvent *xevent)
 {
    Ecore_X_Event_Window_Focus_Out *e;
-       
+
+   _ecore_x_last_event_mouse_move = 0;
+
    e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xfocus.window;
-   if      (xevent->xfocus.mode == NotifyNormal)       e->mode = ECORE_X_EVENT_MODE_NORMAL;
-   else if (xevent->xfocus.mode == NotifyWhileGrabbed) e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
-   else if (xevent->xfocus.mode == NotifyGrab)         e->mode = ECORE_X_EVENT_MODE_GRAB;
-   else if (xevent->xfocus.mode == NotifyUngrab)       e->mode = ECORE_X_EVENT_MODE_UNGRAB;
-   if      (xevent->xfocus.detail == NotifyAncestor)         e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
-   else if (xevent->xfocus.detail == NotifyVirtual)          e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
-   else if (xevent->xfocus.detail == NotifyInferior)         e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
-   else if (xevent->xfocus.detail == NotifyNonlinear)        e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
-   else if (xevent->xfocus.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
-   else if (xevent->xfocus.detail == NotifyPointer)          e->detail = ECORE_X_EVENT_DETAIL_POINTER;
-   else if (xevent->xfocus.detail == NotifyPointerRoot)      e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
-   else if (xevent->xfocus.detail == NotifyDetailNone)       e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
+
+   if (xevent->xfocus.mode == NotifyNormal)
+     e->mode = ECORE_X_EVENT_MODE_NORMAL;
+   else if (xevent->xfocus.mode == NotifyWhileGrabbed)
+     e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
+   else if (xevent->xfocus.mode == NotifyGrab)
+     e->mode = ECORE_X_EVENT_MODE_GRAB;
+   else if (xevent->xfocus.mode == NotifyUngrab)
+     e->mode = ECORE_X_EVENT_MODE_UNGRAB;
+
+   if (xevent->xfocus.detail == NotifyAncestor)
+     e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
+   else if (xevent->xfocus.detail == NotifyVirtual)
+     e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
+   else if (xevent->xfocus.detail == NotifyInferior)
+     e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
+   else if (xevent->xfocus.detail == NotifyNonlinear)
+     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
+   else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
+     e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
+   else if (xevent->xfocus.detail == NotifyPointer)
+     e->detail = ECORE_X_EVENT_DETAIL_POINTER;
+   else if (xevent->xfocus.detail == NotifyPointerRoot)
+     e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
+   else if (xevent->xfocus.detail == NotifyDetailNone)
+     e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
+
    e->time = _ecore_x_event_last_time;
    _ecore_x_event_last_time = e->time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
@@ -754,16 +962,20 @@ _ecore_x_event_handle_focus_out(XEvent *xevent)
 void
 _ecore_x_event_handle_keymap_notify(XEvent *xevent __UNUSED__)
 {
-   /* FIXME: handle this event type */   
+   _ecore_x_last_event_mouse_move = 0;
+   /* FIXME: handle this event type */
 }
 
 void
 _ecore_x_event_handle_expose(XEvent *xevent)
 {
    Ecore_X_Event_Window_Damage *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xexpose.window;
    e->time = _ecore_x_event_last_time;
    e->x = xevent->xexpose.x;
@@ -771,16 +983,19 @@ _ecore_x_event_handle_expose(XEvent *xevent)
    e->w = xevent->xexpose.width;
    e->h = xevent->xexpose.height;
    e->count = xevent->xexpose.count;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);   
+   ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
 }
 
 void
 _ecore_x_event_handle_graphics_expose(XEvent *xevent)
 {
    Ecore_X_Event_Window_Damage *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xgraphicsexpose.drawable;
    e->time = _ecore_x_event_last_time;
    e->x = xevent->xgraphicsexpose.x;
@@ -788,24 +1003,28 @@ _ecore_x_event_handle_graphics_expose(XEvent *xevent)
    e->w = xevent->xgraphicsexpose.width;
    e->h = xevent->xgraphicsexpose.height;
    e->count = xevent->xgraphicsexpose.count;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);   
+   ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
 }
 
 void
 _ecore_x_event_handle_visibility_notify(XEvent *xevent)
 {
+   _ecore_x_last_event_mouse_move = 0;
 //   if (xevent->xvisibility.state != VisibilityPartiallyObscured)
    {
       Ecore_X_Event_Window_Visibility_Change *e;
-      
+
       e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change));
-      if (!e) return;
+      if (!e)
+        return;
+
       e->win = xevent->xvisibility.window;
       e->time = _ecore_x_event_last_time;
       if (xevent->xvisibility.state == VisibilityFullyObscured)
-        e->fully_obscured = 1;
+        e->fully_obscured = 1;
       else
-        e->fully_obscured = 0;     
+        e->fully_obscured = 0;
+
       ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
    }
 }
@@ -815,13 +1034,23 @@ _ecore_x_event_handle_create_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Create *e;
 
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xcreatewindow.window;
+   e->parent = xevent->xcreatewindow.parent;
    if (xevent->xcreatewindow.override_redirect)
-      e->override = 1;
+     e->override = 1;
    else
-      e->override = 0;
+     e->override = 0;
+
+   e->x = xevent->xcreatewindow.x;
+   e->y = xevent->xcreatewindow.y;
+   e->w = xevent->xcreatewindow.width;
+   e->h = xevent->xcreatewindow.height;
+   e->border = xevent->xcreatewindow.border_width;
    e->time = _ecore_x_event_last_time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
 }
@@ -830,23 +1059,33 @@ void
 _ecore_x_event_handle_destroy_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Destroy *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
-   if (!e) return;
-   e->win =  xevent->xdestroywindow.window;
+   if (!e)
+     return;
+
+   e->win = xevent->xdestroywindow.window;
+   e->event_win = xevent->xdestroywindow.event;
    e->time = _ecore_x_event_last_time;
-   if (e->win == _ecore_x_event_last_win) _ecore_x_event_last_win = 0;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);   
+   if (e->win == _ecore_x_event_last_win)
+     _ecore_x_event_last_win = 0;
+
+   ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
 }
 
 void
 _ecore_x_event_handle_unmap_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Hide *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xunmap.window;
+   e->event_win = xevent->xunmap.event;
    e->time = _ecore_x_event_last_time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
 }
@@ -855,10 +1094,14 @@ void
 _ecore_x_event_handle_map_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Show *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xmap.window;
+   e->event_win = xevent->xmap.event;
    e->time = _ecore_x_event_last_time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
 }
@@ -867,9 +1110,12 @@ void
 _ecore_x_event_handle_map_request(XEvent *xevent)
 {
    Ecore_X_Event_Window_Show_Request *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xmaprequest.window;
    e->time = _ecore_x_event_last_time;
    e->parent = xevent->xmaprequest.parent;
@@ -880,10 +1126,14 @@ void
 _ecore_x_event_handle_reparent_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Reparent *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xreparent.window;
+   e->event_win = xevent->xreparent.event;
    e->parent = xevent->xreparent.parent;
    e->time = _ecore_x_event_last_time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
@@ -893,10 +1143,14 @@ void
 _ecore_x_event_handle_configure_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Configure *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xconfigure.window;
+   e->event_win = xevent->xconfigure.event;
    e->abovewin = xevent->xconfigure.above;
    e->x = xevent->xconfigure.x;
    e->y = xevent->xconfigure.y;
@@ -906,7 +1160,7 @@ _ecore_x_event_handle_configure_notify(XEvent *xevent)
    e->override = xevent->xconfigure.override_redirect;
    e->from_wm = xevent->xconfigure.send_event;
    e->time = _ecore_x_event_last_time;
-   ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);      
+   ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
 }
 
 void
@@ -914,9 +1168,13 @@ _ecore_x_event_handle_configure_request(XEvent *xevent)
 {
    Ecore_X_Event_Window_Configure_Request *e;
 
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xconfigurerequest.window;
+   e->parent_win = xevent->xconfigurerequest.parent;
    e->abovewin = xevent->xconfigurerequest.above;
    e->x = xevent->xconfigurerequest.x;
    e->y = xevent->xconfigurerequest.y;
@@ -925,6 +1183,7 @@ _ecore_x_event_handle_configure_request(XEvent *xevent)
    e->border = xevent->xconfigurerequest.border_width;
    e->value_mask = xevent->xconfigurerequest.value_mask;
    e->time = _ecore_x_event_last_time;
+
    if (xevent->xconfigurerequest.detail == Above)
      e->detail = ECORE_X_WINDOW_STACK_ABOVE;
    else if (xevent->xconfigurerequest.detail == Below)
@@ -935,12 +1194,14 @@ _ecore_x_event_handle_configure_request(XEvent *xevent)
      e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
    else if (xevent->xconfigurerequest.detail == Opposite)
      e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
 }
 
 void
 _ecore_x_event_handle_gravity_notify(XEvent *xevent __UNUSED__)
 {
+   _ecore_x_last_event_mouse_move = 0;
    /* FIXME: handle this event type */
 }
 
@@ -949,8 +1210,11 @@ _ecore_x_event_handle_resize_request(XEvent *xevent)
 {
    Ecore_X_Event_Window_Resize_Request *e;
 
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xresizerequest.window;
    e->w = xevent->xresizerequest.width;
    e->h = xevent->xresizerequest.height;
@@ -962,15 +1226,19 @@ void
 _ecore_x_event_handle_circulate_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Stack *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xcirculate.window;
    e->event_win = xevent->xcirculate.event;
    if (xevent->xcirculate.place == PlaceOnTop)
      e->detail = ECORE_X_WINDOW_STACK_ABOVE;
    else
-     e->detail = ECORE_X_WINDOW_STACK_BELOW; 
+     e->detail = ECORE_X_WINDOW_STACK_BELOW;
+
    e->time = _ecore_x_event_last_time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
 }
@@ -979,15 +1247,19 @@ void
 _ecore_x_event_handle_circulate_request(XEvent *xevent)
 {
    Ecore_X_Event_Window_Stack_Request *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xcirculaterequest.window;
    e->parent = xevent->xcirculaterequest.parent;
    if (xevent->xcirculaterequest.place == PlaceOnTop)
      e->detail = ECORE_X_WINDOW_STACK_ABOVE;
    else
-     e->detail = ECORE_X_WINDOW_STACK_BELOW; 
+     e->detail = ECORE_X_WINDOW_STACK_BELOW;
+
    e->time = _ecore_x_event_last_time;
    ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
 }
@@ -995,103 +1267,14 @@ _ecore_x_event_handle_circulate_request(XEvent *xevent)
 void
 _ecore_x_event_handle_property_notify(XEvent *xevent)
 {
-#if 0 /* for now i disabled this. nice idea though this is - it leaves a lot
-       * to be desired for efficiency that is better left to the app layer
-       */
-   if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLASS)
-     {
-       Ecore_X_Event_Window_Prop_Name_Class_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change));
-       if (!e) return;
-       ecore_x_window_prop_name_class_get(xevent->xproperty.window, 
-                                          &(e->name), &(e->clas));
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE, e, _ecore_x_event_free_window_prop_name_class_change, NULL);
-     }
-   else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_NAME))
-     {
-       Ecore_X_Event_Window_Prop_Title_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change));
-       if (!e) return;
-       e->title = ecore_x_window_prop_title_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_title_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_NAME)
-     {
-       Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Title_Change));
-       if (!e) return;
-       e->title = ecore_x_window_prop_visible_title_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_visible_title_change, NULL);
-     }
-   else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_ICON_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_ICON_NAME))
-     {
-       Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Icon_Name_Change));
-       if (!e) return;
-       e->name = ecore_x_window_prop_icon_name_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_icon_name_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME)
-     {
-       Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change));
-       if (!e) return;
-       e->name = ecore_x_window_prop_visible_icon_name_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_visible_icon_name_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLIENT_MACHINE)
-     {
-       Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Client_Machine_Change));
-       if (!e) return;
-       e->name = ecore_x_window_prop_client_machine_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE, e, _ecore_x_event_free_window_prop_client_machine_change, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_PID)
-     {
-       Ecore_X_Event_Window_Prop_Pid_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Pid_Change));
-       if (!e) return;
-       e->pid = ecore_x_window_prop_pid_get(xevent->xproperty.window);
-   e->time = xevent->xproperty.time;
-   _ecore_x_event_last_time = e->time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
-     }
-   else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_DESKTOP)
-     {
-       Ecore_X_Event_Window_Prop_Desktop_Change *e;
-       
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Desktop_Change));
-       if (!e) return;
-       e->desktop = ecore_x_window_prop_desktop_get(xevent->xproperty.window);
-       ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
-     }
-   else 
-#endif     
+   _ecore_x_last_event_mouse_move = 0;
    {
       Ecore_X_Event_Window_Property *e;
 
-      e = calloc(1,sizeof(Ecore_X_Event_Window_Property));
-      if (!e) return;
+      e = calloc(1, sizeof(Ecore_X_Event_Window_Property));
+      if (!e)
+        return;
+
       e->win = xevent->xproperty.window;
       e->atom = xevent->xproperty.atom;
       e->time = xevent->xproperty.time;
@@ -1103,40 +1286,48 @@ _ecore_x_event_handle_property_notify(XEvent *xevent)
 void
 _ecore_x_event_handle_selection_clear(XEvent *xevent)
 {
-   Ecore_X_Selection_Intern *d;
+//   Ecore_X_Selection_Intern *d;
    Ecore_X_Event_Selection_Clear *e;
    Ecore_X_Atom sel;
 
-   if (!(d = _ecore_x_selection_get(xevent->xselectionclear.selection)))
-     return;
-   if (xevent->xselectionclear.time > d->time)
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_x_last_event_mouse_move = 0;
+/* errr..... why? paranoia.
+   d = _ecore_x_selection_get(xevent->xselectionclear.selection);
+   if (d && (xevent->xselectionclear.time > d->time))
      {
-       _ecore_x_selection_set(None, NULL, 0, 
-                              xevent->xselectionclear.selection);
+        _ecore_x_selection_set(None, NULL, 0,
+                               xevent->xselectionclear.selection);
      }
-
-   /* Generate event for app cleanup */
+ */
+/* Generate event for app cleanup */
    e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
    e->win = xevent->xselectionclear.window;
    e->time = xevent->xselectionclear.time;
-   sel = xevent->xselectionclear.selection;
+   e->atom = sel = xevent->xselectionclear.selection;
    if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
      e->selection = ECORE_X_SELECTION_PRIMARY;
    else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
      e->selection = ECORE_X_SELECTION_SECONDARY;
-   else
+   else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
      e->selection = ECORE_X_SELECTION_CLIPBOARD;
-   ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
+   else
+     e->selection = ECORE_X_SELECTION_OTHER;
 
+   ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
 }
 
 void
 _ecore_x_event_handle_selection_request(XEvent *xevent)
 {
-   Ecore_X_Event_Selection_Request  *e;
-   Ecore_X_Selection_Intern         *sd;
-   void                             *data;
-
+   Ecore_X_Event_Selection_Request *e;
+   Ecore_X_Selection_Intern *sd;
+   void *data = NULL;
+   int len;
+   int typesize;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_x_last_event_mouse_move = 0;
    /*
     * Generate a selection request event.
     */
@@ -1152,74 +1343,94 @@ _ecore_x_event_handle_selection_request(XEvent *xevent)
    if ((sd = _ecore_x_selection_get(xevent->xselectionrequest.selection)) &&
        (sd->win == xevent->xselectionrequest.owner))
      {
-       Ecore_X_Selection_Intern *si;
-
-       si = _ecore_x_selection_get(xevent->xselectionrequest.selection);
-       if (si->data)
-         {
-            Ecore_X_Atom property;
-
-            if (!ecore_x_selection_convert(xevent->xselectionrequest.selection,
-                                           xevent->xselectionrequest.target,
-                                           &data))
-              {
-                 /* Refuse selection, conversion to requested target failed */
-                 property = None;
-              }
-            else
-              {
-                 /* FIXME: This does not properly handle large data transfers */
-                 ecore_x_window_prop_property_set(xevent->xselectionrequest.requestor,
-                                                  xevent->xselectionrequest.property,
-                                                  xevent->xselectionrequest.target,
-                                                  8, data, sd->length);
-                 property = xevent->xselectionrequest.property;
-                 free(data);
-              }
-
-            ecore_x_selection_notify_send(xevent->xselectionrequest.requestor,
-                                          xevent->xselectionrequest.selection,
-                                          xevent->xselectionrequest.target,
-                                          property,
-                                          xevent->xselectionrequest.time);
-         }
+        Ecore_X_Selection_Intern *si;
+
+        si = _ecore_x_selection_get(xevent->xselectionrequest.selection);
+        if (si->data)
+          {
+             Ecore_X_Atom property = None;
+             Ecore_X_Atom type;
+
+             /* Set up defaults for strings first */
+             type = xevent->xselectionrequest.target;
+             typesize = 8;
+             len = sd->length;
+
+             if (!ecore_x_selection_convert(xevent->xselectionrequest.selection,
+                                            xevent->xselectionrequest.target,
+                                            &data, &len, &type, &typesize))
+               /* Refuse selection, conversion to requested target failed */
+               property = None;
+             else if (data)
+               {
+                  /* FIXME: This does not properly handle large data transfers */
+                  ecore_x_window_prop_property_set(
+                    xevent->xselectionrequest.requestor,
+                    xevent->xselectionrequest.
+                    property,
+                    type,
+                    typesize,
+                    data,
+                    len);
+                  property = xevent->xselectionrequest.property;
+                  free(data);
+               }
+
+             ecore_x_selection_notify_send(xevent->xselectionrequest.requestor,
+                                           xevent->xselectionrequest.selection,
+                                           xevent->xselectionrequest.target,
+                                           property,
+                                           xevent->xselectionrequest.time);
+          }
      }
-   return;
 }
 
 void
 _ecore_x_event_handle_selection_notify(XEvent *xevent)
 {
-   Ecore_X_Event_Selection_Notify   *e;
-   unsigned char                    *data = NULL;
-   Ecore_X_Atom                     selection;
-   int                              num_ret;
-   int                              format;
+   Ecore_X_Event_Selection_Notify *e;
+   unsigned char *data = NULL;
+   Ecore_X_Atom selection;
+   int num_ret, format;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   _ecore_x_last_event_mouse_move = 0;
    selection = xevent->xselection.selection;
 
    if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS)
      {
-       format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
-                                               xevent->xselection.property,
-                                               XA_ATOM, 32, &data, &num_ret);
-       if (!format)
-         return;
+        format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
+                                                  xevent->xselection.property,
+                                                  XA_ATOM, 32, &data, &num_ret);
+        if (!format)
+          {
+             /* fallback if targets handling is not working and try get the
+              * selection directly */
+             XConvertSelection(_ecore_x_disp, selection,
+                               ECORE_X_ATOM_UTF8_STRING,
+                               selection,
+                               xevent->xselection.requestor,
+                               CurrentTime);
+             return;
+          }
      }
    else
      {
-       format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
-                                               xevent->xselection.property,
-                                               AnyPropertyType, 8, &data,
-                                               &num_ret);
-       if (!format)
-         return;
+        format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
+                                                  xevent->xselection.property,
+                                                  AnyPropertyType, 8, &data,
+                                                  &num_ret);
+        if (!format)
+          return;
      }
 
    e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = xevent->xselection.requestor;
    e->time = xevent->xselection.time;
+   e->atom = selection;
    e->target = _ecore_x_selection_target_get(xevent->xselection.target);
 
    if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
@@ -1231,13 +1442,12 @@ _ecore_x_event_handle_selection_notify(XEvent *xevent)
    else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
      e->selection = ECORE_X_SELECTION_CLIPBOARD;
    else
-     {
-       free(e);
-       return;
-     }
+     e->selection = ECORE_X_SELECTION_OTHER;
+
    e->data = _ecore_x_selection_parse(e->target, data, num_ret, format);
 
-   ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e, _ecore_x_event_free_selection_notify, NULL);
+   ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
+                   _ecore_x_event_free_selection_notify, NULL);
 }
 
 void
@@ -1245,21 +1455,26 @@ _ecore_x_event_handle_colormap_notify(XEvent *xevent)
 {
    Ecore_X_Event_Window_Colormap *e;
 
-   e = calloc(1,sizeof(Ecore_X_Event_Window_Colormap));
-   if (!e) return;
+   _ecore_x_last_event_mouse_move = 0;
+   e = calloc(1, sizeof(Ecore_X_Event_Window_Colormap));
+   if (!e)
+     return;
+
    e->win = xevent->xcolormap.window;
    e->cmap = xevent->xcolormap.colormap;
    e->time = _ecore_x_event_last_time;
    if (xevent->xcolormap.state == ColormapInstalled)
-      e->installed = 1;
+     e->installed = EINA_TRUE;
    else
-      e->installed = 0;
+     e->installed = EINA_FALSE;
+
    ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
 }
 
 void
 _ecore_x_event_handle_client_message(XEvent *xevent)
 {
+   _ecore_x_last_event_mouse_move = 0;
    /* Special client message event handling here. need to put LOTS of if */
    /* checks here and generate synthetic events per special message known */
    /* otherwise generate generic client message event. this would handle*/
@@ -1268,393 +1483,475 @@ _ecore_x_event_handle_client_message(XEvent *xevent)
        (xevent->xclient.format == 32) &&
        (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
      {
-       Ecore_X_Event_Window_Delete_Request *e;
+        Ecore_X_Event_Window_Delete_Request *e;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       e->time = _ecore_x_event_last_time;
-       ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
-     }
+        e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
+        if (!e)
+          return;
 
+        e->win = xevent->xclient.window;
+        e->time = _ecore_x_event_last_time;
+        ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
+     }
    else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
-           (xevent->xclient.format == 32) &&
-           /* Ignore move and resize with keyboard */
-           (xevent->xclient.data.l[2] < 9))
+            (xevent->xclient.format == 32) &&
+/* Ignore move and resize with keyboard */
+            (xevent->xclient.data.l[2] < 9))
      {
-       Ecore_X_Event_Window_Move_Resize_Request *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       e->x = xevent->xclient.data.l[0];
-       e->y = xevent->xclient.data.l[1];
-       e->direction = xevent->xclient.data.l[2];
-       e->button = xevent->xclient.data.l[3];
-       e->source = xevent->xclient.data.l[4];
-       ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
+        Ecore_X_Event_Window_Move_Resize_Request *e;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
+        if (!e)
+          return;
+
+        e->win = xevent->xclient.window;
+        e->x = xevent->xclient.data.l[0];
+        e->y = xevent->xclient.data.l[1];
+        e->direction = xevent->xclient.data.l[2];
+        e->button = xevent->xclient.data.l[3];
+        e->source = xevent->xclient.data.l[4];
+        ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
      }
-
    /* Xdnd Client Message Handling Begin */
    /* Message Type: XdndEnter target */
    else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_ENTER)
      {
-       Ecore_X_Event_Xdnd_Enter *e;
-       Ecore_X_DND_Target *target;
-       unsigned long three;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
-       if (!e) return;
-
-       target = _ecore_x_dnd_target_get();
-       target->state = ECORE_X_DND_TARGET_ENTERED;
-       target->source = xevent->xclient.data.l[0];
-       target->win = xevent->xclient.window;
-       target->version = (int) (xevent->xclient.data.l[1] >> 24);
-       if (target->version > ECORE_X_DND_VERSION)
-         {
-            printf("DND: Requested version %d, we only support up to %d\n", target->version,
-                                                                            ECORE_X_DND_VERSION);
-            return;
-         }
-
-       if ((three = xevent->xclient.data.l[1] & 0x1UL))
-         {
-            /* source supports more than 3 types, fetch property */
-            unsigned char *data;
-            Ecore_X_Atom *types;
-            int i, num_ret;
-            if (!(ecore_x_window_prop_property_get(target->source, 
-                                                   ECORE_X_ATOM_XDND_TYPE_LIST,
-                                                   XA_ATOM,
-                                                   32,
-                                                   &data,
-                                                   &num_ret)))
-              {
-                 printf("DND: Could not fetch data type list from source window, aborting.\n");
-                 return;
-              }
-            types = (Ecore_X_Atom *)data;
-            e->types = calloc(num_ret, sizeof(char *));
-            if (e->types)
-              {
-                 for (i = 0; i < num_ret; i++)
-                   e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
-              }
-            e->num_types = num_ret;
-         }
-       else
-         {
-            int i = 0;
-
-            e->types = calloc(3, sizeof(char *));
-            if (e->types)
-              {
-                 while ((i < 3) && (xevent->xclient.data.l[i + 2]))
-                   {
-                      e->types[i] = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[i + 2]);
-                      i++;
-                   }
-              }
-            e->num_types = i;
-         }
-
-       e->win = target->win;
-       e->source = target->source;
-       ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e, _ecore_x_event_free_xdnd_enter, NULL);
+        Ecore_X_Event_Xdnd_Enter *e;
+        Ecore_X_DND_Target *target;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
+        if (!e) return;
+
+        LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+        target = _ecore_x_dnd_target_get();
+        target->state = ECORE_X_DND_TARGET_ENTERED;
+        target->source = xevent->xclient.data.l[0];
+        target->win = xevent->xclient.window;
+        target->version = (int)(xevent->xclient.data.l[1] >> 24);
+        if (target->version > ECORE_X_DND_VERSION)
+          {
+             WRN("DND: Requested version %d, we only support up to %d",
+                 target->version, ECORE_X_DND_VERSION);
+             free(e);
+             return;
+          }
+
+        if (xevent->xclient.data.l[1] & 0x1UL)
+          {
+             /* source supports more than 3 types, fetch property */
+             unsigned char *data;
+             Ecore_X_Atom *types;
+             int i, num_ret;
+
+             LOGFN(__FILE__, __LINE__, __FUNCTION__);
+             if (!(ecore_x_window_prop_property_get(target->source,
+                                                    ECORE_X_ATOM_XDND_TYPE_LIST,
+                                                    XA_ATOM,
+                                                    32, &data, &num_ret)))
+               {
+                  WRN(
+                    "DND: Could not fetch data type list from source window, aborting.");
+                  free(e);
+                  return;
+               }
+
+             types = (Ecore_X_Atom *)data;
+             e->types = calloc(num_ret, sizeof(char *));
+             if (e->types)
+               {
+                  LOGFN(__FILE__, __LINE__, __FUNCTION__);
+                  for (i = 0; i < num_ret; i++)
+                    e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
+               }
+
+             e->num_types = num_ret;
+          }
+        else
+          {
+             int i = 0;
+
+             e->types = calloc(3, sizeof(char *));
+             if (e->types)
+               {
+                  LOGFN(__FILE__, __LINE__, __FUNCTION__);
+                  while ((i < 3) && (xevent->xclient.data.l[i + 2]))
+                    {
+                       e->types[i] = XGetAtomName(_ecore_x_disp,
+                                                  xevent->xclient.data.l[i + 2]);
+                       i++;
+                    }
+               }
+
+             e->num_types = i;
+          }
+
+        e->win = target->win;
+        e->source = target->source;
+        ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
+                        _ecore_x_event_free_xdnd_enter, NULL);
      }
-
    /* Message Type: XdndPosition target */
    else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_POSITION)
      {
-       Ecore_X_Event_Xdnd_Position *e;
-       Ecore_X_DND_Target *target;
-
-       target = _ecore_x_dnd_target_get();
-       if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
-           (target->win != xevent->xclient.window))
-         return;
-
-       target->pos.x = xevent->xclient.data.l[2] >> 16;
-       target->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
-       target->action = xevent->xclient.data.l[4]; /* Version 2 */
-
-       target->time = (target->version >= 1) ? 
-          (Time)xevent->xclient.data.l[3] : CurrentTime;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
-       if (!e) return;
-       e->win = target->win;
-       e->source = target->source;
-       e->position.x = target->pos.x;
-       e->position.y = target->pos.y;
-       e->action = target->action;
-       ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
-     }
+        Ecore_X_Event_Xdnd_Position *e;
+        Ecore_X_DND_Target *target;
 
+        LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+        target = _ecore_x_dnd_target_get();
+        if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
+            (target->win != xevent->xclient.window))
+          return;
+
+        target->pos.x = xevent->xclient.data.l[2] >> 16;
+        target->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
+        target->action = xevent->xclient.data.l[4]; /* Version 2 */
+
+        target->time = (target->version >= 1) ?
+          (Time)xevent->xclient.data.l[3] : CurrentTime;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
+        if (!e) return;
+
+        e->win = target->win;
+        e->source = target->source;
+        e->position.x = target->pos.x;
+        e->position.y = target->pos.y;
+        e->action = target->action;
+        ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
+     }
    /* Message Type: XdndStatus source */
    else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_STATUS)
      {
-       Ecore_X_Event_Xdnd_Status *e;
-       Ecore_X_DND_Source *source;
-
-       source = _ecore_x_dnd_source_get();
-       /* Make sure source/target match */
-       if ((source->win != xevent->xclient.window ) ||
-           (source->dest != (Window)xevent->xclient.data.l[0]))
-         return;
-
-       source->await_status = 0;
-
-       source->will_accept = xevent->xclient.data.l[1] & 0x1UL;
-       source->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
-
-       source->rectangle.x = xevent->xclient.data.l[2] >> 16;
-       source->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
-       source->rectangle.width = xevent->xclient.data.l[3] >> 16;
-       source->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
-
-       source->accepted_action = xevent->xclient.data.l[4];
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
-       if (!e) return;
-       e->win = source->win;
-       e->target = source->dest;
-       e->will_accept = source->will_accept;
-       e->rectangle.x = source->rectangle.x;
-       e->rectangle.y = source->rectangle.y;
-       e->rectangle.width = source->rectangle.width;
-       e->rectangle.height = source->rectangle.height;
-       e->action = source->accepted_action;
-
-       ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
-     }
+        Ecore_X_Event_Xdnd_Status *e;
+        Ecore_X_DND_Source *source;
+
+        LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
+        source = _ecore_x_dnd_source_get();
+        /* Make sure source/target match */
+        if ((source->win != xevent->xclient.window) ||
+            (source->dest != (Window)xevent->xclient.data.l[0]))
+          return;
+
+        source->await_status = 0;
+
+        source->will_accept = xevent->xclient.data.l[1] & 0x1UL;
+        source->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
+
+        source->rectangle.x = xevent->xclient.data.l[2] >> 16;
+        source->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
+        source->rectangle.width = xevent->xclient.data.l[3] >> 16;
+        source->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
+
+        source->accepted_action = xevent->xclient.data.l[4];
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
+        if (!e) return;
+
+        e->win = source->win;
+        e->target = source->dest;
+        e->will_accept = source->will_accept;
+        e->rectangle.x = source->rectangle.x;
+        e->rectangle.y = source->rectangle.y;
+        e->rectangle.width = source->rectangle.width;
+        e->rectangle.height = source->rectangle.height;
+        e->action = source->accepted_action;
+
+        ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
+     }
    /* Message Type: XdndLeave target */
    /* Pretend the whole thing never happened, sort of */
    else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_LEAVE)
      {
-       Ecore_X_Event_Xdnd_Leave *e;
-       Ecore_X_DND_Target *target;
+        Ecore_X_Event_Xdnd_Leave *e;
+        Ecore_X_DND_Target *target;
 
-       target = _ecore_x_dnd_target_get();
-       if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
-           (target->win != xevent->xclient.window))
-         return;
+        LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-       target->state = ECORE_X_DND_TARGET_IDLE;
+        target = _ecore_x_dnd_target_get();
+        if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
+            (target->win != xevent->xclient.window))
+          return;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       e->source = (Window)xevent->xclient.data.l[0];
-       ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
-     }
+        target->state = ECORE_X_DND_TARGET_IDLE;
 
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
+        if (!e) return;
+
+        e->win = xevent->xclient.window;
+        e->source = (Window)xevent->xclient.data.l[0];
+        ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
+     }
    /* Message Type: XdndDrop target */
    else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_DROP)
      {
-       Ecore_X_Event_Xdnd_Drop *e;
-       Ecore_X_DND_Target *target;
-
-       target = _ecore_x_dnd_target_get();
-       /* Match source/target */
-       if ((target->source != (Window)xevent->xclient.data.l[0]) ||
-           (target->win != xevent->xclient.window))
-         return;
-
-       target->time = (target->version >= 1) ? 
-          (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
-       if (!e) return;
-       e->win = target->win;
-       e->source = target->source;
-       e->action = target->action;
-       e->position.x = target->pos.x;
-       e->position.y = target->pos.y;
-       ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
-     }
+        Ecore_X_Event_Xdnd_Drop *e;
+        Ecore_X_DND_Target *target;
+
+        LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+        target = _ecore_x_dnd_target_get();
+        /* Match source/target */
+        if ((target->source != (Window)xevent->xclient.data.l[0]) ||
+            (target->win != xevent->xclient.window))
+          return;
 
+        target->time = (target->version >= 1) ?
+          (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
+        if (!e) return;
+
+        e->win = target->win;
+        e->source = target->source;
+        e->action = target->action;
+        e->position.x = target->pos.x;
+        e->position.y = target->pos.y;
+        ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
+     }
    /* Message Type: XdndFinished source */
    else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_FINISHED)
      {
-       Ecore_X_Event_Xdnd_Finished *e;
-       Ecore_X_DND_Source *source;
-       int completed = 1;
-
-       source = _ecore_x_dnd_source_get();
-       /* Match source/target */
-       if ((source->win != xevent->xclient.window) ||
-           (source->dest != (Window)xevent->xclient.data.l[0]))
-         return;
-
-       if ((source->version < 5) || (xevent->xclient.data.l[1] & 0x1UL))
-         {
-            /* Target successfully performed drop action */
-            ecore_x_selection_xdnd_clear();
-            source->state = ECORE_X_DND_SOURCE_IDLE;
-         }
-       else if (source->version >= 5)
-         {
-              completed = 0;
-              source->state = ECORE_X_DND_SOURCE_CONVERTING;
-
-              /* FIXME: Probably need to add a timer to switch back to idle 
-               * and discard the selection data */
-         } 
-
-       e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
-       if (!e) return;
-       e->win = source->win;
-       e->target = source->dest;
-       e->completed = completed;
-       if (source->version >= 5)
-         {
-            source->accepted_action = xevent->xclient.data.l[2];
-            e->action = source->accepted_action;
-         }
-       else
-         {
-            source->accepted_action = 0;
-            e->action = source->action;
-         }
-
-       ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
+        Ecore_X_Event_Xdnd_Finished *e;
+        Ecore_X_DND_Source *source;
+        Eina_Bool completed = EINA_TRUE;
+
+        LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+        source = _ecore_x_dnd_source_get();
+        /* Match source/target */
+        if ((source->win != xevent->xclient.window) ||
+            (source->dest != (Window)xevent->xclient.data.l[0]))
+          return;
+
+        if ((source->version < 5) || (xevent->xclient.data.l[1] & 0x1UL))
+          {
+             LOGFN(__FILE__, __LINE__, __FUNCTION__);
+             /* Target successfully performed drop action */
+             ecore_x_selection_xdnd_clear();
+             source->state = ECORE_X_DND_SOURCE_IDLE;
+          }
+        else if (source->version >= 5)
+          {
+             completed = EINA_FALSE;
+             source->state = ECORE_X_DND_SOURCE_CONVERTING;
+
+             /* FIXME: Probably need to add a timer to switch back to idle
+              * and discard the selection data */
+          }
+
+        e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
+        if (!e) return;
+
+        e->win = source->win;
+        e->target = source->dest;
+        e->completed = completed;
+        if (source->version >= 5)
+          {
+             source->accepted_action = xevent->xclient.data.l[2];
+             e->action = source->accepted_action;
+          }
+        else
+          {
+             source->accepted_action = 0;
+             e->action = source->action;
+          }
+
+        ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
      }
    else if (xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_STATE)
      {
-       Ecore_X_Event_Window_State_Request *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       if (xevent->xclient.data.l[0] == 0)
-         e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
-       else if (xevent->xclient.data.l[0] == 1)
-         e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
-       else if (xevent->xclient.data.l[0] == 2)
-         e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
-       else
-         {
-            free(e);
-            return;
-         }
-       e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
-       if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
-         {
-            char *name;
-            name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[1]);
-            if (name)
-              printf("Unknown state: %s\n", name);
-            XFree(name);
-         }
-       e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
-       if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
-         {
-            char *name;
-            name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[2]);
-            if (name)
-              printf("Unknown state: %s\n", name);
-            XFree(name);
-         }
-       e->source = xevent->xclient.data.l[3];
-
-       ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
+        Ecore_X_Event_Window_State_Request *e;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
+        if (!e) return;
+
+        e->win = xevent->xclient.window;
+        if (xevent->xclient.data.l[0] == 0)
+          e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
+        else if (xevent->xclient.data.l[0] == 1)
+          e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
+        else if (xevent->xclient.data.l[0] == 2)
+          e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
+        else
+          {
+             free(e);
+             return;
+          }
+
+        LOGFN(__FILE__, __LINE__, __FUNCTION__);
+        e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
+        if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
+          {
+//          char *name;
+             LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+//          name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[1]);
+//          if (name) ERR("Unknown state: %s", name);
+//          XFree(name);
+          }
+        e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
+        if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
+          {
+//          char *name;
+             LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+//          name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[2]);
+//          if (name) ERR("Unknown state: %s", name);
+//          XFree(name);
+          }
+
+        e->source = xevent->xclient.data.l[3];
+
+        ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
      }
    else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
-           && (xevent->xclient.format == 32)
-           && (xevent->xclient.data.l[0] == IconicState))
+            && (xevent->xclient.format == 32)
+            && (xevent->xclient.data.l[0] == IconicState))
      {
-       Ecore_X_Event_Window_State_Request *e;
+        Ecore_X_Event_Window_State_Request *e;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
+        if (!e)
+          return;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
-       e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
+        e->win = xevent->xclient.window;
+        e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
+        e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
 
-       ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
+        ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
      }
    else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_DESKTOP)
-           && (xevent->xclient.format == 32))
+            && (xevent->xclient.format == 32))
      {
-       Ecore_X_Event_Desktop_Change *e;
+        Ecore_X_Event_Desktop_Change *e;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       e->desk = xevent->xclient.data.l[0];
-       e->source = xevent->xclient.data.l[1];
+        e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
+        if (!e)
+          return;
 
-       ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
-     }
-   else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
-     {
-       Ecore_X_Event_Frame_Extents_Request *e;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
-       if (!e) return;
-       e->win = xevent->xclient.window;
+        e->win = xevent->xclient.window;
+        e->desk = xevent->xclient.data.l[0];
+        e->source = xevent->xclient.data.l[1];
 
-       ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
+        ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
      }
-   else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS)
-           && ((Ecore_X_Atom)xevent->xclient.data.l[0] == ECORE_X_ATOM_NET_WM_PING)
-           && (xevent->xclient.format == 32))
+   else if ((xevent->xclient.message_type ==
+             ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
      {
-       Ecore_X_Event_Ping *e;
+        Ecore_X_Event_Frame_Extents_Request *e;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
+        if (!e)
+          return;
 
-       e = calloc(1, sizeof(Ecore_X_Event_Ping));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       e->time = xevent->xclient.data.l[1];
-       e->event_win = xevent->xclient.data.l[2];
+        e->win = xevent->xclient.window;
 
-       ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
+        ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
      }
-   else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
-           (xevent->xclient.format == 8))
+   else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS)
+            && ((Ecore_X_Atom)xevent->xclient.data.l[0] ==
+                ECORE_X_ATOM_NET_WM_PING)
+            && (xevent->xclient.format == 32))
      {
-       _ecore_x_netwm_startup_info_begin(xevent->xclient.window, xevent->xclient.data.b);
+        Ecore_X_Event_Ping *e;
+        Ecore_X_Window root = 0;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Ping));
+        if (!e)
+          return;
+
+        e->win = xevent->xclient.window;
+        e->time = xevent->xclient.data.l[1];
+        e->event_win = xevent->xclient.data.l[2];
+
+        /* send a reply anyway - we are alive... eventloop at least */
+        ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
+        if (ScreenCount(_ecore_x_disp) > 1)
+          {
+             LOGFN(__FILE__, __LINE__, __FUNCTION__);
+             root = ecore_x_window_root_get(e->win);
+          }
+        else
+          root = DefaultRootWindow(_ecore_x_disp);
+
+        if (xevent->xclient.window != root)
+          {
+             xevent->xclient.window = root;
+             XSendEvent(_ecore_x_disp, root, False,
+                        SubstructureRedirectMask | SubstructureNotifyMask,
+                        xevent);
+          }
      }
+   else if ((xevent->xclient.message_type ==
+             ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
+            (xevent->xclient.format == 8))
+     _ecore_x_netwm_startup_info_begin(xevent->xclient.window,
+                                       xevent->xclient.data.b);
    else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO) &&
-           (xevent->xclient.format == 8))
-     {
-       _ecore_x_netwm_startup_info(xevent->xclient.window, xevent->xclient.data.b);
-     }
+            (xevent->xclient.format == 8))
+     _ecore_x_netwm_startup_info(xevent->xclient.window,
+                                 xevent->xclient.data.b);
    else if ((xevent->xclient.message_type == 27777)
-           && (xevent->xclient.data.l[0] == 0x7162534)
-           && (xevent->xclient.format == 32)
-           && (xevent->xclient.window == _ecore_x_private_win))
+            && (xevent->xclient.data.l[0] == 0x7162534)
+            && (xevent->xclient.format == 32)
+            && (xevent->xclient.window == _ecore_x_private_win))
      {
-       /* a grab sync marker */
-       if (xevent->xclient.data.l[1] == 0x10000001)
-         _ecore_x_window_grab_remove(xevent->xclient.data.l[2]);
-       else if (xevent->xclient.data.l[1] == 0x10000002)
-         _ecore_x_key_grab_remove(xevent->xclient.data.l[2]);
+        /* a grab sync marker */
+        if (xevent->xclient.data.l[1] == 0x10000001)
+          _ecore_x_window_grab_remove(xevent->xclient.data.l[2]);
+        else if (xevent->xclient.data.l[1] == 0x10000002)
+          _ecore_x_key_grab_remove(xevent->xclient.data.l[2]);
      }
    else
      {
-       Ecore_X_Event_Client_Message *e;
-       int i;
-
-       e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
-       if (!e) return;
-       e->win = xevent->xclient.window;
-       e->message_type = xevent->xclient.message_type;
-       e->format = xevent->xclient.format;
-       for (i = 0; i < 5; i++) 
-         e->data.l[i] = xevent->xclient.data.l[i];
-
-       ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
+        Ecore_X_Event_Client_Message *e;
+        int i;
+
+        e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
+        if (!e)
+          return;
+
+        e->win = xevent->xclient.window;
+        e->message_type = xevent->xclient.message_type;
+        e->format = xevent->xclient.format;
+        for (i = 0; i < 5; i++)
+          e->data.l[i] = xevent->xclient.data.l[i];
+
+        ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
      }
 }
 
 void
-_ecore_x_event_handle_mapping_notify(XEvent *xevent __UNUSED__)
+_ecore_x_event_handle_mapping_notify(XEvent *xevent)
 {
-   /* FIXME: handle this event type */
+   Ecore_X_Event_Mapping_Change *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   XRefreshKeyboardMapping((XMappingEvent *)xevent);
+   _ecore_x_modifiers_get();
+   e = calloc(1, sizeof(Ecore_X_Event_Mapping_Change));
+   if (!e) return;
+   switch (xevent->xmapping.request)
+     {
+      case MappingModifier:
+        e->type = ECORE_X_MAPPING_MODIFIER;
+        break;
+
+      case MappingKeyboard:
+        e->type = ECORE_X_MAPPING_KEYBOARD;
+        break;
+
+      case MappingPointer:
+      default:
+        e->type = ECORE_X_MAPPING_MOUSE;
+        break;
+     }
+   e->keycode = xevent->xmapping.first_keycode;
+   e->num = xevent->xmapping.count;
+   ecore_event_add(ECORE_X_EVENT_MAPPING_CHANGE, e, NULL, NULL);
 }
 
 void
@@ -1662,12 +1959,37 @@ _ecore_x_event_handle_shape_change(XEvent *xevent)
 {
    XShapeEvent *shape_event;
    Ecore_X_Event_Window_Shape *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    shape_event = (XShapeEvent *)xevent;
    e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = shape_event->window;
    e->time = shape_event->time;
+   switch (shape_event->kind)
+     {
+      case ShapeBounding:
+        e->type = ECORE_X_SHAPE_BOUNDING;
+        break;
+
+      case ShapeClip:
+        e->type = ECORE_X_SHAPE_CLIP;
+        break;
+
+      case ShapeInput:
+        e->type = ECORE_X_SHAPE_INPUT;
+        break;
+
+      default:
+        break;
+     }
+   e->x = shape_event->x;
+   e->y = shape_event->y;
+   e->w = shape_event->width;
+   e->h = shape_event->height;
+   e->shaped = shape_event->shaped;
    ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
 }
 
@@ -1677,20 +1999,25 @@ _ecore_x_event_handle_screensaver_notify(XEvent *xevent)
 #ifdef ECORE_XSS
    XScreenSaverNotifyEvent *screensaver_event;
    Ecore_X_Event_Screensaver_Notify *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    screensaver_event = (XScreenSaverNotifyEvent *)xevent;
    e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = screensaver_event->window;
-   if (screensaver_event->state == ScreenSaverOn)
-     e->on = 1;
-  else 
-     e->on = 0;
+   if ((screensaver_event->state == ScreenSaverOn) ||
+       (screensaver_event->state == ScreenSaverCycle))
+     e->on = EINA_TRUE;
+   else
+     e->on = EINA_FALSE;
+
    e->time = screensaver_event->time;
    ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
-#else
+#else /* ifdef ECORE_XSS */
    xevent = NULL;
-#endif   
+#endif /* ifdef ECORE_XSS */
 }
 
 void
@@ -1698,10 +2025,13 @@ _ecore_x_event_handle_sync_counter(XEvent *xevent)
 {
    XSyncCounterNotifyEvent *sync_counter_event;
    Ecore_X_Event_Sync_Counter *e;
-   
+
+   _ecore_x_last_event_mouse_move = 0;
    sync_counter_event = (XSyncCounterNotifyEvent *)xevent;
    e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->time = sync_counter_event->time;
    ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
 }
@@ -1712,10 +2042,13 @@ _ecore_x_event_handle_sync_alarm(XEvent *xevent)
    XSyncAlarmNotifyEvent *sync_alarm_event;
    Ecore_X_Event_Sync_Alarm *e;
 
+   _ecore_x_last_event_mouse_move = 0;
    sync_alarm_event = (XSyncAlarmNotifyEvent *)xevent;
 
    e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->time = sync_alarm_event->time;
    e->alarm = sync_alarm_event->alarm;
    ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
@@ -1728,40 +2061,176 @@ _ecore_x_event_handle_randr_change(XEvent *xevent)
    XRRScreenChangeNotifyEvent *randr_event;
    Ecore_X_Event_Screen_Change *e;
 
+   _ecore_x_last_event_mouse_move = 0;
    randr_event = (XRRScreenChangeNotifyEvent *)xevent;
    if (!XRRUpdateConfiguration(xevent))
-     printf("ERROR: Can't update RR config!\n");
+     ERR("Can't update RR config!");
 
    e = calloc(1, sizeof(Ecore_X_Event_Screen_Change));
-   if (!e) return;
+   if (!e)
+     return;
+
    e->win = randr_event->window;
    e->root = randr_event->root;
-   e->width = randr_event->width;
-   e->height = randr_event->height;
+   e->size.width = randr_event->width;
+   e->size.height = randr_event->height;
+   e->time = randr_event->timestamp;
+   e->config_time = randr_event->config_timestamp;
+   e->size.width_mm = randr_event->mwidth;
+   e->size.height_mm = randr_event->mheight;
+   e->orientation = randr_event->rotation;
+   e->subpixel_order = randr_event->subpixel_order;
    ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
 }
-#endif
+
+static void
+_ecore_x_event_handle_randr_notify_crtc_change(const XRRNotifyEvent *xevent)
+{
+   const XRRCrtcChangeNotifyEvent *randr_event;
+   Ecore_X_Event_Randr_Crtc_Change *e;
+
+   randr_event = (const XRRCrtcChangeNotifyEvent *)xevent;
+
+   e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change));
+   if (!e)
+     return;
+
+   e->win = randr_event->window;
+   e->crtc = randr_event->crtc;
+   e->mode = randr_event->mode;
+   e->orientation = randr_event->rotation;
+   e->geo.x = randr_event->x;
+   e->geo.y = randr_event->y;
+   e->geo.w = randr_event->width;
+   e->geo.h = randr_event->height;
+   ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
+}
+
+static void
+_ecore_x_event_handle_randr_notify_output_change(const XRRNotifyEvent *xevent)
+{
+   const XRROutputChangeNotifyEvent *randr_event;
+   Ecore_X_Event_Randr_Output_Change *e;
+
+   randr_event = (const XRROutputChangeNotifyEvent *)xevent;
+
+   e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Change));
+   if (!e)
+     return;
+
+   e->win = randr_event->window;
+   e->output = randr_event->output;
+   e->crtc = randr_event->crtc;
+   e->mode = randr_event->mode;
+   e->orientation = randr_event->rotation;
+   e->connection = randr_event->connection;
+   e->subpixel_order = randr_event->subpixel_order;
+   ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, e, NULL, NULL);
+}
+
+static void
+_ecore_x_event_handle_randr_notify_output_property(const XRRNotifyEvent *xevent)
+{
+   const XRROutputPropertyNotifyEvent *randr_event;
+   Ecore_X_Event_Randr_Output_Property_Notify *e;
+
+   randr_event = (const XRROutputPropertyNotifyEvent *)xevent;
+
+   e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify));
+   if (!e)
+     return;
+
+   e->win = randr_event->window;
+   e->output = randr_event->output;
+   e->property = randr_event->property;
+   e->time = randr_event->timestamp;
+   if (randr_event->state == PropertyNewValue)
+     e->state = ECORE_X_RANDR_PROPERTY_CHANGE_ADD;
+   else
+     e->state = ECORE_X_RANDR_PROPERTY_CHANGE_DEL;
+   ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_randr_notify(XEvent *xevent)
+{
+   const XRRNotifyEvent *randr_event;
+
+   _ecore_x_last_event_mouse_move = 0;
+   randr_event = (const XRRNotifyEvent *)xevent;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   switch (randr_event->subtype)
+     {
+      case RRNotify_CrtcChange:
+        _ecore_x_event_handle_randr_notify_crtc_change(randr_event);
+        break;
+
+      case RRNotify_OutputChange:
+        _ecore_x_event_handle_randr_notify_output_change(randr_event);
+        break;
+
+      case RRNotify_OutputProperty:
+        _ecore_x_event_handle_randr_notify_output_property(randr_event);
+        break;
+
+      default:
+        ERR("Unknown XRandR RRNotify subtype: %d.",
+            randr_event->subtype);
+        break;
+     }
+}
+
+#endif /* ifdef ECORE_XRANDR */
 
 #ifdef ECORE_XFIXES
 void
 _ecore_x_event_handle_fixes_selection_notify(XEvent *event)
 {
+   XFixesSelectionNotifyEvent *notify_event =
+     (XFixesSelectionNotifyEvent *)event;
+   Ecore_X_Event_Fixes_Selection_Notify *e;
+   Ecore_X_Atom sel;
+
+   _ecore_x_last_event_mouse_move = 0;
    /* Nothing here yet */
-   event = NULL;
+
+   e = calloc(1, sizeof(*e));
+   if (!e)
+     return;
+
+   e->win = notify_event->window;
+   e->owner = notify_event->owner;
+   e->time = notify_event->timestamp;
+   e->selection_time = notify_event->selection_timestamp;
+   e->atom = sel = notify_event->selection;
+   if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
+     e->selection = ECORE_X_SELECTION_PRIMARY;
+   else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
+     e->selection = ECORE_X_SELECTION_SECONDARY;
+   else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
+     e->selection = ECORE_X_SELECTION_CLIPBOARD;
+   else
+     e->selection = ECORE_X_SELECTION_OTHER;
+   e->reason = notify_event->subtype;
+
+   ecore_event_add(ECORE_X_EVENT_FIXES_SELECTION_NOTIFY, e, NULL, NULL);
 }
-#endif
+
+#endif /* ifdef ECORE_XFIXES */
 
 #ifdef ECORE_XDAMAGE
 void
 _ecore_x_event_handle_damage_notify(XEvent *event)
 {
-   XDamageNotifyEvent *damage_event;
+   XDamageNotifyEvent *damage_event;   
    Ecore_X_Event_Damage *e;
 
+   _ecore_x_last_event_mouse_move = 0;
    damage_event = (XDamageNotifyEvent *)event;
 
    e = calloc(1, sizeof(Ecore_X_Event_Damage));
-   if (!e) return;
+   if (!e)
+     return;
 
    e->level = damage_event->level;
    e->drawable = damage_event->drawable;
@@ -1779,5 +2248,280 @@ _ecore_x_event_handle_damage_notify(XEvent *event)
 
    ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
 }
-#endif
 
+#endif /* ifdef ECORE_XDAMAGE */
+
+static void
+_ecore_x_event_free_generic_event(void *data,
+                                  void *ev)
+{
+#ifdef ECORE_XI2
+   Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic *)ev;
+
+   if (data)
+     {
+        if (e->data)
+          XFreeEventData(_ecore_x_disp, (XGenericEventCookie *)data);
+        free(data);
+     }
+   free(e);
+#else
+   return;
+   data = NULL; ev = NULL;
+#endif /* ifdef ECORE_XI2 */
+}
+
+void
+_ecore_x_event_handle_generic_event(XEvent *event)
+{
+#ifdef ECORE_XI2
+   XGenericEvent *generic_event;
+   Ecore_X_Event_Generic *e;
+   XGenericEventCookie *data;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   generic_event = (XGenericEvent *)event;
+
+   e = calloc(1, sizeof(Ecore_X_Event_Generic));
+   if (!e)
+     return;
+
+   if (XGetEventData(_ecore_x_disp, &(event->xcookie)))
+     {
+        e->cookie = event->xcookie.cookie;
+        e->data = event->xcookie.data;
+     }
+   else
+     {
+        e->cookie = 0;
+        e->data = NULL;
+     }
+
+   e->extension = generic_event->extension;
+   e->evtype = generic_event->evtype;
+
+   if (e->extension == _ecore_x_xi2_opcode)
+     _ecore_x_input_handler(event);
+
+   data = malloc(sizeof(XGenericEventCookie));
+   if (data) memcpy(data, &(event->xcookie), sizeof(XGenericEventCookie));
+   ecore_event_add(ECORE_X_EVENT_GENERIC,
+                   e,
+                   _ecore_x_event_free_generic_event,
+                   data);
+#else
+   return;
+   event = NULL;
+#endif /* ifdef ECORE_XI2 */
+}
+
+#ifdef ECORE_XGESTURE
+void
+_ecore_x_event_handle_gesture_notify_flick(XEvent *xevent)
+{
+   XGestureNotifyFlickEvent *xfe;
+   Ecore_X_Event_Gesture_Notify_Flick *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xfe = (XGestureNotifyFlickEvent *)xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Flick));
+   if (!e)
+     return;
+
+   e->win = xfe->window;
+   e->time = xfe->time;
+   e->subtype = xfe->kind;
+   e->num_fingers = xfe->num_finger;
+   e->distance = xfe->distance;
+   e->duration = xfe->duration;
+   e->direction = xfe->direction;
+   e->angle = XFixedToDouble(xfe->angle);
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_FLICK, e, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_gesture_notify_pan(XEvent *xevent)
+{
+   XGestureNotifyPanEvent *xpe;
+   Ecore_X_Event_Gesture_Notify_Pan *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xpe = (XGestureNotifyPanEvent *)xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Pan));
+   if (!e)
+     return;
+
+   e->win = xpe->window;
+   e->time = xpe->time;
+   e->subtype = xpe->kind;
+   e->num_fingers = xpe->num_finger;
+   e->dx = xpe->dx;
+   e->dy = xpe->dy;
+   e->distance = xpe->distance;
+   e->duration = xpe->duration;
+   e->direction = xpe->direction;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PAN, e, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_gesture_notify_pinchrotation(XEvent *xevent)
+{
+   XGestureNotifyPinchRotationEvent *xpre;
+   Ecore_X_Event_Gesture_Notify_PinchRotation *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xpre = (XGestureNotifyPinchRotationEvent *)xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_PinchRotation));
+   if (!e)
+     return;
+
+   e->win = xpre->window;
+   e->time = xpre->time;
+   e->subtype = xpre->kind;
+   e->num_fingers = xpre->num_finger;
+   e->distance = xpre->distance;
+   e->cx = xpre->cx;
+   e->cy = xpre->cy;
+   e->zoom = XFixedToDouble(xpre->zoom);
+   e->angle = XFixedToDouble(xpre->angle);
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION, e, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_gesture_notify_tap(XEvent *xevent)
+{
+   XGestureNotifyTapEvent *xte;
+   Ecore_X_Event_Gesture_Notify_Tap *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xte = (XGestureNotifyTapEvent *)xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Tap));
+   if (!e)
+     return;
+
+   e->win = xte->window;
+   e->time = xte->time;
+   e->subtype = xte->kind;
+   e->num_fingers = xte->num_finger;
+   e->cx = xte->cx;
+   e->cy = xte->cy;
+   e->tap_repeat = xte->tap_repeat;
+   e->interval = xte->interval;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAP, e, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_gesture_notify_tapnhold(XEvent *xevent)
+{
+   XGestureNotifyTapNHoldEvent *xthe;
+   Ecore_X_Event_Gesture_Notify_TapNHold *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xthe = (XGestureNotifyTapNHoldEvent *)xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_TapNHold));
+   if (!e)
+     return;
+
+   e->win = xthe->window;
+   e->time = xthe->time;
+   e->subtype = xthe->kind;
+   e->num_fingers = xthe->num_finger;
+   e->cx = xthe->cx;
+   e->cy = xthe->cy;
+   e->interval = xthe->interval;
+   e->hold_time = xthe->holdtime;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD, e, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_gesture_notify_hold(XEvent *xevent)
+{
+   XGestureNotifyHoldEvent *xhe;
+   Ecore_X_Event_Gesture_Notify_Hold *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xhe = (XGestureNotifyHoldEvent *)xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Hold));
+   if (!e)
+     return;
+
+   e->win = xhe->window;
+   e->time = xhe->time;
+   e->subtype = xhe->kind;
+   e->num_fingers = xhe->num_finger;
+   e->cx = xhe->cx;
+   e->cy = xhe->cy;
+   e->hold_time = xhe->holdtime;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_HOLD, e, NULL, NULL);
+}
+
+void
+_ecore_x_event_handle_gesture_notify_group(XEvent *xevent)
+{
+   XGestureNotifyGroupEvent *xge;
+   Ecore_X_Event_Gesture_Notify_Group *e;
+
+   _ecore_x_last_event_mouse_move = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   xge = (XGestureNotifyGroupEvent *)xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Group));
+   if (!e)
+     return;
+
+   e->win = xge->window;
+   e->time = xge->time;
+   e->subtype = xge->kind;
+   e->num_groups = xge->num_group;
+   e->group_id = xge->groupid;
+
+   ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_GROUP, e, NULL, NULL);
+}
+
+#endif /* ifdef ECORE_XGESTURE */
+#ifdef ECORE_XKB
+void
+_ecore_x_event_handle_xkb(XEvent *xevent)
+{
+   XkbEvent *xkbev;
+   Ecore_X_Event_Xkb *e;
+   
+   xkbev = (XkbEvent *) xevent;
+   e = calloc(1, sizeof(Ecore_X_Event_Xkb));
+   if (!e)
+     return;
+   e->group = xkbev->state.group;
+   if (xkbev->any.xkb_type == XkbStateNotify)
+     ecore_event_add(ECORE_X_EVENT_XKB_STATE_NOTIFY, e, NULL, NULL);
+   else if ((xkbev->any.xkb_type == XkbNewKeyboardNotify) ||
+            (xkbev->any.xkb_type == XkbMapNotify))
+     {
+        if (xkbev->any.xkb_type == XkbMapNotify)
+          {
+             XkbMapNotifyEvent *xkbmapping;
+
+             xkbmapping = (XkbMapNotifyEvent *)xkbev;
+             XkbRefreshKeyboardMapping(xkbmapping);
+          }
+        ecore_event_add(ECORE_X_EVENT_XKB_NEWKBD_NOTIFY, e, NULL, NULL);
+     }
+}
+#endif /* ifdef ECORE_XKB */
index d4645a7..da0a6c3 100644 (file)
@@ -1,6 +1,8 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
 
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
@@ -8,7 +10,7 @@
 static int _fixes_available;
 #ifdef ECORE_XFIXES
 static int _fixes_major, _fixes_minor;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 
 void
 _ecore_x_fixes_init(void)
@@ -17,71 +19,107 @@ _ecore_x_fixes_init(void)
    _fixes_major = 3;
    _fixes_minor = 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (XFixesQueryVersion(_ecore_x_disp, &_fixes_major, &_fixes_minor))
-     _fixes_available = 1;
+     {
+        _fixes_available = 1;
+
+        ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = ecore_event_type_new();
+     }
    else
      _fixes_available = 0;
-#else
+
+#else /* ifdef ECORE_XFIXES */
    _fixes_available = 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 #ifdef ECORE_XFIXES
 /* I don't know what to call this function. */
 static XRectangle *
-_ecore_x_rectangle_ecore_to_x(Ecore_X_Rectangle *rects, int num)
+_ecore_x_rectangle_ecore_to_x(Ecore_X_Rectangle *rects,
+                              int num)
 {
    XRectangle *xrect;
    int i;
 
-   if (num == 0) return NULL;
+   if (num == 0)
+     return NULL;
 
    xrect = malloc(sizeof(XRectangle) * num);
-   if (!xrect) return NULL;
+   if (!xrect)
+     return NULL;
+
    for (i = 0; i < num; i++)
      {
-       xrect[i].x = rects[i].x;
-       xrect[i].y = rects[i].y;
-       xrect[i].width = rects[i].width;
-       xrect[i].height = rects[i].height;
+        xrect[i].x = rects[i].x;
+        xrect[i].y = rects[i].y;
+        xrect[i].width = rects[i].width;
+        xrect[i].height = rects[i].height;
      }
    return xrect;
 }
 
 static Ecore_X_Rectangle *
-_ecore_x_rectangle_x_to_ecore(XRectangle *xrect, int num)
+_ecore_x_rectangle_x_to_ecore(XRectangle *xrect,
+                              int num)
 {
    Ecore_X_Rectangle *rects;
    int i;
 
-   if (num == 0) return NULL;
+   if (num == 0)
+     return NULL;
+
    rects = malloc(sizeof(Ecore_X_Rectangle) * num);
-   if (!rects) return NULL;
+   if (!rects)
+     return NULL;
+
    for (i = 0; i < num; i++)
      {
-       rects[i].x = xrect[i].x;
-       rects[i].y = xrect[i].y;
-       rects[i].width = xrect[i].width;
-       rects[i].height = xrect[i].height;
+        rects[i].x = xrect[i].x;
+        rects[i].y = xrect[i].y;
+        rects[i].width = xrect[i].width;
+        rects[i].height = xrect[i].height;
      }
    return rects;
 }
+
+#endif /* ifdef ECORE_XFIXES */
+
+EAPI Eina_Bool
+ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection)
+{
+#ifdef ECORE_XFIXES
+   if (_fixes_available)
+     {
+        XFixesSelectSelectionInput (_ecore_x_disp,
+                                    DefaultRootWindow(_ecore_x_disp),
+                                    selection,
+                                    XFixesSetSelectionOwnerNotifyMask |
+                                    XFixesSelectionWindowDestroyNotifyMask |
+                                    XFixesSelectionClientCloseNotifyMask);
+        return EINA_TRUE;
+     }
 #endif
+   return EINA_FALSE;
+}
 
 EAPI Ecore_X_Region
-ecore_x_region_new(Ecore_X_Rectangle *rects, int num)
+ecore_x_region_new(Ecore_X_Rectangle *rects,
+                   int num)
 {
 #ifdef ECORE_XFIXES
    Ecore_X_Region region;
    XRectangle *xrect;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xrect = _ecore_x_rectangle_ecore_to_x(rects, num);
    region = XFixesCreateRegion(_ecore_x_disp, xrect, num);
    free(xrect);
    return region;
-#else
+#else /* ifdef ECORE_XFIXES */
    return 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI Ecore_X_Region
@@ -90,24 +128,27 @@ ecore_x_region_new_from_bitmap(Ecore_X_Pixmap bitmap)
 #ifdef ECORE_XFIXES
    Ecore_X_Region region;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    region = XFixesCreateRegionFromBitmap(_ecore_x_disp, bitmap);
    return region;
-#else
+#else /* ifdef ECORE_XFIXES */
    return 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI Ecore_X_Region
-ecore_x_region_new_from_window(Ecore_X_Window win, Ecore_X_Region_Type type)
+ecore_x_region_new_from_window(Ecore_X_Window win,
+                               Ecore_X_Region_Type type)
 {
 #ifdef ECORE_XFIXES
    Ecore_X_Region region;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    region = XFixesCreateRegionFromWindow(_ecore_x_disp, win, type);
    return region;
-#else
+#else /* ifdef ECORE_XFIXES */
    return 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI Ecore_X_Region
@@ -116,11 +157,12 @@ ecore_x_region_new_from_gc(Ecore_X_GC gc)
 #ifdef ECORE_XFIXES
    Ecore_X_Region region;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    region = XFixesCreateRegionFromGC(_ecore_x_disp, gc);
    return region;
-#else
+#else /* ifdef ECORE_XFIXES */
    return 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI Ecore_X_Region
@@ -129,139 +171,195 @@ ecore_x_region_new_from_picture(Ecore_X_Picture picture)
 #ifdef ECORE_XFIXES
    Ecore_X_Region region;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    region = XFixesCreateRegionFromPicture(_ecore_x_disp, picture);
    return region;
-#else
+#else /* ifdef ECORE_XFIXES */
    return 0;
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_del(Ecore_X_Region region)
+ecore_x_region_free(Ecore_X_Region region)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesDestroyRegion(_ecore_x_disp, region);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_set(Ecore_X_Region region, Ecore_X_Rectangle *rects, int num)
+ecore_x_region_set(Ecore_X_Region region,
+                   Ecore_X_Rectangle *rects,
+                   int num)
 {
 #ifdef ECORE_XFIXES
    XRectangle *xrect = _ecore_x_rectangle_ecore_to_x(rects, num);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesSetRegion(_ecore_x_disp, region, xrect, num);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_copy(Ecore_X_Region dest, Ecore_X_Region source)
+ecore_x_region_copy(Ecore_X_Region dest,
+                    Ecore_X_Region source)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesCopyRegion(_ecore_x_disp, dest, source);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_combine(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2)
+ecore_x_region_combine(Ecore_X_Region dest,
+                       Ecore_X_Region source1,
+                       Ecore_X_Region source2)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesUnionRegion(_ecore_x_disp, dest, source1, source2);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_intersect(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2)
+ecore_x_region_intersect(Ecore_X_Region dest,
+                         Ecore_X_Region source1,
+                         Ecore_X_Region source2)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesIntersectRegion(_ecore_x_disp, dest, source1, source2);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_subtract(Ecore_X_Region dest, Ecore_X_Region source1, Ecore_X_Region source2)
+ecore_x_region_subtract(Ecore_X_Region dest,
+                        Ecore_X_Region source1,
+                        Ecore_X_Region source2)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesSubtractRegion(_ecore_x_disp, dest, source1, source2);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_invert(Ecore_X_Region dest, Ecore_X_Rectangle *bounds, Ecore_X_Region source)
+ecore_x_region_invert(Ecore_X_Region dest,
+                      Ecore_X_Rectangle *bounds,
+                      Ecore_X_Region source)
 {
 #ifdef ECORE_XFIXES
    XRectangle *xbound;
    int num = 0;
 
-   while(bounds + num) num++;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   while (bounds + num)
+     num++;
    xbound = _ecore_x_rectangle_ecore_to_x(bounds, num);
 
    XFixesInvertRegion(_ecore_x_disp, dest, xbound, source);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_translate(Ecore_X_Region region, int dx, int dy)
+ecore_x_region_translate(Ecore_X_Region region,
+                         int dx,
+                         int dy)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesTranslateRegion(_ecore_x_disp, region, dx, dy);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_extents(Ecore_X_Region dest, Ecore_X_Region source)
+ecore_x_region_extents(Ecore_X_Region dest,
+                       Ecore_X_Region source)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesRegionExtents(_ecore_x_disp, dest, source);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI Ecore_X_Rectangle *
-ecore_x_region_fetch(Ecore_X_Region region, int *num, Ecore_X_Rectangle *bounds){
+ecore_x_region_fetch(Ecore_X_Region region,
+                     int *num,
+                     Ecore_X_Rectangle *bounds){
 #ifdef ECORE_XFIXES
-     Ecore_X_Rectangle *rects;
-     XRectangle *xrect, xbound;
-
-     xrect = XFixesFetchRegionAndBounds(_ecore_x_disp, region, num, &xbound);
-     rects = _ecore_x_rectangle_x_to_ecore(xrect, *num);
-     (*bounds).x = xbound.x;
-     (*bounds).y = xbound.y;
-     (*bounds).width = xbound.width;
-     (*bounds).height = xbound.height;
-     return rects;
-#else
-     return NULL;
-#endif
+   Ecore_X_Rectangle *rects;
+   XRectangle *xrect, xbound;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xrect = XFixesFetchRegionAndBounds(_ecore_x_disp, region, num, &xbound);
+   rects = _ecore_x_rectangle_x_to_ecore(xrect, *num);
+   (*bounds).x = xbound.x;
+   (*bounds).y = xbound.y;
+   (*bounds).width = xbound.width;
+   (*bounds).height = xbound.height;
+   return rects;
+#else /* ifdef ECORE_XFIXES */
+   return NULL;
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_expand(Ecore_X_Region dest, Ecore_X_Region source, unsigned int left, unsigned int right, unsigned int top, unsigned int bottom)
+ecore_x_region_expand(Ecore_X_Region dest,
+                      Ecore_X_Region source,
+                      unsigned int left,
+                      unsigned int right,
+                      unsigned int top,
+                      unsigned int bottom)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesExpandRegion(_ecore_x_disp, dest, source, left, right, top, bottom);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_gc_clip_set(Ecore_X_Region region, Ecore_X_GC gc, int x_origin, int y_origin)
+ecore_x_region_gc_clip_set(Ecore_X_Region region,
+                           Ecore_X_GC gc,
+                           int x_origin,
+                           int y_origin)
 {
 #ifdef ECORE_XFIXES
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFixesSetGCClipRegion(_ecore_x_disp, gc, x_origin, y_origin, region);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_window_shape_set(Ecore_X_Region region, Ecore_X_Window win, Ecore_X_Shape_Type type, int x_offset, int y_offset)
+ecore_x_region_window_shape_set(Ecore_X_Region region,
+                                Ecore_X_Window win,
+                                Ecore_X_Shape_Type type,
+                                int x_offset,
+                                int y_offset)
 {
 #ifdef ECORE_XFIXES
-   XFixesSetWindowShapeRegion(_ecore_x_disp, win, type, x_offset, y_offset, region);
-#endif
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XFixesSetWindowShapeRegion(_ecore_x_disp,
+                              win,
+                              type,
+                              x_offset,
+                              y_offset,
+                              region);
+#endif /* ifdef ECORE_XFIXES */
 }
 
 EAPI void
-ecore_x_region_picture_clip_set(Ecore_X_Region region, Ecore_X_Picture picture, int x_origin, int y_origin)
+ecore_x_region_picture_clip_set(Ecore_X_Region region,
+                                Ecore_X_Picture picture,
+                                int x_origin,
+                                int y_origin)
 {
 #ifdef ECORE_XFIXES
-   XFixesSetPictureClipRegion(_ecore_x_disp, picture, x_origin, y_origin, region);
-#endif
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XFixesSetPictureClipRegion(_ecore_x_disp,
+                              picture,
+                              x_origin,
+                              y_origin,
+                              region);
+#endif /* ifdef ECORE_XFIXES */
 }
 
index 56224f0..5396366 100644 (file)
@@ -1,3 +1,9 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <string.h>
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
  * drawable.
  * @param  draw Drawable to create graphics context with.  If @c 0 is
  *              given instead, the default root window is used.
+ * @param value_mask Bitmask values.
+ * @param value_list List of values. The order of values must be the
+ *                   same than the corresponding bitmaks.
  * @return The new default graphics context.
  */
 EAPI Ecore_X_GC
-ecore_x_gc_new(Ecore_X_Drawable draw)
+ecore_x_gc_new(Ecore_X_Drawable draw,
+               Ecore_X_GC_Value_Mask value_mask,
+               const unsigned int *value_list)
 {
-   XGCValues           gcv;
+   XGCValues gcv;
+   int mask;
+   int idx;
+   int i;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!draw)
+     draw = DefaultRootWindow(_ecore_x_disp);
+
+   memset(&gcv, 0, sizeof (gcv));
+
+   for (i = 0, idx = 0, mask = 1; i <= 22; i++, mask <<= 1)
+     {
+        switch (mask & value_mask)
+          {
+           case ECORE_X_GC_VALUE_MASK_FUNCTION:
+             gcv.function = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_PLANE_MASK:
+             gcv.plane_mask = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FOREGROUND:
+             gcv.foreground = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_BACKGROUND:
+             gcv.background = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_LINE_WIDTH:
+             gcv.line_width = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_LINE_STYLE:
+             gcv.line_style = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CAP_STYLE:
+             gcv.cap_style = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_JOIN_STYLE:
+             gcv.join_style = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FILL_STYLE:
+             gcv.fill_style = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FILL_RULE:
+             gcv.fill_rule = value_list[idx];
+             idx++;
+             break;
 
-   if (!draw) draw = DefaultRootWindow(_ecore_x_disp);   
-   return XCreateGC(_ecore_x_disp, draw, 0, &gcv);   
+           case ECORE_X_GC_VALUE_MASK_TILE:
+             gcv.tile = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_STIPPLE:
+             gcv.stipple = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X:
+             gcv.ts_x_origin = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y:
+             gcv.ts_y_origin = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_FONT:
+             gcv.font = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE:
+             gcv.subwindow_mode = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES:
+             gcv.graphics_exposures = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X:
+             gcv.clip_x_origin = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y:
+             gcv.clip_y_origin = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_CLIP_MASK:
+             gcv.clip_mask = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_DASH_OFFSET:
+             gcv.dash_offset = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_DASH_LIST:
+             gcv.dashes = value_list[idx];
+             idx++;
+             break;
+
+           case ECORE_X_GC_VALUE_MASK_ARC_MODE:
+             gcv.arc_mode = value_list[idx];
+             idx++;
+             break;
+          }
+     }
+
+   return XCreateGC(_ecore_x_disp, draw, value_mask, &gcv);
 }
 
 /**
@@ -23,7 +163,9 @@ ecore_x_gc_new(Ecore_X_Drawable draw)
  * @param gc The given graphics context.
  */
 EAPI void
-ecore_x_gc_del(Ecore_X_GC gc)
+ecore_x_gc_free(Ecore_X_GC gc)
 {
-   XFreeGC(_ecore_x_disp, gc);   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XFreeGC(_ecore_x_disp, gc);
 }
+
diff --git a/src/lib/ecore_x/xlib/ecore_x_gesture.c b/src/lib/ecore_x/xlib/ecore_x_gesture.c
new file mode 100644 (file)
index 0000000..3c390a9
--- /dev/null
@@ -0,0 +1,137 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include "ecore_x_private.h"
+
+static Eina_Bool _gesture_available = EINA_FALSE;
+
+#ifdef ECORE_XGESTURE
+static int _gesture_major, _gesture_minor, _gesture_patch;
+int _gesture_version;
+#endif /* ifdef ECORE_XGESTURE */
+
+void
+_ecore_x_gesture_init(void)
+{
+#ifdef ECORE_XGESTURE
+   _gesture_major = 0;
+   _gesture_minor = 0;
+   _gesture_patch = 0;
+   _gesture_version = 0;
+
+   if (XGestureQueryVersion(_ecore_x_disp, &_gesture_major, &_gesture_minor, &_gesture_patch))
+     {
+        _gesture_version = (_gesture_major << 16) | _gesture_minor;
+        _gesture_available = EINA_TRUE;
+     }
+   else
+     _gesture_available = EINA_FALSE;
+#else /* ifdef ECORE_XGESTURE */
+   _gesture_available = EINA_FALSE;
+#endif /* ifdef ECORE_XGESTURE */
+}
+
+/*
+ * @brief Query whether gesture is available or not.
+ *
+ * @return @c EINA_TRUE, if extension is available, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_gesture_supported(void)
+{
+   return _gesture_available;
+}
+
+EAPI Eina_Bool
+ecore_x_gesture_events_select(Ecore_X_Window win,
+                              Ecore_X_Gesture_Event_Mask mask)
+{
+#ifdef ECORE_XGESTURE
+   if (!_gesture_available)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XGestureSelectEvents(_ecore_x_disp, win, mask);
+
+   return EINA_TRUE;
+#else /* ifdef ECORE_XGESTURE */
+   return EINA_FALSE;
+   win = 0;
+   mask = 0;
+#endif /* ifdef ECORE_XGESTURE */
+}
+
+EAPI Ecore_X_Gesture_Event_Mask
+ecore_x_gesture_events_selected_get(Ecore_X_Window win)
+{
+#ifdef ECORE_XGESTURE
+   Ecore_X_Gesture_Event_Mask mask;
+
+   if (!_gesture_available)
+     return ECORE_X_GESTURE_EVENT_MASK_NONE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (GestureSuccess != XGestureGetSelectedEvents(_ecore_x_disp, win, &mask))
+     {
+        mask = ECORE_X_GESTURE_EVENT_MASK_NONE;
+        return mask;
+     }
+
+   return mask;
+#else /* ifdef ECORE_XGESTURE */
+   return ECORE_X_GESTURE_EVENT_MASK_NONE;
+   win = 0;
+#endif /* ifdef ECORE_XGESTURE */
+}
+
+EAPI Eina_Bool
+ecore_x_gesture_event_grab(Ecore_X_Window win,
+                           Ecore_X_Gesture_Event_Type type,
+                           int num_fingers)
+{
+#ifdef ECORE_XGESTURE
+   if (!_gesture_available)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (GestureGrabSuccess != XGestureGrabEvent(_ecore_x_disp, win, type, num_fingers, CurrentTime))
+     {
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+#else /* ifdef ECORE_XGESTURE */
+   return EINA_FALSE;
+   win = 0;
+   type = 0;
+   num_fingers = 0;
+#endif /* ifdef ECORE_XGESTURE */
+}
+
+EAPI Eina_Bool
+ecore_x_gesture_event_ungrab(Ecore_X_Window win,
+                             Ecore_X_Gesture_Event_Type type,
+                             int num_fingers)
+{
+#ifdef ECORE_XGESTURE
+   Ecore_X_Gesture_Event_Mask mask;
+
+   if (!_gesture_available)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (GestureUngrabSuccess != XGestureUngrabEvent(_ecore_x_disp, win, type, num_fingers, CurrentTime))
+     {
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+#else /* ifdef ECORE_XGESTURE */
+   return EINA_FALSE;
+   win = 0;
+   type = 0;
+   num_fingers = 0;
+#endif /* ifdef ECORE_XGESTURE */
+}
+
index 399ca92..8d6ea1f 100644 (file)
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-/*
  * Various ICCCM related functions.
- * 
+ *
  * This is ALL the code involving anything ICCCM related. for both WM and
  * client.
  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <string.h>
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include "Ecore_X_Atoms.h"
 
-
 EAPI void
 ecore_x_icccm_init(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 }
 
 EAPI void
-ecore_x_icccm_state_set(Ecore_X_Window win, Ecore_X_Window_State_Hint state)
+ecore_x_icccm_state_set(Ecore_X_Window win,
+                        Ecore_X_Window_State_Hint state)
 {
-   unsigned long       c[2];
+   unsigned long c[2];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
-      c[0] = WithdrawnState;
+     c[0] = WithdrawnState;
    else if (state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
-      c[0] = NormalState;
+     c[0] = NormalState;
    else if (state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
-      c[0] = IconicState;
+     c[0] = IconicState;
+
    c[1] = None;
    XChangeProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_STATE,
-                  ECORE_X_ATOM_WM_STATE, 32, PropModeReplace,
-                  (unsigned char *)c, 2);
+                   ECORE_X_ATOM_WM_STATE, 32, PropModeReplace,
+                   (unsigned char *)c, 2);
 }
 
 EAPI Ecore_X_Window_State_Hint
 ecore_x_icccm_state_get(Ecore_X_Window win)
 {
    unsigned char *prop_ret = NULL;
-   Atom           type_ret;
-   unsigned long  bytes_after, num_ret;
-   int            format_ret;
+   Atom type_ret;
+   unsigned long bytes_after, num_ret;
+   int format_ret;
    Ecore_X_Window_State_Hint hint;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    hint = ECORE_X_WINDOW_STATE_HINT_NONE;
    XGetWindowProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_STATE,
-                     0, 0x7fffffff, False, ECORE_X_ATOM_WM_STATE,
-                     &type_ret, &format_ret, &num_ret, &bytes_after,
-                     &prop_ret);
+                      0, 0x7fffffff, False, ECORE_X_ATOM_WM_STATE,
+                      &type_ret, &format_ret, &num_ret, &bytes_after,
+                      &prop_ret);
    if ((prop_ret) && (num_ret == 2))
      {
-       if (prop_ret[0] == WithdrawnState)
-         hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
-       else if (prop_ret[0] == NormalState)
-         hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
-       else if (prop_ret[0] == IconicState)
-         hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
+        if (prop_ret[0] == WithdrawnState)
+          hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
+        else if (prop_ret[0] == NormalState)
+          hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+        else if (prop_ret[0] == IconicState)
+          hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
      }
 
    if (prop_ret)
      XFree(prop_ret);
-   
+
    return hint;
 }
 
 EAPI void
-ecore_x_icccm_delete_window_send(Ecore_X_Window win, Ecore_X_Time t)
+ecore_x_icccm_delete_window_send(Ecore_X_Window win,
+                                 Ecore_X_Time t)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
-                                ECORE_X_EVENT_MASK_NONE,
-                                ECORE_X_ATOM_WM_DELETE_WINDOW,
-                                t, 0, 0, 0);
+                                 ECORE_X_EVENT_MASK_NONE,
+                                 ECORE_X_ATOM_WM_DELETE_WINDOW,
+                                 t, 0, 0, 0);
 }
 
 EAPI void
-ecore_x_icccm_take_focus_send(Ecore_X_Window win, Ecore_X_Time t)
+ecore_x_icccm_take_focus_send(Ecore_X_Window win,
+                              Ecore_X_Time t)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
-                                ECORE_X_EVENT_MASK_NONE,
-                                ECORE_X_ATOM_WM_TAKE_FOCUS,
-                                t, 0, 0, 0);
+                                 ECORE_X_EVENT_MASK_NONE,
+                                 ECORE_X_ATOM_WM_TAKE_FOCUS,
+                                 t, 0, 0, 0);
 }
 
 EAPI void
-ecore_x_icccm_save_yourself_send(Ecore_X_Window win, Ecore_X_Time t)
+ecore_x_icccm_save_yourself_send(Ecore_X_Window win,
+                                 Ecore_X_Time t)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
-                                ECORE_X_EVENT_MASK_NONE,
-                                ECORE_X_ATOM_WM_SAVE_YOURSELF,
-                                t, 0, 0, 0);
+                                 ECORE_X_EVENT_MASK_NONE,
+                                 ECORE_X_ATOM_WM_SAVE_YOURSELF,
+                                 t, 0, 0, 0);
 }
 
 EAPI void
-ecore_x_icccm_move_resize_send(Ecore_X_Window win, int x, int y, int w, int h)
+ecore_x_icccm_move_resize_send(Ecore_X_Window win,
+                               int x,
+                               int y,
+                               int w,
+                               int h)
 {
-   XEvent              ev;
+   XEvent ev;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ev.type = ConfigureNotify;
    ev.xconfigure.display = _ecore_x_disp;
    ev.xconfigure.event = win;
@@ -113,377 +133,443 @@ ecore_x_icccm_move_resize_send(Ecore_X_Window win, int x, int y, int w, int h)
 
 EAPI void
 ecore_x_icccm_hints_set(Ecore_X_Window win,
-                       int accepts_focus,
-                       Ecore_X_Window_State_Hint initial_state,
-                       Ecore_X_Pixmap icon_pixmap,
-                       Ecore_X_Pixmap icon_mask,
-                       Ecore_X_Window icon_window,
-                       Ecore_X_Window window_group, int is_urgent)
+                        Eina_Bool accepts_focus,
+                        Ecore_X_Window_State_Hint initial_state,
+                        Ecore_X_Pixmap icon_pixmap,
+                        Ecore_X_Pixmap icon_mask,
+                        Ecore_X_Window icon_window,
+                        Ecore_X_Window window_group,
+                        Eina_Bool is_urgent)
 {
-   XWMHints           *hints;
+   XWMHints *hints;
 
    hints = XAllocWMHints();
    if (!hints)
-      return;
+     return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    hints->flags = InputHint | StateHint;
    hints->input = accepts_focus;
    if (initial_state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
-      hints->initial_state = WithdrawnState;
+     hints->initial_state = WithdrawnState;
    else if (initial_state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
-      hints->initial_state = NormalState;
+     hints->initial_state = NormalState;
    else if (initial_state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
-      hints->initial_state = IconicState;
+     hints->initial_state = IconicState;
+
    if (icon_pixmap != 0)
      {
-       hints->icon_pixmap = icon_pixmap;
-       hints->flags |= IconPixmapHint;
+        hints->icon_pixmap = icon_pixmap;
+        hints->flags |= IconPixmapHint;
      }
+
    if (icon_mask != 0)
      {
-       hints->icon_mask = icon_mask;
-       hints->flags |= IconMaskHint;
+        hints->icon_mask = icon_mask;
+        hints->flags |= IconMaskHint;
      }
+
    if (icon_window != 0)
      {
-       hints->icon_window = icon_window;
-       hints->flags |= IconWindowHint;
+        hints->icon_window = icon_window;
+        hints->flags |= IconWindowHint;
      }
+
    if (window_group != 0)
      {
-       hints->window_group = window_group;
-       hints->flags |= WindowGroupHint;
+        hints->window_group = window_group;
+        hints->flags |= WindowGroupHint;
      }
+
    if (is_urgent)
-      hints->flags |= XUrgencyHint;
+     hints->flags |= XUrgencyHint;
+
    XSetWMHints(_ecore_x_disp, win, hints);
    XFree(hints);
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_icccm_hints_get(Ecore_X_Window win,
-                       int *accepts_focus,
-                       Ecore_X_Window_State_Hint *initial_state,
-                       Ecore_X_Pixmap *icon_pixmap,
-                       Ecore_X_Pixmap *icon_mask,
-                       Ecore_X_Window *icon_window,
-                       Ecore_X_Window *window_group, int *is_urgent)
+                        Eina_Bool *accepts_focus,
+                        Ecore_X_Window_State_Hint *initial_state,
+                        Ecore_X_Pixmap *icon_pixmap,
+                        Ecore_X_Pixmap *icon_mask,
+                        Ecore_X_Window *icon_window,
+                        Ecore_X_Window *window_group,
+                        Eina_Bool *is_urgent)
 {
    XWMHints *hints;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (accepts_focus)
-      *accepts_focus = 1;
+     *accepts_focus = EINA_TRUE;
+
    if (initial_state)
-      *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+     *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+
    if (icon_pixmap)
-      *icon_pixmap = 0;
+     *icon_pixmap = 0;
+
    if (icon_mask)
-      *icon_mask = 0;
+     *icon_mask = 0;
+
    if (icon_window)
-      *icon_window = 0;
+     *icon_window = 0;
+
    if (window_group)
-      *window_group = 0;
+     *window_group = 0;
+
    if (is_urgent)
-      *is_urgent = 0;
+     *is_urgent = EINA_FALSE;
+
    hints = XGetWMHints(_ecore_x_disp, win);
    if (hints)
      {
-       if ((hints->flags & InputHint) && (accepts_focus))
-         {
-            if (hints->input)
-               *accepts_focus = 1;
-            else
-               *accepts_focus = 0;
-         }
-       if ((hints->flags & StateHint) && (initial_state))
-         {
-            if (hints->initial_state == WithdrawnState)
-               *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
-            else if (hints->initial_state == NormalState)
-               *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
-            else if (hints->initial_state == IconicState)
-               *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
-         }
-       if ((hints->flags & IconPixmapHint) && (icon_pixmap))
-         {
-            *icon_pixmap = hints->icon_pixmap;
-         }
-       if ((hints->flags & IconMaskHint) && (icon_mask))
-         {
-            *icon_mask = hints->icon_mask;
-         }
-       if ((hints->flags & IconWindowHint) && (icon_window))
-         {
-            *icon_window = hints->icon_window;
-         }
-       if ((hints->flags & WindowGroupHint) && (window_group))
-         {
-            *window_group = hints->window_group;
-         }
-       if ((hints->flags & XUrgencyHint) && (is_urgent))
-         {
-            *is_urgent = 1;
-         }
-       XFree(hints);
-       return 1;
+        if ((hints->flags & InputHint) && (accepts_focus))
+          {
+             if (hints->input)
+               *accepts_focus = EINA_TRUE;
+             else
+               *accepts_focus = EINA_FALSE;
+          }
+
+        if ((hints->flags & StateHint) && (initial_state))
+          {
+             if (hints->initial_state == WithdrawnState)
+               *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
+             else if (hints->initial_state == NormalState)
+               *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
+             else if (hints->initial_state == IconicState)
+               *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
+          }
+
+        if ((hints->flags & IconPixmapHint) && (icon_pixmap))
+          *icon_pixmap = hints->icon_pixmap;
+
+        if ((hints->flags & IconMaskHint) && (icon_mask))
+          *icon_mask = hints->icon_mask;
+
+        if ((hints->flags & IconWindowHint) && (icon_window))
+          *icon_window = hints->icon_window;
+
+        if ((hints->flags & WindowGroupHint) && (window_group))
+          *window_group = hints->window_group;
+
+        if ((hints->flags & XUrgencyHint) && (is_urgent))
+          *is_urgent = EINA_TRUE;
+
+        XFree(hints);
+        return EINA_TRUE;
      }
-   return 0;
+
+   return EINA_FALSE;
 }
 
 EAPI void
 ecore_x_icccm_size_pos_hints_set(Ecore_X_Window win,
-                                int request_pos,
-                                Ecore_X_Gravity gravity,
-                                int min_w, int min_h,
-                                int max_w, int max_h,
-                                int base_w, int base_h,
-                                int step_x, int step_y,
-                                double min_aspect, double max_aspect)
+                                 Eina_Bool request_pos,
+                                 Ecore_X_Gravity gravity,
+                                 int min_w,
+                                 int min_h,
+                                 int max_w,
+                                 int max_h,
+                                 int base_w,
+                                 int base_h,
+                                 int step_x,
+                                 int step_y,
+                                 double min_aspect,
+                                 double max_aspect)
 {
-   XSizeHints  hint;
-   long        mask;
+   XSizeHints hint;
+   long mask;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XGetWMNormalHints(_ecore_x_disp, win, &hint, &mask))
-     {
-       memset(&hint, 0, sizeof(XSizeHints));
-     }
+     memset(&hint, 0, sizeof(XSizeHints));
 
    hint.flags = 0;
    if (request_pos)
-     {
-       hint.flags |= USPosition;
-     }
+     hint.flags |= USPosition;
+
    if (gravity != ECORE_X_GRAVITY_NW)
      {
-       hint.flags |= PWinGravity;
-       hint.win_gravity = gravity;
+        hint.flags |= PWinGravity;
+        hint.win_gravity = gravity;
      }
+
    if ((min_w > 0) || (min_h > 0))
      {
-       hint.flags |= PMinSize;
-       hint.min_width = min_w;
-       hint.min_height = min_h;
+        hint.flags |= PMinSize;
+        hint.min_width = min_w;
+        hint.min_height = min_h;
      }
+
    if ((max_w > 0) || (max_h > 0))
      {
-       hint.flags |= PMaxSize;
-       hint.max_width = max_w;
-       hint.max_height = max_h;
+        hint.flags |= PMaxSize;
+        hint.max_width = max_w;
+        hint.max_height = max_h;
      }
+
    if ((base_w > 0) || (base_h > 0))
      {
-       hint.flags |= PBaseSize;
-       hint.base_width = base_w;
-       hint.base_height = base_h;
+        hint.flags |= PBaseSize;
+        hint.base_width = base_w;
+        hint.base_height = base_h;
      }
+
    if ((step_x > 1) || (step_y > 1))
      {
-       hint.flags |= PResizeInc;
-       hint.width_inc = step_x;
-       hint.height_inc = step_y;
+        hint.flags |= PResizeInc;
+        hint.width_inc = step_x;
+        hint.height_inc = step_y;
      }
+
    if ((min_aspect > 0.0) || (max_aspect > 0.0))
      {
-       hint.flags |= PAspect;
-       hint.min_aspect.x = min_aspect * 10000;
-       hint.min_aspect.y = 10000;
-       hint.max_aspect.x = max_aspect * 10000;
-       hint.max_aspect.y = 10000;
+        hint.flags |= PAspect;
+        hint.min_aspect.x = min_aspect * 10000;
+        hint.min_aspect.y = 10000;
+        hint.max_aspect.x = max_aspect * 10000;
+        hint.max_aspect.y = 10000;
      }
+
    XSetWMNormalHints(_ecore_x_disp, win, &hint);
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_icccm_size_pos_hints_get(Ecore_X_Window win,
-                                int *request_pos,
-                                Ecore_X_Gravity *gravity,
-                                int *min_w, int *min_h,
-                                int *max_w, int *max_h,
-                                int *base_w, int *base_h,
-                                int *step_x, int *step_y,
-                                double *min_aspect, double *max_aspect)
+                                 Eina_Bool *request_pos,
+                                 Ecore_X_Gravity *gravity,
+                                 int *min_w,
+                                 int *min_h,
+                                 int *max_w,
+                                 int *max_h,
+                                 int *base_w,
+                                 int *base_h,
+                                 int *step_x,
+                                 int *step_y,
+                                 double *min_aspect,
+                                 double *max_aspect)
 {
-   XSizeHints          hint;
-   long                mask;
+   XSizeHints hint;
+   long mask;
 
-   int                 minw = 0, minh = 0;
-   int                 maxw = 32767, maxh = 32767;
-   int                 basew = -1, baseh = -1;
-   int                 stepx = -1, stepy = -1;
-   double              mina = 0.0, maxa = 0.0;
+   int minw = 0, minh = 0;
+   int maxw = 32767, maxh = 32767;
+   int basew = -1, baseh = -1;
+   int stepx = -1, stepy = -1;
+   double mina = 0.0, maxa = 0.0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XGetWMNormalHints(_ecore_x_disp, win, &hint, &mask))
-     return 0;
+     return EINA_FALSE;
 
    if ((hint.flags & USPosition) || ((hint.flags & PPosition)))
      {
-       if (request_pos)
-          *request_pos = 1;
-     }
-   else
-     {
-       if (request_pos)
-          *request_pos = 0;
+        if (request_pos)
+          *request_pos = EINA_TRUE;
      }
+   else if (request_pos)
+     *request_pos = EINA_FALSE;
+
    if (hint.flags & PWinGravity)
      {
-       if (gravity)
-          *gravity = hint.win_gravity;
-     }
-   else
-     {
-       if (gravity)
-          *gravity = ECORE_X_GRAVITY_NW;
+        if (gravity)
+          *gravity = hint.win_gravity;
      }
+   else if (gravity)
+     *gravity = ECORE_X_GRAVITY_NW;
+
    if (hint.flags & PMinSize)
      {
-       minw = hint.min_width;
-       minh = hint.min_height;
+        minw = hint.min_width;
+        minh = hint.min_height;
      }
+
    if (hint.flags & PMaxSize)
      {
-       maxw = hint.max_width;
-       maxh = hint.max_height;
-       if (maxw < minw)
-          maxw = minw;
-       if (maxh < minh)
-          maxh = minh;
+        maxw = hint.max_width;
+        maxh = hint.max_height;
+        if (maxw < minw)
+          maxw = minw;
+
+        if (maxh < minh)
+          maxh = minh;
      }
+
    if (hint.flags & PBaseSize)
      {
-       basew = hint.base_width;
-       baseh = hint.base_height;
-       if (basew > minw)
-          minw = basew;
-       if (baseh > minh)
-          minh = baseh;
+        basew = hint.base_width;
+        baseh = hint.base_height;
+        if (basew > minw)
+          minw = basew;
+
+        if (baseh > minh)
+          minh = baseh;
      }
+
    if (hint.flags & PResizeInc)
      {
-       stepx = hint.width_inc;
-       stepy = hint.height_inc;
-       if (stepx < 1)
-          stepx = 1;
-       if (stepy < 1)
-          stepy = 1;
+        stepx = hint.width_inc;
+        stepy = hint.height_inc;
+        if (stepx < 1)
+          stepx = 1;
+
+        if (stepy < 1)
+          stepy = 1;
      }
+
    if (hint.flags & PAspect)
      {
-       if (hint.min_aspect.y > 0)
-          mina = ((double)hint.min_aspect.x) / ((double)hint.min_aspect.y);
-       if (hint.max_aspect.y > 0)
-          maxa = ((double)hint.max_aspect.x) / ((double)hint.max_aspect.y);
+        if (hint.min_aspect.y > 0)
+          mina = ((double)hint.min_aspect.x) / ((double)hint.min_aspect.y);
+
+        if (hint.max_aspect.y > 0)
+          maxa = ((double)hint.max_aspect.x) / ((double)hint.max_aspect.y);
      }
+
    if (min_w)
-      *min_w = minw;
+     *min_w = minw;
+
    if (min_h)
-      *min_h = minh;
+     *min_h = minh;
+
    if (max_w)
-      *max_w = maxw;
+     *max_w = maxw;
+
    if (max_h)
-      *max_h = maxh;
+     *max_h = maxh;
+
    if (base_w)
-      *base_w = basew;
+     *base_w = basew;
+
    if (base_h)
-      *base_h = baseh;
+     *base_h = baseh;
+
    if (step_x)
-      *step_x = stepx;
+     *step_x = stepx;
+
    if (step_y)
-      *step_y = stepy;
+     *step_y = stepy;
+
    if (min_aspect)
-      *min_aspect = mina;
+     *min_aspect = mina;
+
    if (max_aspect)
-      *max_aspect = maxa;
-   return 1;
+     *max_aspect = maxa;
+
+   return EINA_TRUE;
 }
 
 EAPI void
-ecore_x_icccm_title_set(Ecore_X_Window win, const char *t)
+ecore_x_icccm_title_set(Ecore_X_Window win,
+                        const char *t)
 {
-   char               *list[1];
-   XTextProperty       xprop;
-   int                 ret;
+   char *list[1];
+   XTextProperty xprop;
+   int ret;
+
+   if (!t)
+     return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xprop.value = NULL;
 #ifdef X_HAVE_UTF8_STRING
    list[0] = strdup(t);
    ret =
-      Xutf8TextListToTextProperty(_ecore_x_disp, list, 1, XUTF8StringStyle,
-                                 &xprop);
-#else
+     Xutf8TextListToTextProperty(_ecore_x_disp, list, 1, XUTF8StringStyle,
+                                 &xprop);
+#else /* ifdef X_HAVE_UTF8_STRING */
    list[0] = strdup(t);
    ret =
-      XmbTextListToTextProperty(_ecore_x_disp, list, 1, XStdICCTextStyle,
-                               &xprop);
-#endif
+     XmbTextListToTextProperty(_ecore_x_disp, list, 1, XStdICCTextStyle,
+                               &xprop);
+#endif /* ifdef X_HAVE_UTF8_STRING */
    if (ret >= Success)
      {
-       XSetWMName(_ecore_x_disp, win, &xprop);
-       if (xprop.value) XFree(xprop.value);
+        XSetWMName(_ecore_x_disp, win, &xprop);
+        if (xprop.value)
+          XFree(xprop.value);
      }
-   else
+   else if (XStringListToTextProperty(list, 1, &xprop) >= Success)
      {
-       if (XStringListToTextProperty(list, 1, &xprop) >= Success)
-         {
-            XSetWMName(_ecore_x_disp, win, &xprop);
-            if (xprop.value) XFree(xprop.value);
-         }
+        XSetWMName(_ecore_x_disp, win, &xprop);
+        if (xprop.value)
+          XFree(xprop.value);
      }
+
    free(list[0]);
 }
 
-EAPI char               *
+EAPI char *
 ecore_x_icccm_title_get(Ecore_X_Window win)
 {
-   XTextProperty       xprop;
+   XTextProperty xprop;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xprop.value = NULL;
    if (XGetWMName(_ecore_x_disp, win, &xprop) >= Success)
      {
-       if (xprop.value)
-         {
-            char              **list = NULL;
-            char               *t = NULL;
-            int                 num = 0;
-            int                 ret;
-
-            if (xprop.encoding == ECORE_X_ATOM_UTF8_STRING)
-              {
-                 t = strdup((char *)xprop.value);
-              }
-            else
-              {
-
-                 /* convert to utf8 */
+        if (xprop.value)
+          {
+             char **list = NULL;
+             char *t = NULL;
+             int num = 0;
+             int ret;
+
+             if (xprop.encoding == ECORE_X_ATOM_UTF8_STRING)
+               t = strdup((char *)xprop.value);
+             else
+               {
+                  /* convert to utf8 */
 #ifdef X_HAVE_UTF8_STRING
-                 ret = Xutf8TextPropertyToTextList(_ecore_x_disp, &xprop,
-                                                   &list, &num);
-#else
-                 ret = XmbTextPropertyToTextList(_ecore_x_disp, &xprop,
-                                                 &list, &num);
-#endif
-
-                 if ((ret == XLocaleNotSupported) ||
-                     (ret == XNoMemory) || (ret == XConverterNotFound))
-                   {
-                      t = strdup((char *)xprop.value);
-                   }
-                 else if ((ret >= Success) && (num > 0))
-                   {
-                      t = strdup(list[0]);
-                   }
-                 if (list)
-                   XFreeStringList(list);
-              }
-            
-            if (xprop.value) XFree(xprop.value);
-            return t;
-         }
+                  ret = Xutf8TextPropertyToTextList(_ecore_x_disp, &xprop,
+                                                    &list, &num);
+#else /* ifdef X_HAVE_UTF8_STRING */
+                  ret = XmbTextPropertyToTextList(_ecore_x_disp, &xprop,
+                                                  &list, &num);
+#endif /* ifdef X_HAVE_UTF8_STRING */
+
+                  if ((ret == XLocaleNotSupported) ||
+                      (ret == XNoMemory) || (ret == XConverterNotFound))
+                    t = strdup((char *)xprop.value);
+                  else if ((ret >= Success) && (num > 0))
+                    t = strdup(list[0]);
+
+                  if (list)
+                    XFreeStringList(list);
+               }
+
+             if (xprop.value)
+               XFree(xprop.value);
+
+             return t;
+          }
      }
+
    return NULL;
 }
 
 /**
+ * Set protocol atoms explicitly
+ * @param win The Window
+ * @param protos An array of protocol atoms
+ * @param num the number of members of the array
+ */
+EAPI void
+ecore_x_icccm_protocol_atoms_set(Ecore_X_Window win,
+                                 Ecore_X_Atom *protos,
+                                 int num)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (num > 0)
+     XSetWMProtocols(_ecore_x_disp, win, (Atom *)(protos), num);
+   else
+     XDeleteProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_PROTOCOLS);
+}
+
+/**
  * Set or unset a wm protocol property.
  * @param win The Window
  * @param protocol The protocol to enable/disable
@@ -491,77 +577,82 @@ ecore_x_icccm_title_get(Ecore_X_Window win)
  */
 EAPI void
 ecore_x_icccm_protocol_set(Ecore_X_Window win,
-                          Ecore_X_WM_Protocol protocol, int on)
+                           Ecore_X_WM_Protocol protocol,
+                           Eina_Bool on)
 {
-   Atom               *protos = NULL;
-   Atom                proto;
-   int                 protos_count = 0;
-   int                 already_set = 0;
-   int                 i;
+   Atom *protos = NULL;
+   Atom proto;
+   int protos_count = 0;
+   int already_set = 0;
+   int i;
 
    /* Check for invalid values */
    if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
-      return;
+     return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    proto = _ecore_x_atoms_wm_protocols[protocol];
 
    if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
      {
-       protos = NULL;
-       protos_count = 0;
+        protos = NULL;
+        protos_count = 0;
      }
 
    for (i = 0; i < protos_count; i++)
      {
-       if (protos[i] == proto)
-         {
-            already_set = 1;
-            break;
-         }
+        if (protos[i] == proto)
+          {
+             already_set = 1;
+             break;
+          }
      }
 
    if (on)
      {
-       Atom *new_protos = NULL;
-
-       if (already_set)
-          goto leave;
-       new_protos = malloc((protos_count + 1) * sizeof(Atom));
-       if (!new_protos)
-          goto leave;
-       for (i = 0; i < protos_count; i++)
-          new_protos[i] = protos[i];
-       new_protos[protos_count] = proto;
-       XSetWMProtocols(_ecore_x_disp, win, new_protos, protos_count + 1);
-       free(new_protos);
+        Atom *new_protos = NULL;
+
+        if (already_set)
+          goto leave;
+
+        new_protos = malloc((protos_count + 1) * sizeof(Atom));
+        if (!new_protos)
+          goto leave;
+
+        for (i = 0; i < protos_count; i++)
+          new_protos[i] = protos[i];
+        new_protos[protos_count] = proto;
+        XSetWMProtocols(_ecore_x_disp, win, new_protos, protos_count + 1);
+        free(new_protos);
      }
    else
      {
-       if (!already_set)
-          goto leave;
-       for (i = 0; i < protos_count; i++)
-         {
-            if (protos[i] == proto)
-              {
-                 int                 j;
-
-                 for (j = i + 1; j < protos_count; j++)
-                    protos[j - 1] = protos[j];
-                 if (protos_count > 1)
-                    XSetWMProtocols(_ecore_x_disp, win, protos,
-                                    protos_count - 1);
-                 else
-                    XDeleteProperty(_ecore_x_disp, win,
-                                    ECORE_X_ATOM_WM_PROTOCOLS);
-                 goto leave;
-              }
-         }
+        if (!already_set)
+          goto leave;
+
+        for (i = 0; i < protos_count; i++)
+          {
+             if (protos[i] == proto)
+               {
+                  int j;
+
+                  for (j = i + 1; j < protos_count; j++)
+                    protos[j - 1] = protos[j];
+                  if (protos_count > 1)
+                    XSetWMProtocols(_ecore_x_disp, win, protos,
+                                    protos_count - 1);
+                  else
+                    XDeleteProperty(_ecore_x_disp, win,
+                                    ECORE_X_ATOM_WM_PROTOCOLS);
+
+                  goto leave;
+               }
+          }
      }
 
- leave:
+leave:
    if (protos)
      XFree(protos);
-
 }
 
 /**
@@ -570,31 +661,35 @@ ecore_x_icccm_protocol_set(Ecore_X_Window win,
  * @param protocol The protocol to query
  * @return 1 if the protocol is set, else 0.
  */
-EAPI int
-ecore_x_icccm_protocol_isset(Ecore_X_Window win, Ecore_X_WM_Protocol protocol)
+EAPI Eina_Bool
+ecore_x_icccm_protocol_isset(Ecore_X_Window win,
+                             Ecore_X_WM_Protocol protocol)
 {
-   Atom                proto, *protos = NULL;
-   int                 i, ret = 0, protos_count = 0;
+   Atom proto, *protos = NULL;
+   int i, protos_count = 0;
+   Eina_Bool ret = EINA_FALSE;
 
    /* check for invalid values */
    if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
-      return 0;
+     return EINA_FALSE;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    proto = _ecore_x_atoms_wm_protocols[protocol];
 
    if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
-      return 0;
+     return EINA_FALSE;
 
    for (i = 0; i < protos_count; i++)
-      if (protos[i] == proto)
-       {
-          ret = 1;
-          break;
-       }
+     if (protos[i] == proto)
+       {
+          ret = EINA_TRUE;
+          break;
+       }
 
-   if (protos) XFree(protos);
-   return ret;
+   if (protos)
+     XFree(protos);
 
+   return ret;
 }
 
 /**
@@ -602,17 +697,21 @@ ecore_x_icccm_protocol_isset(Ecore_X_Window win, Ecore_X_WM_Protocol protocol)
  * @param win The window
  * @param n The name string
  * @param c The class string
- * 
+ *
  * Set a window name * class
  */
 EAPI void
-ecore_x_icccm_name_class_set(Ecore_X_Window win, const char *n, const char *c)
+ecore_x_icccm_name_class_set(Ecore_X_Window win,
+                             const char *n,
+                             const char *c)
 {
-   XClassHint         *xch;
+   XClassHint *xch;
 
    xch = XAllocClassHint();
    if (!xch)
-      return;
+     return;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xch->res_name = (char *)n;
    xch->res_class = (char *)c;
    XSetClassHint(_ecore_x_disp, win, xch);
@@ -624,30 +723,37 @@ ecore_x_icccm_name_class_set(Ecore_X_Window win, const char *n, const char *c)
  * @param win The window
  * @param n The name string
  * @param c The class string
- * 
+ *
  * Get a window name * class
  */
 EAPI void
-ecore_x_icccm_name_class_get(Ecore_X_Window win, char **n, char **c)
+ecore_x_icccm_name_class_get(Ecore_X_Window win,
+                             char **n,
+                             char **c)
 {
-   XClassHint          xch;
-   
-   if (n) *n = NULL;
-   if (c) *c = NULL;
+   XClassHint xch;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (n)
+     *n = NULL;
+
+   if (c)
+     *c = NULL;
+
    xch.res_name = NULL;
    xch.res_class = NULL;
    if (XGetClassHint(_ecore_x_disp, win, &xch))
      {
-       if (n)
-         {
-            if (xch.res_name) *n = strdup(xch.res_name);
-         }
-       if (c)
-         {
-            if (xch.res_class) *c = strdup(xch.res_class);
-         }
-       XFree(xch.res_name);
-       XFree(xch.res_class);
+        if (n)
+          if (xch.res_name)
+            *n = strdup(xch.res_name);
+
+        if (c)
+          if (xch.res_class)
+            *c = strdup(xch.res_class);
+
+        XFree(xch.res_name);
+        XFree(xch.res_class);
      }
 }
 
@@ -655,28 +761,32 @@ ecore_x_icccm_name_class_get(Ecore_X_Window win, char **n, char **c)
  * Get a window client machine string.
  * @param win The window
  * @return The windows client machine string
- * 
+ *
  * Return the client machine of a window. String must be free'd when done with.
  */
-EAPI char               *
+EAPI char *
 ecore_x_icccm_client_machine_get(Ecore_X_Window win)
 {
-   char               *name;
+   char *name;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    name = ecore_x_window_prop_string_get(win, ECORE_X_ATOM_WM_CLIENT_MACHINE);
    return name;
 }
 
 /**
  * Sets the WM_COMMAND property for @a win.
- * 
+ *
  * @param win  The window.
  * @param argc Number of arguments.
  * @param argv Arguments.
  */
 EAPI void
-ecore_x_icccm_command_set(Ecore_X_Window win, int argc, char **argv)
+ecore_x_icccm_command_set(Ecore_X_Window win,
+                          int argc,
+                          char **argv)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSetCommand(_ecore_x_disp, win, argv, argc);
 }
 
@@ -690,41 +800,55 @@ ecore_x_icccm_command_set(Ecore_X_Window win, int argc, char **argv)
  * @param argv Arguments.
  */
 EAPI void
-ecore_x_icccm_command_get(Ecore_X_Window win, int *argc, char ***argv)
+ecore_x_icccm_command_get(Ecore_X_Window win,
+                          int *argc,
+                          char ***argv)
 {
    int i, c;
    char **v;
 
-   if (argc) *argc = 0;
-   if (argv) *argv = NULL;
+   if (argc)
+     *argc = 0;
+
+   if (argv)
+     *argv = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XGetCommand(_ecore_x_disp, win, &v, &c))
      return;
+
    if (c < 1)
      {
-       if (v)
-         XFreeStringList(v);
-               return;
+        if (v)
+          XFreeStringList(v);
+
+        return;
      }
 
-   if (argc) *argc = c;
+   if (argc)
+     *argc = c;
+
    if (argv)
      {
-       (*argv) = malloc(c * sizeof(char *));
-       if (!*argv)
-         { 
-            XFreeStringList(v);
-            if (argc) *argc = 0;
-            return;
-         }
-       for (i = 0; i < c; i++)
-         {
-            if (v[i])
-              (*argv)[i] = strdup(v[i]);
-            else
-              (*argv)[i] = strdup("");
-         }
+        (*argv) = malloc(c * sizeof(char *));
+        if (!*argv)
+          {
+             XFreeStringList(v);
+             if (argc)
+               *argc = 0;
+
+             return;
+          }
+
+        for (i = 0; i < c; i++)
+          {
+             if (v[i])
+               (*argv)[i] = strdup(v[i]);
+             else
+               (*argv)[i] = strdup("");
+          }
      }
+
    XFreeStringList(v);
 }
 
@@ -732,39 +856,41 @@ ecore_x_icccm_command_get(Ecore_X_Window win, int *argc, char ***argv)
  * Set a window icon name.
  * @param win The window
  * @param t The icon name string
- * 
+ *
  * Set a window icon name
  */
 EAPI void
-ecore_x_icccm_icon_name_set(Ecore_X_Window win, const char *t)
+ecore_x_icccm_icon_name_set(Ecore_X_Window win,
+                            const char *t)
 {
-   char               *list[1];
-   XTextProperty       xprop;
-   int                 ret;
+   char *list[1];
+   XTextProperty xprop;
+   int ret;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xprop.value = NULL;
 #ifdef X_HAVE_UTF8_STRING
    list[0] = strdup(t);
    ret = Xutf8TextListToTextProperty(_ecore_x_disp, list, 1,
-                                    XUTF8StringStyle, &xprop);
-#else
+                                     XUTF8StringStyle, &xprop);
+#else /* ifdef X_HAVE_UTF8_STRING */
    list[0] = strdup(t);
    ret = XmbTextListToTextProperty(_ecore_x_disp, list, 1,
-                                  XStdICCTextStyle, &xprop);
-#endif
+                                   XStdICCTextStyle, &xprop);
+#endif /* ifdef X_HAVE_UTF8_STRING */
    if (ret >= Success)
      {
-       XSetWMIconName(_ecore_x_disp, win, &xprop);
-       if (xprop.value) XFree(xprop.value);
+        XSetWMIconName(_ecore_x_disp, win, &xprop);
+        if (xprop.value)
+          XFree(xprop.value);
      }
-   else
+   else if (XStringListToTextProperty(list, 1, &xprop) >= Success)
      {
-       if (XStringListToTextProperty(list, 1, &xprop) >= Success)
-         {
-            XSetWMIconName(_ecore_x_disp, win, &xprop);
-            if (xprop.value) XFree(xprop.value);
-         }
+        XSetWMIconName(_ecore_x_disp, win, &xprop);
+        if (xprop.value)
+          XFree(xprop.value);
      }
+
    free(list[0]);
 }
 
@@ -772,60 +898,58 @@ ecore_x_icccm_icon_name_set(Ecore_X_Window win, const char *t)
  * Get a window icon name.
  * @param win The window
  * @return The windows icon name string
- * 
+ *
  * Return the icon name of a window. String must be free'd when done with.
  */
-EAPI char               *
+EAPI char *
 ecore_x_icccm_icon_name_get(Ecore_X_Window win)
 {
-   XTextProperty       xprop;
+   XTextProperty xprop;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xprop.value = NULL;
    if (XGetWMIconName(_ecore_x_disp, win, &xprop) >= Success)
      {
-       if (xprop.value)
-         {
-            char              **list = NULL;
-            char               *t = NULL;
-            int                 num = 0;
-            int                 ret;
-
-            if (xprop.encoding == ECORE_X_ATOM_UTF8_STRING)
-              {
-                 t = strdup((char *)xprop.value);
-              }
-            else
-              {
-
-                 /* convert to utf8 */
+        if (xprop.value)
+          {
+             char **list = NULL;
+             char *t = NULL;
+             int num = 0;
+             int ret;
+
+             if (xprop.encoding == ECORE_X_ATOM_UTF8_STRING)
+               t = strdup((char *)xprop.value);
+             else
+               {
+                  /* convert to utf8 */
 #ifdef X_HAVE_UTF8_STRING
-                 ret = Xutf8TextPropertyToTextList(_ecore_x_disp, &xprop,
-                                                   &list, &num);
-#else
-                 ret = XmbTextPropertyToTextList(_ecore_x_disp, &xprop,
-                                                 &list, &num);
-#endif
-
-                 if ((ret == XLocaleNotSupported) ||
-                     (ret == XNoMemory) || (ret == XConverterNotFound))
-                   {
-                      t = strdup((char *)xprop.value);
-                   }
-                 else if (ret >= Success)
-                   {
-                      if ((num >= 1) && (list))
-                        {
-                           t = strdup(list[0]);
-                        }
-                      if (list)
-                        XFreeStringList(list);
-                   }
-              }
-            
-            if (xprop.value) XFree(xprop.value);
-            return t;
-         }
+                  ret = Xutf8TextPropertyToTextList(_ecore_x_disp, &xprop,
+                                                    &list, &num);
+#else /* ifdef X_HAVE_UTF8_STRING */
+                  ret = XmbTextPropertyToTextList(_ecore_x_disp, &xprop,
+                                                  &list, &num);
+#endif /* ifdef X_HAVE_UTF8_STRING */
+
+                  if ((ret == XLocaleNotSupported) ||
+                      (ret == XNoMemory) || (ret == XConverterNotFound))
+                    t = strdup((char *)xprop.value);
+                  else if (ret >= Success)
+                    {
+                       if ((num >= 1) && (list))
+                         t = strdup(list[0]);
+
+                       if (list)
+                         XFreeStringList(list);
+                    }
+               }
+
+             if (xprop.value)
+               XFree(xprop.value);
+
+             return t;
+          }
      }
+
    return NULL;
 }
 
@@ -835,52 +959,60 @@ ecore_x_icccm_icon_name_get(Ecore_X_Window win)
  * @param subwin The subwindow to be added to the colormap windows list
  */
 EAPI void
-ecore_x_icccm_colormap_window_set(Ecore_X_Window win, Ecore_X_Window subwin)
+ecore_x_icccm_colormap_window_set(Ecore_X_Window win,
+                                  Ecore_X_Window subwin)
 {
-   int                 num = 0, i;
-   unsigned char      *old_data = NULL;
-   unsigned char      *data = NULL;
-   Window             *oldset = NULL;
-   Window             *newset = NULL;
+   int num = 0, i;
+   unsigned char *old_data = NULL;
+   unsigned char *data = NULL;
+   Window *oldset = NULL;
+   Window *newset = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!ecore_x_window_prop_property_get(win,
-                                        ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
-                                        XA_WINDOW, 32, &old_data, &num))
+                                         ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                                         XA_WINDOW, 32, &old_data, &num))
      {
-       newset = calloc(1, sizeof(Window));
-       if (!newset)
-          return;
-       newset[0] = subwin;
-       num = 1;
-       data = (unsigned char *)newset;
+        newset = calloc(1, sizeof(Window));
+        if (!newset)
+          return;
+
+        newset[0] = subwin;
+        num = 1;
+        data = (unsigned char *)newset;
      }
    else
      {
-       newset = calloc(num + 1, sizeof(Window));
-       oldset = (Window *) old_data;
-       if (!newset)
-          return;
-       for (i = 0; i < num; ++i)
-         {
-            if (oldset[i] == subwin)
-              {
-                 if (old_data) XFree(old_data);
-                 old_data = NULL;
-                 free(newset);
-                 return;
-              }
-
-            newset[i] = oldset[i];
-         }
-
-       newset[num++] = subwin;
-       if (old_data) XFree(old_data);
-       data = (unsigned char *)newset;
+        newset = calloc(num + 1, sizeof(Window));
+        oldset = (Window *)old_data;
+        if (!newset)
+          return;
+
+        for (i = 0; i < num; ++i)
+          {
+             if (oldset[i] == subwin)
+               {
+                  if (old_data)
+                    XFree(old_data);
+
+                  old_data = NULL;
+                  free(newset);
+                  return;
+               }
+
+             newset[i] = oldset[i];
+          }
+
+        newset[num++] = subwin;
+        if (old_data)
+          XFree(old_data);
+
+        data = (unsigned char *)newset;
      }
 
    ecore_x_window_prop_property_set(win,
-                                   ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
-                                   XA_WINDOW, 32, data, num);
+                                    ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                                    XA_WINDOW, 32, data, num);
    free(newset);
 }
 
@@ -890,51 +1022,63 @@ ecore_x_icccm_colormap_window_set(Ecore_X_Window win, Ecore_X_Window subwin)
  * @param subwin The window to be removed from the colormap window list.
  */
 EAPI void
-ecore_x_icccm_colormap_window_unset(Ecore_X_Window win, Ecore_X_Window subwin)
+ecore_x_icccm_colormap_window_unset(Ecore_X_Window win,
+                                    Ecore_X_Window subwin)
 {
-   int                 num = 0, i, j, k = 0;
-   unsigned char      *old_data = NULL;
-   unsigned char      *data = NULL;
-   Window             *oldset = NULL;
-   Window             *newset = NULL;
+   int num = 0, i, j, k = 0;
+   unsigned char *old_data = NULL;
+   unsigned char *data = NULL;
+   Window *oldset = NULL;
+   Window *newset = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!ecore_x_window_prop_property_get(win,
-                                        ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
-                                        XA_WINDOW, 32, &old_data, &num))
-      return;
+                                         ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                                         XA_WINDOW, 32, &old_data, &num))
+     return;
 
-   oldset = (Window *) old_data;
+   oldset = (Window *)old_data;
    for (i = 0; i < num; i++)
      {
-       if (oldset[i] == subwin)
-         {
-            if (num == 1)
-              {
-                 XDeleteProperty(_ecore_x_disp,
-                                 win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
-                 if (old_data) XFree(old_data);
-                 old_data = NULL;
-                 return;
-              }
-            else
-              {
-                 newset = calloc(num - 1, sizeof(Window));
-                 data = (unsigned char *)newset;
-                 for (j = 0; j < num; ++j)
-                    if (oldset[j] != subwin)
-                       newset[k++] = oldset[j];
-                 ecore_x_window_prop_property_set(win,
-                                                  ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
-                                                  XA_WINDOW, 32, data, k);
-                 if (old_data) XFree(old_data);
-                 old_data = NULL;
-                 free(newset);
-                 return;
-              }
-         }
+        if (oldset[i] == subwin)
+          {
+             if (num == 1)
+               {
+                  XDeleteProperty(_ecore_x_disp,
+                                  win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
+                  if (old_data)
+                    XFree(old_data);
+
+                  old_data = NULL;
+                  return;
+               }
+             else
+               {
+                  newset = calloc(num - 1, sizeof(Window));
+                  data = (unsigned char *)newset;
+                  for (j = 0; j < num; ++j)
+                    if (oldset[j] != subwin)
+                      newset[k++] = oldset[j];
+
+                  ecore_x_window_prop_property_set(
+                    win,
+                    ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
+                    XA_WINDOW,
+                    32,
+                    data,
+                    k);
+                  if (old_data)
+                    XFree(old_data);
+
+                  old_data = NULL;
+                  free(newset);
+                  return;
+               }
+          }
      }
 
-   if (old_data) XFree(old_data);
+   if (old_data)
+     XFree(old_data);
 }
 
 /**
@@ -943,18 +1087,21 @@ ecore_x_icccm_colormap_window_unset(Ecore_X_Window win, Ecore_X_Window subwin)
  * @param forwin the toplevel window
  */
 EAPI void
-ecore_x_icccm_transient_for_set(Ecore_X_Window win, Ecore_X_Window forwin)
+ecore_x_icccm_transient_for_set(Ecore_X_Window win,
+                                Ecore_X_Window forwin)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSetTransientForHint(_ecore_x_disp, win, forwin);
 }
 
 /**
  * Remove the transient_for setting from a window.
- * @param The window
+ * @param win The window
  */
 EAPI void
 ecore_x_icccm_transient_for_unset(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XDeleteProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_TRANSIENT_FOR);
 }
 
@@ -966,13 +1113,13 @@ ecore_x_icccm_transient_for_unset(Ecore_X_Window win)
 EAPI Ecore_X_Window
 ecore_x_icccm_transient_for_get(Ecore_X_Window win)
 {
-   Window              forwin;
+   Window forwin;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (XGetTransientForHint(_ecore_x_disp, win, &forwin))
-      return (Ecore_X_Window) forwin;
+     return (Ecore_X_Window)forwin;
    else
-      return 0;
-
+     return 0;
 }
 
 /**
@@ -981,10 +1128,12 @@ ecore_x_icccm_transient_for_get(Ecore_X_Window win)
  * @param role The role string
  */
 EAPI void
-ecore_x_icccm_window_role_set(Ecore_X_Window win, const char *role)
+ecore_x_icccm_window_role_set(Ecore_X_Window win,
+                              const char *role)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_string_set(win, ECORE_X_ATOM_WM_WINDOW_ROLE,
-                                 (char *)role);
+                                  (char *)role);
 }
 
 /**
@@ -992,9 +1141,10 @@ ecore_x_icccm_window_role_set(Ecore_X_Window win, const char *role)
  * @param win The window
  * @return The window's role string.
  */
-EAPI char               *
+EAPI char *
 ecore_x_icccm_window_role_get(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ecore_x_window_prop_string_get(win, ECORE_X_ATOM_WM_WINDOW_ROLE);
 }
 
@@ -1007,10 +1157,12 @@ ecore_x_icccm_window_role_get(Ecore_X_Window win)
  * the main window must have this property set to the app's main window.
  */
 EAPI void
-ecore_x_icccm_client_leader_set(Ecore_X_Window win, Ecore_X_Window l)
+ecore_x_icccm_client_leader_set(Ecore_X_Window win,
+                                Ecore_X_Window l)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_window_set(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
-                                 &l, 1);
+                                  &l, 1);
 }
 
 /**
@@ -1020,21 +1172,28 @@ ecore_x_icccm_client_leader_set(Ecore_X_Window win, Ecore_X_Window l)
 EAPI Ecore_X_Window
 ecore_x_icccm_client_leader_get(Ecore_X_Window win)
 {
-   Ecore_X_Window      l;
+   Ecore_X_Window l;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (ecore_x_window_prop_window_get(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
-                                     &l, 1) > 0)
-      return l;
+                                      &l, 1) > 0)
+     return l;
+
    return 0;
 }
 
 EAPI void
-ecore_x_icccm_iconic_request_send(Ecore_X_Window win, Ecore_X_Window root)
+ecore_x_icccm_iconic_request_send(Ecore_X_Window win,
+                                  Ecore_X_Window root)
 {
    XEvent xev;
 
-   if (!win) return;
-   if (!root) root = DefaultRootWindow(_ecore_x_disp);
+   if (!win)
+     return;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
 
    xev.xclient.type = ClientMessage;
    xev.xclient.serial = 0;
diff --git a/src/lib/ecore_x/xlib/ecore_x_image.c b/src/lib/ecore_x/xlib/ecore_x_image.c
new file mode 100644 (file)
index 0000000..f2b1d75
--- /dev/null
@@ -0,0 +1,602 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include "ecore_x_private.h"
+#include "Ecore_X.h"
+
+#include <X11/extensions/XShm.h>
+#include <X11/Xutil.h>
+
+static int _ecore_x_image_shm_can = -1;
+static int _ecore_x_image_err = 0;
+
+static int
+_ecore_x_image_error_handler(Display *d __UNUSED__,
+                             XErrorEvent *ev __UNUSED__)
+{
+   _ecore_x_image_err = 1;
+   return 0;
+}
+
+static void
+_ecore_x_image_shm_check(void)
+{
+   XErrorHandler ph;
+   XShmSegmentInfo shminfo;
+   XImage *xim;
+
+   if (_ecore_x_image_shm_can != -1)
+     return;
+
+   XSync(_ecore_x_disp, False);
+   _ecore_x_image_err = 0;
+
+   xim = XShmCreateImage(_ecore_x_disp,
+                         DefaultVisual(_ecore_x_disp,
+                                       DefaultScreen(_ecore_x_disp)),
+                         DefaultDepth(_ecore_x_disp,
+                                      DefaultScreen(_ecore_x_disp)),
+                         ZPixmap, NULL,
+                         &shminfo, 1, 1);
+   if (!xim)
+     {
+        _ecore_x_image_shm_can = 0;
+        return;
+     }
+
+   shminfo.shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height,
+                          IPC_CREAT | 0666);
+   if (shminfo.shmid == -1)
+     {
+        XDestroyImage(xim);
+        _ecore_x_image_shm_can = 0;
+        return;
+     }
+
+   shminfo.readOnly = False;
+   shminfo.shmaddr = shmat(shminfo.shmid, 0, 0);
+   xim->data = shminfo.shmaddr;
+
+   if (xim->data == (char *)-1)
+     {
+        XDestroyImage(xim);
+        _ecore_x_image_shm_can = 0;
+        return;
+     }
+
+   ph = XSetErrorHandler((XErrorHandler)_ecore_x_image_error_handler);
+   XShmAttach(_ecore_x_disp, &shminfo);
+   XShmGetImage(_ecore_x_disp, DefaultRootWindow(_ecore_x_disp),
+                xim, 0, 0, 0xffffffff);
+   XSync(_ecore_x_disp, False);
+   XSetErrorHandler((XErrorHandler)ph);
+   if (_ecore_x_image_err)
+     {
+        XShmDetach(_ecore_x_disp, &shminfo);
+        XDestroyImage(xim);
+        shmdt(shminfo.shmaddr);
+        shmctl(shminfo.shmid, IPC_RMID, 0);
+        _ecore_x_image_shm_can = 0;
+        return;
+     }
+
+   XShmDetach(_ecore_x_disp, &shminfo);
+   XDestroyImage(xim);
+   shmdt(shminfo.shmaddr);
+   shmctl(shminfo.shmid, IPC_RMID, 0);
+
+   _ecore_x_image_shm_can = 1;
+}
+
+struct _Ecore_X_Image
+{
+   XShmSegmentInfo shminfo;
+   Ecore_X_Visual  vis;
+   XImage         *xim;
+   int             depth;
+   int             w, h;
+   int             bpl, bpp, rows;
+   unsigned char  *data;
+   Eina_Bool       shm : 1;
+};
+
+EAPI Ecore_X_Image *
+ecore_x_image_new(int w,
+                  int h,
+                  Ecore_X_Visual vis,
+                  int depth)
+{
+   Ecore_X_Image *im;
+
+   im = calloc(1, sizeof(Ecore_X_Image));
+   if (!im)
+     return NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   im->w = w;
+   im->h = h;
+   im->vis = vis;
+   im->depth = depth;
+   _ecore_x_image_shm_check();
+   im->shm = _ecore_x_image_shm_can;
+   return im;
+}
+
+EAPI void
+ecore_x_image_free(Ecore_X_Image *im)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (im->shm)
+     {
+        if (im->xim)
+          {
+             XShmDetach(_ecore_x_disp, &(im->shminfo));
+             XDestroyImage(im->xim);
+             shmdt(im->shminfo.shmaddr);
+             shmctl(im->shminfo.shmid, IPC_RMID, 0);
+          }
+     }
+   else if (im->xim)
+     {
+        free(im->xim->data);
+        im->xim->data = NULL;
+        XDestroyImage(im->xim);
+     }
+
+   free(im);
+}
+
+static void
+_ecore_x_image_shm_create(Ecore_X_Image *im)
+{
+   im->xim = XShmCreateImage(_ecore_x_disp, im->vis, im->depth,
+                             ZPixmap, NULL, &(im->shminfo),
+                             im->w, im->h);
+   if (!im->xim)
+     return;
+
+   im->shminfo.shmid = shmget(IPC_PRIVATE,
+                              im->xim->bytes_per_line * im->xim->height,
+                              IPC_CREAT | 0666);
+   if (im->shminfo.shmid == -1)
+     {
+        XDestroyImage(im->xim);
+        return;
+     }
+
+   im->shminfo.readOnly = False;
+   im->shminfo.shmaddr = shmat(im->shminfo.shmid, 0, 0);
+   im->xim->data = im->shminfo.shmaddr;
+   if ((im->xim->data == (char *)-1) ||
+       (!im->xim->data))
+     {
+        shmdt(im->shminfo.shmaddr);
+        shmctl(im->shminfo.shmid, IPC_RMID, 0);
+        XDestroyImage(im->xim);
+        return;
+     }
+
+   XShmAttach(_ecore_x_disp, &im->shminfo);
+
+   im->data = (unsigned char *)im->xim->data;
+
+   im->bpl = im->xim->bytes_per_line;
+   im->rows = im->xim->height;
+   if (im->xim->bits_per_pixel <= 8)
+     im->bpp = 1;
+   else if (im->xim->bits_per_pixel <= 16)
+     im->bpp = 2;
+   else
+     im->bpp = 4;
+}
+
+EAPI Eina_Bool
+ecore_x_image_get(Ecore_X_Image *im,
+                  Ecore_X_Drawable draw,
+                  int x,
+                  int y,
+                  int sx,
+                  int sy,
+                  int w,
+                  int h)
+{
+   Eina_Bool ret = EINA_TRUE;
+   XErrorHandler ph;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (im->shm)
+     {
+        if (!im->xim)
+          _ecore_x_image_shm_create(im);
+
+        if (!im->xim)
+          return 0;
+
+        _ecore_x_image_err = 0;
+        
+        ecore_x_sync();
+        // optimised path
+        ph = XSetErrorHandler((XErrorHandler)_ecore_x_image_error_handler);
+        if ((sx == 0) && (w == im->w))
+          {
+             im->xim->data = (char *)
+               im->data + (im->xim->bytes_per_line * sy) + (sx * im->bpp);
+             im->xim->width = w;
+             im->xim->height = h;
+             XGrabServer(_ecore_x_disp);
+             if (!XShmGetImage(_ecore_x_disp, draw, im->xim, x, y, 0xffffffff))
+               ret = EINA_FALSE;
+             XUngrabServer(_ecore_x_disp);
+             ecore_x_sync();
+          }
+        // unavoidable thanks to mit-shm get api - tmp shm buf + copy into it
+        else
+          {
+             Ecore_X_Image *tim;
+             unsigned char *spixels, *sp, *pixels, *p;
+             int bpp, bpl, rows, sbpp, sbpl, srows;
+             int r;
+
+             tim = ecore_x_image_new(w, h, im->vis, im->depth);
+             if (tim)
+               {
+                  ret = ecore_x_image_get(tim, draw, x, y, 0, 0, w, h);
+                  if (ret)
+                    {
+                       spixels = ecore_x_image_data_get(tim,
+                                                        &sbpl,
+                                                        &srows,
+                                                        &sbpp);
+                       pixels = ecore_x_image_data_get(im, &bpl, &rows, &bpp);
+                       if ((pixels) && (spixels))
+                         {
+                            p = pixels + (sy * bpl) + (sx * bpp);
+                            sp = spixels;
+                            for (r = srows; r > 0; r--)
+                              {
+                                 memcpy(p, sp, sbpl);
+                                 p += bpl;
+                                 sp += sbpl;
+                              }
+                         }
+                    }
+
+                  ecore_x_image_free(tim);
+               }
+          }
+
+        XSetErrorHandler((XErrorHandler)ph);
+        if (_ecore_x_image_err)
+          ret = EINA_FALSE;
+     }
+   else
+     {
+        printf("currently unimplemented ecore_x_image_get without shm\n");
+        ret = EINA_FALSE;
+     }
+
+   return ret;
+}
+
+EAPI void
+ecore_x_image_put(Ecore_X_Image *im,
+                  Ecore_X_Drawable draw,
+                  Ecore_X_GC gc,
+                  int x,
+                  int y,
+                  int sx,
+                  int sy,
+                  int w,
+                  int h)
+{
+   Ecore_X_GC tgc = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!gc)
+     {
+        XGCValues gcv;
+        memset(&gcv, 0, sizeof(gcv));
+        gcv.subwindow_mode = IncludeInferiors;
+        tgc = XCreateGC(_ecore_x_disp, draw, GCSubwindowMode, &gcv);
+        gc = tgc;
+     }
+   if (!im->xim) _ecore_x_image_shm_create(im);
+   if (im->xim)
+     XShmPutImage(_ecore_x_disp, draw, gc, im->xim, sx, sy, x, y, w, h, False);
+   if (tgc) ecore_x_gc_free(tgc);
+}
+
+EAPI void *
+ecore_x_image_data_get(Ecore_X_Image *im,
+                       int *bpl,
+                       int *rows,
+                       int *bpp)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!im->xim) _ecore_x_image_shm_create(im);
+   if (!im->xim) return NULL;
+   if (bpl) *bpl = im->bpl;
+   if (rows) *rows = im->rows;
+   if (bpp) *bpp = im->bpp;
+   return im->data;
+}
+
+EAPI Eina_Bool
+ecore_x_image_is_argb32_get(Ecore_X_Image *im)
+{
+   Visual *vis = im->vis;
+   if (!im->xim) _ecore_x_image_shm_create(im);
+   if (((vis->class == TrueColor) ||
+        (vis->class == DirectColor)) &&
+       (im->depth >= 24) &&
+       (vis->red_mask == 0xff0000) &&
+       (vis->green_mask == 0x00ff00) &&
+       (vis->blue_mask == 0x0000ff))
+     {
+#ifdef WORDS_BIGENDIAN
+        if (im->xim->bitmap_bit_order == MSBFirst) return EINA_TRUE;
+#else
+        if (im->xim->bitmap_bit_order == LSBFirst) return EINA_TRUE;
+#endif
+     }
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_image_to_argb_convert(void *src,
+                              int sbpp,
+                              int sbpl,
+                              Ecore_X_Colormap c,
+                              Ecore_X_Visual v,
+                              int x,
+                              int y,
+                              int w,
+                              int h,
+                              unsigned int *dst,
+                              int dbpl,
+                              int dx,
+                              int dy)
+{
+   Visual *vis = v;
+   XColor *cols = NULL;
+   int n = 0, nret = 0, i, row;
+   unsigned int pal[256], r, g, b;
+   enum
+   {
+      rgbnone = 0,
+      rgb565,
+      bgr565,
+      rgbx555,
+      argbx888,
+      abgrx888,
+      rgba888x,
+      bgra888x,
+      argbx666
+   };
+   int mode = 0;
+
+   sbpp *= 8;
+
+   n = vis->map_entries;
+   if ((n <= 256) &&
+       ((vis->class == PseudoColor) ||
+        (vis->class == StaticColor) ||
+        (vis->class == GrayScale) ||
+        (vis->class == StaticGray)))
+     {
+        if (!c)
+          c = DefaultColormap(_ecore_x_disp,
+                              DefaultScreen(_ecore_x_disp));
+        cols = alloca(n * sizeof(XColor));
+        for (i = 0; i < n; i++)
+          {
+             cols[i].pixel = i;
+             cols[i].flags = DoRed | DoGreen | DoBlue;
+             cols[i].red = 0;
+             cols[i].green = 0;
+             cols[i].blue = 0;
+          }
+        XQueryColors(_ecore_x_disp, c, cols, n);
+        for (i = 0; i < n; i++)
+          {
+             pal[i] = 0xff000000 |
+               ((cols[i].red >> 8) << 16) |
+               ((cols[i].green >> 8) << 8) |
+               ((cols[i].blue >> 8));
+          }
+        nret = n;
+     }
+   else if ((vis->class == TrueColor) ||
+            (vis->class == DirectColor))
+     {
+        if ((vis->red_mask == 0x00ff0000) &&
+            (vis->green_mask == 0x0000ff00) &&
+            (vis->blue_mask == 0x000000ff))
+          mode = argbx888;
+        else if ((vis->red_mask == 0x000000ff) &&
+                 (vis->green_mask == 0x0000ff00) &&
+                 (vis->blue_mask == 0x00ff0000))
+          mode = abgrx888;
+        else if ((vis->red_mask == 0xff000000) &&
+                 (vis->green_mask == 0x00ff0000) &&
+                 (vis->blue_mask == 0x0000ff00))
+          mode = rgba888x;
+        else if ((vis->red_mask == 0x0000ff00) &&
+                 (vis->green_mask == 0x00ff0000) &&
+                 (vis->blue_mask == 0xff000000))
+          mode = bgra888x;
+        else if ((vis->red_mask == 0x0003f000) &&
+                 (vis->green_mask == 0x00000fc0) &&
+                 (vis->blue_mask == 0x0000003f))
+          mode = argbx666;
+        else if ((vis->red_mask == 0x0000f800) &&
+                 (vis->green_mask == 0x000007e0) &&
+                 (vis->blue_mask == 0x0000001f))
+          mode = rgb565;
+        else if ((vis->red_mask == 0x0000001f) &&
+                 (vis->green_mask == 0x000007e0) &&
+                 (vis->blue_mask == 0x0000f800))
+          mode = bgr565;
+        else if ((vis->red_mask == 0x00007c00) &&
+                 (vis->green_mask == 0x000003e0) &&
+                 (vis->blue_mask == 0x0000001f))
+          mode = rgbx555;
+        else
+          return EINA_FALSE;
+     }
+   for (row = 0; row < h; row++)
+     {
+        unsigned char *s8;
+        unsigned short *s16;
+        unsigned int *s32;
+        unsigned int *dp, *de;
+
+        dp = ((unsigned int *)(((unsigned char *)dst) +
+                               ((dy + row) * dbpl))) + dx;
+        de = dp + w;
+        switch (sbpp)
+          {
+           case 8:
+             s8 = ((unsigned char *)(((unsigned char *)src) + ((y + row) * sbpl))) + x;
+             if (nret > 0)
+               {
+                  while (dp < de)
+                    {
+                       *dp = pal[*s8];
+                       s8++; dp++;
+                    }
+               }
+             else
+               return EINA_FALSE;
+             break;
+
+           case 16:
+             s16 = ((unsigned short *)(((unsigned char *)src) + ((y + row) * sbpl))) + x;
+             switch (mode)
+               {
+                case rgb565:
+                  while (dp < de)
+                    {
+                       r = (*s16 & 0xf800) << 8;
+                       g = (*s16 & 0x07e0) << 5;
+                       b = (*s16 & 0x001f) << 3;
+                       r |= (r >> 5) & 0xff0000;
+                       g |= (g >> 6) & 0x00ff00;
+                       b |= (b >> 5);
+                       *dp = 0xff000000 | r | g | b;
+                       s16++; dp++;
+                    }
+                  break;
+
+                case bgr565:
+                  while (dp < de)
+                    {
+                       r = (*s16 & 0x001f) << 19;
+                       g = (*s16 & 0x07e0) << 5;
+                       b = (*s16 & 0xf800) >> 8;
+                       r |= (r >> 5) & 0xff0000;
+                       g |= (g >> 6) & 0x00ff00;
+                       b |= (b >> 5);
+                       *dp = 0xff000000 | r | g | b;
+                       s16++; dp++;
+                    }
+                  break;
+
+                case rgbx555:
+                  while (dp < de)
+                    {
+                       r = (*s16 & 0x7c00) << 9;
+                       g = (*s16 & 0x03e0) << 6;
+                       b = (*s16 & 0x001f) << 3;
+                       r |= (r >> 5) & 0xff0000;
+                       g |= (g >> 5) & 0x00ff00;
+                       b |= (b >> 5);
+                       *dp = 0xff000000 | r | g | b;
+                       s16++; dp++;
+                    }
+                  break;
+
+                default:
+                  return EINA_FALSE;
+                  break;
+               }
+             break;
+
+           case 24:
+           case 32:
+             s32 = ((unsigned int *)(((unsigned char *)src) + ((y + row) * sbpl))) + x;
+             switch (mode)
+               {
+                case argbx888:
+                  while (dp < de)
+                    {
+                       *dp = 0xff000000 | *s32;
+                       s32++; dp++;
+                    }
+                  break;
+
+                case abgrx888:
+                  while (dp < de)
+                    {
+                       r = *s32 & 0x000000ff;
+                       g = *s32 & 0x0000ff00;
+                       b = *s32 & 0x00ff0000;
+                       *dp = 0xff000000 | (r << 16) | (g) | (b >> 16);
+                       s32++; dp++;
+                    }
+                  break;
+
+                case rgba888x:
+                  while (dp < de)
+                    {
+                       *dp = 0xff000000 | (*s32 >> 8);
+                       s32++; dp++;
+                    }
+                  break;
+
+                case bgra888x:
+                  while (dp < de)
+                    {
+                       r = *s32 & 0x0000ff00;
+                       g = *s32 & 0x00ff0000;
+                       b = *s32 & 0xff000000;
+                       *dp = 0xff000000 | (r << 8) | (g >> 8) | (b >> 24);
+                       s32++; dp++;
+                    }
+                  break;
+
+                case argbx666:
+                  while (dp < de)
+                    {
+                       r = (*s32 & 0x3f000) << 6;
+                       g = (*s32 & 0x00fc0) << 4;
+                       b = (*s32 & 0x0003f) << 2;
+                       r |= (r >> 6) & 0xff0000;
+                       g |= (g >> 6) & 0x00ff00;
+                       b |= (b >> 6);
+                       *dp = 0xff000000 | r | g | b;
+                       s32++; dp++;
+                    }
+                  break;
+
+                default:
+                  return EINA_FALSE;
+                  break;
+               }
+             break;
+             break;
+
+           default:
+             return EINA_FALSE;
+             break;
+          }
+     }
+   return EINA_TRUE;
+}
+
index c009c7a..7812cc2 100644 (file)
 /*
  * Various MWM related functions.
- * 
+ *
  * This is ALL the code involving anything MWM related. for both WM and
  * client.
  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include "Ecore_X_Atoms.h"
 
-#define ECORE_X_MWM_HINTS_FUNCTIONS           (1 << 0)
-#define ECORE_X_MWM_HINTS_DECORATIONS         (1 << 1)
-#define ECORE_X_MWM_HINTS_INPUT_MODE          (1 << 2)
-#define ECORE_X_MWM_HINTS_STATUS              (1 << 3)
+#define ECORE_X_MWM_HINTS_FUNCTIONS   (1 << 0)
+#define ECORE_X_MWM_HINTS_DECORATIONS (1 << 1)
+#define ECORE_X_MWM_HINTS_INPUT_MODE  (1 << 2)
+#define ECORE_X_MWM_HINTS_STATUS      (1 << 3)
 
 typedef struct _mwmhints
 {
-   CARD32              flags;
-   CARD32              functions;
-   CARD32              decorations;
-   INT32               inputmode;
-   CARD32              status;
+   CARD32 flags;
+   CARD32 functions;
+   CARD32 decorations;
+   INT32  inputmode;
+   CARD32 status;
 }
 MWMHints;
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_mwm_hints_get(Ecore_X_Window win,
-                     Ecore_X_MWM_Hint_Func * fhint,
-                     Ecore_X_MWM_Hint_Decor * dhint,
-                     Ecore_X_MWM_Hint_Input * ihint)
+                      Ecore_X_MWM_Hint_Func *fhint,
+                      Ecore_X_MWM_Hint_Decor *dhint,
+                      Ecore_X_MWM_Hint_Input *ihint)
 {
-   unsigned char      *p = NULL;
-   MWMHints           *mwmhints = NULL;
-   int                 num;
-   int                 ret;
+   unsigned char *p = NULL;
+   MWMHints *mwmhints = NULL;
+   int num;
+   Eina_Bool ret;
 
-   ret = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = EINA_FALSE;
    if (!ecore_x_window_prop_property_get(win,
-                                        ECORE_X_ATOM_MOTIF_WM_HINTS,
-                                        ECORE_X_ATOM_MOTIF_WM_HINTS,
-                                        32, &p, &num))
-      return 0;
-   mwmhints = (MWMHints *) p;
+                                         ECORE_X_ATOM_MOTIF_WM_HINTS,
+                                         ECORE_X_ATOM_MOTIF_WM_HINTS,
+                                         32, &p, &num))
+     return EINA_FALSE;
+
+   mwmhints = (MWMHints *)p;
    if (mwmhints)
      {
-       if (num >= 4)
-         {
-            if (dhint)
-              {
-                 if (mwmhints->flags & ECORE_X_MWM_HINTS_DECORATIONS)
-                    *dhint = mwmhints->decorations;
-                 else
-                    *dhint = ECORE_X_MWM_HINT_DECOR_ALL;
-              }
-            if (fhint)
-              {
-                 if (mwmhints->flags & ECORE_X_MWM_HINTS_FUNCTIONS)
-                    *fhint = mwmhints->functions;
-                 else
-                    *fhint = ECORE_X_MWM_HINT_FUNC_ALL;
-              }
-            if (ihint)
-              {
-                 if (mwmhints->flags & ECORE_X_MWM_HINTS_INPUT_MODE)
-                    *ihint = mwmhints->inputmode;
-                 else
-                    *ihint = ECORE_X_MWM_HINT_INPUT_MODELESS;
-              }
-            ret = 1;
-         }
-       free(mwmhints);
+        if (num >= 4)
+          {
+             if (dhint)
+               {
+                  if (mwmhints->flags & ECORE_X_MWM_HINTS_DECORATIONS)
+                    *dhint = mwmhints->decorations;
+                  else
+                    *dhint = ECORE_X_MWM_HINT_DECOR_ALL;
+               }
+
+             if (fhint)
+               {
+                  if (mwmhints->flags & ECORE_X_MWM_HINTS_FUNCTIONS)
+                    *fhint = mwmhints->functions;
+                  else
+                    *fhint = ECORE_X_MWM_HINT_FUNC_ALL;
+               }
+
+             if (ihint)
+               {
+                  if (mwmhints->flags & ECORE_X_MWM_HINTS_INPUT_MODE)
+                    *ihint = mwmhints->inputmode;
+                  else
+                    *ihint = ECORE_X_MWM_HINT_INPUT_MODELESS;
+               }
+
+             ret = EINA_TRUE;
+          }
+
+        free(mwmhints);
      }
+
    return ret;
 }
 
 EAPI void
-ecore_x_mwm_borderless_set(Ecore_X_Window win, int borderless)
+ecore_x_mwm_borderless_set(Ecore_X_Window win,
+                           Eina_Bool borderless)
 {
    unsigned int data[5] = {0, 0, 0, 0, 0};
 
    data[0] = 2; /* just set the decorations hint! */
    data[2] = !borderless;
-   
-   ecore_x_window_prop_property_set(win, 
-                                   ECORE_X_ATOM_MOTIF_WM_HINTS,
-                                   ECORE_X_ATOM_MOTIF_WM_HINTS,
-                                   32, (void *)data, 5);
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_property_set(win,
+                                    ECORE_X_ATOM_MOTIF_WM_HINTS,
+                                    ECORE_X_ATOM_MOTIF_WM_HINTS,
+                                    32, (void *)data, 5);
 }
 
index dacd7f8..5a23a1b 100644 (file)
@@ -1,15 +1,18 @@
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-/*
  * _NET_WM... aka Extended Window Manager Hint (EWMH) functions.
  */
-#include "config.h"
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
 #include "Ecore.h"
-#include "Ecore_Data.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
-#include "Ecore_X_Atoms.h"
 
 typedef struct _Ecore_X_Startup_Info Ecore_X_Startup_Info;
 
@@ -17,60 +20,72 @@ struct _Ecore_X_Startup_Info
 {
    Ecore_X_Window win;
 
-   int   init;
+   int            init;
 
-   int   buffer_size;
-   char *buffer;
+   int            buffer_size;
+   char          *buffer;
 
-   int   length;
+   int            length;
 
    /* These are the sequence info fields */
-   char *id;
-   char *name;
-   int   screen;
-   char *bin;
-   char *icon;
-   int   desktop;
-   int   timestamp;
-   char *description;
-   char *wmclass;
-   int   silent;
+   char          *id;
+   char          *name;
+   int            screen;
+   char          *bin;
+   char          *icon;
+   int            desktop;
+   int            timestamp;
+   char          *description;
+   char          *wmclass;
+   int            silent;
 };
 
-static void  _ecore_x_window_prop_string_utf8_set(Ecore_X_Window win, Ecore_X_Atom atom, const char *str);
-static char *_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win, Ecore_X_Atom atom);
+static void  _ecore_x_window_prop_string_utf8_set(Ecore_X_Window win,
+                                                  Ecore_X_Atom atom,
+                                                  const char *str);
+static char *_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win,
+                                                  Ecore_X_Atom atom);
 #if 0 /* Unused */
 static int   _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info);
-static int   _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info, char *data);
-#endif
+static int   _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
+                                               char *data);
+#endif /* if 0 */
 static void  _ecore_x_netwm_startup_info_free(void *data);
 
 /*
  * Convenience macros
  */
 #define _ATOM_SET_UTF8_STRING_LIST(win, atom, string, cnt) \
-   XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8, PropModeReplace, \
-                   (unsigned char *)string, cnt)
+  XChangeProperty(_ecore_x_disp,                           \
+                  win,                                     \
+                  atom,                                    \
+                  ECORE_X_ATOM_UTF8_STRING,                \
+                  8,                                       \
+                  PropModeReplace,                         \
+                  (unsigned char *)string,                 \
+                  cnt)
 
 /*
  * Local variables
  */
 
-static Ecore_Hash *startup_info = NULL;
+static Eina_Hash *startup_info = NULL;
 
 EAPI void
 ecore_x_netwm_init(void)
 {
-   startup_info = ecore_hash_new(ecore_direct_hash, ecore_direct_compare);
-   if (startup_info)
-     ecore_hash_free_value_cb_set(startup_info, _ecore_x_netwm_startup_info_free);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   startup_info = eina_hash_string_superfast_new(
+       _ecore_x_netwm_startup_info_free);
 }
 
 EAPI void
 ecore_x_netwm_shutdown(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (startup_info)
-     ecore_hash_destroy(startup_info);
+     eina_hash_free(startup_info);
+
    startup_info = NULL;
 }
 
@@ -78,85 +93,124 @@ ecore_x_netwm_shutdown(void)
  * WM identification
  */
 EAPI void
-ecore_x_netwm_wm_identify(Ecore_X_Window root, Ecore_X_Window check,
-                         const char *wm_name)
-{
-   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
-   ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
-   _ecore_x_window_prop_string_utf8_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
+ecore_x_netwm_wm_identify(Ecore_X_Window root,
+                          Ecore_X_Window check,
+                          const char *wm_name)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_window_set(check,
+                                  ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
+                                  &check,
+                                  1);
+   _ecore_x_window_prop_string_utf8_set(check,
+                                        ECORE_X_ATOM_NET_WM_NAME,
+                                        wm_name);
    /* This one isn't mandatory */
-   _ecore_x_window_prop_string_utf8_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
+   _ecore_x_window_prop_string_utf8_set(root,
+                                        ECORE_X_ATOM_NET_WM_NAME,
+                                        wm_name);
+   ecore_x_window_prop_window_set(root,
+                                  ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
+                                  &check,
+                                  1);
 }
 
 /*
  * Set supported atoms
  */
 EAPI void
-ecore_x_netwm_supported_set(Ecore_X_Window root, Ecore_X_Atom *supported, int num)
+ecore_x_netwm_supported_set(Ecore_X_Window root,
+                            Ecore_X_Atom *supported,
+                            int num)
 {
-   ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED, supported, num);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_atom_set(root,
+                                ECORE_X_ATOM_NET_SUPPORTED,
+                                supported,
+                                num);
 }
 
-EAPI int
-ecore_x_netwm_supported_get(Ecore_X_Window root, Ecore_X_Atom **supported, int *num)
+EAPI Eina_Bool
+ecore_x_netwm_supported_get(Ecore_X_Window root,
+                            Ecore_X_Atom **supported,
+                            int *num)
 {
-   int            num_ret;
+   int num_ret;
+
+   if (num)
+     *num = 0;
 
-   if (num) *num = 0;
-   if (supported) *supported = NULL;
+   if (supported)
+     *supported = NULL;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    num_ret = ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
-                                              supported);
+                                               supported);
    if (num_ret <= 0)
-      return 0;
+     return EINA_FALSE;
 
-   if (num) *num = num_ret;
-   return 1;
+   if (num)
+     *num = num_ret;
+
+   return EINA_TRUE;
 }
 
 /*
  * Desktop configuration and status
  */
 EAPI void
-ecore_x_netwm_desk_count_set(Ecore_X_Window root, unsigned int n_desks)
+ecore_x_netwm_desk_count_set(Ecore_X_Window root,
+                             unsigned int n_desks)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
-                                 &n_desks, 1);
+                                  &n_desks, 1);
 }
 
 EAPI void
 ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
-                            Ecore_X_Window *vroots, unsigned int n_desks)
+                             Ecore_X_Window *vroots,
+                             unsigned int n_desks)
 {
-   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS, vroots, n_desks);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ecore_x_window_prop_window_set(root,
+                                  ECORE_X_ATOM_NET_VIRTUAL_ROOTS,
+                                  vroots,
+                                  n_desks);
 }
 
 EAPI void
 ecore_x_netwm_desk_names_set(Ecore_X_Window root,
-                            const char **names, unsigned int n_desks)
+                             const char **names,
+                             unsigned int n_desks)
 {
-   char                ss[32], *buf;
-   const char         *s;
-   unsigned int        i;
-   int                 l, len;
+   char ss[32], *buf, *t;
+   const char *s;
+   unsigned int i;
+   int l, len;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    buf = NULL;
    len = 0;
 
    for (i = 0; i < n_desks; i++)
      {
-       s = (names) ? names[i] : NULL;
-       if (!s)
-         {
-            /* Default to "Desk-<number>" */
-            sprintf(ss, "Desk-%d", i);
-            s = ss;
-         }
-
-       l = strlen(s) + 1;
-       buf = realloc(buf, len + l);
-       memcpy(buf + len, s, l);
-       len += l;
+        s = (names) ? names[i] : NULL;
+        if (!s)
+          {
+             /* Default to "Desk-<number>" */
+             sprintf(ss, "Desk-%d", i);
+             s = ss;
+          }
+
+        l = strlen(s) + 1;
+        t = realloc(buf, len + l);
+        if (t)
+          {
+             buf = t;
+             memcpy(buf + len, s, l);
+          }
+        len += l;
      }
 
    _ATOM_SET_UTF8_STRING_LIST(root, ECORE_X_ATOM_NET_DESKTOP_NAMES, buf, len);
@@ -165,63 +219,95 @@ ecore_x_netwm_desk_names_set(Ecore_X_Window root,
 }
 
 EAPI void
-ecore_x_netwm_desk_size_set(Ecore_X_Window root, unsigned int width,
-                           unsigned int height)
+ecore_x_netwm_desk_size_set(Ecore_X_Window root,
+                            unsigned int width,
+                            unsigned int height)
 {
-   unsigned int        size[2];
+   unsigned int size[2];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    size[0] = width;
    size[1] = height;
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY, size,
-                                 2);
+                                  2);
 }
 
 EAPI void
 ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
-                                unsigned int *origins, unsigned int n_desks)
+                                 unsigned int *origins,
+                                 unsigned int n_desks)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
-                                 origins, 2 * n_desks);
+                                  origins, 2 * n_desks);
 }
 
 EAPI void
-ecore_x_netwm_desk_layout_set(Ecore_X_Window root, int orientation,
-                             int columns, int rows,
-                             int starting_corner)
+ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
+                              int orientation,
+                              int columns,
+                              int rows,
+                              int starting_corner)
 {
    unsigned int layout[4];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    layout[0] = orientation;
    layout[1] = columns;
    layout[2] = rows;
    layout[3] = starting_corner;
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
-                                 layout, 4);
+                                  layout, 4);
 }
 
 EAPI void
 ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
-                                unsigned int *areas, unsigned int n_desks)
+                                 unsigned int *areas,
+                                 unsigned int n_desks)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
-                                 4 * n_desks);
+                                  4 * n_desks);
+}
+
+EAPI unsigned int *
+ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks)
+{
+   int ret;
+   unsigned int *areas = NULL;
+
+   if (!root) root = DefaultRootWindow(_ecore_x_disp);
+
+   ret = ecore_x_window_prop_card32_list_get(root, ECORE_X_ATOM_NET_WORKAREA,
+                                             &areas);
+   if (!areas)
+     {
+        if (n_desks) *n_desks = 0;
+        return 0;
+     }
+   if (n_desks) *n_desks = ret / 4;
+   return areas;
 }
 
 EAPI void
-ecore_x_netwm_desk_current_set(Ecore_X_Window root, unsigned int desk)
+ecore_x_netwm_desk_current_set(Ecore_X_Window root,
+                               unsigned int desk)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP, &desk,
-                                 1);
+                                  1);
 }
 
 EAPI void
-ecore_x_netwm_showing_desktop_set(Ecore_X_Window root, int on)
+ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
+                                  Eina_Bool on)
 {
    unsigned int val;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    val = (on) ? 1 : 0;
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP, &val,
-                                 1);
+                                  1);
 }
 
 /*
@@ -231,36 +317,46 @@ ecore_x_netwm_showing_desktop_set(Ecore_X_Window root, int on)
 /* Mapping order */
 EAPI void
 ecore_x_netwm_client_list_set(Ecore_X_Window root,
-                             Ecore_X_Window *p_clients, unsigned int n_clients)
+                              Ecore_X_Window *p_clients,
+                              unsigned int n_clients)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
-                                 p_clients, n_clients);
+                                  p_clients, n_clients);
 }
 
 /* Stacking order */
 EAPI void
 ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
-                                      Ecore_X_Window *p_clients,
-                                      unsigned int n_clients)
+                                       Ecore_X_Window *p_clients,
+                                       unsigned int n_clients)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
-                                 p_clients, n_clients);
+                                  p_clients, n_clients);
 }
 
 EAPI void
-ecore_x_netwm_client_active_set(Ecore_X_Window root, Ecore_X_Window win)
+ecore_x_netwm_client_active_set(Ecore_X_Window root,
+                                Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_ACTIVE_WINDOW,
-                                 &win, 1);
+                                  &win, 1);
 }
 
 EAPI void
-ecore_x_netwm_client_active_request(Ecore_X_Window root, Ecore_X_Window win, int type, Ecore_X_Window current_win)
+ecore_x_netwm_client_active_request(Ecore_X_Window root,
+                                    Ecore_X_Window win,
+                                    int type,
+                                    Ecore_X_Window current_win)
 {
    XEvent xev;
 
-   if (!root) root = DefaultRootWindow(_ecore_x_disp);
-   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
+
    xev.xclient.type = ClientMessage;
    xev.xclient.display = _ecore_x_disp;
    xev.xclient.window = win;
@@ -271,117 +367,156 @@ ecore_x_netwm_client_active_request(Ecore_X_Window root, Ecore_X_Window win, int
    xev.xclient.data.l[2] = current_win;
    xev.xclient.data.l[3] = 0;
    xev.xclient.data.l[4] = 0;
-   xev.xclient.data.l[5] = 0;
 
-   XSendEvent(_ecore_x_disp, root, False, 
-             SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+   XSendEvent(_ecore_x_disp, root, False,
+              SubstructureRedirectMask | SubstructureNotifyMask, &xev);
 }
 
 EAPI void
-ecore_x_netwm_name_set(Ecore_X_Window win, const char *name)
+ecore_x_netwm_name_set(Ecore_X_Window win,
+                       const char *name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
 }
 
 EAPI int
-ecore_x_netwm_name_get(Ecore_X_Window win, char **name)
+ecore_x_netwm_name_get(Ecore_X_Window win,
+                       char **name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(win, ECORE_X_ATOM_NET_WM_NAME);
+     *name = _ecore_x_window_prop_string_utf8_get(win,
+                                                  ECORE_X_ATOM_NET_WM_NAME);
+
    return 1;
 }
 
 EAPI void
-ecore_x_netwm_startup_id_set(Ecore_X_Window win, const char *id)
+ecore_x_netwm_startup_id_set(Ecore_X_Window win,
+                             const char *id)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
 }
 
 EAPI int
-ecore_x_netwm_startup_id_get(Ecore_X_Window win, char **id)
+ecore_x_netwm_startup_id_get(Ecore_X_Window win,
+                             char **id)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (id)
-     *id = _ecore_x_window_prop_string_utf8_get(win, ECORE_X_ATOM_NET_STARTUP_ID);
+     *id = _ecore_x_window_prop_string_utf8_get(win,
+                                                ECORE_X_ATOM_NET_STARTUP_ID);
+
    return 1;
 }
 
 EAPI void
-ecore_x_netwm_visible_name_set(Ecore_X_Window win, const char *name)
+ecore_x_netwm_visible_name_set(Ecore_X_Window win,
+                               const char *name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
-                                       name);
+                                        name);
 }
 
 EAPI int
-ecore_x_netwm_visible_name_get(Ecore_X_Window win, char **name)
+ecore_x_netwm_visible_name_get(Ecore_X_Window win,
+                               char **name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(win,
-                                                 ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
+     *name = _ecore_x_window_prop_string_utf8_get(
+         win,
+         ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
+
    return 1;
 }
 
 EAPI void
-ecore_x_netwm_icon_name_set(Ecore_X_Window win, const char *name)
+ecore_x_netwm_icon_name_set(Ecore_X_Window win,
+                            const char *name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME,
-                                       name);
+                                        name);
 }
 
 EAPI int
-ecore_x_netwm_icon_name_get(Ecore_X_Window win, char **name)
+ecore_x_netwm_icon_name_get(Ecore_X_Window win,
+                            char **name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(win,
-                                                 ECORE_X_ATOM_NET_WM_ICON_NAME);
+     *name = _ecore_x_window_prop_string_utf8_get(
+         win,
+         ECORE_X_ATOM_NET_WM_ICON_NAME);
+
    return 1;
 }
 
 EAPI void
-ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win, const char *name)
+ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
+                                    const char *name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_window_prop_string_utf8_set(win,
-                                       ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
-                                       name);
+                                        ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
+                                        name);
 }
 
 EAPI int
-ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win, char **name)
+ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
+                                    char **name)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(win,
-                                                 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
+     *name = _ecore_x_window_prop_string_utf8_get(
+         win,
+         ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
+
    return 1;
 }
 
 EAPI void
-ecore_x_netwm_desktop_set(Ecore_X_Window win, unsigned int desk)
+ecore_x_netwm_desktop_set(Ecore_X_Window win,
+                          unsigned int desk)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
 }
 
-EAPI int
-ecore_x_netwm_desktop_get(Ecore_X_Window win, unsigned int *desk)
+EAPI Eina_Bool
+ecore_x_netwm_desktop_get(Ecore_X_Window win,
+                          unsigned int *desk)
 {
    int ret;
    unsigned int tmp;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
-                                       &tmp, 1);
+                                        &tmp, 1);
 
-   if (desk) *desk = tmp;
-   return ret == 1 ? 1 : 0;
+   if (desk)
+     *desk = tmp;
+
+   return ret == 1 ? EINA_TRUE : EINA_FALSE;
 }
 
 /*
  * _NET_WM_STRUT is deprecated
  */
 EAPI void
-ecore_x_netwm_strut_set(Ecore_X_Window win, int left, int right,
-                       int top, int bottom)
+ecore_x_netwm_strut_set(Ecore_X_Window win,
+                        int left,
+                        int right,
+                        int top,
+                        int bottom)
 {
    unsigned int strut[4];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    strut[0] = left;
    strut[1] = right;
    strut[2] = top;
@@ -392,32 +527,57 @@ ecore_x_netwm_strut_set(Ecore_X_Window win, int left, int right,
 /*
  * _NET_WM_STRUT is deprecated
  */
-EAPI int
-ecore_x_netwm_strut_get(Ecore_X_Window win, int *left, int *right,
-                       int *top, int *bottom)
+EAPI Eina_Bool
+ecore_x_netwm_strut_get(Ecore_X_Window win,
+                        int *left,
+                        int *right,
+                        int *top,
+                        int *bottom)
 {
    int ret = 0;
    unsigned int strut[4];
 
-   ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = ecore_x_window_prop_card32_get(win,
+                                        ECORE_X_ATOM_NET_WM_STRUT,
+                                        strut,
+                                        4);
    if (ret != 4)
-     return 0;
+     return EINA_FALSE;
 
-   if (left) *left = strut[0];
-   if (right) *right = strut[1];
-   if (top) *top = strut[2];
-   if (bottom) *bottom = strut[3];
-   return 1;
+   if (left)
+     *left = strut[0];
+
+   if (right)
+     *right = strut[1];
+
+   if (top)
+     *top = strut[2];
+
+   if (bottom)
+     *bottom = strut[3];
+
+   return EINA_TRUE;
 }
 
 EAPI void
-ecore_x_netwm_strut_partial_set(Ecore_X_Window win, int left, int right,
-                               int top, int bottom, int left_start_y, int left_end_y,
-                               int right_start_y, int right_end_y, int top_start_x,
-                               int top_end_x, int bottom_start_x, int bottom_end_x)
+ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
+                                int left,
+                                int right,
+                                int top,
+                                int bottom,
+                                int left_start_y,
+                                int left_end_y,
+                                int right_start_y,
+                                int right_end_y,
+                                int top_start_x,
+                                int top_end_x,
+                                int bottom_start_x,
+                                int bottom_end_x)
 {
    unsigned int strut[12];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    strut[0] = left;
    strut[1] = right;
    strut[2] = top;
@@ -430,57 +590,157 @@ ecore_x_netwm_strut_partial_set(Ecore_X_Window win, int left, int right,
    strut[9] = top_end_x;
    strut[10] = bottom_start_x;
    strut[11] = bottom_end_x;
-   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
-}
-
-EAPI int
-ecore_x_netwm_strut_partial_get(Ecore_X_Window win, int *left, int *right,
-                               int *top, int *bottom, int *left_start_y, int *left_end_y,
-                               int *right_start_y, int *right_end_y, int *top_start_x,
-                               int *top_end_x, int *bottom_start_x, int *bottom_end_x)
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
+                                  strut,
+                                  12);
+}
+
+EAPI Eina_Bool
+ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
+                                int *left,
+                                int *right,
+                                int *top,
+                                int *bottom,
+                                int *left_start_y,
+                                int *left_end_y,
+                                int *right_start_y,
+                                int *right_end_y,
+                                int *top_start_x,
+                                int *top_end_x,
+                                int *bottom_start_x,
+                                int *bottom_end_x)
 {
    int ret = 0;
    unsigned int strut[12];
 
-   ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = ecore_x_window_prop_card32_get(win,
+                                        ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
+                                        strut,
+                                        12);
    if (ret != 12)
-     return 0;
+     return EINA_FALSE;
 
-   if (left) *left = strut[0];
-   if (right) *right = strut[1];
-   if (top) *top = strut[2];
-   if (bottom) *bottom = strut[3];
-   if (left_start_y) *left_start_y = strut[4];
-   if (left_end_y) *left_end_y = strut[5];
-   if (right_start_y) *right_start_y = strut[6];
-   if (right_end_y) *right_end_y = strut[7];
-   if (top_start_x) *top_start_x = strut[8];
-   if (top_end_x) *top_end_x = strut[9];
-   if (bottom_start_x) *bottom_start_x = strut[10];
-   if (bottom_end_x) *bottom_end_x = strut[11];
-   return 1;
+   if (left)
+     *left = strut[0];
+
+   if (right)
+     *right = strut[1];
+
+   if (top)
+     *top = strut[2];
+
+   if (bottom)
+     *bottom = strut[3];
+
+   if (left_start_y)
+     *left_start_y = strut[4];
+
+   if (left_end_y)
+     *left_end_y = strut[5];
+
+   if (right_start_y)
+     *right_start_y = strut[6];
+
+   if (right_end_y)
+     *right_end_y = strut[7];
+
+   if (top_start_x)
+     *top_start_x = strut[8];
+
+   if (top_end_x)
+     *top_end_x = strut[9];
+
+   if (bottom_start_x)
+     *bottom_start_x = strut[10];
+
+   if (bottom_end_x)
+     *bottom_end_x = strut[11];
+
+   return EINA_TRUE;
 }
 
-EAPI int
-ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
+EAPI void
+ecore_x_netwm_icons_set(Ecore_X_Window win,
+                        Ecore_X_Icon *icon,
+                        int num)
 {
-   unsigned int  *data, *p;
-   unsigned int  *src;
-   unsigned int   len, icons, i;
-   int            num_ret;
+   unsigned int *data, *p, *p2;
+   unsigned int i, size, x, y;
+   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   size = 0;
+   for (i = 0; i < (unsigned int)num; i++)
+     {
+        size += 2 + (icon[i].width * icon[i].height);
+     }
+   data = malloc(size * sizeof(unsigned int));
+   if (!data) return;
+   p = data;
+   for (i = 0; i < (unsigned int)num; i++)
+     {
+        p[0] = icon[i].width;
+        p[1] = icon[i].height;
+        p += 2;
+        p2 = icon[i].data;
+        for (y = 0; y < icon[i].height; y++)
+          {
+             for (x = 0; x < icon[i].width; x++)
+               {
+                  unsigned int r, g, b, a;
+                  
+                  a = (*p2 >> 24) & 0xff;
+                  r = (*p2 >> 16) & 0xff;
+                  g = (*p2 >> 8 ) & 0xff;
+                  b = (*p2      ) & 0xff;
+                  if ((a > 0) && (a < 255))
+                    {
+                       // unpremul
+                       r = (r * 255) / a;
+                       g = (g * 255) / a;
+                       b = (b * 255) / a;
+                    }
+                  *p = (a << 24) | (r << 16) | (g << 8) | b;
+                  p++;
+                  p2++;
+               }
+          }
+     }
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON,
+                                  data, size);
+   free(data);
+}
 
-   if (num) *num = 0;
-   if (icon) *icon = NULL;
+EAPI Eina_Bool
+ecore_x_netwm_icons_get(Ecore_X_Window win,
+                        Ecore_X_Icon **icon,
+                        int *num)
+{
+   unsigned int *data, *p;
+   unsigned int *src;
+   unsigned int len, icons, i;
+   int num_ret;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (num)
+     *num = 0;
+
+   if (icon)
+     *icon = NULL;
 
    num_ret = ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON,
-                                                &data);
+                                                 &data);
    if (num_ret <= 0)
-     return 0;
-   if (!data) return 0;
+     return EINA_FALSE;
+
+   if (!data)
+     return EINA_FALSE;
+
    if (num_ret < 2)
      {
-       free(data);
-       return 0;
+        free(data);
+        return EINA_FALSE;
      }
 
    /* Check how many icons there are */
@@ -488,161 +748,201 @@ ecore_x_netwm_icons_get(Ecore_X_Window win, Ecore_X_Icon **icon, int *num)
    p = data;
    while (p)
      {
-       len = p[0] * p[1];
-       p += (len + 2);
-       if ((p - data) > num_ret)
-         {
-            free(data);
-            return 0;
-         }
-       icons++;
-
-       if ((p - data) == num_ret)
-         p = NULL;
+        len = p[0] * p[1];
+        p += (len + 2);
+        if ((p - data) > num_ret)
+          {
+             free(data);
+             return EINA_FALSE;
+          }
+
+        icons++;
+
+        if ((p - data) == num_ret)
+          p = NULL;
      }
-   if (num) *num = icons;
+   if (num)
+     *num = icons;
 
    /* If the user doesn't want the icons, return */
    if (!icon)
      {
-       free(data);
-       return 1;
+        free(data);
+        return EINA_TRUE;
      }
 
    /* Allocate memory */
    *icon = malloc(icons * sizeof(Ecore_X_Icon));
    if (!(*icon))
      {
-       free(data);
-       return 0;
+        free(data);
+        return EINA_FALSE;
      }
 
    /* Fetch the icons */
    p = data;
    for (i = 0; i < icons; i++)
      {
-       unsigned int *ps, *pd, *pe;
-       
-       len = p[0] * p[1];
-       ((*icon)[i]).width = p[0];
-       ((*icon)[i]).height = p[1];
-       src = &(p[2]);
-       ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
-       if (!((*icon)[i]).data)
-         {
-            while (i)
-              free(((*icon)[--i]).data);
-            free(*icon);
-            free(data);
-            return 0;
-         }
-
-       pd = ((*icon)[i]).data;
-       ps = src;
-       pe = ps + len;
-       for (; ps < pe; ps++)
-         {
-            unsigned int r, g, b, a;
-            
-            a = (*ps >> 24) & 0xff;
-            r = (((*ps >> 16) & 0xff) * a) / 255;
-            g = (((*ps >>  8) & 0xff) * a) / 255;
-            b = (((*ps      ) & 0xff) * a) / 255;
-            *pd = (a << 24) | (r << 16) | (g << 8) | (b);
-            pd++;
-         }
-       p += (len + 2);
+        unsigned int *ps, *pd, *pe;
+
+        len = p[0] * p[1];
+        ((*icon)[i]).width = p[0];
+        ((*icon)[i]).height = p[1];
+        src = &(p[2]);
+        ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
+        if (!((*icon)[i]).data)
+          {
+             while (i)
+               free(((*icon)[--i]).data);
+             free(*icon);
+             free(data);
+             return EINA_FALSE;
+          }
+
+        pd = ((*icon)[i]).data;
+        ps = src;
+        pe = ps + len;
+        for (; ps < pe; ps++)
+          {
+             unsigned int r, g, b, a;
+
+             a = (*ps >> 24) & 0xff;
+             r = (((*ps >> 16) & 0xff) * a) / 255;
+             g = (((*ps >> 8) & 0xff) * a) / 255;
+             b = (((*ps) & 0xff) * a) / 255;
+             *pd = (a << 24) | (r << 16) | (g << 8) | (b);
+             pd++;
+          }
+        p += (len + 2);
      }
 
    free(data);
 
-   return 1;
+   return EINA_TRUE;
 }
 
 EAPI void
-ecore_x_netwm_icon_geometry_set(Ecore_X_Window win, int x, int y, int width, int height)
+ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
+                                int x,
+                                int y,
+                                int width,
+                                int height)
 {
    unsigned int geometry[4];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    geometry[0] = x;
    geometry[1] = y;
    geometry[2] = width;
    geometry[3] = height;
-   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
+                                  geometry,
+                                  4);
 }
 
-EAPI int
-ecore_x_netwm_icon_geometry_get(Ecore_X_Window win, int *x, int *y, int *width, int *height)
+EAPI Eina_Bool
+ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
+                                int *x,
+                                int *y,
+                                int *width,
+                                int *height)
 {
    int ret;
    unsigned int geometry[4];
 
-   ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = ecore_x_window_prop_card32_get(win,
+                                        ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
+                                        geometry,
+                                        4);
    if (ret != 4)
-     return 0;
+     return EINA_FALSE;
 
-   if (x) *x = geometry[0];
-   if (y) *y = geometry[1];
-   if (width) *width = geometry[2];
-   if (height) *height = geometry[3];
-   return 1;
+   if (x)
+     *x = geometry[0];
+
+   if (y)
+     *y = geometry[1];
+
+   if (width)
+     *width = geometry[2];
+
+   if (height)
+     *height = geometry[3];
+
+   return EINA_TRUE;
 }
 
 EAPI void
-ecore_x_netwm_pid_set(Ecore_X_Window win, int pid)
+ecore_x_netwm_pid_set(Ecore_X_Window win,
+                      int pid)
 {
    unsigned int tmp;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    tmp = pid;
    ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID,
-                                 &tmp, 1);
+                                  &tmp, 1);
 }
 
-EAPI int
-ecore_x_netwm_pid_get(Ecore_X_Window win, int *pid)
+EAPI Eina_Bool
+ecore_x_netwm_pid_get(Ecore_X_Window win,
+                      int *pid)
 {
    int ret;
    unsigned int tmp;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID,
-                                       &tmp, 1);
-   if (pid) *pid = tmp;
-   return ret == 1 ? 1 : 0;
+                                        &tmp, 1);
+   if (pid)
+     *pid = tmp;
+
+   return ret == 1 ? EINA_TRUE : EINA_FALSE;
 }
 
 EAPI void
 ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
-                                 NULL, 0);
+                                  NULL, 0);
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
 {
    int ret = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
-                                       NULL, 0);
-   return ret == 0 ? 1 : 0;
+                                        NULL, 0);
+   return ret == 0 ? EINA_TRUE : EINA_FALSE;
 }
 
 EAPI void
-ecore_x_netwm_user_time_set(Ecore_X_Window win, unsigned int time)
+ecore_x_netwm_user_time_set(Ecore_X_Window win,
+                            unsigned int tim)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME,
-                                 &time, 1);
+                                  &tim, 1);
 }
 
-EAPI int
-ecore_x_netwm_user_time_get(Ecore_X_Window win, unsigned int *time)
+EAPI Eina_Bool
+ecore_x_netwm_user_time_get(Ecore_X_Window win,
+                            unsigned int *tim)
 {
    int ret;
    unsigned int tmp;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
-                                       &tmp, 1);
-   if (time) *time = tmp;
-   return ret == 1 ? 1 : 0;
+                                        &tmp, 1);
+   if (tim)
+     *tim = tmp;
+
+   return ret == 1 ? EINA_TRUE : EINA_FALSE;
 }
 
 Ecore_X_Window_State
@@ -679,51 +979,67 @@ _ecore_x_netwm_state_get(Ecore_X_Atom a)
 static Ecore_X_Atom
 _ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
 {
-   switch(s)
+   switch (s)
      {
       case ECORE_X_WINDOW_STATE_MODAL:
-        return ECORE_X_ATOM_NET_WM_STATE_MODAL;
+        return ECORE_X_ATOM_NET_WM_STATE_MODAL;
+
       case ECORE_X_WINDOW_STATE_STICKY:
-        return ECORE_X_ATOM_NET_WM_STATE_STICKY;
+        return ECORE_X_ATOM_NET_WM_STATE_STICKY;
+
       case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
-        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
+        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
+
       case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
-        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
+        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
+
       case ECORE_X_WINDOW_STATE_SHADED:
-        return ECORE_X_ATOM_NET_WM_STATE_SHADED;
+        return ECORE_X_ATOM_NET_WM_STATE_SHADED;
+
       case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
-        return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
+        return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
+
       case ECORE_X_WINDOW_STATE_SKIP_PAGER:
-        return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
+        return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
+
       case ECORE_X_WINDOW_STATE_HIDDEN:
-        return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
+        return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
+
       case ECORE_X_WINDOW_STATE_FULLSCREEN:
-        return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
+        return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
+
       case ECORE_X_WINDOW_STATE_ABOVE:
-        return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
+        return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
+
       case ECORE_X_WINDOW_STATE_BELOW:
-        return ECORE_X_ATOM_NET_WM_STATE_BELOW;
+        return ECORE_X_ATOM_NET_WM_STATE_BELOW;
+
       case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
-        return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
+        return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
+
       default:
-        return 0;
+        return 0;
      }
 }
 
 EAPI void
-ecore_x_netwm_window_state_set(Ecore_X_Window win, Ecore_X_Window_State *state, unsigned int num)
+ecore_x_netwm_window_state_set(Ecore_X_Window win,
+                               Ecore_X_Window_State *state,
+                               unsigned int num)
 {
-   Ecore_X_Atom  *set;
-   unsigned int   i;
+   Ecore_X_Atom *set;
+   unsigned int i;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!num)
      {
-       ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
-       return;
+        ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
+        return;
      }
 
    set = malloc(num * sizeof(Ecore_X_Atom));
-   if (!set) return;
+   if (!set)
+     return;
 
    for (i = 0; i < num; i++)
      set[i] = _ecore_x_netwm_state_atom_get(state[i]);
@@ -733,32 +1049,39 @@ ecore_x_netwm_window_state_set(Ecore_X_Window win, Ecore_X_Window_State *state,
    free(set);
 }
 
-EAPI int
-ecore_x_netwm_window_state_get(Ecore_X_Window win, Ecore_X_Window_State **state, unsigned int *num)
+EAPI Eina_Bool
+ecore_x_netwm_window_state_get(Ecore_X_Window win,
+                               Ecore_X_Window_State **state,
+                               unsigned int *num)
 {
-   int                   num_ret, i;
-   Ecore_X_Atom         *atoms;
+   int num_ret, i;
+   Ecore_X_Atom *atoms;
 
-   if (num) *num = 0;
-   if (state) *state = NULL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (num)
+     *num = 0;
+
+   if (state)
+     *state = NULL;
 
    num_ret = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE,
-                                              &atoms);
+                                               &atoms);
    if (num_ret <= 0)
-      return 0;
+     return EINA_FALSE;
 
    if (state)
      {
-       *state = malloc(num_ret * sizeof(Ecore_X_Window_State));
-       if (*state)
-         for (i = 0; i < num_ret; ++i)
-           (*state)[i] = _ecore_x_netwm_state_get(atoms[i]);
+        *state = malloc(num_ret * sizeof(Ecore_X_Window_State));
+        if (*state)
+          for (i = 0; i < num_ret; ++i)
+            (*state)[i] = _ecore_x_netwm_state_get(atoms[i]);
 
-       if (num) *num = num_ret;
+        if (num)
+          *num = num_ret;
      }
 
    free(atoms);
-   return 1;
+   return EINA_TRUE;
 }
 
 static Ecore_X_Window_Type
@@ -780,6 +1103,18 @@ _ecore_x_netwm_window_type_type_get(Ecore_X_Atom atom)
      return ECORE_X_WINDOW_TYPE_DIALOG;
    else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
      return ECORE_X_WINDOW_TYPE_NORMAL;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
+     return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
+     return ECORE_X_WINDOW_TYPE_POPUP_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
+     return ECORE_X_WINDOW_TYPE_TOOLTIP;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
+     return ECORE_X_WINDOW_TYPE_NOTIFICATION;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
+     return ECORE_X_WINDOW_TYPE_COMBO;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
+     return ECORE_X_WINDOW_TYPE_DND;
    else
      return ECORE_X_WINDOW_TYPE_UNKNOWN;
 }
@@ -790,23 +1125,49 @@ _ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
    switch (type)
      {
       case ECORE_X_WINDOW_TYPE_DESKTOP:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
+
       case ECORE_X_WINDOW_TYPE_DOCK:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
+
       case ECORE_X_WINDOW_TYPE_TOOLBAR:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
+
       case ECORE_X_WINDOW_TYPE_MENU:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
+
       case ECORE_X_WINDOW_TYPE_UTILITY:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
+
       case ECORE_X_WINDOW_TYPE_SPLASH:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
+
       case ECORE_X_WINDOW_TYPE_DIALOG:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
+
       case ECORE_X_WINDOW_TYPE_NORMAL:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
+
+      case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
+
+      case ECORE_X_WINDOW_TYPE_POPUP_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
+
+      case ECORE_X_WINDOW_TYPE_TOOLTIP:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
+
+      case ECORE_X_WINDOW_TYPE_NOTIFICATION:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
+
+      case ECORE_X_WINDOW_TYPE_COMBO:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
+
+      case ECORE_X_WINDOW_TYPE_DND:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
+
       default:
-        return 0;
+        return 0;
      }
 }
 
@@ -815,58 +1176,77 @@ _ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
  * , ECORE_X_WINDOW_TYPE_MENU or ECORE_X_WINDOW_TYPE_DIALOG
  */
 EAPI void
-ecore_x_netwm_window_type_set(Ecore_X_Window win, Ecore_X_Window_Type type)
+ecore_x_netwm_window_type_set(Ecore_X_Window win,
+                              Ecore_X_Window_Type type)
 {
    Ecore_X_Atom atom;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    atom = _ecore_x_netwm_window_type_atom_get(type);
    ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                               &atom, 1);
+                                &atom, 1);
 }
 
 /* FIXME: Maybe return 0 on some conditions? */
-EAPI int
-ecore_x_netwm_window_type_get(Ecore_X_Window win, Ecore_X_Window_Type *type)
+EAPI Eina_Bool
+ecore_x_netwm_window_type_get(Ecore_X_Window win,
+                              Ecore_X_Window_Type *type)
 {
-   int                  num;
-   Ecore_X_Atom        *atoms = NULL;
+   int num;
+   Ecore_X_Atom *atoms = NULL;
 
-   if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (type)
+     *type = ECORE_X_WINDOW_TYPE_NORMAL;
 
-   num = ecore_x_window_prop_atom_list_get(win, 
-                                          ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                                          &atoms);
+   num = ecore_x_window_prop_atom_list_get(win,
+                                           ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
+                                           &atoms);
    if ((type) && (num >= 1) && (atoms))
      *type = _ecore_x_netwm_window_type_type_get(atoms[0]);
 
    free(atoms);
-   if (num >= 1) return 1;
-   return 0;
+   if (num >= 1)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
 }
 
 EAPI int
-ecore_x_netwm_window_types_get(Ecore_X_Window win, Ecore_X_Window_Type **types)
+ecore_x_netwm_window_types_get(Ecore_X_Window win,
+                               Ecore_X_Window_Type **types)
 {
-   int                  num, i;
-   Ecore_X_Atom        *atoms = NULL;
+   int num, i;
+   Ecore_X_Atom *atoms = NULL;
    Ecore_X_Window_Type *atoms2 = NULL;
-   
-   if (types) *types = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (types)
+     *types = NULL;
+
    num = ecore_x_window_prop_atom_list_get(win,
-                                          ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                                          &atoms);
+                                           ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
+                                           &atoms);
    if ((num <= 0) || (!atoms))
      {
-       if (atoms) free(atoms);
-       return 0;
+        if (atoms)
+          free(atoms);
+
+        return 0;
      }
+
    atoms2 = malloc(num * sizeof(Ecore_X_Window_Type));
-   if (!atoms2) return 0;
+   if (!atoms2)
+     return 0;
+
    for (i = 0; i < num; i++)
      atoms2[i] = _ecore_x_netwm_window_type_type_get(atoms[i]);
    free(atoms);
-   if (types) *types = atoms2;
-   else free(atoms2);
+   if (types)
+     *types = atoms2;
+   else
+     free(atoms2);
+
    return num;
 }
 
@@ -876,39 +1256,58 @@ _ecore_x_netwm_action_atom_get(Ecore_X_Action action)
    switch (action)
      {
       case ECORE_X_ACTION_MOVE:
-        return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
+        return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
+
       case ECORE_X_ACTION_RESIZE:
-        return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
+        return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
+
       case ECORE_X_ACTION_MINIMIZE:
-        return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
+        return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
+
       case ECORE_X_ACTION_SHADE:
-        return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
+        return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
+
       case ECORE_X_ACTION_STICK:
-        return ECORE_X_ATOM_NET_WM_ACTION_STICK;
+        return ECORE_X_ATOM_NET_WM_ACTION_STICK;
+
       case ECORE_X_ACTION_MAXIMIZE_HORZ:
-        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
+        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
+
       case ECORE_X_ACTION_MAXIMIZE_VERT:
-        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
+        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
+
       case ECORE_X_ACTION_FULLSCREEN:
-        return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
+        return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
+
       case ECORE_X_ACTION_CHANGE_DESKTOP:
-        return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
+        return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
+
       case ECORE_X_ACTION_CLOSE:
-        return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
+        return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
+
+      case ECORE_X_ACTION_ABOVE:
+        return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
+
+      case ECORE_X_ACTION_BELOW:
+        return ECORE_X_ATOM_NET_WM_ACTION_BELOW;
+
       default:
-        return 0;
+        return 0;
      }
 }
 
 /* FIXME: Get complete list */
-EAPI int
-ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action)
+EAPI Eina_Bool
+ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
+                                   Ecore_X_Action action)
 {
-   int                  num, i, ret = 0;
-   Ecore_X_Atom        *atoms, atom;
+   int num, i;
+   Ecore_X_Atom *atoms, atom;
+   Eina_Bool ret = EINA_FALSE;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    num = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                                          &atoms);
+                                           &atoms);
    if (num <= 0)
      return ret;
 
@@ -916,11 +1315,11 @@ ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action)
 
    for (i = 0; i < num; ++i)
      {
-       if (atom == atoms[i])
-         {
-            ret = 1;
-            break;
-         }
+        if (atom == atoms[i])
+          {
+             ret = 1;
+             break;
+          }
      }
 
    free(atoms);
@@ -929,115 +1328,169 @@ ecore_x_netwm_allowed_action_isset(Ecore_X_Window win, Ecore_X_Action action)
 
 /* FIXME: Set complete list */
 EAPI void
-ecore_x_netwm_allowed_action_set(Ecore_X_Window win, Ecore_X_Action *action, unsigned int num)
+ecore_x_netwm_allowed_action_set(Ecore_X_Window win,
+                                 Ecore_X_Action *action,
+                                 unsigned int num)
 {
-   Ecore_X_Atom  *set;
-   unsigned int   i;
+   Ecore_X_Atom *set;
+   unsigned int i;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!num)
      {
-       ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
-       return;
+        ecore_x_window_prop_property_del(win,
+                                         ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
+        return;
      }
 
    set = malloc(num * sizeof(Ecore_X_Atom));
-   if (!set) return;
+   if (!set)
+     return;
 
    for (i = 0; i < num; i++)
      set[i] = _ecore_x_netwm_action_atom_get(action[i]);
 
-   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS, set, num);
+   ecore_x_window_prop_atom_set(win,
+                                ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
+                                set,
+                                num);
 
    free(set);
 }
 
-EAPI int
-ecore_x_netwm_allowed_action_get(Ecore_X_Window win, Ecore_X_Action **action, unsigned int *num)
+EAPI Eina_Bool
+ecore_x_netwm_allowed_action_get(Ecore_X_Window win,
+                                 Ecore_X_Action **action,
+                                 unsigned int *num)
 {
-   int                   num_ret, i;
-   Ecore_X_Atom         *atoms;
+   int num_ret, i;
+   Ecore_X_Atom *atoms;
 
-   if (num) *num = 0;
-   if (action) *action = NULL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (num)
+     *num = 0;
+
+   if (action)
+     *action = NULL;
 
-   num_ret = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
-                                              &atoms);
+   num_ret = ecore_x_window_prop_atom_list_get(
+       win,
+       ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
+       &atoms);
    if (num_ret <= 0)
-      return 0;
+     return EINA_FALSE;
 
    if (action)
      {
-       *action = malloc(num_ret * sizeof(Ecore_X_Action));
-       if (*action)
-         for (i = 0; i < num_ret; ++i)
-           (*action)[i] = _ecore_x_netwm_action_atom_get(atoms[i]);
+        *action = malloc(num_ret * sizeof(Ecore_X_Action));
+        if (*action)
+          for (i = 0; i < num_ret; ++i)
+            (*action)[i] = _ecore_x_netwm_action_atom_get(atoms[i]);
 
-       if (num) *num = num_ret;
+        if (num)
+          *num = num_ret;
      }
 
    free(atoms);
-   return 1;
+   return EINA_TRUE;
 }
 
 EAPI void
-ecore_x_netwm_opacity_set(Ecore_X_Window win, unsigned int opacity)
+ecore_x_netwm_opacity_set(Ecore_X_Window win,
+                          unsigned int opacity)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
-                                 &opacity, 1);
+                                  &opacity, 1);
 }
 
-EAPI int
-ecore_x_netwm_opacity_get(Ecore_X_Window win, unsigned int *opacity)
+EAPI Eina_Bool
+ecore_x_netwm_opacity_get(Ecore_X_Window win,
+                          unsigned int *opacity)
 {
    int ret;
    unsigned int tmp;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
-                                       &tmp, 1);
-   if (opacity) *opacity = tmp;
-   return ret == 1 ? 1 : 0;
+                                        &tmp, 1);
+   if (opacity)
+     *opacity = tmp;
+
+   return ret == 1 ? EINA_TRUE : EINA_FALSE;
 }
 
 EAPI void
-ecore_x_netwm_frame_size_set(Ecore_X_Window win, int fl, int fr, int ft, int fb)
+ecore_x_netwm_frame_size_set(Ecore_X_Window win,
+                             int fl,
+                             int fr,
+                             int ft,
+                             int fb)
 {
    unsigned int frames[4];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    frames[0] = fl;
    frames[1] = fr;
    frames[2] = ft;
    frames[3] = fb;
-   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames, 4);
+   ecore_x_window_prop_card32_set(win,
+                                  ECORE_X_ATOM_NET_FRAME_EXTENTS,
+                                  frames,
+                                  4);
 }
 
-EAPI int
-ecore_x_netwm_frame_size_get(Ecore_X_Window win, int *fl, int *fr, int *ft, int *fb)
+EAPI Eina_Bool
+ecore_x_netwm_frame_size_get(Ecore_X_Window win,
+                             int *fl,
+                             int *fr,
+                             int *ft,
+                             int *fb)
 {
    int ret = 0;
    unsigned int frames[4];
 
-   ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames, 4);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = ecore_x_window_prop_card32_get(win,
+                                        ECORE_X_ATOM_NET_FRAME_EXTENTS,
+                                        frames,
+                                        4);
    if (ret != 4)
-     return 0;
+     return EINA_FALSE;
 
-   if (fl) *fl = frames[0];
-   if (fr) *fr = frames[1];
-   if (ft) *ft = frames[2];
-   if (fb) *fb = frames[3];
-   return 1;
+   if (fl)
+     *fl = frames[0];
+
+   if (fr)
+     *fr = frames[1];
+
+   if (ft)
+     *ft = frames[2];
+
+   if (fb)
+     *fb = frames[3];
+
+   return EINA_TRUE;
 }
 
-EAPI int
-ecore_x_netwm_sync_counter_get(Ecore_X_Window win, Ecore_X_Sync_Counter *counter)
+EAPI Eina_Bool
+ecore_x_netwm_sync_counter_get(Ecore_X_Window win,
+                               Ecore_X_Sync_Counter *counter)
 {
-   int          ret;
+   int ret;
    unsigned int tmp;
 
-   ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
-                                       &tmp, 1);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   ret = ecore_x_window_prop_card32_get(
+       win,
+       ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
+       &tmp,
+       1);
+
+   if (counter)
+     *counter = tmp;
 
-   if (counter) *counter = tmp;
-   return ret == 1 ? 1 : 0;
+   return ret == 1 ? EINA_TRUE : EINA_FALSE;
 }
 
 EAPI void
@@ -1045,31 +1498,35 @@ ecore_x_netwm_ping_send(Ecore_X_Window win)
 {
    XEvent xev;
 
-   if (!win) return;
+   if (!win)
+     return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xev.xclient.type = ClientMessage;
    xev.xclient.display = _ecore_x_disp;
    xev.xclient.window = win;
    xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
    xev.xclient.format = 32;
    xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_PING;
-   xev.xclient.data.l[1] = CurrentTime;
+   xev.xclient.data.l[1] = _ecore_x_event_last_time;
    xev.xclient.data.l[2] = win;
    xev.xclient.data.l[3] = 0;
    xev.xclient.data.l[4] = 0;
-   xev.xclient.data.l[5] = 0;
 
    XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
 }
 
 EAPI void
-ecore_x_netwm_sync_request_send(Ecore_X_Window win, unsigned int serial)
+ecore_x_netwm_sync_request_send(Ecore_X_Window win,
+                                unsigned int serial)
 {
    XSyncValue value;
    XEvent xev;
 
-   if (!win) return;
+   if (!win)
+     return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSyncIntToValue(&value, (int)serial);
 
    xev.xclient.type = ClientMessage;
@@ -1078,7 +1535,7 @@ ecore_x_netwm_sync_request_send(Ecore_X_Window win, unsigned int serial)
    xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
    xev.xclient.format = 32;
    xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
-   xev.xclient.data.l[1] = CurrentTime;
+   xev.xclient.data.l[1] = _ecore_x_event_last_time;
    xev.xclient.data.l[2] = XSyncValueLow32(value);
    xev.xclient.data.l[3] = XSyncValueHigh32(value);
    xev.xclient.data.l[4] = 0;
@@ -1087,13 +1544,20 @@ ecore_x_netwm_sync_request_send(Ecore_X_Window win, unsigned int serial)
 }
 
 EAPI void
-ecore_x_netwm_state_request_send(Ecore_X_Window win, Ecore_X_Window root,
-                                Ecore_X_Window_State s1, Ecore_X_Window_State s2, int set)
+ecore_x_netwm_state_request_send(Ecore_X_Window win,
+                                 Ecore_X_Window root,
+                                 Ecore_X_Window_State s1,
+                                 Ecore_X_Window_State s2,
+                                 Eina_Bool set)
 {
    XEvent xev;
 
-   if (!win) return;
-   if (!root) root = DefaultRootWindow(_ecore_x_disp);
+   if (!win)
+     return;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
 
    xev.xclient.type = ClientMessage;
    xev.xclient.serial = 0;
@@ -1111,16 +1575,22 @@ ecore_x_netwm_state_request_send(Ecore_X_Window win, Ecore_X_Window root,
    xev.xclient.data.l[4] = 0;
 
    XSendEvent(_ecore_x_disp, root, False,
-             SubstructureNotifyMask | SubstructureRedirectMask, &xev);
+              SubstructureNotifyMask | SubstructureRedirectMask, &xev);
 }
 
 EAPI void
-ecore_x_netwm_desktop_request_send(Ecore_X_Window win, Ecore_X_Window root, unsigned int desktop)
+ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
+                                   Ecore_X_Window root,
+                                   unsigned int desktop)
 {
    XEvent xev;
 
-   if (!win) return;
-   if (!root) root = DefaultRootWindow(_ecore_x_disp);
+   if (!win)
+     return;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!root)
+     root = DefaultRootWindow(_ecore_x_disp);
 
    xev.xclient.type = ClientMessage;
    xev.xclient.serial = 0;
@@ -1132,83 +1602,121 @@ ecore_x_netwm_desktop_request_send(Ecore_X_Window win, Ecore_X_Window root, unsi
    xev.xclient.data.l[0] = desktop;
 
    XSendEvent(_ecore_x_disp, root, False,
-             SubstructureNotifyMask | SubstructureRedirectMask, &xev);
+              SubstructureNotifyMask | SubstructureRedirectMask, &xev);
+}
+
+EAPI void
+ecore_x_netwm_moveresize_request_send(Ecore_X_Window win,
+                                      int x,
+                                      int y,
+                                      Ecore_X_Netwm_Direction direction,
+                                      unsigned int button)
+{
+   XEvent xev;
+
+   if (!win)
+     return;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xev.xclient.window = win;
+   xev.xclient.type = ClientMessage;
+   xev.xclient.message_type = ECORE_X_ATOM_NET_WM_MOVERESIZE;
+   xev.xclient.format = 32;
+   xev.xclient.data.l[0] = x;
+   xev.xclient.data.l[1] = y;
+   xev.xclient.data.l[2] = direction;
+   xev.xclient.data.l[3] = button;
+   xev.xclient.data.l[4] = 1;
+
+   XSendEvent(_ecore_x_disp, win, False,
+              SubstructureNotifyMask | SubstructureRedirectMask, &xev);
 }
 
 int
-_ecore_x_netwm_startup_info_begin(Ecore_X_Window win, char *data)
+_ecore_x_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
+                                  char *data __UNUSED__)
 {
 #if 0
    Ecore_X_Startup_Info *info;
+   unsigned char *exists = 0;
+
+   if (!startup_info)
+     return 0;
 
-   if (!startup_info) return 0;
-   info = ecore_hash_get(startup_info, (void *)win);
+   info = eina_hash_find(startup_info, (void *)win);
    if (info)
      {
-       printf("Already got info for win: 0x%x\n", win);
-       _ecore_x_netwm_startup_info_free(info);
+        exists = 1;
+        WRN("Already got info for win: 0x%x", win);
+        _ecore_x_netwm_startup_info_free(info);
      }
+
    info = calloc(1, sizeof(Ecore_X_Startup_Info));
-   if (!info) return 0;
+   if (!info)
+     return 0;
+
    info->win = win;
    info->length = 0;
    info->buffer_size = 161;
    info->buffer = calloc(info->buffer_size, sizeof(char));
    if (!info->buffer)
      {
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
+        _ecore_x_netwm_startup_info_free(info);
+        return 0;
      }
+
    memcpy(info->buffer, data, 20);
    info->length += 20;
    info->buffer[info->length] = 0;
-   ecore_hash_set(startup_info, (void *)info->win, info);
+   if (exists)
+     eina_hash_modify(startup_info, (void *)info->win, info);
+   else
+     eina_hash_add(startup_info, (void *)info->win, info);
+
    if (strlen(info->buffer) != 20)
-     {
-       /* We have a '\0' in there, the message is done */
-       _ecore_x_netwm_startup_info_process(info);
-     }
-#else
-   win = 0;
-   data = NULL;
-#endif
+     /* We have a '\0' in there, the message is done */
+     _ecore_x_netwm_startup_info_process(info);
+
+#endif /* if 0 */
    return 1;
 }
 
 int
-_ecore_x_netwm_startup_info(Ecore_X_Window win, char *data)
+_ecore_x_netwm_startup_info(Ecore_X_Window win __UNUSED__,
+                            char *data __UNUSED__)
 {
 #if 0
    Ecore_X_Startup_Info *info;
    char *p;
 
-   if (!startup_info) return 0;
-   info = ecore_hash_get(startup_info, (void *)win);
-   if (!info) return 0;
+   if (!startup_info)
+     return 0;
+
+   info = eina_hash_find(startup_info, (void *)win);
+   if (!info)
+     return 0;
+
    if ((info->length + 20) > info->buffer_size)
      {
-       info->buffer_size += 160;
-       info->buffer = realloc(info->buffer, info->buffer_size * sizeof(char));
-       if (!info->buffer)
-         {
-            ecore_hash_remove(startup_info, (void *)info->win);
-            _ecore_x_netwm_startup_info_free(info);
-            return 0;
-         }
+        info->buffer_size += 160;
+        info->buffer = realloc(info->buffer, info->buffer_size * sizeof(char));
+        if (!info->buffer)
+          {
+             eina_hash_del(startup_info, (void *)info->win);
+             _ecore_x_netwm_startup_info_free(info);
+             return 0;
+          }
      }
+
    memcpy(info->buffer + info->length, data, 20);
    p = info->buffer + info->length;
    info->length += 20;
    info->buffer[info->length] = 0;
    if (strlen(p) != 20)
-     {
-       /* We have a '\0' in there, the message is done */
-       _ecore_x_netwm_startup_info_process(info);
-     }
-#else
-   win = 0;
-   data = NULL;
-#endif
+     /* We have a '\0' in there, the message is done */
+     _ecore_x_netwm_startup_info_process(info);
+
+#endif /* if 0 */
    return 1;
 }
 
@@ -1216,41 +1724,44 @@ _ecore_x_netwm_startup_info(Ecore_X_Window win, char *data)
  * Set UTF-8 string property
  */
 static void
-_ecore_x_window_prop_string_utf8_set(Ecore_X_Window win, Ecore_X_Atom atom,
-                                    const char *str)
+_ecore_x_window_prop_string_utf8_set(Ecore_X_Window win,
+                                     Ecore_X_Atom atom,
+                                     const char *str)
 {
    XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8,
-                  PropModeReplace, (unsigned char *)str, strlen(str));
+                   PropModeReplace, (unsigned char *)str, strlen(str));
 }
 
 /*
  * Get UTF-8 string property
  */
 static char *
-_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win, Ecore_X_Atom atom)
+_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win,
+                                     Ecore_X_Atom atom)
 {
-   char               *str;
-   unsigned char      *prop_ret;
-   Atom                type_ret;
-   unsigned long       bytes_after, num_ret;
-   int                 format_ret;
+   char *str;
+   unsigned char *prop_ret;
+   Atom type_ret;
+   unsigned long bytes_after, num_ret;
+   int format_ret;
 
    str = NULL;
    prop_ret = NULL;
    XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
-                     ECORE_X_ATOM_UTF8_STRING, &type_ret,
-                     &format_ret, &num_ret, &bytes_after, &prop_ret);
+                      ECORE_X_ATOM_UTF8_STRING, &type_ret,
+                      &format_ret, &num_ret, &bytes_after, &prop_ret);
    if (prop_ret && num_ret > 0 && format_ret == 8)
      {
-       str = malloc(num_ret + 1);
-       if (str)
-         {
-            memcpy(str, prop_ret, num_ret);
-            str[num_ret] = '\0';
-         }
+        str = malloc(num_ret + 1);
+        if (str)
+          {
+             memcpy(str, prop_ret, num_ret);
+             str[num_ret] = '\0';
+          }
      }
+
    if (prop_ret)
-      XFree(prop_ret);
+     XFree(prop_ret);
 
    return str;
 }
@@ -1263,71 +1774,73 @@ static int
 _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info)
 {
    Ecore_X_Event_Startup_Sequence *e;
-   int                             event;
-   char                           *p;
+   int event;
+   char *p;
 
    p = strchr(info->buffer, ':');
    if (!p)
      {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
+        eina_hash_del(startup_info, (void *)info->win);
+        _ecore_x_netwm_startup_info_free(info);
+        return 0;
      }
+
    *p = 0;
    if (!strcmp(info->buffer, "new"))
      {
-       if (info->init)
-         event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
-       else
-         event = ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
-       info->init = 1;
+        if (info->init)
+          event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
+        else
+          event = ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
+
+        info->init = 1;
      }
    else if (!strcmp(info->buffer, "change"))
-     {
-       event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
-     }
+     event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
    else if (!strcmp(info->buffer, "remove"))
      event = ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
    else
      {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
+        eina_hash_del(startup_info, (void *)info->win);
+        _ecore_x_netwm_startup_info_free(info);
+        return 0;
      }
 
    p++;
 
    if (!_ecore_x_netwm_startup_info_parse(info, p))
      {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
+        eina_hash_del(startup_info, (void *)info->win);
+        _ecore_x_netwm_startup_info_free(info);
+        return 0;
      }
 
    if (info->init)
      {
-       e = calloc(1, sizeof(Ecore_X_Event_Startup_Sequence));
-       if (!e)
-         {
-            ecore_hash_remove(startup_info, (void *)info->win);
-            _ecore_x_netwm_startup_info_free(info);
-            return 0;
-         }
-       e->win = info->win;
-       ecore_event_add(event, e, NULL, NULL);
+        e = calloc(1, sizeof(Ecore_X_Event_Startup_Sequence));
+        if (!e)
+          {
+             eina_hash_del(startup_info, (void *)info->win);
+             _ecore_x_netwm_startup_info_free(info);
+             return 0;
+          }
+
+        e->win = info->win;
+        ecore_event_add(event, e, NULL, NULL);
      }
 
    if (event == ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE)
      {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
+        eina_hash_del(startup_info, (void *)info->win);
+        _ecore_x_netwm_startup_info_free(info);
      }
    else
      {
-       /* Discard buffer */
-       info->length = 0;
-       info->buffer[0] = 0;
+        /* Discard buffer */
+        info->length = 0;
+        info->buffer[0] = 0;
      }
+
    return 1;
 }
 
@@ -1335,150 +1848,161 @@ _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info)
  * Parse startup info
  */
 static int
-_ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info, char *data)
+_ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
+                                  char *data)
 {
-
    while (*data)
      {
-       int in_quot_sing, in_quot_dbl, escaped;
-       char *p, *pp;
-       char *key;
-       char value[1024];
-
-       /* Skip space */
-       while (*data == ' ') data++;
-       /* Get key */
-       key = data;
-       data = strchr(key, '=');
-       if (!data) return 0;
-       *data = 0;
-       data++;
-
-       /* Get value */
-       p = data;
-       pp = value;
-       in_quot_dbl = 0;
-       in_quot_sing = 0;
-       escaped = 0;
-       while (*p)
-         {
-            if ((pp - value) >= 1024) return 0;
-            if (escaped)
-              {
-                 *pp = *p;
-                 pp++;
-                 escaped = 0;
-              }
-            else if (in_quot_sing)
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\'')
-                   in_quot_sing = 0;
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            else if (in_quot_dbl)
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\"')
-                   in_quot_dbl = 0;
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            else
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\'')
-                   in_quot_sing = 1;
-                 else if (*p == '\"')
-                   in_quot_dbl = 1;
-                 else if (*p == ' ')
-                   {
-                      break;
-                   }
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            p++;
-         }
-       if ((in_quot_dbl) || (in_quot_sing)) return 0;
-       data = p;
-       *pp = 0;
-
-       /* Parse info */
-       if (!strcmp(key, "ID"))
-         {
-            if ((info->id) && (strcmp(info->id, value))) return 0;
-            info->id = strdup(value);
-            p = strstr(value, "_TIME");
-            if (p)
-              {
-                 info->timestamp = atoi(p + 5);
-              }
-         }
-       else if (!strcmp(key, "NAME"))
-         {
-            if (info->name) free(info->name);
-            info->name = strdup(value);
-         }
-       else if (!strcmp(key, "SCREEN"))
-         {
-            info->screen = atoi(value);
-         }
-       else if (!strcmp(key, "BIN"))
-         {
-            if (info->bin) free(info->bin);
-            info->bin = strdup(value);
-         }
-       else if (!strcmp(key, "ICON"))
-         {
-            if (info->icon) free(info->icon);
-            info->icon = strdup(value);
-         }
-       else if (!strcmp(key, "DESKTOP"))
-         {
-            info->desktop = atoi(value);
-         }
-       else if (!strcmp(key, "TIMESTAMP"))
-         {
-            if (!info->timestamp)
-              info->timestamp = atoi(value);
-         }
-       else if (!strcmp(key, "DESCRIPTION"))
-         {
-            if (info->description) free(info->description);
-            info->description = strdup(value);
-         }
-       else if (!strcmp(key, "WMCLASS"))
-         {
-            if (info->wmclass) free(info->wmclass);
-            info->wmclass = strdup(value);
-         }
-       else if (!strcmp(key, "SILENT"))
-         {
-            info->silent = atoi(value);
-         }
-       else
-         {
-            printf("Ecore X Sequence, Unknown: %s=%s\n", key, value);
-         }
+        int in_quot_sing, in_quot_dbl, escaped;
+        char *p, *pp;
+        char *key;
+        char value[1024];
+
+        /* Skip space */
+        while (*data == ' ')
+          data++;
+        /* Get key */
+        key = data;
+        data = strchr(key, '=');
+        if (!data)
+          return 0;
+
+        *data = 0;
+        data++;
+
+        /* Get value */
+        p = data;
+        pp = value;
+        in_quot_dbl = 0;
+        in_quot_sing = 0;
+        escaped = 0;
+        while (*p)
+          {
+             if ((pp - value) >= 1024)
+               return 0;
+
+             if (escaped)
+               {
+                  *pp = *p;
+                  pp++;
+                  escaped = 0;
+               }
+             else if (in_quot_sing)
+               {
+                  if (*p == '\\')
+                    escaped = 1;
+                  else if (*p == '\'')
+                    in_quot_sing = 0;
+                  else
+                    {
+                       *pp = *p;
+                       pp++;
+                    }
+               }
+             else if (in_quot_dbl)
+               {
+                  if (*p == '\\')
+                    escaped = 1;
+                  else if (*p == '\"')
+                    in_quot_dbl = 0;
+                  else
+                    {
+                       *pp = *p;
+                       pp++;
+                    }
+               }
+             else
+               {
+                  if (*p == '\\')
+                    escaped = 1;
+                  else if (*p == '\'')
+                    in_quot_sing = 1;
+                  else if (*p == '\"')
+                    in_quot_dbl = 1;
+                  else if (*p == ' ')
+                    break;
+                  else
+                    {
+                       *pp = *p;
+                       pp++;
+                    }
+               }
+
+             p++;
+          }
+        if ((in_quot_dbl) || (in_quot_sing))
+          return 0;
+
+        data = p;
+        *pp = 0;
+
+        /* Parse info */
+        if (!strcmp(key, "ID"))
+          {
+             if ((info->id) && (strcmp(info->id, value)))
+               return 0;
+
+             info->id = strdup(value);
+             p = strstr(value, "_TIME");
+             if (p)
+               info->timestamp = atoi(p + 5);
+          }
+        else if (!strcmp(key, "NAME"))
+          {
+             if (info->name)
+               free(info->name);
+
+             info->name = strdup(value);
+          }
+        else if (!strcmp(key, "SCREEN"))
+          info->screen = atoi(value);
+        else if (!strcmp(key, "BIN"))
+          {
+             if (info->bin)
+               free(info->bin);
+
+             info->bin = strdup(value);
+          }
+        else if (!strcmp(key, "ICON"))
+          {
+             if (info->icon)
+               free(info->icon);
+
+             info->icon = strdup(value);
+          }
+        else if (!strcmp(key, "DESKTOP"))
+          info->desktop = atoi(value);
+        else if (!strcmp(key, "TIMESTAMP"))
+          {
+             if (!info->timestamp)
+               info->timestamp = atoi(value);
+          }
+        else if (!strcmp(key, "DESCRIPTION"))
+          {
+             if (info->description)
+               free(info->description);
+
+             info->description = strdup(value);
+          }
+        else if (!strcmp(key, "WMCLASS"))
+          {
+             if (info->wmclass)
+               free(info->wmclass);
+
+             info->wmclass = strdup(value);
+          }
+        else if (!strcmp(key, "SILENT"))
+          info->silent = atoi(value);
+        else
+          ERR("Ecore X Sequence, Unknown: %s=%s", key, value);
      }
-   if (!info->id) return 0;
+   if (!info->id)
+     return 0;
+
    return 1;
 }
-#endif
+
+#endif /* if 0 */
 
 /*
  * Free startup info struct
@@ -1489,32 +2013,71 @@ _ecore_x_netwm_startup_info_free(void *data)
    Ecore_X_Startup_Info *info;
 
    info = data;
-   if (!info) return;
-   if (info->buffer) free(info->buffer);
-   if (info->id) free(info->id);
-   if (info->name) free(info->name);
-   if (info->bin) free(info->bin);
-   if (info->icon) free(info->icon);
-   if (info->description) free(info->description);
-   if (info->wmclass) free(info->wmclass);
+   if (!info)
+     return;
+
+   if (info->buffer)
+     free(info->buffer);
+
+   if (info->id)
+     free(info->id);
+
+   if (info->name)
+     free(info->name);
+
+   if (info->bin)
+     free(info->bin);
+
+   if (info->icon)
+     free(info->icon);
+
+   if (info->description)
+     free(info->description);
+
+   if (info->wmclass)
+     free(info->wmclass);
+
    free(info);
 }
 
 /*
  * Is screen composited?
  */
-EAPI int
+EAPI Eina_Bool
 ecore_x_screen_is_composited(int screen)
 {
-   Ecore_X_Window      win;
-   Ecore_X_Atom        atom;
-   char                buf[32];
+   Ecore_X_Window win;
+   static Ecore_X_Atom atom = None;
+   char buf[32];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   snprintf(buf, sizeof(buf), "_NET_WM_CM_S%i", screen);
+   if (atom == None)
+     atom = XInternAtom(_ecore_x_disp, buf, False);
 
-   snprintf(buf, sizeof(buf), "_NET_WM_CM_S%d", screen);
-   atom = XInternAtom(_ecore_x_disp, buf, True);
-   if (atom == None) return 0;
+   if (atom == None)
+     return EINA_FALSE;
 
    win = XGetSelectionOwner(_ecore_x_disp, atom);
 
-   return win != None;
+   return (win != None) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_screen_is_composited_set(int screen,
+                                 Ecore_X_Window win)
+{
+   static Ecore_X_Atom atom = None;
+   char buf[32];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   snprintf(buf, sizeof(buf), "_NET_WM_CM_S%i", screen);
+   if (atom == None)
+     atom = XInternAtom(_ecore_x_disp, buf, False);
+
+   if (atom == None)
+     return;
+
+   XSetSelectionOwner(_ecore_x_disp, atom, win, _ecore_x_event_last_time);
 }
+
index 9911200..7b13615 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
  * @ingroup Ecore_X_Pixmap_Group
  */
 EAPI Ecore_X_Pixmap
-ecore_x_pixmap_new(Ecore_X_Window win, int w, int h, int dep)
+ecore_x_pixmap_new(Ecore_X_Window win,
+                   int w,
+                   int h,
+                   int dep)
 {
-   if (win == 0) win = DefaultRootWindow(_ecore_x_disp);
-   if (dep == 0) dep = DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp));
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);
+
+   if (dep == 0)
+     dep = DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp));
+
    return XCreatePixmap(_ecore_x_disp, win, w, h, dep);
 }
 
@@ -38,8 +50,9 @@ ecore_x_pixmap_new(Ecore_X_Window win, int w, int h, int dep)
  * @ingroup Ecore_X_Pixmap_Group
  */
 EAPI void
-ecore_x_pixmap_del(Ecore_X_Pixmap pmap)
+ecore_x_pixmap_free(Ecore_X_Pixmap pmap)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XFreePixmap(_ecore_x_disp, pmap);
 }
 
@@ -58,10 +71,17 @@ ecore_x_pixmap_del(Ecore_X_Pixmap pmap)
  * @ingroup Ecore_X_Pixmap_Group
  */
 EAPI void
-ecore_x_pixmap_paste(Ecore_X_Pixmap pmap, Ecore_X_Drawable dest, 
-                    Ecore_X_GC gc, int sx, int sy, 
-                    int w, int h, int dx, int dy)
+ecore_x_pixmap_paste(Ecore_X_Pixmap pmap,
+                     Ecore_X_Drawable dest,
+                     Ecore_X_GC gc,
+                     int sx,
+                     int sy,
+                     int w,
+                     int h,
+                     int dx,
+                     int dy)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XCopyArea(_ecore_x_disp, pmap, dest, gc, sx, sy, w, h, dx, dy);
 }
 
@@ -75,10 +95,15 @@ ecore_x_pixmap_paste(Ecore_X_Pixmap pmap, Ecore_X_Drawable dest,
  * @ingroup Ecore_X_Pixmap_Group
  */
 EAPI void
-ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h)
+ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap,
+                            int *x,
+                            int *y,
+                            int *w,
+                            int *h)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (pmap)
-      ecore_x_drawable_geometry_get(pmap, x, y, w, h);
+     ecore_x_drawable_geometry_get(pmap, x, y, w, h);
 }
 
 /**
@@ -90,6 +115,7 @@ ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h)
 EAPI int
 ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ecore_x_drawable_depth_get(pmap);
 }
 
index 9fcb649..f962ffb 100644 (file)
@@ -1,14 +1,11 @@
 #ifndef _ECORE_X_PRIVATE_H
 #define _ECORE_X_PRIVATE_H
 
-#include "config.h"
-
 #include <sys/param.h>
 #ifndef MAXHOSTNAMELEN
 #define MAXHOSTNAMELEN 256
-#endif
+#endif /* ifndef MAXHOSTNAMELEN */
 
-#define XK_MISCELLANY 1
 #include <X11/Xlib.h>
 #include <X11/Xproto.h>
 #include <X11/Xutil.h>
 #include <X11/extensions/dpms.h>
 #ifdef ECORE_XCURSOR
 #include <X11/Xcursor/Xcursor.h>
-#endif
+#endif /* ifdef ECORE_XCURSOR */
 #ifdef ECORE_XPRINT
 #include <X11/extensions/Print.h>
-#endif
+#endif /* ifdef ECORE_XPRINT */
 #ifdef ECORE_XINERAMA
 #include <X11/extensions/Xinerama.h>
-#endif
+#endif /* ifdef ECORE_XINERAMA */
 #ifdef ECORE_XRANDR
 #include <X11/extensions/Xrandr.h>
-#endif
+#endif /* ifdef ECORE_XRANDR */
 #ifdef ECORE_XSS
 #include <X11/extensions/scrnsaver.h>
-#endif
+#endif /* ifdef ECORE_XSS */
 #ifdef ECORE_XRENDER
 #include <X11/extensions/Xrender.h>
-#endif
+#endif /* ifdef ECORE_XRENDER */
 #ifdef ECORE_XFIXES
 #include <X11/extensions/Xfixes.h>
-#endif
+#endif /* ifdef ECORE_XFIXES */
 #ifdef ECORE_XCOMPOSITE
 #include <X11/extensions/Xcomposite.h>
-#endif
+#endif /* ifdef ECORE_XCOMPOSITE */
 #ifdef ECORE_XDAMAGE
 #include <X11/extensions/Xdamage.h>
-#endif
+#endif /* ifdef ECORE_XDAMAGE */
+#ifdef ECORE_XGESTURE
+#include <X11/extensions/gesture.h>
+#include <X11/extensions/gestureproto.h>
+#endif /* ifdef ECORE_XGESTURE */
 #ifdef ECORE_XDPMS
 #include <X11/extensions/dpms.h>
+#endif /* ifdef ECORE_XDPMS */
+#ifdef ECORE_XKB
+#include <X11/XKBlib.h>
+#endif /* ifdef ECORE_XKB */
+#ifdef ECORE_XI2
+#include <X11/extensions/XInput2.h>
+#endif /* ifdef ECORE_XI2 */
+
+#ifndef XK_MISCELLANY
+# define XK_MISCELLANY 1
 #endif
 
+#include "Ecore.h"
 #include "ecore_private.h"
 #include "Ecore_X.h"
+#include "Ecore_Input.h"
+
+extern int _ecore_xlib_log_dom;
+#ifdef ECORE_XLIB_DEFAULT_LOG_COLOR
+# undef ECORE_XLIB_DEFAULT_LOG_COLOR
+#endif /* ifdef ECORE_XLIB_DEFAULT_LOG_COLOR */
+#define ECORE_XLIB_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
+
+#ifdef ERR
+# undef ERR
+#endif /* ifdef ERR */
+#define ERR(...) EINA_LOG_DOM_ERR(_ecore_xlib_log_dom, __VA_ARGS__)
 
-/* FIXME: this is for simulation only */
-#include "Ecore_Txt.h"
+#ifdef DBG
+# undef DBG
+#endif /* ifdef DBG */
+#define DBG(...) EINA_LOG_DOM_DBG(_ecore_xlib_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif /* ifdef INF */
+#define INF(...) EINA_LOG_DOM_INFO(_ecore_xlib_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif /* ifdef WRN */
+#define WRN(...) EINA_LOG_DOM_WARN(_ecore_xlib_log_dom, __VA_ARGS__)
+
+#ifdef CRIT
+# undef CRIT
+#endif /* ifdef CRIT */
+#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_xlib_log_dom, __VA_ARGS__)
 
 typedef struct _Ecore_X_Selection_Intern Ecore_X_Selection_Intern;
 
 struct _Ecore_X_Selection_Intern
 {
-   Ecore_X_Window    win;
-   Ecore_X_Atom      selection;
-   unsigned char     *data;
-   int               length;
-   Time              time;
+   Ecore_X_Window win;
+   Ecore_X_Atom   selection;
+   unsigned char *data;
+   int            length;
+   Time           time;
 };
 
 typedef struct _Ecore_X_Selection_Converter Ecore_X_Selection_Converter;
 
 struct _Ecore_X_Selection_Converter
 {
-   Ecore_X_Atom target;
-   int (*convert)(char *target, void *data, int size, 
-                  void **data_ret, int *size_ret);
+   Ecore_X_Atom                 target;
+   Eina_Bool                    (*convert)(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *type, int *typeseize);
    Ecore_X_Selection_Converter *next;
 };
 
@@ -81,16 +121,16 @@ typedef struct _Ecore_X_Selection_Parser Ecore_X_Selection_Parser;
 
 struct _Ecore_X_Selection_Parser
 {
-   char     *target;
-   void *(*parse)(const char *target, void *data, int size, int format);
+   char                     *target;
+   void                     *(*parse)(const char *target, void *data, int size, int format);
    Ecore_X_Selection_Parser *next;
 };
 
-typedef struct _Ecore_X_DND_Source 
+typedef struct _Ecore_X_DND_Source
 {
-   int version;
+   int            version;
    Ecore_X_Window win, dest;
-   
+
    enum {
       ECORE_X_DND_SOURCE_IDLE,
       ECORE_X_DND_SOURCE_DRAGGING,
@@ -98,60 +138,71 @@ typedef struct _Ecore_X_DND_Source
       ECORE_X_DND_SOURCE_CONVERTING
    } state;
 
-   struct {
-      short x, y;
+   struct
+   {
+      short          x, y;
       unsigned short width, height;
    } rectangle;
 
-   Time time;
+   struct
+   {
+      Ecore_X_Window window;
+      int            x, y;
+   } prev;
+
+   Time         time;
 
    Ecore_X_Atom action, accepted_action;
-   
-   int will_accept;
-   int suppress;
 
-   int await_status;
+   int          will_accept;
+   int          suppress;
+
+   int          await_status;
 } Ecore_X_DND_Source;
 
-typedef struct _Ecore_X_DND_Target 
+typedef struct _Ecore_X_DND_Target
 {
-   int version;
+   int            version;
    Ecore_X_Window win, source;
-   
+
    enum {
       ECORE_X_DND_TARGET_IDLE,
       ECORE_X_DND_TARGET_ENTERED
    } state;
 
-   struct {
+   struct
+   {
       int x, y;
    } pos;
-   
-   Time time;
+
+   Time         time;
 
    Ecore_X_Atom action, accepted_action;
-   
-   int will_accept;
+
+   int          will_accept;
 } Ecore_X_DND_Target;
 
 extern Display *_ecore_x_disp;
-extern double   _ecore_x_double_click_time;
-extern Time     _ecore_x_event_last_time;
-extern Window   _ecore_x_event_last_win;
-extern int      _ecore_x_event_last_root_x;
-extern int      _ecore_x_event_last_root_y;
-extern int      _ecore_x_xcursor;
+extern double _ecore_x_double_click_time;
+extern Time _ecore_x_event_last_time;
+extern Window _ecore_x_event_last_win;
+extern int _ecore_x_event_last_root_x;
+extern int _ecore_x_event_last_root_y;
+extern Eina_Bool _ecore_x_xcursor;
 
-extern Ecore_X_Atom     _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM];
+extern Ecore_X_Atom _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM];
 
-extern int      _ecore_window_grabs_num;
-extern Window  *_ecore_window_grabs;
-extern int    (*_ecore_window_grab_replay_func) (void *data, int event_type, void *event);
-extern void    *_ecore_window_grab_replay_data;
+extern int _ecore_window_grabs_num;
+extern Window *_ecore_window_grabs;
+extern Eina_Bool (*_ecore_window_grab_replay_func)(void *data,
+                                                   int event_type,
+                                                   void *event);
+extern void *_ecore_window_grab_replay_data;
 
 extern Ecore_X_Window _ecore_x_private_win;
 
 void _ecore_x_error_handler_init(void);
+void _ecore_x_event_handle_any_event(XEvent *xevent);
 void _ecore_x_event_handle_key_press(XEvent *xevent);
 void _ecore_x_event_handle_key_release(XEvent *xevent);
 void _ecore_x_event_handle_button_press(XEvent *xevent);
@@ -161,7 +212,7 @@ void _ecore_x_event_handle_enter_notify(XEvent *xevent);
 void _ecore_x_event_handle_leave_notify(XEvent *xevent);
 void _ecore_x_event_handle_focus_in(XEvent *xevent);
 void _ecore_x_event_handle_focus_out(XEvent *xevent);
-void _ecore_x_event_handle_keymap_notify(XEvent *xevent);    
+void _ecore_x_event_handle_keymap_notify(XEvent *xevent);
 void _ecore_x_event_handle_expose(XEvent *xevent);
 void _ecore_x_event_handle_graphics_expose(XEvent *xevent);
 void _ecore_x_event_handle_visibility_notify(XEvent *xevent);
@@ -186,53 +237,143 @@ void _ecore_x_event_handle_client_message(XEvent *xevent);
 void _ecore_x_event_handle_mapping_notify(XEvent *xevent);
 void _ecore_x_event_handle_shape_change(XEvent *xevent);
 void _ecore_x_event_handle_screensaver_notify(XEvent *xevent);
+#ifdef ECORE_XGESTURE
+void _ecore_x_event_handle_gesture_notify_flick(XEvent *xevent);
+void _ecore_x_event_handle_gesture_notify_pan(XEvent *xevent);
+void _ecore_x_event_handle_gesture_notify_pinchrotation(XEvent *xevent);
+void _ecore_x_event_handle_gesture_notify_tap(XEvent *xevent);
+void _ecore_x_event_handle_gesture_notify_tapnhold(XEvent *xevent);
+void _ecore_x_event_handle_gesture_notify_hold(XEvent *xevent);
+void _ecore_x_event_handle_gesture_notify_group(XEvent *xevent);
+#endif /* ifdef ECORE_XGESTURE */
 void _ecore_x_event_handle_sync_counter(XEvent *xevent);
 void _ecore_x_event_handle_sync_alarm(XEvent *xevent);
 #ifdef ECORE_XRANDR
 void _ecore_x_event_handle_randr_change(XEvent *xevent);
-#endif
+void _ecore_x_event_handle_randr_notify(XEvent *xevent);
+#endif /* ifdef ECORE_XRANDR */
 #ifdef ECORE_XFIXES
 void _ecore_x_event_handle_fixes_selection_notify(XEvent *xevent);
-#endif
+#endif /* ifdef ECORE_XFIXES */
 #ifdef ECORE_XDAMAGE
-void _ecore_x_event_handle_damage_notify(XEvent *xevent);
-#endif
+void      _ecore_x_event_handle_damage_notify(XEvent *xevent);
+#endif /* ifdef ECORE_XDAMAGE */
+#ifdef ECORE_XKB
+void   _ecore_x_event_handle_xkb(XEvent *xevent);
+#endif  /* ifdef ECORE_XKB */
+void      _ecore_x_event_handle_generic_event(XEvent *xevent);
+
+void      _ecore_x_selection_data_init(void);
+void      _ecore_x_selection_shutdown(void);
+Ecore_X_Atom _ecore_x_selection_target_atom_get(const char *target);
+char     *_ecore_x_selection_target_get(Ecore_X_Atom target);
+Ecore_X_Selection_Intern *_ecore_x_selection_get(Ecore_X_Atom selection);
+Eina_Bool _ecore_x_selection_set(Window w,
+                                  const void *data,
+                                  int len,
+                                  Ecore_X_Atom selection);
+int _ecore_x_selection_convert(Ecore_X_Atom selection,
+                               Ecore_X_Atom target,
+                               void **data_ret,
+                               Ecore_X_Atom *targettype,
+                               int *targetsize);
+void *_ecore_x_selection_parse(const char *target,
+                               void *data,
+                               int size,
+                               int format);
 
-void  _ecore_x_selection_data_init(void);
-void  _ecore_x_selection_shutdown(void);
-Ecore_X_Atom
-      _ecore_x_selection_target_atom_get(const char *target);
-char *_ecore_x_selection_target_get(Ecore_X_Atom target);
-Ecore_X_Selection_Intern * 
-      _ecore_x_selection_get(Ecore_X_Atom selection);
-int   _ecore_x_selection_set(Window w, const void *data, int len, Ecore_X_Atom selection);
-int   _ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret);
-void *_ecore_x_selection_parse(const char *target, void *data, int size, int format);
-
-void _ecore_x_sync_magic_send(int val, Ecore_X_Window swin);
+void _ecore_x_sync_magic_send(int val,
+                              Ecore_X_Window swin);
 void _ecore_x_window_grab_remove(Ecore_X_Window win);
 void _ecore_x_key_grab_remove(Ecore_X_Window win);
 
 /* from dnd */
-void _ecore_x_dnd_init(void);
+void                _ecore_x_dnd_init(void);
 Ecore_X_DND_Source *_ecore_x_dnd_source_get(void);
 Ecore_X_DND_Target *_ecore_x_dnd_target_get(void);
-void _ecore_x_dnd_drag(Ecore_X_Window root, int x, int y);
+void                _ecore_x_dnd_drag(Ecore_X_Window root,
+                                      int x,
+                                      int y);
 void _ecore_x_dnd_shutdown(void);
 
 /* from netwm */
 Ecore_X_Window_State _ecore_x_netwm_state_get(Ecore_X_Atom a);
-int                  _ecore_x_netwm_startup_info_begin(Ecore_X_Window win, char *data);
-int                  _ecore_x_netwm_startup_info(Ecore_X_Window win, char *data);
+int                  _ecore_x_netwm_startup_info_begin(Ecore_X_Window win,
+                                                       char *data);
+int                  _ecore_x_netwm_startup_info(Ecore_X_Window win,
+                                                 char *data);
 
 /* Fixes * Damage * Composite * DPMS */
 void _ecore_x_fixes_init(void);
 void _ecore_x_damage_init(void);
 void _ecore_x_composite_init(void);
 void _ecore_x_dpms_init(void);
+void _ecore_x_randr_init(void);
+void _ecore_x_gesture_init(void);
 
 void _ecore_x_atoms_init(void);
-    
+
+extern int _ecore_x_xi2_opcode;
+
+void _ecore_x_events_init(void);
+void _ecore_x_events_shutdown(void);
+
+void _ecore_x_input_init(void);
+void _ecore_x_input_shutdown(void);
+void _ecore_x_input_handler(XEvent *xevent);
 /* from sync */
 
-#endif
+void _ecore_mouse_move(unsigned int timestamp,
+                       unsigned int xmodifiers,
+                       int x,
+                       int y,
+                       int x_root,
+                       int y_root,
+                       unsigned int event_window,
+                       unsigned int window,
+                       unsigned int root_win,
+                       int same_screen,
+                       int dev,
+                       double radx,
+                       double rady,
+                       double pressure,
+                       double angle,
+                       double mx,
+                       double my,
+                       double mrx,
+                       double mry);
+Ecore_Event_Mouse_Button *_ecore_mouse_button(int event,
+                                              unsigned int timestamp,
+                                              unsigned int xmodifiers,
+                                              unsigned int buttons,
+                                              int x,
+                                              int y,
+                                              int x_root,
+                                              int y_root,
+                                              unsigned int event_window,
+                                              unsigned int window,
+                                              unsigned int root_win,
+                                              int same_screen,
+                                              int dev,
+                                              double radx,
+                                              double rady,
+                                              double pressure,
+                                              double angle,
+                                              double mx,
+                                              double my,
+                                              double mrx,
+                                              double mry);
+
+void _ecore_x_modifiers_get(void);
+KeySym _ecore_x_XKeycodeToKeysym(Display *display, KeyCode keycode, int index);
+
+//#define LOGFNS 1
+
+#ifdef LOGFNS
+#include <stdio.h>
+#define LOGFN(fl, ln, fn) printf("-ECORE-X: %25s: %5i - %s\n", fl, ln, fn);
+#else /* ifdef LOGFNS */
+#define LOGFN(fl, ln, fn)
+#endif /* ifdef LOGFNS */
+
+#endif /* ifndef _ECORE_X_PRIVATE_H */
index 3509957..58a2830 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
 
 #include "ecore_x_private.h"
+#include "ecore_x_randr.h"
 
-EAPI int
-ecore_x_randr_query()
-{
+static Eina_Bool _randr_available = EINA_FALSE;
 #ifdef ECORE_XRANDR
-   int randr_base = 0;
-   int randr_err_base = 0;
+static int _randr_major, _randr_minor;
+int _randr_version;
+#define RANDR_1_1           ((1 << 16) | 1)
+#define RANDR_1_2           ((1 << 16) | 2)
+#define RANDR_1_3           ((1 << 16) | 3)
 
-   if (XRRQueryExtension(_ecore_x_disp, &randr_base, &randr_err_base))
-     return 1;
-   else
-     return 0;
-#else
-   return 0;
-#endif
-}
+#define RANDR_VALIDATE_ROOT(screen,                                  \
+                            root) ((screen =                         \
+                                      XRRRootToScreen(_ecore_x_disp, \
+                                                      root)) != -1)
 
-EAPI int
-ecore_x_randr_events_select(Ecore_X_Window win, int on)
-{
-#ifdef ECORE_XRANDR
-   if (on)
-     XRRSelectInput(_ecore_x_disp, win, RRScreenChangeNotifyMask);
-   else
-     XRRSelectInput(_ecore_x_disp, win, 0);
+#define Ecore_X_Randr_Unset -1
 
-   return 1;
-#else
-   return 0;
-#endif
-}
+XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display * dpy,
+                                                           Window window);
 
-EAPI Ecore_X_Randr_Rotation
-ecore_x_randr_screen_rotations_get(Ecore_X_Window root)
-{
-#ifdef ECORE_XRANDR
-   Rotation rot, crot;
-   
-   rot = XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &crot);
-   return rot;
-#else
-   return 0;
-#endif   
-}
+#endif /* ifdef ECORE_XRANDR */
 
-EAPI Ecore_X_Randr_Rotation
-ecore_x_randr_screen_rotation_get(Ecore_X_Window root)
+void
+_ecore_x_randr_init(void)
 {
 #ifdef ECORE_XRANDR
-   Rotation rot, crot = 0;
-   
-   rot = XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &crot);
-   return crot;
-#else
-   return 0;
-#endif   
-}
-
-EAPI void
-ecore_x_randr_screen_rotation_set(Ecore_X_Window root, Ecore_X_Randr_Rotation rot)
-{
-#ifdef ECORE_XRANDR
-   XRRScreenConfiguration *xrrcfg;
-   SizeID sizeid;
-   Rotation crot;
-   
-   xrrcfg = XRRGetScreenInfo(_ecore_x_disp, root);
-   if (!xrrcfg) return;
-   sizeid = XRRConfigCurrentConfiguration(xrrcfg, &crot);
-   XRRSetScreenConfig(_ecore_x_disp, xrrcfg, root, sizeid, rot, CurrentTime);
-   XRRFreeScreenConfigInfo(xrrcfg);
-#endif   
-}
-
-EAPI Ecore_X_Screen_Size *
-ecore_x_randr_screen_sizes_get(Ecore_X_Window root, int *num)
-{
-#ifdef ECORE_XRANDR
-   Ecore_X_Screen_Size *ret;
-   XRRScreenSize *sizes;
-   int i, n;
+   _randr_major = 1;
+   _randr_minor = 3;
+   _randr_version = 0;
 
-   if (num) *num = 0;
-
-   /* we don't have to free sizes, no idea why not */
-   sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
-   ret = calloc(n, sizeof(Ecore_X_Screen_Size));
-   if (!ret) return NULL;
-
-   if (num) *num = n;
-   for (i = 0; i < n; i++)
+   _ecore_x_randr_get_screen_resources = NULL;
+   if (XRRQueryVersion(_ecore_x_disp, &_randr_major, &_randr_minor))
      {
-       ret[i].width = sizes[i].width;
-       ret[i].height = sizes[i].height;
-     }
-   return ret;
-#else
-   if (num) *num = 0;
-   return NULL;
-#endif
-}
-
-EAPI Ecore_X_Screen_Size
-ecore_x_randr_current_screen_size_get(Ecore_X_Window root)
-{
-   Ecore_X_Screen_Size ret = { -1, -1 };
-#ifdef ECORE_XRANDR
-   XRRScreenSize *sizes;
-   XRRScreenConfiguration *sc;
-   SizeID size_index;
-   Rotation rotation;
-   int n;
+        _randr_version = (_randr_major << 16) | _randr_minor;
+        if (_randr_version >= RANDR_1_3)
+          _ecore_x_randr_get_screen_resources = XRRGetScreenResourcesCurrent;
+        else if (_randr_version == RANDR_1_2)
+          _ecore_x_randr_get_screen_resources = XRRGetScreenResources;
 
-   sc = XRRGetScreenInfo(_ecore_x_disp, root);
-   if (!sc)
-     {
-       printf("ERROR: Couldn't get screen information for %d\n", root);
-       return ret;
+        _randr_available = EINA_TRUE;
      }
-   size_index = XRRConfigCurrentConfiguration(sc, &rotation);
-
-   sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
-   if (size_index < n)
-     {
-       ret.width = sizes[size_index].width;
-       ret.height = sizes[size_index].height;
-     }
-   XRRFreeScreenConfigInfo(sc);
-#endif
-   return ret;
-}
-
-EAPI int
-ecore_x_randr_screen_size_set(Ecore_X_Window root, Ecore_X_Screen_Size size)
-{
-#ifdef ECORE_XRANDR
-   XRRScreenConfiguration *sc;
-   XRRScreenSize *sizes;
-   int i, n, size_index = -1;
+   else
+     _randr_available = EINA_FALSE;
 
-   sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
-   for (i = 0; i < n; i++)
-     {
-       if ((sizes[i].width == size.width) && (sizes[i].height == size.height))
-         {
-            size_index = i;
-            break;
-         }
-     }
-   if (size_index == -1) return 0;
-   
-   sc = XRRGetScreenInfo(_ecore_x_disp, root);
-   if (XRRSetScreenConfig(_ecore_x_disp, sc,
-                         root, size_index,
-                         RR_Rotate_0, CurrentTime))
-     {
-       printf("ERROR: Can't set new screen size!\n");
-       XRRFreeScreenConfigInfo(sc);
-       return 0;
-     }
-   XRRFreeScreenConfigInfo(sc);
-   return 1;
 #else
-   return 0;
+   _randr_available = EINA_FALSE;
 #endif
 }
 
-EAPI Ecore_X_Screen_Refresh_Rate
-ecore_x_randr_current_screen_refresh_rate_get(Ecore_X_Window root)
+/*
+ * @brief Query whether randr is available or not.
+ *
+ * @return @c EINA_TRUE, if extension is available, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_randr_query(void)
 {
-   Ecore_X_Screen_Refresh_Rate ret = { -1 };
-#ifdef ECORE_XRANDR
-   XRRScreenConfiguration *sc;
-
-   sc = XRRGetScreenInfo(_ecore_x_disp, root);
-   if (!sc)
-     {
-       printf("ERROR: Couldn't get screen information for %d\n", root);
-       return ret;
-     }
-   ret.rate = XRRConfigCurrentRate(sc);
-   XRRFreeScreenConfigInfo(sc);   
-#endif
-   return ret;
+   return _randr_available;
 }
 
-EAPI Ecore_X_Screen_Refresh_Rate *
-ecore_x_randr_screen_refresh_rates_get(Ecore_X_Window root, int size_id, int *num)
+/*
+ * @return version of the RandR extension supported by the server or, in case
+ * RandR extension is not available, Ecore_X_Randr_Unset (=-1).
+ * bit version information: 31   MAJOR   16 | 15   MINOR   0
+ */
+EAPI int
+ecore_x_randr_version_get(void)
 {
 #ifdef ECORE_XRANDR
-   Ecore_X_Screen_Refresh_Rate *ret = NULL;
-   XRRScreenConfiguration *sc;   
-   short *rates;
-   int i, n;
-
-   if (num) *num = 0;
-
-   sc = XRRGetScreenInfo(_ecore_x_disp, root);
-   if (!sc)
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (_randr_available)
      {
-       printf("ERROR: Couldn't get screen information for %d\n", root);
-       return ret;
+        return _randr_version;
      }
-   
-   rates = XRRRates(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), size_id, &n);
-   ret = calloc(n, sizeof(Ecore_X_Screen_Refresh_Rate));
-   if (!ret) 
-     { 
-       XRRFreeScreenConfigInfo(sc);
-       return NULL;
-     }
-   
-   if (num) *num = n;
-   for (i = 0; i < n; i++)
+   else
      {
-       ret[i].rate = rates[i];
+        return Ecore_X_Randr_Unset;
      }
-   XRRFreeScreenConfigInfo(sc);   
-   return ret;
 #else
-   if (num) *num = 0;   
-   return NULL;
+   return -1;
 #endif
 }
 
-EAPI int
-ecore_x_randr_screen_refresh_rate_set(Ecore_X_Window root, Ecore_X_Screen_Size size, Ecore_X_Screen_Refresh_Rate rate)
+Eina_Bool
+_ecore_x_randr_root_validate(Ecore_X_Window root)
 {
 #ifdef ECORE_XRANDR
-   XRRScreenConfiguration *sc;
-   XRRScreenSize *sizes;
-   int i, n, size_index = -1;
+   Ecore_X_Randr_Screen scr = -1;
+   if (root && RANDR_VALIDATE_ROOT(scr, root))
+     return EINA_TRUE;
+   else
+     return EINA_FALSE;
 
-   sizes = XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp, root), &n);
-   for (i = 0; i < n; i++)
-     {
-       if ((sizes[i].width == size.width) && (sizes[i].height == size.height))
-         {
-            size_index = i;
-            break;
-         }
-     }
-   if (size_index == -1) return 0;
-   
-   sc = XRRGetScreenInfo(_ecore_x_disp, root);
-   if (XRRSetScreenConfigAndRate(_ecore_x_disp, sc,
-                                root, size_index,
-                                RR_Rotate_0, rate.rate, CurrentTime))
-     {
-       printf("ERROR: Can't set new screen size and refresh rate!\n");
-       XRRFreeScreenConfigInfo(sc);
-       return 0;
-     }
-   XRRFreeScreenConfigInfo(sc);
-   return 1;
 #else
-   return 1;
+   return EINA_FALSE;
 #endif
 }
+
diff --git a/src/lib/ecore_x/xlib/ecore_x_randr.h b/src/lib/ecore_x/xlib/ecore_x_randr.h
new file mode 100644 (file)
index 0000000..eca3c0c
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef ECORE_X_INLINE_X
+#define ECORE_X_INLINE_X
+Eina_Bool _ecore_x_randr_root_validate(Ecore_X_Window root);
+Eina_Bool _ecore_x_randr_output_validate(Ecore_X_Window root,
+                                         Ecore_X_Randr_Output
+                                         output);
+#endif
diff --git a/src/lib/ecore_x/xlib/ecore_x_randr_11.c b/src/lib/ecore_x/xlib/ecore_x_randr_11.c
new file mode 100644 (file)
index 0000000..7d2b3b3
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+ * vim:ts=8:sw=3:sts=8:expandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include "ecore_x_private.h"
+#include "ecore_x_randr.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#define Ecore_X_Randr_None 0
+#ifdef ECORE_XRANDR
+
+#define RANDR_1_1          ((1 << 16) | 1)
+
+#define RANDR_VALIDATE_ROOT(screen,                                  \
+                            root) ((screen =                         \
+                                      XRRRootToScreen(_ecore_x_disp, \
+                                                      root)) != -1)
+#define RANDR_CHECK_1_1_RET(ret)  if (_randr_version < RANDR_1_1) \
+    return ret
+
+extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
+                                                                  dpy,
+                                                                  Window
+                                                                  window);
+extern int _randr_version;
+#endif /* ifdef ECORE_XRANDR */
+
+/*
+ * @param root window which's primary output will be queried
+ */
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_screen_primary_output_orientations_get(Ecore_X_Window root)
+{
+#ifdef ECORE_XRANDR
+   Rotation rot = Ecore_X_Randr_None, crot;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   rot =
+     XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
+                                                 root), &crot);
+   return rot;
+#else /* ifdef ECORE_XRANDR */
+   return Ecore_X_Randr_None;
+#endif /* ifdef ECORE_XRANDR */
+}
+
+/*
+ * @param root window which's primary output will be queried
+ * @return the current orientation of the root window's screen primary output
+ */
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_screen_primary_output_orientation_get(Ecore_X_Window root)
+{
+#ifdef ECORE_XRANDR
+   Rotation crot = Ecore_X_Randr_None;
+   XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
+                                               root), &crot);
+   return crot;
+#else /* ifdef ECORE_XRANDR */
+   return Ecore_X_Randr_None;
+#endif /* ifdef ECORE_XRANDR */
+}
+
+/*
+ * @brief Sets a given screen's primary output's orientation.
+ *
+ * @param root Window which's screen's primary output will be queried.
+ * @param orientation orientation which should be set for the root window's
+ * screen primary output.
+ * @return @c EINA_TRUE if the primary output's orientation could be
+ * successfully altered.
+ */
+EAPI Eina_Bool
+ecore_x_randr_screen_primary_output_orientation_set(
+  Ecore_X_Window root,
+  Ecore_X_Randr_Orientation
+  orientation)
+{
+#ifdef ECORE_XRANDR
+   XRRScreenConfiguration *xrr_screen_cfg = NULL;
+   int sizeid;
+   Rotation crot;
+   Eina_Bool ret = EINA_FALSE;
+   if (!(xrr_screen_cfg = XRRGetScreenInfo(_ecore_x_disp, root)))
+     return EINA_FALSE;
+
+   sizeid = XRRConfigCurrentConfiguration(xrr_screen_cfg, &crot);
+   if (!XRRSetScreenConfig(_ecore_x_disp, xrr_screen_cfg, root, sizeid,
+                           orientation, CurrentTime))
+     ret = EINA_TRUE;
+
+   if (xrr_screen_cfg)
+     XRRFreeScreenConfigInfo(xrr_screen_cfg);
+
+   return ret;
+#else /* ifdef ECORE_XRANDR */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XRANDR */
+}
+
+/*
+ * @brief gets a screen's primary output's possible sizes
+ * @param root window which's primary output will be queried
+ * @param num number of sizes reported as supported by the screen's primary output
+ * @return an array of sizes reported as supported by the screen's primary output or - if query failed - NULL
+ */
+EAPI Ecore_X_Randr_Screen_Size_MM *
+ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root,
+                                              int *num)
+{
+#ifdef ECORE_XRANDR
+   Ecore_X_Randr_Screen_Size_MM *ret = NULL;
+   XRRScreenSize *sizes;
+   int i, n;
+
+   /* we don't have to free sizes, because they're hold in a cache inside X*/
+   sizes =
+     XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
+                                             root), &n);
+   if ((!sizes) || (n <= 0)) return NULL;
+   ret = calloc(n, sizeof(Ecore_X_Randr_Screen_Size_MM));
+   if (!ret)
+     return NULL;
+
+   if (num)
+     *num = n;
+
+   for (i = 0; i < n; i++)
+     {
+        ret[i].width = sizes[i].width;
+        ret[i].height = sizes[i].height;
+        ret[i].width_mm = sizes[i].mwidth;
+        ret[i].height_mm = sizes[i].mheight;
+     }
+   return ret;
+#else /* ifdef ECORE_XRANDR */
+   return NULL;
+#endif /* ifdef ECORE_XRANDR */
+}
+
+EAPI void
+ecore_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root,
+                                                     int *w,
+                                                     int *h,
+                                                     int *w_mm,
+                                                     int *h_mm,
+                                                     int *size_index)
+{
+#ifdef ECORE_XRANDR
+   XRRScreenSize *sizes;
+   XRRScreenConfiguration *sc = NULL;
+   int idx;
+   Rotation orientation;
+   int n;
+
+   if (!(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
+     {
+        ERR("Couldn't get screen information for %d", root);
+        return;
+     }
+
+   idx = XRRConfigCurrentConfiguration(sc, &orientation);
+
+   sizes =
+     XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
+                                             root), &n);
+   if ((idx < n) && (idx >= 0))
+     {
+        if (w)
+          *w = sizes[idx].width;
+
+        if (h)
+          *h = sizes[idx].height;
+
+        if (w_mm)
+          *w_mm = sizes[idx].mwidth;
+
+        if (h_mm)
+          *h_mm = sizes[idx].mheight;
+
+        if (size_index)
+          *size_index = idx;
+     }
+
+   XRRFreeScreenConfigInfo(sc);
+#endif /* ifdef ECORE_XRANDR */
+}
+
+/*
+ * @brief Sets a given screen's primary output size, but disables all other
+ * outputs at the same time.
+ *
+ * @param root Window which's primary output will be queried.
+ * @param size_index Within the list of sizes reported as supported by the root
+ * window's screen primary output.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure due to e.g.
+ * invalid times.
+ */
+EAPI Eina_Bool
+ecore_x_randr_screen_primary_output_size_set(Ecore_X_Window root,
+                                             int size_index)
+{
+#ifdef ECORE_XRANDR
+   XRRScreenConfiguration *sc = NULL;
+   Eina_Bool ret = EINA_FALSE;
+   int nsizes = 0;
+
+   if (size_index >= 0 && _ecore_x_randr_root_validate(root))
+     {
+        XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
+                                                  root), &nsizes);
+
+        if (size_index < nsizes)
+          {
+             sc = XRRGetScreenInfo(_ecore_x_disp, root);
+             if (!XRRSetScreenConfig(_ecore_x_disp, sc,
+                                     root, size_index,
+                                     ECORE_X_RANDR_ORIENTATION_ROT_0, CurrentTime))
+               {
+                  ret = EINA_TRUE;
+               }
+
+             if (sc)
+               XRRFreeScreenConfigInfo(sc);
+          }
+     }
+
+   return ret;
+#else /* ifdef ECORE_XRANDR */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XRANDR */
+}
+
+/*
+ * @param root window which's primary output will be queried
+ * @return currently used refresh rate or - if request failed or RandRR is not available - 0.0
+ */
+EAPI Ecore_X_Randr_Refresh_Rate
+ecore_x_randr_screen_primary_output_current_refresh_rate_get(
+  Ecore_X_Window root)
+{
+#ifdef ECORE_XRANDR
+   Ecore_X_Randr_Refresh_Rate ret = 0.0;
+   XRRScreenConfiguration *sc = NULL;
+
+   if (!_ecore_x_randr_root_validate(root) ||
+       !(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
+     return ret;
+
+   ret = XRRConfigCurrentRate(sc);
+   if (sc)
+     XRRFreeScreenConfigInfo(sc);
+
+   return ret;
+#else /* ifdef ECORE_XRANDR */
+   return 0.0;
+#endif /* ifdef ECORE_XRANDR */
+}
+
+/*
+ * @param root window which's primary output will be queried
+ * @param size_index referencing the size to query valid refresh rates for
+ * @return currently used refresh rate or - if request failed or RandRR is not available - NULL
+ */
+EAPI Ecore_X_Randr_Refresh_Rate *
+ecore_x_randr_screen_primary_output_refresh_rates_get(Ecore_X_Window root,
+                                                      int size_index,
+                                                      int *num)
+{
+#ifdef ECORE_XRANDR
+   Ecore_X_Randr_Refresh_Rate *ret = NULL, *rates = NULL;
+   Ecore_X_Randr_Screen scr;
+   int n;
+
+   if (num
+       && RANDR_VALIDATE_ROOT(scr, root)
+       && (rates = XRRRates(_ecore_x_disp, scr, size_index, &n)))
+     {
+        if (rates && (ret = malloc(sizeof(Ecore_X_Randr_Refresh_Rate) * n)))
+          {
+             memcpy(ret, rates, (sizeof(Ecore_X_Randr_Refresh_Rate) * n));
+             *num = n;
+          }
+     }
+
+   return ret;
+#else /* ifdef ECORE_XRANDR */
+   return NULL;
+#endif /* ifdef ECORE_XRANDR */
+}
+
+//>= 1.1
+/*
+ * @brief Sets the current primary output's refresh rate.
+ *
+ * @param root Window which's primary output will be queried.
+ * @param size_index Referencing the size to be set.
+ * @param rate The refresh rate to be set.
+ * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_randr_screen_primary_output_refresh_rate_set(
+  Ecore_X_Window root,
+  int size_index,
+  Ecore_X_Randr_Refresh_Rate
+  rate)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_1_RET(EINA_FALSE);
+   Eina_Bool ret = EINA_FALSE;
+   XRRScreenConfiguration *sc = NULL;
+
+   if (!(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
+     return ret;
+
+   if (!XRRSetScreenConfigAndRate(_ecore_x_disp, sc,
+                                  root, size_index,
+                                  RR_Rotate_0, rate, CurrentTime))
+     ret = EINA_TRUE;
+
+   XRRFreeScreenConfigInfo(sc);
+   return ret;
+#else /* ifdef ECORE_XRANDR */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XRANDR */
+}
+
diff --git a/src/lib/ecore_x/xlib/ecore_x_randr_12.c b/src/lib/ecore_x/xlib/ecore_x_randr_12.c
new file mode 100644 (file)
index 0000000..97f1d0c
--- /dev/null
@@ -0,0 +1,2412 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "ecore_x_private.h"
+#include "ecore_x_randr.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#define Ecore_X_Randr_None  (Ecore_X_Randr_Crtc)0
+#define Ecore_X_Randr_Unset (Ecore_X_Randr_Crtc) - 1
+
+#ifdef ECORE_XRANDR
+
+#define RANDR_1_2           ((1 << 16) | 2)
+
+#define RANDR_VALIDATE_ROOT(screen, root) \
+  ((screen = XRRRootToScreen(_ecore_x_disp, root)) != -1)
+
+#define RANDR_CHECK_1_2_RET(ret) if (_randr_version < RANDR_1_2) \
+    return ret
+
+#define RANDR_PROPERTY_EDID               "EDID"
+#define RANDR_PROPERTY_BACKLIGHT          "Backlight"
+#define RANDR_PROPERTY_SIGNAL_FORMAT      "SignalFormat"
+#define RANDR_PROPERTY_SIGNAL_PROPERTIES  "SignalProperties"
+#define RANDR_PROPERTY_CONNECTOR_TYPE     "ConnectorType"
+#define RANDR_PROPERTY_CONNECTOR_NUMBER   "ConnectorNumber"
+#define RANDR_PROPERTY_COMPATIBILITY_LIST "CompatibilityList"
+#define RANDR_PROPERTY_CLONE_LIST         "CloneList"
+
+extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
+                                                                  dpy,
+                                                                  Window
+                                                                  window);
+extern int _randr_version;
+#endif
+
+/**
+ * @brief Enable event selection. This enables basic interaction with
+ * output/crtc events and requires RandR >= 1.2.
+ *
+ * @param win Select this window's properties for RandR events.
+ * @param on Enable/disable selecting.
+ */
+EAPI void
+ecore_x_randr_events_select(Ecore_X_Window win,
+                            Eina_Bool on)
+{
+#ifdef ECORE_XRANDR
+   int mask;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!on)
+     mask = 0;
+   else
+     {
+        mask = RRScreenChangeNotifyMask;
+        if (_randr_version >= RANDR_1_2)
+          mask |= (RRCrtcChangeNotifyMask |
+                   RROutputChangeNotifyMask |
+                   RROutputPropertyNotifyMask);
+     }
+
+   XRRSelectInput(_ecore_x_disp, win, mask);
+#endif
+}
+
+/**
+ * @brief Validates a CRTC for a given root window's screen.
+ *
+ * @param root The window which's default display will be queried.
+ * @param crtc The CRTC to be validated.
+ * @return In case it is found, @c EINA_TRUE will be returned, @c EINA_FALSE
+ * otherwise.
+ */
+static inline Eina_Bool
+_ecore_x_randr_crtc_validate(Ecore_X_Window root,
+                             Ecore_X_Randr_Crtc crtc)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   XRRScreenResources *res = NULL;
+   int i;
+   Eina_Bool ret = EINA_FALSE;
+
+   if ((crtc == Ecore_X_Randr_None) ||
+       (crtc == Ecore_X_Randr_Unset))
+     return ret;
+
+   if (_ecore_x_randr_root_validate(root) && crtc &&
+       (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        for (i = 0; i < res->ncrtc; i++)
+          {
+             if (res->crtcs[i] == crtc)
+               {
+                  ret = EINA_TRUE;
+                  break;
+               }
+          }
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+Eina_Bool
+_ecore_x_randr_output_validate(Ecore_X_Window root,
+                               Ecore_X_Randr_Output output)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   Eina_Bool ret = EINA_FALSE;
+   XRRScreenResources *res = NULL;
+   int i;
+
+   if (_ecore_x_randr_root_validate(root) && output &&
+       (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        for (i = 0; i < res->noutput; i++)
+          {
+             if (res->outputs[i] == output)
+               {
+                  ret = EINA_TRUE;
+                  break;
+               }
+          }
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+static inline Eina_Bool
+_ecore_x_randr_mode_validate(Ecore_X_Window root,
+                             Ecore_X_Randr_Mode mode)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   Eina_Bool ret = EINA_FALSE;
+   XRRScreenResources *res = NULL;
+   int i;
+
+   if (_ecore_x_randr_root_validate(root) && mode &&
+       (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        for (i = 0; i < res->nmode; i++)
+          {
+             if (res->modes[i].id == mode)
+               {
+                  ret = EINA_TRUE;
+                  break;
+               }
+          }
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/*
+ * @param w width of screen in px
+ * @param h height of screen in px
+ */
+EAPI void
+ecore_x_randr_screen_current_size_get(Ecore_X_Window root,
+                                      int *w,
+                                      int *h,
+                                      int *w_mm,
+                                      int *h_mm)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   Ecore_X_Randr_Screen scr;
+
+   if (!RANDR_VALIDATE_ROOT(scr, root))
+     return;
+
+   if (w)
+     *w = DisplayWidth(_ecore_x_disp, scr);
+
+   if (h)
+     *h = DisplayHeight(_ecore_x_disp, scr);
+
+   if (w_mm)
+     *w_mm = DisplayWidthMM(_ecore_x_disp, scr);
+
+   if (h_mm)
+     *h_mm = DisplayHeightMM(_ecore_x_disp, scr);
+
+#endif
+}
+
+/*
+ * @param root window which's screen will be queried
+ * @param wmin minimum width the screen can be set to
+ * @param hmin minimum height the screen can be set to
+ * @param wmax maximum width the screen can be set to
+ * @param hmax maximum height the screen can be set to
+ */
+EAPI void
+ecore_x_randr_screen_size_range_get(Ecore_X_Window root,
+                                    int *wmin,
+                                    int *hmin,
+                                    int *wmax,
+                                    int *hmax)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   int twmin, thmin, twmax, thmax;
+   if (XRRGetScreenSizeRange (_ecore_x_disp, root, &twmin, &thmin, &twmax,
+                              &thmax))
+     {
+        if (wmin)
+          *wmin = twmin;
+
+        if (hmin)
+          *hmin = thmin;
+
+        if (wmax)
+          *wmax = twmax;
+
+        if (hmax)
+          *hmax = thmax;
+     }
+
+#endif
+}
+
+/*
+ * @param root Window which's screen's size should be set. If invalid (e.g. 
+ * @c NULL) no action is taken.
+ * @param w Width in px the screen should be set to. If out of valid
+ * boundaries, current value is assumed.
+ * @param h Height in px the screen should be set to. If out of valid
+ * boundaries, current value is assumed.
+ * @param w_mm Width in mm the screen should be set to. If @c 0, current
+ * aspect is assumed.
+ * @param h_mm Height in mm the screen should be set to. If @c 0, current
+ * aspect is assumed.
+ * @return @c EINA_TRUE if request was successfully sent or screen is already
+ * in requested size, @c EINA_FALSE if parameters are invalid.
+ */
+EAPI Eina_Bool
+ecore_x_randr_screen_current_size_set(Ecore_X_Window root,
+                                      int w,
+                                      int h,
+                                      int w_mm,
+                                      int h_mm)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   Ecore_X_Randr_Screen scr;
+   int w_c, h_c, w_mm_c, h_mm_c, twmin, thmin, twmax, thmax;
+
+   if (!RANDR_VALIDATE_ROOT(scr, root))
+     return EINA_FALSE;
+
+   ecore_x_randr_screen_current_size_get(root, &w_c, &h_c, &w_mm_c, &h_mm_c);
+   if ((w == w_c) && (h == h_c) && (w_mm_c == w_mm) && (h_mm_c == h_mm))
+     return EINA_TRUE;
+
+   ecore_x_randr_screen_size_range_get(root, &twmin, &thmin, &twmax, &thmax);
+
+   if (((w != Ecore_X_Randr_None) &&
+        ((w < twmin) ||
+         (w > twmax))) ||
+       ((h != Ecore_X_Randr_None) && ((h < thmin) || (h > thmax))))
+     return EINA_FALSE;
+
+   if (w <= 0)
+     w = DisplayWidth(_ecore_x_disp, scr);
+
+   if (h <= 0)
+     h = DisplayHeight(_ecore_x_disp, scr);
+
+   if (w_mm <= 0)
+     w_mm =
+       (int)(((double)(DisplayWidthMM(_ecore_x_disp,
+                                      scr) /
+                       (double)DisplayWidth(_ecore_x_disp,
+                                            scr))) * (double)w);
+
+   if (h_mm <= 0)
+     h_mm =
+       (int)(((double)(DisplayHeightMM(_ecore_x_disp,
+                                       scr) /
+                       (double)DisplayHeight(_ecore_x_disp,
+                                             scr))) * (double)h);
+
+   XRRSetScreenSize (_ecore_x_disp, root, w, h, w_mm, h_mm);
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/*
+ * @brief get detailed information for all modes related to a root window's screen
+ * @param root window which's screen's ressources are queried
+ * @param num number of modes returned
+ * @return modes' information
+ */
+EAPI Ecore_X_Randr_Mode_Info **
+ecore_x_randr_modes_info_get(Ecore_X_Window root,
+                             int *num)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Mode_Info **ret = NULL;
+   int i;
+
+   if (_ecore_x_randr_root_validate(root) &&
+       (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        if ((ret =
+               (Ecore_X_Randr_Mode_Info **)malloc(sizeof(
+                                                    Ecore_X_Randr_Mode_Info *)
+                                                  *
+                                                  res->nmode)))
+          {
+             for (i = 0; i < res->nmode; i++)
+               {
+                  if ((ret[i] = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
+                    {
+                       ret[i]->xid = res->modes[i].id;
+                       ret[i]->width = res->modes[i].width;
+                       ret[i]->height = res->modes[i].height;
+                       ret[i]->dotClock = res->modes[i].dotClock;
+                       ret[i]->hSyncStart = res->modes[i].hSyncStart;
+                       ret[i]->hSyncEnd = res->modes[i].hSyncEnd;
+                       ret[i]->hTotal = res->modes[i].hTotal;
+                       ret[i]->hSkew = res->modes[i].hSkew;
+                       ret[i]->vSyncStart = res->modes[i].vSyncStart;
+                       ret[i]->vSyncEnd = res->modes[i].vSyncEnd;
+                       ret[i]->vTotal = res->modes[i].vTotal;
+                       if ((ret[i]->name = (malloc(res->modes[i].nameLength + 1))))
+                         strncpy(ret[i]->name, res->modes[i].name,
+                                 (res->modes[i].nameLength + 1));
+                       else
+                         ret[i]->name = NULL;
+
+                       ret[i]->nameLength = res->modes[i].nameLength;
+                       ret[i]->modeFlags = res->modes[i].modeFlags;
+                    }
+                  else
+                    {
+                       while (i > 0)
+                         free(ret[--i]);
+                       free(ret);
+                       ret = NULL;
+                       break;
+                    }
+               }
+          }
+
+        if (ret && num)
+          *num = res->nmode;
+
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+/*
+ * @brief Add a mode to a display.
+ *
+ * @param root Window to which's screen's ressources are added.
+ * @param mode_info
+ * @return Ecore_X_Randr_Mode of the added mode. Ecore_X_Randr_None if mode
+ * adding failed.
+ * @since 1.2.0
+ */
+EAPI Ecore_X_Randr_Mode
+ecore_x_randr_mode_info_add(Ecore_X_Window root,
+                            Ecore_X_Randr_Mode_Info *mode_info)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+   Ecore_X_Randr_Mode mode = Ecore_X_Randr_None;
+
+   if (_ecore_x_randr_root_validate(root) && mode_info)
+     mode = XRRCreateMode(_ecore_x_disp, root, (XRRModeInfo*)mode_info);
+
+   return mode;
+#else
+   return Ecore_X_Randr_None;
+#endif
+}
+
+/*
+ * @brief Delete a mode from the display.
+ *
+ * @param mode_info
+ * @since 1.2.0
+ */
+EAPI void
+ecore_x_randr_mode_del(Ecore_X_Randr_Mode mode)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+
+   XRRDestroyMode(_ecore_x_disp, mode);
+#else
+   return;
+#endif
+}
+
+/*
+ * @brief get detailed information for a given mode id
+ * @param root window which's screen's ressources are queried
+ * @param mode the XID which identifies the mode of interest
+ * @return mode's detailed information
+ */
+EAPI Ecore_X_Randr_Mode_Info *
+ecore_x_randr_mode_info_get(Ecore_X_Window root,
+                            Ecore_X_Randr_Mode mode)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Mode_Info *ret = NULL;
+   int i;
+
+   if (_ecore_x_randr_root_validate(root) &&
+       (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+     {
+        for (i = 0; i < res->nmode; i++)
+          {
+             if ((res->modes[i].id == mode) &&
+                 (ret = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
+               {
+                  ret->xid = res->modes[i].id;
+                  ret->width = res->modes[i].width;
+                  ret->height = res->modes[i].height;
+                  ret->dotClock = res->modes[i].dotClock;
+                  ret->hSyncStart = res->modes[i].hSyncStart;
+                  ret->hSyncEnd = res->modes[i].hSyncEnd;
+                  ret->hTotal = res->modes[i].hTotal;
+                  ret->hSkew = res->modes[i].hSkew;
+                  ret->vSyncStart = res->modes[i].vSyncStart;
+                  ret->vSyncEnd = res->modes[i].vSyncEnd;
+                  ret->vTotal = res->modes[i].vTotal;
+                  ret->name = NULL;
+                  ret->nameLength = 0;
+                  if (res->modes[i].nameLength > 0)
+                    {
+                       ret->nameLength = res->modes[i].nameLength;
+                       ret->name = malloc(res->modes[i].nameLength + 1);
+                       if (ret->name)
+                         memcpy(ret->name, res->modes[i].name,
+                                res->modes[i].nameLength + 1);
+                    }
+                  ret->modeFlags = res->modes[i].modeFlags;
+                  break;
+               }
+          }
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+/*
+ * @brief Free detailed mode information. The pointer handed in will be set to
+ * @c NULL after freeing the memory.
+ *
+ * @param mode_info The mode information that should be freed.
+ */
+EAPI void
+ecore_x_randr_mode_info_free(Ecore_X_Randr_Mode_Info *mode_info)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   if (!mode_info)
+     return;
+
+   if (mode_info->name)
+     free(mode_info->name);
+
+   free(mode_info);
+   mode_info = NULL;
+#endif
+}
+
+/*
+ * @brief Get all known CRTCs related to a root window's screen.
+ *
+ * @param root Window which's screen's ressources are queried.
+ * @param num Number of CRTCs returned.
+ * @return CRTC IDs.
+ */
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_crtcs_get(Ecore_X_Window root,
+                        int *num)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Crtc *ret = NULL;
+
+   if (root &&
+       (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        if ((ret = malloc(sizeof(Ecore_X_Randr_Crtc) * res->ncrtc)))
+          {
+             int i = 0;
+
+             if (num) *num = res->ncrtc;
+
+             for (i = 0; i < res->ncrtc; i++)
+               ret[i] = res->crtcs[i];
+          }
+
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+/*
+ * @deprecated bad naming. Use ecore_x_randr_window_crtcs_get instead.
+ * @brief get the CRTCs, which display a certain window
+ * @param window window the displaying crtcs shall be found for
+ * @param num the number of crtcs displaying the window
+ * @return Array of crtcs that display a certain window. @c NULL if no crtcs
+ * was found that displays the specified window.
+ */
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_current_crtc_get(Ecore_X_Window window,
+                               int *num)
+{
+   return ecore_x_randr_window_crtcs_get(window, num);
+}
+
+/*
+ * @brief get the CRTCs, which display a certain window
+ * @param window window the displaying crtcs shall be found for
+ * @param num the number of crtcs displaying the window
+ * @return Array of crtcs that display a certain window. @c NULL if no crtcs
+ * was found that displays the specified window.
+ * @since 1.2.0
+ */
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_window_crtcs_get(Ecore_X_Window window,
+                               int *num)
+{
+#ifdef ECORE_XRANDR
+   Ecore_X_Window root;
+   Eina_Rectangle w_geo, c_geo;
+   Ecore_X_Randr_Crtc *crtcs;
+   Ecore_X_Randr_Mode mode;
+   Ecore_X_Randr_Output *ret = NULL;
+   Window tw;
+   int ncrtcs, i, nret = 0, rx = 0, ry = 0;
+
+   if (_randr_version < RANDR_1_2) goto _ecore_x_randr_window_crtcs_get_fail;
+
+   ecore_x_window_geometry_get(window,
+                               &w_geo.x, &w_geo.y,
+                               &w_geo.w, &w_geo.h);
+
+   root = ecore_x_window_root_get(window);
+   crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs);
+   if (!crtcs) goto _ecore_x_randr_window_crtcs_get_fail;
+
+   /* now get window RELATIVE to root window - thats what matters. */
+   XTranslateCoordinates(_ecore_x_disp, window, root, 0, 0, &rx, &ry, &tw);
+   w_geo.x = rx;
+   w_geo.y = ry;
+
+   ret = calloc(1, ncrtcs * sizeof(Ecore_X_Randr_Crtc));
+   if (!ret)
+     {
+        free(crtcs);
+        goto _ecore_x_randr_window_crtcs_get_fail;
+     }
+   for (i = 0, nret = 0; i < ncrtcs; i++)
+     {
+        /* if crtc is not enabled, don't bother about it any further */
+        mode = ecore_x_randr_crtc_mode_get(root, crtcs[i]);
+        if (mode == Ecore_X_Randr_None) continue;
+
+        ecore_x_randr_crtc_geometry_get(root, crtcs[i],
+                                        &c_geo.x, &c_geo.y,
+                                        &c_geo.w, &c_geo.h);
+        if (eina_rectangles_intersect(&w_geo, &c_geo))
+          {
+             ret[nret] = crtcs[i];
+             nret++;
+          }
+     }
+   free(crtcs);
+
+   if (num) *num = nret;
+   return ret;
+
+_ecore_x_randr_window_crtcs_get_fail:
+#endif
+   if (num) *num = 0;
+   return NULL;
+}
+
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_outputs_get(Ecore_X_Window root,
+                          int *num)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Output *ret = NULL;
+
+   if (root && 
+       (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+     {
+        if ((ret = malloc(sizeof(Ecore_X_Randr_Output) * res->noutput)))
+          {
+             int i = 0;
+
+             if (num) *num = res->noutput;
+
+             for (i = 0; i < res->noutput; i++)
+               ret[i] = res->outputs[i];
+          }
+
+        if (res)
+          XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+//Per Crtc
+/*
+ * @brief get a CRTC's outputs.
+ * @param root the root window which's screen will be queried
+ * @param num number of outputs referenced by given CRTC
+ */
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_crtc_outputs_get(Ecore_X_Window root,
+                               Ecore_X_Randr_Crtc crtc,
+                               int *num)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Output *ret = NULL;
+   XRRCrtcInfo *crtc_info = NULL;
+
+   if (_ecore_x_randr_crtc_validate(root, crtc) &&
+       (res =
+           _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)) &&
+       (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
+     {
+        if ((ret = malloc(sizeof(Ecore_X_Randr_Output) * crtc_info->noutput)))
+          {
+             int i = 0;
+
+             if (num) *num = crtc_info->noutput;
+
+             for (i = 0; i < crtc_info->noutput; i++)
+               ret[i] = crtc_info->outputs[i];
+          }
+
+        if (crtc_info)
+          XRRFreeCrtcInfo(crtc_info);
+
+        if (res)
+          XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+/*
+ * @brief get a CRTC's possible outputs.
+ * @param root the root window which's screen will be queried
+ * @param num number of possible outputs referenced by given CRTC
+ */
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_crtc_possible_outputs_get(Ecore_X_Window root,
+                                        Ecore_X_Randr_Crtc crtc,
+                                        int *num)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Output *ret = NULL;
+   XRRCrtcInfo *crtc_info = NULL;
+
+   if (_ecore_x_randr_crtc_validate(root, crtc) &&
+       (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        if ((crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
+          {
+             if ((ret =
+                    malloc(sizeof(Ecore_X_Randr_Output) * crtc_info->npossible)))
+               {
+                  int i = 0;
+
+                  if (num) *num = crtc_info->npossible;
+
+                  for (i = 0; i < crtc_info->npossible; i++)
+                    ret[i] = crtc_info->possible[i];
+               }
+
+             XRRFreeCrtcInfo(crtc_info);
+          }
+
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+EAPI void
+ecore_x_randr_crtc_geometry_get(Ecore_X_Window root,
+                                Ecore_X_Randr_Crtc crtc,
+                                int *x,
+                                int *y,
+                                int *w,
+                                int *h)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   XRRScreenResources *res = NULL;
+   XRRCrtcInfo *crtc_info = NULL;
+
+   if (_ecore_x_randr_crtc_validate(root,
+                                    crtc) &&
+       (res =
+          _ecore_x_randr_get_screen_resources (_ecore_x_disp,
+                                               root)) &&
+       (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
+     {
+        if (x)
+          *x = crtc_info->x;
+
+        if (y)
+          *y = crtc_info->y;
+
+        if (w)
+          *w = crtc_info->width;
+
+        if (h)
+          *h = crtc_info->height;
+
+        XRRFreeCrtcInfo(crtc_info);
+        XRRFreeScreenResources(res);
+     }
+
+#endif
+}
+
+/*
+ * @brief Sets the position of given CRTC within root window's screen.
+ *
+ * @param root The window's screen to be queried.
+ * @param crtc The CRTC which's position within the mentioned screen is to be
+ * altered.
+ * @param x Position on the x-axis (0 == left) of the screen. if x < 0 current
+ * value will be kept.
+ * @param y Position on the y-ayis (0 == top) of the screen. if y < 0, current
+ * value will be kept.
+ * @return @c EINA_TRUE if position could successfully be altered.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_pos_set(Ecore_X_Window root,
+                           Ecore_X_Randr_Crtc crtc,
+                           int x,
+                           int y)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+   int w_c, h_c, w_new = 0, h_new = 0;
+   Eina_Rectangle crtc_geo;
+
+   ecore_x_randr_crtc_geometry_get(root,
+                                   crtc,
+                                   &crtc_geo.x,
+                                   &crtc_geo.y,
+                                   &crtc_geo.w,
+                                   &crtc_geo.h);
+   ecore_x_randr_screen_current_size_get(root, &w_c, &h_c, NULL, NULL);
+   if (x < 0)
+     x = crtc_geo.x;
+
+   if (y < 0)
+     y = crtc_geo.y;
+
+   if ((x + crtc_geo.w) > w_c)
+     w_new = x + crtc_geo.w;
+
+   if ((y + crtc_geo.h) > h_c)
+     h_new = y + crtc_geo.h;
+
+   if ((w_new != 0) || (h_new != 0))
+     if (!ecore_x_randr_screen_current_size_set(root, w_new, h_new, 0, 0))
+       return EINA_FALSE;
+
+   return ecore_x_randr_crtc_settings_set(root,
+                                          crtc,
+                                          NULL,
+                                          Ecore_X_Randr_Unset,
+                                          x,
+                                          y,
+                                          Ecore_X_Randr_Unset,
+                                          Ecore_X_Randr_Unset);
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/**
+ * @brief Get the current set mode of a given CRTC
+ * @param root the window's screen to be queried
+ * @param crtc the CRTC which's should be queried
+ * @return currently set mode or - in case parameters are invalid -
+ * Ecore_X_Randr_Unset
+ */
+EAPI Ecore_X_Randr_Mode
+ecore_x_randr_crtc_mode_get(Ecore_X_Window root,
+                            Ecore_X_Randr_Crtc crtc)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_Unset);
+   XRRScreenResources *res = NULL;
+   XRRCrtcInfo *crtc_info = NULL;
+   Ecore_X_Randr_Mode ret = Ecore_X_Randr_Unset;
+   if (_ecore_x_randr_root_validate(root) &&
+       _ecore_x_randr_crtc_validate(root,
+                                    crtc) &&
+       (res =
+          _ecore_x_randr_get_screen_resources(_ecore_x_disp,
+                                              root)) &&
+       (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
+     {
+        ret = crtc_info->mode;
+        XRRFreeCrtcInfo(crtc_info);
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return Ecore_X_Randr_Unset;
+#endif
+}
+
+/**
+ * @brief Sets a mode for a CRTC and the outputs attached to it.
+ *
+ * @param root The window's screen to be queried.
+ * @param crtc The CRTC which shall be set.
+ * @param outputs Array of outputs which have to be compatible with the mode.
+ * If @c NULL, CRTC will be disabled.
+ * @param noutputs Number of outputs in array to be used. Use
+ * Ecore_X_Randr_Unset (or @c -1) to use currently used outputs.
+ * @param mode XID of the mode to be set. If set to @c 0 the CRTC will be
+ * disabled. If set to @c -1 the call will fail.
+ * @return @c EINA_TRUE if mode setting was successful, @c EINA_FALSE
+ * otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_mode_set(Ecore_X_Window root,
+                            Ecore_X_Randr_Crtc crtc,
+                            Ecore_X_Randr_Output *outputs,
+                            int noutputs,
+                            Ecore_X_Randr_Mode mode)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if (mode == Ecore_X_Randr_Unset)
+     return EINA_FALSE;
+
+   return ecore_x_randr_crtc_settings_set(root,
+                                          crtc,
+                                          outputs,
+                                          noutputs,
+                                          Ecore_X_Randr_Unset,
+                                          Ecore_X_Randr_Unset,
+                                          mode,
+                                          Ecore_X_Randr_Unset);
+#else
+   return EINA_FALSE;
+#endif
+}
+
+EAPI void
+ecore_x_randr_crtc_size_get(Ecore_X_Window root,
+                            Ecore_X_Randr_Crtc crtc,
+                            int *w,
+                            int *h)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   ecore_x_randr_crtc_geometry_get(root, crtc, NULL, NULL, w, h);
+#endif
+}
+
+EAPI Ecore_X_Randr_Refresh_Rate
+ecore_x_randr_crtc_refresh_rate_get(Ecore_X_Window root,
+                                    Ecore_X_Randr_Crtc crtc,
+                                    Ecore_X_Randr_Mode mode)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(0.0);
+   XRRScreenResources *res = NULL;
+   XRRCrtcInfo *crtc_info = NULL;
+   Ecore_X_Randr_Refresh_Rate ret = 0.0;
+   int i;
+
+   if (_ecore_x_randr_crtc_validate(root,
+                                    crtc) &&
+       (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        for (i = 0; i < res->nmode; i++)
+          if (res->modes[i].id == mode)
+            {
+               if (res->modes[i].hTotal && res->modes[i].vTotal)
+                 ret = ((double)res->modes[i].dotClock /
+                        ((double)res->modes[i].hTotal *
+                         (double)res->modes[i].vTotal));
+
+               break;
+            }
+     }
+
+   if (crtc_info)
+     XRRFreeCrtcInfo(crtc_info);
+
+   if (res)
+     XRRFreeScreenResources(res);
+
+   return ret;
+#else
+   return 0.0;
+#endif
+}
+
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_crtc_orientations_get(Ecore_X_Window root,
+                                    Ecore_X_Randr_Crtc crtc)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
+   XRRCrtcInfo *crtc_info = NULL;
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
+
+   if (_ecore_x_randr_crtc_validate(root,
+                                    crtc) &&
+       (res =
+          _ecore_x_randr_get_screen_resources (_ecore_x_disp,
+                                               root)) &&
+       (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
+     {
+        ret = crtc_info->rotations;
+     }
+   if (crtc_info)
+     XRRFreeCrtcInfo(crtc_info);
+
+   if (res)
+     XRRFreeScreenResources(res);
+
+   return ret;
+#else
+   return Ecore_X_Randr_None;
+#endif
+}
+
+EAPI Ecore_X_Randr_Orientation
+ecore_x_randr_crtc_orientation_get(Ecore_X_Window root,
+                                   Ecore_X_Randr_Crtc crtc)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
+   XRRCrtcInfo *crtc_info = NULL;
+   XRRScreenResources *res = NULL;
+   Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
+
+   if (_ecore_x_randr_crtc_validate(root,
+                                    crtc) &&
+       (res =
+          _ecore_x_randr_get_screen_resources (_ecore_x_disp,
+                                               root)) &&
+       (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
+     {
+        ret = crtc_info->rotation;
+     }
+   if (crtc_info)
+     XRRFreeCrtcInfo(crtc_info);
+
+   if (res)
+     XRRFreeScreenResources(res);
+
+   return ret;
+#else
+   return Ecore_X_Randr_None;
+#endif
+}
+
+EAPI Eina_Bool
+ecore_x_randr_crtc_orientation_set(Ecore_X_Window root,
+                                   Ecore_X_Randr_Crtc crtc,
+                                   Ecore_X_Randr_Orientation orientation)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+   Eina_Bool ret = EINA_FALSE;
+
+   if (orientation != Ecore_X_Randr_None)
+     {
+        ret = ecore_x_randr_crtc_settings_set(root,
+                                              crtc,
+                                              NULL,
+                                              Ecore_X_Randr_Unset,
+                                              Ecore_X_Randr_Unset,
+                                              Ecore_X_Randr_Unset,
+                                              Ecore_X_Randr_Unset,
+                                              orientation);
+     }
+
+   return ret;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+EAPI void
+ecore_x_randr_crtc_pos_get(Ecore_X_Window root,
+                           Ecore_X_Randr_Crtc crtc,
+                           int *x,
+                           int *y)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+
+   ecore_x_randr_crtc_geometry_get(root, crtc, x, y, NULL, NULL);
+#endif
+}
+
+EAPI Eina_Bool
+ecore_x_randr_crtc_clone_set(Ecore_X_Window root,
+                             Ecore_X_Randr_Crtc original,
+                             Ecore_X_Randr_Crtc clon)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   XRRScreenResources *res = NULL;
+   XRRCrtcInfo *clone_crtc_info = NULL;
+   Ecore_X_Randr_Mode original_mode = Ecore_X_Randr_None;
+   Ecore_X_Randr_Orientation original_orientation = Ecore_X_Randr_None;
+   Eina_Bool ret = EINA_FALSE;
+   int x, y;
+
+   if (_ecore_x_randr_root_validate(root) &&
+       _ecore_x_randr_crtc_validate(root,
+                                    original) &&
+       _ecore_x_randr_crtc_validate(root,
+                                    clon) &&
+       (res =
+          _ecore_x_randr_get_screen_resources (_ecore_x_disp,
+                                               root)) &&
+       (clone_crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, clon)))
+     {
+        ecore_x_randr_crtc_geometry_get(root, original, &x, &y, NULL, NULL);
+        original_mode = ecore_x_randr_crtc_mode_get(root, original);
+        original_orientation = ecore_x_randr_crtc_orientation_get(root,
+                                                                  original);
+        ret = ecore_x_randr_crtc_settings_set(root,
+                                              clon,
+                                              NULL,
+                                              Ecore_X_Randr_Unset,
+                                              x,
+                                              y,
+                                              original_mode,
+                                              original_orientation);
+        XRRFreeCrtcInfo(clone_crtc_info);
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/**
+ * @brief Sets the demanded parameters for a given CRTC. Note that the CRTC is
+ * auto enabled in it's preferred mode, when it was disabled before.
+ *
+ * @param root The root window which's default display will be queried.
+ * @param crtc The CRTC which's configuration should be altered.
+ * @param outputs An array of outputs, that should display this CRTC's content.
+ * @param noutputs Number of outputs in the array of outputs. If set to
+ * Ecore_X_Randr_Unset, current outputs and number of outputs will be used.
+ * If set to Ecore_X_Randr_None, CRTC will be disabled.
+ * @param x New x coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current x
+ * corrdinate will be assumed.
+ * @param y New y coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current y
+ * corrdinate will be assumed.
+ * @param mode The new mode to be set. If Ecore_X_Randr_None is passed, the
+ * CRTC will be disabled. If Ecore_X_Randr_Unset is passed, the current mode is
+ * assumed.
+ * @param orientation The new orientation to be set. If Ecore_X_Randr_Unset is
+ * used, the current mode is assumed.
+ * @return @c EINA_TRUE if the configuration alteration was successful,
+ * @c EINA_FALSE otherwise.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_settings_set(Ecore_X_Window root,
+                                Ecore_X_Randr_Crtc crtc,
+                                Ecore_X_Randr_Output *outputs,
+                                int noutputs,
+                                int x,
+                                int y,
+                                Ecore_X_Randr_Mode mode,
+                                Ecore_X_Randr_Orientation orientation)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+   XRRScreenResources *res = NULL;
+   XRRCrtcInfo *crtc_info = NULL;
+   Eina_Bool ret = EINA_FALSE;
+
+   if (_ecore_x_randr_crtc_validate(root,
+                                    crtc) &&
+       (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+     {
+        if ((crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
+          {
+             if ((mode == Ecore_X_Randr_None) ||
+                 (noutputs == Ecore_X_Randr_None))
+               {
+                  outputs = NULL;
+                  noutputs = 0;
+               }
+             else if (noutputs == (int)Ecore_X_Randr_Unset)
+               {
+                  outputs = (Ecore_X_Randr_Output *)crtc_info->outputs;
+                  noutputs = crtc_info->noutput;
+               }
+
+             if (mode == Ecore_X_Randr_Unset)
+               mode = crtc_info->mode;
+
+             if (x < 0)
+               x = crtc_info->x;
+
+             if (y < 0)
+               y = crtc_info->y;
+
+             if (orientation == Ecore_X_Randr_Unset)
+               orientation = crtc_info->rotation;
+
+             if (!XRRSetCrtcConfig(_ecore_x_disp, res, crtc, CurrentTime,
+                                   x, y, mode, orientation, (RROutput *)outputs,
+                                   noutputs))
+               ret = EINA_TRUE;
+
+             XRRFreeCrtcInfo(crtc_info);
+          }
+
+        XRRFreeScreenResources(res);
+     }
+
+   return ret;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/**
+ * @brief Sets a CRTC relative to another one.
+ *
+ * @param root The root window which's default display will be set.
+ * @param crtc_r1 The CRTC to be positioned.
+ * @param crtc_r2 The CRTC the position should be relative to.
+ * @param policy The relation between the crtcs.
+ * @param alignment In case CRTCs size differ, aligns CRTC1 accordingly at
+ * CRTC2's borders.
+ * @return @c EINA_TRUE if crtc could be successfully positioned, @c EINA_FALSE
+ * if repositioning failed or if position of new crtc would be out of given
+ * screen's min/max bounds.
+ */
+EAPI Eina_Bool
+ecore_x_randr_crtc_pos_relative_set(Ecore_X_Window root,
+                                    Ecore_X_Randr_Crtc crtc_r1,
+                                    Ecore_X_Randr_Crtc crtc_r2,
+                                    Ecore_X_Randr_Output_Policy policy,
+                                    Ecore_X_Randr_Relative_Alignment alignment)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   Eina_Rectangle r1_geo, r2_geo;
+   int w_max, h_max, cw, ch, x_n = Ecore_X_Randr_Unset, y_n =
+     Ecore_X_Randr_Unset;
+   /*
+      int r1_noutputs, r2_noutputs, r1_nmodes, i, j, outputs_mode_found, mode_w, mode_h;
+      Ecore_X_Randr_Output *r1_outputs, *r2_outputs, *r2_r1_outputs;
+      Ecore_X_Randr_Mode *r1_modes, r2_mode, r1_mode;
+      Eina_Bool ret;
+    */
+
+   if ((ecore_x_randr_crtc_mode_get(root, crtc_r1) == Ecore_X_Randr_None)
+       || (ecore_x_randr_crtc_mode_get(root, crtc_r2) == Ecore_X_Randr_None))
+     return EINA_FALSE;
+
+   if (!_ecore_x_randr_crtc_validate(root, crtc_r1) ||
+       (!(crtc_r1 != crtc_r2) &&
+        !_ecore_x_randr_crtc_validate(root, crtc_r2)))
+     return EINA_FALSE;
+
+   ecore_x_randr_crtc_geometry_get(root,
+                                   crtc_r1,
+                                   &r1_geo.x,
+                                   &r1_geo.y,
+                                   &r1_geo.w,
+                                   &r1_geo.h);
+   ecore_x_randr_crtc_geometry_get(root,
+                                   crtc_r2,
+                                   &r2_geo.x,
+                                   &r2_geo.y,
+                                   &r2_geo.w,
+                                   &r2_geo.h);
+   ecore_x_randr_screen_size_range_get(root, NULL, NULL, &w_max, &h_max);
+   ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
+
+   switch (policy)
+     {
+      case ECORE_X_RANDR_OUTPUT_POLICY_RIGHT:
+        //set r1 right of r2
+        x_n = r2_geo.x + r2_geo.w;
+
+        switch (alignment)
+          {
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
+             y_n = Ecore_X_Randr_Unset;
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
+             y_n =
+               ((int)(((double)r2_geo.h /
+                       2.0) + (double)r2_geo.y - ((double)r1_geo.h / 2.0)));
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
+             y_n = ((int)((double)ch / 2.0) - ((double)r1_geo.h / 2.0));
+             break;
+          }
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_LEFT:
+        //set r1 left of r2
+        x_n = r2_geo.x - r1_geo.w;
+
+        switch (alignment)
+          {
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
+             y_n = Ecore_X_Randr_Unset;
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
+             y_n =
+               ((int)(((double)r2_geo.h /
+                       2.0) + r2_geo.y - ((double)r1_geo.h / 2.0)));
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
+             y_n = ((int)(((double)ch / 2.0) - ((double)r1_geo.h / 2.0)));
+             break;
+          }
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_BELOW:
+        //set r1 below r2
+        y_n = r2_geo.y + r2_geo.h;
+
+        switch (alignment)
+          {
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
+             x_n = Ecore_X_Randr_Unset;
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
+             x_n =
+               ((int)((((double)r2_geo.x +
+                        (double)r2_geo.w) / 2.0) - ((double)r1_geo.w / 2.0)));
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
+             x_n = ((int)((double)cw / 2.0));
+             break;
+          }
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_ABOVE:
+        y_n = r2_geo.y - r1_geo.h;
+
+        //set r1 above r2
+        switch (alignment)
+          {
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
+             x_n = Ecore_X_Randr_Unset;
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
+             x_n =
+               ((int)((((double)r2_geo.x +
+                        (double)r2_geo.w) / 2.0) - ((double)r1_geo.w / 2.0)));
+             break;
+
+           case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
+             x_n = ((int)((double)cw / 2.0));
+             break;
+          }
+        break;
+
+      case ECORE_X_RANDR_OUTPUT_POLICY_CLONE:
+        return ecore_x_randr_crtc_pos_set(root, crtc_r1, r2_geo.x, r2_geo.y);
+
+      /* entire cloning (including modesetting)
+         //all outputs of crtc1 capable of crtc2's current mode?
+         r2_mode = ecore_x_randr_crtc_mode_get(root, crtc_r2);
+         if (!(r1_outputs =
+               ecore_x_randr_crtc_outputs_get(root, crtc_r1,
+                                              &r1_noutputs)) ||
+          (r1_noutputs == 0))
+         return EINA_FALSE;
+
+         for (i = 0, outputs_mode_found = 0; i < r1_noutputs; i++)
+         {
+           if (!(r1_modes =
+                    ecore_x_randr_output_modes_get(root, r1_outputs[i],
+                                                   &r1_nmodes, NULL)))
+             {
+                free(r1_outputs);
+                return EINA_FALSE;
+             }
+
+           for (j = 0; j < r1_nmodes; j++)
+             {
+                ecore_x_randr_mode_size_get(root,
+                                            r1_modes[j],
+                                            &mode_w,
+                                            &mode_h);
+                if ((mode_w == r2_geo.w) && (mode_h == r2_geo.h))
+                  {
+                     r1_mode = r1_modes[j];
+         ++outputs_mode_found;
+                     free(r1_modes);
+                     r1_modes = NULL;
+                     break;
+                  }
+             }
+           if (r1_modes)
+                     free(r1_modes);
+
+           if (outputs_mode_found <= i)
+             {
+                //an output doesn't support the set mode, cancel!
+                     free(r1_outputs);
+                return EINA_FALSE;
+             }
+         }
+                     free (r1_outputs);
+         //CRTC 1's outputs support a mode of same geometry as CRTC 2.
+         ret =
+         (ecore_x_randr_crtc_mode_set(root, crtc_r1, Ecore_X_Randr_None,
+                                      Ecore_X_Randr_None,
+                                      r1_mode) &&
+          ecore_x_randr_crtc_pos_set(root, crtc_r1, r2_geo.x, r2_geo.y));
+         return ret;
+       */
+
+      /* entire cloning on same CRTC
+         //all outputs of crtc1 capable of crtc2's current mode?
+         r2_mode = ecore_x_randr_crtc_mode_get(root, crtc_r2);
+         if (!(r1_outputs =
+               ecore_x_randr_crtc_outputs_get(root, crtc_r1,
+                                              &r1_noutputs)) ||
+          (r1_noutputs == 0))
+         return EINA_FALSE;
+
+         for (i = 0, outputs_mode_found = 0; i < r1_noutputs; i++)
+         {
+           if (!(r1_modes =
+                    ecore_x_randr_output_modes_get(root, r1_outputs[i],
+                                                   &r1_nmodes, NULL)))
+             {
+                     free(r1_outputs);
+                return EINA_FALSE;
+             }
+
+           for (j = 0; j < r1_nmodes; j++)
+             {
+                if (r1_modes[j] == r2_mode)
+                  {
+         ++outputs_mode_found;
+                     free(r1_modes);
+                     r1_modes = NULL;
+                     break;
+                  }
+             }
+           if (r1_modes)
+                     free(r1_modes);
+
+           if (outputs_mode_found <= i)
+             {
+                //an output doesn't support the set mode, cancel!
+                     free(r1_outputs);
+                return EINA_FALSE;
+             }
+         }
+         //check whether crtc r2 can use all outputs of r1.
+         if (!(r2_outputs =
+               ecore_x_randr_crtc_possible_outputs_get(root, crtc_r2,
+                                                       &r2_noutputs)) ||
+          (r2_noutputs == 0))
+         {
+                free(r1_outputs);
+           return EINA_FALSE;
+         }
+
+         for (i = 0; i < r1_noutputs; i++)
+         {
+           for (j = 0; j < r2_noutputs; )
+             {
+                if (r1_outputs[i] == r2_outputs[j])
+                   break;
+
+                j++;
+             }
+           if (j == r2_noutputs)
+             {
+                //didn't find the output!
+                free (r1_outputs);
+                free (r2_outputs);
+                return EINA_FALSE;
+             }
+         }
+
+         //apparently crtc2 supports all outputs of r1
+         //TODO: check with the compatible list of outputs (property in RR1.3)
+         r2_r1_outputs =
+         malloc(sizeof(Ecore_X_Randr_Output) * (r1_noutputs + r2_noutputs));
+         for (i = 0; i < r1_noutputs; i++)
+         {
+           r2_r1_outputs[i] = r1_outputs[i];
+         }
+         free(r1_outputs);
+         for (; i < r2_noutputs; i++)
+         {
+           r2_r1_outputs[i] = r2_outputs[i];
+         }
+         free(r2_outputs);
+         ret =
+         ecore_x_randr_crtc_mode_set(root, crtc_r2, r2_r1_outputs,
+                                     (r1_noutputs + r1_noutputs), r2_mode);
+         free (r2_r1_outputs);
+         return ret;
+       */
+      case ECORE_X_RANDR_OUTPUT_POLICY_NONE:
+        break;
+      default:
+        return EINA_FALSE;
+     }
+   if ((x_n == r1_geo.x) && (y_n == r1_geo.x))
+     return EINA_TRUE;
+
+   //out of possible bounds?
+   if (((y_n + r1_geo.h) > h_max) || ((x_n + r1_geo.w) > w_max))
+     return EINA_FALSE;
+
+   return ecore_x_randr_crtc_pos_set(root, crtc_r1, x_n, y_n);
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/*
+ * @brief Add given mode to given output.
+ *
+ * @param output The output the mode is added to.
+ * @param mode The mode added to the output.
+ * @return @c EINA_FALSE if output or mode equal Ecore_X_Randr_None, else
+ * @c EINA_TRUE.
+ * Additionally, if xcb backend is used, the success of the addition is
+ * reported back directly.
+ * @since 1.2.0
+ */
+EAPI Eina_Bool
+ecore_x_randr_output_mode_add(Ecore_X_Randr_Output output,
+                              Ecore_X_Randr_Mode mode)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+
+   if ((output == Ecore_X_Randr_None) || (mode == Ecore_X_Randr_None))
+     return EINA_FALSE;
+
+   XRRAddOutputMode(_ecore_x_disp, output, mode);
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/*
+ * @brief delete given mode from given output
+ * @param output the output the mode is removed from
+ * @param mode the mode removed from the output
+ * @since 1.2.0
+ */
+EAPI void
+ecore_x_randr_output_mode_del(Ecore_X_Randr_Output output,
+                              Ecore_X_Randr_Mode mode)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+
+   if ((output == Ecore_X_Randr_None) || (mode == Ecore_X_Randr_None))
+     return;
+
+   XRRDeleteOutputMode(_ecore_x_disp, output, mode);
+#else
+   return;
+#endif
+}
+
+EAPI Ecore_X_Randr_Mode *
+ecore_x_randr_output_modes_get(Ecore_X_Window root,
+                               Ecore_X_Randr_Output output,
+                               int *num,
+                               int *npreferred)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   XRROutputInfo *output_info = NULL;
+   Ecore_X_Randr_Mode *modes = NULL;
+
+   if ((output != Ecore_X_Randr_None)
+       && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root))
+       && (output_info =
+             XRRGetOutputInfo(_ecore_x_disp, res, (RROutput)output)))
+     {
+        if ((modes = malloc(sizeof(Ecore_X_Randr_Mode) * output_info->nmode)))
+          {
+             int i = 0;
+
+             if (num) *num = output_info->nmode;
+             if (npreferred) *npreferred = output_info->npreferred;
+
+             for (i = 0; i < output_info->nmode; i++)
+               modes[i] = output_info->modes[i];
+          }
+     }
+
+   if (output_info)
+     XRRFreeOutputInfo(output_info);
+
+   if (res)
+     XRRFreeScreenResources(res);
+
+   return modes;
+#else
+   return NULL;
+#endif
+}
+
+EAPI Ecore_X_Randr_Crtc *
+ecore_x_randr_output_possible_crtcs_get(Ecore_X_Window root,
+                                        Ecore_X_Randr_Output output,
+                                        int *num)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   XRROutputInfo *output_info = NULL;
+   Ecore_X_Randr_Crtc *crtcs = NULL;
+
+   if ((output != Ecore_X_Randr_None))
+     {
+        if ((res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+          {
+             if ((output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
+               {
+                  if ((crtcs = malloc(sizeof(Ecore_X_Randr_Crtc) * output_info->ncrtc)))
+                    {
+                       memcpy(crtcs, output_info->crtcs, (sizeof(Ecore_X_Randr_Crtc) * output_info->ncrtc));
+                       if (num) *num = output_info->ncrtc;
+                    }
+                  XRRFreeOutputInfo(output_info);
+               }
+             XRRFreeScreenResources(res);
+          }
+     }
+   return crtcs;
+#else
+   return Ecore_X_Randr_None;
+#endif
+}
+
+/**
+ * @brief gets the the outputs which might be used simultenously on the same
+ * CRTC.
+ * @param root window that this information should be queried for.
+ * @param output the output which's clones we concern
+ * @param num number of possible clones
+ */
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_output_clones_get(Ecore_X_Window root,
+                                Ecore_X_Randr_Output output,
+                                int *num)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   XRROutputInfo *output_info = NULL;
+   Ecore_X_Randr_Output *outputs = NULL;
+
+   if ((output != Ecore_X_Randr_None))
+     {
+        if ((res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+          {
+             if ((output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
+               {
+                  if ((outputs = malloc(sizeof(Ecore_X_Randr_Output) * output_info->nclone)))
+                    {
+                       memcpy(outputs, output_info->clones, (sizeof(Ecore_X_Randr_Output) * output_info->nclone));
+                       if (num) *num = output_info->nclone;
+                    }
+                  XRRFreeOutputInfo(output_info);
+               }
+             XRRFreeScreenResources(res);
+          }
+     }
+   return outputs;
+#else
+   return Ecore_X_Randr_None;
+#endif
+}
+
+EAPI Ecore_X_Randr_Crtc
+ecore_x_randr_output_crtc_get(Ecore_X_Window root,
+                              Ecore_X_Randr_Output output)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
+   XRRScreenResources *res = NULL;
+   XRROutputInfo *output_info = NULL;
+   Ecore_X_Randr_Crtc ret = Ecore_X_Randr_None;
+
+   if ((output != Ecore_X_Randr_None))
+     {
+        if ((res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+          {
+             if ((output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
+               {
+                  ret = output_info->crtc;
+                  XRRFreeOutputInfo(output_info);
+               }
+             XRRFreeScreenResources(res);
+          }
+     }
+
+   return ret;
+#else
+   return Ecore_X_Randr_None;
+#endif
+}
+
+/**
+ * @brief gets the given output's name as reported by X
+ * @param root the window which's screen will be queried
+ * @param output The output for which the name will be reported.
+ * @param len length of returned c-string.
+ * @return name of the output as reported by X
+ */
+EAPI char *
+ecore_x_randr_output_name_get(Ecore_X_Window root,
+                              Ecore_X_Randr_Output output,
+                              int *len)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   XRRScreenResources *res = NULL;
+   XRROutputInfo *output_info = NULL;
+   char *ret = NULL;
+
+   if ((output != Ecore_X_Randr_None)
+       && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root))
+       && (output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
+     {
+        /*
+         * Actually the below command is correct, but due to a bug in libXrandr
+         * it doesn't work. Therefore we stick with strlen().
+         * Replace the line below with the following once this bug is
+         * fixed within libXrandr.
+         *
+         *    *len = output_info->nameLen;
+         *
+         */
+        if ((ret = strdup(output_info->name)) && len)
+          *len = strlen(ret);
+
+        XRRFreeOutputInfo(output_info);
+     }
+
+   if (res)
+     XRRFreeScreenResources(res);
+
+   return ret;
+#else
+   return NULL;
+#endif
+}
+
+/**
+ * @brief gets the width and hight of a given mode
+ * @param mode the mode which's size is to be looked up
+ * @param w width of given mode in px
+ * @param h height of given mode in px
+ */
+EAPI void
+ecore_x_randr_mode_size_get(Ecore_X_Window root,
+                            Ecore_X_Randr_Mode mode,
+                            int *w,
+                            int *h)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   XRRScreenResources *res = NULL;
+   int i;
+
+   if ((mode != Ecore_X_Randr_None)
+       && (w || h)
+       && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+     {
+        for (i = 0; i < res->nmode; i++)
+          {
+             if (res->modes[i].id == mode)
+               {
+                  if (w)
+                    *w = res->modes[i].width;
+
+                  if (h)
+                    *h = res->modes[i].height;
+
+                  break;
+               }
+          }
+     }
+
+   if (res)
+     XRRFreeScreenResources(res);
+
+#endif
+}
+
+/**
+ * @brief gets the EDID information of an attached output if available.
+ * Note that this information is not to be compared using ordinary string
+ * comparison functions, since it includes 0-bytes.
+ * @param root window this information should be queried from
+ * @param output the XID of the output
+ * @param length length of the byte-array. If NULL, request will fail.
+ */
+EAPI unsigned char *
+ecore_x_randr_output_edid_get(Ecore_X_Window root,
+                              Ecore_X_Randr_Output output,
+                              unsigned long *length)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(NULL);
+   Atom name = XInternAtom (_ecore_x_disp, RANDR_PROPERTY_EDID, False);
+   unsigned char *prop_data, *ret = NULL;
+   int actual_format;
+   unsigned long nitems, bytes_after;
+   Atom actual_type;
+
+   if (!length || !_ecore_x_randr_output_validate(root, output))
+     return NULL;
+
+   if (XRRGetOutputProperty (_ecore_x_disp, output, name,
+                             0, 100, False, False,
+                             AnyPropertyType,
+                             &actual_type, &actual_format,
+                             &nitems, &bytes_after, &prop_data) == Success)
+     {
+        if (actual_type == XA_INTEGER && actual_format == 8)
+          {
+             if ((ret = malloc(nitems * sizeof(unsigned char))))
+               {
+                  if (length &&
+                      (memcpy(ret, prop_data, (nitems * sizeof(unsigned char)))))
+                    *length = nitems;
+
+                  return ret;
+               }
+          }
+     }
+
+   return NULL;
+#else
+   return NULL;
+#endif
+}
+
+EAPI Ecore_X_Randr_Connection_Status
+ecore_x_randr_output_connection_status_get(Ecore_X_Window root,
+                                           Ecore_X_Randr_Output output)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN);
+   XRRScreenResources *res = NULL;
+   XRROutputInfo *output_info = NULL;
+   Ecore_X_Randr_Connection_Status ret =
+     ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
+
+   if ((output != Ecore_X_Randr_None)
+       && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root))
+       && (output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
+     {
+        ret = output_info->connection;
+     }
+
+   if (output_info)
+     XRRFreeOutputInfo(output_info);
+
+   if (res)
+     XRRFreeScreenResources(res);
+
+   return ret;
+#else
+   return ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
+#endif
+}
+
+EAPI void
+ecore_x_randr_output_size_mm_get(Ecore_X_Window root,
+                                 Ecore_X_Randr_Output output,
+                                 int *w_mm,
+                                 int *h_mm)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   XRRScreenResources *res = NULL;
+   XRROutputInfo *output_info = NULL;
+
+   if ((output != Ecore_X_Randr_None)
+       && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+     {
+        if ((output_info =
+               XRRGetOutputInfo(_ecore_x_disp, res, (RROutput)output)))
+          {
+             if (w_mm)
+               *w_mm = output_info->mm_width;
+
+             if (h_mm)
+               *h_mm = output_info->mm_height;
+
+             XRRFreeOutputInfo(output_info);
+          }
+
+        XRRFreeScreenResources(res);
+     }
+
+#endif
+}
+
+EAPI Eina_Bool
+ecore_x_randr_move_all_crtcs_but(Ecore_X_Window root,
+                                 const Ecore_X_Randr_Crtc *not_moved,
+                                 int nnot_moved,
+                                 int dx,
+                                 int dy)
+{
+#ifdef ECORE_XRANDR
+   Ecore_X_Randr_Crtc *crtcs_to_be_moved = NULL;
+   XRRScreenResources *res = NULL;
+   int i, j, k, n;
+   Eina_Bool ret;
+
+   if ((nnot_moved <= 0) || (!not_moved)
+       || !_ecore_x_randr_root_validate(root)
+       || !(res =
+              _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     return EINA_FALSE;
+
+   n = (res->ncrtc - nnot_moved);
+   if ((crtcs_to_be_moved = malloc(sizeof(Ecore_X_Randr_Crtc) * n)))
+     {
+        for (i = 0, k = 0; (i < res->ncrtc) && (k < n); i++)
+          {
+             for (j = 0; j < nnot_moved; j++)
+               {
+                  if (res->crtcs[i] == not_moved[j])
+                    break;
+               }
+             if (j == nnot_moved)
+               //crtcs[i] is not in the 'not to move'-list
+               crtcs_to_be_moved[k++] = res->crtcs[i];
+          }
+     }
+
+   XRRFreeScreenResources(res);
+   ret = ecore_x_randr_move_crtcs(root, crtcs_to_be_moved, n, dx, dy);
+   free(crtcs_to_be_moved);
+   return ret;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/*
+ * @brief Move given CRTCs belonging to the given root window's screen dx/dy
+ * pixels relative to their current position. The screen size will be
+ * automatically adjusted if necessary and possible.
+ *
+ * @param root Window which's screen's resources are used.
+ * @param crtcs List of CRTCs to be moved.
+ * @param ncrtc Number of CRTCs in array.
+ * @param dx Amount of pixels the CRTCs should be moved in x direction.
+ * @param dy Amount of pixels the CRTCs should be moved in y direction.
+ * @return @c EINA_TRUE if all crtcs could be moved successfully.
+ */
+EAPI Eina_Bool
+ecore_x_randr_move_crtcs(Ecore_X_Window root,
+                         const Ecore_X_Randr_Crtc *crtcs,
+                         int ncrtc,
+                         int dx,
+                         int dy)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+   XRRScreenResources *res = NULL;
+   XRRCrtcInfo **crtc_info = NULL;
+   Eina_Bool ret = EINA_TRUE;
+   int i, cw, ch, w_max, h_max, nw, nh;
+
+   crtc_info = alloca(sizeof(XRRCrtcInfo *) * ncrtc);
+   memset(crtc_info, 0, sizeof(XRRCrtcInfo *) * ncrtc);
+   if (_ecore_x_randr_root_validate(root)
+       && (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
+     {
+        ecore_x_randr_screen_size_range_get(root, NULL, NULL, &w_max, &h_max);
+        ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
+        nw = cw;
+        nh = ch;
+
+        for (i = 0;
+             (i < ncrtc) &&
+             (crtc_info[i] = XRRGetCrtcInfo(_ecore_x_disp, res, crtcs[i]));
+             i++)
+          {
+             if (((crtc_info[i]->x + dx) < 0) ||
+                 ((int)(crtc_info[i]->x + crtc_info[i]->width + dx) > w_max)
+                 || ((crtc_info[i]->y + dy) < 0) ||
+                 ((int)(crtc_info[i]->y + crtc_info[i]->height + dy) > h_max)
+                 )
+               goto _ecore_x_randr_move_crtcs_fail_free_crtc_info;
+
+             nw = MAX((int)(crtc_info[i]->x + crtc_info[i]->width + dx), nw);
+             nh = MAX((int)(crtc_info[i]->y + crtc_info[i]->height + dy), nh);
+          }
+        //not out of bounds
+
+        //resize if necessary
+        if (!(((nw > cw) ||
+               (nh > ch)) ||
+              ecore_x_randr_screen_current_size_set(root, nw, nh,
+                                                    Ecore_X_Randr_Unset,
+                                                    Ecore_X_Randr_Unset)))
+          goto _ecore_x_randr_move_crtcs_fail_free_crtc_info;
+
+        //actually move all the crtcs, keep their rotation and mode.
+        for (i = 0; (i < ncrtc) && crtc_info[i]; i++)
+          {
+             if ((crtc_info[i]) &&
+                 (!ecore_x_randr_crtc_settings_set(root, crtcs[i], NULL,
+                                                   Ecore_X_Randr_Unset,
+                                                   (crtc_info[i]->x + dx),
+                                                   (crtc_info[i]->y + dy),
+                                                   crtc_info[i]->mode,
+                                                   crtc_info[i]->rotation)))
+               {
+                  ret = EINA_FALSE;
+                  break;
+               }
+          }
+        if (i < ncrtc)
+          {
+             //something went wrong, let's try to move the already moved crtcs
+             //back.
+             while ((i--) >= 0)
+               {
+                  if (crtc_info[i])
+                    ecore_x_randr_crtc_settings_set(root,
+                                                    crtcs[i],
+                                                    NULL,
+                                                    Ecore_X_Randr_Unset,
+                                                    (crtc_info[i]->x - dx),
+                                                    (crtc_info[i]->y - dy),
+                                                    crtc_info[i]->mode,
+                                                    crtc_info[i]->rotation);
+               }
+          }
+
+        for (i = 0; i < ncrtc; i++)
+          {
+             if (crtc_info[i]) XRRFreeCrtcInfo(crtc_info[i]);
+          }
+     }
+
+   XRRFreeScreenResources(res);
+
+   return ret;
+_ecore_x_randr_move_crtcs_fail_free_crtc_info:
+   while (i-- > 0)
+     XRRFreeCrtcInfo(crtc_info[i]);
+   XRRFreeScreenResources(res);
+   return EINA_FALSE;
+#else
+   return EINA_FALSE;
+#endif
+}
+
+/**
+ * @brief removes unused screen space. The most upper left CRTC is set to 0x0
+ * and all other CRTCs dx,dy respectively.
+ * @param root the window's screen which will be reset.
+ */
+EAPI void
+ecore_x_randr_screen_reset(Ecore_X_Window root)
+{
+#ifdef ECORE_XRANDR
+   XRRCrtcInfo *crtc_info = NULL;
+   XRRScreenResources *res = NULL;
+   //the 100000 are just a random huge number.
+   int i, dx_min = 100000, dy_min = 100000, w_n = 0, h_n = 0, nenabled_crtcs = 0;
+
+   if (!_ecore_x_randr_root_validate(root) ||
+       !(res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
+     return;
+
+   Ecore_X_Randr_Crtc enabled_crtcs[res->ncrtc];
+
+   for (i = 0; i < res->ncrtc; i++)
+     {
+        if (!(crtc_info =
+                XRRGetCrtcInfo(_ecore_x_disp, res,
+                               res->crtcs[i])) ||
+            (crtc_info->mode == Ecore_X_Randr_None) ||
+            (crtc_info->mode == Ecore_X_Randr_Unset)
+            || ((crtc_info->noutput == 0)))
+          continue;
+
+        enabled_crtcs[nenabled_crtcs++] = res->crtcs[i];
+
+        if ((int)(crtc_info->x + crtc_info->width) > w_n)
+          w_n = (crtc_info->x + crtc_info->width);
+
+        if ((int)(crtc_info->y + crtc_info->height) > h_n)
+          h_n = (crtc_info->y + crtc_info->height);
+
+        if (crtc_info->x < dx_min)
+          dx_min = crtc_info->x;
+        if (crtc_info->y < dy_min)
+          dy_min = crtc_info->y;
+
+        XRRFreeCrtcInfo(crtc_info);
+     }
+   if ((dx_min > 0) || (dy_min > 0))
+     {
+        if (ecore_x_randr_move_crtcs(root, enabled_crtcs, nenabled_crtcs, -dx_min, -dy_min))
+          {
+             w_n -= dx_min;
+             h_n -= dy_min;
+          }
+     }
+   ecore_x_randr_screen_current_size_set(root,
+                                         w_n,
+                                         h_n,
+                                         Ecore_X_Randr_Unset,
+                                         Ecore_X_Randr_Unset);
+#endif
+}
+
+/**
+ * @brief Set up the backlight level to the given level.
+ *
+ * @param root The window's screen which will be set.
+ * @param level Of the backlight between @c 0 and @c 1.
+ */
+
+EAPI void
+ecore_x_randr_screen_backlight_level_set(Ecore_X_Window root,
+                                         double level)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET();
+   Atom _backlight;
+   XRRScreenResources *resources = NULL;
+   Ecore_X_Randr_Output output;
+   int o;
+
+   if ((level < 0) || (level > 1))
+     {
+        ERR("Wrong value for the backlight level. It should be between 0 and 1.");
+        return;
+     }
+
+   /*
+    * To make sure that the _backlight atomic property still exists.
+    */
+   _backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
+   if (_backlight == None)
+     {
+        WRN("Backlight setting is not supported on this server or driver");
+        return;
+     }
+
+   /* get the ressources */
+   resources = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root);
+   if (!resources) return;
+
+   for (o = 0; o < resources->noutput; o++)
+     {
+        output = resources->outputs[o];
+        if (ecore_x_randr_output_backlight_level_get(root, output) >= 0)
+          {
+             ecore_x_randr_output_backlight_level_set(root, output, level);
+          }
+     }
+   XRRFreeScreenResources(resources);
+#endif
+}
+
+/*
+ * @brief Check if a backlight is available.
+ * @return Whether a backlight is available.
+ */
+
+EAPI Eina_Bool
+ecore_x_randr_output_backlight_available(void)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(-1);
+   Atom _backlight;
+
+   _backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
+
+   return (_backlight == None) ? EINA_FALSE : EINA_TRUE;
+
+#endif
+   return EINA_FALSE;
+}
+
+/*
+ * @brief Get the backlight level of the given output.
+ *
+ * @param root Window which's screen should be queried.
+ * @param output From which the backlight level should be retrieved.
+ * @return The backlight level.
+ */
+
+EAPI double
+ecore_x_randr_output_backlight_level_get(Ecore_X_Window root,
+                                         Ecore_X_Randr_Output output)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(-1);
+   Atom actual_type;
+   Atom _backlight;
+   XRRPropertyInfo *info = NULL;
+   double dvalue;
+   int actual_format;
+   long value, max, min;
+   unsigned long nitems;
+   unsigned long bytes_after;
+   unsigned char *prop = NULL;
+
+   /* set backlight variable if not already done */
+
+   _backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
+   if (_backlight == None)
+     {
+        ERR("Backlight property is not suppported on this server or driver");
+        return -1;
+     }
+
+   if (!_ecore_x_randr_output_validate(root, output))
+     {
+        ERR("Invalid output");
+        return -1;
+     }
+
+   if (XRRGetOutputProperty(_ecore_x_disp, output, _backlight,
+                            0, 4, False, False, None,
+                            &actual_type, &actual_format,
+                            &nitems, &bytes_after, &prop) != Success)
+     {
+        WRN("Backlight not supported on this output");
+        return -1;
+     }
+
+   if ((actual_type != XA_INTEGER) || (nitems != 1) || (actual_format != 32)) return -1;
+
+   value = *((long *)prop);
+   free (prop);
+
+   /* I have the current value of the backlight */
+   /* Now retrieve the min and max intensities of the output */
+   info = XRRQueryOutputProperty(_ecore_x_disp, output, _backlight);
+   if (info)
+     {
+        dvalue = -1;
+        if ((info->range) && (info->num_values == 2))
+          {
+             /* finally convert the current value in the interval [0..1] */
+             min = info->values[0];
+             max = info->values[1];
+             dvalue = ((double)(value - min)) / ((double)(max - min));
+          }
+        free(info);
+        return dvalue;
+     }
+#endif
+   return -1;
+}
+
+/*
+ * @brief Set the backlight level of a given output.
+ *
+ * @param root Window which's screen should be queried.
+ * @param output That should be set.
+ * @param level For which the backlight should be set.
+ * @return @c EINA_TRUE in case of success.
+ */
+
+EAPI Eina_Bool
+ecore_x_randr_output_backlight_level_set(Ecore_X_Window root,
+                                         Ecore_X_Randr_Output output,
+                                         double level)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_2_RET(EINA_FALSE);
+   Atom _backlight;
+   XRRPropertyInfo *info = NULL;
+   double min, max, tmp;
+   long new;
+
+   if ((level < 0) || (level > 1))
+     {
+        ERR("Backlight level should be between 0 and 1");
+        return EINA_FALSE;
+     }
+
+   if (!_ecore_x_randr_output_validate(root, output))
+     {
+        ERR("Wrong output value");
+        return EINA_FALSE;
+     }
+
+   _backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
+   if (_backlight == None)
+     {
+        WRN("Backlight property is not suppported on this server or driver");
+        return EINA_FALSE;
+     }
+
+   info = XRRQueryOutputProperty(_ecore_x_disp, output, _backlight);
+   if (info)
+     {
+        if ((info->range) && (info->num_values == 2))
+          {
+             min = info->values[0];
+             max = info->values[1];
+             tmp = (level * (max - min)) + min;
+             new = tmp;
+             if (new > max) new = max;
+             if (new < min) new = min;
+             XRRChangeOutputProperty(_ecore_x_disp, output, _backlight, XA_INTEGER, 32,
+                                     PropModeReplace, (unsigned char *)&new, 1);
+             XFlush(_ecore_x_disp);
+          }
+        free(info);
+        return EINA_TRUE;
+     }
+#endif
+   return EINA_FALSE;
+}
+
+/*
+ * @brief Get the outputs, which display a certain window.
+ *
+ * @param window Window the displaying outputs shall be found for
+ * @param num The number of outputs displaying the window
+ * @return Array of outputs that display a certain window. @c NULL if no
+ * outputs was found that displays the specified window.
+ */
+
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_window_outputs_get(Ecore_X_Window window,
+                                 int *num)
+{
+#ifdef ECORE_XRANDR
+   Ecore_X_Window root;
+   Ecore_X_Randr_Crtc *crtcs;
+   Ecore_X_Randr_Output *outputs, *ret = NULL, *tret;
+   int ncrtcs, noutputs, i, nret = 0;
+
+   if (_randr_version < RANDR_1_2) goto _ecore_x_randr_current_output_get_fail;
+
+   root = ecore_x_window_root_get(window);
+   if (!(crtcs = ecore_x_randr_window_crtcs_get(window, &ncrtcs)))
+     goto _ecore_x_randr_current_output_get_fail;
+   
+   for (i = 0, nret = 0; i < ncrtcs; i++)
+     {
+
+        outputs = ecore_x_randr_crtc_outputs_get(root, crtcs[i],
+                                                 &noutputs);
+        if (!outputs)
+          goto _ecore_x_randr_current_output_get_fail_free;
+        tret = realloc(ret, ((nret + noutputs) * sizeof(Ecore_X_Randr_Output)));
+        if (!tret) goto _ecore_x_randr_current_output_get_fail_free;
+        ret = tret;
+        memcpy(&ret[nret], outputs, (noutputs * sizeof(Ecore_X_Randr_Output)));
+        nret += noutputs;
+        free(outputs);
+        outputs = NULL;
+     }
+   free(crtcs);
+
+   if (num)
+     *num = nret;
+
+   return ret;
+
+_ecore_x_randr_current_output_get_fail_free:
+   free(outputs);
+   free(crtcs);
+   free(ret);
+_ecore_x_randr_current_output_get_fail:
+#endif
+   if (num) *num = 0;
+   return NULL;
+}
+
+/*
+ * @deprecated bad naming. Use ecore_x_randr_window_outputs_get instead.
+ * @brief Get the outputs, which display a certain window.
+ *
+ * @param window Window the displaying outputs shall be found for.
+ * @param num The number of outputs displaying the window.
+ * @return Array of outputs that display a certain window. @c NULL if no
+ * outputs was found that displays the specified window.
+ */
+
+EAPI Ecore_X_Randr_Output *
+ecore_x_randr_current_output_get(Ecore_X_Window window,
+                                 int *num)
+{
+   return ecore_x_randr_window_outputs_get(window, num);
+}
+
diff --git a/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c b/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c
new file mode 100644 (file)
index 0000000..5bda332
--- /dev/null
@@ -0,0 +1,463 @@
+/*
+ * Copyright 2006-2009 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Original Author: Adam Jackson <ajax@nwnk.net> */
+/* Heavily modified by: Leif Middelschulte <leif.middelschulte@gmail.com> */
+
+#include "Ecore_X.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+/* TODO:
+ * - see other TODO's within this file.
+ */
+
+#define ECORE_X_RANDR_EDID_VERSION_10                                   ((1 << 8) | 0)
+#define ECORE_X_RANDR_EDID_VERSION_11                                   ((1 << 8) | 1)
+#define ECORE_X_RANDR_EDID_VERSION_12                                   ((1 << 8) | 2)
+#define ECORE_X_RANDR_EDID_VERSION_13                                   ((1 << 8) | 3)
+#define ECORE_X_RANDR_EDID_VERSION_14                                   ((1 << 8) | 4)
+
+#define _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER                         0x08
+#define _ECORE_X_RANDR_EDID_OFFSET_TYPE                                 0x14
+#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR                        0x12
+#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR                        0x13
+#define _ECORE_X_RANDR_EDID_OFFSET_DPMS                                 0x18
+#define _ECORE_X_RANDR_EDID_OFFSET_COLORSPACE                           0x18
+#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK                     0x36
+#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE                3
+#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT             5
+#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED               15
+#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO                         14
+
+#define _ECORE_X_RANDR_EDID_MASK_DIGITAL                                0x80
+#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_INTERFACE                      0x0f
+#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_TMDS_DFP_10                    0x01
+#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS                  0x18
+#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444          0x10
+#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422          0x08
+#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED                 0xe0
+#define _ECORE_X_RANDR_EDID_MASK_DPMS                                   0xE0
+#define _ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY                           0x80
+#define _ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND                           0x40
+#define _ECORE_X_RANDR_EDID_MASK_DPMS_OFF                               0x20
+#define _ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE                         0x0f
+#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3                       0x80
+#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9                      0x40
+#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10                     0x20
+#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4                       0x10
+#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9                      0x08
+
+#define _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX 13
+
+typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio_Preferred {
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3 = 0x00,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9 = 0x01,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10 = 0x02,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4 = 0x03,
+   ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9 = 0x04
+} Ecore_X_Randr_Edid_Aspect_Ratio_Preferred;
+
+/* Some convenience loops */
+#define _ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, extension_block_iter) \
+  for (extension_block_iter = edid; extension_block_iter < (edid + edid_length); extension_block_iter += 128)
+
+#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter) \
+  _ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, cea_block_iter) \
+  if (cea_block_iter[0] == 0x02)
+
+/* The following macro is to be used with caution as it inherits another loop.
+ * Therefore using a 'break;' statement will lead to continuation in the
+ * inherent 'Extension block'-loop.
+ */
+#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_DETAILED_BLOCK(edid, edid_length, cea_block_iter, detailed_block_iter)                              \
+  _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter)                                                                  \
+  for (detailed_block_iter = cea_block_iter + cea_block_iter[2]; detailed_block_iter + 18 < cea_block_iter + 127; detailed_block_iter += 18) \
+    if (detailed_block_iter[0])
+
+#define _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
+  for (block = edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK; block <= (edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK + (3 * 18)); block += 18)
+
+#define _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) \
+  _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block)                 \
+  if ((block[0] == 0) && (block[1] == 0))
+
+EAPI Eina_Bool
+ecore_x_randr_edid_has_valid_header(unsigned char *edid,
+                                    unsigned long edid_length)
+{
+   const unsigned char header[] =
+   { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 };
+   if (!edid) return EINA_FALSE;
+   if (edid_length < 8) return EINA_FALSE;
+   if (!memcmp(edid, header, 8)) return EINA_TRUE;
+   return EINA_FALSE;
+}
+
+EAPI int
+ecore_x_randr_edid_version_get(unsigned char *edid,
+                               unsigned long edid_length)
+{
+   if ((edid_length > _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR) &&
+       (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
+     return (edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR] << 8) |
+            edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR];
+   return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+}
+
+EAPI int
+ecore_x_randr_edid_manufacturer_model_get(unsigned char *edid,
+                                          unsigned long edid_length)
+{
+   if ((edid_length > 0x0b) &&
+       (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
+     return (int)(edid[0x0a] + (edid[0x0b] << 8));
+   return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+}
+
+EAPI int
+ecore_x_randr_edid_manufacturer_serial_number_get(unsigned char *edid,
+                                                  unsigned long edid_length)
+{
+   if ((edid_length > 0x0f) &&
+       (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
+     return (int)(edid[0x0c] + (edid[0x0d] << 8) +
+                  (edid[0x0e] << 16) + (edid[0x0f] << 24));
+   return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+}
+
+EAPI char *
+ecore_x_randr_edid_manufacturer_name_get(unsigned char *edid,
+                                         unsigned long edid_length)
+{
+   if ((edid_length > (_ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER + 1)) &&
+       (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
+     {
+        unsigned char *x;
+        char *name;
+
+        x = (edid + _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER);
+        name = malloc(sizeof(char) * 4);
+        if (!name) return NULL;
+        name[0] = ((x[0] & 0x7c) >> 2) + '@';
+        name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xe0) >> 5) + '@';
+        name[2] = (x[1] & 0x1f) + '@';
+        name[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] = 0;
+        return name;
+     }
+   return NULL;
+}
+
+EAPI char *
+ecore_x_randr_edid_display_name_get(unsigned char *edid,
+                                    unsigned long edid_length)
+{
+   unsigned char *block = NULL;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
+   _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
+   {
+      if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfc)
+        {
+           char *name, *p;
+           const char *edid_name;
+
+           edid_name = (const char *)block + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
+           name = malloc(sizeof(char) * _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
+           if (!name) return NULL;
+           strncpy(name, edid_name, (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
+           name[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
+           for (p = name; *p; p++)
+             {
+                if ((*p < ' ') || (*p > '~')) *p = 0;
+             }
+           return name;
+        }
+   }
+   return NULL;
+}
+
+EAPI Ecore_X_Randr_Edid_Aspect_Ratio
+ecore_x_randr_edid_display_aspect_ratio_preferred_get(unsigned char *edid,
+                                                      unsigned long edid_length)
+{
+   unsigned char *block = NULL;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+   _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
+   {
+      if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfd) &&
+          (block[10] == 0x04))
+        {
+           Ecore_X_Randr_Edid_Aspect_Ratio_Preferred preferred_ratio =
+             (Ecore_X_Randr_Edid_Aspect_Ratio_Preferred)
+             ((block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED] &
+               _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED) >> 5);
+           switch (preferred_ratio)
+             {
+              case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3:
+                return ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3;
+
+              case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9:
+                return ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9;
+
+              case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10:
+                return ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10;
+
+              case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4:
+                return ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4;
+
+              case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9:
+                return ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9;
+
+              default:
+                return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+             }
+        }
+   }
+   return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+}
+
+EAPI Ecore_X_Randr_Edid_Aspect_Ratio
+ecore_x_randr_edid_display_aspect_ratios_get(unsigned char *edid,
+                                             unsigned long edid_length)
+{
+   Ecore_X_Randr_Edid_Aspect_Ratio ret = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+   unsigned char *block = NULL;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+   _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
+   {
+      if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfd) &&
+          (block[10] == 0x04))
+        {
+           if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3)
+             ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3;
+           if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9)
+             ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9;
+           if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10)
+             ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10;
+           if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4)
+             ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4;
+           if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9)
+             ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9;
+        }
+   }
+   return ret;
+}
+
+EAPI char *
+ecore_x_randr_edid_display_ascii_get(unsigned char *edid,
+                                     unsigned long edid_length)
+{
+   unsigned char *block = NULL;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
+   _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
+   {
+      if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfe)
+        {
+           char *ascii, *p;
+           const char *edid_ascii = (const char *)block +
+             _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
+           /*
+            * TODO: Two of these in a row, in the third and fourth slots,
+            * seems to be specified by SPWG: http://www.spwg.org/
+            */
+           ascii = malloc(sizeof(char) * _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
+           if (!ascii) return NULL;
+           strncpy(ascii, edid_ascii, (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
+           ascii[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
+           for (p = ascii; *p; p++)
+             {
+                if ((*p < ' ') || (*p > '~')) *p = 0;
+             }
+           return ascii;
+        }
+   }
+   return NULL;
+}
+
+EAPI char *
+ecore_x_randr_edid_display_serial_get(unsigned char *edid,
+                                      unsigned long edid_length)
+{
+   unsigned char *block = NULL;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
+   _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
+   {
+      if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xff)
+        {
+           char *serial, *p;
+           const char *edid_serial = (const char *)block +
+             _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
+           /*
+            * TODO: Two of these in a row, in the third and fourth slots,
+            * seems to be specified by SPWG: http://www.spwg.org/
+            */
+           serial = malloc(sizeof(char) * _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
+           if (!serial) return NULL;
+           strncpy(serial, edid_serial, (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
+           serial[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
+           for (p = serial; *p; p++)
+             {
+                if ((*p < ' ') || (*p > '~')) *p = 0;
+             }
+           return serial;
+        }
+   }
+   return NULL;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_edid_info_has_valid_checksum(unsigned char *edid,
+                                           unsigned long edid_length)
+{
+   unsigned char *cea_block_iter = NULL;
+   char sum = 0;
+   int i;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
+   if (edid_length < 128) return EINA_FALSE;
+
+   /* Check the EDID block itself */
+   for (i = 0; i < 128; i++)
+     sum += edid[i];
+   if (sum) return EINA_FALSE;
+
+   /* Check the cea extension blocks */
+   _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter)
+   {
+      for (i = 0, sum = 0; i < 128; i++)
+        sum += cea_block_iter[i];
+   }
+   if (sum) return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_edid_dpms_available_get(unsigned char *edid,
+                                      unsigned long edid_length)
+{
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
+   return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
+             _ECORE_X_RANDR_EDID_MASK_DPMS);
+}
+
+EAPI Eina_Bool
+ecore_x_randr_edid_dpms_standby_available_get(unsigned char *edid,
+                                              unsigned long edid_length)
+{
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
+   if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
+     return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
+               _ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY);
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_edid_dpms_suspend_available_get(unsigned char *edid,
+                                              unsigned long edid_length)
+{
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
+   if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
+     return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
+               _ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND);
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_edid_dpms_off_available_get(unsigned char *edid,
+                                          unsigned long edid_length)
+{
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
+   if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
+     return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
+               _ECORE_X_RANDR_EDID_MASK_DPMS_OFF);
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_randr_edid_display_type_digital_get(unsigned char *edid,
+                                            unsigned long edid_length)
+{
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
+   return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE] &
+             _ECORE_X_RANDR_EDID_MASK_DIGITAL);
+}
+
+EAPI Ecore_X_Randr_Edid_Display_Colorscheme
+ecore_x_randr_edid_display_colorscheme_get(unsigned char *edid,
+                                           unsigned long edid_length)
+{
+   Ecore_X_Randr_Edid_Display_Colorscheme colorscheme = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return colorscheme;
+   if (ecore_x_randr_edid_display_type_digital_get(edid, edid_length))
+     {
+        colorscheme = ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_4_4_4;
+        if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] &
+            _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444)
+          colorscheme |= ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_4_4;
+        if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] &
+            _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422)
+          colorscheme |= ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_2_2;
+     }
+   else
+     colorscheme = edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] & _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS;
+   return colorscheme;
+}
+
+EAPI Ecore_X_Randr_Edid_Display_Interface_Type
+ecore_x_randr_edid_display_interface_type_get(unsigned char *edid,
+                                              unsigned long edid_length)
+{
+   Ecore_X_Randr_Edid_Display_Interface_Type type = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+   int version = ecore_x_randr_edid_version_get(edid, edid_length);
+
+   if (version < ECORE_X_RANDR_EDID_VERSION_13) return type;
+   type = edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE] &
+     _ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE;
+   if (type > ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT)
+     type = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
+   return type;
+}
+
diff --git a/src/lib/ecore_x/xlib/ecore_x_randr_13.c b/src/lib/ecore_x/xlib/ecore_x_randr_13.c
new file mode 100644 (file)
index 0000000..5d1c8e9
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * vim:ts=8:sw=3:sts=8:expandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "ecore_x_private.h"
+#include "ecore_x_randr.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#define Ecore_X_Randr_None  0
+#define Ecore_X_Randr_Unset -1
+
+#ifdef ECORE_XRANDR
+
+#define RANDR_1_3           ((1 << 16) | 3)
+#define RANDR_CHECK_1_3_RET(ret) if (_randr_version < RANDR_1_3) \
+    return ret
+
+extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
+                                                                  dpy,
+                                                                  Window
+                                                                  window);
+extern int _randr_version;
+#endif
+
+/*
+ * @param root window which's screen should be queried
+ * @return Ecore_X_Randr_Ouptut_Id or - if query failed or none is set - Ecore_X_Randr_None
+ */
+EAPI Ecore_X_Randr_Output
+ecore_x_randr_primary_output_get(Ecore_X_Window root)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_3_RET(Ecore_X_Randr_None);
+   if (!_ecore_x_randr_root_validate(root))
+     return Ecore_X_Randr_None;
+
+   return XRRGetOutputPrimary(_ecore_x_disp, root);
+#else
+   return Ecore_X_Randr_None;
+#endif
+}
+
+/*
+ * @param root window which's screen should be queried
+ * @param output that should be set as given root window's screen primary output
+ */
+EAPI void
+ecore_x_randr_primary_output_set(Ecore_X_Window root,
+                                 Ecore_X_Randr_Output output)
+{
+#ifdef ECORE_XRANDR
+   RANDR_CHECK_1_3_RET();
+
+   if (_ecore_x_randr_output_validate(root, output))
+     {
+        XRRSetOutputPrimary(_ecore_x_disp, root, output);
+     }
+
+#endif
+}
+
diff --git a/src/lib/ecore_x/xlib/ecore_x_region.c b/src/lib/ecore_x/xlib/ecore_x_region.c
new file mode 100644 (file)
index 0000000..81d7eea
--- /dev/null
@@ -0,0 +1,158 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include "ecore_x_private.h"
+
+/*
+ * [x] XCreateRegion
+ * [ ] XPolygonRegion
+ * [x] XSetRegion
+ * [x] XDestroyRegion
+ *
+ * [x] XOffsetRegion
+ * [ ] XShrinkRegion
+ *
+ * [ ] XClipBox
+ * [x] XIntersectRegion
+ * [x] XUnionRegion
+ * [x] XUnionRectWithRegion
+ * [x] XSubtractRegion
+ * [ ] XXorRegion
+ *
+ * [x] XEmptyRegion
+ * [x] XEqualRegion
+ *
+ * [x] XPointInRegion
+ * [x] XRectInRegion
+ */
+
+EAPI Ecore_X_XRegion *
+ecore_x_xregion_new()
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return (Ecore_X_XRegion *)XCreateRegion();
+}
+
+EAPI void
+ecore_x_xregion_free(Ecore_X_XRegion *region)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!region)
+     return;
+
+   XDestroyRegion((Region)region);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_set(Ecore_X_XRegion *region,
+                    Ecore_X_GC gc)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XSetRegion(_ecore_x_disp, gc, (Region)region) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI void
+ecore_x_xregion_translate(Ecore_X_XRegion *region,
+                          int x,
+                          int y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!region)
+     return;
+
+   /* return value not used */
+   XOffsetRegion((Region)region, x, y);
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_intersect(Ecore_X_XRegion *dst,
+                          Ecore_X_XRegion *r1,
+                          Ecore_X_XRegion *r2)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XIntersectRegion((Region)r1, (Region)r2, (Region)dst) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_union(Ecore_X_XRegion *dst,
+                      Ecore_X_XRegion *r1,
+                      Ecore_X_XRegion *r2)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XUnionRegion((Region)r1, (Region)r2, (Region)dst) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_union_rect(Ecore_X_XRegion *dst,
+                           Ecore_X_XRegion *src,
+                           Ecore_X_Rectangle *rect)
+{
+   XRectangle xr;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   xr.x = rect->x;
+   xr.y = rect->y;
+   xr.width = rect->width;
+   xr.height = rect->height;
+
+   return XUnionRectWithRegion(&xr, (Region)src, (Region)dst) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_subtract(Ecore_X_XRegion *dst,
+                         Ecore_X_XRegion *rm,
+                         Ecore_X_XRegion *rs)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XSubtractRegion((Region)rm, (Region)rs, (Region)dst) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_is_empty(Ecore_X_XRegion *region)
+{
+   if (!region)
+     return EINA_TRUE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XEmptyRegion((Region)region) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_is_equal(Ecore_X_XRegion *r1,
+                         Ecore_X_XRegion *r2)
+{
+   if (!r1 || !r2)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XEqualRegion((Region)r1, (Region)r1) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_point_contain(Ecore_X_XRegion *region,
+                              int x,
+                              int y)
+{
+   if (!region)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XPointInRegion((Region)region, x, y) ? EINA_TRUE : EINA_FALSE;
+}
+
+EAPI Eina_Bool
+ecore_x_xregion_rect_contain(Ecore_X_XRegion *region,
+                             Ecore_X_Rectangle *rect)
+{
+   if (!region || !rect)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XRectInRegion((Region)region,
+                        rect->x,
+                        rect->y,
+                        rect->width,
+                        rect->height) ? EINA_TRUE : EINA_FALSE;
+}
+
index 6559cad..3688a44 100644 (file)
@@ -1,9 +1,11 @@
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-/*
  * Screensaver code
  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 
 static int _screensaver_available = -1;
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_screensaver_event_available_get(void)
 {
-   if (_screensaver_available >= 0) return _screensaver_available;
+   if (_screensaver_available >= 0)
+     return _screensaver_available;
+
 #ifdef ECORE_XSS
    int _screensaver_major, _screensaver_minor;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _screensaver_major = 1;
    _screensaver_minor = 0;
 
-   if (XScreenSaverQueryVersion(_ecore_x_disp, &_screensaver_major, &_screensaver_minor))
+   if (XScreenSaverQueryVersion(_ecore_x_disp, &_screensaver_major,
+                                &_screensaver_minor))
      _screensaver_available = 1;
    else
      _screensaver_available = 0;
-#else
+
+#else /* ifdef ECORE_XSS */
    _screensaver_available = 0;
-#endif
+#endif /* ifdef ECORE_XSS */
    return _screensaver_available;
 }
 
@@ -38,21 +45,32 @@ ecore_x_screensaver_idle_time_get(void)
    XScreenSaverInfo *xss;
    int idle;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xss = XScreenSaverAllocInfo();
-   XScreenSaverQueryInfo(_ecore_x_disp, RootWindow(_ecore_x_disp, DefaultScreen(_ecore_x_disp)), xss); 
+   XScreenSaverQueryInfo(_ecore_x_disp,
+                         RootWindow(_ecore_x_disp, DefaultScreen(
+                                      _ecore_x_disp)), xss);
    idle = xss->idle / 1000;
    XFree(xss);
 
    return idle;
-#endif
-
+#else
    return 0;
+#endif /* ifdef ECORE_XSS */
 }
 
 EAPI void
-ecore_x_screensaver_set(int timeout, int interval, int prefer_blanking, int allow_exposures)
+ecore_x_screensaver_set(int timeout,
+                        int interval,
+                        int prefer_blanking,
+                        int allow_exposures)
 {
-   XSetScreenSaver(_ecore_x_disp, timeout, interval, prefer_blanking, allow_exposures);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSetScreenSaver(_ecore_x_disp,
+                   timeout,
+                   interval,
+                   prefer_blanking,
+                   allow_exposures);
 }
 
 EAPI void
@@ -60,6 +78,7 @@ ecore_x_screensaver_timeout_set(int timeout)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    XSetScreenSaver(_ecore_x_disp, timeout, pint, pblank, pexpo);
 }
@@ -69,6 +88,7 @@ ecore_x_screensaver_timeout_get(void)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    return pto;
 }
@@ -78,6 +98,7 @@ ecore_x_screensaver_blank_set(int blank)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    XSetScreenSaver(_ecore_x_disp, pto, pint, blank, pexpo);
 }
@@ -87,6 +108,7 @@ ecore_x_screensaver_blank_get(void)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    return pblank;
 }
@@ -96,6 +118,7 @@ ecore_x_screensaver_expose_set(int expose)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    XSetScreenSaver(_ecore_x_disp, pto, pint, pblank, expose);
 }
@@ -105,6 +128,7 @@ ecore_x_screensaver_expose_get(void)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    return pexpo;
 }
@@ -114,6 +138,7 @@ ecore_x_screensaver_interval_set(int interval)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    XSetScreenSaver(_ecore_x_disp, pto, interval, pblank, pexpo);
 }
@@ -123,22 +148,57 @@ ecore_x_screensaver_interval_get(void)
 {
    int pto, pint, pblank, pexpo;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
    return pint;
 }
 
 EAPI void
-ecore_x_screensaver_event_listen_set(int on)
+ecore_x_screensaver_event_listen_set(Eina_Bool on)
 {
 #ifdef ECORE_XSS
    Ecore_X_Window root;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    root = DefaultRootWindow(_ecore_x_disp);
    if (on)
-     XScreenSaverSelectInput(_ecore_x_disp, root, ScreenSaverNotifyMask);
+     XScreenSaverSelectInput(_ecore_x_disp, root,
+                             ScreenSaverNotifyMask | ScreenSaverCycle);
    else
      XScreenSaverSelectInput(_ecore_x_disp, root, 0);
 #else
-   on = 0;
-#endif
+   return;
+   on = EINA_FALSE;
+#endif /* ifdef ECORE_XSS */
+}
+
+
+EAPI Eina_Bool
+ecore_x_screensaver_custom_blanking_enable(void)
+{
+#ifdef ECORE_XSS
+   XSetWindowAttributes attr;
+   
+   XScreenSaverSetAttributes(_ecore_x_disp,
+                             DefaultRootWindow(_ecore_x_disp),
+                             -9999, -9999, 1, 1, 0,
+                             CopyFromParent, InputOnly, CopyFromParent,
+                             0, &attr);
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XSS */
 }
+
+EAPI Eina_Bool
+ecore_x_screensaver_custom_blanking_disable(void)
+{
+#ifdef ECORE_XSS
+   XScreenSaverUnsetAttributes(_ecore_x_disp,
+                               DefaultRootWindow(_ecore_x_disp));
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XSS */
+}
+
index de45c23..e94d5a3 100644 (file)
@@ -1,8 +1,12 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-#include "ecore_private.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <string.h>
+
 #include "Ecore.h"
+#include "ecore_private.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include "Ecore_X_Atoms.h"
@@ -11,14 +15,22 @@ static Ecore_X_Selection_Intern selections[4];
 static Ecore_X_Selection_Converter *converters = NULL;
 static Ecore_X_Selection_Parser *parsers = NULL;
 
-static int _ecore_x_selection_converter_text(char *target, void *data, int size, void **data_ret, int *size_ret);
-static int _ecore_x_selection_data_default_free(void *data);
-static void *_ecore_x_selection_parser_files(const char *target, void *data, int size, int format);
-static int _ecore_x_selection_data_files_free(void *data);
-static void *_ecore_x_selection_parser_text(const char *target, void *data, int size, int format);
-static int _ecore_x_selection_data_text_free(void *data);
-static void *_ecore_x_selection_parser_targets(const char *target, void *data, int size, int format);
-static int _ecore_x_selection_data_targets_free(void *data);
+static int   _ecore_x_selection_data_default_free(void *data);
+static void *_ecore_x_selection_parser_files(const char *target,
+                                             void *data,
+                                             int size,
+                                             int format);
+static int   _ecore_x_selection_data_files_free(void *data);
+static void *_ecore_x_selection_parser_text(const char *target,
+                                            void *data,
+                                            int size,
+                                            int format);
+static int   _ecore_x_selection_data_text_free(void *data);
+static void *_ecore_x_selection_parser_targets(const char *target,
+                                               void *data,
+                                               int size,
+                                               int format);
+static int   _ecore_x_selection_data_targets_free(void *data);
 
 #define ECORE_X_SELECTION_DATA(x) ((Ecore_X_Selection_Data *)(x))
 
@@ -29,28 +41,28 @@ _ecore_x_selection_data_init(void)
    memset(selections, 0, sizeof(selections));
 
    /* Initialize converters */
-   ecore_x_selection_converter_atom_add(ECORE_X_ATOM_TEXT, 
-                                       _ecore_x_selection_converter_text);
+   ecore_x_selection_converter_atom_add(ECORE_X_ATOM_TEXT,
+                                        ecore_x_selection_converter_text);
 #ifdef X_HAVE_UTF8_STRING
-   ecore_x_selection_converter_atom_add(ECORE_X_ATOM_UTF8_STRING, 
-                                       _ecore_x_selection_converter_text);
-#endif
+   ecore_x_selection_converter_atom_add(ECORE_X_ATOM_UTF8_STRING,
+                                        ecore_x_selection_converter_text);
+#endif /* ifdef X_HAVE_UTF8_STRING */
    ecore_x_selection_converter_atom_add(ECORE_X_ATOM_COMPOUND_TEXT,
-                                       _ecore_x_selection_converter_text);
+                                        ecore_x_selection_converter_text);
    ecore_x_selection_converter_atom_add(ECORE_X_ATOM_STRING,
-                                       _ecore_x_selection_converter_text);
+                                        ecore_x_selection_converter_text);
 
    /* Initialize parsers */
    ecore_x_selection_parser_add("text/plain",
-                               _ecore_x_selection_parser_text);
+                                _ecore_x_selection_parser_text);
    ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_UTF8_STRING,
-                               _ecore_x_selection_parser_text);
+                                _ecore_x_selection_parser_text);
    ecore_x_selection_parser_add("text/uri-list",
-                               _ecore_x_selection_parser_files);
+                                _ecore_x_selection_parser_files);
    ecore_x_selection_parser_add("_NETSCAPE_URL",
-                               _ecore_x_selection_parser_files);
+                                _ecore_x_selection_parser_files);
    ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_TARGETS,
-                               _ecore_x_selection_parser_targets);
+                                _ecore_x_selection_parser_targets);
 }
 
 void
@@ -63,11 +75,11 @@ _ecore_x_selection_shutdown(void)
    cnv = converters;
    while (cnv)
      {
-       Ecore_X_Selection_Converter *tmp;
+        Ecore_X_Selection_Converter *tmp;
 
-       tmp = cnv->next;
-       free(cnv);
-       cnv = tmp;
+        tmp = cnv->next;
+        free(cnv);
+        cnv = tmp;
      }
    converters = NULL;
 
@@ -75,12 +87,12 @@ _ecore_x_selection_shutdown(void)
    prs = parsers;
    while (prs)
      {
-       Ecore_X_Selection_Parser *tmp;
+        Ecore_X_Selection_Parser *tmp;
 
-       tmp = prs;
-       prs = prs->next;
-       free(tmp->target);
-       free(tmp);
+        tmp = prs;
+        prs = prs->next;
+        free(tmp->target);
+        free(tmp);
      }
    parsers = NULL;
 }
@@ -100,16 +112,19 @@ _ecore_x_selection_get(Ecore_X_Atom selection)
      return NULL;
 }
 
-int 
-_ecore_x_selection_set(Window w, const void *data, int size, Ecore_X_Atom selection)
+Eina_Bool
+_ecore_x_selection_set(Window w,
+                       const void *data,
+                       int size,
+                       Ecore_X_Atom selection)
 {
    int in;
    unsigned char *buf = NULL;
-   
+
    XSetSelectionOwner(_ecore_x_disp, selection, w, _ecore_x_event_last_time);
    if (XGetSelectionOwner(_ecore_x_disp, selection) != w)
-     return 0;
-   
+     return EINA_FALSE;
+
    if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
      in = 0;
    else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
@@ -119,29 +134,27 @@ _ecore_x_selection_set(Window w, const void *data, int size, Ecore_X_Atom select
    else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
      in = 3;
    else
-     return 0;
+     return EINA_FALSE;
 
    if (data)
      {
-       selections[in].win = w;
-       selections[in].selection = selection;
-       selections[in].length = size;
-       selections[in].time = _ecore_x_event_last_time;
-
-       buf = malloc(size);
-       memcpy(buf, data, size);
-       selections[in].data = buf;
+        selections[in].win = w;
+        selections[in].selection = selection;
+        selections[in].length = size;
+        selections[in].time = _ecore_x_event_last_time;
+
+        buf = malloc(size);
+        if (!buf) return EINA_FALSE;
+        memcpy(buf, data, size);
+        selections[in].data = buf;
      }
-   else
+   else if (selections[in].data)
      {
-       if (selections[in].data)
-         {
-            free(selections[in].data);
-            memset(&selections[in], 0, sizeof(Ecore_X_Selection_Data));
-         }
+        free(selections[in].data);
+        memset(&selections[in], 0, sizeof(Ecore_X_Selection_Data));
      }
 
-   return 1;
+   return EINA_TRUE;
 }
 
 /**
@@ -149,12 +162,15 @@ _ecore_x_selection_set(Window w, const void *data, int size, Ecore_X_Atom select
  * @param w    The window to which this selection belongs
  * @param data The data associated with the selection
  * @param size The size of the data buffer in bytes
- * @return     Returns 1 if the ownership of the selection was successfully 
+ * @return     Returns 1 if the ownership of the selection was successfully
  *             claimed, or 0 if unsuccessful.
  */
-EAPI int 
-ecore_x_selection_primary_set(Ecore_X_Window w, const void *data, int size)
+EAPI Eina_Bool
+ecore_x_selection_primary_set(Ecore_X_Window w,
+                              const void *data,
+                              int size)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _ecore_x_selection_set(w, data, size, ECORE_X_ATOM_SELECTION_PRIMARY);
 }
 
@@ -164,9 +180,10 @@ ecore_x_selection_primary_set(Ecore_X_Window w, const void *data, int size)
  *             or 0 if unsuccessful.
  *
  */
-EAPI int 
+EAPI Eina_Bool
 ecore_x_selection_primary_clear(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _ecore_x_selection_set(None, NULL, 0, ECORE_X_ATOM_SELECTION_PRIMARY);
 }
 
@@ -175,13 +192,19 @@ ecore_x_selection_primary_clear(void)
  * @param w    The window to which this selection belongs
  * @param data The data associated with the selection
  * @param size The size of the data buffer in bytes
- * @return     Returns 1 if the ownership of the selection was successfully 
+ * @return     Returns 1 if the ownership of the selection was successfully
  *             claimed, or 0 if unsuccessful.
  */
-EAPI int 
-ecore_x_selection_secondary_set(Ecore_X_Window w, const void *data, int size)
+EAPI Eina_Bool
+ecore_x_selection_secondary_set(Ecore_X_Window w,
+                                const void *data,
+                                int size)
 {
-   return _ecore_x_selection_set(w, data, size, ECORE_X_ATOM_SELECTION_SECONDARY);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return _ecore_x_selection_set(w,
+                                 data,
+                                 size,
+                                 ECORE_X_ATOM_SELECTION_SECONDARY);
 }
 
 /**
@@ -190,10 +213,14 @@ ecore_x_selection_secondary_set(Ecore_X_Window w, const void *data, int size)
  *             or 0 if unsuccessful.
  *
  */
-EAPI int 
+EAPI Eina_Bool
 ecore_x_selection_secondary_clear(void)
 {
-   return _ecore_x_selection_set(None, NULL, 0, ECORE_X_ATOM_SELECTION_SECONDARY);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return _ecore_x_selection_set(None,
+                                 NULL,
+                                 0,
+                                 ECORE_X_ATOM_SELECTION_SECONDARY);
 }
 
 /**
@@ -201,12 +228,15 @@ ecore_x_selection_secondary_clear(void)
  * @param w    The window to which this selection belongs
  * @param data The data associated with the selection
  * @param size The size of the data buffer in bytes
- * @return     Returns 1 if the ownership of the selection was successfully 
+ * @return     Returns 1 if the ownership of the selection was successfully
  *             claimed, or 0 if unsuccessful.
  */
-EAPI int 
-ecore_x_selection_xdnd_set(Ecore_X_Window w, const void *data, int size)
+EAPI Eina_Bool
+ecore_x_selection_xdnd_set(Ecore_X_Window w,
+                           const void *data,
+                           int size)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _ecore_x_selection_set(w, data, size, ECORE_X_ATOM_SELECTION_XDND);
 }
 
@@ -216,9 +246,10 @@ ecore_x_selection_xdnd_set(Ecore_X_Window w, const void *data, int size)
  *             or 0 if unsuccessful.
  *
  */
-EAPI int 
+EAPI Eina_Bool
 ecore_x_selection_xdnd_clear(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _ecore_x_selection_set(None, NULL, 0, ECORE_X_ATOM_SELECTION_XDND);
 }
 
@@ -227,16 +258,22 @@ ecore_x_selection_xdnd_clear(void)
  * @param w    The window to which this selection belongs
  * @param data The data associated with the selection
  * @param size The size of the data buffer in bytes
- * @return     Returns 1 if the ownership of the selection was successfully 
+ * @return     Returns 1 if the ownership of the selection was successfully
  *             claimed, or 0 if unsuccessful.
  *
  * Get the converted data from a previous CLIPBOARD selection
  * request. The buffer must be freed when done with.
  */
-EAPI int 
-ecore_x_selection_clipboard_set(Ecore_X_Window w, const void *data, int size)
+EAPI Eina_Bool
+ecore_x_selection_clipboard_set(Ecore_X_Window w,
+                                const void *data,
+                                int size)
 {
-   return _ecore_x_selection_set(w, data, size, ECORE_X_ATOM_SELECTION_CLIPBOARD);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return _ecore_x_selection_set(w,
+                                 data,
+                                 size,
+                                 ECORE_X_ATOM_SELECTION_CLIPBOARD);
 }
 
 /**
@@ -245,10 +282,14 @@ ecore_x_selection_clipboard_set(Ecore_X_Window w, const void *data, int size)
  *             or 0 if unsuccessful.
  *
  */
-EAPI int 
+EAPI Eina_Bool
 ecore_x_selection_clipboard_clear(void)
 {
-   return _ecore_x_selection_set(None, NULL, 0, ECORE_X_ATOM_SELECTION_CLIPBOARD);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return _ecore_x_selection_set(None,
+                                 NULL,
+                                 0,
+                                 ECORE_X_ATOM_SELECTION_CLIPBOARD);
 }
 
 Ecore_X_Atom
@@ -267,9 +308,7 @@ _ecore_x_selection_target_atom_get(const char *target)
    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
      x_target = ECORE_X_ATOM_FILE_NAME;
    else
-     {
-       x_target = ecore_x_atom_get(target);
-     }
+     x_target = ecore_x_atom_get(target);
 
    return x_target;
 }
@@ -291,8 +330,10 @@ _ecore_x_selection_target_get(Ecore_X_Atom target)
      return XGetAtomName(_ecore_x_disp, target);
 }
 
-static void 
-_ecore_x_selection_request(Ecore_X_Window w, Ecore_X_Atom selection, const char *target_str) 
+static void
+_ecore_x_selection_request(Ecore_X_Window w,
+                           Ecore_X_Atom selection,
+                           const char *target_str)
 {
    Ecore_X_Atom target, prop;
 
@@ -308,83 +349,109 @@ _ecore_x_selection_request(Ecore_X_Window w, Ecore_X_Atom selection, const char
      return;
 
    XConvertSelection(_ecore_x_disp, selection, target, prop,
-                    w, CurrentTime);
+                     w, CurrentTime);
 }
 
-EAPI void 
-ecore_x_selection_primary_request(Ecore_X_Window w, const char *target)
+EAPI void
+ecore_x_selection_primary_request(Ecore_X_Window w,
+                                  const char *target)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_selection_request(w, ECORE_X_ATOM_SELECTION_PRIMARY, target);
 }
 
-EAPI void 
-ecore_x_selection_secondary_request(Ecore_X_Window w, const char *target)
+EAPI void
+ecore_x_selection_secondary_request(Ecore_X_Window w,
+                                    const char *target)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_selection_request(w, ECORE_X_ATOM_SELECTION_SECONDARY, target);
 }
 
-EAPI void 
-ecore_x_selection_xdnd_request(Ecore_X_Window w, const char *target)
+EAPI void
+ecore_x_selection_xdnd_request(Ecore_X_Window w,
+                               const char *target)
 {
    Ecore_X_Atom atom;
    Ecore_X_DND_Target *_target;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _target = _ecore_x_dnd_target_get();
    atom = _ecore_x_selection_target_atom_get(target);
    XConvertSelection(_ecore_x_disp, ECORE_X_ATOM_SELECTION_XDND, atom,
-                    ECORE_X_ATOM_SELECTION_PROP_XDND, w,
-                    _target->time);
+                     ECORE_X_ATOM_SELECTION_PROP_XDND, w,
+                     _target->time);
 }
 
-EAPI void 
-ecore_x_selection_clipboard_request(Ecore_X_Window w, const char *target)
+EAPI void
+ecore_x_selection_clipboard_request(Ecore_X_Window w,
+                                    const char *target)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_selection_request(w, ECORE_X_ATOM_SELECTION_CLIPBOARD, target);
 }
 
 EAPI void
 ecore_x_selection_converter_atom_add(Ecore_X_Atom target,
-      int (*func)(char *target, void *data, int size, void **data_ret, int *size_ret))
+                                     Eina_Bool (*func)(char *target,
+                                                       void *data,
+                                                       int size,
+                                                       void **data_ret,
+                                                       int *size_ret,
+                                                       Ecore_X_Atom *ttype,
+                                                       int *tsize))
 {
    Ecore_X_Selection_Converter *cnv;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    cnv = converters;
-   if (converters) 
+   if (converters)
      {
-       while (1)
-         {
-            if (cnv->target == target)
-              {
-                 cnv->convert = func;
-                 return;
-              }
-            if (cnv->next)
-              cnv = cnv->next;
-            else
-              break;
-         }
-
-       cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
-       cnv = cnv->next;
+        while (1)
+          {
+             if (cnv->target == target)
+               {
+                  cnv->convert = func;
+                  return;
+               }
+
+             if (cnv->next)
+               cnv = cnv->next;
+             else
+               break;
+          }
+
+        cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
+        if (!cnv->next) return;
+        cnv = cnv->next;
      }
    else
      {
-       converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
-       cnv = converters;
+        converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
+        if (!converters) return;
+        cnv = converters;
      }
+
    cnv->target = target;
    cnv->convert = func;
 }
 
 EAPI void
-ecore_x_selection_converter_add(char *target, 
-      int (*func)(char *target, void *data, int size, void **data_ret, int *size_ret))
+ecore_x_selection_converter_add(char *target,
+                                Eina_Bool (*func)(char *target,
+                                                  void *data,
+                                                  int size,
+                                                  void **data_ret,
+                                                  int *size_ret,
+                                                  Ecore_X_Atom *,
+                                                  int *))
 {
    Ecore_X_Atom x_target;
 
    if (!func || !target)
      return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    x_target = _ecore_x_selection_target_atom_get(target);
 
    ecore_x_selection_converter_atom_add(x_target, func);
@@ -395,23 +462,28 @@ ecore_x_selection_converter_atom_del(Ecore_X_Atom target)
 {
    Ecore_X_Selection_Converter *cnv, *prev_cnv;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    prev_cnv = NULL;
    cnv = converters;
 
    while (cnv)
      {
-       if (cnv->target == target)
-         {
-            if (prev_cnv)
-              prev_cnv->next = cnv->next;
-            else
-              converters = cnv->next; /* This was the first converter */
-            free(cnv);
-
-            return;
-         }
-       prev_cnv = cnv;
-       cnv = cnv->next;
+        if (cnv->target == target)
+          {
+             if (prev_cnv)
+               prev_cnv->next = cnv->next;
+             else
+               {
+                  converters = cnv->next; /* This was the first converter */
+               }
+
+             free(cnv);
+
+             return;
+          }
+
+        prev_cnv = cnv;
+        cnv = cnv->next;
      }
 }
 
@@ -423,160 +495,194 @@ ecore_x_selection_converter_del(char *target)
    if (!target)
      return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    x_target = _ecore_x_selection_target_atom_get(target);
    ecore_x_selection_converter_atom_del(x_target);
 }
 
-EAPI int
-ecore_x_selection_notify_send(Ecore_X_Window requestor, Ecore_X_Atom selection, Ecore_X_Atom target, Ecore_X_Atom property, Ecore_X_Time time)
+EAPI Eina_Bool
+ecore_x_selection_notify_send(Ecore_X_Window requestor,
+                              Ecore_X_Atom selection,
+                              Ecore_X_Atom target,
+                              Ecore_X_Atom property,
+                              Ecore_X_Time tim)
 {
-   XEvent          xev;
+   XEvent xev;
    XSelectionEvent xnotify;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xnotify.type = SelectionNotify;
    xnotify.display = _ecore_x_disp;
    xnotify.requestor = requestor;
    xnotify.selection = selection;
    xnotify.target = target;
    xnotify.property = property;
-   xnotify.time = time;
+   xnotify.time = tim;
    xnotify.send_event = True;
    xnotify.serial = 0;
 
    xev.xselection = xnotify;
-   return ((XSendEvent(_ecore_x_disp, requestor, False, 0, &xev) > 0) ? 1 : 0);
+   return (XSendEvent(_ecore_x_disp, requestor, False, 0, &xev) > 0) ? EINA_TRUE : EINA_FALSE;
 }
 
 /* Locate and run conversion callback for specified selection target */
-EAPI int
-ecore_x_selection_convert(Ecore_X_Atom selection, Ecore_X_Atom target, void **data_ret)
+EAPI Eina_Bool
+ecore_x_selection_convert(Ecore_X_Atom selection,
+                          Ecore_X_Atom target,
+                          void **data_ret,
+                          int *size,
+                          Ecore_X_Atom *targtype,
+                          int *typesize)
 {
    Ecore_X_Selection_Intern *sel;
    Ecore_X_Selection_Converter *cnv;
    void *data;
-   int size;
    char *tgt_str;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    sel = _ecore_x_selection_get(selection);
    tgt_str = _ecore_x_selection_target_get(target);
 
    for (cnv = converters; cnv; cnv = cnv->next)
      {
-       if (cnv->target == target)
-         {
-            int r;
-            r = cnv->convert(tgt_str, sel->data, sel->length, &data, &size);
-            free(tgt_str);
-            if (r)
-              {
-                 *data_ret = data;
-                 return r;
-              }
-            else
-              return 0;
-         }
+        if (cnv->target == target)
+          {
+             int r;
+             r = cnv->convert(tgt_str, sel->data, sel->length, &data, size,
+                              targtype, typesize);
+             free(tgt_str);
+             if (r)
+               {
+                  *data_ret = data;
+                  return r;
+               }
+             else
+               return EINA_FALSE;
+          }
      }
 
    /* ICCCM says "If the selection cannot be converted into a form based on the target (and parameters, if any), the owner should refuse the SelectionRequest as previously described." */
-   return 0; 
+   return EINA_FALSE;
 
-   /* Default, just return the data 
-   *data_ret = malloc(sel->length);
-   memcpy(*data_ret, sel->data, sel->length);
-   free(tgt_str);
-   return 1;
-   */
+   /* Default, just return the data
+    * data_ret = malloc(sel->length);
+      memcpy(*data_ret, sel->data, sel->length);
+      free(tgt_str);
+      return 1;
+    */
 }
 
 /* TODO: We need to work out a mechanism for automatic conversion to any requested
  * locale using Ecore_Txt functions */
 /* Converter for standard non-utf8 text targets */
-static int
-_ecore_x_selection_converter_text(char *target, void *data, int size, void **data_ret, int *size_ret)
+EAPI Eina_Bool
+ecore_x_selection_converter_text(char *target,
+                                 void *data,
+                                 int size,
+                                 void **data_ret,
+                                 int *size_ret,
+                                 Ecore_X_Atom *targprop __UNUSED__,
+                                 int *s __UNUSED__)
 {
    XTextProperty text_prop;
    char *mystr;
    XICCEncodingStyle style;
 
    if (!data || !size)
-     return 0;
+     return EINA_FALSE;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
      style = XTextStyle;
    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
      style = XCompoundTextStyle;
    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
      style = XStringStyle;
+
 #ifdef X_HAVE_UTF8_STRING
    else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
      style = XUTF8StringStyle;
-#endif
+#endif /* ifdef X_HAVE_UTF8_STRING */
    else
-     return 0;
+     return EINA_FALSE;
 
-   if (!(mystr = strdup(data)))
-     return 0;
+   mystr = alloca(size + 1);
+   memcpy(mystr, data, size);
+   mystr[size] = '\0';
 
 #ifdef X_HAVE_UTF8_STRING
-   if (Xutf8TextListToTextProperty(_ecore_x_disp, &mystr, 1, style, &text_prop) == Success)
+   if (Xutf8TextListToTextProperty(_ecore_x_disp, &mystr, 1, style,
+                                   &text_prop) == Success)
      {
-       int bufsize = strlen((char *)text_prop.value) + 1;
-       *data_ret = malloc(bufsize);
-       memcpy(*data_ret, text_prop.value, bufsize);
-       *size_ret = bufsize;
-       XFree(text_prop.value);
-       free(mystr);
-       return 1;
+        int bufsize = strlen((char *)text_prop.value) + 1;
+        *data_ret = malloc(bufsize);
+        if (!*data_ret)
+          {
+             return EINA_FALSE;
+          }
+        memcpy(*data_ret, text_prop.value, bufsize);
+        *size_ret = bufsize;
+        XFree(text_prop.value);
+        return EINA_TRUE;
      }
-#else
-   if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style, &text_prop) == Success)
+
+#else /* ifdef X_HAVE_UTF8_STRING */
+   if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style,
+                                 &text_prop) == Success)
      {
-       int bufsize = strlen(text_prop.value) + 1;
-       *data_ret = malloc(bufsize);
-       memcpy(*data_ret, text_prop.value, bufsize);
-       *size_ret = bufsize;
-       XFree(text_prop.value);
-       free(mystr);
-       return 1;
+        int bufsize = strlen(text_prop.value) + 1;
+        *data_ret = malloc(bufsize);
+        if (!*data_ret) return EINA_FALSE;
+        memcpy(*data_ret, text_prop.value, bufsize);
+        *size_ret = bufsize;
+        XFree(text_prop.value);
+        return EINA_TRUE;
      }
-#endif
+
+#endif /* ifdef X_HAVE_UTF8_STRING */
    else
      {
-       free(mystr);
-       return 0;
+        return EINA_TRUE;
      }
 }
 
 EAPI void
 ecore_x_selection_parser_add(const char *target,
-      void *(*func)(const char *target, void *data, int size, int format))
+                             void *(*func)(const char *target, void *data,
+                                           int size,
+                                           int format))
 {
    Ecore_X_Selection_Parser *prs;
 
    if (!target)
      return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    prs = parsers;
-   if (parsers) 
+   if (parsers)
      {
-       while (prs->next)
-         {
-            if (!strcmp(prs->target, target))
-              {
-                 prs->parse = func;
-                 return;
-              }
-            prs = prs->next;
-         }
-
-       prs->next = calloc(1, sizeof(Ecore_X_Selection_Parser));
-       prs = prs->next;
+        while (prs->next)
+          {
+             if (!strcmp(prs->target, target))
+               {
+                  prs->parse = func;
+                  return;
+               }
+
+             prs = prs->next;
+          }
+
+        prs->next = calloc(1, sizeof(Ecore_X_Selection_Parser));
+        if (!prs->next) return;
+        prs = prs->next;
      }
    else
      {
-       parsers = calloc(1, sizeof(Ecore_X_Selection_Parser));
-       prs = parsers;
+        parsers = calloc(1, sizeof(Ecore_X_Selection_Parser));
+        if (!parsers) return;
+        prs = parsers;
      }
+
    prs->target = strdup(target);
    prs->parse = func;
 }
@@ -589,45 +695,83 @@ ecore_x_selection_parser_del(const char *target)
    if (!target)
      return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    prev_prs = NULL;
    prs = parsers;
 
    while (prs)
      {
-       if (!strcmp(prs->target, target))
-         {
-            if (prev_prs)
-              prev_prs->next = prs->next;
-            else
-              parsers = prs->next; /* This was the first parser */
-            free(prs->target);
-            free(prs);
-
-            return;
-         }
-       prev_prs = prs;
-       prs = prs->next;
+        if (!strcmp(prs->target, target))
+          {
+             if (prev_prs)
+               prev_prs->next = prs->next;
+             else
+               {
+                  parsers = prs->next; /* This was the first parser */
+               }
+
+             free(prs->target);
+             free(prs);
+
+             return;
+          }
+
+        prev_prs = prs;
+        prs = prs->next;
      }
 }
 
+/**
+ * Change the owner and last-change time for the specified selection.
+ * @param win The owner of the specified atom.
+ * @param atom The selection atom
+ * @param tim Specifies the time
+ * @since 1.1.0
+ */
+EAPI void
+ecore_x_selection_owner_set(Ecore_X_Window win,
+                            Ecore_X_Atom atom,
+                            Ecore_X_Time tim)
+{
+   XSetSelectionOwner(_ecore_x_disp, atom, win, tim);
+}
+
+/**
+ * Return the window that currently owns the specified selection.
+ *
+ * @param atom The specified selection atom.
+ *
+ * @return The window that currently owns the specified selection.
+ * @since 1.1.0
+ */
+EAPI Ecore_X_Window
+ecore_x_selection_owner_get(Ecore_X_Atom atom)
+{
+   return XGetSelectionOwner(_ecore_x_disp, atom);
+}
+
 /* Locate and run conversion callback for specified selection target */
 void *
-_ecore_x_selection_parse(const char *target, void *data, int size, int format)
+_ecore_x_selection_parse(const char *target,
+                         void *data,
+                         int size,
+                         int format)
 {
    Ecore_X_Selection_Parser *prs;
    Ecore_X_Selection_Data *sel;
-   
+
    for (prs = parsers; prs; prs = prs->next)
      {
-       if (!strcmp(prs->target, target))
-         {
-            sel = prs->parse(target, data, size, format);
-            return sel;
-         }
+        if (!strcmp(prs->target, target))
+          {
+             sel = prs->parse(target, data, size, format);
+             if (sel) return sel;
+          }
      }
 
    /* Default, just return the data */
    sel = calloc(1, sizeof(Ecore_X_Selection_Data));
+   if (!sel) return NULL;
    sel->free = _ecore_x_selection_data_default_free;
    sel->length = size;
    sel->format = format;
@@ -647,63 +791,85 @@ _ecore_x_selection_data_default_free(void *data)
 }
 
 static void *
-_ecore_x_selection_parser_files(const char *target, void *_data, int size, int format __UNUSED__)
+_ecore_x_selection_parser_files(const char *target,
+                                void *_data,
+                                int size,
+                                int format __UNUSED__)
 {
    Ecore_X_Selection_Data_Files *sel;
-   char *data = _data;
+   char *t, *data = _data;
    int i, is;
    char *tmp;
+   char **t2;
 
    if (strcmp(target, "text/uri-list") &&
        strcmp(target, "_NETSCAPE_URL"))
      return NULL;
 
    sel = calloc(1, sizeof(Ecore_X_Selection_Data_Files));
+   if (!sel) return NULL;
    ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_files_free;
 
    if (data[size - 1])
      {
-       /* Isn't nul terminated */
-       size++;
-       data = realloc(data, size);
-       data[size - 1] = 0;
+        /* Isn't nul terminated */
+        size++;
+        t = realloc(data, size);
+        if (!t)
+          {
+             free(sel);
+             return NULL;
+          }
+        data = t;
+        data[size - 1] = 0;
      }
 
    tmp = malloc(size);
+   if (!tmp)
+     {
+        free(sel);
+        return NULL;
+     }
    i = 0;
    is = 0;
    while ((is < size) && (data[is]))
      {
-       if ((i == 0) && (data[is] == '#'))
-         {
-            for (; ((data[is]) && (data[is] != '\n')); is++);
-         }
-       else
-         {
-            if ((data[is] != '\r') &&
-                (data[is] != '\n'))
-              {
-                 tmp[i++] = data[is++];
-              }
-            else
-              {
-                 while ((data[is] == '\r') || (data[is] == '\n')) is++;
-                 tmp[i] = 0;
-                 sel->num_files++;
-                 sel->files = realloc(sel->files, sel->num_files * sizeof(char *));
-                 sel->files[sel->num_files - 1] = strdup(tmp);
-                 tmp[0] = 0;
-                 i = 0;
-              }
-         }
+        if ((i == 0) && (data[is] == '#'))
+          for (; ((data[is]) && (data[is] != '\n')); is++) ;
+        else
+          {
+             if ((data[is] != '\r') &&
+                 (data[is] != '\n'))
+               tmp[i++] = data[is++];
+             else
+               {
+                  while ((data[is] == '\r') || (data[is] == '\n'))
+                    is++;
+                  tmp[i] = 0;
+                  sel->num_files++;
+                  t2 = realloc(sel->files, sel->num_files * sizeof(char *));
+                  if (t2)
+                    {
+                       sel->files = t2;
+                       sel->files[sel->num_files - 1] = strdup(tmp);
+                    }
+                  tmp[0] = 0;
+                  i = 0;
+               }
+          }
      }
    if (i > 0)
      {
-       tmp[i] = 0;
-       sel->num_files++;
-       sel->files = realloc(sel->files, sel->num_files * sizeof(char *));
-       sel->files[sel->num_files - 1] = strdup(tmp);
+        tmp[i] = 0;
+        sel->num_files++;
+        t2 = realloc(sel->files, sel->num_files * sizeof(char *));
+        if (t2)
+          {
+             sel->files = t2;
+             sel->files[sel->num_files - 1] = strdup(tmp);
+          }
      }
+
    free(tmp);
    free(data);
 
@@ -722,33 +888,45 @@ _ecore_x_selection_data_files_free(void *data)
    sel = data;
    if (sel->files)
      {
-       for (i = 0; i < sel->num_files; i++)
-         free(sel->files[i]);
-       free(sel->files);
+        for (i = 0; i < sel->num_files; i++)
+          free(sel->files[i]);
+        free(sel->files);
      }
+
    free(sel);
    return 0;
 }
 
 static void *
-_ecore_x_selection_parser_text(const char *target __UNUSED__, void *_data, int size, int format __UNUSED__)
+_ecore_x_selection_parser_text(const char *target __UNUSED__,
+                               void *_data,
+                               int size,
+                               int format __UNUSED__)
 {
    Ecore_X_Selection_Data_Text *sel;
-   char *data = _data;
+   unsigned char *data = _data;
+   void *t;
 
    sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text));
-
+   if (!sel) return NULL;
    if (data[size - 1])
      {
-       /* Isn't nul terminated */
-       size++;
-       data = realloc(data, size);
-       data[size - 1] = 0;
+        /* Isn't nul terminated */
+        size++;
+        t = realloc(data, size);
+        if (!t)
+          {
+             free(sel);
+             return NULL;
+          }
+        data = t;
+        data[size - 1] = 0;
      }
 
    sel->text = (char *)data;
    ECORE_X_SELECTION_DATA(sel)->length = size;
    ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TEXT;
+   ECORE_X_SELECTION_DATA(sel)->data = data;
    ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_text_free;
    return sel;
 }
@@ -765,24 +943,33 @@ _ecore_x_selection_data_text_free(void *data)
 }
 
 static void *
-_ecore_x_selection_parser_targets(const char *target __UNUSED__, void *data, int size, int format __UNUSED__)
+_ecore_x_selection_parser_targets(const char *target __UNUSED__,
+                                  void *data,
+                                  int size,
+                                  int format __UNUSED__)
 {
    Ecore_X_Selection_Data_Targets *sel;
    unsigned long *targets;
    int i;
 
    sel = calloc(1, sizeof(Ecore_X_Selection_Data_Targets));
+   if (!sel) return NULL;
    targets = (unsigned long *)data;
 
    sel->num_targets = size - 2;
    sel->targets = malloc((size - 2) * sizeof(char *));
+   if (!sel->targets)
+     {
+        free(sel);
+        return NULL;
+     }
    for (i = 2; i < size; i++)
      sel->targets[i - 2] = XGetAtomName(_ecore_x_disp, targets[i]);
-   free(data);
 
    ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_targets_free;
    ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TARGETS;
    ECORE_X_SELECTION_DATA(sel)->length = size;
+   ECORE_X_SELECTION_DATA(sel)->data = data;
    return sel;
 }
 
@@ -796,10 +983,13 @@ _ecore_x_selection_data_targets_free(void *data)
 
    if (sel->targets)
      {
-       for (i = 0; i < sel->num_targets; i++)
-         XFree(sel->targets[i]);
-       free(sel->targets);
+        for (i = 0; i < sel->num_targets; i++)
+          XFree(sel->targets[i]);
+        free(sel->targets);
      }
+
+   free(ECORE_X_SELECTION_DATA(sel)->data);
    free(sel);
    return 1;
 }
+
index feaaa27..0c7f546 100644 (file)
@@ -1,9 +1,11 @@
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-/*
  * XSync code
  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
@@ -16,9 +18,10 @@ ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)
    XSyncAlarmAttributes values;
    XSyncValue init;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSyncIntToValue(&init, 0);
    XSyncSetCounter(_ecore_x_disp, counter, init);
-   
+
    values.trigger.counter = counter;
    values.trigger.value_type = XSyncAbsolute;
    XSyncIntToValue(&values.trigger.wait_value, 1);
@@ -29,20 +32,128 @@ ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)
    values.events = True;
 
    alarm = XSyncCreateAlarm(_ecore_x_disp,
-                           XSyncCACounter |
-                           XSyncCAValueType |
-                           XSyncCAValue |
-                           XSyncCATestType |
-                           XSyncCADelta |
-                           XSyncCAEvents,
-                           &values);
+                            XSyncCACounter |
+                            XSyncCAValueType |
+                            XSyncCAValue |
+                            XSyncCATestType |
+                            XSyncCADelta |
+                            XSyncCAEvents,
+                            &values);
 
    ecore_x_sync();
    return alarm;
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return XSyncDestroyAlarm(_ecore_x_disp, alarm);
 }
+
+EAPI Eina_Bool
+ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,
+                           unsigned int *val)
+{
+   XSyncValue value;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (XSyncQueryCounter(_ecore_x_disp, counter, &value))
+     {
+        *val = (unsigned int)XSyncValueLow32(value);
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+EAPI Ecore_X_Sync_Counter
+ecore_x_sync_counter_new(int val)
+{
+   XSyncCounter counter;
+   XSyncValue v;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSyncIntToValue(&v, val);
+   counter = XSyncCreateCounter(_ecore_x_disp, v);
+   return counter;
+}
+
+EAPI void
+ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSyncDestroyCounter(_ecore_x_disp, counter);
+}
+
+EAPI void
+ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,
+                         int by)
+{
+   XSyncValue v;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSyncIntToValue(&v, by);
+   XSyncChangeCounter(_ecore_x_disp, counter, v);
+}
+
+EAPI void
+ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,
+                              int val)
+{
+   XSyncWaitCondition cond;
+   XSyncValue v, v2;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSyncQueryCounter(_ecore_x_disp, counter, &v);
+   XSyncIntToValue(&v, val);
+   XSyncIntToValue(&v2, val + 1);
+   cond.trigger.counter = counter;
+   cond.trigger.value_type = XSyncAbsolute;
+   cond.trigger.wait_value = v;
+   cond.trigger.test_type = XSyncPositiveComparison;
+   cond.event_threshold = v2;
+   XSyncAwait(_ecore_x_disp, &cond, 1);
+//   XSync(_ecore_x_disp, False); // dont need this
+}
+
+EAPI void
+ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,
+                         int val)
+{
+   XSyncValue v;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSyncIntToValue(&v, val);
+   XSyncSetCounter(_ecore_x_disp, counter, v);
+}
+
+EAPI void
+ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,
+                           int val_hi,
+                           unsigned int val_lo)
+{
+   XSyncValue v;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XSyncIntsToValue(&v, val_lo, val_hi);
+   XSyncSetCounter(_ecore_x_disp, counter, v);
+}
+
+EAPI Eina_Bool
+ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,
+                             int *val_hi,
+                             unsigned int *val_lo)
+{
+   XSyncValue value;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (XSyncQueryCounter(_ecore_x_disp, counter, &value))
+     {
+        *val_lo = (unsigned int)XSyncValueLow32(value);
+        *val_hi = (int)XSyncValueHigh32(value);
+        return EINA_TRUE;
+     }
+   return EINA_FALSE;
+}
+
index f80a28a..a4d40f6 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
+#ifdef ECORE_XTEST
+# include <X11/extensions/XTest.h>
+#endif /* ifdef ECORE_XTEST */
 
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
+#include <string.h>
 
-
-EAPI int
+EAPI Eina_Bool
+#ifdef ECORE_XTEST
 ecore_x_test_fake_key_down(const char *key)
+#else
+ecore_x_test_fake_key_down(const char *key __UNUSED__)
+#endif
 {
 #ifdef ECORE_XTEST
-   KeyCode             keycode = 0;
-   KeySym              keysym;
-   
+   KeyCode keycode = 0;
+   KeySym keysym;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!strncmp(key, "Keycode-", 8))
      keycode = atoi(key + 8);
    else
      {
-       keysym = XStringToKeysym(key);
-       if (keysym == NoSymbol) return 0;
-       keycode  = XKeysymToKeycode(_ecore_x_disp, keysym);
+        keysym = XStringToKeysym(key);
+        if (keysym == NoSymbol)
+          return EINA_FALSE;
+
+        keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
      }
-   if (keycode == 0) return 0;
-   return XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0);
-#else
-   return 0;
-#endif
+
+   if (keycode == 0)
+     return EINA_FALSE;
+
+   return XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0) ? EINA_TRUE : EINA_FALSE;
+#else /* ifdef ECORE_XTEST */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XTEST */
 }
 
-EAPI int
+EAPI Eina_Bool
+#ifdef ECORE_XTEST
 ecore_x_test_fake_key_up(const char *key)
+#else
+ecore_x_test_fake_key_up(const char *key __UNUSED__)
+#endif
 {
 #ifdef ECORE_XTEST
-   KeyCode             keycode = 0;
-   KeySym              keysym;
-   
+   KeyCode keycode = 0;
+   KeySym keysym;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!strncmp(key, "Keycode-", 8))
      keycode = atoi(key + 8);
    else
      {
-       keysym = XStringToKeysym(key);
-       if (keysym == NoSymbol) return 0;
-       keycode  = XKeysymToKeycode(_ecore_x_disp, keysym);
+        keysym = XStringToKeysym(key);
+        if (keysym == NoSymbol)
+          return EINA_FALSE;
+
+        keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
      }
-   if (keycode == 0) return 0;
-   return XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0);
-#else
-   return 0;
-#endif
+
+   if (keycode == 0)
+     return EINA_FALSE;
+
+   return XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0) ? EINA_TRUE : EINA_FALSE;
+#else /* ifdef ECORE_XTEST */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XTEST */
 }
 
-EAPI int
+EAPI Eina_Bool
+#ifdef ECORE_XTEST
 ecore_x_test_fake_key_press(const char *key)
+#else
+ecore_x_test_fake_key_press(const char *key __UNUSED__)
+#endif
 {
 #ifdef ECORE_XTEST
-   KeyCode             keycode = 0;
-   KeySym              keysym = 0;
-   int                 shift = 0;
-   
+   KeyCode keycode = 0;
+   KeySym keysym = 0;
+   int shift = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!strncmp(key, "Keycode-", 8))
      keycode = atoi(key + 8);
    else
      {
-       keysym = XStringToKeysym(key);
-       if (keysym == NoSymbol) return 0;
-       keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
-       if (XKeycodeToKeysym(_ecore_x_disp, keycode, 0) != keysym)
-         {  
-            if (XKeycodeToKeysym(_ecore_x_disp, keycode, 1) == keysym)
-              shift = 1;
-            else
-              keycode = 0;
-         }
-       else
-         shift = 0;
+        keysym = XStringToKeysym(key);
+        if (keysym == NoSymbol)
+          return EINA_FALSE;
+
+        keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
+        if (_ecore_x_XKeycodeToKeysym(_ecore_x_disp, keycode, 0) != keysym)
+          {
+             if (_ecore_x_XKeycodeToKeysym(_ecore_x_disp, keycode, 1) == keysym)
+               shift = 1;
+             else
+               keycode = 0;
+          }
+        else
+          shift = 0;
      }
+
    if (keycode == 0)
      {
-       static int mod;
-       static KeySym *keysyms;
-       static int keycode_min, keycode_max, keycode_num;
-       int i;  
-
-       XDisplayKeycodes(_ecore_x_disp, &keycode_min, &keycode_max);
-       keysyms = XGetKeyboardMapping(_ecore_x_disp, keycode_min,
-                                     keycode_max - keycode_min + 1,
-                                     &keycode_num);
-       mod = (mod + 1) & 0x7;
-       i = (keycode_max - keycode_min - mod - 1) * keycode_num;
-       
-       keysyms[i] = keysym;
-       XChangeKeyboardMapping(_ecore_x_disp, keycode_min, keycode_num,
-                              keysyms, (keycode_max - keycode_min));
-       XSync(_ecore_x_disp, False);
-       keycode = keycode_max - mod - 1;
+        static int mod = 0;
+        KeySym *keysyms;
+        int keycode_min, keycode_max, keycode_num;
+        int i;
+
+        XDisplayKeycodes(_ecore_x_disp, &keycode_min, &keycode_max);
+        keysyms = XGetKeyboardMapping(_ecore_x_disp, keycode_min,
+                                      keycode_max - keycode_min + 1,
+                                      &keycode_num);
+        mod = (mod + 1) & 0x7;
+        i = (keycode_max - keycode_min - mod - 1) * keycode_num;
+
+        keysyms[i] = keysym;
+        XChangeKeyboardMapping(_ecore_x_disp, keycode_min, keycode_num,
+                               keysyms, (keycode_max - keycode_min));
+        XFree(keysyms);
+        XSync(_ecore_x_disp, False);
+        keycode = keycode_max - mod - 1;
      }
+
    if (shift)
-     XTestFakeKeyEvent(_ecore_x_disp, 
-                      XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 1, 0);
+     XTestFakeKeyEvent(_ecore_x_disp,
+                       XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 1, 0);
+
    XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0);
    XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0);
    if (shift)
-     XTestFakeKeyEvent(_ecore_x_disp, 
-                      XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 0, 0);
-   return 1;
-#else
-   return 0;
-#endif
+     XTestFakeKeyEvent(_ecore_x_disp,
+                       XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 0, 0);
+
+   return EINA_TRUE;
+#else /* ifdef ECORE_XTEST */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XTEST */
 }
 
 EAPI const char *
@@ -114,3 +152,16 @@ ecore_x_keysym_string_get(int keysym)
 {
    return XKeysymToString(keysym);
 }
+
+EAPI int 
+ecore_x_keysym_keycode_get(const char *keyname)
+{
+   int keycode = 0;
+
+   if (!strncmp(keyname, "Keycode-", 8))
+     keycode = atoi(keyname + 8);
+   else
+     keycode = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(keyname));
+
+   return keycode;
+}
diff --git a/src/lib/ecore_x/xlib/ecore_x_vsync.c b/src/lib/ecore_x/xlib/ecore_x_vsync.c
new file mode 100644 (file)
index 0000000..4296bb2
--- /dev/null
@@ -0,0 +1,351 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include "Ecore.h"
+#include "ecore_x_private.h"
+#include "Ecore_X.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <dlfcn.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#define ECORE_X_VSYNC_DRI2 1
+
+#ifdef ECORE_X_VSYNC_DRI2
+// relevant header bits of dri/drm inlined here to avoid needing external
+// headers to build
+/// drm
+typedef unsigned int drm_magic_t;
+
+typedef enum
+{
+   DRM_VBLANK_ABSOLUTE = 0x00000000,
+   DRM_VBLANK_RELATIVE = 0x00000001,
+   DRM_VBLANK_EVENT = 0x04000000,
+   DRM_VBLANK_FLIP = 0x08000000,
+   DRM_VBLANK_NEXTONMISS = 0x10000000,
+   DRM_VBLANK_SECONDARY = 0x20000000,
+   DRM_VBLANK_SIGNAL = 0x40000000
+}
+drmVBlankSeqType;
+
+typedef struct _drmVBlankReq
+{
+   drmVBlankSeqType type;
+   unsigned int     sequence;
+   unsigned long    signal;
+} drmVBlankReq;
+
+typedef struct _drmVBlankReply
+{
+   drmVBlankSeqType type;
+   unsigned int     sequence;
+   long             tval_sec;
+   long             tval_usec;
+} drmVBlankReply;
+
+typedef union _drmVBlank
+{
+   drmVBlankReq   request;
+   drmVBlankReply reply;
+} drmVBlank;
+
+#define DRM_EVENT_CONTEXT_VERSION 2
+
+typedef struct _drmEventContext
+{
+   int version;
+   void (*vblank_handler)(int fd,
+                          unsigned int sequence,
+                          unsigned int tv_sec,
+                          unsigned int tv_usec,
+                          void *user_data);
+   void (*page_flip_handler)(int fd,
+                             unsigned int sequence,
+                             unsigned int tv_sec,
+                             unsigned int tv_usec,
+                             void *user_data);
+} drmEventContext;
+
+static int (*sym_drmClose)(int fd) = NULL;
+static int (*sym_drmGetMagic)(int fd,
+                              drm_magic_t *magic) = NULL;
+static int (*sym_drmWaitVBlank)(int fd,
+                                drmVBlank *vbl) = NULL;
+static int (*sym_drmHandleEvent)(int fd,
+                                 drmEventContext *evctx) = NULL;
+
+//// dri
+
+static Bool (*sym_DRI2QueryExtension)(Display *display,
+                                      int *eventBase,
+                                      int *errorBase) = NULL;
+static Bool (*sym_DRI2QueryVersion)(Display *display,
+                                    int *major,
+                                    int *minor) = NULL;
+static Bool (*sym_DRI2Connect)(Display *display,
+                               XID window,
+                               char **driverName,
+                               char **deviceName) = NULL;
+static Bool (*sym_DRI2Authenticate)(Display *display,
+                                    XID window,
+                                    drm_magic_t magic) = NULL;
+
+//// dri/drm data needed
+static int dri2_event = 0;
+static int dri2_error = 0;
+static int dri2_major = 0;
+static int dri2_minor = 0;
+static char *device_name = 0;
+static char *driver_name = 0;
+static drm_magic_t drm_magic;
+
+static int drm_fd = -1;
+static int drm_event_is_busy = 0;
+static int drm_animators_interval = 1;
+static drmEventContext drm_evctx;
+static Ecore_Fd_Handler *dri_drm_fdh = NULL;
+
+static void *dri_lib = NULL;
+static void *drm_lib = NULL;
+
+static Window dri_drm_vsync_root = 0;
+
+static void
+_dri_drm_tick_schedule(void)
+{
+   drmVBlank vbl;
+
+   vbl.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT;
+   vbl.request.sequence = drm_animators_interval;
+   vbl.request.signal = 0;
+   sym_drmWaitVBlank(drm_fd, &vbl);
+}
+
+static void
+_dri_drm_tick_begin(void *data __UNUSED__)
+{
+   drm_event_is_busy = 1;
+   _dri_drm_tick_schedule();
+}
+
+static void
+_dri_drm_tick_end(void *data __UNUSED__)
+{
+   drm_event_is_busy = 0;
+}
+
+static void
+_dri_drm_vblank_handler(int fd __UNUSED__,
+                        unsigned int frame __UNUSED__,
+                        unsigned int sec __UNUSED__,
+                        unsigned int usec __UNUSED__,
+                        void *data __UNUSED__)
+{
+   ecore_animator_custom_tick();
+   if (drm_event_is_busy) _dri_drm_tick_schedule();
+}
+
+static Eina_Bool
+_dri_drm_cb(void *data __UNUSED__,
+            Ecore_Fd_Handler *fd_handler __UNUSED__)
+{
+   sym_drmHandleEvent(drm_fd, &drm_evctx);
+   return ECORE_CALLBACK_RENEW;
+}
+
+// yes. most evil. we dlopen libdrm and libGL etc. to manually find smbols
+// so we can be as compatible as possible given the whole mess of the
+// gl/dri/drm etc. world. and handle graceful failure at runtime not
+// compile time
+static int
+_dri_drm_link(void)
+{
+   const char *drm_libs[] =
+   {
+      "libdrm.so.2",
+      "libdrm.so.1",
+      "libdrm.so.0",
+      "libdrm.so",
+      NULL,
+   };
+   const char *dri_libs[] =
+   {
+      "libdri2.so.2",
+      "libdri2.so.1",
+      "libdri2.so.0",
+      "libdri2.so",
+      "libGL.so.4",
+      "libGL.so.3",
+      "libGL.so.2",
+      "libGL.so.1",
+      "libGL.so.0",
+      "libGL.so",
+      NULL,
+   };
+   int i, fail;
+#define SYM(lib, xx)                            \
+  do {                                          \
+       sym_ ## xx = dlsym(lib, #xx);            \
+       if (!(sym_ ## xx)) {                     \
+            fprintf(stderr, "%s\n", dlerror()); \
+            fail = 1;                           \
+         }                                      \
+    } while (0)
+
+   if (dri_lib) return 1;
+   for (i = 0; drm_libs[i]; i++)
+     {
+        drm_lib = dlopen(drm_libs[i], RTLD_LOCAL | RTLD_LAZY);
+        if (drm_lib)
+          {
+             fail = 0;
+             SYM(drm_lib, drmClose);
+             SYM(drm_lib, drmWaitVBlank);
+             SYM(drm_lib, drmHandleEvent);
+             if (fail)
+               {
+                  dlclose(drm_lib);
+                  drm_lib = NULL;
+               }
+             else break;
+          }
+     }
+   if (!drm_lib) return 0;
+   for (i = 0; dri_libs[i]; i++)
+     {
+        dri_lib = dlopen(dri_libs[i], RTLD_LOCAL | RTLD_LAZY);
+        if (dri_lib)
+          {
+             fail = 0;
+             SYM(dri_lib, DRI2QueryExtension);
+             SYM(dri_lib, DRI2QueryVersion);
+             SYM(dri_lib, DRI2Connect);
+             SYM(dri_lib, DRI2Authenticate);
+             if (fail)
+               {
+                  dlclose(dri_lib);
+                  dri_lib = NULL;
+               }
+             else break;
+          }
+     }
+   if (!dri_lib)
+     {
+        dlclose(drm_lib);
+        drm_lib = NULL;
+        return 0;
+     }
+   return 1;
+}
+
+static int
+_dri_drm_init(void)
+{
+   if (!sym_DRI2QueryExtension(_ecore_x_disp, &dri2_event, &dri2_error))
+     return 0;
+   if (!sym_DRI2QueryVersion(_ecore_x_disp, &dri2_major, &dri2_minor))
+     return 0;
+   if (dri2_major < 2)
+     return 0;
+   if (!sym_DRI2Connect(_ecore_x_disp, dri_drm_vsync_root, &driver_name, &device_name))
+     return 0;
+   drm_fd = open(device_name, O_RDWR);
+   if (drm_fd < 0)
+     return 0;
+   sym_drmGetMagic(drm_fd, &drm_magic);
+   if (!sym_DRI2Authenticate(_ecore_x_disp, dri_drm_vsync_root, drm_magic))
+     {
+        close(drm_fd);
+        drm_fd = -1;
+        return 0;
+     }
+   memset(&drm_evctx, 0, sizeof(drm_evctx));
+   drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
+   drm_evctx.vblank_handler = _dri_drm_vblank_handler;
+   drm_evctx.page_flip_handler = NULL;
+
+   dri_drm_fdh = ecore_main_fd_handler_add(drm_fd, ECORE_FD_READ,
+                                           _dri_drm_cb, NULL, NULL, NULL);
+   if (!dri_drm_fdh)
+     {
+        close(drm_fd);
+        drm_fd = -1;
+        return 0;
+     }
+   return 1;
+}
+
+static void
+_dri_drm_shutdown(void)
+{
+   if (drm_fd >= 0)
+     {
+        close(drm_fd);
+        drm_fd = -1;
+     }
+   if (dri_drm_fdh)
+     {
+        ecore_main_fd_handler_del(dri_drm_fdh);
+        dri_drm_fdh = NULL;
+     }
+}
+
+#endif
+
+EAPI Eina_Bool
+ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win)
+{
+#ifdef ECORE_X_VSYNC_DRI2
+   Ecore_X_Window root;
+
+   root = ecore_x_window_root_get(win);
+   if (root != dri_drm_vsync_root)
+     {
+        dri_drm_vsync_root = root;
+        if (dri_drm_vsync_root)
+          {
+             if (!_dri_drm_link())
+               {
+                  ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
+                  return EINA_FALSE;
+               }
+             _dri_drm_shutdown();
+             if (!_dri_drm_init())
+               {
+                  dri_drm_vsync_root = 0;
+                  ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
+                  return EINA_FALSE;
+               }
+             ecore_animator_custom_source_tick_begin_callback_set
+               (_dri_drm_tick_begin, NULL);
+             ecore_animator_custom_source_tick_end_callback_set
+               (_dri_drm_tick_end, NULL);
+             ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM);
+          }
+        else
+          {
+             if (drm_fd >= 0)
+               {
+                  _dri_drm_shutdown();
+                  ecore_animator_custom_source_tick_begin_callback_set
+                    (NULL, NULL);
+                  ecore_animator_custom_source_tick_end_callback_set
+                    (NULL, NULL);
+                  ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
+               }
+          }
+     }
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+   win = 0;
+#endif
+}
+
index 517fcac..f16f5b1 100644 (file)
@@ -1,12 +1,17 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include "Ecore_X_Atoms.h"
 
-static int             ignore_num = 0;
+static int ignore_num = 0;
 static Ecore_X_Window *ignore_list = NULL;
 
 /**
@@ -27,51 +32,60 @@ static Ecore_X_Window *ignore_list = NULL;
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_new(Ecore_X_Window parent, int x, int y, int w, int h)
+ecore_x_window_new(Ecore_X_Window parent,
+                   int x,
+                   int y,
+                   int w,
+                   int h)
 {
-   Window               win;
+   Window win;
    XSetWindowAttributes attr;
-   
-   if (parent == 0) parent = DefaultRootWindow(_ecore_x_disp);
-   attr.backing_store         = NotUseful;
-   attr.override_redirect     = False;
-   attr.border_pixel          = 0;
-   attr.background_pixmap     = None;
-   attr.bit_gravity            = NorthWestGravity;
-   attr.win_gravity            = NorthWestGravity;
-   attr.save_under            = False;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (parent == 0)
+     parent = DefaultRootWindow(_ecore_x_disp);
+
+   attr.backing_store = NotUseful;
+   attr.override_redirect = False;
+   attr.border_pixel = 0;
+   attr.background_pixmap = None;
+   attr.bit_gravity = NorthWestGravity;
+   attr.win_gravity = NorthWestGravity;
+   attr.save_under = False;
    attr.do_not_propagate_mask = NoEventMask;
-   attr.event_mask            = KeyPressMask |
-                                KeyReleaseMask |
-                                ButtonPressMask |
-                                ButtonReleaseMask |
-                                EnterWindowMask |
-                                LeaveWindowMask |
-                                PointerMotionMask |
-                                ExposureMask |
-                                VisibilityChangeMask |
-                                StructureNotifyMask |
-                                FocusChangeMask |
-                                PropertyChangeMask |
-                                ColormapChangeMask;
+   attr.event_mask = KeyPressMask |
+     KeyReleaseMask |
+     ButtonPressMask |
+     ButtonReleaseMask |
+     EnterWindowMask |
+     LeaveWindowMask |
+     PointerMotionMask |
+     ExposureMask |
+     VisibilityChangeMask |
+     StructureNotifyMask |
+     FocusChangeMask |
+     PropertyChangeMask |
+     ColormapChangeMask;
    win = XCreateWindow(_ecore_x_disp, parent,
-                      x, y, w, h, 0,
-                      CopyFromParent, /*DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
-                      InputOutput, 
-                      CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
-                      CWBackingStore |
-                      CWOverrideRedirect | 
+                       x, y, w, h, 0,
+                       CopyFromParent, /*DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
+                       InputOutput,
+                       CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
+                       CWBackingStore |
+                       CWOverrideRedirect |
 /*                    CWColormap | */
-                      CWBorderPixel |
-                      CWBackPixmap | 
-                      CWSaveUnder | 
-                      CWDontPropagate | 
-                      CWEventMask |
-                      CWBitGravity |
-                      CWWinGravity,
-                      &attr);
-
-   if (parent == DefaultRootWindow(_ecore_x_disp)) ecore_x_window_defaults_set(win);
+                       CWBorderPixel |
+                       CWBackPixmap |
+                       CWSaveUnder |
+                       CWDontPropagate |
+                       CWEventMask |
+                       CWBitGravity |
+                       CWWinGravity,
+                       &attr);
+
+   if (parent == DefaultRootWindow(_ecore_x_disp))
+     ecore_x_window_defaults_set(win);
+
    return win;
 }
 
@@ -87,49 +101,56 @@ ecore_x_window_new(Ecore_X_Window parent, int x, int y, int w, int h)
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_override_new(Ecore_X_Window parent, int x, int y, int w, int h)
+ecore_x_window_override_new(Ecore_X_Window parent,
+                            int x,
+                            int y,
+                            int w,
+                            int h)
 {
-   Window               win;
+   Window win;
    XSetWindowAttributes attr;
-   
-   if (parent == 0) parent = DefaultRootWindow(_ecore_x_disp);
-   attr.backing_store         = NotUseful;
-   attr.override_redirect     = True;
-   attr.border_pixel          = 0;
-   attr.background_pixmap     = None;
-   attr.bit_gravity           = NorthWestGravity;
-   attr.win_gravity           = NorthWestGravity;
-   attr.save_under            = False;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (parent == 0)
+     parent = DefaultRootWindow(_ecore_x_disp);
+
+   attr.backing_store = NotUseful;
+   attr.override_redirect = True;
+   attr.border_pixel = 0;
+   attr.background_pixmap = None;
+   attr.bit_gravity = NorthWestGravity;
+   attr.win_gravity = NorthWestGravity;
+   attr.save_under = False;
    attr.do_not_propagate_mask = NoEventMask;
-   attr.event_mask            = KeyPressMask |
-                                KeyReleaseMask |
-                                ButtonPressMask |
-                                ButtonReleaseMask |
-                                EnterWindowMask |
-                                LeaveWindowMask |
-                                PointerMotionMask |
-                                ExposureMask |
-                                VisibilityChangeMask |
-                                StructureNotifyMask |
-                                FocusChangeMask |
-                                PropertyChangeMask |
-                                ColormapChangeMask;
+   attr.event_mask = KeyPressMask |
+     KeyReleaseMask |
+     ButtonPressMask |
+     ButtonReleaseMask |
+     EnterWindowMask |
+     LeaveWindowMask |
+     PointerMotionMask |
+     ExposureMask |
+     VisibilityChangeMask |
+     StructureNotifyMask |
+     FocusChangeMask |
+     PropertyChangeMask |
+     ColormapChangeMask;
    win = XCreateWindow(_ecore_x_disp, parent,
-                      x, y, w, h, 0,
-                      CopyFromParent, /*DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
-                      InputOutput, 
-                      CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
-                      CWBackingStore |
-                      CWOverrideRedirect | 
+                       x, y, w, h, 0,
+                       CopyFromParent, /*DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
+                       InputOutput,
+                       CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
+                       CWBackingStore |
+                       CWOverrideRedirect |
 /*                    CWColormap | */
-                      CWBorderPixel |
-                      CWBackPixmap | 
-                      CWSaveUnder | 
-                      CWDontPropagate | 
-                      CWEventMask |
-                      CWBitGravity |
-                      CWWinGravity,
-                      &attr);
+                       CWBorderPixel |
+                       CWBackPixmap |
+                       CWSaveUnder |
+                       CWDontPropagate |
+                       CWEventMask |
+                       CWBitGravity |
+                       CWWinGravity,
+                       &attr);
    return win;
 }
 
@@ -145,45 +166,53 @@ ecore_x_window_override_new(Ecore_X_Window parent, int x, int y, int w, int h)
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_input_new(Ecore_X_Window parent, int x, int y, int w, int h)
+ecore_x_window_input_new(Ecore_X_Window parent,
+                         int x,
+                         int y,
+                         int w,
+                         int h)
 {
-   Window               win;
+   Window win;
    XSetWindowAttributes attr;
-   
-   if (parent == 0) parent = DefaultRootWindow(_ecore_x_disp);
-   attr.override_redirect     = True;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (parent == 0)
+     parent = DefaultRootWindow(_ecore_x_disp);
+
+   attr.override_redirect = True;
    attr.do_not_propagate_mask = NoEventMask;
-   attr.event_mask            = KeyPressMask |
-                                KeyReleaseMask |
-                                ButtonPressMask |
-                                ButtonReleaseMask |
-                                EnterWindowMask |
-                                LeaveWindowMask |
-                                PointerMotionMask |
-                                ExposureMask |
-                                VisibilityChangeMask |
-                                StructureNotifyMask |
-                                FocusChangeMask |
-                                PropertyChangeMask |
-                                ColormapChangeMask;
+   attr.event_mask = KeyPressMask |
+     KeyReleaseMask |
+     ButtonPressMask |
+     ButtonReleaseMask |
+     EnterWindowMask |
+     LeaveWindowMask |
+     PointerMotionMask |
+     ExposureMask |
+     VisibilityChangeMask |
+     StructureNotifyMask |
+     FocusChangeMask |
+     PropertyChangeMask |
+     ColormapChangeMask;
    win = XCreateWindow(_ecore_x_disp, parent,
-                      x, y, w, h, 0,
-                      CopyFromParent, 
-                      InputOnly,
-                      CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
-                      CWOverrideRedirect | 
-                      CWDontPropagate | 
-                      CWEventMask,
-                      &attr);
+                       x, y, w, h, 0,
+                       CopyFromParent,
+                       InputOnly,
+                       CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
+                       CWOverrideRedirect |
+                       CWDontPropagate |
+                       CWEventMask,
+                       &attr);
 
    if (parent == DefaultRootWindow(_ecore_x_disp))
      {
      }
+
    return win;
 }
 
 /**
- * @defgroup Evas_X_Window_Properties_Group X Window Property Functions
+ * @defgroup Ecore_X_Window_Properties_Group X Window Property Functions
  *
  * Functions that set window properties.
  */
@@ -195,7 +224,7 @@ ecore_x_window_input_new(Ecore_X_Window parent, int x, int y, int w, int h)
  * @c _NET_WM_PID.
  *
  * @param   win The given window.
- * @ingroup Evas_X_Window_Properties_Groups
+ * @ingroup Ecore_X_Window_Properties_Group
  */
 EAPI void
 ecore_x_window_defaults_set(Ecore_X_Window win)
@@ -207,6 +236,7 @@ ecore_x_window_defaults_set(Ecore_X_Window win)
    char **argv;
    XTextProperty xprop;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    /*
     * Set WM_CLIENT_MACHINE.
     */
@@ -216,11 +246,11 @@ ecore_x_window_defaults_set(Ecore_X_Window win)
    /* The ecore function uses UTF8 which Xlib may not like (especially
     * with older clients) */
    /* ecore_x_window_prop_string_set(win, ECORE_X_ATOM_WM_CLIENT_MACHINE,
-                                 (char *)buf); */
+                                  (char *)buf); */
    if (XStringListToTextProperty(hostname, 1, &xprop))
      {
-       XSetWMClientMachine(_ecore_x_disp, win, &xprop);
-       XFree(xprop.value);
+        XSetWMClientMachine(_ecore_x_disp, win, &xprop);
+        XFree(xprop.value);
      }
 
    /*
@@ -238,14 +268,20 @@ ecore_x_window_defaults_set(Ecore_X_Window win)
 EAPI void
 ecore_x_window_configure(Ecore_X_Window win,
                          Ecore_X_Window_Configure_Mask mask,
-                         int x, int y, int w, int h,
-                         int border_width, Ecore_X_Window sibling,
+                         int x,
+                         int y,
+                         int w,
+                         int h,
+                         int border_width,
+                         Ecore_X_Window sibling,
                          int stack_mode)
 {
    XWindowChanges xwc;
 
    if (!win)
-      return;
+     return;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
    xwc.x = x;
    xwc.y = y;
@@ -259,7 +295,7 @@ ecore_x_window_configure(Ecore_X_Window win,
 }
 
 /**
- * @defgroup Evas_X_Window_Destroy_Group X Window Destroy Functions
+ * @defgroup Ecore_X_Window_Destroy_Group X Window Destroy Functions
  *
  * Functions to destroy X windows.
  */
@@ -267,16 +303,17 @@ ecore_x_window_configure(Ecore_X_Window win,
 /**
  * Deletes the given window.
  * @param   win The given window.
- * @ingroup Evas_X_Window_Destroy_Group
+ * @ingroup Ecore_X_Window_Destroy_Group
  */
 EAPI void
-ecore_x_window_del(Ecore_X_Window win)
+ecore_x_window_free(Ecore_X_Window win)
 {
    /* sorry sir, deleting the root window doesn't sound like
     * a smart idea.
     */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (win)
-      XDestroyWindow(_ecore_x_disp, win);
+     XDestroyWindow(_ecore_x_disp, win);
 }
 
 /**
@@ -285,41 +322,56 @@ ecore_x_window_del(Ecore_X_Window win)
  * @param   ignore if to ignore
  */
 EAPI void
-ecore_x_window_ignore_set(Ecore_X_Window win, int ignore)
+ecore_x_window_ignore_set(Ecore_X_Window win,
+                          int ignore)
 {
-   int i, j;
+   int i, j, cnt;
+   Ecore_X_Window *t;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (ignore)
      {
-       if (ignore_list)
-         {
-            for (i = 0; i < ignore_num; i++)
-              {
-                 if (win == ignore_list[i])
-                   return;
-              }
-            ignore_list = realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
-            if (!ignore_list) return;
-            ignore_list[ignore_num++] = win;
-         }
-       else
-         {
-            ignore_num = 0;
-            ignore_list = malloc(sizeof(Ecore_X_Window));
-            ignore_list[ignore_num++] = win;
-         }
+        if (ignore_list)
+          {
+             for (i = 0; i < ignore_num; i++)
+               {
+                  if (win == ignore_list[i])
+                    return;
+               }
+             t = realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
+             if (!t) return;
+             ignore_list = t;
+             ignore_list[ignore_num++] = win;
+          }
+        else
+          {
+             ignore_num = 0;
+             ignore_list = malloc(sizeof(Ecore_X_Window));
+             if (ignore_list)
+               ignore_list[ignore_num++] = win;
+          }
      }
    else
      {
-       if (!ignore_list) return;
-       for (i = 0, j = 0; i < ignore_num; i++)
-         {
-            if (win != ignore_list[i])
-              ignore_list[i] = ignore_list[j++];
-            else
-              ignore_num--;
-         }
-       ignore_list = realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
+        if (!ignore_list)
+          return;
+
+        for (cnt = ignore_num, i = 0, j = 0; i < cnt; i++)
+          {
+             if (win != ignore_list[i])
+               ignore_list[j++] = ignore_list[i];
+             else
+               ignore_num--;
+          }
+
+        if (ignore_num <= 0)
+          {
+             free(ignore_list);
+             ignore_list = NULL;
+             return;
+          }
+        t = realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
+        if (t) ignore_list = t;
      }
 }
 
@@ -331,14 +383,16 @@ ecore_x_window_ignore_set(Ecore_X_Window win, int ignore)
 EAPI Ecore_X_Window *
 ecore_x_window_ignore_list(int *num)
 {
-   if (num) *num = ignore_num;
+   if (num)
+     *num = ignore_num;
+
    return ignore_list;
 }
 
 /**
  * Sends a delete request to the given window.
  * @param   win The given window.
- * @ingroup Evas_X_Window_Destroy_Group
+ * @ingroup Ecore_X_Window_Destroy_Group
  */
 EAPI void
 ecore_x_window_delete_request_send(Ecore_X_Window win)
@@ -349,8 +403,9 @@ ecore_x_window_delete_request_send(Ecore_X_Window win)
     * a smart idea.
     */
    if (!win)
-      return;
+     return;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    xev.xclient.type = ClientMessage;
    xev.xclient.display = _ecore_x_disp;
    xev.xclient.window = win;
@@ -363,7 +418,7 @@ ecore_x_window_delete_request_send(Ecore_X_Window win)
 }
 
 /**
- * @defgroup Evas_X_Window_Visibility_Group X Window Visibility Functions
+ * @defgroup Ecore_X_Window_Visibility_Group X Window Visibility Functions
  *
  * Functions to access and change the visibility of X windows.
  */
@@ -374,11 +429,12 @@ ecore_x_window_delete_request_send(Ecore_X_Window win)
  * Synonymous to "mapping" a window in X Window System terminology.
  *
  * @param   win The window to show.
- * @ingroup Evas_X_Window_Visibility
+ * @ingroup Ecore_X_Window_Visibility
  */
 EAPI void
 ecore_x_window_show(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XMapWindow(_ecore_x_disp, win);
 }
 
@@ -388,7 +444,7 @@ ecore_x_window_show(Ecore_X_Window win)
  * Synonymous to "unmapping" a window in X Window System terminology.
  *
  * @param   win The window to hide.
- * @ingroup Evas_X_Window_Visibility
+ * @ingroup Ecore_X_Window_Visibility
  */
 EAPI void
 ecore_x_window_hide(Ecore_X_Window win)
@@ -399,11 +455,21 @@ ecore_x_window_hide(Ecore_X_Window win)
    unsigned int uidum;
 
    /* ICCCM: SEND unmap event... */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    root = win;
    if (ScreenCount(_ecore_x_disp) == 1)
      root = DefaultRootWindow(_ecore_x_disp);
    else
-     XGetGeometry(_ecore_x_disp, win, &root, &idum, &idum, &uidum, &uidum, &uidum, &uidum);
+     XGetGeometry(_ecore_x_disp,
+                  win,
+                  &root,
+                  &idum,
+                  &idum,
+                  &uidum,
+                  &uidum,
+                  &uidum,
+                  &uidum);
+
    xev.xunmap.type = UnmapNotify;
    xev.xunmap.serial = 0;
    xev.xunmap.send_event = True;
@@ -412,7 +478,7 @@ ecore_x_window_hide(Ecore_X_Window win)
    xev.xunmap.window = win;
    xev.xunmap.from_configure = False;
    XSendEvent(_ecore_x_disp, xev.xunmap.event, False,
-             SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+              SubstructureRedirectMask | SubstructureNotifyMask, &xev);
    XUnmapWindow(_ecore_x_disp, win);
 }
 
@@ -434,8 +500,11 @@ ecore_x_window_hide(Ecore_X_Window win)
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_move(Ecore_X_Window win, int x, int y)
+ecore_x_window_move(Ecore_X_Window win,
+                    int x,
+                    int y)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XMoveWindow(_ecore_x_disp, win, x, y);
 }
 
@@ -447,10 +516,17 @@ ecore_x_window_move(Ecore_X_Window win, int x, int y)
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_resize(Ecore_X_Window win, int w, int h)
+ecore_x_window_resize(Ecore_X_Window win,
+                      int w,
+                      int h)
 {
-   if (w < 1) w = 1;
-   if (h < 1) h = 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (w < 1)
+     w = 1;
+
+   if (h < 1)
+     h = 1;
+
    XResizeWindow(_ecore_x_disp, win, w, h);
 }
 
@@ -464,10 +540,19 @@ ecore_x_window_resize(Ecore_X_Window win, int w, int h)
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_move_resize(Ecore_X_Window win, int x, int y, int w, int h)
+ecore_x_window_move_resize(Ecore_X_Window win,
+                           int x,
+                           int y,
+                           int w,
+                           int h)
 {
-   if (w < 1) w = 1;
-   if (h < 1) h = 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (w < 1)
+     w = 1;
+
+   if (h < 1)
+     h = 1;
+
    XMoveResizeWindow(_ecore_x_disp, win, x, y, w, h);
 }
 
@@ -485,9 +570,12 @@ ecore_x_window_move_resize(Ecore_X_Window win, int x, int y, int w, int h)
 EAPI void
 ecore_x_window_focus(Ecore_X_Window win)
 {
-   if (win == 0) win = DefaultRootWindow(_ecore_x_disp);   
-//   XSetInputFocus(_ecore_x_disp, win, RevertToNone, CurrentTime);
-   XSetInputFocus(_ecore_x_disp, win, RevertToPointerRoot, CurrentTime);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);  //   XSetInputFocus(_ecore_x_disp, win, RevertToNone, CurrentTime);
+
+//   XSetInputFocus(_ecore_x_disp, win, RevertToPointerRoot, CurrentTime);
+   XSetInputFocus(_ecore_x_disp, win, RevertToParent, CurrentTime);
 }
 
 /**
@@ -497,15 +585,19 @@ ecore_x_window_focus(Ecore_X_Window win)
  * @ingroup Ecore_X_Window_Focus_Functions
  */
 EAPI void
-ecore_x_window_focus_at_time(Ecore_X_Window win, Ecore_X_Time t)
+ecore_x_window_focus_at_time(Ecore_X_Window win,
+                             Ecore_X_Time t)
 {
-   if (win == 0) win = DefaultRootWindow(_ecore_x_disp);   
-//   XSetInputFocus(_ecore_x_disp, win, RevertToNone, t);
-   XSetInputFocus(_ecore_x_disp, win, PointerRoot, t);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);  //   XSetInputFocus(_ecore_x_disp, win, RevertToNone, t);
+
+//   XSetInputFocus(_ecore_x_disp, win, PointerRoot, t);
+   XSetInputFocus(_ecore_x_disp, win, RevertToParent, t);
 }
 
 /**
- * gets the focus to the window @p win.
+ * gets the window that has focus.
  * @return  The window that has focus.
  * @ingroup Ecore_X_Window_Focus_Functions
  */
@@ -514,9 +606,9 @@ ecore_x_window_focus_get(void)
 {
    Window win;
    int revert_mode;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    win = 0;
-   
    XGetInputFocus(_ecore_x_disp, &win, &revert_mode);
    return win;
 }
@@ -535,6 +627,7 @@ ecore_x_window_focus_get(void)
 EAPI void
 ecore_x_window_raise(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XRaiseWindow(_ecore_x_disp, win);
 }
 
@@ -546,6 +639,7 @@ ecore_x_window_raise(Ecore_X_Window win)
 EAPI void
 ecore_x_window_lower(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XLowerWindow(_ecore_x_disp, win);
 }
 
@@ -564,9 +658,15 @@ ecore_x_window_lower(Ecore_X_Window win)
  * @ingroup Ecore_X_Window_Parent_Group
  */
 EAPI void
-ecore_x_window_reparent(Ecore_X_Window win, Ecore_X_Window new_parent, int x, int y)
+ecore_x_window_reparent(Ecore_X_Window win,
+                        Ecore_X_Window new_parent,
+                        int x,
+                        int y)
 {
-   if (new_parent == 0) new_parent = DefaultRootWindow(_ecore_x_disp);   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (new_parent == 0)
+     new_parent = DefaultRootWindow(_ecore_x_disp);
+
    XReparentWindow(_ecore_x_disp, win, new_parent, x, y);
 }
 
@@ -578,18 +678,28 @@ ecore_x_window_reparent(Ecore_X_Window win, Ecore_X_Window new_parent, int x, in
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h)
+ecore_x_window_size_get(Ecore_X_Window win,
+                        int *w,
+                        int *h)
 {
    int dummy_x, dummy_y;
-   
-   if (win == 0) 
-      win = DefaultRootWindow(_ecore_x_disp);
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);
 
    ecore_x_drawable_geometry_get(win, &dummy_x, &dummy_y, w, h);
 }
 
 /**
  * Retrieves the geometry of the given window.
+ *
+ * Note that the x & y coordinates are relative to your parent.  In
+ * particular for reparenting window managers - relative to you window border.
+ * If you want screen coordinates either walk the window tree to the root,
+ * else for ecore_evas applications see ecore_evas_geometry_get().  Elementary
+ * applications can use elm_win_screen_position_get().
+ *
  * @param   win The given window.
  * @param   x   Pointer to an integer in which the X position is to be stored.
  * @param   y   Pointer to an integer in which the Y position is to be stored.
@@ -598,10 +708,15 @@ ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h)
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h)
+ecore_x_window_geometry_get(Ecore_X_Window win,
+                            int *x,
+                            int *y,
+                            int *w,
+                            int *h)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!win)
-      win = DefaultRootWindow(_ecore_x_disp);
+     win = DefaultRootWindow(_ecore_x_disp);
 
    ecore_x_drawable_geometry_get(win, x, y, w, h);
 }
@@ -615,9 +730,10 @@ ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h)
 EAPI int
 ecore_x_window_border_width_get(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    /* doesn't make sense to call this on a root window */
    if (!win)
-      return 0;
+     return 0;
 
    return ecore_x_drawable_border_width_get(win);
 }
@@ -629,11 +745,13 @@ ecore_x_window_border_width_get(Ecore_X_Window win)
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI void
-ecore_x_window_border_width_set(Ecore_X_Window win, int width)
+ecore_x_window_border_width_set(Ecore_X_Window win,
+                                int width)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    /* doesn't make sense to call this on a root window */
    if (!win)
-      return;
+     return;
 
    XSetWindowBorderWidth (_ecore_x_disp, win, width);
 }
@@ -646,47 +764,52 @@ ecore_x_window_border_width_set(Ecore_X_Window win, int width)
 EAPI int
 ecore_x_window_depth_get(Ecore_X_Window win)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ecore_x_drawable_depth_get(win);
 }
-  
+
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Show the cursor on a window of type Ecore_X_Window.
+ * @param win The window for which the cursor will be showed.
+ * @param show Enables the show of the cursor on the window if equals EINA_TRUE, disables if equals EINA_FALSE.
  */
 EAPI void
-ecore_x_window_cursor_show(Ecore_X_Window win, int show)
+ecore_x_window_cursor_show(Ecore_X_Window win,
+                           Eina_Bool show)
 {
-   if (win == 0) win = DefaultRootWindow(_ecore_x_disp);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);
+
    if (!show)
      {
-       Cursor              c;
-       XColor              cl;
-       Pixmap              p, m;
-       GC                  gc;
-       XGCValues           gcv;
-       
-       p = XCreatePixmap(_ecore_x_disp, win, 1, 1, 1);
-       m = XCreatePixmap(_ecore_x_disp, win, 1, 1, 1);
-       gc = XCreateGC(_ecore_x_disp, m, 0, &gcv);
-       XSetForeground(_ecore_x_disp, gc, 0);
-       XDrawPoint(_ecore_x_disp, m, gc, 0, 0);
-       XFreeGC(_ecore_x_disp, gc);
-       c = XCreatePixmapCursor(_ecore_x_disp, p, m, &cl, &cl, 0, 0);
-       XDefineCursor(_ecore_x_disp, win, c);
-       XFreeCursor(_ecore_x_disp, c);
-       XFreePixmap(_ecore_x_disp, p);
-       XFreePixmap(_ecore_x_disp, m);
+        Cursor c;
+        XColor cl;
+        Pixmap p, m;
+        GC gc;
+        XGCValues gcv;
+
+        p = XCreatePixmap(_ecore_x_disp, win, 1, 1, 1);
+        m = XCreatePixmap(_ecore_x_disp, win, 1, 1, 1);
+        gc = XCreateGC(_ecore_x_disp, m, 0, &gcv);
+        XSetForeground(_ecore_x_disp, gc, 0);
+        XDrawPoint(_ecore_x_disp, m, gc, 0, 0);
+        XFreeGC(_ecore_x_disp, gc);
+        c = XCreatePixmapCursor(_ecore_x_disp, p, m, &cl, &cl, 0, 0);
+        XDefineCursor(_ecore_x_disp, win, c);
+        XFreeCursor(_ecore_x_disp, c);
+        XFreePixmap(_ecore_x_disp, p);
+        XFreePixmap(_ecore_x_disp, m);
      }
    else
-     {
-       XDefineCursor(_ecore_x_disp, win, 0);   
-     }
+     XDefineCursor(_ecore_x_disp, win, 0);
 }
 
 EAPI void
-ecore_x_window_cursor_set(Ecore_X_Window win, Ecore_X_Cursor c)
+ecore_x_window_cursor_set(Ecore_X_Window win,
+                          Ecore_X_Cursor c)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (c == 0)
      XUndefineCursor(_ecore_x_disp, win);
    else
@@ -704,84 +827,92 @@ ecore_x_window_visible_get(Ecore_X_Window win)
 {
    XWindowAttributes attr;
 
-   return (XGetWindowAttributes(_ecore_x_disp, win, &attr) &&
-           (attr.map_state == IsViewable));
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return XGetWindowAttributes(_ecore_x_disp, win, &attr) &&
+          (attr.map_state == IsViewable);
 }
 
-
-
 typedef struct _Shadow Shadow;
 struct _Shadow
 {
-   Shadow         *parent;
-   Shadow        **children;
-   Window          win;
-   int             children_num;
-   short           x, y;
-   unsigned short  w, h;
+   Shadow        *parent;
+   Shadow       **children;
+   Window         win;
+   int            children_num;
+   short          x, y;
+   unsigned short w, h;
 };
 
-static int shadow_count = 0;
 static Shadow **shadow_base = NULL;
 static int shadow_num = 0;
 
 static Shadow *
 _ecore_x_window_tree_walk(Window win)
 {
-   Window           *list = NULL;
-   Window            parent_win = 0, root_win = 0;
-   int               i, j;
-   unsigned int      num;
-   Shadow           *s, **sl;
+   Window *list = NULL;
+   Window parent_win = 0, root_win = 0;
+   unsigned int num;
+   Shadow *s, **sl;
    XWindowAttributes att;
 
-   if (!XGetWindowAttributes(_ecore_x_disp, win, &att)) return NULL;
-//   if (att.class == InputOnly) return NULL;
-   if (att.map_state != IsViewable) return NULL;
-   
+   if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
+     return NULL;  //   if (att.class == InputOnly) return NULL;
+
+   if (att.map_state != IsViewable)
+     return NULL;
+
    s = calloc(1, sizeof(Shadow));
-   if (!s) return NULL;
+   if (!s)
+     return NULL;
+
    s->win = win;
    s->x = att.x;
    s->y = att.y;
    s->w = att.width;
    s->h = att.height;
    if (XQueryTree(_ecore_x_disp, s->win, &root_win, &parent_win,
-                  &list, &num))
+                  &list, &num))
      {
-       s->children = calloc(1, sizeof(Shadow *) * num);
-       if (s->children)
-         {
-            s->children_num = num;
-            for (i = 0; i < num; i++)
-              {
-                 s->children[i] = _ecore_x_window_tree_walk(list[i]);
-                 if (s->children[i]) s->children[i]->parent = s;
-              }
-            /* compress list down */
-            j = 0;
-            for (i = 0; i < num; i++)
-              {
-                 if (s->children[i])
-                   {
-                      s->children[j] = s->children[i];
-                      j++;
-                   }
-              }
-            if (j == 0)
-              {
-                 free(s->children);
-                 s->children = NULL;
-                 s->children_num = 0;
-              }
-            else
-              {
-                 s->children_num = j;
-                 sl = realloc(s->children, sizeof(Shadow *) * j);
-                 if (sl) s->children = sl;
-              }
-         }
+        s->children = calloc(1, sizeof(Shadow *) * num);
+        if (s->children)
+          {
+             size_t i, j;
+             s->children_num = num;
+             for (i = 0; i < num; i++)
+               {
+                  s->children[i] = _ecore_x_window_tree_walk(list[i]);
+                  if (s->children[i])
+                    s->children[i]->parent = s;
+               }
+             /* compress list down */
+             j = 0;
+             for (i = 0; i < num; i++)
+               {
+                  if (s->children[i])
+                    {
+                       s->children[j] = s->children[i];
+                       j++;
+                    }
+               }
+             if (j == 0)
+               {
+                  free(s->children);
+                  s->children = NULL;
+                  s->children_num = 0;
+               }
+             else
+               {
+                  s->children_num = j;
+                  sl = realloc(s->children, sizeof(Shadow *) * j);
+                  if (sl)
+                    s->children = sl;
+               }
+          }
      }
+
+   if (list)
+     XFree(list);
+
    return s;
 }
 
@@ -790,16 +921,19 @@ _ecore_x_window_tree_shadow_free1(Shadow *s)
 {
    int i;
 
-   if (!s) return;
+   if (!s)
+     return;
+
    if (s->children)
      {
-       for (i = 0; i < s->children_num; i++)
-         {
-            if (s->children[i])
-              _ecore_x_window_tree_shadow_free1(s->children[i]);
-         }
-       free(s->children);
+        for (i = 0; i < s->children_num; i++)
+          {
+             if (s->children[i])
+               _ecore_x_window_tree_shadow_free1(s->children[i]);
+          }
+        free(s->children);
      }
+
    free(s);
 }
 
@@ -807,12 +941,16 @@ static void
 _ecore_x_window_tree_shadow_free(void)
 {
    int i;
-   
-   if (!shadow_base) return;
+
+   if (!shadow_base)
+     return;
+
    for (i = 0; i < shadow_num; i++)
      {
-       if (!shadow_base[i]) continue;
-       _ecore_x_window_tree_shadow_free1(shadow_base[i]);
+        if (!shadow_base[i])
+          continue;
+
+        _ecore_x_window_tree_shadow_free1(shadow_base[i]);
      }
    free(shadow_base);
    shadow_base = NULL;
@@ -822,59 +960,69 @@ _ecore_x_window_tree_shadow_free(void)
 static void
 _ecore_x_window_tree_shadow_populate(void)
 {
-   Ecore_X_Window   *roots;
-   int               i, num;
-   
+   Ecore_X_Window *roots;
+   int i, num;
+
    roots = ecore_x_window_root_list(&num);
    if (roots)
      {
-       shadow_base = calloc(1, sizeof(Shadow *) * num);
-       if (shadow_base)
-         {
-            shadow_num = num;
-            for (i = 0; i < num; i++)
-              shadow_base[i] = _ecore_x_window_tree_walk(roots[i]);
-         }
-       free(roots);
+        shadow_base = calloc(1, sizeof(Shadow *) * num);
+        if (shadow_base)
+          {
+             shadow_num = num;
+             for (i = 0; i < num; i++)
+               shadow_base[i] = _ecore_x_window_tree_walk(roots[i]);
+          }
+
+        free(roots);
      }
 }
 
-static void
-_ecore_x_window_tree_shadow_start(void)
-{
+/*
+   static int shadow_count = 0;
+
+   static void
+   _ecore_x_window_tree_shadow_start(void)
+   {
    shadow_count++;
    if (shadow_count > 1) return;
    _ecore_x_window_tree_shadow_populate();
-}
+   }
 
-static void
-_ecore_x_window_tree_shadow_stop(void)
-{
+   static void
+   _ecore_x_window_tree_shadow_stop(void)
+   {
    shadow_count--;
    if (shadow_count != 0) return;
    _ecore_x_window_tree_shadow_free();
-}
+   }
+ */
 
-Shadow *
-_ecore_x_window_shadow_tree_find_shadow(Shadow *s, Window win)
+static Shadow *
+_ecore_x_window_shadow_tree_find_shadow(Shadow *s,
+                                        Window win)
 {
    Shadow *ss;
    int i;
 
-   if (s->win == win) return s;
+   if (s->win == win)
+     return s;
+
    if (s->children)
-     {
-       for (i = 0; i < s->children_num; i++)
-         {
-            if (!s->children[i]) continue;
-            if ((ss = _ecore_x_window_shadow_tree_find_shadow(s->children[i], win)))
-              return ss;
-         }
-     }
+     for (i = 0; i < s->children_num; i++)
+       {
+          if (!s->children[i])
+            continue;
+
+          if ((ss =
+                 _ecore_x_window_shadow_tree_find_shadow(s->children[i], win)))
+            return ss;
+       }
+
    return NULL;
 }
 
-Shadow *
+static Shadow *
 _ecore_x_window_shadow_tree_find(Window base)
 {
    Shadow *s;
@@ -882,71 +1030,138 @@ _ecore_x_window_shadow_tree_find(Window base)
 
    for (i = 0; i < shadow_num; i++)
      {
-       if (!shadow_base[i]) continue;
-       if ((s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], base)))
-         return s;
+        if (!shadow_base[i])
+          continue;
+
+        if ((s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], base)))
+          return s;
      }
    return NULL;
 }
 
+static int
+_inside_rects(Shadow *s,
+              int x,
+              int y,
+              int bx,
+              int by,
+              Ecore_X_Rectangle *rects,
+              int num)
+{
+   int i, inside;
+
+   if (!rects) return 0;
+   inside = 0;
+   for (i = 0; i < num; i++)
+     {
+        if ((x >= s->x + bx + rects[i].x) &&
+            (y >= s->y + by + rects[i].y) &&
+            (x < (int)(s->x + bx + rects[i].x + rects[i].width)) &&
+            (y < (int)(s->y + by + rects[i].y + rects[i].height)))
+          {
+             inside = 1;
+             break;
+          }
+     }
+   free(rects);
+   return inside;
+}
+
 static Window
-_ecore_x_window_shadow_tree_at_xy_get_shadow(Shadow *s, int bx, int by, int x, int y,
-                                            Ecore_X_Window *skip, int skip_num)
+_ecore_x_window_shadow_tree_at_xy_get_shadow(Shadow *s,
+                                             int bx,
+                                             int by,
+                                             int x,
+                                             int y,
+                                             Ecore_X_Window *skip,
+                                             int skip_num)
 {
    Window child;
    int i, j;
    int wx, wy;
-   
+
    wx = s->x + bx;
    wy = s->y + by;
    if (!((x >= wx) && (y >= wy) && (x < (wx + s->w)) && (y < (wy + s->h))))
      return 0;
+
+   /* FIXME: get shape */
+   {
+      int num;
+      Ecore_X_Rectangle *rects;
+
+      num = 0;
+      rects = ecore_x_window_shape_rectangles_get(s->win, &num);
+      if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
+      num = 0;
+      rects = ecore_x_window_shape_input_rectangles_get(s->win, &num);
+      if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
+   }
+
    if (s->children)
      {
-       int skipit = 0;
-       
-       for (i = s->children_num - 1; i >= 0; --i)
-         {
-            if (!s->children[i]) continue;
-            skipit = 0;
-            if (skip)
-              {
-                 for (j = 0; j < skip_num; j++)
-                   {
-                      if (s->children[i]->win == skip[j])
-                        {
-                           skipit = 1;
-                           goto onward;
-                        }
-                   }
-              }
-            onward:
-            if (!skipit)
-              {
-                 if ((child = _ecore_x_window_shadow_tree_at_xy_get_shadow(s->children[i], wx, wy, x, y, skip, skip_num)))
-                   {
-                      return child;
-                   }
-              }
-         }
+        int skipit = 0;
+
+        for (i = s->children_num - 1; i >= 0; --i)
+          {
+             if (!s->children[i])
+               continue;
+
+             skipit = 0;
+             if (skip)
+               for (j = 0; j < skip_num; j++)
+                 {
+                    if (s->children[i]->win == skip[j])
+                      {
+                         skipit = 1;
+                         goto onward;
+                      }
+                 }
+
+onward:
+             if (!skipit)
+               if ((child =
+                      _ecore_x_window_shadow_tree_at_xy_get_shadow(s->
+                                                                   children[i
+                                                                   ], wx, wy,
+                                                                   x, y, skip,
+                                                                   skip_num)))
+                 return child;
+          }
      }
+
    return s->win;
 }
 
 static Window
-_ecore_x_window_shadow_tree_at_xy_get(Window base, int bx, int by, int x, int y,
-                                     Ecore_X_Window *skip, int skip_num)
+_ecore_x_window_shadow_tree_at_xy_get(Window base,
+                                      int bx,
+                                      int by,
+                                      int x,
+                                      int y,
+                                      Ecore_X_Window *skip,
+                                      int skip_num)
 {
    Shadow *s;
-   
+
    if (!shadow_base)
      {
-       _ecore_x_window_tree_shadow_populate();
-       if (!shadow_base) return 0;
+        _ecore_x_window_tree_shadow_populate();
+        if (!shadow_base)
+          return 0;
      }
+
    s = _ecore_x_window_shadow_tree_find(base);
-   if (!s) return 0;
-   return _ecore_x_window_shadow_tree_at_xy_get_shadow(s, bx, by, x, y, skip, skip_num);
+   if (!s)
+     return 0;
+
+   return _ecore_x_window_shadow_tree_at_xy_get_shadow(s,
+                                                       bx,
+                                                       by,
+                                                       x,
+                                                       y,
+                                                       skip,
+                                                       skip_num);
 }
 
 /**
@@ -958,13 +1173,26 @@ _ecore_x_window_shadow_tree_at_xy_get(Window base, int bx, int by, int x, int y,
  * @param   base The base window to start searching from (normally root).
  * @param   x The given X position.
  * @param   y The given Y position.
+ * @param   skip The list of windows to be skipped.
+ * @param   skip_num The number of windows to be skipped.
  * @return  The window at that position.
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base, int x, int y, Ecore_X_Window *skip, int skip_num)
+ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base,
+                                               int x,
+                                               int y,
+                                               Ecore_X_Window *skip,
+                                               int skip_num)
 {
-   return _ecore_x_window_shadow_tree_at_xy_get(base, 0, 0, x, y, skip, skip_num);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   return _ecore_x_window_shadow_tree_at_xy_get(base,
+                                                0,
+                                                0,
+                                                x,
+                                                y,
+                                                skip,
+                                                skip_num);
 }
 
 /**
@@ -976,25 +1204,33 @@ ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base, int x, int y
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_shadow_parent_get(Ecore_X_Window root, Ecore_X_Window win)
+ecore_x_window_shadow_parent_get(Ecore_X_Window root __UNUSED__,
+                                 Ecore_X_Window win)
 {
    Shadow *s;
    int i;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!shadow_base)
      {
-       _ecore_x_window_tree_shadow_populate();
-       if (!shadow_base) return 0;
+        _ecore_x_window_tree_shadow_populate();
+        if (!shadow_base)
+          return 0;
      }
+
    for (i = 0; i < shadow_num; i++)
      {
-       if (!shadow_base[i]) continue;
-       s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], win);
-       if (s)
-         {
-            if (!s->parent) return 0;
-            return s->parent->win;
-         }
+        if (!shadow_base[i])
+          continue;
+
+        s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], win);
+        if (s)
+          {
+             if (!s->parent)
+               return 0;
+
+             return s->parent->win;
+          }
      }
    return 0;
 }
@@ -1006,6 +1242,7 @@ ecore_x_window_shadow_parent_get(Ecore_X_Window root, Ecore_X_Window win)
 EAPI void
 ecore_x_window_shadow_tree_flush(void)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_window_tree_shadow_free();
 }
 
@@ -1020,22 +1257,32 @@ ecore_x_window_root_get(Ecore_X_Window win)
 {
    XWindowAttributes att;
 
-   if (!XGetWindowAttributes(_ecore_x_disp, win, &att)) return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
+     return 0;
+
    return att.root;
 }
 
 static Window
-_ecore_x_window_at_xy_get(Window base, int bx, int by, int x, int y,
-                         Ecore_X_Window *skip, int skip_num)
+_ecore_x_window_at_xy_get(Window base,
+                          int bx,
+                          int by,
+                          int x,
+                          int y,
+                          Ecore_X_Window *skip,
+                          int skip_num)
 {
-   Window           *list = NULL;
-   Window            parent_win = 0, child = 0, root_win = 0;
-   int               i, j, wx, wy, ww, wh;
-   unsigned int      num;
+   Window *list = NULL;
+   Window parent_win = 0, child = 0, root_win = 0;
+   int i, j, wx, wy, ww, wh;
+   unsigned int num;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!ecore_x_window_visible_get(base))
      return 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_geometry_get(base, &wx, &wy, &ww, &wh);
    wx += bx;
    wy += by;
@@ -1043,40 +1290,41 @@ _ecore_x_window_at_xy_get(Window base, int bx, int by, int x, int y,
    if (!((x >= wx) && (y >= wy) && (x < (wx + ww)) && (y < (wy + wh))))
      return 0;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XQueryTree(_ecore_x_disp, base, &root_win, &parent_win, &list, &num))
      return base;
 
    if (list)
      {
-       int skipit = 0;
-       
-       for (i = num - 1; i >= 0; --i)
-         {
-            skipit = 0;
-            
-            if (skip)
-              {
-                 for (j = 0; j < skip_num; j++)
-                   {
-                      if (list[i] == skip[j])
-                        {
-                           skipit = 1;
-                           goto onward;
-                        }
-                   }
-              }
-            onward:
-            if (!skipit)
-              {
-                 if ((child = _ecore_x_window_at_xy_get(list[i], wx, wy, x, y, skip, skip_num)))
-                   {
-                      XFree(list);
-                      return child;
-                   }
-              }
-         }
-       XFree(list);
+        int skipit = 0;
+
+        for (i = num - 1; i >= 0; --i)
+          {
+             skipit = 0;
+
+             if (skip)
+               for (j = 0; j < skip_num; j++)
+                 {
+                    if (list[i] == skip[j])
+                      {
+                         skipit = 1;
+                         goto onward;
+                      }
+                 }
+
+onward:
+             if (!skipit)
+               if ((child =
+                      _ecore_x_window_at_xy_get(list[i], wx, wy, x, y, skip,
+                                                skip_num)))
+                 {
+                    XFree(list);
+                    return child;
+                 }
+          }
+        XFree(list);
      }
+
    return base;
 }
 
@@ -1088,18 +1336,20 @@ _ecore_x_window_at_xy_get(Window base, int bx, int by, int x, int y,
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_at_xy_get(int x, int y)
+ecore_x_window_at_xy_get(int x,
+                         int y)
 {
-   Ecore_X_Window    win, root;
-   
+   Ecore_X_Window win, root;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    /* FIXME: Proper function to determine current root/virtual root
     * window missing here */
    root = DefaultRootWindow(_ecore_x_disp);
-   
+
    ecore_x_grab();
    win = _ecore_x_window_at_xy_get(root, 0, 0, x, y, NULL, 0);
    ecore_x_ungrab();
-   
+
    return win ? win : root;
 }
 
@@ -1108,34 +1358,43 @@ ecore_x_window_at_xy_get(int x, int y)
  * but skips the windows in the list.
  * @param   x The given X position.
  * @param   y The given Y position.
+ * @param   skip The list of windows to be skipped.
+ * @param   skip_num The number of windows to be skipped.
  * @return  The window at that position.
  * @ingroup Ecore_X_Window_Geometry_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_at_xy_with_skip_get(int x, int y, Ecore_X_Window *skip, int skip_num)
+ecore_x_window_at_xy_with_skip_get(int x,
+                                   int y,
+                                   Ecore_X_Window *skip,
+                                   int skip_num)
 {
-   Ecore_X_Window    win, root;
-   
+   Ecore_X_Window win, root;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    /* FIXME: Proper function to determine current root/virtual root
     * window missing here */
    root = DefaultRootWindow(_ecore_x_disp);
-   
+
    ecore_x_grab();
    win = _ecore_x_window_at_xy_get(root, 0, 0, x, y, skip, skip_num);
    ecore_x_ungrab();
-   
+
    return win ? win : root;
 }
 
 EAPI Ecore_X_Window
-ecore_x_window_at_xy_begin_get(Ecore_X_Window begin, int x, int y)
+ecore_x_window_at_xy_begin_get(Ecore_X_Window begin,
+                               int x,
+                               int y)
 {
-   Ecore_X_Window    win;
-   
+   Ecore_X_Window win;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_grab();
    win = _ecore_x_window_at_xy_get(begin, 0, 0, x, y, NULL, 0);
    ecore_x_ungrab();
-   
+
    return win ? win : begin;
 }
 
@@ -1148,13 +1407,15 @@ ecore_x_window_at_xy_begin_get(Ecore_X_Window begin, int x, int y)
 EAPI Ecore_X_Window
 ecore_x_window_parent_get(Ecore_X_Window win)
 {
-   Window         root, parent, *children = NULL;
-   unsigned int   num;
+   Window root, parent, *children = NULL;
+   unsigned int num;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XQueryTree(_ecore_x_disp, win, &root, &parent, &children, &num))
-      return 0;
+     return 0;
+
    if (children)
-      XFree(children);
+     XFree(children);
 
    return parent;
 }
@@ -1167,13 +1428,16 @@ ecore_x_window_parent_get(Ecore_X_Window win)
  * @param b     blue value (0...65536, 16 bits)
  */
 EAPI void
-ecore_x_window_background_color_set(Ecore_X_Window win, unsigned short r,
-                                   unsigned short g, unsigned short b)
+ecore_x_window_background_color_set(Ecore_X_Window win,
+                                    unsigned short r,
+                                    unsigned short g,
+                                    unsigned short b)
 {
    XSetWindowAttributes attr;
    Colormap map;
    XColor col;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    col.red = r;
    col.green = g;
    col.blue = b;
@@ -1186,164 +1450,201 @@ ecore_x_window_background_color_set(Ecore_X_Window win, unsigned short r,
 }
 
 EAPI void
-ecore_x_window_gravity_set(Ecore_X_Window win, Ecore_X_Gravity grav)
+ecore_x_window_gravity_set(Ecore_X_Window win,
+                           Ecore_X_Gravity grav)
 {
    XSetWindowAttributes att;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    att.win_gravity = grav;
    XChangeWindowAttributes(_ecore_x_disp, win, CWWinGravity, &att);
 }
 
 EAPI void
-ecore_x_window_pixel_gravity_set(Ecore_X_Window win, Ecore_X_Gravity grav)
+ecore_x_window_pixel_gravity_set(Ecore_X_Window win,
+                                 Ecore_X_Gravity grav)
 {
    XSetWindowAttributes att;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    att.bit_gravity = grav;
    XChangeWindowAttributes(_ecore_x_disp, win, CWBitGravity, &att);
 }
 
 EAPI void
-ecore_x_window_pixmap_set(Ecore_X_Window win, Ecore_X_Pixmap pmap)
+ecore_x_window_pixmap_set(Ecore_X_Window win,
+                          Ecore_X_Pixmap pmap)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XSetWindowBackgroundPixmap(_ecore_x_disp, win, pmap);
 }
 
 EAPI void
-ecore_x_window_area_clear(Ecore_X_Window win, int x, int y, int w, int h)
+ecore_x_window_area_clear(Ecore_X_Window win,
+                          int x,
+                          int y,
+                          int w,
+                          int h)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XClearArea(_ecore_x_disp, win, x, y, w, h, False);
 }
 
 EAPI void
-ecore_x_window_area_expose(Ecore_X_Window win, int x, int y, int w, int h)
+ecore_x_window_area_expose(Ecore_X_Window win,
+                           int x,
+                           int y,
+                           int w,
+                           int h)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XClearArea(_ecore_x_disp, win, x, y, w, h, True);
 }
 
 EAPI void
-ecore_x_window_override_set(Ecore_X_Window win, int override)
+ecore_x_window_override_set(Ecore_X_Window win,
+                            Eina_Bool override)
 {
    XSetWindowAttributes att;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    att.override_redirect = override;
    XChangeWindowAttributes(_ecore_x_disp, win, CWOverrideRedirect, &att);
 }
 
-#ifdef ECORE_XRENDER   
+#ifdef ECORE_XRENDER
 static Ecore_X_Window
-_ecore_x_window_argb_internal_new(Ecore_X_Window parent, int x, int y, int w, int h, int override, int saveunder)
+_ecore_x_window_argb_internal_new(Ecore_X_Window parent,
+                                  int x,
+                                  int y,
+                                  int w,
+                                  int h,
+                                  Eina_Bool override,
+                                  Eina_Bool saveunder)
 {
-   Window                win;
-   XSetWindowAttributes  attr;
-   XWindowAttributes     att;
-   XVisualInfo          *xvi;
-   XVisualInfo           vi_in;
-   int                   nvi, i, scr = 0;
-   XRenderPictFormat    *fmt;
-   Visual               *vis;
-   
+   Window win;
+   XSetWindowAttributes attr;
+   XWindowAttributes att;
+   XVisualInfo *xvi;
+   XVisualInfo vi_in;
+   int nvi, i, scr = 0;
+   XRenderPictFormat *fmt;
+   Visual *vis;
+
    if (parent == 0)
      {
-       parent = DefaultRootWindow(_ecore_x_disp);
-       scr = DefaultScreen(_ecore_x_disp);
+        parent = DefaultRootWindow(_ecore_x_disp);
+        scr = DefaultScreen(_ecore_x_disp);
      }
    else
      {
-       /* ewww - round trip */
-       XGetWindowAttributes(_ecore_x_disp, parent, &att);
-       for (i = 0; i < ScreenCount(_ecore_x_disp); i++)
-         {
-            if (att.screen == ScreenOfDisplay(_ecore_x_disp, i))
-              {
-                 scr = i;
-                 break;
-              }
-         }
+        /* ewww - round trip */
+        XGetWindowAttributes(_ecore_x_disp, parent, &att);
+        for (i = 0; i < ScreenCount(_ecore_x_disp); i++)
+          {
+             if (att.screen == ScreenOfDisplay(_ecore_x_disp, i))
+               {
+                  scr = i;
+                  break;
+               }
+          }
      }
+
    vi_in.screen = scr;
    vi_in.depth = 32;
    vi_in.class = TrueColor;
    xvi = XGetVisualInfo(_ecore_x_disp,
-                       VisualScreenMask |
-                       VisualDepthMask |
-                       VisualClassMask,
-                       &vi_in,
-                       &nvi);
-   if (xvi == NULL) return 0;
+                        VisualScreenMask |
+                        VisualDepthMask |
+                        VisualClassMask,
+                        &vi_in,
+                        &nvi);
+   if (!xvi)
+     return 0;
+
    vis = NULL;
    for (i = 0; i < nvi; i++)
      {
-       fmt = XRenderFindVisualFormat(_ecore_x_disp, xvi[i].visual);
-       if ((fmt->type == PictTypeDirect) && (fmt->direct.alphaMask))
-         {
-            vis = xvi[i].visual;
-            break;
-         }
+        fmt = XRenderFindVisualFormat(_ecore_x_disp, xvi[i].visual);
+        if ((fmt->type == PictTypeDirect) && (fmt->direct.alphaMask))
+          {
+             vis = xvi[i].visual;
+             break;
+          }
      }
    XFree (xvi);
-   
-   attr.backing_store         = NotUseful;
-   attr.override_redirect     = override;
-   attr.colormap              = XCreateColormap(_ecore_x_disp, parent,
-                                               vis, AllocNone);
-   attr.border_pixel          = 0;
-   attr.background_pixmap     = None;
-   attr.bit_gravity           = NorthWestGravity;
-   attr.win_gravity           = NorthWestGravity;
-   attr.save_under            = saveunder;
+
+   attr.backing_store = NotUseful;
+   attr.override_redirect = override;
+   attr.colormap = XCreateColormap(_ecore_x_disp, parent,
+                                   vis, AllocNone);
+   attr.border_pixel = 0;
+   attr.background_pixmap = None;
+   attr.bit_gravity = NorthWestGravity;
+   attr.win_gravity = NorthWestGravity;
+   attr.save_under = saveunder;
    attr.do_not_propagate_mask = NoEventMask;
-   attr.event_mask            = KeyPressMask |
-                                KeyReleaseMask |
-                                ButtonPressMask |
-                                ButtonReleaseMask |
-                                EnterWindowMask |
-                                LeaveWindowMask |
-                                PointerMotionMask |
-                                ExposureMask |
-                                VisibilityChangeMask |
-                                StructureNotifyMask |
-                                FocusChangeMask |
-                                PropertyChangeMask |
-                                ColormapChangeMask;
+   attr.event_mask = KeyPressMask |
+     KeyReleaseMask |
+     ButtonPressMask |
+     ButtonReleaseMask |
+     EnterWindowMask |
+     LeaveWindowMask |
+     PointerMotionMask |
+     ExposureMask |
+     VisibilityChangeMask |
+     StructureNotifyMask |
+     FocusChangeMask |
+     PropertyChangeMask |
+     ColormapChangeMask;
    win = XCreateWindow(_ecore_x_disp, parent,
-                      x, y, w, h, 0,
-                      32, 
-                      InputOutput, 
-                      vis,
-                      CWBackingStore |
-                      CWOverrideRedirect | 
-                      CWColormap |
-                      CWBorderPixel |
-                      CWBackPixmap | 
-                      CWSaveUnder | 
-                      CWDontPropagate | 
-                      CWEventMask |
-                      CWBitGravity |
-                      CWWinGravity,
-                      &attr);
+                       x, y, w, h, 0,
+                       32,
+                       InputOutput,
+                       vis,
+                       CWBackingStore |
+                       CWOverrideRedirect |
+                       CWColormap |
+                       CWBorderPixel |
+                       CWBackPixmap |
+                       CWSaveUnder |
+                       CWDontPropagate |
+                       CWEventMask |
+                       CWBitGravity |
+                       CWWinGravity,
+                       &attr);
    XFreeColormap(_ecore_x_disp, attr.colormap);
 
-   if (parent == DefaultRootWindow(_ecore_x_disp)) ecore_x_window_defaults_set(win);
+   if (parent == DefaultRootWindow(_ecore_x_disp))
+     ecore_x_window_defaults_set(win);
+
    return win;
 }
-#endif
+
+#endif /* ifdef ECORE_XRENDER */
 
 EAPI int
 ecore_x_window_argb_get(Ecore_X_Window win)
 {
-#ifdef ECORE_XRENDER   
+#ifdef ECORE_XRENDER
    XWindowAttributes att;
    XRenderPictFormat *fmt;
-   
-   XGetWindowAttributes(_ecore_x_disp, win, &att);
+
+   att.visual = 0;
+   if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
+     return 0;
+
    fmt = XRenderFindVisualFormat(_ecore_x_disp, att.visual);
-   if (!fmt) return 0;
-   if ((fmt->type == PictTypeDirect) && (fmt->direct.alphaMask)) return 1;
+   if (!fmt)
+     return 0;
+
+   if ((fmt->type == PictTypeDirect) && (fmt->direct.alphaMask))
+     return 1;
+
    return 0;
-#else
+#else /* ifdef ECORE_XRENDER */
    return 0;
-#endif   
+#endif /* ifdef ECORE_XRENDER */
 }
 
 /**
@@ -1358,13 +1659,18 @@ ecore_x_window_argb_get(Ecore_X_Window win)
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_manager_argb_new(Ecore_X_Window parent, int x, int y, int w, int h)
+ecore_x_window_manager_argb_new(Ecore_X_Window parent,
+                                int x,
+                                int y,
+                                int w,
+                                int h)
 {
-#ifdef ECORE_XRENDER   
+#ifdef ECORE_XRENDER
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _ecore_x_window_argb_internal_new(parent, x, y, w, h, 1, 0);
-#else
+#else /* ifdef ECORE_XRENDER */
    return 0;
-#endif   
+#endif /* ifdef ECORE_XRENDER */
 }
 
 /**
@@ -1379,13 +1685,18 @@ ecore_x_window_manager_argb_new(Ecore_X_Window parent, int x, int y, int w, int
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_argb_new(Ecore_X_Window parent, int x, int y, int w, int h)
+ecore_x_window_argb_new(Ecore_X_Window parent,
+                        int x,
+                        int y,
+                        int w,
+                        int h)
 {
-#ifdef ECORE_XRENDER   
+#ifdef ECORE_XRENDER
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _ecore_x_window_argb_internal_new(parent, x, y, w, h, 0, 0);
-#else
+#else /* ifdef ECORE_XRENDER */
    return 0;
-#endif   
+#endif /* ifdef ECORE_XRENDER */
 }
 
 /**
@@ -1400,11 +1711,17 @@ ecore_x_window_argb_new(Ecore_X_Window parent, int x, int y, int w, int h)
  * @ingroup Ecore_X_Window_Create_Group
  */
 EAPI Ecore_X_Window
-ecore_x_window_override_argb_new(Ecore_X_Window parent, int x, int y, int w, int h)
+ecore_x_window_override_argb_new(Ecore_X_Window parent,
+                                 int x,
+                                 int y,
+                                 int w,
+                                 int h)
 {
-#ifdef ECORE_XRENDER   
+#ifdef ECORE_XRENDER
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return _ecore_x_window_argb_internal_new(parent, x, y, w, h, 1, 0);
-#else
+#else /* ifdef ECORE_XRENDER */
    return 0;
-#endif   
+#endif /* ifdef ECORE_XRENDER */
 }
+
index 6081680..a582453 100644 (file)
@@ -1,6 +1,10 @@
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <string.h>
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
 #include <inttypes.h>
 #include <limits.h>
 
-#define _ATOM_SET_CARD32(win, atom, p_val, cnt) \
-   XChangeProperty(_ecore_x_disp, win, atom, XA_CARDINAL, 32, PropModeReplace, \
-                   (unsigned char *)p_val, cnt)
+#define _ATOM_SET_CARD32(win, atom, p_val, cnt)                               \
+  XChangeProperty(_ecore_x_disp, win, atom, XA_CARDINAL, 32, PropModeReplace, \
+                  (unsigned char *)p_val, cnt)
 
 /*
  * Set CARD32 (array) property
  */
 EAPI void
-ecore_x_window_prop_card32_set(Ecore_X_Window win, Ecore_X_Atom atom,
-                              unsigned int *val, unsigned int num)
+ecore_x_window_prop_card32_set(Ecore_X_Window win,
+                               Ecore_X_Atom atom,
+                               unsigned int *val,
+                               unsigned int num)
 {
 #if SIZEOF_INT == SIZEOF_LONG
    _ATOM_SET_CARD32(win, atom, val, num);
-#else
-   long               *v2;
-   unsigned int        i;
+#else /* if SIZEOF_INT == SIZEOF_LONG */
+   long *v2;
+   unsigned int i;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    v2 = malloc(num * sizeof(long));
    if (!v2)
-      return;
+     return;
+
    for (i = 0; i < num; i++)
-      v2[i] = val[i];
+     v2[i] = val[i];
    _ATOM_SET_CARD32(win, atom, v2, num);
    free(v2);
-#endif
+#endif /* if SIZEOF_INT == SIZEOF_LONG */
 }
 
 /*
@@ -44,36 +52,41 @@ ecore_x_window_prop_card32_set(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_card32_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                              unsigned int *val, unsigned int len)
+ecore_x_window_prop_card32_get(Ecore_X_Window win,
+                               Ecore_X_Atom atom,
+                               unsigned int *val,
+                               unsigned int len)
 {
-   unsigned char      *prop_ret;
-   Atom                type_ret;
-   unsigned long       bytes_after, num_ret;
-   int                 format_ret;
-   unsigned int        i;
-   int                 num;
-
+   unsigned char *prop_ret;
+   Atom type_ret;
+   unsigned long bytes_after, num_ret;
+   int format_ret;
+   unsigned int i;
+   int num;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    prop_ret = NULL;
-   XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
-                     XA_CARDINAL, &type_ret, &format_ret, &num_ret,
-                     &bytes_after, &prop_ret);
-   if (prop_ret && type_ret == XA_CARDINAL && format_ret == 32)
-     {
-       if (num_ret < len)
-          len = num_ret;
-
-       for (i = 0; i < len; i++)
-          val[i] = ((unsigned long*)prop_ret)[i];
-       
-       num = len;
-     }
+   if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
+                          XA_CARDINAL, &type_ret, &format_ret, &num_ret,
+                          &bytes_after, &prop_ret) != Success)
+     return -1;
+
+   if (type_ret != XA_CARDINAL || format_ret != 32)
+     num = -1;
+   else if (num_ret == 0 || !prop_ret)
+     num = 0;
    else
      {
-       num = -1;
+        if (num_ret < len)
+          len = num_ret;
+
+        for (i = 0; i < len; i++)
+          val[i] = ((unsigned long *)prop_ret)[i];
+        num = len;
      }
+
    if (prop_ret)
-      XFree(prop_ret);
+     XFree(prop_ret);
 
    return num;
 }
@@ -86,42 +99,45 @@ ecore_x_window_prop_card32_get(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_card32_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                                   unsigned int **plst)
+ecore_x_window_prop_card32_list_get(Ecore_X_Window win,
+                                    Ecore_X_Atom atom,
+                                    unsigned int **plst)
 {
-   unsigned char      *prop_ret;
-   Atom                type_ret;
-   unsigned long       bytes_after, num_ret;
-   int                 format_ret;
-   unsigned int        i, *val;
-   int                 num;
-
+   unsigned char *prop_ret;
+   Atom type_ret;
+   unsigned long bytes_after, num_ret;
+   int format_ret;
+   unsigned int i, *val;
+   int num;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   *plst = NULL;
    prop_ret = NULL;
    if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
-                         XA_CARDINAL, &type_ret, &format_ret, &num_ret,
-                         &bytes_after, &prop_ret) != Success)
-      return -1;
-
-   if (type_ret == None || num_ret == 0)
-     {
-       num = 0;
-       *plst = NULL;
-     }
-   else if (prop_ret && type_ret == XA_CARDINAL && format_ret == 32)
-     {
-       val = malloc(num_ret * sizeof(unsigned int));
-       for (i = 0; i < num_ret; i++)
-          val[i] = ((unsigned long *)prop_ret)[i];
-       num = num_ret;
-       *plst = val;
-     }
+                          XA_CARDINAL, &type_ret, &format_ret, &num_ret,
+                          &bytes_after, &prop_ret) != Success)
+     return -1;
+
+   if ((type_ret != XA_CARDINAL) || (format_ret != 32))
+     num = -1;
+   else if ((num_ret == 0) || (!prop_ret))
+     num = 0;
    else
      {
-       num = -1;
-       *plst = NULL;
+        val = malloc(num_ret * sizeof(unsigned int));
+        if (!val)
+          {
+             if (prop_ret) XFree(prop_ret);
+             return -1;
+          }
+        for (i = 0; i < num_ret; i++)
+          val[i] = ((unsigned long *)prop_ret)[i];
+        num = num_ret;
+        *plst = val;
      }
+
    if (prop_ret)
-      XFree(prop_ret);
+     XFree(prop_ret);
 
    return num;
 }
@@ -130,26 +146,30 @@ ecore_x_window_prop_card32_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
  * Set X ID (array) property
  */
 EAPI void
-ecore_x_window_prop_xid_set(Ecore_X_Window win, Ecore_X_Atom atom,
-                           Ecore_X_Atom type, Ecore_X_ID * lst,
-                           unsigned int num)
+ecore_x_window_prop_xid_set(Ecore_X_Window win,
+                            Ecore_X_Atom atom,
+                            Ecore_X_Atom type,
+                            Ecore_X_ID *lst,
+                            unsigned int num)
 {
 #if SIZEOF_INT == SIZEOF_LONG
    XChangeProperty(_ecore_x_disp, win, atom, type, 32, PropModeReplace,
-                  (unsigned char *)lst, num);
-#else
-   unsigned long      *pl;
-   unsigned int        i;
+                   (unsigned char *)lst, num);
+#else /* if SIZEOF_INT == SIZEOF_LONG */
+   unsigned long *pl;
+   unsigned int i;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    pl = malloc(num * sizeof(long));
    if (!pl)
-      return;
+     return;
+
    for (i = 0; i < num; i++)
-      pl[i] = lst[i];
+     pl[i] = lst[i];
    XChangeProperty(_ecore_x_disp, win, atom, type, 32, PropModeReplace,
-                  (unsigned char *)pl, num);
+                   (unsigned char *)pl, num);
    free(pl);
-#endif
+#endif /* if SIZEOF_INT == SIZEOF_LONG */
 }
 
 /*
@@ -161,41 +181,42 @@ ecore_x_window_prop_xid_set(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_xid_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                           Ecore_X_Atom type, Ecore_X_ID * lst,
-                           unsigned int len)
+ecore_x_window_prop_xid_get(Ecore_X_Window win,
+                            Ecore_X_Atom atom,
+                            Ecore_X_Atom type,
+                            Ecore_X_ID *lst,
+                            unsigned int len)
 {
-   unsigned char      *prop_ret;
-   Atom                type_ret;
-   unsigned long       bytes_after, num_ret;
-   int                 format_ret;
-   int                 num;
-   unsigned            i;
-
+   unsigned char *prop_ret;
+   Atom type_ret;
+   unsigned long bytes_after, num_ret;
+   int format_ret;
+   int num;
+   unsigned i;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    prop_ret = NULL;
    if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
-                         type, &type_ret, &format_ret, &num_ret,
-                         &bytes_after, &prop_ret) != Success)
-      return -1;
-
-   if (type_ret == None)
-     {
-       num = 0;
-     }
-   else if (prop_ret && type_ret == type && format_ret == 32)
-     {
-       if (num_ret < len)
-          len = num_ret;
-       for (i = 0; i < len; i++)
-          lst[i] = ((unsigned long *)prop_ret)[i];
-       num = len;
-     }
+                          type, &type_ret, &format_ret, &num_ret,
+                          &bytes_after, &prop_ret) != Success)
+     return -1;
+
+   if (type_ret != type || format_ret != 32)
+     num = -1;
+   else if (num_ret == 0 || !prop_ret)
+     num = 0;
    else
      {
-       num = -1;
+        if (num_ret < len)
+          len = num_ret;
+
+        for (i = 0; i < len; i++)
+          lst[i] = ((unsigned long *)prop_ret)[i];
+        num = len;
      }
+
    if (prop_ret)
-      XFree(prop_ret);
+     XFree(prop_ret);
 
    return num;
 }
@@ -209,42 +230,42 @@ ecore_x_window_prop_xid_get(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_xid_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                                Ecore_X_Atom type, Ecore_X_ID ** val)
+ecore_x_window_prop_xid_list_get(Ecore_X_Window win,
+                                 Ecore_X_Atom atom,
+                                 Ecore_X_Atom type,
+                                 Ecore_X_ID **val)
 {
-   unsigned char      *prop_ret;
-   Atom                type_ret;
-   unsigned long       bytes_after, num_ret;
-   int                 format_ret;
-   Ecore_X_Atom       *alst;
-   int                 num;
-   unsigned            i;
-
+   unsigned char *prop_ret;
+   Atom type_ret;
+   unsigned long bytes_after, num_ret;
+   int format_ret;
+   Ecore_X_Atom *alst;
+   int num;
+   unsigned i;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    *val = NULL;
    prop_ret = NULL;
    if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
-                         type, &type_ret, &format_ret, &num_ret,
-                         &bytes_after, &prop_ret) != Success)
-      return -1;
-
-   if (type_ret == None || num_ret == 0)
-     {
-       num = 0;
-     }
-   else if (prop_ret && type_ret == type && format_ret == 32)
-     {
-       alst = malloc(num_ret * sizeof(Ecore_X_ID));
-       for (i = 0; i < num_ret; i++)
-          alst[i] = ((unsigned long *)prop_ret)[i];
-       *val = alst;
-       num = num_ret;
-     }
+                          type, &type_ret, &format_ret, &num_ret,
+                          &bytes_after, &prop_ret) != Success)
+     return -1;
+
+   if (type_ret != type || format_ret != 32)
+     num = -1;
+   else if (num_ret == 0 || !prop_ret)
+     num = 0;
    else
      {
-       num = -1;
+        alst = malloc(num_ret * sizeof(Ecore_X_ID));
+        for (i = 0; i < num_ret; i++)
+          alst[i] = ((unsigned long *)prop_ret)[i];
+        num = num_ret;
+        *val = alst;
      }
+
    if (prop_ret)
-      XFree(prop_ret);
+     XFree(prop_ret);
 
    return num;
 }
@@ -253,58 +274,67 @@ ecore_x_window_prop_xid_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
  * Remove/add/toggle X ID list item.
  */
 EAPI void
-ecore_x_window_prop_xid_list_change(Ecore_X_Window win, Ecore_X_Atom atom,
-                                   Ecore_X_Atom type, Ecore_X_ID item, int op)
+ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
+                                    Ecore_X_Atom atom,
+                                    Ecore_X_Atom type,
+                                    Ecore_X_ID item,
+                                    int op)
 {
-   Ecore_X_ID         *lst;
-   int                 i, num;
+   Ecore_X_ID *lst;
+   int i, num;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    num = ecore_x_window_prop_xid_list_get(win, atom, type, &lst);
    if (num < 0)
-      return;                  /* Error - assuming invalid window */
+     {
+        return; /* Error - assuming invalid window */
+     }
 
    /* Is it there? */
    for (i = 0; i < num; i++)
      {
-       if (lst[i] == item)
-          break;
+        if (lst[i] == item)
+          break;
      }
 
    if (i < num)
      {
-       /* Was in list */
-       if (op == ECORE_X_PROP_LIST_ADD)
-          goto done;
-       /* Remove it */
-       num--;
-       for (; i < num; i++)
-          lst[i] = lst[i + 1];
+        /* Was in list */
+        if (op == ECORE_X_PROP_LIST_ADD)
+          goto done;  /* Remove it */
+
+        num--;
+        for (; i < num; i++)
+          lst[i] = lst[i + 1];
      }
    else
      {
-       /* Was not in list */
-       if (op == ECORE_X_PROP_LIST_REMOVE)
-          goto done;
-       /* Add it */
-       num++;
-       lst = realloc(lst, num * sizeof(Ecore_X_ID));
-       lst[i] = item;
+        /* Was not in list */
+        if (op == ECORE_X_PROP_LIST_REMOVE)
+          goto done;  /* Add it */
+
+        num++;
+        lst = realloc(lst, num * sizeof(Ecore_X_ID));
+        lst[i] = item;
      }
 
    ecore_x_window_prop_xid_set(win, atom, type, lst, num);
 
- done:
+done:
    if (lst)
-      free(lst);
+     free(lst);
 }
 
 /*
  * Set Atom (array) property
  */
 EAPI void
-ecore_x_window_prop_atom_set(Ecore_X_Window win, Ecore_X_Atom atom,
-                            Ecore_X_Atom * lst, unsigned int num)
+ecore_x_window_prop_atom_set(Ecore_X_Window win,
+                             Ecore_X_Atom atom,
+                             Ecore_X_Atom *lst,
+                             unsigned int num)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_xid_set(win, atom, XA_ATOM, lst, num);
 }
 
@@ -317,9 +347,12 @@ ecore_x_window_prop_atom_set(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_atom_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                            Ecore_X_Atom * lst, unsigned int len)
+ecore_x_window_prop_atom_get(Ecore_X_Window win,
+                             Ecore_X_Atom atom,
+                             Ecore_X_Atom *lst,
+                             unsigned int len)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ecore_x_window_prop_xid_get(win, atom, XA_ATOM, lst, len);
 }
 
@@ -332,9 +365,11 @@ ecore_x_window_prop_atom_get(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_atom_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                                 Ecore_X_Atom ** plst)
+ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
+                                  Ecore_X_Atom atom,
+                                  Ecore_X_Atom **plst)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ecore_x_window_prop_xid_list_get(win, atom, XA_ATOM, plst);
 }
 
@@ -342,9 +377,12 @@ ecore_x_window_prop_atom_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
  * Remove/add/toggle atom list item.
  */
 EAPI void
-ecore_x_window_prop_atom_list_change(Ecore_X_Window win, Ecore_X_Atom atom,
-                                    Ecore_X_Atom item, int op)
+ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
+                                     Ecore_X_Atom atom,
+                                     Ecore_X_Atom item,
+                                     int op)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_xid_list_change(win, atom, XA_ATOM, item, op);
 }
 
@@ -352,9 +390,12 @@ ecore_x_window_prop_atom_list_change(Ecore_X_Window win, Ecore_X_Atom atom,
  * Set Window (array) property
  */
 EAPI void
-ecore_x_window_prop_window_set(Ecore_X_Window win, Ecore_X_Atom atom,
-                              Ecore_X_Window * lst, unsigned int num)
+ecore_x_window_prop_window_set(Ecore_X_Window win,
+                               Ecore_X_Atom atom,
+                               Ecore_X_Window *lst,
+                               unsigned int num)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    ecore_x_window_prop_xid_set(win, atom, XA_WINDOW, lst, num);
 }
 
@@ -367,9 +408,12 @@ ecore_x_window_prop_window_set(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_window_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                              Ecore_X_Window * lst, unsigned int len)
+ecore_x_window_prop_window_get(Ecore_X_Window win,
+                               Ecore_X_Atom atom,
+                               Ecore_X_Window *lst,
+                               unsigned int len)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ecore_x_window_prop_xid_get(win, atom, XA_WINDOW, lst, len);
 }
 
@@ -382,17 +426,14 @@ ecore_x_window_prop_window_get(Ecore_X_Window win, Ecore_X_Atom atom,
  * Note: Return value 0 means that the property exists but has no elements.
  */
 EAPI int
-ecore_x_window_prop_window_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
-                                   Ecore_X_Window ** plst)
+ecore_x_window_prop_window_list_get(Ecore_X_Window win,
+                                    Ecore_X_Atom atom,
+                                    Ecore_X_Window **plst)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    return ecore_x_window_prop_xid_list_get(win, atom, XA_WINDOW, plst);
 }
 
-/**
- * To be documented.
- *
- * FIXME: To be fixed.
- */
 EAPI Ecore_X_Atom
 ecore_x_window_prop_any_type(void)
 {
@@ -400,40 +441,71 @@ ecore_x_window_prop_any_type(void)
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Set a property of Ecore_X_Window.
+ * @param win The window for which the property will be set.
+ * @param property The property of the window to be set.
+ * @param type The type of the property that will be set.
+ * @param size The size of the property that will be set.
+ * @param data The data of the property that will be set.
+ * @param number The size of data.
  */
 EAPI void
-ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom property, Ecore_X_Atom type, int size, void *data, int number)
+ecore_x_window_prop_property_set(Ecore_X_Window win,
+                                 Ecore_X_Atom property,
+                                 Ecore_X_Atom type,
+                                 int size,
+                                 void *data,
+                                 int number)
 {
-   if (win == 0) win = DefaultRootWindow(_ecore_x_disp);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);
+
    if (size != 32)
-     XChangeProperty(_ecore_x_disp, win, property, type, size, PropModeReplace,
-                    (unsigned char *)data, number);
+     XChangeProperty(_ecore_x_disp,
+                     win,
+                     property,
+                     type,
+                     size,
+                     PropModeReplace,
+                     (unsigned char *)data,
+                     number);
    else
      {
-       unsigned long *dat;
-       int            i, *ptr;
-       
-       dat = malloc(sizeof(unsigned long) * number);
-       if (dat)
-         {
-            for (ptr = (int *)data, i = 0; i < number; i++) dat[i] = ptr[i];
-            XChangeProperty(_ecore_x_disp, win, property, type, size, 
-                            PropModeReplace, (unsigned char *)dat, number);
-            free(dat);
-         }
+        unsigned long *dat;
+        int i, *ptr;
+
+        dat = malloc(sizeof(unsigned long) * number);
+        if (dat)
+          {
+             for (ptr = (int *)data, i = 0; i < number; i++)
+               dat[i] = ptr[i];
+             XChangeProperty(_ecore_x_disp, win, property, type, size,
+                             PropModeReplace, (unsigned char *)dat, number);
+             free(dat);
+          }
      }
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Get a property of Ecore_X_Window.
+ * @note If there aren't any data to be got the function return NULL.
+ *       If the function can't allocate the memory then 0 is returned.
+ * @param win The window for which the property will be got.
+ * @param property The property of the window that will be gotten.
+ * @param type The type of the property that will be gotten.
+ * @param size This parameter isn't in use.
+ * @param data The data of the property that will be gotten.
+ * @param num The size of property.
+ * @return size_ret The size of array that contains the property.
  */
 EAPI int
-ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecore_X_Atom type, int size __UNUSED__, unsigned char **data, int *num)
+ecore_x_window_prop_property_get(Ecore_X_Window win,
+                                 Ecore_X_Atom property,
+                                 Ecore_X_Atom type,
+                                 int size __UNUSED__,
+                                 unsigned char **data,
+                                 int *num)
 {
    Atom type_ret = 0;
    int ret, size_ret = 0;
@@ -441,77 +513,95 @@ ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecor
    unsigned char *prop_ret = NULL;
 
    /* make sure these are initialized */
-   if (num) *num = 0;
+   if (num)
+     *num = 0;
 
    if (data)
      *data = NULL;
    else /* we can't store the retrieved data, so just return */
      return 0;
 
-   if (!win) win = DefaultRootWindow(_ecore_x_disp);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!win)
+     win = DefaultRootWindow(_ecore_x_disp);
 
    ret = XGetWindowProperty(_ecore_x_disp, win, property, 0, LONG_MAX,
                             False, type, &type_ret, &size_ret,
                             &num_ret, &bytes, &prop_ret);
 
    if (ret != Success)
-       return 0;
-
-   if (!num_ret) {
-      XFree(prop_ret);
-      return 0;
-   }
-   
-   if (!(*data = malloc(num_ret * size_ret / 8))) {
-      XFree(prop_ret);
-      return 0;
-   }
-   
+     return 0;
+
+   if (!num_ret)
+     {
+        XFree(prop_ret);
+        return 0;
+     }
+
+   if (!(*data = malloc(num_ret * size_ret / 8)))
+     {
+        XFree(prop_ret);
+        return 0;
+     }
+
    switch (size_ret) {
       case 8:
-        for (i = 0; i < num_ret; i++)
-          (*data)[i] = prop_ret[i];
-        break;
+        for (i = 0; i < num_ret; i++)
+          (*data)[i] = prop_ret[i];
+        break;
+
       case 16:
-        for (i = 0; i < num_ret; i++)
-          ((unsigned short *) *data)[i] = ((unsigned short *) prop_ret)[i];
-        break;
+        for (i = 0; i < num_ret; i++)
+          ((unsigned short *)*data)[i] = ((unsigned short *)prop_ret)[i];
+        break;
+
       case 32:
-        for (i = 0; i < num_ret; i++)
-          ((unsigned int *) *data)[i] = ((unsigned long *) prop_ret)[i];
-        break;
-   }
+        for (i = 0; i < num_ret; i++)
+          ((unsigned int *)*data)[i] = ((unsigned long *)prop_ret)[i];
+        break;
+     }
 
    XFree(prop_ret);
 
-   if (num) *num = num_ret;
+   if (num)
+     *num = num_ret;
+
    return size_ret;
 }
 
 EAPI void
-ecore_x_window_prop_property_del(Ecore_X_Window win, Ecore_X_Atom property)
+ecore_x_window_prop_property_del(Ecore_X_Window win,
+                                 Ecore_X_Atom property)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XDeleteProperty(_ecore_x_disp, win, property);
 }
 
 EAPI Ecore_X_Atom *
-ecore_x_window_prop_list(Ecore_X_Window win, int *num_ret)
+ecore_x_window_prop_list(Ecore_X_Window win,
+                         int *num_ret)
 {
    Ecore_X_Atom *atoms;
    Atom *atom_ret;
    int num = 0, i;
-       
-   if (num_ret) *num_ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (num_ret)
+     *num_ret = 0;
 
    atom_ret = XListProperties(_ecore_x_disp, win, &num);
-   if (!atom_ret) return NULL;
+   if (!atom_ret)
+     return NULL;
 
    atoms = malloc(num * sizeof(Ecore_X_Atom));
    if (atoms)
      {
-       for (i = 0; i < num; i++) atoms[i] = atom_ret[i];
-       if (num_ret) *num_ret = num;
+        for (i = 0; i < num; i++)
+          atoms[i] = atom_ret[i];
+        if (num_ret)
+          *num_ret = num;
      }
+
    XFree(atom_ret);
    return atoms;
 }
@@ -521,15 +611,20 @@ ecore_x_window_prop_list(Ecore_X_Window win, int *num_ret)
  * @param win The window
  * @param type The property
  * @param str The string
- * 
+ *
  * Set a window string property
  */
 EAPI void
-ecore_x_window_prop_string_set(Ecore_X_Window win, Ecore_X_Atom type, const char *str)
+ecore_x_window_prop_string_set(Ecore_X_Window win,
+                               Ecore_X_Atom type,
+                               const char *str)
 {
-   XTextProperty       xtp;
+   XTextProperty xtp;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);
 
-   if (win == 0) win = DefaultRootWindow(_ecore_x_disp);
    xtp.value = (unsigned char *)str;
    xtp.format = 8;
    xtp.encoding = ECORE_X_ATOM_UTF8_STRING;
@@ -541,74 +636,76 @@ ecore_x_window_prop_string_set(Ecore_X_Window win, Ecore_X_Atom type, const char
  * Get a window string property.
  * @param win The window
  * @param type The property
- * 
- * Return window string property of a window. String must be free'd when done.
+ * @return Window string property of a window. String must be free'd when done.
  */
 EAPI char *
-ecore_x_window_prop_string_get(Ecore_X_Window win, Ecore_X_Atom type)
+ecore_x_window_prop_string_get(Ecore_X_Window win,
+                               Ecore_X_Atom type)
 {
-   XTextProperty       xtp;
-   char               *str = NULL;
+   XTextProperty xtp;
+   char *str = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (win == 0)
+     win = DefaultRootWindow(_ecore_x_disp);
 
-   if (win == 0) win = DefaultRootWindow(_ecore_x_disp);
    if (XGetTextProperty(_ecore_x_disp, win, &xtp, type))
      {
-       int      items;
-       char   **list = NULL;
-       Status   s;
-       
-       if (xtp.encoding == ECORE_X_ATOM_UTF8_STRING)
-         {
-            str = strdup((char *)xtp.value);
-         }
-       else
-         {
+        int items;
+        char **list = NULL;
+        Status s;
+
+        if (xtp.encoding == ECORE_X_ATOM_UTF8_STRING)
+          str = strdup((char *)xtp.value);
+        else
+          {
 #ifdef X_HAVE_UTF8_STRING
-            s = Xutf8TextPropertyToTextList(_ecore_x_disp, &xtp,
-                                            &list, &items);
-#else
-            s = XmbTextPropertyToTextList(_ecore_x_disp, &xtp,
-                                          &list, &items);
-#endif
-            if ((s == XLocaleNotSupported) ||
-                (s == XNoMemory) || (s == XConverterNotFound))
-              {
-                 str = strdup((char *)xtp.value);
-              }
-            else if ((s >= Success) && (items > 0))
-              {
-                 str = strdup(list[0]);
-              }
-            if (list)
-              XFreeStringList(list);
-         }
-       XFree(xtp.value);
+             s = Xutf8TextPropertyToTextList(_ecore_x_disp, &xtp,
+                                             &list, &items);
+#else /* ifdef X_HAVE_UTF8_STRING */
+             s = XmbTextPropertyToTextList(_ecore_x_disp, &xtp,
+                                           &list, &items);
+#endif /* ifdef X_HAVE_UTF8_STRING */
+             if ((s == XLocaleNotSupported) ||
+                 (s == XNoMemory) || (s == XConverterNotFound))
+               str = strdup((char *)xtp.value);
+             else if ((s >= Success) && (items > 0))
+               str = strdup(list[0]);
+
+             if (list)
+               XFreeStringList(list);
+          }
+
+        XFree(xtp.value);
      }
+
    return str;
 }
 
-EAPI int
+EAPI Eina_Bool
 ecore_x_window_prop_protocol_isset(Ecore_X_Window win,
                                    Ecore_X_WM_Protocol protocol)
 {
    Atom proto, *protos = NULL;
-   int i, ret = 0, protos_count = 0;
+   int i, protos_count = 0;
+   Eina_Bool ret = EINA_FALSE;
 
    /* check for invalid values */
    if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
-       return 0;
+     return EINA_FALSE;
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    proto = _ecore_x_atoms_wm_protocols[protocol];
 
    if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
-       return ret;
+     return ret;
 
    for (i = 0; i < protos_count; i++)
-       if (protos[i] == proto)
-         {
-            ret = 1;
-            break;
-         }
+     if (protos[i] == proto)
+       {
+          ret = EINA_TRUE;
+          break;
+       }
 
    XFree(protos);
 
@@ -616,39 +713,48 @@ ecore_x_window_prop_protocol_isset(Ecore_X_Window win,
 }
 
 /**
- * To be documented.
- *
- * FIXME: To be fixed.
+ * @brief Get a array containing the protocols of @a win
+ * @note If there aren't any properties to be counted or any protocols to get
+ *       then the function returns NULL.
+ * @param win The window for which protocol list will be got.
+ * @param num_ret Contains the number of elements of the array to be returned.
+ * @return The array that contains the protocols.
  */
 EAPI Ecore_X_WM_Protocol *
-ecore_x_window_prop_protocol_list_get(Ecore_X_Window win, int *num_ret)
+ecore_x_window_prop_protocol_list_get(Ecore_X_Window win,
+                                      int *num_ret)
 {
    Atom *protos = NULL;
    int i, protos_count = 0;
    Ecore_X_WM_Protocol *prot_ret = NULL;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
      return NULL;
 
-   if ((!protos) || (protos_count <= 0)) return NULL;
+   if ((!protos) || (protos_count <= 0))
+     return NULL;
+
    prot_ret = calloc(1, protos_count * sizeof(Ecore_X_WM_Protocol));
    if (!prot_ret)
      {
-       XFree(protos);
-       return NULL;
+        XFree(protos);
+        return NULL;
      }
+
    for (i = 0; i < protos_count; i++)
      {
-       Ecore_X_WM_Protocol j;
-       
-       prot_ret[i] = -1;
-       for (j = 0; j < ECORE_X_WM_PROTOCOL_NUM; j++)
-         {
-            if (_ecore_x_atoms_wm_protocols[j] == protos[i])
-              prot_ret[i] = j;
-         }
+        Ecore_X_WM_Protocol j;
+
+        prot_ret[i] = -1;
+        for (j = 0; j < ECORE_X_WM_PROTOCOL_NUM; j++)
+          {
+             if (_ecore_x_atoms_wm_protocols[j] == protos[i])
+               prot_ret[i] = j;
+          }
      }
    XFree(protos);
    *num_ret = protos_count;
    return prot_ret;
 }
+
index 2e30587..71718cf 100644 (file)
@@ -1,3 +1,9 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <stdlib.h>
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
  * @ingroup Ecore_X_Window_Shape
  */
 EAPI void
-ecore_x_window_shape_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask)
+ecore_x_window_shape_mask_set(Ecore_X_Window win,
+                              Ecore_X_Pixmap mask)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    XShapeCombineMask(_ecore_x_disp, win, ShapeBounding, 0, 0, mask, ShapeSet);
 }
 
+/**
+ * Sets the input shape of the given window to that given by the pixmap @p mask.
+ * @param   win  The given window.
+ * @param   mask A 1-bit depth pixmap that provides the new input shape of the
+ *               window.
+ * @ingroup Ecore_X_Window_Shape
+ */
+EAPI void
+ecore_x_window_shape_input_mask_set(Ecore_X_Window win,
+                                    Ecore_X_Pixmap mask)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+#ifdef ShapeInput
+   XShapeCombineMask(_ecore_x_disp, win, ShapeInput, 0, 0, mask, ShapeSet);
+#else /* ifdef ShapeInput */
+   return;
+   win = mask = 0;
+#endif /* ifdef ShapeInput */
+}
+
+EAPI void
+ecore_x_window_shape_window_set(Ecore_X_Window win,
+                                Ecore_X_Window shape_win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XShapeCombineShape(_ecore_x_disp,
+                      win,
+                      ShapeBounding,
+                      0,
+                      0,
+                      shape_win,
+                      ShapeBounding,
+                      ShapeSet);
+}
+
+EAPI void
+ecore_x_window_shape_input_window_set(Ecore_X_Window win,
+                                      Ecore_X_Window shape_win)
+{
+#ifdef ShapeInput
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XShapeCombineShape(_ecore_x_disp,
+                      win,
+                      ShapeInput,
+                      0,
+                      0,
+                      shape_win,
+                      ShapeInput,
+                      ShapeSet);
+#else
+   return;
+   win = shape_win = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_window_set_xy(Ecore_X_Window win,
+                                   Ecore_X_Window shape_win,
+                                   int x,
+                                   int y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XShapeCombineShape(_ecore_x_disp,
+                      win,
+                      ShapeBounding,
+                      x,
+                      y,
+                      shape_win,
+                      ShapeBounding,
+                      ShapeSet);
+}
+
 EAPI void
-ecore_x_window_shape_window_set(Ecore_X_Window win, Ecore_X_Window shape_win)
+ecore_x_window_shape_input_window_set_xy(Ecore_X_Window win,
+                                         Ecore_X_Window shape_win,
+                                         int x,
+                                         int y)
 {
-   XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, 0, 0, shape_win, ShapeBounding, ShapeSet);
+#ifdef ShapeInput
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XShapeCombineShape(_ecore_x_disp,
+                      win,
+                      ShapeInput,
+                      x,
+                      y,
+                      shape_win,
+                      ShapeInput,
+                      ShapeSet);
+#else
+   return;
+   win = shape_win = x = y = 0;
+#endif
 }
 
 EAPI void
-ecore_x_window_shape_window_set_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y)
+ecore_x_window_shape_rectangle_set(Ecore_X_Window win,
+                                   int x,
+                                   int y,
+                                   int w,
+                                   int h)
 {
-   XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, x, y, shape_win, ShapeBounding, ShapeSet);
+   XRectangle rect;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeBounding,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeSet,
+                           Unsorted);
 }
 
 EAPI void
-ecore_x_window_shape_rectangle_set(Ecore_X_Window win, int x, int y, int w, int h)
+ecore_x_window_shape_input_rectangle_set(Ecore_X_Window win,
+                                         int x,
+                                         int y,
+                                         int w,
+                                         int h)
 {
+#ifdef ShapeInput
    XRectangle rect;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    rect.x = x;
    rect.y = y;
    rect.width = w;
    rect.height = h;
-   XShapeCombineRectangles(_ecore_x_disp, win, ShapeBounding, 0, 0, &rect, 1, ShapeSet, Unsorted);
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeInput,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeSet,
+                           Unsorted);
+#else
+   return;
+   win = x = y = w = h = 0;
+#endif
 }
 
 EAPI void
-ecore_x_window_shape_rectangles_set(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num)
+ecore_x_window_shape_rectangles_set(Ecore_X_Window win,
+                                    Ecore_X_Rectangle *rects,
+                                    int num)
 {
+#ifdef ShapeInput
    XRectangle *rect = NULL;
    int i;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!rects) return;
    if (num > 0)
      {
-       rect = malloc(sizeof(XRectangle) * num);
-       if (rect)
-         {
-            for (i = 0; i < num; i++)
-              {
-                 rect[i].x = rects[i].x;
-                 rect[i].y = rects[i].y;
-                 rect[i].width = rects[i].width;
-                 rect[i].height = rects[i].height;
-              }
-         }
-       else
-         num = 0;
+        rect = malloc(sizeof(XRectangle) * num);
+        if (!rect) return;
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
      }
-   XShapeCombineRectangles(_ecore_x_disp, win, ShapeBounding, 0, 0, rect, num, ShapeSet, Unsorted);
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeBounding,
+                           0,
+                           0,
+                           rect,
+                           num,
+                           ShapeSet,
+                           Unsorted);
    if (rect) free(rect);
+#else
+   return;
+   win = rects = num = 0;
+#endif
 }
 
 EAPI void
-ecore_x_window_shape_window_add(Ecore_X_Window win, Ecore_X_Window shape_win)
+ecore_x_window_shape_input_rectangles_set(Ecore_X_Window win,
+                                          Ecore_X_Rectangle *rects,
+                                          int num)
 {
-   XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, 0, 0, shape_win, ShapeBounding, ShapeUnion);
+#ifdef ShapeInput
+   XRectangle *rect = NULL;
+   int i;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (!rects) return;
+   if (num > 0)
+     {
+        rect = malloc(sizeof(XRectangle) * num);
+        if (!rect) return;
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
+     }
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeInput,
+                           0,
+                           0,
+                           rect,
+                           num,
+                           ShapeSet,
+                           Unsorted);
+   if (rect) free(rect);
+#else
+   return;
+   win = rects = num = 0;
+#endif
 }
 
 EAPI void
-ecore_x_window_shape_window_add_xy(Ecore_X_Window win, Ecore_X_Window shape_win, int x, int y)
+ecore_x_window_shape_rectangle_subtract(Ecore_X_Window win,
+                                        int x,
+                                        int y,
+                                        int w,
+                                        int h)
 {
-   XShapeCombineShape(_ecore_x_disp, win, ShapeBounding, x, y, shape_win, ShapeBounding, ShapeUnion);
+   XRectangle rect;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeBounding,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeSubtract,
+                           Unsorted);
 }
 
 EAPI void
-ecore_x_window_shape_rectangle_add(Ecore_X_Window win, int x, int y, int w, int h)
+ecore_x_window_shape_input_rectangle_subtract(Ecore_X_Window win,
+                                              int x,
+                                              int y,
+                                              int w,
+                                              int h)
 {
+#ifdef ShapeInput
    XRectangle rect;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    rect.x = x;
    rect.y = y;
    rect.width = w;
    rect.height = h;
-   XShapeCombineRectangles(_ecore_x_disp, win, ShapeBounding, 0, 0, &rect, 1, ShapeUnion, Unsorted);
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeInput,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeSubtract,
+                           Unsorted);
+#else
+   return;
+   win = x = y = w = h = 0;
+#endif
 }
 
 EAPI void
-ecore_x_window_shape_rectangle_clip(Ecore_X_Window win, int x, int y, int w, int h)
+ecore_x_window_shape_window_add(Ecore_X_Window win,
+                                Ecore_X_Window shape_win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XShapeCombineShape(_ecore_x_disp,
+                      win,
+                      ShapeBounding,
+                      0,
+                      0,
+                      shape_win,
+                      ShapeBounding,
+                      ShapeUnion);
+}
+
+EAPI void
+ecore_x_window_shape_window_add_xy(Ecore_X_Window win,
+                                   Ecore_X_Window shape_win,
+                                   int x,
+                                   int y)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XShapeCombineShape(_ecore_x_disp,
+                      win,
+                      ShapeBounding,
+                      x,
+                      y,
+                      shape_win,
+                      ShapeBounding,
+                      ShapeUnion);
+}
+
+EAPI void
+ecore_x_window_shape_input_window_add_xy(Ecore_X_Window win,
+                                         Ecore_X_Window shape_win,
+                                         int x,
+                                         int y)
+{
+#ifdef ShapeInput
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   XShapeCombineShape(_ecore_x_disp,
+                      win,
+                      ShapeInput,
+                      x,
+                      y,
+                      shape_win,
+                      ShapeInput,
+                      ShapeUnion);
+#else
+   return;
+   win = shape_win = x = y = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangle_add(Ecore_X_Window win,
+                                   int x,
+                                   int y,
+                                   int w,
+                                   int h)
 {
    XRectangle rect;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    rect.x = x;
    rect.y = y;
    rect.width = w;
    rect.height = h;
-   XShapeCombineRectangles(_ecore_x_disp, win, ShapeBounding, 0, 0, &rect, 1, ShapeIntersect, Unsorted);
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeBounding,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeUnion,
+                           Unsorted);
 }
 
 EAPI void
-ecore_x_window_shape_rectangles_add(Ecore_X_Window win, Ecore_X_Rectangle *rects, int num)
+ecore_x_window_shape_input_rectangle_add(Ecore_X_Window win,
+                                         int x,
+                                         int y,
+                                         int w,
+                                         int h)
+{
+#ifdef ShapeInput
+   XRectangle rect;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeInput,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeUnion,
+                           Unsorted);
+#else
+   return;
+   win = x = y = w = h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangle_clip(Ecore_X_Window win,
+                                    int x,
+                                    int y,
+                                    int w,
+                                    int h)
+{
+   XRectangle rect;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeBounding,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeIntersect,
+                           Unsorted);
+}
+
+EAPI void
+ecore_x_window_shape_input_rectangle_clip(Ecore_X_Window win,
+                                          int x,
+                                          int y,
+                                          int w,
+                                          int h)
+{
+#ifdef ShapeInput
+   XRectangle rect;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   rect.x = x;
+   rect.y = y;
+   rect.width = w;
+   rect.height = h;
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeInput,
+                           0,
+                           0,
+                           &rect,
+                           1,
+                           ShapeIntersect,
+                           Unsorted);
+#else
+   return;
+   win = x = y = w = h = 0;
+#endif
+}
+
+EAPI void
+ecore_x_window_shape_rectangles_add(Ecore_X_Window win,
+                                    Ecore_X_Rectangle *rects,
+                                    int num)
 {
    XRectangle *rect = NULL;
    int i;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (num > 0)
      {
-       rect = malloc(sizeof(XRectangle) * num);
-       if (rect)
-         {
-            for (i = 0; i < num; i++)
-              {
-                 rect[i].x = rects[i].x;
-                 rect[i].y = rects[i].y;
-                 rect[i].width = rects[i].width;
-                 rect[i].height = rects[i].height;
-              }
-         }
-       else
-         num = 0;
+        rect = malloc(sizeof(XRectangle) * num);
+        if (!rect) return;
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
      }
-   XShapeCombineRectangles(_ecore_x_disp, win, ShapeBounding, 0, 0, rect, num, ShapeUnion, Unsorted);
+
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeBounding,
+                           0,
+                           0,
+                           rect,
+                           num,
+                           ShapeUnion,
+                           Unsorted);
    if (rect) free(rect);
 }
 
+EAPI void
+ecore_x_window_shape_input_rectangles_add(Ecore_X_Window win,
+                                          Ecore_X_Rectangle *rects,
+                                          int num)
+{
+#ifdef ShapeInput
+   XRectangle *rect = NULL;
+   int i;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (num > 0)
+     {
+        rect = malloc(sizeof(XRectangle) * num);
+        if (!rect) return;
+        for (i = 0; i < num; i++)
+          {
+             rect[i].x = rects[i].x;
+             rect[i].y = rects[i].y;
+             rect[i].width = rects[i].width;
+             rect[i].height = rects[i].height;
+          }
+     }
+
+   XShapeCombineRectangles(_ecore_x_disp,
+                           win,
+                           ShapeInput,
+                           0,
+                           0,
+                           rect,
+                           num,
+                           ShapeUnion,
+                           Unsorted);
+   if (rect) free(rect);
+#else
+   return;
+   win = rects = num = 0;
+#endif
+}
+
 EAPI Ecore_X_Rectangle *
-ecore_x_window_shape_rectangles_get(Ecore_X_Window win, int *num_ret)
+ecore_x_window_shape_rectangles_get(Ecore_X_Window win,
+                                    int *num_ret)
 {
    XRectangle *rect;
    Ecore_X_Rectangle *rects = NULL;
    int i, num = 0, ord;
-   
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    rect = XShapeGetRectangles(_ecore_x_disp, win, ShapeBounding, &num, &ord);
    if (rect)
      {
-       rects = malloc(sizeof(Ecore_X_Rectangle) * num);
-       if (rects)
-         {
-            for (i = 0; i < num; i++)
-              {
-                 rects[i].x = rect[i].x;
-                 rects[i].y = rect[i].y;
-                 rects[i].width = rect[i].width;
-                 rects[i].height = rect[i].height;
-              }
-         }
-       XFree(rect);
+        if (num < 1)
+          {
+             XFree(rect);
+             if (num_ret) *num_ret = 0;
+             return NULL;
+          }
+        rects = malloc(sizeof(Ecore_X_Rectangle) * num);
+        if (!rects)
+          {
+             XFree(rect);
+             if (num_ret) *num_ret = 0;
+             return NULL;
+          }
+        for (i = 0; i < num; i++)
+          {
+             rects[i].x = rect[i].x;
+             rects[i].y = rect[i].y;
+             rects[i].width = rect[i].width;
+             rects[i].height = rect[i].height;
+          }
+        XFree(rect);
      }
    if (num_ret) *num_ret = num;
    return rects;
 }
 
+EAPI Ecore_X_Rectangle *
+ecore_x_window_shape_input_rectangles_get(Ecore_X_Window win,
+                                          int *num_ret)
+{
+   Ecore_X_Rectangle *rects = NULL;
+#ifdef ShapeInput
+   XRectangle *rect;
+   int i, num = 0, ord;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   rect = XShapeGetRectangles(_ecore_x_disp, win, ShapeInput, &num, &ord);
+   if (rect)
+     {
+        if (num < 1)
+          {
+             XFree(rect);
+             if (num_ret) *num_ret = 0;
+             return NULL;
+          }
+        rects = malloc(sizeof(Ecore_X_Rectangle) * num);
+        if (!rects)
+          {
+             XFree(rect);
+             if (num_ret) *num_ret = 0;
+             return NULL;
+          }
+        for (i = 0; i < num; i++)
+          {
+             rects[i].x = rect[i].x;
+             rects[i].y = rect[i].y;
+             rects[i].width = rect[i].width;
+             rects[i].height = rect[i].height;
+          }
+        XFree(rect);
+     }
+   if (num_ret) *num_ret = num;
+   return rects;
+#else
+   // have to return fake shape input rect of size of window
+   Window dw;
+   unsigned int di;
+
+   if (num_ret) *num_ret = 0;
+   rects = malloc(sizeof(Ecore_X_Rectangle));
+   if (!rects) return NULL;
+   if (!XGetGeometry(_ecore_x_disp, win, &dw,
+                     &(rects[0].x), &(rects[0].y),
+                     &(rects[0].width), &(rects[0].height),
+                     &di, &di))
+     {
+        free(rects);
+        return NULL;
+     }
+   if (num_ret) *num_ret = 1;
+   return rects;
+#endif
+}
+
 EAPI void
-ecore_x_window_shape_events_select(Ecore_X_Window win, int on)
+ecore_x_window_shape_events_select(Ecore_X_Window win,
+                                   Eina_Bool on)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (on)
      XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask);
    else
      XShapeSelectInput(_ecore_x_disp, win, 0);
 }
 
-/**
- * Sets the input shape of the given window to that given by the pixmap @p mask.
- * @param   win  The given window.
- * @param   mask A 2-bit depth pixmap that provides the new input shape of the
- *               window.
- * @ingroup Ecore_X_Window_Shape
- */
-EAPI void
-ecore_x_window_shape_input_mask_set(Ecore_X_Window win, Ecore_X_Pixmap mask)
-{
-#ifdef ShapeInput
-   XShapeCombineMask(_ecore_x_disp, win, ShapeInput, 0, 0, mask, ShapeSet);
-#else   
-   XShapeCombineMask(_ecore_x_disp, win, ShapeBounding, 0, 0, mask, ShapeSet);
-#endif
-}
-
diff --git a/src/lib/ecore_x/xlib/ecore_x_xi2.c b/src/lib/ecore_x/xlib/ecore_x_xi2.c
new file mode 100755 (executable)
index 0000000..a09f055
--- /dev/null
@@ -0,0 +1,556 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
+#include <string.h>
+
+#include "Ecore.h"
+#include "ecore_x_private.h"
+#include "Ecore_X.h"
+
+#ifdef ECORE_XI2
+#include "Ecore_Input.h"
+#endif /* ifdef ECORE_XI2 */
+
+int _ecore_x_xi2_opcode = -1;
+
+#ifndef XIPointerEmulated
+#define XIPointerEmulated (1 << 16)
+#endif
+
+#ifdef ECORE_XI2
+#ifdef ECORE_XI2_2
+#ifndef XITouchEmulatingPointer
+#define XITouchEmulatingPointer (1 << 17)
+#endif
+
+typedef struct _Ecore_X_Touch_Device_Info
+{
+   EINA_INLIST;
+   int devid;
+   int mode;
+   const char *name;
+   int max_touch;
+   int *slot;
+} Ecore_X_Touch_Device_Info;
+#endif /* ifdef ECORE_XI2_2 */
+
+static XIDeviceInfo *_ecore_x_xi2_devs = NULL;
+static int _ecore_x_xi2_num = 0;
+#ifdef ECORE_XI2_2
+static Eina_Inlist *_ecore_x_xi2_touch_info_list = NULL;
+#endif /* ifdef ECORE_XI2_2 */
+#endif /* ifdef ECORE_XI2 */
+
+void
+_ecore_x_input_init(void)
+{
+#ifdef ECORE_XI2
+   int event, error;
+   int major = XI_2_Major, minor = XI_2_Minor;
+
+   if (!XQueryExtension(_ecore_x_disp, "XInputExtension",
+                        &_ecore_x_xi2_opcode, &event, &error))
+     {
+        _ecore_x_xi2_opcode = -1;
+        return;
+     }
+
+   if (XIQueryVersion(_ecore_x_disp, &major, &minor) == BadRequest)
+     {
+        _ecore_x_xi2_opcode = -1;
+        return;
+     }
+
+   _ecore_x_xi2_devs = XIQueryDevice(_ecore_x_disp, XIAllDevices,
+                                     &_ecore_x_xi2_num);
+#endif /* ifdef ECORE_XI2 */
+}
+
+#ifdef ECORE_XI2
+#ifdef ECORE_XI2_2
+static void
+_ecore_x_input_touch_info_clear(void)
+{
+   Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
+   Ecore_X_Touch_Device_Info *info = NULL;
+
+   while (l)
+     {
+        info = EINA_INLIST_CONTAINER_GET(l, Ecore_X_Touch_Device_Info);
+        l = eina_inlist_remove(l, l);
+        if (info->slot) free(info->slot);
+        free(info);
+     }
+
+   _ecore_x_xi2_touch_info_list = NULL;
+}
+#endif /* ifdef ECORE_XI2_2 */
+#endif /* ifdef ECORE_XI2 */
+
+void
+_ecore_x_input_shutdown(void)
+{
+#ifdef ECORE_XI2
+   if (_ecore_x_xi2_devs)
+     {
+        XIFreeDeviceInfo(_ecore_x_xi2_devs);
+        _ecore_x_xi2_devs = NULL;
+#ifdef ECORE_XI2_2
+        _ecore_x_input_touch_info_clear();
+#endif /* ifdef ECORE_XI2_2 */
+     }
+
+   _ecore_x_xi2_num = 0;
+   _ecore_x_xi2_opcode = -1;
+#endif /* ifdef ECORE_XI2 */
+}
+
+#ifdef ECORE_XI2
+#ifdef ECORE_XI2_2
+static int
+_ecore_x_input_touch_index_get(int devid, int detail, int event_type)
+{
+   int i;
+   Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
+   Ecore_X_Touch_Device_Info *info = NULL;
+
+   if ((!_ecore_x_xi2_devs) || (!_ecore_x_xi2_touch_info_list))
+     return 0;
+
+   EINA_INLIST_FOREACH(l, info)
+     if (info->devid == devid) break;
+
+   if ((!info) || (!info->slot)) return 0;
+
+   for (i = 0; i < info->max_touch ; i++)
+     {
+        int *p = &(info->slot[i]);
+
+        if ((event_type == XI_TouchBegin) && (*p < 0))
+          {
+             *p = detail;
+             return i;
+          }
+       else if (*p == detail)
+         {
+            return i;
+         }
+     }
+
+   return 0;
+}
+
+static void
+_ecore_x_input_touch_index_clear(int devid, int idx)
+{
+   Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
+   Ecore_X_Touch_Device_Info *info = NULL;
+
+   if ((!_ecore_x_xi2_devs) || (!_ecore_x_xi2_touch_info_list))
+     return;
+
+   EINA_INLIST_FOREACH(l, info)
+     {
+        if ((info->devid == devid) && (info->slot))
+          {
+             info->slot[idx] = -1;
+             return;
+          }
+     }
+}
+
+static Ecore_X_Touch_Device_Info *
+_ecore_x_input_touch_info_get(XIDeviceInfo *dev)
+{
+   int k;
+   int *slot = NULL;
+   XITouchClassInfo *t = NULL;
+   Ecore_X_Touch_Device_Info *info = NULL;
+
+   if (!dev)
+     return NULL;
+
+   for (k = 0; k < dev->num_classes; k++)
+     {
+        XIAnyClassInfo *clas = dev->classes[k];
+
+        if (clas && (clas->type == XITouchClass))
+          {
+             t = (XITouchClassInfo *)clas;
+             break;
+          }
+     }
+
+   if (t && (t->type == XITouchClass))
+     {
+        info = calloc(1, sizeof(Ecore_X_Touch_Device_Info));
+        if (!info) return NULL;
+
+        slot = malloc(sizeof(int) * (t->num_touches + 1));
+        if (!slot)
+          {
+             free(info);
+             return NULL;
+          }
+
+        info->devid = dev->deviceid;
+        info->max_touch = t->num_touches + 1;
+        info->mode = t->mode;
+        info->name = dev->name;
+        memset(slot, -1, sizeof(int) * info->max_touch);
+        info->slot = slot;
+     }
+
+   return info;
+}
+#endif /* ifdef ECORE_XI2_2 */
+#endif
+
+void
+_ecore_x_input_handler(XEvent *xevent)
+{
+#ifdef ECORE_XI2
+   XIDeviceEvent *evd = (XIDeviceEvent *)(xevent->xcookie.data);
+   /* XIRawEvent *evr = (XIRawEvent *)(xevent->xcookie.data); */
+   int devid = evd->deviceid;
+   int i;
+
+   /* No filter for this events */
+   switch (xevent->xcookie.evtype)
+     {
+#ifdef XI_RawButtonPress
+      case XI_RawButtonPress:
+         ecore_event_add(ECORE_X_RAW_BUTTON_PRESS, NULL, NULL, NULL);
+         break;
+#endif
+#ifdef XI_RawButtonRelease
+      case XI_RawButtonRelease:
+         ecore_event_add(ECORE_X_RAW_BUTTON_RELEASE, NULL, NULL, NULL);
+         break;
+#endif
+#ifdef XI_RawMotion
+      case XI_RawMotion:
+         ecore_event_add(ECORE_X_RAW_MOTION, NULL, NULL, NULL);
+         break;
+#endif
+     }
+
+   if (_ecore_x_xi2_devs)
+     {
+        for (i = 0; i < _ecore_x_xi2_num; i++)
+          {
+             XIDeviceInfo *dev = &(_ecore_x_xi2_devs[i]);
+
+             if (devid == dev->deviceid)
+               {
+                  if (dev->use == XIMasterPointer) return;
+                  if ((dev->use == XISlavePointer) &&
+                      (evd->flags & XIPointerEmulated)) return;
+               }
+          }
+     }
+   switch (xevent->xcookie.evtype)
+     {
+      case XI_Motion:
+        _ecore_mouse_move
+          (evd->time,
+          0,   // state
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y,
+          evd->event,
+          (evd->child ? evd->child : evd->event),
+          evd->root,
+          1,   // same_screen
+          devid, 1, 1,
+          1.0,   // pressure
+          0.0,   // angle
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y);
+        break;
+
+      case XI_ButtonPress:
+        _ecore_mouse_button
+          (ECORE_EVENT_MOUSE_BUTTON_DOWN,
+          evd->time,
+          0,   // state
+          0,   // button
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y,
+          evd->event,
+          (evd->child ? evd->child : evd->event),
+          evd->root,
+          1,   // same_screen
+          devid, 1, 1,
+          1.0,   // pressure
+          0.0,   // angle
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y);
+        break;
+
+      case XI_ButtonRelease:
+        _ecore_mouse_button
+          (ECORE_EVENT_MOUSE_BUTTON_UP,
+          evd->time,
+          0,   // state
+          0,   // button
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y,
+          evd->event,
+          (evd->child ? evd->child : evd->event),
+          evd->root,
+          1,   // same_screen
+          devid, 1, 1,
+          1.0,   // pressure
+          0.0,   // angle
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y);
+        break;
+
+#ifdef XI_TouchUpdate
+      case XI_TouchUpdate:
+#ifdef ECORE_XI2_2
+        i = _ecore_x_input_touch_index_get(devid, evd->detail, XI_TouchUpdate);
+        if ((i == 0) && (evd->flags & XITouchEmulatingPointer)) return;
+#endif /* #ifdef ECORE_XI2_2 */
+        _ecore_mouse_move
+          (evd->time,
+          0,   // state
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y,
+          evd->event,
+          (evd->child ? evd->child : evd->event),
+          evd->root,
+          1,   // same_screen
+#ifdef ECORE_XI2_2
+          i, 1, 1,
+#else
+          devid, 1, 1,
+#endif /* #ifdef ECORE_XI2_2 */
+          1.0,   // pressure
+          0.0,   // angle
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y);
+        break;
+#endif
+
+#ifdef XI_TouchBegin
+      case XI_TouchBegin:
+#ifdef ECORE_XI2_2
+        i = _ecore_x_input_touch_index_get(devid, evd->detail, XI_TouchBegin);
+        if ((i == 0) && (evd->flags & XITouchEmulatingPointer)) return;
+#endif /* #ifdef ECORE_XI2_2 */
+        _ecore_mouse_button
+          (ECORE_EVENT_MOUSE_BUTTON_DOWN,
+          evd->time,
+          0,   // state
+          0,   // button
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y,
+          evd->event,
+          (evd->child ? evd->child : evd->event),
+          evd->root,
+          1,   // same_screen
+#ifdef ECORE_XI2_2
+          i, 1, 1,
+#else
+          devid, 1, 1,
+#endif /* #ifdef ECORE_XI2_2 */
+          1.0,   // pressure
+          0.0,   // angle
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y);
+        break;
+#endif
+
+#ifdef XI_TouchEnd
+      case XI_TouchEnd:
+#ifdef ECORE_XI2_2
+        i = _ecore_x_input_touch_index_get(devid, evd->detail, XI_TouchEnd);
+        if ((i == 0) && (evd->flags & XITouchEmulatingPointer))
+          {
+             _ecore_x_input_touch_index_clear(devid,  i);
+             return;
+          }
+#endif /* #ifdef ECORE_XI2_2 */
+        _ecore_mouse_button
+          (ECORE_EVENT_MOUSE_BUTTON_UP,
+          evd->time,
+          0,   // state
+          0,   // button
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y,
+          evd->event,
+          (evd->child ? evd->child : evd->event),
+          evd->root,
+          1,   // same_screen
+#ifdef ECORE_XI2_2
+          i, 1, 1,
+#else
+          devid, 1, 1,
+#endif /* #ifdef ECORE_XI2_2 */
+          1.0,   // pressure
+          0.0,   // angle
+          evd->event_x, evd->event_y,
+          evd->root_x, evd->root_y);
+#ifdef ECORE_XI2_2
+        _ecore_x_input_touch_index_clear(devid,  i);
+#endif /* #ifdef ECORE_XI2_2 */
+        break;
+#endif
+
+      default:
+        break;
+     }
+#endif /* ifdef ECORE_XI2 */
+}
+
+EAPI Eina_Bool
+ecore_x_input_multi_select(Ecore_X_Window win)
+{
+#ifdef ECORE_XI2
+   int i;
+   Eina_Bool find = EINA_FALSE;
+
+   if (!_ecore_x_xi2_devs)
+     return 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   for (i = 0; i < _ecore_x_xi2_num; i++)
+     {
+        XIDeviceInfo *dev = &(_ecore_x_xi2_devs[i]);
+
+        if (dev->use == XIFloatingSlave)
+          {
+             XIEventMask eventmask;
+             unsigned char mask[4] = { 0 };
+
+             eventmask.deviceid = dev->deviceid;
+             eventmask.mask_len = sizeof(mask);
+             eventmask.mask = mask;
+             XISetMask(mask, XI_ButtonPress);
+             XISetMask(mask, XI_ButtonRelease);
+             XISetMask(mask, XI_Motion);
+             XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
+             find = EINA_TRUE;
+          }
+        else if (dev->use == XISlavePointer)
+          {
+             XIDeviceInfo *atdev = NULL;
+             int j;
+
+             for (j = 0; j < _ecore_x_xi2_num; j++)
+               {
+                  if (_ecore_x_xi2_devs[j].deviceid == dev->attachment)
+                    atdev = &(_ecore_x_xi2_devs[j]);
+               }
+             if (((atdev) && (atdev->use != XIMasterPointer)) ||
+                 (!atdev))
+               {
+                  XIEventMask eventmask;
+                  unsigned char mask[4] = { 0 };
+
+                  eventmask.deviceid = dev->deviceid;
+                  eventmask.mask_len = sizeof(mask);
+                  eventmask.mask = mask;
+                  XISetMask(mask, XI_ButtonPress);
+                  XISetMask(mask, XI_ButtonRelease);
+                  XISetMask(mask, XI_Motion);
+#ifdef ECORE_XI2_2
+                  Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
+                  Ecore_X_Touch_Device_Info *info;
+                  info = _ecore_x_input_touch_info_get(dev);
+
+                  if (info)
+                    {
+                       XISetMask(mask, XI_TouchUpdate);
+                       XISetMask(mask, XI_TouchBegin);
+                       XISetMask(mask, XI_TouchEnd);
+
+                       l = eina_inlist_append(l, (Eina_Inlist *)info);
+                       _ecore_x_xi2_touch_info_list = l;
+                    }
+#else
+# ifdef XI_TouchUpdate
+                  XISetMask(mask, XI_TouchUpdate);
+# endif
+# ifdef XI_TouchBegin
+                  XISetMask(mask, XI_TouchBegin);
+# endif
+# ifdef XI_TouchEnd
+                  XISetMask(mask, XI_TouchEnd);
+# endif
+#endif /* #ifdef ECORE_XI2_2 */
+
+                  XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
+                  find = EINA_TRUE;
+               }
+#ifdef ECORE_XI2_2
+             else if ((atdev) && (atdev->use == XIMasterPointer))
+               {
+                  Eina_Inlist *l = _ecore_x_xi2_touch_info_list;
+                  Ecore_X_Touch_Device_Info *info;
+                  info = _ecore_x_input_touch_info_get(dev);
+
+                  if (info)
+                    {
+                       XIEventMask eventmask;
+                       unsigned char mask[4] = { 0 };
+
+                       eventmask.deviceid = dev->deviceid;
+                       eventmask.mask_len = sizeof(mask);
+                       eventmask.mask = mask;
+
+                       XISetMask(mask, XI_TouchUpdate);
+                       XISetMask(mask, XI_TouchBegin);
+                       XISetMask(mask, XI_TouchEnd);
+                       XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
+
+                       l = eina_inlist_append(l, (Eina_Inlist *)info);
+                       _ecore_x_xi2_touch_info_list = l;
+
+                       find = EINA_TRUE;
+                    }
+               }
+#endif /* #ifdef ECORE_XI2_2 */
+          }
+     }
+
+   return find;
+#else /* ifdef ECORE_XI2 */
+   return EINA_FALSE;
+#endif /* ifdef ECORE_XI2 */
+}
+
+EAPI Eina_Bool
+ecore_x_input_raw_select(Ecore_X_Window win)
+{
+#ifdef ECORE_XI2
+   XIEventMask emask;
+   unsigned char mask[4] = { 0 };
+
+   if (!_ecore_x_xi2_devs)
+     return EINA_FALSE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   emask.deviceid = XIAllMasterDevices;
+   emask.mask_len = sizeof(mask);
+   emask.mask = mask;
+#ifdef XI_RawButtonPress
+   XISetMask(emask.mask, XI_RawButtonPress);
+#endif
+#ifdef XI_RawButtonRelease
+   XISetMask(emask.mask, XI_RawButtonRelease);
+#endif
+#ifdef XI_RawMotion
+   XISetMask(emask.mask, XI_RawMotion);
+#endif
+
+   XISelectEvents(_ecore_x_disp, win, &emask, 1);
+
+   return EINA_TRUE;
+#else
+   return EINA_FALSE;
+#endif
+}
+
index 4c7353d..f49a4d3 100644 (file)
@@ -1,9 +1,11 @@
 /*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
-/*
  * Xinerama code
  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
 #include "Ecore.h"
 #include "ecore_x_private.h"
 #include "Ecore_X.h"
@@ -12,7 +14,7 @@
 #ifdef ECORE_XINERAMA
 static XineramaScreenInfo *_xin_info = NULL;
 static int _xin_scr_num = 0;
-#endif
+#endif /* ifdef ECORE_XINERAMA */
 
 EAPI int
 ecore_x_xinerama_screen_count_get(void)
@@ -20,41 +22,70 @@ ecore_x_xinerama_screen_count_get(void)
 #ifdef ECORE_XINERAMA
    int event_base, error_base;
 
-   if (_xin_info) XFree(_xin_info);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   if (_xin_info)
+     XFree(_xin_info);
+
    _xin_info = NULL;
    if (XineramaQueryExtension(_ecore_x_disp, &event_base, &error_base))
      {
-       _xin_info = XineramaQueryScreens(_ecore_x_disp, &_xin_scr_num);
-       if (_xin_info) return _xin_scr_num;
+        _xin_info = XineramaQueryScreens(_ecore_x_disp, &_xin_scr_num);
+        if (_xin_info)
+          return _xin_scr_num;
      }
-#endif
+
+#endif /* ifdef ECORE_XINERAMA */
    return 0;
 }
 
-EAPI int
-ecore_x_xinerama_screen_geometry_get(int screen, int *x, int *y, int *w, int *h)
+EAPI Eina_Bool
+ecore_x_xinerama_screen_geometry_get(int screen,
+                                     int *x,
+                                     int *y,
+                                     int *w,
+                                     int *h)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 #ifdef ECORE_XINERAMA
    if (_xin_info)
      {
-       int i;
-       
-       for (i = 0; i < _xin_scr_num; i++)
-         {
-            if (_xin_info[i].screen_number == screen)
-              {
-                 if (x) *x = _xin_info[i].x_org;
-                 if (y) *y = _xin_info[i].y_org;
-                 if (w) *w = _xin_info[i].width;
-                 if (h) *h = _xin_info[i].height;
-                 return 1;
-              }
-         }
+        int i;
+
+        for (i = 0; i < _xin_scr_num; i++)
+          {
+             if (_xin_info[i].screen_number == screen)
+               {
+                  if (x)
+                    *x = _xin_info[i].x_org;
+
+                  if (y)
+                    *y = _xin_info[i].y_org;
+
+                  if (w)
+                    *w = _xin_info[i].width;
+
+                  if (h)
+                    *h = _xin_info[i].height;
+
+                  return EINA_TRUE;
+               }
+          }
      }
-#endif
-   if (x) *x = 0;
-   if (y) *y = 0;
-   if (w) *w = DisplayWidth(_ecore_x_disp, 0);
-   if (h) *h = DisplayHeight(_ecore_x_disp, 0);
-   return 0;
+
+#endif /* ifdef ECORE_XINERAMA */
+   if (x)
+     *x = 0;
+
+   if (y)
+     *y = 0;
+
+   if (w)
+     *w = DisplayWidth(_ecore_x_disp, 0);
+
+   if (h)
+     *h = DisplayHeight(_ecore_x_disp, 0);
+
+   return EINA_FALSE;
+   screen = 0;
 }
+
diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am
new file mode 100644 (file)
index 0000000..99a1469
--- /dev/null
@@ -0,0 +1,3 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = immodules
diff --git a/src/modules/immodules/Makefile.am b/src/modules/immodules/Makefile.am
new file mode 100644 (file)
index 0000000..22b6496
--- /dev/null
@@ -0,0 +1,15 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS =
+
+if BUILD_ECORE_IMF_XIM
+SUBDIRS += xim
+endif
+
+if BUILD_ECORE_IMF_SCIM
+SUBDIRS += scim
+endif
+
+if BUILD_ECORE_IMF_IBUS
+SUBDIRS += ibus
+endif
diff --git a/src/modules/immodules/ibus/Makefile.am b/src/modules/immodules/ibus/Makefile.am
new file mode 100644 (file)
index 0000000..a59b5e8
--- /dev/null
@@ -0,0 +1,36 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CFLAGS = \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_srcdir)/src/lib/ecore_x \
+-I$(top_srcdir)/src/lib/ecore_imf \
+-I$(top_srcdir)/src/lib/ecore_evas \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore_x \
+-I$(top_builddir)/src/lib/ecore_imf \
+-I$(top_builddir)/src/lib/ecore_evas \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@IBUS_CFLAGS@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
+
+pkgdir = $(libdir)/ecore/immodules
+
+pkg_LTLIBRARIES = ibus.la
+ibus_la_SOURCES = \
+ibus_module.c \
+ibus_imcontext.c \
+ibus_imcontext.h
+
+ibus_la_LIBADD = \
+        $(top_builddir)/src/lib/ecore_imf/libecore_imf.la \
+        $(top_builddir)/src/lib/ecore_x/libecore_x.la \
+       @IBUS_LIBS@ \
+       @EVAS_LIBS@ \
+       @EINA_LIBS@
+ibus_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+ibus_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/immodules/ibus/ibus_imcontext.c b/src/modules/immodules/ibus/ibus_imcontext.c
new file mode 100644 (file)
index 0000000..23bf033
--- /dev/null
@@ -0,0 +1,822 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/un.h>
+#include <string.h>
+#include <stdlib.h>
+#include <glib.h>
+
+#include <X11/Xlib.h>
+#include <Ecore_X.h>
+#include <Ecore_Evas.h>
+
+#include <ibus.h>
+#include "ibus_imcontext.h"
+
+struct _IBusIMContext
+{
+   /* instance members */
+   Ecore_IMF_Context *ctx;
+
+   /* enabled */
+   Eina_Bool        enable;
+   IBusInputContext *ibuscontext;
+
+   /* preedit status */
+   char            *preedit_string;
+   Eina_List       *preedit_attrs;
+   int              preedit_cursor_pos;
+   Eina_Bool        preedit_visible;
+
+   int              cursor_x;
+   int              cursor_y;
+   int              cursor_w;
+   int              cursor_h;
+
+   Eina_Bool        has_focus;
+
+   Ecore_X_Window   client_window;
+   Evas            *client_canvas;
+
+   int              caps;
+};
+
+typedef struct _KeyEvent KeyEvent;
+
+struct _KeyEvent
+{
+   int keysym;
+   int state;
+};
+
+static Eina_Bool _use_sync_mode = EINA_FALSE;
+
+static Ecore_IMF_Context *_focus_im_context = NULL;
+static IBusBus           *_bus = NULL;
+
+/* functions prototype */
+/* static methods*/
+static void     _create_input_context       (IBusIMContext      *context);
+static void     _set_cursor_location_internal
+(Ecore_IMF_Context  *ctx);
+static void     _bus_connected_cb           (IBusBus            *bus,
+                                             IBusIMContext      *context);
+static XKeyEvent createXKeyEvent            (Window win, Eina_Bool press, int keysym, int modifiers);
+
+static void
+_window_to_screen_geometry_get(Ecore_X_Window client_win, int *x, int *y)
+{
+   Ecore_X_Window root_window, win;
+   int win_x, win_y;
+   int sum_x = 0, sum_y = 0;
+
+   root_window = ecore_x_window_root_get(client_win);
+   win = client_win;
+
+   while (root_window != win)
+     {
+        ecore_x_window_geometry_get(win, &win_x, &win_y, NULL, NULL);
+        sum_x += win_x;
+        sum_y += win_y;
+        win = ecore_x_window_parent_get(win);
+     }
+
+   if (x)
+     *x = sum_x;
+   if (y)
+     *y = sum_y;
+}
+
+static unsigned int
+_ecore_imf_modifier_to_ibus_modifier(unsigned int modifier)
+{
+   unsigned int state = 0;
+
+   /**< "Control" is pressed */
+   if (modifier & ECORE_IMF_KEYBOARD_MODIFIER_CTRL)
+     state |= IBUS_CONTROL_MASK;
+
+   /**< "Alt" is pressed */
+   if (modifier & ECORE_IMF_KEYBOARD_MODIFIER_ALT)
+     state |= IBUS_MOD1_MASK;
+
+   /**< "Shift" is pressed */
+   if (modifier & ECORE_IMF_KEYBOARD_MODIFIER_SHIFT)
+     state |= IBUS_SHIFT_MASK;
+
+   /**< "Win" (between "Ctrl" and "Alt") */
+   if (modifier & ECORE_IMF_KEYBOARD_MODIFIER_WIN)
+     state |= IBUS_SUPER_MASK;
+
+   /**< "AltGr" is pressed */
+   if (modifier & ECORE_IMF_KEYBOARD_MODIFIER_ALTGR)
+     state |= IBUS_MOD5_MASK;
+
+   return state;
+}
+
+static void
+key_event_put(int keysym, int state)
+{
+   // Find the window which has the current keyboard focus.
+   Window winFocus = 0;
+   int revert = RevertToParent;
+
+   XGetInputFocus(ecore_x_display_get(), &winFocus, &revert);
+
+   XKeyEvent event;
+   if (state & IBUS_RELEASE_MASK)
+     {
+        event = createXKeyEvent(winFocus, EINA_FALSE, keysym, state);
+        XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent *)&event);
+     }
+   else
+     {
+        event = createXKeyEvent(winFocus, EINA_TRUE, keysym, state);
+        XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
+     }
+}
+
+static KeyEvent *
+key_event_copy(int keysym, int state)
+{
+   KeyEvent *kev = calloc(1, sizeof(KeyEvent));
+   kev->keysym = keysym;
+   kev->state = state;
+
+   return kev;
+}
+
+IBusIMContext *
+ibus_im_context_new(void)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+
+   IBusIMContext *context = calloc(1, sizeof(IBusIMContext));
+
+   /* init bus object */
+   if (_bus == NULL)
+     {
+        char *display_name = NULL;
+
+        if ((display_name = getenv("DISPLAY")))
+          ibus_set_display(display_name);
+        else
+          ibus_set_display(":0.0");
+
+        _bus = ibus_bus_new();
+     }
+
+   return context;
+}
+
+static void
+_process_key_event_done (GObject      *object,
+                         GAsyncResult *res,
+                         gpointer      user_data)
+{
+    IBusInputContext *context = (IBusInputContext *)object;
+    KeyEvent *event = (KeyEvent *)user_data;
+
+    GError *error = NULL;
+    Eina_Bool retval = ibus_input_context_process_key_event_async_finish(context,
+                                                                         res,
+                                                                         &error);
+
+    if (error != NULL)
+      {
+         g_warning("Process Key Event failed: %s.", error->message);
+         g_error_free(error);
+      }
+
+    if (retval == EINA_FALSE)
+      {
+         key_event_put(event->keysym, event->state);
+      }
+    free(event);
+}
+
+EAPI void
+ibus_im_context_add(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+
+   char *s = NULL;
+   IBusIMContext *ibusimcontext = (IBusIMContext *)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   ibusimcontext->client_window = 0;
+
+   // Init ibus status
+   ibusimcontext->enable = EINA_FALSE;
+
+   // Init preedit status
+   ibusimcontext->preedit_string = NULL;
+   ibusimcontext->preedit_attrs = NULL;
+   ibusimcontext->preedit_cursor_pos = 0;
+   ibusimcontext->preedit_visible = EINA_FALSE;
+
+   // Init cursor area
+   ibusimcontext->cursor_x = -1;
+   ibusimcontext->cursor_y = -1;
+   ibusimcontext->cursor_w = 0;
+   ibusimcontext->cursor_h = 0;
+
+   ibusimcontext->ibuscontext = NULL;
+   ibusimcontext->has_focus = EINA_FALSE;
+   ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT;
+   ibusimcontext->ctx = ctx;
+
+   s = getenv("IBUS_ENABLE_SYNC_MODE");
+   if (s)
+     _use_sync_mode = !!atoi(s);
+
+   if (ibus_bus_is_connected(_bus))
+     _create_input_context (ibusimcontext);
+
+   g_signal_connect(_bus, "connected", G_CALLBACK (_bus_connected_cb), ctx);
+}
+
+EAPI void
+ibus_im_context_del(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+
+   IBusIMContext *ibusimcontext = (IBusIMContext*)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   g_signal_handlers_disconnect_by_func(_bus, G_CALLBACK(_bus_connected_cb), ctx);
+
+   if (ibusimcontext->ibuscontext)
+     ibus_proxy_destroy((IBusProxy *)ibusimcontext->ibuscontext);
+
+   // release preedit
+   if (ibusimcontext->preedit_string)
+     free(ibusimcontext->preedit_string);
+   if (_focus_im_context == ctx)
+     _focus_im_context = NULL;
+}
+
+EAPI Eina_Bool
+ibus_im_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event)
+{
+   IBusIMContext *ibusimcontext = (IBusIMContext*)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ibusimcontext, EINA_FALSE);
+
+   if (type != ECORE_IMF_EVENT_KEY_UP && type != ECORE_IMF_EVENT_KEY_DOWN)
+     return EINA_FALSE;
+
+   EINA_LOG_DBG("%s", __FUNCTION__);
+
+   if (G_LIKELY(ibusimcontext->ibuscontext && ibusimcontext->has_focus))
+     {
+        /* If context does not have focus, ibus will process key event in sync mode.
+         * It is a workaround for increase search in treeview.
+         */
+        Eina_Bool retval = EINA_FALSE;
+        int keycode;
+        int keysym;
+        unsigned int state = 0;
+
+        if (type == ECORE_IMF_EVENT_KEY_UP)
+          {
+             Ecore_IMF_Event_Key_Up *ev = (Ecore_IMF_Event_Key_Up *)event;
+             if (ev->timestamp == 0)
+               return EINA_FALSE;
+
+             keycode = ecore_x_keysym_keycode_get(ev->key);
+             keysym = XStringToKeysym(ev->key);
+             state = _ecore_imf_modifier_to_ibus_modifier(ev->modifiers) | IBUS_RELEASE_MASK;
+
+             if (_use_sync_mode)
+               {
+                  retval = ibus_input_context_process_key_event(ibusimcontext->ibuscontext,
+                                                                keysym,
+                                                                keycode - 8,
+                                                                state);
+               }
+             else
+               {
+                  ibus_input_context_process_key_event_async(ibusimcontext->ibuscontext,
+                                                             keysym,
+                                                             keycode - 8,
+                                                             state,
+                                                             -1,
+                                                             NULL,
+                                                             _process_key_event_done,
+                                                             key_event_copy(keysym, state));
+                  retval = EINA_TRUE;
+               }
+          }
+        else if (type == ECORE_IMF_EVENT_KEY_DOWN)
+          {
+             Ecore_IMF_Event_Key_Down *ev = (Ecore_IMF_Event_Key_Down *)event;
+             if (ev->timestamp == 0)
+               return EINA_FALSE;
+
+             keycode = ecore_x_keysym_keycode_get(ev->key);
+             keysym = XStringToKeysym(ev->key);
+             state = _ecore_imf_modifier_to_ibus_modifier(ev->modifiers);
+             if (_use_sync_mode)
+               {
+                  retval = ibus_input_context_process_key_event(ibusimcontext->ibuscontext,
+                                                                keysym,
+                                                                keycode - 8,
+                                                                state);
+               }
+             else
+               {
+                  ibus_input_context_process_key_event_async(ibusimcontext->ibuscontext,
+                                                             keysym,
+                                                             keycode - 8,
+                                                             state,
+                                                             -1,
+                                                             NULL,
+                                                             _process_key_event_done,
+                                                             key_event_copy(keysym, state));
+                  retval = EINA_TRUE;
+               }
+          }
+        else
+          retval = EINA_FALSE;
+
+        if (retval)
+          return EINA_TRUE;
+        else
+          return EINA_FALSE;
+     }
+   else
+     return EINA_FALSE;
+}
+
+EAPI void
+ibus_im_context_focus_in(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("ctx : %p", ctx);
+
+   IBusIMContext *ibusimcontext = (IBusIMContext*)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->has_focus)
+     return;
+
+   if (_focus_im_context != NULL)
+     ecore_imf_context_focus_out(_focus_im_context);
+
+   ibusimcontext->has_focus = EINA_TRUE;
+   if (ibusimcontext->ibuscontext)
+     ibus_input_context_focus_in(ibusimcontext->ibuscontext);
+
+   if (_focus_im_context != ctx)
+     _focus_im_context = ctx;
+}
+
+EAPI void
+ibus_im_context_focus_out(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("ctx : %p", ctx);
+
+   IBusIMContext *ibusimcontext = (IBusIMContext *)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->has_focus == EINA_FALSE)
+     return;
+
+   if (_focus_im_context == ctx)
+     _focus_im_context = NULL;
+
+   ibusimcontext->has_focus = EINA_FALSE;
+   if (ibusimcontext->ibuscontext)
+     ibus_input_context_focus_out(ibusimcontext->ibuscontext);
+}
+
+EAPI void
+ibus_im_context_reset(Ecore_IMF_Context *ctx)
+{
+   IBusIMContext *ibusimcontext = (IBusIMContext*)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->ibuscontext)
+     ibus_input_context_reset(ibusimcontext->ibuscontext);
+}
+
+EAPI void
+ibus_im_context_preedit_string_get(Ecore_IMF_Context *ctx,
+                                   char          **str,
+                                   int            *cursor_pos)
+{
+   IBusIMContext *ibusimcontext = (IBusIMContext*)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->enable && ibusimcontext->preedit_visible)
+     {
+        if (str)
+          *str = strdup(ibusimcontext->preedit_string ? ibusimcontext->preedit_string: "");
+
+        if (cursor_pos)
+          *cursor_pos = ibusimcontext->preedit_cursor_pos;
+     }
+   else
+     {
+        if (str)
+          *str = strdup("");
+
+        if (cursor_pos)
+          *cursor_pos = 0;
+     }
+   EINA_LOG_DBG("str : %s, cursor_pos : %d", *str, *cursor_pos);
+}
+
+EAPI void
+ibus_im_context_preedit_string_with_attributes_get(Ecore_IMF_Context   *ctx,
+                                                   char          **str,
+                                                   Eina_List     **attr __UNUSED__,
+                                                   int            *cursor_pos)
+{
+   IBusIMContext *ibusimcontext = (IBusIMContext*)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->enable && ibusimcontext->preedit_visible)
+     {
+        if (str)
+          *str = strdup(ibusimcontext->preedit_string ? ibusimcontext->preedit_string: "");
+
+        if (cursor_pos)
+          *cursor_pos = ibusimcontext->preedit_cursor_pos;
+     }
+   else
+     {
+        if (str)
+          *str = strdup("");
+
+        if (cursor_pos)
+          *cursor_pos = 0;
+     }
+   EINA_LOG_DBG("str : %s, cursor_pos : %d", *str, *cursor_pos);
+}
+
+EAPI void
+ibus_im_context_client_window_set(Ecore_IMF_Context *ctx, void *window)
+{
+   EINA_LOG_DBG("canvas : %p", window);
+   IBusIMContext *ibusimcontext = (IBusIMContext *)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (window != NULL)
+     ibusimcontext->client_window = (Ecore_X_Window)(Ecore_Window)window;
+}
+
+EAPI void
+ibus_im_context_client_canvas_set(Ecore_IMF_Context *ctx, void *canvas)
+{
+   EINA_LOG_DBG("canvas : %p", canvas);
+   IBusIMContext *ibusimcontext = (IBusIMContext *)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (canvas != NULL)
+     ibusimcontext->client_canvas = canvas;
+}
+
+static void
+_set_cursor_location_internal(Ecore_IMF_Context *ctx)
+{
+   IBusIMContext *ibusimcontext = (IBusIMContext *)ecore_imf_context_data_get(ctx);
+   Ecore_Evas *ee;
+   int canvas_x, canvas_y;
+
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->ibuscontext == NULL)
+     return;
+
+   if (ibusimcontext->client_canvas)
+     {
+        ee = ecore_evas_ecore_evas_get(ibusimcontext->client_canvas);
+        if (!ee) return;
+
+        ecore_evas_geometry_get(ee, &canvas_x, &canvas_y, NULL, NULL);
+     }
+   else
+     {
+        if (ibusimcontext->client_window)
+          _window_to_screen_geometry_get(ibusimcontext->client_window, &canvas_x, &canvas_y);
+        else
+          return;
+     }
+
+   ibus_input_context_set_cursor_location(ibusimcontext->ibuscontext,
+                                          ibusimcontext->cursor_x + canvas_x,
+                                          ibusimcontext->cursor_y + canvas_y,
+                                          ibusimcontext->cursor_w,
+                                          ibusimcontext->cursor_h);
+}
+
+EAPI void
+ibus_im_context_cursor_location_set(Ecore_IMF_Context *ctx, int x, int y, int w, int h)
+{
+   EINA_LOG_DBG("x : %d, y : %d, w, %d, h :%d", x, y, w, h);
+   IBusIMContext *ibusimcontext = (IBusIMContext *)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->cursor_x != x ||
+       ibusimcontext->cursor_y != y ||
+       ibusimcontext->cursor_w != w ||
+       ibusimcontext->cursor_h != h)
+     {
+        ibusimcontext->cursor_x = x;
+        ibusimcontext->cursor_y = y;
+        ibusimcontext->cursor_w = w;
+        ibusimcontext->cursor_h = h;
+
+        _set_cursor_location_internal(ctx);
+     }
+}
+
+EAPI void
+ibus_im_context_use_preedit_set(Ecore_IMF_Context *ctx, Eina_Bool use_preedit)
+{
+   EINA_LOG_DBG("preedit : %d", use_preedit);
+   IBusIMContext *ibusimcontext = (IBusIMContext *)ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->ibuscontext)
+     {
+        if (use_preedit)
+          ibusimcontext->caps |= IBUS_CAP_PREEDIT_TEXT;
+        else
+          ibusimcontext->caps &= ~IBUS_CAP_PREEDIT_TEXT;
+
+        ibus_input_context_set_capabilities(ibusimcontext->ibuscontext, ibusimcontext->caps);
+     }
+}
+
+static void
+_bus_connected_cb(IBusBus          *bus __UNUSED__,
+                  IBusIMContext    *ibusimcontext)
+{
+   EINA_LOG_DBG("ibus is connected");
+
+   if (ibusimcontext)
+     _create_input_context(ibusimcontext);
+}
+
+static void
+_ibus_context_commit_text_cb(IBusInputContext *ibuscontext __UNUSED__,
+                             IBusText         *text,
+                             IBusIMContext    *ibusimcontext)
+{
+   if (!ibusimcontext || !text) return;
+   char *commit_str = text->text ? text->text : "";
+
+   EINA_LOG_DBG("commit string : %s", commit_str);
+
+   if (ibusimcontext->ctx)
+     {
+        ecore_imf_context_commit_event_add(ibusimcontext->ctx, text->text);
+        ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)commit_str);
+     }
+}
+
+static XKeyEvent createXKeyEvent(Window win, Eina_Bool press, int keysym, int modifiers)
+{
+   XKeyEvent event;
+   Display *display = ecore_x_display_get();
+
+   event.display     = display;
+   event.window      = win;
+   event.root        = ecore_x_window_root_get(win);
+   event.subwindow   = None;
+   event.time        = 0;
+   event.x           = 1;
+   event.y           = 1;
+   event.x_root      = 1;
+   event.y_root      = 1;
+   event.same_screen = EINA_TRUE;
+   event.state       = modifiers;
+   event.keycode     = XKeysymToKeycode(display, keysym);
+   if (press)
+     event.type = KeyPress;
+   else
+     event.type = KeyRelease;
+   event.send_event  = EINA_FALSE;
+   event.serial = 0;
+
+   return event;
+}
+
+static void
+_ibus_context_forward_key_event_cb(IBusInputContext  *ibuscontext __UNUSED__,
+                                   guint              keyval,
+                                   guint              state,
+                                   IBusIMContext     *ibusimcontext __UNUSED__)
+{
+   EINA_LOG_DBG("keyval : %d, state : %d", keyval, state);
+
+   key_event_put(keyval, state);
+}
+
+static void
+_ibus_context_update_preedit_text_cb(IBusInputContext  *ibuscontext __UNUSED__,
+                                     IBusText          *text,
+                                     gint               cursor_pos,
+                                     gboolean           visible,
+                                     IBusIMContext     *ibusimcontext)
+{
+   if (!ibusimcontext || !text) return;
+
+   const char *str;
+   gboolean flag;
+
+   if (ibusimcontext->preedit_string)
+     free (ibusimcontext->preedit_string);
+
+   str = text->text;
+
+   if (str)
+     ibusimcontext->preedit_string = strdup(str);
+   else
+     ibusimcontext->preedit_string = strdup("");
+
+   ibusimcontext->preedit_cursor_pos = cursor_pos;
+
+   EINA_LOG_DBG("string : %s, cursor : %d", ibusimcontext->preedit_string, ibusimcontext->preedit_cursor_pos);
+
+   flag = ibusimcontext->preedit_visible != visible;
+   ibusimcontext->preedit_visible = visible;
+
+   if (ibusimcontext->preedit_visible)
+     {
+        if (flag)
+          {
+             ecore_imf_context_preedit_start_event_add(ibusimcontext->ctx);
+             ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_START, NULL);
+          }
+
+        ecore_imf_context_preedit_changed_event_add(ibusimcontext->ctx);
+        ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+     }
+   else
+     {
+        if (flag)
+          {
+             ecore_imf_context_preedit_changed_event_add(ibusimcontext->ctx);
+             ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+          }
+
+        ecore_imf_context_preedit_end_event_add(ibusimcontext->ctx);
+        ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+     }
+}
+
+static void
+_ibus_context_show_preedit_text_cb(IBusInputContext *ibuscontext __UNUSED__,
+                                   IBusIMContext    *ibusimcontext)
+{
+   EINA_LOG_DBG("preedit visible : %d", ibusimcontext->preedit_visible);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->preedit_visible == EINA_TRUE)
+     return;
+
+   ibusimcontext->preedit_visible = EINA_TRUE;
+
+   // call preedit start
+   ecore_imf_context_preedit_start_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_START, NULL);
+
+   // call preedit changed
+   ecore_imf_context_preedit_changed_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+}
+
+static void
+_ibus_context_hide_preedit_text_cb(IBusInputContext *ibuscontext __UNUSED__,
+                                   IBusIMContext    *ibusimcontext)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   if (ibusimcontext->preedit_visible == EINA_FALSE)
+     return;
+
+   ibusimcontext->preedit_visible = EINA_FALSE;
+
+   // call preedit changed
+   ecore_imf_context_preedit_changed_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+
+   // call preedit end
+   ecore_imf_context_preedit_end_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+}
+
+static void
+_ibus_context_enabled_cb(IBusInputContext *ibuscontext __UNUSED__,
+                         IBusIMContext    *ibusimcontext)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   ibusimcontext->enable = EINA_TRUE;
+}
+
+static void
+_ibus_context_disabled_cb(IBusInputContext *ibuscontext __UNUSED__,
+                          IBusIMContext    *ibusimcontext)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   ibusimcontext->enable = EINA_FALSE;
+
+   /* clear preedit */
+   ibusimcontext->preedit_visible = EINA_FALSE;
+   ibusimcontext->preedit_cursor_pos = 0;
+   free (ibusimcontext->preedit_string);
+   ibusimcontext->preedit_string = NULL;
+
+   // call preedit changed
+   ecore_imf_context_preedit_changed_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+
+   // call preedit end
+   ecore_imf_context_preedit_end_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+}
+
+static void
+_ibus_context_destroy_cb(IBusInputContext *ibuscontext __UNUSED__,
+                         IBusIMContext    *ibusimcontext)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   ibusimcontext->ibuscontext = NULL;
+   ibusimcontext->enable = EINA_FALSE;
+
+   /* clear preedit */
+   ibusimcontext->preedit_visible = EINA_FALSE;
+   ibusimcontext->preedit_cursor_pos = 0;
+   free (ibusimcontext->preedit_string);
+   ibusimcontext->preedit_string = NULL;
+
+   // call preedit changed
+   ecore_imf_context_preedit_changed_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+
+   // call preedit end
+   ecore_imf_context_preedit_end_event_add(ibusimcontext->ctx);
+   ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+}
+
+static void
+_create_input_context(IBusIMContext *ibusimcontext)
+{
+   EINA_LOG_DBG("%s", __FUNCTION__);
+   EINA_SAFETY_ON_NULL_RETURN(ibusimcontext);
+
+   ibusimcontext->ibuscontext = ibus_bus_create_input_context(_bus, "ecore");
+
+   g_return_if_fail(ibusimcontext->ibuscontext != NULL);
+
+   g_signal_connect(ibusimcontext->ibuscontext,
+                    "commit-text",
+                    G_CALLBACK (_ibus_context_commit_text_cb),
+                    ibusimcontext);
+   g_signal_connect(ibusimcontext->ibuscontext,
+                    "forward-key-event",
+                    G_CALLBACK (_ibus_context_forward_key_event_cb),
+                    ibusimcontext);
+   g_signal_connect(ibusimcontext->ibuscontext,
+                    "update-preedit-text",
+                    G_CALLBACK (_ibus_context_update_preedit_text_cb),
+                    ibusimcontext);
+   g_signal_connect(ibusimcontext->ibuscontext,
+                    "show-preedit-text",
+                    G_CALLBACK (_ibus_context_show_preedit_text_cb),
+                    ibusimcontext);
+   g_signal_connect(ibusimcontext->ibuscontext,
+                    "hide-preedit-text",
+                    G_CALLBACK (_ibus_context_hide_preedit_text_cb),
+                    ibusimcontext);
+   g_signal_connect(ibusimcontext->ibuscontext,
+                    "enabled",
+                    G_CALLBACK (_ibus_context_enabled_cb),
+                    ibusimcontext);
+   g_signal_connect(ibusimcontext->ibuscontext,
+                    "disabled",
+                    G_CALLBACK (_ibus_context_disabled_cb),
+                    ibusimcontext);
+   g_signal_connect(ibusimcontext->ibuscontext, "destroy",
+                    G_CALLBACK (_ibus_context_destroy_cb),
+                    ibusimcontext);
+
+   ibus_input_context_set_capabilities(ibusimcontext->ibuscontext, ibusimcontext->caps);
+
+   if (ibusimcontext->has_focus)
+     ibus_input_context_focus_in(ibusimcontext->ibuscontext);
+}
diff --git a/src/modules/immodules/ibus/ibus_imcontext.h b/src/modules/immodules/ibus/ibus_imcontext.h
new file mode 100644 (file)
index 0000000..ce5c075
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef __IBUS_IM_CONTEXT_H_
+#define __IBUS_IM_CONTEXT_H_
+
+#include <Ecore_IMF.h>
+
+typedef struct _IBusIMContext IBusIMContext;
+
+EAPI void ibus_im_context_add     (Ecore_IMF_Context *ctx);
+EAPI void ibus_im_context_del     (Ecore_IMF_Context *ctx);
+EAPI void ibus_im_context_reset   (Ecore_IMF_Context *context);
+EAPI void ibus_im_context_focus_in(Ecore_IMF_Context *context);
+EAPI void ibus_im_context_focus_out(Ecore_IMF_Context *context);
+EAPI void ibus_im_context_preedit_string_get
+                                            (Ecore_IMF_Context     *context,
+                                             char                  **str,
+                                             int                   *cursor_pos);
+EAPI void ibus_im_context_preedit_string_with_attributes_get
+                                            (Ecore_IMF_Context     *context,
+                                             char                  **str,
+                                             Eina_List             **attr,
+                                             int                   *cursor_pos);
+
+EAPI void ibus_im_context_cursor_location_set(Ecore_IMF_Context *context,
+                                              int x, int y, int w, int h);
+EAPI void ibus_im_context_use_preedit_set(Ecore_IMF_Context *context,
+                                          Eina_Bool use_preedit);
+EAPI void
+ibus_im_context_client_window_set(Ecore_IMF_Context   *context, void *window);
+EAPI void
+ibus_im_context_client_canvas_set(Ecore_IMF_Context   *context, void *canvas);
+EAPI Eina_Bool
+ibus_im_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
+
+IBusIMContext
+        *ibus_im_context_new      (void);
+#endif
diff --git a/src/modules/immodules/ibus/ibus_module.c b/src/modules/immodules/ibus/ibus_module.c
new file mode 100644 (file)
index 0000000..3e3493e
--- /dev/null
@@ -0,0 +1,103 @@
+#include <ibus.h>
+#include "ibus_imcontext.h"
+#include <Ecore_IMF.h>
+#include <Ecore.h>
+#include <stdio.h>
+
+#define IBUS_LOCALDIR ""
+static const Ecore_IMF_Context_Info ibus_im_info = {
+    "ibus",
+    "IBus (Intelligent Input Bus)",
+    "*",
+    NULL,
+    0
+};
+
+static Ecore_IMF_Context_Class ibus_imf_class = {
+    ibus_im_context_add,                    /* add */
+    ibus_im_context_del,                    /* del */
+    ibus_im_context_client_window_set,      /* client_window_set */
+    ibus_im_context_client_canvas_set,      /* client_canvas_set */
+    NULL,                                   /* input_panel_show */
+    NULL,                                   /* input_panel_hide */
+    ibus_im_context_preedit_string_get,     /* get_preedit_string */
+    ibus_im_context_focus_in,               /* focus_in */
+    ibus_im_context_focus_out,              /* focus_out */
+    ibus_im_context_reset,                  /* reset */
+    NULL,                                   /* cursor_position_set */
+    ibus_im_context_use_preedit_set,        /* use_preedit_set */
+    NULL,                                   /* input_mode_set */
+    ibus_im_context_filter_event,           /* filter_event */
+    ibus_im_context_preedit_string_with_attributes_get,  /* preedit_string_with_attribute_get */
+    NULL,                                   /* prediction_allow_set */
+    NULL,                                   /* autocapital_type_set */
+    NULL,                                   /* control panel show */
+    NULL,                                   /* control panel hide */
+    NULL,                                   /* input_panel_layout_set */
+    NULL,                                   /* ibus_im_context_input_panel_layout_get, */
+    NULL,                                   /* ibus_im_context_input_panel_language_set, */
+    NULL,                                   /* ibus_im_context_input_panel_language_get, */
+    ibus_im_context_cursor_location_set,    /* cursor_location_set */
+    NULL,                                   /* input_panel_imdata_set */
+    NULL,                                   /* input_panel_imdata_get */
+    NULL,                                   /* input_panel_return_key_type_set */
+    NULL,                                   /* input_panel_return_key_disabled_set */
+    NULL,                                   /* input_panel_caps_lock_mode_set */
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+};
+
+static Ecore_IMF_Context *im_module_create (void);
+static Ecore_IMF_Context *im_module_exit (void);
+
+static Eina_Bool
+im_module_init(void)
+{
+    ecore_main_loop_glib_integrate();
+    ibus_init();
+    ecore_imf_module_register(&ibus_im_info, im_module_create, im_module_exit);
+
+    return EINA_TRUE;
+}
+
+static void im_module_shutdown(void)
+{
+}
+
+static Ecore_IMF_Context *
+im_module_exit(void)
+{
+    return NULL;
+}
+
+static Ecore_IMF_Context *
+im_module_create()
+{
+    Ecore_IMF_Context *ctx = NULL;
+    IBusIMContext *ctxd = NULL;
+
+    ctxd = ibus_im_context_new();
+    if (!ctxd)
+      {
+         return NULL;
+      }
+
+    ctx = ecore_imf_context_new(&ibus_imf_class);
+    if (!ctx)
+      {
+         free(ctxd);
+         return NULL;
+      }
+
+    ecore_imf_context_data_set(ctx, ctxd);
+
+    return ctx;
+}
+
+EINA_MODULE_INIT(im_module_init);
+EINA_MODULE_SHUTDOWN(im_module_shutdown);
+
diff --git a/src/modules/immodules/scim/Makefile.am b/src/modules/immodules/scim/Makefile.am
new file mode 100644 (file)
index 0000000..40579ca
--- /dev/null
@@ -0,0 +1,36 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_srcdir)/src/lib/ecore_x \
+-I$(top_srcdir)/src/lib/ecore_imf \
+-I$(top_srcdir)/src/lib/ecore_evas \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore_x \
+-I$(top_builddir)/src/lib/ecore_imf \
+-I$(top_builddir)/src/lib/ecore_evas \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@SCIM_CFLAGS@ \
+@EVAS_CFLAGS@ \
+@EINA_CFLAGS@
+
+pkgdir = $(libdir)/ecore/immodules
+
+pkg_LTLIBRARIES = scim.la
+scim_la_SOURCES = \
+scim_imcontext.cpp \
+scim_module.cpp \
+scim_imcontext.h
+
+scim_la_LIBADD = \
+        $(top_builddir)/src/lib/ecore_imf/libecore_imf.la \
+        $(top_builddir)/src/lib/ecore_x/libecore_x.la \
+       @SCIM_LIBS@ \
+       @EVAS_LIBS@ \
+       @EINA_LIBS@
+scim_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+scim_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/immodules/scim/scim_imcontext.cpp b/src/modules/immodules/scim/scim_imcontext.cpp
new file mode 100644 (file)
index 0000000..d4d20b1
--- /dev/null
@@ -0,0 +1,2900 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define Uses_SCIM_DEBUG
+#define Uses_SCIM_BACKEND
+#define Uses_SCIM_IMENGINE_MODULE
+#define Uses_SCIM_HOTKEY
+#define Uses_SCIM_PANEL_CLIENT
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <Ecore_Evas.h>
+#include <Ecore_X.h>
+#include <Ecore.h>
+#include <Evas.h>
+
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
+
+#include <scim.h>
+#include "scim_imcontext.h"
+
+using namespace scim;
+
+struct _EcoreIMFContextISFImpl
+{
+    EcoreIMFContextISF      *parent;
+    IMEngineInstancePointer  si;
+    Ecore_X_Window           client_window;
+    Evas                    *client_canvas;
+    Ecore_IMF_Input_Mode     input_mode;
+    WideString               preedit_string;
+    AttributeList            preedit_attrlist;
+    Ecore_IMF_Autocapital_Type autocapital_type;
+    int                      preedit_caret;
+    int                      cursor_x;
+    int                      cursor_y;
+    int                      cursor_pos;
+    bool                     use_preedit;
+    bool                     is_on;
+    bool                     shared_si;
+    bool                     preedit_started;
+    bool                     preedit_updating;
+    bool                     need_commit_preedit;
+    bool                     uppercase;
+    bool                     prediction_allow;
+
+    EcoreIMFContextISFImpl  *next;
+};
+
+/* Input Context handling functions. */
+static EcoreIMFContextISFImpl *new_ic_impl              (EcoreIMFContextISF     *parent);
+static void                    delete_ic_impl           (EcoreIMFContextISFImpl *impl);
+static void                    delete_all_ic_impl       (void);
+
+static EcoreIMFContextISF     *find_ic                  (int                     id);
+
+
+/* private functions */
+static void     panel_slot_reload_config                (int                     context);
+static void     panel_slot_exit                         (int                     context);
+static void     panel_slot_update_lookup_table_page_size(int                     context,
+                                                         int                     page_size);
+static void     panel_slot_lookup_table_page_up         (int                     context);
+static void     panel_slot_lookup_table_page_down       (int                     context);
+static void     panel_slot_trigger_property             (int                     context,
+                                                         const String           &property);
+static void     panel_slot_process_helper_event         (int                     context,
+                                                         const String           &target_uuid,
+                                                         const String           &helper_uuid,
+                                                         const Transaction      &trans);
+static void     panel_slot_move_preedit_caret           (int                     context,
+                                                         int                     caret_pos);
+static void     panel_slot_select_candidate             (int                     context,
+                                                         int                     cand_index);
+static void     panel_slot_process_key_event            (int                     context,
+                                                         const KeyEvent         &key);
+static void     panel_slot_commit_string                (int                     context,
+                                                         const WideString       &wstr);
+static void     panel_slot_forward_key_event            (int                     context,
+                                                         const KeyEvent         &key);
+static void     panel_slot_request_help                 (int                     context);
+static void     panel_slot_request_factory_menu         (int                     context);
+static void     panel_slot_change_factory               (int                     context,
+                                                         const String           &uuid);
+
+static void     panel_req_focus_in                      (EcoreIMFContextISF     *ic);
+static void     panel_req_update_factory_info           (EcoreIMFContextISF     *ic);
+static void     panel_req_update_spot_location          (EcoreIMFContextISF     *ic);
+static void     panel_req_show_help                     (EcoreIMFContextISF     *ic);
+static void     panel_req_show_factory_menu             (EcoreIMFContextISF     *ic);
+
+/* Panel iochannel handler*/
+static bool     panel_initialize                        (void);
+static void     panel_finalize                          (void);
+static Eina_Bool panel_iochannel_handler                (void                   *data,
+                                                         Ecore_Fd_Handler       *fd_handler);
+
+/* utility functions */
+static bool     filter_hotkeys                          (EcoreIMFContextISF     *ic,
+                                                         const KeyEvent         &key);
+static void     turn_on_ic                              (EcoreIMFContextISF     *ic);
+static void     turn_off_ic                             (EcoreIMFContextISF     *ic);
+static void     set_ic_capabilities                     (EcoreIMFContextISF     *ic);
+
+static void     initialize                              (void);
+static void     finalize                                (void);
+
+static void     open_next_factory                       (EcoreIMFContextISF     *ic);
+static void     open_previous_factory                   (EcoreIMFContextISF     *ic);
+static void     open_specific_factory                   (EcoreIMFContextISF     *ic,
+                                                         const String           &uuid);
+static void     initialize_modifier_bits                (Display *display);
+static unsigned int scim_x11_keymask_scim_to_x11        (Display *display, uint16 scimkeymask);
+static XKeyEvent createKeyEvent                         (Display *display, Window &win,
+                                                         Window &winRoot, bool press,
+                                                         int keycode, int modifiers);
+static void     _x_send_key_event                       (const KeyEvent &key);
+
+static void     attach_instance                         (const IMEngineInstancePointer &si);
+
+/* slot functions */
+static void     slot_show_preedit_string                (IMEngineInstanceBase   *si);
+static void     slot_show_aux_string                    (IMEngineInstanceBase   *si);
+static void     slot_show_lookup_table                  (IMEngineInstanceBase   *si);
+
+static void     slot_hide_preedit_string                (IMEngineInstanceBase   *si);
+static void     slot_hide_aux_string                    (IMEngineInstanceBase   *si);
+static void     slot_hide_lookup_table                  (IMEngineInstanceBase   *si);
+
+static void     slot_update_preedit_caret               (IMEngineInstanceBase   *si,
+                                                         int                     caret);
+static void     slot_update_preedit_string              (IMEngineInstanceBase   *si,
+                                                         const WideString       &str,
+                                                         const AttributeList    &attrs);
+static void     slot_update_aux_string                  (IMEngineInstanceBase   *si,
+                                                         const WideString       &str,
+                                                         const AttributeList    &attrs);
+static void     slot_commit_string                      (IMEngineInstanceBase   *si,
+                                                         const WideString       &str);
+static void     slot_forward_key_event                  (IMEngineInstanceBase   *si,
+                                                         const KeyEvent         &key);
+static void     slot_update_lookup_table                (IMEngineInstanceBase   *si,
+                                                         const LookupTable      &table);
+
+static void     slot_register_properties                (IMEngineInstanceBase   *si,
+                                                         const PropertyList     &properties);
+static void     slot_update_property                    (IMEngineInstanceBase   *si,
+                                                         const Property         &property);
+static void     slot_beep                               (IMEngineInstanceBase   *si);
+static void     slot_start_helper                       (IMEngineInstanceBase   *si,
+                                                         const String           &helper_uuid);
+static void     slot_stop_helper                        (IMEngineInstanceBase   *si,
+                                                         const String           &helper_uuid);
+static void     slot_send_helper_event                  (IMEngineInstanceBase   *si,
+                                                         const String           &helper_uuid,
+                                                         const Transaction      &trans);
+static bool     slot_get_surrounding_text               (IMEngineInstanceBase   *si,
+                                                         WideString             &text,
+                                                         int                    &cursor,
+                                                         int                     maxlen_before,
+                                                         int                     maxlen_after);
+static bool     slot_delete_surrounding_text            (IMEngineInstanceBase   *si,
+                                                         int                     offset,
+                                                         int                     len);
+
+static void     reload_config_callback                  (const ConfigPointer    &config);
+
+static void     fallback_commit_string_cb               (IMEngineInstanceBase   *si,
+                                                         const WideString       &str);
+
+static void     caps_mode_check                         (Ecore_IMF_Context *ctx, Eina_Bool force);
+
+/* Local variables declaration */
+static String                                           _language;
+static EcoreIMFContextISFImpl                          *_used_ic_impl_list          = 0;
+static EcoreIMFContextISFImpl                          *_free_ic_impl_list          = 0;
+static EcoreIMFContextISF                              *_ic_list                    = 0;
+
+static KeyboardLayout                                   _keyboard_layout            = SCIM_KEYBOARD_Default;
+static int                                              _valid_key_mask             = SCIM_KEY_AllMasks;
+
+static FrontEndHotkeyMatcher                            _frontend_hotkey_matcher;
+static IMEngineHotkeyMatcher                            _imengine_hotkey_matcher;
+
+static IMEngineInstancePointer                          _default_instance;
+
+static ConfigModule                                    *_config_module              = 0;
+static ConfigPointer                                    _config;
+static BackEndPointer                                   _backend;
+
+static EcoreIMFContextISF                              *_focused_ic                 = 0;
+
+static bool                                             _scim_initialized           = false;
+
+static int                                              _instance_count             = 0;
+static int                                              _context_count              = 0;
+
+static IMEngineFactoryPointer                           _fallback_factory;
+static IMEngineInstancePointer                          _fallback_instance;
+static PanelClient                                      _panel_client;
+
+static Ecore_Fd_Handler                                *_panel_iochannel_read_handler = 0;
+static Ecore_Fd_Handler                                *_panel_iochannel_err_handler  = 0;
+
+static Ecore_X_Window                                  _client_window               = 0;
+
+static bool                                             _on_the_spot                = true;
+static bool                                             _shared_input_method        = false;
+
+static Eina_Bool                                        autocap_allow = EINA_FALSE;
+
+static Display *__current_display      = 0;
+static int      __current_alt_mask     = Mod1Mask;
+static int      __current_meta_mask    = 0;
+static int      __current_super_mask   = 0;
+static int      __current_hyper_mask   = 0;
+static int      __current_numlock_mask = Mod2Mask;
+
+// A hack to shutdown the immodule cleanly even if im_module_exit() is not called when exiting.
+class FinalizeHandler
+{
+public:
+   FinalizeHandler()
+     {
+        SCIM_DEBUG_FRONTEND(1) << "FinalizeHandler::FinalizeHandler()\n";
+     }
+   ~FinalizeHandler()
+     {
+        SCIM_DEBUG_FRONTEND(1) << "FinalizeHandler::~FinalizeHandler()\n";
+        isf_imf_context_shutdown();
+     }
+};
+
+static FinalizeHandler                                  _finalize_handler;
+
+static unsigned int
+utf8_offset_to_index(const char *str, int offset)
+{
+   int index = 0;
+   int i;
+   for (i = 0; i < offset; i++)
+     {
+        eina_unicode_utf8_get_next(str, &index);
+     }
+
+   return index;
+}
+
+static unsigned int
+get_time(void)
+{
+   unsigned int tint;
+   struct timeval tv;
+   struct timezone tz;           /* is not used since ages */
+   gettimeofday(&tv, &tz);
+   tint = tv.tv_sec * 1000;
+   tint = tint / 1000 * 1000;
+   tint = tint + tv.tv_usec / 1000;
+   return tint;
+}
+
+/* Function Implementations */
+static EcoreIMFContextISFImpl *
+new_ic_impl(EcoreIMFContextISF *parent)
+{
+   EcoreIMFContextISFImpl *impl = NULL;
+
+   if (_free_ic_impl_list != NULL)
+     {
+        impl = _free_ic_impl_list;
+        _free_ic_impl_list = _free_ic_impl_list->next;
+     }
+   else
+     {
+        impl = new EcoreIMFContextISFImpl;
+        if (impl == NULL)
+          return NULL;
+     }
+
+   impl->uppercase = false;
+   impl->autocapital_type = ECORE_IMF_AUTOCAPITAL_TYPE_NONE;
+   impl->next = _used_ic_impl_list;
+   _used_ic_impl_list = impl;
+
+   impl->parent = parent;
+
+   return impl;
+}
+
+static void
+delete_ic_impl(EcoreIMFContextISFImpl *impl)
+{
+   EcoreIMFContextISFImpl *rec = _used_ic_impl_list, *last = 0;
+
+   for (; rec != 0; last = rec, rec = rec->next)
+     {
+        if (rec == impl)
+          {
+             if (last != 0)
+               last->next = rec->next;
+             else
+               _used_ic_impl_list = rec->next;
+
+             rec->next = _free_ic_impl_list;
+             _free_ic_impl_list = rec;
+
+             rec->parent = 0;
+             rec->si.reset();
+             rec->client_window = 0;
+             rec->preedit_string = WideString();
+             rec->preedit_attrlist.clear();
+
+             return;
+          }
+     }
+}
+
+static void
+delete_all_ic_impl(void)
+{
+   EcoreIMFContextISFImpl *it = _used_ic_impl_list;
+
+   while (it != 0)
+     {
+        _used_ic_impl_list = it->next;
+        delete it;
+        it = _used_ic_impl_list;
+     }
+
+   it = _free_ic_impl_list;
+   while (it != 0)
+     {
+        _free_ic_impl_list = it->next;
+        delete it;
+        it = _free_ic_impl_list;
+     }
+}
+
+static EcoreIMFContextISF *
+find_ic(int id)
+{
+   EcoreIMFContextISFImpl *rec = _used_ic_impl_list;
+
+   while (rec != 0)
+     {
+        if (rec->parent && rec->parent->id == id)
+          return rec->parent;
+        rec = rec->next;
+     }
+
+   return 0;
+}
+
+static Eina_Bool
+analyze_surrounding_text(Ecore_IMF_Context *ctx)
+{
+   char *plain_str = NULL;
+   char *markup_str = NULL;
+   const char *puncs[] = {". ", "! ", "? "};
+   Eina_Bool ret = EINA_FALSE;
+   int cursor_pos = 0;
+   int i = 0;
+   Eina_Unicode *tail = NULL;
+   Eina_Unicode *ustr = NULL;
+   const int punc_num = sizeof(puncs) / sizeof(puncs[0]);
+   Eina_Unicode *uni_puncs[punc_num];
+   EcoreIMFContextISF *context_scim;
+
+   if (!ctx) return EINA_FALSE;
+   context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+   if (!context_scim || !context_scim->impl) return EINA_FALSE;
+
+   switch (context_scim->impl->autocapital_type)
+     {
+      case ECORE_IMF_AUTOCAPITAL_TYPE_NONE:
+         return EINA_FALSE;
+      case ECORE_IMF_AUTOCAPITAL_TYPE_ALLCHARACTER:
+         return EINA_TRUE;
+      default:
+         break;
+     }
+
+   for (i = 0; i < punc_num; i++)
+     uni_puncs[i] = eina_unicode_utf8_to_unicode(puncs[i], NULL);
+
+   ecore_imf_context_surrounding_get(ctx, &markup_str, &cursor_pos);
+   if (!markup_str) goto done;
+
+   if (cursor_pos == 0)
+     {
+        ret = EINA_TRUE;
+        goto done;
+     }
+
+   // Convert into plain string
+   plain_str = evas_textblock_text_markup_to_utf8(NULL, markup_str);
+   if (!plain_str) goto done;
+
+   // Convert string from UTF-8 to unicode
+   ustr = eina_unicode_utf8_to_unicode(plain_str, NULL);
+   if (!ustr) goto done;
+
+   if (cursor_pos >= 1)
+     {
+        if (context_scim->impl->autocapital_type == ECORE_IMF_AUTOCAPITAL_TYPE_WORD)
+          {
+             if (ustr[cursor_pos-1] == ' ')
+               {
+                  ret = EINA_TRUE;
+                  goto done;
+               }
+          }
+
+        // Check paragraph separator <PS> and carriage return  <br>
+        if ((ustr[cursor_pos-1] == 0x2029) || (ustr[cursor_pos-1] == '\n'))
+          {
+             ret = EINA_TRUE;
+             goto done;
+          }
+     }
+
+   // check punctuation
+   if (cursor_pos >= 2)
+     {
+        tail = eina_unicode_strndup(ustr+cursor_pos-2, 2);
+
+        if (tail)
+          {
+             for (i = 0; i < punc_num; i++)
+               {
+                  if (!eina_unicode_strcmp(tail, uni_puncs[i]))
+                    {
+                       ret = EINA_TRUE;
+                       break;
+                    }
+               }
+             free(tail);
+             tail = NULL;
+          }
+     }
+
+done:
+   if (ustr) free(ustr);
+   if (markup_str) free(markup_str);
+   if (plain_str) free(plain_str);
+
+   for (i = 0; i < punc_num; i++)
+     if (uni_puncs[i]) free(uni_puncs[i]);
+
+   return ret;
+}
+
+static void
+caps_mode_check(Ecore_IMF_Context *ctx, Eina_Bool force)
+{
+   Eina_Bool uppercase;
+   EcoreIMFContextISF *context_scim;
+
+   if (!ctx) return;
+   context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (autocap_allow == EINA_FALSE)
+     return;
+
+   // Check autocapital type
+   if (!context_scim || !context_scim->impl)
+     return;
+
+   if (analyze_surrounding_text(ctx))
+     uppercase = EINA_TRUE;
+   else
+     uppercase = EINA_FALSE;
+
+   if (force)
+     context_scim->impl->uppercase = uppercase;
+   else
+     if (context_scim->impl->uppercase != uppercase)
+       context_scim->impl->uppercase = uppercase;
+}
+
+static void
+feed_key_event(Evas *evas, const char *str, Eina_Bool fake)
+{
+   char key_string[128] = {0};
+   unsigned int timestamp = 0;
+
+   if (!fake)
+     timestamp = get_time();
+
+   if (strncmp(str, "KeyRelease+", 11) == 0)
+     {
+        strncpy(key_string, str + 11, strlen(str)-11);
+        evas_event_feed_key_up(evas, key_string, key_string, NULL, NULL, timestamp, NULL);
+        SCIM_DEBUG_FRONTEND(1) << "    evas_event_feed_key_up()...\n";
+     }
+   else
+     {
+        strncpy(key_string, str, strlen(str));
+        evas_event_feed_key_down(evas, key_string, key_string, NULL, NULL, timestamp, NULL);
+        SCIM_DEBUG_FRONTEND(1) << "    evas_event_feed_key_down()...\n";
+     }
+}
+
+static void
+window_to_screen_geometry_get(Ecore_X_Window client_win, int *x, int *y)
+{
+   Ecore_X_Window root_window, win;
+   int win_x, win_y;
+   int sum_x = 0, sum_y = 0;
+
+   root_window = ecore_x_window_root_get(client_win);
+   win = client_win;
+
+   while (root_window != win)
+     {
+        ecore_x_window_geometry_get(win, &win_x, &win_y, NULL, NULL);
+        sum_x += win_x;
+        sum_y += win_y;
+        win = ecore_x_window_parent_get(win);
+     }
+
+   if (x)
+     *x = sum_x;
+   if (y)
+     *y = sum_y;
+}
+
+/* Public functions */
+/**
+ * isf_imf_context_new
+ *
+ * This function will be called by Ecore IMF.
+ * Create a instance of type EcoreIMFContextISF.
+ *
+ * Return value: A pointer to the newly created EcoreIMFContextISF instance
+ */
+EAPI EcoreIMFContextISF *
+isf_imf_context_new(void)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+   char *env;
+
+   EcoreIMFContextISF *context_scim = new EcoreIMFContextISF;
+   if (context_scim == NULL)
+     {
+        std::cerr << "memory allocation failed in " << __FUNCTION__ << "\n";
+        return NULL;
+     }
+
+   context_scim->id = _context_count++;
+
+   if (!_scim_initialized)
+     {
+        initialize();
+        _scim_initialized = true;
+     }
+
+   env = getenv("ECORE_IMF_AUTOCAPITAL_ALLOW");
+   if (env)
+     autocap_allow = !!atoi(env);
+
+   return context_scim;
+}
+
+/**
+ * isf_imf_context_shutdown
+ *
+ * It will be called when the scim im module is unloaded by ecore. It will do some
+ * cleanup job.
+ */
+EAPI void
+isf_imf_context_shutdown(void)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (_scim_initialized)
+     {
+        _scim_initialized = false;
+        finalize();
+     }
+}
+
+EAPI void
+isf_imf_context_add(Ecore_IMF_Context *ctx)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+
+   if (!context_scim) return;
+
+   context_scim->impl = NULL;
+
+   if (_backend.null())
+     return;
+
+   IMEngineInstancePointer si;
+
+   // Use the default instance if "shared input method" mode is enabled.
+   if (_shared_input_method && !_default_instance.null())
+     {
+        si = _default_instance;
+        SCIM_DEBUG_FRONTEND(2) << "use default instance: " << si->get_id() << " " << si->get_factory_uuid() << "\n";
+     }
+
+   // Not in "shared input method" mode, or no default instance, create an instance.
+   if (si.null())
+     {
+        IMEngineFactoryPointer factory = _backend->get_default_factory(_language, "UTF-8");
+        if (factory.null()) return;
+        si = factory->create_instance("UTF-8", _instance_count++);
+        if (si.null()) return;
+        attach_instance(si);
+        SCIM_DEBUG_FRONTEND(2) << "create new instance: " << si->get_id() << " " << si->get_factory_uuid() << "\n";
+     }
+
+   // If "shared input method" mode is enabled, and there is no default instance,
+   // then store this instance as default one.
+   if (_shared_input_method && _default_instance.null())
+     {
+        SCIM_DEBUG_FRONTEND(2) << "update default instance.\n";
+        _default_instance = si;
+     }
+
+   context_scim->ctx                       = ctx;
+   context_scim->impl                      = new_ic_impl(context_scim);
+   if (context_scim->impl == NULL)
+     {
+        std::cerr << "memory allocation failed in " << __FUNCTION__ << "\n";
+        return;
+     }
+
+   context_scim->impl->si                  = si;
+   context_scim->impl->client_window       = 0;
+   context_scim->impl->client_canvas       = NULL;
+   context_scim->impl->preedit_caret       = 0;
+   context_scim->impl->cursor_x            = 0;
+   context_scim->impl->cursor_y            = 0;
+   context_scim->impl->cursor_pos          = -1;
+   context_scim->impl->is_on               = false;
+   context_scim->impl->shared_si           = _shared_input_method;
+   context_scim->impl->use_preedit         = _on_the_spot;
+   context_scim->impl->preedit_started     = false;
+   context_scim->impl->preedit_updating    = false;
+   context_scim->impl->need_commit_preedit = false;
+
+   if (!_ic_list)
+     context_scim->next = NULL;
+   else
+     context_scim->next = _ic_list;
+   _ic_list = context_scim;
+
+   if (_shared_input_method)
+     context_scim->impl->is_on = _config->read(String(SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), context_scim->impl->is_on);
+
+   _panel_client.prepare(context_scim->id);
+   _panel_client.register_input_context(context_scim->id, si->get_factory_uuid());
+   set_ic_capabilities(context_scim);
+   _panel_client.send();
+
+   SCIM_DEBUG_FRONTEND(2) << "input context created: id = " << context_scim->id << "\n";
+}
+
+EAPI void
+isf_imf_context_del(Ecore_IMF_Context *ctx)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (!_ic_list) return;
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+
+   if (context_scim)
+     {
+        if (context_scim->id != _ic_list->id)
+          {
+             EcoreIMFContextISF * pre = _ic_list;
+             EcoreIMFContextISF * cur = _ic_list->next;
+             while (cur != NULL)
+               {
+                  if (cur->id == context_scim->id)
+                    {
+                       pre->next = cur->next;
+                       break;
+                    }
+                  pre = cur;
+                  cur = cur->next;
+               }
+          }
+        else
+          _ic_list = _ic_list->next;
+     }
+
+   if (context_scim && context_scim->impl)
+     {
+        _panel_client.prepare(context_scim->id);
+
+        if (context_scim == _focused_ic)
+          context_scim->impl->si->focus_out();
+
+        // Delete the instance.
+        EcoreIMFContextISF *old_focused = _focused_ic;
+        _focused_ic = context_scim;
+        context_scim->impl->si.reset();
+        _focused_ic = old_focused;
+
+        if (context_scim == _focused_ic)
+          {
+             _panel_client.turn_off(context_scim->id);
+             _panel_client.focus_out(context_scim->id);
+          }
+
+        _panel_client.remove_input_context(context_scim->id);
+        _panel_client.send();
+
+        if (context_scim->impl->client_window)
+          isf_imf_context_client_window_set(ctx, NULL);
+
+        if (context_scim->impl)
+          {
+             delete_ic_impl(context_scim->impl);
+             context_scim->impl = 0;
+          }
+     }
+
+   if (context_scim == _focused_ic)
+     _focused_ic = 0;
+
+   if (context_scim)
+     {
+        delete context_scim;
+        context_scim = 0;
+     }
+}
+
+/**
+ * isf_imf_context_client_canvas_set
+ * @ctx: a #Ecore_IMF_Context
+ * @canvas: the client canvas
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set the client canvas for the Input Method Context; this is the canvas
+ * in which the input appears.
+ *
+ * The canvas type can be determined by using the context canvas type.
+ * Actually only canvas with type "evas" (Evas *) is supported. This canvas
+ * may be used in order to correctly position status windows, and may also
+ * be used for purposes internal to the Input Method Context.
+ */
+EAPI void
+isf_imf_context_client_canvas_set(Ecore_IMF_Context *ctx, void *canvas)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim->impl->client_canvas != (Evas*) canvas)
+     context_scim->impl->client_canvas = (Evas*)canvas;
+}
+
+/**
+ * isf_imf_context_client_window_set
+ * @ctx: a #Ecore_IMF_Context
+ * @window: the client window
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set the client window for the Input Method Context; this is the Ecore_X_Window
+ * when using X11, Ecore_Win32_Window when using Win32, etc.
+ *
+ * This window is used in order to correctly position status windows,
+ * and may also be used for purposes internal to the Input Method Context.
+ */
+EAPI void
+isf_imf_context_client_window_set(Ecore_IMF_Context *ctx, void *window)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim->impl->client_window != (Ecore_X_Window)((Ecore_Window)window))
+     {
+        context_scim->impl->client_window = (Ecore_X_Window)((Ecore_Window)window);
+
+        if ((context_scim->impl->client_window != 0) &&
+            (context_scim->impl->client_window != _client_window))
+          _client_window = context_scim->impl->client_window;
+     }
+}
+
+/**
+ * isf_imf_context_reset
+ * @ctx: a #Ecore_IMF_Context
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that a change such as a change in cursor
+ * position has been made. This will typically cause the Input Method Context
+ * to clear the preedit state.
+ */
+EAPI void
+isf_imf_context_reset(Ecore_IMF_Context *ctx)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim == _focused_ic)
+     {
+        WideString wstr = context_scim->impl->preedit_string;
+
+        _panel_client.prepare(context_scim->id);
+        context_scim->impl->si->reset();
+        _panel_client.send();
+
+        if (context_scim->impl->need_commit_preedit)
+          {
+             if (wstr.length())
+               {
+                  ecore_imf_context_commit_event_add(context_scim->ctx, utf8_wcstombs(wstr).c_str());
+                  ecore_imf_context_event_callback_call(context_scim->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)utf8_wcstombs(wstr).c_str());
+               }
+             _panel_client.prepare(context_scim->id);
+             _panel_client.send();
+          }
+     }
+}
+
+/**
+ * isf_imf_context_focus_in
+ * @ctx: a #Ecore_IMF_Context
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that the widget to which its correspond has gained focus.
+ */
+EAPI void
+isf_imf_context_focus_in(Ecore_IMF_Context *ctx)
+{
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (!context_scim)
+     return;
+
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__<< "(" << context_scim->id << ")...\n";
+
+   if (_focused_ic)
+     {
+        if (_focused_ic == context_scim)
+          {
+             SCIM_DEBUG_FRONTEND(1) << "It's already focused.\n";
+             return;
+          }
+        SCIM_DEBUG_FRONTEND(1) << "Focus out previous IC first: " << _focused_ic->id << "\n";
+        if (_focused_ic->ctx)
+          isf_imf_context_focus_out(_focused_ic->ctx);
+     }
+
+   bool need_cap   = false;
+   bool need_reset = false;
+   bool need_reg   = false;
+
+   if (context_scim && context_scim->impl)
+     {
+        _focused_ic = context_scim;
+        _panel_client.prepare(context_scim->id);
+
+        // Handle the "Shared Input Method" mode.
+        if (_shared_input_method)
+          {
+             SCIM_DEBUG_FRONTEND(2) << "shared input method.\n";
+             IMEngineFactoryPointer factory = _backend->get_default_factory(_language, "UTF-8");
+             if (!factory.null())
+               {
+                  if (_default_instance.null() || _default_instance->get_factory_uuid() != factory->get_uuid())
+                    {
+                       _default_instance = factory->create_instance("UTF-8", _default_instance.null() ? _instance_count++ : _default_instance->get_id());
+                       attach_instance(_default_instance);
+                       SCIM_DEBUG_FRONTEND(2) << "create new default instance: " << _default_instance->get_id() << " " << _default_instance->get_factory_uuid() << "\n";
+                    }
+
+                  context_scim->impl->shared_si = true;
+                  context_scim->impl->si = _default_instance;
+
+                  context_scim->impl->is_on = _config->read(String(SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), context_scim->impl->is_on);
+                  context_scim->impl->preedit_string.clear();
+                  context_scim->impl->preedit_attrlist.clear();
+                  context_scim->impl->preedit_caret = 0;
+                  context_scim->impl->preedit_started = false;
+                  need_cap = true;
+                  need_reset = true;
+                  need_reg = true;
+               }
+          }
+        else if (context_scim->impl->shared_si)
+          {
+             SCIM_DEBUG_FRONTEND(2) << "exit shared input method.\n";
+             IMEngineFactoryPointer factory = _backend->get_default_factory(_language, "UTF-8");
+             if (!factory.null())
+               {
+                  context_scim->impl->si = factory->create_instance("UTF-8", _instance_count++);
+                  context_scim->impl->preedit_string.clear();
+                  context_scim->impl->preedit_attrlist.clear();
+                  context_scim->impl->preedit_caret = 0;
+                  context_scim->impl->preedit_started = false;
+                  attach_instance(context_scim->impl->si);
+                  need_cap = true;
+                  need_reg = true;
+                  context_scim->impl->shared_si = false;
+                  SCIM_DEBUG_FRONTEND(2) << "create new instance: " << context_scim->impl->si->get_id() << " " << context_scim->impl->si->get_factory_uuid() << "\n";
+               }
+          }
+
+        context_scim->impl->si->set_frontend_data(static_cast <void*>(context_scim));
+
+        if (need_reg) _panel_client.register_input_context(context_scim->id, context_scim->impl->si->get_factory_uuid());
+        if (need_cap) set_ic_capabilities(context_scim);
+        if (need_reset) context_scim->impl->si->reset();
+
+        panel_req_focus_in(context_scim);
+        panel_req_update_spot_location(context_scim);
+        panel_req_update_factory_info(context_scim);
+
+        if (context_scim->impl->is_on)
+          {
+             _panel_client.turn_on(context_scim->id);
+             _panel_client.hide_preedit_string(context_scim->id);
+             _panel_client.hide_aux_string(context_scim->id);
+             _panel_client.hide_lookup_table(context_scim->id);
+             context_scim->impl->si->focus_in();
+          }
+        else
+          {
+             _panel_client.turn_off(context_scim->id);
+          }
+
+        _panel_client.send();
+     }
+
+   if (ecore_imf_context_input_panel_enabled_get(ctx))
+     ecore_imf_context_input_panel_show(ctx);
+}
+
+/**
+ * isf_imf_context_focus_out
+ * @ctx: a #Ecore_IMF_Context
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that the widget to which its correspond has lost focus.
+ */
+EAPI void
+isf_imf_context_focus_out(Ecore_IMF_Context *ctx)
+{
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (!context_scim) return;
+
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "(" << context_scim->id << ")...\n";
+
+   if (context_scim && context_scim->impl && context_scim == _focused_ic)
+     {
+        WideString wstr = context_scim->impl->preedit_string;
+
+        if (context_scim->impl->need_commit_preedit)
+          {
+             if (wstr.length())
+               {
+                  ecore_imf_context_commit_event_add(context_scim->ctx, utf8_wcstombs(wstr).c_str());
+                  ecore_imf_context_event_callback_call(context_scim->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)utf8_wcstombs(wstr).c_str());
+               }
+             _panel_client.prepare(context_scim->id);
+             _panel_client.send();
+          }
+
+        _panel_client.prepare(context_scim->id);
+        context_scim->impl->si->focus_out();
+        context_scim->impl->si->reset();
+        _panel_client.turn_off(context_scim->id);
+        _panel_client.focus_out(context_scim->id);
+        _panel_client.send();
+        _focused_ic = 0;
+     }
+
+   if (ecore_imf_context_input_panel_enabled_get(ctx))
+     ecore_imf_context_input_panel_hide(ctx);
+}
+
+/**
+ * isf_imf_context_cursor_location_set
+ * @ctx: a #Ecore_IMF_Context
+ * @x: x position of New cursor.
+ * @y: y position of New cursor.
+ * @w: the width of New cursor.
+ * @h: the height of New cursor.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that a change in the cursor location has been made.
+ */
+EAPI void
+isf_imf_context_cursor_location_set(Ecore_IMF_Context *ctx, int cx, int cy, int cw, int ch)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+   Ecore_Evas *ee;
+   int canvas_x, canvas_y;
+   int new_cursor_x, new_cursor_y;
+
+   if (cw == 0 && ch == 0)
+     return;
+
+   if (context_scim && context_scim->impl && context_scim == _focused_ic)
+     {
+        if (context_scim->impl->client_canvas)
+          {
+             ee = ecore_evas_ecore_evas_get(context_scim->impl->client_canvas);
+             if (!ee) return;
+
+             ecore_evas_geometry_get(ee, &canvas_x, &canvas_y, NULL, NULL);
+          }
+        else
+          {
+             if (context_scim->impl->client_window)
+               window_to_screen_geometry_get(context_scim->impl->client_window, &canvas_x, &canvas_y);
+             else
+               return;
+          }
+
+        new_cursor_x = canvas_x + cx;
+        new_cursor_y = canvas_y + cy + ch;
+
+        // Don't update spot location while updating preedit string.
+        if (context_scim->impl->preedit_updating && (context_scim->impl->cursor_y == new_cursor_y))
+          return;
+
+        if (context_scim->impl->cursor_x != new_cursor_x || context_scim->impl->cursor_y != new_cursor_y)
+          {
+             context_scim->impl->cursor_x     = new_cursor_x;
+             context_scim->impl->cursor_y     = new_cursor_y;
+             _panel_client.prepare(context_scim->id);
+             panel_req_update_spot_location(context_scim);
+             _panel_client.send();
+             SCIM_DEBUG_FRONTEND(2) << "new cursor location = " << context_scim->impl->cursor_x << "," << context_scim->impl->cursor_y << "\n";
+          }
+     }
+}
+
+/**
+ * isf_imf_context_use_preedit_set
+ * @ctx: a #Ecore_IMF_Context
+ * @use_preedit: Whether the IM context should use the preedit string.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set whether the IM context should use the preedit string to display feedback.
+ * If is 0 (default is 1), then the IM context may use some other method to
+ * display feedback, such as displaying it in a child of the root window.
+ */
+EAPI void
+isf_imf_context_use_preedit_set(Ecore_IMF_Context* ctx, Eina_Bool use_preedit)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " = " << (use_preedit ? "true" : "false") << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+
+   if (!_on_the_spot) return;
+
+   if (context_scim && context_scim->impl)
+     {
+        bool old = context_scim->impl->use_preedit;
+        context_scim->impl->use_preedit = use_preedit;
+        if (context_scim == _focused_ic)
+          {
+             _panel_client.prepare(context_scim->id);
+
+             if (old != use_preedit)
+               set_ic_capabilities(context_scim);
+
+             if (context_scim->impl->preedit_string.length())
+               slot_show_preedit_string(context_scim->impl->si);
+
+             _panel_client.send();
+          }
+     }
+}
+
+EAPI void
+isf_imf_context_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, char** str, Eina_List **attrs, int *cursor_pos)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim->impl->is_on)
+     {
+        String mbs = utf8_wcstombs(context_scim->impl->preedit_string);
+
+        if (str)
+          {
+             if (mbs.length())
+               *str = strdup(mbs.c_str());
+             else
+               *str = strdup("");
+          }
+
+        if (cursor_pos)
+          {
+             *cursor_pos = context_scim->impl->preedit_caret;
+          }
+
+        if (attrs)
+          {
+             if (mbs.length())
+               {
+                  int start_index, end_index;
+                  int wlen = context_scim->impl->preedit_string.length();
+
+                  Ecore_IMF_Preedit_Attr *attr = NULL;
+                  AttributeList::const_iterator i;
+                  bool *attrs_flag = new bool [mbs.length()];
+                  memset(attrs_flag, 0, mbs.length() *sizeof(bool));
+
+                  for (i = context_scim->impl->preedit_attrlist.begin();
+                       i != context_scim->impl->preedit_attrlist.end(); ++i)
+                    {
+                       start_index = i->get_start();
+                       end_index = i->get_end();
+
+                       if (end_index <= wlen && start_index < end_index && i->get_type() != SCIM_ATTR_DECORATE_NONE)
+                         {
+                            start_index = utf8_offset_to_index(mbs.c_str(), i->get_start());
+                            end_index = utf8_offset_to_index(mbs.c_str(), i->get_end());
+
+                            if (i->get_type() == SCIM_ATTR_DECORATE)
+                              {
+                                 attr = (Ecore_IMF_Preedit_Attr *)calloc(1, sizeof(Ecore_IMF_Preedit_Attr));
+                                 if (attr == NULL)
+                                   continue;
+                                 attr->start_index = start_index;
+                                 attr->end_index = end_index;
+
+                                 if (i->get_value() == SCIM_ATTR_DECORATE_UNDERLINE)
+                                   {
+                                      attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB1;
+                                      *attrs = eina_list_append(*attrs, (void *)attr);
+                                   }
+                                 else if (i->get_value() == SCIM_ATTR_DECORATE_REVERSE)
+                                   {
+                                      attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB2;
+                                      *attrs = eina_list_append(*attrs, (void *)attr);
+                                   }
+                                 else if (i->get_value() == SCIM_ATTR_DECORATE_HIGHLIGHT)
+                                   {
+                                      attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB3;
+                                      *attrs = eina_list_append(*attrs, (void *)attr);
+                                   }
+                                 else
+                                   {
+                                      free(attr);
+                                   }
+
+                                 switch(i->get_value())
+                                   {
+                                    case SCIM_ATTR_DECORATE_UNDERLINE:
+                                    case SCIM_ATTR_DECORATE_REVERSE:
+                                    case SCIM_ATTR_DECORATE_HIGHLIGHT:
+                                       // Record which character has attribute.
+                                       for (int pos = start_index; pos < end_index; ++pos)
+                                         attrs_flag [pos] = 1;
+                                       break;
+                                    default:
+                                       break;
+                                   }
+                            }
+                            else if (i->get_type() == SCIM_ATTR_FOREGROUND)
+                              {
+                                 SCIM_DEBUG_FRONTEND(4) << "SCIM_ATTR_FOREGROUND\n";
+                              }
+                            else if (i->get_type() == SCIM_ATTR_BACKGROUND)
+                              {
+                                 SCIM_DEBUG_FRONTEND(4) << "SCIM_ATTR_BACKGROUND\n";
+                              }
+                         }
+                    }
+
+                  // Add underline for all characters which don't have attribute.
+                  for (unsigned int pos = 0; pos < mbs.length(); ++pos)
+                    {
+                       if (!attrs_flag [pos])
+                         {
+                            int begin_pos = pos;
+
+                            while (pos < mbs.length() && !attrs_flag[pos])
+                              ++pos;
+
+                            // use REVERSE style as default
+                            attr = (Ecore_IMF_Preedit_Attr *)calloc(1, sizeof(Ecore_IMF_Preedit_Attr));
+                            if (attr == NULL)
+                              continue;
+                            attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB2;
+                            attr->start_index = begin_pos;
+                            attr->end_index = pos;
+                            *attrs = eina_list_append(*attrs, (void *)attr);
+                         }
+                    }
+
+                  delete [] attrs_flag;
+               }
+          }
+     }
+   else
+     {
+        if (str)
+          *str = strdup("");
+
+        if (cursor_pos)
+          *cursor_pos = 0;
+
+        if (attrs)
+          *attrs = NULL;
+     }
+}
+
+/**
+ * isf_imf_context_preedit_string_get
+ * @ctx: a #Ecore_IMF_Context
+ * @str: the preedit string
+ * @cursor_pos: the cursor position
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * To get the preedit string of the input method.
+ */
+EAPI void
+isf_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char** str, int *cursor_pos)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim->impl->is_on)
+     {
+        String mbs = utf8_wcstombs(context_scim->impl->preedit_string);
+
+        if (str)
+          {
+             if (mbs.length())
+               *str = strdup(mbs.c_str());
+             else
+               *str = strdup("");
+          }
+
+        if (cursor_pos)
+          *cursor_pos = context_scim->impl->preedit_caret;
+     }
+   else
+     {
+        if (str)
+          *str = strdup("");
+
+        if (cursor_pos)
+          *cursor_pos = 0;
+     }
+}
+
+/**
+ * isf_imf_context_cursor_position_set
+ * @ctx: a #Ecore_IMF_Context
+ * @cursor_pos: New cursor position in characters.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Notify the Input Method Context that a change in the cursor position has been made.
+ */
+EAPI void
+isf_imf_context_cursor_position_set(Ecore_IMF_Context *ctx, int cursor_pos)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim == _focused_ic)
+     {
+        // Don't update spot location while updating preedit string.
+        if (context_scim->impl->preedit_updating)
+          return;
+
+        if (context_scim->impl->cursor_pos != cursor_pos)
+          {
+             context_scim->impl->cursor_pos = cursor_pos;
+             caps_mode_check(ctx, EINA_FALSE);
+          }
+     }
+}
+
+/**
+ * isf_imf_context_input_mode_set
+ * @ctx: a #Ecore_IMF_Context
+ * @input_mode: the input mode
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * To set the input mode of input method. The definition of Ecore_IMF_Input_Mode
+ * is in Ecore_IMF.h.
+ */
+EAPI void
+isf_imf_context_input_mode_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+   if (context_scim && context_scim->impl)
+     context_scim->impl->input_mode = input_mode;
+}
+
+/**
+ * isf_imf_context_prediction_allow_set
+ * @ctx: a #Ecore_IMF_Context
+ * @use_prediction: Whether the IM context should use the prediction.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Set whether the IM context should use the prediction.
+ */
+EAPI void
+isf_imf_context_prediction_allow_set(Ecore_IMF_Context* ctx, Eina_Bool prediction)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " = " << (prediction ? "true" : "false") << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim->impl->prediction_allow != prediction)
+     context_scim->impl->prediction_allow = prediction;
+}
+
+EAPI void
+isf_imf_context_autocapital_type_set(Ecore_IMF_Context* ctx, Ecore_IMF_Autocapital_Type autocapital_type)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " = " << autocapital_type << "...\n";
+
+   EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get(ctx);
+
+   if (context_scim && context_scim->impl && context_scim->impl->autocapital_type != autocapital_type)
+     context_scim->impl->autocapital_type = autocapital_type;
+}
+
+/**
+ * isf_imf_context_filter_event
+ * @ctx: a #Ecore_IMF_Context
+ * @type: The type of event defined by Ecore_IMF_Event_Type.
+ * @event: The event itself.
+ * Return value: %TRUE if the input method handled the key event.
+ *
+ * This function will be called by Ecore IMF.
+ *
+ * Allow an Ecore Input Context to internally handle an event. If this function
+ * returns 1, then no further processing should be done for this event. Input
+ * methods must be able to accept all types of events (simply returning 0 if
+ * the event was not handled), but there is no obligation of any events to be
+ * submitted to this function.
+ */
+EAPI Eina_Bool
+isf_imf_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+   Eina_Bool ret = EINA_FALSE;
+
+   if (ic == NULL || ic->impl == NULL)
+     return ret;
+
+   KeyEvent key;
+
+   if (type == ECORE_IMF_EVENT_KEY_DOWN)
+     {
+        Ecore_IMF_Event_Key_Down *ev = (Ecore_IMF_Event_Key_Down *)event;
+        scim_string_to_key(key, ev->key);
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_SHIFT) key.mask |=SCIM_KEY_ShiftMask;
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_CTRL) key.mask |=SCIM_KEY_ControlMask;
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_ALT) key.mask |=SCIM_KEY_AltMask;
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_ALTGR) key.mask |=SCIM_KEY_Mod5Mask;
+        if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_CAPS) key.mask |=SCIM_KEY_CapsLockMask;
+        if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_NUM) key.mask |=SCIM_KEY_NumLockMask;
+     }
+   else if (type == ECORE_IMF_EVENT_KEY_UP)
+     {
+        Ecore_IMF_Event_Key_Up *ev = (Ecore_IMF_Event_Key_Up *)event;
+        scim_string_to_key(key, ev->key);
+        key.mask = SCIM_KEY_ReleaseMask;
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_SHIFT) key.mask |=SCIM_KEY_ShiftMask;
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_CTRL) key.mask |=SCIM_KEY_ControlMask;
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_ALT) key.mask |=SCIM_KEY_AltMask;
+        if (ev->modifiers & ECORE_IMF_KEYBOARD_MODIFIER_ALTGR) key.mask |=SCIM_KEY_Mod5Mask;
+        if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_CAPS) key.mask |=SCIM_KEY_CapsLockMask;
+        if (ev->locks & ECORE_IMF_KEYBOARD_LOCK_NUM) key.mask |=SCIM_KEY_NumLockMask;
+     }
+   else
+     {
+        return ret;
+     }
+
+   key.mask &= _valid_key_mask;
+
+   _panel_client.prepare(ic->id);
+
+   ret = EINA_TRUE;
+   if (!filter_hotkeys(ic, key))
+     {
+        if (!_focused_ic || !_focused_ic->impl->is_on ||
+            !_focused_ic->impl->si->process_key_event(key))
+          ret = EINA_FALSE;
+     }
+
+   _panel_client.send();
+
+   return ret;
+}
+
+EAPI void
+isf_imf_context_input_panel_show(Ecore_IMF_Context *ctx)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+   if (ic == NULL || ic->impl == NULL)
+     return;
+
+   ecore_x_e_virtual_keyboard_state_set
+        (ic->impl->client_window, ECORE_X_VIRTUAL_KEYBOARD_STATE_ON);
+}
+
+EAPI void
+isf_imf_context_input_panel_hide(Ecore_IMF_Context *ctx)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = (EcoreIMFContextISF*)ecore_imf_context_data_get(ctx);
+   if (ic == NULL || ic->impl == NULL)
+     return;
+
+   ecore_x_e_virtual_keyboard_state_set
+        (ic->impl->client_window, ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF);
+}
+
+/* Panel Slot functions */
+static void
+panel_slot_reload_config(int context __UNUSED__)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+   _config->reload();
+}
+
+static void
+panel_slot_exit(int /* context */)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   finalize();
+}
+
+static void
+panel_slot_update_lookup_table_page_size(int context, int page_size)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " page_size=" << page_size << " ic=" << ic << "\n";
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        ic->impl->si->update_lookup_table_page_size(page_size);
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_lookup_table_page_up(int context)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        ic->impl->si->lookup_table_page_up();
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_lookup_table_page_down(int context)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        ic->impl->si->lookup_table_page_down();
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_trigger_property(int context, const String &property)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " property=" << property << " ic=" << ic << "\n";
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        ic->impl->si->trigger_property(property);
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_process_helper_event(int context, const String &target_uuid, const String &helper_uuid, const Transaction &trans)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " target=" << target_uuid
+      << " helper=" << helper_uuid << " ic=" << ic << " ic->impl=" << (ic ? ic->impl : 0) << " ic-uuid="
+      << ((ic && ic->impl) ? ic->impl->si->get_factory_uuid() : "" ) << "\n";
+   if (ic && ic->impl && ic->impl->si->get_factory_uuid() == target_uuid)
+     {
+        _panel_client.prepare(ic->id);
+        SCIM_DEBUG_FRONTEND(2) << "call process_helper_event\n";
+        ic->impl->si->process_helper_event(helper_uuid, trans);
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_move_preedit_caret(int context, int caret_pos)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " caret=" << caret_pos << " ic=" << ic << "\n";
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        ic->impl->si->move_preedit_caret(caret_pos);
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_select_candidate(int context, int cand_index)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " candidate=" << cand_index << " ic=" << ic << "\n";
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        ic->impl->si->select_candidate(cand_index);
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_process_key_event(int context, const KeyEvent &key)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " key=" << key.get_key_string() << " ic=" << ic << "\n";
+
+   if (key.is_key_press())
+     ecore_x_test_fake_key_press(key.get_key_string().c_str());
+}
+
+static void
+panel_slot_commit_string(int context, const WideString &wstr)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " str=" << utf8_wcstombs(wstr) << " ic=" << ic << "\n";
+
+   if (ic && ic->impl)
+     {
+        if (_focused_ic != ic)
+          return;
+
+        ecore_imf_context_commit_event_add(ic->ctx, utf8_wcstombs(wstr).c_str());
+        ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)utf8_wcstombs(wstr).c_str());
+     }
+}
+
+static void
+panel_slot_forward_key_event(int context, const KeyEvent &key)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " key=" << key.get_key_string() << " ic=" << ic << "\n";
+
+   if (ic && ic->impl && ic->impl->client_canvas)
+     feed_key_event(ic->impl->client_canvas, key.get_key_string().c_str(), EINA_TRUE);
+}
+
+static void
+panel_slot_request_help(int context)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        panel_req_show_help(ic);
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_request_factory_menu(int context)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " ic=" << ic << "\n";
+
+   if (ic && ic->impl)
+     {
+        _panel_client.prepare(ic->id);
+        panel_req_show_factory_menu(ic);
+        _panel_client.send();
+     }
+}
+
+static void
+panel_slot_change_factory(int context, const String &uuid)
+{
+   EcoreIMFContextISF *ic = find_ic(context);
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " factory=" << uuid << " ic=" << ic << "\n";
+
+   if (ic && ic->impl)
+     {
+        ic->impl->si->reset();
+        _panel_client.prepare(ic->id);
+        open_specific_factory(ic, uuid);
+        _panel_client.send();
+     }
+}
+
+/* Panel Requestion functions. */
+static void
+panel_req_show_help(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   String help;
+
+   help =  String("Smart Common Input Method platform ") +
+      //String(SCIM_VERSION) +
+      String("\n(C) 2002-2005 James Su <suzhe@tsinghua.org.cn>\n\n");
+
+   if (ic && ic->impl)
+     {
+        IMEngineFactoryPointer sf = _backend->get_factory(ic->impl->si->get_factory_uuid());
+        if (sf)
+          {
+             help += utf8_wcstombs(sf->get_name());
+             help += String(":\n\n");
+
+             help += utf8_wcstombs(sf->get_help());
+             help += String("\n\n");
+
+             help += utf8_wcstombs(sf->get_credits());
+          }
+        _panel_client.show_help(ic->id, help);
+     }
+}
+
+static void
+panel_req_show_factory_menu(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   std::vector<IMEngineFactoryPointer> factories;
+   std::vector <PanelFactoryInfo> menu;
+
+   _backend->get_factories_for_encoding(factories, "UTF-8");
+
+   for (size_t i = 0; i < factories.size(); ++ i)
+     {
+        menu.push_back(PanelFactoryInfo(
+              factories [i]->get_uuid(),
+              utf8_wcstombs(factories [i]->get_name()),
+              factories [i]->get_language(),
+              factories [i]->get_icon_file()));
+     }
+
+   if (menu.size())
+     _panel_client.show_factory_menu(ic->id, menu);
+}
+
+static void
+panel_req_update_factory_info(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (ic && ic->impl && ic == _focused_ic)
+     {
+        PanelFactoryInfo info;
+        if (ic->impl->is_on)
+          {
+             IMEngineFactoryPointer sf = _backend->get_factory(ic->impl->si->get_factory_uuid());
+             if (sf)
+               info = PanelFactoryInfo(sf->get_uuid(), utf8_wcstombs(sf->get_name()), sf->get_language(), sf->get_icon_file());
+          }
+        else
+          {
+             info = PanelFactoryInfo(String(""), String("English/Keyboard"), String("C"), "");
+          }
+        _panel_client.update_factory_info(ic->id, info);
+     }
+}
+
+static void
+panel_req_focus_in(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   _panel_client.focus_in(ic->id, ic->impl->si->get_factory_uuid());
+}
+
+static void
+panel_req_update_spot_location(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   _panel_client.update_spot_location(ic->id, ic->impl->cursor_x, ic->impl->cursor_y);
+}
+
+static bool
+filter_hotkeys(EcoreIMFContextISF *ic, const KeyEvent &key)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   bool ret = false;
+
+   _frontend_hotkey_matcher.push_key_event(key);
+   _imengine_hotkey_matcher.push_key_event(key);
+
+   FrontEndHotkeyAction hotkey_action = _frontend_hotkey_matcher.get_match_result();
+
+   if (hotkey_action == SCIM_FRONTEND_HOTKEY_TRIGGER)
+     {
+        if (!ic->impl->is_on)
+          turn_on_ic(ic);
+        else
+          turn_off_ic(ic);
+        ret = true;
+     }
+   else if (hotkey_action == SCIM_FRONTEND_HOTKEY_ON)
+     {
+        if (!ic->impl->is_on)
+          turn_on_ic(ic);
+        ret = true;
+     }
+   else if (hotkey_action == SCIM_FRONTEND_HOTKEY_OFF)
+     {
+        if (ic->impl->is_on)
+          turn_off_ic(ic);
+        ret = true;
+     }
+   else if (hotkey_action == SCIM_FRONTEND_HOTKEY_NEXT_FACTORY)
+     {
+        open_next_factory(ic);
+        ret = true;
+     }
+   else if (hotkey_action == SCIM_FRONTEND_HOTKEY_PREVIOUS_FACTORY)
+     {
+        open_previous_factory(ic);
+        ret = true;
+     }
+   else if (hotkey_action == SCIM_FRONTEND_HOTKEY_SHOW_FACTORY_MENU)
+     {
+        panel_req_show_factory_menu(ic);
+        ret = true;
+     }
+   else if (_imengine_hotkey_matcher.is_matched())
+     {
+        String sfid = _imengine_hotkey_matcher.get_match_result();
+        open_specific_factory(ic, sfid);
+        ret = true;
+     }
+   return ret;
+}
+
+static bool
+panel_initialize(void)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   String display_name;
+     {
+        const char *p = getenv("DISPLAY");
+        if (p) display_name = String(p);
+     }
+
+   if (_panel_client.open_connection(_config->get_name(), display_name) >= 0)
+     {
+        int fd = _panel_client.get_connection_number();
+
+        _panel_iochannel_read_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, panel_iochannel_handler, NULL, NULL, NULL);
+
+        SCIM_DEBUG_FRONTEND(2) << " Panel FD= " << fd << "\n";
+
+        return true;
+   }
+   std::cerr << "panel_initialize() failed!!!\n";
+   return false;
+}
+
+static void
+panel_finalize(void)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   _panel_client.close_connection();
+
+   if (_panel_iochannel_read_handler)
+     {
+        ecore_main_fd_handler_del(_panel_iochannel_read_handler);
+        _panel_iochannel_read_handler = 0;
+     }
+
+   if (_panel_iochannel_err_handler)
+     {
+        ecore_main_fd_handler_del(_panel_iochannel_err_handler);
+        _panel_iochannel_err_handler = 0;
+     }
+}
+
+static Eina_Bool
+panel_iochannel_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (fd_handler == _panel_iochannel_read_handler)
+     {
+        if (!_panel_client.filter_event())
+          {
+             panel_finalize();
+             panel_initialize();
+             return ECORE_CALLBACK_CANCEL;
+          }
+     }
+   else if (fd_handler == _panel_iochannel_err_handler)
+     {
+        panel_finalize();
+        panel_initialize();
+        return ECORE_CALLBACK_CANCEL;
+     }
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+turn_on_ic(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (ic && ic->impl && !ic->impl->is_on)
+     {
+        ic->impl->is_on = true;
+
+        if (ic == _focused_ic)
+          {
+             panel_req_focus_in(ic);
+             panel_req_update_spot_location(ic);
+             panel_req_update_factory_info(ic);
+             _panel_client.turn_on(ic->id);
+             _panel_client.hide_preedit_string(ic->id);
+             _panel_client.hide_aux_string(ic->id);
+             _panel_client.hide_lookup_table(ic->id);
+             ic->impl->si->focus_in();
+          }
+
+        //Record the IC on/off status
+        if (_shared_input_method)
+          _config->write(String(SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), true);
+
+        if (ic->impl->use_preedit && ic->impl->preedit_string.length())
+          {
+             ecore_imf_context_preedit_start_event_add(ic->ctx);
+             ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_START, NULL);
+             ecore_imf_context_preedit_changed_event_add(ic->ctx);
+             ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+             ic->impl->preedit_started = true;
+          }
+     }
+}
+
+static void
+turn_off_ic(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (ic && ic->impl && ic->impl->is_on)
+     {
+        ic->impl->is_on = false;
+
+        if (ic == _focused_ic)
+          {
+             ic->impl->si->focus_out();
+
+             panel_req_update_factory_info(ic);
+             _panel_client.turn_off(ic->id);
+          }
+
+        //Record the IC on/off status
+        if (_shared_input_method)
+          _config->write(String(SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), false);
+
+        if (ic->impl->use_preedit && ic->impl->preedit_string.length())
+          {
+             ecore_imf_context_preedit_changed_event_add(ic->ctx);
+             ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+             ecore_imf_context_preedit_end_event_add(ic->ctx);
+             ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+             ic->impl->preedit_started = false;
+          }
+     }
+}
+
+static void
+set_ic_capabilities(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (ic && ic->impl)
+     {
+        unsigned int cap = SCIM_CLIENT_CAP_ALL_CAPABILITIES;
+
+        if (!_on_the_spot || !ic->impl->use_preedit)
+          cap -= SCIM_CLIENT_CAP_ONTHESPOT_PREEDIT;
+
+        ic->impl->si->update_client_capabilities(cap);
+     }
+}
+
+static bool
+check_socket_frontend(void)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   SocketAddress address;
+   SocketClient client;
+
+   uint32 magic;
+
+   address.set_address(scim_get_default_socket_frontend_address());
+
+   if (!client.connect(address))
+     return false;
+
+   if (!scim_socket_open_connection(magic,
+                                    String("ConnectionTester"),
+                                    String("SocketFrontEnd"),
+                                    client,
+                                    1000))
+        return false;
+
+   return true;
+}
+
+void
+initialize(void)
+{
+   std::vector<String>     config_list;
+   std::vector<String>     engine_list;
+   std::vector<String>     load_engine_list;
+
+   std::vector<String>::iterator it;
+
+   bool                    manual = false;
+
+   bool                    socket = true;
+
+   String                  config_module_name = "simple";
+
+   printf("Initializing Ecore SCIM IMModule...\n");
+
+   SCIM_DEBUG_FRONTEND(1) << "Initializing Ecore SCIM IMModule...\n";
+
+   // Get system language.
+   _language = scim_get_locale_language(scim_get_current_locale());
+
+   if (socket)
+     {
+        // If no Socket FrontEnd is running, then launch one.
+        // And set manual to false.
+        bool check_result = check_socket_frontend();
+        if (!check_result)
+          {
+             std::cerr << "Launching a SCIM daemon with Socket FrontEnd...\n";
+             //get modules list
+             scim_get_imengine_module_list(engine_list);
+
+             for (it = engine_list.begin(); it != engine_list.end(); it++)
+               {
+                  if (*it != "socket")
+                    load_engine_list.push_back(*it);
+               }
+
+             const char *new_argv [] = { "--no-stay", 0 };
+             scim_launch(true,
+                         config_module_name,
+                         (load_engine_list.size() ? scim_combine_string_list(load_engine_list, ',') : "none"),
+                         "socket",
+                         (char **)new_argv);
+             manual = false;
+          }
+
+        // If there is one Socket FrontEnd running and it's not manual mode,
+        // then just use this Socket Frontend.
+        if (!manual)
+          {
+             for (int i = 0; i < 200; ++i)
+               {
+                  if (check_result)
+                    {
+                       config_module_name = "socket";
+                       load_engine_list.clear();
+                       load_engine_list.push_back("socket");
+                       break;
+                    }
+                  scim_usleep(50000);
+                  check_result = check_socket_frontend();
+               }
+          }
+     }
+
+   if (config_module_name != "dummy")
+     {
+        //load config module
+        SCIM_DEBUG_FRONTEND(1) << "Loading Config module: " << config_module_name << "...\n";
+        _config_module = new ConfigModule(config_module_name);
+
+        //create config instance
+        if (_config_module != NULL && _config_module->valid())
+          _config = _config_module->create_config();
+     }
+
+   if (_config.null())
+     {
+        SCIM_DEBUG_FRONTEND(1) << "Config module cannot be loaded, using dummy Config.\n";
+
+        if (_config_module) delete _config_module;
+        _config_module = NULL;
+
+        _config = new DummyConfig();
+        config_module_name = "dummy";
+     }
+
+   reload_config_callback(_config);
+   _config->signal_connect_reload(slot(reload_config_callback));
+
+   // create backend
+   _backend = new CommonBackEnd(_config, load_engine_list.size() ? load_engine_list : engine_list);
+
+   if (_backend.null())
+     std::cerr << "Cannot create BackEnd Object!\n";
+   else
+     _fallback_factory = _backend->get_factory(SCIM_COMPOSE_KEY_FACTORY_UUID);
+
+   if (_fallback_factory.null())
+     _fallback_factory = new DummyIMEngineFactory();
+
+   _fallback_instance = _fallback_factory->create_instance(String("UTF-8"), 0);
+   _fallback_instance->signal_connect_commit_string(slot(fallback_commit_string_cb));
+
+   // Attach Panel Client signal.
+   _panel_client.signal_connect_reload_config                (slot(panel_slot_reload_config));
+   _panel_client.signal_connect_exit                         (slot(panel_slot_exit));
+   _panel_client.signal_connect_update_lookup_table_page_size(slot(panel_slot_update_lookup_table_page_size));
+   _panel_client.signal_connect_lookup_table_page_up         (slot(panel_slot_lookup_table_page_up));
+   _panel_client.signal_connect_lookup_table_page_down       (slot(panel_slot_lookup_table_page_down));
+   _panel_client.signal_connect_trigger_property             (slot(panel_slot_trigger_property));
+   _panel_client.signal_connect_process_helper_event         (slot(panel_slot_process_helper_event));
+   _panel_client.signal_connect_move_preedit_caret           (slot(panel_slot_move_preedit_caret));
+   _panel_client.signal_connect_select_candidate             (slot(panel_slot_select_candidate));
+   _panel_client.signal_connect_process_key_event            (slot(panel_slot_process_key_event));
+   _panel_client.signal_connect_commit_string                (slot(panel_slot_commit_string));
+   _panel_client.signal_connect_forward_key_event            (slot(panel_slot_forward_key_event));
+   _panel_client.signal_connect_request_help                 (slot(panel_slot_request_help));
+   _panel_client.signal_connect_request_factory_menu         (slot(panel_slot_request_factory_menu));
+   _panel_client.signal_connect_change_factory               (slot(panel_slot_change_factory));
+
+   if (!panel_initialize())
+     std::cerr << "Ecore IM Module: Cannot connect to Panel!\n";
+}
+
+static void
+finalize(void)
+{
+   SCIM_DEBUG_FRONTEND(1) << "Finalizing Ecore ISF IMModule...\n";
+
+   // Reset this first so that the shared instance could be released correctly afterwards.
+   _default_instance.reset();
+
+   SCIM_DEBUG_FRONTEND(2) << "Finalize all IC partially.\n";
+   while (_used_ic_impl_list)
+     {
+        // In case in "shared input method" mode,
+        // all contexts share only one instance,
+        // so we need point the reference pointer correctly before finalizing.
+        _used_ic_impl_list->si->set_frontend_data(static_cast <void*>(_used_ic_impl_list->parent));
+        isf_imf_context_del(_used_ic_impl_list->parent->ctx);
+     }
+
+   delete_all_ic_impl();
+
+   _fallback_instance.reset();
+   _fallback_factory.reset();
+
+   SCIM_DEBUG_FRONTEND(2) << " Releasing BackEnd...\n";
+   _backend.reset();
+
+   SCIM_DEBUG_FRONTEND(2) << " Releasing Config...\n";
+   _config.reset();
+
+   if (_config_module)
+     {
+        SCIM_DEBUG_FRONTEND(2) << " Deleting _config_module...\n";
+        delete _config_module;
+        _config_module = 0;
+     }
+
+   _focused_ic = NULL;
+   _ic_list = NULL;
+
+   _scim_initialized = false;
+
+   panel_finalize();
+}
+
+static void
+open_next_factory(EcoreIMFContextISF *ic)
+{
+   SCIM_DEBUG_FRONTEND(2) << __FUNCTION__ << " context=" << ic->id << "\n";
+   IMEngineFactoryPointer sf = _backend->get_next_factory("", "UTF-8", ic->impl->si->get_factory_uuid());
+
+   if (!sf.null())
+     {
+        turn_off_ic(ic);
+        ic->impl->si = sf->create_instance("UTF-8", ic->impl->si->get_id());
+        ic->impl->si->set_frontend_data(static_cast <void*>(ic));
+        ic->impl->preedit_string = WideString();
+        ic->impl->preedit_caret = 0;
+        attach_instance(ic->impl->si);
+        _backend->set_default_factory(_language, sf->get_uuid());
+        _panel_client.register_input_context(ic->id, sf->get_uuid());
+        set_ic_capabilities(ic);
+        turn_on_ic(ic);
+
+        if (_shared_input_method)
+          {
+             _default_instance = ic->impl->si;
+             ic->impl->shared_si = true;
+          }
+     }
+}
+
+static void
+open_previous_factory(EcoreIMFContextISF *ic)
+{
+   if (ic == NULL)
+     return;
+
+   SCIM_DEBUG_FRONTEND(2) << __FUNCTION__ << " context=" << ic->id << "\n";
+   IMEngineFactoryPointer sf = _backend->get_previous_factory("", "UTF-8", ic->impl->si->get_factory_uuid());
+
+   if (!sf.null())
+     {
+        turn_off_ic(ic);
+        ic->impl->si = sf->create_instance("UTF-8", ic->impl->si->get_id());
+        ic->impl->si->set_frontend_data(static_cast <void*>(ic));
+        ic->impl->preedit_string = WideString();
+        ic->impl->preedit_caret = 0;
+        attach_instance(ic->impl->si);
+        _backend->set_default_factory(_language, sf->get_uuid());
+        _panel_client.register_input_context(ic->id, sf->get_uuid());
+        set_ic_capabilities(ic);
+        turn_on_ic(ic);
+
+        if (_shared_input_method)
+          {
+             _default_instance = ic->impl->si;
+             ic->impl->shared_si = true;
+          }
+     }
+}
+
+static void
+open_specific_factory(EcoreIMFContextISF *ic,
+                       const String     &uuid)
+{
+   if (ic == NULL)
+     return;
+
+   SCIM_DEBUG_FRONTEND(2) << __FUNCTION__ << " context=" << ic->id << "\n";
+
+   // The same input method is selected, just turn on the IC.
+   if (ic->impl->si->get_factory_uuid() == uuid)
+     {
+        turn_on_ic(ic);
+        return;
+     }
+
+   IMEngineFactoryPointer sf = _backend->get_factory(uuid);
+
+   if (uuid.length() && !sf.null())
+     {
+        turn_off_ic(ic);
+        ic->impl->si = sf->create_instance("UTF-8", ic->impl->si->get_id());
+        ic->impl->si->set_frontend_data(static_cast <void*>(ic));
+        ic->impl->preedit_string = WideString();
+        ic->impl->preedit_caret = 0;
+        attach_instance(ic->impl->si);
+        _backend->set_default_factory(_language, sf->get_uuid());
+        _panel_client.register_input_context(ic->id, sf->get_uuid());
+        set_ic_capabilities(ic);
+        turn_on_ic(ic);
+
+        if (_shared_input_method)
+          {
+             _default_instance = ic->impl->si;
+             ic->impl->shared_si = true;
+          }
+     }
+   else
+     {
+        // turn_off_ic comment out panel_req_update_factory_info()
+        turn_off_ic(ic);
+        if (ic && ic->impl->is_on)
+          {
+             ic->impl->is_on = false;
+
+             if (ic == _focused_ic)
+               {
+                  ic->impl->si->focus_out();
+
+                  panel_req_update_factory_info(ic);
+                  _panel_client.turn_off(ic->id);
+               }
+
+             //Record the IC on/off status
+             if (_shared_input_method)
+               _config->write(String(SCIM_CONFIG_FRONTEND_IM_OPENED_BY_DEFAULT), false);
+
+             if (ic->impl->use_preedit && ic->impl->preedit_string.length())
+               {
+                  ecore_imf_context_preedit_changed_event_add(ic->ctx);
+                  ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+                  ecore_imf_context_preedit_end_event_add(ic->ctx);
+                  ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+                  ic->impl->preedit_started = false;
+               }
+          }
+     }
+}
+
+static void initialize_modifier_bits(Display *display)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (__current_display == display)
+     return;
+
+   __current_display = display;
+
+   if (display == 0)
+     {
+        __current_alt_mask     = Mod1Mask;
+        __current_meta_mask    = ShiftMask | Mod1Mask;
+        __current_super_mask   = 0;
+        __current_hyper_mask   = 0;
+        __current_numlock_mask = Mod2Mask;
+        return;
+     }
+
+   XModifierKeymap *mods = NULL;
+
+   ::KeyCode ctrl_l  = XKeysymToKeycode(display, XK_Control_L);
+   ::KeyCode ctrl_r  = XKeysymToKeycode(display, XK_Control_R);
+   ::KeyCode meta_l  = XKeysymToKeycode(display, XK_Meta_L);
+   ::KeyCode meta_r  = XKeysymToKeycode(display, XK_Meta_R);
+   ::KeyCode alt_l   = XKeysymToKeycode(display, XK_Alt_L);
+   ::KeyCode alt_r   = XKeysymToKeycode(display, XK_Alt_R);
+   ::KeyCode super_l = XKeysymToKeycode(display, XK_Super_L);
+   ::KeyCode super_r = XKeysymToKeycode(display, XK_Super_R);
+   ::KeyCode hyper_l = XKeysymToKeycode(display, XK_Hyper_L);
+   ::KeyCode hyper_r = XKeysymToKeycode(display, XK_Hyper_R);
+   ::KeyCode numlock = XKeysymToKeycode(display, XK_Num_Lock);
+
+   int i, j;
+
+   mods = XGetModifierMapping(display);
+   if (mods == NULL)
+     return;
+
+   __current_alt_mask     = 0;
+   __current_meta_mask    = 0;
+   __current_super_mask   = 0;
+   __current_hyper_mask   = 0;
+   __current_numlock_mask = 0;
+
+   /* We skip the first three sets for Shift, Lock, and Control.  The
+      remaining sets are for Mod1, Mod2, Mod3, Mod4, and Mod5.  */
+   for (i = 3; i < 8; i++)
+     {
+        for (j = 0; j < mods->max_keypermod; j++)
+          {
+             ::KeyCode code = mods->modifiermap [i * mods->max_keypermod + j];
+             if (! code) continue;
+             if (code == alt_l || code == alt_r)
+               __current_alt_mask |= (1 << i);
+             else if (code == meta_l || code == meta_r)
+               __current_meta_mask |= (1 << i);
+             else if (code == super_l || code == super_r)
+               __current_super_mask |= (1 << i);
+             else if (code == hyper_l || code == hyper_r)
+               __current_hyper_mask |= (1 << i);
+             else if (code == numlock)
+               __current_numlock_mask |= (1 << i);
+          }
+     }
+
+   /* Check whether there is a combine keys mapped to Meta */
+   if (__current_meta_mask == 0)
+     {
+        char buf [32];
+        XKeyEvent xkey;
+        KeySym keysym_l, keysym_r;
+
+        xkey.type = KeyPress;
+        xkey.display = display;
+        xkey.serial = 0L;
+        xkey.send_event = False;
+        xkey.x = xkey.y = xkey.x_root = xkey.y_root = 0;
+        xkey.time = 0;
+        xkey.same_screen = False;
+        xkey.subwindow = None;
+        xkey.window = None;
+        xkey.root = DefaultRootWindow(display);
+        xkey.state = ShiftMask;
+
+        xkey.keycode = meta_l;
+        XLookupString(&xkey, buf, 32, &keysym_l, 0);
+        xkey.keycode = meta_r;
+        XLookupString(&xkey, buf, 32, &keysym_r, 0);
+
+        if ((meta_l == alt_l && keysym_l == XK_Meta_L) || (meta_r == alt_r && keysym_r == XK_Meta_R))
+          __current_meta_mask = ShiftMask + __current_alt_mask;
+        else if ((meta_l == ctrl_l && keysym_l == XK_Meta_L) || (meta_r == ctrl_r && keysym_r == XK_Meta_R))
+          __current_meta_mask = ShiftMask + ControlMask;
+     }
+
+   XFreeModifiermap(mods);
+}
+
+static unsigned int scim_x11_keymask_scim_to_x11(Display *display, uint16 scimkeymask)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   unsigned int state = 0;
+
+   initialize_modifier_bits(display);
+
+   if (scimkeymask & SCIM_KEY_ShiftMask)    state |= ShiftMask;
+   if (scimkeymask & SCIM_KEY_CapsLockMask) state |= LockMask;
+   if (scimkeymask & SCIM_KEY_ControlMask)  state |= ControlMask;
+   if (scimkeymask & SCIM_KEY_AltMask)      state |= __current_alt_mask;
+   if (scimkeymask & SCIM_KEY_MetaMask)     state |= __current_meta_mask;
+   if (scimkeymask & SCIM_KEY_SuperMask)    state |= __current_super_mask;
+   if (scimkeymask & SCIM_KEY_HyperMask)    state |= __current_hyper_mask;
+   if (scimkeymask & SCIM_KEY_NumLockMask)  state |= __current_numlock_mask;
+
+   return state;
+}
+
+static XKeyEvent createKeyEvent(Display *display, Window &win,
+                                Window &winRoot, bool press,
+                                int keycode, int modifiers)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   XKeyEvent event;
+
+   event.display     = display;
+   event.window      = win;
+   event.root        = winRoot;
+   event.subwindow   = None;
+   event.time        = CurrentTime;
+   event.x           = 1;
+   event.y           = 1;
+   event.x_root      = 1;
+   event.y_root      = 1;
+   event.same_screen = EINA_TRUE;
+   event.state       = modifiers;
+   event.keycode     = XKeysymToKeycode(display, keycode);
+   if (press)
+     event.type = KeyPress;
+   else
+     event.type = KeyRelease;
+   event.send_event  = EINA_FALSE;
+   event.serial = 0;
+
+   return event;
+}
+
+static void _x_send_key_event(const KeyEvent &key)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   // Obtain the X11 display.
+   Display *display = XOpenDisplay(NULL);
+   if (display == NULL)
+     {
+        std::cerr << "XOpenDisplay failed\n";
+        return;
+     }
+
+   // Get the root window for the current display.
+   Window winRoot = 0;
+
+   // Find the window which has the current keyboard focus.
+   Window winFocus = 0;
+   int revert = RevertToParent;
+
+   XGetInputFocus(display, &winFocus, &revert);
+
+   // Send a fake key press event to the window.
+   XSelectInput(display, winFocus, FocusChangeMask|KeyPressMask|KeyReleaseMask);
+   XMapWindow(display, winFocus);
+
+   unsigned int modifier = scim_x11_keymask_scim_to_x11(display, key.mask);
+   XKeyEvent event;
+   if (key.is_key_press())
+     {
+        event = createKeyEvent(display, winFocus, winRoot, true, key.code, modifier);
+        XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
+     }
+   else
+     {
+        event = createKeyEvent(display, winFocus, winRoot, false, key.code, modifier);
+        XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent *)&event);
+     }
+
+   XCloseDisplay(display);
+}
+
+static void
+attach_instance(const IMEngineInstancePointer &si)
+{
+   si->signal_connect_show_preedit_string(
+      slot(slot_show_preedit_string));
+   si->signal_connect_show_aux_string(
+      slot(slot_show_aux_string));
+   si->signal_connect_show_lookup_table(
+      slot(slot_show_lookup_table));
+
+   si->signal_connect_hide_preedit_string(
+      slot(slot_hide_preedit_string));
+   si->signal_connect_hide_aux_string(
+      slot(slot_hide_aux_string));
+   si->signal_connect_hide_lookup_table(
+      slot(slot_hide_lookup_table));
+
+   si->signal_connect_update_preedit_caret(
+      slot(slot_update_preedit_caret));
+   si->signal_connect_update_preedit_string(
+      slot(slot_update_preedit_string));
+   si->signal_connect_update_aux_string(
+      slot(slot_update_aux_string));
+   si->signal_connect_update_lookup_table(
+      slot(slot_update_lookup_table));
+
+   si->signal_connect_commit_string(
+      slot(slot_commit_string));
+
+   si->signal_connect_forward_key_event(
+      slot(slot_forward_key_event));
+
+   si->signal_connect_register_properties(
+      slot(slot_register_properties));
+
+   si->signal_connect_update_property(
+      slot(slot_update_property));
+
+   si->signal_connect_beep(
+      slot(slot_beep));
+
+   si->signal_connect_start_helper(
+      slot(slot_start_helper));
+
+   si->signal_connect_stop_helper(
+      slot(slot_stop_helper));
+
+   si->signal_connect_send_helper_event(
+      slot(slot_send_helper_event));
+
+   si->signal_connect_get_surrounding_text(
+      slot(slot_get_surrounding_text));
+
+   si->signal_connect_delete_surrounding_text(
+      slot(slot_delete_surrounding_text));
+}
+
+// Implementation of slot functions
+static void
+slot_show_preedit_string(IMEngineInstanceBase *si)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     {
+        if (ic->impl->use_preedit)
+          {
+             if (!ic->impl->preedit_started)
+               {
+                  ecore_imf_context_preedit_start_event_add(_focused_ic->ctx);
+                  ecore_imf_context_event_callback_call(_focused_ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_START, NULL);
+                  ic->impl->preedit_started = true;
+               }
+          }
+        else
+          _panel_client.show_preedit_string(ic->id);
+     }
+}
+
+static void
+slot_show_aux_string(IMEngineInstanceBase *si)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.show_aux_string(ic->id);
+}
+
+static void
+slot_show_lookup_table(IMEngineInstanceBase *si)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.show_lookup_table(ic->id);
+}
+
+static void
+slot_hide_preedit_string(IMEngineInstanceBase *si)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     {
+        bool emit = false;
+        if (ic->impl->preedit_string.length())
+          {
+             ic->impl->preedit_string = WideString();
+             ic->impl->preedit_caret = 0;
+             ic->impl->preedit_attrlist.clear();
+             emit = true;
+          }
+        if (ic->impl->use_preedit)
+          {
+             if (emit)
+               {
+                  ecore_imf_context_preedit_changed_event_add(ic->ctx);
+                  ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+               }
+             if (ic->impl->preedit_started)
+               {
+                  ecore_imf_context_preedit_end_event_add(ic->ctx);
+                  ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+                  ic->impl->preedit_started = false;
+               }
+          }
+        else
+          _panel_client.hide_preedit_string(ic->id);
+     }
+}
+
+static void
+slot_hide_aux_string(IMEngineInstanceBase *si)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.hide_aux_string(ic->id);
+}
+
+static void
+slot_hide_lookup_table(IMEngineInstanceBase *si)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.hide_lookup_table(ic->id);
+}
+
+static void
+slot_update_preedit_caret(IMEngineInstanceBase *si, int caret)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic && ic->impl->preedit_caret != caret)
+     {
+        ic->impl->preedit_caret = caret;
+        if (ic->impl->use_preedit)
+          {
+             if (!ic->impl->preedit_started)
+               {
+                  ecore_imf_context_preedit_start_event_add(ic->ctx);
+                  ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_START, NULL);
+                  ic->impl->preedit_started = true;
+               }
+             ecore_imf_context_preedit_changed_event_add(ic->ctx);
+             ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+          }
+        else
+          _panel_client.update_preedit_caret(ic->id, caret);
+     }
+}
+
+static void
+slot_update_preedit_string(IMEngineInstanceBase *si,
+                            const WideString & str,
+                            const AttributeList & attrs)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic && (ic->impl->preedit_string != str || str.length()))
+     {
+        ic->impl->preedit_string   = str;
+        ic->impl->preedit_attrlist = attrs;
+        if (ic->impl->use_preedit)
+          {
+             if (!ic->impl->preedit_started)
+               {
+                  ecore_imf_context_preedit_start_event_add(_focused_ic->ctx);
+                  ecore_imf_context_event_callback_call(_focused_ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_START, NULL);
+                  ic->impl->preedit_started = true;
+               }
+             ic->impl->preedit_caret    = str.length();
+             ic->impl->preedit_updating = true;
+             ecore_imf_context_preedit_changed_event_add(ic->ctx);
+             ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+             ic->impl->preedit_updating = false;
+          }
+        else
+          {
+             _panel_client.update_preedit_string(ic->id, str, attrs);
+          }
+     }
+}
+
+static void
+slot_update_aux_string(IMEngineInstanceBase *si,
+                        const WideString & str,
+                        const AttributeList & attrs)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.update_aux_string(ic->id, str, attrs);
+}
+
+static void
+slot_commit_string(IMEngineInstanceBase *si,
+                    const WideString & str)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->ctx)
+     {
+        ecore_imf_context_commit_event_add(ic->ctx, utf8_wcstombs(str).c_str());
+        ecore_imf_context_event_callback_call(ic->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)utf8_wcstombs(str).c_str());
+     }
+}
+
+static void
+slot_forward_key_event(IMEngineInstanceBase *si,
+                        const KeyEvent & key)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && _focused_ic == ic)
+     {
+        if (!_fallback_instance->process_key_event(key))
+          _x_send_key_event(key);
+     }
+}
+
+static void
+slot_update_lookup_table(IMEngineInstanceBase *si,
+                          const LookupTable & table)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.update_lookup_table(ic->id, table);
+}
+
+static void
+slot_register_properties(IMEngineInstanceBase *si,
+                         const PropertyList & properties)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.register_properties(ic->id, properties);
+}
+
+static void
+slot_update_property(IMEngineInstanceBase *si,
+                     const Property & property)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     _panel_client.update_property(ic->id, property);
+}
+
+static void
+slot_beep(IMEngineInstanceBase *si __UNUSED__)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+}
+
+static void
+slot_start_helper(IMEngineInstanceBase *si,
+                  const String &helper_uuid)
+{
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " helper= " << helper_uuid << " context="
+      << (ic ? ic->id : -1) << " ic=" << ic
+      << " ic-uuid=" << ((ic ) ? ic->impl->si->get_factory_uuid() : "") << "...\n";
+
+   if (ic && ic->impl)
+     _panel_client.start_helper(ic->id, helper_uuid);
+}
+
+static void
+slot_stop_helper(IMEngineInstanceBase *si,
+                 const String &helper_uuid)
+{
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " helper= " << helper_uuid << " context=" << (ic ? ic->id : -1) << " ic=" << ic << "...\n";
+
+   if (ic && ic->impl)
+     _panel_client.stop_helper(ic->id, helper_uuid);
+}
+
+static void
+slot_send_helper_event(IMEngineInstanceBase *si,
+                       const String      &helper_uuid,
+                       const Transaction &trans)
+{
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " helper= " << helper_uuid << " context="
+      << (ic ? ic->id : -1) << " ic=" << ic
+      << " ic-uuid=" << ((ic) ? ic->impl->si->get_factory_uuid() : "") << "...\n";
+
+   if (ic && ic->impl)
+     _panel_client.send_helper_event(ic->id, helper_uuid, trans);
+}
+
+static bool
+slot_get_surrounding_text(IMEngineInstanceBase *si,
+                          WideString            &text,
+                          int                   &cursor,
+                          int                    maxlen_before,
+                          int                    maxlen_after)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     {
+        char *surrounding = NULL;
+        int   cursor_index;
+        if (ecore_imf_context_surrounding_get(_focused_ic->ctx, &surrounding, &cursor_index))
+          {
+             SCIM_DEBUG_FRONTEND(2) << "Surrounding text: " << surrounding <<"\n";
+             SCIM_DEBUG_FRONTEND(2) << "Cursor Index    : " << cursor_index <<"\n";
+             WideString before(utf8_mbstowcs(String(surrounding, surrounding + cursor_index)));
+             WideString after(utf8_mbstowcs(String(surrounding + cursor_index)));
+             if (maxlen_before > 0 && ((unsigned int)maxlen_before) < before.length())
+               before = WideString(before.begin() + (before.length() - maxlen_before), before.end());
+             else if (maxlen_before == 0) before = WideString();
+             if (maxlen_after > 0 && ((unsigned int)maxlen_after) < after.length())
+               after = WideString(after.begin(), after.begin() + maxlen_after);
+             else if (maxlen_after == 0) after = WideString();
+             text = before + after;
+             cursor = before.length();
+             return true;
+          }
+     }
+   return false;
+}
+
+static bool
+slot_delete_surrounding_text(IMEngineInstanceBase *si,
+                             int                   offset,
+                             int                   len)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   EcoreIMFContextISF *ic = static_cast<EcoreIMFContextISF *>(si->get_frontend_data());
+
+   if (ic && ic->impl && _focused_ic == ic)
+     {
+        Ecore_IMF_Event_Delete_Surrounding ev;
+        ev.ctx = _focused_ic->ctx;
+        ev.n_chars = len;
+        ev.offset = offset;
+        ecore_imf_context_delete_surrounding_event_add(_focused_ic->ctx, offset, len);
+        ecore_imf_context_event_callback_call(_focused_ic->ctx, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, &ev);
+        return true;
+     }
+   return false;
+}
+
+static void
+reload_config_callback(const ConfigPointer &config)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   _frontend_hotkey_matcher.load_hotkeys(config);
+   _imengine_hotkey_matcher.load_hotkeys(config);
+
+   KeyEvent key;
+
+   scim_string_to_key(key,
+                      config->read(String(SCIM_CONFIG_HOTKEYS_FRONTEND_VALID_KEY_MASK),
+                                     String("Shift+Control+Alt+Lock")));
+
+   _valid_key_mask = (key.mask > 0)?(key.mask):0xFFFF;
+   _valid_key_mask |= SCIM_KEY_ReleaseMask;
+   // Special treatment for two backslash keys on jp106 keyboard.
+   _valid_key_mask |= SCIM_KEY_QuirkKanaRoMask;
+
+   _on_the_spot = config->read(String(SCIM_CONFIG_FRONTEND_ON_THE_SPOT), _on_the_spot);
+   _shared_input_method = config->read(String(SCIM_CONFIG_FRONTEND_SHARED_INPUT_METHOD), _shared_input_method);
+
+   // Get keyboard layout setting
+   // Flush the global config first, in order to load the new configs from disk.
+   scim_global_config_flush();
+
+   _keyboard_layout = scim_get_default_keyboard_layout();
+}
+
+static void
+fallback_commit_string_cb(IMEngineInstanceBase  *si __UNUSED__,
+                          const WideString      &str)
+{
+   SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+   if (_focused_ic && _focused_ic->impl)
+     {
+        ecore_imf_context_commit_event_add(_focused_ic->ctx, utf8_wcstombs(str).c_str());
+        ecore_imf_context_event_callback_call(_focused_ic->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)utf8_wcstombs(str).c_str());
+     }
+}
+
diff --git a/src/modules/immodules/scim/scim_imcontext.h b/src/modules/immodules/scim/scim_imcontext.h
new file mode 100644 (file)
index 0000000..72533e2
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef __ISF_IMF_CONTEXT_H
+#define __ISF_IMF_CONTEXT_H
+
+#include <Ecore_IMF.h>
+
+typedef struct _EcoreIMFContextISF      EcoreIMFContextISF;
+typedef struct _EcoreIMFContextISFImpl  EcoreIMFContextISFImpl;
+
+struct _EcoreIMFContextISF {
+    Ecore_IMF_Context *ctx;
+
+    EcoreIMFContextISFImpl *impl;
+
+    int id; /* Input Context id*/
+    struct _EcoreIMFContextISF *next;
+};
+
+void isf_imf_context_add (Ecore_IMF_Context *ctx);
+void isf_imf_context_del (Ecore_IMF_Context *ctx);
+void isf_imf_context_client_window_set (Ecore_IMF_Context *ctx, void *window);
+void isf_imf_context_client_canvas_set (Ecore_IMF_Context *ctx, void *window);
+void isf_imf_context_focus_in (Ecore_IMF_Context *ctx);
+void isf_imf_context_focus_out (Ecore_IMF_Context *ctx);
+void isf_imf_context_reset (Ecore_IMF_Context *ctx);
+void isf_imf_context_cursor_position_set (Ecore_IMF_Context *ctx, int cursor_pos);
+void isf_imf_context_cursor_location_set (Ecore_IMF_Context *ctx, int x, int y, int w, int h);
+void isf_imf_context_input_mode_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
+void isf_imf_context_preedit_string_get (Ecore_IMF_Context *ctx, char** str, int *cursor_pos);
+void isf_imf_context_preedit_string_with_attributes_get (Ecore_IMF_Context *ctx, char** str, Eina_List **attrs, int *cursor_pos);
+void isf_imf_context_use_preedit_set (Ecore_IMF_Context* ctx, Eina_Bool use_preedit);
+Eina_Bool  isf_imf_context_filter_event (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
+void isf_imf_context_prediction_allow_set (Ecore_IMF_Context* ctx, Eina_Bool prediction);
+void isf_imf_context_autocapital_type_set (Ecore_IMF_Context* ctx, Ecore_IMF_Autocapital_Type autocapital_type);
+void isf_imf_context_input_panel_layout_set (Ecore_IMF_Context* ctx, Ecore_IMF_Input_Panel_Layout layout);
+void isf_imf_context_input_panel_show(Ecore_IMF_Context *ctx);
+void isf_imf_context_input_panel_hide(Ecore_IMF_Context *ctx);
+
+EcoreIMFContextISF* isf_imf_context_new      (void);
+void                isf_imf_context_shutdown (void);
+
+#endif  /* __ISF_IMF_CONTEXT_H */
+
diff --git a/src/modules/immodules/scim/scim_module.cpp b/src/modules/immodules/scim/scim_module.cpp
new file mode 100644 (file)
index 0000000..d77fb11
--- /dev/null
@@ -0,0 +1,104 @@
+#include <stdio.h>
+#include "scim_imcontext.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+   static const Ecore_IMF_Context_Info isf_imf_info = {
+        "scim",                                 /* ID */
+        "SCIM immodule for Ecore",              /* Description */
+        "*",                                    /* Default locales */
+        NULL,                                   /* Canvas type */
+        0                                       /* Canvas required */
+   };
+
+   static Ecore_IMF_Context_Class isf_imf_class = {
+        isf_imf_context_add,                    /* add */
+        isf_imf_context_del,                    /* del */
+        isf_imf_context_client_window_set,      /* client_window_set */
+        isf_imf_context_client_canvas_set,      /* client_canvas_set */
+        isf_imf_context_input_panel_show,       /* input_panel_show, - show */
+        isf_imf_context_input_panel_hide,       /* input_panel_hide, - hide */
+        isf_imf_context_preedit_string_get,     /* get_preedit_string */
+        isf_imf_context_focus_in,               /* focus_in */
+        isf_imf_context_focus_out,              /* focus_out */
+        isf_imf_context_reset,                  /* reset */
+        isf_imf_context_cursor_position_set,    /* cursor_position_set */
+        isf_imf_context_use_preedit_set,        /* use_preedit_set */
+        isf_imf_context_input_mode_set,         /* input_mode_set */
+        isf_imf_context_filter_event,           /* filter_event */
+        isf_imf_context_preedit_string_with_attributes_get,  /* preedit_string_with_attribute_get */
+        isf_imf_context_prediction_allow_set,   /* prediction_allow_set */
+        isf_imf_context_autocapital_type_set,   /* autocapital_type_set */
+        NULL,                                   /* control panel show */
+        NULL,                                   /* control panel hide */
+        NULL,                                   /* input_panel_layout_set */
+        NULL,                                   /* isf_imf_context_input_panel_layout_get, */
+        NULL,                                   /* isf_imf_context_input_panel_language_set, */
+        NULL,                                   /* isf_imf_context_input_panel_language_get, */
+        isf_imf_context_cursor_location_set,    /* cursor_location_set */
+        NULL,                                   /* input_panel_imdata_set */
+        NULL,                                   /* input_panel_imdata_get */
+        NULL,                                   /* input_panel_return_key_type_set */
+        NULL,                                   /* input_panel_return_key_disabled_set */
+        NULL,                                   /* input_panel_caps_lock_mode_set */
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL
+   };
+
+   static Ecore_IMF_Context *imf_module_create (void);
+   static Ecore_IMF_Context *imf_module_exit (void);
+
+   static Eina_Bool imf_module_init (void)
+     {
+        ecore_imf_module_register (&isf_imf_info, imf_module_create, imf_module_exit);
+        return EINA_TRUE;
+     }
+
+   static void imf_module_shutdown (void)
+     {
+        isf_imf_context_shutdown ();
+     }
+
+   static Ecore_IMF_Context *imf_module_create (void)
+     {
+        Ecore_IMF_Context  *ctx = NULL;
+        EcoreIMFContextISF *ctxd = NULL;
+
+        ctxd = isf_imf_context_new ();
+        if (!ctxd)
+          {
+             printf ("isf_imf_context_new () failed!!!\n");
+             return NULL;
+          }
+
+        ctx = ecore_imf_context_new (&isf_imf_class);
+        if (!ctx)
+          {
+             delete ctxd;
+             return NULL;
+          }
+
+        ecore_imf_context_data_set (ctx, ctxd);
+
+        return ctx;
+     }
+
+   static Ecore_IMF_Context *imf_module_exit (void)
+     {
+        return NULL;
+     }
+
+   EINA_MODULE_INIT(imf_module_init);
+   EINA_MODULE_SHUTDOWN(imf_module_shutdown);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
diff --git a/src/modules/immodules/xim/Makefile.am b/src/modules/immodules/xim/Makefile.am
new file mode 100644 (file)
index 0000000..57a9068
--- /dev/null
@@ -0,0 +1,29 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_input \
+-I$(top_srcdir)/src/lib/ecore_x \
+-I$(top_srcdir)/src/lib/ecore_imf \
+-I$(top_builddir)/src/lib/ecore \
+-I$(top_builddir)/src/lib/ecore_input \
+-I$(top_builddir)/src/lib/ecore_x \
+-I$(top_builddir)/src/lib/ecore_imf \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@x_cflags@ \
+@EINA_CFLAGS@
+
+pkgdir = $(libdir)/ecore/immodules
+
+pkg_LTLIBRARIES = xim.la
+xim_la_SOURCES = \
+ecore_imf_xim.c
+xim_la_LIBADD = \
+        $(top_builddir)/src/lib/ecore_imf/libecore_imf.la \
+        $(top_builddir)/src/lib/ecore_x/libecore_x.la \
+       @x_libs@ \
+       @EINA_LIBS@
+xim_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+xim_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/immodules/xim/ecore_imf_xim.c b/src/modules/immodules/xim/ecore_imf_xim.c
new file mode 100644 (file)
index 0000000..bab1aa7
--- /dev/null
@@ -0,0 +1,1555 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+#include <Ecore_IMF.h>
+#include <Ecore_X.h>
+#include <X11/Xlib.h>
+#include <X11/Xlocale.h>
+#include <X11/Xutil.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <langinfo.h>
+#include <assert.h>
+
+#define CLAMP(x, low, high) (x > high) ? high : (x < low) ? low : x
+#define _(x)                x
+
+#ifdef ENABLE_XIM
+static Eina_List *open_ims = NULL;
+#endif
+
+#define FEEDBACK_MASK (XIMReverse | XIMUnderline | XIMHighlight)
+
+typedef struct _XIM_Im_Info XIM_Im_Info;
+
+typedef struct _Ecore_IMF_Context_Data Ecore_IMF_Context_Data;
+
+struct _XIM_Im_Info
+{
+   Ecore_X_Window win;
+   Ecore_IMF_Context_Data *user;
+   char          *locale;
+   XIM            im;
+   Eina_List     *ics;
+   Eina_Bool      reconnecting;
+   XIMStyles     *xim_styles;
+   Eina_Bool      supports_string_conversion : 1;
+   Eina_Bool      supports_cursor : 1;
+};
+
+struct _Ecore_IMF_Context_Data
+{
+   Ecore_X_Window win;
+   long           mask;
+   XIC            ic; /* Input context for composed characters */
+   char          *locale;
+   XIM_Im_Info   *im_info;
+   int            preedit_length;
+   int            preedit_cursor;
+   Eina_Unicode  *preedit_chars;
+   Eina_Bool      use_preedit;
+   Eina_Bool      finalizing;
+   Eina_Bool      has_focus;
+   Eina_Bool      in_toplevel;
+   XIMFeedback   *feedbacks;
+
+   XIMCallback    destroy_cb;
+
+   XIMCallback    preedit_start_cb;
+   XIMCallback    preedit_done_cb;
+   XIMCallback    preedit_draw_cb;
+   XIMCallback    preedit_caret_cb;
+};
+
+/* prototype */
+Ecore_IMF_Context_Data *imf_context_data_new();
+void                    imf_context_data_destroy(Ecore_IMF_Context_Data *imf_context_data);
+
+#ifdef ENABLE_XIM
+static void          add_feedback_attr(Eina_List **attrs,
+                                       const char *str,
+                                       XIMFeedback feedback,
+                                       int start_pos,
+                                       int end_pos);
+
+static void          reinitialize_ic(Ecore_IMF_Context *ctx);
+static void          set_ic_client_window(Ecore_IMF_Context *ctx,
+                                          Ecore_X_Window window);
+static int           preedit_start_callback(XIC xic,
+                                            XPointer client_data,
+                                            XPointer call_data);
+static void          preedit_done_callback(XIC xic,
+                                           XPointer client_data,
+                                           XPointer call_data);
+static int           xim_text_to_utf8(Ecore_IMF_Context *ctx,
+                                      XIMText *xim_text,
+                                      char **text);
+static void          preedit_draw_callback(XIC xic,
+                                           XPointer client_data,
+                                           XIMPreeditDrawCallbackStruct *call_data);
+static void          preedit_caret_callback(XIC xic,
+                                            XPointer client_data,
+                                            XIMPreeditCaretCallbackStruct *call_data);
+static XVaNestedList preedit_callback_set(Ecore_IMF_Context *ctx);
+static XIC           get_ic(Ecore_IMF_Context *ctx);
+static XIM_Im_Info  *get_im(Ecore_X_Window window,
+                            char *locale);
+static void          xim_info_try_im(XIM_Im_Info *info);
+static void          xim_info_display_closed(Ecore_X_Display *display,
+                                             int is_error,
+                                             XIM_Im_Info *info);
+static void          xim_instantiate_callback(Display *display,
+                                              XPointer client_data,
+                                              XPointer call_data);
+static void          setup_im(XIM_Im_Info *info);
+static void          xim_destroy_callback(XIM xim,
+                                          XPointer client_data,
+                                          XPointer call_data);
+#endif
+
+#ifdef ENABLE_XIM
+static unsigned int
+utf8_offset_to_index(const char *str, int offset)
+{
+   int idx = 0;
+   int i;
+   for (i = 0; i < offset; i++)
+     {
+        eina_unicode_utf8_get_next(str, &idx);
+     }
+
+   return idx;
+}
+
+#endif
+
+static void
+_ecore_imf_context_xim_add(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("in");
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data = NULL;
+
+   imf_context_data = imf_context_data_new();
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   imf_context_data->use_preedit = EINA_TRUE;
+   imf_context_data->finalizing = EINA_FALSE;
+   imf_context_data->has_focus = EINA_FALSE;
+   imf_context_data->in_toplevel = EINA_FALSE;
+
+   ecore_imf_context_data_set(ctx, imf_context_data);
+#else
+   (void)ctx;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_del(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("in");
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   imf_context_data->finalizing = EINA_TRUE;
+   if (imf_context_data->im_info && !imf_context_data->im_info->ics->next)
+     {
+        if (imf_context_data->im_info->reconnecting == EINA_TRUE)
+          {
+             Ecore_X_Display *dsp;
+             dsp = ecore_x_display_get();
+             XUnregisterIMInstantiateCallback(dsp,
+                                              NULL, NULL, NULL,
+                                              xim_instantiate_callback,
+                                              (XPointer)imf_context_data->im_info);
+          }
+        else if (imf_context_data->im_info->im)
+          {
+             XIMCallback im_destroy_callback;
+             im_destroy_callback.client_data = NULL;
+             im_destroy_callback.callback = NULL;
+             XSetIMValues(imf_context_data->im_info->im,
+                          XNDestroyCallback, &im_destroy_callback,
+                          NULL);
+          }
+     }
+
+   set_ic_client_window(ctx, 0);
+
+   imf_context_data_destroy(imf_context_data);
+#else
+   (void)ctx;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_client_window_set(Ecore_IMF_Context *ctx,
+                                         void *window)
+{
+   EINA_LOG_DBG("in");
+#ifdef ENABLE_XIM
+   set_ic_client_window(ctx, (Ecore_X_Window)((Ecore_Window)window));
+#else
+   (void)ctx;
+   (void)window;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_preedit_string_get(Ecore_IMF_Context *ctx,
+                                          char **str,
+                                          int *cursor_pos)
+{
+   EINA_LOG_DBG("in");
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data;
+   char *utf8;
+   int len;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   if (imf_context_data->preedit_chars)
+     {
+        utf8 = eina_unicode_unicode_to_utf8(imf_context_data->preedit_chars,
+                                            &len);
+        if (str)
+          *str = utf8;
+        else
+          free(utf8);
+     }
+   else
+     {
+        if (str)
+          *str = NULL;
+        if (cursor_pos)
+          *cursor_pos = 0;
+     }
+
+   if (cursor_pos)
+     *cursor_pos = imf_context_data->preedit_cursor;
+#else
+   (void)ctx;
+   if (str)
+     *str = NULL;
+   if (cursor_pos)
+     *cursor_pos = 0;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx,
+                                                          char **str,
+                                                          Eina_List **attrs,
+                                                          int *cursor_pos)
+{
+   EINA_LOG_DBG("in");
+
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data = ecore_imf_context_data_get(ctx);
+
+   _ecore_imf_context_xim_preedit_string_get(ctx, str, cursor_pos);
+
+   if (!attrs) return;
+   if (!imf_context_data || !imf_context_data->feedbacks) return;
+
+   int i = 0;
+   XIMFeedback last_feedback = 0;
+   int start = -1;
+
+   for (i = 0; i < imf_context_data->preedit_length; i++)
+     {
+        XIMFeedback new_feedback = imf_context_data->feedbacks[i] & FEEDBACK_MASK;
+
+        if (new_feedback != last_feedback)
+          {
+             if (start >= 0)
+               add_feedback_attr(attrs, *str, last_feedback, start, i);
+
+             last_feedback = new_feedback;
+             start = i;
+          }
+     }
+
+   if (start >= 0)
+     add_feedback_attr(attrs, *str, last_feedback, start, i);
+#else
+   (void)ctx;
+   if (str)
+     *str = NULL;
+   if (attrs)
+     *attrs = NULL;
+   if (cursor_pos)
+     *cursor_pos = 0;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_focus_in(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("in");
+#ifdef ENABLE_XIM
+   XIC ic;
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   ic = imf_context_data->ic;
+   imf_context_data->has_focus = EINA_TRUE;
+
+   if (ecore_imf_context_input_panel_enabled_get(ctx))
+     ecore_imf_context_input_panel_show(ctx);
+
+   if (ic)
+     {
+        char *str;
+
+#ifdef X_HAVE_UTF8_STRING
+        if ((str = Xutf8ResetIC(ic)))
+#else
+        if ((str = XmbResetIC(ic)))
+#endif
+          XFree(str);
+
+        XSetICFocus(ic);
+     }
+#else
+   (void)ctx;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_focus_out(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+#ifdef ENABLE_XIM
+   XIC ic;
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   if (imf_context_data->has_focus == EINA_TRUE)
+     {
+        imf_context_data->has_focus = EINA_FALSE;
+        ic = imf_context_data->ic;
+        if (ic)
+          XUnsetICFocus(ic);
+
+        if (ecore_imf_context_input_panel_enabled_get(ctx))
+          ecore_imf_context_input_panel_hide(ctx);
+     }
+#else
+   (void)ctx;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_reset(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+#ifdef ENABLE_XIM
+   XIC ic;
+   Ecore_IMF_Context_Data *imf_context_data;
+   char *result;
+
+   /* restore conversion state after resetting ic later */
+   XIMPreeditState preedit_state = XIMPreeditUnKnown;
+   XVaNestedList preedit_attr;
+   Eina_Bool have_preedit_state = EINA_FALSE;
+
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   ic = imf_context_data->ic;
+   if (!ic)
+     return;
+
+   if (imf_context_data->preedit_length == 0)
+     return;
+
+   preedit_attr = XVaCreateNestedList(0,
+                                      XNPreeditState, &preedit_state,
+                                      NULL);
+   if (!XGetICValues(ic,
+                     XNPreeditAttributes, preedit_attr,
+                     NULL))
+     have_preedit_state = EINA_TRUE;
+
+   XFree(preedit_attr);
+
+   result = XmbResetIC(ic);
+
+   preedit_attr = XVaCreateNestedList(0,
+                                      XNPreeditState, preedit_state,
+                                      NULL);
+   if (have_preedit_state)
+     XSetICValues(ic,
+                  XNPreeditAttributes, preedit_attr,
+                  NULL);
+
+   XFree(preedit_attr);
+
+   if (imf_context_data->feedbacks)
+     {
+        free(imf_context_data->feedbacks);
+        imf_context_data->feedbacks = NULL;
+     }
+
+   if (imf_context_data->preedit_length)
+     {
+        imf_context_data->preedit_length = 0;
+        free(imf_context_data->preedit_chars);
+        imf_context_data->preedit_chars = NULL;
+
+        ecore_imf_context_preedit_changed_event_add(ctx);
+        ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+     }
+
+   if (result)
+     {
+        char *result_utf8 = strdup(result);
+        if (result_utf8)
+          {
+             ecore_imf_context_commit_event_add(ctx, result_utf8);
+             ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_COMMIT, result_utf8);
+             free(result_utf8);
+          }
+     }
+
+   XFree(result);
+#else
+   (void)ctx;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_use_preedit_set(Ecore_IMF_Context *ctx,
+                                       Eina_Bool use_preedit)
+{
+   EINA_LOG_DBG("in");
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   use_preedit = use_preedit != EINA_FALSE;
+
+   if (imf_context_data->use_preedit != use_preedit)
+     {
+        imf_context_data->use_preedit = use_preedit;
+        reinitialize_ic(ctx);
+     }
+#else
+   (void)ctx;
+   (void)use_preedit;
+#endif
+}
+
+#ifdef ENABLE_XIM
+static void
+add_feedback_attr(Eina_List **attrs,
+                  const char *str,
+                  XIMFeedback feedback,
+                  int start_pos,
+                  int end_pos)
+{
+   Ecore_IMF_Preedit_Attr *attr = NULL;
+
+   unsigned int start_index = utf8_offset_to_index(str, start_pos);
+   unsigned int end_index = utf8_offset_to_index(str, end_pos);
+
+   if (feedback & FEEDBACK_MASK)
+     {
+        attr = (Ecore_IMF_Preedit_Attr *)calloc(1, sizeof(Ecore_IMF_Preedit_Attr));
+        attr->start_index = start_index;
+        attr->end_index = end_index;
+        *attrs = eina_list_append(*attrs, (void *)attr);
+     }
+
+   if (feedback & XIMUnderline)
+     attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB1;
+
+   if (feedback & XIMReverse)
+     attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB2;
+
+   if (feedback & XIMHighlight)
+     attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB3;
+}
+
+#endif
+
+static void
+_ecore_imf_context_xim_cursor_location_set(Ecore_IMF_Context *ctx,
+                                           int x, int y, int w, int h)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data;
+   XIC ic;
+   XVaNestedList preedit_attr;
+   XPoint spot;
+
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+   ic = imf_context_data->ic;
+   if (!ic)
+     return;
+
+   spot.x = x;
+   spot.y = y + h;
+
+   preedit_attr = XVaCreateNestedList(0,
+                                      XNSpotLocation, &spot,
+                                      NULL);
+   XSetICValues(ic,
+                XNPreeditAttributes, preedit_attr,
+                NULL);
+
+   XFree(preedit_attr);
+#else
+   (void)ctx;
+   (void)x;
+   (void)y;
+   (void)h;
+#endif
+   (void)(w); // yes w is unused, but only a bi-product of the algorithm
+}
+
+static void
+_ecore_imf_context_xim_input_panel_show(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   ecore_x_e_virtual_keyboard_state_set
+        (imf_context_data->win, ECORE_X_VIRTUAL_KEYBOARD_STATE_ON);
+#else
+   (void)ctx;
+#endif
+}
+
+static void
+_ecore_imf_context_xim_input_panel_hide(Ecore_IMF_Context *ctx)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   ecore_x_e_virtual_keyboard_state_set
+        (imf_context_data->win, ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF);
+#else
+   (void)ctx;
+#endif
+}
+
+#ifdef ENABLE_XIM
+static unsigned int
+_ecore_x_event_reverse_modifiers(unsigned int state)
+{
+   unsigned int modifiers = 0;
+
+   /**< "Control" is pressed */
+   if (state & ECORE_IMF_KEYBOARD_MODIFIER_CTRL)
+     modifiers |= ECORE_X_MODIFIER_CTRL;
+
+   /**< "Alt" is pressed */
+   if (state & ECORE_IMF_KEYBOARD_MODIFIER_ALT)
+     modifiers |= ECORE_X_MODIFIER_ALT;
+
+   /**< "Shift" is pressed */
+   if (state & ECORE_IMF_KEYBOARD_MODIFIER_SHIFT)
+     modifiers |= ECORE_X_MODIFIER_SHIFT;
+
+   /**< "Win" (between "Ctrl" and "Alt") is pressed */
+   if (state & ECORE_IMF_KEYBOARD_MODIFIER_WIN)
+     modifiers |= ECORE_X_MODIFIER_WIN;
+
+   /**< "AltGr" is pressed */
+   if (state & ECORE_IMF_KEYBOARD_MODIFIER_ALTGR)
+     modifiers |= ECORE_X_MODIFIER_ALTGR;
+
+   return modifiers;
+}
+
+static unsigned int
+_ecore_x_event_reverse_locks(unsigned int state)
+{
+   unsigned int locks = 0;
+
+   /**< "Num" lock is active */
+   if (state & ECORE_IMF_KEYBOARD_LOCK_NUM)
+     locks |= ECORE_X_LOCK_NUM;
+
+   if (state & ECORE_IMF_KEYBOARD_LOCK_CAPS)
+     locks |= ECORE_X_LOCK_CAPS;
+
+   if (state & ECORE_IMF_KEYBOARD_LOCK_SCROLL)
+     locks |= ECORE_X_LOCK_SCROLL;
+
+   return locks;
+}
+
+static KeyCode
+_keycode_get(Ecore_X_Display *dsp,
+             const char *keyname)
+{
+   KeyCode keycode;
+
+   // EINA_LOG_DBG("keyname:%s keysym:%lu", keyname, XStringToKeysym(keyname));
+   if (strcmp(keyname, "Keycode-0") == 0)
+     keycode = 0;
+   else
+     keycode = XKeysymToKeycode(dsp, XStringToKeysym(keyname));
+
+   return keycode;
+}
+
+#endif
+
+static Eina_Bool
+_ecore_imf_context_xim_filter_event(Ecore_IMF_Context *ctx,
+                                    Ecore_IMF_Event_Type type,
+                                    Ecore_IMF_Event *event)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+#ifdef ENABLE_XIM
+   Ecore_IMF_Context_Data *imf_context_data;
+   XIC ic;
+
+   Ecore_X_Display *dsp;
+   Ecore_X_Window win;
+
+   int val;
+   char compose_buffer[256];
+   KeySym sym;
+   char *compose = NULL;
+   char *tmp = NULL;
+   Eina_Bool result = EINA_FALSE;
+
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   if (!imf_context_data) return EINA_FALSE;
+   ic = imf_context_data->ic;
+   if (!ic)
+     ic = get_ic(ctx);
+
+   if (type == ECORE_IMF_EVENT_KEY_DOWN)
+     {
+        XKeyPressedEvent xev;
+        Ecore_IMF_Event_Key_Down *ev = (Ecore_IMF_Event_Key_Down *)event;
+        EINA_LOG_DBG("ECORE_IMF_EVENT_KEY_DOWN");
+
+        dsp = ecore_x_display_get();
+        win = imf_context_data->win;
+
+        xev.type = KeyPress;
+        xev.serial = 0; /* hope it doesn't matter */
+        xev.send_event = 0;
+        xev.display = dsp;
+        xev.window = win;
+        xev.root = ecore_x_window_root_get(win);
+        xev.subwindow = win;
+        xev.time = ev->timestamp;
+        xev.x = xev.x_root = 0;
+        xev.y = xev.y_root = 0;
+        xev.state = 0;
+        xev.state |= _ecore_x_event_reverse_modifiers(ev->modifiers);
+        xev.state |= _ecore_x_event_reverse_locks(ev->locks);
+        xev.keycode = _keycode_get(dsp, ev->keyname);
+        xev.same_screen = True;
+
+        if (ic)
+          {
+             Status mbstatus;
+#ifdef X_HAVE_UTF8_STRING
+             val = Xutf8LookupString(ic,
+                                     &xev,
+                                     compose_buffer,
+                                     sizeof(compose_buffer) - 1,
+                                     &sym,
+                                     &mbstatus);
+#else /* ifdef X_HAVE_UTF8_STRING */
+             val = XmbLookupString(ic,
+                                   &xev,
+                                   compose_buffer,
+                                   sizeof(compose_buffer) - 1,
+                                   &sym,
+                                   &mbstatus);
+#endif /* ifdef X_HAVE_UTF8_STRING */
+             if (mbstatus == XBufferOverflow)
+               {
+                  tmp = malloc(sizeof (char) * (val + 1));
+                  if (!tmp)
+                    return EINA_FALSE;
+
+                  compose = tmp;
+
+#ifdef X_HAVE_UTF8_STRING
+                  val = Xutf8LookupString(ic,
+                                          &xev,
+                                          tmp,
+                                          val,
+                                          &sym,
+                                          &mbstatus);
+#else /* ifdef X_HAVE_UTF8_STRING */
+                  val = XmbLookupString(ic,
+                                        &xev,
+                                        tmp,
+                                        val,
+                                        &sym,
+                                        &mbstatus);
+#endif /* ifdef X_HAVE_UTF8_STRING */
+                  if (val > 0)
+                    {
+                       tmp[val] = '\0';
+#ifndef X_HAVE_UTF8_STRING
+                       compose = eina_str_convert(nl_langinfo(CODESET),
+                                                  "UTF-8", tmp);
+                       free(tmp);
+                       tmp = compose;
+#endif /* ifndef X_HAVE_UTF8_STRING */
+                    }
+                  else
+                    compose = NULL;
+               }
+             else if (val > 0)
+               {
+                  compose_buffer[val] = '\0';
+#ifdef X_HAVE_UTF8_STRING
+                  compose = strdup(compose_buffer);
+#else /* ifdef X_HAVE_UTF8_STRING */
+                  compose = eina_str_convert(nl_langinfo(CODESET), "UTF-8",
+                                             compose_buffer);
+#endif /* ifdef X_HAVE_UTF8_STRING */
+               }
+          }
+        else
+          {
+             compose = strdup(ev->compose);
+          }
+
+        if (compose)
+          {
+             Eina_Unicode *unicode;
+             int len;
+             unicode = eina_unicode_utf8_to_unicode(compose, &len);
+             if (!unicode) abort();
+             if (unicode[0] >= 0x20 && unicode[0] != 0x7f)
+               {
+                  ecore_imf_context_commit_event_add(ctx, compose);
+                  ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_COMMIT, compose);
+                  result = EINA_TRUE;
+               }
+             free(compose);
+             free(unicode);
+          }
+     }
+
+   return result;
+#else
+   (void)ctx;
+   (void)type;
+   (void)event;
+   return EINA_FALSE;
+#endif
+}
+
+static const Ecore_IMF_Context_Info xim_info = {
+   .id = "xim",
+   .description = _("X input method"),
+   .default_locales = "ko:ja:th:zh",
+   .canvas_type = "evas",
+   .canvas_required = 1,
+};
+
+static Ecore_IMF_Context_Class xim_class = {
+   .add = _ecore_imf_context_xim_add,
+   .del = _ecore_imf_context_xim_del,
+   .client_window_set = _ecore_imf_context_xim_client_window_set,
+   .client_canvas_set = NULL,
+   .show = _ecore_imf_context_xim_input_panel_show,
+   .hide = _ecore_imf_context_xim_input_panel_hide,
+   .preedit_string_get = _ecore_imf_context_xim_preedit_string_get,
+   .focus_in = _ecore_imf_context_xim_focus_in,
+   .focus_out = _ecore_imf_context_xim_focus_out,
+   .reset = _ecore_imf_context_xim_reset,
+   .cursor_position_set = NULL,
+   .use_preedit_set = _ecore_imf_context_xim_use_preedit_set,
+   .input_mode_set = NULL,
+   .filter_event = _ecore_imf_context_xim_filter_event,
+   .preedit_string_with_attributes_get = _ecore_imf_context_xim_preedit_string_with_attributes_get,
+   .prediction_allow_set = NULL,
+   .autocapital_type_set = NULL,
+   .control_panel_show = NULL,
+   .control_panel_hide = NULL,
+   .input_panel_layout_set = NULL,
+   .input_panel_layout_get = NULL,
+   .input_panel_language_set = NULL,
+   .input_panel_language_get = NULL,
+   .cursor_location_set = _ecore_imf_context_xim_cursor_location_set,
+   .input_panel_imdata_set = NULL,
+   .input_panel_imdata_get = NULL,
+   .input_panel_return_key_type_set = NULL,
+   .input_panel_return_key_disabled_set = NULL,
+   .input_panel_caps_lock_mode_set = NULL
+};
+
+static Ecore_IMF_Context *
+xim_imf_module_create(void)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+   Ecore_IMF_Context *ctx = NULL;
+
+   ctx = ecore_imf_context_new(&xim_class);
+   if (!ctx)
+     goto error;
+
+   return ctx;
+
+error:
+   free(ctx);
+   return NULL;
+}
+
+static Ecore_IMF_Context *
+xim_imf_module_exit(void)
+{
+   return NULL;
+}
+
+Eina_Bool
+ecore_imf_xim_init(void)
+{
+   EINA_LOG_DBG("%s in", __FUNCTION__);
+   eina_init();
+   ecore_x_init(NULL);
+   ecore_imf_module_register(&xim_info,
+                             xim_imf_module_create,
+                             xim_imf_module_exit);
+
+   return EINA_TRUE;
+}
+
+void
+ecore_imf_xim_shutdown(void)
+{
+#ifdef ENABLE_XIM
+   while (open_ims)
+     {
+        XIM_Im_Info *info = open_ims->data;
+        Ecore_X_Display *display = ecore_x_display_get();
+
+        xim_info_display_closed(display, EINA_FALSE, info);
+     }
+#endif
+
+   ecore_x_shutdown();
+   eina_shutdown();
+}
+
+EINA_MODULE_INIT(ecore_imf_xim_init);
+EINA_MODULE_SHUTDOWN(ecore_imf_xim_shutdown);
+
+#ifdef ENABLE_XIM
+/*
+ * internal functions
+ */
+Ecore_IMF_Context_Data *
+imf_context_data_new()
+{
+   Ecore_IMF_Context_Data *imf_context_data = NULL;
+   char *locale;
+
+   locale = setlocale(LC_CTYPE, "");
+   if (!locale) return NULL;
+
+   if (!XSupportsLocale()) return NULL;
+
+   imf_context_data = calloc(1, sizeof(Ecore_IMF_Context_Data));
+   EINA_SAFETY_ON_NULL_RETURN_VAL(imf_context_data, NULL);
+
+   imf_context_data->locale = strdup(locale);
+   if (!imf_context_data->locale) goto error;
+
+   return imf_context_data;
+error:
+   imf_context_data_destroy(imf_context_data);
+   return NULL;
+}
+
+void
+imf_context_data_destroy(Ecore_IMF_Context_Data *imf_context_data)
+{
+   if (!imf_context_data)
+     return;
+
+   if (imf_context_data->ic)
+     XDestroyIC(imf_context_data->ic);
+
+   free(imf_context_data->preedit_chars);
+
+   if (imf_context_data->feedbacks)
+     {
+        free(imf_context_data->feedbacks);
+        imf_context_data->feedbacks = NULL;
+     }
+
+   free(imf_context_data->locale);
+   free(imf_context_data);
+}
+
+static int
+preedit_start_callback(XIC xic __UNUSED__,
+                       XPointer client_data,
+                       XPointer call_data __UNUSED__)
+{
+   EINA_LOG_DBG("in");
+   Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)client_data;
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   if (!imf_context_data) return -1;
+
+   if (imf_context_data->finalizing == EINA_FALSE)
+     {
+        ecore_imf_context_preedit_start_event_add(ctx);
+        ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_PREEDIT_START, NULL);
+     }
+   return -1;
+}
+
+static void
+preedit_done_callback(XIC xic __UNUSED__,
+                      XPointer client_data,
+                      XPointer call_data __UNUSED__)
+{
+   EINA_LOG_DBG("in");
+   Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)client_data;
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   if (imf_context_data->preedit_length)
+     {
+        imf_context_data->preedit_length = 0;
+        free(imf_context_data->preedit_chars);
+        imf_context_data->preedit_chars = NULL;
+        ecore_imf_context_preedit_changed_event_add(ctx);
+        ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+     }
+
+   if (imf_context_data->finalizing == EINA_FALSE)
+     {
+        ecore_imf_context_preedit_end_event_add(ctx);
+        ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_PREEDIT_END, NULL);
+     }
+}
+
+/* FIXME */
+static int
+xim_text_to_utf8(Ecore_IMF_Context *ctx __UNUSED__,
+                 XIMText *xim_text,
+                 char **text)
+{
+   int text_length = 0;
+   char *result = NULL;
+
+   if (xim_text && xim_text->string.multi_byte)
+     {
+        if (xim_text->encoding_is_wchar)
+          {
+             EINA_LOG_WARN("Wide character return from Xlib not currently supported");
+             *text = NULL;
+             return 0;
+          }
+
+        /* XXX Convert to UTF-8 */
+        result = strdup(xim_text->string.multi_byte);
+        if (result)
+          {
+             text_length = eina_unicode_utf8_get_len(result);
+             if (text_length != xim_text->length)
+               {
+                  EINA_LOG_WARN("Size mismatch when converting text from input method: supplied length = %d\n, result length = %d", xim_text->length, text_length);
+               }
+          }
+        else
+          {
+             EINA_LOG_WARN("Error converting text from IM to UCS-4");
+             *text = NULL;
+             return 0;
+          }
+
+        *text = result;
+        return text_length;
+     }
+   else
+     {
+        *text = NULL;
+        return 0;
+     }
+}
+
+static void
+preedit_draw_callback(XIC xic __UNUSED__,
+                      XPointer client_data,
+                      XIMPreeditDrawCallbackStruct *call_data)
+{
+   EINA_LOG_DBG("in");
+   Eina_Bool ret = EINA_FALSE;
+   Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)client_data;
+   Ecore_IMF_Context_Data *imf_context_data = ecore_imf_context_data_get(ctx);
+   XIMText *t = call_data->text;
+   char *tmp;
+   Eina_Unicode *new_text = NULL;
+   Eina_UStrbuf *preedit_bufs = NULL;
+   int new_text_length;
+   int i = 0;
+
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   preedit_bufs = eina_ustrbuf_new();
+   if (imf_context_data->preedit_chars)
+     {
+        ret = eina_ustrbuf_append(preedit_bufs, imf_context_data->preedit_chars);
+        if (ret == EINA_FALSE) goto done;
+     }
+
+   new_text_length = xim_text_to_utf8(ctx, t, &tmp);
+   if (tmp)
+     {
+        int tmp_len;
+        new_text = eina_unicode_utf8_to_unicode((const char *)tmp, &tmp_len);
+        free(tmp);
+     }
+
+   if (t == NULL)
+     {
+        /* delete string */
+        ret = eina_ustrbuf_remove(preedit_bufs,
+                                  call_data->chg_first, call_data->chg_length);
+     }
+   else if (call_data->chg_length == 0)
+     {
+        /* insert string */
+        ret = eina_ustrbuf_insert(preedit_bufs, new_text, call_data->chg_first);
+     }
+   else if (call_data->chg_length > 0)
+     {
+        /* replace string */
+        ret = eina_ustrbuf_remove(preedit_bufs,
+                                  call_data->chg_first, call_data->chg_length);
+        if (ret == EINA_FALSE) goto done;
+
+        ret = eina_ustrbuf_insert_n(preedit_bufs, new_text,
+                                    new_text_length, call_data->chg_first);
+        if (ret == EINA_FALSE) goto done;
+     }
+   else
+     {
+        ret = EINA_FALSE;
+     }
+
+done:
+   if (ret == EINA_TRUE)
+     {
+        free(imf_context_data->preedit_chars);
+        imf_context_data->preedit_chars =
+          eina_ustrbuf_string_steal(preedit_bufs);
+        imf_context_data->preedit_length =
+          eina_unicode_strlen(imf_context_data->preedit_chars);
+
+        if (imf_context_data->feedbacks)
+          {
+             free(imf_context_data->feedbacks);
+             imf_context_data->feedbacks = NULL;
+          }
+
+        if (imf_context_data->preedit_length > 0)
+          {
+             imf_context_data->feedbacks = calloc(imf_context_data->preedit_length, sizeof(XIMFeedback));
+
+             for (i = 0; i < imf_context_data->preedit_length; i++)
+               imf_context_data->feedbacks[i] = t->feedback[i];
+          }
+
+        ecore_imf_context_preedit_changed_event_add(ctx);
+        ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+     }
+
+   free(new_text);
+   eina_ustrbuf_free(preedit_bufs);
+}
+
+static void
+preedit_caret_callback(XIC xic __UNUSED__,
+                       XPointer client_data,
+                       XIMPreeditCaretCallbackStruct *call_data)
+{
+   EINA_LOG_DBG("in");
+   Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)client_data;
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   if (call_data->direction == XIMAbsolutePosition)
+     {
+        // printf("call_data->position:%d\n", call_data->position);
+        imf_context_data->preedit_cursor = call_data->position;
+        if (imf_context_data->finalizing == EINA_FALSE)
+          {
+             ecore_imf_context_preedit_changed_event_add(ctx);
+             ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+          }
+     }
+}
+
+static XVaNestedList
+preedit_callback_set(Ecore_IMF_Context *ctx)
+{
+   Ecore_IMF_Context_Data *imf_context_data;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+
+   imf_context_data->preedit_start_cb.client_data = (XPointer)ctx;
+   imf_context_data->preedit_start_cb.callback = (XIMProc)preedit_start_callback;
+
+   imf_context_data->preedit_done_cb.client_data = (XPointer)ctx;
+   imf_context_data->preedit_done_cb.callback = (XIMProc)preedit_done_callback;
+
+   imf_context_data->preedit_draw_cb.client_data = (XPointer)ctx;
+   imf_context_data->preedit_draw_cb.callback = (XIMProc)preedit_draw_callback;
+
+   imf_context_data->preedit_caret_cb.client_data = (XPointer)ctx;
+   imf_context_data->preedit_caret_cb.callback = (XIMProc)preedit_caret_callback;
+
+   return XVaCreateNestedList(0,
+                              XNPreeditStartCallback,
+                              &imf_context_data->preedit_start_cb,
+                              XNPreeditDoneCallback,
+                              &imf_context_data->preedit_done_cb,
+                              XNPreeditDrawCallback,
+                              &imf_context_data->preedit_draw_cb,
+                              XNPreeditCaretCallback,
+                              &imf_context_data->preedit_caret_cb,
+                              NULL);
+}
+
+static XIC
+get_ic(Ecore_IMF_Context *ctx)
+{
+   Ecore_IMF_Context_Data *imf_context_data;
+   XIC ic;
+   imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(imf_context_data, NULL);
+
+   ic = imf_context_data->ic;
+   if (!ic)
+     {
+        XIM_Im_Info *im_info = imf_context_data->im_info;
+        XVaNestedList preedit_attr = NULL;
+        XIMStyle im_style = 0;
+        XPoint spot = { 0, 0 };
+        char *name = NULL;
+
+        if (!im_info)
+          {
+             EINA_LOG_WARN("Doesn't open XIM.");
+             return NULL;
+          }
+
+        // supported styles
+#if 0
+        int i;
+        if (im_info->xim_styles)
+          {
+             for (i = 0; i < im_info->xim_styles->count_styles; i++)
+               {
+                  printf("%i: ", i);
+                  if (im_info->xim_styles->supported_styles[i] & XIMPreeditCallbacks)
+                    printf("XIMPreeditCallbacks | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMPreeditPosition)
+                    printf("XIMPreeditPosition | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMPreeditArea)
+                    printf("XIMPreeditArea | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMPreeditNothing)
+                    printf("XIMPreeditNothing | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMPreeditNone)
+                    printf("XIMPreeditNone | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMStatusArea)
+                    printf("XIMStatusArea | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMStatusCallbacks)
+                    printf("XIMStatusCallbacks | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMStatusNothing)
+                    printf("XIMStatusNothing | ");
+                  if (im_info->xim_styles->supported_styles[i] & XIMStatusNone)
+                    printf("XIMStatusNone | ");
+                  printf("\n");
+               }
+          }
+#endif
+        // "OverTheSpot" = XIMPreeditPosition | XIMStatusNothing
+        // "OffTheSpot" = XIMPreeditArea | XIMStatusArea
+        // "Root" = XIMPreeditNothing | XIMStatusNothing
+
+        if (imf_context_data->use_preedit == EINA_TRUE)
+          {
+             if (im_info->supports_cursor)
+               {
+                  // kinput2 DOES do this...
+                  XFontSet fs;
+                  char **missing_charset_list;
+                  int missing_charset_count;
+                  char *def_string;
+
+                  im_style |= XIMPreeditPosition;
+                  im_style |= XIMStatusNothing;
+                  fs = XCreateFontSet(ecore_x_display_get(),
+                                      "fixed",
+                                      &missing_charset_list,
+                                      &missing_charset_count,
+                                      &def_string);
+                  preedit_attr = XVaCreateNestedList(0,
+                                                     XNSpotLocation, &spot,
+                                                     XNFontSet, fs,
+                                                     NULL);
+               }
+             else
+               {
+                  im_style |= XIMPreeditCallbacks;
+                  im_style |= XIMStatusNothing;
+                  preedit_attr = preedit_callback_set(ctx);
+               }
+             name = XNPreeditAttributes;
+          }
+        else
+          {
+             im_style |= XIMPreeditNothing;
+             im_style |= XIMStatusNothing;
+          }
+
+        if (!im_info->xim_styles)
+          {
+             EINA_LOG_WARN("No XIM styles supported! Wanted %#llx",
+                           (unsigned long long)im_style);
+             im_style = 0;
+          }
+        else
+          {
+             XIMStyle fallback = 0;
+             int i;
+
+             for (i = 0; i < im_info->xim_styles->count_styles; i++)
+               {
+                  XIMStyle cur = im_info->xim_styles->supported_styles[i];
+                  if (cur == im_style)
+                    break;
+                  else if (cur == (XIMPreeditNothing | XIMStatusNothing))
+                    /* TODO: fallback is just that or the anyone? */
+                    fallback = cur;
+               }
+
+             if (i == im_info->xim_styles->count_styles)
+               {
+                  if (fallback)
+                    {
+                       EINA_LOG_WARN("Wanted XIM style %#llx not found, "
+                                     "using fallback %#llx instead.",
+                                     (unsigned long long)im_style,
+                                     (unsigned long long)fallback);
+                       im_style = fallback;
+                    }
+                  else
+                    {
+                       EINA_LOG_WARN("Wanted XIM style %#llx not found, "
+                                     "no fallback supported.",
+                                     (unsigned long long)im_style);
+                       im_style = 0;
+                    }
+               }
+          }
+
+        if ((im_info->im) && (im_style))
+          {
+             ic = XCreateIC(im_info->im,
+                            XNInputStyle, im_style,
+                            XNClientWindow, imf_context_data->win,
+                            name, preedit_attr, NULL);
+          }
+        XFree(preedit_attr);
+        if (ic)
+          {
+             unsigned long mask = 0xaaaaaaaa;
+             XGetICValues(ic,
+                          XNFilterEvents, &mask,
+                          NULL);
+             imf_context_data->mask = mask;
+             ecore_x_event_mask_set(imf_context_data->win, mask);
+          }
+
+        imf_context_data->ic = ic;
+        if (ic && imf_context_data->has_focus == EINA_TRUE)
+          XSetICFocus(ic);
+     }
+
+   return ic;
+}
+
+static void
+reinitialize_ic(Ecore_IMF_Context *ctx)
+{
+   Ecore_IMF_Context_Data *imf_context_data = ecore_imf_context_data_get(ctx);
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   XIC ic = imf_context_data->ic;
+   if (ic)
+     {
+        XDestroyIC(ic);
+        imf_context_data->ic = NULL;
+        if (imf_context_data->preedit_length)
+          {
+             imf_context_data->preedit_length = 0;
+             free(imf_context_data->preedit_chars);
+             imf_context_data->preedit_chars = NULL;
+             ecore_imf_context_preedit_changed_event_add(ctx);
+             ecore_imf_context_event_callback_call(ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL);
+          }
+     }
+}
+
+static void
+set_ic_client_window(Ecore_IMF_Context *ctx,
+                     Ecore_X_Window window)
+{
+   EINA_LOG_DBG("in");
+   Ecore_IMF_Context_Data *imf_context_data = ecore_imf_context_data_get(ctx);
+   Ecore_X_Window old_win;
+
+   EINA_SAFETY_ON_NULL_RETURN(imf_context_data);
+
+   /* reinitialize IC */
+   reinitialize_ic(ctx);
+
+   old_win = imf_context_data->win;
+   EINA_LOG_DBG("old_win:%d window:%d ", old_win, window);
+   if (old_win != 0 && old_win != window)   /* XXX how do check window... */
+     {
+        XIM_Im_Info *info;
+        info = imf_context_data->im_info;
+        info->ics = eina_list_remove(info->ics, imf_context_data);
+        if (imf_context_data->im_info)
+          imf_context_data->im_info->user = NULL;
+        imf_context_data->im_info = NULL;
+     }
+
+   imf_context_data->win = window;
+
+   if (window) /* XXX */
+     {
+        XIM_Im_Info *info = NULL;
+        info = get_im(window, imf_context_data->locale);
+        imf_context_data->im_info = info;
+        imf_context_data->im_info->ics =
+          eina_list_prepend(imf_context_data->im_info->ics,
+                            imf_context_data);
+        if (imf_context_data->im_info)
+          imf_context_data->im_info->user = imf_context_data;
+     }
+}
+
+static XIM_Im_Info *
+get_im(Ecore_X_Window window,
+       char *locale)
+{
+   EINA_LOG_DBG("in");
+
+   Eina_List *l;
+   XIM_Im_Info *im_info = NULL;
+   XIM_Im_Info *info = NULL;
+   EINA_LIST_FOREACH (open_ims, l, im_info)
+     {
+        if (strcmp(im_info->locale, locale) == 0)
+          {
+             if (im_info->im)
+               {
+                  return im_info;
+               }
+             else
+               {
+                  info = im_info;
+                  break;
+               }
+          }
+     }
+
+   if (!info)
+     {
+        info = calloc(1, sizeof(XIM_Im_Info));
+        if (!info) return NULL;
+        open_ims = eina_list_prepend(open_ims, info);
+        info->win = window;
+        info->locale = strdup(locale);
+        info->reconnecting = EINA_FALSE;
+     }
+
+   xim_info_try_im(info);
+   return info;
+}
+
+/* initialize info->im */
+static void
+xim_info_try_im(XIM_Im_Info *info)
+{
+   Ecore_X_Display *dsp;
+
+   assert(info->im == NULL);
+   if (info->reconnecting == EINA_TRUE)
+     return;
+
+   if (XSupportsLocale())
+     {
+        if (!XSetLocaleModifiers(""))
+          EINA_LOG_WARN("Unable to set locale modifiers with XSetLocaleModifiers()");
+        dsp = ecore_x_display_get();
+        info->im = XOpenIM(dsp, NULL, NULL, NULL);
+        if (!info->im)
+          {
+             XRegisterIMInstantiateCallback(dsp,
+                                            NULL, NULL, NULL,
+                                            xim_instantiate_callback,
+                                            (XPointer)info);
+             info->reconnecting = EINA_TRUE;
+             return;
+          }
+        setup_im(info);
+     }
+}
+
+static void
+xim_info_display_closed(Ecore_X_Display *display __UNUSED__,
+                        int is_error __UNUSED__,
+                        XIM_Im_Info *info)
+{
+   Eina_List *ics, *tmp_list;
+   Ecore_IMF_Context *ctx;
+
+   open_ims = eina_list_remove(open_ims, info);
+
+   ics = info->ics;
+   info->ics = NULL;
+
+   EINA_LIST_FOREACH (ics, tmp_list, ctx)
+     set_ic_client_window(ctx, 0);
+
+   EINA_LIST_FREE (ics, ctx)
+     {
+        Ecore_IMF_Context_Data *imf_context_data;
+        imf_context_data = ecore_imf_context_data_get(ctx);
+        imf_context_data_destroy(imf_context_data);
+     }
+
+   free(info->locale);
+
+   if (info->im)
+     XCloseIM(info->im);
+
+   free(info);
+}
+
+static void
+xim_instantiate_callback(Display *display,
+                         XPointer client_data,
+                         XPointer call_data __UNUSED__)
+{
+   XIM_Im_Info *info = (XIM_Im_Info *)client_data;
+   XIM im = NULL;
+
+   im = XOpenIM(display, NULL, NULL, NULL);
+
+   if (!im)
+     {
+        fprintf(stderr, "Failed to connect to IM\n");
+        return;
+     }
+
+   info->im = im;
+   setup_im(info);
+
+   XUnregisterIMInstantiateCallback(display, NULL, NULL, NULL,
+                                    xim_instantiate_callback,
+                                    (XPointer)info);
+   info->reconnecting = EINA_FALSE;
+}
+
+static void
+setup_im(XIM_Im_Info *info)
+{
+   XIMValuesList *ic_values = NULL;
+   XIMCallback im_destroy_callback;
+
+   if (!info->im)
+     return;
+
+   im_destroy_callback.client_data = (XPointer)info;
+   im_destroy_callback.callback = (XIMProc)xim_destroy_callback;
+   XSetIMValues(info->im,
+                XNDestroyCallback, &im_destroy_callback,
+                NULL);
+
+   XGetIMValues(info->im,
+                XNQueryInputStyle, &info->xim_styles,
+                XNQueryICValuesList, &ic_values,
+                NULL);
+
+   if (ic_values)
+     {
+        int i;
+
+        for (i = 0; i < ic_values->count_values; i++)
+          {
+             if (!strcmp(ic_values->supported_values[i],
+                         XNStringConversionCallback))
+               info->supports_string_conversion = EINA_TRUE;
+             if (!strcmp(ic_values->supported_values[i],
+                         XNCursor))
+               info->supports_cursor = EINA_TRUE;
+          }
+#if 0
+        printf("values........\n");
+        for (i = 0; i < ic_values->count_values; i++)
+          printf("%s\n", ic_values->supported_values[i]);
+        printf("styles........\n");
+        for (i = 0; i < info->xim_styles->count_styles; i++)
+          printf("%lx\n", info->xim_styles->supported_styles[i]);
+#endif
+        XFree(ic_values);
+     }
+}
+
+static void
+xim_destroy_callback(XIM xim __UNUSED__,
+                     XPointer client_data,
+                     XPointer call_data __UNUSED__)
+{
+   XIM_Im_Info *info = (XIM_Im_Info *)client_data;
+
+   if (info->user) info->user->ic = NULL;
+   info->im = NULL;
+//   reinitialize_ic(ctx);
+   xim_info_try_im(info);
+
+   return;
+}
+
+#endif  /* ENABLE_XIM */
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
new file mode 100644 (file)
index 0000000..bfd20d9
--- /dev/null
@@ -0,0 +1,37 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_con \
+-I$(top_srcdir)/src/lib/ecore_x \
+@EINA_CFLAGS@ \
+@CHECK_CFLAGS@
+
+if EFL_ENABLE_TESTS
+
+noinst_PROGRAMS = ecore_suite
+
+check_PROGRAMS = ecore_suite
+
+ecore_suite_SOURCES = \
+ecore_suite.c \
+ecore_test_ecore.c \
+ecore_test_ecore_con.c \
+ecore_test_ecore_x.c \
+ecore_suite.h
+
+ecore_suite_LDADD = \
+@CHECK_LIBS@ \
+@EINA_LIBS@ \
+$(top_builddir)/src/lib/ecore/libecore.la \
+$(top_builddir)/src/lib/ecore_con/libecore_con.la
+
+if BUILD_ECORE_X
+ecore_suite_LDADD += \
+$(top_builddir)/src/lib/ecore_x/libecore_x.la
+endif
+
+endif
+
+clean-local:
+       rm -rf *.gcno *.gcda
diff --git a/src/tests/ecore_suite.c b/src/tests/ecore_suite.c
new file mode 100644 (file)
index 0000000..fd51750
--- /dev/null
@@ -0,0 +1,103 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <Ecore.h>
+
+#include "ecore_suite.h"
+
+typedef struct _Ecore_Test_Case Ecore_Test_Case;
+
+struct _Ecore_Test_Case
+{
+   const char *test_case;
+   void      (*build)(TCase *tc);
+};
+
+static const Ecore_Test_Case etc[] = {
+  { "Ecore", ecore_test_ecore },
+  { "Ecore_Con", ecore_test_ecore_con },
+  { "Ecore_X", ecore_test_ecore_x },
+  { NULL, NULL }
+};
+
+static void
+_list_tests(void)
+{
+  const Ecore_Test_Case *itr;
+
+   itr = etc;
+   fputs("Available Test Cases:\n", stderr);
+   for (; itr->test_case; itr++)
+     fprintf(stderr, "\t%s\n", itr->test_case);
+}
+static Eina_Bool
+_use_test(int argc, const char **argv, const char *test_case)
+{
+   if (argc < 1)
+     return 1;
+
+   for (; argc > 0; argc--, argv++)
+     if (strcmp(test_case, *argv) == 0)
+       return 1;
+   return 0;
+}
+
+static Suite *
+ecore_suite_build(int argc, const char **argv)
+{
+   TCase *tc;
+   Suite *s;
+   int i;
+
+   s = suite_create("Ecore");
+
+   for (i = 0; etc[i].test_case; ++i)
+     {
+       if (!_use_test(argc, argv, etc[i].test_case)) continue;
+       tc = tcase_create(etc[i].test_case);
+
+       etc[i].build(tc);
+
+       suite_add_tcase(s, tc);
+       tcase_set_timeout(tc, 0);
+     }
+
+   return s;
+}
+
+int
+main(int argc, char **argv)
+{
+   Suite *s;
+   SRunner *sr;
+   int i, failed_count;
+
+   for (i = 1; i < argc; i++)
+     if ((strcmp(argv[i], "-h") == 0) ||
+        (strcmp(argv[i], "--help") == 0))
+       {
+         fprintf(stderr, "Usage:\n\t%s [test_case1 .. [test_caseN]]\n",
+                 argv[0]);
+         _list_tests();
+         return 0;
+       }
+     else if ((strcmp(argv[i], "-l") == 0) ||
+             (strcmp(argv[i], "--list") == 0))
+       {
+         _list_tests();
+         return 0;
+       }
+
+   s = ecore_suite_build(argc - 1, (const char **)argv + 1);
+   sr = srunner_create(s);
+
+   srunner_run_all(sr, CK_ENV);
+   failed_count = srunner_ntests_failed(sr);
+   srunner_free(sr);
+
+   return (failed_count == 0) ? 0 : 255;
+}
diff --git a/src/tests/ecore_suite.h b/src/tests/ecore_suite.h
new file mode 100644 (file)
index 0000000..0c7dfef
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _ECORE_SUITE_H
+#define _ECORE_SUITE_H
+
+#include <check.h>
+
+void ecore_test_ecore(TCase *tc);
+void ecore_test_ecore_con(TCase *tc);
+void ecore_test_ecore_x(TCase *tc);
+
+
+#endif /* _ECORE_SUITE_H */
diff --git a/src/tests/ecore_test_ecore.c b/src/tests/ecore_test_ecore.c
new file mode 100644 (file)
index 0000000..a37b00d
--- /dev/null
@@ -0,0 +1,366 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include <Eina.h>
+#include <Ecore.h>
+
+#include "ecore_suite.h"
+
+static int _log_dom;
+#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
+
+static Eina_Bool
+_quit_cb(void *data)
+{
+   Eina_Bool *val = data;
+   *val = EINA_TRUE;
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_dummy_cb(void *data)
+{
+   return !!data;
+}
+
+START_TEST(ecore_test_ecore_init)
+{
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Timer *timer;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   timer = ecore_timer_add(0.0, _quit_cb, &did);
+   fail_if(timer == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_idler)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Idler *idler;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   idler = ecore_idler_add(_quit_cb, &did);
+   fail_if(idler == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_idle_enterer)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Idle_Enterer *idle_enterer;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   idle_enterer = ecore_idle_enterer_add(_quit_cb, &did);
+   fail_if(idle_enterer == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_idle_exiter)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Timer *timer;
+   Ecore_Idle_Exiter *idle_exiter;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   /* make system exit idle */
+   timer = ecore_timer_add(0.0, _dummy_cb, (void *)(long)0);
+   fail_if(timer == NULL);
+
+   idle_exiter = ecore_idle_exiter_add(_quit_cb, &did);
+   fail_if(idle_exiter == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_timer)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Timer *timer;
+   double start, end, elapsed;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   timer = ecore_timer_add(2.0, _quit_cb, &did);
+   fail_if(timer == NULL);
+
+   start = ecore_time_get();
+   ecore_main_loop_begin();
+   end = ecore_time_get();
+   elapsed = end - start;
+
+   fail_if(did == EINA_FALSE);
+   fail_if(elapsed < 2.0);
+   fail_if(elapsed > 3.0); /* 1 second "error margin" */
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+static Eina_Bool _timer3(void *data __UNUSED__)
+{
+   /* timer 3, do nothing */
+   return EINA_FALSE;
+}
+
+static Eina_Bool _timer2(void *data __UNUSED__)
+{
+   /* timer 2, quit inner mainloop */
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+static Eina_Bool _timer1(void *data)
+{
+   /* timer 1, begin inner mainloop */
+   int *times = data;
+   (*times)++;
+
+   ecore_timer_add(0.3, _timer2, NULL);
+   ecore_timer_add(0.1, _timer3, NULL);
+   ecore_main_loop_begin();
+
+   ecore_main_loop_quit();
+
+   return EINA_FALSE;
+}
+
+START_TEST(ecore_test_ecore_main_loop_timer_inner)
+{
+   Ecore_Timer *timer;
+   int ret;
+   int times = 0;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   timer = ecore_timer_add(1.0, _timer1, &times);
+   fail_if(timer == NULL);
+
+   /* BEGIN: outer mainloop */
+   ecore_main_loop_begin();
+   /*END: outer mainloop */
+
+   fail_if(times != 1);
+}
+END_TEST
+
+static Eina_Bool
+_fd_handler_cb(void *data, Ecore_Fd_Handler *handler __UNUSED__)
+{
+   /* FIXME: why setting val if it is overwritten just after and what is its purpose ??? */
+   Eina_Bool *val = data;
+
+   *val = EINA_TRUE;
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+START_TEST(ecore_test_ecore_main_loop_fd_handler)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Fd_Handler *fd_handler;
+   int comm[2];
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   ret = pipe(comm);
+   fail_if(ret != 0);
+
+   fd_handler = ecore_main_fd_handler_add
+     (comm[0], ECORE_FD_READ, _fd_handler_cb, &did, NULL, NULL);
+   fail_if(fd_handler == NULL);
+
+   ret = write(comm[1], &did, 1);
+   fail_if(ret != 1);
+
+   ecore_main_loop_begin();
+
+   close(comm[0]);
+   close(comm[1]);
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+static Eina_Bool
+_event_handler_cb(void *data, int type __UNUSED__, void *event __UNUSED__)
+{
+   /* FIXME: why setting val if it is overwritten just after and what is its purpose ??? */
+   Eina_Bool *val = data;
+
+   *val = EINA_TRUE;
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+START_TEST(ecore_test_ecore_main_loop_event)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Event_Handler *handler;
+   Ecore_Event *event;
+   int ret, type;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   type = ecore_event_type_new();
+   fail_if(type < 1);
+
+   handler = ecore_event_handler_add(type, _event_handler_cb, &did);
+   fail_if(handler == NULL);
+
+   event = ecore_event_add(type, NULL, NULL, NULL);
+   fail_if(event == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+static Eina_Bool
+_timer_quit_recursive(void *data __UNUSED__)
+{
+   INF("   _timer_quit_recursive: begin");
+   ecore_main_loop_quit(); /* quits inner main loop */
+   INF("   _timer_quit_recursive: end");
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_event_recursive_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
+{
+   static int guard = 0;
+
+   /* If we enter this callback more than once, it's wrong! */
+   fail_if(guard != 0);
+   guard++;
+
+   INF("  event_recursive_cb: begin");
+
+   ecore_timer_add(1.0, _timer_quit_recursive, NULL);
+   INF("   add 1.0s timer (once) to trigger _timer_quit_recursive");
+
+   INF("   inner main loop begin (recurse)");
+   ecore_main_loop_begin();
+   INF("   inner main loop end (recurse)");
+
+   ecore_main_loop_quit(); /* quits outer main loop */
+
+   INF("   guard = %d", guard);
+   INF("  event_recursive_cb: end");
+   return EINA_FALSE;
+}
+
+
+START_TEST(ecore_test_ecore_main_loop_event_recursive)
+{
+   /* This test tests if the event handlers are really called only once when
+    * recursive main loops are used and any number of events may have occurred
+    * between the beginning and the end of recursive main loop.
+    */
+   Ecore_Event *e;
+   int type;
+   int ret;
+
+   _log_dom = eina_log_domain_register("test", EINA_COLOR_CYAN);
+
+   INF("main: begin");
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+
+   type = ecore_event_type_new();
+   ecore_event_handler_add(type, _event_recursive_cb, NULL);
+   e = ecore_event_add(type, NULL, NULL, NULL);
+   INF(" add event to trigger cb1: event=%p", e);
+   INF(" main loop begin");
+   ecore_main_loop_begin();
+   INF(" main loop end");
+
+   INF("main: end");
+   ecore_shutdown();
+}
+END_TEST
+
+void ecore_test_ecore(TCase *tc)
+{
+   tcase_add_test(tc, ecore_test_ecore_init);
+   tcase_add_test(tc, ecore_test_ecore_main_loop);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_idler);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_idle_enterer);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_idle_exiter);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_timer);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_fd_handler);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_event);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_timer_inner);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_event_recursive);
+}
diff --git a/src/tests/ecore_test_ecore_con.c b/src/tests/ecore_test_ecore_con.c
new file mode 100644 (file)
index 0000000..45c1f69
--- /dev/null
@@ -0,0 +1,258 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Ecore_Con.h>
+
+#include "ecore_suite.h"
+
+#include <stdio.h>
+#include <Ecore.h>
+#include <Ecore_Con.h>
+
+Eina_Bool
+_add(void *data, int type __UNUSED__, void *ev)
+{
+   fail_if (type != ECORE_CON_EVENT_CLIENT_ADD &&
+       type != ECORE_CON_EVENT_SERVER_ADD);
+
+   /* Server */
+   if (type == ECORE_CON_EVENT_CLIENT_ADD)
+     {
+       Ecore_Con_Event_Client_Add *event = ev;
+
+       fail_if (data != (void *) 1);
+       fail_if (!event->client);
+
+       printf("Client with ip %s, port %d, connected = %d!\n",
+           ecore_con_client_ip_get(event->client),
+           ecore_con_client_port_get(event->client),
+           ecore_con_client_connected_get(event->client));
+
+       ecore_con_client_timeout_set(event->client, 10);
+
+     }
+   else if (type == ECORE_CON_EVENT_SERVER_ADD)
+     {
+       Ecore_Con_Event_Server_Add *event = ev;
+       const char ping[] = "PING";
+       int ret;
+
+       fail_if (data != (void *) 2);
+       fail_if (!event->server);
+       printf("Server with ip %s, name %s, port %d, connected = %d!\n",
+           ecore_con_server_ip_get(event->server),
+           ecore_con_server_name_get(event->server),
+           ecore_con_server_port_get(event->server),
+           ecore_con_server_connected_get(event->server));
+       ret = ecore_con_server_send(event->server, ping, sizeof(ping));
+       fail_if (ret != sizeof(ping));
+       ecore_con_server_flush(event->server);
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_del(void *data , int type __UNUSED__, void *ev)
+{
+   fail_if (type != ECORE_CON_EVENT_CLIENT_DEL &&
+       type != ECORE_CON_EVENT_SERVER_DEL);
+
+   /* Server */
+   if (type == ECORE_CON_EVENT_CLIENT_DEL)
+     {
+       Ecore_Con_Event_Client_Del *event = ev;
+
+       fail_if (data != (void *) 1);
+       fail_if (!event->client);
+
+       printf("Lost client with ip %s!\n", ecore_con_client_ip_get(event->client));
+       printf("Client was connected for %0.3f seconds.\n",
+           ecore_con_client_uptime_get(event->client));
+
+       ecore_con_client_del(event->client);
+     }
+   else if (type == ECORE_CON_EVENT_SERVER_DEL)
+     {
+       Ecore_Con_Event_Server_Del *event = ev;
+
+       fail_if (!event->server);
+
+       fail_if (data != (void *) 2);
+
+       printf("Lost server with ip %s!\n", ecore_con_server_ip_get(event->server));
+
+       ecore_con_server_del(event->server);
+     }
+   fail ();
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+Eina_Bool
+_data(void *data, int type __UNUSED__, void *ev)
+{
+
+   fail_if (type != ECORE_CON_EVENT_CLIENT_DATA &&
+       type != ECORE_CON_EVENT_SERVER_DATA);
+
+   /* Server */
+   if (type == ECORE_CON_EVENT_CLIENT_DATA)
+     {
+       Ecore_Con_Event_Client_Data *event = ev;
+       const char pong[] = "PONG";
+       int ret;
+
+       char fmt[128];
+       fail_if (data != (void *) 1);
+
+       snprintf(fmt, sizeof(fmt),
+           "Received %i bytes from client %s port %d:\n"
+           ">>>>>\n"
+           "%%.%is\n"
+           ">>>>>\n",
+           event->size, ecore_con_client_ip_get(event->client),
+           ecore_con_client_port_get(event->client), event->size);
+
+       printf(fmt, event->data);
+       fail_if (event->size != sizeof("PING"));
+       fail_if (memcmp (event->data, "PING", sizeof("PING")) != 0);
+
+       ret = ecore_con_client_send(event->client, pong, sizeof(pong));
+       fail_if (ret != sizeof(pong));
+       ecore_con_client_flush(event->client);
+     }
+   else if (type == ECORE_CON_EVENT_SERVER_DATA)
+     {
+       Ecore_Con_Event_Server_Data *event = ev;
+       char fmt[128];
+
+       fail_if (data != (void *) 2);
+
+       snprintf(fmt, sizeof(fmt),
+           "Received %i bytes from server:\n"
+           ">>>>>\n"
+           "%%.%is\n"
+           ">>>>>\n",
+           event->size, event->size);
+
+       printf(fmt, event->data);
+       fail_if (event->size != sizeof("PONG"));
+       fail_if (memcmp (event->data, "PONG", sizeof("PONG")) != 0);
+       ecore_main_loop_quit();
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+START_TEST(ecore_test_ecore_con_server)
+{
+   Ecore_Con_Server *server;
+   Ecore_Con_Server *client;
+   Ecore_Con_Client *cl;
+   const Eina_List *clients, *l;
+   Ecore_Event_Handler *handlers[6];
+   void *server_data = malloc (1);
+   void *client_data = malloc (1);
+   int ret;
+   void *del_ret;
+
+   ret = eina_init();
+   fail_if(ret != 1);
+   ret = ecore_init();
+   fail_if(ret != 1);
+   ret = ecore_con_init();
+   fail_if(ret != 1);
+
+   handlers[0] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
+       _add, (void *) 1);
+   fail_if(handlers[0] == NULL);
+   handlers[1] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
+       _del, (void *) 1);
+   fail_if(handlers[1] == NULL);
+   handlers[2] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
+       _data, (void *) 1);
+   fail_if(handlers[2] == NULL);
+
+   handlers[3] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
+       _add, (void *) 2);
+   fail_if(handlers[3] == NULL);
+   handlers[4] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
+       _del, (void *) 2);
+   fail_if(handlers[4] == NULL);
+   handlers[5] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
+       _data, (void *) 2);
+   fail_if(handlers[5] == NULL);
+
+   server = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "::1", 8080,
+       server_data);
+   fail_if (server == NULL);
+
+   ecore_con_server_timeout_set(server, 10);
+   ecore_con_server_client_limit_set(server, 1, 0);
+
+   client = ecore_con_server_connect(ECORE_CON_REMOTE_TCP, "::1", 8080,
+       client_data);
+   fail_if (client == NULL);
+
+   ecore_main_loop_begin();
+
+   clients = ecore_con_server_clients_get(server);
+   printf("Clients connected to this server when exiting: %d\n",
+          eina_list_count(clients));
+   EINA_LIST_FOREACH(clients, l, cl)
+     {
+       printf("%s\n", ecore_con_client_ip_get(cl));
+     }
+
+   printf("Server was up for %0.3f seconds\n",
+          ecore_con_server_uptime_get(server));
+
+   del_ret = ecore_con_server_del(server);
+   fail_if (del_ret != server_data);
+   free (server_data);
+   del_ret = ecore_con_server_del(client);
+   fail_if (del_ret != client_data);
+   free (client_data);
+
+   del_ret = ecore_event_handler_del (handlers[0]);
+   fail_if (del_ret != (void *) 1);
+   del_ret = ecore_event_handler_del (handlers[1]);
+   fail_if (del_ret != (void *) 1);
+   del_ret = ecore_event_handler_del (handlers[2]);
+   fail_if (del_ret != (void *) 1);
+
+   del_ret = ecore_event_handler_del (handlers[3]);
+   fail_if (del_ret != (void *) 2);
+   del_ret = ecore_event_handler_del (handlers[4]);
+   fail_if (del_ret != (void *) 2);
+   del_ret = ecore_event_handler_del (handlers[5]);
+   fail_if (del_ret != (void *) 2);
+
+   ret = ecore_con_shutdown();
+   fail_if(ret != 0);
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+   ret = eina_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_con_init)
+{
+   int ret;
+
+   ret = ecore_con_init();
+   fail_if(ret != 1);
+
+   ret = ecore_con_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+void ecore_test_ecore_con(TCase *tc)
+{
+   tcase_add_test(tc, ecore_test_ecore_con_init);
+   tcase_add_test(tc, ecore_test_ecore_con_server);
+}
diff --git a/src/tests/ecore_test_ecore_x.c b/src/tests/ecore_test_ecore_x.c
new file mode 100644 (file)
index 0000000..db74092
--- /dev/null
@@ -0,0 +1,60 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Ecore_X.h>
+
+#include "ecore_suite.h"
+
+/* FIXME: Currently disable these tests. They are useless ATM and they just
+ * make buildbot complain. Once we add useful tests here we'll also bother
+ * with getting X on the server. */
+#undef HAVE_ECORE_X_XLIB
+
+/* TODO: change to HAVE_ECORE_X when xcb implementation is done */
+#ifdef HAVE_ECORE_X_XLIB
+
+START_TEST(ecore_test_ecore_x_init)
+{
+   int ret;
+
+   ret = ecore_x_init(NULL);
+   fail_if(ret != 1);
+
+   ret = ecore_x_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_x_bell)
+{
+   int i;
+   int ret;
+
+   ret = ecore_x_init(NULL);
+   fail_if(ret != 1);
+
+   printf("You should hear 3 beeps now.\n");
+   for (i = 0; i < 3; i++)
+     {
+       ret = ecore_x_bell(0);
+       fail_if(ret != EINA_TRUE);
+       ecore_x_sync();
+       sleep(1);
+     }
+
+   ecore_x_shutdown();
+}
+END_TEST
+
+#endif
+
+void ecore_test_ecore_x(TCase *tc __UNUSED__)
+{
+
+/* TODO: change to HAVE_ECORE_X when xcb implementation is done */
+#ifdef HAVE_ECORE_X_XLIB
+   tcase_add_test(tc, ecore_test_ecore_x_init);
+   tcase_add_test(tc, ecore_test_ecore_x_bell);
+#endif
+}
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
new file mode 100644 (file)
index 0000000..38ebc12
--- /dev/null
@@ -0,0 +1,17 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+@EINA_CFLAGS@
+
+noinst_PROGRAMS=makekeys
+
+makekeys_SOURCES = \
+  makekeys.c
+
+makekeys_LDADD = \
+  @EINA_LIBS@
+
+EXTRA_DIST = mkks.sh
diff --git a/src/util/makekeys.c b/src/util/makekeys.c
new file mode 100644 (file)
index 0000000..a057fa2
--- /dev/null
@@ -0,0 +1,326 @@
+/* Portions of this code are Copyright 1990, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/keysymdef.h>
+
+#define TBLNUM 4000
+#define MIN_REHASH 15
+#define MATCHES 10
+
+typedef struct _Info Info;
+static struct _Info 
+{
+   char *name;
+   long unsigned int val;
+} info[TBLNUM];
+
+/* local function prototypes */
+static int _parseline(const char *buf, char *key, long unsigned int *val, char *prefix);
+
+/* local variables */
+static char tab[TBLNUM];
+static unsigned short offsets[TBLNUM];
+static unsigned short indexes[TBLNUM];
+static long unsigned int values[TBLNUM];
+static char buf[1024];
+static int ksnum = 0;
+
+int 
+main(int argc, char **argv) 
+{
+   int max_rehash = 0;
+   unsigned long sig;
+   int i = 0, j = 0, k = 0, l = 0, z = 0;
+   FILE *fptr;
+   char *name = NULL, c;
+   int first = 0, num_found = 0;
+   int best_max_rehash = 0, best_z = 0;
+   long unsigned int val;
+   char key[128], prefix[128];
+
+   for (l = 1; l < argc; l++) 
+     {
+        if (!(fptr = fopen(argv[l], "r"))) 
+          {
+             fprintf(stderr, "Could not open %s\n", argv[l]);
+             continue;
+          }
+
+        while (fgets(buf, sizeof(buf), fptr)) 
+          {
+             if (!_parseline(buf, key, &val, prefix))
+               continue;
+
+             if (val == XK_VoidSymbol) val = 0;
+             if (val > 0x1fffffff) 
+               {
+                  fprintf(stderr, "Ignoring illegal keysym (%s %lx)\n", 
+                          key, val);
+                  continue;
+               }
+
+             if (!(name = malloc(strlen(prefix) + strlen(key) + 1))) 
+               {
+                  fprintf(stderr, "Makekeys: Out Of Memory !!\n");
+                  exit(EXIT_FAILURE);
+               }
+
+             sprintf(name, "%s%s", prefix, key);
+             info[ksnum].name = name;
+             info[ksnum].val = val;
+             ksnum++;
+             if (ksnum == TBLNUM) 
+               {
+                  fprintf(stderr, "Makekeys: Too Many Keysyms!!\n");
+                  exit(EXIT_FAILURE);
+               }
+          }
+
+        fclose(fptr);
+     }
+
+   printf("/* This file is generated from keysymdef.h. */\n");
+   printf("/* Do Not Edit !! */\n\n");
+
+   best_max_rehash = ksnum;
+   num_found = 0;
+   for (z = ksnum; z < TBLNUM; z++) 
+     {
+        max_rehash = 0;
+        for (name = tab, i = z; --i >= 0;) 
+          *name++ = 0;
+        for (i = 0; i < ksnum; i++) 
+          {
+             name = info[i].name;
+             sig = 0;
+             while ((c = *name++))
+               sig = (sig << 1) + c;
+             first = j = sig % z;
+             for (k = 0; tab[j]; k++) 
+               {
+                  j += (first + 1);
+                  if (j >= z) j -= z;
+                  if (j == first) goto next1;
+               }
+             tab[j] = 1;
+             if (k > max_rehash) max_rehash = k;
+          }
+        if (max_rehash < MIN_REHASH) 
+          {
+             if (max_rehash < best_max_rehash) 
+               {
+                  best_max_rehash = max_rehash;
+                  best_z = z;
+               }
+             num_found++;
+             if (num_found >= MATCHES)
+               break;
+          }
+next1: ;
+     }
+
+   z = best_z;
+   if (z == 0) 
+     {
+        fprintf(stderr, "Makekeys: Failed to find small enough hash !!\n"
+                "Try increasing TBLNUM in makekeys.c\n");
+        exit(EXIT_FAILURE);
+     }
+
+   printf("#ifdef NEED_KEYSYM_TABLE\n");
+   printf("const unsigned char _ecore_xcb_keytable[] = {\n");
+   printf("0,\n");
+   k = 1;
+   for (i = 0; i < ksnum; i++) 
+     {
+        name = info[i].name;
+        sig = 0;
+        while ((c = *name++))
+          sig = (sig << 1) + c;
+        first = j = sig % z;
+        while (offsets[j]) 
+          {
+             j += (first + 1);
+             if (j >= z) j -= z;
+          }
+        offsets[j] = k;
+        indexes[i] = k;
+        val = info[i].val;
+       printf("0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, ",
+              (sig >> 8) & 0xff, sig & 0xff,
+              (val >> 24) & 0xff, (val >> 16) & 0xff,
+              (val >> 8) & 0xff, val & 0xff);
+        for (name = info[i].name, k += 7; (c = *name++); k++)
+          printf("'%c',", c);
+        printf((i == (ksnum - 1)) ? "0\n" : "0,\n");
+     }
+
+   printf("};\n\n");
+   printf("#define KTABLESIZE %d\n", z);
+   printf("#define KMAXHASH %d\n", (best_max_rehash + 1));
+   printf("\n");
+   printf("static const unsigned short hashString[KTABLESIZE] = {\n");
+
+   for (i = 0; i < z;) 
+     {
+        printf("0x%.4x", offsets[i]);
+        i++;
+        if (i == z) break;
+        printf((i & 7) ? ", " : ",\n");
+     }
+
+   printf("\n");
+   printf("};\n");
+   printf("#endif\n");
+
+   best_max_rehash = ksnum;
+   num_found = 0;
+   for (z = ksnum; z < TBLNUM; z++) 
+     {
+        max_rehash = 0;
+        for (name = tab, i = z; --i >= 0;) 
+          *name++ = 0;
+        for (i = 0; i < ksnum; i++) 
+          {
+             val = info[i].val;
+             first = j = val % z;
+             for (k = 0; tab[j]; k++) 
+               {
+                  if (values[j] == val) goto skip1;
+                  j += (first + 1);
+                  if (j >= z) j -= z;
+                  if (j == first) goto next2;
+               }
+             tab[j] = 1;
+             values[j] = val;
+             if (k > max_rehash) max_rehash = k;
+skip1: ;
+          }
+        if (max_rehash < MIN_REHASH) 
+          {
+             if (max_rehash < best_max_rehash) 
+               {
+                  best_max_rehash = max_rehash;
+                  best_z = z;
+               }
+             num_found++;
+             if (num_found >= MATCHES) break;
+          }
+next2: ;
+     }
+
+   z = best_z;
+   if (z == 0) 
+     {
+        fprintf(stderr, "Makekeys: Failed to find small enough hash !!\n"
+                "Try increasing TBLNUM in makekeys.c\n");
+        exit(EXIT_FAILURE);
+     }
+   for (i = z; --i >= 0;)
+     offsets[i] = 0;
+
+   for (i = 0; i < ksnum; i++) 
+     {
+        val = info[i].val;
+        first = j = val % z;
+        while (offsets[j]) 
+          {
+             if (values[j] == val) goto skip2;
+             j += (first + 1);
+             if (j >= z) j -= z;
+          }
+        offsets[j] = indexes[i] + 2;
+        values[j] = val;
+skip2: ;
+     }
+
+   printf("\n");
+   printf("#ifdef NEED_VTABLE\n");
+   printf("#define VTABLESIZE %d\n", z);
+   printf("#define VMAXHASH %d\n", best_max_rehash + 1);
+   printf("\n");
+   printf("static const unsigned short hashKeysym[VTABLESIZE] = {\n");
+   for (i = 0; i < z;) 
+     {
+        printf("0x%.4x", offsets[i]);
+        i++;
+        if (i == z) break;
+        printf((i & 7) ? ", " : ",\n");
+     }
+   printf("\n");
+   printf("};\n");
+   printf("#endif\n");
+
+   return 0;
+}
+
+/* local functions */
+static int 
+_parseline(const char *buf, char *key, long unsigned int *val, char *prefix) 
+{
+   int i = 0;
+   char alias[128];
+   char *tmp = NULL, *tmpa = NULL;
+
+   /* try to match XK_foo first */
+   i = sscanf(buf, "#define %127s 0x%lx", key, val);
+   if ((i == 2) && (tmp = strstr(key, "XK_")))
+     {
+        memcpy(prefix, key, (tmp - key));
+        prefix[tmp - key] = '\0';
+        tmp += 3;
+        memmove(key, tmp, strlen(tmp) + 1);
+        return 1;
+     }
+
+   /* try to match an alias */
+   i = sscanf(buf, "#define %127s %127s", key, alias);
+   if (((i == 2) && (tmp = strstr(key, "XK_"))) && 
+       (tmpa = strstr(alias, "XK_"))) 
+     {
+        memcpy(prefix, key, (tmp - key));
+        prefix[tmp - key] = '\0';
+        tmp += 3;
+        memmove(key, tmp, strlen(tmp) + 1);
+        memmove(tmpa, tmpa + 3, strlen(tmpa + 3) + 1);
+
+        for (i = ksnum - 1; i >= 0; i--) 
+          {
+             if (!strcmp(info[i].name, alias)) 
+               {
+                  *val = info[i].val;
+                  return 1;
+               }
+          }
+        fprintf(stderr, "Cannot find matching definition %s for keysym %s%s\n", 
+                alias, prefix, key);
+     }
+
+   return 0;
+}
diff --git a/src/util/mkks.sh b/src/util/mkks.sh
new file mode 100755 (executable)
index 0000000..6669242
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+cat $* | awk 'BEGIN { \
+    printf "/*\n * This file is generated from %s.  Do not edit.\n */\n", \
+          "$(INCLUDESRC)/keysymdef.h";\
+} \
+/^#define/ { \
+       len = length($2)-3; \
+       printf("{ \"%s\", %s },\n", substr($2,4,len), $3); \
+}'